OLD | NEW |
1 //===- subzero/src/IceTargetLoweringX8664Traits.h - x86-64 traits -*- C++ -*-=// | 1 //===- subzero/src/IceTargetLoweringX8664Traits.h - x86-64 traits -*- C++ -*-=// |
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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 | 62 |
63 using GPRRegister = ::Ice::RegX8664::GPRRegister; | 63 using GPRRegister = ::Ice::RegX8664::GPRRegister; |
64 using ByteRegister = ::Ice::RegX8664::ByteRegister; | 64 using ByteRegister = ::Ice::RegX8664::ByteRegister; |
65 using XmmRegister = ::Ice::RegX8664::XmmRegister; | 65 using XmmRegister = ::Ice::RegX8664::XmmRegister; |
66 | 66 |
67 using Cond = ::Ice::CondX8664; | 67 using Cond = ::Ice::CondX8664; |
68 | 68 |
69 using RegisterSet = ::Ice::RegX8664; | 69 using RegisterSet = ::Ice::RegX8664; |
70 static const GPRRegister Encoded_Reg_Accumulator = RegX8664::Encoded_Reg_eax; | 70 static const GPRRegister Encoded_Reg_Accumulator = RegX8664::Encoded_Reg_eax; |
71 static const GPRRegister Encoded_Reg_Counter = RegX8664::Encoded_Reg_ecx; | 71 static const GPRRegister Encoded_Reg_Counter = RegX8664::Encoded_Reg_ecx; |
72 static const FixupKind PcRelFixup = llvm::ELF::R_X86_64_PC32; | 72 static constexpr FixupKind FixupKindPcRel = llvm::ELF::R_X86_64_PC32; |
73 static const FixupKind RelFixup = llvm::ELF::R_X86_64_32S; | 73 static constexpr FixupKind FixupKindAbs = llvm::ELF::R_X86_64_32S; |
| 74 static constexpr FixupKind FixupKindGotoff = llvm::ELF::R_X86_64_GOTOFF64; |
| 75 static constexpr FixupKind FixupKindGotPC = llvm::ELF::R_X86_64_GOTPC32; |
74 | 76 |
75 class Operand { | 77 class Operand { |
76 public: | 78 public: |
77 enum RexBits { | 79 enum RexBits { |
78 RexNone = 0x00, | 80 RexNone = 0x00, |
79 RexBase = 0x40, | 81 RexBase = 0x40, |
80 RexW = RexBase | (1 << 3), | 82 RexW = RexBase | (1 << 3), |
81 RexR = RexBase | (1 << 2), | 83 RexR = RexBase | (1 << 2), |
82 RexX = RexBase | (1 << 1), | 84 RexX = RexBase | (1 << 1), |
83 RexB = RexBase | (1 << 0), | 85 RexB = RexBase | (1 << 0), |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 SetModRM(0, RegX8664::Encoded_Reg_ebp); | 260 SetModRM(0, RegX8664::Encoded_Reg_ebp); |
259 // Use the Offset in the displacement for now. If we decide to process | 261 // Use the Offset in the displacement for now. If we decide to process |
260 // fixups later, we'll need to patch up the emitted displacement. | 262 // fixups later, we'll need to patch up the emitted displacement. |
261 SetDisp32(Offset); | 263 SetDisp32(Offset); |
262 if (Fixup) | 264 if (Fixup) |
263 SetFixup(Fixup); | 265 SetFixup(Fixup); |
264 } | 266 } |
265 | 267 |
266 static Address ofConstPool(Assembler *Asm, const Constant *Imm) { | 268 static Address ofConstPool(Assembler *Asm, const Constant *Imm) { |
267 // TODO(jpp): ??? | 269 // TODO(jpp): ??? |
268 AssemblerFixup *Fixup = Asm->createFixup(RelFixup, Imm); | 270 AssemblerFixup *Fixup = Asm->createFixup(FixupKindAbs, Imm); |
269 const RelocOffsetT Offset = 4; | 271 const RelocOffsetT Offset = 4; |
270 return Address(Offset, Fixup); | 272 return Address(Offset, Fixup); |
271 } | 273 } |
272 }; | 274 }; |
273 | 275 |
274 //---------------------------------------------------------------------------- | 276 //---------------------------------------------------------------------------- |
275 // __ ______ __ __ ______ ______ __ __ __ ______ | 277 // __ ______ __ __ ______ ______ __ __ __ ______ |
276 // /\ \ /\ __ \/\ \ _ \ \/\ ___\/\ == \/\ \/\ "-.\ \/\ ___\ | 278 // /\ \ /\ __ \/\ \ _ \ \/\ ___\/\ == \/\ \/\ "-.\ \/\ ___\ |
277 // \ \ \___\ \ \/\ \ \ \/ ".\ \ \ __\\ \ __<\ \ \ \ \-. \ \ \__ \ | 279 // \ \ \___\ \ \/\ \ \ \/ ".\ \ \ __\\ \ __<\ \ \ \ \-. \ \ \__ \ |
278 // \ \_____\ \_____\ \__/".~\_\ \_____\ \_\ \_\ \_\ \_\\"\_\ \_____\ | 280 // \ \_____\ \_____\ \__/".~\_\ \_____\ \_\ \_\ \_\ \_\\"\_\ \_____\ |
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
698 class X86OperandMem : public X86Operand { | 700 class X86OperandMem : public X86Operand { |
699 X86OperandMem() = delete; | 701 X86OperandMem() = delete; |
700 X86OperandMem(const X86OperandMem &) = delete; | 702 X86OperandMem(const X86OperandMem &) = delete; |
701 X86OperandMem &operator=(const X86OperandMem &) = delete; | 703 X86OperandMem &operator=(const X86OperandMem &) = delete; |
702 | 704 |
703 public: | 705 public: |
704 enum SegmentRegisters { DefaultSegment = -1, SegReg_NUM }; | 706 enum SegmentRegisters { DefaultSegment = -1, SegReg_NUM }; |
705 static X86OperandMem * | 707 static X86OperandMem * |
706 create(Cfg *Func, Type Ty, Variable *Base, Constant *Offset, | 708 create(Cfg *Func, Type Ty, Variable *Base, Constant *Offset, |
707 Variable *Index = nullptr, uint16_t Shift = 0, | 709 Variable *Index = nullptr, uint16_t Shift = 0, |
708 SegmentRegisters SegmentRegister = DefaultSegment) { | 710 SegmentRegisters SegmentRegister = DefaultSegment, |
| 711 bool IsPIC = false) { |
709 assert(SegmentRegister == DefaultSegment); | 712 assert(SegmentRegister == DefaultSegment); |
710 (void)SegmentRegister; | 713 (void)SegmentRegister; |
711 return new (Func->allocate<X86OperandMem>()) | 714 return new (Func->allocate<X86OperandMem>()) |
712 X86OperandMem(Func, Ty, Base, Offset, Index, Shift); | 715 X86OperandMem(Func, Ty, Base, Offset, Index, Shift, IsPIC); |
713 } | 716 } |
714 Variable *getBase() const { return Base; } | 717 Variable *getBase() const { return Base; } |
715 Constant *getOffset() const { return Offset; } | 718 Constant *getOffset() const { return Offset; } |
716 Variable *getIndex() const { return Index; } | 719 Variable *getIndex() const { return Index; } |
717 uint16_t getShift() const { return Shift; } | 720 uint16_t getShift() const { return Shift; } |
718 SegmentRegisters getSegmentRegister() const { return DefaultSegment; } | 721 SegmentRegisters getSegmentRegister() const { return DefaultSegment; } |
719 void emitSegmentOverride(Assembler *) const {} | 722 void emitSegmentOverride(Assembler *) const {} |
| 723 void setIsPIC() { IsPIC = true; } |
| 724 bool getIsPIC() const { return IsPIC; } |
720 Address toAsmAddress(Assembler *Asm, | 725 Address toAsmAddress(Assembler *Asm, |
721 const Ice::TargetLowering *Target) const; | 726 const Ice::TargetLowering *Target) const; |
722 | 727 |
723 void emit(const Cfg *Func) const override; | 728 void emit(const Cfg *Func) const override; |
724 using X86Operand::dump; | 729 using X86Operand::dump; |
725 void dump(const Cfg *Func, Ostream &Str) const override; | 730 void dump(const Cfg *Func, Ostream &Str) const override; |
726 | 731 |
727 static bool classof(const Operand *Operand) { | 732 static bool classof(const Operand *Operand) { |
728 return Operand->getKind() == static_cast<OperandKind>(kMem); | 733 return Operand->getKind() == static_cast<OperandKind>(kMem); |
729 } | 734 } |
730 | 735 |
731 void setRandomized(bool R) { Randomized = R; } | 736 void setRandomized(bool R) { Randomized = R; } |
732 | 737 |
733 bool getRandomized() const { return Randomized; } | 738 bool getRandomized() const { return Randomized; } |
734 | 739 |
735 private: | 740 private: |
736 X86OperandMem(Cfg *Func, Type Ty, Variable *Base, Constant *Offset, | 741 X86OperandMem(Cfg *Func, Type Ty, Variable *Base, Constant *Offset, |
737 Variable *Index, uint16_t Shift); | 742 Variable *Index, uint16_t Shift, bool IsPIC); |
738 | 743 |
739 Variable *Base; | 744 Variable *Base; |
740 Constant *Offset; | 745 Constant *Offset; |
741 Variable *Index; | 746 Variable *Index; |
742 uint16_t Shift; | 747 uint16_t Shift; |
| 748 bool IsPIC; |
743 /// A flag to show if this memory operand is a randomized one. Randomized | 749 /// A flag to show if this memory operand is a randomized one. Randomized |
744 /// memory operands are generated in | 750 /// memory operands are generated in |
745 /// TargetX86Base::randomizeOrPoolImmediate() | 751 /// TargetX86Base::randomizeOrPoolImmediate() |
746 bool Randomized = false; | 752 bool Randomized = false; |
747 }; | 753 }; |
748 | 754 |
749 /// VariableSplit is a way to treat an f64 memory location as a pair of i32 | 755 /// VariableSplit is a way to treat an f64 memory location as a pair of i32 |
750 /// locations (Low and High). This is needed for some cases of the Bitcast | 756 /// locations (Low and High). This is needed for some cases of the Bitcast |
751 /// instruction. Since it's not possible for integer registers to access the | 757 /// instruction. Since it's not possible for integer registers to access the |
752 /// XMM registers and vice versa, the lowering forces the f64 to be spilled to | 758 /// XMM registers and vice versa, the lowering forces the f64 to be spilled to |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
842 | 848 |
843 } // end of namespace X86Internal | 849 } // end of namespace X86Internal |
844 | 850 |
845 namespace X8664 { | 851 namespace X8664 { |
846 using Traits = ::Ice::X86Internal::MachineTraits<TargetX8664>; | 852 using Traits = ::Ice::X86Internal::MachineTraits<TargetX8664>; |
847 } // end of namespace X8664 | 853 } // end of namespace X8664 |
848 | 854 |
849 } // end of namespace Ice | 855 } // end of namespace Ice |
850 | 856 |
851 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8664TRAITS_H | 857 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8664TRAITS_H |
OLD | NEW |