1 /* Instruction printing code for the ARM 2 Copyright (C) 1994-2016 Free Software Foundation, Inc. 3 Contributed by Richard Earnshaw (rwe (at) pegasus.esprit.ec.org) 4 Modification by James G. Smith (jsmith (at) 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 25 #include "dis-asm.h" 26 #include "opcode/arm.h" 27 #include "opintl.h" 28 #include "safe-ctype.h" 29 #include "floatformat.h" 30 31 /* FIXME: This shouldn't be done here. */ 32 #include "coff/internal.h" 33 #include "libcoff.h" 34 #include "elf-bfd.h" 35 #include "elf/internal.h" 36 #include "elf/arm.h" 37 #include "mach-o.h" 38 39 /* FIXME: Belongs in global header. */ 40 #ifndef strneq 41 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0) 42 #endif 43 44 #ifndef NUM_ELEM 45 #define NUM_ELEM(a) (sizeof (a) / sizeof (a)[0]) 46 #endif 47 48 /* Cached mapping symbol state. */ 49 enum map_type 50 { 51 MAP_ARM, 52 MAP_THUMB, 53 MAP_DATA 54 }; 55 56 struct arm_private_data 57 { 58 /* The features to use when disassembling optional instructions. */ 59 arm_feature_set features; 60 61 /* Whether any mapping symbols are present in the provided symbol 62 table. -1 if we do not know yet, otherwise 0 or 1. */ 63 int has_mapping_symbols; 64 65 /* Track the last type (although this doesn't seem to be useful) */ 66 enum map_type last_type; 67 68 /* Tracking symbol table information */ 69 int last_mapping_sym; 70 bfd_vma last_mapping_addr; 71 }; 72 73 struct opcode32 74 { 75 arm_feature_set arch; /* Architecture defining this insn. */ 76 unsigned long value; /* If arch is 0 then value is a sentinel. */ 77 unsigned long mask; /* Recognise insn if (op & mask) == value. */ 78 const char * assembler; /* How to disassemble this insn. */ 79 }; 80 81 struct opcode16 82 { 83 arm_feature_set arch; /* Architecture defining this insn. */ 84 unsigned short value, mask; /* Recognise insn if (op & mask) == value. */ 85 const char *assembler; /* How to disassemble this insn. */ 86 }; 87 88 /* print_insn_coprocessor recognizes the following format control codes: 89 90 %% % 91 92 %c print condition code (always bits 28-31 in ARM mode) 93 %q print shifter argument 94 %u print condition code (unconditional in ARM mode, 95 UNPREDICTABLE if not AL in Thumb) 96 %A print address for ldc/stc/ldf/stf instruction 97 %B print vstm/vldm register list 98 %I print cirrus signed shift immediate: bits 0..3|4..6 99 %F print the COUNT field of a LFM/SFM instruction. 100 %P print floating point precision in arithmetic insn 101 %Q print floating point precision in ldf/stf insn 102 %R print floating point rounding mode 103 104 %<bitfield>c print as a condition code (for vsel) 105 %<bitfield>r print as an ARM register 106 %<bitfield>R as %<>r but r15 is UNPREDICTABLE 107 %<bitfield>ru as %<>r but each u register must be unique. 108 %<bitfield>d print the bitfield in decimal 109 %<bitfield>k print immediate for VFPv3 conversion instruction 110 %<bitfield>x print the bitfield in hex 111 %<bitfield>X print the bitfield as 1 hex digit without leading "0x" 112 %<bitfield>f print a floating point constant if >7 else a 113 floating point register 114 %<bitfield>w print as an iWMMXt width field - [bhwd]ss/us 115 %<bitfield>g print as an iWMMXt 64-bit register 116 %<bitfield>G print as an iWMMXt general purpose or control register 117 %<bitfield>D print as a NEON D register 118 %<bitfield>Q print as a NEON Q register 119 %<bitfield>E print a quarter-float immediate value 120 121 %y<code> print a single precision VFP reg. 122 Codes: 0=>Sm, 1=>Sd, 2=>Sn, 3=>multi-list, 4=>Sm pair 123 %z<code> print a double precision VFP reg 124 Codes: 0=>Dm, 1=>Dd, 2=>Dn, 3=>multi-list 125 126 %<bitfield>'c print specified char iff bitfield is all ones 127 %<bitfield>`c print specified char iff bitfield is all zeroes 128 %<bitfield>?ab... select from array of values in big endian order 129 130 %L print as an iWMMXt N/M width field. 131 %Z print the Immediate of a WSHUFH instruction. 132 %l like 'A' except use byte offsets for 'B' & 'H' 133 versions. 134 %i print 5-bit immediate in bits 8,3..0 135 (print "32" when 0) 136 %r print register offset address for wldt/wstr instruction. */ 137 138 enum opcode_sentinel_enum 139 { 140 SENTINEL_IWMMXT_START = 1, 141 SENTINEL_IWMMXT_END, 142 SENTINEL_GENERIC_START 143 } opcode_sentinels; 144 145 #define UNDEFINED_INSTRUCTION "\t\t; <UNDEFINED> instruction: %0-31x" 146 #define UNPREDICTABLE_INSTRUCTION "\t; <UNPREDICTABLE>" 147 148 /* Common coprocessor opcodes shared between Arm and Thumb-2. */ 149 150 static const struct opcode32 coprocessor_opcodes[] = 151 { 152 /* XScale instructions. */ 153 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 154 0x0e200010, 0x0fff0ff0, 155 "mia%c\tacc0, %0-3r, %12-15r"}, 156 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 157 0x0e280010, 0x0fff0ff0, 158 "miaph%c\tacc0, %0-3r, %12-15r"}, 159 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 160 0x0e2c0010, 0x0ffc0ff0, "mia%17'T%17`B%16'T%16`B%c\tacc0, %0-3r, %12-15r"}, 161 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 162 0x0c400000, 0x0ff00fff, "mar%c\tacc0, %12-15r, %16-19r"}, 163 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 164 0x0c500000, 0x0ff00fff, "mra%c\t%12-15r, %16-19r, acc0"}, 165 166 /* Intel Wireless MMX technology instructions. */ 167 {ARM_FEATURE_CORE_LOW (0), SENTINEL_IWMMXT_START, 0, "" }, 168 {ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT), 169 0x0e130130, 0x0f3f0fff, "tandc%22-23w%c\t%12-15r"}, 170 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 171 0x0e400010, 0x0ff00f3f, "tbcst%6-7w%c\t%16-19g, %12-15r"}, 172 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 173 0x0e130170, 0x0f3f0ff8, "textrc%22-23w%c\t%12-15r, #%0-2d"}, 174 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 175 0x0e100070, 0x0f300ff0, "textrm%3?su%22-23w%c\t%12-15r, %16-19g, #%0-2d"}, 176 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 177 0x0e600010, 0x0ff00f38, "tinsr%6-7w%c\t%16-19g, %12-15r, #%0-2d"}, 178 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 179 0x0e000110, 0x0ff00fff, "tmcr%c\t%16-19G, %12-15r"}, 180 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 181 0x0c400000, 0x0ff00ff0, "tmcrr%c\t%0-3g, %12-15r, %16-19r"}, 182 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 183 0x0e2c0010, 0x0ffc0e10, "tmia%17?tb%16?tb%c\t%5-8g, %0-3r, %12-15r"}, 184 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 185 0x0e200010, 0x0fff0e10, "tmia%c\t%5-8g, %0-3r, %12-15r"}, 186 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 187 0x0e280010, 0x0fff0e10, "tmiaph%c\t%5-8g, %0-3r, %12-15r"}, 188 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 189 0x0e100030, 0x0f300fff, "tmovmsk%22-23w%c\t%12-15r, %16-19g"}, 190 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 191 0x0e100110, 0x0ff00ff0, "tmrc%c\t%12-15r, %16-19G"}, 192 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 193 0x0c500000, 0x0ff00ff0, "tmrrc%c\t%12-15r, %16-19r, %0-3g"}, 194 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 195 0x0e130150, 0x0f3f0fff, "torc%22-23w%c\t%12-15r"}, 196 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 197 0x0e120190, 0x0f3f0fff, "torvsc%22-23w%c\t%12-15r"}, 198 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 199 0x0e2001c0, 0x0f300fff, "wabs%22-23w%c\t%12-15g, %16-19g"}, 200 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 201 0x0e0001c0, 0x0f300fff, "wacc%22-23w%c\t%12-15g, %16-19g"}, 202 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 203 0x0e000180, 0x0f000ff0, "wadd%20-23w%c\t%12-15g, %16-19g, %0-3g"}, 204 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 205 0x0e2001a0, 0x0fb00ff0, "waddbhus%22?ml%c\t%12-15g, %16-19g, %0-3g"}, 206 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 207 0x0ea001a0, 0x0ff00ff0, "waddsubhx%c\t%12-15g, %16-19g, %0-3g"}, 208 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 209 0x0e000020, 0x0f800ff0, "waligni%c\t%12-15g, %16-19g, %0-3g, #%20-22d"}, 210 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 211 0x0e800020, 0x0fc00ff0, "walignr%20-21d%c\t%12-15g, %16-19g, %0-3g"}, 212 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 213 0x0e200000, 0x0fe00ff0, "wand%20'n%c\t%12-15g, %16-19g, %0-3g"}, 214 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 215 0x0e800000, 0x0fa00ff0, "wavg2%22?hb%20'r%c\t%12-15g, %16-19g, %0-3g"}, 216 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 217 0x0e400000, 0x0fe00ff0, "wavg4%20'r%c\t%12-15g, %16-19g, %0-3g"}, 218 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 219 0x0e000060, 0x0f300ff0, "wcmpeq%22-23w%c\t%12-15g, %16-19g, %0-3g"}, 220 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 221 0x0e100060, 0x0f100ff0, "wcmpgt%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"}, 222 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 223 0xfc500100, 0xfe500f00, "wldrd\t%12-15g, %r"}, 224 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 225 0xfc100100, 0xfe500f00, "wldrw\t%12-15G, %A"}, 226 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 227 0x0c100000, 0x0e100e00, "wldr%L%c\t%12-15g, %l"}, 228 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 229 0x0e400100, 0x0fc00ff0, "wmac%21?su%20'z%c\t%12-15g, %16-19g, %0-3g"}, 230 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 231 0x0e800100, 0x0fc00ff0, "wmadd%21?su%20'x%c\t%12-15g, %16-19g, %0-3g"}, 232 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 233 0x0ec00100, 0x0fd00ff0, "wmadd%21?sun%c\t%12-15g, %16-19g, %0-3g"}, 234 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 235 0x0e000160, 0x0f100ff0, "wmax%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"}, 236 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 237 0x0e000080, 0x0f100fe0, "wmerge%c\t%12-15g, %16-19g, %0-3g, #%21-23d"}, 238 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 239 0x0e0000a0, 0x0f800ff0, "wmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"}, 240 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 241 0x0e800120, 0x0f800ff0, 242 "wmiaw%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"}, 243 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 244 0x0e100160, 0x0f100ff0, "wmin%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"}, 245 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 246 0x0e000100, 0x0fc00ff0, "wmul%21?su%20?ml%23'r%c\t%12-15g, %16-19g, %0-3g"}, 247 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 248 0x0ed00100, 0x0fd00ff0, "wmul%21?sumr%c\t%12-15g, %16-19g, %0-3g"}, 249 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 250 0x0ee000c0, 0x0fe00ff0, "wmulwsm%20`r%c\t%12-15g, %16-19g, %0-3g"}, 251 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 252 0x0ec000c0, 0x0fe00ff0, "wmulwum%20`r%c\t%12-15g, %16-19g, %0-3g"}, 253 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 254 0x0eb000c0, 0x0ff00ff0, "wmulwl%c\t%12-15g, %16-19g, %0-3g"}, 255 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 256 0x0e8000a0, 0x0f800ff0, 257 "wqmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"}, 258 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 259 0x0e100080, 0x0fd00ff0, "wqmulm%21'r%c\t%12-15g, %16-19g, %0-3g"}, 260 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 261 0x0ec000e0, 0x0fd00ff0, "wqmulwm%21'r%c\t%12-15g, %16-19g, %0-3g"}, 262 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 263 0x0e000000, 0x0ff00ff0, "wor%c\t%12-15g, %16-19g, %0-3g"}, 264 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 265 0x0e000080, 0x0f000ff0, "wpack%20-23w%c\t%12-15g, %16-19g, %0-3g"}, 266 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 267 0xfe300040, 0xff300ef0, "wror%22-23w\t%12-15g, %16-19g, #%i"}, 268 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 269 0x0e300040, 0x0f300ff0, "wror%22-23w%c\t%12-15g, %16-19g, %0-3g"}, 270 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 271 0x0e300140, 0x0f300ff0, "wror%22-23wg%c\t%12-15g, %16-19g, %0-3G"}, 272 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 273 0x0e000120, 0x0fa00ff0, "wsad%22?hb%20'z%c\t%12-15g, %16-19g, %0-3g"}, 274 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 275 0x0e0001e0, 0x0f000ff0, "wshufh%c\t%12-15g, %16-19g, #%Z"}, 276 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 277 0xfe100040, 0xff300ef0, "wsll%22-23w\t%12-15g, %16-19g, #%i"}, 278 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 279 0x0e100040, 0x0f300ff0, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"}, 280 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 281 0x0e100148, 0x0f300ffc, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"}, 282 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 283 0xfe000040, 0xff300ef0, "wsra%22-23w\t%12-15g, %16-19g, #%i"}, 284 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 285 0x0e000040, 0x0f300ff0, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"}, 286 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 287 0x0e000148, 0x0f300ffc, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"}, 288 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 289 0xfe200040, 0xff300ef0, "wsrl%22-23w\t%12-15g, %16-19g, #%i"}, 290 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 291 0x0e200040, 0x0f300ff0, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"}, 292 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 293 0x0e200148, 0x0f300ffc, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"}, 294 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 295 0xfc400100, 0xfe500f00, "wstrd\t%12-15g, %r"}, 296 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 297 0xfc000100, 0xfe500f00, "wstrw\t%12-15G, %A"}, 298 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 299 0x0c000000, 0x0e100e00, "wstr%L%c\t%12-15g, %l"}, 300 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 301 0x0e0001a0, 0x0f000ff0, "wsub%20-23w%c\t%12-15g, %16-19g, %0-3g"}, 302 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 303 0x0ed001c0, 0x0ff00ff0, "wsubaddhx%c\t%12-15g, %16-19g, %0-3g"}, 304 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 305 0x0e1001c0, 0x0f300ff0, "wabsdiff%22-23w%c\t%12-15g, %16-19g, %0-3g"}, 306 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 307 0x0e0000c0, 0x0fd00fff, "wunpckeh%21?sub%c\t%12-15g, %16-19g"}, 308 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 309 0x0e4000c0, 0x0fd00fff, "wunpckeh%21?suh%c\t%12-15g, %16-19g"}, 310 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 311 0x0e8000c0, 0x0fd00fff, "wunpckeh%21?suw%c\t%12-15g, %16-19g"}, 312 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 313 0x0e0000e0, 0x0f100fff, "wunpckel%21?su%22-23w%c\t%12-15g, %16-19g"}, 314 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 315 0x0e1000c0, 0x0f300ff0, "wunpckih%22-23w%c\t%12-15g, %16-19g, %0-3g"}, 316 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 317 0x0e1000e0, 0x0f300ff0, "wunpckil%22-23w%c\t%12-15g, %16-19g, %0-3g"}, 318 {ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), 319 0x0e100000, 0x0ff00ff0, "wxor%c\t%12-15g, %16-19g, %0-3g"}, 320 {ARM_FEATURE_CORE_LOW (0), 321 SENTINEL_IWMMXT_END, 0, "" }, 322 323 /* Floating point coprocessor (FPA) instructions. */ 324 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 325 0x0e000100, 0x0ff08f10, "adf%c%P%R\t%12-14f, %16-18f, %0-3f"}, 326 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 327 0x0e100100, 0x0ff08f10, "muf%c%P%R\t%12-14f, %16-18f, %0-3f"}, 328 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 329 0x0e200100, 0x0ff08f10, "suf%c%P%R\t%12-14f, %16-18f, %0-3f"}, 330 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 331 0x0e300100, 0x0ff08f10, "rsf%c%P%R\t%12-14f, %16-18f, %0-3f"}, 332 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 333 0x0e400100, 0x0ff08f10, "dvf%c%P%R\t%12-14f, %16-18f, %0-3f"}, 334 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 335 0x0e500100, 0x0ff08f10, "rdf%c%P%R\t%12-14f, %16-18f, %0-3f"}, 336 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 337 0x0e600100, 0x0ff08f10, "pow%c%P%R\t%12-14f, %16-18f, %0-3f"}, 338 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 339 0x0e700100, 0x0ff08f10, "rpw%c%P%R\t%12-14f, %16-18f, %0-3f"}, 340 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 341 0x0e800100, 0x0ff08f10, "rmf%c%P%R\t%12-14f, %16-18f, %0-3f"}, 342 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 343 0x0e900100, 0x0ff08f10, "fml%c%P%R\t%12-14f, %16-18f, %0-3f"}, 344 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 345 0x0ea00100, 0x0ff08f10, "fdv%c%P%R\t%12-14f, %16-18f, %0-3f"}, 346 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 347 0x0eb00100, 0x0ff08f10, "frd%c%P%R\t%12-14f, %16-18f, %0-3f"}, 348 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 349 0x0ec00100, 0x0ff08f10, "pol%c%P%R\t%12-14f, %16-18f, %0-3f"}, 350 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 351 0x0e008100, 0x0ff08f10, "mvf%c%P%R\t%12-14f, %0-3f"}, 352 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 353 0x0e108100, 0x0ff08f10, "mnf%c%P%R\t%12-14f, %0-3f"}, 354 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 355 0x0e208100, 0x0ff08f10, "abs%c%P%R\t%12-14f, %0-3f"}, 356 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 357 0x0e308100, 0x0ff08f10, "rnd%c%P%R\t%12-14f, %0-3f"}, 358 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 359 0x0e408100, 0x0ff08f10, "sqt%c%P%R\t%12-14f, %0-3f"}, 360 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 361 0x0e508100, 0x0ff08f10, "log%c%P%R\t%12-14f, %0-3f"}, 362 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 363 0x0e608100, 0x0ff08f10, "lgn%c%P%R\t%12-14f, %0-3f"}, 364 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 365 0x0e708100, 0x0ff08f10, "exp%c%P%R\t%12-14f, %0-3f"}, 366 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 367 0x0e808100, 0x0ff08f10, "sin%c%P%R\t%12-14f, %0-3f"}, 368 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 369 0x0e908100, 0x0ff08f10, "cos%c%P%R\t%12-14f, %0-3f"}, 370 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 371 0x0ea08100, 0x0ff08f10, "tan%c%P%R\t%12-14f, %0-3f"}, 372 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 373 0x0eb08100, 0x0ff08f10, "asn%c%P%R\t%12-14f, %0-3f"}, 374 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 375 0x0ec08100, 0x0ff08f10, "acs%c%P%R\t%12-14f, %0-3f"}, 376 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 377 0x0ed08100, 0x0ff08f10, "atn%c%P%R\t%12-14f, %0-3f"}, 378 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 379 0x0ee08100, 0x0ff08f10, "urd%c%P%R\t%12-14f, %0-3f"}, 380 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 381 0x0ef08100, 0x0ff08f10, "nrm%c%P%R\t%12-14f, %0-3f"}, 382 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 383 0x0e000110, 0x0ff00f1f, "flt%c%P%R\t%16-18f, %12-15r"}, 384 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 385 0x0e100110, 0x0fff0f98, "fix%c%R\t%12-15r, %0-2f"}, 386 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 387 0x0e200110, 0x0fff0fff, "wfs%c\t%12-15r"}, 388 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 389 0x0e300110, 0x0fff0fff, "rfs%c\t%12-15r"}, 390 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 391 0x0e400110, 0x0fff0fff, "wfc%c\t%12-15r"}, 392 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 393 0x0e500110, 0x0fff0fff, "rfc%c\t%12-15r"}, 394 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 395 0x0e90f110, 0x0ff8fff0, "cmf%c\t%16-18f, %0-3f"}, 396 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 397 0x0eb0f110, 0x0ff8fff0, "cnf%c\t%16-18f, %0-3f"}, 398 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 399 0x0ed0f110, 0x0ff8fff0, "cmfe%c\t%16-18f, %0-3f"}, 400 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 401 0x0ef0f110, 0x0ff8fff0, "cnfe%c\t%16-18f, %0-3f"}, 402 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 403 0x0c000100, 0x0e100f00, "stf%c%Q\t%12-14f, %A"}, 404 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V1), 405 0x0c100100, 0x0e100f00, "ldf%c%Q\t%12-14f, %A"}, 406 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V2), 407 0x0c000200, 0x0e100f00, "sfm%c\t%12-14f, %F, %A"}, 408 {ARM_FEATURE_COPROC (FPU_FPA_EXT_V2), 409 0x0c100200, 0x0e100f00, "lfm%c\t%12-14f, %F, %A"}, 410 411 /* ARMv8-M Mainline Security Extensions instructions. */ 412 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN), 413 0xec300a00, 0xfff0ffff, "vlldm\t%16-19r"}, 414 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN), 415 0xec200a00, 0xfff0ffff, "vlstm\t%16-19r"}, 416 417 /* Register load/store. */ 418 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1), 419 0x0d2d0b00, 0x0fbf0f01, "vpush%c\t%B"}, 420 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1), 421 0x0d200b00, 0x0fb00f01, "vstmdb%c\t%16-19r!, %B"}, 422 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1), 423 0x0d300b00, 0x0fb00f01, "vldmdb%c\t%16-19r!, %B"}, 424 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1), 425 0x0c800b00, 0x0f900f01, "vstmia%c\t%16-19r%21'!, %B"}, 426 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1), 427 0x0cbd0b00, 0x0fbf0f01, "vpop%c\t%B"}, 428 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1), 429 0x0c900b00, 0x0f900f01, "vldmia%c\t%16-19r%21'!, %B"}, 430 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1), 431 0x0d000b00, 0x0f300f00, "vstr%c\t%12-15,22D, %A"}, 432 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD | FPU_NEON_EXT_V1), 433 0x0d100b00, 0x0f300f00, "vldr%c\t%12-15,22D, %A"}, 434 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 435 0x0d2d0a00, 0x0fbf0f00, "vpush%c\t%y3"}, 436 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 437 0x0d200a00, 0x0fb00f00, "vstmdb%c\t%16-19r!, %y3"}, 438 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 439 0x0d300a00, 0x0fb00f00, "vldmdb%c\t%16-19r!, %y3"}, 440 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 441 0x0c800a00, 0x0f900f00, "vstmia%c\t%16-19r%21'!, %y3"}, 442 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 443 0x0cbd0a00, 0x0fbf0f00, "vpop%c\t%y3"}, 444 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 445 0x0c900a00, 0x0f900f00, "vldmia%c\t%16-19r%21'!, %y3"}, 446 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 447 0x0d000a00, 0x0f300f00, "vstr%c\t%y1, %A"}, 448 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 449 0x0d100a00, 0x0f300f00, "vldr%c\t%y1, %A"}, 450 451 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 452 0x0d200b01, 0x0fb00f01, "fstmdbx%c\t%16-19r!, %z3\t;@ Deprecated"}, 453 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 454 0x0d300b01, 0x0fb00f01, "fldmdbx%c\t%16-19r!, %z3\t;@ Deprecated"}, 455 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 456 0x0c800b01, 0x0f900f01, "fstmiax%c\t%16-19r%21'!, %z3\t;@ Deprecated"}, 457 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 458 0x0c900b01, 0x0f900f01, "fldmiax%c\t%16-19r%21'!, %z3\t;@ Deprecated"}, 459 460 /* Data transfer between ARM and NEON registers. */ 461 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 462 0x0e800b10, 0x0ff00f70, "vdup%c.32\t%16-19,7D, %12-15r"}, 463 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 464 0x0e800b30, 0x0ff00f70, "vdup%c.16\t%16-19,7D, %12-15r"}, 465 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 466 0x0ea00b10, 0x0ff00f70, "vdup%c.32\t%16-19,7Q, %12-15r"}, 467 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 468 0x0ea00b30, 0x0ff00f70, "vdup%c.16\t%16-19,7Q, %12-15r"}, 469 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 470 0x0ec00b10, 0x0ff00f70, "vdup%c.8\t%16-19,7D, %12-15r"}, 471 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 472 0x0ee00b10, 0x0ff00f70, "vdup%c.8\t%16-19,7Q, %12-15r"}, 473 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 474 0x0c400b10, 0x0ff00fd0, "vmov%c\t%0-3,5D, %12-15r, %16-19r"}, 475 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 476 0x0c500b10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %0-3,5D"}, 477 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 478 0x0e000b10, 0x0fd00f70, "vmov%c.32\t%16-19,7D[%21d], %12-15r"}, 479 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 480 0x0e100b10, 0x0f500f70, "vmov%c.32\t%12-15r, %16-19,7D[%21d]"}, 481 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 482 0x0e000b30, 0x0fd00f30, "vmov%c.16\t%16-19,7D[%6,21d], %12-15r"}, 483 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 484 0x0e100b30, 0x0f500f30, "vmov%c.%23?us16\t%12-15r, %16-19,7D[%6,21d]"}, 485 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 486 0x0e400b10, 0x0fd00f10, "vmov%c.8\t%16-19,7D[%5,6,21d], %12-15r"}, 487 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 488 0x0e500b10, 0x0f500f10, "vmov%c.%23?us8\t%12-15r, %16-19,7D[%5,6,21d]"}, 489 /* Half-precision conversion instructions. */ 490 {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 491 0x0eb20b40, 0x0fbf0f50, "vcvt%7?tb%c.f64.f16\t%z1, %y0"}, 492 {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 493 0x0eb30b40, 0x0fbf0f50, "vcvt%7?tb%c.f16.f64\t%y1, %z0"}, 494 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16), 495 0x0eb20a40, 0x0fbf0f50, "vcvt%7?tb%c.f32.f16\t%y1, %y0"}, 496 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16), 497 0x0eb30a40, 0x0fbf0f50, "vcvt%7?tb%c.f16.f32\t%y1, %y0"}, 498 499 /* Floating point coprocessor (VFP) instructions. */ 500 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 501 0x0ee00a10, 0x0fff0fff, "vmsr%c\tfpsid, %12-15r"}, 502 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 503 0x0ee10a10, 0x0fff0fff, "vmsr%c\tfpscr, %12-15r"}, 504 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 505 0x0ee60a10, 0x0fff0fff, "vmsr%c\tmvfr1, %12-15r"}, 506 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 507 0x0ee70a10, 0x0fff0fff, "vmsr%c\tmvfr0, %12-15r"}, 508 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 509 0x0ee80a10, 0x0fff0fff, "vmsr%c\tfpexc, %12-15r"}, 510 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 511 0x0ee90a10, 0x0fff0fff, "vmsr%c\tfpinst, %12-15r\t@ Impl def"}, 512 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 513 0x0eea0a10, 0x0fff0fff, "vmsr%c\tfpinst2, %12-15r\t@ Impl def"}, 514 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 515 0x0ef00a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpsid"}, 516 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 517 0x0ef1fa10, 0x0fffffff, "vmrs%c\tAPSR_nzcv, fpscr"}, 518 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 519 0x0ef10a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpscr"}, 520 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 521 0x0ef60a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr1"}, 522 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 523 0x0ef70a10, 0x0fff0fff, "vmrs%c\t%12-15r, mvfr0"}, 524 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 525 0x0ef80a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpexc"}, 526 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 527 0x0ef90a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpinst\t@ Impl def"}, 528 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 529 0x0efa0a10, 0x0fff0fff, "vmrs%c\t%12-15r, fpinst2\t@ Impl def"}, 530 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 531 0x0e000b10, 0x0fd00fff, "vmov%c.32\t%z2[%21d], %12-15r"}, 532 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 533 0x0e100b10, 0x0fd00fff, "vmov%c.32\t%12-15r, %z2[%21d]"}, 534 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 535 0x0ee00a10, 0x0ff00fff, "vmsr%c\t<impl def %16-19x>, %12-15r"}, 536 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 537 0x0ef00a10, 0x0ff00fff, "vmrs%c\t%12-15r, <impl def %16-19x>"}, 538 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 539 0x0e000a10, 0x0ff00f7f, "vmov%c\t%y2, %12-15r"}, 540 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 541 0x0e100a10, 0x0ff00f7f, "vmov%c\t%12-15r, %y2"}, 542 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 543 0x0eb50a40, 0x0fbf0f70, "vcmp%7'e%c.f32\t%y1, #0.0"}, 544 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 545 0x0eb50b40, 0x0fbf0f70, "vcmp%7'e%c.f64\t%z1, #0.0"}, 546 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 547 0x0eb00a40, 0x0fbf0fd0, "vmov%c.f32\t%y1, %y0"}, 548 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 549 0x0eb00ac0, 0x0fbf0fd0, "vabs%c.f32\t%y1, %y0"}, 550 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 551 0x0eb00b40, 0x0fbf0fd0, "vmov%c.f64\t%z1, %z0"}, 552 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 553 0x0eb00bc0, 0x0fbf0fd0, "vabs%c.f64\t%z1, %z0"}, 554 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 555 0x0eb10a40, 0x0fbf0fd0, "vneg%c.f32\t%y1, %y0"}, 556 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 557 0x0eb10ac0, 0x0fbf0fd0, "vsqrt%c.f32\t%y1, %y0"}, 558 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 559 0x0eb10b40, 0x0fbf0fd0, "vneg%c.f64\t%z1, %z0"}, 560 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 561 0x0eb10bc0, 0x0fbf0fd0, "vsqrt%c.f64\t%z1, %z0"}, 562 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 563 0x0eb70ac0, 0x0fbf0fd0, "vcvt%c.f64.f32\t%z1, %y0"}, 564 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 565 0x0eb70bc0, 0x0fbf0fd0, "vcvt%c.f32.f64\t%y1, %z0"}, 566 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 567 0x0eb80a40, 0x0fbf0f50, "vcvt%c.f32.%7?su32\t%y1, %y0"}, 568 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 569 0x0eb80b40, 0x0fbf0f50, "vcvt%c.f64.%7?su32\t%z1, %y0"}, 570 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 571 0x0eb40a40, 0x0fbf0f50, "vcmp%7'e%c.f32\t%y1, %y0"}, 572 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 573 0x0eb40b40, 0x0fbf0f50, "vcmp%7'e%c.f64\t%z1, %z0"}, 574 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD), 575 0x0eba0a40, 0x0fbe0f50, "vcvt%c.f32.%16?us%7?31%7?26\t%y1, %y1, #%5,0-3k"}, 576 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V3), 577 0x0eba0b40, 0x0fbe0f50, "vcvt%c.f64.%16?us%7?31%7?26\t%z1, %z1, #%5,0-3k"}, 578 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 579 0x0ebc0a40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f32\t%y1, %y0"}, 580 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 581 0x0ebc0b40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f64\t%y1, %z0"}, 582 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD), 583 0x0ebe0a40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f32\t%y1, %y1, #%5,0-3k"}, 584 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V3), 585 0x0ebe0b40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f64\t%z1, %z1, #%5,0-3k"}, 586 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 587 0x0c500b10, 0x0fb00ff0, "vmov%c\t%12-15r, %16-19r, %z0"}, 588 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD), 589 0x0eb00a00, 0x0fb00ff0, "vmov%c.f32\t%y1, #%0-3,16-19E"}, 590 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V3), 591 0x0eb00b00, 0x0fb00ff0, "vmov%c.f64\t%z1, #%0-3,16-19E"}, 592 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V2), 593 0x0c400a10, 0x0ff00fd0, "vmov%c\t%y4, %12-15r, %16-19r"}, 594 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V2), 595 0x0c400b10, 0x0ff00fd0, "vmov%c\t%z0, %12-15r, %16-19r"}, 596 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V2), 597 0x0c500a10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %y4"}, 598 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 599 0x0e000a00, 0x0fb00f50, "vmla%c.f32\t%y1, %y2, %y0"}, 600 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 601 0x0e000a40, 0x0fb00f50, "vmls%c.f32\t%y1, %y2, %y0"}, 602 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 603 0x0e000b00, 0x0fb00f50, "vmla%c.f64\t%z1, %z2, %z0"}, 604 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 605 0x0e000b40, 0x0fb00f50, "vmls%c.f64\t%z1, %z2, %z0"}, 606 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 607 0x0e100a00, 0x0fb00f50, "vnmls%c.f32\t%y1, %y2, %y0"}, 608 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 609 0x0e100a40, 0x0fb00f50, "vnmla%c.f32\t%y1, %y2, %y0"}, 610 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 611 0x0e100b00, 0x0fb00f50, "vnmls%c.f64\t%z1, %z2, %z0"}, 612 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 613 0x0e100b40, 0x0fb00f50, "vnmla%c.f64\t%z1, %z2, %z0"}, 614 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 615 0x0e200a00, 0x0fb00f50, "vmul%c.f32\t%y1, %y2, %y0"}, 616 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 617 0x0e200a40, 0x0fb00f50, "vnmul%c.f32\t%y1, %y2, %y0"}, 618 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 619 0x0e200b00, 0x0fb00f50, "vmul%c.f64\t%z1, %z2, %z0"}, 620 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 621 0x0e200b40, 0x0fb00f50, "vnmul%c.f64\t%z1, %z2, %z0"}, 622 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 623 0x0e300a00, 0x0fb00f50, "vadd%c.f32\t%y1, %y2, %y0"}, 624 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 625 0x0e300a40, 0x0fb00f50, "vsub%c.f32\t%y1, %y2, %y0"}, 626 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 627 0x0e300b00, 0x0fb00f50, "vadd%c.f64\t%z1, %z2, %z0"}, 628 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 629 0x0e300b40, 0x0fb00f50, "vsub%c.f64\t%z1, %z2, %z0"}, 630 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD), 631 0x0e800a00, 0x0fb00f50, "vdiv%c.f32\t%y1, %y2, %y0"}, 632 {ARM_FEATURE_COPROC (FPU_VFP_EXT_V1), 633 0x0e800b00, 0x0fb00f50, "vdiv%c.f64\t%z1, %z2, %z0"}, 634 635 /* Cirrus coprocessor instructions. */ 636 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 637 0x0d100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"}, 638 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 639 0x0c100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"}, 640 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 641 0x0d500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"}, 642 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 643 0x0c500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"}, 644 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 645 0x0d100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"}, 646 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 647 0x0c100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"}, 648 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 649 0x0d500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"}, 650 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 651 0x0c500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"}, 652 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 653 0x0d000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"}, 654 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 655 0x0c000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"}, 656 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 657 0x0d400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"}, 658 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 659 0x0c400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"}, 660 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 661 0x0d000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"}, 662 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 663 0x0c000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"}, 664 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 665 0x0d400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"}, 666 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 667 0x0c400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"}, 668 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 669 0x0e000450, 0x0ff00ff0, "cfmvsr%c\tmvf%16-19d, %12-15r"}, 670 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 671 0x0e100450, 0x0ff00ff0, "cfmvrs%c\t%12-15r, mvf%16-19d"}, 672 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 673 0x0e000410, 0x0ff00ff0, "cfmvdlr%c\tmvd%16-19d, %12-15r"}, 674 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 675 0x0e100410, 0x0ff00ff0, "cfmvrdl%c\t%12-15r, mvd%16-19d"}, 676 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 677 0x0e000430, 0x0ff00ff0, "cfmvdhr%c\tmvd%16-19d, %12-15r"}, 678 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 679 0x0e100430, 0x0ff00fff, "cfmvrdh%c\t%12-15r, mvd%16-19d"}, 680 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 681 0x0e000510, 0x0ff00fff, "cfmv64lr%c\tmvdx%16-19d, %12-15r"}, 682 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 683 0x0e100510, 0x0ff00fff, "cfmvr64l%c\t%12-15r, mvdx%16-19d"}, 684 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 685 0x0e000530, 0x0ff00fff, "cfmv64hr%c\tmvdx%16-19d, %12-15r"}, 686 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 687 0x0e100530, 0x0ff00fff, "cfmvr64h%c\t%12-15r, mvdx%16-19d"}, 688 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 689 0x0e200440, 0x0ff00fff, "cfmval32%c\tmvax%12-15d, mvfx%16-19d"}, 690 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 691 0x0e100440, 0x0ff00fff, "cfmv32al%c\tmvfx%12-15d, mvax%16-19d"}, 692 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 693 0x0e200460, 0x0ff00fff, "cfmvam32%c\tmvax%12-15d, mvfx%16-19d"}, 694 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 695 0x0e100460, 0x0ff00fff, "cfmv32am%c\tmvfx%12-15d, mvax%16-19d"}, 696 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 697 0x0e200480, 0x0ff00fff, "cfmvah32%c\tmvax%12-15d, mvfx%16-19d"}, 698 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 699 0x0e100480, 0x0ff00fff, "cfmv32ah%c\tmvfx%12-15d, mvax%16-19d"}, 700 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 701 0x0e2004a0, 0x0ff00fff, "cfmva32%c\tmvax%12-15d, mvfx%16-19d"}, 702 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 703 0x0e1004a0, 0x0ff00fff, "cfmv32a%c\tmvfx%12-15d, mvax%16-19d"}, 704 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 705 0x0e2004c0, 0x0ff00fff, "cfmva64%c\tmvax%12-15d, mvdx%16-19d"}, 706 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 707 0x0e1004c0, 0x0ff00fff, "cfmv64a%c\tmvdx%12-15d, mvax%16-19d"}, 708 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 709 0x0e2004e0, 0x0fff0fff, "cfmvsc32%c\tdspsc, mvdx%12-15d"}, 710 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 711 0x0e1004e0, 0x0fff0fff, "cfmv32sc%c\tmvdx%12-15d, dspsc"}, 712 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 713 0x0e000400, 0x0ff00fff, "cfcpys%c\tmvf%12-15d, mvf%16-19d"}, 714 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 715 0x0e000420, 0x0ff00fff, "cfcpyd%c\tmvd%12-15d, mvd%16-19d"}, 716 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 717 0x0e000460, 0x0ff00fff, "cfcvtsd%c\tmvd%12-15d, mvf%16-19d"}, 718 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 719 0x0e000440, 0x0ff00fff, "cfcvtds%c\tmvf%12-15d, mvd%16-19d"}, 720 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 721 0x0e000480, 0x0ff00fff, "cfcvt32s%c\tmvf%12-15d, mvfx%16-19d"}, 722 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 723 0x0e0004a0, 0x0ff00fff, "cfcvt32d%c\tmvd%12-15d, mvfx%16-19d"}, 724 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 725 0x0e0004c0, 0x0ff00fff, "cfcvt64s%c\tmvf%12-15d, mvdx%16-19d"}, 726 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 727 0x0e0004e0, 0x0ff00fff, "cfcvt64d%c\tmvd%12-15d, mvdx%16-19d"}, 728 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 729 0x0e100580, 0x0ff00fff, "cfcvts32%c\tmvfx%12-15d, mvf%16-19d"}, 730 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 731 0x0e1005a0, 0x0ff00fff, "cfcvtd32%c\tmvfx%12-15d, mvd%16-19d"}, 732 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 733 0x0e1005c0, 0x0ff00fff, "cftruncs32%c\tmvfx%12-15d, mvf%16-19d"}, 734 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 735 0x0e1005e0, 0x0ff00fff, "cftruncd32%c\tmvfx%12-15d, mvd%16-19d"}, 736 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 737 0x0e000550, 0x0ff00ff0, "cfrshl32%c\tmvfx%16-19d, mvfx%0-3d, %12-15r"}, 738 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 739 0x0e000570, 0x0ff00ff0, "cfrshl64%c\tmvdx%16-19d, mvdx%0-3d, %12-15r"}, 740 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 741 0x0e000500, 0x0ff00f10, "cfsh32%c\tmvfx%12-15d, mvfx%16-19d, #%I"}, 742 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 743 0x0e200500, 0x0ff00f10, "cfsh64%c\tmvdx%12-15d, mvdx%16-19d, #%I"}, 744 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 745 0x0e100490, 0x0ff00ff0, "cfcmps%c\t%12-15r, mvf%16-19d, mvf%0-3d"}, 746 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 747 0x0e1004b0, 0x0ff00ff0, "cfcmpd%c\t%12-15r, mvd%16-19d, mvd%0-3d"}, 748 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 749 0x0e100590, 0x0ff00ff0, "cfcmp32%c\t%12-15r, mvfx%16-19d, mvfx%0-3d"}, 750 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 751 0x0e1005b0, 0x0ff00ff0, "cfcmp64%c\t%12-15r, mvdx%16-19d, mvdx%0-3d"}, 752 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 753 0x0e300400, 0x0ff00fff, "cfabss%c\tmvf%12-15d, mvf%16-19d"}, 754 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 755 0x0e300420, 0x0ff00fff, "cfabsd%c\tmvd%12-15d, mvd%16-19d"}, 756 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 757 0x0e300440, 0x0ff00fff, "cfnegs%c\tmvf%12-15d, mvf%16-19d"}, 758 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 759 0x0e300460, 0x0ff00fff, "cfnegd%c\tmvd%12-15d, mvd%16-19d"}, 760 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 761 0x0e300480, 0x0ff00ff0, "cfadds%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"}, 762 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 763 0x0e3004a0, 0x0ff00ff0, "cfaddd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"}, 764 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 765 0x0e3004c0, 0x0ff00ff0, "cfsubs%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"}, 766 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 767 0x0e3004e0, 0x0ff00ff0, "cfsubd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"}, 768 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 769 0x0e100400, 0x0ff00ff0, "cfmuls%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"}, 770 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 771 0x0e100420, 0x0ff00ff0, "cfmuld%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"}, 772 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 773 0x0e300500, 0x0ff00fff, "cfabs32%c\tmvfx%12-15d, mvfx%16-19d"}, 774 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 775 0x0e300520, 0x0ff00fff, "cfabs64%c\tmvdx%12-15d, mvdx%16-19d"}, 776 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 777 0x0e300540, 0x0ff00fff, "cfneg32%c\tmvfx%12-15d, mvfx%16-19d"}, 778 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 779 0x0e300560, 0x0ff00fff, "cfneg64%c\tmvdx%12-15d, mvdx%16-19d"}, 780 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 781 0x0e300580, 0x0ff00ff0, "cfadd32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"}, 782 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 783 0x0e3005a0, 0x0ff00ff0, "cfadd64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"}, 784 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 785 0x0e3005c0, 0x0ff00ff0, "cfsub32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"}, 786 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 787 0x0e3005e0, 0x0ff00ff0, "cfsub64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"}, 788 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 789 0x0e100500, 0x0ff00ff0, "cfmul32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"}, 790 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 791 0x0e100520, 0x0ff00ff0, "cfmul64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"}, 792 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 793 0x0e100540, 0x0ff00ff0, "cfmac32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"}, 794 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 795 0x0e100560, 0x0ff00ff0, "cfmsc32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"}, 796 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 797 0x0e000600, 0x0ff00f10, 798 "cfmadd32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"}, 799 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 800 0x0e100600, 0x0ff00f10, 801 "cfmsub32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"}, 802 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 803 0x0e200600, 0x0ff00f10, 804 "cfmadda32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"}, 805 {ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), 806 0x0e300600, 0x0ff00f10, 807 "cfmsuba32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"}, 808 809 /* VFP Fused multiply add instructions. */ 810 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA), 811 0x0ea00a00, 0x0fb00f50, "vfma%c.f32\t%y1, %y2, %y0"}, 812 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA), 813 0x0ea00b00, 0x0fb00f50, "vfma%c.f64\t%z1, %z2, %z0"}, 814 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA), 815 0x0ea00a40, 0x0fb00f50, "vfms%c.f32\t%y1, %y2, %y0"}, 816 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA), 817 0x0ea00b40, 0x0fb00f50, "vfms%c.f64\t%z1, %z2, %z0"}, 818 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA), 819 0x0e900a40, 0x0fb00f50, "vfnma%c.f32\t%y1, %y2, %y0"}, 820 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA), 821 0x0e900b40, 0x0fb00f50, "vfnma%c.f64\t%z1, %z2, %z0"}, 822 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA), 823 0x0e900a00, 0x0fb00f50, "vfnms%c.f32\t%y1, %y2, %y0"}, 824 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA), 825 0x0e900b00, 0x0fb00f50, "vfnms%c.f64\t%z1, %z2, %z0"}, 826 827 /* FP v5. */ 828 {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 829 0xfe000a00, 0xff800f50, "vsel%20-21c%u.f32\t%y1, %y2, %y0"}, 830 {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 831 0xfe000b00, 0xff800f50, "vsel%20-21c%u.f64\t%z1, %z2, %z0"}, 832 {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 833 0xfe800a00, 0xffb00f50, "vmaxnm%u.f32\t%y1, %y2, %y0"}, 834 {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 835 0xfe800b00, 0xffb00f50, "vmaxnm%u.f64\t%z1, %z2, %z0"}, 836 {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 837 0xfe800a40, 0xffb00f50, "vminnm%u.f32\t%y1, %y2, %y0"}, 838 {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 839 0xfe800b40, 0xffb00f50, "vminnm%u.f64\t%z1, %z2, %z0"}, 840 {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 841 0xfebc0a40, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f32\t%y1, %y0"}, 842 {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 843 0xfebc0b40, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f64\t%y1, %z0"}, 844 {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 845 0x0eb60a40, 0x0fbe0f50, "vrint%7,16??xzr%c.f32\t%y1, %y0"}, 846 {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 847 0x0eb60b40, 0x0fbe0f50, "vrint%7,16??xzr%c.f64\t%z1, %z0"}, 848 {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 849 0xfeb80a40, 0xffbc0fd0, "vrint%16-17?mpna%u.f32\t%y1, %y0"}, 850 {ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8), 851 0xfeb80b40, 0xffbc0fd0, "vrint%16-17?mpna%u.f64\t%z1, %z0"}, 852 853 /* Generic coprocessor instructions. */ 854 {ARM_FEATURE_CORE_LOW (0), SENTINEL_GENERIC_START, 0, "" }, 855 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E), 856 0x0c400000, 0x0ff00000, "mcrr%c\t%8-11d, %4-7d, %12-15R, %16-19r, cr%0-3d"}, 857 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E), 858 0x0c500000, 0x0ff00000, 859 "mrrc%c\t%8-11d, %4-7d, %12-15Ru, %16-19Ru, cr%0-3d"}, 860 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2), 861 0x0e000000, 0x0f000010, 862 "cdp%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"}, 863 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2), 864 0x0e10f010, 0x0f10f010, 865 "mrc%c\t%8-11d, %21-23d, APSR_nzcv, cr%16-19d, cr%0-3d, {%5-7d}"}, 866 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2), 867 0x0e100010, 0x0f100010, 868 "mrc%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"}, 869 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2), 870 0x0e000010, 0x0f100010, 871 "mcr%c\t%8-11d, %21-23d, %12-15R, cr%16-19d, cr%0-3d, {%5-7d}"}, 872 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2), 873 0x0c000000, 0x0e100000, "stc%22'l%c\t%8-11d, cr%12-15d, %A"}, 874 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2), 875 0x0c100000, 0x0e100000, "ldc%22'l%c\t%8-11d, cr%12-15d, %A"}, 876 877 /* V6 coprocessor instructions. */ 878 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 879 0xfc500000, 0xfff00000, 880 "mrrc2%c\t%8-11d, %4-7d, %12-15Ru, %16-19Ru, cr%0-3d"}, 881 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 882 0xfc400000, 0xfff00000, 883 "mcrr2%c\t%8-11d, %4-7d, %12-15R, %16-19R, cr%0-3d"}, 884 885 /* V5 coprocessor instructions. */ 886 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5), 887 0xfc100000, 0xfe100000, "ldc2%22'l%c\t%8-11d, cr%12-15d, %A"}, 888 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5), 889 0xfc000000, 0xfe100000, "stc2%22'l%c\t%8-11d, cr%12-15d, %A"}, 890 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5), 891 0xfe000000, 0xff000010, 892 "cdp2%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"}, 893 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5), 894 0xfe000010, 0xff100010, 895 "mcr2%c\t%8-11d, %21-23d, %12-15R, cr%16-19d, cr%0-3d, {%5-7d}"}, 896 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5), 897 0xfe100010, 0xff100010, 898 "mrc2%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"}, 899 900 /* ARMv8.2 half-precision Floating point coprocessor 9 (VFP) instructions. 901 cp_num: bit <11:8> == 0b1001. 902 cond: bit <31:28> == 0b1110, otherwise, it's UNPREDICTABLE. */ 903 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 904 0x0eb009c0, 0x0fbf0fd0, "vabs%c.f16\t%y1, %y0"}, 905 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 906 0x0e300900, 0x0fb00f50, "vadd%c.f16\t%y1, %y2, %y0"}, 907 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 908 0x0eb40940, 0x0fbf0f50, "vcmp%7'e%c.f16\t%y1, %y0"}, 909 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 910 0x0eb50940, 0x0fbf0f70, "vcmp%7'e%c.f16\t%y1, #0.0"}, 911 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 912 0x0eba09c0, 0x0fbe0fd0, "vcvt%c.f16.%16?us%7?31%7?26\t%y1, %y1, #%5,0-3k"}, 913 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 914 0x0ebe09c0, 0x0fbe0fd0, "vcvt%c.%16?us%7?31%7?26.f16\t%y1, %y1, #%5,0-3k"}, 915 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 916 0x0ebc0940, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f16\t%y1, %y0"}, 917 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 918 0x0eb80940, 0x0fbf0f50, "vcvt%c.f16.%7?su32\t%y1, %y0"}, 919 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 920 0xfebc0940, 0xffbc0f50, "vcvt%16-17?mpna%u.%7?su32.f16\t%y1, %y0"}, 921 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 922 0x0e800900, 0x0fb00f50, "vdiv%c.f16\t%y1, %y2, %y0"}, 923 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 924 0x0ea00900, 0x0fb00f50, "vfma%c.f16\t%y1, %y2, %y0"}, 925 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 926 0x0ea00940, 0x0fb00f50, "vfms%c.f16\t%y1, %y2, %y0"}, 927 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 928 0x0e900940, 0x0fb00f50, "vfnma%c.f16\t%y1, %y2, %y0"}, 929 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 930 0x0e900900, 0x0fb00f50, "vfnms%c.f16\t%y1, %y2, %y0"}, 931 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 932 0xfeb00ac0, 0xffbf0fd0, "vins.f16\t%y1, %y0"}, 933 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 934 0xfeb00a40, 0xffbf0fd0, "vmovx%c.f16\t%y1, %y0"}, 935 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 936 0x0d100900, 0x0f300f00, "vldr%c.16\t%y1, %A"}, 937 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 938 0x0d000900, 0x0f300f00, "vstr%c.16\t%y1, %A"}, 939 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 940 0xfe800900, 0xffb00f50, "vmaxnm%c.f16\t%y1, %y2, %y0"}, 941 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 942 0xfe800940, 0xffb00f50, "vminnm%c.f16\t%y1, %y2, %y0"}, 943 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 944 0x0e000900, 0x0fb00f50, "vmla%c.f16\t%y1, %y2, %y0"}, 945 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 946 0x0e000940, 0x0fb00f50, "vmls%c.f16\t%y1, %y2, %y0"}, 947 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 948 0x0e100910, 0x0ff00f7f, "vmov%c.f16\t%12-15r, %y2"}, 949 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 950 0x0e000910, 0x0ff00f7f, "vmov%c.f16\t%y2, %12-15r"}, 951 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 952 0xeb00900, 0x0fb00ff0, "vmov%c.f16\t%y1, #%0-3,16-19E"}, 953 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 954 0x0e200900, 0x0fb00f50, "vmul%c.f16\t%y1, %y2, %y0"}, 955 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 956 0x0eb10940, 0x0fbf0fd0, "vneg%c.f16\t%y1, %y0"}, 957 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 958 0x0e100940, 0x0fb00f50, "vnmla%c.f16\t%y1, %y2, %y0"}, 959 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 960 0x0e100900, 0x0fb00f50, "vnmls%c.f16\t%y1, %y2, %y0"}, 961 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 962 0x0e200940, 0x0fb00f50, "vnmul%c.f16\t%y1, %y2, %y0"}, 963 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 964 0x0eb60940, 0x0fbe0f50, "vrint%7,16??xzr%c.f16\t%y1, %y0"}, 965 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 966 0xfeb80940, 0xffbc0fd0, "vrint%16-17?mpna%u.f16\t%y1, %y0"}, 967 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 968 0xfe000900, 0xff800f50, "vsel%20-21c%u.f16\t%y1, %y2, %y0"}, 969 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 970 0x0eb109c0, 0x0fbf0fd0, "vsqrt%c.f16\t%y1, %y0"}, 971 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 972 0x0e300940, 0x0fb00f50, "vsub%c.f16\t%y1, %y2, %y0"}, 973 974 {ARM_FEATURE_CORE_LOW (0), 0, 0, 0} 975 }; 976 977 /* Neon opcode table: This does not encode the top byte -- that is 978 checked by the print_insn_neon routine, as it depends on whether we are 979 doing thumb32 or arm32 disassembly. */ 980 981 /* print_insn_neon recognizes the following format control codes: 982 983 %% % 984 985 %c print condition code 986 %u print condition code (unconditional in ARM mode, 987 UNPREDICTABLE if not AL in Thumb) 988 %A print v{st,ld}[1234] operands 989 %B print v{st,ld}[1234] any one operands 990 %C print v{st,ld}[1234] single->all operands 991 %D print scalar 992 %E print vmov, vmvn, vorr, vbic encoded constant 993 %F print vtbl,vtbx register list 994 995 %<bitfield>r print as an ARM register 996 %<bitfield>d print the bitfield in decimal 997 %<bitfield>e print the 2^N - bitfield in decimal 998 %<bitfield>D print as a NEON D register 999 %<bitfield>Q print as a NEON Q register 1000 %<bitfield>R print as a NEON D or Q register 1001 %<bitfield>Sn print byte scaled width limited by n 1002 %<bitfield>Tn print short scaled width limited by n 1003 %<bitfield>Un print long scaled width limited by n 1004 1005 %<bitfield>'c print specified char iff bitfield is all ones 1006 %<bitfield>`c print specified char iff bitfield is all zeroes 1007 %<bitfield>?ab... select from array of values in big endian order. */ 1008 1009 static const struct opcode32 neon_opcodes[] = 1010 { 1011 /* Extract. */ 1012 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1013 0xf2b00840, 0xffb00850, 1014 "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"}, 1015 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1016 0xf2b00000, 0xffb00810, 1017 "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"}, 1018 1019 /* Move data element to all lanes. */ 1020 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1021 0xf3b40c00, 0xffb70f90, "vdup%c.32\t%12-15,22R, %0-3,5D[%19d]"}, 1022 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1023 0xf3b20c00, 0xffb30f90, "vdup%c.16\t%12-15,22R, %0-3,5D[%18-19d]"}, 1024 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1025 0xf3b10c00, 0xffb10f90, "vdup%c.8\t%12-15,22R, %0-3,5D[%17-19d]"}, 1026 1027 /* Table lookup. */ 1028 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1029 0xf3b00800, 0xffb00c50, "vtbl%c.8\t%12-15,22D, %F, %0-3,5D"}, 1030 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1031 0xf3b00840, 0xffb00c50, "vtbx%c.8\t%12-15,22D, %F, %0-3,5D"}, 1032 1033 /* Half-precision conversions. */ 1034 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16), 1035 0xf3b60600, 0xffbf0fd0, "vcvt%c.f16.f32\t%12-15,22D, %0-3,5Q"}, 1036 {ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16), 1037 0xf3b60700, 0xffbf0fd0, "vcvt%c.f32.f16\t%12-15,22Q, %0-3,5D"}, 1038 1039 /* NEON fused multiply add instructions. */ 1040 {ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA), 1041 0xf2000c10, 0xffb00f10, "vfma%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1042 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1043 0xf2100c10, 0xffb00f10, "vfma%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1044 {ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA), 1045 0xf2200c10, 0xffb00f10, "vfms%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1046 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1047 0xf2300c10, 0xffb00f10, "vfms%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1048 1049 /* Two registers, miscellaneous. */ 1050 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8), 1051 0xf3ba0400, 0xffbf0c10, "vrint%7-9?p?m?zaxn%u.f32\t%12-15,22R, %0-3,5R"}, 1052 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1053 0xf3b60400, 0xffbf0c10, "vrint%7-9?p?m?zaxn%u.f16\t%12-15,22R, %0-3,5R"}, 1054 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8), 1055 0xf3bb0000, 0xffbf0c10, "vcvt%8-9?mpna%u.%7?us32.f32\t%12-15,22R, %0-3,5R"}, 1056 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1057 0xf3b70000, 0xffbf0c10, "vcvt%8-9?mpna%u.%7?us16.f16\t%12-15,22R, %0-3,5R"}, 1058 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1059 0xf3b00300, 0xffbf0fd0, "aese%u.8\t%12-15,22Q, %0-3,5Q"}, 1060 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1061 0xf3b00340, 0xffbf0fd0, "aesd%u.8\t%12-15,22Q, %0-3,5Q"}, 1062 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1063 0xf3b00380, 0xffbf0fd0, "aesmc%u.8\t%12-15,22Q, %0-3,5Q"}, 1064 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1065 0xf3b003c0, 0xffbf0fd0, "aesimc%u.8\t%12-15,22Q, %0-3,5Q"}, 1066 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1067 0xf3b902c0, 0xffbf0fd0, "sha1h%u.32\t%12-15,22Q, %0-3,5Q"}, 1068 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1069 0xf3ba0380, 0xffbf0fd0, "sha1su1%u.32\t%12-15,22Q, %0-3,5Q"}, 1070 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1071 0xf3ba03c0, 0xffbf0fd0, "sha256su0%u.32\t%12-15,22Q, %0-3,5Q"}, 1072 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1073 0xf2880a10, 0xfebf0fd0, "vmovl%c.%24?us8\t%12-15,22Q, %0-3,5D"}, 1074 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1075 0xf2900a10, 0xfebf0fd0, "vmovl%c.%24?us16\t%12-15,22Q, %0-3,5D"}, 1076 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1077 0xf2a00a10, 0xfebf0fd0, "vmovl%c.%24?us32\t%12-15,22Q, %0-3,5D"}, 1078 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1079 0xf3b00500, 0xffbf0f90, "vcnt%c.8\t%12-15,22R, %0-3,5R"}, 1080 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1081 0xf3b00580, 0xffbf0f90, "vmvn%c\t%12-15,22R, %0-3,5R"}, 1082 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1083 0xf3b20000, 0xffbf0f90, "vswp%c\t%12-15,22R, %0-3,5R"}, 1084 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1085 0xf3b20200, 0xffb30fd0, "vmovn%c.i%18-19T2\t%12-15,22D, %0-3,5Q"}, 1086 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1087 0xf3b20240, 0xffb30fd0, "vqmovun%c.s%18-19T2\t%12-15,22D, %0-3,5Q"}, 1088 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1089 0xf3b20280, 0xffb30fd0, "vqmovn%c.s%18-19T2\t%12-15,22D, %0-3,5Q"}, 1090 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1091 0xf3b202c0, 0xffb30fd0, "vqmovn%c.u%18-19T2\t%12-15,22D, %0-3,5Q"}, 1092 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1093 0xf3b20300, 0xffb30fd0, 1094 "vshll%c.i%18-19S2\t%12-15,22Q, %0-3,5D, #%18-19S2"}, 1095 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1096 0xf3bb0400, 0xffbf0e90, "vrecpe%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"}, 1097 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1098 0xf3b70400, 0xffbf0e90, "vrecpe%c.%8?fu16\t%12-15,22R, %0-3,5R"}, 1099 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1100 0xf3bb0480, 0xffbf0e90, "vrsqrte%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"}, 1101 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1102 0xf3b70480, 0xffbf0e90, "vrsqrte%c.%8?fu16\t%12-15,22R, %0-3,5R"}, 1103 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1104 0xf3b00000, 0xffb30f90, "vrev64%c.%18-19S2\t%12-15,22R, %0-3,5R"}, 1105 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1106 0xf3b00080, 0xffb30f90, "vrev32%c.%18-19S2\t%12-15,22R, %0-3,5R"}, 1107 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1108 0xf3b00100, 0xffb30f90, "vrev16%c.%18-19S2\t%12-15,22R, %0-3,5R"}, 1109 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1110 0xf3b00400, 0xffb30f90, "vcls%c.s%18-19S2\t%12-15,22R, %0-3,5R"}, 1111 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1112 0xf3b00480, 0xffb30f90, "vclz%c.i%18-19S2\t%12-15,22R, %0-3,5R"}, 1113 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1114 0xf3b00700, 0xffb30f90, "vqabs%c.s%18-19S2\t%12-15,22R, %0-3,5R"}, 1115 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1116 0xf3b00780, 0xffb30f90, "vqneg%c.s%18-19S2\t%12-15,22R, %0-3,5R"}, 1117 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1118 0xf3b20080, 0xffb30f90, "vtrn%c.%18-19S2\t%12-15,22R, %0-3,5R"}, 1119 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1120 0xf3b20100, 0xffb30f90, "vuzp%c.%18-19S2\t%12-15,22R, %0-3,5R"}, 1121 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1122 0xf3b20180, 0xffb30f90, "vzip%c.%18-19S2\t%12-15,22R, %0-3,5R"}, 1123 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1124 0xf3b10000, 0xffb30b90, "vcgt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"}, 1125 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1126 0xf3b10080, 0xffb30b90, "vcge%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"}, 1127 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1128 0xf3b10100, 0xffb30b90, "vceq%c.%10?fi%18-19S2\t%12-15,22R, %0-3,5R, #0"}, 1129 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1130 0xf3b10180, 0xffb30b90, "vcle%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"}, 1131 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1132 0xf3b10200, 0xffb30b90, "vclt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"}, 1133 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1134 0xf3b10300, 0xffb30b90, "vabs%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"}, 1135 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1136 0xf3b10380, 0xffb30b90, "vneg%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"}, 1137 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1138 0xf3b00200, 0xffb30f10, "vpaddl%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"}, 1139 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1140 0xf3b00600, 0xffb30f10, "vpadal%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"}, 1141 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1142 0xf3bb0600, 0xffbf0e10, 1143 "vcvt%c.%7-8?usff%18-19Sa.%7-8?ffus%18-19Sa\t%12-15,22R, %0-3,5R"}, 1144 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1145 0xf3b70600, 0xffbf0e10, 1146 "vcvt%c.%7-8?usff16.%7-8?ffus16\t%12-15,22R, %0-3,5R"}, 1147 1148 /* Three registers of the same length. */ 1149 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1150 0xf2000c40, 0xffb00f50, "sha1c%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"}, 1151 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1152 0xf2100c40, 0xffb00f50, "sha1p%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"}, 1153 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1154 0xf2200c40, 0xffb00f50, "sha1m%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"}, 1155 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1156 0xf2300c40, 0xffb00f50, "sha1su0%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"}, 1157 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1158 0xf3000c40, 0xffb00f50, "sha256h%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"}, 1159 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1160 0xf3100c40, 0xffb00f50, "sha256h2%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"}, 1161 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1162 0xf3200c40, 0xffb00f50, "sha256su1%u.32\t%12-15,22Q, %16-19,7Q, %0-3,5Q"}, 1163 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8), 1164 0xf3000f10, 0xffb00f10, "vmaxnm%u.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1165 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1166 0xf3100f10, 0xffb00f10, "vmaxnm%u.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1167 {ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8), 1168 0xf3200f10, 0xffb00f10, "vminnm%u.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1169 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1170 0xf3300f10, 0xffb00f10, "vminnm%u.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1171 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1172 0xf2000110, 0xffb00f10, "vand%c\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1173 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1174 0xf2100110, 0xffb00f10, "vbic%c\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1175 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1176 0xf2200110, 0xffb00f10, "vorr%c\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1177 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1178 0xf2300110, 0xffb00f10, "vorn%c\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1179 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1180 0xf3000110, 0xffb00f10, "veor%c\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1181 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1182 0xf3100110, 0xffb00f10, "vbsl%c\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1183 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1184 0xf3200110, 0xffb00f10, "vbit%c\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1185 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1186 0xf3300110, 0xffb00f10, "vbif%c\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1187 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1188 0xf2000d00, 0xffb00f10, "vadd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1189 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1190 0xf2100d00, 0xffb00f10, "vadd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1191 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1192 0xf2000d10, 0xffb00f10, "vmla%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1193 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1194 0xf2100d10, 0xffb00f10, "vmla%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1195 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1196 0xf2000e00, 0xffb00f10, "vceq%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1197 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1198 0xf2100e00, 0xffb00f10, "vceq%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1199 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1200 0xf2000f00, 0xffb00f10, "vmax%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1201 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1202 0xf2100f00, 0xffb00f10, "vmax%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1203 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1204 0xf2000f10, 0xffb00f10, "vrecps%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1205 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1206 0xf2100f10, 0xffb00f10, "vrecps%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1207 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1208 0xf2200d00, 0xffb00f10, "vsub%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1209 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1210 0xf2300d00, 0xffb00f10, "vsub%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1211 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1212 0xf2200d10, 0xffb00f10, "vmls%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1213 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1214 0xf2300d10, 0xffb00f10, "vmls%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1215 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1216 0xf2200f00, 0xffb00f10, "vmin%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1217 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1218 0xf2300f00, 0xffb00f10, "vmin%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1219 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1220 0xf2200f10, 0xffb00f10, "vrsqrts%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1221 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1222 0xf2300f10, 0xffb00f10, "vrsqrts%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1223 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1224 0xf3000d00, 0xffb00f10, "vpadd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1225 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1226 0xf3100d00, 0xffb00f10, "vpadd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1227 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1228 0xf3000d10, 0xffb00f10, "vmul%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1229 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1230 0xf3100d10, 0xffb00f10, "vmul%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1231 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1232 0xf3000e00, 0xffb00f10, "vcge%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1233 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1234 0xf3100e00, 0xffb00f10, "vcge%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1235 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1236 0xf3000e10, 0xffb00f10, "vacge%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1237 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1238 0xf3100e10, 0xffb00f10, "vacge%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1239 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1240 0xf3000f00, 0xffb00f10, "vpmax%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1241 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1242 0xf3100f00, 0xffb00f10, "vpmax%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1243 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1244 0xf3200d00, 0xffb00f10, "vabd%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1245 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1246 0xf3300d00, 0xffb00f10, "vabd%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1247 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1248 0xf3200e00, 0xffb00f10, "vcgt%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1249 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1250 0xf3300e00, 0xffb00f10, "vcgt%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1251 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1252 0xf3200e10, 0xffb00f10, "vacgt%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1253 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1254 0xf3300e10, 0xffb00f10, "vacgt%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1255 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1256 0xf3200f00, 0xffb00f10, "vpmin%c.f32\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1257 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1258 0xf3300f00, 0xffb00f10, "vpmin%c.f16\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1259 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1260 0xf2000800, 0xff800f10, "vadd%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1261 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1262 0xf2000810, 0xff800f10, "vtst%c.%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1263 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1264 0xf2000900, 0xff800f10, "vmla%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1265 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1266 0xf2000b00, 0xff800f10, 1267 "vqdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1268 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1269 0xf2000b10, 0xff800f10, 1270 "vpadd%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1271 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1272 0xf3000800, 0xff800f10, "vsub%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1273 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1274 0xf3000810, 0xff800f10, "vceq%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1275 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1276 0xf3000900, 0xff800f10, "vmls%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1277 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1278 0xf3000b00, 0xff800f10, 1279 "vqrdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1280 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1281 0xf2000000, 0xfe800f10, 1282 "vhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1283 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1284 0xf2000010, 0xfe800f10, 1285 "vqadd%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1286 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1287 0xf2000100, 0xfe800f10, 1288 "vrhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1289 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1290 0xf2000200, 0xfe800f10, 1291 "vhsub%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1292 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1293 0xf2000210, 0xfe800f10, 1294 "vqsub%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1295 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1296 0xf2000300, 0xfe800f10, 1297 "vcgt%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1298 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1299 0xf2000310, 0xfe800f10, 1300 "vcge%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1301 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1302 0xf2000400, 0xfe800f10, 1303 "vshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"}, 1304 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1305 0xf2000410, 0xfe800f10, 1306 "vqshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"}, 1307 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1308 0xf2000500, 0xfe800f10, 1309 "vrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"}, 1310 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1311 0xf2000510, 0xfe800f10, 1312 "vqrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"}, 1313 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1314 0xf2000600, 0xfe800f10, 1315 "vmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1316 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1317 0xf2000610, 0xfe800f10, 1318 "vmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1319 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1320 0xf2000700, 0xfe800f10, 1321 "vabd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1322 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1323 0xf2000710, 0xfe800f10, 1324 "vaba%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1325 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1326 0xf2000910, 0xfe800f10, 1327 "vmul%c.%24?pi%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1328 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1329 0xf2000a00, 0xfe800f10, 1330 "vpmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1331 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1332 0xf2000a10, 0xfe800f10, 1333 "vpmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1334 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA), 1335 0xf3000b10, 0xff800f10, 1336 "vqrdmlah%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1337 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA), 1338 0xf3000c10, 0xff800f10, 1339 "vqrdmlsh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"}, 1340 1341 /* One register and an immediate value. */ 1342 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1343 0xf2800e10, 0xfeb80fb0, "vmov%c.i8\t%12-15,22R, %E"}, 1344 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1345 0xf2800e30, 0xfeb80fb0, "vmov%c.i64\t%12-15,22R, %E"}, 1346 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1347 0xf2800f10, 0xfeb80fb0, "vmov%c.f32\t%12-15,22R, %E"}, 1348 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1349 0xf2800810, 0xfeb80db0, "vmov%c.i16\t%12-15,22R, %E"}, 1350 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1351 0xf2800830, 0xfeb80db0, "vmvn%c.i16\t%12-15,22R, %E"}, 1352 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1353 0xf2800910, 0xfeb80db0, "vorr%c.i16\t%12-15,22R, %E"}, 1354 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1355 0xf2800930, 0xfeb80db0, "vbic%c.i16\t%12-15,22R, %E"}, 1356 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1357 0xf2800c10, 0xfeb80eb0, "vmov%c.i32\t%12-15,22R, %E"}, 1358 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1359 0xf2800c30, 0xfeb80eb0, "vmvn%c.i32\t%12-15,22R, %E"}, 1360 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1361 0xf2800110, 0xfeb809b0, "vorr%c.i32\t%12-15,22R, %E"}, 1362 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1363 0xf2800130, 0xfeb809b0, "vbic%c.i32\t%12-15,22R, %E"}, 1364 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1365 0xf2800010, 0xfeb808b0, "vmov%c.i32\t%12-15,22R, %E"}, 1366 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1367 0xf2800030, 0xfeb808b0, "vmvn%c.i32\t%12-15,22R, %E"}, 1368 1369 /* Two registers and a shift amount. */ 1370 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1371 0xf2880810, 0xffb80fd0, "vshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"}, 1372 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1373 0xf2880850, 0xffb80fd0, "vrshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"}, 1374 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1375 0xf2880810, 0xfeb80fd0, "vqshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"}, 1376 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1377 0xf2880850, 0xfeb80fd0, "vqrshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"}, 1378 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1379 0xf2880910, 0xfeb80fd0, "vqshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"}, 1380 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1381 0xf2880950, 0xfeb80fd0, 1382 "vqrshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"}, 1383 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1384 0xf2880a10, 0xfeb80fd0, "vshll%c.%24?us8\t%12-15,22Q, %0-3,5D, #%16-18d"}, 1385 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1386 0xf2900810, 0xffb00fd0, "vshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"}, 1387 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1388 0xf2900850, 0xffb00fd0, "vrshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"}, 1389 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1390 0xf2880510, 0xffb80f90, "vshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"}, 1391 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1392 0xf3880410, 0xffb80f90, "vsri%c.8\t%12-15,22R, %0-3,5R, #%16-18e"}, 1393 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1394 0xf3880510, 0xffb80f90, "vsli%c.8\t%12-15,22R, %0-3,5R, #%16-18d"}, 1395 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1396 0xf3880610, 0xffb80f90, "vqshlu%c.s8\t%12-15,22R, %0-3,5R, #%16-18d"}, 1397 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1398 0xf2900810, 0xfeb00fd0, "vqshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"}, 1399 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1400 0xf2900850, 0xfeb00fd0, "vqrshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"}, 1401 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1402 0xf2900910, 0xfeb00fd0, "vqshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"}, 1403 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1404 0xf2900950, 0xfeb00fd0, 1405 "vqrshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"}, 1406 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1407 0xf2900a10, 0xfeb00fd0, "vshll%c.%24?us16\t%12-15,22Q, %0-3,5D, #%16-19d"}, 1408 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1409 0xf2880010, 0xfeb80f90, "vshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"}, 1410 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1411 0xf2880110, 0xfeb80f90, "vsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"}, 1412 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1413 0xf2880210, 0xfeb80f90, "vrshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"}, 1414 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1415 0xf2880310, 0xfeb80f90, "vrsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"}, 1416 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1417 0xf2880710, 0xfeb80f90, "vqshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"}, 1418 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1419 0xf2a00810, 0xffa00fd0, "vshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"}, 1420 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1421 0xf2a00850, 0xffa00fd0, "vrshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"}, 1422 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1423 0xf2900510, 0xffb00f90, "vshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"}, 1424 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1425 0xf3900410, 0xffb00f90, "vsri%c.16\t%12-15,22R, %0-3,5R, #%16-19e"}, 1426 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1427 0xf3900510, 0xffb00f90, "vsli%c.16\t%12-15,22R, %0-3,5R, #%16-19d"}, 1428 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1429 0xf3900610, 0xffb00f90, "vqshlu%c.s16\t%12-15,22R, %0-3,5R, #%16-19d"}, 1430 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1431 0xf2a00a10, 0xfea00fd0, "vshll%c.%24?us32\t%12-15,22Q, %0-3,5D, #%16-20d"}, 1432 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1433 0xf2900010, 0xfeb00f90, "vshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"}, 1434 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1435 0xf2900110, 0xfeb00f90, "vsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"}, 1436 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1437 0xf2900210, 0xfeb00f90, "vrshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"}, 1438 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1439 0xf2900310, 0xfeb00f90, "vrsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"}, 1440 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1441 0xf2900710, 0xfeb00f90, "vqshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"}, 1442 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1443 0xf2a00810, 0xfea00fd0, "vqshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"}, 1444 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1445 0xf2a00850, 0xfea00fd0, "vqrshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"}, 1446 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1447 0xf2a00910, 0xfea00fd0, "vqshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"}, 1448 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1449 0xf2a00950, 0xfea00fd0, 1450 "vqrshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"}, 1451 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1452 0xf2a00510, 0xffa00f90, "vshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"}, 1453 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1454 0xf3a00410, 0xffa00f90, "vsri%c.32\t%12-15,22R, %0-3,5R, #%16-20e"}, 1455 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1456 0xf3a00510, 0xffa00f90, "vsli%c.32\t%12-15,22R, %0-3,5R, #%16-20d"}, 1457 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1458 0xf3a00610, 0xffa00f90, "vqshlu%c.s32\t%12-15,22R, %0-3,5R, #%16-20d"}, 1459 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1460 0xf2a00010, 0xfea00f90, "vshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"}, 1461 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1462 0xf2a00110, 0xfea00f90, "vsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"}, 1463 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1464 0xf2a00210, 0xfea00f90, "vrshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"}, 1465 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1466 0xf2a00310, 0xfea00f90, "vrsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"}, 1467 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1468 0xf2a00710, 0xfea00f90, "vqshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"}, 1469 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1470 0xf2800590, 0xff800f90, "vshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"}, 1471 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1472 0xf3800490, 0xff800f90, "vsri%c.64\t%12-15,22R, %0-3,5R, #%16-21e"}, 1473 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1474 0xf3800590, 0xff800f90, "vsli%c.64\t%12-15,22R, %0-3,5R, #%16-21d"}, 1475 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1476 0xf3800690, 0xff800f90, "vqshlu%c.s64\t%12-15,22R, %0-3,5R, #%16-21d"}, 1477 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1478 0xf2800090, 0xfe800f90, "vshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"}, 1479 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1480 0xf2800190, 0xfe800f90, "vsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"}, 1481 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1482 0xf2800290, 0xfe800f90, "vrshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"}, 1483 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1484 0xf2800390, 0xfe800f90, "vrsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"}, 1485 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1486 0xf2800790, 0xfe800f90, "vqshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"}, 1487 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1488 0xf2a00e10, 0xfea00e90, 1489 "vcvt%c.%24,8?usff32.%24,8?ffus32\t%12-15,22R, %0-3,5R, #%16-20e"}, 1490 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST), 1491 0xf2a00c10, 0xfea00e90, 1492 "vcvt%c.%24,8?usff16.%24,8?ffus16\t%12-15,22R, %0-3,5R, #%16-20e"}, 1493 1494 /* Three registers of different lengths. */ 1495 {ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8), 1496 0xf2a00e00, 0xfeb00f50, "vmull%c.p64\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1497 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1498 0xf2800e00, 0xfea00f50, "vmull%c.p%20S0\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1499 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1500 0xf2800400, 0xff800f50, 1501 "vaddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"}, 1502 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1503 0xf2800600, 0xff800f50, 1504 "vsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"}, 1505 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1506 0xf2800900, 0xff800f50, 1507 "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1508 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1509 0xf2800b00, 0xff800f50, 1510 "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1511 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1512 0xf2800d00, 0xff800f50, 1513 "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1514 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1515 0xf3800400, 0xff800f50, 1516 "vraddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"}, 1517 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1518 0xf3800600, 0xff800f50, 1519 "vrsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"}, 1520 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1521 0xf2800000, 0xfe800f50, 1522 "vaddl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1523 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1524 0xf2800100, 0xfe800f50, 1525 "vaddw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"}, 1526 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1527 0xf2800200, 0xfe800f50, 1528 "vsubl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1529 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1530 0xf2800300, 0xfe800f50, 1531 "vsubw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"}, 1532 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1533 0xf2800500, 0xfe800f50, 1534 "vabal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1535 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1536 0xf2800700, 0xfe800f50, 1537 "vabdl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1538 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1539 0xf2800800, 0xfe800f50, 1540 "vmlal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1541 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1542 0xf2800a00, 0xfe800f50, 1543 "vmlsl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1544 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1545 0xf2800c00, 0xfe800f50, 1546 "vmull%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"}, 1547 1548 /* Two registers and a scalar. */ 1549 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1550 0xf2800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"}, 1551 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1552 0xf2800140, 0xff900f50, "vmla%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"}, 1553 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST), 1554 0xf2900140, 0xffb00f50, "vmla%c.f16\t%12-15,22D, %16-19,7D, %D"}, 1555 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1556 0xf2800340, 0xff800f50, "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"}, 1557 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1558 0xf2800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"}, 1559 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1560 0xf2800540, 0xff900f50, "vmls%c.f%20-21S6\t%12-15,22D, %16-19,7D, %D"}, 1561 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST), 1562 0xf2900540, 0xffb00f50, "vmls%c.f16\t%12-15,22D, %16-19,7D, %D"}, 1563 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1564 0xf2800740, 0xff800f50, "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"}, 1565 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1566 0xf2800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"}, 1567 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1568 0xf2800940, 0xff900f50, "vmul%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"}, 1569 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST), 1570 0xf2900940, 0xffb00f50, "vmul%c.f16\t%12-15,22D, %16-19,7D, %D"}, 1571 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1572 0xf2800b40, 0xff800f50, "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"}, 1573 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1574 0xf2800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"}, 1575 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1576 0xf2800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"}, 1577 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1578 0xf3800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"}, 1579 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1580 0xf3800140, 0xff900f50, "vmla%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"}, 1581 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST), 1582 0xf3900140, 0xffb00f50, "vmla%c.f16\t%12-15,22Q, %16-19,7Q, %D"}, 1583 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1584 0xf3800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"}, 1585 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1586 0xf3800540, 0xff900f50, "vmls%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"}, 1587 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST), 1588 0xf3900540, 0xffb00f50, "vmls%c.f16\t%12-15,22Q, %16-19,7Q, %D"}, 1589 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1590 0xf3800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"}, 1591 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1592 0xf3800940, 0xff900f50, "vmul%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"}, 1593 {ARM_FEATURE_COPROC (ARM_EXT2_FP16_INST), 1594 0xf3900940, 0xffb00f50, "vmul%c.f16\t%12-15,22Q, %16-19,7Q, %D"}, 1595 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1596 0xf3800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"}, 1597 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1598 0xf3800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"}, 1599 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1600 0xf2800240, 0xfe800f50, 1601 "vmlal%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"}, 1602 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1603 0xf2800640, 0xfe800f50, 1604 "vmlsl%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"}, 1605 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1606 0xf2800a40, 0xfe800f50, 1607 "vmull%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"}, 1608 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA), 1609 0xf2800e40, 0xff800f50, 1610 "vqrdmlah%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"}, 1611 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA), 1612 0xf2800f40, 0xff800f50, 1613 "vqrdmlsh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"}, 1614 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA), 1615 0xf3800e40, 0xff800f50, 1616 "vqrdmlah%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"}, 1617 {ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA), 1618 0xf3800f40, 0xff800f50, 1619 "vqrdmlsh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D" 1620 }, 1621 1622 /* Element and structure load/store. */ 1623 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1624 0xf4a00fc0, 0xffb00fc0, "vld4%c.32\t%C"}, 1625 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1626 0xf4a00c00, 0xffb00f00, "vld1%c.%6-7S2\t%C"}, 1627 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1628 0xf4a00d00, 0xffb00f00, "vld2%c.%6-7S2\t%C"}, 1629 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1630 0xf4a00e00, 0xffb00f00, "vld3%c.%6-7S2\t%C"}, 1631 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1632 0xf4a00f00, 0xffb00f00, "vld4%c.%6-7S2\t%C"}, 1633 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1634 0xf4000200, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"}, 1635 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1636 0xf4000300, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"}, 1637 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1638 0xf4000400, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"}, 1639 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1640 0xf4000500, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"}, 1641 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1642 0xf4000600, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"}, 1643 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1644 0xf4000700, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"}, 1645 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1646 0xf4000800, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"}, 1647 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1648 0xf4000900, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"}, 1649 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1650 0xf4000a00, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"}, 1651 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1652 0xf4000000, 0xff900e00, "v%21?ls%21?dt4%c.%6-7S2\t%A"}, 1653 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1654 0xf4800000, 0xff900300, "v%21?ls%21?dt1%c.%10-11S2\t%B"}, 1655 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1656 0xf4800100, 0xff900300, "v%21?ls%21?dt2%c.%10-11S2\t%B"}, 1657 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1658 0xf4800200, 0xff900300, "v%21?ls%21?dt3%c.%10-11S2\t%B"}, 1659 {ARM_FEATURE_COPROC (FPU_NEON_EXT_V1), 1660 0xf4800300, 0xff900300, "v%21?ls%21?dt4%c.%10-11S2\t%B"}, 1661 1662 {ARM_FEATURE_CORE_LOW (0), 0 ,0, 0} 1663 }; 1664 1665 /* Opcode tables: ARM, 16-bit Thumb, 32-bit Thumb. All three are partially 1666 ordered: they must be searched linearly from the top to obtain a correct 1667 match. */ 1668 1669 /* print_insn_arm recognizes the following format control codes: 1670 1671 %% % 1672 1673 %a print address for ldr/str instruction 1674 %s print address for ldr/str halfword/signextend instruction 1675 %S like %s but allow UNPREDICTABLE addressing 1676 %b print branch destination 1677 %c print condition code (always bits 28-31) 1678 %m print register mask for ldm/stm instruction 1679 %o print operand2 (immediate or register + shift) 1680 %p print 'p' iff bits 12-15 are 15 1681 %t print 't' iff bit 21 set and bit 24 clear 1682 %B print arm BLX(1) destination 1683 %C print the PSR sub type. 1684 %U print barrier type. 1685 %P print address for pli instruction. 1686 1687 %<bitfield>r print as an ARM register 1688 %<bitfield>T print as an ARM register + 1 1689 %<bitfield>R as %r but r15 is UNPREDICTABLE 1690 %<bitfield>{r|R}u as %{r|R} but if matches the other %u field then is UNPREDICTABLE 1691 %<bitfield>{r|R}U as %{r|R} but if matches the other %U field then is UNPREDICTABLE 1692 %<bitfield>d print the bitfield in decimal 1693 %<bitfield>W print the bitfield plus one in decimal 1694 %<bitfield>x print the bitfield in hex 1695 %<bitfield>X print the bitfield as 1 hex digit without leading "0x" 1696 1697 %<bitfield>'c print specified char iff bitfield is all ones 1698 %<bitfield>`c print specified char iff bitfield is all zeroes 1699 %<bitfield>?ab... select from array of values in big endian order 1700 1701 %e print arm SMI operand (bits 0..7,8..19). 1702 %E print the LSB and WIDTH fields of a BFI or BFC instruction. 1703 %V print the 16-bit immediate field of a MOVT or MOVW instruction. 1704 %R print the SPSR/CPSR or banked register of an MRS. */ 1705 1706 static const struct opcode32 arm_opcodes[] = 1707 { 1708 /* ARM instructions. */ 1709 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 1710 0xe1a00000, 0xffffffff, "nop\t\t\t; (mov r0, r0)"}, 1711 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 1712 0xe7f000f0, 0xfff000f0, "udf\t#%e"}, 1713 1714 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T | ARM_EXT_V5), 1715 0x012FFF10, 0x0ffffff0, "bx%c\t%0-3r"}, 1716 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2), 1717 0x00000090, 0x0fe000f0, "mul%20's%c\t%16-19R, %0-3R, %8-11R"}, 1718 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2), 1719 0x00200090, 0x0fe000f0, "mla%20's%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 1720 {ARM_FEATURE_CORE_LOW (ARM_EXT_V2S), 1721 0x01000090, 0x0fb00ff0, "swp%22'b%c\t%12-15RU, %0-3Ru, [%16-19RuU]"}, 1722 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3M), 1723 0x00800090, 0x0fa000f0, 1724 "%22?sumull%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"}, 1725 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3M), 1726 0x00a00090, 0x0fa000f0, 1727 "%22?sumlal%20's%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"}, 1728 1729 /* V8.2 RAS extension instructions. */ 1730 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS), 1731 0xe320f010, 0xffffffff, "esb"}, 1732 1733 /* V8 instructions. */ 1734 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 1735 0x0320f005, 0x0fffffff, "sevl"}, 1736 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 1737 0xe1000070, 0xfff000f0, "hlt\t0x%16-19X%12-15X%8-11X%0-3X"}, 1738 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_ATOMICS), 1739 0x01800e90, 0x0ff00ff0, "stlex%c\t%12-15r, %0-3r, [%16-19R]"}, 1740 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 1741 0x01900e9f, 0x0ff00fff, "ldaex%c\t%12-15r, [%16-19R]"}, 1742 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 1743 0x01a00e90, 0x0ff00ff0, "stlexd%c\t%12-15r, %0-3r, %0-3T, [%16-19R]"}, 1744 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 1745 0x01b00e9f, 0x0ff00fff, "ldaexd%c\t%12-15r, %12-15T, [%16-19R]"}, 1746 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 1747 0x01c00e90, 0x0ff00ff0, "stlexb%c\t%12-15r, %0-3r, [%16-19R]"}, 1748 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 1749 0x01d00e9f, 0x0ff00fff, "ldaexb%c\t%12-15r, [%16-19R]"}, 1750 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 1751 0x01e00e90, 0x0ff00ff0, "stlexh%c\t%12-15r, %0-3r, [%16-19R]"}, 1752 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 1753 0x01f00e9f, 0x0ff00fff, "ldaexh%c\t%12-15r, [%16-19R]"}, 1754 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 1755 0x0180fc90, 0x0ff0fff0, "stl%c\t%0-3r, [%16-19R]"}, 1756 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 1757 0x01900c9f, 0x0ff00fff, "lda%c\t%12-15r, [%16-19R]"}, 1758 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 1759 0x01c0fc90, 0x0ff0fff0, "stlb%c\t%0-3r, [%16-19R]"}, 1760 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 1761 0x01d00c9f, 0x0ff00fff, "ldab%c\t%12-15r, [%16-19R]"}, 1762 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 1763 0x01e0fc90, 0x0ff0fff0, "stlh%c\t%0-3r, [%16-19R]"}, 1764 {ARM_FEATURE_CORE_LOW (ARM_EXT2_ATOMICS), 1765 0x01f00c9f, 0x0ff00fff, "ldah%c\t%12-15r, [%16-19R]"}, 1766 /* CRC32 instructions. */ 1767 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8), 1768 0xe1000040, 0xfff00ff0, "crc32b\t%12-15R, %16-19R, %0-3R"}, 1769 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8), 1770 0xe1200040, 0xfff00ff0, "crc32h\t%12-15R, %16-19R, %0-3R"}, 1771 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8), 1772 0xe1400040, 0xfff00ff0, "crc32w\t%12-15R, %16-19R, %0-3R"}, 1773 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8), 1774 0xe1000240, 0xfff00ff0, "crc32cb\t%12-15R, %16-19R, %0-3R"}, 1775 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8), 1776 0xe1200240, 0xfff00ff0, "crc32ch\t%12-15R, %16-19R, %0-3R"}, 1777 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8), 1778 0xe1400240, 0xfff00ff0, "crc32cw\t%12-15R, %16-19R, %0-3R"}, 1779 1780 /* Privileged Access Never extension instructions. */ 1781 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN), 1782 0xf1100000, 0xfffffdff, "setpan\t#%9-9d"}, 1783 1784 /* Virtualization Extension instructions. */ 1785 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 0x0160006e, 0x0fffffff, "eret%c"}, 1786 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 0x01400070, 0x0ff000f0, "hvc%c\t%e"}, 1787 1788 /* Integer Divide Extension instructions. */ 1789 {ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV), 1790 0x0710f010, 0x0ff0f0f0, "sdiv%c\t%16-19r, %0-3r, %8-11r"}, 1791 {ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV), 1792 0x0730f010, 0x0ff0f0f0, "udiv%c\t%16-19r, %0-3r, %8-11r"}, 1793 1794 /* MP Extension instructions. */ 1795 {ARM_FEATURE_CORE_LOW (ARM_EXT_MP), 0xf410f000, 0xfc70f000, "pldw\t%a"}, 1796 1797 /* V7 instructions. */ 1798 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf450f000, 0xfd70f000, "pli\t%P"}, 1799 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0x0320f0f0, 0x0ffffff0, "dbg%c\t#%0-3d"}, 1800 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf57ff051, 0xfffffff3, "dmb\t%U"}, 1801 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf57ff041, 0xfffffff3, "dsb\t%U"}, 1802 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf57ff050, 0xfffffff0, "dmb\t%U"}, 1803 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf57ff040, 0xfffffff0, "dsb\t%U"}, 1804 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf57ff060, 0xfffffff0, "isb\t%U"}, 1805 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 1806 0x0320f000, 0x0fffffff, "nop%c\t{%0-7d}"}, 1807 1808 /* ARM V6T2 instructions. */ 1809 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 1810 0x07c0001f, 0x0fe0007f, "bfc%c\t%12-15R, %E"}, 1811 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 1812 0x07c00010, 0x0fe00070, "bfi%c\t%12-15R, %0-3r, %E"}, 1813 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 1814 0x00600090, 0x0ff000f0, "mls%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 1815 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 1816 0x002000b0, 0x0f3000f0, "strht%c\t%12-15R, %S"}, 1817 1818 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 1819 0x00300090, 0x0f3000f0, UNDEFINED_INSTRUCTION }, 1820 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 1821 0x00300090, 0x0f300090, "ldr%6's%5?hbt%c\t%12-15R, %S"}, 1822 1823 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 1824 0x03000000, 0x0ff00000, "movw%c\t%12-15R, %V"}, 1825 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 1826 0x03400000, 0x0ff00000, "movt%c\t%12-15R, %V"}, 1827 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 1828 0x06ff0f30, 0x0fff0ff0, "rbit%c\t%12-15R, %0-3R"}, 1829 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 1830 0x07a00050, 0x0fa00070, "%22?usbfx%c\t%12-15r, %0-3r, #%7-11d, #%16-20W"}, 1831 1832 /* ARM Security extension instructions. */ 1833 {ARM_FEATURE_CORE_LOW (ARM_EXT_SEC), 1834 0x01600070, 0x0ff000f0, "smc%c\t%e"}, 1835 1836 /* ARM V6K instructions. */ 1837 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 1838 0xf57ff01f, 0xffffffff, "clrex"}, 1839 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 1840 0x01d00f9f, 0x0ff00fff, "ldrexb%c\t%12-15R, [%16-19R]"}, 1841 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 1842 0x01b00f9f, 0x0ff00fff, "ldrexd%c\t%12-15r, [%16-19R]"}, 1843 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 1844 0x01f00f9f, 0x0ff00fff, "ldrexh%c\t%12-15R, [%16-19R]"}, 1845 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 1846 0x01c00f90, 0x0ff00ff0, "strexb%c\t%12-15R, %0-3R, [%16-19R]"}, 1847 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 1848 0x01a00f90, 0x0ff00ff0, "strexd%c\t%12-15R, %0-3r, [%16-19R]"}, 1849 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 1850 0x01e00f90, 0x0ff00ff0, "strexh%c\t%12-15R, %0-3R, [%16-19R]"}, 1851 1852 /* ARM V6K NOP hints. */ 1853 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 1854 0x0320f001, 0x0fffffff, "yield%c"}, 1855 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 1856 0x0320f002, 0x0fffffff, "wfe%c"}, 1857 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 1858 0x0320f003, 0x0fffffff, "wfi%c"}, 1859 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 1860 0x0320f004, 0x0fffffff, "sev%c"}, 1861 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 1862 0x0320f000, 0x0fffff00, "nop%c\t{%0-7d}"}, 1863 1864 /* ARM V6 instructions. */ 1865 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1866 0xf1080000, 0xfffffe3f, "cpsie\t%8'a%7'i%6'f"}, 1867 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1868 0xf10a0000, 0xfffffe20, "cpsie\t%8'a%7'i%6'f,#%0-4d"}, 1869 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1870 0xf10C0000, 0xfffffe3f, "cpsid\t%8'a%7'i%6'f"}, 1871 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1872 0xf10e0000, 0xfffffe20, "cpsid\t%8'a%7'i%6'f,#%0-4d"}, 1873 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1874 0xf1000000, 0xfff1fe20, "cps\t#%0-4d"}, 1875 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1876 0x06800010, 0x0ff00ff0, "pkhbt%c\t%12-15R, %16-19R, %0-3R"}, 1877 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1878 0x06800010, 0x0ff00070, "pkhbt%c\t%12-15R, %16-19R, %0-3R, lsl #%7-11d"}, 1879 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1880 0x06800050, 0x0ff00ff0, "pkhtb%c\t%12-15R, %16-19R, %0-3R, asr #32"}, 1881 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1882 0x06800050, 0x0ff00070, "pkhtb%c\t%12-15R, %16-19R, %0-3R, asr #%7-11d"}, 1883 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1884 0x01900f9f, 0x0ff00fff, "ldrex%c\tr%12-15d, [%16-19R]"}, 1885 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1886 0x06200f10, 0x0ff00ff0, "qadd16%c\t%12-15R, %16-19R, %0-3R"}, 1887 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1888 0x06200f90, 0x0ff00ff0, "qadd8%c\t%12-15R, %16-19R, %0-3R"}, 1889 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1890 0x06200f30, 0x0ff00ff0, "qasx%c\t%12-15R, %16-19R, %0-3R"}, 1891 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1892 0x06200f70, 0x0ff00ff0, "qsub16%c\t%12-15R, %16-19R, %0-3R"}, 1893 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1894 0x06200ff0, 0x0ff00ff0, "qsub8%c\t%12-15R, %16-19R, %0-3R"}, 1895 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1896 0x06200f50, 0x0ff00ff0, "qsax%c\t%12-15R, %16-19R, %0-3R"}, 1897 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1898 0x06100f10, 0x0ff00ff0, "sadd16%c\t%12-15R, %16-19R, %0-3R"}, 1899 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1900 0x06100f90, 0x0ff00ff0, "sadd8%c\t%12-15R, %16-19R, %0-3R"}, 1901 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1902 0x06100f30, 0x0ff00ff0, "sasx%c\t%12-15R, %16-19R, %0-3R"}, 1903 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1904 0x06300f10, 0x0ff00ff0, "shadd16%c\t%12-15R, %16-19R, %0-3R"}, 1905 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1906 0x06300f90, 0x0ff00ff0, "shadd8%c\t%12-15R, %16-19R, %0-3R"}, 1907 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1908 0x06300f30, 0x0ff00ff0, "shasx%c\t%12-15R, %16-19R, %0-3R"}, 1909 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1910 0x06300f70, 0x0ff00ff0, "shsub16%c\t%12-15R, %16-19R, %0-3R"}, 1911 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1912 0x06300ff0, 0x0ff00ff0, "shsub8%c\t%12-15R, %16-19R, %0-3R"}, 1913 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1914 0x06300f50, 0x0ff00ff0, "shsax%c\t%12-15R, %16-19R, %0-3R"}, 1915 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1916 0x06100f70, 0x0ff00ff0, "ssub16%c\t%12-15R, %16-19R, %0-3R"}, 1917 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1918 0x06100ff0, 0x0ff00ff0, "ssub8%c\t%12-15R, %16-19R, %0-3R"}, 1919 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1920 0x06100f50, 0x0ff00ff0, "ssax%c\t%12-15R, %16-19R, %0-3R"}, 1921 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1922 0x06500f10, 0x0ff00ff0, "uadd16%c\t%12-15R, %16-19R, %0-3R"}, 1923 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1924 0x06500f90, 0x0ff00ff0, "uadd8%c\t%12-15R, %16-19R, %0-3R"}, 1925 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1926 0x06500f30, 0x0ff00ff0, "uasx%c\t%12-15R, %16-19R, %0-3R"}, 1927 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1928 0x06700f10, 0x0ff00ff0, "uhadd16%c\t%12-15R, %16-19R, %0-3R"}, 1929 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1930 0x06700f90, 0x0ff00ff0, "uhadd8%c\t%12-15R, %16-19R, %0-3R"}, 1931 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1932 0x06700f30, 0x0ff00ff0, "uhasx%c\t%12-15R, %16-19R, %0-3R"}, 1933 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1934 0x06700f70, 0x0ff00ff0, "uhsub16%c\t%12-15R, %16-19R, %0-3R"}, 1935 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1936 0x06700ff0, 0x0ff00ff0, "uhsub8%c\t%12-15R, %16-19R, %0-3R"}, 1937 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1938 0x06700f50, 0x0ff00ff0, "uhsax%c\t%12-15R, %16-19R, %0-3R"}, 1939 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1940 0x06600f10, 0x0ff00ff0, "uqadd16%c\t%12-15R, %16-19R, %0-3R"}, 1941 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1942 0x06600f90, 0x0ff00ff0, "uqadd8%c\t%12-15R, %16-19R, %0-3R"}, 1943 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1944 0x06600f30, 0x0ff00ff0, "uqasx%c\t%12-15R, %16-19R, %0-3R"}, 1945 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1946 0x06600f70, 0x0ff00ff0, "uqsub16%c\t%12-15R, %16-19R, %0-3R"}, 1947 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1948 0x06600ff0, 0x0ff00ff0, "uqsub8%c\t%12-15R, %16-19R, %0-3R"}, 1949 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1950 0x06600f50, 0x0ff00ff0, "uqsax%c\t%12-15R, %16-19R, %0-3R"}, 1951 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1952 0x06500f70, 0x0ff00ff0, "usub16%c\t%12-15R, %16-19R, %0-3R"}, 1953 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1954 0x06500ff0, 0x0ff00ff0, "usub8%c\t%12-15R, %16-19R, %0-3R"}, 1955 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1956 0x06500f50, 0x0ff00ff0, "usax%c\t%12-15R, %16-19R, %0-3R"}, 1957 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1958 0x06bf0f30, 0x0fff0ff0, "rev%c\t%12-15R, %0-3R"}, 1959 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1960 0x06bf0fb0, 0x0fff0ff0, "rev16%c\t%12-15R, %0-3R"}, 1961 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1962 0x06ff0fb0, 0x0fff0ff0, "revsh%c\t%12-15R, %0-3R"}, 1963 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1964 0xf8100a00, 0xfe50ffff, "rfe%23?id%24?ba\t%16-19r%21'!"}, 1965 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1966 0x06bf0070, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R"}, 1967 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1968 0x06bf0470, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #8"}, 1969 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1970 0x06bf0870, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #16"}, 1971 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1972 0x06bf0c70, 0x0fff0ff0, "sxth%c\t%12-15R, %0-3R, ror #24"}, 1973 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1974 0x068f0070, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R"}, 1975 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1976 0x068f0470, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #8"}, 1977 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1978 0x068f0870, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #16"}, 1979 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1980 0x068f0c70, 0x0fff0ff0, "sxtb16%c\t%12-15R, %0-3R, ror #24"}, 1981 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1982 0x06af0070, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R"}, 1983 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1984 0x06af0470, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #8"}, 1985 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1986 0x06af0870, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #16"}, 1987 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1988 0x06af0c70, 0x0fff0ff0, "sxtb%c\t%12-15R, %0-3R, ror #24"}, 1989 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1990 0x06ff0070, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R"}, 1991 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1992 0x06ff0470, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #8"}, 1993 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1994 0x06ff0870, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #16"}, 1995 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1996 0x06ff0c70, 0x0fff0ff0, "uxth%c\t%12-15R, %0-3R, ror #24"}, 1997 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 1998 0x06cf0070, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R"}, 1999 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2000 0x06cf0470, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #8"}, 2001 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2002 0x06cf0870, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #16"}, 2003 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2004 0x06cf0c70, 0x0fff0ff0, "uxtb16%c\t%12-15R, %0-3R, ror #24"}, 2005 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2006 0x06ef0070, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R"}, 2007 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2008 0x06ef0470, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #8"}, 2009 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2010 0x06ef0870, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #16"}, 2011 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2012 0x06ef0c70, 0x0fff0ff0, "uxtb%c\t%12-15R, %0-3R, ror #24"}, 2013 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2014 0x06b00070, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R"}, 2015 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2016 0x06b00470, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #8"}, 2017 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2018 0x06b00870, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #16"}, 2019 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2020 0x06b00c70, 0x0ff00ff0, "sxtah%c\t%12-15R, %16-19r, %0-3R, ror #24"}, 2021 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2022 0x06800070, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R"}, 2023 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2024 0x06800470, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #8"}, 2025 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2026 0x06800870, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #16"}, 2027 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2028 0x06800c70, 0x0ff00ff0, "sxtab16%c\t%12-15R, %16-19r, %0-3R, ror #24"}, 2029 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2030 0x06a00070, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R"}, 2031 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2032 0x06a00470, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #8"}, 2033 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2034 0x06a00870, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #16"}, 2035 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2036 0x06a00c70, 0x0ff00ff0, "sxtab%c\t%12-15R, %16-19r, %0-3R, ror #24"}, 2037 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2038 0x06f00070, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R"}, 2039 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2040 0x06f00470, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #8"}, 2041 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2042 0x06f00870, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #16"}, 2043 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2044 0x06f00c70, 0x0ff00ff0, "uxtah%c\t%12-15R, %16-19r, %0-3R, ror #24"}, 2045 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2046 0x06c00070, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R"}, 2047 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2048 0x06c00470, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ror #8"}, 2049 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2050 0x06c00870, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ror #16"}, 2051 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2052 0x06c00c70, 0x0ff00ff0, "uxtab16%c\t%12-15R, %16-19r, %0-3R, ROR #24"}, 2053 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2054 0x06e00070, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R"}, 2055 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2056 0x06e00470, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #8"}, 2057 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2058 0x06e00870, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #16"}, 2059 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2060 0x06e00c70, 0x0ff00ff0, "uxtab%c\t%12-15R, %16-19r, %0-3R, ror #24"}, 2061 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2062 0x06800fb0, 0x0ff00ff0, "sel%c\t%12-15R, %16-19R, %0-3R"}, 2063 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2064 0xf1010000, 0xfffffc00, "setend\t%9?ble"}, 2065 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2066 0x0700f010, 0x0ff0f0d0, "smuad%5'x%c\t%16-19R, %0-3R, %8-11R"}, 2067 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2068 0x0700f050, 0x0ff0f0d0, "smusd%5'x%c\t%16-19R, %0-3R, %8-11R"}, 2069 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2070 0x07000010, 0x0ff000d0, "smlad%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 2071 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2072 0x07400010, 0x0ff000d0, "smlald%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"}, 2073 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2074 0x07000050, 0x0ff000d0, "smlsd%5'x%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 2075 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2076 0x07400050, 0x0ff000d0, "smlsld%5'x%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"}, 2077 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2078 0x0750f010, 0x0ff0f0d0, "smmul%5'r%c\t%16-19R, %0-3R, %8-11R"}, 2079 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2080 0x07500010, 0x0ff000d0, "smmla%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 2081 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2082 0x075000d0, 0x0ff000d0, "smmls%5'r%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 2083 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2084 0xf84d0500, 0xfe5fffe0, "srs%23?id%24?ba\t%16-19r%21'!, #%0-4d"}, 2085 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2086 0x06a00010, 0x0fe00ff0, "ssat%c\t%12-15R, #%16-20W, %0-3R"}, 2087 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2088 0x06a00010, 0x0fe00070, "ssat%c\t%12-15R, #%16-20W, %0-3R, lsl #%7-11d"}, 2089 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2090 0x06a00050, 0x0fe00070, "ssat%c\t%12-15R, #%16-20W, %0-3R, asr #%7-11d"}, 2091 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2092 0x06a00f30, 0x0ff00ff0, "ssat16%c\t%12-15r, #%16-19W, %0-3r"}, 2093 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2094 0x01800f90, 0x0ff00ff0, "strex%c\t%12-15R, %0-3R, [%16-19R]"}, 2095 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2096 0x00400090, 0x0ff000f0, "umaal%c\t%12-15R, %16-19R, %0-3R, %8-11R"}, 2097 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2098 0x0780f010, 0x0ff0f0f0, "usad8%c\t%16-19R, %0-3R, %8-11R"}, 2099 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2100 0x07800010, 0x0ff000f0, "usada8%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 2101 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2102 0x06e00010, 0x0fe00ff0, "usat%c\t%12-15R, #%16-20d, %0-3R"}, 2103 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2104 0x06e00010, 0x0fe00070, "usat%c\t%12-15R, #%16-20d, %0-3R, lsl #%7-11d"}, 2105 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2106 0x06e00050, 0x0fe00070, "usat%c\t%12-15R, #%16-20d, %0-3R, asr #%7-11d"}, 2107 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 2108 0x06e00f30, 0x0ff00ff0, "usat16%c\t%12-15R, #%16-19d, %0-3R"}, 2109 2110 /* V5J instruction. */ 2111 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5J), 2112 0x012fff20, 0x0ffffff0, "bxj%c\t%0-3R"}, 2113 2114 /* V5 Instructions. */ 2115 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5), 2116 0xe1200070, 0xfff000f0, 2117 "bkpt\t0x%16-19X%12-15X%8-11X%0-3X"}, 2118 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5), 2119 0xfa000000, 0xfe000000, "blx\t%B"}, 2120 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5), 2121 0x012fff30, 0x0ffffff0, "blx%c\t%0-3R"}, 2122 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5), 2123 0x016f0f10, 0x0fff0ff0, "clz%c\t%12-15R, %0-3R"}, 2124 2125 /* V5E "El Segundo" Instructions. */ 2126 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E), 2127 0x000000d0, 0x0e1000f0, "ldrd%c\t%12-15r, %s"}, 2128 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E), 2129 0x000000f0, 0x0e1000f0, "strd%c\t%12-15r, %s"}, 2130 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5E), 2131 0xf450f000, 0xfc70f000, "pld\t%a"}, 2132 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2133 0x01000080, 0x0ff000f0, "smlabb%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 2134 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2135 0x010000a0, 0x0ff000f0, "smlatb%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 2136 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2137 0x010000c0, 0x0ff000f0, "smlabt%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 2138 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2139 0x010000e0, 0x0ff000f0, "smlatt%c\t%16-19r, %0-3r, %8-11R, %12-15R"}, 2140 2141 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2142 0x01200080, 0x0ff000f0, "smlawb%c\t%16-19R, %0-3R, %8-11R, %12-15R"}, 2143 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2144 0x012000c0, 0x0ff000f0, "smlawt%c\t%16-19R, %0-3r, %8-11R, %12-15R"}, 2145 2146 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2147 0x01400080, 0x0ff000f0, "smlalbb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"}, 2148 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2149 0x014000a0, 0x0ff000f0, "smlaltb%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"}, 2150 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2151 0x014000c0, 0x0ff000f0, "smlalbt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"}, 2152 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2153 0x014000e0, 0x0ff000f0, "smlaltt%c\t%12-15Ru, %16-19Ru, %0-3R, %8-11R"}, 2154 2155 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2156 0x01600080, 0x0ff0f0f0, "smulbb%c\t%16-19R, %0-3R, %8-11R"}, 2157 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2158 0x016000a0, 0x0ff0f0f0, "smultb%c\t%16-19R, %0-3R, %8-11R"}, 2159 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2160 0x016000c0, 0x0ff0f0f0, "smulbt%c\t%16-19R, %0-3R, %8-11R"}, 2161 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2162 0x016000e0, 0x0ff0f0f0, "smultt%c\t%16-19R, %0-3R, %8-11R"}, 2163 2164 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2165 0x012000a0, 0x0ff0f0f0, "smulwb%c\t%16-19R, %0-3R, %8-11R"}, 2166 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2167 0x012000e0, 0x0ff0f0f0, "smulwt%c\t%16-19R, %0-3R, %8-11R"}, 2168 2169 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2170 0x01000050, 0x0ff00ff0, "qadd%c\t%12-15R, %0-3R, %16-19R"}, 2171 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2172 0x01400050, 0x0ff00ff0, "qdadd%c\t%12-15R, %0-3R, %16-19R"}, 2173 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2174 0x01200050, 0x0ff00ff0, "qsub%c\t%12-15R, %0-3R, %16-19R"}, 2175 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP), 2176 0x01600050, 0x0ff00ff0, "qdsub%c\t%12-15R, %0-3R, %16-19R"}, 2177 2178 /* ARM Instructions. */ 2179 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2180 0x052d0004, 0x0fff0fff, "push%c\t{%12-15r}\t\t; (str%c %12-15r, %a)"}, 2181 2182 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2183 0x04400000, 0x0e500000, "strb%t%c\t%12-15R, %a"}, 2184 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2185 0x04000000, 0x0e500000, "str%t%c\t%12-15r, %a"}, 2186 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2187 0x06400000, 0x0e500ff0, "strb%t%c\t%12-15R, %a"}, 2188 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2189 0x06000000, 0x0e500ff0, "str%t%c\t%12-15r, %a"}, 2190 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2191 0x04400000, 0x0c500010, "strb%t%c\t%12-15R, %a"}, 2192 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2193 0x04000000, 0x0c500010, "str%t%c\t%12-15r, %a"}, 2194 2195 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2196 0x04400000, 0x0e500000, "strb%c\t%12-15R, %a"}, 2197 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2198 0x06400000, 0x0e500010, "strb%c\t%12-15R, %a"}, 2199 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2200 0x004000b0, 0x0e5000f0, "strh%c\t%12-15R, %s"}, 2201 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2202 0x000000b0, 0x0e500ff0, "strh%c\t%12-15R, %s"}, 2203 2204 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2205 0x00500090, 0x0e5000f0, UNDEFINED_INSTRUCTION}, 2206 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2207 0x00500090, 0x0e500090, "ldr%6's%5?hb%c\t%12-15R, %s"}, 2208 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2209 0x00100090, 0x0e500ff0, UNDEFINED_INSTRUCTION}, 2210 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2211 0x00100090, 0x0e500f90, "ldr%6's%5?hb%c\t%12-15R, %s"}, 2212 2213 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2214 0x02000000, 0x0fe00000, "and%20's%c\t%12-15r, %16-19r, %o"}, 2215 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2216 0x00000000, 0x0fe00010, "and%20's%c\t%12-15r, %16-19r, %o"}, 2217 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2218 0x00000010, 0x0fe00090, "and%20's%c\t%12-15R, %16-19R, %o"}, 2219 2220 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2221 0x02200000, 0x0fe00000, "eor%20's%c\t%12-15r, %16-19r, %o"}, 2222 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2223 0x00200000, 0x0fe00010, "eor%20's%c\t%12-15r, %16-19r, %o"}, 2224 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2225 0x00200010, 0x0fe00090, "eor%20's%c\t%12-15R, %16-19R, %o"}, 2226 2227 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2228 0x02400000, 0x0fe00000, "sub%20's%c\t%12-15r, %16-19r, %o"}, 2229 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2230 0x00400000, 0x0fe00010, "sub%20's%c\t%12-15r, %16-19r, %o"}, 2231 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2232 0x00400010, 0x0fe00090, "sub%20's%c\t%12-15R, %16-19R, %o"}, 2233 2234 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2235 0x02600000, 0x0fe00000, "rsb%20's%c\t%12-15r, %16-19r, %o"}, 2236 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2237 0x00600000, 0x0fe00010, "rsb%20's%c\t%12-15r, %16-19r, %o"}, 2238 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2239 0x00600010, 0x0fe00090, "rsb%20's%c\t%12-15R, %16-19R, %o"}, 2240 2241 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2242 0x02800000, 0x0fe00000, "add%20's%c\t%12-15r, %16-19r, %o"}, 2243 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2244 0x00800000, 0x0fe00010, "add%20's%c\t%12-15r, %16-19r, %o"}, 2245 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2246 0x00800010, 0x0fe00090, "add%20's%c\t%12-15R, %16-19R, %o"}, 2247 2248 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2249 0x02a00000, 0x0fe00000, "adc%20's%c\t%12-15r, %16-19r, %o"}, 2250 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2251 0x00a00000, 0x0fe00010, "adc%20's%c\t%12-15r, %16-19r, %o"}, 2252 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2253 0x00a00010, 0x0fe00090, "adc%20's%c\t%12-15R, %16-19R, %o"}, 2254 2255 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2256 0x02c00000, 0x0fe00000, "sbc%20's%c\t%12-15r, %16-19r, %o"}, 2257 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2258 0x00c00000, 0x0fe00010, "sbc%20's%c\t%12-15r, %16-19r, %o"}, 2259 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2260 0x00c00010, 0x0fe00090, "sbc%20's%c\t%12-15R, %16-19R, %o"}, 2261 2262 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2263 0x02e00000, 0x0fe00000, "rsc%20's%c\t%12-15r, %16-19r, %o"}, 2264 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2265 0x00e00000, 0x0fe00010, "rsc%20's%c\t%12-15r, %16-19r, %o"}, 2266 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2267 0x00e00010, 0x0fe00090, "rsc%20's%c\t%12-15R, %16-19R, %o"}, 2268 2269 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 2270 0x0120f200, 0x0fb0f200, "msr%c\t%C, %0-3r"}, 2271 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3), 2272 0x0120f000, 0x0db0f000, "msr%c\t%C, %o"}, 2273 {ARM_FEATURE_CORE_LOW (ARM_EXT_V3), 2274 0x01000000, 0x0fb00cff, "mrs%c\t%12-15R, %R"}, 2275 2276 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2277 0x03000000, 0x0fe00000, "tst%p%c\t%16-19r, %o"}, 2278 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2279 0x01000000, 0x0fe00010, "tst%p%c\t%16-19r, %o"}, 2280 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2281 0x01000010, 0x0fe00090, "tst%p%c\t%16-19R, %o"}, 2282 2283 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2284 0x03300000, 0x0ff00000, "teq%p%c\t%16-19r, %o"}, 2285 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2286 0x01300000, 0x0ff00010, "teq%p%c\t%16-19r, %o"}, 2287 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2288 0x01300010, 0x0ff00010, "teq%p%c\t%16-19R, %o"}, 2289 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5), 2290 0x0130f000, 0x0ff0f010, "bx%c\t%0-3r"}, 2291 2292 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2293 0x03400000, 0x0fe00000, "cmp%p%c\t%16-19r, %o"}, 2294 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2295 0x01400000, 0x0fe00010, "cmp%p%c\t%16-19r, %o"}, 2296 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2297 0x01400010, 0x0fe00090, "cmp%p%c\t%16-19R, %o"}, 2298 2299 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2300 0x03600000, 0x0fe00000, "cmn%p%c\t%16-19r, %o"}, 2301 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2302 0x01600000, 0x0fe00010, "cmn%p%c\t%16-19r, %o"}, 2303 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2304 0x01600010, 0x0fe00090, "cmn%p%c\t%16-19R, %o"}, 2305 2306 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2307 0x03800000, 0x0fe00000, "orr%20's%c\t%12-15r, %16-19r, %o"}, 2308 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2309 0x01800000, 0x0fe00010, "orr%20's%c\t%12-15r, %16-19r, %o"}, 2310 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2311 0x01800010, 0x0fe00090, "orr%20's%c\t%12-15R, %16-19R, %o"}, 2312 2313 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2314 0x03a00000, 0x0fef0000, "mov%20's%c\t%12-15r, %o"}, 2315 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2316 0x01a00000, 0x0def0ff0, "mov%20's%c\t%12-15r, %0-3r"}, 2317 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2318 0x01a00000, 0x0def0060, "lsl%20's%c\t%12-15R, %q"}, 2319 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2320 0x01a00020, 0x0def0060, "lsr%20's%c\t%12-15R, %q"}, 2321 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2322 0x01a00040, 0x0def0060, "asr%20's%c\t%12-15R, %q"}, 2323 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2324 0x01a00060, 0x0def0ff0, "rrx%20's%c\t%12-15r, %0-3r"}, 2325 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2326 0x01a00060, 0x0def0060, "ror%20's%c\t%12-15R, %q"}, 2327 2328 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2329 0x03c00000, 0x0fe00000, "bic%20's%c\t%12-15r, %16-19r, %o"}, 2330 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2331 0x01c00000, 0x0fe00010, "bic%20's%c\t%12-15r, %16-19r, %o"}, 2332 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2333 0x01c00010, 0x0fe00090, "bic%20's%c\t%12-15R, %16-19R, %o"}, 2334 2335 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2336 0x03e00000, 0x0fe00000, "mvn%20's%c\t%12-15r, %o"}, 2337 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2338 0x01e00000, 0x0fe00010, "mvn%20's%c\t%12-15r, %o"}, 2339 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2340 0x01e00010, 0x0fe00090, "mvn%20's%c\t%12-15R, %o"}, 2341 2342 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2343 0x06000010, 0x0e000010, UNDEFINED_INSTRUCTION}, 2344 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2345 0x049d0004, 0x0fff0fff, "pop%c\t{%12-15r}\t\t; (ldr%c %12-15r, %a)"}, 2346 2347 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2348 0x04500000, 0x0c500000, "ldrb%t%c\t%12-15R, %a"}, 2349 2350 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2351 0x04300000, 0x0d700000, "ldrt%c\t%12-15R, %a"}, 2352 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2353 0x04100000, 0x0c500000, "ldr%c\t%12-15r, %a"}, 2354 2355 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2356 0x092d0001, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 2357 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2358 0x092d0002, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 2359 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2360 0x092d0004, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 2361 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2362 0x092d0008, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 2363 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2364 0x092d0010, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 2365 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2366 0x092d0020, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 2367 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2368 0x092d0040, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 2369 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2370 0x092d0080, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 2371 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2372 0x092d0100, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 2373 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2374 0x092d0200, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 2375 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2376 0x092d0400, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 2377 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2378 0x092d0800, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 2379 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2380 0x092d1000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 2381 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2382 0x092d2000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 2383 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2384 0x092d4000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 2385 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2386 0x092d8000, 0x0fffffff, "stmfd%c\t%16-19R!, %m"}, 2387 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2388 0x092d0000, 0x0fff0000, "push%c\t%m"}, 2389 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2390 0x08800000, 0x0ff00000, "stm%c\t%16-19R%21'!, %m%22'^"}, 2391 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2392 0x08000000, 0x0e100000, "stm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"}, 2393 2394 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2395 0x08bd0001, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 2396 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2397 0x08bd0002, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 2398 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2399 0x08bd0004, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 2400 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2401 0x08bd0008, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 2402 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2403 0x08bd0010, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 2404 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2405 0x08bd0020, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 2406 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2407 0x08bd0040, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 2408 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2409 0x08bd0080, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 2410 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2411 0x08bd0100, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 2412 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2413 0x08bd0200, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 2414 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2415 0x08bd0400, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 2416 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2417 0x08bd0800, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 2418 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2419 0x08bd1000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 2420 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2421 0x08bd2000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 2422 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2423 0x08bd4000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 2424 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2425 0x08bd8000, 0x0fffffff, "ldmfd%c\t%16-19R!, %m"}, 2426 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2427 0x08bd0000, 0x0fff0000, "pop%c\t%m"}, 2428 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2429 0x08900000, 0x0f900000, "ldm%c\t%16-19R%21'!, %m%22'^"}, 2430 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2431 0x08100000, 0x0e100000, "ldm%23?id%24?ba%c\t%16-19R%21'!, %m%22'^"}, 2432 2433 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2434 0x0a000000, 0x0e000000, "b%24'l%c\t%b"}, 2435 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2436 0x0f000000, 0x0f000000, "svc%c\t%0-23x"}, 2437 2438 /* The rest. */ 2439 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 2440 0x03200000, 0x0fff00ff, "nop%c\t{%0-7d}" UNPREDICTABLE_INSTRUCTION}, 2441 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 2442 0x00000000, 0x00000000, UNDEFINED_INSTRUCTION}, 2443 {ARM_FEATURE_CORE_LOW (0), 2444 0x00000000, 0x00000000, 0} 2445 }; 2446 2447 /* print_insn_thumb16 recognizes the following format control codes: 2448 2449 %S print Thumb register (bits 3..5 as high number if bit 6 set) 2450 %D print Thumb register (bits 0..2 as high number if bit 7 set) 2451 %<bitfield>I print bitfield as a signed decimal 2452 (top bit of range being the sign bit) 2453 %N print Thumb register mask (with LR) 2454 %O print Thumb register mask (with PC) 2455 %M print Thumb register mask 2456 %b print CZB's 6-bit unsigned branch destination 2457 %s print Thumb right-shift immediate (6..10; 0 == 32). 2458 %c print the condition code 2459 %C print the condition code, or "s" if not conditional 2460 %x print warning if conditional an not at end of IT block" 2461 %X print "\t; unpredictable <IT:code>" if conditional 2462 %I print IT instruction suffix and operands 2463 %W print Thumb Writeback indicator for LDMIA 2464 %<bitfield>r print bitfield as an ARM register 2465 %<bitfield>d print bitfield as a decimal 2466 %<bitfield>H print (bitfield * 2) as a decimal 2467 %<bitfield>W print (bitfield * 4) as a decimal 2468 %<bitfield>a print (bitfield * 4) as a pc-rel offset + decoded symbol 2469 %<bitfield>B print Thumb branch destination (signed displacement) 2470 %<bitfield>c print bitfield as a condition code 2471 %<bitnum>'c print specified char iff bit is one 2472 %<bitnum>?ab print a if bit is one else print b. */ 2473 2474 static const struct opcode16 thumb_opcodes[] = 2475 { 2476 /* Thumb instructions. */ 2477 2478 /* ARMv8-M Security Extensions instructions. */ 2479 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 0x4784, 0xff87, "blxns\t%3-6r"}, 2480 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 0x4704, 0xff07, "bxns\t%3-6r"}, 2481 2482 /* ARM V8 instructions. */ 2483 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xbf50, 0xffff, "sevl%c"}, 2484 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xba80, 0xffc0, "hlt\t%0-5x"}, 2485 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN), 0xb610, 0xfff7, "setpan\t#%3-3d"}, 2486 2487 /* ARM V6K no-argument instructions. */ 2488 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf00, 0xffff, "nop%c"}, 2489 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf10, 0xffff, "yield%c"}, 2490 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf20, 0xffff, "wfe%c"}, 2491 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf30, 0xffff, "wfi%c"}, 2492 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf40, 0xffff, "sev%c"}, 2493 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6K), 0xbf00, 0xff0f, "nop%c\t{%4-7d}"}, 2494 2495 /* ARM V6T2 instructions. */ 2496 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 2497 0xb900, 0xfd00, "cbnz\t%0-2r, %b%X"}, 2498 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 2499 0xb100, 0xfd00, "cbz\t%0-2r, %b%X"}, 2500 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xbf00, 0xff00, "it%I%X"}, 2501 2502 /* ARM V6. */ 2503 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb660, 0xfff8, "cpsie\t%2'a%1'i%0'f%X"}, 2504 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb670, 0xfff8, "cpsid\t%2'a%1'i%0'f%X"}, 2505 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0x4600, 0xffc0, "mov%c\t%0-2r, %3-5r"}, 2506 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xba00, 0xffc0, "rev%c\t%0-2r, %3-5r"}, 2507 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xba40, 0xffc0, "rev16%c\t%0-2r, %3-5r"}, 2508 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xbac0, 0xffc0, "revsh%c\t%0-2r, %3-5r"}, 2509 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb650, 0xfff7, "setend\t%3?ble%X"}, 2510 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb200, 0xffc0, "sxth%c\t%0-2r, %3-5r"}, 2511 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb240, 0xffc0, "sxtb%c\t%0-2r, %3-5r"}, 2512 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb280, 0xffc0, "uxth%c\t%0-2r, %3-5r"}, 2513 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6), 0xb2c0, 0xffc0, "uxtb%c\t%0-2r, %3-5r"}, 2514 2515 /* ARM V5 ISA extends Thumb. */ 2516 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5T), 2517 0xbe00, 0xff00, "bkpt\t%0-7x"}, /* Is always unconditional. */ 2518 /* This is BLX(2). BLX(1) is a 32-bit instruction. */ 2519 {ARM_FEATURE_CORE_LOW (ARM_EXT_V5T), 2520 0x4780, 0xff87, "blx%c\t%3-6r%x"}, /* note: 4 bit register number. */ 2521 /* ARM V4T ISA (Thumb v1). */ 2522 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2523 0x46C0, 0xFFFF, "nop%c\t\t\t; (mov r8, r8)"}, 2524 /* Format 4. */ 2525 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4000, 0xFFC0, "and%C\t%0-2r, %3-5r"}, 2526 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4040, 0xFFC0, "eor%C\t%0-2r, %3-5r"}, 2527 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4080, 0xFFC0, "lsl%C\t%0-2r, %3-5r"}, 2528 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x40C0, 0xFFC0, "lsr%C\t%0-2r, %3-5r"}, 2529 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4100, 0xFFC0, "asr%C\t%0-2r, %3-5r"}, 2530 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4140, 0xFFC0, "adc%C\t%0-2r, %3-5r"}, 2531 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4180, 0xFFC0, "sbc%C\t%0-2r, %3-5r"}, 2532 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x41C0, 0xFFC0, "ror%C\t%0-2r, %3-5r"}, 2533 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4200, 0xFFC0, "tst%c\t%0-2r, %3-5r"}, 2534 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4240, 0xFFC0, "neg%C\t%0-2r, %3-5r"}, 2535 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4280, 0xFFC0, "cmp%c\t%0-2r, %3-5r"}, 2536 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x42C0, 0xFFC0, "cmn%c\t%0-2r, %3-5r"}, 2537 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4300, 0xFFC0, "orr%C\t%0-2r, %3-5r"}, 2538 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4340, 0xFFC0, "mul%C\t%0-2r, %3-5r"}, 2539 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4380, 0xFFC0, "bic%C\t%0-2r, %3-5r"}, 2540 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x43C0, 0xFFC0, "mvn%C\t%0-2r, %3-5r"}, 2541 /* format 13 */ 2542 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xB000, 0xFF80, "add%c\tsp, #%0-6W"}, 2543 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xB080, 0xFF80, "sub%c\tsp, #%0-6W"}, 2544 /* format 5 */ 2545 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4700, 0xFF80, "bx%c\t%S%x"}, 2546 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4400, 0xFF00, "add%c\t%D, %S"}, 2547 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4500, 0xFF00, "cmp%c\t%D, %S"}, 2548 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x4600, 0xFF00, "mov%c\t%D, %S"}, 2549 /* format 14 */ 2550 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xB400, 0xFE00, "push%c\t%N"}, 2551 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xBC00, 0xFE00, "pop%c\t%O"}, 2552 /* format 2 */ 2553 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2554 0x1800, 0xFE00, "add%C\t%0-2r, %3-5r, %6-8r"}, 2555 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2556 0x1A00, 0xFE00, "sub%C\t%0-2r, %3-5r, %6-8r"}, 2557 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2558 0x1C00, 0xFE00, "add%C\t%0-2r, %3-5r, #%6-8d"}, 2559 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2560 0x1E00, 0xFE00, "sub%C\t%0-2r, %3-5r, #%6-8d"}, 2561 /* format 8 */ 2562 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2563 0x5200, 0xFE00, "strh%c\t%0-2r, [%3-5r, %6-8r]"}, 2564 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2565 0x5A00, 0xFE00, "ldrh%c\t%0-2r, [%3-5r, %6-8r]"}, 2566 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2567 0x5600, 0xF600, "ldrs%11?hb%c\t%0-2r, [%3-5r, %6-8r]"}, 2568 /* format 7 */ 2569 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2570 0x5000, 0xFA00, "str%10'b%c\t%0-2r, [%3-5r, %6-8r]"}, 2571 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2572 0x5800, 0xFA00, "ldr%10'b%c\t%0-2r, [%3-5r, %6-8r]"}, 2573 /* format 1 */ 2574 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x0000, 0xFFC0, "mov%C\t%0-2r, %3-5r"}, 2575 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2576 0x0000, 0xF800, "lsl%C\t%0-2r, %3-5r, #%6-10d"}, 2577 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x0800, 0xF800, "lsr%C\t%0-2r, %3-5r, %s"}, 2578 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x1000, 0xF800, "asr%C\t%0-2r, %3-5r, %s"}, 2579 /* format 3 */ 2580 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x2000, 0xF800, "mov%C\t%8-10r, #%0-7d"}, 2581 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x2800, 0xF800, "cmp%c\t%8-10r, #%0-7d"}, 2582 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x3000, 0xF800, "add%C\t%8-10r, #%0-7d"}, 2583 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0x3800, 0xF800, "sub%C\t%8-10r, #%0-7d"}, 2584 /* format 6 */ 2585 /* TODO: Disassemble PC relative "LDR rD,=<symbolic>" */ 2586 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2587 0x4800, 0xF800, 2588 "ldr%c\t%8-10r, [pc, #%0-7W]\t; (%0-7a)"}, 2589 /* format 9 */ 2590 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2591 0x6000, 0xF800, "str%c\t%0-2r, [%3-5r, #%6-10W]"}, 2592 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2593 0x6800, 0xF800, "ldr%c\t%0-2r, [%3-5r, #%6-10W]"}, 2594 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2595 0x7000, 0xF800, "strb%c\t%0-2r, [%3-5r, #%6-10d]"}, 2596 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2597 0x7800, 0xF800, "ldrb%c\t%0-2r, [%3-5r, #%6-10d]"}, 2598 /* format 10 */ 2599 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2600 0x8000, 0xF800, "strh%c\t%0-2r, [%3-5r, #%6-10H]"}, 2601 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2602 0x8800, 0xF800, "ldrh%c\t%0-2r, [%3-5r, #%6-10H]"}, 2603 /* format 11 */ 2604 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2605 0x9000, 0xF800, "str%c\t%8-10r, [sp, #%0-7W]"}, 2606 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2607 0x9800, 0xF800, "ldr%c\t%8-10r, [sp, #%0-7W]"}, 2608 /* format 12 */ 2609 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2610 0xA000, 0xF800, "add%c\t%8-10r, pc, #%0-7W\t; (adr %8-10r, %0-7a)"}, 2611 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 2612 0xA800, 0xF800, "add%c\t%8-10r, sp, #%0-7W"}, 2613 /* format 15 */ 2614 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xC000, 0xF800, "stmia%c\t%8-10r!, %M"}, 2615 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xC800, 0xF800, "ldmia%c\t%8-10r%W, %M"}, 2616 /* format 17 */ 2617 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xDF00, 0xFF00, "svc%c\t%0-7d"}, 2618 /* format 16 */ 2619 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xDE00, 0xFF00, "udf%c\t#%0-7d"}, 2620 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xDE00, 0xFE00, UNDEFINED_INSTRUCTION}, 2621 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xD000, 0xF000, "b%8-11c.n\t%0-7B%X"}, 2622 /* format 18 */ 2623 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 0xE000, 0xF800, "b%c.n\t%0-10B%x"}, 2624 2625 /* The E800 .. FFFF range is unconditionally redirected to the 2626 32-bit table, because even in pre-V6T2 ISAs, BL and BLX(1) pairs 2627 are processed via that table. Thus, we can never encounter a 2628 bare "second half of BL/BLX(1)" instruction here. */ 2629 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 0x0000, 0x0000, UNDEFINED_INSTRUCTION}, 2630 {ARM_FEATURE_CORE_LOW (0), 0, 0, 0} 2631 }; 2632 2633 /* Thumb32 opcodes use the same table structure as the ARM opcodes. 2634 We adopt the convention that hw1 is the high 16 bits of .value and 2635 .mask, hw2 the low 16 bits. 2636 2637 print_insn_thumb32 recognizes the following format control codes: 2638 2639 %% % 2640 2641 %I print a 12-bit immediate from hw1[10],hw2[14:12,7:0] 2642 %M print a modified 12-bit immediate (same location) 2643 %J print a 16-bit immediate from hw1[3:0,10],hw2[14:12,7:0] 2644 %K print a 16-bit immediate from hw2[3:0],hw1[3:0],hw2[11:4] 2645 %H print a 16-bit immediate from hw2[3:0],hw1[11:0] 2646 %S print a possibly-shifted Rm 2647 2648 %L print address for a ldrd/strd instruction 2649 %a print the address of a plain load/store 2650 %w print the width and signedness of a core load/store 2651 %m print register mask for ldm/stm 2652 2653 %E print the lsb and width fields of a bfc/bfi instruction 2654 %F print the lsb and width fields of a sbfx/ubfx instruction 2655 %b print a conditional branch offset 2656 %B print an unconditional branch offset 2657 %s print the shift field of an SSAT instruction 2658 %R print the rotation field of an SXT instruction 2659 %U print barrier type. 2660 %P print address for pli instruction. 2661 %c print the condition code 2662 %x print warning if conditional an not at end of IT block" 2663 %X print "\t; unpredictable <IT:code>" if conditional 2664 2665 %<bitfield>d print bitfield in decimal 2666 %<bitfield>D print bitfield plus one in decimal 2667 %<bitfield>W print bitfield*4 in decimal 2668 %<bitfield>r print bitfield as an ARM register 2669 %<bitfield>R as %<>r but r15 is UNPREDICTABLE 2670 %<bitfield>S as %<>R but r13 is UNPREDICTABLE 2671 %<bitfield>c print bitfield as a condition code 2672 2673 %<bitfield>'c print specified char iff bitfield is all ones 2674 %<bitfield>`c print specified char iff bitfield is all zeroes 2675 %<bitfield>?ab... select from array of values in big endian order 2676 2677 With one exception at the bottom (done because BL and BLX(1) need 2678 to come dead last), this table was machine-sorted first in 2679 decreasing order of number of bits set in the mask, then in 2680 increasing numeric order of mask, then in increasing numeric order 2681 of opcode. This order is not the clearest for a human reader, but 2682 is guaranteed never to catch a special-case bit pattern with a more 2683 general mask, which is important, because this instruction encoding 2684 makes heavy use of special-case bit patterns. */ 2685 static const struct opcode32 thumb32_opcodes[] = 2686 { 2687 /* ARMv8-M and ARMv8-M Security Extensions instructions. */ 2688 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 0xe97fe97f, 0xffffffff, "sg"}, 2689 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 2690 0xe840f000, 0xfff0f0ff, "tt\t%8-11r, %16-19r"}, 2691 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 2692 0xe840f040, 0xfff0f0ff, "ttt\t%8-11r, %16-19r"}, 2693 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 2694 0xe840f080, 0xfff0f0ff, "tta\t%8-11r, %16-19r"}, 2695 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M), 2696 0xe840f0c0, 0xfff0f0ff, "ttat\t%8-11r, %16-19r"}, 2697 2698 /* ARM V8.2 RAS extension instructions. */ 2699 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS), 2700 0xf3af8010, 0xffffffff, "esb"}, 2701 2702 /* V8 instructions. */ 2703 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 2704 0xf3af8005, 0xffffffff, "sevl%c.w"}, 2705 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 2706 0xf78f8000, 0xfffffffc, "dcps%0-1d"}, 2707 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 2708 0xe8c00f8f, 0xfff00fff, "stlb%c\t%12-15r, [%16-19R]"}, 2709 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 2710 0xe8c00f9f, 0xfff00fff, "stlh%c\t%12-15r, [%16-19R]"}, 2711 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 2712 0xe8c00faf, 0xfff00fff, "stl%c\t%12-15r, [%16-19R]"}, 2713 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 2714 0xe8c00fc0, 0xfff00ff0, "stlexb%c\t%0-3r, %12-15r, [%16-19R]"}, 2715 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 2716 0xe8c00fd0, 0xfff00ff0, "stlexh%c\t%0-3r, %12-15r, [%16-19R]"}, 2717 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 2718 0xe8c00fe0, 0xfff00ff0, "stlex%c\t%0-3r, %12-15r, [%16-19R]"}, 2719 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 2720 0xe8c000f0, 0xfff000f0, "stlexd%c\t%0-3r, %12-15r, %8-11r, [%16-19R]"}, 2721 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 2722 0xe8d00f8f, 0xfff00fff, "ldab%c\t%12-15r, [%16-19R]"}, 2723 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 2724 0xe8d00f9f, 0xfff00fff, "ldah%c\t%12-15r, [%16-19R]"}, 2725 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 2726 0xe8d00faf, 0xfff00fff, "lda%c\t%12-15r, [%16-19R]"}, 2727 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 2728 0xe8d00fcf, 0xfff00fff, "ldaexb%c\t%12-15r, [%16-19R]"}, 2729 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 2730 0xe8d00fdf, 0xfff00fff, "ldaexh%c\t%12-15r, [%16-19R]"}, 2731 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 2732 0xe8d00fef, 0xfff00fff, "ldaex%c\t%12-15r, [%16-19R]"}, 2733 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 2734 0xe8d000ff, 0xfff000ff, "ldaexd%c\t%12-15r, %8-11r, [%16-19R]"}, 2735 2736 /* CRC32 instructions. */ 2737 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8), 2738 0xfac0f080, 0xfff0f0f0, "crc32b\t%8-11S, %16-19S, %0-3S"}, 2739 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8), 2740 0xfac0f090, 0xfff0f0f0, "crc32h\t%9-11S, %16-19S, %0-3S"}, 2741 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8), 2742 0xfac0f0a0, 0xfff0f0f0, "crc32w\t%8-11S, %16-19S, %0-3S"}, 2743 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8), 2744 0xfad0f080, 0xfff0f0f0, "crc32cb\t%8-11S, %16-19S, %0-3S"}, 2745 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8), 2746 0xfad0f090, 0xfff0f0f0, "crc32ch\t%8-11S, %16-19S, %0-3S"}, 2747 {ARM_FEATURE_COPROC (CRC_EXT_ARMV8), 2748 0xfad0f0a0, 0xfff0f0f0, "crc32cw\t%8-11S, %16-19S, %0-3S"}, 2749 2750 /* V7 instructions. */ 2751 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf910f000, 0xff70f000, "pli%c\t%a"}, 2752 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3af80f0, 0xfffffff0, "dbg%c\t#%0-3d"}, 2753 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf3bf8f51, 0xfffffff3, "dmb%c\t%U"}, 2754 {ARM_FEATURE_CORE_LOW (ARM_EXT_V8), 0xf3bf8f41, 0xfffffff3, "dsb%c\t%U"}, 2755 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3bf8f50, 0xfffffff0, "dmb%c\t%U"}, 2756 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3bf8f40, 0xfffffff0, "dsb%c\t%U"}, 2757 {ARM_FEATURE_CORE_LOW (ARM_EXT_V7), 0xf3bf8f60, 0xfffffff0, "isb%c\t%U"}, 2758 {ARM_FEATURE_CORE_LOW (ARM_EXT_DIV), 2759 0xfb90f0f0, 0xfff0f0f0, "sdiv%c\t%8-11r, %16-19r, %0-3r"}, 2760 {ARM_FEATURE_CORE_LOW (ARM_EXT_DIV), 2761 0xfbb0f0f0, 0xfff0f0f0, "udiv%c\t%8-11r, %16-19r, %0-3r"}, 2762 2763 /* Virtualization Extension instructions. */ 2764 {ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT), 0xf7e08000, 0xfff0f000, "hvc%c\t%V"}, 2765 /* We skip ERET as that is SUBS pc, lr, #0. */ 2766 2767 /* MP Extension instructions. */ 2768 {ARM_FEATURE_CORE_LOW (ARM_EXT_MP), 0xf830f000, 0xff70f000, "pldw%c\t%a"}, 2769 2770 /* Security extension instructions. */ 2771 {ARM_FEATURE_CORE_LOW (ARM_EXT_SEC), 0xf7f08000, 0xfff0f000, "smc%c\t%K"}, 2772 2773 /* Instructions defined in the basic V6T2 set. */ 2774 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8000, 0xffffffff, "nop%c.w"}, 2775 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8001, 0xffffffff, "yield%c.w"}, 2776 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8002, 0xffffffff, "wfe%c.w"}, 2777 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8003, 0xffffffff, "wfi%c.w"}, 2778 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf3af8004, 0xffffffff, "sev%c.w"}, 2779 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2780 0xf3af8000, 0xffffff00, "nop%c.w\t{%0-7d}"}, 2781 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 0xf7f0a000, 0xfff0f000, "udf%c.w\t%H"}, 2782 2783 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 2784 0xf3bf8f2f, 0xffffffff, "clrex%c"}, 2785 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2786 0xf3af8400, 0xffffff1f, "cpsie.w\t%7'a%6'i%5'f%X"}, 2787 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2788 0xf3af8600, 0xffffff1f, "cpsid.w\t%7'a%6'i%5'f%X"}, 2789 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2790 0xf3c08f00, 0xfff0ffff, "bxj%c\t%16-19r%x"}, 2791 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2792 0xe810c000, 0xffd0ffff, "rfedb%c\t%16-19r%21'!"}, 2793 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2794 0xe990c000, 0xffd0ffff, "rfeia%c\t%16-19r%21'!"}, 2795 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2796 0xf3e08000, 0xffe0f000, "mrs%c\t%8-11r, %D"}, 2797 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2798 0xf3af8100, 0xffffffe0, "cps\t#%0-4d%X"}, 2799 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2800 0xe8d0f000, 0xfff0fff0, "tbb%c\t[%16-19r, %0-3r]%x"}, 2801 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2802 0xe8d0f010, 0xfff0fff0, "tbh%c\t[%16-19r, %0-3r, lsl #1]%x"}, 2803 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2804 0xf3af8500, 0xffffff00, "cpsie\t%7'a%6'i%5'f, #%0-4d%X"}, 2805 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2806 0xf3af8700, 0xffffff00, "cpsid\t%7'a%6'i%5'f, #%0-4d%X"}, 2807 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2808 0xf3de8f00, 0xffffff00, "subs%c\tpc, lr, #%0-7d"}, 2809 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2810 0xf3808000, 0xffe0f000, "msr%c\t%C, %16-19r"}, 2811 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 2812 0xe8500f00, 0xfff00fff, "ldrex%c\t%12-15r, [%16-19r]"}, 2813 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 2814 0xe8d00f4f, 0xfff00fef, "ldrex%4?hb%c\t%12-15r, [%16-19r]"}, 2815 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2816 0xe800c000, 0xffd0ffe0, "srsdb%c\t%16-19r%21'!, #%0-4d"}, 2817 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2818 0xe980c000, 0xffd0ffe0, "srsia%c\t%16-19r%21'!, #%0-4d"}, 2819 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2820 0xfa0ff080, 0xfffff0c0, "sxth%c.w\t%8-11r, %0-3r%R"}, 2821 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2822 0xfa1ff080, 0xfffff0c0, "uxth%c.w\t%8-11r, %0-3r%R"}, 2823 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2824 0xfa2ff080, 0xfffff0c0, "sxtb16%c\t%8-11r, %0-3r%R"}, 2825 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2826 0xfa3ff080, 0xfffff0c0, "uxtb16%c\t%8-11r, %0-3r%R"}, 2827 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2828 0xfa4ff080, 0xfffff0c0, "sxtb%c.w\t%8-11r, %0-3r%R"}, 2829 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2830 0xfa5ff080, 0xfffff0c0, "uxtb%c.w\t%8-11r, %0-3r%R"}, 2831 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 2832 0xe8400000, 0xfff000ff, "strex%c\t%8-11r, %12-15r, [%16-19r]"}, 2833 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2834 0xe8d0007f, 0xfff000ff, "ldrexd%c\t%12-15r, %8-11r, [%16-19r]"}, 2835 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2836 0xfa80f000, 0xfff0f0f0, "sadd8%c\t%8-11r, %16-19r, %0-3r"}, 2837 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2838 0xfa80f010, 0xfff0f0f0, "qadd8%c\t%8-11r, %16-19r, %0-3r"}, 2839 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2840 0xfa80f020, 0xfff0f0f0, "shadd8%c\t%8-11r, %16-19r, %0-3r"}, 2841 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2842 0xfa80f040, 0xfff0f0f0, "uadd8%c\t%8-11r, %16-19r, %0-3r"}, 2843 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2844 0xfa80f050, 0xfff0f0f0, "uqadd8%c\t%8-11r, %16-19r, %0-3r"}, 2845 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2846 0xfa80f060, 0xfff0f0f0, "uhadd8%c\t%8-11r, %16-19r, %0-3r"}, 2847 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2848 0xfa80f080, 0xfff0f0f0, "qadd%c\t%8-11r, %0-3r, %16-19r"}, 2849 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2850 0xfa80f090, 0xfff0f0f0, "qdadd%c\t%8-11r, %0-3r, %16-19r"}, 2851 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2852 0xfa80f0a0, 0xfff0f0f0, "qsub%c\t%8-11r, %0-3r, %16-19r"}, 2853 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2854 0xfa80f0b0, 0xfff0f0f0, "qdsub%c\t%8-11r, %0-3r, %16-19r"}, 2855 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2856 0xfa90f000, 0xfff0f0f0, "sadd16%c\t%8-11r, %16-19r, %0-3r"}, 2857 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2858 0xfa90f010, 0xfff0f0f0, "qadd16%c\t%8-11r, %16-19r, %0-3r"}, 2859 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2860 0xfa90f020, 0xfff0f0f0, "shadd16%c\t%8-11r, %16-19r, %0-3r"}, 2861 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2862 0xfa90f040, 0xfff0f0f0, "uadd16%c\t%8-11r, %16-19r, %0-3r"}, 2863 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2864 0xfa90f050, 0xfff0f0f0, "uqadd16%c\t%8-11r, %16-19r, %0-3r"}, 2865 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2866 0xfa90f060, 0xfff0f0f0, "uhadd16%c\t%8-11r, %16-19r, %0-3r"}, 2867 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2868 0xfa90f080, 0xfff0f0f0, "rev%c.w\t%8-11r, %16-19r"}, 2869 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2870 0xfa90f090, 0xfff0f0f0, "rev16%c.w\t%8-11r, %16-19r"}, 2871 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2872 0xfa90f0a0, 0xfff0f0f0, "rbit%c\t%8-11r, %16-19r"}, 2873 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2874 0xfa90f0b0, 0xfff0f0f0, "revsh%c.w\t%8-11r, %16-19r"}, 2875 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2876 0xfaa0f000, 0xfff0f0f0, "sasx%c\t%8-11r, %16-19r, %0-3r"}, 2877 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2878 0xfaa0f010, 0xfff0f0f0, "qasx%c\t%8-11r, %16-19r, %0-3r"}, 2879 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2880 0xfaa0f020, 0xfff0f0f0, "shasx%c\t%8-11r, %16-19r, %0-3r"}, 2881 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2882 0xfaa0f040, 0xfff0f0f0, "uasx%c\t%8-11r, %16-19r, %0-3r"}, 2883 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2884 0xfaa0f050, 0xfff0f0f0, "uqasx%c\t%8-11r, %16-19r, %0-3r"}, 2885 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2886 0xfaa0f060, 0xfff0f0f0, "uhasx%c\t%8-11r, %16-19r, %0-3r"}, 2887 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2888 0xfaa0f080, 0xfff0f0f0, "sel%c\t%8-11r, %16-19r, %0-3r"}, 2889 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2890 0xfab0f080, 0xfff0f0f0, "clz%c\t%8-11r, %16-19r"}, 2891 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2892 0xfac0f000, 0xfff0f0f0, "ssub8%c\t%8-11r, %16-19r, %0-3r"}, 2893 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2894 0xfac0f010, 0xfff0f0f0, "qsub8%c\t%8-11r, %16-19r, %0-3r"}, 2895 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2896 0xfac0f020, 0xfff0f0f0, "shsub8%c\t%8-11r, %16-19r, %0-3r"}, 2897 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2898 0xfac0f040, 0xfff0f0f0, "usub8%c\t%8-11r, %16-19r, %0-3r"}, 2899 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2900 0xfac0f050, 0xfff0f0f0, "uqsub8%c\t%8-11r, %16-19r, %0-3r"}, 2901 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2902 0xfac0f060, 0xfff0f0f0, "uhsub8%c\t%8-11r, %16-19r, %0-3r"}, 2903 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2904 0xfad0f000, 0xfff0f0f0, "ssub16%c\t%8-11r, %16-19r, %0-3r"}, 2905 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2906 0xfad0f010, 0xfff0f0f0, "qsub16%c\t%8-11r, %16-19r, %0-3r"}, 2907 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2908 0xfad0f020, 0xfff0f0f0, "shsub16%c\t%8-11r, %16-19r, %0-3r"}, 2909 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2910 0xfad0f040, 0xfff0f0f0, "usub16%c\t%8-11r, %16-19r, %0-3r"}, 2911 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2912 0xfad0f050, 0xfff0f0f0, "uqsub16%c\t%8-11r, %16-19r, %0-3r"}, 2913 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2914 0xfad0f060, 0xfff0f0f0, "uhsub16%c\t%8-11r, %16-19r, %0-3r"}, 2915 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2916 0xfae0f000, 0xfff0f0f0, "ssax%c\t%8-11r, %16-19r, %0-3r"}, 2917 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2918 0xfae0f010, 0xfff0f0f0, "qsax%c\t%8-11r, %16-19r, %0-3r"}, 2919 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2920 0xfae0f020, 0xfff0f0f0, "shsax%c\t%8-11r, %16-19r, %0-3r"}, 2921 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2922 0xfae0f040, 0xfff0f0f0, "usax%c\t%8-11r, %16-19r, %0-3r"}, 2923 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2924 0xfae0f050, 0xfff0f0f0, "uqsax%c\t%8-11r, %16-19r, %0-3r"}, 2925 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2926 0xfae0f060, 0xfff0f0f0, "uhsax%c\t%8-11r, %16-19r, %0-3r"}, 2927 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2928 0xfb00f000, 0xfff0f0f0, "mul%c.w\t%8-11r, %16-19r, %0-3r"}, 2929 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2930 0xfb70f000, 0xfff0f0f0, "usad8%c\t%8-11r, %16-19r, %0-3r"}, 2931 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2932 0xfa00f000, 0xffe0f0f0, "lsl%20's%c.w\t%8-11R, %16-19R, %0-3R"}, 2933 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2934 0xfa20f000, 0xffe0f0f0, "lsr%20's%c.w\t%8-11R, %16-19R, %0-3R"}, 2935 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2936 0xfa40f000, 0xffe0f0f0, "asr%20's%c.w\t%8-11R, %16-19R, %0-3R"}, 2937 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2938 0xfa60f000, 0xffe0f0f0, "ror%20's%c.w\t%8-11r, %16-19r, %0-3r"}, 2939 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 2940 0xe8c00f40, 0xfff00fe0, "strex%4?hb%c\t%0-3r, %12-15r, [%16-19r]"}, 2941 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2942 0xf3200000, 0xfff0f0e0, "ssat16%c\t%8-11r, #%0-4D, %16-19r"}, 2943 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2944 0xf3a00000, 0xfff0f0e0, "usat16%c\t%8-11r, #%0-4d, %16-19r"}, 2945 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2946 0xfb20f000, 0xfff0f0e0, "smuad%4'x%c\t%8-11r, %16-19r, %0-3r"}, 2947 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2948 0xfb30f000, 0xfff0f0e0, "smulw%4?tb%c\t%8-11r, %16-19r, %0-3r"}, 2949 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2950 0xfb40f000, 0xfff0f0e0, "smusd%4'x%c\t%8-11r, %16-19r, %0-3r"}, 2951 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2952 0xfb50f000, 0xfff0f0e0, "smmul%4'r%c\t%8-11r, %16-19r, %0-3r"}, 2953 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2954 0xfa00f080, 0xfff0f0c0, "sxtah%c\t%8-11r, %16-19r, %0-3r%R"}, 2955 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2956 0xfa10f080, 0xfff0f0c0, "uxtah%c\t%8-11r, %16-19r, %0-3r%R"}, 2957 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2958 0xfa20f080, 0xfff0f0c0, "sxtab16%c\t%8-11r, %16-19r, %0-3r%R"}, 2959 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2960 0xfa30f080, 0xfff0f0c0, "uxtab16%c\t%8-11r, %16-19r, %0-3r%R"}, 2961 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2962 0xfa40f080, 0xfff0f0c0, "sxtab%c\t%8-11r, %16-19r, %0-3r%R"}, 2963 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2964 0xfa50f080, 0xfff0f0c0, "uxtab%c\t%8-11r, %16-19r, %0-3r%R"}, 2965 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2966 0xfb10f000, 0xfff0f0c0, "smul%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r"}, 2967 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2968 0xf36f0000, 0xffff8020, "bfc%c\t%8-11r, %E"}, 2969 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2970 0xea100f00, 0xfff08f00, "tst%c.w\t%16-19r, %S"}, 2971 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2972 0xea900f00, 0xfff08f00, "teq%c\t%16-19r, %S"}, 2973 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2974 0xeb100f00, 0xfff08f00, "cmn%c.w\t%16-19r, %S"}, 2975 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2976 0xebb00f00, 0xfff08f00, "cmp%c.w\t%16-19r, %S"}, 2977 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2978 0xf0100f00, 0xfbf08f00, "tst%c.w\t%16-19r, %M"}, 2979 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2980 0xf0900f00, 0xfbf08f00, "teq%c\t%16-19r, %M"}, 2981 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2982 0xf1100f00, 0xfbf08f00, "cmn%c.w\t%16-19r, %M"}, 2983 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2984 0xf1b00f00, 0xfbf08f00, "cmp%c.w\t%16-19r, %M"}, 2985 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2986 0xea4f0000, 0xffef8000, "mov%20's%c.w\t%8-11r, %S"}, 2987 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2988 0xea6f0000, 0xffef8000, "mvn%20's%c.w\t%8-11r, %S"}, 2989 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2990 0xe8c00070, 0xfff000f0, "strexd%c\t%0-3r, %12-15r, %8-11r, [%16-19r]"}, 2991 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2992 0xfb000000, 0xfff000f0, "mla%c\t%8-11r, %16-19r, %0-3r, %12-15r"}, 2993 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2994 0xfb000010, 0xfff000f0, "mls%c\t%8-11r, %16-19r, %0-3r, %12-15r"}, 2995 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2996 0xfb700000, 0xfff000f0, "usada8%c\t%8-11R, %16-19R, %0-3R, %12-15R"}, 2997 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 2998 0xfb800000, 0xfff000f0, "smull%c\t%12-15R, %8-11R, %16-19R, %0-3R"}, 2999 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3000 0xfba00000, 0xfff000f0, "umull%c\t%12-15R, %8-11R, %16-19R, %0-3R"}, 3001 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3002 0xfbc00000, 0xfff000f0, "smlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"}, 3003 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3004 0xfbe00000, 0xfff000f0, "umlal%c\t%12-15R, %8-11R, %16-19R, %0-3R"}, 3005 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3006 0xfbe00060, 0xfff000f0, "umaal%c\t%12-15R, %8-11R, %16-19R, %0-3R"}, 3007 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 3008 0xe8500f00, 0xfff00f00, "ldrex%c\t%12-15r, [%16-19r, #%0-7W]"}, 3009 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3010 0xf04f0000, 0xfbef8000, "mov%20's%c.w\t%8-11r, %M"}, 3011 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3012 0xf06f0000, 0xfbef8000, "mvn%20's%c.w\t%8-11r, %M"}, 3013 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3014 0xf810f000, 0xff70f000, "pld%c\t%a"}, 3015 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3016 0xfb200000, 0xfff000e0, "smlad%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"}, 3017 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3018 0xfb300000, 0xfff000e0, "smlaw%4?tb%c\t%8-11R, %16-19R, %0-3R, %12-15R"}, 3019 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3020 0xfb400000, 0xfff000e0, "smlsd%4'x%c\t%8-11R, %16-19R, %0-3R, %12-15R"}, 3021 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3022 0xfb500000, 0xfff000e0, "smmla%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"}, 3023 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3024 0xfb600000, 0xfff000e0, "smmls%4'r%c\t%8-11R, %16-19R, %0-3R, %12-15R"}, 3025 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3026 0xfbc000c0, 0xfff000e0, "smlald%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"}, 3027 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3028 0xfbd000c0, 0xfff000e0, "smlsld%4'x%c\t%12-15R, %8-11R, %16-19R, %0-3R"}, 3029 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3030 0xeac00000, 0xfff08030, "pkhbt%c\t%8-11r, %16-19r, %S"}, 3031 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3032 0xeac00020, 0xfff08030, "pkhtb%c\t%8-11r, %16-19r, %S"}, 3033 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3034 0xf3400000, 0xfff08020, "sbfx%c\t%8-11r, %16-19r, %F"}, 3035 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3036 0xf3c00000, 0xfff08020, "ubfx%c\t%8-11r, %16-19r, %F"}, 3037 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3038 0xf8000e00, 0xff900f00, "str%wt%c\t%12-15r, %a"}, 3039 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3040 0xfb100000, 0xfff000c0, 3041 "smla%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r, %12-15r"}, 3042 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3043 0xfbc00080, 0xfff000c0, 3044 "smlal%5?tb%4?tb%c\t%12-15r, %8-11r, %16-19r, %0-3r"}, 3045 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3046 0xf3600000, 0xfff08020, "bfi%c\t%8-11r, %16-19r, %E"}, 3047 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3048 0xf8100e00, 0xfe900f00, "ldr%wt%c\t%12-15r, %a"}, 3049 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3050 0xf3000000, 0xffd08020, "ssat%c\t%8-11r, #%0-4D, %16-19r%s"}, 3051 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3052 0xf3800000, 0xffd08020, "usat%c\t%8-11r, #%0-4d, %16-19r%s"}, 3053 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3054 0xf2000000, 0xfbf08000, "addw%c\t%8-11r, %16-19r, %I"}, 3055 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 3056 0xf2400000, 0xfbf08000, "movw%c\t%8-11r, %J"}, 3057 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3058 0xf2a00000, 0xfbf08000, "subw%c\t%8-11r, %16-19r, %I"}, 3059 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 3060 0xf2c00000, 0xfbf08000, "movt%c\t%8-11r, %J"}, 3061 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3062 0xea000000, 0xffe08000, "and%20's%c.w\t%8-11r, %16-19r, %S"}, 3063 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3064 0xea200000, 0xffe08000, "bic%20's%c.w\t%8-11r, %16-19r, %S"}, 3065 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3066 0xea400000, 0xffe08000, "orr%20's%c.w\t%8-11r, %16-19r, %S"}, 3067 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3068 0xea600000, 0xffe08000, "orn%20's%c\t%8-11r, %16-19r, %S"}, 3069 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3070 0xea800000, 0xffe08000, "eor%20's%c.w\t%8-11r, %16-19r, %S"}, 3071 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3072 0xeb000000, 0xffe08000, "add%20's%c.w\t%8-11r, %16-19r, %S"}, 3073 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3074 0xeb400000, 0xffe08000, "adc%20's%c.w\t%8-11r, %16-19r, %S"}, 3075 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3076 0xeb600000, 0xffe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %S"}, 3077 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3078 0xeba00000, 0xffe08000, "sub%20's%c.w\t%8-11r, %16-19r, %S"}, 3079 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3080 0xebc00000, 0xffe08000, "rsb%20's%c\t%8-11r, %16-19r, %S"}, 3081 {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M), 3082 0xe8400000, 0xfff00000, "strex%c\t%8-11r, %12-15r, [%16-19r, #%0-7W]"}, 3083 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3084 0xf0000000, 0xfbe08000, "and%20's%c.w\t%8-11r, %16-19r, %M"}, 3085 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3086 0xf0200000, 0xfbe08000, "bic%20's%c.w\t%8-11r, %16-19r, %M"}, 3087 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3088 0xf0400000, 0xfbe08000, "orr%20's%c.w\t%8-11r, %16-19r, %M"}, 3089 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3090 0xf0600000, 0xfbe08000, "orn%20's%c\t%8-11r, %16-19r, %M"}, 3091 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3092 0xf0800000, 0xfbe08000, "eor%20's%c.w\t%8-11r, %16-19r, %M"}, 3093 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3094 0xf1000000, 0xfbe08000, "add%20's%c.w\t%8-11r, %16-19r, %M"}, 3095 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3096 0xf1400000, 0xfbe08000, "adc%20's%c.w\t%8-11r, %16-19r, %M"}, 3097 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3098 0xf1600000, 0xfbe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %M"}, 3099 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3100 0xf1a00000, 0xfbe08000, "sub%20's%c.w\t%8-11r, %16-19r, %M"}, 3101 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3102 0xf1c00000, 0xfbe08000, "rsb%20's%c\t%8-11r, %16-19r, %M"}, 3103 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3104 0xe8800000, 0xffd00000, "stmia%c.w\t%16-19r%21'!, %m"}, 3105 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3106 0xe8900000, 0xffd00000, "ldmia%c.w\t%16-19r%21'!, %m"}, 3107 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3108 0xe9000000, 0xffd00000, "stmdb%c\t%16-19r%21'!, %m"}, 3109 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3110 0xe9100000, 0xffd00000, "ldmdb%c\t%16-19r%21'!, %m"}, 3111 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3112 0xe9c00000, 0xffd000ff, "strd%c\t%12-15r, %8-11r, [%16-19r]"}, 3113 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3114 0xe9d00000, 0xffd000ff, "ldrd%c\t%12-15r, %8-11r, [%16-19r]"}, 3115 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3116 0xe9400000, 0xff500000, 3117 "strd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!%L"}, 3118 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3119 0xe9500000, 0xff500000, 3120 "ldrd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!%L"}, 3121 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3122 0xe8600000, 0xff700000, 3123 "strd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W%L"}, 3124 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3125 0xe8700000, 0xff700000, 3126 "ldrd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W%L"}, 3127 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3128 0xf8000000, 0xff100000, "str%w%c.w\t%12-15r, %a"}, 3129 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3130 0xf8100000, 0xfe100000, "ldr%w%c.w\t%12-15r, %a"}, 3131 3132 /* Filter out Bcc with cond=E or F, which are used for other instructions. */ 3133 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3134 0xf3c08000, 0xfbc0d000, "undefined (bcc, cond=0xF)"}, 3135 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3136 0xf3808000, 0xfbc0d000, "undefined (bcc, cond=0xE)"}, 3137 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3138 0xf0008000, 0xf800d000, "b%22-25c.w\t%b%X"}, 3139 {ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2), 3140 0xf0009000, 0xf800d000, "b%c.w\t%B%x"}, 3141 3142 /* These have been 32-bit since the invention of Thumb. */ 3143 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 3144 0xf000c000, 0xf800d001, "blx%c\t%B%x"}, 3145 {ARM_FEATURE_CORE_LOW (ARM_EXT_V4T), 3146 0xf000d000, 0xf800d000, "bl%c\t%B%x"}, 3147 3148 /* Fallback. */ 3149 {ARM_FEATURE_CORE_LOW (ARM_EXT_V1), 3150 0x00000000, 0x00000000, UNDEFINED_INSTRUCTION}, 3151 {ARM_FEATURE_CORE_LOW (0), 0, 0, 0} 3152 }; 3153 3154 static const char *const arm_conditional[] = 3155 {"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc", 3156 "hi", "ls", "ge", "lt", "gt", "le", "al", "<und>", ""}; 3157 3158 static const char *const arm_fp_const[] = 3159 {"0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0"}; 3160 3161 static const char *const arm_shift[] = 3162 {"lsl", "lsr", "asr", "ror"}; 3163 3164 typedef struct 3165 { 3166 const char *name; 3167 const char *description; 3168 const char *reg_names[16]; 3169 } 3170 arm_regname; 3171 3172 static const arm_regname regnames[] = 3173 { 3174 { "raw" , "Select raw register names", 3175 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}}, 3176 { "gcc", "Select register names used by GCC", 3177 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "sl", "fp", "ip", "sp", "lr", "pc" }}, 3178 { "std", "Select register names used in ARM's ISA documentation", 3179 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc" }}, 3180 { "apcs", "Select register names used in the APCS", 3181 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "sl", "fp", "ip", "sp", "lr", "pc" }}, 3182 { "atpcs", "Select register names used in the ATPCS", 3183 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "IP", "SP", "LR", "PC" }}, 3184 { "special-atpcs", "Select special register names used in the ATPCS", 3185 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL", "FP", "IP", "SP", "LR", "PC" }}, 3186 }; 3187 3188 static const char *const iwmmxt_wwnames[] = 3189 {"b", "h", "w", "d"}; 3190 3191 static const char *const iwmmxt_wwssnames[] = 3192 {"b", "bus", "bc", "bss", 3193 "h", "hus", "hc", "hss", 3194 "w", "wus", "wc", "wss", 3195 "d", "dus", "dc", "dss" 3196 }; 3197 3198 static const char *const iwmmxt_regnames[] = 3199 { "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7", 3200 "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15" 3201 }; 3202 3203 static const char *const iwmmxt_cregnames[] = 3204 { "wcid", "wcon", "wcssf", "wcasf", "reserved", "reserved", "reserved", "reserved", 3205 "wcgr0", "wcgr1", "wcgr2", "wcgr3", "reserved", "reserved", "reserved", "reserved" 3206 }; 3207 3208 /* Default to GCC register name set. */ 3209 static unsigned int regname_selected = 1; 3210 3211 #define NUM_ARM_REGNAMES NUM_ELEM (regnames) 3212 #define arm_regnames regnames[regname_selected].reg_names 3213 3214 static bfd_boolean force_thumb = FALSE; 3215 3216 /* Current IT instruction state. This contains the same state as the IT 3217 bits in the CPSR. */ 3218 static unsigned int ifthen_state; 3219 /* IT state for the next instruction. */ 3220 static unsigned int ifthen_next_state; 3221 /* The address of the insn for which the IT state is valid. */ 3222 static bfd_vma ifthen_address; 3223 #define IFTHEN_COND ((ifthen_state >> 4) & 0xf) 3224 /* Indicates that the current Conditional state is unconditional or outside 3225 an IT block. */ 3226 #define COND_UNCOND 16 3227 3228 3229 /* Functions. */ 3231 int 3232 get_arm_regname_num_options (void) 3233 { 3234 return NUM_ARM_REGNAMES; 3235 } 3236 3237 int 3238 set_arm_regname_option (int option) 3239 { 3240 int old = regname_selected; 3241 regname_selected = option; 3242 return old; 3243 } 3244 3245 int 3246 get_arm_regnames (int option, 3247 const char **setname, 3248 const char **setdescription, 3249 const char *const **register_names) 3250 { 3251 *setname = regnames[option].name; 3252 *setdescription = regnames[option].description; 3253 *register_names = regnames[option].reg_names; 3254 return 16; 3255 } 3256 3257 /* Decode a bitfield of the form matching regexp (N(-N)?,)*N(-N)?. 3258 Returns pointer to following character of the format string and 3259 fills in *VALUEP and *WIDTHP with the extracted value and number of 3260 bits extracted. WIDTHP can be NULL. */ 3261 3262 static const char * 3263 arm_decode_bitfield (const char *ptr, 3264 unsigned long insn, 3265 unsigned long *valuep, 3266 int *widthp) 3267 { 3268 unsigned long value = 0; 3269 int width = 0; 3270 3271 do 3272 { 3273 int start, end; 3274 int bits; 3275 3276 for (start = 0; *ptr >= '0' && *ptr <= '9'; ptr++) 3277 start = start * 10 + *ptr - '0'; 3278 if (*ptr == '-') 3279 for (end = 0, ptr++; *ptr >= '0' && *ptr <= '9'; ptr++) 3280 end = end * 10 + *ptr - '0'; 3281 else 3282 end = start; 3283 bits = end - start; 3284 if (bits < 0) 3285 abort (); 3286 value |= ((insn >> start) & ((2ul << bits) - 1)) << width; 3287 width += bits + 1; 3288 } 3289 while (*ptr++ == ','); 3290 *valuep = value; 3291 if (widthp) 3292 *widthp = width; 3293 return ptr - 1; 3294 } 3295 3296 static void 3297 arm_decode_shift (long given, fprintf_ftype func, void *stream, 3298 bfd_boolean print_shift) 3299 { 3300 func (stream, "%s", arm_regnames[given & 0xf]); 3301 3302 if ((given & 0xff0) != 0) 3303 { 3304 if ((given & 0x10) == 0) 3305 { 3306 int amount = (given & 0xf80) >> 7; 3307 int shift = (given & 0x60) >> 5; 3308 3309 if (amount == 0) 3310 { 3311 if (shift == 3) 3312 { 3313 func (stream, ", rrx"); 3314 return; 3315 } 3316 3317 amount = 32; 3318 } 3319 3320 if (print_shift) 3321 func (stream, ", %s #%d", arm_shift[shift], amount); 3322 else 3323 func (stream, ", #%d", amount); 3324 } 3325 else if ((given & 0x80) == 0x80) 3326 func (stream, "\t; <illegal shifter operand>"); 3327 else if (print_shift) 3328 func (stream, ", %s %s", arm_shift[(given & 0x60) >> 5], 3329 arm_regnames[(given & 0xf00) >> 8]); 3330 else 3331 func (stream, ", %s", arm_regnames[(given & 0xf00) >> 8]); 3332 } 3333 } 3334 3335 #define W_BIT 21 3336 #define I_BIT 22 3337 #define U_BIT 23 3338 #define P_BIT 24 3339 3340 #define WRITEBACK_BIT_SET (given & (1 << W_BIT)) 3341 #define IMMEDIATE_BIT_SET (given & (1 << I_BIT)) 3342 #define NEGATIVE_BIT_SET ((given & (1 << U_BIT)) == 0) 3343 #define PRE_BIT_SET (given & (1 << P_BIT)) 3344 3345 /* Print one coprocessor instruction on INFO->STREAM. 3346 Return TRUE if the instuction matched, FALSE if this is not a 3347 recognised coprocessor instruction. */ 3348 3349 static bfd_boolean 3350 print_insn_coprocessor (bfd_vma pc, 3351 struct disassemble_info *info, 3352 long given, 3353 bfd_boolean thumb) 3354 { 3355 const struct opcode32 *insn; 3356 void *stream = info->stream; 3357 fprintf_ftype func = info->fprintf_func; 3358 unsigned long mask; 3359 unsigned long value = 0; 3360 int cond; 3361 int cp_num; 3362 struct arm_private_data *private_data = info->private_data; 3363 arm_feature_set allowed_arches = ARM_ARCH_NONE; 3364 3365 ARM_FEATURE_COPY (allowed_arches, private_data->features); 3366 3367 for (insn = coprocessor_opcodes; insn->assembler; insn++) 3368 { 3369 unsigned long u_reg = 16; 3370 bfd_boolean is_unpredictable = FALSE; 3371 signed long value_in_comment = 0; 3372 const char *c; 3373 3374 if (ARM_FEATURE_ZERO (insn->arch)) 3375 switch (insn->value) 3376 { 3377 case SENTINEL_IWMMXT_START: 3378 if (info->mach != bfd_mach_arm_XScale 3379 && info->mach != bfd_mach_arm_iWMMXt 3380 && info->mach != bfd_mach_arm_iWMMXt2) 3381 do 3382 insn++; 3383 while ((! ARM_FEATURE_ZERO (insn->arch)) 3384 && insn->value != SENTINEL_IWMMXT_END); 3385 continue; 3386 3387 case SENTINEL_IWMMXT_END: 3388 continue; 3389 3390 case SENTINEL_GENERIC_START: 3391 ARM_FEATURE_COPY (allowed_arches, private_data->features); 3392 continue; 3393 3394 default: 3395 abort (); 3396 } 3397 3398 mask = insn->mask; 3399 value = insn->value; 3400 cp_num = (given >> 8) & 0xf; 3401 3402 if (thumb) 3403 { 3404 /* The high 4 bits are 0xe for Arm conditional instructions, and 3405 0xe for arm unconditional instructions. The rest of the 3406 encoding is the same. */ 3407 mask |= 0xf0000000; 3408 value |= 0xe0000000; 3409 if (ifthen_state) 3410 cond = IFTHEN_COND; 3411 else 3412 cond = COND_UNCOND; 3413 } 3414 else 3415 { 3416 /* Only match unconditional instuctions against unconditional 3417 patterns. */ 3418 if ((given & 0xf0000000) == 0xf0000000) 3419 { 3420 mask |= 0xf0000000; 3421 cond = COND_UNCOND; 3422 } 3423 else 3424 { 3425 cond = (given >> 28) & 0xf; 3426 if (cond == 0xe) 3427 cond = COND_UNCOND; 3428 } 3429 } 3430 3431 if ((given & mask) != value) 3432 continue; 3433 3434 if (! ARM_CPU_HAS_FEATURE (insn->arch, allowed_arches)) 3435 continue; 3436 3437 if (insn->value == 0xfe000010 /* mcr2 */ 3438 || insn->value == 0xfe100010 /* mrc2 */ 3439 || insn->value == 0xfc100000 /* ldc2 */ 3440 || insn->value == 0xfc000000) /* stc2 */ 3441 { 3442 if (cp_num == 9 || cp_num == 10 || cp_num == 11) 3443 is_unpredictable = TRUE; 3444 } 3445 else if (insn->value == 0x0e000000 /* cdp */ 3446 || insn->value == 0xfe000000 /* cdp2 */ 3447 || insn->value == 0x0e000010 /* mcr */ 3448 || insn->value == 0x0e100010 /* mrc */ 3449 || insn->value == 0x0c100000 /* ldc */ 3450 || insn->value == 0x0c000000) /* stc */ 3451 { 3452 /* Floating-point instructions. */ 3453 if (cp_num == 9 || cp_num == 10 || cp_num == 11) 3454 continue; 3455 } 3456 3457 for (c = insn->assembler; *c; c++) 3458 { 3459 if (*c == '%') 3460 { 3461 switch (*++c) 3462 { 3463 case '%': 3464 func (stream, "%%"); 3465 break; 3466 3467 case 'A': 3468 { 3469 int rn = (given >> 16) & 0xf; 3470 bfd_vma offset = given & 0xff; 3471 3472 func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]); 3473 3474 if (PRE_BIT_SET || WRITEBACK_BIT_SET) 3475 { 3476 /* Not unindexed. The offset is scaled. */ 3477 if (cp_num == 9) 3478 /* vldr.16/vstr.16 will shift the address 3479 left by 1 bit only. */ 3480 offset = offset * 2; 3481 else 3482 offset = offset * 4; 3483 3484 if (NEGATIVE_BIT_SET) 3485 offset = - offset; 3486 if (rn != 15) 3487 value_in_comment = offset; 3488 } 3489 3490 if (PRE_BIT_SET) 3491 { 3492 if (offset) 3493 func (stream, ", #%d]%s", 3494 (int) offset, 3495 WRITEBACK_BIT_SET ? "!" : ""); 3496 else if (NEGATIVE_BIT_SET) 3497 func (stream, ", #-0]"); 3498 else 3499 func (stream, "]"); 3500 } 3501 else 3502 { 3503 func (stream, "]"); 3504 3505 if (WRITEBACK_BIT_SET) 3506 { 3507 if (offset) 3508 func (stream, ", #%d", (int) offset); 3509 else if (NEGATIVE_BIT_SET) 3510 func (stream, ", #-0"); 3511 } 3512 else 3513 { 3514 func (stream, ", {%s%d}", 3515 (NEGATIVE_BIT_SET && !offset) ? "-" : "", 3516 (int) offset); 3517 value_in_comment = offset; 3518 } 3519 } 3520 if (rn == 15 && (PRE_BIT_SET || WRITEBACK_BIT_SET)) 3521 { 3522 func (stream, "\t; "); 3523 /* For unaligned PCs, apply off-by-alignment 3524 correction. */ 3525 info->print_address_func (offset + pc 3526 + info->bytes_per_chunk * 2 3527 - (pc & 3), 3528 info); 3529 } 3530 } 3531 break; 3532 3533 case 'B': 3534 { 3535 int regno = ((given >> 12) & 0xf) | ((given >> (22 - 4)) & 0x10); 3536 int offset = (given >> 1) & 0x3f; 3537 3538 if (offset == 1) 3539 func (stream, "{d%d}", regno); 3540 else if (regno + offset > 32) 3541 func (stream, "{d%d-<overflow reg d%d>}", regno, regno + offset - 1); 3542 else 3543 func (stream, "{d%d-d%d}", regno, regno + offset - 1); 3544 } 3545 break; 3546 3547 case 'u': 3548 if (cond != COND_UNCOND) 3549 is_unpredictable = TRUE; 3550 3551 /* Fall through. */ 3552 case 'c': 3553 if (cond != COND_UNCOND && cp_num == 9) 3554 is_unpredictable = TRUE; 3555 3556 func (stream, "%s", arm_conditional[cond]); 3557 break; 3558 3559 case 'I': 3560 /* Print a Cirrus/DSP shift immediate. */ 3561 /* Immediates are 7bit signed ints with bits 0..3 in 3562 bits 0..3 of opcode and bits 4..6 in bits 5..7 3563 of opcode. */ 3564 { 3565 int imm; 3566 3567 imm = (given & 0xf) | ((given & 0xe0) >> 1); 3568 3569 /* Is ``imm'' a negative number? */ 3570 if (imm & 0x40) 3571 imm -= 0x80; 3572 3573 func (stream, "%d", imm); 3574 } 3575 3576 break; 3577 3578 case 'F': 3579 switch (given & 0x00408000) 3580 { 3581 case 0: 3582 func (stream, "4"); 3583 break; 3584 case 0x8000: 3585 func (stream, "1"); 3586 break; 3587 case 0x00400000: 3588 func (stream, "2"); 3589 break; 3590 default: 3591 func (stream, "3"); 3592 } 3593 break; 3594 3595 case 'P': 3596 switch (given & 0x00080080) 3597 { 3598 case 0: 3599 func (stream, "s"); 3600 break; 3601 case 0x80: 3602 func (stream, "d"); 3603 break; 3604 case 0x00080000: 3605 func (stream, "e"); 3606 break; 3607 default: 3608 func (stream, _("<illegal precision>")); 3609 break; 3610 } 3611 break; 3612 3613 case 'Q': 3614 switch (given & 0x00408000) 3615 { 3616 case 0: 3617 func (stream, "s"); 3618 break; 3619 case 0x8000: 3620 func (stream, "d"); 3621 break; 3622 case 0x00400000: 3623 func (stream, "e"); 3624 break; 3625 default: 3626 func (stream, "p"); 3627 break; 3628 } 3629 break; 3630 3631 case 'R': 3632 switch (given & 0x60) 3633 { 3634 case 0: 3635 break; 3636 case 0x20: 3637 func (stream, "p"); 3638 break; 3639 case 0x40: 3640 func (stream, "m"); 3641 break; 3642 default: 3643 func (stream, "z"); 3644 break; 3645 } 3646 break; 3647 3648 case '0': case '1': case '2': case '3': case '4': 3649 case '5': case '6': case '7': case '8': case '9': 3650 { 3651 int width; 3652 3653 c = arm_decode_bitfield (c, given, &value, &width); 3654 3655 switch (*c) 3656 { 3657 case 'R': 3658 if (value == 15) 3659 is_unpredictable = TRUE; 3660 /* Fall through. */ 3661 case 'r': 3662 if (c[1] == 'u') 3663 { 3664 /* Eat the 'u' character. */ 3665 ++ c; 3666 3667 if (u_reg == value) 3668 is_unpredictable = TRUE; 3669 u_reg = value; 3670 } 3671 func (stream, "%s", arm_regnames[value]); 3672 break; 3673 case 'D': 3674 func (stream, "d%ld", value); 3675 break; 3676 case 'Q': 3677 if (value & 1) 3678 func (stream, "<illegal reg q%ld.5>", value >> 1); 3679 else 3680 func (stream, "q%ld", value >> 1); 3681 break; 3682 case 'd': 3683 func (stream, "%ld", value); 3684 value_in_comment = value; 3685 break; 3686 case 'E': 3687 { 3688 /* Converts immediate 8 bit back to float value. */ 3689 unsigned floatVal = (value & 0x80) << 24 3690 | (value & 0x3F) << 19 3691 | ((value & 0x40) ? (0xF8 << 22) : (1 << 30)); 3692 3693 /* Quarter float have a maximum value of 31.0. 3694 Get floating point value multiplied by 1e7. 3695 The maximum value stays in limit of a 32-bit int. */ 3696 unsigned decVal = 3697 (78125 << (((floatVal >> 23) & 0xFF) - 124)) * 3698 (16 + (value & 0xF)); 3699 3700 if (!(decVal % 1000000)) 3701 func (stream, "%ld\t; 0x%08x %c%u.%01u", value, 3702 floatVal, value & 0x80 ? '-' : ' ', 3703 decVal / 10000000, 3704 decVal % 10000000 / 1000000); 3705 else if (!(decVal % 10000)) 3706 func (stream, "%ld\t; 0x%08x %c%u.%03u", value, 3707 floatVal, value & 0x80 ? '-' : ' ', 3708 decVal / 10000000, 3709 decVal % 10000000 / 10000); 3710 else 3711 func (stream, "%ld\t; 0x%08x %c%u.%07u", value, 3712 floatVal, value & 0x80 ? '-' : ' ', 3713 decVal / 10000000, decVal % 10000000); 3714 break; 3715 } 3716 case 'k': 3717 { 3718 int from = (given & (1 << 7)) ? 32 : 16; 3719 func (stream, "%ld", from - value); 3720 } 3721 break; 3722 3723 case 'f': 3724 if (value > 7) 3725 func (stream, "#%s", arm_fp_const[value & 7]); 3726 else 3727 func (stream, "f%ld", value); 3728 break; 3729 3730 case 'w': 3731 if (width == 2) 3732 func (stream, "%s", iwmmxt_wwnames[value]); 3733 else 3734 func (stream, "%s", iwmmxt_wwssnames[value]); 3735 break; 3736 3737 case 'g': 3738 func (stream, "%s", iwmmxt_regnames[value]); 3739 break; 3740 case 'G': 3741 func (stream, "%s", iwmmxt_cregnames[value]); 3742 break; 3743 3744 case 'x': 3745 func (stream, "0x%lx", (value & 0xffffffffUL)); 3746 break; 3747 3748 case 'c': 3749 switch (value) 3750 { 3751 case 0: 3752 func (stream, "eq"); 3753 break; 3754 3755 case 1: 3756 func (stream, "vs"); 3757 break; 3758 3759 case 2: 3760 func (stream, "ge"); 3761 break; 3762 3763 case 3: 3764 func (stream, "gt"); 3765 break; 3766 3767 default: 3768 func (stream, "??"); 3769 break; 3770 } 3771 break; 3772 3773 case '`': 3774 c++; 3775 if (value == 0) 3776 func (stream, "%c", *c); 3777 break; 3778 case '\'': 3779 c++; 3780 if (value == ((1ul << width) - 1)) 3781 func (stream, "%c", *c); 3782 break; 3783 case '?': 3784 func (stream, "%c", c[(1 << width) - (int) value]); 3785 c += 1 << width; 3786 break; 3787 default: 3788 abort (); 3789 } 3790 break; 3791 3792 case 'y': 3793 case 'z': 3794 { 3795 int single = *c++ == 'y'; 3796 int regno; 3797 3798 switch (*c) 3799 { 3800 case '4': /* Sm pair */ 3801 case '0': /* Sm, Dm */ 3802 regno = given & 0x0000000f; 3803 if (single) 3804 { 3805 regno <<= 1; 3806 regno += (given >> 5) & 1; 3807 } 3808 else 3809 regno += ((given >> 5) & 1) << 4; 3810 break; 3811 3812 case '1': /* Sd, Dd */ 3813 regno = (given >> 12) & 0x0000000f; 3814 if (single) 3815 { 3816 regno <<= 1; 3817 regno += (given >> 22) & 1; 3818 } 3819 else 3820 regno += ((given >> 22) & 1) << 4; 3821 break; 3822 3823 case '2': /* Sn, Dn */ 3824 regno = (given >> 16) & 0x0000000f; 3825 if (single) 3826 { 3827 regno <<= 1; 3828 regno += (given >> 7) & 1; 3829 } 3830 else 3831 regno += ((given >> 7) & 1) << 4; 3832 break; 3833 3834 case '3': /* List */ 3835 func (stream, "{"); 3836 regno = (given >> 12) & 0x0000000f; 3837 if (single) 3838 { 3839 regno <<= 1; 3840 regno += (given >> 22) & 1; 3841 } 3842 else 3843 regno += ((given >> 22) & 1) << 4; 3844 break; 3845 3846 default: 3847 abort (); 3848 } 3849 3850 func (stream, "%c%d", single ? 's' : 'd', regno); 3851 3852 if (*c == '3') 3853 { 3854 int count = given & 0xff; 3855 3856 if (single == 0) 3857 count >>= 1; 3858 3859 if (--count) 3860 { 3861 func (stream, "-%c%d", 3862 single ? 's' : 'd', 3863 regno + count); 3864 } 3865 3866 func (stream, "}"); 3867 } 3868 else if (*c == '4') 3869 func (stream, ", %c%d", single ? 's' : 'd', 3870 regno + 1); 3871 } 3872 break; 3873 3874 case 'L': 3875 switch (given & 0x00400100) 3876 { 3877 case 0x00000000: func (stream, "b"); break; 3878 case 0x00400000: func (stream, "h"); break; 3879 case 0x00000100: func (stream, "w"); break; 3880 case 0x00400100: func (stream, "d"); break; 3881 default: 3882 break; 3883 } 3884 break; 3885 3886 case 'Z': 3887 { 3888 /* given (20, 23) | given (0, 3) */ 3889 value = ((given >> 16) & 0xf0) | (given & 0xf); 3890 func (stream, "%d", (int) value); 3891 } 3892 break; 3893 3894 case 'l': 3895 /* This is like the 'A' operator, except that if 3896 the width field "M" is zero, then the offset is 3897 *not* multiplied by four. */ 3898 { 3899 int offset = given & 0xff; 3900 int multiplier = (given & 0x00000100) ? 4 : 1; 3901 3902 func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]); 3903 3904 if (multiplier > 1) 3905 { 3906 value_in_comment = offset * multiplier; 3907 if (NEGATIVE_BIT_SET) 3908 value_in_comment = - value_in_comment; 3909 } 3910 3911 if (offset) 3912 { 3913 if (PRE_BIT_SET) 3914 func (stream, ", #%s%d]%s", 3915 NEGATIVE_BIT_SET ? "-" : "", 3916 offset * multiplier, 3917 WRITEBACK_BIT_SET ? "!" : ""); 3918 else 3919 func (stream, "], #%s%d", 3920 NEGATIVE_BIT_SET ? "-" : "", 3921 offset * multiplier); 3922 } 3923 else 3924 func (stream, "]"); 3925 } 3926 break; 3927 3928 case 'r': 3929 { 3930 int imm4 = (given >> 4) & 0xf; 3931 int puw_bits = ((given >> 22) & 6) | ((given >> W_BIT) & 1); 3932 int ubit = ! NEGATIVE_BIT_SET; 3933 const char *rm = arm_regnames [given & 0xf]; 3934 const char *rn = arm_regnames [(given >> 16) & 0xf]; 3935 3936 switch (puw_bits) 3937 { 3938 case 1: 3939 case 3: 3940 func (stream, "[%s], %c%s", rn, ubit ? '+' : '-', rm); 3941 if (imm4) 3942 func (stream, ", lsl #%d", imm4); 3943 break; 3944 3945 case 4: 3946 case 5: 3947 case 6: 3948 case 7: 3949 func (stream, "[%s, %c%s", rn, ubit ? '+' : '-', rm); 3950 if (imm4 > 0) 3951 func (stream, ", lsl #%d", imm4); 3952 func (stream, "]"); 3953 if (puw_bits == 5 || puw_bits == 7) 3954 func (stream, "!"); 3955 break; 3956 3957 default: 3958 func (stream, "INVALID"); 3959 } 3960 } 3961 break; 3962 3963 case 'i': 3964 { 3965 long imm5; 3966 imm5 = ((given & 0x100) >> 4) | (given & 0xf); 3967 func (stream, "%ld", (imm5 == 0) ? 32 : imm5); 3968 } 3969 break; 3970 3971 default: 3972 abort (); 3973 } 3974 } 3975 } 3976 else 3977 func (stream, "%c", *c); 3978 } 3979 3980 if (value_in_comment > 32 || value_in_comment < -16) 3981 func (stream, "\t; 0x%lx", (value_in_comment & 0xffffffffUL)); 3982 3983 if (is_unpredictable) 3984 func (stream, UNPREDICTABLE_INSTRUCTION); 3985 3986 return TRUE; 3987 } 3988 return FALSE; 3989 } 3990 3991 /* Decodes and prints ARM addressing modes. Returns the offset 3992 used in the address, if any, if it is worthwhile printing the 3993 offset as a hexadecimal value in a comment at the end of the 3994 line of disassembly. */ 3995 3996 static signed long 3997 print_arm_address (bfd_vma pc, struct disassemble_info *info, long given) 3998 { 3999 void *stream = info->stream; 4000 fprintf_ftype func = info->fprintf_func; 4001 bfd_vma offset = 0; 4002 4003 if (((given & 0x000f0000) == 0x000f0000) 4004 && ((given & 0x02000000) == 0)) 4005 { 4006 offset = given & 0xfff; 4007 4008 func (stream, "[pc"); 4009 4010 if (PRE_BIT_SET) 4011 { 4012 /* Pre-indexed. Elide offset of positive zero when 4013 non-writeback. */ 4014 if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET || offset) 4015 func (stream, ", #%s%d", NEGATIVE_BIT_SET ? "-" : "", (int) offset); 4016 4017 if (NEGATIVE_BIT_SET) 4018 offset = -offset; 4019 4020 offset += pc + 8; 4021 4022 /* Cope with the possibility of write-back 4023 being used. Probably a very dangerous thing 4024 for the programmer to do, but who are we to 4025 argue ? */ 4026 func (stream, "]%s", WRITEBACK_BIT_SET ? "!" : ""); 4027 } 4028 else /* Post indexed. */ 4029 { 4030 func (stream, "], #%s%d", NEGATIVE_BIT_SET ? "-" : "", (int) offset); 4031 4032 /* Ie ignore the offset. */ 4033 offset = pc + 8; 4034 } 4035 4036 func (stream, "\t; "); 4037 info->print_address_func (offset, info); 4038 offset = 0; 4039 } 4040 else 4041 { 4042 func (stream, "[%s", 4043 arm_regnames[(given >> 16) & 0xf]); 4044 4045 if (PRE_BIT_SET) 4046 { 4047 if ((given & 0x02000000) == 0) 4048 { 4049 /* Elide offset of positive zero when non-writeback. */ 4050 offset = given & 0xfff; 4051 if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET || offset) 4052 func (stream, ", #%s%d", NEGATIVE_BIT_SET ? "-" : "", (int) offset); 4053 } 4054 else 4055 { 4056 func (stream, ", %s", NEGATIVE_BIT_SET ? "-" : ""); 4057 arm_decode_shift (given, func, stream, TRUE); 4058 } 4059 4060 func (stream, "]%s", 4061 WRITEBACK_BIT_SET ? "!" : ""); 4062 } 4063 else 4064 { 4065 if ((given & 0x02000000) == 0) 4066 { 4067 /* Always show offset. */ 4068 offset = given & 0xfff; 4069 func (stream, "], #%s%d", 4070 NEGATIVE_BIT_SET ? "-" : "", (int) offset); 4071 } 4072 else 4073 { 4074 func (stream, "], %s", 4075 NEGATIVE_BIT_SET ? "-" : ""); 4076 arm_decode_shift (given, func, stream, TRUE); 4077 } 4078 } 4079 if (NEGATIVE_BIT_SET) 4080 offset = -offset; 4081 } 4082 4083 return (signed long) offset; 4084 } 4085 4086 /* Print one neon instruction on INFO->STREAM. 4087 Return TRUE if the instuction matched, FALSE if this is not a 4088 recognised neon instruction. */ 4089 4090 static bfd_boolean 4091 print_insn_neon (struct disassemble_info *info, long given, bfd_boolean thumb) 4092 { 4093 const struct opcode32 *insn; 4094 void *stream = info->stream; 4095 fprintf_ftype func = info->fprintf_func; 4096 4097 if (thumb) 4098 { 4099 if ((given & 0xef000000) == 0xef000000) 4100 { 4101 /* Move bit 28 to bit 24 to translate Thumb2 to ARM encoding. */ 4102 unsigned long bit28 = given & (1 << 28); 4103 4104 given &= 0x00ffffff; 4105 if (bit28) 4106 given |= 0xf3000000; 4107 else 4108 given |= 0xf2000000; 4109 } 4110 else if ((given & 0xff000000) == 0xf9000000) 4111 given ^= 0xf9000000 ^ 0xf4000000; 4112 else 4113 return FALSE; 4114 } 4115 4116 for (insn = neon_opcodes; insn->assembler; insn++) 4117 { 4118 if ((given & insn->mask) == insn->value) 4119 { 4120 signed long value_in_comment = 0; 4121 bfd_boolean is_unpredictable = FALSE; 4122 const char *c; 4123 4124 for (c = insn->assembler; *c; c++) 4125 { 4126 if (*c == '%') 4127 { 4128 switch (*++c) 4129 { 4130 case '%': 4131 func (stream, "%%"); 4132 break; 4133 4134 case 'u': 4135 if (thumb && ifthen_state) 4136 is_unpredictable = TRUE; 4137 4138 /* Fall through. */ 4139 case 'c': 4140 if (thumb && ifthen_state) 4141 func (stream, "%s", arm_conditional[IFTHEN_COND]); 4142 break; 4143 4144 case 'A': 4145 { 4146 static const unsigned char enc[16] = 4147 { 4148 0x4, 0x14, /* st4 0,1 */ 4149 0x4, /* st1 2 */ 4150 0x4, /* st2 3 */ 4151 0x3, /* st3 4 */ 4152 0x13, /* st3 5 */ 4153 0x3, /* st1 6 */ 4154 0x1, /* st1 7 */ 4155 0x2, /* st2 8 */ 4156 0x12, /* st2 9 */ 4157 0x2, /* st1 10 */ 4158 0, 0, 0, 0, 0 4159 }; 4160 int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4); 4161 int rn = ((given >> 16) & 0xf); 4162 int rm = ((given >> 0) & 0xf); 4163 int align = ((given >> 4) & 0x3); 4164 int type = ((given >> 8) & 0xf); 4165 int n = enc[type] & 0xf; 4166 int stride = (enc[type] >> 4) + 1; 4167 int ix; 4168 4169 func (stream, "{"); 4170 if (stride > 1) 4171 for (ix = 0; ix != n; ix++) 4172 func (stream, "%sd%d", ix ? "," : "", rd + ix * stride); 4173 else if (n == 1) 4174 func (stream, "d%d", rd); 4175 else 4176 func (stream, "d%d-d%d", rd, rd + n - 1); 4177 func (stream, "}, [%s", arm_regnames[rn]); 4178 if (align) 4179 func (stream, " :%d", 32 << align); 4180 func (stream, "]"); 4181 if (rm == 0xd) 4182 func (stream, "!"); 4183 else if (rm != 0xf) 4184 func (stream, ", %s", arm_regnames[rm]); 4185 } 4186 break; 4187 4188 case 'B': 4189 { 4190 int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4); 4191 int rn = ((given >> 16) & 0xf); 4192 int rm = ((given >> 0) & 0xf); 4193 int idx_align = ((given >> 4) & 0xf); 4194 int align = 0; 4195 int size = ((given >> 10) & 0x3); 4196 int idx = idx_align >> (size + 1); 4197 int length = ((given >> 8) & 3) + 1; 4198 int stride = 1; 4199 int i; 4200 4201 if (length > 1 && size > 0) 4202 stride = (idx_align & (1 << size)) ? 2 : 1; 4203 4204 switch (length) 4205 { 4206 case 1: 4207 { 4208 int amask = (1 << size) - 1; 4209 if ((idx_align & (1 << size)) != 0) 4210 return FALSE; 4211 if (size > 0) 4212 { 4213 if ((idx_align & amask) == amask) 4214 align = 8 << size; 4215 else if ((idx_align & amask) != 0) 4216 return FALSE; 4217 } 4218 } 4219 break; 4220 4221 case 2: 4222 if (size == 2 && (idx_align & 2) != 0) 4223 return FALSE; 4224 align = (idx_align & 1) ? 16 << size : 0; 4225 break; 4226 4227 case 3: 4228 if ((size == 2 && (idx_align & 3) != 0) 4229 || (idx_align & 1) != 0) 4230 return FALSE; 4231 break; 4232 4233 case 4: 4234 if (size == 2) 4235 { 4236 if ((idx_align & 3) == 3) 4237 return FALSE; 4238 align = (idx_align & 3) * 64; 4239 } 4240 else 4241 align = (idx_align & 1) ? 32 << size : 0; 4242 break; 4243 4244 default: 4245 abort (); 4246 } 4247 4248 func (stream, "{"); 4249 for (i = 0; i < length; i++) 4250 func (stream, "%sd%d[%d]", (i == 0) ? "" : ",", 4251 rd + i * stride, idx); 4252 func (stream, "}, [%s", arm_regnames[rn]); 4253 if (align) 4254 func (stream, " :%d", align); 4255 func (stream, "]"); 4256 if (rm == 0xd) 4257 func (stream, "!"); 4258 else if (rm != 0xf) 4259 func (stream, ", %s", arm_regnames[rm]); 4260 } 4261 break; 4262 4263 case 'C': 4264 { 4265 int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4); 4266 int rn = ((given >> 16) & 0xf); 4267 int rm = ((given >> 0) & 0xf); 4268 int align = ((given >> 4) & 0x1); 4269 int size = ((given >> 6) & 0x3); 4270 int type = ((given >> 8) & 0x3); 4271 int n = type + 1; 4272 int stride = ((given >> 5) & 0x1); 4273 int ix; 4274 4275 if (stride && (n == 1)) 4276 n++; 4277 else 4278 stride++; 4279 4280 func (stream, "{"); 4281 if (stride > 1) 4282 for (ix = 0; ix != n; ix++) 4283 func (stream, "%sd%d[]", ix ? "," : "", rd + ix * stride); 4284 else if (n == 1) 4285 func (stream, "d%d[]", rd); 4286 else 4287 func (stream, "d%d[]-d%d[]", rd, rd + n - 1); 4288 func (stream, "}, [%s", arm_regnames[rn]); 4289 if (align) 4290 { 4291 align = (8 * (type + 1)) << size; 4292 if (type == 3) 4293 align = (size > 1) ? align >> 1 : align; 4294 if (type == 2 || (type == 0 && !size)) 4295 func (stream, " :<bad align %d>", align); 4296 else 4297 func (stream, " :%d", align); 4298 } 4299 func (stream, "]"); 4300 if (rm == 0xd) 4301 func (stream, "!"); 4302 else if (rm != 0xf) 4303 func (stream, ", %s", arm_regnames[rm]); 4304 } 4305 break; 4306 4307 case 'D': 4308 { 4309 int raw_reg = (given & 0xf) | ((given >> 1) & 0x10); 4310 int size = (given >> 20) & 3; 4311 int reg = raw_reg & ((4 << size) - 1); 4312 int ix = raw_reg >> size >> 2; 4313 4314 func (stream, "d%d[%d]", reg, ix); 4315 } 4316 break; 4317 4318 case 'E': 4319 /* Neon encoded constant for mov, mvn, vorr, vbic. */ 4320 { 4321 int bits = 0; 4322 int cmode = (given >> 8) & 0xf; 4323 int op = (given >> 5) & 0x1; 4324 unsigned long value = 0, hival = 0; 4325 unsigned shift; 4326 int size = 0; 4327 int isfloat = 0; 4328 4329 bits |= ((given >> 24) & 1) << 7; 4330 bits |= ((given >> 16) & 7) << 4; 4331 bits |= ((given >> 0) & 15) << 0; 4332 4333 if (cmode < 8) 4334 { 4335 shift = (cmode >> 1) & 3; 4336 value = (unsigned long) bits << (8 * shift); 4337 size = 32; 4338 } 4339 else if (cmode < 12) 4340 { 4341 shift = (cmode >> 1) & 1; 4342 value = (unsigned long) bits << (8 * shift); 4343 size = 16; 4344 } 4345 else if (cmode < 14) 4346 { 4347 shift = (cmode & 1) + 1; 4348 value = (unsigned long) bits << (8 * shift); 4349 value |= (1ul << (8 * shift)) - 1; 4350 size = 32; 4351 } 4352 else if (cmode == 14) 4353 { 4354 if (op) 4355 { 4356 /* Bit replication into bytes. */ 4357 int ix; 4358 unsigned long mask; 4359 4360 value = 0; 4361 hival = 0; 4362 for (ix = 7; ix >= 0; ix--) 4363 { 4364 mask = ((bits >> ix) & 1) ? 0xff : 0; 4365 if (ix <= 3) 4366 value = (value << 8) | mask; 4367 else 4368 hival = (hival << 8) | mask; 4369 } 4370 size = 64; 4371 } 4372 else 4373 { 4374 /* Byte replication. */ 4375 value = (unsigned long) bits; 4376 size = 8; 4377 } 4378 } 4379 else if (!op) 4380 { 4381 /* Floating point encoding. */ 4382 int tmp; 4383 4384 value = (unsigned long) (bits & 0x7f) << 19; 4385 value |= (unsigned long) (bits & 0x80) << 24; 4386 tmp = bits & 0x40 ? 0x3c : 0x40; 4387 value |= (unsigned long) tmp << 24; 4388 size = 32; 4389 isfloat = 1; 4390 } 4391 else 4392 { 4393 func (stream, "<illegal constant %.8x:%x:%x>", 4394 bits, cmode, op); 4395 size = 32; 4396 break; 4397 } 4398 switch (size) 4399 { 4400 case 8: 4401 func (stream, "#%ld\t; 0x%.2lx", value, value); 4402 break; 4403 4404 case 16: 4405 func (stream, "#%ld\t; 0x%.4lx", value, value); 4406 break; 4407 4408 case 32: 4409 if (isfloat) 4410 { 4411 unsigned char valbytes[4]; 4412 double fvalue; 4413 4414 /* Do this a byte at a time so we don't have to 4415 worry about the host's endianness. */ 4416 valbytes[0] = value & 0xff; 4417 valbytes[1] = (value >> 8) & 0xff; 4418 valbytes[2] = (value >> 16) & 0xff; 4419 valbytes[3] = (value >> 24) & 0xff; 4420 4421 floatformat_to_double 4422 (& floatformat_ieee_single_little, valbytes, 4423 & fvalue); 4424 4425 func (stream, "#%.7g\t; 0x%.8lx", fvalue, 4426 value); 4427 } 4428 else 4429 func (stream, "#%ld\t; 0x%.8lx", 4430 (long) (((value & 0x80000000L) != 0) 4431 ? value | ~0xffffffffL : value), 4432 value); 4433 break; 4434 4435 case 64: 4436 func (stream, "#0x%.8lx%.8lx", hival, value); 4437 break; 4438 4439 default: 4440 abort (); 4441 } 4442 } 4443 break; 4444 4445 case 'F': 4446 { 4447 int regno = ((given >> 16) & 0xf) | ((given >> (7 - 4)) & 0x10); 4448 int num = (given >> 8) & 0x3; 4449 4450 if (!num) 4451 func (stream, "{d%d}", regno); 4452 else if (num + regno >= 32) 4453 func (stream, "{d%d-<overflow reg d%d}", regno, regno + num); 4454 else 4455 func (stream, "{d%d-d%d}", regno, regno + num); 4456 } 4457 break; 4458 4459 4460 case '0': case '1': case '2': case '3': case '4': 4461 case '5': case '6': case '7': case '8': case '9': 4462 { 4463 int width; 4464 unsigned long value; 4465 4466 c = arm_decode_bitfield (c, given, &value, &width); 4467 4468 switch (*c) 4469 { 4470 case 'r': 4471 func (stream, "%s", arm_regnames[value]); 4472 break; 4473 case 'd': 4474 func (stream, "%ld", value); 4475 value_in_comment = value; 4476 break; 4477 case 'e': 4478 func (stream, "%ld", (1ul << width) - value); 4479 break; 4480 4481 case 'S': 4482 case 'T': 4483 case 'U': 4484 /* Various width encodings. */ 4485 { 4486 int base = 8 << (*c - 'S'); /* 8,16 or 32 */ 4487 int limit; 4488 unsigned low, high; 4489 4490 c++; 4491 if (*c >= '0' && *c <= '9') 4492 limit = *c - '0'; 4493 else if (*c >= 'a' && *c <= 'f') 4494 limit = *c - 'a' + 10; 4495 else 4496 abort (); 4497 low = limit >> 2; 4498 high = limit & 3; 4499 4500 if (value < low || value > high) 4501 func (stream, "<illegal width %d>", base << value); 4502 else 4503 func (stream, "%d", base << value); 4504 } 4505 break; 4506 case 'R': 4507 if (given & (1 << 6)) 4508 goto Q; 4509 /* FALLTHROUGH */ 4510 case 'D': 4511 func (stream, "d%ld", value); 4512 break; 4513 case 'Q': 4514 Q: 4515 if (value & 1) 4516 func (stream, "<illegal reg q%ld.5>", value >> 1); 4517 else 4518 func (stream, "q%ld", value >> 1); 4519 break; 4520 4521 case '`': 4522 c++; 4523 if (value == 0) 4524 func (stream, "%c", *c); 4525 break; 4526 case '\'': 4527 c++; 4528 if (value == ((1ul << width) - 1)) 4529 func (stream, "%c", *c); 4530 break; 4531 case '?': 4532 func (stream, "%c", c[(1 << width) - (int) value]); 4533 c += 1 << width; 4534 break; 4535 default: 4536 abort (); 4537 } 4538 break; 4539 4540 default: 4541 abort (); 4542 } 4543 } 4544 } 4545 else 4546 func (stream, "%c", *c); 4547 } 4548 4549 if (value_in_comment > 32 || value_in_comment < -16) 4550 func (stream, "\t; 0x%lx", value_in_comment); 4551 4552 if (is_unpredictable) 4553 func (stream, UNPREDICTABLE_INSTRUCTION); 4554 4555 return TRUE; 4556 } 4557 } 4558 return FALSE; 4559 } 4560 4561 /* Return the name of a v7A special register. */ 4562 4563 static const char * 4564 banked_regname (unsigned reg) 4565 { 4566 switch (reg) 4567 { 4568 case 15: return "CPSR"; 4569 case 32: return "R8_usr"; 4570 case 33: return "R9_usr"; 4571 case 34: return "R10_usr"; 4572 case 35: return "R11_usr"; 4573 case 36: return "R12_usr"; 4574 case 37: return "SP_usr"; 4575 case 38: return "LR_usr"; 4576 case 40: return "R8_fiq"; 4577 case 41: return "R9_fiq"; 4578 case 42: return "R10_fiq"; 4579 case 43: return "R11_fiq"; 4580 case 44: return "R12_fiq"; 4581 case 45: return "SP_fiq"; 4582 case 46: return "LR_fiq"; 4583 case 48: return "LR_irq"; 4584 case 49: return "SP_irq"; 4585 case 50: return "LR_svc"; 4586 case 51: return "SP_svc"; 4587 case 52: return "LR_abt"; 4588 case 53: return "SP_abt"; 4589 case 54: return "LR_und"; 4590 case 55: return "SP_und"; 4591 case 60: return "LR_mon"; 4592 case 61: return "SP_mon"; 4593 case 62: return "ELR_hyp"; 4594 case 63: return "SP_hyp"; 4595 case 79: return "SPSR"; 4596 case 110: return "SPSR_fiq"; 4597 case 112: return "SPSR_irq"; 4598 case 114: return "SPSR_svc"; 4599 case 116: return "SPSR_abt"; 4600 case 118: return "SPSR_und"; 4601 case 124: return "SPSR_mon"; 4602 case 126: return "SPSR_hyp"; 4603 default: return NULL; 4604 } 4605 } 4606 4607 /* Return the name of the DMB/DSB option. */ 4608 static const char * 4609 data_barrier_option (unsigned option) 4610 { 4611 switch (option & 0xf) 4612 { 4613 case 0xf: return "sy"; 4614 case 0xe: return "st"; 4615 case 0xd: return "ld"; 4616 case 0xb: return "ish"; 4617 case 0xa: return "ishst"; 4618 case 0x9: return "ishld"; 4619 case 0x7: return "un"; 4620 case 0x6: return "unst"; 4621 case 0x5: return "nshld"; 4622 case 0x3: return "osh"; 4623 case 0x2: return "oshst"; 4624 case 0x1: return "oshld"; 4625 default: return NULL; 4626 } 4627 } 4628 4629 /* Print one ARM instruction from PC on INFO->STREAM. */ 4630 4631 static void 4632 print_insn_arm (bfd_vma pc, struct disassemble_info *info, long given) 4633 { 4634 const struct opcode32 *insn; 4635 void *stream = info->stream; 4636 fprintf_ftype func = info->fprintf_func; 4637 struct arm_private_data *private_data = info->private_data; 4638 4639 if (print_insn_coprocessor (pc, info, given, FALSE)) 4640 return; 4641 4642 if (print_insn_neon (info, given, FALSE)) 4643 return; 4644 4645 for (insn = arm_opcodes; insn->assembler; insn++) 4646 { 4647 if ((given & insn->mask) != insn->value) 4648 continue; 4649 4650 if (! ARM_CPU_HAS_FEATURE (insn->arch, private_data->features)) 4651 continue; 4652 4653 /* Special case: an instruction with all bits set in the condition field 4654 (0xFnnn_nnnn) is only matched if all those bits are set in insn->mask, 4655 or by the catchall at the end of the table. */ 4656 if ((given & 0xF0000000) != 0xF0000000 4657 || (insn->mask & 0xF0000000) == 0xF0000000 4658 || (insn->mask == 0 && insn->value == 0)) 4659 { 4660 unsigned long u_reg = 16; 4661 unsigned long U_reg = 16; 4662 bfd_boolean is_unpredictable = FALSE; 4663 signed long value_in_comment = 0; 4664 const char *c; 4665 4666 for (c = insn->assembler; *c; c++) 4667 { 4668 if (*c == '%') 4669 { 4670 bfd_boolean allow_unpredictable = FALSE; 4671 4672 switch (*++c) 4673 { 4674 case '%': 4675 func (stream, "%%"); 4676 break; 4677 4678 case 'a': 4679 value_in_comment = print_arm_address (pc, info, given); 4680 break; 4681 4682 case 'P': 4683 /* Set P address bit and use normal address 4684 printing routine. */ 4685 value_in_comment = print_arm_address (pc, info, given | (1 << P_BIT)); 4686 break; 4687 4688 case 'S': 4689 allow_unpredictable = TRUE; 4690 case 's': 4691 if ((given & 0x004f0000) == 0x004f0000) 4692 { 4693 /* PC relative with immediate offset. */ 4694 bfd_vma offset = ((given & 0xf00) >> 4) | (given & 0xf); 4695 4696 if (PRE_BIT_SET) 4697 { 4698 /* Elide positive zero offset. */ 4699 if (offset || NEGATIVE_BIT_SET) 4700 func (stream, "[pc, #%s%d]\t; ", 4701 NEGATIVE_BIT_SET ? "-" : "", (int) offset); 4702 else 4703 func (stream, "[pc]\t; "); 4704 if (NEGATIVE_BIT_SET) 4705 offset = -offset; 4706 info->print_address_func (offset + pc + 8, info); 4707 } 4708 else 4709 { 4710 /* Always show the offset. */ 4711 func (stream, "[pc], #%s%d", 4712 NEGATIVE_BIT_SET ? "-" : "", (int) offset); 4713 if (! allow_unpredictable) 4714 is_unpredictable = TRUE; 4715 } 4716 } 4717 else 4718 { 4719 int offset = ((given & 0xf00) >> 4) | (given & 0xf); 4720 4721 func (stream, "[%s", 4722 arm_regnames[(given >> 16) & 0xf]); 4723 4724 if (PRE_BIT_SET) 4725 { 4726 if (IMMEDIATE_BIT_SET) 4727 { 4728 /* Elide offset for non-writeback 4729 positive zero. */ 4730 if (WRITEBACK_BIT_SET || NEGATIVE_BIT_SET 4731 || offset) 4732 func (stream, ", #%s%d", 4733 NEGATIVE_BIT_SET ? "-" : "", offset); 4734 4735 if (NEGATIVE_BIT_SET) 4736 offset = -offset; 4737 4738 value_in_comment = offset; 4739 } 4740 else 4741 { 4742 /* Register Offset or Register Pre-Indexed. */ 4743 func (stream, ", %s%s", 4744 NEGATIVE_BIT_SET ? "-" : "", 4745 arm_regnames[given & 0xf]); 4746 4747 /* Writing back to the register that is the source/ 4748 destination of the load/store is unpredictable. */ 4749 if (! allow_unpredictable 4750 && WRITEBACK_BIT_SET 4751 && ((given & 0xf) == ((given >> 12) & 0xf))) 4752 is_unpredictable = TRUE; 4753 } 4754 4755 func (stream, "]%s", 4756 WRITEBACK_BIT_SET ? "!" : ""); 4757 } 4758 else 4759 { 4760 if (IMMEDIATE_BIT_SET) 4761 { 4762 /* Immediate Post-indexed. */ 4763 /* PR 10924: Offset must be printed, even if it is zero. */ 4764 func (stream, "], #%s%d", 4765 NEGATIVE_BIT_SET ? "-" : "", offset); 4766 if (NEGATIVE_BIT_SET) 4767 offset = -offset; 4768 value_in_comment = offset; 4769 } 4770 else 4771 { 4772 /* Register Post-indexed. */ 4773 func (stream, "], %s%s", 4774 NEGATIVE_BIT_SET ? "-" : "", 4775 arm_regnames[given & 0xf]); 4776 4777 /* Writing back to the register that is the source/ 4778 destination of the load/store is unpredictable. */ 4779 if (! allow_unpredictable 4780 && (given & 0xf) == ((given >> 12) & 0xf)) 4781 is_unpredictable = TRUE; 4782 } 4783 4784 if (! allow_unpredictable) 4785 { 4786 /* Writeback is automatically implied by post- addressing. 4787 Setting the W bit is unnecessary and ARM specify it as 4788 being unpredictable. */ 4789 if (WRITEBACK_BIT_SET 4790 /* Specifying the PC register as the post-indexed 4791 registers is also unpredictable. */ 4792 || (! IMMEDIATE_BIT_SET && ((given & 0xf) == 0xf))) 4793 is_unpredictable = TRUE; 4794 } 4795 } 4796 } 4797 break; 4798 4799 case 'b': 4800 { 4801 bfd_vma disp = (((given & 0xffffff) ^ 0x800000) - 0x800000); 4802 info->print_address_func (disp * 4 + pc + 8, info); 4803 } 4804 break; 4805 4806 case 'c': 4807 if (((given >> 28) & 0xf) != 0xe) 4808 func (stream, "%s", 4809 arm_conditional [(given >> 28) & 0xf]); 4810 break; 4811 4812 case 'm': 4813 { 4814 int started = 0; 4815 int reg; 4816 4817 func (stream, "{"); 4818 for (reg = 0; reg < 16; reg++) 4819 if ((given & (1 << reg)) != 0) 4820 { 4821 if (started) 4822 func (stream, ", "); 4823 started = 1; 4824 func (stream, "%s", arm_regnames[reg]); 4825 } 4826 func (stream, "}"); 4827 if (! started) 4828 is_unpredictable = TRUE; 4829 } 4830 break; 4831 4832 case 'q': 4833 arm_decode_shift (given, func, stream, FALSE); 4834 break; 4835 4836 case 'o': 4837 if ((given & 0x02000000) != 0) 4838 { 4839 unsigned int rotate = (given & 0xf00) >> 7; 4840 unsigned int immed = (given & 0xff); 4841 unsigned int a, i; 4842 4843 a = (((immed << (32 - rotate)) 4844 | (immed >> rotate)) & 0xffffffff); 4845 /* If there is another encoding with smaller rotate, 4846 the rotate should be specified directly. */ 4847 for (i = 0; i < 32; i += 2) 4848 if ((a << i | a >> (32 - i)) <= 0xff) 4849 break; 4850 4851 if (i != rotate) 4852 func (stream, "#%d, %d", immed, rotate); 4853 else 4854 func (stream, "#%d", a); 4855 value_in_comment = a; 4856 } 4857 else 4858 arm_decode_shift (given, func, stream, TRUE); 4859 break; 4860 4861 case 'p': 4862 if ((given & 0x0000f000) == 0x0000f000) 4863 { 4864 arm_feature_set arm_ext_v6 = 4865 ARM_FEATURE_CORE_LOW (ARM_EXT_V6); 4866 4867 /* The p-variants of tst/cmp/cmn/teq are the pre-V6 4868 mechanism for setting PSR flag bits. They are 4869 obsolete in V6 onwards. */ 4870 if (! ARM_CPU_HAS_FEATURE (private_data->features, \ 4871 arm_ext_v6)) 4872 func (stream, "p"); 4873 else 4874 is_unpredictable = TRUE; 4875 } 4876 break; 4877 4878 case 't': 4879 if ((given & 0x01200000) == 0x00200000) 4880 func (stream, "t"); 4881 break; 4882 4883 case 'A': 4884 { 4885 int offset = given & 0xff; 4886 4887 value_in_comment = offset * 4; 4888 if (NEGATIVE_BIT_SET) 4889 value_in_comment = - value_in_comment; 4890 4891 func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]); 4892 4893 if (PRE_BIT_SET) 4894 { 4895 if (offset) 4896 func (stream, ", #%d]%s", 4897 (int) value_in_comment, 4898 WRITEBACK_BIT_SET ? "!" : ""); 4899 else 4900 func (stream, "]"); 4901 } 4902 else 4903 { 4904 func (stream, "]"); 4905 4906 if (WRITEBACK_BIT_SET) 4907 { 4908 if (offset) 4909 func (stream, ", #%d", (int) value_in_comment); 4910 } 4911 else 4912 { 4913 func (stream, ", {%d}", (int) offset); 4914 value_in_comment = offset; 4915 } 4916 } 4917 } 4918 break; 4919 4920 case 'B': 4921 /* Print ARM V5 BLX(1) address: pc+25 bits. */ 4922 { 4923 bfd_vma address; 4924 bfd_vma offset = 0; 4925 4926 if (! NEGATIVE_BIT_SET) 4927 /* Is signed, hi bits should be ones. */ 4928 offset = (-1) ^ 0x00ffffff; 4929 4930 /* Offset is (SignExtend(offset field)<<2). */ 4931 offset += given & 0x00ffffff; 4932 offset <<= 2; 4933 address = offset + pc + 8; 4934 4935 if (given & 0x01000000) 4936 /* H bit allows addressing to 2-byte boundaries. */ 4937 address += 2; 4938 4939 info->print_address_func (address, info); 4940 } 4941 break; 4942 4943 case 'C': 4944 if ((given & 0x02000200) == 0x200) 4945 { 4946 const char * name; 4947 unsigned sysm = (given & 0x004f0000) >> 16; 4948 4949 sysm |= (given & 0x300) >> 4; 4950 name = banked_regname (sysm); 4951 4952 if (name != NULL) 4953 func (stream, "%s", name); 4954 else 4955 func (stream, "(UNDEF: %lu)", (unsigned long) sysm); 4956 } 4957 else 4958 { 4959 func (stream, "%cPSR_", 4960 (given & 0x00400000) ? 'S' : 'C'); 4961 if (given & 0x80000) 4962 func (stream, "f"); 4963 if (given & 0x40000) 4964 func (stream, "s"); 4965 if (given & 0x20000) 4966 func (stream, "x"); 4967 if (given & 0x10000) 4968 func (stream, "c"); 4969 } 4970 break; 4971 4972 case 'U': 4973 if ((given & 0xf0) == 0x60) 4974 { 4975 switch (given & 0xf) 4976 { 4977 case 0xf: func (stream, "sy"); break; 4978 default: 4979 func (stream, "#%d", (int) given & 0xf); 4980 break; 4981 } 4982 } 4983 else 4984 { 4985 const char * opt = data_barrier_option (given & 0xf); 4986 if (opt != NULL) 4987 func (stream, "%s", opt); 4988 else 4989 func (stream, "#%d", (int) given & 0xf); 4990 } 4991 break; 4992 4993 case '0': case '1': case '2': case '3': case '4': 4994 case '5': case '6': case '7': case '8': case '9': 4995 { 4996 int width; 4997 unsigned long value; 4998 4999 c = arm_decode_bitfield (c, given, &value, &width); 5000 5001 switch (*c) 5002 { 5003 case 'R': 5004 if (value == 15) 5005 is_unpredictable = TRUE; 5006 /* Fall through. */ 5007 case 'r': 5008 case 'T': 5009 /* We want register + 1 when decoding T. */ 5010 if (*c == 'T') 5011 ++value; 5012 5013 if (c[1] == 'u') 5014 { 5015 /* Eat the 'u' character. */ 5016 ++ c; 5017 5018 if (u_reg == value) 5019 is_unpredictable = TRUE; 5020 u_reg = value; 5021 } 5022 if (c[1] == 'U') 5023 { 5024 /* Eat the 'U' character. */ 5025 ++ c; 5026 5027 if (U_reg == value) 5028 is_unpredictable = TRUE; 5029 U_reg = value; 5030 } 5031 func (stream, "%s", arm_regnames[value]); 5032 break; 5033 case 'd': 5034 func (stream, "%ld", value); 5035 value_in_comment = value; 5036 break; 5037 case 'b': 5038 func (stream, "%ld", value * 8); 5039 value_in_comment = value * 8; 5040 break; 5041 case 'W': 5042 func (stream, "%ld", value + 1); 5043 value_in_comment = value + 1; 5044 break; 5045 case 'x': 5046 func (stream, "0x%08lx", value); 5047 5048 /* Some SWI instructions have special 5049 meanings. */ 5050 if ((given & 0x0fffffff) == 0x0FF00000) 5051 func (stream, "\t; IMB"); 5052 else if ((given & 0x0fffffff) == 0x0FF00001) 5053 func (stream, "\t; IMBRange"); 5054 break; 5055 case 'X': 5056 func (stream, "%01lx", value & 0xf); 5057 value_in_comment = value; 5058 break; 5059 case '`': 5060 c++; 5061 if (value == 0) 5062 func (stream, "%c", *c); 5063 break; 5064 case '\'': 5065 c++; 5066 if (value == ((1ul << width) - 1)) 5067 func (stream, "%c", *c); 5068 break; 5069 case '?': 5070 func (stream, "%c", c[(1 << width) - (int) value]); 5071 c += 1 << width; 5072 break; 5073 default: 5074 abort (); 5075 } 5076 break; 5077 5078 case 'e': 5079 { 5080 int imm; 5081 5082 imm = (given & 0xf) | ((given & 0xfff00) >> 4); 5083 func (stream, "%d", imm); 5084 value_in_comment = imm; 5085 } 5086 break; 5087 5088 case 'E': 5089 /* LSB and WIDTH fields of BFI or BFC. The machine- 5090 language instruction encodes LSB and MSB. */ 5091 { 5092 long msb = (given & 0x001f0000) >> 16; 5093 long lsb = (given & 0x00000f80) >> 7; 5094 long w = msb - lsb + 1; 5095 5096 if (w > 0) 5097 func (stream, "#%lu, #%lu", lsb, w); 5098 else 5099 func (stream, "(invalid: %lu:%lu)", lsb, msb); 5100 } 5101 break; 5102 5103 case 'R': 5104 /* Get the PSR/banked register name. */ 5105 { 5106 const char * name; 5107 unsigned sysm = (given & 0x004f0000) >> 16; 5108 5109 sysm |= (given & 0x300) >> 4; 5110 name = banked_regname (sysm); 5111 5112 if (name != NULL) 5113 func (stream, "%s", name); 5114 else 5115 func (stream, "(UNDEF: %lu)", (unsigned long) sysm); 5116 } 5117 break; 5118 5119 case 'V': 5120 /* 16-bit unsigned immediate from a MOVT or MOVW 5121 instruction, encoded in bits 0:11 and 15:19. */ 5122 { 5123 long hi = (given & 0x000f0000) >> 4; 5124 long lo = (given & 0x00000fff); 5125 long imm16 = hi | lo; 5126 5127 func (stream, "#%lu", imm16); 5128 value_in_comment = imm16; 5129 } 5130 break; 5131 5132 default: 5133 abort (); 5134 } 5135 } 5136 } 5137 else 5138 func (stream, "%c", *c); 5139 } 5140 5141 if (value_in_comment > 32 || value_in_comment < -16) 5142 func (stream, "\t; 0x%lx", (value_in_comment & 0xffffffffUL)); 5143 5144 if (is_unpredictable) 5145 func (stream, UNPREDICTABLE_INSTRUCTION); 5146 5147 return; 5148 } 5149 } 5150 abort (); 5151 } 5152 5153 /* Print one 16-bit Thumb instruction from PC on INFO->STREAM. */ 5154 5155 static void 5156 print_insn_thumb16 (bfd_vma pc, struct disassemble_info *info, long given) 5157 { 5158 const struct opcode16 *insn; 5159 void *stream = info->stream; 5160 fprintf_ftype func = info->fprintf_func; 5161 5162 for (insn = thumb_opcodes; insn->assembler; insn++) 5163 if ((given & insn->mask) == insn->value) 5164 { 5165 signed long value_in_comment = 0; 5166 const char *c = insn->assembler; 5167 5168 for (; *c; c++) 5169 { 5170 int domaskpc = 0; 5171 int domasklr = 0; 5172 5173 if (*c != '%') 5174 { 5175 func (stream, "%c", *c); 5176 continue; 5177 } 5178 5179 switch (*++c) 5180 { 5181 case '%': 5182 func (stream, "%%"); 5183 break; 5184 5185 case 'c': 5186 if (ifthen_state) 5187 func (stream, "%s", arm_conditional[IFTHEN_COND]); 5188 break; 5189 5190 case 'C': 5191 if (ifthen_state) 5192 func (stream, "%s", arm_conditional[IFTHEN_COND]); 5193 else 5194 func (stream, "s"); 5195 break; 5196 5197 case 'I': 5198 { 5199 unsigned int tmp; 5200 5201 ifthen_next_state = given & 0xff; 5202 for (tmp = given << 1; tmp & 0xf; tmp <<= 1) 5203 func (stream, ((given ^ tmp) & 0x10) ? "e" : "t"); 5204 func (stream, "\t%s", arm_conditional[(given >> 4) & 0xf]); 5205 } 5206 break; 5207 5208 case 'x': 5209 if (ifthen_next_state) 5210 func (stream, "\t; unpredictable branch in IT block\n"); 5211 break; 5212 5213 case 'X': 5214 if (ifthen_state) 5215 func (stream, "\t; unpredictable <IT:%s>", 5216 arm_conditional[IFTHEN_COND]); 5217 break; 5218 5219 case 'S': 5220 { 5221 long reg; 5222 5223 reg = (given >> 3) & 0x7; 5224 if (given & (1 << 6)) 5225 reg += 8; 5226 5227 func (stream, "%s", arm_regnames[reg]); 5228 } 5229 break; 5230 5231 case 'D': 5232 { 5233 long reg; 5234 5235 reg = given & 0x7; 5236 if (given & (1 << 7)) 5237 reg += 8; 5238 5239 func (stream, "%s", arm_regnames[reg]); 5240 } 5241 break; 5242 5243 case 'N': 5244 if (given & (1 << 8)) 5245 domasklr = 1; 5246 /* Fall through. */ 5247 case 'O': 5248 if (*c == 'O' && (given & (1 << 8))) 5249 domaskpc = 1; 5250 /* Fall through. */ 5251 case 'M': 5252 { 5253 int started = 0; 5254 int reg; 5255 5256 func (stream, "{"); 5257 5258 /* It would be nice if we could spot 5259 ranges, and generate the rS-rE format: */ 5260 for (reg = 0; (reg < 8); reg++) 5261 if ((given & (1 << reg)) != 0) 5262 { 5263 if (started) 5264 func (stream, ", "); 5265 started = 1; 5266 func (stream, "%s", arm_regnames[reg]); 5267 } 5268 5269 if (domasklr) 5270 { 5271 if (started) 5272 func (stream, ", "); 5273 started = 1; 5274 func (stream, "%s", arm_regnames[14] /* "lr" */); 5275 } 5276 5277 if (domaskpc) 5278 { 5279 if (started) 5280 func (stream, ", "); 5281 func (stream, "%s", arm_regnames[15] /* "pc" */); 5282 } 5283 5284 func (stream, "}"); 5285 } 5286 break; 5287 5288 case 'W': 5289 /* Print writeback indicator for a LDMIA. We are doing a 5290 writeback if the base register is not in the register 5291 mask. */ 5292 if ((given & (1 << ((given & 0x0700) >> 8))) == 0) 5293 func (stream, "!"); 5294 break; 5295 5296 case 'b': 5297 /* Print ARM V6T2 CZB address: pc+4+6 bits. */ 5298 { 5299 bfd_vma address = (pc + 4 5300 + ((given & 0x00f8) >> 2) 5301 + ((given & 0x0200) >> 3)); 5302 info->print_address_func (address, info); 5303 } 5304 break; 5305 5306 case 's': 5307 /* Right shift immediate -- bits 6..10; 1-31 print 5308 as themselves, 0 prints as 32. */ 5309 { 5310 long imm = (given & 0x07c0) >> 6; 5311 if (imm == 0) 5312 imm = 32; 5313 func (stream, "#%ld", imm); 5314 } 5315 break; 5316 5317 case '0': case '1': case '2': case '3': case '4': 5318 case '5': case '6': case '7': case '8': case '9': 5319 { 5320 int bitstart = *c++ - '0'; 5321 int bitend = 0; 5322 5323 while (*c >= '0' && *c <= '9') 5324 bitstart = (bitstart * 10) + *c++ - '0'; 5325 5326 switch (*c) 5327 { 5328 case '-': 5329 { 5330 bfd_vma reg; 5331 5332 c++; 5333 while (*c >= '0' && *c <= '9') 5334 bitend = (bitend * 10) + *c++ - '0'; 5335 if (!bitend) 5336 abort (); 5337 reg = given >> bitstart; 5338 reg &= (2 << (bitend - bitstart)) - 1; 5339 5340 switch (*c) 5341 { 5342 case 'r': 5343 func (stream, "%s", arm_regnames[reg]); 5344 break; 5345 5346 case 'd': 5347 func (stream, "%ld", (long) reg); 5348 value_in_comment = reg; 5349 break; 5350 5351 case 'H': 5352 func (stream, "%ld", (long) (reg << 1)); 5353 value_in_comment = reg << 1; 5354 break; 5355 5356 case 'W': 5357 func (stream, "%ld", (long) (reg << 2)); 5358 value_in_comment = reg << 2; 5359 break; 5360 5361 case 'a': 5362 /* PC-relative address -- the bottom two 5363 bits of the address are dropped 5364 before the calculation. */ 5365 info->print_address_func 5366 (((pc + 4) & ~3) + (reg << 2), info); 5367 value_in_comment = 0; 5368 break; 5369 5370 case 'x': 5371 func (stream, "0x%04lx", (long) reg); 5372 break; 5373 5374 case 'B': 5375 reg = ((reg ^ (1 << bitend)) - (1 << bitend)); 5376 info->print_address_func (reg * 2 + pc + 4, info); 5377 value_in_comment = 0; 5378 break; 5379 5380 case 'c': 5381 func (stream, "%s", arm_conditional [reg]); 5382 break; 5383 5384 default: 5385 abort (); 5386 } 5387 } 5388 break; 5389 5390 case '\'': 5391 c++; 5392 if ((given & (1 << bitstart)) != 0) 5393 func (stream, "%c", *c); 5394 break; 5395 5396 case '?': 5397 ++c; 5398 if ((given & (1 << bitstart)) != 0) 5399 func (stream, "%c", *c++); 5400 else 5401 func (stream, "%c", *++c); 5402 break; 5403 5404 default: 5405 abort (); 5406 } 5407 } 5408 break; 5409 5410 default: 5411 abort (); 5412 } 5413 } 5414 5415 if (value_in_comment > 32 || value_in_comment < -16) 5416 func (stream, "\t; 0x%lx", value_in_comment); 5417 return; 5418 } 5419 5420 /* No match. */ 5421 abort (); 5422 } 5423 5424 /* Return the name of an V7M special register. */ 5425 5426 static const char * 5427 psr_name (int regno) 5428 { 5429 switch (regno) 5430 { 5431 case 0: return "APSR"; 5432 case 1: return "IAPSR"; 5433 case 2: return "EAPSR"; 5434 case 3: return "PSR"; 5435 case 5: return "IPSR"; 5436 case 6: return "EPSR"; 5437 case 7: return "IEPSR"; 5438 case 8: return "MSP"; 5439 case 9: return "PSP"; 5440 case 16: return "PRIMASK"; 5441 case 17: return "BASEPRI"; 5442 case 18: return "BASEPRI_MAX"; 5443 case 19: return "FAULTMASK"; 5444 case 20: return "CONTROL"; 5445 case 0x88: return "MSP_NS"; 5446 case 0x89: return "PSP_NS"; 5447 default: return "<unknown>"; 5448 } 5449 } 5450 5451 /* Print one 32-bit Thumb instruction from PC on INFO->STREAM. */ 5452 5453 static void 5454 print_insn_thumb32 (bfd_vma pc, struct disassemble_info *info, long given) 5455 { 5456 const struct opcode32 *insn; 5457 void *stream = info->stream; 5458 fprintf_ftype func = info->fprintf_func; 5459 5460 if (print_insn_coprocessor (pc, info, given, TRUE)) 5461 return; 5462 5463 if (print_insn_neon (info, given, TRUE)) 5464 return; 5465 5466 for (insn = thumb32_opcodes; insn->assembler; insn++) 5467 if ((given & insn->mask) == insn->value) 5468 { 5469 bfd_boolean is_unpredictable = FALSE; 5470 signed long value_in_comment = 0; 5471 const char *c = insn->assembler; 5472 5473 for (; *c; c++) 5474 { 5475 if (*c != '%') 5476 { 5477 func (stream, "%c", *c); 5478 continue; 5479 } 5480 5481 switch (*++c) 5482 { 5483 case '%': 5484 func (stream, "%%"); 5485 break; 5486 5487 case 'c': 5488 if (ifthen_state) 5489 func (stream, "%s", arm_conditional[IFTHEN_COND]); 5490 break; 5491 5492 case 'x': 5493 if (ifthen_next_state) 5494 func (stream, "\t; unpredictable branch in IT block\n"); 5495 break; 5496 5497 case 'X': 5498 if (ifthen_state) 5499 func (stream, "\t; unpredictable <IT:%s>", 5500 arm_conditional[IFTHEN_COND]); 5501 break; 5502 5503 case 'I': 5504 { 5505 unsigned int imm12 = 0; 5506 5507 imm12 |= (given & 0x000000ffu); 5508 imm12 |= (given & 0x00007000u) >> 4; 5509 imm12 |= (given & 0x04000000u) >> 15; 5510 func (stream, "#%u", imm12); 5511 value_in_comment = imm12; 5512 } 5513 break; 5514 5515 case 'M': 5516 { 5517 unsigned int bits = 0, imm, imm8, mod; 5518 5519 bits |= (given & 0x000000ffu); 5520 bits |= (given & 0x00007000u) >> 4; 5521 bits |= (given & 0x04000000u) >> 15; 5522 imm8 = (bits & 0x0ff); 5523 mod = (bits & 0xf00) >> 8; 5524 switch (mod) 5525 { 5526 case 0: imm = imm8; break; 5527 case 1: imm = ((imm8 << 16) | imm8); break; 5528 case 2: imm = ((imm8 << 24) | (imm8 << 8)); break; 5529 case 3: imm = ((imm8 << 24) | (imm8 << 16) | (imm8 << 8) | imm8); break; 5530 default: 5531 mod = (bits & 0xf80) >> 7; 5532 imm8 = (bits & 0x07f) | 0x80; 5533 imm = (((imm8 << (32 - mod)) | (imm8 >> mod)) & 0xffffffff); 5534 } 5535 func (stream, "#%u", imm); 5536 value_in_comment = imm; 5537 } 5538 break; 5539 5540 case 'J': 5541 { 5542 unsigned int imm = 0; 5543 5544 imm |= (given & 0x000000ffu); 5545 imm |= (given & 0x00007000u) >> 4; 5546 imm |= (given & 0x04000000u) >> 15; 5547 imm |= (given & 0x000f0000u) >> 4; 5548 func (stream, "#%u", imm); 5549 value_in_comment = imm; 5550 } 5551 break; 5552 5553 case 'K': 5554 { 5555 unsigned int imm = 0; 5556 5557 imm |= (given & 0x000f0000u) >> 16; 5558 imm |= (given & 0x00000ff0u) >> 0; 5559 imm |= (given & 0x0000000fu) << 12; 5560 func (stream, "#%u", imm); 5561 value_in_comment = imm; 5562 } 5563 break; 5564 5565 case 'H': 5566 { 5567 unsigned int imm = 0; 5568 5569 imm |= (given & 0x000f0000u) >> 4; 5570 imm |= (given & 0x00000fffu) >> 0; 5571 func (stream, "#%u", imm); 5572 value_in_comment = imm; 5573 } 5574 break; 5575 5576 case 'V': 5577 { 5578 unsigned int imm = 0; 5579 5580 imm |= (given & 0x00000fffu); 5581 imm |= (given & 0x000f0000u) >> 4; 5582 func (stream, "#%u", imm); 5583 value_in_comment = imm; 5584 } 5585 break; 5586 5587 case 'S': 5588 { 5589 unsigned int reg = (given & 0x0000000fu); 5590 unsigned int stp = (given & 0x00000030u) >> 4; 5591 unsigned int imm = 0; 5592 imm |= (given & 0x000000c0u) >> 6; 5593 imm |= (given & 0x00007000u) >> 10; 5594 5595 func (stream, "%s", arm_regnames[reg]); 5596 switch (stp) 5597 { 5598 case 0: 5599 if (imm > 0) 5600 func (stream, ", lsl #%u", imm); 5601 break; 5602 5603 case 1: 5604 if (imm == 0) 5605 imm = 32; 5606 func (stream, ", lsr #%u", imm); 5607 break; 5608 5609 case 2: 5610 if (imm == 0) 5611 imm = 32; 5612 func (stream, ", asr #%u", imm); 5613 break; 5614 5615 case 3: 5616 if (imm == 0) 5617 func (stream, ", rrx"); 5618 else 5619 func (stream, ", ror #%u", imm); 5620 } 5621 } 5622 break; 5623 5624 case 'a': 5625 { 5626 unsigned int Rn = (given & 0x000f0000) >> 16; 5627 unsigned int U = ! NEGATIVE_BIT_SET; 5628 unsigned int op = (given & 0x00000f00) >> 8; 5629 unsigned int i12 = (given & 0x00000fff); 5630 unsigned int i8 = (given & 0x000000ff); 5631 bfd_boolean writeback = FALSE, postind = FALSE; 5632 bfd_vma offset = 0; 5633 5634 func (stream, "[%s", arm_regnames[Rn]); 5635 if (U) /* 12-bit positive immediate offset. */ 5636 { 5637 offset = i12; 5638 if (Rn != 15) 5639 value_in_comment = offset; 5640 } 5641 else if (Rn == 15) /* 12-bit negative immediate offset. */ 5642 offset = - (int) i12; 5643 else if (op == 0x0) /* Shifted register offset. */ 5644 { 5645 unsigned int Rm = (i8 & 0x0f); 5646 unsigned int sh = (i8 & 0x30) >> 4; 5647 5648 func (stream, ", %s", arm_regnames[Rm]); 5649 if (sh) 5650 func (stream, ", lsl #%u", sh); 5651 func (stream, "]"); 5652 break; 5653 } 5654 else switch (op) 5655 { 5656 case 0xE: /* 8-bit positive immediate offset. */ 5657 offset = i8; 5658 break; 5659 5660 case 0xC: /* 8-bit negative immediate offset. */ 5661 offset = -i8; 5662 break; 5663 5664 case 0xF: /* 8-bit + preindex with wb. */ 5665 offset = i8; 5666 writeback = TRUE; 5667 break; 5668 5669 case 0xD: /* 8-bit - preindex with wb. */ 5670 offset = -i8; 5671 writeback = TRUE; 5672 break; 5673 5674 case 0xB: /* 8-bit + postindex. */ 5675 offset = i8; 5676 postind = TRUE; 5677 break; 5678 5679 case 0x9: /* 8-bit - postindex. */ 5680 offset = -i8; 5681 postind = TRUE; 5682 break; 5683 5684 default: 5685 func (stream, ", <undefined>]"); 5686 goto skip; 5687 } 5688 5689 if (postind) 5690 func (stream, "], #%d", (int) offset); 5691 else 5692 { 5693 if (offset) 5694 func (stream, ", #%d", (int) offset); 5695 func (stream, writeback ? "]!" : "]"); 5696 } 5697 5698 if (Rn == 15) 5699 { 5700 func (stream, "\t; "); 5701 info->print_address_func (((pc + 4) & ~3) + offset, info); 5702 } 5703 } 5704 skip: 5705 break; 5706 5707 case 'A': 5708 { 5709 unsigned int U = ! NEGATIVE_BIT_SET; 5710 unsigned int W = WRITEBACK_BIT_SET; 5711 unsigned int Rn = (given & 0x000f0000) >> 16; 5712 unsigned int off = (given & 0x000000ff); 5713 5714 func (stream, "[%s", arm_regnames[Rn]); 5715 5716 if (PRE_BIT_SET) 5717 { 5718 if (off || !U) 5719 { 5720 func (stream, ", #%c%u", U ? '+' : '-', off * 4); 5721 value_in_comment = off * 4 * U ? 1 : -1; 5722 } 5723 func (stream, "]"); 5724 if (W) 5725 func (stream, "!"); 5726 } 5727 else 5728 { 5729 func (stream, "], "); 5730 if (W) 5731 { 5732 func (stream, "#%c%u", U ? '+' : '-', off * 4); 5733 value_in_comment = off * 4 * U ? 1 : -1; 5734 } 5735 else 5736 { 5737 func (stream, "{%u}", off); 5738 value_in_comment = off; 5739 } 5740 } 5741 } 5742 break; 5743 5744 case 'w': 5745 { 5746 unsigned int Sbit = (given & 0x01000000) >> 24; 5747 unsigned int type = (given & 0x00600000) >> 21; 5748 5749 switch (type) 5750 { 5751 case 0: func (stream, Sbit ? "sb" : "b"); break; 5752 case 1: func (stream, Sbit ? "sh" : "h"); break; 5753 case 2: 5754 if (Sbit) 5755 func (stream, "??"); 5756 break; 5757 case 3: 5758 func (stream, "??"); 5759 break; 5760 } 5761 } 5762 break; 5763 5764 case 'm': 5765 { 5766 int started = 0; 5767 int reg; 5768 5769 func (stream, "{"); 5770 for (reg = 0; reg < 16; reg++) 5771 if ((given & (1 << reg)) != 0) 5772 { 5773 if (started) 5774 func (stream, ", "); 5775 started = 1; 5776 func (stream, "%s", arm_regnames[reg]); 5777 } 5778 func (stream, "}"); 5779 } 5780 break; 5781 5782 case 'E': 5783 { 5784 unsigned int msb = (given & 0x0000001f); 5785 unsigned int lsb = 0; 5786 5787 lsb |= (given & 0x000000c0u) >> 6; 5788 lsb |= (given & 0x00007000u) >> 10; 5789 func (stream, "#%u, #%u", lsb, msb - lsb + 1); 5790 } 5791 break; 5792 5793 case 'F': 5794 { 5795 unsigned int width = (given & 0x0000001f) + 1; 5796 unsigned int lsb = 0; 5797 5798 lsb |= (given & 0x000000c0u) >> 6; 5799 lsb |= (given & 0x00007000u) >> 10; 5800 func (stream, "#%u, #%u", lsb, width); 5801 } 5802 break; 5803 5804 case 'b': 5805 { 5806 unsigned int S = (given & 0x04000000u) >> 26; 5807 unsigned int J1 = (given & 0x00002000u) >> 13; 5808 unsigned int J2 = (given & 0x00000800u) >> 11; 5809 bfd_vma offset = 0; 5810 5811 offset |= !S << 20; 5812 offset |= J2 << 19; 5813 offset |= J1 << 18; 5814 offset |= (given & 0x003f0000) >> 4; 5815 offset |= (given & 0x000007ff) << 1; 5816 offset -= (1 << 20); 5817 5818 info->print_address_func (pc + 4 + offset, info); 5819 } 5820 break; 5821 5822 case 'B': 5823 { 5824 unsigned int S = (given & 0x04000000u) >> 26; 5825 unsigned int I1 = (given & 0x00002000u) >> 13; 5826 unsigned int I2 = (given & 0x00000800u) >> 11; 5827 bfd_vma offset = 0; 5828 5829 offset |= !S << 24; 5830 offset |= !(I1 ^ S) << 23; 5831 offset |= !(I2 ^ S) << 22; 5832 offset |= (given & 0x03ff0000u) >> 4; 5833 offset |= (given & 0x000007ffu) << 1; 5834 offset -= (1 << 24); 5835 offset += pc + 4; 5836 5837 /* BLX target addresses are always word aligned. */ 5838 if ((given & 0x00001000u) == 0) 5839 offset &= ~2u; 5840 5841 info->print_address_func (offset, info); 5842 } 5843 break; 5844 5845 case 's': 5846 { 5847 unsigned int shift = 0; 5848 5849 shift |= (given & 0x000000c0u) >> 6; 5850 shift |= (given & 0x00007000u) >> 10; 5851 if (WRITEBACK_BIT_SET) 5852 func (stream, ", asr #%u", shift); 5853 else if (shift) 5854 func (stream, ", lsl #%u", shift); 5855 /* else print nothing - lsl #0 */ 5856 } 5857 break; 5858 5859 case 'R': 5860 { 5861 unsigned int rot = (given & 0x00000030) >> 4; 5862 5863 if (rot) 5864 func (stream, ", ror #%u", rot * 8); 5865 } 5866 break; 5867 5868 case 'U': 5869 if ((given & 0xf0) == 0x60) 5870 { 5871 switch (given & 0xf) 5872 { 5873 case 0xf: func (stream, "sy"); break; 5874 default: 5875 func (stream, "#%d", (int) given & 0xf); 5876 break; 5877 } 5878 } 5879 else 5880 { 5881 const char * opt = data_barrier_option (given & 0xf); 5882 if (opt != NULL) 5883 func (stream, "%s", opt); 5884 else 5885 func (stream, "#%d", (int) given & 0xf); 5886 } 5887 break; 5888 5889 case 'C': 5890 if ((given & 0xff) == 0) 5891 { 5892 func (stream, "%cPSR_", (given & 0x100000) ? 'S' : 'C'); 5893 if (given & 0x800) 5894 func (stream, "f"); 5895 if (given & 0x400) 5896 func (stream, "s"); 5897 if (given & 0x200) 5898 func (stream, "x"); 5899 if (given & 0x100) 5900 func (stream, "c"); 5901 } 5902 else if ((given & 0x20) == 0x20) 5903 { 5904 char const* name; 5905 unsigned sysm = (given & 0xf00) >> 8; 5906 5907 sysm |= (given & 0x30); 5908 sysm |= (given & 0x00100000) >> 14; 5909 name = banked_regname (sysm); 5910 5911 if (name != NULL) 5912 func (stream, "%s", name); 5913 else 5914 func (stream, "(UNDEF: %lu)", (unsigned long) sysm); 5915 } 5916 else 5917 { 5918 func (stream, "%s", psr_name (given & 0xff)); 5919 } 5920 break; 5921 5922 case 'D': 5923 if (((given & 0xff) == 0) 5924 || ((given & 0x20) == 0x20)) 5925 { 5926 char const* name; 5927 unsigned sm = (given & 0xf0000) >> 16; 5928 5929 sm |= (given & 0x30); 5930 sm |= (given & 0x00100000) >> 14; 5931 name = banked_regname (sm); 5932 5933 if (name != NULL) 5934 func (stream, "%s", name); 5935 else 5936 func (stream, "(UNDEF: %lu)", (unsigned long) sm); 5937 } 5938 else 5939 func (stream, "%s", psr_name (given & 0xff)); 5940 break; 5941 5942 case '0': case '1': case '2': case '3': case '4': 5943 case '5': case '6': case '7': case '8': case '9': 5944 { 5945 int width; 5946 unsigned long val; 5947 5948 c = arm_decode_bitfield (c, given, &val, &width); 5949 5950 switch (*c) 5951 { 5952 case 'd': 5953 func (stream, "%lu", val); 5954 value_in_comment = val; 5955 break; 5956 5957 case 'D': 5958 func (stream, "%lu", val + 1); 5959 value_in_comment = val + 1; 5960 break; 5961 5962 case 'W': 5963 func (stream, "%lu", val * 4); 5964 value_in_comment = val * 4; 5965 break; 5966 5967 case 'S': 5968 if (val == 13) 5969 is_unpredictable = TRUE; 5970 /* Fall through. */ 5971 case 'R': 5972 if (val == 15) 5973 is_unpredictable = TRUE; 5974 /* Fall through. */ 5975 case 'r': 5976 func (stream, "%s", arm_regnames[val]); 5977 break; 5978 5979 case 'c': 5980 func (stream, "%s", arm_conditional[val]); 5981 break; 5982 5983 case '\'': 5984 c++; 5985 if (val == ((1ul << width) - 1)) 5986 func (stream, "%c", *c); 5987 break; 5988 5989 case '`': 5990 c++; 5991 if (val == 0) 5992 func (stream, "%c", *c); 5993 break; 5994 5995 case '?': 5996 func (stream, "%c", c[(1 << width) - (int) val]); 5997 c += 1 << width; 5998 break; 5999 6000 case 'x': 6001 func (stream, "0x%lx", val & 0xffffffffUL); 6002 break; 6003 6004 default: 6005 abort (); 6006 } 6007 } 6008 break; 6009 6010 case 'L': 6011 /* PR binutils/12534 6012 If we have a PC relative offset in an LDRD or STRD 6013 instructions then display the decoded address. */ 6014 if (((given >> 16) & 0xf) == 0xf) 6015 { 6016 bfd_vma offset = (given & 0xff) * 4; 6017 6018 if ((given & (1 << 23)) == 0) 6019 offset = - offset; 6020 func (stream, "\t; "); 6021 info->print_address_func ((pc & ~3) + 4 + offset, info); 6022 } 6023 break; 6024 6025 default: 6026 abort (); 6027 } 6028 } 6029 6030 if (value_in_comment > 32 || value_in_comment < -16) 6031 func (stream, "\t; 0x%lx", value_in_comment); 6032 6033 if (is_unpredictable) 6034 func (stream, UNPREDICTABLE_INSTRUCTION); 6035 6036 return; 6037 } 6038 6039 /* No match. */ 6040 abort (); 6041 } 6042 6043 /* Print data bytes on INFO->STREAM. */ 6044 6045 static void 6046 print_insn_data (bfd_vma pc ATTRIBUTE_UNUSED, 6047 struct disassemble_info *info, 6048 long given) 6049 { 6050 switch (info->bytes_per_chunk) 6051 { 6052 case 1: 6053 info->fprintf_func (info->stream, ".byte\t0x%02lx", given); 6054 break; 6055 case 2: 6056 info->fprintf_func (info->stream, ".short\t0x%04lx", given); 6057 break; 6058 case 4: 6059 info->fprintf_func (info->stream, ".word\t0x%08lx", given); 6060 break; 6061 default: 6062 abort (); 6063 } 6064 } 6065 6066 /* Disallow mapping symbols ($a, $b, $d, $t etc) from 6067 being displayed in symbol relative addresses. 6068 6069 Also disallow private symbol, with __tagsym$$ prefix, 6070 from ARM RVCT toolchain being displayed. */ 6071 6072 bfd_boolean 6073 arm_symbol_is_valid (asymbol * sym, 6074 struct disassemble_info * info ATTRIBUTE_UNUSED) 6075 { 6076 const char * name; 6077 6078 if (sym == NULL) 6079 return FALSE; 6080 6081 name = bfd_asymbol_name (sym); 6082 6083 return (name && *name != '$' && strncmp (name, "__tagsym$$", 10)); 6084 } 6085 6086 /* Parse an individual disassembler option. */ 6087 6088 void 6089 parse_arm_disassembler_option (char *option) 6090 { 6091 if (option == NULL) 6092 return; 6093 6094 if (CONST_STRNEQ (option, "reg-names-")) 6095 { 6096 int i; 6097 6098 option += 10; 6099 6100 for (i = NUM_ARM_REGNAMES; i--;) 6101 if (strneq (option, regnames[i].name, strlen (regnames[i].name))) 6102 { 6103 regname_selected = i; 6104 break; 6105 } 6106 6107 if (i < 0) 6108 /* XXX - should break 'option' at following delimiter. */ 6109 fprintf (stderr, _("Unrecognised register name set: %s\n"), option); 6110 } 6111 else if (CONST_STRNEQ (option, "force-thumb")) 6112 force_thumb = 1; 6113 else if (CONST_STRNEQ (option, "no-force-thumb")) 6114 force_thumb = 0; 6115 else 6116 /* XXX - should break 'option' at following delimiter. */ 6117 fprintf (stderr, _("Unrecognised disassembler option: %s\n"), option); 6118 6119 return; 6120 } 6121 6122 /* Parse the string of disassembler options, spliting it at whitespaces 6123 or commas. (Whitespace separators supported for backwards compatibility). */ 6124 6125 static void 6126 parse_disassembler_options (char *options) 6127 { 6128 if (options == NULL) 6129 return; 6130 6131 while (*options) 6132 { 6133 parse_arm_disassembler_option (options); 6134 6135 /* Skip forward to next seperator. */ 6136 while ((*options) && (! ISSPACE (*options)) && (*options != ',')) 6137 ++ options; 6138 /* Skip forward past seperators. */ 6139 while (ISSPACE (*options) || (*options == ',')) 6140 ++ options; 6141 } 6142 } 6143 6144 static bfd_boolean 6145 mapping_symbol_for_insn (bfd_vma pc, struct disassemble_info *info, 6146 enum map_type *map_symbol); 6147 6148 /* Search back through the insn stream to determine if this instruction is 6149 conditionally executed. */ 6150 6151 static void 6152 find_ifthen_state (bfd_vma pc, 6153 struct disassemble_info *info, 6154 bfd_boolean little) 6155 { 6156 unsigned char b[2]; 6157 unsigned int insn; 6158 int status; 6159 /* COUNT is twice the number of instructions seen. It will be odd if we 6160 just crossed an instruction boundary. */ 6161 int count; 6162 int it_count; 6163 unsigned int seen_it; 6164 bfd_vma addr; 6165 6166 ifthen_address = pc; 6167 ifthen_state = 0; 6168 6169 addr = pc; 6170 count = 1; 6171 it_count = 0; 6172 seen_it = 0; 6173 /* Scan backwards looking for IT instructions, keeping track of where 6174 instruction boundaries are. We don't know if something is actually an 6175 IT instruction until we find a definite instruction boundary. */ 6176 for (;;) 6177 { 6178 if (addr == 0 || info->symbol_at_address_func (addr, info)) 6179 { 6180 /* A symbol must be on an instruction boundary, and will not 6181 be within an IT block. */ 6182 if (seen_it && (count & 1)) 6183 break; 6184 6185 return; 6186 } 6187 addr -= 2; 6188 status = info->read_memory_func (addr, (bfd_byte *) b, 2, info); 6189 if (status) 6190 return; 6191 6192 if (little) 6193 insn = (b[0]) | (b[1] << 8); 6194 else 6195 insn = (b[1]) | (b[0] << 8); 6196 if (seen_it) 6197 { 6198 if ((insn & 0xf800) < 0xe800) 6199 { 6200 /* Addr + 2 is an instruction boundary. See if this matches 6201 the expected boundary based on the position of the last 6202 IT candidate. */ 6203 if (count & 1) 6204 break; 6205 seen_it = 0; 6206 } 6207 } 6208 if ((insn & 0xff00) == 0xbf00 && (insn & 0xf) != 0) 6209 { 6210 enum map_type type = MAP_ARM; 6211 bfd_boolean found = mapping_symbol_for_insn (addr, info, &type); 6212 6213 if (!found || (found && type == MAP_THUMB)) 6214 { 6215 /* This could be an IT instruction. */ 6216 seen_it = insn; 6217 it_count = count >> 1; 6218 } 6219 } 6220 if ((insn & 0xf800) >= 0xe800) 6221 count++; 6222 else 6223 count = (count + 2) | 1; 6224 /* IT blocks contain at most 4 instructions. */ 6225 if (count >= 8 && !seen_it) 6226 return; 6227 } 6228 /* We found an IT instruction. */ 6229 ifthen_state = (seen_it & 0xe0) | ((seen_it << it_count) & 0x1f); 6230 if ((ifthen_state & 0xf) == 0) 6231 ifthen_state = 0; 6232 } 6233 6234 /* Returns nonzero and sets *MAP_TYPE if the N'th symbol is a 6235 mapping symbol. */ 6236 6237 static int 6238 is_mapping_symbol (struct disassemble_info *info, int n, 6239 enum map_type *map_type) 6240 { 6241 const char *name; 6242 6243 name = bfd_asymbol_name (info->symtab[n]); 6244 if (name[0] == '$' && (name[1] == 'a' || name[1] == 't' || name[1] == 'd') 6245 && (name[2] == 0 || name[2] == '.')) 6246 { 6247 *map_type = ((name[1] == 'a') ? MAP_ARM 6248 : (name[1] == 't') ? MAP_THUMB 6249 : MAP_DATA); 6250 return TRUE; 6251 } 6252 6253 return FALSE; 6254 } 6255 6256 /* Try to infer the code type (ARM or Thumb) from a mapping symbol. 6257 Returns nonzero if *MAP_TYPE was set. */ 6258 6259 static int 6260 get_map_sym_type (struct disassemble_info *info, 6261 int n, 6262 enum map_type *map_type) 6263 { 6264 /* If the symbol is in a different section, ignore it. */ 6265 if (info->section != NULL && info->section != info->symtab[n]->section) 6266 return FALSE; 6267 6268 return is_mapping_symbol (info, n, map_type); 6269 } 6270 6271 /* Try to infer the code type (ARM or Thumb) from a non-mapping symbol. 6272 Returns nonzero if *MAP_TYPE was set. */ 6273 6274 static int 6275 get_sym_code_type (struct disassemble_info *info, 6276 int n, 6277 enum map_type *map_type) 6278 { 6279 elf_symbol_type *es; 6280 unsigned int type; 6281 6282 /* If the symbol is in a different section, ignore it. */ 6283 if (info->section != NULL && info->section != info->symtab[n]->section) 6284 return FALSE; 6285 6286 es = *(elf_symbol_type **)(info->symtab + n); 6287 type = ELF_ST_TYPE (es->internal_elf_sym.st_info); 6288 6289 /* If the symbol has function type then use that. */ 6290 if (type == STT_FUNC || type == STT_GNU_IFUNC) 6291 { 6292 if (ARM_GET_SYM_BRANCH_TYPE (es->internal_elf_sym.st_target_internal) 6293 == ST_BRANCH_TO_THUMB) 6294 *map_type = MAP_THUMB; 6295 else 6296 *map_type = MAP_ARM; 6297 return TRUE; 6298 } 6299 6300 return FALSE; 6301 } 6302 6303 /* Search the mapping symbol state for instruction at pc. This is only 6304 applicable for elf target. 6305 6306 There is an assumption Here, info->private_data contains the correct AND 6307 up-to-date information about current scan process. The information will be 6308 used to speed this search process. 6309 6310 Return TRUE if the mapping state can be determined, and map_symbol 6311 will be updated accordingly. Otherwise, return FALSE. */ 6312 6313 static bfd_boolean 6314 mapping_symbol_for_insn (bfd_vma pc, struct disassemble_info *info, 6315 enum map_type *map_symbol) 6316 { 6317 bfd_vma addr; 6318 int n, start = 0; 6319 bfd_boolean found = FALSE; 6320 enum map_type type = MAP_ARM; 6321 struct arm_private_data *private_data; 6322 6323 if (info->private_data == NULL || info->symtab_size == 0 6324 || bfd_asymbol_flavour (*info->symtab) != bfd_target_elf_flavour) 6325 return FALSE; 6326 6327 private_data = info->private_data; 6328 if (pc == 0) 6329 start = 0; 6330 else 6331 start = private_data->last_mapping_sym; 6332 6333 start = (start == -1)? 0 : start; 6334 addr = bfd_asymbol_value (info->symtab[start]); 6335 6336 if (pc >= addr) 6337 { 6338 if (get_map_sym_type (info, start, &type)) 6339 found = TRUE; 6340 } 6341 else 6342 { 6343 for (n = start - 1; n >= 0; n--) 6344 { 6345 if (get_map_sym_type (info, n, &type)) 6346 { 6347 found = TRUE; 6348 break; 6349 } 6350 } 6351 } 6352 6353 /* No mapping symbols were found. A leading $d may be 6354 omitted for sections which start with data; but for 6355 compatibility with legacy and stripped binaries, only 6356 assume the leading $d if there is at least one mapping 6357 symbol in the file. */ 6358 if (!found && private_data->has_mapping_symbols == 1) 6359 { 6360 type = MAP_DATA; 6361 found = TRUE; 6362 } 6363 6364 *map_symbol = type; 6365 return found; 6366 } 6367 6368 /* Given a bfd_mach_arm_XXX value, this function fills in the fields 6369 of the supplied arm_feature_set structure with bitmasks indicating 6370 the support base architectures and coprocessor extensions. 6371 6372 FIXME: This could more efficiently implemented as a constant array, 6373 although it would also be less robust. */ 6374 6375 static void 6376 select_arm_features (unsigned long mach, 6377 arm_feature_set * features) 6378 { 6379 #undef ARM_SET_FEATURES 6380 #define ARM_SET_FEATURES(FSET) \ 6381 { \ 6382 const arm_feature_set fset = FSET; \ 6383 arm_feature_set tmp = ARM_FEATURE (0, 0, FPU_FPA) ; \ 6384 ARM_MERGE_FEATURE_SETS (*features, tmp, fset); \ 6385 } 6386 6387 switch (mach) 6388 { 6389 case bfd_mach_arm_2: ARM_SET_FEATURES (ARM_ARCH_V2); break; 6390 case bfd_mach_arm_2a: ARM_SET_FEATURES (ARM_ARCH_V2S); break; 6391 case bfd_mach_arm_3: ARM_SET_FEATURES (ARM_ARCH_V3); break; 6392 case bfd_mach_arm_3M: ARM_SET_FEATURES (ARM_ARCH_V3M); break; 6393 case bfd_mach_arm_4: ARM_SET_FEATURES (ARM_ARCH_V4); break; 6394 case bfd_mach_arm_4T: ARM_SET_FEATURES (ARM_ARCH_V4T); break; 6395 case bfd_mach_arm_5: ARM_SET_FEATURES (ARM_ARCH_V5); break; 6396 case bfd_mach_arm_5T: ARM_SET_FEATURES (ARM_ARCH_V5T); break; 6397 case bfd_mach_arm_5TE: ARM_SET_FEATURES (ARM_ARCH_V5TE); break; 6398 case bfd_mach_arm_XScale: ARM_SET_FEATURES (ARM_ARCH_XSCALE); break; 6399 case bfd_mach_arm_ep9312: 6400 ARM_SET_FEATURES (ARM_FEATURE_LOW (ARM_AEXT_V4T, 6401 ARM_CEXT_MAVERICK | FPU_MAVERICK)); 6402 break; 6403 case bfd_mach_arm_iWMMXt: ARM_SET_FEATURES (ARM_ARCH_IWMMXT); break; 6404 case bfd_mach_arm_iWMMXt2: ARM_SET_FEATURES (ARM_ARCH_IWMMXT2); break; 6405 /* If the machine type is unknown allow all 6406 architecture types and all extensions. */ 6407 case bfd_mach_arm_unknown: ARM_SET_FEATURES (ARM_FEATURE_ALL); break; 6408 default: 6409 abort (); 6410 } 6411 6412 #undef ARM_SET_FEATURES 6413 } 6414 6415 6416 /* NOTE: There are no checks in these routines that 6417 the relevant number of data bytes exist. */ 6418 6419 static int 6420 print_insn (bfd_vma pc, struct disassemble_info *info, bfd_boolean little) 6421 { 6422 unsigned char b[4]; 6423 long given; 6424 int status; 6425 int is_thumb = FALSE; 6426 int is_data = FALSE; 6427 int little_code; 6428 unsigned int size = 4; 6429 void (*printer) (bfd_vma, struct disassemble_info *, long); 6430 bfd_boolean found = FALSE; 6431 struct arm_private_data *private_data; 6432 6433 if (info->disassembler_options) 6434 { 6435 parse_disassembler_options (info->disassembler_options); 6436 6437 /* To avoid repeated parsing of these options, we remove them here. */ 6438 info->disassembler_options = NULL; 6439 } 6440 6441 /* PR 10288: Control which instructions will be disassembled. */ 6442 if (info->private_data == NULL) 6443 { 6444 static struct arm_private_data private; 6445 6446 if ((info->flags & USER_SPECIFIED_MACHINE_TYPE) == 0) 6447 /* If the user did not use the -m command line switch then default to 6448 disassembling all types of ARM instruction. 6449 6450 The info->mach value has to be ignored as this will be based on 6451 the default archictecture for the target and/or hints in the notes 6452 section, but it will never be greater than the current largest arm 6453 machine value (iWMMXt2), which is only equivalent to the V5TE 6454 architecture. ARM architectures have advanced beyond the machine 6455 value encoding, and these newer architectures would be ignored if 6456 the machine value was used. 6457 6458 Ie the -m switch is used to restrict which instructions will be 6459 disassembled. If it is necessary to use the -m switch to tell 6460 objdump that an ARM binary is being disassembled, eg because the 6461 input is a raw binary file, but it is also desired to disassemble 6462 all ARM instructions then use "-marm". This will select the 6463 "unknown" arm architecture which is compatible with any ARM 6464 instruction. */ 6465 info->mach = bfd_mach_arm_unknown; 6466 6467 /* Compute the architecture bitmask from the machine number. 6468 Note: This assumes that the machine number will not change 6469 during disassembly.... */ 6470 select_arm_features (info->mach, & private.features); 6471 6472 private.has_mapping_symbols = -1; 6473 private.last_mapping_sym = -1; 6474 private.last_mapping_addr = 0; 6475 6476 info->private_data = & private; 6477 } 6478 6479 private_data = info->private_data; 6480 6481 /* Decide if our code is going to be little-endian, despite what the 6482 function argument might say. */ 6483 little_code = ((info->endian_code == BFD_ENDIAN_LITTLE) || little); 6484 6485 /* For ELF, consult the symbol table to determine what kind of code 6486 or data we have. */ 6487 if (info->symtab_size != 0 6488 && bfd_asymbol_flavour (*info->symtab) == bfd_target_elf_flavour) 6489 { 6490 bfd_vma addr; 6491 int n, start; 6492 int last_sym = -1; 6493 enum map_type type = MAP_ARM; 6494 6495 /* Start scanning at the start of the function, or wherever 6496 we finished last time. */ 6497 /* PR 14006. When the address is 0 we are either at the start of the 6498 very first function, or else the first function in a new, unlinked 6499 executable section (eg because of -ffunction-sections). Either way 6500 start scanning from the beginning of the symbol table, not where we 6501 left off last time. */ 6502 if (pc == 0) 6503 start = 0; 6504 else 6505 { 6506 start = info->symtab_pos + 1; 6507 if (start < private_data->last_mapping_sym) 6508 start = private_data->last_mapping_sym; 6509 } 6510 found = FALSE; 6511 6512 /* First, look for mapping symbols. */ 6513 if (private_data->has_mapping_symbols != 0) 6514 { 6515 /* Scan up to the location being disassembled. */ 6516 for (n = start; n < info->symtab_size; n++) 6517 { 6518 addr = bfd_asymbol_value (info->symtab[n]); 6519 if (addr > pc) 6520 break; 6521 if (get_map_sym_type (info, n, &type)) 6522 { 6523 last_sym = n; 6524 found = TRUE; 6525 } 6526 } 6527 6528 if (!found) 6529 { 6530 /* No mapping symbol found at this address. Look backwards 6531 for a preceding one. */ 6532 for (n = start - 1; n >= 0; n--) 6533 { 6534 if (get_map_sym_type (info, n, &type)) 6535 { 6536 last_sym = n; 6537 found = TRUE; 6538 break; 6539 } 6540 } 6541 } 6542 6543 if (found) 6544 private_data->has_mapping_symbols = 1; 6545 6546 /* No mapping symbols were found. A leading $d may be 6547 omitted for sections which start with data; but for 6548 compatibility with legacy and stripped binaries, only 6549 assume the leading $d if there is at least one mapping 6550 symbol in the file. */ 6551 if (!found && private_data->has_mapping_symbols == -1) 6552 { 6553 /* Look for mapping symbols, in any section. */ 6554 for (n = 0; n < info->symtab_size; n++) 6555 if (is_mapping_symbol (info, n, &type)) 6556 { 6557 private_data->has_mapping_symbols = 1; 6558 break; 6559 } 6560 if (private_data->has_mapping_symbols == -1) 6561 private_data->has_mapping_symbols = 0; 6562 } 6563 6564 if (!found && private_data->has_mapping_symbols == 1) 6565 { 6566 type = MAP_DATA; 6567 found = TRUE; 6568 } 6569 } 6570 6571 /* Next search for function symbols to separate ARM from Thumb 6572 in binaries without mapping symbols. */ 6573 if (!found) 6574 { 6575 /* Scan up to the location being disassembled. */ 6576 for (n = start; n < info->symtab_size; n++) 6577 { 6578 addr = bfd_asymbol_value (info->symtab[n]); 6579 if (addr > pc) 6580 break; 6581 if (get_sym_code_type (info, n, &type)) 6582 { 6583 last_sym = n; 6584 found = TRUE; 6585 } 6586 } 6587 6588 if (!found) 6589 { 6590 /* No mapping symbol found at this address. Look backwards 6591 for a preceding one. */ 6592 for (n = start - 1; n >= 0; n--) 6593 { 6594 if (get_sym_code_type (info, n, &type)) 6595 { 6596 last_sym = n; 6597 found = TRUE; 6598 break; 6599 } 6600 } 6601 } 6602 } 6603 6604 private_data->last_mapping_sym = last_sym; 6605 private_data->last_type = type; 6606 is_thumb = (private_data->last_type == MAP_THUMB); 6607 is_data = (private_data->last_type == MAP_DATA); 6608 6609 /* Look a little bit ahead to see if we should print out 6610 two or four bytes of data. If there's a symbol, 6611 mapping or otherwise, after two bytes then don't 6612 print more. */ 6613 if (is_data) 6614 { 6615 size = 4 - (pc & 3); 6616 for (n = last_sym + 1; n < info->symtab_size; n++) 6617 { 6618 addr = bfd_asymbol_value (info->symtab[n]); 6619 if (addr > pc 6620 && (info->section == NULL 6621 || info->section == info->symtab[n]->section)) 6622 { 6623 if (addr - pc < size) 6624 size = addr - pc; 6625 break; 6626 } 6627 } 6628 /* If the next symbol is after three bytes, we need to 6629 print only part of the data, so that we can use either 6630 .byte or .short. */ 6631 if (size == 3) 6632 size = (pc & 1) ? 1 : 2; 6633 } 6634 } 6635 6636 if (info->symbols != NULL) 6637 { 6638 if (bfd_asymbol_flavour (*info->symbols) == bfd_target_coff_flavour) 6639 { 6640 coff_symbol_type * cs; 6641 6642 cs = coffsymbol (*info->symbols); 6643 is_thumb = ( cs->native->u.syment.n_sclass == C_THUMBEXT 6644 || cs->native->u.syment.n_sclass == C_THUMBSTAT 6645 || cs->native->u.syment.n_sclass == C_THUMBLABEL 6646 || cs->native->u.syment.n_sclass == C_THUMBEXTFUNC 6647 || cs->native->u.syment.n_sclass == C_THUMBSTATFUNC); 6648 } 6649 else if (bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour 6650 && !found) 6651 { 6652 /* If no mapping symbol has been found then fall back to the type 6653 of the function symbol. */ 6654 elf_symbol_type * es; 6655 unsigned int type; 6656 6657 es = *(elf_symbol_type **)(info->symbols); 6658 type = ELF_ST_TYPE (es->internal_elf_sym.st_info); 6659 6660 is_thumb = 6661 ((ARM_GET_SYM_BRANCH_TYPE (es->internal_elf_sym.st_target_internal) 6662 == ST_BRANCH_TO_THUMB) || type == STT_ARM_16BIT); 6663 } 6664 else if (bfd_asymbol_flavour (*info->symbols) 6665 == bfd_target_mach_o_flavour) 6666 { 6667 bfd_mach_o_asymbol *asym = (bfd_mach_o_asymbol *)*info->symbols; 6668 6669 is_thumb = (asym->n_desc & BFD_MACH_O_N_ARM_THUMB_DEF); 6670 } 6671 } 6672 6673 if (force_thumb) 6674 is_thumb = TRUE; 6675 6676 if (is_data) 6677 info->display_endian = little ? BFD_ENDIAN_LITTLE : BFD_ENDIAN_BIG; 6678 else 6679 info->display_endian = little_code ? BFD_ENDIAN_LITTLE : BFD_ENDIAN_BIG; 6680 6681 info->bytes_per_line = 4; 6682 6683 /* PR 10263: Disassemble data if requested to do so by the user. */ 6684 if (is_data && ((info->flags & DISASSEMBLE_DATA) == 0)) 6685 { 6686 int i; 6687 6688 /* Size was already set above. */ 6689 info->bytes_per_chunk = size; 6690 printer = print_insn_data; 6691 6692 status = info->read_memory_func (pc, (bfd_byte *) b, size, info); 6693 given = 0; 6694 if (little) 6695 for (i = size - 1; i >= 0; i--) 6696 given = b[i] | (given << 8); 6697 else 6698 for (i = 0; i < (int) size; i++) 6699 given = b[i] | (given << 8); 6700 } 6701 else if (!is_thumb) 6702 { 6703 /* In ARM mode endianness is a straightforward issue: the instruction 6704 is four bytes long and is either ordered 0123 or 3210. */ 6705 printer = print_insn_arm; 6706 info->bytes_per_chunk = 4; 6707 size = 4; 6708 6709 status = info->read_memory_func (pc, (bfd_byte *) b, 4, info); 6710 if (little_code) 6711 given = (b[0]) | (b[1] << 8) | (b[2] << 16) | (b[3] << 24); 6712 else 6713 given = (b[3]) | (b[2] << 8) | (b[1] << 16) | (b[0] << 24); 6714 } 6715 else 6716 { 6717 /* In Thumb mode we have the additional wrinkle of two 6718 instruction lengths. Fortunately, the bits that determine 6719 the length of the current instruction are always to be found 6720 in the first two bytes. */ 6721 printer = print_insn_thumb16; 6722 info->bytes_per_chunk = 2; 6723 size = 2; 6724 6725 status = info->read_memory_func (pc, (bfd_byte *) b, 2, info); 6726 if (little_code) 6727 given = (b[0]) | (b[1] << 8); 6728 else 6729 given = (b[1]) | (b[0] << 8); 6730 6731 if (!status) 6732 { 6733 /* These bit patterns signal a four-byte Thumb 6734 instruction. */ 6735 if ((given & 0xF800) == 0xF800 6736 || (given & 0xF800) == 0xF000 6737 || (given & 0xF800) == 0xE800) 6738 { 6739 status = info->read_memory_func (pc + 2, (bfd_byte *) b, 2, info); 6740 if (little_code) 6741 given = (b[0]) | (b[1] << 8) | (given << 16); 6742 else 6743 given = (b[1]) | (b[0] << 8) | (given << 16); 6744 6745 printer = print_insn_thumb32; 6746 size = 4; 6747 } 6748 } 6749 6750 if (ifthen_address != pc) 6751 find_ifthen_state (pc, info, little_code); 6752 6753 if (ifthen_state) 6754 { 6755 if ((ifthen_state & 0xf) == 0x8) 6756 ifthen_next_state = 0; 6757 else 6758 ifthen_next_state = (ifthen_state & 0xe0) 6759 | ((ifthen_state & 0xf) << 1); 6760 } 6761 } 6762 6763 if (status) 6764 { 6765 info->memory_error_func (status, pc, info); 6766 return -1; 6767 } 6768 if (info->flags & INSN_HAS_RELOC) 6769 /* If the instruction has a reloc associated with it, then 6770 the offset field in the instruction will actually be the 6771 addend for the reloc. (We are using REL type relocs). 6772 In such cases, we can ignore the pc when computing 6773 addresses, since the addend is not currently pc-relative. */ 6774 pc = 0; 6775 6776 printer (pc, info, given); 6777 6778 if (is_thumb) 6779 { 6780 ifthen_state = ifthen_next_state; 6781 ifthen_address += size; 6782 } 6783 return size; 6784 } 6785 6786 int 6787 print_insn_big_arm (bfd_vma pc, struct disassemble_info *info) 6788 { 6789 /* Detect BE8-ness and record it in the disassembler info. */ 6790 if (info->flavour == bfd_target_elf_flavour 6791 && info->section != NULL 6792 && (elf_elfheader (info->section->owner)->e_flags & EF_ARM_BE8)) 6793 info->endian_code = BFD_ENDIAN_LITTLE; 6794 6795 return print_insn (pc, info, FALSE); 6796 } 6797 6798 int 6799 print_insn_little_arm (bfd_vma pc, struct disassemble_info *info) 6800 { 6801 return print_insn (pc, info, TRUE); 6802 } 6803 6804 void 6805 print_arm_disassembler_options (FILE *stream) 6806 { 6807 int i; 6808 6809 fprintf (stream, _("\n\ 6810 The following ARM specific disassembler options are supported for use with\n\ 6811 the -M switch:\n")); 6812 6813 for (i = NUM_ARM_REGNAMES; i--;) 6814 fprintf (stream, " reg-names-%s %*c%s\n", 6815 regnames[i].name, 6816 (int)(14 - strlen (regnames[i].name)), ' ', 6817 regnames[i].description); 6818 6819 fprintf (stream, " force-thumb Assume all insns are Thumb insns\n"); 6820 fprintf (stream, " no-force-thumb Examine preceding label to determine an insn's type\n\n"); 6821 } 6822