Reviewers: William Hesse,
Description:
X64: Skip smi-test on GenericBinaryOpStub if static type test says we have
smis.
Please review this at http://codereview.chromium.org/2032001/show
Affected files:
M src/x64/codegen-x64.cc
Index: src/x64/codegen-x64.cc
diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc
index
39f543df560cd9cdac25d75a9d5fa19ffc948bed..8c96bc739f7d2747c7639104e6d1a6b155fe0320
100644
--- a/src/x64/codegen-x64.cc
+++ b/src/x64/codegen-x64.cc
@@ -9860,12 +9860,27 @@ void
GenericBinaryOpStub::GenerateSmiCode(MacroAssembler* masm, Label* slow) {
__ movq(left, Operand(rsp, 2 * kPointerSize));
}
- // 2. Smi check both operands. Skip the check for OR as it is better
combined
- // with the actual operation.
Label not_smis;
- if (op_ != Token::BIT_OR) {
- Comment smi_check_comment(masm, "-- Smi check arguments");
- __ JumpIfNotBothSmi(left, right, ¬_smis);
+ // 2. Smi check both operands.
+ if (static_operands_type_.IsSmi()) {
+ // Skip smi check if we know that both arguments are smis.
+ if (FLAG_debug_code) {
+ __ AbortIfNotSmi(left, "Static type check claimed non-smi is smi.");
+ __ AbortIfNotSmi(right, "Static type check claimed non-smi is smi.");
+ }
+ if (op_ == Token::BIT_OR) {
+ // Handle OR here, since we do extra smi-checking in the or code
below.
+ __ SmiOr(right, right, left);
+ GenerateReturn(masm);
+ return;
+ }
+ } else {
+ if (op_ != Token::BIT_OR) {
+ // Skip the check for OR as it is better combined with the
+ // actual operation.
+ Comment smi_check_comment(masm, "-- Smi check arguments");
+ __ JumpIfNotBothSmi(left, right, ¬_smis);
+ }
}
// 3. Operands are both smis (except for OR), perform the operation
leaving
@@ -9953,6 +9968,7 @@ void
GenericBinaryOpStub::GenerateSmiCode(MacroAssembler* masm, Label* slow) {
case Token::SUB:
case Token::MUL:
case Token::DIV: {
+ ASSERT(use_fp_on_smis.is_linked());
__ bind(&use_fp_on_smis);
if (op_ == Token::DIV) {
__ movq(rdx, rax);
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev