00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "sysdep.h"
00028
00029 #include "dis-asm.h"
00030 #include "opcode/arm.h"
00031 #include "arm-opc.h"
00032 #include "coff/internal.h"
00033 #include "libcoff.h"
00034 #include "opintl.h"
00035 #include "safe-ctype.h"
00036
00037
00038 #include "elf-bfd.h"
00039 #include "elf/internal.h"
00040 #include "elf/arm.h"
00041
00042 #ifndef streq
00043 #define streq(a,b) (strcmp ((a), (b)) == 0)
00044 #endif
00045
00046 #ifndef strneq
00047 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
00048 #endif
00049
00050 #ifndef NUM_ELEM
00051 #define NUM_ELEM(a) (sizeof (a) / sizeof (a)[0])
00052 #endif
00053
00054 #define WORD_ADDRESS(pc) ((pc) & ~0x3)
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 static const struct arm_opcode arm_opcodes[] =
00115 {
00116
00117 {ARM_EXT_V1, 0xe1a00000, 0xffffffff, "nop\t\t\t(mov r0,r0)"},
00118 {ARM_EXT_V4T | ARM_EXT_V5, 0x012FFF10, 0x0ffffff0, "bx%c\t%0-3r"},
00119 {ARM_EXT_V2, 0x00000090, 0x0fe000f0, "mul%c%20's\t%16-19r, %0-3r, %8-11r"},
00120 {ARM_EXT_V2, 0x00200090, 0x0fe000f0, "mla%c%20's\t%16-19r, %0-3r, %8-11r, %12-15r"},
00121 {ARM_EXT_V2S, 0x01000090, 0x0fb00ff0, "swp%c%22'b\t%12-15r, %0-3r, [%16-19r]"},
00122 {ARM_EXT_V3M, 0x00800090, 0x0fa000f0, "%22?sumull%c%20's\t%12-15r, %16-19r, %0-3r, %8-11r"},
00123 {ARM_EXT_V3M, 0x00a00090, 0x0fa000f0, "%22?sumlal%c%20's\t%12-15r, %16-19r, %0-3r, %8-11r"},
00124
00125
00126 {ARM_EXT_V6Z, 0x01600070, 0x0ff000f0, "smi%c\t%e"},
00127
00128
00129 {ARM_EXT_V6K, 0xf57ff01f, 0xffffffff, "clrex"},
00130 {ARM_EXT_V6K, 0x01d00f9f, 0x0ff00fff, "ldrexb%c\t%12-15r, [%16-19r]"},
00131 {ARM_EXT_V6K, 0x01b00f9f, 0x0ff00fff, "ldrexd%c\t%12-15r, [%16-19r]"},
00132 {ARM_EXT_V6K, 0x01f00f9f, 0x0ff00fff, "ldrexh%c\t%12-15r, [%16-19r]"},
00133 {ARM_EXT_V6K, 0x01c00f90, 0x0ff00ff0, "strexb%c\t%12-15r, %0-3r, [%16-19r]"},
00134 {ARM_EXT_V6K, 0x01a00f90, 0x0ff00ff0, "strexd%c\t%12-15r, %0-3r, [%16-19r]"},
00135 {ARM_EXT_V6K, 0x01e00f90, 0x0ff00ff0, "strexh%c\t%12-15r, %0-3r, [%16-19r]"},
00136
00137
00138 {ARM_EXT_V6K, 0x0320f001, 0x0fffffff, "yield%c"},
00139 {ARM_EXT_V6K, 0x0320f002, 0x0fffffff, "wfe%c"},
00140 {ARM_EXT_V6K, 0x0320f003, 0x0fffffff, "wfi%c"},
00141 {ARM_EXT_V6K, 0x0320f004, 0x0fffffff, "sev%c"},
00142 {ARM_EXT_V6K, 0x0320f000, 0x0fffff00, "nop%c\t{%0-7d}"},
00143
00144
00145 {ARM_EXT_V6, 0xfc500000, 0xfff00000, "mrrc2\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
00146 {ARM_EXT_V6, 0xfc400000, 0xfff00000, "mcrr2\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
00147 {ARM_EXT_V6, 0xf1080000, 0xfffdfe3f, "cpsie\t%8'a%7'i%6'f"},
00148 {ARM_EXT_V6, 0xf1080000, 0xfffdfe20, "cpsie\t%8'a%7'i%6'f,#%0-4d"},
00149 {ARM_EXT_V6, 0xf10C0000, 0xfffdfe3f, "cpsid\t%8'a%7'i%6'f"},
00150 {ARM_EXT_V6, 0xf10C0000, 0xfffdfe20, "cpsid\t%8'a%7'i%6'f,#%0-4d"},
00151 {ARM_EXT_V6, 0xf1000000, 0xfff1fe20, "cps\t#%0-4d"},
00152 {ARM_EXT_V6, 0x06800010, 0x0ff00ff0, "pkhbt%c\t%12-15r, %16-19r, %0-3r"},
00153 {ARM_EXT_V6, 0x06800010, 0x0ff00070, "pkhbt%c\t%12-15r, %16-19r, %0-3r, LSL #%7-11d"},
00154 {ARM_EXT_V6, 0x06800050, 0x0ff00ff0, "pkhtb%c\t%12-15r, %16-19r, %0-3r, ASR #32"},
00155 {ARM_EXT_V6, 0x06800050, 0x0ff00070, "pkhtb%c\t%12-15r, %16-19r, %0-3r, ASR #%7-11d"},
00156 {ARM_EXT_V6, 0x01900f9f, 0x0ff00fff, "ldrex%c\tr%12-15d, [%16-19r]"},
00157 {ARM_EXT_V6, 0x06200f10, 0x0ff00ff0, "qadd16%c\t%12-15r, %16-19r, %0-3r"},
00158 {ARM_EXT_V6, 0x06200f90, 0x0ff00ff0, "qadd8%c\t%12-15r, %16-19r, %0-3r"},
00159 {ARM_EXT_V6, 0x06200f30, 0x0ff00ff0, "qaddsubx%c\t%12-15r, %16-19r, %0-3r"},
00160 {ARM_EXT_V6, 0x06200f70, 0x0ff00ff0, "qsub16%c\t%12-15r, %16-19r, %0-3r"},
00161 {ARM_EXT_V6, 0x06200ff0, 0x0ff00ff0, "qsub8%c\t%12-15r, %16-19r, %0-3r"},
00162 {ARM_EXT_V6, 0x06200f50, 0x0ff00ff0, "qsubaddx%c\t%12-15r, %16-19r, %0-3r"},
00163 {ARM_EXT_V6, 0x06100f10, 0x0ff00ff0, "sadd16%c\t%12-15r, %16-19r, %0-3r"},
00164 {ARM_EXT_V6, 0x06100f90, 0x0ff00ff0, "sadd8%c\t%12-15r, %16-19r, %0-3r"},
00165 {ARM_EXT_V6, 0x06100f30, 0x0ff00ff0, "saddaddx%c\t%12-15r, %16-19r, %0-3r"},
00166 {ARM_EXT_V6, 0x06300f10, 0x0ff00ff0, "shadd16%c\t%12-15r, %16-19r, %0-3r"},
00167 {ARM_EXT_V6, 0x06300f90, 0x0ff00ff0, "shadd8%c\t%12-15r, %16-19r, %0-3r"},
00168 {ARM_EXT_V6, 0x06300f30, 0x0ff00ff0, "shaddsubx%c\t%12-15r, %16-19r, %0-3r"},
00169 {ARM_EXT_V6, 0x06300f70, 0x0ff00ff0, "shsub16%c\t%12-15r, %16-19r, %0-3r"},
00170 {ARM_EXT_V6, 0x06300ff0, 0x0ff00ff0, "shsub8%c\t%12-15r, %16-19r, %0-3r"},
00171 {ARM_EXT_V6, 0x06300f50, 0x0ff00ff0, "shsubaddx%c\t%12-15r, %16-19r, %0-3r"},
00172 {ARM_EXT_V6, 0x06100f70, 0x0ff00ff0, "ssub16%c\t%12-15r, %16-19r, %0-3r"},
00173 {ARM_EXT_V6, 0x06100ff0, 0x0ff00ff0, "ssub8%c\t%12-15r, %16-19r, %0-3r"},
00174 {ARM_EXT_V6, 0x06100f50, 0x0ff00ff0, "ssubaddx%c\t%12-15r, %16-19r, %0-3r"},
00175 {ARM_EXT_V6, 0x06500f10, 0x0ff00ff0, "uadd16%c\t%12-15r, %16-19r, %0-3r"},
00176 {ARM_EXT_V6, 0x06500f90, 0x0ff00ff0, "uadd8%c\t%12-15r, %16-19r, %0-3r"},
00177 {ARM_EXT_V6, 0x06500f30, 0x0ff00ff0, "uaddsubx%c\t%12-15r, %16-19r, %0-3r"},
00178 {ARM_EXT_V6, 0x06700f10, 0x0ff00ff0, "uhadd16%c\t%12-15r, %16-19r, %0-3r"},
00179 {ARM_EXT_V6, 0x06700f90, 0x0ff00ff0, "uhadd8%c\t%12-15r, %16-19r, %0-3r"},
00180 {ARM_EXT_V6, 0x06700f30, 0x0ff00ff0, "uhaddsubx%c\t%12-15r, %16-19r, %0-3r"},
00181 {ARM_EXT_V6, 0x06700f70, 0x0ff00ff0, "uhsub16%c\t%12-15r, %16-19r, %0-3r"},
00182 {ARM_EXT_V6, 0x06700ff0, 0x0ff00ff0, "uhsub8%c\t%12-15r, %16-19r, %0-3r"},
00183 {ARM_EXT_V6, 0x06700f50, 0x0ff00ff0, "uhsubaddx%c\t%12-15r, %16-19r, %0-3r"},
00184 {ARM_EXT_V6, 0x06600f10, 0x0ff00ff0, "uqadd16%c\t%12-15r, %16-19r, %0-3r"},
00185 {ARM_EXT_V6, 0x06600f90, 0x0ff00ff0, "uqadd8%c\t%12-15r, %16-19r, %0-3r"},
00186 {ARM_EXT_V6, 0x06600f30, 0x0ff00ff0, "uqaddsubx%c\t%12-15r, %16-19r, %0-3r"},
00187 {ARM_EXT_V6, 0x06600f70, 0x0ff00ff0, "uqsub16%c\t%12-15r, %16-19r, %0-3r"},
00188 {ARM_EXT_V6, 0x06600ff0, 0x0ff00ff0, "uqsub8%c\t%12-15r, %16-19r, %0-3r"},
00189 {ARM_EXT_V6, 0x06600f50, 0x0ff00ff0, "uqsubaddx%c\t%12-15r, %16-19r, %0-3r"},
00190 {ARM_EXT_V6, 0x06500f70, 0x0ff00ff0, "usub16%c\t%12-15r, %16-19r, %0-3r"},
00191 {ARM_EXT_V6, 0x06500ff0, 0x0ff00ff0, "usub8%c\t%12-15r, %16-19r, %0-3r"},
00192 {ARM_EXT_V6, 0x06500f50, 0x0ff00ff0, "usubaddx%c\t%12-15r, %16-19r, %0-3r"},
00193 {ARM_EXT_V6, 0x06bf0f30, 0x0fff0ff0, "rev%c\t\%12-15r, %0-3r"},
00194 {ARM_EXT_V6, 0x06bf0fb0, 0x0fff0ff0, "rev16%c\t\%12-15r, %0-3r"},
00195 {ARM_EXT_V6, 0x06ff0fb0, 0x0fff0ff0, "revsh%c\t\%12-15r, %0-3r"},
00196 {ARM_EXT_V6, 0xf8100a00, 0xfe50ffff, "rfe%23?id%24?ba\t\%16-19r%21'!"},
00197 {ARM_EXT_V6, 0x06bf0070, 0x0fff0ff0, "sxth%c %12-15r,%0-3r"},
00198 {ARM_EXT_V6, 0x06bf0470, 0x0fff0ff0, "sxth%c %12-15r,%0-3r, ROR #8"},
00199 {ARM_EXT_V6, 0x06bf0870, 0x0fff0ff0, "sxth%c %12-15r,%0-3r, ROR #16"},
00200 {ARM_EXT_V6, 0x06bf0c70, 0x0fff0ff0, "sxth%c %12-15r,%0-3r, ROR #24"},
00201 {ARM_EXT_V6, 0x068f0070, 0x0fff0ff0, "sxtb16%c %12-15r,%0-3r"},
00202 {ARM_EXT_V6, 0x068f0470, 0x0fff0ff0, "sxtb16%c %12-15r,%0-3r, ROR #8"},
00203 {ARM_EXT_V6, 0x068f0870, 0x0fff0ff0, "sxtb16%c %12-15r,%0-3r, ROR #16"},
00204 {ARM_EXT_V6, 0x068f0c70, 0x0fff0ff0, "sxtb16%c %12-15r,%0-3r, ROR #24"},
00205 {ARM_EXT_V6, 0x06af0070, 0x0fff0ff0, "sxtb%c %12-15r,%0-3r"},
00206 {ARM_EXT_V6, 0x06af0470, 0x0fff0ff0, "sxtb%c %12-15r,%0-3r, ROR #8"},
00207 {ARM_EXT_V6, 0x06af0870, 0x0fff0ff0, "sxtb%c %12-15r,%0-3r, ROR #16"},
00208 {ARM_EXT_V6, 0x06af0c70, 0x0fff0ff0, "sxtb%c %12-15r,%0-3r, ROR #24"},
00209 {ARM_EXT_V6, 0x06ff0070, 0x0fff0ff0, "uxth%c %12-15r,%0-3r"},
00210 {ARM_EXT_V6, 0x06ff0470, 0x0fff0ff0, "uxth%c %12-15r,%0-3r, ROR #8"},
00211 {ARM_EXT_V6, 0x06ff0870, 0x0fff0ff0, "uxth%c %12-15r,%0-3r, ROR #16"},
00212 {ARM_EXT_V6, 0x06ff0c70, 0x0fff0ff0, "uxth%c %12-15r,%0-3r, ROR #24"},
00213 {ARM_EXT_V6, 0x06cf0070, 0x0fff0ff0, "uxtb16%c %12-15r,%0-3r"},
00214 {ARM_EXT_V6, 0x06cf0470, 0x0fff0ff0, "uxtb16%c %12-15r,%0-3r, ROR #8"},
00215 {ARM_EXT_V6, 0x06cf0870, 0x0fff0ff0, "uxtb16%c %12-15r,%0-3r, ROR #16"},
00216 {ARM_EXT_V6, 0x06cf0c70, 0x0fff0ff0, "uxtb16%c %12-15r,%0-3r, ROR #24"},
00217 {ARM_EXT_V6, 0x06ef0070, 0x0fff0ff0, "uxtb%c %12-15r,%0-3r"},
00218 {ARM_EXT_V6, 0x06ef0470, 0x0fff0ff0, "uxtb%c %12-15r,%0-3r, ROR #8"},
00219 {ARM_EXT_V6, 0x06ef0870, 0x0fff0ff0, "uxtb%c %12-15r,%0-3r, ROR #16"},
00220 {ARM_EXT_V6, 0x06ef0c70, 0x0fff0ff0, "uxtb%c %12-15r,%0-3r, ROR #24"},
00221 {ARM_EXT_V6, 0x06b00070, 0x0ff00ff0, "sxtah%c\t%12-15r, %16-19r, %0-3r"},
00222 {ARM_EXT_V6, 0x06b00470, 0x0ff00ff0, "sxtah%c\t%12-15r, %16-19r, %0-3r, ROR #8"},
00223 {ARM_EXT_V6, 0x06b00870, 0x0ff00ff0, "sxtah%c\t%12-15r, %16-19r, %0-3r, ROR #16"},
00224 {ARM_EXT_V6, 0x06b00c70, 0x0ff00ff0, "sxtah%c\t%12-15r, %16-19r, %0-3r, ROR #24"},
00225 {ARM_EXT_V6, 0x06800070, 0x0ff00ff0, "sxtab16%c\t%12-15r, %16-19r, %0-3r"},
00226 {ARM_EXT_V6, 0x06800470, 0x0ff00ff0, "sxtab16%c\t%12-15r, %16-19r, %0-3r, ROR #8"},
00227 {ARM_EXT_V6, 0x06800870, 0x0ff00ff0, "sxtab16%c\t%12-15r, %16-19r, %0-3r, ROR #16"},
00228 {ARM_EXT_V6, 0x06800c70, 0x0ff00ff0, "sxtab16%c\t%12-15r, %16-19r, %0-3r, ROR #24"},
00229 {ARM_EXT_V6, 0x06a00070, 0x0ff00ff0, "sxtab%c\t%12-15r, %16-19r, %0-3r"},
00230 {ARM_EXT_V6, 0x06a00470, 0x0ff00ff0, "sxtab%c\t%12-15r, %16-19r, %0-3r, ROR #8"},
00231 {ARM_EXT_V6, 0x06a00870, 0x0ff00ff0, "sxtab%c\t%12-15r, %16-19r, %0-3r, ROR #16"},
00232 {ARM_EXT_V6, 0x06a00c70, 0x0ff00ff0, "sxtab%c\t%12-15r, %16-19r, %0-3r, ROR #24"},
00233 {ARM_EXT_V6, 0x06f00070, 0x0ff00ff0, "uxtah%c\t%12-15r, %16-19r, %0-3r"},
00234 {ARM_EXT_V6, 0x06f00470, 0x0ff00ff0, "uxtah%c\t%12-15r, %16-19r, %0-3r, ROR #8"},
00235 {ARM_EXT_V6, 0x06f00870, 0x0ff00ff0, "uxtah%c\t%12-15r, %16-19r, %0-3r, ROR #16"},
00236 {ARM_EXT_V6, 0x06f00c70, 0x0ff00ff0, "uxtah%c\t%12-15r, %16-19r, %0-3r, ROR #24"},
00237 {ARM_EXT_V6, 0x06c00070, 0x0ff00ff0, "uxtab16%c\t%12-15r, %16-19r, %0-3r"},
00238 {ARM_EXT_V6, 0x06c00470, 0x0ff00ff0, "uxtab16%c\t%12-15r, %16-19r, %0-3r, ROR #8"},
00239 {ARM_EXT_V6, 0x06c00870, 0x0ff00ff0, "uxtab16%c\t%12-15r, %16-19r, %0-3r, ROR #16"},
00240 {ARM_EXT_V6, 0x06c00c70, 0x0ff00ff0, "uxtab16%c\t%12-15r, %16-19r, %0-3r, ROR #24"},
00241 {ARM_EXT_V6, 0x06e00070, 0x0ff00ff0, "uxtab%c\t%12-15r, %16-19r, %0-3r"},
00242 {ARM_EXT_V6, 0x06e00470, 0x0ff00ff0, "uxtab%c\t%12-15r, %16-19r, %0-3r, ROR #8"},
00243 {ARM_EXT_V6, 0x06e00870, 0x0ff00ff0, "uxtab%c\t%12-15r, %16-19r, %0-3r, ROR #16"},
00244 {ARM_EXT_V6, 0x06e00c70, 0x0ff00ff0, "uxtab%c\t%12-15r, %16-19r, %0-3r, ROR #24"},
00245 {ARM_EXT_V6, 0x068000b0, 0x0ff00ff0, "sel%c\t%12-15r, %16-19r, %0-3r"},
00246 {ARM_EXT_V6, 0xf1010000, 0xfffffc00, "setend\t%9?ble"},
00247 {ARM_EXT_V6, 0x0700f010, 0x0ff0f0d0, "smuad%5'x%c\t%16-19r, %0-3r, %8-11r"},
00248 {ARM_EXT_V6, 0x0700f050, 0x0ff0f0d0, "smusd%5'x%c\t%16-19r, %0-3r, %8-11r"},
00249 {ARM_EXT_V6, 0x07000010, 0x0ff000d0, "smlad%5'x%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
00250 {ARM_EXT_V6, 0x07400010, 0x0ff000d0, "smlald%5'x%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
00251 {ARM_EXT_V6, 0x07000050, 0x0ff000d0, "smlsd%5'x%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
00252 {ARM_EXT_V6, 0x07400050, 0x0ff000d0, "smlsld%5'x%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
00253 {ARM_EXT_V6, 0x0750f010, 0x0ff0f0d0, "smmul%5'r%c\t%16-19r, %0-3r, %8-11r"},
00254 {ARM_EXT_V6, 0x07500010, 0x0ff000d0, "smmla%5'r%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
00255 {ARM_EXT_V6, 0x075000d0, 0x0ff000d0, "smmls%5'r%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
00256 {ARM_EXT_V6, 0xf84d0500, 0xfe5fffe0, "srs%23?id%24?ba\t#%0-4d%21'!"},
00257 {ARM_EXT_V6, 0x06a00010, 0x0fe00ff0, "ssat%c\t%12-15r, #%16-20W, %0-3r"},
00258 {ARM_EXT_V6, 0x06a00010, 0x0fe00070, "ssat%c\t%12-15r, #%16-20W, %0-3r, LSL #%7-11d"},
00259 {ARM_EXT_V6, 0x06a00050, 0x0fe00070, "ssat%c\t%12-15r, #%16-20W, %0-3r, ASR #%7-11d"},
00260 {ARM_EXT_V6, 0x06a00f30, 0x0ff00ff0, "ssat16%c\t%12-15r, #%16-19W, %0-3r"},
00261 {ARM_EXT_V6, 0x01800f90, 0x0ff00ff0, "strex%c\t%12-15r, %0-3r, [%16-19r]"},
00262 {ARM_EXT_V6, 0x00400090, 0x0ff000f0, "umaal%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
00263 {ARM_EXT_V6, 0x0780f010, 0x0ff0f0f0, "usad8%c\t%16-19r, %0-3r, %8-11r"},
00264 {ARM_EXT_V6, 0x07800010, 0x0ff000f0, "usada8%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
00265 {ARM_EXT_V6, 0x06e00010, 0x0fe00ff0, "usat%c\t%12-15r, #%16-20d, %0-3r"},
00266 {ARM_EXT_V6, 0x06e00010, 0x0fe00070, "usat%c\t%12-15r, #%16-20d, %0-3r, LSL #%7-11d"},
00267 {ARM_EXT_V6, 0x06e00050, 0x0fe00070, "usat%c\t%12-15r, #%16-20d, %0-3r, ASR #%7-11d"},
00268 {ARM_EXT_V6, 0x06e00f30, 0x0ff00ff0, "usat16%c\t%12-15r, #%16-19d, %0-3r"},
00269
00270
00271 {ARM_EXT_V5J, 0x012fff20, 0x0ffffff0, "bxj%c\t%0-3r"},
00272
00273
00274 {ARM_CEXT_XSCALE, 0x0e200010, 0x0fff0ff0, "mia%c\tacc0, %0-3r, %12-15r"},
00275 {ARM_CEXT_XSCALE, 0x0e280010, 0x0fff0ff0, "miaph%c\tacc0, %0-3r, %12-15r"},
00276 {ARM_CEXT_XSCALE, 0x0e2c0010, 0x0ffc0ff0, "mia%17'T%17`B%16'T%16`B%c\tacc0, %0-3r, %12-15r"},
00277 {ARM_CEXT_XSCALE, 0x0c400000, 0x0ff00fff, "mar%c\tacc0, %12-15r, %16-19r"},
00278 {ARM_CEXT_XSCALE, 0x0c500000, 0x0ff00fff, "mra%c\t%12-15r, %16-19r, acc0"},
00279
00280
00281 #define FIRST_IWMMXT_INSN 0x0e130130
00282 #define IWMMXT_INSN_COUNT 47
00283 {ARM_CEXT_IWMMXT, 0x0e130130, 0x0f3f0fff, "tandc%22-23w%c\t%12-15r"},
00284 {ARM_CEXT_XSCALE, 0x0e400010, 0x0ff00f3f, "tbcst%6-7w%c\t%16-19g, %12-15r"},
00285 {ARM_CEXT_XSCALE, 0x0e130170, 0x0f3f0ff8, "textrc%22-23w%c\t%12-15r, #%0-2d"},
00286 {ARM_CEXT_XSCALE, 0x0e100070, 0x0f300ff0, "textrm%3?su%22-23w%c\t%12-15r, %16-19g, #%0-2d"},
00287 {ARM_CEXT_XSCALE, 0x0e600010, 0x0ff00f38, "tinsr%6-7w%c\t%16-19g, %12-15r, #%0-2d"},
00288 {ARM_CEXT_XSCALE, 0x0e000110, 0x0ff00fff, "tmcr%c\t%16-19G, %12-15r"},
00289 {ARM_CEXT_XSCALE, 0x0c400000, 0x0ff00ff0, "tmcrr%c\t%0-3g, %12-15r, %16-19r"},
00290 {ARM_CEXT_XSCALE, 0x0e2c0010, 0x0ffc0e10, "tmia%17?tb%16?tb%c\t%5-8g, %0-3r, %12-15r"},
00291 {ARM_CEXT_XSCALE, 0x0e200010, 0x0fff0e10, "tmia%c\t%5-8g, %0-3r, %12-15r"},
00292 {ARM_CEXT_XSCALE, 0x0e280010, 0x0fff0e10, "tmiaph%c\t%5-8g, %0-3r, %12-15r"},
00293 {ARM_CEXT_XSCALE, 0x0e100030, 0x0f300fff, "tmovmsk%22-23w%c\t%12-15r, %16-19g"},
00294 {ARM_CEXT_XSCALE, 0x0e100110, 0x0ff00ff0, "tmrc%c\t%12-15r, %16-19G"},
00295 {ARM_CEXT_XSCALE, 0x0c500000, 0x0ff00ff0, "tmrrc%c\t%12-15r, %16-19r, %0-3g"},
00296 {ARM_CEXT_XSCALE, 0x0e130150, 0x0f3f0fff, "torc%22-23w%c\t%12-15r"},
00297 {ARM_CEXT_XSCALE, 0x0e0001c0, 0x0f300fff, "wacc%22-23w%c\t%12-15g, %16-19g"},
00298 {ARM_CEXT_XSCALE, 0x0e000180, 0x0f000ff0, "wadd%20-23w%c\t%12-15g, %16-19g, %0-3g"},
00299 {ARM_CEXT_XSCALE, 0x0e000020, 0x0f800ff0, "waligni%c\t%12-15g, %16-19g, %0-3g, #%20-22d"},
00300 {ARM_CEXT_XSCALE, 0x0e800020, 0x0fc00ff0, "walignr%20-21d%c\t%12-15g, %16-19g, %0-3g"},
00301 {ARM_CEXT_XSCALE, 0x0e200000, 0x0fe00ff0, "wand%20'n%c\t%12-15g, %16-19g, %0-3g"},
00302 {ARM_CEXT_XSCALE, 0x0e800000, 0x0fa00ff0, "wavg2%22?hb%20'r%c\t%12-15g, %16-19g, %0-3g"},
00303 {ARM_CEXT_XSCALE, 0x0e000060, 0x0f300ff0, "wcmpeq%22-23w%c\t%12-15g, %16-19g, %0-3g"},
00304 {ARM_CEXT_XSCALE, 0x0e100060, 0x0f100ff0, "wcmpgt%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
00305 {ARM_CEXT_XSCALE, 0xfc100100, 0xfe500f00, "wldrw\t%12-15G, %A"},
00306 {ARM_CEXT_XSCALE, 0x0c100000, 0x0e100e00, "wldr%L%c\t%12-15g, %l"},
00307 {ARM_CEXT_XSCALE, 0x0e400100, 0x0fc00ff0, "wmac%21?su%20'z%c\t%12-15g, %16-19g, %0-3g"},
00308 {ARM_CEXT_XSCALE, 0x0e800100, 0x0fd00ff0, "wmadd%21?su%c\t%12-15g, %16-19g, %0-3g"},
00309 {ARM_CEXT_XSCALE, 0x0e000160, 0x0f100ff0, "wmax%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
00310 {ARM_CEXT_XSCALE, 0x0e100160, 0x0f100ff0, "wmin%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
00311 {ARM_CEXT_XSCALE, 0x0e000100, 0x0fc00ff0, "wmul%21?su%20?ml%c\t%12-15g, %16-19g, %0-3g"},
00312 {ARM_CEXT_XSCALE, 0x0e000000, 0x0ff00ff0, "wor%c\t%12-15g, %16-19g, %0-3g"},
00313 {ARM_CEXT_XSCALE, 0x0e000080, 0x0f000ff0, "wpack%20-23w%c\t%12-15g, %16-19g, %0-3g"},
00314 {ARM_CEXT_XSCALE, 0x0e300040, 0x0f300ff0, "wror%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
00315 {ARM_CEXT_XSCALE, 0x0e300148, 0x0f300ffc, "wror%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
00316 {ARM_CEXT_XSCALE, 0x0e000120, 0x0fa00ff0, "wsad%22?hb%20'z%c\t%12-15g, %16-19g, %0-3g"},
00317 {ARM_CEXT_XSCALE, 0x0e0001e0, 0x0f000ff0, "wshufh%c\t%12-15g, %16-19g, #%Z"},
00318 {ARM_CEXT_XSCALE, 0x0e100040, 0x0f300ff0, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
00319 {ARM_CEXT_XSCALE, 0x0e100148, 0x0f300ffc, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
00320 {ARM_CEXT_XSCALE, 0x0e000040, 0x0f300ff0, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
00321 {ARM_CEXT_XSCALE, 0x0e000148, 0x0f300ffc, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
00322 {ARM_CEXT_XSCALE, 0x0e200040, 0x0f300ff0, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
00323 {ARM_CEXT_XSCALE, 0x0e200148, 0x0f300ffc, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
00324 {ARM_CEXT_XSCALE, 0xfc000100, 0xfe500f00, "wstrw\t%12-15G, %A"},
00325 {ARM_CEXT_XSCALE, 0x0c000000, 0x0e100e00, "wstr%L%c\t%12-15g, %l"},
00326 {ARM_CEXT_XSCALE, 0x0e0001a0, 0x0f000ff0, "wsub%20-23w%c\t%12-15g, %16-19g, %0-3g"},
00327 {ARM_CEXT_XSCALE, 0x0e0000c0, 0x0f100fff, "wunpckeh%21?su%22-23w%c\t%12-15g, %16-19g"},
00328 {ARM_CEXT_XSCALE, 0x0e0000e0, 0x0f100fff, "wunpckel%21?su%22-23w%c\t%12-15g, %16-19g"},
00329 {ARM_CEXT_XSCALE, 0x0e1000c0, 0x0f300ff0, "wunpckih%22-23w%c\t%12-15g, %16-19g, %0-3g"},
00330 {ARM_CEXT_XSCALE, 0x0e1000e0, 0x0f300ff0, "wunpckil%22-23w%c\t%12-15g, %16-19g, %0-3g"},
00331 {ARM_CEXT_XSCALE, 0x0e100000, 0x0ff00ff0, "wxor%c\t%12-15g, %16-19g, %0-3g"},
00332
00333
00334 {ARM_EXT_V5, 0xe1200070, 0xfff000f0, "bkpt\t0x%16-19X%12-15X%8-11X%0-3X"},
00335 {ARM_EXT_V5, 0xfa000000, 0xfe000000, "blx\t%B"},
00336 {ARM_EXT_V5, 0x012fff30, 0x0ffffff0, "blx%c\t%0-3r"},
00337 {ARM_EXT_V5, 0x016f0f10, 0x0fff0ff0, "clz%c\t%12-15r, %0-3r"},
00338 {ARM_EXT_V5, 0xfc100000, 0xfe100000, "ldc2%22'l\t%8-11d, cr%12-15d, %A"},
00339 {ARM_EXT_V5, 0xfc000000, 0xfe100000, "stc2%22'l\t%8-11d, cr%12-15d, %A"},
00340 {ARM_EXT_V5, 0xfe000000, 0xff000010, "cdp2\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
00341 {ARM_EXT_V5, 0xfe000010, 0xff100010, "mcr2\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
00342 {ARM_EXT_V5, 0xfe100010, 0xff100010, "mrc2\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
00343
00344
00345 {ARM_EXT_V5E, 0x000000d0, 0x0e1000f0, "ldr%cd\t%12-15r, %s"},
00346 {ARM_EXT_V5E, 0x000000f0, 0x0e1000f0, "str%cd\t%12-15r, %s"},
00347 {ARM_EXT_V5E, 0xf450f000, 0xfc70f000, "pld\t%a"},
00348 {ARM_EXT_V5ExP, 0x01000080, 0x0ff000f0, "smlabb%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
00349 {ARM_EXT_V5ExP, 0x010000a0, 0x0ff000f0, "smlatb%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
00350 {ARM_EXT_V5ExP, 0x010000c0, 0x0ff000f0, "smlabt%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
00351 {ARM_EXT_V5ExP, 0x010000e0, 0x0ff000f0, "smlatt%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
00352
00353 {ARM_EXT_V5ExP, 0x01200080, 0x0ff000f0, "smlawb%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
00354 {ARM_EXT_V5ExP, 0x012000c0, 0x0ff000f0, "smlawt%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
00355
00356 {ARM_EXT_V5ExP, 0x01400080, 0x0ff000f0, "smlalbb%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
00357 {ARM_EXT_V5ExP, 0x014000a0, 0x0ff000f0, "smlaltb%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
00358 {ARM_EXT_V5ExP, 0x014000c0, 0x0ff000f0, "smlalbt%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
00359 {ARM_EXT_V5ExP, 0x014000e0, 0x0ff000f0, "smlaltt%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
00360
00361 {ARM_EXT_V5ExP, 0x01600080, 0x0ff0f0f0, "smulbb%c\t%16-19r, %0-3r, %8-11r"},
00362 {ARM_EXT_V5ExP, 0x016000a0, 0x0ff0f0f0, "smultb%c\t%16-19r, %0-3r, %8-11r"},
00363 {ARM_EXT_V5ExP, 0x016000c0, 0x0ff0f0f0, "smulbt%c\t%16-19r, %0-3r, %8-11r"},
00364 {ARM_EXT_V5ExP, 0x016000e0, 0x0ff0f0f0, "smultt%c\t%16-19r, %0-3r, %8-11r"},
00365
00366 {ARM_EXT_V5ExP, 0x012000a0, 0x0ff0f0f0, "smulwb%c\t%16-19r, %0-3r, %8-11r"},
00367 {ARM_EXT_V5ExP, 0x012000e0, 0x0ff0f0f0, "smulwt%c\t%16-19r, %0-3r, %8-11r"},
00368
00369 {ARM_EXT_V5ExP, 0x01000050, 0x0ff00ff0, "qadd%c\t%12-15r, %0-3r, %16-19r"},
00370 {ARM_EXT_V5ExP, 0x01400050, 0x0ff00ff0, "qdadd%c\t%12-15r, %0-3r, %16-19r"},
00371 {ARM_EXT_V5ExP, 0x01200050, 0x0ff00ff0, "qsub%c\t%12-15r, %0-3r, %16-19r"},
00372 {ARM_EXT_V5ExP, 0x01600050, 0x0ff00ff0, "qdsub%c\t%12-15r, %0-3r, %16-19r"},
00373
00374
00375 {ARM_EXT_V1, 0x00000090, 0x0e100090, "str%c%6's%5?hb\t%12-15r, %s"},
00376 {ARM_EXT_V1, 0x00100090, 0x0e100090, "ldr%c%6's%5?hb\t%12-15r, %s"},
00377 {ARM_EXT_V1, 0x00000000, 0x0de00000, "and%c%20's\t%12-15r, %16-19r, %o"},
00378 {ARM_EXT_V1, 0x00200000, 0x0de00000, "eor%c%20's\t%12-15r, %16-19r, %o"},
00379 {ARM_EXT_V1, 0x00400000, 0x0de00000, "sub%c%20's\t%12-15r, %16-19r, %o"},
00380 {ARM_EXT_V1, 0x00600000, 0x0de00000, "rsb%c%20's\t%12-15r, %16-19r, %o"},
00381 {ARM_EXT_V1, 0x00800000, 0x0de00000, "add%c%20's\t%12-15r, %16-19r, %o"},
00382 {ARM_EXT_V1, 0x00a00000, 0x0de00000, "adc%c%20's\t%12-15r, %16-19r, %o"},
00383 {ARM_EXT_V1, 0x00c00000, 0x0de00000, "sbc%c%20's\t%12-15r, %16-19r, %o"},
00384 {ARM_EXT_V1, 0x00e00000, 0x0de00000, "rsc%c%20's\t%12-15r, %16-19r, %o"},
00385 {ARM_EXT_V3, 0x0120f000, 0x0db0f000, "msr%c\t%22?SCPSR%C, %o"},
00386 {ARM_EXT_V3, 0x010f0000, 0x0fbf0fff, "mrs%c\t%12-15r, %22?SCPSR"},
00387 {ARM_EXT_V1, 0x01000000, 0x0de00000, "tst%c%p\t%16-19r, %o"},
00388 {ARM_EXT_V1, 0x01200000, 0x0de00000, "teq%c%p\t%16-19r, %o"},
00389 {ARM_EXT_V1, 0x01400000, 0x0de00000, "cmp%c%p\t%16-19r, %o"},
00390 {ARM_EXT_V1, 0x01600000, 0x0de00000, "cmn%c%p\t%16-19r, %o"},
00391 {ARM_EXT_V1, 0x01800000, 0x0de00000, "orr%c%20's\t%12-15r, %16-19r, %o"},
00392 {ARM_EXT_V1, 0x01a00000, 0x0de00000, "mov%c%20's\t%12-15r, %o"},
00393 {ARM_EXT_V1, 0x01c00000, 0x0de00000, "bic%c%20's\t%12-15r, %16-19r, %o"},
00394 {ARM_EXT_V1, 0x01e00000, 0x0de00000, "mvn%c%20's\t%12-15r, %o"},
00395 {ARM_EXT_V1, 0x04000000, 0x0e100000, "str%c%22'b%t\t%12-15r, %a"},
00396 {ARM_EXT_V1, 0x06000000, 0x0e100ff0, "str%c%22'b%t\t%12-15r, %a"},
00397 {ARM_EXT_V1, 0x04000000, 0x0c100010, "str%c%22'b%t\t%12-15r, %a"},
00398 {ARM_EXT_V1, 0x06000010, 0x0e000010, "undefined"},
00399 {ARM_EXT_V1, 0x04100000, 0x0c100000, "ldr%c%22'b%t\t%12-15r, %a"},
00400 {ARM_EXT_V1, 0x08000000, 0x0e100000, "stm%c%23?id%24?ba\t%16-19r%21'!, %m%22'^"},
00401 {ARM_EXT_V1, 0x08100000, 0x0e100000, "ldm%c%23?id%24?ba\t%16-19r%21'!, %m%22'^"},
00402 {ARM_EXT_V1, 0x0a000000, 0x0e000000, "b%24'l%c\t%b"},
00403 {ARM_EXT_V1, 0x0f000000, 0x0f000000, "swi%c\t%0-23x"},
00404
00405
00406 {FPU_FPA_EXT_V1, 0x0e000100, 0x0ff08f10, "adf%c%P%R\t%12-14f, %16-18f, %0-3f"},
00407 {FPU_FPA_EXT_V1, 0x0e100100, 0x0ff08f10, "muf%c%P%R\t%12-14f, %16-18f, %0-3f"},
00408 {FPU_FPA_EXT_V1, 0x0e200100, 0x0ff08f10, "suf%c%P%R\t%12-14f, %16-18f, %0-3f"},
00409 {FPU_FPA_EXT_V1, 0x0e300100, 0x0ff08f10, "rsf%c%P%R\t%12-14f, %16-18f, %0-3f"},
00410 {FPU_FPA_EXT_V1, 0x0e400100, 0x0ff08f10, "dvf%c%P%R\t%12-14f, %16-18f, %0-3f"},
00411 {FPU_FPA_EXT_V1, 0x0e500100, 0x0ff08f10, "rdf%c%P%R\t%12-14f, %16-18f, %0-3f"},
00412 {FPU_FPA_EXT_V1, 0x0e600100, 0x0ff08f10, "pow%c%P%R\t%12-14f, %16-18f, %0-3f"},
00413 {FPU_FPA_EXT_V1, 0x0e700100, 0x0ff08f10, "rpw%c%P%R\t%12-14f, %16-18f, %0-3f"},
00414 {FPU_FPA_EXT_V1, 0x0e800100, 0x0ff08f10, "rmf%c%P%R\t%12-14f, %16-18f, %0-3f"},
00415 {FPU_FPA_EXT_V1, 0x0e900100, 0x0ff08f10, "fml%c%P%R\t%12-14f, %16-18f, %0-3f"},
00416 {FPU_FPA_EXT_V1, 0x0ea00100, 0x0ff08f10, "fdv%c%P%R\t%12-14f, %16-18f, %0-3f"},
00417 {FPU_FPA_EXT_V1, 0x0eb00100, 0x0ff08f10, "frd%c%P%R\t%12-14f, %16-18f, %0-3f"},
00418 {FPU_FPA_EXT_V1, 0x0ec00100, 0x0ff08f10, "pol%c%P%R\t%12-14f, %16-18f, %0-3f"},
00419 {FPU_FPA_EXT_V1, 0x0e008100, 0x0ff08f10, "mvf%c%P%R\t%12-14f, %0-3f"},
00420 {FPU_FPA_EXT_V1, 0x0e108100, 0x0ff08f10, "mnf%c%P%R\t%12-14f, %0-3f"},
00421 {FPU_FPA_EXT_V1, 0x0e208100, 0x0ff08f10, "abs%c%P%R\t%12-14f, %0-3f"},
00422 {FPU_FPA_EXT_V1, 0x0e308100, 0x0ff08f10, "rnd%c%P%R\t%12-14f, %0-3f"},
00423 {FPU_FPA_EXT_V1, 0x0e408100, 0x0ff08f10, "sqt%c%P%R\t%12-14f, %0-3f"},
00424 {FPU_FPA_EXT_V1, 0x0e508100, 0x0ff08f10, "log%c%P%R\t%12-14f, %0-3f"},
00425 {FPU_FPA_EXT_V1, 0x0e608100, 0x0ff08f10, "lgn%c%P%R\t%12-14f, %0-3f"},
00426 {FPU_FPA_EXT_V1, 0x0e708100, 0x0ff08f10, "exp%c%P%R\t%12-14f, %0-3f"},
00427 {FPU_FPA_EXT_V1, 0x0e808100, 0x0ff08f10, "sin%c%P%R\t%12-14f, %0-3f"},
00428 {FPU_FPA_EXT_V1, 0x0e908100, 0x0ff08f10, "cos%c%P%R\t%12-14f, %0-3f"},
00429 {FPU_FPA_EXT_V1, 0x0ea08100, 0x0ff08f10, "tan%c%P%R\t%12-14f, %0-3f"},
00430 {FPU_FPA_EXT_V1, 0x0eb08100, 0x0ff08f10, "asn%c%P%R\t%12-14f, %0-3f"},
00431 {FPU_FPA_EXT_V1, 0x0ec08100, 0x0ff08f10, "acs%c%P%R\t%12-14f, %0-3f"},
00432 {FPU_FPA_EXT_V1, 0x0ed08100, 0x0ff08f10, "atn%c%P%R\t%12-14f, %0-3f"},
00433 {FPU_FPA_EXT_V1, 0x0ee08100, 0x0ff08f10, "urd%c%P%R\t%12-14f, %0-3f"},
00434 {FPU_FPA_EXT_V1, 0x0ef08100, 0x0ff08f10, "nrm%c%P%R\t%12-14f, %0-3f"},
00435 {FPU_FPA_EXT_V1, 0x0e000110, 0x0ff00f1f, "flt%c%P%R\t%16-18f, %12-15r"},
00436 {FPU_FPA_EXT_V1, 0x0e100110, 0x0fff0f98, "fix%c%R\t%12-15r, %0-2f"},
00437 {FPU_FPA_EXT_V1, 0x0e200110, 0x0fff0fff, "wfs%c\t%12-15r"},
00438 {FPU_FPA_EXT_V1, 0x0e300110, 0x0fff0fff, "rfs%c\t%12-15r"},
00439 {FPU_FPA_EXT_V1, 0x0e400110, 0x0fff0fff, "wfc%c\t%12-15r"},
00440 {FPU_FPA_EXT_V1, 0x0e500110, 0x0fff0fff, "rfc%c\t%12-15r"},
00441 {FPU_FPA_EXT_V1, 0x0e90f110, 0x0ff8fff0, "cmf%c\t%16-18f, %0-3f"},
00442 {FPU_FPA_EXT_V1, 0x0eb0f110, 0x0ff8fff0, "cnf%c\t%16-18f, %0-3f"},
00443 {FPU_FPA_EXT_V1, 0x0ed0f110, 0x0ff8fff0, "cmfe%c\t%16-18f, %0-3f"},
00444 {FPU_FPA_EXT_V1, 0x0ef0f110, 0x0ff8fff0, "cnfe%c\t%16-18f, %0-3f"},
00445 {FPU_FPA_EXT_V1, 0x0c000100, 0x0e100f00, "stf%c%Q\t%12-14f, %A"},
00446 {FPU_FPA_EXT_V1, 0x0c100100, 0x0e100f00, "ldf%c%Q\t%12-14f, %A"},
00447 {FPU_FPA_EXT_V2, 0x0c000200, 0x0e100f00, "sfm%c\t%12-14f, %F, %A"},
00448 {FPU_FPA_EXT_V2, 0x0c100200, 0x0e100f00, "lfm%c\t%12-14f, %F, %A"},
00449
00450
00451 {FPU_VFP_EXT_V1, 0x0eb00bc0, 0x0fff0ff0, "fabsd%c\t%1z, %0z"},
00452 {FPU_VFP_EXT_V1xD, 0x0eb00ac0, 0x0fbf0fd0, "fabss%c\t%1y, %0y"},
00453 {FPU_VFP_EXT_V1, 0x0e300b00, 0x0ff00ff0, "faddd%c\t%1z, %2z, %0z"},
00454 {FPU_VFP_EXT_V1xD, 0x0e300a00, 0x0fb00f50, "fadds%c\t%1y, %2y, %1y"},
00455 {FPU_VFP_EXT_V1, 0x0eb40b40, 0x0fff0f70, "fcmp%7'ed%c\t%1z, %0z"},
00456 {FPU_VFP_EXT_V1xD, 0x0eb40a40, 0x0fbf0f50, "fcmp%7'es%c\t%1y, %0y"},
00457 {FPU_VFP_EXT_V1, 0x0eb50b40, 0x0fff0f70, "fcmp%7'ezd%c\t%1z"},
00458 {FPU_VFP_EXT_V1xD, 0x0eb50a40, 0x0fbf0f70, "fcmp%7'ezs%c\t%1y"},
00459 {FPU_VFP_EXT_V1, 0x0eb00b40, 0x0fff0ff0, "fcpyd%c\t%1z, %0z"},
00460 {FPU_VFP_EXT_V1xD, 0x0eb00a40, 0x0fbf0fd0, "fcpys%c\t%1y, %0y"},
00461 {FPU_VFP_EXT_V1, 0x0eb70ac0, 0x0fff0fd0, "fcvtds%c\t%1z, %0y"},
00462 {FPU_VFP_EXT_V1, 0x0eb70bc0, 0x0fbf0ff0, "fcvtsd%c\t%1y, %0z"},
00463 {FPU_VFP_EXT_V1, 0x0e800b00, 0x0ff00ff0, "fdivd%c\t%1z, %2z, %0z"},
00464 {FPU_VFP_EXT_V1xD, 0x0e800a00, 0x0fb00f50, "fdivs%c\t%1y, %2y, %0y"},
00465 {FPU_VFP_EXT_V1, 0x0d100b00, 0x0f700f00, "fldd%c\t%1z, %A"},
00466 {FPU_VFP_EXT_V1xD, 0x0c900b00, 0x0fd00f00, "fldmia%0?xd%c\t%16-19r%21'!, %3z"},
00467 {FPU_VFP_EXT_V1xD, 0x0d300b00, 0x0ff00f00, "fldmdb%0?xd%c\t%16-19r!, %3z"},
00468 {FPU_VFP_EXT_V1xD, 0x0d100a00, 0x0f300f00, "flds%c\t%1y, %A"},
00469 {FPU_VFP_EXT_V1xD, 0x0c900a00, 0x0f900f00, "fldmias%c\t%16-19r%21'!, %3y"},
00470 {FPU_VFP_EXT_V1xD, 0x0d300a00, 0x0fb00f00, "fldmdbs%c\t%16-19r!, %3y"},
00471 {FPU_VFP_EXT_V1, 0x0e000b00, 0x0ff00ff0, "fmacd%c\t%1z, %2z, %0z"},
00472 {FPU_VFP_EXT_V1xD, 0x0e000a00, 0x0fb00f50, "fmacs%c\t%1y, %2y, %0y"},
00473 {FPU_VFP_EXT_V1, 0x0e200b10, 0x0ff00fff, "fmdhr%c\t%2z, %12-15r"},
00474 {FPU_VFP_EXT_V1, 0x0e000b10, 0x0ff00fff, "fmdlr%c\t%2z, %12-15r"},
00475 {FPU_VFP_EXT_V2, 0x0c400b10, 0x0ff00ff0, "fmdrr%c\t%0z, %12-15r, %16-19r"},
00476 {FPU_VFP_EXT_V1, 0x0e300b10, 0x0ff00fff, "fmrdh%c\t%12-15r, %2z"},
00477 {FPU_VFP_EXT_V1, 0x0e100b10, 0x0ff00fff, "fmrdl%c\t%12-15r, %2z"},
00478 {FPU_VFP_EXT_V1, 0x0c500b10, 0x0ff00ff0, "fmrrd%c\t%12-15r, %16-19r, %0z"},
00479 {FPU_VFP_EXT_V2, 0x0c500a10, 0x0ff00fd0, "fmrrs%c\t%12-15r, %16-19r, %4y"},
00480 {FPU_VFP_EXT_V1xD, 0x0e100a10, 0x0ff00f7f, "fmrs%c\t%12-15r, %2y"},
00481 {FPU_VFP_EXT_V1xD, 0x0ef1fa10, 0x0fffffff, "fmstat%c"},
00482 {FPU_VFP_EXT_V1xD, 0x0ef00a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpsid"},
00483 {FPU_VFP_EXT_V1xD, 0x0ef10a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpscr"},
00484 {FPU_VFP_EXT_V1xD, 0x0ef80a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpexc"},
00485 {FPU_VFP_EXT_V1xD, 0x0ef90a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpinst\t@ Impl def"},
00486 {FPU_VFP_EXT_V1xD, 0x0efa0a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpinst2\t@ Impl def"},
00487 {FPU_VFP_EXT_V1xD, 0x0ef00a10, 0x0ff00fff, "fmrx%c\t%12-15r, <impl def 0x%16-19x>"},
00488 {FPU_VFP_EXT_V1, 0x0e100b00, 0x0ff00ff0, "fmscd%c\t%1z, %2z, %0z"},
00489 {FPU_VFP_EXT_V1xD, 0x0e100a00, 0x0fb00f50, "fmscs%c\t%1y, %2y, %0y"},
00490 {FPU_VFP_EXT_V1xD, 0x0e000a10, 0x0ff00f7f, "fmsr%c\t%2y, %12-15r"},
00491 {FPU_VFP_EXT_V2, 0x0c400a10, 0x0ff00fd0, "fmsrr%c\t%12-15r, %16-19r, %4y"},
00492 {FPU_VFP_EXT_V1, 0x0e200b00, 0x0ff00ff0, "fmuld%c\t%1z, %2z, %0z"},
00493 {FPU_VFP_EXT_V1xD, 0x0e200a00, 0x0fb00f50, "fmuls%c\t%1y, %2y, %0y"},
00494 {FPU_VFP_EXT_V1xD, 0x0ee00a10, 0x0fff0fff, "fmxr%c\tfpsid, %12-15r"},
00495 {FPU_VFP_EXT_V1xD, 0x0ee10a10, 0x0fff0fff, "fmxr%c\tfpscr, %12-15r"},
00496 {FPU_VFP_EXT_V1xD, 0x0ee80a10, 0x0fff0fff, "fmxr%c\tfpexc, %12-15r"},
00497 {FPU_VFP_EXT_V1xD, 0x0ee90a10, 0x0fff0fff, "fmxr%c\tfpinst, %12-15r\t@ Impl def"},
00498 {FPU_VFP_EXT_V1xD, 0x0eea0a10, 0x0fff0fff, "fmxr%c\tfpinst2, %12-15r\t@ Impl def"},
00499 {FPU_VFP_EXT_V1xD, 0x0ee00a10, 0x0ff00fff, "fmxr%c\t<impl def 0x%16-19x>, %12-15r"},
00500 {FPU_VFP_EXT_V1, 0x0eb10b40, 0x0fff0ff0, "fnegd%c\t%1z, %0z"},
00501 {FPU_VFP_EXT_V1xD, 0x0eb10a40, 0x0fbf0fd0, "fnegs%c\t%1y, %0y"},
00502 {FPU_VFP_EXT_V1, 0x0e000b40, 0x0ff00ff0, "fnmacd%c\t%1z, %2z, %0z"},
00503 {FPU_VFP_EXT_V1xD, 0x0e000a40, 0x0fb00f50, "fnmacs%c\t%1y, %2y, %0y"},
00504 {FPU_VFP_EXT_V1, 0x0e100b40, 0x0ff00ff0, "fnmscd%c\t%1z, %2z, %0z"},
00505 {FPU_VFP_EXT_V1xD, 0x0e100a40, 0x0fb00f50, "fnmscs%c\t%1y, %2y, %0y"},
00506 {FPU_VFP_EXT_V1, 0x0e200b40, 0x0ff00ff0, "fnmuld%c\t%1z, %2z, %0z"},
00507 {FPU_VFP_EXT_V1xD, 0x0e200a40, 0x0fb00f50, "fnmuls%c\t%1y, %2y, %0y"},
00508 {FPU_VFP_EXT_V1, 0x0eb80bc0, 0x0fff0fd0, "fsitod%c\t%1z, %0y"},
00509 {FPU_VFP_EXT_V1xD, 0x0eb80ac0, 0x0fbf0fd0, "fsitos%c\t%1y, %0y"},
00510 {FPU_VFP_EXT_V1, 0x0eb10bc0, 0x0fff0ff0, "fsqrtd%c\t%1z, %0z"},
00511 {FPU_VFP_EXT_V1xD, 0x0eb10ac0, 0x0fbf0fd0, "fsqrts%c\t%1y, %0y"},
00512 {FPU_VFP_EXT_V1, 0x0d000b00, 0x0f700f00, "fstd%c\t%1z, %A"},
00513 {FPU_VFP_EXT_V1xD, 0x0c800b00, 0x0fd00f00, "fstmia%0?xd%c\t%16-19r%21'!, %3z"},
00514 {FPU_VFP_EXT_V1xD, 0x0d200b00, 0x0ff00f00, "fstmdb%0?xd%c\t%16-19r!, %3z"},
00515 {FPU_VFP_EXT_V1xD, 0x0d000a00, 0x0f300f00, "fsts%c\t%1y, %A"},
00516 {FPU_VFP_EXT_V1xD, 0x0c800a00, 0x0f900f00, "fstmias%c\t%16-19r%21'!, %3y"},
00517 {FPU_VFP_EXT_V1xD, 0x0d200a00, 0x0fb00f00, "fstmdbs%c\t%16-19r!, %3y"},
00518 {FPU_VFP_EXT_V1, 0x0e300b40, 0x0ff00ff0, "fsubd%c\t%1z, %2z, %0z"},
00519 {FPU_VFP_EXT_V1xD, 0x0e300a40, 0x0fb00f50, "fsubs%c\t%1y, %2y, %0y"},
00520 {FPU_VFP_EXT_V1, 0x0ebc0b40, 0x0fbe0f70, "fto%16?sui%7'zd%c\t%1y, %0z"},
00521 {FPU_VFP_EXT_V1xD, 0x0ebc0a40, 0x0fbe0f50, "fto%16?sui%7'zs%c\t%1y, %0y"},
00522 {FPU_VFP_EXT_V1, 0x0eb80b40, 0x0fff0fd0, "fuitod%c\t%1z, %0y"},
00523 {FPU_VFP_EXT_V1xD, 0x0eb80a40, 0x0fbf0fd0, "fuitos%c\t%1y, %0y"},
00524
00525
00526 {ARM_CEXT_MAVERICK, 0x0d100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
00527 {ARM_CEXT_MAVERICK, 0x0c100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
00528 {ARM_CEXT_MAVERICK, 0x0d500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
00529 {ARM_CEXT_MAVERICK, 0x0c500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
00530 {ARM_CEXT_MAVERICK, 0x0d100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
00531 {ARM_CEXT_MAVERICK, 0x0c100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
00532 {ARM_CEXT_MAVERICK, 0x0d500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
00533 {ARM_CEXT_MAVERICK, 0x0c500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
00534 {ARM_CEXT_MAVERICK, 0x0d000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
00535 {ARM_CEXT_MAVERICK, 0x0c000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
00536 {ARM_CEXT_MAVERICK, 0x0d400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
00537 {ARM_CEXT_MAVERICK, 0x0c400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
00538 {ARM_CEXT_MAVERICK, 0x0d000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
00539 {ARM_CEXT_MAVERICK, 0x0c000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
00540 {ARM_CEXT_MAVERICK, 0x0d400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
00541 {ARM_CEXT_MAVERICK, 0x0c400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
00542 {ARM_CEXT_MAVERICK, 0x0e000450, 0x0ff00ff0, "cfmvsr%c\tmvf%16-19d, %12-15r"},
00543 {ARM_CEXT_MAVERICK, 0x0e100450, 0x0ff00ff0, "cfmvrs%c\t%12-15r, mvf%16-19d"},
00544 {ARM_CEXT_MAVERICK, 0x0e000410, 0x0ff00ff0, "cfmvdlr%c\tmvd%16-19d, %12-15r"},
00545 {ARM_CEXT_MAVERICK, 0x0e100410, 0x0ff00ff0, "cfmvrdl%c\t%12-15r, mvd%16-19d"},
00546 {ARM_CEXT_MAVERICK, 0x0e000430, 0x0ff00ff0, "cfmvdhr%c\tmvd%16-19d, %12-15r"},
00547 {ARM_CEXT_MAVERICK, 0x0e100430, 0x0ff00fff, "cfmvrdh%c\t%12-15r, mvd%16-19d"},
00548 {ARM_CEXT_MAVERICK, 0x0e000510, 0x0ff00fff, "cfmv64lr%c\tmvdx%16-19d, %12-15r"},
00549 {ARM_CEXT_MAVERICK, 0x0e100510, 0x0ff00fff, "cfmvr64l%c\t%12-15r, mvdx%16-19d"},
00550 {ARM_CEXT_MAVERICK, 0x0e000530, 0x0ff00fff, "cfmv64hr%c\tmvdx%16-19d, %12-15r"},
00551 {ARM_CEXT_MAVERICK, 0x0e100530, 0x0ff00fff, "cfmvr64h%c\t%12-15r, mvdx%16-19d"},
00552 {ARM_CEXT_MAVERICK, 0x0e200440, 0x0ff00fff, "cfmval32%c\tmvax%12-15d, mvfx%16-19d"},
00553 {ARM_CEXT_MAVERICK, 0x0e100440, 0x0ff00fff, "cfmv32al%c\tmvfx%12-15d, mvax%16-19d"},
00554 {ARM_CEXT_MAVERICK, 0x0e200460, 0x0ff00fff, "cfmvam32%c\tmvax%12-15d, mvfx%16-19d"},
00555 {ARM_CEXT_MAVERICK, 0x0e100460, 0x0ff00fff, "cfmv32am%c\tmvfx%12-15d, mvax%16-19d"},
00556 {ARM_CEXT_MAVERICK, 0x0e200480, 0x0ff00fff, "cfmvah32%c\tmvax%12-15d, mvfx%16-19d"},
00557 {ARM_CEXT_MAVERICK, 0x0e100480, 0x0ff00fff, "cfmv32ah%c\tmvfx%12-15d, mvax%16-19d"},
00558 {ARM_CEXT_MAVERICK, 0x0e2004a0, 0x0ff00fff, "cfmva32%c\tmvax%12-15d, mvfx%16-19d"},
00559 {ARM_CEXT_MAVERICK, 0x0e1004a0, 0x0ff00fff, "cfmv32a%c\tmvfx%12-15d, mvax%16-19d"},
00560 {ARM_CEXT_MAVERICK, 0x0e2004c0, 0x0ff00fff, "cfmva64%c\tmvax%12-15d, mvdx%16-19d"},
00561 {ARM_CEXT_MAVERICK, 0x0e1004c0, 0x0ff00fff, "cfmv64a%c\tmvdx%12-15d, mvax%16-19d"},
00562 {ARM_CEXT_MAVERICK, 0x0e2004e0, 0x0fff0fff, "cfmvsc32%c\tdspsc, mvdx%12-15d"},
00563 {ARM_CEXT_MAVERICK, 0x0e1004e0, 0x0fff0fff, "cfmv32sc%c\tmvdx%12-15d, dspsc"},
00564 {ARM_CEXT_MAVERICK, 0x0e000400, 0x0ff00fff, "cfcpys%c\tmvf%12-15d, mvf%16-19d"},
00565 {ARM_CEXT_MAVERICK, 0x0e000420, 0x0ff00fff, "cfcpyd%c\tmvd%12-15d, mvd%16-19d"},
00566 {ARM_CEXT_MAVERICK, 0x0e000460, 0x0ff00fff, "cfcvtsd%c\tmvd%12-15d, mvf%16-19d"},
00567 {ARM_CEXT_MAVERICK, 0x0e000440, 0x0ff00fff, "cfcvtds%c\tmvf%12-15d, mvd%16-19d"},
00568 {ARM_CEXT_MAVERICK, 0x0e000480, 0x0ff00fff, "cfcvt32s%c\tmvf%12-15d, mvfx%16-19d"},
00569 {ARM_CEXT_MAVERICK, 0x0e0004a0, 0x0ff00fff, "cfcvt32d%c\tmvd%12-15d, mvfx%16-19d"},
00570 {ARM_CEXT_MAVERICK, 0x0e0004c0, 0x0ff00fff, "cfcvt64s%c\tmvf%12-15d, mvdx%16-19d"},
00571 {ARM_CEXT_MAVERICK, 0x0e0004e0, 0x0ff00fff, "cfcvt64d%c\tmvd%12-15d, mvdx%16-19d"},
00572 {ARM_CEXT_MAVERICK, 0x0e100580, 0x0ff00fff, "cfcvts32%c\tmvfx%12-15d, mvf%16-19d"},
00573 {ARM_CEXT_MAVERICK, 0x0e1005a0, 0x0ff00fff, "cfcvtd32%c\tmvfx%12-15d, mvd%16-19d"},
00574 {ARM_CEXT_MAVERICK, 0x0e1005c0, 0x0ff00fff, "cftruncs32%c\tmvfx%12-15d, mvf%16-19d"},
00575 {ARM_CEXT_MAVERICK, 0x0e1005e0, 0x0ff00fff, "cftruncd32%c\tmvfx%12-15d, mvd%16-19d"},
00576 {ARM_CEXT_MAVERICK, 0x0e000550, 0x0ff00ff0, "cfrshl32%c\tmvfx%16-19d, mvfx%0-3d, %12-15r"},
00577 {ARM_CEXT_MAVERICK, 0x0e000570, 0x0ff00ff0, "cfrshl64%c\tmvdx%16-19d, mvdx%0-3d, %12-15r"},
00578 {ARM_CEXT_MAVERICK, 0x0e000500, 0x0ff00f00, "cfsh32%c\tmvfx%12-15d, mvfx%16-19d, #%I"},
00579 {ARM_CEXT_MAVERICK, 0x0e200500, 0x0ff00f00, "cfsh64%c\tmvdx%12-15d, mvdx%16-19d, #%I"},
00580 {ARM_CEXT_MAVERICK, 0x0e100490, 0x0ff00ff0, "cfcmps%c\t%12-15r, mvf%16-19d, mvf%0-3d"},
00581 {ARM_CEXT_MAVERICK, 0x0e1004b0, 0x0ff00ff0, "cfcmpd%c\t%12-15r, mvd%16-19d, mvd%0-3d"},
00582 {ARM_CEXT_MAVERICK, 0x0e100590, 0x0ff00ff0, "cfcmp32%c\t%12-15r, mvfx%16-19d, mvfx%0-3d"},
00583 {ARM_CEXT_MAVERICK, 0x0e1005b0, 0x0ff00ff0, "cfcmp64%c\t%12-15r, mvdx%16-19d, mvdx%0-3d"},
00584 {ARM_CEXT_MAVERICK, 0x0e300400, 0x0ff00fff, "cfabss%c\tmvf%12-15d, mvf%16-19d"},
00585 {ARM_CEXT_MAVERICK, 0x0e300420, 0x0ff00fff, "cfabsd%c\tmvd%12-15d, mvd%16-19d"},
00586 {ARM_CEXT_MAVERICK, 0x0e300440, 0x0ff00fff, "cfnegs%c\tmvf%12-15d, mvf%16-19d"},
00587 {ARM_CEXT_MAVERICK, 0x0e300460, 0x0ff00fff, "cfnegd%c\tmvd%12-15d, mvd%16-19d"},
00588 {ARM_CEXT_MAVERICK, 0x0e300480, 0x0ff00ff0, "cfadds%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
00589 {ARM_CEXT_MAVERICK, 0x0e3004a0, 0x0ff00ff0, "cfaddd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
00590 {ARM_CEXT_MAVERICK, 0x0e3004c0, 0x0ff00ff0, "cfsubs%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
00591 {ARM_CEXT_MAVERICK, 0x0e3004e0, 0x0ff00ff0, "cfsubd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
00592 {ARM_CEXT_MAVERICK, 0x0e100400, 0x0ff00ff0, "cfmuls%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
00593 {ARM_CEXT_MAVERICK, 0x0e100420, 0x0ff00ff0, "cfmuld%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
00594 {ARM_CEXT_MAVERICK, 0x0e300500, 0x0ff00fff, "cfabs32%c\tmvfx%12-15d, mvfx%16-19d"},
00595 {ARM_CEXT_MAVERICK, 0x0e300520, 0x0ff00fff, "cfabs64%c\tmvdx%12-15d, mvdx%16-19d"},
00596 {ARM_CEXT_MAVERICK, 0x0e300540, 0x0ff00fff, "cfneg32%c\tmvfx%12-15d, mvfx%16-19d"},
00597 {ARM_CEXT_MAVERICK, 0x0e300560, 0x0ff00fff, "cfneg64%c\tmvdx%12-15d, mvdx%16-19d"},
00598 {ARM_CEXT_MAVERICK, 0x0e300580, 0x0ff00ff0, "cfadd32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
00599 {ARM_CEXT_MAVERICK, 0x0e3005a0, 0x0ff00ff0, "cfadd64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
00600 {ARM_CEXT_MAVERICK, 0x0e3005c0, 0x0ff00ff0, "cfsub32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
00601 {ARM_CEXT_MAVERICK, 0x0e3005e0, 0x0ff00ff0, "cfsub64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
00602 {ARM_CEXT_MAVERICK, 0x0e100500, 0x0ff00ff0, "cfmul32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
00603 {ARM_CEXT_MAVERICK, 0x0e100520, 0x0ff00ff0, "cfmul64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
00604 {ARM_CEXT_MAVERICK, 0x0e100540, 0x0ff00ff0, "cfmac32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
00605 {ARM_CEXT_MAVERICK, 0x0e100560, 0x0ff00ff0, "cfmsc32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
00606 {ARM_CEXT_MAVERICK, 0x0e000600, 0x0ff00f00, "cfmadd32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
00607 {ARM_CEXT_MAVERICK, 0x0e100600, 0x0ff00f00, "cfmsub32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
00608 {ARM_CEXT_MAVERICK, 0x0e200600, 0x0ff00f00, "cfmadda32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
00609 {ARM_CEXT_MAVERICK, 0x0e300600, 0x0ff00f00, "cfmsuba32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
00610
00611
00612 {ARM_EXT_V2, 0x0c400000, 0x0ff00000, "mcrr%c\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
00613 {ARM_EXT_V2, 0x0c500000, 0x0ff00000, "mrrc%c\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
00614 {ARM_EXT_V2, 0x0e000000, 0x0f000010, "cdp%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
00615 {ARM_EXT_V2, 0x0e100010, 0x0f100010, "mrc%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
00616 {ARM_EXT_V2, 0x0e000010, 0x0f100010, "mcr%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
00617 {ARM_EXT_V2, 0x0c000000, 0x0e100000, "stc%c%22'l\t%8-11d, cr%12-15d, %A"},
00618 {ARM_EXT_V2, 0x0c100000, 0x0e100000, "ldc%c%22'l\t%8-11d, cr%12-15d, %A"},
00619
00620
00621 {ARM_EXT_V1, 0x00000000, 0x00000000, "undefined instruction %0-31x"},
00622 {0, 0x00000000, 0x00000000, 0}
00623 };
00624
00625 static const struct thumb_opcode thumb_opcodes[] =
00626 {
00627
00628
00629
00630 {ARM_EXT_V6, 0xb660, 0xfff8, "cpsie\t%2'a%1'i%0'f"},
00631 {ARM_EXT_V6, 0xb670, 0xfff8, "cpsid\t%2'a%1'i%0'f"},
00632 {ARM_EXT_V6, 0x4600, 0xffc0, "cpy\t%0-2r, %3-5r"},
00633 {ARM_EXT_V6, 0xba00, 0xffc0, "rev\t%0-2r, %3-5r"},
00634 {ARM_EXT_V6, 0xba40, 0xffc0, "rev16\t%0-2r, %3-5r"},
00635 {ARM_EXT_V6, 0xbac0, 0xffc0, "revsh\t%0-2r, %3-5r"},
00636 {ARM_EXT_V6, 0xb650, 0xfff7, "setend\t%3?ble"},
00637 {ARM_EXT_V6, 0xb200, 0xffc0, "sxth\t%0-2r, %3-5r"},
00638 {ARM_EXT_V6, 0xb240, 0xffc0, "sxtb\t%0-2r, %3-5r"},
00639 {ARM_EXT_V6, 0xb280, 0xffc0, "uxth\t%0-2r, %3-5r"},
00640 {ARM_EXT_V6, 0xb2c0, 0xffc0, "uxtb\t%0-2r, %3-5r"},
00641
00642
00643 {ARM_EXT_V5T, 0xbe00, 0xff00, "bkpt\t%0-7x"},
00644
00645
00646
00647
00648
00649
00650 {ARM_EXT_V5T, 0x4780, 0xff87, "blx\t%3-6r"},
00651
00652 {ARM_EXT_V4T, 0x46C0, 0xFFFF, "nop\t\t\t(mov r8, r8)"},
00653
00654 {ARM_EXT_V4T, 0x1C00, 0xFFC0, "mov\t%0-2r, %3-5r\t\t(add %0-2r, %3-5r, #%6-8d)"},
00655
00656 {ARM_EXT_V4T, 0x4000, 0xFFC0, "and\t%0-2r, %3-5r"},
00657 {ARM_EXT_V4T, 0x4040, 0xFFC0, "eor\t%0-2r, %3-5r"},
00658 {ARM_EXT_V4T, 0x4080, 0xFFC0, "lsl\t%0-2r, %3-5r"},
00659 {ARM_EXT_V4T, 0x40C0, 0xFFC0, "lsr\t%0-2r, %3-5r"},
00660 {ARM_EXT_V4T, 0x4100, 0xFFC0, "asr\t%0-2r, %3-5r"},
00661 {ARM_EXT_V4T, 0x4140, 0xFFC0, "adc\t%0-2r, %3-5r"},
00662 {ARM_EXT_V4T, 0x4180, 0xFFC0, "sbc\t%0-2r, %3-5r"},
00663 {ARM_EXT_V4T, 0x41C0, 0xFFC0, "ror\t%0-2r, %3-5r"},
00664 {ARM_EXT_V4T, 0x4200, 0xFFC0, "tst\t%0-2r, %3-5r"},
00665 {ARM_EXT_V4T, 0x4240, 0xFFC0, "neg\t%0-2r, %3-5r"},
00666 {ARM_EXT_V4T, 0x4280, 0xFFC0, "cmp\t%0-2r, %3-5r"},
00667 {ARM_EXT_V4T, 0x42C0, 0xFFC0, "cmn\t%0-2r, %3-5r"},
00668 {ARM_EXT_V4T, 0x4300, 0xFFC0, "orr\t%0-2r, %3-5r"},
00669 {ARM_EXT_V4T, 0x4340, 0xFFC0, "mul\t%0-2r, %3-5r"},
00670 {ARM_EXT_V4T, 0x4380, 0xFFC0, "bic\t%0-2r, %3-5r"},
00671 {ARM_EXT_V4T, 0x43C0, 0xFFC0, "mvn\t%0-2r, %3-5r"},
00672
00673 {ARM_EXT_V4T, 0xB000, 0xFF80, "add\tsp, #%0-6W"},
00674 {ARM_EXT_V4T, 0xB080, 0xFF80, "sub\tsp, #%0-6W"},
00675
00676 {ARM_EXT_V4T, 0x4700, 0xFF80, "bx\t%S"},
00677 {ARM_EXT_V4T, 0x4400, 0xFF00, "add\t%D, %S"},
00678 {ARM_EXT_V4T, 0x4500, 0xFF00, "cmp\t%D, %S"},
00679 {ARM_EXT_V4T, 0x4600, 0xFF00, "mov\t%D, %S"},
00680
00681 {ARM_EXT_V4T, 0xB400, 0xFE00, "push\t%N"},
00682 {ARM_EXT_V4T, 0xBC00, 0xFE00, "pop\t%O"},
00683
00684 {ARM_EXT_V4T, 0x1800, 0xFE00, "add\t%0-2r, %3-5r, %6-8r"},
00685 {ARM_EXT_V4T, 0x1A00, 0xFE00, "sub\t%0-2r, %3-5r, %6-8r"},
00686 {ARM_EXT_V4T, 0x1C00, 0xFE00, "add\t%0-2r, %3-5r, #%6-8d"},
00687 {ARM_EXT_V4T, 0x1E00, 0xFE00, "sub\t%0-2r, %3-5r, #%6-8d"},
00688
00689 {ARM_EXT_V4T, 0x5200, 0xFE00, "strh\t%0-2r, [%3-5r, %6-8r]"},
00690 {ARM_EXT_V4T, 0x5A00, 0xFE00, "ldrh\t%0-2r, [%3-5r, %6-8r]"},
00691 {ARM_EXT_V4T, 0x5600, 0xF600, "ldrs%11?hb\t%0-2r, [%3-5r, %6-8r]"},
00692
00693 {ARM_EXT_V4T, 0x5000, 0xFA00, "str%10'b\t%0-2r, [%3-5r, %6-8r]"},
00694 {ARM_EXT_V4T, 0x5800, 0xFA00, "ldr%10'b\t%0-2r, [%3-5r, %6-8r]"},
00695
00696 {ARM_EXT_V4T, 0x0000, 0xF800, "lsl\t%0-2r, %3-5r, #%6-10d"},
00697 {ARM_EXT_V4T, 0x0800, 0xF800, "lsr\t%0-2r, %3-5r, #%6-10d"},
00698 {ARM_EXT_V4T, 0x1000, 0xF800, "asr\t%0-2r, %3-5r, #%6-10d"},
00699
00700 {ARM_EXT_V4T, 0x2000, 0xF800, "mov\t%8-10r, #%0-7d"},
00701 {ARM_EXT_V4T, 0x2800, 0xF800, "cmp\t%8-10r, #%0-7d"},
00702 {ARM_EXT_V4T, 0x3000, 0xF800, "add\t%8-10r, #%0-7d"},
00703 {ARM_EXT_V4T, 0x3800, 0xF800, "sub\t%8-10r, #%0-7d"},
00704
00705 {ARM_EXT_V4T, 0x4800, 0xF800, "ldr\t%8-10r, [pc, #%0-7W]\t(%0-7a)"},
00706
00707 {ARM_EXT_V4T, 0x6000, 0xF800, "str\t%0-2r, [%3-5r, #%6-10W]"},
00708 {ARM_EXT_V4T, 0x6800, 0xF800, "ldr\t%0-2r, [%3-5r, #%6-10W]"},
00709 {ARM_EXT_V4T, 0x7000, 0xF800, "strb\t%0-2r, [%3-5r, #%6-10d]"},
00710 {ARM_EXT_V4T, 0x7800, 0xF800, "ldrb\t%0-2r, [%3-5r, #%6-10d]"},
00711
00712 {ARM_EXT_V4T, 0x8000, 0xF800, "strh\t%0-2r, [%3-5r, #%6-10H]"},
00713 {ARM_EXT_V4T, 0x8800, 0xF800, "ldrh\t%0-2r, [%3-5r, #%6-10H]"},
00714
00715 {ARM_EXT_V4T, 0x9000, 0xF800, "str\t%8-10r, [sp, #%0-7W]"},
00716 {ARM_EXT_V4T, 0x9800, 0xF800, "ldr\t%8-10r, [sp, #%0-7W]"},
00717
00718 {ARM_EXT_V4T, 0xA000, 0xF800, "add\t%8-10r, pc, #%0-7W\t(adr %8-10r,%0-7a)"},
00719 {ARM_EXT_V4T, 0xA800, 0xF800, "add\t%8-10r, sp, #%0-7W"},
00720
00721 {ARM_EXT_V4T, 0xC000, 0xF800, "stmia\t%8-10r!,%M"},
00722 {ARM_EXT_V4T, 0xC800, 0xF800, "ldmia\t%8-10r!,%M"},
00723
00724 {ARM_EXT_V4T, 0xE000, 0xF800, "b\t%0-10B"},
00725 {ARM_EXT_V4T, 0xE800, 0xF800, "undefined"},
00726
00727 {ARM_EXT_V4T, 0xF000, 0xF800, ""},
00728 {ARM_EXT_V4T, 0xF800, 0xF800, "second half of BL instruction %0-15x"},
00729
00730 {ARM_EXT_V4T, 0xD000, 0xFF00, "beq\t%0-7B"},
00731 {ARM_EXT_V4T, 0xD100, 0xFF00, "bne\t%0-7B"},
00732 {ARM_EXT_V4T, 0xD200, 0xFF00, "bcs\t%0-7B"},
00733 {ARM_EXT_V4T, 0xD300, 0xFF00, "bcc\t%0-7B"},
00734 {ARM_EXT_V4T, 0xD400, 0xFF00, "bmi\t%0-7B"},
00735 {ARM_EXT_V4T, 0xD500, 0xFF00, "bpl\t%0-7B"},
00736 {ARM_EXT_V4T, 0xD600, 0xFF00, "bvs\t%0-7B"},
00737 {ARM_EXT_V4T, 0xD700, 0xFF00, "bvc\t%0-7B"},
00738 {ARM_EXT_V4T, 0xD800, 0xFF00, "bhi\t%0-7B"},
00739 {ARM_EXT_V4T, 0xD900, 0xFF00, "bls\t%0-7B"},
00740 {ARM_EXT_V4T, 0xDA00, 0xFF00, "bge\t%0-7B"},
00741 {ARM_EXT_V4T, 0xDB00, 0xFF00, "blt\t%0-7B"},
00742 {ARM_EXT_V4T, 0xDC00, 0xFF00, "bgt\t%0-7B"},
00743 {ARM_EXT_V4T, 0xDD00, 0xFF00, "ble\t%0-7B"},
00744
00745 {ARM_EXT_V4T, 0xDE00, 0xFF00, "bal\t%0-7B"},
00746 {ARM_EXT_V4T, 0xDF00, 0xFF00, "swi\t%0-7d"},
00747
00748 {ARM_EXT_V4T, 0x6000, 0xF800, "str\t%0-2r, [%3-5r, #%6-10W]"},
00749 {ARM_EXT_V4T, 0x6800, 0xF800, "ldr\t%0-2r, [%3-5r, #%6-10W]"},
00750 {ARM_EXT_V4T, 0x7000, 0xF800, "strb\t%0-2r, [%3-5r, #%6-10d]"},
00751 {ARM_EXT_V4T, 0x7800, 0xF800, "ldrb\t%0-2r, [%3-5r, #%6-10d]"},
00752
00753 {ARM_EXT_V1, 0x0000, 0x0000, "undefined instruction %0-15x"},
00754 {0, 0x0000, 0x0000, 0}
00755 };
00756
00757 static char * arm_conditional[] =
00758 {"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc",
00759 "hi", "ls", "ge", "lt", "gt", "le", "", "nv"};
00760
00761 typedef struct
00762 {
00763 const char * name;
00764 const char * description;
00765 const char * reg_names[16];
00766 }
00767 arm_regname;
00768
00769 static arm_regname regnames[] =
00770 {
00771 { "raw" , "Select raw register names",
00772 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}},
00773 { "gcc", "Select register names used by GCC",
00774 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "sl", "fp", "ip", "sp", "lr", "pc" }},
00775 { "std", "Select register names used in ARM's ISA documentation",
00776 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc" }},
00777 { "apcs", "Select register names used in the APCS",
00778 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "sl", "fp", "ip", "sp", "lr", "pc" }},
00779 { "atpcs", "Select register names used in the ATPCS",
00780 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "IP", "SP", "LR", "PC" }},
00781 { "special-atpcs", "Select special register names used in the ATPCS",
00782 { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL", "FP", "IP", "SP", "LR", "PC" }},
00783 { "iwmmxt_regnames", "Select register names used on the Intel Wireless MMX technology coprocessor",
00784 { "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7", "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15"}},
00785 { "iwmmxt_Cregnames", "Select control register names used on the Intel Wireless MMX technology coprocessor",
00786 {"wcid", "wcon", "wcssf", "wcasf", "reserved", "reserved", "reserved", "reserved", "wcgr0", "wcgr1", "wcgr2", "wcgr3", "reserved", "reserved", "reserved", "reserved"}}
00787 };
00788
00789 static char * iwmmxt_wwnames[] =
00790 {"b", "h", "w", "d"};
00791
00792 static char * iwmmxt_wwssnames[] =
00793 {"b", "bus", "b", "bss",
00794 "h", "hus", "h", "hss",
00795 "w", "wus", "w", "wss",
00796 "d", "dus", "d", "dss"
00797 };
00798
00799
00800 static unsigned int regname_selected = 1;
00801
00802 #define NUM_ARM_REGNAMES NUM_ELEM (regnames)
00803 #define arm_regnames regnames[regname_selected].reg_names
00804
00805 static bfd_boolean force_thumb = FALSE;
00806
00807 static char * arm_fp_const[] =
00808 {"0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0"};
00809
00810 static char * arm_shift[] =
00811 {"lsl", "lsr", "asr", "ror"};
00812
00813
00814 static void arm_decode_shift
00815 PARAMS ((long, fprintf_ftype, void *));
00816 static int print_insn_arm
00817 PARAMS ((bfd_vma, struct disassemble_info *, long));
00818 static int print_insn_thumb
00819 PARAMS ((bfd_vma, struct disassemble_info *, long));
00820 static void parse_disassembler_options
00821 PARAMS ((char *));
00822 static int print_insn
00823 PARAMS ((bfd_vma, struct disassemble_info *, bfd_boolean));
00824 static int set_iwmmxt_regnames
00825 PARAMS ((void));
00826
00827 int get_arm_regname_num_options
00828 PARAMS ((void));
00829 int set_arm_regname_option
00830 PARAMS ((int));
00831 int get_arm_regnames
00832 PARAMS ((int, const char **, const char **, const char ***));
00833
00834
00835 int
00836 get_arm_regname_num_options ()
00837 {
00838 return NUM_ARM_REGNAMES;
00839 }
00840
00841 int
00842 set_arm_regname_option (option)
00843 int option;
00844 {
00845 int old = regname_selected;
00846 regname_selected = option;
00847 return old;
00848 }
00849
00850 int
00851 get_arm_regnames (option, setname, setdescription, register_names)
00852 int option;
00853 const char **setname;
00854 const char **setdescription;
00855 const char ***register_names;
00856 {
00857 *setname = regnames[option].name;
00858 *setdescription = regnames[option].description;
00859 *register_names = regnames[option].reg_names;
00860 return 16;
00861 }
00862
00863 static void
00864 arm_decode_shift (given, func, stream)
00865 long given;
00866 fprintf_ftype func;
00867 void * stream;
00868 {
00869 func (stream, "%s", arm_regnames[given & 0xf]);
00870
00871 if ((given & 0xff0) != 0)
00872 {
00873 if ((given & 0x10) == 0)
00874 {
00875 int amount = (given & 0xf80) >> 7;
00876 int shift = (given & 0x60) >> 5;
00877
00878 if (amount == 0)
00879 {
00880 if (shift == 3)
00881 {
00882 func (stream, ", rrx");
00883 return;
00884 }
00885
00886 amount = 32;
00887 }
00888
00889 func (stream, ", %s #%d", arm_shift[shift], amount);
00890 }
00891 else
00892 func (stream, ", %s %s", arm_shift[(given & 0x60) >> 5],
00893 arm_regnames[(given & 0xf00) >> 8]);
00894 }
00895 }
00896
00897 static int
00898 set_iwmmxt_regnames ()
00899 {
00900 const char * setname;
00901 const char * setdesc;
00902 const char ** regnames;
00903 int iwmmxt_regnames = 0;
00904 int num_regnames = get_arm_regname_num_options ();
00905
00906 get_arm_regnames (iwmmxt_regnames, &setname,
00907 &setdesc, ®names);
00908 while ((strcmp ("iwmmxt_regnames", setname))
00909 && (iwmmxt_regnames < num_regnames))
00910 get_arm_regnames (++iwmmxt_regnames, &setname, &setdesc, ®names);
00911
00912 return iwmmxt_regnames;
00913 }
00914
00915
00916
00917
00918 static int
00919 print_insn_arm (pc, info, given)
00920 bfd_vma pc;
00921 struct disassemble_info *info;
00922 long given;
00923 {
00924 const struct arm_opcode *insn;
00925 void *stream = info->stream;
00926 fprintf_ftype func = info->fprintf_func;
00927 static int iwmmxt_regnames = 0;
00928
00929 for (insn = arm_opcodes; insn->assembler; insn++)
00930 {
00931 if (insn->value == FIRST_IWMMXT_INSN
00932 && info->mach != bfd_mach_arm_XScale
00933 && info->mach != bfd_mach_arm_iWMMXt)
00934 insn = insn + IWMMXT_INSN_COUNT;
00935
00936 if ((given & insn->mask) == insn->value)
00937 {
00938 char * c;
00939
00940 for (c = insn->assembler; *c; c++)
00941 {
00942 if (*c == '%')
00943 {
00944 switch (*++c)
00945 {
00946 case '%':
00947 func (stream, "%%");
00948 break;
00949
00950 case 'a':
00951 if (((given & 0x000f0000) == 0x000f0000)
00952 && ((given & 0x02000000) == 0))
00953 {
00954 int offset = given & 0xfff;
00955
00956 func (stream, "[pc");
00957
00958 if (given & 0x01000000)
00959 {
00960 if ((given & 0x00800000) == 0)
00961 offset = - offset;
00962
00963
00964 func (stream, ", #%d]", offset);
00965
00966 offset += pc + 8;
00967
00968
00969
00970
00971
00972 if (given & 0x00200000)
00973 func (stream, "!");
00974 }
00975 else
00976 {
00977
00978 func (stream, "], #%d", offset);
00979
00980
00981 offset = pc + 8;
00982 }
00983
00984 func (stream, "\t; ");
00985 info->print_address_func (offset, info);
00986 }
00987 else
00988 {
00989 func (stream, "[%s",
00990 arm_regnames[(given >> 16) & 0xf]);
00991 if ((given & 0x01000000) != 0)
00992 {
00993 if ((given & 0x02000000) == 0)
00994 {
00995 int offset = given & 0xfff;
00996 if (offset)
00997 func (stream, ", #%s%d",
00998 (((given & 0x00800000) == 0)
00999 ? "-" : ""), offset);
01000 }
01001 else
01002 {
01003 func (stream, ", %s",
01004 (((given & 0x00800000) == 0)
01005 ? "-" : ""));
01006 arm_decode_shift (given, func, stream);
01007 }
01008
01009 func (stream, "]%s",
01010 ((given & 0x00200000) != 0) ? "!" : "");
01011 }
01012 else
01013 {
01014 if ((given & 0x02000000) == 0)
01015 {
01016 int offset = given & 0xfff;
01017 if (offset)
01018 func (stream, "], #%s%d",
01019 (((given & 0x00800000) == 0)
01020 ? "-" : ""), offset);
01021 else
01022 func (stream, "]");
01023 }
01024 else
01025 {
01026 func (stream, "], %s",
01027 (((given & 0x00800000) == 0)
01028 ? "-" : ""));
01029 arm_decode_shift (given, func, stream);
01030 }
01031 }
01032 }
01033 break;
01034
01035 case 's':
01036 if ((given & 0x004f0000) == 0x004f0000)
01037 {
01038
01039 int offset = ((given & 0xf00) >> 4) | (given & 0xf);
01040
01041 if ((given & 0x00800000) == 0)
01042 offset = -offset;
01043
01044 func (stream, "[pc, #%d]\t; ", offset);
01045
01046 (*info->print_address_func)
01047 (offset + pc + 8, info);
01048 }
01049 else
01050 {
01051 func (stream, "[%s",
01052 arm_regnames[(given >> 16) & 0xf]);
01053 if ((given & 0x01000000) != 0)
01054 {
01055
01056 if ((given & 0x00400000) == 0x00400000)
01057 {
01058
01059 int offset = ((given & 0xf00) >> 4) | (given & 0xf);
01060 if (offset)
01061 func (stream, ", #%s%d",
01062 (((given & 0x00800000) == 0)
01063 ? "-" : ""), offset);
01064 }
01065 else
01066 {
01067
01068 func (stream, ", %s%s",
01069 (((given & 0x00800000) == 0)
01070 ? "-" : ""),
01071 arm_regnames[given & 0xf]);
01072 }
01073
01074 func (stream, "]%s",
01075 ((given & 0x00200000) != 0) ? "!" : "");
01076 }
01077 else
01078 {
01079
01080 if ((given & 0x00400000) == 0x00400000)
01081 {
01082
01083 int offset = ((given & 0xf00) >> 4) | (given & 0xf);
01084 if (offset)
01085 func (stream, "], #%s%d",
01086 (((given & 0x00800000) == 0)
01087 ? "-" : ""), offset);
01088 else
01089 func (stream, "]");
01090 }
01091 else
01092 {
01093
01094 func (stream, "], %s%s",
01095 (((given & 0x00800000) == 0)
01096 ? "-" : ""),
01097 arm_regnames[given & 0xf]);
01098 }
01099 }
01100 }
01101 break;
01102
01103 case 'b':
01104 (*info->print_address_func)
01105 (BDISP (given) * 4 + pc + 8, info);
01106 break;
01107
01108 case 'c':
01109 func (stream, "%s",
01110 arm_conditional [(given >> 28) & 0xf]);
01111 break;
01112
01113 case 'm':
01114 {
01115 int started = 0;
01116 int reg;
01117
01118 func (stream, "{");
01119 for (reg = 0; reg < 16; reg++)
01120 if ((given & (1 << reg)) != 0)
01121 {
01122 if (started)
01123 func (stream, ", ");
01124 started = 1;
01125 func (stream, "%s", arm_regnames[reg]);
01126 }
01127 func (stream, "}");
01128 }
01129 break;
01130
01131 case 'o':
01132 if ((given & 0x02000000) != 0)
01133 {
01134 int rotate = (given & 0xf00) >> 7;
01135 int immed = (given & 0xff);
01136 immed = (((immed << (32 - rotate))
01137 | (immed >> rotate)) & 0xffffffff);
01138 func (stream, "#%d\t; 0x%x", immed, immed);
01139 }
01140 else
01141 arm_decode_shift (given, func, stream);
01142 break;
01143
01144 case 'p':
01145 if ((given & 0x0000f000) == 0x0000f000)
01146 func (stream, "p");
01147 break;
01148
01149 case 't':
01150 if ((given & 0x01200000) == 0x00200000)
01151 func (stream, "t");
01152 break;
01153
01154 case 'A':
01155 func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
01156
01157 if ((given & (1 << 24)) != 0)
01158 {
01159 int offset = given & 0xff;
01160
01161 if (offset)
01162 func (stream, ", #%s%d]%s",
01163 ((given & 0x00800000) == 0 ? "-" : ""),
01164 offset * 4,
01165 ((given & 0x00200000) != 0 ? "!" : ""));
01166 else
01167 func (stream, "]");
01168 }
01169 else
01170 {
01171 int offset = given & 0xff;
01172
01173 func (stream, "]");
01174
01175 if (given & (1 << 21))
01176 {
01177 if (offset)
01178 func (stream, ", #%s%d",
01179 ((given & 0x00800000) == 0 ? "-" : ""),
01180 offset * 4);
01181 }
01182 else
01183 func (stream, ", {%d}", offset);
01184 }
01185 break;
01186
01187 case 'B':
01188
01189 {
01190 bfd_vma address;
01191 bfd_vma offset = 0;
01192
01193 if (given & 0x00800000)
01194
01195 offset = (-1) ^ 0x00ffffff;
01196
01197
01198 offset += given & 0x00ffffff;
01199 offset <<= 2;
01200 address = offset + pc + 8;
01201
01202 if (given & 0x01000000)
01203
01204 address += 2;
01205
01206 info->print_address_func (address, info);
01207 }
01208 break;
01209
01210 case 'I':
01211
01212
01213
01214
01215 {
01216 int imm;
01217
01218 imm = (given & 0xf) | ((given & 0xe0) >> 1);
01219
01220
01221 if (imm & 0x40)
01222 imm |= (-1 << 7);
01223
01224 func (stream, "%d", imm);
01225 }
01226
01227 break;
01228
01229 case 'C':
01230 func (stream, "_");
01231 if (given & 0x80000)
01232 func (stream, "f");
01233 if (given & 0x40000)
01234 func (stream, "s");
01235 if (given & 0x20000)
01236 func (stream, "x");
01237 if (given & 0x10000)
01238 func (stream, "c");
01239 break;
01240
01241 case 'F':
01242 switch (given & 0x00408000)
01243 {
01244 case 0:
01245 func (stream, "4");
01246 break;
01247 case 0x8000:
01248 func (stream, "1");
01249 break;
01250 case 0x00400000:
01251 func (stream, "2");
01252 break;
01253 default:
01254 func (stream, "3");
01255 }
01256 break;
01257
01258 case 'P':
01259 switch (given & 0x00080080)
01260 {
01261 case 0:
01262 func (stream, "s");
01263 break;
01264 case 0x80:
01265 func (stream, "d");
01266 break;
01267 case 0x00080000:
01268 func (stream, "e");
01269 break;
01270 default:
01271 func (stream, _("<illegal precision>"));
01272 break;
01273 }
01274 break;
01275 case 'Q':
01276 switch (given & 0x00408000)
01277 {
01278 case 0:
01279 func (stream, "s");
01280 break;
01281 case 0x8000:
01282 func (stream, "d");
01283 break;
01284 case 0x00400000:
01285 func (stream, "e");
01286 break;
01287 default:
01288 func (stream, "p");
01289 break;
01290 }
01291 break;
01292 case 'R':
01293 switch (given & 0x60)
01294 {
01295 case 0:
01296 break;
01297 case 0x20:
01298 func (stream, "p");
01299 break;
01300 case 0x40:
01301 func (stream, "m");
01302 break;
01303 default:
01304 func (stream, "z");
01305 break;
01306 }
01307 break;
01308
01309 case '0': case '1': case '2': case '3': case '4':
01310 case '5': case '6': case '7': case '8': case '9':
01311 {
01312 int bitstart = *c++ - '0';
01313 int bitend = 0;
01314 while (*c >= '0' && *c <= '9')
01315 bitstart = (bitstart * 10) + *c++ - '0';
01316
01317 switch (*c)
01318 {
01319 case '-':
01320 c++;
01321
01322 while (*c >= '0' && *c <= '9')
01323 bitend = (bitend * 10) + *c++ - '0';
01324
01325 if (!bitend)
01326 abort ();
01327
01328 switch (*c)
01329 {
01330 case 'r':
01331 {
01332 long reg;
01333
01334 reg = given >> bitstart;
01335 reg &= (2 << (bitend - bitstart)) - 1;
01336
01337 func (stream, "%s", arm_regnames[reg]);
01338 }
01339 break;
01340 case 'd':
01341 {
01342 long reg;
01343
01344 reg = given >> bitstart;
01345 reg &= (2 << (bitend - bitstart)) - 1;
01346
01347 func (stream, "%d", reg);
01348 }
01349 break;
01350 case 'W':
01351 {
01352 long reg;
01353
01354 reg = given >> bitstart;
01355 reg &= (2 << (bitend - bitstart)) - 1;
01356
01357 func (stream, "%d", reg + 1);
01358 }
01359 break;
01360 case 'x':
01361 {
01362 long reg;
01363
01364 reg = given >> bitstart;
01365 reg &= (2 << (bitend - bitstart)) - 1;
01366
01367 func (stream, "0x%08x", reg);
01368
01369
01370
01371 if ((given & 0x0fffffff) == 0x0FF00000)
01372 func (stream, "\t; IMB");
01373 else if ((given & 0x0fffffff) == 0x0FF00001)
01374 func (stream, "\t; IMBRange");
01375 }
01376 break;
01377 case 'X':
01378 {
01379 long reg;
01380
01381 reg = given >> bitstart;
01382 reg &= (2 << (bitend - bitstart)) - 1;
01383
01384 func (stream, "%01x", reg & 0xf);
01385 }
01386 break;
01387 case 'f':
01388 {
01389 long reg;
01390
01391 reg = given >> bitstart;
01392 reg &= (2 << (bitend - bitstart)) - 1;
01393
01394 if (reg > 7)
01395 func (stream, "#%s",
01396 arm_fp_const[reg & 7]);
01397 else
01398 func (stream, "f%d", reg);
01399 }
01400 break;
01401
01402 case 'w':
01403 {
01404 long reg;
01405
01406 if (bitstart != bitend)
01407 {
01408 reg = given >> bitstart;
01409 reg &= (2 << (bitend - bitstart)) - 1;
01410 if (bitend - bitstart == 1)
01411 func (stream, "%s", iwmmxt_wwnames[reg]);
01412 else
01413 func (stream, "%s", iwmmxt_wwssnames[reg]);
01414 }
01415 else
01416 {
01417 reg = (((given >> 8) & 0x1) |
01418 ((given >> 22) & 0x1));
01419 func (stream, "%s", iwmmxt_wwnames[reg]);
01420 }
01421 }
01422 break;
01423
01424 case 'g':
01425 {
01426 long reg;
01427 int current_regnames;
01428
01429 if (! iwmmxt_regnames)
01430 iwmmxt_regnames = set_iwmmxt_regnames ();
01431 current_regnames = set_arm_regname_option
01432 (iwmmxt_regnames);
01433
01434 reg = given >> bitstart;
01435 reg &= (2 << (bitend - bitstart)) - 1;
01436 func (stream, "%s", arm_regnames[reg]);
01437 set_arm_regname_option (current_regnames);
01438 }
01439 break;
01440
01441 case 'G':
01442 {
01443 long reg;
01444 int current_regnames;
01445
01446 if (! iwmmxt_regnames)
01447 iwmmxt_regnames = set_iwmmxt_regnames ();
01448 current_regnames = set_arm_regname_option
01449 (iwmmxt_regnames + 1);
01450
01451 reg = given >> bitstart;
01452 reg &= (2 << (bitend - bitstart)) - 1;
01453 func (stream, "%s", arm_regnames[reg]);
01454 set_arm_regname_option (current_regnames);
01455 }
01456 break;
01457
01458 default:
01459 abort ();
01460 }
01461 break;
01462
01463 case 'y':
01464 case 'z':
01465 {
01466 int single = *c == 'y';
01467 int regno;
01468
01469 switch (bitstart)
01470 {
01471 case 4:
01472 func (stream, "{");
01473
01474 case 0:
01475 regno = given & 0x0000000f;
01476 if (single)
01477 {
01478 regno <<= 1;
01479 regno += (given >> 5) & 1;
01480 }
01481 break;
01482
01483 case 1:
01484 regno = (given >> 12) & 0x0000000f;
01485 if (single)
01486 {
01487 regno <<= 1;
01488 regno += (given >> 22) & 1;
01489 }
01490 break;
01491
01492 case 2:
01493 regno = (given >> 16) & 0x0000000f;
01494 if (single)
01495 {
01496 regno <<= 1;
01497 regno += (given >> 7) & 1;
01498 }
01499 break;
01500
01501 case 3:
01502 func (stream, "{");
01503 regno = (given >> 12) & 0x0000000f;
01504 if (single)
01505 {
01506 regno <<= 1;
01507 regno += (given >> 22) & 1;
01508 }
01509 break;
01510
01511
01512 default:
01513 abort ();
01514 }
01515
01516 func (stream, "%c%d", single ? 's' : 'd', regno);
01517
01518 if (bitstart == 3)
01519 {
01520 int count = given & 0xff;
01521
01522 if (single == 0)
01523 count >>= 1;
01524
01525 if (--count)
01526 {
01527 func (stream, "-%c%d",
01528 single ? 's' : 'd',
01529 regno + count);
01530 }
01531
01532 func (stream, "}");
01533 }
01534 else if (bitstart == 4)
01535 func (stream, ", %c%d}", single ? 's' : 'd',
01536 regno + 1);
01537
01538 break;
01539 }
01540
01541 case '`':
01542 c++;
01543 if ((given & (1 << bitstart)) == 0)
01544 func (stream, "%c", *c);
01545 break;
01546 case '\'':
01547 c++;
01548 if ((given & (1 << bitstart)) != 0)
01549 func (stream, "%c", *c);
01550 break;
01551 case '?':
01552 ++c;
01553 if ((given & (1 << bitstart)) != 0)
01554 func (stream, "%c", *c++);
01555 else
01556 func (stream, "%c", *++c);
01557 break;
01558 default:
01559 abort ();
01560 }
01561 break;
01562
01563 case 'L':
01564 switch (given & 0x00400100)
01565 {
01566 case 0x00000000: func (stream, "b"); break;
01567 case 0x00400000: func (stream, "h"); break;
01568 case 0x00000100: func (stream, "w"); break;
01569 case 0x00400100: func (stream, "d"); break;
01570 default:
01571 break;
01572 }
01573 break;
01574
01575 case 'Z':
01576 {
01577 int value;
01578
01579 value = ((given >> 16) & 0xf0) | (given & 0xf);
01580 func (stream, "%d", value);
01581 }
01582 break;
01583
01584 case 'l':
01585
01586
01587
01588 {
01589 int offset = given & 0xff;
01590 int multiplier = (given & 0x00000100) ? 4 : 1;
01591
01592 func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
01593
01594 if (offset)
01595 {
01596 if ((given & 0x01000000) != 0)
01597 func (stream, ", #%s%d]%s",
01598 ((given & 0x00800000) == 0 ? "-" : ""),
01599 offset * multiplier,
01600 ((given & 0x00200000) != 0 ? "!" : ""));
01601 else
01602 func (stream, "], #%s%d",
01603 ((given & 0x00800000) == 0 ? "-" : ""),
01604 offset * multiplier);
01605 }
01606 else
01607 func (stream, "]");
01608 }
01609 break;
01610
01611 case 'e':
01612 {
01613 int imm;
01614
01615 imm = (given & 0xf) | ((given & 0xfff00) >> 4);
01616 func (stream, "%d", imm);
01617 }
01618 break;
01619
01620 default:
01621 abort ();
01622 }
01623 }
01624 }
01625 else
01626 func (stream, "%c", *c);
01627 }
01628 return 4;
01629 }
01630 }
01631 abort ();
01632 }
01633
01634
01635
01636
01637 static int
01638 print_insn_thumb (pc, info, given)
01639 bfd_vma pc;
01640 struct disassemble_info *info;
01641 long given;
01642 {
01643 const struct thumb_opcode *insn;
01644 void *stream = info->stream;
01645 fprintf_ftype func = info->fprintf_func;
01646
01647 for (insn = thumb_opcodes; insn->assembler; insn++)
01648 {
01649 if ((given & insn->mask) == insn->value)
01650 {
01651 char * c = insn->assembler;
01652
01653
01654 if (!*c)
01655 {
01656 long offset;
01657
01658 info->bytes_per_chunk = 4;
01659 info->bytes_per_line = 4;
01660
01661 offset = BDISP23 (given);
01662 offset = offset * 2 + pc + 4;
01663
01664 if ((given & 0x10000000) == 0)
01665 {
01666 func (stream, "blx\t");
01667 offset &= 0xfffffffc;
01668 }
01669 else
01670 func (stream, "bl\t");
01671
01672 info->print_address_func (offset, info);
01673 return 4;
01674 }
01675 else
01676 {
01677 info->bytes_per_chunk = 2;
01678 info->bytes_per_line = 4;
01679
01680 given &= 0xffff;
01681
01682 for (; *c; c++)
01683 {
01684 if (*c == '%')
01685 {
01686 int domaskpc = 0;
01687 int domasklr = 0;
01688
01689 switch (*++c)
01690 {
01691 case '%':
01692 func (stream, "%%");
01693 break;
01694
01695 case 'S':
01696 {
01697 long reg;
01698
01699 reg = (given >> 3) & 0x7;
01700 if (given & (1 << 6))
01701 reg += 8;
01702
01703 func (stream, "%s", arm_regnames[reg]);
01704 }
01705 break;
01706
01707 case 'D':
01708 {
01709 long reg;
01710
01711 reg = given & 0x7;
01712 if (given & (1 << 7))
01713 reg += 8;
01714
01715 func (stream, "%s", arm_regnames[reg]);
01716 }
01717 break;
01718
01719 case 'T':
01720 func (stream, "%s",
01721 arm_conditional [(given >> 8) & 0xf]);
01722 break;
01723
01724 case 'N':
01725 if (given & (1 << 8))
01726 domasklr = 1;
01727
01728 case 'O':
01729 if (*c == 'O' && (given & (1 << 8)))
01730 domaskpc = 1;
01731
01732 case 'M':
01733 {
01734 int started = 0;
01735 int reg;
01736
01737 func (stream, "{");
01738
01739
01740
01741 for (reg = 0; (reg < 8); reg++)
01742 if ((given & (1 << reg)) != 0)
01743 {
01744 if (started)
01745 func (stream, ", ");
01746 started = 1;
01747 func (stream, "%s", arm_regnames[reg]);
01748 }
01749
01750 if (domasklr)
01751 {
01752 if (started)
01753 func (stream, ", ");
01754 started = 1;
01755 func (stream, arm_regnames[14] );
01756 }
01757
01758 if (domaskpc)
01759 {
01760 if (started)
01761 func (stream, ", ");
01762 func (stream, arm_regnames[15] );
01763 }
01764
01765 func (stream, "}");
01766 }
01767 break;
01768
01769
01770 case '0': case '1': case '2': case '3': case '4':
01771 case '5': case '6': case '7': case '8': case '9':
01772 {
01773 int bitstart = *c++ - '0';
01774 int bitend = 0;
01775
01776 while (*c >= '0' && *c <= '9')
01777 bitstart = (bitstart * 10) + *c++ - '0';
01778
01779 switch (*c)
01780 {
01781 case '-':
01782 {
01783 long reg;
01784
01785 c++;
01786 while (*c >= '0' && *c <= '9')
01787 bitend = (bitend * 10) + *c++ - '0';
01788 if (!bitend)
01789 abort ();
01790 reg = given >> bitstart;
01791 reg &= (2 << (bitend - bitstart)) - 1;
01792 switch (*c)
01793 {
01794 case 'r':
01795 func (stream, "%s", arm_regnames[reg]);
01796 break;
01797
01798 case 'd':
01799 func (stream, "%d", reg);
01800 break;
01801
01802 case 'H':
01803 func (stream, "%d", reg << 1);
01804 break;
01805
01806 case 'W':
01807 func (stream, "%d", reg << 2);
01808 break;
01809
01810 case 'a':
01811
01812
01813
01814 info->print_address_func
01815 (((pc + 4) & ~3) + (reg << 2), info);
01816 break;
01817
01818 case 'x':
01819 func (stream, "0x%04x", reg);
01820 break;
01821
01822 case 'I':
01823 reg = ((reg ^ (1 << bitend)) - (1 << bitend));
01824 func (stream, "%d", reg);
01825 break;
01826
01827 case 'B':
01828 reg = ((reg ^ (1 << bitend)) - (1 << bitend));
01829 (*info->print_address_func)
01830 (reg * 2 + pc + 4, info);
01831 break;
01832
01833 default:
01834 abort ();
01835 }
01836 }
01837 break;
01838
01839 case '\'':
01840 c++;
01841 if ((given & (1 << bitstart)) != 0)
01842 func (stream, "%c", *c);
01843 break;
01844
01845 case '?':
01846 ++c;
01847 if ((given & (1 << bitstart)) != 0)
01848 func (stream, "%c", *c++);
01849 else
01850 func (stream, "%c", *++c);
01851 break;
01852
01853 default:
01854 abort ();
01855 }
01856 }
01857 break;
01858
01859 default:
01860 abort ();
01861 }
01862 }
01863 else
01864 func (stream, "%c", *c);
01865 }
01866 }
01867 return 2;
01868 }
01869 }
01870
01871
01872 abort ();
01873 }
01874
01875
01876
01877
01878 bfd_boolean
01879 arm_symbol_is_valid (asymbol * sym,
01880 struct disassemble_info * info ATTRIBUTE_UNUSED)
01881 {
01882 const char * name;
01883
01884 if (sym == NULL)
01885 return FALSE;
01886
01887 name = bfd_asymbol_name (sym);
01888
01889 return (name && *name != '$');
01890 }
01891
01892
01893
01894 void
01895 parse_arm_disassembler_option (option)
01896 char * option;
01897 {
01898 if (option == NULL)
01899 return;
01900
01901 if (strneq (option, "reg-names-", 10))
01902 {
01903 int i;
01904
01905 option += 10;
01906
01907 for (i = NUM_ARM_REGNAMES; i--;)
01908 if (strneq (option, regnames[i].name, strlen (regnames[i].name)))
01909 {
01910 regname_selected = i;
01911 break;
01912 }
01913
01914 if (i < 0)
01915
01916 fprintf (stderr, _("Unrecognised register name set: %s\n"), option);
01917 }
01918 else if (strneq (option, "force-thumb", 11))
01919 force_thumb = 1;
01920 else if (strneq (option, "no-force-thumb", 14))
01921 force_thumb = 0;
01922 else
01923
01924 fprintf (stderr, _("Unrecognised disassembler option: %s\n"), option);
01925
01926 return;
01927 }
01928
01929
01930
01931
01932 static void
01933 parse_disassembler_options (options)
01934 char * options;
01935 {
01936 if (options == NULL)
01937 return;
01938
01939 while (*options)
01940 {
01941 parse_arm_disassembler_option (options);
01942
01943
01944 while ((*options) && (! ISSPACE (*options)) && (*options != ','))
01945 ++ options;
01946
01947 while (ISSPACE (*options) || (*options == ','))
01948 ++ options;
01949 }
01950 }
01951
01952
01953
01954
01955 static int
01956 print_insn (pc, info, little)
01957 bfd_vma pc;
01958 struct disassemble_info * info;
01959 bfd_boolean little;
01960 {
01961 unsigned char b[4];
01962 long given;
01963 int status;
01964 int is_thumb, second_half_valid = 1;
01965
01966 if (info->disassembler_options)
01967 {
01968 parse_disassembler_options (info->disassembler_options);
01969
01970
01971 info->disassembler_options = NULL;
01972 }
01973
01974 is_thumb = force_thumb;
01975
01976 if (!is_thumb && info->symbols != NULL)
01977 {
01978 if (bfd_asymbol_flavour (*info->symbols) == bfd_target_coff_flavour)
01979 {
01980 coff_symbol_type * cs;
01981
01982 cs = coffsymbol (*info->symbols);
01983 is_thumb = ( cs->native->u.syment.n_sclass == C_THUMBEXT
01984 || cs->native->u.syment.n_sclass == C_THUMBSTAT
01985 || cs->native->u.syment.n_sclass == C_THUMBLABEL
01986 || cs->native->u.syment.n_sclass == C_THUMBEXTFUNC
01987 || cs->native->u.syment.n_sclass == C_THUMBSTATFUNC);
01988 }
01989 else if (bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour)
01990 {
01991 elf_symbol_type * es;
01992 unsigned int type;
01993
01994 es = *(elf_symbol_type **)(info->symbols);
01995 type = ELF_ST_TYPE (es->internal_elf_sym.st_info);
01996
01997 is_thumb = (type == STT_ARM_TFUNC) || (type == STT_ARM_16BIT);
01998 }
01999 }
02000
02001 info->bytes_per_chunk = 4;
02002 info->display_endian = little ? BFD_ENDIAN_LITTLE : BFD_ENDIAN_BIG;
02003
02004 if (little)
02005 {
02006 status = info->read_memory_func (pc, (bfd_byte *) &b[0], 4, info);
02007 if (status != 0 && is_thumb)
02008 {
02009 info->bytes_per_chunk = 2;
02010 second_half_valid = 0;
02011
02012 status = info->read_memory_func (pc, (bfd_byte *) b, 2, info);
02013 b[3] = b[2] = 0;
02014 }
02015
02016 if (status != 0)
02017 {
02018 info->memory_error_func (status, pc, info);
02019 return -1;
02020 }
02021
02022 given = (b[0]) | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
02023 }
02024 else
02025 {
02026 status = info->read_memory_func
02027 (WORD_ADDRESS (pc), (bfd_byte *) &b[0], 4, info);
02028 if (status != 0)
02029 {
02030 info->memory_error_func (status, WORD_ADDRESS (pc), info);
02031 return -1;
02032 }
02033
02034 if (is_thumb)
02035 {
02036 if (pc & 0x2)
02037 {
02038 given = (b[2] << 8) | b[3];
02039
02040 status = info->read_memory_func
02041 (WORD_ADDRESS (pc + 4), (bfd_byte *) b, 4, info);
02042 if (status != 0)
02043 second_half_valid = 0;
02044 else
02045 given |= (b[0] << 24) | (b[1] << 16);
02046 }
02047 else
02048 given = (b[0] << 8) | b[1] | (b[2] << 24) | (b[3] << 16);
02049 }
02050 else
02051 given = (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | (b[3]);
02052 }
02053
02054 if (info->flags & INSN_HAS_RELOC)
02055
02056
02057
02058
02059
02060 pc = 0;
02061
02062 if (is_thumb)
02063 status = print_insn_thumb (pc, info, given);
02064 else
02065 status = print_insn_arm (pc, info, given);
02066
02067 if (is_thumb && status == 4 && second_half_valid == 0)
02068 {
02069 info->memory_error_func (status, WORD_ADDRESS (pc + 4), info);
02070 return -1;
02071 }
02072
02073 return status;
02074 }
02075
02076 int
02077 print_insn_big_arm (pc, info)
02078 bfd_vma pc;
02079 struct disassemble_info * info;
02080 {
02081 return print_insn (pc, info, FALSE);
02082 }
02083
02084 int
02085 print_insn_little_arm (pc, info)
02086 bfd_vma pc;
02087 struct disassemble_info * info;
02088 {
02089 return print_insn (pc, info, TRUE);
02090 }
02091
02092 void
02093 print_arm_disassembler_options (FILE * stream)
02094 {
02095 int i;
02096
02097 fprintf (stream, _("\n\
02098 The following ARM specific disassembler options are supported for use with\n\
02099 the -M switch:\n"));
02100
02101 for (i = NUM_ARM_REGNAMES; i--;)
02102 fprintf (stream, " reg-names-%s %*c%s\n",
02103 regnames[i].name,
02104 (int)(14 - strlen (regnames[i].name)), ' ',
02105 regnames[i].description);
02106
02107 fprintf (stream, " force-thumb Assume all insns are Thumb insns\n");
02108 fprintf (stream, " no-force-thumb Examine preceeding label to determine an insn's type\n\n");
02109 }