diff options
author | Chris Lattner <sabre@nondot.org> | 2003-08-11 14:59:22 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-08-11 14:59:22 +0000 |
commit | ac0c8680ad53c08189c23f39c79a2147378692df (patch) | |
tree | f853925df2a8e14a96d9e679e5d16c5a8f061576 /lib/Target/X86/InstSelectPattern.cpp | |
parent | fa7ed53f32917ef632b21753a772548dde8c2eed (diff) |
Add support for a pattern matching instruction selector. This is still in
the early implementation phases, so it is disabled by default
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7719 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/InstSelectPattern.cpp')
-rw-r--r-- | lib/Target/X86/InstSelectPattern.cpp | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/lib/Target/X86/InstSelectPattern.cpp b/lib/Target/X86/InstSelectPattern.cpp new file mode 100644 index 0000000000..4b9e381ec1 --- /dev/null +++ b/lib/Target/X86/InstSelectPattern.cpp @@ -0,0 +1,117 @@ +//===-- InstSelectPattern.cpp - A pattern matching inst selector for X86 --===// +// +// This file defines a pattern matching instruction selector for X86. +// +// FIXME: we could allocate one big array of unsigneds to use as the backing +// store for all of the nodes costs arrays. +// +//===----------------------------------------------------------------------===// + +#include "X86.h" +#include "llvm/Pass.h" +#include "llvm/Function.h" +#include "llvm/DerivedTypes.h" +#include "llvm/CodeGen/SelectionDAG.h" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineFrameInfo.h" +#include "llvm/CodeGen/SSARegMap.h" + +#include "X86RegisterInfo.h" + +// Include the generated instruction selector... +#include "X86GenInstrSelector.inc" + + +//===----------------------------------------------------------------------===// +// User code +// + + +namespace { + struct ISel : public FunctionPass, SelectionDAGTargetBuilder { + TargetMachine &TM; + ISel(TargetMachine &tm) : TM(tm) {} + int VarArgsFrameIndex; // FrameIndex for start of varargs area + + bool runOnFunction(Function &Fn) { + MachineFunction &MF = MachineFunction::construct(&Fn, TM); + SelectionDAG DAG(MF, TM, *this); + + std::cerr << "\n\n\n=== " + << DAG.getMachineFunction().getFunction()->getName() << "\n"; + + DAG.dump(); + X86ISel(DAG).generateCode(); + std::cerr << "\n\n\n"; + return true; + } + + public: // Implementation of the SelectionDAGTargetBuilder class... + /// expandArguments - Add nodes to the DAG to indicate how to load arguments + /// off of the X86 stack. + void expandArguments(SelectionDAG &SD, MachineFunction &MF); + }; +} + + +void ISel::expandArguments(SelectionDAG &SD, MachineFunction &F) { + // Add DAG nodes to load the arguments... On entry to a function on the X86, + // the stack frame looks like this: + // + // [ESP] -- return address + // [ESP + 4] -- first argument (leftmost lexically) + // [ESP + 8] -- second argument, if first argument is four bytes in size + // ... + // + unsigned ArgOffset = 0; // Frame mechanisms handle retaddr slot + MachineFrameInfo *MFI = F.getFrameInfo(); + const Function &Fn = *F.getFunction(); + + for (Function::const_aiterator I = Fn.abegin(), E = Fn.aend(); I != E; ++I) { + MVT::ValueType ObjectVT = SD.getValueType(I->getType()); + unsigned ArgIncrement = 4; + unsigned ObjSize; + switch (ObjectVT) { + default: assert(0 && "Unhandled argument type!"); + case MVT::i8: ObjSize = 1; break; + case MVT::i16: ObjSize = 2; break; + case MVT::i32: ObjSize = 4; break; + case MVT::i64: ObjSize = ArgIncrement = 8; break; + case MVT::f32: ObjSize = 4; break; + case MVT::f64: ObjSize = ArgIncrement = 8; break; + } + // Create the frame index object for this incoming parameter... + int FI = MFI->CreateFixedObject(ObjSize, ArgOffset); + + // Create the SelectionDAG nodes corresponding to a load from this parameter + // FIXME: + SelectionDAGNode *FIN = new SelectionDAGNode(ISD::FrameIndex, MVT::i32); + FIN->addValue(new ReducedValue_FrameIndex_i32(FI)); + + SelectionDAGNode *Arg + = new SelectionDAGNode(ISD::Load, ObjectVT, F.begin(), FIN); + + // Add the SelectionDAGNodes to the SelectionDAG... note that there is no + // reason to add chain nodes here. We know that no loads ore stores will + // ever alias these loads, so we are free to perform the load at any time in + // the function + SD.addNode(FIN); + SD.addNodeForValue(Arg, I); + + ArgOffset += ArgIncrement; // Move on to the next argument... + } + + // If the function takes variable number of arguments, make a frame index for + // the start of the first vararg value... for expansion of llvm.va_start. + if (Fn.getFunctionType()->isVarArg()) + VarArgsFrameIndex = MFI->CreateFixedObject(1, ArgOffset); +} + + +/// createX86PatternInstructionSelector - This pass converts an LLVM function +/// into a machine code representation using pattern matching and a machine +/// description file. +/// +Pass *createX86PatternInstructionSelector(TargetMachine &TM) { + return new ISel(TM); +} |