| Index: src/IceTargetLowering.cpp
|
| diff --git a/src/IceTargetLowering.cpp b/src/IceTargetLowering.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f8d56909792b528a19bc1b5988c417bcd4ca08dc
|
| --- /dev/null
|
| +++ b/src/IceTargetLowering.cpp
|
| @@ -0,0 +1,147 @@
|
| +//===- subzero/src/IceTargetLowering.cpp - Basic lowering implementation --===//
|
| +//
|
| +// The Subzero Code Generator
|
| +//
|
| +// This file is distributed under the University of Illinois Open Source
|
| +// License. See LICENSE.TXT for details.
|
| +//
|
| +//===----------------------------------------------------------------------===//
|
| +//
|
| +// This file implements the skeleton of the TargetLowering class,
|
| +// specifically invoking the appropriate lowering method for a given
|
| +// instruction kind and driving global register allocation. It also
|
| +// implements the non-deleted instruction iteration in
|
| +// LoweringContext.
|
| +//
|
| +//===----------------------------------------------------------------------===//
|
| +
|
| +#include "IceCfg.h" // setError()
|
| +#include "IceCfgNode.h"
|
| +#include "IceOperand.h"
|
| +#include "IceTargetLowering.h"
|
| +#include "IceTargetLoweringX8632.h"
|
| +
|
| +namespace Ice {
|
| +
|
| +void LoweringContext::init(CfgNode *N) {
|
| + Node = N;
|
| + Cur = getNode()->getInsts().begin();
|
| + End = getNode()->getInsts().end();
|
| + skipDeleted(Cur);
|
| + Next = Cur;
|
| + advance(Next);
|
| +}
|
| +
|
| +void LoweringContext::insert(Inst *Inst) {
|
| + getNode()->getInsts().insert(Next, Inst);
|
| + Inst->updateVars(getNode());
|
| +}
|
| +
|
| +void LoweringContext::skipDeleted(InstList::iterator &I) {
|
| + while (I != End && (*I)->isDeleted())
|
| + ++I;
|
| +}
|
| +
|
| +void LoweringContext::advance(InstList::iterator &I) {
|
| + if (I != End) {
|
| + ++I;
|
| + skipDeleted(I);
|
| + }
|
| +}
|
| +
|
| +TargetLowering *TargetLowering::createLowering(TargetArch Target, Cfg *Func) {
|
| + // These statements can be #ifdef'd to specialize the code generator
|
| + // to a subset of the available targets.
|
| + if (Target == Target_X8632)
|
| + return TargetX8632::create(Func);
|
| +#if 0
|
| + if (Target == Target_X8664)
|
| + return IceTargetX8664::create(Func);
|
| + if (Target == Target_ARM32)
|
| + return IceTargetARM32::create(Func);
|
| + if (Target == Target_ARM64)
|
| + return IceTargetARM64::create(Func);
|
| +#endif
|
| + Func->setError("Unsupported target");
|
| + return NULL;
|
| +}
|
| +
|
| +// Lowers a single instruction according to the information in
|
| +// Context, by checking the Context.Cur instruction kind and calling
|
| +// the appropriate lowering method. The lowering method should insert
|
| +// target instructions at the Cur.Next insertion point, and should not
|
| +// delete the Context.Cur instruction or advance Context.Cur.
|
| +//
|
| +// The lowering method may look ahead in the instruction stream as
|
| +// desired, and lower additional instructions in conjunction with the
|
| +// current one, for example fusing a compare and branch. If it does,
|
| +// it should advance Context.Cur to point to the next non-deleted
|
| +// instruction to process, and it should delete any additional
|
| +// instructions it consumes.
|
| +void TargetLowering::lower() {
|
| + assert(!Context.atEnd());
|
| + Inst *Inst = *Context.getCur();
|
| + switch (Inst->getKind()) {
|
| + case Inst::Alloca:
|
| + lowerAlloca(llvm::dyn_cast<InstAlloca>(Inst));
|
| + break;
|
| + case Inst::Arithmetic:
|
| + lowerArithmetic(llvm::dyn_cast<InstArithmetic>(Inst));
|
| + break;
|
| + case Inst::Assign:
|
| + lowerAssign(llvm::dyn_cast<InstAssign>(Inst));
|
| + break;
|
| + case Inst::Br:
|
| + lowerBr(llvm::dyn_cast<InstBr>(Inst));
|
| + break;
|
| + case Inst::Call:
|
| + lowerCall(llvm::dyn_cast<InstCall>(Inst));
|
| + break;
|
| + case Inst::Cast:
|
| + lowerCast(llvm::dyn_cast<InstCast>(Inst));
|
| + break;
|
| + case Inst::Fcmp:
|
| + lowerFcmp(llvm::dyn_cast<InstFcmp>(Inst));
|
| + break;
|
| + case Inst::Icmp:
|
| + lowerIcmp(llvm::dyn_cast<InstIcmp>(Inst));
|
| + break;
|
| + case Inst::Load:
|
| + lowerLoad(llvm::dyn_cast<InstLoad>(Inst));
|
| + break;
|
| + case Inst::Phi:
|
| + lowerPhi(llvm::dyn_cast<InstPhi>(Inst));
|
| + break;
|
| + case Inst::Ret:
|
| + lowerRet(llvm::dyn_cast<InstRet>(Inst));
|
| + break;
|
| + case Inst::Select:
|
| + lowerSelect(llvm::dyn_cast<InstSelect>(Inst));
|
| + break;
|
| + case Inst::Store:
|
| + lowerStore(llvm::dyn_cast<InstStore>(Inst));
|
| + break;
|
| + case Inst::Switch:
|
| + lowerSwitch(llvm::dyn_cast<InstSwitch>(Inst));
|
| + break;
|
| + case Inst::Unreachable:
|
| + lowerUnreachable(llvm::dyn_cast<InstUnreachable>(Inst));
|
| + break;
|
| + case Inst::FakeDef:
|
| + case Inst::FakeUse:
|
| + case Inst::FakeKill:
|
| + case Inst::Target:
|
| + // These are all Target instruction types and shouldn't be
|
| + // encountered at this stage.
|
| + Func->setError("Can't lower unsupported instruction type");
|
| + break;
|
| + }
|
| + Inst->setDeleted();
|
| +
|
| + postLower();
|
| +
|
| + Context.advanceCur();
|
| + Context.advanceNext();
|
| +}
|
| +
|
| +} // end of namespace Ice
|
|
|