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