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 )