| OLD | NEW |
| 1 //===- subzero/src/IceTargetLoweringX8632.cpp - x86-32 lowering -----------===// | 1 //===- subzero/src/IceTargetLoweringX8632.cpp - x86-32 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 // This file implements the TargetLoweringX8632 class, which | 10 // This file implements the TargetLoweringX8632 class, which |
| (...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 599 if (Arg->hasReg()) { | 599 if (Arg->hasReg()) { |
| 600 assert(Ty != IceType_i64); | 600 assert(Ty != IceType_i64); |
| 601 OperandX8632Mem *Mem = OperandX8632Mem::create( | 601 OperandX8632Mem *Mem = OperandX8632Mem::create( |
| 602 Func, Ty, FramePtr, | 602 Func, Ty, FramePtr, |
| 603 Ctx->getConstantInt(IceType_i32, Arg->getStackOffset())); | 603 Ctx->getConstantInt(IceType_i32, Arg->getStackOffset())); |
| 604 if (isVectorType(Arg->getType())) { | 604 if (isVectorType(Arg->getType())) { |
| 605 _movp(Arg, Mem); | 605 _movp(Arg, Mem); |
| 606 } else { | 606 } else { |
| 607 _mov(Arg, Mem); | 607 _mov(Arg, Mem); |
| 608 } | 608 } |
| 609 // This argument-copying instruction uses an explicit |
| 610 // OperandX8632Mem operand instead of a Variable, so its |
| 611 // fill-from-stack operation has to be tracked separately for |
| 612 // statistics. |
| 613 Ctx->statsUpdateFills(); |
| 609 } | 614 } |
| 610 } | 615 } |
| 611 | 616 |
| 612 Type TargetX8632::stackSlotType() { return IceType_i32; } | 617 Type TargetX8632::stackSlotType() { return IceType_i32; } |
| 613 | 618 |
| 614 void TargetX8632::addProlog(CfgNode *Node) { | 619 void TargetX8632::addProlog(CfgNode *Node) { |
| 615 // Stack frame layout: | 620 // Stack frame layout: |
| 616 // | 621 // |
| 617 // +------------------------+ | 622 // +------------------------+ |
| 618 // | 1. return address | | 623 // | 1. return address | |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 739 } | 744 } |
| 740 } else { | 745 } else { |
| 741 SpillAreaSizeBytes += Increment; | 746 SpillAreaSizeBytes += Increment; |
| 742 } | 747 } |
| 743 } | 748 } |
| 744 uint32_t LocalsSpillAreaSize = SpillAreaSizeBytes; | 749 uint32_t LocalsSpillAreaSize = SpillAreaSizeBytes; |
| 745 | 750 |
| 746 SpillAreaSizeBytes += GlobalsSize; | 751 SpillAreaSizeBytes += GlobalsSize; |
| 747 | 752 |
| 748 // Add push instructions for preserved registers. | 753 // Add push instructions for preserved registers. |
| 754 uint32_t NumCallee = 0; |
| 749 for (SizeT i = 0; i < CalleeSaves.size(); ++i) { | 755 for (SizeT i = 0; i < CalleeSaves.size(); ++i) { |
| 750 if (CalleeSaves[i] && RegsUsed[i]) { | 756 if (CalleeSaves[i] && RegsUsed[i]) { |
| 757 ++NumCallee; |
| 751 PreservedRegsSizeBytes += 4; | 758 PreservedRegsSizeBytes += 4; |
| 752 const bool SuppressStackAdjustment = true; | 759 const bool SuppressStackAdjustment = true; |
| 753 _push(getPhysicalRegister(i), SuppressStackAdjustment); | 760 _push(getPhysicalRegister(i), SuppressStackAdjustment); |
| 754 } | 761 } |
| 755 } | 762 } |
| 763 Ctx->statsUpdateRegistersSaved(NumCallee); |
| 756 | 764 |
| 757 // Generate "push ebp; mov ebp, esp" | 765 // Generate "push ebp; mov ebp, esp" |
| 758 if (IsEbpBasedFrame) { | 766 if (IsEbpBasedFrame) { |
| 759 assert((RegsUsed & getRegisterSet(RegSet_FramePointer, RegSet_None)) | 767 assert((RegsUsed & getRegisterSet(RegSet_FramePointer, RegSet_None)) |
| 760 .count() == 0); | 768 .count() == 0); |
| 761 PreservedRegsSizeBytes += 4; | 769 PreservedRegsSizeBytes += 4; |
| 762 Variable *ebp = getPhysicalRegister(Reg_ebp); | 770 Variable *ebp = getPhysicalRegister(Reg_ebp); |
| 763 Variable *esp = getPhysicalRegister(Reg_esp); | 771 Variable *esp = getPhysicalRegister(Reg_esp); |
| 764 const bool SuppressStackAdjustment = true; | 772 const bool SuppressStackAdjustment = true; |
| 765 _push(ebp, SuppressStackAdjustment); | 773 _push(ebp, SuppressStackAdjustment); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 793 if (NeedsStackAlignment) { | 801 if (NeedsStackAlignment) { |
| 794 uint32_t StackOffset = X86_RET_IP_SIZE_BYTES + PreservedRegsSizeBytes; | 802 uint32_t StackOffset = X86_RET_IP_SIZE_BYTES + PreservedRegsSizeBytes; |
| 795 uint32_t StackSize = applyStackAlignment(StackOffset + SpillAreaSizeBytes); | 803 uint32_t StackSize = applyStackAlignment(StackOffset + SpillAreaSizeBytes); |
| 796 SpillAreaSizeBytes = StackSize - StackOffset; | 804 SpillAreaSizeBytes = StackSize - StackOffset; |
| 797 } | 805 } |
| 798 | 806 |
| 799 // Generate "sub esp, SpillAreaSizeBytes" | 807 // Generate "sub esp, SpillAreaSizeBytes" |
| 800 if (SpillAreaSizeBytes) | 808 if (SpillAreaSizeBytes) |
| 801 _sub(getPhysicalRegister(Reg_esp), | 809 _sub(getPhysicalRegister(Reg_esp), |
| 802 Ctx->getConstantInt(IceType_i32, SpillAreaSizeBytes)); | 810 Ctx->getConstantInt(IceType_i32, SpillAreaSizeBytes)); |
| 811 Ctx->statsUpdateFrameBytes(SpillAreaSizeBytes); |
| 803 | 812 |
| 804 resetStackAdjustment(); | 813 resetStackAdjustment(); |
| 805 | 814 |
| 806 // Fill in stack offsets for stack args, and copy args into registers | 815 // Fill in stack offsets for stack args, and copy args into registers |
| 807 // for those that were register-allocated. Args are pushed right to | 816 // for those that were register-allocated. Args are pushed right to |
| 808 // left, so Arg[0] is closest to the stack/frame pointer. | 817 // left, so Arg[0] is closest to the stack/frame pointer. |
| 809 Variable *FramePtr = getPhysicalRegister(getFrameOrStackReg()); | 818 Variable *FramePtr = getPhysicalRegister(getFrameOrStackReg()); |
| 810 size_t BasicFrameOffset = PreservedRegsSizeBytes + X86_RET_IP_SIZE_BYTES; | 819 size_t BasicFrameOffset = PreservedRegsSizeBytes + X86_RET_IP_SIZE_BYTES; |
| 811 if (!IsEbpBasedFrame) | 820 if (!IsEbpBasedFrame) |
| 812 BasicFrameOffset += SpillAreaSizeBytes; | 821 BasicFrameOffset += SpillAreaSizeBytes; |
| (...skipping 3700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4513 Str << "\t.align\t" << Align << "\n"; | 4522 Str << "\t.align\t" << Align << "\n"; |
| 4514 Str << MangledName << ":\n"; | 4523 Str << MangledName << ":\n"; |
| 4515 for (SizeT i = 0; i < Size; ++i) { | 4524 for (SizeT i = 0; i < Size; ++i) { |
| 4516 Str << "\t.byte\t" << (((unsigned)Data[i]) & 0xff) << "\n"; | 4525 Str << "\t.byte\t" << (((unsigned)Data[i]) & 0xff) << "\n"; |
| 4517 } | 4526 } |
| 4518 Str << "\t.size\t" << MangledName << ", " << Size << "\n"; | 4527 Str << "\t.size\t" << MangledName << ", " << Size << "\n"; |
| 4519 } | 4528 } |
| 4520 } | 4529 } |
| 4521 | 4530 |
| 4522 } // end of namespace Ice | 4531 } // end of namespace Ice |
| OLD | NEW |