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