реклама на сайте
подробности

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


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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

Округление, что ли?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ViKo
сообщение Jan 27 2011, 08:23
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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 лучше не игнорировать.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 27 2011, 10:26
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 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  неверно!


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 27 2011, 11:13
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(demiurg_spb @ Jan 27 2011, 15:26) *
Никогда об этом не задумывался.
Вообще говоря методов округления существует больше, чем один.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 27 2011, 18:37
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(rezident @ Jan 27 2011, 15:13) *
Вообще говоря методов округления существует больше, чем один.

дело в де-факто стандарте, а не в методах, а если его не придерживаться там, где это надо - это бага, имхо, вылезет она сразу или существенно позже..
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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   Цитата(_Pasha @ Jan 27 2011, 23:37) ... а...   Jan 27 2011, 18:50
|- - _Pasha   Цитата(GetSmart @ Jan 27 2011, 22:50) Что...   Jan 27 2011, 18:55
|- - AHTOXA   Цитата(_Pasha @ Jan 27 2011, 23:55) Епт, ...   Jan 27 2011, 19:41
- - GetSmart   А можно поподробней о баге... Интригующе как...   Jan 27 2011, 19:00


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 09:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01834 секунд с 7
ELECTRONIX ©2004-2016