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

Side by Side Diff: src/IceTargetLoweringMIPS32.cpp

Issue 2166643003: [Subzero][MIPS32] Fix stack offset assignment of spilled variables on MIPS32 (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Created 4 years, 5 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/IceTargetLoweringMIPS32.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 // 1 //
2 // The Subzero Code Generator 2 // The Subzero Code Generator
3 // 3 //
4 // This file is distributed under the University of Illinois Open Source 4 // This file is distributed under the University of Illinois Open Source
5 // License. See LICENSE.TXT for details. 5 // License. See LICENSE.TXT for details.
6 // 6 //
7 //===----------------------------------------------------------------------===// 7 //===----------------------------------------------------------------------===//
8 /// 8 ///
9 /// \file 9 /// \file
10 /// \brief Implements the TargetLoweringMIPS32 class, which consists almost 10 /// \brief Implements the TargetLoweringMIPS32 class, which consists almost
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 // Value is in bytes. Return Value adjusted to the next highest multiple of the 98 // Value is in bytes. Return Value adjusted to the next highest multiple of the
99 // stack alignment. 99 // stack alignment.
100 uint32_t applyStackAlignment(uint32_t Value) { 100 uint32_t applyStackAlignment(uint32_t Value) {
101 return Utils::applyAlignment(Value, MIPS32_STACK_ALIGNMENT_BYTES); 101 return Utils::applyAlignment(Value, MIPS32_STACK_ALIGNMENT_BYTES);
102 } 102 }
103 103
104 } // end of anonymous namespace 104 } // end of anonymous namespace
105 105
106 TargetMIPS32::TargetMIPS32(Cfg *Func) : TargetLowering(Func) {} 106 TargetMIPS32::TargetMIPS32(Cfg *Func) : TargetLowering(Func) {}
107 107
108 void TargetMIPS32::assignVarStackSlots(VarList &SortedSpilledVariables,
109 size_t SpillAreaPaddingBytes,
110 size_t SpillAreaSizeBytes,
111 size_t GlobalsAndSubsequentPaddingSize) {
112 const VariablesMetadata *VMetadata = Func->getVMetadata();
113 size_t GlobalsSpaceUsed = SpillAreaPaddingBytes;
114 size_t NextStackOffset = SpillAreaPaddingBytes;
115 CfgVector<size_t> LocalsSize(Func->getNumNodes());
116 const bool SimpleCoalescing = !callsReturnsTwice();
117
118 for (Variable *Var : SortedSpilledVariables) {
119 size_t Increment = typeWidthInBytesOnStack(Var->getType());
120 if (SimpleCoalescing && VMetadata->isTracked(Var)) {
121 if (VMetadata->isMultiBlock(Var)) {
122 GlobalsSpaceUsed += Increment;
123 NextStackOffset = GlobalsSpaceUsed;
124 } else {
125 SizeT NodeIndex = VMetadata->getLocalUseNode(Var)->getIndex();
126 LocalsSize[NodeIndex] += Increment;
127 NextStackOffset = SpillAreaPaddingBytes +
128 GlobalsAndSubsequentPaddingSize +
129 LocalsSize[NodeIndex];
130 }
131 } else {
132 NextStackOffset += Increment;
133 }
134 Var->setStackOffset(SpillAreaSizeBytes - NextStackOffset);
135 }
136 }
137
108 void TargetMIPS32::staticInit(GlobalContext *Ctx) { 138 void TargetMIPS32::staticInit(GlobalContext *Ctx) {
109 (void)Ctx; 139 (void)Ctx;
110 RegNumT::setLimit(RegMIPS32::Reg_NUM); 140 RegNumT::setLimit(RegMIPS32::Reg_NUM);
111 SmallBitVector IntegerRegisters(RegMIPS32::Reg_NUM); 141 SmallBitVector IntegerRegisters(RegMIPS32::Reg_NUM);
112 SmallBitVector I64PairRegisters(RegMIPS32::Reg_NUM); 142 SmallBitVector I64PairRegisters(RegMIPS32::Reg_NUM);
113 SmallBitVector Float32Registers(RegMIPS32::Reg_NUM); 143 SmallBitVector Float32Registers(RegMIPS32::Reg_NUM);
114 SmallBitVector Float64Registers(RegMIPS32::Reg_NUM); 144 SmallBitVector Float64Registers(RegMIPS32::Reg_NUM);
115 SmallBitVector VectorRegisters(RegMIPS32::Reg_NUM); 145 SmallBitVector VectorRegisters(RegMIPS32::Reg_NUM);
116 SmallBitVector InvalidRegisters(RegMIPS32::Reg_NUM); 146 SmallBitVector InvalidRegisters(RegMIPS32::Reg_NUM);
117 #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ 147 #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \
(...skipping 728 matching lines...) Expand 10 before | Expand all | Expand 10 after
846 uint32_t SpillAreaPaddingBytes = 0; 876 uint32_t SpillAreaPaddingBytes = 0;
847 uint32_t LocalsSlotsPaddingBytes = 0; 877 uint32_t LocalsSlotsPaddingBytes = 0;
848 alignStackSpillAreas(PreservedRegsSizeBytes, SpillAreaAlignmentBytes, 878 alignStackSpillAreas(PreservedRegsSizeBytes, SpillAreaAlignmentBytes,
849 GlobalsSize, LocalsSlotsAlignmentBytes, 879 GlobalsSize, LocalsSlotsAlignmentBytes,
850 &SpillAreaPaddingBytes, &LocalsSlotsPaddingBytes); 880 &SpillAreaPaddingBytes, &LocalsSlotsPaddingBytes);
851 SpillAreaSizeBytes += SpillAreaPaddingBytes + LocalsSlotsPaddingBytes; 881 SpillAreaSizeBytes += SpillAreaPaddingBytes + LocalsSlotsPaddingBytes;
852 uint32_t GlobalsAndSubsequentPaddingSize = 882 uint32_t GlobalsAndSubsequentPaddingSize =
853 GlobalsSize + LocalsSlotsPaddingBytes; 883 GlobalsSize + LocalsSlotsPaddingBytes;
854 884
855 // Adds the out args space to the stack, and align SP if necessary. 885 // Adds the out args space to the stack, and align SP if necessary.
856 TotalStackSizeBytes = PreservedRegsSizeBytes + SpillAreaSizeBytes + 886 if (!NeedsStackAlignment) {
857 FixedAllocaSizeBytes + 887 SpillAreaSizeBytes += MaxOutArgsSizeBytes * (VariableAllocaUsed ? 0 : 1);
858 (MaxOutArgsSizeBytes * (VariableAllocaUsed ? 0 : 1)); 888 } else {
889 uint32_t StackOffset = PreservedRegsSizeBytes;
890 uint32_t StackSize = applyStackAlignment(StackOffset + SpillAreaSizeBytes);
891 if (!VariableAllocaUsed)
892 StackSize = applyStackAlignment(StackSize + MaxOutArgsSizeBytes);
893 SpillAreaSizeBytes = StackSize - StackOffset;
894 }
895
896 // Combine fixed alloca with SpillAreaSize.
897 SpillAreaSizeBytes += FixedAllocaSizeBytes;
898
899 TotalStackSizeBytes = PreservedRegsSizeBytes + SpillAreaSizeBytes;
859 900
860 // Generate "addiu sp, sp, -TotalStackSizeBytes" 901 // Generate "addiu sp, sp, -TotalStackSizeBytes"
861 if (TotalStackSizeBytes) { 902 if (TotalStackSizeBytes) {
862 // Use the scratch register if needed to legalize the immediate. 903 // Use the scratch register if needed to legalize the immediate.
863 Variable *SP = getPhysicalRegister(RegMIPS32::Reg_SP); 904 Variable *SP = getPhysicalRegister(RegMIPS32::Reg_SP);
864 _addiu(SP, SP, -(TotalStackSizeBytes)); 905 _addiu(SP, SP, -(TotalStackSizeBytes));
865 } 906 }
866 907
867 Ctx->statsUpdateFrameBytes(TotalStackSizeBytes); 908 Ctx->statsUpdateFrameBytes(TotalStackSizeBytes);
868 909
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
904 if (CC.argInReg(Ty, ArgNo, &DummyReg)) { 945 if (CC.argInReg(Ty, ArgNo, &DummyReg)) {
905 ArgNo++; 946 ArgNo++;
906 continue; 947 continue;
907 } else { 948 } else {
908 finishArgumentLowering(Arg, FP, TotalStackSizeBytes, &InArgsSizeBytes); 949 finishArgumentLowering(Arg, FP, TotalStackSizeBytes, &InArgsSizeBytes);
909 } 950 }
910 } 951 }
911 952
912 // Fill in stack offsets for locals. 953 // Fill in stack offsets for locals.
913 assignVarStackSlots(SortedSpilledVariables, SpillAreaPaddingBytes, 954 assignVarStackSlots(SortedSpilledVariables, SpillAreaPaddingBytes,
914 SpillAreaSizeBytes, GlobalsAndSubsequentPaddingSize, 955 SpillAreaSizeBytes, GlobalsAndSubsequentPaddingSize);
915 UsesFramePointer);
916 this->HasComputedFrame = true; 956 this->HasComputedFrame = true;
917 957
918 if (BuildDefs::dump() && Func->isVerbose(IceV_Frame)) { 958 if (BuildDefs::dump() && Func->isVerbose(IceV_Frame)) {
919 OstreamLocker _(Func->getContext()); 959 OstreamLocker _(Func->getContext());
920 Ostream &Str = Func->getContext()->getStrDump(); 960 Ostream &Str = Func->getContext()->getStrDump();
921 961
922 Str << "Stack layout:\n"; 962 Str << "Stack layout:\n";
923 uint32_t SPAdjustmentPaddingSize = 963 uint32_t SPAdjustmentPaddingSize =
924 SpillAreaSizeBytes - LocalsSpillAreaSize - 964 SpillAreaSizeBytes - LocalsSpillAreaSize -
925 GlobalsAndSubsequentPaddingSize - SpillAreaPaddingBytes - 965 GlobalsAndSubsequentPaddingSize - SpillAreaPaddingBytes -
(...skipping 1605 matching lines...) Expand 10 before | Expand all | Expand 10 after
2531 Str << "\t.set\t" 2571 Str << "\t.set\t"
2532 << "nomips16\n"; 2572 << "nomips16\n";
2533 } 2573 }
2534 2574
2535 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; 2575 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM];
2536 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; 2576 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM];
2537 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; 2577 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM];
2538 2578
2539 } // end of namespace MIPS32 2579 } // end of namespace MIPS32
2540 } // end of namespace Ice 2580 } // end of namespace Ice
OLDNEW
« no previous file with comments | « src/IceTargetLoweringMIPS32.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698