]>
Commit | Line | Data |
---|---|---|
51409b9e RH |
1 | # Thumb2 instructions |
2 | # | |
3 | # Copyright (c) 2019 Linaro, Ltd | |
4 | # | |
5 | # This library is free software; you can redistribute it and/or | |
6 | # modify it under the terms of the GNU Lesser General Public | |
7 | # License as published by the Free Software Foundation; either | |
8 | # version 2 of the License, or (at your option) any later version. | |
9 | # | |
10 | # This library is distributed in the hope that it will be useful, | |
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | # Lesser General Public License for more details. | |
14 | # | |
15 | # You should have received a copy of the GNU Lesser General Public | |
16 | # License along with this library; if not, see <http://www.gnu.org/licenses/>. | |
17 | ||
18 | # | |
19 | # This file is processed by scripts/decodetree.py | |
20 | # | |
25ae32c5 | 21 | |
63130596 | 22 | &empty !extern |
25ae32c5 | 23 | &s_rrr_shi !extern s rd rn rm shim shty |
5be2c123 | 24 | &s_rrr_shr !extern s rn rd rm rs shty |
581c6ebd | 25 | &s_rri_rot !extern s rn rd imm rot |
bd92fe35 RH |
26 | &s_rrrr !extern s rd rn rm ra |
27 | &rrrr !extern rd rn rm ra | |
46497f6a | 28 | &rrr_rot !extern rd rn rm rot |
6d0730a8 | 29 | &rrr !extern rd rn rm |
4c97f5b2 | 30 | &rr !extern rd rm |
145952e8 | 31 | &ri !extern rd imm |
4ed95abd | 32 | &r !extern rm |
2cde9ea5 | 33 | &i !extern imm |
d0b26644 RH |
34 | &msr_reg !extern rn r mask |
35 | &mrs_reg !extern rd r | |
36 | &msr_bank !extern rn r sysm | |
37 | &mrs_bank !extern rd r sysm | |
5e291fe1 RH |
38 | &ldst_rr !extern p w u rn rt rm shimm shtype |
39 | &ldst_ri !extern p w u rn rt imm | |
c5c426d4 | 40 | &ldst_block !extern rn i b u w list |
1efdd407 RH |
41 | &strex !extern rn rd rt rt2 imm |
42 | &ldrex !extern rn rt rt2 imm | |
86d21e4b RH |
43 | &bfx !extern rd rn lsb widthm1 |
44 | &bfi !extern rd rn lsb msb | |
46497f6a RH |
45 | &sat !extern rd rn satimm imm sh |
46 | &pkh !extern rd rn rm imm tb | |
52f83b9c | 47 | &cps !extern mode imod M A I F |
25ae32c5 RH |
48 | |
49 | # Data-processing (register) | |
50 | ||
51 | %imm5_12_6 12:3 6:2 | |
52 | ||
53 | @s_rrr_shi ....... .... s:1 rn:4 .... rd:4 .. shty:2 rm:4 \ | |
54 | &s_rrr_shi shim=%imm5_12_6 | |
55 | @s_rxr_shi ....... .... s:1 .... .... rd:4 .. shty:2 rm:4 \ | |
56 | &s_rrr_shi shim=%imm5_12_6 rn=0 | |
57 | @S_xrr_shi ....... .... . rn:4 .... .... .. shty:2 rm:4 \ | |
58 | &s_rrr_shi shim=%imm5_12_6 s=1 rd=0 | |
59 | ||
60 | { | |
61 | TST_xrri 1110101 0000 1 .... 0 ... 1111 .... .... @S_xrr_shi | |
62 | AND_rrri 1110101 0000 . .... 0 ... .... .... .... @s_rrr_shi | |
63 | } | |
64 | BIC_rrri 1110101 0001 . .... 0 ... .... .... .... @s_rrr_shi | |
65 | { | |
66 | MOV_rxri 1110101 0010 . 1111 0 ... .... .... .... @s_rxr_shi | |
67 | ORR_rrri 1110101 0010 . .... 0 ... .... .... .... @s_rrr_shi | |
68 | } | |
69 | { | |
70 | MVN_rxri 1110101 0011 . 1111 0 ... .... .... .... @s_rxr_shi | |
71 | ORN_rrri 1110101 0011 . .... 0 ... .... .... .... @s_rrr_shi | |
72 | } | |
73 | { | |
74 | TEQ_xrri 1110101 0100 1 .... 0 ... 1111 .... .... @S_xrr_shi | |
75 | EOR_rrri 1110101 0100 . .... 0 ... .... .... .... @s_rrr_shi | |
76 | } | |
46497f6a RH |
77 | PKH 1110101 0110 0 rn:4 0 ... rd:4 .. tb:1 0 rm:4 \ |
78 | &pkh imm=%imm5_12_6 | |
25ae32c5 RH |
79 | { |
80 | CMN_xrri 1110101 1000 1 .... 0 ... 1111 .... .... @S_xrr_shi | |
81 | ADD_rrri 1110101 1000 . .... 0 ... .... .... .... @s_rrr_shi | |
82 | } | |
83 | ADC_rrri 1110101 1010 . .... 0 ... .... .... .... @s_rrr_shi | |
84 | SBC_rrri 1110101 1011 . .... 0 ... .... .... .... @s_rrr_shi | |
85 | { | |
86 | CMP_xrri 1110101 1101 1 .... 0 ... 1111 .... .... @S_xrr_shi | |
87 | SUB_rrri 1110101 1101 . .... 0 ... .... .... .... @s_rrr_shi | |
88 | } | |
89 | RSB_rrri 1110101 1110 . .... 0 ... .... .... .... @s_rrr_shi | |
5be2c123 RH |
90 | |
91 | # Data-processing (register-shifted register) | |
92 | ||
93 | MOV_rxrr 1111 1010 0 shty:2 s:1 rm:4 1111 rd:4 0000 rs:4 \ | |
94 | &s_rrr_shr rn=0 | |
581c6ebd RH |
95 | |
96 | # Data-processing (immediate) | |
97 | ||
98 | %t32extrot 26:1 12:3 0:8 !function=t32_expandimm_rot | |
99 | %t32extimm 26:1 12:3 0:8 !function=t32_expandimm_imm | |
100 | ||
101 | @s_rri_rot ....... .... s:1 rn:4 . ... rd:4 ........ \ | |
102 | &s_rri_rot imm=%t32extimm rot=%t32extrot | |
103 | @s_rxi_rot ....... .... s:1 .... . ... rd:4 ........ \ | |
104 | &s_rri_rot imm=%t32extimm rot=%t32extrot rn=0 | |
105 | @S_xri_rot ....... .... . rn:4 . ... .... ........ \ | |
106 | &s_rri_rot imm=%t32extimm rot=%t32extrot s=1 rd=0 | |
107 | ||
108 | { | |
109 | TST_xri 1111 0.0 0000 1 .... 0 ... 1111 ........ @S_xri_rot | |
110 | AND_rri 1111 0.0 0000 . .... 0 ... .... ........ @s_rri_rot | |
111 | } | |
112 | BIC_rri 1111 0.0 0001 . .... 0 ... .... ........ @s_rri_rot | |
113 | { | |
114 | MOV_rxi 1111 0.0 0010 . 1111 0 ... .... ........ @s_rxi_rot | |
115 | ORR_rri 1111 0.0 0010 . .... 0 ... .... ........ @s_rri_rot | |
116 | } | |
117 | { | |
118 | MVN_rxi 1111 0.0 0011 . 1111 0 ... .... ........ @s_rxi_rot | |
119 | ORN_rri 1111 0.0 0011 . .... 0 ... .... ........ @s_rri_rot | |
120 | } | |
121 | { | |
122 | TEQ_xri 1111 0.0 0100 1 .... 0 ... 1111 ........ @S_xri_rot | |
123 | EOR_rri 1111 0.0 0100 . .... 0 ... .... ........ @s_rri_rot | |
124 | } | |
125 | { | |
126 | CMN_xri 1111 0.0 1000 1 .... 0 ... 1111 ........ @S_xri_rot | |
127 | ADD_rri 1111 0.0 1000 . .... 0 ... .... ........ @s_rri_rot | |
128 | } | |
129 | ADC_rri 1111 0.0 1010 . .... 0 ... .... ........ @s_rri_rot | |
130 | SBC_rri 1111 0.0 1011 . .... 0 ... .... ........ @s_rri_rot | |
131 | { | |
132 | CMP_xri 1111 0.0 1101 1 .... 0 ... 1111 ........ @S_xri_rot | |
133 | SUB_rri 1111 0.0 1101 . .... 0 ... .... ........ @s_rri_rot | |
134 | } | |
135 | RSB_rri 1111 0.0 1110 . .... 0 ... .... ........ @s_rri_rot | |
bd92fe35 | 136 | |
145952e8 RH |
137 | # Data processing (plain binary immediate) |
138 | ||
139 | %imm12_26_12_0 26:1 12:3 0:8 | |
140 | %neg12_26_12_0 26:1 12:3 0:8 !function=negate | |
141 | @s0_rri_12 .... ... .... . rn:4 . ... rd:4 ........ \ | |
142 | &s_rri_rot imm=%imm12_26_12_0 rot=0 s=0 | |
143 | ||
144 | { | |
145 | ADR 1111 0.1 0000 0 1111 0 ... rd:4 ........ \ | |
146 | &ri imm=%imm12_26_12_0 | |
147 | ADD_rri 1111 0.1 0000 0 .... 0 ... .... ........ @s0_rri_12 | |
148 | } | |
149 | { | |
150 | ADR 1111 0.1 0101 0 1111 0 ... rd:4 ........ \ | |
151 | &ri imm=%neg12_26_12_0 | |
152 | SUB_rri 1111 0.1 0101 0 .... 0 ... .... ........ @s0_rri_12 | |
153 | } | |
154 | ||
8f445127 RH |
155 | # Move Wide |
156 | ||
157 | %imm16_26_16_12_0 16:4 26:1 12:3 0:8 | |
158 | @mov16 .... .... .... .... .... rd:4 .... .... \ | |
159 | &ri imm=%imm16_26_16_12_0 | |
160 | ||
161 | MOVW 1111 0.10 0100 .... 0 ... .... ........ @mov16 | |
162 | MOVT 1111 0.10 1100 .... 0 ... .... ........ @mov16 | |
163 | ||
86d21e4b RH |
164 | # Saturate, bitfield |
165 | ||
46497f6a RH |
166 | @sat .... .... .. sh:1 . rn:4 . ... rd:4 .. . satimm:5 \ |
167 | &sat imm=%imm5_12_6 | |
168 | @sat16 .... .... .. . . rn:4 . ... rd:4 .. . satimm:5 \ | |
169 | &sat sh=0 imm=0 | |
170 | ||
171 | { | |
172 | SSAT16 1111 0011 001 0 .... 0 000 .... 00 0 ..... @sat16 | |
173 | SSAT 1111 0011 00. 0 .... 0 ... .... .. 0 ..... @sat | |
174 | } | |
175 | { | |
176 | USAT16 1111 0011 101 0 .... 0 000 .... 00 0 ..... @sat16 | |
177 | USAT 1111 0011 10. 0 .... 0 ... .... .. 0 ..... @sat | |
178 | } | |
179 | ||
86d21e4b RH |
180 | @bfx .... .... ... . rn:4 . ... rd:4 .. . widthm1:5 \ |
181 | &bfx lsb=%imm5_12_6 | |
182 | @bfi .... .... ... . rn:4 . ... rd:4 .. . msb:5 \ | |
183 | &bfi lsb=%imm5_12_6 | |
184 | ||
185 | SBFX 1111 0011 010 0 .... 0 ... .... ..0..... @bfx | |
186 | UBFX 1111 0011 110 0 .... 0 ... .... ..0..... @bfx | |
187 | ||
188 | # bfc is bfi w/ rn=15 | |
189 | BFCI 1111 0011 011 0 .... 0 ... .... ..0..... @bfi | |
190 | ||
bd92fe35 RH |
191 | # Multiply and multiply accumulate |
192 | ||
193 | @s0_rnadm .... .... .... rn:4 ra:4 rd:4 .... rm:4 &s_rrrr s=0 | |
194 | @s0_rn0dm .... .... .... rn:4 .... rd:4 .... rm:4 &s_rrrr ra=0 s=0 | |
195 | @rnadm .... .... .... rn:4 ra:4 rd:4 .... rm:4 &rrrr | |
26c6923d | 196 | @rn0dm .... .... .... rn:4 .... rd:4 .... rm:4 &rrrr ra=0 |
6d0730a8 | 197 | @rndm .... .... .... rn:4 .... rd:4 .... rm:4 &rrr |
4c97f5b2 | 198 | @rdm .... .... .... .... .... rd:4 .... rm:4 &rr |
bd92fe35 RH |
199 | |
200 | { | |
201 | MUL 1111 1011 0000 .... 1111 .... 0000 .... @s0_rn0dm | |
202 | MLA 1111 1011 0000 .... .... .... 0000 .... @s0_rnadm | |
203 | } | |
204 | MLS 1111 1011 0000 .... .... .... 0001 .... @rnadm | |
205 | SMULL 1111 1011 1000 .... .... .... 0000 .... @s0_rnadm | |
206 | UMULL 1111 1011 1010 .... .... .... 0000 .... @s0_rnadm | |
207 | SMLAL 1111 1011 1100 .... .... .... 0000 .... @s0_rnadm | |
208 | UMLAL 1111 1011 1110 .... .... .... 0000 .... @s0_rnadm | |
209 | UMAAL 1111 1011 1110 .... .... .... 0110 .... @rnadm | |
26c6923d RH |
210 | { |
211 | SMULWB 1111 1011 0011 .... 1111 .... 0000 .... @rn0dm | |
212 | SMLAWB 1111 1011 0011 .... .... .... 0000 .... @rnadm | |
213 | } | |
214 | { | |
215 | SMULWT 1111 1011 0011 .... 1111 .... 0001 .... @rn0dm | |
216 | SMLAWT 1111 1011 0011 .... .... .... 0001 .... @rnadm | |
217 | } | |
218 | { | |
219 | SMULBB 1111 1011 0001 .... 1111 .... 0000 .... @rn0dm | |
220 | SMLABB 1111 1011 0001 .... .... .... 0000 .... @rnadm | |
221 | } | |
222 | { | |
223 | SMULBT 1111 1011 0001 .... 1111 .... 0001 .... @rn0dm | |
224 | SMLABT 1111 1011 0001 .... .... .... 0001 .... @rnadm | |
225 | } | |
226 | { | |
227 | SMULTB 1111 1011 0001 .... 1111 .... 0010 .... @rn0dm | |
228 | SMLATB 1111 1011 0001 .... .... .... 0010 .... @rnadm | |
229 | } | |
230 | { | |
231 | SMULTT 1111 1011 0001 .... 1111 .... 0011 .... @rn0dm | |
232 | SMLATT 1111 1011 0001 .... .... .... 0011 .... @rnadm | |
233 | } | |
234 | SMLALBB 1111 1011 1100 .... .... .... 1000 .... @rnadm | |
235 | SMLALBT 1111 1011 1100 .... .... .... 1001 .... @rnadm | |
236 | SMLALTB 1111 1011 1100 .... .... .... 1010 .... @rnadm | |
237 | SMLALTT 1111 1011 1100 .... .... .... 1011 .... @rnadm | |
6d0730a8 | 238 | |
86d21e4b RH |
239 | # usad8 is usada8 w/ ra=15 |
240 | USADA8 1111 1011 0111 .... .... .... 0000 .... @rnadm | |
241 | ||
2c7c4e09 RH |
242 | SMLAD 1111 1011 0010 .... .... .... 0000 .... @rnadm |
243 | SMLADX 1111 1011 0010 .... .... .... 0001 .... @rnadm | |
244 | SMLSD 1111 1011 0100 .... .... .... 0000 .... @rnadm | |
245 | SMLSDX 1111 1011 0100 .... .... .... 0001 .... @rnadm | |
246 | ||
247 | SMLALD 1111 1011 1100 .... .... .... 1100 .... @rnadm | |
248 | SMLALDX 1111 1011 1100 .... .... .... 1101 .... @rnadm | |
249 | SMLSLD 1111 1011 1101 .... .... .... 1100 .... @rnadm | |
250 | SMLSLDX 1111 1011 1101 .... .... .... 1101 .... @rnadm | |
251 | ||
252 | SMMLA 1111 1011 0101 .... .... .... 0000 .... @rnadm | |
253 | SMMLAR 1111 1011 0101 .... .... .... 0001 .... @rnadm | |
254 | SMMLS 1111 1011 0110 .... .... .... 0000 .... @rnadm | |
255 | SMMLSR 1111 1011 0110 .... .... .... 0001 .... @rnadm | |
256 | ||
257 | SDIV 1111 1011 1001 .... 1111 .... 1111 .... @rndm | |
258 | UDIV 1111 1011 1011 .... 1111 .... 1111 .... @rndm | |
259 | ||
6d0730a8 RH |
260 | # Data-processing (two source registers) |
261 | ||
262 | QADD 1111 1010 1000 .... 1111 .... 1000 .... @rndm | |
263 | QSUB 1111 1010 1000 .... 1111 .... 1010 .... @rndm | |
264 | QDADD 1111 1010 1000 .... 1111 .... 1001 .... @rndm | |
265 | QDSUB 1111 1010 1000 .... 1111 .... 1011 .... @rndm | |
63130596 | 266 | |
6c35d53f RH |
267 | CRC32B 1111 1010 1100 .... 1111 .... 1000 .... @rndm |
268 | CRC32H 1111 1010 1100 .... 1111 .... 1001 .... @rndm | |
269 | CRC32W 1111 1010 1100 .... 1111 .... 1010 .... @rndm | |
270 | CRC32CB 1111 1010 1101 .... 1111 .... 1000 .... @rndm | |
271 | CRC32CH 1111 1010 1101 .... 1111 .... 1001 .... @rndm | |
272 | CRC32CW 1111 1010 1101 .... 1111 .... 1010 .... @rndm | |
273 | ||
46497f6a RH |
274 | SEL 1111 1010 1010 .... 1111 .... 1000 .... @rndm |
275 | ||
4c97f5b2 | 276 | # Note rn != rm is CONSTRAINED UNPREDICTABLE; we choose to ignore rn. |
46497f6a RH |
277 | REV 1111 1010 1001 ---- 1111 .... 1000 .... @rdm |
278 | REV16 1111 1010 1001 ---- 1111 .... 1001 .... @rdm | |
279 | RBIT 1111 1010 1001 ---- 1111 .... 1010 .... @rdm | |
280 | REVSH 1111 1010 1001 ---- 1111 .... 1011 .... @rdm | |
4c97f5b2 RH |
281 | CLZ 1111 1010 1011 ---- 1111 .... 1000 .... @rdm |
282 | ||
63130596 RH |
283 | # Branches and miscellaneous control |
284 | ||
d0b26644 RH |
285 | %msr_sysm 4:1 8:4 |
286 | %mrs_sysm 4:1 16:4 | |
2cde9ea5 | 287 | %imm16_16_0 16:4 0:12 |
360144f3 RH |
288 | %imm21 26:s1 11:1 13:1 16:6 0:11 !function=times_2 |
289 | &ci cond imm | |
d0b26644 RH |
290 | |
291 | { | |
360144f3 RH |
292 | # Group insn[25:23] = 111, which is cond=111x for the branch below, |
293 | # or unconditional, which would be illegal for the branch. | |
d0b26644 | 294 | { |
360144f3 RH |
295 | # Hints |
296 | { | |
297 | YIELD 1111 0011 1010 1111 1000 0000 0000 0001 | |
298 | WFE 1111 0011 1010 1111 1000 0000 0000 0010 | |
299 | WFI 1111 0011 1010 1111 1000 0000 0000 0011 | |
300 | ||
301 | # TODO: Implement SEV, SEVL; may help SMP performance. | |
302 | # SEV 1111 0011 1010 1111 1000 0000 0000 0100 | |
303 | # SEVL 1111 0011 1010 1111 1000 0000 0000 0101 | |
304 | ||
305 | # The canonical nop ends in 0000 0000, but the whole rest | |
306 | # of the space is "reserved hint, behaves as nop". | |
307 | NOP 1111 0011 1010 1111 1000 0000 ---- ---- | |
308 | } | |
519b8471 | 309 | |
52f83b9c RH |
310 | # If imod == '00' && M == '0' then SEE "Hint instructions", above. |
311 | CPS 1111 0011 1010 1111 1000 0 imod:2 M:1 A:1 I:1 F:1 mode:5 \ | |
312 | &cps | |
313 | ||
519b8471 RH |
314 | # Miscellaneous control |
315 | { | |
316 | CLREX 1111 0011 1011 1111 1000 1111 0010 1111 | |
317 | DSB 1111 0011 1011 1111 1000 1111 0100 ---- | |
318 | DMB 1111 0011 1011 1111 1000 1111 0101 ---- | |
319 | ISB 1111 0011 1011 1111 1000 1111 0110 ---- | |
320 | SB 1111 0011 1011 1111 1000 1111 0111 0000 | |
321 | } | |
322 | ||
360144f3 RH |
323 | # Note that the v7m insn overlaps both the normal and banked insn. |
324 | { | |
325 | MRS_bank 1111 0011 111 r:1 .... 1000 rd:4 001. 0000 \ | |
d0b26644 | 326 | &mrs_bank sysm=%mrs_sysm |
360144f3 RH |
327 | MRS_reg 1111 0011 111 r:1 1111 1000 rd:4 0000 0000 &mrs_reg |
328 | MRS_v7m 1111 0011 111 0 1111 1000 rd:4 sysm:8 | |
329 | } | |
330 | { | |
331 | MSR_bank 1111 0011 100 r:1 rn:4 1000 .... 001. 0000 \ | |
d0b26644 | 332 | &msr_bank sysm=%msr_sysm |
360144f3 RH |
333 | MSR_reg 1111 0011 100 r:1 rn:4 1000 mask:4 0000 0000 &msr_reg |
334 | MSR_v7m 1111 0011 100 0 rn:4 1000 mask:2 00 sysm:8 | |
335 | } | |
336 | BXJ 1111 0011 1100 rm:4 1000 1111 0000 0000 &r | |
337 | { | |
338 | # At v6T2, this is the T5 encoding of SUBS PC, LR, #IMM, and works as for | |
339 | # every other encoding of SUBS. With v7VE, IMM=0 is redefined as ERET. | |
340 | # The distinction between the two only matters for Hyp mode. | |
341 | ERET 1111 0011 1101 1110 1000 1111 0000 0000 | |
342 | SUB_rri 1111 0011 1101 1110 1000 1111 imm:8 \ | |
ef11bc3c | 343 | &s_rri_rot rot=0 s=1 rd=15 rn=14 |
360144f3 RH |
344 | } |
345 | SMC 1111 0111 1111 imm:4 1000 0000 0000 0000 &i | |
346 | HVC 1111 0111 1110 .... 1000 .... .... .... \ | |
2cde9ea5 | 347 | &i imm=%imm16_16_0 |
360144f3 RH |
348 | UDF 1111 0111 1111 ---- 1010 ---- ---- ---- |
349 | } | |
350 | B_cond_thumb 1111 0. cond:4 ...... 10.0 ............ &ci imm=%imm21 | |
63130596 | 351 | } |
5e291fe1 RH |
352 | |
353 | # Load/store (register, immediate, literal) | |
354 | ||
355 | @ldst_rr .... .... .... rn:4 rt:4 ...... shimm:2 rm:4 \ | |
356 | &ldst_rr p=1 w=0 u=1 shtype=0 | |
357 | @ldst_ri_idx .... .... .... rn:4 rt:4 . p:1 u:1 . imm:8 \ | |
358 | &ldst_ri w=1 | |
359 | @ldst_ri_neg .... .... .... rn:4 rt:4 .... imm:8 \ | |
360 | &ldst_ri p=1 w=0 u=0 | |
361 | @ldst_ri_unp .... .... .... rn:4 rt:4 .... imm:8 \ | |
362 | &ldst_ri p=1 w=0 u=1 | |
363 | @ldst_ri_pos .... .... .... rn:4 rt:4 imm:12 \ | |
364 | &ldst_ri p=1 w=0 u=1 | |
365 | @ldst_ri_lit .... .... u:1 ... .... rt:4 imm:12 \ | |
366 | &ldst_ri p=1 w=0 rn=15 | |
367 | ||
368 | STRB_rr 1111 1000 0000 .... .... 000000 .. .... @ldst_rr | |
369 | STRB_ri 1111 1000 0000 .... .... 1..1 ........ @ldst_ri_idx | |
370 | STRB_ri 1111 1000 0000 .... .... 1100 ........ @ldst_ri_neg | |
371 | STRBT_ri 1111 1000 0000 .... .... 1110 ........ @ldst_ri_unp | |
372 | STRB_ri 1111 1000 1000 .... .... ............ @ldst_ri_pos | |
373 | ||
374 | STRH_rr 1111 1000 0010 .... .... 000000 .. .... @ldst_rr | |
375 | STRH_ri 1111 1000 0010 .... .... 1..1 ........ @ldst_ri_idx | |
376 | STRH_ri 1111 1000 0010 .... .... 1100 ........ @ldst_ri_neg | |
377 | STRHT_ri 1111 1000 0010 .... .... 1110 ........ @ldst_ri_unp | |
378 | STRH_ri 1111 1000 1010 .... .... ............ @ldst_ri_pos | |
379 | ||
380 | STR_rr 1111 1000 0100 .... .... 000000 .. .... @ldst_rr | |
381 | STR_ri 1111 1000 0100 .... .... 1..1 ........ @ldst_ri_idx | |
382 | STR_ri 1111 1000 0100 .... .... 1100 ........ @ldst_ri_neg | |
383 | STRT_ri 1111 1000 0100 .... .... 1110 ........ @ldst_ri_unp | |
384 | STR_ri 1111 1000 1100 .... .... ............ @ldst_ri_pos | |
385 | ||
386 | # Note that Load, unsigned (literal) overlaps all other load encodings. | |
387 | { | |
388 | { | |
389 | NOP 1111 1000 -001 1111 1111 ------------ # PLD | |
390 | LDRB_ri 1111 1000 .001 1111 .... ............ @ldst_ri_lit | |
391 | } | |
392 | { | |
393 | NOP 1111 1000 1001 ---- 1111 ------------ # PLD | |
394 | LDRB_ri 1111 1000 1001 .... .... ............ @ldst_ri_pos | |
395 | } | |
396 | LDRB_ri 1111 1000 0001 .... .... 1..1 ........ @ldst_ri_idx | |
397 | { | |
398 | NOP 1111 1000 0001 ---- 1111 1100 -------- # PLD | |
399 | LDRB_ri 1111 1000 0001 .... .... 1100 ........ @ldst_ri_neg | |
400 | } | |
401 | LDRBT_ri 1111 1000 0001 .... .... 1110 ........ @ldst_ri_unp | |
402 | { | |
403 | NOP 1111 1000 0001 ---- 1111 000000 -- ---- # PLD | |
404 | LDRB_rr 1111 1000 0001 .... .... 000000 .. .... @ldst_rr | |
405 | } | |
406 | } | |
407 | { | |
408 | { | |
409 | NOP 1111 1000 -011 1111 1111 ------------ # PLD | |
410 | LDRH_ri 1111 1000 .011 1111 .... ............ @ldst_ri_lit | |
411 | } | |
412 | { | |
413 | NOP 1111 1000 1011 ---- 1111 ------------ # PLDW | |
414 | LDRH_ri 1111 1000 1011 .... .... ............ @ldst_ri_pos | |
415 | } | |
416 | LDRH_ri 1111 1000 0011 .... .... 1..1 ........ @ldst_ri_idx | |
417 | { | |
418 | NOP 1111 1000 0011 ---- 1111 1100 -------- # PLDW | |
419 | LDRH_ri 1111 1000 0011 .... .... 1100 ........ @ldst_ri_neg | |
420 | } | |
421 | LDRHT_ri 1111 1000 0011 .... .... 1110 ........ @ldst_ri_unp | |
422 | { | |
423 | NOP 1111 1000 0011 ---- 1111 000000 -- ---- # PLDW | |
424 | LDRH_rr 1111 1000 0011 .... .... 000000 .. .... @ldst_rr | |
425 | } | |
426 | } | |
427 | { | |
428 | LDR_ri 1111 1000 .101 1111 .... ............ @ldst_ri_lit | |
429 | LDR_ri 1111 1000 1101 .... .... ............ @ldst_ri_pos | |
430 | LDR_ri 1111 1000 0101 .... .... 1..1 ........ @ldst_ri_idx | |
431 | LDR_ri 1111 1000 0101 .... .... 1100 ........ @ldst_ri_neg | |
432 | LDRT_ri 1111 1000 0101 .... .... 1110 ........ @ldst_ri_unp | |
433 | LDR_rr 1111 1000 0101 .... .... 000000 .. .... @ldst_rr | |
434 | } | |
435 | # NOPs here are PLI. | |
436 | { | |
437 | { | |
438 | NOP 1111 1001 -001 1111 1111 ------------ | |
439 | LDRSB_ri 1111 1001 .001 1111 .... ............ @ldst_ri_lit | |
440 | } | |
441 | { | |
442 | NOP 1111 1001 1001 ---- 1111 ------------ | |
443 | LDRSB_ri 1111 1001 1001 .... .... ............ @ldst_ri_pos | |
444 | } | |
445 | LDRSB_ri 1111 1001 0001 .... .... 1..1 ........ @ldst_ri_idx | |
446 | { | |
447 | NOP 1111 1001 0001 ---- 1111 1100 -------- | |
448 | LDRSB_ri 1111 1001 0001 .... .... 1100 ........ @ldst_ri_neg | |
449 | } | |
450 | LDRSBT_ri 1111 1001 0001 .... .... 1110 ........ @ldst_ri_unp | |
451 | { | |
452 | NOP 1111 1001 0001 ---- 1111 000000 -- ---- | |
453 | LDRSB_rr 1111 1001 0001 .... .... 000000 .. .... @ldst_rr | |
454 | } | |
455 | } | |
456 | # NOPs here are unallocated memory hints, treated as NOP. | |
457 | { | |
458 | { | |
459 | NOP 1111 1001 -011 1111 1111 ------------ | |
460 | LDRSH_ri 1111 1001 .011 1111 .... ............ @ldst_ri_lit | |
461 | } | |
462 | { | |
463 | NOP 1111 1001 1011 ---- 1111 ------------ | |
464 | LDRSH_ri 1111 1001 1011 .... .... ............ @ldst_ri_pos | |
465 | } | |
466 | LDRSH_ri 1111 1001 0011 .... .... 1..1 ........ @ldst_ri_idx | |
467 | { | |
468 | NOP 1111 1001 0011 ---- 1111 1100 -------- | |
469 | LDRSH_ri 1111 1001 0011 .... .... 1100 ........ @ldst_ri_neg | |
470 | } | |
471 | LDRSHT_ri 1111 1001 0011 .... .... 1110 ........ @ldst_ri_unp | |
472 | { | |
473 | NOP 1111 1001 0011 ---- 1111 000000 -- ---- | |
474 | LDRSH_rr 1111 1001 0011 .... .... 000000 .. .... @ldst_rr | |
475 | } | |
476 | } | |
477 | ||
478 | %imm8x4 0:8 !function=times_4 | |
479 | &ldst_ri2 p w u rn rt rt2 imm | |
480 | @ldstd_ri8 .... .... u:1 ... rn:4 rt:4 rt2:4 ........ \ | |
481 | &ldst_ri2 imm=%imm8x4 | |
482 | ||
483 | STRD_ri_t32 1110 1000 .110 .... .... .... ........ @ldstd_ri8 w=1 p=0 | |
484 | LDRD_ri_t32 1110 1000 .111 .... .... .... ........ @ldstd_ri8 w=1 p=0 | |
485 | ||
486 | STRD_ri_t32 1110 1001 .100 .... .... .... ........ @ldstd_ri8 w=0 p=1 | |
487 | LDRD_ri_t32 1110 1001 .101 .... .... .... ........ @ldstd_ri8 w=0 p=1 | |
488 | ||
489 | STRD_ri_t32 1110 1001 .110 .... .... .... ........ @ldstd_ri8 w=1 p=1 | |
35d240ac RH |
490 | { |
491 | SG 1110 1001 0111 1111 1110 1001 01111111 | |
492 | LDRD_ri_t32 1110 1001 .111 .... .... .... ........ @ldstd_ri8 w=1 p=1 | |
493 | } | |
1efdd407 | 494 | |
808092bb | 495 | # Load/Store Exclusive, Load-Acquire/Store-Release, and Table Branch |
1efdd407 RH |
496 | |
497 | @strex_i .... .... .... rn:4 rt:4 rd:4 .... .... \ | |
498 | &strex rt2=15 imm=%imm8x4 | |
499 | @strex_0 .... .... .... rn:4 rt:4 .... .... rd:4 \ | |
500 | &strex rt2=15 imm=0 | |
501 | @strex_d .... .... .... rn:4 rt:4 rt2:4 .... rd:4 \ | |
502 | &strex imm=0 | |
503 | ||
504 | @ldrex_i .... .... .... rn:4 rt:4 .... .... .... \ | |
505 | &ldrex rt2=15 imm=%imm8x4 | |
506 | @ldrex_0 .... .... .... rn:4 rt:4 .... .... .... \ | |
507 | &ldrex rt2=15 imm=0 | |
508 | @ldrex_d .... .... .... rn:4 rt:4 rt2:4 .... .... \ | |
509 | &ldrex imm=0 | |
510 | ||
d449f174 RH |
511 | { |
512 | TT 1110 1000 0100 rn:4 1111 rd:4 A:1 T:1 000000 | |
513 | STREX 1110 1000 0100 .... .... .... .... .... @strex_i | |
514 | } | |
1efdd407 RH |
515 | STREXB 1110 1000 1100 .... .... 1111 0100 .... @strex_0 |
516 | STREXH 1110 1000 1100 .... .... 1111 0101 .... @strex_0 | |
517 | STREXD_t32 1110 1000 1100 .... .... .... 0111 .... @strex_d | |
518 | ||
519 | STLEX 1110 1000 1100 .... .... 1111 1110 .... @strex_0 | |
520 | STLEXB 1110 1000 1100 .... .... 1111 1100 .... @strex_0 | |
521 | STLEXH 1110 1000 1100 .... .... 1111 1101 .... @strex_0 | |
522 | STLEXD_t32 1110 1000 1100 .... .... .... 1111 .... @strex_d | |
523 | ||
524 | STL 1110 1000 1100 .... .... 1111 1010 1111 @ldrex_0 | |
525 | STLB 1110 1000 1100 .... .... 1111 1000 1111 @ldrex_0 | |
526 | STLH 1110 1000 1100 .... .... 1111 1001 1111 @ldrex_0 | |
527 | ||
528 | LDREX 1110 1000 0101 .... .... 1111 .... .... @ldrex_i | |
529 | LDREXB 1110 1000 1101 .... .... 1111 0100 1111 @ldrex_0 | |
530 | LDREXH 1110 1000 1101 .... .... 1111 0101 1111 @ldrex_0 | |
531 | LDREXD_t32 1110 1000 1101 .... .... .... 0111 1111 @ldrex_d | |
532 | ||
533 | LDAEX 1110 1000 1101 .... .... 1111 1110 1111 @ldrex_0 | |
534 | LDAEXB 1110 1000 1101 .... .... 1111 1100 1111 @ldrex_0 | |
535 | LDAEXH 1110 1000 1101 .... .... 1111 1101 1111 @ldrex_0 | |
536 | LDAEXD_t32 1110 1000 1101 .... .... .... 1111 1111 @ldrex_d | |
537 | ||
538 | LDA 1110 1000 1101 .... .... 1111 1010 1111 @ldrex_0 | |
539 | LDAB 1110 1000 1101 .... .... 1111 1000 1111 @ldrex_0 | |
540 | LDAH 1110 1000 1101 .... .... 1111 1001 1111 @ldrex_0 | |
adf1a566 | 541 | |
808092bb RH |
542 | &tbranch rn rm |
543 | @tbranch .... .... .... rn:4 .... .... .... rm:4 &tbranch | |
544 | ||
545 | TBB 1110 1000 1101 .... 1111 0000 0000 .... @tbranch | |
546 | TBH 1110 1000 1101 .... 1111 0000 0001 .... @tbranch | |
547 | ||
adf1a566 RH |
548 | # Parallel addition and subtraction |
549 | ||
550 | SADD8 1111 1010 1000 .... 1111 .... 0000 .... @rndm | |
551 | QADD8 1111 1010 1000 .... 1111 .... 0001 .... @rndm | |
552 | SHADD8 1111 1010 1000 .... 1111 .... 0010 .... @rndm | |
553 | UADD8 1111 1010 1000 .... 1111 .... 0100 .... @rndm | |
554 | UQADD8 1111 1010 1000 .... 1111 .... 0101 .... @rndm | |
555 | UHADD8 1111 1010 1000 .... 1111 .... 0110 .... @rndm | |
556 | ||
557 | SADD16 1111 1010 1001 .... 1111 .... 0000 .... @rndm | |
558 | QADD16 1111 1010 1001 .... 1111 .... 0001 .... @rndm | |
559 | SHADD16 1111 1010 1001 .... 1111 .... 0010 .... @rndm | |
560 | UADD16 1111 1010 1001 .... 1111 .... 0100 .... @rndm | |
561 | UQADD16 1111 1010 1001 .... 1111 .... 0101 .... @rndm | |
562 | UHADD16 1111 1010 1001 .... 1111 .... 0110 .... @rndm | |
563 | ||
564 | SASX 1111 1010 1010 .... 1111 .... 0000 .... @rndm | |
565 | QASX 1111 1010 1010 .... 1111 .... 0001 .... @rndm | |
566 | SHASX 1111 1010 1010 .... 1111 .... 0010 .... @rndm | |
567 | UASX 1111 1010 1010 .... 1111 .... 0100 .... @rndm | |
568 | UQASX 1111 1010 1010 .... 1111 .... 0101 .... @rndm | |
569 | UHASX 1111 1010 1010 .... 1111 .... 0110 .... @rndm | |
570 | ||
571 | SSUB8 1111 1010 1100 .... 1111 .... 0000 .... @rndm | |
572 | QSUB8 1111 1010 1100 .... 1111 .... 0001 .... @rndm | |
573 | SHSUB8 1111 1010 1100 .... 1111 .... 0010 .... @rndm | |
574 | USUB8 1111 1010 1100 .... 1111 .... 0100 .... @rndm | |
575 | UQSUB8 1111 1010 1100 .... 1111 .... 0101 .... @rndm | |
576 | UHSUB8 1111 1010 1100 .... 1111 .... 0110 .... @rndm | |
577 | ||
578 | SSUB16 1111 1010 1101 .... 1111 .... 0000 .... @rndm | |
579 | QSUB16 1111 1010 1101 .... 1111 .... 0001 .... @rndm | |
580 | SHSUB16 1111 1010 1101 .... 1111 .... 0010 .... @rndm | |
581 | USUB16 1111 1010 1101 .... 1111 .... 0100 .... @rndm | |
582 | UQSUB16 1111 1010 1101 .... 1111 .... 0101 .... @rndm | |
583 | UHSUB16 1111 1010 1101 .... 1111 .... 0110 .... @rndm | |
584 | ||
585 | SSAX 1111 1010 1110 .... 1111 .... 0000 .... @rndm | |
586 | QSAX 1111 1010 1110 .... 1111 .... 0001 .... @rndm | |
587 | SHSAX 1111 1010 1110 .... 1111 .... 0010 .... @rndm | |
588 | USAX 1111 1010 1110 .... 1111 .... 0100 .... @rndm | |
589 | UQSAX 1111 1010 1110 .... 1111 .... 0101 .... @rndm | |
590 | UHSAX 1111 1010 1110 .... 1111 .... 0110 .... @rndm | |
46497f6a RH |
591 | |
592 | # Register extends | |
593 | ||
594 | @rrr_rot .... .... .... rn:4 .... rd:4 .. rot:2 rm:4 &rrr_rot | |
595 | ||
596 | SXTAH 1111 1010 0000 .... 1111 .... 10.. .... @rrr_rot | |
597 | UXTAH 1111 1010 0001 .... 1111 .... 10.. .... @rrr_rot | |
598 | SXTAB16 1111 1010 0010 .... 1111 .... 10.. .... @rrr_rot | |
599 | UXTAB16 1111 1010 0011 .... 1111 .... 10.. .... @rrr_rot | |
600 | SXTAB 1111 1010 0100 .... 1111 .... 10.. .... @rrr_rot | |
601 | UXTAB 1111 1010 0101 .... 1111 .... 10.. .... @rrr_rot | |
c5c426d4 RH |
602 | |
603 | # Load/store multiple | |
604 | ||
605 | @ldstm .... .... .. w:1 . rn:4 list:16 &ldst_block u=0 | |
606 | ||
607 | STM_t32 1110 1000 10.0 .... ................ @ldstm i=1 b=0 | |
608 | STM_t32 1110 1001 00.0 .... ................ @ldstm i=0 b=1 | |
609 | LDM_t32 1110 1000 10.1 .... ................ @ldstm i=1 b=0 | |
610 | LDM_t32 1110 1001 00.1 .... ................ @ldstm i=0 b=1 | |
360144f3 | 611 | |
885782a7 RH |
612 | &rfe !extern rn w pu |
613 | @rfe .... .... .. w:1 . rn:4 ................ &rfe | |
614 | ||
615 | RFE 1110 1000 00.1 .... 1100000000000000 @rfe pu=2 | |
616 | RFE 1110 1001 10.1 .... 1100000000000000 @rfe pu=1 | |
617 | ||
618 | &srs !extern mode w pu | |
619 | @srs .... .... .. w:1 . .... ........... mode:5 &srs | |
620 | ||
621 | SRS 1110 1000 00.0 1101 1100 0000 000. .... @srs pu=2 | |
622 | SRS 1110 1001 10.0 1101 1100 0000 000. .... @srs pu=1 | |
623 | ||
360144f3 RH |
624 | # Branches |
625 | ||
626 | %imm24 26:s1 13:1 11:1 16:10 0:11 !function=t32_branch24 | |
627 | @branch24 ................................ &i imm=%imm24 | |
628 | ||
629 | B 1111 0. .......... 10.1 ............ @branch24 | |
630 | BL 1111 0. .......... 11.1 ............ @branch24 | |
631 | BLX_i 1111 0. .......... 11.0 ............ @branch24 |