Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: avr-gcc inline asm caveats
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
demiurg_spb
Суть такая: написал процедурку для получения знака числа 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 */             \

Понял ошибку благодаря этому.
AHTOXA
Цитата
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.

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