| Index: src/IceTargetLoweringMIPS32.h
|
| diff --git a/src/IceTargetLoweringMIPS32.h b/src/IceTargetLoweringMIPS32.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..cb583b553d9df1257be46f7e3f528dad3ca59d3f
|
| --- /dev/null
|
| +++ b/src/IceTargetLoweringMIPS32.h
|
| @@ -0,0 +1,149 @@
|
| +//===- subzero/src/IceTargetLoweringMIPS32.h - MIPS32 lowering ---*- C++-*-===//
|
| +//
|
| +// 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
|
|
|