Source file src/pkg/cmd/compile/internal/ssa/rewritedec64.go
1
2
3
4 package ssa
5
6 import "fmt"
7 import "math"
8 import "cmd/internal/obj"
9 import "cmd/internal/objabi"
10 import "cmd/compile/internal/types"
11
12 var _ = fmt.Println
13 var _ = math.MinInt8
14 var _ = obj.ANOP
15 var _ = objabi.GOROOT
16 var _ = types.TypeMem
17
18 func rewriteValuedec64(v *Value) bool {
19 switch v.Op {
20 case OpAdd64:
21 return rewriteValuedec64_OpAdd64_0(v)
22 case OpAnd64:
23 return rewriteValuedec64_OpAnd64_0(v)
24 case OpArg:
25 return rewriteValuedec64_OpArg_0(v)
26 case OpBitLen64:
27 return rewriteValuedec64_OpBitLen64_0(v)
28 case OpBswap64:
29 return rewriteValuedec64_OpBswap64_0(v)
30 case OpCom64:
31 return rewriteValuedec64_OpCom64_0(v)
32 case OpConst64:
33 return rewriteValuedec64_OpConst64_0(v)
34 case OpCtz64:
35 return rewriteValuedec64_OpCtz64_0(v)
36 case OpCtz64NonZero:
37 return rewriteValuedec64_OpCtz64NonZero_0(v)
38 case OpEq64:
39 return rewriteValuedec64_OpEq64_0(v)
40 case OpGeq64:
41 return rewriteValuedec64_OpGeq64_0(v)
42 case OpGeq64U:
43 return rewriteValuedec64_OpGeq64U_0(v)
44 case OpGreater64:
45 return rewriteValuedec64_OpGreater64_0(v)
46 case OpGreater64U:
47 return rewriteValuedec64_OpGreater64U_0(v)
48 case OpInt64Hi:
49 return rewriteValuedec64_OpInt64Hi_0(v)
50 case OpInt64Lo:
51 return rewriteValuedec64_OpInt64Lo_0(v)
52 case OpLeq64:
53 return rewriteValuedec64_OpLeq64_0(v)
54 case OpLeq64U:
55 return rewriteValuedec64_OpLeq64U_0(v)
56 case OpLess64:
57 return rewriteValuedec64_OpLess64_0(v)
58 case OpLess64U:
59 return rewriteValuedec64_OpLess64U_0(v)
60 case OpLoad:
61 return rewriteValuedec64_OpLoad_0(v)
62 case OpLsh16x64:
63 return rewriteValuedec64_OpLsh16x64_0(v)
64 case OpLsh32x64:
65 return rewriteValuedec64_OpLsh32x64_0(v)
66 case OpLsh64x16:
67 return rewriteValuedec64_OpLsh64x16_0(v)
68 case OpLsh64x32:
69 return rewriteValuedec64_OpLsh64x32_0(v)
70 case OpLsh64x64:
71 return rewriteValuedec64_OpLsh64x64_0(v)
72 case OpLsh64x8:
73 return rewriteValuedec64_OpLsh64x8_0(v)
74 case OpLsh8x64:
75 return rewriteValuedec64_OpLsh8x64_0(v)
76 case OpMul64:
77 return rewriteValuedec64_OpMul64_0(v)
78 case OpNeg64:
79 return rewriteValuedec64_OpNeg64_0(v)
80 case OpNeq64:
81 return rewriteValuedec64_OpNeq64_0(v)
82 case OpOr64:
83 return rewriteValuedec64_OpOr64_0(v)
84 case OpRsh16Ux64:
85 return rewriteValuedec64_OpRsh16Ux64_0(v)
86 case OpRsh16x64:
87 return rewriteValuedec64_OpRsh16x64_0(v)
88 case OpRsh32Ux64:
89 return rewriteValuedec64_OpRsh32Ux64_0(v)
90 case OpRsh32x64:
91 return rewriteValuedec64_OpRsh32x64_0(v)
92 case OpRsh64Ux16:
93 return rewriteValuedec64_OpRsh64Ux16_0(v)
94 case OpRsh64Ux32:
95 return rewriteValuedec64_OpRsh64Ux32_0(v)
96 case OpRsh64Ux64:
97 return rewriteValuedec64_OpRsh64Ux64_0(v)
98 case OpRsh64Ux8:
99 return rewriteValuedec64_OpRsh64Ux8_0(v)
100 case OpRsh64x16:
101 return rewriteValuedec64_OpRsh64x16_0(v)
102 case OpRsh64x32:
103 return rewriteValuedec64_OpRsh64x32_0(v)
104 case OpRsh64x64:
105 return rewriteValuedec64_OpRsh64x64_0(v)
106 case OpRsh64x8:
107 return rewriteValuedec64_OpRsh64x8_0(v)
108 case OpRsh8Ux64:
109 return rewriteValuedec64_OpRsh8Ux64_0(v)
110 case OpRsh8x64:
111 return rewriteValuedec64_OpRsh8x64_0(v)
112 case OpSignExt16to64:
113 return rewriteValuedec64_OpSignExt16to64_0(v)
114 case OpSignExt32to64:
115 return rewriteValuedec64_OpSignExt32to64_0(v)
116 case OpSignExt8to64:
117 return rewriteValuedec64_OpSignExt8to64_0(v)
118 case OpStore:
119 return rewriteValuedec64_OpStore_0(v)
120 case OpSub64:
121 return rewriteValuedec64_OpSub64_0(v)
122 case OpTrunc64to16:
123 return rewriteValuedec64_OpTrunc64to16_0(v)
124 case OpTrunc64to32:
125 return rewriteValuedec64_OpTrunc64to32_0(v)
126 case OpTrunc64to8:
127 return rewriteValuedec64_OpTrunc64to8_0(v)
128 case OpXor64:
129 return rewriteValuedec64_OpXor64_0(v)
130 case OpZeroExt16to64:
131 return rewriteValuedec64_OpZeroExt16to64_0(v)
132 case OpZeroExt32to64:
133 return rewriteValuedec64_OpZeroExt32to64_0(v)
134 case OpZeroExt8to64:
135 return rewriteValuedec64_OpZeroExt8to64_0(v)
136 }
137 return false
138 }
139 func rewriteValuedec64_OpAdd64_0(v *Value) bool {
140 b := v.Block
141 typ := &b.Func.Config.Types
142
143
144
145 for {
146 y := v.Args[1]
147 x := v.Args[0]
148 v.reset(OpInt64Make)
149 v0 := b.NewValue0(v.Pos, OpAdd32withcarry, typ.Int32)
150 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
151 v1.AddArg(x)
152 v0.AddArg(v1)
153 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
154 v2.AddArg(y)
155 v0.AddArg(v2)
156 v3 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
157 v4 := b.NewValue0(v.Pos, OpAdd32carry, types.NewTuple(typ.UInt32, types.TypeFlags))
158 v5 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
159 v5.AddArg(x)
160 v4.AddArg(v5)
161 v6 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
162 v6.AddArg(y)
163 v4.AddArg(v6)
164 v3.AddArg(v4)
165 v0.AddArg(v3)
166 v.AddArg(v0)
167 v7 := b.NewValue0(v.Pos, OpSelect0, typ.UInt32)
168 v8 := b.NewValue0(v.Pos, OpAdd32carry, types.NewTuple(typ.UInt32, types.TypeFlags))
169 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
170 v9.AddArg(x)
171 v8.AddArg(v9)
172 v10 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
173 v10.AddArg(y)
174 v8.AddArg(v10)
175 v7.AddArg(v8)
176 v.AddArg(v7)
177 return true
178 }
179 }
180 func rewriteValuedec64_OpAnd64_0(v *Value) bool {
181 b := v.Block
182 typ := &b.Func.Config.Types
183
184
185
186 for {
187 y := v.Args[1]
188 x := v.Args[0]
189 v.reset(OpInt64Make)
190 v0 := b.NewValue0(v.Pos, OpAnd32, typ.UInt32)
191 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
192 v1.AddArg(x)
193 v0.AddArg(v1)
194 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
195 v2.AddArg(y)
196 v0.AddArg(v2)
197 v.AddArg(v0)
198 v3 := b.NewValue0(v.Pos, OpAnd32, typ.UInt32)
199 v4 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
200 v4.AddArg(x)
201 v3.AddArg(v4)
202 v5 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
203 v5.AddArg(y)
204 v3.AddArg(v5)
205 v.AddArg(v3)
206 return true
207 }
208 }
209 func rewriteValuedec64_OpArg_0(v *Value) bool {
210 b := v.Block
211 config := b.Func.Config
212 typ := &b.Func.Config.Types
213
214
215
216 for {
217 off := v.AuxInt
218 n := v.Aux
219 if !(is64BitInt(v.Type) && !config.BigEndian && v.Type.IsSigned()) {
220 break
221 }
222 v.reset(OpInt64Make)
223 v0 := b.NewValue0(v.Pos, OpArg, typ.Int32)
224 v0.AuxInt = off + 4
225 v0.Aux = n
226 v.AddArg(v0)
227 v1 := b.NewValue0(v.Pos, OpArg, typ.UInt32)
228 v1.AuxInt = off
229 v1.Aux = n
230 v.AddArg(v1)
231 return true
232 }
233
234
235
236 for {
237 off := v.AuxInt
238 n := v.Aux
239 if !(is64BitInt(v.Type) && !config.BigEndian && !v.Type.IsSigned()) {
240 break
241 }
242 v.reset(OpInt64Make)
243 v0 := b.NewValue0(v.Pos, OpArg, typ.UInt32)
244 v0.AuxInt = off + 4
245 v0.Aux = n
246 v.AddArg(v0)
247 v1 := b.NewValue0(v.Pos, OpArg, typ.UInt32)
248 v1.AuxInt = off
249 v1.Aux = n
250 v.AddArg(v1)
251 return true
252 }
253
254
255
256 for {
257 off := v.AuxInt
258 n := v.Aux
259 if !(is64BitInt(v.Type) && config.BigEndian && v.Type.IsSigned()) {
260 break
261 }
262 v.reset(OpInt64Make)
263 v0 := b.NewValue0(v.Pos, OpArg, typ.Int32)
264 v0.AuxInt = off
265 v0.Aux = n
266 v.AddArg(v0)
267 v1 := b.NewValue0(v.Pos, OpArg, typ.UInt32)
268 v1.AuxInt = off + 4
269 v1.Aux = n
270 v.AddArg(v1)
271 return true
272 }
273
274
275
276 for {
277 off := v.AuxInt
278 n := v.Aux
279 if !(is64BitInt(v.Type) && config.BigEndian && !v.Type.IsSigned()) {
280 break
281 }
282 v.reset(OpInt64Make)
283 v0 := b.NewValue0(v.Pos, OpArg, typ.UInt32)
284 v0.AuxInt = off
285 v0.Aux = n
286 v.AddArg(v0)
287 v1 := b.NewValue0(v.Pos, OpArg, typ.UInt32)
288 v1.AuxInt = off + 4
289 v1.Aux = n
290 v.AddArg(v1)
291 return true
292 }
293 return false
294 }
295 func rewriteValuedec64_OpBitLen64_0(v *Value) bool {
296 b := v.Block
297 typ := &b.Func.Config.Types
298
299
300
301 for {
302 x := v.Args[0]
303 v.reset(OpAdd32)
304 v.Type = typ.Int
305 v0 := b.NewValue0(v.Pos, OpBitLen32, typ.Int)
306 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
307 v1.AddArg(x)
308 v0.AddArg(v1)
309 v.AddArg(v0)
310 v2 := b.NewValue0(v.Pos, OpBitLen32, typ.Int)
311 v3 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
312 v4 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
313 v4.AddArg(x)
314 v3.AddArg(v4)
315 v5 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32)
316 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
317 v6.AddArg(x)
318 v5.AddArg(v6)
319 v3.AddArg(v5)
320 v2.AddArg(v3)
321 v.AddArg(v2)
322 return true
323 }
324 }
325 func rewriteValuedec64_OpBswap64_0(v *Value) bool {
326 b := v.Block
327 typ := &b.Func.Config.Types
328
329
330
331 for {
332 x := v.Args[0]
333 v.reset(OpInt64Make)
334 v0 := b.NewValue0(v.Pos, OpBswap32, typ.UInt32)
335 v1 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
336 v1.AddArg(x)
337 v0.AddArg(v1)
338 v.AddArg(v0)
339 v2 := b.NewValue0(v.Pos, OpBswap32, typ.UInt32)
340 v3 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
341 v3.AddArg(x)
342 v2.AddArg(v3)
343 v.AddArg(v2)
344 return true
345 }
346 }
347 func rewriteValuedec64_OpCom64_0(v *Value) bool {
348 b := v.Block
349 typ := &b.Func.Config.Types
350
351
352
353 for {
354 x := v.Args[0]
355 v.reset(OpInt64Make)
356 v0 := b.NewValue0(v.Pos, OpCom32, typ.UInt32)
357 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
358 v1.AddArg(x)
359 v0.AddArg(v1)
360 v.AddArg(v0)
361 v2 := b.NewValue0(v.Pos, OpCom32, typ.UInt32)
362 v3 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
363 v3.AddArg(x)
364 v2.AddArg(v3)
365 v.AddArg(v2)
366 return true
367 }
368 }
369 func rewriteValuedec64_OpConst64_0(v *Value) bool {
370 b := v.Block
371 typ := &b.Func.Config.Types
372
373
374
375 for {
376 t := v.Type
377 c := v.AuxInt
378 if !(t.IsSigned()) {
379 break
380 }
381 v.reset(OpInt64Make)
382 v0 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
383 v0.AuxInt = c >> 32
384 v.AddArg(v0)
385 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
386 v1.AuxInt = int64(int32(c))
387 v.AddArg(v1)
388 return true
389 }
390
391
392
393 for {
394 t := v.Type
395 c := v.AuxInt
396 if !(!t.IsSigned()) {
397 break
398 }
399 v.reset(OpInt64Make)
400 v0 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
401 v0.AuxInt = c >> 32
402 v.AddArg(v0)
403 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
404 v1.AuxInt = int64(int32(c))
405 v.AddArg(v1)
406 return true
407 }
408 return false
409 }
410 func rewriteValuedec64_OpCtz64_0(v *Value) bool {
411 b := v.Block
412 typ := &b.Func.Config.Types
413
414
415
416 for {
417 x := v.Args[0]
418 v.reset(OpAdd32)
419 v.Type = typ.UInt32
420 v0 := b.NewValue0(v.Pos, OpCtz32, typ.UInt32)
421 v1 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
422 v1.AddArg(x)
423 v0.AddArg(v1)
424 v.AddArg(v0)
425 v2 := b.NewValue0(v.Pos, OpAnd32, typ.UInt32)
426 v3 := b.NewValue0(v.Pos, OpCom32, typ.UInt32)
427 v4 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32)
428 v5 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
429 v5.AddArg(x)
430 v4.AddArg(v5)
431 v3.AddArg(v4)
432 v2.AddArg(v3)
433 v6 := b.NewValue0(v.Pos, OpCtz32, typ.UInt32)
434 v7 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
435 v7.AddArg(x)
436 v6.AddArg(v7)
437 v2.AddArg(v6)
438 v.AddArg(v2)
439 return true
440 }
441 }
442 func rewriteValuedec64_OpCtz64NonZero_0(v *Value) bool {
443
444
445
446 for {
447 x := v.Args[0]
448 v.reset(OpCtz64)
449 v.AddArg(x)
450 return true
451 }
452 }
453 func rewriteValuedec64_OpEq64_0(v *Value) bool {
454 b := v.Block
455 typ := &b.Func.Config.Types
456
457
458
459 for {
460 y := v.Args[1]
461 x := v.Args[0]
462 v.reset(OpAndB)
463 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
464 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
465 v1.AddArg(x)
466 v0.AddArg(v1)
467 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
468 v2.AddArg(y)
469 v0.AddArg(v2)
470 v.AddArg(v0)
471 v3 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
472 v4 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
473 v4.AddArg(x)
474 v3.AddArg(v4)
475 v5 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
476 v5.AddArg(y)
477 v3.AddArg(v5)
478 v.AddArg(v3)
479 return true
480 }
481 }
482 func rewriteValuedec64_OpGeq64_0(v *Value) bool {
483 b := v.Block
484 typ := &b.Func.Config.Types
485
486
487
488 for {
489 y := v.Args[1]
490 x := v.Args[0]
491 v.reset(OpOrB)
492 v0 := b.NewValue0(v.Pos, OpGreater32, typ.Bool)
493 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
494 v1.AddArg(x)
495 v0.AddArg(v1)
496 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
497 v2.AddArg(y)
498 v0.AddArg(v2)
499 v.AddArg(v0)
500 v3 := b.NewValue0(v.Pos, OpAndB, typ.Bool)
501 v4 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
502 v5 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
503 v5.AddArg(x)
504 v4.AddArg(v5)
505 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
506 v6.AddArg(y)
507 v4.AddArg(v6)
508 v3.AddArg(v4)
509 v7 := b.NewValue0(v.Pos, OpGeq32U, typ.Bool)
510 v8 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
511 v8.AddArg(x)
512 v7.AddArg(v8)
513 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
514 v9.AddArg(y)
515 v7.AddArg(v9)
516 v3.AddArg(v7)
517 v.AddArg(v3)
518 return true
519 }
520 }
521 func rewriteValuedec64_OpGeq64U_0(v *Value) bool {
522 b := v.Block
523 typ := &b.Func.Config.Types
524
525
526
527 for {
528 y := v.Args[1]
529 x := v.Args[0]
530 v.reset(OpOrB)
531 v0 := b.NewValue0(v.Pos, OpGreater32U, typ.Bool)
532 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
533 v1.AddArg(x)
534 v0.AddArg(v1)
535 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
536 v2.AddArg(y)
537 v0.AddArg(v2)
538 v.AddArg(v0)
539 v3 := b.NewValue0(v.Pos, OpAndB, typ.Bool)
540 v4 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
541 v5 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
542 v5.AddArg(x)
543 v4.AddArg(v5)
544 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
545 v6.AddArg(y)
546 v4.AddArg(v6)
547 v3.AddArg(v4)
548 v7 := b.NewValue0(v.Pos, OpGeq32U, typ.Bool)
549 v8 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
550 v8.AddArg(x)
551 v7.AddArg(v8)
552 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
553 v9.AddArg(y)
554 v7.AddArg(v9)
555 v3.AddArg(v7)
556 v.AddArg(v3)
557 return true
558 }
559 }
560 func rewriteValuedec64_OpGreater64_0(v *Value) bool {
561 b := v.Block
562 typ := &b.Func.Config.Types
563
564
565
566 for {
567 y := v.Args[1]
568 x := v.Args[0]
569 v.reset(OpOrB)
570 v0 := b.NewValue0(v.Pos, OpGreater32, typ.Bool)
571 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
572 v1.AddArg(x)
573 v0.AddArg(v1)
574 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
575 v2.AddArg(y)
576 v0.AddArg(v2)
577 v.AddArg(v0)
578 v3 := b.NewValue0(v.Pos, OpAndB, typ.Bool)
579 v4 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
580 v5 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
581 v5.AddArg(x)
582 v4.AddArg(v5)
583 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
584 v6.AddArg(y)
585 v4.AddArg(v6)
586 v3.AddArg(v4)
587 v7 := b.NewValue0(v.Pos, OpGreater32U, typ.Bool)
588 v8 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
589 v8.AddArg(x)
590 v7.AddArg(v8)
591 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
592 v9.AddArg(y)
593 v7.AddArg(v9)
594 v3.AddArg(v7)
595 v.AddArg(v3)
596 return true
597 }
598 }
599 func rewriteValuedec64_OpGreater64U_0(v *Value) bool {
600 b := v.Block
601 typ := &b.Func.Config.Types
602
603
604
605 for {
606 y := v.Args[1]
607 x := v.Args[0]
608 v.reset(OpOrB)
609 v0 := b.NewValue0(v.Pos, OpGreater32U, typ.Bool)
610 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
611 v1.AddArg(x)
612 v0.AddArg(v1)
613 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
614 v2.AddArg(y)
615 v0.AddArg(v2)
616 v.AddArg(v0)
617 v3 := b.NewValue0(v.Pos, OpAndB, typ.Bool)
618 v4 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
619 v5 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
620 v5.AddArg(x)
621 v4.AddArg(v5)
622 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
623 v6.AddArg(y)
624 v4.AddArg(v6)
625 v3.AddArg(v4)
626 v7 := b.NewValue0(v.Pos, OpGreater32U, typ.Bool)
627 v8 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
628 v8.AddArg(x)
629 v7.AddArg(v8)
630 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
631 v9.AddArg(y)
632 v7.AddArg(v9)
633 v3.AddArg(v7)
634 v.AddArg(v3)
635 return true
636 }
637 }
638 func rewriteValuedec64_OpInt64Hi_0(v *Value) bool {
639
640
641
642 for {
643 v_0 := v.Args[0]
644 if v_0.Op != OpInt64Make {
645 break
646 }
647 _ = v_0.Args[1]
648 hi := v_0.Args[0]
649 v.reset(OpCopy)
650 v.Type = hi.Type
651 v.AddArg(hi)
652 return true
653 }
654 return false
655 }
656 func rewriteValuedec64_OpInt64Lo_0(v *Value) bool {
657
658
659
660 for {
661 v_0 := v.Args[0]
662 if v_0.Op != OpInt64Make {
663 break
664 }
665 lo := v_0.Args[1]
666 v.reset(OpCopy)
667 v.Type = lo.Type
668 v.AddArg(lo)
669 return true
670 }
671 return false
672 }
673 func rewriteValuedec64_OpLeq64_0(v *Value) bool {
674 b := v.Block
675 typ := &b.Func.Config.Types
676
677
678
679 for {
680 y := v.Args[1]
681 x := v.Args[0]
682 v.reset(OpOrB)
683 v0 := b.NewValue0(v.Pos, OpLess32, typ.Bool)
684 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
685 v1.AddArg(x)
686 v0.AddArg(v1)
687 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
688 v2.AddArg(y)
689 v0.AddArg(v2)
690 v.AddArg(v0)
691 v3 := b.NewValue0(v.Pos, OpAndB, typ.Bool)
692 v4 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
693 v5 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
694 v5.AddArg(x)
695 v4.AddArg(v5)
696 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
697 v6.AddArg(y)
698 v4.AddArg(v6)
699 v3.AddArg(v4)
700 v7 := b.NewValue0(v.Pos, OpLeq32U, typ.Bool)
701 v8 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
702 v8.AddArg(x)
703 v7.AddArg(v8)
704 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
705 v9.AddArg(y)
706 v7.AddArg(v9)
707 v3.AddArg(v7)
708 v.AddArg(v3)
709 return true
710 }
711 }
712 func rewriteValuedec64_OpLeq64U_0(v *Value) bool {
713 b := v.Block
714 typ := &b.Func.Config.Types
715
716
717
718 for {
719 y := v.Args[1]
720 x := v.Args[0]
721 v.reset(OpOrB)
722 v0 := b.NewValue0(v.Pos, OpLess32U, typ.Bool)
723 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
724 v1.AddArg(x)
725 v0.AddArg(v1)
726 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
727 v2.AddArg(y)
728 v0.AddArg(v2)
729 v.AddArg(v0)
730 v3 := b.NewValue0(v.Pos, OpAndB, typ.Bool)
731 v4 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
732 v5 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
733 v5.AddArg(x)
734 v4.AddArg(v5)
735 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
736 v6.AddArg(y)
737 v4.AddArg(v6)
738 v3.AddArg(v4)
739 v7 := b.NewValue0(v.Pos, OpLeq32U, typ.Bool)
740 v8 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
741 v8.AddArg(x)
742 v7.AddArg(v8)
743 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
744 v9.AddArg(y)
745 v7.AddArg(v9)
746 v3.AddArg(v7)
747 v.AddArg(v3)
748 return true
749 }
750 }
751 func rewriteValuedec64_OpLess64_0(v *Value) bool {
752 b := v.Block
753 typ := &b.Func.Config.Types
754
755
756
757 for {
758 y := v.Args[1]
759 x := v.Args[0]
760 v.reset(OpOrB)
761 v0 := b.NewValue0(v.Pos, OpLess32, typ.Bool)
762 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
763 v1.AddArg(x)
764 v0.AddArg(v1)
765 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
766 v2.AddArg(y)
767 v0.AddArg(v2)
768 v.AddArg(v0)
769 v3 := b.NewValue0(v.Pos, OpAndB, typ.Bool)
770 v4 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
771 v5 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
772 v5.AddArg(x)
773 v4.AddArg(v5)
774 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
775 v6.AddArg(y)
776 v4.AddArg(v6)
777 v3.AddArg(v4)
778 v7 := b.NewValue0(v.Pos, OpLess32U, typ.Bool)
779 v8 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
780 v8.AddArg(x)
781 v7.AddArg(v8)
782 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
783 v9.AddArg(y)
784 v7.AddArg(v9)
785 v3.AddArg(v7)
786 v.AddArg(v3)
787 return true
788 }
789 }
790 func rewriteValuedec64_OpLess64U_0(v *Value) bool {
791 b := v.Block
792 typ := &b.Func.Config.Types
793
794
795
796 for {
797 y := v.Args[1]
798 x := v.Args[0]
799 v.reset(OpOrB)
800 v0 := b.NewValue0(v.Pos, OpLess32U, typ.Bool)
801 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
802 v1.AddArg(x)
803 v0.AddArg(v1)
804 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
805 v2.AddArg(y)
806 v0.AddArg(v2)
807 v.AddArg(v0)
808 v3 := b.NewValue0(v.Pos, OpAndB, typ.Bool)
809 v4 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
810 v5 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
811 v5.AddArg(x)
812 v4.AddArg(v5)
813 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
814 v6.AddArg(y)
815 v4.AddArg(v6)
816 v3.AddArg(v4)
817 v7 := b.NewValue0(v.Pos, OpLess32U, typ.Bool)
818 v8 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
819 v8.AddArg(x)
820 v7.AddArg(v8)
821 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
822 v9.AddArg(y)
823 v7.AddArg(v9)
824 v3.AddArg(v7)
825 v.AddArg(v3)
826 return true
827 }
828 }
829 func rewriteValuedec64_OpLoad_0(v *Value) bool {
830 b := v.Block
831 config := b.Func.Config
832 typ := &b.Func.Config.Types
833
834
835
836 for {
837 t := v.Type
838 mem := v.Args[1]
839 ptr := v.Args[0]
840 if !(is64BitInt(t) && !config.BigEndian && t.IsSigned()) {
841 break
842 }
843 v.reset(OpInt64Make)
844 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
845 v1 := b.NewValue0(v.Pos, OpOffPtr, typ.Int32Ptr)
846 v1.AuxInt = 4
847 v1.AddArg(ptr)
848 v0.AddArg(v1)
849 v0.AddArg(mem)
850 v.AddArg(v0)
851 v2 := b.NewValue0(v.Pos, OpLoad, typ.UInt32)
852 v2.AddArg(ptr)
853 v2.AddArg(mem)
854 v.AddArg(v2)
855 return true
856 }
857
858
859
860 for {
861 t := v.Type
862 mem := v.Args[1]
863 ptr := v.Args[0]
864 if !(is64BitInt(t) && !config.BigEndian && !t.IsSigned()) {
865 break
866 }
867 v.reset(OpInt64Make)
868 v0 := b.NewValue0(v.Pos, OpLoad, typ.UInt32)
869 v1 := b.NewValue0(v.Pos, OpOffPtr, typ.UInt32Ptr)
870 v1.AuxInt = 4
871 v1.AddArg(ptr)
872 v0.AddArg(v1)
873 v0.AddArg(mem)
874 v.AddArg(v0)
875 v2 := b.NewValue0(v.Pos, OpLoad, typ.UInt32)
876 v2.AddArg(ptr)
877 v2.AddArg(mem)
878 v.AddArg(v2)
879 return true
880 }
881
882
883
884 for {
885 t := v.Type
886 mem := v.Args[1]
887 ptr := v.Args[0]
888 if !(is64BitInt(t) && config.BigEndian && t.IsSigned()) {
889 break
890 }
891 v.reset(OpInt64Make)
892 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
893 v0.AddArg(ptr)
894 v0.AddArg(mem)
895 v.AddArg(v0)
896 v1 := b.NewValue0(v.Pos, OpLoad, typ.UInt32)
897 v2 := b.NewValue0(v.Pos, OpOffPtr, typ.UInt32Ptr)
898 v2.AuxInt = 4
899 v2.AddArg(ptr)
900 v1.AddArg(v2)
901 v1.AddArg(mem)
902 v.AddArg(v1)
903 return true
904 }
905
906
907
908 for {
909 t := v.Type
910 mem := v.Args[1]
911 ptr := v.Args[0]
912 if !(is64BitInt(t) && config.BigEndian && !t.IsSigned()) {
913 break
914 }
915 v.reset(OpInt64Make)
916 v0 := b.NewValue0(v.Pos, OpLoad, typ.UInt32)
917 v0.AddArg(ptr)
918 v0.AddArg(mem)
919 v.AddArg(v0)
920 v1 := b.NewValue0(v.Pos, OpLoad, typ.UInt32)
921 v2 := b.NewValue0(v.Pos, OpOffPtr, typ.UInt32Ptr)
922 v2.AuxInt = 4
923 v2.AddArg(ptr)
924 v1.AddArg(v2)
925 v1.AddArg(mem)
926 v.AddArg(v1)
927 return true
928 }
929 return false
930 }
931 func rewriteValuedec64_OpLsh16x64_0(v *Value) bool {
932 b := v.Block
933 typ := &b.Func.Config.Types
934
935
936
937 for {
938 _ = v.Args[1]
939 v_1 := v.Args[1]
940 if v_1.Op != OpInt64Make {
941 break
942 }
943 _ = v_1.Args[1]
944 v_1_0 := v_1.Args[0]
945 if v_1_0.Op != OpConst32 {
946 break
947 }
948 c := v_1_0.AuxInt
949 if !(c != 0) {
950 break
951 }
952 v.reset(OpConst32)
953 v.AuxInt = 0
954 return true
955 }
956
957
958
959 for {
960 _ = v.Args[1]
961 x := v.Args[0]
962 v_1 := v.Args[1]
963 if v_1.Op != OpInt64Make {
964 break
965 }
966 lo := v_1.Args[1]
967 v_1_0 := v_1.Args[0]
968 if v_1_0.Op != OpConst32 {
969 break
970 }
971 if v_1_0.AuxInt != 0 {
972 break
973 }
974 v.reset(OpLsh16x32)
975 v.AddArg(x)
976 v.AddArg(lo)
977 return true
978 }
979
980
981
982 for {
983 _ = v.Args[1]
984 x := v.Args[0]
985 v_1 := v.Args[1]
986 if v_1.Op != OpInt64Make {
987 break
988 }
989 lo := v_1.Args[1]
990 hi := v_1.Args[0]
991 if !(hi.Op != OpConst32) {
992 break
993 }
994 v.reset(OpLsh16x32)
995 v.AddArg(x)
996 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
997 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32)
998 v1.AddArg(hi)
999 v0.AddArg(v1)
1000 v0.AddArg(lo)
1001 v.AddArg(v0)
1002 return true
1003 }
1004 return false
1005 }
1006 func rewriteValuedec64_OpLsh32x64_0(v *Value) bool {
1007 b := v.Block
1008 typ := &b.Func.Config.Types
1009
1010
1011
1012 for {
1013 _ = v.Args[1]
1014 v_1 := v.Args[1]
1015 if v_1.Op != OpInt64Make {
1016 break
1017 }
1018 _ = v_1.Args[1]
1019 v_1_0 := v_1.Args[0]
1020 if v_1_0.Op != OpConst32 {
1021 break
1022 }
1023 c := v_1_0.AuxInt
1024 if !(c != 0) {
1025 break
1026 }
1027 v.reset(OpConst32)
1028 v.AuxInt = 0
1029 return true
1030 }
1031
1032
1033
1034 for {
1035 _ = v.Args[1]
1036 x := v.Args[0]
1037 v_1 := v.Args[1]
1038 if v_1.Op != OpInt64Make {
1039 break
1040 }
1041 lo := v_1.Args[1]
1042 v_1_0 := v_1.Args[0]
1043 if v_1_0.Op != OpConst32 {
1044 break
1045 }
1046 if v_1_0.AuxInt != 0 {
1047 break
1048 }
1049 v.reset(OpLsh32x32)
1050 v.AddArg(x)
1051 v.AddArg(lo)
1052 return true
1053 }
1054
1055
1056
1057 for {
1058 _ = v.Args[1]
1059 x := v.Args[0]
1060 v_1 := v.Args[1]
1061 if v_1.Op != OpInt64Make {
1062 break
1063 }
1064 lo := v_1.Args[1]
1065 hi := v_1.Args[0]
1066 if !(hi.Op != OpConst32) {
1067 break
1068 }
1069 v.reset(OpLsh32x32)
1070 v.AddArg(x)
1071 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1072 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32)
1073 v1.AddArg(hi)
1074 v0.AddArg(v1)
1075 v0.AddArg(lo)
1076 v.AddArg(v0)
1077 return true
1078 }
1079 return false
1080 }
1081 func rewriteValuedec64_OpLsh64x16_0(v *Value) bool {
1082 b := v.Block
1083 typ := &b.Func.Config.Types
1084
1085
1086
1087 for {
1088 s := v.Args[1]
1089 v_0 := v.Args[0]
1090 if v_0.Op != OpInt64Make {
1091 break
1092 }
1093 lo := v_0.Args[1]
1094 hi := v_0.Args[0]
1095 v.reset(OpInt64Make)
1096 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1097 v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1098 v2 := b.NewValue0(v.Pos, OpLsh32x16, typ.UInt32)
1099 v2.AddArg(hi)
1100 v2.AddArg(s)
1101 v1.AddArg(v2)
1102 v3 := b.NewValue0(v.Pos, OpRsh32Ux16, typ.UInt32)
1103 v3.AddArg(lo)
1104 v4 := b.NewValue0(v.Pos, OpSub16, typ.UInt16)
1105 v5 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
1106 v5.AuxInt = 32
1107 v4.AddArg(v5)
1108 v4.AddArg(s)
1109 v3.AddArg(v4)
1110 v1.AddArg(v3)
1111 v0.AddArg(v1)
1112 v6 := b.NewValue0(v.Pos, OpLsh32x16, typ.UInt32)
1113 v6.AddArg(lo)
1114 v7 := b.NewValue0(v.Pos, OpSub16, typ.UInt16)
1115 v7.AddArg(s)
1116 v8 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
1117 v8.AuxInt = 32
1118 v7.AddArg(v8)
1119 v6.AddArg(v7)
1120 v0.AddArg(v6)
1121 v.AddArg(v0)
1122 v9 := b.NewValue0(v.Pos, OpLsh32x16, typ.UInt32)
1123 v9.AddArg(lo)
1124 v9.AddArg(s)
1125 v.AddArg(v9)
1126 return true
1127 }
1128 return false
1129 }
1130 func rewriteValuedec64_OpLsh64x32_0(v *Value) bool {
1131 b := v.Block
1132 typ := &b.Func.Config.Types
1133
1134
1135
1136 for {
1137 s := v.Args[1]
1138 v_0 := v.Args[0]
1139 if v_0.Op != OpInt64Make {
1140 break
1141 }
1142 lo := v_0.Args[1]
1143 hi := v_0.Args[0]
1144 v.reset(OpInt64Make)
1145 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1146 v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1147 v2 := b.NewValue0(v.Pos, OpLsh32x32, typ.UInt32)
1148 v2.AddArg(hi)
1149 v2.AddArg(s)
1150 v1.AddArg(v2)
1151 v3 := b.NewValue0(v.Pos, OpRsh32Ux32, typ.UInt32)
1152 v3.AddArg(lo)
1153 v4 := b.NewValue0(v.Pos, OpSub32, typ.UInt32)
1154 v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
1155 v5.AuxInt = 32
1156 v4.AddArg(v5)
1157 v4.AddArg(s)
1158 v3.AddArg(v4)
1159 v1.AddArg(v3)
1160 v0.AddArg(v1)
1161 v6 := b.NewValue0(v.Pos, OpLsh32x32, typ.UInt32)
1162 v6.AddArg(lo)
1163 v7 := b.NewValue0(v.Pos, OpSub32, typ.UInt32)
1164 v7.AddArg(s)
1165 v8 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
1166 v8.AuxInt = 32
1167 v7.AddArg(v8)
1168 v6.AddArg(v7)
1169 v0.AddArg(v6)
1170 v.AddArg(v0)
1171 v9 := b.NewValue0(v.Pos, OpLsh32x32, typ.UInt32)
1172 v9.AddArg(lo)
1173 v9.AddArg(s)
1174 v.AddArg(v9)
1175 return true
1176 }
1177 return false
1178 }
1179 func rewriteValuedec64_OpLsh64x64_0(v *Value) bool {
1180 b := v.Block
1181 typ := &b.Func.Config.Types
1182
1183
1184
1185 for {
1186 _ = v.Args[1]
1187 v_1 := v.Args[1]
1188 if v_1.Op != OpInt64Make {
1189 break
1190 }
1191 _ = v_1.Args[1]
1192 v_1_0 := v_1.Args[0]
1193 if v_1_0.Op != OpConst32 {
1194 break
1195 }
1196 c := v_1_0.AuxInt
1197 if !(c != 0) {
1198 break
1199 }
1200 v.reset(OpConst64)
1201 v.AuxInt = 0
1202 return true
1203 }
1204
1205
1206
1207 for {
1208 _ = v.Args[1]
1209 x := v.Args[0]
1210 v_1 := v.Args[1]
1211 if v_1.Op != OpInt64Make {
1212 break
1213 }
1214 lo := v_1.Args[1]
1215 v_1_0 := v_1.Args[0]
1216 if v_1_0.Op != OpConst32 {
1217 break
1218 }
1219 if v_1_0.AuxInt != 0 {
1220 break
1221 }
1222 v.reset(OpLsh64x32)
1223 v.AddArg(x)
1224 v.AddArg(lo)
1225 return true
1226 }
1227
1228
1229
1230 for {
1231 _ = v.Args[1]
1232 x := v.Args[0]
1233 v_1 := v.Args[1]
1234 if v_1.Op != OpInt64Make {
1235 break
1236 }
1237 lo := v_1.Args[1]
1238 hi := v_1.Args[0]
1239 if !(hi.Op != OpConst32) {
1240 break
1241 }
1242 v.reset(OpLsh64x32)
1243 v.AddArg(x)
1244 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1245 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32)
1246 v1.AddArg(hi)
1247 v0.AddArg(v1)
1248 v0.AddArg(lo)
1249 v.AddArg(v0)
1250 return true
1251 }
1252 return false
1253 }
1254 func rewriteValuedec64_OpLsh64x8_0(v *Value) bool {
1255 b := v.Block
1256 typ := &b.Func.Config.Types
1257
1258
1259
1260 for {
1261 s := v.Args[1]
1262 v_0 := v.Args[0]
1263 if v_0.Op != OpInt64Make {
1264 break
1265 }
1266 lo := v_0.Args[1]
1267 hi := v_0.Args[0]
1268 v.reset(OpInt64Make)
1269 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1270 v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1271 v2 := b.NewValue0(v.Pos, OpLsh32x8, typ.UInt32)
1272 v2.AddArg(hi)
1273 v2.AddArg(s)
1274 v1.AddArg(v2)
1275 v3 := b.NewValue0(v.Pos, OpRsh32Ux8, typ.UInt32)
1276 v3.AddArg(lo)
1277 v4 := b.NewValue0(v.Pos, OpSub8, typ.UInt8)
1278 v5 := b.NewValue0(v.Pos, OpConst8, typ.UInt8)
1279 v5.AuxInt = 32
1280 v4.AddArg(v5)
1281 v4.AddArg(s)
1282 v3.AddArg(v4)
1283 v1.AddArg(v3)
1284 v0.AddArg(v1)
1285 v6 := b.NewValue0(v.Pos, OpLsh32x8, typ.UInt32)
1286 v6.AddArg(lo)
1287 v7 := b.NewValue0(v.Pos, OpSub8, typ.UInt8)
1288 v7.AddArg(s)
1289 v8 := b.NewValue0(v.Pos, OpConst8, typ.UInt8)
1290 v8.AuxInt = 32
1291 v7.AddArg(v8)
1292 v6.AddArg(v7)
1293 v0.AddArg(v6)
1294 v.AddArg(v0)
1295 v9 := b.NewValue0(v.Pos, OpLsh32x8, typ.UInt32)
1296 v9.AddArg(lo)
1297 v9.AddArg(s)
1298 v.AddArg(v9)
1299 return true
1300 }
1301 return false
1302 }
1303 func rewriteValuedec64_OpLsh8x64_0(v *Value) bool {
1304 b := v.Block
1305 typ := &b.Func.Config.Types
1306
1307
1308
1309 for {
1310 _ = v.Args[1]
1311 v_1 := v.Args[1]
1312 if v_1.Op != OpInt64Make {
1313 break
1314 }
1315 _ = v_1.Args[1]
1316 v_1_0 := v_1.Args[0]
1317 if v_1_0.Op != OpConst32 {
1318 break
1319 }
1320 c := v_1_0.AuxInt
1321 if !(c != 0) {
1322 break
1323 }
1324 v.reset(OpConst32)
1325 v.AuxInt = 0
1326 return true
1327 }
1328
1329
1330
1331 for {
1332 _ = v.Args[1]
1333 x := v.Args[0]
1334 v_1 := v.Args[1]
1335 if v_1.Op != OpInt64Make {
1336 break
1337 }
1338 lo := v_1.Args[1]
1339 v_1_0 := v_1.Args[0]
1340 if v_1_0.Op != OpConst32 {
1341 break
1342 }
1343 if v_1_0.AuxInt != 0 {
1344 break
1345 }
1346 v.reset(OpLsh8x32)
1347 v.AddArg(x)
1348 v.AddArg(lo)
1349 return true
1350 }
1351
1352
1353
1354 for {
1355 _ = v.Args[1]
1356 x := v.Args[0]
1357 v_1 := v.Args[1]
1358 if v_1.Op != OpInt64Make {
1359 break
1360 }
1361 lo := v_1.Args[1]
1362 hi := v_1.Args[0]
1363 if !(hi.Op != OpConst32) {
1364 break
1365 }
1366 v.reset(OpLsh8x32)
1367 v.AddArg(x)
1368 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1369 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32)
1370 v1.AddArg(hi)
1371 v0.AddArg(v1)
1372 v0.AddArg(lo)
1373 v.AddArg(v0)
1374 return true
1375 }
1376 return false
1377 }
1378 func rewriteValuedec64_OpMul64_0(v *Value) bool {
1379 b := v.Block
1380 typ := &b.Func.Config.Types
1381
1382
1383
1384 for {
1385 y := v.Args[1]
1386 x := v.Args[0]
1387 v.reset(OpInt64Make)
1388 v0 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32)
1389 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32)
1390 v2 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
1391 v2.AddArg(x)
1392 v1.AddArg(v2)
1393 v3 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
1394 v3.AddArg(y)
1395 v1.AddArg(v3)
1396 v0.AddArg(v1)
1397 v4 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32)
1398 v5 := b.NewValue0(v.Pos, OpMul32, typ.UInt32)
1399 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
1400 v6.AddArg(x)
1401 v5.AddArg(v6)
1402 v7 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
1403 v7.AddArg(y)
1404 v5.AddArg(v7)
1405 v4.AddArg(v5)
1406 v8 := b.NewValue0(v.Pos, OpSelect0, typ.UInt32)
1407 v9 := b.NewValue0(v.Pos, OpMul32uhilo, types.NewTuple(typ.UInt32, typ.UInt32))
1408 v10 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
1409 v10.AddArg(x)
1410 v9.AddArg(v10)
1411 v11 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
1412 v11.AddArg(y)
1413 v9.AddArg(v11)
1414 v8.AddArg(v9)
1415 v4.AddArg(v8)
1416 v0.AddArg(v4)
1417 v.AddArg(v0)
1418 v12 := b.NewValue0(v.Pos, OpSelect1, typ.UInt32)
1419 v13 := b.NewValue0(v.Pos, OpMul32uhilo, types.NewTuple(typ.UInt32, typ.UInt32))
1420 v14 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
1421 v14.AddArg(x)
1422 v13.AddArg(v14)
1423 v15 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
1424 v15.AddArg(y)
1425 v13.AddArg(v15)
1426 v12.AddArg(v13)
1427 v.AddArg(v12)
1428 return true
1429 }
1430 }
1431 func rewriteValuedec64_OpNeg64_0(v *Value) bool {
1432 b := v.Block
1433
1434
1435
1436 for {
1437 t := v.Type
1438 x := v.Args[0]
1439 v.reset(OpSub64)
1440 v0 := b.NewValue0(v.Pos, OpConst64, t)
1441 v0.AuxInt = 0
1442 v.AddArg(v0)
1443 v.AddArg(x)
1444 return true
1445 }
1446 }
1447 func rewriteValuedec64_OpNeq64_0(v *Value) bool {
1448 b := v.Block
1449 typ := &b.Func.Config.Types
1450
1451
1452
1453 for {
1454 y := v.Args[1]
1455 x := v.Args[0]
1456 v.reset(OpOrB)
1457 v0 := b.NewValue0(v.Pos, OpNeq32, typ.Bool)
1458 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
1459 v1.AddArg(x)
1460 v0.AddArg(v1)
1461 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
1462 v2.AddArg(y)
1463 v0.AddArg(v2)
1464 v.AddArg(v0)
1465 v3 := b.NewValue0(v.Pos, OpNeq32, typ.Bool)
1466 v4 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
1467 v4.AddArg(x)
1468 v3.AddArg(v4)
1469 v5 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
1470 v5.AddArg(y)
1471 v3.AddArg(v5)
1472 v.AddArg(v3)
1473 return true
1474 }
1475 }
1476 func rewriteValuedec64_OpOr64_0(v *Value) bool {
1477 b := v.Block
1478 typ := &b.Func.Config.Types
1479
1480
1481
1482 for {
1483 y := v.Args[1]
1484 x := v.Args[0]
1485 v.reset(OpInt64Make)
1486 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1487 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
1488 v1.AddArg(x)
1489 v0.AddArg(v1)
1490 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
1491 v2.AddArg(y)
1492 v0.AddArg(v2)
1493 v.AddArg(v0)
1494 v3 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1495 v4 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
1496 v4.AddArg(x)
1497 v3.AddArg(v4)
1498 v5 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
1499 v5.AddArg(y)
1500 v3.AddArg(v5)
1501 v.AddArg(v3)
1502 return true
1503 }
1504 }
1505 func rewriteValuedec64_OpRsh16Ux64_0(v *Value) bool {
1506 b := v.Block
1507 typ := &b.Func.Config.Types
1508
1509
1510
1511 for {
1512 _ = v.Args[1]
1513 v_1 := v.Args[1]
1514 if v_1.Op != OpInt64Make {
1515 break
1516 }
1517 _ = v_1.Args[1]
1518 v_1_0 := v_1.Args[0]
1519 if v_1_0.Op != OpConst32 {
1520 break
1521 }
1522 c := v_1_0.AuxInt
1523 if !(c != 0) {
1524 break
1525 }
1526 v.reset(OpConst32)
1527 v.AuxInt = 0
1528 return true
1529 }
1530
1531
1532
1533 for {
1534 _ = v.Args[1]
1535 x := v.Args[0]
1536 v_1 := v.Args[1]
1537 if v_1.Op != OpInt64Make {
1538 break
1539 }
1540 lo := v_1.Args[1]
1541 v_1_0 := v_1.Args[0]
1542 if v_1_0.Op != OpConst32 {
1543 break
1544 }
1545 if v_1_0.AuxInt != 0 {
1546 break
1547 }
1548 v.reset(OpRsh16Ux32)
1549 v.AddArg(x)
1550 v.AddArg(lo)
1551 return true
1552 }
1553
1554
1555
1556 for {
1557 _ = v.Args[1]
1558 x := v.Args[0]
1559 v_1 := v.Args[1]
1560 if v_1.Op != OpInt64Make {
1561 break
1562 }
1563 lo := v_1.Args[1]
1564 hi := v_1.Args[0]
1565 if !(hi.Op != OpConst32) {
1566 break
1567 }
1568 v.reset(OpRsh16Ux32)
1569 v.AddArg(x)
1570 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1571 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32)
1572 v1.AddArg(hi)
1573 v0.AddArg(v1)
1574 v0.AddArg(lo)
1575 v.AddArg(v0)
1576 return true
1577 }
1578 return false
1579 }
1580 func rewriteValuedec64_OpRsh16x64_0(v *Value) bool {
1581 b := v.Block
1582 typ := &b.Func.Config.Types
1583
1584
1585
1586 for {
1587 _ = v.Args[1]
1588 x := v.Args[0]
1589 v_1 := v.Args[1]
1590 if v_1.Op != OpInt64Make {
1591 break
1592 }
1593 _ = v_1.Args[1]
1594 v_1_0 := v_1.Args[0]
1595 if v_1_0.Op != OpConst32 {
1596 break
1597 }
1598 c := v_1_0.AuxInt
1599 if !(c != 0) {
1600 break
1601 }
1602 v.reset(OpSignmask)
1603 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
1604 v0.AddArg(x)
1605 v.AddArg(v0)
1606 return true
1607 }
1608
1609
1610
1611 for {
1612 _ = v.Args[1]
1613 x := v.Args[0]
1614 v_1 := v.Args[1]
1615 if v_1.Op != OpInt64Make {
1616 break
1617 }
1618 lo := v_1.Args[1]
1619 v_1_0 := v_1.Args[0]
1620 if v_1_0.Op != OpConst32 {
1621 break
1622 }
1623 if v_1_0.AuxInt != 0 {
1624 break
1625 }
1626 v.reset(OpRsh16x32)
1627 v.AddArg(x)
1628 v.AddArg(lo)
1629 return true
1630 }
1631
1632
1633
1634 for {
1635 _ = v.Args[1]
1636 x := v.Args[0]
1637 v_1 := v.Args[1]
1638 if v_1.Op != OpInt64Make {
1639 break
1640 }
1641 lo := v_1.Args[1]
1642 hi := v_1.Args[0]
1643 if !(hi.Op != OpConst32) {
1644 break
1645 }
1646 v.reset(OpRsh16x32)
1647 v.AddArg(x)
1648 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1649 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32)
1650 v1.AddArg(hi)
1651 v0.AddArg(v1)
1652 v0.AddArg(lo)
1653 v.AddArg(v0)
1654 return true
1655 }
1656 return false
1657 }
1658 func rewriteValuedec64_OpRsh32Ux64_0(v *Value) bool {
1659 b := v.Block
1660 typ := &b.Func.Config.Types
1661
1662
1663
1664 for {
1665 _ = v.Args[1]
1666 v_1 := v.Args[1]
1667 if v_1.Op != OpInt64Make {
1668 break
1669 }
1670 _ = v_1.Args[1]
1671 v_1_0 := v_1.Args[0]
1672 if v_1_0.Op != OpConst32 {
1673 break
1674 }
1675 c := v_1_0.AuxInt
1676 if !(c != 0) {
1677 break
1678 }
1679 v.reset(OpConst32)
1680 v.AuxInt = 0
1681 return true
1682 }
1683
1684
1685
1686 for {
1687 _ = v.Args[1]
1688 x := v.Args[0]
1689 v_1 := v.Args[1]
1690 if v_1.Op != OpInt64Make {
1691 break
1692 }
1693 lo := v_1.Args[1]
1694 v_1_0 := v_1.Args[0]
1695 if v_1_0.Op != OpConst32 {
1696 break
1697 }
1698 if v_1_0.AuxInt != 0 {
1699 break
1700 }
1701 v.reset(OpRsh32Ux32)
1702 v.AddArg(x)
1703 v.AddArg(lo)
1704 return true
1705 }
1706
1707
1708
1709 for {
1710 _ = v.Args[1]
1711 x := v.Args[0]
1712 v_1 := v.Args[1]
1713 if v_1.Op != OpInt64Make {
1714 break
1715 }
1716 lo := v_1.Args[1]
1717 hi := v_1.Args[0]
1718 if !(hi.Op != OpConst32) {
1719 break
1720 }
1721 v.reset(OpRsh32Ux32)
1722 v.AddArg(x)
1723 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1724 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32)
1725 v1.AddArg(hi)
1726 v0.AddArg(v1)
1727 v0.AddArg(lo)
1728 v.AddArg(v0)
1729 return true
1730 }
1731 return false
1732 }
1733 func rewriteValuedec64_OpRsh32x64_0(v *Value) bool {
1734 b := v.Block
1735 typ := &b.Func.Config.Types
1736
1737
1738
1739 for {
1740 _ = v.Args[1]
1741 x := v.Args[0]
1742 v_1 := v.Args[1]
1743 if v_1.Op != OpInt64Make {
1744 break
1745 }
1746 _ = v_1.Args[1]
1747 v_1_0 := v_1.Args[0]
1748 if v_1_0.Op != OpConst32 {
1749 break
1750 }
1751 c := v_1_0.AuxInt
1752 if !(c != 0) {
1753 break
1754 }
1755 v.reset(OpSignmask)
1756 v.AddArg(x)
1757 return true
1758 }
1759
1760
1761
1762 for {
1763 _ = v.Args[1]
1764 x := v.Args[0]
1765 v_1 := v.Args[1]
1766 if v_1.Op != OpInt64Make {
1767 break
1768 }
1769 lo := v_1.Args[1]
1770 v_1_0 := v_1.Args[0]
1771 if v_1_0.Op != OpConst32 {
1772 break
1773 }
1774 if v_1_0.AuxInt != 0 {
1775 break
1776 }
1777 v.reset(OpRsh32x32)
1778 v.AddArg(x)
1779 v.AddArg(lo)
1780 return true
1781 }
1782
1783
1784
1785 for {
1786 _ = v.Args[1]
1787 x := v.Args[0]
1788 v_1 := v.Args[1]
1789 if v_1.Op != OpInt64Make {
1790 break
1791 }
1792 lo := v_1.Args[1]
1793 hi := v_1.Args[0]
1794 if !(hi.Op != OpConst32) {
1795 break
1796 }
1797 v.reset(OpRsh32x32)
1798 v.AddArg(x)
1799 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1800 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32)
1801 v1.AddArg(hi)
1802 v0.AddArg(v1)
1803 v0.AddArg(lo)
1804 v.AddArg(v0)
1805 return true
1806 }
1807 return false
1808 }
1809 func rewriteValuedec64_OpRsh64Ux16_0(v *Value) bool {
1810 b := v.Block
1811 typ := &b.Func.Config.Types
1812
1813
1814
1815 for {
1816 s := v.Args[1]
1817 v_0 := v.Args[0]
1818 if v_0.Op != OpInt64Make {
1819 break
1820 }
1821 lo := v_0.Args[1]
1822 hi := v_0.Args[0]
1823 v.reset(OpInt64Make)
1824 v0 := b.NewValue0(v.Pos, OpRsh32Ux16, typ.UInt32)
1825 v0.AddArg(hi)
1826 v0.AddArg(s)
1827 v.AddArg(v0)
1828 v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1829 v2 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1830 v3 := b.NewValue0(v.Pos, OpRsh32Ux16, typ.UInt32)
1831 v3.AddArg(lo)
1832 v3.AddArg(s)
1833 v2.AddArg(v3)
1834 v4 := b.NewValue0(v.Pos, OpLsh32x16, typ.UInt32)
1835 v4.AddArg(hi)
1836 v5 := b.NewValue0(v.Pos, OpSub16, typ.UInt16)
1837 v6 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
1838 v6.AuxInt = 32
1839 v5.AddArg(v6)
1840 v5.AddArg(s)
1841 v4.AddArg(v5)
1842 v2.AddArg(v4)
1843 v1.AddArg(v2)
1844 v7 := b.NewValue0(v.Pos, OpRsh32Ux16, typ.UInt32)
1845 v7.AddArg(hi)
1846 v8 := b.NewValue0(v.Pos, OpSub16, typ.UInt16)
1847 v8.AddArg(s)
1848 v9 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
1849 v9.AuxInt = 32
1850 v8.AddArg(v9)
1851 v7.AddArg(v8)
1852 v1.AddArg(v7)
1853 v.AddArg(v1)
1854 return true
1855 }
1856 return false
1857 }
1858 func rewriteValuedec64_OpRsh64Ux32_0(v *Value) bool {
1859 b := v.Block
1860 typ := &b.Func.Config.Types
1861
1862
1863
1864 for {
1865 s := v.Args[1]
1866 v_0 := v.Args[0]
1867 if v_0.Op != OpInt64Make {
1868 break
1869 }
1870 lo := v_0.Args[1]
1871 hi := v_0.Args[0]
1872 v.reset(OpInt64Make)
1873 v0 := b.NewValue0(v.Pos, OpRsh32Ux32, typ.UInt32)
1874 v0.AddArg(hi)
1875 v0.AddArg(s)
1876 v.AddArg(v0)
1877 v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1878 v2 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1879 v3 := b.NewValue0(v.Pos, OpRsh32Ux32, typ.UInt32)
1880 v3.AddArg(lo)
1881 v3.AddArg(s)
1882 v2.AddArg(v3)
1883 v4 := b.NewValue0(v.Pos, OpLsh32x32, typ.UInt32)
1884 v4.AddArg(hi)
1885 v5 := b.NewValue0(v.Pos, OpSub32, typ.UInt32)
1886 v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
1887 v6.AuxInt = 32
1888 v5.AddArg(v6)
1889 v5.AddArg(s)
1890 v4.AddArg(v5)
1891 v2.AddArg(v4)
1892 v1.AddArg(v2)
1893 v7 := b.NewValue0(v.Pos, OpRsh32Ux32, typ.UInt32)
1894 v7.AddArg(hi)
1895 v8 := b.NewValue0(v.Pos, OpSub32, typ.UInt32)
1896 v8.AddArg(s)
1897 v9 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
1898 v9.AuxInt = 32
1899 v8.AddArg(v9)
1900 v7.AddArg(v8)
1901 v1.AddArg(v7)
1902 v.AddArg(v1)
1903 return true
1904 }
1905 return false
1906 }
1907 func rewriteValuedec64_OpRsh64Ux64_0(v *Value) bool {
1908 b := v.Block
1909 typ := &b.Func.Config.Types
1910
1911
1912
1913 for {
1914 _ = v.Args[1]
1915 v_1 := v.Args[1]
1916 if v_1.Op != OpInt64Make {
1917 break
1918 }
1919 _ = v_1.Args[1]
1920 v_1_0 := v_1.Args[0]
1921 if v_1_0.Op != OpConst32 {
1922 break
1923 }
1924 c := v_1_0.AuxInt
1925 if !(c != 0) {
1926 break
1927 }
1928 v.reset(OpConst64)
1929 v.AuxInt = 0
1930 return true
1931 }
1932
1933
1934
1935 for {
1936 _ = v.Args[1]
1937 x := v.Args[0]
1938 v_1 := v.Args[1]
1939 if v_1.Op != OpInt64Make {
1940 break
1941 }
1942 lo := v_1.Args[1]
1943 v_1_0 := v_1.Args[0]
1944 if v_1_0.Op != OpConst32 {
1945 break
1946 }
1947 if v_1_0.AuxInt != 0 {
1948 break
1949 }
1950 v.reset(OpRsh64Ux32)
1951 v.AddArg(x)
1952 v.AddArg(lo)
1953 return true
1954 }
1955
1956
1957
1958 for {
1959 _ = v.Args[1]
1960 x := v.Args[0]
1961 v_1 := v.Args[1]
1962 if v_1.Op != OpInt64Make {
1963 break
1964 }
1965 lo := v_1.Args[1]
1966 hi := v_1.Args[0]
1967 if !(hi.Op != OpConst32) {
1968 break
1969 }
1970 v.reset(OpRsh64Ux32)
1971 v.AddArg(x)
1972 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
1973 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32)
1974 v1.AddArg(hi)
1975 v0.AddArg(v1)
1976 v0.AddArg(lo)
1977 v.AddArg(v0)
1978 return true
1979 }
1980 return false
1981 }
1982 func rewriteValuedec64_OpRsh64Ux8_0(v *Value) bool {
1983 b := v.Block
1984 typ := &b.Func.Config.Types
1985
1986
1987
1988 for {
1989 s := v.Args[1]
1990 v_0 := v.Args[0]
1991 if v_0.Op != OpInt64Make {
1992 break
1993 }
1994 lo := v_0.Args[1]
1995 hi := v_0.Args[0]
1996 v.reset(OpInt64Make)
1997 v0 := b.NewValue0(v.Pos, OpRsh32Ux8, typ.UInt32)
1998 v0.AddArg(hi)
1999 v0.AddArg(s)
2000 v.AddArg(v0)
2001 v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
2002 v2 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
2003 v3 := b.NewValue0(v.Pos, OpRsh32Ux8, typ.UInt32)
2004 v3.AddArg(lo)
2005 v3.AddArg(s)
2006 v2.AddArg(v3)
2007 v4 := b.NewValue0(v.Pos, OpLsh32x8, typ.UInt32)
2008 v4.AddArg(hi)
2009 v5 := b.NewValue0(v.Pos, OpSub8, typ.UInt8)
2010 v6 := b.NewValue0(v.Pos, OpConst8, typ.UInt8)
2011 v6.AuxInt = 32
2012 v5.AddArg(v6)
2013 v5.AddArg(s)
2014 v4.AddArg(v5)
2015 v2.AddArg(v4)
2016 v1.AddArg(v2)
2017 v7 := b.NewValue0(v.Pos, OpRsh32Ux8, typ.UInt32)
2018 v7.AddArg(hi)
2019 v8 := b.NewValue0(v.Pos, OpSub8, typ.UInt8)
2020 v8.AddArg(s)
2021 v9 := b.NewValue0(v.Pos, OpConst8, typ.UInt8)
2022 v9.AuxInt = 32
2023 v8.AddArg(v9)
2024 v7.AddArg(v8)
2025 v1.AddArg(v7)
2026 v.AddArg(v1)
2027 return true
2028 }
2029 return false
2030 }
2031 func rewriteValuedec64_OpRsh64x16_0(v *Value) bool {
2032 b := v.Block
2033 typ := &b.Func.Config.Types
2034
2035
2036
2037 for {
2038 s := v.Args[1]
2039 v_0 := v.Args[0]
2040 if v_0.Op != OpInt64Make {
2041 break
2042 }
2043 lo := v_0.Args[1]
2044 hi := v_0.Args[0]
2045 v.reset(OpInt64Make)
2046 v0 := b.NewValue0(v.Pos, OpRsh32x16, typ.UInt32)
2047 v0.AddArg(hi)
2048 v0.AddArg(s)
2049 v.AddArg(v0)
2050 v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
2051 v2 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
2052 v3 := b.NewValue0(v.Pos, OpRsh32Ux16, typ.UInt32)
2053 v3.AddArg(lo)
2054 v3.AddArg(s)
2055 v2.AddArg(v3)
2056 v4 := b.NewValue0(v.Pos, OpLsh32x16, typ.UInt32)
2057 v4.AddArg(hi)
2058 v5 := b.NewValue0(v.Pos, OpSub16, typ.UInt16)
2059 v6 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
2060 v6.AuxInt = 32
2061 v5.AddArg(v6)
2062 v5.AddArg(s)
2063 v4.AddArg(v5)
2064 v2.AddArg(v4)
2065 v1.AddArg(v2)
2066 v7 := b.NewValue0(v.Pos, OpAnd32, typ.UInt32)
2067 v8 := b.NewValue0(v.Pos, OpRsh32x16, typ.UInt32)
2068 v8.AddArg(hi)
2069 v9 := b.NewValue0(v.Pos, OpSub16, typ.UInt16)
2070 v9.AddArg(s)
2071 v10 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
2072 v10.AuxInt = 32
2073 v9.AddArg(v10)
2074 v8.AddArg(v9)
2075 v7.AddArg(v8)
2076 v11 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32)
2077 v12 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
2078 v13 := b.NewValue0(v.Pos, OpRsh16Ux32, typ.UInt16)
2079 v13.AddArg(s)
2080 v14 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
2081 v14.AuxInt = 5
2082 v13.AddArg(v14)
2083 v12.AddArg(v13)
2084 v11.AddArg(v12)
2085 v7.AddArg(v11)
2086 v1.AddArg(v7)
2087 v.AddArg(v1)
2088 return true
2089 }
2090 return false
2091 }
2092 func rewriteValuedec64_OpRsh64x32_0(v *Value) bool {
2093 b := v.Block
2094 typ := &b.Func.Config.Types
2095
2096
2097
2098 for {
2099 s := v.Args[1]
2100 v_0 := v.Args[0]
2101 if v_0.Op != OpInt64Make {
2102 break
2103 }
2104 lo := v_0.Args[1]
2105 hi := v_0.Args[0]
2106 v.reset(OpInt64Make)
2107 v0 := b.NewValue0(v.Pos, OpRsh32x32, typ.UInt32)
2108 v0.AddArg(hi)
2109 v0.AddArg(s)
2110 v.AddArg(v0)
2111 v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
2112 v2 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
2113 v3 := b.NewValue0(v.Pos, OpRsh32Ux32, typ.UInt32)
2114 v3.AddArg(lo)
2115 v3.AddArg(s)
2116 v2.AddArg(v3)
2117 v4 := b.NewValue0(v.Pos, OpLsh32x32, typ.UInt32)
2118 v4.AddArg(hi)
2119 v5 := b.NewValue0(v.Pos, OpSub32, typ.UInt32)
2120 v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
2121 v6.AuxInt = 32
2122 v5.AddArg(v6)
2123 v5.AddArg(s)
2124 v4.AddArg(v5)
2125 v2.AddArg(v4)
2126 v1.AddArg(v2)
2127 v7 := b.NewValue0(v.Pos, OpAnd32, typ.UInt32)
2128 v8 := b.NewValue0(v.Pos, OpRsh32x32, typ.UInt32)
2129 v8.AddArg(hi)
2130 v9 := b.NewValue0(v.Pos, OpSub32, typ.UInt32)
2131 v9.AddArg(s)
2132 v10 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
2133 v10.AuxInt = 32
2134 v9.AddArg(v10)
2135 v8.AddArg(v9)
2136 v7.AddArg(v8)
2137 v11 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32)
2138 v12 := b.NewValue0(v.Pos, OpRsh32Ux32, typ.UInt32)
2139 v12.AddArg(s)
2140 v13 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
2141 v13.AuxInt = 5
2142 v12.AddArg(v13)
2143 v11.AddArg(v12)
2144 v7.AddArg(v11)
2145 v1.AddArg(v7)
2146 v.AddArg(v1)
2147 return true
2148 }
2149 return false
2150 }
2151 func rewriteValuedec64_OpRsh64x64_0(v *Value) bool {
2152 b := v.Block
2153 typ := &b.Func.Config.Types
2154
2155
2156
2157 for {
2158 _ = v.Args[1]
2159 x := v.Args[0]
2160 v_1 := v.Args[1]
2161 if v_1.Op != OpInt64Make {
2162 break
2163 }
2164 _ = v_1.Args[1]
2165 v_1_0 := v_1.Args[0]
2166 if v_1_0.Op != OpConst32 {
2167 break
2168 }
2169 c := v_1_0.AuxInt
2170 if !(c != 0) {
2171 break
2172 }
2173 v.reset(OpInt64Make)
2174 v0 := b.NewValue0(v.Pos, OpSignmask, typ.Int32)
2175 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
2176 v1.AddArg(x)
2177 v0.AddArg(v1)
2178 v.AddArg(v0)
2179 v2 := b.NewValue0(v.Pos, OpSignmask, typ.Int32)
2180 v3 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
2181 v3.AddArg(x)
2182 v2.AddArg(v3)
2183 v.AddArg(v2)
2184 return true
2185 }
2186
2187
2188
2189 for {
2190 _ = v.Args[1]
2191 x := v.Args[0]
2192 v_1 := v.Args[1]
2193 if v_1.Op != OpInt64Make {
2194 break
2195 }
2196 lo := v_1.Args[1]
2197 v_1_0 := v_1.Args[0]
2198 if v_1_0.Op != OpConst32 {
2199 break
2200 }
2201 if v_1_0.AuxInt != 0 {
2202 break
2203 }
2204 v.reset(OpRsh64x32)
2205 v.AddArg(x)
2206 v.AddArg(lo)
2207 return true
2208 }
2209
2210
2211
2212 for {
2213 _ = v.Args[1]
2214 x := v.Args[0]
2215 v_1 := v.Args[1]
2216 if v_1.Op != OpInt64Make {
2217 break
2218 }
2219 lo := v_1.Args[1]
2220 hi := v_1.Args[0]
2221 if !(hi.Op != OpConst32) {
2222 break
2223 }
2224 v.reset(OpRsh64x32)
2225 v.AddArg(x)
2226 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
2227 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32)
2228 v1.AddArg(hi)
2229 v0.AddArg(v1)
2230 v0.AddArg(lo)
2231 v.AddArg(v0)
2232 return true
2233 }
2234 return false
2235 }
2236 func rewriteValuedec64_OpRsh64x8_0(v *Value) bool {
2237 b := v.Block
2238 typ := &b.Func.Config.Types
2239
2240
2241
2242 for {
2243 s := v.Args[1]
2244 v_0 := v.Args[0]
2245 if v_0.Op != OpInt64Make {
2246 break
2247 }
2248 lo := v_0.Args[1]
2249 hi := v_0.Args[0]
2250 v.reset(OpInt64Make)
2251 v0 := b.NewValue0(v.Pos, OpRsh32x8, typ.UInt32)
2252 v0.AddArg(hi)
2253 v0.AddArg(s)
2254 v.AddArg(v0)
2255 v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
2256 v2 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
2257 v3 := b.NewValue0(v.Pos, OpRsh32Ux8, typ.UInt32)
2258 v3.AddArg(lo)
2259 v3.AddArg(s)
2260 v2.AddArg(v3)
2261 v4 := b.NewValue0(v.Pos, OpLsh32x8, typ.UInt32)
2262 v4.AddArg(hi)
2263 v5 := b.NewValue0(v.Pos, OpSub8, typ.UInt8)
2264 v6 := b.NewValue0(v.Pos, OpConst8, typ.UInt8)
2265 v6.AuxInt = 32
2266 v5.AddArg(v6)
2267 v5.AddArg(s)
2268 v4.AddArg(v5)
2269 v2.AddArg(v4)
2270 v1.AddArg(v2)
2271 v7 := b.NewValue0(v.Pos, OpAnd32, typ.UInt32)
2272 v8 := b.NewValue0(v.Pos, OpRsh32x8, typ.UInt32)
2273 v8.AddArg(hi)
2274 v9 := b.NewValue0(v.Pos, OpSub8, typ.UInt8)
2275 v9.AddArg(s)
2276 v10 := b.NewValue0(v.Pos, OpConst8, typ.UInt8)
2277 v10.AuxInt = 32
2278 v9.AddArg(v10)
2279 v8.AddArg(v9)
2280 v7.AddArg(v8)
2281 v11 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32)
2282 v12 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
2283 v13 := b.NewValue0(v.Pos, OpRsh8Ux32, typ.UInt8)
2284 v13.AddArg(s)
2285 v14 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
2286 v14.AuxInt = 5
2287 v13.AddArg(v14)
2288 v12.AddArg(v13)
2289 v11.AddArg(v12)
2290 v7.AddArg(v11)
2291 v1.AddArg(v7)
2292 v.AddArg(v1)
2293 return true
2294 }
2295 return false
2296 }
2297 func rewriteValuedec64_OpRsh8Ux64_0(v *Value) bool {
2298 b := v.Block
2299 typ := &b.Func.Config.Types
2300
2301
2302
2303 for {
2304 _ = v.Args[1]
2305 v_1 := v.Args[1]
2306 if v_1.Op != OpInt64Make {
2307 break
2308 }
2309 _ = v_1.Args[1]
2310 v_1_0 := v_1.Args[0]
2311 if v_1_0.Op != OpConst32 {
2312 break
2313 }
2314 c := v_1_0.AuxInt
2315 if !(c != 0) {
2316 break
2317 }
2318 v.reset(OpConst32)
2319 v.AuxInt = 0
2320 return true
2321 }
2322
2323
2324
2325 for {
2326 _ = v.Args[1]
2327 x := v.Args[0]
2328 v_1 := v.Args[1]
2329 if v_1.Op != OpInt64Make {
2330 break
2331 }
2332 lo := v_1.Args[1]
2333 v_1_0 := v_1.Args[0]
2334 if v_1_0.Op != OpConst32 {
2335 break
2336 }
2337 if v_1_0.AuxInt != 0 {
2338 break
2339 }
2340 v.reset(OpRsh8Ux32)
2341 v.AddArg(x)
2342 v.AddArg(lo)
2343 return true
2344 }
2345
2346
2347
2348 for {
2349 _ = v.Args[1]
2350 x := v.Args[0]
2351 v_1 := v.Args[1]
2352 if v_1.Op != OpInt64Make {
2353 break
2354 }
2355 lo := v_1.Args[1]
2356 hi := v_1.Args[0]
2357 if !(hi.Op != OpConst32) {
2358 break
2359 }
2360 v.reset(OpRsh8Ux32)
2361 v.AddArg(x)
2362 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
2363 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32)
2364 v1.AddArg(hi)
2365 v0.AddArg(v1)
2366 v0.AddArg(lo)
2367 v.AddArg(v0)
2368 return true
2369 }
2370 return false
2371 }
2372 func rewriteValuedec64_OpRsh8x64_0(v *Value) bool {
2373 b := v.Block
2374 typ := &b.Func.Config.Types
2375
2376
2377
2378 for {
2379 _ = v.Args[1]
2380 x := v.Args[0]
2381 v_1 := v.Args[1]
2382 if v_1.Op != OpInt64Make {
2383 break
2384 }
2385 _ = v_1.Args[1]
2386 v_1_0 := v_1.Args[0]
2387 if v_1_0.Op != OpConst32 {
2388 break
2389 }
2390 c := v_1_0.AuxInt
2391 if !(c != 0) {
2392 break
2393 }
2394 v.reset(OpSignmask)
2395 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
2396 v0.AddArg(x)
2397 v.AddArg(v0)
2398 return true
2399 }
2400
2401
2402
2403 for {
2404 _ = v.Args[1]
2405 x := v.Args[0]
2406 v_1 := v.Args[1]
2407 if v_1.Op != OpInt64Make {
2408 break
2409 }
2410 lo := v_1.Args[1]
2411 v_1_0 := v_1.Args[0]
2412 if v_1_0.Op != OpConst32 {
2413 break
2414 }
2415 if v_1_0.AuxInt != 0 {
2416 break
2417 }
2418 v.reset(OpRsh8x32)
2419 v.AddArg(x)
2420 v.AddArg(lo)
2421 return true
2422 }
2423
2424
2425
2426 for {
2427 _ = v.Args[1]
2428 x := v.Args[0]
2429 v_1 := v.Args[1]
2430 if v_1.Op != OpInt64Make {
2431 break
2432 }
2433 lo := v_1.Args[1]
2434 hi := v_1.Args[0]
2435 if !(hi.Op != OpConst32) {
2436 break
2437 }
2438 v.reset(OpRsh8x32)
2439 v.AddArg(x)
2440 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32)
2441 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32)
2442 v1.AddArg(hi)
2443 v0.AddArg(v1)
2444 v0.AddArg(lo)
2445 v.AddArg(v0)
2446 return true
2447 }
2448 return false
2449 }
2450 func rewriteValuedec64_OpSignExt16to64_0(v *Value) bool {
2451 b := v.Block
2452 typ := &b.Func.Config.Types
2453
2454
2455
2456 for {
2457 x := v.Args[0]
2458 v.reset(OpSignExt32to64)
2459 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
2460 v0.AddArg(x)
2461 v.AddArg(v0)
2462 return true
2463 }
2464 }
2465 func rewriteValuedec64_OpSignExt32to64_0(v *Value) bool {
2466 b := v.Block
2467 typ := &b.Func.Config.Types
2468
2469
2470
2471 for {
2472 x := v.Args[0]
2473 v.reset(OpInt64Make)
2474 v0 := b.NewValue0(v.Pos, OpSignmask, typ.Int32)
2475 v0.AddArg(x)
2476 v.AddArg(v0)
2477 v.AddArg(x)
2478 return true
2479 }
2480 }
2481 func rewriteValuedec64_OpSignExt8to64_0(v *Value) bool {
2482 b := v.Block
2483 typ := &b.Func.Config.Types
2484
2485
2486
2487 for {
2488 x := v.Args[0]
2489 v.reset(OpSignExt32to64)
2490 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
2491 v0.AddArg(x)
2492 v.AddArg(v0)
2493 return true
2494 }
2495 }
2496 func rewriteValuedec64_OpStore_0(v *Value) bool {
2497 b := v.Block
2498 config := b.Func.Config
2499
2500
2501
2502 for {
2503 t := v.Aux
2504 mem := v.Args[2]
2505 dst := v.Args[0]
2506 v_1 := v.Args[1]
2507 if v_1.Op != OpInt64Make {
2508 break
2509 }
2510 lo := v_1.Args[1]
2511 hi := v_1.Args[0]
2512 if !(t.(*types.Type).Size() == 8 && !config.BigEndian) {
2513 break
2514 }
2515 v.reset(OpStore)
2516 v.Aux = hi.Type
2517 v0 := b.NewValue0(v.Pos, OpOffPtr, hi.Type.PtrTo())
2518 v0.AuxInt = 4
2519 v0.AddArg(dst)
2520 v.AddArg(v0)
2521 v.AddArg(hi)
2522 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
2523 v1.Aux = lo.Type
2524 v1.AddArg(dst)
2525 v1.AddArg(lo)
2526 v1.AddArg(mem)
2527 v.AddArg(v1)
2528 return true
2529 }
2530
2531
2532
2533 for {
2534 t := v.Aux
2535 mem := v.Args[2]
2536 dst := v.Args[0]
2537 v_1 := v.Args[1]
2538 if v_1.Op != OpInt64Make {
2539 break
2540 }
2541 lo := v_1.Args[1]
2542 hi := v_1.Args[0]
2543 if !(t.(*types.Type).Size() == 8 && config.BigEndian) {
2544 break
2545 }
2546 v.reset(OpStore)
2547 v.Aux = lo.Type
2548 v0 := b.NewValue0(v.Pos, OpOffPtr, lo.Type.PtrTo())
2549 v0.AuxInt = 4
2550 v0.AddArg(dst)
2551 v.AddArg(v0)
2552 v.AddArg(lo)
2553 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
2554 v1.Aux = hi.Type
2555 v1.AddArg(dst)
2556 v1.AddArg(hi)
2557 v1.AddArg(mem)
2558 v.AddArg(v1)
2559 return true
2560 }
2561 return false
2562 }
2563 func rewriteValuedec64_OpSub64_0(v *Value) bool {
2564 b := v.Block
2565 typ := &b.Func.Config.Types
2566
2567
2568
2569 for {
2570 y := v.Args[1]
2571 x := v.Args[0]
2572 v.reset(OpInt64Make)
2573 v0 := b.NewValue0(v.Pos, OpSub32withcarry, typ.Int32)
2574 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
2575 v1.AddArg(x)
2576 v0.AddArg(v1)
2577 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
2578 v2.AddArg(y)
2579 v0.AddArg(v2)
2580 v3 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags)
2581 v4 := b.NewValue0(v.Pos, OpSub32carry, types.NewTuple(typ.UInt32, types.TypeFlags))
2582 v5 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
2583 v5.AddArg(x)
2584 v4.AddArg(v5)
2585 v6 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
2586 v6.AddArg(y)
2587 v4.AddArg(v6)
2588 v3.AddArg(v4)
2589 v0.AddArg(v3)
2590 v.AddArg(v0)
2591 v7 := b.NewValue0(v.Pos, OpSelect0, typ.UInt32)
2592 v8 := b.NewValue0(v.Pos, OpSub32carry, types.NewTuple(typ.UInt32, types.TypeFlags))
2593 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
2594 v9.AddArg(x)
2595 v8.AddArg(v9)
2596 v10 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
2597 v10.AddArg(y)
2598 v8.AddArg(v10)
2599 v7.AddArg(v8)
2600 v.AddArg(v7)
2601 return true
2602 }
2603 }
2604 func rewriteValuedec64_OpTrunc64to16_0(v *Value) bool {
2605
2606
2607
2608 for {
2609 v_0 := v.Args[0]
2610 if v_0.Op != OpInt64Make {
2611 break
2612 }
2613 lo := v_0.Args[1]
2614 v.reset(OpTrunc32to16)
2615 v.AddArg(lo)
2616 return true
2617 }
2618 return false
2619 }
2620 func rewriteValuedec64_OpTrunc64to32_0(v *Value) bool {
2621
2622
2623
2624 for {
2625 v_0 := v.Args[0]
2626 if v_0.Op != OpInt64Make {
2627 break
2628 }
2629 lo := v_0.Args[1]
2630 v.reset(OpCopy)
2631 v.Type = lo.Type
2632 v.AddArg(lo)
2633 return true
2634 }
2635 return false
2636 }
2637 func rewriteValuedec64_OpTrunc64to8_0(v *Value) bool {
2638
2639
2640
2641 for {
2642 v_0 := v.Args[0]
2643 if v_0.Op != OpInt64Make {
2644 break
2645 }
2646 lo := v_0.Args[1]
2647 v.reset(OpTrunc32to8)
2648 v.AddArg(lo)
2649 return true
2650 }
2651 return false
2652 }
2653 func rewriteValuedec64_OpXor64_0(v *Value) bool {
2654 b := v.Block
2655 typ := &b.Func.Config.Types
2656
2657
2658
2659 for {
2660 y := v.Args[1]
2661 x := v.Args[0]
2662 v.reset(OpInt64Make)
2663 v0 := b.NewValue0(v.Pos, OpXor32, typ.UInt32)
2664 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
2665 v1.AddArg(x)
2666 v0.AddArg(v1)
2667 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32)
2668 v2.AddArg(y)
2669 v0.AddArg(v2)
2670 v.AddArg(v0)
2671 v3 := b.NewValue0(v.Pos, OpXor32, typ.UInt32)
2672 v4 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
2673 v4.AddArg(x)
2674 v3.AddArg(v4)
2675 v5 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32)
2676 v5.AddArg(y)
2677 v3.AddArg(v5)
2678 v.AddArg(v3)
2679 return true
2680 }
2681 }
2682 func rewriteValuedec64_OpZeroExt16to64_0(v *Value) bool {
2683 b := v.Block
2684 typ := &b.Func.Config.Types
2685
2686
2687
2688 for {
2689 x := v.Args[0]
2690 v.reset(OpZeroExt32to64)
2691 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
2692 v0.AddArg(x)
2693 v.AddArg(v0)
2694 return true
2695 }
2696 }
2697 func rewriteValuedec64_OpZeroExt32to64_0(v *Value) bool {
2698 b := v.Block
2699 typ := &b.Func.Config.Types
2700
2701
2702
2703 for {
2704 x := v.Args[0]
2705 v.reset(OpInt64Make)
2706 v0 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
2707 v0.AuxInt = 0
2708 v.AddArg(v0)
2709 v.AddArg(x)
2710 return true
2711 }
2712 }
2713 func rewriteValuedec64_OpZeroExt8to64_0(v *Value) bool {
2714 b := v.Block
2715 typ := &b.Func.Config.Types
2716
2717
2718
2719 for {
2720 x := v.Args[0]
2721 v.reset(OpZeroExt32to64)
2722 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
2723 v0.AddArg(x)
2724 v.AddArg(v0)
2725 return true
2726 }
2727 }
2728 func rewriteBlockdec64(b *Block) bool {
2729 config := b.Func.Config
2730 typ := &config.Types
2731 _ = typ
2732 v := b.Control
2733 _ = v
2734 switch b.Kind {
2735 }
2736 return false
2737 }
2738
View as plain text