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

Side by Side Diff: src/ppc/macro-assembler-ppc.cc

Issue 1778713002: PPC: [runtime] Unify and simplify how frames are marked (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 9 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
« no previous file with comments | « src/ppc/macro-assembler-ppc.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <assert.h> // For assert 5 #include <assert.h> // For assert
6 #include <limits.h> // For LONG_MIN, LONG_MAX. 6 #include <limits.h> // For LONG_MIN, LONG_MAX.
7 7
8 #if V8_TARGET_ARCH_PPC 8 #if V8_TARGET_ARCH_PPC
9 9
10 #include "src/base/bits.h" 10 #include "src/base/bits.h"
(...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 StoreBufferOverflowStub store_buffer_overflow(isolate(), fp_mode); 584 StoreBufferOverflowStub store_buffer_overflow(isolate(), fp_mode);
585 CallStub(&store_buffer_overflow); 585 CallStub(&store_buffer_overflow);
586 pop(r0); 586 pop(r0);
587 mtlr(r0); 587 mtlr(r0);
588 bind(&done); 588 bind(&done);
589 if (and_then == kReturnAtEnd) { 589 if (and_then == kReturnAtEnd) {
590 Ret(); 590 Ret();
591 } 591 }
592 } 592 }
593 593
594 594 void MacroAssembler::PushCommonFrame(Register marker_reg) {
595 void MacroAssembler::PushFixedFrame(Register marker_reg) { 595 int fp_delta = 0;
596 mflr(r0); 596 mflr(r0);
597 if (FLAG_enable_embedded_constant_pool) { 597 if (FLAG_enable_embedded_constant_pool) {
598 if (marker_reg.is_valid()) { 598 if (marker_reg.is_valid()) {
599 Push(r0, fp, kConstantPoolRegister, cp, marker_reg); 599 Push(r0, fp, kConstantPoolRegister, marker_reg);
600 fp_delta = 2;
600 } else { 601 } else {
601 Push(r0, fp, kConstantPoolRegister, cp); 602 Push(r0, fp, kConstantPoolRegister);
603 fp_delta = 1;
602 } 604 }
603 } else { 605 } else {
604 if (marker_reg.is_valid()) { 606 if (marker_reg.is_valid()) {
605 Push(r0, fp, cp, marker_reg); 607 Push(r0, fp, marker_reg);
608 fp_delta = 1;
606 } else { 609 } else {
607 Push(r0, fp, cp); 610 Push(r0, fp);
611 fp_delta = 0;
608 } 612 }
609 } 613 }
614 addi(fp, sp, Operand(fp_delta * kPointerSize));
610 } 615 }
611 616
612 617 void MacroAssembler::PopCommonFrame(Register marker_reg) {
613 void MacroAssembler::PopFixedFrame(Register marker_reg) {
614 if (FLAG_enable_embedded_constant_pool) { 618 if (FLAG_enable_embedded_constant_pool) {
615 if (marker_reg.is_valid()) { 619 if (marker_reg.is_valid()) {
616 Pop(r0, fp, kConstantPoolRegister, cp, marker_reg); 620 Pop(r0, fp, kConstantPoolRegister, marker_reg);
617 } else { 621 } else {
618 Pop(r0, fp, kConstantPoolRegister, cp); 622 Pop(r0, fp, kConstantPoolRegister);
619 } 623 }
620 } else { 624 } else {
621 if (marker_reg.is_valid()) { 625 if (marker_reg.is_valid()) {
622 Pop(r0, fp, cp, marker_reg); 626 Pop(r0, fp, marker_reg);
623 } else { 627 } else {
624 Pop(r0, fp, cp); 628 Pop(r0, fp);
625 } 629 }
626 } 630 }
627 mtlr(r0); 631 mtlr(r0);
628 } 632 }
629 633
634 void MacroAssembler::PushStandardFrame(Register function_reg) {
635 int fp_delta = 0;
636 mflr(r0);
637 if (FLAG_enable_embedded_constant_pool) {
638 if (function_reg.is_valid()) {
639 Push(r0, fp, kConstantPoolRegister, cp, function_reg);
640 fp_delta = 3;
641 } else {
642 Push(r0, fp, kConstantPoolRegister, cp);
643 fp_delta = 2;
644 }
645 } else {
646 if (function_reg.is_valid()) {
647 Push(r0, fp, cp, function_reg);
648 fp_delta = 2;
649 } else {
650 Push(r0, fp, cp);
651 fp_delta = 1;
652 }
653 }
654 addi(fp, sp, Operand(fp_delta * kPointerSize));
655 }
656
630 void MacroAssembler::RestoreFrameStateForTailCall() { 657 void MacroAssembler::RestoreFrameStateForTailCall() {
631 if (FLAG_enable_embedded_constant_pool) { 658 if (FLAG_enable_embedded_constant_pool) {
632 LoadP(kConstantPoolRegister, 659 LoadP(kConstantPoolRegister,
633 MemOperand(fp, StandardFrameConstants::kConstantPoolOffset)); 660 MemOperand(fp, StandardFrameConstants::kConstantPoolOffset));
634 set_constant_pool_available(false); 661 set_constant_pool_available(false);
635 } 662 }
636 LoadP(r0, MemOperand(fp, StandardFrameConstants::kCallerPCOffset)); 663 LoadP(r0, MemOperand(fp, StandardFrameConstants::kCallerPCOffset));
637 LoadP(fp, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); 664 LoadP(fp, MemOperand(fp, StandardFrameConstants::kCallerFPOffset));
638 mtlr(r0); 665 mtlr(r0);
639 } 666 }
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
863 int code_start_delta) { 890 int code_start_delta) {
864 add_label_offset(kConstantPoolRegister, base, ConstantPoolPosition(), 891 add_label_offset(kConstantPoolRegister, base, ConstantPoolPosition(),
865 code_start_delta); 892 code_start_delta);
866 } 893 }
867 894
868 895
869 void MacroAssembler::LoadConstantPoolPointerRegister() { 896 void MacroAssembler::LoadConstantPoolPointerRegister() {
870 mov_label_addr(kConstantPoolRegister, ConstantPoolPosition()); 897 mov_label_addr(kConstantPoolRegister, ConstantPoolPosition());
871 } 898 }
872 899
873 900 void MacroAssembler::StubPrologue(StackFrame::Type type, Register base,
874 void MacroAssembler::StubPrologue(Register base, int prologue_offset) { 901 int prologue_offset) {
875 LoadSmiLiteral(r11, Smi::FromInt(StackFrame::STUB)); 902 LoadSmiLiteral(r11, Smi::FromInt(type));
876 PushFixedFrame(r11); 903 PushCommonFrame(r11);
877 // Adjust FP to point to saved FP.
878 addi(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp));
879 if (FLAG_enable_embedded_constant_pool) { 904 if (FLAG_enable_embedded_constant_pool) {
880 if (!base.is(no_reg)) { 905 if (!base.is(no_reg)) {
881 // base contains prologue address 906 // base contains prologue address
882 LoadConstantPoolPointerRegister(base, -prologue_offset); 907 LoadConstantPoolPointerRegister(base, -prologue_offset);
883 } else { 908 } else {
884 LoadConstantPoolPointerRegister(); 909 LoadConstantPoolPointerRegister();
885 } 910 }
886 set_constant_pool_available(true); 911 set_constant_pool_available(true);
887 } 912 }
888 } 913 }
(...skipping 15 matching lines...) Expand all
904 intptr_t target = reinterpret_cast<intptr_t>(stub->instruction_start()); 929 intptr_t target = reinterpret_cast<intptr_t>(stub->instruction_start());
905 // Don't use Call -- we need to preserve ip and lr 930 // Don't use Call -- we need to preserve ip and lr
906 nop(); // marker to detect sequence (see IsOld) 931 nop(); // marker to detect sequence (see IsOld)
907 mov(r3, Operand(target)); 932 mov(r3, Operand(target));
908 Jump(r3); 933 Jump(r3);
909 for (int i = 0; i < kCodeAgingSequenceNops; i++) { 934 for (int i = 0; i < kCodeAgingSequenceNops; i++) {
910 nop(); 935 nop();
911 } 936 }
912 } else { 937 } else {
913 // This matches the code found in GetNoCodeAgeSequence() 938 // This matches the code found in GetNoCodeAgeSequence()
914 PushFixedFrame(r4); 939 PushStandardFrame(r4);
915 // Adjust fp to point to saved fp.
916 addi(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp));
917 for (int i = 0; i < kNoCodeAgeSequenceNops; i++) { 940 for (int i = 0; i < kNoCodeAgeSequenceNops; i++) {
918 nop(); 941 nop();
919 } 942 }
920 } 943 }
921 } 944 }
922 if (FLAG_enable_embedded_constant_pool) { 945 if (FLAG_enable_embedded_constant_pool) {
923 // base contains prologue address 946 // base contains prologue address
924 LoadConstantPoolPointerRegister(base, -prologue_offset); 947 LoadConstantPoolPointerRegister(base, -prologue_offset);
925 set_constant_pool_available(true); 948 set_constant_pool_available(true);
926 } 949 }
927 } 950 }
928 951
929 952
930 void MacroAssembler::EmitLoadTypeFeedbackVector(Register vector) { 953 void MacroAssembler::EmitLoadTypeFeedbackVector(Register vector) {
931 LoadP(vector, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); 954 LoadP(vector, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
932 LoadP(vector, FieldMemOperand(vector, JSFunction::kSharedFunctionInfoOffset)); 955 LoadP(vector, FieldMemOperand(vector, JSFunction::kSharedFunctionInfoOffset));
933 LoadP(vector, 956 LoadP(vector,
934 FieldMemOperand(vector, SharedFunctionInfo::kFeedbackVectorOffset)); 957 FieldMemOperand(vector, SharedFunctionInfo::kFeedbackVectorOffset));
935 } 958 }
936 959
937 960
938 void MacroAssembler::EnterFrame(StackFrame::Type type, 961 void MacroAssembler::EnterFrame(StackFrame::Type type,
939 bool load_constant_pool_pointer_reg) { 962 bool load_constant_pool_pointer_reg) {
940 if (FLAG_enable_embedded_constant_pool && load_constant_pool_pointer_reg) { 963 if (FLAG_enable_embedded_constant_pool && load_constant_pool_pointer_reg) {
941 PushFixedFrame(); 964 // Push type explicitly so we can leverage the constant pool.
942 // This path should not rely on ip containing code entry. 965 // This path cannot rely on ip containing code entry.
966 PushCommonFrame();
943 LoadConstantPoolPointerRegister(); 967 LoadConstantPoolPointerRegister();
944 LoadSmiLiteral(ip, Smi::FromInt(type)); 968 LoadSmiLiteral(ip, Smi::FromInt(type));
945 push(ip); 969 push(ip);
946 } else { 970 } else {
947 LoadSmiLiteral(ip, Smi::FromInt(type)); 971 LoadSmiLiteral(ip, Smi::FromInt(type));
948 PushFixedFrame(ip); 972 PushCommonFrame(ip);
949 } 973 }
950 // Adjust FP to point to saved FP. 974 if (type == StackFrame::INTERNAL) {
951 addi(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp)); 975 mov(r0, Operand(CodeObject()));
952 976 push(r0);
953 mov(r0, Operand(CodeObject())); 977 }
954 push(r0);
955 } 978 }
956 979
957 980
958 int MacroAssembler::LeaveFrame(StackFrame::Type type, int stack_adjustment) { 981 int MacroAssembler::LeaveFrame(StackFrame::Type type, int stack_adjustment) {
959 ConstantPoolUnavailableScope constant_pool_unavailable(this); 982 ConstantPoolUnavailableScope constant_pool_unavailable(this);
960 // r3: preserved 983 // r3: preserved
961 // r4: preserved 984 // r4: preserved
962 // r5: preserved 985 // r5: preserved
963 986
964 // Drop the execution stack down to the frame pointer and restore 987 // Drop the execution stack down to the frame pointer and restore
965 // the caller's state. 988 // the caller's state.
966 int frame_ends; 989 int frame_ends;
967 LoadP(r0, MemOperand(fp, StandardFrameConstants::kCallerPCOffset)); 990 LoadP(r0, MemOperand(fp, StandardFrameConstants::kCallerPCOffset));
968 LoadP(ip, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); 991 LoadP(ip, MemOperand(fp, StandardFrameConstants::kCallerFPOffset));
969 if (FLAG_enable_embedded_constant_pool) { 992 if (FLAG_enable_embedded_constant_pool) {
970 const int exitOffset = ExitFrameConstants::kConstantPoolOffset; 993 LoadP(kConstantPoolRegister,
971 const int standardOffset = StandardFrameConstants::kConstantPoolOffset; 994 MemOperand(fp, StandardFrameConstants::kConstantPoolOffset));
972 const int offset =
973 ((type == StackFrame::EXIT) ? exitOffset : standardOffset);
974 LoadP(kConstantPoolRegister, MemOperand(fp, offset));
975 } 995 }
976 mtlr(r0); 996 mtlr(r0);
977 frame_ends = pc_offset(); 997 frame_ends = pc_offset();
978 Add(sp, fp, StandardFrameConstants::kCallerSPOffset + stack_adjustment, r0); 998 Add(sp, fp, StandardFrameConstants::kCallerSPOffset + stack_adjustment, r0);
979 mr(fp, ip); 999 mr(fp, ip);
980 return frame_ends; 1000 return frame_ends;
981 } 1001 }
982 1002
983 1003
984 // ExitFrame layout (probably wrongish.. needs updating) 1004 // ExitFrame layout (probably wrongish.. needs updating)
(...skipping 16 matching lines...) Expand all
1001 // Set up the frame structure on the stack. 1021 // Set up the frame structure on the stack.
1002 DCHECK_EQ(2 * kPointerSize, ExitFrameConstants::kCallerSPDisplacement); 1022 DCHECK_EQ(2 * kPointerSize, ExitFrameConstants::kCallerSPDisplacement);
1003 DCHECK_EQ(1 * kPointerSize, ExitFrameConstants::kCallerPCOffset); 1023 DCHECK_EQ(1 * kPointerSize, ExitFrameConstants::kCallerPCOffset);
1004 DCHECK_EQ(0 * kPointerSize, ExitFrameConstants::kCallerFPOffset); 1024 DCHECK_EQ(0 * kPointerSize, ExitFrameConstants::kCallerFPOffset);
1005 DCHECK(stack_space > 0); 1025 DCHECK(stack_space > 0);
1006 1026
1007 // This is an opportunity to build a frame to wrap 1027 // This is an opportunity to build a frame to wrap
1008 // all of the pushes that have happened inside of V8 1028 // all of the pushes that have happened inside of V8
1009 // since we were called from C code 1029 // since we were called from C code
1010 1030
1011 // replicate ARM frame - TODO make this more closely follow PPC ABI 1031 LoadSmiLiteral(ip, Smi::FromInt(StackFrame::EXIT));
1012 mflr(r0); 1032 PushCommonFrame(ip);
1013 Push(r0, fp);
1014 mr(fp, sp);
1015 // Reserve room for saved entry sp and code object. 1033 // Reserve room for saved entry sp and code object.
1016 subi(sp, sp, Operand(ExitFrameConstants::kFrameSize)); 1034 subi(sp, fp, Operand(ExitFrameConstants::kFixedFrameSizeFromFp));
1017 1035
1018 if (emit_debug_code()) { 1036 if (emit_debug_code()) {
1019 li(r8, Operand::Zero()); 1037 li(r8, Operand::Zero());
1020 StoreP(r8, MemOperand(fp, ExitFrameConstants::kSPOffset)); 1038 StoreP(r8, MemOperand(fp, ExitFrameConstants::kSPOffset));
1021 } 1039 }
1022 if (FLAG_enable_embedded_constant_pool) { 1040 if (FLAG_enable_embedded_constant_pool) {
1023 StoreP(kConstantPoolRegister, 1041 StoreP(kConstantPoolRegister,
1024 MemOperand(fp, ExitFrameConstants::kConstantPoolOffset)); 1042 MemOperand(fp, ExitFrameConstants::kConstantPoolOffset));
1025 } 1043 }
1026 mov(r8, Operand(CodeObject())); 1044 mov(r8, Operand(CodeObject()));
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1091 1109
1092 void MacroAssembler::LeaveExitFrame(bool save_doubles, Register argument_count, 1110 void MacroAssembler::LeaveExitFrame(bool save_doubles, Register argument_count,
1093 bool restore_context, 1111 bool restore_context,
1094 bool argument_count_is_length) { 1112 bool argument_count_is_length) {
1095 ConstantPoolUnavailableScope constant_pool_unavailable(this); 1113 ConstantPoolUnavailableScope constant_pool_unavailable(this);
1096 // Optionally restore all double registers. 1114 // Optionally restore all double registers.
1097 if (save_doubles) { 1115 if (save_doubles) {
1098 // Calculate the stack location of the saved doubles and restore them. 1116 // Calculate the stack location of the saved doubles and restore them.
1099 const int kNumRegs = kNumCallerSavedDoubles; 1117 const int kNumRegs = kNumCallerSavedDoubles;
1100 const int offset = 1118 const int offset =
1101 (ExitFrameConstants::kFrameSize + kNumRegs * kDoubleSize); 1119 (ExitFrameConstants::kFixedFrameSizeFromFp + kNumRegs * kDoubleSize);
1102 addi(r6, fp, Operand(-offset)); 1120 addi(r6, fp, Operand(-offset));
1103 MultiPopDoubles(kCallerSavedDoubles, r6); 1121 MultiPopDoubles(kCallerSavedDoubles, r6);
1104 } 1122 }
1105 1123
1106 // Clear top frame. 1124 // Clear top frame.
1107 li(r6, Operand::Zero()); 1125 li(r6, Operand::Zero());
1108 mov(ip, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate()))); 1126 mov(ip, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate())));
1109 StoreP(r6, MemOperand(ip)); 1127 StoreP(r6, MemOperand(ip));
1110 1128
1111 // Restore current context from top and clear it in debug mode. 1129 // Restore current context from top and clear it in debug mode.
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
1470 1488
1471 1489
1472 void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg, 1490 void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
1473 Register scratch, Label* miss) { 1491 Register scratch, Label* miss) {
1474 Label same_contexts; 1492 Label same_contexts;
1475 1493
1476 DCHECK(!holder_reg.is(scratch)); 1494 DCHECK(!holder_reg.is(scratch));
1477 DCHECK(!holder_reg.is(ip)); 1495 DCHECK(!holder_reg.is(ip));
1478 DCHECK(!scratch.is(ip)); 1496 DCHECK(!scratch.is(ip));
1479 1497
1480 // Load current lexical context from the stack frame. 1498 // Load current lexical context from the active StandardFrame, which
1481 LoadP(scratch, MemOperand(fp, StandardFrameConstants::kContextOffset)); 1499 // may require crawling past STUB frames.
1500 Label load_context;
1501 Label has_context;
1502 DCHECK(!ip.is(scratch));
1503 mr(ip, fp);
1504 bind(&load_context);
1505 LoadP(scratch,
1506 MemOperand(ip, CommonFrameConstants::kContextOrFrameTypeOffset));
1507 JumpIfNotSmi(scratch, &has_context);
1508 LoadP(ip, MemOperand(ip, CommonFrameConstants::kCallerFPOffset));
1509 b(&load_context);
1510 bind(&has_context);
1511
1482 // In debug mode, make sure the lexical context is set. 1512 // In debug mode, make sure the lexical context is set.
1483 #ifdef DEBUG 1513 #ifdef DEBUG
1484 cmpi(scratch, Operand::Zero()); 1514 cmpi(scratch, Operand::Zero());
1485 Check(ne, kWeShouldNotHaveAnEmptyLexicalContext); 1515 Check(ne, kWeShouldNotHaveAnEmptyLexicalContext);
1486 #endif 1516 #endif
1487 1517
1488 // Load the native context of the current context. 1518 // Load the native context of the current context.
1489 LoadP(scratch, ContextMemOperand(scratch, Context::NATIVE_CONTEXT_INDEX)); 1519 LoadP(scratch, ContextMemOperand(scratch, Context::NATIVE_CONTEXT_INDEX));
1490 1520
1491 // Check the context is a native context. 1521 // Check the context is a native context.
(...skipping 3015 matching lines...) Expand 10 before | Expand all | Expand 10 after
4507 } 4537 }
4508 if (mag.shift > 0) srawi(result, result, mag.shift); 4538 if (mag.shift > 0) srawi(result, result, mag.shift);
4509 ExtractBit(r0, dividend, 31); 4539 ExtractBit(r0, dividend, 31);
4510 add(result, result, r0); 4540 add(result, result, r0);
4511 } 4541 }
4512 4542
4513 } // namespace internal 4543 } // namespace internal
4514 } // namespace v8 4544 } // namespace v8
4515 4545
4516 #endif // V8_TARGET_ARCH_PPC 4546 #endif // V8_TARGET_ARCH_PPC
OLDNEW
« no previous file with comments | « src/ppc/macro-assembler-ppc.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698