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

Unified Diff: runtime/vm/intrinsifier_arm.cc

Issue 16244007: Enable language tests on SIMARM and mark 14 of them as failing. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 7 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: runtime/vm/intrinsifier_arm.cc
===================================================================
--- runtime/vm/intrinsifier_arm.cc (revision 23447)
+++ runtime/vm/intrinsifier_arm.cc (working copy)
@@ -833,7 +833,6 @@
bool Intrinsifier::Integer_bitXorFromInteger(Assembler* assembler) {
Label fall_through;
- __ Untested("Intrinsifier::Integer_bitXorFromInteger");
TestBothArgumentsSmis(assembler, &fall_through); // checks two smis
__ eor(R0, R0, ShifterOperand(R1));
@@ -1126,12 +1125,10 @@
TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
// Both arguments are double, right operand is in R0.
- __ AddImmediate(R0, Double::value_offset() - kHeapObjectTag);
- __ vldrd(D1, Address(R0));
+ __ LoadDFromOffset(D1, R0, Double::value_offset() - kHeapObjectTag);
__ Bind(&double_op);
__ ldr(R0, Address(SP, 1 * kWordSize)); // Left argument.
- __ AddImmediate(R0, Double::value_offset() - kHeapObjectTag);
- __ vldrd(D0, Address(R0));
+ __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
__ vcmpd(D0, D1);
__ vmstat();
@@ -1183,13 +1180,9 @@
TestLastArgumentIsDouble(assembler, &fall_through, &fall_through);
// Both arguments are double, right operand is in R0.
- // Can't use FieldAddress here. R0 is heap-object-tagged, so the offset will
- // not be 4-byte aligned.
- __ AddImmediate(R0, Double::value_offset() - kHeapObjectTag);
- __ vldrd(D1, Address(R0));
+ __ LoadDFromOffset(D1, R0, Double::value_offset() - kHeapObjectTag);
__ ldr(R0, Address(SP, 1 * kWordSize)); // Left argument.
- __ AddImmediate(R0, Double::value_offset() - kHeapObjectTag);
- __ vldrd(D0, Address(R0));
+ __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
switch (kind) {
case Token::kADD: __ vaddd(D0, D0, D1); break;
case Token::kSUB: __ vsubd(D0, D0, D1); break;
@@ -1200,8 +1193,7 @@
const Class& double_class = Class::Handle(
Isolate::Current()->object_store()->double_class());
__ TryAllocate(double_class, &fall_through, R0); // Result register.
- __ AddImmediate(R1, R0, Double::value_offset() - kHeapObjectTag);
- __ vstrd(D0, Address(R1));
+ __ StoreDToOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
__ Ret();
__ Bind(&fall_through);
return false;
@@ -1265,8 +1257,7 @@
const Class& double_class = Class::Handle(
Isolate::Current()->object_store()->double_class());
__ TryAllocate(double_class, &fall_through, R0); // Result register.
- __ AddImmediate(R1, R0, Double::value_offset() - kHeapObjectTag);
- __ vstrd(D0, Address(R1));
+ __ StoreDToOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
__ Ret();
__ Bind(&fall_through);
return false;
@@ -1276,8 +1267,7 @@
bool Intrinsifier::Double_getIsNaN(Assembler* assembler) {
Label is_true;
__ ldr(R0, Address(SP, 0 * kWordSize));
- __ AddImmediate(R0, Double::value_offset() - kHeapObjectTag);
- __ vldrd(D0, Address(R0));
+ __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
__ vcmpd(D0, D0);
__ vmstat();
__ LoadObject(R0, Bool::False(), VC);
@@ -1289,10 +1279,8 @@
bool Intrinsifier::Double_getIsNegative(Assembler* assembler) {
Label is_false, is_true, is_zero;
- __ Untested("Intrinsifier::Double_getIsNegative");
__ ldr(R0, Address(SP, 0 * kWordSize));
- __ AddImmediate(R0, Double::value_offset() - kHeapObjectTag);
- __ vldrd(D0, Address(R0));
+ __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
__ LoadDImmediate(D1, 0.0, R1);
__ vcmpd(D0, D1);
__ vmstat();
@@ -1321,8 +1309,7 @@
bool Intrinsifier::Double_toInt(Assembler* assembler) {
__ ldr(R0, Address(SP, 0 * kWordSize));
- __ AddImmediate(R0, Double::value_offset() - kHeapObjectTag);
- __ vldrd(D0, Address(R0));
+ __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
__ vcvtid(S0, D0);
__ vmovrs(R0, S0);
// Overflow is signaled with minint.
@@ -1339,18 +1326,15 @@
bool Intrinsifier::Math_sqrt(Assembler* assembler) {
Label fall_through, is_smi, double_op;
- __ Untested("Intrinsifier::Math_sqrt");
TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
// Argument is double and is in R0.
- __ AddImmediate(R0, Double::value_offset() - kHeapObjectTag);
- __ vldrd(D1, Address(R0));
+ __ LoadDFromOffset(D1, R0, Double::value_offset() - kHeapObjectTag);
__ Bind(&double_op);
__ vsqrtd(D0, D1);
const Class& double_class = Class::Handle(
Isolate::Current()->object_store()->double_class());
__ TryAllocate(double_class, &fall_through, R0); // Result register.
- __ AddImmediate(R1, R0, Double::value_offset() - kHeapObjectTag);
- __ vstrd(D0, Address(R1));
+ __ StoreDToOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
__ Ret();
__ Bind(&is_smi);
__ SmiUntag(R0);
@@ -1394,8 +1378,6 @@
ASSERT(Utils::IsUint(32, a_int_value));
int32_t a_int32_value = static_cast<int32_t>(a_int_value);
- __ Untested("Random_nextState");
-
__ ldr(R0, Address(SP, 0 * kWordSize)); // Receiver.
__ ldr(R1, FieldAddress(R0, state_field.Offset())); // Field '_state'.
// Addresses of _state[0] and _state[1].

Powered by Google App Engine
This is Rietveld 408576698