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

 
 
> avr-gcc inline asm caveats
demiurg_spb
сообщение Dec 14 2009, 19:08
Сообщение #1


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

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



Суть такая: написал процедурку для получения знака числа float.
Имеющаяся signbit(x) не устраивает, т.к. происходит call-ret.
Код
#define avr_fsign(x)                                                    \
(__extension__({                                                        \
    float   __value = (float)(x);                                       \
    uint8_t __result;                                                   \
    __asm__ __volatile__                                                \
    (                                                                   \
        "mov  %0,__zero_reg__"        "\n\t"                            \
        "sbrc %D1,7"                  "\n\t"                            \
        "inc  %0"                     "\n\t"                            \
        : "=r" (__result)             /* output operands */             \
        : "r" (__value)               /* input operands */              \
    );                                                                  \
    __result;                                                           \
}))
Всё бы ничего, но иногда компилится чушь.
Код
    ld r14,X+
    ld r15,X+
    ld r16,X+
    ld r17,X
    ...
    mov  r17,__zero_reg__
    sbrc r17,7
    inc  r17
Чаще нормально:
Код
    ld r14,Z
    ldd r15,Z+1
    ldd r16,Z+2
    ldd r17,Z+3
    mov  r24,__zero_reg__
    sbrc r17,7
    inc  r24
Подскажите в чём тут может быть дело?
Со списком clobbers есть сомнения. У меня его нет. По моему разумению он тут и не нужен.
Может я ошибаюсь?
PS: avr-gcc (WinAVR 20090313) 4.3.2 -Os

Отвечаю сам себеsmile.gif Надо было добавить значёк & в этой строке:
Код
        : "=&r" (__result)             /* output operands */             \

Понял ошибку благодаря этому.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 2)
AHTOXA
сообщение Dec 14 2009, 19:38
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата
In situations where your code depends on different registers used for input and output operands, you must add the & constraint modifier to your output operand.

Цитата отсюда.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 14 2009, 19:50
Сообщение #3


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

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



AHTOXA, спасибо! Очень правильная статейка!
Остался вопрос: надо-ли в списке clobbers указывать __zero_reg__?
Я его не модифицирую, но хочу быть уверен, что там нольsmile.gif
------------------------------------
И вновь отвечаю сам себе:
можно вовсе отказаться от использования __zero_reg__:
Код
        "clr  %0"        "\n\t"                            \
Нет человека - нет проблемsmile.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

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

 


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


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