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

 
 
> Вместо одной команды - две :(, MOV Reg, Imm (ARM)
GetSmart
сообщение Jun 3 2008, 18:23
Сообщение #1


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Есть у меня в проекте строчка:
Код
float *val = &AverageAngles[j][i];
if ((*(long *)val & 0x7f800000) != 0x7f800000)
  sum += *val;
Пытаюсь обезопаситься от Nan и бесконечности. Гляжу на систему команд ARM и вижу, что можно одной командой загрузить в регистр число до 8-ми рядом стоящих еденичных бит, сдвинутых на любой сдвиг. Вроде бы число 0x7f800000 как раз подходит под это правило, но компилятор EWARM 4.20 не хочет так делать. Он почему-то только 7 бит может в одной команде загрузить. Вот:
Код
0x00003E78 E3A0B440  MOV          R11, #0x40000000
0x00003E7C E38BB5FE  ORR          R11, R11, #0x3F800000
Кто знает, почему?

Сообщение отредактировал GetSmart - Jun 3 2008, 18:27


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 2)
vet
сообщение Jun 4 2008, 04:23
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



одна команда получится, если константа формируется сдвигом байта на чётное число бит.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 4 2008, 08:10
Сообщение #3


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Точно. Дело в системе команд ARMa.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 21:47
Рейтинг@Mail.ru


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