]>
Commit | Line | Data |
---|---|---|
51409b9e RH |
1 | # A32 conditional 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 | |
50f57e09 | 8 | # version 2.1 of the License, or (at your option) any later version. |
51409b9e RH |
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 | # | |
21 | # All of the insn that have a COND field in insn[31:28] are here. | |
22 | # All insns that have 0xf in insn[31:28] are in a32-uncond.decode. | |
23 | # | |
25ae32c5 | 24 | |
63130596 | 25 | &empty |
25ae32c5 | 26 | &s_rrr_shi s rd rn rm shim shty |
5be2c123 | 27 | &s_rrr_shr s rn rd rm rs shty |
581c6ebd | 28 | &s_rri_rot s rn rd imm rot |
bd92fe35 RH |
29 | &s_rrrr s rd rn rm ra |
30 | &rrrr rd rn rm ra | |
46497f6a | 31 | &rrr_rot rd rn rm rot |
6d0730a8 | 32 | &rrr rd rn rm |
4c97f5b2 | 33 | &rr rd rm |
145952e8 | 34 | &ri rd imm |
4ed95abd | 35 | &r rm |
2cde9ea5 | 36 | &i imm |
d0b26644 RH |
37 | &msr_reg rn r mask |
38 | &mrs_reg rd r | |
39 | &msr_bank rn r sysm | |
40 | &mrs_bank rd r sysm | |
5e291fe1 RH |
41 | &ldst_rr p w u rn rt rm shimm shtype |
42 | &ldst_ri p w u rn rt imm | |
c5c426d4 | 43 | &ldst_block rn i b u w list |
1efdd407 RH |
44 | &strex rn rd rt rt2 imm |
45 | &ldrex rn rt rt2 imm | |
86d21e4b RH |
46 | &bfx rd rn lsb widthm1 |
47 | &bfi rd rn lsb msb | |
46497f6a RH |
48 | &sat rd rn satimm imm sh |
49 | &pkh rd rn rm imm tb | |
cd8be50e PM |
50 | &mcr cp opc1 crn crm opc2 rt |
51 | &mcrr cp opc1 crm rt rt2 | |
25ae32c5 RH |
52 | |
53 | # Data-processing (register) | |
54 | ||
55 | @s_rrr_shi ---- ... .... s:1 rn:4 rd:4 shim:5 shty:2 . rm:4 \ | |
56 | &s_rrr_shi | |
57 | @s_rxr_shi ---- ... .... s:1 .... rd:4 shim:5 shty:2 . rm:4 \ | |
58 | &s_rrr_shi rn=0 | |
59 | @S_xrr_shi ---- ... .... . rn:4 .... shim:5 shty:2 . rm:4 \ | |
60 | &s_rrr_shi s=1 rd=0 | |
61 | ||
62 | AND_rrri .... 000 0000 . .... .... ..... .. 0 .... @s_rrr_shi | |
63 | EOR_rrri .... 000 0001 . .... .... ..... .. 0 .... @s_rrr_shi | |
64 | SUB_rrri .... 000 0010 . .... .... ..... .. 0 .... @s_rrr_shi | |
65 | RSB_rrri .... 000 0011 . .... .... ..... .. 0 .... @s_rrr_shi | |
66 | ADD_rrri .... 000 0100 . .... .... ..... .. 0 .... @s_rrr_shi | |
67 | ADC_rrri .... 000 0101 . .... .... ..... .. 0 .... @s_rrr_shi | |
68 | SBC_rrri .... 000 0110 . .... .... ..... .. 0 .... @s_rrr_shi | |
69 | RSC_rrri .... 000 0111 . .... .... ..... .. 0 .... @s_rrr_shi | |
70 | TST_xrri .... 000 1000 1 .... 0000 ..... .. 0 .... @S_xrr_shi | |
71 | TEQ_xrri .... 000 1001 1 .... 0000 ..... .. 0 .... @S_xrr_shi | |
72 | CMP_xrri .... 000 1010 1 .... 0000 ..... .. 0 .... @S_xrr_shi | |
73 | CMN_xrri .... 000 1011 1 .... 0000 ..... .. 0 .... @S_xrr_shi | |
74 | ORR_rrri .... 000 1100 . .... .... ..... .. 0 .... @s_rrr_shi | |
75 | MOV_rxri .... 000 1101 . 0000 .... ..... .. 0 .... @s_rxr_shi | |
76 | BIC_rrri .... 000 1110 . .... .... ..... .. 0 .... @s_rrr_shi | |
77 | MVN_rxri .... 000 1111 . 0000 .... ..... .. 0 .... @s_rxr_shi | |
5be2c123 | 78 | |
8f445127 RH |
79 | %imm16 16:4 0:12 |
80 | @mov16 ---- .... .... .... rd:4 ............ &ri imm=%imm16 | |
81 | ||
82 | MOVW .... 0011 0000 .... .... ............ @mov16 | |
83 | MOVT .... 0011 0100 .... .... ............ @mov16 | |
84 | ||
5be2c123 RH |
85 | # Data-processing (register-shifted register) |
86 | ||
87 | @s_rrr_shr ---- ... .... s:1 rn:4 rd:4 rs:4 . shty:2 . rm:4 \ | |
88 | &s_rrr_shr | |
89 | @s_rxr_shr ---- ... .... s:1 .... rd:4 rs:4 . shty:2 . rm:4 \ | |
90 | &s_rrr_shr rn=0 | |
91 | @S_xrr_shr ---- ... .... . rn:4 .... rs:4 . shty:2 . rm:4 \ | |
92 | &s_rrr_shr rd=0 s=1 | |
93 | ||
94 | AND_rrrr .... 000 0000 . .... .... .... 0 .. 1 .... @s_rrr_shr | |
95 | EOR_rrrr .... 000 0001 . .... .... .... 0 .. 1 .... @s_rrr_shr | |
96 | SUB_rrrr .... 000 0010 . .... .... .... 0 .. 1 .... @s_rrr_shr | |
97 | RSB_rrrr .... 000 0011 . .... .... .... 0 .. 1 .... @s_rrr_shr | |
98 | ADD_rrrr .... 000 0100 . .... .... .... 0 .. 1 .... @s_rrr_shr | |
99 | ADC_rrrr .... 000 0101 . .... .... .... 0 .. 1 .... @s_rrr_shr | |
100 | SBC_rrrr .... 000 0110 . .... .... .... 0 .. 1 .... @s_rrr_shr | |
101 | RSC_rrrr .... 000 0111 . .... .... .... 0 .. 1 .... @s_rrr_shr | |
102 | TST_xrrr .... 000 1000 1 .... 0000 .... 0 .. 1 .... @S_xrr_shr | |
103 | TEQ_xrrr .... 000 1001 1 .... 0000 .... 0 .. 1 .... @S_xrr_shr | |
104 | CMP_xrrr .... 000 1010 1 .... 0000 .... 0 .. 1 .... @S_xrr_shr | |
105 | CMN_xrrr .... 000 1011 1 .... 0000 .... 0 .. 1 .... @S_xrr_shr | |
106 | ORR_rrrr .... 000 1100 . .... .... .... 0 .. 1 .... @s_rrr_shr | |
107 | MOV_rxrr .... 000 1101 . 0000 .... .... 0 .. 1 .... @s_rxr_shr | |
108 | BIC_rrrr .... 000 1110 . .... .... .... 0 .. 1 .... @s_rrr_shr | |
109 | MVN_rxrr .... 000 1111 . 0000 .... .... 0 .. 1 .... @s_rxr_shr | |
581c6ebd RH |
110 | |
111 | # Data-processing (immediate) | |
112 | ||
113 | %a32extrot 8:4 !function=times_2 | |
114 | ||
115 | @s_rri_rot ---- ... .... s:1 rn:4 rd:4 .... imm:8 \ | |
116 | &s_rri_rot rot=%a32extrot | |
117 | @s_rxi_rot ---- ... .... s:1 .... rd:4 .... imm:8 \ | |
118 | &s_rri_rot rot=%a32extrot rn=0 | |
119 | @S_xri_rot ---- ... .... . rn:4 .... .... imm:8 \ | |
120 | &s_rri_rot rot=%a32extrot rd=0 s=1 | |
121 | ||
122 | AND_rri .... 001 0000 . .... .... ............ @s_rri_rot | |
123 | EOR_rri .... 001 0001 . .... .... ............ @s_rri_rot | |
124 | SUB_rri .... 001 0010 . .... .... ............ @s_rri_rot | |
125 | RSB_rri .... 001 0011 . .... .... ............ @s_rri_rot | |
126 | ADD_rri .... 001 0100 . .... .... ............ @s_rri_rot | |
127 | ADC_rri .... 001 0101 . .... .... ............ @s_rri_rot | |
128 | SBC_rri .... 001 0110 . .... .... ............ @s_rri_rot | |
129 | RSC_rri .... 001 0111 . .... .... ............ @s_rri_rot | |
130 | TST_xri .... 001 1000 1 .... 0000 ............ @S_xri_rot | |
131 | TEQ_xri .... 001 1001 1 .... 0000 ............ @S_xri_rot | |
132 | CMP_xri .... 001 1010 1 .... 0000 ............ @S_xri_rot | |
133 | CMN_xri .... 001 1011 1 .... 0000 ............ @S_xri_rot | |
134 | ORR_rri .... 001 1100 . .... .... ............ @s_rri_rot | |
135 | MOV_rxi .... 001 1101 . 0000 .... ............ @s_rxi_rot | |
136 | BIC_rri .... 001 1110 . .... .... ............ @s_rri_rot | |
137 | MVN_rxi .... 001 1111 . 0000 .... ............ @s_rxi_rot | |
bd92fe35 RH |
138 | |
139 | # Multiply and multiply accumulate | |
140 | ||
141 | @s_rdamn ---- .... ... s:1 rd:4 ra:4 rm:4 .... rn:4 &s_rrrr | |
142 | @s_rd0mn ---- .... ... s:1 rd:4 .... rm:4 .... rn:4 &s_rrrr ra=0 | |
143 | @rdamn ---- .... ... . rd:4 ra:4 rm:4 .... rn:4 &rrrr | |
26c6923d | 144 | @rd0mn ---- .... ... . rd:4 .... rm:4 .... rn:4 &rrrr ra=0 |
bd92fe35 RH |
145 | |
146 | MUL .... 0000 000 . .... 0000 .... 1001 .... @s_rd0mn | |
147 | MLA .... 0000 001 . .... .... .... 1001 .... @s_rdamn | |
148 | UMAAL .... 0000 010 0 .... .... .... 1001 .... @rdamn | |
149 | MLS .... 0000 011 0 .... .... .... 1001 .... @rdamn | |
150 | UMULL .... 0000 100 . .... .... .... 1001 .... @s_rdamn | |
151 | UMLAL .... 0000 101 . .... .... .... 1001 .... @s_rdamn | |
152 | SMULL .... 0000 110 . .... .... .... 1001 .... @s_rdamn | |
153 | SMLAL .... 0000 111 . .... .... .... 1001 .... @s_rdamn | |
6d0730a8 RH |
154 | |
155 | # Saturating addition and subtraction | |
156 | ||
157 | @rndm ---- .... .... rn:4 rd:4 .... .... rm:4 &rrr | |
158 | ||
159 | QADD .... 0001 0000 .... .... 0000 0101 .... @rndm | |
160 | QSUB .... 0001 0010 .... .... 0000 0101 .... @rndm | |
161 | QDADD .... 0001 0100 .... .... 0000 0101 .... @rndm | |
162 | QDSUB .... 0001 0110 .... .... 0000 0101 .... @rndm | |
26c6923d RH |
163 | |
164 | # Halfword multiply and multiply accumulate | |
165 | ||
166 | SMLABB .... 0001 0000 .... .... .... 1000 .... @rdamn | |
167 | SMLABT .... 0001 0000 .... .... .... 1100 .... @rdamn | |
168 | SMLATB .... 0001 0000 .... .... .... 1010 .... @rdamn | |
169 | SMLATT .... 0001 0000 .... .... .... 1110 .... @rdamn | |
170 | SMLAWB .... 0001 0010 .... .... .... 1000 .... @rdamn | |
171 | SMULWB .... 0001 0010 .... 0000 .... 1010 .... @rd0mn | |
172 | SMLAWT .... 0001 0010 .... .... .... 1100 .... @rdamn | |
173 | SMULWT .... 0001 0010 .... 0000 .... 1110 .... @rd0mn | |
174 | SMLALBB .... 0001 0100 .... .... .... 1000 .... @rdamn | |
175 | SMLALBT .... 0001 0100 .... .... .... 1100 .... @rdamn | |
176 | SMLALTB .... 0001 0100 .... .... .... 1010 .... @rdamn | |
177 | SMLALTT .... 0001 0100 .... .... .... 1110 .... @rdamn | |
178 | SMULBB .... 0001 0110 .... 0000 .... 1000 .... @rd0mn | |
179 | SMULBT .... 0001 0110 .... 0000 .... 1100 .... @rd0mn | |
180 | SMULTB .... 0001 0110 .... 0000 .... 1010 .... @rd0mn | |
181 | SMULTT .... 0001 0110 .... 0000 .... 1110 .... @rd0mn | |
63130596 RH |
182 | |
183 | # MSR (immediate) and hints | |
184 | ||
185 | &msr_i r mask rot imm | |
186 | @msr_i ---- .... .... mask:4 .... rot:4 imm:8 &msr_i | |
187 | ||
188 | { | |
189 | { | |
190 | YIELD ---- 0011 0010 0000 1111 ---- 0000 0001 | |
191 | WFE ---- 0011 0010 0000 1111 ---- 0000 0010 | |
192 | WFI ---- 0011 0010 0000 1111 ---- 0000 0011 | |
193 | ||
194 | # TODO: Implement SEV, SEVL; may help SMP performance. | |
195 | # SEV ---- 0011 0010 0000 1111 ---- 0000 0100 | |
196 | # SEVL ---- 0011 0010 0000 1111 ---- 0000 0101 | |
197 | ||
198 | # The canonical nop ends in 00000000, but the whole of the | |
199 | # rest of the space executes as nop if otherwise unsupported. | |
200 | NOP ---- 0011 0010 0000 1111 ---- ---- ---- | |
201 | } | |
202 | # Note mask = 0 is covered by NOP | |
203 | MSR_imm .... 0011 0010 .... 1111 .... .... .... @msr_i r=0 | |
204 | } | |
205 | MSR_imm .... 0011 0110 .... 1111 .... .... .... @msr_i r=1 | |
d0b26644 | 206 | |
6c35d53f RH |
207 | # Cyclic Redundancy Check |
208 | ||
209 | CRC32B .... 0001 0000 .... .... 0000 0100 .... @rndm | |
210 | CRC32H .... 0001 0010 .... .... 0000 0100 .... @rndm | |
211 | CRC32W .... 0001 0100 .... .... 0000 0100 .... @rndm | |
212 | CRC32CB .... 0001 0000 .... .... 0010 0100 .... @rndm | |
213 | CRC32CH .... 0001 0010 .... .... 0010 0100 .... @rndm | |
214 | CRC32CW .... 0001 0100 .... .... 0010 0100 .... @rndm | |
215 | ||
d0b26644 RH |
216 | # Miscellaneous instructions |
217 | ||
218 | %sysm 8:1 16:4 | |
2cde9ea5 | 219 | %imm16_8_0 8:12 0:4 |
d0b26644 | 220 | |
4ed95abd | 221 | @rm ---- .... .... .... .... .... .... rm:4 &r |
4c97f5b2 | 222 | @rdm ---- .... .... .... rd:4 .... .... rm:4 &rr |
2cde9ea5 | 223 | @i16 ---- .... .... .... .... .... .... .... &i imm=%imm16_8_0 |
4ed95abd | 224 | |
d0b26644 RH |
225 | MRS_bank ---- 0001 0 r:1 00 .... rd:4 001. 0000 0000 &mrs_bank %sysm |
226 | MSR_bank ---- 0001 0 r:1 10 .... 1111 001. 0000 rn:4 &msr_bank %sysm | |
227 | ||
228 | MRS_reg ---- 0001 0 r:1 00 1111 rd:4 0000 0000 0000 &mrs_reg | |
229 | MSR_reg ---- 0001 0 r:1 10 mask:4 1111 0000 0000 rn:4 &msr_reg | |
4ed95abd RH |
230 | |
231 | BX .... 0001 0010 1111 1111 1111 0001 .... @rm | |
232 | BXJ .... 0001 0010 1111 1111 1111 0010 .... @rm | |
233 | BLX_r .... 0001 0010 1111 1111 1111 0011 .... @rm | |
4c97f5b2 RH |
234 | |
235 | CLZ .... 0001 0110 1111 .... 1111 0001 .... @rdm | |
ef11bc3c RH |
236 | |
237 | ERET ---- 0001 0110 0000 0000 0000 0110 1110 | |
2cde9ea5 RH |
238 | |
239 | HLT .... 0001 0000 .... .... .... 0111 .... @i16 | |
240 | BKPT .... 0001 0010 .... .... .... 0111 .... @i16 | |
241 | HVC .... 0001 0100 .... .... .... 0111 .... @i16 | |
242 | SMC ---- 0001 0110 0000 0000 0000 0111 imm:4 &i | |
5e291fe1 RH |
243 | |
244 | # Load/Store Dual, Half, Signed Byte (register) | |
245 | ||
246 | @ldst_rr_p1w ---- ...1 u:1 . w:1 . rn:4 rt:4 .... .... rm:4 \ | |
247 | &ldst_rr p=1 shimm=0 shtype=0 | |
248 | @ldst_rr_pw0 ---- ...0 u:1 . 0 . rn:4 rt:4 .... .... rm:4 \ | |
249 | &ldst_rr p=0 w=0 shimm=0 shtype=0 | |
250 | ||
251 | STRH_rr .... 000. .0.0 .... .... 0000 1011 .... @ldst_rr_pw0 | |
252 | STRH_rr .... 000. .0.0 .... .... 0000 1011 .... @ldst_rr_p1w | |
253 | ||
254 | LDRD_rr .... 000. .0.0 .... .... 0000 1101 .... @ldst_rr_pw0 | |
255 | LDRD_rr .... 000. .0.0 .... .... 0000 1101 .... @ldst_rr_p1w | |
256 | ||
257 | STRD_rr .... 000. .0.0 .... .... 0000 1111 .... @ldst_rr_pw0 | |
258 | STRD_rr .... 000. .0.0 .... .... 0000 1111 .... @ldst_rr_p1w | |
259 | ||
260 | LDRH_rr .... 000. .0.1 .... .... 0000 1011 .... @ldst_rr_pw0 | |
261 | LDRH_rr .... 000. .0.1 .... .... 0000 1011 .... @ldst_rr_p1w | |
262 | ||
263 | LDRSB_rr .... 000. .0.1 .... .... 0000 1101 .... @ldst_rr_pw0 | |
264 | LDRSB_rr .... 000. .0.1 .... .... 0000 1101 .... @ldst_rr_p1w | |
265 | ||
266 | LDRSH_rr .... 000. .0.1 .... .... 0000 1111 .... @ldst_rr_pw0 | |
267 | LDRSH_rr .... 000. .0.1 .... .... 0000 1111 .... @ldst_rr_p1w | |
268 | ||
269 | # Note the unpriv load/stores use the previously invalid P=0, W=1 encoding, | |
270 | # and act as normal post-indexed (P=0, W=0). | |
271 | @ldst_rr_p0w1 ---- ...0 u:1 . 1 . rn:4 rt:4 .... .... rm:4 \ | |
272 | &ldst_rr p=0 w=0 shimm=0 shtype=0 | |
273 | ||
274 | STRHT_rr .... 000. .0.0 .... .... 0000 1011 .... @ldst_rr_p0w1 | |
275 | LDRHT_rr .... 000. .0.1 .... .... 0000 1011 .... @ldst_rr_p0w1 | |
276 | LDRSBT_rr .... 000. .0.1 .... .... 0000 1101 .... @ldst_rr_p0w1 | |
277 | LDRSHT_rr .... 000. .0.1 .... .... 0000 1111 .... @ldst_rr_p0w1 | |
278 | ||
279 | # Load/Store word and unsigned byte (register) | |
280 | ||
281 | @ldst_rs_p1w ---- ...1 u:1 . w:1 . rn:4 rt:4 shimm:5 shtype:2 . rm:4 \ | |
282 | &ldst_rr p=1 | |
283 | @ldst_rs_pw0 ---- ...0 u:1 . 0 . rn:4 rt:4 shimm:5 shtype:2 . rm:4 \ | |
284 | &ldst_rr p=0 w=0 | |
285 | ||
286 | STR_rr .... 011. .0.0 .... .... .... ...0 .... @ldst_rs_pw0 | |
287 | STR_rr .... 011. .0.0 .... .... .... ...0 .... @ldst_rs_p1w | |
288 | STRB_rr .... 011. .1.0 .... .... .... ...0 .... @ldst_rs_pw0 | |
289 | STRB_rr .... 011. .1.0 .... .... .... ...0 .... @ldst_rs_p1w | |
290 | ||
291 | LDR_rr .... 011. .0.1 .... .... .... ...0 .... @ldst_rs_pw0 | |
292 | LDR_rr .... 011. .0.1 .... .... .... ...0 .... @ldst_rs_p1w | |
293 | LDRB_rr .... 011. .1.1 .... .... .... ...0 .... @ldst_rs_pw0 | |
294 | LDRB_rr .... 011. .1.1 .... .... .... ...0 .... @ldst_rs_p1w | |
295 | ||
296 | @ldst_rs_p0w1 ---- ...0 u:1 . 1 . rn:4 rt:4 shimm:5 shtype:2 . rm:4 \ | |
297 | &ldst_rr p=0 w=0 | |
298 | ||
299 | STRT_rr .... 011. .0.0 .... .... .... ...0 .... @ldst_rs_p0w1 | |
300 | STRBT_rr .... 011. .1.0 .... .... .... ...0 .... @ldst_rs_p0w1 | |
301 | LDRT_rr .... 011. .0.1 .... .... .... ...0 .... @ldst_rs_p0w1 | |
302 | LDRBT_rr .... 011. .1.1 .... .... .... ...0 .... @ldst_rs_p0w1 | |
303 | ||
304 | # Load/Store Dual, Half, Signed Byte (immediate) | |
305 | ||
306 | %imm8s_8_0 8:4 0:4 | |
307 | @ldst_ri8_p1w ---- ...1 u:1 . w:1 . rn:4 rt:4 .... .... .... \ | |
308 | &ldst_ri imm=%imm8s_8_0 p=1 | |
309 | @ldst_ri8_pw0 ---- ...0 u:1 . 0 . rn:4 rt:4 .... .... .... \ | |
310 | &ldst_ri imm=%imm8s_8_0 p=0 w=0 | |
311 | ||
312 | STRH_ri .... 000. .1.0 .... .... .... 1011 .... @ldst_ri8_pw0 | |
313 | STRH_ri .... 000. .1.0 .... .... .... 1011 .... @ldst_ri8_p1w | |
314 | ||
315 | LDRD_ri_a32 .... 000. .1.0 .... .... .... 1101 .... @ldst_ri8_pw0 | |
316 | LDRD_ri_a32 .... 000. .1.0 .... .... .... 1101 .... @ldst_ri8_p1w | |
317 | ||
318 | STRD_ri_a32 .... 000. .1.0 .... .... .... 1111 .... @ldst_ri8_pw0 | |
319 | STRD_ri_a32 .... 000. .1.0 .... .... .... 1111 .... @ldst_ri8_p1w | |
320 | ||
321 | LDRH_ri .... 000. .1.1 .... .... .... 1011 .... @ldst_ri8_pw0 | |
322 | LDRH_ri .... 000. .1.1 .... .... .... 1011 .... @ldst_ri8_p1w | |
323 | ||
324 | LDRSB_ri .... 000. .1.1 .... .... .... 1101 .... @ldst_ri8_pw0 | |
325 | LDRSB_ri .... 000. .1.1 .... .... .... 1101 .... @ldst_ri8_p1w | |
326 | ||
327 | LDRSH_ri .... 000. .1.1 .... .... .... 1111 .... @ldst_ri8_pw0 | |
328 | LDRSH_ri .... 000. .1.1 .... .... .... 1111 .... @ldst_ri8_p1w | |
329 | ||
330 | # Note the unpriv load/stores use the previously invalid P=0, W=1 encoding, | |
331 | # and act as normal post-indexed (P=0, W=0). | |
332 | @ldst_ri8_p0w1 ---- ...0 u:1 . 1 . rn:4 rt:4 .... .... .... \ | |
333 | &ldst_ri imm=%imm8s_8_0 p=0 w=0 | |
334 | ||
335 | STRHT_ri .... 000. .1.0 .... .... .... 1011 .... @ldst_ri8_p0w1 | |
336 | LDRHT_ri .... 000. .1.1 .... .... .... 1011 .... @ldst_ri8_p0w1 | |
337 | LDRSBT_ri .... 000. .1.1 .... .... .... 1101 .... @ldst_ri8_p0w1 | |
338 | LDRSHT_ri .... 000. .1.1 .... .... .... 1111 .... @ldst_ri8_p0w1 | |
339 | ||
340 | # Load/Store word and unsigned byte (immediate) | |
341 | ||
342 | @ldst_ri12_p1w ---- ...1 u:1 . w:1 . rn:4 rt:4 imm:12 &ldst_ri p=1 | |
343 | @ldst_ri12_pw0 ---- ...0 u:1 . 0 . rn:4 rt:4 imm:12 &ldst_ri p=0 w=0 | |
344 | ||
345 | STR_ri .... 010. .0.0 .... .... ............ @ldst_ri12_p1w | |
346 | STR_ri .... 010. .0.0 .... .... ............ @ldst_ri12_pw0 | |
347 | STRB_ri .... 010. .1.0 .... .... ............ @ldst_ri12_p1w | |
348 | STRB_ri .... 010. .1.0 .... .... ............ @ldst_ri12_pw0 | |
349 | ||
350 | LDR_ri .... 010. .0.1 .... .... ............ @ldst_ri12_p1w | |
351 | LDR_ri .... 010. .0.1 .... .... ............ @ldst_ri12_pw0 | |
352 | LDRB_ri .... 010. .1.1 .... .... ............ @ldst_ri12_p1w | |
353 | LDRB_ri .... 010. .1.1 .... .... ............ @ldst_ri12_pw0 | |
354 | ||
355 | @ldst_ri12_p0w1 ---- ...0 u:1 . 1 . rn:4 rt:4 imm:12 &ldst_ri p=0 w=0 | |
356 | ||
357 | STRT_ri .... 010. .0.0 .... .... ............ @ldst_ri12_p0w1 | |
358 | STRBT_ri .... 010. .1.0 .... .... ............ @ldst_ri12_p0w1 | |
359 | LDRT_ri .... 010. .0.1 .... .... ............ @ldst_ri12_p0w1 | |
360 | LDRBT_ri .... 010. .1.1 .... .... ............ @ldst_ri12_p0w1 | |
1efdd407 RH |
361 | |
362 | # Synchronization primitives | |
363 | ||
364 | @swp ---- .... .... rn:4 rt:4 .... .... rt2:4 | |
365 | ||
366 | SWP .... 0001 0000 .... .... 0000 1001 .... @swp | |
367 | SWPB .... 0001 0100 .... .... 0000 1001 .... @swp | |
368 | ||
369 | # Load/Store Exclusive and Load-Acquire/Store-Release | |
370 | # | |
371 | # Note rt2 for STREXD/LDREXD is set by the helper after checking rt is even. | |
372 | ||
373 | @strex ---- .... .... rn:4 rd:4 .... .... rt:4 \ | |
374 | &strex imm=0 rt2=15 | |
375 | @ldrex ---- .... .... rn:4 rt:4 .... .... .... \ | |
376 | &ldrex imm=0 rt2=15 | |
377 | @stl ---- .... .... rn:4 .... .... .... rt:4 \ | |
378 | &ldrex imm=0 rt2=15 | |
379 | ||
380 | STREX .... 0001 1000 .... .... 1111 1001 .... @strex | |
381 | STREXD_a32 .... 0001 1010 .... .... 1111 1001 .... @strex | |
382 | STREXB .... 0001 1100 .... .... 1111 1001 .... @strex | |
383 | STREXH .... 0001 1110 .... .... 1111 1001 .... @strex | |
384 | ||
385 | STLEX .... 0001 1000 .... .... 1110 1001 .... @strex | |
386 | STLEXD_a32 .... 0001 1010 .... .... 1110 1001 .... @strex | |
387 | STLEXB .... 0001 1100 .... .... 1110 1001 .... @strex | |
388 | STLEXH .... 0001 1110 .... .... 1110 1001 .... @strex | |
389 | ||
390 | STL .... 0001 1000 .... 1111 1100 1001 .... @stl | |
391 | STLB .... 0001 1100 .... 1111 1100 1001 .... @stl | |
392 | STLH .... 0001 1110 .... 1111 1100 1001 .... @stl | |
393 | ||
394 | LDREX .... 0001 1001 .... .... 1111 1001 1111 @ldrex | |
395 | LDREXD_a32 .... 0001 1011 .... .... 1111 1001 1111 @ldrex | |
396 | LDREXB .... 0001 1101 .... .... 1111 1001 1111 @ldrex | |
397 | LDREXH .... 0001 1111 .... .... 1111 1001 1111 @ldrex | |
398 | ||
399 | LDAEX .... 0001 1001 .... .... 1110 1001 1111 @ldrex | |
400 | LDAEXD_a32 .... 0001 1011 .... .... 1110 1001 1111 @ldrex | |
401 | LDAEXB .... 0001 1101 .... .... 1110 1001 1111 @ldrex | |
402 | LDAEXH .... 0001 1111 .... .... 1110 1001 1111 @ldrex | |
403 | ||
404 | LDA .... 0001 1001 .... .... 1100 1001 1111 @ldrex | |
405 | LDAB .... 0001 1101 .... .... 1100 1001 1111 @ldrex | |
406 | LDAH .... 0001 1111 .... .... 1100 1001 1111 @ldrex | |
86d21e4b RH |
407 | |
408 | # Media instructions | |
409 | ||
410 | # usad8 is usada8 w/ ra=15 | |
411 | USADA8 ---- 0111 1000 rd:4 ra:4 rm:4 0001 rn:4 | |
412 | ||
413 | # ubfx and sbfx | |
414 | @bfx ---- .... ... widthm1:5 rd:4 lsb:5 ... rn:4 &bfx | |
415 | ||
416 | SBFX .... 0111 101 ..... .... ..... 101 .... @bfx | |
417 | UBFX .... 0111 111 ..... .... ..... 101 .... @bfx | |
418 | ||
419 | # bfc is bfi w/ rn=15 | |
420 | BFCI ---- 0111 110 msb:5 rd:4 lsb:5 001 rn:4 &bfi | |
421 | ||
422 | # While we could get UDEF by not including this, add the pattern for | |
423 | # documentation and to conflict with any other typos in this file. | |
424 | UDF 1110 0111 1111 ---- ---- ---- 1111 ---- | |
adf1a566 RH |
425 | |
426 | # Parallel addition and subtraction | |
427 | ||
428 | SADD16 .... 0110 0001 .... .... 1111 0001 .... @rndm | |
429 | SASX .... 0110 0001 .... .... 1111 0011 .... @rndm | |
430 | SSAX .... 0110 0001 .... .... 1111 0101 .... @rndm | |
431 | SSUB16 .... 0110 0001 .... .... 1111 0111 .... @rndm | |
432 | SADD8 .... 0110 0001 .... .... 1111 1001 .... @rndm | |
433 | SSUB8 .... 0110 0001 .... .... 1111 1111 .... @rndm | |
434 | ||
435 | QADD16 .... 0110 0010 .... .... 1111 0001 .... @rndm | |
436 | QASX .... 0110 0010 .... .... 1111 0011 .... @rndm | |
437 | QSAX .... 0110 0010 .... .... 1111 0101 .... @rndm | |
438 | QSUB16 .... 0110 0010 .... .... 1111 0111 .... @rndm | |
439 | QADD8 .... 0110 0010 .... .... 1111 1001 .... @rndm | |
440 | QSUB8 .... 0110 0010 .... .... 1111 1111 .... @rndm | |
441 | ||
442 | SHADD16 .... 0110 0011 .... .... 1111 0001 .... @rndm | |
443 | SHASX .... 0110 0011 .... .... 1111 0011 .... @rndm | |
444 | SHSAX .... 0110 0011 .... .... 1111 0101 .... @rndm | |
445 | SHSUB16 .... 0110 0011 .... .... 1111 0111 .... @rndm | |
446 | SHADD8 .... 0110 0011 .... .... 1111 1001 .... @rndm | |
447 | SHSUB8 .... 0110 0011 .... .... 1111 1111 .... @rndm | |
448 | ||
449 | UADD16 .... 0110 0101 .... .... 1111 0001 .... @rndm | |
450 | UASX .... 0110 0101 .... .... 1111 0011 .... @rndm | |
451 | USAX .... 0110 0101 .... .... 1111 0101 .... @rndm | |
452 | USUB16 .... 0110 0101 .... .... 1111 0111 .... @rndm | |
453 | UADD8 .... 0110 0101 .... .... 1111 1001 .... @rndm | |
454 | USUB8 .... 0110 0101 .... .... 1111 1111 .... @rndm | |
455 | ||
456 | UQADD16 .... 0110 0110 .... .... 1111 0001 .... @rndm | |
457 | UQASX .... 0110 0110 .... .... 1111 0011 .... @rndm | |
458 | UQSAX .... 0110 0110 .... .... 1111 0101 .... @rndm | |
459 | UQSUB16 .... 0110 0110 .... .... 1111 0111 .... @rndm | |
460 | UQADD8 .... 0110 0110 .... .... 1111 1001 .... @rndm | |
461 | UQSUB8 .... 0110 0110 .... .... 1111 1111 .... @rndm | |
462 | ||
463 | UHADD16 .... 0110 0111 .... .... 1111 0001 .... @rndm | |
464 | UHASX .... 0110 0111 .... .... 1111 0011 .... @rndm | |
465 | UHSAX .... 0110 0111 .... .... 1111 0101 .... @rndm | |
466 | UHSUB16 .... 0110 0111 .... .... 1111 0111 .... @rndm | |
467 | UHADD8 .... 0110 0111 .... .... 1111 1001 .... @rndm | |
468 | UHSUB8 .... 0110 0111 .... .... 1111 1111 .... @rndm | |
46497f6a RH |
469 | |
470 | # Packing, unpacking, saturation, and reversal | |
471 | ||
472 | PKH ---- 0110 1000 rn:4 rd:4 imm:5 tb:1 01 rm:4 &pkh | |
473 | ||
474 | @sat ---- .... ... satimm:5 rd:4 imm:5 sh:1 .. rn:4 &sat | |
475 | @sat16 ---- .... .... satimm:4 rd:4 .... .... rn:4 \ | |
476 | &sat imm=0 sh=0 | |
477 | ||
478 | SSAT .... 0110 101. .... .... .... ..01 .... @sat | |
479 | USAT .... 0110 111. .... .... .... ..01 .... @sat | |
480 | ||
481 | SSAT16 .... 0110 1010 .... .... 1111 0011 .... @sat16 | |
482 | USAT16 .... 0110 1110 .... .... 1111 0011 .... @sat16 | |
483 | ||
484 | @rrr_rot ---- .... .... rn:4 rd:4 rot:2 ...... rm:4 &rrr_rot | |
485 | ||
486 | SXTAB16 .... 0110 1000 .... .... ..00 0111 .... @rrr_rot | |
487 | SXTAB .... 0110 1010 .... .... ..00 0111 .... @rrr_rot | |
488 | SXTAH .... 0110 1011 .... .... ..00 0111 .... @rrr_rot | |
489 | UXTAB16 .... 0110 1100 .... .... ..00 0111 .... @rrr_rot | |
490 | UXTAB .... 0110 1110 .... .... ..00 0111 .... @rrr_rot | |
491 | UXTAH .... 0110 1111 .... .... ..00 0111 .... @rrr_rot | |
492 | ||
493 | SEL .... 0110 1000 .... .... 1111 1011 .... @rndm | |
494 | REV .... 0110 1011 1111 .... 1111 0011 .... @rdm | |
495 | REV16 .... 0110 1011 1111 .... 1111 1011 .... @rdm | |
496 | REVSH .... 0110 1111 1111 .... 1111 1011 .... @rdm | |
497 | RBIT .... 0110 1111 1111 .... 1111 0011 .... @rdm | |
2c7c4e09 RH |
498 | |
499 | # Signed multiply, signed and unsigned divide | |
500 | ||
501 | @rdmn ---- .... .... rd:4 .... rm:4 .... rn:4 &rrr | |
502 | ||
503 | SMLAD .... 0111 0000 .... .... .... 0001 .... @rdamn | |
504 | SMLADX .... 0111 0000 .... .... .... 0011 .... @rdamn | |
505 | SMLSD .... 0111 0000 .... .... .... 0101 .... @rdamn | |
506 | SMLSDX .... 0111 0000 .... .... .... 0111 .... @rdamn | |
507 | ||
508 | SDIV .... 0111 0001 .... 1111 .... 0001 .... @rdmn | |
509 | UDIV .... 0111 0011 .... 1111 .... 0001 .... @rdmn | |
510 | ||
511 | SMLALD .... 0111 0100 .... .... .... 0001 .... @rdamn | |
512 | SMLALDX .... 0111 0100 .... .... .... 0011 .... @rdamn | |
513 | SMLSLD .... 0111 0100 .... .... .... 0101 .... @rdamn | |
514 | SMLSLDX .... 0111 0100 .... .... .... 0111 .... @rdamn | |
515 | ||
516 | SMMLA .... 0111 0101 .... .... .... 0001 .... @rdamn | |
517 | SMMLAR .... 0111 0101 .... .... .... 0011 .... @rdamn | |
518 | SMMLS .... 0111 0101 .... .... .... 1101 .... @rdamn | |
519 | SMMLSR .... 0111 0101 .... .... .... 1111 .... @rdamn | |
c5c426d4 RH |
520 | |
521 | # Block data transfer | |
522 | ||
523 | STM ---- 100 b:1 i:1 u:1 w:1 0 rn:4 list:16 &ldst_block | |
524 | LDM_a32 ---- 100 b:1 i:1 u:1 w:1 1 rn:4 list:16 &ldst_block | |
360144f3 RH |
525 | |
526 | # Branch, branch with link | |
527 | ||
528 | %imm26 0:s24 !function=times_4 | |
529 | @branch ---- .... ........................ &i imm=%imm26 | |
530 | ||
531 | B .... 1010 ........................ @branch | |
532 | BL .... 1011 ........................ @branch | |
542f5188 | 533 | |
cd8be50e PM |
534 | # Coprocessor instructions |
535 | ||
536 | # We decode MCR, MCR, MRRC and MCRR only, because for QEMU the | |
537 | # other coprocessor instructions always UNDEF. | |
538 | # The trans_ functions for these will ignore cp values 8..13 for v7 or | |
539 | # earlier, and 0..13 for v8 and later, because those areas of the | |
540 | # encoding space may be used for other things, such as VFP or Neon. | |
541 | ||
542 | @mcr ---- .... opc1:3 . crn:4 rt:4 cp:4 opc2:3 . crm:4 &mcr | |
543 | @mcrr ---- .... .... rt2:4 rt:4 cp:4 opc1:4 crm:4 &mcrr | |
544 | ||
545 | MCRR .... 1100 0100 .... .... .... .... .... @mcrr | |
546 | MRRC .... 1100 0101 .... .... .... .... .... @mcrr | |
547 | ||
548 | MCR .... 1110 ... 0 .... .... .... ... 1 .... @mcr | |
549 | MRC .... 1110 ... 1 .... .... .... ... 1 .... @mcr | |
550 | ||
542f5188 RH |
551 | # Supervisor call |
552 | ||
553 | SVC ---- 1111 imm:24 &i |