1 /* Instruction printing code for the ARM 2 Copyright (C) 1994-2020 Free Software Foundation, Inc. 3 Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org) 4 Modification by James G. Smith (jsmith@cygnus.co.uk) 5 6 This file is part of libopcodes. 7 8 This library is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3 of the License, or 11 (at your option) any later version. 12 13 It is distributed in the hope that it will be useful, but WITHOUT 14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 16 License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program; if not, write to the Free Software 20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 21 MA 02110-1301, USA. */ 22 23 #include "sysdep.h" 24 #include <assert.h> 25 26 #include "disassemble.h" 27 #include "opcode/arm.h" 28 #include "opintl.h" 29 #include "safe-ctype.h" 30 #include "libiberty.h" 31 #include "floatformat.h" 32 33 /* FIXME: This shouldn't be done here. */ 34 #include "coff/internal.h" 35 #include "libcoff.h" 36 #include "bfd.h" 37 #include "elf-bfd.h" 38 #include "elf/internal.h" 39 #include "elf/arm.h" 40 #include "mach-o.h" 41 42 /* FIXME: Belongs in global header. */ 43 #ifndef strneq 44 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0) 45 #endif 46 47 /* Cached mapping symbol state. */ 48 enum map_type 49 { 50 MAP_ARM, 51 MAP_THUMB, 52 MAP_DATA 53 }; 54 55 struct arm_private_data 56 { 57 /* The features to use when disassembling optional instructions. */ 58 arm_feature_set features; 59 60 /* Track the last type (although this doesn't seem to be useful) */ 61 enum map_type last_type; 62 63 /* Tracking symbol table information */ 64 int last_mapping_sym; 65 66 /* The end range of the current range being disassembled. */ 67 bfd_vma last_stop_offset; 68 bfd_vma last_mapping_addr; 69 }; 70 71 enum mve_instructions 72 { 73 MVE_VPST, 74 MVE_VPT_FP_T1, 75 MVE_VPT_FP_T2, 76 MVE_VPT_VEC_T1, 77 MVE_VPT_VEC_T2, 78 MVE_VPT_VEC_T3, 79 MVE_VPT_VEC_T4, 80 MVE_VPT_VEC_T5, 81 MVE_VPT_VEC_T6, 82 MVE_VCMP_FP_T1, 83 MVE_VCMP_FP_T2, 84 MVE_VCMP_VEC_T1, 85 MVE_VCMP_VEC_T2, 86 MVE_VCMP_VEC_T3, 87 MVE_VCMP_VEC_T4, 88 MVE_VCMP_VEC_T5, 89 MVE_VCMP_VEC_T6, 90 MVE_VDUP, 91 MVE_VEOR, 92 MVE_VFMAS_FP_SCALAR, 93 MVE_VFMA_FP_SCALAR, 94 MVE_VFMA_FP, 95 MVE_VFMS_FP, 96 MVE_VHADD_T1, 97 MVE_VHADD_T2, 98 MVE_VHSUB_T1, 99 MVE_VHSUB_T2, 100 MVE_VRHADD, 101 MVE_VLD2, 102 MVE_VLD4, 103 MVE_VST2, 104 MVE_VST4, 105 MVE_VLDRB_T1, 106 MVE_VLDRH_T2, 107 MVE_VLDRB_T5, 108 MVE_VLDRH_T6, 109 MVE_VLDRW_T7, 110 MVE_VSTRB_T1, 111 MVE_VSTRH_T2, 112 MVE_VSTRB_T5, 113 MVE_VSTRH_T6, 114 MVE_VSTRW_T7, 115 MVE_VLDRB_GATHER_T1, 116 MVE_VLDRH_GATHER_T2, 117 MVE_VLDRW_GATHER_T3, 118 MVE_VLDRD_GATHER_T4, 119 MVE_VLDRW_GATHER_T5, 120 MVE_VLDRD_GATHER_T6, 121 MVE_VSTRB_SCATTER_T1, 122 MVE_VSTRH_SCATTER_T2, 123 MVE_VSTRW_SCATTER_T3, 124 MVE_VSTRD_SCATTER_T4, 125 MVE_VSTRW_SCATTER_T5, 126 MVE_VSTRD_SCATTER_T6, 127 MVE_VCVT_FP_FIX_VEC, 128 MVE_VCVT_BETWEEN_FP_INT, 129 MVE_VCVT_FP_HALF_FP, 130 MVE_VCVT_FROM_FP_TO_INT, 131 MVE_VRINT_FP, 132 MVE_VMOV_HFP_TO_GP, 133 MVE_VMOV_GP_TO_VEC_LANE, 134 MVE_VMOV_IMM_TO_VEC, 135 MVE_VMOV_VEC_TO_VEC, 136 MVE_VMOV2_VEC_LANE_TO_GP, 137 MVE_VMOV2_GP_TO_VEC_LANE, 138 MVE_VMOV_VEC_LANE_TO_GP, 139 MVE_VMVN_IMM, 140 MVE_VMVN_REG, 141 MVE_VORR_IMM, 142 MVE_VORR_REG, 143 MVE_VORN, 144 MVE_VBIC_IMM, 145 MVE_VBIC_REG, 146 MVE_VMOVX, 147 MVE_VMOVL, 148 MVE_VMOVN, 149 MVE_VMULL_INT, 150 MVE_VMULL_POLY, 151 MVE_VQDMULL_T1, 152 MVE_VQDMULL_T2, 153 MVE_VQMOVN, 154 MVE_VQMOVUN, 155 MVE_VADDV, 156 MVE_VMLADAV_T1, 157 MVE_VMLADAV_T2, 158 MVE_VMLALDAV, 159 MVE_VMLAS, 160 MVE_VADDLV, 161 MVE_VMLSDAV_T1, 162 MVE_VMLSDAV_T2, 163 MVE_VMLSLDAV, 164 MVE_VRMLALDAVH, 165 MVE_VRMLSLDAVH, 166 MVE_VQDMLADH, 167 MVE_VQRDMLADH, 168 MVE_VQDMLAH, 169 MVE_VQRDMLAH, 170 MVE_VQDMLASH, 171 MVE_VQRDMLASH, 172 MVE_VQDMLSDH, 173 MVE_VQRDMLSDH, 174 MVE_VQDMULH_T1, 175 MVE_VQRDMULH_T2, 176 MVE_VQDMULH_T3, 177 MVE_VQRDMULH_T4, 178 MVE_VDDUP, 179 MVE_VDWDUP, 180 MVE_VIWDUP, 181 MVE_VIDUP, 182 MVE_VCADD_FP, 183 MVE_VCADD_VEC, 184 MVE_VHCADD, 185 MVE_VCMLA_FP, 186 MVE_VCMUL_FP, 187 MVE_VQRSHL_T1, 188 MVE_VQRSHL_T2, 189 MVE_VQRSHRN, 190 MVE_VQRSHRUN, 191 MVE_VQSHL_T1, 192 MVE_VQSHL_T2, 193 MVE_VQSHLU_T3, 194 MVE_VQSHL_T4, 195 MVE_VQSHRN, 196 MVE_VQSHRUN, 197 MVE_VRSHL_T1, 198 MVE_VRSHL_T2, 199 MVE_VRSHR, 200 MVE_VRSHRN, 201 MVE_VSHL_T1, 202 MVE_VSHL_T2, 203 MVE_VSHL_T3, 204 MVE_VSHLC, 205 MVE_VSHLL_T1, 206 MVE_VSHLL_T2, 207 MVE_VSHR, 208 MVE_VSHRN, 209 MVE_VSLI, 210 MVE_VSRI, 211 MVE_VADC, 212 MVE_VABAV, 213 MVE_VABD_FP, 214 MVE_VABD_VEC, 215 MVE_VABS_FP, 216 MVE_VABS_VEC, 217 MVE_VADD_FP_T1, 218 MVE_VADD_FP_T2, 219 MVE_VADD_VEC_T1, 220 MVE_VADD_VEC_T2, 221 MVE_VSBC, 222 MVE_VSUB_FP_T1, 223 MVE_VSUB_FP_T2, 224 MVE_VSUB_VEC_T1, 225 MVE_VSUB_VEC_T2, 226 MVE_VAND, 227 MVE_VBRSR, 228 MVE_VCLS, 229 MVE_VCLZ, 230 MVE_VCTP, 231 MVE_VMAX, 232 MVE_VMAXA, 233 MVE_VMAXNM_FP, 234 MVE_VMAXNMA_FP, 235 MVE_VMAXNMV_FP, 236 MVE_VMAXNMAV_FP, 237 MVE_VMAXV, 238 MVE_VMAXAV, 239 MVE_VMIN, 240 MVE_VMINA, 241 MVE_VMINNM_FP, 242 MVE_VMINNMA_FP, 243 MVE_VMINNMV_FP, 244 MVE_VMINNMAV_FP, 245 MVE_VMINV, 246 MVE_VMINAV, 247 MVE_VMLA, 248 MVE_VMUL_FP_T1, 249 MVE_VMUL_FP_T2, 250 MVE_VMUL_VEC_T1, 251 MVE_VMUL_VEC_T2, 252 MVE_VMULH, 253 MVE_VRMULH, 254 MVE_VNEG_FP, 255 MVE_VNEG_VEC, 256 MVE_VPNOT, 257 MVE_VPSEL, 258 MVE_VQABS, 259 MVE_VQADD_T1, 260 MVE_VQADD_T2, 261 MVE_VQSUB_T1, 262 MVE_VQSUB_T2, 263 MVE_VQNEG, 264 MVE_VREV16, 265 MVE_VREV32, 266 MVE_VREV64, 267 MVE_LSLL, 268 MVE_LSLLI, 269 MVE_LSRL, 270 MVE_ASRL, 271 MVE_ASRLI, 272 MVE_SQRSHRL, 273 MVE_SQRSHR, 274 MVE_UQRSHL, 275 MVE_UQRSHLL, 276 MVE_UQSHL, 277 MVE_UQSHLL, 278 MVE_URSHRL, 279 MVE_URSHR, 280 MVE_SRSHRL, 281 MVE_SRSHR, 282 MVE_SQSHLL, 283 MVE_SQSHL, 284 MVE_CINC, 285 MVE_CINV, 286 MVE_CNEG, 287 MVE_CSINC, 288 MVE_CSINV, 289 MVE_CSET, 290 MVE_CSETM, 291 MVE_CSNEG, 292 MVE_CSEL, 293 MVE_NONE 294 }; 295 296 enum mve_unpredictable 297 { 298 UNPRED_IT_BLOCK, /* Unpredictable because mve insn in it block. 299 */ 300 UNPRED_FCA_0_FCB_1, /* Unpredictable because fcA = 0 and 301 fcB = 1 (vpt). */ 302 UNPRED_R13, /* Unpredictable because r13 (sp) or 303 r15 (sp) used. */ 304 UNPRED_R15, /* Unpredictable because r15 (pc) is used. */ 305 UNPRED_Q_GT_4, /* Unpredictable because 306 vec reg start > 4 (vld4/st4). */ 307 UNPRED_Q_GT_6, /* Unpredictable because 308 vec reg start > 6 (vld2/st2). */ 309 UNPRED_R13_AND_WB, /* Unpredictable becase gp reg = r13 310 and WB bit = 1. */ 311 UNPRED_Q_REGS_EQUAL, /* Unpredictable because vector registers are 312 equal. */ 313 UNPRED_OS, /* Unpredictable because offset scaled == 1. */ 314 UNPRED_GP_REGS_EQUAL, /* Unpredictable because gp registers are the 315 same. */ 316 UNPRED_Q_REGS_EQ_AND_SIZE_1, /* Unpredictable because q regs equal and 317 size = 1. */ 318 UNPRED_Q_REGS_EQ_AND_SIZE_2, /* Unpredictable because q regs equal and 319 size = 2. */ 320 UNPRED_NONE /* No unpredictable behavior. */ 321 }; 322 323 enum mve_undefined 324 { 325 UNDEF_SIZE, /* undefined size. */ 326 UNDEF_SIZE_0, /* undefined because size == 0. */ 327 UNDEF_SIZE_2, /* undefined because size == 2. */ 328 UNDEF_SIZE_3, /* undefined because size == 3. */ 329 UNDEF_SIZE_LE_1, /* undefined because size <= 1. */ 330 UNDEF_SIZE_NOT_0, /* undefined because size != 0. */ 331 UNDEF_SIZE_NOT_2, /* undefined because size != 2. */ 332 UNDEF_SIZE_NOT_3, /* undefined because size != 3. */ 333 UNDEF_NOT_UNS_SIZE_0, /* undefined because U == 0 and 334 size == 0. */ 335 UNDEF_NOT_UNS_SIZE_1, /* undefined because U == 0 and 336 size == 1. */ 337 UNDEF_NOT_UNSIGNED, /* undefined because U == 0. */ 338 UNDEF_VCVT_IMM6, /* imm6 < 32. */ 339 UNDEF_VCVT_FSI_IMM6, /* fsi = 0 and 32 >= imm6 <= 47. */ 340 UNDEF_BAD_OP1_OP2, /* undefined with op2 = 2 and 341 op1 == (0 or 1). */ 342 UNDEF_BAD_U_OP1_OP2, /* undefined with U = 1 and 343 op2 == 0 and op1 == (0 or 1). */ 344 UNDEF_OP_0_BAD_CMODE, /* undefined because op == 0 and cmode 345 in {0xx1, x0x1}. */ 346 UNDEF_XCHG_UNS, /* undefined because X == 1 and U == 1. */ 347 UNDEF_NONE /* no undefined behavior. */ 348 }; 349 350 struct opcode32 351 { 352 arm_feature_set arch; /* Architecture defining this insn. */ 353 unsigned long value; /* If arch is 0 then value is a sentinel. */ 354 unsigned long mask; /* Recognise insn if (op & mask) == value. */ 355 const char * assembler; /* How to disassemble this insn. */ 356 }; 357 358 /* MVE opcodes. */ 359 360 struct mopcode32 361 { 362 arm_feature_set arch; /* Architecture defining this insn. */ 363 enum mve_instructions mve_op; /* Specific mve instruction for faster 364 decoding. */ 365 unsigned long value; /* If arch is 0 then value is a sentinel. */ 366 unsigned long mask; /* Recognise insn if (op & mask) == value. */ 367 const char * assembler; /* How to disassemble this insn. */ 368 }; 369 370 enum isa { 371 ANY, 372 T32, 373 ARM 374 }; 375 376 377 /* Shared (between Arm and Thumb mode) opcode. */ 378 struct sopcode32 379 { 380 enum isa isa; /* Execution mode instruction availability. */ 381 arm_feature_set arch; /* Architecture defining this insn. */ 382 unsigned long value; /* If arch is 0 then value is a sentinel. */ 383 unsigned long mask; /* Recognise insn if (op & mask) == value. */ 384 const char * assembler; /* How to disassemble this insn. */ 385 }; 386 387 struct opcode16 388 { 389 arm_feature_set arch; /* Architecture defining this insn. */ 390 unsigned short value, mask; /* Recognise insn if (op & mask) == value. */ 391 const char *assembler; /* How to disassemble this insn. */ 392 }; 393 394 /* print_insn_coprocessor recognizes the following format control codes: 395 396 %% % 397 398 %c print condition code (always bits 28-31 in ARM mode) 399 %b print condition code allowing cp_num == 9 400 %q print shifter argument 401 %u print condition code (unconditional in ARM mode, 402 UNPREDICTABLE if not AL in Thumb) 403 %A print address for ldc/stc/ldf/stf instruction 404 %B print vstm/vldm register list 405 %C print vscclrm register list 406 %I print cirrus signed shift immediate: bits 0..3|4..6 407 %J print register for VLDR instruction 408 %K print address for VLDR instruction 409 %F print the COUNT field of a LFM/SFM instruction. 410 %P print floating point precision in arithmetic insn 411 %Q print floating point precision in ldf/stf insn 412 %R print floating point rounding mode 413 414 %<bitfield>c print as a condition code (for vsel) 415 %<bitfield>r print as an ARM register 416 %<bitfield>R as %<>r but r15 is UNPREDICTABLE 417 %<bitfield>ru as %<>r but each u register must be unique. 418 %<bitfield>d print the bitfield in decimal 419 %<bitfield>k print immediate for VFPv3 conversion instruction 420 %<bitfield>x print the bitfield in hex 421 %<bitfield>X print the bitfield as 1 hex digit without leading "0x" 422 %<bitfield>f print a floating point constant if >7 else a 423 floating point register 424 %<bitfield>w print as an iWMMXt width field - [bhwd]ss/us 425 %<bitfield>g print as an iWMMXt 64-bit register 426 %<bitfield>G print as an iWMMXt general purpose or control register 427 %<bitfield>D print as a NEON D register 428 %<bitfield>Q print as a NEON Q register 429 %<bitfield>V print as a NEON D or Q register 430 %<bitfield>E print a quarter-float immediate value 431 432 %y<code> print a single precision VFP reg. 433 Codes: 0=>Sm, 1=>Sd, 2=>Sn, 3=>multi-list, 4=>Sm pair 434 %z<code> print a double precision VFP reg 435 Codes: 0=>Dm, 1=>Dd, 2=>Dn, 3=>multi-list 436 437 %<bitfield>'c print specified char iff bitfield is all ones 438 %<bitfield>`c print specified char iff bitfield is all zeroes 439 %<bitfield>?ab... select from array of values in big endian order 440 441 %L print as an iWMMXt N/M width field. 442 %Z print the Immediate of a WSHUFH instruction. 443 %l like 'A' except use byte offsets for 'B' & 'H' 444 versions. 445 %i print 5-bit immediate in bits 8,3..0 446 (print "32" when 0) 447 %r print register offset address for wldt/wstr instruction. */ 448 449 enum opcode_sentinel_enum 450 { 451 SENTINEL_IWMMXT_START = 1, 452 SENTINEL_IWMMXT_END, 453 SENTINEL_GENERIC_START 454 } opcode_sentinels; 455 456 #define UNDEFINED_INSTRUCTION "\t\t; <UNDEFINED> instruction: %0-31x" 457 #define UNKNOWN_INSTRUCTION_32BIT "\t\t; <UNDEFINED> instruction: %08x" 458 #define UNKNOWN_INSTRUCTION_16BIT "\t\t; <UNDEFINED> instruction: %04x" 459 #define UNPREDICTABLE_INSTRUCTION "\t; <UNPREDICTABLE>" 460 461 /* Common coprocessor opcodes shared between Arm and Thumb-2. */ 462 463 static const struct sopcode32 coprocessor_opcodes[] = 464 { 465 /* XScale instructions. */ 466 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 467 0x0e200010, 0x0fff0ff0, 468 "mia%c\tacc0, %0-3r, %12-15r"}, 469 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 470 0x0e280010, 0x0fff0ff0, 471 "miaph%c\tacc0, %0-3r, %12-15r"}, 472 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 473 0x0e2c0010, 0x0ffc0ff0, "mia%17'T%17`B%16'T%16`B%c\tacc0, %0-3r, %12-15r"}, 474 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 475 0x0c400000, 0x0ff00fff, "mar%c\tacc0, %12-15r, %16-19r"}, 476 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 477 0x0c500000, 0x0ff00fff, "mra%c\t%12-15r, %16-19r, acc0"}, 478 479 /* Intel Wireless MMX technology instructions. */ 480 {ANY, ARM_FEATURE_CORE_LOW (0), SENTINEL_IWMMXT_START, 0, "" }, 481 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT), 482 0x0e130130, 0x0f3f0fff, "tandc%22-23w%c\t%12-15r"}, 483 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 484 0x0e400010, 0x0ff00f3f, "tbcst%6-7w%c\t%16-19g, %12-15r"}, 485 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 486 0x0e130170, 0x0f3f0ff8, "textrc%22-23w%c\t%12-15r, #%0-2d"}, 487 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 488 0x0e100070, 0x0f300ff0, "textrm%3?su%22-23w%c\t%12-15r, %16-19g, #%0-2d"}, 489 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 490 0x0e600010, 0x0ff00f38, "tinsr%6-7w%c\t%16-19g, %12-15r, #%0-2d"}, 491 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 492 0x0e000110, 0x0ff00fff, "tmcr%c\t%16-19G, %12-15r"}, 493 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 494 0x0c400000, 0x0ff00ff0, "tmcrr%c\t%0-3g, %12-15r, %16-19r"}, 495 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 496 0x0e2c0010, 0x0ffc0e10, "tmia%17?tb%16?tb%c\t%5-8g, %0-3r, %12-15r"}, 497 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 498 0x0e200010, 0x0fff0e10, "tmia%c\t%5-8g, %0-3r, %12-15r"}, 499 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 500 0x0e280010, 0x0fff0e10, "tmiaph%c\t%5-8g, %0-3r, %12-15r"}, 501 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 502 0x0e100030, 0x0f300fff, "tmovmsk%22-23w%c\t%12-15r, %16-19g"}, 503 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 504 0x0e100110, 0x0ff00ff0, "tmrc%c\t%12-15r, %16-19G"}, 505 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 506 0x0c500000, 0x0ff00ff0, "tmrrc%c\t%12-15r, %16-19r, %0-3g"}, 507 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 508 0x0e130150, 0x0f3f0fff, "torc%22-23w%c\t%12-15r"}, 509 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 510 0x0e120190, 0x0f3f0fff, "torvsc%22-23w%c\t%12-15r"}, 511 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 512 0x0e2001c0, 0x0f300fff, "wabs%22-23w%c\t%12-15g, %16-19g"}, 513 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 514 0x0e0001c0, 0x0f300fff, "wacc%22-23w%c\t%12-15g, %16-19g"}, 515 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 516 0x0e000180, 0x0f000ff0, "wadd%20-23w%c\t%12-15g, %16-19g, %0-3g"}, 517 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 518 0x0e2001a0, 0x0fb00ff0, "waddbhus%22?ml%c\t%12-15g, %16-19g, %0-3g"}, 519 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 520 0x0ea001a0, 0x0ff00ff0, "waddsubhx%c\t%12-15g, %16-19g, %0-3g"}, 521 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 522 0x0e000020, 0x0f800ff0, "waligni%c\t%12-15g, %16-19g, %0-3g, #%20-22d"}, 523 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 524 0x0e800020, 0x0fc00ff0, "walignr%20-21d%c\t%12-15g, %16-19g, %0-3g"}, 525 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 526 0x0e200000, 0x0fe00ff0, "wand%20'n%c\t%12-15g, %16-19g, %0-3g"}, 527 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 528 0x0e800000, 0x0fa00ff0, "wavg2%22?hb%20'r%c\t%12-15g, %16-19g, %0-3g"}, 529 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 530 0x0e400000, 0x0fe00ff0, "wavg4%20'r%c\t%12-15g, %16-19g, %0-3g"}, 531 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 532 0x0e000060, 0x0f300ff0, "wcmpeq%22-23w%c\t%12-15g, %16-19g, %0-3g"}, 533 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 534 0x0e100060, 0x0f100ff0, "wcmpgt%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"}, 535 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 536 0xfc500100, 0xfe500f00, "wldrd\t%12-15g, %r"}, 537 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 538 0xfc100100, 0xfe500f00, "wldrw\t%12-15G, %A"}, 539 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 540 0x0c100000, 0x0e100e00, "wldr%L%c\t%12-15g, %l"}, 541 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 542 0x0e400100, 0x0fc00ff0, "wmac%21?su%20'z%c\t%12-15g, %16-19g, %0-3g"}, 543 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 544 0x0e800100, 0x0fc00ff0, "wmadd%21?su%20'x%c\t%12-15g, %16-19g, %0-3g"}, 545 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 546 0x0ec00100, 0x0fd00ff0, "wmadd%21?sun%c\t%12-15g, %16-19g, %0-3g"}, 547 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 548 0x0e000160, 0x0f100ff0, "wmax%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"}, 549 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 550 0x0e000080, 0x0f100fe0, "wmerge%c\t%12-15g, %16-19g, %0-3g, #%21-23d"}, 551 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 552 0x0e0000a0, 0x0f800ff0, "wmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"}, 553 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 554 0x0e800120, 0x0f800ff0, 555 "wmiaw%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"}, 556 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 557 0x0e100160, 0x0f100ff0, "wmin%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"}, 558 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 559 0x0e000100, 0x0fc00ff0, "wmul%21?su%20?ml%23'r%c\t%12-15g, %16-19g, %0-3g"}, 560 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 561 0x0ed00100, 0x0fd00ff0, "wmul%21?sumr%c\t%12-15g, %16-19g, %0-3g"}, 562 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 563 0x0ee000c0, 0x0fe00ff0, "wmulwsm%20`r%c\t%12-15g, %16-19g, %0-3g"}, 564 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 565 0x0ec000c0, 0x0fe00ff0, "wmulwum%20`r%c\t%12-15g, %16-19g, %0-3g"}, 566 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 567 0x0eb000c0, 0x0ff00ff0, "wmulwl%c\t%12-15g, %16-19g, %0-3g"}, 568 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 569 0x0e8000a0, 0x0f800ff0, 570 "wqmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"}, 571 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 572 0x0e100080, 0x0fd00ff0, "wqmulm%21'r%c\t%12-15g, %16-19g, %0-3g"}, 573 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 574 0x0ec000e0, 0x0fd00ff0, "wqmulwm%21'r%c\t%12-15g, %16-19g, %0-3g"}, 575 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 576 0x0e000000, 0x0ff00ff0, "wor%c\t%12-15g, %16-19g, %0-3g"}, 577 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 578 0x0e000080, 0x0f000ff0, "wpack%20-23w%c\t%12-15g, %16-19g, %0-3g"}, 579 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 580 0xfe300040, 0xff300ef0, "wror%22-23w\t%12-15g, %16-19g, #%i"}, 581 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 582 0x0e300040, 0x0f300ff0, "wror%22-23w%c\t%12-15g, %16-19g, %0-3g"}, 583 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 584 0x0e300140, 0x0f300ff0, "wror%22-23wg%c\t%12-15g, %16-19g, %0-3G"}, 585 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 586 0x0e000120, 0x0fa00ff0, "wsad%22?hb%20'z%c\t%12-15g, %16-19g, %0-3g"}, 587 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 588 0x0e0001e0, 0x0f000ff0, "wshufh%c\t%12-15g, %16-19g, #%Z"}, 589 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 590 0xfe100040, 0xff300ef0, "wsll%22-23w\t%12-15g, %16-19g, #%i"}, 591 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 592 0x0e100040, 0x0f300ff0, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"}, 593 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 594 0x0e100148, 0x0f300ffc, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"}, 595 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 596 0xfe000040, 0xff300ef0, "wsra%22-23w\t%12-15g, %16-19g, #%i"}, 597 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 598 0x0e000040, 0x0f300ff0, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"}, 599 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 600 0x0e000148, 0x0f300ffc, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"}, 601 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 602 0xfe200040, 0xff300ef0, "wsrl%22-23w\t%12-15g, %16-19g, #%i"}, 603 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 604 0x0e200040, 0x0f300ff0, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"}, 605 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 606 0x0e200148, 0x0f300ffc, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"}, 607 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 608 0xfc400100, 0xfe500f00, "wstrd\t%12-15g, %r"}, 609 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 610 0xfc000100, 0xfe500f00, "wstrw\t%12-15G, %A"}, 611 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 612 0x0c000000, 0x0e100e00, "wstr%L%c\t%12-15g, %l"}, 613 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 614 0x0e0001a0, 0x0f000ff0, "wsub%20-23w%c\t%12-15g, %16-19g, %0-3g"}, 615 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 616 0x0ed001c0, 0x0ff00ff0, "wsubaddhx%c\t%12-15g, %16-19g, %0-3g"}, 617 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 618 0x0e1001c0, 0x0f300ff0, "wabsdiff%22-23w%c\t%12-15g, %16-19g, %0-3g"}, 619 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 620 0x0e0000c0, 0x0fd00fff, "wunpckeh%21?sub%c\t%12-15g, %16-19g"}, 621 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 622 0x0e4000c0, 0x0fd00fff, "wunpckeh%21?suh%c\t%12-15g, %16-19g"}, 623 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 624 0x0e8000c0, 0x0fd00fff, "wunpckeh%21?suw%c\t%12-15g, %16-19g"}, 625 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 626 0x0e0000e0, 0x0f100fff, "wunpckel%21?su%22-23w%c\t%12-15g, %16-19g"}, 627 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 628 0x0e1000c0, 0x0f300ff0, "wunpckih%22-23w%c\t%12-15g, %16-19g, %0-3g"}, 629 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 630 0x0e1000e0, 0x0f300ff0, "wunpckil%22-23w%c\t%12-15g, %16-19g, %0-3g"}, 631 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 632 0x0e100000, 0x0ff00ff0, "wxor%c\t%12-15g, %16-19g, %0-3g"}, 633 {ANY, ARM_FEATURE_CORE_LOW (0), 634 SENTINEL_IWMMXT_END, 0, "" }, 635 636 /* Floating point coprocessor (FPA) instructions. */ 637 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 638 0x0e000100, 0x0ff08f10, "adf%c%P%R\t%12-14f, %16-18f, %0-3f"}, 639 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 640 0x0e100100, 0x0ff08f10, "muf%c%P%R\t%12-14f, %16-18f, %0-3f"}, 641 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 642 0x0e200100, 0x0ff08f10, "suf%c%P%R\t%12-14f, %16-18f, %0-3f"}, 643 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 644 0x0e300100, 0x0ff08f10, "rsf%c%P%R\t%12-14f, %16-18f, %0-3f"}, 645 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 646 0x0e400100, 0x0ff08f10, "dvf%c%P%R\t%12-14f, %16-18f, %0-3f"}, 647 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 648 0x0e500100, 0x0ff08f10, "rdf%c%P%R\t%12-14f, %16-18f, %0-3f"}, 649 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 650 0x0e600100, 0x0ff08f10, "pow%c%P%R\t%12-14f, %16-18f, %0-3f"}, 651 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 652 0x0e700100, 0x0ff08f10, "rpw%c%P%R\t%12-14f, %16-18f, %0-3f"}, 653 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 654 0x0e800100, 0x0ff08f10, "rmf%c%P%R\t%12-14f, %16-18f, %0-3f"}, 655 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 656 0x0e900100, 0x0ff08f10, "fml%c%P%R\t%12-14f, %16-18f, %0-3f"}, 657 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 658 0x0ea00100, 0x0ff08f10, "fdv%c%P%R\t%12-14f, %16-18f, %0-3f"}, 659 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 660 0x0eb00100, 0x0ff08f10, "frd%c%P%R\t%12-14f, %16-18f, %0-3f"}, 661 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 662 0x0ec00100, 0x0ff08f10, "pol%c%P%R\t%12-14f, %16-18f, %0-3f"}, 663 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 664 0x0e008100, 0x0ff08f10, "mvf%c%P%R\t%12-14f, %0-3f"}, 665 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 666 0x0e108100, 0x0ff08f10, "mnf%c%P%R\t%12-14f, %0-3f"}, 667 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 668 0x0e208100, 0x0ff08f10, "abs%c%P%R\t%12-14f, %0-3f"}, 669 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 670 0x0e308100, 0x0ff08f10, "rnd%c%P%R\t%12-14f, %0-3f"}, 671 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 672 0x0e408100, 0x0ff08f10, "sqt%c%P%R\t%12-14f, %0-3f"}, 673 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 674 0x0e508100, 0x0ff08f10, "log%c%P%R\t%12-14f, %0-3f"}, 675 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 676 0x0e608100, 0x0ff08f10, "lgn%c%P%R\t%12-14f, %0-3f"}, 677 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 678 0x0e708100, 0x0ff08f10, "exp%c%P%R\t%12-14f, %0-3f"}, 679 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 680 0x0e808100, 0x0ff08f10, "sin%c%P%R\t%12-14f, %0-3f"}, 681 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 682 0x0e908100, 0x0ff08f10, "cos%c%P%R\t%12-14f, %0-3f"}, 683 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 684 0x0ea08100, 0x0ff08f10, "tan%c%P%R\t%12-14f, %0-3f"}, 685 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 686 0x0eb08100, 0x0ff08f10, "asn%c%P%R\t%12-14f, %0-3f"}, 687 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 688 0x0ec08100, 0x0ff08f10, "acs%c%P%R\t%12-14f, %0-3f"}, 689 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 690 0x0ed08100, 0x0ff08f10, "atn%c%P%R\t%12-14f, %0-3f"}, 691 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 692 0x0ee08100, 0x0ff08f10, "urd%c%P%R\t%12-14f, %0-3f"}, 693 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 694 0x0ef08100, 0x0ff08f10, "nrm%c%P%R\t%12-14f, %0-3f"}, 695 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 696 0x0e000110, 0x0ff00f1f, "flt%c%P%R\t%16-18f, %12-15r"}, 697 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 698 0x0e100110, 0x0fff0f98, "fix%c%R\t%12-15r, %0-2f"}, 699 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 700 0x0e200110, 0x0fff0fff, "wfs%c\t%12-15r"}, 701 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 702 0x0e300110, 0x0fff0fff, "rfs%c\t%12-15r"}, 703 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 704 0x0e400110, 0x0fff0fff, "wfc%c\t%12-15r"}, 705 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 706 0x0e500110, 0x0fff0fff, "rfc%c\t%12-15r"}, 707 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 708 0x0e90f110, 0x0ff8fff0, "cmf%c\t%16-18f, %0-3f"}, 709 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 710 0x0eb0f110, 0x0ff8fff0, "cnf%c\t%16-18f, %0-3f"}, 711 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 712 0x0ed0f110, 0x0ff8fff0, "cmfe%c\t%16-18f, %0-3f"}, 713 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 714 0x0ef0f110, 0x0ff8fff0, "cnfe%c\t%16-18f, %0-3f"}, 715 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 716 0x0c000100, 0x0e100f00, "stf%c%Q\t%12-14f, %A"}, 717 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 718 0x0c100100, 0x0e100f00, "ldf%c%Q\t%12-14f, %A"}, 719 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V2), 720 0x0c000200, 0x0e100f00, "sfm%c\t%12-14f, %F, %A"}, 721 {ANY, ARM_FEATURE_COPROC (FPU_FPA_EXT_V2), 722 0x0c100200, 0x0e100f00, "lfm%c\t%12-14f, %F, %A"}, 723 724 /* Armv8.1-M Mainline instructions. */ 725 {T32, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 726 0xec9f0b00, 0xffbf0f01, "vscclrm%c\t%C"}, 727 {T32, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 728 0xec9f0a00, 0xffbf0f00, "vscclrm%c\t%C"}, 729 730 /* ARMv8-M Mainline Security Extensions instructions. */ 731 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN), 732 0xec300a00, 0xfff0ffff, "vlldm\t%16-19r"}, 733 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN), 734 0xec200a00, 0xfff0ffff, "vlstm\t%16-19r"}, 735 736 /* Register load/store. */ 737 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1), 738 0x0d2d0b00, 0x0fbf0f01, "vpush%c\t%B"}, 739 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1), 740 0x0d200b00, 0x0fb00f01, "vstmdb%c\t%16-19r!, %B"}, 741 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1), 742 0x0d300b00, 0x0fb00f01, "vldmdb%c\t%16-19r!, %B"}, 743 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1), 744 0x0c800b00, 0x0f900f01, "vstmia%c\t%16-19r%21'!, %B"}, 745 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1), 746 0x0cbd0b00, 0x0fbf0f01, "vpop%c\t%B"}, 747 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1), 748 0x0c900b00, 0x0f900f01, "vldmia%c\t%16-19r%21'!, %B"}, 749 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1), 750 0x0d000b00, 0x0f300f00, "vstr%c\t%12-15,22D, %A"}, 751 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1), 752 0x0d100b00, 0x0f300f00, "vldr%c\t%12-15,22D, %A"}, 753 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 754 0x0d2d0a00, 0x0fbf0f00, "vpush%c\t%y3"}, 755 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 756 0x0d200a00, 0x0fb00f00, "vstmdb%c\t%16-19r!, %y3"}, 757 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 758 0x0d300a00, 0x0fb00f00, "vldmdb%c\t%16-19r!, %y3"}, 759 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 760 0x0c800a00, 0x0f900f00, "vstmia%c\t%16-19r%21'!, %y3"}, 761 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 762 0x0cbd0a00, 0x0fbf0f00, "vpop%c\t%y3"}, 763 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 764 0x0c900a00, 0x0f900f00, "vldmia%c\t%16-19r%21'!, %y3"}, 765 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 766 0x0d000a00, 0x0f300f00, "vstr%c\t%y1, %A"}, 767 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 768 0x0d100a00, 0x0f300f00, "vldr%c\t%y1, %A"}, 769 {ANY, ARM_FEATURE_COPROC (ARM_EXT2_V8_1M_MAIN), 770 0xec100f80, 0xfe101f80, "vldr%c\t%J, %K"}, 771 {ANY, ARM_FEATURE_COPROC (ARM_EXT2_V8_1M_MAIN), 772 0xec000f80, 0xfe101f80, "vstr%c\t%J, %K"}, 773 774 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 775 0x0d200b01, 0x0fb00f01, "fstmdbx%c\t%16-19r!, %z3\t;@ Deprecated"}, 776 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 777 0x0d300b01, 0x0fb00f01, "fldmdbx%c\t%16-19r!, %z3\t;@ Deprecated"}, 778 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 779 0x0c800b01, 0x0f900f01, "fstmiax%c\t%16-19r%21'!, %z3\t;@ Deprecated"}, 780 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 781 0x0c900b01, 0x0f900f01, "fldmiax%c\t%16-19r%21'!, %z3\t;@ Deprecated"}, 782 783 /* Data transfer between ARM and NEON registers. */ 784 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 785 0x0c400b10, 0x0ff00fd0, "vmov%c\t%0-3,5D, %12-15r, %16-19r"}, 786 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 787 0x0c500b10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %0-3,5D"}, 788 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 789 0x0e000b10, 0x0fd00f70, "vmov%c.32\t%16-19,7D[%21d], %12-15r"}, 790 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 791 0x0e100b10, 0x0f500f70, "vmov%c.32\t%12-15r, %16-19,7D[%21d]"}, 792 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 793 0x0e000b30, 0x0fd00f30, "vmov%c.16\t%16-19,7D[%6,21d], %12-15r"}, 794 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 795 0x0e100b30, 0x0f500f30, "vmov%c.%23?us16\t%12-15r, %16-19,7D[%6,21d]"}, 796 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 797 0x0e400b10, 0x0fd00f10, "vmov%c.8\t%16-19,7D[%5,6,21d], %12-15r"}, 798 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 799 0x0e500b10, 0x0f500f10, "vmov%c.%23?us8\t%12-15r, %16-19,7D[%5,6,21d]"}, 800 /* Half-precision conversion instructions. */ 801 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 802 0x0eb20b40, 0x0fbf0f50, "vcvt%7?tb%c.f64.f16\t%z1, %y0"}, 803 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 804 0x0eb30b40, 0x0fbf0f50, "vcvt%7?tb%c.f16.f64\t%y1, %z0"}, 805 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16), 806 0x0eb20a40, 0x0fbf0f50, "vcvt%7?tb%c.f32.f16\t%y1, %y0"}, 807 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16), 808 0x0eb30a40, 0x0fbf0f50, "vcvt%7?tb%c.f16.f32\t%y1, %y0"}, 809 810 /* Floating point coprocessor (VFP) instructions. */ 811 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 812 0x0ee00a10, 0x0fff0fff, "vmsr%c\tfpsid, %12-15r"}, 813 {ANY, ARM_FEATURE (0, ARM_EXT2_V8_1M_MAIN, FPU_VFP_EXT_V1xD), 814 0x0ee10a10, 0x0fff0fff, "vmsr%c\tfpscr, %12-15r"}, 815 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 816 0x0ee20a10, 0x0fff0fff, "vmsr%c\tfpscr_nzcvqc, %12-15r"}, 817 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 818 0x0ee60a10, 0x0fff0fff, "vmsr%c\tmvfr1, %12-15r"}, 819 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 820 0x0ee70a10, 0x0fff0fff, "vmsr%c\tmvfr0, %12-15r"}, 821 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 822 0x0ee50a10, 0x0fff0fff, "vmsr%c\tmvfr2, %12-15r"}, 823 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 824 0x0ee80a10, 0x0fff0fff, "vmsr%c\tfpexc, %12-15r"}, 825 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 826 0x0ee90a10, 0x0fff0fff, "vmsr%c\tfpinst, %12-15r\t@ Impl def"}, 827 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 828 0x0eea0a10, 0x0fff0fff, "vmsr%c\tfpinst2, %12-15r\t@ Impl def"}, 829 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 830 0x0eec0a10, 0x0fff0fff, "vmsr%c\tvpr, %12-15r"}, 831 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 832 0x0eed0a10, 0x0fff0fff, "vmsr%c\tp0, %12-15r"}, 833 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 834 0x0eee0a10, 0x0fff0fff, "vmsr%c\tfpcxt_ns, %12-15r"}, 835 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 836 0x0eef0a10, 0x0fff0fff, "vmsr%c\tfpcxt_s, %12-15r"}, 837 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 838 0x0ef00a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpsid"}, 839 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 840 0x0ef1fa10, 0x0fffffff, "vmrs%c\tAPSR_nzcv, fpscr"}, 841 {ANY, ARM_FEATURE (0, ARM_EXT2_V8_1M_MAIN, FPU_VFP_EXT_V1xD), 842 0x0ef10a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpscr"}, 843 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 844 0x0ef20a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpscr_nzcvqc"}, 845 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 846 0x0ef50a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr2"}, 847 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 848 0x0ef60a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr1"}, 849 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 850 0x0ef70a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr0"}, 851 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 852 0x0ef80a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpexc"}, 853 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 854 0x0ef90a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpinst\t@ Impl def"}, 855 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 856 0x0efa0a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpinst2\t@ Impl def"}, 857 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 858 0x0efc0a10, 0x0fff0fff, "vmrs%c\t%12-15r, vpr"}, 859 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 860 0x0efd0a10, 0x0fff0fff, "vmrs%c\t%12-15r, p0"}, 861 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 862 0x0efe0a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpcxt_ns"}, 863 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 864 0x0eff0a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpcxt_s"}, 865 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 866 0x0e000b10, 0x0fd00fff, "vmov%c.32\t%z2[%21d], %12-15r"}, 867 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 868 0x0e100b10, 0x0fd00fff, "vmov%c.32\t%12-15r, %z2[%21d]"}, 869 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 870 0x0ee00a10, 0x0ff00fff, "vmsr%c\t<impl def %16-19x>, %12-15r"}, 871 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 872 0x0ef00a10, 0x0ff00fff, "vmrs%c\t%12-15r, <impl def %16-19x>"}, 873 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 874 0x0e000a10, 0x0ff00f7f, "vmov%c\t%y2, %12-15r"}, 875 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 876 0x0e100a10, 0x0ff00f7f, "vmov%c\t%12-15r, %y2"}, 877 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 878 0x0eb50a40, 0x0fbf0f70, "vcmp%7'e%c.f32\t%y1, #0.0"}, 879 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 880 0x0eb50b40, 0x0fbf0f70, "vcmp%7'e%c.f64\t%z1, #0.0"}, 881 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 882 0x0eb00a40, 0x0fbf0fd0, "vmov%c.f32\t%y1, %y0"}, 883 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 884 0x0eb00ac0, 0x0fbf0fd0, "vabs%c.f32\t%y1, %y0"}, 885 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 886 0x0eb00b40, 0x0fbf0fd0, "vmov%c.f64\t%z1, %z0"}, 887 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 888 0x0eb00bc0, 0x0fbf0fd0, "vabs%c.f64\t%z1, %z0"}, 889 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 890 0x0eb10a40, 0x0fbf0fd0, "vneg%c.f32\t%y1, %y0"}, 891 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 892 0x0eb10ac0, 0x0fbf0fd0, "vsqrt%c.f32\t%y1, %y0"}, 893 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 894 0x0eb10b40, 0x0fbf0fd0, "vneg%c.f64\t%z1, %z0"}, 895 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 896 0x0eb10bc0, 0x0fbf0fd0, "vsqrt%c.f64\t%z1, %z0"}, 897 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 898 0x0eb70ac0, 0x0fbf0fd0, "vcvt%c.f64.f32\t%z1, %y0"}, 899 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 900 0x0eb70bc0, 0x0fbf0fd0, "vcvt%c.f32.f64\t%y1, %z0"}, 901 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 902 0x0eb80a40, 0x0fbf0f50, "vcvt%c.f32.%7?su32\t%y1, %y0"}, 903 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 904 0x0eb80b40, 0x0fbf0f50, "vcvt%c.f64.%7?su32\t%z1, %y0"}, 905 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 906 0x0eb40a40, 0x0fbf0f50, "vcmp%7'e%c.f32\t%y1, %y0"}, 907 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 908 0x0eb40b40, 0x0fbf0f50, "vcmp%7'e%c.f64\t%z1, %z0"}, 909 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD), 910 0x0eba0a40, 0x0fbe0f50, "vcvt%c.f32.%16?us%7?31%7?26\t%y1, %y1, #%5,0-3k"}, 911 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3), 912 0x0eba0b40, 0x0fbe0f50, "vcvt%c.f64.%16?us%7?31%7?26\t%z1, %z1, #%5,0-3k"}, 913 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 914 0x0ebc0a40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f32\t%y1, %y0"}, 915 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 916 0x0ebc0b40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f64\t%y1, %z0"}, 917 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD), 918 0x0ebe0a40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f32\t%y1, %y1, #%5,0-3k"}, 919 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3), 920 0x0ebe0b40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f64\t%z1, %z1, #%5,0-3k"}, 921 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 922 0x0c500b10, 0x0fb00ff0, "vmov%c\t%12-15r, %16-19r, %z0"}, 923 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD), 924 0x0eb00a00, 0x0fb00ff0, "vmov%c.f32\t%y1, #%0-3,16-19E"}, 925 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3), 926 0x0eb00b00, 0x0fb00ff0, "vmov%c.f64\t%z1, #%0-3,16-19E"}, 927 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2), 928 0x0c400a10, 0x0ff00fd0, "vmov%c\t%y4, %12-15r, %16-19r"}, 929 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2), 930 0x0c400b10, 0x0ff00fd0, "vmov%c\t%z0, %12-15r, %16-19r"}, 931 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V2), 932 0x0c500a10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %y4"}, 933 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 934 0x0e000a00, 0x0fb00f50, "vmla%c.f32\t%y1, %y2, %y0"}, 935 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 936 0x0e000a40, 0x0fb00f50, "vmls%c.f32\t%y1, %y2, %y0"}, 937 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 938 0x0e000b00, 0x0fb00f50, "vmla%c.f64\t%z1, %z2, %z0"}, 939 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 940 0x0e000b40, 0x0fb00f50, "vmls%c.f64\t%z1, %z2, %z0"}, 941 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 942 0x0e100a00, 0x0fb00f50, "vnmls%c.f32\t%y1, %y2, %y0"}, 943 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 944 0x0e100a40, 0x0fb00f50, "vnmla%c.f32\t%y1, %y2, %y0"}, 945 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 946 0x0e100b00, 0x0fb00f50, "vnmls%c.f64\t%z1, %z2, %z0"}, 947 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 948 0x0e100b40, 0x0fb00f50, "vnmla%c.f64\t%z1, %z2, %z0"}, 949 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 950 0x0e200a00, 0x0fb00f50, "vmul%c.f32\t%y1, %y2, %y0"}, 951 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 952 0x0e200a40, 0x0fb00f50, "vnmul%c.f32\t%y1, %y2, %y0"}, 953 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 954 0x0e200b00, 0x0fb00f50, "vmul%c.f64\t%z1, %z2, %z0"}, 955 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 956 0x0e200b40, 0x0fb00f50, "vnmul%c.f64\t%z1, %z2, %z0"}, 957 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 958 0x0e300a00, 0x0fb00f50, "vadd%c.f32\t%y1, %y2, %y0"}, 959 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 960 0x0e300a40, 0x0fb00f50, "vsub%c.f32\t%y1, %y2, %y0"}, 961 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 962 0x0e300b00, 0x0fb00f50, "vadd%c.f64\t%z1, %z2, %z0"}, 963 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 964 0x0e300b40, 0x0fb00f50, "vsub%c.f64\t%z1, %z2, %z0"}, 965 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 966 0x0e800a00, 0x0fb00f50, "vdiv%c.f32\t%y1, %y2, %y0"}, 967 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 968 0x0e800b00, 0x0fb00f50, "vdiv%c.f64\t%z1, %z2, %z0"}, 969 970 /* Cirrus coprocessor instructions. */ 971 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 972 0x0d100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"}, 973 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 974 0x0c100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"}, 975 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 976 0x0d500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"}, 977 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 978 0x0c500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"}, 979 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 980 0x0d100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"}, 981 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 982 0x0c100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"}, 983 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 984 0x0d500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"}, 985 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 986 0x0c500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"}, 987 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 988 0x0d000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"}, 989 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 990 0x0c000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"}, 991 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 992 0x0d400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"}, 993 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 994 0x0c400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"}, 995 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 996 0x0d000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"}, 997 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 998 0x0c000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"}, 999 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1000 0x0d400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"}, 1001 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1002 0x0c400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"}, 1003 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1004 0x0e000450, 0x0ff00ff0, "cfmvsr%c\tmvf%16-19d, %12-15r"}, 1005 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1006 0x0e100450, 0x0ff00ff0, "cfmvrs%c\t%12-15r, mvf%16-19d"}, 1007 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1008 0x0e000410, 0x0ff00ff0, "cfmvdlr%c\tmvd%16-19d, %12-15r"}, 1009 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1010 0x0e100410, 0x0ff00ff0, "cfmvrdl%c\t%12-15r, mvd%16-19d"}, 1011 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1012 0x0e000430, 0x0ff00ff0, "cfmvdhr%c\tmvd%16-19d, %12-15r"}, 1013 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1014 0x0e100430, 0x0ff00fff, "cfmvrdh%c\t%12-15r, mvd%16-19d"}, 1015 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1016 0x0e000510, 0x0ff00fff, "cfmv64lr%c\tmvdx%16-19d, %12-15r"}, 1017 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1018 0x0e100510, 0x0ff00fff, "cfmvr64l%c\t%12-15r, mvdx%16-19d"}, 1019 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1020 0x0e000530, 0x0ff00fff, "cfmv64hr%c\tmvdx%16-19d, %12-15r"}, 1021 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1022 0x0e100530, 0x0ff00fff, "cfmvr64h%c\t%12-15r, mvdx%16-19d"}, 1023 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1024 0x0e200440, 0x0ff00fff, "cfmval32%c\tmvax%12-15d, mvfx%16-19d"}, 1025 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1026 0x0e100440, 0x0ff00fff, "cfmv32al%c\tmvfx%12-15d, mvax%16-19d"}, 1027 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1028 0x0e200460, 0x0ff00fff, "cfmvam32%c\tmvax%12-15d, mvfx%16-19d"}, 1029 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1030 0x0e100460, 0x0ff00fff, "cfmv32am%c\tmvfx%12-15d, mvax%16-19d"}, 1031 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1032 0x0e200480, 0x0ff00fff, "cfmvah32%c\tmvax%12-15d, mvfx%16-19d"}, 1033 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1034 0x0e100480, 0x0ff00fff, "cfmv32ah%c\tmvfx%12-15d, mvax%16-19d"}, 1035 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1036 0x0e2004a0, 0x0ff00fff, "cfmva32%c\tmvax%12-15d, mvfx%16-19d"}, 1037 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1038 0x0e1004a0, 0x0ff00fff, "cfmv32a%c\tmvfx%12-15d, mvax%16-19d"}, 1039 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1040 0x0e2004c0, 0x0ff00fff, "cfmva64%c\tmvax%12-15d, mvdx%16-19d"}, 1041 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1042 0x0e1004c0, 0x0ff00fff, "cfmv64a%c\tmvdx%12-15d, mvax%16-19d"}, 1043 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1044 0x0e2004e0, 0x0fff0fff, "cfmvsc32%c\tdspsc, mvdx%12-15d"}, 1045 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1046 0x0e1004e0, 0x0fff0fff, "cfmv32sc%c\tmvdx%12-15d, dspsc"}, 1047 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1048 0x0e000400, 0x0ff00fff, "cfcpys%c\tmvf%12-15d, mvf%16-19d"}, 1049 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1050 0x0e000420, 0x0ff00fff, "cfcpyd%c\tmvd%12-15d, mvd%16-19d"}, 1051 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1052 0x0e000460, 0x0ff00fff, "cfcvtsd%c\tmvd%12-15d, mvf%16-19d"}, 1053 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1054 0x0e000440, 0x0ff00fff, "cfcvtds%c\tmvf%12-15d, mvd%16-19d"}, 1055 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1056 0x0e000480, 0x0ff00fff, "cfcvt32s%c\tmvf%12-15d, mvfx%16-19d"}, 1057 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1058 0x0e0004a0, 0x0ff00fff, "cfcvt32d%c\tmvd%12-15d, mvfx%16-19d"}, 1059 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1060 0x0e0004c0, 0x0ff00fff, "cfcvt64s%c\tmvf%12-15d, mvdx%16-19d"}, 1061 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1062 0x0e0004e0, 0x0ff00fff, "cfcvt64d%c\tmvd%12-15d, mvdx%16-19d"}, 1063 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1064 0x0e100580, 0x0ff00fff, "cfcvts32%c\tmvfx%12-15d, mvf%16-19d"}, 1065 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1066 0x0e1005a0, 0x0ff00fff, "cfcvtd32%c\tmvfx%12-15d, mvd%16-19d"}, 1067 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1068 0x0e1005c0, 0x0ff00fff, "cftruncs32%c\tmvfx%12-15d, mvf%16-19d"}, 1069 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1070 0x0e1005e0, 0x0ff00fff, "cftruncd32%c\tmvfx%12-15d, mvd%16-19d"}, 1071 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1072 0x0e000550, 0x0ff00ff0, "cfrshl32%c\tmvfx%16-19d, mvfx%0-3d, %12-15r"}, 1073 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1074 0x0e000570, 0x0ff00ff0, "cfrshl64%c\tmvdx%16-19d, mvdx%0-3d, %12-15r"}, 1075 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1076 0x0e000500, 0x0ff00f10, "cfsh32%c\tmvfx%12-15d, mvfx%16-19d, #%I"}, 1077 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1078 0x0e200500, 0x0ff00f10, "cfsh64%c\tmvdx%12-15d, mvdx%16-19d, #%I"}, 1079 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1080 0x0e100490, 0x0ff00ff0, "cfcmps%c\t%12-15r, mvf%16-19d, mvf%0-3d"}, 1081 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1082 0x0e1004b0, 0x0ff00ff0, "cfcmpd%c\t%12-15r, mvd%16-19d, mvd%0-3d"}, 1083 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1084 0x0e100590, 0x0ff00ff0, "cfcmp32%c\t%12-15r, mvfx%16-19d, mvfx%0-3d"}, 1085 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1086 0x0e1005b0, 0x0ff00ff0, "cfcmp64%c\t%12-15r, mvdx%16-19d, mvdx%0-3d"}, 1087 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1088 0x0e300400, 0x0ff00fff, "cfabss%c\tmvf%12-15d, mvf%16-19d"}, 1089 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1090 0x0e300420, 0x0ff00fff, "cfabsd%c\tmvd%12-15d, mvd%16-19d"}, 1091 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1092 0x0e300440, 0x0ff00fff, "cfnegs%c\tmvf%12-15d, mvf%16-19d"}, 1093 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1094 0x0e300460, 0x0ff00fff, "cfnegd%c\tmvd%12-15d, mvd%16-19d"}, 1095 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1096 0x0e300480, 0x0ff00ff0, "cfadds%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"}, 1097 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1098 0x0e3004a0, 0x0ff00ff0, "cfaddd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"}, 1099 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1100 0x0e3004c0, 0x0ff00ff0, "cfsubs%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"}, 1101 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1102 0x0e3004e0, 0x0ff00ff0, "cfsubd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"}, 1103 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1104 0x0e100400, 0x0ff00ff0, "cfmuls%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"}, 1105 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1106 0x0e100420, 0x0ff00ff0, "cfmuld%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"}, 1107 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1108 0x0e300500, 0x0ff00fff, "cfabs32%c\tmvfx%12-15d, mvfx%16-19d"}, 1109 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1110 0x0e300520, 0x0ff00fff, "cfabs64%c\tmvdx%12-15d, mvdx%16-19d"}, 1111 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1112 0x0e300540, 0x0ff00fff, "cfneg32%c\tmvfx%12-15d, mvfx%16-19d"}, 1113 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1114 0x0e300560, 0x0ff00fff, "cfneg64%c\tmvdx%12-15d, mvdx%16-19d"}, 1115 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1116 0x0e300580, 0x0ff00ff0, "cfadd32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"}, 1117 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1118 0x0e3005a0, 0x0ff00ff0, "cfadd64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"}, 1119 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1120 0x0e3005c0, 0x0ff00ff0, "cfsub32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"}, 1121 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1122 0x0e3005e0, 0x0ff00ff0, "cfsub64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"}, 1123 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1124 0x0e100500, 0x0ff00ff0, "cfmul32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"}, 1125 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1126 0x0e100520, 0x0ff00ff0, "cfmul64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"}, 1127 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1128 0x0e100540, 0x0ff00ff0, "cfmac32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"}, 1129 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1130 0x0e100560, 0x0ff00ff0, "cfmsc32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"}, 1131 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1132 0x0e000600, 0x0ff00f10, 1133 "cfmadd32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"}, 1134 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1135 0x0e100600, 0x0ff00f10, 1136 "cfmsub32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"}, 1137 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1138 0x0e200600, 0x0ff00f10, 1139 "cfmadda32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"}, 1140 {ANY, ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 1141 0x0e300600, 0x0ff00f10, 1142 "cfmsuba32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"}, 1143 1144 /* VFP Fused multiply add instructions. */ 1145 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA), 1146 0x0ea00a00, 0x0fb00f50, "vfma%c.f32\t%y1, %y2, %y0"}, 1147 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA), 1148 0x0ea00b00, 0x0fb00f50, "vfma%c.f64\t%z1, %z2, %z0"}, 1149 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA), 1150 0x0ea00a40, 0x0fb00f50, "vfms%c.f32\t%y1, %y2, %y0"}, 1151 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA), 1152 0x0ea00b40, 0x0fb00f50, "vfms%c.f64\t%z1, %z2, %z0"}, 1153 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA), 1154 0x0e900a40, 0x0fb00f50, "vfnma%c.f32\t%y1, %y2, %y0"}, 1155 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA), 1156 0x0e900b40, 0x0fb00f50, "vfnma%c.f64\t%z1, %z2, %z0"}, 1157 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA), 1158 0x0e900a00, 0x0fb00f50, "vfnms%c.f32\t%y1, %y2, %y0"}, 1159 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA), 1160 0x0e900b00, 0x0fb00f50, "vfnms%c.f64\t%z1, %z2, %z0"}, 1161 1162 /* FP v5. */ 1163 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 1164 0xfe000a00, 0xff800f50, "vsel%20-21c%u.f32\t%y1, %y2, %y0"}, 1165 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 1166 0xfe000b00, 0xff800f50, "vsel%20-21c%u.f64\t%z1, %z2, %z0"}, 1167 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 1168 0xfe800a00, 0xffb00f50, "vmaxnm%u.f32\t%y1, %y2, %y0"}, 1169 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 1170 0xfe800b00, 0xffb00f50, "vmaxnm%u.f64\t%z1, %z2, %z0"}, 1171 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 1172 0xfe800a40, 0xffb00f50, "vminnm%u.f32\t%y1, %y2, %y0"}, 1173 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 1174 0xfe800b40, 0xffb00f50, "vminnm%u.f64\t%z1, %z2, %z0"}, 1175 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 1176 0xfebc0a40, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f32\t%y1, %y0"}, 1177 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 1178 0xfebc0b40, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f64\t%y1, %z0"}, 1179 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 1180 0x0eb60a40, 0x0fbe0f50, "vrint%7,16??xzr%c.f32\t%y1, %y0"}, 1181 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 1182 0x0eb60b40, 0x0fbe0f50, "vrint%7,16??xzr%c.f64\t%z1, %z0"}, 1183 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 1184 0xfeb80a40, 0xffbc0fd0, "vrint%16-17?mpna%u.f32\t%y1, %y0"}, 1185 {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 1186 0xfeb80b40, 0xffbc0fd0, "vrint%16-17?mpna%u.f64\t%z1, %z0"}, 1187 1188 {ANY, ARM_FEATURE_CORE_LOW (0), SENTINEL_GENERIC_START, 0, "" }, 1189 /* ARMv8.3 AdvSIMD instructions in the space of coprocessor 8. */ 1190 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A), 1191 0xfc800800, 0xfeb00f10, "vcadd%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%24?29%24'70"}, 1192 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A), 1193 0xfc900800, 0xfeb00f10, "vcadd%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%24?29%24'70"}, 1194 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A), 1195 0xfc200800, 0xff300f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%23'90"}, 1196 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A), 1197 0xfd200800, 0xff300f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3,5V, #%23?21%23?780"}, 1198 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A), 1199 0xfc300800, 0xff300f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%23'90"}, 1200 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A), 1201 0xfd300800, 0xff300f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5V, #%23?21%23?780"}, 1202 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A), 1203 0xfe000800, 0xffa00f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3D[%5?10], #%20'90"}, 1204 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A), 1205 0xfe200800, 0xffa00f10, "vcmla%c.f16\t%12-15,22V, %16-19,7V, %0-3D[%5?10], #%20?21%20?780"}, 1206 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A), 1207 0xfe800800, 0xffa00f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5D[0], #%20'90"}, 1208 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A), 1209 0xfea00800, 0xffa00f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5D[0], #%20?21%20?780"}, 1210 1211 /* BFloat16 instructions. */ 1212 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16), 1213 0x0eb30940, 0x0fbf0f50, "vcvt%7?tb%b.bf16.f32\t%y1, %y0"}, 1214 1215 /* Dot Product instructions in the space of coprocessor 13. */ 1216 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD), 1217 0xfc200d00, 0xffb00f00, "v%4?usdot.%4?us8\t%12-15,22V, %16-19,7V, %0-3,5V"}, 1218 {ANY, ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD), 1219 0xfe200d00, 0xff200f00, "v%4?usdot.%4?us8\t%12-15,22V, %16-19,7V, %0-3D[%5?10]"}, 1220 1221 /* ARMv8.2 FMAC Long instructions in the space of coprocessor 8. */ 1222 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A), 1223 0xfc200810, 0xffb00f50, "vfmal.f16\t%12-15,22D, s%7,16-19d, s%5,0-3d"}, 1224 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A), 1225 0xfca00810, 0xffb00f50, "vfmsl.f16\t%12-15,22D, s%7,16-19d, s%5,0-3d"}, 1226 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A), 1227 0xfc200850, 0xffb00f50, "vfmal.f16\t%12-15,22Q, d%16-19,7d, d%0-3,5d"}, 1228 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A), 1229 0xfca00850, 0xffb00f50, "vfmsl.f16\t%12-15,22Q, d%16-19,7d, d%0-3,5d"}, 1230 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A), 1231 0xfe000810, 0xffb00f50, "vfmal.f16\t%12-15,22D, s%7,16-19d, s%5,0-2d[%3d]"}, 1232 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A), 1233 0xfe100810, 0xffb00f50, "vfmsl.f16\t%12-15,22D, s%7,16-19d, s%5,0-2d[%3d]"}, 1234 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A), 1235 0xfe000850, 0xffb00f50, "vfmal.f16\t%12-15,22Q, d%16-19,7d, d%0-2d[%3,5d]"}, 1236 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A), 1237 0xfe100850, 0xffb00f50, "vfmsl.f16\t%12-15,22Q, d%16-19,7d, d%0-2d[%3,5d]"}, 1238 1239 /* ARMv8.2 half-precision Floating point coprocessor 9 (VFP) instructions. 1240 cp_num: bit <11:8> == 0b1001. 1241 cond: bit <31:28> == 0b1110, otherwise, it's UNPREDICTABLE. */ 1242 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1243 0x0eb009c0, 0x0fbf0fd0, "vabs%c.f16\t%y1, %y0"}, 1244 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1245 0x0e300900, 0x0fb00f50, "vadd%c.f16\t%y1, %y2, %y0"}, 1246 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1247 0x0eb40940, 0x0fbf0f50, "vcmp%7'e%c.f16\t%y1, %y0"}, 1248 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1249 0x0eb50940, 0x0fbf0f70, "vcmp%7'e%c.f16\t%y1, #0.0"}, 1250 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1251 0x0eba09c0, 0x0fbe0fd0, "vcvt%c.f16.%16?us%7?31%7?26\t%y1, %y1, #%5,0-3k"}, 1252 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1253 0x0ebe09c0, 0x0fbe0fd0, "vcvt%c.%16?us%7?31%7?26.f16\t%y1, %y1, #%5,0-3k"}, 1254 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1255 0x0ebc0940, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f16\t%y1, %y0"}, 1256 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1257 0x0eb80940, 0x0fbf0f50, "vcvt%c.f16.%7?su32\t%y1, %y0"}, 1258 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1259 0xfebc0940, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f16\t%y1, %y0"}, 1260 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1261 0x0e800900, 0x0fb00f50, "vdiv%c.f16\t%y1, %y2, %y0"}, 1262 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1263 0x0ea00900, 0x0fb00f50, "vfma%c.f16\t%y1, %y2, %y0"}, 1264 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1265 0x0ea00940, 0x0fb00f50, "vfms%c.f16\t%y1, %y2, %y0"}, 1266 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1267 0x0e900940, 0x0fb00f50, "vfnma%c.f16\t%y1, %y2, %y0"}, 1268 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1269 0x0e900900, 0x0fb00f50, "vfnms%c.f16\t%y1, %y2, %y0"}, 1270 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1271 0xfeb00ac0, 0xffbf0fd0, "vins.f16\t%y1, %y0"}, 1272 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1273 0xfeb00a40, 0xffbf0fd0, "vmovx%c.f16\t%y1, %y0"}, 1274 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1275 0x0d100900, 0x0f300f00, "vldr%c.16\t%y1, %A"}, 1276 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1277 0x0d000900, 0x0f300f00, "vstr%c.16\t%y1, %A"}, 1278 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1279 0xfe800900, 0xffb00f50, "vmaxnm%c.f16\t%y1, %y2, %y0"}, 1280 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1281 0xfe800940, 0xffb00f50, "vminnm%c.f16\t%y1, %y2, %y0"}, 1282 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1283 0x0e000900, 0x0fb00f50, "vmla%c.f16\t%y1, %y2, %y0"}, 1284 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1285 0x0e000940, 0x0fb00f50, "vmls%c.f16\t%y1, %y2, %y0"}, 1286 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1287 0x0e100910, 0x0ff00f7f, "vmov%c.f16\t%12-15r, %y2"}, 1288 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1289 0x0e000910, 0x0ff00f7f, "vmov%c.f16\t%y2, %12-15r"}, 1290 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1291 0xeb00900, 0x0fb00ff0, "vmov%c.f16\t%y1, #%0-3,16-19E"}, 1292 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1293 0x0e200900, 0x0fb00f50, "vmul%c.f16\t%y1, %y2, %y0"}, 1294 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1295 0x0eb10940, 0x0fbf0fd0, "vneg%c.f16\t%y1, %y0"}, 1296 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1297 0x0e100940, 0x0fb00f50, "vnmla%c.f16\t%y1, %y2, %y0"}, 1298 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1299 0x0e100900, 0x0fb00f50, "vnmls%c.f16\t%y1, %y2, %y0"}, 1300 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1301 0x0e200940, 0x0fb00f50, "vnmul%c.f16\t%y1, %y2, %y0"}, 1302 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1303 0x0eb60940, 0x0fbe0f50, "vrint%7,16??xzr%c.f16\t%y1, %y0"}, 1304 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1305 0xfeb80940, 0xffbc0fd0, "vrint%16-17?mpna%u.f16\t%y1, %y0"}, 1306 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1307 0xfe000900, 0xff800f50, "vsel%20-21c%u.f16\t%y1, %y2, %y0"}, 1308 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1309 0x0eb109c0, 0x0fbf0fd0, "vsqrt%c.f16\t%y1, %y0"}, 1310 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1311 0x0e300940, 0x0fb00f50, "vsub%c.f16\t%y1, %y2, %y0"}, 1312 1313 /* ARMv8.3 javascript conversion instruction. */ 1314 {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A), 1315 0x0eb90bc0, 0x0fbf0fd0, "vjcvt%c.s32.f64\t%y1, %z0"}, 1316 1317 {ANY, ARM_FEATURE_CORE_LOW (0), 0, 0, 0} 1318 }; 1319 1320 /* Generic coprocessor instructions. These are only matched if a more specific 1321 SIMD or co-processor instruction does not match first. */ 1322 1323 static const struct sopcode32 generic_coprocessor_opcodes[] = 1324 { 1325 /* Generic coprocessor instructions. */ 1326 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5E), 1327 0x0c400000, 0x0ff00000, "mcrr%c\t%8-11d, %4-7d, %12-15R, %16-19r, cr%0-3d"}, 1328 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5E), 1329 0x0c500000, 0x0ff00000, 1330 "mrrc%c\t%8-11d, %4-7d, %12-15Ru, %16-19Ru, cr%0-3d"}, 1331 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2), 1332 0x0e000000, 0x0f000010, 1333 "cdp%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"}, 1334 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2), 1335 0x0e10f010, 0x0f10f010, 1336 "mrc%c\t%8-11d, %21-23d, APSR_nzcv, cr%16-19d, cr%0-3d, {%5-7d}"}, 1337 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2), 1338 0x0e100010, 0x0f100010, 1339 "mrc%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"}, 1340 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2), 1341 0x0e000010, 0x0f100010, 1342 "mcr%c\t%8-11d, %21-23d, %12-15R, cr%16-19d, cr%0-3d, {%5-7d}"}, 1343 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2), 1344 0x0c000000, 0x0e100000, "stc%22'l%c\t%8-11d, cr%12-15d, %A"}, 1345 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V2), 1346 0x0c100000, 0x0e100000, "ldc%22'l%c\t%8-11d, cr%12-15d, %A"}, 1347 1348 /* V6 coprocessor instructions. */ 1349 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1350 0xfc500000, 0xfff00000, 1351 "mrrc2%c\t%8-11d, %4-7d, %12-15Ru, %16-19Ru, cr%0-3d"}, 1352 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1353 0xfc400000, 0xfff00000, 1354 "mcrr2%c\t%8-11d, %4-7d, %12-15R, %16-19R, cr%0-3d"}, 1355 1356 /* V5 coprocessor instructions. */ 1357 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5), 1358 0xfc100000, 0xfe100000, "ldc2%22'l%c\t%8-11d, cr%12-15d, %A"}, 1359 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5), 1360 0xfc000000, 0xfe100000, "stc2%22'l%c\t%8-11d, cr%12-15d, %A"}, 1361 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5), 1362 0xfe000000, 0xff000010, 1363 "cdp2%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"}, 1364 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5), 1365 0xfe000010, 0xff100010, 1366 "mcr2%c\t%8-11d, %21-23d, %12-15R, cr%16-19d, cr%0-3d, {%5-7d}"}, 1367 {ANY, ARM_FEATURE_CORE_LOW (ARM_EXT_V5), 1368 0xfe100010, 0xff100010, 1369 "mrc2%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"}, 1370 1371 {ANY, ARM_FEATURE_CORE_LOW (0), 0, 0, 0} 1372 }; 1373 1374 /* Neon opcode table: This does not encode the top byte -- that is 1375 checked by the print_insn_neon routine, as it depends on whether we are 1376 doing thumb32 or arm32 disassembly. */ 1377 1378 /* print_insn_neon recognizes the following format control codes: 1379 1380 %% % 1381 1382 %c print condition code 1383 %u print condition code (unconditional in ARM mode, 1384 UNPREDICTABLE if not AL in Thumb) 1385 %A print v{st,ld}[1234] operands 1386 %B print v{st,ld}[1234] any one operands 1387 %C print v{st,ld}[1234] single->all operands 1388 %D print scalar 1389 %E print vmov, vmvn, vorr, vbic encoded constant 1390 %F print vtbl,vtbx register list 1391 1392 %<bitfield>r print as an ARM register 1393 %<bitfield>d print the bitfield in decimal 1394 %<bitfield>e print the 2^N - bitfield in decimal 1395 %<bitfield>D print as a NEON D register 1396 %<bitfield>Q print as a NEON Q register 1397 %<bitfield>R print as a NEON D or Q register 1398 %<bitfield>Sn print byte scaled width limited by n 1399 %<bitfield>Tn print short scaled width limited by n 1400 %<bitfield>Un print long scaled width limited by n 1401 1402 %<bitfield>'c print specified char iff bitfield is all ones 1403 %<bitfield>`c print specified char iff bitfield is all zeroes 1404 %<bitfield>?ab... select from array of values in big endian order. */ 1405 1406 static const struct opcode32 neon_opcodes[] = 1407 { 1408 /* Extract. */ 1409 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1410 0xf2b00840, 0xffb00850, 1411 "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"}, 1412 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1413 0xf2b00000, 0xffb00810, 1414 "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"}, 1415 1416 /* Data transfer between ARM and NEON registers. */ 1417 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1418 0x0e800b10, 0x1ff00f70, "vdup%c.32\t%16-19,7D, %12-15r"}, 1419 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1420 0x0e800b30, 0x1ff00f70, "vdup%c.16\t%16-19,7D, %12-15r"}, 1421 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1422 0x0ea00b10, 0x1ff00f70, "vdup%c.32\t%16-19,7Q, %12-15r"}, 1423 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1424 0x0ea00b30, 0x1ff00f70, "vdup%c.16\t%16-19,7Q, %12-15r"}, 1425 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1426 0x0ec00b10, 0x1ff00f70, "vdup%c.8\t%16-19,7D, %12-15r"}, 1427 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1428 0x0ee00b10, 0x1ff00f70, "vdup%c.8\t%16-19,7Q, %12-15r"}, 1429 1430 /* Move data element to all lanes. */ 1431 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1432 0xf3b40c00, 0xffb70f90, "vdup%c.32\t%12-15,22R, %0-3,5D[%19d]"}, 1433 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1434 0xf3b20c00, 0xffb30f90, "vdup%c.16\t%12-15,22R, %0-3,5D[%18-19d]"}, 1435 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1436 0xf3b10c00, 0xffb10f90, "vdup%c.8\t%12-15,22R, %0-3,5D[%17-19d]"}, 1437 1438 /* Table lookup. */ 1439 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1440 0xf3b00800, 0xffb00c50, "vtbl%c.8\t%12-15,22D, %F, %0-3,5D"}, 1441 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1442 0xf3b00840, 0xffb00c50, "vtbx%c.8\t%12-15,22D, %F, %0-3,5D"}, 1443 1444 /* Half-precision conversions. */ 1445 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16), 1446 0xf3b60600, 0xffbf0fd0, "vcvt%c.f16.f32\t%12-15,22D, %0-3,5Q"}, 1447 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16), 1448 0xf3b60700, 0xffbf0fd0, "vcvt%c.f32.f16\t%12-15,22Q, %0-3,5D"}, 1449 1450 /* NEON fused multiply add instructions. */ 1451 {ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA), 1452 0xf2000c10, 0xffb00f10, "vfma%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1453 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1454 0xf2100c10, 0xffb00f10, "vfma%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1455 {ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA), 1456 0xf2200c10, 0xffb00f10, "vfms%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1457 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1458 0xf2300c10, 0xffb00f10, "vfms%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1459 1460 /* BFloat16 instructions. */ 1461 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16), 1462 0xfc000d00, 0xffb00f10, "vdot.bf16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1463 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16), 1464 0xfe000d00, 0xffb00f10, "vdot.bf16\t%12-15,22R, %16-19,7R, d%0-3d[%5d]"}, 1465 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16), 1466 0xfc000c40, 0xffb00f50, "vmmla.bf16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1467 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16), 1468 0xf3b60640, 0xffbf0fd0, "vcvt%c.bf16.f32\t%12-15,22D, %0-3,5Q"}, 1469 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16), 1470 0xfc300810, 0xffb00f10, "vfma%6?tb.bf16\t%12-15,22Q, %16-19,7Q, %0-3,5Q"}, 1471 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_BF16), 1472 0xfe300810, 0xffb00f10, "vfma%6?tb.bf16\t%12-15,22Q, %16-19,7Q, %0-2D[%3,5d]"}, 1473 1474 /* Matrix Multiply instructions. */ 1475 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM), 1476 0xfc200c40, 0xffb00f50, "vsmmla.s8\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1477 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM), 1478 0xfc200c50, 0xffb00f50, "vummla.u8\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1479 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM), 1480 0xfca00c40, 0xffb00f50, "vusmmla.s8\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1481 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM), 1482 0xfca00d00, 0xffb00f10, "vusdot.s8\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1483 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM), 1484 0xfe800d00, 0xffb00f10, "vusdot.s8\t%12-15,22R, %16-19,7R, d%0-3d[%5d]"}, 1485 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM), 1486 0xfe800d10, 0xffb00f10, "vsudot.u8\t%12-15,22R, %16-19,7R, d%0-3d[%5d]"}, 1487 1488 /* Two registers, miscellaneous. */ 1489 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8), 1490 0xf3ba0400, 0xffbf0c10, "vrint%7-9?p?m?zaxn%u.f32\t%12-15,22R, %0-3,5R"}, 1491 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1492 0xf3b60400, 0xffbf0c10, "vrint%7-9?p?m?zaxn%u.f16\t%12-15,22R, %0-3,5R"}, 1493 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8), 1494 0xf3bb0000, 0xffbf0c10, "vcvt%8-9?mpna%u.%7?us32.f32\t%12-15,22R, %0-3,5R"}, 1495 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1496 0xf3b70000, 0xffbf0c10, "vcvt%8-9?mpna%u.%7?us16.f16\t%12-15,22R, %0-3,5R"}, 1497 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1498 0xf3b00300, 0xffbf0fd0, "aese%u.8\t%12-15,22Q, %0-3,5Q"}, 1499 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1500 0xf3b00340, 0xffbf0fd0, "aesd%u.8\t%12-15,22Q, %0-3,5Q"}, 1501 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1502 0xf3b00380, 0xffbf0fd0, "aesmc%u.8\t%12-15,22Q, %0-3,5Q"}, 1503 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1504 0xf3b003c0, 0xffbf0fd0, "aesimc%u.8\t%12-15,22Q, %0-3,5Q"}, 1505 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1506 0xf3b902c0, 0xffbf0fd0, "sha1h%u.32\t%12-15,22Q, %0-3,5Q"}, 1507 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1508 0xf3ba0380, 0xffbf0fd0, "sha1su1%u.32\t%12-15,22Q, %0-3,5Q"}, 1509 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1510 0xf3ba03c0, 0xffbf0fd0, "sha256su0%u.32\t%12-15,22Q, %0-3,5Q"}, 1511 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1512 0xf2880a10, 0xfebf0fd0, "vmovl%c.%24?us8\t%12-15,22Q, %0-3,5D"}, 1513 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1514 0xf2900a10, 0xfebf0fd0, "vmovl%c.%24?us16\t%12-15,22Q, %0-3,5D"}, 1515 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1516 0xf2a00a10, 0xfebf0fd0, "vmovl%c.%24?us32\t%12-15,22Q, %0-3,5D"}, 1517 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1518 0xf3b00500, 0xffbf0f90, "vcnt%c.8\t%12-15,22R, %0-3,5R"}, 1519 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1520 0xf3b00580, 0xffbf0f90, "vmvn%c\t%12-15,22R, %0-3,5R"}, 1521 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1522 0xf3b20000, 0xffbf0f90, "vswp%c\t%12-15,22R, %0-3,5R"}, 1523 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1524 0xf3b20200, 0xffb30fd0, "vmovn%c.i%18-19T2\t%12-15,22D, %0-3,5Q"}, 1525 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1526 0xf3b20240, 0xffb30fd0, "vqmovun%c.s%18-19T2\t%12-15,22D, %0-3,5Q"}, 1527 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1528 0xf3b20280, 0xffb30fd0, "vqmovn%c.s%18-19T2\t%12-15,22D, %0-3,5Q"}, 1529 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1530 0xf3b202c0, 0xffb30fd0, "vqmovn%c.u%18-19T2\t%12-15,22D, %0-3,5Q"}, 1531 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1532 0xf3b20300, 0xffb30fd0, 1533 "vshll%c.i%18-19S2\t%12-15,22Q, %0-3,5D, #%18-19S2"}, 1534 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1535 0xf3bb0400, 0xffbf0e90, "vrecpe%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"}, 1536 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1537 0xf3b70400, 0xffbf0e90, "vrecpe%c.%8?fu16\t%12-15,22R, %0-3,5R"}, 1538 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1539 0xf3bb0480, 0xffbf0e90, "vrsqrte%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"}, 1540 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1541 0xf3b70480, 0xffbf0e90, "vrsqrte%c.%8?fu16\t%12-15,22R, %0-3,5R"}, 1542 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1543 0xf3b00000, 0xffb30f90, "vrev64%c.%18-19S2\t%12-15,22R, %0-3,5R"}, 1544 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1545 0xf3b00080, 0xffb30f90, "vrev32%c.%18-19S2\t%12-15,22R, %0-3,5R"}, 1546 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1547 0xf3b00100, 0xffb30f90, "vrev16%c.%18-19S2\t%12-15,22R, %0-3,5R"}, 1548 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1549 0xf3b00400, 0xffb30f90, "vcls%c.s%18-19S2\t%12-15,22R, %0-3,5R"}, 1550 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1551 0xf3b00480, 0xffb30f90, "vclz%c.i%18-19S2\t%12-15,22R, %0-3,5R"}, 1552 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1553 0xf3b00700, 0xffb30f90, "vqabs%c.s%18-19S2\t%12-15,22R, %0-3,5R"}, 1554 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1555 0xf3b00780, 0xffb30f90, "vqneg%c.s%18-19S2\t%12-15,22R, %0-3,5R"}, 1556 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1557 0xf3b20080, 0xffb30f90, "vtrn%c.%18-19S2\t%12-15,22R, %0-3,5R"}, 1558 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1559 0xf3b20100, 0xffb30f90, "vuzp%c.%18-19S2\t%12-15,22R, %0-3,5R"}, 1560 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1561 0xf3b20180, 0xffb30f90, "vzip%c.%18-19S2\t%12-15,22R, %0-3,5R"}, 1562 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1563 0xf3b10000, 0xffb30b90, "vcgt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"}, 1564 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1565 0xf3b10080, 0xffb30b90, "vcge%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"}, 1566 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1567 0xf3b10100, 0xffb30b90, "vceq%c.%10?fi%18-19S2\t%12-15,22R, %0-3,5R, #0"}, 1568 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1569 0xf3b10180, 0xffb30b90, "vcle%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"}, 1570 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1571 0xf3b10200, 0xffb30b90, "vclt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"}, 1572 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1573 0xf3b10300, 0xffb30b90, "vabs%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"}, 1574 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1575 0xf3b10380, 0xffb30b90, "vneg%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"}, 1576 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1577 0xf3b00200, 0xffb30f10, "vpaddl%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"}, 1578 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1579 0xf3b00600, 0xffb30f10, "vpadal%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"}, 1580 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1581 0xf3bb0600, 0xffbf0e10, 1582 "vcvt%c.%7-8?usff%18-19Sa.%7-8?ffus%18-19Sa\t%12-15,22R, %0-3,5R"}, 1583 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1584 0xf3b70600, 0xffbf0e10, 1585 "vcvt%c.%7-8?usff16.%7-8?ffus16\t%12-15,22R, %0-3,5R"}, 1586 1587 /* Three registers of the same length. */ 1588 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1589 0xf2000c40, 0xffb00f50, "sha1c%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"}, 1590 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1591 0xf2100c40, 0xffb00f50, "sha1p%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"}, 1592 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1593 0xf2200c40, 0xffb00f50, "sha1m%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"}, 1594 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1595 0xf2300c40, 0xffb00f50, "sha1su0%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"}, 1596 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1597 0xf3000c40, 0xffb00f50, "sha256h%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"}, 1598 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1599 0xf3100c40, 0xffb00f50, "sha256h2%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"}, 1600 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1601 0xf3200c40, 0xffb00f50, "sha256su1%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"}, 1602 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8), 1603 0xf3000f10, 0xffb00f10, "vmaxnm%u.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1604 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1605 0xf3100f10, 0xffb00f10, "vmaxnm%u.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1606 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8), 1607 0xf3200f10, 0xffb00f10, "vminnm%u.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1608 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1609 0xf3300f10, 0xffb00f10, "vminnm%u.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1610 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1611 0xf2000110, 0xffb00f10, "vand%c\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1612 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1613 0xf2100110, 0xffb00f10, "vbic%c\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1614 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1615 0xf2200110, 0xffb00f10, "vorr%c\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1616 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1617 0xf2300110, 0xffb00f10, "vorn%c\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1618 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1619 0xf3000110, 0xffb00f10, "veor%c\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1620 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1621 0xf3100110, 0xffb00f10, "vbsl%c\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1622 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1623 0xf3200110, 0xffb00f10, "vbit%c\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1624 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1625 0xf3300110, 0xffb00f10, "vbif%c\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1626 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1627 0xf2000d00, 0xffb00f10, "vadd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1628 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1629 0xf2100d00, 0xffb00f10, "vadd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1630 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1631 0xf2000d10, 0xffb00f10, "vmla%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1632 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1633 0xf2100d10, 0xffb00f10, "vmla%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1634 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1635 0xf2000e00, 0xffb00f10, "vceq%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1636 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1637 0xf2100e00, 0xffb00f10, "vceq%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1638 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1639 0xf2000f00, 0xffb00f10, "vmax%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1640 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1641 0xf2100f00, 0xffb00f10, "vmax%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1642 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1643 0xf2000f10, 0xffb00f10, "vrecps%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1644 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1645 0xf2100f10, 0xffb00f10, "vrecps%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1646 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1647 0xf2200d00, 0xffb00f10, "vsub%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1648 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1649 0xf2300d00, 0xffb00f10, "vsub%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1650 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1651 0xf2200d10, 0xffb00f10, "vmls%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1652 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1653 0xf2300d10, 0xffb00f10, "vmls%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1654 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1655 0xf2200f00, 0xffb00f10, "vmin%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1656 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1657 0xf2300f00, 0xffb00f10, "vmin%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1658 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1659 0xf2200f10, 0xffb00f10, "vrsqrts%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1660 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1661 0xf2300f10, 0xffb00f10, "vrsqrts%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1662 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1663 0xf3000d00, 0xffb00f10, "vpadd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1664 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1665 0xf3100d00, 0xffb00f10, "vpadd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1666 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1667 0xf3000d10, 0xffb00f10, "vmul%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1668 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1669 0xf3100d10, 0xffb00f10, "vmul%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1670 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1671 0xf3000e00, 0xffb00f10, "vcge%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1672 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1673 0xf3100e00, 0xffb00f10, "vcge%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1674 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1675 0xf3000e10, 0xffb00f10, "vacge%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1676 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1677 0xf3100e10, 0xffb00f10, "vacge%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1678 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1679 0xf3000f00, 0xffb00f10, "vpmax%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1680 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1681 0xf3100f00, 0xffb00f10, "vpmax%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1682 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1683 0xf3200d00, 0xffb00f10, "vabd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1684 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1685 0xf3300d00, 0xffb00f10, "vabd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1686 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1687 0xf3200e00, 0xffb00f10, "vcgt%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1688 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1689 0xf3300e00, 0xffb00f10, "vcgt%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1690 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1691 0xf3200e10, 0xffb00f10, "vacgt%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1692 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1693 0xf3300e10, 0xffb00f10, "vacgt%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1694 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1695 0xf3200f00, 0xffb00f10, "vpmin%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1696 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1697 0xf3300f00, 0xffb00f10, "vpmin%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1698 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1699 0xf2000800, 0xff800f10, "vadd%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1700 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1701 0xf2000810, 0xff800f10, "vtst%c.%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1702 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1703 0xf2000900, 0xff800f10, "vmla%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1704 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1705 0xf2000b00, 0xff800f10, 1706 "vqdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1707 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1708 0xf2000b10, 0xff800f10, 1709 "vpadd%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1710 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1711 0xf3000800, 0xff800f10, "vsub%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1712 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1713 0xf3000810, 0xff800f10, "vceq%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1714 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1715 0xf3000900, 0xff800f10, "vmls%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1716 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1717 0xf3000b00, 0xff800f10, 1718 "vqrdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1719 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1720 0xf2000000, 0xfe800f10, 1721 "vhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1722 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1723 0xf2000010, 0xfe800f10, 1724 "vqadd%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1725 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1726 0xf2000100, 0xfe800f10, 1727 "vrhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1728 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1729 0xf2000200, 0xfe800f10, 1730 "vhsub%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1731 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1732 0xf2000210, 0xfe800f10, 1733 "vqsub%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1734 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1735 0xf2000300, 0xfe800f10, 1736 "vcgt%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1737 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1738 0xf2000310, 0xfe800f10, 1739 "vcge%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1740 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1741 0xf2000400, 0xfe800f10, 1742 "vshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"}, 1743 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1744 0xf2000410, 0xfe800f10, 1745 "vqshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"}, 1746 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1747 0xf2000500, 0xfe800f10, 1748 "vrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"}, 1749 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1750 0xf2000510, 0xfe800f10, 1751 "vqrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"}, 1752 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1753 0xf2000600, 0xfe800f10, 1754 "vmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1755 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1756 0xf2000610, 0xfe800f10, 1757 "vmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1758 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1759 0xf2000700, 0xfe800f10, 1760 "vabd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1761 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1762 0xf2000710, 0xfe800f10, 1763 "vaba%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1764 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1765 0xf2000910, 0xfe800f10, 1766 "vmul%c.%24?pi%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1767 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1768 0xf2000a00, 0xfe800f10, 1769 "vpmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1770 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1771 0xf2000a10, 0xfe800f10, 1772 "vpmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1773 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA), 1774 0xf3000b10, 0xff800f10, 1775 "vqrdmlah%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1776 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA), 1777 0xf3000c10, 0xff800f10, 1778 "vqrdmlsh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1779 1780 /* One register and an immediate value. */ 1781 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1782 0xf2800e10, 0xfeb80fb0, "vmov%c.i8\t%12-15,22R, %E"}, 1783 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1784 0xf2800e30, 0xfeb80fb0, "vmov%c.i64\t%12-15,22R, %E"}, 1785 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1786 0xf2800f10, 0xfeb80fb0, "vmov%c.f32\t%12-15,22R, %E"}, 1787 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1788 0xf2800810, 0xfeb80db0, "vmov%c.i16\t%12-15,22R, %E"}, 1789 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1790 0xf2800830, 0xfeb80db0, "vmvn%c.i16\t%12-15,22R, %E"}, 1791 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1792 0xf2800910, 0xfeb80db0, "vorr%c.i16\t%12-15,22R, %E"}, 1793 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1794 0xf2800930, 0xfeb80db0, "vbic%c.i16\t%12-15,22R, %E"}, 1795 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1796 0xf2800c10, 0xfeb80eb0, "vmov%c.i32\t%12-15,22R, %E"}, 1797 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1798 0xf2800c30, 0xfeb80eb0, "vmvn%c.i32\t%12-15,22R, %E"}, 1799 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1800 0xf2800110, 0xfeb809b0, "vorr%c.i32\t%12-15,22R, %E"}, 1801 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1802 0xf2800130, 0xfeb809b0, "vbic%c.i32\t%12-15,22R, %E"}, 1803 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1804 0xf2800010, 0xfeb808b0, "vmov%c.i32\t%12-15,22R, %E"}, 1805 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1806 0xf2800030, 0xfeb808b0, "vmvn%c.i32\t%12-15,22R, %E"}, 1807 1808 /* Two registers and a shift amount. */ 1809 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1810 0xf2880810, 0xffb80fd0, "vshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"}, 1811 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1812 0xf2880850, 0xffb80fd0, "vrshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"}, 1813 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1814 0xf2880810, 0xfeb80fd0, "vqshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"}, 1815 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1816 0xf2880850, 0xfeb80fd0, "vqrshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"}, 1817 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1818 0xf2880910, 0xfeb80fd0, "vqshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"}, 1819 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1820 0xf2880950, 0xfeb80fd0, 1821 "vqrshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"}, 1822 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1823 0xf2880a10, 0xfeb80fd0, "vshll%c.%24?us8\t%12-15,22Q, %0-3,5D, #%16-18d"}, 1824 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1825 0xf2900810, 0xffb00fd0, "vshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"}, 1826 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1827 0xf2900850, 0xffb00fd0, "vrshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"}, 1828 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1829 0xf2880510, 0xffb80f90, "vshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"}, 1830 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1831 0xf3880410, 0xffb80f90, "vsri%c.8\t%12-15,22R, %0-3,5R, #%16-18e"}, 1832 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1833 0xf3880510, 0xffb80f90, "vsli%c.8\t%12-15,22R, %0-3,5R, #%16-18d"}, 1834 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1835 0xf3880610, 0xffb80f90, "vqshlu%c.s8\t%12-15,22R, %0-3,5R, #%16-18d"}, 1836 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1837 0xf2900810, 0xfeb00fd0, "vqshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"}, 1838 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1839 0xf2900850, 0xfeb00fd0, "vqrshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"}, 1840 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1841 0xf2900910, 0xfeb00fd0, "vqshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"}, 1842 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1843 0xf2900950, 0xfeb00fd0, 1844 "vqrshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"}, 1845 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1846 0xf2900a10, 0xfeb00fd0, "vshll%c.%24?us16\t%12-15,22Q, %0-3,5D, #%16-19d"}, 1847 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1848 0xf2880010, 0xfeb80f90, "vshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"}, 1849 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1850 0xf2880110, 0xfeb80f90, "vsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"}, 1851 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1852 0xf2880210, 0xfeb80f90, "vrshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"}, 1853 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1854 0xf2880310, 0xfeb80f90, "vrsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"}, 1855 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1856 0xf2880710, 0xfeb80f90, "vqshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"}, 1857 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1858 0xf2a00810, 0xffa00fd0, "vshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"}, 1859 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1860 0xf2a00850, 0xffa00fd0, "vrshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"}, 1861 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1862 0xf2900510, 0xffb00f90, "vshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"}, 1863 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1864 0xf3900410, 0xffb00f90, "vsri%c.16\t%12-15,22R, %0-3,5R, #%16-19e"}, 1865 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1866 0xf3900510, 0xffb00f90, "vsli%c.16\t%12-15,22R, %0-3,5R, #%16-19d"}, 1867 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1868 0xf3900610, 0xffb00f90, "vqshlu%c.s16\t%12-15,22R, %0-3,5R, #%16-19d"}, 1869 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1870 0xf2a00a10, 0xfea00fd0, "vshll%c.%24?us32\t%12-15,22Q, %0-3,5D, #%16-20d"}, 1871 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1872 0xf2900010, 0xfeb00f90, "vshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"}, 1873 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1874 0xf2900110, 0xfeb00f90, "vsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"}, 1875 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1876 0xf2900210, 0xfeb00f90, "vrshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"}, 1877 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1878 0xf2900310, 0xfeb00f90, "vrsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"}, 1879 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1880 0xf2900710, 0xfeb00f90, "vqshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"}, 1881 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1882 0xf2a00810, 0xfea00fd0, "vqshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"}, 1883 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1884 0xf2a00850, 0xfea00fd0, "vqrshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"}, 1885 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1886 0xf2a00910, 0xfea00fd0, "vqshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"}, 1887 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1888 0xf2a00950, 0xfea00fd0, 1889 "vqrshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"}, 1890 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1891 0xf2a00510, 0xffa00f90, "vshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"}, 1892 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1893 0xf3a00410, 0xffa00f90, "vsri%c.32\t%12-15,22R, %0-3,5R, #%16-20e"}, 1894 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1895 0xf3a00510, 0xffa00f90, "vsli%c.32\t%12-15,22R, %0-3,5R, #%16-20d"}, 1896 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1897 0xf3a00610, 0xffa00f90, "vqshlu%c.s32\t%12-15,22R, %0-3,5R, #%16-20d"}, 1898 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1899 0xf2a00010, 0xfea00f90, "vshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"}, 1900 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1901 0xf2a00110, 0xfea00f90, "vsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"}, 1902 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1903 0xf2a00210, 0xfea00f90, "vrshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"}, 1904 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1905 0xf2a00310, 0xfea00f90, "vrsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"}, 1906 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1907 0xf2a00710, 0xfea00f90, "vqshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"}, 1908 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1909 0xf2800590, 0xff800f90, "vshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"}, 1910 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1911 0xf3800490, 0xff800f90, "vsri%c.64\t%12-15,22R, %0-3,5R, #%16-21e"}, 1912 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1913 0xf3800590, 0xff800f90, "vsli%c.64\t%12-15,22R, %0-3,5R, #%16-21d"}, 1914 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1915 0xf3800690, 0xff800f90, "vqshlu%c.s64\t%12-15,22R, %0-3,5R, #%16-21d"}, 1916 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1917 0xf2800090, 0xfe800f90, "vshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"}, 1918 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1919 0xf2800190, 0xfe800f90, "vsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"}, 1920 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1921 0xf2800290, 0xfe800f90, "vrshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"}, 1922 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1923 0xf2800390, 0xfe800f90, "vrsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"}, 1924 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1925 0xf2800790, 0xfe800f90, "vqshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"}, 1926 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1927 0xf2a00e10, 0xfea00e90, 1928 "vcvt%c.%24,8?usff32.%24,8?ffus32\t%12-15,22R, %0-3,5R, #%16-20e"}, 1929 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1930 0xf2a00c10, 0xfea00e90, 1931 "vcvt%c.%24,8?usff16.%24,8?ffus16\t%12-15,22R, %0-3,5R, #%16-20e"}, 1932 1933 /* Three registers of different lengths. */ 1934 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1935 0xf2a00e00, 0xfeb00f50, "vmull%c.p64\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1936 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1937 0xf2800e00, 0xfea00f50, "vmull%c.p%20S0\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1938 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1939 0xf2800400, 0xff800f50, 1940 "vaddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"}, 1941 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1942 0xf2800600, 0xff800f50, 1943 "vsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"}, 1944 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1945 0xf2800900, 0xff800f50, 1946 "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1947 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1948 0xf2800b00, 0xff800f50, 1949 "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1950 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1951 0xf2800d00, 0xff800f50, 1952 "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1953 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1954 0xf3800400, 0xff800f50, 1955 "vraddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"}, 1956 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1957 0xf3800600, 0xff800f50, 1958 "vrsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"}, 1959 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1960 0xf2800000, 0xfe800f50, 1961 "vaddl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1962 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1963 0xf2800100, 0xfe800f50, 1964 "vaddw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"}, 1965 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1966 0xf2800200, 0xfe800f50, 1967 "vsubl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1968 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1969 0xf2800300, 0xfe800f50, 1970 "vsubw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"}, 1971 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1972 0xf2800500, 0xfe800f50, 1973 "vabal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1974 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1975 0xf2800700, 0xfe800f50, 1976 "vabdl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1977 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1978 0xf2800800, 0xfe800f50, 1979 "vmlal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1980 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1981 0xf2800a00, 0xfe800f50, 1982 "vmlsl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1983 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1984 0xf2800c00, 0xfe800f50, 1985 "vmull%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1986 1987 /* Two registers and a scalar. */ 1988 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1989 0xf2800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"}, 1990 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1991 0xf2800140, 0xff900f50, "vmla%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"}, 1992 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST), 1993 0xf2900140, 0xffb00f50, "vmla%c.f16\t%12-15,22D, %16-19,7D, %D"}, 1994 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1995 0xf2800340, 0xff800f50, "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"}, 1996 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1997 0xf2800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"}, 1998 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1999 0xf2800540, 0xff900f50, "vmls%c.f%20-21S6\t%12-15,22D, %16-19,7D, %D"}, 2000 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST), 2001 0xf2900540, 0xffb00f50, "vmls%c.f16\t%12-15,22D, %16-19,7D, %D"}, 2002 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2003 0xf2800740, 0xff800f50, "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"}, 2004 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2005 0xf2800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"}, 2006 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2007 0xf2800940, 0xff900f50, "vmul%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"}, 2008 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST), 2009 0xf2900940, 0xffb00f50, "vmul%c.f16\t%12-15,22D, %16-19,7D, %D"}, 2010 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2011 0xf2800b40, 0xff800f50, "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"}, 2012 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2013 0xf2800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"}, 2014 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2015 0xf2800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"}, 2016 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2017 0xf3800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"}, 2018 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2019 0xf3800140, 0xff900f50, "vmla%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"}, 2020 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST), 2021 0xf3900140, 0xffb00f50, "vmla%c.f16\t%12-15,22Q, %16-19,7Q, %D"}, 2022 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2023 0xf3800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"}, 2024 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2025 0xf3800540, 0xff900f50, "vmls%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"}, 2026 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST), 2027 0xf3900540, 0xffb00f50, "vmls%c.f16\t%12-15,22Q, %16-19,7Q, %D"}, 2028 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2029 0xf3800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"}, 2030 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2031 0xf3800940, 0xff900f50, "vmul%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"}, 2032 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST), 2033 0xf3900940, 0xffb00f50, "vmul%c.f16\t%12-15,22Q, %16-19,7Q, %D"}, 2034 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2035 0xf3800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"}, 2036 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2037 0xf3800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"}, 2038 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2039 0xf2800240, 0xfe800f50, 2040 "vmlal%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"}, 2041 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2042 0xf2800640, 0xfe800f50, 2043 "vmlsl%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"}, 2044 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2045 0xf2800a40, 0xfe800f50, 2046 "vmull%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"}, 2047 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA), 2048 0xf2800e40, 0xff800f50, 2049 "vqrdmlah%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"}, 2050 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA), 2051 0xf2800f40, 0xff800f50, 2052 "vqrdmlsh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"}, 2053 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA), 2054 0xf3800e40, 0xff800f50, 2055 "vqrdmlah%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"}, 2056 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA), 2057 0xf3800f40, 0xff800f50, 2058 "vqrdmlsh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D" 2059 }, 2060 2061 /* Element and structure load/store. */ 2062 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2063 0xf4a00fc0, 0xffb00fc0, "vld4%c.32\t%C"}, 2064 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2065 0xf4a00c00, 0xffb00f00, "vld1%c.%6-7S2\t%C"}, 2066 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2067 0xf4a00d00, 0xffb00f00, "vld2%c.%6-7S2\t%C"}, 2068 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2069 0xf4a00e00, 0xffb00f00, "vld3%c.%6-7S2\t%C"}, 2070 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2071 0xf4a00f00, 0xffb00f00, "vld4%c.%6-7S2\t%C"}, 2072 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2073 0xf4000200, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"}, 2074 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2075 0xf4000300, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"}, 2076 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2077 0xf4000400, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"}, 2078 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2079 0xf4000500, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"}, 2080 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2081 0xf4000600, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"}, 2082 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2083 0xf4000700, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"}, 2084 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2085 0xf4000800, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"}, 2086 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2087 0xf4000900, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"}, 2088 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2089 0xf4000a00, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"}, 2090 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2091 0xf4000000, 0xff900e00, "v%21?ls%21?dt4%c.%6-7S2\t%A"}, 2092 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2093 0xf4800000, 0xff900300, "v%21?ls%21?dt1%c.%10-11S2\t%B"}, 2094 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2095 0xf4800100, 0xff900300, "v%21?ls%21?dt2%c.%10-11S2\t%B"}, 2096 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2097 0xf4800200, 0xff900300, "v%21?ls%21?dt3%c.%10-11S2\t%B"}, 2098 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 2099 0xf4800300, 0xff900300, "v%21?ls%21?dt4%c.%10-11S2\t%B"}, 2100 2101 {ARM_FEATURE_CORE_LOW (0), 0 ,0, 0} 2102 }; 2103 2104 /* mve opcode table. */ 2105 2106 /* print_insn_mve recognizes the following format control codes: 2107 2108 %% % 2109 2110 %a print '+' or '-' or imm offset in vldr[bhwd] and 2111 vstr[bhwd] 2112 %c print condition code 2113 %d print addr mode of MVE vldr[bhw] and vstr[bhw] 2114 %u print 'U' (unsigned) or 'S' for various mve instructions 2115 %i print MVE predicate(s) for vpt and vpst 2116 %j print a 5-bit immediate from hw2[14:12,7:6] 2117 %k print 48 if the 7th position bit is set else print 64. 2118 %m print rounding mode for vcvt and vrint 2119 %n print vector comparison code for predicated instruction 2120 %s print size for various vcvt instructions 2121 %v print vector predicate for instruction in predicated 2122 block 2123 %o print offset scaled for vldr[hwd] and vstr[hwd] 2124 %w print writeback mode for MVE v{st,ld}[24] 2125 %B print v{st,ld}[24] any one operands 2126 %E print vmov, vmvn, vorr, vbic encoded constant 2127 %N print generic index for vmov 2128 %T print bottom ('b') or top ('t') of source register 2129 %X print exchange field in vmla* instructions 2130 2131 %<bitfield>r print as an ARM register 2132 %<bitfield>d print the bitfield in decimal 2133 %<bitfield>A print accumulate or not 2134 %<bitfield>c print bitfield as a condition code 2135 %<bitfield>C print bitfield as an inverted condition code 2136 %<bitfield>Q print as a MVE Q register 2137 %<bitfield>F print as a MVE S register 2138 %<bitfield>Z as %<>r but r15 is ZR instead of PC and r13 is 2139 UNPREDICTABLE 2140 2141 %<bitfield>S as %<>r but r15 or r13 is UNPREDICTABLE 2142 %<bitfield>s print size for vector predicate & non VMOV instructions 2143 %<bitfield>I print carry flag or not 2144 %<bitfield>i print immediate for vstr/vldr reg +/- imm 2145 %<bitfield>h print high half of 64-bit destination reg 2146 %<bitfield>k print immediate for vector conversion instruction 2147 %<bitfield>l print low half of 64-bit destination reg 2148 %<bitfield>o print rotate value for vcmul 2149 %<bitfield>u print immediate value for vddup/vdwdup 2150 %<bitfield>x print the bitfield in hex. 2151 */ 2152 2153 static const struct mopcode32 mve_opcodes[] = 2154 { 2155 /* MVE. */ 2156 2157 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2158 MVE_VPST, 2159 0xfe310f4d, 0xffbf1fff, 2160 "vpst%i" 2161 }, 2162 2163 /* Floating point VPT T1. */ 2164 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2165 MVE_VPT_FP_T1, 2166 0xee310f00, 0xefb10f50, 2167 "vpt%i.f%28s\t%n, %17-19Q, %1-3,5Q"}, 2168 /* Floating point VPT T2. */ 2169 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2170 MVE_VPT_FP_T2, 2171 0xee310f40, 0xefb10f50, 2172 "vpt%i.f%28s\t%n, %17-19Q, %0-3Z"}, 2173 2174 /* Vector VPT T1. */ 2175 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2176 MVE_VPT_VEC_T1, 2177 0xfe010f00, 0xff811f51, 2178 "vpt%i.i%20-21s\t%n, %17-19Q, %1-3,5Q"}, 2179 /* Vector VPT T2. */ 2180 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2181 MVE_VPT_VEC_T2, 2182 0xfe010f01, 0xff811f51, 2183 "vpt%i.u%20-21s\t%n, %17-19Q, %1-3,5Q"}, 2184 /* Vector VPT T3. */ 2185 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2186 MVE_VPT_VEC_T3, 2187 0xfe011f00, 0xff811f50, 2188 "vpt%i.s%20-21s\t%n, %17-19Q, %1-3,5Q"}, 2189 /* Vector VPT T4. */ 2190 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2191 MVE_VPT_VEC_T4, 2192 0xfe010f40, 0xff811f70, 2193 "vpt%i.i%20-21s\t%n, %17-19Q, %0-3Z"}, 2194 /* Vector VPT T5. */ 2195 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2196 MVE_VPT_VEC_T5, 2197 0xfe010f60, 0xff811f70, 2198 "vpt%i.u%20-21s\t%n, %17-19Q, %0-3Z"}, 2199 /* Vector VPT T6. */ 2200 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2201 MVE_VPT_VEC_T6, 2202 0xfe011f40, 0xff811f50, 2203 "vpt%i.s%20-21s\t%n, %17-19Q, %0-3Z"}, 2204 2205 /* Vector VBIC immediate. */ 2206 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2207 MVE_VBIC_IMM, 2208 0xef800070, 0xefb81070, 2209 "vbic%v.i%8-11s\t%13-15,22Q, %E"}, 2210 2211 /* Vector VBIC register. */ 2212 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2213 MVE_VBIC_REG, 2214 0xef100150, 0xffb11f51, 2215 "vbic%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2216 2217 /* Vector VABAV. */ 2218 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2219 MVE_VABAV, 2220 0xee800f01, 0xefc10f51, 2221 "vabav%v.%u%20-21s\t%12-15r, %17-19,7Q, %1-3,5Q"}, 2222 2223 /* Vector VABD floating point. */ 2224 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2225 MVE_VABD_FP, 2226 0xff200d40, 0xffa11f51, 2227 "vabd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2228 2229 /* Vector VABD. */ 2230 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2231 MVE_VABD_VEC, 2232 0xef000740, 0xef811f51, 2233 "vabd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2234 2235 /* Vector VABS floating point. */ 2236 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2237 MVE_VABS_FP, 2238 0xFFB10740, 0xFFB31FD1, 2239 "vabs%v.f%18-19s\t%13-15,22Q, %1-3,5Q"}, 2240 /* Vector VABS. */ 2241 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2242 MVE_VABS_VEC, 2243 0xffb10340, 0xffb31fd1, 2244 "vabs%v.s%18-19s\t%13-15,22Q, %1-3,5Q"}, 2245 2246 /* Vector VADD floating point T1. */ 2247 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2248 MVE_VADD_FP_T1, 2249 0xef000d40, 0xffa11f51, 2250 "vadd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2251 /* Vector VADD floating point T2. */ 2252 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2253 MVE_VADD_FP_T2, 2254 0xee300f40, 0xefb11f70, 2255 "vadd%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 2256 /* Vector VADD T1. */ 2257 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2258 MVE_VADD_VEC_T1, 2259 0xef000840, 0xff811f51, 2260 "vadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2261 /* Vector VADD T2. */ 2262 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2263 MVE_VADD_VEC_T2, 2264 0xee010f40, 0xff811f70, 2265 "vadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 2266 2267 /* Vector VADDLV. */ 2268 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2269 MVE_VADDLV, 2270 0xee890f00, 0xef8f1fd1, 2271 "vaddlv%5A%v.%u32\t%13-15l, %20-22h, %1-3Q"}, 2272 2273 /* Vector VADDV. */ 2274 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2275 MVE_VADDV, 2276 0xeef10f00, 0xeff31fd1, 2277 "vaddv%5A%v.%u%18-19s\t%13-15l, %1-3Q"}, 2278 2279 /* Vector VADC. */ 2280 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2281 MVE_VADC, 2282 0xee300f00, 0xffb10f51, 2283 "vadc%12I%v.i32\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2284 2285 /* Vector VAND. */ 2286 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2287 MVE_VAND, 2288 0xef000150, 0xffb11f51, 2289 "vand%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2290 2291 /* Vector VBRSR register. */ 2292 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2293 MVE_VBRSR, 2294 0xfe011e60, 0xff811f70, 2295 "vbrsr%v.%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 2296 2297 /* Vector VCADD floating point. */ 2298 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2299 MVE_VCADD_FP, 2300 0xfc800840, 0xfea11f51, 2301 "vcadd%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%24o"}, 2302 2303 /* Vector VCADD. */ 2304 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2305 MVE_VCADD_VEC, 2306 0xfe000f00, 0xff810f51, 2307 "vcadd%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%12o"}, 2308 2309 /* Vector VCLS. */ 2310 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2311 MVE_VCLS, 2312 0xffb00440, 0xffb31fd1, 2313 "vcls%v.s%18-19s\t%13-15,22Q, %1-3,5Q"}, 2314 2315 /* Vector VCLZ. */ 2316 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2317 MVE_VCLZ, 2318 0xffb004c0, 0xffb31fd1, 2319 "vclz%v.i%18-19s\t%13-15,22Q, %1-3,5Q"}, 2320 2321 /* Vector VCMLA. */ 2322 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2323 MVE_VCMLA_FP, 2324 0xfc200840, 0xfe211f51, 2325 "vcmla%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%23-24o"}, 2326 2327 /* Vector VCMP floating point T1. */ 2328 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2329 MVE_VCMP_FP_T1, 2330 0xee310f00, 0xeff1ef50, 2331 "vcmp%v.f%28s\t%n, %17-19Q, %1-3,5Q"}, 2332 2333 /* Vector VCMP floating point T2. */ 2334 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2335 MVE_VCMP_FP_T2, 2336 0xee310f40, 0xeff1ef50, 2337 "vcmp%v.f%28s\t%n, %17-19Q, %0-3Z"}, 2338 2339 /* Vector VCMP T1. */ 2340 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2341 MVE_VCMP_VEC_T1, 2342 0xfe010f00, 0xffc1ff51, 2343 "vcmp%v.i%20-21s\t%n, %17-19Q, %1-3,5Q"}, 2344 /* Vector VCMP T2. */ 2345 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2346 MVE_VCMP_VEC_T2, 2347 0xfe010f01, 0xffc1ff51, 2348 "vcmp%v.u%20-21s\t%n, %17-19Q, %1-3,5Q"}, 2349 /* Vector VCMP T3. */ 2350 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2351 MVE_VCMP_VEC_T3, 2352 0xfe011f00, 0xffc1ff50, 2353 "vcmp%v.s%20-21s\t%n, %17-19Q, %1-3,5Q"}, 2354 /* Vector VCMP T4. */ 2355 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2356 MVE_VCMP_VEC_T4, 2357 0xfe010f40, 0xffc1ff70, 2358 "vcmp%v.i%20-21s\t%n, %17-19Q, %0-3Z"}, 2359 /* Vector VCMP T5. */ 2360 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2361 MVE_VCMP_VEC_T5, 2362 0xfe010f60, 0xffc1ff70, 2363 "vcmp%v.u%20-21s\t%n, %17-19Q, %0-3Z"}, 2364 /* Vector VCMP T6. */ 2365 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2366 MVE_VCMP_VEC_T6, 2367 0xfe011f40, 0xffc1ff50, 2368 "vcmp%v.s%20-21s\t%n, %17-19Q, %0-3Z"}, 2369 2370 /* Vector VDUP. */ 2371 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2372 MVE_VDUP, 2373 0xeea00b10, 0xffb10f5f, 2374 "vdup%v.%5,22s\t%17-19,7Q, %12-15r"}, 2375 2376 /* Vector VEOR. */ 2377 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2378 MVE_VEOR, 2379 0xff000150, 0xffd11f51, 2380 "veor%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2381 2382 /* Vector VFMA, vector * scalar. */ 2383 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2384 MVE_VFMA_FP_SCALAR, 2385 0xee310e40, 0xefb11f70, 2386 "vfma%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 2387 2388 /* Vector VFMA floating point. */ 2389 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2390 MVE_VFMA_FP, 2391 0xef000c50, 0xffa11f51, 2392 "vfma%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2393 2394 /* Vector VFMS floating point. */ 2395 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2396 MVE_VFMS_FP, 2397 0xef200c50, 0xffa11f51, 2398 "vfms%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2399 2400 /* Vector VFMAS, vector * scalar. */ 2401 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2402 MVE_VFMAS_FP_SCALAR, 2403 0xee311e40, 0xefb11f70, 2404 "vfmas%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 2405 2406 /* Vector VHADD T1. */ 2407 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2408 MVE_VHADD_T1, 2409 0xef000040, 0xef811f51, 2410 "vhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2411 2412 /* Vector VHADD T2. */ 2413 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2414 MVE_VHADD_T2, 2415 0xee000f40, 0xef811f70, 2416 "vhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 2417 2418 /* Vector VHSUB T1. */ 2419 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2420 MVE_VHSUB_T1, 2421 0xef000240, 0xef811f51, 2422 "vhsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2423 2424 /* Vector VHSUB T2. */ 2425 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2426 MVE_VHSUB_T2, 2427 0xee001f40, 0xef811f70, 2428 "vhsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 2429 2430 /* Vector VCMUL. */ 2431 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2432 MVE_VCMUL_FP, 2433 0xee300e00, 0xefb10f50, 2434 "vcmul%v.f%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%0,12o"}, 2435 2436 /* Vector VCTP. */ 2437 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2438 MVE_VCTP, 2439 0xf000e801, 0xffc0ffff, 2440 "vctp%v.%20-21s\t%16-19r"}, 2441 2442 /* Vector VDUP. */ 2443 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2444 MVE_VDUP, 2445 0xeea00b10, 0xffb10f5f, 2446 "vdup%v.%5,22s\t%17-19,7Q, %12-15r"}, 2447 2448 /* Vector VRHADD. */ 2449 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2450 MVE_VRHADD, 2451 0xef000140, 0xef811f51, 2452 "vrhadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2453 2454 /* Vector VCVT. */ 2455 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2456 MVE_VCVT_FP_FIX_VEC, 2457 0xef800c50, 0xef801cd1, 2458 "vcvt%v.%s\t%13-15,22Q, %1-3,5Q, #%16-21k"}, 2459 2460 /* Vector VCVT. */ 2461 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2462 MVE_VCVT_BETWEEN_FP_INT, 2463 0xffb30640, 0xffb31e51, 2464 "vcvt%v.%s\t%13-15,22Q, %1-3,5Q"}, 2465 2466 /* Vector VCVT between single and half-precision float, bottom half. */ 2467 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2468 MVE_VCVT_FP_HALF_FP, 2469 0xee3f0e01, 0xefbf1fd1, 2470 "vcvtb%v.%s\t%13-15,22Q, %1-3,5Q"}, 2471 2472 /* Vector VCVT between single and half-precision float, top half. */ 2473 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2474 MVE_VCVT_FP_HALF_FP, 2475 0xee3f1e01, 0xefbf1fd1, 2476 "vcvtt%v.%s\t%13-15,22Q, %1-3,5Q"}, 2477 2478 /* Vector VCVT. */ 2479 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2480 MVE_VCVT_FROM_FP_TO_INT, 2481 0xffb30040, 0xffb31c51, 2482 "vcvt%m%v.%s\t%13-15,22Q, %1-3,5Q"}, 2483 2484 /* Vector VDDUP. */ 2485 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2486 MVE_VDDUP, 2487 0xee011f6e, 0xff811f7e, 2488 "vddup%v.u%20-21s\t%13-15,22Q, %17-19l, #%0,7u"}, 2489 2490 /* Vector VDWDUP. */ 2491 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2492 MVE_VDWDUP, 2493 0xee011f60, 0xff811f70, 2494 "vdwdup%v.u%20-21s\t%13-15,22Q, %17-19l, %1-3h, #%0,7u"}, 2495 2496 /* Vector VHCADD. */ 2497 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2498 MVE_VHCADD, 2499 0xee000f00, 0xff810f51, 2500 "vhcadd%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q, #%12o"}, 2501 2502 /* Vector VIWDUP. */ 2503 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2504 MVE_VIWDUP, 2505 0xee010f60, 0xff811f70, 2506 "viwdup%v.u%20-21s\t%13-15,22Q, %17-19l, %1-3h, #%0,7u"}, 2507 2508 /* Vector VIDUP. */ 2509 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2510 MVE_VIDUP, 2511 0xee010f6e, 0xff811f7e, 2512 "vidup%v.u%20-21s\t%13-15,22Q, %17-19l, #%0,7u"}, 2513 2514 /* Vector VLD2. */ 2515 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2516 MVE_VLD2, 2517 0xfc901e00, 0xff901e5f, 2518 "vld2%5d.%7-8s\t%B, [%16-19r]%w"}, 2519 2520 /* Vector VLD4. */ 2521 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2522 MVE_VLD4, 2523 0xfc901e01, 0xff901e1f, 2524 "vld4%5-6d.%7-8s\t%B, [%16-19r]%w"}, 2525 2526 /* Vector VLDRB gather load. */ 2527 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2528 MVE_VLDRB_GATHER_T1, 2529 0xec900e00, 0xefb01e50, 2530 "vldrb%v.%u%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q]"}, 2531 2532 /* Vector VLDRH gather load. */ 2533 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2534 MVE_VLDRH_GATHER_T2, 2535 0xec900e10, 0xefb01e50, 2536 "vldrh%v.%u%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"}, 2537 2538 /* Vector VLDRW gather load. */ 2539 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2540 MVE_VLDRW_GATHER_T3, 2541 0xfc900f40, 0xffb01fd0, 2542 "vldrw%v.u32\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"}, 2543 2544 /* Vector VLDRD gather load. */ 2545 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2546 MVE_VLDRD_GATHER_T4, 2547 0xec900fd0, 0xefb01fd0, 2548 "vldrd%v.u64\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"}, 2549 2550 /* Vector VLDRW gather load. */ 2551 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2552 MVE_VLDRW_GATHER_T5, 2553 0xfd101e00, 0xff111f00, 2554 "vldrw%v.u32\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"}, 2555 2556 /* Vector VLDRD gather load, variant T6. */ 2557 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2558 MVE_VLDRD_GATHER_T6, 2559 0xfd101f00, 0xff111f00, 2560 "vldrd%v.u64\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"}, 2561 2562 /* Vector VLDRB. */ 2563 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2564 MVE_VLDRB_T1, 2565 0xec100e00, 0xee581e00, 2566 "vldrb%v.%u%7-8s\t%13-15Q, %d"}, 2567 2568 /* Vector VLDRH. */ 2569 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2570 MVE_VLDRH_T2, 2571 0xec180e00, 0xee581e00, 2572 "vldrh%v.%u%7-8s\t%13-15Q, %d"}, 2573 2574 /* Vector VLDRB unsigned, variant T5. */ 2575 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2576 MVE_VLDRB_T5, 2577 0xec101e00, 0xfe101f80, 2578 "vldrb%v.u8\t%13-15,22Q, %d"}, 2579 2580 /* Vector VLDRH unsigned, variant T6. */ 2581 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2582 MVE_VLDRH_T6, 2583 0xec101e80, 0xfe101f80, 2584 "vldrh%v.u16\t%13-15,22Q, %d"}, 2585 2586 /* Vector VLDRW unsigned, variant T7. */ 2587 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2588 MVE_VLDRW_T7, 2589 0xec101f00, 0xfe101f80, 2590 "vldrw%v.u32\t%13-15,22Q, %d"}, 2591 2592 /* Vector VMAX. */ 2593 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2594 MVE_VMAX, 2595 0xef000640, 0xef811f51, 2596 "vmax%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2597 2598 /* Vector VMAXA. */ 2599 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2600 MVE_VMAXA, 2601 0xee330e81, 0xffb31fd1, 2602 "vmaxa%v.s%18-19s\t%13-15,22Q, %1-3,5Q"}, 2603 2604 /* Vector VMAXNM floating point. */ 2605 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2606 MVE_VMAXNM_FP, 2607 0xff000f50, 0xffa11f51, 2608 "vmaxnm%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2609 2610 /* Vector VMAXNMA floating point. */ 2611 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2612 MVE_VMAXNMA_FP, 2613 0xee3f0e81, 0xefbf1fd1, 2614 "vmaxnma%v.f%28s\t%13-15,22Q, %1-3,5Q"}, 2615 2616 /* Vector VMAXNMV floating point. */ 2617 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2618 MVE_VMAXNMV_FP, 2619 0xeeee0f00, 0xefff0fd1, 2620 "vmaxnmv%v.f%28s\t%12-15r, %1-3,5Q"}, 2621 2622 /* Vector VMAXNMAV floating point. */ 2623 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2624 MVE_VMAXNMAV_FP, 2625 0xeeec0f00, 0xefff0fd1, 2626 "vmaxnmav%v.f%28s\t%12-15r, %1-3,5Q"}, 2627 2628 /* Vector VMAXV. */ 2629 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2630 MVE_VMAXV, 2631 0xeee20f00, 0xeff30fd1, 2632 "vmaxv%v.%u%18-19s\t%12-15r, %1-3,5Q"}, 2633 2634 /* Vector VMAXAV. */ 2635 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2636 MVE_VMAXAV, 2637 0xeee00f00, 0xfff30fd1, 2638 "vmaxav%v.s%18-19s\t%12-15r, %1-3,5Q"}, 2639 2640 /* Vector VMIN. */ 2641 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2642 MVE_VMIN, 2643 0xef000650, 0xef811f51, 2644 "vmin%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2645 2646 /* Vector VMINA. */ 2647 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2648 MVE_VMINA, 2649 0xee331e81, 0xffb31fd1, 2650 "vmina%v.s%18-19s\t%13-15,22Q, %1-3,5Q"}, 2651 2652 /* Vector VMINNM floating point. */ 2653 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2654 MVE_VMINNM_FP, 2655 0xff200f50, 0xffa11f51, 2656 "vminnm%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2657 2658 /* Vector VMINNMA floating point. */ 2659 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2660 MVE_VMINNMA_FP, 2661 0xee3f1e81, 0xefbf1fd1, 2662 "vminnma%v.f%28s\t%13-15,22Q, %1-3,5Q"}, 2663 2664 /* Vector VMINNMV floating point. */ 2665 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2666 MVE_VMINNMV_FP, 2667 0xeeee0f80, 0xefff0fd1, 2668 "vminnmv%v.f%28s\t%12-15r, %1-3,5Q"}, 2669 2670 /* Vector VMINNMAV floating point. */ 2671 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2672 MVE_VMINNMAV_FP, 2673 0xeeec0f80, 0xefff0fd1, 2674 "vminnmav%v.f%28s\t%12-15r, %1-3,5Q"}, 2675 2676 /* Vector VMINV. */ 2677 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2678 MVE_VMINV, 2679 0xeee20f80, 0xeff30fd1, 2680 "vminv%v.%u%18-19s\t%12-15r, %1-3,5Q"}, 2681 2682 /* Vector VMINAV. */ 2683 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2684 MVE_VMINAV, 2685 0xeee00f80, 0xfff30fd1, 2686 "vminav%v.s%18-19s\t%12-15r, %1-3,5Q"}, 2687 2688 /* Vector VMLA. */ 2689 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2690 MVE_VMLA, 2691 0xee010e40, 0xef811f70, 2692 "vmla%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 2693 2694 /* Vector VMLALDAV. Note must appear before VMLADAV due to instruction 2695 opcode aliasing. */ 2696 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2697 MVE_VMLALDAV, 2698 0xee801e00, 0xef801f51, 2699 "vmlaldav%5Ax%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"}, 2700 2701 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2702 MVE_VMLALDAV, 2703 0xee800e00, 0xef801f51, 2704 "vmlalv%5A%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"}, 2705 2706 /* Vector VMLAV T1 variant, same as VMLADAV but with X == 0. */ 2707 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2708 MVE_VMLADAV_T1, 2709 0xeef00e00, 0xeff01f51, 2710 "vmlav%5A%v.%u%16s\t%13-15l, %17-19,7Q, %1-3Q"}, 2711 2712 /* Vector VMLAV T2 variant, same as VMLADAV but with X == 0. */ 2713 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2714 MVE_VMLADAV_T2, 2715 0xeef00f00, 0xeff11f51, 2716 "vmlav%5A%v.%u8\t%13-15l, %17-19,7Q, %1-3Q"}, 2717 2718 /* Vector VMLADAV T1 variant. */ 2719 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2720 MVE_VMLADAV_T1, 2721 0xeef01e00, 0xeff01f51, 2722 "vmladav%5Ax%v.%u%16s\t%13-15l, %17-19,7Q, %1-3Q"}, 2723 2724 /* Vector VMLADAV T2 variant. */ 2725 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2726 MVE_VMLADAV_T2, 2727 0xeef01f00, 0xeff11f51, 2728 "vmladav%5Ax%v.%u8\t%13-15l, %17-19,7Q, %1-3Q"}, 2729 2730 /* Vector VMLAS. */ 2731 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2732 MVE_VMLAS, 2733 0xee011e40, 0xef811f70, 2734 "vmlas%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 2735 2736 /* Vector VRMLSLDAVH. Note must appear before VMLSDAV due to instruction 2737 opcode aliasing. */ 2738 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2739 MVE_VRMLSLDAVH, 2740 0xfe800e01, 0xff810f51, 2741 "vrmlsldavh%5A%X%v.s32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"}, 2742 2743 /* Vector VMLSLDAV. Note must appear before VMLSDAV due to instruction 2744 opcdoe aliasing. */ 2745 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2746 MVE_VMLSLDAV, 2747 0xee800e01, 0xff800f51, 2748 "vmlsldav%5A%X%v.%u%16s\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"}, 2749 2750 /* Vector VMLSDAV T1 Variant. */ 2751 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2752 MVE_VMLSDAV_T1, 2753 0xeef00e01, 0xfff00f51, 2754 "vmlsdav%5A%X%v.s%16s\t%13-15l, %17-19,7Q, %1-3Q"}, 2755 2756 /* Vector VMLSDAV T2 Variant. */ 2757 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2758 MVE_VMLSDAV_T2, 2759 0xfef00e01, 0xfff10f51, 2760 "vmlsdav%5A%X%v.s8\t%13-15l, %17-19,7Q, %1-3Q"}, 2761 2762 /* Vector VMOV between gpr and half precision register, op == 0. */ 2763 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2764 MVE_VMOV_HFP_TO_GP, 2765 0xee000910, 0xfff00f7f, 2766 "vmov.f16\t%7,16-19F, %12-15r"}, 2767 2768 /* Vector VMOV between gpr and half precision register, op == 1. */ 2769 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2770 MVE_VMOV_HFP_TO_GP, 2771 0xee100910, 0xfff00f7f, 2772 "vmov.f16\t%12-15r, %7,16-19F"}, 2773 2774 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2775 MVE_VMOV_GP_TO_VEC_LANE, 2776 0xee000b10, 0xff900f1f, 2777 "vmov%c.%5-6,21-22s\t%17-19,7Q[%N], %12-15r"}, 2778 2779 /* Vector VORR immediate to vector. 2780 NOTE: MVE_VORR_IMM must appear in the table 2781 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */ 2782 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2783 MVE_VORR_IMM, 2784 0xef800050, 0xefb810f0, 2785 "vorr%v.i%8-11s\t%13-15,22Q, %E"}, 2786 2787 /* Vector VQSHL T2 Variant. 2788 NOTE: MVE_VQSHL_T2 must appear in the table before 2789 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */ 2790 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2791 MVE_VQSHL_T2, 2792 0xef800750, 0xef801fd1, 2793 "vqshl%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"}, 2794 2795 /* Vector VQSHLU T3 Variant 2796 NOTE: MVE_VQSHL_T2 must appear in the table before 2797 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */ 2798 2799 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2800 MVE_VQSHLU_T3, 2801 0xff800650, 0xff801fd1, 2802 "vqshlu%v.s%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"}, 2803 2804 /* Vector VRSHR 2805 NOTE: MVE_VRSHR must appear in the table before 2806 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */ 2807 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2808 MVE_VRSHR, 2809 0xef800250, 0xef801fd1, 2810 "vrshr%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"}, 2811 2812 /* Vector VSHL. 2813 NOTE: MVE_VSHL must appear in the table before 2814 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */ 2815 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2816 MVE_VSHL_T1, 2817 0xef800550, 0xff801fd1, 2818 "vshl%v.i%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"}, 2819 2820 /* Vector VSHR 2821 NOTE: MVE_VSHR must appear in the table before 2822 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */ 2823 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2824 MVE_VSHR, 2825 0xef800050, 0xef801fd1, 2826 "vshr%v.%u%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"}, 2827 2828 /* Vector VSLI 2829 NOTE: MVE_VSLI must appear in the table before 2830 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */ 2831 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2832 MVE_VSLI, 2833 0xff800550, 0xff801fd1, 2834 "vsli%v.%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"}, 2835 2836 /* Vector VSRI 2837 NOTE: MVE_VSRI must appear in the table before 2838 before MVE_VMOV_IMM_TO_VEC due to opcode aliasing. */ 2839 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2840 MVE_VSRI, 2841 0xff800450, 0xff801fd1, 2842 "vsri%v.%19-21s\t%13-15,22Q, %1-3,5Q, #%16-18d"}, 2843 2844 /* Vector VMOV immediate to vector, 2845 undefinded for cmode == 1111 */ 2846 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2847 MVE_VMVN_IMM, 0xef800f70, 0xefb81ff0, UNDEFINED_INSTRUCTION}, 2848 2849 /* Vector VMOV immediate to vector, 2850 cmode == 1101 */ 2851 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2852 MVE_VMOV_IMM_TO_VEC, 0xef800d50, 0xefb81fd0, 2853 "vmov%v.%5,8-11s\t%13-15,22Q, %E"}, 2854 2855 /* Vector VMOV immediate to vector. */ 2856 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2857 MVE_VMOV_IMM_TO_VEC, 2858 0xef800050, 0xefb810d0, 2859 "vmov%v.%5,8-11s\t%13-15,22Q, %E"}, 2860 2861 /* Vector VMOV two 32-bit lanes to two gprs, idx = 0. */ 2862 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2863 MVE_VMOV2_VEC_LANE_TO_GP, 2864 0xec000f00, 0xffb01ff0, 2865 "vmov%c\t%0-3r, %16-19r, %13-15,22Q[2], %13-15,22Q[0]"}, 2866 2867 /* Vector VMOV two 32-bit lanes to two gprs, idx = 1. */ 2868 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2869 MVE_VMOV2_VEC_LANE_TO_GP, 2870 0xec000f10, 0xffb01ff0, 2871 "vmov%c\t%0-3r, %16-19r, %13-15,22Q[3], %13-15,22Q[1]"}, 2872 2873 /* Vector VMOV Two gprs to two 32-bit lanes, idx = 0. */ 2874 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2875 MVE_VMOV2_GP_TO_VEC_LANE, 2876 0xec100f00, 0xffb01ff0, 2877 "vmov%c\t%13-15,22Q[2], %13-15,22Q[0], %0-3r, %16-19r"}, 2878 2879 /* Vector VMOV Two gprs to two 32-bit lanes, idx = 1. */ 2880 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2881 MVE_VMOV2_GP_TO_VEC_LANE, 2882 0xec100f10, 0xffb01ff0, 2883 "vmov%c\t%13-15,22Q[2], %13-15,22Q[0], %0-3r, %16-19r"}, 2884 2885 /* Vector VMOV Vector lane to gpr. */ 2886 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2887 MVE_VMOV_VEC_LANE_TO_GP, 2888 0xee100b10, 0xff100f1f, 2889 "vmov%c.%u%5-6,21-22s\t%12-15r, %17-19,7Q[%N]"}, 2890 2891 /* Vector VSHLL T1 Variant. Note: VSHLL T1 must appear before MVE_VMOVL due 2892 to instruction opcode aliasing. */ 2893 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2894 MVE_VSHLL_T1, 2895 0xeea00f40, 0xefa00fd1, 2896 "vshll%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"}, 2897 2898 /* Vector VMOVL long. */ 2899 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2900 MVE_VMOVL, 2901 0xeea00f40, 0xefa70fd1, 2902 "vmovl%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q"}, 2903 2904 /* Vector VMOV and narrow. */ 2905 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2906 MVE_VMOVN, 2907 0xfe310e81, 0xffb30fd1, 2908 "vmovn%T%v.i%18-19s\t%13-15,22Q, %1-3,5Q"}, 2909 2910 /* Floating point move extract. */ 2911 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2912 MVE_VMOVX, 2913 0xfeb00a40, 0xffbf0fd0, 2914 "vmovx.f16\t%22,12-15F, %5,0-3F"}, 2915 2916 /* Vector VMUL floating-point T1 variant. */ 2917 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2918 MVE_VMUL_FP_T1, 2919 0xff000d50, 0xffa11f51, 2920 "vmul%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2921 2922 /* Vector VMUL floating-point T2 variant. */ 2923 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2924 MVE_VMUL_FP_T2, 2925 0xee310e60, 0xefb11f70, 2926 "vmul%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 2927 2928 /* Vector VMUL T1 variant. */ 2929 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2930 MVE_VMUL_VEC_T1, 2931 0xef000950, 0xff811f51, 2932 "vmul%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2933 2934 /* Vector VMUL T2 variant. */ 2935 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2936 MVE_VMUL_VEC_T2, 2937 0xee011e60, 0xff811f70, 2938 "vmul%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 2939 2940 /* Vector VMULH. */ 2941 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2942 MVE_VMULH, 2943 0xee010e01, 0xef811f51, 2944 "vmulh%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2945 2946 /* Vector VRMULH. */ 2947 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2948 MVE_VRMULH, 2949 0xee011e01, 0xef811f51, 2950 "vrmulh%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2951 2952 /* Vector VMULL integer. */ 2953 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2954 MVE_VMULL_INT, 2955 0xee010e00, 0xef810f51, 2956 "vmull%T%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2957 2958 /* Vector VMULL polynomial. */ 2959 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2960 MVE_VMULL_POLY, 2961 0xee310e00, 0xefb10f51, 2962 "vmull%T%v.%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2963 2964 /* Vector VMVN immediate to vector. */ 2965 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2966 MVE_VMVN_IMM, 2967 0xef800070, 0xefb810f0, 2968 "vmvn%v.i%8-11s\t%13-15,22Q, %E"}, 2969 2970 /* Vector VMVN register. */ 2971 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2972 MVE_VMVN_REG, 2973 0xffb005c0, 0xffbf1fd1, 2974 "vmvn%v\t%13-15,22Q, %1-3,5Q"}, 2975 2976 /* Vector VNEG floating point. */ 2977 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 2978 MVE_VNEG_FP, 2979 0xffb107c0, 0xffb31fd1, 2980 "vneg%v.f%18-19s\t%13-15,22Q, %1-3,5Q"}, 2981 2982 /* Vector VNEG. */ 2983 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2984 MVE_VNEG_VEC, 2985 0xffb103c0, 0xffb31fd1, 2986 "vneg%v.s%18-19s\t%13-15,22Q, %1-3,5Q"}, 2987 2988 /* Vector VORN, vector bitwise or not. */ 2989 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2990 MVE_VORN, 2991 0xef300150, 0xffb11f51, 2992 "vorn%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2993 2994 /* Vector VORR register. */ 2995 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 2996 MVE_VORR_REG, 2997 0xef200150, 0xffb11f51, 2998 "vorr%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 2999 3000 /* Vector VMOV, vector to vector move. While decoding MVE_VORR_REG if 3001 "Qm==Qn", VORR should replaced by its alias VMOV. For that to happen 3002 MVE_VMOV_VEC_TO_VEC need to placed after MVE_VORR_REG in this mve_opcodes 3003 array. */ 3004 3005 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3006 MVE_VMOV_VEC_TO_VEC, 3007 0xef200150, 0xffb11f51, 3008 "vmov%v\t%13-15,22Q, %17-19,7Q"}, 3009 3010 /* Vector VQDMULL T1 variant. */ 3011 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3012 MVE_VQDMULL_T1, 3013 0xee300f01, 0xefb10f51, 3014 "vqdmull%T%v.s%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 3015 3016 /* Vector VPNOT. */ 3017 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3018 MVE_VPNOT, 3019 0xfe310f4d, 0xffffffff, 3020 "vpnot%v"}, 3021 3022 /* Vector VPSEL. */ 3023 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3024 MVE_VPSEL, 3025 0xfe310f01, 0xffb11f51, 3026 "vpsel%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 3027 3028 /* Vector VQABS. */ 3029 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3030 MVE_VQABS, 3031 0xffb00740, 0xffb31fd1, 3032 "vqabs%v.s%18-19s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 3033 3034 /* Vector VQADD T1 variant. */ 3035 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3036 MVE_VQADD_T1, 3037 0xef000050, 0xef811f51, 3038 "vqadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 3039 3040 /* Vector VQADD T2 variant. */ 3041 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3042 MVE_VQADD_T2, 3043 0xee000f60, 0xef811f70, 3044 "vqadd%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 3045 3046 /* Vector VQDMULL T2 variant. */ 3047 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3048 MVE_VQDMULL_T2, 3049 0xee300f60, 0xefb10f70, 3050 "vqdmull%T%v.s%28s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 3051 3052 /* Vector VQMOVN. */ 3053 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3054 MVE_VQMOVN, 3055 0xee330e01, 0xefb30fd1, 3056 "vqmovn%T%v.%u%18-19s\t%13-15,22Q, %1-3,5Q"}, 3057 3058 /* Vector VQMOVUN. */ 3059 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3060 MVE_VQMOVUN, 3061 0xee310e81, 0xffb30fd1, 3062 "vqmovun%T%v.s%18-19s\t%13-15,22Q, %1-3,5Q"}, 3063 3064 /* Vector VQDMLADH. */ 3065 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3066 MVE_VQDMLADH, 3067 0xee000e00, 0xff810f51, 3068 "vqdmladh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 3069 3070 /* Vector VQRDMLADH. */ 3071 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3072 MVE_VQRDMLADH, 3073 0xee000e01, 0xff810f51, 3074 "vqrdmladh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 3075 3076 /* Vector VQDMLAH. */ 3077 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3078 MVE_VQDMLAH, 3079 0xee000e60, 0xff811f70, 3080 "vqdmlah%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 3081 3082 /* Vector VQRDMLAH. */ 3083 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3084 MVE_VQRDMLAH, 3085 0xee000e40, 0xff811f70, 3086 "vqrdmlah%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 3087 3088 /* Vector VQDMLASH. */ 3089 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3090 MVE_VQDMLASH, 3091 0xee001e60, 0xff811f70, 3092 "vqdmlash%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 3093 3094 /* Vector VQRDMLASH. */ 3095 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3096 MVE_VQRDMLASH, 3097 0xee001e40, 0xff811f70, 3098 "vqrdmlash%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 3099 3100 /* Vector VQDMLSDH. */ 3101 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3102 MVE_VQDMLSDH, 3103 0xfe000e00, 0xff810f51, 3104 "vqdmlsdh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 3105 3106 /* Vector VQRDMLSDH. */ 3107 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3108 MVE_VQRDMLSDH, 3109 0xfe000e01, 0xff810f51, 3110 "vqrdmlsdh%X%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 3111 3112 /* Vector VQDMULH T1 variant. */ 3113 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3114 MVE_VQDMULH_T1, 3115 0xef000b40, 0xff811f51, 3116 "vqdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 3117 3118 /* Vector VQRDMULH T2 variant. */ 3119 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3120 MVE_VQRDMULH_T2, 3121 0xff000b40, 0xff811f51, 3122 "vqrdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 3123 3124 /* Vector VQDMULH T3 variant. */ 3125 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3126 MVE_VQDMULH_T3, 3127 0xee010e60, 0xff811f70, 3128 "vqdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 3129 3130 /* Vector VQRDMULH T4 variant. */ 3131 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3132 MVE_VQRDMULH_T4, 3133 0xfe010e60, 0xff811f70, 3134 "vqrdmulh%v.s%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 3135 3136 /* Vector VQNEG. */ 3137 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3138 MVE_VQNEG, 3139 0xffb007c0, 0xffb31fd1, 3140 "vqneg%v.s%18-19s\t%13-15,22Q, %1-3,5Q"}, 3141 3142 /* Vector VQRSHL T1 variant. */ 3143 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3144 MVE_VQRSHL_T1, 3145 0xef000550, 0xef811f51, 3146 "vqrshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"}, 3147 3148 /* Vector VQRSHL T2 variant. */ 3149 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3150 MVE_VQRSHL_T2, 3151 0xee331ee0, 0xefb31ff0, 3152 "vqrshl%v.%u%18-19s\t%13-15,22Q, %0-3r"}, 3153 3154 /* Vector VQRSHRN. */ 3155 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3156 MVE_VQRSHRN, 3157 0xee800f41, 0xefa00fd1, 3158 "vqrshrn%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"}, 3159 3160 /* Vector VQRSHRUN. */ 3161 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3162 MVE_VQRSHRUN, 3163 0xfe800fc0, 0xffa00fd1, 3164 "vqrshrun%T%v.s%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"}, 3165 3166 /* Vector VQSHL T1 Variant. */ 3167 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3168 MVE_VQSHL_T1, 3169 0xee311ee0, 0xefb31ff0, 3170 "vqshl%v.%u%18-19s\t%13-15,22Q, %0-3r"}, 3171 3172 /* Vector VQSHL T4 Variant. */ 3173 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3174 MVE_VQSHL_T4, 3175 0xef000450, 0xef811f51, 3176 "vqshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"}, 3177 3178 /* Vector VQSHRN. */ 3179 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3180 MVE_VQSHRN, 3181 0xee800f40, 0xefa00fd1, 3182 "vqshrn%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"}, 3183 3184 /* Vector VQSHRUN. */ 3185 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3186 MVE_VQSHRUN, 3187 0xee800fc0, 0xffa00fd1, 3188 "vqshrun%T%v.s%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"}, 3189 3190 /* Vector VQSUB T1 Variant. */ 3191 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3192 MVE_VQSUB_T1, 3193 0xef000250, 0xef811f51, 3194 "vqsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 3195 3196 /* Vector VQSUB T2 Variant. */ 3197 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3198 MVE_VQSUB_T2, 3199 0xee001f60, 0xef811f70, 3200 "vqsub%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 3201 3202 /* Vector VREV16. */ 3203 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3204 MVE_VREV16, 3205 0xffb00140, 0xffb31fd1, 3206 "vrev16%v.8\t%13-15,22Q, %1-3,5Q"}, 3207 3208 /* Vector VREV32. */ 3209 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3210 MVE_VREV32, 3211 0xffb000c0, 0xffb31fd1, 3212 "vrev32%v.%18-19s\t%13-15,22Q, %1-3,5Q"}, 3213 3214 /* Vector VREV64. */ 3215 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3216 MVE_VREV64, 3217 0xffb00040, 0xffb31fd1, 3218 "vrev64%v.%18-19s\t%13-15,22Q, %1-3,5Q"}, 3219 3220 /* Vector VRINT floating point. */ 3221 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 3222 MVE_VRINT_FP, 3223 0xffb20440, 0xffb31c51, 3224 "vrint%m%v.f%18-19s\t%13-15,22Q, %1-3,5Q"}, 3225 3226 /* Vector VRMLALDAVH. */ 3227 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3228 MVE_VRMLALDAVH, 3229 0xee800f00, 0xef811f51, 3230 "vrmlalvh%5A%v.%u32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"}, 3231 3232 /* Vector VRMLALDAVH. */ 3233 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3234 MVE_VRMLALDAVH, 3235 0xee801f00, 0xef811f51, 3236 "vrmlaldavh%5Ax%v.%u32\t%13-15l, %20-22h, %17-19,7Q, %1-3Q"}, 3237 3238 /* Vector VRSHL T1 Variant. */ 3239 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3240 MVE_VRSHL_T1, 3241 0xef000540, 0xef811f51, 3242 "vrshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"}, 3243 3244 /* Vector VRSHL T2 Variant. */ 3245 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3246 MVE_VRSHL_T2, 3247 0xee331e60, 0xefb31ff0, 3248 "vrshl%v.%u%18-19s\t%13-15,22Q, %0-3r"}, 3249 3250 /* Vector VRSHRN. */ 3251 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3252 MVE_VRSHRN, 3253 0xfe800fc1, 0xffa00fd1, 3254 "vrshrn%T%v.i%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"}, 3255 3256 /* Vector VSBC. */ 3257 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3258 MVE_VSBC, 3259 0xfe300f00, 0xffb10f51, 3260 "vsbc%12I%v.i32\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 3261 3262 /* Vector VSHL T2 Variant. */ 3263 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3264 MVE_VSHL_T2, 3265 0xee311e60, 0xefb31ff0, 3266 "vshl%v.%u%18-19s\t%13-15,22Q, %0-3r"}, 3267 3268 /* Vector VSHL T3 Variant. */ 3269 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3270 MVE_VSHL_T3, 3271 0xef000440, 0xef811f51, 3272 "vshl%v.%u%20-21s\t%13-15,22Q, %1-3,5Q, %17-19,7Q"}, 3273 3274 /* Vector VSHLC. */ 3275 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3276 MVE_VSHLC, 3277 0xeea00fc0, 0xffa01ff0, 3278 "vshlc%v\t%13-15,22Q, %0-3r, #%16-20d"}, 3279 3280 /* Vector VSHLL T2 Variant. */ 3281 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3282 MVE_VSHLL_T2, 3283 0xee310e01, 0xefb30fd1, 3284 "vshll%T%v.%u%18-19s\t%13-15,22Q, %1-3,5Q, #%18-19d"}, 3285 3286 /* Vector VSHRN. */ 3287 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3288 MVE_VSHRN, 3289 0xee800fc1, 0xffa00fd1, 3290 "vshrn%T%v.i%19-20s\t%13-15,22Q, %1-3,5Q, #%16-18d"}, 3291 3292 /* Vector VST2 no writeback. */ 3293 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3294 MVE_VST2, 3295 0xfc801e00, 0xffb01e5f, 3296 "vst2%5d.%7-8s\t%B, [%16-19r]"}, 3297 3298 /* Vector VST2 writeback. */ 3299 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3300 MVE_VST2, 3301 0xfca01e00, 0xffb01e5f, 3302 "vst2%5d.%7-8s\t%B, [%16-19r]!"}, 3303 3304 /* Vector VST4 no writeback. */ 3305 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3306 MVE_VST4, 3307 0xfc801e01, 0xffb01e1f, 3308 "vst4%5-6d.%7-8s\t%B, [%16-19r]"}, 3309 3310 /* Vector VST4 writeback. */ 3311 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3312 MVE_VST4, 3313 0xfca01e01, 0xffb01e1f, 3314 "vst4%5-6d.%7-8s\t%B, [%16-19r]!"}, 3315 3316 /* Vector VSTRB scatter store, T1 variant. */ 3317 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3318 MVE_VSTRB_SCATTER_T1, 3319 0xec800e00, 0xffb01e50, 3320 "vstrb%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q]"}, 3321 3322 /* Vector VSTRH scatter store, T2 variant. */ 3323 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3324 MVE_VSTRH_SCATTER_T2, 3325 0xec800e10, 0xffb01e50, 3326 "vstrh%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"}, 3327 3328 /* Vector VSTRW scatter store, T3 variant. */ 3329 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3330 MVE_VSTRW_SCATTER_T3, 3331 0xec800e40, 0xffb01e50, 3332 "vstrw%v.%7-8s\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"}, 3333 3334 /* Vector VSTRD scatter store, T4 variant. */ 3335 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3336 MVE_VSTRD_SCATTER_T4, 3337 0xec800fd0, 0xffb01fd0, 3338 "vstrd%v.64\t%13-15,22Q, [%16-19r, %1-3,5Q%o]"}, 3339 3340 /* Vector VSTRW scatter store, T5 variant. */ 3341 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3342 MVE_VSTRW_SCATTER_T5, 3343 0xfd001e00, 0xff111f00, 3344 "vstrw%v.32\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"}, 3345 3346 /* Vector VSTRD scatter store, T6 variant. */ 3347 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3348 MVE_VSTRD_SCATTER_T6, 3349 0xfd001f00, 0xff111f00, 3350 "vstrd%v.64\t%13-15,22Q, [%17-19,7Q, #%a%0-6i]%w"}, 3351 3352 /* Vector VSTRB. */ 3353 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3354 MVE_VSTRB_T1, 3355 0xec000e00, 0xfe581e00, 3356 "vstrb%v.%7-8s\t%13-15Q, %d"}, 3357 3358 /* Vector VSTRH. */ 3359 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3360 MVE_VSTRH_T2, 3361 0xec080e00, 0xfe581e00, 3362 "vstrh%v.%7-8s\t%13-15Q, %d"}, 3363 3364 /* Vector VSTRB variant T5. */ 3365 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3366 MVE_VSTRB_T5, 3367 0xec001e00, 0xfe101f80, 3368 "vstrb%v.8\t%13-15,22Q, %d"}, 3369 3370 /* Vector VSTRH variant T6. */ 3371 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3372 MVE_VSTRH_T6, 3373 0xec001e80, 0xfe101f80, 3374 "vstrh%v.16\t%13-15,22Q, %d"}, 3375 3376 /* Vector VSTRW variant T7. */ 3377 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3378 MVE_VSTRW_T7, 3379 0xec001f00, 0xfe101f80, 3380 "vstrw%v.32\t%13-15,22Q, %d"}, 3381 3382 /* Vector VSUB floating point T1 variant. */ 3383 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 3384 MVE_VSUB_FP_T1, 3385 0xef200d40, 0xffa11f51, 3386 "vsub%v.f%20s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 3387 3388 /* Vector VSUB floating point T2 variant. */ 3389 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP), 3390 MVE_VSUB_FP_T2, 3391 0xee301f40, 0xefb11f70, 3392 "vsub%v.f%28s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 3393 3394 /* Vector VSUB T1 variant. */ 3395 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3396 MVE_VSUB_VEC_T1, 3397 0xff000840, 0xff811f51, 3398 "vsub%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"}, 3399 3400 /* Vector VSUB T2 variant. */ 3401 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3402 MVE_VSUB_VEC_T2, 3403 0xee011f40, 0xff811f70, 3404 "vsub%v.i%20-21s\t%13-15,22Q, %17-19,7Q, %0-3r"}, 3405 3406 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3407 MVE_ASRLI, 3408 0xea50012f, 0xfff1813f, 3409 "asrl%c\t%17-19l, %9-11h, %j"}, 3410 3411 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3412 MVE_ASRL, 3413 0xea50012d, 0xfff101ff, 3414 "asrl%c\t%17-19l, %9-11h, %12-15S"}, 3415 3416 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3417 MVE_LSLLI, 3418 0xea50010f, 0xfff1813f, 3419 "lsll%c\t%17-19l, %9-11h, %j"}, 3420 3421 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3422 MVE_LSLL, 3423 0xea50010d, 0xfff101ff, 3424 "lsll%c\t%17-19l, %9-11h, %12-15S"}, 3425 3426 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3427 MVE_LSRL, 3428 0xea50011f, 0xfff1813f, 3429 "lsrl%c\t%17-19l, %9-11h, %j"}, 3430 3431 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3432 MVE_SQRSHRL, 3433 0xea51012d, 0xfff1017f, 3434 "sqrshrl%c\t%17-19l, %9-11h, %k, %12-15S"}, 3435 3436 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3437 MVE_SQRSHR, 3438 0xea500f2d, 0xfff00fff, 3439 "sqrshr%c\t%16-19S, %12-15S"}, 3440 3441 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3442 MVE_SQSHLL, 3443 0xea51013f, 0xfff1813f, 3444 "sqshll%c\t%17-19l, %9-11h, %j"}, 3445 3446 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3447 MVE_SQSHL, 3448 0xea500f3f, 0xfff08f3f, 3449 "sqshl%c\t%16-19S, %j"}, 3450 3451 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3452 MVE_SRSHRL, 3453 0xea51012f, 0xfff1813f, 3454 "srshrl%c\t%17-19l, %9-11h, %j"}, 3455 3456 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3457 MVE_SRSHR, 3458 0xea500f2f, 0xfff08f3f, 3459 "srshr%c\t%16-19S, %j"}, 3460 3461 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3462 MVE_UQRSHLL, 3463 0xea51010d, 0xfff1017f, 3464 "uqrshll%c\t%17-19l, %9-11h, %k, %12-15S"}, 3465 3466 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3467 MVE_UQRSHL, 3468 0xea500f0d, 0xfff00fff, 3469 "uqrshl%c\t%16-19S, %12-15S"}, 3470 3471 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3472 MVE_UQSHLL, 3473 0xea51010f, 0xfff1813f, 3474 "uqshll%c\t%17-19l, %9-11h, %j"}, 3475 3476 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3477 MVE_UQSHL, 3478 0xea500f0f, 0xfff08f3f, 3479 "uqshl%c\t%16-19S, %j"}, 3480 3481 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3482 MVE_URSHRL, 3483 0xea51011f, 0xfff1813f, 3484 "urshrl%c\t%17-19l, %9-11h, %j"}, 3485 3486 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE), 3487 MVE_URSHR, 3488 0xea500f1f, 0xfff08f3f, 3489 "urshr%c\t%16-19S, %j"}, 3490 3491 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 3492 MVE_CSINC, 3493 0xea509000, 0xfff0f000, 3494 "csinc\t%8-11S, %16-19Z, %0-3Z, %4-7c"}, 3495 3496 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 3497 MVE_CSINV, 3498 0xea50a000, 0xfff0f000, 3499 "csinv\t%8-11S, %16-19Z, %0-3Z, %4-7c"}, 3500 3501 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 3502 MVE_CSET, 3503 0xea5f900f, 0xfffff00f, 3504 "cset\t%8-11S, %4-7C"}, 3505 3506 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 3507 MVE_CSETM, 3508 0xea5fa00f, 0xfffff00f, 3509 "csetm\t%8-11S, %4-7C"}, 3510 3511 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 3512 MVE_CSEL, 3513 0xea508000, 0xfff0f000, 3514 "csel\t%8-11S, %16-19Z, %0-3Z, %4-7c"}, 3515 3516 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 3517 MVE_CSNEG, 3518 0xea50b000, 0xfff0f000, 3519 "csneg\t%8-11S, %16-19Z, %0-3Z, %4-7c"}, 3520 3521 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 3522 MVE_CINC, 3523 0xea509000, 0xfff0f000, 3524 "cinc\t%8-11S, %16-19Z, %4-7C"}, 3525 3526 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 3527 MVE_CINV, 3528 0xea50a000, 0xfff0f000, 3529 "cinv\t%8-11S, %16-19Z, %4-7C"}, 3530 3531 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 3532 MVE_CNEG, 3533 0xea50b000, 0xfff0f000, 3534 "cneg\t%8-11S, %16-19Z, %4-7C"}, 3535 3536 {ARM_FEATURE_CORE_LOW (0), 3537 MVE_NONE, 3538 0x00000000, 0x00000000, 0} 3539 }; 3540 3541 /* Opcode tables: ARM, 16-bit Thumb, 32-bit Thumb. All three are partially 3542 ordered: they must be searched linearly from the top to obtain a correct 3543 match. */ 3544 3545 /* print_insn_arm recognizes the following format control codes: 3546 3547 %% % 3548 3549 %a print address for ldr/str instruction 3550 %s print address for ldr/str halfword/signextend instruction 3551 %S like %s but allow UNPREDICTABLE addressing 3552 %b print branch destination 3553 %c print condition code (always bits 28-31) 3554 %m print register mask for ldm/stm instruction 3555 %o print operand2 (immediate or register + shift) 3556 %p print 'p' iff bits 12-15 are 15 3557 %t print 't' iff bit 21 set and bit 24 clear 3558 %B print arm BLX(1) destination 3559 %C print the PSR sub type. 3560 %U print barrier type. 3561 %P print address for pli instruction. 3562 3563 %<bitfield>r print as an ARM register 3564 %<bitfield>T print as an ARM register + 1 3565 %<bitfield>R as %r but r15 is UNPREDICTABLE 3566 %<bitfield>{r|R}u as %{r|R} but if matches the other %u field then is UNPREDICTABLE 3567 %<bitfield>{r|R}U as %{r|R} but if matches the other %U field then is UNPREDICTABLE 3568 %<bitfield>d print the bitfield in decimal 3569 %<bitfield>W print the bitfield plus one in decimal 3570 %<bitfield>x print the bitfield in hex 3571 %<bitfield>X print the bitfield as 1 hex digit without leading "0x" 3572 3573 %<bitfield>'c print specified char iff bitfield is all ones 3574 %<bitfield>`c print specified char iff bitfield is all zeroes 3575 %<bitfield>?ab... select from array of values in big endian order 3576 3577 %e print arm SMI operand (bits 0..7,8..19). 3578 %E print the LSB and WIDTH fields of a BFI or BFC instruction. 3579 %V print the 16-bit immediate field of a MOVT or MOVW instruction. 3580 %R print the SPSR/CPSR or banked register of an MRS. */ 3581 3582 static const struct opcode32 arm_opcodes[] = 3583 { 3584 /* ARM instructions. */ 3585 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 3586 0xe1a00000, 0xffffffff, "nop\t\t\t; (mov r0, r0)"}, 3587 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 3588 0xe7f000f0, 0xfff000f0, "udf\t#%e"}, 3589 3590 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T | ARM_EXT_V5), 3591 0x012FFF10, 0x0ffffff0, "bx%c\t%0-3r"}, 3592 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2), 3593 0x00000090, 0x0fe000f0, "mul%20's%c\t%16-19R, %0-3R, %8-11R"}, 3594 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2), 3595 0x00200090, 0x0fe000f0, "mla%20's%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 3596 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2S), 3597 0x01000090, 0x0fb00ff0, "swp%22'b%c\t%12-15RU, %0-3Ru, [%16-19RuU]"}, 3598 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3M), 3599 0x00800090, 0x0fa000f0, 3600 "%22?sumull%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"}, 3601 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3M), 3602 0x00a00090, 0x0fa000f0, 3603 "%22?sumlal%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"}, 3604 3605 /* V8.2 RAS extension instructions. */ 3606 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS), 3607 0xe320f010, 0xffffffff, "esb"}, 3608 3609 /* V8 instructions. */ 3610 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 3611 0x0320f005, 0x0fffffff, "sevl"}, 3612 /* Defined in V8 but is in NOP space so available to all arch. */ 3613 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 3614 0xe1000070, 0xfff000f0, "hlt\t0x%16-19X%12-15X%8-11X%0-3X"}, 3615 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_ATOMICS), 3616 0x01800e90, 0x0ff00ff0, "stlex%c\t%12-15r, %0-3r, [%16-19R]"}, 3617 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 3618 0x01900e9f, 0x0ff00fff, "ldaex%c\t%12-15r, [%16-19R]"}, 3619 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 3620 0x01a00e90, 0x0ff00ff0, "stlexd%c\t%12-15r, %0-3r, %0-3T, [%16-19R]"}, 3621 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 3622 0x01b00e9f, 0x0ff00fff, "ldaexd%c\t%12-15r, %12-15T, [%16-19R]"}, 3623 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 3624 0x01c00e90, 0x0ff00ff0, "stlexb%c\t%12-15r, %0-3r, [%16-19R]"}, 3625 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 3626 0x01d00e9f, 0x0ff00fff, "ldaexb%c\t%12-15r, [%16-19R]"}, 3627 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 3628 0x01e00e90, 0x0ff00ff0, "stlexh%c\t%12-15r, %0-3r, [%16-19R]"}, 3629 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 3630 0x01f00e9f, 0x0ff00fff, "ldaexh%c\t%12-15r, [%16-19R]"}, 3631 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 3632 0x0180fc90, 0x0ff0fff0, "stl%c\t%0-3r, [%16-19R]"}, 3633 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 3634 0x01900c9f, 0x0ff00fff, "lda%c\t%12-15r, [%16-19R]"}, 3635 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 3636 0x01c0fc90, 0x0ff0fff0, "stlb%c\t%0-3r, [%16-19R]"}, 3637 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 3638 0x01d00c9f, 0x0ff00fff, "ldab%c\t%12-15r, [%16-19R]"}, 3639 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 3640 0x01e0fc90, 0x0ff0fff0, "stlh%c\t%0-3r, [%16-19R]"}, 3641 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 3642 0x01f00c9f, 0x0ff00fff, "ldah%c\t%12-15r, [%16-19R]"}, 3643 /* CRC32 instructions. */ 3644 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC), 3645 0xe1000040, 0xfff00ff0, "crc32b\t%12-15R, %16-19R, %0-3R"}, 3646 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC), 3647 0xe1200040, 0xfff00ff0, "crc32h\t%12-15R, %16-19R, %0-3R"}, 3648 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC), 3649 0xe1400040, 0xfff00ff0, "crc32w\t%12-15R, %16-19R, %0-3R"}, 3650 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC), 3651 0xe1000240, 0xfff00ff0, "crc32cb\t%12-15R, %16-19R, %0-3R"}, 3652 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC), 3653 0xe1200240, 0xfff00ff0, "crc32ch\t%12-15R, %16-19R, %0-3R"}, 3654 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC), 3655 0xe1400240, 0xfff00ff0, "crc32cw\t%12-15R, %16-19R, %0-3R"}, 3656 3657 /* Privileged Access Never extension instructions. */ 3658 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN), 3659 0xf1100000, 0xfffffdff, "setpan\t#%9-9d"}, 3660 3661 /* Virtualization Extension instructions. */ 3662 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 0x0160006e, 0x0fffffff, "eret%c"}, 3663 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 0x01400070, 0x0ff000f0, "hvc%c\t%e"}, 3664 3665 /* Integer Divide Extension instructions. */ 3666 {ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV), 3667 0x0710f010, 0x0ff0f0f0, "sdiv%c\t%16-19r, %0-3r, %8-11r"}, 3668 {ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV), 3669 0x0730f010, 0x0ff0f0f0, "udiv%c\t%16-19r, %0-3r, %8-11r"}, 3670 3671 /* MP Extension instructions. */ 3672 {ARM_FEATURE_CORE_LOW (ARM_EXT_MP), 0xf410f000, 0xfc70f000, "pldw\t%a"}, 3673 3674 /* Speculation Barriers. */ 3675 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3), 0xe320f014, 0xffffffff, "csdb"}, 3676 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3), 0xf57ff040, 0xffffffff, "ssbb"}, 3677 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3), 0xf57ff044, 0xffffffff, "pssbb"}, 3678 3679 /* V7 instructions. */ 3680 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf450f000, 0xfd70f000, "pli\t%P"}, 3681 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0x0320f0f0, 0x0ffffff0, "dbg%c\t#%0-3d"}, 3682 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf57ff051, 0xfffffff3, "dmb\t%U"}, 3683 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf57ff041, 0xfffffff3, "dsb\t%U"}, 3684 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf57ff050, 0xfffffff0, "dmb\t%U"}, 3685 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf57ff040, 0xfffffff0, "dsb\t%U"}, 3686 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf57ff060, 0xfffffff0, "isb\t%U"}, 3687 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 3688 0x0320f000, 0x0fffffff, "nop%c\t{%0-7d}"}, 3689 3690 /* ARM V6T2 instructions. */ 3691 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3692 0x07c0001f, 0x0fe0007f, "bfc%c\t%12-15R, %E"}, 3693 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3694 0x07c00010, 0x0fe00070, "bfi%c\t%12-15R, %0-3r, %E"}, 3695 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3696 0x00600090, 0x0ff000f0, "mls%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 3697 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3698 0x002000b0, 0x0f3000f0, "strht%c\t%12-15R, %S"}, 3699 3700 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3701 0x00300090, 0x0f3000f0, UNDEFINED_INSTRUCTION }, 3702 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3703 0x00300090, 0x0f300090, "ldr%6's%5?hbt%c\t%12-15R, %S"}, 3704 3705 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 3706 0x03000000, 0x0ff00000, "movw%c\t%12-15R, %V"}, 3707 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 3708 0x03400000, 0x0ff00000, "movt%c\t%12-15R, %V"}, 3709 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3710 0x06ff0f30, 0x0fff0ff0, "rbit%c\t%12-15R, %0-3R"}, 3711 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3712 0x07a00050, 0x0fa00070, "%22?usbfx%c\t%12-15r, %0-3r, #%7-11d, #%16-20W"}, 3713 3714 /* ARM Security extension instructions. */ 3715 {ARM_FEATURE_CORE_LOW (ARM_EXT_SEC), 3716 0x01600070, 0x0ff000f0, "smc%c\t%e"}, 3717 3718 /* ARM V6K instructions. */ 3719 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 3720 0xf57ff01f, 0xffffffff, "clrex"}, 3721 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 3722 0x01d00f9f, 0x0ff00fff, "ldrexb%c\t%12-15R, [%16-19R]"}, 3723 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 3724 0x01b00f9f, 0x0ff00fff, "ldrexd%c\t%12-15r, [%16-19R]"}, 3725 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 3726 0x01f00f9f, 0x0ff00fff, "ldrexh%c\t%12-15R, [%16-19R]"}, 3727 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 3728 0x01c00f90, 0x0ff00ff0, "strexb%c\t%12-15R, %0-3R, [%16-19R]"}, 3729 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 3730 0x01a00f90, 0x0ff00ff0, "strexd%c\t%12-15R, %0-3r, [%16-19R]"}, 3731 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 3732 0x01e00f90, 0x0ff00ff0, "strexh%c\t%12-15R, %0-3R, [%16-19R]"}, 3733 3734 /* ARMv8.5-A instructions. */ 3735 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB), 0xf57ff070, 0xffffffff, "sb"}, 3736 3737 /* ARM V6K NOP hints. */ 3738 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 3739 0x0320f001, 0x0fffffff, "yield%c"}, 3740 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 3741 0x0320f002, 0x0fffffff, "wfe%c"}, 3742 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 3743 0x0320f003, 0x0fffffff, "wfi%c"}, 3744 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 3745 0x0320f004, 0x0fffffff, "sev%c"}, 3746 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 3747 0x0320f000, 0x0fffff00, "nop%c\t{%0-7d}"}, 3748 3749 /* ARM V6 instructions. */ 3750 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3751 0xf1080000, 0xfffffe3f, "cpsie\t%8'a%7'i%6'f"}, 3752 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3753 0xf10a0000, 0xfffffe20, "cpsie\t%8'a%7'i%6'f,#%0-4d"}, 3754 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3755 0xf10C0000, 0xfffffe3f, "cpsid\t%8'a%7'i%6'f"}, 3756 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3757 0xf10e0000, 0xfffffe20, "cpsid\t%8'a%7'i%6'f,#%0-4d"}, 3758 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3759 0xf1000000, 0xfff1fe20, "cps\t#%0-4d"}, 3760 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3761 0x06800010, 0x0ff00ff0, "pkhbt%c\t%12-15R, %16-19R, %0-3R"}, 3762 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3763 0x06800010, 0x0ff00070, "pkhbt%c\t%12-15R, %16-19R, %0-3R, lsl #%7-11d"}, 3764 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3765 0x06800050, 0x0ff00ff0, "pkhtb%c\t%12-15R, %16-19R, %0-3R, asr #32"}, 3766 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3767 0x06800050, 0x0ff00070, "pkhtb%c\t%12-15R, %16-19R, %0-3R, asr #%7-11d"}, 3768 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3769 0x01900f9f, 0x0ff00fff, "ldrex%c\tr%12-15d, [%16-19R]"}, 3770 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3771 0x06200f10, 0x0ff00ff0, "qadd16%c\t%12-15R, %16-19R, %0-3R"}, 3772 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3773 0x06200f90, 0x0ff00ff0, "qadd8%c\t%12-15R, %16-19R, %0-3R"}, 3774 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3775 0x06200f30, 0x0ff00ff0, "qasx%c\t%12-15R, %16-19R, %0-3R"}, 3776 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3777 0x06200f70, 0x0ff00ff0, "qsub16%c\t%12-15R, %16-19R, %0-3R"}, 3778 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3779 0x06200ff0, 0x0ff00ff0, "qsub8%c\t%12-15R, %16-19R, %0-3R"}, 3780 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3781 0x06200f50, 0x0ff00ff0, "qsax%c\t%12-15R, %16-19R, %0-3R"}, 3782 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3783 0x06100f10, 0x0ff00ff0, "sadd16%c\t%12-15R, %16-19R, %0-3R"}, 3784 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3785 0x06100f90, 0x0ff00ff0, "sadd8%c\t%12-15R, %16-19R, %0-3R"}, 3786 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3787 0x06100f30, 0x0ff00ff0, "sasx%c\t%12-15R, %16-19R, %0-3R"}, 3788 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3789 0x06300f10, 0x0ff00ff0, "shadd16%c\t%12-15R, %16-19R, %0-3R"}, 3790 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3791 0x06300f90, 0x0ff00ff0, "shadd8%c\t%12-15R, %16-19R, %0-3R"}, 3792 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3793 0x06300f30, 0x0ff00ff0, "shasx%c\t%12-15R, %16-19R, %0-3R"}, 3794 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3795 0x06300f70, 0x0ff00ff0, "shsub16%c\t%12-15R, %16-19R, %0-3R"}, 3796 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3797 0x06300ff0, 0x0ff00ff0, "shsub8%c\t%12-15R, %16-19R, %0-3R"}, 3798 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3799 0x06300f50, 0x0ff00ff0, "shsax%c\t%12-15R, %16-19R, %0-3R"}, 3800 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3801 0x06100f70, 0x0ff00ff0, "ssub16%c\t%12-15R, %16-19R, %0-3R"}, 3802 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3803 0x06100ff0, 0x0ff00ff0, "ssub8%c\t%12-15R, %16-19R, %0-3R"}, 3804 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3805 0x06100f50, 0x0ff00ff0, "ssax%c\t%12-15R, %16-19R, %0-3R"}, 3806 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3807 0x06500f10, 0x0ff00ff0, "uadd16%c\t%12-15R, %16-19R, %0-3R"}, 3808 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3809 0x06500f90, 0x0ff00ff0, "uadd8%c\t%12-15R, %16-19R, %0-3R"}, 3810 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3811 0x06500f30, 0x0ff00ff0, "uasx%c\t%12-15R, %16-19R, %0-3R"}, 3812 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3813 0x06700f10, 0x0ff00ff0, "uhadd16%c\t%12-15R, %16-19R, %0-3R"}, 3814 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3815 0x06700f90, 0x0ff00ff0, "uhadd8%c\t%12-15R, %16-19R, %0-3R"}, 3816 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3817 0x06700f30, 0x0ff00ff0, "uhasx%c\t%12-15R, %16-19R, %0-3R"}, 3818 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3819 0x06700f70, 0x0ff00ff0, "uhsub16%c\t%12-15R, %16-19R, %0-3R"}, 3820 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3821 0x06700ff0, 0x0ff00ff0, "uhsub8%c\t%12-15R, %16-19R, %0-3R"}, 3822 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3823 0x06700f50, 0x0ff00ff0, "uhsax%c\t%12-15R, %16-19R, %0-3R"}, 3824 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3825 0x06600f10, 0x0ff00ff0, "uqadd16%c\t%12-15R, %16-19R, %0-3R"}, 3826 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3827 0x06600f90, 0x0ff00ff0, "uqadd8%c\t%12-15R, %16-19R, %0-3R"}, 3828 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3829 0x06600f30, 0x0ff00ff0, "uqasx%c\t%12-15R, %16-19R, %0-3R"}, 3830 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3831 0x06600f70, 0x0ff00ff0, "uqsub16%c\t%12-15R, %16-19R, %0-3R"}, 3832 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3833 0x06600ff0, 0x0ff00ff0, "uqsub8%c\t%12-15R, %16-19R, %0-3R"}, 3834 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3835 0x06600f50, 0x0ff00ff0, "uqsax%c\t%12-15R, %16-19R, %0-3R"}, 3836 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3837 0x06500f70, 0x0ff00ff0, "usub16%c\t%12-15R, %16-19R, %0-3R"}, 3838 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3839 0x06500ff0, 0x0ff00ff0, "usub8%c\t%12-15R, %16-19R, %0-3R"}, 3840 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3841 0x06500f50, 0x0ff00ff0, "usax%c\t%12-15R, %16-19R, %0-3R"}, 3842 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3843 0x06bf0f30, 0x0fff0ff0, "rev%c\t%12-15R, %0-3R"}, 3844 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3845 0x06bf0fb0, 0x0fff0ff0, "rev16%c\t%12-15R, %0-3R"}, 3846 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3847 0x06ff0fb0, 0x0fff0ff0, "revsh%c\t%12-15R, %0-3R"}, 3848 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3849 0xf8100a00, 0xfe50ffff, "rfe%23?id%24?ba\t%16-19r%21'!"}, 3850 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3851 0x06bf0070, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R"}, 3852 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3853 0x06bf0470, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #8"}, 3854 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3855 0x06bf0870, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #16"}, 3856 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3857 0x06bf0c70, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #24"}, 3858 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3859 0x068f0070, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R"}, 3860 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3861 0x068f0470, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #8"}, 3862 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3863 0x068f0870, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #16"}, 3864 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3865 0x068f0c70, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #24"}, 3866 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3867 0x06af0070, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R"}, 3868 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3869 0x06af0470, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #8"}, 3870 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3871 0x06af0870, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #16"}, 3872 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3873 0x06af0c70, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #24"}, 3874 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3875 0x06ff0070, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R"}, 3876 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3877 0x06ff0470, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #8"}, 3878 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3879 0x06ff0870, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #16"}, 3880 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3881 0x06ff0c70, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #24"}, 3882 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3883 0x06cf0070, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R"}, 3884 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3885 0x06cf0470, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #8"}, 3886 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3887 0x06cf0870, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #16"}, 3888 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3889 0x06cf0c70, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #24"}, 3890 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3891 0x06ef0070, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R"}, 3892 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3893 0x06ef0470, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #8"}, 3894 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3895 0x06ef0870, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #16"}, 3896 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3897 0x06ef0c70, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #24"}, 3898 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3899 0x06b00070, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R"}, 3900 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3901 0x06b00470, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #8"}, 3902 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3903 0x06b00870, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #16"}, 3904 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3905 0x06b00c70, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #24"}, 3906 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3907 0x06800070, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R"}, 3908 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3909 0x06800470, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #8"}, 3910 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3911 0x06800870, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #16"}, 3912 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3913 0x06800c70, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #24"}, 3914 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3915 0x06a00070, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R"}, 3916 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3917 0x06a00470, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #8"}, 3918 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3919 0x06a00870, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #16"}, 3920 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3921 0x06a00c70, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #24"}, 3922 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3923 0x06f00070, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R"}, 3924 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3925 0x06f00470, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #8"}, 3926 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3927 0x06f00870, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #16"}, 3928 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3929 0x06f00c70, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #24"}, 3930 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3931 0x06c00070, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R"}, 3932 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3933 0x06c00470, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ror #8"}, 3934 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3935 0x06c00870, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ror #16"}, 3936 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3937 0x06c00c70, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ROR #24"}, 3938 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3939 0x06e00070, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R"}, 3940 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3941 0x06e00470, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #8"}, 3942 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3943 0x06e00870, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #16"}, 3944 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3945 0x06e00c70, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #24"}, 3946 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3947 0x06800fb0, 0x0ff00ff0, "sel%c\t%12-15R, %16-19R, %0-3R"}, 3948 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3949 0xf1010000, 0xfffffc00, "setend\t%9?ble"}, 3950 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3951 0x0700f010, 0x0ff0f0d0, "smuad%5'x%c\t%16-19R, %0-3R, %8-11R"}, 3952 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3953 0x0700f050, 0x0ff0f0d0, "smusd%5'x%c\t%16-19R, %0-3R, %8-11R"}, 3954 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3955 0x07000010, 0x0ff000d0, "smlad%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 3956 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3957 0x07400010, 0x0ff000d0, "smlald%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"}, 3958 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3959 0x07000050, 0x0ff000d0, "smlsd%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 3960 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3961 0x07400050, 0x0ff000d0, "smlsld%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"}, 3962 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3963 0x0750f010, 0x0ff0f0d0, "smmul%5'r%c\t%16-19R, %0-3R, %8-11R"}, 3964 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3965 0x07500010, 0x0ff000d0, "smmla%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 3966 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3967 0x075000d0, 0x0ff000d0, "smmls%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 3968 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3969 0xf84d0500, 0xfe5fffe0, "srs%23?id%24?ba\t%16-19r%21'!, #%0-4d"}, 3970 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3971 0x06a00010, 0x0fe00ff0, "ssat%c\t%12-15R, #%16-20W, %0-3R"}, 3972 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3973 0x06a00010, 0x0fe00070, "ssat%c\t%12-15R, #%16-20W, %0-3R, lsl #%7-11d"}, 3974 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3975 0x06a00050, 0x0fe00070, "ssat%c\t%12-15R, #%16-20W, %0-3R, asr #%7-11d"}, 3976 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3977 0x06a00f30, 0x0ff00ff0, "ssat16%c\t%12-15r, #%16-19W, %0-3r"}, 3978 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3979 0x01800f90, 0x0ff00ff0, "strex%c\t%12-15R, %0-3R, [%16-19R]"}, 3980 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3981 0x00400090, 0x0ff000f0, "umaal%c\t%12-15R, %16-19R, %0-3R, %8-11R"}, 3982 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3983 0x0780f010, 0x0ff0f0f0, "usad8%c\t%16-19R, %0-3R, %8-11R"}, 3984 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3985 0x07800010, 0x0ff000f0, "usada8%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 3986 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3987 0x06e00010, 0x0fe00ff0, "usat%c\t%12-15R, #%16-20d, %0-3R"}, 3988 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3989 0x06e00010, 0x0fe00070, "usat%c\t%12-15R, #%16-20d, %0-3R, lsl #%7-11d"}, 3990 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3991 0x06e00050, 0x0fe00070, "usat%c\t%12-15R, #%16-20d, %0-3R, asr #%7-11d"}, 3992 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 3993 0x06e00f30, 0x0ff00ff0, "usat16%c\t%12-15R, #%16-19d, %0-3R"}, 3994 3995 /* V5J instruction. */ 3996 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5J), 3997 0x012fff20, 0x0ffffff0, "bxj%c\t%0-3R"}, 3998 3999 /* V5 Instructions. */ 4000 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5), 4001 0xe1200070, 0xfff000f0, 4002 "bkpt\t0x%16-19X%12-15X%8-11X%0-3X"}, 4003 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5), 4004 0xfa000000, 0xfe000000, "blx\t%B"}, 4005 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5), 4006 0x012fff30, 0x0ffffff0, "blx%c\t%0-3R"}, 4007 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5), 4008 0x016f0f10, 0x0fff0ff0, "clz%c\t%12-15R, %0-3R"}, 4009 4010 /* V5E "El Segundo" Instructions. */ 4011 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E), 4012 0x000000d0, 0x0e1000f0, "ldrd%c\t%12-15r, %s"}, 4013 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E), 4014 0x000000f0, 0x0e1000f0, "strd%c\t%12-15r, %s"}, 4015 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E), 4016 0xf450f000, 0xfc70f000, "pld\t%a"}, 4017 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4018 0x01000080, 0x0ff000f0, "smlabb%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 4019 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4020 0x010000a0, 0x0ff000f0, "smlatb%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 4021 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4022 0x010000c0, 0x0ff000f0, "smlabt%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 4023 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4024 0x010000e0, 0x0ff000f0, "smlatt%c\t%16-19r, %0-3r, %8-11R, %12-15R"}, 4025 4026 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4027 0x01200080, 0x0ff000f0, "smlawb%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 4028 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4029 0x012000c0, 0x0ff000f0, "smlawt%c\t%16-19R, %0-3r, %8-11R, %12-15R"}, 4030 4031 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4032 0x01400080, 0x0ff000f0, "smlalbb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"}, 4033 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4034 0x014000a0, 0x0ff000f0, "smlaltb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"}, 4035 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4036 0x014000c0, 0x0ff000f0, "smlalbt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"}, 4037 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4038 0x014000e0, 0x0ff000f0, "smlaltt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"}, 4039 4040 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4041 0x01600080, 0x0ff0f0f0, "smulbb%c\t%16-19R, %0-3R, %8-11R"}, 4042 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4043 0x016000a0, 0x0ff0f0f0, "smultb%c\t%16-19R, %0-3R, %8-11R"}, 4044 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4045 0x016000c0, 0x0ff0f0f0, "smulbt%c\t%16-19R, %0-3R, %8-11R"}, 4046 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4047 0x016000e0, 0x0ff0f0f0, "smultt%c\t%16-19R, %0-3R, %8-11R"}, 4048 4049 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4050 0x012000a0, 0x0ff0f0f0, "smulwb%c\t%16-19R, %0-3R, %8-11R"}, 4051 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4052 0x012000e0, 0x0ff0f0f0, "smulwt%c\t%16-19R, %0-3R, %8-11R"}, 4053 4054 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4055 0x01000050, 0x0ff00ff0, "qadd%c\t%12-15R, %0-3R, %16-19R"}, 4056 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4057 0x01400050, 0x0ff00ff0, "qdadd%c\t%12-15R, %0-3R, %16-19R"}, 4058 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4059 0x01200050, 0x0ff00ff0, "qsub%c\t%12-15R, %0-3R, %16-19R"}, 4060 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 4061 0x01600050, 0x0ff00ff0, "qdsub%c\t%12-15R, %0-3R, %16-19R"}, 4062 4063 /* ARM Instructions. */ 4064 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4065 0x052d0004, 0x0fff0fff, "push%c\t{%12-15r}\t\t; (str%c %12-15r, %a)"}, 4066 4067 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4068 0x04400000, 0x0e500000, "strb%t%c\t%12-15R, %a"}, 4069 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4070 0x04000000, 0x0e500000, "str%t%c\t%12-15r, %a"}, 4071 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4072 0x06400000, 0x0e500ff0, "strb%t%c\t%12-15R, %a"}, 4073 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4074 0x06000000, 0x0e500ff0, "str%t%c\t%12-15r, %a"}, 4075 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4076 0x04400000, 0x0c500010, "strb%t%c\t%12-15R, %a"}, 4077 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4078 0x04000000, 0x0c500010, "str%t%c\t%12-15r, %a"}, 4079 4080 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4081 0x04400000, 0x0e500000, "strb%c\t%12-15R, %a"}, 4082 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4083 0x06400000, 0x0e500010, "strb%c\t%12-15R, %a"}, 4084 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4085 0x004000b0, 0x0e5000f0, "strh%c\t%12-15R, %s"}, 4086 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4087 0x000000b0, 0x0e500ff0, "strh%c\t%12-15R, %s"}, 4088 4089 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4090 0x00500090, 0x0e5000f0, UNDEFINED_INSTRUCTION}, 4091 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4092 0x00500090, 0x0e500090, "ldr%6's%5?hb%c\t%12-15R, %s"}, 4093 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4094 0x00100090, 0x0e500ff0, UNDEFINED_INSTRUCTION}, 4095 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4096 0x00100090, 0x0e500f90, "ldr%6's%5?hb%c\t%12-15R, %s"}, 4097 4098 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4099 0x02000000, 0x0fe00000, "and%20's%c\t%12-15r, %16-19r, %o"}, 4100 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4101 0x00000000, 0x0fe00010, "and%20's%c\t%12-15r, %16-19r, %o"}, 4102 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4103 0x00000010, 0x0fe00090, "and%20's%c\t%12-15R, %16-19R, %o"}, 4104 4105 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4106 0x02200000, 0x0fe00000, "eor%20's%c\t%12-15r, %16-19r, %o"}, 4107 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4108 0x00200000, 0x0fe00010, "eor%20's%c\t%12-15r, %16-19r, %o"}, 4109 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4110 0x00200010, 0x0fe00090, "eor%20's%c\t%12-15R, %16-19R, %o"}, 4111 4112 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4113 0x02400000, 0x0fe00000, "sub%20's%c\t%12-15r, %16-19r, %o"}, 4114 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4115 0x00400000, 0x0fe00010, "sub%20's%c\t%12-15r, %16-19r, %o"}, 4116 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4117 0x00400010, 0x0fe00090, "sub%20's%c\t%12-15R, %16-19R, %o"}, 4118 4119 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4120 0x02600000, 0x0fe00000, "rsb%20's%c\t%12-15r, %16-19r, %o"}, 4121 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4122 0x00600000, 0x0fe00010, "rsb%20's%c\t%12-15r, %16-19r, %o"}, 4123 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4124 0x00600010, 0x0fe00090, "rsb%20's%c\t%12-15R, %16-19R, %o"}, 4125 4126 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4127 0x02800000, 0x0fe00000, "add%20's%c\t%12-15r, %16-19r, %o"}, 4128 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4129 0x00800000, 0x0fe00010, "add%20's%c\t%12-15r, %16-19r, %o"}, 4130 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4131 0x00800010, 0x0fe00090, "add%20's%c\t%12-15R, %16-19R, %o"}, 4132 4133 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4134 0x02a00000, 0x0fe00000, "adc%20's%c\t%12-15r, %16-19r, %o"}, 4135 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4136 0x00a00000, 0x0fe00010, "adc%20's%c\t%12-15r, %16-19r, %o"}, 4137 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4138 0x00a00010, 0x0fe00090, "adc%20's%c\t%12-15R, %16-19R, %o"}, 4139 4140 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4141 0x02c00000, 0x0fe00000, "sbc%20's%c\t%12-15r, %16-19r, %o"}, 4142 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4143 0x00c00000, 0x0fe00010, "sbc%20's%c\t%12-15r, %16-19r, %o"}, 4144 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4145 0x00c00010, 0x0fe00090, "sbc%20's%c\t%12-15R, %16-19R, %o"}, 4146 4147 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4148 0x02e00000, 0x0fe00000, "rsc%20's%c\t%12-15r, %16-19r, %o"}, 4149 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4150 0x00e00000, 0x0fe00010, "rsc%20's%c\t%12-15r, %16-19r, %o"}, 4151 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4152 0x00e00010, 0x0fe00090, "rsc%20's%c\t%12-15R, %16-19R, %o"}, 4153 4154 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 4155 0x0120f200, 0x0fb0f200, "msr%c\t%C, %0-3r"}, 4156 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3), 4157 0x0120f000, 0x0db0f000, "msr%c\t%C, %o"}, 4158 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3), 4159 0x01000000, 0x0fb00cff, "mrs%c\t%12-15R, %R"}, 4160 4161 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4162 0x03000000, 0x0fe00000, "tst%p%c\t%16-19r, %o"}, 4163 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4164 0x01000000, 0x0fe00010, "tst%p%c\t%16-19r, %o"}, 4165 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4166 0x01000010, 0x0fe00090, "tst%p%c\t%16-19R, %o"}, 4167 4168 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4169 0x03300000, 0x0ff00000, "teq%p%c\t%16-19r, %o"}, 4170 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4171 0x01300000, 0x0ff00010, "teq%p%c\t%16-19r, %o"}, 4172 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4173 0x01300010, 0x0ff00010, "teq%p%c\t%16-19R, %o"}, 4174 4175 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4176 0x03400000, 0x0fe00000, "cmp%p%c\t%16-19r, %o"}, 4177 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4178 0x01400000, 0x0fe00010, "cmp%p%c\t%16-19r, %o"}, 4179 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4180 0x01400010, 0x0fe00090, "cmp%p%c\t%16-19R, %o"}, 4181 4182 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4183 0x03600000, 0x0fe00000, "cmn%p%c\t%16-19r, %o"}, 4184 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4185 0x01600000, 0x0fe00010, "cmn%p%c\t%16-19r, %o"}, 4186 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4187 0x01600010, 0x0fe00090, "cmn%p%c\t%16-19R, %o"}, 4188 4189 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4190 0x03800000, 0x0fe00000, "orr%20's%c\t%12-15r, %16-19r, %o"}, 4191 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4192 0x01800000, 0x0fe00010, "orr%20's%c\t%12-15r, %16-19r, %o"}, 4193 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4194 0x01800010, 0x0fe00090, "orr%20's%c\t%12-15R, %16-19R, %o"}, 4195 4196 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4197 0x03a00000, 0x0fef0000, "mov%20's%c\t%12-15r, %o"}, 4198 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4199 0x01a00000, 0x0def0ff0, "mov%20's%c\t%12-15r, %0-3r"}, 4200 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4201 0x01a00000, 0x0def0060, "lsl%20's%c\t%12-15R, %q"}, 4202 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4203 0x01a00020, 0x0def0060, "lsr%20's%c\t%12-15R, %q"}, 4204 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4205 0x01a00040, 0x0def0060, "asr%20's%c\t%12-15R, %q"}, 4206 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4207 0x01a00060, 0x0def0ff0, "rrx%20's%c\t%12-15r, %0-3r"}, 4208 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4209 0x01a00060, 0x0def0060, "ror%20's%c\t%12-15R, %q"}, 4210 4211 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4212 0x03c00000, 0x0fe00000, "bic%20's%c\t%12-15r, %16-19r, %o"}, 4213 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4214 0x01c00000, 0x0fe00010, "bic%20's%c\t%12-15r, %16-19r, %o"}, 4215 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4216 0x01c00010, 0x0fe00090, "bic%20's%c\t%12-15R, %16-19R, %o"}, 4217 4218 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4219 0x03e00000, 0x0fe00000, "mvn%20's%c\t%12-15r, %o"}, 4220 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4221 0x01e00000, 0x0fe00010, "mvn%20's%c\t%12-15r, %o"}, 4222 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4223 0x01e00010, 0x0fe00090, "mvn%20's%c\t%12-15R, %o"}, 4224 4225 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4226 0x06000010, 0x0e000010, UNDEFINED_INSTRUCTION}, 4227 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4228 0x049d0004, 0x0fff0fff, "pop%c\t{%12-15r}\t\t; (ldr%c %12-15r, %a)"}, 4229 4230 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4231 0x04500000, 0x0c500000, "ldrb%t%c\t%12-15R, %a"}, 4232 4233 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4234 0x04300000, 0x0d700000, "ldrt%c\t%12-15R, %a"}, 4235 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4236 0x04100000, 0x0c500000, "ldr%c\t%12-15r, %a"}, 4237 4238 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4239 0x092d0001, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 4240 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4241 0x092d0002, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 4242 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4243 0x092d0004, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 4244 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4245 0x092d0008, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 4246 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4247 0x092d0010, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 4248 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4249 0x092d0020, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 4250 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4251 0x092d0040, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 4252 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4253 0x092d0080, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 4254 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4255 0x092d0100, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 4256 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4257 0x092d0200, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 4258 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4259 0x092d0400, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 4260 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4261 0x092d0800, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 4262 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4263 0x092d1000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 4264 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4265 0x092d2000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 4266 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4267 0x092d4000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 4268 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4269 0x092d8000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 4270 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4271 0x092d0000, 0x0fff0000, "push%c\t%m"}, 4272 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4273 0x08800000, 0x0ff00000, "stm%c\t%16-19R%21'!, %m%22'^"}, 4274 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4275 0x08000000, 0x0e100000, "stm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"}, 4276 4277 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4278 0x08bd0001, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 4279 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4280 0x08bd0002, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 4281 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4282 0x08bd0004, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 4283 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4284 0x08bd0008, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 4285 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4286 0x08bd0010, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 4287 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4288 0x08bd0020, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 4289 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4290 0x08bd0040, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 4291 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4292 0x08bd0080, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 4293 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4294 0x08bd0100, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 4295 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4296 0x08bd0200, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 4297 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4298 0x08bd0400, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 4299 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4300 0x08bd0800, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 4301 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4302 0x08bd1000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 4303 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4304 0x08bd2000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 4305 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4306 0x08bd4000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 4307 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4308 0x08bd8000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 4309 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4310 0x08bd0000, 0x0fff0000, "pop%c\t%m"}, 4311 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4312 0x08900000, 0x0f900000, "ldm%c\t%16-19R%21'!, %m%22'^"}, 4313 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4314 0x08100000, 0x0e100000, "ldm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"}, 4315 4316 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4317 0x0a000000, 0x0e000000, "b%24'l%c\t%b"}, 4318 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4319 0x0f000000, 0x0f000000, "svc%c\t%0-23x"}, 4320 4321 /* The rest. */ 4322 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 4323 0x03200000, 0x0fff00ff, "nop%c\t{%0-7d}" UNPREDICTABLE_INSTRUCTION}, 4324 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 4325 0x00000000, 0x00000000, UNDEFINED_INSTRUCTION}, 4326 {ARM_FEATURE_CORE_LOW (0), 4327 0x00000000, 0x00000000, 0} 4328 }; 4329 4330 /* print_insn_thumb16 recognizes the following format control codes: 4331 4332 %S print Thumb register (bits 3..5 as high number if bit 6 set) 4333 %D print Thumb register (bits 0..2 as high number if bit 7 set) 4334 %<bitfield>I print bitfield as a signed decimal 4335 (top bit of range being the sign bit) 4336 %N print Thumb register mask (with LR) 4337 %O print Thumb register mask (with PC) 4338 %M print Thumb register mask 4339 %b print CZB's 6-bit unsigned branch destination 4340 %s print Thumb right-shift immediate (6..10; 0 == 32). 4341 %c print the condition code 4342 %C print the condition code, or "s" if not conditional 4343 %x print warning if conditional an not at end of IT block" 4344 %X print "\t; unpredictable <IT:code>" if conditional 4345 %I print IT instruction suffix and operands 4346 %W print Thumb Writeback indicator for LDMIA 4347 %<bitfield>r print bitfield as an ARM register 4348 %<bitfield>d print bitfield as a decimal 4349 %<bitfield>H print (bitfield * 2) as a decimal 4350 %<bitfield>W print (bitfield * 4) as a decimal 4351 %<bitfield>a print (bitfield * 4) as a pc-rel offset + decoded symbol 4352 %<bitfield>B print Thumb branch destination (signed displacement) 4353 %<bitfield>c print bitfield as a condition code 4354 %<bitnum>'c print specified char iff bit is one 4355 %<bitnum>?ab print a if bit is one else print b. */ 4356 4357 static const struct opcode16 thumb_opcodes[] = 4358 { 4359 /* Thumb instructions. */ 4360 4361 /* ARMv8-M Security Extensions instructions. */ 4362 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 0x4784, 0xff87, "blxns\t%3-6r"}, 4363 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 0x4704, 0xff87, "bxns\t%3-6r"}, 4364 4365 /* ARM V8 instructions. */ 4366 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xbf50, 0xffff, "sevl%c"}, 4367 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xba80, 0xffc0, "hlt\t%0-5x"}, 4368 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN), 0xb610, 0xfff7, "setpan\t#%3-3d"}, 4369 4370 /* ARM V6K no-argument instructions. */ 4371 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf00, 0xffff, "nop%c"}, 4372 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf10, 0xffff, "yield%c"}, 4373 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf20, 0xffff, "wfe%c"}, 4374 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf30, 0xffff, "wfi%c"}, 4375 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf40, 0xffff, "sev%c"}, 4376 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf00, 0xff0f, "nop%c\t{%4-7d}"}, 4377 4378 /* ARM V6T2 instructions. */ 4379 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 4380 0xb900, 0xfd00, "cbnz\t%0-2r, %b%X"}, 4381 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 4382 0xb100, 0xfd00, "cbz\t%0-2r, %b%X"}, 4383 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xbf00, 0xff00, "it%I%X"}, 4384 4385 /* ARM V6. */ 4386 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb660, 0xfff8, "cpsie\t%2'a%1'i%0'f%X"}, 4387 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb670, 0xfff8, "cpsid\t%2'a%1'i%0'f%X"}, 4388 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0x4600, 0xffc0, "mov%c\t%0-2r, %3-5r"}, 4389 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xba00, 0xffc0, "rev%c\t%0-2r, %3-5r"}, 4390 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xba40, 0xffc0, "rev16%c\t%0-2r, %3-5r"}, 4391 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xbac0, 0xffc0, "revsh%c\t%0-2r, %3-5r"}, 4392 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb650, 0xfff7, "setend\t%3?ble%X"}, 4393 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb200, 0xffc0, "sxth%c\t%0-2r, %3-5r"}, 4394 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb240, 0xffc0, "sxtb%c\t%0-2r, %3-5r"}, 4395 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb280, 0xffc0, "uxth%c\t%0-2r, %3-5r"}, 4396 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb2c0, 0xffc0, "uxtb%c\t%0-2r, %3-5r"}, 4397 4398 /* ARM V5 ISA extends Thumb. */ 4399 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5T), 4400 0xbe00, 0xff00, "bkpt\t%0-7x"}, /* Is always unconditional. */ 4401 /* This is BLX(2). BLX(1) is a 32-bit instruction. */ 4402 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5T), 4403 0x4780, 0xff87, "blx%c\t%3-6r%x"}, /* note: 4 bit register number. */ 4404 /* ARM V4T ISA (Thumb v1). */ 4405 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4406 0x46C0, 0xFFFF, "nop%c\t\t\t; (mov r8, r8)"}, 4407 /* Format 4. */ 4408 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4000, 0xFFC0, "and%C\t%0-2r, %3-5r"}, 4409 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4040, 0xFFC0, "eor%C\t%0-2r, %3-5r"}, 4410 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4080, 0xFFC0, "lsl%C\t%0-2r, %3-5r"}, 4411 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x40C0, 0xFFC0, "lsr%C\t%0-2r, %3-5r"}, 4412 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4100, 0xFFC0, "asr%C\t%0-2r, %3-5r"}, 4413 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4140, 0xFFC0, "adc%C\t%0-2r, %3-5r"}, 4414 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4180, 0xFFC0, "sbc%C\t%0-2r, %3-5r"}, 4415 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x41C0, 0xFFC0, "ror%C\t%0-2r, %3-5r"}, 4416 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4200, 0xFFC0, "tst%c\t%0-2r, %3-5r"}, 4417 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4240, 0xFFC0, "neg%C\t%0-2r, %3-5r"}, 4418 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4280, 0xFFC0, "cmp%c\t%0-2r, %3-5r"}, 4419 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x42C0, 0xFFC0, "cmn%c\t%0-2r, %3-5r"}, 4420 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4300, 0xFFC0, "orr%C\t%0-2r, %3-5r"}, 4421 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4340, 0xFFC0, "mul%C\t%0-2r, %3-5r"}, 4422 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4380, 0xFFC0, "bic%C\t%0-2r, %3-5r"}, 4423 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x43C0, 0xFFC0, "mvn%C\t%0-2r, %3-5r"}, 4424 /* format 13 */ 4425 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xB000, 0xFF80, "add%c\tsp, #%0-6W"}, 4426 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xB080, 0xFF80, "sub%c\tsp, #%0-6W"}, 4427 /* format 5 */ 4428 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4700, 0xFF80, "bx%c\t%S%x"}, 4429 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4400, 0xFF00, "add%c\t%D, %S"}, 4430 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4500, 0xFF00, "cmp%c\t%D, %S"}, 4431 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4600, 0xFF00, "mov%c\t%D, %S"}, 4432 /* format 14 */ 4433 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xB400, 0xFE00, "push%c\t%N"}, 4434 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xBC00, 0xFE00, "pop%c\t%O"}, 4435 /* format 2 */ 4436 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4437 0x1800, 0xFE00, "add%C\t%0-2r, %3-5r, %6-8r"}, 4438 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4439 0x1A00, 0xFE00, "sub%C\t%0-2r, %3-5r, %6-8r"}, 4440 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4441 0x1C00, 0xFE00, "add%C\t%0-2r, %3-5r, #%6-8d"}, 4442 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4443 0x1E00, 0xFE00, "sub%C\t%0-2r, %3-5r, #%6-8d"}, 4444 /* format 8 */ 4445 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4446 0x5200, 0xFE00, "strh%c\t%0-2r, [%3-5r, %6-8r]"}, 4447 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4448 0x5A00, 0xFE00, "ldrh%c\t%0-2r, [%3-5r, %6-8r]"}, 4449 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4450 0x5600, 0xF600, "ldrs%11?hb%c\t%0-2r, [%3-5r, %6-8r]"}, 4451 /* format 7 */ 4452 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4453 0x5000, 0xFA00, "str%10'b%c\t%0-2r, [%3-5r, %6-8r]"}, 4454 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4455 0x5800, 0xFA00, "ldr%10'b%c\t%0-2r, [%3-5r, %6-8r]"}, 4456 /* format 1 */ 4457 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x0000, 0xFFC0, "mov%C\t%0-2r, %3-5r"}, 4458 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4459 0x0000, 0xF800, "lsl%C\t%0-2r, %3-5r, #%6-10d"}, 4460 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x0800, 0xF800, "lsr%C\t%0-2r, %3-5r, %s"}, 4461 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x1000, 0xF800, "asr%C\t%0-2r, %3-5r, %s"}, 4462 /* format 3 */ 4463 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x2000, 0xF800, "mov%C\t%8-10r, #%0-7d"}, 4464 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x2800, 0xF800, "cmp%c\t%8-10r, #%0-7d"}, 4465 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x3000, 0xF800, "add%C\t%8-10r, #%0-7d"}, 4466 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x3800, 0xF800, "sub%C\t%8-10r, #%0-7d"}, 4467 /* format 6 */ 4468 /* TODO: Disassemble PC relative "LDR rD,=<symbolic>" */ 4469 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4470 0x4800, 0xF800, 4471 "ldr%c\t%8-10r, [pc, #%0-7W]\t; (%0-7a)"}, 4472 /* format 9 */ 4473 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4474 0x6000, 0xF800, "str%c\t%0-2r, [%3-5r, #%6-10W]"}, 4475 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4476 0x6800, 0xF800, "ldr%c\t%0-2r, [%3-5r, #%6-10W]"}, 4477 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4478 0x7000, 0xF800, "strb%c\t%0-2r, [%3-5r, #%6-10d]"}, 4479 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4480 0x7800, 0xF800, "ldrb%c\t%0-2r, [%3-5r, #%6-10d]"}, 4481 /* format 10 */ 4482 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4483 0x8000, 0xF800, "strh%c\t%0-2r, [%3-5r, #%6-10H]"}, 4484 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4485 0x8800, 0xF800, "ldrh%c\t%0-2r, [%3-5r, #%6-10H]"}, 4486 /* format 11 */ 4487 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4488 0x9000, 0xF800, "str%c\t%8-10r, [sp, #%0-7W]"}, 4489 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4490 0x9800, 0xF800, "ldr%c\t%8-10r, [sp, #%0-7W]"}, 4491 /* format 12 */ 4492 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4493 0xA000, 0xF800, "add%c\t%8-10r, pc, #%0-7W\t; (adr %8-10r, %0-7a)"}, 4494 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 4495 0xA800, 0xF800, "add%c\t%8-10r, sp, #%0-7W"}, 4496 /* format 15 */ 4497 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xC000, 0xF800, "stmia%c\t%8-10r!, %M"}, 4498 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xC800, 0xF800, "ldmia%c\t%8-10r%W, %M"}, 4499 /* format 17 */ 4500 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xDF00, 0xFF00, "svc%c\t%0-7d"}, 4501 /* format 16 */ 4502 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xDE00, 0xFF00, "udf%c\t#%0-7d"}, 4503 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xDE00, 0xFE00, UNDEFINED_INSTRUCTION}, 4504 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xD000, 0xF000, "b%8-11c.n\t%0-7B%X"}, 4505 /* format 18 */ 4506 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xE000, 0xF800, "b%c.n\t%0-10B%x"}, 4507 4508 /* The E800 .. FFFF range is unconditionally redirected to the 4509 32-bit table, because even in pre-V6T2 ISAs, BL and BLX(1) pairs 4510 are processed via that table. Thus, we can never encounter a 4511 bare "second half of BL/BLX(1)" instruction here. */ 4512 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 0x0000, 0x0000, UNDEFINED_INSTRUCTION}, 4513 {ARM_FEATURE_CORE_LOW (0), 0, 0, 0} 4514 }; 4515 4516 /* Thumb32 opcodes use the same table structure as the ARM opcodes. 4517 We adopt the convention that hw1 is the high 16 bits of .value and 4518 .mask, hw2 the low 16 bits. 4519 4520 print_insn_thumb32 recognizes the following format control codes: 4521 4522 %% % 4523 4524 %I print a 12-bit immediate from hw1[10],hw2[14:12,7:0] 4525 %M print a modified 12-bit immediate (same location) 4526 %J print a 16-bit immediate from hw1[3:0,10],hw2[14:12,7:0] 4527 %K print a 16-bit immediate from hw2[3:0],hw1[3:0],hw2[11:4] 4528 %H print a 16-bit immediate from hw2[3:0],hw1[11:0] 4529 %S print a possibly-shifted Rm 4530 4531 %L print address for a ldrd/strd instruction 4532 %a print the address of a plain load/store 4533 %w print the width and signedness of a core load/store 4534 %m print register mask for ldm/stm 4535 %n print register mask for clrm 4536 4537 %E print the lsb and width fields of a bfc/bfi instruction 4538 %F print the lsb and width fields of a sbfx/ubfx instruction 4539 %G print a fallback offset for Branch Future instructions 4540 %W print an offset for BF instruction 4541 %Y print an offset for BFL instruction 4542 %Z print an offset for BFCSEL instruction 4543 %Q print an offset for Low Overhead Loop instructions 4544 %P print an offset for Low Overhead Loop end instructions 4545 %b print a conditional branch offset 4546 %B print an unconditional branch offset 4547 %s print the shift field of an SSAT instruction 4548 %R print the rotation field of an SXT instruction 4549 %U print barrier type. 4550 %P print address for pli instruction. 4551 %c print the condition code 4552 %x print warning if conditional an not at end of IT block" 4553 %X print "\t; unpredictable <IT:code>" if conditional 4554 4555 %<bitfield>d print bitfield in decimal 4556 %<bitfield>D print bitfield plus one in decimal 4557 %<bitfield>W print bitfield*4 in decimal 4558 %<bitfield>r print bitfield as an ARM register 4559 %<bitfield>R as %<>r but r15 is UNPREDICTABLE 4560 %<bitfield>S as %<>r but r13 and r15 is UNPREDICTABLE 4561 %<bitfield>c print bitfield as a condition code 4562 4563 %<bitfield>'c print specified char iff bitfield is all ones 4564 %<bitfield>`c print specified char iff bitfield is all zeroes 4565 %<bitfield>?ab... select from array of values in big endian order 4566 4567 With one exception at the bottom (done because BL and BLX(1) need 4568 to come dead last), this table was machine-sorted first in 4569 decreasing order of number of bits set in the mask, then in 4570 increasing numeric order of mask, then in increasing numeric order 4571 of opcode. This order is not the clearest for a human reader, but 4572 is guaranteed never to catch a special-case bit pattern with a more 4573 general mask, which is important, because this instruction encoding 4574 makes heavy use of special-case bit patterns. */ 4575 static const struct opcode32 thumb32_opcodes[] = 4576 { 4577 /* Armv8.1-M Mainline and Armv8.1-M Mainline Security Extensions 4578 instructions. */ 4579 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 4580 0xf00fe001, 0xffffffff, "lctp%c"}, 4581 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 4582 0xf02fc001, 0xfffff001, "le\t%P"}, 4583 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 4584 0xf00fc001, 0xfffff001, "le\tlr, %P"}, 4585 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 4586 0xf01fc001, 0xfffff001, "letp\tlr, %P"}, 4587 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 4588 0xf040c001, 0xfff0f001, "wls\tlr, %16-19S, %Q"}, 4589 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 4590 0xf000c001, 0xffc0f001, "wlstp.%20-21s\tlr, %16-19S, %Q"}, 4591 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 4592 0xf040e001, 0xfff0ffff, "dls\tlr, %16-19S"}, 4593 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 4594 0xf000e001, 0xffc0ffff, "dlstp.%20-21s\tlr, %16-19S"}, 4595 4596 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 4597 0xf040e001, 0xf860f001, "bf%c\t%G, %W"}, 4598 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 4599 0xf060e001, 0xf8f0f001, "bfx%c\t%G, %16-19S"}, 4600 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 4601 0xf000c001, 0xf800f001, "bfl%c\t%G, %Y"}, 4602 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 4603 0xf070e001, 0xf8f0f001, "bflx%c\t%G, %16-19S"}, 4604 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 4605 0xf000e001, 0xf840f001, "bfcsel\t%G, %Z, %18-21c"}, 4606 4607 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN), 4608 0xe89f0000, 0xffff2000, "clrm%c\t%n"}, 4609 4610 /* ARMv8-M and ARMv8-M Security Extensions instructions. */ 4611 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 0xe97fe97f, 0xffffffff, "sg"}, 4612 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 4613 0xe840f000, 0xfff0f0ff, "tt\t%8-11r, %16-19r"}, 4614 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 4615 0xe840f040, 0xfff0f0ff, "ttt\t%8-11r, %16-19r"}, 4616 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 4617 0xe840f080, 0xfff0f0ff, "tta\t%8-11r, %16-19r"}, 4618 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 4619 0xe840f0c0, 0xfff0f0ff, "ttat\t%8-11r, %16-19r"}, 4620 4621 /* ARM V8.2 RAS extension instructions. */ 4622 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS), 4623 0xf3af8010, 0xffffffff, "esb"}, 4624 4625 /* V8 instructions. */ 4626 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 4627 0xf3af8005, 0xffffffff, "sevl%c.w"}, 4628 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 4629 0xf78f8000, 0xfffffffc, "dcps%0-1d"}, 4630 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 4631 0xe8c00f8f, 0xfff00fff, "stlb%c\t%12-15r, [%16-19R]"}, 4632 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 4633 0xe8c00f9f, 0xfff00fff, "stlh%c\t%12-15r, [%16-19R]"}, 4634 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 4635 0xe8c00faf, 0xfff00fff, "stl%c\t%12-15r, [%16-19R]"}, 4636 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 4637 0xe8c00fc0, 0xfff00ff0, "stlexb%c\t%0-3r, %12-15r, [%16-19R]"}, 4638 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 4639 0xe8c00fd0, 0xfff00ff0, "stlexh%c\t%0-3r, %12-15r, [%16-19R]"}, 4640 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 4641 0xe8c00fe0, 0xfff00ff0, "stlex%c\t%0-3r, %12-15r, [%16-19R]"}, 4642 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 4643 0xe8c000f0, 0xfff000f0, "stlexd%c\t%0-3r, %12-15r, %8-11r, [%16-19R]"}, 4644 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 4645 0xe8d00f8f, 0xfff00fff, "ldab%c\t%12-15r, [%16-19R]"}, 4646 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 4647 0xe8d00f9f, 0xfff00fff, "ldah%c\t%12-15r, [%16-19R]"}, 4648 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 4649 0xe8d00faf, 0xfff00fff, "lda%c\t%12-15r, [%16-19R]"}, 4650 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 4651 0xe8d00fcf, 0xfff00fff, "ldaexb%c\t%12-15r, [%16-19R]"}, 4652 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 4653 0xe8d00fdf, 0xfff00fff, "ldaexh%c\t%12-15r, [%16-19R]"}, 4654 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 4655 0xe8d00fef, 0xfff00fff, "ldaex%c\t%12-15r, [%16-19R]"}, 4656 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 4657 0xe8d000ff, 0xfff000ff, "ldaexd%c\t%12-15r, %8-11r, [%16-19R]"}, 4658 4659 /* CRC32 instructions. */ 4660 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC), 4661 0xfac0f080, 0xfff0f0f0, "crc32b\t%8-11R, %16-19R, %0-3R"}, 4662 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC), 4663 0xfac0f090, 0xfff0f0f0, "crc32h\t%9-11R, %16-19R, %0-3R"}, 4664 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC), 4665 0xfac0f0a0, 0xfff0f0f0, "crc32w\t%8-11R, %16-19R, %0-3R"}, 4666 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC), 4667 0xfad0f080, 0xfff0f0f0, "crc32cb\t%8-11R, %16-19R, %0-3R"}, 4668 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC), 4669 0xfad0f090, 0xfff0f0f0, "crc32ch\t%8-11R, %16-19R, %0-3R"}, 4670 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_CRC), 4671 0xfad0f0a0, 0xfff0f0f0, "crc32cw\t%8-11R, %16-19R, %0-3R"}, 4672 4673 /* Speculation Barriers. */ 4674 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8014, 0xffffffff, "csdb"}, 4675 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3bf8f40, 0xffffffff, "ssbb"}, 4676 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3bf8f44, 0xffffffff, "pssbb"}, 4677 4678 /* V7 instructions. */ 4679 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf910f000, 0xff70f000, "pli%c\t%a"}, 4680 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3af80f0, 0xfffffff0, "dbg%c\t#%0-3d"}, 4681 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf3bf8f51, 0xfffffff3, "dmb%c\t%U"}, 4682 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf3bf8f41, 0xfffffff3, "dsb%c\t%U"}, 4683 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3bf8f50, 0xfffffff0, "dmb%c\t%U"}, 4684 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3bf8f40, 0xfffffff0, "dsb%c\t%U"}, 4685 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3bf8f60, 0xfffffff0, "isb%c\t%U"}, 4686 {ARM_FEATURE_CORE_LOW (ARM_EXT_DIV), 4687 0xfb90f0f0, 0xfff0f0f0, "sdiv%c\t%8-11r, %16-19r, %0-3r"}, 4688 {ARM_FEATURE_CORE_LOW (ARM_EXT_DIV), 4689 0xfbb0f0f0, 0xfff0f0f0, "udiv%c\t%8-11r, %16-19r, %0-3r"}, 4690 4691 /* Virtualization Extension instructions. */ 4692 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 0xf7e08000, 0xfff0f000, "hvc%c\t%V"}, 4693 /* We skip ERET as that is SUBS pc, lr, #0. */ 4694 4695 /* MP Extension instructions. */ 4696 {ARM_FEATURE_CORE_LOW (ARM_EXT_MP), 0xf830f000, 0xff70f000, "pldw%c\t%a"}, 4697 4698 /* Security extension instructions. */ 4699 {ARM_FEATURE_CORE_LOW (ARM_EXT_SEC), 0xf7f08000, 0xfff0f000, "smc%c\t%K"}, 4700 4701 /* ARMv8.5-A instructions. */ 4702 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB), 0xf3bf8f70, 0xffffffff, "sb"}, 4703 4704 /* Instructions defined in the basic V6T2 set. */ 4705 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8000, 0xffffffff, "nop%c.w"}, 4706 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8001, 0xffffffff, "yield%c.w"}, 4707 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8002, 0xffffffff, "wfe%c.w"}, 4708 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8003, 0xffffffff, "wfi%c.w"}, 4709 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8004, 0xffffffff, "sev%c.w"}, 4710 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4711 0xf3af8000, 0xffffff00, "nop%c.w\t{%0-7d}"}, 4712 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf7f0a000, 0xfff0f000, "udf%c.w\t%H"}, 4713 4714 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 4715 0xf3bf8f2f, 0xffffffff, "clrex%c"}, 4716 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4717 0xf3af8400, 0xffffff1f, "cpsie.w\t%7'a%6'i%5'f%X"}, 4718 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4719 0xf3af8600, 0xffffff1f, "cpsid.w\t%7'a%6'i%5'f%X"}, 4720 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4721 0xf3c08f00, 0xfff0ffff, "bxj%c\t%16-19r%x"}, 4722 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4723 0xe810c000, 0xffd0ffff, "rfedb%c\t%16-19r%21'!"}, 4724 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4725 0xe990c000, 0xffd0ffff, "rfeia%c\t%16-19r%21'!"}, 4726 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4727 0xf3e08000, 0xffe0f000, "mrs%c\t%8-11r, %D"}, 4728 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4729 0xf3af8100, 0xffffffe0, "cps\t#%0-4d%X"}, 4730 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4731 0xe8d0f000, 0xfff0fff0, "tbb%c\t[%16-19r, %0-3r]%x"}, 4732 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4733 0xe8d0f010, 0xfff0fff0, "tbh%c\t[%16-19r, %0-3r, lsl #1]%x"}, 4734 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4735 0xf3af8500, 0xffffff00, "cpsie\t%7'a%6'i%5'f, #%0-4d%X"}, 4736 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4737 0xf3af8700, 0xffffff00, "cpsid\t%7'a%6'i%5'f, #%0-4d%X"}, 4738 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4739 0xf3de8f00, 0xffffff00, "subs%c\tpc, lr, #%0-7d"}, 4740 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4741 0xf3808000, 0xffe0f000, "msr%c\t%C, %16-19r"}, 4742 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 4743 0xe8500f00, 0xfff00fff, "ldrex%c\t%12-15r, [%16-19r]"}, 4744 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 4745 0xe8d00f4f, 0xfff00fef, "ldrex%4?hb%c\t%12-15r, [%16-19r]"}, 4746 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4747 0xe800c000, 0xffd0ffe0, "srsdb%c\t%16-19r%21'!, #%0-4d"}, 4748 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4749 0xe980c000, 0xffd0ffe0, "srsia%c\t%16-19r%21'!, #%0-4d"}, 4750 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4751 0xfa0ff080, 0xfffff0c0, "sxth%c.w\t%8-11r, %0-3r%R"}, 4752 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4753 0xfa1ff080, 0xfffff0c0, "uxth%c.w\t%8-11r, %0-3r%R"}, 4754 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4755 0xfa2ff080, 0xfffff0c0, "sxtb16%c\t%8-11r, %0-3r%R"}, 4756 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4757 0xfa3ff080, 0xfffff0c0, "uxtb16%c\t%8-11r, %0-3r%R"}, 4758 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4759 0xfa4ff080, 0xfffff0c0, "sxtb%c.w\t%8-11r, %0-3r%R"}, 4760 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4761 0xfa5ff080, 0xfffff0c0, "uxtb%c.w\t%8-11r, %0-3r%R"}, 4762 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 4763 0xe8400000, 0xfff000ff, "strex%c\t%8-11r, %12-15r, [%16-19r]"}, 4764 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4765 0xe8d0007f, 0xfff000ff, "ldrexd%c\t%12-15r, %8-11r, [%16-19r]"}, 4766 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4767 0xfa80f000, 0xfff0f0f0, "sadd8%c\t%8-11r, %16-19r, %0-3r"}, 4768 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4769 0xfa80f010, 0xfff0f0f0, "qadd8%c\t%8-11r, %16-19r, %0-3r"}, 4770 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4771 0xfa80f020, 0xfff0f0f0, "shadd8%c\t%8-11r, %16-19r, %0-3r"}, 4772 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4773 0xfa80f040, 0xfff0f0f0, "uadd8%c\t%8-11r, %16-19r, %0-3r"}, 4774 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4775 0xfa80f050, 0xfff0f0f0, "uqadd8%c\t%8-11r, %16-19r, %0-3r"}, 4776 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4777 0xfa80f060, 0xfff0f0f0, "uhadd8%c\t%8-11r, %16-19r, %0-3r"}, 4778 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4779 0xfa80f080, 0xfff0f0f0, "qadd%c\t%8-11r, %0-3r, %16-19r"}, 4780 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4781 0xfa80f090, 0xfff0f0f0, "qdadd%c\t%8-11r, %0-3r, %16-19r"}, 4782 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4783 0xfa80f0a0, 0xfff0f0f0, "qsub%c\t%8-11r, %0-3r, %16-19r"}, 4784 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4785 0xfa80f0b0, 0xfff0f0f0, "qdsub%c\t%8-11r, %0-3r, %16-19r"}, 4786 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4787 0xfa90f000, 0xfff0f0f0, "sadd16%c\t%8-11r, %16-19r, %0-3r"}, 4788 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4789 0xfa90f010, 0xfff0f0f0, "qadd16%c\t%8-11r, %16-19r, %0-3r"}, 4790 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4791 0xfa90f020, 0xfff0f0f0, "shadd16%c\t%8-11r, %16-19r, %0-3r"}, 4792 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4793 0xfa90f040, 0xfff0f0f0, "uadd16%c\t%8-11r, %16-19r, %0-3r"}, 4794 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4795 0xfa90f050, 0xfff0f0f0, "uqadd16%c\t%8-11r, %16-19r, %0-3r"}, 4796 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4797 0xfa90f060, 0xfff0f0f0, "uhadd16%c\t%8-11r, %16-19r, %0-3r"}, 4798 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4799 0xfa90f080, 0xfff0f0f0, "rev%c.w\t%8-11r, %16-19r"}, 4800 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4801 0xfa90f090, 0xfff0f0f0, "rev16%c.w\t%8-11r, %16-19r"}, 4802 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4803 0xfa90f0a0, 0xfff0f0f0, "rbit%c\t%8-11r, %16-19r"}, 4804 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4805 0xfa90f0b0, 0xfff0f0f0, "revsh%c.w\t%8-11r, %16-19r"}, 4806 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4807 0xfaa0f000, 0xfff0f0f0, "sasx%c\t%8-11r, %16-19r, %0-3r"}, 4808 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4809 0xfaa0f010, 0xfff0f0f0, "qasx%c\t%8-11r, %16-19r, %0-3r"}, 4810 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4811 0xfaa0f020, 0xfff0f0f0, "shasx%c\t%8-11r, %16-19r, %0-3r"}, 4812 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4813 0xfaa0f040, 0xfff0f0f0, "uasx%c\t%8-11r, %16-19r, %0-3r"}, 4814 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4815 0xfaa0f050, 0xfff0f0f0, "uqasx%c\t%8-11r, %16-19r, %0-3r"}, 4816 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4817 0xfaa0f060, 0xfff0f0f0, "uhasx%c\t%8-11r, %16-19r, %0-3r"}, 4818 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4819 0xfaa0f080, 0xfff0f0f0, "sel%c\t%8-11r, %16-19r, %0-3r"}, 4820 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4821 0xfab0f080, 0xfff0f0f0, "clz%c\t%8-11r, %16-19r"}, 4822 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4823 0xfac0f000, 0xfff0f0f0, "ssub8%c\t%8-11r, %16-19r, %0-3r"}, 4824 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4825 0xfac0f010, 0xfff0f0f0, "qsub8%c\t%8-11r, %16-19r, %0-3r"}, 4826 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4827 0xfac0f020, 0xfff0f0f0, "shsub8%c\t%8-11r, %16-19r, %0-3r"}, 4828 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4829 0xfac0f040, 0xfff0f0f0, "usub8%c\t%8-11r, %16-19r, %0-3r"}, 4830 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4831 0xfac0f050, 0xfff0f0f0, "uqsub8%c\t%8-11r, %16-19r, %0-3r"}, 4832 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4833 0xfac0f060, 0xfff0f0f0, "uhsub8%c\t%8-11r, %16-19r, %0-3r"}, 4834 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4835 0xfad0f000, 0xfff0f0f0, "ssub16%c\t%8-11r, %16-19r, %0-3r"}, 4836 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4837 0xfad0f010, 0xfff0f0f0, "qsub16%c\t%8-11r, %16-19r, %0-3r"}, 4838 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4839 0xfad0f020, 0xfff0f0f0, "shsub16%c\t%8-11r, %16-19r, %0-3r"}, 4840 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4841 0xfad0f040, 0xfff0f0f0, "usub16%c\t%8-11r, %16-19r, %0-3r"}, 4842 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4843 0xfad0f050, 0xfff0f0f0, "uqsub16%c\t%8-11r, %16-19r, %0-3r"}, 4844 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4845 0xfad0f060, 0xfff0f0f0, "uhsub16%c\t%8-11r, %16-19r, %0-3r"}, 4846 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4847 0xfae0f000, 0xfff0f0f0, "ssax%c\t%8-11r, %16-19r, %0-3r"}, 4848 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4849 0xfae0f010, 0xfff0f0f0, "qsax%c\t%8-11r, %16-19r, %0-3r"}, 4850 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4851 0xfae0f020, 0xfff0f0f0, "shsax%c\t%8-11r, %16-19r, %0-3r"}, 4852 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4853 0xfae0f040, 0xfff0f0f0, "usax%c\t%8-11r, %16-19r, %0-3r"}, 4854 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4855 0xfae0f050, 0xfff0f0f0, "uqsax%c\t%8-11r, %16-19r, %0-3r"}, 4856 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4857 0xfae0f060, 0xfff0f0f0, "uhsax%c\t%8-11r, %16-19r, %0-3r"}, 4858 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4859 0xfb00f000, 0xfff0f0f0, "mul%c.w\t%8-11r, %16-19r, %0-3r"}, 4860 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4861 0xfb70f000, 0xfff0f0f0, "usad8%c\t%8-11r, %16-19r, %0-3r"}, 4862 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4863 0xfa00f000, 0xffe0f0f0, "lsl%20's%c.w\t%8-11R, %16-19R, %0-3R"}, 4864 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4865 0xfa20f000, 0xffe0f0f0, "lsr%20's%c.w\t%8-11R, %16-19R, %0-3R"}, 4866 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4867 0xfa40f000, 0xffe0f0f0, "asr%20's%c.w\t%8-11R, %16-19R, %0-3R"}, 4868 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4869 0xfa60f000, 0xffe0f0f0, "ror%20's%c.w\t%8-11r, %16-19r, %0-3r"}, 4870 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 4871 0xe8c00f40, 0xfff00fe0, "strex%4?hb%c\t%0-3r, %12-15r, [%16-19r]"}, 4872 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4873 0xf3200000, 0xfff0f0e0, "ssat16%c\t%8-11r, #%0-4D, %16-19r"}, 4874 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4875 0xf3a00000, 0xfff0f0e0, "usat16%c\t%8-11r, #%0-4d, %16-19r"}, 4876 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4877 0xfb20f000, 0xfff0f0e0, "smuad%4'x%c\t%8-11r, %16-19r, %0-3r"}, 4878 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4879 0xfb30f000, 0xfff0f0e0, "smulw%4?tb%c\t%8-11r, %16-19r, %0-3r"}, 4880 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4881 0xfb40f000, 0xfff0f0e0, "smusd%4'x%c\t%8-11r, %16-19r, %0-3r"}, 4882 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4883 0xfb50f000, 0xfff0f0e0, "smmul%4'r%c\t%8-11r, %16-19r, %0-3r"}, 4884 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4885 0xfa00f080, 0xfff0f0c0, "sxtah%c\t%8-11r, %16-19r, %0-3r%R"}, 4886 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4887 0xfa10f080, 0xfff0f0c0, "uxtah%c\t%8-11r, %16-19r, %0-3r%R"}, 4888 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4889 0xfa20f080, 0xfff0f0c0, "sxtab16%c\t%8-11r, %16-19r, %0-3r%R"}, 4890 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4891 0xfa30f080, 0xfff0f0c0, "uxtab16%c\t%8-11r, %16-19r, %0-3r%R"}, 4892 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4893 0xfa40f080, 0xfff0f0c0, "sxtab%c\t%8-11r, %16-19r, %0-3r%R"}, 4894 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4895 0xfa50f080, 0xfff0f0c0, "uxtab%c\t%8-11r, %16-19r, %0-3r%R"}, 4896 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4897 0xfb10f000, 0xfff0f0c0, "smul%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r"}, 4898 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4899 0xf36f0000, 0xffff8020, "bfc%c\t%8-11r, %E"}, 4900 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4901 0xea100f00, 0xfff08f00, "tst%c.w\t%16-19r, %S"}, 4902 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4903 0xea900f00, 0xfff08f00, "teq%c\t%16-19r, %S"}, 4904 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4905 0xeb100f00, 0xfff08f00, "cmn%c.w\t%16-19r, %S"}, 4906 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4907 0xebb00f00, 0xfff08f00, "cmp%c.w\t%16-19r, %S"}, 4908 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4909 0xf0100f00, 0xfbf08f00, "tst%c.w\t%16-19r, %M"}, 4910 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4911 0xf0900f00, 0xfbf08f00, "teq%c\t%16-19r, %M"}, 4912 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4913 0xf1100f00, 0xfbf08f00, "cmn%c.w\t%16-19r, %M"}, 4914 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4915 0xf1b00f00, 0xfbf08f00, "cmp%c.w\t%16-19r, %M"}, 4916 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4917 0xea4f0000, 0xffef8000, "mov%20's%c.w\t%8-11r, %S"}, 4918 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4919 0xea6f0000, 0xffef8000, "mvn%20's%c.w\t%8-11r, %S"}, 4920 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4921 0xe8c00070, 0xfff000f0, "strexd%c\t%0-3r, %12-15r, %8-11r, [%16-19r]"}, 4922 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4923 0xfb000000, 0xfff000f0, "mla%c\t%8-11r, %16-19r, %0-3r, %12-15r"}, 4924 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4925 0xfb000010, 0xfff000f0, "mls%c\t%8-11r, %16-19r, %0-3r, %12-15r"}, 4926 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4927 0xfb700000, 0xfff000f0, "usada8%c\t%8-11R, %16-19R, %0-3R, %12-15R"}, 4928 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4929 0xfb800000, 0xfff000f0, "smull%c\t%12-15R, %8-11R, %16-19R, %0-3R"}, 4930 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4931 0xfba00000, 0xfff000f0, "umull%c\t%12-15R, %8-11R, %16-19R, %0-3R"}, 4932 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4933 0xfbc00000, 0xfff000f0, "smlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"}, 4934 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4935 0xfbe00000, 0xfff000f0, "umlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"}, 4936 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4937 0xfbe00060, 0xfff000f0, "umaal%c\t%12-15R, %8-11R, %16-19R, %0-3R"}, 4938 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 4939 0xe8500f00, 0xfff00f00, "ldrex%c\t%12-15r, [%16-19r, #%0-7W]"}, 4940 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4941 0xf04f0000, 0xfbef8000, "mov%20's%c.w\t%8-11r, %M"}, 4942 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4943 0xf06f0000, 0xfbef8000, "mvn%20's%c.w\t%8-11r, %M"}, 4944 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4945 0xf810f000, 0xff70f000, "pld%c\t%a"}, 4946 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4947 0xfb200000, 0xfff000e0, "smlad%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"}, 4948 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4949 0xfb300000, 0xfff000e0, "smlaw%4?tb%c\t%8-11R, %16-19R, %0-3R, %12-15R"}, 4950 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4951 0xfb400000, 0xfff000e0, "smlsd%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"}, 4952 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4953 0xfb500000, 0xfff000e0, "smmla%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"}, 4954 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4955 0xfb600000, 0xfff000e0, "smmls%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"}, 4956 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4957 0xfbc000c0, 0xfff000e0, "smlald%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"}, 4958 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4959 0xfbd000c0, 0xfff000e0, "smlsld%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"}, 4960 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4961 0xeac00000, 0xfff08030, "pkhbt%c\t%8-11r, %16-19r, %S"}, 4962 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4963 0xeac00020, 0xfff08030, "pkhtb%c\t%8-11r, %16-19r, %S"}, 4964 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4965 0xf3400000, 0xfff08020, "sbfx%c\t%8-11r, %16-19r, %F"}, 4966 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4967 0xf3c00000, 0xfff08020, "ubfx%c\t%8-11r, %16-19r, %F"}, 4968 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4969 0xf8000e00, 0xff900f00, "str%wt%c\t%12-15r, %a"}, 4970 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4971 0xfb100000, 0xfff000c0, 4972 "smla%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r, %12-15r"}, 4973 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4974 0xfbc00080, 0xfff000c0, 4975 "smlal%5?tb%4?tb%c\t%12-15r, %8-11r, %16-19r, %0-3r"}, 4976 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4977 0xf3600000, 0xfff08020, "bfi%c\t%8-11r, %16-19r, %E"}, 4978 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4979 0xf8100e00, 0xfe900f00, "ldr%wt%c\t%12-15r, %a"}, 4980 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4981 0xf3000000, 0xffd08020, "ssat%c\t%8-11r, #%0-4D, %16-19r%s"}, 4982 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4983 0xf3800000, 0xffd08020, "usat%c\t%8-11r, #%0-4d, %16-19r%s"}, 4984 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4985 0xf2000000, 0xfbf08000, "addw%c\t%8-11r, %16-19r, %I"}, 4986 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 4987 0xf2400000, 0xfbf08000, "movw%c\t%8-11r, %J"}, 4988 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4989 0xf2a00000, 0xfbf08000, "subw%c\t%8-11r, %16-19r, %I"}, 4990 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 4991 0xf2c00000, 0xfbf08000, "movt%c\t%8-11r, %J"}, 4992 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4993 0xea000000, 0xffe08000, "and%20's%c.w\t%8-11r, %16-19r, %S"}, 4994 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4995 0xea200000, 0xffe08000, "bic%20's%c.w\t%8-11r, %16-19r, %S"}, 4996 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4997 0xea400000, 0xffe08000, "orr%20's%c.w\t%8-11r, %16-19r, %S"}, 4998 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 4999 0xea600000, 0xffe08000, "orn%20's%c\t%8-11r, %16-19r, %S"}, 5000 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5001 0xea800000, 0xffe08000, "eor%20's%c.w\t%8-11r, %16-19r, %S"}, 5002 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5003 0xeb000000, 0xffe08000, "add%20's%c.w\t%8-11r, %16-19r, %S"}, 5004 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5005 0xeb400000, 0xffe08000, "adc%20's%c.w\t%8-11r, %16-19r, %S"}, 5006 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5007 0xeb600000, 0xffe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %S"}, 5008 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5009 0xeba00000, 0xffe08000, "sub%20's%c.w\t%8-11r, %16-19r, %S"}, 5010 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5011 0xebc00000, 0xffe08000, "rsb%20's%c\t%8-11r, %16-19r, %S"}, 5012 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 5013 0xe8400000, 0xfff00000, "strex%c\t%8-11r, %12-15r, [%16-19r, #%0-7W]"}, 5014 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5015 0xf0000000, 0xfbe08000, "and%20's%c.w\t%8-11r, %16-19r, %M"}, 5016 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5017 0xf0200000, 0xfbe08000, "bic%20's%c.w\t%8-11r, %16-19r, %M"}, 5018 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5019 0xf0400000, 0xfbe08000, "orr%20's%c.w\t%8-11r, %16-19r, %M"}, 5020 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5021 0xf0600000, 0xfbe08000, "orn%20's%c\t%8-11r, %16-19r, %M"}, 5022 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5023 0xf0800000, 0xfbe08000, "eor%20's%c.w\t%8-11r, %16-19r, %M"}, 5024 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5025 0xf1000000, 0xfbe08000, "add%20's%c.w\t%8-11r, %16-19r, %M"}, 5026 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5027 0xf1400000, 0xfbe08000, "adc%20's%c.w\t%8-11r, %16-19r, %M"}, 5028 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5029 0xf1600000, 0xfbe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %M"}, 5030 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5031 0xf1a00000, 0xfbe08000, "sub%20's%c.w\t%8-11r, %16-19r, %M"}, 5032 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5033 0xf1c00000, 0xfbe08000, "rsb%20's%c\t%8-11r, %16-19r, %M"}, 5034 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5035 0xe8800000, 0xffd00000, "stmia%c.w\t%16-19r%21'!, %m"}, 5036 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5037 0xe8900000, 0xffd00000, "ldmia%c.w\t%16-19r%21'!, %m"}, 5038 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5039 0xe9000000, 0xffd00000, "stmdb%c\t%16-19r%21'!, %m"}, 5040 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5041 0xe9100000, 0xffd00000, "ldmdb%c\t%16-19r%21'!, %m"}, 5042 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5043 0xe9c00000, 0xffd000ff, "strd%c\t%12-15r, %8-11r, [%16-19r]"}, 5044 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5045 0xe9d00000, 0xffd000ff, "ldrd%c\t%12-15r, %8-11r, [%16-19r]"}, 5046 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5047 0xe9400000, 0xff500000, 5048 "strd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!%L"}, 5049 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5050 0xe9500000, 0xff500000, 5051 "ldrd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!%L"}, 5052 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5053 0xe8600000, 0xff700000, 5054 "strd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W%L"}, 5055 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5056 0xe8700000, 0xff700000, 5057 "ldrd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W%L"}, 5058 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5059 0xf8000000, 0xff100000, "str%w%c.w\t%12-15r, %a"}, 5060 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5061 0xf8100000, 0xfe100000, "ldr%w%c.w\t%12-15r, %a"}, 5062 5063 /* Filter out Bcc with cond=E or F, which are used for other instructions. */ 5064 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5065 0xf3c08000, 0xfbc0d000, "undefined (bcc, cond=0xF)"}, 5066 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5067 0xf3808000, 0xfbc0d000, "undefined (bcc, cond=0xE)"}, 5068 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5069 0xf0008000, 0xf800d000, "b%22-25c.w\t%b%X"}, 5070 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 5071 0xf0009000, 0xf800d000, "b%c.w\t%B%x"}, 5072 5073 /* These have been 32-bit since the invention of Thumb. */ 5074 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 5075 0xf000c000, 0xf800d001, "blx%c\t%B%x"}, 5076 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 5077 0xf000d000, 0xf800d000, "bl%c\t%B%x"}, 5078 5079 /* Fallback. */ 5080 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 5081 0x00000000, 0x00000000, UNDEFINED_INSTRUCTION}, 5082 {ARM_FEATURE_CORE_LOW (0), 0, 0, 0} 5083 }; 5084 5085 static const char *const arm_conditional[] = 5086 {"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc", 5087 "hi", "ls", "ge", "lt", "gt", "le", "al", "<und>", ""}; 5088 5089 static const char *const arm_fp_const[] = 5090 {"0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0"}; 5091 5092 static const char *const arm_shift[] = 5093 {"lsl", "lsr", "asr", "ror"}; 5094 5095 typedef struct 5096 { 5097 const char *name; 5098 const char *description; 5099 const char *reg_names[16]; 5100 } 5101 arm_regname; 5102 5103 static const arm_regname regnames[] = 5104 { 5105 { "reg-names-raw", N_("Select raw register names"), 5106 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}}, 5107 { "reg-names-gcc", N_("Select register names used by GCC"), 5108 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "sl", "fp", "ip", "sp", "lr", "pc" }}, 5109 { "reg-names-std", N_("Select register names used in ARM's ISA documentation"), 5110 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc" }}, 5111 { "force-thumb", N_("Assume all insns are Thumb insns"), {NULL} }, 5112 { "no-force-thumb", N_("Examine preceding label to determine an insn's type"), {NULL} }, 5113 { "reg-names-apcs", N_("Select register names used in the APCS"), 5114 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "sl", "fp", "ip", "sp", "lr", "pc" }}, 5115 { "reg-names-atpcs", N_("Select register names used in the ATPCS"), 5116 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "IP", "SP", "LR", "PC" }}, 5117 { "reg-names-special-atpcs", N_("Select special register names used in the ATPCS"), 5118 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL", "FP", "IP", "SP", "LR", "PC" }} 5119 }; 5120 5121 static const char *const iwmmxt_wwnames[] = 5122 {"b", "h", "w", "d"}; 5123 5124 static const char *const iwmmxt_wwssnames[] = 5125 {"b", "bus", "bc", "bss", 5126 "h", "hus", "hc", "hss", 5127 "w", "wus", "wc", "wss", 5128 "d", "dus", "dc", "dss" 5129 }; 5130 5131 static const char *const iwmmxt_regnames[] = 5132 { "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7", 5133 "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15" 5134 }; 5135 5136 static const char *const iwmmxt_cregnames[] = 5137 { "wcid", "wcon", "wcssf", "wcasf", "reserved", "reserved", "reserved", "reserved", 5138 "wcgr0", "wcgr1", "wcgr2", "wcgr3", "reserved", "reserved", "reserved", "reserved" 5139 }; 5140 5141 static const char *const vec_condnames[] = 5142 { "eq", "ne", "cs", "hi", "ge", "lt", "gt", "le" 5143 }; 5144 5145 static const char *const mve_predicatenames[] = 5146 { "", "ttt", "tt", "tte", "t", "tee", "te", "tet", "", 5147 "eee", "ee", "eet", "e", "ett", "et", "ete" 5148 }; 5149 5150 /* Names for 2-bit size field for mve vector isntructions. */ 5151 static const char *const mve_vec_sizename[] = 5152 { "8", "16", "32", "64"}; 5153 5154 /* Indicates whether we are processing a then predicate, 5155 else predicate or none at all. */ 5156 enum vpt_pred_state 5157 { 5158 PRED_NONE, 5159 PRED_THEN, 5160 PRED_ELSE 5161 }; 5162 5163 /* Information used to process a vpt block and subsequent instructions. */ 5164 struct vpt_block 5165 { 5166 /* Are we in a vpt block. */ 5167 bfd_boolean in_vpt_block; 5168 5169 /* Next predicate state if in vpt block. */ 5170 enum vpt_pred_state next_pred_state; 5171 5172 /* Mask from vpt/vpst instruction. */ 5173 long predicate_mask; 5174 5175 /* Instruction number in vpt block. */ 5176 long current_insn_num; 5177 5178 /* Number of instructions in vpt block.. */ 5179 long num_pred_insn; 5180 }; 5181 5182 static struct vpt_block vpt_block_state = 5183 { 5184 FALSE, 5185 PRED_NONE, 5186 0, 5187 0, 5188 0 5189 }; 5190 5191 /* Default to GCC register name set. */ 5192 static unsigned int regname_selected = 1; 5193 5194 #define NUM_ARM_OPTIONS ARRAY_SIZE (regnames) 5195 #define arm_regnames regnames[regname_selected].reg_names 5196 5197 static bfd_boolean force_thumb = FALSE; 5198 5199 /* Current IT instruction state. This contains the same state as the IT 5200 bits in the CPSR. */ 5201 static unsigned int ifthen_state; 5202 /* IT state for the next instruction. */ 5203 static unsigned int ifthen_next_state; 5204 /* The address of the insn for which the IT state is valid. */ 5205 static bfd_vma ifthen_address; 5206 #define IFTHEN_COND ((ifthen_state >> 4) & 0xf) 5207 /* Indicates that the current Conditional state is unconditional or outside 5208 an IT block. */ 5209 #define COND_UNCOND 16 5210 5211 5212 /* Functions. */ 5213 /* Extract the predicate mask for a VPT or VPST instruction. 5214 The mask is composed of bits 13-15 (Mkl) and bit 22 (Mkh). */ 5215 5216 static long 5217 mve_extract_pred_mask (long given) 5218 { 5219 return ((given & 0x00400000) >> 19) | ((given & 0xe000) >> 13); 5220 } 5221 5222 /* Return the number of instructions in a MVE predicate block. */ 5223 static long 5224 num_instructions_vpt_block (long given) 5225 { 5226 long mask = mve_extract_pred_mask (given); 5227 if (mask == 0) 5228 return 0; 5229 5230 if (mask == 8) 5231 return 1; 5232 5233 if ((mask & 7) == 4) 5234 return 2; 5235 5236 if ((mask & 3) == 2) 5237 return 3; 5238 5239 if ((mask & 1) == 1) 5240 return 4; 5241 5242 return 0; 5243 } 5244 5245 static void 5246 mark_outside_vpt_block (void) 5247 { 5248 vpt_block_state.in_vpt_block = FALSE; 5249 vpt_block_state.next_pred_state = PRED_NONE; 5250 vpt_block_state.predicate_mask = 0; 5251 vpt_block_state.current_insn_num = 0; 5252 vpt_block_state.num_pred_insn = 0; 5253 } 5254 5255 static void 5256 mark_inside_vpt_block (long given) 5257 { 5258 vpt_block_state.in_vpt_block = TRUE; 5259 vpt_block_state.next_pred_state = PRED_THEN; 5260 vpt_block_state.predicate_mask = mve_extract_pred_mask (given); 5261 vpt_block_state.current_insn_num = 0; 5262 vpt_block_state.num_pred_insn = num_instructions_vpt_block (given); 5263 assert (vpt_block_state.num_pred_insn >= 1); 5264 } 5265 5266 static enum vpt_pred_state 5267 invert_next_predicate_state (enum vpt_pred_state astate) 5268 { 5269 if (astate == PRED_THEN) 5270 return PRED_ELSE; 5271 else if (astate == PRED_ELSE) 5272 return PRED_THEN; 5273 else 5274 return PRED_NONE; 5275 } 5276 5277 static enum vpt_pred_state 5278 update_next_predicate_state (void) 5279 { 5280 long pred_mask = vpt_block_state.predicate_mask; 5281 long mask_for_insn = 0; 5282 5283 switch (vpt_block_state.current_insn_num) 5284 { 5285 case 1: 5286 mask_for_insn = 8; 5287 break; 5288 5289 case 2: 5290 mask_for_insn = 4; 5291 break; 5292 5293 case 3: 5294 mask_for_insn = 2; 5295 break; 5296 5297 case 4: 5298 return PRED_NONE; 5299 } 5300 5301 if (pred_mask & mask_for_insn) 5302 return invert_next_predicate_state (vpt_block_state.next_pred_state); 5303 else 5304 return vpt_block_state.next_pred_state; 5305 } 5306 5307 static void 5308 update_vpt_block_state (void) 5309 { 5310 vpt_block_state.current_insn_num++; 5311 if (vpt_block_state.current_insn_num == vpt_block_state.num_pred_insn) 5312 { 5313 /* No more instructions to process in vpt block. */ 5314 mark_outside_vpt_block (); 5315 return; 5316 } 5317 5318 vpt_block_state.next_pred_state = update_next_predicate_state (); 5319 } 5320 5321 /* Decode a bitfield of the form matching regexp (N(-N)?,)*N(-N)?. 5322 Returns pointer to following character of the format string and 5323 fills in *VALUEP and *WIDTHP with the extracted value and number of 5324 bits extracted. WIDTHP can be NULL. */ 5325 5326 static const char * 5327 arm_decode_bitfield (const char *ptr, 5328 unsigned long insn, 5329 unsigned long *valuep, 5330 int *widthp) 5331 { 5332 unsigned long value = 0; 5333 int width = 0; 5334 5335 do 5336 { 5337 int start, end; 5338 int bits; 5339 5340 for (start = 0; *ptr >= '0' && *ptr <= '9'; ptr++) 5341 start = start * 10 + *ptr - '0'; 5342 if (*ptr == '-') 5343 for (end = 0, ptr++; *ptr >= '0' && *ptr <= '9'; ptr++) 5344 end = end * 10 + *ptr - '0'; 5345 else 5346 end = start; 5347 bits = end - start; 5348 if (bits < 0) 5349 abort (); 5350 value |= ((insn >> start) & ((2ul << bits) - 1)) << width; 5351 width += bits + 1; 5352 } 5353 while (*ptr++ == ','); 5354 *valuep = value; 5355 if (widthp) 5356 *widthp = width; 5357 return ptr - 1; 5358 } 5359 5360 static void 5361 arm_decode_shift (long given, fprintf_ftype func, void *stream, 5362 bfd_boolean print_shift) 5363 { 5364 func (stream, "%s", arm_regnames[given & 0xf]); 5365 5366 if ((given & 0xff0) != 0) 5367 { 5368 if ((given & 0x10) == 0) 5369 { 5370 int amount = (given & 0xf80) >> 7; 5371 int shift = (given & 0x60) >> 5; 5372 5373 if (amount == 0) 5374 { 5375 if (shift == 3) 5376 { 5377 func (stream, ", rrx"); 5378 return; 5379 } 5380 5381 amount = 32; 5382 } 5383 5384 if (print_shift) 5385 func (stream, ", %s #%d", arm_shift[shift], amount); 5386 else 5387 func (stream, ", #%d", amount); 5388 } 5389 else if ((given & 0x80) == 0x80) 5390 func (stream, "\t; <illegal shifter operand>"); 5391 else if (print_shift) 5392 func (stream, ", %s %s", arm_shift[(given & 0x60) >> 5], 5393 arm_regnames[(given & 0xf00) >> 8]); 5394 else 5395 func (stream, ", %s", arm_regnames[(given & 0xf00) >> 8]); 5396 } 5397 } 5398 5399 /* Return TRUE if the MATCHED_INSN can be inside an IT block. */ 5400 5401 static bfd_boolean 5402 is_mve_okay_in_it (enum mve_instructions matched_insn) 5403 { 5404 switch (matched_insn) 5405 { 5406 case MVE_VMOV_GP_TO_VEC_LANE: 5407 case MVE_VMOV2_VEC_LANE_TO_GP: 5408 case MVE_VMOV2_GP_TO_VEC_LANE: 5409 case MVE_VMOV_VEC_LANE_TO_GP: 5410 case MVE_LSLL: 5411 case MVE_LSLLI: 5412 case MVE_LSRL: 5413 case MVE_ASRL: 5414 case MVE_ASRLI: 5415 case MVE_SQRSHRL: 5416 case MVE_SQRSHR: 5417 case MVE_UQRSHL: 5418 case MVE_UQRSHLL: 5419 case MVE_UQSHL: 5420 case MVE_UQSHLL: 5421 case MVE_URSHRL: 5422 case MVE_URSHR: 5423 case MVE_SRSHRL: 5424 case MVE_SRSHR: 5425 case MVE_SQSHLL: 5426 case MVE_SQSHL: 5427 return TRUE; 5428 default: 5429 return FALSE; 5430 } 5431 } 5432 5433 static bfd_boolean 5434 is_mve_architecture (struct disassemble_info *info) 5435 { 5436 struct arm_private_data *private_data = info->private_data; 5437 arm_feature_set allowed_arches = private_data->features; 5438 5439 arm_feature_set arm_ext_v8_1m_main 5440 = ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN); 5441 5442 if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main, allowed_arches) 5443 && !ARM_CPU_IS_ANY (allowed_arches)) 5444 return TRUE; 5445 else 5446 return FALSE; 5447 } 5448 5449 static bfd_boolean 5450 is_vpt_instruction (long given) 5451 { 5452 5453 /* If mkh:mkl is '0000' then its not a vpt/vpst instruction. */ 5454 if ((given & 0x0040e000) == 0) 5455 return FALSE; 5456 5457 /* VPT floating point T1 variant. */ 5458 if (((given & 0xefb10f50) == 0xee310f00 && ((given & 0x1001) != 0x1)) 5459 /* VPT floating point T2 variant. */ 5460 || ((given & 0xefb10f50) == 0xee310f40) 5461 /* VPT vector T1 variant. */ 5462 || ((given & 0xff811f51) == 0xfe010f00) 5463 /* VPT vector T2 variant. */ 5464 || ((given & 0xff811f51) == 0xfe010f01 5465 && ((given & 0x300000) != 0x300000)) 5466 /* VPT vector T3 variant. */ 5467 || ((given & 0xff811f50) == 0xfe011f00) 5468 /* VPT vector T4 variant. */ 5469 || ((given & 0xff811f70) == 0xfe010f40) 5470 /* VPT vector T5 variant. */ 5471 || ((given & 0xff811f70) == 0xfe010f60) 5472 /* VPT vector T6 variant. */ 5473 || ((given & 0xff811f50) == 0xfe011f40) 5474 /* VPST vector T variant. */ 5475 || ((given & 0xffbf1fff) == 0xfe310f4d)) 5476 return TRUE; 5477 else 5478 return FALSE; 5479 } 5480 5481 /* Decode a bitfield from opcode GIVEN, with starting bitfield = START 5482 and ending bitfield = END. END must be greater than START. */ 5483 5484 static unsigned long 5485 arm_decode_field (unsigned long given, unsigned int start, unsigned int end) 5486 { 5487 int bits = end - start; 5488 5489 if (bits < 0) 5490 abort (); 5491 5492 return ((given >> start) & ((2ul << bits) - 1)); 5493 } 5494 5495 /* Decode a bitfield from opcode GIVEN, with multiple bitfields: 5496 START:END and START2:END2. END/END2 must be greater than 5497 START/START2. */ 5498 5499 static unsigned long 5500 arm_decode_field_multiple (unsigned long given, unsigned int start, 5501 unsigned int end, unsigned int start2, 5502 unsigned int end2) 5503 { 5504 int bits = end - start; 5505 int bits2 = end2 - start2; 5506 unsigned long value = 0; 5507 int width = 0; 5508 5509 if (bits2 < 0) 5510 abort (); 5511 5512 value = arm_decode_field (given, start, end); 5513 width += bits + 1; 5514 5515 value |= ((given >> start2) & ((2ul << bits2) - 1)) << width; 5516 return value; 5517 } 5518 5519 /* Return TRUE if the GIVEN encoding should not be decoded as MATCHED_INSN. 5520 This helps us decode instructions that change mnemonic depending on specific 5521 operand values/encodings. */ 5522 5523 static bfd_boolean 5524 is_mve_encoding_conflict (unsigned long given, 5525 enum mve_instructions matched_insn) 5526 { 5527 switch (matched_insn) 5528 { 5529 case MVE_VPST: 5530 if (arm_decode_field_multiple (given, 13, 15, 22, 22) == 0) 5531 return TRUE; 5532 else 5533 return FALSE; 5534 5535 case MVE_VPT_FP_T1: 5536 if (arm_decode_field_multiple (given, 13, 15, 22, 22) == 0) 5537 return TRUE; 5538 if ((arm_decode_field (given, 12, 12) == 0) 5539 && (arm_decode_field (given, 0, 0) == 1)) 5540 return TRUE; 5541 return FALSE; 5542 5543 case MVE_VPT_FP_T2: 5544 if (arm_decode_field_multiple (given, 13, 15, 22, 22) == 0) 5545 return TRUE; 5546 if (arm_decode_field (given, 0, 3) == 0xd) 5547 return TRUE; 5548 return FALSE; 5549 5550 case MVE_VPT_VEC_T1: 5551 case MVE_VPT_VEC_T2: 5552 case MVE_VPT_VEC_T3: 5553 case MVE_VPT_VEC_T4: 5554 case MVE_VPT_VEC_T5: 5555 case MVE_VPT_VEC_T6: 5556 if (arm_decode_field_multiple (given, 13, 15, 22, 22) == 0) 5557 return TRUE; 5558 if (arm_decode_field (given, 20, 21) == 3) 5559 return TRUE; 5560 return FALSE; 5561 5562 case MVE_VCMP_FP_T1: 5563 if ((arm_decode_field (given, 12, 12) == 0) 5564 && (arm_decode_field (given, 0, 0) == 1)) 5565 return TRUE; 5566 else 5567 return FALSE; 5568 5569 case MVE_VCMP_FP_T2: 5570 if (arm_decode_field (given, 0, 3) == 0xd) 5571 return TRUE; 5572 else 5573 return FALSE; 5574 5575 case MVE_VQADD_T2: 5576 case MVE_VQSUB_T2: 5577 case MVE_VMUL_VEC_T2: 5578 case MVE_VMULH: 5579 case MVE_VRMULH: 5580 case MVE_VMLA: 5581 case MVE_VMAX: 5582 case MVE_VMIN: 5583 case MVE_VBRSR: 5584 case MVE_VADD_VEC_T2: 5585 case MVE_VSUB_VEC_T2: 5586 case MVE_VABAV: 5587 case MVE_VQRSHL_T1: 5588 case MVE_VQSHL_T4: 5589 case MVE_VRSHL_T1: 5590 case MVE_VSHL_T3: 5591 case MVE_VCADD_VEC: 5592 case MVE_VHCADD: 5593 case MVE_VDDUP: 5594 case MVE_VIDUP: 5595 case MVE_VQRDMLADH: 5596 case MVE_VQDMLAH: 5597 case MVE_VQRDMLAH: 5598 case MVE_VQDMLASH: 5599 case MVE_VQRDMLASH: 5600 case MVE_VQDMLSDH: 5601 case MVE_VQRDMLSDH: 5602 case MVE_VQDMULH_T3: 5603 case MVE_VQRDMULH_T4: 5604 case MVE_VQDMLADH: 5605 case MVE_VMLAS: 5606 case MVE_VMULL_INT: 5607 case MVE_VHADD_T2: 5608 case MVE_VHSUB_T2: 5609 case MVE_VCMP_VEC_T1: 5610 case MVE_VCMP_VEC_T2: 5611 case MVE_VCMP_VEC_T3: 5612 case MVE_VCMP_VEC_T4: 5613 case MVE_VCMP_VEC_T5: 5614 case MVE_VCMP_VEC_T6: 5615 if (arm_decode_field (given, 20, 21) == 3) 5616 return TRUE; 5617 else 5618 return FALSE; 5619 5620 case MVE_VLD2: 5621 case MVE_VLD4: 5622 case MVE_VST2: 5623 case MVE_VST4: 5624 if (arm_decode_field (given, 7, 8) == 3) 5625 return TRUE; 5626 else 5627 return FALSE; 5628 5629 case MVE_VSTRB_T1: 5630 case MVE_VSTRH_T2: 5631 if ((arm_decode_field (given, 24, 24) == 0) 5632 && (arm_decode_field (given, 21, 21) == 0)) 5633 { 5634 return TRUE; 5635 } 5636 else if ((arm_decode_field (given, 7, 8) == 3)) 5637 return TRUE; 5638 else 5639 return FALSE; 5640 5641 case MVE_VSTRB_T5: 5642 case MVE_VSTRH_T6: 5643 case MVE_VSTRW_T7: 5644 if ((arm_decode_field (given, 24, 24) == 0) 5645 && (arm_decode_field (given, 21, 21) == 0)) 5646 { 5647 return TRUE; 5648 } 5649 else 5650 return FALSE; 5651 5652 case MVE_VCVT_FP_FIX_VEC: 5653 return (arm_decode_field (given, 16, 21) & 0x38) == 0; 5654 5655 case MVE_VBIC_IMM: 5656 case MVE_VORR_IMM: 5657 { 5658 unsigned long cmode = arm_decode_field (given, 8, 11); 5659 5660 if ((cmode & 1) == 0) 5661 return TRUE; 5662 else if ((cmode & 0xc) == 0xc) 5663 return TRUE; 5664 else 5665 return FALSE; 5666 } 5667 5668 case MVE_VMVN_IMM: 5669 { 5670 unsigned long cmode = arm_decode_field (given, 8, 11); 5671 5672 if (cmode == 0xe) 5673 return TRUE; 5674 else if ((cmode & 0x9) == 1) 5675 return TRUE; 5676 else if ((cmode & 0xd) == 9) 5677 return TRUE; 5678 else 5679 return FALSE; 5680 } 5681 5682 case MVE_VMOV_IMM_TO_VEC: 5683 if ((arm_decode_field (given, 5, 5) == 1) 5684 && (arm_decode_field (given, 8, 11) != 0xe)) 5685 return TRUE; 5686 else 5687 return FALSE; 5688 5689 case MVE_VMOVL: 5690 { 5691 unsigned long size = arm_decode_field (given, 19, 20); 5692 if ((size == 0) || (size == 3)) 5693 return TRUE; 5694 else 5695 return FALSE; 5696 } 5697 5698 case MVE_VMAXA: 5699 case MVE_VMINA: 5700 case MVE_VMAXV: 5701 case MVE_VMAXAV: 5702 case MVE_VMINV: 5703 case MVE_VMINAV: 5704 case MVE_VQRSHL_T2: 5705 case MVE_VQSHL_T1: 5706 case MVE_VRSHL_T2: 5707 case MVE_VSHL_T2: 5708 case MVE_VSHLL_T2: 5709 case MVE_VADDV: 5710 case MVE_VMOVN: 5711 case MVE_VQMOVUN: 5712 case MVE_VQMOVN: 5713 if (arm_decode_field (given, 18, 19) == 3) 5714 return TRUE; 5715 else 5716 return FALSE; 5717 5718 case MVE_VMLSLDAV: 5719 case MVE_VRMLSLDAVH: 5720 case MVE_VMLALDAV: 5721 case MVE_VADDLV: 5722 if (arm_decode_field (given, 20, 22) == 7) 5723 return TRUE; 5724 else 5725 return FALSE; 5726 5727 case MVE_VRMLALDAVH: 5728 if ((arm_decode_field (given, 20, 22) & 6) == 6) 5729 return TRUE; 5730 else 5731 return FALSE; 5732 5733 case MVE_VDWDUP: 5734 case MVE_VIWDUP: 5735 if ((arm_decode_field (given, 20, 21) == 3) 5736 || (arm_decode_field (given, 1, 3) == 7)) 5737 return TRUE; 5738 else 5739 return FALSE; 5740 5741 5742 case MVE_VSHLL_T1: 5743 if (arm_decode_field (given, 16, 18) == 0) 5744 { 5745 unsigned long sz = arm_decode_field (given, 19, 20); 5746 5747 if ((sz == 1) || (sz == 2)) 5748 return TRUE; 5749 else 5750 return FALSE; 5751 } 5752 else 5753 return FALSE; 5754 5755 case MVE_VQSHL_T2: 5756 case MVE_VQSHLU_T3: 5757 case MVE_VRSHR: 5758 case MVE_VSHL_T1: 5759 case MVE_VSHR: 5760 case MVE_VSLI: 5761 case MVE_VSRI: 5762 if (arm_decode_field (given, 19, 21) == 0) 5763 return TRUE; 5764 else 5765 return FALSE; 5766 5767 case MVE_VCTP: 5768 if (arm_decode_field (given, 16, 19) == 0xf) 5769 return TRUE; 5770 else 5771 return FALSE; 5772 5773 case MVE_ASRLI: 5774 case MVE_ASRL: 5775 case MVE_LSLLI: 5776 case MVE_LSLL: 5777 case MVE_LSRL: 5778 case MVE_SQRSHRL: 5779 case MVE_SQSHLL: 5780 case MVE_SRSHRL: 5781 case MVE_UQRSHLL: 5782 case MVE_UQSHLL: 5783 case MVE_URSHRL: 5784 if (arm_decode_field (given, 9, 11) == 0x7) 5785 return TRUE; 5786 else 5787 return FALSE; 5788 5789 case MVE_CSINC: 5790 case MVE_CSINV: 5791 { 5792 unsigned long rm, rn; 5793 rm = arm_decode_field (given, 0, 3); 5794 rn = arm_decode_field (given, 16, 19); 5795 /* CSET/CSETM. */ 5796 if (rm == 0xf && rn == 0xf) 5797 return TRUE; 5798 /* CINC/CINV. */ 5799 else if (rn == rm && rn != 0xf) 5800 return TRUE; 5801 } 5802 /* Fall through. */ 5803 case MVE_CSEL: 5804 case MVE_CSNEG: 5805 if (arm_decode_field (given, 0, 3) == 0xd) 5806 return TRUE; 5807 /* CNEG. */ 5808 else if (matched_insn == MVE_CSNEG) 5809 if (arm_decode_field (given, 0, 3) == arm_decode_field (given, 16, 19)) 5810 return TRUE; 5811 return FALSE; 5812 5813 default: 5814 case MVE_VADD_FP_T1: 5815 case MVE_VADD_FP_T2: 5816 case MVE_VADD_VEC_T1: 5817 return FALSE; 5818 5819 } 5820 } 5821 5822 static void 5823 print_mve_vld_str_addr (struct disassemble_info *info, 5824 unsigned long given, 5825 enum mve_instructions matched_insn) 5826 { 5827 void *stream = info->stream; 5828 fprintf_ftype func = info->fprintf_func; 5829 5830 unsigned long p, w, gpr, imm, add, mod_imm; 5831 5832 imm = arm_decode_field (given, 0, 6); 5833 mod_imm = imm; 5834 5835 switch (matched_insn) 5836 { 5837 case MVE_VLDRB_T1: 5838 case MVE_VSTRB_T1: 5839 gpr = arm_decode_field (given, 16, 18); 5840 break; 5841 5842 case MVE_VLDRH_T2: 5843 case MVE_VSTRH_T2: 5844 gpr = arm_decode_field (given, 16, 18); 5845 mod_imm = imm << 1; 5846 break; 5847 5848 case MVE_VLDRH_T6: 5849 case MVE_VSTRH_T6: 5850 gpr = arm_decode_field (given, 16, 19); 5851 mod_imm = imm << 1; 5852 break; 5853 5854 case MVE_VLDRW_T7: 5855 case MVE_VSTRW_T7: 5856 gpr = arm_decode_field (given, 16, 19); 5857 mod_imm = imm << 2; 5858 break; 5859 5860 case MVE_VLDRB_T5: 5861 case MVE_VSTRB_T5: 5862 gpr = arm_decode_field (given, 16, 19); 5863 break; 5864 5865 default: 5866 return; 5867 } 5868 5869 p = arm_decode_field (given, 24, 24); 5870 w = arm_decode_field (given, 21, 21); 5871 5872 add = arm_decode_field (given, 23, 23); 5873 5874 char * add_sub; 5875 5876 /* Don't print anything for '+' as it is implied. */ 5877 if (add == 1) 5878 add_sub = ""; 5879 else 5880 add_sub = "-"; 5881 5882 if (p == 1) 5883 { 5884 /* Offset mode. */ 5885 if (w == 0) 5886 func (stream, "[%s, #%s%lu]", arm_regnames[gpr], add_sub, mod_imm); 5887 /* Pre-indexed mode. */ 5888 else 5889 func (stream, "[%s, #%s%lu]!", arm_regnames[gpr], add_sub, mod_imm); 5890 } 5891 else if ((p == 0) && (w == 1)) 5892 /* Post-index mode. */ 5893 func (stream, "[%s], #%s%lu", arm_regnames[gpr], add_sub, mod_imm); 5894 } 5895 5896 /* Return FALSE if GIVEN is not an undefined encoding for MATCHED_INSN. 5897 Otherwise, return TRUE and set UNDEFINED_CODE to give a reason as to why 5898 this encoding is undefined. */ 5899 5900 static bfd_boolean 5901 is_mve_undefined (unsigned long given, enum mve_instructions matched_insn, 5902 enum mve_undefined *undefined_code) 5903 { 5904 *undefined_code = UNDEF_NONE; 5905 5906 switch (matched_insn) 5907 { 5908 case MVE_VDUP: 5909 if (arm_decode_field_multiple (given, 5, 5, 22, 22) == 3) 5910 { 5911 *undefined_code = UNDEF_SIZE_3; 5912 return TRUE; 5913 } 5914 else 5915 return FALSE; 5916 5917 case MVE_VQADD_T1: 5918 case MVE_VQSUB_T1: 5919 case MVE_VMUL_VEC_T1: 5920 case MVE_VABD_VEC: 5921 case MVE_VADD_VEC_T1: 5922 case MVE_VSUB_VEC_T1: 5923 case MVE_VQDMULH_T1: 5924 case MVE_VQRDMULH_T2: 5925 case MVE_VRHADD: 5926 case MVE_VHADD_T1: 5927 case MVE_VHSUB_T1: 5928 if (arm_decode_field (given, 20, 21) == 3) 5929 { 5930 *undefined_code = UNDEF_SIZE_3; 5931 return TRUE; 5932 } 5933 else 5934 return FALSE; 5935 5936 case MVE_VLDRB_T1: 5937 if (arm_decode_field (given, 7, 8) == 3) 5938 { 5939 *undefined_code = UNDEF_SIZE_3; 5940 return TRUE; 5941 } 5942 else 5943 return FALSE; 5944 5945 case MVE_VLDRH_T2: 5946 if (arm_decode_field (given, 7, 8) <= 1) 5947 { 5948 *undefined_code = UNDEF_SIZE_LE_1; 5949 return TRUE; 5950 } 5951 else 5952 return FALSE; 5953 5954 case MVE_VSTRB_T1: 5955 if ((arm_decode_field (given, 7, 8) == 0)) 5956 { 5957 *undefined_code = UNDEF_SIZE_0; 5958 return TRUE; 5959 } 5960 else 5961 return FALSE; 5962 5963 case MVE_VSTRH_T2: 5964 if ((arm_decode_field (given, 7, 8) <= 1)) 5965 { 5966 *undefined_code = UNDEF_SIZE_LE_1; 5967 return TRUE; 5968 } 5969 else 5970 return FALSE; 5971 5972 case MVE_VLDRB_GATHER_T1: 5973 if (arm_decode_field (given, 7, 8) == 3) 5974 { 5975 *undefined_code = UNDEF_SIZE_3; 5976 return TRUE; 5977 } 5978 else if ((arm_decode_field (given, 28, 28) == 0) 5979 && (arm_decode_field (given, 7, 8) == 0)) 5980 { 5981 *undefined_code = UNDEF_NOT_UNS_SIZE_0; 5982 return TRUE; 5983 } 5984 else 5985 return FALSE; 5986 5987 case MVE_VLDRH_GATHER_T2: 5988 if (arm_decode_field (given, 7, 8) == 3) 5989 { 5990 *undefined_code = UNDEF_SIZE_3; 5991 return TRUE; 5992 } 5993 else if ((arm_decode_field (given, 28, 28) == 0) 5994 && (arm_decode_field (given, 7, 8) == 1)) 5995 { 5996 *undefined_code = UNDEF_NOT_UNS_SIZE_1; 5997 return TRUE; 5998 } 5999 else if (arm_decode_field (given, 7, 8) == 0) 6000 { 6001 *undefined_code = UNDEF_SIZE_0; 6002 return TRUE; 6003 } 6004 else 6005 return FALSE; 6006 6007 case MVE_VLDRW_GATHER_T3: 6008 if (arm_decode_field (given, 7, 8) != 2) 6009 { 6010 *undefined_code = UNDEF_SIZE_NOT_2; 6011 return TRUE; 6012 } 6013 else if (arm_decode_field (given, 28, 28) == 0) 6014 { 6015 *undefined_code = UNDEF_NOT_UNSIGNED; 6016 return TRUE; 6017 } 6018 else 6019 return FALSE; 6020 6021 case MVE_VLDRD_GATHER_T4: 6022 if (arm_decode_field (given, 7, 8) != 3) 6023 { 6024 *undefined_code = UNDEF_SIZE_NOT_3; 6025 return TRUE; 6026 } 6027 else if (arm_decode_field (given, 28, 28) == 0) 6028 { 6029 *undefined_code = UNDEF_NOT_UNSIGNED; 6030 return TRUE; 6031 } 6032 else 6033 return FALSE; 6034 6035 case MVE_VSTRB_SCATTER_T1: 6036 if (arm_decode_field (given, 7, 8) == 3) 6037 { 6038 *undefined_code = UNDEF_SIZE_3; 6039 return TRUE; 6040 } 6041 else 6042 return FALSE; 6043 6044 case MVE_VSTRH_SCATTER_T2: 6045 { 6046 unsigned long size = arm_decode_field (given, 7, 8); 6047 if (size == 3) 6048 { 6049 *undefined_code = UNDEF_SIZE_3; 6050 return TRUE; 6051 } 6052 else if (size == 0) 6053 { 6054 *undefined_code = UNDEF_SIZE_0; 6055 return TRUE; 6056 } 6057 else 6058 return FALSE; 6059 } 6060 6061 case MVE_VSTRW_SCATTER_T3: 6062 if (arm_decode_field (given, 7, 8) != 2) 6063 { 6064 *undefined_code = UNDEF_SIZE_NOT_2; 6065 return TRUE; 6066 } 6067 else 6068 return FALSE; 6069 6070 case MVE_VSTRD_SCATTER_T4: 6071 if (arm_decode_field (given, 7, 8) != 3) 6072 { 6073 *undefined_code = UNDEF_SIZE_NOT_3; 6074 return TRUE; 6075 } 6076 else 6077 return FALSE; 6078 6079 case MVE_VCVT_FP_FIX_VEC: 6080 { 6081 unsigned long imm6 = arm_decode_field (given, 16, 21); 6082 if ((imm6 & 0x20) == 0) 6083 { 6084 *undefined_code = UNDEF_VCVT_IMM6; 6085 return TRUE; 6086 } 6087 6088 if ((arm_decode_field (given, 9, 9) == 0) 6089 && ((imm6 & 0x30) == 0x20)) 6090 { 6091 *undefined_code = UNDEF_VCVT_FSI_IMM6; 6092 return TRUE; 6093 } 6094 6095 return FALSE; 6096 } 6097 6098 case MVE_VNEG_FP: 6099 case MVE_VABS_FP: 6100 case MVE_VCVT_BETWEEN_FP_INT: 6101 case MVE_VCVT_FROM_FP_TO_INT: 6102 { 6103 unsigned long size = arm_decode_field (given, 18, 19); 6104 if (size == 0) 6105 { 6106 *undefined_code = UNDEF_SIZE_0; 6107 return TRUE; 6108 } 6109 else if (size == 3) 6110 { 6111 *undefined_code = UNDEF_SIZE_3; 6112 return TRUE; 6113 } 6114 else 6115 return FALSE; 6116 } 6117 6118 case MVE_VMOV_VEC_LANE_TO_GP: 6119 { 6120 unsigned long op1 = arm_decode_field (given, 21, 22); 6121 unsigned long op2 = arm_decode_field (given, 5, 6); 6122 unsigned long u = arm_decode_field (given, 23, 23); 6123 6124 if ((op2 == 0) && (u == 1)) 6125 { 6126 if ((op1 == 0) || (op1 == 1)) 6127 { 6128 *undefined_code = UNDEF_BAD_U_OP1_OP2; 6129 return TRUE; 6130 } 6131 else 6132 return FALSE; 6133 } 6134 else if (op2 == 2) 6135 { 6136 if ((op1 == 0) || (op1 == 1)) 6137 { 6138 *undefined_code = UNDEF_BAD_OP1_OP2; 6139 return TRUE; 6140 } 6141 else 6142 return FALSE; 6143 } 6144 6145 return FALSE; 6146 } 6147 6148 case MVE_VMOV_GP_TO_VEC_LANE: 6149 if (arm_decode_field (given, 5, 6) == 2) 6150 { 6151 unsigned long op1 = arm_decode_field (given, 21, 22); 6152 if ((op1 == 0) || (op1 == 1)) 6153 { 6154 *undefined_code = UNDEF_BAD_OP1_OP2; 6155 return TRUE; 6156 } 6157 else 6158 return FALSE; 6159 } 6160 else 6161 return FALSE; 6162 6163 case MVE_VMOV_VEC_TO_VEC: 6164 if ((arm_decode_field (given, 5, 5) == 1) 6165 || (arm_decode_field (given, 22, 22) == 1)) 6166 return TRUE; 6167 return FALSE; 6168 6169 case MVE_VMOV_IMM_TO_VEC: 6170 if (arm_decode_field (given, 5, 5) == 0) 6171 { 6172 unsigned long cmode = arm_decode_field (given, 8, 11); 6173 6174 if (((cmode & 9) == 1) || ((cmode & 5) == 1)) 6175 { 6176 *undefined_code = UNDEF_OP_0_BAD_CMODE; 6177 return TRUE; 6178 } 6179 else 6180 return FALSE; 6181 } 6182 else 6183 return FALSE; 6184 6185 case MVE_VSHLL_T2: 6186 case MVE_VMOVN: 6187 if (arm_decode_field (given, 18, 19) == 2) 6188 { 6189 *undefined_code = UNDEF_SIZE_2; 6190 return TRUE; 6191 } 6192 else 6193 return FALSE; 6194 6195 case MVE_VRMLALDAVH: 6196 case MVE_VMLADAV_T1: 6197 case MVE_VMLADAV_T2: 6198 case MVE_VMLALDAV: 6199 if ((arm_decode_field (given, 28, 28) == 1) 6200 && (arm_decode_field (given, 12, 12) == 1)) 6201 { 6202 *undefined_code = UNDEF_XCHG_UNS; 6203 return TRUE; 6204 } 6205 else 6206 return FALSE; 6207 6208 case MVE_VQSHRN: 6209 case MVE_VQSHRUN: 6210 case MVE_VSHLL_T1: 6211 case MVE_VSHRN: 6212 { 6213 unsigned long sz = arm_decode_field (given, 19, 20); 6214 if (sz == 1) 6215 return FALSE; 6216 else if ((sz & 2) == 2) 6217 return FALSE; 6218 else 6219 { 6220 *undefined_code = UNDEF_SIZE; 6221 return TRUE; 6222 } 6223 } 6224 break; 6225 6226 case MVE_VQSHL_T2: 6227 case MVE_VQSHLU_T3: 6228 case MVE_VRSHR: 6229 case MVE_VSHL_T1: 6230 case MVE_VSHR: 6231 case MVE_VSLI: 6232 case MVE_VSRI: 6233 { 6234 unsigned long sz = arm_decode_field (given, 19, 21); 6235 if ((sz & 7) == 1) 6236 return FALSE; 6237 else if ((sz & 6) == 2) 6238 return FALSE; 6239 else if ((sz & 4) == 4) 6240 return FALSE; 6241 else 6242 { 6243 *undefined_code = UNDEF_SIZE; 6244 return TRUE; 6245 } 6246 } 6247 6248 case MVE_VQRSHRN: 6249 case MVE_VQRSHRUN: 6250 if (arm_decode_field (given, 19, 20) == 0) 6251 { 6252 *undefined_code = UNDEF_SIZE_0; 6253 return TRUE; 6254 } 6255 else 6256 return FALSE; 6257 6258 case MVE_VABS_VEC: 6259 if (arm_decode_field (given, 18, 19) == 3) 6260 { 6261 *undefined_code = UNDEF_SIZE_3; 6262 return TRUE; 6263 } 6264 else 6265 return FALSE; 6266 6267 case MVE_VQNEG: 6268 case MVE_VQABS: 6269 case MVE_VNEG_VEC: 6270 case MVE_VCLS: 6271 case MVE_VCLZ: 6272 if (arm_decode_field (given, 18, 19) == 3) 6273 { 6274 *undefined_code = UNDEF_SIZE_3; 6275 return TRUE; 6276 } 6277 else 6278 return FALSE; 6279 6280 case MVE_VREV16: 6281 if (arm_decode_field (given, 18, 19) == 0) 6282 return FALSE; 6283 else 6284 { 6285 *undefined_code = UNDEF_SIZE_NOT_0; 6286 return TRUE; 6287 } 6288 6289 case MVE_VREV32: 6290 { 6291 unsigned long size = arm_decode_field (given, 18, 19); 6292 if ((size & 2) == 2) 6293 { 6294 *undefined_code = UNDEF_SIZE_2; 6295 return TRUE; 6296 } 6297 else 6298 return FALSE; 6299 } 6300 6301 case MVE_VREV64: 6302 if (arm_decode_field (given, 18, 19) != 3) 6303 return FALSE; 6304 else 6305 { 6306 *undefined_code = UNDEF_SIZE_3; 6307 return TRUE; 6308 } 6309 6310 default: 6311 return FALSE; 6312 } 6313 } 6314 6315 /* Return FALSE if GIVEN is not an unpredictable encoding for MATCHED_INSN. 6316 Otherwise, return TRUE and set UNPREDICTABLE_CODE to give a reason as to 6317 why this encoding is unpredictable. */ 6318 6319 static bfd_boolean 6320 is_mve_unpredictable (unsigned long given, enum mve_instructions matched_insn, 6321 enum mve_unpredictable *unpredictable_code) 6322 { 6323 *unpredictable_code = UNPRED_NONE; 6324 6325 switch (matched_insn) 6326 { 6327 case MVE_VCMP_FP_T2: 6328 case MVE_VPT_FP_T2: 6329 if ((arm_decode_field (given, 12, 12) == 0) 6330 && (arm_decode_field (given, 5, 5) == 1)) 6331 { 6332 *unpredictable_code = UNPRED_FCA_0_FCB_1; 6333 return TRUE; 6334 } 6335 else 6336 return FALSE; 6337 6338 case MVE_VPT_VEC_T4: 6339 case MVE_VPT_VEC_T5: 6340 case MVE_VPT_VEC_T6: 6341 case MVE_VCMP_VEC_T4: 6342 case MVE_VCMP_VEC_T5: 6343 case MVE_VCMP_VEC_T6: 6344 if (arm_decode_field (given, 0, 3) == 0xd) 6345 { 6346 *unpredictable_code = UNPRED_R13; 6347 return TRUE; 6348 } 6349 else 6350 return FALSE; 6351 6352 case MVE_VDUP: 6353 { 6354 unsigned long gpr = arm_decode_field (given, 12, 15); 6355 if (gpr == 0xd) 6356 { 6357 *unpredictable_code = UNPRED_R13; 6358 return TRUE; 6359 } 6360 else if (gpr == 0xf) 6361 { 6362 *unpredictable_code = UNPRED_R15; 6363 return TRUE; 6364 } 6365 6366 return FALSE; 6367 } 6368 6369 case MVE_VQADD_T2: 6370 case MVE_VQSUB_T2: 6371 case MVE_VMUL_FP_T2: 6372 case MVE_VMUL_VEC_T2: 6373 case MVE_VMLA: 6374 case MVE_VBRSR: 6375 case MVE_VADD_FP_T2: 6376 case MVE_VSUB_FP_T2: 6377 case MVE_VADD_VEC_T2: 6378 case MVE_VSUB_VEC_T2: 6379 case MVE_VQRSHL_T2: 6380 case MVE_VQSHL_T1: 6381 case MVE_VRSHL_T2: 6382 case MVE_VSHL_T2: 6383 case MVE_VSHLC: 6384 case MVE_VQDMLAH: 6385 case MVE_VQRDMLAH: 6386 case MVE_VQDMLASH: 6387 case MVE_VQRDMLASH: 6388 case MVE_VQDMULH_T3: 6389 case MVE_VQRDMULH_T4: 6390 case MVE_VMLAS: 6391 case MVE_VFMA_FP_SCALAR: 6392 case MVE_VFMAS_FP_SCALAR: 6393 case MVE_VHADD_T2: 6394 case MVE_VHSUB_T2: 6395 { 6396 unsigned long gpr = arm_decode_field (given, 0, 3); 6397 if (gpr == 0xd) 6398 { 6399 *unpredictable_code = UNPRED_R13; 6400 return TRUE; 6401 } 6402 else if (gpr == 0xf) 6403 { 6404 *unpredictable_code = UNPRED_R15; 6405 return TRUE; 6406 } 6407 6408 return FALSE; 6409 } 6410 6411 case MVE_VLD2: 6412 case MVE_VST2: 6413 { 6414 unsigned long rn = arm_decode_field (given, 16, 19); 6415 6416 if ((rn == 0xd) && (arm_decode_field (given, 21, 21) == 1)) 6417 { 6418 *unpredictable_code = UNPRED_R13_AND_WB; 6419 return TRUE; 6420 } 6421 6422 if (rn == 0xf) 6423 { 6424 *unpredictable_code = UNPRED_R15; 6425 return TRUE; 6426 } 6427 6428 if (arm_decode_field_multiple (given, 13, 15, 22, 22) > 6) 6429 { 6430 *unpredictable_code = UNPRED_Q_GT_6; 6431 return TRUE; 6432 } 6433 else 6434 return FALSE; 6435 } 6436 6437 case MVE_VLD4: 6438 case MVE_VST4: 6439 { 6440 unsigned long rn = arm_decode_field (given, 16, 19); 6441 6442 if ((rn == 0xd) && (arm_decode_field (given, 21, 21) == 1)) 6443 { 6444 *unpredictable_code = UNPRED_R13_AND_WB; 6445 return TRUE; 6446 } 6447 6448 if (rn == 0xf) 6449 { 6450 *unpredictable_code = UNPRED_R15; 6451 return TRUE; 6452 } 6453 6454 if (arm_decode_field_multiple (given, 13, 15, 22, 22) > 4) 6455 { 6456 *unpredictable_code = UNPRED_Q_GT_4; 6457 return TRUE; 6458 } 6459 else 6460 return FALSE; 6461 } 6462 6463 case MVE_VLDRB_T5: 6464 case MVE_VLDRH_T6: 6465 case MVE_VLDRW_T7: 6466 case MVE_VSTRB_T5: 6467 case MVE_VSTRH_T6: 6468 case MVE_VSTRW_T7: 6469 { 6470 unsigned long rn = arm_decode_field (given, 16, 19); 6471 6472 if ((rn == 0xd) && (arm_decode_field (given, 21, 21) == 1)) 6473 { 6474 *unpredictable_code = UNPRED_R13_AND_WB; 6475 return TRUE; 6476 } 6477 else if (rn == 0xf) 6478 { 6479 *unpredictable_code = UNPRED_R15; 6480 return TRUE; 6481 } 6482 else 6483 return FALSE; 6484 } 6485 6486 case MVE_VLDRB_GATHER_T1: 6487 if (arm_decode_field (given, 0, 0) == 1) 6488 { 6489 *unpredictable_code = UNPRED_OS; 6490 return TRUE; 6491 } 6492 6493 /* fall through. */ 6494 /* To handle common code with T2-T4 variants. */ 6495 case MVE_VLDRH_GATHER_T2: 6496 case MVE_VLDRW_GATHER_T3: 6497 case MVE_VLDRD_GATHER_T4: 6498 { 6499 unsigned long qd = arm_decode_field_multiple (given, 13, 15, 22, 22); 6500 unsigned long qm = arm_decode_field_multiple (given, 1, 3, 5, 5); 6501 6502 if (qd == qm) 6503 { 6504 *unpredictable_code = UNPRED_Q_REGS_EQUAL; 6505 return TRUE; 6506 } 6507 6508 if (arm_decode_field (given, 16, 19) == 0xf) 6509 { 6510 *unpredictable_code = UNPRED_R15; 6511 return TRUE; 6512 } 6513 6514 return FALSE; 6515 } 6516 6517 case MVE_VLDRW_GATHER_T5: 6518 case MVE_VLDRD_GATHER_T6: 6519 { 6520 unsigned long qd = arm_decode_field_multiple (given, 13, 15, 22, 22); 6521 unsigned long qm = arm_decode_field_multiple (given, 17, 19, 7, 7); 6522 6523 if (qd == qm) 6524 { 6525 *unpredictable_code = UNPRED_Q_REGS_EQUAL; 6526 return TRUE; 6527 } 6528 else 6529 return FALSE; 6530 } 6531 6532 case MVE_VSTRB_SCATTER_T1: 6533 if (arm_decode_field (given, 16, 19) == 0xf) 6534 { 6535 *unpredictable_code = UNPRED_R15; 6536 return TRUE; 6537 } 6538 else if (arm_decode_field (given, 0, 0) == 1) 6539 { 6540 *unpredictable_code = UNPRED_OS; 6541 return TRUE; 6542 } 6543 else 6544 return FALSE; 6545 6546 case MVE_VSTRH_SCATTER_T2: 6547 case MVE_VSTRW_SCATTER_T3: 6548 case MVE_VSTRD_SCATTER_T4: 6549 if (arm_decode_field (given, 16, 19) == 0xf) 6550 { 6551 *unpredictable_code = UNPRED_R15; 6552 return TRUE; 6553 } 6554 else 6555 return FALSE; 6556 6557 case MVE_VMOV2_VEC_LANE_TO_GP: 6558 case MVE_VMOV2_GP_TO_VEC_LANE: 6559 case MVE_VCVT_BETWEEN_FP_INT: 6560 case MVE_VCVT_FROM_FP_TO_INT: 6561 { 6562 unsigned long rt = arm_decode_field (given, 0, 3); 6563 unsigned long rt2 = arm_decode_field (given, 16, 19); 6564 6565 if ((rt == 0xd) || (rt2 == 0xd)) 6566 { 6567 *unpredictable_code = UNPRED_R13; 6568 return TRUE; 6569 } 6570 else if ((rt == 0xf) || (rt2 == 0xf)) 6571 { 6572 *unpredictable_code = UNPRED_R15; 6573 return TRUE; 6574 } 6575 else if (rt == rt2) 6576 { 6577 *unpredictable_code = UNPRED_GP_REGS_EQUAL; 6578 return TRUE; 6579 } 6580 6581 return FALSE; 6582 } 6583 6584 case MVE_VMAXV: 6585 case MVE_VMAXAV: 6586 case MVE_VMAXNMV_FP: 6587 case MVE_VMAXNMAV_FP: 6588 case MVE_VMINNMV_FP: 6589 case MVE_VMINNMAV_FP: 6590 case MVE_VMINV: 6591 case MVE_VMINAV: 6592 case MVE_VABAV: 6593 case MVE_VMOV_HFP_TO_GP: 6594 case MVE_VMOV_GP_TO_VEC_LANE: 6595 case MVE_VMOV_VEC_LANE_TO_GP: 6596 { 6597 unsigned long rda = arm_decode_field (given, 12, 15); 6598 if (rda == 0xd) 6599 { 6600 *unpredictable_code = UNPRED_R13; 6601 return TRUE; 6602 } 6603 else if (rda == 0xf) 6604 { 6605 *unpredictable_code = UNPRED_R15; 6606 return TRUE; 6607 } 6608 6609 return FALSE; 6610 } 6611 6612 case MVE_VMULL_INT: 6613 { 6614 unsigned long Qd; 6615 unsigned long Qm; 6616 unsigned long Qn; 6617 6618 if (arm_decode_field (given, 20, 21) == 2) 6619 { 6620 Qd = arm_decode_field_multiple (given, 13, 15, 22, 22); 6621 Qm = arm_decode_field_multiple (given, 1, 3, 5, 5); 6622 Qn = arm_decode_field_multiple (given, 17, 19, 7, 7); 6623 6624 if ((Qd == Qn) || (Qd == Qm)) 6625 { 6626 *unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_2; 6627 return TRUE; 6628 } 6629 else 6630 return FALSE; 6631 } 6632 else 6633 return FALSE; 6634 } 6635 6636 case MVE_VCMUL_FP: 6637 case MVE_VQDMULL_T1: 6638 { 6639 unsigned long Qd; 6640 unsigned long Qm; 6641 unsigned long Qn; 6642 6643 if (arm_decode_field (given, 28, 28) == 1) 6644 { 6645 Qd = arm_decode_field_multiple (given, 13, 15, 22, 22); 6646 Qm = arm_decode_field_multiple (given, 1, 3, 5, 5); 6647 Qn = arm_decode_field_multiple (given, 17, 19, 7, 7); 6648 6649 if ((Qd == Qn) || (Qd == Qm)) 6650 { 6651 *unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_1; 6652 return TRUE; 6653 } 6654 else 6655 return FALSE; 6656 } 6657 else 6658 return FALSE; 6659 } 6660 6661 case MVE_VQDMULL_T2: 6662 { 6663 unsigned long gpr = arm_decode_field (given, 0, 3); 6664 if (gpr == 0xd) 6665 { 6666 *unpredictable_code = UNPRED_R13; 6667 return TRUE; 6668 } 6669 else if (gpr == 0xf) 6670 { 6671 *unpredictable_code = UNPRED_R15; 6672 return TRUE; 6673 } 6674 6675 if (arm_decode_field (given, 28, 28) == 1) 6676 { 6677 unsigned long Qd 6678 = arm_decode_field_multiple (given, 13, 15, 22, 22); 6679 unsigned long Qn = arm_decode_field_multiple (given, 17, 19, 7, 7); 6680 6681 if (Qd == Qn) 6682 { 6683 *unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_1; 6684 return TRUE; 6685 } 6686 else 6687 return FALSE; 6688 } 6689 6690 return FALSE; 6691 } 6692 6693 case MVE_VMLSLDAV: 6694 case MVE_VRMLSLDAVH: 6695 case MVE_VMLALDAV: 6696 case MVE_VADDLV: 6697 if (arm_decode_field (given, 20, 22) == 6) 6698 { 6699 *unpredictable_code = UNPRED_R13; 6700 return TRUE; 6701 } 6702 else 6703 return FALSE; 6704 6705 case MVE_VDWDUP: 6706 case MVE_VIWDUP: 6707 if (arm_decode_field (given, 1, 3) == 6) 6708 { 6709 *unpredictable_code = UNPRED_R13; 6710 return TRUE; 6711 } 6712 else 6713 return FALSE; 6714 6715 case MVE_VCADD_VEC: 6716 case MVE_VHCADD: 6717 { 6718 unsigned long Qd = arm_decode_field_multiple (given, 13, 15, 22, 22); 6719 unsigned long Qm = arm_decode_field_multiple (given, 1, 3, 5, 5); 6720 if ((Qd == Qm) && arm_decode_field (given, 20, 21) == 2) 6721 { 6722 *unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_2; 6723 return TRUE; 6724 } 6725 else 6726 return FALSE; 6727 } 6728 6729 case MVE_VCADD_FP: 6730 { 6731 unsigned long Qd = arm_decode_field_multiple (given, 13, 15, 22, 22); 6732 unsigned long Qm = arm_decode_field_multiple (given, 1, 3, 5, 5); 6733 if ((Qd == Qm) && arm_decode_field (given, 20, 20) == 1) 6734 { 6735 *unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_1; 6736 return TRUE; 6737 } 6738 else 6739 return FALSE; 6740 } 6741 6742 case MVE_VCMLA_FP: 6743 { 6744 unsigned long Qda; 6745 unsigned long Qm; 6746 unsigned long Qn; 6747 6748 if (arm_decode_field (given, 20, 20) == 1) 6749 { 6750 Qda = arm_decode_field_multiple (given, 13, 15, 22, 22); 6751 Qm = arm_decode_field_multiple (given, 1, 3, 5, 5); 6752 Qn = arm_decode_field_multiple (given, 17, 19, 7, 7); 6753 6754 if ((Qda == Qn) || (Qda == Qm)) 6755 { 6756 *unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_1; 6757 return TRUE; 6758 } 6759 else 6760 return FALSE; 6761 } 6762 else 6763 return FALSE; 6764 6765 } 6766 6767 case MVE_VCTP: 6768 if (arm_decode_field (given, 16, 19) == 0xd) 6769 { 6770 *unpredictable_code = UNPRED_R13; 6771 return TRUE; 6772 } 6773 else 6774 return FALSE; 6775 6776 case MVE_VREV64: 6777 { 6778 unsigned long qd = arm_decode_field_multiple (given, 13, 15, 22, 22); 6779 unsigned long qm = arm_decode_field_multiple (given, 1, 3, 6, 6); 6780 6781 if (qd == qm) 6782 { 6783 *unpredictable_code = UNPRED_Q_REGS_EQUAL; 6784 return TRUE; 6785 } 6786 else 6787 return FALSE; 6788 } 6789 6790 case MVE_LSLL: 6791 case MVE_LSLLI: 6792 case MVE_LSRL: 6793 case MVE_ASRL: 6794 case MVE_ASRLI: 6795 case MVE_UQSHLL: 6796 case MVE_UQRSHLL: 6797 case MVE_URSHRL: 6798 case MVE_SRSHRL: 6799 case MVE_SQSHLL: 6800 case MVE_SQRSHRL: 6801 { 6802 unsigned long gpr = arm_decode_field (given, 9, 11); 6803 gpr = ((gpr << 1) | 1); 6804 if (gpr == 0xd) 6805 { 6806 *unpredictable_code = UNPRED_R13; 6807 return TRUE; 6808 } 6809 else if (gpr == 0xf) 6810 { 6811 *unpredictable_code = UNPRED_R15; 6812 return TRUE; 6813 } 6814 6815 return FALSE; 6816 } 6817 6818 default: 6819 return FALSE; 6820 } 6821 } 6822 6823 static void 6824 print_mve_vmov_index (struct disassemble_info *info, unsigned long given) 6825 { 6826 unsigned long op1 = arm_decode_field (given, 21, 22); 6827 unsigned long op2 = arm_decode_field (given, 5, 6); 6828 unsigned long h = arm_decode_field (given, 16, 16); 6829 unsigned long index_operand, esize, targetBeat, idx; 6830 void *stream = info->stream; 6831 fprintf_ftype func = info->fprintf_func; 6832 6833 if ((op1 & 0x2) == 0x2) 6834 { 6835 index_operand = op2; 6836 esize = 8; 6837 } 6838 else if (((op1 & 0x2) == 0x0) && ((op2 & 0x1) == 0x1)) 6839 { 6840 index_operand = op2 >> 1; 6841 esize = 16; 6842 } 6843 else if (((op1 & 0x2) == 0) && ((op2 & 0x3) == 0)) 6844 { 6845 index_operand = 0; 6846 esize = 32; 6847 } 6848 else 6849 { 6850 func (stream, "<undefined index>"); 6851 return; 6852 } 6853 6854 targetBeat = (op1 & 0x1) | (h << 1); 6855 idx = index_operand + targetBeat * (32/esize); 6856 6857 func (stream, "%lu", idx); 6858 } 6859 6860 /* Print neon and mve 8-bit immediate that can be a 8, 16, 32, or 64-bits 6861 in length and integer of floating-point type. */ 6862 static void 6863 print_simd_imm8 (struct disassemble_info *info, unsigned long given, 6864 unsigned int ibit_loc, const struct mopcode32 *insn) 6865 { 6866 int bits = 0; 6867 int cmode = (given >> 8) & 0xf; 6868 int op = (given >> 5) & 0x1; 6869 unsigned long value = 0, hival = 0; 6870 unsigned shift; 6871 int size = 0; 6872 int isfloat = 0; 6873 void *stream = info->stream; 6874 fprintf_ftype func = info->fprintf_func; 6875 6876 /* On Neon the 'i' bit is at bit 24, on mve it is 6877 at bit 28. */ 6878 bits |= ((given >> ibit_loc) & 1) << 7; 6879 bits |= ((given >> 16) & 7) << 4; 6880 bits |= ((given >> 0) & 15) << 0; 6881 6882 if (cmode < 8) 6883 { 6884 shift = (cmode >> 1) & 3; 6885 value = (unsigned long) bits << (8 * shift); 6886 size = 32; 6887 } 6888 else if (cmode < 12) 6889 { 6890 shift = (cmode >> 1) & 1; 6891 value = (unsigned long) bits << (8 * shift); 6892 size = 16; 6893 } 6894 else if (cmode < 14) 6895 { 6896 shift = (cmode & 1) + 1; 6897 value = (unsigned long) bits << (8 * shift); 6898 value |= (1ul << (8 * shift)) - 1; 6899 size = 32; 6900 } 6901 else if (cmode == 14) 6902 { 6903 if (op) 6904 { 6905 /* Bit replication into bytes. */ 6906 int ix; 6907 unsigned long mask; 6908 6909 value = 0; 6910 hival = 0; 6911 for (ix = 7; ix >= 0; ix--) 6912 { 6913 mask = ((bits >> ix) & 1) ? 0xff : 0; 6914 if (ix <= 3) 6915 value = (value << 8) | mask; 6916 else 6917 hival = (hival << 8) | mask; 6918 } 6919 size = 64; 6920 } 6921 else 6922 { 6923 /* Byte replication. */ 6924 value = (unsigned long) bits; 6925 size = 8; 6926 } 6927 } 6928 else if (!op) 6929 { 6930 /* Floating point encoding. */ 6931 int tmp; 6932 6933 value = (unsigned long) (bits & 0x7f) << 19; 6934 value |= (unsigned long) (bits & 0x80) << 24; 6935 tmp = bits & 0x40 ? 0x3c : 0x40; 6936 value |= (unsigned long) tmp << 24; 6937 size = 32; 6938 isfloat = 1; 6939 } 6940 else 6941 { 6942 func (stream, "<illegal constant %.8x:%x:%x>", 6943 bits, cmode, op); 6944 size = 32; 6945 return; 6946 } 6947 6948 // printU determines whether the immediate value should be printed as 6949 // unsigned. 6950 unsigned printU = 0; 6951 switch (insn->mve_op) 6952 { 6953 default: 6954 break; 6955 // We want this for instructions that don't have a 'signed' type 6956 case MVE_VBIC_IMM: 6957 case MVE_VORR_IMM: 6958 case MVE_VMVN_IMM: 6959 case MVE_VMOV_IMM_TO_VEC: 6960 printU = 1; 6961 break; 6962 } 6963 switch (size) 6964 { 6965 case 8: 6966 func (stream, "#%ld\t; 0x%.2lx", value, value); 6967 break; 6968 6969 case 16: 6970 func (stream, 6971 printU 6972 ? "#%lu\t; 0x%.4lx" 6973 : "#%ld\t; 0x%.4lx", value, value); 6974 break; 6975 6976 case 32: 6977 if (isfloat) 6978 { 6979 unsigned char valbytes[4]; 6980 double fvalue; 6981 6982 /* Do this a byte at a time so we don't have to 6983 worry about the host's endianness. */ 6984 valbytes[0] = value & 0xff; 6985 valbytes[1] = (value >> 8) & 0xff; 6986 valbytes[2] = (value >> 16) & 0xff; 6987 valbytes[3] = (value >> 24) & 0xff; 6988 6989 floatformat_to_double 6990 (& floatformat_ieee_single_little, valbytes, 6991 & fvalue); 6992 6993 func (stream, "#%.7g\t; 0x%.8lx", fvalue, 6994 value); 6995 } 6996 else 6997 func (stream, 6998 printU 6999 ? "#%lu\t; 0x%.8lx" 7000 : "#%ld\t; 0x%.8lx", 7001 (long) (((value & 0x80000000L) != 0) 7002 && !printU 7003 ? value | ~0xffffffffL : value), 7004 value); 7005 break; 7006 7007 case 64: 7008 func (stream, "#0x%.8lx%.8lx", hival, value); 7009 break; 7010 7011 default: 7012 abort (); 7013 } 7014 7015 } 7016 7017 static void 7018 print_mve_undefined (struct disassemble_info *info, 7019 enum mve_undefined undefined_code) 7020 { 7021 void *stream = info->stream; 7022 fprintf_ftype func = info->fprintf_func; 7023 7024 func (stream, "\t\tundefined instruction: "); 7025 7026 switch (undefined_code) 7027 { 7028 case UNDEF_SIZE: 7029 func (stream, "illegal size"); 7030 break; 7031 7032 case UNDEF_SIZE_0: 7033 func (stream, "size equals zero"); 7034 break; 7035 7036 case UNDEF_SIZE_2: 7037 func (stream, "size equals two"); 7038 break; 7039 7040 case UNDEF_SIZE_3: 7041 func (stream, "size equals three"); 7042 break; 7043 7044 case UNDEF_SIZE_LE_1: 7045 func (stream, "size <= 1"); 7046 break; 7047 7048 case UNDEF_SIZE_NOT_0: 7049 func (stream, "size not equal to 0"); 7050 break; 7051 7052 case UNDEF_SIZE_NOT_2: 7053 func (stream, "size not equal to 2"); 7054 break; 7055 7056 case UNDEF_SIZE_NOT_3: 7057 func (stream, "size not equal to 3"); 7058 break; 7059 7060 case UNDEF_NOT_UNS_SIZE_0: 7061 func (stream, "not unsigned and size = zero"); 7062 break; 7063 7064 case UNDEF_NOT_UNS_SIZE_1: 7065 func (stream, "not unsigned and size = one"); 7066 break; 7067 7068 case UNDEF_NOT_UNSIGNED: 7069 func (stream, "not unsigned"); 7070 break; 7071 7072 case UNDEF_VCVT_IMM6: 7073 func (stream, "invalid imm6"); 7074 break; 7075 7076 case UNDEF_VCVT_FSI_IMM6: 7077 func (stream, "fsi = 0 and invalid imm6"); 7078 break; 7079 7080 case UNDEF_BAD_OP1_OP2: 7081 func (stream, "bad size with op2 = 2 and op1 = 0 or 1"); 7082 break; 7083 7084 case UNDEF_BAD_U_OP1_OP2: 7085 func (stream, "unsigned with op2 = 0 and op1 = 0 or 1"); 7086 break; 7087 7088 case UNDEF_OP_0_BAD_CMODE: 7089 func (stream, "op field equal 0 and bad cmode"); 7090 break; 7091 7092 case UNDEF_XCHG_UNS: 7093 func (stream, "exchange and unsigned together"); 7094 break; 7095 7096 case UNDEF_NONE: 7097 break; 7098 } 7099 7100 } 7101 7102 static void 7103 print_mve_unpredictable (struct disassemble_info *info, 7104 enum mve_unpredictable unpredict_code) 7105 { 7106 void *stream = info->stream; 7107 fprintf_ftype func = info->fprintf_func; 7108 7109 func (stream, "%s: ", UNPREDICTABLE_INSTRUCTION); 7110 7111 switch (unpredict_code) 7112 { 7113 case UNPRED_IT_BLOCK: 7114 func (stream, "mve instruction in it block"); 7115 break; 7116 7117 case UNPRED_FCA_0_FCB_1: 7118 func (stream, "condition bits, fca = 0 and fcb = 1"); 7119 break; 7120 7121 case UNPRED_R13: 7122 func (stream, "use of r13 (sp)"); 7123 break; 7124 7125 case UNPRED_R15: 7126 func (stream, "use of r15 (pc)"); 7127 break; 7128 7129 case UNPRED_Q_GT_4: 7130 func (stream, "start register block > r4"); 7131 break; 7132 7133 case UNPRED_Q_GT_6: 7134 func (stream, "start register block > r6"); 7135 break; 7136 7137 case UNPRED_R13_AND_WB: 7138 func (stream, "use of r13 and write back"); 7139 break; 7140 7141 case UNPRED_Q_REGS_EQUAL: 7142 func (stream, 7143 "same vector register used for destination and other operand"); 7144 break; 7145 7146 case UNPRED_OS: 7147 func (stream, "use of offset scaled"); 7148 break; 7149 7150 case UNPRED_GP_REGS_EQUAL: 7151 func (stream, "same general-purpose register used for both operands"); 7152 break; 7153 7154 case UNPRED_Q_REGS_EQ_AND_SIZE_1: 7155 func (stream, "use of identical q registers and size = 1"); 7156 break; 7157 7158 case UNPRED_Q_REGS_EQ_AND_SIZE_2: 7159 func (stream, "use of identical q registers and size = 1"); 7160 break; 7161 7162 case UNPRED_NONE: 7163 break; 7164 } 7165 } 7166 7167 /* Print register block operand for mve vld2/vld4/vst2/vld4. */ 7168 7169 static void 7170 print_mve_register_blocks (struct disassemble_info *info, 7171 unsigned long given, 7172 enum mve_instructions matched_insn) 7173 { 7174 void *stream = info->stream; 7175 fprintf_ftype func = info->fprintf_func; 7176 7177 unsigned long q_reg_start = arm_decode_field_multiple (given, 7178 13, 15, 7179 22, 22); 7180 switch (matched_insn) 7181 { 7182 case MVE_VLD2: 7183 case MVE_VST2: 7184 if (q_reg_start <= 6) 7185 func (stream, "{q%ld, q%ld}", q_reg_start, q_reg_start + 1); 7186 else 7187 func (stream, "<illegal reg q%ld>", q_reg_start); 7188 break; 7189 7190 case MVE_VLD4: 7191 case MVE_VST4: 7192 if (q_reg_start <= 4) 7193 func (stream, "{q%ld, q%ld, q%ld, q%ld}", q_reg_start, 7194 q_reg_start + 1, q_reg_start + 2, 7195 q_reg_start + 3); 7196 else 7197 func (stream, "<illegal reg q%ld>", q_reg_start); 7198 break; 7199 7200 default: 7201 break; 7202 } 7203 } 7204 7205 static void 7206 print_mve_rounding_mode (struct disassemble_info *info, 7207 unsigned long given, 7208 enum mve_instructions matched_insn) 7209 { 7210 void *stream = info->stream; 7211 fprintf_ftype func = info->fprintf_func; 7212 7213 switch (matched_insn) 7214 { 7215 case MVE_VCVT_FROM_FP_TO_INT: 7216 { 7217 switch (arm_decode_field (given, 8, 9)) 7218 { 7219 case 0: 7220 func (stream, "a"); 7221 break; 7222 7223 case 1: 7224 func (stream, "n"); 7225 break; 7226 7227 case 2: 7228 func (stream, "p"); 7229 break; 7230 7231 case 3: 7232 func (stream, "m"); 7233 break; 7234 7235 default: 7236 break; 7237 } 7238 } 7239 break; 7240 7241 case MVE_VRINT_FP: 7242 { 7243 switch (arm_decode_field (given, 7, 9)) 7244 { 7245 case 0: 7246 func (stream, "n"); 7247 break; 7248 7249 case 1: 7250 func (stream, "x"); 7251 break; 7252 7253 case 2: 7254 func (stream, "a"); 7255 break; 7256 7257 case 3: 7258 func (stream, "z"); 7259 break; 7260 7261 case 5: 7262 func (stream, "m"); 7263 break; 7264 7265 case 7: 7266 func (stream, "p"); 7267 7268 case 4: 7269 case 6: 7270 default: 7271 break; 7272 } 7273 } 7274 break; 7275 7276 default: 7277 break; 7278 } 7279 } 7280 7281 static void 7282 print_mve_vcvt_size (struct disassemble_info *info, 7283 unsigned long given, 7284 enum mve_instructions matched_insn) 7285 { 7286 unsigned long mode = 0; 7287 void *stream = info->stream; 7288 fprintf_ftype func = info->fprintf_func; 7289 7290 switch (matched_insn) 7291 { 7292 case MVE_VCVT_FP_FIX_VEC: 7293 { 7294 mode = (((given & 0x200) >> 7) 7295 | ((given & 0x10000000) >> 27) 7296 | ((given & 0x100) >> 8)); 7297 7298 switch (mode) 7299 { 7300 case 0: 7301 func (stream, "f16.s16"); 7302 break; 7303 7304 case 1: 7305 func (stream, "s16.f16"); 7306 break; 7307 7308 case 2: 7309 func (stream, "f16.u16"); 7310 break; 7311 7312 case 3: 7313 func (stream, "u16.f16"); 7314 break; 7315 7316 case 4: 7317 func (stream, "f32.s32"); 7318 break; 7319 7320 case 5: 7321 func (stream, "s32.f32"); 7322 break; 7323 7324 case 6: 7325 func (stream, "f32.u32"); 7326 break; 7327 7328 case 7: 7329 func (stream, "u32.f32"); 7330 break; 7331 7332 default: 7333 break; 7334 } 7335 break; 7336 } 7337 case MVE_VCVT_BETWEEN_FP_INT: 7338 { 7339 unsigned long size = arm_decode_field (given, 18, 19); 7340 unsigned long op = arm_decode_field (given, 7, 8); 7341 7342 if (size == 1) 7343 { 7344 switch (op) 7345 { 7346 case 0: 7347 func (stream, "f16.s16"); 7348 break; 7349 7350 case 1: 7351 func (stream, "f16.u16"); 7352 break; 7353 7354 case 2: 7355 func (stream, "s16.f16"); 7356 break; 7357 7358 case 3: 7359 func (stream, "u16.f16"); 7360 break; 7361 7362 default: 7363 break; 7364 } 7365 } 7366 else if (size == 2) 7367 { 7368 switch (op) 7369 { 7370 case 0: 7371 func (stream, "f32.s32"); 7372 break; 7373 7374 case 1: 7375 func (stream, "f32.u32"); 7376 break; 7377 7378 case 2: 7379 func (stream, "s32.f32"); 7380 break; 7381 7382 case 3: 7383 func (stream, "u32.f32"); 7384 break; 7385 } 7386 } 7387 } 7388 break; 7389 7390 case MVE_VCVT_FP_HALF_FP: 7391 { 7392 unsigned long op = arm_decode_field (given, 28, 28); 7393 if (op == 0) 7394 func (stream, "f16.f32"); 7395 else if (op == 1) 7396 func (stream, "f32.f16"); 7397 } 7398 break; 7399 7400 case MVE_VCVT_FROM_FP_TO_INT: 7401 { 7402 unsigned long size = arm_decode_field_multiple (given, 7, 7, 18, 19); 7403 7404 switch (size) 7405 { 7406 case 2: 7407 func (stream, "s16.f16"); 7408 break; 7409 7410 case 3: 7411 func (stream, "u16.f16"); 7412 break; 7413 7414 case 4: 7415 func (stream, "s32.f32"); 7416 break; 7417 7418 case 5: 7419 func (stream, "u32.f32"); 7420 break; 7421 7422 default: 7423 break; 7424 } 7425 } 7426 break; 7427 7428 default: 7429 break; 7430 } 7431 } 7432 7433 static void 7434 print_mve_rotate (struct disassemble_info *info, unsigned long rot, 7435 unsigned long rot_width) 7436 { 7437 void *stream = info->stream; 7438 fprintf_ftype func = info->fprintf_func; 7439 7440 if (rot_width == 1) 7441 { 7442 switch (rot) 7443 { 7444 case 0: 7445 func (stream, "90"); 7446 break; 7447 case 1: 7448 func (stream, "270"); 7449 break; 7450 default: 7451 break; 7452 } 7453 } 7454 else if (rot_width == 2) 7455 { 7456 switch (rot) 7457 { 7458 case 0: 7459 func (stream, "0"); 7460 break; 7461 case 1: 7462 func (stream, "90"); 7463 break; 7464 case 2: 7465 func (stream, "180"); 7466 break; 7467 case 3: 7468 func (stream, "270"); 7469 break; 7470 default: 7471 break; 7472 } 7473 } 7474 } 7475 7476 static void 7477 print_instruction_predicate (struct disassemble_info *info) 7478 { 7479 void *stream = info->stream; 7480 fprintf_ftype func = info->fprintf_func; 7481 7482 if (vpt_block_state.next_pred_state == PRED_THEN) 7483 func (stream, "t"); 7484 else if (vpt_block_state.next_pred_state == PRED_ELSE) 7485 func (stream, "e"); 7486 } 7487 7488 static void 7489 print_mve_size (struct disassemble_info *info, 7490 unsigned long size, 7491 enum mve_instructions matched_insn) 7492 { 7493 void *stream = info->stream; 7494 fprintf_ftype func = info->fprintf_func; 7495 7496 switch (matched_insn) 7497 { 7498 case MVE_VABAV: 7499 case MVE_VABD_VEC: 7500 case MVE_VABS_FP: 7501 case MVE_VABS_VEC: 7502 case MVE_VADD_VEC_T1: 7503 case MVE_VADD_VEC_T2: 7504 case MVE_VADDV: 7505 case MVE_VBRSR: 7506 case MVE_VCADD_VEC: 7507 case MVE_VCLS: 7508 case MVE_VCLZ: 7509 case MVE_VCMP_VEC_T1: 7510 case MVE_VCMP_VEC_T2: 7511 case MVE_VCMP_VEC_T3: 7512 case MVE_VCMP_VEC_T4: 7513 case MVE_VCMP_VEC_T5: 7514 case MVE_VCMP_VEC_T6: 7515 case MVE_VCTP: 7516 case MVE_VDDUP: 7517 case MVE_VDWDUP: 7518 case MVE_VHADD_T1: 7519 case MVE_VHADD_T2: 7520 case MVE_VHCADD: 7521 case MVE_VHSUB_T1: 7522 case MVE_VHSUB_T2: 7523 case MVE_VIDUP: 7524 case MVE_VIWDUP: 7525 case MVE_VLD2: 7526 case MVE_VLD4: 7527 case MVE_VLDRB_GATHER_T1: 7528 case MVE_VLDRH_GATHER_T2: 7529 case MVE_VLDRW_GATHER_T3: 7530 case MVE_VLDRD_GATHER_T4: 7531 case MVE_VLDRB_T1: 7532 case MVE_VLDRH_T2: 7533 case MVE_VMAX: 7534 case MVE_VMAXA: 7535 case MVE_VMAXV: 7536 case MVE_VMAXAV: 7537 case MVE_VMIN: 7538 case MVE_VMINA: 7539 case MVE_VMINV: 7540 case MVE_VMINAV: 7541 case MVE_VMLA: 7542 case MVE_VMLAS: 7543 case MVE_VMUL_VEC_T1: 7544 case MVE_VMUL_VEC_T2: 7545 case MVE_VMULH: 7546 case MVE_VRMULH: 7547 case MVE_VMULL_INT: 7548 case MVE_VNEG_FP: 7549 case MVE_VNEG_VEC: 7550 case MVE_VPT_VEC_T1: 7551 case MVE_VPT_VEC_T2: 7552 case MVE_VPT_VEC_T3: 7553 case MVE_VPT_VEC_T4: 7554 case MVE_VPT_VEC_T5: 7555 case MVE_VPT_VEC_T6: 7556 case MVE_VQABS: 7557 case MVE_VQADD_T1: 7558 case MVE_VQADD_T2: 7559 case MVE_VQDMLADH: 7560 case MVE_VQRDMLADH: 7561 case MVE_VQDMLAH: 7562 case MVE_VQRDMLAH: 7563 case MVE_VQDMLASH: 7564 case MVE_VQRDMLASH: 7565 case MVE_VQDMLSDH: 7566 case MVE_VQRDMLSDH: 7567 case MVE_VQDMULH_T1: 7568 case MVE_VQRDMULH_T2: 7569 case MVE_VQDMULH_T3: 7570 case MVE_VQRDMULH_T4: 7571 case MVE_VQNEG: 7572 case MVE_VQRSHL_T1: 7573 case MVE_VQRSHL_T2: 7574 case MVE_VQSHL_T1: 7575 case MVE_VQSHL_T4: 7576 case MVE_VQSUB_T1: 7577 case MVE_VQSUB_T2: 7578 case MVE_VREV32: 7579 case MVE_VREV64: 7580 case MVE_VRHADD: 7581 case MVE_VRINT_FP: 7582 case MVE_VRSHL_T1: 7583 case MVE_VRSHL_T2: 7584 case MVE_VSHL_T2: 7585 case MVE_VSHL_T3: 7586 case MVE_VSHLL_T2: 7587 case MVE_VST2: 7588 case MVE_VST4: 7589 case MVE_VSTRB_SCATTER_T1: 7590 case MVE_VSTRH_SCATTER_T2: 7591 case MVE_VSTRW_SCATTER_T3: 7592 case MVE_VSTRB_T1: 7593 case MVE_VSTRH_T2: 7594 case MVE_VSUB_VEC_T1: 7595 case MVE_VSUB_VEC_T2: 7596 if (size <= 3) 7597 func (stream, "%s", mve_vec_sizename[size]); 7598 else 7599 func (stream, "<undef size>"); 7600 break; 7601 7602 case MVE_VABD_FP: 7603 case MVE_VADD_FP_T1: 7604 case MVE_VADD_FP_T2: 7605 case MVE_VSUB_FP_T1: 7606 case MVE_VSUB_FP_T2: 7607 case MVE_VCMP_FP_T1: 7608 case MVE_VCMP_FP_T2: 7609 case MVE_VFMA_FP_SCALAR: 7610 case MVE_VFMA_FP: 7611 case MVE_VFMS_FP: 7612 case MVE_VFMAS_FP_SCALAR: 7613 case MVE_VMAXNM_FP: 7614 case MVE_VMAXNMA_FP: 7615 case MVE_VMAXNMV_FP: 7616 case MVE_VMAXNMAV_FP: 7617 case MVE_VMINNM_FP: 7618 case MVE_VMINNMA_FP: 7619 case MVE_VMINNMV_FP: 7620 case MVE_VMINNMAV_FP: 7621 case MVE_VMUL_FP_T1: 7622 case MVE_VMUL_FP_T2: 7623 case MVE_VPT_FP_T1: 7624 case MVE_VPT_FP_T2: 7625 if (size == 0) 7626 func (stream, "32"); 7627 else if (size == 1) 7628 func (stream, "16"); 7629 break; 7630 7631 case MVE_VCADD_FP: 7632 case MVE_VCMLA_FP: 7633 case MVE_VCMUL_FP: 7634 case MVE_VMLADAV_T1: 7635 case MVE_VMLALDAV: 7636 case MVE_VMLSDAV_T1: 7637 case MVE_VMLSLDAV: 7638 case MVE_VMOVN: 7639 case MVE_VQDMULL_T1: 7640 case MVE_VQDMULL_T2: 7641 case MVE_VQMOVN: 7642 case MVE_VQMOVUN: 7643 if (size == 0) 7644 func (stream, "16"); 7645 else if (size == 1) 7646 func (stream, "32"); 7647 break; 7648 7649 case MVE_VMOVL: 7650 if (size == 1) 7651 func (stream, "8"); 7652 else if (size == 2) 7653 func (stream, "16"); 7654 break; 7655 7656 case MVE_VDUP: 7657 switch (size) 7658 { 7659 case 0: 7660 func (stream, "32"); 7661 break; 7662 case 1: 7663 func (stream, "16"); 7664 break; 7665 case 2: 7666 func (stream, "8"); 7667 break; 7668 default: 7669 break; 7670 } 7671 break; 7672 7673 case MVE_VMOV_GP_TO_VEC_LANE: 7674 case MVE_VMOV_VEC_LANE_TO_GP: 7675 switch (size) 7676 { 7677 case 0: case 4: 7678 func (stream, "32"); 7679 break; 7680 7681 case 1: case 3: 7682 case 5: case 7: 7683 func (stream, "16"); 7684 break; 7685 7686 case 8: case 9: case 10: case 11: 7687 case 12: case 13: case 14: case 15: 7688 func (stream, "8"); 7689 break; 7690 7691 default: 7692 break; 7693 } 7694 break; 7695 7696 case MVE_VMOV_IMM_TO_VEC: 7697 switch (size) 7698 { 7699 case 0: case 4: case 8: 7700 case 12: case 24: case 26: 7701 func (stream, "i32"); 7702 break; 7703 case 16: case 20: 7704 func (stream, "i16"); 7705 break; 7706 case 28: 7707 func (stream, "i8"); 7708 break; 7709 case 29: 7710 func (stream, "i64"); 7711 break; 7712 case 30: 7713 func (stream, "f32"); 7714 break; 7715 default: 7716 break; 7717 } 7718 break; 7719 7720 case MVE_VMULL_POLY: 7721 if (size == 0) 7722 func (stream, "p8"); 7723 else if (size == 1) 7724 func (stream, "p16"); 7725 break; 7726 7727 case MVE_VMVN_IMM: 7728 switch (size) 7729 { 7730 case 0: case 2: case 4: 7731 case 6: case 12: case 13: 7732 func (stream, "32"); 7733 break; 7734 7735 case 8: case 10: 7736 func (stream, "16"); 7737 break; 7738 7739 default: 7740 break; 7741 } 7742 break; 7743 7744 case MVE_VBIC_IMM: 7745 case MVE_VORR_IMM: 7746 switch (size) 7747 { 7748 case 1: case 3: 7749 case 5: case 7: 7750 func (stream, "32"); 7751 break; 7752 7753 case 9: case 11: 7754 func (stream, "16"); 7755 break; 7756 7757 default: 7758 break; 7759 } 7760 break; 7761 7762 case MVE_VQSHRN: 7763 case MVE_VQSHRUN: 7764 case MVE_VQRSHRN: 7765 case MVE_VQRSHRUN: 7766 case MVE_VRSHRN: 7767 case MVE_VSHRN: 7768 { 7769 switch (size) 7770 { 7771 case 1: 7772 func (stream, "16"); 7773 break; 7774 7775 case 2: case 3: 7776 func (stream, "32"); 7777 break; 7778 7779 default: 7780 break; 7781 } 7782 } 7783 break; 7784 7785 case MVE_VQSHL_T2: 7786 case MVE_VQSHLU_T3: 7787 case MVE_VRSHR: 7788 case MVE_VSHL_T1: 7789 case MVE_VSHLL_T1: 7790 case MVE_VSHR: 7791 case MVE_VSLI: 7792 case MVE_VSRI: 7793 { 7794 switch (size) 7795 { 7796 case 1: 7797 func (stream, "8"); 7798 break; 7799 7800 case 2: case 3: 7801 func (stream, "16"); 7802 break; 7803 7804 case 4: case 5: case 6: case 7: 7805 func (stream, "32"); 7806 break; 7807 7808 default: 7809 break; 7810 } 7811 } 7812 break; 7813 7814 default: 7815 break; 7816 } 7817 } 7818 7819 static void 7820 print_mve_shift_n (struct disassemble_info *info, long given, 7821 enum mve_instructions matched_insn) 7822 { 7823 void *stream = info->stream; 7824 fprintf_ftype func = info->fprintf_func; 7825 7826 int startAt0 7827 = matched_insn == MVE_VQSHL_T2 7828 || matched_insn == MVE_VQSHLU_T3 7829 || matched_insn == MVE_VSHL_T1 7830 || matched_insn == MVE_VSHLL_T1 7831 || matched_insn == MVE_VSLI; 7832 7833 unsigned imm6 = (given & 0x3f0000) >> 16; 7834 7835 if (matched_insn == MVE_VSHLL_T1) 7836 imm6 &= 0x1f; 7837 7838 unsigned shiftAmount = 0; 7839 if ((imm6 & 0x20) != 0) 7840 shiftAmount = startAt0 ? imm6 - 32 : 64 - imm6; 7841 else if ((imm6 & 0x10) != 0) 7842 shiftAmount = startAt0 ? imm6 - 16 : 32 - imm6; 7843 else if ((imm6 & 0x08) != 0) 7844 shiftAmount = startAt0 ? imm6 - 8 : 16 - imm6; 7845 else 7846 print_mve_undefined (info, UNDEF_SIZE_0); 7847 7848 func (stream, "%u", shiftAmount); 7849 } 7850 7851 static void 7852 print_vec_condition (struct disassemble_info *info, long given, 7853 enum mve_instructions matched_insn) 7854 { 7855 void *stream = info->stream; 7856 fprintf_ftype func = info->fprintf_func; 7857 long vec_cond = 0; 7858 7859 switch (matched_insn) 7860 { 7861 case MVE_VPT_FP_T1: 7862 case MVE_VCMP_FP_T1: 7863 vec_cond = (((given & 0x1000) >> 10) 7864 | ((given & 1) << 1) 7865 | ((given & 0x0080) >> 7)); 7866 func (stream, "%s",vec_condnames[vec_cond]); 7867 break; 7868 7869 case MVE_VPT_FP_T2: 7870 case MVE_VCMP_FP_T2: 7871 vec_cond = (((given & 0x1000) >> 10) 7872 | ((given & 0x0020) >> 4) 7873 | ((given & 0x0080) >> 7)); 7874 func (stream, "%s",vec_condnames[vec_cond]); 7875 break; 7876 7877 case MVE_VPT_VEC_T1: 7878 case MVE_VCMP_VEC_T1: 7879 vec_cond = (given & 0x0080) >> 7; 7880 func (stream, "%s",vec_condnames[vec_cond]); 7881 break; 7882 7883 case MVE_VPT_VEC_T2: 7884 case MVE_VCMP_VEC_T2: 7885 vec_cond = 2 | ((given & 0x0080) >> 7); 7886 func (stream, "%s",vec_condnames[vec_cond]); 7887 break; 7888 7889 case MVE_VPT_VEC_T3: 7890 case MVE_VCMP_VEC_T3: 7891 vec_cond = 4 | ((given & 1) << 1) | ((given & 0x0080) >> 7); 7892 func (stream, "%s",vec_condnames[vec_cond]); 7893 break; 7894 7895 case MVE_VPT_VEC_T4: 7896 case MVE_VCMP_VEC_T4: 7897 vec_cond = (given & 0x0080) >> 7; 7898 func (stream, "%s",vec_condnames[vec_cond]); 7899 break; 7900 7901 case MVE_VPT_VEC_T5: 7902 case MVE_VCMP_VEC_T5: 7903 vec_cond = 2 | ((given & 0x0080) >> 7); 7904 func (stream, "%s",vec_condnames[vec_cond]); 7905 break; 7906 7907 case MVE_VPT_VEC_T6: 7908 case MVE_VCMP_VEC_T6: 7909 vec_cond = 4 | ((given & 0x0020) >> 4) | ((given & 0x0080) >> 7); 7910 func (stream, "%s",vec_condnames[vec_cond]); 7911 break; 7912 7913 case MVE_NONE: 7914 case MVE_VPST: 7915 default: 7916 break; 7917 } 7918 } 7919 7920 #define W_BIT 21 7921 #define I_BIT 22 7922 #define U_BIT 23 7923 #define P_BIT 24 7924 7925 #define WRITEBACK_BIT_SET (given & (1 << W_BIT)) 7926 #define IMMEDIATE_BIT_SET (given & (1 << I_BIT)) 7927 #define NEGATIVE_BIT_SET ((given & (1 << U_BIT)) == 0) 7928 #define PRE_BIT_SET (given & (1 << P_BIT)) 7929 7930 7931 /* Print one coprocessor instruction on INFO->STREAM. 7932 Return TRUE if the instuction matched, FALSE if this is not a 7933 recognised coprocessor instruction. */ 7934 7935 static bfd_boolean 7936 print_insn_coprocessor_1 (const struct sopcode32 *opcodes, 7937 bfd_vma pc, 7938 struct disassemble_info *info, 7939 long given, 7940 bfd_boolean thumb) 7941 { 7942 const struct sopcode32 *insn; 7943 void *stream = info->stream; 7944 fprintf_ftype func = info->fprintf_func; 7945 unsigned long mask; 7946 unsigned long value = 0; 7947 int cond; 7948 int cp_num; 7949 struct arm_private_data *private_data = info->private_data; 7950 arm_feature_set allowed_arches = ARM_ARCH_NONE; 7951 arm_feature_set arm_ext_v8_1m_main = 7952 ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN); 7953 7954 allowed_arches = private_data->features; 7955 7956 for (insn = opcodes; insn->assembler; insn++) 7957 { 7958 unsigned long u_reg = 16; 7959 bfd_boolean is_unpredictable = FALSE; 7960 signed long value_in_comment = 0; 7961 const char *c; 7962 7963 if (ARM_FEATURE_ZERO (insn->arch)) 7964 switch (insn->value) 7965 { 7966 case SENTINEL_IWMMXT_START: 7967 if (info->mach != bfd_mach_arm_XScale 7968 && info->mach != bfd_mach_arm_iWMMXt 7969 && info->mach != bfd_mach_arm_iWMMXt2) 7970 do 7971 insn++; 7972 while ((! ARM_FEATURE_ZERO (insn->arch)) 7973 && insn->value != SENTINEL_IWMMXT_END); 7974 continue; 7975 7976 case SENTINEL_IWMMXT_END: 7977 continue; 7978 7979 case SENTINEL_GENERIC_START: 7980 allowed_arches = private_data->features; 7981 continue; 7982 7983 default: 7984 abort (); 7985 } 7986 7987 mask = insn->mask; 7988 value = insn->value; 7989 cp_num = (given >> 8) & 0xf; 7990 7991 if (thumb) 7992 { 7993 /* The high 4 bits are 0xe for Arm conditional instructions, and 7994 0xe for arm unconditional instructions. The rest of the 7995 encoding is the same. */ 7996 mask |= 0xf0000000; 7997 value |= 0xe0000000; 7998 if (ifthen_state) 7999 cond = IFTHEN_COND; 8000 else 8001 cond = COND_UNCOND; 8002 } 8003 else 8004 { 8005 /* Only match unconditional instuctions against unconditional 8006 patterns. */ 8007 if ((given & 0xf0000000) == 0xf0000000) 8008 { 8009 mask |= 0xf0000000; 8010 cond = COND_UNCOND; 8011 } 8012 else 8013 { 8014 cond = (given >> 28) & 0xf; 8015 if (cond == 0xe) 8016 cond = COND_UNCOND; 8017 } 8018 } 8019 8020 if ((insn->isa == T32 && !thumb) 8021 || (insn->isa == ARM && thumb)) 8022 continue; 8023 8024 if ((given & mask) != value) 8025 continue; 8026 8027 if (! ARM_CPU_HAS_FEATURE (insn->arch, allowed_arches)) 8028 continue; 8029 8030 if (insn->value == 0xfe000010 /* mcr2 */ 8031 || insn->value == 0xfe100010 /* mrc2 */ 8032 || insn->value == 0xfc100000 /* ldc2 */ 8033 || insn->value == 0xfc000000) /* stc2 */ 8034 { 8035 if (cp_num == 9 || cp_num == 10 || cp_num == 11) 8036 is_unpredictable = TRUE; 8037 8038 /* Armv8.1-M Mainline FP & MVE instructions. */ 8039 if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main, allowed_arches) 8040 && !ARM_CPU_IS_ANY (allowed_arches) 8041 && (cp_num == 8 || cp_num == 14 || cp_num == 15)) 8042 continue; 8043 8044 } 8045 else if (insn->value == 0x0e000000 /* cdp */ 8046 || insn->value == 0xfe000000 /* cdp2 */ 8047 || insn->value == 0x0e000010 /* mcr */ 8048 || insn->value == 0x0e100010 /* mrc */ 8049 || insn->value == 0x0c100000 /* ldc */ 8050 || insn->value == 0x0c000000) /* stc */ 8051 { 8052 /* Floating-point instructions. */ 8053 if (cp_num == 9 || cp_num == 10 || cp_num == 11) 8054 continue; 8055 8056 /* Armv8.1-M Mainline FP & MVE instructions. */ 8057 if (ARM_CPU_HAS_FEATURE (arm_ext_v8_1m_main, allowed_arches) 8058 && !ARM_CPU_IS_ANY (allowed_arches) 8059 && (cp_num == 8 || cp_num == 14 || cp_num == 15)) 8060 continue; 8061 } 8062 else if ((insn->value == 0xec100f80 /* vldr (system register) */ 8063 || insn->value == 0xec000f80) /* vstr (system register) */ 8064 && arm_decode_field (given, 24, 24) == 0 8065 && arm_decode_field (given, 21, 21) == 0) 8066 /* If the P and W bits are both 0 then these encodings match the MVE 8067 VLDR and VSTR instructions, these are in a different table, so we 8068 don't let it match here. */ 8069 continue; 8070 8071 for (c = insn->assembler; *c; c++) 8072 { 8073 if (*c == '%') 8074 { 8075 const char mod = *++c; 8076 switch (mod) 8077 { 8078 case '%': 8079 func (stream, "%%"); 8080 break; 8081 8082 case 'A': 8083 case 'K': 8084 { 8085 int rn = (given >> 16) & 0xf; 8086 bfd_vma offset = given & 0xff; 8087 8088 if (mod == 'K') 8089 offset = given & 0x7f; 8090 8091 func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]); 8092 8093 if (PRE_BIT_SET || WRITEBACK_BIT_SET) 8094 { 8095 /* Not unindexed. The offset is scaled. */ 8096 if (cp_num == 9) 8097 /* vldr.16/vstr.16 will shift the address 8098 left by 1 bit only. */ 8099 offset = offset * 2; 8100 else 8101 offset = offset * 4; 8102 8103 if (NEGATIVE_BIT_SET) 8104 offset = - offset; 8105 if (rn != 15) 8106 value_in_comment = offset; 8107 } 8108 8109 if (PRE_BIT_SET) 8110 { 8111 if (offset) 8112 func (stream, ", #%d]%s", 8113 (int) offset, 8114 WRITEBACK_BIT_SET ? "!" : ""); 8115 else if (NEGATIVE_BIT_SET) 8116 func (stream, ", #-0]"); 8117 else 8118 func (stream, "]"); 8119 } 8120 else 8121 { 8122 func (stream, "]"); 8123 8124 if (WRITEBACK_BIT_SET) 8125 { 8126 if (offset) 8127 func (stream, ", #%d", (int) offset); 8128 else if (NEGATIVE_BIT_SET) 8129 func (stream, ", #-0"); 8130 } 8131 else 8132 { 8133 func (stream, ", {%s%d}", 8134 (NEGATIVE_BIT_SET && !offset) ? "-" : "", 8135 (int) offset); 8136 value_in_comment = offset; 8137 } 8138 } 8139 if (rn == 15 && (PRE_BIT_SET || WRITEBACK_BIT_SET)) 8140 { 8141 func (stream, "\t; "); 8142 /* For unaligned PCs, apply off-by-alignment 8143 correction. */ 8144 info->print_address_func (offset + pc 8145 + info->bytes_per_chunk * 2 8146 - (pc & 3), 8147 info); 8148 } 8149 } 8150 break; 8151 8152 case 'B': 8153 { 8154 int regno = ((given >> 12) & 0xf) | ((given >> (22 - 4)) & 0x10); 8155 int offset = (given >> 1) & 0x3f; 8156 8157 if (offset == 1) 8158 func (stream, "{d%d}", regno); 8159 else if (regno + offset > 32) 8160 func (stream, "{d%d-<overflow reg d%d>}", regno, regno + offset - 1); 8161 else 8162 func (stream, "{d%d-d%d}", regno, regno + offset - 1); 8163 } 8164 break; 8165 8166 case 'C': 8167 { 8168 bfd_boolean single = ((given >> 8) & 1) == 0; 8169 char reg_prefix = single ? 's' : 'd'; 8170 int Dreg = (given >> 22) & 0x1; 8171 int Vdreg = (given >> 12) & 0xf; 8172 int reg = single ? ((Vdreg << 1) | Dreg) 8173 : ((Dreg << 4) | Vdreg); 8174 int num = (given >> (single ? 0 : 1)) & 0x7f; 8175 int maxreg = single ? 31 : 15; 8176 int topreg = reg + num - 1; 8177 8178 if (!num) 8179 func (stream, "{VPR}"); 8180 else if (num == 1) 8181 func (stream, "{%c%d, VPR}", reg_prefix, reg); 8182 else if (topreg > maxreg) 8183 func (stream, "{%c%d-<overflow reg d%d, VPR}", 8184 reg_prefix, reg, single ? topreg >> 1 : topreg); 8185 else 8186 func (stream, "{%c%d-%c%d, VPR}", reg_prefix, reg, 8187 reg_prefix, topreg); 8188 } 8189 break; 8190 8191 case 'u': 8192 if (cond != COND_UNCOND) 8193 is_unpredictable = TRUE; 8194 8195 /* Fall through. */ 8196 case 'c': 8197 if (cond != COND_UNCOND && cp_num == 9) 8198 is_unpredictable = TRUE; 8199 8200 /* Fall through. */ 8201 case 'b': 8202 func (stream, "%s", arm_conditional[cond]); 8203 break; 8204 8205 case 'I': 8206 /* Print a Cirrus/DSP shift immediate. */ 8207 /* Immediates are 7bit signed ints with bits 0..3 in 8208 bits 0..3 of opcode and bits 4..6 in bits 5..7 8209 of opcode. */ 8210 { 8211 int imm; 8212 8213 imm = (given & 0xf) | ((given & 0xe0) >> 1); 8214 8215 /* Is ``imm'' a negative number? */ 8216 if (imm & 0x40) 8217 imm -= 0x80; 8218 8219 func (stream, "%d", imm); 8220 } 8221 8222 break; 8223 8224 case 'J': 8225 { 8226 unsigned long regno 8227 = arm_decode_field_multiple (given, 13, 15, 22, 22); 8228 8229 switch (regno) 8230 { 8231 case 0x1: 8232 func (stream, "FPSCR"); 8233 break; 8234 case 0x2: 8235 func (stream, "FPSCR_nzcvqc"); 8236 break; 8237 case 0xc: 8238 func (stream, "VPR"); 8239 break; 8240 case 0xd: 8241 func (stream, "P0"); 8242 break; 8243 case 0xe: 8244 func (stream, "FPCXTNS"); 8245 break; 8246 case 0xf: 8247 func (stream, "FPCXTS"); 8248 break; 8249 default: 8250 func (stream, "<invalid reg %lu>", regno); 8251 break; 8252 } 8253 } 8254 break; 8255 8256 case 'F': 8257 switch (given & 0x00408000) 8258 { 8259 case 0: 8260 func (stream, "4"); 8261 break; 8262 case 0x8000: 8263 func (stream, "1"); 8264 break; 8265 case 0x00400000: 8266 func (stream, "2"); 8267 break; 8268 default: 8269 func (stream, "3"); 8270 } 8271 break; 8272 8273 case 'P': 8274 switch (given & 0x00080080) 8275 { 8276 case 0: 8277 func (stream, "s"); 8278 break; 8279 case 0x80: 8280 func (stream, "d"); 8281 break; 8282 case 0x00080000: 8283 func (stream, "e"); 8284 break; 8285 default: 8286 func (stream, _("<illegal precision>")); 8287 break; 8288 } 8289 break; 8290 8291 case 'Q': 8292 switch (given & 0x00408000) 8293 { 8294 case 0: 8295 func (stream, "s"); 8296 break; 8297 case 0x8000: 8298 func (stream, "d"); 8299 break; 8300 case 0x00400000: 8301 func (stream, "e"); 8302 break; 8303 default: 8304 func (stream, "p"); 8305 break; 8306 } 8307 break; 8308 8309 case 'R': 8310 switch (given & 0x60) 8311 { 8312 case 0: 8313 break; 8314 case 0x20: 8315 func (stream, "p"); 8316 break; 8317 case 0x40: 8318 func (stream, "m"); 8319 break; 8320 default: 8321 func (stream, "z"); 8322 break; 8323 } 8324 break; 8325 8326 case '0': case '1': case '2': case '3': case '4': 8327 case '5': case '6': case '7': case '8': case '9': 8328 { 8329 int width; 8330 8331 c = arm_decode_bitfield (c, given, &value, &width); 8332 8333 switch (*c) 8334 { 8335 case 'R': 8336 if (value == 15) 8337 is_unpredictable = TRUE; 8338 /* Fall through. */ 8339 case 'r': 8340 if (c[1] == 'u') 8341 { 8342 /* Eat the 'u' character. */ 8343 ++ c; 8344 8345 if (u_reg == value) 8346 is_unpredictable = TRUE; 8347 u_reg = value; 8348 } 8349 func (stream, "%s", arm_regnames[value]); 8350 break; 8351 case 'V': 8352 if (given & (1 << 6)) 8353 goto Q; 8354 /* FALLTHROUGH */ 8355 case 'D': 8356 func (stream, "d%ld", value); 8357 break; 8358 case 'Q': 8359 Q: 8360 if (value & 1) 8361 func (stream, "<illegal reg q%ld.5>", value >> 1); 8362 else 8363 func (stream, "q%ld", value >> 1); 8364 break; 8365 case 'd': 8366 func (stream, "%ld", value); 8367 value_in_comment = value; 8368 break; 8369 case 'E': 8370 { 8371 /* Converts immediate 8 bit back to float value. */ 8372 unsigned floatVal = (value & 0x80) << 24 8373 | (value & 0x3F) << 19 8374 | ((value & 0x40) ? (0xF8 << 22) : (1 << 30)); 8375 8376 /* Quarter float have a maximum value of 31.0. 8377 Get floating point value multiplied by 1e7. 8378 The maximum value stays in limit of a 32-bit int. */ 8379 unsigned decVal = 8380 (78125 << (((floatVal >> 23) & 0xFF) - 124)) * 8381 (16 + (value & 0xF)); 8382 8383 if (!(decVal % 1000000)) 8384 func (stream, "%ld\t; 0x%08x %c%u.%01u", value, 8385 floatVal, value & 0x80 ? '-' : ' ', 8386 decVal / 10000000, 8387 decVal % 10000000 / 1000000); 8388 else if (!(decVal % 10000)) 8389 func (stream, "%ld\t; 0x%08x %c%u.%03u", value, 8390 floatVal, value & 0x80 ? '-' : ' ', 8391 decVal / 10000000, 8392 decVal % 10000000 / 10000); 8393 else 8394 func (stream, "%ld\t; 0x%08x %c%u.%07u", value, 8395 floatVal, value & 0x80 ? '-' : ' ', 8396 decVal / 10000000, decVal % 10000000); 8397 break; 8398 } 8399 case 'k': 8400 { 8401 int from = (given & (1 << 7)) ? 32 : 16; 8402 func (stream, "%ld", from - value); 8403 } 8404 break; 8405 8406 case 'f': 8407 if (value > 7) 8408 func (stream, "#%s", arm_fp_const[value & 7]); 8409 else 8410 func (stream, "f%ld", value); 8411 break; 8412 8413 case 'w': 8414 if (width == 2) 8415 func (stream, "%s", iwmmxt_wwnames[value]); 8416 else 8417 func (stream, "%s", iwmmxt_wwssnames[value]); 8418 break; 8419 8420 case 'g': 8421 func (stream, "%s", iwmmxt_regnames[value]); 8422 break; 8423 case 'G': 8424 func (stream, "%s", iwmmxt_cregnames[value]); 8425 break; 8426 8427 case 'x': 8428 func (stream, "0x%lx", (value & 0xffffffffUL)); 8429 break; 8430 8431 case 'c': 8432 switch (value) 8433 { 8434 case 0: 8435 func (stream, "eq"); 8436 break; 8437 8438 case 1: 8439 func (stream, "vs"); 8440 break; 8441 8442 case 2: 8443 func (stream, "ge"); 8444 break; 8445 8446 case 3: 8447 func (stream, "gt"); 8448 break; 8449 8450 default: 8451 func (stream, "??"); 8452 break; 8453 } 8454 break; 8455 8456 case '`': 8457 c++; 8458 if (value == 0) 8459 func (stream, "%c", *c); 8460 break; 8461 case '\'': 8462 c++; 8463 if (value == ((1ul << width) - 1)) 8464 func (stream, "%c", *c); 8465 break; 8466 case '?': 8467 func (stream, "%c", c[(1 << width) - (int) value]); 8468 c += 1 << width; 8469 break; 8470 default: 8471 abort (); 8472 } 8473 } 8474 break; 8475 8476 case 'y': 8477 case 'z': 8478 { 8479 int single = *c++ == 'y'; 8480 int regno; 8481 8482 switch (*c) 8483 { 8484 case '4': /* Sm pair */ 8485 case '0': /* Sm, Dm */ 8486 regno = given & 0x0000000f; 8487 if (single) 8488 { 8489 regno <<= 1; 8490 regno += (given >> 5) & 1; 8491 } 8492 else 8493 regno += ((given >> 5) & 1) << 4; 8494 break; 8495 8496 case '1': /* Sd, Dd */ 8497 regno = (given >> 12) & 0x0000000f; 8498 if (single) 8499 { 8500 regno <<= 1; 8501 regno += (given >> 22) & 1; 8502 } 8503 else 8504 regno += ((given >> 22) & 1) << 4; 8505 break; 8506 8507 case '2': /* Sn, Dn */ 8508 regno = (given >> 16) & 0x0000000f; 8509 if (single) 8510 { 8511 regno <<= 1; 8512 regno += (given >> 7) & 1; 8513 } 8514 else 8515 regno += ((given >> 7) & 1) << 4; 8516 break; 8517 8518 case '3': /* List */ 8519 func (stream, "{"); 8520 regno = (given >> 12) & 0x0000000f; 8521 if (single) 8522 { 8523 regno <<= 1; 8524 regno += (given >> 22) & 1; 8525 } 8526 else 8527 regno += ((given >> 22) & 1) << 4; 8528 break; 8529 8530 default: 8531 abort (); 8532 } 8533 8534 func (stream, "%c%d", single ? 's' : 'd', regno); 8535 8536 if (*c == '3') 8537 { 8538 int count = given & 0xff; 8539 8540 if (single == 0) 8541 count >>= 1; 8542 8543 if (--count) 8544 { 8545 func (stream, "-%c%d", 8546 single ? 's' : 'd', 8547 regno + count); 8548 } 8549 8550 func (stream, "}"); 8551 } 8552 else if (*c == '4') 8553 func (stream, ", %c%d", single ? 's' : 'd', 8554 regno + 1); 8555 } 8556 break; 8557 8558 case 'L': 8559 switch (given & 0x00400100) 8560 { 8561 case 0x00000000: func (stream, "b"); break; 8562 case 0x00400000: func (stream, "h"); break; 8563 case 0x00000100: func (stream, "w"); break; 8564 case 0x00400100: func (stream, "d"); break; 8565 default: 8566 break; 8567 } 8568 break; 8569 8570 case 'Z': 8571 { 8572 /* given (20, 23) | given (0, 3) */ 8573 value = ((given >> 16) & 0xf0) | (given & 0xf); 8574 func (stream, "%d", (int) value); 8575 } 8576 break; 8577 8578 case 'l': 8579 /* This is like the 'A' operator, except that if 8580 the width field "M" is zero, then the offset is 8581 *not* multiplied by four. */ 8582 { 8583 int offset = given & 0xff; 8584 int multiplier = (given & 0x00000100) ? 4 : 1; 8585 8586 func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]); 8587 8588 if (multiplier > 1) 8589 { 8590 value_in_comment = offset * multiplier; 8591 if (NEGATIVE_BIT_SET) 8592 value_in_comment = - value_in_comment; 8593 } 8594 8595 if (offset) 8596 { 8597 if (PRE_BIT_SET) 8598 func (stream, ", #%s%d]%s", 8599 NEGATIVE_BIT_SET ? "-" : "", 8600 offset * multiplier, 8601 WRITEBACK_BIT_SET ? "!" : ""); 8602 else 8603 func (stream, "], #%s%d", 8604 NEGATIVE_BIT_SET ? "-" : "", 8605 offset * multiplier); 8606 } 8607 else 8608 func (stream, "]"); 8609 } 8610 break; 8611 8612 case 'r': 8613 { 8614 int imm4 = (given >> 4) & 0xf; 8615 int puw_bits = ((given >> 22) & 6) | ((given >> W_BIT) & 1); 8616 int ubit = ! NEGATIVE_BIT_SET; 8617 const char *rm = arm_regnames [given & 0xf]; 8618 const char *rn = arm_regnames [(given >> 16) & 0xf]; 8619 8620 switch (puw_bits) 8621 { 8622 case 1: 8623 case 3: 8624 func (stream, "[%s], %c%s", rn, ubit ? '+' : '-', rm); 8625 if (imm4) 8626 func (stream, ", lsl #%d", imm4); 8627 break; 8628 8629 case 4: 8630 case 5: 8631 case 6: 8632 case 7: 8633 func (stream, "[%s, %c%s", rn, ubit ? '+' : '-', rm); 8634 if (imm4 > 0) 8635 func (stream, ", lsl #%d", imm4); 8636 func (stream, "]"); 8637 if (puw_bits == 5 || puw_bits == 7) 8638 func (stream, "!"); 8639 break; 8640 8641 default: 8642 func (stream, "INVALID"); 8643 } 8644 } 8645 break; 8646 8647 case 'i': 8648 { 8649 long imm5; 8650 imm5 = ((given & 0x100) >> 4) | (given & 0xf); 8651 func (stream, "%ld", (imm5 == 0) ? 32 : imm5); 8652 } 8653 break; 8654 8655 default: 8656 abort (); 8657 } 8658 } 8659 else 8660 func (stream, "%c", *c); 8661 } 8662 8663 if (value_in_comment > 32 || value_in_comment < -16) 8664 func (stream, "\t; 0x%lx", (value_in_comment & 0xffffffffUL)); 8665 8666 if (is_unpredictable) 8667 func (stream, UNPREDICTABLE_INSTRUCTION); 8668 8669 return TRUE; 8670 } 8671 return FALSE; 8672 } 8673 8674 static bfd_boolean 8675 print_insn_coprocessor (bfd_vma pc, 8676 struct disassemble_info *info, 8677 long given, 8678 bfd_boolean thumb) 8679 { 8680 return print_insn_coprocessor_1 (coprocessor_opcodes, 8681 pc, info, given, thumb); 8682 } 8683 8684 static bfd_boolean 8685 print_insn_generic_coprocessor (bfd_vma pc, 8686 struct disassemble_info *info, 8687 long given, 8688 bfd_boolean thumb) 8689 { 8690 return print_insn_coprocessor_1 (generic_coprocessor_opcodes, 8691 pc, info, given, thumb); 8692 } 8693 8694 /* Decodes and prints ARM addressing modes. Returns the offset 8695 used in the address, if any, if it is worthwhile printing the 8696 offset as a hexadecimal value in a comment at the end of the 8697 line of disassembly. */ 8698 8699 static signed long 8700 print_arm_address (bfd_vma pc, struct disassemble_info *info, long given) 8701 { 8702 void *stream = info->stream; 8703 fprintf_ftype func = info->fprintf_func; 8704 bfd_vma offset = 0; 8705 8706 if (((given & 0x000f0000) == 0x000f0000) 8707 && ((given & 0x02000000) == 0)) 8708 { 8709 offset = given & 0xfff; 8710 8711 func (stream, "[pc"); 8712 8713 if (PRE_BIT_SET) 8714 { 8715 /* Pre-indexed. Elide offset of positive zero when 8716 non-writeback. */ 8717 if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET || offset) 8718 func (stream, ", #%s%d", NEGATIVE_BIT_SET ? "-" : "", (int) offset); 8719 8720 if (NEGATIVE_BIT_SET) 8721 offset = -offset; 8722 8723 offset += pc + 8; 8724 8725 /* Cope with the possibility of write-back 8726 being used. Probably a very dangerous thing 8727 for the programmer to do, but who are we to 8728 argue ? */ 8729 func (stream, "]%s", WRITEBACK_BIT_SET ? "!" : ""); 8730 } 8731 else /* Post indexed. */ 8732 { 8733 func (stream, "], #%s%d", NEGATIVE_BIT_SET ? "-" : "", (int) offset); 8734 8735 /* Ie ignore the offset. */ 8736 offset = pc + 8; 8737 } 8738 8739 func (stream, "\t; "); 8740 info->print_address_func (offset, info); 8741 offset = 0; 8742 } 8743 else 8744 { 8745 func (stream, "[%s", 8746 arm_regnames[(given >> 16) & 0xf]); 8747 8748 if (PRE_BIT_SET) 8749 { 8750 if ((given & 0x02000000) == 0) 8751 { 8752 /* Elide offset of positive zero when non-writeback. */ 8753 offset = given & 0xfff; 8754 if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET || offset) 8755 func (stream, ", #%s%d", NEGATIVE_BIT_SET ? "-" : "", (int) offset); 8756 } 8757 else 8758 { 8759 func (stream, ", %s", NEGATIVE_BIT_SET ? "-" : ""); 8760 arm_decode_shift (given, func, stream, TRUE); 8761 } 8762 8763 func (stream, "]%s", 8764 WRITEBACK_BIT_SET ? "!" : ""); 8765 } 8766 else 8767 { 8768 if ((given & 0x02000000) == 0) 8769 { 8770 /* Always show offset. */ 8771 offset = given & 0xfff; 8772 func (stream, "], #%s%d", 8773 NEGATIVE_BIT_SET ? "-" : "", (int) offset); 8774 } 8775 else 8776 { 8777 func (stream, "], %s", 8778 NEGATIVE_BIT_SET ? "-" : ""); 8779 arm_decode_shift (given, func, stream, TRUE); 8780 } 8781 } 8782 if (NEGATIVE_BIT_SET) 8783 offset = -offset; 8784 } 8785 8786 return (signed long) offset; 8787 } 8788 8789 /* Print one neon instruction on INFO->STREAM. 8790 Return TRUE if the instuction matched, FALSE if this is not a 8791 recognised neon instruction. */ 8792 8793 static bfd_boolean 8794 print_insn_neon (struct disassemble_info *info, long given, bfd_boolean thumb) 8795 { 8796 const struct opcode32 *insn; 8797 void *stream = info->stream; 8798 fprintf_ftype func = info->fprintf_func; 8799 8800 if (thumb) 8801 { 8802 if ((given & 0xef000000) == 0xef000000) 8803 { 8804 /* Move bit 28 to bit 24 to translate Thumb2 to ARM encoding. */ 8805 unsigned long bit28 = given & (1 << 28); 8806 8807 given &= 0x00ffffff; 8808 if (bit28) 8809 given |= 0xf3000000; 8810 else 8811 given |= 0xf2000000; 8812 } 8813 else if ((given & 0xff000000) == 0xf9000000) 8814 given ^= 0xf9000000 ^ 0xf4000000; 8815 /* BFloat16 neon instructions without special top byte handling. */ 8816 else if ((given & 0xff000000) == 0xfe000000 8817 || (given & 0xff000000) == 0xfc000000) 8818 ; 8819 /* vdup is also a valid neon instruction. */ 8820 else if ((given & 0xff910f5f) != 0xee800b10) 8821 return FALSE; 8822 } 8823 8824 for (insn = neon_opcodes; insn->assembler; insn++) 8825 { 8826 if ((given & insn->mask) == insn->value) 8827 { 8828 signed long value_in_comment = 0; 8829 bfd_boolean is_unpredictable = FALSE; 8830 const char *c; 8831 8832 for (c = insn->assembler; *c; c++) 8833 { 8834 if (*c == '%') 8835 { 8836 switch (*++c) 8837 { 8838 case '%': 8839 func (stream, "%%"); 8840 break; 8841 8842 case 'u': 8843 if (thumb && ifthen_state) 8844 is_unpredictable = TRUE; 8845 8846 /* Fall through. */ 8847 case 'c': 8848 if (thumb && ifthen_state) 8849 func (stream, "%s", arm_conditional[IFTHEN_COND]); 8850 break; 8851 8852 case 'A': 8853 { 8854 static const unsigned char enc[16] = 8855 { 8856 0x4, 0x14, /* st4 0,1 */ 8857 0x4, /* st1 2 */ 8858 0x4, /* st2 3 */ 8859 0x3, /* st3 4 */ 8860 0x13, /* st3 5 */ 8861 0x3, /* st1 6 */ 8862 0x1, /* st1 7 */ 8863 0x2, /* st2 8 */ 8864 0x12, /* st2 9 */ 8865 0x2, /* st1 10 */ 8866 0, 0, 0, 0, 0 8867 }; 8868 int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4); 8869 int rn = ((given >> 16) & 0xf); 8870 int rm = ((given >> 0) & 0xf); 8871 int align = ((given >> 4) & 0x3); 8872 int type = ((given >> 8) & 0xf); 8873 int n = enc[type] & 0xf; 8874 int stride = (enc[type] >> 4) + 1; 8875 int ix; 8876 8877 func (stream, "{"); 8878 if (stride > 1) 8879 for (ix = 0; ix != n; ix++) 8880 func (stream, "%sd%d", ix ? "," : "", rd + ix * stride); 8881 else if (n == 1) 8882 func (stream, "d%d", rd); 8883 else 8884 func (stream, "d%d-d%d", rd, rd + n - 1); 8885 func (stream, "}, [%s", arm_regnames[rn]); 8886 if (align) 8887 func (stream, " :%d", 32 << align); 8888 func (stream, "]"); 8889 if (rm == 0xd) 8890 func (stream, "!"); 8891 else if (rm != 0xf) 8892 func (stream, ", %s", arm_regnames[rm]); 8893 } 8894 break; 8895 8896 case 'B': 8897 { 8898 int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4); 8899 int rn = ((given >> 16) & 0xf); 8900 int rm = ((given >> 0) & 0xf); 8901 int idx_align = ((given >> 4) & 0xf); 8902 int align = 0; 8903 int size = ((given >> 10) & 0x3); 8904 int idx = idx_align >> (size + 1); 8905 int length = ((given >> 8) & 3) + 1; 8906 int stride = 1; 8907 int i; 8908 8909 if (length > 1 && size > 0) 8910 stride = (idx_align & (1 << size)) ? 2 : 1; 8911 8912 switch (length) 8913 { 8914 case 1: 8915 { 8916 int amask = (1 << size) - 1; 8917 if ((idx_align & (1 << size)) != 0) 8918 return FALSE; 8919 if (size > 0) 8920 { 8921 if ((idx_align & amask) == amask) 8922 align = 8 << size; 8923 else if ((idx_align & amask) != 0) 8924 return FALSE; 8925 } 8926 } 8927 break; 8928 8929 case 2: 8930 if (size == 2 && (idx_align & 2) != 0) 8931 return FALSE; 8932 align = (idx_align & 1) ? 16 << size : 0; 8933 break; 8934 8935 case 3: 8936 if ((size == 2 && (idx_align & 3) != 0) 8937 || (idx_align & 1) != 0) 8938 return FALSE; 8939 break; 8940 8941 case 4: 8942 if (size == 2) 8943 { 8944 if ((idx_align & 3) == 3) 8945 return FALSE; 8946 align = (idx_align & 3) * 64; 8947 } 8948 else 8949 align = (idx_align & 1) ? 32 << size : 0; 8950 break; 8951 8952 default: 8953 abort (); 8954 } 8955 8956 func (stream, "{"); 8957 for (i = 0; i < length; i++) 8958 func (stream, "%sd%d[%d]", (i == 0) ? "" : ",", 8959 rd + i * stride, idx); 8960 func (stream, "}, [%s", arm_regnames[rn]); 8961 if (align) 8962 func (stream, " :%d", align); 8963 func (stream, "]"); 8964 if (rm == 0xd) 8965 func (stream, "!"); 8966 else if (rm != 0xf) 8967 func (stream, ", %s", arm_regnames[rm]); 8968 } 8969 break; 8970 8971 case 'C': 8972 { 8973 int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4); 8974 int rn = ((given >> 16) & 0xf); 8975 int rm = ((given >> 0) & 0xf); 8976 int align = ((given >> 4) & 0x1); 8977 int size = ((given >> 6) & 0x3); 8978 int type = ((given >> 8) & 0x3); 8979 int n = type + 1; 8980 int stride = ((given >> 5) & 0x1); 8981 int ix; 8982 8983 if (stride && (n == 1)) 8984 n++; 8985 else 8986 stride++; 8987 8988 func (stream, "{"); 8989 if (stride > 1) 8990 for (ix = 0; ix != n; ix++) 8991 func (stream, "%sd%d[]", ix ? "," : "", rd + ix * stride); 8992 else if (n == 1) 8993 func (stream, "d%d[]", rd); 8994 else 8995 func (stream, "d%d[]-d%d[]", rd, rd + n - 1); 8996 func (stream, "}, [%s", arm_regnames[rn]); 8997 if (align) 8998 { 8999 align = (8 * (type + 1)) << size; 9000 if (type == 3) 9001 align = (size > 1) ? align >> 1 : align; 9002 if (type == 2 || (type == 0 && !size)) 9003 func (stream, " :<bad align %d>", align); 9004 else 9005 func (stream, " :%d", align); 9006 } 9007 func (stream, "]"); 9008 if (rm == 0xd) 9009 func (stream, "!"); 9010 else if (rm != 0xf) 9011 func (stream, ", %s", arm_regnames[rm]); 9012 } 9013 break; 9014 9015 case 'D': 9016 { 9017 int raw_reg = (given & 0xf) | ((given >> 1) & 0x10); 9018 int size = (given >> 20) & 3; 9019 int reg = raw_reg & ((4 << size) - 1); 9020 int ix = raw_reg >> size >> 2; 9021 9022 func (stream, "d%d[%d]", reg, ix); 9023 } 9024 break; 9025 9026 case 'E': 9027 /* Neon encoded constant for mov, mvn, vorr, vbic. */ 9028 { 9029 int bits = 0; 9030 int cmode = (given >> 8) & 0xf; 9031 int op = (given >> 5) & 0x1; 9032 unsigned long value = 0, hival = 0; 9033 unsigned shift; 9034 int size = 0; 9035 int isfloat = 0; 9036 9037 bits |= ((given >> 24) & 1) << 7; 9038 bits |= ((given >> 16) & 7) << 4; 9039 bits |= ((given >> 0) & 15) << 0; 9040 9041 if (cmode < 8) 9042 { 9043 shift = (cmode >> 1) & 3; 9044 value = (unsigned long) bits << (8 * shift); 9045 size = 32; 9046 } 9047 else if (cmode < 12) 9048 { 9049 shift = (cmode >> 1) & 1; 9050 value = (unsigned long) bits << (8 * shift); 9051 size = 16; 9052 } 9053 else if (cmode < 14) 9054 { 9055 shift = (cmode & 1) + 1; 9056 value = (unsigned long) bits << (8 * shift); 9057 value |= (1ul << (8 * shift)) - 1; 9058 size = 32; 9059 } 9060 else if (cmode == 14) 9061 { 9062 if (op) 9063 { 9064 /* Bit replication into bytes. */ 9065 int ix; 9066 unsigned long mask; 9067 9068 value = 0; 9069 hival = 0; 9070 for (ix = 7; ix >= 0; ix--) 9071 { 9072 mask = ((bits >> ix) & 1) ? 0xff : 0; 9073 if (ix <= 3) 9074 value = (value << 8) | mask; 9075 else 9076 hival = (hival << 8) | mask; 9077 } 9078 size = 64; 9079 } 9080 else 9081 { 9082 /* Byte replication. */ 9083 value = (unsigned long) bits; 9084 size = 8; 9085 } 9086 } 9087 else if (!op) 9088 { 9089 /* Floating point encoding. */ 9090 int tmp; 9091 9092 value = (unsigned long) (bits & 0x7f) << 19; 9093 value |= (unsigned long) (bits & 0x80) << 24; 9094 tmp = bits & 0x40 ? 0x3c : 0x40; 9095 value |= (unsigned long) tmp << 24; 9096 size = 32; 9097 isfloat = 1; 9098 } 9099 else 9100 { 9101 func (stream, "<illegal constant %.8x:%x:%x>", 9102 bits, cmode, op); 9103 size = 32; 9104 break; 9105 } 9106 switch (size) 9107 { 9108 case 8: 9109 func (stream, "#%ld\t; 0x%.2lx", value, value); 9110 break; 9111 9112 case 16: 9113 func (stream, "#%ld\t; 0x%.4lx", value, value); 9114 break; 9115 9116 case 32: 9117 if (isfloat) 9118 { 9119 unsigned char valbytes[4]; 9120 double fvalue; 9121 9122 /* Do this a byte at a time so we don't have to 9123 worry about the host's endianness. */ 9124 valbytes[0] = value & 0xff; 9125 valbytes[1] = (value >> 8) & 0xff; 9126 valbytes[2] = (value >> 16) & 0xff; 9127 valbytes[3] = (value >> 24) & 0xff; 9128 9129 floatformat_to_double 9130 (& floatformat_ieee_single_little, valbytes, 9131 & fvalue); 9132 9133 func (stream, "#%.7g\t; 0x%.8lx", fvalue, 9134 value); 9135 } 9136 else 9137 func (stream, "#%ld\t; 0x%.8lx", 9138 (long) (((value & 0x80000000L) != 0) 9139 ? value | ~0xffffffffL : value), 9140 value); 9141 break; 9142 9143 case 64: 9144 func (stream, "#0x%.8lx%.8lx", hival, value); 9145 break; 9146 9147 default: 9148 abort (); 9149 } 9150 } 9151 break; 9152 9153 case 'F': 9154 { 9155 int regno = ((given >> 16) & 0xf) | ((given >> (7 - 4)) & 0x10); 9156 int num = (given >> 8) & 0x3; 9157 9158 if (!num) 9159 func (stream, "{d%d}", regno); 9160 else if (num + regno >= 32) 9161 func (stream, "{d%d-<overflow reg d%d}", regno, regno + num); 9162 else 9163 func (stream, "{d%d-d%d}", regno, regno + num); 9164 } 9165 break; 9166 9167 9168 case '0': case '1': case '2': case '3': case '4': 9169 case '5': case '6': case '7': case '8': case '9': 9170 { 9171 int width; 9172 unsigned long value; 9173 9174 c = arm_decode_bitfield (c, given, &value, &width); 9175 9176 switch (*c) 9177 { 9178 case 'r': 9179 func (stream, "%s", arm_regnames[value]); 9180 break; 9181 case 'd': 9182 func (stream, "%ld", value); 9183 value_in_comment = value; 9184 break; 9185 case 'e': 9186 func (stream, "%ld", (1ul << width) - value); 9187 break; 9188 9189 case 'S': 9190 case 'T': 9191 case 'U': 9192 /* Various width encodings. */ 9193 { 9194 int base = 8 << (*c - 'S'); /* 8,16 or 32 */ 9195 int limit; 9196 unsigned low, high; 9197 9198 c++; 9199 if (*c >= '0' && *c <= '9') 9200 limit = *c - '0'; 9201 else if (*c >= 'a' && *c <= 'f') 9202 limit = *c - 'a' + 10; 9203 else 9204 abort (); 9205 low = limit >> 2; 9206 high = limit & 3; 9207 9208 if (value < low || value > high) 9209 func (stream, "<illegal width %d>", base << value); 9210 else 9211 func (stream, "%d", base << value); 9212 } 9213 break; 9214 case 'R': 9215 if (given & (1 << 6)) 9216 goto Q; 9217 /* FALLTHROUGH */ 9218 case 'D': 9219 func (stream, "d%ld", value); 9220 break; 9221 case 'Q': 9222 Q: 9223 if (value & 1) 9224 func (stream, "<illegal reg q%ld.5>", value >> 1); 9225 else 9226 func (stream, "q%ld", value >> 1); 9227 break; 9228 9229 case '`': 9230 c++; 9231 if (value == 0) 9232 func (stream, "%c", *c); 9233 break; 9234 case '\'': 9235 c++; 9236 if (value == ((1ul << width) - 1)) 9237 func (stream, "%c", *c); 9238 break; 9239 case '?': 9240 func (stream, "%c", c[(1 << width) - (int) value]); 9241 c += 1 << width; 9242 break; 9243 default: 9244 abort (); 9245 } 9246 } 9247 break; 9248 9249 default: 9250 abort (); 9251 } 9252 } 9253 else 9254 func (stream, "%c", *c); 9255 } 9256 9257 if (value_in_comment > 32 || value_in_comment < -16) 9258 func (stream, "\t; 0x%lx", value_in_comment); 9259 9260 if (is_unpredictable) 9261 func (stream, UNPREDICTABLE_INSTRUCTION); 9262 9263 return TRUE; 9264 } 9265 } 9266 return FALSE; 9267 } 9268 9269 /* Print one mve instruction on INFO->STREAM. 9270 Return TRUE if the instuction matched, FALSE if this is not a 9271 recognised mve instruction. */ 9272 9273 static bfd_boolean 9274 print_insn_mve (struct disassemble_info *info, long given) 9275 { 9276 const struct mopcode32 *insn; 9277 void *stream = info->stream; 9278 fprintf_ftype func = info->fprintf_func; 9279 9280 for (insn = mve_opcodes; insn->assembler; insn++) 9281 { 9282 if (((given & insn->mask) == insn->value) 9283 && !is_mve_encoding_conflict (given, insn->mve_op)) 9284 { 9285 signed long value_in_comment = 0; 9286 bfd_boolean is_unpredictable = FALSE; 9287 bfd_boolean is_undefined = FALSE; 9288 const char *c; 9289 enum mve_unpredictable unpredictable_cond = UNPRED_NONE; 9290 enum mve_undefined undefined_cond = UNDEF_NONE; 9291 9292 /* Most vector mve instruction are illegal in a it block. 9293 There are a few exceptions; check for them. */ 9294 if (ifthen_state && !is_mve_okay_in_it (insn->mve_op)) 9295 { 9296 is_unpredictable = TRUE; 9297 unpredictable_cond = UNPRED_IT_BLOCK; 9298 } 9299 else if (is_mve_unpredictable (given, insn->mve_op, 9300 &unpredictable_cond)) 9301 is_unpredictable = TRUE; 9302 9303 if (is_mve_undefined (given, insn->mve_op, &undefined_cond)) 9304 is_undefined = TRUE; 9305 9306 /* In "VORR Qd, Qm, Qn", if Qm==Qn, VORR is nothing but VMOV, 9307 i.e "VMOV Qd, Qm". */ 9308 if ((insn->mve_op == MVE_VORR_REG) 9309 && (arm_decode_field (given, 1, 3) 9310 == arm_decode_field (given, 17, 19))) 9311 continue; 9312 9313 for (c = insn->assembler; *c; c++) 9314 { 9315 if (*c == '%') 9316 { 9317 switch (*++c) 9318 { 9319 case '%': 9320 func (stream, "%%"); 9321 break; 9322 9323 case 'a': 9324 /* Don't print anything for '+' as it is implied. */ 9325 if (arm_decode_field (given, 23, 23) == 0) 9326 func (stream, "-"); 9327 break; 9328 9329 case 'c': 9330 if (ifthen_state) 9331 func (stream, "%s", arm_conditional[IFTHEN_COND]); 9332 break; 9333 9334 case 'd': 9335 print_mve_vld_str_addr (info, given, insn->mve_op); 9336 break; 9337 9338 case 'i': 9339 { 9340 long mve_mask = mve_extract_pred_mask (given); 9341 func (stream, "%s", mve_predicatenames[mve_mask]); 9342 } 9343 break; 9344 9345 case 'j': 9346 { 9347 unsigned int imm5 = 0; 9348 imm5 |= arm_decode_field (given, 6, 7); 9349 imm5 |= (arm_decode_field (given, 12, 14) << 2); 9350 func (stream, "#%u", (imm5 == 0) ? 32 : imm5); 9351 } 9352 break; 9353 9354 case 'k': 9355 func (stream, "#%u", 9356 (arm_decode_field (given, 7, 7) == 0) ? 64 : 48); 9357 break; 9358 9359 case 'n': 9360 print_vec_condition (info, given, insn->mve_op); 9361 break; 9362 9363 case 'o': 9364 if (arm_decode_field (given, 0, 0) == 1) 9365 { 9366 unsigned long size 9367 = arm_decode_field (given, 4, 4) 9368 | (arm_decode_field (given, 6, 6) << 1); 9369 9370 func (stream, ", uxtw #%lu", size); 9371 } 9372 break; 9373 9374 case 'm': 9375 print_mve_rounding_mode (info, given, insn->mve_op); 9376 break; 9377 9378 case 's': 9379 print_mve_vcvt_size (info, given, insn->mve_op); 9380 break; 9381 9382 case 'u': 9383 { 9384 unsigned long op1 = arm_decode_field (given, 21, 22); 9385 9386 if ((insn->mve_op == MVE_VMOV_VEC_LANE_TO_GP)) 9387 { 9388 /* Check for signed. */ 9389 if (arm_decode_field (given, 23, 23) == 0) 9390 { 9391 /* We don't print 's' for S32. */ 9392 if ((arm_decode_field (given, 5, 6) == 0) 9393 && ((op1 == 0) || (op1 == 1))) 9394 ; 9395 else 9396 func (stream, "s"); 9397 } 9398 else 9399 func (stream, "u"); 9400 } 9401 else 9402 { 9403 if (arm_decode_field (given, 28, 28) == 0) 9404 func (stream, "s"); 9405 else 9406 func (stream, "u"); 9407 } 9408 } 9409 break; 9410 9411 case 'v': 9412 print_instruction_predicate (info); 9413 break; 9414 9415 case 'w': 9416 if (arm_decode_field (given, 21, 21) == 1) 9417 func (stream, "!"); 9418 break; 9419 9420 case 'B': 9421 print_mve_register_blocks (info, given, insn->mve_op); 9422 break; 9423 9424 case 'E': 9425 /* SIMD encoded constant for mov, mvn, vorr, vbic. */ 9426 9427 print_simd_imm8 (info, given, 28, insn); 9428 break; 9429 9430 case 'N': 9431 print_mve_vmov_index (info, given); 9432 break; 9433 9434 case 'T': 9435 if (arm_decode_field (given, 12, 12) == 0) 9436 func (stream, "b"); 9437 else 9438 func (stream, "t"); 9439 break; 9440 9441 case 'X': 9442 if (arm_decode_field (given, 12, 12) == 1) 9443 func (stream, "x"); 9444 break; 9445 9446 case '0': case '1': case '2': case '3': case '4': 9447 case '5': case '6': case '7': case '8': case '9': 9448 { 9449 int width; 9450 unsigned long value; 9451 9452 c = arm_decode_bitfield (c, given, &value, &width); 9453 9454 switch (*c) 9455 { 9456 case 'Z': 9457 if (value == 13) 9458 is_unpredictable = TRUE; 9459 else if (value == 15) 9460 func (stream, "zr"); 9461 else 9462 func (stream, "%s", arm_regnames[value]); 9463 break; 9464 9465 case 'c': 9466 func (stream, "%s", arm_conditional[value]); 9467 break; 9468 9469 case 'C': 9470 value ^= 1; 9471 func (stream, "%s", arm_conditional[value]); 9472 break; 9473 9474 case 'S': 9475 if (value == 13 || value == 15) 9476 is_unpredictable = TRUE; 9477 else 9478 func (stream, "%s", arm_regnames[value]); 9479 break; 9480 9481 case 's': 9482 print_mve_size (info, 9483 value, 9484 insn->mve_op); 9485 break; 9486 case 'I': 9487 if (value == 1) 9488 func (stream, "i"); 9489 break; 9490 case 'A': 9491 if (value == 1) 9492 func (stream, "a"); 9493 break; 9494 case 'h': 9495 { 9496 unsigned int odd_reg = (value << 1) | 1; 9497 func (stream, "%s", arm_regnames[odd_reg]); 9498 } 9499 break; 9500 case 'i': 9501 { 9502 unsigned long imm 9503 = arm_decode_field (given, 0, 6); 9504 unsigned long mod_imm = imm; 9505 9506 switch (insn->mve_op) 9507 { 9508 case MVE_VLDRW_GATHER_T5: 9509 case MVE_VSTRW_SCATTER_T5: 9510 mod_imm = mod_imm << 2; 9511 break; 9512 case MVE_VSTRD_SCATTER_T6: 9513 case MVE_VLDRD_GATHER_T6: 9514 mod_imm = mod_imm << 3; 9515 break; 9516 9517 default: 9518 break; 9519 } 9520 9521 func (stream, "%lu", mod_imm); 9522 } 9523 break; 9524 case 'k': 9525 func (stream, "%lu", 64 - value); 9526 break; 9527 case 'l': 9528 { 9529 unsigned int even_reg = value << 1; 9530 func (stream, "%s", arm_regnames[even_reg]); 9531 } 9532 break; 9533 case 'u': 9534 switch (value) 9535 { 9536 case 0: 9537 func (stream, "1"); 9538 break; 9539 case 1: 9540 func (stream, "2"); 9541 break; 9542 case 2: 9543 func (stream, "4"); 9544 break; 9545 case 3: 9546 func (stream, "8"); 9547 break; 9548 default: 9549 break; 9550 } 9551 break; 9552 case 'o': 9553 print_mve_rotate (info, value, width); 9554 break; 9555 case 'r': 9556 func (stream, "%s", arm_regnames[value]); 9557 break; 9558 case 'd': 9559 if (insn->mve_op == MVE_VQSHL_T2 9560 || insn->mve_op == MVE_VQSHLU_T3 9561 || insn->mve_op == MVE_VRSHR 9562 || insn->mve_op == MVE_VRSHRN 9563 || insn->mve_op == MVE_VSHL_T1 9564 || insn->mve_op == MVE_VSHLL_T1 9565 || insn->mve_op == MVE_VSHR 9566 || insn->mve_op == MVE_VSHRN 9567 || insn->mve_op == MVE_VSLI 9568 || insn->mve_op == MVE_VSRI) 9569 print_mve_shift_n (info, given, insn->mve_op); 9570 else if (insn->mve_op == MVE_VSHLL_T2) 9571 { 9572 switch (value) 9573 { 9574 case 0x00: 9575 func (stream, "8"); 9576 break; 9577 case 0x01: 9578 func (stream, "16"); 9579 break; 9580 case 0x10: 9581 print_mve_undefined (info, UNDEF_SIZE_0); 9582 break; 9583 default: 9584 assert (0); 9585 break; 9586 } 9587 } 9588 else 9589 { 9590 if (insn->mve_op == MVE_VSHLC && value == 0) 9591 value = 32; 9592 func (stream, "%ld", value); 9593 value_in_comment = value; 9594 } 9595 break; 9596 case 'F': 9597 func (stream, "s%ld", value); 9598 break; 9599 case 'Q': 9600 if (value & 0x8) 9601 func (stream, "<illegal reg q%ld.5>", value); 9602 else 9603 func (stream, "q%ld", value); 9604 break; 9605 case 'x': 9606 func (stream, "0x%08lx", value); 9607 break; 9608 default: 9609 abort (); 9610 } 9611 break; 9612 default: 9613 abort (); 9614 } 9615 } 9616 } 9617 else 9618 func (stream, "%c", *c); 9619 } 9620 9621 if (value_in_comment > 32 || value_in_comment < -16) 9622 func (stream, "\t; 0x%lx", value_in_comment); 9623 9624 if (is_unpredictable) 9625 print_mve_unpredictable (info, unpredictable_cond); 9626 9627 if (is_undefined) 9628 print_mve_undefined (info, undefined_cond); 9629 9630 if ((vpt_block_state.in_vpt_block == FALSE) 9631 && !ifthen_state 9632 && (is_vpt_instruction (given) == TRUE)) 9633 mark_inside_vpt_block (given); 9634 else if (vpt_block_state.in_vpt_block == TRUE) 9635 update_vpt_block_state (); 9636 9637 return TRUE; 9638 } 9639 } 9640 return FALSE; 9641 } 9642 9643 9644 /* Return the name of a v7A special register. */ 9645 9646 static const char * 9647 banked_regname (unsigned reg) 9648 { 9649 switch (reg) 9650 { 9651 case 15: return "CPSR"; 9652 case 32: return "R8_usr"; 9653 case 33: return "R9_usr"; 9654 case 34: return "R10_usr"; 9655 case 35: return "R11_usr"; 9656 case 36: return "R12_usr"; 9657 case 37: return "SP_usr"; 9658 case 38: return "LR_usr"; 9659 case 40: return "R8_fiq"; 9660 case 41: return "R9_fiq"; 9661 case 42: return "R10_fiq"; 9662 case 43: return "R11_fiq"; 9663 case 44: return "R12_fiq"; 9664 case 45: return "SP_fiq"; 9665 case 46: return "LR_fiq"; 9666 case 48: return "LR_irq"; 9667 case 49: return "SP_irq"; 9668 case 50: return "LR_svc"; 9669 case 51: return "SP_svc"; 9670 case 52: return "LR_abt"; 9671 case 53: return "SP_abt"; 9672 case 54: return "LR_und"; 9673 case 55: return "SP_und"; 9674 case 60: return "LR_mon"; 9675 case 61: return "SP_mon"; 9676 case 62: return "ELR_hyp"; 9677 case 63: return "SP_hyp"; 9678 case 79: return "SPSR"; 9679 case 110: return "SPSR_fiq"; 9680 case 112: return "SPSR_irq"; 9681 case 114: return "SPSR_svc"; 9682 case 116: return "SPSR_abt"; 9683 case 118: return "SPSR_und"; 9684 case 124: return "SPSR_mon"; 9685 case 126: return "SPSR_hyp"; 9686 default: return NULL; 9687 } 9688 } 9689 9690 /* Return the name of the DMB/DSB option. */ 9691 static const char * 9692 data_barrier_option (unsigned option) 9693 { 9694 switch (option & 0xf) 9695 { 9696 case 0xf: return "sy"; 9697 case 0xe: return "st"; 9698 case 0xd: return "ld"; 9699 case 0xb: return "ish"; 9700 case 0xa: return "ishst"; 9701 case 0x9: return "ishld"; 9702 case 0x7: return "un"; 9703 case 0x6: return "unst"; 9704 case 0x5: return "nshld"; 9705 case 0x3: return "osh"; 9706 case 0x2: return "oshst"; 9707 case 0x1: return "oshld"; 9708 default: return NULL; 9709 } 9710 } 9711 9712 /* Print one ARM instruction from PC on INFO->STREAM. */ 9713 9714 static void 9715 print_insn_arm (bfd_vma pc, struct disassemble_info *info, long given) 9716 { 9717 const struct opcode32 *insn; 9718 void *stream = info->stream; 9719 fprintf_ftype func = info->fprintf_func; 9720 struct arm_private_data *private_data = info->private_data; 9721 9722 if (print_insn_coprocessor (pc, info, given, FALSE)) 9723 return; 9724 9725 if (print_insn_neon (info, given, FALSE)) 9726 return; 9727 9728 if (print_insn_generic_coprocessor (pc, info, given, FALSE)) 9729 return; 9730 9731 for (insn = arm_opcodes; insn->assembler; insn++) 9732 { 9733 if ((given & insn->mask) != insn->value) 9734 continue; 9735 9736 if (! ARM_CPU_HAS_FEATURE (insn->arch, private_data->features)) 9737 continue; 9738 9739 /* Special case: an instruction with all bits set in the condition field 9740 (0xFnnn_nnnn) is only matched if all those bits are set in insn->mask, 9741 or by the catchall at the end of the table. */ 9742 if ((given & 0xF0000000) != 0xF0000000 9743 || (insn->mask & 0xF0000000) == 0xF0000000 9744 || (insn->mask == 0 && insn->value == 0)) 9745 { 9746 unsigned long u_reg = 16; 9747 unsigned long U_reg = 16; 9748 bfd_boolean is_unpredictable = FALSE; 9749 signed long value_in_comment = 0; 9750 const char *c; 9751 9752 for (c = insn->assembler; *c; c++) 9753 { 9754 if (*c == '%') 9755 { 9756 bfd_boolean allow_unpredictable = FALSE; 9757 9758 switch (*++c) 9759 { 9760 case '%': 9761 func (stream, "%%"); 9762 break; 9763 9764 case 'a': 9765 value_in_comment = print_arm_address (pc, info, given); 9766 break; 9767 9768 case 'P': 9769 /* Set P address bit and use normal address 9770 printing routine. */ 9771 value_in_comment = print_arm_address (pc, info, given | (1 << P_BIT)); 9772 break; 9773 9774 case 'S': 9775 allow_unpredictable = TRUE; 9776 /* Fall through. */ 9777 case 's': 9778 if ((given & 0x004f0000) == 0x004f0000) 9779 { 9780 /* PC relative with immediate offset. */ 9781 bfd_vma offset = ((given & 0xf00) >> 4) | (given & 0xf); 9782 9783 if (PRE_BIT_SET) 9784 { 9785 /* Elide positive zero offset. */ 9786 if (offset || NEGATIVE_BIT_SET) 9787 func (stream, "[pc, #%s%d]\t; ", 9788 NEGATIVE_BIT_SET ? "-" : "", (int) offset); 9789 else 9790 func (stream, "[pc]\t; "); 9791 if (NEGATIVE_BIT_SET) 9792 offset = -offset; 9793 info->print_address_func (offset + pc + 8, info); 9794 } 9795 else 9796 { 9797 /* Always show the offset. */ 9798 func (stream, "[pc], #%s%d", 9799 NEGATIVE_BIT_SET ? "-" : "", (int) offset); 9800 if (! allow_unpredictable) 9801 is_unpredictable = TRUE; 9802 } 9803 } 9804 else 9805 { 9806 int offset = ((given & 0xf00) >> 4) | (given & 0xf); 9807 9808 func (stream, "[%s", 9809 arm_regnames[(given >> 16) & 0xf]); 9810 9811 if (PRE_BIT_SET) 9812 { 9813 if (IMMEDIATE_BIT_SET) 9814 { 9815 /* Elide offset for non-writeback 9816 positive zero. */ 9817 if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET 9818 || offset) 9819 func (stream, ", #%s%d", 9820 NEGATIVE_BIT_SET ? "-" : "", offset); 9821 9822 if (NEGATIVE_BIT_SET) 9823 offset = -offset; 9824 9825 value_in_comment = offset; 9826 } 9827 else 9828 { 9829 /* Register Offset or Register Pre-Indexed. */ 9830 func (stream, ", %s%s", 9831 NEGATIVE_BIT_SET ? "-" : "", 9832 arm_regnames[given & 0xf]); 9833 9834 /* Writing back to the register that is the source/ 9835 destination of the load/store is unpredictable. */ 9836 if (! allow_unpredictable 9837 && WRITEBACK_BIT_SET 9838 && ((given & 0xf) == ((given >> 12) & 0xf))) 9839 is_unpredictable = TRUE; 9840 } 9841 9842 func (stream, "]%s", 9843 WRITEBACK_BIT_SET ? "!" : ""); 9844 } 9845 else 9846 { 9847 if (IMMEDIATE_BIT_SET) 9848 { 9849 /* Immediate Post-indexed. */ 9850 /* PR 10924: Offset must be printed, even if it is zero. */ 9851 func (stream, "], #%s%d", 9852 NEGATIVE_BIT_SET ? "-" : "", offset); 9853 if (NEGATIVE_BIT_SET) 9854 offset = -offset; 9855 value_in_comment = offset; 9856 } 9857 else 9858 { 9859 /* Register Post-indexed. */ 9860 func (stream, "], %s%s", 9861 NEGATIVE_BIT_SET ? "-" : "", 9862 arm_regnames[given & 0xf]); 9863 9864 /* Writing back to the register that is the source/ 9865 destination of the load/store is unpredictable. */ 9866 if (! allow_unpredictable 9867 && (given & 0xf) == ((given >> 12) & 0xf)) 9868 is_unpredictable = TRUE; 9869 } 9870 9871 if (! allow_unpredictable) 9872 { 9873 /* Writeback is automatically implied by post- addressing. 9874 Setting the W bit is unnecessary and ARM specify it as 9875 being unpredictable. */ 9876 if (WRITEBACK_BIT_SET 9877 /* Specifying the PC register as the post-indexed 9878 registers is also unpredictable. */ 9879 || (! IMMEDIATE_BIT_SET && ((given & 0xf) == 0xf))) 9880 is_unpredictable = TRUE; 9881 } 9882 } 9883 } 9884 break; 9885 9886 case 'b': 9887 { 9888 bfd_vma disp = (((given & 0xffffff) ^ 0x800000) - 0x800000); 9889 bfd_vma target = disp * 4 + pc + 8; 9890 info->print_address_func (target, info); 9891 9892 /* Fill in instruction information. */ 9893 info->insn_info_valid = 1; 9894 info->insn_type = dis_branch; 9895 info->target = target; 9896 } 9897 break; 9898 9899 case 'c': 9900 if (((given >> 28) & 0xf) != 0xe) 9901 func (stream, "%s", 9902 arm_conditional [(given >> 28) & 0xf]); 9903 break; 9904 9905 case 'm': 9906 { 9907 int started = 0; 9908 int reg; 9909 9910 func (stream, "{"); 9911 for (reg = 0; reg < 16; reg++) 9912 if ((given & (1 << reg)) != 0) 9913 { 9914 if (started) 9915 func (stream, ", "); 9916 started = 1; 9917 func (stream, "%s", arm_regnames[reg]); 9918 } 9919 func (stream, "}"); 9920 if (! started) 9921 is_unpredictable = TRUE; 9922 } 9923 break; 9924 9925 case 'q': 9926 arm_decode_shift (given, func, stream, FALSE); 9927 break; 9928 9929 case 'o': 9930 if ((given & 0x02000000) != 0) 9931 { 9932 unsigned int rotate = (given & 0xf00) >> 7; 9933 unsigned int immed = (given & 0xff); 9934 unsigned int a, i; 9935 9936 a = (immed << ((32 - rotate) & 31) 9937 | immed >> rotate) & 0xffffffff; 9938 /* If there is another encoding with smaller rotate, 9939 the rotate should be specified directly. */ 9940 for (i = 0; i < 32; i += 2) 9941 if ((a << i | a >> ((32 - i) & 31)) <= 0xff) 9942 break; 9943 9944 if (i != rotate) 9945 func (stream, "#%d, %d", immed, rotate); 9946 else 9947 func (stream, "#%d", a); 9948 value_in_comment = a; 9949 } 9950 else 9951 arm_decode_shift (given, func, stream, TRUE); 9952 break; 9953 9954 case 'p': 9955 if ((given & 0x0000f000) == 0x0000f000) 9956 { 9957 arm_feature_set arm_ext_v6 = 9958 ARM_FEATURE_CORE_LOW (ARM_EXT_V6); 9959 9960 /* The p-variants of tst/cmp/cmn/teq are the pre-V6 9961 mechanism for setting PSR flag bits. They are 9962 obsolete in V6 onwards. */ 9963 if (! ARM_CPU_HAS_FEATURE (private_data->features, \ 9964 arm_ext_v6)) 9965 func (stream, "p"); 9966 else 9967 is_unpredictable = TRUE; 9968 } 9969 break; 9970 9971 case 't': 9972 if ((given & 0x01200000) == 0x00200000) 9973 func (stream, "t"); 9974 break; 9975 9976 case 'A': 9977 { 9978 int offset = given & 0xff; 9979 9980 value_in_comment = offset * 4; 9981 if (NEGATIVE_BIT_SET) 9982 value_in_comment = - value_in_comment; 9983 9984 func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]); 9985 9986 if (PRE_BIT_SET) 9987 { 9988 if (offset) 9989 func (stream, ", #%d]%s", 9990 (int) value_in_comment, 9991 WRITEBACK_BIT_SET ? "!" : ""); 9992 else 9993 func (stream, "]"); 9994 } 9995 else 9996 { 9997 func (stream, "]"); 9998 9999 if (WRITEBACK_BIT_SET) 10000 { 10001 if (offset) 10002 func (stream, ", #%d", (int) value_in_comment); 10003 } 10004 else 10005 { 10006 func (stream, ", {%d}", (int) offset); 10007 value_in_comment = offset; 10008 } 10009 } 10010 } 10011 break; 10012 10013 case 'B': 10014 /* Print ARM V5 BLX(1) address: pc+25 bits. */ 10015 { 10016 bfd_vma address; 10017 bfd_vma offset = 0; 10018 10019 if (! NEGATIVE_BIT_SET) 10020 /* Is signed, hi bits should be ones. */ 10021 offset = (-1) ^ 0x00ffffff; 10022 10023 /* Offset is (SignExtend(offset field)<<2). */ 10024 offset += given & 0x00ffffff; 10025 offset <<= 2; 10026 address = offset + pc + 8; 10027 10028 if (given & 0x01000000) 10029 /* H bit allows addressing to 2-byte boundaries. */ 10030 address += 2; 10031 10032 info->print_address_func (address, info); 10033 10034 /* Fill in instruction information. */ 10035 info->insn_info_valid = 1; 10036 info->insn_type = dis_branch; 10037 info->target = address; 10038 } 10039 break; 10040 10041 case 'C': 10042 if ((given & 0x02000200) == 0x200) 10043 { 10044 const char * name; 10045 unsigned sysm = (given & 0x004f0000) >> 16; 10046 10047 sysm |= (given & 0x300) >> 4; 10048 name = banked_regname (sysm); 10049 10050 if (name != NULL) 10051 func (stream, "%s", name); 10052 else 10053 func (stream, "(UNDEF: %lu)", (unsigned long) sysm); 10054 } 10055 else 10056 { 10057 func (stream, "%cPSR_", 10058 (given & 0x00400000) ? 'S' : 'C'); 10059 if (given & 0x80000) 10060 func (stream, "f"); 10061 if (given & 0x40000) 10062 func (stream, "s"); 10063 if (given & 0x20000) 10064 func (stream, "x"); 10065 if (given & 0x10000) 10066 func (stream, "c"); 10067 } 10068 break; 10069 10070 case 'U': 10071 if ((given & 0xf0) == 0x60) 10072 { 10073 switch (given & 0xf) 10074 { 10075 case 0xf: func (stream, "sy"); break; 10076 default: 10077 func (stream, "#%d", (int) given & 0xf); 10078 break; 10079 } 10080 } 10081 else 10082 { 10083 const char * opt = data_barrier_option (given & 0xf); 10084 if (opt != NULL) 10085 func (stream, "%s", opt); 10086 else 10087 func (stream, "#%d", (int) given & 0xf); 10088 } 10089 break; 10090 10091 case '0': case '1': case '2': case '3': case '4': 10092 case '5': case '6': case '7': case '8': case '9': 10093 { 10094 int width; 10095 unsigned long value; 10096 10097 c = arm_decode_bitfield (c, given, &value, &width); 10098 10099 switch (*c) 10100 { 10101 case 'R': 10102 if (value == 15) 10103 is_unpredictable = TRUE; 10104 /* Fall through. */ 10105 case 'r': 10106 case 'T': 10107 /* We want register + 1 when decoding T. */ 10108 if (*c == 'T') 10109 ++value; 10110 10111 if (c[1] == 'u') 10112 { 10113 /* Eat the 'u' character. */ 10114 ++ c; 10115 10116 if (u_reg == value) 10117 is_unpredictable = TRUE; 10118 u_reg = value; 10119 } 10120 if (c[1] == 'U') 10121 { 10122 /* Eat the 'U' character. */ 10123 ++ c; 10124 10125 if (U_reg == value) 10126 is_unpredictable = TRUE; 10127 U_reg = value; 10128 } 10129 func (stream, "%s", arm_regnames[value]); 10130 break; 10131 case 'd': 10132 func (stream, "%ld", value); 10133 value_in_comment = value; 10134 break; 10135 case 'b': 10136 func (stream, "%ld", value * 8); 10137 value_in_comment = value * 8; 10138 break; 10139 case 'W': 10140 func (stream, "%ld", value + 1); 10141 value_in_comment = value + 1; 10142 break; 10143 case 'x': 10144 func (stream, "0x%08lx", value); 10145 10146 /* Some SWI instructions have special 10147 meanings. */ 10148 if ((given & 0x0fffffff) == 0x0FF00000) 10149 func (stream, "\t; IMB"); 10150 else if ((given & 0x0fffffff) == 0x0FF00001) 10151 func (stream, "\t; IMBRange"); 10152 break; 10153 case 'X': 10154 func (stream, "%01lx", value & 0xf); 10155 value_in_comment = value; 10156 break; 10157 case '`': 10158 c++; 10159 if (value == 0) 10160 func (stream, "%c", *c); 10161 break; 10162 case '\'': 10163 c++; 10164 if (value == ((1ul << width) - 1)) 10165 func (stream, "%c", *c); 10166 break; 10167 case '?': 10168 func (stream, "%c", c[(1 << width) - (int) value]); 10169 c += 1 << width; 10170 break; 10171 default: 10172 abort (); 10173 } 10174 } 10175 break; 10176 10177 case 'e': 10178 { 10179 int imm; 10180 10181 imm = (given & 0xf) | ((given & 0xfff00) >> 4); 10182 func (stream, "%d", imm); 10183 value_in_comment = imm; 10184 } 10185 break; 10186 10187 case 'E': 10188 /* LSB and WIDTH fields of BFI or BFC. The machine- 10189 language instruction encodes LSB and MSB. */ 10190 { 10191 long msb = (given & 0x001f0000) >> 16; 10192 long lsb = (given & 0x00000f80) >> 7; 10193 long w = msb - lsb + 1; 10194 10195 if (w > 0) 10196 func (stream, "#%lu, #%lu", lsb, w); 10197 else 10198 func (stream, "(invalid: %lu:%lu)", lsb, msb); 10199 } 10200 break; 10201 10202 case 'R': 10203 /* Get the PSR/banked register name. */ 10204 { 10205 const char * name; 10206 unsigned sysm = (given & 0x004f0000) >> 16; 10207 10208 sysm |= (given & 0x300) >> 4; 10209 name = banked_regname (sysm); 10210 10211 if (name != NULL) 10212 func (stream, "%s", name); 10213 else 10214 func (stream, "(UNDEF: %lu)", (unsigned long) sysm); 10215 } 10216 break; 10217 10218 case 'V': 10219 /* 16-bit unsigned immediate from a MOVT or MOVW 10220 instruction, encoded in bits 0:11 and 15:19. */ 10221 { 10222 long hi = (given & 0x000f0000) >> 4; 10223 long lo = (given & 0x00000fff); 10224 long imm16 = hi | lo; 10225 10226 func (stream, "#%lu", imm16); 10227 value_in_comment = imm16; 10228 } 10229 break; 10230 10231 default: 10232 abort (); 10233 } 10234 } 10235 else 10236 func (stream, "%c", *c); 10237 } 10238 10239 if (value_in_comment > 32 || value_in_comment < -16) 10240 func (stream, "\t; 0x%lx", (value_in_comment & 0xffffffffUL)); 10241 10242 if (is_unpredictable) 10243 func (stream, UNPREDICTABLE_INSTRUCTION); 10244 10245 return; 10246 } 10247 } 10248 func (stream, UNKNOWN_INSTRUCTION_32BIT, (unsigned)given); 10249 return; 10250 } 10251 10252 /* Print one 16-bit Thumb instruction from PC on INFO->STREAM. */ 10253 10254 static void 10255 print_insn_thumb16 (bfd_vma pc, struct disassemble_info *info, long given) 10256 { 10257 const struct opcode16 *insn; 10258 void *stream = info->stream; 10259 fprintf_ftype func = info->fprintf_func; 10260 10261 for (insn = thumb_opcodes; insn->assembler; insn++) 10262 if ((given & insn->mask) == insn->value) 10263 { 10264 signed long value_in_comment = 0; 10265 const char *c = insn->assembler; 10266 10267 for (; *c; c++) 10268 { 10269 int domaskpc = 0; 10270 int domasklr = 0; 10271 10272 if (*c != '%') 10273 { 10274 func (stream, "%c", *c); 10275 continue; 10276 } 10277 10278 switch (*++c) 10279 { 10280 case '%': 10281 func (stream, "%%"); 10282 break; 10283 10284 case 'c': 10285 if (ifthen_state) 10286 func (stream, "%s", arm_conditional[IFTHEN_COND]); 10287 break; 10288 10289 case 'C': 10290 if (ifthen_state) 10291 func (stream, "%s", arm_conditional[IFTHEN_COND]); 10292 else 10293 func (stream, "s"); 10294 break; 10295 10296 case 'I': 10297 { 10298 unsigned int tmp; 10299 10300 ifthen_next_state = given & 0xff; 10301 for (tmp = given << 1; tmp & 0xf; tmp <<= 1) 10302 func (stream, ((given ^ tmp) & 0x10) ? "e" : "t"); 10303 func (stream, "\t%s", arm_conditional[(given >> 4) & 0xf]); 10304 } 10305 break; 10306 10307 case 'x': 10308 if (ifthen_next_state) 10309 func (stream, "\t; unpredictable branch in IT block\n"); 10310 break; 10311 10312 case 'X': 10313 if (ifthen_state) 10314 func (stream, "\t; unpredictable <IT:%s>", 10315 arm_conditional[IFTHEN_COND]); 10316 break; 10317 10318 case 'S': 10319 { 10320 long reg; 10321 10322 reg = (given >> 3) & 0x7; 10323 if (given & (1 << 6)) 10324 reg += 8; 10325 10326 func (stream, "%s", arm_regnames[reg]); 10327 } 10328 break; 10329 10330 case 'D': 10331 { 10332 long reg; 10333 10334 reg = given & 0x7; 10335 if (given & (1 << 7)) 10336 reg += 8; 10337 10338 func (stream, "%s", arm_regnames[reg]); 10339 } 10340 break; 10341 10342 case 'N': 10343 if (given & (1 << 8)) 10344 domasklr = 1; 10345 /* Fall through. */ 10346 case 'O': 10347 if (*c == 'O' && (given & (1 << 8))) 10348 domaskpc = 1; 10349 /* Fall through. */ 10350 case 'M': 10351 { 10352 int started = 0; 10353 int reg; 10354 10355 func (stream, "{"); 10356 10357 /* It would be nice if we could spot 10358 ranges, and generate the rS-rE format: */ 10359 for (reg = 0; (reg < 8); reg++) 10360 if ((given & (1 << reg)) != 0) 10361 { 10362 if (started) 10363 func (stream, ", "); 10364 started = 1; 10365 func (stream, "%s", arm_regnames[reg]); 10366 } 10367 10368 if (domasklr) 10369 { 10370 if (started) 10371 func (stream, ", "); 10372 started = 1; 10373 func (stream, "%s", arm_regnames[14] /* "lr" */); 10374 } 10375 10376 if (domaskpc) 10377 { 10378 if (started) 10379 func (stream, ", "); 10380 func (stream, "%s", arm_regnames[15] /* "pc" */); 10381 } 10382 10383 func (stream, "}"); 10384 } 10385 break; 10386 10387 case 'W': 10388 /* Print writeback indicator for a LDMIA. We are doing a 10389 writeback if the base register is not in the register 10390 mask. */ 10391 if ((given & (1 << ((given & 0x0700) >> 8))) == 0) 10392 func (stream, "!"); 10393 break; 10394 10395 case 'b': 10396 /* Print ARM V6T2 CZB address: pc+4+6 bits. */ 10397 { 10398 bfd_vma address = (pc + 4 10399 + ((given & 0x00f8) >> 2) 10400 + ((given & 0x0200) >> 3)); 10401 info->print_address_func (address, info); 10402 10403 /* Fill in instruction information. */ 10404 info->insn_info_valid = 1; 10405 info->insn_type = dis_branch; 10406 info->target = address; 10407 } 10408 break; 10409 10410 case 's': 10411 /* Right shift immediate -- bits 6..10; 1-31 print 10412 as themselves, 0 prints as 32. */ 10413 { 10414 long imm = (given & 0x07c0) >> 6; 10415 if (imm == 0) 10416 imm = 32; 10417 func (stream, "#%ld", imm); 10418 } 10419 break; 10420 10421 case '0': case '1': case '2': case '3': case '4': 10422 case '5': case '6': case '7': case '8': case '9': 10423 { 10424 int bitstart = *c++ - '0'; 10425 int bitend = 0; 10426 10427 while (*c >= '0' && *c <= '9') 10428 bitstart = (bitstart * 10) + *c++ - '0'; 10429 10430 switch (*c) 10431 { 10432 case '-': 10433 { 10434 bfd_vma reg; 10435 10436 c++; 10437 while (*c >= '0' && *c <= '9') 10438 bitend = (bitend * 10) + *c++ - '0'; 10439 if (!bitend) 10440 abort (); 10441 reg = given >> bitstart; 10442 reg &= (2 << (bitend - bitstart)) - 1; 10443 10444 switch (*c) 10445 { 10446 case 'r': 10447 func (stream, "%s", arm_regnames[reg]); 10448 break; 10449 10450 case 'd': 10451 func (stream, "%ld", (long) reg); 10452 value_in_comment = reg; 10453 break; 10454 10455 case 'H': 10456 func (stream, "%ld", (long) (reg << 1)); 10457 value_in_comment = reg << 1; 10458 break; 10459 10460 case 'W': 10461 func (stream, "%ld", (long) (reg << 2)); 10462 value_in_comment = reg << 2; 10463 break; 10464 10465 case 'a': 10466 /* PC-relative address -- the bottom two 10467 bits of the address are dropped 10468 before the calculation. */ 10469 info->print_address_func 10470 (((pc + 4) & ~3) + (reg << 2), info); 10471 value_in_comment = 0; 10472 break; 10473 10474 case 'x': 10475 func (stream, "0x%04lx", (long) reg); 10476 break; 10477 10478 case 'B': 10479 reg = ((reg ^ (1 << bitend)) - (1 << bitend)); 10480 bfd_vma target = reg * 2 + pc + 4; 10481 info->print_address_func (target, info); 10482 value_in_comment = 0; 10483 10484 /* Fill in instruction information. */ 10485 info->insn_info_valid = 1; 10486 info->insn_type = dis_branch; 10487 info->target = target; 10488 break; 10489 10490 case 'c': 10491 func (stream, "%s", arm_conditional [reg]); 10492 break; 10493 10494 default: 10495 abort (); 10496 } 10497 } 10498 break; 10499 10500 case '\'': 10501 c++; 10502 if ((given & (1 << bitstart)) != 0) 10503 func (stream, "%c", *c); 10504 break; 10505 10506 case '?': 10507 ++c; 10508 if ((given & (1 << bitstart)) != 0) 10509 func (stream, "%c", *c++); 10510 else 10511 func (stream, "%c", *++c); 10512 break; 10513 10514 default: 10515 abort (); 10516 } 10517 } 10518 break; 10519 10520 default: 10521 abort (); 10522 } 10523 } 10524 10525 if (value_in_comment > 32 || value_in_comment < -16) 10526 func (stream, "\t; 0x%lx", value_in_comment); 10527 return; 10528 } 10529 10530 /* No match. */ 10531 func (stream, UNKNOWN_INSTRUCTION_16BIT, (unsigned)given); 10532 return; 10533 } 10534 10535 /* Return the name of an V7M special register. */ 10536 10537 static const char * 10538 psr_name (int regno) 10539 { 10540 switch (regno) 10541 { 10542 case 0x0: return "APSR"; 10543 case 0x1: return "IAPSR"; 10544 case 0x2: return "EAPSR"; 10545 case 0x3: return "PSR"; 10546 case 0x5: return "IPSR"; 10547 case 0x6: return "EPSR"; 10548 case 0x7: return "IEPSR"; 10549 case 0x8: return "MSP"; 10550 case 0x9: return "PSP"; 10551 case 0xa: return "MSPLIM"; 10552 case 0xb: return "PSPLIM"; 10553 case 0x10: return "PRIMASK"; 10554 case 0x11: return "BASEPRI"; 10555 case 0x12: return "BASEPRI_MAX"; 10556 case 0x13: return "FAULTMASK"; 10557 case 0x14: return "CONTROL"; 10558 case 0x88: return "MSP_NS"; 10559 case 0x89: return "PSP_NS"; 10560 case 0x8a: return "MSPLIM_NS"; 10561 case 0x8b: return "PSPLIM_NS"; 10562 case 0x90: return "PRIMASK_NS"; 10563 case 0x91: return "BASEPRI_NS"; 10564 case 0x93: return "FAULTMASK_NS"; 10565 case 0x94: return "CONTROL_NS"; 10566 case 0x98: return "SP_NS"; 10567 default: return "<unknown>"; 10568 } 10569 } 10570 10571 /* Print one 32-bit Thumb instruction from PC on INFO->STREAM. */ 10572 10573 static void 10574 print_insn_thumb32 (bfd_vma pc, struct disassemble_info *info, long given) 10575 { 10576 const struct opcode32 *insn; 10577 void *stream = info->stream; 10578 fprintf_ftype func = info->fprintf_func; 10579 bfd_boolean is_mve = is_mve_architecture (info); 10580 10581 if (print_insn_coprocessor (pc, info, given, TRUE)) 10582 return; 10583 10584 if ((is_mve == FALSE) && print_insn_neon (info, given, TRUE)) 10585 return; 10586 10587 if (is_mve && print_insn_mve (info, given)) 10588 return; 10589 10590 if (print_insn_generic_coprocessor (pc, info, given, TRUE)) 10591 return; 10592 10593 for (insn = thumb32_opcodes; insn->assembler; insn++) 10594 if ((given & insn->mask) == insn->value) 10595 { 10596 bfd_boolean is_clrm = FALSE; 10597 bfd_boolean is_unpredictable = FALSE; 10598 signed long value_in_comment = 0; 10599 const char *c = insn->assembler; 10600 10601 for (; *c; c++) 10602 { 10603 if (*c != '%') 10604 { 10605 func (stream, "%c", *c); 10606 continue; 10607 } 10608 10609 switch (*++c) 10610 { 10611 case '%': 10612 func (stream, "%%"); 10613 break; 10614 10615 case 'c': 10616 if (ifthen_state) 10617 func (stream, "%s", arm_conditional[IFTHEN_COND]); 10618 break; 10619 10620 case 'x': 10621 if (ifthen_next_state) 10622 func (stream, "\t; unpredictable branch in IT block\n"); 10623 break; 10624 10625 case 'X': 10626 if (ifthen_state) 10627 func (stream, "\t; unpredictable <IT:%s>", 10628 arm_conditional[IFTHEN_COND]); 10629 break; 10630 10631 case 'I': 10632 { 10633 unsigned int imm12 = 0; 10634 10635 imm12 |= (given & 0x000000ffu); 10636 imm12 |= (given & 0x00007000u) >> 4; 10637 imm12 |= (given & 0x04000000u) >> 15; 10638 func (stream, "#%u", imm12); 10639 value_in_comment = imm12; 10640 } 10641 break; 10642 10643 case 'M': 10644 { 10645 unsigned int bits = 0, imm, imm8, mod; 10646 10647 bits |= (given & 0x000000ffu); 10648 bits |= (given & 0x00007000u) >> 4; 10649 bits |= (given & 0x04000000u) >> 15; 10650 imm8 = (bits & 0x0ff); 10651 mod = (bits & 0xf00) >> 8; 10652 switch (mod) 10653 { 10654 case 0: imm = imm8; break; 10655 case 1: imm = ((imm8 << 16) | imm8); break; 10656 case 2: imm = ((imm8 << 24) | (imm8 << 8)); break; 10657 case 3: imm = ((imm8 << 24) | (imm8 << 16) | (imm8 << 8) | imm8); break; 10658 default: 10659 mod = (bits & 0xf80) >> 7; 10660 imm8 = (bits & 0x07f) | 0x80; 10661 imm = (((imm8 << (32 - mod)) | (imm8 >> mod)) & 0xffffffff); 10662 } 10663 func (stream, "#%u", imm); 10664 value_in_comment = imm; 10665 } 10666 break; 10667 10668 case 'J': 10669 { 10670 unsigned int imm = 0; 10671 10672 imm |= (given & 0x000000ffu); 10673 imm |= (given & 0x00007000u) >> 4; 10674 imm |= (given & 0x04000000u) >> 15; 10675 imm |= (given & 0x000f0000u) >> 4; 10676 func (stream, "#%u", imm); 10677 value_in_comment = imm; 10678 } 10679 break; 10680 10681 case 'K': 10682 { 10683 unsigned int imm = 0; 10684 10685 imm |= (given & 0x000f0000u) >> 16; 10686 imm |= (given & 0x00000ff0u) >> 0; 10687 imm |= (given & 0x0000000fu) << 12; 10688 func (stream, "#%u", imm); 10689 value_in_comment = imm; 10690 } 10691 break; 10692 10693 case 'H': 10694 { 10695 unsigned int imm = 0; 10696 10697 imm |= (given & 0x000f0000u) >> 4; 10698 imm |= (given & 0x00000fffu) >> 0; 10699 func (stream, "#%u", imm); 10700 value_in_comment = imm; 10701 } 10702 break; 10703 10704 case 'V': 10705 { 10706 unsigned int imm = 0; 10707 10708 imm |= (given & 0x00000fffu); 10709 imm |= (given & 0x000f0000u) >> 4; 10710 func (stream, "#%u", imm); 10711 value_in_comment = imm; 10712 } 10713 break; 10714 10715 case 'S': 10716 { 10717 unsigned int reg = (given & 0x0000000fu); 10718 unsigned int stp = (given & 0x00000030u) >> 4; 10719 unsigned int imm = 0; 10720 imm |= (given & 0x000000c0u) >> 6; 10721 imm |= (given & 0x00007000u) >> 10; 10722 10723 func (stream, "%s", arm_regnames[reg]); 10724 switch (stp) 10725 { 10726 case 0: 10727 if (imm > 0) 10728 func (stream, ", lsl #%u", imm); 10729 break; 10730 10731 case 1: 10732 if (imm == 0) 10733 imm = 32; 10734 func (stream, ", lsr #%u", imm); 10735 break; 10736 10737 case 2: 10738 if (imm == 0) 10739 imm = 32; 10740 func (stream, ", asr #%u", imm); 10741 break; 10742 10743 case 3: 10744 if (imm == 0) 10745 func (stream, ", rrx"); 10746 else 10747 func (stream, ", ror #%u", imm); 10748 } 10749 } 10750 break; 10751 10752 case 'a': 10753 { 10754 unsigned int Rn = (given & 0x000f0000) >> 16; 10755 unsigned int U = ! NEGATIVE_BIT_SET; 10756 unsigned int op = (given & 0x00000f00) >> 8; 10757 unsigned int i12 = (given & 0x00000fff); 10758 unsigned int i8 = (given & 0x000000ff); 10759 bfd_boolean writeback = FALSE, postind = FALSE; 10760 bfd_vma offset = 0; 10761 10762 func (stream, "[%s", arm_regnames[Rn]); 10763 if (U) /* 12-bit positive immediate offset. */ 10764 { 10765 offset = i12; 10766 if (Rn != 15) 10767 value_in_comment = offset; 10768 } 10769 else if (Rn == 15) /* 12-bit negative immediate offset. */ 10770 offset = - (int) i12; 10771 else if (op == 0x0) /* Shifted register offset. */ 10772 { 10773 unsigned int Rm = (i8 & 0x0f); 10774 unsigned int sh = (i8 & 0x30) >> 4; 10775 10776 func (stream, ", %s", arm_regnames[Rm]); 10777 if (sh) 10778 func (stream, ", lsl #%u", sh); 10779 func (stream, "]"); 10780 break; 10781 } 10782 else switch (op) 10783 { 10784 case 0xE: /* 8-bit positive immediate offset. */ 10785 offset = i8; 10786 break; 10787 10788 case 0xC: /* 8-bit negative immediate offset. */ 10789 offset = -i8; 10790 break; 10791 10792 case 0xF: /* 8-bit + preindex with wb. */ 10793 offset = i8; 10794 writeback = TRUE; 10795 break; 10796 10797 case 0xD: /* 8-bit - preindex with wb. */ 10798 offset = -i8; 10799 writeback = TRUE; 10800 break; 10801 10802 case 0xB: /* 8-bit + postindex. */ 10803 offset = i8; 10804 postind = TRUE; 10805 break; 10806 10807 case 0x9: /* 8-bit - postindex. */ 10808 offset = -i8; 10809 postind = TRUE; 10810 break; 10811 10812 default: 10813 func (stream, ", <undefined>]"); 10814 goto skip; 10815 } 10816 10817 if (postind) 10818 func (stream, "], #%d", (int) offset); 10819 else 10820 { 10821 if (offset) 10822 func (stream, ", #%d", (int) offset); 10823 func (stream, writeback ? "]!" : "]"); 10824 } 10825 10826 if (Rn == 15) 10827 { 10828 func (stream, "\t; "); 10829 info->print_address_func (((pc + 4) & ~3) + offset, info); 10830 } 10831 } 10832 skip: 10833 break; 10834 10835 case 'A': 10836 { 10837 unsigned int U = ! NEGATIVE_BIT_SET; 10838 unsigned int W = WRITEBACK_BIT_SET; 10839 unsigned int Rn = (given & 0x000f0000) >> 16; 10840 unsigned int off = (given & 0x000000ff); 10841 10842 func (stream, "[%s", arm_regnames[Rn]); 10843 10844 if (PRE_BIT_SET) 10845 { 10846 if (off || !U) 10847 { 10848 func (stream, ", #%c%u", U ? '+' : '-', off * 4); 10849 value_in_comment = off * 4 * (U ? 1 : -1); 10850 } 10851 func (stream, "]"); 10852 if (W) 10853 func (stream, "!"); 10854 } 10855 else 10856 { 10857 func (stream, "], "); 10858 if (W) 10859 { 10860 func (stream, "#%c%u", U ? '+' : '-', off * 4); 10861 value_in_comment = off * 4 * (U ? 1 : -1); 10862 } 10863 else 10864 { 10865 func (stream, "{%u}", off); 10866 value_in_comment = off; 10867 } 10868 } 10869 } 10870 break; 10871 10872 case 'w': 10873 { 10874 unsigned int Sbit = (given & 0x01000000) >> 24; 10875 unsigned int type = (given & 0x00600000) >> 21; 10876 10877 switch (type) 10878 { 10879 case 0: func (stream, Sbit ? "sb" : "b"); break; 10880 case 1: func (stream, Sbit ? "sh" : "h"); break; 10881 case 2: 10882 if (Sbit) 10883 func (stream, "??"); 10884 break; 10885 case 3: 10886 func (stream, "??"); 10887 break; 10888 } 10889 } 10890 break; 10891 10892 case 'n': 10893 is_clrm = TRUE; 10894 /* Fall through. */ 10895 case 'm': 10896 { 10897 int started = 0; 10898 int reg; 10899 10900 func (stream, "{"); 10901 for (reg = 0; reg < 16; reg++) 10902 if ((given & (1 << reg)) != 0) 10903 { 10904 if (started) 10905 func (stream, ", "); 10906 started = 1; 10907 if (is_clrm && reg == 13) 10908 func (stream, "(invalid: %s)", arm_regnames[reg]); 10909 else if (is_clrm && reg == 15) 10910 func (stream, "%s", "APSR"); 10911 else 10912 func (stream, "%s", arm_regnames[reg]); 10913 } 10914 func (stream, "}"); 10915 } 10916 break; 10917 10918 case 'E': 10919 { 10920 unsigned int msb = (given & 0x0000001f); 10921 unsigned int lsb = 0; 10922 10923 lsb |= (given & 0x000000c0u) >> 6; 10924 lsb |= (given & 0x00007000u) >> 10; 10925 func (stream, "#%u, #%u", lsb, msb - lsb + 1); 10926 } 10927 break; 10928 10929 case 'F': 10930 { 10931 unsigned int width = (given & 0x0000001f) + 1; 10932 unsigned int lsb = 0; 10933 10934 lsb |= (given & 0x000000c0u) >> 6; 10935 lsb |= (given & 0x00007000u) >> 10; 10936 func (stream, "#%u, #%u", lsb, width); 10937 } 10938 break; 10939 10940 case 'G': 10941 { 10942 unsigned int boff = (((given & 0x07800000) >> 23) << 1); 10943 func (stream, "%x", boff); 10944 } 10945 break; 10946 10947 case 'W': 10948 { 10949 unsigned int immA = (given & 0x001f0000u) >> 16; 10950 unsigned int immB = (given & 0x000007feu) >> 1; 10951 unsigned int immC = (given & 0x00000800u) >> 11; 10952 bfd_vma offset = 0; 10953 10954 offset |= immA << 12; 10955 offset |= immB << 2; 10956 offset |= immC << 1; 10957 /* Sign extend. */ 10958 offset = (offset & 0x10000) ? offset - (1 << 17) : offset; 10959 10960 info->print_address_func (pc + 4 + offset, info); 10961 } 10962 break; 10963 10964 case 'Y': 10965 { 10966 unsigned int immA = (given & 0x007f0000u) >> 16; 10967 unsigned int immB = (given & 0x000007feu) >> 1; 10968 unsigned int immC = (given & 0x00000800u) >> 11; 10969 bfd_vma offset = 0; 10970 10971 offset |= immA << 12; 10972 offset |= immB << 2; 10973 offset |= immC << 1; 10974 /* Sign extend. */ 10975 offset = (offset & 0x40000) ? offset - (1 << 19) : offset; 10976 10977 info->print_address_func (pc + 4 + offset, info); 10978 } 10979 break; 10980 10981 case 'Z': 10982 { 10983 unsigned int immA = (given & 0x00010000u) >> 16; 10984 unsigned int immB = (given & 0x000007feu) >> 1; 10985 unsigned int immC = (given & 0x00000800u) >> 11; 10986 bfd_vma offset = 0; 10987 10988 offset |= immA << 12; 10989 offset |= immB << 2; 10990 offset |= immC << 1; 10991 /* Sign extend. */ 10992 offset = (offset & 0x1000) ? offset - (1 << 13) : offset; 10993 10994 info->print_address_func (pc + 4 + offset, info); 10995 10996 unsigned int T = (given & 0x00020000u) >> 17; 10997 unsigned int endoffset = (((given & 0x07800000) >> 23) << 1); 10998 unsigned int boffset = (T == 1) ? 4 : 2; 10999 func (stream, ", "); 11000 func (stream, "%x", endoffset + boffset); 11001 } 11002 break; 11003 11004 case 'Q': 11005 { 11006 unsigned int immh = (given & 0x000007feu) >> 1; 11007 unsigned int imml = (given & 0x00000800u) >> 11; 11008 bfd_vma imm32 = 0; 11009 11010 imm32 |= immh << 2; 11011 imm32 |= imml << 1; 11012 11013 info->print_address_func (pc + 4 + imm32, info); 11014 } 11015 break; 11016 11017 case 'P': 11018 { 11019 unsigned int immh = (given & 0x000007feu) >> 1; 11020 unsigned int imml = (given & 0x00000800u) >> 11; 11021 bfd_vma imm32 = 0; 11022 11023 imm32 |= immh << 2; 11024 imm32 |= imml << 1; 11025 11026 info->print_address_func (pc + 4 - imm32, info); 11027 } 11028 break; 11029 11030 case 'b': 11031 { 11032 unsigned int S = (given & 0x04000000u) >> 26; 11033 unsigned int J1 = (given & 0x00002000u) >> 13; 11034 unsigned int J2 = (given & 0x00000800u) >> 11; 11035 bfd_vma offset = 0; 11036 11037 offset |= !S << 20; 11038 offset |= J2 << 19; 11039 offset |= J1 << 18; 11040 offset |= (given & 0x003f0000) >> 4; 11041 offset |= (given & 0x000007ff) << 1; 11042 offset -= (1 << 20); 11043 11044 bfd_vma target = pc + 4 + offset; 11045 info->print_address_func (target, info); 11046 11047 /* Fill in instruction information. */ 11048 info->insn_info_valid = 1; 11049 info->insn_type = dis_branch; 11050 info->target = target; 11051 } 11052 break; 11053 11054 case 'B': 11055 { 11056 unsigned int S = (given & 0x04000000u) >> 26; 11057 unsigned int I1 = (given & 0x00002000u) >> 13; 11058 unsigned int I2 = (given & 0x00000800u) >> 11; 11059 bfd_vma offset = 0; 11060 11061 offset |= !S << 24; 11062 offset |= !(I1 ^ S) << 23; 11063 offset |= !(I2 ^ S) << 22; 11064 offset |= (given & 0x03ff0000u) >> 4; 11065 offset |= (given & 0x000007ffu) << 1; 11066 offset -= (1 << 24); 11067 offset += pc + 4; 11068 11069 /* BLX target addresses are always word aligned. */ 11070 if ((given & 0x00001000u) == 0) 11071 offset &= ~2u; 11072 11073 info->print_address_func (offset, info); 11074 11075 /* Fill in instruction information. */ 11076 info->insn_info_valid = 1; 11077 info->insn_type = dis_branch; 11078 info->target = offset; 11079 } 11080 break; 11081 11082 case 's': 11083 { 11084 unsigned int shift = 0; 11085 11086 shift |= (given & 0x000000c0u) >> 6; 11087 shift |= (given & 0x00007000u) >> 10; 11088 if (WRITEBACK_BIT_SET) 11089 func (stream, ", asr #%u", shift); 11090 else if (shift) 11091 func (stream, ", lsl #%u", shift); 11092 /* else print nothing - lsl #0 */ 11093 } 11094 break; 11095 11096 case 'R': 11097 { 11098 unsigned int rot = (given & 0x00000030) >> 4; 11099 11100 if (rot) 11101 func (stream, ", ror #%u", rot * 8); 11102 } 11103 break; 11104 11105 case 'U': 11106 if ((given & 0xf0) == 0x60) 11107 { 11108 switch (given & 0xf) 11109 { 11110 case 0xf: func (stream, "sy"); break; 11111 default: 11112 func (stream, "#%d", (int) given & 0xf); 11113 break; 11114 } 11115 } 11116 else 11117 { 11118 const char * opt = data_barrier_option (given & 0xf); 11119 if (opt != NULL) 11120 func (stream, "%s", opt); 11121 else 11122 func (stream, "#%d", (int) given & 0xf); 11123 } 11124 break; 11125 11126 case 'C': 11127 if ((given & 0xff) == 0) 11128 { 11129 func (stream, "%cPSR_", (given & 0x100000) ? 'S' : 'C'); 11130 if (given & 0x800) 11131 func (stream, "f"); 11132 if (given & 0x400) 11133 func (stream, "s"); 11134 if (given & 0x200) 11135 func (stream, "x"); 11136 if (given & 0x100) 11137 func (stream, "c"); 11138 } 11139 else if ((given & 0x20) == 0x20) 11140 { 11141 char const* name; 11142 unsigned sysm = (given & 0xf00) >> 8; 11143 11144 sysm |= (given & 0x30); 11145 sysm |= (given & 0x00100000) >> 14; 11146 name = banked_regname (sysm); 11147 11148 if (name != NULL) 11149 func (stream, "%s", name); 11150 else 11151 func (stream, "(UNDEF: %lu)", (unsigned long) sysm); 11152 } 11153 else 11154 { 11155 func (stream, "%s", psr_name (given & 0xff)); 11156 } 11157 break; 11158 11159 case 'D': 11160 if (((given & 0xff) == 0) 11161 || ((given & 0x20) == 0x20)) 11162 { 11163 char const* name; 11164 unsigned sm = (given & 0xf0000) >> 16; 11165 11166 sm |= (given & 0x30); 11167 sm |= (given & 0x00100000) >> 14; 11168 name = banked_regname (sm); 11169 11170 if (name != NULL) 11171 func (stream, "%s", name); 11172 else 11173 func (stream, "(UNDEF: %lu)", (unsigned long) sm); 11174 } 11175 else 11176 func (stream, "%s", psr_name (given & 0xff)); 11177 break; 11178 11179 case '0': case '1': case '2': case '3': case '4': 11180 case '5': case '6': case '7': case '8': case '9': 11181 { 11182 int width; 11183 unsigned long val; 11184 11185 c = arm_decode_bitfield (c, given, &val, &width); 11186 11187 switch (*c) 11188 { 11189 case 's': 11190 if (val <= 3) 11191 func (stream, "%s", mve_vec_sizename[val]); 11192 else 11193 func (stream, "<undef size>"); 11194 break; 11195 11196 case 'd': 11197 func (stream, "%lu", val); 11198 value_in_comment = val; 11199 break; 11200 11201 case 'D': 11202 func (stream, "%lu", val + 1); 11203 value_in_comment = val + 1; 11204 break; 11205 11206 case 'W': 11207 func (stream, "%lu", val * 4); 11208 value_in_comment = val * 4; 11209 break; 11210 11211 case 'S': 11212 if (val == 13) 11213 is_unpredictable = TRUE; 11214 /* Fall through. */ 11215 case 'R': 11216 if (val == 15) 11217 is_unpredictable = TRUE; 11218 /* Fall through. */ 11219 case 'r': 11220 func (stream, "%s", arm_regnames[val]); 11221 break; 11222 11223 case 'c': 11224 func (stream, "%s", arm_conditional[val]); 11225 break; 11226 11227 case '\'': 11228 c++; 11229 if (val == ((1ul << width) - 1)) 11230 func (stream, "%c", *c); 11231 break; 11232 11233 case '`': 11234 c++; 11235 if (val == 0) 11236 func (stream, "%c", *c); 11237 break; 11238 11239 case '?': 11240 func (stream, "%c", c[(1 << width) - (int) val]); 11241 c += 1 << width; 11242 break; 11243 11244 case 'x': 11245 func (stream, "0x%lx", val & 0xffffffffUL); 11246 break; 11247 11248 default: 11249 abort (); 11250 } 11251 } 11252 break; 11253 11254 case 'L': 11255 /* PR binutils/12534 11256 If we have a PC relative offset in an LDRD or STRD 11257 instructions then display the decoded address. */ 11258 if (((given >> 16) & 0xf) == 0xf) 11259 { 11260 bfd_vma offset = (given & 0xff) * 4; 11261 11262 if ((given & (1 << 23)) == 0) 11263 offset = - offset; 11264 func (stream, "\t; "); 11265 info->print_address_func ((pc & ~3) + 4 + offset, info); 11266 } 11267 break; 11268 11269 default: 11270 abort (); 11271 } 11272 } 11273 11274 if (value_in_comment > 32 || value_in_comment < -16) 11275 func (stream, "\t; 0x%lx", value_in_comment); 11276 11277 if (is_unpredictable) 11278 func (stream, UNPREDICTABLE_INSTRUCTION); 11279 11280 return; 11281 } 11282 11283 /* No match. */ 11284 func (stream, UNKNOWN_INSTRUCTION_32BIT, (unsigned)given); 11285 return; 11286 } 11287 11288 /* Print data bytes on INFO->STREAM. */ 11289 11290 static void 11291 print_insn_data (bfd_vma pc ATTRIBUTE_UNUSED, 11292 struct disassemble_info *info, 11293 long given) 11294 { 11295 switch (info->bytes_per_chunk) 11296 { 11297 case 1: 11298 info->fprintf_func (info->stream, ".byte\t0x%02lx", given); 11299 break; 11300 case 2: 11301 info->fprintf_func (info->stream, ".short\t0x%04lx", given); 11302 break; 11303 case 4: 11304 info->fprintf_func (info->stream, ".word\t0x%08lx", given); 11305 break; 11306 default: 11307 abort (); 11308 } 11309 } 11310 11311 /* Disallow mapping symbols ($a, $b, $d, $t etc) from 11312 being displayed in symbol relative addresses. 11313 11314 Also disallow private symbol, with __tagsym$$ prefix, 11315 from ARM RVCT toolchain being displayed. */ 11316 11317 bfd_boolean 11318 arm_symbol_is_valid (asymbol * sym, 11319 struct disassemble_info * info ATTRIBUTE_UNUSED) 11320 { 11321 const char * name; 11322 11323 if (sym == NULL) 11324 return FALSE; 11325 11326 name = bfd_asymbol_name (sym); 11327 11328 return (name && *name != '$' && strncmp (name, "__tagsym$$", 10)); 11329 } 11330 11331 /* Parse the string of disassembler options. */ 11332 11333 static void 11334 parse_arm_disassembler_options (const char *options) 11335 { 11336 const char *opt; 11337 11338 FOR_EACH_DISASSEMBLER_OPTION (opt, options) 11339 { 11340 if (CONST_STRNEQ (opt, "reg-names-")) 11341 { 11342 unsigned int i; 11343 for (i = 0; i < NUM_ARM_OPTIONS; i++) 11344 if (disassembler_options_cmp (opt, regnames[i].name) == 0) 11345 { 11346 regname_selected = i; 11347 break; 11348 } 11349 11350 if (i >= NUM_ARM_OPTIONS) 11351 /* xgettext: c-format */ 11352 opcodes_error_handler (_("unrecognised register name set: %s"), 11353 opt); 11354 } 11355 else if (CONST_STRNEQ (opt, "force-thumb")) 11356 force_thumb = 1; 11357 else if (CONST_STRNEQ (opt, "no-force-thumb")) 11358 force_thumb = 0; 11359 else 11360 /* xgettext: c-format */ 11361 opcodes_error_handler (_("unrecognised disassembler option: %s"), opt); 11362 } 11363 11364 return; 11365 } 11366 11367 static bfd_boolean 11368 mapping_symbol_for_insn (bfd_vma pc, struct disassemble_info *info, 11369 enum map_type *map_symbol); 11370 11371 /* Search back through the insn stream to determine if this instruction is 11372 conditionally executed. */ 11373 11374 static void 11375 find_ifthen_state (bfd_vma pc, 11376 struct disassemble_info *info, 11377 bfd_boolean little) 11378 { 11379 unsigned char b[2]; 11380 unsigned int insn; 11381 int status; 11382 /* COUNT is twice the number of instructions seen. It will be odd if we 11383 just crossed an instruction boundary. */ 11384 int count; 11385 int it_count; 11386 unsigned int seen_it; 11387 bfd_vma addr; 11388 11389 ifthen_address = pc; 11390 ifthen_state = 0; 11391 11392 addr = pc; 11393 count = 1; 11394 it_count = 0; 11395 seen_it = 0; 11396 /* Scan backwards looking for IT instructions, keeping track of where 11397 instruction boundaries are. We don't know if something is actually an 11398 IT instruction until we find a definite instruction boundary. */ 11399 for (;;) 11400 { 11401 if (addr == 0 || info->symbol_at_address_func (addr, info)) 11402 { 11403 /* A symbol must be on an instruction boundary, and will not 11404 be within an IT block. */ 11405 if (seen_it && (count & 1)) 11406 break; 11407 11408 return; 11409 } 11410 addr -= 2; 11411 status = info->read_memory_func (addr, (bfd_byte *) b, 2, info); 11412 if (status) 11413 return; 11414 11415 if (little) 11416 insn = (b[0]) | (b[1] << 8); 11417 else 11418 insn = (b[1]) | (b[0] << 8); 11419 if (seen_it) 11420 { 11421 if ((insn & 0xf800) < 0xe800) 11422 { 11423 /* Addr + 2 is an instruction boundary. See if this matches 11424 the expected boundary based on the position of the last 11425 IT candidate. */ 11426 if (count & 1) 11427 break; 11428 seen_it = 0; 11429 } 11430 } 11431 if ((insn & 0xff00) == 0xbf00 && (insn & 0xf) != 0) 11432 { 11433 enum map_type type = MAP_ARM; 11434 bfd_boolean found = mapping_symbol_for_insn (addr, info, &type); 11435 11436 if (!found || (found && type == MAP_THUMB)) 11437 { 11438 /* This could be an IT instruction. */ 11439 seen_it = insn; 11440 it_count = count >> 1; 11441 } 11442 } 11443 if ((insn & 0xf800) >= 0xe800) 11444 count++; 11445 else 11446 count = (count + 2) | 1; 11447 /* IT blocks contain at most 4 instructions. */ 11448 if (count >= 8 && !seen_it) 11449 return; 11450 } 11451 /* We found an IT instruction. */ 11452 ifthen_state = (seen_it & 0xe0) | ((seen_it << it_count) & 0x1f); 11453 if ((ifthen_state & 0xf) == 0) 11454 ifthen_state = 0; 11455 } 11456 11457 /* Returns nonzero and sets *MAP_TYPE if the N'th symbol is a 11458 mapping symbol. */ 11459 11460 static int 11461 is_mapping_symbol (struct disassemble_info *info, int n, 11462 enum map_type *map_type) 11463 { 11464 const char *name; 11465 11466 name = bfd_asymbol_name (info->symtab[n]); 11467 if (name[0] == '$' && (name[1] == 'a' || name[1] == 't' || name[1] == 'd') 11468 && (name[2] == 0 || name[2] == '.')) 11469 { 11470 *map_type = ((name[1] == 'a') ? MAP_ARM 11471 : (name[1] == 't') ? MAP_THUMB 11472 : MAP_DATA); 11473 return TRUE; 11474 } 11475 11476 return FALSE; 11477 } 11478 11479 /* Try to infer the code type (ARM or Thumb) from a mapping symbol. 11480 Returns nonzero if *MAP_TYPE was set. */ 11481 11482 static int 11483 get_map_sym_type (struct disassemble_info *info, 11484 int n, 11485 enum map_type *map_type) 11486 { 11487 /* If the symbol is in a different section, ignore it. */ 11488 if (info->section != NULL && info->section != info->symtab[n]->section) 11489 return FALSE; 11490 11491 return is_mapping_symbol (info, n, map_type); 11492 } 11493 11494 /* Try to infer the code type (ARM or Thumb) from a non-mapping symbol. 11495 Returns nonzero if *MAP_TYPE was set. */ 11496 11497 static int 11498 get_sym_code_type (struct disassemble_info *info, 11499 int n, 11500 enum map_type *map_type) 11501 { 11502 elf_symbol_type *es; 11503 unsigned int type; 11504 11505 /* If the symbol is in a different section, ignore it. */ 11506 if (info->section != NULL && info->section != info->symtab[n]->section) 11507 return FALSE; 11508 11509 es = *(elf_symbol_type **)(info->symtab + n); 11510 type = ELF_ST_TYPE (es->internal_elf_sym.st_info); 11511 11512 /* If the symbol has function type then use that. */ 11513 if (type == STT_FUNC || type == STT_GNU_IFUNC) 11514 { 11515 if (ARM_GET_SYM_BRANCH_TYPE (es->internal_elf_sym.st_target_internal) 11516 == ST_BRANCH_TO_THUMB) 11517 *map_type = MAP_THUMB; 11518 else 11519 *map_type = MAP_ARM; 11520 return TRUE; 11521 } 11522 11523 return FALSE; 11524 } 11525 11526 /* Search the mapping symbol state for instruction at pc. This is only 11527 applicable for elf target. 11528 11529 There is an assumption Here, info->private_data contains the correct AND 11530 up-to-date information about current scan process. The information will be 11531 used to speed this search process. 11532 11533 Return TRUE if the mapping state can be determined, and map_symbol 11534 will be updated accordingly. Otherwise, return FALSE. */ 11535 11536 static bfd_boolean 11537 mapping_symbol_for_insn (bfd_vma pc, struct disassemble_info *info, 11538 enum map_type *map_symbol) 11539 { 11540 bfd_vma addr, section_vma = 0; 11541 int n, last_sym = -1; 11542 bfd_boolean found = FALSE; 11543 bfd_boolean can_use_search_opt_p = FALSE; 11544 11545 /* Default to DATA. A text section is required by the ABI to contain an 11546 INSN mapping symbol at the start. A data section has no such 11547 requirement, hence if no mapping symbol is found the section must 11548 contain only data. This however isn't very useful if the user has 11549 fully stripped the binaries. If this is the case use the section 11550 attributes to determine the default. If we have no section default to 11551 INSN as well, as we may be disassembling some raw bytes on a baremetal 11552 HEX file or similar. */ 11553 enum map_type type = MAP_DATA; 11554 if ((info->section && info->section->flags & SEC_CODE) || !info->section) 11555 type = MAP_ARM; 11556 struct arm_private_data *private_data; 11557 11558 if (info->private_data == NULL 11559 || bfd_asymbol_flavour (*info->symtab) != bfd_target_elf_flavour) 11560 return FALSE; 11561 11562 private_data = info->private_data; 11563 11564 /* First, look for mapping symbols. */ 11565 if (info->symtab_size != 0) 11566 { 11567 if (pc <= private_data->last_mapping_addr) 11568 private_data->last_mapping_sym = -1; 11569 11570 /* Start scanning at the start of the function, or wherever 11571 we finished last time. */ 11572 n = info->symtab_pos + 1; 11573 11574 /* If the last stop offset is different from the current one it means we 11575 are disassembling a different glob of bytes. As such the optimization 11576 would not be safe and we should start over. */ 11577 can_use_search_opt_p 11578 = private_data->last_mapping_sym >= 0 11579 && info->stop_offset == private_data->last_stop_offset; 11580 11581 if (n >= private_data->last_mapping_sym && can_use_search_opt_p) 11582 n = private_data->last_mapping_sym; 11583 11584 /* Look down while we haven't passed the location being disassembled. 11585 The reason for this is that there's no defined order between a symbol 11586 and an mapping symbol that may be at the same address. We may have to 11587 look at least one position ahead. */ 11588 for (; n < info->symtab_size; n++) 11589 { 11590 addr = bfd_asymbol_value (info->symtab[n]); 11591 if (addr > pc) 11592 break; 11593 if (get_map_sym_type (info, n, &type)) 11594 { 11595 last_sym = n; 11596 found = TRUE; 11597 } 11598 } 11599 11600 if (!found) 11601 { 11602 n = info->symtab_pos; 11603 if (n >= private_data->last_mapping_sym && can_use_search_opt_p) 11604 n = private_data->last_mapping_sym; 11605 11606 /* No mapping symbol found at this address. Look backwards 11607 for a preceeding one, but don't go pass the section start 11608 otherwise a data section with no mapping symbol can pick up 11609 a text mapping symbol of a preceeding section. The documentation 11610 says section can be NULL, in which case we will seek up all the 11611 way to the top. */ 11612 if (info->section) 11613 section_vma = info->section->vma; 11614 11615 for (; n >= 0; n--) 11616 { 11617 addr = bfd_asymbol_value (info->symtab[n]); 11618 if (addr < section_vma) 11619 break; 11620 11621 if (get_map_sym_type (info, n, &type)) 11622 { 11623 last_sym = n; 11624 found = TRUE; 11625 break; 11626 } 11627 } 11628 } 11629 } 11630 11631 /* If no mapping symbol was found, try looking up without a mapping 11632 symbol. This is done by walking up from the current PC to the nearest 11633 symbol. We don't actually have to loop here since symtab_pos will 11634 contain the nearest symbol already. */ 11635 if (!found) 11636 { 11637 n = info->symtab_pos; 11638 if (n >= 0 && get_sym_code_type (info, n, &type)) 11639 { 11640 last_sym = n; 11641 found = TRUE; 11642 } 11643 } 11644 11645 private_data->last_mapping_sym = last_sym; 11646 private_data->last_type = type; 11647 private_data->last_stop_offset = info->stop_offset; 11648 11649 *map_symbol = type; 11650 return found; 11651 } 11652 11653 /* Given a bfd_mach_arm_XXX value, this function fills in the fields 11654 of the supplied arm_feature_set structure with bitmasks indicating 11655 the supported base architectures and coprocessor extensions. 11656 11657 FIXME: This could more efficiently implemented as a constant array, 11658 although it would also be less robust. */ 11659 11660 static void 11661 select_arm_features (unsigned long mach, 11662 arm_feature_set * features) 11663 { 11664 arm_feature_set arch_fset; 11665 const arm_feature_set fpu_any = FPU_ANY; 11666 11667 #undef ARM_SET_FEATURES 11668 #define ARM_SET_FEATURES(FSET) \ 11669 { \ 11670 const arm_feature_set fset = FSET; \ 11671 arch_fset = fset; \ 11672 } 11673 11674 /* When several architecture versions share the same bfd_mach_arm_XXX value 11675 the most featureful is chosen. */ 11676 switch (mach) 11677 { 11678 case bfd_mach_arm_2: ARM_SET_FEATURES (ARM_ARCH_V2); break; 11679 case bfd_mach_arm_2a: ARM_SET_FEATURES (ARM_ARCH_V2S); break; 11680 case bfd_mach_arm_3: ARM_SET_FEATURES (ARM_ARCH_V3); break; 11681 case bfd_mach_arm_3M: ARM_SET_FEATURES (ARM_ARCH_V3M); break; 11682 case bfd_mach_arm_4: ARM_SET_FEATURES (ARM_ARCH_V4); break; 11683 case bfd_mach_arm_4T: ARM_SET_FEATURES (ARM_ARCH_V4T); break; 11684 case bfd_mach_arm_5: ARM_SET_FEATURES (ARM_ARCH_V5); break; 11685 case bfd_mach_arm_5T: ARM_SET_FEATURES (ARM_ARCH_V5T); break; 11686 case bfd_mach_arm_5TE: ARM_SET_FEATURES (ARM_ARCH_V5TE); break; 11687 case bfd_mach_arm_XScale: ARM_SET_FEATURES (ARM_ARCH_XSCALE); break; 11688 case bfd_mach_arm_ep9312: 11689 ARM_SET_FEATURES (ARM_FEATURE_LOW (ARM_AEXT_V4T, 11690 ARM_CEXT_MAVERICK | FPU_MAVERICK)); 11691 break; 11692 case bfd_mach_arm_iWMMXt: ARM_SET_FEATURES (ARM_ARCH_IWMMXT); break; 11693 case bfd_mach_arm_iWMMXt2: ARM_SET_FEATURES (ARM_ARCH_IWMMXT2); break; 11694 case bfd_mach_arm_5TEJ: ARM_SET_FEATURES (ARM_ARCH_V5TEJ); break; 11695 case bfd_mach_arm_6: ARM_SET_FEATURES (ARM_ARCH_V6); break; 11696 case bfd_mach_arm_6KZ: ARM_SET_FEATURES (ARM_ARCH_V6KZ); break; 11697 case bfd_mach_arm_6T2: ARM_SET_FEATURES (ARM_ARCH_V6KZT2); break; 11698 case bfd_mach_arm_6K: ARM_SET_FEATURES (ARM_ARCH_V6K); break; 11699 case bfd_mach_arm_7: ARM_SET_FEATURES (ARM_ARCH_V7VE); break; 11700 case bfd_mach_arm_6M: ARM_SET_FEATURES (ARM_ARCH_V6M); break; 11701 case bfd_mach_arm_6SM: ARM_SET_FEATURES (ARM_ARCH_V6SM); break; 11702 case bfd_mach_arm_7EM: ARM_SET_FEATURES (ARM_ARCH_V7EM); break; 11703 case bfd_mach_arm_8: 11704 { 11705 /* Add bits for extensions that Armv8.6-A recognizes. */ 11706 arm_feature_set armv8_6_ext_fset 11707 = ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST); 11708 ARM_SET_FEATURES (ARM_ARCH_V8_6A); 11709 ARM_MERGE_FEATURE_SETS (arch_fset, arch_fset, armv8_6_ext_fset); 11710 break; 11711 } 11712 case bfd_mach_arm_8R: ARM_SET_FEATURES (ARM_ARCH_V8R); break; 11713 case bfd_mach_arm_8M_BASE: ARM_SET_FEATURES (ARM_ARCH_V8M_BASE); break; 11714 case bfd_mach_arm_8M_MAIN: ARM_SET_FEATURES (ARM_ARCH_V8M_MAIN); break; 11715 case bfd_mach_arm_8_1M_MAIN: 11716 ARM_SET_FEATURES (ARM_ARCH_V8_1M_MAIN); 11717 arm_feature_set mve_all 11718 = ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE | ARM_EXT2_MVE_FP); 11719 ARM_MERGE_FEATURE_SETS (arch_fset, arch_fset, mve_all); 11720 force_thumb = 1; 11721 break; 11722 /* If the machine type is unknown allow all architecture types and all 11723 extensions, with the exception of MVE as that clashes with NEON. */ 11724 case bfd_mach_arm_unknown: 11725 ARM_SET_FEATURES (ARM_FEATURE (-1, 11726 -1 & ~(ARM_EXT2_MVE | ARM_EXT2_MVE_FP), 11727 -1)); 11728 break; 11729 default: 11730 abort (); 11731 } 11732 #undef ARM_SET_FEATURES 11733 11734 /* None of the feature bits related to -mfpu have an impact on Tag_CPU_arch 11735 and thus on bfd_mach_arm_XXX value. Therefore for a given 11736 bfd_mach_arm_XXX value all coprocessor feature bits should be allowed. */ 11737 ARM_MERGE_FEATURE_SETS (*features, arch_fset, fpu_any); 11738 } 11739 11740 11741 /* NOTE: There are no checks in these routines that 11742 the relevant number of data bytes exist. */ 11743 11744 static int 11745 print_insn (bfd_vma pc, struct disassemble_info *info, bfd_boolean little) 11746 { 11747 unsigned char b[4]; 11748 unsigned long given; 11749 int status; 11750 int is_thumb = FALSE; 11751 int is_data = FALSE; 11752 int little_code; 11753 unsigned int size = 4; 11754 void (*printer) (bfd_vma, struct disassemble_info *, long); 11755 bfd_boolean found = FALSE; 11756 struct arm_private_data *private_data; 11757 11758 /* Clear instruction information field. */ 11759 info->insn_info_valid = 0; 11760 info->branch_delay_insns = 0; 11761 info->data_size = 0; 11762 info->insn_type = dis_noninsn; 11763 info->target = 0; 11764 info->target2 = 0; 11765 11766 if (info->disassembler_options) 11767 { 11768 parse_arm_disassembler_options (info->disassembler_options); 11769 11770 /* To avoid repeated parsing of these options, we remove them here. */ 11771 info->disassembler_options = NULL; 11772 } 11773 11774 /* PR 10288: Control which instructions will be disassembled. */ 11775 if (info->private_data == NULL) 11776 { 11777 static struct arm_private_data private; 11778 11779 if ((info->flags & USER_SPECIFIED_MACHINE_TYPE) == 0) 11780 /* If the user did not use the -m command line switch then default to 11781 disassembling all types of ARM instruction. 11782 11783 The info->mach value has to be ignored as this will be based on 11784 the default archictecture for the target and/or hints in the notes 11785 section, but it will never be greater than the current largest arm 11786 machine value (iWMMXt2), which is only equivalent to the V5TE 11787 architecture. ARM architectures have advanced beyond the machine 11788 value encoding, and these newer architectures would be ignored if 11789 the machine value was used. 11790 11791 Ie the -m switch is used to restrict which instructions will be 11792 disassembled. If it is necessary to use the -m switch to tell 11793 objdump that an ARM binary is being disassembled, eg because the 11794 input is a raw binary file, but it is also desired to disassemble 11795 all ARM instructions then use "-marm". This will select the 11796 "unknown" arm architecture which is compatible with any ARM 11797 instruction. */ 11798 info->mach = bfd_mach_arm_unknown; 11799 11800 /* Compute the architecture bitmask from the machine number. 11801 Note: This assumes that the machine number will not change 11802 during disassembly.... */ 11803 select_arm_features (info->mach, & private.features); 11804 11805 private.last_mapping_sym = -1; 11806 private.last_mapping_addr = 0; 11807 private.last_stop_offset = 0; 11808 11809 info->private_data = & private; 11810 } 11811 11812 private_data = info->private_data; 11813 11814 /* Decide if our code is going to be little-endian, despite what the 11815 function argument might say. */ 11816 little_code = ((info->endian_code == BFD_ENDIAN_LITTLE) || little); 11817 11818 /* For ELF, consult the symbol table to determine what kind of code 11819 or data we have. */ 11820 if (info->symtab_size != 0 11821 && bfd_asymbol_flavour (*info->symtab) == bfd_target_elf_flavour) 11822 { 11823 bfd_vma addr; 11824 int n; 11825 int last_sym = -1; 11826 enum map_type type = MAP_ARM; 11827 11828 found = mapping_symbol_for_insn (pc, info, &type); 11829 last_sym = private_data->last_mapping_sym; 11830 11831 is_thumb = (private_data->last_type == MAP_THUMB); 11832 is_data = (private_data->last_type == MAP_DATA); 11833 11834 /* Look a little bit ahead to see if we should print out 11835 two or four bytes of data. If there's a symbol, 11836 mapping or otherwise, after two bytes then don't 11837 print more. */ 11838 if (is_data) 11839 { 11840 size = 4 - (pc & 3); 11841 for (n = last_sym + 1; n < info->symtab_size; n++) 11842 { 11843 addr = bfd_asymbol_value (info->symtab[n]); 11844 if (addr > pc 11845 && (info->section == NULL 11846 || info->section == info->symtab[n]->section)) 11847 { 11848 if (addr - pc < size) 11849 size = addr - pc; 11850 break; 11851 } 11852 } 11853 /* If the next symbol is after three bytes, we need to 11854 print only part of the data, so that we can use either 11855 .byte or .short. */ 11856 if (size == 3) 11857 size = (pc & 1) ? 1 : 2; 11858 } 11859 } 11860 11861 if (info->symbols != NULL) 11862 { 11863 if (bfd_asymbol_flavour (*info->symbols) == bfd_target_coff_flavour) 11864 { 11865 coff_symbol_type * cs; 11866 11867 cs = coffsymbol (*info->symbols); 11868 is_thumb = ( cs->native->u.syment.n_sclass == C_THUMBEXT 11869 || cs->native->u.syment.n_sclass == C_THUMBSTAT 11870 || cs->native->u.syment.n_sclass == C_THUMBLABEL 11871 || cs->native->u.syment.n_sclass == C_THUMBEXTFUNC 11872 || cs->native->u.syment.n_sclass == C_THUMBSTATFUNC); 11873 } 11874 else if (bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour 11875 && !found) 11876 { 11877 /* If no mapping symbol has been found then fall back to the type 11878 of the function symbol. */ 11879 elf_symbol_type * es; 11880 unsigned int type; 11881 11882 es = *(elf_symbol_type **)(info->symbols); 11883 type = ELF_ST_TYPE (es->internal_elf_sym.st_info); 11884 11885 is_thumb = 11886 ((ARM_GET_SYM_BRANCH_TYPE (es->internal_elf_sym.st_target_internal) 11887 == ST_BRANCH_TO_THUMB) || type == STT_ARM_16BIT); 11888 } 11889 else if (bfd_asymbol_flavour (*info->symbols) 11890 == bfd_target_mach_o_flavour) 11891 { 11892 bfd_mach_o_asymbol *asym = (bfd_mach_o_asymbol *)*info->symbols; 11893 11894 is_thumb = (asym->n_desc & BFD_MACH_O_N_ARM_THUMB_DEF); 11895 } 11896 } 11897 11898 if (force_thumb) 11899 is_thumb = TRUE; 11900 11901 if (is_data) 11902 info->display_endian = little ? BFD_ENDIAN_LITTLE : BFD_ENDIAN_BIG; 11903 else 11904 info->display_endian = little_code ? BFD_ENDIAN_LITTLE : BFD_ENDIAN_BIG; 11905 11906 info->bytes_per_line = 4; 11907 11908 /* PR 10263: Disassemble data if requested to do so by the user. */ 11909 if (is_data && ((info->flags & DISASSEMBLE_DATA) == 0)) 11910 { 11911 int i; 11912 11913 /* Size was already set above. */ 11914 info->bytes_per_chunk = size; 11915 printer = print_insn_data; 11916 11917 status = info->read_memory_func (pc, (bfd_byte *) b, size, info); 11918 given = 0; 11919 if (little) 11920 for (i = size - 1; i >= 0; i--) 11921 given = b[i] | (given << 8); 11922 else 11923 for (i = 0; i < (int) size; i++) 11924 given = b[i] | (given << 8); 11925 } 11926 else if (!is_thumb) 11927 { 11928 /* In ARM mode endianness is a straightforward issue: the instruction 11929 is four bytes long and is either ordered 0123 or 3210. */ 11930 printer = print_insn_arm; 11931 info->bytes_per_chunk = 4; 11932 size = 4; 11933 11934 status = info->read_memory_func (pc, (bfd_byte *) b, 4, info); 11935 if (little_code) 11936 given = (b[0]) | (b[1] << 8) | (b[2] << 16) | ((unsigned) b[3] << 24); 11937 else 11938 given = (b[3]) | (b[2] << 8) | (b[1] << 16) | ((unsigned) b[0] << 24); 11939 } 11940 else 11941 { 11942 /* In Thumb mode we have the additional wrinkle of two 11943 instruction lengths. Fortunately, the bits that determine 11944 the length of the current instruction are always to be found 11945 in the first two bytes. */ 11946 printer = print_insn_thumb16; 11947 info->bytes_per_chunk = 2; 11948 size = 2; 11949 11950 status = info->read_memory_func (pc, (bfd_byte *) b, 2, info); 11951 if (little_code) 11952 given = (b[0]) | (b[1] << 8); 11953 else 11954 given = (b[1]) | (b[0] << 8); 11955 11956 if (!status) 11957 { 11958 /* These bit patterns signal a four-byte Thumb 11959 instruction. */ 11960 if ((given & 0xF800) == 0xF800 11961 || (given & 0xF800) == 0xF000 11962 || (given & 0xF800) == 0xE800) 11963 { 11964 status = info->read_memory_func (pc + 2, (bfd_byte *) b, 2, info); 11965 if (little_code) 11966 given = (b[0]) | (b[1] << 8) | (given << 16); 11967 else 11968 given = (b[1]) | (b[0] << 8) | (given << 16); 11969 11970 printer = print_insn_thumb32; 11971 size = 4; 11972 } 11973 } 11974 11975 if (ifthen_address != pc) 11976 find_ifthen_state (pc, info, little_code); 11977 11978 if (ifthen_state) 11979 { 11980 if ((ifthen_state & 0xf) == 0x8) 11981 ifthen_next_state = 0; 11982 else 11983 ifthen_next_state = (ifthen_state & 0xe0) 11984 | ((ifthen_state & 0xf) << 1); 11985 } 11986 } 11987 11988 if (status) 11989 { 11990 info->memory_error_func (status, pc, info); 11991 return -1; 11992 } 11993 if (info->flags & INSN_HAS_RELOC) 11994 /* If the instruction has a reloc associated with it, then 11995 the offset field in the instruction will actually be the 11996 addend for the reloc. (We are using REL type relocs). 11997 In such cases, we can ignore the pc when computing 11998 addresses, since the addend is not currently pc-relative. */ 11999 pc = 0; 12000 12001 printer (pc, info, given); 12002 12003 if (is_thumb) 12004 { 12005 ifthen_state = ifthen_next_state; 12006 ifthen_address += size; 12007 } 12008 return size; 12009 } 12010 12011 int 12012 print_insn_big_arm (bfd_vma pc, struct disassemble_info *info) 12013 { 12014 /* Detect BE8-ness and record it in the disassembler info. */ 12015 if (info->flavour == bfd_target_elf_flavour 12016 && info->section != NULL 12017 && (elf_elfheader (info->section->owner)->e_flags & EF_ARM_BE8)) 12018 info->endian_code = BFD_ENDIAN_LITTLE; 12019 12020 return print_insn (pc, info, FALSE); 12021 } 12022 12023 int 12024 print_insn_little_arm (bfd_vma pc, struct disassemble_info *info) 12025 { 12026 return print_insn (pc, info, TRUE); 12027 } 12028 12029 const disasm_options_and_args_t * 12030 disassembler_options_arm (void) 12031 { 12032 static disasm_options_and_args_t *opts_and_args; 12033 12034 if (opts_and_args == NULL) 12035 { 12036 disasm_options_t *opts; 12037 unsigned int i; 12038 12039 opts_and_args = XNEW (disasm_options_and_args_t); 12040 opts_and_args->args = NULL; 12041 12042 opts = &opts_and_args->options; 12043 opts->name = XNEWVEC (const char *, NUM_ARM_OPTIONS + 1); 12044 opts->description = XNEWVEC (const char *, NUM_ARM_OPTIONS + 1); 12045 opts->arg = NULL; 12046 for (i = 0; i < NUM_ARM_OPTIONS; i++) 12047 { 12048 opts->name[i] = regnames[i].name; 12049 if (regnames[i].description != NULL) 12050 opts->description[i] = _(regnames[i].description); 12051 else 12052 opts->description[i] = NULL; 12053 } 12054 /* The array we return must be NULL terminated. */ 12055 opts->name[i] = NULL; 12056 opts->description[i] = NULL; 12057 } 12058 12059 return opts_and_args; 12060 } 12061 12062 void 12063 print_arm_disassembler_options (FILE *stream) 12064 { 12065 unsigned int i, max_len = 0; 12066 fprintf (stream, _("\n\ 12067 The following ARM specific disassembler options are supported for use with\n\ 12068 the -M switch:\n")); 12069 12070 for (i = 0; i < NUM_ARM_OPTIONS; i++) 12071 { 12072 unsigned int len = strlen (regnames[i].name); 12073 if (max_len < len) 12074 max_len = len; 12075 } 12076 12077 for (i = 0, max_len++; i < NUM_ARM_OPTIONS; i++) 12078 fprintf (stream, " %s%*c %s\n", 12079 regnames[i].name, 12080 (int)(max_len - strlen (regnames[i].name)), ' ', 12081 _(regnames[i].description)); 12082 } 12083