Index: src/ppc/constants-ppc.h |
diff --git a/src/ppc/constants-ppc.h b/src/ppc/constants-ppc.h |
index d131438139a06fa53f721c7aa05ccfb9563a3bc0..12a6a86409ed8b96295827245fb58ed204e1308b 100644 |
--- a/src/ppc/constants-ppc.h |
+++ b/src/ppc/constants-ppc.h |
@@ -555,8 +555,6 @@ typedef uint32_t Instr; |
V(evlhhousplatx, EVLHHOUSPLATX, 0x1000030C) \ |
/* Vector Load Word into Two Half Words Even */ \ |
V(evlwhe, EVLWHE, 0x10000311) \ |
- /* Vector Load Word into Two Half Words Even Indexed */ \ |
- V(evlwhex, EVLWHEX, 0x10000310) \ |
/* Vector Load Word into Two Half Words Odd Signed (with sign extension) */ \ |
V(evlwhos, EVLWHOS, 0x10000317) \ |
/* Vector Load Word into Two Half Words Odd Signed Indexed (with sign */ \ |
@@ -1332,8 +1330,6 @@ typedef uint32_t Instr; |
V(dcbi, DCBI, 0x7C0003AC) \ |
/* Instruction Cache Block Touch */ \ |
V(icbt, ICBT, 0x7C00002C) \ |
- /* Memory Barrier */ \ |
- V(mbar, MBAR, 0x7C0006AC) \ |
/* Move to Condition Register from XER */ \ |
V(mcrxr, MCRXR, 0x7C000400) \ |
/* TLB Invalidate Local Indexed */ \ |
@@ -1684,6 +1680,9 @@ typedef uint32_t Instr; |
/* Store Quadword */ \ |
V(stq, STQ, 0xF8000002) |
+#define PPC_DQ_OPCODE_LIST(V) \ |
+ V(lsq, LSQ, 0xE0000000) |
+ |
#define PPC_D_OPCODE_LIST(V) \ |
/* Trap Doubleword Immediate */ \ |
V(tdi, TDI, 0x08000000) \ |
@@ -2025,87 +2024,40 @@ typedef uint32_t Instr; |
V(addg, ADDG, 0x7C000094) \ |
/* Multiply Accumulate Cross Halfword to Word Modulo Signed */ \ |
V(macchw, MACCHW, 0x10000158) \ |
- /* Multiply Accumulate Cross Halfword to Word Modulo Signed & record OV */ \ |
- V(macchwo, MACCHWO, 0x10000158) \ |
/* Multiply Accumulate Cross Halfword to Word Saturate Signed */ \ |
V(macchws, MACCHWS, 0x100001D8) \ |
- /* Multiply Accumulate Cross Halfword to Word Saturate Signed & record */ \ |
- /* OV */ \ |
- V(macchwso, MACCHWSO, 0x100001D8) \ |
/* Multiply Accumulate Cross Halfword to Word Saturate Unsigned */ \ |
V(macchwsu, MACCHWSU, 0x10000198) \ |
- /* Multiply Accumulate Cross Halfword to Word Saturate Unsigned & record */ \ |
- /* OV */ \ |
- V(macchwsuo, MACCHWSUO, 0x10000198) \ |
/* Multiply Accumulate Cross Halfword to Word Modulo Unsigned */ \ |
V(macchwu, MACCHWU, 0x10000118) \ |
- /* Multiply Accumulate Cross Halfword to Word Modulo Unsigned & record */ \ |
- /* OV */ \ |
- V(macchwuo, MACCHWUO, 0x10000118) \ |
/* Multiply Accumulate High Halfword to Word Modulo Signed */ \ |
V(machhw, MACHHW, 0x10000058) \ |
- /* Multiply Accumulate High Halfword to Word Modulo Signed & record OV */ \ |
- V(machhwo, MACHHWO, 0x10000058) \ |
/* Multiply Accumulate High Halfword to Word Saturate Signed */ \ |
V(machhws, MACHHWS, 0x100000D8) \ |
- /* Multiply Accumulate High Halfword to Word Saturate Signed & record OV */ \ |
- V(machhwso, MACHHWSO, 0x100000D8) \ |
/* Multiply Accumulate High Halfword to Word Saturate Unsigned */ \ |
V(machhwsu, MACHHWSU, 0x10000098) \ |
- /* Multiply Accumulate High Halfword to Word Saturate Unsigned & record */ \ |
- /* OV */ \ |
- V(machhwsuo, MACHHWSUO, 0x10000098) \ |
/* Multiply Accumulate High Halfword to Word Modulo Unsigned */ \ |
V(machhwu, MACHHWU, 0x10000018) \ |
- /* Multiply Accumulate High Halfword to Word Modulo Unsigned & record OV */ \ |
- V(machhwuo, MACHHWUO, 0x10000018) \ |
/* Multiply Accumulate Low Halfword to Word Modulo Signed */ \ |
V(maclhw, MACLHW, 0x10000358) \ |
- /* Multiply Accumulate Low Halfword to Word Modulo Signed & record OV */ \ |
- V(maclhwo, MACLHWO, 0x10000358) \ |
/* Multiply Accumulate Low Halfword to Word Saturate Signed */ \ |
V(maclhws, MACLHWS, 0x100003D8) \ |
- /* Multiply Accumulate Low Halfword to Word Saturate Signed & record OV */ \ |
- V(maclhwso, MACLHWSO, 0x100003D8) \ |
/* Multiply Accumulate Low Halfword to Word Saturate Unsigned */ \ |
V(maclhwsu, MACLHWSU, 0x10000398) \ |
- /* Multiply Accumulate Low Halfword to Word Saturate Unsigned & record */ \ |
- /* OV */ \ |
- V(maclhwsuo, MACLHWSUO, 0x10000398) \ |
/* Multiply Accumulate Low Halfword to Word Modulo Unsigned */ \ |
V(maclhwu, MACLHWU, 0x10000318) \ |
- /* Multiply Accumulate Low Halfword to Word Modulo Unsigned & record OV */ \ |
- V(maclhwuo, MACLHWUO, 0x10000318) \ |
/* Negative Multiply Accumulate Cross Halfword to Word Modulo Signed */ \ |
V(nmacchw, NMACCHW, 0x1000015C) \ |
- /* Negative Multiply Accumulate Cross Halfword to Word Modulo Signed & */ \ |
- /* record OV */ \ |
- V(nmacchwo, NMACCHWO, 0x1000015C) \ |
/* Negative Multiply Accumulate Cross Halfword to Word Saturate Signed */ \ |
V(nmacchws, NMACCHWS, 0x100001DC) \ |
- /* Negative Multiply Accumulate Cross Halfword to Word Saturate Signed & */ \ |
- /* record OV */ \ |
- V(nmacchwso, NMACCHWSO, 0x100001DC) \ |
/* Negative Multiply Accumulate High Halfword to Word Modulo Signed */ \ |
V(nmachhw, NMACHHW, 0x1000005C) \ |
- /* Negative Multiply Accumulate High Halfword to Word Modulo Signed & */ \ |
- /* record OV */ \ |
- V(nmachhwo, NMACHHWO, 0x1000005C) \ |
/* Negative Multiply Accumulate High Halfword to Word Saturate Signed */ \ |
V(nmachhws, NMACHHWS, 0x100000DC) \ |
- /* Negative Multiply Accumulate High Halfword to Word Saturate Signed & */ \ |
- /* record OV */ \ |
- V(nmachhwso, NMACHHWSO, 0x100000DC) \ |
/* Negative Multiply Accumulate Low Halfword to Word Modulo Signed */ \ |
V(nmaclhw, NMACLHW, 0x1000035C) \ |
- /* Negative Multiply Accumulate Low Halfword to Word Modulo Signed & */ \ |
- /* record OV */ \ |
- V(nmaclhwo, NMACLHWO, 0x1000035C) \ |
/* Negative Multiply Accumulate Low Halfword to Word Saturate Signed */ \ |
V(nmaclhws, NMACLHWS, 0x100003DC) \ |
- /* Negative Multiply Accumulate Low Halfword to Word Saturate Signed & */ \ |
- /* record OV */ \ |
- V(nmaclhwso, NMACLHWSO, 0x100003DC) |
#define PPC_XL_OPCODE_LIST(V) \ |
/* Branch Conditional to Count Register */ \ |
@@ -2538,6 +2490,7 @@ typedef uint32_t Instr; |
PPC_X_OPCODE_LIST(V) \ |
PPC_XO_OPCODE_LIST(V) \ |
PPC_DS_OPCODE_LIST(V) \ |
+ PPC_DQ_OPCODE_LIST(V) \ |
PPC_MDS_OPCODE_LIST(V) \ |
PPC_MD_OPCODE_LIST(V) \ |
PPC_XS_OPCODE_LIST(V) \ |
@@ -2817,10 +2770,118 @@ class Instruction { |
DECLARE_STATIC_ACCESSOR(RCValue); |
inline int OpcodeValue() const { return static_cast<Opcode>(Bits(31, 26)); } |
- inline Opcode OpcodeField() const { |
+ inline uint32_t OpcodeField() const { |
return static_cast<Opcode>(BitField(31, 26)); |
} |
+#define OPCODE_CASES(name, opcode_name, opcode_value) \ |
+ case opcode_name: |
+ |
+ inline Opcode OpcodeBase() const { |
+ uint32_t opcode = OpcodeField(); |
+ uint32_t extcode = OpcodeField(); |
+ switch (opcode) { |
+ PPC_D_OPCODE_LIST(OPCODE_CASES) |
+ PPC_I_OPCODE_LIST(OPCODE_CASES) |
+ PPC_B_OPCODE_LIST(OPCODE_CASES) |
+ PPC_M_OPCODE_LIST(OPCODE_CASES) |
+ return static_cast<Opcode>(opcode); |
+ } |
+ |
+ opcode = extcode | BitField(10, 0); |
+ switch (opcode) { |
+ PPC_VX_OPCODE_LIST(OPCODE_CASES) |
+ return static_cast<Opcode>(opcode); |
+ } |
+ opcode = extcode | BitField(9, 0); |
+ switch (opcode) { |
+ PPC_VC_OPCODE_LIST(OPCODE_CASES) |
+ return static_cast<Opcode>(opcode); |
+ } |
+ opcode = extcode | BitField(10, 1) | BitField(20, 20); |
+ switch (opcode) { |
+ PPC_XFX_OPCODE_LIST(OPCODE_CASES) |
+ return static_cast<Opcode>(opcode); |
+ } |
+ opcode = extcode | BitField(10, 1); |
+ switch (opcode) { |
+ PPC_X_OPCODE_LIST(OPCODE_CASES) |
+ PPC_XL_OPCODE_LIST(OPCODE_CASES) |
+ PPC_XFL_OPCODE_LIST(OPCODE_CASES) |
+ PPC_XX1_OPCODE_LIST(OPCODE_CASES) |
+ PPC_XX2_OPCODE_LIST(OPCODE_CASES) |
+ PPC_EVX_OPCODE_LIST(OPCODE_CASES) |
+ return static_cast<Opcode>(opcode); |
+ } |
+ opcode = extcode | BitField(9, 1); |
+ switch (opcode) { |
+ PPC_XO_OPCODE_LIST(OPCODE_CASES) |
+ PPC_Z22_OPCODE_LIST(OPCODE_CASES) |
+ return static_cast<Opcode>(opcode); |
+ } |
+ opcode = extcode | BitField(10, 2); |
+ switch (opcode) { |
+ PPC_XS_OPCODE_LIST(OPCODE_CASES) |
+ return static_cast<Opcode>(opcode); |
+ } |
+ opcode = extcode | BitField(10, 3); |
+ switch (opcode) { |
+ PPC_EVS_OPCODE_LIST(OPCODE_CASES) |
+ PPC_XX3_OPCODE_LIST(OPCODE_CASES) |
+ return static_cast<Opcode>(opcode); |
+ } |
+ opcode = extcode | BitField(8, 1); |
+ switch (opcode) { |
+ PPC_Z23_OPCODE_LIST(OPCODE_CASES) |
+ return static_cast<Opcode>(opcode); |
+ } |
+ opcode = extcode | BitField(5, 0); |
+ switch (opcode) { |
+ PPC_VA_OPCODE_LIST(OPCODE_CASES) |
+ return static_cast<Opcode>(opcode); |
+ } |
+ opcode = extcode | BitField(5, 1); |
+ switch (opcode) { |
+ PPC_A_OPCODE_LIST(OPCODE_CASES) |
+ return static_cast<Opcode>(opcode); |
+ } |
+ opcode = extcode | BitField(4, 1); |
+ switch (opcode) { |
+ PPC_MDS_OPCODE_LIST(OPCODE_CASES) |
+ return static_cast<Opcode>(opcode); |
+ } |
+ opcode = extcode | BitField(4, 2); |
+ switch (opcode) { |
+ PPC_MD_OPCODE_LIST(OPCODE_CASES) |
+ return static_cast<Opcode>(opcode); |
+ } |
+ opcode = extcode | BitField(5, 4); |
+ switch (opcode) { |
+ PPC_XX4_OPCODE_LIST(OPCODE_CASES) |
+ return static_cast<Opcode>(opcode); |
+ } |
+ opcode = extcode | BitField(2, 0); |
+ switch (opcode) { |
+ PPC_DQ_OPCODE_LIST(OPCODE_CASES) |
+ return static_cast<Opcode>(opcode); |
+ } |
+ opcode = extcode | BitField(1, 0); |
+ switch (opcode) { |
+ PPC_DS_OPCODE_LIST(OPCODE_CASES) |
+ return static_cast<Opcode>(opcode); |
+ } |
+ opcode = extcode | BitField(1, 1); |
+ switch (opcode) { |
+ PPC_SC_OPCODE_LIST(OPCODE_CASES) |
+ return static_cast<Opcode>(opcode); |
+ } |
+printf("opcode = %x\n", InstructionBits()); |
+ UNIMPLEMENTED(); |
+ return static_cast<Opcode>(0); |
+ } |
+ |
+#undef OPCODE_CASES |
+ |
// Fields used in Software interrupt instructions |
inline SoftwareInterruptCodes SvcValue() const { |
return static_cast<SoftwareInterruptCodes>(Bits(23, 0)); |