| 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);
 | 
|      }
 | 
|    }
 | 
| 
 |