| 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 1365 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1376         // it gets implemented. | 1376         // it gets implemented. | 
| 1377         __ mul(scratch, result, ip); | 1377         __ mul(scratch, result, ip); | 
| 1378         __ sub(remainder, dividend, scratch); | 1378         __ sub(remainder, dividend, scratch); | 
| 1379       } | 1379       } | 
| 1380   } | 1380   } | 
| 1381 } | 1381 } | 
| 1382 | 1382 | 
| 1383 | 1383 | 
| 1384 void LCodeGen::DoDivI(LDivI* instr) { | 1384 void LCodeGen::DoDivI(LDivI* instr) { | 
| 1385   if (instr->hydrogen()->HasPowerOf2Divisor()) { | 1385   if (instr->hydrogen()->HasPowerOf2Divisor()) { | 
| 1386     Register dividend = ToRegister(instr->left()); | 1386     const Register dividend = ToRegister(instr->left()); | 
|  | 1387     const Register result = ToRegister(instr->result()); | 
| 1387     int32_t divisor = instr->hydrogen()->right()->GetInteger32Constant(); | 1388     int32_t divisor = instr->hydrogen()->right()->GetInteger32Constant(); | 
| 1388     int32_t test_value = 0; | 1389     int32_t test_value = 0; | 
| 1389     int32_t power = 0; | 1390     int32_t power = 0; | 
| 1390 | 1391 | 
| 1391     if (divisor > 0) { | 1392     if (divisor > 0) { | 
| 1392       test_value = divisor - 1; | 1393       test_value = divisor - 1; | 
| 1393       power = WhichPowerOf2(divisor); | 1394       power = WhichPowerOf2(divisor); | 
| 1394     } else { | 1395     } else { | 
| 1395       // Check for (0 / -x) that will produce negative zero. | 1396       // Check for (0 / -x) that will produce negative zero. | 
| 1396       if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { | 1397       if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { | 
| 1397         __ tst(dividend, Operand(dividend)); | 1398         __ cmp(dividend, Operand::Zero()); | 
| 1398         DeoptimizeIf(eq, instr->environment()); | 1399         DeoptimizeIf(eq, instr->environment()); | 
| 1399       } | 1400       } | 
| 1400       // Check for (kMinInt / -1). | 1401       // Check for (kMinInt / -1). | 
| 1401       if (divisor == -1 && instr->hydrogen()->CheckFlag(HValue::kCanOverflow)) { | 1402       if (divisor == -1 && instr->hydrogen()->CheckFlag(HValue::kCanOverflow)) { | 
| 1402         __ cmp(dividend, Operand(kMinInt)); | 1403         __ cmp(dividend, Operand(kMinInt)); | 
| 1403         DeoptimizeIf(eq, instr->environment()); | 1404         DeoptimizeIf(eq, instr->environment()); | 
| 1404       } | 1405       } | 
| 1405       test_value = - divisor - 1; | 1406       test_value = - divisor - 1; | 
| 1406       power = WhichPowerOf2(-divisor); | 1407       power = WhichPowerOf2(-divisor); | 
| 1407     } | 1408     } | 
| 1408 | 1409 | 
| 1409     if (test_value != 0) { | 1410     if (test_value != 0) { | 
| 1410       if (instr->hydrogen()->CheckFlag( | 1411       if (instr->hydrogen()->CheckFlag( | 
| 1411           HInstruction::kAllUsesTruncatingToInt32)) { | 1412           HInstruction::kAllUsesTruncatingToInt32)) { | 
| 1412         __ cmp(dividend, Operand(0)); | 1413         __ sub(result, dividend, Operand::Zero(), SetCC); | 
| 1413         __ rsb(dividend, dividend, Operand(0), LeaveCC, lt); | 1414         __ rsb(result, result, Operand::Zero(), LeaveCC, lt); | 
| 1414         __ mov(dividend, Operand(dividend, ASR, power)); | 1415         __ mov(result, Operand(result, ASR, power)); | 
| 1415         if (divisor > 0) __ rsb(dividend, dividend, Operand(0), LeaveCC, lt); | 1416         if (divisor > 0) __ rsb(result, result, Operand::Zero(), LeaveCC, lt); | 
| 1416         if (divisor < 0) __ rsb(dividend, dividend, Operand(0), LeaveCC, gt); | 1417         if (divisor < 0) __ rsb(result, result, Operand::Zero(), LeaveCC, gt); | 
| 1417         return;  // Don't fall through to "__ rsb" below. | 1418         return;  // Don't fall through to "__ rsb" below. | 
| 1418       } else { | 1419       } else { | 
| 1419         // Deoptimize if remainder is not 0. | 1420         // Deoptimize if remainder is not 0. | 
| 1420         __ tst(dividend, Operand(test_value)); | 1421         __ tst(dividend, Operand(test_value)); | 
| 1421         DeoptimizeIf(ne, instr->environment()); | 1422         DeoptimizeIf(ne, instr->environment()); | 
| 1422         __ mov(dividend, Operand(dividend, ASR, power)); | 1423         __ mov(result, Operand(dividend, ASR, power)); | 
|  | 1424         if (divisor < 0) __ rsb(result, result, Operand(0)); | 
|  | 1425       } | 
|  | 1426     } else { | 
|  | 1427       if (divisor < 0) { | 
|  | 1428         __ rsb(result, dividend, Operand(0)); | 
|  | 1429       } else { | 
|  | 1430         __ Move(result, dividend); | 
| 1423       } | 1431       } | 
| 1424     } | 1432     } | 
| 1425     if (divisor < 0) __ rsb(dividend, dividend, Operand(0)); |  | 
| 1426 | 1433 | 
| 1427     return; | 1434     return; | 
| 1428   } | 1435   } | 
| 1429 | 1436 | 
| 1430   const Register left = ToRegister(instr->left()); | 1437   const Register left = ToRegister(instr->left()); | 
| 1431   const Register right = ToRegister(instr->right()); | 1438   const Register right = ToRegister(instr->right()); | 
| 1432   const Register result = ToRegister(instr->result()); | 1439   const Register result = ToRegister(instr->result()); | 
| 1433 | 1440 | 
| 1434   // Check for x / 0. | 1441   // Check for x / 0. | 
| 1435   if (instr->hydrogen()->CheckFlag(HValue::kCanBeDivByZero)) { | 1442   if (instr->hydrogen()->CheckFlag(HValue::kCanBeDivByZero)) { | 
| 1436     __ cmp(right, Operand::Zero()); | 1443     __ cmp(right, Operand::Zero()); | 
| 1437     DeoptimizeIf(eq, instr->environment()); | 1444     DeoptimizeIf(eq, instr->environment()); | 
| 1438   } | 1445   } | 
| 1439 | 1446 | 
| 1440   // Check for (0 / -x) that will produce negative zero. | 1447   // Check for (0 / -x) that will produce negative zero. | 
| 1441   if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { | 1448   if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { | 
| 1442     Label left_not_zero; | 1449     Label positive; | 
|  | 1450     if (!instr->hydrogen()->CheckFlag(HValue::kCanBeDivByZero)) { | 
|  | 1451       // Do the test only if it hadn't be done above. | 
|  | 1452       __ cmp(right, Operand::Zero()); | 
|  | 1453     } | 
|  | 1454     __ b(pl, &positive); | 
| 1443     __ cmp(left, Operand::Zero()); | 1455     __ cmp(left, Operand::Zero()); | 
| 1444     __ b(ne, &left_not_zero); | 1456     DeoptimizeIf(eq, instr->environment()); | 
| 1445     __ cmp(right, Operand::Zero()); | 1457     __ bind(&positive); | 
| 1446     DeoptimizeIf(mi, instr->environment()); |  | 
| 1447     __ bind(&left_not_zero); |  | 
| 1448   } | 1458   } | 
| 1449 | 1459 | 
| 1450   // Check for (kMinInt / -1). | 1460   // Check for (kMinInt / -1). | 
| 1451   if (instr->hydrogen()->CheckFlag(HValue::kCanOverflow)) { | 1461   if (instr->hydrogen()->CheckFlag(HValue::kCanOverflow)) { | 
| 1452     Label left_not_min_int; | 1462     Label left_not_min_int; | 
| 1453     __ cmp(left, Operand(kMinInt)); | 1463     __ cmp(left, Operand(kMinInt)); | 
| 1454     __ b(ne, &left_not_min_int); | 1464     __ b(ne, &left_not_min_int); | 
| 1455     __ cmp(right, Operand(-1)); | 1465     __ cmp(right, Operand(-1)); | 
| 1456     DeoptimizeIf(eq, instr->environment()); | 1466     DeoptimizeIf(eq, instr->environment()); | 
| 1457     __ bind(&left_not_min_int); | 1467     __ bind(&left_not_min_int); | 
| (...skipping 4329 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5787   __ sub(scratch, result, Operand::PointerOffsetFromSmiKey(index)); | 5797   __ sub(scratch, result, Operand::PointerOffsetFromSmiKey(index)); | 
| 5788   __ ldr(result, FieldMemOperand(scratch, | 5798   __ ldr(result, FieldMemOperand(scratch, | 
| 5789                                  FixedArray::kHeaderSize - kPointerSize)); | 5799                                  FixedArray::kHeaderSize - kPointerSize)); | 
| 5790   __ bind(&done); | 5800   __ bind(&done); | 
| 5791 } | 5801 } | 
| 5792 | 5802 | 
| 5793 | 5803 | 
| 5794 #undef __ | 5804 #undef __ | 
| 5795 | 5805 | 
| 5796 } }  // namespace v8::internal | 5806 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|