Имеющаяся 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; \
}))
Всё бы ничего, но иногда компилится чушь.(__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 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
Подскажите в чём тут может быть дело?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
Отвечаю сам себе

Код
: "=&r" (__result) /* output operands */ \
Понял ошибку благодаря этому.