OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/compiler/code-generator.h" | 5 #include "src/compiler/code-generator.h" |
6 | 6 |
7 #include "src/ast/scopes.h" | 7 #include "src/ast/scopes.h" |
8 #include "src/compiler/code-generator-impl.h" | 8 #include "src/compiler/code-generator-impl.h" |
9 #include "src/compiler/gap-resolver.h" | 9 #include "src/compiler/gap-resolver.h" |
10 #include "src/compiler/node-matchers.h" | 10 #include "src/compiler/node-matchers.h" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 return MemOperand(r0); | 94 return MemOperand(r0); |
95 } | 95 } |
96 | 96 |
97 MemOperand MemoryOperand(AddressingMode* mode, size_t first_index = 0) { | 97 MemOperand MemoryOperand(AddressingMode* mode, size_t first_index = 0) { |
98 return MemoryOperand(mode, &first_index); | 98 return MemoryOperand(mode, &first_index); |
99 } | 99 } |
100 | 100 |
101 MemOperand ToMemOperand(InstructionOperand* op) const { | 101 MemOperand ToMemOperand(InstructionOperand* op) const { |
102 DCHECK(op != NULL); | 102 DCHECK(op != NULL); |
103 DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); | 103 DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); |
104 FrameOffset offset = | 104 FrameOffset offset = frame_access_state()->GetFrameOffset( |
105 linkage()->GetFrameOffset(AllocatedOperand::cast(op)->index(), frame()); | 105 AllocatedOperand::cast(op)->index()); |
106 return MemOperand(offset.from_stack_pointer() ? sp : fp, offset.offset()); | 106 return MemOperand(offset.from_stack_pointer() ? sp : fp, offset.offset()); |
107 } | 107 } |
108 }; | 108 }; |
109 | 109 |
110 | 110 |
111 static inline bool HasRegisterInput(Instruction* instr, size_t index) { | 111 static inline bool HasRegisterInput(Instruction* instr, size_t index) { |
112 return instr->InputAt(index)->IsRegister(); | 112 return instr->InputAt(index)->IsRegister(); |
113 } | 113 } |
114 | 114 |
115 | 115 |
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
603 __ bind(&done); \ | 603 __ bind(&done); \ |
604 DCHECK_EQ(LeaveRC, i.OutputRCBit()); \ | 604 DCHECK_EQ(LeaveRC, i.OutputRCBit()); \ |
605 } while (0) | 605 } while (0) |
606 | 606 |
607 | 607 |
608 void CodeGenerator::AssembleDeconstructActivationRecord(int stack_param_delta) { | 608 void CodeGenerator::AssembleDeconstructActivationRecord(int stack_param_delta) { |
609 int sp_slot_delta = TailCallFrameStackSlotDelta(stack_param_delta); | 609 int sp_slot_delta = TailCallFrameStackSlotDelta(stack_param_delta); |
610 if (sp_slot_delta > 0) { | 610 if (sp_slot_delta > 0) { |
611 __ Add(sp, sp, sp_slot_delta * kPointerSize, r0); | 611 __ Add(sp, sp, sp_slot_delta * kPointerSize, r0); |
612 } | 612 } |
613 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); | 613 if (frame()->needs_frame()) { |
614 int spill_slots = frame()->GetSpillSlotCount(); | |
615 bool has_frame = descriptor->IsJSFunctionCall() || spill_slots > 0; | |
616 if (has_frame) { | |
617 if (FLAG_enable_embedded_constant_pool) { | 614 if (FLAG_enable_embedded_constant_pool) { |
618 __ Pop(r0, fp, kConstantPoolRegister); | 615 __ Pop(r0, fp, kConstantPoolRegister); |
619 } else { | 616 } else { |
620 __ Pop(r0, fp); | 617 __ Pop(r0, fp); |
621 } | 618 } |
622 __ mtlr(r0); | 619 __ mtlr(r0); |
623 } | 620 } |
| 621 frame_access_state()->SetFrameAccessToDefault(); |
624 } | 622 } |
625 | 623 |
626 | 624 |
627 void CodeGenerator::AssemblePrepareTailCall(int stack_param_delta) { | 625 void CodeGenerator::AssemblePrepareTailCall(int stack_param_delta) { |
628 int sp_slot_delta = TailCallFrameStackSlotDelta(stack_param_delta); | 626 int sp_slot_delta = TailCallFrameStackSlotDelta(stack_param_delta); |
629 if (sp_slot_delta < 0) { | 627 if (sp_slot_delta < 0) { |
630 __ Add(sp, sp, sp_slot_delta * kPointerSize, r0); | 628 __ Add(sp, sp, sp_slot_delta * kPointerSize, r0); |
| 629 frame_access_state()->IncreaseSPDelta(-sp_slot_delta); |
631 } | 630 } |
| 631 frame_access_state()->SetFrameAccessToSP(); |
632 } | 632 } |
633 | 633 |
634 | 634 |
635 // Assembles an instruction after register allocation, producing machine code. | 635 // Assembles an instruction after register allocation, producing machine code. |
636 void CodeGenerator::AssembleArchInstruction(Instruction* instr) { | 636 void CodeGenerator::AssembleArchInstruction(Instruction* instr) { |
637 PPCOperandConverter i(this, instr); | 637 PPCOperandConverter i(this, instr); |
638 ArchOpcode opcode = ArchOpcodeField::decode(instr->opcode()); | 638 ArchOpcode opcode = ArchOpcodeField::decode(instr->opcode()); |
639 | 639 |
640 switch (opcode) { | 640 switch (opcode) { |
641 case kArchCallCodeObject: { | 641 case kArchCallCodeObject: { |
642 v8::internal::Assembler::BlockTrampolinePoolScope block_trampoline_pool( | 642 v8::internal::Assembler::BlockTrampolinePoolScope block_trampoline_pool( |
643 masm()); | 643 masm()); |
644 EnsureSpaceForLazyDeopt(); | 644 EnsureSpaceForLazyDeopt(); |
645 if (HasRegisterInput(instr, 0)) { | 645 if (HasRegisterInput(instr, 0)) { |
646 __ addi(ip, i.InputRegister(0), | 646 __ addi(ip, i.InputRegister(0), |
647 Operand(Code::kHeaderSize - kHeapObjectTag)); | 647 Operand(Code::kHeaderSize - kHeapObjectTag)); |
648 __ Call(ip); | 648 __ Call(ip); |
649 } else { | 649 } else { |
650 __ Call(Handle<Code>::cast(i.InputHeapObject(0)), | 650 __ Call(Handle<Code>::cast(i.InputHeapObject(0)), |
651 RelocInfo::CODE_TARGET); | 651 RelocInfo::CODE_TARGET); |
652 } | 652 } |
653 RecordCallPosition(instr); | 653 RecordCallPosition(instr); |
654 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 654 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 655 frame_access_state()->ClearSPDelta(); |
655 break; | 656 break; |
656 } | 657 } |
657 case kArchTailCallCodeObject: { | 658 case kArchTailCallCodeObject: { |
658 int stack_param_delta = i.InputInt32(instr->InputCount() - 1); | 659 int stack_param_delta = i.InputInt32(instr->InputCount() - 1); |
659 AssembleDeconstructActivationRecord(stack_param_delta); | 660 AssembleDeconstructActivationRecord(stack_param_delta); |
660 if (HasRegisterInput(instr, 0)) { | 661 if (HasRegisterInput(instr, 0)) { |
661 __ addi(ip, i.InputRegister(0), | 662 __ addi(ip, i.InputRegister(0), |
662 Operand(Code::kHeaderSize - kHeapObjectTag)); | 663 Operand(Code::kHeaderSize - kHeapObjectTag)); |
663 __ Jump(ip); | 664 __ Jump(ip); |
664 } else { | 665 } else { |
665 // We cannot use the constant pool to load the target since | 666 // We cannot use the constant pool to load the target since |
666 // we've already restored the caller's frame. | 667 // we've already restored the caller's frame. |
667 ConstantPoolUnavailableScope constant_pool_unavailable(masm()); | 668 ConstantPoolUnavailableScope constant_pool_unavailable(masm()); |
668 __ Jump(Handle<Code>::cast(i.InputHeapObject(0)), | 669 __ Jump(Handle<Code>::cast(i.InputHeapObject(0)), |
669 RelocInfo::CODE_TARGET); | 670 RelocInfo::CODE_TARGET); |
670 } | 671 } |
671 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 672 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 673 frame_access_state()->ClearSPDelta(); |
672 break; | 674 break; |
673 } | 675 } |
674 case kArchCallJSFunction: { | 676 case kArchCallJSFunction: { |
675 v8::internal::Assembler::BlockTrampolinePoolScope block_trampoline_pool( | 677 v8::internal::Assembler::BlockTrampolinePoolScope block_trampoline_pool( |
676 masm()); | 678 masm()); |
677 EnsureSpaceForLazyDeopt(); | 679 EnsureSpaceForLazyDeopt(); |
678 Register func = i.InputRegister(0); | 680 Register func = i.InputRegister(0); |
679 if (FLAG_debug_code) { | 681 if (FLAG_debug_code) { |
680 // Check the function's context matches the context argument. | 682 // Check the function's context matches the context argument. |
681 __ LoadP(kScratchReg, | 683 __ LoadP(kScratchReg, |
682 FieldMemOperand(func, JSFunction::kContextOffset)); | 684 FieldMemOperand(func, JSFunction::kContextOffset)); |
683 __ cmp(cp, kScratchReg); | 685 __ cmp(cp, kScratchReg); |
684 __ Assert(eq, kWrongFunctionContext); | 686 __ Assert(eq, kWrongFunctionContext); |
685 } | 687 } |
686 __ LoadP(ip, FieldMemOperand(func, JSFunction::kCodeEntryOffset)); | 688 __ LoadP(ip, FieldMemOperand(func, JSFunction::kCodeEntryOffset)); |
687 __ Call(ip); | 689 __ Call(ip); |
688 RecordCallPosition(instr); | 690 RecordCallPosition(instr); |
689 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 691 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 692 frame_access_state()->ClearSPDelta(); |
690 break; | 693 break; |
691 } | 694 } |
692 case kArchTailCallJSFunction: { | 695 case kArchTailCallJSFunction: { |
693 Register func = i.InputRegister(0); | 696 Register func = i.InputRegister(0); |
694 if (FLAG_debug_code) { | 697 if (FLAG_debug_code) { |
695 // Check the function's context matches the context argument. | 698 // Check the function's context matches the context argument. |
696 __ LoadP(kScratchReg, | 699 __ LoadP(kScratchReg, |
697 FieldMemOperand(func, JSFunction::kContextOffset)); | 700 FieldMemOperand(func, JSFunction::kContextOffset)); |
698 __ cmp(cp, kScratchReg); | 701 __ cmp(cp, kScratchReg); |
699 __ Assert(eq, kWrongFunctionContext); | 702 __ Assert(eq, kWrongFunctionContext); |
700 } | 703 } |
701 int stack_param_delta = i.InputInt32(instr->InputCount() - 1); | 704 int stack_param_delta = i.InputInt32(instr->InputCount() - 1); |
702 AssembleDeconstructActivationRecord(stack_param_delta); | 705 AssembleDeconstructActivationRecord(stack_param_delta); |
703 __ LoadP(ip, FieldMemOperand(func, JSFunction::kCodeEntryOffset)); | 706 __ LoadP(ip, FieldMemOperand(func, JSFunction::kCodeEntryOffset)); |
704 __ Jump(ip); | 707 __ Jump(ip); |
705 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 708 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 709 frame_access_state()->ClearSPDelta(); |
706 break; | 710 break; |
707 } | 711 } |
708 case kArchLazyBailout: { | 712 case kArchLazyBailout: { |
709 v8::internal::Assembler::BlockTrampolinePoolScope block_trampoline_pool( | 713 v8::internal::Assembler::BlockTrampolinePoolScope block_trampoline_pool( |
710 masm()); | 714 masm()); |
711 EnsureSpaceForLazyDeopt(); | 715 EnsureSpaceForLazyDeopt(); |
712 RecordCallPosition(instr); | 716 RecordCallPosition(instr); |
713 break; | 717 break; |
714 } | 718 } |
715 case kArchPrepareCallCFunction: { | 719 case kArchPrepareCallCFunction: { |
716 int const num_parameters = MiscField::decode(instr->opcode()); | 720 int const num_parameters = MiscField::decode(instr->opcode()); |
717 __ PrepareCallCFunction(num_parameters, kScratchReg); | 721 __ PrepareCallCFunction(num_parameters, kScratchReg); |
| 722 // Frame alignment requires using FP-relative frame addressing. |
| 723 frame_access_state()->SetFrameAccessToFP(); |
718 break; | 724 break; |
719 } | 725 } |
720 case kArchPrepareTailCall: | 726 case kArchPrepareTailCall: |
721 AssemblePrepareTailCall(i.InputInt32(instr->InputCount() - 1)); | 727 AssemblePrepareTailCall(i.InputInt32(instr->InputCount() - 1)); |
722 break; | 728 break; |
723 case kArchCallCFunction: { | 729 case kArchCallCFunction: { |
724 int const num_parameters = MiscField::decode(instr->opcode()); | 730 int const num_parameters = MiscField::decode(instr->opcode()); |
725 if (instr->InputAt(0)->IsImmediate()) { | 731 if (instr->InputAt(0)->IsImmediate()) { |
726 ExternalReference ref = i.InputExternalReference(0); | 732 ExternalReference ref = i.InputExternalReference(0); |
727 __ CallCFunction(ref, num_parameters); | 733 __ CallCFunction(ref, num_parameters); |
728 } else { | 734 } else { |
729 Register func = i.InputRegister(0); | 735 Register func = i.InputRegister(0); |
730 __ CallCFunction(func, num_parameters); | 736 __ CallCFunction(func, num_parameters); |
731 } | 737 } |
| 738 frame_access_state()->SetFrameAccessToDefault(); |
| 739 frame_access_state()->ClearSPDelta(); |
732 break; | 740 break; |
733 } | 741 } |
734 case kArchJmp: | 742 case kArchJmp: |
735 AssembleArchJump(i.InputRpo(0)); | 743 AssembleArchJump(i.InputRpo(0)); |
736 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 744 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
737 break; | 745 break; |
738 case kArchLookupSwitch: | 746 case kArchLookupSwitch: |
739 AssembleArchLookupSwitch(instr); | 747 AssembleArchLookupSwitch(instr); |
740 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 748 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
741 break; | 749 break; |
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1061 __ and_(r0, i.InputRegister(0), i.InputRegister(1), i.OutputRCBit()); | 1069 __ and_(r0, i.InputRegister(0), i.InputRegister(1), i.OutputRCBit()); |
1062 } else { | 1070 } else { |
1063 __ andi(r0, i.InputRegister(0), i.InputImmediate(1)); | 1071 __ andi(r0, i.InputRegister(0), i.InputImmediate(1)); |
1064 } | 1072 } |
1065 DCHECK_EQ(SetRC, i.OutputRCBit()); | 1073 DCHECK_EQ(SetRC, i.OutputRCBit()); |
1066 break; | 1074 break; |
1067 #endif | 1075 #endif |
1068 case kPPC_Push: | 1076 case kPPC_Push: |
1069 if (instr->InputAt(0)->IsDoubleRegister()) { | 1077 if (instr->InputAt(0)->IsDoubleRegister()) { |
1070 __ stfdu(i.InputDoubleRegister(0), MemOperand(sp, -kDoubleSize)); | 1078 __ stfdu(i.InputDoubleRegister(0), MemOperand(sp, -kDoubleSize)); |
| 1079 frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize); |
1071 } else { | 1080 } else { |
1072 __ Push(i.InputRegister(0)); | 1081 __ Push(i.InputRegister(0)); |
| 1082 frame_access_state()->IncreaseSPDelta(1); |
1073 } | 1083 } |
1074 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 1084 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
1075 break; | 1085 break; |
1076 case kPPC_PushFrame: { | 1086 case kPPC_PushFrame: { |
1077 int num_slots = i.InputInt32(1); | 1087 int num_slots = i.InputInt32(1); |
1078 if (instr->InputAt(0)->IsDoubleRegister()) { | 1088 if (instr->InputAt(0)->IsDoubleRegister()) { |
1079 __ stfdu(i.InputDoubleRegister(0), | 1089 __ stfdu(i.InputDoubleRegister(0), |
1080 MemOperand(sp, -num_slots * kPointerSize)); | 1090 MemOperand(sp, -num_slots * kPointerSize)); |
1081 } else { | 1091 } else { |
1082 __ StorePU(i.InputRegister(0), | 1092 __ StorePU(i.InputRegister(0), |
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1442 void CodeGenerator::AssembleDeoptimizerCall( | 1452 void CodeGenerator::AssembleDeoptimizerCall( |
1443 int deoptimization_id, Deoptimizer::BailoutType bailout_type) { | 1453 int deoptimization_id, Deoptimizer::BailoutType bailout_type) { |
1444 Address deopt_entry = Deoptimizer::GetDeoptimizationEntry( | 1454 Address deopt_entry = Deoptimizer::GetDeoptimizationEntry( |
1445 isolate(), deoptimization_id, bailout_type); | 1455 isolate(), deoptimization_id, bailout_type); |
1446 __ Call(deopt_entry, RelocInfo::RUNTIME_ENTRY); | 1456 __ Call(deopt_entry, RelocInfo::RUNTIME_ENTRY); |
1447 } | 1457 } |
1448 | 1458 |
1449 | 1459 |
1450 void CodeGenerator::AssemblePrologue() { | 1460 void CodeGenerator::AssemblePrologue() { |
1451 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); | 1461 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); |
1452 | 1462 if (descriptor->IsCFunctionCall()) { |
1453 if (descriptor->kind() == CallDescriptor::kCallAddress) { | |
1454 __ function_descriptor(); | 1463 __ function_descriptor(); |
1455 __ mflr(r0); | 1464 __ mflr(r0); |
1456 if (FLAG_enable_embedded_constant_pool) { | 1465 if (FLAG_enable_embedded_constant_pool) { |
1457 __ Push(r0, fp, kConstantPoolRegister); | 1466 __ Push(r0, fp, kConstantPoolRegister); |
1458 // Adjust FP to point to saved FP. | 1467 // Adjust FP to point to saved FP. |
1459 __ subi(fp, sp, Operand(StandardFrameConstants::kConstantPoolOffset)); | 1468 __ subi(fp, sp, Operand(StandardFrameConstants::kConstantPoolOffset)); |
1460 } else { | 1469 } else { |
1461 __ Push(r0, fp); | 1470 __ Push(r0, fp); |
1462 __ mr(fp, sp); | 1471 __ mr(fp, sp); |
1463 } | 1472 } |
1464 } else if (descriptor->IsJSFunctionCall()) { | 1473 } else if (descriptor->IsJSFunctionCall()) { |
1465 CompilationInfo* info = this->info(); | 1474 CompilationInfo* info = this->info(); |
1466 __ Prologue(info->IsCodePreAgingActive()); | 1475 __ Prologue(info->IsCodePreAgingActive()); |
1467 } else if (needs_frame_) { | 1476 } else if (frame()->needs_frame()) { |
1468 __ StubPrologue(); | 1477 __ StubPrologue(); |
1469 } else { | 1478 } else { |
1470 frame()->SetElidedFrameSizeInSlots(0); | 1479 frame()->SetElidedFrameSizeInSlots(0); |
1471 } | 1480 } |
| 1481 frame_access_state()->SetFrameAccessToDefault(); |
1472 | 1482 |
1473 int stack_shrink_slots = frame()->GetSpillSlotCount(); | 1483 int stack_shrink_slots = frame()->GetSpillSlotCount(); |
1474 if (info()->is_osr()) { | 1484 if (info()->is_osr()) { |
1475 // TurboFan OSR-compiled functions cannot be entered directly. | 1485 // TurboFan OSR-compiled functions cannot be entered directly. |
1476 __ Abort(kShouldNotDirectlyEnterOsrFunction); | 1486 __ Abort(kShouldNotDirectlyEnterOsrFunction); |
1477 | 1487 |
1478 // Unoptimized code jumps directly to this entrypoint while the unoptimized | 1488 // Unoptimized code jumps directly to this entrypoint while the unoptimized |
1479 // frame is still on the stack. Optimized code uses OSR values directly from | 1489 // frame is still on the stack. Optimized code uses OSR values directly from |
1480 // the unoptimized frame. Thus, all that needs to be done is to allocate the | 1490 // the unoptimized frame. Thus, all that needs to be done is to allocate the |
1481 // remaining stack slots. | 1491 // remaining stack slots. |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1531 if (saves != 0) { | 1541 if (saves != 0) { |
1532 __ MultiPop(saves); | 1542 __ MultiPop(saves); |
1533 } | 1543 } |
1534 | 1544 |
1535 // Restore double registers. | 1545 // Restore double registers. |
1536 const RegList double_saves = descriptor->CalleeSavedFPRegisters(); | 1546 const RegList double_saves = descriptor->CalleeSavedFPRegisters(); |
1537 if (double_saves != 0) { | 1547 if (double_saves != 0) { |
1538 __ MultiPopDoubles(double_saves); | 1548 __ MultiPopDoubles(double_saves); |
1539 } | 1549 } |
1540 | 1550 |
1541 if (descriptor->kind() == CallDescriptor::kCallAddress) { | 1551 if (descriptor->IsCFunctionCall()) { |
1542 __ LeaveFrame(StackFrame::MANUAL, pop_count * kPointerSize); | 1552 __ LeaveFrame(StackFrame::MANUAL, pop_count * kPointerSize); |
1543 } else if (descriptor->IsJSFunctionCall() || needs_frame_) { | 1553 } else if (frame()->needs_frame()) { |
1544 // Canonicalize JSFunction return sites for now. | 1554 // Canonicalize JSFunction return sites for now. |
1545 if (return_label_.is_bound()) { | 1555 if (return_label_.is_bound()) { |
1546 __ b(&return_label_); | 1556 __ b(&return_label_); |
1547 return; | 1557 return; |
1548 } else { | 1558 } else { |
1549 __ bind(&return_label_); | 1559 __ bind(&return_label_); |
1550 __ LeaveFrame(StackFrame::MANUAL, pop_count * kPointerSize); | 1560 __ LeaveFrame(StackFrame::MANUAL, pop_count * kPointerSize); |
1551 } | 1561 } |
1552 } else { | 1562 } else { |
1553 __ Drop(pop_count); | 1563 __ Drop(pop_count); |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1759 padding_size -= v8::internal::Assembler::kInstrSize; | 1769 padding_size -= v8::internal::Assembler::kInstrSize; |
1760 } | 1770 } |
1761 } | 1771 } |
1762 } | 1772 } |
1763 | 1773 |
1764 #undef __ | 1774 #undef __ |
1765 | 1775 |
1766 } // namespace compiler | 1776 } // namespace compiler |
1767 } // namespace internal | 1777 } // namespace internal |
1768 } // namespace v8 | 1778 } // namespace v8 |
OLD | NEW |