Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: src/x87/lithium-codegen-x87.cc

Issue 330133004: X87: Fixed flooring division by a power of 2, once again... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #if V8_TARGET_ARCH_X87 7 #if V8_TARGET_ARCH_X87
8 8
9 #include "src/x87/lithium-codegen-x87.h" 9 #include "src/x87/lithium-codegen-x87.h"
10 #include "src/ic.h" 10 #include "src/ic.h"
(...skipping 1528 matching lines...) Expand 10 before | Expand all | Expand 10 after
1539 __ sar(dividend, shift); 1539 __ sar(dividend, shift);
1540 return; 1540 return;
1541 } 1541 }
1542 1542
1543 // If the divisor is negative, we have to negate and handle edge cases. 1543 // If the divisor is negative, we have to negate and handle edge cases.
1544 __ neg(dividend); 1544 __ neg(dividend);
1545 if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { 1545 if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) {
1546 DeoptimizeIf(zero, instr->environment()); 1546 DeoptimizeIf(zero, instr->environment());
1547 } 1547 }
1548 1548
1549 // Dividing by -1 is basically negation, unless we overflow.
1550 if (divisor == -1) {
1551 if (instr->hydrogen()->CheckFlag(HValue::kLeftCanBeMinInt)) {
1552 DeoptimizeIf(overflow, instr->environment());
1553 }
1554 return;
1555 }
1556
1557 // If the negation could not overflow, simply shifting is OK.
1549 if (!instr->hydrogen()->CheckFlag(HValue::kLeftCanBeMinInt)) { 1558 if (!instr->hydrogen()->CheckFlag(HValue::kLeftCanBeMinInt)) {
1550 __ sar(dividend, shift); 1559 __ sar(dividend, shift);
1551 return; 1560 return;
1552 } 1561 }
1553 1562
1554 // Dividing by -1 is basically negation, unless we overflow.
1555 if (divisor == -1) {
1556 DeoptimizeIf(overflow, instr->environment());
1557 return;
1558 }
1559
1560 Label not_kmin_int, done; 1563 Label not_kmin_int, done;
1561 __ j(no_overflow, &not_kmin_int, Label::kNear); 1564 __ j(no_overflow, &not_kmin_int, Label::kNear);
1562 __ mov(dividend, Immediate(kMinInt / divisor)); 1565 __ mov(dividend, Immediate(kMinInt / divisor));
1563 __ jmp(&done, Label::kNear); 1566 __ jmp(&done, Label::kNear);
1564 __ bind(&not_kmin_int); 1567 __ bind(&not_kmin_int);
1565 __ sar(dividend, shift); 1568 __ sar(dividend, shift);
1566 __ bind(&done); 1569 __ bind(&done);
1567 } 1570 }
1568 1571
1569 1572
(...skipping 4125 matching lines...) Expand 10 before | Expand all | Expand 10 after
5695 CallRuntime(Runtime::kHiddenPushBlockContext, 2, instr); 5698 CallRuntime(Runtime::kHiddenPushBlockContext, 2, instr);
5696 RecordSafepoint(Safepoint::kNoLazyDeopt); 5699 RecordSafepoint(Safepoint::kNoLazyDeopt);
5697 } 5700 }
5698 5701
5699 5702
5700 #undef __ 5703 #undef __
5701 5704
5702 } } // namespace v8::internal 5705 } } // namespace v8::internal
5703 5706
5704 #endif // V8_TARGET_ARCH_X87 5707 #endif // V8_TARGET_ARCH_X87
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698