t32.decode (31953B)
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.1 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 # 21 22 &empty !extern 23 &s_rrr_shi !extern s rd rn rm shim shty 24 &s_rrr_shr !extern s rn rd rm rs shty 25 &s_rri_rot !extern s rn rd imm rot 26 &s_rrrr !extern s rd rn rm ra 27 &rrrr !extern rd rn rm ra 28 &rrr_rot !extern rd rn rm rot 29 &rrr !extern rd rn rm 30 &rr !extern rd rm 31 &ri !extern rd imm 32 &r !extern rm 33 &i !extern imm 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 38 &ldst_rr !extern p w u rn rt rm shimm shtype 39 &ldst_ri !extern p w u rn rt imm 40 &ldst_block !extern rn i b u w list 41 &strex !extern rn rd rt rt2 imm 42 &ldrex !extern rn rt rt2 imm 43 &bfx !extern rd rn lsb widthm1 44 &bfi !extern rd rn lsb msb 45 &sat !extern rd rn satimm imm sh 46 &pkh !extern rd rn rm imm tb 47 &cps !extern mode imod M A I F 48 &mcr !extern cp opc1 crn crm opc2 rt 49 &mcrr !extern cp opc1 crm rt rt2 50 51 &mve_shl_ri rdalo rdahi shim 52 &mve_shl_rr rdalo rdahi rm 53 &mve_sh_ri rda shim 54 &mve_sh_rr rda rm 55 56 # rdahi: bits [3:1] from insn, bit 0 is 1 57 # rdalo: bits [3:1] from insn, bit 0 is 0 58 %rdahi_9 9:3 !function=times_2_plus_1 59 %rdalo_17 17:3 !function=times_2 60 61 # Data-processing (register) 62 63 %imm5_12_6 12:3 6:2 64 65 @s_rrr_shi ....... .... s:1 rn:4 .... rd:4 .. shty:2 rm:4 \ 66 &s_rrr_shi shim=%imm5_12_6 67 @s_rxr_shi ....... .... s:1 .... .... rd:4 .. shty:2 rm:4 \ 68 &s_rrr_shi shim=%imm5_12_6 rn=0 69 @S_xrr_shi ....... .... . rn:4 .... .... .. shty:2 rm:4 \ 70 &s_rrr_shi shim=%imm5_12_6 s=1 rd=0 71 72 @mve_shl_ri ....... .... . ... . . ... ... . .. .. .... \ 73 &mve_shl_ri shim=%imm5_12_6 rdalo=%rdalo_17 rdahi=%rdahi_9 74 @mve_shl_rr ....... .... . ... . rm:4 ... . .. .. .... \ 75 &mve_shl_rr rdalo=%rdalo_17 rdahi=%rdahi_9 76 @mve_sh_ri ....... .... . rda:4 . ... ... . .. .. .... \ 77 &mve_sh_ri shim=%imm5_12_6 78 @mve_sh_rr ....... .... . rda:4 rm:4 .... .... .... &mve_sh_rr 79 80 { 81 TST_xrri 1110101 0000 1 .... 0 ... 1111 .... .... @S_xrr_shi 82 AND_rrri 1110101 0000 . .... 0 ... .... .... .... @s_rrr_shi 83 } 84 BIC_rrri 1110101 0001 . .... 0 ... .... .... .... @s_rrr_shi 85 { 86 # The v8.1M MVE shift insns overlap in encoding with MOVS/ORRS 87 # and are distinguished by having Rm==13 or 15. Those are UNPREDICTABLE 88 # cases for MOVS/ORRS. We decode the MVE cases first, ensuring that 89 # they explicitly call unallocated_encoding() for cases that must UNDEF 90 # (eg "using a new shift insn on a v8.1M CPU without MVE"), and letting 91 # the rest fall through (where ORR_rrri and MOV_rxri will end up 92 # handling them as r13 and r15 accesses with the same semantics as A32). 93 [ 94 { 95 UQSHL_ri 1110101 0010 1 .... 0 ... 1111 .. 00 1111 @mve_sh_ri 96 LSLL_ri 1110101 0010 1 ... 0 0 ... ... 1 .. 00 1111 @mve_shl_ri 97 UQSHLL_ri 1110101 0010 1 ... 1 0 ... ... 1 .. 00 1111 @mve_shl_ri 98 } 99 100 { 101 URSHR_ri 1110101 0010 1 .... 0 ... 1111 .. 01 1111 @mve_sh_ri 102 LSRL_ri 1110101 0010 1 ... 0 0 ... ... 1 .. 01 1111 @mve_shl_ri 103 URSHRL_ri 1110101 0010 1 ... 1 0 ... ... 1 .. 01 1111 @mve_shl_ri 104 } 105 106 { 107 SRSHR_ri 1110101 0010 1 .... 0 ... 1111 .. 10 1111 @mve_sh_ri 108 ASRL_ri 1110101 0010 1 ... 0 0 ... ... 1 .. 10 1111 @mve_shl_ri 109 SRSHRL_ri 1110101 0010 1 ... 1 0 ... ... 1 .. 10 1111 @mve_shl_ri 110 } 111 112 { 113 SQSHL_ri 1110101 0010 1 .... 0 ... 1111 .. 11 1111 @mve_sh_ri 114 SQSHLL_ri 1110101 0010 1 ... 1 0 ... ... 1 .. 11 1111 @mve_shl_ri 115 } 116 117 { 118 UQRSHL_rr 1110101 0010 1 .... .... 1111 0000 1101 @mve_sh_rr 119 LSLL_rr 1110101 0010 1 ... 0 .... ... 1 0000 1101 @mve_shl_rr 120 UQRSHLL64_rr 1110101 0010 1 ... 1 .... ... 1 0000 1101 @mve_shl_rr 121 } 122 123 { 124 SQRSHR_rr 1110101 0010 1 .... .... 1111 0010 1101 @mve_sh_rr 125 ASRL_rr 1110101 0010 1 ... 0 .... ... 1 0010 1101 @mve_shl_rr 126 SQRSHRL64_rr 1110101 0010 1 ... 1 .... ... 1 0010 1101 @mve_shl_rr 127 } 128 129 UQRSHLL48_rr 1110101 0010 1 ... 1 .... ... 1 1000 1101 @mve_shl_rr 130 SQRSHRL48_rr 1110101 0010 1 ... 1 .... ... 1 1010 1101 @mve_shl_rr 131 ] 132 133 MOV_rxri 1110101 0010 . 1111 0 ... .... .... .... @s_rxr_shi 134 ORR_rrri 1110101 0010 . .... 0 ... .... .... .... @s_rrr_shi 135 136 # v8.1M CSEL and friends 137 CSEL 1110101 0010 1 rn:4 10 op:2 rd:4 fcond:4 rm:4 138 } 139 { 140 MVN_rxri 1110101 0011 . 1111 0 ... .... .... .... @s_rxr_shi 141 ORN_rrri 1110101 0011 . .... 0 ... .... .... .... @s_rrr_shi 142 } 143 { 144 TEQ_xrri 1110101 0100 1 .... 0 ... 1111 .... .... @S_xrr_shi 145 EOR_rrri 1110101 0100 . .... 0 ... .... .... .... @s_rrr_shi 146 } 147 PKH 1110101 0110 0 rn:4 0 ... rd:4 .. tb:1 0 rm:4 \ 148 &pkh imm=%imm5_12_6 149 { 150 CMN_xrri 1110101 1000 1 .... 0 ... 1111 .... .... @S_xrr_shi 151 ADD_rrri 1110101 1000 . .... 0 ... .... .... .... @s_rrr_shi 152 } 153 ADC_rrri 1110101 1010 . .... 0 ... .... .... .... @s_rrr_shi 154 SBC_rrri 1110101 1011 . .... 0 ... .... .... .... @s_rrr_shi 155 { 156 CMP_xrri 1110101 1101 1 .... 0 ... 1111 .... .... @S_xrr_shi 157 SUB_rrri 1110101 1101 . .... 0 ... .... .... .... @s_rrr_shi 158 } 159 RSB_rrri 1110101 1110 . .... 0 ... .... .... .... @s_rrr_shi 160 161 # Data-processing (register-shifted register) 162 163 MOV_rxrr 1111 1010 0 shty:2 s:1 rm:4 1111 rd:4 0000 rs:4 \ 164 &s_rrr_shr rn=0 165 166 # Data-processing (immediate) 167 168 %t32extrot 26:1 12:3 0:8 !function=t32_expandimm_rot 169 %t32extimm 26:1 12:3 0:8 !function=t32_expandimm_imm 170 171 @s_rri_rot ....... .... s:1 rn:4 . ... rd:4 ........ \ 172 &s_rri_rot imm=%t32extimm rot=%t32extrot 173 @s_rxi_rot ....... .... s:1 .... . ... rd:4 ........ \ 174 &s_rri_rot imm=%t32extimm rot=%t32extrot rn=0 175 @S_xri_rot ....... .... . rn:4 . ... .... ........ \ 176 &s_rri_rot imm=%t32extimm rot=%t32extrot s=1 rd=0 177 178 { 179 TST_xri 1111 0.0 0000 1 .... 0 ... 1111 ........ @S_xri_rot 180 AND_rri 1111 0.0 0000 . .... 0 ... .... ........ @s_rri_rot 181 } 182 BIC_rri 1111 0.0 0001 . .... 0 ... .... ........ @s_rri_rot 183 { 184 MOV_rxi 1111 0.0 0010 . 1111 0 ... .... ........ @s_rxi_rot 185 ORR_rri 1111 0.0 0010 . .... 0 ... .... ........ @s_rri_rot 186 } 187 { 188 MVN_rxi 1111 0.0 0011 . 1111 0 ... .... ........ @s_rxi_rot 189 ORN_rri 1111 0.0 0011 . .... 0 ... .... ........ @s_rri_rot 190 } 191 { 192 TEQ_xri 1111 0.0 0100 1 .... 0 ... 1111 ........ @S_xri_rot 193 EOR_rri 1111 0.0 0100 . .... 0 ... .... ........ @s_rri_rot 194 } 195 { 196 CMN_xri 1111 0.0 1000 1 .... 0 ... 1111 ........ @S_xri_rot 197 ADD_rri 1111 0.0 1000 . .... 0 ... .... ........ @s_rri_rot 198 } 199 ADC_rri 1111 0.0 1010 . .... 0 ... .... ........ @s_rri_rot 200 SBC_rri 1111 0.0 1011 . .... 0 ... .... ........ @s_rri_rot 201 { 202 CMP_xri 1111 0.0 1101 1 .... 0 ... 1111 ........ @S_xri_rot 203 SUB_rri 1111 0.0 1101 . .... 0 ... .... ........ @s_rri_rot 204 } 205 RSB_rri 1111 0.0 1110 . .... 0 ... .... ........ @s_rri_rot 206 207 # Data processing (plain binary immediate) 208 209 %imm12_26_12_0 26:1 12:3 0:8 210 %neg12_26_12_0 26:1 12:3 0:8 !function=negate 211 @s0_rri_12 .... ... .... . rn:4 . ... rd:4 ........ \ 212 &s_rri_rot imm=%imm12_26_12_0 rot=0 s=0 213 214 { 215 ADR 1111 0.1 0000 0 1111 0 ... rd:4 ........ \ 216 &ri imm=%imm12_26_12_0 217 ADD_rri 1111 0.1 0000 0 .... 0 ... .... ........ @s0_rri_12 218 } 219 { 220 ADR 1111 0.1 0101 0 1111 0 ... rd:4 ........ \ 221 &ri imm=%neg12_26_12_0 222 SUB_rri 1111 0.1 0101 0 .... 0 ... .... ........ @s0_rri_12 223 } 224 225 # Move Wide 226 227 %imm16_26_16_12_0 16:4 26:1 12:3 0:8 228 @mov16 .... .... .... .... .... rd:4 .... .... \ 229 &ri imm=%imm16_26_16_12_0 230 231 MOVW 1111 0.10 0100 .... 0 ... .... ........ @mov16 232 MOVT 1111 0.10 1100 .... 0 ... .... ........ @mov16 233 234 # Saturate, bitfield 235 236 @sat .... .... .. sh:1 . rn:4 . ... rd:4 .. . satimm:5 \ 237 &sat imm=%imm5_12_6 238 @sat16 .... .... .. . . rn:4 . ... rd:4 .. . satimm:5 \ 239 &sat sh=0 imm=0 240 241 { 242 SSAT16 1111 0011 001 0 .... 0 000 .... 00 0 ..... @sat16 243 SSAT 1111 0011 00. 0 .... 0 ... .... .. 0 ..... @sat 244 } 245 { 246 USAT16 1111 0011 101 0 .... 0 000 .... 00 0 ..... @sat16 247 USAT 1111 0011 10. 0 .... 0 ... .... .. 0 ..... @sat 248 } 249 250 @bfx .... .... ... . rn:4 . ... rd:4 .. . widthm1:5 \ 251 &bfx lsb=%imm5_12_6 252 @bfi .... .... ... . rn:4 . ... rd:4 .. . msb:5 \ 253 &bfi lsb=%imm5_12_6 254 255 SBFX 1111 0011 010 0 .... 0 ... .... ..0..... @bfx 256 UBFX 1111 0011 110 0 .... 0 ... .... ..0..... @bfx 257 258 # bfc is bfi w/ rn=15 259 BFCI 1111 0011 011 0 .... 0 ... .... ..0..... @bfi 260 261 # Multiply and multiply accumulate 262 263 @s0_rnadm .... .... .... rn:4 ra:4 rd:4 .... rm:4 &s_rrrr s=0 264 @s0_rn0dm .... .... .... rn:4 .... rd:4 .... rm:4 &s_rrrr ra=0 s=0 265 @rnadm .... .... .... rn:4 ra:4 rd:4 .... rm:4 &rrrr 266 @rn0dm .... .... .... rn:4 .... rd:4 .... rm:4 &rrrr ra=0 267 @rndm .... .... .... rn:4 .... rd:4 .... rm:4 &rrr 268 @rdm .... .... .... .... .... rd:4 .... rm:4 &rr 269 270 { 271 MUL 1111 1011 0000 .... 1111 .... 0000 .... @s0_rn0dm 272 MLA 1111 1011 0000 .... .... .... 0000 .... @s0_rnadm 273 } 274 MLS 1111 1011 0000 .... .... .... 0001 .... @rnadm 275 SMULL 1111 1011 1000 .... .... .... 0000 .... @s0_rnadm 276 UMULL 1111 1011 1010 .... .... .... 0000 .... @s0_rnadm 277 SMLAL 1111 1011 1100 .... .... .... 0000 .... @s0_rnadm 278 UMLAL 1111 1011 1110 .... .... .... 0000 .... @s0_rnadm 279 UMAAL 1111 1011 1110 .... .... .... 0110 .... @rnadm 280 { 281 SMULWB 1111 1011 0011 .... 1111 .... 0000 .... @rn0dm 282 SMLAWB 1111 1011 0011 .... .... .... 0000 .... @rnadm 283 } 284 { 285 SMULWT 1111 1011 0011 .... 1111 .... 0001 .... @rn0dm 286 SMLAWT 1111 1011 0011 .... .... .... 0001 .... @rnadm 287 } 288 { 289 SMULBB 1111 1011 0001 .... 1111 .... 0000 .... @rn0dm 290 SMLABB 1111 1011 0001 .... .... .... 0000 .... @rnadm 291 } 292 { 293 SMULBT 1111 1011 0001 .... 1111 .... 0001 .... @rn0dm 294 SMLABT 1111 1011 0001 .... .... .... 0001 .... @rnadm 295 } 296 { 297 SMULTB 1111 1011 0001 .... 1111 .... 0010 .... @rn0dm 298 SMLATB 1111 1011 0001 .... .... .... 0010 .... @rnadm 299 } 300 { 301 SMULTT 1111 1011 0001 .... 1111 .... 0011 .... @rn0dm 302 SMLATT 1111 1011 0001 .... .... .... 0011 .... @rnadm 303 } 304 SMLALBB 1111 1011 1100 .... .... .... 1000 .... @rnadm 305 SMLALBT 1111 1011 1100 .... .... .... 1001 .... @rnadm 306 SMLALTB 1111 1011 1100 .... .... .... 1010 .... @rnadm 307 SMLALTT 1111 1011 1100 .... .... .... 1011 .... @rnadm 308 309 # usad8 is usada8 w/ ra=15 310 USADA8 1111 1011 0111 .... .... .... 0000 .... @rnadm 311 312 SMLAD 1111 1011 0010 .... .... .... 0000 .... @rnadm 313 SMLADX 1111 1011 0010 .... .... .... 0001 .... @rnadm 314 SMLSD 1111 1011 0100 .... .... .... 0000 .... @rnadm 315 SMLSDX 1111 1011 0100 .... .... .... 0001 .... @rnadm 316 317 SMLALD 1111 1011 1100 .... .... .... 1100 .... @rnadm 318 SMLALDX 1111 1011 1100 .... .... .... 1101 .... @rnadm 319 SMLSLD 1111 1011 1101 .... .... .... 1100 .... @rnadm 320 SMLSLDX 1111 1011 1101 .... .... .... 1101 .... @rnadm 321 322 SMMLA 1111 1011 0101 .... .... .... 0000 .... @rnadm 323 SMMLAR 1111 1011 0101 .... .... .... 0001 .... @rnadm 324 SMMLS 1111 1011 0110 .... .... .... 0000 .... @rnadm 325 SMMLSR 1111 1011 0110 .... .... .... 0001 .... @rnadm 326 327 SDIV 1111 1011 1001 .... 1111 .... 1111 .... @rndm 328 UDIV 1111 1011 1011 .... 1111 .... 1111 .... @rndm 329 330 # Data-processing (two source registers) 331 332 QADD 1111 1010 1000 .... 1111 .... 1000 .... @rndm 333 QSUB 1111 1010 1000 .... 1111 .... 1010 .... @rndm 334 QDADD 1111 1010 1000 .... 1111 .... 1001 .... @rndm 335 QDSUB 1111 1010 1000 .... 1111 .... 1011 .... @rndm 336 337 CRC32B 1111 1010 1100 .... 1111 .... 1000 .... @rndm 338 CRC32H 1111 1010 1100 .... 1111 .... 1001 .... @rndm 339 CRC32W 1111 1010 1100 .... 1111 .... 1010 .... @rndm 340 CRC32CB 1111 1010 1101 .... 1111 .... 1000 .... @rndm 341 CRC32CH 1111 1010 1101 .... 1111 .... 1001 .... @rndm 342 CRC32CW 1111 1010 1101 .... 1111 .... 1010 .... @rndm 343 344 SEL 1111 1010 1010 .... 1111 .... 1000 .... @rndm 345 346 # Note rn != rm is CONSTRAINED UNPREDICTABLE; we choose to ignore rn. 347 REV 1111 1010 1001 ---- 1111 .... 1000 .... @rdm 348 REV16 1111 1010 1001 ---- 1111 .... 1001 .... @rdm 349 RBIT 1111 1010 1001 ---- 1111 .... 1010 .... @rdm 350 REVSH 1111 1010 1001 ---- 1111 .... 1011 .... @rdm 351 CLZ 1111 1010 1011 ---- 1111 .... 1000 .... @rdm 352 353 # Branches and miscellaneous control 354 355 %msr_sysm 4:1 8:4 356 %mrs_sysm 4:1 16:4 357 %imm16_16_0 16:4 0:12 358 %imm21 26:s1 11:1 13:1 16:6 0:11 !function=times_2 359 &ci cond imm 360 361 { 362 # Group insn[25:23] = 111, which is cond=111x for the branch below, 363 # or unconditional, which would be illegal for the branch. 364 [ 365 # Hints, and CPS 366 { 367 [ 368 YIELD 1111 0011 1010 1111 1000 0000 0000 0001 369 WFE 1111 0011 1010 1111 1000 0000 0000 0010 370 WFI 1111 0011 1010 1111 1000 0000 0000 0011 371 372 # TODO: Implement SEV, SEVL; may help SMP performance. 373 # SEV 1111 0011 1010 1111 1000 0000 0000 0100 374 # SEVL 1111 0011 1010 1111 1000 0000 0000 0101 375 376 ESB 1111 0011 1010 1111 1000 0000 0001 0000 377 ] 378 379 # The canonical nop ends in 0000 0000, but the whole rest 380 # of the space is "reserved hint, behaves as nop". 381 NOP 1111 0011 1010 1111 1000 0000 ---- ---- 382 383 # If imod == '00' && M == '0' then SEE "Hint instructions", above. 384 CPS 1111 0011 1010 1111 1000 0 imod:2 M:1 A:1 I:1 F:1 mode:5 \ 385 &cps 386 } 387 388 # Miscellaneous control 389 CLREX 1111 0011 1011 1111 1000 1111 0010 1111 390 DSB 1111 0011 1011 1111 1000 1111 0100 ---- 391 DMB 1111 0011 1011 1111 1000 1111 0101 ---- 392 ISB 1111 0011 1011 1111 1000 1111 0110 ---- 393 SB 1111 0011 1011 1111 1000 1111 0111 0000 394 395 # Note that the v7m insn overlaps both the normal and banked insn. 396 { 397 MRS_bank 1111 0011 111 r:1 .... 1000 rd:4 001. 0000 \ 398 &mrs_bank sysm=%mrs_sysm 399 MRS_reg 1111 0011 111 r:1 1111 1000 rd:4 0000 0000 &mrs_reg 400 MRS_v7m 1111 0011 111 0 1111 1000 rd:4 sysm:8 401 } 402 { 403 MSR_bank 1111 0011 100 r:1 rn:4 1000 .... 001. 0000 \ 404 &msr_bank sysm=%msr_sysm 405 MSR_reg 1111 0011 100 r:1 rn:4 1000 mask:4 0000 0000 &msr_reg 406 MSR_v7m 1111 0011 100 0 rn:4 1000 mask:2 00 sysm:8 407 } 408 BXJ 1111 0011 1100 rm:4 1000 1111 0000 0000 &r 409 { 410 # At v6T2, this is the T5 encoding of SUBS PC, LR, #IMM, and works as for 411 # every other encoding of SUBS. With v7VE, IMM=0 is redefined as ERET. 412 # The distinction between the two only matters for Hyp mode. 413 ERET 1111 0011 1101 1110 1000 1111 0000 0000 414 SUB_rri 1111 0011 1101 1110 1000 1111 imm:8 \ 415 &s_rri_rot rot=0 s=1 rd=15 rn=14 416 } 417 SMC 1111 0111 1111 imm:4 1000 0000 0000 0000 &i 418 HVC 1111 0111 1110 .... 1000 .... .... .... \ 419 &i imm=%imm16_16_0 420 UDF 1111 0111 1111 ---- 1010 ---- ---- ---- 421 ] 422 B_cond_thumb 1111 0. cond:4 ...... 10.0 ............ &ci imm=%imm21 423 } 424 425 # Load/store (register, immediate, literal) 426 427 @ldst_rr .... .... .... rn:4 rt:4 ...... shimm:2 rm:4 \ 428 &ldst_rr p=1 w=0 u=1 shtype=0 429 @ldst_ri_idx .... .... .... rn:4 rt:4 . p:1 u:1 . imm:8 \ 430 &ldst_ri w=1 431 @ldst_ri_neg .... .... .... rn:4 rt:4 .... imm:8 \ 432 &ldst_ri p=1 w=0 u=0 433 @ldst_ri_unp .... .... .... rn:4 rt:4 .... imm:8 \ 434 &ldst_ri p=1 w=0 u=1 435 @ldst_ri_pos .... .... .... rn:4 rt:4 imm:12 \ 436 &ldst_ri p=1 w=0 u=1 437 @ldst_ri_lit .... .... u:1 ... .... rt:4 imm:12 \ 438 &ldst_ri p=1 w=0 rn=15 439 440 STRB_rr 1111 1000 0000 .... .... 000000 .. .... @ldst_rr 441 STRB_ri 1111 1000 0000 .... .... 1..1 ........ @ldst_ri_idx 442 STRB_ri 1111 1000 0000 .... .... 1100 ........ @ldst_ri_neg 443 STRBT_ri 1111 1000 0000 .... .... 1110 ........ @ldst_ri_unp 444 STRB_ri 1111 1000 1000 .... .... ............ @ldst_ri_pos 445 446 STRH_rr 1111 1000 0010 .... .... 000000 .. .... @ldst_rr 447 STRH_ri 1111 1000 0010 .... .... 1..1 ........ @ldst_ri_idx 448 STRH_ri 1111 1000 0010 .... .... 1100 ........ @ldst_ri_neg 449 STRHT_ri 1111 1000 0010 .... .... 1110 ........ @ldst_ri_unp 450 STRH_ri 1111 1000 1010 .... .... ............ @ldst_ri_pos 451 452 STR_rr 1111 1000 0100 .... .... 000000 .. .... @ldst_rr 453 STR_ri 1111 1000 0100 .... .... 1..1 ........ @ldst_ri_idx 454 STR_ri 1111 1000 0100 .... .... 1100 ........ @ldst_ri_neg 455 STRT_ri 1111 1000 0100 .... .... 1110 ........ @ldst_ri_unp 456 STR_ri 1111 1000 1100 .... .... ............ @ldst_ri_pos 457 458 # Note that Load, unsigned (literal) overlaps all other load encodings. 459 { 460 { 461 NOP 1111 1000 -001 1111 1111 ------------ # PLD 462 LDRB_ri 1111 1000 .001 1111 .... ............ @ldst_ri_lit 463 } 464 { 465 NOP 1111 1000 1001 ---- 1111 ------------ # PLD 466 LDRB_ri 1111 1000 1001 .... .... ............ @ldst_ri_pos 467 } 468 LDRB_ri 1111 1000 0001 .... .... 1..1 ........ @ldst_ri_idx 469 { 470 NOP 1111 1000 0001 ---- 1111 1100 -------- # PLD 471 LDRB_ri 1111 1000 0001 .... .... 1100 ........ @ldst_ri_neg 472 } 473 LDRBT_ri 1111 1000 0001 .... .... 1110 ........ @ldst_ri_unp 474 { 475 NOP 1111 1000 0001 ---- 1111 000000 -- ---- # PLD 476 LDRB_rr 1111 1000 0001 .... .... 000000 .. .... @ldst_rr 477 } 478 } 479 { 480 { 481 NOP 1111 1000 -011 1111 1111 ------------ # PLD 482 LDRH_ri 1111 1000 .011 1111 .... ............ @ldst_ri_lit 483 } 484 { 485 NOP 1111 1000 1011 ---- 1111 ------------ # PLDW 486 LDRH_ri 1111 1000 1011 .... .... ............ @ldst_ri_pos 487 } 488 LDRH_ri 1111 1000 0011 .... .... 1..1 ........ @ldst_ri_idx 489 { 490 NOP 1111 1000 0011 ---- 1111 1100 -------- # PLDW 491 LDRH_ri 1111 1000 0011 .... .... 1100 ........ @ldst_ri_neg 492 } 493 LDRHT_ri 1111 1000 0011 .... .... 1110 ........ @ldst_ri_unp 494 { 495 NOP 1111 1000 0011 ---- 1111 000000 -- ---- # PLDW 496 LDRH_rr 1111 1000 0011 .... .... 000000 .. .... @ldst_rr 497 } 498 } 499 { 500 LDR_ri 1111 1000 .101 1111 .... ............ @ldst_ri_lit 501 LDR_ri 1111 1000 1101 .... .... ............ @ldst_ri_pos 502 LDR_ri 1111 1000 0101 .... .... 1..1 ........ @ldst_ri_idx 503 LDR_ri 1111 1000 0101 .... .... 1100 ........ @ldst_ri_neg 504 LDRT_ri 1111 1000 0101 .... .... 1110 ........ @ldst_ri_unp 505 LDR_rr 1111 1000 0101 .... .... 000000 .. .... @ldst_rr 506 } 507 # NOPs here are PLI. 508 { 509 { 510 NOP 1111 1001 -001 1111 1111 ------------ 511 LDRSB_ri 1111 1001 .001 1111 .... ............ @ldst_ri_lit 512 } 513 { 514 NOP 1111 1001 1001 ---- 1111 ------------ 515 LDRSB_ri 1111 1001 1001 .... .... ............ @ldst_ri_pos 516 } 517 LDRSB_ri 1111 1001 0001 .... .... 1..1 ........ @ldst_ri_idx 518 { 519 NOP 1111 1001 0001 ---- 1111 1100 -------- 520 LDRSB_ri 1111 1001 0001 .... .... 1100 ........ @ldst_ri_neg 521 } 522 LDRSBT_ri 1111 1001 0001 .... .... 1110 ........ @ldst_ri_unp 523 { 524 NOP 1111 1001 0001 ---- 1111 000000 -- ---- 525 LDRSB_rr 1111 1001 0001 .... .... 000000 .. .... @ldst_rr 526 } 527 } 528 # NOPs here are unallocated memory hints, treated as NOP. 529 { 530 { 531 NOP 1111 1001 -011 1111 1111 ------------ 532 LDRSH_ri 1111 1001 .011 1111 .... ............ @ldst_ri_lit 533 } 534 { 535 NOP 1111 1001 1011 ---- 1111 ------------ 536 LDRSH_ri 1111 1001 1011 .... .... ............ @ldst_ri_pos 537 } 538 LDRSH_ri 1111 1001 0011 .... .... 1..1 ........ @ldst_ri_idx 539 { 540 NOP 1111 1001 0011 ---- 1111 1100 -------- 541 LDRSH_ri 1111 1001 0011 .... .... 1100 ........ @ldst_ri_neg 542 } 543 LDRSHT_ri 1111 1001 0011 .... .... 1110 ........ @ldst_ri_unp 544 { 545 NOP 1111 1001 0011 ---- 1111 000000 -- ---- 546 LDRSH_rr 1111 1001 0011 .... .... 000000 .. .... @ldst_rr 547 } 548 } 549 550 %imm8x4 0:8 !function=times_4 551 &ldst_ri2 p w u rn rt rt2 imm 552 @ldstd_ri8 .... .... u:1 ... rn:4 rt:4 rt2:4 ........ \ 553 &ldst_ri2 imm=%imm8x4 554 555 STRD_ri_t32 1110 1000 .110 .... .... .... ........ @ldstd_ri8 w=1 p=0 556 LDRD_ri_t32 1110 1000 .111 .... .... .... ........ @ldstd_ri8 w=1 p=0 557 558 STRD_ri_t32 1110 1001 .100 .... .... .... ........ @ldstd_ri8 w=0 p=1 559 LDRD_ri_t32 1110 1001 .101 .... .... .... ........ @ldstd_ri8 w=0 p=1 560 561 STRD_ri_t32 1110 1001 .110 .... .... .... ........ @ldstd_ri8 w=1 p=1 562 { 563 SG 1110 1001 0111 1111 1110 1001 01111111 564 LDRD_ri_t32 1110 1001 .111 .... .... .... ........ @ldstd_ri8 w=1 p=1 565 } 566 567 # Load/Store Exclusive, Load-Acquire/Store-Release, and Table Branch 568 569 @strex_i .... .... .... rn:4 rt:4 rd:4 .... .... \ 570 &strex rt2=15 imm=%imm8x4 571 @strex_0 .... .... .... rn:4 rt:4 .... .... rd:4 \ 572 &strex rt2=15 imm=0 573 @strex_d .... .... .... rn:4 rt:4 rt2:4 .... rd:4 \ 574 &strex imm=0 575 576 @ldrex_i .... .... .... rn:4 rt:4 .... .... .... \ 577 &ldrex rt2=15 imm=%imm8x4 578 @ldrex_0 .... .... .... rn:4 rt:4 .... .... .... \ 579 &ldrex rt2=15 imm=0 580 @ldrex_d .... .... .... rn:4 rt:4 rt2:4 .... .... \ 581 &ldrex imm=0 582 583 { 584 TT 1110 1000 0100 rn:4 1111 rd:4 A:1 T:1 000000 585 STREX 1110 1000 0100 .... .... .... .... .... @strex_i 586 } 587 STREXB 1110 1000 1100 .... .... 1111 0100 .... @strex_0 588 STREXH 1110 1000 1100 .... .... 1111 0101 .... @strex_0 589 STREXD_t32 1110 1000 1100 .... .... .... 0111 .... @strex_d 590 591 STLEX 1110 1000 1100 .... .... 1111 1110 .... @strex_0 592 STLEXB 1110 1000 1100 .... .... 1111 1100 .... @strex_0 593 STLEXH 1110 1000 1100 .... .... 1111 1101 .... @strex_0 594 STLEXD_t32 1110 1000 1100 .... .... .... 1111 .... @strex_d 595 596 STL 1110 1000 1100 .... .... 1111 1010 1111 @ldrex_0 597 STLB 1110 1000 1100 .... .... 1111 1000 1111 @ldrex_0 598 STLH 1110 1000 1100 .... .... 1111 1001 1111 @ldrex_0 599 600 LDREX 1110 1000 0101 .... .... 1111 .... .... @ldrex_i 601 LDREXB 1110 1000 1101 .... .... 1111 0100 1111 @ldrex_0 602 LDREXH 1110 1000 1101 .... .... 1111 0101 1111 @ldrex_0 603 LDREXD_t32 1110 1000 1101 .... .... .... 0111 1111 @ldrex_d 604 605 LDAEX 1110 1000 1101 .... .... 1111 1110 1111 @ldrex_0 606 LDAEXB 1110 1000 1101 .... .... 1111 1100 1111 @ldrex_0 607 LDAEXH 1110 1000 1101 .... .... 1111 1101 1111 @ldrex_0 608 LDAEXD_t32 1110 1000 1101 .... .... .... 1111 1111 @ldrex_d 609 610 LDA 1110 1000 1101 .... .... 1111 1010 1111 @ldrex_0 611 LDAB 1110 1000 1101 .... .... 1111 1000 1111 @ldrex_0 612 LDAH 1110 1000 1101 .... .... 1111 1001 1111 @ldrex_0 613 614 &tbranch rn rm 615 @tbranch .... .... .... rn:4 .... .... .... rm:4 &tbranch 616 617 TBB 1110 1000 1101 .... 1111 0000 0000 .... @tbranch 618 TBH 1110 1000 1101 .... 1111 0000 0001 .... @tbranch 619 620 # Parallel addition and subtraction 621 622 SADD8 1111 1010 1000 .... 1111 .... 0000 .... @rndm 623 QADD8 1111 1010 1000 .... 1111 .... 0001 .... @rndm 624 SHADD8 1111 1010 1000 .... 1111 .... 0010 .... @rndm 625 UADD8 1111 1010 1000 .... 1111 .... 0100 .... @rndm 626 UQADD8 1111 1010 1000 .... 1111 .... 0101 .... @rndm 627 UHADD8 1111 1010 1000 .... 1111 .... 0110 .... @rndm 628 629 SADD16 1111 1010 1001 .... 1111 .... 0000 .... @rndm 630 QADD16 1111 1010 1001 .... 1111 .... 0001 .... @rndm 631 SHADD16 1111 1010 1001 .... 1111 .... 0010 .... @rndm 632 UADD16 1111 1010 1001 .... 1111 .... 0100 .... @rndm 633 UQADD16 1111 1010 1001 .... 1111 .... 0101 .... @rndm 634 UHADD16 1111 1010 1001 .... 1111 .... 0110 .... @rndm 635 636 SASX 1111 1010 1010 .... 1111 .... 0000 .... @rndm 637 QASX 1111 1010 1010 .... 1111 .... 0001 .... @rndm 638 SHASX 1111 1010 1010 .... 1111 .... 0010 .... @rndm 639 UASX 1111 1010 1010 .... 1111 .... 0100 .... @rndm 640 UQASX 1111 1010 1010 .... 1111 .... 0101 .... @rndm 641 UHASX 1111 1010 1010 .... 1111 .... 0110 .... @rndm 642 643 SSUB8 1111 1010 1100 .... 1111 .... 0000 .... @rndm 644 QSUB8 1111 1010 1100 .... 1111 .... 0001 .... @rndm 645 SHSUB8 1111 1010 1100 .... 1111 .... 0010 .... @rndm 646 USUB8 1111 1010 1100 .... 1111 .... 0100 .... @rndm 647 UQSUB8 1111 1010 1100 .... 1111 .... 0101 .... @rndm 648 UHSUB8 1111 1010 1100 .... 1111 .... 0110 .... @rndm 649 650 SSUB16 1111 1010 1101 .... 1111 .... 0000 .... @rndm 651 QSUB16 1111 1010 1101 .... 1111 .... 0001 .... @rndm 652 SHSUB16 1111 1010 1101 .... 1111 .... 0010 .... @rndm 653 USUB16 1111 1010 1101 .... 1111 .... 0100 .... @rndm 654 UQSUB16 1111 1010 1101 .... 1111 .... 0101 .... @rndm 655 UHSUB16 1111 1010 1101 .... 1111 .... 0110 .... @rndm 656 657 SSAX 1111 1010 1110 .... 1111 .... 0000 .... @rndm 658 QSAX 1111 1010 1110 .... 1111 .... 0001 .... @rndm 659 SHSAX 1111 1010 1110 .... 1111 .... 0010 .... @rndm 660 USAX 1111 1010 1110 .... 1111 .... 0100 .... @rndm 661 UQSAX 1111 1010 1110 .... 1111 .... 0101 .... @rndm 662 UHSAX 1111 1010 1110 .... 1111 .... 0110 .... @rndm 663 664 # Register extends 665 666 @rrr_rot .... .... .... rn:4 .... rd:4 .. rot:2 rm:4 &rrr_rot 667 668 SXTAH 1111 1010 0000 .... 1111 .... 10.. .... @rrr_rot 669 UXTAH 1111 1010 0001 .... 1111 .... 10.. .... @rrr_rot 670 SXTAB16 1111 1010 0010 .... 1111 .... 10.. .... @rrr_rot 671 UXTAB16 1111 1010 0011 .... 1111 .... 10.. .... @rrr_rot 672 SXTAB 1111 1010 0100 .... 1111 .... 10.. .... @rrr_rot 673 UXTAB 1111 1010 0101 .... 1111 .... 10.. .... @rrr_rot 674 675 # Load/store multiple 676 677 @ldstm .... .... .. w:1 . rn:4 list:16 &ldst_block u=0 678 679 STM_t32 1110 1000 10.0 .... ................ @ldstm i=1 b=0 680 STM_t32 1110 1001 00.0 .... ................ @ldstm i=0 b=1 681 { 682 # Rn=15 UNDEFs for LDM; M-profile CLRM uses that encoding 683 CLRM 1110 1000 1001 1111 list:16 684 LDM_t32 1110 1000 10.1 .... ................ @ldstm i=1 b=0 685 } 686 LDM_t32 1110 1001 00.1 .... ................ @ldstm i=0 b=1 687 688 &rfe !extern rn w pu 689 @rfe .... .... .. w:1 . rn:4 ................ &rfe 690 691 RFE 1110 1000 00.1 .... 1100000000000000 @rfe pu=2 692 RFE 1110 1001 10.1 .... 1100000000000000 @rfe pu=1 693 694 &srs !extern mode w pu 695 @srs .... .... .. w:1 . .... ........... mode:5 &srs 696 697 SRS 1110 1000 00.0 1101 1100 0000 000. .... @srs pu=2 698 SRS 1110 1001 10.0 1101 1100 0000 000. .... @srs pu=1 699 700 # Coprocessor instructions 701 702 # We decode MCR, MCR, MRRC and MCRR only, because for QEMU the 703 # other coprocessor instructions always UNDEF. 704 # The trans_ functions for these will ignore cp values 8..13 for v7 or 705 # earlier, and 0..13 for v8 and later, because those areas of the 706 # encoding space may be used for other things, such as VFP or Neon. 707 708 @mcr .... .... opc1:3 . crn:4 rt:4 cp:4 opc2:3 . crm:4 709 @mcrr .... .... .... rt2:4 rt:4 cp:4 opc1:4 crm:4 710 711 MCRR 1110 1100 0100 .... .... .... .... .... @mcrr 712 MRRC 1110 1100 0101 .... .... .... .... .... @mcrr 713 714 MCR 1110 1110 ... 0 .... .... .... ... 1 .... @mcr 715 MRC 1110 1110 ... 1 .... .... .... ... 1 .... @mcr 716 717 # Branches 718 719 %imm24 26:s1 13:1 11:1 16:10 0:11 !function=t32_branch24 720 @branch24 ................................ &i imm=%imm24 721 722 B 1111 0. .......... 10.1 ............ @branch24 723 BL 1111 0. .......... 11.1 ............ @branch24 724 { 725 # BLX_i is non-M-profile only 726 BLX_i 1111 0. .......... 11.0 ............ @branch24 727 # M-profile only: loop and branch insns 728 [ 729 # All these BF insns have boff != 0b0000; we NOP them all 730 BF 1111 0 boff:4 ------- 1100 - ---------- 1 # BFL 731 BF 1111 0 boff:4 0 ------ 1110 - ---------- 1 # BFCSEL 732 BF 1111 0 boff:4 10 ----- 1110 - ---------- 1 # BF 733 BF 1111 0 boff:4 11 ----- 1110 0 0000000000 1 # BFX, BFLX 734 ] 735 [ 736 # LE and WLS immediate 737 %lob_imm 1:10 11:1 !function=times_2 738 739 DLS 1111 0 0000 100 rn:4 1110 0000 0000 0001 size=4 740 WLS 1111 0 0000 100 rn:4 1100 . .......... 1 imm=%lob_imm size=4 741 { 742 LE 1111 0 0000 0 f:1 tp:1 1111 1100 . .......... 1 imm=%lob_imm 743 # This is WLSTP 744 WLS 1111 0 0000 0 size:2 rn:4 1100 . .......... 1 imm=%lob_imm 745 } 746 { 747 LCTP 1111 0 0000 000 1111 1110 0000 0000 0001 748 # This is DLSTP 749 DLS 1111 0 0000 0 size:2 rn:4 1110 0000 0000 0001 750 } 751 VCTP 1111 0 0000 0 size:2 rn:4 1110 1000 0000 0001 752 ] 753 }