Commit ee8ae9e42a84f0243af3961f376e3d2dfc2dfbe6
1 parent
eca8f888
Update ppc-dis.c from binutils from 4th July, 2007, just before GPLv3 switch
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6583 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
565 additions
and
499 deletions
ppc-dis.c
| 1 | 1 | /* ppc-dis.c -- Disassemble PowerPC instructions |
| 2 | - Copyright 1994, 1995, 2000, 2001, 2002, 2003, 2004, 2005 | |
| 2 | + Copyright 1994, 1995, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 | |
| 3 | 3 | Free Software Foundation, Inc. |
| 4 | 4 | Written by Ian Lance Taylor, Cygnus Support |
| 5 | 5 | |
| ... | ... | @@ -22,8 +22,8 @@ Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, US |
| 22 | 22 | #define BFD_DEFAULT_TARGET_SIZE 64 |
| 23 | 23 | |
| 24 | 24 | /* ppc.h -- Header file for PowerPC opcode table |
| 25 | - Copyright 1994, 1995, 1999, 2000, 2001, 2002, 2003, 2004, 2005 | |
| 26 | - Free Software Foundation, Inc. | |
| 25 | + Copyright 1994, 1995, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, | |
| 26 | + 2007 Free Software Foundation, Inc. | |
| 27 | 27 | Written by Ian Lance Taylor, Cygnus Support |
| 28 | 28 | |
| 29 | 29 | This file is part of GDB, GAS, and the GNU binutils. |
| ... | ... | @@ -155,10 +155,16 @@ extern const int powerpc_num_opcodes; |
| 155 | 155 | #define PPC_OPCODE_RFMCI 0x800000 |
| 156 | 156 | |
| 157 | 157 | /* Opcode is only supported by Power5 architecture. */ |
| 158 | -#define PPC_OPCODE_POWER5 0x1000000 | |
| 158 | +#define PPC_OPCODE_POWER5 0x1000000 | |
| 159 | 159 | |
| 160 | 160 | /* Opcode is supported by PowerPC e300 family. */ |
| 161 | -#define PPC_OPCODE_E300 0x2000000 | |
| 161 | +#define PPC_OPCODE_E300 0x2000000 | |
| 162 | + | |
| 163 | +/* Opcode is only supported by Power6 architecture. */ | |
| 164 | +#define PPC_OPCODE_POWER6 0x4000000 | |
| 165 | + | |
| 166 | +/* Opcode is only supported by PowerPC Cell family. */ | |
| 167 | +#define PPC_OPCODE_CELL 0x8000000 | |
| 162 | 168 | |
| 163 | 169 | /* A macro to extract the major opcode from an instruction. */ |
| 164 | 170 | #define PPC_OP(i) (((i) >> 26) & 0x3f) |
| ... | ... | @@ -167,20 +173,21 @@ extern const int powerpc_num_opcodes; |
| 167 | 173 | |
| 168 | 174 | struct powerpc_operand |
| 169 | 175 | { |
| 170 | - /* The number of bits in the operand. */ | |
| 171 | - int bits; | |
| 176 | + /* A bitmask of bits in the operand. */ | |
| 177 | + unsigned int bitm; | |
| 172 | 178 | |
| 173 | - /* How far the operand is left shifted in the instruction. */ | |
| 179 | + /* How far the operand is left shifted in the instruction. | |
| 180 | + -1 to indicate that BITM and SHIFT cannot be used to determine | |
| 181 | + where the operand goes in the insn. */ | |
| 174 | 182 | int shift; |
| 175 | 183 | |
| 176 | 184 | /* Insertion function. This is used by the assembler. To insert an |
| 177 | 185 | operand value into an instruction, check this field. |
| 178 | 186 | |
| 179 | 187 | If it is NULL, execute |
| 180 | - i |= (op & ((1 << o->bits) - 1)) << o->shift; | |
| 188 | + i |= (op & o->bitm) << o->shift; | |
| 181 | 189 | (i is the instruction which we are filling in, o is a pointer to |
| 182 | - this structure, and op is the opcode value; this assumes twos | |
| 183 | - complement arithmetic). | |
| 190 | + this structure, and op is the operand value). | |
| 184 | 191 | |
| 185 | 192 | If this field is not NULL, then simply call it with the |
| 186 | 193 | instruction and the operand value. It will return the new value |
| ... | ... | @@ -196,12 +203,11 @@ struct powerpc_operand |
| 196 | 203 | extract this operand type from an instruction, check this field. |
| 197 | 204 | |
| 198 | 205 | If it is NULL, compute |
| 199 | - op = ((i) >> o->shift) & ((1 << o->bits) - 1); | |
| 200 | - if ((o->flags & PPC_OPERAND_SIGNED) != 0 | |
| 201 | - && (op & (1 << (o->bits - 1))) != 0) | |
| 202 | - op -= 1 << o->bits; | |
| 206 | + op = (i >> o->shift) & o->bitm; | |
| 207 | + if ((o->flags & PPC_OPERAND_SIGNED) != 0) | |
| 208 | + sign_extend (op); | |
| 203 | 209 | (i is the instruction, o is a pointer to this structure, and op |
| 204 | - is the result; this assumes twos complement arithmetic). | |
| 210 | + is the result). | |
| 205 | 211 | |
| 206 | 212 | If this field is not NULL, then simply call it with the |
| 207 | 213 | instruction value. It will return the value of the operand. If |
| ... | ... | @@ -219,17 +225,18 @@ struct powerpc_operand |
| 219 | 225 | the operands field of the powerpc_opcodes table. */ |
| 220 | 226 | |
| 221 | 227 | extern const struct powerpc_operand powerpc_operands[]; |
| 228 | +extern const unsigned int num_powerpc_operands; | |
| 222 | 229 | |
| 223 | 230 | /* Values defined for the flags field of a struct powerpc_operand. */ |
| 224 | 231 | |
| 225 | 232 | /* This operand takes signed values. */ |
| 226 | -#define PPC_OPERAND_SIGNED (01) | |
| 233 | +#define PPC_OPERAND_SIGNED (0x1) | |
| 227 | 234 | |
| 228 | 235 | /* This operand takes signed values, but also accepts a full positive |
| 229 | 236 | range of values when running in 32 bit mode. That is, if bits is |
| 230 | 237 | 16, it takes any value from -0x8000 to 0xffff. In 64 bit mode, |
| 231 | 238 | this flag is ignored. */ |
| 232 | -#define PPC_OPERAND_SIGNOPT (02) | |
| 239 | +#define PPC_OPERAND_SIGNOPT (0x2) | |
| 233 | 240 | |
| 234 | 241 | /* This operand does not actually exist in the assembler input. This |
| 235 | 242 | is used to support extended mnemonics such as mr, for which two |
| ... | ... | @@ -237,14 +244,14 @@ extern const struct powerpc_operand powerpc_operands[]; |
| 237 | 244 | insert function with any op value. The disassembler should call |
| 238 | 245 | the extract function, ignore the return value, and check the value |
| 239 | 246 | placed in the valid argument. */ |
| 240 | -#define PPC_OPERAND_FAKE (04) | |
| 247 | +#define PPC_OPERAND_FAKE (0x4) | |
| 241 | 248 | |
| 242 | 249 | /* The next operand should be wrapped in parentheses rather than |
| 243 | 250 | separated from this one by a comma. This is used for the load and |
| 244 | 251 | store instructions which want their operands to look like |
| 245 | 252 | reg,displacement(reg) |
| 246 | 253 | */ |
| 247 | -#define PPC_OPERAND_PARENS (010) | |
| 254 | +#define PPC_OPERAND_PARENS (0x8) | |
| 248 | 255 | |
| 249 | 256 | /* This operand may use the symbolic names for the CR fields, which |
| 250 | 257 | are |
| ... | ... | @@ -253,26 +260,26 @@ extern const struct powerpc_operand powerpc_operands[]; |
| 253 | 260 | cr4 4 cr5 5 cr6 6 cr7 7 |
| 254 | 261 | These may be combined arithmetically, as in cr2*4+gt. These are |
| 255 | 262 | only supported on the PowerPC, not the POWER. */ |
| 256 | -#define PPC_OPERAND_CR (020) | |
| 263 | +#define PPC_OPERAND_CR (0x10) | |
| 257 | 264 | |
| 258 | 265 | /* This operand names a register. The disassembler uses this to print |
| 259 | 266 | register names with a leading 'r'. */ |
| 260 | -#define PPC_OPERAND_GPR (040) | |
| 267 | +#define PPC_OPERAND_GPR (0x20) | |
| 261 | 268 | |
| 262 | 269 | /* Like PPC_OPERAND_GPR, but don't print a leading 'r' for r0. */ |
| 263 | -#define PPC_OPERAND_GPR_0 (0100) | |
| 270 | +#define PPC_OPERAND_GPR_0 (0x40) | |
| 264 | 271 | |
| 265 | 272 | /* This operand names a floating point register. The disassembler |
| 266 | 273 | prints these with a leading 'f'. */ |
| 267 | -#define PPC_OPERAND_FPR (0200) | |
| 274 | +#define PPC_OPERAND_FPR (0x80) | |
| 268 | 275 | |
| 269 | 276 | /* This operand is a relative branch displacement. The disassembler |
| 270 | 277 | prints these symbolically if possible. */ |
| 271 | -#define PPC_OPERAND_RELATIVE (0400) | |
| 278 | +#define PPC_OPERAND_RELATIVE (0x100) | |
| 272 | 279 | |
| 273 | 280 | /* This operand is an absolute branch address. The disassembler |
| 274 | 281 | prints these symbolically if possible. */ |
| 275 | -#define PPC_OPERAND_ABSOLUTE (01000) | |
| 282 | +#define PPC_OPERAND_ABSOLUTE (0x200) | |
| 276 | 283 | |
| 277 | 284 | /* This operand is optional, and is zero if omitted. This is used for |
| 278 | 285 | example, in the optional BF field in the comparison instructions. The |
| ... | ... | @@ -280,7 +287,7 @@ extern const struct powerpc_operand powerpc_operands[]; |
| 280 | 287 | and the number of operands remaining for the opcode, and decide |
| 281 | 288 | whether this operand is present or not. The disassembler should |
| 282 | 289 | print this operand out only if it is not zero. */ |
| 283 | -#define PPC_OPERAND_OPTIONAL (02000) | |
| 290 | +#define PPC_OPERAND_OPTIONAL (0x400) | |
| 284 | 291 | |
| 285 | 292 | /* This flag is only used with PPC_OPERAND_OPTIONAL. If this operand |
| 286 | 293 | is omitted, then for the next operand use this operand value plus |
| ... | ... | @@ -288,24 +295,27 @@ extern const struct powerpc_operand powerpc_operands[]; |
| 288 | 295 | hack is needed because the Power rotate instructions can take |
| 289 | 296 | either 4 or 5 operands. The disassembler should print this operand |
| 290 | 297 | out regardless of the PPC_OPERAND_OPTIONAL field. */ |
| 291 | -#define PPC_OPERAND_NEXT (04000) | |
| 298 | +#define PPC_OPERAND_NEXT (0x800) | |
| 292 | 299 | |
| 293 | 300 | /* This operand should be regarded as a negative number for the |
| 294 | 301 | purposes of overflow checking (i.e., the normal most negative |
| 295 | 302 | number is disallowed and one more than the normal most positive |
| 296 | 303 | number is allowed). This flag will only be set for a signed |
| 297 | 304 | operand. */ |
| 298 | -#define PPC_OPERAND_NEGATIVE (010000) | |
| 305 | +#define PPC_OPERAND_NEGATIVE (0x1000) | |
| 299 | 306 | |
| 300 | 307 | /* This operand names a vector unit register. The disassembler |
| 301 | 308 | prints these with a leading 'v'. */ |
| 302 | -#define PPC_OPERAND_VR (020000) | |
| 309 | +#define PPC_OPERAND_VR (0x2000) | |
| 303 | 310 | |
| 304 | 311 | /* This operand is for the DS field in a DS form instruction. */ |
| 305 | -#define PPC_OPERAND_DS (040000) | |
| 312 | +#define PPC_OPERAND_DS (0x4000) | |
| 306 | 313 | |
| 307 | 314 | /* This operand is for the DQ field in a DQ form instruction. */ |
| 308 | -#define PPC_OPERAND_DQ (0100000) | |
| 315 | +#define PPC_OPERAND_DQ (0x8000) | |
| 316 | + | |
| 317 | +/* Valid range of operand is 0..n rather than 0..n-1. */ | |
| 318 | +#define PPC_OPERAND_PLUS1 (0x10000) | |
| 309 | 319 | |
| 310 | 320 | /* The POWER and PowerPC assemblers use a few macros. We keep them |
| 311 | 321 | with the operands table for simplicity. The macro table is an |
| ... | ... | @@ -335,7 +345,7 @@ extern const int powerpc_num_macros; |
| 335 | 345 | |
| 336 | 346 | /* ppc-opc.c -- PowerPC opcode list |
| 337 | 347 | Copyright 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, |
| 338 | - 2005 Free Software Foundation, Inc. | |
| 348 | + 2005, 2006, 2007 Free Software Foundation, Inc. | |
| 339 | 349 | Written by Ian Lance Taylor, Cygnus Support |
| 340 | 350 | |
| 341 | 351 | This file is part of GDB, GAS, and the GNU binutils. |
| ... | ... | @@ -372,8 +382,6 @@ static unsigned long insert_bat (unsigned long, long, int, const char **); |
| 372 | 382 | static long extract_bat (unsigned long, int, int *); |
| 373 | 383 | static unsigned long insert_bba (unsigned long, long, int, const char **); |
| 374 | 384 | static long extract_bba (unsigned long, int, int *); |
| 375 | -static unsigned long insert_bd (unsigned long, long, int, const char **); | |
| 376 | -static long extract_bd (unsigned long, int, int *); | |
| 377 | 385 | static unsigned long insert_bdm (unsigned long, long, int, const char **); |
| 378 | 386 | static long extract_bdm (unsigned long, int, int *); |
| 379 | 387 | static unsigned long insert_bdp (unsigned long, long, int, const char **); |
| ... | ... | @@ -382,23 +390,12 @@ static unsigned long insert_bo (unsigned long, long, int, const char **); |
| 382 | 390 | static long extract_bo (unsigned long, int, int *); |
| 383 | 391 | static unsigned long insert_boe (unsigned long, long, int, const char **); |
| 384 | 392 | static long extract_boe (unsigned long, int, int *); |
| 385 | -static unsigned long insert_dq (unsigned long, long, int, const char **); | |
| 386 | -static long extract_dq (unsigned long, int, int *); | |
| 387 | -static unsigned long insert_ds (unsigned long, long, int, const char **); | |
| 388 | -static long extract_ds (unsigned long, int, int *); | |
| 389 | -static unsigned long insert_de (unsigned long, long, int, const char **); | |
| 390 | -static long extract_de (unsigned long, int, int *); | |
| 391 | -static unsigned long insert_des (unsigned long, long, int, const char **); | |
| 392 | -static long extract_des (unsigned long, int, int *); | |
| 393 | 393 | static unsigned long insert_fxm (unsigned long, long, int, const char **); |
| 394 | 394 | static long extract_fxm (unsigned long, int, int *); |
| 395 | -static unsigned long insert_li (unsigned long, long, int, const char **); | |
| 396 | -static long extract_li (unsigned long, int, int *); | |
| 397 | 395 | static unsigned long insert_mbe (unsigned long, long, int, const char **); |
| 398 | 396 | static long extract_mbe (unsigned long, int, int *); |
| 399 | 397 | static unsigned long insert_mb6 (unsigned long, long, int, const char **); |
| 400 | 398 | static long extract_mb6 (unsigned long, int, int *); |
| 401 | -static unsigned long insert_nb (unsigned long, long, int, const char **); | |
| 402 | 399 | static long extract_nb (unsigned long, int, int *); |
| 403 | 400 | static unsigned long insert_nsi (unsigned long, long, int, const char **); |
| 404 | 401 | static long extract_nsi (unsigned long, int, int *); |
| ... | ... | @@ -408,8 +405,6 @@ static unsigned long insert_raq (unsigned long, long, int, const char **); |
| 408 | 405 | static unsigned long insert_ras (unsigned long, long, int, const char **); |
| 409 | 406 | static unsigned long insert_rbs (unsigned long, long, int, const char **); |
| 410 | 407 | static long extract_rbs (unsigned long, int, int *); |
| 411 | -static unsigned long insert_rsq (unsigned long, long, int, const char **); | |
| 412 | -static unsigned long insert_rtq (unsigned long, long, int, const char **); | |
| 413 | 408 | static unsigned long insert_sh6 (unsigned long, long, int, const char **); |
| 414 | 409 | static long extract_sh6 (unsigned long, int, int *); |
| 415 | 410 | static unsigned long insert_spr (unsigned long, long, int, const char **); |
| ... | ... | @@ -418,16 +413,10 @@ static unsigned long insert_sprg (unsigned long, long, int, const char **); |
| 418 | 413 | static long extract_sprg (unsigned long, int, int *); |
| 419 | 414 | static unsigned long insert_tbr (unsigned long, long, int, const char **); |
| 420 | 415 | static long extract_tbr (unsigned long, int, int *); |
| 421 | -static unsigned long insert_ev2 (unsigned long, long, int, const char **); | |
| 422 | -static long extract_ev2 (unsigned long, int, int *); | |
| 423 | -static unsigned long insert_ev4 (unsigned long, long, int, const char **); | |
| 424 | -static long extract_ev4 (unsigned long, int, int *); | |
| 425 | -static unsigned long insert_ev8 (unsigned long, long, int, const char **); | |
| 426 | -static long extract_ev8 (unsigned long, int, int *); | |
| 427 | 416 | |
| 428 | 417 | /* The operands table. |
| 429 | 418 | |
| 430 | - The fields are bits, shift, insert, extract, flags. | |
| 419 | + The fields are bitm, shift, insert, extract, flags. | |
| 431 | 420 | |
| 432 | 421 | We used to put parens around the various additions, like the one |
| 433 | 422 | for BA just below. However, that caused trouble with feeble |
| ... | ... | @@ -445,302 +434,298 @@ const struct powerpc_operand powerpc_operands[] = |
| 445 | 434 | |
| 446 | 435 | /* The BA field in an XL form instruction. */ |
| 447 | 436 | #define BA UNUSED + 1 |
| 448 | -#define BA_MASK (0x1f << 16) | |
| 449 | - { 5, 16, NULL, NULL, PPC_OPERAND_CR }, | |
| 437 | + /* The BI field in a B form or XL form instruction. */ | |
| 438 | +#define BI BA | |
| 439 | +#define BI_MASK (0x1f << 16) | |
| 440 | + { 0x1f, 16, NULL, NULL, PPC_OPERAND_CR }, | |
| 450 | 441 | |
| 451 | 442 | /* The BA field in an XL form instruction when it must be the same |
| 452 | 443 | as the BT field in the same instruction. */ |
| 453 | 444 | #define BAT BA + 1 |
| 454 | - { 5, 16, insert_bat, extract_bat, PPC_OPERAND_FAKE }, | |
| 445 | + { 0x1f, 16, insert_bat, extract_bat, PPC_OPERAND_FAKE }, | |
| 455 | 446 | |
| 456 | 447 | /* The BB field in an XL form instruction. */ |
| 457 | 448 | #define BB BAT + 1 |
| 458 | 449 | #define BB_MASK (0x1f << 11) |
| 459 | - { 5, 11, NULL, NULL, PPC_OPERAND_CR }, | |
| 450 | + { 0x1f, 11, NULL, NULL, PPC_OPERAND_CR }, | |
| 460 | 451 | |
| 461 | 452 | /* The BB field in an XL form instruction when it must be the same |
| 462 | 453 | as the BA field in the same instruction. */ |
| 463 | 454 | #define BBA BB + 1 |
| 464 | - { 5, 11, insert_bba, extract_bba, PPC_OPERAND_FAKE }, | |
| 455 | + { 0x1f, 11, insert_bba, extract_bba, PPC_OPERAND_FAKE }, | |
| 465 | 456 | |
| 466 | 457 | /* The BD field in a B form instruction. The lower two bits are |
| 467 | 458 | forced to zero. */ |
| 468 | 459 | #define BD BBA + 1 |
| 469 | - { 16, 0, insert_bd, extract_bd, PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, | |
| 460 | + { 0xfffc, 0, NULL, NULL, PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, | |
| 470 | 461 | |
| 471 | 462 | /* The BD field in a B form instruction when absolute addressing is |
| 472 | 463 | used. */ |
| 473 | 464 | #define BDA BD + 1 |
| 474 | - { 16, 0, insert_bd, extract_bd, PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED }, | |
| 465 | + { 0xfffc, 0, NULL, NULL, PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED }, | |
| 475 | 466 | |
| 476 | 467 | /* The BD field in a B form instruction when the - modifier is used. |
| 477 | 468 | This sets the y bit of the BO field appropriately. */ |
| 478 | 469 | #define BDM BDA + 1 |
| 479 | - { 16, 0, insert_bdm, extract_bdm, | |
| 470 | + { 0xfffc, 0, insert_bdm, extract_bdm, | |
| 480 | 471 | PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, |
| 481 | 472 | |
| 482 | 473 | /* The BD field in a B form instruction when the - modifier is used |
| 483 | 474 | and absolute address is used. */ |
| 484 | 475 | #define BDMA BDM + 1 |
| 485 | - { 16, 0, insert_bdm, extract_bdm, | |
| 476 | + { 0xfffc, 0, insert_bdm, extract_bdm, | |
| 486 | 477 | PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED }, |
| 487 | 478 | |
| 488 | 479 | /* The BD field in a B form instruction when the + modifier is used. |
| 489 | 480 | This sets the y bit of the BO field appropriately. */ |
| 490 | 481 | #define BDP BDMA + 1 |
| 491 | - { 16, 0, insert_bdp, extract_bdp, | |
| 482 | + { 0xfffc, 0, insert_bdp, extract_bdp, | |
| 492 | 483 | PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, |
| 493 | 484 | |
| 494 | 485 | /* The BD field in a B form instruction when the + modifier is used |
| 495 | 486 | and absolute addressing is used. */ |
| 496 | 487 | #define BDPA BDP + 1 |
| 497 | - { 16, 0, insert_bdp, extract_bdp, | |
| 488 | + { 0xfffc, 0, insert_bdp, extract_bdp, | |
| 498 | 489 | PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED }, |
| 499 | 490 | |
| 500 | 491 | /* The BF field in an X or XL form instruction. */ |
| 501 | 492 | #define BF BDPA + 1 |
| 502 | - { 3, 23, NULL, NULL, PPC_OPERAND_CR }, | |
| 493 | + /* The CRFD field in an X form instruction. */ | |
| 494 | +#define CRFD BF | |
| 495 | + { 0x7, 23, NULL, NULL, PPC_OPERAND_CR }, | |
| 496 | + | |
| 497 | + /* The BF field in an X or XL form instruction. */ | |
| 498 | +#define BFF BF + 1 | |
| 499 | + { 0x7, 23, NULL, NULL, 0 }, | |
| 503 | 500 | |
| 504 | 501 | /* An optional BF field. This is used for comparison instructions, |
| 505 | 502 | in which an omitted BF field is taken as zero. */ |
| 506 | -#define OBF BF + 1 | |
| 507 | - { 3, 23, NULL, NULL, PPC_OPERAND_CR | PPC_OPERAND_OPTIONAL }, | |
| 503 | +#define OBF BFF + 1 | |
| 504 | + { 0x7, 23, NULL, NULL, PPC_OPERAND_CR | PPC_OPERAND_OPTIONAL }, | |
| 508 | 505 | |
| 509 | 506 | /* The BFA field in an X or XL form instruction. */ |
| 510 | 507 | #define BFA OBF + 1 |
| 511 | - { 3, 18, NULL, NULL, PPC_OPERAND_CR }, | |
| 512 | - | |
| 513 | - /* The BI field in a B form or XL form instruction. */ | |
| 514 | -#define BI BFA + 1 | |
| 515 | -#define BI_MASK (0x1f << 16) | |
| 516 | - { 5, 16, NULL, NULL, PPC_OPERAND_CR }, | |
| 508 | + { 0x7, 18, NULL, NULL, PPC_OPERAND_CR }, | |
| 517 | 509 | |
| 518 | 510 | /* The BO field in a B form instruction. Certain values are |
| 519 | 511 | illegal. */ |
| 520 | -#define BO BI + 1 | |
| 512 | +#define BO BFA + 1 | |
| 521 | 513 | #define BO_MASK (0x1f << 21) |
| 522 | - { 5, 21, insert_bo, extract_bo, 0 }, | |
| 514 | + { 0x1f, 21, insert_bo, extract_bo, 0 }, | |
| 523 | 515 | |
| 524 | 516 | /* The BO field in a B form instruction when the + or - modifier is |
| 525 | 517 | used. This is like the BO field, but it must be even. */ |
| 526 | 518 | #define BOE BO + 1 |
| 527 | - { 5, 21, insert_boe, extract_boe, 0 }, | |
| 519 | + { 0x1e, 21, insert_boe, extract_boe, 0 }, | |
| 528 | 520 | |
| 529 | 521 | #define BH BOE + 1 |
| 530 | - { 2, 11, NULL, NULL, PPC_OPERAND_OPTIONAL }, | |
| 522 | + { 0x3, 11, NULL, NULL, PPC_OPERAND_OPTIONAL }, | |
| 531 | 523 | |
| 532 | 524 | /* The BT field in an X or XL form instruction. */ |
| 533 | 525 | #define BT BH + 1 |
| 534 | - { 5, 21, NULL, NULL, PPC_OPERAND_CR }, | |
| 526 | + { 0x1f, 21, NULL, NULL, PPC_OPERAND_CR }, | |
| 535 | 527 | |
| 536 | 528 | /* The condition register number portion of the BI field in a B form |
| 537 | 529 | or XL form instruction. This is used for the extended |
| 538 | 530 | conditional branch mnemonics, which set the lower two bits of the |
| 539 | 531 | BI field. This field is optional. */ |
| 540 | 532 | #define CR BT + 1 |
| 541 | - { 3, 18, NULL, NULL, PPC_OPERAND_CR | PPC_OPERAND_OPTIONAL }, | |
| 533 | + { 0x7, 18, NULL, NULL, PPC_OPERAND_CR | PPC_OPERAND_OPTIONAL }, | |
| 542 | 534 | |
| 543 | 535 | /* The CRB field in an X form instruction. */ |
| 544 | 536 | #define CRB CR + 1 |
| 545 | - { 5, 6, NULL, NULL, 0 }, | |
| 546 | - | |
| 547 | - /* The CRFD field in an X form instruction. */ | |
| 548 | -#define CRFD CRB + 1 | |
| 549 | - { 3, 23, NULL, NULL, PPC_OPERAND_CR }, | |
| 537 | + /* The MB field in an M form instruction. */ | |
| 538 | +#define MB CRB | |
| 539 | +#define MB_MASK (0x1f << 6) | |
| 540 | + { 0x1f, 6, NULL, NULL, 0 }, | |
| 550 | 541 | |
| 551 | 542 | /* The CRFS field in an X form instruction. */ |
| 552 | -#define CRFS CRFD + 1 | |
| 553 | - { 3, 0, NULL, NULL, PPC_OPERAND_CR }, | |
| 543 | +#define CRFS CRB + 1 | |
| 544 | + { 0x7, 0, NULL, NULL, PPC_OPERAND_CR }, | |
| 554 | 545 | |
| 555 | 546 | /* The CT field in an X form instruction. */ |
| 556 | 547 | #define CT CRFS + 1 |
| 557 | - { 5, 21, NULL, NULL, PPC_OPERAND_OPTIONAL }, | |
| 548 | + /* The MO field in an mbar instruction. */ | |
| 549 | +#define MO CT | |
| 550 | + { 0x1f, 21, NULL, NULL, PPC_OPERAND_OPTIONAL }, | |
| 558 | 551 | |
| 559 | 552 | /* The D field in a D form instruction. This is a displacement off |
| 560 | 553 | a register, and implies that the next operand is a register in |
| 561 | 554 | parentheses. */ |
| 562 | 555 | #define D CT + 1 |
| 563 | - { 16, 0, NULL, NULL, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED }, | |
| 556 | + { 0xffff, 0, NULL, NULL, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED }, | |
| 564 | 557 | |
| 565 | 558 | /* The DE field in a DE form instruction. This is like D, but is 12 |
| 566 | 559 | bits only. */ |
| 567 | 560 | #define DE D + 1 |
| 568 | - { 14, 0, insert_de, extract_de, PPC_OPERAND_PARENS }, | |
| 561 | + { 0xfff, 4, NULL, NULL, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED }, | |
| 569 | 562 | |
| 570 | 563 | /* The DES field in a DES form instruction. This is like DS, but is 14 |
| 571 | 564 | bits only (12 stored.) */ |
| 572 | 565 | #define DES DE + 1 |
| 573 | - { 14, 0, insert_des, extract_des, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED }, | |
| 566 | + { 0x3ffc, 2, NULL, NULL, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED }, | |
| 574 | 567 | |
| 575 | 568 | /* The DQ field in a DQ form instruction. This is like D, but the |
| 576 | 569 | lower four bits are forced to zero. */ |
| 577 | 570 | #define DQ DES + 1 |
| 578 | - { 16, 0, insert_dq, extract_dq, | |
| 579 | - PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED | PPC_OPERAND_DQ }, | |
| 571 | + { 0xfff0, 0, NULL, NULL, | |
| 572 | + PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED | PPC_OPERAND_DQ }, | |
| 580 | 573 | |
| 581 | 574 | /* The DS field in a DS form instruction. This is like D, but the |
| 582 | 575 | lower two bits are forced to zero. */ |
| 583 | 576 | #define DS DQ + 1 |
| 584 | - { 16, 0, insert_ds, extract_ds, | |
| 585 | - PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED | PPC_OPERAND_DS }, | |
| 577 | + { 0xfffc, 0, NULL, NULL, | |
| 578 | + PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED | PPC_OPERAND_DS }, | |
| 586 | 579 | |
| 587 | 580 | /* The E field in a wrteei instruction. */ |
| 588 | 581 | #define E DS + 1 |
| 589 | - { 1, 15, NULL, NULL, 0 }, | |
| 582 | + { 0x1, 15, NULL, NULL, 0 }, | |
| 590 | 583 | |
| 591 | 584 | /* The FL1 field in a POWER SC form instruction. */ |
| 592 | 585 | #define FL1 E + 1 |
| 593 | - { 4, 12, NULL, NULL, 0 }, | |
| 586 | + /* The U field in an X form instruction. */ | |
| 587 | +#define U FL1 | |
| 588 | + { 0xf, 12, NULL, NULL, 0 }, | |
| 594 | 589 | |
| 595 | 590 | /* The FL2 field in a POWER SC form instruction. */ |
| 596 | 591 | #define FL2 FL1 + 1 |
| 597 | - { 3, 2, NULL, NULL, 0 }, | |
| 592 | + { 0x7, 2, NULL, NULL, 0 }, | |
| 598 | 593 | |
| 599 | 594 | /* The FLM field in an XFL form instruction. */ |
| 600 | 595 | #define FLM FL2 + 1 |
| 601 | - { 8, 17, NULL, NULL, 0 }, | |
| 596 | + { 0xff, 17, NULL, NULL, 0 }, | |
| 602 | 597 | |
| 603 | 598 | /* The FRA field in an X or A form instruction. */ |
| 604 | 599 | #define FRA FLM + 1 |
| 605 | 600 | #define FRA_MASK (0x1f << 16) |
| 606 | - { 5, 16, NULL, NULL, PPC_OPERAND_FPR }, | |
| 601 | + { 0x1f, 16, NULL, NULL, PPC_OPERAND_FPR }, | |
| 607 | 602 | |
| 608 | 603 | /* The FRB field in an X or A form instruction. */ |
| 609 | 604 | #define FRB FRA + 1 |
| 610 | 605 | #define FRB_MASK (0x1f << 11) |
| 611 | - { 5, 11, NULL, NULL, PPC_OPERAND_FPR }, | |
| 606 | + { 0x1f, 11, NULL, NULL, PPC_OPERAND_FPR }, | |
| 612 | 607 | |
| 613 | 608 | /* The FRC field in an A form instruction. */ |
| 614 | 609 | #define FRC FRB + 1 |
| 615 | 610 | #define FRC_MASK (0x1f << 6) |
| 616 | - { 5, 6, NULL, NULL, PPC_OPERAND_FPR }, | |
| 611 | + { 0x1f, 6, NULL, NULL, PPC_OPERAND_FPR }, | |
| 617 | 612 | |
| 618 | 613 | /* The FRS field in an X form instruction or the FRT field in a D, X |
| 619 | 614 | or A form instruction. */ |
| 620 | 615 | #define FRS FRC + 1 |
| 621 | 616 | #define FRT FRS |
| 622 | - { 5, 21, NULL, NULL, PPC_OPERAND_FPR }, | |
| 617 | + { 0x1f, 21, NULL, NULL, PPC_OPERAND_FPR }, | |
| 623 | 618 | |
| 624 | 619 | /* The FXM field in an XFX instruction. */ |
| 625 | 620 | #define FXM FRS + 1 |
| 626 | -#define FXM_MASK (0xff << 12) | |
| 627 | - { 8, 12, insert_fxm, extract_fxm, 0 }, | |
| 621 | + { 0xff, 12, insert_fxm, extract_fxm, 0 }, | |
| 628 | 622 | |
| 629 | 623 | /* Power4 version for mfcr. */ |
| 630 | 624 | #define FXM4 FXM + 1 |
| 631 | - { 8, 12, insert_fxm, extract_fxm, PPC_OPERAND_OPTIONAL }, | |
| 625 | + { 0xff, 12, insert_fxm, extract_fxm, PPC_OPERAND_OPTIONAL }, | |
| 632 | 626 | |
| 633 | 627 | /* The L field in a D or X form instruction. */ |
| 634 | 628 | #define L FXM4 + 1 |
| 635 | - { 1, 21, NULL, NULL, PPC_OPERAND_OPTIONAL }, | |
| 629 | + { 0x1, 21, NULL, NULL, PPC_OPERAND_OPTIONAL }, | |
| 636 | 630 | |
| 637 | 631 | /* The LEV field in a POWER SVC form instruction. */ |
| 638 | 632 | #define SVC_LEV L + 1 |
| 639 | - { 7, 5, NULL, NULL, 0 }, | |
| 633 | + { 0x7f, 5, NULL, NULL, 0 }, | |
| 640 | 634 | |
| 641 | 635 | /* The LEV field in an SC form instruction. */ |
| 642 | 636 | #define LEV SVC_LEV + 1 |
| 643 | - { 7, 5, NULL, NULL, PPC_OPERAND_OPTIONAL }, | |
| 637 | + { 0x7f, 5, NULL, NULL, PPC_OPERAND_OPTIONAL }, | |
| 644 | 638 | |
| 645 | 639 | /* The LI field in an I form instruction. The lower two bits are |
| 646 | 640 | forced to zero. */ |
| 647 | 641 | #define LI LEV + 1 |
| 648 | - { 26, 0, insert_li, extract_li, PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, | |
| 642 | + { 0x3fffffc, 0, NULL, NULL, PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, | |
| 649 | 643 | |
| 650 | 644 | /* The LI field in an I form instruction when used as an absolute |
| 651 | 645 | address. */ |
| 652 | 646 | #define LIA LI + 1 |
| 653 | - { 26, 0, insert_li, extract_li, PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED }, | |
| 647 | + { 0x3fffffc, 0, NULL, NULL, PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED }, | |
| 654 | 648 | |
| 655 | 649 | /* The LS field in an X (sync) form instruction. */ |
| 656 | 650 | #define LS LIA + 1 |
| 657 | - { 2, 21, NULL, NULL, PPC_OPERAND_OPTIONAL }, | |
| 658 | - | |
| 659 | - /* The MB field in an M form instruction. */ | |
| 660 | -#define MB LS + 1 | |
| 661 | -#define MB_MASK (0x1f << 6) | |
| 662 | - { 5, 6, NULL, NULL, 0 }, | |
| 651 | + { 0x3, 21, NULL, NULL, PPC_OPERAND_OPTIONAL }, | |
| 663 | 652 | |
| 664 | 653 | /* The ME field in an M form instruction. */ |
| 665 | -#define ME MB + 1 | |
| 654 | +#define ME LS + 1 | |
| 666 | 655 | #define ME_MASK (0x1f << 1) |
| 667 | - { 5, 1, NULL, NULL, 0 }, | |
| 656 | + { 0x1f, 1, NULL, NULL, 0 }, | |
| 668 | 657 | |
| 669 | 658 | /* The MB and ME fields in an M form instruction expressed a single |
| 670 | 659 | operand which is a bitmask indicating which bits to select. This |
| 671 | 660 | is a two operand form using PPC_OPERAND_NEXT. See the |
| 672 | 661 | description in opcode/ppc.h for what this means. */ |
| 673 | 662 | #define MBE ME + 1 |
| 674 | - { 5, 6, NULL, NULL, PPC_OPERAND_OPTIONAL | PPC_OPERAND_NEXT }, | |
| 675 | - { 32, 0, insert_mbe, extract_mbe, 0 }, | |
| 663 | + { 0x1f, 6, NULL, NULL, PPC_OPERAND_OPTIONAL | PPC_OPERAND_NEXT }, | |
| 664 | + { -1, 0, insert_mbe, extract_mbe, 0 }, | |
| 676 | 665 | |
| 677 | 666 | /* The MB or ME field in an MD or MDS form instruction. The high |
| 678 | 667 | bit is wrapped to the low end. */ |
| 679 | 668 | #define MB6 MBE + 2 |
| 680 | 669 | #define ME6 MB6 |
| 681 | 670 | #define MB6_MASK (0x3f << 5) |
| 682 | - { 6, 5, insert_mb6, extract_mb6, 0 }, | |
| 683 | - | |
| 684 | - /* The MO field in an mbar instruction. */ | |
| 685 | -#define MO MB6 + 1 | |
| 686 | - { 5, 21, NULL, NULL, PPC_OPERAND_OPTIONAL }, | |
| 671 | + { 0x3f, 5, insert_mb6, extract_mb6, 0 }, | |
| 687 | 672 | |
| 688 | 673 | /* The NB field in an X form instruction. The value 32 is stored as |
| 689 | 674 | 0. */ |
| 690 | -#define NB MO + 1 | |
| 691 | - { 6, 11, insert_nb, extract_nb, 0 }, | |
| 675 | +#define NB MB6 + 1 | |
| 676 | + { 0x1f, 11, NULL, extract_nb, PPC_OPERAND_PLUS1 }, | |
| 692 | 677 | |
| 693 | 678 | /* The NSI field in a D form instruction. This is the same as the |
| 694 | 679 | SI field, only negated. */ |
| 695 | 680 | #define NSI NB + 1 |
| 696 | - { 16, 0, insert_nsi, extract_nsi, | |
| 681 | + { 0xffff, 0, insert_nsi, extract_nsi, | |
| 697 | 682 | PPC_OPERAND_NEGATIVE | PPC_OPERAND_SIGNED }, |
| 698 | 683 | |
| 699 | 684 | /* The RA field in an D, DS, DQ, X, XO, M, or MDS form instruction. */ |
| 700 | 685 | #define RA NSI + 1 |
| 701 | 686 | #define RA_MASK (0x1f << 16) |
| 702 | - { 5, 16, NULL, NULL, PPC_OPERAND_GPR }, | |
| 687 | + { 0x1f, 16, NULL, NULL, PPC_OPERAND_GPR }, | |
| 703 | 688 | |
| 704 | 689 | /* As above, but 0 in the RA field means zero, not r0. */ |
| 705 | 690 | #define RA0 RA + 1 |
| 706 | - { 5, 16, NULL, NULL, PPC_OPERAND_GPR_0 }, | |
| 691 | + { 0x1f, 16, NULL, NULL, PPC_OPERAND_GPR_0 }, | |
| 707 | 692 | |
| 708 | 693 | /* The RA field in the DQ form lq instruction, which has special |
| 709 | 694 | value restrictions. */ |
| 710 | 695 | #define RAQ RA0 + 1 |
| 711 | - { 5, 16, insert_raq, NULL, PPC_OPERAND_GPR_0 }, | |
| 696 | + { 0x1f, 16, insert_raq, NULL, PPC_OPERAND_GPR_0 }, | |
| 712 | 697 | |
| 713 | 698 | /* The RA field in a D or X form instruction which is an updating |
| 714 | 699 | load, which means that the RA field may not be zero and may not |
| 715 | 700 | equal the RT field. */ |
| 716 | 701 | #define RAL RAQ + 1 |
| 717 | - { 5, 16, insert_ral, NULL, PPC_OPERAND_GPR_0 }, | |
| 702 | + { 0x1f, 16, insert_ral, NULL, PPC_OPERAND_GPR_0 }, | |
| 718 | 703 | |
| 719 | 704 | /* The RA field in an lmw instruction, which has special value |
| 720 | 705 | restrictions. */ |
| 721 | 706 | #define RAM RAL + 1 |
| 722 | - { 5, 16, insert_ram, NULL, PPC_OPERAND_GPR_0 }, | |
| 707 | + { 0x1f, 16, insert_ram, NULL, PPC_OPERAND_GPR_0 }, | |
| 723 | 708 | |
| 724 | 709 | /* The RA field in a D or X form instruction which is an updating |
| 725 | 710 | store or an updating floating point load, which means that the RA |
| 726 | 711 | field may not be zero. */ |
| 727 | 712 | #define RAS RAM + 1 |
| 728 | - { 5, 16, insert_ras, NULL, PPC_OPERAND_GPR_0 }, | |
| 713 | + { 0x1f, 16, insert_ras, NULL, PPC_OPERAND_GPR_0 }, | |
| 729 | 714 | |
| 730 | 715 | /* The RA field of the tlbwe instruction, which is optional. */ |
| 731 | 716 | #define RAOPT RAS + 1 |
| 732 | - { 5, 16, NULL, NULL, PPC_OPERAND_GPR | PPC_OPERAND_OPTIONAL }, | |
| 717 | + { 0x1f, 16, NULL, NULL, PPC_OPERAND_GPR | PPC_OPERAND_OPTIONAL }, | |
| 733 | 718 | |
| 734 | 719 | /* The RB field in an X, XO, M, or MDS form instruction. */ |
| 735 | 720 | #define RB RAOPT + 1 |
| 736 | 721 | #define RB_MASK (0x1f << 11) |
| 737 | - { 5, 11, NULL, NULL, PPC_OPERAND_GPR }, | |
| 722 | + { 0x1f, 11, NULL, NULL, PPC_OPERAND_GPR }, | |
| 738 | 723 | |
| 739 | 724 | /* The RB field in an X form instruction when it must be the same as |
| 740 | 725 | the RS field in the instruction. This is used for extended |
| 741 | 726 | mnemonics like mr. */ |
| 742 | 727 | #define RBS RB + 1 |
| 743 | - { 5, 1, insert_rbs, extract_rbs, PPC_OPERAND_FAKE }, | |
| 728 | + { 0x1f, 11, insert_rbs, extract_rbs, PPC_OPERAND_FAKE }, | |
| 744 | 729 | |
| 745 | 730 | /* The RS field in a D, DS, X, XFX, XS, M, MD or MDS form |
| 746 | 731 | instruction or the RT field in a D, DS, X, XFX or XO form |
| ... | ... | @@ -748,153 +733,168 @@ const struct powerpc_operand powerpc_operands[] = |
| 748 | 733 | #define RS RBS + 1 |
| 749 | 734 | #define RT RS |
| 750 | 735 | #define RT_MASK (0x1f << 21) |
| 751 | - { 5, 21, NULL, NULL, PPC_OPERAND_GPR }, | |
| 736 | + { 0x1f, 21, NULL, NULL, PPC_OPERAND_GPR }, | |
| 752 | 737 | |
| 753 | - /* The RS field of the DS form stq instruction, which has special | |
| 754 | - value restrictions. */ | |
| 738 | + /* The RS and RT fields of the DS form stq instruction, which have | |
| 739 | + special value restrictions. */ | |
| 755 | 740 | #define RSQ RS + 1 |
| 756 | - { 5, 21, insert_rsq, NULL, PPC_OPERAND_GPR_0 }, | |
| 757 | - | |
| 758 | - /* The RT field of the DQ form lq instruction, which has special | |
| 759 | - value restrictions. */ | |
| 760 | -#define RTQ RSQ + 1 | |
| 761 | - { 5, 21, insert_rtq, NULL, PPC_OPERAND_GPR_0 }, | |
| 741 | +#define RTQ RSQ | |
| 742 | + { 0x1e, 21, NULL, NULL, PPC_OPERAND_GPR_0 }, | |
| 762 | 743 | |
| 763 | 744 | /* The RS field of the tlbwe instruction, which is optional. */ |
| 764 | -#define RSO RTQ + 1 | |
| 745 | +#define RSO RSQ + 1 | |
| 765 | 746 | #define RTO RSO |
| 766 | - { 5, 21, NULL, NULL, PPC_OPERAND_GPR | PPC_OPERAND_OPTIONAL }, | |
| 747 | + { 0x1f, 21, NULL, NULL, PPC_OPERAND_GPR | PPC_OPERAND_OPTIONAL }, | |
| 767 | 748 | |
| 768 | 749 | /* The SH field in an X or M form instruction. */ |
| 769 | 750 | #define SH RSO + 1 |
| 770 | 751 | #define SH_MASK (0x1f << 11) |
| 771 | - { 5, 11, NULL, NULL, 0 }, | |
| 752 | + /* The other UIMM field in a EVX form instruction. */ | |
| 753 | +#define EVUIMM SH | |
| 754 | + { 0x1f, 11, NULL, NULL, 0 }, | |
| 772 | 755 | |
| 773 | 756 | /* The SH field in an MD form instruction. This is split. */ |
| 774 | 757 | #define SH6 SH + 1 |
| 775 | 758 | #define SH6_MASK ((0x1f << 11) | (1 << 1)) |
| 776 | - { 6, 1, insert_sh6, extract_sh6, 0 }, | |
| 759 | + { 0x3f, -1, insert_sh6, extract_sh6, 0 }, | |
| 777 | 760 | |
| 778 | 761 | /* The SH field of the tlbwe instruction, which is optional. */ |
| 779 | 762 | #define SHO SH6 + 1 |
| 780 | - { 5, 11,NULL, NULL, PPC_OPERAND_OPTIONAL }, | |
| 763 | + { 0x1f, 11, NULL, NULL, PPC_OPERAND_OPTIONAL }, | |
| 781 | 764 | |
| 782 | 765 | /* The SI field in a D form instruction. */ |
| 783 | 766 | #define SI SHO + 1 |
| 784 | - { 16, 0, NULL, NULL, PPC_OPERAND_SIGNED }, | |
| 767 | + { 0xffff, 0, NULL, NULL, PPC_OPERAND_SIGNED }, | |
| 785 | 768 | |
| 786 | 769 | /* The SI field in a D form instruction when we accept a wide range |
| 787 | 770 | of positive values. */ |
| 788 | 771 | #define SISIGNOPT SI + 1 |
| 789 | - { 16, 0, NULL, NULL, PPC_OPERAND_SIGNED | PPC_OPERAND_SIGNOPT }, | |
| 772 | + { 0xffff, 0, NULL, NULL, PPC_OPERAND_SIGNED | PPC_OPERAND_SIGNOPT }, | |
| 790 | 773 | |
| 791 | 774 | /* The SPR field in an XFX form instruction. This is flipped--the |
| 792 | 775 | lower 5 bits are stored in the upper 5 and vice- versa. */ |
| 793 | 776 | #define SPR SISIGNOPT + 1 |
| 794 | 777 | #define PMR SPR |
| 795 | 778 | #define SPR_MASK (0x3ff << 11) |
| 796 | - { 10, 11, insert_spr, extract_spr, 0 }, | |
| 779 | + { 0x3ff, 11, insert_spr, extract_spr, 0 }, | |
| 797 | 780 | |
| 798 | 781 | /* The BAT index number in an XFX form m[ft]ibat[lu] instruction. */ |
| 799 | 782 | #define SPRBAT SPR + 1 |
| 800 | 783 | #define SPRBAT_MASK (0x3 << 17) |
| 801 | - { 2, 17, NULL, NULL, 0 }, | |
| 784 | + { 0x3, 17, NULL, NULL, 0 }, | |
| 802 | 785 | |
| 803 | 786 | /* The SPRG register number in an XFX form m[ft]sprg instruction. */ |
| 804 | 787 | #define SPRG SPRBAT + 1 |
| 805 | - { 5, 16, insert_sprg, extract_sprg, 0 }, | |
| 788 | + { 0x1f, 16, insert_sprg, extract_sprg, 0 }, | |
| 806 | 789 | |
| 807 | 790 | /* The SR field in an X form instruction. */ |
| 808 | 791 | #define SR SPRG + 1 |
| 809 | - { 4, 16, NULL, NULL, 0 }, | |
| 792 | + { 0xf, 16, NULL, NULL, 0 }, | |
| 810 | 793 | |
| 811 | 794 | /* The STRM field in an X AltiVec form instruction. */ |
| 812 | 795 | #define STRM SR + 1 |
| 813 | -#define STRM_MASK (0x3 << 21) | |
| 814 | - { 2, 21, NULL, NULL, 0 }, | |
| 796 | + { 0x3, 21, NULL, NULL, 0 }, | |
| 815 | 797 | |
| 816 | 798 | /* The SV field in a POWER SC form instruction. */ |
| 817 | 799 | #define SV STRM + 1 |
| 818 | - { 14, 2, NULL, NULL, 0 }, | |
| 800 | + { 0x3fff, 2, NULL, NULL, 0 }, | |
| 819 | 801 | |
| 820 | 802 | /* The TBR field in an XFX form instruction. This is like the SPR |
| 821 | 803 | field, but it is optional. */ |
| 822 | 804 | #define TBR SV + 1 |
| 823 | - { 10, 11, insert_tbr, extract_tbr, PPC_OPERAND_OPTIONAL }, | |
| 805 | + { 0x3ff, 11, insert_tbr, extract_tbr, PPC_OPERAND_OPTIONAL }, | |
| 824 | 806 | |
| 825 | 807 | /* The TO field in a D or X form instruction. */ |
| 826 | 808 | #define TO TBR + 1 |
| 827 | 809 | #define TO_MASK (0x1f << 21) |
| 828 | - { 5, 21, NULL, NULL, 0 }, | |
| 829 | - | |
| 830 | - /* The U field in an X form instruction. */ | |
| 831 | -#define U TO + 1 | |
| 832 | - { 4, 12, NULL, NULL, 0 }, | |
| 810 | + { 0x1f, 21, NULL, NULL, 0 }, | |
| 833 | 811 | |
| 834 | 812 | /* The UI field in a D form instruction. */ |
| 835 | -#define UI U + 1 | |
| 836 | - { 16, 0, NULL, NULL, 0 }, | |
| 813 | +#define UI TO + 1 | |
| 814 | + { 0xffff, 0, NULL, NULL, 0 }, | |
| 837 | 815 | |
| 838 | 816 | /* The VA field in a VA, VX or VXR form instruction. */ |
| 839 | 817 | #define VA UI + 1 |
| 840 | -#define VA_MASK (0x1f << 16) | |
| 841 | - { 5, 16, NULL, NULL, PPC_OPERAND_VR }, | |
| 818 | + { 0x1f, 16, NULL, NULL, PPC_OPERAND_VR }, | |
| 842 | 819 | |
| 843 | 820 | /* The VB field in a VA, VX or VXR form instruction. */ |
| 844 | 821 | #define VB VA + 1 |
| 845 | -#define VB_MASK (0x1f << 11) | |
| 846 | - { 5, 11, NULL, NULL, PPC_OPERAND_VR }, | |
| 822 | + { 0x1f, 11, NULL, NULL, PPC_OPERAND_VR }, | |
| 847 | 823 | |
| 848 | 824 | /* The VC field in a VA form instruction. */ |
| 849 | 825 | #define VC VB + 1 |
| 850 | -#define VC_MASK (0x1f << 6) | |
| 851 | - { 5, 6, NULL, NULL, PPC_OPERAND_VR }, | |
| 826 | + { 0x1f, 6, NULL, NULL, PPC_OPERAND_VR }, | |
| 852 | 827 | |
| 853 | 828 | /* The VD or VS field in a VA, VX, VXR or X form instruction. */ |
| 854 | 829 | #define VD VC + 1 |
| 855 | 830 | #define VS VD |
| 856 | -#define VD_MASK (0x1f << 21) | |
| 857 | - { 5, 21, NULL, NULL, PPC_OPERAND_VR }, | |
| 831 | + { 0x1f, 21, NULL, NULL, PPC_OPERAND_VR }, | |
| 858 | 832 | |
| 859 | 833 | /* The SIMM field in a VX form instruction. */ |
| 860 | 834 | #define SIMM VD + 1 |
| 861 | - { 5, 16, NULL, NULL, PPC_OPERAND_SIGNED}, | |
| 835 | + { 0x1f, 16, NULL, NULL, PPC_OPERAND_SIGNED}, | |
| 862 | 836 | |
| 863 | - /* The UIMM field in a VX form instruction. */ | |
| 837 | + /* The UIMM field in a VX form instruction, and TE in Z form. */ | |
| 864 | 838 | #define UIMM SIMM + 1 |
| 865 | - { 5, 16, NULL, NULL, 0 }, | |
| 839 | +#define TE UIMM | |
| 840 | + { 0x1f, 16, NULL, NULL, 0 }, | |
| 866 | 841 | |
| 867 | 842 | /* The SHB field in a VA form instruction. */ |
| 868 | 843 | #define SHB UIMM + 1 |
| 869 | - { 4, 6, NULL, NULL, 0 }, | |
| 870 | - | |
| 871 | - /* The other UIMM field in a EVX form instruction. */ | |
| 872 | -#define EVUIMM SHB + 1 | |
| 873 | - { 5, 11, NULL, NULL, 0 }, | |
| 844 | + { 0xf, 6, NULL, NULL, 0 }, | |
| 874 | 845 | |
| 875 | 846 | /* The other UIMM field in a half word EVX form instruction. */ |
| 876 | -#define EVUIMM_2 EVUIMM + 1 | |
| 877 | - { 32, 11, insert_ev2, extract_ev2, PPC_OPERAND_PARENS }, | |
| 847 | +#define EVUIMM_2 SHB + 1 | |
| 848 | + { 0x3e, 10, NULL, NULL, PPC_OPERAND_PARENS }, | |
| 878 | 849 | |
| 879 | 850 | /* The other UIMM field in a word EVX form instruction. */ |
| 880 | 851 | #define EVUIMM_4 EVUIMM_2 + 1 |
| 881 | - { 32, 11, insert_ev4, extract_ev4, PPC_OPERAND_PARENS }, | |
| 852 | + { 0x7c, 9, NULL, NULL, PPC_OPERAND_PARENS }, | |
| 882 | 853 | |
| 883 | 854 | /* The other UIMM field in a double EVX form instruction. */ |
| 884 | 855 | #define EVUIMM_8 EVUIMM_4 + 1 |
| 885 | - { 32, 11, insert_ev8, extract_ev8, PPC_OPERAND_PARENS }, | |
| 856 | + { 0xf8, 8, NULL, NULL, PPC_OPERAND_PARENS }, | |
| 886 | 857 | |
| 887 | 858 | /* The WS field. */ |
| 888 | 859 | #define WS EVUIMM_8 + 1 |
| 889 | -#define WS_MASK (0x7 << 11) | |
| 890 | - { 3, 11, NULL, NULL, 0 }, | |
| 860 | + { 0x7, 11, NULL, NULL, 0 }, | |
| 861 | + | |
| 862 | + /* The L field in an mtmsrd or A form instruction or W in an X form. */ | |
| 863 | +#define A_L WS + 1 | |
| 864 | +#define W A_L | |
| 865 | + { 0x1, 16, NULL, NULL, PPC_OPERAND_OPTIONAL }, | |
| 866 | + | |
| 867 | +#define RMC A_L + 1 | |
| 868 | + { 0x3, 9, NULL, NULL, 0 }, | |
| 869 | + | |
| 870 | +#define R RMC + 1 | |
| 871 | + { 0x1, 16, NULL, NULL, 0 }, | |
| 891 | 872 | |
| 892 | - /* The L field in an mtmsrd instruction */ | |
| 893 | -#define MTMSRD_L WS + 1 | |
| 894 | - { 1, 16, NULL, NULL, PPC_OPERAND_OPTIONAL }, | |
| 873 | +#define SP R + 1 | |
| 874 | + { 0x3, 19, NULL, NULL, 0 }, | |
| 895 | 875 | |
| 876 | +#define S SP + 1 | |
| 877 | + { 0x1, 20, NULL, NULL, 0 }, | |
| 878 | + | |
| 879 | + /* SH field starting at bit position 16. */ | |
| 880 | +#define SH16 S + 1 | |
| 881 | + /* The DCM and DGM fields in a Z form instruction. */ | |
| 882 | +#define DCM SH16 | |
| 883 | +#define DGM DCM | |
| 884 | + { 0x3f, 10, NULL, NULL, 0 }, | |
| 885 | + | |
| 886 | + /* The EH field in larx instruction. */ | |
| 887 | +#define EH SH16 + 1 | |
| 888 | + { 0x1, 0, NULL, NULL, PPC_OPERAND_OPTIONAL }, | |
| 889 | + | |
| 890 | + /* The L field in an mtfsf or XFL form instruction. */ | |
| 891 | +#define XFL_L EH + 1 | |
| 892 | + { 0x1, 25, NULL, NULL, PPC_OPERAND_OPTIONAL}, | |
| 896 | 893 | }; |
| 897 | 894 | |
| 895 | +const unsigned int num_powerpc_operands = (sizeof (powerpc_operands) | |
| 896 | + / sizeof (powerpc_operands[0])); | |
| 897 | + | |
| 898 | 898 | /* The functions used to insert and extract complicated operands. */ |
| 899 | 899 | |
| 900 | 900 | /* The BA field in an XL form instruction when it must be the same as |
| ... | ... | @@ -947,26 +947,6 @@ extract_bba (unsigned long insn, |
| 947 | 947 | return 0; |
| 948 | 948 | } |
| 949 | 949 | |
| 950 | -/* The BD field in a B form instruction. The lower two bits are | |
| 951 | - forced to zero. */ | |
| 952 | - | |
| 953 | -static unsigned long | |
| 954 | -insert_bd (unsigned long insn, | |
| 955 | - long value, | |
| 956 | - int dialect ATTRIBUTE_UNUSED, | |
| 957 | - const char **errmsg ATTRIBUTE_UNUSED) | |
| 958 | -{ | |
| 959 | - return insn | (value & 0xfffc); | |
| 960 | -} | |
| 961 | - | |
| 962 | -static long | |
| 963 | -extract_bd (unsigned long insn, | |
| 964 | - int dialect ATTRIBUTE_UNUSED, | |
| 965 | - int *invalid ATTRIBUTE_UNUSED) | |
| 966 | -{ | |
| 967 | - return ((insn & 0xfffc) ^ 0x8000) - 0x8000; | |
| 968 | -} | |
| 969 | - | |
| 970 | 950 | /* The BD field in a B form instruction when the - modifier is used. |
| 971 | 951 | This modifier means that the branch is not expected to be taken. |
| 972 | 952 | For chips built to versions of the architecture prior to version 2 |
| ... | ... | @@ -978,7 +958,11 @@ extract_bd (unsigned long insn, |
| 978 | 958 | the "y" bit. "at" == 00 => no hint, "at" == 01 => unpredictable, |
| 979 | 959 | "at" == 10 => not taken, "at" == 11 => taken. The "t" bit is 00001 |
| 980 | 960 | in BO field, the "a" bit is 00010 for branch on CR(BI) and 01000 |
| 981 | - for branch on CTR. We only handle the taken/not-taken hint here. */ | |
| 961 | + for branch on CTR. We only handle the taken/not-taken hint here. | |
| 962 | + Note that we don't relax the conditions tested here when | |
| 963 | + disassembling with -Many because insns using extract_bdm and | |
| 964 | + extract_bdp always occur in pairs. One or the other will always | |
| 965 | + be valid. */ | |
| 982 | 966 | |
| 983 | 967 | static unsigned long |
| 984 | 968 | insert_bdm (unsigned long insn, |
| ... | ... | @@ -1069,10 +1053,11 @@ extract_bdp (unsigned long insn, |
| 1069 | 1053 | /* Check for legal values of a BO field. */ |
| 1070 | 1054 | |
| 1071 | 1055 | static int |
| 1072 | -valid_bo (long value, int dialect) | |
| 1056 | +valid_bo (long value, int dialect, int extract) | |
| 1073 | 1057 | { |
| 1074 | 1058 | if ((dialect & PPC_OPCODE_POWER4) == 0) |
| 1075 | 1059 | { |
| 1060 | + int valid; | |
| 1076 | 1061 | /* Certain encodings have bits that are required to be zero. |
| 1077 | 1062 | These are (z must be zero, y may be anything): |
| 1078 | 1063 | 001zy |
| ... | ... | @@ -1085,36 +1070,43 @@ valid_bo (long value, int dialect) |
| 1085 | 1070 | { |
| 1086 | 1071 | default: |
| 1087 | 1072 | case 0: |
| 1088 | - return 1; | |
| 1073 | + valid = 1; | |
| 1074 | + break; | |
| 1089 | 1075 | case 0x4: |
| 1090 | - return (value & 0x2) == 0; | |
| 1076 | + valid = (value & 0x2) == 0; | |
| 1077 | + break; | |
| 1091 | 1078 | case 0x10: |
| 1092 | - return (value & 0x8) == 0; | |
| 1079 | + valid = (value & 0x8) == 0; | |
| 1080 | + break; | |
| 1093 | 1081 | case 0x14: |
| 1094 | - return value == 0x14; | |
| 1082 | + valid = value == 0x14; | |
| 1083 | + break; | |
| 1095 | 1084 | } |
| 1085 | + /* When disassembling with -Many, accept power4 encodings too. */ | |
| 1086 | + if (valid | |
| 1087 | + || (dialect & PPC_OPCODE_ANY) == 0 | |
| 1088 | + || !extract) | |
| 1089 | + return valid; | |
| 1096 | 1090 | } |
| 1091 | + | |
| 1092 | + /* Certain encodings have bits that are required to be zero. | |
| 1093 | + These are (z must be zero, a & t may be anything): | |
| 1094 | + 0000z | |
| 1095 | + 0001z | |
| 1096 | + 0100z | |
| 1097 | + 0101z | |
| 1098 | + 001at | |
| 1099 | + 011at | |
| 1100 | + 1a00t | |
| 1101 | + 1a01t | |
| 1102 | + 1z1zz | |
| 1103 | + */ | |
| 1104 | + if ((value & 0x14) == 0) | |
| 1105 | + return (value & 0x1) == 0; | |
| 1106 | + else if ((value & 0x14) == 0x14) | |
| 1107 | + return value == 0x14; | |
| 1097 | 1108 | else |
| 1098 | - { | |
| 1099 | - /* Certain encodings have bits that are required to be zero. | |
| 1100 | - These are (z must be zero, a & t may be anything): | |
| 1101 | - 0000z | |
| 1102 | - 0001z | |
| 1103 | - 0100z | |
| 1104 | - 0101z | |
| 1105 | - 001at | |
| 1106 | - 011at | |
| 1107 | - 1a00t | |
| 1108 | - 1a01t | |
| 1109 | - 1z1zz | |
| 1110 | - */ | |
| 1111 | - if ((value & 0x14) == 0) | |
| 1112 | - return (value & 0x1) == 0; | |
| 1113 | - else if ((value & 0x14) == 0x14) | |
| 1114 | - return value == 0x14; | |
| 1115 | - else | |
| 1116 | - return 1; | |
| 1117 | - } | |
| 1109 | + return 1; | |
| 1118 | 1110 | } |
| 1119 | 1111 | |
| 1120 | 1112 | /* The BO field in a B form instruction. Warn about attempts to set |
| ... | ... | @@ -1126,7 +1118,7 @@ insert_bo (unsigned long insn, |
| 1126 | 1118 | int dialect, |
| 1127 | 1119 | const char **errmsg) |
| 1128 | 1120 | { |
| 1129 | - if (!valid_bo (value, dialect)) | |
| 1121 | + if (!valid_bo (value, dialect, 0)) | |
| 1130 | 1122 | *errmsg = _("invalid conditional option"); |
| 1131 | 1123 | return insn | ((value & 0x1f) << 21); |
| 1132 | 1124 | } |
| ... | ... | @@ -1139,7 +1131,7 @@ extract_bo (unsigned long insn, |
| 1139 | 1131 | long value; |
| 1140 | 1132 | |
| 1141 | 1133 | value = (insn >> 21) & 0x1f; |
| 1142 | - if (!valid_bo (value, dialect)) | |
| 1134 | + if (!valid_bo (value, dialect, 1)) | |
| 1143 | 1135 | *invalid = 1; |
| 1144 | 1136 | return value; |
| 1145 | 1137 | } |
| ... | ... | @@ -1154,7 +1146,7 @@ insert_boe (unsigned long insn, |
| 1154 | 1146 | int dialect, |
| 1155 | 1147 | const char **errmsg) |
| 1156 | 1148 | { |
| 1157 | - if (!valid_bo (value, dialect)) | |
| 1149 | + if (!valid_bo (value, dialect, 0)) | |
| 1158 | 1150 | *errmsg = _("invalid conditional option"); |
| 1159 | 1151 | else if ((value & 1) != 0) |
| 1160 | 1152 | *errmsg = _("attempt to set y bit when using + or - modifier"); |
| ... | ... | @@ -1170,162 +1162,11 @@ extract_boe (unsigned long insn, |
| 1170 | 1162 | long value; |
| 1171 | 1163 | |
| 1172 | 1164 | value = (insn >> 21) & 0x1f; |
| 1173 | - if (!valid_bo (value, dialect)) | |
| 1165 | + if (!valid_bo (value, dialect, 1)) | |
| 1174 | 1166 | *invalid = 1; |
| 1175 | 1167 | return value & 0x1e; |
| 1176 | 1168 | } |
| 1177 | 1169 | |
| 1178 | -/* The DQ field in a DQ form instruction. This is like D, but the | |
| 1179 | - lower four bits are forced to zero. */ | |
| 1180 | - | |
| 1181 | -static unsigned long | |
| 1182 | -insert_dq (unsigned long insn, | |
| 1183 | - long value, | |
| 1184 | - int dialect ATTRIBUTE_UNUSED, | |
| 1185 | - const char **errmsg) | |
| 1186 | -{ | |
| 1187 | - if ((value & 0xf) != 0) | |
| 1188 | - *errmsg = _("offset not a multiple of 16"); | |
| 1189 | - return insn | (value & 0xfff0); | |
| 1190 | -} | |
| 1191 | - | |
| 1192 | -static long | |
| 1193 | -extract_dq (unsigned long insn, | |
| 1194 | - int dialect ATTRIBUTE_UNUSED, | |
| 1195 | - int *invalid ATTRIBUTE_UNUSED) | |
| 1196 | -{ | |
| 1197 | - return ((insn & 0xfff0) ^ 0x8000) - 0x8000; | |
| 1198 | -} | |
| 1199 | - | |
| 1200 | -static unsigned long | |
| 1201 | -insert_ev2 (unsigned long insn, | |
| 1202 | - long value, | |
| 1203 | - int dialect ATTRIBUTE_UNUSED, | |
| 1204 | - const char **errmsg) | |
| 1205 | -{ | |
| 1206 | - if ((value & 1) != 0) | |
| 1207 | - *errmsg = _("offset not a multiple of 2"); | |
| 1208 | - if ((value > 62) != 0) | |
| 1209 | - *errmsg = _("offset greater than 62"); | |
| 1210 | - return insn | ((value & 0x3e) << 10); | |
| 1211 | -} | |
| 1212 | - | |
| 1213 | -static long | |
| 1214 | -extract_ev2 (unsigned long insn, | |
| 1215 | - int dialect ATTRIBUTE_UNUSED, | |
| 1216 | - int *invalid ATTRIBUTE_UNUSED) | |
| 1217 | -{ | |
| 1218 | - return (insn >> 10) & 0x3e; | |
| 1219 | -} | |
| 1220 | - | |
| 1221 | -static unsigned long | |
| 1222 | -insert_ev4 (unsigned long insn, | |
| 1223 | - long value, | |
| 1224 | - int dialect ATTRIBUTE_UNUSED, | |
| 1225 | - const char **errmsg) | |
| 1226 | -{ | |
| 1227 | - if ((value & 3) != 0) | |
| 1228 | - *errmsg = _("offset not a multiple of 4"); | |
| 1229 | - if ((value > 124) != 0) | |
| 1230 | - *errmsg = _("offset greater than 124"); | |
| 1231 | - return insn | ((value & 0x7c) << 9); | |
| 1232 | -} | |
| 1233 | - | |
| 1234 | -static long | |
| 1235 | -extract_ev4 (unsigned long insn, | |
| 1236 | - int dialect ATTRIBUTE_UNUSED, | |
| 1237 | - int *invalid ATTRIBUTE_UNUSED) | |
| 1238 | -{ | |
| 1239 | - return (insn >> 9) & 0x7c; | |
| 1240 | -} | |
| 1241 | - | |
| 1242 | -static unsigned long | |
| 1243 | -insert_ev8 (unsigned long insn, | |
| 1244 | - long value, | |
| 1245 | - int dialect ATTRIBUTE_UNUSED, | |
| 1246 | - const char **errmsg) | |
| 1247 | -{ | |
| 1248 | - if ((value & 7) != 0) | |
| 1249 | - *errmsg = _("offset not a multiple of 8"); | |
| 1250 | - if ((value > 248) != 0) | |
| 1251 | - *errmsg = _("offset greater than 248"); | |
| 1252 | - return insn | ((value & 0xf8) << 8); | |
| 1253 | -} | |
| 1254 | - | |
| 1255 | -static long | |
| 1256 | -extract_ev8 (unsigned long insn, | |
| 1257 | - int dialect ATTRIBUTE_UNUSED, | |
| 1258 | - int *invalid ATTRIBUTE_UNUSED) | |
| 1259 | -{ | |
| 1260 | - return (insn >> 8) & 0xf8; | |
| 1261 | -} | |
| 1262 | - | |
| 1263 | -/* The DS field in a DS form instruction. This is like D, but the | |
| 1264 | - lower two bits are forced to zero. */ | |
| 1265 | - | |
| 1266 | -static unsigned long | |
| 1267 | -insert_ds (unsigned long insn, | |
| 1268 | - long value, | |
| 1269 | - int dialect ATTRIBUTE_UNUSED, | |
| 1270 | - const char **errmsg) | |
| 1271 | -{ | |
| 1272 | - if ((value & 3) != 0) | |
| 1273 | - *errmsg = _("offset not a multiple of 4"); | |
| 1274 | - return insn | (value & 0xfffc); | |
| 1275 | -} | |
| 1276 | - | |
| 1277 | -static long | |
| 1278 | -extract_ds (unsigned long insn, | |
| 1279 | - int dialect ATTRIBUTE_UNUSED, | |
| 1280 | - int *invalid ATTRIBUTE_UNUSED) | |
| 1281 | -{ | |
| 1282 | - return ((insn & 0xfffc) ^ 0x8000) - 0x8000; | |
| 1283 | -} | |
| 1284 | - | |
| 1285 | -/* The DE field in a DE form instruction. */ | |
| 1286 | - | |
| 1287 | -static unsigned long | |
| 1288 | -insert_de (unsigned long insn, | |
| 1289 | - long value, | |
| 1290 | - int dialect ATTRIBUTE_UNUSED, | |
| 1291 | - const char **errmsg) | |
| 1292 | -{ | |
| 1293 | - if (value > 2047 || value < -2048) | |
| 1294 | - *errmsg = _("offset not between -2048 and 2047"); | |
| 1295 | - return insn | ((value << 4) & 0xfff0); | |
| 1296 | -} | |
| 1297 | - | |
| 1298 | -static long | |
| 1299 | -extract_de (unsigned long insn, | |
| 1300 | - int dialect ATTRIBUTE_UNUSED, | |
| 1301 | - int *invalid ATTRIBUTE_UNUSED) | |
| 1302 | -{ | |
| 1303 | - return (insn & 0xfff0) >> 4; | |
| 1304 | -} | |
| 1305 | - | |
| 1306 | -/* The DES field in a DES form instruction. */ | |
| 1307 | - | |
| 1308 | -static unsigned long | |
| 1309 | -insert_des (unsigned long insn, | |
| 1310 | - long value, | |
| 1311 | - int dialect ATTRIBUTE_UNUSED, | |
| 1312 | - const char **errmsg) | |
| 1313 | -{ | |
| 1314 | - if (value > 8191 || value < -8192) | |
| 1315 | - *errmsg = _("offset not between -8192 and 8191"); | |
| 1316 | - else if ((value & 3) != 0) | |
| 1317 | - *errmsg = _("offset not a multiple of 4"); | |
| 1318 | - return insn | ((value << 2) & 0xfff0); | |
| 1319 | -} | |
| 1320 | - | |
| 1321 | -static long | |
| 1322 | -extract_des (unsigned long insn, | |
| 1323 | - int dialect ATTRIBUTE_UNUSED, | |
| 1324 | - int *invalid ATTRIBUTE_UNUSED) | |
| 1325 | -{ | |
| 1326 | - return (((insn >> 2) & 0x3ffc) ^ 0x2000) - 0x2000; | |
| 1327 | -} | |
| 1328 | - | |
| 1329 | 1170 | /* FXM mask in mfcr and mtcrf instructions. */ |
| 1330 | 1171 | |
| 1331 | 1172 | static unsigned long |
| ... | ... | @@ -1398,28 +1239,6 @@ extract_fxm (unsigned long insn, |
| 1398 | 1239 | return mask; |
| 1399 | 1240 | } |
| 1400 | 1241 | |
| 1401 | -/* The LI field in an I form instruction. The lower two bits are | |
| 1402 | - forced to zero. */ | |
| 1403 | - | |
| 1404 | -static unsigned long | |
| 1405 | -insert_li (unsigned long insn, | |
| 1406 | - long value, | |
| 1407 | - int dialect ATTRIBUTE_UNUSED, | |
| 1408 | - const char **errmsg) | |
| 1409 | -{ | |
| 1410 | - if ((value & 3) != 0) | |
| 1411 | - *errmsg = _("ignoring least significant bits in branch offset"); | |
| 1412 | - return insn | (value & 0x3fffffc); | |
| 1413 | -} | |
| 1414 | - | |
| 1415 | -static long | |
| 1416 | -extract_li (unsigned long insn, | |
| 1417 | - int dialect ATTRIBUTE_UNUSED, | |
| 1418 | - int *invalid ATTRIBUTE_UNUSED) | |
| 1419 | -{ | |
| 1420 | - return ((insn & 0x3fffffc) ^ 0x2000000) - 0x2000000; | |
| 1421 | -} | |
| 1422 | - | |
| 1423 | 1242 | /* The MB and ME fields in an M form instruction expressed as a single |
| 1424 | 1243 | operand which is itself a bitmask. The extraction function always |
| 1425 | 1244 | marks it as invalid, since we never want to recognize an |
| ... | ... | @@ -1531,19 +1350,6 @@ extract_mb6 (unsigned long insn, |
| 1531 | 1350 | /* The NB field in an X form instruction. The value 32 is stored as |
| 1532 | 1351 | 0. */ |
| 1533 | 1352 | |
| 1534 | -static unsigned long | |
| 1535 | -insert_nb (unsigned long insn, | |
| 1536 | - long value, | |
| 1537 | - int dialect ATTRIBUTE_UNUSED, | |
| 1538 | - const char **errmsg) | |
| 1539 | -{ | |
| 1540 | - if (value < 0 || value > 32) | |
| 1541 | - *errmsg = _("value out of range"); | |
| 1542 | - if (value == 32) | |
| 1543 | - value = 0; | |
| 1544 | - return insn | ((value & 0x1f) << 11); | |
| 1545 | -} | |
| 1546 | - | |
| 1547 | 1353 | static long |
| 1548 | 1354 | extract_nb (unsigned long insn, |
| 1549 | 1355 | int dialect ATTRIBUTE_UNUSED, |
| ... | ... | @@ -1666,34 +1472,6 @@ extract_rbs (unsigned long insn, |
| 1666 | 1472 | return 0; |
| 1667 | 1473 | } |
| 1668 | 1474 | |
| 1669 | -/* The RT field of the DQ form lq instruction, which has special | |
| 1670 | - value restrictions. */ | |
| 1671 | - | |
| 1672 | -static unsigned long | |
| 1673 | -insert_rtq (unsigned long insn, | |
| 1674 | - long value, | |
| 1675 | - int dialect ATTRIBUTE_UNUSED, | |
| 1676 | - const char **errmsg) | |
| 1677 | -{ | |
| 1678 | - if ((value & 1) != 0) | |
| 1679 | - *errmsg = _("target register operand must be even"); | |
| 1680 | - return insn | ((value & 0x1f) << 21); | |
| 1681 | -} | |
| 1682 | - | |
| 1683 | -/* The RS field of the DS form stq instruction, which has special | |
| 1684 | - value restrictions. */ | |
| 1685 | - | |
| 1686 | -static unsigned long | |
| 1687 | -insert_rsq (unsigned long insn, | |
| 1688 | - long value ATTRIBUTE_UNUSED, | |
| 1689 | - int dialect ATTRIBUTE_UNUSED, | |
| 1690 | - const char **errmsg) | |
| 1691 | -{ | |
| 1692 | - if ((value & 1) != 0) | |
| 1693 | - *errmsg = _("source register operand must be even"); | |
| 1694 | - return insn | ((value & 0x1f) << 21); | |
| 1695 | -} | |
| 1696 | - | |
| 1697 | 1475 | /* The SH field in an MD form instruction. This is split. */ |
| 1698 | 1476 | |
| 1699 | 1477 | static unsigned long |
| ... | ... | @@ -1839,6 +1617,9 @@ extract_tbr (unsigned long insn, |
| 1839 | 1617 | /* An A_MASK with the FRA and FRC fields fixed. */ |
| 1840 | 1618 | #define AFRAFRC_MASK (A_MASK | FRA_MASK | FRC_MASK) |
| 1841 | 1619 | |
| 1620 | +/* An AFRAFRC_MASK, but with L bit clear. */ | |
| 1621 | +#define AFRALFRC_MASK (AFRAFRC_MASK & ~((unsigned long) 1 << 16)) | |
| 1622 | + | |
| 1842 | 1623 | /* A B form instruction. */ |
| 1843 | 1624 | #define B(op, aa, lk) (OP (op) | ((((unsigned long)(aa)) & 1) << 1) | ((lk) & 1)) |
| 1844 | 1625 | #define B_MASK B (0x3f, 1, 1) |
| ... | ... | @@ -1949,21 +1730,37 @@ extract_tbr (unsigned long insn, |
| 1949 | 1730 | /* An X form instruction. */ |
| 1950 | 1731 | #define X(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x3ff) << 1)) |
| 1951 | 1732 | |
| 1733 | +/* A Z form instruction. */ | |
| 1734 | +#define Z(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x1ff) << 1)) | |
| 1735 | + | |
| 1952 | 1736 | /* An X form instruction with the RC bit specified. */ |
| 1953 | 1737 | #define XRC(op, xop, rc) (X ((op), (xop)) | ((rc) & 1)) |
| 1954 | 1738 | |
| 1739 | +/* A Z form instruction with the RC bit specified. */ | |
| 1740 | +#define ZRC(op, xop, rc) (Z ((op), (xop)) | ((rc) & 1)) | |
| 1741 | + | |
| 1955 | 1742 | /* The mask for an X form instruction. */ |
| 1956 | 1743 | #define X_MASK XRC (0x3f, 0x3ff, 1) |
| 1957 | 1744 | |
| 1745 | +/* The mask for a Z form instruction. */ | |
| 1746 | +#define Z_MASK ZRC (0x3f, 0x1ff, 1) | |
| 1747 | +#define Z2_MASK ZRC (0x3f, 0xff, 1) | |
| 1748 | + | |
| 1958 | 1749 | /* An X_MASK with the RA field fixed. */ |
| 1959 | 1750 | #define XRA_MASK (X_MASK | RA_MASK) |
| 1960 | 1751 | |
| 1752 | +/* An XRA_MASK with the W field clear. */ | |
| 1753 | +#define XWRA_MASK (XRA_MASK & ~((unsigned long) 1 << 16)) | |
| 1754 | + | |
| 1961 | 1755 | /* An X_MASK with the RB field fixed. */ |
| 1962 | 1756 | #define XRB_MASK (X_MASK | RB_MASK) |
| 1963 | 1757 | |
| 1964 | 1758 | /* An X_MASK with the RT field fixed. */ |
| 1965 | 1759 | #define XRT_MASK (X_MASK | RT_MASK) |
| 1966 | 1760 | |
| 1761 | +/* An XRT_MASK mask with the L bits clear. */ | |
| 1762 | +#define XLRT_MASK (XRT_MASK & ~((unsigned long) 0x3 << 21)) | |
| 1763 | + | |
| 1967 | 1764 | /* An X_MASK with the RA and RB fields fixed. */ |
| 1968 | 1765 | #define XRARB_MASK (X_MASK | RA_MASK | RB_MASK) |
| 1969 | 1766 | |
| ... | ... | @@ -2000,13 +1797,16 @@ extract_tbr (unsigned long insn, |
| 2000 | 1797 | /* An X form sync instruction with everything filled in except the LS field. */ |
| 2001 | 1798 | #define XSYNC_MASK (0xff9fffff) |
| 2002 | 1799 | |
| 1800 | +/* An X_MASK, but with the EH bit clear. */ | |
| 1801 | +#define XEH_MASK (X_MASK & ~((unsigned long )1)) | |
| 1802 | + | |
| 2003 | 1803 | /* An X form AltiVec dss instruction. */ |
| 2004 | 1804 | #define XDSS(op, xop, a) (X ((op), (xop)) | ((((unsigned long)(a)) & 1) << 25)) |
| 2005 | 1805 | #define XDSS_MASK XDSS(0x3f, 0x3ff, 1) |
| 2006 | 1806 | |
| 2007 | 1807 | /* An XFL form instruction. */ |
| 2008 | 1808 | #define XFL(op, xop, rc) (OP (op) | ((((unsigned long)(xop)) & 0x3ff) << 1) | (((unsigned long)(rc)) & 1)) |
| 2009 | -#define XFL_MASK (XFL (0x3f, 0x3ff, 1) | (((unsigned long)1) << 25) | (((unsigned long)1) << 16)) | |
| 1809 | +#define XFL_MASK XFL (0x3f, 0x3ff, 1) | |
| 2010 | 1810 | |
| 2011 | 1811 | /* An X form isel instruction. */ |
| 2012 | 1812 | #define XISEL(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x1f) << 1)) |
| ... | ... | @@ -2082,7 +1882,7 @@ extract_tbr (unsigned long insn, |
| 2082 | 1882 | |
| 2083 | 1883 | /* An XFX form instruction with the SPR field filled in except for the |
| 2084 | 1884 | SPRG field. */ |
| 2085 | -#define XSPRG_MASK (XSPR_MASK & ~(0x17 << 16)) | |
| 1885 | +#define XSPRG_MASK (XSPR_MASK & ~(0x1f << 16)) | |
| 2086 | 1886 | |
| 2087 | 1887 | /* An X form instruction with everything filled in except the E field. */ |
| 2088 | 1888 | #define XE_MASK (0xffff7fff) |
| ... | ... | @@ -2153,6 +1953,8 @@ extract_tbr (unsigned long insn, |
| 2153 | 1953 | #define NOPOWER4 PPC_OPCODE_NOPOWER4 | PPCCOM |
| 2154 | 1954 | #define POWER4 PPC_OPCODE_POWER4 |
| 2155 | 1955 | #define POWER5 PPC_OPCODE_POWER5 |
| 1956 | +#define POWER6 PPC_OPCODE_POWER6 | |
| 1957 | +#define CELL PPC_OPCODE_CELL | |
| 2156 | 1958 | #define PPC32 PPC_OPCODE_32 | PPC_OPCODE_PPC |
| 2157 | 1959 | #define PPC64 PPC_OPCODE_64 | PPC_OPCODE_PPC |
| 2158 | 1960 | #define PPC403 PPC_OPCODE_403 |
| ... | ... | @@ -3344,16 +3146,23 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 3344 | 3146 | |
| 3345 | 3147 | { "crand", XL(19,257), XL_MASK, COM, { BT, BA, BB } }, |
| 3346 | 3148 | |
| 3347 | -{ "hrfid", XL(19,274), 0xffffffff, POWER5, { 0 } }, | |
| 3149 | +{ "hrfid", XL(19,274), 0xffffffff, POWER5 | CELL, { 0 } }, | |
| 3348 | 3150 | |
| 3349 | 3151 | { "crset", XL(19,289), XL_MASK, PPCCOM, { BT, BAT, BBA } }, |
| 3350 | 3152 | { "creqv", XL(19,289), XL_MASK, COM, { BT, BA, BB } }, |
| 3351 | 3153 | |
| 3154 | +{ "doze", XL(19,402), 0xffffffff, POWER6, { 0 } }, | |
| 3155 | + | |
| 3352 | 3156 | { "crorc", XL(19,417), XL_MASK, COM, { BT, BA, BB } }, |
| 3353 | 3157 | |
| 3158 | +{ "nap", XL(19,434), 0xffffffff, POWER6, { 0 } }, | |
| 3159 | + | |
| 3354 | 3160 | { "crmove", XL(19,449), XL_MASK, PPCCOM, { BT, BA, BBA } }, |
| 3355 | 3161 | { "cror", XL(19,449), XL_MASK, COM, { BT, BA, BB } }, |
| 3356 | 3162 | |
| 3163 | +{ "sleep", XL(19,466), 0xffffffff, POWER6, { 0 } }, | |
| 3164 | +{ "rvwinkle", XL(19,498), 0xffffffff, POWER6, { 0 } }, | |
| 3165 | + | |
| 3357 | 3166 | { "bctr", XLO(19,BOU,528,0), XLBOBIBB_MASK, COM, { 0 } }, |
| 3358 | 3167 | { "bctrl", XLO(19,BOU,528,1), XLBOBIBB_MASK, COM, { 0 } }, |
| 3359 | 3168 | { "bltctr", XLOCB(19,BOT,CBLT,528,0), XLBOCBBB_MASK, PPCCOM, { CR } }, |
| ... | ... | @@ -3504,8 +3313,8 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 3504 | 3313 | { "bcctrl", XLLK(19,528,1), XLBH_MASK, PPCCOM, { BO, BI, BH } }, |
| 3505 | 3314 | { "bcc", XLLK(19,528,0), XLBB_MASK, PWRCOM, { BO, BI } }, |
| 3506 | 3315 | { "bccl", XLLK(19,528,1), XLBB_MASK, PWRCOM, { BO, BI } }, |
| 3507 | -{ "bcctre", XLLK(19,529,0), XLYBB_MASK, BOOKE64, { BO, BI } }, | |
| 3508 | -{ "bcctrel", XLLK(19,529,1), XLYBB_MASK, BOOKE64, { BO, BI } }, | |
| 3316 | +{ "bcctre", XLLK(19,529,0), XLBB_MASK, BOOKE64, { BO, BI } }, | |
| 3317 | +{ "bcctrel", XLLK(19,529,1), XLBB_MASK, BOOKE64, { BO, BI } }, | |
| 3509 | 3318 | |
| 3510 | 3319 | { "rlwimi", M(20,0), M_MASK, PPCCOM, { RA,RS,SH,MBE,ME } }, |
| 3511 | 3320 | { "rlimi", M(20,0), M_MASK, PWRCOM, { RA,RS,SH,MBE,ME } }, |
| ... | ... | @@ -3651,10 +3460,10 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 3651 | 3460 | { "isel", XISEL(31,15), XISEL_MASK, PPCISEL, { RT, RA, RB, CRB } }, |
| 3652 | 3461 | |
| 3653 | 3462 | { "mfocrf", XFXM(31,19,0,1), XFXFXM_MASK, COM, { RT, FXM } }, |
| 3654 | -{ "mfcr", X(31,19), XRARB_MASK, NOPOWER4, { RT } }, | |
| 3463 | +{ "mfcr", X(31,19), XRARB_MASK, NOPOWER4 | COM, { RT } }, | |
| 3655 | 3464 | { "mfcr", X(31,19), XFXFXM_MASK, POWER4, { RT, FXM4 } }, |
| 3656 | 3465 | |
| 3657 | -{ "lwarx", X(31,20), X_MASK, PPC, { RT, RA0, RB } }, | |
| 3466 | +{ "lwarx", X(31,20), XEH_MASK, PPC, { RT, RA0, RB, EH } }, | |
| 3658 | 3467 | |
| 3659 | 3468 | { "ldx", X(31,21), X_MASK, PPC64, { RT, RA0, RB } }, |
| 3660 | 3469 | |
| ... | ... | @@ -3747,9 +3556,10 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 3747 | 3556 | |
| 3748 | 3557 | { "mfmsr", X(31,83), XRARB_MASK, COM, { RT } }, |
| 3749 | 3558 | |
| 3750 | -{ "ldarx", X(31,84), X_MASK, PPC64, { RT, RA0, RB } }, | |
| 3559 | +{ "ldarx", X(31,84), XEH_MASK, PPC64, { RT, RA0, RB, EH } }, | |
| 3751 | 3560 | |
| 3752 | -{ "dcbf", X(31,86), XRT_MASK, PPC, { RA, RB } }, | |
| 3561 | +{ "dcbfl", XOPL(31,86,1), XRT_MASK, POWER5, { RA, RB } }, | |
| 3562 | +{ "dcbf", X(31,86), XLRT_MASK, PPC, { RA, RB, L } }, | |
| 3753 | 3563 | |
| 3754 | 3564 | { "lbzx", X(31,87), X_MASK, COM, { RT, RA0, RB } }, |
| 3755 | 3565 | |
| ... | ... | @@ -3831,12 +3641,14 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 3831 | 3641 | { "sle", XRC(31,153,0), X_MASK, M601, { RA, RS, RB } }, |
| 3832 | 3642 | { "sle.", XRC(31,153,1), X_MASK, M601, { RA, RS, RB } }, |
| 3833 | 3643 | |
| 3644 | +{ "prtyw", X(31,154), XRB_MASK, POWER6, { RA, RS } }, | |
| 3645 | + | |
| 3834 | 3646 | { "wrteei", X(31,163), XE_MASK, PPC403 | BOOKE, { E } }, |
| 3835 | 3647 | |
| 3836 | 3648 | { "dcbtls", X(31,166), X_MASK, PPCCHLK, { CT, RA, RB }}, |
| 3837 | 3649 | { "dcbtlse", X(31,174), X_MASK, PPCCHLK64, { CT, RA, RB }}, |
| 3838 | 3650 | |
| 3839 | -{ "mtmsrd", X(31,178), XRLARB_MASK, PPC64, { RS, MTMSRD_L } }, | |
| 3651 | +{ "mtmsrd", X(31,178), XRLARB_MASK, PPC64, { RS, A_L } }, | |
| 3840 | 3652 | |
| 3841 | 3653 | { "stdux", X(31,181), X_MASK, PPC64, { RS, RAS, RB } }, |
| 3842 | 3654 | |
| ... | ... | @@ -3846,6 +3658,8 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 3846 | 3658 | { "sliq", XRC(31,184,0), X_MASK, M601, { RA, RS, SH } }, |
| 3847 | 3659 | { "sliq.", XRC(31,184,1), X_MASK, M601, { RA, RS, SH } }, |
| 3848 | 3660 | |
| 3661 | +{ "prtyd", X(31,186), XRB_MASK, POWER6, { RA, RS } }, | |
| 3662 | + | |
| 3849 | 3663 | { "stwuxe", X(31,191), X_MASK, BOOKE64, { RS, RAS, RB } }, |
| 3850 | 3664 | |
| 3851 | 3665 | { "subfze", XO(31,200,0,0), XORB_MASK, PPCCOM, { RT, RA } }, |
| ... | ... | @@ -3952,7 +3766,7 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 3952 | 3766 | { "lscbx", XRC(31,277,0), X_MASK, M601, { RT, RA, RB } }, |
| 3953 | 3767 | { "lscbx.", XRC(31,277,1), X_MASK, M601, { RT, RA, RB } }, |
| 3954 | 3768 | |
| 3955 | -{ "dcbt", X(31,278), X_MASK, PPC, { CT, RA, RB } }, | |
| 3769 | +{ "dcbt", X(31,278), X_MASK, PPC, { CT, RA, RB } }, | |
| 3956 | 3770 | |
| 3957 | 3771 | { "lhzx", X(31,279), X_MASK, COM, { RT, RA0, RB } }, |
| 3958 | 3772 | |
| ... | ... | @@ -4033,6 +3847,7 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4033 | 3847 | { "mfsdr1", XSPR(31,339,25), XSPR_MASK, COM, { RT } }, |
| 4034 | 3848 | { "mfsrr0", XSPR(31,339,26), XSPR_MASK, COM, { RT } }, |
| 4035 | 3849 | { "mfsrr1", XSPR(31,339,27), XSPR_MASK, COM, { RT } }, |
| 3850 | +{ "mfcfar", XSPR(31,339,28), XSPR_MASK, POWER6, { RT } }, | |
| 4036 | 3851 | { "mfpid", XSPR(31,339,48), XSPR_MASK, BOOKE, { RT } }, |
| 4037 | 3852 | { "mfpid", XSPR(31,339,945), XSPR_MASK, PPC403, { RT } }, |
| 4038 | 3853 | { "mfcsrr0", XSPR(31,339,58), XSPR_MASK, BOOKE, { RT } }, |
| ... | ... | @@ -4254,12 +4069,18 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4254 | 4069 | |
| 4255 | 4070 | { "sthx", X(31,407), X_MASK, COM, { RS, RA0, RB } }, |
| 4256 | 4071 | |
| 4072 | +{ "cmpb", X(31,508), X_MASK, POWER6, { RA, RS, RB } }, | |
| 4073 | + | |
| 4257 | 4074 | { "lfqx", X(31,791), X_MASK, POWER2, { FRT, RA, RB } }, |
| 4258 | 4075 | |
| 4076 | +{ "lfdpx", X(31,791), X_MASK, POWER6, { FRT, RA, RB } }, | |
| 4077 | + | |
| 4259 | 4078 | { "lfqux", X(31,823), X_MASK, POWER2, { FRT, RA, RB } }, |
| 4260 | 4079 | |
| 4261 | 4080 | { "stfqx", X(31,919), X_MASK, POWER2, { FRS, RA, RB } }, |
| 4262 | 4081 | |
| 4082 | +{ "stfdpx", X(31,919), X_MASK, POWER6, { FRS, RA, RB } }, | |
| 4083 | + | |
| 4263 | 4084 | { "stfqux", X(31,951), X_MASK, POWER2, { FRS, RA, RB } }, |
| 4264 | 4085 | |
| 4265 | 4086 | { "orc", XRC(31,412,0), X_MASK, COM, { RA, RS, RB } }, |
| ... | ... | @@ -4278,6 +4099,13 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4278 | 4099 | |
| 4279 | 4100 | { "sthuxe", X(31,447), X_MASK, BOOKE64, { RS, RAS, RB } }, |
| 4280 | 4101 | |
| 4102 | +{ "cctpl", 0x7c210b78, 0xffffffff, CELL, { 0 }}, | |
| 4103 | +{ "cctpm", 0x7c421378, 0xffffffff, CELL, { 0 }}, | |
| 4104 | +{ "cctph", 0x7c631b78, 0xffffffff, CELL, { 0 }}, | |
| 4105 | +{ "db8cyc", 0x7f9ce378, 0xffffffff, CELL, { 0 }}, | |
| 4106 | +{ "db10cyc", 0x7fbdeb78, 0xffffffff, CELL, { 0 }}, | |
| 4107 | +{ "db12cyc", 0x7fdef378, 0xffffffff, CELL, { 0 }}, | |
| 4108 | +{ "db16cyc", 0x7ffffb78, 0xffffffff, CELL, { 0 }}, | |
| 4281 | 4109 | { "mr", XRC(31,444,0), X_MASK, COM, { RA, RS, RBS } }, |
| 4282 | 4110 | { "or", XRC(31,444,0), X_MASK, COM, { RA, RS, RB } }, |
| 4283 | 4111 | { "mr.", XRC(31,444,1), X_MASK, COM, { RA, RS, RBS } }, |
| ... | ... | @@ -4349,6 +4177,7 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4349 | 4177 | { "mtsdr1", XSPR(31,467,25), XSPR_MASK, COM, { RS } }, |
| 4350 | 4178 | { "mtsrr0", XSPR(31,467,26), XSPR_MASK, COM, { RS } }, |
| 4351 | 4179 | { "mtsrr1", XSPR(31,467,27), XSPR_MASK, COM, { RS } }, |
| 4180 | +{ "mtcfar", XSPR(31,467,28), XSPR_MASK, POWER6, { RS } }, | |
| 4352 | 4181 | { "mtpid", XSPR(31,467,48), XSPR_MASK, BOOKE, { RS } }, |
| 4353 | 4182 | { "mtpid", XSPR(31,467,945), XSPR_MASK, PPC403, { RS } }, |
| 4354 | 4183 | { "mtdecar", XSPR(31,467,54), XSPR_MASK, BOOKE, { RS } }, |
| ... | ... | @@ -4536,6 +4365,8 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4536 | 4365 | |
| 4537 | 4366 | { "clcs", X(31,531), XRB_MASK, M601, { RT, RA } }, |
| 4538 | 4367 | |
| 4368 | +{ "ldbrx", X(31,532), X_MASK, CELL, { RT, RA0, RB } }, | |
| 4369 | + | |
| 4539 | 4370 | { "lswx", X(31,533), X_MASK, PPCCOM, { RT, RA0, RB } }, |
| 4540 | 4371 | { "lsx", X(31,533), X_MASK, PWRCOM, { RT, RA, RB } }, |
| 4541 | 4372 | |
| ... | ... | @@ -4585,6 +4416,8 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4585 | 4416 | |
| 4586 | 4417 | { "lfdxe", X(31,607), X_MASK, BOOKE64, { FRT, RA0, RB } }, |
| 4587 | 4418 | |
| 4419 | +{ "mffgpr", XRC(31,607,0), XRA_MASK, POWER6, { FRT, RB } }, | |
| 4420 | + | |
| 4588 | 4421 | { "mfsri", X(31,627), X_MASK, PWRCOM, { RT, RA, RB } }, |
| 4589 | 4422 | |
| 4590 | 4423 | { "dclst", X(31,630), XRB_MASK, PWRCOM, { RS, RA } }, |
| ... | ... | @@ -4595,6 +4428,8 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4595 | 4428 | |
| 4596 | 4429 | { "mfsrin", X(31,659), XRA_MASK, PPC32, { RT, RB } }, |
| 4597 | 4430 | |
| 4431 | +{ "stdbrx", X(31,660), X_MASK, CELL, { RS, RA0, RB } }, | |
| 4432 | + | |
| 4598 | 4433 | { "stswx", X(31,661), X_MASK, PPCCOM, { RS, RA0, RB } }, |
| 4599 | 4434 | { "stsx", X(31,661), X_MASK, PWRCOM, { RS, RA0, RB } }, |
| 4600 | 4435 | |
| ... | ... | @@ -4633,6 +4468,8 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4633 | 4468 | |
| 4634 | 4469 | { "stfdxe", X(31,735), X_MASK, BOOKE64, { FRS, RA0, RB } }, |
| 4635 | 4470 | |
| 4471 | +{ "mftgpr", XRC(31,735,0), XRA_MASK, POWER6, { RT, FRB } }, | |
| 4472 | + | |
| 4636 | 4473 | { "dcba", X(31,758), XRT_MASK, PPC405 | BOOKE, { RA, RB } }, |
| 4637 | 4474 | |
| 4638 | 4475 | { "stfdux", X(31,759), X_MASK, COM, { FRS, RAS, RB } }, |
| ... | ... | @@ -4647,6 +4484,8 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4647 | 4484 | { "tlbivax", X(31,786), XRT_MASK, BOOKE, { RA, RB } }, |
| 4648 | 4485 | { "tlbivaxe",X(31,787), XRT_MASK, BOOKE64, { RA, RB } }, |
| 4649 | 4486 | |
| 4487 | +{ "lwzcix", X(31,789), X_MASK, POWER6, { RT, RA0, RB } }, | |
| 4488 | + | |
| 4650 | 4489 | { "lhbrx", X(31,790), X_MASK, COM, { RT, RA0, RB } }, |
| 4651 | 4490 | |
| 4652 | 4491 | { "sraw", XRC(31,792,0), X_MASK, PPCCOM, { RA, RS, RB } }, |
| ... | ... | @@ -4664,6 +4503,8 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4664 | 4503 | |
| 4665 | 4504 | { "rac", X(31,818), X_MASK, PWRCOM, { RT, RA, RB } }, |
| 4666 | 4505 | |
| 4506 | +{ "lhzcix", X(31,821), X_MASK, POWER6, { RT, RA0, RB } }, | |
| 4507 | + | |
| 4667 | 4508 | { "dss", XDSS(31,822,0), XDSS_MASK, PPCVEC, { STRM } }, |
| 4668 | 4509 | { "dssall", XDSS(31,822,1), XDSS_MASK, PPCVEC, { 0 } }, |
| 4669 | 4510 | |
| ... | ... | @@ -4674,16 +4515,24 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4674 | 4515 | |
| 4675 | 4516 | { "slbmfev", X(31,851), XRA_MASK, PPC64, { RT, RB } }, |
| 4676 | 4517 | |
| 4518 | +{ "lbzcix", X(31,853), X_MASK, POWER6, { RT, RA0, RB } }, | |
| 4519 | + | |
| 4677 | 4520 | { "mbar", X(31,854), X_MASK, BOOKE, { MO } }, |
| 4678 | 4521 | { "eieio", X(31,854), 0xffffffff, PPC, { 0 } }, |
| 4679 | 4522 | |
| 4523 | +{ "lfiwax", X(31,855), X_MASK, POWER6, { FRT, RA0, RB } }, | |
| 4524 | + | |
| 4525 | +{ "ldcix", X(31,885), X_MASK, POWER6, { RT, RA0, RB } }, | |
| 4526 | + | |
| 4680 | 4527 | { "tlbsx", XRC(31,914,0), X_MASK, PPC403|BOOKE, { RTO, RA, RB } }, |
| 4681 | 4528 | { "tlbsx.", XRC(31,914,1), X_MASK, PPC403|BOOKE, { RTO, RA, RB } }, |
| 4682 | -{ "tlbsxe", XRC(31,915,0), X_MASK, BOOKE64, { RA, RB } }, | |
| 4683 | -{ "tlbsxe.", XRC(31,915,1), X_MASK, BOOKE64, { RA, RB } }, | |
| 4529 | +{ "tlbsxe", XRC(31,915,0), X_MASK, BOOKE64, { RTO, RA, RB } }, | |
| 4530 | +{ "tlbsxe.", XRC(31,915,1), X_MASK, BOOKE64, { RTO, RA, RB } }, | |
| 4684 | 4531 | |
| 4685 | 4532 | { "slbmfee", X(31,915), XRA_MASK, PPC64, { RT, RB } }, |
| 4686 | 4533 | |
| 4534 | +{ "stwcix", X(31,917), X_MASK, POWER6, { RS, RA0, RB } }, | |
| 4535 | + | |
| 4687 | 4536 | { "sthbrx", X(31,918), X_MASK, COM, { RS, RA0, RB } }, |
| 4688 | 4537 | |
| 4689 | 4538 | { "sraq", XRC(31,920,0), X_MASK, M601, { RA, RS, RB } }, |
| ... | ... | @@ -4705,6 +4554,8 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4705 | 4554 | { "tlbrelo", XTLB(31,946,1), XTLB_MASK, PPC403, { RT, RA } }, |
| 4706 | 4555 | { "tlbre", X(31,946), X_MASK, PPC403|BOOKE, { RSO, RAOPT, SHO } }, |
| 4707 | 4556 | |
| 4557 | +{ "sthcix", X(31,949), X_MASK, POWER6, { RS, RA0, RB } }, | |
| 4558 | + | |
| 4708 | 4559 | { "sraiq", XRC(31,952,0), X_MASK, M601, { RA, RS, SH } }, |
| 4709 | 4560 | { "sraiq.", XRC(31,952,1), X_MASK, M601, { RA, RS, SH } }, |
| 4710 | 4561 | |
| ... | ... | @@ -4720,6 +4571,8 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4720 | 4571 | { "tlbwe", X(31,978), X_MASK, PPC403|BOOKE, { RSO, RAOPT, SHO } }, |
| 4721 | 4572 | { "tlbld", X(31,978), XRTRA_MASK, PPC, { RB } }, |
| 4722 | 4573 | |
| 4574 | +{ "stbcix", X(31,981), X_MASK, POWER6, { RS, RA0, RB } }, | |
| 4575 | + | |
| 4723 | 4576 | { "icbi", X(31,982), XRT_MASK, PPC, { RA, RB } }, |
| 4724 | 4577 | |
| 4725 | 4578 | { "stfiwx", X(31,983), X_MASK, PPC, { FRS, RA0, RB } }, |
| ... | ... | @@ -4734,6 +4587,8 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4734 | 4587 | |
| 4735 | 4588 | { "tlbli", X(31,1010), XRTRA_MASK, PPC, { RB } }, |
| 4736 | 4589 | |
| 4590 | +{ "stdcix", X(31,1013), X_MASK, POWER6, { RS, RA0, RB } }, | |
| 4591 | + | |
| 4737 | 4592 | { "dcbzl", XOPL(31,1014,1), XRT_MASK,POWER4, { RA, RB } }, |
| 4738 | 4593 | { "dcbz", X(31,1014), XRT_MASK, PPC, { RA, RB } }, |
| 4739 | 4594 | { "dclz", X(31,1014), XRT_MASK, PPC, { RA, RB } }, |
| ... | ... | @@ -4753,6 +4608,16 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4753 | 4608 | { "stvx", X(31, 231), X_MASK, PPCVEC, { VS, RA, RB } }, |
| 4754 | 4609 | { "stvxl", X(31, 487), X_MASK, PPCVEC, { VS, RA, RB } }, |
| 4755 | 4610 | |
| 4611 | +/* New load/store left/right index vector instructions that are in the Cell only. */ | |
| 4612 | +{ "lvlx", X(31, 519), X_MASK, CELL, { VD, RA0, RB } }, | |
| 4613 | +{ "lvlxl", X(31, 775), X_MASK, CELL, { VD, RA0, RB } }, | |
| 4614 | +{ "lvrx", X(31, 551), X_MASK, CELL, { VD, RA0, RB } }, | |
| 4615 | +{ "lvrxl", X(31, 807), X_MASK, CELL, { VD, RA0, RB } }, | |
| 4616 | +{ "stvlx", X(31, 647), X_MASK, CELL, { VS, RA0, RB } }, | |
| 4617 | +{ "stvlxl", X(31, 903), X_MASK, CELL, { VS, RA0, RB } }, | |
| 4618 | +{ "stvrx", X(31, 679), X_MASK, CELL, { VS, RA0, RB } }, | |
| 4619 | +{ "stvrxl", X(31, 935), X_MASK, CELL, { VS, RA0, RB } }, | |
| 4620 | + | |
| 4756 | 4621 | { "lwz", OP(32), OP_MASK, PPCCOM, { RT, D, RA0 } }, |
| 4757 | 4622 | { "l", OP(32), OP_MASK, PWRCOM, { RT, D, RA0 } }, |
| 4758 | 4623 | |
| ... | ... | @@ -4813,6 +4678,8 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4813 | 4678 | |
| 4814 | 4679 | { "lfqu", OP(57), OP_MASK, POWER2, { FRT, D, RA0 } }, |
| 4815 | 4680 | |
| 4681 | +{ "lfdp", OP(57), OP_MASK, POWER6, { FRT, D, RA0 } }, | |
| 4682 | + | |
| 4816 | 4683 | { "lbze", DEO(58,0), DE_MASK, BOOKE64, { RT, DE, RA0 } }, |
| 4817 | 4684 | { "lbzue", DEO(58,1), DE_MASK, BOOKE64, { RT, DE, RAL } }, |
| 4818 | 4685 | { "lhze", DEO(58,2), DE_MASK, BOOKE64, { RT, DE, RA0 } }, |
| ... | ... | @@ -4834,6 +4701,12 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4834 | 4701 | |
| 4835 | 4702 | { "lwa", DSO(58,2), DS_MASK, PPC64, { RT, DS, RA0 } }, |
| 4836 | 4703 | |
| 4704 | +{ "dadd", XRC(59,2,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4705 | +{ "dadd.", XRC(59,2,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4706 | + | |
| 4707 | +{ "dqua", ZRC(59,3,0), Z2_MASK, POWER6, { FRT, FRA, FRB, RMC } }, | |
| 4708 | +{ "dqua.", ZRC(59,3,1), Z2_MASK, POWER6, { FRT, FRA, FRB, RMC } }, | |
| 4709 | + | |
| 4837 | 4710 | { "fdivs", A(59,18,0), AFRC_MASK, PPC, { FRT, FRA, FRB } }, |
| 4838 | 4711 | { "fdivs.", A(59,18,1), AFRC_MASK, PPC, { FRT, FRA, FRB } }, |
| 4839 | 4712 | |
| ... | ... | @@ -4846,14 +4719,14 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4846 | 4719 | { "fsqrts", A(59,22,0), AFRAFRC_MASK, PPC, { FRT, FRB } }, |
| 4847 | 4720 | { "fsqrts.", A(59,22,1), AFRAFRC_MASK, PPC, { FRT, FRB } }, |
| 4848 | 4721 | |
| 4849 | -{ "fres", A(59,24,0), AFRAFRC_MASK, PPC, { FRT, FRB } }, | |
| 4850 | -{ "fres.", A(59,24,1), AFRAFRC_MASK, PPC, { FRT, FRB } }, | |
| 4722 | +{ "fres", A(59,24,0), AFRALFRC_MASK, PPC, { FRT, FRB, A_L } }, | |
| 4723 | +{ "fres.", A(59,24,1), AFRALFRC_MASK, PPC, { FRT, FRB, A_L } }, | |
| 4851 | 4724 | |
| 4852 | 4725 | { "fmuls", A(59,25,0), AFRB_MASK, PPC, { FRT, FRA, FRC } }, |
| 4853 | 4726 | { "fmuls.", A(59,25,1), AFRB_MASK, PPC, { FRT, FRA, FRC } }, |
| 4854 | 4727 | |
| 4855 | -{ "frsqrtes", A(59,26,0), AFRAFRC_MASK, POWER5, { FRT, FRB } }, | |
| 4856 | -{ "frsqrtes.",A(59,26,1), AFRAFRC_MASK, POWER5, { FRT, FRB } }, | |
| 4728 | +{ "frsqrtes", A(59,26,0), AFRALFRC_MASK,POWER5, { FRT, FRB, A_L } }, | |
| 4729 | +{ "frsqrtes.",A(59,26,1), AFRALFRC_MASK,POWER5, { FRT, FRB, A_L } }, | |
| 4857 | 4730 | |
| 4858 | 4731 | { "fmsubs", A(59,28,0), A_MASK, PPC, { FRT,FRA,FRC,FRB } }, |
| 4859 | 4732 | { "fmsubs.", A(59,28,1), A_MASK, PPC, { FRT,FRA,FRC,FRB } }, |
| ... | ... | @@ -4867,10 +4740,73 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4867 | 4740 | { "fnmadds", A(59,31,0), A_MASK, PPC, { FRT,FRA,FRC,FRB } }, |
| 4868 | 4741 | { "fnmadds.",A(59,31,1), A_MASK, PPC, { FRT,FRA,FRC,FRB } }, |
| 4869 | 4742 | |
| 4743 | +{ "dmul", XRC(59,34,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4744 | +{ "dmul.", XRC(59,34,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4745 | + | |
| 4746 | +{ "drrnd", ZRC(59,35,0), Z2_MASK, POWER6, { FRT, FRA, FRB, RMC } }, | |
| 4747 | +{ "drrnd.", ZRC(59,35,1), Z2_MASK, POWER6, { FRT, FRA, FRB, RMC } }, | |
| 4748 | + | |
| 4749 | +{ "dscli", ZRC(59,66,0), Z_MASK, POWER6, { FRT, FRA, SH16 } }, | |
| 4750 | +{ "dscli.", ZRC(59,66,1), Z_MASK, POWER6, { FRT, FRA, SH16 } }, | |
| 4751 | + | |
| 4752 | +{ "dquai", ZRC(59,67,0), Z2_MASK, POWER6, { TE, FRT, FRB, RMC } }, | |
| 4753 | +{ "dquai.", ZRC(59,67,1), Z2_MASK, POWER6, { TE, FRT, FRB, RMC } }, | |
| 4754 | + | |
| 4755 | +{ "dscri", ZRC(59,98,0), Z_MASK, POWER6, { FRT, FRA, SH16 } }, | |
| 4756 | +{ "dscri.", ZRC(59,98,1), Z_MASK, POWER6, { FRT, FRA, SH16 } }, | |
| 4757 | + | |
| 4758 | +{ "drintx", ZRC(59,99,0), Z2_MASK, POWER6, { R, FRT, FRB, RMC } }, | |
| 4759 | +{ "drintx.", ZRC(59,99,1), Z2_MASK, POWER6, { R, FRT, FRB, RMC } }, | |
| 4760 | + | |
| 4761 | +{ "dcmpo", X(59,130), X_MASK, POWER6, { BF, FRA, FRB } }, | |
| 4762 | + | |
| 4763 | +{ "dtstex", X(59,162), X_MASK, POWER6, { BF, FRA, FRB } }, | |
| 4764 | +{ "dtstdc", Z(59,194), Z_MASK, POWER6, { BF, FRA, DCM } }, | |
| 4765 | +{ "dtstdg", Z(59,226), Z_MASK, POWER6, { BF, FRA, DGM } }, | |
| 4766 | + | |
| 4767 | +{ "drintn", ZRC(59,227,0), Z2_MASK, POWER6, { R, FRT, FRB, RMC } }, | |
| 4768 | +{ "drintn.", ZRC(59,227,1), Z2_MASK, POWER6, { R, FRT, FRB, RMC } }, | |
| 4769 | + | |
| 4770 | +{ "dctdp", XRC(59,258,0), X_MASK, POWER6, { FRT, FRB } }, | |
| 4771 | +{ "dctdp.", XRC(59,258,1), X_MASK, POWER6, { FRT, FRB } }, | |
| 4772 | + | |
| 4773 | +{ "dctfix", XRC(59,290,0), X_MASK, POWER6, { FRT, FRB } }, | |
| 4774 | +{ "dctfix.", XRC(59,290,1), X_MASK, POWER6, { FRT, FRB } }, | |
| 4775 | + | |
| 4776 | +{ "ddedpd", XRC(59,322,0), X_MASK, POWER6, { SP, FRT, FRB } }, | |
| 4777 | +{ "ddedpd.", XRC(59,322,1), X_MASK, POWER6, { SP, FRT, FRB } }, | |
| 4778 | + | |
| 4779 | +{ "dxex", XRC(59,354,0), X_MASK, POWER6, { FRT, FRB } }, | |
| 4780 | +{ "dxex.", XRC(59,354,1), X_MASK, POWER6, { FRT, FRB } }, | |
| 4781 | + | |
| 4782 | +{ "dsub", XRC(59,514,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4783 | +{ "dsub.", XRC(59,514,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4784 | + | |
| 4785 | +{ "ddiv", XRC(59,546,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4786 | +{ "ddiv.", XRC(59,546,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4787 | + | |
| 4788 | +{ "dcmpu", X(59,642), X_MASK, POWER6, { BF, FRA, FRB } }, | |
| 4789 | + | |
| 4790 | +{ "dtstsf", X(59,674), X_MASK, POWER6, { BF, FRA, FRB } }, | |
| 4791 | + | |
| 4792 | +{ "drsp", XRC(59,770,0), X_MASK, POWER6, { FRT, FRB } }, | |
| 4793 | +{ "drsp.", XRC(59,770,1), X_MASK, POWER6, { FRT, FRB } }, | |
| 4794 | + | |
| 4795 | +{ "dcffix", XRC(59,802,0), X_MASK, POWER6, { FRT, FRB } }, | |
| 4796 | +{ "dcffix.", XRC(59,802,1), X_MASK, POWER6, { FRT, FRB } }, | |
| 4797 | + | |
| 4798 | +{ "denbcd", XRC(59,834,0), X_MASK, POWER6, { S, FRT, FRB } }, | |
| 4799 | +{ "denbcd.", XRC(59,834,1), X_MASK, POWER6, { S, FRT, FRB } }, | |
| 4800 | + | |
| 4801 | +{ "diex", XRC(59,866,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4802 | +{ "diex.", XRC(59,866,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4803 | + | |
| 4870 | 4804 | { "stfq", OP(60), OP_MASK, POWER2, { FRS, D, RA } }, |
| 4871 | 4805 | |
| 4872 | 4806 | { "stfqu", OP(61), OP_MASK, POWER2, { FRS, D, RA } }, |
| 4873 | 4807 | |
| 4808 | +{ "stfdp", OP(61), OP_MASK, POWER6, { FRT, D, RA0 } }, | |
| 4809 | + | |
| 4874 | 4810 | { "lde", DEO(62,0), DE_MASK, BOOKE64, { RT, DES, RA0 } }, |
| 4875 | 4811 | { "ldue", DEO(62,1), DE_MASK, BOOKE64, { RT, DES, RA0 } }, |
| 4876 | 4812 | { "lfse", DEO(62,4), DE_MASK, BOOKE64, { FRT, DES, RA0 } }, |
| ... | ... | @@ -4892,6 +4828,15 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4892 | 4828 | |
| 4893 | 4829 | { "fcmpu", X(63,0), X_MASK|(3<<21), COM, { BF, FRA, FRB } }, |
| 4894 | 4830 | |
| 4831 | +{ "daddq", XRC(63,2,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4832 | +{ "daddq.", XRC(63,2,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4833 | + | |
| 4834 | +{ "dquaq", ZRC(63,3,0), Z2_MASK, POWER6, { FRT, FRA, FRB, RMC } }, | |
| 4835 | +{ "dquaq.", ZRC(63,3,1), Z2_MASK, POWER6, { FRT, FRA, FRB, RMC } }, | |
| 4836 | + | |
| 4837 | +{ "fcpsgn", XRC(63,8,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4838 | +{ "fcpsgn.", XRC(63,8,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4839 | + | |
| 4895 | 4840 | { "frsp", XRC(63,12,0), XRA_MASK, COM, { FRT, FRB } }, |
| 4896 | 4841 | { "frsp.", XRC(63,12,1), XRA_MASK, COM, { FRT, FRB } }, |
| 4897 | 4842 | |
| ... | ... | @@ -4926,16 +4871,16 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4926 | 4871 | { "fsel", A(63,23,0), A_MASK, PPC, { FRT,FRA,FRC,FRB } }, |
| 4927 | 4872 | { "fsel.", A(63,23,1), A_MASK, PPC, { FRT,FRA,FRC,FRB } }, |
| 4928 | 4873 | |
| 4929 | -{ "fre", A(63,24,0), AFRAFRC_MASK, POWER5, { FRT, FRB } }, | |
| 4930 | -{ "fre.", A(63,24,1), AFRAFRC_MASK, POWER5, { FRT, FRB } }, | |
| 4874 | +{ "fre", A(63,24,0), AFRALFRC_MASK, POWER5, { FRT, FRB, A_L } }, | |
| 4875 | +{ "fre.", A(63,24,1), AFRALFRC_MASK, POWER5, { FRT, FRB, A_L } }, | |
| 4931 | 4876 | |
| 4932 | 4877 | { "fmul", A(63,25,0), AFRB_MASK, PPCCOM, { FRT, FRA, FRC } }, |
| 4933 | 4878 | { "fm", A(63,25,0), AFRB_MASK, PWRCOM, { FRT, FRA, FRC } }, |
| 4934 | 4879 | { "fmul.", A(63,25,1), AFRB_MASK, PPCCOM, { FRT, FRA, FRC } }, |
| 4935 | 4880 | { "fm.", A(63,25,1), AFRB_MASK, PWRCOM, { FRT, FRA, FRC } }, |
| 4936 | 4881 | |
| 4937 | -{ "frsqrte", A(63,26,0), AFRAFRC_MASK, PPC, { FRT, FRB } }, | |
| 4938 | -{ "frsqrte.",A(63,26,1), AFRAFRC_MASK, PPC, { FRT, FRB } }, | |
| 4882 | +{ "frsqrte", A(63,26,0), AFRALFRC_MASK, PPC, { FRT, FRB, A_L } }, | |
| 4883 | +{ "frsqrte.",A(63,26,1), AFRALFRC_MASK, PPC, { FRT, FRB, A_L } }, | |
| 4939 | 4884 | |
| 4940 | 4885 | { "fmsub", A(63,28,0), A_MASK, PPCCOM, { FRT,FRA,FRC,FRB } }, |
| 4941 | 4886 | { "fms", A(63,28,0), A_MASK, PWRCOM, { FRT,FRA,FRC,FRB } }, |
| ... | ... | @@ -4959,6 +4904,12 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4959 | 4904 | |
| 4960 | 4905 | { "fcmpo", X(63,32), X_MASK|(3<<21), COM, { BF, FRA, FRB } }, |
| 4961 | 4906 | |
| 4907 | +{ "dmulq", XRC(63,34,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4908 | +{ "dmulq.", XRC(63,34,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4909 | + | |
| 4910 | +{ "drrndq", ZRC(63,35,0), Z2_MASK, POWER6, { FRT, FRA, FRB, RMC } }, | |
| 4911 | +{ "drrndq.", ZRC(63,35,1), Z2_MASK, POWER6, { FRT, FRA, FRB, RMC } }, | |
| 4912 | + | |
| 4962 | 4913 | { "mtfsb1", XRC(63,38,0), XRARB_MASK, COM, { BT } }, |
| 4963 | 4914 | { "mtfsb1.", XRC(63,38,1), XRARB_MASK, COM, { BT } }, |
| 4964 | 4915 | |
| ... | ... | @@ -4967,21 +4918,54 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4967 | 4918 | |
| 4968 | 4919 | { "mcrfs", X(63,64), XRB_MASK|(3<<21)|(3<<16), COM, { BF, BFA } }, |
| 4969 | 4920 | |
| 4921 | +{ "dscliq", ZRC(63,66,0), Z_MASK, POWER6, { FRT, FRA, SH16 } }, | |
| 4922 | +{ "dscliq.", ZRC(63,66,1), Z_MASK, POWER6, { FRT, FRA, SH16 } }, | |
| 4923 | + | |
| 4924 | +{ "dquaiq", ZRC(63,67,0), Z2_MASK, POWER6, { TE, FRT, FRB, RMC } }, | |
| 4925 | +{ "dquaiq.", ZRC(63,67,1), Z2_MASK, POWER6, { FRT, FRA, FRB, RMC } }, | |
| 4926 | + | |
| 4970 | 4927 | { "mtfsb0", XRC(63,70,0), XRARB_MASK, COM, { BT } }, |
| 4971 | 4928 | { "mtfsb0.", XRC(63,70,1), XRARB_MASK, COM, { BT } }, |
| 4972 | 4929 | |
| 4973 | 4930 | { "fmr", XRC(63,72,0), XRA_MASK, COM, { FRT, FRB } }, |
| 4974 | 4931 | { "fmr.", XRC(63,72,1), XRA_MASK, COM, { FRT, FRB } }, |
| 4975 | 4932 | |
| 4976 | -{ "mtfsfi", XRC(63,134,0), XRA_MASK|(3<<21)|(1<<11), COM, { BF, U } }, | |
| 4977 | -{ "mtfsfi.", XRC(63,134,1), XRA_MASK|(3<<21)|(1<<11), COM, { BF, U } }, | |
| 4933 | +{ "dscriq", ZRC(63,98,0), Z_MASK, POWER6, { FRT, FRA, SH16 } }, | |
| 4934 | +{ "dscriq.", ZRC(63,98,1), Z_MASK, POWER6, { FRT, FRA, SH16 } }, | |
| 4935 | + | |
| 4936 | +{ "drintxq", ZRC(63,99,0), Z2_MASK, POWER6, { R, FRT, FRB, RMC } }, | |
| 4937 | +{ "drintxq.",ZRC(63,99,1), Z2_MASK, POWER6, { R, FRT, FRB, RMC } }, | |
| 4938 | + | |
| 4939 | +{ "dcmpoq", X(63,130), X_MASK, POWER6, { BF, FRA, FRB } }, | |
| 4940 | + | |
| 4941 | +{ "mtfsfi", XRC(63,134,0), XWRA_MASK|(3<<21)|(1<<11), COM, { BFF, U, W } }, | |
| 4942 | +{ "mtfsfi.", XRC(63,134,1), XWRA_MASK|(3<<21)|(1<<11), COM, { BFF, U, W } }, | |
| 4978 | 4943 | |
| 4979 | 4944 | { "fnabs", XRC(63,136,0), XRA_MASK, COM, { FRT, FRB } }, |
| 4980 | 4945 | { "fnabs.", XRC(63,136,1), XRA_MASK, COM, { FRT, FRB } }, |
| 4981 | 4946 | |
| 4947 | +{ "dtstexq", X(63,162), X_MASK, POWER6, { BF, FRA, FRB } }, | |
| 4948 | +{ "dtstdcq", Z(63,194), Z_MASK, POWER6, { BF, FRA, DCM } }, | |
| 4949 | +{ "dtstdgq", Z(63,226), Z_MASK, POWER6, { BF, FRA, DGM } }, | |
| 4950 | + | |
| 4951 | +{ "drintnq", ZRC(63,227,0), Z2_MASK, POWER6, { R, FRT, FRB, RMC } }, | |
| 4952 | +{ "drintnq.",ZRC(63,227,1), Z2_MASK, POWER6, { R, FRT, FRB, RMC } }, | |
| 4953 | + | |
| 4954 | +{ "dctqpq", XRC(63,258,0), X_MASK, POWER6, { FRT, FRB } }, | |
| 4955 | +{ "dctqpq.", XRC(63,258,1), X_MASK, POWER6, { FRT, FRB } }, | |
| 4956 | + | |
| 4982 | 4957 | { "fabs", XRC(63,264,0), XRA_MASK, COM, { FRT, FRB } }, |
| 4983 | 4958 | { "fabs.", XRC(63,264,1), XRA_MASK, COM, { FRT, FRB } }, |
| 4984 | 4959 | |
| 4960 | +{ "dctfixq", XRC(63,290,0), X_MASK, POWER6, { FRT, FRB } }, | |
| 4961 | +{ "dctfixq.",XRC(63,290,1), X_MASK, POWER6, { FRT, FRB } }, | |
| 4962 | + | |
| 4963 | +{ "ddedpdq", XRC(63,322,0), X_MASK, POWER6, { SP, FRT, FRB } }, | |
| 4964 | +{ "ddedpdq.",XRC(63,322,1), X_MASK, POWER6, { SP, FRT, FRB } }, | |
| 4965 | + | |
| 4966 | +{ "dxexq", XRC(63,354,0), X_MASK, POWER6, { FRT, FRB } }, | |
| 4967 | +{ "dxexq.", XRC(63,354,1), X_MASK, POWER6, { FRT, FRB } }, | |
| 4968 | + | |
| 4985 | 4969 | { "frin", XRC(63,392,0), XRA_MASK, POWER5, { FRT, FRB } }, |
| 4986 | 4970 | { "frin.", XRC(63,392,1), XRA_MASK, POWER5, { FRT, FRB } }, |
| 4987 | 4971 | { "friz", XRC(63,424,0), XRA_MASK, POWER5, { FRT, FRB } }, |
| ... | ... | @@ -4991,11 +4975,27 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 4991 | 4975 | { "frim", XRC(63,488,0), XRA_MASK, POWER5, { FRT, FRB } }, |
| 4992 | 4976 | { "frim.", XRC(63,488,1), XRA_MASK, POWER5, { FRT, FRB } }, |
| 4993 | 4977 | |
| 4978 | +{ "dsubq", XRC(63,514,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4979 | +{ "dsubq.", XRC(63,514,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4980 | + | |
| 4981 | +{ "ddivq", XRC(63,546,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4982 | +{ "ddivq.", XRC(63,546,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 4983 | + | |
| 4994 | 4984 | { "mffs", XRC(63,583,0), XRARB_MASK, COM, { FRT } }, |
| 4995 | 4985 | { "mffs.", XRC(63,583,1), XRARB_MASK, COM, { FRT } }, |
| 4996 | 4986 | |
| 4997 | -{ "mtfsf", XFL(63,711,0), XFL_MASK, COM, { FLM, FRB } }, | |
| 4998 | -{ "mtfsf.", XFL(63,711,1), XFL_MASK, COM, { FLM, FRB } }, | |
| 4987 | +{ "dcmpuq", X(63,642), X_MASK, POWER6, { BF, FRA, FRB } }, | |
| 4988 | + | |
| 4989 | +{ "dtstsfq", X(63,674), X_MASK, POWER6, { BF, FRA, FRB } }, | |
| 4990 | + | |
| 4991 | +{ "mtfsf", XFL(63,711,0), XFL_MASK, COM, { FLM, FRB, XFL_L, W } }, | |
| 4992 | +{ "mtfsf.", XFL(63,711,1), XFL_MASK, COM, { FLM, FRB, XFL_L, W } }, | |
| 4993 | + | |
| 4994 | +{ "drdpq", XRC(63,770,0), X_MASK, POWER6, { FRT, FRB } }, | |
| 4995 | +{ "drdpq.", XRC(63,770,1), X_MASK, POWER6, { FRT, FRB } }, | |
| 4996 | + | |
| 4997 | +{ "dcffixq", XRC(63,802,0), X_MASK, POWER6, { FRT, FRB } }, | |
| 4998 | +{ "dcffixq.",XRC(63,802,1), X_MASK, POWER6, { FRT, FRB } }, | |
| 4999 | 4999 | |
| 5000 | 5000 | { "fctid", XRC(63,814,0), XRA_MASK, PPC64, { FRT, FRB } }, |
| 5001 | 5001 | { "fctid.", XRC(63,814,1), XRA_MASK, PPC64, { FRT, FRB } }, |
| ... | ... | @@ -5003,9 +5003,15 @@ const struct powerpc_opcode powerpc_opcodes[] = { |
| 5003 | 5003 | { "fctidz", XRC(63,815,0), XRA_MASK, PPC64, { FRT, FRB } }, |
| 5004 | 5004 | { "fctidz.", XRC(63,815,1), XRA_MASK, PPC64, { FRT, FRB } }, |
| 5005 | 5005 | |
| 5006 | +{ "denbcdq", XRC(63,834,0), X_MASK, POWER6, { S, FRT, FRB } }, | |
| 5007 | +{ "denbcdq.",XRC(63,834,1), X_MASK, POWER6, { S, FRT, FRB } }, | |
| 5008 | + | |
| 5006 | 5009 | { "fcfid", XRC(63,846,0), XRA_MASK, PPC64, { FRT, FRB } }, |
| 5007 | 5010 | { "fcfid.", XRC(63,846,1), XRA_MASK, PPC64, { FRT, FRB } }, |
| 5008 | 5011 | |
| 5012 | +{ "diexq", XRC(63,866,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 5013 | +{ "diexq.", XRC(63,866,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | |
| 5014 | + | |
| 5009 | 5015 | }; |
| 5010 | 5016 | |
| 5011 | 5017 | const int powerpc_num_opcodes = |
| ... | ... | @@ -5068,6 +5074,7 @@ const struct powerpc_macro powerpc_macros[] = { |
| 5068 | 5074 | const int powerpc_num_macros = |
| 5069 | 5075 | sizeof (powerpc_macros) / sizeof (powerpc_macros[0]); |
| 5070 | 5076 | |
| 5077 | + | |
| 5071 | 5078 | /* This file provides several disassembler functions, all of which use |
| 5072 | 5079 | the disassembler interface defined in dis-asm.h. Several functions |
| 5073 | 5080 | are provided because this file handles disassembly for the PowerPC |
| ... | ... | @@ -5105,6 +5112,10 @@ powerpc_dialect (struct disassemble_info *info) |
| 5105 | 5112 | else if (info->disassembler_options |
| 5106 | 5113 | && strstr (info->disassembler_options, "e300") != NULL) |
| 5107 | 5114 | dialect |= PPC_OPCODE_E300 | PPC_OPCODE_CLASSIC | PPC_OPCODE_COMMON; |
| 5115 | + else if (info->disassembler_options | |
| 5116 | + && strstr (info->disassembler_options, "440") != NULL) | |
| 5117 | + dialect |= PPC_OPCODE_BOOKE | PPC_OPCODE_32 | |
| 5118 | + | PPC_OPCODE_440 | PPC_OPCODE_ISEL | PPC_OPCODE_RFMCI; | |
| 5108 | 5119 | else |
| 5109 | 5120 | dialect |= (PPC_OPCODE_403 | PPC_OPCODE_601 | PPC_OPCODE_CLASSIC |
| 5110 | 5121 | | PPC_OPCODE_COMMON | PPC_OPCODE_ALTIVEC); |
| ... | ... | @@ -5118,6 +5129,14 @@ powerpc_dialect (struct disassemble_info *info) |
| 5118 | 5129 | dialect |= PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5; |
| 5119 | 5130 | |
| 5120 | 5131 | if (info->disassembler_options |
| 5132 | + && strstr (info->disassembler_options, "cell") != NULL) | |
| 5133 | + dialect |= PPC_OPCODE_POWER4 | PPC_OPCODE_CELL | PPC_OPCODE_ALTIVEC; | |
| 5134 | + | |
| 5135 | + if (info->disassembler_options | |
| 5136 | + && strstr (info->disassembler_options, "power6") != NULL) | |
| 5137 | + dialect |= PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_ALTIVEC; | |
| 5138 | + | |
| 5139 | + if (info->disassembler_options | |
| 5121 | 5140 | && strstr (info->disassembler_options, "any") != NULL) |
| 5122 | 5141 | dialect |= PPC_OPCODE_ANY; |
| 5123 | 5142 | |
| ... | ... | @@ -5167,6 +5186,56 @@ print_insn_rs6000 (bfd_vma memaddr, struct disassemble_info *info) |
| 5167 | 5186 | return print_insn_powerpc (memaddr, info, 1, PPC_OPCODE_POWER); |
| 5168 | 5187 | } |
| 5169 | 5188 | |
| 5189 | +/* Extract the operand value from the PowerPC or POWER instruction. */ | |
| 5190 | + | |
| 5191 | +static long | |
| 5192 | +operand_value_powerpc (const struct powerpc_operand *operand, | |
| 5193 | + unsigned long insn, int dialect) | |
| 5194 | +{ | |
| 5195 | + long value; | |
| 5196 | + int invalid; | |
| 5197 | + /* Extract the value from the instruction. */ | |
| 5198 | + if (operand->extract) | |
| 5199 | + value = (*operand->extract) (insn, dialect, &invalid); | |
| 5200 | + else | |
| 5201 | + { | |
| 5202 | + value = (insn >> operand->shift) & operand->bitm; | |
| 5203 | + if ((operand->flags & PPC_OPERAND_SIGNED) != 0) | |
| 5204 | + { | |
| 5205 | + /* BITM is always some number of zeros followed by some | |
| 5206 | + number of ones, followed by some numer of zeros. */ | |
| 5207 | + unsigned long top = operand->bitm; | |
| 5208 | + /* top & -top gives the rightmost 1 bit, so this | |
| 5209 | + fills in any trailing zeros. */ | |
| 5210 | + top |= (top & -top) - 1; | |
| 5211 | + top &= ~(top >> 1); | |
| 5212 | + value = (value ^ top) - top; | |
| 5213 | + } | |
| 5214 | + } | |
| 5215 | + | |
| 5216 | + return value; | |
| 5217 | +} | |
| 5218 | + | |
| 5219 | +/* Determine whether the optional operand(s) should be printed. */ | |
| 5220 | + | |
| 5221 | +static int | |
| 5222 | +skip_optional_operands (const unsigned char *opindex, | |
| 5223 | + unsigned long insn, int dialect) | |
| 5224 | +{ | |
| 5225 | + const struct powerpc_operand *operand; | |
| 5226 | + | |
| 5227 | + for (; *opindex != 0; opindex++) | |
| 5228 | + { | |
| 5229 | + operand = &powerpc_operands[*opindex]; | |
| 5230 | + if ((operand->flags & PPC_OPERAND_NEXT) != 0 | |
| 5231 | + || ((operand->flags & PPC_OPERAND_OPTIONAL) != 0 | |
| 5232 | + && operand_value_powerpc (operand, insn, dialect) != 0)) | |
| 5233 | + return 0; | |
| 5234 | + } | |
| 5235 | + | |
| 5236 | + return 1; | |
| 5237 | +} | |
| 5238 | + | |
| 5170 | 5239 | /* Print a PowerPC or POWER instruction. */ |
| 5171 | 5240 | |
| 5172 | 5241 | static int |
| ... | ... | @@ -5212,6 +5281,7 @@ print_insn_powerpc (bfd_vma memaddr, |
| 5212 | 5281 | int invalid; |
| 5213 | 5282 | int need_comma; |
| 5214 | 5283 | int need_paren; |
| 5284 | + int skip_optional; | |
| 5215 | 5285 | |
| 5216 | 5286 | table_op = PPC_OP (opcode->opcode); |
| 5217 | 5287 | if (op < table_op) |
| ... | ... | @@ -5245,6 +5315,7 @@ print_insn_powerpc (bfd_vma memaddr, |
| 5245 | 5315 | /* Now extract and print the operands. */ |
| 5246 | 5316 | need_comma = 0; |
| 5247 | 5317 | need_paren = 0; |
| 5318 | + skip_optional = -1; | |
| 5248 | 5319 | for (opindex = opcode->operands; *opindex != 0; opindex++) |
| 5249 | 5320 | { |
| 5250 | 5321 | long value; |
| ... | ... | @@ -5257,23 +5328,18 @@ print_insn_powerpc (bfd_vma memaddr, |
| 5257 | 5328 | if ((operand->flags & PPC_OPERAND_FAKE) != 0) |
| 5258 | 5329 | continue; |
| 5259 | 5330 | |
| 5260 | - /* Extract the value from the instruction. */ | |
| 5261 | - if (operand->extract) | |
| 5262 | - value = (*operand->extract) (insn, dialect, &invalid); | |
| 5263 | - else | |
| 5331 | + /* If all of the optional operands have the value zero, | |
| 5332 | + then don't print any of them. */ | |
| 5333 | + if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0) | |
| 5264 | 5334 | { |
| 5265 | - value = (insn >> operand->shift) & ((1 << operand->bits) - 1); | |
| 5266 | - if ((operand->flags & PPC_OPERAND_SIGNED) != 0 | |
| 5267 | - && (value & (1 << (operand->bits - 1))) != 0) | |
| 5268 | - value -= 1 << operand->bits; | |
| 5335 | + if (skip_optional < 0) | |
| 5336 | + skip_optional = skip_optional_operands (opindex, insn, | |
| 5337 | + dialect); | |
| 5338 | + if (skip_optional) | |
| 5339 | + continue; | |
| 5269 | 5340 | } |
| 5270 | 5341 | |
| 5271 | - /* If the operand is optional, and the value is zero, don't | |
| 5272 | - print anything. */ | |
| 5273 | - if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0 | |
| 5274 | - && (operand->flags & PPC_OPERAND_NEXT) == 0 | |
| 5275 | - && value == 0) | |
| 5276 | - continue; | |
| 5342 | + value = operand_value_powerpc (operand, insn, dialect); | |
| 5277 | 5343 | |
| 5278 | 5344 | if (need_comma) |
| 5279 | 5345 | { |
| ... | ... | @@ -5298,7 +5364,7 @@ print_insn_powerpc (bfd_vma memaddr, |
| 5298 | 5364 | (*info->fprintf_func) (info->stream, "%ld", value); |
| 5299 | 5365 | else |
| 5300 | 5366 | { |
| 5301 | - if (operand->bits == 3) | |
| 5367 | + if (operand->bitm == 7) | |
| 5302 | 5368 | (*info->fprintf_func) (info->stream, "cr%ld", value); |
| 5303 | 5369 | else |
| 5304 | 5370 | { | ... | ... |