| OLD | NEW | 
|---|
| 1 //===- subzero/src/IceTargetLoweringX86Base.h - x86 lowering ----*- C++ -*-===// | 1 //===- subzero/src/IceTargetLoweringX86Base.h - x86 lowering ----*- 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 61 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 72   using X86OperandMem = typename Traits::X86OperandMem; | 72   using X86OperandMem = typename Traits::X86OperandMem; | 
| 73   using SegmentRegisters = typename Traits::X86OperandMem::SegmentRegisters; | 73   using SegmentRegisters = typename Traits::X86OperandMem::SegmentRegisters; | 
| 74   using SpillVariable = typename Traits::SpillVariable; | 74   using SpillVariable = typename Traits::SpillVariable; | 
| 75 | 75 | 
| 76   using InstX86Br = typename Traits::Insts::Br; | 76   using InstX86Br = typename Traits::Insts::Br; | 
| 77   using InstX86FakeRMW = typename Traits::Insts::FakeRMW; | 77   using InstX86FakeRMW = typename Traits::Insts::FakeRMW; | 
| 78   using InstX86Label = typename Traits::Insts::Label; | 78   using InstX86Label = typename Traits::Insts::Label; | 
| 79 | 79 | 
| 80   ~TargetX86Base() override = default; | 80   ~TargetX86Base() override = default; | 
| 81 | 81 | 
| 82   static void staticInit(); | 82   static void staticInit(const ClFlags &Flags); | 
| 83   static TargetX86Base *create(Cfg *Func) { return new TargetX86Base(Func); } | 83   static TargetX86Base *create(Cfg *Func) { return new TargetX86Base(Func); } | 
| 84 | 84 | 
|  | 85   static FixupKind getPcRelFixup() { return PcRelFixup; } | 
|  | 86   static FixupKind getAbsFixup() { return AbsFixup; } | 
|  | 87 | 
| 85   void translateOm1() override; | 88   void translateOm1() override; | 
| 86   void translateO2() override; | 89   void translateO2() override; | 
| 87   void doLoadOpt(); | 90   void doLoadOpt(); | 
| 88   bool doBranchOpt(Inst *I, const CfgNode *NextNode) override; | 91   bool doBranchOpt(Inst *I, const CfgNode *NextNode) override; | 
| 89 | 92 | 
| 90   SizeT getNumRegisters() const override { | 93   SizeT getNumRegisters() const override { | 
| 91     return Traits::RegisterSet::Reg_NUM; | 94     return Traits::RegisterSet::Reg_NUM; | 
| 92   } | 95   } | 
| 93   Variable *getPhysicalRegister(SizeT RegNum, Type Ty = IceType_void) override; | 96   Variable *getPhysicalRegister(SizeT RegNum, Type Ty = IceType_void) override; | 
| 94   IceString getRegName(SizeT RegNum, Type Ty) const override; | 97   IceString getRegName(SizeT RegNum, Type Ty) const override; | 
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 139   } | 142   } | 
| 140 | 143 | 
| 141   bool shouldSplitToVariable64On32(Type Ty) const override { | 144   bool shouldSplitToVariable64On32(Type Ty) const override { | 
| 142     return Traits::Is64Bit ? false : Ty == IceType_i64; | 145     return Traits::Is64Bit ? false : Ty == IceType_i64; | 
| 143   } | 146   } | 
| 144 | 147 | 
| 145   SizeT getMinJumpTableSize() const override { return 4; } | 148   SizeT getMinJumpTableSize() const override { return 4; } | 
| 146 | 149 | 
| 147   void emitVariable(const Variable *Var) const override; | 150   void emitVariable(const Variable *Var) const override; | 
| 148 | 151 | 
| 149   const char *getConstantPrefix() const final { return "$"; } |  | 
| 150   void emit(const ConstantUndef *C) const final; |  | 
| 151   void emit(const ConstantInteger32 *C) const final; | 152   void emit(const ConstantInteger32 *C) const final; | 
| 152   void emit(const ConstantInteger64 *C) const final; | 153   void emit(const ConstantInteger64 *C) const final; | 
| 153   void emit(const ConstantFloat *C) const final; | 154   void emit(const ConstantFloat *C) const final; | 
| 154   void emit(const ConstantDouble *C) const final; | 155   void emit(const ConstantDouble *C) const final; | 
|  | 156   void emit(const ConstantUndef *C) const final; | 
|  | 157   void emit(const ConstantRelocatable *C) const final; | 
| 155 | 158 | 
| 156   void initNodeForLowering(CfgNode *Node) override; | 159   void initNodeForLowering(CfgNode *Node) override; | 
| 157 | 160 | 
| 158   template <typename T = Traits> | 161   template <typename T = Traits> | 
| 159   typename std::enable_if<!T::Is64Bit, Operand>::type * | 162   typename std::enable_if<!T::Is64Bit, Operand>::type * | 
| 160   loOperand(Operand *Operand); | 163   loOperand(Operand *Operand); | 
| 161   template <typename T = Traits> | 164   template <typename T = Traits> | 
| 162   typename std::enable_if<T::Is64Bit, Operand>::type *loOperand(Operand *) { | 165   typename std::enable_if<T::Is64Bit, Operand>::type *loOperand(Operand *) { | 
| 163     llvm::report_fatal_error( | 166     llvm::report_fatal_error( | 
| 164         "Hey, yo! This is x86-64. Watcha doin'? (loOperand)"); | 167         "Hey, yo! This is x86-64. Watcha doin'? (loOperand)"); | 
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 277   /// that the Operand kind is one of those indicated by the LegalMask (a | 280   /// that the Operand kind is one of those indicated by the LegalMask (a | 
| 278   /// bitmask of allowed kinds). If the input Operand is known to already meet | 281   /// bitmask of allowed kinds). If the input Operand is known to already meet | 
| 279   /// the constraints, it may be simply returned as the result, without creating | 282   /// the constraints, it may be simply returned as the result, without creating | 
| 280   /// any new instructions or operands. | 283   /// any new instructions or operands. | 
| 281   enum OperandLegalization { | 284   enum OperandLegalization { | 
| 282     Legal_None = 0, | 285     Legal_None = 0, | 
| 283     Legal_Reg = 1 << 0, // physical register, not stack location | 286     Legal_Reg = 1 << 0, // physical register, not stack location | 
| 284     Legal_Imm = 1 << 1, | 287     Legal_Imm = 1 << 1, | 
| 285     Legal_Mem = 1 << 2, // includes [eax+4*ecx] as well as [esp+12] | 288     Legal_Mem = 1 << 2, // includes [eax+4*ecx] as well as [esp+12] | 
| 286     Legal_Rematerializable = 1 << 3, | 289     Legal_Rematerializable = 1 << 3, | 
| 287     Legal_All = ~Legal_Rematerializable | 290     Legal_AddrAbs = 1 << 4, // ConstantRelocatable doesn't have to add GotVar | 
|  | 291     Legal_Default = ~(Legal_Rematerializable | Legal_AddrAbs) | 
|  | 292     // TODO(stichnot): Figure out whether this default works for x86-64. | 
| 288   }; | 293   }; | 
| 289   using LegalMask = uint32_t; | 294   using LegalMask = uint32_t; | 
| 290   Operand *legalize(Operand *From, LegalMask Allowed = Legal_All, | 295   Operand *legalize(Operand *From, LegalMask Allowed = Legal_Default, | 
| 291                     int32_t RegNum = Variable::NoRegister); | 296                     int32_t RegNum = Variable::NoRegister); | 
| 292   Variable *legalizeToReg(Operand *From, int32_t RegNum = Variable::NoRegister); | 297   Variable *legalizeToReg(Operand *From, int32_t RegNum = Variable::NoRegister); | 
| 293   /// Legalize the first source operand for use in the cmp instruction. | 298   /// Legalize the first source operand for use in the cmp instruction. | 
| 294   Operand *legalizeSrc0ForCmp(Operand *Src0, Operand *Src1); | 299   Operand *legalizeSrc0ForCmp(Operand *Src0, Operand *Src1); | 
| 295   /// Turn a pointer operand into a memory operand that can be used by a real | 300   /// Turn a pointer operand into a memory operand that can be used by a real | 
| 296   /// load/store operation. Legalizes the operand as well. This is a nop if the | 301   /// load/store operation. Legalizes the operand as well. This is a nop if the | 
| 297   /// operand is already a legal memory operand. | 302   /// operand is already a legal memory operand. | 
| 298   X86OperandMem *formMemoryOperand(Operand *Ptr, Type Ty, | 303   X86OperandMem *formMemoryOperand(Operand *Ptr, Type Ty, | 
| 299                                    bool DoLegalize = true); | 304                                    bool DoLegalize = true); | 
| 300 | 305 | 
| (...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 737   size_t FixedAllocaSizeBytes = 0; | 742   size_t FixedAllocaSizeBytes = 0; | 
| 738   size_t FixedAllocaAlignBytes = 0; | 743   size_t FixedAllocaAlignBytes = 0; | 
| 739   bool PrologEmitsFixedAllocas = false; | 744   bool PrologEmitsFixedAllocas = false; | 
| 740   uint32_t MaxOutArgsSizeBytes = 0; | 745   uint32_t MaxOutArgsSizeBytes = 0; | 
| 741   static std::array<llvm::SmallBitVector, RCX86_NUM> TypeToRegisterSet; | 746   static std::array<llvm::SmallBitVector, RCX86_NUM> TypeToRegisterSet; | 
| 742   static std::array<llvm::SmallBitVector, Traits::RegisterSet::Reg_NUM> | 747   static std::array<llvm::SmallBitVector, Traits::RegisterSet::Reg_NUM> | 
| 743       RegisterAliases; | 748       RegisterAliases; | 
| 744   static llvm::SmallBitVector ScratchRegs; | 749   static llvm::SmallBitVector ScratchRegs; | 
| 745   llvm::SmallBitVector RegsUsed; | 750   llvm::SmallBitVector RegsUsed; | 
| 746   std::array<VarList, IceType_NUM> PhysicalRegisters; | 751   std::array<VarList, IceType_NUM> PhysicalRegisters; | 
|  | 752   // GotVar is a Variable that holds the GlobalOffsetTable address for Non-SFI | 
|  | 753   // mode. | 
|  | 754   Variable *GotVar = nullptr; | 
| 747 | 755 | 
| 748   /// Randomize a given immediate operand | 756   /// Randomize a given immediate operand | 
| 749   Operand *randomizeOrPoolImmediate(Constant *Immediate, | 757   Operand *randomizeOrPoolImmediate(Constant *Immediate, | 
| 750                                     int32_t RegNum = Variable::NoRegister); | 758                                     int32_t RegNum = Variable::NoRegister); | 
| 751   X86OperandMem * | 759   X86OperandMem * | 
| 752   randomizeOrPoolImmediate(X86OperandMem *MemOperand, | 760   randomizeOrPoolImmediate(X86OperandMem *MemOperand, | 
| 753                            int32_t RegNum = Variable::NoRegister); | 761                            int32_t RegNum = Variable::NoRegister); | 
| 754   bool RandomizationPoolingPaused = false; | 762   bool RandomizationPoolingPaused = false; | 
| 755 | 763 | 
| 756 private: | 764 private: | 
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 804   void lowerSelectMove(Variable *Dest, BrCond Cond, Operand *SrcT, | 812   void lowerSelectMove(Variable *Dest, BrCond Cond, Operand *SrcT, | 
| 805                        Operand *SrcF); | 813                        Operand *SrcF); | 
| 806   void lowerSelectIntMove(Variable *Dest, BrCond Cond, Operand *SrcT, | 814   void lowerSelectIntMove(Variable *Dest, BrCond Cond, Operand *SrcT, | 
| 807                           Operand *SrcF); | 815                           Operand *SrcF); | 
| 808   /// Generic helper to move an arbitrary type from Src to Dest. | 816   /// Generic helper to move an arbitrary type from Src to Dest. | 
| 809   void lowerMove(Variable *Dest, Operand *Src, bool IsRedefinition); | 817   void lowerMove(Variable *Dest, Operand *Src, bool IsRedefinition); | 
| 810 | 818 | 
| 811   /// Optimizations for idiom recognition. | 819   /// Optimizations for idiom recognition. | 
| 812   bool lowerOptimizeFcmpSelect(const InstFcmp *Fcmp, const InstSelect *Select); | 820   bool lowerOptimizeFcmpSelect(const InstFcmp *Fcmp, const InstSelect *Select); | 
| 813 | 821 | 
|  | 822   /// Emit code that initializes the value of the GotVar near the start of the | 
|  | 823   /// function.  (This code is emitted only in Non-SFI mode.) | 
|  | 824   void initGotVarIfNeeded(); | 
|  | 825 | 
| 814   /// Complains loudly if invoked because the cpu can handle 64-bit types | 826   /// Complains loudly if invoked because the cpu can handle 64-bit types | 
| 815   /// natively. | 827   /// natively. | 
| 816   template <typename T = Traits> | 828   template <typename T = Traits> | 
| 817   typename std::enable_if<T::Is64Bit, void>::type lowerIcmp64(const InstIcmp *, | 829   typename std::enable_if<T::Is64Bit, void>::type lowerIcmp64(const InstIcmp *, | 
| 818                                                               const Inst *) { | 830                                                               const Inst *) { | 
| 819     llvm::report_fatal_error( | 831     llvm::report_fatal_error( | 
| 820         "Hey, yo! This is x86-64. Watcha doin'? (lowerIcmp64)"); | 832         "Hey, yo! This is x86-64. Watcha doin'? (lowerIcmp64)"); | 
| 821   } | 833   } | 
| 822   /// x86lowerIcmp64 handles 64-bit icmp lowering. | 834   /// x86lowerIcmp64 handles 64-bit icmp lowering. | 
| 823   template <typename T = Traits> | 835   template <typename T = Traits> | 
| 824   typename std::enable_if<!T::Is64Bit, void>::type | 836   typename std::enable_if<!T::Is64Bit, void>::type | 
| 825   lowerIcmp64(const InstIcmp *Icmp, const Inst *Consumer); | 837   lowerIcmp64(const InstIcmp *Icmp, const Inst *Consumer); | 
| 826 | 838 | 
| 827   BoolFolding FoldingInfo; | 839   BoolFolding FoldingInfo; | 
|  | 840 | 
|  | 841   static FixupKind PcRelFixup; | 
|  | 842   static FixupKind AbsFixup; | 
| 828 }; | 843 }; | 
| 829 } // end of namespace X86NAMESPACE | 844 } // end of namespace X86NAMESPACE | 
| 830 } // end of namespace Ice | 845 } // end of namespace Ice | 
| 831 | 846 | 
| 832 #include "IceTargetLoweringX86BaseImpl.h" | 847 #include "IceTargetLoweringX86BaseImpl.h" | 
| 833 | 848 | 
| 834 #endif // SUBZERO_SRC_ICETARGETLOWERINGX86BASE_H | 849 #endif // SUBZERO_SRC_ICETARGETLOWERINGX86BASE_H | 
| OLD | NEW | 
|---|