Index: src/arm/disasm-arm.cc |
diff --git a/src/arm/disasm-arm.cc b/src/arm/disasm-arm.cc |
index cb0a6cb5c70235881ec64fbccab3adbf50cb971a..79a996c32a73da71dd55c75ba7ac378ea7575903 100644 |
--- a/src/arm/disasm-arm.cc |
+++ b/src/arm/disasm-arm.cc |
@@ -192,7 +192,7 @@ void Decoder::PrintSRegister(int reg) { |
Print(VFPRegisters::Name(reg, false)); |
} |
-// Print the VFP D register name according to the active name converter. |
+// Print the VFP D register name according to the active name converter. |
void Decoder::PrintDRegister(int reg) { |
Print(VFPRegisters::Name(reg, true)); |
} |
@@ -381,7 +381,16 @@ int Decoder::FormatVFPRegister(Instruction* instr, const char* format) { |
} else if (format[1] == 'm') { |
reg = instr->VFPMRegValue(precision); |
} else if (format[1] == 'd') { |
- reg = instr->VFPDRegValue(precision); |
+ if ((instr->TypeValue() == 7) && |
+ (instr->Bit(24) == 0x0) && |
+ (instr->Bits(11, 9) == 0x5) && |
+ (instr->Bit(4) == 0x1)) { |
+ // vmov.32 has Vd in a different place. |
+ reg = instr->Bits(19, 16) | (instr->Bit(7) << 4); |
+ } else { |
+ reg = instr->VFPDRegValue(precision); |
+ } |
+ |
if (format[2] == '+') { |
int immed8 = instr->Immed8Value(); |
if (format[0] == 'S') reg += immed8 - 1; |
@@ -1180,6 +1189,14 @@ void Decoder::DecodeTypeVFP(Instruction* instr) { |
if ((instr->VCValue() == 0x0) && |
(instr->VAValue() == 0x0)) { |
DecodeVMOVBetweenCoreAndSinglePrecisionRegisters(instr); |
+ } else if ((instr->VLValue() == 0x0) && |
+ (instr->VCValue() == 0x1) && |
+ (instr->Bit(23) == 0x0)) { |
+ if (instr->Bit(21) == 0x0) { |
+ Format(instr, "vmov.32'cond 'Dd[0], 'rt"); |
+ } else { |
+ Format(instr, "vmov.32'cond 'Dd[1], 'rt"); |
+ } |
} else if ((instr->VCValue() == 0x0) && |
(instr->VAValue() == 0x7) && |
(instr->Bits(19, 16) == 0x1)) { |
@@ -1343,7 +1360,7 @@ void Decoder::DecodeType6CoprocessorIns(Instruction* instr) { |
switch (instr->OpcodeValue()) { |
case 0x2: |
// Load and store double to two GP registers |
- if (instr->Bits(7, 4) != 0x1) { |
+ if (instr->Bits(7, 6) != 0 || instr->Bit(4) != 1) { |
Unknown(instr); // Not used by V8. |
} else if (instr->HasL()) { |
Format(instr, "vmov'cond 'rt, 'rn, 'Dm"); |
@@ -1352,6 +1369,7 @@ void Decoder::DecodeType6CoprocessorIns(Instruction* instr) { |
} |
break; |
case 0x8: |
+ case 0xA: |
if (instr->HasL()) { |
Format(instr, "vldr'cond 'Dd, ['rn - 4*'imm08@00]"); |
} else { |
@@ -1359,6 +1377,7 @@ void Decoder::DecodeType6CoprocessorIns(Instruction* instr) { |
} |
break; |
case 0xC: |
+ case 0xE: |
if (instr->HasL()) { |
Format(instr, "vldr'cond 'Dd, ['rn + 4*'imm08@00]"); |
} else { |
@@ -1367,7 +1386,10 @@ void Decoder::DecodeType6CoprocessorIns(Instruction* instr) { |
break; |
case 0x4: |
case 0x5: |
- case 0x9: { |
+ case 0x6: |
+ case 0x7: |
+ case 0x9: |
+ case 0xB: { |
bool to_vfp_register = (instr->VLValue() == 0x1); |
if (to_vfp_register) { |
Format(instr, "vldm'cond'pu 'rn'w, {'Dd-'Dd+}"); |