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 | { | ... | ... |