OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
436 __ movq(scratch, StackOperandForReturnAddress(0)); | 436 __ movq(scratch, StackOperandForReturnAddress(0)); |
437 __ movq(StackOperandForReturnAddress(kFastApiCallArguments * kPointerSize), | 437 __ movq(StackOperandForReturnAddress(kFastApiCallArguments * kPointerSize), |
438 scratch); | 438 scratch); |
439 __ addq(rsp, Immediate(kPointerSize * kFastApiCallArguments)); | 439 __ addq(rsp, Immediate(kPointerSize * kFastApiCallArguments)); |
440 } | 440 } |
441 | 441 |
442 | 442 |
443 // Generates call to API function. | 443 // Generates call to API function. |
444 static void GenerateFastApiCall(MacroAssembler* masm, | 444 static void GenerateFastApiCall(MacroAssembler* masm, |
445 const CallOptimization& optimization, | 445 const CallOptimization& optimization, |
446 int argc, | 446 int argc) { |
447 bool restore_context) { | |
448 // ----------- S t a t e ------------- | 447 // ----------- S t a t e ------------- |
449 // -- rsp[0] : return address | 448 // -- rsp[0] : return address |
450 // -- rsp[8] : context save | 449 // -- rsp[8] : object passing the type check |
451 // -- rsp[16] : object passing the type check | |
452 // (last fast api call extra argument, | 450 // (last fast api call extra argument, |
453 // set by CheckPrototypes) | 451 // set by CheckPrototypes) |
454 // -- rsp[24] : api function | 452 // -- rsp[16] : api function |
455 // (first fast api call extra argument) | 453 // (first fast api call extra argument) |
456 // -- rsp[32] : api call data | 454 // -- rsp[24] : api call data |
457 // -- rsp[40] : isolate | 455 // -- rsp[32] : isolate |
458 // -- rsp[48] : ReturnValue default value | 456 // -- rsp[40] : ReturnValue default value |
459 // -- rsp[56] : ReturnValue | 457 // -- rsp[48] : ReturnValue |
460 // | 458 // |
461 // -- rsp[64] : last argument | 459 // -- rsp[56] : last argument |
462 // -- ... | 460 // -- ... |
463 // -- rsp[(argc + 7) * 8] : first argument | 461 // -- rsp[(argc + 6) * 8] : first argument |
464 // -- rsp[(argc + 8) * 8] : receiver | 462 // -- rsp[(argc + 7) * 8] : receiver |
465 // ----------------------------------- | 463 // ----------------------------------- |
466 int api_call_argc = argc + kFastApiCallArguments; | |
467 StackArgumentsAccessor args(rsp, api_call_argc); | |
468 | |
469 // Save calling context. | |
470 __ movq(args.GetArgumentOperand(api_call_argc), rsi); | |
471 | |
472 // Get the function and setup the context. | 464 // Get the function and setup the context. |
473 Handle<JSFunction> function = optimization.constant_function(); | 465 Handle<JSFunction> function = optimization.constant_function(); |
474 __ LoadHeapObject(rdi, function); | 466 __ LoadHeapObject(rdi, function); |
475 __ movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset)); | 467 __ movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset)); |
| 468 |
| 469 int api_call_argc = argc + kFastApiCallArguments; |
| 470 StackArgumentsAccessor args(rsp, api_call_argc); |
| 471 |
476 // Pass the additional arguments. | 472 // Pass the additional arguments. |
477 __ movq(args.GetArgumentOperand(api_call_argc - 2), rdi); | 473 __ movq(args.GetArgumentOperand(api_call_argc - 1), rdi); |
478 Handle<CallHandlerInfo> api_call_info = optimization.api_call_info(); | 474 Handle<CallHandlerInfo> api_call_info = optimization.api_call_info(); |
479 Handle<Object> call_data(api_call_info->data(), masm->isolate()); | 475 Handle<Object> call_data(api_call_info->data(), masm->isolate()); |
480 if (masm->isolate()->heap()->InNewSpace(*call_data)) { | 476 if (masm->isolate()->heap()->InNewSpace(*call_data)) { |
481 __ Move(rcx, api_call_info); | 477 __ Move(rcx, api_call_info); |
482 __ movq(rbx, FieldOperand(rcx, CallHandlerInfo::kDataOffset)); | 478 __ movq(rbx, FieldOperand(rcx, CallHandlerInfo::kDataOffset)); |
483 __ movq(args.GetArgumentOperand(api_call_argc - 3), rbx); | 479 __ movq(args.GetArgumentOperand(api_call_argc - 2), rbx); |
484 } else { | 480 } else { |
485 __ Move(args.GetArgumentOperand(api_call_argc - 3), call_data); | 481 __ Move(args.GetArgumentOperand(api_call_argc - 2), call_data); |
486 } | 482 } |
487 __ movq(kScratchRegister, | 483 __ movq(kScratchRegister, |
488 ExternalReference::isolate_address(masm->isolate())); | 484 ExternalReference::isolate_address(masm->isolate())); |
| 485 __ movq(args.GetArgumentOperand(api_call_argc - 3), kScratchRegister); |
| 486 __ LoadRoot(kScratchRegister, Heap::kUndefinedValueRootIndex); |
489 __ movq(args.GetArgumentOperand(api_call_argc - 4), kScratchRegister); | 487 __ movq(args.GetArgumentOperand(api_call_argc - 4), kScratchRegister); |
490 __ LoadRoot(kScratchRegister, Heap::kUndefinedValueRootIndex); | |
491 __ movq(args.GetArgumentOperand(api_call_argc - 5), kScratchRegister); | 488 __ movq(args.GetArgumentOperand(api_call_argc - 5), kScratchRegister); |
492 __ movq(args.GetArgumentOperand(api_call_argc - 6), kScratchRegister); | |
493 | 489 |
494 // Prepare arguments. | 490 // Prepare arguments. |
495 STATIC_ASSERT(kFastApiCallArguments == 7); | 491 STATIC_ASSERT(kFastApiCallArguments == 6); |
496 __ lea(rbx, Operand(rsp, kFastApiCallArguments * kPointerSize)); | 492 __ lea(rbx, Operand(rsp, kFastApiCallArguments * kPointerSize)); |
497 | 493 |
498 // Function address is a foreign pointer outside V8's heap. | 494 // Function address is a foreign pointer outside V8's heap. |
499 Address function_address = v8::ToCData<Address>(api_call_info->callback()); | 495 Address function_address = v8::ToCData<Address>(api_call_info->callback()); |
500 | 496 |
| 497 #if defined(__MINGW64__) || defined(_WIN64) |
| 498 Register arguments_arg = rcx; |
| 499 Register callback_arg = rdx; |
| 500 #else |
| 501 Register arguments_arg = rdi; |
| 502 Register callback_arg = rsi; |
| 503 #endif |
| 504 |
501 // Allocate the v8::Arguments structure in the arguments' space since | 505 // Allocate the v8::Arguments structure in the arguments' space since |
502 // it's not controlled by GC. | 506 // it's not controlled by GC. |
503 const int kApiStackSpace = 4; | 507 const int kApiStackSpace = 4; |
504 | 508 |
505 __ PrepareCallApiFunction(kApiStackSpace); | 509 __ PrepareCallApiFunction(kApiStackSpace); |
506 | 510 |
507 __ movq(StackSpaceOperand(0), rbx); // v8::Arguments::implicit_args_. | 511 __ movq(StackSpaceOperand(0), rbx); // v8::Arguments::implicit_args_. |
508 __ addq(rbx, Immediate(argc * kPointerSize)); | 512 __ addq(rbx, Immediate(argc * kPointerSize)); |
509 __ movq(StackSpaceOperand(1), rbx); // v8::Arguments::values_. | 513 __ movq(StackSpaceOperand(1), rbx); // v8::Arguments::values_. |
510 __ Set(StackSpaceOperand(2), argc); // v8::Arguments::length_. | 514 __ Set(StackSpaceOperand(2), argc); // v8::Arguments::length_. |
511 // v8::Arguments::is_construct_call_. | 515 // v8::Arguments::is_construct_call_. |
512 __ Set(StackSpaceOperand(3), 0); | 516 __ Set(StackSpaceOperand(3), 0); |
513 | 517 |
514 #if defined(__MINGW64__) || defined(_WIN64) | |
515 Register arguments_arg = rcx; | |
516 Register callback_arg = rdx; | |
517 #else | |
518 Register arguments_arg = rdi; | |
519 Register callback_arg = rsi; | |
520 #endif | |
521 | |
522 // v8::InvocationCallback's argument. | 518 // v8::InvocationCallback's argument. |
523 __ lea(arguments_arg, StackSpaceOperand(0)); | 519 __ lea(arguments_arg, StackSpaceOperand(0)); |
524 | 520 |
525 Address thunk_address = FUNCTION_ADDR(&InvokeFunctionCallback); | 521 Address thunk_address = FUNCTION_ADDR(&InvokeFunctionCallback); |
526 | 522 |
527 Operand context_restore_operand(rbp, 2 * kPointerSize); | |
528 Operand return_value_operand( | |
529 rbp, (kFastApiCallArguments + 1) * kPointerSize); | |
530 __ CallApiFunctionAndReturn(function_address, | 523 __ CallApiFunctionAndReturn(function_address, |
531 thunk_address, | 524 thunk_address, |
532 callback_arg, | 525 callback_arg, |
533 api_call_argc + 1, | 526 api_call_argc + 1, |
534 return_value_operand, | 527 kFastApiCallArguments + 1); |
535 restore_context ? | |
536 &context_restore_operand : NULL); | |
537 } | 528 } |
538 | 529 |
539 | 530 |
540 // Generate call to api function. | 531 // Generate call to api function. |
541 static void GenerateFastApiCall(MacroAssembler* masm, | 532 static void GenerateFastApiCall(MacroAssembler* masm, |
542 const CallOptimization& optimization, | 533 const CallOptimization& optimization, |
543 Register receiver, | 534 Register receiver, |
544 Register scratch, | 535 Register scratch, |
545 int argc, | 536 int argc, |
546 Register* values) { | 537 Register* values) { |
547 ASSERT(optimization.is_simple_api_call()); | 538 ASSERT(optimization.is_simple_api_call()); |
548 ASSERT(!receiver.is(scratch)); | 539 ASSERT(!receiver.is(scratch)); |
549 | 540 |
550 const int stack_space = kFastApiCallArguments + argc + 1; | 541 const int stack_space = kFastApiCallArguments + argc + 1; |
551 const int kHolderIndex = kFastApiCallArguments + | |
552 FunctionCallbackArguments::kHolderIndex; | |
553 // Copy return value. | 542 // Copy return value. |
554 __ movq(scratch, Operand(rsp, 0)); | 543 __ movq(scratch, Operand(rsp, 0)); |
555 // Assign stack space for the call arguments. | 544 // Assign stack space for the call arguments. |
556 __ subq(rsp, Immediate(stack_space * kPointerSize)); | 545 __ subq(rsp, Immediate(stack_space * kPointerSize)); |
557 // Move the return address on top of the stack. | 546 // Move the return address on top of the stack. |
558 __ movq(Operand(rsp, 0), scratch); | 547 __ movq(Operand(rsp, 0), scratch); |
559 // Write holder to stack frame. | 548 // Write holder to stack frame. |
560 __ movq(Operand(rsp, kHolderIndex * kPointerSize), receiver); | 549 __ movq(Operand(rsp, 1 * kPointerSize), receiver); |
561 // Write receiver to stack frame. | 550 // Write receiver to stack frame. |
562 int index = stack_space; | 551 int index = stack_space; |
563 __ movq(Operand(rsp, index-- * kPointerSize), receiver); | 552 __ movq(Operand(rsp, index-- * kPointerSize), receiver); |
564 // Write the arguments to stack frame. | 553 // Write the arguments to stack frame. |
565 for (int i = 0; i < argc; i++) { | 554 for (int i = 0; i < argc; i++) { |
566 ASSERT(!receiver.is(values[i])); | 555 ASSERT(!receiver.is(values[i])); |
567 ASSERT(!scratch.is(values[i])); | 556 ASSERT(!scratch.is(values[i])); |
568 __ movq(Operand(rsp, index-- * kPointerSize), values[i]); | 557 __ movq(Operand(rsp, index-- * kPointerSize), values[i]); |
569 } | 558 } |
570 | 559 |
571 GenerateFastApiCall(masm, optimization, argc, true); | 560 GenerateFastApiCall(masm, optimization, argc); |
572 } | 561 } |
573 | 562 |
574 | 563 |
575 class CallInterceptorCompiler BASE_EMBEDDED { | 564 class CallInterceptorCompiler BASE_EMBEDDED { |
576 public: | 565 public: |
577 CallInterceptorCompiler(StubCompiler* stub_compiler, | 566 CallInterceptorCompiler(StubCompiler* stub_compiler, |
578 const ParameterCount& arguments, | 567 const ParameterCount& arguments, |
579 Register name, | 568 Register name, |
580 Code::ExtraICState extra_ic_state) | 569 Code::ExtraICState extra_ic_state) |
581 : stub_compiler_(stub_compiler), | 570 : stub_compiler_(stub_compiler), |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
675 } else { | 664 } else { |
676 // CheckPrototypes has a side effect of fetching a 'holder' | 665 // CheckPrototypes has a side effect of fetching a 'holder' |
677 // for API (object which is instanceof for the signature). It's | 666 // for API (object which is instanceof for the signature). It's |
678 // safe to omit it here, as if present, it should be fetched | 667 // safe to omit it here, as if present, it should be fetched |
679 // by the previous CheckPrototypes. | 668 // by the previous CheckPrototypes. |
680 ASSERT(depth2 == kInvalidProtoDepth); | 669 ASSERT(depth2 == kInvalidProtoDepth); |
681 } | 670 } |
682 | 671 |
683 // Invoke function. | 672 // Invoke function. |
684 if (can_do_fast_api_call) { | 673 if (can_do_fast_api_call) { |
685 GenerateFastApiCall(masm, optimization, arguments_.immediate(), false); | 674 GenerateFastApiCall(masm, optimization, arguments_.immediate()); |
686 } else { | 675 } else { |
687 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) | 676 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) |
688 ? CALL_AS_FUNCTION | 677 ? CALL_AS_FUNCTION |
689 : CALL_AS_METHOD; | 678 : CALL_AS_METHOD; |
690 Handle<JSFunction> fun = optimization.constant_function(); | 679 Handle<JSFunction> fun = optimization.constant_function(); |
691 ParameterCount expected(fun); | 680 ParameterCount expected(fun); |
692 __ InvokeFunction(fun, expected, arguments_, | 681 __ InvokeFunction(fun, expected, arguments_, |
693 JUMP_FUNCTION, NullCallWrapper(), call_kind); | 682 JUMP_FUNCTION, NullCallWrapper(), call_kind); |
694 } | 683 } |
695 | 684 |
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1091 Register StubCompiler::CheckPrototypes(Handle<JSObject> object, | 1080 Register StubCompiler::CheckPrototypes(Handle<JSObject> object, |
1092 Register object_reg, | 1081 Register object_reg, |
1093 Handle<JSObject> holder, | 1082 Handle<JSObject> holder, |
1094 Register holder_reg, | 1083 Register holder_reg, |
1095 Register scratch1, | 1084 Register scratch1, |
1096 Register scratch2, | 1085 Register scratch2, |
1097 Handle<Name> name, | 1086 Handle<Name> name, |
1098 int save_at_depth, | 1087 int save_at_depth, |
1099 Label* miss, | 1088 Label* miss, |
1100 PrototypeCheckType check) { | 1089 PrototypeCheckType check) { |
1101 const int kHolderIndex = kFastApiCallArguments + | |
1102 FunctionCallbackArguments::kHolderIndex; | |
1103 // Make sure that the type feedback oracle harvests the receiver map. | 1090 // Make sure that the type feedback oracle harvests the receiver map. |
1104 // TODO(svenpanne) Remove this hack when all ICs are reworked. | 1091 // TODO(svenpanne) Remove this hack when all ICs are reworked. |
1105 __ Move(scratch1, Handle<Map>(object->map())); | 1092 __ Move(scratch1, Handle<Map>(object->map())); |
1106 | 1093 |
1107 Handle<JSObject> first = object; | 1094 Handle<JSObject> first = object; |
1108 // Make sure there's no overlap between holder and object registers. | 1095 // Make sure there's no overlap between holder and object registers. |
1109 ASSERT(!scratch1.is(object_reg) && !scratch1.is(holder_reg)); | 1096 ASSERT(!scratch1.is(object_reg) && !scratch1.is(holder_reg)); |
1110 ASSERT(!scratch2.is(object_reg) && !scratch2.is(holder_reg) | 1097 ASSERT(!scratch2.is(object_reg) && !scratch2.is(holder_reg) |
1111 && !scratch2.is(scratch1)); | 1098 && !scratch2.is(scratch1)); |
1112 | 1099 |
1113 // Keep track of the current object in register reg. On the first | 1100 // Keep track of the current object in register reg. On the first |
1114 // iteration, reg is an alias for object_reg, on later iterations, | 1101 // iteration, reg is an alias for object_reg, on later iterations, |
1115 // it is an alias for holder_reg. | 1102 // it is an alias for holder_reg. |
1116 Register reg = object_reg; | 1103 Register reg = object_reg; |
1117 int depth = 0; | 1104 int depth = 0; |
1118 | 1105 |
1119 if (save_at_depth == depth) { | 1106 if (save_at_depth == depth) { |
1120 __ movq(Operand(rsp, kHolderIndex * kPointerSize), object_reg); | 1107 __ movq(Operand(rsp, kPCOnStackSize), object_reg); |
1121 } | 1108 } |
1122 | 1109 |
1123 // Check the maps in the prototype chain. | 1110 // Check the maps in the prototype chain. |
1124 // Traverse the prototype chain from the object and do map checks. | 1111 // Traverse the prototype chain from the object and do map checks. |
1125 Handle<JSObject> current = object; | 1112 Handle<JSObject> current = object; |
1126 while (!current.is_identical_to(holder)) { | 1113 while (!current.is_identical_to(holder)) { |
1127 ++depth; | 1114 ++depth; |
1128 | 1115 |
1129 // Only global objects and objects that do not require access | 1116 // Only global objects and objects that do not require access |
1130 // checks are allowed in stubs. | 1117 // checks are allowed in stubs. |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1170 // The prototype is in new space; we cannot store a reference to it | 1157 // The prototype is in new space; we cannot store a reference to it |
1171 // in the code. Load it from the map. | 1158 // in the code. Load it from the map. |
1172 __ movq(reg, FieldOperand(scratch1, Map::kPrototypeOffset)); | 1159 __ movq(reg, FieldOperand(scratch1, Map::kPrototypeOffset)); |
1173 } else { | 1160 } else { |
1174 // The prototype is in old space; load it directly. | 1161 // The prototype is in old space; load it directly. |
1175 __ Move(reg, prototype); | 1162 __ Move(reg, prototype); |
1176 } | 1163 } |
1177 } | 1164 } |
1178 | 1165 |
1179 if (save_at_depth == depth) { | 1166 if (save_at_depth == depth) { |
1180 __ movq(Operand(rsp, kHolderIndex * kPointerSize), reg); | 1167 __ movq(Operand(rsp, kPCOnStackSize), reg); |
1181 } | 1168 } |
1182 | 1169 |
1183 // Go to the next object in the prototype chain. | 1170 // Go to the next object in the prototype chain. |
1184 current = prototype; | 1171 current = prototype; |
1185 } | 1172 } |
1186 ASSERT(current.is_identical_to(holder)); | 1173 ASSERT(current.is_identical_to(holder)); |
1187 | 1174 |
1188 // Log the check depth. | 1175 // Log the check depth. |
1189 LOG(isolate(), IntEvent("check-maps-depth", depth + 1)); | 1176 LOG(isolate(), IntEvent("check-maps-depth", depth + 1)); |
1190 | 1177 |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1392 // The context register (rsi) has been saved in PrepareCallApiFunction and | 1379 // The context register (rsi) has been saved in PrepareCallApiFunction and |
1393 // could be used to pass arguments. | 1380 // could be used to pass arguments. |
1394 __ lea(accessor_info_arg, StackSpaceOperand(0)); | 1381 __ lea(accessor_info_arg, StackSpaceOperand(0)); |
1395 | 1382 |
1396 Address thunk_address = FUNCTION_ADDR(&InvokeAccessorGetterCallback); | 1383 Address thunk_address = FUNCTION_ADDR(&InvokeAccessorGetterCallback); |
1397 | 1384 |
1398 __ CallApiFunctionAndReturn(getter_address, | 1385 __ CallApiFunctionAndReturn(getter_address, |
1399 thunk_address, | 1386 thunk_address, |
1400 getter_arg, | 1387 getter_arg, |
1401 kStackSpace, | 1388 kStackSpace, |
1402 Operand(rbp, 6 * kPointerSize), | 1389 6); |
1403 NULL); | |
1404 } | 1390 } |
1405 | 1391 |
1406 | 1392 |
1407 void BaseLoadStubCompiler::GenerateLoadConstant(Handle<Object> value) { | 1393 void BaseLoadStubCompiler::GenerateLoadConstant(Handle<Object> value) { |
1408 // Return the constant value. | 1394 // Return the constant value. |
1409 __ LoadObject(rax, value); | 1395 __ LoadObject(rax, value); |
1410 __ ret(0); | 1396 __ ret(0); |
1411 } | 1397 } |
1412 | 1398 |
1413 | 1399 |
(...skipping 1097 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2511 | 2497 |
2512 // Check that the maps haven't changed and find a Holder as a side effect. | 2498 // Check that the maps haven't changed and find a Holder as a side effect. |
2513 CheckPrototypes(Handle<JSObject>::cast(object), rdx, holder, rbx, rax, rdi, | 2499 CheckPrototypes(Handle<JSObject>::cast(object), rdx, holder, rbx, rax, rdi, |
2514 name, depth, &miss); | 2500 name, depth, &miss); |
2515 | 2501 |
2516 // Move the return address on top of the stack. | 2502 // Move the return address on top of the stack. |
2517 __ movq(rax, | 2503 __ movq(rax, |
2518 StackOperandForReturnAddress(kFastApiCallArguments * kPointerSize)); | 2504 StackOperandForReturnAddress(kFastApiCallArguments * kPointerSize)); |
2519 __ movq(StackOperandForReturnAddress(0), rax); | 2505 __ movq(StackOperandForReturnAddress(0), rax); |
2520 | 2506 |
2521 GenerateFastApiCall(masm(), optimization, argc, false); | 2507 GenerateFastApiCall(masm(), optimization, argc); |
2522 | 2508 |
2523 __ bind(&miss); | 2509 __ bind(&miss); |
2524 __ addq(rsp, Immediate(kFastApiCallArguments * kPointerSize)); | 2510 __ addq(rsp, Immediate(kFastApiCallArguments * kPointerSize)); |
2525 | 2511 |
2526 __ bind(&miss_before_stack_reserved); | 2512 __ bind(&miss_before_stack_reserved); |
2527 GenerateMissBranch(); | 2513 GenerateMissBranch(); |
2528 | 2514 |
2529 // Return the generated code. | 2515 // Return the generated code. |
2530 return GetCode(function); | 2516 return GetCode(function); |
2531 } | 2517 } |
(...skipping 640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3172 // ----------------------------------- | 3158 // ----------------------------------- |
3173 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_MissForceGeneric); | 3159 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_MissForceGeneric); |
3174 } | 3160 } |
3175 | 3161 |
3176 | 3162 |
3177 #undef __ | 3163 #undef __ |
3178 | 3164 |
3179 } } // namespace v8::internal | 3165 } } // namespace v8::internal |
3180 | 3166 |
3181 #endif // V8_TARGET_ARCH_X64 | 3167 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |