Arm mov には、即値が 2 の倍数で回転された 8 ビットでなければならないという制限があります。次のように記述できます。
mov ip, #0x5000
しかし、次のように書くことはできません。
mov ip, #0x5001
0x5000 は 0x5000 + 1 として分割できます。私の意味では、有効な即値と小さな数の合計です。
では、与えられた 32 ビットの数値について、最も近い有効な即値をすばやく見つけるにはどうすればよいでしょうか? このような:
uint32 find_imm(uint32 src, bool less_than_src) {
...
}
// x is 0x5000
uint32 x = find_imm(0x5001, true);