Index: src/IceTargetLoweringMIPS32.h |
diff --git a/src/IceTargetLoweringMIPS32.h b/src/IceTargetLoweringMIPS32.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9237e3633149417ceabbe26970a7c4472342d002 |
--- /dev/null |
+++ b/src/IceTargetLoweringMIPS32.h |
@@ -0,0 +1,151 @@ |
+//===- subzero/src/IceTargetLoweringMIPS32.h - MIPS32 lowering ----*- C++ -*-===// |
Jim Stichnoth
2015/05/30 00:47:15
80-col
|
+// |
+// The Subzero Code Generator |
+// |
+// This file is distributed under the University of Illinois Open Source |
+// License. See LICENSE.TXT for details. |
+// |
+//===----------------------------------------------------------------------===// |
+// |
+// This file declares the TargetLoweringMIPS32 class, which implements the |
+// TargetLowering interface for the MIPS 32-bit architecture. |
+// |
+//===----------------------------------------------------------------------===// |
+ |
+#ifndef SUBZERO_SRC_ICETARGETLOWERINGMIPS32_H |
+#define SUBZERO_SRC_ICETARGETLOWERINGMIPS32_H |
+ |
+#include "IceDefs.h" |
+#include "IceInstMIPS32.h" |
+#include "IceRegistersMIPS32.h" |
+#include "IceTargetLowering.h" |
+ |
+namespace Ice { |
+ |
+class TargetMIPS32 : public TargetLowering { |
+ TargetMIPS32() = delete; |
+ TargetMIPS32(const TargetMIPS32 &) = delete; |
+ TargetMIPS32 &operator=(const TargetMIPS32 &) = delete; |
+ |
+public: |
+ // TODO(jvoung): return a unique_ptr. |
+ static TargetMIPS32 *create(Cfg *Func) { return new TargetMIPS32(Func); } |
+ |
+ void translateOm1() override; |
+ void translateO2() override; |
+ bool doBranchOpt(Inst *I, const CfgNode *NextNode) override; |
+ |
+ SizeT getNumRegisters() const override { return RegMIPS32::Reg_NUM; } |
+ Variable *getPhysicalRegister(SizeT RegNum, Type Ty = IceType_void) override; |
+ IceString getRegName(SizeT RegNum, Type Ty) const override; |
+ llvm::SmallBitVector getRegisterSet(RegSetMask Include, |
+ RegSetMask Exclude) const override; |
+ const llvm::SmallBitVector &getRegisterSetForType(Type Ty) const override { |
+ return TypeToRegisterSet[Ty]; |
+ } |
+ bool hasFramePointer() const override { return UsesFramePointer; } |
+ SizeT getFrameOrStackReg() const override { |
+ return UsesFramePointer ? RegMIPS32::Reg_FP : RegMIPS32::Reg_SP; |
+ } |
+ size_t typeWidthInBytesOnStack(Type Ty) const override { |
+ // Round up to the next multiple of 4 bytes. In particular, i1, |
+ // i8, and i16 are rounded up to 4 bytes. |
+ return (typeWidthInBytes(Ty) + 3) & ~3; |
+ } |
+ void emitVariable(const Variable *Var) const override; |
+ |
+ const char *getConstantPrefix() const final { return ""; } |
+ void emit(const ConstantUndef *C) const final { |
+ llvm::report_fatal_error("Not yet implemented"); |
+ } |
+ void emit(const ConstantInteger32 *C) const final { |
+ llvm::report_fatal_error("Not yet implemented"); |
+ |
+ } |
+ void emit(const ConstantInteger64 *C) const final { |
+ llvm::report_fatal_error("Not yet implemented"); |
+ |
+ } |
+ void emit(const ConstantFloat *C) const final { |
+ llvm::report_fatal_error("Not yet implemented"); |
+ } |
+ void emit(const ConstantDouble *C) const final { |
+ llvm::report_fatal_error("Not yet implemented"); |
+ } |
+ |
+ void lowerArguments() override; |
+ void addProlog(CfgNode *Node) override; |
+ void addEpilog(CfgNode *Node) override; |
+ |
+protected: |
+ explicit TargetMIPS32(Cfg *Func); |
+ |
+ void postLower() override; |
+ |
+ void lowerAlloca(const InstAlloca *Inst) override; |
+ void lowerArithmetic(const InstArithmetic *Inst) override; |
+ void lowerAssign(const InstAssign *Inst) override; |
+ void lowerBr(const InstBr *Inst) override; |
+ void lowerCall(const InstCall *Inst) override; |
+ void lowerCast(const InstCast *Inst) override; |
+ void lowerExtractElement(const InstExtractElement *Inst) override; |
+ void lowerFcmp(const InstFcmp *Inst) override; |
+ void lowerIcmp(const InstIcmp *Inst) override; |
+ void lowerIntrinsicCall(const InstIntrinsicCall *Inst) override; |
+ void lowerInsertElement(const InstInsertElement *Inst) override; |
+ void lowerLoad(const InstLoad *Inst) override; |
+ void lowerPhi(const InstPhi *Inst) override; |
+ void lowerRet(const InstRet *Inst) override; |
+ void lowerSelect(const InstSelect *Inst) override; |
+ void lowerStore(const InstStore *Inst) override; |
+ void lowerSwitch(const InstSwitch *Inst) override; |
+ void lowerUnreachable(const InstUnreachable *Inst) override; |
+ void prelowerPhis() override; |
+ void lowerPhiAssignments(CfgNode *Node, |
+ const AssignList &Assignments) override; |
+ void doAddressOptLoad() override; |
+ void doAddressOptStore() override; |
+ void randomlyInsertNop(float Probability) override; |
+ void makeRandomRegisterPermutation( |
+ llvm::SmallVectorImpl<int32_t> &Permutation, |
+ const llvm::SmallBitVector &ExcludeRegisters) const override; |
+ |
+ static Type stackSlotType(); |
+ |
+ bool UsesFramePointer; |
+ bool NeedsStackAlignment; |
+ llvm::SmallBitVector TypeToRegisterSet[IceType_NUM]; |
+ llvm::SmallBitVector ScratchRegs; |
+ llvm::SmallBitVector RegsUsed; |
+ VarList PhysicalRegisters[IceType_NUM]; |
+ static IceString RegNames[]; |
+ |
+private: |
+ ~TargetMIPS32() override {} |
+}; |
+ |
+class TargetDataMIPS32 : public TargetDataLowering { |
+ TargetDataMIPS32() = delete; |
+ TargetDataMIPS32(const TargetDataMIPS32 &) = delete; |
+ TargetDataMIPS32 &operator=(const TargetDataMIPS32 &) = delete; |
+ |
+public: |
+ static TargetDataLowering *create(GlobalContext *Ctx) { |
+ return new TargetDataMIPS32(Ctx); |
+ } |
+ |
+ void lowerGlobals(std::unique_ptr<VariableDeclarationList> Vars) const final; |
+ void lowerConstants() const final; |
+ |
+protected: |
+ explicit TargetDataMIPS32(GlobalContext *Ctx); |
+ |
+private: |
+ void lowerGlobal(const VariableDeclaration &Var) const; |
+ ~TargetDataMIPS32() override {} |
+ template <typename T> static void emitConstantPool(GlobalContext *Ctx); |
+}; |
+ |
+} // end of namespace Ice |
+ |
+#endif // SUBZERO_SRC_ICETARGETLOWERINGMIPS32_H |