blob: 6fe941fecbf58d0fd63b779b5a808ad83cf69179 [file] [log] [blame]
Dan Gohmanb0cf29c2008-08-13 20:19:35 +00001///===-- FastISel.cpp - Implementation of the FastISel class --------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains the implementation of the FastISel class.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/CodeGen/FastISel.h"
15#include "llvm/CodeGen/MachineInstrBuilder.h"
16#include "llvm/CodeGen/MachineRegisterInfo.h"
17#include "llvm/Target/TargetInstrInfo.h"
18using namespace llvm;
19
20BasicBlock::iterator
21FastISel::SelectInstructions(BasicBlock::iterator Begin, BasicBlock::iterator End,
22 DenseMap<const Value*, unsigned> &ValueMap) {
23 BasicBlock::iterator I = Begin;
24
25 for (; I != End; ++I) {
26 switch (I->getOpcode()) {
27 case Instruction::Add: {
28 unsigned Op0 = ValueMap[I->getOperand(0)];
29 unsigned Op1 = ValueMap[I->getOperand(1)];
30 MVT VT = MVT::getMVT(I->getType(), /*HandleUnknown=*/true);
31 if (VT == MVT::Other || !VT.isSimple()) {
32 // Unhandled type. Halt "fast" selection and bail.
33 return I;
34 }
35 unsigned ResultReg = FastEmit_rr(VT.getSimpleVT(), ISD::ADD, Op0, Op1);
36 ValueMap[I] = ResultReg;
37 break;
38 }
39 default:
40 // Unhandled instruction. Halt "fast" selection and bail.
41 return I;
42 }
43 }
44
45 return I;
46}
47
48unsigned FastISel::FastEmit_(MVT::SimpleValueType, ISD::NodeType) {
49 return 0;
50}
51
52unsigned FastISel::FastEmit_r(MVT::SimpleValueType, ISD::NodeType,
53 unsigned /*Op0*/) {
54 return 0;
55}
56
57unsigned FastISel::FastEmit_rr(MVT::SimpleValueType, ISD::NodeType,
58 unsigned /*Op0*/, unsigned /*Op0*/) {
59 return 0;
60}
61
62unsigned FastISel::FastEmitInst_(unsigned MachineInstOpcode,
63 const TargetRegisterClass* RC) {
64 MachineRegisterInfo &MRI = MF->getRegInfo();
65 const TargetInstrDesc &II = TII->get(MachineInstOpcode);
66 MachineInstr *MI = BuildMI(*MF, II);
67 unsigned ResultReg = MRI.createVirtualRegister(RC);
68
69 MI->addOperand(MachineOperand::CreateReg(ResultReg, true));
70
71 MBB->push_back(MI);
72 return ResultReg;
73}
74
75unsigned FastISel::FastEmitInst_r(unsigned MachineInstOpcode,
76 const TargetRegisterClass *RC,
77 unsigned Op0) {
78 MachineRegisterInfo &MRI = MF->getRegInfo();
79 const TargetInstrDesc &II = TII->get(MachineInstOpcode);
80 MachineInstr *MI = BuildMI(*MF, II);
81 unsigned ResultReg = MRI.createVirtualRegister(RC);
82
83 MI->addOperand(MachineOperand::CreateReg(ResultReg, true));
84 MI->addOperand(MachineOperand::CreateReg(Op0, false));
85
86 MBB->push_back(MI);
87 return ResultReg;
88}
89
90unsigned FastISel::FastEmitInst_rr(unsigned MachineInstOpcode,
91 const TargetRegisterClass *RC,
92 unsigned Op0, unsigned Op1) {
93 MachineRegisterInfo &MRI = MF->getRegInfo();
94 const TargetInstrDesc &II = TII->get(MachineInstOpcode);
95 MachineInstr *MI = BuildMI(*MF, II);
96 unsigned ResultReg = MRI.createVirtualRegister(RC);
97
98 MI->addOperand(MachineOperand::CreateReg(ResultReg, true));
99 MI->addOperand(MachineOperand::CreateReg(Op0, false));
100 MI->addOperand(MachineOperand::CreateReg(Op1, false));
101
102 MBB->push_back(MI);
103 return ResultReg;
104}