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

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

Issue 8357010: Handlify the stub cache lookup and patching for CallIC and KeyedCallIC. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Do not assume functions are compiled when specializing. Created 9 years, 2 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/ic.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 468 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 return masm->TryCallApiFunctionAndReturn(&fun, 479 return masm->TryCallApiFunctionAndReturn(&fun,
480 argc + kFastApiCallArguments + 1); 480 argc + kFastApiCallArguments + 1);
481 } 481 }
482 482
483 483
484 class CallInterceptorCompiler BASE_EMBEDDED { 484 class CallInterceptorCompiler BASE_EMBEDDED {
485 public: 485 public:
486 CallInterceptorCompiler(StubCompiler* stub_compiler, 486 CallInterceptorCompiler(StubCompiler* stub_compiler,
487 const ParameterCount& arguments, 487 const ParameterCount& arguments,
488 Register name, 488 Register name,
489 Code::ExtraICState extra_ic_state) 489 Code::ExtraICState extra_state)
490 : stub_compiler_(stub_compiler), 490 : stub_compiler_(stub_compiler),
491 arguments_(arguments), 491 arguments_(arguments),
492 name_(name), 492 name_(name),
493 extra_ic_state_(extra_ic_state) {} 493 extra_state_(extra_state) {}
494 494
495 MaybeObject* Compile(MacroAssembler* masm, 495 MaybeObject* Compile(MacroAssembler* masm,
496 JSObject* object, 496 JSObject* object,
497 JSObject* holder, 497 JSObject* holder,
498 String* name, 498 String* name,
499 LookupResult* lookup, 499 LookupResult* lookup,
500 Register receiver, 500 Register receiver,
501 Register scratch1, 501 Register scratch1,
502 Register scratch2, 502 Register scratch2,
503 Register scratch3, 503 Register scratch3,
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
607 // by the previous CheckPrototypes. 607 // by the previous CheckPrototypes.
608 ASSERT(depth2 == kInvalidProtoDepth); 608 ASSERT(depth2 == kInvalidProtoDepth);
609 } 609 }
610 610
611 // Invoke function. 611 // Invoke function.
612 if (can_do_fast_api_call) { 612 if (can_do_fast_api_call) {
613 MaybeObject* result = 613 MaybeObject* result =
614 GenerateFastApiCall(masm, optimization, arguments_.immediate()); 614 GenerateFastApiCall(masm, optimization, arguments_.immediate());
615 if (result->IsFailure()) return result; 615 if (result->IsFailure()) return result;
616 } else { 616 } else {
617 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) 617 CallKind call_kind = CallICBase::Contextual::decode(extra_state_)
618 ? CALL_AS_FUNCTION 618 ? CALL_AS_FUNCTION
619 : CALL_AS_METHOD; 619 : CALL_AS_METHOD;
620 __ InvokeFunction(optimization.constant_function(), arguments_, 620 __ InvokeFunction(optimization.constant_function(), arguments_,
621 JUMP_FUNCTION, NullCallWrapper(), call_kind); 621 JUMP_FUNCTION, NullCallWrapper(), call_kind);
622 } 622 }
623 623
624 // Deferred code for fast API call case---clean preallocated space. 624 // Deferred code for fast API call case---clean preallocated space.
625 if (can_do_fast_api_call) { 625 if (can_do_fast_api_call) {
626 __ bind(&miss_cleanup); 626 __ bind(&miss_cleanup);
627 FreeSpaceForFastApiCall(masm, scratch1); 627 FreeSpaceForFastApiCall(masm, scratch1);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 // Leave the internal frame. 693 // Leave the internal frame.
694 } 694 }
695 695
696 __ cmp(eax, masm->isolate()->factory()->no_interceptor_result_sentinel()); 696 __ cmp(eax, masm->isolate()->factory()->no_interceptor_result_sentinel());
697 __ j(not_equal, interceptor_succeeded); 697 __ j(not_equal, interceptor_succeeded);
698 } 698 }
699 699
700 StubCompiler* stub_compiler_; 700 StubCompiler* stub_compiler_;
701 const ParameterCount& arguments_; 701 const ParameterCount& arguments_;
702 Register name_; 702 Register name_;
703 Code::ExtraICState extra_ic_state_; 703 Code::ExtraICState extra_state_;
704 }; 704 };
705 705
706 706
707 void StubCompiler::GenerateLoadMiss(MacroAssembler* masm, Code::Kind kind) { 707 void StubCompiler::GenerateLoadMiss(MacroAssembler* masm, Code::Kind kind) {
708 ASSERT(kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC); 708 ASSERT(kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC);
709 Code* code = NULL; 709 Code* code = NULL;
710 if (kind == Code::LOAD_IC) { 710 if (kind == Code::LOAD_IC) {
711 code = masm->isolate()->builtins()->builtin(Builtins::kLoadIC_Miss); 711 code = masm->isolate()->builtins()->builtin(Builtins::kLoadIC_Miss);
712 } else { 712 } else {
713 code = masm->isolate()->builtins()->builtin(Builtins::kKeyedLoadIC_Miss); 713 code = masm->isolate()->builtins()->builtin(Builtins::kKeyedLoadIC_Miss);
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after
1330 __ j(not_equal, miss); 1330 __ j(not_equal, miss);
1331 } else { 1331 } else {
1332 __ cmp(edi, Immediate(Handle<JSFunction>(function))); 1332 __ cmp(edi, Immediate(Handle<JSFunction>(function)));
1333 __ j(not_equal, miss); 1333 __ j(not_equal, miss);
1334 } 1334 }
1335 } 1335 }
1336 1336
1337 1337
1338 MaybeObject* CallStubCompiler::GenerateMissBranch() { 1338 MaybeObject* CallStubCompiler::GenerateMissBranch() {
1339 MaybeObject* maybe_obj = 1339 MaybeObject* maybe_obj =
1340 isolate()->stub_cache()->ComputeCallMiss(arguments().immediate(), 1340 isolate()->stub_cache()->TryComputeCallMiss(arguments().immediate(),
1341 kind_, 1341 kind_,
1342 extra_ic_state_); 1342 extra_state_);
1343 Object* obj; 1343 Object* obj;
1344 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 1344 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
1345 __ jmp(Handle<Code>(Code::cast(obj)), RelocInfo::CODE_TARGET); 1345 __ jmp(Handle<Code>(Code::cast(obj)), RelocInfo::CODE_TARGET);
1346 return obj; 1346 return obj;
1347 } 1347 }
1348 1348
1349 1349
1350 MUST_USE_RESULT MaybeObject* CallStubCompiler::CompileCallField( 1350 MUST_USE_RESULT MaybeObject* CallStubCompiler::CompileCallField(
1351 JSObject* object, 1351 JSObject* object,
1352 JSObject* holder, 1352 JSObject* holder,
(...skipping 29 matching lines...) Expand all
1382 __ j(not_equal, &miss); 1382 __ j(not_equal, &miss);
1383 1383
1384 // Patch the receiver on the stack with the global proxy if 1384 // Patch the receiver on the stack with the global proxy if
1385 // necessary. 1385 // necessary.
1386 if (object->IsGlobalObject()) { 1386 if (object->IsGlobalObject()) {
1387 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); 1387 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset));
1388 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); 1388 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx);
1389 } 1389 }
1390 1390
1391 // Invoke the function. 1391 // Invoke the function.
1392 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) 1392 CallKind call_kind = CallICBase::Contextual::decode(extra_state_)
1393 ? CALL_AS_FUNCTION 1393 ? CALL_AS_FUNCTION
1394 : CALL_AS_METHOD; 1394 : CALL_AS_METHOD;
1395 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION, 1395 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION,
1396 NullCallWrapper(), call_kind); 1396 NullCallWrapper(), call_kind);
1397 1397
1398 // Handle call cache miss. 1398 // Handle call cache miss.
1399 __ bind(&miss); 1399 __ bind(&miss);
1400 MaybeObject* maybe_result = GenerateMissBranch(); 1400 MaybeObject* maybe_result = GenerateMissBranch();
1401 if (maybe_result->IsFailure()) return maybe_result; 1401 if (maybe_result->IsFailure()) return maybe_result;
1402 1402
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
1693 } 1693 }
1694 1694
1695 const int argc = arguments().immediate(); 1695 const int argc = arguments().immediate();
1696 1696
1697 Label miss; 1697 Label miss;
1698 Label name_miss; 1698 Label name_miss;
1699 Label index_out_of_range; 1699 Label index_out_of_range;
1700 Label* index_out_of_range_label = &index_out_of_range; 1700 Label* index_out_of_range_label = &index_out_of_range;
1701 1701
1702 if (kind_ == Code::CALL_IC && 1702 if (kind_ == Code::CALL_IC &&
1703 (CallICBase::StringStubState::decode(extra_ic_state_) == 1703 (CallICBase::StringStubState::decode(extra_state_) ==
1704 DEFAULT_STRING_STUB)) { 1704 DEFAULT_STRING_STUB)) {
1705 index_out_of_range_label = &miss; 1705 index_out_of_range_label = &miss;
1706 } 1706 }
1707 1707
1708 GenerateNameCheck(name, &name_miss); 1708 GenerateNameCheck(name, &name_miss);
1709 1709
1710 // Check that the maps starting from the prototype haven't changed. 1710 // Check that the maps starting from the prototype haven't changed.
1711 GenerateDirectLoadGlobalFunctionPrototype(masm(), 1711 GenerateDirectLoadGlobalFunctionPrototype(masm(),
1712 Context::STRING_FUNCTION_INDEX, 1712 Context::STRING_FUNCTION_INDEX,
1713 eax, 1713 eax,
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1779 } 1779 }
1780 1780
1781 const int argc = arguments().immediate(); 1781 const int argc = arguments().immediate();
1782 1782
1783 Label miss; 1783 Label miss;
1784 Label name_miss; 1784 Label name_miss;
1785 Label index_out_of_range; 1785 Label index_out_of_range;
1786 Label* index_out_of_range_label = &index_out_of_range; 1786 Label* index_out_of_range_label = &index_out_of_range;
1787 1787
1788 if (kind_ == Code::CALL_IC && 1788 if (kind_ == Code::CALL_IC &&
1789 (CallICBase::StringStubState::decode(extra_ic_state_) == 1789 (CallICBase::StringStubState::decode(extra_state_) ==
1790 DEFAULT_STRING_STUB)) { 1790 DEFAULT_STRING_STUB)) {
1791 index_out_of_range_label = &miss; 1791 index_out_of_range_label = &miss;
1792 } 1792 }
1793 1793
1794 GenerateNameCheck(name, &name_miss); 1794 GenerateNameCheck(name, &name_miss);
1795 1795
1796 // Check that the maps starting from the prototype haven't changed. 1796 // Check that the maps starting from the prototype haven't changed.
1797 GenerateDirectLoadGlobalFunctionPrototype(masm(), 1797 GenerateDirectLoadGlobalFunctionPrototype(masm(),
1798 Context::STRING_FUNCTION_INDEX, 1798 Context::STRING_FUNCTION_INDEX,
1799 eax, 1799 eax,
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1901 StringCharFromCodeGenerator char_from_code_generator(code, eax); 1901 StringCharFromCodeGenerator char_from_code_generator(code, eax);
1902 char_from_code_generator.GenerateFast(masm()); 1902 char_from_code_generator.GenerateFast(masm());
1903 __ ret(2 * kPointerSize); 1903 __ ret(2 * kPointerSize);
1904 1904
1905 StubRuntimeCallHelper call_helper; 1905 StubRuntimeCallHelper call_helper;
1906 char_from_code_generator.GenerateSlow(masm(), call_helper); 1906 char_from_code_generator.GenerateSlow(masm(), call_helper);
1907 1907
1908 // Tail call the full function. We do not have to patch the receiver 1908 // Tail call the full function. We do not have to patch the receiver
1909 // because the function makes no use of it. 1909 // because the function makes no use of it.
1910 __ bind(&slow); 1910 __ bind(&slow);
1911 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) 1911 CallKind call_kind = CallICBase::Contextual::decode(extra_state_)
1912 ? CALL_AS_FUNCTION 1912 ? CALL_AS_FUNCTION
1913 : CALL_AS_METHOD; 1913 : CALL_AS_METHOD;
1914 __ InvokeFunction(function, arguments(), JUMP_FUNCTION, 1914 __ InvokeFunction(function, arguments(), JUMP_FUNCTION,
1915 NullCallWrapper(), call_kind); 1915 NullCallWrapper(), call_kind);
1916 1916
1917 __ bind(&miss); 1917 __ bind(&miss);
1918 // ecx: function name. 1918 // ecx: function name.
1919 MaybeObject* maybe_result = GenerateMissBranch(); 1919 MaybeObject* maybe_result = GenerateMissBranch();
1920 if (maybe_result->IsFailure()) return maybe_result; 1920 if (maybe_result->IsFailure()) return maybe_result;
1921 1921
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
2332 CheckPrototypes(JSObject::cast(object->GetPrototype()), eax, holder, 2332 CheckPrototypes(JSObject::cast(object->GetPrototype()), eax, holder,
2333 ebx, edx, edi, name, &miss); 2333 ebx, edx, edi, name, &miss);
2334 } 2334 }
2335 break; 2335 break;
2336 } 2336 }
2337 2337
2338 default: 2338 default:
2339 UNREACHABLE(); 2339 UNREACHABLE();
2340 } 2340 }
2341 2341
2342 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) 2342 CallKind call_kind = CallICBase::Contextual::decode(extra_state_)
2343 ? CALL_AS_FUNCTION 2343 ? CALL_AS_FUNCTION
2344 : CALL_AS_METHOD; 2344 : CALL_AS_METHOD;
2345 __ InvokeFunction(function, arguments(), JUMP_FUNCTION, 2345 __ InvokeFunction(function, arguments(), JUMP_FUNCTION,
2346 NullCallWrapper(), call_kind); 2346 NullCallWrapper(), call_kind);
2347 2347
2348 // Handle call cache miss. 2348 // Handle call cache miss.
2349 __ bind(&miss); 2349 __ bind(&miss);
2350 MaybeObject* maybe_result = GenerateMissBranch(); 2350 MaybeObject* maybe_result = GenerateMissBranch();
2351 if (maybe_result->IsFailure()) return maybe_result; 2351 if (maybe_result->IsFailure()) return maybe_result;
2352 2352
(...skipping 18 matching lines...) Expand all
2371 2371
2372 // Get the number of arguments. 2372 // Get the number of arguments.
2373 const int argc = arguments().immediate(); 2373 const int argc = arguments().immediate();
2374 2374
2375 LookupResult lookup(isolate()); 2375 LookupResult lookup(isolate());
2376 LookupPostInterceptor(holder, name, &lookup); 2376 LookupPostInterceptor(holder, name, &lookup);
2377 2377
2378 // Get the receiver from the stack. 2378 // Get the receiver from the stack.
2379 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); 2379 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize));
2380 2380
2381 CallInterceptorCompiler compiler(this, arguments(), ecx, extra_ic_state_); 2381 CallInterceptorCompiler compiler(this, arguments(), ecx, extra_state_);
2382 MaybeObject* result = compiler.Compile(masm(), 2382 MaybeObject* result = compiler.Compile(masm(),
2383 object, 2383 object,
2384 holder, 2384 holder,
2385 name, 2385 name,
2386 &lookup, 2386 &lookup,
2387 edx, 2387 edx,
2388 ebx, 2388 ebx,
2389 edi, 2389 edi,
2390 eax, 2390 eax,
2391 &miss); 2391 &miss);
2392 if (result->IsFailure()) return result; 2392 if (result->IsFailure()) return result;
2393 2393
2394 // Restore receiver. 2394 // Restore receiver.
2395 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); 2395 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize));
2396 2396
2397 // Check that the function really is a function. 2397 // Check that the function really is a function.
2398 __ JumpIfSmi(eax, &miss); 2398 __ JumpIfSmi(eax, &miss);
2399 __ CmpObjectType(eax, JS_FUNCTION_TYPE, ebx); 2399 __ CmpObjectType(eax, JS_FUNCTION_TYPE, ebx);
2400 __ j(not_equal, &miss); 2400 __ j(not_equal, &miss);
2401 2401
2402 // Patch the receiver on the stack with the global proxy if 2402 // Patch the receiver on the stack with the global proxy if
2403 // necessary. 2403 // necessary.
2404 if (object->IsGlobalObject()) { 2404 if (object->IsGlobalObject()) {
2405 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); 2405 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset));
2406 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); 2406 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx);
2407 } 2407 }
2408 2408
2409 // Invoke the function. 2409 // Invoke the function.
2410 __ mov(edi, eax); 2410 __ mov(edi, eax);
2411 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) 2411 CallKind call_kind = CallICBase::Contextual::decode(extra_state_)
2412 ? CALL_AS_FUNCTION 2412 ? CALL_AS_FUNCTION
2413 : CALL_AS_METHOD; 2413 : CALL_AS_METHOD;
2414 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION, 2414 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION,
2415 NullCallWrapper(), call_kind); 2415 NullCallWrapper(), call_kind);
2416 2416
2417 // Handle load cache miss. 2417 // Handle load cache miss.
2418 __ bind(&miss); 2418 __ bind(&miss);
2419 MaybeObject* maybe_result = GenerateMissBranch(); 2419 MaybeObject* maybe_result = GenerateMissBranch();
2420 if (maybe_result->IsFailure()) return maybe_result; 2420 if (maybe_result->IsFailure()) return maybe_result;
2421 2421
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2463 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); 2463 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset));
2464 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); 2464 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx);
2465 } 2465 }
2466 2466
2467 // Setup the context (function already in edi). 2467 // Setup the context (function already in edi).
2468 __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); 2468 __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset));
2469 2469
2470 // Jump to the cached code (tail call). 2470 // Jump to the cached code (tail call).
2471 Counters* counters = isolate()->counters(); 2471 Counters* counters = isolate()->counters();
2472 __ IncrementCounter(counters->call_global_inline(), 1); 2472 __ IncrementCounter(counters->call_global_inline(), 1);
2473 ASSERT(function->is_compiled());
2474 ParameterCount expected(function->shared()->formal_parameter_count()); 2473 ParameterCount expected(function->shared()->formal_parameter_count());
2475 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) 2474 CallKind call_kind = CallICBase::Contextual::decode(extra_state_)
2476 ? CALL_AS_FUNCTION 2475 ? CALL_AS_FUNCTION
2477 : CALL_AS_METHOD; 2476 : CALL_AS_METHOD;
2478 if (V8::UseCrankshaft()) { 2477 // We call indirectly through the code field in the function to
2479 // TODO(kasperl): For now, we always call indirectly through the 2478 // allow recompilation to take effect without changing any of the
2480 // code field in the function to allow recompilation to take effect 2479 // call sites.
2481 // without changing any of the call sites. 2480 __ InvokeCode(FieldOperand(edi, JSFunction::kCodeEntryOffset),
2482 __ InvokeCode(FieldOperand(edi, JSFunction::kCodeEntryOffset), 2481 expected, arguments(), JUMP_FUNCTION,
2483 expected, arguments(), JUMP_FUNCTION, 2482 NullCallWrapper(), call_kind);
2484 NullCallWrapper(), call_kind);
2485 } else {
2486 Handle<Code> code(function->code());
2487 __ InvokeCode(code, expected, arguments(),
2488 RelocInfo::CODE_TARGET, JUMP_FUNCTION,
2489 NullCallWrapper(), call_kind);
2490 }
2491 2483
2492 // Handle call cache miss. 2484 // Handle call cache miss.
2493 __ bind(&miss); 2485 __ bind(&miss);
2494 __ IncrementCounter(counters->call_global_inline_miss(), 1); 2486 __ IncrementCounter(counters->call_global_inline_miss(), 1);
2495 MaybeObject* maybe_result = GenerateMissBranch(); 2487 MaybeObject* maybe_result = GenerateMissBranch();
2496 if (maybe_result->IsFailure()) return maybe_result; 2488 if (maybe_result->IsFailure()) return maybe_result;
2497 2489
2498 // Return the generated code. 2490 // Return the generated code.
2499 return GetCode(NORMAL, name); 2491 return GetCode(NORMAL, name);
2500 } 2492 }
(...skipping 1525 matching lines...) Expand 10 before | Expand all | Expand 10 after
4026 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss(); 4018 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss();
4027 __ jmp(ic_miss, RelocInfo::CODE_TARGET); 4019 __ jmp(ic_miss, RelocInfo::CODE_TARGET);
4028 } 4020 }
4029 4021
4030 4022
4031 #undef __ 4023 #undef __
4032 4024
4033 } } // namespace v8::internal 4025 } } // namespace v8::internal
4034 4026
4035 #endif // V8_TARGET_ARCH_IA32 4027 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/ia32/macro-assembler-ia32.cc ('k') | src/ic.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698