Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Unified Diff: src/arm/disasm-arm.cc

Issue 6691057: ARM: Add support load/store multiple VFP registers (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Minor fixes Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/arm/disasm-arm.cc
diff --git a/src/arm/disasm-arm.cc b/src/arm/disasm-arm.cc
index 899b88a6d3399b2736b4aaeb17cb57ef17b292e7..ee9f3f4bc45bf2e23134d15d2e99537b140514bf 100644
--- a/src/arm/disasm-arm.cc
+++ b/src/arm/disasm-arm.cc
@@ -383,9 +383,15 @@ int Decoder::FormatVFPRegister(Instruction* instr, const char* format) {
return 2;
} else if (format[1] == 'd') {
int reg = instr->VdValue();
- if (format[0] == 'S') PrintSRegister(((reg << 1) | instr->DValue()));
+ if (format[0] == 'S') reg = reg << 1 | instr->DValue();
Rodolph Perfetta 2011/04/05 18:16:39 Using instr->VFPDRegValue(kSinglePrecision) would
Søren Thygesen Gjesse 2011/04/06 08:00:09 Changed to use instr->VFPXRegValue (X=M|M|D) in al
+ if (format[2] == '+') {
+ int immed8 = instr->Immed8Value();
+ if (format[0] == 'S') reg += immed8 - 1;
+ if (format[0] == 'D') reg += (immed8 / 2 - 1);
+ }
+ if (format[0] == 'S') PrintSRegister(reg);
if (format[0] == 'D') PrintDRegister(reg);
- return 2;
+ return format[2] == '+' ? 3 : 2;
}
UNREACHABLE();
@@ -1273,9 +1279,22 @@ void Decoder::DecodeType6CoprocessorIns(Instruction* instr) {
Format(instr, "vstr'cond 'Sd, ['rn + 4*'imm08@00]");
}
break;
- default:
- Unknown(instr); // Not used by V8.
+ default: {
Rodolph Perfetta 2011/04/05 18:16:39 VLDM/VSTM covers cases 0x4-0x7, 0x9, 0xB for singl
Søren Thygesen Gjesse 2011/04/06 08:00:09 Changed to use 6 explicit case values and default
+ BlockAddrMode am =
+ static_cast<BlockAddrMode>(
+ instr->BitField(24, 21) & kBlockAddrModeMask);
+ if (am == ia || am == ia_w || am == db_w) {
+ bool to_arm_register = (instr->VLValue() == 0x1);
Rodolph Perfetta 2011/04/05 18:16:39 This variable has a confusing name. It sounds like
Søren Thygesen Gjesse 2011/04/06 08:00:09 Changed to to_vfp_regsiter.
+ if (to_arm_register) {
+ Format(instr, "vldm'cond'pu 'rn'w, {'Sd-'Sd+}");
+ } else {
+ Format(instr, "vstm'cond'pu 'rn'w, {'Sd-'Sd+}");
+ }
+ } else {
+ Unknown(instr); // Not used by V8.
+ }
break;
+ }
}
} else if (instr->CoprocessorValue() == 0xB) {
switch (instr->OpcodeValue()) {
@@ -1303,9 +1322,22 @@ void Decoder::DecodeType6CoprocessorIns(Instruction* instr) {
Format(instr, "vstr'cond 'Dd, ['rn + 4*'imm08@00]");
}
break;
- default:
- Unknown(instr); // Not used by V8.
+ default: {
Rodolph Perfetta 2011/04/05 18:16:39 VLDM/VSTM covers cases 0x4, 0x5, 0x9 for double pr
Søren Thygesen Gjesse 2011/04/06 08:00:09 Changed to use 3 explicit case values and default
+ BlockAddrMode am =
+ static_cast<BlockAddrMode>(
+ instr->BitField(24, 21) & kBlockAddrModeMask);
+ if (am == ia || am == ia_w || am == db_w) {
+ bool to_arm_register = (instr->VLValue() == 0x1);
+ if (to_arm_register) {
+ Format(instr, "vldm'cond'pu 'rn'w, {'Dd-'Dd+}");
+ } else {
+ Format(instr, "vstm'cond'pu 'rn'w, {'Dd-'Dd+}");
+ }
+ } else {
+ Unknown(instr); // Not used by V8.
+ }
break;
+ }
}
} else {
Unknown(instr); // Not used by V8.

Powered by Google App Engine
This is Rietveld 408576698