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

Side by Side Diff: src/ia32/stub-cache-ia32.cc

Issue 7039004: Add enumeration to specify if smi check needed (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: move to common header Created 9 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 | Annotate | Revision Log
« no previous file with comments | « src/ia32/macro-assembler-ia32.cc ('k') | src/v8globals.h » ('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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 1906 matching lines...) Expand 10 before | Expand all | Expand 10 after
1917 __ mov(eax, Operand(esp, 1 * kPointerSize)); 1917 __ mov(eax, Operand(esp, 1 * kPointerSize));
1918 1918
1919 // Check if the argument is a smi. 1919 // Check if the argument is a smi.
1920 Label smi; 1920 Label smi;
1921 STATIC_ASSERT(kSmiTag == 0); 1921 STATIC_ASSERT(kSmiTag == 0);
1922 __ test(eax, Immediate(kSmiTagMask)); 1922 __ test(eax, Immediate(kSmiTagMask));
1923 __ j(zero, &smi); 1923 __ j(zero, &smi);
1924 1924
1925 // Check if the argument is a heap number and load its value into xmm0. 1925 // Check if the argument is a heap number and load its value into xmm0.
1926 Label slow; 1926 Label slow;
1927 __ CheckMap(eax, factory()->heap_number_map(), &slow, true); 1927 __ CheckMap(eax, factory()->heap_number_map(), &slow, DONT_DO_SMI_CHECK);
1928 __ movdbl(xmm0, FieldOperand(eax, HeapNumber::kValueOffset)); 1928 __ movdbl(xmm0, FieldOperand(eax, HeapNumber::kValueOffset));
1929 1929
1930 // Check if the argument is strictly positive. Note this also 1930 // Check if the argument is strictly positive. Note this also
1931 // discards NaN. 1931 // discards NaN.
1932 __ xorpd(xmm1, xmm1); 1932 __ xorpd(xmm1, xmm1);
1933 __ ucomisd(xmm0, xmm1); 1933 __ ucomisd(xmm0, xmm1);
1934 __ j(below_equal, &slow); 1934 __ j(below_equal, &slow);
1935 1935
1936 // Do a truncating conversion. 1936 // Do a truncating conversion.
1937 __ cvttsd2si(eax, Operand(xmm0)); 1937 __ cvttsd2si(eax, Operand(xmm0));
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
2061 // This only happens for the most negative smi. 2061 // This only happens for the most negative smi.
2062 Label slow; 2062 Label slow;
2063 __ j(negative, &slow); 2063 __ j(negative, &slow);
2064 2064
2065 // Smi case done. 2065 // Smi case done.
2066 __ ret(2 * kPointerSize); 2066 __ ret(2 * kPointerSize);
2067 2067
2068 // Check if the argument is a heap number and load its exponent and 2068 // Check if the argument is a heap number and load its exponent and
2069 // sign into ebx. 2069 // sign into ebx.
2070 __ bind(&not_smi); 2070 __ bind(&not_smi);
2071 __ CheckMap(eax, factory()->heap_number_map(), &slow, true); 2071 __ CheckMap(eax, factory()->heap_number_map(), &slow, DONT_DO_SMI_CHECK);
2072 __ mov(ebx, FieldOperand(eax, HeapNumber::kExponentOffset)); 2072 __ mov(ebx, FieldOperand(eax, HeapNumber::kExponentOffset));
2073 2073
2074 // Check the sign of the argument. If the argument is positive, 2074 // Check the sign of the argument. If the argument is positive,
2075 // just return it. 2075 // just return it.
2076 Label negative_sign; 2076 Label negative_sign;
2077 __ test(ebx, Immediate(HeapNumber::kSignMask)); 2077 __ test(ebx, Immediate(HeapNumber::kSignMask));
2078 __ j(not_zero, &negative_sign); 2078 __ j(not_zero, &negative_sign);
2079 __ ret(2 * kPointerSize); 2079 __ ret(2 * kPointerSize);
2080 2080
2081 // If the argument is negative, clear the sign, and return a new 2081 // If the argument is negative, clear the sign, and return a new
(...skipping 1233 matching lines...) Expand 10 before | Expand all | Expand 10 after
3315 3315
3316 // Check that the object isn't a smi. 3316 // Check that the object isn't a smi.
3317 __ test(edx, Immediate(kSmiTagMask)); 3317 __ test(edx, Immediate(kSmiTagMask));
3318 __ j(zero, &slow); 3318 __ j(zero, &slow);
3319 3319
3320 // Check that the key is a smi. 3320 // Check that the key is a smi.
3321 __ test(eax, Immediate(kSmiTagMask)); 3321 __ test(eax, Immediate(kSmiTagMask));
3322 __ j(not_zero, &slow); 3322 __ j(not_zero, &slow);
3323 3323
3324 // Check that the map matches. 3324 // Check that the map matches.
3325 __ CheckMap(edx, Handle<Map>(receiver->map()), &slow, false); 3325 __ CheckMap(edx, Handle<Map>(receiver->map()), &slow, DO_SMI_CHECK);
3326 __ mov(ebx, FieldOperand(edx, JSObject::kElementsOffset)); 3326 __ mov(ebx, FieldOperand(edx, JSObject::kElementsOffset));
3327 3327
3328 // eax: key, known to be a smi. 3328 // eax: key, known to be a smi.
3329 // edx: receiver, known to be a JSObject. 3329 // edx: receiver, known to be a JSObject.
3330 // ebx: elements object, known to be an external array. 3330 // ebx: elements object, known to be an external array.
3331 // Check that the index is in range. 3331 // Check that the index is in range.
3332 __ mov(ecx, eax); 3332 __ mov(ecx, eax);
3333 __ SmiUntag(ecx); // Untag the index. 3333 __ SmiUntag(ecx); // Untag the index.
3334 __ cmp(ecx, FieldOperand(ebx, ExternalArray::kLengthOffset)); 3334 __ cmp(ecx, FieldOperand(ebx, ExternalArray::kLengthOffset));
3335 // Unsigned comparison catches both negative and too-large values. 3335 // Unsigned comparison catches both negative and too-large values.
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
3469 // -- edx : receiver 3469 // -- edx : receiver
3470 // -- esp[0] : return address 3470 // -- esp[0] : return address
3471 // ----------------------------------- 3471 // -----------------------------------
3472 Label slow, check_heap_number; 3472 Label slow, check_heap_number;
3473 3473
3474 // Check that the object isn't a smi. 3474 // Check that the object isn't a smi.
3475 __ test(edx, Immediate(kSmiTagMask)); 3475 __ test(edx, Immediate(kSmiTagMask));
3476 __ j(zero, &slow); 3476 __ j(zero, &slow);
3477 3477
3478 // Check that the map matches. 3478 // Check that the map matches.
3479 __ CheckMap(edx, Handle<Map>(receiver->map()), &slow, false); 3479 __ CheckMap(edx, Handle<Map>(receiver->map()), &slow, DO_SMI_CHECK);
3480 3480
3481 // Check that the key is a smi. 3481 // Check that the key is a smi.
3482 __ test(ecx, Immediate(kSmiTagMask)); 3482 __ test(ecx, Immediate(kSmiTagMask));
3483 __ j(not_zero, &slow); 3483 __ j(not_zero, &slow);
3484 3484
3485 // Check that the index is in range. 3485 // Check that the index is in range.
3486 __ mov(edi, FieldOperand(edx, JSObject::kElementsOffset)); 3486 __ mov(edi, FieldOperand(edx, JSObject::kElementsOffset));
3487 __ mov(ebx, ecx); 3487 __ mov(ebx, ecx);
3488 __ SmiUntag(ebx); 3488 __ SmiUntag(ebx);
3489 __ cmp(ebx, FieldOperand(edi, ExternalArray::kLengthOffset)); 3489 __ cmp(ebx, FieldOperand(edi, ExternalArray::kLengthOffset));
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
3675 3675
3676 return GetCode(flags); 3676 return GetCode(flags);
3677 } 3677 }
3678 3678
3679 3679
3680 #undef __ 3680 #undef __
3681 3681
3682 } } // namespace v8::internal 3682 } } // namespace v8::internal
3683 3683
3684 #endif // V8_TARGET_ARCH_IA32 3684 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/ia32/macro-assembler-ia32.cc ('k') | src/v8globals.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698