AVR-GCCでインラインアセンブラの実験を始めたところです。標準のC関数を使用するよりも高速で、2つの8ビット符号なし整数を乗算し、その結果をハードウェア乗算を持たないAVRの16ビット符号なし整数に格納するマクロに取り組んでいます。コードは次のとおりです。
#ifndef UMULTFIX_H_
#define UMULTFIX_H_
#include <inttypes.h>
#define umultfix(a,b) \
({ \
uint16_t product; \
uint8_t multiplier = a, multiplicand = b, count = 9;\
asm volatile ( \
"mov %A0, %1 \n\t" \
"ldi %B0, 0 \n\t" \
"clc \n\t" \
"mult: ror %B0 \n\t" \
"ror %A0 \n\t" \
"dec %3 \n\t" \
"breq end \n\t" \
"brcc mult \n\t" \
"clc \n\t" \
"adc %B0, %2 \n\t" \
"rjmp mult \n\t" \
"end: \n\t" \
:"=&r" (product): "a" (multiplier), "a" (multiplicand), "a" (count)\
); \
product; \
})
#endif /* UMULTFIX_H_ */
問題は、このマクロを1回しか使用できないことです。コンパイラーは、マクロが挿入されて別の引数のセットで乗算を行うときに、「mult:」と「end:」が再定義されることを好みません。これを回避する方法はありますか?