| OLD | NEW | 
|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "src/v8.h" | 5 #include "src/v8.h" | 
| 6 | 6 | 
| 7 #include "src/code-stubs.h" | 7 #include "src/code-stubs.h" | 
| 8 #include "src/hydrogen-osr.h" | 8 #include "src/hydrogen-osr.h" | 
| 9 #include "src/mips64/lithium-codegen-mips64.h" | 9 #include "src/mips64/lithium-codegen-mips64.h" | 
| 10 #include "src/mips64/lithium-gap-resolver-mips64.h" | 10 #include "src/mips64/lithium-gap-resolver-mips64.h" | 
| (...skipping 1138 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1149     DeoptimizeIf(eq, instr->environment(), result_reg, Operand(zero_reg)); | 1149     DeoptimizeIf(eq, instr->environment(), result_reg, Operand(zero_reg)); | 
| 1150   } | 1150   } | 
| 1151   __ bind(&done); | 1151   __ bind(&done); | 
| 1152 } | 1152 } | 
| 1153 | 1153 | 
| 1154 | 1154 | 
| 1155 void LCodeGen::DoDivByPowerOf2I(LDivByPowerOf2I* instr) { | 1155 void LCodeGen::DoDivByPowerOf2I(LDivByPowerOf2I* instr) { | 
| 1156   Register dividend = ToRegister(instr->dividend()); | 1156   Register dividend = ToRegister(instr->dividend()); | 
| 1157   int32_t divisor = instr->divisor(); | 1157   int32_t divisor = instr->divisor(); | 
| 1158   Register result = ToRegister(instr->result()); | 1158   Register result = ToRegister(instr->result()); | 
| 1159   DCHECK(divisor == kMinInt || IsPowerOf2(Abs(divisor))); | 1159   DCHECK(divisor == kMinInt || base::bits::IsPowerOfTwo32(Abs(divisor))); | 
| 1160   DCHECK(!result.is(dividend)); | 1160   DCHECK(!result.is(dividend)); | 
| 1161 | 1161 | 
| 1162   // Check for (0 / -x) that will produce negative zero. | 1162   // Check for (0 / -x) that will produce negative zero. | 
| 1163   HDiv* hdiv = instr->hydrogen(); | 1163   HDiv* hdiv = instr->hydrogen(); | 
| 1164   if (hdiv->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) { | 1164   if (hdiv->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) { | 
| 1165     DeoptimizeIf(eq, instr->environment(), dividend, Operand(zero_reg)); | 1165     DeoptimizeIf(eq, instr->environment(), dividend, Operand(zero_reg)); | 
| 1166   } | 1166   } | 
| 1167   // Check for (kMinInt / -1). | 1167   // Check for (kMinInt / -1). | 
| 1168   if (hdiv->CheckFlag(HValue::kCanOverflow) && divisor == -1) { | 1168   if (hdiv->CheckFlag(HValue::kCanOverflow) && divisor == -1) { | 
| 1169     DeoptimizeIf(eq, instr->environment(), dividend, Operand(kMinInt)); | 1169     DeoptimizeIf(eq, instr->environment(), dividend, Operand(kMinInt)); | 
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1473         // Nothing to do. | 1473         // Nothing to do. | 
| 1474         __ Move(result, left); | 1474         __ Move(result, left); | 
| 1475         break; | 1475         break; | 
| 1476       default: | 1476       default: | 
| 1477         // Multiplying by powers of two and powers of two plus or minus | 1477         // Multiplying by powers of two and powers of two plus or minus | 
| 1478         // one can be done faster with shifted operands. | 1478         // one can be done faster with shifted operands. | 
| 1479         // For other constants we emit standard code. | 1479         // For other constants we emit standard code. | 
| 1480         int32_t mask = constant >> 31; | 1480         int32_t mask = constant >> 31; | 
| 1481         uint32_t constant_abs = (constant + mask) ^ mask; | 1481         uint32_t constant_abs = (constant + mask) ^ mask; | 
| 1482 | 1482 | 
| 1483         if (IsPowerOf2(constant_abs)) { | 1483         if (base::bits::IsPowerOfTwo32(constant_abs)) { | 
| 1484           int32_t shift = WhichPowerOf2(constant_abs); | 1484           int32_t shift = WhichPowerOf2(constant_abs); | 
| 1485           __ dsll(result, left, shift); | 1485           __ dsll(result, left, shift); | 
| 1486           // Correct the sign of the result if the constant is negative. | 1486           // Correct the sign of the result if the constant is negative. | 
| 1487           if (constant < 0)  __ Dsubu(result, zero_reg, result); | 1487           if (constant < 0)  __ Dsubu(result, zero_reg, result); | 
| 1488         } else if (IsPowerOf2(constant_abs - 1)) { | 1488         } else if (base::bits::IsPowerOfTwo32(constant_abs - 1)) { | 
| 1489           int32_t shift = WhichPowerOf2(constant_abs - 1); | 1489           int32_t shift = WhichPowerOf2(constant_abs - 1); | 
| 1490           __ dsll(scratch, left, shift); | 1490           __ dsll(scratch, left, shift); | 
| 1491           __ Daddu(result, scratch, left); | 1491           __ Daddu(result, scratch, left); | 
| 1492           // Correct the sign of the result if the constant is negative. | 1492           // Correct the sign of the result if the constant is negative. | 
| 1493           if (constant < 0)  __ Dsubu(result, zero_reg, result); | 1493           if (constant < 0)  __ Dsubu(result, zero_reg, result); | 
| 1494         } else if (IsPowerOf2(constant_abs + 1)) { | 1494         } else if (base::bits::IsPowerOfTwo32(constant_abs + 1)) { | 
| 1495           int32_t shift = WhichPowerOf2(constant_abs + 1); | 1495           int32_t shift = WhichPowerOf2(constant_abs + 1); | 
| 1496           __ dsll(scratch, left, shift); | 1496           __ dsll(scratch, left, shift); | 
| 1497           __ Dsubu(result, scratch, left); | 1497           __ Dsubu(result, scratch, left); | 
| 1498           // Correct the sign of the result if the constant is negative. | 1498           // Correct the sign of the result if the constant is negative. | 
| 1499           if (constant < 0)  __ Dsubu(result, zero_reg, result); | 1499           if (constant < 0)  __ Dsubu(result, zero_reg, result); | 
| 1500         } else { | 1500         } else { | 
| 1501           // Generate standard code. | 1501           // Generate standard code. | 
| 1502           __ li(at, constant); | 1502           __ li(at, constant); | 
| 1503           __ Dmul(result, left, at); | 1503           __ Dmul(result, left, at); | 
| 1504         } | 1504         } | 
| (...skipping 3627 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5132       // Omit check for the last type. | 5132       // Omit check for the last type. | 
| 5133       if (last != LAST_TYPE) { | 5133       if (last != LAST_TYPE) { | 
| 5134         DeoptimizeIf(hi, instr->environment(), scratch, Operand(last)); | 5134         DeoptimizeIf(hi, instr->environment(), scratch, Operand(last)); | 
| 5135       } | 5135       } | 
| 5136     } | 5136     } | 
| 5137   } else { | 5137   } else { | 
| 5138     uint8_t mask; | 5138     uint8_t mask; | 
| 5139     uint8_t tag; | 5139     uint8_t tag; | 
| 5140     instr->hydrogen()->GetCheckMaskAndTag(&mask, &tag); | 5140     instr->hydrogen()->GetCheckMaskAndTag(&mask, &tag); | 
| 5141 | 5141 | 
| 5142     if (IsPowerOf2(mask)) { | 5142     if (base::bits::IsPowerOfTwo32(mask)) { | 
| 5143       DCHECK(tag == 0 || IsPowerOf2(tag)); | 5143       DCHECK(tag == 0 || base::bits::IsPowerOfTwo32(tag)); | 
| 5144       __ And(at, scratch, mask); | 5144       __ And(at, scratch, mask); | 
| 5145       DeoptimizeIf(tag == 0 ? ne : eq, instr->environment(), | 5145       DeoptimizeIf(tag == 0 ? ne : eq, instr->environment(), | 
| 5146           at, Operand(zero_reg)); | 5146           at, Operand(zero_reg)); | 
| 5147     } else { | 5147     } else { | 
| 5148       __ And(scratch, scratch, Operand(mask)); | 5148       __ And(scratch, scratch, Operand(mask)); | 
| 5149       DeoptimizeIf(ne, instr->environment(), scratch, Operand(tag)); | 5149       DeoptimizeIf(ne, instr->environment(), scratch, Operand(tag)); | 
| 5150     } | 5150     } | 
| 5151   } | 5151   } | 
| 5152 } | 5152 } | 
| 5153 | 5153 | 
| (...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5936   __ li(at, scope_info); | 5936   __ li(at, scope_info); | 
| 5937   __ Push(at, ToRegister(instr->function())); | 5937   __ Push(at, ToRegister(instr->function())); | 
| 5938   CallRuntime(Runtime::kPushBlockContext, 2, instr); | 5938   CallRuntime(Runtime::kPushBlockContext, 2, instr); | 
| 5939   RecordSafepoint(Safepoint::kNoLazyDeopt); | 5939   RecordSafepoint(Safepoint::kNoLazyDeopt); | 
| 5940 } | 5940 } | 
| 5941 | 5941 | 
| 5942 | 5942 | 
| 5943 #undef __ | 5943 #undef __ | 
| 5944 | 5944 | 
| 5945 } }  // namespace v8::internal | 5945 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|