-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmacro.inc
48 lines (45 loc) · 1.14 KB
/
macro.inc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// load 'far' address as a +/-4GB offset from PC
.macro adrf Xn:req, addr:req
adrp \Xn, \addr
add \Xn, \Xn, :lo12:\addr
.endm
// load a 32-bit immediate
.macro movl Wn:req, imm:req
.if (\imm) > 0xffffffff
.error "Immediate out of range"
.endif
.if (\imm) & 0xffff
movz \Wn, (\imm) & 0xffff
.if (\imm) & (0xffff << 16)
movk \Wn, ((\imm) >> 16) & 0xffff, lsl 16
.endif
.elseif (\imm) & (0xffff << 16)
movz \Wn, ((\imm) >> 16) & 0xffff, lsl 16
.else
mov \Wn, wzr
.endif
.endm
.macro __tail_movq Xn:req, imm:req
.irp iter,1,2,3
.if (\imm) & (0xffff << (\iter * 16))
movk \Xn, ((\imm) >> (\iter * 16)) & 0xffff, lsl \iter * 16
.endif
.endr
.endm
// load a 64-bit immediate
.macro movq Xn:req, imm:req
.if (\imm) & 0xffff
movz \Xn, (\imm) & 0xffff
__tail_movq \Xn, "((\imm) & ~0xffff)"
.elseif (\imm) & (0xffff << 16)
movz \Xn, ((\imm) >> 16) & 0xffff, lsl 16
__tail_movq \Xn, "((\imm) & ~0xffffffff)"
.elseif (\imm) & (0xffff << 32)
movz \Xn, ((\imm) >> 32) & 0xffff, lsl 32
__tail_movq \Xn, "((\imm) & ~0xffffffffffff)"
.elseif (\imm) & (0xffff << 48)
movz \Xn, ((\imm) >> 48) & 0xffff, lsl 48
.else
mov \Xn, xzr
.endif
.endm