OLD | NEW |
1 //===- subzero/src/IceTargetLoweringARM32.cpp - ARM32 lowering ------------===// | 1 //===- subzero/src/IceTargetLoweringARM32.cpp - ARM32 lowering ------------===// |
2 // | 2 // |
3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 /// | 9 /// |
10 /// \file | 10 /// \file |
(...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
569 // Helper function for addProlog(). | 569 // Helper function for addProlog(). |
570 // | 570 // |
571 // This assumes Arg is an argument passed on the stack. This sets the frame | 571 // This assumes Arg is an argument passed on the stack. This sets the frame |
572 // offset for Arg and updates InArgsSizeBytes according to Arg's width. For an | 572 // offset for Arg and updates InArgsSizeBytes according to Arg's width. For an |
573 // I64 arg that has been split into Lo and Hi components, it calls itself | 573 // I64 arg that has been split into Lo and Hi components, it calls itself |
574 // recursively on the components, taking care to handle Lo first because of the | 574 // recursively on the components, taking care to handle Lo first because of the |
575 // little-endian architecture. Lastly, this function generates an instruction | 575 // little-endian architecture. Lastly, this function generates an instruction |
576 // to copy Arg into its assigned register if applicable. | 576 // to copy Arg into its assigned register if applicable. |
577 void TargetARM32::finishArgumentLowering(Variable *Arg, Variable *FramePtr, | 577 void TargetARM32::finishArgumentLowering(Variable *Arg, Variable *FramePtr, |
578 size_t BasicFrameOffset, | 578 size_t BasicFrameOffset, |
| 579 size_t StackAdjBytes, |
579 size_t &InArgsSizeBytes) { | 580 size_t &InArgsSizeBytes) { |
580 if (auto *Arg64On32 = llvm::dyn_cast<Variable64On32>(Arg)) { | 581 if (auto *Arg64On32 = llvm::dyn_cast<Variable64On32>(Arg)) { |
581 Variable *Lo = Arg64On32->getLo(); | 582 Variable *Lo = Arg64On32->getLo(); |
582 Variable *Hi = Arg64On32->getHi(); | 583 Variable *Hi = Arg64On32->getHi(); |
583 finishArgumentLowering(Lo, FramePtr, BasicFrameOffset, InArgsSizeBytes); | 584 finishArgumentLowering(Lo, FramePtr, BasicFrameOffset, StackAdjBytes, |
584 finishArgumentLowering(Hi, FramePtr, BasicFrameOffset, InArgsSizeBytes); | 585 InArgsSizeBytes); |
| 586 finishArgumentLowering(Hi, FramePtr, BasicFrameOffset, StackAdjBytes, |
| 587 InArgsSizeBytes); |
585 return; | 588 return; |
586 } | 589 } |
587 Type Ty = Arg->getType(); | 590 Type Ty = Arg->getType(); |
588 InArgsSizeBytes = applyStackAlignmentTy(InArgsSizeBytes, Ty); | 591 InArgsSizeBytes = applyStackAlignmentTy(InArgsSizeBytes, Ty); |
589 Arg->setStackOffset(BasicFrameOffset + InArgsSizeBytes); | 592 Arg->setStackOffset(BasicFrameOffset + InArgsSizeBytes); |
590 InArgsSizeBytes += typeWidthInBytesOnStack(Ty); | 593 InArgsSizeBytes += typeWidthInBytesOnStack(Ty); |
591 // If the argument variable has been assigned a register, we need to load the | 594 // If the argument variable has been assigned a register, we need to load the |
592 // value from the stack slot. | 595 // value from the stack slot. |
593 if (Arg->hasReg()) { | 596 if (Arg->hasReg()) { |
594 assert(Ty != IceType_i64); | 597 assert(Ty != IceType_i64); |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
770 int32_t DummyReg; | 773 int32_t DummyReg; |
771 InRegs = CC.FPInReg(Ty, &DummyReg); | 774 InRegs = CC.FPInReg(Ty, &DummyReg); |
772 } else if (Ty == IceType_i64) { | 775 } else if (Ty == IceType_i64) { |
773 std::pair<int32_t, int32_t> DummyRegs; | 776 std::pair<int32_t, int32_t> DummyRegs; |
774 InRegs = CC.I64InRegs(&DummyRegs); | 777 InRegs = CC.I64InRegs(&DummyRegs); |
775 } else { | 778 } else { |
776 assert(Ty == IceType_i32); | 779 assert(Ty == IceType_i32); |
777 int32_t DummyReg; | 780 int32_t DummyReg; |
778 InRegs = CC.I32InReg(&DummyReg); | 781 InRegs = CC.I32InReg(&DummyReg); |
779 } | 782 } |
780 if (!InRegs) | 783 if (!InRegs) { |
781 finishArgumentLowering(Arg, FramePtr, BasicFrameOffset, InArgsSizeBytes); | 784 constexpr size_t StackAdjBytes = 0; |
| 785 finishArgumentLowering(Arg, FramePtr, BasicFrameOffset, StackAdjBytes, |
| 786 InArgsSizeBytes); |
| 787 } |
782 } | 788 } |
783 | 789 |
784 // Fill in stack offsets for locals. | 790 // Fill in stack offsets for locals. |
785 assignVarStackSlots(SortedSpilledVariables, SpillAreaPaddingBytes, | 791 assignVarStackSlots(SortedSpilledVariables, SpillAreaPaddingBytes, |
786 SpillAreaSizeBytes, GlobalsAndSubsequentPaddingSize, | 792 SpillAreaSizeBytes, GlobalsAndSubsequentPaddingSize, |
787 UsesFramePointer); | 793 UsesFramePointer); |
788 this->HasComputedFrame = true; | 794 this->HasComputedFrame = true; |
789 | 795 |
790 if (BuildDefs::dump() && Func->isVerbose(IceV_Frame)) { | 796 if (BuildDefs::dump() && Func->isVerbose(IceV_Frame)) { |
791 OstreamLocker L(Func->getContext()); | 797 OstreamLocker L(Func->getContext()); |
(...skipping 2562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3354 << ".eabi_attribute 68, 1 @ Tag_Virtualization_use\n"; | 3360 << ".eabi_attribute 68, 1 @ Tag_Virtualization_use\n"; |
3355 if (CPUFeatures.hasFeature(TargetARM32Features::HWDivArm)) { | 3361 if (CPUFeatures.hasFeature(TargetARM32Features::HWDivArm)) { |
3356 Str << ".eabi_attribute 44, 2 @ Tag_DIV_use\n"; | 3362 Str << ".eabi_attribute 44, 2 @ Tag_DIV_use\n"; |
3357 } | 3363 } |
3358 // Technically R9 is used for TLS with Sandboxing, and we reserve it. | 3364 // Technically R9 is used for TLS with Sandboxing, and we reserve it. |
3359 // However, for compatibility with current NaCl LLVM, don't claim that. | 3365 // However, for compatibility with current NaCl LLVM, don't claim that. |
3360 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n"; | 3366 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n"; |
3361 } | 3367 } |
3362 | 3368 |
3363 } // end of namespace Ice | 3369 } // end of namespace Ice |
OLD | NEW |