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

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

Issue 795003: Version 2.1.2.7... (Closed) Base URL: http://v8.googlecode.com/svn/trunk/
Patch Set: Created 10 years, 9 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 | « src/heap.cc ('k') | src/version.cc » ('j') | 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 7944 matching lines...) Expand 10 before | Expand all | Expand 10 after
7955 __ push(edx); 7955 __ push(edx);
7956 __ push(eax); 7956 __ push(eax);
7957 } 7957 }
7958 __ push(ecx); 7958 __ push(ecx);
7959 } 7959 }
7960 switch (op_) { 7960 switch (op_) {
7961 case Token::ADD: { 7961 case Token::ADD: {
7962 // Test for string arguments before calling runtime. 7962 // Test for string arguments before calling runtime.
7963 Label not_strings, not_string1, string1, string1_smi2; 7963 Label not_strings, not_string1, string1, string1_smi2;
7964 Result answer; 7964 Result answer;
7965 __ test(edx, Immediate(kSmiTagMask)); 7965 // Registers containing left and right operands respectively.
7966 Register lhs, rhs;
7967 if (HasArgsReversed()) {
7968 lhs = eax;
7969 rhs = edx;
7970 } else {
7971 lhs = edx;
7972 rhs = eax;
7973 }
7974
7975 // Test if first argument is a string.
7976 __ test(lhs, Immediate(kSmiTagMask));
7966 __ j(zero, &not_string1); 7977 __ j(zero, &not_string1);
7967 __ CmpObjectType(edx, FIRST_NONSTRING_TYPE, ecx); 7978 __ CmpObjectType(lhs, FIRST_NONSTRING_TYPE, ecx);
7968 __ j(above_equal, &not_string1); 7979 __ j(above_equal, &not_string1);
7969 7980
7970 // First argument is a string, test second. 7981 // First argument is a string, test second.
7971 __ test(eax, Immediate(kSmiTagMask)); 7982 __ test(rhs, Immediate(kSmiTagMask));
7972 __ j(zero, &string1_smi2); 7983 __ j(zero, &string1_smi2);
7973 __ CmpObjectType(eax, FIRST_NONSTRING_TYPE, ecx); 7984 __ CmpObjectType(rhs, FIRST_NONSTRING_TYPE, ecx);
7974 __ j(above_equal, &string1); 7985 __ j(above_equal, &string1);
7975 7986
7976 // First and second argument are strings. Jump to the string add stub. 7987 // First and second argument are strings. Jump to the string add stub.
7977 StringAddStub string_add_stub(NO_STRING_CHECK_IN_STUB); 7988 StringAddStub string_add_stub(NO_STRING_CHECK_IN_STUB);
7978 __ TailCallStub(&string_add_stub); 7989 __ TailCallStub(&string_add_stub);
7979 7990
7980 __ bind(&string1_smi2); 7991 __ bind(&string1_smi2);
7981 // First argument is a string, second is a smi. Try to lookup the number 7992 // First argument is a string, second is a smi. Try to lookup the number
7982 // string for the smi in the number string cache. 7993 // string for the smi in the number string cache.
7983 NumberToStringStub::GenerateLookupNumberStringCache( 7994 NumberToStringStub::GenerateLookupNumberStringCache(
7984 masm, eax, edi, ebx, ecx, true, &string1); 7995 masm, rhs, edi, ebx, ecx, true, &string1);
7985 7996
7986 // Call the string add stub to make the result. 7997 // Replace second argument on stack and tailcall string add stub to make
7987 __ EnterInternalFrame(); 7998 // the result.
7988 __ push(edx); // Original first argument. 7999 __ mov(Operand(esp, 1 * kPointerSize), edi);
7989 __ push(edi); // Number to string result for second argument. 8000 __ TailCallStub(&string_add_stub);
7990 __ CallStub(&string_add_stub);
7991 __ LeaveInternalFrame();
7992 __ ret(2 * kPointerSize);
7993 8001
8002 // Only first argument is a string.
7994 __ bind(&string1); 8003 __ bind(&string1);
7995 __ InvokeBuiltin( 8004 __ InvokeBuiltin(Builtins::STRING_ADD_LEFT, JUMP_FUNCTION);
7996 HasArgsReversed() ?
7997 Builtins::STRING_ADD_RIGHT :
7998 Builtins::STRING_ADD_LEFT,
7999 JUMP_FUNCTION);
8000 8005
8001 // First argument was not a string, test second. 8006 // First argument was not a string, test second.
8002 __ bind(&not_string1); 8007 __ bind(&not_string1);
8003 __ test(eax, Immediate(kSmiTagMask)); 8008 __ test(rhs, Immediate(kSmiTagMask));
8004 __ j(zero, &not_strings); 8009 __ j(zero, &not_strings);
8005 __ CmpObjectType(eax, FIRST_NONSTRING_TYPE, ecx); 8010 __ CmpObjectType(rhs, FIRST_NONSTRING_TYPE, ecx);
8006 __ j(above_equal, &not_strings); 8011 __ j(above_equal, &not_strings);
8007 8012
8008 // Only second argument is a string. 8013 // Only second argument is a string.
8009 __ InvokeBuiltin( 8014 __ InvokeBuiltin(Builtins::STRING_ADD_RIGHT, JUMP_FUNCTION);
8010 HasArgsReversed() ?
8011 Builtins::STRING_ADD_LEFT :
8012 Builtins::STRING_ADD_RIGHT,
8013 JUMP_FUNCTION);
8014 8015
8015 __ bind(&not_strings); 8016 __ bind(&not_strings);
8016 // Neither argument is a string. 8017 // Neither argument is a string.
8017 __ InvokeBuiltin(Builtins::ADD, JUMP_FUNCTION); 8018 __ InvokeBuiltin(Builtins::ADD, JUMP_FUNCTION);
8018 break; 8019 break;
8019 } 8020 }
8020 case Token::SUB: 8021 case Token::SUB:
8021 __ InvokeBuiltin(Builtins::SUB, JUMP_FUNCTION); 8022 __ InvokeBuiltin(Builtins::SUB, JUMP_FUNCTION);
8022 break; 8023 break;
8023 case Token::MUL: 8024 case Token::MUL:
(...skipping 2767 matching lines...) Expand 10 before | Expand all | Expand 10 after
10791 10792
10792 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) 10793 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater)
10793 // tagged as a small integer. 10794 // tagged as a small integer.
10794 __ bind(&runtime); 10795 __ bind(&runtime);
10795 __ TailCallRuntime(ExternalReference(Runtime::kStringCompare), 2, 1); 10796 __ TailCallRuntime(ExternalReference(Runtime::kStringCompare), 2, 1);
10796 } 10797 }
10797 10798
10798 #undef __ 10799 #undef __
10799 10800
10800 } } // namespace v8::internal 10801 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/heap.cc ('k') | src/version.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698