| Index: src/mips/macro-assembler-mips.cc
|
| diff --git a/src/mips/macro-assembler-mips.cc b/src/mips/macro-assembler-mips.cc
|
| index 9230f06eaf9673a1d33162ec0d12b6e2ed74b8be..b50eefc19b73756a5cadef61b91839fc3459835e 100644
|
| --- a/src/mips/macro-assembler-mips.cc
|
| +++ b/src/mips/macro-assembler-mips.cc
|
| @@ -1912,6 +1912,66 @@ void MacroAssembler::Ins(Register rt,
|
| }
|
| }
|
|
|
| +void MacroAssembler::Neg_s(FPURegister fd, FPURegister fs) {
|
| + Register scratch1 = t8;
|
| + Register scratch2 = t9;
|
| + if (IsMipsArchVariant(kMips32r2)) {
|
| + Label is_nan, done;
|
| + Register scratch1 = t8;
|
| + Register scratch2 = t9;
|
| + BranchF32(nullptr, &is_nan, eq, fs, fs);
|
| + Branch(USE_DELAY_SLOT, &done);
|
| + // For NaN input, neg_s will return the same NaN value,
|
| + // while the sign has to be changed separately.
|
| + neg_s(fd, fs); // In delay slot.
|
| +
|
| + bind(&is_nan);
|
| + mfc1(scratch1, fs);
|
| + And(scratch2, scratch1, Operand(~kBinary32SignMask));
|
| + And(scratch1, scratch1, Operand(kBinary32SignMask));
|
| + Xor(scratch1, scratch1, Operand(kBinary32SignMask));
|
| + Or(scratch2, scratch2, scratch1);
|
| + mtc1(scratch2, fd);
|
| + bind(&done);
|
| + } else {
|
| + mfc1(scratch1, fs);
|
| + And(scratch2, scratch1, Operand(~kBinary32SignMask));
|
| + And(scratch1, scratch1, Operand(kBinary32SignMask));
|
| + Xor(scratch1, scratch1, Operand(kBinary32SignMask));
|
| + Or(scratch2, scratch2, scratch1);
|
| + mtc1(scratch2, fd);
|
| + }
|
| +}
|
| +
|
| +void MacroAssembler::Neg_d(FPURegister fd, FPURegister fs) {
|
| + Register scratch1 = t8;
|
| + Register scratch2 = t9;
|
| + if (IsMipsArchVariant(kMips32r2)) {
|
| + Label is_nan, done;
|
| + BranchF64(nullptr, &is_nan, eq, fs, fs);
|
| + Branch(USE_DELAY_SLOT, &done);
|
| + // For NaN input, neg_d will return the same NaN value,
|
| + // while the sign has to be changed separately.
|
| + neg_d(fd, fs); // In delay slot.
|
| +
|
| + bind(&is_nan);
|
| + Mfhc1(scratch1, fs);
|
| + And(scratch2, scratch1, Operand(~HeapNumber::kSignMask));
|
| + And(scratch1, scratch1, Operand(HeapNumber::kSignMask));
|
| + Xor(scratch1, scratch1, Operand(HeapNumber::kSignMask));
|
| + Or(scratch2, scratch2, scratch1);
|
| + Mthc1(scratch2, fd);
|
| + bind(&done);
|
| + } else {
|
| + Move_d(fd, fs);
|
| + Mfhc1(scratch1, fs);
|
| + And(scratch2, scratch1, Operand(~HeapNumber::kSignMask));
|
| + And(scratch1, scratch1, Operand(HeapNumber::kSignMask));
|
| + Xor(scratch1, scratch1, Operand(HeapNumber::kSignMask));
|
| + Or(scratch2, scratch2, scratch1);
|
| + Mthc1(scratch2, fd);
|
| + }
|
| +}
|
|
|
| void MacroAssembler::Cvt_d_uw(FPURegister fd, Register rs,
|
| FPURegister scratch) {
|
| @@ -2317,7 +2377,7 @@ void MacroAssembler::Move(FPURegister dst, double imm) {
|
| if (imm_bits == bit_cast<int64_t>(0.0) && has_double_zero_reg_set_) {
|
| mov_d(dst, kDoubleRegZero);
|
| } else if (imm_bits == bit_cast<int64_t>(-0.0) && has_double_zero_reg_set_) {
|
| - neg_d(dst, kDoubleRegZero);
|
| + Neg_d(dst, kDoubleRegZero);
|
| } else {
|
| uint32_t lo, hi;
|
| DoubleAsTwoUInt32(imm, &lo, &hi);
|
|
|