MultiU16X8toH16とMultiU24X24toH16の解析

MultiU16X8toH16

// intRes = intIn1 * intIn2 >> 16
// uses:
// r26 to store 0
// r27 to store the byte 1 of the 24 bit result
// MultiU16X8toH16(timer, tmp_step_rate, gain);
#define MultiU16X8toH16(timer_16bit, tmp_step_rate_8bit, gain_16bit) \
asm volatile ( \                //     
	"clr r26 \n\t" \            // r26 <- 0
	"mul %A1, %B2 \n\t" \       // r1:r0 <- A1 * B2
	"movw %A0, r0 \n\t" \       // B0:A0 <- r1:r0
	"mul %A1, %A2 \n\t" \       // r1:r0 <- A1 * A2
	"add %A0, r1 \n\t" \        // A0 <- A0 + r1
	"adc %B0, r26 \n\t" \       // B0 <- B0 + r26(=0) 
	"lsr r0 \n\t" \             // r0 <- r0/2
	"adc %A0, r26 \n\t" \       // A0 <- A0 + r26(=0)
	"adc %B0, r26 \n\t" \       // B0 <- B0 + r26(=0)      
	"clr r1 \n\t" \             // r1 <- 0
	: \                         //      
	//出力レジスタ
	"=&r" (timer_16bit) \       //  B0:A0 (=timer)
	: \                         //      
	//入力レジスタ
	"d" (tmp_step_rate_8bit), \ // A1 = tmp_step_rate
	"d" (gain_16bit) \          // B2:A2 = gain
	: \                         //    
	"r26" \                     // Clobberレジスタ(tmp変数:関数を出る前に破棄)
	)                           //    

MultiU24X24toH16

// intRes = longIn1 * longIn2 >> 24
// uses:
// r26 to store 0
// r27 to store the byte 1 of the 48bit result
#define MultiU24X24toH16(intRes, longIn1, longIn2) \
asm volatile ( \
	"clr r26 \n\t" \        // r26 <- 0   
	"mul %A1, %B2 \n\t" \   // r1:r0 <- A1 * B2
	"mov r27, r1 \n\t" \    // r27 <- r1
	"mul %B1, %C2 \n\t" \   // r1:r0 <- B1 * C2            
	"movw %A0, r0 \n\t" \   // A0 <- r0            
	"mul %C1, %C2 \n\t" \   // r1:r0 <- C1 * C2            
	"add %B0, r0 \n\t" \    // B0 <- B0 + r0           
	"mul %C1, %B2 \n\t" \   // r1:r0 <- C1 * B2            
	"add %A0, r0 \n\t" \    // A0 <- A0 + r0           
	"adc %B0, r1 \n\t" \    // B0 <- B0 + r1           
	"mul %A1, %C2 \n\t" \   // r1:r0 <- A1 * C2            
	"add r27, r0 \n\t" \    // r27 <- r27 + r0           
	"adc %A0, r1 \n\t" \    // A0 <- A0 + r1           
	"adc %B0, r26 \n\t" \   // B0 <- B0 + r26            
	"mul %B1, %B2 \n\t" \   // r1:r0 <- B1 * B2             
	"add r27, r0 \n\t" \    // r27 <- r27 + r0           
	"adc %A0, r1 \n\t" \    // A0 <- A0 + r1           
	"adc %B0, r26 \n\t" \   // B0 <- B0 + r26            
	"mul %C1, %A2 \n\t" \   // r1:r0 <- C1 * A2            
	"add r27, r0 \n\t" \    // r27 <- r27 + r0           
	"adc %A0, r1 \n\t" \    // A0 <- A0 + r1           
	"adc %B0, r26 \n\t" \   // B0 <- B0 + r26            
	"mul %B1, %A2 \n\t" \   // r1:r0 <- B1 * A2            
	"add r27, r1 \n\t" \    // r27 <- r27 + r1           
	"adc %A0, r26 \n\t" \   // A0 <- A0 + r26            
	"adc %B0, r26 \n\t" \   // B0 <- B0 + r26            
	"lsr r27 \n\t" \        // r27 <- r27 /2        
	"adc %A0, r26 \n\t" \   // A0 <- A0 + r26            
	"adc %B0, r26 \n\t" \   // B0 <- B0 + r26            
	"clr r1 \n\t" \         // r1 <- 0      
	: \
	"=&r" (intRes) \        // B0:A0 = intRes       
	: \
	"d" (longIn1), \        // C1:B1:A1 = longIn1       
	"d" (longIn2) \         // C2:B2:A2 = longIn2
	: \
	"r26" , "r27" \         // clobber      
	)