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

Unified Diff: runtime/vm/simulator_arm.cc

Issue 17742003: Fixes floating point bug in ARM simulator. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 6 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/simulator_arm.h ('k') | tests/co19/co19-runtime.status » ('j') | 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 24471)
+++ runtime/vm/simulator_arm.cc (working copy)
@@ -760,7 +760,7 @@
// All double-precision registers are initialized to zero.
for (int i = 0; i < kNumberOfDRegisters; i++) {
- dregisters_[i] = 0.0;
+ dregisters_[i] = 0;
}
// Since VFP registers are overlapping, single-precision registers should
// already be initialized.
@@ -901,24 +901,48 @@
// Accessors for VFP register state.
void Simulator::set_sregister(SRegister reg, float value) {
ASSERT((reg >= 0) && (reg < kNumberOfSRegisters));
- sregisters_[reg] = value;
+ sregisters_[reg] = bit_cast<int32_t, float>(value);
}
float Simulator::get_sregister(SRegister reg) const {
ASSERT((reg >= 0) && (reg < kNumberOfSRegisters));
- return sregisters_[reg];
+ return bit_cast<float, int32_t>(sregisters_[reg]);
}
void Simulator::set_dregister(DRegister reg, double value) {
ASSERT((reg >= 0) && (reg < kNumberOfDRegisters));
- dregisters_[reg] = value;
+ dregisters_[reg] = bit_cast<int64_t, double>(value);
}
double Simulator::get_dregister(DRegister reg) const {
ASSERT((reg >= 0) && (reg < kNumberOfDRegisters));
+ return bit_cast<double, int64_t>(dregisters_[reg]);
+}
+
+
+void Simulator::set_sregister_bits(SRegister reg, int32_t value) {
+ ASSERT((reg >= 0) && (reg < kNumberOfSRegisters));
+ sregisters_[reg] = value;
+}
+
+
+int32_t Simulator::get_sregister_bits(SRegister reg) const {
+ ASSERT((reg >= 0) && (reg < kNumberOfSRegisters));
+ return sregisters_[reg];
+}
+
+
+void Simulator::set_dregister_bits(DRegister reg, int64_t value) {
+ ASSERT((reg >= 0) && (reg < kNumberOfDRegisters));
+ dregisters_[reg] = value;
+}
+
+
+int64_t Simulator::get_dregister_bits(DRegister reg) const {
+ ASSERT((reg >= 0) && (reg < kNumberOfDRegisters));
return dregisters_[reg];
}
@@ -2371,25 +2395,25 @@
ASSERT(sm1 < kNumberOfSRegisters);
if (instr->Bit(20) == 1) {
// Format(instr, "vmovrrs'cond 'rd, 'rn, {'sm', 'sm1}");
- set_register(rd, bit_cast<int32_t, float>(get_sregister(sm)));
- set_register(rn, bit_cast<int32_t, float>(get_sregister(sm1)));
+ set_register(rd, get_sregister_bits(sm));
+ set_register(rn, get_sregister_bits(sm1));
} else {
// Format(instr, "vmovsrr'cond {'sm, 'sm1}, 'rd', 'rn");
- set_sregister(sm, bit_cast<float, int32_t>(get_register(rd)));
- set_sregister(sm1, bit_cast<float, int32_t>(get_register(rn)));
+ set_sregister_bits(sm, get_register(rd));
+ set_sregister_bits(sm1, get_register(rn));
}
} else {
DRegister dm = instr->DmField();
if (instr->Bit(20) == 1) {
// Format(instr, "vmovrrd'cond 'rd, 'rn, 'dm");
- int64_t dm_val = bit_cast<int64_t, double>(get_dregister(dm));
+ int64_t dm_val = get_dregister_bits(dm);
set_register(rd, Utils::Low32Bits(dm_val));
set_register(rn, Utils::High32Bits(dm_val));
} else {
// Format(instr, "vmovdrr'cond 'dm, 'rd, 'rn");
int64_t dm_val = Utils::LowHighTo64Bits(get_register(rd),
get_register(rn));
- set_dregister(dm, bit_cast<double, int64_t>(dm_val));
+ set_dregister_bits(dm, dm_val);
}
}
} else if (instr-> IsVFPLoadStore()) {
@@ -2409,11 +2433,11 @@
if (instr->Bit(20) == 1) { // vldrs
// Format(instr, "vldrs'cond 'sd, ['rn, #+'off10]");
// Format(instr, "vldrs'cond 'sd, ['rn, #-'off10]");
- set_sregister(sd, bit_cast<float, int32_t>(ReadW(addr, instr)));
+ set_sregister_bits(sd, ReadW(addr, instr));
} else { // vstrs
// Format(instr, "vstrs'cond 'sd, ['rn, #+'off10]");
// Format(instr, "vstrs'cond 'sd, ['rn, #-'off10]");
- WriteW(addr, bit_cast<int32_t, float>(get_sregister(sd)), instr);
+ WriteW(addr, get_sregister_bits(sd), instr);
}
} else {
DRegister dd = instr->DdField();
@@ -2422,11 +2446,11 @@
// Format(instr, "vldrd'cond 'dd, ['rn, #-'off10]");
int64_t dd_val = Utils::LowHighTo64Bits(ReadW(addr, instr),
ReadW(addr + 4, instr));
- set_dregister(dd, bit_cast<double, int64_t>(dd_val));
+ set_dregister_bits(dd, dd_val);
} else { // vstrd
// Format(instr, "vstrd'cond 'dd, ['rn, #+'off10]");
// Format(instr, "vstrd'cond 'dd, ['rn, #-'off10]");
- int64_t dd_val = bit_cast<int64_t, double>(get_dregister(dd));
+ int64_t dd_val = get_dregister_bits(dd);
WriteW(addr, Utils::Low32Bits(dd_val), instr);
WriteW(addr + 4, Utils::High32Bits(dd_val), instr);
}
@@ -2456,10 +2480,10 @@
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)));
+ set_sregister_bits(sd, ReadW(addr, instr));
} else {
// Format(instr, "vstms'cond'pu 'rn'w, 'slist");
- WriteW(addr, bit_cast<int32_t, float>(get_sregister(sd)), instr);
+ WriteW(addr, get_sregister_bits(sd), instr);
}
addr += 4;
}
@@ -2472,10 +2496,10 @@
// 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));
+ set_dregister_bits(dd, dd_val);
} else {
// Format(instr, "vstmd'cond'pu 'rn'w, 'dlist");
- int64_t dd_val = bit_cast<int64_t, double>(get_dregister(dd));
+ int64_t dd_val = get_dregister_bits(dd);
WriteW(addr, Utils::Low32Bits(dd_val), instr);
WriteW(addr + 4, Utils::High32Bits(dd_val), instr);
}
@@ -2726,13 +2750,13 @@
}
case 8: { // vcvt, vcvtr between floating-point and integer
sm = instr->SmField();
- float sm_val = get_sregister(sm);
+ int32_t sm_int = get_sregister_bits(sm);
uint32_t ud_val = 0;
int32_t id_val = 0;
if (instr->Bit(7) == 0) { // vcvtsu, vcvtdu
- ud_val = bit_cast<uint32_t, float>(sm_val);
+ ud_val = static_cast<uint32_t>(sm_int);
} else { // vcvtsi, vcvtdi
- id_val = bit_cast<int32_t, float>(sm_val);
+ id_val = sm_int;
}
if (instr->Bit(8) == 0) {
float sd_val;
@@ -2810,13 +2834,13 @@
ASSERT((id_val >= 0) || !(dm_val >= 0.0));
}
}
- float sd_val;
+ int32_t sd_val;
if (instr->Bit(16) == 0) {
- sd_val = bit_cast<float, uint32_t>(ud_val);
+ sd_val = static_cast<int32_t>(ud_val);
} else {
- sd_val = bit_cast<float, int32_t>(id_val);
+ sd_val = id_val;
}
- set_sregister(sd, sd_val);
+ set_sregister_bits(sd, sd_val);
break;
}
case 2: // vcvtb, vcvtt
@@ -2841,10 +2865,10 @@
SRegister sn = instr->SnField();
if (instr->Bit(20) == 0) {
// Format(instr, "vmovs'cond 'sn, 'rd");
- set_sregister(sn, bit_cast<float, int32_t>(get_register(rd)));
+ set_sregister_bits(sn, get_register(rd));
} else {
// Format(instr, "vmovr'cond 'rd, 'sn");
- set_register(rd, bit_cast<int32_t, float>(get_sregister(sn)));
+ set_register(rd, get_sregister_bits(sn));
}
} else if ((instr->Bits(20, 4) == 0xf) && (instr->Bit(8) == 0) &&
(instr->Bits(12, 4) == 0xf)) {
« no previous file with comments | « runtime/vm/simulator_arm.h ('k') | tests/co19/co19-runtime.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698