| OLD | NEW |
| (Empty) | |
| 1 # ARMv7 Instruction Encodings |
| 2 # |
| 3 # This table is derived from the "ARM Architecture Reference Manual, ARMv7-A |
| 4 # and ARMv7-R edition" and is used here with the permission of ARM Limited. |
| 5 # Reproduction for purposes other than the development and distribution of |
| 6 # Native Client may require the explicit permission of ARM Limited. |
| 7 |
| 8 # This file defines the Native Client "instruction classes" assigned to every |
| 9 # possible ARMv7 instruction encoding. It is organized into a series of tables, |
| 10 # and directly parallels the ARM Architecture Reference Manual cited above. |
| 11 # |
| 12 # Each table consists of |
| 13 # - A name, |
| 14 # - A citation in the Architecture Reference Manual, |
| 15 # - One or more columns defining bitfields to match, and |
| 16 # - One or more rows describing patterns in those bitfields. |
| 17 # |
| 18 # A leading tilde (~) negates a pattern. A hyphen (-) is short for a string of |
| 19 # don't-care bits (x). A double-quote (") indicates that a pattern is the same |
| 20 # as the row above it. |
| 21 # |
| 22 # Each row may specify a terminal instruction class ("=InstClass"), or forward |
| 23 # the reader to a different table ("->table_name"). |
| 24 # |
| 25 # If an encoding is not valid in every ARM architecture rev, the instruction |
| 26 # class may indicate the rev or feature that makes the encoding valid in |
| 27 # parentheses. |
| 28 # |
| 29 # This table is for the decoding of Thumb mode instructions. |
| 30 |
| 31 -- ARMv7_Thumb (See Section A6.1) |
| 32 bittage(15:11) |
| 33 11101 ->thumb32 #(v6T2) |
| 34 11110 " |
| 35 11111 " |
| 36 - ->thumb16 |
| 37 |
| 38 -- thumb16 (See Section A6.2) |
| 39 opcode(15:10) |
| 40 00xxxx ->dp_shifted_imm |
| 41 010000 ->dp |
| 42 010001 ->special_and_bx |
| 43 01001x =LDRLitT1(v4T) # LDR (literal) T1 A8-122 |
| 44 0101xx ->ldst_single |
| 45 011xxx " |
| 46 100xxx " |
| 47 10100x =ADRT1(v4T) # ADR T1 A8-32 |
| 48 10101x =SPMod(v4T) # ADD (SP plus immediate) T1 A8-28 |
| 49 1011xx ->misc16 |
| 50 11000x =STMT1(v4T) # STM* T1 A8-374 |
| 51 11001x =LDMT1(v4T) # LDM* T1 A8-110 |
| 52 1101xx ->cond_br_and_svc |
| 53 11100x =BranchT2(v4T) # B T2 A8-44 |
| 54 |
| 55 -- dp_shifted_imm (See Section A6.2.1) |
| 56 opcode(13:9) |
| 57 000xx =Def3 # LSL (immediate) T1 A8-178 |
| 58 001xx =Def3 # LSR (immediate) T1 A8-182 |
| 59 010xx =Def3 # ASR (immediate) T1 A8-40 |
| 60 01100 =Def3 # ADD (register) T1 A8-24 |
| 61 01101 =Def3 # SUB (register) T1 A8-422 |
| 62 01110 =Def3 # ADD (immediate, 3-bit) T1 A8-20 |
| 63 01111 =Def3 # SUB (immediate, 3-bit) T1 A8-418 |
| 64 100xx =Def8_10 # MOV (immediate) T1 A8-194 |
| 65 101xx =Cmp # CMP (immediate) T1 A8-80 |
| 66 110xx =Def8_10 # ADD (immediate, 8-bit) T2 A8-20 |
| 67 111xx =Def8_10 # SUB (immediate, 8-bit) T2 A8-418 |
| 68 |
| 69 -- dp (See Section A6.2.2) |
| 70 opcode(9:6) |
| 71 0000 =Mask3 # AND (register) T1 A8-36 |
| 72 0001 =Def3 # EOR (register) T1 A8-96 |
| 73 0010 =Def3 # LSL (register) T1 A8-180 |
| 74 0011 =Def3 # LSR (register) T1 A8-184 |
| 75 0100 =Def3 # ASR (register) T1 A8-42 |
| 76 0101 =Def3 # ADC (register) T1 A8-16 |
| 77 0110 =Def3 # SBC (register) T1 A8-304 |
| 78 0111 =Def3 # ROR (register) T1 A8-280 |
| 79 1000 =Cmp # TST (register) T1 A8-456 |
| 80 1001 =Def3 # RSB (immediate) T1 A8-284 |
| 81 1010 =Cmp # CMP (high register) T1 A8-82 |
| 82 1011 =Cmp # CMN (register) T1 A8-76 |
| 83 1100 =OrMask3 # ORR (register) T1 A8-230 |
| 84 1101 =Def3 # MUL T1 A8-212 |
| 85 1110 =BiC3 # BIC (register) T1 A8-52 |
| 86 1111 =Def3 # MVN T1 A8-216 |
| 87 |
| 88 -- special_and_bx (See Section A6.2.3) |
| 89 opcode(9:6) safety(2:0) |
| 90 0000 - =Def3(v6T2) # ADD (low register) T2 A8-24 |
| 91 0001 - =Def3(v4T) # ADD (high register) T2 A8-24 |
| 92 001x - " |
| 93 0100 - =Unpredictable |
| 94 0101 - =Cmp(v4T) # CMP (high register) T2 A8-82 |
| 95 011x - " |
| 96 1000 - =MovT(v6) # MOV (low register) T1 A8-196 |
| 97 1001 - =MovT(v4T) # MOV (high register) T1 A8-196 |
| 98 101x - " |
| 99 110x - =BXT(v4T) # BX T1 A8-62 |
| 100 111x 000 =BLXT(v5T) # BLX (register) T1 A8-60 |
| 101 |
| 102 -- ldst_single (See Section A6.2.4) |
| 103 opA(15:12) opB(11:9) |
| 104 0101 000 =MemOpThumbStore # STR (register) |
| 105 " 001 " # STRH (register) |
| 106 " 010 " # STRB (register) |
| 107 " 011 =MemOpThumbLoad # LDRSB (register) |
| 108 " 100 " # LDR (register) |
| 109 " 101 " # LDRH (register) |
| 110 " 110 " # LDRB (register) |
| 111 " 111 " # LDRSH (register) |
| 112 0110 0xx =MemOpThumbStore # STR (immediate) |
| 113 0111 " " # STRB (immediate) |
| 114 1000 " " # STRH (immediate) |
| 115 0110 1xx =MemOpThumbLoad # LDR (immediate) |
| 116 0111 " " # LDRB (immediate) |
| 117 1000 " " # LDRH (immediate) |
| 118 1001 0xx =MemOpSPThumbStore # STR (immediate, SP Relative) |
| 119 1001 1xx =MemOpSPThumbLoad # LDR (immediate, SP Relative) |
| 120 |
| 121 -- misc16 (See Section A6.2.5) |
| 122 opcode(11:5) |
| 123 0110010 =Forbidden(v6) # SETEND |
| 124 0110011 =Forbidden(v6) # CPS |
| 125 00000xx =SPMod(v4T) # ADD (SP plus immediate) |
| 126 00001xx =SPMod(v4T) # SUB (SP minus immediate) |
| 127 0001xxx =CmpBrZ(v6T2) # CBNZ, CBZ |
| 128 0011xxx " |
| 129 1001xxx " |
| 130 1011xxx " |
| 131 001000x =Def3(v6) # SXTH |
| 132 001001x " # SXTB |
| 133 001010x " # UXTH |
| 134 001011x " # UXTB |
| 135 101000x " # REV |
| 136 101001x " # REV16 |
| 137 101011x " # REVSH |
| 138 010xxxx =PushMult(v4T) # PUSH |
| 139 110xxxx =PopMult(v4T) # POP |
| 140 1110xxx =ThumbBreakpoint(v5) # BPKT |
| 141 1111xxx ->it_and_hints |
| 142 |
| 143 -- it_and_hints (See Section A6.2.5 subsection) |
| 144 opA(7:4) opB(3:0) |
| 145 - ~0000 =IT(v6T2) # IT |
| 146 0000 0000 =EffectiveNoOp(v6T2) # NOP |
| 147 0001 0000 =Forbidden(v7) # YIELD |
| 148 0010 0000 " # WFE |
| 149 0011 0000 " # WFI |
| 150 0100 0000 " # SEV |
| 151 |
| 152 -- cond_br_and_svc (See Section A6.2.6) |
| 153 opcode(11:8) |
| 154 ~111x =BranchT2 # B |
| 155 1110 =Undefined |
| 156 1111 =Forbidden # SVC/SWI |
| 157 |
| 158 -- thumb32 (See Section A6.3) |
| 159 op1(12:11) op2(10:4) op(31) |
| 160 01 00xx0xx - ->ldstm # (v6T2) |
| 161 " 00xx1xx - ->ldstduex_and_tbr |
| 162 " 01xxxxx - ->dp_shifted_reg |
| 163 " 1xxxxxx - ->coprocessor |
| 164 10 x0xxxxx 0 ->dp_mod_imm |
| 165 " x1xxxxx 0 ->dp_imm |
| 166 " - 1 ->br_misc |
| 167 11 000xxx0 - ->st_single |
| 168 " 001xxx0 - ->asimd |
| 169 " 00xx001 - ->ldb_and_hint |
| 170 " 00xx011 - ->ldh_and_hint |
| 171 " 00xx101 - ->ldw |
| 172 " 00xx111 - =Undefined |
| 173 " 010xxxx - ->dp_reg |
| 174 " 0110xxx - ->math |
| 175 " 0111xxx - ->math2 |
| 176 " 1xxxxxx - ->coprocessor2 |
| 177 |
| 178 -- dp_mod_imm (See Section A6.3.1) |
| 179 op(8:5) Rn(3:0) Rd(27:24) S(4:4) |
| 180 0000 - ~1111 x =DPMImm # AND (immediate) |
| 181 " - 1111 0 =Unpredictable |
| 182 " - 1111 1 =Cmp # TST (immediate) |
| 183 0001 - - - =BicModImmT # BIC (immediate) |
| 184 0010 ~1111 - - =OrrModImmT # ORR (immediate) |
| 185 " 1111 - - =DPMImm # MOV (immediate) |
| 186 0011 ~1111 - - =DPMImm # ORN (immediate) |
| 187 " 1111 - - =DPMImm # MVN (immediate) |
| 188 0100 - ~1111 x =DPMImm # EOR (immediate) |
| 189 " - 1111 0 =Unpredictable |
| 190 " - " 1 =Cmp # TEQ (immediate) |
| 191 1000 - ~1111 x =DPMImm # ADD (immediate) |
| 192 " - 1111 0 =Unpredictable |
| 193 " - " 1 =Cmp # CMN (immediate) |
| 194 1010 - - - =DPMImm # ADC (immediate) |
| 195 1011 - - - =DPMImm # SBC (immediate) |
| 196 1101 - ~1111 - =DPMImm # SUB (immediate) |
| 197 " - 1111 0 =Unpredictable |
| 198 " - " 1 =Cmp # CMP (immediate) |
| 199 1110 - - - =DPMImm # RSB (immediate) |
| 200 |
| 201 -- dp_imm (See Section A6.3.3) |
| 202 op(8:4) Rn(3:0) safety(30:22) |
| 203 00000 ~1111 - =DPMImm # ADD (immediate) |
| 204 " 1111 - =DPMImm # ADR (immediate) |
| 205 00100 - - =DPMImm # MOV (immediate) |
| 206 01010 ~1111 - =DPMImm # SUB (immediate) |
| 207 " 1111 - =DPMImm # ADR (immediate) |
| 208 01100 - - =DPMImm # MOVT (immediate) |
| 209 100x0 - ~000xxxx00 =DPMImm # SSAT (immediate) |
| 210 10010 - 000xxxx00 =DPMImm # SSAT16 (immediate) |
| 211 10100 - - =DPMImm # SBFX (immediate) |
| 212 10110 ~1111 - =DPMImm # BFI |
| 213 " 1111 - =DPMImm # BFC |
| 214 110x0 - ~000xxxx00 =DPMImm # USAT |
| 215 11010 - 000xxxx00 =DPMImm # USAT16 |
| 216 11100 - - =DPMImm # UBFX |
| 217 |
| 218 -- br_misc (See Section A6.3.4-1) |
| 219 op1(30:28) op(10:4) op2(27:24) |
| 220 0x0 ~x111xxx - =BranchT3(v6T2) # B |
| 221 " 0111000 xx00 =Forbidden # MSR (App) |
| 222 " " xx01 =Forbidden # MSR (Sys) |
| 223 " " xx1x " |
| 224 " 0111001 - " |
| 225 " 0111010 - ->cps_and_hints |
| 226 " 0111011 - ->misc_ctl |
| 227 " 0111100 - =Forbidden(v6T2) # BXJ |
| 228 " 0111101 - =Unimplemented(v6T2) # SUBS PC, LR, #const |
| 229 " 011111x - =Forbidden(v6T2) # MRS |
| 230 000 1111111 - =Forbidden # SMC/SMI |
| 231 010 1111111 - =Undefined |
| 232 0x1 - - =BranchT4(v6T2) # B |
| 233 1x0 - - =Forbidden(v5T) # BLX |
| 234 1x1 - - =BLT # BL |
| 235 |
| 236 -- cps_and_hints (See Section A6.3.4-2) |
| 237 op1(26:24) op2(23:16) |
| 238 ~000 - =Forbidden(v6T2) # CPS |
| 239 000 00000000 =EffectiveNoOp(v6T2) # NOP |
| 240 " 00000001 =Forbidden # YIELD |
| 241 " 00000010 " # WFE |
| 242 " 00000011 " # WFI |
| 243 " 00000100 " # SEV |
| 244 " 1111xxxx " # DBG |
| 245 |
| 246 -- misc_ctl (See Section A6.3.4-3) |
| 247 op(23:20) |
| 248 0000 =Forbidden # ENTERX |
| 249 0001 =Forbidden # LEAVEX |
| 250 0010 =EffectiveNoOp(v7) # CLREX |
| 251 0011 " # DSB |
| 252 0101 " # DMB |
| 253 0110 " # ISB |
| 254 |
| 255 -- ldstm (See Section A6.3.5) |
| 256 op(8:7) L(4:4) Rn(3:0) |
| 257 00 0 - =Forbidden # SRS |
| 258 " 1 - =Forbidden # RFE |
| 259 01 0 - =STMTD # STM/IA/EA |
| 260 " 1 ~1101 =LDMTD # LDM/IA/EA |
| 261 " " 1101 =LDMTD # POP |
| 262 10 0 ~1101 =STMTD # STMDB/FD |
| 263 " " 1101 =STMTD # PUSH |
| 264 " 1 - =LDMTD # LDMDB/FD |
| 265 11 0 - =Forbidden # SRS |
| 266 " 1 - =Forbidden # RFE |
| 267 |
| 268 -- ldstduex_and_tbr (See A6.3.6) |
| 269 op1(8:7) op2(5:4) op3(23:20) Rn(3:0) |
| 270 00 00 - - =StrEx # STREX |
| 271 " 01 - - =LdrEx # LDREX |
| 272 0x 10 - - =StrS # STRD |
| 273 1x x0 " " " |
| 274 0x 11 - ~1111 =LdrD # LDRD |
| 275 1x x1 - " " |
| 276 0x 11 - 1111 =Forbidden |
| 277 # I am banning this because it appears to cause a decode loop in the spec |
| 278 # On actual CPUs, this seems to cause an Illegal Instruction exception. |
| 279 1x 01 - 1111 =LdrD # LDRD literal (e.g. constpool) |
| 280 # Note, I have forced a bit here to prevent us from leaving spec land. The spec |
| 281 # is not self consistent. A8.6.67 contradicts this line in the table, and I'm |
| 282 # trusting it, as it was a marked up change |
| 283 01 00 0100 - =StrEx # STREXB |
| 284 " " 0101 - " # STREXH |
| 285 " " 0111 - =StrExD # STREXD |
| 286 " 01 0000 - =Forbidden # TBB # Bundle size needs to be |
| 287 " " 0001 - " # TBH # at least 18 to implement |
| 288 # or we need masking logic |
| 289 " " 0100 - =LdrEx # LDREXB |
| 290 " " 0101 - " # LDREXH |
| 291 " " 0111 - =LdrExD # LDREXD |
| 292 |
| 293 -- ldw (A6.3.7) |
| 294 op1(8:7) op2(27:22) Rn(3:0) |
| 295 01 - ~1111 =LDRImmT3 # LDR |
| 296 00 1xx1xx " =LDRImmT4 |
| 297 " 1100xx " " |
| 298 " 1110xx " " # LDRT |
| 299 " 000000 " " # LDR |
| 300 0x - 1111 =Def31_18 # LDR |
| 301 |
| 302 -- ldh_and_hint (A6.3.8) |
| 303 op1(8:7) op2(27:22) Rn(3:0) Rt(31:28) |
| 304 0x - 1111 ~1111 =LDRImmT3 # LDRH |
| 305 01 - ~1111 1111 " |
| 306 00 1xx1xx ~1111 ~1111 =LDRImmT4 |
| 307 " 1100xx " " =LDRImmT3 |
| 308 " 1110xx " " " # LDRHT |
| 309 " 000000 " " " # LDRH |
| 310 1x - 1111 ~1111 " # LDRSH |
| 311 11 - ~1111 1111 " |
| 312 10 1xx1xx ~1111 ~1111 =LDRImmT4 |
| 313 " 1100xx " " =LDRImmT3 |
| 314 " 1110xx " " " # LDRSHT |
| 315 " 000000 " " " # LDRSH |
| 316 0x - 1111 1111 =Unpredictable |
| 317 01 - ~1111 1111 =EffectiveNoOp # PLD/PLDW |
| 318 00 1100xx ~1111 1111 " |
| 319 " 000000 ~1111 1111 " |
| 320 00 1xx1xx ~1111 1111 =Unpredictable |
| 321 " 1110xx ~1111 1111 " |
| 322 1x - 1111 1111 =EffectiveNoOp # Unallocated hint |
| 323 10 1100xx ~1111 1111 " |
| 324 " 000000 ~1111 1111 " |
| 325 " 1xx1xx " " =Unpredictable |
| 326 " 1110xx " " " |
| 327 11 - " " =EffectiveNoOp # Unallocated hint |
| 328 |
| 329 -- ldb_and_hint (A.6.3.9) |
| 330 op1(8:7) op2(27:22) Rn(3:0) Rt(31:28) |
| 331 0x - 1111 ~1111 =LDRImmT3 # LDRB |
| 332 01 - ~1111 1111 " |
| 333 00 1xx1xx ~1111 ~1111 =LDRImmT4 |
| 334 " 1100xx " " =LDRImmT3 |
| 335 " 1110xx " " " # LDRBT |
| 336 " 000000 " " " # LDRB |
| 337 1x - 1111 ~1111 " # LDRSB |
| 338 11 - ~1111 1111 " |
| 339 10 1xx1xx ~1111 ~1111 =LDRImmT4 |
| 340 " 1100xx " " =LDRImmT3 |
| 341 " 1110xx " " " # LDRSBT |
| 342 " 000000 " " " # LDRSB |
| 343 0x - 1111 1111 =EffectiveNoOp # PLD |
| 344 01 - ~1111 1111 =EffectiveNoOp # PLD/PLDW |
| 345 00 1100xx ~1111 1111 " |
| 346 " 000000 ~1111 1111 " |
| 347 00 1xx1xx ~1111 1111 =Unpredictable |
| 348 " 1110xx ~1111 1111 " |
| 349 1x - 1111 1111 =EffectiveNoOp # PLI |
| 350 11 - " " " |
| 351 10 1100xx ~1111 1111 " |
| 352 " 000000 ~1111 1111 " |
| 353 " 1xx1xx " " =Unpredictable |
| 354 " 1110xx " " " |
| 355 |
| 356 -- st_single (A6.3.10) |
| 357 op1(7:5) op2(27:22) |
| 358 100 - =StrS # STRB |
| 359 000 1xx1xx " |
| 360 " 1100xx " |
| 361 " 1110xx " # STRBT |
| 362 " 0xxxxx " # STRB |
| 363 101 - " # STRH |
| 364 001 1xx1xx " |
| 365 " 1100xx " |
| 366 " 1110xx " # STRHT |
| 367 " 0xxxxx " # STRH |
| 368 110 - " # STR |
| 369 010 1xx1xx " |
| 370 " 1100xx " |
| 371 " 1110xx " # STRT |
| 372 " 0xxxxx " # STR |
| 373 |
| 374 -- dp_shifted_reg (A6.3.11) |
| 375 op(8:5) Rn(3:0) Rd(27:24) S(4:4) |
| 376 0000 - ~1111 x =Def27_24 # AND |
| 377 " " 1111 0 =Unpredictable |
| 378 " " " 1 =Cmp # TST |
| 379 0001 - - - =Def27_24 # BIC |
| 380 0010 ~1111 - - =Def27_24 # ORR |
| 381 " 1111 - - =Def27_24 # MOV |
| 382 0011 ~1111 - - =Def27_24 # ORN |
| 383 " 1111 - - =Def27_24 # MVN |
| 384 0100 ~1111 - - =Def27_24 # EOR |
| 385 " 1111 - 0 =Unpredictable |
| 386 " " - 1 =Cmp # TEQ |
| 387 0110 - - - =Def27_24 # PKH |
| 388 1000 ~1111 - - =Def27_24 # ADD |
| 389 " 1111 - 0 =Unpredictable |
| 390 " " - 1 =Cmp # CMN |
| 391 1010 - - - =Def27_24 # ADC |
| 392 1011 - - - =Def27_24 # SBC |
| 393 1101 ~1111 - - =Def27_24 # SUB |
| 394 " 1111 - 0 =Unpredictable |
| 395 " " - 1 =Cmp # CMP |
| 396 1011 - - - =Def27_24 # RSB |
| 397 |
| 398 |
| 399 -- coprocessor ( ) |
| 400 op(0:0) |
| 401 - =Unimplemented |
| 402 |
| 403 -- asimd ( ) |
| 404 op(0:0) |
| 405 - =Unimplemented |
| 406 |
| 407 -- dp_reg ( ) |
| 408 op(0:0) |
| 409 - =Unimplemented |
| 410 |
| 411 -- math ( ) |
| 412 op(0:0) |
| 413 - =Unimplemented |
| 414 |
| 415 -- math2 ( ) |
| 416 op(0:0) |
| 417 - =Unimplemented |
| 418 |
| 419 -- coprocessor2 ( ) |
| 420 op(0:0) |
| 421 - =Unimplemented |
| OLD | NEW |