OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 1143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1154 Register dividend = ToRegister(instr->dividend()); | 1154 Register dividend = ToRegister(instr->dividend()); |
1155 int32_t divisor = instr->divisor(); | 1155 int32_t divisor = instr->divisor(); |
1156 Register result = ToRegister(instr->result()); | 1156 Register result = ToRegister(instr->result()); |
1157 ASSERT(!dividend.is(result)); | 1157 ASSERT(!dividend.is(result)); |
1158 | 1158 |
1159 if (divisor == 0) { | 1159 if (divisor == 0) { |
1160 DeoptimizeIf(al, instr->environment()); | 1160 DeoptimizeIf(al, instr->environment()); |
1161 return; | 1161 return; |
1162 } | 1162 } |
1163 | 1163 |
1164 __ FlooringDiv(result, dividend, Abs(divisor)); | 1164 __ TruncatingDiv(result, dividend, Abs(divisor)); |
1165 __ add(result, result, Operand(dividend, LSR, 31)); | |
1166 __ mov(ip, Operand(Abs(divisor))); | 1165 __ mov(ip, Operand(Abs(divisor))); |
1167 __ smull(result, ip, result, ip); | 1166 __ smull(result, ip, result, ip); |
1168 __ sub(result, dividend, result, SetCC); | 1167 __ sub(result, dividend, result, SetCC); |
1169 | 1168 |
1170 // Check for negative zero. | 1169 // Check for negative zero. |
1171 HMod* hmod = instr->hydrogen(); | 1170 HMod* hmod = instr->hydrogen(); |
1172 if (hmod->CheckFlag(HValue::kBailoutOnMinusZero)) { | 1171 if (hmod->CheckFlag(HValue::kBailoutOnMinusZero)) { |
1173 Label remainder_not_zero; | 1172 Label remainder_not_zero; |
1174 __ b(ne, &remainder_not_zero); | 1173 __ b(ne, &remainder_not_zero); |
1175 __ cmp(dividend, Operand::Zero()); | 1174 __ cmp(dividend, Operand::Zero()); |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1342 return; | 1341 return; |
1343 } | 1342 } |
1344 | 1343 |
1345 // Check for (0 / -x) that will produce negative zero. | 1344 // Check for (0 / -x) that will produce negative zero. |
1346 HDiv* hdiv = instr->hydrogen(); | 1345 HDiv* hdiv = instr->hydrogen(); |
1347 if (hdiv->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) { | 1346 if (hdiv->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) { |
1348 __ cmp(dividend, Operand::Zero()); | 1347 __ cmp(dividend, Operand::Zero()); |
1349 DeoptimizeIf(eq, instr->environment()); | 1348 DeoptimizeIf(eq, instr->environment()); |
1350 } | 1349 } |
1351 | 1350 |
1352 __ FlooringDiv(result, dividend, Abs(divisor)); | 1351 __ TruncatingDiv(result, dividend, Abs(divisor)); |
1353 __ add(result, result, Operand(dividend, LSR, 31)); | |
1354 if (divisor < 0) __ rsb(result, result, Operand::Zero()); | 1352 if (divisor < 0) __ rsb(result, result, Operand::Zero()); |
1355 | 1353 |
1356 if (!hdiv->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) { | 1354 if (!hdiv->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) { |
1357 __ mov(ip, Operand(divisor)); | 1355 __ mov(ip, Operand(divisor)); |
1358 __ smull(scratch0(), ip, result, ip); | 1356 __ smull(scratch0(), ip, result, ip); |
1359 __ sub(scratch0(), scratch0(), dividend, SetCC); | 1357 __ sub(scratch0(), scratch0(), dividend, SetCC); |
1360 DeoptimizeIf(ne, instr->environment()); | 1358 DeoptimizeIf(ne, instr->environment()); |
1361 } | 1359 } |
1362 } | 1360 } |
1363 | 1361 |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1502 return; | 1500 return; |
1503 } | 1501 } |
1504 | 1502 |
1505 // Check for (0 / -x) that will produce negative zero. | 1503 // Check for (0 / -x) that will produce negative zero. |
1506 HMathFloorOfDiv* hdiv = instr->hydrogen(); | 1504 HMathFloorOfDiv* hdiv = instr->hydrogen(); |
1507 if (hdiv->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) { | 1505 if (hdiv->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) { |
1508 __ cmp(dividend, Operand::Zero()); | 1506 __ cmp(dividend, Operand::Zero()); |
1509 DeoptimizeIf(eq, instr->environment()); | 1507 DeoptimizeIf(eq, instr->environment()); |
1510 } | 1508 } |
1511 | 1509 |
1512 __ FlooringDiv(result, dividend, divisor); | 1510 // TODO(svenpanne) Add correction terms. |
| 1511 __ TruncatingDiv(result, dividend, divisor); |
1513 } | 1512 } |
1514 | 1513 |
1515 | 1514 |
1516 void LCodeGen::DoMulI(LMulI* instr) { | 1515 void LCodeGen::DoMulI(LMulI* instr) { |
1517 Register result = ToRegister(instr->result()); | 1516 Register result = ToRegister(instr->result()); |
1518 // Note that result may alias left. | 1517 // Note that result may alias left. |
1519 Register left = ToRegister(instr->left()); | 1518 Register left = ToRegister(instr->left()); |
1520 LOperand* right_op = instr->right(); | 1519 LOperand* right_op = instr->right(); |
1521 | 1520 |
1522 bool bailout_on_minus_zero = | 1521 bool bailout_on_minus_zero = |
(...skipping 4192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5715 __ sub(scratch, result, Operand::PointerOffsetFromSmiKey(index)); | 5714 __ sub(scratch, result, Operand::PointerOffsetFromSmiKey(index)); |
5716 __ ldr(result, FieldMemOperand(scratch, | 5715 __ ldr(result, FieldMemOperand(scratch, |
5717 FixedArray::kHeaderSize - kPointerSize)); | 5716 FixedArray::kHeaderSize - kPointerSize)); |
5718 __ bind(&done); | 5717 __ bind(&done); |
5719 } | 5718 } |
5720 | 5719 |
5721 | 5720 |
5722 #undef __ | 5721 #undef __ |
5723 | 5722 |
5724 } } // namespace v8::internal | 5723 } } // namespace v8::internal |
OLD | NEW |