| Index: src/mips64/lithium-codegen-mips64.cc
|
| diff --git a/src/mips64/lithium-codegen-mips64.cc b/src/mips64/lithium-codegen-mips64.cc
|
| index 4a625610d879295c86a0dbd00ab0bb0462c48483..d1bdacd680b346c76c931136973ab53953742f73 100644
|
| --- a/src/mips64/lithium-codegen-mips64.cc
|
| +++ b/src/mips64/lithium-codegen-mips64.cc
|
| @@ -1119,7 +1119,7 @@ void LCodeGen::DoModI(LModI* instr) {
|
| const Register result_reg = ToRegister(instr->result());
|
|
|
| // div runs in the background while we check for special cases.
|
| - __ ddiv(left_reg, right_reg);
|
| + __ Dmod(result_reg, left_reg, right_reg);
|
|
|
| Label done;
|
| // Check for x % 0, we have to deopt in this case because we can't return a
|
| @@ -1144,8 +1144,7 @@ void LCodeGen::DoModI(LModI* instr) {
|
| }
|
|
|
| // If we care about -0, test if the dividend is <0 and the result is 0.
|
| - __ Branch(USE_DELAY_SLOT, &done, ge, left_reg, Operand(zero_reg));
|
| - __ mfhi(result_reg);
|
| + __ Branch(&done, ge, left_reg, Operand(zero_reg));
|
|
|
| if (hmod->CheckFlag(HValue::kBailoutOnMinusZero)) {
|
| DeoptimizeIf(eq, instr->environment(), result_reg, Operand(zero_reg));
|
| @@ -1235,7 +1234,7 @@ void LCodeGen::DoDivI(LDivI* instr) {
|
|
|
| // On MIPS div is asynchronous - it will run in the background while we
|
| // check for special cases.
|
| - __ ddiv(dividend, divisor);
|
| + __ Ddiv(result, dividend, divisor);
|
|
|
| // Check for x / 0.
|
| if (hdiv->CheckFlag(HValue::kCanBeDivByZero)) {
|
| @@ -1260,11 +1259,14 @@ void LCodeGen::DoDivI(LDivI* instr) {
|
| }
|
|
|
| if (!hdiv->CheckFlag(HValue::kAllUsesTruncatingToInt32)) {
|
| - __ mfhi(result);
|
| - DeoptimizeIf(ne, instr->environment(), result, Operand(zero_reg));
|
| - __ mflo(result);
|
| - } else {
|
| - __ mflo(result);
|
| + // Calculate remainder.
|
| + Register remainder = ToRegister(instr->temp());
|
| + if (kArchVariant != kMips64r6) {
|
| + __ mfhi(remainder);
|
| + } else {
|
| + __ dmod(remainder, dividend, divisor);
|
| + }
|
| + DeoptimizeIf(ne, instr->environment(), remainder, Operand(zero_reg));
|
| }
|
| }
|
|
|
| @@ -1391,7 +1393,7 @@ void LCodeGen::DoFlooringDivI(LFlooringDivI* instr) {
|
|
|
| // On MIPS div is asynchronous - it will run in the background while we
|
| // check for special cases.
|
| - __ ddiv(dividend, divisor);
|
| + __ Ddiv(result, dividend, divisor);
|
|
|
| // Check for x / 0.
|
| if (hdiv->CheckFlag(HValue::kCanBeDivByZero)) {
|
| @@ -1418,8 +1420,11 @@ void LCodeGen::DoFlooringDivI(LFlooringDivI* instr) {
|
| // We performed a truncating division. Correct the result if necessary.
|
| Label done;
|
| Register remainder = scratch0();
|
| - __ mfhi(remainder);
|
| - __ mflo(result);
|
| + if (kArchVariant != kMips64r6) {
|
| + __ mfhi(remainder);
|
| + } else {
|
| + __ dmod(remainder, dividend, divisor);
|
| + }
|
| __ Branch(&done, eq, remainder, Operand(zero_reg), USE_DELAY_SLOT);
|
| __ Xor(remainder, remainder, Operand(divisor));
|
| __ Branch(&done, ge, remainder, Operand(zero_reg));
|
| @@ -1507,21 +1512,16 @@ void LCodeGen::DoMulI(LMulI* instr) {
|
| if (overflow) {
|
| // hi:lo = left * right.
|
| if (instr->hydrogen()->representation().IsSmi()) {
|
| - __ SmiUntag(result, left);
|
| - __ dmult(result, right);
|
| - __ mfhi(scratch);
|
| - __ mflo(result);
|
| + __ Dmulh(result, left, right);
|
| } else {
|
| - __ dmult(left, right);
|
| - __ mfhi(scratch);
|
| - __ mflo(result);
|
| + __ Dmul(result, left, right);
|
| }
|
| - __ dsra32(at, result, 31);
|
| - DeoptimizeIf(ne, instr->environment(), scratch, Operand(at));
|
| - if (!instr->hydrogen()->representation().IsSmi()) {
|
| - DeoptimizeIf(gt, instr->environment(), result, Operand(kMaxInt));
|
| - DeoptimizeIf(lt, instr->environment(), result, Operand(kMinInt));
|
| + __ dsra32(scratch, result, 0);
|
| + __ sra(at, result, 31);
|
| + if (instr->hydrogen()->representation().IsSmi()) {
|
| + __ SmiTag(result);
|
| }
|
| + DeoptimizeIf(ne, instr->environment(), scratch, Operand(at));
|
| } else {
|
| if (instr->hydrogen()->representation().IsSmi()) {
|
| __ SmiUntag(result, left);
|
|
|