| OLD | NEW |
| 1 //===- subzero/src/IceTargetLoweringMIPS32.h - MIPS32 lowering ---*- C++-*-===// | 1 //===- subzero/src/IceTargetLoweringMIPS32.h - MIPS32 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 11 matching lines...) Expand all Loading... |
| 22 #include "IceTargetLowering.h" | 22 #include "IceTargetLowering.h" |
| 23 | 23 |
| 24 namespace Ice { | 24 namespace Ice { |
| 25 | 25 |
| 26 class TargetMIPS32 : public TargetLowering { | 26 class TargetMIPS32 : public TargetLowering { |
| 27 TargetMIPS32() = delete; | 27 TargetMIPS32() = delete; |
| 28 TargetMIPS32(const TargetMIPS32 &) = delete; | 28 TargetMIPS32(const TargetMIPS32 &) = delete; |
| 29 TargetMIPS32 &operator=(const TargetMIPS32 &) = delete; | 29 TargetMIPS32 &operator=(const TargetMIPS32 &) = delete; |
| 30 | 30 |
| 31 public: | 31 public: |
| 32 static void staticInit(); | 32 static void staticInit(const ClFlags &Flags); |
| 33 // TODO(jvoung): return a unique_ptr. | 33 // TODO(jvoung): return a unique_ptr. |
| 34 static TargetMIPS32 *create(Cfg *Func) { return new TargetMIPS32(Func); } | 34 static TargetMIPS32 *create(Cfg *Func) { return new TargetMIPS32(Func); } |
| 35 | 35 |
| 36 void translateOm1() override; | 36 void translateOm1() override; |
| 37 void translateO2() override; | 37 void translateO2() override; |
| 38 bool doBranchOpt(Inst *I, const CfgNode *NextNode) override; | 38 bool doBranchOpt(Inst *I, const CfgNode *NextNode) override; |
| 39 | 39 |
| 40 SizeT getNumRegisters() const override { return RegMIPS32::Reg_NUM; } | 40 SizeT getNumRegisters() const override { return RegMIPS32::Reg_NUM; } |
| 41 Variable *getPhysicalRegister(SizeT RegNum, Type Ty = IceType_void) override; | 41 Variable *getPhysicalRegister(SizeT RegNum, Type Ty = IceType_void) override; |
| 42 IceString getRegName(SizeT RegNum, Type Ty) const override; | 42 IceString getRegName(SizeT RegNum, Type Ty) const override; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 return Ty == IceType_i64; | 83 return Ty == IceType_i64; |
| 84 } | 84 } |
| 85 | 85 |
| 86 // TODO(ascull): what is the best size of MIPS? | 86 // TODO(ascull): what is the best size of MIPS? |
| 87 SizeT getMinJumpTableSize() const override { return 3; } | 87 SizeT getMinJumpTableSize() const override { return 3; } |
| 88 void emitJumpTable(const Cfg *Func, | 88 void emitJumpTable(const Cfg *Func, |
| 89 const InstJumpTable *JumpTable) const override; | 89 const InstJumpTable *JumpTable) const override; |
| 90 | 90 |
| 91 void emitVariable(const Variable *Var) const override; | 91 void emitVariable(const Variable *Var) const override; |
| 92 | 92 |
| 93 const char *getConstantPrefix() const final { return ""; } | |
| 94 void emit(const ConstantUndef *C) const final { | |
| 95 (void)C; | |
| 96 llvm::report_fatal_error("Not yet implemented"); | |
| 97 } | |
| 98 void emit(const ConstantInteger32 *C) const final { | 93 void emit(const ConstantInteger32 *C) const final { |
| 99 (void)C; | 94 (void)C; |
| 100 llvm::report_fatal_error("Not yet implemented"); | 95 llvm::report_fatal_error("Not yet implemented"); |
| 101 } | 96 } |
| 102 void emit(const ConstantInteger64 *C) const final { | 97 void emit(const ConstantInteger64 *C) const final { |
| 103 (void)C; | 98 (void)C; |
| 104 llvm::report_fatal_error("Not yet implemented"); | 99 llvm::report_fatal_error("Not yet implemented"); |
| 105 } | 100 } |
| 106 void emit(const ConstantFloat *C) const final { | 101 void emit(const ConstantFloat *C) const final { |
| 107 (void)C; | 102 (void)C; |
| 108 llvm::report_fatal_error("Not yet implemented"); | 103 llvm::report_fatal_error("Not yet implemented"); |
| 109 } | 104 } |
| 110 void emit(const ConstantDouble *C) const final { | 105 void emit(const ConstantDouble *C) const final { |
| 111 (void)C; | 106 (void)C; |
| 112 llvm::report_fatal_error("Not yet implemented"); | 107 llvm::report_fatal_error("Not yet implemented"); |
| 113 } | 108 } |
| 109 void emit(const ConstantUndef *C) const final { |
| 110 (void)C; |
| 111 llvm::report_fatal_error("Not yet implemented"); |
| 112 } |
| 113 void emit(const ConstantRelocatable *C) const final { |
| 114 (void)C; |
| 115 llvm::report_fatal_error("Not yet implemented"); |
| 116 } |
| 114 | 117 |
| 115 // The following are helpers that insert lowered MIPS32 instructions with | 118 // The following are helpers that insert lowered MIPS32 instructions with |
| 116 // minimal syntactic overhead, so that the lowering code can look as close to | 119 // minimal syntactic overhead, so that the lowering code can look as close to |
| 117 // assembly as practical. | 120 // assembly as practical. |
| 118 void _add(Variable *Dest, Variable *Src0, Variable *Src1) { | 121 void _add(Variable *Dest, Variable *Src0, Variable *Src1) { |
| 119 Context.insert<InstMIPS32Add>(Dest, Src0, Src1); | 122 Context.insert<InstMIPS32Add>(Dest, Src0, Src1); |
| 120 } | 123 } |
| 121 | 124 |
| 122 void _and(Variable *Dest, Variable *Src0, Variable *Src1) { | 125 void _and(Variable *Dest, Variable *Src0, Variable *Src1) { |
| 123 Context.insert<InstMIPS32And>(Dest, Src0, Src1); | 126 Context.insert<InstMIPS32And>(Dest, Src0, Src1); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 /// the helpers will create a new Operand and emit instructions that | 180 /// the helpers will create a new Operand and emit instructions that |
| 178 /// guarantee that the Operand kind is one of those indicated by the | 181 /// guarantee that the Operand kind is one of those indicated by the |
| 179 /// LegalMask (a bitmask of allowed kinds). If the input Operand is known | 182 /// LegalMask (a bitmask of allowed kinds). If the input Operand is known |
| 180 /// to already meet the constraints, it may be simply returned as the result, | 183 /// to already meet the constraints, it may be simply returned as the result, |
| 181 /// without creating any new instructions or operands. | 184 /// without creating any new instructions or operands. |
| 182 enum OperandLegalization { | 185 enum OperandLegalization { |
| 183 Legal_None = 0, | 186 Legal_None = 0, |
| 184 Legal_Reg = 1 << 0, // physical register, not stack location | 187 Legal_Reg = 1 << 0, // physical register, not stack location |
| 185 Legal_Imm = 1 << 1, | 188 Legal_Imm = 1 << 1, |
| 186 Legal_Mem = 1 << 2, | 189 Legal_Mem = 1 << 2, |
| 187 Legal_All = ~Legal_None | 190 Legal_Default = ~Legal_None |
| 188 }; | 191 }; |
| 189 typedef uint32_t LegalMask; | 192 typedef uint32_t LegalMask; |
| 190 Operand *legalize(Operand *From, LegalMask Allowed = Legal_All, | 193 Operand *legalize(Operand *From, LegalMask Allowed = Legal_Default, |
| 191 int32_t RegNum = Variable::NoRegister); | 194 int32_t RegNum = Variable::NoRegister); |
| 192 | 195 |
| 193 Variable *legalizeToVar(Operand *From, int32_t RegNum = Variable::NoRegister); | 196 Variable *legalizeToVar(Operand *From, int32_t RegNum = Variable::NoRegister); |
| 194 | 197 |
| 195 Variable *legalizeToReg(Operand *From, int32_t RegNum = Variable::NoRegister); | 198 Variable *legalizeToReg(Operand *From, int32_t RegNum = Variable::NoRegister); |
| 196 | 199 |
| 197 Variable *makeReg(Type Ty, int32_t RegNum = Variable::NoRegister); | 200 Variable *makeReg(Type Ty, int32_t RegNum = Variable::NoRegister); |
| 198 static Type stackSlotType(); | 201 static Type stackSlotType(); |
| 199 Variable *copyToReg(Operand *Src, int32_t RegNum = Variable::NoRegister); | 202 Variable *copyToReg(Operand *Src, int32_t RegNum = Variable::NoRegister); |
| 200 | 203 |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 298 protected: | 301 protected: |
| 299 explicit TargetHeaderMIPS32(GlobalContext *Ctx); | 302 explicit TargetHeaderMIPS32(GlobalContext *Ctx); |
| 300 | 303 |
| 301 private: | 304 private: |
| 302 ~TargetHeaderMIPS32() = default; | 305 ~TargetHeaderMIPS32() = default; |
| 303 }; | 306 }; |
| 304 | 307 |
| 305 } // end of namespace Ice | 308 } // end of namespace Ice |
| 306 | 309 |
| 307 #endif // SUBZERO_SRC_ICETARGETLOWERINGMIPS32_H | 310 #endif // SUBZERO_SRC_ICETARGETLOWERINGMIPS32_H |
| OLD | NEW |