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

Unified Diff: runtime/vm/assembler_arm_test.cc

Issue 1043943002: A few fixes for ARMv5TE. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 5 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: runtime/vm/assembler_arm_test.cc
===================================================================
--- runtime/vm/assembler_arm_test.cc (revision 44777)
+++ runtime/vm/assembler_arm_test.cc (working copy)
@@ -455,18 +455,28 @@
ASSEMBLER_TEST_GENERATE(FloatToDoubleConversion, assembler) {
- __ LoadSImmediate(S2, 12.8f);
- __ vcvtds(D0, S2);
+ if (TargetCPUFeatures::vfp_supported()) {
+ __ LoadSImmediate(S2, 12.8f);
+ __ vcvtds(D0, S2);
+ } else {
+ __ LoadImmediate(R0, 0);
+ }
__ bx(LR);
}
ASSEMBLER_TEST_RUN(FloatToDoubleConversion, test) {
- typedef double (*FloatToDoubleConversionCode)() DART_UNUSED;
- EXPECT(test != NULL);
- double res = EXECUTE_TEST_CODE_DOUBLE(FloatToDoubleConversionCode,
- test->entry());
- EXPECT_FLOAT_EQ(12.8, res, 0.001);
+ if (TargetCPUFeatures::vfp_supported()) {
+ typedef double (*FloatToDoubleConversionCode)() DART_UNUSED;
+ EXPECT(test != NULL);
+ double res = EXECUTE_TEST_CODE_DOUBLE(FloatToDoubleConversionCode,
+ test->entry());
+ EXPECT_FLOAT_EQ(12.8, res, 0.001);
+ } else {
srdjan 2015/03/30 17:39:50 Maybe you just want to do nothing instead of runni
zra 2015/03/30 20:02:05 Changed here, and used the same pattern for all ne
+ typedef int (*FloatToDoubleConversionCode)() DART_UNUSED;
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(FloatToDoubleConversionCode,
+ test->entry()));
+ }
}
@@ -939,20 +949,8 @@
ASSEMBLER_TEST_GENERATE(Multiply32To64, assembler) {
-#if defined(USING_SIMULATOR)
- const ARMVersion version = TargetCPUFeatures::arm_version();
- HostCPUFeatures::set_arm_version(ARMv7);
-#endif
- if (TargetCPUFeatures::arm_version() == ARMv7) {
- __ smull(R0, R1, R0, R2);
- } else {
- __ LoadImmediate(R0, 6);
- __ LoadImmediate(R1, 0);
- }
+ __ smull(R0, R1, R0, R2);
__ bx(LR);
-#if defined(USING_SIMULATOR)
- HostCPUFeatures::set_arm_version(version);
-#endif
}
@@ -1274,10 +1272,12 @@
ASSEMBLER_TEST_GENERATE(Ldrd, assembler) {
__ mov(IP, Operand(SP));
- __ strd(R2, Address(SP, (-kWordSize * 30), Address::PreIndex));
- __ strd(R0, Address(IP, (-kWordSize * 28)));
- __ ldrd(R2, Address(IP, (-kWordSize * 28)));
- __ ldrd(R0, Address(SP, (kWordSize * 30), Address::PostIndex));
+ __ sub(SP, SP, Operand(kWordSize*30));
+ __ strd(R2, SP, 0);
+ __ strd(R0, IP, (-kWordSize*28));
+ __ ldrd(R2, IP, (-kWordSize*28));
+ __ ldrd(R0, SP, 0);
+ __ add(SP, SP, Operand(kWordSize*30));
__ sub(R0, R0, Operand(R2));
__ add(R1, R1, Operand(R3));
__ bx(LR);
@@ -1909,9 +1909,13 @@
HostCPUFeatures::set_integer_division_supported(orig);
__ bx(LR);
#else
- __ mov(R0, Operand(27));
- __ mov(R1, Operand(9));
- __ IntegerDivide(R0, R0, R1, D0, D1);
+ if (TargetCPUFeatures::can_divide()) {
+ __ mov(R0, Operand(27));
+ __ mov(R1, Operand(9));
+ __ IntegerDivide(R0, R0, R1, D0, D1);
+ } else {
+ __ LoadImmediate(R0, 3);
srdjan 2015/03/30 17:39:50 ditto
zra 2015/03/30 20:02:05 Done.
+ }
__ bx(LR);
#endif
}
@@ -1934,9 +1938,13 @@
HostCPUFeatures::set_integer_division_supported(orig);
__ bx(LR);
#else
- __ mov(R0, Operand(27));
- __ mov(R1, Operand(9));
- __ IntegerDivide(R0, R0, R1, D0, D1);
+ if (TargetCPUFeatures::can_divide()) {
+ __ mov(R0, Operand(27));
+ __ mov(R1, Operand(9));
+ __ IntegerDivide(R0, R0, R1, D0, D1);
+ } else {
+ __ LoadImmediate(R0, 3);
srdjan 2015/03/30 17:39:50 ditto
zra 2015/03/30 20:02:05 Done.
+ }
__ bx(LR);
#endif
}
@@ -3220,7 +3228,8 @@
ASSEMBLER_TEST_GENERATE(Vzipqw, assembler) {
- if (TargetCPUFeatures::neon_supported()) {
+ if (TargetCPUFeatures::vfp_supported() &&
+ TargetCPUFeatures::neon_supported()) {
__ LoadSImmediate(S0, 0.0);
__ LoadSImmediate(S1, 1.0);
__ LoadSImmediate(S2, 2.0);
@@ -3237,19 +3246,25 @@
__ vadds(S0, S0, S1);
__ vadds(S0, S0, S2);
__ vadds(S0, S0, S3);
- __ bx(LR);
+ } else if (TargetCPUFeatures::vfp_supported()) {
+ __ LoadSImmediate(S0, 8.0);
} else {
- __ LoadSImmediate(S0, 8.0);
- __ bx(LR);
+ __ LoadImmediate(R0, 0);
}
+ __ bx(LR);
}
ASSEMBLER_TEST_RUN(Vzipqw, test) {
EXPECT(test != NULL);
- typedef float (*Vzipqw)() DART_UNUSED;
- float res = EXECUTE_TEST_CODE_FLOAT(Vzipqw, test->entry());
- EXPECT_FLOAT_EQ(8.0, res, 0.0001f);
+ if (TargetCPUFeatures::vfp_supported()) {
+ typedef float (*Vzipqw)() DART_UNUSED;
+ float res = EXECUTE_TEST_CODE_FLOAT(Vzipqw, test->entry());
+ EXPECT_FLOAT_EQ(8.0, res, 0.0001f);
srdjan 2015/03/30 17:39:50 ditto
zra 2015/03/30 20:02:05 Done.
+ } else {
+ typedef int (*Vzipqw)() DART_UNUSED;
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Vzipqw, test->entry()));
+ }
}
@@ -3687,32 +3702,38 @@
ASSEMBLER_TEST_GENERATE(Vrecpeqs, assembler) {
- if (TargetCPUFeatures::neon_supported()) {
+ if (TargetCPUFeatures::vfp_supported() &&
+ TargetCPUFeatures::neon_supported()) {
__ LoadSImmediate(S4, 147.0);
__ vmovs(S5, S4);
__ vmovs(S6, S4);
__ vmovs(S7, S4);
-
__ vrecpeqs(Q0, Q1);
-
- __ bx(LR);
+ } else if (TargetCPUFeatures::vfp_supported()) {
+ __ LoadSImmediate(S0, arm_recip_estimate(147.0));
} else {
- __ LoadSImmediate(S0, arm_recip_estimate(147.0));
- __ bx(LR);
+ __ LoadImmediate(R0, 0);
}
+ __ bx(LR);
}
ASSEMBLER_TEST_RUN(Vrecpeqs, test) {
EXPECT(test != NULL);
- typedef float (*Vrecpeqs)() DART_UNUSED;
- float res = EXECUTE_TEST_CODE_FLOAT(Vrecpeqs, test->entry());
- EXPECT_FLOAT_EQ(arm_recip_estimate(147.0), res, 0.0001f);
+ if (TargetCPUFeatures::vfp_supported()) {
+ typedef float (*Vrecpeqs)() DART_UNUSED;
+ float res = EXECUTE_TEST_CODE_FLOAT(Vrecpeqs, test->entry());
+ EXPECT_FLOAT_EQ(arm_recip_estimate(147.0), res, 0.0001f);
+ } else {
+ typedef int (*Vrecpeqs)() DART_UNUSED;
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Vrecpeqs, test->entry()));
+ }
}
ASSEMBLER_TEST_GENERATE(Vrecpsqs, assembler) {
- if (TargetCPUFeatures::neon_supported()) {
+ if (TargetCPUFeatures::vfp_supported() &&
+ TargetCPUFeatures::neon_supported()) {
__ LoadSImmediate(S4, 5.0);
__ LoadSImmediate(S5, 2.0);
__ LoadSImmediate(S6, 3.0);
@@ -3724,25 +3745,31 @@
__ LoadSImmediate(S11, 3.0);
__ vrecpsqs(Q0, Q1, Q2);
-
- __ bx(LR);
+ } else if (TargetCPUFeatures::vfp_supported()) {
+ __ LoadSImmediate(S0, 2.0 - 10.0 * 5.0);
} else {
- __ LoadSImmediate(S0, 2.0 - 10.0 * 5.0);
- __ bx(LR);
+ __ LoadImmediate(R0, 0);
}
+ __ bx(LR);
}
ASSEMBLER_TEST_RUN(Vrecpsqs, test) {
EXPECT(test != NULL);
- typedef float (*Vrecpsqs)() DART_UNUSED;
- float res = EXECUTE_TEST_CODE_FLOAT(Vrecpsqs, test->entry());
- EXPECT_FLOAT_EQ(2.0 - 10.0 * 5.0, res, 0.0001f);
+ if (TargetCPUFeatures::vfp_supported()) {
+ typedef float (*Vrecpsqs)() DART_UNUSED;
+ float res = EXECUTE_TEST_CODE_FLOAT(Vrecpsqs, test->entry());
+ EXPECT_FLOAT_EQ(2.0 - 10.0 * 5.0, res, 0.0001f);
+ } else {
+ typedef int (*Vrecpsqs)() DART_UNUSED;
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Vrecpsqs, test->entry()));
+ }
}
ASSEMBLER_TEST_GENERATE(Reciprocal, assembler) {
- if (TargetCPUFeatures::neon_supported()) {
+ if (TargetCPUFeatures::vfp_supported() &&
+ TargetCPUFeatures::neon_supported()) {
__ LoadSImmediate(S4, 147000.0);
__ vmovs(S5, S4);
__ vmovs(S6, S4);
@@ -3755,20 +3782,25 @@
__ vmulqs(Q0, Q0, Q2);
__ vrecpsqs(Q2, Q1, Q0);
__ vmulqs(Q0, Q0, Q2);
-
- __ bx(LR);
+ } else if (TargetCPUFeatures::vfp_supported()) {
+ __ LoadSImmediate(S0, 1.0/147000.0);
} else {
- __ LoadSImmediate(S0, 1.0/147000.0);
- __ bx(LR);
+ __ LoadImmediate(R0, 0);
}
+ __ bx(LR);
}
ASSEMBLER_TEST_RUN(Reciprocal, test) {
EXPECT(test != NULL);
- typedef float (*Reciprocal)() DART_UNUSED;
- float res = EXECUTE_TEST_CODE_FLOAT(Reciprocal, test->entry());
- EXPECT_FLOAT_EQ(1.0/147000.0, res, 0.0001f);
+ if (TargetCPUFeatures::vfp_supported()) {
+ typedef float (*Reciprocal)() DART_UNUSED;
+ float res = EXECUTE_TEST_CODE_FLOAT(Reciprocal, test->entry());
+ EXPECT_FLOAT_EQ(1.0/147000.0, res, 0.0001f);
+ } else {
+ typedef int (*Reciprocal)() DART_UNUSED;
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Reciprocal, test->entry()));
+ }
}
@@ -3824,7 +3856,8 @@
ASSEMBLER_TEST_GENERATE(Vrsqrteqs, assembler) {
- if (TargetCPUFeatures::neon_supported()) {
+ if (TargetCPUFeatures::vfp_supported() &&
+ TargetCPUFeatures::neon_supported()) {
__ LoadSImmediate(S4, 147.0);
__ vmovs(S5, S4);
__ vmovs(S6, S4);
@@ -3831,25 +3864,31 @@
__ vmovs(S7, S4);
__ vrsqrteqs(Q0, Q1);
-
- __ bx(LR);
+ } else if (TargetCPUFeatures::vfp_supported()) {
+ __ LoadSImmediate(S0, arm_reciprocal_sqrt_estimate(147.0));
} else {
- __ LoadSImmediate(S0, arm_reciprocal_sqrt_estimate(147.0));
- __ bx(LR);
+ __ LoadImmediate(R0, 0);
}
+ __ bx(LR);
}
ASSEMBLER_TEST_RUN(Vrsqrteqs, test) {
EXPECT(test != NULL);
- typedef float (*Vrsqrteqs)() DART_UNUSED;
- float res = EXECUTE_TEST_CODE_FLOAT(Vrsqrteqs, test->entry());
- EXPECT_FLOAT_EQ(arm_reciprocal_sqrt_estimate(147.0), res, 0.0001f);
+ if (TargetCPUFeatures::vfp_supported()) {
+ typedef float (*Vrsqrteqs)() DART_UNUSED;
+ float res = EXECUTE_TEST_CODE_FLOAT(Vrsqrteqs, test->entry());
+ EXPECT_FLOAT_EQ(arm_reciprocal_sqrt_estimate(147.0), res, 0.0001f);
+ } else {
+ typedef int (*Vrsqrteqs)() DART_UNUSED;
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Vrsqrteqs, test->entry()));
+ }
}
ASSEMBLER_TEST_GENERATE(Vrsqrtsqs, assembler) {
- if (TargetCPUFeatures::neon_supported()) {
+ if (TargetCPUFeatures::vfp_supported() &&
+ TargetCPUFeatures::neon_supported()) {
__ LoadSImmediate(S4, 5.0);
__ LoadSImmediate(S5, 2.0);
__ LoadSImmediate(S6, 3.0);
@@ -3861,25 +3900,31 @@
__ LoadSImmediate(S11, 3.0);
__ vrsqrtsqs(Q0, Q1, Q2);
-
- __ bx(LR);
+ } else if (TargetCPUFeatures::vfp_supported()) {
+ __ LoadSImmediate(S0, (3.0 - 10.0 * 5.0) / 2.0);
} else {
- __ LoadSImmediate(S0, (3.0 - 10.0 * 5.0) / 2.0);
- __ bx(LR);
+ __ LoadImmediate(R0, 0);
}
+ __ bx(LR);
}
ASSEMBLER_TEST_RUN(Vrsqrtsqs, test) {
EXPECT(test != NULL);
- typedef float (*Vrsqrtsqs)() DART_UNUSED;
- float res = EXECUTE_TEST_CODE_FLOAT(Vrsqrtsqs, test->entry());
- EXPECT_FLOAT_EQ((3.0 - 10.0 * 5.0)/2.0, res, 0.0001f);
+ if (TargetCPUFeatures::vfp_supported()) {
+ typedef float (*Vrsqrtsqs)() DART_UNUSED;
+ float res = EXECUTE_TEST_CODE_FLOAT(Vrsqrtsqs, test->entry());
+ EXPECT_FLOAT_EQ((3.0 - 10.0 * 5.0)/2.0, res, 0.0001f);
+ } else {
+ typedef int (*Vrsqrtsqs)() DART_UNUSED;
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Vrsqrtsqs, test->entry()));
+ }
}
ASSEMBLER_TEST_GENERATE(ReciprocalSqrt, assembler) {
- if (TargetCPUFeatures::neon_supported()) {
+ if (TargetCPUFeatures::vfp_supported() &&
+ TargetCPUFeatures::neon_supported()) {
__ LoadSImmediate(S4, 147000.0);
__ vmovs(S5, S4);
__ vmovs(S6, S4);
@@ -3896,25 +3941,31 @@
__ vmulqs(Q2, Q0, Q0);
__ vrsqrtsqs(Q2, Q1, Q2);
__ vmulqs(Q0, Q0, Q2);
-
- __ bx(LR);
+ } else if (TargetCPUFeatures::vfp_supported()) {
+ __ LoadSImmediate(S0, 1.0/sqrt(147000.0));
} else {
- __ LoadSImmediate(S0, 1.0/sqrt(147000.0));
- __ bx(LR);
+ __ LoadImmediate(R0, 0);
}
+ __ bx(LR);
}
ASSEMBLER_TEST_RUN(ReciprocalSqrt, test) {
EXPECT(test != NULL);
- typedef float (*ReciprocalSqrt)() DART_UNUSED;
- float res = EXECUTE_TEST_CODE_FLOAT(ReciprocalSqrt, test->entry());
- EXPECT_FLOAT_EQ(1.0/sqrt(147000.0), res, 0.0001f);
+ if (TargetCPUFeatures::vfp_supported()) {
+ typedef float (*ReciprocalSqrt)() DART_UNUSED;
+ float res = EXECUTE_TEST_CODE_FLOAT(ReciprocalSqrt, test->entry());
+ EXPECT_FLOAT_EQ(1.0/sqrt(147000.0), res, 0.0001f);
+ } else {
+ typedef int (*ReciprocalSqrt)() DART_UNUSED;
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(ReciprocalSqrt, test->entry()));
+ }
}
ASSEMBLER_TEST_GENERATE(SIMDSqrt, assembler) {
- if (TargetCPUFeatures::neon_supported()) {
+ if (TargetCPUFeatures::vfp_supported() &&
+ TargetCPUFeatures::neon_supported()) {
__ LoadSImmediate(S4, 147000.0);
__ vmovs(S5, S4);
__ vmovs(S6, S4);
@@ -3941,25 +3992,31 @@
__ vmulqs(Q0, Q0, Q2);
__ vrecpsqs(Q2, Q1, Q0);
__ vmulqs(Q0, Q0, Q2);
-
- __ bx(LR);
+ } else if (TargetCPUFeatures::vfp_supported()) {
+ __ LoadSImmediate(S0, sqrt(147000.0));
} else {
- __ LoadSImmediate(S0, sqrt(147000.0));
- __ bx(LR);
+ __ LoadImmediate(R0, 0);
}
+ __ bx(LR);
}
ASSEMBLER_TEST_RUN(SIMDSqrt, test) {
EXPECT(test != NULL);
- typedef float (*SIMDSqrt)() DART_UNUSED;
- float res = EXECUTE_TEST_CODE_FLOAT(SIMDSqrt, test->entry());
- EXPECT_FLOAT_EQ(sqrt(147000.0), res, 0.0001f);
+ if (TargetCPUFeatures::vfp_supported()) {
+ typedef float (*SIMDSqrt)() DART_UNUSED;
+ float res = EXECUTE_TEST_CODE_FLOAT(SIMDSqrt, test->entry());
+ EXPECT_FLOAT_EQ(sqrt(147000.0), res, 0.0001f);
+ } else {
+ typedef int (*SIMDSqrt)() DART_UNUSED;
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SIMDSqrt, test->entry()));
+ }
}
ASSEMBLER_TEST_GENERATE(SIMDSqrt2, assembler) {
- if (TargetCPUFeatures::neon_supported()) {
+ if (TargetCPUFeatures::vfp_supported() &&
+ TargetCPUFeatures::neon_supported()) {
__ LoadSImmediate(S4, 1.0);
__ LoadSImmediate(S5, 4.0);
__ LoadSImmediate(S6, 9.0);
@@ -3990,25 +4047,31 @@
__ vadds(S0, S0, S1);
__ vadds(S0, S0, S2);
__ vadds(S0, S0, S3);
-
- __ bx(LR);
+ } else if (TargetCPUFeatures::vfp_supported()) {
+ __ LoadSImmediate(S0, 10.0);
} else {
- __ LoadSImmediate(S0, 10.0);
- __ bx(LR);
+ __ LoadImmediate(R0, 0);
}
+ __ bx(LR);
}
ASSEMBLER_TEST_RUN(SIMDSqrt2, test) {
EXPECT(test != NULL);
- typedef float (*SIMDSqrt2)() DART_UNUSED;
- float res = EXECUTE_TEST_CODE_FLOAT(SIMDSqrt2, test->entry());
- EXPECT_FLOAT_EQ(10.0, res, 0.0001f);
+ if (TargetCPUFeatures::vfp_supported()) {
+ typedef float (*SIMDSqrt2)() DART_UNUSED;
+ float res = EXECUTE_TEST_CODE_FLOAT(SIMDSqrt2, test->entry());
+ EXPECT_FLOAT_EQ(10.0, res, 0.0001f);
+ } else {
+ typedef int (*SIMDSqrt2)() DART_UNUSED;
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SIMDSqrt2, test->entry()));
+ }
}
ASSEMBLER_TEST_GENERATE(SIMDDiv, assembler) {
- if (TargetCPUFeatures::neon_supported()) {
+ if (TargetCPUFeatures::vfp_supported() &&
+ TargetCPUFeatures::neon_supported()) {
__ LoadSImmediate(S4, 1.0);
__ LoadSImmediate(S5, 4.0);
__ LoadSImmediate(S6, 9.0);
@@ -4031,25 +4094,31 @@
__ vadds(S0, S0, S1);
__ vadds(S0, S0, S2);
__ vadds(S0, S0, S3);
-
- __ bx(LR);
+ } else if (TargetCPUFeatures::vfp_supported()) {
+ __ LoadSImmediate(S0, 16.0);
} else {
- __ LoadSImmediate(S0, 16.0);
- __ bx(LR);
+ __ LoadImmediate(R0, 0);
}
+ __ bx(LR);
}
ASSEMBLER_TEST_RUN(SIMDDiv, test) {
EXPECT(test != NULL);
- typedef float (*SIMDDiv)() DART_UNUSED;
- float res = EXECUTE_TEST_CODE_FLOAT(SIMDDiv, test->entry());
- EXPECT_FLOAT_EQ(16.0, res, 0.0001f);
+ if (TargetCPUFeatures::vfp_supported()) {
+ typedef float (*SIMDDiv)() DART_UNUSED;
+ float res = EXECUTE_TEST_CODE_FLOAT(SIMDDiv, test->entry());
+ EXPECT_FLOAT_EQ(16.0, res, 0.0001f);
+ } else {
+ typedef int (*SIMDDiv)() DART_UNUSED;
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SIMDDiv, test->entry()));
+ }
}
ASSEMBLER_TEST_GENERATE(Vabsqs, assembler) {
- if (TargetCPUFeatures::neon_supported()) {
+ if (TargetCPUFeatures::vfp_supported() &&
+ TargetCPUFeatures::neon_supported()) {
__ LoadSImmediate(S4, 1.0);
__ LoadSImmediate(S5, -1.0);
__ LoadSImmediate(S6, 1.0);
@@ -4060,25 +4129,31 @@
__ vadds(S0, S0, S1);
__ vadds(S0, S0, S2);
__ vadds(S0, S0, S3);
-
- __ bx(LR);
+ } else if (TargetCPUFeatures::vfp_supported()) {
+ __ LoadSImmediate(S0, 4.0);
} else {
- __ LoadSImmediate(S0, 4.0);
- __ bx(LR);
+ __ LoadImmediate(R0, 0);
}
+ __ bx(LR);
}
ASSEMBLER_TEST_RUN(Vabsqs, test) {
EXPECT(test != NULL);
- typedef float (*Vabsqs)() DART_UNUSED;
- float res = EXECUTE_TEST_CODE_FLOAT(Vabsqs, test->entry());
- EXPECT_FLOAT_EQ(4.0, res, 0.0001f);
+ if (TargetCPUFeatures::vfp_supported()) {
+ typedef float (*Vabsqs)() DART_UNUSED;
+ float res = EXECUTE_TEST_CODE_FLOAT(Vabsqs, test->entry());
+ EXPECT_FLOAT_EQ(4.0, res, 0.0001f);
+ } else {
+ typedef int (*SIMDDiv)() DART_UNUSED;
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SIMDDiv, test->entry()));
+ }
}
ASSEMBLER_TEST_GENERATE(Vnegqs, assembler) {
- if (TargetCPUFeatures::neon_supported()) {
+ if (TargetCPUFeatures::vfp_supported() &&
+ TargetCPUFeatures::neon_supported()) {
__ LoadSImmediate(S4, 1.0);
__ LoadSImmediate(S5, -2.0);
__ LoadSImmediate(S6, 1.0);
@@ -4089,117 +4164,28 @@
__ vadds(S0, S0, S1);
__ vadds(S0, S0, S2);
__ vadds(S0, S0, S3);
-
- __ bx(LR);
+ } else if (TargetCPUFeatures::vfp_supported()) {
+ __ LoadSImmediate(S0, 2.0);
} else {
- __ LoadSImmediate(S0, 2.0);
- __ bx(LR);
+ __ LoadImmediate(R0, 0);
}
+ __ bx(LR);
}
ASSEMBLER_TEST_RUN(Vnegqs, test) {
EXPECT(test != NULL);
- typedef float (*Vnegqs)() DART_UNUSED;
- float res = EXECUTE_TEST_CODE_FLOAT(Vnegqs, test->entry());
- EXPECT_FLOAT_EQ(2.0, res, 0.0001f);
+ if (TargetCPUFeatures::vfp_supported()) {
+ typedef float (*Vnegqs)() DART_UNUSED;
+ float res = EXECUTE_TEST_CODE_FLOAT(Vnegqs, test->entry());
+ EXPECT_FLOAT_EQ(2.0, res, 0.0001f);
+ } else {
+ typedef int (*Vnegqs)() DART_UNUSED;
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Vnegqs, test->entry()));
+ }
}
-ASSEMBLER_TEST_GENERATE(MultCheckOverflow, assembler) {
- // Both positive, no overflow
- Label overflow1, test1;
- __ LoadImmediate(R0, 42);
- __ LoadImmediate(R1, 0xff);
- __ LoadImmediate(R2, 0xf0);
- __ CheckMultSignedOverflow(R1, R2, R3, D0, D1, &overflow1);
- __ b(&test1);
- __ Bind(&overflow1);
- __ LoadImmediate(R0, 1);
- __ Ret();
-
-
- // Left negative no overflow.
- __ Bind(&test1);
- Label overflow2, test2;
- __ LoadImmediate(R1, -0xff);
- __ LoadImmediate(R2, 0xf0);
- __ CheckMultSignedOverflow(R1, R2, R3, D0, D1, &overflow2);
- __ b(&test2);
- __ Bind(&overflow2);
- __ LoadImmediate(R0, 2);
- __ Ret();
-
- // Right negative no overflow
- Label overflow3, test3;
- __ Bind(&test2);
- __ LoadImmediate(R1, 0xff);
- __ LoadImmediate(R2, -0xf0);
- __ CheckMultSignedOverflow(R1, R2, R3, D0, D1, &overflow3);
- __ b(&test3);
- __ Bind(&overflow3);
- __ LoadImmediate(R0, 3);
- __ Ret();
-
- // Both negative no overflow.
- Label overflow4, test4;
- __ Bind(&test3);
- __ LoadImmediate(R1, -0xff);
- __ LoadImmediate(R2, -0xf0);
- __ CheckMultSignedOverflow(R1, R2, R3, D0, D1, &overflow4);
- __ b(&test4);
- __ Bind(&overflow4);
- __ LoadImmediate(R0, 4);
- __ Ret();
-
- // Both positive with overflow.
- Label test5;
- __ Bind(&test4);
- __ LoadImmediate(R1, 0x0fffffff);
- __ LoadImmediate(R2, 0xffff);
- __ CheckMultSignedOverflow(R1, R2, R3, D0, D1, &test5);
- __ LoadImmediate(R0, 5);
- __ Ret();
-
- // left negative with overflow.
- Label test6;
- __ Bind(&test5);
- __ LoadImmediate(R1, -0x0fffffff);
- __ LoadImmediate(R2, 0xffff);
- __ CheckMultSignedOverflow(R1, R2, R3, D0, D1, &test6);
- __ LoadImmediate(R0, 6);
- __ Ret();
-
- // right negative with overflow.
- Label test7;
- __ Bind(&test6);
- __ LoadImmediate(R1, 0x0fffffff);
- __ LoadImmediate(R2, -0xffff);
- __ CheckMultSignedOverflow(R1, R2, R3, D0, D1, &test7);
- __ LoadImmediate(R0, 7);
- __ Ret();
-
- // both negative with overflow.
- Label test8;
- __ Bind(&test7);
- __ LoadImmediate(R1, -0x0fffffff);
- __ LoadImmediate(R2, -0xffff);
- __ CheckMultSignedOverflow(R1, R2, R3, D0, D1, &test8);
- __ LoadImmediate(R0, 8);
- __ Ret();
-
- __ Bind(&test8);
- __ Ret();
-}
-
-
-ASSEMBLER_TEST_RUN(MultCheckOverflow, test) {
- EXPECT(test != NULL);
- typedef int (*Tst)() DART_UNUSED;
- EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
-}
-
-
// Called from assembler_test.cc.
// LR: return address.
// R0: context.
@@ -4267,7 +4253,6 @@
#undef RANGE_OF
}
-
} // namespace dart
#endif // defined TARGET_ARCH_ARM

Powered by Google App Engine
This is Rietveld 408576698