Chromium Code Reviews| 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 |