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

Unified Diff: runtime/vm/simulator_arm.cc

Issue 12390039: Adds vstm, vldm to ARM simulator, assembler, disassembler (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 10 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
« no previous file with comments | « runtime/vm/disassembler_arm.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/simulator_arm.cc
===================================================================
--- runtime/vm/simulator_arm.cc (revision 19401)
+++ runtime/vm/simulator_arm.cc (working copy)
@@ -195,6 +195,9 @@
if ((desc[0] == '*')) {
uint32_t addr;
if (GetValue(desc + 1, &addr)) {
+ if (Simulator::IsIllegalAddress(addr)) {
+ return false;
+ }
*value = *(reinterpret_cast<uint32_t*>(addr));
return true;
}
@@ -216,6 +219,9 @@
if ((desc[0] == '*')) {
uint32_t addr;
if (GetValue(desc + 1, &addr)) {
+ if (Simulator::IsIllegalAddress(addr)) {
+ return false;
+ }
*value = *(reinterpret_cast<float*>(addr));
return true;
}
@@ -233,6 +239,9 @@
if ((desc[0] == '*')) {
uint32_t addr;
if (GetValue(desc + 1, &addr)) {
+ if (Simulator::IsIllegalAddress(addr)) {
+ return false;
+ }
*value = *(reinterpret_cast<double*>(addr));
return true;
}
@@ -2151,6 +2160,57 @@
}
}
}
+ } else if (instr->IsVFPMultipleLoadStore()) {
+ Register rn = instr->RnField();
+ int32_t addr = get_register(rn);
+ int32_t imm_val = instr->Bits(0, 8);
+ if (instr->Bit(23) == 0) {
+ addr -= (imm_val << 2);
+ }
+ if (instr->HasW()) {
+ if (instr->Bit(23) == 1) {
+ set_register(rn, addr + (imm_val << 2));
+ } else {
+ set_register(rn, addr); // already subtracted from addr
+ }
+ }
+ if (IsIllegalAddress(addr)) {
+ HandleIllegalAccess(addr, instr);
+ } else {
+ if (instr->Bit(8) == 0) {
+ int32_t regs_cnt = imm_val;
+ int32_t start = instr->Bit(22) | (instr->Bits(12, 4) << 1);
+ for (int i = start; i < start + regs_cnt; i++) {
+ SRegister sd = static_cast<SRegister>(i);
+ if (instr->Bit(20) == 1) {
+ // Format(instr, "vldms'cond'pu 'rn'w, 'slist");
+ set_sregister(sd, bit_cast<float, int32_t>(ReadW(addr, instr)));
+ } else {
+ // Format(instr, "vstms'cond'pu 'rn'w, 'slist");
+ WriteW(addr, bit_cast<int32_t, float>(get_sregister(sd)), instr);
+ }
+ addr += 4;
+ }
+ } else {
+ int32_t regs_cnt = imm_val >> 1;
+ int32_t start = (instr->Bit(22) << 4) | instr->Bits(12, 4);
+ for (int i = start; i < start + regs_cnt; i++) {
+ DRegister dd = static_cast<DRegister>(i);
+ if (instr->Bit(20) == 1) {
+ // Format(instr, "vldmd'cond'pu 'rn'w, 'dlist");
+ int64_t dd_val = Utils::LowHighTo64Bits(ReadW(addr, instr),
+ ReadW(addr + 4, instr));
+ set_dregister(dd, bit_cast<double, int64_t>(dd_val));
+ } else {
+ // Format(instr, "vstmd'cond'pu 'rn'w, 'dlist");
+ int64_t dd_val = bit_cast<int64_t, double>(get_dregister(dd));
+ WriteW(addr, Utils::Low32Bits(dd_val), instr);
+ WriteW(addr + 4, Utils::High32Bits(dd_val), instr);
+ }
+ addr += 8;
+ }
+ }
+ }
} else {
UNIMPLEMENTED();
}
« no previous file with comments | « runtime/vm/disassembler_arm.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698