1 //===-- llvm/CodeGen/SparcInstrSelectionSupport.h ---------------*- C++ -*-===//
5 //===----------------------------------------------------------------------===//
7 #ifndef SPARC_INSTR_SELECTION_SUPPORT_h
8 #define SPARC_INSTR_SELECTION_SUPPORT_h
10 #include "llvm/DerivedTypes.h"
11 #include "SparcInternals.h"
14 ChooseLoadInstruction(const Type *DestTy)
16 switch (DestTy->getPrimitiveID()) {
18 case Type::UByteTyID: return V9::LDUBr;
19 case Type::SByteTyID: return V9::LDSBr;
20 case Type::UShortTyID: return V9::LDUHr;
21 case Type::ShortTyID: return V9::LDSHr;
22 case Type::UIntTyID: return V9::LDUWr;
23 case Type::IntTyID: return V9::LDSWr;
24 case Type::PointerTyID:
26 case Type::LongTyID: return V9::LDXr;
27 case Type::FloatTyID: return V9::LDFr;
28 case Type::DoubleTyID: return V9::LDDFr;
29 default: assert(0 && "Invalid type for Load instruction");
36 ChooseStoreInstruction(const Type *DestTy)
38 switch (DestTy->getPrimitiveID()) {
41 case Type::SByteTyID: return V9::STBr;
42 case Type::UShortTyID:
43 case Type::ShortTyID: return V9::STHr;
45 case Type::IntTyID: return V9::STWr;
46 case Type::PointerTyID:
48 case Type::LongTyID: return V9::STXr;
49 case Type::FloatTyID: return V9::STFr;
50 case Type::DoubleTyID: return V9::STDFr;
51 default: assert(0 && "Invalid type for Store instruction");
59 ChooseAddInstructionByType(const Type* resultType)
61 MachineOpCode opCode = V9::INVALID_OPCODE;
63 if (resultType->isIntegral() ||
64 isa<PointerType>(resultType) ||
65 isa<FunctionType>(resultType) ||
66 resultType == Type::LabelTy)
71 switch(resultType->getPrimitiveID())
73 case Type::FloatTyID: opCode = V9::FADDS; break;
74 case Type::DoubleTyID: opCode = V9::FADDD; break;
75 default: assert(0 && "Invalid type for ADD instruction"); break;
83 convertOpcodeFromRegToImm(unsigned Opcode) {
86 case V9::ADDr: return V9::ADDi;
87 case V9::ADDccr: return V9::ADDcci;
88 case V9::ADDCr: return V9::ADDCi;
89 case V9::ADDCccr: return V9::ADDCcci;
90 case V9::SUBr: return V9::SUBi;
91 case V9::SUBccr: return V9::SUBcci;
92 case V9::SUBCr: return V9::SUBCi;
93 case V9::SUBCccr: return V9::SUBCcci;
94 case V9::MULXr: return V9::MULXi;
95 case V9::SDIVXr: return V9::SDIVXi;
96 case V9::UDIVXr: return V9::UDIVXi;
99 case V9::ANDr: return V9::ANDi;
100 case V9::ANDccr: return V9::ANDcci;
101 case V9::ANDNr: return V9::ANDNi;
102 case V9::ANDNccr: return V9::ANDNcci;
103 case V9::ORr: return V9::ORi;
104 case V9::ORccr: return V9::ORcci;
105 case V9::ORNr: return V9::ORNi;
106 case V9::ORNccr: return V9::ORNcci;
107 case V9::XORr: return V9::XORi;
108 case V9::XORccr: return V9::XORcci;
109 case V9::XNORr: return V9::XNORi;
110 case V9::XNORccr: return V9::XNORcci;
113 case V9::SLLr5: return V9::SLLi5;
114 case V9::SRLr5: return V9::SRLi5;
115 case V9::SRAr5: return V9::SRAi5;
116 case V9::SLLXr6: return V9::SLLXi6;
117 case V9::SRLXr6: return V9::SRLXi6;
118 case V9::SRAXr6: return V9::SRAXi6;
120 /* Conditional move on int comparison with zero */
121 case V9::MOVRZr: return V9::MOVRZi;
122 case V9::MOVRLEZr: return V9::MOVRLEZi;
123 case V9::MOVRLZr: return V9::MOVRLZi;
124 case V9::MOVRNZr: return V9::MOVRNZi;
125 case V9::MOVRGZr: return V9::MOVRGZi;
126 case V9::MOVRGEZr: return V9::MOVRGEZi;
129 /* Conditional move on int condition code */
130 case V9::MOVAr: return V9::MOVAi;
131 case V9::MOVNr: return V9::MOVNi;
132 case V9::MOVNEr: return V9::MOVNEi;
133 case V9::MOVEr: return V9::MOVEi;
134 case V9::MOVGr: return V9::MOVGi;
135 case V9::MOVLEr: return V9::MOVLEi;
136 case V9::MOVGEr: return V9::MOVGEi;
137 case V9::MOVLr: return V9::MOVLi;
138 case V9::MOVGUr: return V9::MOVGUi;
139 case V9::MOVLEUr: return V9::MOVLEUi;
140 case V9::MOVCCr: return V9::MOVCCi;
141 case V9::MOVCSr: return V9::MOVCSi;
142 case V9::MOVPOSr: return V9::MOVPOSi;
143 case V9::MOVNEGr: return V9::MOVNEGi;
144 case V9::MOVVCr: return V9::MOVVCi;
145 case V9::MOVVSr: return V9::MOVVSi;
147 /* Conditional move of int reg on fp condition code */
148 case V9::MOVFAr: return V9::MOVFAi;
149 case V9::MOVFNr: return V9::MOVFNi;
150 case V9::MOVFUr: return V9::MOVFUi;
151 case V9::MOVFGr: return V9::MOVFGi;
152 case V9::MOVFUGr: return V9::MOVFUGi;
153 case V9::MOVFLr: return V9::MOVFLi;
154 case V9::MOVFULr: return V9::MOVFULi;
155 case V9::MOVFLGr: return V9::MOVFLGi;
156 case V9::MOVFNEr: return V9::MOVFNEi;
157 case V9::MOVFEr: return V9::MOVFEi;
158 case V9::MOVFUEr: return V9::MOVFUEi;
159 case V9::MOVFGEr: return V9::MOVFGEi;
160 case V9::MOVFUGEr: return V9::MOVFUGEi;
161 case V9::MOVFLEr: return V9::MOVFLEi;
162 case V9::MOVFULEr: return V9::MOVFULEi;
163 case V9::MOVFOr: return V9::MOVFOi;
166 case V9::LDSBr: return V9::LDSBi;
167 case V9::LDSHr: return V9::LDSHi;
168 case V9::LDSWr: return V9::LDSWi;
169 case V9::LDUBr: return V9::LDUBi;
170 case V9::LDUHr: return V9::LDUHi;
171 case V9::LDUWr: return V9::LDUWi;
172 case V9::LDXr: return V9::LDXi;
173 case V9::LDFr: return V9::LDFi;
174 case V9::LDDFr: return V9::LDDFi;
175 case V9::LDQFr: return V9::LDQFi;
176 case V9::LDFSRr: return V9::LDFSRi;
177 case V9::LDXFSRr: return V9::LDXFSRi;
180 case V9::STBr: return V9::STBi;
181 case V9::STHr: return V9::STHi;
182 case V9::STWr: return V9::STWi;
183 case V9::STXr: return V9::STXi;
184 case V9::STFr: return V9::STFi;
185 case V9::STDFr: return V9::STDFi;
186 case V9::STFSRr: return V9::STFSRi;
187 case V9::STXFSRr: return V9::STXFSRi;
190 case V9::JMPLCALLr: return V9::JMPLCALLi;
191 case V9::JMPLRETr: return V9::JMPLRETi;
192 case V9::RETURNr: return V9::RETURNi;
194 /* save and restore */
195 case V9::SAVEr: return V9::SAVEi;
196 case V9::RESTOREr: return V9::RESTOREi;
199 // It's already in correct format
200 // Or, it's just not handled yet, but an assert() would break LLC
202 std::cerr << "Unhandled opcode in convertOpcodeFromRegToImm(): " << Opcode