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# 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 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} 64BIC_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} 77PKH 1110101 0110 0 rn:4 0 ... rd:4 .. tb:1 0 rm:4 \ 78 &pkh imm=%imm5_12_6 79{ 80 CMN_xrri 1110101 1000 1 .... 0 ... 1111 .... .... @S_xrr_shi 81 ADD_rrri 1110101 1000 . .... 0 ... .... .... .... @s_rrr_shi 82} 83ADC_rrri 1110101 1010 . .... 0 ... .... .... .... @s_rrr_shi 84SBC_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} 89RSB_rrri 1110101 1110 . .... 0 ... .... .... .... @s_rrr_shi 90 91# Data-processing (register-shifted register) 92 93MOV_rxrr 1111 1010 0 shty:2 s:1 rm:4 1111 rd:4 0000 rs:4 \ 94 &s_rrr_shr rn=0 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} 112BIC_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} 129ADC_rri 1111 0.0 1010 . .... 0 ... .... ........ @s_rri_rot 130SBC_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} 135RSB_rri 1111 0.0 1110 . .... 0 ... .... ........ @s_rri_rot 136 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 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 161MOVW 1111 0.10 0100 .... 0 ... .... ........ @mov16 162MOVT 1111 0.10 1100 .... 0 ... .... ........ @mov16 163 164# Saturate, bitfield 165 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 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 185SBFX 1111 0011 010 0 .... 0 ... .... ..0..... @bfx 186UBFX 1111 0011 110 0 .... 0 ... .... ..0..... @bfx 187 188# bfc is bfi w/ rn=15 189BFCI 1111 0011 011 0 .... 0 ... .... ..0..... @bfi 190 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 196@rn0dm .... .... .... rn:4 .... rd:4 .... rm:4 &rrrr ra=0 197@rndm .... .... .... rn:4 .... rd:4 .... rm:4 &rrr 198@rdm .... .... .... .... .... rd:4 .... rm:4 &rr 199 200{ 201 MUL 1111 1011 0000 .... 1111 .... 0000 .... @s0_rn0dm 202 MLA 1111 1011 0000 .... .... .... 0000 .... @s0_rnadm 203} 204MLS 1111 1011 0000 .... .... .... 0001 .... @rnadm 205SMULL 1111 1011 1000 .... .... .... 0000 .... @s0_rnadm 206UMULL 1111 1011 1010 .... .... .... 0000 .... @s0_rnadm 207SMLAL 1111 1011 1100 .... .... .... 0000 .... @s0_rnadm 208UMLAL 1111 1011 1110 .... .... .... 0000 .... @s0_rnadm 209UMAAL 1111 1011 1110 .... .... .... 0110 .... @rnadm 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} 234SMLALBB 1111 1011 1100 .... .... .... 1000 .... @rnadm 235SMLALBT 1111 1011 1100 .... .... .... 1001 .... @rnadm 236SMLALTB 1111 1011 1100 .... .... .... 1010 .... @rnadm 237SMLALTT 1111 1011 1100 .... .... .... 1011 .... @rnadm 238 239# usad8 is usada8 w/ ra=15 240USADA8 1111 1011 0111 .... .... .... 0000 .... @rnadm 241 242SMLAD 1111 1011 0010 .... .... .... 0000 .... @rnadm 243SMLADX 1111 1011 0010 .... .... .... 0001 .... @rnadm 244SMLSD 1111 1011 0100 .... .... .... 0000 .... @rnadm 245SMLSDX 1111 1011 0100 .... .... .... 0001 .... @rnadm 246 247SMLALD 1111 1011 1100 .... .... .... 1100 .... @rnadm 248SMLALDX 1111 1011 1100 .... .... .... 1101 .... @rnadm 249SMLSLD 1111 1011 1101 .... .... .... 1100 .... @rnadm 250SMLSLDX 1111 1011 1101 .... .... .... 1101 .... @rnadm 251 252SMMLA 1111 1011 0101 .... .... .... 0000 .... @rnadm 253SMMLAR 1111 1011 0101 .... .... .... 0001 .... @rnadm 254SMMLS 1111 1011 0110 .... .... .... 0000 .... @rnadm 255SMMLSR 1111 1011 0110 .... .... .... 0001 .... @rnadm 256 257SDIV 1111 1011 1001 .... 1111 .... 1111 .... @rndm 258UDIV 1111 1011 1011 .... 1111 .... 1111 .... @rndm 259 260# Data-processing (two source registers) 261 262QADD 1111 1010 1000 .... 1111 .... 1000 .... @rndm 263QSUB 1111 1010 1000 .... 1111 .... 1010 .... @rndm 264QDADD 1111 1010 1000 .... 1111 .... 1001 .... @rndm 265QDSUB 1111 1010 1000 .... 1111 .... 1011 .... @rndm 266 267CRC32B 1111 1010 1100 .... 1111 .... 1000 .... @rndm 268CRC32H 1111 1010 1100 .... 1111 .... 1001 .... @rndm 269CRC32W 1111 1010 1100 .... 1111 .... 1010 .... @rndm 270CRC32CB 1111 1010 1101 .... 1111 .... 1000 .... @rndm 271CRC32CH 1111 1010 1101 .... 1111 .... 1001 .... @rndm 272CRC32CW 1111 1010 1101 .... 1111 .... 1010 .... @rndm 273 274SEL 1111 1010 1010 .... 1111 .... 1000 .... @rndm 275 276# Note rn != rm is CONSTRAINED UNPREDICTABLE; we choose to ignore rn. 277REV 1111 1010 1001 ---- 1111 .... 1000 .... @rdm 278REV16 1111 1010 1001 ---- 1111 .... 1001 .... @rdm 279RBIT 1111 1010 1001 ---- 1111 .... 1010 .... @rdm 280REVSH 1111 1010 1001 ---- 1111 .... 1011 .... @rdm 281CLZ 1111 1010 1011 ---- 1111 .... 1000 .... @rdm 282 283# Branches and miscellaneous control 284 285%msr_sysm 4:1 8:4 286%mrs_sysm 4:1 16:4 287%imm16_16_0 16:4 0:12 288%imm21 26:s1 11:1 13:1 16:6 0:11 !function=times_2 289&ci cond imm 290 291{ 292 # Group insn[25:23] = 111, which is cond=111x for the branch below, 293 # or unconditional, which would be illegal for the branch. 294 { 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 } 309 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 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 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 \ 326 &mrs_bank sysm=%mrs_sysm 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 \ 332 &msr_bank sysm=%msr_sysm 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 \ 343 &s_rri_rot rot=0 s=1 rd=15 rn=14 344 } 345 SMC 1111 0111 1111 imm:4 1000 0000 0000 0000 &i 346 HVC 1111 0111 1110 .... 1000 .... .... .... \ 347 &i imm=%imm16_16_0 348 UDF 1111 0111 1111 ---- 1010 ---- ---- ---- 349 } 350 B_cond_thumb 1111 0. cond:4 ...... 10.0 ............ &ci imm=%imm21 351} 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 368STRB_rr 1111 1000 0000 .... .... 000000 .. .... @ldst_rr 369STRB_ri 1111 1000 0000 .... .... 1..1 ........ @ldst_ri_idx 370STRB_ri 1111 1000 0000 .... .... 1100 ........ @ldst_ri_neg 371STRBT_ri 1111 1000 0000 .... .... 1110 ........ @ldst_ri_unp 372STRB_ri 1111 1000 1000 .... .... ............ @ldst_ri_pos 373 374STRH_rr 1111 1000 0010 .... .... 000000 .. .... @ldst_rr 375STRH_ri 1111 1000 0010 .... .... 1..1 ........ @ldst_ri_idx 376STRH_ri 1111 1000 0010 .... .... 1100 ........ @ldst_ri_neg 377STRHT_ri 1111 1000 0010 .... .... 1110 ........ @ldst_ri_unp 378STRH_ri 1111 1000 1010 .... .... ............ @ldst_ri_pos 379 380STR_rr 1111 1000 0100 .... .... 000000 .. .... @ldst_rr 381STR_ri 1111 1000 0100 .... .... 1..1 ........ @ldst_ri_idx 382STR_ri 1111 1000 0100 .... .... 1100 ........ @ldst_ri_neg 383STRT_ri 1111 1000 0100 .... .... 1110 ........ @ldst_ri_unp 384STR_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 483STRD_ri_t32 1110 1000 .110 .... .... .... ........ @ldstd_ri8 w=1 p=0 484LDRD_ri_t32 1110 1000 .111 .... .... .... ........ @ldstd_ri8 w=1 p=0 485 486STRD_ri_t32 1110 1001 .100 .... .... .... ........ @ldstd_ri8 w=0 p=1 487LDRD_ri_t32 1110 1001 .101 .... .... .... ........ @ldstd_ri8 w=0 p=1 488 489STRD_ri_t32 1110 1001 .110 .... .... .... ........ @ldstd_ri8 w=1 p=1 490{ 491 SG 1110 1001 0111 1111 1110 1001 01111111 492 LDRD_ri_t32 1110 1001 .111 .... .... .... ........ @ldstd_ri8 w=1 p=1 493} 494 495# Load/Store Exclusive, Load-Acquire/Store-Release, and Table Branch 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 511{ 512 TT 1110 1000 0100 rn:4 1111 rd:4 A:1 T:1 000000 513 STREX 1110 1000 0100 .... .... .... .... .... @strex_i 514} 515STREXB 1110 1000 1100 .... .... 1111 0100 .... @strex_0 516STREXH 1110 1000 1100 .... .... 1111 0101 .... @strex_0 517STREXD_t32 1110 1000 1100 .... .... .... 0111 .... @strex_d 518 519STLEX 1110 1000 1100 .... .... 1111 1110 .... @strex_0 520STLEXB 1110 1000 1100 .... .... 1111 1100 .... @strex_0 521STLEXH 1110 1000 1100 .... .... 1111 1101 .... @strex_0 522STLEXD_t32 1110 1000 1100 .... .... .... 1111 .... @strex_d 523 524STL 1110 1000 1100 .... .... 1111 1010 1111 @ldrex_0 525STLB 1110 1000 1100 .... .... 1111 1000 1111 @ldrex_0 526STLH 1110 1000 1100 .... .... 1111 1001 1111 @ldrex_0 527 528LDREX 1110 1000 0101 .... .... 1111 .... .... @ldrex_i 529LDREXB 1110 1000 1101 .... .... 1111 0100 1111 @ldrex_0 530LDREXH 1110 1000 1101 .... .... 1111 0101 1111 @ldrex_0 531LDREXD_t32 1110 1000 1101 .... .... .... 0111 1111 @ldrex_d 532 533LDAEX 1110 1000 1101 .... .... 1111 1110 1111 @ldrex_0 534LDAEXB 1110 1000 1101 .... .... 1111 1100 1111 @ldrex_0 535LDAEXH 1110 1000 1101 .... .... 1111 1101 1111 @ldrex_0 536LDAEXD_t32 1110 1000 1101 .... .... .... 1111 1111 @ldrex_d 537 538LDA 1110 1000 1101 .... .... 1111 1010 1111 @ldrex_0 539LDAB 1110 1000 1101 .... .... 1111 1000 1111 @ldrex_0 540LDAH 1110 1000 1101 .... .... 1111 1001 1111 @ldrex_0 541 542&tbranch rn rm 543@tbranch .... .... .... rn:4 .... .... .... rm:4 &tbranch 544 545TBB 1110 1000 1101 .... 1111 0000 0000 .... @tbranch 546TBH 1110 1000 1101 .... 1111 0000 0001 .... @tbranch 547 548# Parallel addition and subtraction 549 550SADD8 1111 1010 1000 .... 1111 .... 0000 .... @rndm 551QADD8 1111 1010 1000 .... 1111 .... 0001 .... @rndm 552SHADD8 1111 1010 1000 .... 1111 .... 0010 .... @rndm 553UADD8 1111 1010 1000 .... 1111 .... 0100 .... @rndm 554UQADD8 1111 1010 1000 .... 1111 .... 0101 .... @rndm 555UHADD8 1111 1010 1000 .... 1111 .... 0110 .... @rndm 556 557SADD16 1111 1010 1001 .... 1111 .... 0000 .... @rndm 558QADD16 1111 1010 1001 .... 1111 .... 0001 .... @rndm 559SHADD16 1111 1010 1001 .... 1111 .... 0010 .... @rndm 560UADD16 1111 1010 1001 .... 1111 .... 0100 .... @rndm 561UQADD16 1111 1010 1001 .... 1111 .... 0101 .... @rndm 562UHADD16 1111 1010 1001 .... 1111 .... 0110 .... @rndm 563 564SASX 1111 1010 1010 .... 1111 .... 0000 .... @rndm 565QASX 1111 1010 1010 .... 1111 .... 0001 .... @rndm 566SHASX 1111 1010 1010 .... 1111 .... 0010 .... @rndm 567UASX 1111 1010 1010 .... 1111 .... 0100 .... @rndm 568UQASX 1111 1010 1010 .... 1111 .... 0101 .... @rndm 569UHASX 1111 1010 1010 .... 1111 .... 0110 .... @rndm 570 571SSUB8 1111 1010 1100 .... 1111 .... 0000 .... @rndm 572QSUB8 1111 1010 1100 .... 1111 .... 0001 .... @rndm 573SHSUB8 1111 1010 1100 .... 1111 .... 0010 .... @rndm 574USUB8 1111 1010 1100 .... 1111 .... 0100 .... @rndm 575UQSUB8 1111 1010 1100 .... 1111 .... 0101 .... @rndm 576UHSUB8 1111 1010 1100 .... 1111 .... 0110 .... @rndm 577 578SSUB16 1111 1010 1101 .... 1111 .... 0000 .... @rndm 579QSUB16 1111 1010 1101 .... 1111 .... 0001 .... @rndm 580SHSUB16 1111 1010 1101 .... 1111 .... 0010 .... @rndm 581USUB16 1111 1010 1101 .... 1111 .... 0100 .... @rndm 582UQSUB16 1111 1010 1101 .... 1111 .... 0101 .... @rndm 583UHSUB16 1111 1010 1101 .... 1111 .... 0110 .... @rndm 584 585SSAX 1111 1010 1110 .... 1111 .... 0000 .... @rndm 586QSAX 1111 1010 1110 .... 1111 .... 0001 .... @rndm 587SHSAX 1111 1010 1110 .... 1111 .... 0010 .... @rndm 588USAX 1111 1010 1110 .... 1111 .... 0100 .... @rndm 589UQSAX 1111 1010 1110 .... 1111 .... 0101 .... @rndm 590UHSAX 1111 1010 1110 .... 1111 .... 0110 .... @rndm 591 592# Register extends 593 594@rrr_rot .... .... .... rn:4 .... rd:4 .. rot:2 rm:4 &rrr_rot 595 596SXTAH 1111 1010 0000 .... 1111 .... 10.. .... @rrr_rot 597UXTAH 1111 1010 0001 .... 1111 .... 10.. .... @rrr_rot 598SXTAB16 1111 1010 0010 .... 1111 .... 10.. .... @rrr_rot 599UXTAB16 1111 1010 0011 .... 1111 .... 10.. .... @rrr_rot 600SXTAB 1111 1010 0100 .... 1111 .... 10.. .... @rrr_rot 601UXTAB 1111 1010 0101 .... 1111 .... 10.. .... @rrr_rot 602 603# Load/store multiple 604 605@ldstm .... .... .. w:1 . rn:4 list:16 &ldst_block u=0 606 607STM_t32 1110 1000 10.0 .... ................ @ldstm i=1 b=0 608STM_t32 1110 1001 00.0 .... ................ @ldstm i=0 b=1 609LDM_t32 1110 1000 10.1 .... ................ @ldstm i=1 b=0 610LDM_t32 1110 1001 00.1 .... ................ @ldstm i=0 b=1 611 612&rfe !extern rn w pu 613@rfe .... .... .. w:1 . rn:4 ................ &rfe 614 615RFE 1110 1000 00.1 .... 1100000000000000 @rfe pu=2 616RFE 1110 1001 10.1 .... 1100000000000000 @rfe pu=1 617 618&srs !extern mode w pu 619@srs .... .... .. w:1 . .... ........... mode:5 &srs 620 621SRS 1110 1000 00.0 1101 1100 0000 000. .... @srs pu=2 622SRS 1110 1001 10.0 1101 1100 0000 000. .... @srs pu=1 623 624# Branches 625 626%imm24 26:s1 13:1 11:1 16:10 0:11 !function=t32_branch24 627@branch24 ................................ &i imm=%imm24 628 629B 1111 0. .......... 10.1 ............ @branch24 630BL 1111 0. .......... 11.1 ............ @branch24 631BLX_i 1111 0. .......... 11.0 ............ @branch24 632