Index: src/ppc/disasm-ppc.cc |
diff --git a/src/ppc/disasm-ppc.cc b/src/ppc/disasm-ppc.cc |
index 63cec8cd8511afce8743d1227e04e7fbe3fdb695..3472828eee73c2dfd1cbb500e1e5d2d6e5990a9f 100644 |
--- a/src/ppc/disasm-ppc.cc |
+++ b/src/ppc/disasm-ppc.cc |
@@ -77,7 +77,6 @@ class Decoder { |
void Format(Instruction* instr, const char* format); |
void Unknown(Instruction* instr); |
void UnknownFormat(Instruction* instr, const char* opcname); |
- void MarkerFormat(Instruction* instr, const char* opcname, int id); |
void DecodeExt1(Instruction* instr); |
void DecodeExt2(Instruction* instr); |
@@ -360,13 +359,6 @@ void Decoder::UnknownFormat(Instruction* instr, const char* name) { |
} |
-void Decoder::MarkerFormat(Instruction* instr, const char* name, int id) { |
- char buffer[100]; |
- snprintf(buffer, sizeof(buffer), "%s %d", name, id); |
- Format(instr, buffer); |
-} |
- |
- |
void Decoder::DecodeExt1(Instruction* instr) { |
switch (instr->Bits(10, 1) << 1) { |
case MCRF: { |
@@ -605,43 +597,43 @@ void Decoder::DecodeExt2(Instruction* instr) { |
Format(instr, "cmpw 'ra, 'rb"); |
} |
#endif |
- break; |
+ return; |
} |
case SLWX: { |
Format(instr, "slw'. 'ra, 'rs, 'rb"); |
- break; |
+ return; |
} |
#if V8_TARGET_ARCH_PPC64 |
case SLDX: { |
Format(instr, "sld'. 'ra, 'rs, 'rb"); |
- break; |
+ return; |
} |
#endif |
case SUBFCX: { |
Format(instr, "subfc'. 'rt, 'ra, 'rb"); |
- break; |
+ return; |
} |
case ADDCX: { |
Format(instr, "addc'. 'rt, 'ra, 'rb"); |
- break; |
+ return; |
} |
case CNTLZWX: { |
Format(instr, "cntlzw'. 'ra, 'rs"); |
- break; |
+ return; |
} |
#if V8_TARGET_ARCH_PPC64 |
case CNTLZDX: { |
Format(instr, "cntlzd'. 'ra, 'rs"); |
- break; |
+ return; |
} |
#endif |
case ANDX: { |
Format(instr, "and'. 'ra, 'rs, 'rb"); |
- break; |
+ return; |
} |
case ANDCX: { |
Format(instr, "andc'. 'ra, 'rs, 'rb"); |
- break; |
+ return; |
} |
case CMPL: { |
#if V8_TARGET_ARCH_PPC64 |
@@ -653,55 +645,59 @@ void Decoder::DecodeExt2(Instruction* instr) { |
Format(instr, "cmplw 'ra, 'rb"); |
} |
#endif |
- break; |
+ return; |
} |
case NEGX: { |
Format(instr, "neg'. 'rt, 'ra"); |
- break; |
+ return; |
} |
case NORX: { |
Format(instr, "nor'. 'rt, 'ra, 'rb"); |
- break; |
+ return; |
} |
case SUBFX: { |
Format(instr, "subf'. 'rt, 'ra, 'rb"); |
- break; |
+ return; |
} |
case MULHWX: { |
Format(instr, "mulhw'o'. 'rt, 'ra, 'rb"); |
- break; |
+ return; |
} |
case ADDZEX: { |
Format(instr, "addze'. 'rt, 'ra"); |
- break; |
+ return; |
} |
case MULLW: { |
Format(instr, "mullw'o'. 'rt, 'ra, 'rb"); |
- break; |
+ return; |
} |
#if V8_TARGET_ARCH_PPC64 |
case MULLD: { |
Format(instr, "mulld'o'. 'rt, 'ra, 'rb"); |
- break; |
+ return; |
} |
#endif |
case DIVW: { |
Format(instr, "divw'o'. 'rt, 'ra, 'rb"); |
- break; |
+ return; |
+ } |
+ case DIVWU: { |
+ Format(instr, "divwu'o'. 'rt, 'ra, 'rb"); |
+ return; |
} |
#if V8_TARGET_ARCH_PPC64 |
case DIVD: { |
Format(instr, "divd'o'. 'rt, 'ra, 'rb"); |
- break; |
+ return; |
} |
#endif |
case ADDX: { |
Format(instr, "add'o 'rt, 'ra, 'rb"); |
- break; |
+ return; |
} |
case XORX: { |
Format(instr, "xor'. 'ra, 'rs, 'rb"); |
- break; |
+ return; |
} |
case ORX: { |
if (instr->RTValue() == instr->RBValue()) { |
@@ -709,7 +705,7 @@ void Decoder::DecodeExt2(Instruction* instr) { |
} else { |
Format(instr, "or 'ra, 'rs, 'rb"); |
} |
- break; |
+ return; |
} |
case MFSPR: { |
int spr = instr->Bits(20, 11); |
@@ -718,7 +714,7 @@ void Decoder::DecodeExt2(Instruction* instr) { |
} else { |
Format(instr, "mfspr 'rt ??"); |
} |
- break; |
+ return; |
} |
case MTSPR: { |
int spr = instr->Bits(20, 11); |
@@ -729,98 +725,113 @@ void Decoder::DecodeExt2(Instruction* instr) { |
} else { |
Format(instr, "mtspr 'rt ??"); |
} |
- break; |
+ return; |
} |
case MFCR: { |
Format(instr, "mfcr 'rt"); |
- break; |
+ return; |
} |
case STWX: { |
Format(instr, "stwx 'rs, 'ra, 'rb"); |
- break; |
+ return; |
} |
case STWUX: { |
Format(instr, "stwux 'rs, 'ra, 'rb"); |
- break; |
+ return; |
} |
case STBX: { |
Format(instr, "stbx 'rs, 'ra, 'rb"); |
- break; |
+ return; |
} |
case STBUX: { |
Format(instr, "stbux 'rs, 'ra, 'rb"); |
- break; |
+ return; |
} |
case STHX: { |
Format(instr, "sthx 'rs, 'ra, 'rb"); |
- break; |
+ return; |
} |
case STHUX: { |
Format(instr, "sthux 'rs, 'ra, 'rb"); |
- break; |
+ return; |
} |
case LWZX: { |
Format(instr, "lwzx 'rt, 'ra, 'rb"); |
- break; |
+ return; |
} |
case LWZUX: { |
Format(instr, "lwzux 'rt, 'ra, 'rb"); |
- break; |
+ return; |
+ } |
+ case LWAX: { |
+ Format(instr, "lwax 'rt, 'ra, 'rb"); |
+ return; |
} |
case LBZX: { |
Format(instr, "lbzx 'rt, 'ra, 'rb"); |
- break; |
+ return; |
} |
case LBZUX: { |
Format(instr, "lbzux 'rt, 'ra, 'rb"); |
- break; |
+ return; |
} |
case LHZX: { |
Format(instr, "lhzx 'rt, 'ra, 'rb"); |
- break; |
+ return; |
} |
case LHZUX: { |
Format(instr, "lhzux 'rt, 'ra, 'rb"); |
- break; |
+ return; |
+ } |
+ case LHAX: { |
+ Format(instr, "lhax 'rt, 'ra, 'rb"); |
+ return; |
} |
#if V8_TARGET_ARCH_PPC64 |
case LDX: { |
Format(instr, "ldx 'rt, 'ra, 'rb"); |
- break; |
+ return; |
} |
case LDUX: { |
Format(instr, "ldux 'rt, 'ra, 'rb"); |
- break; |
+ return; |
} |
case STDX: { |
Format(instr, "stdx 'rt, 'ra, 'rb"); |
- break; |
+ return; |
} |
case STDUX: { |
Format(instr, "stdux 'rt, 'ra, 'rb"); |
- break; |
+ return; |
} |
case MFVSRD: { |
Format(instr, "mffprd 'ra, 'Dt"); |
- break; |
+ return; |
} |
case MFVSRWZ: { |
Format(instr, "mffprwz 'ra, 'Dt"); |
- break; |
+ return; |
} |
case MTVSRD: { |
Format(instr, "mtfprd 'Dt, 'ra"); |
- break; |
+ return; |
} |
case MTVSRWA: { |
Format(instr, "mtfprwa 'Dt, 'ra"); |
- break; |
+ return; |
} |
case MTVSRWZ: { |
Format(instr, "mtfprwz 'Dt, 'ra"); |
- break; |
+ return; |
} |
#endif |
+ } |
+ |
+ switch (instr->Bits(5, 1) << 1) { |
+ case ISEL: { |
+ Format(instr, "isel 'rt, 'ra, 'rb"); |
+ return; |
+ } |
default: { |
Unknown(instr); // not used by V8 |
} |
@@ -913,8 +924,20 @@ void Decoder::DecodeExt4(Instruction* instr) { |
Format(instr, "fabs'. 'Dt, 'Db"); |
break; |
} |
+ case FRIN: { |
+ Format(instr, "frin. 'Dt, 'Db"); |
+ break; |
+ } |
+ case FRIZ: { |
+ Format(instr, "friz. 'Dt, 'Db"); |
+ break; |
+ } |
+ case FRIP: { |
+ Format(instr, "frip. 'Dt, 'Db"); |
+ break; |
+ } |
case FRIM: { |
- Format(instr, "frim 'Dt, 'Db"); |
+ Format(instr, "frim. 'Dt, 'Db"); |
break; |
} |
case FNEG: { |
@@ -1252,18 +1275,6 @@ int Decoder::InstructionDecode(byte* instr_ptr) { |
break; |
} |
#endif |
- |
- case FAKE_OPCODE: { |
- if (instr->Bits(MARKER_SUBOPCODE_BIT, MARKER_SUBOPCODE_BIT) == 1) { |
- int marker_code = instr->Bits(STUB_MARKER_HIGH_BIT, 0); |
- DCHECK(marker_code < F_NEXT_AVAILABLE_STUB_MARKER); |
- MarkerFormat(instr, "stub-marker ", marker_code); |
- } else { |
- int fake_opcode = instr->Bits(FAKE_OPCODE_HIGH_BIT, 0); |
- MarkerFormat(instr, "faker-opcode ", fake_opcode); |
- } |
- break; |
- } |
default: { |
Unknown(instr); |
break; |