| 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 |
| 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 | # 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 | # |
| 24 | |
| 25 | &empty |
| 26 | &s_rrr_shi s rd rn rm shim shty |
| 27 | &s_rrr_shr s rn rd rm rs shty |
| 28 | &s_rri_rot s rn rd imm rot |
| 29 | &s_rrrr s rd rn rm ra |
| 30 | &rrrr rd rn rm ra |
| 31 | &rrr_rot rd rn rm rot |
| 32 | &rrr rd rn rm |
| 33 | &rr rd rm |
| 34 | &ri rd imm |
| 35 | &r rm |
| 36 | &i imm |
| 37 | &msr_reg rn r mask |
| 38 | &mrs_reg rd r |
| 39 | &msr_bank rn r sysm |
| 40 | &mrs_bank rd r sysm |
| 41 | &ldst_rr p w u rn rt rm shimm shtype |
| 42 | &ldst_ri p w u rn rt imm |
| 43 | &ldst_block rn i b u w list |
| 44 | &strex rn rd rt rt2 imm |
| 45 | &ldrex rn rt rt2 imm |
| 46 | &bfx rd rn lsb widthm1 |
| 47 | &bfi rd rn lsb msb |
| 48 | &sat rd rn satimm imm sh |
| 49 | &pkh rd rn rm imm tb |
| 50 | &mcr cp opc1 crn crm opc2 rt |
| 51 | &mcrr cp opc1 crm rt rt2 |
| 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 |
| 78 | |
| 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 | |
| 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 |
| 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 |
| 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 |
| 144 | @rd0mn ---- .... ... . rd:4 .... rm:4 .... rn:4 &rrrr ra=0 |
| 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 |
| 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 |
| 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 |
| 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 | [ |
| 191 | YIELD ---- 0011 0010 0000 1111 ---- 0000 0001 |
| 192 | WFE ---- 0011 0010 0000 1111 ---- 0000 0010 |
| 193 | WFI ---- 0011 0010 0000 1111 ---- 0000 0011 |
| 194 | |
| 195 | SEV ---- 0011 0010 0000 1111 ---- 0000 0100 |
| 196 | SEVL ---- 0011 0010 0000 1111 ---- 0000 0101 |
| 197 | |
| 198 | ESB ---- 0011 0010 0000 1111 ---- 0001 0000 |
| 199 | ] |
| 200 | |
| 201 | # The canonical nop ends in 00000000, but the whole of the |
| 202 | # rest of the space executes as nop if otherwise unsupported. |
| 203 | NOP ---- 0011 0010 0000 1111 ---- ---- ---- |
| 204 | } |
| 205 | # Note mask = 0 is covered by NOP |
| 206 | MSR_imm .... 0011 0010 .... 1111 .... .... .... @msr_i r=0 |
| 207 | } |
| 208 | MSR_imm .... 0011 0110 .... 1111 .... .... .... @msr_i r=1 |
| 209 | |
| 210 | # Cyclic Redundancy Check |
| 211 | |
| 212 | CRC32B .... 0001 0000 .... .... 0000 0100 .... @rndm |
| 213 | CRC32H .... 0001 0010 .... .... 0000 0100 .... @rndm |
| 214 | CRC32W .... 0001 0100 .... .... 0000 0100 .... @rndm |
| 215 | CRC32CB .... 0001 0000 .... .... 0010 0100 .... @rndm |
| 216 | CRC32CH .... 0001 0010 .... .... 0010 0100 .... @rndm |
| 217 | CRC32CW .... 0001 0100 .... .... 0010 0100 .... @rndm |
| 218 | |
| 219 | # Miscellaneous instructions |
| 220 | |
| 221 | %sysm 8:1 16:4 |
| 222 | %imm16_8_0 8:12 0:4 |
| 223 | |
| 224 | @rm ---- .... .... .... .... .... .... rm:4 &r |
| 225 | @rdm ---- .... .... .... rd:4 .... .... rm:4 &rr |
| 226 | @i16 ---- .... .... .... .... .... .... .... &i imm=%imm16_8_0 |
| 227 | |
| 228 | MRS_bank ---- 0001 0 r:1 00 .... rd:4 001. 0000 0000 &mrs_bank %sysm |
| 229 | MSR_bank ---- 0001 0 r:1 10 .... 1111 001. 0000 rn:4 &msr_bank %sysm |
| 230 | |
| 231 | MRS_reg ---- 0001 0 r:1 00 1111 rd:4 0000 0000 0000 &mrs_reg |
| 232 | MSR_reg ---- 0001 0 r:1 10 mask:4 1111 0000 0000 rn:4 &msr_reg |
| 233 | |
| 234 | BX .... 0001 0010 1111 1111 1111 0001 .... @rm |
| 235 | BXJ .... 0001 0010 1111 1111 1111 0010 .... @rm |
| 236 | BLX_r .... 0001 0010 1111 1111 1111 0011 .... @rm |
| 237 | |
| 238 | CLZ .... 0001 0110 1111 .... 1111 0001 .... @rdm |
| 239 | |
| 240 | ERET ---- 0001 0110 0000 0000 0000 0110 1110 |
| 241 | |
| 242 | HLT .... 0001 0000 .... .... .... 0111 .... @i16 |
| 243 | BKPT .... 0001 0010 .... .... .... 0111 .... @i16 |
| 244 | HVC .... 0001 0100 .... .... .... 0111 .... @i16 |
| 245 | SMC ---- 0001 0110 0000 0000 0000 0111 imm:4 &i |
| 246 | |
| 247 | # Load/Store Dual, Half, Signed Byte (register) |
| 248 | |
| 249 | @ldst_rr_p1w ---- ...1 u:1 . w:1 . rn:4 rt:4 .... .... rm:4 \ |
| 250 | &ldst_rr p=1 shimm=0 shtype=0 |
| 251 | @ldst_rr_pw0 ---- ...0 u:1 . 0 . rn:4 rt:4 .... .... rm:4 \ |
| 252 | &ldst_rr p=0 w=0 shimm=0 shtype=0 |
| 253 | |
| 254 | STRH_rr .... 000. .0.0 .... .... 0000 1011 .... @ldst_rr_pw0 |
| 255 | STRH_rr .... 000. .0.0 .... .... 0000 1011 .... @ldst_rr_p1w |
| 256 | |
| 257 | LDRD_rr .... 000. .0.0 .... .... 0000 1101 .... @ldst_rr_pw0 |
| 258 | LDRD_rr .... 000. .0.0 .... .... 0000 1101 .... @ldst_rr_p1w |
| 259 | |
| 260 | STRD_rr .... 000. .0.0 .... .... 0000 1111 .... @ldst_rr_pw0 |
| 261 | STRD_rr .... 000. .0.0 .... .... 0000 1111 .... @ldst_rr_p1w |
| 262 | |
| 263 | LDRH_rr .... 000. .0.1 .... .... 0000 1011 .... @ldst_rr_pw0 |
| 264 | LDRH_rr .... 000. .0.1 .... .... 0000 1011 .... @ldst_rr_p1w |
| 265 | |
| 266 | LDRSB_rr .... 000. .0.1 .... .... 0000 1101 .... @ldst_rr_pw0 |
| 267 | LDRSB_rr .... 000. .0.1 .... .... 0000 1101 .... @ldst_rr_p1w |
| 268 | |
| 269 | LDRSH_rr .... 000. .0.1 .... .... 0000 1111 .... @ldst_rr_pw0 |
| 270 | LDRSH_rr .... 000. .0.1 .... .... 0000 1111 .... @ldst_rr_p1w |
| 271 | |
| 272 | # Note the unpriv load/stores use the previously invalid P=0, W=1 encoding, |
| 273 | # and act as normal post-indexed (P=0, W=0). |
| 274 | @ldst_rr_p0w1 ---- ...0 u:1 . 1 . rn:4 rt:4 .... .... rm:4 \ |
| 275 | &ldst_rr p=0 w=0 shimm=0 shtype=0 |
| 276 | |
| 277 | STRHT_rr .... 000. .0.0 .... .... 0000 1011 .... @ldst_rr_p0w1 |
| 278 | LDRHT_rr .... 000. .0.1 .... .... 0000 1011 .... @ldst_rr_p0w1 |
| 279 | LDRSBT_rr .... 000. .0.1 .... .... 0000 1101 .... @ldst_rr_p0w1 |
| 280 | LDRSHT_rr .... 000. .0.1 .... .... 0000 1111 .... @ldst_rr_p0w1 |
| 281 | |
| 282 | # Load/Store word and unsigned byte (register) |
| 283 | |
| 284 | @ldst_rs_p1w ---- ...1 u:1 . w:1 . rn:4 rt:4 shimm:5 shtype:2 . rm:4 \ |
| 285 | &ldst_rr p=1 |
| 286 | @ldst_rs_pw0 ---- ...0 u:1 . 0 . rn:4 rt:4 shimm:5 shtype:2 . rm:4 \ |
| 287 | &ldst_rr p=0 w=0 |
| 288 | |
| 289 | STR_rr .... 011. .0.0 .... .... .... ...0 .... @ldst_rs_pw0 |
| 290 | STR_rr .... 011. .0.0 .... .... .... ...0 .... @ldst_rs_p1w |
| 291 | STRB_rr .... 011. .1.0 .... .... .... ...0 .... @ldst_rs_pw0 |
| 292 | STRB_rr .... 011. .1.0 .... .... .... ...0 .... @ldst_rs_p1w |
| 293 | |
| 294 | LDR_rr .... 011. .0.1 .... .... .... ...0 .... @ldst_rs_pw0 |
| 295 | LDR_rr .... 011. .0.1 .... .... .... ...0 .... @ldst_rs_p1w |
| 296 | LDRB_rr .... 011. .1.1 .... .... .... ...0 .... @ldst_rs_pw0 |
| 297 | LDRB_rr .... 011. .1.1 .... .... .... ...0 .... @ldst_rs_p1w |
| 298 | |
| 299 | @ldst_rs_p0w1 ---- ...0 u:1 . 1 . rn:4 rt:4 shimm:5 shtype:2 . rm:4 \ |
| 300 | &ldst_rr p=0 w=0 |
| 301 | |
| 302 | STRT_rr .... 011. .0.0 .... .... .... ...0 .... @ldst_rs_p0w1 |
| 303 | STRBT_rr .... 011. .1.0 .... .... .... ...0 .... @ldst_rs_p0w1 |
| 304 | LDRT_rr .... 011. .0.1 .... .... .... ...0 .... @ldst_rs_p0w1 |
| 305 | LDRBT_rr .... 011. .1.1 .... .... .... ...0 .... @ldst_rs_p0w1 |
| 306 | |
| 307 | # Load/Store Dual, Half, Signed Byte (immediate) |
| 308 | |
| 309 | %imm8s_8_0 8:4 0:4 |
| 310 | @ldst_ri8_p1w ---- ...1 u:1 . w:1 . rn:4 rt:4 .... .... .... \ |
| 311 | &ldst_ri imm=%imm8s_8_0 p=1 |
| 312 | @ldst_ri8_pw0 ---- ...0 u:1 . 0 . rn:4 rt:4 .... .... .... \ |
| 313 | &ldst_ri imm=%imm8s_8_0 p=0 w=0 |
| 314 | |
| 315 | STRH_ri .... 000. .1.0 .... .... .... 1011 .... @ldst_ri8_pw0 |
| 316 | STRH_ri .... 000. .1.0 .... .... .... 1011 .... @ldst_ri8_p1w |
| 317 | |
| 318 | LDRD_ri_a32 .... 000. .1.0 .... .... .... 1101 .... @ldst_ri8_pw0 |
| 319 | LDRD_ri_a32 .... 000. .1.0 .... .... .... 1101 .... @ldst_ri8_p1w |
| 320 | |
| 321 | STRD_ri_a32 .... 000. .1.0 .... .... .... 1111 .... @ldst_ri8_pw0 |
| 322 | STRD_ri_a32 .... 000. .1.0 .... .... .... 1111 .... @ldst_ri8_p1w |
| 323 | |
| 324 | LDRH_ri .... 000. .1.1 .... .... .... 1011 .... @ldst_ri8_pw0 |
| 325 | LDRH_ri .... 000. .1.1 .... .... .... 1011 .... @ldst_ri8_p1w |
| 326 | |
| 327 | LDRSB_ri .... 000. .1.1 .... .... .... 1101 .... @ldst_ri8_pw0 |
| 328 | LDRSB_ri .... 000. .1.1 .... .... .... 1101 .... @ldst_ri8_p1w |
| 329 | |
| 330 | LDRSH_ri .... 000. .1.1 .... .... .... 1111 .... @ldst_ri8_pw0 |
| 331 | LDRSH_ri .... 000. .1.1 .... .... .... 1111 .... @ldst_ri8_p1w |
| 332 | |
| 333 | # Note the unpriv load/stores use the previously invalid P=0, W=1 encoding, |
| 334 | # and act as normal post-indexed (P=0, W=0). |
| 335 | @ldst_ri8_p0w1 ---- ...0 u:1 . 1 . rn:4 rt:4 .... .... .... \ |
| 336 | &ldst_ri imm=%imm8s_8_0 p=0 w=0 |
| 337 | |
| 338 | STRHT_ri .... 000. .1.0 .... .... .... 1011 .... @ldst_ri8_p0w1 |
| 339 | LDRHT_ri .... 000. .1.1 .... .... .... 1011 .... @ldst_ri8_p0w1 |
| 340 | LDRSBT_ri .... 000. .1.1 .... .... .... 1101 .... @ldst_ri8_p0w1 |
| 341 | LDRSHT_ri .... 000. .1.1 .... .... .... 1111 .... @ldst_ri8_p0w1 |
| 342 | |
| 343 | # Load/Store word and unsigned byte (immediate) |
| 344 | |
| 345 | @ldst_ri12_p1w ---- ...1 u:1 . w:1 . rn:4 rt:4 imm:12 &ldst_ri p=1 |
| 346 | @ldst_ri12_pw0 ---- ...0 u:1 . 0 . rn:4 rt:4 imm:12 &ldst_ri p=0 w=0 |
| 347 | |
| 348 | STR_ri .... 010. .0.0 .... .... ............ @ldst_ri12_p1w |
| 349 | STR_ri .... 010. .0.0 .... .... ............ @ldst_ri12_pw0 |
| 350 | STRB_ri .... 010. .1.0 .... .... ............ @ldst_ri12_p1w |
| 351 | STRB_ri .... 010. .1.0 .... .... ............ @ldst_ri12_pw0 |
| 352 | |
| 353 | LDR_ri .... 010. .0.1 .... .... ............ @ldst_ri12_p1w |
| 354 | LDR_ri .... 010. .0.1 .... .... ............ @ldst_ri12_pw0 |
| 355 | LDRB_ri .... 010. .1.1 .... .... ............ @ldst_ri12_p1w |
| 356 | LDRB_ri .... 010. .1.1 .... .... ............ @ldst_ri12_pw0 |
| 357 | |
| 358 | @ldst_ri12_p0w1 ---- ...0 u:1 . 1 . rn:4 rt:4 imm:12 &ldst_ri p=0 w=0 |
| 359 | |
| 360 | STRT_ri .... 010. .0.0 .... .... ............ @ldst_ri12_p0w1 |
| 361 | STRBT_ri .... 010. .1.0 .... .... ............ @ldst_ri12_p0w1 |
| 362 | LDRT_ri .... 010. .0.1 .... .... ............ @ldst_ri12_p0w1 |
| 363 | LDRBT_ri .... 010. .1.1 .... .... ............ @ldst_ri12_p0w1 |
| 364 | |
| 365 | # Synchronization primitives |
| 366 | |
| 367 | @swp ---- .... .... rn:4 rt:4 .... .... rt2:4 |
| 368 | |
| 369 | SWP .... 0001 0000 .... .... 0000 1001 .... @swp |
| 370 | SWPB .... 0001 0100 .... .... 0000 1001 .... @swp |
| 371 | |
| 372 | # Load/Store Exclusive and Load-Acquire/Store-Release |
| 373 | # |
| 374 | # Note rt2 for STREXD/LDREXD is set by the helper after checking rt is even. |
| 375 | |
| 376 | @strex ---- .... .... rn:4 rd:4 .... .... rt:4 \ |
| 377 | &strex imm=0 rt2=15 |
| 378 | @ldrex ---- .... .... rn:4 rt:4 .... .... .... \ |
| 379 | &ldrex imm=0 rt2=15 |
| 380 | @stl ---- .... .... rn:4 .... .... .... rt:4 \ |
| 381 | &ldrex imm=0 rt2=15 |
| 382 | |
| 383 | STREX .... 0001 1000 .... .... 1111 1001 .... @strex |
| 384 | STREXD_a32 .... 0001 1010 .... .... 1111 1001 .... @strex |
| 385 | STREXB .... 0001 1100 .... .... 1111 1001 .... @strex |
| 386 | STREXH .... 0001 1110 .... .... 1111 1001 .... @strex |
| 387 | |
| 388 | STLEX .... 0001 1000 .... .... 1110 1001 .... @strex |
| 389 | STLEXD_a32 .... 0001 1010 .... .... 1110 1001 .... @strex |
| 390 | STLEXB .... 0001 1100 .... .... 1110 1001 .... @strex |
| 391 | STLEXH .... 0001 1110 .... .... 1110 1001 .... @strex |
| 392 | |
| 393 | STL .... 0001 1000 .... 1111 1100 1001 .... @stl |
| 394 | STLB .... 0001 1100 .... 1111 1100 1001 .... @stl |
| 395 | STLH .... 0001 1110 .... 1111 1100 1001 .... @stl |
| 396 | |
| 397 | LDREX .... 0001 1001 .... .... 1111 1001 1111 @ldrex |
| 398 | LDREXD_a32 .... 0001 1011 .... .... 1111 1001 1111 @ldrex |
| 399 | LDREXB .... 0001 1101 .... .... 1111 1001 1111 @ldrex |
| 400 | LDREXH .... 0001 1111 .... .... 1111 1001 1111 @ldrex |
| 401 | |
| 402 | LDAEX .... 0001 1001 .... .... 1110 1001 1111 @ldrex |
| 403 | LDAEXD_a32 .... 0001 1011 .... .... 1110 1001 1111 @ldrex |
| 404 | LDAEXB .... 0001 1101 .... .... 1110 1001 1111 @ldrex |
| 405 | LDAEXH .... 0001 1111 .... .... 1110 1001 1111 @ldrex |
| 406 | |
| 407 | LDA .... 0001 1001 .... .... 1100 1001 1111 @ldrex |
| 408 | LDAB .... 0001 1101 .... .... 1100 1001 1111 @ldrex |
| 409 | LDAH .... 0001 1111 .... .... 1100 1001 1111 @ldrex |
| 410 | |
| 411 | # Media instructions |
| 412 | |
| 413 | # usad8 is usada8 w/ ra=15 |
| 414 | USADA8 ---- 0111 1000 rd:4 ra:4 rm:4 0001 rn:4 |
| 415 | |
| 416 | # ubfx and sbfx |
| 417 | @bfx ---- .... ... widthm1:5 rd:4 lsb:5 ... rn:4 &bfx |
| 418 | |
| 419 | SBFX .... 0111 101 ..... .... ..... 101 .... @bfx |
| 420 | UBFX .... 0111 111 ..... .... ..... 101 .... @bfx |
| 421 | |
| 422 | # bfc is bfi w/ rn=15 |
| 423 | BFCI ---- 0111 110 msb:5 rd:4 lsb:5 001 rn:4 &bfi |
| 424 | |
| 425 | # While we could get UDEF by not including this, add the pattern for |
| 426 | # documentation and to conflict with any other typos in this file. |
| 427 | UDF 1110 0111 1111 ---- ---- ---- 1111 ---- |
| 428 | |
| 429 | # Parallel addition and subtraction |
| 430 | |
| 431 | SADD16 .... 0110 0001 .... .... 1111 0001 .... @rndm |
| 432 | SASX .... 0110 0001 .... .... 1111 0011 .... @rndm |
| 433 | SSAX .... 0110 0001 .... .... 1111 0101 .... @rndm |
| 434 | SSUB16 .... 0110 0001 .... .... 1111 0111 .... @rndm |
| 435 | SADD8 .... 0110 0001 .... .... 1111 1001 .... @rndm |
| 436 | SSUB8 .... 0110 0001 .... .... 1111 1111 .... @rndm |
| 437 | |
| 438 | QADD16 .... 0110 0010 .... .... 1111 0001 .... @rndm |
| 439 | QASX .... 0110 0010 .... .... 1111 0011 .... @rndm |
| 440 | QSAX .... 0110 0010 .... .... 1111 0101 .... @rndm |
| 441 | QSUB16 .... 0110 0010 .... .... 1111 0111 .... @rndm |
| 442 | QADD8 .... 0110 0010 .... .... 1111 1001 .... @rndm |
| 443 | QSUB8 .... 0110 0010 .... .... 1111 1111 .... @rndm |
| 444 | |
| 445 | SHADD16 .... 0110 0011 .... .... 1111 0001 .... @rndm |
| 446 | SHASX .... 0110 0011 .... .... 1111 0011 .... @rndm |
| 447 | SHSAX .... 0110 0011 .... .... 1111 0101 .... @rndm |
| 448 | SHSUB16 .... 0110 0011 .... .... 1111 0111 .... @rndm |
| 449 | SHADD8 .... 0110 0011 .... .... 1111 1001 .... @rndm |
| 450 | SHSUB8 .... 0110 0011 .... .... 1111 1111 .... @rndm |
| 451 | |
| 452 | UADD16 .... 0110 0101 .... .... 1111 0001 .... @rndm |
| 453 | UASX .... 0110 0101 .... .... 1111 0011 .... @rndm |
| 454 | USAX .... 0110 0101 .... .... 1111 0101 .... @rndm |
| 455 | USUB16 .... 0110 0101 .... .... 1111 0111 .... @rndm |
| 456 | UADD8 .... 0110 0101 .... .... 1111 1001 .... @rndm |
| 457 | USUB8 .... 0110 0101 .... .... 1111 1111 .... @rndm |
| 458 | |
| 459 | UQADD16 .... 0110 0110 .... .... 1111 0001 .... @rndm |
| 460 | UQASX .... 0110 0110 .... .... 1111 0011 .... @rndm |
| 461 | UQSAX .... 0110 0110 .... .... 1111 0101 .... @rndm |
| 462 | UQSUB16 .... 0110 0110 .... .... 1111 0111 .... @rndm |
| 463 | UQADD8 .... 0110 0110 .... .... 1111 1001 .... @rndm |
| 464 | UQSUB8 .... 0110 0110 .... .... 1111 1111 .... @rndm |
| 465 | |
| 466 | UHADD16 .... 0110 0111 .... .... 1111 0001 .... @rndm |
| 467 | UHASX .... 0110 0111 .... .... 1111 0011 .... @rndm |
| 468 | UHSAX .... 0110 0111 .... .... 1111 0101 .... @rndm |
| 469 | UHSUB16 .... 0110 0111 .... .... 1111 0111 .... @rndm |
| 470 | UHADD8 .... 0110 0111 .... .... 1111 1001 .... @rndm |
| 471 | UHSUB8 .... 0110 0111 .... .... 1111 1111 .... @rndm |
| 472 | |
| 473 | # Packing, unpacking, saturation, and reversal |
| 474 | |
| 475 | PKH ---- 0110 1000 rn:4 rd:4 imm:5 tb:1 01 rm:4 &pkh |
| 476 | |
| 477 | @sat ---- .... ... satimm:5 rd:4 imm:5 sh:1 .. rn:4 &sat |
| 478 | @sat16 ---- .... .... satimm:4 rd:4 .... .... rn:4 \ |
| 479 | &sat imm=0 sh=0 |
| 480 | |
| 481 | SSAT .... 0110 101. .... .... .... ..01 .... @sat |
| 482 | USAT .... 0110 111. .... .... .... ..01 .... @sat |
| 483 | |
| 484 | SSAT16 .... 0110 1010 .... .... 1111 0011 .... @sat16 |
| 485 | USAT16 .... 0110 1110 .... .... 1111 0011 .... @sat16 |
| 486 | |
| 487 | @rrr_rot ---- .... .... rn:4 rd:4 rot:2 ...... rm:4 &rrr_rot |
| 488 | |
| 489 | SXTAB16 .... 0110 1000 .... .... ..00 0111 .... @rrr_rot |
| 490 | SXTAB .... 0110 1010 .... .... ..00 0111 .... @rrr_rot |
| 491 | SXTAH .... 0110 1011 .... .... ..00 0111 .... @rrr_rot |
| 492 | UXTAB16 .... 0110 1100 .... .... ..00 0111 .... @rrr_rot |
| 493 | UXTAB .... 0110 1110 .... .... ..00 0111 .... @rrr_rot |
| 494 | UXTAH .... 0110 1111 .... .... ..00 0111 .... @rrr_rot |
| 495 | |
| 496 | SEL .... 0110 1000 .... .... 1111 1011 .... @rndm |
| 497 | REV .... 0110 1011 1111 .... 1111 0011 .... @rdm |
| 498 | REV16 .... 0110 1011 1111 .... 1111 1011 .... @rdm |
| 499 | REVSH .... 0110 1111 1111 .... 1111 1011 .... @rdm |
| 500 | RBIT .... 0110 1111 1111 .... 1111 0011 .... @rdm |
| 501 | |
| 502 | # Signed multiply, signed and unsigned divide |
| 503 | |
| 504 | @rdmn ---- .... .... rd:4 .... rm:4 .... rn:4 &rrr |
| 505 | |
| 506 | SMLAD .... 0111 0000 .... .... .... 0001 .... @rdamn |
| 507 | SMLADX .... 0111 0000 .... .... .... 0011 .... @rdamn |
| 508 | SMLSD .... 0111 0000 .... .... .... 0101 .... @rdamn |
| 509 | SMLSDX .... 0111 0000 .... .... .... 0111 .... @rdamn |
| 510 | |
| 511 | SDIV .... 0111 0001 .... 1111 .... 0001 .... @rdmn |
| 512 | UDIV .... 0111 0011 .... 1111 .... 0001 .... @rdmn |
| 513 | |
| 514 | SMLALD .... 0111 0100 .... .... .... 0001 .... @rdamn |
| 515 | SMLALDX .... 0111 0100 .... .... .... 0011 .... @rdamn |
| 516 | SMLSLD .... 0111 0100 .... .... .... 0101 .... @rdamn |
| 517 | SMLSLDX .... 0111 0100 .... .... .... 0111 .... @rdamn |
| 518 | |
| 519 | SMMLA .... 0111 0101 .... .... .... 0001 .... @rdamn |
| 520 | SMMLAR .... 0111 0101 .... .... .... 0011 .... @rdamn |
| 521 | SMMLS .... 0111 0101 .... .... .... 1101 .... @rdamn |
| 522 | SMMLSR .... 0111 0101 .... .... .... 1111 .... @rdamn |
| 523 | |
| 524 | # Block data transfer |
| 525 | |
| 526 | STM ---- 100 b:1 i:1 u:1 w:1 0 rn:4 list:16 &ldst_block |
| 527 | LDM_a32 ---- 100 b:1 i:1 u:1 w:1 1 rn:4 list:16 &ldst_block |
| 528 | |
| 529 | # Branch, branch with link |
| 530 | |
| 531 | %imm26 0:s24 !function=times_4 |
| 532 | @branch ---- .... ........................ &i imm=%imm26 |
| 533 | |
| 534 | B .... 1010 ........................ @branch |
| 535 | BL .... 1011 ........................ @branch |
| 536 | |
| 537 | # Coprocessor instructions |
| 538 | |
| 539 | # We decode MCR, MCR, MRRC and MCRR only, because for QEMU the |
| 540 | # other coprocessor instructions always UNDEF. |
| 541 | # The trans_ functions for these will ignore cp values 8..13 for v7 or |
| 542 | # earlier, and 0..13 for v8 and later, because those areas of the |
| 543 | # encoding space may be used for other things, such as VFP or Neon. |
| 544 | |
| 545 | @mcr ---- .... opc1:3 . crn:4 rt:4 cp:4 opc2:3 . crm:4 &mcr |
| 546 | @mcrr ---- .... .... rt2:4 rt:4 cp:4 opc1:4 crm:4 &mcrr |
| 547 | |
| 548 | MCRR .... 1100 0100 .... .... .... .... .... @mcrr |
| 549 | MRRC .... 1100 0101 .... .... .... .... .... @mcrr |
| 550 | |
| 551 | MCR .... 1110 ... 0 .... .... .... ... 1 .... @mcr |
| 552 | MRC .... 1110 ... 1 .... .... .... ... 1 .... @mcr |
| 553 | |
| 554 | # Supervisor call |
| 555 | |
| 556 | SVC ---- 1111 imm:24 &i |