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

Side by Side Diff: src/x64/codegen-x64.cc

Issue 2032001: X64: Skip smi-test on GenericBinaryOpStub if static type test says we have smis. (Closed)
Patch Set: Created 10 years, 7 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
« 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 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 9842 matching lines...) Expand 10 before | Expand all | Expand 10 after
9853 if (HasArgsInRegisters()) { 9853 if (HasArgsInRegisters()) {
9854 __ movq(rbx, rax); 9854 __ movq(rbx, rax);
9855 __ movq(rax, rdx); 9855 __ movq(rax, rdx);
9856 } 9856 }
9857 } 9857 }
9858 if (!HasArgsInRegisters()) { 9858 if (!HasArgsInRegisters()) {
9859 __ movq(right, Operand(rsp, 1 * kPointerSize)); 9859 __ movq(right, Operand(rsp, 1 * kPointerSize));
9860 __ movq(left, Operand(rsp, 2 * kPointerSize)); 9860 __ movq(left, Operand(rsp, 2 * kPointerSize));
9861 } 9861 }
9862 9862
9863 // 2. Smi check both operands. Skip the check for OR as it is better combined
9864 // with the actual operation.
9865 Label not_smis; 9863 Label not_smis;
9866 if (op_ != Token::BIT_OR) { 9864 // 2. Smi check both operands.
9867 Comment smi_check_comment(masm, "-- Smi check arguments"); 9865 if (static_operands_type_.IsSmi()) {
9868 __ JumpIfNotBothSmi(left, right, &not_smis); 9866 // Skip smi check if we know that both arguments are smis.
9867 if (FLAG_debug_code) {
9868 __ AbortIfNotSmi(left, "Static type check claimed non-smi is smi.");
9869 __ AbortIfNotSmi(right, "Static type check claimed non-smi is smi.");
9870 }
9871 if (op_ == Token::BIT_OR) {
9872 // Handle OR here, since we do extra smi-checking in the or code below.
9873 __ SmiOr(right, right, left);
9874 GenerateReturn(masm);
9875 return;
9876 }
9877 } else {
9878 if (op_ != Token::BIT_OR) {
9879 // Skip the check for OR as it is better combined with the
9880 // actual operation.
9881 Comment smi_check_comment(masm, "-- Smi check arguments");
9882 __ JumpIfNotBothSmi(left, right, &not_smis);
9883 }
9869 } 9884 }
9870 9885
9871 // 3. Operands are both smis (except for OR), perform the operation leaving 9886 // 3. Operands are both smis (except for OR), perform the operation leaving
9872 // the result in rax and check the result if necessary. 9887 // the result in rax and check the result if necessary.
9873 Comment perform_smi(masm, "-- Perform smi operation"); 9888 Comment perform_smi(masm, "-- Perform smi operation");
9874 Label use_fp_on_smis; 9889 Label use_fp_on_smis;
9875 switch (op_) { 9890 switch (op_) {
9876 case Token::ADD: { 9891 case Token::ADD: {
9877 ASSERT(right.is(rax)); 9892 ASSERT(right.is(rax));
9878 __ SmiAdd(right, right, left, &use_fp_on_smis); // ADD is commutative. 9893 __ SmiAdd(right, right, left, &use_fp_on_smis); // ADD is commutative.
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
9946 GenerateReturn(masm); 9961 GenerateReturn(masm);
9947 9962
9948 // 5. For some operations emit inline code to perform floating point 9963 // 5. For some operations emit inline code to perform floating point
9949 // operations on known smis (e.g., if the result of the operation 9964 // operations on known smis (e.g., if the result of the operation
9950 // overflowed the smi range). 9965 // overflowed the smi range).
9951 switch (op_) { 9966 switch (op_) {
9952 case Token::ADD: 9967 case Token::ADD:
9953 case Token::SUB: 9968 case Token::SUB:
9954 case Token::MUL: 9969 case Token::MUL:
9955 case Token::DIV: { 9970 case Token::DIV: {
9971 ASSERT(use_fp_on_smis.is_linked());
9956 __ bind(&use_fp_on_smis); 9972 __ bind(&use_fp_on_smis);
9957 if (op_ == Token::DIV) { 9973 if (op_ == Token::DIV) {
9958 __ movq(rdx, rax); 9974 __ movq(rdx, rax);
9959 __ movq(rax, rbx); 9975 __ movq(rax, rbx);
9960 } 9976 }
9961 // left is rdx, right is rax. 9977 // left is rdx, right is rax.
9962 __ AllocateHeapNumber(rbx, rcx, slow); 9978 __ AllocateHeapNumber(rbx, rcx, slow);
9963 FloatingPointHelper::LoadFloatOperandsFromSmis(masm, xmm4, xmm5); 9979 FloatingPointHelper::LoadFloatOperandsFromSmis(masm, xmm4, xmm5);
9964 switch (op_) { 9980 switch (op_) {
9965 case Token::ADD: __ addsd(xmm4, xmm5); break; 9981 case Token::ADD: __ addsd(xmm4, xmm5); break;
(...skipping 1451 matching lines...) Expand 10 before | Expand all | Expand 10 after
11417 // Call the function from C++. 11433 // Call the function from C++.
11418 return FUNCTION_CAST<ModuloFunction>(buffer); 11434 return FUNCTION_CAST<ModuloFunction>(buffer);
11419 } 11435 }
11420 11436
11421 #endif 11437 #endif
11422 11438
11423 11439
11424 #undef __ 11440 #undef __
11425 11441
11426 } } // namespace v8::internal 11442 } } // namespace v8::internal
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