mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-15 09:33:39 +00:00
Add a target callback for FastISel.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55512 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
327ef031ed
commit
99b218218c
@ -52,10 +52,21 @@ public:
|
|||||||
/// the generated MachineInstrs.
|
/// the generated MachineInstrs.
|
||||||
BasicBlock::iterator
|
BasicBlock::iterator
|
||||||
SelectInstructions(BasicBlock::iterator Begin, BasicBlock::iterator End,
|
SelectInstructions(BasicBlock::iterator Begin, BasicBlock::iterator End,
|
||||||
DenseMap<const Value*, unsigned> &ValueMap,
|
DenseMap<const Value *, unsigned> &ValueMap,
|
||||||
DenseMap<const BasicBlock*, MachineBasicBlock *> &MBBMap,
|
DenseMap<const BasicBlock *, MachineBasicBlock *> &MBBMap,
|
||||||
MachineBasicBlock *MBB);
|
MachineBasicBlock *MBB);
|
||||||
|
|
||||||
|
/// TargetSelectInstruction - This method is called by target-independent
|
||||||
|
/// code when the normal FastISel process fails to select an instruction.
|
||||||
|
/// This gives targets a chance to emit code for anything that doesn't
|
||||||
|
/// fit into FastISel's framework. It returns true if it was successful.
|
||||||
|
///
|
||||||
|
virtual bool
|
||||||
|
TargetSelectInstruction(Instruction *I,
|
||||||
|
DenseMap<const Value *, unsigned> &ValueMap,
|
||||||
|
DenseMap<const BasicBlock *, MachineBasicBlock *> &MBBMap,
|
||||||
|
MachineBasicBlock *MBB) = 0;
|
||||||
|
|
||||||
virtual ~FastISel();
|
virtual ~FastISel();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -5757,10 +5757,15 @@ void SelectionDAGISel::SelectAllBasicBlocks(Function &Fn, MachineFunction &MF) {
|
|||||||
Begin = F->SelectInstructions(Begin, End, FuncInfo->ValueMap,
|
Begin = F->SelectInstructions(Begin, End, FuncInfo->ValueMap,
|
||||||
FuncInfo->MBBMap, BB);
|
FuncInfo->MBBMap, BB);
|
||||||
|
|
||||||
|
// If the "fast" selector selected the entire block, we're done.
|
||||||
if (Begin == End)
|
if (Begin == End)
|
||||||
// The "fast" selector selected the entire block, so we're done.
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// Next, try calling the target to attempt to handle the instruction.
|
||||||
|
if (F->TargetSelectInstruction(Begin, FuncInfo->ValueMap,
|
||||||
|
FuncInfo->MBBMap, BB))
|
||||||
|
continue;
|
||||||
|
|
||||||
// Handle certain instructions as single-LLVM-Instruction blocks.
|
// Handle certain instructions as single-LLVM-Instruction blocks.
|
||||||
if (isa<CallInst>(Begin) || isa<LoadInst>(Begin) ||
|
if (isa<CallInst>(Begin) || isa<LoadInst>(Begin) ||
|
||||||
isa<StoreInst>(Begin)) {
|
isa<StoreInst>(Begin)) {
|
||||||
@ -5783,7 +5788,7 @@ void SelectionDAGISel::SelectAllBasicBlocks(Function &Fn, MachineFunction &MF) {
|
|||||||
// The "fast" selector couldn't handle something and bailed.
|
// The "fast" selector couldn't handle something and bailed.
|
||||||
// For the purpose of debugging, just abort.
|
// For the purpose of debugging, just abort.
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
Begin->dump();
|
Begin->dump();
|
||||||
#endif
|
#endif
|
||||||
assert(0 && "FastISel didn't select the entire block");
|
assert(0 && "FastISel didn't select the entire block");
|
||||||
}
|
}
|
||||||
|
@ -19,3 +19,23 @@
|
|||||||
#include "X86FastISel.h"
|
#include "X86FastISel.h"
|
||||||
#include "X86TargetMachine.h"
|
#include "X86TargetMachine.h"
|
||||||
#include "X86GenFastISel.inc"
|
#include "X86GenFastISel.inc"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
|
||||||
|
namespace X86 {
|
||||||
|
|
||||||
|
bool
|
||||||
|
FastISel::TargetSelectInstruction(Instruction *I,
|
||||||
|
DenseMap<const Value *, unsigned> &ValueMap,
|
||||||
|
DenseMap<const BasicBlock *, MachineBasicBlock *> &MBBMap,
|
||||||
|
MachineBasicBlock *MBB) {
|
||||||
|
switch (I->getOpcode()) {
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -351,6 +351,14 @@ void FastISelMap::PrintClass(std::ostream &OS) {
|
|||||||
}
|
}
|
||||||
OS << "\n";
|
OS << "\n";
|
||||||
|
|
||||||
|
OS << "bool TargetSelectInstruction(Instruction *I,\n";
|
||||||
|
OS << " "
|
||||||
|
"DenseMap<const Value *, unsigned> &ValueMap,\n";
|
||||||
|
OS << " "
|
||||||
|
"DenseMap<const BasicBlock *, MachineBasicBlock *> &MBBMap,\n";
|
||||||
|
OS << " "
|
||||||
|
"MachineBasicBlock *MBB);\n";
|
||||||
|
|
||||||
// Declare the Subtarget member, which is used for predicate checks.
|
// Declare the Subtarget member, which is used for predicate checks.
|
||||||
OS << " const " << InstNS.substr(0, InstNS.size() - 2)
|
OS << " const " << InstNS.substr(0, InstNS.size() - 2)
|
||||||
<< "Subtarget *Subtarget;\n";
|
<< "Subtarget *Subtarget;\n";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user