1
2
3 package rewriteriscv64latelower
4
5 import "cmd/compile/internal/ssa/ssaop"
6 import "cmd/compile/internal/ssa"
7
8 func RewriteValue(v *ssa.Value) bool {
9 switch v.Op {
10 case ssaop.OpRISCV64AND:
11 return rewriteValue_OpRISCV64AND(v)
12 case ssaop.OpRISCV64NOT:
13 return rewriteValue_OpRISCV64NOT(v)
14 case ssaop.OpRISCV64OR:
15 return rewriteValue_OpRISCV64OR(v)
16 case ssaop.OpRISCV64SLLI:
17 return rewriteValue_OpRISCV64SLLI(v)
18 case ssaop.OpRISCV64SRAI:
19 return rewriteValue_OpRISCV64SRAI(v)
20 case ssaop.OpRISCV64SRLI:
21 return rewriteValue_OpRISCV64SRLI(v)
22 case ssaop.OpRISCV64XOR:
23 return rewriteValue_OpRISCV64XOR(v)
24 }
25 return false
26 }
27 func rewriteValue_OpRISCV64AND(v *ssa.Value) bool {
28 v_1 := v.Args[1]
29 v_0 := v.Args[0]
30
31
32 for {
33 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34 x := v_0
35 if v_1.Op != ssaop.OpRISCV64NOT {
36 continue
37 }
38 y := v_1.Args[0]
39 v.Reset(ssaop.OpRISCV64ANDN)
40 v.AddArg2(x, y)
41 return true
42 }
43 break
44 }
45 return false
46 }
47 func rewriteValue_OpRISCV64NOT(v *ssa.Value) bool {
48 v_0 := v.Args[0]
49
50
51 for {
52 if v_0.Op != ssaop.OpRISCV64XOR {
53 break
54 }
55 y := v_0.Args[1]
56 x := v_0.Args[0]
57 v.Reset(ssaop.OpRISCV64XNOR)
58 v.AddArg2(x, y)
59 return true
60 }
61 return false
62 }
63 func rewriteValue_OpRISCV64OR(v *ssa.Value) bool {
64 v_1 := v.Args[1]
65 v_0 := v.Args[0]
66
67
68 for {
69 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
70 x := v_0
71 if v_1.Op != ssaop.OpRISCV64NOT {
72 continue
73 }
74 y := v_1.Args[0]
75 v.Reset(ssaop.OpRISCV64ORN)
76 v.AddArg2(x, y)
77 return true
78 }
79 break
80 }
81 return false
82 }
83 func rewriteValue_OpRISCV64SLLI(v *ssa.Value) bool {
84 v_0 := v.Args[0]
85 b := v.Block
86 typ := &b.Func.Config.Types
87
88
89
90 for {
91 c := ssa.AuxIntToInt64(v.AuxInt)
92 if v_0.Op != ssaop.OpRISCV64MOVBUreg {
93 break
94 }
95 x := v_0.Args[0]
96 if !(c <= 56) {
97 break
98 }
99 v.Reset(ssaop.OpRISCV64SRLI)
100 v.AuxInt = ssa.Int64ToAuxInt(56 - c)
101 v0 := b.NewValue0(v.Pos, ssaop.OpRISCV64SLLI, typ.UInt64)
102 v0.AuxInt = ssa.Int64ToAuxInt(56)
103 v0.AddArg(x)
104 v.AddArg(v0)
105 return true
106 }
107
108
109
110 for {
111 c := ssa.AuxIntToInt64(v.AuxInt)
112 if v_0.Op != ssaop.OpRISCV64MOVHUreg {
113 break
114 }
115 x := v_0.Args[0]
116 if !(c <= 48) {
117 break
118 }
119 v.Reset(ssaop.OpRISCV64SRLI)
120 v.AuxInt = ssa.Int64ToAuxInt(48 - c)
121 v0 := b.NewValue0(v.Pos, ssaop.OpRISCV64SLLI, typ.UInt64)
122 v0.AuxInt = ssa.Int64ToAuxInt(48)
123 v0.AddArg(x)
124 v.AddArg(v0)
125 return true
126 }
127
128
129
130 for {
131 c := ssa.AuxIntToInt64(v.AuxInt)
132 if v_0.Op != ssaop.OpRISCV64MOVWUreg {
133 break
134 }
135 x := v_0.Args[0]
136 if !(c <= 32) {
137 break
138 }
139 v.Reset(ssaop.OpRISCV64SRLI)
140 v.AuxInt = ssa.Int64ToAuxInt(32 - c)
141 v0 := b.NewValue0(v.Pos, ssaop.OpRISCV64SLLI, typ.UInt64)
142 v0.AuxInt = ssa.Int64ToAuxInt(32)
143 v0.AddArg(x)
144 v.AddArg(v0)
145 return true
146 }
147
148
149 for {
150 if ssa.AuxIntToInt64(v.AuxInt) != 0 {
151 break
152 }
153 x := v_0
154 v.CopyOf(x)
155 return true
156 }
157 return false
158 }
159 func rewriteValue_OpRISCV64SRAI(v *ssa.Value) bool {
160 v_0 := v.Args[0]
161 b := v.Block
162 typ := &b.Func.Config.Types
163
164
165
166 for {
167 c := ssa.AuxIntToInt64(v.AuxInt)
168 if v_0.Op != ssaop.OpRISCV64MOVBreg {
169 break
170 }
171 x := v_0.Args[0]
172 if !(c < 8) {
173 break
174 }
175 v.Reset(ssaop.OpRISCV64SRAI)
176 v.AuxInt = ssa.Int64ToAuxInt(56 + c)
177 v0 := b.NewValue0(v.Pos, ssaop.OpRISCV64SLLI, typ.Int64)
178 v0.AuxInt = ssa.Int64ToAuxInt(56)
179 v0.AddArg(x)
180 v.AddArg(v0)
181 return true
182 }
183
184
185
186 for {
187 c := ssa.AuxIntToInt64(v.AuxInt)
188 if v_0.Op != ssaop.OpRISCV64MOVHreg {
189 break
190 }
191 x := v_0.Args[0]
192 if !(c < 16) {
193 break
194 }
195 v.Reset(ssaop.OpRISCV64SRAI)
196 v.AuxInt = ssa.Int64ToAuxInt(48 + c)
197 v0 := b.NewValue0(v.Pos, ssaop.OpRISCV64SLLI, typ.Int64)
198 v0.AuxInt = ssa.Int64ToAuxInt(48)
199 v0.AddArg(x)
200 v.AddArg(v0)
201 return true
202 }
203
204
205
206 for {
207 c := ssa.AuxIntToInt64(v.AuxInt)
208 if v_0.Op != ssaop.OpRISCV64MOVWreg {
209 break
210 }
211 x := v_0.Args[0]
212 if !(c < 32) {
213 break
214 }
215 v.Reset(ssaop.OpRISCV64SRAI)
216 v.AuxInt = ssa.Int64ToAuxInt(32 + c)
217 v0 := b.NewValue0(v.Pos, ssaop.OpRISCV64SLLI, typ.Int64)
218 v0.AuxInt = ssa.Int64ToAuxInt(32)
219 v0.AddArg(x)
220 v.AddArg(v0)
221 return true
222 }
223
224
225 for {
226 if ssa.AuxIntToInt64(v.AuxInt) != 0 {
227 break
228 }
229 x := v_0
230 v.CopyOf(x)
231 return true
232 }
233 return false
234 }
235 func rewriteValue_OpRISCV64SRLI(v *ssa.Value) bool {
236 v_0 := v.Args[0]
237 b := v.Block
238 typ := &b.Func.Config.Types
239
240
241
242 for {
243 c := ssa.AuxIntToInt64(v.AuxInt)
244 if v_0.Op != ssaop.OpRISCV64MOVBUreg {
245 break
246 }
247 x := v_0.Args[0]
248 if !(c < 8) {
249 break
250 }
251 v.Reset(ssaop.OpRISCV64SRLI)
252 v.AuxInt = ssa.Int64ToAuxInt(56 + c)
253 v0 := b.NewValue0(v.Pos, ssaop.OpRISCV64SLLI, typ.UInt64)
254 v0.AuxInt = ssa.Int64ToAuxInt(56)
255 v0.AddArg(x)
256 v.AddArg(v0)
257 return true
258 }
259
260
261
262 for {
263 c := ssa.AuxIntToInt64(v.AuxInt)
264 if v_0.Op != ssaop.OpRISCV64MOVHUreg {
265 break
266 }
267 x := v_0.Args[0]
268 if !(c < 16) {
269 break
270 }
271 v.Reset(ssaop.OpRISCV64SRLI)
272 v.AuxInt = ssa.Int64ToAuxInt(48 + c)
273 v0 := b.NewValue0(v.Pos, ssaop.OpRISCV64SLLI, typ.UInt64)
274 v0.AuxInt = ssa.Int64ToAuxInt(48)
275 v0.AddArg(x)
276 v.AddArg(v0)
277 return true
278 }
279
280
281
282 for {
283 c := ssa.AuxIntToInt64(v.AuxInt)
284 if v_0.Op != ssaop.OpRISCV64MOVWUreg {
285 break
286 }
287 x := v_0.Args[0]
288 if !(c < 32) {
289 break
290 }
291 v.Reset(ssaop.OpRISCV64SRLI)
292 v.AuxInt = ssa.Int64ToAuxInt(32 + c)
293 v0 := b.NewValue0(v.Pos, ssaop.OpRISCV64SLLI, typ.UInt64)
294 v0.AuxInt = ssa.Int64ToAuxInt(32)
295 v0.AddArg(x)
296 v.AddArg(v0)
297 return true
298 }
299
300
301 for {
302 if ssa.AuxIntToInt64(v.AuxInt) != 0 {
303 break
304 }
305 x := v_0
306 v.CopyOf(x)
307 return true
308 }
309 return false
310 }
311 func rewriteValue_OpRISCV64XOR(v *ssa.Value) bool {
312 v_1 := v.Args[1]
313 v_0 := v.Args[0]
314
315
316 for {
317 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
318 x := v_0
319 if v_1.Op != ssaop.OpRISCV64NOT {
320 continue
321 }
322 y := v_1.Args[0]
323 v.Reset(ssaop.OpRISCV64XNOR)
324 v.AddArg2(x, y)
325 return true
326 }
327 break
328 }
329 return false
330 }
331 func RewriteBlock(b *ssa.Block) bool {
332 return false
333 }
334
View as plain text