| Index: src/compiler/mips64/code-generator-mips64.cc
|
| diff --git a/src/compiler/mips64/code-generator-mips64.cc b/src/compiler/mips64/code-generator-mips64.cc
|
| index 3683740b8924065cdf3b5cc283d9a99bc1086c4d..f40163fa93c5778279701d26de4b1bfe49f9c1e6 100644
|
| --- a/src/compiler/mips64/code-generator-mips64.cc
|
| +++ b/src/compiler/mips64/code-generator-mips64.cc
|
| @@ -1079,9 +1079,30 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
| }
|
| case kMips64TruncLS: {
|
| FPURegister scratch = kScratchDoubleReg;
|
| + Register tmp_fcsr = kScratchReg;
|
| + Register result = kScratchReg2;
|
| +
|
| + bool load_status = instr->OutputCount() > 1;
|
| + if (load_status) {
|
| + // Save FCSR.
|
| + __ cfc1(tmp_fcsr, FCSR);
|
| + // Clear FPU flags.
|
| + __ ctc1(zero_reg, FCSR);
|
| + }
|
| // Other arches use round to zero here, so we follow.
|
| __ trunc_l_s(scratch, i.InputDoubleRegister(0));
|
| __ dmfc1(i.OutputRegister(), scratch);
|
| + if (load_status) {
|
| + __ cfc1(result, FCSR);
|
| + // Check for overflow and NaNs.
|
| + __ andi(result, result,
|
| + (kFCSROverflowFlagMask | kFCSRInvalidOpFlagMask));
|
| + __ Slt(result, zero_reg, result);
|
| + __ xori(result, result, 1);
|
| + __ mov(i.OutputRegister(1), result);
|
| + // Restore FCSR
|
| + __ ctc1(tmp_fcsr, FCSR);
|
| + }
|
| break;
|
| }
|
| case kMips64TruncLD: {
|
|
|