A64指令集中,mov编码里的立即数为16位。ATF中,通过宏定义,使得可以通过 mov_imm reg, imm的形式向通用寄存器中写入32bit或64bit的值。
.macro mov_imm _reg, _val
.if (\_val) == 0
mov \_reg, #0
.else
_mov_imm16 \_reg, (\_val), 0
_mov_imm16 \_reg, (\_val), 16
_mov_imm16 \_reg, (\_val), 32
_mov_imm16 \_reg, (\_val), 48
.endif
.endm
.macro _mov_imm16 _reg, _val, _shift
.if (\_val >> \_shift) & 0xffff
.if (\_val & (1 << \_shift - 1))
movk \_reg, (\_val >> \_shift) & 0xffff, LSL \_shift
.else
mov \_reg, \_val & (0xffff << \_shift)
.endif
.endif
.endm
mov指令和movk指令的区别:mov指令会先将最后的值初始化为0,再在基础上加值;movk指令不会影响原先寄存器内的值。
故通过一次mov指令和多次movk指令,可以mov大于16位的立即数