blob: 2cf897e50369a2035a931158240d8ce8f6653853 [file] [log] [blame]
Chris Lattner959a5fb2002-08-09 20:08:06 +00001//===-- llvm/CodeGen/SparcInstrSelectionSupport.h ---------------*- C++ -*-===//
2//
3//
4//
5//===----------------------------------------------------------------------===//
Vikram S. Advecc776df2001-10-18 00:03:20 +00006
7#ifndef SPARC_INSTR_SELECTION_SUPPORT_h
8#define SPARC_INSTR_SELECTION_SUPPORT_h
9
Vikram S. Advee9327f02002-05-19 15:25:51 +000010#include "llvm/DerivedTypes.h"
Misha Brukmana853af52003-05-30 20:11:56 +000011#include "SparcInternals.h"
Vikram S. Advecc776df2001-10-18 00:03:20 +000012
13inline MachineOpCode
14ChooseLoadInstruction(const Type *DestTy)
15{
16 switch (DestTy->getPrimitiveID()) {
17 case Type::BoolTyID:
Misha Brukman96ce62a2003-05-27 22:39:01 +000018 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;
Vikram S. Advecc776df2001-10-18 00:03:20 +000024 case Type::PointerTyID:
25 case Type::ULongTyID:
Misha Brukman96ce62a2003-05-27 22:39:01 +000026 case Type::LongTyID: return V9::LDXr;
27 case Type::FloatTyID: return V9::LDFr;
28 case Type::DoubleTyID: return V9::LDDFr;
Vikram S. Advecc776df2001-10-18 00:03:20 +000029 default: assert(0 && "Invalid type for Load instruction");
30 }
31
32 return 0;
33}
34
Vikram S. Advecc776df2001-10-18 00:03:20 +000035inline MachineOpCode
36ChooseStoreInstruction(const Type *DestTy)
37{
38 switch (DestTy->getPrimitiveID()) {
39 case Type::BoolTyID:
40 case Type::UByteTyID:
Misha Brukman96ce62a2003-05-27 22:39:01 +000041 case Type::SByteTyID: return V9::STBr;
Vikram S. Advecc776df2001-10-18 00:03:20 +000042 case Type::UShortTyID:
Misha Brukman96ce62a2003-05-27 22:39:01 +000043 case Type::ShortTyID: return V9::STHr;
Vikram S. Advecc776df2001-10-18 00:03:20 +000044 case Type::UIntTyID:
Misha Brukman96ce62a2003-05-27 22:39:01 +000045 case Type::IntTyID: return V9::STWr;
Vikram S. Advecc776df2001-10-18 00:03:20 +000046 case Type::PointerTyID:
47 case Type::ULongTyID:
Misha Brukman96ce62a2003-05-27 22:39:01 +000048 case Type::LongTyID: return V9::STXr;
49 case Type::FloatTyID: return V9::STFr;
50 case Type::DoubleTyID: return V9::STDFr;
Vikram S. Advecc776df2001-10-18 00:03:20 +000051 default: assert(0 && "Invalid type for Store instruction");
52 }
53
54 return 0;
55}
56
Vikram S. Advee9327f02002-05-19 15:25:51 +000057
58inline MachineOpCode
59ChooseAddInstructionByType(const Type* resultType)
60{
Misha Brukman56f4fa12003-05-20 20:32:24 +000061 MachineOpCode opCode = V9::INVALID_OPCODE;
Vikram S. Advee9327f02002-05-19 15:25:51 +000062
63 if (resultType->isIntegral() ||
64 isa<PointerType>(resultType) ||
65 isa<FunctionType>(resultType) ||
Chris Lattnerb0b412e2002-09-03 01:08:28 +000066 resultType == Type::LabelTy)
Misha Brukman56f4fa12003-05-20 20:32:24 +000067 {
Misha Brukman96ce62a2003-05-27 22:39:01 +000068 opCode = V9::ADDr;
Misha Brukman56f4fa12003-05-20 20:32:24 +000069 }
Vikram S. Advee9327f02002-05-19 15:25:51 +000070 else
71 switch(resultType->getPrimitiveID())
Misha Brukman56f4fa12003-05-20 20:32:24 +000072 {
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;
76 }
Vikram S. Advee9327f02002-05-19 15:25:51 +000077
78 return opCode;
79}
80
Misha Brukmana853af52003-05-30 20:11:56 +000081
82static unsigned
83convertOpcodeFromRegToImm(unsigned Opcode) {
84 switch (Opcode) {
85 /* arithmetic */
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;
97
98 /* logical */
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;
111
112 /* shift */
113 case V9::SLLr6: return V9::SLLi6;
114 case V9::SRLr6: return V9::SRLi6;
115 case V9::SRAr6: return V9::SRAi6;
116 case V9::SLLXr6: return V9::SLLXi6;
117 case V9::SRLXr6: return V9::SRLXi6;
118 case V9::SRAXr6: return V9::SRAXi6;
119
120 /* load */
121 case V9::LDSBr: return V9::LDSBi;
122 case V9::LDSHr: return V9::LDSHi;
123 case V9::LDSWr: return V9::LDSWi;
124 case V9::LDUBr: return V9::LDUBi;
125 case V9::LDUHr: return V9::LDUHi;
126 case V9::LDUWr: return V9::LDUWi;
127 case V9::LDXr: return V9::LDXi;
128 case V9::LDFr: return V9::LDFi;
129 case V9::LDDFr: return V9::LDDFi;
130 case V9::LDQFr: return V9::LDQFi;
131 case V9::LDFSRr: return V9::LDFSRi;
132 case V9::LDXFSRr: return V9::LDXFSRi;
133
134 /* store */
135 case V9::STBr: return V9::STBi;
136 case V9::STHr: return V9::STHi;
137 case V9::STWr: return V9::STWi;
138 case V9::STXr: return V9::STXi;
139 case V9::STFr: return V9::STFi;
140 case V9::STDFr: return V9::STDFi;
141 case V9::STFSRr: return V9::STFSRi;
142 case V9::STXFSRr: return V9::STXFSRi;
143
144 /* jump & return */
145 case V9::JMPLCALLr: return V9::JMPLCALLi;
146 case V9::JMPLRETr: return V9::JMPLRETi;
147 case V9::RETURNr: return V9::RETURNi;
148
149 /* save and restore */
150 case V9::SAVEr: return V9::SAVEi;
151 case V9::RESTOREr: return V9::RESTOREi;
152
153 default:
154 // It's already in correct format
155 return Opcode;
156 }
157}
158
Chris Lattner7f74a562002-01-20 22:54:45 +0000159#endif