| 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..8a4e4ff0a232e0c10b741e15b8ebdb2d663b63e9 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);
|
| }
|
| }
|
| @@ -2288,6 +2311,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 +2337,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 +2364,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 +2381,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 +2407,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 +2433,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 +2452,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 +2478,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 +2505,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 +2864,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 +2890,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 +2917,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 +2936,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 +2962,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 +2989,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 +3008,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 +3034,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 +3061,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 +3080,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 +3106,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 +3133,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);
|
| }
|
| }
|
|
|