;w24 是输入的32bit的数字
;w9 是w32/10的余数
MOVZ w8, #0xcccd | W8 = 52429 (0xCCCD);//ML01
MOVK w8, #0xcccc, lsl #16 | W8 = 3435973837 (0xCCCCCCCD);
UMULL x8, w24, w8
LSR x8, x8, #0x23 | X8 = (3435973837 >> 35) = 0 (0x00000000);
MOVZ w9, #0xa | W9 = 10 (0xA);//ML01
MSUB w9, w8, w9, w24 | W9 = (levelNo - 0 * 10) = 0 (0x00000000);
汇编代码如上, 相当神奇,特别立贴,记录一下,
等效的c代码如下:
uint32_t calc_10_remain(uint32_t levelNo) {
uint32_t w8 = 0xCCCCCCCD; // 52429 (0xCCCD)
uint64_t result = (uint64_t)levelNo * w8; // levelNo is multiplied with w8
printf(" result %lx\n",result);
result >>= 35; // Logical shift right by 35 bits
printf(" result %lx\n",result);
return = levelNo - ((uint32_t)(result * 10)) ; // Perform the calculation
}