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

Side by Side Diff: src/x64/code-stubs-x64.cc

Issue 565873002: Removing ic.h from code-stubs.h (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: REBASE and mips. Created 6 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
« no previous file with comments | « src/type-info.cc ('k') | src/x64/full-codegen-x64.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 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_X64 7 #if V8_TARGET_ARCH_X64
8 8
9 #include "src/bootstrapper.h" 9 #include "src/bootstrapper.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
11 #include "src/codegen.h" 11 #include "src/codegen.h"
12 #include "src/ic/handler-compiler.h" 12 #include "src/ic/handler-compiler.h"
13 #include "src/ic/ic.h"
13 #include "src/isolate.h" 14 #include "src/isolate.h"
14 #include "src/jsregexp.h" 15 #include "src/jsregexp.h"
15 #include "src/regexp-macro-assembler.h" 16 #include "src/regexp-macro-assembler.h"
16 #include "src/runtime.h" 17 #include "src/runtime.h"
17 18
18 namespace v8 { 19 namespace v8 {
19 namespace internal { 20 namespace internal {
20 21
21 22
22 static void InitializeArrayConstructorDescriptor( 23 static void InitializeArrayConstructorDescriptor(
(...skipping 1359 matching lines...) Expand 10 before | Expand all | Expand 10 after
1382 1383
1383 1384
1384 static int NegativeComparisonResult(Condition cc) { 1385 static int NegativeComparisonResult(Condition cc) {
1385 DCHECK(cc != equal); 1386 DCHECK(cc != equal);
1386 DCHECK((cc == less) || (cc == less_equal) 1387 DCHECK((cc == less) || (cc == less_equal)
1387 || (cc == greater) || (cc == greater_equal)); 1388 || (cc == greater) || (cc == greater_equal));
1388 return (cc == greater || cc == greater_equal) ? LESS : GREATER; 1389 return (cc == greater || cc == greater_equal) ? LESS : GREATER;
1389 } 1390 }
1390 1391
1391 1392
1392 static void CheckInputType(MacroAssembler* masm, 1393 static void CheckInputType(MacroAssembler* masm, Register input,
1393 Register input, 1394 CompareICState::State expected, Label* fail) {
1394 CompareIC::State expected,
1395 Label* fail) {
1396 Label ok; 1395 Label ok;
1397 if (expected == CompareIC::SMI) { 1396 if (expected == CompareICState::SMI) {
1398 __ JumpIfNotSmi(input, fail); 1397 __ JumpIfNotSmi(input, fail);
1399 } else if (expected == CompareIC::NUMBER) { 1398 } else if (expected == CompareICState::NUMBER) {
1400 __ JumpIfSmi(input, &ok); 1399 __ JumpIfSmi(input, &ok);
1401 __ CompareMap(input, masm->isolate()->factory()->heap_number_map()); 1400 __ CompareMap(input, masm->isolate()->factory()->heap_number_map());
1402 __ j(not_equal, fail); 1401 __ j(not_equal, fail);
1403 } 1402 }
1404 // We could be strict about internalized/non-internalized here, but as long as 1403 // We could be strict about internalized/non-internalized here, but as long as
1405 // hydrogen doesn't care, the stub doesn't have to care either. 1404 // hydrogen doesn't care, the stub doesn't have to care either.
1406 __ bind(&ok); 1405 __ bind(&ok);
1407 } 1406 }
1408 1407
1409 1408
(...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after
2003 Factory* factory = masm->isolate()->factory(); 2002 Factory* factory = masm->isolate()->factory();
2004 __ Cmp(FieldOperand(rcx, HeapObject::kMapOffset), 2003 __ Cmp(FieldOperand(rcx, HeapObject::kMapOffset),
2005 factory->allocation_site_map()); 2004 factory->allocation_site_map());
2006 __ j(not_equal, &miss); 2005 __ j(not_equal, &miss);
2007 2006
2008 __ movp(rbx, rcx); 2007 __ movp(rbx, rcx);
2009 ArrayConstructorStub stub(masm->isolate(), arg_count()); 2008 ArrayConstructorStub stub(masm->isolate(), arg_count());
2010 __ TailCallStub(&stub); 2009 __ TailCallStub(&stub);
2011 2010
2012 __ bind(&miss); 2011 __ bind(&miss);
2013 GenerateMiss(masm, IC::kCallIC_Customization_Miss); 2012 GenerateMiss(masm);
2014 2013
2015 // The slow case, we need this no matter what to complete a call after a miss. 2014 // The slow case, we need this no matter what to complete a call after a miss.
2016 CallFunctionNoFeedback(masm, 2015 CallFunctionNoFeedback(masm,
2017 arg_count(), 2016 arg_count(),
2018 true, 2017 true,
2019 CallAsMethod()); 2018 CallAsMethod());
2020 2019
2021 // Unreachable. 2020 // Unreachable.
2022 __ int3(); 2021 __ int3();
2023 } 2022 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
2084 __ CmpObjectType(rcx, JS_FUNCTION_TYPE, rcx); 2083 __ CmpObjectType(rcx, JS_FUNCTION_TYPE, rcx);
2085 __ j(not_equal, &miss); 2084 __ j(not_equal, &miss);
2086 __ Move(FieldOperand(rbx, rdx, times_pointer_size, 2085 __ Move(FieldOperand(rbx, rdx, times_pointer_size,
2087 FixedArray::kHeaderSize), 2086 FixedArray::kHeaderSize),
2088 TypeFeedbackInfo::MegamorphicSentinel(isolate)); 2087 TypeFeedbackInfo::MegamorphicSentinel(isolate));
2089 __ jmp(&slow_start); 2088 __ jmp(&slow_start);
2090 } 2089 }
2091 2090
2092 // We are here because tracing is on or we are going monomorphic. 2091 // We are here because tracing is on or we are going monomorphic.
2093 __ bind(&miss); 2092 __ bind(&miss);
2094 GenerateMiss(masm, IC::kCallIC_Miss); 2093 GenerateMiss(masm);
2095 2094
2096 // the slow case 2095 // the slow case
2097 __ bind(&slow_start); 2096 __ bind(&slow_start);
2098 // Check that function is not a smi. 2097 // Check that function is not a smi.
2099 __ JumpIfSmi(rdi, &non_function); 2098 __ JumpIfSmi(rdi, &non_function);
2100 // Check that function is a JSFunction. 2099 // Check that function is a JSFunction.
2101 __ CmpObjectType(rdi, JS_FUNCTION_TYPE, rcx); 2100 __ CmpObjectType(rdi, JS_FUNCTION_TYPE, rcx);
2102 __ j(not_equal, &slow); 2101 __ j(not_equal, &slow);
2103 __ jmp(&have_js_function); 2102 __ jmp(&have_js_function);
2104 2103
2105 // Unreachable 2104 // Unreachable
2106 __ int3(); 2105 __ int3();
2107 } 2106 }
2108 2107
2109 2108
2110 void CallICStub::GenerateMiss(MacroAssembler* masm, IC::UtilityId id) { 2109 void CallICStub::GenerateMiss(MacroAssembler* masm) {
2111 // Get the receiver of the function from the stack; 1 ~ return address. 2110 // Get the receiver of the function from the stack; 1 ~ return address.
2112 __ movp(rcx, Operand(rsp, (arg_count() + 1) * kPointerSize)); 2111 __ movp(rcx, Operand(rsp, (arg_count() + 1) * kPointerSize));
2113 2112
2114 { 2113 {
2115 FrameScope scope(masm, StackFrame::INTERNAL); 2114 FrameScope scope(masm, StackFrame::INTERNAL);
2116 2115
2117 // Push the receiver and the function and feedback info. 2116 // Push the receiver and the function and feedback info.
2118 __ Push(rcx); 2117 __ Push(rcx);
2119 __ Push(rdi); 2118 __ Push(rdi);
2120 __ Push(rbx); 2119 __ Push(rbx);
2121 __ Integer32ToSmi(rdx, rdx); 2120 __ Integer32ToSmi(rdx, rdx);
2122 __ Push(rdx); 2121 __ Push(rdx);
2123 2122
2124 // Call the entry. 2123 // Call the entry.
2124 IC::UtilityId id = GetICState() == DEFAULT ? IC::kCallIC_Miss
2125 : IC::kCallIC_Customization_Miss;
2126
2125 ExternalReference miss = ExternalReference(IC_Utility(id), 2127 ExternalReference miss = ExternalReference(IC_Utility(id),
2126 masm->isolate()); 2128 masm->isolate());
2127 __ CallExternalReference(miss, 4); 2129 __ CallExternalReference(miss, 4);
2128 2130
2129 // Move result to edi and exit the internal frame. 2131 // Move result to edi and exit the internal frame.
2130 __ movp(rdi, rax); 2132 __ movp(rdi, rax);
2131 } 2133 }
2132 } 2134 }
2133 2135
2134 2136
(...skipping 1115 matching lines...) Expand 10 before | Expand all | Expand 10 after
3250 } 3252 }
3251 3253
3252 // Tail call into the stub that handles binary operations with allocation 3254 // Tail call into the stub that handles binary operations with allocation
3253 // sites. 3255 // sites.
3254 BinaryOpWithAllocationSiteStub stub(isolate(), state()); 3256 BinaryOpWithAllocationSiteStub stub(isolate(), state());
3255 __ TailCallStub(&stub); 3257 __ TailCallStub(&stub);
3256 } 3258 }
3257 3259
3258 3260
3259 void CompareICStub::GenerateSmis(MacroAssembler* masm) { 3261 void CompareICStub::GenerateSmis(MacroAssembler* masm) {
3260 DCHECK(state() == CompareIC::SMI); 3262 DCHECK(state() == CompareICState::SMI);
3261 Label miss; 3263 Label miss;
3262 __ JumpIfNotBothSmi(rdx, rax, &miss, Label::kNear); 3264 __ JumpIfNotBothSmi(rdx, rax, &miss, Label::kNear);
3263 3265
3264 if (GetCondition() == equal) { 3266 if (GetCondition() == equal) {
3265 // For equality we do not care about the sign of the result. 3267 // For equality we do not care about the sign of the result.
3266 __ subp(rax, rdx); 3268 __ subp(rax, rdx);
3267 } else { 3269 } else {
3268 Label done; 3270 Label done;
3269 __ subp(rdx, rax); 3271 __ subp(rdx, rax);
3270 __ j(no_overflow, &done, Label::kNear); 3272 __ j(no_overflow, &done, Label::kNear);
3271 // Correct sign of result in case of overflow. 3273 // Correct sign of result in case of overflow.
3272 __ notp(rdx); 3274 __ notp(rdx);
3273 __ bind(&done); 3275 __ bind(&done);
3274 __ movp(rax, rdx); 3276 __ movp(rax, rdx);
3275 } 3277 }
3276 __ ret(0); 3278 __ ret(0);
3277 3279
3278 __ bind(&miss); 3280 __ bind(&miss);
3279 GenerateMiss(masm); 3281 GenerateMiss(masm);
3280 } 3282 }
3281 3283
3282 3284
3283 void CompareICStub::GenerateNumbers(MacroAssembler* masm) { 3285 void CompareICStub::GenerateNumbers(MacroAssembler* masm) {
3284 DCHECK(state() == CompareIC::NUMBER); 3286 DCHECK(state() == CompareICState::NUMBER);
3285 3287
3286 Label generic_stub; 3288 Label generic_stub;
3287 Label unordered, maybe_undefined1, maybe_undefined2; 3289 Label unordered, maybe_undefined1, maybe_undefined2;
3288 Label miss; 3290 Label miss;
3289 3291
3290 if (left() == CompareIC::SMI) { 3292 if (left() == CompareICState::SMI) {
3291 __ JumpIfNotSmi(rdx, &miss); 3293 __ JumpIfNotSmi(rdx, &miss);
3292 } 3294 }
3293 if (right() == CompareIC::SMI) { 3295 if (right() == CompareICState::SMI) {
3294 __ JumpIfNotSmi(rax, &miss); 3296 __ JumpIfNotSmi(rax, &miss);
3295 } 3297 }
3296 3298
3297 // Load left and right operand. 3299 // Load left and right operand.
3298 Label done, left, left_smi, right_smi; 3300 Label done, left, left_smi, right_smi;
3299 __ JumpIfSmi(rax, &right_smi, Label::kNear); 3301 __ JumpIfSmi(rax, &right_smi, Label::kNear);
3300 __ CompareMap(rax, isolate()->factory()->heap_number_map()); 3302 __ CompareMap(rax, isolate()->factory()->heap_number_map());
3301 __ j(not_equal, &maybe_undefined1, Label::kNear); 3303 __ j(not_equal, &maybe_undefined1, Label::kNear);
3302 __ movsd(xmm1, FieldOperand(rax, HeapNumber::kValueOffset)); 3304 __ movsd(xmm1, FieldOperand(rax, HeapNumber::kValueOffset));
3303 __ jmp(&left, Label::kNear); 3305 __ jmp(&left, Label::kNear);
(...skipping 21 matching lines...) Expand all
3325 // Return a result of -1, 0, or 1, based on EFLAGS. 3327 // Return a result of -1, 0, or 1, based on EFLAGS.
3326 // Performing mov, because xor would destroy the flag register. 3328 // Performing mov, because xor would destroy the flag register.
3327 __ movl(rax, Immediate(0)); 3329 __ movl(rax, Immediate(0));
3328 __ movl(rcx, Immediate(0)); 3330 __ movl(rcx, Immediate(0));
3329 __ setcc(above, rax); // Add one to zero if carry clear and not equal. 3331 __ setcc(above, rax); // Add one to zero if carry clear and not equal.
3330 __ sbbp(rax, rcx); // Subtract one if below (aka. carry set). 3332 __ sbbp(rax, rcx); // Subtract one if below (aka. carry set).
3331 __ ret(0); 3333 __ ret(0);
3332 3334
3333 __ bind(&unordered); 3335 __ bind(&unordered);
3334 __ bind(&generic_stub); 3336 __ bind(&generic_stub);
3335 CompareICStub stub(isolate(), op(), CompareIC::GENERIC, CompareIC::GENERIC, 3337 CompareICStub stub(isolate(), op(), CompareICState::GENERIC,
3336 CompareIC::GENERIC); 3338 CompareICState::GENERIC, CompareICState::GENERIC);
3337 __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET); 3339 __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET);
3338 3340
3339 __ bind(&maybe_undefined1); 3341 __ bind(&maybe_undefined1);
3340 if (Token::IsOrderedRelationalCompareOp(op())) { 3342 if (Token::IsOrderedRelationalCompareOp(op())) {
3341 __ Cmp(rax, isolate()->factory()->undefined_value()); 3343 __ Cmp(rax, isolate()->factory()->undefined_value());
3342 __ j(not_equal, &miss); 3344 __ j(not_equal, &miss);
3343 __ JumpIfSmi(rdx, &unordered); 3345 __ JumpIfSmi(rdx, &unordered);
3344 __ CmpObjectType(rdx, HEAP_NUMBER_TYPE, rcx); 3346 __ CmpObjectType(rdx, HEAP_NUMBER_TYPE, rcx);
3345 __ j(not_equal, &maybe_undefined2, Label::kNear); 3347 __ j(not_equal, &maybe_undefined2, Label::kNear);
3346 __ jmp(&unordered); 3348 __ jmp(&unordered);
3347 } 3349 }
3348 3350
3349 __ bind(&maybe_undefined2); 3351 __ bind(&maybe_undefined2);
3350 if (Token::IsOrderedRelationalCompareOp(op())) { 3352 if (Token::IsOrderedRelationalCompareOp(op())) {
3351 __ Cmp(rdx, isolate()->factory()->undefined_value()); 3353 __ Cmp(rdx, isolate()->factory()->undefined_value());
3352 __ j(equal, &unordered); 3354 __ j(equal, &unordered);
3353 } 3355 }
3354 3356
3355 __ bind(&miss); 3357 __ bind(&miss);
3356 GenerateMiss(masm); 3358 GenerateMiss(masm);
3357 } 3359 }
3358 3360
3359 3361
3360 void CompareICStub::GenerateInternalizedStrings(MacroAssembler* masm) { 3362 void CompareICStub::GenerateInternalizedStrings(MacroAssembler* masm) {
3361 DCHECK(state() == CompareIC::INTERNALIZED_STRING); 3363 DCHECK(state() == CompareICState::INTERNALIZED_STRING);
3362 DCHECK(GetCondition() == equal); 3364 DCHECK(GetCondition() == equal);
3363 3365
3364 // Registers containing left and right operands respectively. 3366 // Registers containing left and right operands respectively.
3365 Register left = rdx; 3367 Register left = rdx;
3366 Register right = rax; 3368 Register right = rax;
3367 Register tmp1 = rcx; 3369 Register tmp1 = rcx;
3368 Register tmp2 = rbx; 3370 Register tmp2 = rbx;
3369 3371
3370 // Check that both operands are heap objects. 3372 // Check that both operands are heap objects.
3371 Label miss; 3373 Label miss;
(...skipping 22 matching lines...) Expand all
3394 __ Move(rax, Smi::FromInt(EQUAL)); 3396 __ Move(rax, Smi::FromInt(EQUAL));
3395 __ bind(&done); 3397 __ bind(&done);
3396 __ ret(0); 3398 __ ret(0);
3397 3399
3398 __ bind(&miss); 3400 __ bind(&miss);
3399 GenerateMiss(masm); 3401 GenerateMiss(masm);
3400 } 3402 }
3401 3403
3402 3404
3403 void CompareICStub::GenerateUniqueNames(MacroAssembler* masm) { 3405 void CompareICStub::GenerateUniqueNames(MacroAssembler* masm) {
3404 DCHECK(state() == CompareIC::UNIQUE_NAME); 3406 DCHECK(state() == CompareICState::UNIQUE_NAME);
3405 DCHECK(GetCondition() == equal); 3407 DCHECK(GetCondition() == equal);
3406 3408
3407 // Registers containing left and right operands respectively. 3409 // Registers containing left and right operands respectively.
3408 Register left = rdx; 3410 Register left = rdx;
3409 Register right = rax; 3411 Register right = rax;
3410 Register tmp1 = rcx; 3412 Register tmp1 = rcx;
3411 Register tmp2 = rbx; 3413 Register tmp2 = rbx;
3412 3414
3413 // Check that both operands are heap objects. 3415 // Check that both operands are heap objects.
3414 Label miss; 3416 Label miss;
(...skipping 22 matching lines...) Expand all
3437 __ Move(rax, Smi::FromInt(EQUAL)); 3439 __ Move(rax, Smi::FromInt(EQUAL));
3438 __ bind(&done); 3440 __ bind(&done);
3439 __ ret(0); 3441 __ ret(0);
3440 3442
3441 __ bind(&miss); 3443 __ bind(&miss);
3442 GenerateMiss(masm); 3444 GenerateMiss(masm);
3443 } 3445 }
3444 3446
3445 3447
3446 void CompareICStub::GenerateStrings(MacroAssembler* masm) { 3448 void CompareICStub::GenerateStrings(MacroAssembler* masm) {
3447 DCHECK(state() == CompareIC::STRING); 3449 DCHECK(state() == CompareICState::STRING);
3448 Label miss; 3450 Label miss;
3449 3451
3450 bool equality = Token::IsEqualityOp(op()); 3452 bool equality = Token::IsEqualityOp(op());
3451 3453
3452 // Registers containing left and right operands respectively. 3454 // Registers containing left and right operands respectively.
3453 Register left = rdx; 3455 Register left = rdx;
3454 Register right = rax; 3456 Register right = rax;
3455 Register tmp1 = rcx; 3457 Register tmp1 = rcx;
3456 Register tmp2 = rbx; 3458 Register tmp2 = rbx;
3457 Register tmp3 = rdi; 3459 Register tmp3 = rdi;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
3524 } else { 3526 } else {
3525 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); 3527 __ TailCallRuntime(Runtime::kStringCompare, 2, 1);
3526 } 3528 }
3527 3529
3528 __ bind(&miss); 3530 __ bind(&miss);
3529 GenerateMiss(masm); 3531 GenerateMiss(masm);
3530 } 3532 }
3531 3533
3532 3534
3533 void CompareICStub::GenerateObjects(MacroAssembler* masm) { 3535 void CompareICStub::GenerateObjects(MacroAssembler* masm) {
3534 DCHECK(state() == CompareIC::OBJECT); 3536 DCHECK(state() == CompareICState::OBJECT);
3535 Label miss; 3537 Label miss;
3536 Condition either_smi = masm->CheckEitherSmi(rdx, rax); 3538 Condition either_smi = masm->CheckEitherSmi(rdx, rax);
3537 __ j(either_smi, &miss, Label::kNear); 3539 __ j(either_smi, &miss, Label::kNear);
3538 3540
3539 __ CmpObjectType(rax, JS_OBJECT_TYPE, rcx); 3541 __ CmpObjectType(rax, JS_OBJECT_TYPE, rcx);
3540 __ j(not_equal, &miss, Label::kNear); 3542 __ j(not_equal, &miss, Label::kNear);
3541 __ CmpObjectType(rdx, JS_OBJECT_TYPE, rcx); 3543 __ CmpObjectType(rdx, JS_OBJECT_TYPE, rcx);
3542 __ j(not_equal, &miss, Label::kNear); 3544 __ j(not_equal, &miss, Label::kNear);
3543 3545
3544 DCHECK(GetCondition() == equal); 3546 DCHECK(GetCondition() == equal);
(...skipping 1089 matching lines...) Expand 10 before | Expand all | Expand 10 after
4634 return_value_operand, 4636 return_value_operand,
4635 NULL); 4637 NULL);
4636 } 4638 }
4637 4639
4638 4640
4639 #undef __ 4641 #undef __
4640 4642
4641 } } // namespace v8::internal 4643 } } // namespace v8::internal
4642 4644
4643 #endif // V8_TARGET_ARCH_X64 4645 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/type-info.cc ('k') | src/x64/full-codegen-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698