annotate lib/Target/Lanai/LanaiInstrInfo.td @ 120:1172e4bd9c6f

update 4.0.0
author mir3636
date Fri, 25 Nov 2016 19:14:25 +0900
parents
children 803732b1fca8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
1 //===-- LanaiInstrInfo.td - Target Description for Lanai Target -----------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
2 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
4 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
7 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
9 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
10 // This file describes the Lanai instructions in TableGen format.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
11 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
13
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
14 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
15 // Instruction format superclass
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
16 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
17
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
18 include "LanaiInstrFormats.td"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
19
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
20 // -------------------------------------------------- //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
21 // Instruction Operands and Patterns
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
22 // -------------------------------------------------- //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
23
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
24 // These are target-independent nodes, but have target-specific formats.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
25 def SDT_LanaiCallSeqStart : SDCallSeqStart<[SDTCisVT<0, i32>]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
26 def SDT_LanaiCallSeqEnd : SDCallSeqEnd<[SDTCisVT<0, i32>,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
27 SDTCisVT<1, i32>]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
28 def SDT_LanaiCall : SDTypeProfile<0, -1, [SDTCisVT<0, i32>]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
29 def SDT_LanaiSetFlag : SDTypeProfile<0, 2, [SDTCisSameAs<0, 1>]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
30 def SDT_LanaiSelectCC : SDTypeProfile<1, 3, [SDTCisSameAs<0, 1>,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
31 SDTCisSameAs<1, 2>]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
32 def SDT_LanaiSetCC : SDTypeProfile<1, 1, [SDTCisVT<0, i32>,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
33 SDTCisVT<1, i32>]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
34 def SDT_LanaiBrCC : SDTypeProfile<0, 2, [SDTCisVT<0, OtherVT>,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
35 SDTCisVT<1, i32>]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
36 def SDT_LanaiAdjDynAlloc : SDTypeProfile<1, 1, [SDTCisVT<0, i32>,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
37 SDTCisVT<1, i32>]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
38
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
39 def Call : SDNode<"LanaiISD::CALL", SDT_LanaiCall,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
40 [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
41 SDNPVariadic]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
42 def RetFlag : SDNode<"LanaiISD::RET_FLAG", SDTNone,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
43 [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
44 def CallSeqStart : SDNode<"ISD::CALLSEQ_START", SDT_LanaiCallSeqStart,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
45 [SDNPHasChain, SDNPOutGlue]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
46 def CallSeqEnd : SDNode<"ISD::CALLSEQ_END", SDT_LanaiCallSeqEnd,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
47 [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
48 def LanaiSetFlag : SDNode<"LanaiISD::SET_FLAG", SDT_LanaiSetFlag,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
49 [SDNPOutGlue]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
50 def LanaiSubbF : SDNode<"LanaiISD::SUBBF", SDT_LanaiSetFlag,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
51 [SDNPOutGlue, SDNPInGlue]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
52 def LanaiBrCC : SDNode<"LanaiISD::BR_CC", SDT_LanaiBrCC,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
53 [SDNPHasChain, SDNPInGlue]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
54 def LanaiSelectCC : SDNode<"LanaiISD::SELECT_CC", SDT_LanaiSelectCC,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
55 [SDNPInGlue]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
56 def LanaiSetCC : SDNode<"LanaiISD::SETCC", SDT_LanaiSetCC,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
57 [SDNPInGlue]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
58 def LanaiHi : SDNode<"LanaiISD::HI", SDTIntUnaryOp>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
59 def LanaiLo : SDNode<"LanaiISD::LO", SDTIntUnaryOp>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
60 def LanaiSmall : SDNode<"LanaiISD::SMALL", SDTIntUnaryOp>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
61 def LanaiAdjDynAlloc : SDNode<"LanaiISD::ADJDYNALLOC", SDT_LanaiAdjDynAlloc>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
62
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
63 // Extract bits 0-15 (low-end) of an immediate value.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
64 def LO16 : SDNodeXForm<imm, [{
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
65 return CurDAG->getTargetConstant((uint64_t)N->getZExtValue() & 0xffff,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
66 SDLoc(N), MVT::i32);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
67 }]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
68
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
69 // Extract bits 16-31 (high-end) of an immediate value.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
70 // Transformation function: shift the immediate value down into the low bits.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
71 def HI16 : SDNodeXForm<imm, [{
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
72 return CurDAG->getTargetConstant((uint64_t)N->getZExtValue() >> 16, SDLoc(N),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
73 MVT::i32);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
74 }]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
75
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
76 def NEG : SDNodeXForm<imm, [{
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
77 return CurDAG->getTargetConstant(-N->getSExtValue(), SDLoc(N), MVT::i32);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
78 }]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
79
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
80 def LO21 : SDNodeXForm<imm, [{
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
81 return CurDAG->getTargetConstant((uint64_t)N->getZExtValue() & 0x1fffff,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
82 SDLoc(N), MVT::i32);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
83 }]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
84
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
85 // Branch targets
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
86 def BrTargetAsmOperand : AsmOperandClass {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
87 let Name = "BrTarget";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
88 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
89 def BrTarget : Operand<OtherVT> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
90 let ParserMatchClass = BrTargetAsmOperand;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
91 let EncoderMethod = "getBranchTargetOpValue";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
92 let DecoderMethod = "decodeBranch";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
93 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
94
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
95 def CallTargetAsmOperand : AsmOperandClass {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
96 let Name = "CallTarget";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
97 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
98 def CallTarget : Operand<i32> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
99 let ParserMatchClass = CallTargetAsmOperand;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
100 let EncoderMethod = "getBranchTargetOpValue";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
101 let DecoderMethod = "decodeBranch";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
102 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
103
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
104 def ImmShiftAsmOperand : AsmOperandClass { let Name = "ImmShift"; }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
105 def immShift : Operand<i32>, PatLeaf<(imm), [{
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
106 int Imm = N->getSExtValue();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
107 return Imm >= -31 && Imm <= 31;}]> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
108 let ParserMatchClass = ImmShiftAsmOperand;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
109 let DecoderMethod = "decodeShiftImm";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
110 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
111
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
112 def Imm10AsmOperand : AsmOperandClass { let Name = "Imm10"; }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
113 def imm10 : Operand<i32>, PatLeaf<(imm), [{
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
114 return isInt<10>(N->getSExtValue()); }]> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
115 let ParserMatchClass = Imm10AsmOperand;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
116 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
117
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
118 def LoImm16AsmOperand : AsmOperandClass { let Name = "LoImm16"; }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
119 def i32lo16z : Operand<i32>, PatLeaf<(i32 imm), [{
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
120 // i32lo16 predicate - true if the 32-bit immediate has only rightmost 16
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
121 // bits set.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
122 return ((N->getZExtValue() & 0xFFFFUL) == N->getZExtValue());}], LO16> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
123 let ParserMatchClass = LoImm16AsmOperand;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
124 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
125 def i32neg16 : Operand<i32>, PatLeaf<(i32 imm), [{
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
126 // i32neg16 predicate - true if the 32-bit immediate is negative and can
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
127 // be represented by a 16 bit integer.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
128 int Imm = N->getSExtValue();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
129 return (Imm < 0) && (isInt<16>(Imm));}], LO16> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
130 let ParserMatchClass = LoImm16AsmOperand;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
131 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
132 def i32lo16s : Operand<i32>, PatLeaf<(i32 imm), [{
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
133 // i32lo16 predicate - true if the 32-bit immediate has only rightmost 16
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
134 // bits set.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
135 return ((int64_t)(N->getSExtValue() & 0xFFFFUL) == N->getSExtValue());}], LO16> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
136 let ParserMatchClass = LoImm16AsmOperand;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
137 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
138
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
139 def LoImm16AndAsmOperand : AsmOperandClass { let Name = "LoImm16And"; }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
140 def i32lo16and : Operand<i32>, PatLeaf<(i32 imm), [{
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
141 // i32lo16 predicate - true if the 32-bit immediate has the rightmost 16
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
142 // bits set and the leftmost 16 bits 1's.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
143 return (N->getZExtValue() >= 0xFFFF0000UL);}], LO16> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
144 let ParserMatchClass = LoImm16AndAsmOperand;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
145 let PrintMethod = "printLo16AndImmOperand";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
146 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
147
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
148 def HiImm16AsmOperand : AsmOperandClass { let Name = "HiImm16"; }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
149 def i32hi16 : Operand<i32>, PatLeaf<(i32 imm), [{
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
150 // i32hi16 predicate - true if the 32-bit immediate has only leftmost 16
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
151 // bits set.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
152 return ((N->getZExtValue() & 0xFFFF0000UL) == N->getZExtValue());}], HI16> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
153 let ParserMatchClass = HiImm16AsmOperand;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
154 let PrintMethod = "printHi16ImmOperand";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
155 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
156
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
157 def HiImm16AndAsmOperand : AsmOperandClass { let Name = "HiImm16And"; }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
158 def i32hi16and : Operand<i32>, PatLeaf<(i32 imm), [{
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
159 // i32lo16 predicate - true if the 32-bit immediate has the leftmost 16
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
160 // bits set and the rightmost 16 bits 1's.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
161 return ((N->getZExtValue() & 0xFFFFUL) == 0xFFFFUL);}], HI16> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
162 let ParserMatchClass = HiImm16AndAsmOperand;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
163 let PrintMethod = "printHi16AndImmOperand";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
164 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
165
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
166 def LoImm21AsmOperand : AsmOperandClass { let Name = "LoImm21"; }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
167 def i32lo21 : Operand<i32>, PatLeaf<(i32 imm), [{
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
168 // i32lo21 predicate - true if the 32-bit immediate has only rightmost 21
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
169 // bits set.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
170 return ((N->getZExtValue() & 0x1FFFFFUL) == N->getZExtValue());}], LO21> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
171 let ParserMatchClass = LoImm21AsmOperand;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
172 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
173
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
174 def AluOp : Operand<i32> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
175 let PrintMethod = "printAluOperand";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
176 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
177
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
178 // Addressing modes.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
179 def ADDRrr : ComplexPattern<i32, 3, "selectAddrRr", [], []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
180 def ADDRri : ComplexPattern<i32, 3, "selectAddrRi", [frameindex], []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
181 def ADDRsls : ComplexPattern<i32, 1, "selectAddrSls", [frameindex], []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
182 def ADDRspls : ComplexPattern<i32, 3, "selectAddrSpls", [frameindex], []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
183
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
184 // Address operands
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
185 def MemRegImmAsmOperand : AsmOperandClass {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
186 let Name = "MemRegImm";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
187 let ParserMethod = "parseMemoryOperand";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
188 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
189 def MEMri : Operand<i32> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
190 let DecoderMethod = "decodeRiMemoryValue";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
191 let EncoderMethod = "getRiMemoryOpValue";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
192 let MIOperandInfo = (ops GPR:$base, i32lo16s:$offset, AluOp:$Opcode);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
193 let ParserMatchClass = MemRegImmAsmOperand;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
194 let PrintMethod = "printMemRiOperand";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
195 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
196
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
197 def MemRegRegAsmOperand : AsmOperandClass {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
198 let Name = "MemRegReg";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
199 let ParserMethod = "parseMemoryOperand";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
200 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
201 def MEMrr : Operand<i32> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
202 let DecoderMethod = "decodeRrMemoryValue";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
203 let EncoderMethod = "getRrMemoryOpValue";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
204 let MIOperandInfo = (ops GPR:$Op1, GPR:$Op2, AluOp:$Opcode);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
205 let ParserMatchClass = MemRegRegAsmOperand;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
206 let PrintMethod = "printMemRrOperand";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
207 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
208
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
209 def MemImmAsmOperand : AsmOperandClass {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
210 let Name = "MemImm";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
211 let ParserMethod = "parseMemoryOperand";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
212 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
213 def MEMi : Operand<i32> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
214 let MIOperandInfo = (ops i32lo21:$offset);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
215 let ParserMatchClass = MemImmAsmOperand;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
216 let PrintMethod = "printMemImmOperand";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
217 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
218
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
219 def MemSplsAsmOperand : AsmOperandClass {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
220 let Name = "MemSpls";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
221 let ParserMethod = "parseMemoryOperand";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
222 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
223 def MEMspls : Operand<i32> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
224 let DecoderMethod = "decodeSplsValue";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
225 let EncoderMethod = "getSplsOpValue";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
226 let MIOperandInfo = (ops GPR:$base, imm10:$offset, AluOp:$Opcode);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
227 let ParserMatchClass = MemSplsAsmOperand;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
228 let PrintMethod = "printMemSplsOperand";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
229 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
230
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
231 def CCOp : Operand<i32> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
232 let PrintMethod = "printCCOperand";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
233 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
234
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
235 // Predicate operand. Default to 0 = true.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
236 def CondCodeOperand : AsmOperandClass { let Name = "CondCode"; }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
237
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
238 def pred : PredicateOperand<i32, (ops i32imm), (ops (i32 0))> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
239 let PrintMethod = "printPredicateOperand";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
240 let ParserMatchClass = CondCodeOperand;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
241 let DecoderMethod = "decodePredicateOperand";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
242 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
243
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
244 let hasSideEffects = 0, Inst = 0x00000001 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
245 def NOP : InstLanai<(outs), (ins), "nop", []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
246
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
247 // Special NOPs to change logging level in vlanai.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
248 let hasSideEffects = 0, Inst = 0x00000002 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
249 def LOG0 : InstLanai<(outs), (ins), "log_0", []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
250 let hasSideEffects = 0, Inst = 0x00000003 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
251 def LOG1 : InstLanai<(outs), (ins), "log_1", []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
252 let hasSideEffects = 0, Inst = 0x00000004 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
253 def LOG2 : InstLanai<(outs), (ins), "log_2", []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
254 let hasSideEffects = 0, Inst = 0x00000005 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
255 def LOG3 : InstLanai<(outs), (ins), "log_3", []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
256 let hasSideEffects = 0, Inst = 0x00000006 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
257 def LOG4 : InstLanai<(outs), (ins), "log_4", []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
258
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
259 // Map an SPLS instruction onto itself. All other instructions will be mapped
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
260 // onto -1. Used to identify SPLS instructions.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
261 def splsIdempotent : InstrMapping {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
262 let FilterClass = "InstSPLS";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
263 let RowFields = ["AsmString"];
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
264 let ColFields = ["PostEncoderMethod"];
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
265 let KeyCol = ["adjustPqBitsSpls"];
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
266 let ValueCols = [["adjustPqBitsSpls"]];
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
267 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
268
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
269 // -------------------------------------------------- //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
270 // ALU instructions
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
271 // -------------------------------------------------- //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
272 multiclass ALUbase<bits<3> subOp, string AsmStr, SDNode OpNode,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
273 PatLeaf LoExt, PatLeaf HiExt,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
274 list<dag> loPattern, list<dag> hiPattern> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
275 // Register Immediate
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
276 let H = 0 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
277 def LO : InstRI<subOp, (outs GPR:$Rd), (ins GPR:$Rs1, LoExt:$imm16),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
278 !strconcat(AsmStr, "\t$Rs1, $imm16, $Rd"),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
279 loPattern>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
280 let H = 1 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
281 def HI : InstRI<subOp, (outs GPR:$Rd), (ins GPR:$Rs1, HiExt:$imm16),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
282 !strconcat(AsmStr, "\t$Rs1, $imm16, $Rd"),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
283 hiPattern>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
284
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
285 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
286
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
287 multiclass ALUarith<bits<3> subOp, string AsmStr, SDNode OpNode,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
288 PatLeaf LoExt, PatLeaf HiExt> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
289 defm I_ : ALUbase<subOp, AsmStr, OpNode, LoExt, HiExt, [], []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
290
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
291 // Register Register
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
292 let JJJJJ = 0 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
293 def R : InstRR<subOp, (outs GPR:$Rd), (ins GPR:$Rs1, GPR:$Rs2, pred:$DDDI),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
294 !strconcat(AsmStr, "$DDDI\t$Rs1, $Rs2, $Rd"),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
295 [(set GPR:$Rd, (OpNode GPR:$Rs1, GPR:$Rs2))]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
296 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
297
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
298 multiclass ALUlogic<bits<3> subOp, string AsmStr, SDNode OpNode,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
299 PatLeaf LoExt, PatLeaf HiExt> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
300 defm I_ : ALUbase<subOp, AsmStr, OpNode, LoExt, HiExt,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
301 [(set GPR:$Rd, (OpNode GPR:$Rs1, LoExt:$imm16))],
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
302 [(set GPR:$Rd, (OpNode GPR:$Rs1, HiExt:$imm16))]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
303
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
304 // Register Register
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
305 let JJJJJ = 0 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
306 def R : InstRR<subOp, (outs GPR:$Rd), (ins GPR:$Rs1, GPR:$Rs2, pred:$DDDI),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
307 !strconcat(AsmStr, "$DDDI\t$Rs1, $Rs2, $Rd"),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
308 [(set GPR:$Rd, (OpNode GPR:$Rs1, GPR:$Rs2))]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
309 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
310
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
311 // Non flag setting ALU operations
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
312 let isAsCheapAsAMove = 1, F = 0 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
313 let isCommutable = 1 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
314 defm ADD_ : ALUarith<0b000, "add", add, i32lo16z, i32hi16>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
315 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
316 defm SUB_ : ALUarith<0b010, "sub", sub, i32lo16z, i32hi16>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
317 let isCommutable = 1 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
318 defm AND_ : ALUlogic<0b100, "and", and, i32lo16and, i32hi16and>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
319 defm OR_ : ALUlogic<0b101, "or", or, i32lo16z, i32hi16>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
320 defm XOR_ : ALUlogic<0b110, "xor", xor, i32lo16z, i32hi16>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
321 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
322 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
323
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
324 def : Pat<(add GPR:$Rs1, i32lo16z:$imm),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
325 (ADD_I_LO GPR:$Rs1, i32lo16z:$imm)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
326
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
327 def : Pat<(sub GPR:$Rs1, i32lo16z:$imm),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
328 (SUB_I_LO GPR:$Rs1, i32lo16z:$imm)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
329
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
330 def : Pat<(add GPR:$Rs1, i32hi16:$imm),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
331 (ADD_I_HI GPR:$Rs1, i32hi16:$imm)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
332
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
333 def : Pat<(sub GPR:$Rs1, i32hi16:$imm),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
334 (SUB_I_HI GPR:$Rs1, i32hi16:$imm)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
335
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
336 def : Pat<(i32 i32lo16and:$imm), (AND_I_LO (i32 R1), i32lo16and:$imm)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
337 def : Pat<(i32 i32hi16and:$imm), (AND_I_HI (i32 R1), i32hi16and:$imm)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
338
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
339 // Change add/sub with negative number to sub/add
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
340 def : Pat<(add GPR:$Rs1, i32neg16:$imm),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
341 (SUB_I_LO GPR:$Rs1, (NEG $imm))>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
342 def : Pat<(sub GPR:$Rs1, i32neg16:$imm),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
343 (ADD_I_LO GPR:$Rs1, (NEG $imm))>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
344
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
345 // Flag (incl. carry) setting addition and subtraction
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
346 let F = 1, Defs = [SR] in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
347 defm ADD_F_ : ALUarith<0b000, "add.f", addc, i32lo16z, i32hi16>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
348 defm SUB_F_ : ALUarith<0b010, "sub.f", subc, i32lo16z, i32hi16>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
349 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
350
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
351 def : Pat<(addc GPR:$Rs1, i32lo16z:$imm),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
352 (ADD_F_I_LO GPR:$Rs1, i32lo16z:$imm)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
353
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
354 def : Pat<(subc GPR:$Rs1, i32lo16z:$imm),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
355 (SUB_F_I_LO GPR:$Rs1, i32lo16z:$imm)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
356
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
357 def : Pat<(addc GPR:$Rs1, i32hi16:$imm),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
358 (ADD_F_I_HI GPR:$Rs1, i32hi16:$imm)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
359
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
360 def : Pat<(subc GPR:$Rs1, i32hi16:$imm),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
361 (SUB_F_I_HI GPR:$Rs1, i32hi16:$imm)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
362
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
363 // Carry using addition and subtraction
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
364 let F = 0, Uses = [SR] in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
365 defm ADDC_ : ALUarith<0b001, "addc", adde, i32lo16z, i32hi16>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
366 defm SUBB_ : ALUarith<0b011, "subb", sube, i32lo16z, i32hi16>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
367 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
368
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
369 def : Pat<(adde GPR:$Rs1, i32lo16z:$imm),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
370 (ADDC_I_LO GPR:$Rs1, i32lo16z:$imm)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
371
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
372 def : Pat<(sube GPR:$Rs1, i32lo16z:$imm),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
373 (SUBB_I_LO GPR:$Rs1, i32lo16z:$imm)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
374
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
375 def : Pat<(adde GPR:$Rs1, i32hi16:$imm),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
376 (ADDC_I_HI GPR:$Rs1, i32hi16:$imm)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
377
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
378 def : Pat<(sube GPR:$Rs1, i32hi16:$imm),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
379 (SUBB_I_HI GPR:$Rs1, i32hi16:$imm)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
380
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
381 // Flag setting ALU operations
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
382 let isAsCheapAsAMove = 1, F = 1, Defs = [SR] in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
383 let isCommutable = 1 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
384 defm AND_F_ : ALUlogic<0b100, "and.f", and, i32lo16and, i32hi16and>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
385 defm OR_F_ : ALUlogic<0b101, "or.f", or, i32lo16z, i32hi16>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
386 defm XOR_F_ : ALUlogic<0b110, "xor.f", xor, i32lo16z, i32hi16>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
387 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
388 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
389
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
390 let isAsCheapAsAMove = 1, F = 1, Defs = [SR], Uses = [SR] in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
391 defm ADDC_F_ : ALUarith<0b001, "addc.f", adde, i32lo16z, i32hi16>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
392 defm SUBB_F_ : ALUarith<0b011, "subb.f", sube, i32lo16z, i32hi16>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
393 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
394
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
395 def : Pat<(LanaiSubbF GPR:$Rs1, GPR:$Rs2),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
396 (SUBB_F_R GPR:$Rs1, GPR:$Rs2)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
397
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
398 def : Pat<(LanaiSubbF GPR:$Rs1, i32lo16z:$imm),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
399 (SUBB_F_I_LO GPR:$Rs1, i32lo16z:$imm)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
400
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
401 def : Pat<(LanaiSubbF GPR:$Rs1, i32hi16:$imm),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
402 (SUBB_F_I_HI GPR:$Rs1, i32hi16:$imm)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
403
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
404 def : InstAlias<"mov $src, $dst", (ADD_R GPR:$dst, GPR:$src, R0, 0)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
405
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
406 let isAsCheapAsAMove = 1, Rs1 = R0.Num, isCodeGenOnly = 1, H = 1, F = 0,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
407 isReMaterializable = 1 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
408 def MOVHI : InstRI<0b000, (outs GPR:$Rd), (ins i32hi16:$imm16),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
409 "mov\t$imm16, $Rd",
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
410 [(set GPR:$Rd, i32hi16:$imm16)]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
411
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
412 def : InstAlias<"mov $imm16, $dst", (ADD_I_LO GPR:$dst, R0, i32lo16z:$imm16)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
413 def : InstAlias<"mov $imm16, $dst", (ADD_I_HI GPR:$dst, R0, i32hi16:$imm16)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
414 def : InstAlias<"mov $imm16, $dst",
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
415 (AND_I_LO GPR:$dst, R1, i32lo16and:$imm16)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
416 def : InstAlias<"mov $imm16, $dst",
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
417 (AND_I_HI GPR:$dst, R1, i32hi16and:$imm16)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
418
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
419 // Shift instructions
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
420 class ShiftRI<string AsmStr, list<dag> Pattern>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
421 : InstRI<0b111, (outs GPR:$Rd), (ins GPR:$Rs1, immShift:$imm16),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
422 !strconcat(AsmStr, "\t$Rs1, $imm16, $Rd"), Pattern> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
423 let isReMaterializable = 1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
424 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
425
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
426 let F = 0 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
427 let H = 0 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
428 def SL_I : ShiftRI<"sh", [(set GPR:$Rd, (shl GPR:$Rs1, immShift:$imm16))]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
429 let H = 1 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
430 def SA_I : ShiftRI<"sha", []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
431 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
432 def : Pat<(srl GPR:$Rs1, immShift:$imm), (SL_I GPR:$Rs1, (NEG $imm))>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
433 def : Pat<(sra GPR:$Rs1, immShift:$imm), (SA_I GPR:$Rs1, (NEG $imm))>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
434
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
435 let F = 1, Defs = [SR] in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
436 let H = 0 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
437 def SL_F_I : ShiftRI<"sh.f", []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
438 let H = 1 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
439 def SA_F_I : ShiftRI<"sha.f", []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
440 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
441
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
442 class ShiftRR<string AsmStr, list<dag> Pattern>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
443 : InstRR<0b111, (outs GPR:$Rd), (ins GPR:$Rs1, GPR:$Rs2, pred:$DDDI), AsmStr,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
444 Pattern>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
445
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
446 let F = 0 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
447 let JJJJJ = 0b10000 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
448 def SHL_R : ShiftRR<"sh$DDDI\t$Rs1, $Rs2, $Rd",
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
449 [(set GPR:$Rd, (shl GPR:$Rs1, GPR:$Rs2))]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
450 let isCodeGenOnly = 1 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
451 let JJJJJ = 0b10000 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
452 def SRL_R : ShiftRR<"sh$DDDI\t$Rs1, $Rs2, $Rd", []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
453 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
454 let JJJJJ = 0b11000 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
455 def SRA_R : ShiftRR<"sha$DDDI\t$Rs1, $Rs2, $Rd", []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
456 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
457
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
458 let F = 1, Defs = [SR] in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
459 let JJJJJ = 0b10000 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
460 def SHL_F_R : ShiftRR<"sh.f$DDDI\t$Rs1, $Rs2, $Rd", []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
461 let isCodeGenOnly = 1 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
462 let JJJJJ = 0b10000 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
463 def SRL_F_R : ShiftRR<"sh.f$DDDI\t$Rs1, $Rs2, $Rd", []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
464 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
465 let JJJJJ = 0b11000 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
466 def SRA_F_R : ShiftRR<"sha.f$DDDI\t$Rs1, $Rs2, $Rd", []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
467 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
468
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
469 // Expand shift-right operations
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
470 def : Pat<(srl GPR:$Rs1, GPR:$Rs2),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
471 (SRL_R GPR:$Rs1, (SUB_R R0, GPR:$Rs2))>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
472 def : Pat<(sra GPR:$Rs1, GPR:$Rs2),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
473 (SRA_R GPR:$Rs1, (SUB_R R0, GPR:$Rs2))>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
474
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
475 // -------------------------------------------------- //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
476 // LOAD instructions
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
477 // -------------------------------------------------- //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
478
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
479 class LoadRR<string OpcString, PatFrag OpNode, ValueType Ty>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
480 : InstRRM<0b0, (outs GPR:$Rd), (ins MEMrr:$src),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
481 !strconcat(OpcString, "\t$src, $Rd"),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
482 [(set (Ty GPR:$Rd), (OpNode ADDRrr:$src))]>,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
483 Sched<[WriteLD]> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
484 bits<20> src;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
485
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
486 let Rs1 = src{19-15};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
487 let Rs2 = src{14-10};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
488 let P = src{9};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
489 let Q = src{8};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
490 let BBB = src{7-5};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
491 let JJJJJ = src{4-0};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
492 let mayLoad = 1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
493 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
494
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
495 class LoadRI<string OpcString, PatFrag OpNode, ValueType Ty>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
496 : InstRM<0b0, (outs GPR:$Rd), (ins MEMri:$src),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
497 !strconcat(OpcString, "\t$src, $Rd"),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
498 [(set (Ty GPR:$Rd), (OpNode ADDRri:$src))]>,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
499 Sched<[WriteLD]> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
500 bits<23> src;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
501
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
502 let Itinerary = IIC_LD;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
503 let Rs1 = src{22-18};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
504 let P = src{17};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
505 let Q = src{16};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
506 let imm16 = src{15-0};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
507 let isReMaterializable = 1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
508 let mayLoad = 1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
509 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
510
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
511 let E = 0 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
512 let YL = 0b01 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
513 // uld is used here and ld in the alias as the alias is printed out first if
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
514 // an alias exist
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
515 def LDW_RI : LoadRI<"uld", load, i32>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
516 def LDW_RR : LoadRR<"ld", load, i32>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
517 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
518 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
519
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
520 def : InstAlias<"ld $src, $dst", (LDW_RI GPR:$dst, MEMri:$src)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
521
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
522 let E = 1 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
523 let YL = 0b01 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
524 def LDWz_RR : LoadRR<"uld", zextloadi32, i32>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
525 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
526 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
527
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
528 let E = 1 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
529 let YL = 0b00 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
530 def LDHz_RR : LoadRR<"uld.h", zextloadi16, i32>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
531 let YL = 0b10 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
532 def LDBz_RR : LoadRR<"uld.b", zextloadi8, i32>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
533 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
534
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
535 let E = 0 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
536 let YL = 0b00 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
537 def LDHs_RR : LoadRR<"ld.h", sextloadi16, i32>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
538 let YL = 0b10 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
539 def LDBs_RR : LoadRR<"ld.b", sextloadi8, i32>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
540 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
541
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
542 def LDADDR : InstSLS<0x0, (outs GPR:$Rd), (ins MEMi:$src),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
543 "ld\t$src, $Rd",
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
544 [(set (i32 GPR:$Rd), (load ADDRsls:$src))]>,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
545 Sched<[WriteLD]> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
546 bits<21> src;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
547
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
548 let Itinerary = IIC_LD;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
549 let msb = src{20-16};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
550 let lsb = src{15-0};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
551 let isReMaterializable = 1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
552 let mayLoad = 1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
553 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
554
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
555 class LoadSPLS<string asmstring, PatFrag opNode>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
556 : InstSPLS<(outs GPR:$Rd), (ins MEMspls:$src),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
557 !strconcat(asmstring, "\t$src, $Rd"),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
558 [(set (i32 GPR:$Rd), (opNode ADDRspls:$src))]>,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
559 Sched<[WriteLDSW]> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
560 bits<17> src;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
561 let Itinerary = IIC_LDSW;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
562 let Rs1 = src{16-12};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
563 let P = src{11};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
564 let Q = src{10};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
565 let imm10 = src{9-0};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
566 let mayLoad = 1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
567 let isReMaterializable = 1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
568 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
569
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
570 let Y = 0, S = 0, E = 1 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
571 def LDHz_RI : LoadSPLS<"uld.h", zextloadi16>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
572
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
573 let Y = 0, S = 0, E = 0 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
574 def LDHs_RI : LoadSPLS<"ld.h", sextloadi16>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
575
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
576 let Y = 1, S = 0, E = 1 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
577 def LDBz_RI : LoadSPLS<"uld.b", zextloadi8>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
578
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
579 let Y = 1, S = 0, E = 0 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
580 def LDBs_RI : LoadSPLS<"ld.b", sextloadi8>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
581
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
582 def SLI : InstSLI<(outs GPR:$Rd), (ins i32lo21:$imm),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
583 "mov\t$imm, $Rd",
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
584 [(set GPR:$Rd, i32lo21:$imm)]> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
585 bits<21> imm;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
586
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
587 let msb = imm{20-16};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
588 let lsb = imm{15-0};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
589 let isReMaterializable = 1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
590 let isAsCheapAsAMove = 1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
591 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
592
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
593 // -------------------------------------------------- //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
594 // STORE instructions
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
595 // -------------------------------------------------- //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
596
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
597 class StoreRR<string OpcString, PatFrag OpNode, ValueType Ty>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
598 : InstRRM<0b1, (outs), (ins GPR:$Rd, MEMrr:$dst),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
599 !strconcat(OpcString, "\t$Rd, $dst"),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
600 [(OpNode (Ty GPR:$Rd), ADDRrr:$dst)]>,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
601 Sched<[WriteST]> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
602 bits<20> dst;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
603
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
604 let Itinerary = IIC_ST;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
605 let Rs1 = dst{19-15};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
606 let Rs2 = dst{14-10};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
607 let P = dst{9};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
608 let Q = dst{8};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
609 let BBB = dst{7-5};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
610 let JJJJJ = dst{4-0};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
611 let mayStore = 1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
612 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
613
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
614 class StoreRI<string OpcString, PatFrag OpNode, ValueType Ty>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
615 : InstRM<0b1, (outs), (ins GPR:$Rd, MEMri:$dst),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
616 !strconcat(OpcString, "\t$Rd, $dst"),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
617 [(OpNode (Ty GPR:$Rd), ADDRri:$dst)]>,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
618 Sched<[WriteST]> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
619 bits<23> dst;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
620
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
621 let Itinerary = IIC_ST;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
622 let Rs1 = dst{22-18};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
623 let P = dst{17};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
624 let Q = dst{16};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
625 let imm16 = dst{15-0};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
626 let mayStore = 1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
627 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
628
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
629 let YL = 0b01, E = 0 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
630 def SW_RR : StoreRR<"st", store, i32>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
631 def SW_RI : StoreRI<"st", store, i32>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
632 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
633
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
634 let E = 0 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
635 let YL = 0b00 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
636 def STH_RR : StoreRR<"st.h", truncstorei16, i32>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
637 let YL = 0b10 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
638 def STB_RR : StoreRR<"st.b", truncstorei8, i32>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
639 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
640
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
641 def STADDR : InstSLS<0x1, (outs), (ins GPR:$Rd, MEMi:$dst),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
642 "st\t$Rd, $dst",
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
643 [(store (i32 GPR:$Rd), ADDRsls:$dst)]>,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
644 Sched<[WriteST]> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
645 bits<21> dst;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
646
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
647 let Itinerary = IIC_ST;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
648 let msb = dst{20-16};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
649 let lsb = dst{15-0};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
650 let mayStore = 1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
651 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
652
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
653 class StoreSPLS<string asmstring, PatFrag opNode>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
654 : InstSPLS<(outs), (ins GPR:$Rd, MEMspls:$dst),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
655 !strconcat(asmstring, "\t$Rd, $dst"),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
656 [(opNode (i32 GPR:$Rd), ADDRspls:$dst)]>,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
657 Sched<[WriteSTSW]> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
658 bits<17> dst;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
659
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
660 let Itinerary = IIC_STSW;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
661 let Rs1 = dst{16-12};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
662 let P = dst{11};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
663 let Q = dst{10};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
664 let imm10 = dst{9-0};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
665 let mayStore = 1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
666 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
667
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
668 let Y = 0, S = 1, E = 0 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
669 def STH_RI : StoreSPLS<"st.h", truncstorei16>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
670
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
671 let Y = 1, S = 1, E = 0 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
672 def STB_RI : StoreSPLS<"st.b", truncstorei8>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
673
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
674 // -------------------------------------------------- //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
675 // BRANCH instructions
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
676 // -------------------------------------------------- //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
677
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
678 let isBranch = 1, isBarrier = 1, isTerminator = 1, hasDelaySlot = 1 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
679 def BT : InstBR<(outs), (ins BrTarget:$addr),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
680 "bt\t$addr",
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
681 [(br bb:$addr)]> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
682 let DDDI = 0b0000;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
683 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
684 let Uses = [SR] in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
685 def BRCC : InstBR<(outs), (ins BrTarget:$addr, CCOp:$DDDI),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
686 "b$DDDI\t$addr",
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
687 [(LanaiBrCC bb:$addr, imm:$DDDI)]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
688
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
689 let isIndirectBranch = 1 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
690 def JR : InstRR<0b101, (outs), (ins GPR:$Rs2), "bt\t$Rs2",
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
691 [(brind GPR:$Rs2)]> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
692 let Rs1 = R0.Num;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
693 let Rd = R2.Num;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
694 let F = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
695 let JJJJJ = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
696 let DDDI = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
697 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
698 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
699 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
700
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
701 // -------------------------------------------------- //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
702 // Condition/SF instructions
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
703 // -------------------------------------------------- //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
704
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
705 // Instructions to set flags used in lowering comparisons.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
706 multiclass SF<bits<3> op2Val, string AsmStr> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
707 let F = 1, Rd = R0.Num, JJJJJ = 0, Defs = [SR], DDDI = 0 in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
708 def _RR : InstRR<op2Val, (outs), (ins GPR:$Rs1, GPR:$Rs2),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
709 !strconcat(AsmStr, "\t$Rs1, $Rs2, %r0"),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
710 [(LanaiSetFlag (i32 GPR:$Rs1), (i32 GPR:$Rs2))]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
711 let F = 1, Rd = R0.Num, H = 0, Defs = [SR] in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
712 def _RI_LO : InstRI<op2Val, (outs), (ins GPR:$Rs1, i32lo16z:$imm16),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
713 !strconcat(AsmStr, "\t$Rs1, $imm16, %r0"),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
714 [(LanaiSetFlag (i32 GPR:$Rs1), i32lo16z:$imm16)]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
715 let F = 1, Rd = R0.Num, H = 1, Defs = [SR] in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
716 def _RI_HI : InstRI<op2Val, (outs), (ins GPR:$Rs1, i32hi16:$imm16),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
717 !strconcat(AsmStr, "\t$Rs1, $imm16, %r0"),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
718 [(LanaiSetFlag (i32 GPR:$Rs1), i32hi16:$imm16)]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
719 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
720 let isCodeGenOnly = 1, isCompare = 1 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
721 defm SFSUB_F : SF<0b010, "sub.f">;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
722 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
723
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
724 // Jump and link
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
725 let isCall = 1, hasDelaySlot = 1, isCodeGenOnly = 1, Uses = [SP],
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
726 Defs = [RCA] in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
727 def CALL : Pseudo<(outs), (ins CallTarget:$addr), "", []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
728 def CALLR : Pseudo<(outs), (ins GPR:$Rs1), "", [(Call GPR:$Rs1)]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
729 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
730
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
731 let isReturn = 1, isTerminator = 1, hasDelaySlot = 1, isBarrier = 1,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
732 Uses = [RCA] in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
733 def RET : InstRM<0b0, (outs), (ins),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
734 "ld\t-4[%fp], %pc ! return",
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
735 [(RetFlag)]> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
736 let Rd = PC.Num;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
737 let Rs1 = FP.Num;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
738 let P = 1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
739 let Q = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
740 let imm16 = -4;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
741
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
742 // Post encoding is not needed for RET.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
743 let PostEncoderMethod = "";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
744 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
745 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
746
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
747 // ADJCALLSTACKDOWN/UP implicitly use/def SP because they may be expanded into
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
748 // a stack adjustment and the codegen must know that they may modify the stack
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
749 // pointer before prolog-epilog rewriting occurs.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
750 // Pessimistically assume ADJCALLSTACKDOWN / ADJCALLSTACKUP will become
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
751 // sub / add which can clobber SP.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
752 let Defs = [SP], Uses = [SP] in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
753 def ADJCALLSTACKDOWN : Pseudo<(outs), (ins i32imm:$amt),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
754 "#ADJCALLSTACKDOWN $amt",
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
755 [(CallSeqStart timm:$amt)]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
756 def ADJCALLSTACKUP : Pseudo<(outs), (ins i32imm:$amt1, i32imm:$amt2),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
757 "#ADJCALLSTACKUP $amt1 $amt2",
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
758 [(CallSeqEnd timm:$amt1, timm:$amt2)]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
759 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
760
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
761 let Defs = [SP], Uses = [SP] in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
762 def ADJDYNALLOC : Pseudo<(outs GPR:$dst), (ins GPR:$src),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
763 "#ADJDYNALLOC $dst $src",
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
764 [(set GPR:$dst, (LanaiAdjDynAlloc GPR:$src))]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
765 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
766
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
767 let Uses = [SR] in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
768 def SCC : InstSCC<(outs GPR:$Rs1), (ins CCOp:$DDDI),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
769 "s$DDDI\t$Rs1",
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
770 [(set (i32 GPR:$Rs1), (LanaiSetCC imm:$DDDI))]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
771 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
772
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
773 // SCC's output is already 1-bit so and'ing with 1 is redundant.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
774 def : Pat<(and (LanaiSetCC imm:$DDDI), 1), (SCC imm:$DDDI)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
775
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
776 // Select with hardware support
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
777 let Uses = [SR], isSelect = 1 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
778 def SELECT : InstRR<0b111, (outs GPR:$Rd),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
779 (ins GPR:$Rs1, GPR:$Rs2, CCOp:$DDDI),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
780 "sel.$DDDI $Rs1, $Rs2, $Rd",
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
781 [(set (i32 GPR:$Rd),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
782 (LanaiSelectCC (i32 GPR:$Rs1), (i32 GPR:$Rs2),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
783 (imm:$DDDI)))]> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
784 let JJJJJ = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
785 let F = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
786 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
787 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
788
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
789 let isBranch = 1, isBarrier = 1, isTerminator = 1, hasDelaySlot = 1,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
790 isIndirectBranch = 1, Uses = [SR] in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
791 def BRIND_CC : InstRR<0b101, (outs), (ins GPR:$Rs1, CCOp:$DDDI),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
792 "b$DDDI\t$Rs1", []> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
793 let F = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
794 let JJJJJ = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
795 let Rd = PC.Num;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
796 let Rs2 = R0.Num;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
797 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
798
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
799 def BRIND_CCA : InstRR<0b101, (outs), (ins GPR:$Rs1, GPR:$Rs2, CCOp:$DDDI),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
800 "b${DDDI}\t$Rs1 add $Rs2", []> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
801 let F = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
802 let Rd = PC.Num;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
803 let JJJJJ = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
804 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
805 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
806
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
807 // TODO: This only considers the case where BROFF is an immediate and not where
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
808 // it is a register. Add support for register relative branching.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
809 let isBranch = 1, isBarrier = 1, isTerminator = 1, hasDelaySlot = 1, Rs1 = 0,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
810 Uses = [SR] in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
811 def BRR : InstBRR<(outs), (ins i16imm:$imm16, CCOp:$DDDI),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
812 "b${DDDI}.r\t$imm16", []>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
813
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
814 let F = 0 in {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
815 // Population Count (POPC)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
816 def POPC: InstSpecial<0b001, (outs GPR:$Rd), (ins GPR:$Rs1),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
817 "popc\t$Rs1, $Rd",
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
818 [(set GPR:$Rd, (ctpop GPR:$Rs1))]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
819
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
820 // Count Leading Zeros (LEADZ)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
821 def LEADZ: InstSpecial<0b010, (outs GPR:$Rd), (ins GPR:$Rs1),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
822 "leadz\t$Rs1, $Rd", [(set GPR:$Rd, (ctlz GPR:$Rs1))]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
823
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
824 // Count Trailing Zeros (TRAILZ)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
825 def TRAILZ : InstSpecial<0b011, (outs GPR:$Rd), (ins GPR:$Rs1),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
826 "trailz\t$Rs1, $Rd",
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
827 [(set GPR:$Rd, (cttz GPR:$Rs1))]>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
828 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
829
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
830 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
831 // Non-Instruction Patterns
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
832 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
833
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
834 // i32 0 and R0 can be used interchangeably.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
835 def : Pat<(i32 0), (i32 R0)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
836 // i32 -1 and R1 can be used interchangeably.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
837 def : Pat<(i32 -1), (i32 R1)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
838
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
839 // unsigned 16-bit immediate
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
840 def : Pat<(i32 i32lo16z:$imm), (OR_I_LO (i32 R0), imm:$imm)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
841
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
842 // arbitrary immediate
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
843 def : Pat<(i32 imm:$imm), (OR_I_LO (MOVHI (HI16 imm:$imm)), (LO16 imm:$imm))>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
844
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
845 // Calls
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
846 def : Pat<(Call tglobaladdr:$dst), (CALL tglobaladdr:$dst)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
847 def : Pat<(Call texternalsym:$dst), (CALL texternalsym:$dst)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
848
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
849 // Loads
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
850 def : Pat<(extloadi8 ADDRspls:$src), (i32 (LDBz_RI ADDRspls:$src))>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
851 def : Pat<(extloadi16 ADDRspls:$src), (i32 (LDHz_RI ADDRspls:$src))>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
852
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
853 // GlobalAddress, ExternalSymbol, Jumptable, ConstantPool
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
854 def : Pat<(LanaiHi tglobaladdr:$dst), (MOVHI tglobaladdr:$dst)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
855 def : Pat<(LanaiLo tglobaladdr:$dst), (OR_I_LO (i32 R0), tglobaladdr:$dst)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
856 def : Pat<(LanaiSmall tglobaladdr:$dst), (SLI tglobaladdr:$dst)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
857 def : Pat<(LanaiHi texternalsym:$dst), (MOVHI texternalsym:$dst)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
858 def : Pat<(LanaiLo texternalsym:$dst), (OR_I_LO (i32 R0), texternalsym:$dst)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
859 def : Pat<(LanaiSmall texternalsym:$dst), (SLI texternalsym:$dst)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
860 def : Pat<(LanaiHi tblockaddress:$dst), (MOVHI tblockaddress:$dst)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
861 def : Pat<(LanaiLo tblockaddress:$dst), (OR_I_LO (i32 R0), tblockaddress:$dst)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
862 def : Pat<(LanaiSmall tblockaddress:$dst), (SLI tblockaddress:$dst)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
863 def : Pat<(LanaiHi tjumptable:$dst), (MOVHI tjumptable:$dst)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
864 def : Pat<(LanaiLo tjumptable:$dst), (OR_I_LO (i32 R0), tjumptable:$dst)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
865 def : Pat<(LanaiSmall tjumptable:$dst), (SLI tjumptable:$dst)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
866 def : Pat<(LanaiHi tconstpool:$dst), (MOVHI tconstpool:$dst)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
867 def : Pat<(LanaiLo tconstpool:$dst), (OR_I_LO (i32 R0), tconstpool:$dst)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
868 def : Pat<(LanaiSmall tconstpool:$dst), (SLI tconstpool:$dst)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
869
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
870 def : Pat<(or GPR:$hi, (LanaiLo tglobaladdr:$lo)),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
871 (OR_I_LO GPR:$hi, tglobaladdr:$lo)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
872 def : Pat<(or R0, (LanaiSmall tglobaladdr:$small)),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
873 (SLI tglobaladdr:$small)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
874 def : Pat<(or GPR:$hi, (LanaiLo texternalsym:$lo)),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
875 (OR_I_LO GPR:$hi, texternalsym:$lo)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
876 def : Pat<(or R0, (LanaiSmall texternalsym:$small)),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
877 (SLI texternalsym:$small)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
878 def : Pat<(or GPR:$hi, (LanaiLo tblockaddress:$lo)),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
879 (OR_I_LO GPR:$hi, tblockaddress:$lo)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
880 def : Pat<(or R0, (LanaiSmall tblockaddress:$small)),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
881 (SLI tblockaddress:$small)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
882 def : Pat<(or GPR:$hi, (LanaiLo tjumptable:$lo)),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
883 (OR_I_LO GPR:$hi, tjumptable:$lo)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
884 def : Pat<(or R0, (LanaiSmall tjumptable:$small)),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
885 (SLI tjumptable:$small)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
886 def : Pat<(or GPR:$hi, (LanaiLo tconstpool:$lo)),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
887 (OR_I_LO GPR:$hi, tconstpool:$lo)>;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
888 def : Pat<(or R0, (LanaiSmall tconstpool:$small)),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
889 (SLI tconstpool:$small)>;