gadub
|
sir
|
|
|
|
Рег.: 11.01.2006
|
Сообщений: 1087
|
|
Рейтинг: 733
|
|
Как правильно следить за переполнением при арифметических операциях?
14.06.2008 14:07
|
|
|
Программа должна быстро работать на процессоре без FPU. Профилировщик показывает, что большую часть времени занимают арифметические операции, в которых проводится проверка на переполнение примерно вот так: code:
Word32 L_var_out = L_var3 + mult;
if ((((L_var3 ^ mult) & MIN_32) == 0L) && ((L_var_out ^ L_var3) & MIN_32)) {
Overflow = 1;
return (L_var3 < 0L) ? MIN_32 : MAX_32;
}
else
return (L_var_out);
можно ли делать это более умно? к примеру, обращаться к процессору и спрашивать, не было ли переполнения?
|
|
BbICEP
|
enthusiast
|
|
|
|
Рег.: 12.04.2008
|
Сообщений: 309
|
|
Рейтинг: -40
|
|
Re: Как правильно следить за переполнением при арифметических операция
[re: gadub]
14.06.2008 14:20
|
|
|
целевых платформ несколько, раз пишете на C?
|
|
gadub
|
sir
|
|
|
|
Рег.: 11.01.2006
|
Сообщений: 1087
|
|
Рейтинг: 733
|
|
Re: Как правильно следить за переполнением при арифметических операция
[re: BbICEP]
14.06.2008 14:41
|
|
|
|
gadub
|
sir
|
|
|
|
Рег.: 11.01.2006
|
Сообщений: 1087
|
|
Рейтинг: 733
|
|
Re: Как правильно следить за переполнением при арифметических операция
[re: gadub]
14.06.2008 14:42
|
|
|
|
DarkGray
|
Carpal Tunnel
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 31415
|
|
Рейтинг: 8952
|
|
Re: Как правильно следить за переполнением при арифметических операция
[re: gadub]
14.06.2008 14:46
|
|
|
Quote:
if ((((L_var3 ^ mult) & MIN_32) == 0L) && ((L_var_out ^ L_var3) & MIN_32)) {
как минимум стоит переставить условия
code:
if (((L_var_out ^ L_var3) & MIN_32) && (((L_var3 ^ mult) & MIN_32) == 0L))
|
|
blind
|
still alive
|
|
|
|
Рег.: 16.01.2004
|
Сообщений: 23128
|
Из: Хамовники
|
Рейтинг: 16483
|
|
Re: Как правильно следить за переполнением при арифметических операция
[re: gadub]
14.06.2008 15:44
|
|
|
а там нет спецкоманд для сложения с насыщением?
такое часто необходимо при работе с изображениями.
|
13/37 =) |
|
gadub
|
sir
|
|
|
|
Рег.: 11.01.2006
|
Сообщений: 1087
|
|
Рейтинг: 733
|
|
Re: Как правильно следить за переполнением при арифметических операция
[re: blind]
14.06.2008 15:55
|
|
|
мне уже подсказали - есть вот такое:
All other processor states are held in status registers. The current operating processor status is in the Current Program Status Register (CPSR). The CPSR holds: four ALU flags (Negative, Zero, Carry, and Overflow), two interrupt disable bits (one for each type of interrupt), one bit to indicate ARM or Thumb execution five bits to encode the current processor mode
попробую этим воспользоваться. неясным остается только вопрос, как такая программа будет работать в многопоточной среде. ведь если между вычислениями и проверкой регистра вклинится что-то враждебное, будет ошибочка.
|
|
Kai
|
|
|
|
|
Рег.: 25.10.2002
|
Сообщений: 8251
|
|
Рейтинг: 818
|
|
Re: Как правильно следить за переполнением при арифметических операция
[re: gadub]
14.06.2008 15:58
|
|
|
Интересно, как условные переходы работают в многопоточной среде?
|
|
gadub
|
sir
|
|
|
|
Рег.: 11.01.2006
|
Сообщений: 1087
|
|
Рейтинг: 733
|
|
Re: Как правильно следить за переполнением при арифметических операция
[re: Kai]
14.06.2008 16:00
|
|
|
|
Yorik
|
|
|
|
|
Рег.: 01.09.2005
|
Сообщений: 2476
|
Из: Москва
|
Рейтинг: 633
|
|
Re: Как правильно следить за переполнением при арифметических операция
[re: gadub]
14.06.2008 16:00
|
|
|
При переключении между нитями, сохраняются регистры. среди прочих - и регистр флагов.
Редактировал Yorik (14.06.2008 16:16)
|
|
gadub
|
sir
|
|
|
|
Рег.: 11.01.2006
|
Сообщений: 1087
|
|
Рейтинг: 733
|
|
Re: Как правильно следить за переполнением при арифметических операция
[re: Yorik]
14.06.2008 16:04
|
|
|
не то чтобы я все понял, но почему-то меня твои слова успокоили не подскажешь, что небольшое можно прочитать, чтобы научиться работать с этим хозяйством? если с ассемблером незнаком
|
|
Yorik
|
|
|
|
|
Рег.: 01.09.2005
|
Сообщений: 2476
|
Из: Москва
|
Рейтинг: 633
|
|
Re: Как правильно следить за переполнением при арифметических операция
[re: gadub]
14.06.2008 16:15
|
|
|
Нинай, нам это на лекциях на 2ом курсе рассказывали.
|
|
Fj_
|
Carpal Tunnel
|
|
|
|
Рег.: 12.09.2004
|
Сообщений: 8795
|
|
Рейтинг: 3287
|
|
Re: Как правильно следить за переполнением при арифметических операция
[re: gadub]
14.06.2008 16:22
|
|
|
Только учитывай, что overflow это вовсе не переполнение, а бит переноса из предстаршего разряда в старший =)
Для беззнаковых целых переполнение это carry, для знаковых - какая-то комбинация carry и overflow, точно не помню.
|
The data is the error (c)IIS FTP Server. |
|
stalker
|
девелопер
|
|
|
|
Рег.: 01.11.2002
|
Сообщений: 3272
|
Из: Москва
|
Рейтинг: 4130
|
|
Re: Как правильно следить за переполнением при арифметических операция
[re: Fj_]
15.06.2008 09:55
|
|
|
В ответ на:
Только учитывай, что overflow это вовсе не переполнение, а бит переноса из предстаршего разряда в старший =)
Вот тут: http://en.wikipedia.org/wiki/Overflow_flag написано, что "The overflow flag is usually computed as the xor of the carry into the sign bit and the carry out of the sign bit." и таким образом это как раз уже готовая к использованию комбинация carry и переноса из предстаршего в старший. Правда в этой статье все на примере x86, и нигде не упоминается про Arm...
|
Кстати, благородные доны, чей это вертолет позади избы? |
|
BbICEP
|
enthusiast
|
|
|
|
Рег.: 12.04.2008
|
Сообщений: 309
|
|
Рейтинг: -40
|
|
Re: Как правильно следить за переполнением при арифметических операция
[re: gadub]
15.06.2008 16:31
|
|
|
Раньше на ассемблере арма не писал. Вроде, такое должно проканать: code: MOV R0, L_var3
MOV R1, mult
ADD R2, R1, R0
BCC no_overflow
OR R1, R0, &7FFFFFFF
ASR R2, R1, &01
.no_overflow ; Сейчас в R2 лежит результат
Редактировал BbICEP (15.06.2008 19:56)
|
|