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

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

Issue 3388005: Make the CompareStub and the UnaryOpStub accept smi inputs.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: x64 and ARM port Created 10 years, 3 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
« src/flag-definitions.h ('K') | « src/x64/codegen-x64.cc ('k') | 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 659 matching lines...) Expand 10 before | Expand all | Expand 10 after
670 } 670 }
671 671
672 Comment cmnt(masm_, "[ Case comparison"); 672 Comment cmnt(masm_, "[ Case comparison");
673 __ bind(&next_test); 673 __ bind(&next_test);
674 next_test.Unuse(); 674 next_test.Unuse();
675 675
676 // Compile the label expression. 676 // Compile the label expression.
677 VisitForValue(clause->label(), kAccumulator); 677 VisitForValue(clause->label(), kAccumulator);
678 678
679 // Perform the comparison as if via '==='. 679 // Perform the comparison as if via '==='.
680 if (ShouldInlineSmiCase(Token::EQ_STRICT)) { 680 __ movq(rdx, Operand(rsp, 0)); // Switch value.
681 bool inline_smi_code = ShouldInlineSmiCase(Token::EQ_STRICT);
682 if (inline_smi_code) {
681 Label slow_case; 683 Label slow_case;
682 __ movq(rdx, Operand(rsp, 0)); // Switch value.
683 __ JumpIfNotBothSmi(rdx, rax, &slow_case); 684 __ JumpIfNotBothSmi(rdx, rax, &slow_case);
684 __ SmiCompare(rdx, rax); 685 __ SmiCompare(rdx, rax);
685 __ j(not_equal, &next_test); 686 __ j(not_equal, &next_test);
686 __ Drop(1); // Switch value is no longer needed. 687 __ Drop(1); // Switch value is no longer needed.
687 __ jmp(clause->body_target()->entry_label()); 688 __ jmp(clause->body_target()->entry_label());
688 __ bind(&slow_case); 689 __ bind(&slow_case);
689 } 690 }
690 691
691 CompareStub stub(equal, true); 692 CompareFlags flags = inline_smi_code
693 ? NO_SMI_COMPARE_IN_STUB
694 : NO_COMPARE_FLAGS;
695 CompareStub stub(equal, true, flags);
692 __ CallStub(&stub); 696 __ CallStub(&stub);
693 __ testq(rax, rax); 697 __ testq(rax, rax);
694 __ j(not_equal, &next_test); 698 __ j(not_equal, &next_test);
695 __ Drop(1); // Switch value is no longer needed. 699 __ Drop(1); // Switch value is no longer needed.
696 __ jmp(clause->body_target()->entry_label()); 700 __ jmp(clause->body_target()->entry_label());
697 } 701 }
698 702
699 // Discard the test value and jump to the default if present, otherwise to 703 // Discard the test value and jump to the default if present, otherwise to
700 // the end of the statement. 704 // the end of the statement.
701 __ bind(&next_test); 705 __ bind(&next_test);
(...skipping 2245 matching lines...) Expand 10 before | Expand all | Expand 10 after
2947 __ bind(&no_conversion); 2951 __ bind(&no_conversion);
2948 Apply(context_, result_register()); 2952 Apply(context_, result_register());
2949 break; 2953 break;
2950 } 2954 }
2951 2955
2952 case Token::SUB: { 2956 case Token::SUB: {
2953 Comment cmt(masm_, "[ UnaryOperation (SUB)"); 2957 Comment cmt(masm_, "[ UnaryOperation (SUB)");
2954 bool can_overwrite = expr->expression()->ResultOverwriteAllowed(); 2958 bool can_overwrite = expr->expression()->ResultOverwriteAllowed();
2955 UnaryOverwriteMode overwrite = 2959 UnaryOverwriteMode overwrite =
2956 can_overwrite ? UNARY_OVERWRITE : UNARY_NO_OVERWRITE; 2960 can_overwrite ? UNARY_OVERWRITE : UNARY_NO_OVERWRITE;
2957 GenericUnaryOpStub stub(Token::SUB, overwrite); 2961 GenericUnaryOpStub stub(Token::SUB, overwrite, NO_UNARY_FLAGS);
2958 // GenericUnaryOpStub expects the argument to be in the 2962 // GenericUnaryOpStub expects the argument to be in the
2959 // accumulator register rax. 2963 // accumulator register rax.
2960 VisitForValue(expr->expression(), kAccumulator); 2964 VisitForValue(expr->expression(), kAccumulator);
2961 __ CallStub(&stub); 2965 __ CallStub(&stub);
2962 Apply(context_, rax); 2966 Apply(context_, rax);
2963 break; 2967 break;
2964 } 2968 }
2965 2969
2966 case Token::BIT_NOT: { 2970 case Token::BIT_NOT: {
2967 Comment cmt(masm_, "[ UnaryOperation (BIT_NOT)"); 2971 Comment cmt(masm_, "[ UnaryOperation (BIT_NOT)");
2968 // The generic unary operation stub expects the argument to be 2972 // The generic unary operation stub expects the argument to be
2969 // in the accumulator register rax. 2973 // in the accumulator register rax.
2970 VisitForValue(expr->expression(), kAccumulator); 2974 VisitForValue(expr->expression(), kAccumulator);
2971 Label done; 2975 Label done;
2972 if (ShouldInlineSmiCase(expr->op())) { 2976 bool inline_smi_case = ShouldInlineSmiCase(expr->op());
2977 if (inline_smi_case) {
2973 Label call_stub; 2978 Label call_stub;
2974 __ JumpIfNotSmi(rax, &call_stub); 2979 __ JumpIfNotSmi(rax, &call_stub);
2975 __ SmiNot(rax, rax); 2980 __ SmiNot(rax, rax);
2976 __ jmp(&done); 2981 __ jmp(&done);
2977 __ bind(&call_stub); 2982 __ bind(&call_stub);
2978 } 2983 }
2979 bool overwrite = expr->expression()->ResultOverwriteAllowed(); 2984 bool overwrite = expr->expression()->ResultOverwriteAllowed();
2980 UnaryOverwriteMode mode = 2985 UnaryOverwriteMode mode =
2981 overwrite ? UNARY_OVERWRITE : UNARY_NO_OVERWRITE; 2986 overwrite ? UNARY_OVERWRITE : UNARY_NO_OVERWRITE;
2982 GenericUnaryOpStub stub(Token::BIT_NOT, mode); 2987 UnaryOpFlags flags = inline_smi_case
2988 ? NO_UNARY_SMI_CODE_IN_STUB
2989 : NO_UNARY_FLAGS;
2990 GenericUnaryOpStub stub(Token::BIT_NOT, mode, flags);
2983 __ CallStub(&stub); 2991 __ CallStub(&stub);
2984 __ bind(&done); 2992 __ bind(&done);
2985 Apply(context_, rax); 2993 Apply(context_, rax);
2986 break; 2994 break;
2987 } 2995 }
2988 2996
2989 default: 2997 default:
2990 UNREACHABLE(); 2998 UNREACHABLE();
2991 } 2999 }
2992 } 3000 }
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
3354 case Token::GTE: 3362 case Token::GTE:
3355 cc = greater_equal; 3363 cc = greater_equal;
3356 __ pop(rdx); 3364 __ pop(rdx);
3357 break; 3365 break;
3358 case Token::IN: 3366 case Token::IN:
3359 case Token::INSTANCEOF: 3367 case Token::INSTANCEOF:
3360 default: 3368 default:
3361 UNREACHABLE(); 3369 UNREACHABLE();
3362 } 3370 }
3363 3371
3364 if (ShouldInlineSmiCase(op)) { 3372 bool inline_smi_code = ShouldInlineSmiCase(op);
3373 if (inline_smi_code) {
3365 Label slow_case; 3374 Label slow_case;
3366 __ JumpIfNotBothSmi(rax, rdx, &slow_case); 3375 __ JumpIfNotBothSmi(rax, rdx, &slow_case);
3367 __ SmiCompare(rdx, rax); 3376 __ SmiCompare(rdx, rax);
3368 Split(cc, if_true, if_false, NULL); 3377 Split(cc, if_true, if_false, NULL);
3369 __ bind(&slow_case); 3378 __ bind(&slow_case);
3370 } 3379 }
3371 3380
3372 CompareStub stub(cc, strict); 3381 CompareFlags flags = inline_smi_code
3382 ? NO_SMI_COMPARE_IN_STUB
3383 : NO_COMPARE_FLAGS;
3384 CompareStub stub(cc, strict, flags);
3373 __ CallStub(&stub); 3385 __ CallStub(&stub);
3374 __ testq(rax, rax); 3386 __ testq(rax, rax);
3375 Split(cc, if_true, if_false, fall_through); 3387 Split(cc, if_true, if_false, fall_through);
3376 } 3388 }
3377 } 3389 }
3378 3390
3379 // Convert the result of the comparison into one expected for this 3391 // Convert the result of the comparison into one expected for this
3380 // expression's context. 3392 // expression's context.
3381 Apply(context_, if_true, if_false); 3393 Apply(context_, if_true, if_false);
3382 } 3394 }
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
3467 __ ret(0); 3479 __ ret(0);
3468 } 3480 }
3469 3481
3470 3482
3471 #undef __ 3483 #undef __
3472 3484
3473 3485
3474 } } // namespace v8::internal 3486 } } // namespace v8::internal
3475 3487
3476 #endif // V8_TARGET_ARCH_X64 3488 #endif // V8_TARGET_ARCH_X64
OLDNEW
« src/flag-definitions.h ('K') | « src/x64/codegen-x64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698