| OLD | NEW |
| 1 //===- subzero/src/IceTargetLoweringX8632Traits.h - x86-32 traits -*- C++ -*-=// | 1 //===- subzero/src/IceTargetLoweringX8632Traits.h - x86-32 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 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 using GPRRegister = ::Ice::RegX8632::GPRRegister; | 63 using GPRRegister = ::Ice::RegX8632::GPRRegister; |
| 64 using ByteRegister = ::Ice::RegX8632::ByteRegister; | 64 using ByteRegister = ::Ice::RegX8632::ByteRegister; |
| 65 using XmmRegister = ::Ice::RegX8632::XmmRegister; | 65 using XmmRegister = ::Ice::RegX8632::XmmRegister; |
| 66 using X87STRegister = ::Ice::RegX8632::X87STRegister; | 66 using X87STRegister = ::Ice::RegX8632::X87STRegister; |
| 67 | 67 |
| 68 using Cond = ::Ice::CondX86; | 68 using Cond = ::Ice::CondX86; |
| 69 | 69 |
| 70 using RegisterSet = ::Ice::RegX8632; | 70 using RegisterSet = ::Ice::RegX8632; |
| 71 static const GPRRegister Encoded_Reg_Accumulator = RegX8632::Encoded_Reg_eax; | 71 static const GPRRegister Encoded_Reg_Accumulator = RegX8632::Encoded_Reg_eax; |
| 72 static const GPRRegister Encoded_Reg_Counter = RegX8632::Encoded_Reg_ecx; | 72 static const GPRRegister Encoded_Reg_Counter = RegX8632::Encoded_Reg_ecx; |
| 73 static const FixupKind PcRelFixup = llvm::ELF::R_386_PC32; | 73 static constexpr FixupKind FixupKindPcRel = llvm::ELF::R_386_PC32; |
| 74 static const FixupKind RelFixup = llvm::ELF::R_386_32; | 74 static constexpr FixupKind FixupKindAbs = llvm::ELF::R_386_32; |
| 75 static constexpr FixupKind FixupKindGotoff = llvm::ELF::R_386_GOTOFF; |
| 76 static constexpr FixupKind FixupKindGotPC = llvm::ELF::R_386_GOTPC; |
| 75 | 77 |
| 76 class Operand { | 78 class Operand { |
| 77 public: | 79 public: |
| 78 Operand(const Operand &other) | 80 Operand(const Operand &other) |
| 79 : fixup_(other.fixup_), length_(other.length_) { | 81 : fixup_(other.fixup_), length_(other.length_) { |
| 80 memmove(&encoding_[0], &other.encoding_[0], other.length_); | 82 memmove(&encoding_[0], &other.encoding_[0], other.length_); |
| 81 } | 83 } |
| 82 | 84 |
| 83 Operand &operator=(const Operand &other) { | 85 Operand &operator=(const Operand &other) { |
| 84 length_ = other.length_; | 86 length_ = other.length_; |
| (...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 720 enum SegmentRegisters { | 722 enum SegmentRegisters { |
| 721 DefaultSegment = -1, | 723 DefaultSegment = -1, |
| 722 #define X(val, name, prefix) val, | 724 #define X(val, name, prefix) val, |
| 723 SEG_REGX8632_TABLE | 725 SEG_REGX8632_TABLE |
| 724 #undef X | 726 #undef X |
| 725 SegReg_NUM | 727 SegReg_NUM |
| 726 }; | 728 }; |
| 727 static X86OperandMem *create(Cfg *Func, Type Ty, Variable *Base, | 729 static X86OperandMem *create(Cfg *Func, Type Ty, Variable *Base, |
| 728 Constant *Offset, Variable *Index = nullptr, | 730 Constant *Offset, Variable *Index = nullptr, |
| 729 uint16_t Shift = 0, | 731 uint16_t Shift = 0, |
| 730 SegmentRegisters SegmentReg = DefaultSegment) { | 732 SegmentRegisters SegmentReg = DefaultSegment, |
| 731 return new (Func->allocate<X86OperandMem>()) | 733 bool IsPIC = false) { |
| 732 X86OperandMem(Func, Ty, Base, Offset, Index, Shift, SegmentReg); | 734 return new (Func->allocate<X86OperandMem>()) X86OperandMem( |
| 735 Func, Ty, Base, Offset, Index, Shift, SegmentReg, IsPIC); |
| 733 } | 736 } |
| 734 Variable *getBase() const { return Base; } | 737 Variable *getBase() const { return Base; } |
| 735 Constant *getOffset() const { return Offset; } | 738 Constant *getOffset() const { return Offset; } |
| 736 Variable *getIndex() const { return Index; } | 739 Variable *getIndex() const { return Index; } |
| 737 uint16_t getShift() const { return Shift; } | 740 uint16_t getShift() const { return Shift; } |
| 738 SegmentRegisters getSegmentRegister() const { return SegmentReg; } | 741 SegmentRegisters getSegmentRegister() const { return SegmentReg; } |
| 739 void emitSegmentOverride(Assembler *Asm) const; | 742 void emitSegmentOverride(Assembler *Asm) const; |
| 743 void setIsPIC() { IsPIC = true; } |
| 744 bool getIsPIC() const { return IsPIC; } |
| 740 Address toAsmAddress(Assembler *Asm, | 745 Address toAsmAddress(Assembler *Asm, |
| 741 const Ice::TargetLowering *Target) const; | 746 const Ice::TargetLowering *Target) const; |
| 742 | 747 |
| 743 void emit(const Cfg *Func) const override; | 748 void emit(const Cfg *Func) const override; |
| 744 using X86Operand::dump; | 749 using X86Operand::dump; |
| 745 void dump(const Cfg *Func, Ostream &Str) const override; | 750 void dump(const Cfg *Func, Ostream &Str) const override; |
| 746 | 751 |
| 747 static bool classof(const Operand *Operand) { | 752 static bool classof(const Operand *Operand) { |
| 748 return Operand->getKind() == static_cast<OperandKind>(kMem); | 753 return Operand->getKind() == static_cast<OperandKind>(kMem); |
| 749 } | 754 } |
| 750 | 755 |
| 751 void setRandomized(bool R) { Randomized = R; } | 756 void setRandomized(bool R) { Randomized = R; } |
| 752 | 757 |
| 753 bool getRandomized() const { return Randomized; } | 758 bool getRandomized() const { return Randomized; } |
| 754 | 759 |
| 755 private: | 760 private: |
| 756 X86OperandMem(Cfg *Func, Type Ty, Variable *Base, Constant *Offset, | 761 X86OperandMem(Cfg *Func, Type Ty, Variable *Base, Constant *Offset, |
| 757 Variable *Index, uint16_t Shift, SegmentRegisters SegmentReg); | 762 Variable *Index, uint16_t Shift, SegmentRegisters SegmentReg, |
| 763 bool IsPIC); |
| 758 | 764 |
| 759 Variable *Base; | 765 Variable *Base; |
| 760 Constant *Offset; | 766 Constant *Offset; |
| 761 Variable *Index; | 767 Variable *Index; |
| 762 uint16_t Shift; | 768 uint16_t Shift; |
| 763 SegmentRegisters SegmentReg : 16; | 769 SegmentRegisters SegmentReg : 16; |
| 770 bool IsPIC; |
| 764 /// A flag to show if this memory operand is a randomized one. Randomized | 771 /// A flag to show if this memory operand is a randomized one. Randomized |
| 765 /// memory operands are generated in | 772 /// memory operands are generated in |
| 766 /// TargetX86Base::randomizeOrPoolImmediate() | 773 /// TargetX86Base::randomizeOrPoolImmediate() |
| 767 bool Randomized; | 774 bool Randomized = false; |
| 768 }; | 775 }; |
| 769 | 776 |
| 770 /// VariableSplit is a way to treat an f64 memory location as a pair of i32 | 777 /// VariableSplit is a way to treat an f64 memory location as a pair of i32 |
| 771 /// locations (Low and High). This is needed for some cases of the Bitcast | 778 /// locations (Low and High). This is needed for some cases of the Bitcast |
| 772 /// instruction. Since it's not possible for integer registers to access the | 779 /// instruction. Since it's not possible for integer registers to access the |
| 773 /// XMM registers and vice versa, the lowering forces the f64 to be spilled to | 780 /// XMM registers and vice versa, the lowering forces the f64 to be spilled to |
| 774 /// the stack and then accesses through the VariableSplit. | 781 /// the stack and then accesses through the VariableSplit. |
| 775 // TODO(jpp): remove references to VariableSplit from IceInstX86Base as 64bit | 782 // TODO(jpp): remove references to VariableSplit from IceInstX86Base as 64bit |
| 776 // targets can natively handle these. | 783 // targets can natively handle these. |
| 777 class VariableSplit : public X86Operand { | 784 class VariableSplit : public X86Operand { |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 867 | 874 |
| 868 } // end of namespace X86Internal | 875 } // end of namespace X86Internal |
| 869 | 876 |
| 870 namespace X8632 { | 877 namespace X8632 { |
| 871 using Traits = ::Ice::X86Internal::MachineTraits<TargetX8632>; | 878 using Traits = ::Ice::X86Internal::MachineTraits<TargetX8632>; |
| 872 } // end of namespace X8632 | 879 } // end of namespace X8632 |
| 873 | 880 |
| 874 } // end of namespace Ice | 881 } // end of namespace Ice |
| 875 | 882 |
| 876 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8632TRAITS_H | 883 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8632TRAITS_H |
| OLD | NEW |