Chromium Code Reviews| Index: test/cctest/test-assembler-mips.cc |
| diff --git a/test/cctest/test-assembler-mips.cc b/test/cctest/test-assembler-mips.cc |
| index b9f23918ec8b8203528cbe20be8473785d2b5fe8..7714d79a292e3a6da7db26ace9d9ab5803738c1c 100644 |
| --- a/test/cctest/test-assembler-mips.cc |
| +++ b/test/cctest/test-assembler-mips.cc |
| @@ -1204,6 +1204,7 @@ TEST(MIPS14) { |
| HandleScope scope(isolate); |
| #define ROUND_STRUCT_ELEMENT(x) \ |
| + uint32_t x##_isNaN2008; \ |
| int32_t x##_up_out; \ |
| int32_t x##_down_out; \ |
| int32_t neg_##x##_up_out; \ |
| @@ -1241,6 +1242,8 @@ TEST(MIPS14) { |
| // Disable FPU exceptions. |
| __ ctc1(zero_reg, FCSR); |
| #define RUN_ROUND_TEST(x) \ |
| + __ cfc1(t0, FCSR);\ |
| + __ sw(t0, MemOperand(a0, offsetof(T, x##_isNaN2008))); \ |
| __ ldc1(f0, MemOperand(a0, offsetof(T, round_up_in))); \ |
| __ x##_w_d(f0, f0); \ |
| __ swc1(f0, MemOperand(a0, offsetof(T, x##_up_out))); \ |
| @@ -1313,12 +1316,18 @@ TEST(MIPS14) { |
| USE(dummy); |
| #define GET_FPU_ERR(x) (static_cast<int>(x & kFCSRFlagMask)) |
| +#define CHECK_NAN2008(x) (x & kFCSRNaN2008FlagMask) |
| #define CHECK_ROUND_RESULT(type) \ |
| CHECK(GET_FPU_ERR(t.type##_err1_out) & kFCSRInexactFlagMask); \ |
| CHECK_EQ(0, GET_FPU_ERR(t.type##_err2_out)); \ |
| CHECK(GET_FPU_ERR(t.type##_err3_out) & kFCSRInvalidOpFlagMask); \ |
| CHECK(GET_FPU_ERR(t.type##_err4_out) & kFCSRInvalidOpFlagMask); \ |
| - CHECK_EQ(kFPUInvalidResult, static_cast<uint>(t.type##_invalid_result)); |
| + if (CHECK_NAN2008(t.type##_isNaN2008) && kArchVariant == kMips32r6) {\ |
| + CHECK_EQ(static_cast<int32_t>(0), t.type##_invalid_result);\ |
| + } else {\ |
| + CHECK_EQ(static_cast<int32_t>(kFPUInvalidResult), t.type##_invalid_result);\ |
| + } |
| + |
| CHECK_ROUND_RESULT(round); |
| CHECK_ROUND_RESULT(floor); |
| @@ -1967,6 +1976,7 @@ TEST(trunc_l) { |
| v8::internal::CodeObjectRequired::kYes); |
| const double dFPU64InvalidResult = static_cast<double>(kFPU64InvalidResult); |
| typedef struct test_float { |
| + uint32_t isNaN2008; |
| double a; |
| float b; |
| int64_t c; // a trunc result |
| @@ -1992,7 +2002,15 @@ TEST(trunc_l) { |
| -2.0, -2.0, -2.0, -3.0, -3.0, -3.0, |
| 2147483648.0, dFPU64InvalidResult, |
| dFPU64InvalidResult}; |
| + double outputsNaN2008[kTableLength] = { |
| + 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, |
| + -2.0, -2.0, -2.0, -3.0, -3.0, -3.0, |
| + 2147483648.0, |
| + 0, |
| + dFPU64InvalidResult}; |
| + __ cfc1(t1, FCSR); |
| + __ sw(t1, MemOperand(a0, offsetof(Test, isNaN2008))); |
| __ ldc1(f4, MemOperand(a0, offsetof(Test, a)) ); |
| __ lwc1(f6, MemOperand(a0, offsetof(Test, b)) ); |
| __ trunc_l_d(f8, f4); |
| @@ -2011,7 +2029,12 @@ TEST(trunc_l) { |
| test.a = inputs_D[i]; |
| test.b = inputs_S[i]; |
| (CALL_GENERATED_CODE(isolate, f, &test, 0, 0, 0, 0)); |
| - CHECK_EQ(test.c, outputs[i]); |
| + if ((test.isNaN2008 & kFCSRNaN2008FlagMask) && |
| + kArchVariant == kMips32r6) { |
| + CHECK_EQ(test.c, outputsNaN2008[i]); |
| + } else { |
| + CHECK_EQ(test.c, outputs[i]); |
| + } |
| CHECK_EQ(test.d, test.c); |
| } |
| } |
| @@ -2273,6 +2296,7 @@ TEST(cvt_w_d) { |
| for (int j = 0; j < 4; j++) { |
| test.fcsr = fcsr_inputs[j]; |
| for (int i = 0; i < kTableLength; i++) { |
| + printf("Type = %d, i = %d\n", j, i); |
|
Ilija.Pavlovic1
2015/12/02 09:12:16
Should be deleted/removed?
|
| test.a = inputs[i]; |
| (CALL_GENERATED_CODE(isolate, f, &test, 0, 0, 0, 0)); |
| CHECK_EQ(test.b, outputs[j][i]); |
| @@ -2288,6 +2312,7 @@ TEST(trunc_w) { |
| MacroAssembler assm(isolate, NULL, 0, v8::internal::CodeObjectRequired::kYes); |
| typedef struct test_float { |
| + uint32_t isNaN2008; |
| double a; |
| float b; |
| int32_t c; // a trunc result |
| @@ -2313,7 +2338,15 @@ TEST(trunc_w) { |
| -2.0, -2.0, -2.0, -3.0, -3.0, -3.0, |
| kFPUInvalidResult, kFPUInvalidResult, |
| kFPUInvalidResult}; |
| + double outputsNaN2008[kTableLength] = { |
| + 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, |
| + -2.0, -2.0, -2.0, -3.0, -3.0, -3.0, |
| + kFPUInvalidResult, |
| + 0, |
| + kFPUInvalidResult}; |
| + __ cfc1(t1, FCSR); |
| + __ sw(t1, MemOperand(a0, offsetof(Test, isNaN2008))); |
| __ ldc1(f4, MemOperand(a0, offsetof(Test, a)) ); |
| __ lwc1(f6, MemOperand(a0, offsetof(Test, b)) ); |
| __ trunc_w_d(f8, f4); |
| @@ -2332,7 +2365,11 @@ TEST(trunc_w) { |
| test.a = inputs_D[i]; |
| test.b = inputs_S[i]; |
| (CALL_GENERATED_CODE(isolate, f, &test, 0, 0, 0, 0)); |
| - CHECK_EQ(test.c, outputs[i]); |
| + if ((test.isNaN2008 & kFCSRNaN2008FlagMask) && kArchVariant == kMips32r6) { |
| + CHECK_EQ(test.c, outputsNaN2008[i]); |
| + } else { |
| + CHECK_EQ(test.c, outputs[i]); |
| + } |
| CHECK_EQ(test.d, test.c); |
| } |
| } |
| @@ -2345,6 +2382,7 @@ TEST(round_w) { |
| MacroAssembler assm(isolate, NULL, 0, v8::internal::CodeObjectRequired::kYes); |
| typedef struct test_float { |
| + uint32_t isNaN2008; |
| double a; |
| float b; |
| int32_t c; // a trunc result |
| @@ -2370,7 +2408,14 @@ TEST(round_w) { |
| -2.0, -3.0, -2.0, -3.0, -4.0, -4.0, |
| kFPUInvalidResult, kFPUInvalidResult, |
| kFPUInvalidResult}; |
| + double outputsNaN2008[kTableLength] = { |
| + 2.0, 3.0, 2.0, 3.0, 4.0, 4.0, |
| + -2.0, -3.0, -2.0, -3.0, -4.0, -4.0, |
| + kFPUInvalidResult, 0, |
| + kFPUInvalidResult}; |
| + __ cfc1(t1, FCSR); |
| + __ sw(t1, MemOperand(a0, offsetof(Test, isNaN2008))); |
| __ ldc1(f4, MemOperand(a0, offsetof(Test, a)) ); |
| __ lwc1(f6, MemOperand(a0, offsetof(Test, b)) ); |
| __ round_w_d(f8, f4); |
| @@ -2389,7 +2434,11 @@ TEST(round_w) { |
| test.a = inputs_D[i]; |
| test.b = inputs_S[i]; |
| (CALL_GENERATED_CODE(isolate, f, &test, 0, 0, 0, 0)); |
| - CHECK_EQ(test.c, outputs[i]); |
| + if ((test.isNaN2008 & kFCSRNaN2008FlagMask) && kArchVariant == kMips32r6) { |
| + CHECK_EQ(test.c, outputsNaN2008[i]); |
| + } else { |
| + CHECK_EQ(test.c, outputs[i]); |
| + } |
| CHECK_EQ(test.d, test.c); |
| } |
| } |
| @@ -2404,6 +2453,7 @@ TEST(round_l) { |
| v8::internal::CodeObjectRequired::kYes); |
| const double dFPU64InvalidResult = static_cast<double>(kFPU64InvalidResult); |
| typedef struct test_float { |
| + uint32_t isNaN2008; |
| double a; |
| float b; |
| int64_t c; |
| @@ -2429,7 +2479,15 @@ TEST(round_l) { |
| -2.0, -3.0, -2.0, -3.0, -4.0, -4.0, |
| 2147483648.0, dFPU64InvalidResult, |
| dFPU64InvalidResult}; |
| + double outputsNaN2008[kTableLength] = { |
| + 2.0, 3.0, 2.0, 3.0, 4.0, 4.0, |
| + -2.0, -3.0, -2.0, -3.0, -4.0, -4.0, |
| + 2147483648.0, |
| + 0, |
| + dFPU64InvalidResult}; |
| + __ cfc1(t1, FCSR); |
| + __ sw(t1, MemOperand(a0, offsetof(Test, isNaN2008))); |
| __ ldc1(f4, MemOperand(a0, offsetof(Test, a)) ); |
| __ lwc1(f6, MemOperand(a0, offsetof(Test, b)) ); |
| __ round_l_d(f8, f4); |
| @@ -2448,7 +2506,12 @@ TEST(round_l) { |
| test.a = inputs_D[i]; |
| test.b = inputs_S[i]; |
| (CALL_GENERATED_CODE(isolate, f, &test, 0, 0, 0, 0)); |
| - CHECK_EQ(test.c, outputs[i]); |
| + if ((test.isNaN2008 & kFCSRNaN2008FlagMask) && |
| + kArchVariant == kMips32r6) { |
| + CHECK_EQ(test.c, outputsNaN2008[i]); |
| + } else { |
| + CHECK_EQ(test.c, outputs[i]); |
| + } |
| CHECK_EQ(test.d, test.c); |
| } |
| } |
| @@ -2802,6 +2865,7 @@ TEST(floor_w) { |
| MacroAssembler assm(isolate, NULL, 0, v8::internal::CodeObjectRequired::kYes); |
| typedef struct test_float { |
| + uint32_t isNaN2008; |
| double a; |
| float b; |
| int32_t c; // a floor result |
| @@ -2827,7 +2891,15 @@ TEST(floor_w) { |
| -3.0, -3.0, -3.0, -4.0, -4.0, -4.0, |
| kFPUInvalidResult, kFPUInvalidResult, |
| kFPUInvalidResult}; |
| + double outputsNaN2008[kTableLength] = { |
| + 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, |
| + -3.0, -3.0, -3.0, -4.0, -4.0, -4.0, |
| + kFPUInvalidResult, |
| + 0, |
| + kFPUInvalidResult}; |
| + __ cfc1(t1, FCSR); |
| + __ sw(t1, MemOperand(a0, offsetof(Test, isNaN2008))); |
| __ ldc1(f4, MemOperand(a0, offsetof(Test, a)) ); |
| __ lwc1(f6, MemOperand(a0, offsetof(Test, b)) ); |
| __ floor_w_d(f8, f4); |
| @@ -2846,7 +2918,11 @@ TEST(floor_w) { |
| test.a = inputs_D[i]; |
| test.b = inputs_S[i]; |
| (CALL_GENERATED_CODE(isolate, f, &test, 0, 0, 0, 0)); |
| - CHECK_EQ(test.c, outputs[i]); |
| + if ((test.isNaN2008 & kFCSRNaN2008FlagMask) && kArchVariant == kMips32r6) { |
| + CHECK_EQ(test.c, outputsNaN2008[i]); |
| + } else { |
| + CHECK_EQ(test.c, outputs[i]); |
| + } |
| CHECK_EQ(test.d, test.c); |
| } |
| } |
| @@ -2861,6 +2937,7 @@ TEST(floor_l) { |
| v8::internal::CodeObjectRequired::kYes); |
| const double dFPU64InvalidResult = static_cast<double>(kFPU64InvalidResult); |
| typedef struct test_float { |
| + uint32_t isNaN2008; |
| double a; |
| float b; |
| int64_t c; |
| @@ -2886,7 +2963,15 @@ TEST(floor_l) { |
| -3.0, -3.0, -3.0, -4.0, -4.0, -4.0, |
| 2147483648.0, dFPU64InvalidResult, |
| dFPU64InvalidResult}; |
| + double outputsNaN2008[kTableLength] = { |
| + 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, |
| + -3.0, -3.0, -3.0, -4.0, -4.0, -4.0, |
| + 2147483648.0, |
| + 0, |
| + dFPU64InvalidResult}; |
| + __ cfc1(t1, FCSR); |
| + __ sw(t1, MemOperand(a0, offsetof(Test, isNaN2008))); |
| __ ldc1(f4, MemOperand(a0, offsetof(Test, a)) ); |
| __ lwc1(f6, MemOperand(a0, offsetof(Test, b)) ); |
| __ floor_l_d(f8, f4); |
| @@ -2905,7 +2990,12 @@ TEST(floor_l) { |
| test.a = inputs_D[i]; |
| test.b = inputs_S[i]; |
| (CALL_GENERATED_CODE(isolate, f, &test, 0, 0, 0, 0)); |
| - CHECK_EQ(test.c, outputs[i]); |
| + if ((test.isNaN2008 & kFCSRNaN2008FlagMask) && |
| + kArchVariant == kMips32r6) { |
| + CHECK_EQ(test.c, outputsNaN2008[i]); |
| + } else { |
| + CHECK_EQ(test.c, outputs[i]); |
| + } |
| CHECK_EQ(test.d, test.c); |
| } |
| } |
| @@ -2919,6 +3009,7 @@ TEST(ceil_w) { |
| MacroAssembler assm(isolate, NULL, 0, v8::internal::CodeObjectRequired::kYes); |
| typedef struct test_float { |
| + uint32_t isNaN2008; |
| double a; |
| float b; |
| int32_t c; // a floor result |
| @@ -2944,7 +3035,15 @@ TEST(ceil_w) { |
| -2.0, -2.0, -2.0, -3.0, -3.0, -3.0, |
| kFPUInvalidResult, kFPUInvalidResult, |
| kFPUInvalidResult}; |
| + double outputsNaN2008[kTableLength] = { |
| + 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, |
| + -2.0, -2.0, -2.0, -3.0, -3.0, -3.0, |
| + kFPUInvalidResult, |
| + 0, |
| + kFPUInvalidResult}; |
| + __ cfc1(t1, FCSR); |
| + __ sw(t1, MemOperand(a0, offsetof(Test, isNaN2008))); |
| __ ldc1(f4, MemOperand(a0, offsetof(Test, a)) ); |
| __ lwc1(f6, MemOperand(a0, offsetof(Test, b)) ); |
| __ ceil_w_d(f8, f4); |
| @@ -2963,7 +3062,11 @@ TEST(ceil_w) { |
| test.a = inputs_D[i]; |
| test.b = inputs_S[i]; |
| (CALL_GENERATED_CODE(isolate, f, &test, 0, 0, 0, 0)); |
| - CHECK_EQ(test.c, outputs[i]); |
| + if ((test.isNaN2008 & kFCSRNaN2008FlagMask) && kArchVariant == kMips32r6) { |
| + CHECK_EQ(test.c, outputsNaN2008[i]); |
| + } else { |
| + CHECK_EQ(test.c, outputs[i]); |
| + } |
| CHECK_EQ(test.d, test.c); |
| } |
| } |
| @@ -2978,6 +3081,7 @@ TEST(ceil_l) { |
| v8::internal::CodeObjectRequired::kYes); |
| const double dFPU64InvalidResult = static_cast<double>(kFPU64InvalidResult); |
| typedef struct test_float { |
| + uint32_t isNaN2008; |
| double a; |
| float b; |
| int64_t c; |
| @@ -3003,7 +3107,15 @@ TEST(ceil_l) { |
| -2.0, -2.0, -2.0, -3.0, -3.0, -3.0, |
| 2147483648.0, dFPU64InvalidResult, |
| dFPU64InvalidResult}; |
| + double outputsNaN2008[kTableLength] = { |
| + 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, |
| + -2.0, -2.0, -2.0, -3.0, -3.0, -3.0, |
| + 2147483648.0, |
| + 0, |
| + dFPU64InvalidResult}; |
| + __ cfc1(t1, FCSR); |
| + __ sw(t1, MemOperand(a0, offsetof(Test, isNaN2008))); |
| __ ldc1(f4, MemOperand(a0, offsetof(Test, a)) ); |
| __ lwc1(f6, MemOperand(a0, offsetof(Test, b)) ); |
| __ ceil_l_d(f8, f4); |
| @@ -3022,7 +3134,12 @@ TEST(ceil_l) { |
| test.a = inputs_D[i]; |
| test.b = inputs_S[i]; |
| (CALL_GENERATED_CODE(isolate, f, &test, 0, 0, 0, 0)); |
| - CHECK_EQ(test.c, outputs[i]); |
| + if ((test.isNaN2008 & kFCSRNaN2008FlagMask) && |
| + kArchVariant == kMips32r6) { |
| + CHECK_EQ(test.c, outputsNaN2008[i]); |
| + } else { |
| + CHECK_EQ(test.c, outputs[i]); |
| + } |
| CHECK_EQ(test.d, test.c); |
| } |
| } |