Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.snto-msu.net/showflat.php?Number=7612502&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Wed Apr 13 01:38:49 2016
Кодировка: Windows-1251
Как правильно следить за переполнением при арифметических операциях? - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 1
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
 

linux/gcc/arm

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
3

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
5

Интересно, как условные переходы работают в многопоточной среде? :grin:

gadub
sir

Рег.: 11.01.2006
Сообщений: 1087
Рейтинг: 733
  Re: Как правильно следить за переполнением при арифметических операция [re: Kai]
      14.06.2008 16:00
-1

к чему ты это?

Yorik

Рег.: 01.09.2005
Сообщений: 2476
Из: Москва
Рейтинг: 633
  Re: Как правильно следить за переполнением при арифметических операция [re: gadub]
      14.06.2008 16:00
2

При переключении между нитями, сохраняются регистры. среди прочих - и регистр флагов.



Редактировал 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
6

Только учитывай, что 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
1

Раньше на ассемблере арма не писал. Вроде, такое должно проканать:
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)
Страницы: 1

Technical >> Development (Archive)

Дополнительная информация
1 зарегистрированных и 0 анонимных пользователей просматривают этот форум.

Модераторы:  DarkGray 

Печать темы

Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в