|
| 1 | +(declare (context (target arm armv8-a+le))) |
| 2 | + |
1 | 3 | (require bits)
|
2 | 4 | (require arm-bits)
|
3 | 5 |
|
4 |
| -(declare (context (target armv8-a+le))) |
5 | 6 | (defpackage aarch64 (:use core target arm))
|
6 | 7 | (defpackage llvm-aarch64 (:use aarch64))
|
7 | 8 |
|
|
13 | 14 | (set$ dst (lshift imm pos)))
|
14 | 15 |
|
15 | 16 | (defun MOVZWi (dst imm pos)
|
16 |
| - (set$ dst (lshift imm pos))) |
| 17 | + (setw dst (lshift imm pos))) |
| 18 | + |
| 19 | +(defun MOVNWi (dst imm off) |
| 20 | + (setw dst (lnot (lshift imm off)))) |
| 21 | + |
| 22 | +(defmacro MOVK*i (dst reg imm off) |
| 23 | + (let ((mask (lnot (lshift (- (lshift 1 16) 1) off)))) |
| 24 | + (set$ dst (logor (logand reg mask) (lshift imm off))))) |
| 25 | + |
| 26 | +(defun MOVKWi (dst reg imm off) (MOVK*i dst reg imm off)) |
| 27 | +(defun MOVKXi (dst reg imm off) (MOVK*i dst reg imm off)) |
17 | 28 |
|
18 | 29 | (defun ADDXri (dst src imm off)
|
19 | 30 | (set$ dst (+ src (lshift imm off))))
|
|
27 | 38 | (load-hword (+ base (lshift off 2))))))
|
28 | 39 |
|
29 | 40 | (defun LDRWui (dst reg off)
|
30 |
| - (set$ dst |
| 41 | + (setw dst |
31 | 42 | (cast-unsigned (word) (load-hword (+ reg (lshift off 2))))))
|
32 | 43 |
|
33 | 44 | (defun LDRBBui (dst reg off)
|
| 45 | + (setw dst |
| 46 | + (cast-unsigned (word) (load-byte (+ reg off))))) |
| 47 | + |
| 48 | +(defun LDRBBroX (dst reg off _ _) |
34 | 49 | (set$ dst
|
35 | 50 | (cast-unsigned (word) (load-byte (+ reg off)))))
|
36 | 51 |
|
37 |
| -(defmacro make-BFM (cast xd xr ir is) |
| 52 | +(defmacro make-BFM (set cast xd xr ir is) |
38 | 53 | (let ((rs (word)))
|
39 | 54 | (if (< is ir)
|
40 | 55 | (if (and (/= is (- rs 1)) (= (+ is 1) ir))
|
41 |
| - (set$ xd (lshift xr (- rs ir))) |
42 |
| - (set$ xd (lshift |
| 56 | + (set xd (lshift xr (- rs ir))) |
| 57 | + (set xd (lshift |
43 | 58 | (cast rs (extract is 0 xr))
|
44 | 59 | (- rs ir))))
|
45 | 60 | (if (= is (- rs 1))
|
46 |
| - (set$ xd (rshift xr ir)) |
47 |
| - (set$ xd (cast rs (extract is ir xr))))))) |
| 61 | + (set xd (rshift xr ir)) |
| 62 | + (set xd (cast rs (extract is ir xr))))))) |
48 | 63 |
|
49 | 64 | (defun UBFMXri (xd xr ir is)
|
50 |
| - (make-BFM cast-unsigned xd xr ir is)) |
| 65 | + (make-BFM set$ cast-unsigned xd xr ir is)) |
| 66 | + |
| 67 | +(defun UBFMWri (xd xr ir is) |
| 68 | + (make-BFM setw cast-unsigned xd xr ir is)) |
51 | 69 |
|
52 | 70 | (defun SBFMXri (xd xr ir is)
|
53 |
| - (make-BFM cast-signed xd xr ir is)) |
| 71 | + (make-BFM set$ cast-signed xd xr ir is)) |
| 72 | + |
| 73 | +(defun SBFMWri (xd xr ir is) |
| 74 | + (make-BFM setw cast-signed xd xr ir is)) |
54 | 75 |
|
55 |
| -(defun ORRXrs (rd rn rm is) |
56 |
| - (set$ rd (logor rn (shifted rm is)))) |
| 76 | +(defmacro ORN*rs (set rd rn rm is) |
| 77 | + (set rd (logor rn (lnot (lshift rm is))))) |
| 78 | + |
| 79 | +(defun ORNWrs (rd rn rm is) (ORN*rs setw rd rn rm is)) |
| 80 | +(defun ORNXrs (rd rn rm is) (ORN*rs set$ rd rn rm is)) |
| 81 | + |
| 82 | +(defmacro log*?rs (set op rd rn rm is) |
| 83 | + (set rd (op rn (shifted rm is)))) |
| 84 | + |
| 85 | +(defun ORRWrs (rd rn rm is) (log*?rs setw logor rd rn rm is)) |
| 86 | +(defun EORWrs (rd rn rm is) (log*?rs setw logxor rd rn rm is)) |
| 87 | +(defun ANDWrs (rd rn rm is) (log*?rs setw logand rd rn rm is)) |
| 88 | +(defun ORRXrs (rd rn rm is) (log*?rs set$ logor rd rn rm is)) |
| 89 | +(defun EORXrs (rd rn rm is) (log*?rs set$ logxor rd rn rm is)) |
| 90 | +(defun ANDXrs (rd rn rm is) (log*?rs set$ logand rd rn rm is)) |
| 91 | + |
| 92 | + |
| 93 | +(defun ANDWri (dst rn imm) |
| 94 | + (setw dst (logand rn imm))) |
57 | 95 |
|
58 |
| -(defun ORRWrs (rd rn rm is) |
59 |
| - (set$ rd |
60 |
| - (logor rn |
61 |
| - (shifted rm is)))) |
62 | 96 |
|
63 | 97 | (defun ADRP (dst imm)
|
64 | 98 | (set$ dst (+
|
65 | 99 | (logand (get-program-counter) (lshift -1 12))
|
66 | 100 | (cast-signed (word) (lshift imm 12)))))
|
67 | 101 |
|
68 | 102 | (defun ADDWrs (dst r1 v s)
|
69 |
| - (set$ dst (+ r1 (lshift v s)))) |
| 103 | + (setw dst (+ r1 (lshift v s)))) |
| 104 | + |
| 105 | +(defun SUBWrs (dst r1 v s) |
| 106 | + (setw dst (- r1 (lshift v s)))) |
70 | 107 |
|
71 | 108 | (defun ADDWri (dst r1 imm s)
|
72 |
| - (set$ dst (+ r1 (lshift imm s)))) |
| 109 | + (setw dst (+ r1 (lshift imm s)))) |
73 | 110 |
|
74 | 111 |
|
75 | 112 | (defun SUBXrx64 (rd rn rm off)
|
|
79 | 116 | (add-with-carry rd rn (lnot (shifted rm off)) 1))
|
80 | 117 |
|
81 | 118 | (defun SUBSWrs (rd rn rm off)
|
82 |
| - (add-with-carry |
| 119 | + (add-with-carry/clear-base |
83 | 120 | rd
|
84 | 121 | rn (lnot (shifted rm off)) 1))
|
85 | 122 |
|
86 | 123 | (defun SUBSWri (rd rn imm off)
|
87 |
| - (add-with-carry rd rn (lnot (lshift imm off)) 1)) |
| 124 | + (add-with-carry/clear-base rd rn (lnot (lshift imm off)) 1)) |
88 | 125 |
|
89 | 126 |
|
90 | 127 | (defun SUBSXri (rd rn imm off)
|
|
97 | 134 | (set$ rd (- rn (lshift imm off))))
|
98 | 135 |
|
99 | 136 | (defun SUBWri (rd rn imm off)
|
100 |
| - (set$ rd (- rn (lshift imm off)))) |
| 137 | + (setw rd (- rn (lshift imm off)))) |
101 | 138 |
|
102 | 139 | (defun ADDXrs (rd rn rm off)
|
103 | 140 | (set$ rd (+ rn (shifted rm off))))
|
|
138 | 175 | (store-word (+ dst off (sizeof word)) t2)
|
139 | 176 | (set$ dst (+ dst off))))
|
140 | 177 |
|
| 178 | +(defun STPXi (t1 t2 base off) |
| 179 | + (let ((off (lshift off 4))) |
| 180 | + (store-word base (+ base off)) |
| 181 | + (store-word base (+ base off (sizeof word))))) |
| 182 | + |
141 | 183 | (defun LDPXpost (dst r1 r2 base off)
|
142 | 184 | (let ((off (lshift off 3)))
|
143 | 185 | (set$ r1 (load-word base))
|
|
208 | 250 | (defun Bcc (cnd off)
|
209 | 251 | (when (condition-holds cnd)
|
210 | 252 | (relative-jump off)))
|
211 |
| - |
212 |
| -(defun condition-holds (cnd) |
213 |
| - (case cnd |
214 |
| - 0b0000 ZF |
215 |
| - 0b0001 (lnot ZF) |
216 |
| - 0b0010 CF |
217 |
| - 0b0010 (lnot CF) |
218 |
| - 0b0100 NF |
219 |
| - 0b0101 (lnot NF) |
220 |
| - 0b0110 VF |
221 |
| - 0b0111 (lnot VF) |
222 |
| - 0b1000 (logand CF (lnot ZF)) |
223 |
| - 0b1001 (logor (lnot CF) ZF) |
224 |
| - 0b1010 (= NF VF) |
225 |
| - 0b1011 (/= NF VF) |
226 |
| - 0b1100 (logand (= NF VF) (= ZF 0)) |
227 |
| - 0b1101 (logor (/= NF VF) (/= ZF 0)) |
228 |
| - true)) |
|
0 commit comments