|
Для uint в Keil /16 не равно >>4, используются разные команды |
|
|
|
Jan 26 2011, 12:39
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Вот листинг, в котором видно, что поделить на 16 требует больше команд, чем сдвинуть на 4 разряда. Для чего это, числа ведь беззнаковые? Код ;;;222 uint8_t s0, s1, s2, s3; ;;;223 uint8_t m1 = ((s1 + s2) * 9 - s0 - s3) / 16; 000106 eb0c0006 ADD r0,r12,r6 00010a eb0000c0 ADD r0,r0,r0,LSL #3 00010e eba00007 SUB r0,r0,r7 000112 eba00006 SUB r0,r0,r6 000116 ea4f71e0 ASR r1,r0,#31 00011a eb007111 ADD r1,r0,r1,LSR #28 00011e f3c11107 UBFX r1,r1,#4,#8 ;;;224 uint8_t m2 = ((s1 + s2) * 9 - s0 - s3) >> 4; 000122 f3c01007 UBFX r0,r0,#4,#8 Округление, что ли?
|
|
|
|
|
 |
Ответов
|
Jan 27 2011, 08:23
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
И все-же, я не уверен, что этот код Код 000116 ea4f71e0 ASR r1,r0,#31 00011a eb007111 ADD r1,r0,r1,LSR #28 00011e f3c11107 UBFX r1,r1,#4,#8 есть расширение знака при делении на 16. Может, все-таки, округление? upd. Всё, нашел! В книге "ARM System Developer’s Guide" имеется точный ответ. If your code uses addition, subtraction, and multiplication, then there is no performance difference between signed and unsigned operations. However, there is a difference when it comes to division. Consider the following short example that averages two integers: int average_v1(int a, int B ) { return (a+B )/2; } This compiles to average_v1 ADD r0,r0,r1 ; r0 = a + b ADD r0,r0,r0,LSR #31 ; if (r0<0) r0++ MOV r0,r0,ASR #1 ; r0 = r0>>1 MOV pc,r14 ; return r0 Notice that the compiler adds one to the sum before shifting by right if the sum is negative. In other words it replaces x/2 by the statement: (x<0) ? ((x+1)>>1): (x>>1) В-общем, при делении на положительную константу U лучше не игнорировать.
|
|
|
|
|
Jan 27 2011, 10:26
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(ViKo @ Jan 27 2011, 11:23)  В-общем, при делении на положительную константу U лучше не игнорировать. Никогда об этом не задумывался. Спасибо! Код -3 / 2 = -1
-3 = 0b11111101
(0b11111101 + 1)/2 = 0b11111110/2 = 0b11111111 = -1 верно!
(0b11111101 + 0)/2 = 0b11111101/2 = 0b11111110 = -2 неверно!
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
Сообщений в этой теме
ViKo Для uint в Keil /16 не равно >>4 Jan 26 2011, 12:39 HARMHARM Добавьте везде volatile, и не будет никакой разниц... Jan 26 2011, 12:43 GetSmart Цитата(HARMHARM @ Jan 26 2011, 17:43) Дел... Jan 26 2011, 12:51 ViKo Цитата(HARMHARM @ Jan 26 2011, 14:43) Доб... Jan 26 2011, 13:06  rezident Цитата(ViKo @ Jan 26 2011, 18:06) На эти ... Jan 26 2011, 13:10   ViKo Цитата(rezident @ Jan 26 2011, 15:10) Или... Jan 26 2011, 13:13  HARMHARM Ага, понял чего не понял Jan 26 2011, 13:12 Aurochs Цитата(ViKo @ Jan 26 2011, 15:13) Но, пос... Jan 26 2011, 13:45 _Pasha Цитата(ViKo @ Jan 27 2011, 11:23) (x<0... Jan 27 2011, 08:34  ViKo Цитата(_Pasha @ Jan 27 2011, 10:34) Спаси... Jan 27 2011, 08:44 GetSmart А можно поподробней о баге... Интригующе как... Jan 27 2011, 19:00
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|