diff options
author | Ben Noordhuis <info@bnoordhuis.nl> | 2013-04-17 16:10:37 +0200 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2013-04-17 16:10:37 +0200 |
commit | 9f682265d6631a29457abeb53827d01fa77493c8 (patch) | |
tree | 92a1eec49b1f280931598a72dcf0cca3d795f210 /deps/v8/test/cctest/test-assembler-arm.cc | |
parent | 951e0b69fa3c8b1a5d708e29de9d6f7d1db79827 (diff) | |
download | node-new-9f682265d6631a29457abeb53827d01fa77493c8.tar.gz |
deps: upgrade v8 to 3.18.0
Diffstat (limited to 'deps/v8/test/cctest/test-assembler-arm.cc')
-rw-r--r-- | deps/v8/test/cctest/test-assembler-arm.cc | 510 |
1 files changed, 284 insertions, 226 deletions
diff --git a/deps/v8/test/cctest/test-assembler-arm.cc b/deps/v8/test/cctest/test-assembler-arm.cc index 5cb4ab3238..58ce5ec8fa 100644 --- a/deps/v8/test/cctest/test-assembler-arm.cc +++ b/deps/v8/test/cctest/test-assembler-arm.cc @@ -43,20 +43,10 @@ typedef Object* (*F3)(void* p0, int p1, int p2, int p3, int p4); typedef Object* (*F4)(void* p0, void* p1, int p2, int p3, int p4); -static v8::Persistent<v8::Context> env; - - -static void InitializeVM() { - if (env.IsEmpty()) { - env = v8::Context::New(); - } -} - - #define __ assm. TEST(0) { - InitializeVM(); + CcTest::InitializeVM(); Isolate* isolate = Isolate::Current(); HandleScope scope(isolate); @@ -83,7 +73,7 @@ TEST(0) { TEST(1) { - InitializeVM(); + CcTest::InitializeVM(); Isolate* isolate = Isolate::Current(); HandleScope scope(isolate); @@ -121,7 +111,7 @@ TEST(1) { TEST(2) { - InitializeVM(); + CcTest::InitializeVM(); Isolate* isolate = Isolate::Current(); HandleScope scope(isolate); @@ -168,7 +158,7 @@ TEST(2) { TEST(3) { - InitializeVM(); + CcTest::InitializeVM(); Isolate* isolate = Isolate::Current(); HandleScope scope(isolate); @@ -224,7 +214,7 @@ TEST(3) { TEST(4) { // Test the VFP floating point instructions. - InitializeVM(); + CcTest::InitializeVM(); Isolate* isolate = Isolate::Current(); HandleScope scope(isolate); @@ -363,7 +353,7 @@ TEST(4) { TEST(5) { // Test the ARMv7 bitfield instructions. - InitializeVM(); + CcTest::InitializeVM(); Isolate* isolate = Isolate::Current(); HandleScope scope(isolate); @@ -400,7 +390,7 @@ TEST(5) { TEST(6) { // Test saturating instructions. - InitializeVM(); + CcTest::InitializeVM(); Isolate* isolate = Isolate::Current(); HandleScope scope(isolate); @@ -444,7 +434,7 @@ static void TestRoundingMode(VCVTTypes types, double value, int expected, bool expected_exception = false) { - InitializeVM(); + CcTest::InitializeVM(); Isolate* isolate = Isolate::Current(); HandleScope scope(isolate); @@ -622,7 +612,7 @@ TEST(7) { TEST(8) { // Test VFP multi load/store with ia_w. - InitializeVM(); + CcTest::InitializeVM(); Isolate* isolate = Isolate::Current(); HandleScope scope(isolate); @@ -654,87 +644,83 @@ TEST(8) { // single precision values around in memory. Assembler assm(isolate, NULL, 0); - if (CpuFeatures::IsSupported(VFP2)) { - CpuFeatureScope scope(&assm, VFP2); - - __ mov(ip, Operand(sp)); - __ stm(db_w, sp, r4.bit() | fp.bit() | lr.bit()); - __ sub(fp, ip, Operand(4)); + __ mov(ip, Operand(sp)); + __ stm(db_w, sp, r4.bit() | fp.bit() | lr.bit()); + __ sub(fp, ip, Operand(4)); - __ add(r4, r0, Operand(OFFSET_OF(D, a))); - __ vldm(ia_w, r4, d0, d3); - __ vldm(ia_w, r4, d4, d7); + __ add(r4, r0, Operand(OFFSET_OF(D, a))); + __ vldm(ia_w, r4, d0, d3); + __ vldm(ia_w, r4, d4, d7); - __ add(r4, r0, Operand(OFFSET_OF(D, a))); - __ vstm(ia_w, r4, d6, d7); - __ vstm(ia_w, r4, d0, d5); + __ add(r4, r0, Operand(OFFSET_OF(D, a))); + __ vstm(ia_w, r4, d6, d7); + __ vstm(ia_w, r4, d0, d5); - __ add(r4, r1, Operand(OFFSET_OF(F, a))); - __ vldm(ia_w, r4, s0, s3); - __ vldm(ia_w, r4, s4, s7); + __ add(r4, r1, Operand(OFFSET_OF(F, a))); + __ vldm(ia_w, r4, s0, s3); + __ vldm(ia_w, r4, s4, s7); - __ add(r4, r1, Operand(OFFSET_OF(F, a))); - __ vstm(ia_w, r4, s6, s7); - __ vstm(ia_w, r4, s0, s5); + __ add(r4, r1, Operand(OFFSET_OF(F, a))); + __ vstm(ia_w, r4, s6, s7); + __ vstm(ia_w, r4, s0, s5); - __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); + __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); - CodeDesc desc; - assm.GetCode(&desc); - Object* code = isolate->heap()->CreateCode( - desc, - Code::ComputeFlags(Code::STUB), - Handle<Code>())->ToObjectChecked(); - CHECK(code->IsCode()); + CodeDesc desc; + assm.GetCode(&desc); + Object* code = isolate->heap()->CreateCode( + desc, + Code::ComputeFlags(Code::STUB), + Handle<Code>())->ToObjectChecked(); + CHECK(code->IsCode()); #ifdef DEBUG - Code::cast(code)->Print(); + Code::cast(code)->Print(); #endif - F4 fn = FUNCTION_CAST<F4>(Code::cast(code)->entry()); - d.a = 1.1; - d.b = 2.2; - d.c = 3.3; - d.d = 4.4; - d.e = 5.5; - d.f = 6.6; - d.g = 7.7; - d.h = 8.8; - - f.a = 1.0; - f.b = 2.0; - f.c = 3.0; - f.d = 4.0; - f.e = 5.0; - f.f = 6.0; - f.g = 7.0; - f.h = 8.0; - - Object* dummy = CALL_GENERATED_CODE(fn, &d, &f, 0, 0, 0); - USE(dummy); + F4 fn = FUNCTION_CAST<F4>(Code::cast(code)->entry()); + d.a = 1.1; + d.b = 2.2; + d.c = 3.3; + d.d = 4.4; + d.e = 5.5; + d.f = 6.6; + d.g = 7.7; + d.h = 8.8; + + f.a = 1.0; + f.b = 2.0; + f.c = 3.0; + f.d = 4.0; + f.e = 5.0; + f.f = 6.0; + f.g = 7.0; + f.h = 8.0; + + Object* dummy = CALL_GENERATED_CODE(fn, &d, &f, 0, 0, 0); + USE(dummy); - CHECK_EQ(7.7, d.a); - CHECK_EQ(8.8, d.b); - CHECK_EQ(1.1, d.c); - CHECK_EQ(2.2, d.d); - CHECK_EQ(3.3, d.e); - CHECK_EQ(4.4, d.f); - CHECK_EQ(5.5, d.g); - CHECK_EQ(6.6, d.h); - - CHECK_EQ(7.0, f.a); - CHECK_EQ(8.0, f.b); - CHECK_EQ(1.0, f.c); - CHECK_EQ(2.0, f.d); - CHECK_EQ(3.0, f.e); - CHECK_EQ(4.0, f.f); - CHECK_EQ(5.0, f.g); - CHECK_EQ(6.0, f.h); - } + CHECK_EQ(7.7, d.a); + CHECK_EQ(8.8, d.b); + CHECK_EQ(1.1, d.c); + CHECK_EQ(2.2, d.d); + CHECK_EQ(3.3, d.e); + CHECK_EQ(4.4, d.f); + CHECK_EQ(5.5, d.g); + CHECK_EQ(6.6, d.h); + + CHECK_EQ(7.0, f.a); + CHECK_EQ(8.0, f.b); + CHECK_EQ(1.0, f.c); + CHECK_EQ(2.0, f.d); + CHECK_EQ(3.0, f.e); + CHECK_EQ(4.0, f.f); + CHECK_EQ(5.0, f.g); + CHECK_EQ(6.0, f.h); } TEST(9) { // Test VFP multi load/store with ia. - InitializeVM(); + CcTest::InitializeVM(); Isolate* isolate = Isolate::Current(); HandleScope scope(isolate); @@ -766,91 +752,87 @@ TEST(9) { // single precision values around in memory. Assembler assm(isolate, NULL, 0); - if (CpuFeatures::IsSupported(VFP2)) { - CpuFeatureScope scope(&assm, VFP2); - - __ mov(ip, Operand(sp)); - __ stm(db_w, sp, r4.bit() | fp.bit() | lr.bit()); - __ sub(fp, ip, Operand(4)); + __ mov(ip, Operand(sp)); + __ stm(db_w, sp, r4.bit() | fp.bit() | lr.bit()); + __ sub(fp, ip, Operand(4)); - __ add(r4, r0, Operand(OFFSET_OF(D, a))); - __ vldm(ia, r4, d0, d3); - __ add(r4, r4, Operand(4 * 8)); - __ vldm(ia, r4, d4, d7); + __ add(r4, r0, Operand(OFFSET_OF(D, a))); + __ vldm(ia, r4, d0, d3); + __ add(r4, r4, Operand(4 * 8)); + __ vldm(ia, r4, d4, d7); - __ add(r4, r0, Operand(OFFSET_OF(D, a))); - __ vstm(ia, r4, d6, d7); - __ add(r4, r4, Operand(2 * 8)); - __ vstm(ia, r4, d0, d5); + __ add(r4, r0, Operand(OFFSET_OF(D, a))); + __ vstm(ia, r4, d6, d7); + __ add(r4, r4, Operand(2 * 8)); + __ vstm(ia, r4, d0, d5); - __ add(r4, r1, Operand(OFFSET_OF(F, a))); - __ vldm(ia, r4, s0, s3); - __ add(r4, r4, Operand(4 * 4)); - __ vldm(ia, r4, s4, s7); + __ add(r4, r1, Operand(OFFSET_OF(F, a))); + __ vldm(ia, r4, s0, s3); + __ add(r4, r4, Operand(4 * 4)); + __ vldm(ia, r4, s4, s7); - __ add(r4, r1, Operand(OFFSET_OF(F, a))); - __ vstm(ia, r4, s6, s7); - __ add(r4, r4, Operand(2 * 4)); - __ vstm(ia, r4, s0, s5); + __ add(r4, r1, Operand(OFFSET_OF(F, a))); + __ vstm(ia, r4, s6, s7); + __ add(r4, r4, Operand(2 * 4)); + __ vstm(ia, r4, s0, s5); - __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); + __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); - CodeDesc desc; - assm.GetCode(&desc); - Object* code = isolate->heap()->CreateCode( - desc, - Code::ComputeFlags(Code::STUB), - Handle<Code>())->ToObjectChecked(); - CHECK(code->IsCode()); + CodeDesc desc; + assm.GetCode(&desc); + Object* code = isolate->heap()->CreateCode( + desc, + Code::ComputeFlags(Code::STUB), + Handle<Code>())->ToObjectChecked(); + CHECK(code->IsCode()); #ifdef DEBUG - Code::cast(code)->Print(); + Code::cast(code)->Print(); #endif - F4 fn = FUNCTION_CAST<F4>(Code::cast(code)->entry()); - d.a = 1.1; - d.b = 2.2; - d.c = 3.3; - d.d = 4.4; - d.e = 5.5; - d.f = 6.6; - d.g = 7.7; - d.h = 8.8; - - f.a = 1.0; - f.b = 2.0; - f.c = 3.0; - f.d = 4.0; - f.e = 5.0; - f.f = 6.0; - f.g = 7.0; - f.h = 8.0; - - Object* dummy = CALL_GENERATED_CODE(fn, &d, &f, 0, 0, 0); - USE(dummy); + F4 fn = FUNCTION_CAST<F4>(Code::cast(code)->entry()); + d.a = 1.1; + d.b = 2.2; + d.c = 3.3; + d.d = 4.4; + d.e = 5.5; + d.f = 6.6; + d.g = 7.7; + d.h = 8.8; + + f.a = 1.0; + f.b = 2.0; + f.c = 3.0; + f.d = 4.0; + f.e = 5.0; + f.f = 6.0; + f.g = 7.0; + f.h = 8.0; + + Object* dummy = CALL_GENERATED_CODE(fn, &d, &f, 0, 0, 0); + USE(dummy); - CHECK_EQ(7.7, d.a); - CHECK_EQ(8.8, d.b); - CHECK_EQ(1.1, d.c); - CHECK_EQ(2.2, d.d); - CHECK_EQ(3.3, d.e); - CHECK_EQ(4.4, d.f); - CHECK_EQ(5.5, d.g); - CHECK_EQ(6.6, d.h); - - CHECK_EQ(7.0, f.a); - CHECK_EQ(8.0, f.b); - CHECK_EQ(1.0, f.c); - CHECK_EQ(2.0, f.d); - CHECK_EQ(3.0, f.e); - CHECK_EQ(4.0, f.f); - CHECK_EQ(5.0, f.g); - CHECK_EQ(6.0, f.h); - } + CHECK_EQ(7.7, d.a); + CHECK_EQ(8.8, d.b); + CHECK_EQ(1.1, d.c); + CHECK_EQ(2.2, d.d); + CHECK_EQ(3.3, d.e); + CHECK_EQ(4.4, d.f); + CHECK_EQ(5.5, d.g); + CHECK_EQ(6.6, d.h); + + CHECK_EQ(7.0, f.a); + CHECK_EQ(8.0, f.b); + CHECK_EQ(1.0, f.c); + CHECK_EQ(2.0, f.d); + CHECK_EQ(3.0, f.e); + CHECK_EQ(4.0, f.f); + CHECK_EQ(5.0, f.g); + CHECK_EQ(6.0, f.h); } TEST(10) { // Test VFP multi load/store with db_w. - InitializeVM(); + CcTest::InitializeVM(); Isolate* isolate = Isolate::Current(); HandleScope scope(isolate); @@ -882,87 +864,83 @@ TEST(10) { // single precision values around in memory. Assembler assm(isolate, NULL, 0); - if (CpuFeatures::IsSupported(VFP2)) { - CpuFeatureScope scope(&assm, VFP2); - - __ mov(ip, Operand(sp)); - __ stm(db_w, sp, r4.bit() | fp.bit() | lr.bit()); - __ sub(fp, ip, Operand(4)); + __ mov(ip, Operand(sp)); + __ stm(db_w, sp, r4.bit() | fp.bit() | lr.bit()); + __ sub(fp, ip, Operand(4)); - __ add(r4, r0, Operand(OFFSET_OF(D, h) + 8)); - __ vldm(db_w, r4, d4, d7); - __ vldm(db_w, r4, d0, d3); + __ add(r4, r0, Operand(OFFSET_OF(D, h) + 8)); + __ vldm(db_w, r4, d4, d7); + __ vldm(db_w, r4, d0, d3); - __ add(r4, r0, Operand(OFFSET_OF(D, h) + 8)); - __ vstm(db_w, r4, d0, d5); - __ vstm(db_w, r4, d6, d7); + __ add(r4, r0, Operand(OFFSET_OF(D, h) + 8)); + __ vstm(db_w, r4, d0, d5); + __ vstm(db_w, r4, d6, d7); - __ add(r4, r1, Operand(OFFSET_OF(F, h) + 4)); - __ vldm(db_w, r4, s4, s7); - __ vldm(db_w, r4, s0, s3); + __ add(r4, r1, Operand(OFFSET_OF(F, h) + 4)); + __ vldm(db_w, r4, s4, s7); + __ vldm(db_w, r4, s0, s3); - __ add(r4, r1, Operand(OFFSET_OF(F, h) + 4)); - __ vstm(db_w, r4, s0, s5); - __ vstm(db_w, r4, s6, s7); + __ add(r4, r1, Operand(OFFSET_OF(F, h) + 4)); + __ vstm(db_w, r4, s0, s5); + __ vstm(db_w, r4, s6, s7); - __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); + __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); - CodeDesc desc; - assm.GetCode(&desc); - Object* code = isolate->heap()->CreateCode( - desc, - Code::ComputeFlags(Code::STUB), - Handle<Code>())->ToObjectChecked(); - CHECK(code->IsCode()); + CodeDesc desc; + assm.GetCode(&desc); + Object* code = isolate->heap()->CreateCode( + desc, + Code::ComputeFlags(Code::STUB), + Handle<Code>())->ToObjectChecked(); + CHECK(code->IsCode()); #ifdef DEBUG - Code::cast(code)->Print(); + Code::cast(code)->Print(); #endif - F4 fn = FUNCTION_CAST<F4>(Code::cast(code)->entry()); - d.a = 1.1; - d.b = 2.2; - d.c = 3.3; - d.d = 4.4; - d.e = 5.5; - d.f = 6.6; - d.g = 7.7; - d.h = 8.8; - - f.a = 1.0; - f.b = 2.0; - f.c = 3.0; - f.d = 4.0; - f.e = 5.0; - f.f = 6.0; - f.g = 7.0; - f.h = 8.0; - - Object* dummy = CALL_GENERATED_CODE(fn, &d, &f, 0, 0, 0); - USE(dummy); + F4 fn = FUNCTION_CAST<F4>(Code::cast(code)->entry()); + d.a = 1.1; + d.b = 2.2; + d.c = 3.3; + d.d = 4.4; + d.e = 5.5; + d.f = 6.6; + d.g = 7.7; + d.h = 8.8; + + f.a = 1.0; + f.b = 2.0; + f.c = 3.0; + f.d = 4.0; + f.e = 5.0; + f.f = 6.0; + f.g = 7.0; + f.h = 8.0; + + Object* dummy = CALL_GENERATED_CODE(fn, &d, &f, 0, 0, 0); + USE(dummy); - CHECK_EQ(7.7, d.a); - CHECK_EQ(8.8, d.b); - CHECK_EQ(1.1, d.c); - CHECK_EQ(2.2, d.d); - CHECK_EQ(3.3, d.e); - CHECK_EQ(4.4, d.f); - CHECK_EQ(5.5, d.g); - CHECK_EQ(6.6, d.h); - - CHECK_EQ(7.0, f.a); - CHECK_EQ(8.0, f.b); - CHECK_EQ(1.0, f.c); - CHECK_EQ(2.0, f.d); - CHECK_EQ(3.0, f.e); - CHECK_EQ(4.0, f.f); - CHECK_EQ(5.0, f.g); - CHECK_EQ(6.0, f.h); - } + CHECK_EQ(7.7, d.a); + CHECK_EQ(8.8, d.b); + CHECK_EQ(1.1, d.c); + CHECK_EQ(2.2, d.d); + CHECK_EQ(3.3, d.e); + CHECK_EQ(4.4, d.f); + CHECK_EQ(5.5, d.g); + CHECK_EQ(6.6, d.h); + + CHECK_EQ(7.0, f.a); + CHECK_EQ(8.0, f.b); + CHECK_EQ(1.0, f.c); + CHECK_EQ(2.0, f.d); + CHECK_EQ(3.0, f.e); + CHECK_EQ(4.0, f.f); + CHECK_EQ(5.0, f.g); + CHECK_EQ(6.0, f.h); } TEST(11) { // Test instructions using the carry flag. - InitializeVM(); + CcTest::InitializeVM(); Isolate* isolate = Isolate::Current(); HandleScope scope(isolate); @@ -1028,7 +1006,7 @@ TEST(11) { TEST(12) { // Test chaining of label usages within instructions (issue 1644). - InitializeVM(); + CcTest::InitializeVM(); Isolate* isolate = Isolate::Current(); HandleScope scope(isolate); @@ -1043,7 +1021,7 @@ TEST(12) { TEST(13) { // Test VFP instructions using registers d16-d31. - InitializeVM(); + CcTest::InitializeVM(); Isolate* isolate = Isolate::Current(); HandleScope scope(isolate); @@ -1159,4 +1137,84 @@ TEST(13) { } } + +TEST(14) { + // Test the VFP Canonicalized Nan mode. + CcTest::InitializeVM(); + Isolate* isolate = Isolate::Current(); + HandleScope scope(isolate); + + typedef struct { + double left; + double right; + double add_result; + double sub_result; + double mul_result; + double div_result; + } T; + T t; + + // Create a function that makes the four basic operations. + Assembler assm(isolate, NULL, 0); + + // Ensure FPSCR state (as JSEntryStub does). + Label fpscr_done; + __ vmrs(r1); + __ tst(r1, Operand(kVFPDefaultNaNModeControlBit)); + __ b(ne, &fpscr_done); + __ orr(r1, r1, Operand(kVFPDefaultNaNModeControlBit)); + __ vmsr(r1); + __ bind(&fpscr_done); + + __ vldr(d0, r0, OFFSET_OF(T, left)); + __ vldr(d1, r0, OFFSET_OF(T, right)); + __ vadd(d2, d0, d1); + __ vstr(d2, r0, OFFSET_OF(T, add_result)); + __ vsub(d2, d0, d1); + __ vstr(d2, r0, OFFSET_OF(T, sub_result)); + __ vmul(d2, d0, d1); + __ vstr(d2, r0, OFFSET_OF(T, mul_result)); + __ vdiv(d2, d0, d1); + __ vstr(d2, r0, OFFSET_OF(T, div_result)); + + __ mov(pc, Operand(lr)); + + CodeDesc desc; + assm.GetCode(&desc); + Object* code = isolate->heap()->CreateCode( + desc, + Code::ComputeFlags(Code::STUB), + Handle<Code>())->ToObjectChecked(); + CHECK(code->IsCode()); +#ifdef DEBUG + Code::cast(code)->Print(); +#endif + F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry()); + t.left = BitCast<double>(kHoleNanInt64); + t.right = 1; + t.add_result = 0; + t.sub_result = 0; + t.mul_result = 0; + t.div_result = 0; + Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0); + USE(dummy); + const uint32_t kArmNanUpper32 = 0x7ff80000; + const uint32_t kArmNanLower32 = 0x00000000; +#ifdef DEBUG + const uint64_t kArmNanInt64 = + (static_cast<uint64_t>(kArmNanUpper32) << 32) | kArmNanLower32; + ASSERT(kArmNanInt64 != kHoleNanInt64); +#endif + // With VFP2 the sign of the canonicalized Nan is undefined. So + // we remove the sign bit for the upper tests. + CHECK_EQ(kArmNanUpper32, (BitCast<int64_t>(t.add_result) >> 32) & 0x7fffffff); + CHECK_EQ(kArmNanLower32, BitCast<int64_t>(t.add_result) & 0xffffffffu); + CHECK_EQ(kArmNanUpper32, (BitCast<int64_t>(t.sub_result) >> 32) & 0x7fffffff); + CHECK_EQ(kArmNanLower32, BitCast<int64_t>(t.sub_result) & 0xffffffffu); + CHECK_EQ(kArmNanUpper32, (BitCast<int64_t>(t.mul_result) >> 32) & 0x7fffffff); + CHECK_EQ(kArmNanLower32, BitCast<int64_t>(t.mul_result) & 0xffffffffu); + CHECK_EQ(kArmNanUpper32, (BitCast<int64_t>(t.div_result) >> 32) & 0x7fffffff); + CHECK_EQ(kArmNanLower32, BitCast<int64_t>(t.div_result) & 0xffffffffu); +} + #undef __ |