1
2
3 package ssa
4
5 import "math"
6 import "math/bits"
7 import "cmd/internal/obj"
8 import "cmd/compile/internal/types"
9 import "cmd/compile/internal/ir"
10
11 func rewriteValuegeneric(v *Value) bool {
12 switch v.Op {
13 case OpAdd16:
14 return rewriteValuegeneric_OpAdd16(v)
15 case OpAdd32:
16 return rewriteValuegeneric_OpAdd32(v)
17 case OpAdd32F:
18 return rewriteValuegeneric_OpAdd32F(v)
19 case OpAdd64:
20 return rewriteValuegeneric_OpAdd64(v)
21 case OpAdd64F:
22 return rewriteValuegeneric_OpAdd64F(v)
23 case OpAdd8:
24 return rewriteValuegeneric_OpAdd8(v)
25 case OpAddPtr:
26 return rewriteValuegeneric_OpAddPtr(v)
27 case OpAnd16:
28 return rewriteValuegeneric_OpAnd16(v)
29 case OpAnd32:
30 return rewriteValuegeneric_OpAnd32(v)
31 case OpAnd64:
32 return rewriteValuegeneric_OpAnd64(v)
33 case OpAnd8:
34 return rewriteValuegeneric_OpAnd8(v)
35 case OpAndB:
36 return rewriteValuegeneric_OpAndB(v)
37 case OpArraySelect:
38 return rewriteValuegeneric_OpArraySelect(v)
39 case OpBitLen16:
40 return rewriteValuegeneric_OpBitLen16(v)
41 case OpBitLen32:
42 return rewriteValuegeneric_OpBitLen32(v)
43 case OpBitLen64:
44 return rewriteValuegeneric_OpBitLen64(v)
45 case OpBitLen8:
46 return rewriteValuegeneric_OpBitLen8(v)
47 case OpCeil:
48 return rewriteValuegeneric_OpCeil(v)
49 case OpCom16:
50 return rewriteValuegeneric_OpCom16(v)
51 case OpCom32:
52 return rewriteValuegeneric_OpCom32(v)
53 case OpCom64:
54 return rewriteValuegeneric_OpCom64(v)
55 case OpCom8:
56 return rewriteValuegeneric_OpCom8(v)
57 case OpConstInterface:
58 return rewriteValuegeneric_OpConstInterface(v)
59 case OpConstSlice:
60 return rewriteValuegeneric_OpConstSlice(v)
61 case OpConstString:
62 return rewriteValuegeneric_OpConstString(v)
63 case OpConvert:
64 return rewriteValuegeneric_OpConvert(v)
65 case OpCtz16:
66 return rewriteValuegeneric_OpCtz16(v)
67 case OpCtz32:
68 return rewriteValuegeneric_OpCtz32(v)
69 case OpCtz64:
70 return rewriteValuegeneric_OpCtz64(v)
71 case OpCtz8:
72 return rewriteValuegeneric_OpCtz8(v)
73 case OpCvt32Fto32:
74 return rewriteValuegeneric_OpCvt32Fto32(v)
75 case OpCvt32Fto64:
76 return rewriteValuegeneric_OpCvt32Fto64(v)
77 case OpCvt32Fto64F:
78 return rewriteValuegeneric_OpCvt32Fto64F(v)
79 case OpCvt32to32F:
80 return rewriteValuegeneric_OpCvt32to32F(v)
81 case OpCvt32to64F:
82 return rewriteValuegeneric_OpCvt32to64F(v)
83 case OpCvt64Fto32:
84 return rewriteValuegeneric_OpCvt64Fto32(v)
85 case OpCvt64Fto32F:
86 return rewriteValuegeneric_OpCvt64Fto32F(v)
87 case OpCvt64Fto64:
88 return rewriteValuegeneric_OpCvt64Fto64(v)
89 case OpCvt64to32F:
90 return rewriteValuegeneric_OpCvt64to32F(v)
91 case OpCvt64to64F:
92 return rewriteValuegeneric_OpCvt64to64F(v)
93 case OpCvtBoolToUint8:
94 return rewriteValuegeneric_OpCvtBoolToUint8(v)
95 case OpDiv16:
96 return rewriteValuegeneric_OpDiv16(v)
97 case OpDiv16u:
98 return rewriteValuegeneric_OpDiv16u(v)
99 case OpDiv32:
100 return rewriteValuegeneric_OpDiv32(v)
101 case OpDiv32F:
102 return rewriteValuegeneric_OpDiv32F(v)
103 case OpDiv32u:
104 return rewriteValuegeneric_OpDiv32u(v)
105 case OpDiv64:
106 return rewriteValuegeneric_OpDiv64(v)
107 case OpDiv64F:
108 return rewriteValuegeneric_OpDiv64F(v)
109 case OpDiv64u:
110 return rewriteValuegeneric_OpDiv64u(v)
111 case OpDiv8:
112 return rewriteValuegeneric_OpDiv8(v)
113 case OpDiv8u:
114 return rewriteValuegeneric_OpDiv8u(v)
115 case OpEq16:
116 return rewriteValuegeneric_OpEq16(v)
117 case OpEq32:
118 return rewriteValuegeneric_OpEq32(v)
119 case OpEq32F:
120 return rewriteValuegeneric_OpEq32F(v)
121 case OpEq64:
122 return rewriteValuegeneric_OpEq64(v)
123 case OpEq64F:
124 return rewriteValuegeneric_OpEq64F(v)
125 case OpEq8:
126 return rewriteValuegeneric_OpEq8(v)
127 case OpEqB:
128 return rewriteValuegeneric_OpEqB(v)
129 case OpEqInter:
130 return rewriteValuegeneric_OpEqInter(v)
131 case OpEqPtr:
132 return rewriteValuegeneric_OpEqPtr(v)
133 case OpEqSlice:
134 return rewriteValuegeneric_OpEqSlice(v)
135 case OpFloor:
136 return rewriteValuegeneric_OpFloor(v)
137 case OpIMake:
138 return rewriteValuegeneric_OpIMake(v)
139 case OpInterLECall:
140 return rewriteValuegeneric_OpInterLECall(v)
141 case OpIsInBounds:
142 return rewriteValuegeneric_OpIsInBounds(v)
143 case OpIsNonNil:
144 return rewriteValuegeneric_OpIsNonNil(v)
145 case OpIsSliceInBounds:
146 return rewriteValuegeneric_OpIsSliceInBounds(v)
147 case OpLeq16:
148 return rewriteValuegeneric_OpLeq16(v)
149 case OpLeq16U:
150 return rewriteValuegeneric_OpLeq16U(v)
151 case OpLeq32:
152 return rewriteValuegeneric_OpLeq32(v)
153 case OpLeq32F:
154 return rewriteValuegeneric_OpLeq32F(v)
155 case OpLeq32U:
156 return rewriteValuegeneric_OpLeq32U(v)
157 case OpLeq64:
158 return rewriteValuegeneric_OpLeq64(v)
159 case OpLeq64F:
160 return rewriteValuegeneric_OpLeq64F(v)
161 case OpLeq64U:
162 return rewriteValuegeneric_OpLeq64U(v)
163 case OpLeq8:
164 return rewriteValuegeneric_OpLeq8(v)
165 case OpLeq8U:
166 return rewriteValuegeneric_OpLeq8U(v)
167 case OpLess16:
168 return rewriteValuegeneric_OpLess16(v)
169 case OpLess16U:
170 return rewriteValuegeneric_OpLess16U(v)
171 case OpLess32:
172 return rewriteValuegeneric_OpLess32(v)
173 case OpLess32F:
174 return rewriteValuegeneric_OpLess32F(v)
175 case OpLess32U:
176 return rewriteValuegeneric_OpLess32U(v)
177 case OpLess64:
178 return rewriteValuegeneric_OpLess64(v)
179 case OpLess64F:
180 return rewriteValuegeneric_OpLess64F(v)
181 case OpLess64U:
182 return rewriteValuegeneric_OpLess64U(v)
183 case OpLess8:
184 return rewriteValuegeneric_OpLess8(v)
185 case OpLess8U:
186 return rewriteValuegeneric_OpLess8U(v)
187 case OpLoad:
188 return rewriteValuegeneric_OpLoad(v)
189 case OpLsh16x16:
190 return rewriteValuegeneric_OpLsh16x16(v)
191 case OpLsh16x32:
192 return rewriteValuegeneric_OpLsh16x32(v)
193 case OpLsh16x64:
194 return rewriteValuegeneric_OpLsh16x64(v)
195 case OpLsh16x8:
196 return rewriteValuegeneric_OpLsh16x8(v)
197 case OpLsh32x16:
198 return rewriteValuegeneric_OpLsh32x16(v)
199 case OpLsh32x32:
200 return rewriteValuegeneric_OpLsh32x32(v)
201 case OpLsh32x64:
202 return rewriteValuegeneric_OpLsh32x64(v)
203 case OpLsh32x8:
204 return rewriteValuegeneric_OpLsh32x8(v)
205 case OpLsh64x16:
206 return rewriteValuegeneric_OpLsh64x16(v)
207 case OpLsh64x32:
208 return rewriteValuegeneric_OpLsh64x32(v)
209 case OpLsh64x64:
210 return rewriteValuegeneric_OpLsh64x64(v)
211 case OpLsh64x8:
212 return rewriteValuegeneric_OpLsh64x8(v)
213 case OpLsh8x16:
214 return rewriteValuegeneric_OpLsh8x16(v)
215 case OpLsh8x32:
216 return rewriteValuegeneric_OpLsh8x32(v)
217 case OpLsh8x64:
218 return rewriteValuegeneric_OpLsh8x64(v)
219 case OpLsh8x8:
220 return rewriteValuegeneric_OpLsh8x8(v)
221 case OpMod16:
222 return rewriteValuegeneric_OpMod16(v)
223 case OpMod16u:
224 return rewriteValuegeneric_OpMod16u(v)
225 case OpMod32:
226 return rewriteValuegeneric_OpMod32(v)
227 case OpMod32u:
228 return rewriteValuegeneric_OpMod32u(v)
229 case OpMod64:
230 return rewriteValuegeneric_OpMod64(v)
231 case OpMod64u:
232 return rewriteValuegeneric_OpMod64u(v)
233 case OpMod8:
234 return rewriteValuegeneric_OpMod8(v)
235 case OpMod8u:
236 return rewriteValuegeneric_OpMod8u(v)
237 case OpMove:
238 return rewriteValuegeneric_OpMove(v)
239 case OpMul16:
240 return rewriteValuegeneric_OpMul16(v)
241 case OpMul32:
242 return rewriteValuegeneric_OpMul32(v)
243 case OpMul32F:
244 return rewriteValuegeneric_OpMul32F(v)
245 case OpMul64:
246 return rewriteValuegeneric_OpMul64(v)
247 case OpMul64F:
248 return rewriteValuegeneric_OpMul64F(v)
249 case OpMul8:
250 return rewriteValuegeneric_OpMul8(v)
251 case OpNeg16:
252 return rewriteValuegeneric_OpNeg16(v)
253 case OpNeg32:
254 return rewriteValuegeneric_OpNeg32(v)
255 case OpNeg32F:
256 return rewriteValuegeneric_OpNeg32F(v)
257 case OpNeg64:
258 return rewriteValuegeneric_OpNeg64(v)
259 case OpNeg64F:
260 return rewriteValuegeneric_OpNeg64F(v)
261 case OpNeg8:
262 return rewriteValuegeneric_OpNeg8(v)
263 case OpNeq16:
264 return rewriteValuegeneric_OpNeq16(v)
265 case OpNeq32:
266 return rewriteValuegeneric_OpNeq32(v)
267 case OpNeq32F:
268 return rewriteValuegeneric_OpNeq32F(v)
269 case OpNeq64:
270 return rewriteValuegeneric_OpNeq64(v)
271 case OpNeq64F:
272 return rewriteValuegeneric_OpNeq64F(v)
273 case OpNeq8:
274 return rewriteValuegeneric_OpNeq8(v)
275 case OpNeqB:
276 return rewriteValuegeneric_OpNeqB(v)
277 case OpNeqInter:
278 return rewriteValuegeneric_OpNeqInter(v)
279 case OpNeqPtr:
280 return rewriteValuegeneric_OpNeqPtr(v)
281 case OpNeqSlice:
282 return rewriteValuegeneric_OpNeqSlice(v)
283 case OpNilCheck:
284 return rewriteValuegeneric_OpNilCheck(v)
285 case OpNot:
286 return rewriteValuegeneric_OpNot(v)
287 case OpOffPtr:
288 return rewriteValuegeneric_OpOffPtr(v)
289 case OpOr16:
290 return rewriteValuegeneric_OpOr16(v)
291 case OpOr32:
292 return rewriteValuegeneric_OpOr32(v)
293 case OpOr64:
294 return rewriteValuegeneric_OpOr64(v)
295 case OpOr8:
296 return rewriteValuegeneric_OpOr8(v)
297 case OpOrB:
298 return rewriteValuegeneric_OpOrB(v)
299 case OpPhi:
300 return rewriteValuegeneric_OpPhi(v)
301 case OpPtrIndex:
302 return rewriteValuegeneric_OpPtrIndex(v)
303 case OpRotateLeft16:
304 return rewriteValuegeneric_OpRotateLeft16(v)
305 case OpRotateLeft32:
306 return rewriteValuegeneric_OpRotateLeft32(v)
307 case OpRotateLeft64:
308 return rewriteValuegeneric_OpRotateLeft64(v)
309 case OpRotateLeft8:
310 return rewriteValuegeneric_OpRotateLeft8(v)
311 case OpRound32F:
312 return rewriteValuegeneric_OpRound32F(v)
313 case OpRound64F:
314 return rewriteValuegeneric_OpRound64F(v)
315 case OpRoundToEven:
316 return rewriteValuegeneric_OpRoundToEven(v)
317 case OpRsh16Ux16:
318 return rewriteValuegeneric_OpRsh16Ux16(v)
319 case OpRsh16Ux32:
320 return rewriteValuegeneric_OpRsh16Ux32(v)
321 case OpRsh16Ux64:
322 return rewriteValuegeneric_OpRsh16Ux64(v)
323 case OpRsh16Ux8:
324 return rewriteValuegeneric_OpRsh16Ux8(v)
325 case OpRsh16x16:
326 return rewriteValuegeneric_OpRsh16x16(v)
327 case OpRsh16x32:
328 return rewriteValuegeneric_OpRsh16x32(v)
329 case OpRsh16x64:
330 return rewriteValuegeneric_OpRsh16x64(v)
331 case OpRsh16x8:
332 return rewriteValuegeneric_OpRsh16x8(v)
333 case OpRsh32Ux16:
334 return rewriteValuegeneric_OpRsh32Ux16(v)
335 case OpRsh32Ux32:
336 return rewriteValuegeneric_OpRsh32Ux32(v)
337 case OpRsh32Ux64:
338 return rewriteValuegeneric_OpRsh32Ux64(v)
339 case OpRsh32Ux8:
340 return rewriteValuegeneric_OpRsh32Ux8(v)
341 case OpRsh32x16:
342 return rewriteValuegeneric_OpRsh32x16(v)
343 case OpRsh32x32:
344 return rewriteValuegeneric_OpRsh32x32(v)
345 case OpRsh32x64:
346 return rewriteValuegeneric_OpRsh32x64(v)
347 case OpRsh32x8:
348 return rewriteValuegeneric_OpRsh32x8(v)
349 case OpRsh64Ux16:
350 return rewriteValuegeneric_OpRsh64Ux16(v)
351 case OpRsh64Ux32:
352 return rewriteValuegeneric_OpRsh64Ux32(v)
353 case OpRsh64Ux64:
354 return rewriteValuegeneric_OpRsh64Ux64(v)
355 case OpRsh64Ux8:
356 return rewriteValuegeneric_OpRsh64Ux8(v)
357 case OpRsh64x16:
358 return rewriteValuegeneric_OpRsh64x16(v)
359 case OpRsh64x32:
360 return rewriteValuegeneric_OpRsh64x32(v)
361 case OpRsh64x64:
362 return rewriteValuegeneric_OpRsh64x64(v)
363 case OpRsh64x8:
364 return rewriteValuegeneric_OpRsh64x8(v)
365 case OpRsh8Ux16:
366 return rewriteValuegeneric_OpRsh8Ux16(v)
367 case OpRsh8Ux32:
368 return rewriteValuegeneric_OpRsh8Ux32(v)
369 case OpRsh8Ux64:
370 return rewriteValuegeneric_OpRsh8Ux64(v)
371 case OpRsh8Ux8:
372 return rewriteValuegeneric_OpRsh8Ux8(v)
373 case OpRsh8x16:
374 return rewriteValuegeneric_OpRsh8x16(v)
375 case OpRsh8x32:
376 return rewriteValuegeneric_OpRsh8x32(v)
377 case OpRsh8x64:
378 return rewriteValuegeneric_OpRsh8x64(v)
379 case OpRsh8x8:
380 return rewriteValuegeneric_OpRsh8x8(v)
381 case OpSelect0:
382 return rewriteValuegeneric_OpSelect0(v)
383 case OpSelect1:
384 return rewriteValuegeneric_OpSelect1(v)
385 case OpSelectN:
386 return rewriteValuegeneric_OpSelectN(v)
387 case OpSignExt16to32:
388 return rewriteValuegeneric_OpSignExt16to32(v)
389 case OpSignExt16to64:
390 return rewriteValuegeneric_OpSignExt16to64(v)
391 case OpSignExt32to64:
392 return rewriteValuegeneric_OpSignExt32to64(v)
393 case OpSignExt8to16:
394 return rewriteValuegeneric_OpSignExt8to16(v)
395 case OpSignExt8to32:
396 return rewriteValuegeneric_OpSignExt8to32(v)
397 case OpSignExt8to64:
398 return rewriteValuegeneric_OpSignExt8to64(v)
399 case OpSliceCap:
400 return rewriteValuegeneric_OpSliceCap(v)
401 case OpSliceLen:
402 return rewriteValuegeneric_OpSliceLen(v)
403 case OpSlicePtr:
404 return rewriteValuegeneric_OpSlicePtr(v)
405 case OpSlicemask:
406 return rewriteValuegeneric_OpSlicemask(v)
407 case OpSqrt:
408 return rewriteValuegeneric_OpSqrt(v)
409 case OpStaticCall:
410 return rewriteValuegeneric_OpStaticCall(v)
411 case OpStaticLECall:
412 return rewriteValuegeneric_OpStaticLECall(v)
413 case OpStore:
414 return rewriteValuegeneric_OpStore(v)
415 case OpStringLen:
416 return rewriteValuegeneric_OpStringLen(v)
417 case OpStringPtr:
418 return rewriteValuegeneric_OpStringPtr(v)
419 case OpStructSelect:
420 return rewriteValuegeneric_OpStructSelect(v)
421 case OpSub16:
422 return rewriteValuegeneric_OpSub16(v)
423 case OpSub32:
424 return rewriteValuegeneric_OpSub32(v)
425 case OpSub32F:
426 return rewriteValuegeneric_OpSub32F(v)
427 case OpSub64:
428 return rewriteValuegeneric_OpSub64(v)
429 case OpSub64F:
430 return rewriteValuegeneric_OpSub64F(v)
431 case OpSub8:
432 return rewriteValuegeneric_OpSub8(v)
433 case OpTrunc:
434 return rewriteValuegeneric_OpTrunc(v)
435 case OpTrunc16to8:
436 return rewriteValuegeneric_OpTrunc16to8(v)
437 case OpTrunc32to16:
438 return rewriteValuegeneric_OpTrunc32to16(v)
439 case OpTrunc32to8:
440 return rewriteValuegeneric_OpTrunc32to8(v)
441 case OpTrunc64to16:
442 return rewriteValuegeneric_OpTrunc64to16(v)
443 case OpTrunc64to32:
444 return rewriteValuegeneric_OpTrunc64to32(v)
445 case OpTrunc64to8:
446 return rewriteValuegeneric_OpTrunc64to8(v)
447 case OpXor16:
448 return rewriteValuegeneric_OpXor16(v)
449 case OpXor32:
450 return rewriteValuegeneric_OpXor32(v)
451 case OpXor64:
452 return rewriteValuegeneric_OpXor64(v)
453 case OpXor8:
454 return rewriteValuegeneric_OpXor8(v)
455 case OpZero:
456 return rewriteValuegeneric_OpZero(v)
457 case OpZeroExt16to32:
458 return rewriteValuegeneric_OpZeroExt16to32(v)
459 case OpZeroExt16to64:
460 return rewriteValuegeneric_OpZeroExt16to64(v)
461 case OpZeroExt32to64:
462 return rewriteValuegeneric_OpZeroExt32to64(v)
463 case OpZeroExt8to16:
464 return rewriteValuegeneric_OpZeroExt8to16(v)
465 case OpZeroExt8to32:
466 return rewriteValuegeneric_OpZeroExt8to32(v)
467 case OpZeroExt8to64:
468 return rewriteValuegeneric_OpZeroExt8to64(v)
469 }
470 return false
471 }
472 func rewriteValuegeneric_OpAdd16(v *Value) bool {
473 v_1 := v.Args[1]
474 v_0 := v.Args[0]
475 b := v.Block
476 config := b.Func.Config
477
478
479 for {
480 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
481 if v_0.Op != OpConst16 {
482 continue
483 }
484 c := auxIntToInt16(v_0.AuxInt)
485 if v_1.Op != OpConst16 {
486 continue
487 }
488 d := auxIntToInt16(v_1.AuxInt)
489 v.reset(OpConst16)
490 v.AuxInt = int16ToAuxInt(c + d)
491 return true
492 }
493 break
494 }
495
496
497 for {
498 t := v.Type
499 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
500 if v_0.Op != OpMul16 {
501 continue
502 }
503 _ = v_0.Args[1]
504 v_0_0 := v_0.Args[0]
505 v_0_1 := v_0.Args[1]
506 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
507 x := v_0_0
508 y := v_0_1
509 if v_1.Op != OpMul16 {
510 continue
511 }
512 _ = v_1.Args[1]
513 v_1_0 := v_1.Args[0]
514 v_1_1 := v_1.Args[1]
515 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
516 if x != v_1_0 {
517 continue
518 }
519 z := v_1_1
520 v.reset(OpMul16)
521 v0 := b.NewValue0(v.Pos, OpAdd16, t)
522 v0.AddArg2(y, z)
523 v.AddArg2(x, v0)
524 return true
525 }
526 }
527 }
528 break
529 }
530
531
532 for {
533 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
534 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
535 continue
536 }
537 x := v_1
538 v.copyOf(x)
539 return true
540 }
541 break
542 }
543
544
545 for {
546 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
547 x := v_0
548 if v_1.Op != OpNeg16 {
549 continue
550 }
551 y := v_1.Args[0]
552 v.reset(OpSub16)
553 v.AddArg2(x, y)
554 return true
555 }
556 break
557 }
558
559
560 for {
561 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
562 if v_0.Op != OpCom16 {
563 continue
564 }
565 x := v_0.Args[0]
566 if x != v_1 {
567 continue
568 }
569 v.reset(OpConst16)
570 v.AuxInt = int16ToAuxInt(-1)
571 return true
572 }
573 break
574 }
575
576
577 for {
578 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
579 if v_0.Op != OpSub16 {
580 continue
581 }
582 t := v_0.Args[1]
583 x := v_0.Args[0]
584 if v_1.Op != OpAdd16 {
585 continue
586 }
587 _ = v_1.Args[1]
588 v_1_0 := v_1.Args[0]
589 v_1_1 := v_1.Args[1]
590 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
591 if t != v_1_0 {
592 continue
593 }
594 y := v_1_1
595 v.reset(OpAdd16)
596 v.AddArg2(x, y)
597 return true
598 }
599 }
600 break
601 }
602
603
604 for {
605 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
606 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 1 || v_1.Op != OpCom16 {
607 continue
608 }
609 x := v_1.Args[0]
610 v.reset(OpNeg16)
611 v.AddArg(x)
612 return true
613 }
614 break
615 }
616
617
618 for {
619 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
620 x := v_0
621 if v_1.Op != OpSub16 {
622 continue
623 }
624 _ = v_1.Args[1]
625 y := v_1.Args[0]
626 if x != v_1.Args[1] {
627 continue
628 }
629 v.copyOf(y)
630 return true
631 }
632 break
633 }
634
635
636 for {
637 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
638 x := v_0
639 if v_1.Op != OpAdd16 {
640 continue
641 }
642 _ = v_1.Args[1]
643 v_1_0 := v_1.Args[0]
644 v_1_1 := v_1.Args[1]
645 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
646 y := v_1_0
647 if v_1_1.Op != OpSub16 {
648 continue
649 }
650 _ = v_1_1.Args[1]
651 z := v_1_1.Args[0]
652 if x != v_1_1.Args[1] {
653 continue
654 }
655 v.reset(OpAdd16)
656 v.AddArg2(y, z)
657 return true
658 }
659 }
660 break
661 }
662
663
664
665 for {
666 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
667 if v_0.Op != OpAdd16 {
668 continue
669 }
670 _ = v_0.Args[1]
671 v_0_0 := v_0.Args[0]
672 v_0_1 := v_0.Args[1]
673 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
674 i := v_0_0
675 if i.Op != OpConst16 {
676 continue
677 }
678 t := i.Type
679 z := v_0_1
680 x := v_1
681 if !(z.Op != OpConst16 && x.Op != OpConst16) {
682 continue
683 }
684 v.reset(OpAdd16)
685 v0 := b.NewValue0(v.Pos, OpAdd16, t)
686 v0.AddArg2(z, x)
687 v.AddArg2(i, v0)
688 return true
689 }
690 }
691 break
692 }
693
694
695
696 for {
697 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
698 if v_0.Op != OpSub16 {
699 continue
700 }
701 z := v_0.Args[1]
702 i := v_0.Args[0]
703 if i.Op != OpConst16 {
704 continue
705 }
706 t := i.Type
707 x := v_1
708 if !(z.Op != OpConst16 && x.Op != OpConst16) {
709 continue
710 }
711 v.reset(OpAdd16)
712 v0 := b.NewValue0(v.Pos, OpSub16, t)
713 v0.AddArg2(x, z)
714 v.AddArg2(i, v0)
715 return true
716 }
717 break
718 }
719
720
721 for {
722 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
723 if v_0.Op != OpConst16 {
724 continue
725 }
726 t := v_0.Type
727 c := auxIntToInt16(v_0.AuxInt)
728 if v_1.Op != OpAdd16 {
729 continue
730 }
731 _ = v_1.Args[1]
732 v_1_0 := v_1.Args[0]
733 v_1_1 := v_1.Args[1]
734 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
735 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
736 continue
737 }
738 d := auxIntToInt16(v_1_0.AuxInt)
739 x := v_1_1
740 v.reset(OpAdd16)
741 v0 := b.NewValue0(v.Pos, OpConst16, t)
742 v0.AuxInt = int16ToAuxInt(c + d)
743 v.AddArg2(v0, x)
744 return true
745 }
746 }
747 break
748 }
749
750
751 for {
752 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
753 if v_0.Op != OpConst16 {
754 continue
755 }
756 t := v_0.Type
757 c := auxIntToInt16(v_0.AuxInt)
758 if v_1.Op != OpSub16 {
759 continue
760 }
761 x := v_1.Args[1]
762 v_1_0 := v_1.Args[0]
763 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
764 continue
765 }
766 d := auxIntToInt16(v_1_0.AuxInt)
767 v.reset(OpSub16)
768 v0 := b.NewValue0(v.Pos, OpConst16, t)
769 v0.AuxInt = int16ToAuxInt(c + d)
770 v.AddArg2(v0, x)
771 return true
772 }
773 break
774 }
775
776
777
778 for {
779 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
780 if v_0.Op != OpLsh16x64 {
781 continue
782 }
783 _ = v_0.Args[1]
784 x := v_0.Args[0]
785 z := v_0.Args[1]
786 if z.Op != OpConst64 {
787 continue
788 }
789 c := auxIntToInt64(z.AuxInt)
790 if v_1.Op != OpRsh16Ux64 {
791 continue
792 }
793 _ = v_1.Args[1]
794 if x != v_1.Args[0] {
795 continue
796 }
797 v_1_1 := v_1.Args[1]
798 if v_1_1.Op != OpConst64 {
799 continue
800 }
801 d := auxIntToInt64(v_1_1.AuxInt)
802 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
803 continue
804 }
805 v.reset(OpRotateLeft16)
806 v.AddArg2(x, z)
807 return true
808 }
809 break
810 }
811
812
813
814 for {
815 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
816 left := v_0
817 if left.Op != OpLsh16x64 {
818 continue
819 }
820 y := left.Args[1]
821 x := left.Args[0]
822 right := v_1
823 if right.Op != OpRsh16Ux64 {
824 continue
825 }
826 _ = right.Args[1]
827 if x != right.Args[0] {
828 continue
829 }
830 right_1 := right.Args[1]
831 if right_1.Op != OpSub64 {
832 continue
833 }
834 _ = right_1.Args[1]
835 right_1_0 := right_1.Args[0]
836 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
837 continue
838 }
839 v.reset(OpRotateLeft16)
840 v.AddArg2(x, y)
841 return true
842 }
843 break
844 }
845
846
847
848 for {
849 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
850 left := v_0
851 if left.Op != OpLsh16x32 {
852 continue
853 }
854 y := left.Args[1]
855 x := left.Args[0]
856 right := v_1
857 if right.Op != OpRsh16Ux32 {
858 continue
859 }
860 _ = right.Args[1]
861 if x != right.Args[0] {
862 continue
863 }
864 right_1 := right.Args[1]
865 if right_1.Op != OpSub32 {
866 continue
867 }
868 _ = right_1.Args[1]
869 right_1_0 := right_1.Args[0]
870 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
871 continue
872 }
873 v.reset(OpRotateLeft16)
874 v.AddArg2(x, y)
875 return true
876 }
877 break
878 }
879
880
881
882 for {
883 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
884 left := v_0
885 if left.Op != OpLsh16x16 {
886 continue
887 }
888 y := left.Args[1]
889 x := left.Args[0]
890 right := v_1
891 if right.Op != OpRsh16Ux16 {
892 continue
893 }
894 _ = right.Args[1]
895 if x != right.Args[0] {
896 continue
897 }
898 right_1 := right.Args[1]
899 if right_1.Op != OpSub16 {
900 continue
901 }
902 _ = right_1.Args[1]
903 right_1_0 := right_1.Args[0]
904 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
905 continue
906 }
907 v.reset(OpRotateLeft16)
908 v.AddArg2(x, y)
909 return true
910 }
911 break
912 }
913
914
915
916 for {
917 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
918 left := v_0
919 if left.Op != OpLsh16x8 {
920 continue
921 }
922 y := left.Args[1]
923 x := left.Args[0]
924 right := v_1
925 if right.Op != OpRsh16Ux8 {
926 continue
927 }
928 _ = right.Args[1]
929 if x != right.Args[0] {
930 continue
931 }
932 right_1 := right.Args[1]
933 if right_1.Op != OpSub8 {
934 continue
935 }
936 _ = right_1.Args[1]
937 right_1_0 := right_1.Args[0]
938 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
939 continue
940 }
941 v.reset(OpRotateLeft16)
942 v.AddArg2(x, y)
943 return true
944 }
945 break
946 }
947
948
949
950 for {
951 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
952 right := v_0
953 if right.Op != OpRsh16Ux64 {
954 continue
955 }
956 y := right.Args[1]
957 x := right.Args[0]
958 left := v_1
959 if left.Op != OpLsh16x64 {
960 continue
961 }
962 _ = left.Args[1]
963 if x != left.Args[0] {
964 continue
965 }
966 z := left.Args[1]
967 if z.Op != OpSub64 {
968 continue
969 }
970 _ = z.Args[1]
971 z_0 := z.Args[0]
972 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
973 continue
974 }
975 v.reset(OpRotateLeft16)
976 v.AddArg2(x, z)
977 return true
978 }
979 break
980 }
981
982
983
984 for {
985 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
986 right := v_0
987 if right.Op != OpRsh16Ux32 {
988 continue
989 }
990 y := right.Args[1]
991 x := right.Args[0]
992 left := v_1
993 if left.Op != OpLsh16x32 {
994 continue
995 }
996 _ = left.Args[1]
997 if x != left.Args[0] {
998 continue
999 }
1000 z := left.Args[1]
1001 if z.Op != OpSub32 {
1002 continue
1003 }
1004 _ = z.Args[1]
1005 z_0 := z.Args[0]
1006 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1007 continue
1008 }
1009 v.reset(OpRotateLeft16)
1010 v.AddArg2(x, z)
1011 return true
1012 }
1013 break
1014 }
1015
1016
1017
1018 for {
1019 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1020 right := v_0
1021 if right.Op != OpRsh16Ux16 {
1022 continue
1023 }
1024 y := right.Args[1]
1025 x := right.Args[0]
1026 left := v_1
1027 if left.Op != OpLsh16x16 {
1028 continue
1029 }
1030 _ = left.Args[1]
1031 if x != left.Args[0] {
1032 continue
1033 }
1034 z := left.Args[1]
1035 if z.Op != OpSub16 {
1036 continue
1037 }
1038 _ = z.Args[1]
1039 z_0 := z.Args[0]
1040 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1041 continue
1042 }
1043 v.reset(OpRotateLeft16)
1044 v.AddArg2(x, z)
1045 return true
1046 }
1047 break
1048 }
1049
1050
1051
1052 for {
1053 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1054 right := v_0
1055 if right.Op != OpRsh16Ux8 {
1056 continue
1057 }
1058 y := right.Args[1]
1059 x := right.Args[0]
1060 left := v_1
1061 if left.Op != OpLsh16x8 {
1062 continue
1063 }
1064 _ = left.Args[1]
1065 if x != left.Args[0] {
1066 continue
1067 }
1068 z := left.Args[1]
1069 if z.Op != OpSub8 {
1070 continue
1071 }
1072 _ = z.Args[1]
1073 z_0 := z.Args[0]
1074 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1075 continue
1076 }
1077 v.reset(OpRotateLeft16)
1078 v.AddArg2(x, z)
1079 return true
1080 }
1081 break
1082 }
1083 return false
1084 }
1085 func rewriteValuegeneric_OpAdd32(v *Value) bool {
1086 v_1 := v.Args[1]
1087 v_0 := v.Args[0]
1088 b := v.Block
1089 config := b.Func.Config
1090
1091
1092 for {
1093 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1094 if v_0.Op != OpConst32 {
1095 continue
1096 }
1097 c := auxIntToInt32(v_0.AuxInt)
1098 if v_1.Op != OpConst32 {
1099 continue
1100 }
1101 d := auxIntToInt32(v_1.AuxInt)
1102 v.reset(OpConst32)
1103 v.AuxInt = int32ToAuxInt(c + d)
1104 return true
1105 }
1106 break
1107 }
1108
1109
1110 for {
1111 t := v.Type
1112 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1113 if v_0.Op != OpMul32 {
1114 continue
1115 }
1116 _ = v_0.Args[1]
1117 v_0_0 := v_0.Args[0]
1118 v_0_1 := v_0.Args[1]
1119 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1120 x := v_0_0
1121 y := v_0_1
1122 if v_1.Op != OpMul32 {
1123 continue
1124 }
1125 _ = v_1.Args[1]
1126 v_1_0 := v_1.Args[0]
1127 v_1_1 := v_1.Args[1]
1128 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
1129 if x != v_1_0 {
1130 continue
1131 }
1132 z := v_1_1
1133 v.reset(OpMul32)
1134 v0 := b.NewValue0(v.Pos, OpAdd32, t)
1135 v0.AddArg2(y, z)
1136 v.AddArg2(x, v0)
1137 return true
1138 }
1139 }
1140 }
1141 break
1142 }
1143
1144
1145 for {
1146 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1147 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
1148 continue
1149 }
1150 x := v_1
1151 v.copyOf(x)
1152 return true
1153 }
1154 break
1155 }
1156
1157
1158 for {
1159 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1160 x := v_0
1161 if v_1.Op != OpNeg32 {
1162 continue
1163 }
1164 y := v_1.Args[0]
1165 v.reset(OpSub32)
1166 v.AddArg2(x, y)
1167 return true
1168 }
1169 break
1170 }
1171
1172
1173 for {
1174 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1175 if v_0.Op != OpCom32 {
1176 continue
1177 }
1178 x := v_0.Args[0]
1179 if x != v_1 {
1180 continue
1181 }
1182 v.reset(OpConst32)
1183 v.AuxInt = int32ToAuxInt(-1)
1184 return true
1185 }
1186 break
1187 }
1188
1189
1190 for {
1191 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1192 if v_0.Op != OpSub32 {
1193 continue
1194 }
1195 t := v_0.Args[1]
1196 x := v_0.Args[0]
1197 if v_1.Op != OpAdd32 {
1198 continue
1199 }
1200 _ = v_1.Args[1]
1201 v_1_0 := v_1.Args[0]
1202 v_1_1 := v_1.Args[1]
1203 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1204 if t != v_1_0 {
1205 continue
1206 }
1207 y := v_1_1
1208 v.reset(OpAdd32)
1209 v.AddArg2(x, y)
1210 return true
1211 }
1212 }
1213 break
1214 }
1215
1216
1217 for {
1218 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1219 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 || v_1.Op != OpCom32 {
1220 continue
1221 }
1222 x := v_1.Args[0]
1223 v.reset(OpNeg32)
1224 v.AddArg(x)
1225 return true
1226 }
1227 break
1228 }
1229
1230
1231 for {
1232 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1233 x := v_0
1234 if v_1.Op != OpSub32 {
1235 continue
1236 }
1237 _ = v_1.Args[1]
1238 y := v_1.Args[0]
1239 if x != v_1.Args[1] {
1240 continue
1241 }
1242 v.copyOf(y)
1243 return true
1244 }
1245 break
1246 }
1247
1248
1249 for {
1250 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1251 x := v_0
1252 if v_1.Op != OpAdd32 {
1253 continue
1254 }
1255 _ = v_1.Args[1]
1256 v_1_0 := v_1.Args[0]
1257 v_1_1 := v_1.Args[1]
1258 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1259 y := v_1_0
1260 if v_1_1.Op != OpSub32 {
1261 continue
1262 }
1263 _ = v_1_1.Args[1]
1264 z := v_1_1.Args[0]
1265 if x != v_1_1.Args[1] {
1266 continue
1267 }
1268 v.reset(OpAdd32)
1269 v.AddArg2(y, z)
1270 return true
1271 }
1272 }
1273 break
1274 }
1275
1276
1277
1278 for {
1279 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1280 if v_0.Op != OpAdd32 {
1281 continue
1282 }
1283 _ = v_0.Args[1]
1284 v_0_0 := v_0.Args[0]
1285 v_0_1 := v_0.Args[1]
1286 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1287 i := v_0_0
1288 if i.Op != OpConst32 {
1289 continue
1290 }
1291 t := i.Type
1292 z := v_0_1
1293 x := v_1
1294 if !(z.Op != OpConst32 && x.Op != OpConst32) {
1295 continue
1296 }
1297 v.reset(OpAdd32)
1298 v0 := b.NewValue0(v.Pos, OpAdd32, t)
1299 v0.AddArg2(z, x)
1300 v.AddArg2(i, v0)
1301 return true
1302 }
1303 }
1304 break
1305 }
1306
1307
1308
1309 for {
1310 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1311 if v_0.Op != OpSub32 {
1312 continue
1313 }
1314 z := v_0.Args[1]
1315 i := v_0.Args[0]
1316 if i.Op != OpConst32 {
1317 continue
1318 }
1319 t := i.Type
1320 x := v_1
1321 if !(z.Op != OpConst32 && x.Op != OpConst32) {
1322 continue
1323 }
1324 v.reset(OpAdd32)
1325 v0 := b.NewValue0(v.Pos, OpSub32, t)
1326 v0.AddArg2(x, z)
1327 v.AddArg2(i, v0)
1328 return true
1329 }
1330 break
1331 }
1332
1333
1334 for {
1335 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1336 if v_0.Op != OpConst32 {
1337 continue
1338 }
1339 t := v_0.Type
1340 c := auxIntToInt32(v_0.AuxInt)
1341 if v_1.Op != OpAdd32 {
1342 continue
1343 }
1344 _ = v_1.Args[1]
1345 v_1_0 := v_1.Args[0]
1346 v_1_1 := v_1.Args[1]
1347 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1348 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
1349 continue
1350 }
1351 d := auxIntToInt32(v_1_0.AuxInt)
1352 x := v_1_1
1353 v.reset(OpAdd32)
1354 v0 := b.NewValue0(v.Pos, OpConst32, t)
1355 v0.AuxInt = int32ToAuxInt(c + d)
1356 v.AddArg2(v0, x)
1357 return true
1358 }
1359 }
1360 break
1361 }
1362
1363
1364 for {
1365 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1366 if v_0.Op != OpConst32 {
1367 continue
1368 }
1369 t := v_0.Type
1370 c := auxIntToInt32(v_0.AuxInt)
1371 if v_1.Op != OpSub32 {
1372 continue
1373 }
1374 x := v_1.Args[1]
1375 v_1_0 := v_1.Args[0]
1376 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
1377 continue
1378 }
1379 d := auxIntToInt32(v_1_0.AuxInt)
1380 v.reset(OpSub32)
1381 v0 := b.NewValue0(v.Pos, OpConst32, t)
1382 v0.AuxInt = int32ToAuxInt(c + d)
1383 v.AddArg2(v0, x)
1384 return true
1385 }
1386 break
1387 }
1388
1389
1390
1391 for {
1392 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1393 if v_0.Op != OpLsh32x64 {
1394 continue
1395 }
1396 _ = v_0.Args[1]
1397 x := v_0.Args[0]
1398 z := v_0.Args[1]
1399 if z.Op != OpConst64 {
1400 continue
1401 }
1402 c := auxIntToInt64(z.AuxInt)
1403 if v_1.Op != OpRsh32Ux64 {
1404 continue
1405 }
1406 _ = v_1.Args[1]
1407 if x != v_1.Args[0] {
1408 continue
1409 }
1410 v_1_1 := v_1.Args[1]
1411 if v_1_1.Op != OpConst64 {
1412 continue
1413 }
1414 d := auxIntToInt64(v_1_1.AuxInt)
1415 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
1416 continue
1417 }
1418 v.reset(OpRotateLeft32)
1419 v.AddArg2(x, z)
1420 return true
1421 }
1422 break
1423 }
1424
1425
1426
1427 for {
1428 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1429 left := v_0
1430 if left.Op != OpLsh32x64 {
1431 continue
1432 }
1433 y := left.Args[1]
1434 x := left.Args[0]
1435 right := v_1
1436 if right.Op != OpRsh32Ux64 {
1437 continue
1438 }
1439 _ = right.Args[1]
1440 if x != right.Args[0] {
1441 continue
1442 }
1443 right_1 := right.Args[1]
1444 if right_1.Op != OpSub64 {
1445 continue
1446 }
1447 _ = right_1.Args[1]
1448 right_1_0 := right_1.Args[0]
1449 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1450 continue
1451 }
1452 v.reset(OpRotateLeft32)
1453 v.AddArg2(x, y)
1454 return true
1455 }
1456 break
1457 }
1458
1459
1460
1461 for {
1462 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1463 left := v_0
1464 if left.Op != OpLsh32x32 {
1465 continue
1466 }
1467 y := left.Args[1]
1468 x := left.Args[0]
1469 right := v_1
1470 if right.Op != OpRsh32Ux32 {
1471 continue
1472 }
1473 _ = right.Args[1]
1474 if x != right.Args[0] {
1475 continue
1476 }
1477 right_1 := right.Args[1]
1478 if right_1.Op != OpSub32 {
1479 continue
1480 }
1481 _ = right_1.Args[1]
1482 right_1_0 := right_1.Args[0]
1483 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1484 continue
1485 }
1486 v.reset(OpRotateLeft32)
1487 v.AddArg2(x, y)
1488 return true
1489 }
1490 break
1491 }
1492
1493
1494
1495 for {
1496 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1497 left := v_0
1498 if left.Op != OpLsh32x16 {
1499 continue
1500 }
1501 y := left.Args[1]
1502 x := left.Args[0]
1503 right := v_1
1504 if right.Op != OpRsh32Ux16 {
1505 continue
1506 }
1507 _ = right.Args[1]
1508 if x != right.Args[0] {
1509 continue
1510 }
1511 right_1 := right.Args[1]
1512 if right_1.Op != OpSub16 {
1513 continue
1514 }
1515 _ = right_1.Args[1]
1516 right_1_0 := right_1.Args[0]
1517 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1518 continue
1519 }
1520 v.reset(OpRotateLeft32)
1521 v.AddArg2(x, y)
1522 return true
1523 }
1524 break
1525 }
1526
1527
1528
1529 for {
1530 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1531 left := v_0
1532 if left.Op != OpLsh32x8 {
1533 continue
1534 }
1535 y := left.Args[1]
1536 x := left.Args[0]
1537 right := v_1
1538 if right.Op != OpRsh32Ux8 {
1539 continue
1540 }
1541 _ = right.Args[1]
1542 if x != right.Args[0] {
1543 continue
1544 }
1545 right_1 := right.Args[1]
1546 if right_1.Op != OpSub8 {
1547 continue
1548 }
1549 _ = right_1.Args[1]
1550 right_1_0 := right_1.Args[0]
1551 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1552 continue
1553 }
1554 v.reset(OpRotateLeft32)
1555 v.AddArg2(x, y)
1556 return true
1557 }
1558 break
1559 }
1560
1561
1562
1563 for {
1564 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1565 right := v_0
1566 if right.Op != OpRsh32Ux64 {
1567 continue
1568 }
1569 y := right.Args[1]
1570 x := right.Args[0]
1571 left := v_1
1572 if left.Op != OpLsh32x64 {
1573 continue
1574 }
1575 _ = left.Args[1]
1576 if x != left.Args[0] {
1577 continue
1578 }
1579 z := left.Args[1]
1580 if z.Op != OpSub64 {
1581 continue
1582 }
1583 _ = z.Args[1]
1584 z_0 := z.Args[0]
1585 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1586 continue
1587 }
1588 v.reset(OpRotateLeft32)
1589 v.AddArg2(x, z)
1590 return true
1591 }
1592 break
1593 }
1594
1595
1596
1597 for {
1598 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1599 right := v_0
1600 if right.Op != OpRsh32Ux32 {
1601 continue
1602 }
1603 y := right.Args[1]
1604 x := right.Args[0]
1605 left := v_1
1606 if left.Op != OpLsh32x32 {
1607 continue
1608 }
1609 _ = left.Args[1]
1610 if x != left.Args[0] {
1611 continue
1612 }
1613 z := left.Args[1]
1614 if z.Op != OpSub32 {
1615 continue
1616 }
1617 _ = z.Args[1]
1618 z_0 := z.Args[0]
1619 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1620 continue
1621 }
1622 v.reset(OpRotateLeft32)
1623 v.AddArg2(x, z)
1624 return true
1625 }
1626 break
1627 }
1628
1629
1630
1631 for {
1632 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1633 right := v_0
1634 if right.Op != OpRsh32Ux16 {
1635 continue
1636 }
1637 y := right.Args[1]
1638 x := right.Args[0]
1639 left := v_1
1640 if left.Op != OpLsh32x16 {
1641 continue
1642 }
1643 _ = left.Args[1]
1644 if x != left.Args[0] {
1645 continue
1646 }
1647 z := left.Args[1]
1648 if z.Op != OpSub16 {
1649 continue
1650 }
1651 _ = z.Args[1]
1652 z_0 := z.Args[0]
1653 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1654 continue
1655 }
1656 v.reset(OpRotateLeft32)
1657 v.AddArg2(x, z)
1658 return true
1659 }
1660 break
1661 }
1662
1663
1664
1665 for {
1666 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1667 right := v_0
1668 if right.Op != OpRsh32Ux8 {
1669 continue
1670 }
1671 y := right.Args[1]
1672 x := right.Args[0]
1673 left := v_1
1674 if left.Op != OpLsh32x8 {
1675 continue
1676 }
1677 _ = left.Args[1]
1678 if x != left.Args[0] {
1679 continue
1680 }
1681 z := left.Args[1]
1682 if z.Op != OpSub8 {
1683 continue
1684 }
1685 _ = z.Args[1]
1686 z_0 := z.Args[0]
1687 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1688 continue
1689 }
1690 v.reset(OpRotateLeft32)
1691 v.AddArg2(x, z)
1692 return true
1693 }
1694 break
1695 }
1696 return false
1697 }
1698 func rewriteValuegeneric_OpAdd32F(v *Value) bool {
1699 v_1 := v.Args[1]
1700 v_0 := v.Args[0]
1701
1702
1703
1704 for {
1705 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1706 if v_0.Op != OpConst32F {
1707 continue
1708 }
1709 c := auxIntToFloat32(v_0.AuxInt)
1710 if v_1.Op != OpConst32F {
1711 continue
1712 }
1713 d := auxIntToFloat32(v_1.AuxInt)
1714 if !(c+d == c+d) {
1715 continue
1716 }
1717 v.reset(OpConst32F)
1718 v.AuxInt = float32ToAuxInt(c + d)
1719 return true
1720 }
1721 break
1722 }
1723 return false
1724 }
1725 func rewriteValuegeneric_OpAdd64(v *Value) bool {
1726 v_1 := v.Args[1]
1727 v_0 := v.Args[0]
1728 b := v.Block
1729 config := b.Func.Config
1730
1731
1732 for {
1733 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1734 if v_0.Op != OpConst64 {
1735 continue
1736 }
1737 c := auxIntToInt64(v_0.AuxInt)
1738 if v_1.Op != OpConst64 {
1739 continue
1740 }
1741 d := auxIntToInt64(v_1.AuxInt)
1742 v.reset(OpConst64)
1743 v.AuxInt = int64ToAuxInt(c + d)
1744 return true
1745 }
1746 break
1747 }
1748
1749
1750 for {
1751 t := v.Type
1752 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1753 if v_0.Op != OpMul64 {
1754 continue
1755 }
1756 _ = v_0.Args[1]
1757 v_0_0 := v_0.Args[0]
1758 v_0_1 := v_0.Args[1]
1759 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1760 x := v_0_0
1761 y := v_0_1
1762 if v_1.Op != OpMul64 {
1763 continue
1764 }
1765 _ = v_1.Args[1]
1766 v_1_0 := v_1.Args[0]
1767 v_1_1 := v_1.Args[1]
1768 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
1769 if x != v_1_0 {
1770 continue
1771 }
1772 z := v_1_1
1773 v.reset(OpMul64)
1774 v0 := b.NewValue0(v.Pos, OpAdd64, t)
1775 v0.AddArg2(y, z)
1776 v.AddArg2(x, v0)
1777 return true
1778 }
1779 }
1780 }
1781 break
1782 }
1783
1784
1785 for {
1786 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1787 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
1788 continue
1789 }
1790 x := v_1
1791 v.copyOf(x)
1792 return true
1793 }
1794 break
1795 }
1796
1797
1798 for {
1799 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1800 x := v_0
1801 if v_1.Op != OpNeg64 {
1802 continue
1803 }
1804 y := v_1.Args[0]
1805 v.reset(OpSub64)
1806 v.AddArg2(x, y)
1807 return true
1808 }
1809 break
1810 }
1811
1812
1813 for {
1814 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1815 if v_0.Op != OpCom64 {
1816 continue
1817 }
1818 x := v_0.Args[0]
1819 if x != v_1 {
1820 continue
1821 }
1822 v.reset(OpConst64)
1823 v.AuxInt = int64ToAuxInt(-1)
1824 return true
1825 }
1826 break
1827 }
1828
1829
1830 for {
1831 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1832 if v_0.Op != OpSub64 {
1833 continue
1834 }
1835 t := v_0.Args[1]
1836 x := v_0.Args[0]
1837 if v_1.Op != OpAdd64 {
1838 continue
1839 }
1840 _ = v_1.Args[1]
1841 v_1_0 := v_1.Args[0]
1842 v_1_1 := v_1.Args[1]
1843 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1844 if t != v_1_0 {
1845 continue
1846 }
1847 y := v_1_1
1848 v.reset(OpAdd64)
1849 v.AddArg2(x, y)
1850 return true
1851 }
1852 }
1853 break
1854 }
1855
1856
1857 for {
1858 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1859 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 || v_1.Op != OpCom64 {
1860 continue
1861 }
1862 x := v_1.Args[0]
1863 v.reset(OpNeg64)
1864 v.AddArg(x)
1865 return true
1866 }
1867 break
1868 }
1869
1870
1871 for {
1872 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1873 x := v_0
1874 if v_1.Op != OpSub64 {
1875 continue
1876 }
1877 _ = v_1.Args[1]
1878 y := v_1.Args[0]
1879 if x != v_1.Args[1] {
1880 continue
1881 }
1882 v.copyOf(y)
1883 return true
1884 }
1885 break
1886 }
1887
1888
1889 for {
1890 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1891 x := v_0
1892 if v_1.Op != OpAdd64 {
1893 continue
1894 }
1895 _ = v_1.Args[1]
1896 v_1_0 := v_1.Args[0]
1897 v_1_1 := v_1.Args[1]
1898 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1899 y := v_1_0
1900 if v_1_1.Op != OpSub64 {
1901 continue
1902 }
1903 _ = v_1_1.Args[1]
1904 z := v_1_1.Args[0]
1905 if x != v_1_1.Args[1] {
1906 continue
1907 }
1908 v.reset(OpAdd64)
1909 v.AddArg2(y, z)
1910 return true
1911 }
1912 }
1913 break
1914 }
1915
1916
1917
1918 for {
1919 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1920 if v_0.Op != OpAdd64 {
1921 continue
1922 }
1923 _ = v_0.Args[1]
1924 v_0_0 := v_0.Args[0]
1925 v_0_1 := v_0.Args[1]
1926 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1927 i := v_0_0
1928 if i.Op != OpConst64 {
1929 continue
1930 }
1931 t := i.Type
1932 z := v_0_1
1933 x := v_1
1934 if !(z.Op != OpConst64 && x.Op != OpConst64) {
1935 continue
1936 }
1937 v.reset(OpAdd64)
1938 v0 := b.NewValue0(v.Pos, OpAdd64, t)
1939 v0.AddArg2(z, x)
1940 v.AddArg2(i, v0)
1941 return true
1942 }
1943 }
1944 break
1945 }
1946
1947
1948
1949 for {
1950 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1951 if v_0.Op != OpSub64 {
1952 continue
1953 }
1954 z := v_0.Args[1]
1955 i := v_0.Args[0]
1956 if i.Op != OpConst64 {
1957 continue
1958 }
1959 t := i.Type
1960 x := v_1
1961 if !(z.Op != OpConst64 && x.Op != OpConst64) {
1962 continue
1963 }
1964 v.reset(OpAdd64)
1965 v0 := b.NewValue0(v.Pos, OpSub64, t)
1966 v0.AddArg2(x, z)
1967 v.AddArg2(i, v0)
1968 return true
1969 }
1970 break
1971 }
1972
1973
1974 for {
1975 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1976 if v_0.Op != OpConst64 {
1977 continue
1978 }
1979 t := v_0.Type
1980 c := auxIntToInt64(v_0.AuxInt)
1981 if v_1.Op != OpAdd64 {
1982 continue
1983 }
1984 _ = v_1.Args[1]
1985 v_1_0 := v_1.Args[0]
1986 v_1_1 := v_1.Args[1]
1987 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1988 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
1989 continue
1990 }
1991 d := auxIntToInt64(v_1_0.AuxInt)
1992 x := v_1_1
1993 v.reset(OpAdd64)
1994 v0 := b.NewValue0(v.Pos, OpConst64, t)
1995 v0.AuxInt = int64ToAuxInt(c + d)
1996 v.AddArg2(v0, x)
1997 return true
1998 }
1999 }
2000 break
2001 }
2002
2003
2004 for {
2005 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2006 if v_0.Op != OpConst64 {
2007 continue
2008 }
2009 t := v_0.Type
2010 c := auxIntToInt64(v_0.AuxInt)
2011 if v_1.Op != OpSub64 {
2012 continue
2013 }
2014 x := v_1.Args[1]
2015 v_1_0 := v_1.Args[0]
2016 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
2017 continue
2018 }
2019 d := auxIntToInt64(v_1_0.AuxInt)
2020 v.reset(OpSub64)
2021 v0 := b.NewValue0(v.Pos, OpConst64, t)
2022 v0.AuxInt = int64ToAuxInt(c + d)
2023 v.AddArg2(v0, x)
2024 return true
2025 }
2026 break
2027 }
2028
2029
2030
2031 for {
2032 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2033 if v_0.Op != OpLsh64x64 {
2034 continue
2035 }
2036 _ = v_0.Args[1]
2037 x := v_0.Args[0]
2038 z := v_0.Args[1]
2039 if z.Op != OpConst64 {
2040 continue
2041 }
2042 c := auxIntToInt64(z.AuxInt)
2043 if v_1.Op != OpRsh64Ux64 {
2044 continue
2045 }
2046 _ = v_1.Args[1]
2047 if x != v_1.Args[0] {
2048 continue
2049 }
2050 v_1_1 := v_1.Args[1]
2051 if v_1_1.Op != OpConst64 {
2052 continue
2053 }
2054 d := auxIntToInt64(v_1_1.AuxInt)
2055 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
2056 continue
2057 }
2058 v.reset(OpRotateLeft64)
2059 v.AddArg2(x, z)
2060 return true
2061 }
2062 break
2063 }
2064
2065
2066
2067 for {
2068 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2069 left := v_0
2070 if left.Op != OpLsh64x64 {
2071 continue
2072 }
2073 y := left.Args[1]
2074 x := left.Args[0]
2075 right := v_1
2076 if right.Op != OpRsh64Ux64 {
2077 continue
2078 }
2079 _ = right.Args[1]
2080 if x != right.Args[0] {
2081 continue
2082 }
2083 right_1 := right.Args[1]
2084 if right_1.Op != OpSub64 {
2085 continue
2086 }
2087 _ = right_1.Args[1]
2088 right_1_0 := right_1.Args[0]
2089 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2090 continue
2091 }
2092 v.reset(OpRotateLeft64)
2093 v.AddArg2(x, y)
2094 return true
2095 }
2096 break
2097 }
2098
2099
2100
2101 for {
2102 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2103 left := v_0
2104 if left.Op != OpLsh64x32 {
2105 continue
2106 }
2107 y := left.Args[1]
2108 x := left.Args[0]
2109 right := v_1
2110 if right.Op != OpRsh64Ux32 {
2111 continue
2112 }
2113 _ = right.Args[1]
2114 if x != right.Args[0] {
2115 continue
2116 }
2117 right_1 := right.Args[1]
2118 if right_1.Op != OpSub32 {
2119 continue
2120 }
2121 _ = right_1.Args[1]
2122 right_1_0 := right_1.Args[0]
2123 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2124 continue
2125 }
2126 v.reset(OpRotateLeft64)
2127 v.AddArg2(x, y)
2128 return true
2129 }
2130 break
2131 }
2132
2133
2134
2135 for {
2136 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2137 left := v_0
2138 if left.Op != OpLsh64x16 {
2139 continue
2140 }
2141 y := left.Args[1]
2142 x := left.Args[0]
2143 right := v_1
2144 if right.Op != OpRsh64Ux16 {
2145 continue
2146 }
2147 _ = right.Args[1]
2148 if x != right.Args[0] {
2149 continue
2150 }
2151 right_1 := right.Args[1]
2152 if right_1.Op != OpSub16 {
2153 continue
2154 }
2155 _ = right_1.Args[1]
2156 right_1_0 := right_1.Args[0]
2157 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2158 continue
2159 }
2160 v.reset(OpRotateLeft64)
2161 v.AddArg2(x, y)
2162 return true
2163 }
2164 break
2165 }
2166
2167
2168
2169 for {
2170 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2171 left := v_0
2172 if left.Op != OpLsh64x8 {
2173 continue
2174 }
2175 y := left.Args[1]
2176 x := left.Args[0]
2177 right := v_1
2178 if right.Op != OpRsh64Ux8 {
2179 continue
2180 }
2181 _ = right.Args[1]
2182 if x != right.Args[0] {
2183 continue
2184 }
2185 right_1 := right.Args[1]
2186 if right_1.Op != OpSub8 {
2187 continue
2188 }
2189 _ = right_1.Args[1]
2190 right_1_0 := right_1.Args[0]
2191 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2192 continue
2193 }
2194 v.reset(OpRotateLeft64)
2195 v.AddArg2(x, y)
2196 return true
2197 }
2198 break
2199 }
2200
2201
2202
2203 for {
2204 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2205 right := v_0
2206 if right.Op != OpRsh64Ux64 {
2207 continue
2208 }
2209 y := right.Args[1]
2210 x := right.Args[0]
2211 left := v_1
2212 if left.Op != OpLsh64x64 {
2213 continue
2214 }
2215 _ = left.Args[1]
2216 if x != left.Args[0] {
2217 continue
2218 }
2219 z := left.Args[1]
2220 if z.Op != OpSub64 {
2221 continue
2222 }
2223 _ = z.Args[1]
2224 z_0 := z.Args[0]
2225 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2226 continue
2227 }
2228 v.reset(OpRotateLeft64)
2229 v.AddArg2(x, z)
2230 return true
2231 }
2232 break
2233 }
2234
2235
2236
2237 for {
2238 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2239 right := v_0
2240 if right.Op != OpRsh64Ux32 {
2241 continue
2242 }
2243 y := right.Args[1]
2244 x := right.Args[0]
2245 left := v_1
2246 if left.Op != OpLsh64x32 {
2247 continue
2248 }
2249 _ = left.Args[1]
2250 if x != left.Args[0] {
2251 continue
2252 }
2253 z := left.Args[1]
2254 if z.Op != OpSub32 {
2255 continue
2256 }
2257 _ = z.Args[1]
2258 z_0 := z.Args[0]
2259 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2260 continue
2261 }
2262 v.reset(OpRotateLeft64)
2263 v.AddArg2(x, z)
2264 return true
2265 }
2266 break
2267 }
2268
2269
2270
2271 for {
2272 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2273 right := v_0
2274 if right.Op != OpRsh64Ux16 {
2275 continue
2276 }
2277 y := right.Args[1]
2278 x := right.Args[0]
2279 left := v_1
2280 if left.Op != OpLsh64x16 {
2281 continue
2282 }
2283 _ = left.Args[1]
2284 if x != left.Args[0] {
2285 continue
2286 }
2287 z := left.Args[1]
2288 if z.Op != OpSub16 {
2289 continue
2290 }
2291 _ = z.Args[1]
2292 z_0 := z.Args[0]
2293 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2294 continue
2295 }
2296 v.reset(OpRotateLeft64)
2297 v.AddArg2(x, z)
2298 return true
2299 }
2300 break
2301 }
2302
2303
2304
2305 for {
2306 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2307 right := v_0
2308 if right.Op != OpRsh64Ux8 {
2309 continue
2310 }
2311 y := right.Args[1]
2312 x := right.Args[0]
2313 left := v_1
2314 if left.Op != OpLsh64x8 {
2315 continue
2316 }
2317 _ = left.Args[1]
2318 if x != left.Args[0] {
2319 continue
2320 }
2321 z := left.Args[1]
2322 if z.Op != OpSub8 {
2323 continue
2324 }
2325 _ = z.Args[1]
2326 z_0 := z.Args[0]
2327 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2328 continue
2329 }
2330 v.reset(OpRotateLeft64)
2331 v.AddArg2(x, z)
2332 return true
2333 }
2334 break
2335 }
2336 return false
2337 }
2338 func rewriteValuegeneric_OpAdd64F(v *Value) bool {
2339 v_1 := v.Args[1]
2340 v_0 := v.Args[0]
2341
2342
2343
2344 for {
2345 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2346 if v_0.Op != OpConst64F {
2347 continue
2348 }
2349 c := auxIntToFloat64(v_0.AuxInt)
2350 if v_1.Op != OpConst64F {
2351 continue
2352 }
2353 d := auxIntToFloat64(v_1.AuxInt)
2354 if !(c+d == c+d) {
2355 continue
2356 }
2357 v.reset(OpConst64F)
2358 v.AuxInt = float64ToAuxInt(c + d)
2359 return true
2360 }
2361 break
2362 }
2363 return false
2364 }
2365 func rewriteValuegeneric_OpAdd8(v *Value) bool {
2366 v_1 := v.Args[1]
2367 v_0 := v.Args[0]
2368 b := v.Block
2369 config := b.Func.Config
2370
2371
2372 for {
2373 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2374 if v_0.Op != OpConst8 {
2375 continue
2376 }
2377 c := auxIntToInt8(v_0.AuxInt)
2378 if v_1.Op != OpConst8 {
2379 continue
2380 }
2381 d := auxIntToInt8(v_1.AuxInt)
2382 v.reset(OpConst8)
2383 v.AuxInt = int8ToAuxInt(c + d)
2384 return true
2385 }
2386 break
2387 }
2388
2389
2390 for {
2391 t := v.Type
2392 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2393 if v_0.Op != OpMul8 {
2394 continue
2395 }
2396 _ = v_0.Args[1]
2397 v_0_0 := v_0.Args[0]
2398 v_0_1 := v_0.Args[1]
2399 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
2400 x := v_0_0
2401 y := v_0_1
2402 if v_1.Op != OpMul8 {
2403 continue
2404 }
2405 _ = v_1.Args[1]
2406 v_1_0 := v_1.Args[0]
2407 v_1_1 := v_1.Args[1]
2408 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
2409 if x != v_1_0 {
2410 continue
2411 }
2412 z := v_1_1
2413 v.reset(OpMul8)
2414 v0 := b.NewValue0(v.Pos, OpAdd8, t)
2415 v0.AddArg2(y, z)
2416 v.AddArg2(x, v0)
2417 return true
2418 }
2419 }
2420 }
2421 break
2422 }
2423
2424
2425 for {
2426 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2427 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
2428 continue
2429 }
2430 x := v_1
2431 v.copyOf(x)
2432 return true
2433 }
2434 break
2435 }
2436
2437
2438 for {
2439 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2440 x := v_0
2441 if v_1.Op != OpNeg8 {
2442 continue
2443 }
2444 y := v_1.Args[0]
2445 v.reset(OpSub8)
2446 v.AddArg2(x, y)
2447 return true
2448 }
2449 break
2450 }
2451
2452
2453 for {
2454 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2455 if v_0.Op != OpCom8 {
2456 continue
2457 }
2458 x := v_0.Args[0]
2459 if x != v_1 {
2460 continue
2461 }
2462 v.reset(OpConst8)
2463 v.AuxInt = int8ToAuxInt(-1)
2464 return true
2465 }
2466 break
2467 }
2468
2469
2470 for {
2471 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2472 if v_0.Op != OpSub8 {
2473 continue
2474 }
2475 t := v_0.Args[1]
2476 x := v_0.Args[0]
2477 if v_1.Op != OpAdd8 {
2478 continue
2479 }
2480 _ = v_1.Args[1]
2481 v_1_0 := v_1.Args[0]
2482 v_1_1 := v_1.Args[1]
2483 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2484 if t != v_1_0 {
2485 continue
2486 }
2487 y := v_1_1
2488 v.reset(OpAdd8)
2489 v.AddArg2(x, y)
2490 return true
2491 }
2492 }
2493 break
2494 }
2495
2496
2497 for {
2498 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2499 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 1 || v_1.Op != OpCom8 {
2500 continue
2501 }
2502 x := v_1.Args[0]
2503 v.reset(OpNeg8)
2504 v.AddArg(x)
2505 return true
2506 }
2507 break
2508 }
2509
2510
2511 for {
2512 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2513 x := v_0
2514 if v_1.Op != OpSub8 {
2515 continue
2516 }
2517 _ = v_1.Args[1]
2518 y := v_1.Args[0]
2519 if x != v_1.Args[1] {
2520 continue
2521 }
2522 v.copyOf(y)
2523 return true
2524 }
2525 break
2526 }
2527
2528
2529 for {
2530 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2531 x := v_0
2532 if v_1.Op != OpAdd8 {
2533 continue
2534 }
2535 _ = v_1.Args[1]
2536 v_1_0 := v_1.Args[0]
2537 v_1_1 := v_1.Args[1]
2538 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2539 y := v_1_0
2540 if v_1_1.Op != OpSub8 {
2541 continue
2542 }
2543 _ = v_1_1.Args[1]
2544 z := v_1_1.Args[0]
2545 if x != v_1_1.Args[1] {
2546 continue
2547 }
2548 v.reset(OpAdd8)
2549 v.AddArg2(y, z)
2550 return true
2551 }
2552 }
2553 break
2554 }
2555
2556
2557
2558 for {
2559 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2560 if v_0.Op != OpAdd8 {
2561 continue
2562 }
2563 _ = v_0.Args[1]
2564 v_0_0 := v_0.Args[0]
2565 v_0_1 := v_0.Args[1]
2566 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
2567 i := v_0_0
2568 if i.Op != OpConst8 {
2569 continue
2570 }
2571 t := i.Type
2572 z := v_0_1
2573 x := v_1
2574 if !(z.Op != OpConst8 && x.Op != OpConst8) {
2575 continue
2576 }
2577 v.reset(OpAdd8)
2578 v0 := b.NewValue0(v.Pos, OpAdd8, t)
2579 v0.AddArg2(z, x)
2580 v.AddArg2(i, v0)
2581 return true
2582 }
2583 }
2584 break
2585 }
2586
2587
2588
2589 for {
2590 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2591 if v_0.Op != OpSub8 {
2592 continue
2593 }
2594 z := v_0.Args[1]
2595 i := v_0.Args[0]
2596 if i.Op != OpConst8 {
2597 continue
2598 }
2599 t := i.Type
2600 x := v_1
2601 if !(z.Op != OpConst8 && x.Op != OpConst8) {
2602 continue
2603 }
2604 v.reset(OpAdd8)
2605 v0 := b.NewValue0(v.Pos, OpSub8, t)
2606 v0.AddArg2(x, z)
2607 v.AddArg2(i, v0)
2608 return true
2609 }
2610 break
2611 }
2612
2613
2614 for {
2615 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2616 if v_0.Op != OpConst8 {
2617 continue
2618 }
2619 t := v_0.Type
2620 c := auxIntToInt8(v_0.AuxInt)
2621 if v_1.Op != OpAdd8 {
2622 continue
2623 }
2624 _ = v_1.Args[1]
2625 v_1_0 := v_1.Args[0]
2626 v_1_1 := v_1.Args[1]
2627 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2628 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
2629 continue
2630 }
2631 d := auxIntToInt8(v_1_0.AuxInt)
2632 x := v_1_1
2633 v.reset(OpAdd8)
2634 v0 := b.NewValue0(v.Pos, OpConst8, t)
2635 v0.AuxInt = int8ToAuxInt(c + d)
2636 v.AddArg2(v0, x)
2637 return true
2638 }
2639 }
2640 break
2641 }
2642
2643
2644 for {
2645 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2646 if v_0.Op != OpConst8 {
2647 continue
2648 }
2649 t := v_0.Type
2650 c := auxIntToInt8(v_0.AuxInt)
2651 if v_1.Op != OpSub8 {
2652 continue
2653 }
2654 x := v_1.Args[1]
2655 v_1_0 := v_1.Args[0]
2656 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
2657 continue
2658 }
2659 d := auxIntToInt8(v_1_0.AuxInt)
2660 v.reset(OpSub8)
2661 v0 := b.NewValue0(v.Pos, OpConst8, t)
2662 v0.AuxInt = int8ToAuxInt(c + d)
2663 v.AddArg2(v0, x)
2664 return true
2665 }
2666 break
2667 }
2668
2669
2670
2671 for {
2672 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2673 if v_0.Op != OpLsh8x64 {
2674 continue
2675 }
2676 _ = v_0.Args[1]
2677 x := v_0.Args[0]
2678 z := v_0.Args[1]
2679 if z.Op != OpConst64 {
2680 continue
2681 }
2682 c := auxIntToInt64(z.AuxInt)
2683 if v_1.Op != OpRsh8Ux64 {
2684 continue
2685 }
2686 _ = v_1.Args[1]
2687 if x != v_1.Args[0] {
2688 continue
2689 }
2690 v_1_1 := v_1.Args[1]
2691 if v_1_1.Op != OpConst64 {
2692 continue
2693 }
2694 d := auxIntToInt64(v_1_1.AuxInt)
2695 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
2696 continue
2697 }
2698 v.reset(OpRotateLeft8)
2699 v.AddArg2(x, z)
2700 return true
2701 }
2702 break
2703 }
2704
2705
2706
2707 for {
2708 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2709 left := v_0
2710 if left.Op != OpLsh8x64 {
2711 continue
2712 }
2713 y := left.Args[1]
2714 x := left.Args[0]
2715 right := v_1
2716 if right.Op != OpRsh8Ux64 {
2717 continue
2718 }
2719 _ = right.Args[1]
2720 if x != right.Args[0] {
2721 continue
2722 }
2723 right_1 := right.Args[1]
2724 if right_1.Op != OpSub64 {
2725 continue
2726 }
2727 _ = right_1.Args[1]
2728 right_1_0 := right_1.Args[0]
2729 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2730 continue
2731 }
2732 v.reset(OpRotateLeft8)
2733 v.AddArg2(x, y)
2734 return true
2735 }
2736 break
2737 }
2738
2739
2740
2741 for {
2742 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2743 left := v_0
2744 if left.Op != OpLsh8x32 {
2745 continue
2746 }
2747 y := left.Args[1]
2748 x := left.Args[0]
2749 right := v_1
2750 if right.Op != OpRsh8Ux32 {
2751 continue
2752 }
2753 _ = right.Args[1]
2754 if x != right.Args[0] {
2755 continue
2756 }
2757 right_1 := right.Args[1]
2758 if right_1.Op != OpSub32 {
2759 continue
2760 }
2761 _ = right_1.Args[1]
2762 right_1_0 := right_1.Args[0]
2763 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2764 continue
2765 }
2766 v.reset(OpRotateLeft8)
2767 v.AddArg2(x, y)
2768 return true
2769 }
2770 break
2771 }
2772
2773
2774
2775 for {
2776 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2777 left := v_0
2778 if left.Op != OpLsh8x16 {
2779 continue
2780 }
2781 y := left.Args[1]
2782 x := left.Args[0]
2783 right := v_1
2784 if right.Op != OpRsh8Ux16 {
2785 continue
2786 }
2787 _ = right.Args[1]
2788 if x != right.Args[0] {
2789 continue
2790 }
2791 right_1 := right.Args[1]
2792 if right_1.Op != OpSub16 {
2793 continue
2794 }
2795 _ = right_1.Args[1]
2796 right_1_0 := right_1.Args[0]
2797 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2798 continue
2799 }
2800 v.reset(OpRotateLeft8)
2801 v.AddArg2(x, y)
2802 return true
2803 }
2804 break
2805 }
2806
2807
2808
2809 for {
2810 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2811 left := v_0
2812 if left.Op != OpLsh8x8 {
2813 continue
2814 }
2815 y := left.Args[1]
2816 x := left.Args[0]
2817 right := v_1
2818 if right.Op != OpRsh8Ux8 {
2819 continue
2820 }
2821 _ = right.Args[1]
2822 if x != right.Args[0] {
2823 continue
2824 }
2825 right_1 := right.Args[1]
2826 if right_1.Op != OpSub8 {
2827 continue
2828 }
2829 _ = right_1.Args[1]
2830 right_1_0 := right_1.Args[0]
2831 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2832 continue
2833 }
2834 v.reset(OpRotateLeft8)
2835 v.AddArg2(x, y)
2836 return true
2837 }
2838 break
2839 }
2840
2841
2842
2843 for {
2844 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2845 right := v_0
2846 if right.Op != OpRsh8Ux64 {
2847 continue
2848 }
2849 y := right.Args[1]
2850 x := right.Args[0]
2851 left := v_1
2852 if left.Op != OpLsh8x64 {
2853 continue
2854 }
2855 _ = left.Args[1]
2856 if x != left.Args[0] {
2857 continue
2858 }
2859 z := left.Args[1]
2860 if z.Op != OpSub64 {
2861 continue
2862 }
2863 _ = z.Args[1]
2864 z_0 := z.Args[0]
2865 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2866 continue
2867 }
2868 v.reset(OpRotateLeft8)
2869 v.AddArg2(x, z)
2870 return true
2871 }
2872 break
2873 }
2874
2875
2876
2877 for {
2878 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2879 right := v_0
2880 if right.Op != OpRsh8Ux32 {
2881 continue
2882 }
2883 y := right.Args[1]
2884 x := right.Args[0]
2885 left := v_1
2886 if left.Op != OpLsh8x32 {
2887 continue
2888 }
2889 _ = left.Args[1]
2890 if x != left.Args[0] {
2891 continue
2892 }
2893 z := left.Args[1]
2894 if z.Op != OpSub32 {
2895 continue
2896 }
2897 _ = z.Args[1]
2898 z_0 := z.Args[0]
2899 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2900 continue
2901 }
2902 v.reset(OpRotateLeft8)
2903 v.AddArg2(x, z)
2904 return true
2905 }
2906 break
2907 }
2908
2909
2910
2911 for {
2912 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2913 right := v_0
2914 if right.Op != OpRsh8Ux16 {
2915 continue
2916 }
2917 y := right.Args[1]
2918 x := right.Args[0]
2919 left := v_1
2920 if left.Op != OpLsh8x16 {
2921 continue
2922 }
2923 _ = left.Args[1]
2924 if x != left.Args[0] {
2925 continue
2926 }
2927 z := left.Args[1]
2928 if z.Op != OpSub16 {
2929 continue
2930 }
2931 _ = z.Args[1]
2932 z_0 := z.Args[0]
2933 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2934 continue
2935 }
2936 v.reset(OpRotateLeft8)
2937 v.AddArg2(x, z)
2938 return true
2939 }
2940 break
2941 }
2942
2943
2944
2945 for {
2946 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2947 right := v_0
2948 if right.Op != OpRsh8Ux8 {
2949 continue
2950 }
2951 y := right.Args[1]
2952 x := right.Args[0]
2953 left := v_1
2954 if left.Op != OpLsh8x8 {
2955 continue
2956 }
2957 _ = left.Args[1]
2958 if x != left.Args[0] {
2959 continue
2960 }
2961 z := left.Args[1]
2962 if z.Op != OpSub8 {
2963 continue
2964 }
2965 _ = z.Args[1]
2966 z_0 := z.Args[0]
2967 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2968 continue
2969 }
2970 v.reset(OpRotateLeft8)
2971 v.AddArg2(x, z)
2972 return true
2973 }
2974 break
2975 }
2976 return false
2977 }
2978 func rewriteValuegeneric_OpAddPtr(v *Value) bool {
2979 v_1 := v.Args[1]
2980 v_0 := v.Args[0]
2981
2982
2983 for {
2984 t := v.Type
2985 x := v_0
2986 if v_1.Op != OpConst64 {
2987 break
2988 }
2989 c := auxIntToInt64(v_1.AuxInt)
2990 v.reset(OpOffPtr)
2991 v.Type = t
2992 v.AuxInt = int64ToAuxInt(c)
2993 v.AddArg(x)
2994 return true
2995 }
2996
2997
2998 for {
2999 t := v.Type
3000 x := v_0
3001 if v_1.Op != OpConst32 {
3002 break
3003 }
3004 c := auxIntToInt32(v_1.AuxInt)
3005 v.reset(OpOffPtr)
3006 v.Type = t
3007 v.AuxInt = int64ToAuxInt(int64(c))
3008 v.AddArg(x)
3009 return true
3010 }
3011 return false
3012 }
3013 func rewriteValuegeneric_OpAnd16(v *Value) bool {
3014 v_1 := v.Args[1]
3015 v_0 := v.Args[0]
3016 b := v.Block
3017
3018
3019 for {
3020 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3021 if v_0.Op != OpConst16 {
3022 continue
3023 }
3024 c := auxIntToInt16(v_0.AuxInt)
3025 if v_1.Op != OpConst16 {
3026 continue
3027 }
3028 d := auxIntToInt16(v_1.AuxInt)
3029 v.reset(OpConst16)
3030 v.AuxInt = int16ToAuxInt(c & d)
3031 return true
3032 }
3033 break
3034 }
3035
3036
3037 for {
3038 t := v.Type
3039 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3040 if v_0.Op != OpCom16 {
3041 continue
3042 }
3043 x := v_0.Args[0]
3044 if v_1.Op != OpCom16 {
3045 continue
3046 }
3047 y := v_1.Args[0]
3048 v.reset(OpCom16)
3049 v0 := b.NewValue0(v.Pos, OpOr16, t)
3050 v0.AddArg2(x, y)
3051 v.AddArg(v0)
3052 return true
3053 }
3054 break
3055 }
3056
3057
3058
3059 for {
3060 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3061 if v_0.Op != OpConst16 {
3062 continue
3063 }
3064 m := auxIntToInt16(v_0.AuxInt)
3065 if v_1.Op != OpRsh16Ux64 {
3066 continue
3067 }
3068 _ = v_1.Args[1]
3069 v_1_1 := v_1.Args[1]
3070 if v_1_1.Op != OpConst64 {
3071 continue
3072 }
3073 c := auxIntToInt64(v_1_1.AuxInt)
3074 if !(c >= int64(16-ntz16(m))) {
3075 continue
3076 }
3077 v.reset(OpConst16)
3078 v.AuxInt = int16ToAuxInt(0)
3079 return true
3080 }
3081 break
3082 }
3083
3084
3085
3086 for {
3087 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3088 if v_0.Op != OpConst16 {
3089 continue
3090 }
3091 m := auxIntToInt16(v_0.AuxInt)
3092 if v_1.Op != OpLsh16x64 {
3093 continue
3094 }
3095 _ = v_1.Args[1]
3096 v_1_1 := v_1.Args[1]
3097 if v_1_1.Op != OpConst64 {
3098 continue
3099 }
3100 c := auxIntToInt64(v_1_1.AuxInt)
3101 if !(c >= int64(16-nlz16(m))) {
3102 continue
3103 }
3104 v.reset(OpConst16)
3105 v.AuxInt = int16ToAuxInt(0)
3106 return true
3107 }
3108 break
3109 }
3110
3111
3112 for {
3113 x := v_0
3114 if x != v_1 {
3115 break
3116 }
3117 v.copyOf(x)
3118 return true
3119 }
3120
3121
3122 for {
3123 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3124 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
3125 continue
3126 }
3127 x := v_1
3128 v.copyOf(x)
3129 return true
3130 }
3131 break
3132 }
3133
3134
3135 for {
3136 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3137 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
3138 continue
3139 }
3140 v.reset(OpConst16)
3141 v.AuxInt = int16ToAuxInt(0)
3142 return true
3143 }
3144 break
3145 }
3146
3147
3148 for {
3149 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3150 if v_0.Op != OpCom16 {
3151 continue
3152 }
3153 x := v_0.Args[0]
3154 if x != v_1 {
3155 continue
3156 }
3157 v.reset(OpConst16)
3158 v.AuxInt = int16ToAuxInt(0)
3159 return true
3160 }
3161 break
3162 }
3163
3164
3165 for {
3166 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3167 x := v_0
3168 if v_1.Op != OpAnd16 {
3169 continue
3170 }
3171 _ = v_1.Args[1]
3172 v_1_0 := v_1.Args[0]
3173 v_1_1 := v_1.Args[1]
3174 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3175 if x != v_1_0 {
3176 continue
3177 }
3178 y := v_1_1
3179 v.reset(OpAnd16)
3180 v.AddArg2(x, y)
3181 return true
3182 }
3183 }
3184 break
3185 }
3186
3187
3188
3189 for {
3190 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3191 if v_0.Op != OpAnd16 {
3192 continue
3193 }
3194 _ = v_0.Args[1]
3195 v_0_0 := v_0.Args[0]
3196 v_0_1 := v_0.Args[1]
3197 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3198 i := v_0_0
3199 if i.Op != OpConst16 {
3200 continue
3201 }
3202 t := i.Type
3203 z := v_0_1
3204 x := v_1
3205 if !(z.Op != OpConst16 && x.Op != OpConst16) {
3206 continue
3207 }
3208 v.reset(OpAnd16)
3209 v0 := b.NewValue0(v.Pos, OpAnd16, t)
3210 v0.AddArg2(z, x)
3211 v.AddArg2(i, v0)
3212 return true
3213 }
3214 }
3215 break
3216 }
3217
3218
3219 for {
3220 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3221 if v_0.Op != OpConst16 {
3222 continue
3223 }
3224 t := v_0.Type
3225 c := auxIntToInt16(v_0.AuxInt)
3226 if v_1.Op != OpAnd16 {
3227 continue
3228 }
3229 _ = v_1.Args[1]
3230 v_1_0 := v_1.Args[0]
3231 v_1_1 := v_1.Args[1]
3232 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3233 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
3234 continue
3235 }
3236 d := auxIntToInt16(v_1_0.AuxInt)
3237 x := v_1_1
3238 v.reset(OpAnd16)
3239 v0 := b.NewValue0(v.Pos, OpConst16, t)
3240 v0.AuxInt = int16ToAuxInt(c & d)
3241 v.AddArg2(v0, x)
3242 return true
3243 }
3244 }
3245 break
3246 }
3247 return false
3248 }
3249 func rewriteValuegeneric_OpAnd32(v *Value) bool {
3250 v_1 := v.Args[1]
3251 v_0 := v.Args[0]
3252 b := v.Block
3253
3254
3255 for {
3256 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3257 if v_0.Op != OpConst32 {
3258 continue
3259 }
3260 c := auxIntToInt32(v_0.AuxInt)
3261 if v_1.Op != OpConst32 {
3262 continue
3263 }
3264 d := auxIntToInt32(v_1.AuxInt)
3265 v.reset(OpConst32)
3266 v.AuxInt = int32ToAuxInt(c & d)
3267 return true
3268 }
3269 break
3270 }
3271
3272
3273 for {
3274 t := v.Type
3275 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3276 if v_0.Op != OpCom32 {
3277 continue
3278 }
3279 x := v_0.Args[0]
3280 if v_1.Op != OpCom32 {
3281 continue
3282 }
3283 y := v_1.Args[0]
3284 v.reset(OpCom32)
3285 v0 := b.NewValue0(v.Pos, OpOr32, t)
3286 v0.AddArg2(x, y)
3287 v.AddArg(v0)
3288 return true
3289 }
3290 break
3291 }
3292
3293
3294
3295 for {
3296 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3297 if v_0.Op != OpConst32 {
3298 continue
3299 }
3300 m := auxIntToInt32(v_0.AuxInt)
3301 if v_1.Op != OpRsh32Ux64 {
3302 continue
3303 }
3304 _ = v_1.Args[1]
3305 v_1_1 := v_1.Args[1]
3306 if v_1_1.Op != OpConst64 {
3307 continue
3308 }
3309 c := auxIntToInt64(v_1_1.AuxInt)
3310 if !(c >= int64(32-ntz32(m))) {
3311 continue
3312 }
3313 v.reset(OpConst32)
3314 v.AuxInt = int32ToAuxInt(0)
3315 return true
3316 }
3317 break
3318 }
3319
3320
3321
3322 for {
3323 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3324 if v_0.Op != OpConst32 {
3325 continue
3326 }
3327 m := auxIntToInt32(v_0.AuxInt)
3328 if v_1.Op != OpLsh32x64 {
3329 continue
3330 }
3331 _ = v_1.Args[1]
3332 v_1_1 := v_1.Args[1]
3333 if v_1_1.Op != OpConst64 {
3334 continue
3335 }
3336 c := auxIntToInt64(v_1_1.AuxInt)
3337 if !(c >= int64(32-nlz32(m))) {
3338 continue
3339 }
3340 v.reset(OpConst32)
3341 v.AuxInt = int32ToAuxInt(0)
3342 return true
3343 }
3344 break
3345 }
3346
3347
3348 for {
3349 x := v_0
3350 if x != v_1 {
3351 break
3352 }
3353 v.copyOf(x)
3354 return true
3355 }
3356
3357
3358 for {
3359 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3360 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
3361 continue
3362 }
3363 x := v_1
3364 v.copyOf(x)
3365 return true
3366 }
3367 break
3368 }
3369
3370
3371 for {
3372 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3373 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
3374 continue
3375 }
3376 v.reset(OpConst32)
3377 v.AuxInt = int32ToAuxInt(0)
3378 return true
3379 }
3380 break
3381 }
3382
3383
3384 for {
3385 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3386 if v_0.Op != OpCom32 {
3387 continue
3388 }
3389 x := v_0.Args[0]
3390 if x != v_1 {
3391 continue
3392 }
3393 v.reset(OpConst32)
3394 v.AuxInt = int32ToAuxInt(0)
3395 return true
3396 }
3397 break
3398 }
3399
3400
3401 for {
3402 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3403 x := v_0
3404 if v_1.Op != OpAnd32 {
3405 continue
3406 }
3407 _ = v_1.Args[1]
3408 v_1_0 := v_1.Args[0]
3409 v_1_1 := v_1.Args[1]
3410 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3411 if x != v_1_0 {
3412 continue
3413 }
3414 y := v_1_1
3415 v.reset(OpAnd32)
3416 v.AddArg2(x, y)
3417 return true
3418 }
3419 }
3420 break
3421 }
3422
3423
3424
3425 for {
3426 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3427 if v_0.Op != OpAnd32 {
3428 continue
3429 }
3430 _ = v_0.Args[1]
3431 v_0_0 := v_0.Args[0]
3432 v_0_1 := v_0.Args[1]
3433 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3434 i := v_0_0
3435 if i.Op != OpConst32 {
3436 continue
3437 }
3438 t := i.Type
3439 z := v_0_1
3440 x := v_1
3441 if !(z.Op != OpConst32 && x.Op != OpConst32) {
3442 continue
3443 }
3444 v.reset(OpAnd32)
3445 v0 := b.NewValue0(v.Pos, OpAnd32, t)
3446 v0.AddArg2(z, x)
3447 v.AddArg2(i, v0)
3448 return true
3449 }
3450 }
3451 break
3452 }
3453
3454
3455 for {
3456 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3457 if v_0.Op != OpConst32 {
3458 continue
3459 }
3460 t := v_0.Type
3461 c := auxIntToInt32(v_0.AuxInt)
3462 if v_1.Op != OpAnd32 {
3463 continue
3464 }
3465 _ = v_1.Args[1]
3466 v_1_0 := v_1.Args[0]
3467 v_1_1 := v_1.Args[1]
3468 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3469 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
3470 continue
3471 }
3472 d := auxIntToInt32(v_1_0.AuxInt)
3473 x := v_1_1
3474 v.reset(OpAnd32)
3475 v0 := b.NewValue0(v.Pos, OpConst32, t)
3476 v0.AuxInt = int32ToAuxInt(c & d)
3477 v.AddArg2(v0, x)
3478 return true
3479 }
3480 }
3481 break
3482 }
3483 return false
3484 }
3485 func rewriteValuegeneric_OpAnd64(v *Value) bool {
3486 v_1 := v.Args[1]
3487 v_0 := v.Args[0]
3488 b := v.Block
3489
3490
3491 for {
3492 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3493 if v_0.Op != OpConst64 {
3494 continue
3495 }
3496 c := auxIntToInt64(v_0.AuxInt)
3497 if v_1.Op != OpConst64 {
3498 continue
3499 }
3500 d := auxIntToInt64(v_1.AuxInt)
3501 v.reset(OpConst64)
3502 v.AuxInt = int64ToAuxInt(c & d)
3503 return true
3504 }
3505 break
3506 }
3507
3508
3509 for {
3510 t := v.Type
3511 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3512 if v_0.Op != OpCom64 {
3513 continue
3514 }
3515 x := v_0.Args[0]
3516 if v_1.Op != OpCom64 {
3517 continue
3518 }
3519 y := v_1.Args[0]
3520 v.reset(OpCom64)
3521 v0 := b.NewValue0(v.Pos, OpOr64, t)
3522 v0.AddArg2(x, y)
3523 v.AddArg(v0)
3524 return true
3525 }
3526 break
3527 }
3528
3529
3530
3531 for {
3532 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3533 if v_0.Op != OpConst64 {
3534 continue
3535 }
3536 m := auxIntToInt64(v_0.AuxInt)
3537 if v_1.Op != OpRsh64Ux64 {
3538 continue
3539 }
3540 _ = v_1.Args[1]
3541 v_1_1 := v_1.Args[1]
3542 if v_1_1.Op != OpConst64 {
3543 continue
3544 }
3545 c := auxIntToInt64(v_1_1.AuxInt)
3546 if !(c >= int64(64-ntz64(m))) {
3547 continue
3548 }
3549 v.reset(OpConst64)
3550 v.AuxInt = int64ToAuxInt(0)
3551 return true
3552 }
3553 break
3554 }
3555
3556
3557
3558 for {
3559 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3560 if v_0.Op != OpConst64 {
3561 continue
3562 }
3563 m := auxIntToInt64(v_0.AuxInt)
3564 if v_1.Op != OpLsh64x64 {
3565 continue
3566 }
3567 _ = v_1.Args[1]
3568 v_1_1 := v_1.Args[1]
3569 if v_1_1.Op != OpConst64 {
3570 continue
3571 }
3572 c := auxIntToInt64(v_1_1.AuxInt)
3573 if !(c >= int64(64-nlz64(m))) {
3574 continue
3575 }
3576 v.reset(OpConst64)
3577 v.AuxInt = int64ToAuxInt(0)
3578 return true
3579 }
3580 break
3581 }
3582
3583
3584 for {
3585 x := v_0
3586 if x != v_1 {
3587 break
3588 }
3589 v.copyOf(x)
3590 return true
3591 }
3592
3593
3594 for {
3595 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3596 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
3597 continue
3598 }
3599 x := v_1
3600 v.copyOf(x)
3601 return true
3602 }
3603 break
3604 }
3605
3606
3607 for {
3608 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3609 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
3610 continue
3611 }
3612 v.reset(OpConst64)
3613 v.AuxInt = int64ToAuxInt(0)
3614 return true
3615 }
3616 break
3617 }
3618
3619
3620 for {
3621 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3622 if v_0.Op != OpCom64 {
3623 continue
3624 }
3625 x := v_0.Args[0]
3626 if x != v_1 {
3627 continue
3628 }
3629 v.reset(OpConst64)
3630 v.AuxInt = int64ToAuxInt(0)
3631 return true
3632 }
3633 break
3634 }
3635
3636
3637 for {
3638 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3639 x := v_0
3640 if v_1.Op != OpAnd64 {
3641 continue
3642 }
3643 _ = v_1.Args[1]
3644 v_1_0 := v_1.Args[0]
3645 v_1_1 := v_1.Args[1]
3646 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3647 if x != v_1_0 {
3648 continue
3649 }
3650 y := v_1_1
3651 v.reset(OpAnd64)
3652 v.AddArg2(x, y)
3653 return true
3654 }
3655 }
3656 break
3657 }
3658
3659
3660
3661 for {
3662 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3663 if v_0.Op != OpAnd64 {
3664 continue
3665 }
3666 _ = v_0.Args[1]
3667 v_0_0 := v_0.Args[0]
3668 v_0_1 := v_0.Args[1]
3669 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3670 i := v_0_0
3671 if i.Op != OpConst64 {
3672 continue
3673 }
3674 t := i.Type
3675 z := v_0_1
3676 x := v_1
3677 if !(z.Op != OpConst64 && x.Op != OpConst64) {
3678 continue
3679 }
3680 v.reset(OpAnd64)
3681 v0 := b.NewValue0(v.Pos, OpAnd64, t)
3682 v0.AddArg2(z, x)
3683 v.AddArg2(i, v0)
3684 return true
3685 }
3686 }
3687 break
3688 }
3689
3690
3691 for {
3692 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3693 if v_0.Op != OpConst64 {
3694 continue
3695 }
3696 t := v_0.Type
3697 c := auxIntToInt64(v_0.AuxInt)
3698 if v_1.Op != OpAnd64 {
3699 continue
3700 }
3701 _ = v_1.Args[1]
3702 v_1_0 := v_1.Args[0]
3703 v_1_1 := v_1.Args[1]
3704 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3705 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
3706 continue
3707 }
3708 d := auxIntToInt64(v_1_0.AuxInt)
3709 x := v_1_1
3710 v.reset(OpAnd64)
3711 v0 := b.NewValue0(v.Pos, OpConst64, t)
3712 v0.AuxInt = int64ToAuxInt(c & d)
3713 v.AddArg2(v0, x)
3714 return true
3715 }
3716 }
3717 break
3718 }
3719 return false
3720 }
3721 func rewriteValuegeneric_OpAnd8(v *Value) bool {
3722 v_1 := v.Args[1]
3723 v_0 := v.Args[0]
3724 b := v.Block
3725
3726
3727 for {
3728 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3729 if v_0.Op != OpConst8 {
3730 continue
3731 }
3732 c := auxIntToInt8(v_0.AuxInt)
3733 if v_1.Op != OpConst8 {
3734 continue
3735 }
3736 d := auxIntToInt8(v_1.AuxInt)
3737 v.reset(OpConst8)
3738 v.AuxInt = int8ToAuxInt(c & d)
3739 return true
3740 }
3741 break
3742 }
3743
3744
3745 for {
3746 t := v.Type
3747 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3748 if v_0.Op != OpCom8 {
3749 continue
3750 }
3751 x := v_0.Args[0]
3752 if v_1.Op != OpCom8 {
3753 continue
3754 }
3755 y := v_1.Args[0]
3756 v.reset(OpCom8)
3757 v0 := b.NewValue0(v.Pos, OpOr8, t)
3758 v0.AddArg2(x, y)
3759 v.AddArg(v0)
3760 return true
3761 }
3762 break
3763 }
3764
3765
3766
3767 for {
3768 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3769 if v_0.Op != OpConst8 {
3770 continue
3771 }
3772 m := auxIntToInt8(v_0.AuxInt)
3773 if v_1.Op != OpRsh8Ux64 {
3774 continue
3775 }
3776 _ = v_1.Args[1]
3777 v_1_1 := v_1.Args[1]
3778 if v_1_1.Op != OpConst64 {
3779 continue
3780 }
3781 c := auxIntToInt64(v_1_1.AuxInt)
3782 if !(c >= int64(8-ntz8(m))) {
3783 continue
3784 }
3785 v.reset(OpConst8)
3786 v.AuxInt = int8ToAuxInt(0)
3787 return true
3788 }
3789 break
3790 }
3791
3792
3793
3794 for {
3795 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3796 if v_0.Op != OpConst8 {
3797 continue
3798 }
3799 m := auxIntToInt8(v_0.AuxInt)
3800 if v_1.Op != OpLsh8x64 {
3801 continue
3802 }
3803 _ = v_1.Args[1]
3804 v_1_1 := v_1.Args[1]
3805 if v_1_1.Op != OpConst64 {
3806 continue
3807 }
3808 c := auxIntToInt64(v_1_1.AuxInt)
3809 if !(c >= int64(8-nlz8(m))) {
3810 continue
3811 }
3812 v.reset(OpConst8)
3813 v.AuxInt = int8ToAuxInt(0)
3814 return true
3815 }
3816 break
3817 }
3818
3819
3820 for {
3821 x := v_0
3822 if x != v_1 {
3823 break
3824 }
3825 v.copyOf(x)
3826 return true
3827 }
3828
3829
3830 for {
3831 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3832 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
3833 continue
3834 }
3835 x := v_1
3836 v.copyOf(x)
3837 return true
3838 }
3839 break
3840 }
3841
3842
3843 for {
3844 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3845 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
3846 continue
3847 }
3848 v.reset(OpConst8)
3849 v.AuxInt = int8ToAuxInt(0)
3850 return true
3851 }
3852 break
3853 }
3854
3855
3856 for {
3857 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3858 if v_0.Op != OpCom8 {
3859 continue
3860 }
3861 x := v_0.Args[0]
3862 if x != v_1 {
3863 continue
3864 }
3865 v.reset(OpConst8)
3866 v.AuxInt = int8ToAuxInt(0)
3867 return true
3868 }
3869 break
3870 }
3871
3872
3873 for {
3874 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3875 x := v_0
3876 if v_1.Op != OpAnd8 {
3877 continue
3878 }
3879 _ = v_1.Args[1]
3880 v_1_0 := v_1.Args[0]
3881 v_1_1 := v_1.Args[1]
3882 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3883 if x != v_1_0 {
3884 continue
3885 }
3886 y := v_1_1
3887 v.reset(OpAnd8)
3888 v.AddArg2(x, y)
3889 return true
3890 }
3891 }
3892 break
3893 }
3894
3895
3896
3897 for {
3898 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3899 if v_0.Op != OpAnd8 {
3900 continue
3901 }
3902 _ = v_0.Args[1]
3903 v_0_0 := v_0.Args[0]
3904 v_0_1 := v_0.Args[1]
3905 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3906 i := v_0_0
3907 if i.Op != OpConst8 {
3908 continue
3909 }
3910 t := i.Type
3911 z := v_0_1
3912 x := v_1
3913 if !(z.Op != OpConst8 && x.Op != OpConst8) {
3914 continue
3915 }
3916 v.reset(OpAnd8)
3917 v0 := b.NewValue0(v.Pos, OpAnd8, t)
3918 v0.AddArg2(z, x)
3919 v.AddArg2(i, v0)
3920 return true
3921 }
3922 }
3923 break
3924 }
3925
3926
3927 for {
3928 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3929 if v_0.Op != OpConst8 {
3930 continue
3931 }
3932 t := v_0.Type
3933 c := auxIntToInt8(v_0.AuxInt)
3934 if v_1.Op != OpAnd8 {
3935 continue
3936 }
3937 _ = v_1.Args[1]
3938 v_1_0 := v_1.Args[0]
3939 v_1_1 := v_1.Args[1]
3940 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3941 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
3942 continue
3943 }
3944 d := auxIntToInt8(v_1_0.AuxInt)
3945 x := v_1_1
3946 v.reset(OpAnd8)
3947 v0 := b.NewValue0(v.Pos, OpConst8, t)
3948 v0.AuxInt = int8ToAuxInt(c & d)
3949 v.AddArg2(v0, x)
3950 return true
3951 }
3952 }
3953 break
3954 }
3955 return false
3956 }
3957 func rewriteValuegeneric_OpAndB(v *Value) bool {
3958 v_1 := v.Args[1]
3959 v_0 := v.Args[0]
3960 b := v.Block
3961
3962
3963
3964 for {
3965 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3966 if v_0.Op != OpLeq64 {
3967 continue
3968 }
3969 x := v_0.Args[1]
3970 v_0_0 := v_0.Args[0]
3971 if v_0_0.Op != OpConst64 {
3972 continue
3973 }
3974 c := auxIntToInt64(v_0_0.AuxInt)
3975 if v_1.Op != OpLess64 {
3976 continue
3977 }
3978 _ = v_1.Args[1]
3979 if x != v_1.Args[0] {
3980 continue
3981 }
3982 v_1_1 := v_1.Args[1]
3983 if v_1_1.Op != OpConst64 {
3984 continue
3985 }
3986 d := auxIntToInt64(v_1_1.AuxInt)
3987 if !(d >= c) {
3988 continue
3989 }
3990 v.reset(OpLess64U)
3991 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
3992 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
3993 v1.AuxInt = int64ToAuxInt(c)
3994 v0.AddArg2(x, v1)
3995 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
3996 v2.AuxInt = int64ToAuxInt(d - c)
3997 v.AddArg2(v0, v2)
3998 return true
3999 }
4000 break
4001 }
4002
4003
4004
4005 for {
4006 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4007 if v_0.Op != OpLeq64 {
4008 continue
4009 }
4010 x := v_0.Args[1]
4011 v_0_0 := v_0.Args[0]
4012 if v_0_0.Op != OpConst64 {
4013 continue
4014 }
4015 c := auxIntToInt64(v_0_0.AuxInt)
4016 if v_1.Op != OpLeq64 {
4017 continue
4018 }
4019 _ = v_1.Args[1]
4020 if x != v_1.Args[0] {
4021 continue
4022 }
4023 v_1_1 := v_1.Args[1]
4024 if v_1_1.Op != OpConst64 {
4025 continue
4026 }
4027 d := auxIntToInt64(v_1_1.AuxInt)
4028 if !(d >= c) {
4029 continue
4030 }
4031 v.reset(OpLeq64U)
4032 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4033 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4034 v1.AuxInt = int64ToAuxInt(c)
4035 v0.AddArg2(x, v1)
4036 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4037 v2.AuxInt = int64ToAuxInt(d - c)
4038 v.AddArg2(v0, v2)
4039 return true
4040 }
4041 break
4042 }
4043
4044
4045
4046 for {
4047 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4048 if v_0.Op != OpLeq32 {
4049 continue
4050 }
4051 x := v_0.Args[1]
4052 v_0_0 := v_0.Args[0]
4053 if v_0_0.Op != OpConst32 {
4054 continue
4055 }
4056 c := auxIntToInt32(v_0_0.AuxInt)
4057 if v_1.Op != OpLess32 {
4058 continue
4059 }
4060 _ = v_1.Args[1]
4061 if x != v_1.Args[0] {
4062 continue
4063 }
4064 v_1_1 := v_1.Args[1]
4065 if v_1_1.Op != OpConst32 {
4066 continue
4067 }
4068 d := auxIntToInt32(v_1_1.AuxInt)
4069 if !(d >= c) {
4070 continue
4071 }
4072 v.reset(OpLess32U)
4073 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4074 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4075 v1.AuxInt = int32ToAuxInt(c)
4076 v0.AddArg2(x, v1)
4077 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4078 v2.AuxInt = int32ToAuxInt(d - c)
4079 v.AddArg2(v0, v2)
4080 return true
4081 }
4082 break
4083 }
4084
4085
4086
4087 for {
4088 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4089 if v_0.Op != OpLeq32 {
4090 continue
4091 }
4092 x := v_0.Args[1]
4093 v_0_0 := v_0.Args[0]
4094 if v_0_0.Op != OpConst32 {
4095 continue
4096 }
4097 c := auxIntToInt32(v_0_0.AuxInt)
4098 if v_1.Op != OpLeq32 {
4099 continue
4100 }
4101 _ = v_1.Args[1]
4102 if x != v_1.Args[0] {
4103 continue
4104 }
4105 v_1_1 := v_1.Args[1]
4106 if v_1_1.Op != OpConst32 {
4107 continue
4108 }
4109 d := auxIntToInt32(v_1_1.AuxInt)
4110 if !(d >= c) {
4111 continue
4112 }
4113 v.reset(OpLeq32U)
4114 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4115 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4116 v1.AuxInt = int32ToAuxInt(c)
4117 v0.AddArg2(x, v1)
4118 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4119 v2.AuxInt = int32ToAuxInt(d - c)
4120 v.AddArg2(v0, v2)
4121 return true
4122 }
4123 break
4124 }
4125
4126
4127
4128 for {
4129 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4130 if v_0.Op != OpLeq16 {
4131 continue
4132 }
4133 x := v_0.Args[1]
4134 v_0_0 := v_0.Args[0]
4135 if v_0_0.Op != OpConst16 {
4136 continue
4137 }
4138 c := auxIntToInt16(v_0_0.AuxInt)
4139 if v_1.Op != OpLess16 {
4140 continue
4141 }
4142 _ = v_1.Args[1]
4143 if x != v_1.Args[0] {
4144 continue
4145 }
4146 v_1_1 := v_1.Args[1]
4147 if v_1_1.Op != OpConst16 {
4148 continue
4149 }
4150 d := auxIntToInt16(v_1_1.AuxInt)
4151 if !(d >= c) {
4152 continue
4153 }
4154 v.reset(OpLess16U)
4155 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4156 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4157 v1.AuxInt = int16ToAuxInt(c)
4158 v0.AddArg2(x, v1)
4159 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4160 v2.AuxInt = int16ToAuxInt(d - c)
4161 v.AddArg2(v0, v2)
4162 return true
4163 }
4164 break
4165 }
4166
4167
4168
4169 for {
4170 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4171 if v_0.Op != OpLeq16 {
4172 continue
4173 }
4174 x := v_0.Args[1]
4175 v_0_0 := v_0.Args[0]
4176 if v_0_0.Op != OpConst16 {
4177 continue
4178 }
4179 c := auxIntToInt16(v_0_0.AuxInt)
4180 if v_1.Op != OpLeq16 {
4181 continue
4182 }
4183 _ = v_1.Args[1]
4184 if x != v_1.Args[0] {
4185 continue
4186 }
4187 v_1_1 := v_1.Args[1]
4188 if v_1_1.Op != OpConst16 {
4189 continue
4190 }
4191 d := auxIntToInt16(v_1_1.AuxInt)
4192 if !(d >= c) {
4193 continue
4194 }
4195 v.reset(OpLeq16U)
4196 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4197 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4198 v1.AuxInt = int16ToAuxInt(c)
4199 v0.AddArg2(x, v1)
4200 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4201 v2.AuxInt = int16ToAuxInt(d - c)
4202 v.AddArg2(v0, v2)
4203 return true
4204 }
4205 break
4206 }
4207
4208
4209
4210 for {
4211 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4212 if v_0.Op != OpLeq8 {
4213 continue
4214 }
4215 x := v_0.Args[1]
4216 v_0_0 := v_0.Args[0]
4217 if v_0_0.Op != OpConst8 {
4218 continue
4219 }
4220 c := auxIntToInt8(v_0_0.AuxInt)
4221 if v_1.Op != OpLess8 {
4222 continue
4223 }
4224 _ = v_1.Args[1]
4225 if x != v_1.Args[0] {
4226 continue
4227 }
4228 v_1_1 := v_1.Args[1]
4229 if v_1_1.Op != OpConst8 {
4230 continue
4231 }
4232 d := auxIntToInt8(v_1_1.AuxInt)
4233 if !(d >= c) {
4234 continue
4235 }
4236 v.reset(OpLess8U)
4237 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4238 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4239 v1.AuxInt = int8ToAuxInt(c)
4240 v0.AddArg2(x, v1)
4241 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4242 v2.AuxInt = int8ToAuxInt(d - c)
4243 v.AddArg2(v0, v2)
4244 return true
4245 }
4246 break
4247 }
4248
4249
4250
4251 for {
4252 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4253 if v_0.Op != OpLeq8 {
4254 continue
4255 }
4256 x := v_0.Args[1]
4257 v_0_0 := v_0.Args[0]
4258 if v_0_0.Op != OpConst8 {
4259 continue
4260 }
4261 c := auxIntToInt8(v_0_0.AuxInt)
4262 if v_1.Op != OpLeq8 {
4263 continue
4264 }
4265 _ = v_1.Args[1]
4266 if x != v_1.Args[0] {
4267 continue
4268 }
4269 v_1_1 := v_1.Args[1]
4270 if v_1_1.Op != OpConst8 {
4271 continue
4272 }
4273 d := auxIntToInt8(v_1_1.AuxInt)
4274 if !(d >= c) {
4275 continue
4276 }
4277 v.reset(OpLeq8U)
4278 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4279 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4280 v1.AuxInt = int8ToAuxInt(c)
4281 v0.AddArg2(x, v1)
4282 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4283 v2.AuxInt = int8ToAuxInt(d - c)
4284 v.AddArg2(v0, v2)
4285 return true
4286 }
4287 break
4288 }
4289
4290
4291
4292 for {
4293 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4294 if v_0.Op != OpLess64 {
4295 continue
4296 }
4297 x := v_0.Args[1]
4298 v_0_0 := v_0.Args[0]
4299 if v_0_0.Op != OpConst64 {
4300 continue
4301 }
4302 c := auxIntToInt64(v_0_0.AuxInt)
4303 if v_1.Op != OpLess64 {
4304 continue
4305 }
4306 _ = v_1.Args[1]
4307 if x != v_1.Args[0] {
4308 continue
4309 }
4310 v_1_1 := v_1.Args[1]
4311 if v_1_1.Op != OpConst64 {
4312 continue
4313 }
4314 d := auxIntToInt64(v_1_1.AuxInt)
4315 if !(d >= c+1 && c+1 > c) {
4316 continue
4317 }
4318 v.reset(OpLess64U)
4319 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4320 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4321 v1.AuxInt = int64ToAuxInt(c + 1)
4322 v0.AddArg2(x, v1)
4323 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4324 v2.AuxInt = int64ToAuxInt(d - c - 1)
4325 v.AddArg2(v0, v2)
4326 return true
4327 }
4328 break
4329 }
4330
4331
4332
4333 for {
4334 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4335 if v_0.Op != OpLess64 {
4336 continue
4337 }
4338 x := v_0.Args[1]
4339 v_0_0 := v_0.Args[0]
4340 if v_0_0.Op != OpConst64 {
4341 continue
4342 }
4343 c := auxIntToInt64(v_0_0.AuxInt)
4344 if v_1.Op != OpLeq64 {
4345 continue
4346 }
4347 _ = v_1.Args[1]
4348 if x != v_1.Args[0] {
4349 continue
4350 }
4351 v_1_1 := v_1.Args[1]
4352 if v_1_1.Op != OpConst64 {
4353 continue
4354 }
4355 d := auxIntToInt64(v_1_1.AuxInt)
4356 if !(d >= c+1 && c+1 > c) {
4357 continue
4358 }
4359 v.reset(OpLeq64U)
4360 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4361 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4362 v1.AuxInt = int64ToAuxInt(c + 1)
4363 v0.AddArg2(x, v1)
4364 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4365 v2.AuxInt = int64ToAuxInt(d - c - 1)
4366 v.AddArg2(v0, v2)
4367 return true
4368 }
4369 break
4370 }
4371
4372
4373
4374 for {
4375 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4376 if v_0.Op != OpLess32 {
4377 continue
4378 }
4379 x := v_0.Args[1]
4380 v_0_0 := v_0.Args[0]
4381 if v_0_0.Op != OpConst32 {
4382 continue
4383 }
4384 c := auxIntToInt32(v_0_0.AuxInt)
4385 if v_1.Op != OpLess32 {
4386 continue
4387 }
4388 _ = v_1.Args[1]
4389 if x != v_1.Args[0] {
4390 continue
4391 }
4392 v_1_1 := v_1.Args[1]
4393 if v_1_1.Op != OpConst32 {
4394 continue
4395 }
4396 d := auxIntToInt32(v_1_1.AuxInt)
4397 if !(d >= c+1 && c+1 > c) {
4398 continue
4399 }
4400 v.reset(OpLess32U)
4401 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4402 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4403 v1.AuxInt = int32ToAuxInt(c + 1)
4404 v0.AddArg2(x, v1)
4405 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4406 v2.AuxInt = int32ToAuxInt(d - c - 1)
4407 v.AddArg2(v0, v2)
4408 return true
4409 }
4410 break
4411 }
4412
4413
4414
4415 for {
4416 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4417 if v_0.Op != OpLess32 {
4418 continue
4419 }
4420 x := v_0.Args[1]
4421 v_0_0 := v_0.Args[0]
4422 if v_0_0.Op != OpConst32 {
4423 continue
4424 }
4425 c := auxIntToInt32(v_0_0.AuxInt)
4426 if v_1.Op != OpLeq32 {
4427 continue
4428 }
4429 _ = v_1.Args[1]
4430 if x != v_1.Args[0] {
4431 continue
4432 }
4433 v_1_1 := v_1.Args[1]
4434 if v_1_1.Op != OpConst32 {
4435 continue
4436 }
4437 d := auxIntToInt32(v_1_1.AuxInt)
4438 if !(d >= c+1 && c+1 > c) {
4439 continue
4440 }
4441 v.reset(OpLeq32U)
4442 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4443 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4444 v1.AuxInt = int32ToAuxInt(c + 1)
4445 v0.AddArg2(x, v1)
4446 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4447 v2.AuxInt = int32ToAuxInt(d - c - 1)
4448 v.AddArg2(v0, v2)
4449 return true
4450 }
4451 break
4452 }
4453
4454
4455
4456 for {
4457 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4458 if v_0.Op != OpLess16 {
4459 continue
4460 }
4461 x := v_0.Args[1]
4462 v_0_0 := v_0.Args[0]
4463 if v_0_0.Op != OpConst16 {
4464 continue
4465 }
4466 c := auxIntToInt16(v_0_0.AuxInt)
4467 if v_1.Op != OpLess16 {
4468 continue
4469 }
4470 _ = v_1.Args[1]
4471 if x != v_1.Args[0] {
4472 continue
4473 }
4474 v_1_1 := v_1.Args[1]
4475 if v_1_1.Op != OpConst16 {
4476 continue
4477 }
4478 d := auxIntToInt16(v_1_1.AuxInt)
4479 if !(d >= c+1 && c+1 > c) {
4480 continue
4481 }
4482 v.reset(OpLess16U)
4483 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4484 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4485 v1.AuxInt = int16ToAuxInt(c + 1)
4486 v0.AddArg2(x, v1)
4487 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4488 v2.AuxInt = int16ToAuxInt(d - c - 1)
4489 v.AddArg2(v0, v2)
4490 return true
4491 }
4492 break
4493 }
4494
4495
4496
4497 for {
4498 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4499 if v_0.Op != OpLess16 {
4500 continue
4501 }
4502 x := v_0.Args[1]
4503 v_0_0 := v_0.Args[0]
4504 if v_0_0.Op != OpConst16 {
4505 continue
4506 }
4507 c := auxIntToInt16(v_0_0.AuxInt)
4508 if v_1.Op != OpLeq16 {
4509 continue
4510 }
4511 _ = v_1.Args[1]
4512 if x != v_1.Args[0] {
4513 continue
4514 }
4515 v_1_1 := v_1.Args[1]
4516 if v_1_1.Op != OpConst16 {
4517 continue
4518 }
4519 d := auxIntToInt16(v_1_1.AuxInt)
4520 if !(d >= c+1 && c+1 > c) {
4521 continue
4522 }
4523 v.reset(OpLeq16U)
4524 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4525 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4526 v1.AuxInt = int16ToAuxInt(c + 1)
4527 v0.AddArg2(x, v1)
4528 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4529 v2.AuxInt = int16ToAuxInt(d - c - 1)
4530 v.AddArg2(v0, v2)
4531 return true
4532 }
4533 break
4534 }
4535
4536
4537
4538 for {
4539 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4540 if v_0.Op != OpLess8 {
4541 continue
4542 }
4543 x := v_0.Args[1]
4544 v_0_0 := v_0.Args[0]
4545 if v_0_0.Op != OpConst8 {
4546 continue
4547 }
4548 c := auxIntToInt8(v_0_0.AuxInt)
4549 if v_1.Op != OpLess8 {
4550 continue
4551 }
4552 _ = v_1.Args[1]
4553 if x != v_1.Args[0] {
4554 continue
4555 }
4556 v_1_1 := v_1.Args[1]
4557 if v_1_1.Op != OpConst8 {
4558 continue
4559 }
4560 d := auxIntToInt8(v_1_1.AuxInt)
4561 if !(d >= c+1 && c+1 > c) {
4562 continue
4563 }
4564 v.reset(OpLess8U)
4565 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4566 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4567 v1.AuxInt = int8ToAuxInt(c + 1)
4568 v0.AddArg2(x, v1)
4569 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4570 v2.AuxInt = int8ToAuxInt(d - c - 1)
4571 v.AddArg2(v0, v2)
4572 return true
4573 }
4574 break
4575 }
4576
4577
4578
4579 for {
4580 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4581 if v_0.Op != OpLess8 {
4582 continue
4583 }
4584 x := v_0.Args[1]
4585 v_0_0 := v_0.Args[0]
4586 if v_0_0.Op != OpConst8 {
4587 continue
4588 }
4589 c := auxIntToInt8(v_0_0.AuxInt)
4590 if v_1.Op != OpLeq8 {
4591 continue
4592 }
4593 _ = v_1.Args[1]
4594 if x != v_1.Args[0] {
4595 continue
4596 }
4597 v_1_1 := v_1.Args[1]
4598 if v_1_1.Op != OpConst8 {
4599 continue
4600 }
4601 d := auxIntToInt8(v_1_1.AuxInt)
4602 if !(d >= c+1 && c+1 > c) {
4603 continue
4604 }
4605 v.reset(OpLeq8U)
4606 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4607 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4608 v1.AuxInt = int8ToAuxInt(c + 1)
4609 v0.AddArg2(x, v1)
4610 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4611 v2.AuxInt = int8ToAuxInt(d - c - 1)
4612 v.AddArg2(v0, v2)
4613 return true
4614 }
4615 break
4616 }
4617
4618
4619
4620 for {
4621 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4622 if v_0.Op != OpLeq64U {
4623 continue
4624 }
4625 x := v_0.Args[1]
4626 v_0_0 := v_0.Args[0]
4627 if v_0_0.Op != OpConst64 {
4628 continue
4629 }
4630 c := auxIntToInt64(v_0_0.AuxInt)
4631 if v_1.Op != OpLess64U {
4632 continue
4633 }
4634 _ = v_1.Args[1]
4635 if x != v_1.Args[0] {
4636 continue
4637 }
4638 v_1_1 := v_1.Args[1]
4639 if v_1_1.Op != OpConst64 {
4640 continue
4641 }
4642 d := auxIntToInt64(v_1_1.AuxInt)
4643 if !(uint64(d) >= uint64(c)) {
4644 continue
4645 }
4646 v.reset(OpLess64U)
4647 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4648 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4649 v1.AuxInt = int64ToAuxInt(c)
4650 v0.AddArg2(x, v1)
4651 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4652 v2.AuxInt = int64ToAuxInt(d - c)
4653 v.AddArg2(v0, v2)
4654 return true
4655 }
4656 break
4657 }
4658
4659
4660
4661 for {
4662 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4663 if v_0.Op != OpLeq64U {
4664 continue
4665 }
4666 x := v_0.Args[1]
4667 v_0_0 := v_0.Args[0]
4668 if v_0_0.Op != OpConst64 {
4669 continue
4670 }
4671 c := auxIntToInt64(v_0_0.AuxInt)
4672 if v_1.Op != OpLeq64U {
4673 continue
4674 }
4675 _ = v_1.Args[1]
4676 if x != v_1.Args[0] {
4677 continue
4678 }
4679 v_1_1 := v_1.Args[1]
4680 if v_1_1.Op != OpConst64 {
4681 continue
4682 }
4683 d := auxIntToInt64(v_1_1.AuxInt)
4684 if !(uint64(d) >= uint64(c)) {
4685 continue
4686 }
4687 v.reset(OpLeq64U)
4688 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4689 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4690 v1.AuxInt = int64ToAuxInt(c)
4691 v0.AddArg2(x, v1)
4692 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4693 v2.AuxInt = int64ToAuxInt(d - c)
4694 v.AddArg2(v0, v2)
4695 return true
4696 }
4697 break
4698 }
4699
4700
4701
4702 for {
4703 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4704 if v_0.Op != OpLeq32U {
4705 continue
4706 }
4707 x := v_0.Args[1]
4708 v_0_0 := v_0.Args[0]
4709 if v_0_0.Op != OpConst32 {
4710 continue
4711 }
4712 c := auxIntToInt32(v_0_0.AuxInt)
4713 if v_1.Op != OpLess32U {
4714 continue
4715 }
4716 _ = v_1.Args[1]
4717 if x != v_1.Args[0] {
4718 continue
4719 }
4720 v_1_1 := v_1.Args[1]
4721 if v_1_1.Op != OpConst32 {
4722 continue
4723 }
4724 d := auxIntToInt32(v_1_1.AuxInt)
4725 if !(uint32(d) >= uint32(c)) {
4726 continue
4727 }
4728 v.reset(OpLess32U)
4729 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4730 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4731 v1.AuxInt = int32ToAuxInt(c)
4732 v0.AddArg2(x, v1)
4733 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4734 v2.AuxInt = int32ToAuxInt(d - c)
4735 v.AddArg2(v0, v2)
4736 return true
4737 }
4738 break
4739 }
4740
4741
4742
4743 for {
4744 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4745 if v_0.Op != OpLeq32U {
4746 continue
4747 }
4748 x := v_0.Args[1]
4749 v_0_0 := v_0.Args[0]
4750 if v_0_0.Op != OpConst32 {
4751 continue
4752 }
4753 c := auxIntToInt32(v_0_0.AuxInt)
4754 if v_1.Op != OpLeq32U {
4755 continue
4756 }
4757 _ = v_1.Args[1]
4758 if x != v_1.Args[0] {
4759 continue
4760 }
4761 v_1_1 := v_1.Args[1]
4762 if v_1_1.Op != OpConst32 {
4763 continue
4764 }
4765 d := auxIntToInt32(v_1_1.AuxInt)
4766 if !(uint32(d) >= uint32(c)) {
4767 continue
4768 }
4769 v.reset(OpLeq32U)
4770 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4771 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4772 v1.AuxInt = int32ToAuxInt(c)
4773 v0.AddArg2(x, v1)
4774 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4775 v2.AuxInt = int32ToAuxInt(d - c)
4776 v.AddArg2(v0, v2)
4777 return true
4778 }
4779 break
4780 }
4781
4782
4783
4784 for {
4785 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4786 if v_0.Op != OpLeq16U {
4787 continue
4788 }
4789 x := v_0.Args[1]
4790 v_0_0 := v_0.Args[0]
4791 if v_0_0.Op != OpConst16 {
4792 continue
4793 }
4794 c := auxIntToInt16(v_0_0.AuxInt)
4795 if v_1.Op != OpLess16U {
4796 continue
4797 }
4798 _ = v_1.Args[1]
4799 if x != v_1.Args[0] {
4800 continue
4801 }
4802 v_1_1 := v_1.Args[1]
4803 if v_1_1.Op != OpConst16 {
4804 continue
4805 }
4806 d := auxIntToInt16(v_1_1.AuxInt)
4807 if !(uint16(d) >= uint16(c)) {
4808 continue
4809 }
4810 v.reset(OpLess16U)
4811 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4812 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4813 v1.AuxInt = int16ToAuxInt(c)
4814 v0.AddArg2(x, v1)
4815 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4816 v2.AuxInt = int16ToAuxInt(d - c)
4817 v.AddArg2(v0, v2)
4818 return true
4819 }
4820 break
4821 }
4822
4823
4824
4825 for {
4826 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4827 if v_0.Op != OpLeq16U {
4828 continue
4829 }
4830 x := v_0.Args[1]
4831 v_0_0 := v_0.Args[0]
4832 if v_0_0.Op != OpConst16 {
4833 continue
4834 }
4835 c := auxIntToInt16(v_0_0.AuxInt)
4836 if v_1.Op != OpLeq16U {
4837 continue
4838 }
4839 _ = v_1.Args[1]
4840 if x != v_1.Args[0] {
4841 continue
4842 }
4843 v_1_1 := v_1.Args[1]
4844 if v_1_1.Op != OpConst16 {
4845 continue
4846 }
4847 d := auxIntToInt16(v_1_1.AuxInt)
4848 if !(uint16(d) >= uint16(c)) {
4849 continue
4850 }
4851 v.reset(OpLeq16U)
4852 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4853 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4854 v1.AuxInt = int16ToAuxInt(c)
4855 v0.AddArg2(x, v1)
4856 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4857 v2.AuxInt = int16ToAuxInt(d - c)
4858 v.AddArg2(v0, v2)
4859 return true
4860 }
4861 break
4862 }
4863
4864
4865
4866 for {
4867 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4868 if v_0.Op != OpLeq8U {
4869 continue
4870 }
4871 x := v_0.Args[1]
4872 v_0_0 := v_0.Args[0]
4873 if v_0_0.Op != OpConst8 {
4874 continue
4875 }
4876 c := auxIntToInt8(v_0_0.AuxInt)
4877 if v_1.Op != OpLess8U {
4878 continue
4879 }
4880 _ = v_1.Args[1]
4881 if x != v_1.Args[0] {
4882 continue
4883 }
4884 v_1_1 := v_1.Args[1]
4885 if v_1_1.Op != OpConst8 {
4886 continue
4887 }
4888 d := auxIntToInt8(v_1_1.AuxInt)
4889 if !(uint8(d) >= uint8(c)) {
4890 continue
4891 }
4892 v.reset(OpLess8U)
4893 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4894 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4895 v1.AuxInt = int8ToAuxInt(c)
4896 v0.AddArg2(x, v1)
4897 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4898 v2.AuxInt = int8ToAuxInt(d - c)
4899 v.AddArg2(v0, v2)
4900 return true
4901 }
4902 break
4903 }
4904
4905
4906
4907 for {
4908 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4909 if v_0.Op != OpLeq8U {
4910 continue
4911 }
4912 x := v_0.Args[1]
4913 v_0_0 := v_0.Args[0]
4914 if v_0_0.Op != OpConst8 {
4915 continue
4916 }
4917 c := auxIntToInt8(v_0_0.AuxInt)
4918 if v_1.Op != OpLeq8U {
4919 continue
4920 }
4921 _ = v_1.Args[1]
4922 if x != v_1.Args[0] {
4923 continue
4924 }
4925 v_1_1 := v_1.Args[1]
4926 if v_1_1.Op != OpConst8 {
4927 continue
4928 }
4929 d := auxIntToInt8(v_1_1.AuxInt)
4930 if !(uint8(d) >= uint8(c)) {
4931 continue
4932 }
4933 v.reset(OpLeq8U)
4934 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4935 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4936 v1.AuxInt = int8ToAuxInt(c)
4937 v0.AddArg2(x, v1)
4938 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4939 v2.AuxInt = int8ToAuxInt(d - c)
4940 v.AddArg2(v0, v2)
4941 return true
4942 }
4943 break
4944 }
4945
4946
4947
4948 for {
4949 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4950 if v_0.Op != OpLess64U {
4951 continue
4952 }
4953 x := v_0.Args[1]
4954 v_0_0 := v_0.Args[0]
4955 if v_0_0.Op != OpConst64 {
4956 continue
4957 }
4958 c := auxIntToInt64(v_0_0.AuxInt)
4959 if v_1.Op != OpLess64U {
4960 continue
4961 }
4962 _ = v_1.Args[1]
4963 if x != v_1.Args[0] {
4964 continue
4965 }
4966 v_1_1 := v_1.Args[1]
4967 if v_1_1.Op != OpConst64 {
4968 continue
4969 }
4970 d := auxIntToInt64(v_1_1.AuxInt)
4971 if !(uint64(d) >= uint64(c+1) && uint64(c+1) > uint64(c)) {
4972 continue
4973 }
4974 v.reset(OpLess64U)
4975 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4976 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4977 v1.AuxInt = int64ToAuxInt(c + 1)
4978 v0.AddArg2(x, v1)
4979 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4980 v2.AuxInt = int64ToAuxInt(d - c - 1)
4981 v.AddArg2(v0, v2)
4982 return true
4983 }
4984 break
4985 }
4986
4987
4988
4989 for {
4990 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4991 if v_0.Op != OpLess64U {
4992 continue
4993 }
4994 x := v_0.Args[1]
4995 v_0_0 := v_0.Args[0]
4996 if v_0_0.Op != OpConst64 {
4997 continue
4998 }
4999 c := auxIntToInt64(v_0_0.AuxInt)
5000 if v_1.Op != OpLeq64U {
5001 continue
5002 }
5003 _ = v_1.Args[1]
5004 if x != v_1.Args[0] {
5005 continue
5006 }
5007 v_1_1 := v_1.Args[1]
5008 if v_1_1.Op != OpConst64 {
5009 continue
5010 }
5011 d := auxIntToInt64(v_1_1.AuxInt)
5012 if !(uint64(d) >= uint64(c+1) && uint64(c+1) > uint64(c)) {
5013 continue
5014 }
5015 v.reset(OpLeq64U)
5016 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
5017 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
5018 v1.AuxInt = int64ToAuxInt(c + 1)
5019 v0.AddArg2(x, v1)
5020 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
5021 v2.AuxInt = int64ToAuxInt(d - c - 1)
5022 v.AddArg2(v0, v2)
5023 return true
5024 }
5025 break
5026 }
5027
5028
5029
5030 for {
5031 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5032 if v_0.Op != OpLess32U {
5033 continue
5034 }
5035 x := v_0.Args[1]
5036 v_0_0 := v_0.Args[0]
5037 if v_0_0.Op != OpConst32 {
5038 continue
5039 }
5040 c := auxIntToInt32(v_0_0.AuxInt)
5041 if v_1.Op != OpLess32U {
5042 continue
5043 }
5044 _ = v_1.Args[1]
5045 if x != v_1.Args[0] {
5046 continue
5047 }
5048 v_1_1 := v_1.Args[1]
5049 if v_1_1.Op != OpConst32 {
5050 continue
5051 }
5052 d := auxIntToInt32(v_1_1.AuxInt)
5053 if !(uint32(d) >= uint32(c+1) && uint32(c+1) > uint32(c)) {
5054 continue
5055 }
5056 v.reset(OpLess32U)
5057 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
5058 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
5059 v1.AuxInt = int32ToAuxInt(c + 1)
5060 v0.AddArg2(x, v1)
5061 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
5062 v2.AuxInt = int32ToAuxInt(d - c - 1)
5063 v.AddArg2(v0, v2)
5064 return true
5065 }
5066 break
5067 }
5068
5069
5070
5071 for {
5072 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5073 if v_0.Op != OpLess32U {
5074 continue
5075 }
5076 x := v_0.Args[1]
5077 v_0_0 := v_0.Args[0]
5078 if v_0_0.Op != OpConst32 {
5079 continue
5080 }
5081 c := auxIntToInt32(v_0_0.AuxInt)
5082 if v_1.Op != OpLeq32U {
5083 continue
5084 }
5085 _ = v_1.Args[1]
5086 if x != v_1.Args[0] {
5087 continue
5088 }
5089 v_1_1 := v_1.Args[1]
5090 if v_1_1.Op != OpConst32 {
5091 continue
5092 }
5093 d := auxIntToInt32(v_1_1.AuxInt)
5094 if !(uint32(d) >= uint32(c+1) && uint32(c+1) > uint32(c)) {
5095 continue
5096 }
5097 v.reset(OpLeq32U)
5098 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
5099 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
5100 v1.AuxInt = int32ToAuxInt(c + 1)
5101 v0.AddArg2(x, v1)
5102 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
5103 v2.AuxInt = int32ToAuxInt(d - c - 1)
5104 v.AddArg2(v0, v2)
5105 return true
5106 }
5107 break
5108 }
5109
5110
5111
5112 for {
5113 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5114 if v_0.Op != OpLess16U {
5115 continue
5116 }
5117 x := v_0.Args[1]
5118 v_0_0 := v_0.Args[0]
5119 if v_0_0.Op != OpConst16 {
5120 continue
5121 }
5122 c := auxIntToInt16(v_0_0.AuxInt)
5123 if v_1.Op != OpLess16U {
5124 continue
5125 }
5126 _ = v_1.Args[1]
5127 if x != v_1.Args[0] {
5128 continue
5129 }
5130 v_1_1 := v_1.Args[1]
5131 if v_1_1.Op != OpConst16 {
5132 continue
5133 }
5134 d := auxIntToInt16(v_1_1.AuxInt)
5135 if !(uint16(d) >= uint16(c+1) && uint16(c+1) > uint16(c)) {
5136 continue
5137 }
5138 v.reset(OpLess16U)
5139 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
5140 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5141 v1.AuxInt = int16ToAuxInt(c + 1)
5142 v0.AddArg2(x, v1)
5143 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
5144 v2.AuxInt = int16ToAuxInt(d - c - 1)
5145 v.AddArg2(v0, v2)
5146 return true
5147 }
5148 break
5149 }
5150
5151
5152
5153 for {
5154 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5155 if v_0.Op != OpLess16U {
5156 continue
5157 }
5158 x := v_0.Args[1]
5159 v_0_0 := v_0.Args[0]
5160 if v_0_0.Op != OpConst16 {
5161 continue
5162 }
5163 c := auxIntToInt16(v_0_0.AuxInt)
5164 if v_1.Op != OpLeq16U {
5165 continue
5166 }
5167 _ = v_1.Args[1]
5168 if x != v_1.Args[0] {
5169 continue
5170 }
5171 v_1_1 := v_1.Args[1]
5172 if v_1_1.Op != OpConst16 {
5173 continue
5174 }
5175 d := auxIntToInt16(v_1_1.AuxInt)
5176 if !(uint16(d) >= uint16(c+1) && uint16(c+1) > uint16(c)) {
5177 continue
5178 }
5179 v.reset(OpLeq16U)
5180 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
5181 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5182 v1.AuxInt = int16ToAuxInt(c + 1)
5183 v0.AddArg2(x, v1)
5184 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
5185 v2.AuxInt = int16ToAuxInt(d - c - 1)
5186 v.AddArg2(v0, v2)
5187 return true
5188 }
5189 break
5190 }
5191
5192
5193
5194 for {
5195 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5196 if v_0.Op != OpLess8U {
5197 continue
5198 }
5199 x := v_0.Args[1]
5200 v_0_0 := v_0.Args[0]
5201 if v_0_0.Op != OpConst8 {
5202 continue
5203 }
5204 c := auxIntToInt8(v_0_0.AuxInt)
5205 if v_1.Op != OpLess8U {
5206 continue
5207 }
5208 _ = v_1.Args[1]
5209 if x != v_1.Args[0] {
5210 continue
5211 }
5212 v_1_1 := v_1.Args[1]
5213 if v_1_1.Op != OpConst8 {
5214 continue
5215 }
5216 d := auxIntToInt8(v_1_1.AuxInt)
5217 if !(uint8(d) >= uint8(c+1) && uint8(c+1) > uint8(c)) {
5218 continue
5219 }
5220 v.reset(OpLess8U)
5221 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
5222 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5223 v1.AuxInt = int8ToAuxInt(c + 1)
5224 v0.AddArg2(x, v1)
5225 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5226 v2.AuxInt = int8ToAuxInt(d - c - 1)
5227 v.AddArg2(v0, v2)
5228 return true
5229 }
5230 break
5231 }
5232
5233
5234
5235 for {
5236 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5237 if v_0.Op != OpLess8U {
5238 continue
5239 }
5240 x := v_0.Args[1]
5241 v_0_0 := v_0.Args[0]
5242 if v_0_0.Op != OpConst8 {
5243 continue
5244 }
5245 c := auxIntToInt8(v_0_0.AuxInt)
5246 if v_1.Op != OpLeq8U {
5247 continue
5248 }
5249 _ = v_1.Args[1]
5250 if x != v_1.Args[0] {
5251 continue
5252 }
5253 v_1_1 := v_1.Args[1]
5254 if v_1_1.Op != OpConst8 {
5255 continue
5256 }
5257 d := auxIntToInt8(v_1_1.AuxInt)
5258 if !(uint8(d) >= uint8(c+1) && uint8(c+1) > uint8(c)) {
5259 continue
5260 }
5261 v.reset(OpLeq8U)
5262 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
5263 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5264 v1.AuxInt = int8ToAuxInt(c + 1)
5265 v0.AddArg2(x, v1)
5266 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5267 v2.AuxInt = int8ToAuxInt(d - c - 1)
5268 v.AddArg2(v0, v2)
5269 return true
5270 }
5271 break
5272 }
5273 return false
5274 }
5275 func rewriteValuegeneric_OpArraySelect(v *Value) bool {
5276 v_0 := v.Args[0]
5277
5278
5279 for {
5280 if v_0.Op != OpArrayMake1 {
5281 break
5282 }
5283 x := v_0.Args[0]
5284 v.copyOf(x)
5285 return true
5286 }
5287
5288
5289 for {
5290 if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpIData {
5291 break
5292 }
5293 x := v_0.Args[0]
5294 v.reset(OpIData)
5295 v.AddArg(x)
5296 return true
5297 }
5298 return false
5299 }
5300 func rewriteValuegeneric_OpBitLen16(v *Value) bool {
5301 v_0 := v.Args[0]
5302 b := v.Block
5303 config := b.Func.Config
5304
5305
5306
5307 for {
5308 if v_0.Op != OpConst16 {
5309 break
5310 }
5311 c := auxIntToInt16(v_0.AuxInt)
5312 if !(config.PtrSize == 8) {
5313 break
5314 }
5315 v.reset(OpConst64)
5316 v.AuxInt = int64ToAuxInt(int64(bits.Len16(uint16(c))))
5317 return true
5318 }
5319
5320
5321
5322 for {
5323 if v_0.Op != OpConst16 {
5324 break
5325 }
5326 c := auxIntToInt16(v_0.AuxInt)
5327 if !(config.PtrSize == 4) {
5328 break
5329 }
5330 v.reset(OpConst32)
5331 v.AuxInt = int32ToAuxInt(int32(bits.Len16(uint16(c))))
5332 return true
5333 }
5334 return false
5335 }
5336 func rewriteValuegeneric_OpBitLen32(v *Value) bool {
5337 v_0 := v.Args[0]
5338 b := v.Block
5339 config := b.Func.Config
5340
5341
5342
5343 for {
5344 if v_0.Op != OpConst32 {
5345 break
5346 }
5347 c := auxIntToInt32(v_0.AuxInt)
5348 if !(config.PtrSize == 8) {
5349 break
5350 }
5351 v.reset(OpConst64)
5352 v.AuxInt = int64ToAuxInt(int64(bits.Len32(uint32(c))))
5353 return true
5354 }
5355
5356
5357
5358 for {
5359 if v_0.Op != OpConst32 {
5360 break
5361 }
5362 c := auxIntToInt32(v_0.AuxInt)
5363 if !(config.PtrSize == 4) {
5364 break
5365 }
5366 v.reset(OpConst32)
5367 v.AuxInt = int32ToAuxInt(int32(bits.Len32(uint32(c))))
5368 return true
5369 }
5370 return false
5371 }
5372 func rewriteValuegeneric_OpBitLen64(v *Value) bool {
5373 v_0 := v.Args[0]
5374 b := v.Block
5375 config := b.Func.Config
5376
5377
5378
5379 for {
5380 if v_0.Op != OpConst64 {
5381 break
5382 }
5383 c := auxIntToInt64(v_0.AuxInt)
5384 if !(config.PtrSize == 8) {
5385 break
5386 }
5387 v.reset(OpConst64)
5388 v.AuxInt = int64ToAuxInt(int64(bits.Len64(uint64(c))))
5389 return true
5390 }
5391
5392
5393
5394 for {
5395 if v_0.Op != OpConst64 {
5396 break
5397 }
5398 c := auxIntToInt64(v_0.AuxInt)
5399 if !(config.PtrSize == 4) {
5400 break
5401 }
5402 v.reset(OpConst32)
5403 v.AuxInt = int32ToAuxInt(int32(bits.Len64(uint64(c))))
5404 return true
5405 }
5406 return false
5407 }
5408 func rewriteValuegeneric_OpBitLen8(v *Value) bool {
5409 v_0 := v.Args[0]
5410 b := v.Block
5411 config := b.Func.Config
5412
5413
5414
5415 for {
5416 if v_0.Op != OpConst8 {
5417 break
5418 }
5419 c := auxIntToInt8(v_0.AuxInt)
5420 if !(config.PtrSize == 8) {
5421 break
5422 }
5423 v.reset(OpConst64)
5424 v.AuxInt = int64ToAuxInt(int64(bits.Len8(uint8(c))))
5425 return true
5426 }
5427
5428
5429
5430 for {
5431 if v_0.Op != OpConst8 {
5432 break
5433 }
5434 c := auxIntToInt8(v_0.AuxInt)
5435 if !(config.PtrSize == 4) {
5436 break
5437 }
5438 v.reset(OpConst32)
5439 v.AuxInt = int32ToAuxInt(int32(bits.Len8(uint8(c))))
5440 return true
5441 }
5442 return false
5443 }
5444 func rewriteValuegeneric_OpCeil(v *Value) bool {
5445 v_0 := v.Args[0]
5446
5447
5448 for {
5449 if v_0.Op != OpConst64F {
5450 break
5451 }
5452 c := auxIntToFloat64(v_0.AuxInt)
5453 v.reset(OpConst64F)
5454 v.AuxInt = float64ToAuxInt(math.Ceil(c))
5455 return true
5456 }
5457 return false
5458 }
5459 func rewriteValuegeneric_OpCom16(v *Value) bool {
5460 v_0 := v.Args[0]
5461
5462
5463 for {
5464 if v_0.Op != OpCom16 {
5465 break
5466 }
5467 x := v_0.Args[0]
5468 v.copyOf(x)
5469 return true
5470 }
5471
5472
5473 for {
5474 if v_0.Op != OpConst16 {
5475 break
5476 }
5477 c := auxIntToInt16(v_0.AuxInt)
5478 v.reset(OpConst16)
5479 v.AuxInt = int16ToAuxInt(^c)
5480 return true
5481 }
5482
5483
5484 for {
5485 if v_0.Op != OpAdd16 {
5486 break
5487 }
5488 _ = v_0.Args[1]
5489 v_0_0 := v_0.Args[0]
5490 v_0_1 := v_0.Args[1]
5491 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5492 if v_0_0.Op != OpConst16 || auxIntToInt16(v_0_0.AuxInt) != -1 {
5493 continue
5494 }
5495 x := v_0_1
5496 v.reset(OpNeg16)
5497 v.AddArg(x)
5498 return true
5499 }
5500 break
5501 }
5502 return false
5503 }
5504 func rewriteValuegeneric_OpCom32(v *Value) bool {
5505 v_0 := v.Args[0]
5506
5507
5508 for {
5509 if v_0.Op != OpCom32 {
5510 break
5511 }
5512 x := v_0.Args[0]
5513 v.copyOf(x)
5514 return true
5515 }
5516
5517
5518 for {
5519 if v_0.Op != OpConst32 {
5520 break
5521 }
5522 c := auxIntToInt32(v_0.AuxInt)
5523 v.reset(OpConst32)
5524 v.AuxInt = int32ToAuxInt(^c)
5525 return true
5526 }
5527
5528
5529 for {
5530 if v_0.Op != OpAdd32 {
5531 break
5532 }
5533 _ = v_0.Args[1]
5534 v_0_0 := v_0.Args[0]
5535 v_0_1 := v_0.Args[1]
5536 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5537 if v_0_0.Op != OpConst32 || auxIntToInt32(v_0_0.AuxInt) != -1 {
5538 continue
5539 }
5540 x := v_0_1
5541 v.reset(OpNeg32)
5542 v.AddArg(x)
5543 return true
5544 }
5545 break
5546 }
5547 return false
5548 }
5549 func rewriteValuegeneric_OpCom64(v *Value) bool {
5550 v_0 := v.Args[0]
5551
5552
5553 for {
5554 if v_0.Op != OpCom64 {
5555 break
5556 }
5557 x := v_0.Args[0]
5558 v.copyOf(x)
5559 return true
5560 }
5561
5562
5563 for {
5564 if v_0.Op != OpConst64 {
5565 break
5566 }
5567 c := auxIntToInt64(v_0.AuxInt)
5568 v.reset(OpConst64)
5569 v.AuxInt = int64ToAuxInt(^c)
5570 return true
5571 }
5572
5573
5574 for {
5575 if v_0.Op != OpAdd64 {
5576 break
5577 }
5578 _ = v_0.Args[1]
5579 v_0_0 := v_0.Args[0]
5580 v_0_1 := v_0.Args[1]
5581 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5582 if v_0_0.Op != OpConst64 || auxIntToInt64(v_0_0.AuxInt) != -1 {
5583 continue
5584 }
5585 x := v_0_1
5586 v.reset(OpNeg64)
5587 v.AddArg(x)
5588 return true
5589 }
5590 break
5591 }
5592 return false
5593 }
5594 func rewriteValuegeneric_OpCom8(v *Value) bool {
5595 v_0 := v.Args[0]
5596
5597
5598 for {
5599 if v_0.Op != OpCom8 {
5600 break
5601 }
5602 x := v_0.Args[0]
5603 v.copyOf(x)
5604 return true
5605 }
5606
5607
5608 for {
5609 if v_0.Op != OpConst8 {
5610 break
5611 }
5612 c := auxIntToInt8(v_0.AuxInt)
5613 v.reset(OpConst8)
5614 v.AuxInt = int8ToAuxInt(^c)
5615 return true
5616 }
5617
5618
5619 for {
5620 if v_0.Op != OpAdd8 {
5621 break
5622 }
5623 _ = v_0.Args[1]
5624 v_0_0 := v_0.Args[0]
5625 v_0_1 := v_0.Args[1]
5626 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5627 if v_0_0.Op != OpConst8 || auxIntToInt8(v_0_0.AuxInt) != -1 {
5628 continue
5629 }
5630 x := v_0_1
5631 v.reset(OpNeg8)
5632 v.AddArg(x)
5633 return true
5634 }
5635 break
5636 }
5637 return false
5638 }
5639 func rewriteValuegeneric_OpConstInterface(v *Value) bool {
5640 b := v.Block
5641 typ := &b.Func.Config.Types
5642
5643
5644 for {
5645 v.reset(OpIMake)
5646 v0 := b.NewValue0(v.Pos, OpConstNil, typ.Uintptr)
5647 v1 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
5648 v.AddArg2(v0, v1)
5649 return true
5650 }
5651 }
5652 func rewriteValuegeneric_OpConstSlice(v *Value) bool {
5653 b := v.Block
5654 config := b.Func.Config
5655 typ := &b.Func.Config.Types
5656
5657
5658
5659 for {
5660 if !(config.PtrSize == 4) {
5661 break
5662 }
5663 v.reset(OpSliceMake)
5664 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo())
5665 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
5666 v1.AuxInt = int32ToAuxInt(0)
5667 v.AddArg3(v0, v1, v1)
5668 return true
5669 }
5670
5671
5672
5673 for {
5674 if !(config.PtrSize == 8) {
5675 break
5676 }
5677 v.reset(OpSliceMake)
5678 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo())
5679 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
5680 v1.AuxInt = int64ToAuxInt(0)
5681 v.AddArg3(v0, v1, v1)
5682 return true
5683 }
5684 return false
5685 }
5686 func rewriteValuegeneric_OpConstString(v *Value) bool {
5687 b := v.Block
5688 config := b.Func.Config
5689 fe := b.Func.fe
5690 typ := &b.Func.Config.Types
5691
5692
5693
5694 for {
5695 str := auxToString(v.Aux)
5696 if !(config.PtrSize == 4 && str == "") {
5697 break
5698 }
5699 v.reset(OpStringMake)
5700 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
5701 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
5702 v1.AuxInt = int32ToAuxInt(0)
5703 v.AddArg2(v0, v1)
5704 return true
5705 }
5706
5707
5708
5709 for {
5710 str := auxToString(v.Aux)
5711 if !(config.PtrSize == 8 && str == "") {
5712 break
5713 }
5714 v.reset(OpStringMake)
5715 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
5716 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
5717 v1.AuxInt = int64ToAuxInt(0)
5718 v.AddArg2(v0, v1)
5719 return true
5720 }
5721
5722
5723
5724 for {
5725 str := auxToString(v.Aux)
5726 if !(config.PtrSize == 4 && str != "") {
5727 break
5728 }
5729 v.reset(OpStringMake)
5730 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr)
5731 v0.Aux = symToAux(fe.StringData(str))
5732 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
5733 v0.AddArg(v1)
5734 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int)
5735 v2.AuxInt = int32ToAuxInt(int32(len(str)))
5736 v.AddArg2(v0, v2)
5737 return true
5738 }
5739
5740
5741
5742 for {
5743 str := auxToString(v.Aux)
5744 if !(config.PtrSize == 8 && str != "") {
5745 break
5746 }
5747 v.reset(OpStringMake)
5748 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr)
5749 v0.Aux = symToAux(fe.StringData(str))
5750 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
5751 v0.AddArg(v1)
5752 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int)
5753 v2.AuxInt = int64ToAuxInt(int64(len(str)))
5754 v.AddArg2(v0, v2)
5755 return true
5756 }
5757 return false
5758 }
5759 func rewriteValuegeneric_OpConvert(v *Value) bool {
5760 v_1 := v.Args[1]
5761 v_0 := v.Args[0]
5762 b := v.Block
5763
5764
5765 for {
5766 if v_0.Op != OpAdd64 {
5767 break
5768 }
5769 _ = v_0.Args[1]
5770 v_0_0 := v_0.Args[0]
5771 v_0_1 := v_0.Args[1]
5772 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5773 if v_0_0.Op != OpConvert {
5774 continue
5775 }
5776 mem := v_0_0.Args[1]
5777 ptr := v_0_0.Args[0]
5778 off := v_0_1
5779 if mem != v_1 {
5780 continue
5781 }
5782 v.reset(OpAddPtr)
5783 v.AddArg2(ptr, off)
5784 return true
5785 }
5786 break
5787 }
5788
5789
5790 for {
5791 if v_0.Op != OpAdd32 {
5792 break
5793 }
5794 _ = v_0.Args[1]
5795 v_0_0 := v_0.Args[0]
5796 v_0_1 := v_0.Args[1]
5797 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5798 if v_0_0.Op != OpConvert {
5799 continue
5800 }
5801 mem := v_0_0.Args[1]
5802 ptr := v_0_0.Args[0]
5803 off := v_0_1
5804 if mem != v_1 {
5805 continue
5806 }
5807 v.reset(OpAddPtr)
5808 v.AddArg2(ptr, off)
5809 return true
5810 }
5811 break
5812 }
5813
5814
5815 for {
5816 if v_0.Op != OpConvert {
5817 break
5818 }
5819 mem := v_0.Args[1]
5820 ptr := v_0.Args[0]
5821 if mem != v_1 {
5822 break
5823 }
5824 v.copyOf(ptr)
5825 return true
5826 }
5827
5828
5829 for {
5830 a := v_0
5831 if a.Op != OpAdd64 {
5832 break
5833 }
5834 _ = a.Args[1]
5835 a_0 := a.Args[0]
5836 a_1 := a.Args[1]
5837 for _i0 := 0; _i0 <= 1; _i0, a_0, a_1 = _i0+1, a_1, a_0 {
5838 if a_0.Op != OpAdd64 {
5839 continue
5840 }
5841 _ = a_0.Args[1]
5842 a_0_0 := a_0.Args[0]
5843 a_0_1 := a_0.Args[1]
5844 for _i1 := 0; _i1 <= 1; _i1, a_0_0, a_0_1 = _i1+1, a_0_1, a_0_0 {
5845 if a_0_0.Op != OpConvert {
5846 continue
5847 }
5848 mem := a_0_0.Args[1]
5849 ptr := a_0_0.Args[0]
5850 off1 := a_0_1
5851 off2 := a_1
5852 if mem != v_1 {
5853 continue
5854 }
5855 v.reset(OpAddPtr)
5856 v0 := b.NewValue0(v.Pos, OpAdd64, a.Type)
5857 v0.AddArg2(off1, off2)
5858 v.AddArg2(ptr, v0)
5859 return true
5860 }
5861 }
5862 break
5863 }
5864
5865
5866 for {
5867 a := v_0
5868 if a.Op != OpAdd32 {
5869 break
5870 }
5871 _ = a.Args[1]
5872 a_0 := a.Args[0]
5873 a_1 := a.Args[1]
5874 for _i0 := 0; _i0 <= 1; _i0, a_0, a_1 = _i0+1, a_1, a_0 {
5875 if a_0.Op != OpAdd32 {
5876 continue
5877 }
5878 _ = a_0.Args[1]
5879 a_0_0 := a_0.Args[0]
5880 a_0_1 := a_0.Args[1]
5881 for _i1 := 0; _i1 <= 1; _i1, a_0_0, a_0_1 = _i1+1, a_0_1, a_0_0 {
5882 if a_0_0.Op != OpConvert {
5883 continue
5884 }
5885 mem := a_0_0.Args[1]
5886 ptr := a_0_0.Args[0]
5887 off1 := a_0_1
5888 off2 := a_1
5889 if mem != v_1 {
5890 continue
5891 }
5892 v.reset(OpAddPtr)
5893 v0 := b.NewValue0(v.Pos, OpAdd32, a.Type)
5894 v0.AddArg2(off1, off2)
5895 v.AddArg2(ptr, v0)
5896 return true
5897 }
5898 }
5899 break
5900 }
5901 return false
5902 }
5903 func rewriteValuegeneric_OpCtz16(v *Value) bool {
5904 v_0 := v.Args[0]
5905 b := v.Block
5906 config := b.Func.Config
5907
5908
5909
5910 for {
5911 if v_0.Op != OpConst16 {
5912 break
5913 }
5914 c := auxIntToInt16(v_0.AuxInt)
5915 if !(config.PtrSize == 4) {
5916 break
5917 }
5918 v.reset(OpConst32)
5919 v.AuxInt = int32ToAuxInt(int32(ntz16(c)))
5920 return true
5921 }
5922
5923
5924
5925 for {
5926 if v_0.Op != OpConst16 {
5927 break
5928 }
5929 c := auxIntToInt16(v_0.AuxInt)
5930 if !(config.PtrSize == 8) {
5931 break
5932 }
5933 v.reset(OpConst64)
5934 v.AuxInt = int64ToAuxInt(int64(ntz16(c)))
5935 return true
5936 }
5937 return false
5938 }
5939 func rewriteValuegeneric_OpCtz32(v *Value) bool {
5940 v_0 := v.Args[0]
5941 b := v.Block
5942 config := b.Func.Config
5943
5944
5945
5946 for {
5947 if v_0.Op != OpConst32 {
5948 break
5949 }
5950 c := auxIntToInt32(v_0.AuxInt)
5951 if !(config.PtrSize == 4) {
5952 break
5953 }
5954 v.reset(OpConst32)
5955 v.AuxInt = int32ToAuxInt(int32(ntz32(c)))
5956 return true
5957 }
5958
5959
5960
5961 for {
5962 if v_0.Op != OpConst32 {
5963 break
5964 }
5965 c := auxIntToInt32(v_0.AuxInt)
5966 if !(config.PtrSize == 8) {
5967 break
5968 }
5969 v.reset(OpConst64)
5970 v.AuxInt = int64ToAuxInt(int64(ntz32(c)))
5971 return true
5972 }
5973 return false
5974 }
5975 func rewriteValuegeneric_OpCtz64(v *Value) bool {
5976 v_0 := v.Args[0]
5977 b := v.Block
5978 config := b.Func.Config
5979
5980
5981
5982 for {
5983 if v_0.Op != OpConst64 {
5984 break
5985 }
5986 c := auxIntToInt64(v_0.AuxInt)
5987 if !(config.PtrSize == 4) {
5988 break
5989 }
5990 v.reset(OpConst32)
5991 v.AuxInt = int32ToAuxInt(int32(ntz64(c)))
5992 return true
5993 }
5994
5995
5996
5997 for {
5998 if v_0.Op != OpConst64 {
5999 break
6000 }
6001 c := auxIntToInt64(v_0.AuxInt)
6002 if !(config.PtrSize == 8) {
6003 break
6004 }
6005 v.reset(OpConst64)
6006 v.AuxInt = int64ToAuxInt(int64(ntz64(c)))
6007 return true
6008 }
6009 return false
6010 }
6011 func rewriteValuegeneric_OpCtz8(v *Value) bool {
6012 v_0 := v.Args[0]
6013 b := v.Block
6014 config := b.Func.Config
6015
6016
6017
6018 for {
6019 if v_0.Op != OpConst8 {
6020 break
6021 }
6022 c := auxIntToInt8(v_0.AuxInt)
6023 if !(config.PtrSize == 4) {
6024 break
6025 }
6026 v.reset(OpConst32)
6027 v.AuxInt = int32ToAuxInt(int32(ntz8(c)))
6028 return true
6029 }
6030
6031
6032
6033 for {
6034 if v_0.Op != OpConst8 {
6035 break
6036 }
6037 c := auxIntToInt8(v_0.AuxInt)
6038 if !(config.PtrSize == 8) {
6039 break
6040 }
6041 v.reset(OpConst64)
6042 v.AuxInt = int64ToAuxInt(int64(ntz8(c)))
6043 return true
6044 }
6045 return false
6046 }
6047 func rewriteValuegeneric_OpCvt32Fto32(v *Value) bool {
6048 v_0 := v.Args[0]
6049
6050
6051 for {
6052 if v_0.Op != OpConst32F {
6053 break
6054 }
6055 c := auxIntToFloat32(v_0.AuxInt)
6056 v.reset(OpConst32)
6057 v.AuxInt = int32ToAuxInt(int32(c))
6058 return true
6059 }
6060 return false
6061 }
6062 func rewriteValuegeneric_OpCvt32Fto64(v *Value) bool {
6063 v_0 := v.Args[0]
6064
6065
6066 for {
6067 if v_0.Op != OpConst32F {
6068 break
6069 }
6070 c := auxIntToFloat32(v_0.AuxInt)
6071 v.reset(OpConst64)
6072 v.AuxInt = int64ToAuxInt(int64(c))
6073 return true
6074 }
6075 return false
6076 }
6077 func rewriteValuegeneric_OpCvt32Fto64F(v *Value) bool {
6078 v_0 := v.Args[0]
6079
6080
6081 for {
6082 if v_0.Op != OpConst32F {
6083 break
6084 }
6085 c := auxIntToFloat32(v_0.AuxInt)
6086 v.reset(OpConst64F)
6087 v.AuxInt = float64ToAuxInt(float64(c))
6088 return true
6089 }
6090 return false
6091 }
6092 func rewriteValuegeneric_OpCvt32to32F(v *Value) bool {
6093 v_0 := v.Args[0]
6094
6095
6096 for {
6097 if v_0.Op != OpConst32 {
6098 break
6099 }
6100 c := auxIntToInt32(v_0.AuxInt)
6101 v.reset(OpConst32F)
6102 v.AuxInt = float32ToAuxInt(float32(c))
6103 return true
6104 }
6105 return false
6106 }
6107 func rewriteValuegeneric_OpCvt32to64F(v *Value) bool {
6108 v_0 := v.Args[0]
6109
6110
6111 for {
6112 if v_0.Op != OpConst32 {
6113 break
6114 }
6115 c := auxIntToInt32(v_0.AuxInt)
6116 v.reset(OpConst64F)
6117 v.AuxInt = float64ToAuxInt(float64(c))
6118 return true
6119 }
6120 return false
6121 }
6122 func rewriteValuegeneric_OpCvt64Fto32(v *Value) bool {
6123 v_0 := v.Args[0]
6124
6125
6126 for {
6127 if v_0.Op != OpConst64F {
6128 break
6129 }
6130 c := auxIntToFloat64(v_0.AuxInt)
6131 v.reset(OpConst32)
6132 v.AuxInt = int32ToAuxInt(int32(c))
6133 return true
6134 }
6135 return false
6136 }
6137 func rewriteValuegeneric_OpCvt64Fto32F(v *Value) bool {
6138 v_0 := v.Args[0]
6139
6140
6141 for {
6142 if v_0.Op != OpConst64F {
6143 break
6144 }
6145 c := auxIntToFloat64(v_0.AuxInt)
6146 v.reset(OpConst32F)
6147 v.AuxInt = float32ToAuxInt(float32(c))
6148 return true
6149 }
6150
6151
6152
6153 for {
6154 sqrt0 := v_0
6155 if sqrt0.Op != OpSqrt {
6156 break
6157 }
6158 sqrt0_0 := sqrt0.Args[0]
6159 if sqrt0_0.Op != OpCvt32Fto64F {
6160 break
6161 }
6162 x := sqrt0_0.Args[0]
6163 if !(sqrt0.Uses == 1) {
6164 break
6165 }
6166 v.reset(OpSqrt32)
6167 v.AddArg(x)
6168 return true
6169 }
6170 return false
6171 }
6172 func rewriteValuegeneric_OpCvt64Fto64(v *Value) bool {
6173 v_0 := v.Args[0]
6174
6175
6176 for {
6177 if v_0.Op != OpConst64F {
6178 break
6179 }
6180 c := auxIntToFloat64(v_0.AuxInt)
6181 v.reset(OpConst64)
6182 v.AuxInt = int64ToAuxInt(int64(c))
6183 return true
6184 }
6185 return false
6186 }
6187 func rewriteValuegeneric_OpCvt64to32F(v *Value) bool {
6188 v_0 := v.Args[0]
6189
6190
6191 for {
6192 if v_0.Op != OpConst64 {
6193 break
6194 }
6195 c := auxIntToInt64(v_0.AuxInt)
6196 v.reset(OpConst32F)
6197 v.AuxInt = float32ToAuxInt(float32(c))
6198 return true
6199 }
6200 return false
6201 }
6202 func rewriteValuegeneric_OpCvt64to64F(v *Value) bool {
6203 v_0 := v.Args[0]
6204
6205
6206 for {
6207 if v_0.Op != OpConst64 {
6208 break
6209 }
6210 c := auxIntToInt64(v_0.AuxInt)
6211 v.reset(OpConst64F)
6212 v.AuxInt = float64ToAuxInt(float64(c))
6213 return true
6214 }
6215 return false
6216 }
6217 func rewriteValuegeneric_OpCvtBoolToUint8(v *Value) bool {
6218 v_0 := v.Args[0]
6219
6220
6221 for {
6222 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
6223 break
6224 }
6225 v.reset(OpConst8)
6226 v.AuxInt = int8ToAuxInt(0)
6227 return true
6228 }
6229
6230
6231 for {
6232 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
6233 break
6234 }
6235 v.reset(OpConst8)
6236 v.AuxInt = int8ToAuxInt(1)
6237 return true
6238 }
6239 return false
6240 }
6241 func rewriteValuegeneric_OpDiv16(v *Value) bool {
6242 v_1 := v.Args[1]
6243 v_0 := v.Args[0]
6244 b := v.Block
6245 typ := &b.Func.Config.Types
6246
6247
6248
6249 for {
6250 if v_0.Op != OpConst16 {
6251 break
6252 }
6253 c := auxIntToInt16(v_0.AuxInt)
6254 if v_1.Op != OpConst16 {
6255 break
6256 }
6257 d := auxIntToInt16(v_1.AuxInt)
6258 if !(d != 0) {
6259 break
6260 }
6261 v.reset(OpConst16)
6262 v.AuxInt = int16ToAuxInt(c / d)
6263 return true
6264 }
6265
6266
6267
6268 for {
6269 n := v_0
6270 if v_1.Op != OpConst16 {
6271 break
6272 }
6273 c := auxIntToInt16(v_1.AuxInt)
6274 if !(isNonNegative(n) && isPowerOfTwo(c)) {
6275 break
6276 }
6277 v.reset(OpRsh16Ux64)
6278 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6279 v0.AuxInt = int64ToAuxInt(log16(c))
6280 v.AddArg2(n, v0)
6281 return true
6282 }
6283
6284
6285
6286 for {
6287 t := v.Type
6288 n := v_0
6289 if v_1.Op != OpConst16 {
6290 break
6291 }
6292 c := auxIntToInt16(v_1.AuxInt)
6293 if !(c < 0 && c != -1<<15) {
6294 break
6295 }
6296 v.reset(OpNeg16)
6297 v0 := b.NewValue0(v.Pos, OpDiv16, t)
6298 v1 := b.NewValue0(v.Pos, OpConst16, t)
6299 v1.AuxInt = int16ToAuxInt(-c)
6300 v0.AddArg2(n, v1)
6301 v.AddArg(v0)
6302 return true
6303 }
6304
6305
6306 for {
6307 t := v.Type
6308 x := v_0
6309 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != -1<<15 {
6310 break
6311 }
6312 v.reset(OpRsh16Ux64)
6313 v0 := b.NewValue0(v.Pos, OpAnd16, t)
6314 v1 := b.NewValue0(v.Pos, OpNeg16, t)
6315 v1.AddArg(x)
6316 v0.AddArg2(x, v1)
6317 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6318 v2.AuxInt = int64ToAuxInt(15)
6319 v.AddArg2(v0, v2)
6320 return true
6321 }
6322
6323
6324
6325 for {
6326 t := v.Type
6327 n := v_0
6328 if v_1.Op != OpConst16 {
6329 break
6330 }
6331 c := auxIntToInt16(v_1.AuxInt)
6332 if !(isPowerOfTwo(c)) {
6333 break
6334 }
6335 v.reset(OpRsh16x64)
6336 v0 := b.NewValue0(v.Pos, OpAdd16, t)
6337 v1 := b.NewValue0(v.Pos, OpRsh16Ux64, t)
6338 v2 := b.NewValue0(v.Pos, OpRsh16x64, t)
6339 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6340 v3.AuxInt = int64ToAuxInt(15)
6341 v2.AddArg2(n, v3)
6342 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6343 v4.AuxInt = int64ToAuxInt(int64(16 - log16(c)))
6344 v1.AddArg2(v2, v4)
6345 v0.AddArg2(n, v1)
6346 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6347 v5.AuxInt = int64ToAuxInt(int64(log16(c)))
6348 v.AddArg2(v0, v5)
6349 return true
6350 }
6351
6352
6353
6354 for {
6355 t := v.Type
6356 x := v_0
6357 if v_1.Op != OpConst16 {
6358 break
6359 }
6360 c := auxIntToInt16(v_1.AuxInt)
6361 if !(smagicOK16(c)) {
6362 break
6363 }
6364 v.reset(OpSub16)
6365 v.Type = t
6366 v0 := b.NewValue0(v.Pos, OpRsh32x64, t)
6367 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32)
6368 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
6369 v2.AuxInt = int32ToAuxInt(int32(smagic16(c).m))
6370 v3 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
6371 v3.AddArg(x)
6372 v1.AddArg2(v2, v3)
6373 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6374 v4.AuxInt = int64ToAuxInt(16 + smagic16(c).s)
6375 v0.AddArg2(v1, v4)
6376 v5 := b.NewValue0(v.Pos, OpRsh32x64, t)
6377 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6378 v6.AuxInt = int64ToAuxInt(31)
6379 v5.AddArg2(v3, v6)
6380 v.AddArg2(v0, v5)
6381 return true
6382 }
6383 return false
6384 }
6385 func rewriteValuegeneric_OpDiv16u(v *Value) bool {
6386 v_1 := v.Args[1]
6387 v_0 := v.Args[0]
6388 b := v.Block
6389 config := b.Func.Config
6390 typ := &b.Func.Config.Types
6391
6392
6393
6394 for {
6395 if v_0.Op != OpConst16 {
6396 break
6397 }
6398 c := auxIntToInt16(v_0.AuxInt)
6399 if v_1.Op != OpConst16 {
6400 break
6401 }
6402 d := auxIntToInt16(v_1.AuxInt)
6403 if !(d != 0) {
6404 break
6405 }
6406 v.reset(OpConst16)
6407 v.AuxInt = int16ToAuxInt(int16(uint16(c) / uint16(d)))
6408 return true
6409 }
6410
6411
6412
6413 for {
6414 n := v_0
6415 if v_1.Op != OpConst16 {
6416 break
6417 }
6418 c := auxIntToInt16(v_1.AuxInt)
6419 if !(isPowerOfTwo(c)) {
6420 break
6421 }
6422 v.reset(OpRsh16Ux64)
6423 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6424 v0.AuxInt = int64ToAuxInt(log16(c))
6425 v.AddArg2(n, v0)
6426 return true
6427 }
6428
6429
6430
6431 for {
6432 x := v_0
6433 if v_1.Op != OpConst16 {
6434 break
6435 }
6436 c := auxIntToInt16(v_1.AuxInt)
6437 if !(umagicOK16(c) && config.RegSize == 8) {
6438 break
6439 }
6440 v.reset(OpTrunc64to16)
6441 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64)
6442 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64)
6443 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6444 v2.AuxInt = int64ToAuxInt(int64(1<<16 + umagic16(c).m))
6445 v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
6446 v3.AddArg(x)
6447 v1.AddArg2(v2, v3)
6448 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6449 v4.AuxInt = int64ToAuxInt(16 + umagic16(c).s)
6450 v0.AddArg2(v1, v4)
6451 v.AddArg(v0)
6452 return true
6453 }
6454
6455
6456
6457 for {
6458 x := v_0
6459 if v_1.Op != OpConst16 {
6460 break
6461 }
6462 c := auxIntToInt16(v_1.AuxInt)
6463 if !(umagicOK16(c) && config.RegSize == 4 && umagic16(c).m&1 == 0) {
6464 break
6465 }
6466 v.reset(OpTrunc32to16)
6467 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32)
6468 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32)
6469 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
6470 v2.AuxInt = int32ToAuxInt(int32(1<<15 + umagic16(c).m/2))
6471 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
6472 v3.AddArg(x)
6473 v1.AddArg2(v2, v3)
6474 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6475 v4.AuxInt = int64ToAuxInt(16 + umagic16(c).s - 1)
6476 v0.AddArg2(v1, v4)
6477 v.AddArg(v0)
6478 return true
6479 }
6480
6481
6482
6483 for {
6484 x := v_0
6485 if v_1.Op != OpConst16 {
6486 break
6487 }
6488 c := auxIntToInt16(v_1.AuxInt)
6489 if !(umagicOK16(c) && config.RegSize == 4 && c&1 == 0) {
6490 break
6491 }
6492 v.reset(OpTrunc32to16)
6493 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32)
6494 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32)
6495 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
6496 v2.AuxInt = int32ToAuxInt(int32(1<<15 + (umagic16(c).m+1)/2))
6497 v3 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32)
6498 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
6499 v4.AddArg(x)
6500 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6501 v5.AuxInt = int64ToAuxInt(1)
6502 v3.AddArg2(v4, v5)
6503 v1.AddArg2(v2, v3)
6504 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6505 v6.AuxInt = int64ToAuxInt(16 + umagic16(c).s - 2)
6506 v0.AddArg2(v1, v6)
6507 v.AddArg(v0)
6508 return true
6509 }
6510
6511
6512
6513 for {
6514 x := v_0
6515 if v_1.Op != OpConst16 {
6516 break
6517 }
6518 c := auxIntToInt16(v_1.AuxInt)
6519 if !(umagicOK16(c) && config.RegSize == 4 && config.useAvg) {
6520 break
6521 }
6522 v.reset(OpTrunc32to16)
6523 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32)
6524 v1 := b.NewValue0(v.Pos, OpAvg32u, typ.UInt32)
6525 v2 := b.NewValue0(v.Pos, OpLsh32x64, typ.UInt32)
6526 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
6527 v3.AddArg(x)
6528 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6529 v4.AuxInt = int64ToAuxInt(16)
6530 v2.AddArg2(v3, v4)
6531 v5 := b.NewValue0(v.Pos, OpMul32, typ.UInt32)
6532 v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
6533 v6.AuxInt = int32ToAuxInt(int32(umagic16(c).m))
6534 v5.AddArg2(v6, v3)
6535 v1.AddArg2(v2, v5)
6536 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6537 v7.AuxInt = int64ToAuxInt(16 + umagic16(c).s - 1)
6538 v0.AddArg2(v1, v7)
6539 v.AddArg(v0)
6540 return true
6541 }
6542 return false
6543 }
6544 func rewriteValuegeneric_OpDiv32(v *Value) bool {
6545 v_1 := v.Args[1]
6546 v_0 := v.Args[0]
6547 b := v.Block
6548 config := b.Func.Config
6549 typ := &b.Func.Config.Types
6550
6551
6552
6553 for {
6554 if v_0.Op != OpConst32 {
6555 break
6556 }
6557 c := auxIntToInt32(v_0.AuxInt)
6558 if v_1.Op != OpConst32 {
6559 break
6560 }
6561 d := auxIntToInt32(v_1.AuxInt)
6562 if !(d != 0) {
6563 break
6564 }
6565 v.reset(OpConst32)
6566 v.AuxInt = int32ToAuxInt(c / d)
6567 return true
6568 }
6569
6570
6571
6572 for {
6573 n := v_0
6574 if v_1.Op != OpConst32 {
6575 break
6576 }
6577 c := auxIntToInt32(v_1.AuxInt)
6578 if !(isNonNegative(n) && isPowerOfTwo(c)) {
6579 break
6580 }
6581 v.reset(OpRsh32Ux64)
6582 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6583 v0.AuxInt = int64ToAuxInt(log32(c))
6584 v.AddArg2(n, v0)
6585 return true
6586 }
6587
6588
6589
6590 for {
6591 t := v.Type
6592 n := v_0
6593 if v_1.Op != OpConst32 {
6594 break
6595 }
6596 c := auxIntToInt32(v_1.AuxInt)
6597 if !(c < 0 && c != -1<<31) {
6598 break
6599 }
6600 v.reset(OpNeg32)
6601 v0 := b.NewValue0(v.Pos, OpDiv32, t)
6602 v1 := b.NewValue0(v.Pos, OpConst32, t)
6603 v1.AuxInt = int32ToAuxInt(-c)
6604 v0.AddArg2(n, v1)
6605 v.AddArg(v0)
6606 return true
6607 }
6608
6609
6610 for {
6611 t := v.Type
6612 x := v_0
6613 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != -1<<31 {
6614 break
6615 }
6616 v.reset(OpRsh32Ux64)
6617 v0 := b.NewValue0(v.Pos, OpAnd32, t)
6618 v1 := b.NewValue0(v.Pos, OpNeg32, t)
6619 v1.AddArg(x)
6620 v0.AddArg2(x, v1)
6621 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6622 v2.AuxInt = int64ToAuxInt(31)
6623 v.AddArg2(v0, v2)
6624 return true
6625 }
6626
6627
6628
6629 for {
6630 t := v.Type
6631 n := v_0
6632 if v_1.Op != OpConst32 {
6633 break
6634 }
6635 c := auxIntToInt32(v_1.AuxInt)
6636 if !(isPowerOfTwo(c)) {
6637 break
6638 }
6639 v.reset(OpRsh32x64)
6640 v0 := b.NewValue0(v.Pos, OpAdd32, t)
6641 v1 := b.NewValue0(v.Pos, OpRsh32Ux64, t)
6642 v2 := b.NewValue0(v.Pos, OpRsh32x64, t)
6643 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6644 v3.AuxInt = int64ToAuxInt(31)
6645 v2.AddArg2(n, v3)
6646 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6647 v4.AuxInt = int64ToAuxInt(int64(32 - log32(c)))
6648 v1.AddArg2(v2, v4)
6649 v0.AddArg2(n, v1)
6650 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6651 v5.AuxInt = int64ToAuxInt(int64(log32(c)))
6652 v.AddArg2(v0, v5)
6653 return true
6654 }
6655
6656
6657
6658 for {
6659 t := v.Type
6660 x := v_0
6661 if v_1.Op != OpConst32 {
6662 break
6663 }
6664 c := auxIntToInt32(v_1.AuxInt)
6665 if !(smagicOK32(c) && config.RegSize == 8) {
6666 break
6667 }
6668 v.reset(OpSub32)
6669 v.Type = t
6670 v0 := b.NewValue0(v.Pos, OpRsh64x64, t)
6671 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64)
6672 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6673 v2.AuxInt = int64ToAuxInt(int64(smagic32(c).m))
6674 v3 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
6675 v3.AddArg(x)
6676 v1.AddArg2(v2, v3)
6677 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6678 v4.AuxInt = int64ToAuxInt(32 + smagic32(c).s)
6679 v0.AddArg2(v1, v4)
6680 v5 := b.NewValue0(v.Pos, OpRsh64x64, t)
6681 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6682 v6.AuxInt = int64ToAuxInt(63)
6683 v5.AddArg2(v3, v6)
6684 v.AddArg2(v0, v5)
6685 return true
6686 }
6687
6688
6689
6690 for {
6691 t := v.Type
6692 x := v_0
6693 if v_1.Op != OpConst32 {
6694 break
6695 }
6696 c := auxIntToInt32(v_1.AuxInt)
6697 if !(smagicOK32(c) && config.RegSize == 4 && smagic32(c).m&1 == 0 && config.useHmul) {
6698 break
6699 }
6700 v.reset(OpSub32)
6701 v.Type = t
6702 v0 := b.NewValue0(v.Pos, OpRsh32x64, t)
6703 v1 := b.NewValue0(v.Pos, OpHmul32, t)
6704 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
6705 v2.AuxInt = int32ToAuxInt(int32(smagic32(c).m / 2))
6706 v1.AddArg2(v2, x)
6707 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6708 v3.AuxInt = int64ToAuxInt(smagic32(c).s - 1)
6709 v0.AddArg2(v1, v3)
6710 v4 := b.NewValue0(v.Pos, OpRsh32x64, t)
6711 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6712 v5.AuxInt = int64ToAuxInt(31)
6713 v4.AddArg2(x, v5)
6714 v.AddArg2(v0, v4)
6715 return true
6716 }
6717
6718
6719
6720 for {
6721 t := v.Type
6722 x := v_0
6723 if v_1.Op != OpConst32 {
6724 break
6725 }
6726 c := auxIntToInt32(v_1.AuxInt)
6727 if !(smagicOK32(c) && config.RegSize == 4 && smagic32(c).m&1 != 0 && config.useHmul) {
6728 break
6729 }
6730 v.reset(OpSub32)
6731 v.Type = t
6732 v0 := b.NewValue0(v.Pos, OpRsh32x64, t)
6733 v1 := b.NewValue0(v.Pos, OpAdd32, t)
6734 v2 := b.NewValue0(v.Pos, OpHmul32, t)
6735 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
6736 v3.AuxInt = int32ToAuxInt(int32(smagic32(c).m))
6737 v2.AddArg2(v3, x)
6738 v1.AddArg2(v2, x)
6739 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6740 v4.AuxInt = int64ToAuxInt(smagic32(c).s)
6741 v0.AddArg2(v1, v4)
6742 v5 := b.NewValue0(v.Pos, OpRsh32x64, t)
6743 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6744 v6.AuxInt = int64ToAuxInt(31)
6745 v5.AddArg2(x, v6)
6746 v.AddArg2(v0, v5)
6747 return true
6748 }
6749 return false
6750 }
6751 func rewriteValuegeneric_OpDiv32F(v *Value) bool {
6752 v_1 := v.Args[1]
6753 v_0 := v.Args[0]
6754 b := v.Block
6755
6756
6757
6758 for {
6759 if v_0.Op != OpConst32F {
6760 break
6761 }
6762 c := auxIntToFloat32(v_0.AuxInt)
6763 if v_1.Op != OpConst32F {
6764 break
6765 }
6766 d := auxIntToFloat32(v_1.AuxInt)
6767 if !(c/d == c/d) {
6768 break
6769 }
6770 v.reset(OpConst32F)
6771 v.AuxInt = float32ToAuxInt(c / d)
6772 return true
6773 }
6774
6775
6776
6777 for {
6778 x := v_0
6779 if v_1.Op != OpConst32F {
6780 break
6781 }
6782 t := v_1.Type
6783 c := auxIntToFloat32(v_1.AuxInt)
6784 if !(reciprocalExact32(c)) {
6785 break
6786 }
6787 v.reset(OpMul32F)
6788 v0 := b.NewValue0(v.Pos, OpConst32F, t)
6789 v0.AuxInt = float32ToAuxInt(1 / c)
6790 v.AddArg2(x, v0)
6791 return true
6792 }
6793 return false
6794 }
6795 func rewriteValuegeneric_OpDiv32u(v *Value) bool {
6796 v_1 := v.Args[1]
6797 v_0 := v.Args[0]
6798 b := v.Block
6799 config := b.Func.Config
6800 typ := &b.Func.Config.Types
6801
6802
6803
6804 for {
6805 if v_0.Op != OpConst32 {
6806 break
6807 }
6808 c := auxIntToInt32(v_0.AuxInt)
6809 if v_1.Op != OpConst32 {
6810 break
6811 }
6812 d := auxIntToInt32(v_1.AuxInt)
6813 if !(d != 0) {
6814 break
6815 }
6816 v.reset(OpConst32)
6817 v.AuxInt = int32ToAuxInt(int32(uint32(c) / uint32(d)))
6818 return true
6819 }
6820
6821
6822
6823 for {
6824 n := v_0
6825 if v_1.Op != OpConst32 {
6826 break
6827 }
6828 c := auxIntToInt32(v_1.AuxInt)
6829 if !(isPowerOfTwo(c)) {
6830 break
6831 }
6832 v.reset(OpRsh32Ux64)
6833 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6834 v0.AuxInt = int64ToAuxInt(log32(c))
6835 v.AddArg2(n, v0)
6836 return true
6837 }
6838
6839
6840
6841 for {
6842 x := v_0
6843 if v_1.Op != OpConst32 {
6844 break
6845 }
6846 c := auxIntToInt32(v_1.AuxInt)
6847 if !(umagicOK32(c) && config.RegSize == 4 && umagic32(c).m&1 == 0 && config.useHmul) {
6848 break
6849 }
6850 v.reset(OpRsh32Ux64)
6851 v.Type = typ.UInt32
6852 v0 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32)
6853 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
6854 v1.AuxInt = int32ToAuxInt(int32(1<<31 + umagic32(c).m/2))
6855 v0.AddArg2(v1, x)
6856 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6857 v2.AuxInt = int64ToAuxInt(umagic32(c).s - 1)
6858 v.AddArg2(v0, v2)
6859 return true
6860 }
6861
6862
6863
6864 for {
6865 x := v_0
6866 if v_1.Op != OpConst32 {
6867 break
6868 }
6869 c := auxIntToInt32(v_1.AuxInt)
6870 if !(umagicOK32(c) && config.RegSize == 4 && c&1 == 0 && config.useHmul) {
6871 break
6872 }
6873 v.reset(OpRsh32Ux64)
6874 v.Type = typ.UInt32
6875 v0 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32)
6876 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
6877 v1.AuxInt = int32ToAuxInt(int32(1<<31 + (umagic32(c).m+1)/2))
6878 v2 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32)
6879 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6880 v3.AuxInt = int64ToAuxInt(1)
6881 v2.AddArg2(x, v3)
6882 v0.AddArg2(v1, v2)
6883 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6884 v4.AuxInt = int64ToAuxInt(umagic32(c).s - 2)
6885 v.AddArg2(v0, v4)
6886 return true
6887 }
6888
6889
6890
6891 for {
6892 x := v_0
6893 if v_1.Op != OpConst32 {
6894 break
6895 }
6896 c := auxIntToInt32(v_1.AuxInt)
6897 if !(umagicOK32(c) && config.RegSize == 4 && config.useAvg && config.useHmul) {
6898 break
6899 }
6900 v.reset(OpRsh32Ux64)
6901 v.Type = typ.UInt32
6902 v0 := b.NewValue0(v.Pos, OpAvg32u, typ.UInt32)
6903 v1 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32)
6904 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
6905 v2.AuxInt = int32ToAuxInt(int32(umagic32(c).m))
6906 v1.AddArg2(v2, x)
6907 v0.AddArg2(x, v1)
6908 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6909 v3.AuxInt = int64ToAuxInt(umagic32(c).s - 1)
6910 v.AddArg2(v0, v3)
6911 return true
6912 }
6913
6914
6915
6916 for {
6917 x := v_0
6918 if v_1.Op != OpConst32 {
6919 break
6920 }
6921 c := auxIntToInt32(v_1.AuxInt)
6922 if !(umagicOK32(c) && config.RegSize == 8 && umagic32(c).m&1 == 0) {
6923 break
6924 }
6925 v.reset(OpTrunc64to32)
6926 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64)
6927 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64)
6928 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6929 v2.AuxInt = int64ToAuxInt(int64(1<<31 + umagic32(c).m/2))
6930 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
6931 v3.AddArg(x)
6932 v1.AddArg2(v2, v3)
6933 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6934 v4.AuxInt = int64ToAuxInt(32 + umagic32(c).s - 1)
6935 v0.AddArg2(v1, v4)
6936 v.AddArg(v0)
6937 return true
6938 }
6939
6940
6941
6942 for {
6943 x := v_0
6944 if v_1.Op != OpConst32 {
6945 break
6946 }
6947 c := auxIntToInt32(v_1.AuxInt)
6948 if !(umagicOK32(c) && config.RegSize == 8 && c&1 == 0) {
6949 break
6950 }
6951 v.reset(OpTrunc64to32)
6952 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64)
6953 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64)
6954 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6955 v2.AuxInt = int64ToAuxInt(int64(1<<31 + (umagic32(c).m+1)/2))
6956 v3 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64)
6957 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
6958 v4.AddArg(x)
6959 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6960 v5.AuxInt = int64ToAuxInt(1)
6961 v3.AddArg2(v4, v5)
6962 v1.AddArg2(v2, v3)
6963 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6964 v6.AuxInt = int64ToAuxInt(32 + umagic32(c).s - 2)
6965 v0.AddArg2(v1, v6)
6966 v.AddArg(v0)
6967 return true
6968 }
6969
6970
6971
6972 for {
6973 x := v_0
6974 if v_1.Op != OpConst32 {
6975 break
6976 }
6977 c := auxIntToInt32(v_1.AuxInt)
6978 if !(umagicOK32(c) && config.RegSize == 8 && config.useAvg) {
6979 break
6980 }
6981 v.reset(OpTrunc64to32)
6982 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64)
6983 v1 := b.NewValue0(v.Pos, OpAvg64u, typ.UInt64)
6984 v2 := b.NewValue0(v.Pos, OpLsh64x64, typ.UInt64)
6985 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
6986 v3.AddArg(x)
6987 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6988 v4.AuxInt = int64ToAuxInt(32)
6989 v2.AddArg2(v3, v4)
6990 v5 := b.NewValue0(v.Pos, OpMul64, typ.UInt64)
6991 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt32)
6992 v6.AuxInt = int64ToAuxInt(int64(umagic32(c).m))
6993 v5.AddArg2(v6, v3)
6994 v1.AddArg2(v2, v5)
6995 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6996 v7.AuxInt = int64ToAuxInt(32 + umagic32(c).s - 1)
6997 v0.AddArg2(v1, v7)
6998 v.AddArg(v0)
6999 return true
7000 }
7001 return false
7002 }
7003 func rewriteValuegeneric_OpDiv64(v *Value) bool {
7004 v_1 := v.Args[1]
7005 v_0 := v.Args[0]
7006 b := v.Block
7007 config := b.Func.Config
7008 typ := &b.Func.Config.Types
7009
7010
7011
7012 for {
7013 if v_0.Op != OpConst64 {
7014 break
7015 }
7016 c := auxIntToInt64(v_0.AuxInt)
7017 if v_1.Op != OpConst64 {
7018 break
7019 }
7020 d := auxIntToInt64(v_1.AuxInt)
7021 if !(d != 0) {
7022 break
7023 }
7024 v.reset(OpConst64)
7025 v.AuxInt = int64ToAuxInt(c / d)
7026 return true
7027 }
7028
7029
7030
7031 for {
7032 n := v_0
7033 if v_1.Op != OpConst64 {
7034 break
7035 }
7036 c := auxIntToInt64(v_1.AuxInt)
7037 if !(isNonNegative(n) && isPowerOfTwo(c)) {
7038 break
7039 }
7040 v.reset(OpRsh64Ux64)
7041 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7042 v0.AuxInt = int64ToAuxInt(log64(c))
7043 v.AddArg2(n, v0)
7044 return true
7045 }
7046
7047
7048
7049 for {
7050 n := v_0
7051 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 || !(isNonNegative(n)) {
7052 break
7053 }
7054 v.reset(OpConst64)
7055 v.AuxInt = int64ToAuxInt(0)
7056 return true
7057 }
7058
7059
7060
7061 for {
7062 t := v.Type
7063 n := v_0
7064 if v_1.Op != OpConst64 {
7065 break
7066 }
7067 c := auxIntToInt64(v_1.AuxInt)
7068 if !(c < 0 && c != -1<<63) {
7069 break
7070 }
7071 v.reset(OpNeg64)
7072 v0 := b.NewValue0(v.Pos, OpDiv64, t)
7073 v1 := b.NewValue0(v.Pos, OpConst64, t)
7074 v1.AuxInt = int64ToAuxInt(-c)
7075 v0.AddArg2(n, v1)
7076 v.AddArg(v0)
7077 return true
7078 }
7079
7080
7081 for {
7082 t := v.Type
7083 x := v_0
7084 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 {
7085 break
7086 }
7087 v.reset(OpRsh64Ux64)
7088 v0 := b.NewValue0(v.Pos, OpAnd64, t)
7089 v1 := b.NewValue0(v.Pos, OpNeg64, t)
7090 v1.AddArg(x)
7091 v0.AddArg2(x, v1)
7092 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7093 v2.AuxInt = int64ToAuxInt(63)
7094 v.AddArg2(v0, v2)
7095 return true
7096 }
7097
7098
7099
7100 for {
7101 t := v.Type
7102 n := v_0
7103 if v_1.Op != OpConst64 {
7104 break
7105 }
7106 c := auxIntToInt64(v_1.AuxInt)
7107 if !(isPowerOfTwo(c)) {
7108 break
7109 }
7110 v.reset(OpRsh64x64)
7111 v0 := b.NewValue0(v.Pos, OpAdd64, t)
7112 v1 := b.NewValue0(v.Pos, OpRsh64Ux64, t)
7113 v2 := b.NewValue0(v.Pos, OpRsh64x64, t)
7114 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7115 v3.AuxInt = int64ToAuxInt(63)
7116 v2.AddArg2(n, v3)
7117 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7118 v4.AuxInt = int64ToAuxInt(int64(64 - log64(c)))
7119 v1.AddArg2(v2, v4)
7120 v0.AddArg2(n, v1)
7121 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7122 v5.AuxInt = int64ToAuxInt(int64(log64(c)))
7123 v.AddArg2(v0, v5)
7124 return true
7125 }
7126
7127
7128
7129 for {
7130 t := v.Type
7131 x := v_0
7132 if v_1.Op != OpConst64 {
7133 break
7134 }
7135 c := auxIntToInt64(v_1.AuxInt)
7136 if !(smagicOK64(c) && smagic64(c).m&1 == 0 && config.useHmul) {
7137 break
7138 }
7139 v.reset(OpSub64)
7140 v.Type = t
7141 v0 := b.NewValue0(v.Pos, OpRsh64x64, t)
7142 v1 := b.NewValue0(v.Pos, OpHmul64, t)
7143 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7144 v2.AuxInt = int64ToAuxInt(int64(smagic64(c).m / 2))
7145 v1.AddArg2(v2, x)
7146 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7147 v3.AuxInt = int64ToAuxInt(smagic64(c).s - 1)
7148 v0.AddArg2(v1, v3)
7149 v4 := b.NewValue0(v.Pos, OpRsh64x64, t)
7150 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7151 v5.AuxInt = int64ToAuxInt(63)
7152 v4.AddArg2(x, v5)
7153 v.AddArg2(v0, v4)
7154 return true
7155 }
7156
7157
7158
7159 for {
7160 t := v.Type
7161 x := v_0
7162 if v_1.Op != OpConst64 {
7163 break
7164 }
7165 c := auxIntToInt64(v_1.AuxInt)
7166 if !(smagicOK64(c) && smagic64(c).m&1 != 0 && config.useHmul) {
7167 break
7168 }
7169 v.reset(OpSub64)
7170 v.Type = t
7171 v0 := b.NewValue0(v.Pos, OpRsh64x64, t)
7172 v1 := b.NewValue0(v.Pos, OpAdd64, t)
7173 v2 := b.NewValue0(v.Pos, OpHmul64, t)
7174 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7175 v3.AuxInt = int64ToAuxInt(int64(smagic64(c).m))
7176 v2.AddArg2(v3, x)
7177 v1.AddArg2(v2, x)
7178 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7179 v4.AuxInt = int64ToAuxInt(smagic64(c).s)
7180 v0.AddArg2(v1, v4)
7181 v5 := b.NewValue0(v.Pos, OpRsh64x64, t)
7182 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7183 v6.AuxInt = int64ToAuxInt(63)
7184 v5.AddArg2(x, v6)
7185 v.AddArg2(v0, v5)
7186 return true
7187 }
7188 return false
7189 }
7190 func rewriteValuegeneric_OpDiv64F(v *Value) bool {
7191 v_1 := v.Args[1]
7192 v_0 := v.Args[0]
7193 b := v.Block
7194
7195
7196
7197 for {
7198 if v_0.Op != OpConst64F {
7199 break
7200 }
7201 c := auxIntToFloat64(v_0.AuxInt)
7202 if v_1.Op != OpConst64F {
7203 break
7204 }
7205 d := auxIntToFloat64(v_1.AuxInt)
7206 if !(c/d == c/d) {
7207 break
7208 }
7209 v.reset(OpConst64F)
7210 v.AuxInt = float64ToAuxInt(c / d)
7211 return true
7212 }
7213
7214
7215
7216 for {
7217 x := v_0
7218 if v_1.Op != OpConst64F {
7219 break
7220 }
7221 t := v_1.Type
7222 c := auxIntToFloat64(v_1.AuxInt)
7223 if !(reciprocalExact64(c)) {
7224 break
7225 }
7226 v.reset(OpMul64F)
7227 v0 := b.NewValue0(v.Pos, OpConst64F, t)
7228 v0.AuxInt = float64ToAuxInt(1 / c)
7229 v.AddArg2(x, v0)
7230 return true
7231 }
7232 return false
7233 }
7234 func rewriteValuegeneric_OpDiv64u(v *Value) bool {
7235 v_1 := v.Args[1]
7236 v_0 := v.Args[0]
7237 b := v.Block
7238 config := b.Func.Config
7239 typ := &b.Func.Config.Types
7240
7241
7242
7243 for {
7244 if v_0.Op != OpConst64 {
7245 break
7246 }
7247 c := auxIntToInt64(v_0.AuxInt)
7248 if v_1.Op != OpConst64 {
7249 break
7250 }
7251 d := auxIntToInt64(v_1.AuxInt)
7252 if !(d != 0) {
7253 break
7254 }
7255 v.reset(OpConst64)
7256 v.AuxInt = int64ToAuxInt(int64(uint64(c) / uint64(d)))
7257 return true
7258 }
7259
7260
7261
7262 for {
7263 n := v_0
7264 if v_1.Op != OpConst64 {
7265 break
7266 }
7267 c := auxIntToInt64(v_1.AuxInt)
7268 if !(isPowerOfTwo(c)) {
7269 break
7270 }
7271 v.reset(OpRsh64Ux64)
7272 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7273 v0.AuxInt = int64ToAuxInt(log64(c))
7274 v.AddArg2(n, v0)
7275 return true
7276 }
7277
7278
7279 for {
7280 n := v_0
7281 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 {
7282 break
7283 }
7284 v.reset(OpRsh64Ux64)
7285 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7286 v0.AuxInt = int64ToAuxInt(63)
7287 v.AddArg2(n, v0)
7288 return true
7289 }
7290
7291
7292
7293 for {
7294 x := v_0
7295 if v_1.Op != OpConst64 {
7296 break
7297 }
7298 c := auxIntToInt64(v_1.AuxInt)
7299 if !(c > 0 && c <= 0xFFFF && umagicOK32(int32(c)) && config.RegSize == 4 && config.useHmul) {
7300 break
7301 }
7302 v.reset(OpAdd64)
7303 v0 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64)
7304 v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64)
7305 v2 := b.NewValue0(v.Pos, OpLsh64x64, typ.UInt64)
7306 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
7307 v4 := b.NewValue0(v.Pos, OpDiv32u, typ.UInt32)
7308 v5 := b.NewValue0(v.Pos, OpTrunc64to32, typ.UInt32)
7309 v6 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64)
7310 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7311 v7.AuxInt = int64ToAuxInt(32)
7312 v6.AddArg2(x, v7)
7313 v5.AddArg(v6)
7314 v8 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
7315 v8.AuxInt = int32ToAuxInt(int32(c))
7316 v4.AddArg2(v5, v8)
7317 v3.AddArg(v4)
7318 v2.AddArg2(v3, v7)
7319 v9 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
7320 v10 := b.NewValue0(v.Pos, OpDiv32u, typ.UInt32)
7321 v11 := b.NewValue0(v.Pos, OpTrunc64to32, typ.UInt32)
7322 v11.AddArg(x)
7323 v10.AddArg2(v11, v8)
7324 v9.AddArg(v10)
7325 v1.AddArg2(v2, v9)
7326 v12 := b.NewValue0(v.Pos, OpMul64, typ.UInt64)
7327 v13 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
7328 v14 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32)
7329 v14.AddArg2(v5, v8)
7330 v13.AddArg(v14)
7331 v15 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7332 v15.AuxInt = int64ToAuxInt(int64((1 << 32) / c))
7333 v12.AddArg2(v13, v15)
7334 v0.AddArg2(v1, v12)
7335 v16 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
7336 v17 := b.NewValue0(v.Pos, OpDiv32u, typ.UInt32)
7337 v18 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32)
7338 v19 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32)
7339 v19.AddArg2(v11, v8)
7340 v20 := b.NewValue0(v.Pos, OpMul32, typ.UInt32)
7341 v21 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
7342 v21.AuxInt = int32ToAuxInt(int32((1 << 32) % c))
7343 v20.AddArg2(v14, v21)
7344 v18.AddArg2(v19, v20)
7345 v17.AddArg2(v18, v8)
7346 v16.AddArg(v17)
7347 v.AddArg2(v0, v16)
7348 return true
7349 }
7350
7351
7352
7353 for {
7354 x := v_0
7355 if v_1.Op != OpConst64 {
7356 break
7357 }
7358 c := auxIntToInt64(v_1.AuxInt)
7359 if !(umagicOK64(c) && config.RegSize == 8 && umagic64(c).m&1 == 0 && config.useHmul) {
7360 break
7361 }
7362 v.reset(OpRsh64Ux64)
7363 v.Type = typ.UInt64
7364 v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64)
7365 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7366 v1.AuxInt = int64ToAuxInt(int64(1<<63 + umagic64(c).m/2))
7367 v0.AddArg2(v1, x)
7368 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7369 v2.AuxInt = int64ToAuxInt(umagic64(c).s - 1)
7370 v.AddArg2(v0, v2)
7371 return true
7372 }
7373
7374
7375
7376 for {
7377 x := v_0
7378 if v_1.Op != OpConst64 {
7379 break
7380 }
7381 c := auxIntToInt64(v_1.AuxInt)
7382 if !(umagicOK64(c) && config.RegSize == 8 && c&1 == 0 && config.useHmul) {
7383 break
7384 }
7385 v.reset(OpRsh64Ux64)
7386 v.Type = typ.UInt64
7387 v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64)
7388 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7389 v1.AuxInt = int64ToAuxInt(int64(1<<63 + (umagic64(c).m+1)/2))
7390 v2 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64)
7391 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7392 v3.AuxInt = int64ToAuxInt(1)
7393 v2.AddArg2(x, v3)
7394 v0.AddArg2(v1, v2)
7395 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7396 v4.AuxInt = int64ToAuxInt(umagic64(c).s - 2)
7397 v.AddArg2(v0, v4)
7398 return true
7399 }
7400
7401
7402
7403 for {
7404 x := v_0
7405 if v_1.Op != OpConst64 {
7406 break
7407 }
7408 c := auxIntToInt64(v_1.AuxInt)
7409 if !(umagicOK64(c) && config.RegSize == 8 && config.useAvg && config.useHmul) {
7410 break
7411 }
7412 v.reset(OpRsh64Ux64)
7413 v.Type = typ.UInt64
7414 v0 := b.NewValue0(v.Pos, OpAvg64u, typ.UInt64)
7415 v1 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64)
7416 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7417 v2.AuxInt = int64ToAuxInt(int64(umagic64(c).m))
7418 v1.AddArg2(v2, x)
7419 v0.AddArg2(x, v1)
7420 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7421 v3.AuxInt = int64ToAuxInt(umagic64(c).s - 1)
7422 v.AddArg2(v0, v3)
7423 return true
7424 }
7425 return false
7426 }
7427 func rewriteValuegeneric_OpDiv8(v *Value) bool {
7428 v_1 := v.Args[1]
7429 v_0 := v.Args[0]
7430 b := v.Block
7431 typ := &b.Func.Config.Types
7432
7433
7434
7435 for {
7436 if v_0.Op != OpConst8 {
7437 break
7438 }
7439 c := auxIntToInt8(v_0.AuxInt)
7440 if v_1.Op != OpConst8 {
7441 break
7442 }
7443 d := auxIntToInt8(v_1.AuxInt)
7444 if !(d != 0) {
7445 break
7446 }
7447 v.reset(OpConst8)
7448 v.AuxInt = int8ToAuxInt(c / d)
7449 return true
7450 }
7451
7452
7453
7454 for {
7455 n := v_0
7456 if v_1.Op != OpConst8 {
7457 break
7458 }
7459 c := auxIntToInt8(v_1.AuxInt)
7460 if !(isNonNegative(n) && isPowerOfTwo(c)) {
7461 break
7462 }
7463 v.reset(OpRsh8Ux64)
7464 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7465 v0.AuxInt = int64ToAuxInt(log8(c))
7466 v.AddArg2(n, v0)
7467 return true
7468 }
7469
7470
7471
7472 for {
7473 t := v.Type
7474 n := v_0
7475 if v_1.Op != OpConst8 {
7476 break
7477 }
7478 c := auxIntToInt8(v_1.AuxInt)
7479 if !(c < 0 && c != -1<<7) {
7480 break
7481 }
7482 v.reset(OpNeg8)
7483 v0 := b.NewValue0(v.Pos, OpDiv8, t)
7484 v1 := b.NewValue0(v.Pos, OpConst8, t)
7485 v1.AuxInt = int8ToAuxInt(-c)
7486 v0.AddArg2(n, v1)
7487 v.AddArg(v0)
7488 return true
7489 }
7490
7491
7492 for {
7493 t := v.Type
7494 x := v_0
7495 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != -1<<7 {
7496 break
7497 }
7498 v.reset(OpRsh8Ux64)
7499 v0 := b.NewValue0(v.Pos, OpAnd8, t)
7500 v1 := b.NewValue0(v.Pos, OpNeg8, t)
7501 v1.AddArg(x)
7502 v0.AddArg2(x, v1)
7503 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7504 v2.AuxInt = int64ToAuxInt(7)
7505 v.AddArg2(v0, v2)
7506 return true
7507 }
7508
7509
7510
7511 for {
7512 t := v.Type
7513 n := v_0
7514 if v_1.Op != OpConst8 {
7515 break
7516 }
7517 c := auxIntToInt8(v_1.AuxInt)
7518 if !(isPowerOfTwo(c)) {
7519 break
7520 }
7521 v.reset(OpRsh8x64)
7522 v0 := b.NewValue0(v.Pos, OpAdd8, t)
7523 v1 := b.NewValue0(v.Pos, OpRsh8Ux64, t)
7524 v2 := b.NewValue0(v.Pos, OpRsh8x64, t)
7525 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7526 v3.AuxInt = int64ToAuxInt(7)
7527 v2.AddArg2(n, v3)
7528 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7529 v4.AuxInt = int64ToAuxInt(int64(8 - log8(c)))
7530 v1.AddArg2(v2, v4)
7531 v0.AddArg2(n, v1)
7532 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7533 v5.AuxInt = int64ToAuxInt(int64(log8(c)))
7534 v.AddArg2(v0, v5)
7535 return true
7536 }
7537
7538
7539
7540 for {
7541 t := v.Type
7542 x := v_0
7543 if v_1.Op != OpConst8 {
7544 break
7545 }
7546 c := auxIntToInt8(v_1.AuxInt)
7547 if !(smagicOK8(c)) {
7548 break
7549 }
7550 v.reset(OpSub8)
7551 v.Type = t
7552 v0 := b.NewValue0(v.Pos, OpRsh32x64, t)
7553 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32)
7554 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
7555 v2.AuxInt = int32ToAuxInt(int32(smagic8(c).m))
7556 v3 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
7557 v3.AddArg(x)
7558 v1.AddArg2(v2, v3)
7559 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7560 v4.AuxInt = int64ToAuxInt(8 + smagic8(c).s)
7561 v0.AddArg2(v1, v4)
7562 v5 := b.NewValue0(v.Pos, OpRsh32x64, t)
7563 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7564 v6.AuxInt = int64ToAuxInt(31)
7565 v5.AddArg2(v3, v6)
7566 v.AddArg2(v0, v5)
7567 return true
7568 }
7569 return false
7570 }
7571 func rewriteValuegeneric_OpDiv8u(v *Value) bool {
7572 v_1 := v.Args[1]
7573 v_0 := v.Args[0]
7574 b := v.Block
7575 typ := &b.Func.Config.Types
7576
7577
7578
7579 for {
7580 if v_0.Op != OpConst8 {
7581 break
7582 }
7583 c := auxIntToInt8(v_0.AuxInt)
7584 if v_1.Op != OpConst8 {
7585 break
7586 }
7587 d := auxIntToInt8(v_1.AuxInt)
7588 if !(d != 0) {
7589 break
7590 }
7591 v.reset(OpConst8)
7592 v.AuxInt = int8ToAuxInt(int8(uint8(c) / uint8(d)))
7593 return true
7594 }
7595
7596
7597
7598 for {
7599 n := v_0
7600 if v_1.Op != OpConst8 {
7601 break
7602 }
7603 c := auxIntToInt8(v_1.AuxInt)
7604 if !(isPowerOfTwo(c)) {
7605 break
7606 }
7607 v.reset(OpRsh8Ux64)
7608 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7609 v0.AuxInt = int64ToAuxInt(log8(c))
7610 v.AddArg2(n, v0)
7611 return true
7612 }
7613
7614
7615
7616 for {
7617 x := v_0
7618 if v_1.Op != OpConst8 {
7619 break
7620 }
7621 c := auxIntToInt8(v_1.AuxInt)
7622 if !(umagicOK8(c)) {
7623 break
7624 }
7625 v.reset(OpTrunc32to8)
7626 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32)
7627 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32)
7628 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
7629 v2.AuxInt = int32ToAuxInt(int32(1<<8 + umagic8(c).m))
7630 v3 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
7631 v3.AddArg(x)
7632 v1.AddArg2(v2, v3)
7633 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7634 v4.AuxInt = int64ToAuxInt(8 + umagic8(c).s)
7635 v0.AddArg2(v1, v4)
7636 v.AddArg(v0)
7637 return true
7638 }
7639 return false
7640 }
7641 func rewriteValuegeneric_OpEq16(v *Value) bool {
7642 v_1 := v.Args[1]
7643 v_0 := v.Args[0]
7644 b := v.Block
7645 config := b.Func.Config
7646 typ := &b.Func.Config.Types
7647
7648
7649 for {
7650 x := v_0
7651 if x != v_1 {
7652 break
7653 }
7654 v.reset(OpConstBool)
7655 v.AuxInt = boolToAuxInt(true)
7656 return true
7657 }
7658
7659
7660 for {
7661 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7662 if v_0.Op != OpConst16 {
7663 continue
7664 }
7665 t := v_0.Type
7666 c := auxIntToInt16(v_0.AuxInt)
7667 if v_1.Op != OpAdd16 {
7668 continue
7669 }
7670 _ = v_1.Args[1]
7671 v_1_0 := v_1.Args[0]
7672 v_1_1 := v_1.Args[1]
7673 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
7674 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
7675 continue
7676 }
7677 d := auxIntToInt16(v_1_0.AuxInt)
7678 x := v_1_1
7679 v.reset(OpEq16)
7680 v0 := b.NewValue0(v.Pos, OpConst16, t)
7681 v0.AuxInt = int16ToAuxInt(c - d)
7682 v.AddArg2(v0, x)
7683 return true
7684 }
7685 }
7686 break
7687 }
7688
7689
7690 for {
7691 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7692 if v_0.Op != OpConst16 {
7693 continue
7694 }
7695 c := auxIntToInt16(v_0.AuxInt)
7696 if v_1.Op != OpConst16 {
7697 continue
7698 }
7699 d := auxIntToInt16(v_1.AuxInt)
7700 v.reset(OpConstBool)
7701 v.AuxInt = boolToAuxInt(c == d)
7702 return true
7703 }
7704 break
7705 }
7706
7707
7708
7709 for {
7710 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7711 if v_0.Op != OpMod16u {
7712 continue
7713 }
7714 _ = v_0.Args[1]
7715 x := v_0.Args[0]
7716 v_0_1 := v_0.Args[1]
7717 if v_0_1.Op != OpConst16 {
7718 continue
7719 }
7720 c := auxIntToInt16(v_0_1.AuxInt)
7721 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(x.Op != OpConst16 && udivisibleOK16(c) && !hasSmallRotate(config)) {
7722 continue
7723 }
7724 v.reset(OpEq32)
7725 v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32)
7726 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
7727 v1.AddArg(x)
7728 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
7729 v2.AuxInt = int32ToAuxInt(int32(uint16(c)))
7730 v0.AddArg2(v1, v2)
7731 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
7732 v3.AuxInt = int32ToAuxInt(0)
7733 v.AddArg2(v0, v3)
7734 return true
7735 }
7736 break
7737 }
7738
7739
7740
7741 for {
7742 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7743 if v_0.Op != OpMod16 {
7744 continue
7745 }
7746 _ = v_0.Args[1]
7747 x := v_0.Args[0]
7748 v_0_1 := v_0.Args[1]
7749 if v_0_1.Op != OpConst16 {
7750 continue
7751 }
7752 c := auxIntToInt16(v_0_1.AuxInt)
7753 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(x.Op != OpConst16 && sdivisibleOK16(c) && !hasSmallRotate(config)) {
7754 continue
7755 }
7756 v.reset(OpEq32)
7757 v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32)
7758 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
7759 v1.AddArg(x)
7760 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
7761 v2.AuxInt = int32ToAuxInt(int32(c))
7762 v0.AddArg2(v1, v2)
7763 v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
7764 v3.AuxInt = int32ToAuxInt(0)
7765 v.AddArg2(v0, v3)
7766 return true
7767 }
7768 break
7769 }
7770
7771
7772
7773 for {
7774 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7775 x := v_0
7776 if v_1.Op != OpMul16 {
7777 continue
7778 }
7779 _ = v_1.Args[1]
7780 v_1_0 := v_1.Args[0]
7781 v_1_1 := v_1.Args[1]
7782 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
7783 if v_1_0.Op != OpConst16 {
7784 continue
7785 }
7786 c := auxIntToInt16(v_1_0.AuxInt)
7787 if v_1_1.Op != OpTrunc64to16 {
7788 continue
7789 }
7790 v_1_1_0 := v_1_1.Args[0]
7791 if v_1_1_0.Op != OpRsh64Ux64 {
7792 continue
7793 }
7794 _ = v_1_1_0.Args[1]
7795 mul := v_1_1_0.Args[0]
7796 if mul.Op != OpMul64 {
7797 continue
7798 }
7799 _ = mul.Args[1]
7800 mul_0 := mul.Args[0]
7801 mul_1 := mul.Args[1]
7802 for _i2 := 0; _i2 <= 1; _i2, mul_0, mul_1 = _i2+1, mul_1, mul_0 {
7803 if mul_0.Op != OpConst64 {
7804 continue
7805 }
7806 m := auxIntToInt64(mul_0.AuxInt)
7807 if mul_1.Op != OpZeroExt16to64 || x != mul_1.Args[0] {
7808 continue
7809 }
7810 v_1_1_0_1 := v_1_1_0.Args[1]
7811 if v_1_1_0_1.Op != OpConst64 {
7812 continue
7813 }
7814 s := auxIntToInt64(v_1_1_0_1.AuxInt)
7815 if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<16+umagic16(c).m) && s == 16+umagic16(c).s && x.Op != OpConst16 && udivisibleOK16(c)) {
7816 continue
7817 }
7818 v.reset(OpLeq16U)
7819 v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16)
7820 v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16)
7821 v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
7822 v2.AuxInt = int16ToAuxInt(int16(udivisible16(c).m))
7823 v1.AddArg2(v2, x)
7824 v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
7825 v3.AuxInt = int16ToAuxInt(int16(16 - udivisible16(c).k))
7826 v0.AddArg2(v1, v3)
7827 v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
7828 v4.AuxInt = int16ToAuxInt(int16(udivisible16(c).max))
7829 v.AddArg2(v0, v4)
7830 return true
7831 }
7832 }
7833 }
7834 break
7835 }
7836
7837
7838
7839 for {
7840 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7841 x := v_0
7842 if v_1.Op != OpMul16 {
7843 continue
7844 }
7845 _ = v_1.Args[1]
7846 v_1_0 := v_1.Args[0]
7847 v_1_1 := v_1.Args[1]
7848 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
7849 if v_1_0.Op != OpConst16 {
7850 continue
7851 }
7852 c := auxIntToInt16(v_1_0.AuxInt)
7853 if v_1_1.Op != OpTrunc32to16 {
7854 continue
7855 }
7856 v_1_1_0 := v_1_1.Args[0]
7857 if v_1_1_0.Op != OpRsh32Ux64 {
7858 continue
7859 }
7860 _ = v_1_1_0.Args[1]
7861 mul := v_1_1_0.Args[0]
7862 if mul.Op != OpMul32 {
7863 continue
7864 }
7865 _ = mul.Args[1]
7866 mul_0 := mul.Args[0]
7867 mul_1 := mul.Args[1]
7868 for _i2 := 0; _i2 <= 1; _i2, mul_0, mul_1 = _i2+1, mul_1, mul_0 {
7869 if mul_0.Op != OpConst32 {
7870 continue
7871 }
7872 m := auxIntToInt32(mul_0.AuxInt)
7873 if mul_1.Op != OpZeroExt16to32 || x != mul_1.Args[0] {
7874 continue
7875 }
7876 v_1_1_0_1 := v_1_1_0.Args[1]
7877 if v_1_1_0_1.Op != OpConst64 {
7878 continue
7879 }
7880 s := auxIntToInt64(v_1_1_0_1.AuxInt)
7881 if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int32(1<<15+umagic16(c).m/2) && s == 16+umagic16(c).s-1 && x.Op != OpConst16 && udivisibleOK16(c)) {
7882 continue
7883 }
7884 v.reset(OpLeq16U)
7885 v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16)
7886 v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16)
7887 v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
7888 v2.AuxInt = int16ToAuxInt(int16(udivisible16(c).m))
7889 v1.AddArg2(v2, x)
7890 v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
7891 v3.AuxInt = int16ToAuxInt(int16(16 - udivisible16(c).k))
7892 v0.AddArg2(v1, v3)
7893 v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
7894 v4.AuxInt = int16ToAuxInt(int16(udivisible16(c).max))
7895 v.AddArg2(v0, v4)
7896 return true
7897 }
7898 }
7899 }
7900 break
7901 }
7902
7903
7904
7905 for {
7906 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7907 x := v_0
7908 if v_1.Op != OpMul16 {
7909 continue
7910 }
7911 _ = v_1.Args[1]
7912 v_1_0 := v_1.Args[0]
7913 v_1_1 := v_1.Args[1]
7914 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
7915 if v_1_0.Op != OpConst16 {
7916 continue
7917 }
7918 c := auxIntToInt16(v_1_0.AuxInt)
7919 if v_1_1.Op != OpTrunc32to16 {
7920 continue
7921 }
7922 v_1_1_0 := v_1_1.Args[0]
7923 if v_1_1_0.Op != OpRsh32Ux64 {
7924 continue
7925 }
7926 _ = v_1_1_0.Args[1]
7927 mul := v_1_1_0.Args[0]
7928 if mul.Op != OpMul32 {
7929 continue
7930 }
7931 _ = mul.Args[1]
7932 mul_0 := mul.Args[0]
7933 mul_1 := mul.Args[1]
7934 for _i2 := 0; _i2 <= 1; _i2, mul_0, mul_1 = _i2+1, mul_1, mul_0 {
7935 if mul_0.Op != OpConst32 {
7936 continue
7937 }
7938 m := auxIntToInt32(mul_0.AuxInt)
7939 if mul_1.Op != OpRsh32Ux64 {
7940 continue
7941 }
7942 _ = mul_1.Args[1]
7943 mul_1_0 := mul_1.Args[0]
7944 if mul_1_0.Op != OpZeroExt16to32 || x != mul_1_0.Args[0] {
7945 continue
7946 }
7947 mul_1_1 := mul_1.Args[1]
7948 if mul_1_1.Op != OpConst64 || auxIntToInt64(mul_1_1.AuxInt) != 1 {
7949 continue
7950 }
7951 v_1_1_0_1 := v_1_1_0.Args[1]
7952 if v_1_1_0_1.Op != OpConst64 {
7953 continue
7954 }
7955 s := auxIntToInt64(v_1_1_0_1.AuxInt)
7956 if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int32(1<<15+(umagic16(c).m+1)/2) && s == 16+umagic16(c).s-2 && x.Op != OpConst16 && udivisibleOK16(c)) {
7957 continue
7958 }
7959 v.reset(OpLeq16U)
7960 v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16)
7961 v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16)
7962 v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
7963 v2.AuxInt = int16ToAuxInt(int16(udivisible16(c).m))
7964 v1.AddArg2(v2, x)
7965 v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
7966 v3.AuxInt = int16ToAuxInt(int16(16 - udivisible16(c).k))
7967 v0.AddArg2(v1, v3)
7968 v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
7969 v4.AuxInt = int16ToAuxInt(int16(udivisible16(c).max))
7970 v.AddArg2(v0, v4)
7971 return true
7972 }
7973 }
7974 }
7975 break
7976 }
7977
7978
7979
7980 for {
7981 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7982 x := v_0
7983 if v_1.Op != OpMul16 {
7984 continue
7985 }
7986 _ = v_1.Args[1]
7987 v_1_0 := v_1.Args[0]
7988 v_1_1 := v_1.Args[1]
7989 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
7990 if v_1_0.Op != OpConst16 {
7991 continue
7992 }
7993 c := auxIntToInt16(v_1_0.AuxInt)
7994 if v_1_1.Op != OpTrunc32to16 {
7995 continue
7996 }
7997 v_1_1_0 := v_1_1.Args[0]
7998 if v_1_1_0.Op != OpRsh32Ux64 {
7999 continue
8000 }
8001 _ = v_1_1_0.Args[1]
8002 v_1_1_0_0 := v_1_1_0.Args[0]
8003 if v_1_1_0_0.Op != OpAvg32u {
8004 continue
8005 }
8006 _ = v_1_1_0_0.Args[1]
8007 v_1_1_0_0_0 := v_1_1_0_0.Args[0]
8008 if v_1_1_0_0_0.Op != OpLsh32x64 {
8009 continue
8010 }
8011 _ = v_1_1_0_0_0.Args[1]
8012 v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0]
8013 if v_1_1_0_0_0_0.Op != OpZeroExt16to32 || x != v_1_1_0_0_0_0.Args[0] {
8014 continue
8015 }
8016 v_1_1_0_0_0_1 := v_1_1_0_0_0.Args[1]
8017 if v_1_1_0_0_0_1.Op != OpConst64 || auxIntToInt64(v_1_1_0_0_0_1.AuxInt) != 16 {
8018 continue
8019 }
8020 mul := v_1_1_0_0.Args[1]
8021 if mul.Op != OpMul32 {
8022 continue
8023 }
8024 _ = mul.Args[1]
8025 mul_0 := mul.Args[0]
8026 mul_1 := mul.Args[1]
8027 for _i2 := 0; _i2 <= 1; _i2, mul_0, mul_1 = _i2+1, mul_1, mul_0 {
8028 if mul_0.Op != OpConst32 {
8029 continue
8030 }
8031 m := auxIntToInt32(mul_0.AuxInt)
8032 if mul_1.Op != OpZeroExt16to32 || x != mul_1.Args[0] {
8033 continue
8034 }
8035 v_1_1_0_1 := v_1_1_0.Args[1]
8036 if v_1_1_0_1.Op != OpConst64 {
8037 continue
8038 }
8039 s := auxIntToInt64(v_1_1_0_1.AuxInt)
8040 if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int32(umagic16(c).m) && s == 16+umagic16(c).s-1 && x.Op != OpConst16 && udivisibleOK16(c)) {
8041 continue
8042 }
8043 v.reset(OpLeq16U)
8044 v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16)
8045 v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16)
8046 v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
8047 v2.AuxInt = int16ToAuxInt(int16(udivisible16(c).m))
8048 v1.AddArg2(v2, x)
8049 v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
8050 v3.AuxInt = int16ToAuxInt(int16(16 - udivisible16(c).k))
8051 v0.AddArg2(v1, v3)
8052 v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
8053 v4.AuxInt = int16ToAuxInt(int16(udivisible16(c).max))
8054 v.AddArg2(v0, v4)
8055 return true
8056 }
8057 }
8058 }
8059 break
8060 }
8061
8062
8063
8064 for {
8065 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8066 x := v_0
8067 if v_1.Op != OpMul16 {
8068 continue
8069 }
8070 _ = v_1.Args[1]
8071 v_1_0 := v_1.Args[0]
8072 v_1_1 := v_1.Args[1]
8073 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8074 if v_1_0.Op != OpConst16 {
8075 continue
8076 }
8077 c := auxIntToInt16(v_1_0.AuxInt)
8078 if v_1_1.Op != OpSub16 {
8079 continue
8080 }
8081 _ = v_1_1.Args[1]
8082 v_1_1_0 := v_1_1.Args[0]
8083 if v_1_1_0.Op != OpRsh32x64 {
8084 continue
8085 }
8086 _ = v_1_1_0.Args[1]
8087 mul := v_1_1_0.Args[0]
8088 if mul.Op != OpMul32 {
8089 continue
8090 }
8091 _ = mul.Args[1]
8092 mul_0 := mul.Args[0]
8093 mul_1 := mul.Args[1]
8094 for _i2 := 0; _i2 <= 1; _i2, mul_0, mul_1 = _i2+1, mul_1, mul_0 {
8095 if mul_0.Op != OpConst32 {
8096 continue
8097 }
8098 m := auxIntToInt32(mul_0.AuxInt)
8099 if mul_1.Op != OpSignExt16to32 || x != mul_1.Args[0] {
8100 continue
8101 }
8102 v_1_1_0_1 := v_1_1_0.Args[1]
8103 if v_1_1_0_1.Op != OpConst64 {
8104 continue
8105 }
8106 s := auxIntToInt64(v_1_1_0_1.AuxInt)
8107 v_1_1_1 := v_1_1.Args[1]
8108 if v_1_1_1.Op != OpRsh32x64 {
8109 continue
8110 }
8111 _ = v_1_1_1.Args[1]
8112 v_1_1_1_0 := v_1_1_1.Args[0]
8113 if v_1_1_1_0.Op != OpSignExt16to32 || x != v_1_1_1_0.Args[0] {
8114 continue
8115 }
8116 v_1_1_1_1 := v_1_1_1.Args[1]
8117 if v_1_1_1_1.Op != OpConst64 || auxIntToInt64(v_1_1_1_1.AuxInt) != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int32(smagic16(c).m) && s == 16+smagic16(c).s && x.Op != OpConst16 && sdivisibleOK16(c)) {
8118 continue
8119 }
8120 v.reset(OpLeq16U)
8121 v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16)
8122 v1 := b.NewValue0(v.Pos, OpAdd16, typ.UInt16)
8123 v2 := b.NewValue0(v.Pos, OpMul16, typ.UInt16)
8124 v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
8125 v3.AuxInt = int16ToAuxInt(int16(sdivisible16(c).m))
8126 v2.AddArg2(v3, x)
8127 v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
8128 v4.AuxInt = int16ToAuxInt(int16(sdivisible16(c).a))
8129 v1.AddArg2(v2, v4)
8130 v5 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
8131 v5.AuxInt = int16ToAuxInt(int16(16 - sdivisible16(c).k))
8132 v0.AddArg2(v1, v5)
8133 v6 := b.NewValue0(v.Pos, OpConst16, typ.UInt16)
8134 v6.AuxInt = int16ToAuxInt(int16(sdivisible16(c).max))
8135 v.AddArg2(v0, v6)
8136 return true
8137 }
8138 }
8139 }
8140 break
8141 }
8142
8143
8144
8145 for {
8146 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8147 n := v_0
8148 if v_1.Op != OpLsh16x64 {
8149 continue
8150 }
8151 _ = v_1.Args[1]
8152 v_1_0 := v_1.Args[0]
8153 if v_1_0.Op != OpRsh16x64 {
8154 continue
8155 }
8156 _ = v_1_0.Args[1]
8157 v_1_0_0 := v_1_0.Args[0]
8158 if v_1_0_0.Op != OpAdd16 {
8159 continue
8160 }
8161 t := v_1_0_0.Type
8162 _ = v_1_0_0.Args[1]
8163 v_1_0_0_0 := v_1_0_0.Args[0]
8164 v_1_0_0_1 := v_1_0_0.Args[1]
8165 for _i1 := 0; _i1 <= 1; _i1, v_1_0_0_0, v_1_0_0_1 = _i1+1, v_1_0_0_1, v_1_0_0_0 {
8166 if n != v_1_0_0_0 || v_1_0_0_1.Op != OpRsh16Ux64 || v_1_0_0_1.Type != t {
8167 continue
8168 }
8169 _ = v_1_0_0_1.Args[1]
8170 v_1_0_0_1_0 := v_1_0_0_1.Args[0]
8171 if v_1_0_0_1_0.Op != OpRsh16x64 || v_1_0_0_1_0.Type != t {
8172 continue
8173 }
8174 _ = v_1_0_0_1_0.Args[1]
8175 if n != v_1_0_0_1_0.Args[0] {
8176 continue
8177 }
8178 v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1]
8179 if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || auxIntToInt64(v_1_0_0_1_0_1.AuxInt) != 15 {
8180 continue
8181 }
8182 v_1_0_0_1_1 := v_1_0_0_1.Args[1]
8183 if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 {
8184 continue
8185 }
8186 kbar := auxIntToInt64(v_1_0_0_1_1.AuxInt)
8187 v_1_0_1 := v_1_0.Args[1]
8188 if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 {
8189 continue
8190 }
8191 k := auxIntToInt64(v_1_0_1.AuxInt)
8192 v_1_1 := v_1.Args[1]
8193 if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || auxIntToInt64(v_1_1.AuxInt) != k || !(k > 0 && k < 15 && kbar == 16-k) {
8194 continue
8195 }
8196 v.reset(OpEq16)
8197 v0 := b.NewValue0(v.Pos, OpAnd16, t)
8198 v1 := b.NewValue0(v.Pos, OpConst16, t)
8199 v1.AuxInt = int16ToAuxInt(1<<uint(k) - 1)
8200 v0.AddArg2(n, v1)
8201 v2 := b.NewValue0(v.Pos, OpConst16, t)
8202 v2.AuxInt = int16ToAuxInt(0)
8203 v.AddArg2(v0, v2)
8204 return true
8205 }
8206 }
8207 break
8208 }
8209
8210
8211
8212 for {
8213 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8214 s := v_0
8215 if s.Op != OpSub16 {
8216 continue
8217 }
8218 y := s.Args[1]
8219 x := s.Args[0]
8220 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(s.Uses == 1) {
8221 continue
8222 }
8223 v.reset(OpEq16)
8224 v.AddArg2(x, y)
8225 return true
8226 }
8227 break
8228 }
8229
8230
8231
8232 for {
8233 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8234 if v_0.Op != OpAnd16 {
8235 continue
8236 }
8237 t := v_0.Type
8238 _ = v_0.Args[1]
8239 v_0_0 := v_0.Args[0]
8240 v_0_1 := v_0.Args[1]
8241 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
8242 x := v_0_0
8243 if v_0_1.Op != OpConst16 || v_0_1.Type != t {
8244 continue
8245 }
8246 y := auxIntToInt16(v_0_1.AuxInt)
8247 if v_1.Op != OpConst16 || v_1.Type != t || auxIntToInt16(v_1.AuxInt) != y || !(oneBit16(y)) {
8248 continue
8249 }
8250 v.reset(OpNeq16)
8251 v0 := b.NewValue0(v.Pos, OpAnd16, t)
8252 v1 := b.NewValue0(v.Pos, OpConst16, t)
8253 v1.AuxInt = int16ToAuxInt(y)
8254 v0.AddArg2(x, v1)
8255 v2 := b.NewValue0(v.Pos, OpConst16, t)
8256 v2.AuxInt = int16ToAuxInt(0)
8257 v.AddArg2(v0, v2)
8258 return true
8259 }
8260 }
8261 break
8262 }
8263 return false
8264 }
8265 func rewriteValuegeneric_OpEq32(v *Value) bool {
8266 v_1 := v.Args[1]
8267 v_0 := v.Args[0]
8268 b := v.Block
8269 typ := &b.Func.Config.Types
8270
8271
8272 for {
8273 x := v_0
8274 if x != v_1 {
8275 break
8276 }
8277 v.reset(OpConstBool)
8278 v.AuxInt = boolToAuxInt(true)
8279 return true
8280 }
8281
8282
8283 for {
8284 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8285 if v_0.Op != OpConst32 {
8286 continue
8287 }
8288 t := v_0.Type
8289 c := auxIntToInt32(v_0.AuxInt)
8290 if v_1.Op != OpAdd32 {
8291 continue
8292 }
8293 _ = v_1.Args[1]
8294 v_1_0 := v_1.Args[0]
8295 v_1_1 := v_1.Args[1]
8296 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8297 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
8298 continue
8299 }
8300 d := auxIntToInt32(v_1_0.AuxInt)
8301 x := v_1_1
8302 v.reset(OpEq32)
8303 v0 := b.NewValue0(v.Pos, OpConst32, t)
8304 v0.AuxInt = int32ToAuxInt(c - d)
8305 v.AddArg2(v0, x)
8306 return true
8307 }
8308 }
8309 break
8310 }
8311
8312
8313 for {
8314 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8315 if v_0.Op != OpConst32 {
8316 continue
8317 }
8318 c := auxIntToInt32(v_0.AuxInt)
8319 if v_1.Op != OpConst32 {
8320 continue
8321 }
8322 d := auxIntToInt32(v_1.AuxInt)
8323 v.reset(OpConstBool)
8324 v.AuxInt = boolToAuxInt(c == d)
8325 return true
8326 }
8327 break
8328 }
8329
8330
8331
8332 for {
8333 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8334 x := v_0
8335 if v_1.Op != OpMul32 {
8336 continue
8337 }
8338 _ = v_1.Args[1]
8339 v_1_0 := v_1.Args[0]
8340 v_1_1 := v_1.Args[1]
8341 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8342 if v_1_0.Op != OpConst32 {
8343 continue
8344 }
8345 c := auxIntToInt32(v_1_0.AuxInt)
8346 if v_1_1.Op != OpRsh32Ux64 {
8347 continue
8348 }
8349 _ = v_1_1.Args[1]
8350 mul := v_1_1.Args[0]
8351 if mul.Op != OpHmul32u {
8352 continue
8353 }
8354 _ = mul.Args[1]
8355 mul_0 := mul.Args[0]
8356 mul_1 := mul.Args[1]
8357 for _i2 := 0; _i2 <= 1; _i2, mul_0, mul_1 = _i2+1, mul_1, mul_0 {
8358 if mul_0.Op != OpConst32 {
8359 continue
8360 }
8361 m := auxIntToInt32(mul_0.AuxInt)
8362 if x != mul_1 {
8363 continue
8364 }
8365 v_1_1_1 := v_1_1.Args[1]
8366 if v_1_1_1.Op != OpConst64 {
8367 continue
8368 }
8369 s := auxIntToInt64(v_1_1_1.AuxInt)
8370 if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int32(1<<31+umagic32(c).m/2) && s == umagic32(c).s-1 && x.Op != OpConst32 && udivisibleOK32(c)) {
8371 continue
8372 }
8373 v.reset(OpLeq32U)
8374 v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32)
8375 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32)
8376 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8377 v2.AuxInt = int32ToAuxInt(int32(udivisible32(c).m))
8378 v1.AddArg2(v2, x)
8379 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8380 v3.AuxInt = int32ToAuxInt(int32(32 - udivisible32(c).k))
8381 v0.AddArg2(v1, v3)
8382 v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8383 v4.AuxInt = int32ToAuxInt(int32(udivisible32(c).max))
8384 v.AddArg2(v0, v4)
8385 return true
8386 }
8387 }
8388 }
8389 break
8390 }
8391
8392
8393
8394 for {
8395 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8396 x := v_0
8397 if v_1.Op != OpMul32 {
8398 continue
8399 }
8400 _ = v_1.Args[1]
8401 v_1_0 := v_1.Args[0]
8402 v_1_1 := v_1.Args[1]
8403 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8404 if v_1_0.Op != OpConst32 {
8405 continue
8406 }
8407 c := auxIntToInt32(v_1_0.AuxInt)
8408 if v_1_1.Op != OpRsh32Ux64 {
8409 continue
8410 }
8411 _ = v_1_1.Args[1]
8412 mul := v_1_1.Args[0]
8413 if mul.Op != OpHmul32u {
8414 continue
8415 }
8416 _ = mul.Args[1]
8417 mul_0 := mul.Args[0]
8418 mul_1 := mul.Args[1]
8419 for _i2 := 0; _i2 <= 1; _i2, mul_0, mul_1 = _i2+1, mul_1, mul_0 {
8420 if mul_0.Op != OpConst32 || mul_0.Type != typ.UInt32 {
8421 continue
8422 }
8423 m := auxIntToInt32(mul_0.AuxInt)
8424 if mul_1.Op != OpRsh32Ux64 {
8425 continue
8426 }
8427 _ = mul_1.Args[1]
8428 if x != mul_1.Args[0] {
8429 continue
8430 }
8431 mul_1_1 := mul_1.Args[1]
8432 if mul_1_1.Op != OpConst64 || auxIntToInt64(mul_1_1.AuxInt) != 1 {
8433 continue
8434 }
8435 v_1_1_1 := v_1_1.Args[1]
8436 if v_1_1_1.Op != OpConst64 {
8437 continue
8438 }
8439 s := auxIntToInt64(v_1_1_1.AuxInt)
8440 if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int32(1<<31+(umagic32(c).m+1)/2) && s == umagic32(c).s-2 && x.Op != OpConst32 && udivisibleOK32(c)) {
8441 continue
8442 }
8443 v.reset(OpLeq32U)
8444 v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32)
8445 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32)
8446 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8447 v2.AuxInt = int32ToAuxInt(int32(udivisible32(c).m))
8448 v1.AddArg2(v2, x)
8449 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8450 v3.AuxInt = int32ToAuxInt(int32(32 - udivisible32(c).k))
8451 v0.AddArg2(v1, v3)
8452 v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8453 v4.AuxInt = int32ToAuxInt(int32(udivisible32(c).max))
8454 v.AddArg2(v0, v4)
8455 return true
8456 }
8457 }
8458 }
8459 break
8460 }
8461
8462
8463
8464 for {
8465 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8466 x := v_0
8467 if v_1.Op != OpMul32 {
8468 continue
8469 }
8470 _ = v_1.Args[1]
8471 v_1_0 := v_1.Args[0]
8472 v_1_1 := v_1.Args[1]
8473 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8474 if v_1_0.Op != OpConst32 {
8475 continue
8476 }
8477 c := auxIntToInt32(v_1_0.AuxInt)
8478 if v_1_1.Op != OpRsh32Ux64 {
8479 continue
8480 }
8481 _ = v_1_1.Args[1]
8482 v_1_1_0 := v_1_1.Args[0]
8483 if v_1_1_0.Op != OpAvg32u {
8484 continue
8485 }
8486 _ = v_1_1_0.Args[1]
8487 if x != v_1_1_0.Args[0] {
8488 continue
8489 }
8490 mul := v_1_1_0.Args[1]
8491 if mul.Op != OpHmul32u {
8492 continue
8493 }
8494 _ = mul.Args[1]
8495 mul_0 := mul.Args[0]
8496 mul_1 := mul.Args[1]
8497 for _i2 := 0; _i2 <= 1; _i2, mul_0, mul_1 = _i2+1, mul_1, mul_0 {
8498 if mul_0.Op != OpConst32 {
8499 continue
8500 }
8501 m := auxIntToInt32(mul_0.AuxInt)
8502 if x != mul_1 {
8503 continue
8504 }
8505 v_1_1_1 := v_1_1.Args[1]
8506 if v_1_1_1.Op != OpConst64 {
8507 continue
8508 }
8509 s := auxIntToInt64(v_1_1_1.AuxInt)
8510 if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int32(umagic32(c).m) && s == umagic32(c).s-1 && x.Op != OpConst32 && udivisibleOK32(c)) {
8511 continue
8512 }
8513 v.reset(OpLeq32U)
8514 v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32)
8515 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32)
8516 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8517 v2.AuxInt = int32ToAuxInt(int32(udivisible32(c).m))
8518 v1.AddArg2(v2, x)
8519 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8520 v3.AuxInt = int32ToAuxInt(int32(32 - udivisible32(c).k))
8521 v0.AddArg2(v1, v3)
8522 v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8523 v4.AuxInt = int32ToAuxInt(int32(udivisible32(c).max))
8524 v.AddArg2(v0, v4)
8525 return true
8526 }
8527 }
8528 }
8529 break
8530 }
8531
8532
8533
8534 for {
8535 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8536 x := v_0
8537 if v_1.Op != OpMul32 {
8538 continue
8539 }
8540 _ = v_1.Args[1]
8541 v_1_0 := v_1.Args[0]
8542 v_1_1 := v_1.Args[1]
8543 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8544 if v_1_0.Op != OpConst32 {
8545 continue
8546 }
8547 c := auxIntToInt32(v_1_0.AuxInt)
8548 if v_1_1.Op != OpTrunc64to32 {
8549 continue
8550 }
8551 v_1_1_0 := v_1_1.Args[0]
8552 if v_1_1_0.Op != OpRsh64Ux64 {
8553 continue
8554 }
8555 _ = v_1_1_0.Args[1]
8556 mul := v_1_1_0.Args[0]
8557 if mul.Op != OpMul64 {
8558 continue
8559 }
8560 _ = mul.Args[1]
8561 mul_0 := mul.Args[0]
8562 mul_1 := mul.Args[1]
8563 for _i2 := 0; _i2 <= 1; _i2, mul_0, mul_1 = _i2+1, mul_1, mul_0 {
8564 if mul_0.Op != OpConst64 {
8565 continue
8566 }
8567 m := auxIntToInt64(mul_0.AuxInt)
8568 if mul_1.Op != OpZeroExt32to64 || x != mul_1.Args[0] {
8569 continue
8570 }
8571 v_1_1_0_1 := v_1_1_0.Args[1]
8572 if v_1_1_0_1.Op != OpConst64 {
8573 continue
8574 }
8575 s := auxIntToInt64(v_1_1_0_1.AuxInt)
8576 if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+umagic32(c).m/2) && s == 32+umagic32(c).s-1 && x.Op != OpConst32 && udivisibleOK32(c)) {
8577 continue
8578 }
8579 v.reset(OpLeq32U)
8580 v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32)
8581 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32)
8582 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8583 v2.AuxInt = int32ToAuxInt(int32(udivisible32(c).m))
8584 v1.AddArg2(v2, x)
8585 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8586 v3.AuxInt = int32ToAuxInt(int32(32 - udivisible32(c).k))
8587 v0.AddArg2(v1, v3)
8588 v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8589 v4.AuxInt = int32ToAuxInt(int32(udivisible32(c).max))
8590 v.AddArg2(v0, v4)
8591 return true
8592 }
8593 }
8594 }
8595 break
8596 }
8597
8598
8599
8600 for {
8601 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8602 x := v_0
8603 if v_1.Op != OpMul32 {
8604 continue
8605 }
8606 _ = v_1.Args[1]
8607 v_1_0 := v_1.Args[0]
8608 v_1_1 := v_1.Args[1]
8609 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8610 if v_1_0.Op != OpConst32 {
8611 continue
8612 }
8613 c := auxIntToInt32(v_1_0.AuxInt)
8614 if v_1_1.Op != OpTrunc64to32 {
8615 continue
8616 }
8617 v_1_1_0 := v_1_1.Args[0]
8618 if v_1_1_0.Op != OpRsh64Ux64 {
8619 continue
8620 }
8621 _ = v_1_1_0.Args[1]
8622 mul := v_1_1_0.Args[0]
8623 if mul.Op != OpMul64 {
8624 continue
8625 }
8626 _ = mul.Args[1]
8627 mul_0 := mul.Args[0]
8628 mul_1 := mul.Args[1]
8629 for _i2 := 0; _i2 <= 1; _i2, mul_0, mul_1 = _i2+1, mul_1, mul_0 {
8630 if mul_0.Op != OpConst64 {
8631 continue
8632 }
8633 m := auxIntToInt64(mul_0.AuxInt)
8634 if mul_1.Op != OpRsh64Ux64 {
8635 continue
8636 }
8637 _ = mul_1.Args[1]
8638 mul_1_0 := mul_1.Args[0]
8639 if mul_1_0.Op != OpZeroExt32to64 || x != mul_1_0.Args[0] {
8640 continue
8641 }
8642 mul_1_1 := mul_1.Args[1]
8643 if mul_1_1.Op != OpConst64 || auxIntToInt64(mul_1_1.AuxInt) != 1 {
8644 continue
8645 }
8646 v_1_1_0_1 := v_1_1_0.Args[1]
8647 if v_1_1_0_1.Op != OpConst64 {
8648 continue
8649 }
8650 s := auxIntToInt64(v_1_1_0_1.AuxInt)
8651 if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+(umagic32(c).m+1)/2) && s == 32+umagic32(c).s-2 && x.Op != OpConst32 && udivisibleOK32(c)) {
8652 continue
8653 }
8654 v.reset(OpLeq32U)
8655 v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32)
8656 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32)
8657 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8658 v2.AuxInt = int32ToAuxInt(int32(udivisible32(c).m))
8659 v1.AddArg2(v2, x)
8660 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8661 v3.AuxInt = int32ToAuxInt(int32(32 - udivisible32(c).k))
8662 v0.AddArg2(v1, v3)
8663 v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8664 v4.AuxInt = int32ToAuxInt(int32(udivisible32(c).max))
8665 v.AddArg2(v0, v4)
8666 return true
8667 }
8668 }
8669 }
8670 break
8671 }
8672
8673
8674
8675 for {
8676 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8677 x := v_0
8678 if v_1.Op != OpMul32 {
8679 continue
8680 }
8681 _ = v_1.Args[1]
8682 v_1_0 := v_1.Args[0]
8683 v_1_1 := v_1.Args[1]
8684 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8685 if v_1_0.Op != OpConst32 {
8686 continue
8687 }
8688 c := auxIntToInt32(v_1_0.AuxInt)
8689 if v_1_1.Op != OpTrunc64to32 {
8690 continue
8691 }
8692 v_1_1_0 := v_1_1.Args[0]
8693 if v_1_1_0.Op != OpRsh64Ux64 {
8694 continue
8695 }
8696 _ = v_1_1_0.Args[1]
8697 v_1_1_0_0 := v_1_1_0.Args[0]
8698 if v_1_1_0_0.Op != OpAvg64u {
8699 continue
8700 }
8701 _ = v_1_1_0_0.Args[1]
8702 v_1_1_0_0_0 := v_1_1_0_0.Args[0]
8703 if v_1_1_0_0_0.Op != OpLsh64x64 {
8704 continue
8705 }
8706 _ = v_1_1_0_0_0.Args[1]
8707 v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0]
8708 if v_1_1_0_0_0_0.Op != OpZeroExt32to64 || x != v_1_1_0_0_0_0.Args[0] {
8709 continue
8710 }
8711 v_1_1_0_0_0_1 := v_1_1_0_0_0.Args[1]
8712 if v_1_1_0_0_0_1.Op != OpConst64 || auxIntToInt64(v_1_1_0_0_0_1.AuxInt) != 32 {
8713 continue
8714 }
8715 mul := v_1_1_0_0.Args[1]
8716 if mul.Op != OpMul64 {
8717 continue
8718 }
8719 _ = mul.Args[1]
8720 mul_0 := mul.Args[0]
8721 mul_1 := mul.Args[1]
8722 for _i2 := 0; _i2 <= 1; _i2, mul_0, mul_1 = _i2+1, mul_1, mul_0 {
8723 if mul_0.Op != OpConst64 {
8724 continue
8725 }
8726 m := auxIntToInt64(mul_0.AuxInt)
8727 if mul_1.Op != OpZeroExt32to64 || x != mul_1.Args[0] {
8728 continue
8729 }
8730 v_1_1_0_1 := v_1_1_0.Args[1]
8731 if v_1_1_0_1.Op != OpConst64 {
8732 continue
8733 }
8734 s := auxIntToInt64(v_1_1_0_1.AuxInt)
8735 if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic32(c).m) && s == 32+umagic32(c).s-1 && x.Op != OpConst32 && udivisibleOK32(c)) {
8736 continue
8737 }
8738 v.reset(OpLeq32U)
8739 v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32)
8740 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32)
8741 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8742 v2.AuxInt = int32ToAuxInt(int32(udivisible32(c).m))
8743 v1.AddArg2(v2, x)
8744 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8745 v3.AuxInt = int32ToAuxInt(int32(32 - udivisible32(c).k))
8746 v0.AddArg2(v1, v3)
8747 v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8748 v4.AuxInt = int32ToAuxInt(int32(udivisible32(c).max))
8749 v.AddArg2(v0, v4)
8750 return true
8751 }
8752 }
8753 }
8754 break
8755 }
8756
8757
8758
8759 for {
8760 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8761 x := v_0
8762 if v_1.Op != OpMul32 {
8763 continue
8764 }
8765 _ = v_1.Args[1]
8766 v_1_0 := v_1.Args[0]
8767 v_1_1 := v_1.Args[1]
8768 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8769 if v_1_0.Op != OpConst32 {
8770 continue
8771 }
8772 c := auxIntToInt32(v_1_0.AuxInt)
8773 if v_1_1.Op != OpSub32 {
8774 continue
8775 }
8776 _ = v_1_1.Args[1]
8777 v_1_1_0 := v_1_1.Args[0]
8778 if v_1_1_0.Op != OpRsh64x64 {
8779 continue
8780 }
8781 _ = v_1_1_0.Args[1]
8782 mul := v_1_1_0.Args[0]
8783 if mul.Op != OpMul64 {
8784 continue
8785 }
8786 _ = mul.Args[1]
8787 mul_0 := mul.Args[0]
8788 mul_1 := mul.Args[1]
8789 for _i2 := 0; _i2 <= 1; _i2, mul_0, mul_1 = _i2+1, mul_1, mul_0 {
8790 if mul_0.Op != OpConst64 {
8791 continue
8792 }
8793 m := auxIntToInt64(mul_0.AuxInt)
8794 if mul_1.Op != OpSignExt32to64 || x != mul_1.Args[0] {
8795 continue
8796 }
8797 v_1_1_0_1 := v_1_1_0.Args[1]
8798 if v_1_1_0_1.Op != OpConst64 {
8799 continue
8800 }
8801 s := auxIntToInt64(v_1_1_0_1.AuxInt)
8802 v_1_1_1 := v_1_1.Args[1]
8803 if v_1_1_1.Op != OpRsh64x64 {
8804 continue
8805 }
8806 _ = v_1_1_1.Args[1]
8807 v_1_1_1_0 := v_1_1_1.Args[0]
8808 if v_1_1_1_0.Op != OpSignExt32to64 || x != v_1_1_1_0.Args[0] {
8809 continue
8810 }
8811 v_1_1_1_1 := v_1_1_1.Args[1]
8812 if v_1_1_1_1.Op != OpConst64 || auxIntToInt64(v_1_1_1_1.AuxInt) != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic32(c).m) && s == 32+smagic32(c).s && x.Op != OpConst32 && sdivisibleOK32(c)) {
8813 continue
8814 }
8815 v.reset(OpLeq32U)
8816 v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32)
8817 v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32)
8818 v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32)
8819 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8820 v3.AuxInt = int32ToAuxInt(int32(sdivisible32(c).m))
8821 v2.AddArg2(v3, x)
8822 v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8823 v4.AuxInt = int32ToAuxInt(int32(sdivisible32(c).a))
8824 v1.AddArg2(v2, v4)
8825 v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8826 v5.AuxInt = int32ToAuxInt(int32(32 - sdivisible32(c).k))
8827 v0.AddArg2(v1, v5)
8828 v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8829 v6.AuxInt = int32ToAuxInt(int32(sdivisible32(c).max))
8830 v.AddArg2(v0, v6)
8831 return true
8832 }
8833 }
8834 }
8835 break
8836 }
8837
8838
8839
8840 for {
8841 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8842 x := v_0
8843 if v_1.Op != OpMul32 {
8844 continue
8845 }
8846 _ = v_1.Args[1]
8847 v_1_0 := v_1.Args[0]
8848 v_1_1 := v_1.Args[1]
8849 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8850 if v_1_0.Op != OpConst32 {
8851 continue
8852 }
8853 c := auxIntToInt32(v_1_0.AuxInt)
8854 if v_1_1.Op != OpSub32 {
8855 continue
8856 }
8857 _ = v_1_1.Args[1]
8858 v_1_1_0 := v_1_1.Args[0]
8859 if v_1_1_0.Op != OpRsh32x64 {
8860 continue
8861 }
8862 _ = v_1_1_0.Args[1]
8863 mul := v_1_1_0.Args[0]
8864 if mul.Op != OpHmul32 {
8865 continue
8866 }
8867 _ = mul.Args[1]
8868 mul_0 := mul.Args[0]
8869 mul_1 := mul.Args[1]
8870 for _i2 := 0; _i2 <= 1; _i2, mul_0, mul_1 = _i2+1, mul_1, mul_0 {
8871 if mul_0.Op != OpConst32 {
8872 continue
8873 }
8874 m := auxIntToInt32(mul_0.AuxInt)
8875 if x != mul_1 {
8876 continue
8877 }
8878 v_1_1_0_1 := v_1_1_0.Args[1]
8879 if v_1_1_0_1.Op != OpConst64 {
8880 continue
8881 }
8882 s := auxIntToInt64(v_1_1_0_1.AuxInt)
8883 v_1_1_1 := v_1_1.Args[1]
8884 if v_1_1_1.Op != OpRsh32x64 {
8885 continue
8886 }
8887 _ = v_1_1_1.Args[1]
8888 if x != v_1_1_1.Args[0] {
8889 continue
8890 }
8891 v_1_1_1_1 := v_1_1_1.Args[1]
8892 if v_1_1_1_1.Op != OpConst64 || auxIntToInt64(v_1_1_1_1.AuxInt) != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int32(smagic32(c).m/2) && s == smagic32(c).s-1 && x.Op != OpConst32 && sdivisibleOK32(c)) {
8893 continue
8894 }
8895 v.reset(OpLeq32U)
8896 v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32)
8897 v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32)
8898 v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32)
8899 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8900 v3.AuxInt = int32ToAuxInt(int32(sdivisible32(c).m))
8901 v2.AddArg2(v3, x)
8902 v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8903 v4.AuxInt = int32ToAuxInt(int32(sdivisible32(c).a))
8904 v1.AddArg2(v2, v4)
8905 v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8906 v5.AuxInt = int32ToAuxInt(int32(32 - sdivisible32(c).k))
8907 v0.AddArg2(v1, v5)
8908 v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8909 v6.AuxInt = int32ToAuxInt(int32(sdivisible32(c).max))
8910 v.AddArg2(v0, v6)
8911 return true
8912 }
8913 }
8914 }
8915 break
8916 }
8917
8918
8919
8920 for {
8921 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8922 x := v_0
8923 if v_1.Op != OpMul32 {
8924 continue
8925 }
8926 _ = v_1.Args[1]
8927 v_1_0 := v_1.Args[0]
8928 v_1_1 := v_1.Args[1]
8929 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8930 if v_1_0.Op != OpConst32 {
8931 continue
8932 }
8933 c := auxIntToInt32(v_1_0.AuxInt)
8934 if v_1_1.Op != OpSub32 {
8935 continue
8936 }
8937 _ = v_1_1.Args[1]
8938 v_1_1_0 := v_1_1.Args[0]
8939 if v_1_1_0.Op != OpRsh32x64 {
8940 continue
8941 }
8942 _ = v_1_1_0.Args[1]
8943 v_1_1_0_0 := v_1_1_0.Args[0]
8944 if v_1_1_0_0.Op != OpAdd32 {
8945 continue
8946 }
8947 _ = v_1_1_0_0.Args[1]
8948 v_1_1_0_0_0 := v_1_1_0_0.Args[0]
8949 v_1_1_0_0_1 := v_1_1_0_0.Args[1]
8950 for _i2 := 0; _i2 <= 1; _i2, v_1_1_0_0_0, v_1_1_0_0_1 = _i2+1, v_1_1_0_0_1, v_1_1_0_0_0 {
8951 mul := v_1_1_0_0_0
8952 if mul.Op != OpHmul32 {
8953 continue
8954 }
8955 _ = mul.Args[1]
8956 mul_0 := mul.Args[0]
8957 mul_1 := mul.Args[1]
8958 for _i3 := 0; _i3 <= 1; _i3, mul_0, mul_1 = _i3+1, mul_1, mul_0 {
8959 if mul_0.Op != OpConst32 {
8960 continue
8961 }
8962 m := auxIntToInt32(mul_0.AuxInt)
8963 if x != mul_1 || x != v_1_1_0_0_1 {
8964 continue
8965 }
8966 v_1_1_0_1 := v_1_1_0.Args[1]
8967 if v_1_1_0_1.Op != OpConst64 {
8968 continue
8969 }
8970 s := auxIntToInt64(v_1_1_0_1.AuxInt)
8971 v_1_1_1 := v_1_1.Args[1]
8972 if v_1_1_1.Op != OpRsh32x64 {
8973 continue
8974 }
8975 _ = v_1_1_1.Args[1]
8976 if x != v_1_1_1.Args[0] {
8977 continue
8978 }
8979 v_1_1_1_1 := v_1_1_1.Args[1]
8980 if v_1_1_1_1.Op != OpConst64 || auxIntToInt64(v_1_1_1_1.AuxInt) != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int32(smagic32(c).m) && s == smagic32(c).s && x.Op != OpConst32 && sdivisibleOK32(c)) {
8981 continue
8982 }
8983 v.reset(OpLeq32U)
8984 v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32)
8985 v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32)
8986 v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32)
8987 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8988 v3.AuxInt = int32ToAuxInt(int32(sdivisible32(c).m))
8989 v2.AddArg2(v3, x)
8990 v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8991 v4.AuxInt = int32ToAuxInt(int32(sdivisible32(c).a))
8992 v1.AddArg2(v2, v4)
8993 v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8994 v5.AuxInt = int32ToAuxInt(int32(32 - sdivisible32(c).k))
8995 v0.AddArg2(v1, v5)
8996 v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8997 v6.AuxInt = int32ToAuxInt(int32(sdivisible32(c).max))
8998 v.AddArg2(v0, v6)
8999 return true
9000 }
9001 }
9002 }
9003 }
9004 break
9005 }
9006
9007
9008
9009 for {
9010 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9011 n := v_0
9012 if v_1.Op != OpLsh32x64 {
9013 continue
9014 }
9015 _ = v_1.Args[1]
9016 v_1_0 := v_1.Args[0]
9017 if v_1_0.Op != OpRsh32x64 {
9018 continue
9019 }
9020 _ = v_1_0.Args[1]
9021 v_1_0_0 := v_1_0.Args[0]
9022 if v_1_0_0.Op != OpAdd32 {
9023 continue
9024 }
9025 t := v_1_0_0.Type
9026 _ = v_1_0_0.Args[1]
9027 v_1_0_0_0 := v_1_0_0.Args[0]
9028 v_1_0_0_1 := v_1_0_0.Args[1]
9029 for _i1 := 0; _i1 <= 1; _i1, v_1_0_0_0, v_1_0_0_1 = _i1+1, v_1_0_0_1, v_1_0_0_0 {
9030 if n != v_1_0_0_0 || v_1_0_0_1.Op != OpRsh32Ux64 || v_1_0_0_1.Type != t {
9031 continue
9032 }
9033 _ = v_1_0_0_1.Args[1]
9034 v_1_0_0_1_0 := v_1_0_0_1.Args[0]
9035 if v_1_0_0_1_0.Op != OpRsh32x64 || v_1_0_0_1_0.Type != t {
9036 continue
9037 }
9038 _ = v_1_0_0_1_0.Args[1]
9039 if n != v_1_0_0_1_0.Args[0] {
9040 continue
9041 }
9042 v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1]
9043 if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || auxIntToInt64(v_1_0_0_1_0_1.AuxInt) != 31 {
9044 continue
9045 }
9046 v_1_0_0_1_1 := v_1_0_0_1.Args[1]
9047 if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 {
9048 continue
9049 }
9050 kbar := auxIntToInt64(v_1_0_0_1_1.AuxInt)
9051 v_1_0_1 := v_1_0.Args[1]
9052 if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 {
9053 continue
9054 }
9055 k := auxIntToInt64(v_1_0_1.AuxInt)
9056 v_1_1 := v_1.Args[1]
9057 if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || auxIntToInt64(v_1_1.AuxInt) != k || !(k > 0 && k < 31 && kbar == 32-k) {
9058 continue
9059 }
9060 v.reset(OpEq32)
9061 v0 := b.NewValue0(v.Pos, OpAnd32, t)
9062 v1 := b.NewValue0(v.Pos, OpConst32, t)
9063 v1.AuxInt = int32ToAuxInt(1<<uint(k) - 1)
9064 v0.AddArg2(n, v1)
9065 v2 := b.NewValue0(v.Pos, OpConst32, t)
9066 v2.AuxInt = int32ToAuxInt(0)
9067 v.AddArg2(v0, v2)
9068 return true
9069 }
9070 }
9071 break
9072 }
9073
9074
9075
9076 for {
9077 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9078 s := v_0
9079 if s.Op != OpSub32 {
9080 continue
9081 }
9082 y := s.Args[1]
9083 x := s.Args[0]
9084 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 || !(s.Uses == 1) {
9085 continue
9086 }
9087 v.reset(OpEq32)
9088 v.AddArg2(x, y)
9089 return true
9090 }
9091 break
9092 }
9093
9094
9095
9096 for {
9097 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9098 if v_0.Op != OpAnd32 {
9099 continue
9100 }
9101 t := v_0.Type
9102 _ = v_0.Args[1]
9103 v_0_0 := v_0.Args[0]
9104 v_0_1 := v_0.Args[1]
9105 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
9106 x := v_0_0
9107 if v_0_1.Op != OpConst32 || v_0_1.Type != t {
9108 continue
9109 }
9110 y := auxIntToInt32(v_0_1.AuxInt)
9111 if v_1.Op != OpConst32 || v_1.Type != t || auxIntToInt32(v_1.AuxInt) != y || !(oneBit32(y)) {
9112 continue
9113 }
9114 v.reset(OpNeq32)
9115 v0 := b.NewValue0(v.Pos, OpAnd32, t)
9116 v1 := b.NewValue0(v.Pos, OpConst32, t)
9117 v1.AuxInt = int32ToAuxInt(y)
9118 v0.AddArg2(x, v1)
9119 v2 := b.NewValue0(v.Pos, OpConst32, t)
9120 v2.AuxInt = int32ToAuxInt(0)
9121 v.AddArg2(v0, v2)
9122 return true
9123 }
9124 }
9125 break
9126 }
9127 return false
9128 }
9129 func rewriteValuegeneric_OpEq32F(v *Value) bool {
9130 v_1 := v.Args[1]
9131 v_0 := v.Args[0]
9132
9133
9134 for {
9135 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9136 if v_0.Op != OpConst32F {
9137 continue
9138 }
9139 c := auxIntToFloat32(v_0.AuxInt)
9140 if v_1.Op != OpConst32F {
9141 continue
9142 }
9143 d := auxIntToFloat32(v_1.AuxInt)
9144 v.reset(OpConstBool)
9145 v.AuxInt = boolToAuxInt(c == d)
9146 return true
9147 }
9148 break
9149 }
9150 return false
9151 }
9152 func rewriteValuegeneric_OpEq64(v *Value) bool {
9153 v_1 := v.Args[1]
9154 v_0 := v.Args[0]
9155 b := v.Block
9156 typ := &b.Func.Config.Types
9157
9158
9159 for {
9160 x := v_0
9161 if x != v_1 {
9162 break
9163 }
9164 v.reset(OpConstBool)
9165 v.AuxInt = boolToAuxInt(true)
9166 return true
9167 }
9168
9169
9170 for {
9171 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9172 if v_0.Op != OpConst64 {
9173 continue
9174 }
9175 t := v_0.Type
9176 c := auxIntToInt64(v_0.AuxInt)
9177 if v_1.Op != OpAdd64 {
9178 continue
9179 }
9180 _ = v_1.Args[1]
9181 v_1_0 := v_1.Args[0]
9182 v_1_1 := v_1.Args[1]
9183 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
9184 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
9185 continue
9186 }
9187 d := auxIntToInt64(v_1_0.AuxInt)
9188 x := v_1_1
9189 v.reset(OpEq64)
9190 v0 := b.NewValue0(v.Pos, OpConst64, t)
9191 v0.AuxInt = int64ToAuxInt(c - d)
9192 v.AddArg2(v0, x)
9193 return true
9194 }
9195 }
9196 break
9197 }
9198
9199
9200 for {
9201 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9202 if v_0.Op != OpConst64 {
9203 continue
9204 }
9205 c := auxIntToInt64(v_0.AuxInt)
9206 if v_1.Op != OpConst64 {
9207 continue
9208 }
9209 d := auxIntToInt64(v_1.AuxInt)
9210 v.reset(OpConstBool)
9211 v.AuxInt = boolToAuxInt(c == d)
9212 return true
9213 }
9214 break
9215 }
9216
9217
9218
9219 for {
9220 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9221 x := v_0
9222 if v_1.Op != OpMul64 {
9223 continue
9224 }
9225 _ = v_1.Args[1]
9226 v_1_0 := v_1.Args[0]
9227 v_1_1 := v_1.Args[1]
9228 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
9229 if v_1_0.Op != OpConst64 {
9230 continue
9231 }
9232 c := auxIntToInt64(v_1_0.AuxInt)
9233 if v_1_1.Op != OpRsh64Ux64 {
9234 continue
9235 }
9236 _ = v_1_1.Args[1]
9237 mul := v_1_1.Args[0]
9238 if mul.Op != OpHmul64u {
9239 continue
9240 }
9241 _ = mul.Args[1]
9242 mul_0 := mul.Args[0]
9243 mul_1 := mul.Args[1]
9244 for _i2 := 0; _i2 <= 1; _i2, mul_0, mul_1 = _i2+1, mul_1, mul_0 {
9245 if mul_0.Op != OpConst64 {
9246 continue
9247 }
9248 m := auxIntToInt64(mul_0.AuxInt)
9249 if x != mul_1 {
9250 continue
9251 }
9252 v_1_1_1 := v_1_1.Args[1]
9253 if v_1_1_1.Op != OpConst64 {
9254 continue
9255 }
9256 s := auxIntToInt64(v_1_1_1.AuxInt)
9257 if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+umagic64(c).m/2) && s == umagic64(c).s-1 && x.Op != OpConst64 && udivisibleOK64(c)) {
9258 continue
9259 }
9260 v.reset(OpLeq64U)
9261 v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64)
9262 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64)
9263 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
9264 v2.AuxInt = int64ToAuxInt(int64(udivisible64(c).m))
9265 v1.AddArg2(v2, x)
9266 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
9267 v3.AuxInt = int64ToAuxInt(64 - udivisible64(c).k)
9268 v0.AddArg2(v1, v3)
9269 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
9270 v4.AuxInt = int64ToAuxInt(int64(udivisible64(c).max))
9271 v.AddArg2(v0, v4)
9272 return true
9273 }
9274 }
9275 }
9276 break
9277 }
9278
9279
9280
9281 for {
9282 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9283 x := v_0
9284 if v_1.Op != OpMul64 {
9285 continue
9286 }
9287 _ = v_1.Args[1]
9288 v_1_0 := v_1.Args[0]
9289 v_1_1 := v_1.Args[1]
9290 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
9291 if v_1_0.Op != OpConst64 {
9292 continue
9293 }
9294 c := auxIntToInt64(v_1_0.AuxInt)
9295 if v_1_1.Op != OpRsh64Ux64 {
9296 continue
9297 }
9298 _ = v_1_1.Args[1]
9299 mul := v_1_1.Args[0]
9300 if mul.Op != OpHmul64u {
9301 continue
9302 }
9303 _ = mul.Args[1]
9304 mul_0 := mul.Args[0]
9305 mul_1 := mul.Args[1]
9306 for _i2 := 0; _i2 <= 1; _i2, mul_0, mul_1 = _i2+1, mul_1, mul_0 {
9307 if mul_0.Op != OpConst64 {
9308 continue
9309 }
9310 m := auxIntToInt64(mul_0.AuxInt)
9311 if mul_1.Op != OpRsh64Ux64 {
9312 continue
9313 }
9314 _ = mul_1.Args[1]
9315 if x != mul_1.Args[0] {
9316 continue
9317 }
9318 mul_1_1 := mul_1.Args[1]
9319 if mul_1_1.Op != OpConst64 || auxIntToInt64(mul_1_1.AuxInt) != 1 {
9320 continue
9321 }
9322 v_1_1_1 := v_1_1.Args[1]
9323 if v_1_1_1.Op != OpConst64 {
9324 continue
9325 }
9326 s := auxIntToInt64(v_1_1_1.AuxInt)
9327 if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+(umagic64(c).m+1)/2) && s == umagic64(c).s-2 && x.Op != OpConst64 && udivisibleOK64(c)) {
9328 continue
9329 }
9330 v.reset(OpLeq64U)
9331 v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64)
9332 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64)
9333 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
9334 v2.AuxInt = int64ToAuxInt(int64(udivisible64(c).m))
9335 v1.AddArg2(v2, x)
9336 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
9337 v3.AuxInt = int64ToAuxInt(64 - udivisible64(c).k)
9338 v0.AddArg2(v1, v3)
9339 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
9340 v4.AuxInt = int64ToAuxInt(int64(udivisible64(c).max))
9341 v.AddArg2(v0, v4)
9342 return true
9343 }
9344 }
9345 }
9346 break
9347 }
9348
9349
9350
9351 for {
9352 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9353 x := v_0
9354 if v_1.Op != OpMul64 {
9355 continue
9356 }
9357 _ = v_1.Args[1]
9358 v_1_0 := v_1.Args[0]
9359 v_1_1 := v_1.Args[1]
9360 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
9361 if v_1_0.Op != OpConst64 {
9362 continue
9363 }
9364 c := auxIntToInt64(v_1_0.AuxInt)
9365 if v_1_1.Op != OpRsh64Ux64 {
9366 continue
9367 }
9368 _ = v_1_1.Args[1]
9369 v_1_1_0 := v_1_1.Args[0]
9370 if v_1_1_0.Op != OpAvg64u {
9371 continue
9372 }
9373 _ = v_1_1_0.Args[1]
9374 if x != v_1_1_0.Args[0] {
9375 continue
9376 }
9377 mul := v_1_1_0.Args[1]
9378 if mul.Op != OpHmul64u {
9379 continue
9380 }
9381 _ = mul.Args[1]
9382 mul_0 := mul.Args[0]
9383 mul_1 := mul.Args[1]
9384 for _i2 := 0; _i2 <= 1; _i2, mul_0, mul_1 = _i2+1, mul_1, mul_0 {
9385 if mul_0.Op != OpConst64 {
9386 continue
9387 }
9388 m := auxIntToInt64(mul_0.AuxInt)
9389 if x != mul_1 {
9390 continue
9391 }
9392 v_1_1_1 := v_1_1.Args[1]
9393 if v_1_1_1.Op != OpConst64 {
9394 continue
9395 }
9396 s := auxIntToInt64(v_1_1_1.AuxInt)
9397 if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic64(c).m) && s == umagic64(c).s-1 && x.Op != OpConst64 && udivisibleOK64(c)) {
9398 continue
9399 }
9400 v.reset(OpLeq64U)
9401 v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64)
9402 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64)
9403 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
9404 v2.AuxInt = int64ToAuxInt(int64(udivisible64(c).m))
9405 v1.AddArg2(v2, x)
9406 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
9407 v3.AuxInt = int64ToAuxInt(64 - udivisible64(c).k)
9408 v0.AddArg2(v1, v3)
9409 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
9410 v4.AuxInt = int64ToAuxInt(int64(udivisible64(c).max))
9411 v.AddArg2(v0, v4)
9412 return true
9413 }
9414 }
9415 }
9416 break
9417 }
9418
9419
9420
9421 for {
9422 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9423 x := v_0
9424 if v_1.Op != OpMul64 {
9425 continue
9426 }
9427 _ = v_1.Args[1]
9428 v_1_0 := v_1.Args[0]
9429 v_1_1 := v_1.Args[1]
9430 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
9431 if v_1_0.Op != OpConst64 {
9432 continue
9433 }
9434 c := auxIntToInt64(v_1_0.AuxInt)
9435 if v_1_1.Op != OpSub64 {
9436 continue
9437 }
9438 _ = v_1_1.Args[1]
9439 v_1_1_0 := v_1_1.Args[0]
9440 if v_1_1_0.Op != OpRsh64x64 {
9441 continue
9442 }
9443 _ = v_1_1_0.Args[1]
9444 mul := v_1_1_0.Args[0]
9445 if mul.Op != OpHmul64 {
9446 continue
9447 }
9448 _ = mul.Args[1]
9449 mul_0 := mul.Args[0]
9450 mul_1 := mul.Args[1]
9451 for _i2 := 0; _i2 <= 1; _i2, mul_0, mul_1 = _i2+1, mul_1, mul_0 {
9452 if mul_0.Op != OpConst64 {
9453 continue
9454 }
9455 m := auxIntToInt64(mul_0.AuxInt)
9456 if x != mul_1 {
9457 continue
9458 }
9459 v_1_1_0_1 := v_1_1_0.Args[1]
9460 if v_1_1_0_1.Op != OpConst64 {
9461 continue
9462 }
9463 s := auxIntToInt64(v_1_1_0_1.AuxInt)
9464 v_1_1_1 := v_1_1.Args[1]
9465 if v_1_1_1.Op != OpRsh64x64 {
9466 continue
9467 }
9468 _ = v_1_1_1.Args[1]
9469 if x != v_1_1_1.Args[0] {
9470 continue
9471 }
9472 v_1_1_1_1 := v_1_1_1.Args[1]
9473 if v_1_1_1_1.Op != OpConst64 || auxIntToInt64(v_1_1_1_1.AuxInt) != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic64(c).m/2) && s == smagic64(c).s-1 && x.Op != OpConst64 && sdivisibleOK64(c)) {
9474 continue
9475 }
9476 v.reset(OpLeq64U)
9477 v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64)
9478 v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64)
9479 v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64)
9480 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
9481 v3.AuxInt = int64ToAuxInt(int64(sdivisible64(c).m))
9482 v2.AddArg2(v3, x)
9483 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
9484 v4.AuxInt = int64ToAuxInt(int64(sdivisible64(c).a))
9485 v1.AddArg2(v2, v4)
9486 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
9487 v5.AuxInt = int64ToAuxInt(64 - sdivisible64(c).k)
9488 v0.AddArg2(v1, v5)
9489 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
9490 v6.AuxInt = int64ToAuxInt(int64(sdivisible64(c).max))
9491 v.AddArg2(v0, v6)
9492 return true
9493 }
9494 }
9495 }
9496 break
9497 }
9498
9499
9500
9501 for {
9502 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9503 x := v_0
9504 if v_1.Op != OpMul64 {
9505 continue
9506 }
9507 _ = v_1.Args[1]
9508 v_1_0 := v_1.Args[0]
9509 v_1_1 := v_1.Args[1]
9510 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
9511 if v_1_0.Op != OpConst64 {
9512 continue
9513 }
9514 c := auxIntToInt64(v_1_0.AuxInt)
9515 if v_1_1.Op != OpSub64 {
9516 continue
9517 }
9518 _ = v_1_1.Args[1]
9519 v_1_1_0 := v_1_1.Args[0]
9520 if v_1_1_0.Op != OpRsh64x64 {
9521 continue
9522 }
9523 _ = v_1_1_0.Args[1]
9524 v_1_1_0_0 := v_1_1_0.Args[0]
9525 if v_1_1_0_0.Op != OpAdd64 {
9526 continue
9527 }
9528 _ = v_1_1_0_0.Args[1]
9529 v_1_1_0_0_0 := v_1_1_0_0.Args[0]
9530 v_1_1_0_0_1 := v_1_1_0_0.Args[1]
9531 for _i2 := 0; _i2 <= 1; _i2, v_1_1_0_0_0, v_1_1_0_0_1 = _i2+1, v_1_1_0_0_1, v_1_1_0_0_0 {
9532 mul := v_1_1_0_0_0
9533 if mul.Op != OpHmul64 {
9534 continue
9535 }
9536 _ = mul.Args[1]
9537 mul_0 := mul.Args[0]
9538 mul_1 := mul.Args[1]
9539 for _i3 := 0; _i3 <= 1; _i3, mul_0, mul_1 = _i3+1, mul_1, mul_0 {
9540 if mul_0.Op != OpConst64 {
9541 continue
9542 }
9543 m := auxIntToInt64(mul_0.AuxInt)
9544 if x != mul_1 || x != v_1_1_0_0_1 {
9545 continue
9546 }
9547 v_1_1_0_1 := v_1_1_0.Args[1]
9548 if v_1_1_0_1.Op != OpConst64 {
9549 continue
9550 }
9551 s := auxIntToInt64(v_1_1_0_1.AuxInt)
9552 v_1_1_1 := v_1_1.Args[1]
9553 if v_1_1_1.Op != OpRsh64x64 {
9554 continue
9555 }
9556 _ = v_1_1_1.Args[1]
9557 if x != v_1_1_1.Args[0] {
9558 continue
9559 }
9560 v_1_1_1_1 := v_1_1_1.Args[1]
9561 if v_1_1_1_1.Op != OpConst64 || auxIntToInt64(v_1_1_1_1.AuxInt) != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic64(c).m) && s == smagic64(c).s && x.Op != OpConst64 && sdivisibleOK64(c)) {
9562 continue
9563 }
9564 v.reset(OpLeq64U)
9565 v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64)
9566 v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64)
9567 v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64)
9568 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
9569 v3.AuxInt = int64ToAuxInt(int64(sdivisible64(c).m))
9570 v2.AddArg2(v3, x)
9571 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
9572 v4.AuxInt = int64ToAuxInt(int64(sdivisible64(c).a))
9573 v1.AddArg2(v2, v4)
9574 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
9575 v5.AuxInt = int64ToAuxInt(64 - sdivisible64(c).k)
9576 v0.AddArg2(v1, v5)
9577 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
9578 v6.AuxInt = int64ToAuxInt(int64(sdivisible64(c).max))
9579 v.AddArg2(v0, v6)
9580 return true
9581 }
9582 }
9583 }
9584 }
9585 break
9586 }
9587
9588
9589
9590 for {
9591 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9592 n := v_0
9593 if v_1.Op != OpLsh64x64 {
9594 continue
9595 }
9596 _ = v_1.Args[1]
9597 v_1_0 := v_1.Args[0]
9598 if v_1_0.Op != OpRsh64x64 {
9599 continue
9600 }
9601 _ = v_1_0.Args[1]
9602 v_1_0_0 := v_1_0.Args[0]
9603 if v_1_0_0.Op != OpAdd64 {
9604 continue
9605 }
9606 t := v_1_0_0.Type
9607 _ = v_1_0_0.Args[1]
9608 v_1_0_0_0 := v_1_0_0.Args[0]
9609 v_1_0_0_1 := v_1_0_0.Args[1]
9610 for _i1 := 0; _i1 <= 1; _i1, v_1_0_0_0, v_1_0_0_1 = _i1+1, v_1_0_0_1, v_1_0_0_0 {
9611 if n != v_1_0_0_0 || v_1_0_0_1.Op != OpRsh64Ux64 || v_1_0_0_1.Type != t {
9612 continue
9613 }
9614 _ = v_1_0_0_1.Args[1]
9615 v_1_0_0_1_0 := v_1_0_0_1.Args[0]
9616 if v_1_0_0_1_0.Op != OpRsh64x64 || v_1_0_0_1_0.Type != t {
9617 continue
9618 }
9619 _ = v_1_0_0_1_0.Args[1]
9620 if n != v_1_0_0_1_0.Args[0] {
9621 continue
9622 }
9623 v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1]
9624 if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || auxIntToInt64(v_1_0_0_1_0_1.AuxInt) != 63 {
9625 continue
9626 }
9627 v_1_0_0_1_1 := v_1_0_0_1.Args[1]
9628 if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 {
9629 continue
9630 }
9631 kbar := auxIntToInt64(v_1_0_0_1_1.AuxInt)
9632 v_1_0_1 := v_1_0.Args[1]
9633 if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 {
9634 continue
9635 }
9636 k := auxIntToInt64(v_1_0_1.AuxInt)
9637 v_1_1 := v_1.Args[1]
9638 if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || auxIntToInt64(v_1_1.AuxInt) != k || !(k > 0 && k < 63 && kbar == 64-k) {
9639 continue
9640 }
9641 v.reset(OpEq64)
9642 v0 := b.NewValue0(v.Pos, OpAnd64, t)
9643 v1 := b.NewValue0(v.Pos, OpConst64, t)
9644 v1.AuxInt = int64ToAuxInt(1<<uint(k) - 1)
9645 v0.AddArg2(n, v1)
9646 v2 := b.NewValue0(v.Pos, OpConst64, t)
9647 v2.AuxInt = int64ToAuxInt(0)
9648 v.AddArg2(v0, v2)
9649 return true
9650 }
9651 }
9652 break
9653 }
9654
9655
9656
9657 for {
9658 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9659 s := v_0
9660 if s.Op != OpSub64 {
9661 continue
9662 }
9663 y := s.Args[1]
9664 x := s.Args[0]
9665 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 || !(s.Uses == 1) {
9666 continue
9667 }
9668 v.reset(OpEq64)
9669 v.AddArg2(x, y)
9670 return true
9671 }
9672 break
9673 }
9674
9675
9676
9677 for {
9678 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9679 if v_0.Op != OpAnd64 {
9680 continue
9681 }
9682 t := v_0.Type
9683 _ = v_0.Args[1]
9684 v_0_0 := v_0.Args[0]
9685 v_0_1 := v_0.Args[1]
9686 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
9687 x := v_0_0
9688 if v_0_1.Op != OpConst64 || v_0_1.Type != t {
9689 continue
9690 }
9691 y := auxIntToInt64(v_0_1.AuxInt)
9692 if v_1.Op != OpConst64 || v_1.Type != t || auxIntToInt64(v_1.AuxInt) != y || !(oneBit64(y)) {
9693 continue
9694 }
9695 v.reset(OpNeq64)
9696 v0 := b.NewValue0(v.Pos, OpAnd64, t)
9697 v1 := b.NewValue0(v.Pos, OpConst64, t)
9698 v1.AuxInt = int64ToAuxInt(y)
9699 v0.AddArg2(x, v1)
9700 v2 := b.NewValue0(v.Pos, OpConst64, t)
9701 v2.AuxInt = int64ToAuxInt(0)
9702 v.AddArg2(v0, v2)
9703 return true
9704 }
9705 }
9706 break
9707 }
9708 return false
9709 }
9710 func rewriteValuegeneric_OpEq64F(v *Value) bool {
9711 v_1 := v.Args[1]
9712 v_0 := v.Args[0]
9713
9714
9715 for {
9716 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9717 if v_0.Op != OpConst64F {
9718 continue
9719 }
9720 c := auxIntToFloat64(v_0.AuxInt)
9721 if v_1.Op != OpConst64F {
9722 continue
9723 }
9724 d := auxIntToFloat64(v_1.AuxInt)
9725 v.reset(OpConstBool)
9726 v.AuxInt = boolToAuxInt(c == d)
9727 return true
9728 }
9729 break
9730 }
9731 return false
9732 }
9733 func rewriteValuegeneric_OpEq8(v *Value) bool {
9734 v_1 := v.Args[1]
9735 v_0 := v.Args[0]
9736 b := v.Block
9737 config := b.Func.Config
9738 typ := &b.Func.Config.Types
9739
9740
9741 for {
9742 x := v_0
9743 if x != v_1 {
9744 break
9745 }
9746 v.reset(OpConstBool)
9747 v.AuxInt = boolToAuxInt(true)
9748 return true
9749 }
9750
9751
9752 for {
9753 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9754 if v_0.Op != OpConst8 {
9755 continue
9756 }
9757 t := v_0.Type
9758 c := auxIntToInt8(v_0.AuxInt)
9759 if v_1.Op != OpAdd8 {
9760 continue
9761 }
9762 _ = v_1.Args[1]
9763 v_1_0 := v_1.Args[0]
9764 v_1_1 := v_1.Args[1]
9765 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
9766 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
9767 continue
9768 }
9769 d := auxIntToInt8(v_1_0.AuxInt)
9770 x := v_1_1
9771 v.reset(OpEq8)
9772 v0 := b.NewValue0(v.Pos, OpConst8, t)
9773 v0.AuxInt = int8ToAuxInt(c - d)
9774 v.AddArg2(v0, x)
9775 return true
9776 }
9777 }
9778 break
9779 }
9780
9781
9782 for {
9783 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9784 if v_0.Op != OpConst8 {
9785 continue
9786 }
9787 c := auxIntToInt8(v_0.AuxInt)
9788 if v_1.Op != OpConst8 {
9789 continue
9790 }
9791 d := auxIntToInt8(v_1.AuxInt)
9792 v.reset(OpConstBool)
9793 v.AuxInt = boolToAuxInt(c == d)
9794 return true
9795 }
9796 break
9797 }
9798
9799
9800
9801 for {
9802 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9803 if v_0.Op != OpMod8u {
9804 continue
9805 }
9806 _ = v_0.Args[1]
9807 x := v_0.Args[0]
9808 v_0_1 := v_0.Args[1]
9809 if v_0_1.Op != OpConst8 {
9810 continue
9811 }
9812 c := auxIntToInt8(v_0_1.AuxInt)
9813 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(x.Op != OpConst8 && udivisibleOK8(c) && !hasSmallRotate(config)) {
9814 continue
9815 }
9816 v.reset(OpEq32)
9817 v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32)
9818 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
9819 v1.AddArg(x)
9820 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
9821 v2.AuxInt = int32ToAuxInt(int32(uint8(c)))
9822 v0.AddArg2(v1, v2)
9823 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
9824 v3.AuxInt = int32ToAuxInt(0)
9825 v.AddArg2(v0, v3)
9826 return true
9827 }
9828 break
9829 }
9830
9831
9832
9833 for {
9834 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9835 if v_0.Op != OpMod8 {
9836 continue
9837 }
9838 _ = v_0.Args[1]
9839 x := v_0.Args[0]
9840 v_0_1 := v_0.Args[1]
9841 if v_0_1.Op != OpConst8 {
9842 continue
9843 }
9844 c := auxIntToInt8(v_0_1.AuxInt)
9845 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(x.Op != OpConst8 && sdivisibleOK8(c) && !hasSmallRotate(config)) {
9846 continue
9847 }
9848 v.reset(OpEq32)
9849 v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32)
9850 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
9851 v1.AddArg(x)
9852 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
9853 v2.AuxInt = int32ToAuxInt(int32(c))
9854 v0.AddArg2(v1, v2)
9855 v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
9856 v3.AuxInt = int32ToAuxInt(0)
9857 v.AddArg2(v0, v3)
9858 return true
9859 }
9860 break
9861 }
9862
9863
9864
9865 for {
9866 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9867 x := v_0
9868 if v_1.Op != OpMul8 {
9869 continue
9870 }
9871 _ = v_1.Args[1]
9872 v_1_0 := v_1.Args[0]
9873 v_1_1 := v_1.Args[1]
9874 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
9875 if v_1_0.Op != OpConst8 {
9876 continue
9877 }
9878 c := auxIntToInt8(v_1_0.AuxInt)
9879 if v_1_1.Op != OpTrunc32to8 {
9880 continue
9881 }
9882 v_1_1_0 := v_1_1.Args[0]
9883 if v_1_1_0.Op != OpRsh32Ux64 {
9884 continue
9885 }
9886 _ = v_1_1_0.Args[1]
9887 mul := v_1_1_0.Args[0]
9888 if mul.Op != OpMul32 {
9889 continue
9890 }
9891 _ = mul.Args[1]
9892 mul_0 := mul.Args[0]
9893 mul_1 := mul.Args[1]
9894 for _i2 := 0; _i2 <= 1; _i2, mul_0, mul_1 = _i2+1, mul_1, mul_0 {
9895 if mul_0.Op != OpConst32 {
9896 continue
9897 }
9898 m := auxIntToInt32(mul_0.AuxInt)
9899 if mul_1.Op != OpZeroExt8to32 || x != mul_1.Args[0] {
9900 continue
9901 }
9902 v_1_1_0_1 := v_1_1_0.Args[1]
9903 if v_1_1_0_1.Op != OpConst64 {
9904 continue
9905 }
9906 s := auxIntToInt64(v_1_1_0_1.AuxInt)
9907 if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int32(1<<8+umagic8(c).m) && s == 8+umagic8(c).s && x.Op != OpConst8 && udivisibleOK8(c)) {
9908 continue
9909 }
9910 v.reset(OpLeq8U)
9911 v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8)
9912 v1 := b.NewValue0(v.Pos, OpMul8, typ.UInt8)
9913 v2 := b.NewValue0(v.Pos, OpConst8, typ.UInt8)
9914 v2.AuxInt = int8ToAuxInt(int8(udivisible8(c).m))
9915 v1.AddArg2(v2, x)
9916 v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8)
9917 v3.AuxInt = int8ToAuxInt(int8(8 - udivisible8(c).k))
9918 v0.AddArg2(v1, v3)
9919 v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8)
9920 v4.AuxInt = int8ToAuxInt(int8(udivisible8(c).max))
9921 v.AddArg2(v0, v4)
9922 return true
9923 }
9924 }
9925 }
9926 break
9927 }
9928
9929
9930
9931 for {
9932 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9933 x := v_0
9934 if v_1.Op != OpMul8 {
9935 continue
9936 }
9937 _ = v_1.Args[1]
9938 v_1_0 := v_1.Args[0]
9939 v_1_1 := v_1.Args[1]
9940 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
9941 if v_1_0.Op != OpConst8 {
9942 continue
9943 }
9944 c := auxIntToInt8(v_1_0.AuxInt)
9945 if v_1_1.Op != OpSub8 {
9946 continue
9947 }
9948 _ = v_1_1.Args[1]
9949 v_1_1_0 := v_1_1.Args[0]
9950 if v_1_1_0.Op != OpRsh32x64 {
9951 continue
9952 }
9953 _ = v_1_1_0.Args[1]
9954 mul := v_1_1_0.Args[0]
9955 if mul.Op != OpMul32 {
9956 continue
9957 }
9958 _ = mul.Args[1]
9959 mul_0 := mul.Args[0]
9960 mul_1 := mul.Args[1]
9961 for _i2 := 0; _i2 <= 1; _i2, mul_0, mul_1 = _i2+1, mul_1, mul_0 {
9962 if mul_0.Op != OpConst32 {
9963 continue
9964 }
9965 m := auxIntToInt32(mul_0.AuxInt)
9966 if mul_1.Op != OpSignExt8to32 || x != mul_1.Args[0] {
9967 continue
9968 }
9969 v_1_1_0_1 := v_1_1_0.Args[1]
9970 if v_1_1_0_1.Op != OpConst64 {
9971 continue
9972 }
9973 s := auxIntToInt64(v_1_1_0_1.AuxInt)
9974 v_1_1_1 := v_1_1.Args[1]
9975 if v_1_1_1.Op != OpRsh32x64 {
9976 continue
9977 }
9978 _ = v_1_1_1.Args[1]
9979 v_1_1_1_0 := v_1_1_1.Args[0]
9980 if v_1_1_1_0.Op != OpSignExt8to32 || x != v_1_1_1_0.Args[0] {
9981 continue
9982 }
9983 v_1_1_1_1 := v_1_1_1.Args[1]
9984 if v_1_1_1_1.Op != OpConst64 || auxIntToInt64(v_1_1_1_1.AuxInt) != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int32(smagic8(c).m) && s == 8+smagic8(c).s && x.Op != OpConst8 && sdivisibleOK8(c)) {
9985 continue
9986 }
9987 v.reset(OpLeq8U)
9988 v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8)
9989 v1 := b.NewValue0(v.Pos, OpAdd8, typ.UInt8)
9990 v2 := b.NewValue0(v.Pos, OpMul8, typ.UInt8)
9991 v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8)
9992 v3.AuxInt = int8ToAuxInt(int8(sdivisible8(c).m))
9993 v2.AddArg2(v3, x)
9994 v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8)
9995 v4.AuxInt = int8ToAuxInt(int8(sdivisible8(c).a))
9996 v1.AddArg2(v2, v4)
9997 v5 := b.NewValue0(v.Pos, OpConst8, typ.UInt8)
9998 v5.AuxInt = int8ToAuxInt(int8(8 - sdivisible8(c).k))
9999 v0.AddArg2(v1, v5)
10000 v6 := b.NewValue0(v.Pos, OpConst8, typ.UInt8)
10001 v6.AuxInt = int8ToAuxInt(int8(sdivisible8(c).max))
10002 v.AddArg2(v0, v6)
10003 return true
10004 }
10005 }
10006 }
10007 break
10008 }
10009
10010
10011
10012 for {
10013 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10014 n := v_0
10015 if v_1.Op != OpLsh8x64 {
10016 continue
10017 }
10018 _ = v_1.Args[1]
10019 v_1_0 := v_1.Args[0]
10020 if v_1_0.Op != OpRsh8x64 {
10021 continue
10022 }
10023 _ = v_1_0.Args[1]
10024 v_1_0_0 := v_1_0.Args[0]
10025 if v_1_0_0.Op != OpAdd8 {
10026 continue
10027 }
10028 t := v_1_0_0.Type
10029 _ = v_1_0_0.Args[1]
10030 v_1_0_0_0 := v_1_0_0.Args[0]
10031 v_1_0_0_1 := v_1_0_0.Args[1]
10032 for _i1 := 0; _i1 <= 1; _i1, v_1_0_0_0, v_1_0_0_1 = _i1+1, v_1_0_0_1, v_1_0_0_0 {
10033 if n != v_1_0_0_0 || v_1_0_0_1.Op != OpRsh8Ux64 || v_1_0_0_1.Type != t {
10034 continue
10035 }
10036 _ = v_1_0_0_1.Args[1]
10037 v_1_0_0_1_0 := v_1_0_0_1.Args[0]
10038 if v_1_0_0_1_0.Op != OpRsh8x64 || v_1_0_0_1_0.Type != t {
10039 continue
10040 }
10041 _ = v_1_0_0_1_0.Args[1]
10042 if n != v_1_0_0_1_0.Args[0] {
10043 continue
10044 }
10045 v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1]
10046 if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || auxIntToInt64(v_1_0_0_1_0_1.AuxInt) != 7 {
10047 continue
10048 }
10049 v_1_0_0_1_1 := v_1_0_0_1.Args[1]
10050 if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 {
10051 continue
10052 }
10053 kbar := auxIntToInt64(v_1_0_0_1_1.AuxInt)
10054 v_1_0_1 := v_1_0.Args[1]
10055 if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 {
10056 continue
10057 }
10058 k := auxIntToInt64(v_1_0_1.AuxInt)
10059 v_1_1 := v_1.Args[1]
10060 if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || auxIntToInt64(v_1_1.AuxInt) != k || !(k > 0 && k < 7 && kbar == 8-k) {
10061 continue
10062 }
10063 v.reset(OpEq8)
10064 v0 := b.NewValue0(v.Pos, OpAnd8, t)
10065 v1 := b.NewValue0(v.Pos, OpConst8, t)
10066 v1.AuxInt = int8ToAuxInt(1<<uint(k) - 1)
10067 v0.AddArg2(n, v1)
10068 v2 := b.NewValue0(v.Pos, OpConst8, t)
10069 v2.AuxInt = int8ToAuxInt(0)
10070 v.AddArg2(v0, v2)
10071 return true
10072 }
10073 }
10074 break
10075 }
10076
10077
10078
10079 for {
10080 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10081 s := v_0
10082 if s.Op != OpSub8 {
10083 continue
10084 }
10085 y := s.Args[1]
10086 x := s.Args[0]
10087 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(s.Uses == 1) {
10088 continue
10089 }
10090 v.reset(OpEq8)
10091 v.AddArg2(x, y)
10092 return true
10093 }
10094 break
10095 }
10096
10097
10098
10099 for {
10100 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10101 if v_0.Op != OpAnd8 {
10102 continue
10103 }
10104 t := v_0.Type
10105 _ = v_0.Args[1]
10106 v_0_0 := v_0.Args[0]
10107 v_0_1 := v_0.Args[1]
10108 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
10109 x := v_0_0
10110 if v_0_1.Op != OpConst8 || v_0_1.Type != t {
10111 continue
10112 }
10113 y := auxIntToInt8(v_0_1.AuxInt)
10114 if v_1.Op != OpConst8 || v_1.Type != t || auxIntToInt8(v_1.AuxInt) != y || !(oneBit8(y)) {
10115 continue
10116 }
10117 v.reset(OpNeq8)
10118 v0 := b.NewValue0(v.Pos, OpAnd8, t)
10119 v1 := b.NewValue0(v.Pos, OpConst8, t)
10120 v1.AuxInt = int8ToAuxInt(y)
10121 v0.AddArg2(x, v1)
10122 v2 := b.NewValue0(v.Pos, OpConst8, t)
10123 v2.AuxInt = int8ToAuxInt(0)
10124 v.AddArg2(v0, v2)
10125 return true
10126 }
10127 }
10128 break
10129 }
10130 return false
10131 }
10132 func rewriteValuegeneric_OpEqB(v *Value) bool {
10133 v_1 := v.Args[1]
10134 v_0 := v.Args[0]
10135
10136
10137 for {
10138 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10139 if v_0.Op != OpConstBool {
10140 continue
10141 }
10142 c := auxIntToBool(v_0.AuxInt)
10143 if v_1.Op != OpConstBool {
10144 continue
10145 }
10146 d := auxIntToBool(v_1.AuxInt)
10147 v.reset(OpConstBool)
10148 v.AuxInt = boolToAuxInt(c == d)
10149 return true
10150 }
10151 break
10152 }
10153
10154
10155 for {
10156 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10157 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
10158 continue
10159 }
10160 x := v_1
10161 v.reset(OpNot)
10162 v.AddArg(x)
10163 return true
10164 }
10165 break
10166 }
10167
10168
10169 for {
10170 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10171 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
10172 continue
10173 }
10174 x := v_1
10175 v.copyOf(x)
10176 return true
10177 }
10178 break
10179 }
10180 return false
10181 }
10182 func rewriteValuegeneric_OpEqInter(v *Value) bool {
10183 v_1 := v.Args[1]
10184 v_0 := v.Args[0]
10185 b := v.Block
10186 typ := &b.Func.Config.Types
10187
10188
10189 for {
10190 x := v_0
10191 y := v_1
10192 v.reset(OpEqPtr)
10193 v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
10194 v0.AddArg(x)
10195 v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
10196 v1.AddArg(y)
10197 v.AddArg2(v0, v1)
10198 return true
10199 }
10200 }
10201 func rewriteValuegeneric_OpEqPtr(v *Value) bool {
10202 v_1 := v.Args[1]
10203 v_0 := v.Args[0]
10204 b := v.Block
10205 typ := &b.Func.Config.Types
10206
10207
10208 for {
10209 x := v_0
10210 if x != v_1 {
10211 break
10212 }
10213 v.reset(OpConstBool)
10214 v.AuxInt = boolToAuxInt(true)
10215 return true
10216 }
10217
10218
10219 for {
10220 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10221 if v_0.Op != OpAddr {
10222 continue
10223 }
10224 x := auxToSym(v_0.Aux)
10225 if v_1.Op != OpAddr {
10226 continue
10227 }
10228 y := auxToSym(v_1.Aux)
10229 v.reset(OpConstBool)
10230 v.AuxInt = boolToAuxInt(x == y)
10231 return true
10232 }
10233 break
10234 }
10235
10236
10237 for {
10238 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10239 if v_0.Op != OpAddr {
10240 continue
10241 }
10242 x := auxToSym(v_0.Aux)
10243 if v_1.Op != OpOffPtr {
10244 continue
10245 }
10246 o := auxIntToInt64(v_1.AuxInt)
10247 v_1_0 := v_1.Args[0]
10248 if v_1_0.Op != OpAddr {
10249 continue
10250 }
10251 y := auxToSym(v_1_0.Aux)
10252 v.reset(OpConstBool)
10253 v.AuxInt = boolToAuxInt(x == y && o == 0)
10254 return true
10255 }
10256 break
10257 }
10258
10259
10260 for {
10261 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10262 if v_0.Op != OpOffPtr {
10263 continue
10264 }
10265 o1 := auxIntToInt64(v_0.AuxInt)
10266 v_0_0 := v_0.Args[0]
10267 if v_0_0.Op != OpAddr {
10268 continue
10269 }
10270 x := auxToSym(v_0_0.Aux)
10271 if v_1.Op != OpOffPtr {
10272 continue
10273 }
10274 o2 := auxIntToInt64(v_1.AuxInt)
10275 v_1_0 := v_1.Args[0]
10276 if v_1_0.Op != OpAddr {
10277 continue
10278 }
10279 y := auxToSym(v_1_0.Aux)
10280 v.reset(OpConstBool)
10281 v.AuxInt = boolToAuxInt(x == y && o1 == o2)
10282 return true
10283 }
10284 break
10285 }
10286
10287
10288 for {
10289 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10290 if v_0.Op != OpLocalAddr {
10291 continue
10292 }
10293 x := auxToSym(v_0.Aux)
10294 if v_1.Op != OpLocalAddr {
10295 continue
10296 }
10297 y := auxToSym(v_1.Aux)
10298 v.reset(OpConstBool)
10299 v.AuxInt = boolToAuxInt(x == y)
10300 return true
10301 }
10302 break
10303 }
10304
10305
10306 for {
10307 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10308 if v_0.Op != OpLocalAddr {
10309 continue
10310 }
10311 x := auxToSym(v_0.Aux)
10312 if v_1.Op != OpOffPtr {
10313 continue
10314 }
10315 o := auxIntToInt64(v_1.AuxInt)
10316 v_1_0 := v_1.Args[0]
10317 if v_1_0.Op != OpLocalAddr {
10318 continue
10319 }
10320 y := auxToSym(v_1_0.Aux)
10321 v.reset(OpConstBool)
10322 v.AuxInt = boolToAuxInt(x == y && o == 0)
10323 return true
10324 }
10325 break
10326 }
10327
10328
10329 for {
10330 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10331 if v_0.Op != OpOffPtr {
10332 continue
10333 }
10334 o1 := auxIntToInt64(v_0.AuxInt)
10335 v_0_0 := v_0.Args[0]
10336 if v_0_0.Op != OpLocalAddr {
10337 continue
10338 }
10339 x := auxToSym(v_0_0.Aux)
10340 if v_1.Op != OpOffPtr {
10341 continue
10342 }
10343 o2 := auxIntToInt64(v_1.AuxInt)
10344 v_1_0 := v_1.Args[0]
10345 if v_1_0.Op != OpLocalAddr {
10346 continue
10347 }
10348 y := auxToSym(v_1_0.Aux)
10349 v.reset(OpConstBool)
10350 v.AuxInt = boolToAuxInt(x == y && o1 == o2)
10351 return true
10352 }
10353 break
10354 }
10355
10356
10357
10358 for {
10359 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10360 if v_0.Op != OpOffPtr {
10361 continue
10362 }
10363 o1 := auxIntToInt64(v_0.AuxInt)
10364 p1 := v_0.Args[0]
10365 p2 := v_1
10366 if !(isSamePtr(p1, p2)) {
10367 continue
10368 }
10369 v.reset(OpConstBool)
10370 v.AuxInt = boolToAuxInt(o1 == 0)
10371 return true
10372 }
10373 break
10374 }
10375
10376
10377
10378 for {
10379 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10380 if v_0.Op != OpOffPtr {
10381 continue
10382 }
10383 o1 := auxIntToInt64(v_0.AuxInt)
10384 p1 := v_0.Args[0]
10385 if v_1.Op != OpOffPtr {
10386 continue
10387 }
10388 o2 := auxIntToInt64(v_1.AuxInt)
10389 p2 := v_1.Args[0]
10390 if !(isSamePtr(p1, p2)) {
10391 continue
10392 }
10393 v.reset(OpConstBool)
10394 v.AuxInt = boolToAuxInt(o1 == o2)
10395 return true
10396 }
10397 break
10398 }
10399
10400
10401 for {
10402 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10403 if v_0.Op != OpConst32 {
10404 continue
10405 }
10406 c := auxIntToInt32(v_0.AuxInt)
10407 if v_1.Op != OpConst32 {
10408 continue
10409 }
10410 d := auxIntToInt32(v_1.AuxInt)
10411 v.reset(OpConstBool)
10412 v.AuxInt = boolToAuxInt(c == d)
10413 return true
10414 }
10415 break
10416 }
10417
10418
10419 for {
10420 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10421 if v_0.Op != OpConst64 {
10422 continue
10423 }
10424 c := auxIntToInt64(v_0.AuxInt)
10425 if v_1.Op != OpConst64 {
10426 continue
10427 }
10428 d := auxIntToInt64(v_1.AuxInt)
10429 v.reset(OpConstBool)
10430 v.AuxInt = boolToAuxInt(c == d)
10431 return true
10432 }
10433 break
10434 }
10435
10436
10437 for {
10438 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10439 if v_0.Op != OpConvert {
10440 continue
10441 }
10442 v_0_0 := v_0.Args[0]
10443 if v_0_0.Op != OpAddr {
10444 continue
10445 }
10446 x := auxToSym(v_0_0.Aux)
10447 if v_1.Op != OpAddr {
10448 continue
10449 }
10450 y := auxToSym(v_1.Aux)
10451 v.reset(OpConstBool)
10452 v.AuxInt = boolToAuxInt(x == y)
10453 return true
10454 }
10455 break
10456 }
10457
10458
10459 for {
10460 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10461 if v_0.Op != OpLocalAddr || v_1.Op != OpAddr {
10462 continue
10463 }
10464 v.reset(OpConstBool)
10465 v.AuxInt = boolToAuxInt(false)
10466 return true
10467 }
10468 break
10469 }
10470
10471
10472 for {
10473 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10474 if v_0.Op != OpOffPtr {
10475 continue
10476 }
10477 v_0_0 := v_0.Args[0]
10478 if v_0_0.Op != OpLocalAddr || v_1.Op != OpAddr {
10479 continue
10480 }
10481 v.reset(OpConstBool)
10482 v.AuxInt = boolToAuxInt(false)
10483 return true
10484 }
10485 break
10486 }
10487
10488
10489 for {
10490 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10491 if v_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
10492 continue
10493 }
10494 v_1_0 := v_1.Args[0]
10495 if v_1_0.Op != OpAddr {
10496 continue
10497 }
10498 v.reset(OpConstBool)
10499 v.AuxInt = boolToAuxInt(false)
10500 return true
10501 }
10502 break
10503 }
10504
10505
10506 for {
10507 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10508 if v_0.Op != OpOffPtr {
10509 continue
10510 }
10511 v_0_0 := v_0.Args[0]
10512 if v_0_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
10513 continue
10514 }
10515 v_1_0 := v_1.Args[0]
10516 if v_1_0.Op != OpAddr {
10517 continue
10518 }
10519 v.reset(OpConstBool)
10520 v.AuxInt = boolToAuxInt(false)
10521 return true
10522 }
10523 break
10524 }
10525
10526
10527
10528 for {
10529 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10530 if v_0.Op != OpAddPtr {
10531 continue
10532 }
10533 o1 := v_0.Args[1]
10534 p1 := v_0.Args[0]
10535 p2 := v_1
10536 if !(isSamePtr(p1, p2)) {
10537 continue
10538 }
10539 v.reset(OpNot)
10540 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
10541 v0.AddArg(o1)
10542 v.AddArg(v0)
10543 return true
10544 }
10545 break
10546 }
10547
10548
10549 for {
10550 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10551 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
10552 continue
10553 }
10554 p := v_1
10555 v.reset(OpNot)
10556 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
10557 v0.AddArg(p)
10558 v.AddArg(v0)
10559 return true
10560 }
10561 break
10562 }
10563
10564
10565 for {
10566 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10567 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
10568 continue
10569 }
10570 p := v_1
10571 v.reset(OpNot)
10572 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
10573 v0.AddArg(p)
10574 v.AddArg(v0)
10575 return true
10576 }
10577 break
10578 }
10579
10580
10581 for {
10582 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10583 if v_0.Op != OpConstNil {
10584 continue
10585 }
10586 p := v_1
10587 v.reset(OpNot)
10588 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
10589 v0.AddArg(p)
10590 v.AddArg(v0)
10591 return true
10592 }
10593 break
10594 }
10595 return false
10596 }
10597 func rewriteValuegeneric_OpEqSlice(v *Value) bool {
10598 v_1 := v.Args[1]
10599 v_0 := v.Args[0]
10600 b := v.Block
10601 typ := &b.Func.Config.Types
10602
10603
10604 for {
10605 x := v_0
10606 y := v_1
10607 v.reset(OpEqPtr)
10608 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
10609 v0.AddArg(x)
10610 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
10611 v1.AddArg(y)
10612 v.AddArg2(v0, v1)
10613 return true
10614 }
10615 }
10616 func rewriteValuegeneric_OpFloor(v *Value) bool {
10617 v_0 := v.Args[0]
10618
10619
10620 for {
10621 if v_0.Op != OpConst64F {
10622 break
10623 }
10624 c := auxIntToFloat64(v_0.AuxInt)
10625 v.reset(OpConst64F)
10626 v.AuxInt = float64ToAuxInt(math.Floor(c))
10627 return true
10628 }
10629 return false
10630 }
10631 func rewriteValuegeneric_OpIMake(v *Value) bool {
10632 v_1 := v.Args[1]
10633 v_0 := v.Args[0]
10634
10635
10636 for {
10637 _typ := v_0
10638 if v_1.Op != OpStructMake || len(v_1.Args) != 1 {
10639 break
10640 }
10641 val := v_1.Args[0]
10642 v.reset(OpIMake)
10643 v.AddArg2(_typ, val)
10644 return true
10645 }
10646
10647
10648 for {
10649 _typ := v_0
10650 if v_1.Op != OpArrayMake1 {
10651 break
10652 }
10653 val := v_1.Args[0]
10654 v.reset(OpIMake)
10655 v.AddArg2(_typ, val)
10656 return true
10657 }
10658 return false
10659 }
10660 func rewriteValuegeneric_OpInterLECall(v *Value) bool {
10661
10662
10663 for {
10664 if len(v.Args) < 1 {
10665 break
10666 }
10667 v_0 := v.Args[0]
10668 if v_0.Op != OpAddr {
10669 break
10670 }
10671 fn := auxToSym(v_0.Aux)
10672 v_0_0 := v_0.Args[0]
10673 if v_0_0.Op != OpSB {
10674 break
10675 }
10676 v.copyOf(devirtLECall(v, fn.(*obj.LSym)))
10677 return true
10678 }
10679 return false
10680 }
10681 func rewriteValuegeneric_OpIsInBounds(v *Value) bool {
10682 v_1 := v.Args[1]
10683 v_0 := v.Args[0]
10684
10685
10686
10687 for {
10688 if v_0.Op != OpZeroExt8to32 || v_1.Op != OpConst32 {
10689 break
10690 }
10691 c := auxIntToInt32(v_1.AuxInt)
10692 if !((1 << 8) <= c) {
10693 break
10694 }
10695 v.reset(OpConstBool)
10696 v.AuxInt = boolToAuxInt(true)
10697 return true
10698 }
10699
10700
10701
10702 for {
10703 if v_0.Op != OpZeroExt8to64 || v_1.Op != OpConst64 {
10704 break
10705 }
10706 c := auxIntToInt64(v_1.AuxInt)
10707 if !((1 << 8) <= c) {
10708 break
10709 }
10710 v.reset(OpConstBool)
10711 v.AuxInt = boolToAuxInt(true)
10712 return true
10713 }
10714
10715
10716
10717 for {
10718 if v_0.Op != OpZeroExt16to32 || v_1.Op != OpConst32 {
10719 break
10720 }
10721 c := auxIntToInt32(v_1.AuxInt)
10722 if !((1 << 16) <= c) {
10723 break
10724 }
10725 v.reset(OpConstBool)
10726 v.AuxInt = boolToAuxInt(true)
10727 return true
10728 }
10729
10730
10731
10732 for {
10733 if v_0.Op != OpZeroExt16to64 || v_1.Op != OpConst64 {
10734 break
10735 }
10736 c := auxIntToInt64(v_1.AuxInt)
10737 if !((1 << 16) <= c) {
10738 break
10739 }
10740 v.reset(OpConstBool)
10741 v.AuxInt = boolToAuxInt(true)
10742 return true
10743 }
10744
10745
10746 for {
10747 x := v_0
10748 if x != v_1 {
10749 break
10750 }
10751 v.reset(OpConstBool)
10752 v.AuxInt = boolToAuxInt(false)
10753 return true
10754 }
10755
10756
10757
10758 for {
10759 if v_0.Op != OpAnd8 {
10760 break
10761 }
10762 v_0_0 := v_0.Args[0]
10763 v_0_1 := v_0.Args[1]
10764 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
10765 if v_0_0.Op != OpConst8 {
10766 continue
10767 }
10768 c := auxIntToInt8(v_0_0.AuxInt)
10769 if v_1.Op != OpConst8 {
10770 continue
10771 }
10772 d := auxIntToInt8(v_1.AuxInt)
10773 if !(0 <= c && c < d) {
10774 continue
10775 }
10776 v.reset(OpConstBool)
10777 v.AuxInt = boolToAuxInt(true)
10778 return true
10779 }
10780 break
10781 }
10782
10783
10784
10785 for {
10786 if v_0.Op != OpZeroExt8to16 {
10787 break
10788 }
10789 v_0_0 := v_0.Args[0]
10790 if v_0_0.Op != OpAnd8 {
10791 break
10792 }
10793 v_0_0_0 := v_0_0.Args[0]
10794 v_0_0_1 := v_0_0.Args[1]
10795 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
10796 if v_0_0_0.Op != OpConst8 {
10797 continue
10798 }
10799 c := auxIntToInt8(v_0_0_0.AuxInt)
10800 if v_1.Op != OpConst16 {
10801 continue
10802 }
10803 d := auxIntToInt16(v_1.AuxInt)
10804 if !(0 <= c && int16(c) < d) {
10805 continue
10806 }
10807 v.reset(OpConstBool)
10808 v.AuxInt = boolToAuxInt(true)
10809 return true
10810 }
10811 break
10812 }
10813
10814
10815
10816 for {
10817 if v_0.Op != OpZeroExt8to32 {
10818 break
10819 }
10820 v_0_0 := v_0.Args[0]
10821 if v_0_0.Op != OpAnd8 {
10822 break
10823 }
10824 v_0_0_0 := v_0_0.Args[0]
10825 v_0_0_1 := v_0_0.Args[1]
10826 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
10827 if v_0_0_0.Op != OpConst8 {
10828 continue
10829 }
10830 c := auxIntToInt8(v_0_0_0.AuxInt)
10831 if v_1.Op != OpConst32 {
10832 continue
10833 }
10834 d := auxIntToInt32(v_1.AuxInt)
10835 if !(0 <= c && int32(c) < d) {
10836 continue
10837 }
10838 v.reset(OpConstBool)
10839 v.AuxInt = boolToAuxInt(true)
10840 return true
10841 }
10842 break
10843 }
10844
10845
10846
10847 for {
10848 if v_0.Op != OpZeroExt8to64 {
10849 break
10850 }
10851 v_0_0 := v_0.Args[0]
10852 if v_0_0.Op != OpAnd8 {
10853 break
10854 }
10855 v_0_0_0 := v_0_0.Args[0]
10856 v_0_0_1 := v_0_0.Args[1]
10857 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
10858 if v_0_0_0.Op != OpConst8 {
10859 continue
10860 }
10861 c := auxIntToInt8(v_0_0_0.AuxInt)
10862 if v_1.Op != OpConst64 {
10863 continue
10864 }
10865 d := auxIntToInt64(v_1.AuxInt)
10866 if !(0 <= c && int64(c) < d) {
10867 continue
10868 }
10869 v.reset(OpConstBool)
10870 v.AuxInt = boolToAuxInt(true)
10871 return true
10872 }
10873 break
10874 }
10875
10876
10877
10878 for {
10879 if v_0.Op != OpAnd16 {
10880 break
10881 }
10882 v_0_0 := v_0.Args[0]
10883 v_0_1 := v_0.Args[1]
10884 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
10885 if v_0_0.Op != OpConst16 {
10886 continue
10887 }
10888 c := auxIntToInt16(v_0_0.AuxInt)
10889 if v_1.Op != OpConst16 {
10890 continue
10891 }
10892 d := auxIntToInt16(v_1.AuxInt)
10893 if !(0 <= c && c < d) {
10894 continue
10895 }
10896 v.reset(OpConstBool)
10897 v.AuxInt = boolToAuxInt(true)
10898 return true
10899 }
10900 break
10901 }
10902
10903
10904
10905 for {
10906 if v_0.Op != OpZeroExt16to32 {
10907 break
10908 }
10909 v_0_0 := v_0.Args[0]
10910 if v_0_0.Op != OpAnd16 {
10911 break
10912 }
10913 v_0_0_0 := v_0_0.Args[0]
10914 v_0_0_1 := v_0_0.Args[1]
10915 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
10916 if v_0_0_0.Op != OpConst16 {
10917 continue
10918 }
10919 c := auxIntToInt16(v_0_0_0.AuxInt)
10920 if v_1.Op != OpConst32 {
10921 continue
10922 }
10923 d := auxIntToInt32(v_1.AuxInt)
10924 if !(0 <= c && int32(c) < d) {
10925 continue
10926 }
10927 v.reset(OpConstBool)
10928 v.AuxInt = boolToAuxInt(true)
10929 return true
10930 }
10931 break
10932 }
10933
10934
10935
10936 for {
10937 if v_0.Op != OpZeroExt16to64 {
10938 break
10939 }
10940 v_0_0 := v_0.Args[0]
10941 if v_0_0.Op != OpAnd16 {
10942 break
10943 }
10944 v_0_0_0 := v_0_0.Args[0]
10945 v_0_0_1 := v_0_0.Args[1]
10946 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
10947 if v_0_0_0.Op != OpConst16 {
10948 continue
10949 }
10950 c := auxIntToInt16(v_0_0_0.AuxInt)
10951 if v_1.Op != OpConst64 {
10952 continue
10953 }
10954 d := auxIntToInt64(v_1.AuxInt)
10955 if !(0 <= c && int64(c) < d) {
10956 continue
10957 }
10958 v.reset(OpConstBool)
10959 v.AuxInt = boolToAuxInt(true)
10960 return true
10961 }
10962 break
10963 }
10964
10965
10966
10967 for {
10968 if v_0.Op != OpAnd32 {
10969 break
10970 }
10971 v_0_0 := v_0.Args[0]
10972 v_0_1 := v_0.Args[1]
10973 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
10974 if v_0_0.Op != OpConst32 {
10975 continue
10976 }
10977 c := auxIntToInt32(v_0_0.AuxInt)
10978 if v_1.Op != OpConst32 {
10979 continue
10980 }
10981 d := auxIntToInt32(v_1.AuxInt)
10982 if !(0 <= c && c < d) {
10983 continue
10984 }
10985 v.reset(OpConstBool)
10986 v.AuxInt = boolToAuxInt(true)
10987 return true
10988 }
10989 break
10990 }
10991
10992
10993
10994 for {
10995 if v_0.Op != OpZeroExt32to64 {
10996 break
10997 }
10998 v_0_0 := v_0.Args[0]
10999 if v_0_0.Op != OpAnd32 {
11000 break
11001 }
11002 v_0_0_0 := v_0_0.Args[0]
11003 v_0_0_1 := v_0_0.Args[1]
11004 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
11005 if v_0_0_0.Op != OpConst32 {
11006 continue
11007 }
11008 c := auxIntToInt32(v_0_0_0.AuxInt)
11009 if v_1.Op != OpConst64 {
11010 continue
11011 }
11012 d := auxIntToInt64(v_1.AuxInt)
11013 if !(0 <= c && int64(c) < d) {
11014 continue
11015 }
11016 v.reset(OpConstBool)
11017 v.AuxInt = boolToAuxInt(true)
11018 return true
11019 }
11020 break
11021 }
11022
11023
11024
11025 for {
11026 if v_0.Op != OpAnd64 {
11027 break
11028 }
11029 v_0_0 := v_0.Args[0]
11030 v_0_1 := v_0.Args[1]
11031 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
11032 if v_0_0.Op != OpConst64 {
11033 continue
11034 }
11035 c := auxIntToInt64(v_0_0.AuxInt)
11036 if v_1.Op != OpConst64 {
11037 continue
11038 }
11039 d := auxIntToInt64(v_1.AuxInt)
11040 if !(0 <= c && c < d) {
11041 continue
11042 }
11043 v.reset(OpConstBool)
11044 v.AuxInt = boolToAuxInt(true)
11045 return true
11046 }
11047 break
11048 }
11049
11050
11051 for {
11052 if v_0.Op != OpConst32 {
11053 break
11054 }
11055 c := auxIntToInt32(v_0.AuxInt)
11056 if v_1.Op != OpConst32 {
11057 break
11058 }
11059 d := auxIntToInt32(v_1.AuxInt)
11060 v.reset(OpConstBool)
11061 v.AuxInt = boolToAuxInt(0 <= c && c < d)
11062 return true
11063 }
11064
11065
11066 for {
11067 if v_0.Op != OpConst64 {
11068 break
11069 }
11070 c := auxIntToInt64(v_0.AuxInt)
11071 if v_1.Op != OpConst64 {
11072 break
11073 }
11074 d := auxIntToInt64(v_1.AuxInt)
11075 v.reset(OpConstBool)
11076 v.AuxInt = boolToAuxInt(0 <= c && c < d)
11077 return true
11078 }
11079
11080
11081 for {
11082 if v_0.Op != OpMod32u {
11083 break
11084 }
11085 y := v_0.Args[1]
11086 if y != v_1 {
11087 break
11088 }
11089 v.reset(OpConstBool)
11090 v.AuxInt = boolToAuxInt(true)
11091 return true
11092 }
11093
11094
11095 for {
11096 if v_0.Op != OpMod64u {
11097 break
11098 }
11099 y := v_0.Args[1]
11100 if y != v_1 {
11101 break
11102 }
11103 v.reset(OpConstBool)
11104 v.AuxInt = boolToAuxInt(true)
11105 return true
11106 }
11107
11108
11109
11110 for {
11111 if v_0.Op != OpZeroExt8to64 {
11112 break
11113 }
11114 v_0_0 := v_0.Args[0]
11115 if v_0_0.Op != OpRsh8Ux64 {
11116 break
11117 }
11118 _ = v_0_0.Args[1]
11119 v_0_0_1 := v_0_0.Args[1]
11120 if v_0_0_1.Op != OpConst64 {
11121 break
11122 }
11123 c := auxIntToInt64(v_0_0_1.AuxInt)
11124 if v_1.Op != OpConst64 {
11125 break
11126 }
11127 d := auxIntToInt64(v_1.AuxInt)
11128 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
11129 break
11130 }
11131 v.reset(OpConstBool)
11132 v.AuxInt = boolToAuxInt(true)
11133 return true
11134 }
11135
11136
11137
11138 for {
11139 if v_0.Op != OpZeroExt8to32 {
11140 break
11141 }
11142 v_0_0 := v_0.Args[0]
11143 if v_0_0.Op != OpRsh8Ux64 {
11144 break
11145 }
11146 _ = v_0_0.Args[1]
11147 v_0_0_1 := v_0_0.Args[1]
11148 if v_0_0_1.Op != OpConst64 {
11149 break
11150 }
11151 c := auxIntToInt64(v_0_0_1.AuxInt)
11152 if v_1.Op != OpConst32 {
11153 break
11154 }
11155 d := auxIntToInt32(v_1.AuxInt)
11156 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
11157 break
11158 }
11159 v.reset(OpConstBool)
11160 v.AuxInt = boolToAuxInt(true)
11161 return true
11162 }
11163
11164
11165
11166 for {
11167 if v_0.Op != OpZeroExt8to16 {
11168 break
11169 }
11170 v_0_0 := v_0.Args[0]
11171 if v_0_0.Op != OpRsh8Ux64 {
11172 break
11173 }
11174 _ = v_0_0.Args[1]
11175 v_0_0_1 := v_0_0.Args[1]
11176 if v_0_0_1.Op != OpConst64 {
11177 break
11178 }
11179 c := auxIntToInt64(v_0_0_1.AuxInt)
11180 if v_1.Op != OpConst16 {
11181 break
11182 }
11183 d := auxIntToInt16(v_1.AuxInt)
11184 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
11185 break
11186 }
11187 v.reset(OpConstBool)
11188 v.AuxInt = boolToAuxInt(true)
11189 return true
11190 }
11191
11192
11193
11194 for {
11195 if v_0.Op != OpRsh8Ux64 {
11196 break
11197 }
11198 _ = v_0.Args[1]
11199 v_0_1 := v_0.Args[1]
11200 if v_0_1.Op != OpConst64 {
11201 break
11202 }
11203 c := auxIntToInt64(v_0_1.AuxInt)
11204 if v_1.Op != OpConst64 {
11205 break
11206 }
11207 d := auxIntToInt64(v_1.AuxInt)
11208 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
11209 break
11210 }
11211 v.reset(OpConstBool)
11212 v.AuxInt = boolToAuxInt(true)
11213 return true
11214 }
11215
11216
11217
11218 for {
11219 if v_0.Op != OpZeroExt16to64 {
11220 break
11221 }
11222 v_0_0 := v_0.Args[0]
11223 if v_0_0.Op != OpRsh16Ux64 {
11224 break
11225 }
11226 _ = v_0_0.Args[1]
11227 v_0_0_1 := v_0_0.Args[1]
11228 if v_0_0_1.Op != OpConst64 {
11229 break
11230 }
11231 c := auxIntToInt64(v_0_0_1.AuxInt)
11232 if v_1.Op != OpConst64 {
11233 break
11234 }
11235 d := auxIntToInt64(v_1.AuxInt)
11236 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
11237 break
11238 }
11239 v.reset(OpConstBool)
11240 v.AuxInt = boolToAuxInt(true)
11241 return true
11242 }
11243
11244
11245
11246 for {
11247 if v_0.Op != OpZeroExt16to32 {
11248 break
11249 }
11250 v_0_0 := v_0.Args[0]
11251 if v_0_0.Op != OpRsh16Ux64 {
11252 break
11253 }
11254 _ = v_0_0.Args[1]
11255 v_0_0_1 := v_0_0.Args[1]
11256 if v_0_0_1.Op != OpConst64 {
11257 break
11258 }
11259 c := auxIntToInt64(v_0_0_1.AuxInt)
11260 if v_1.Op != OpConst64 {
11261 break
11262 }
11263 d := auxIntToInt64(v_1.AuxInt)
11264 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
11265 break
11266 }
11267 v.reset(OpConstBool)
11268 v.AuxInt = boolToAuxInt(true)
11269 return true
11270 }
11271
11272
11273
11274 for {
11275 if v_0.Op != OpRsh16Ux64 {
11276 break
11277 }
11278 _ = v_0.Args[1]
11279 v_0_1 := v_0.Args[1]
11280 if v_0_1.Op != OpConst64 {
11281 break
11282 }
11283 c := auxIntToInt64(v_0_1.AuxInt)
11284 if v_1.Op != OpConst64 {
11285 break
11286 }
11287 d := auxIntToInt64(v_1.AuxInt)
11288 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
11289 break
11290 }
11291 v.reset(OpConstBool)
11292 v.AuxInt = boolToAuxInt(true)
11293 return true
11294 }
11295
11296
11297
11298 for {
11299 if v_0.Op != OpZeroExt32to64 {
11300 break
11301 }
11302 v_0_0 := v_0.Args[0]
11303 if v_0_0.Op != OpRsh32Ux64 {
11304 break
11305 }
11306 _ = v_0_0.Args[1]
11307 v_0_0_1 := v_0_0.Args[1]
11308 if v_0_0_1.Op != OpConst64 {
11309 break
11310 }
11311 c := auxIntToInt64(v_0_0_1.AuxInt)
11312 if v_1.Op != OpConst64 {
11313 break
11314 }
11315 d := auxIntToInt64(v_1.AuxInt)
11316 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) {
11317 break
11318 }
11319 v.reset(OpConstBool)
11320 v.AuxInt = boolToAuxInt(true)
11321 return true
11322 }
11323
11324
11325
11326 for {
11327 if v_0.Op != OpRsh32Ux64 {
11328 break
11329 }
11330 _ = v_0.Args[1]
11331 v_0_1 := v_0.Args[1]
11332 if v_0_1.Op != OpConst64 {
11333 break
11334 }
11335 c := auxIntToInt64(v_0_1.AuxInt)
11336 if v_1.Op != OpConst64 {
11337 break
11338 }
11339 d := auxIntToInt64(v_1.AuxInt)
11340 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) {
11341 break
11342 }
11343 v.reset(OpConstBool)
11344 v.AuxInt = boolToAuxInt(true)
11345 return true
11346 }
11347
11348
11349
11350 for {
11351 if v_0.Op != OpRsh64Ux64 {
11352 break
11353 }
11354 _ = v_0.Args[1]
11355 v_0_1 := v_0.Args[1]
11356 if v_0_1.Op != OpConst64 {
11357 break
11358 }
11359 c := auxIntToInt64(v_0_1.AuxInt)
11360 if v_1.Op != OpConst64 {
11361 break
11362 }
11363 d := auxIntToInt64(v_1.AuxInt)
11364 if !(0 < c && c < 64 && 1<<uint(64-c)-1 < d) {
11365 break
11366 }
11367 v.reset(OpConstBool)
11368 v.AuxInt = boolToAuxInt(true)
11369 return true
11370 }
11371 return false
11372 }
11373 func rewriteValuegeneric_OpIsNonNil(v *Value) bool {
11374 v_0 := v.Args[0]
11375
11376
11377 for {
11378 if v_0.Op != OpConstNil {
11379 break
11380 }
11381 v.reset(OpConstBool)
11382 v.AuxInt = boolToAuxInt(false)
11383 return true
11384 }
11385
11386
11387 for {
11388 if v_0.Op != OpConst32 {
11389 break
11390 }
11391 c := auxIntToInt32(v_0.AuxInt)
11392 v.reset(OpConstBool)
11393 v.AuxInt = boolToAuxInt(c != 0)
11394 return true
11395 }
11396
11397
11398 for {
11399 if v_0.Op != OpConst64 {
11400 break
11401 }
11402 c := auxIntToInt64(v_0.AuxInt)
11403 v.reset(OpConstBool)
11404 v.AuxInt = boolToAuxInt(c != 0)
11405 return true
11406 }
11407
11408
11409 for {
11410 if v_0.Op != OpAddr {
11411 break
11412 }
11413 v.reset(OpConstBool)
11414 v.AuxInt = boolToAuxInt(true)
11415 return true
11416 }
11417
11418
11419 for {
11420 if v_0.Op != OpConvert {
11421 break
11422 }
11423 v_0_0 := v_0.Args[0]
11424 if v_0_0.Op != OpAddr {
11425 break
11426 }
11427 v.reset(OpConstBool)
11428 v.AuxInt = boolToAuxInt(true)
11429 return true
11430 }
11431
11432
11433 for {
11434 if v_0.Op != OpLocalAddr {
11435 break
11436 }
11437 v.reset(OpConstBool)
11438 v.AuxInt = boolToAuxInt(true)
11439 return true
11440 }
11441 return false
11442 }
11443 func rewriteValuegeneric_OpIsSliceInBounds(v *Value) bool {
11444 v_1 := v.Args[1]
11445 v_0 := v.Args[0]
11446
11447
11448 for {
11449 x := v_0
11450 if x != v_1 {
11451 break
11452 }
11453 v.reset(OpConstBool)
11454 v.AuxInt = boolToAuxInt(true)
11455 return true
11456 }
11457
11458
11459
11460 for {
11461 if v_0.Op != OpAnd32 {
11462 break
11463 }
11464 v_0_0 := v_0.Args[0]
11465 v_0_1 := v_0.Args[1]
11466 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
11467 if v_0_0.Op != OpConst32 {
11468 continue
11469 }
11470 c := auxIntToInt32(v_0_0.AuxInt)
11471 if v_1.Op != OpConst32 {
11472 continue
11473 }
11474 d := auxIntToInt32(v_1.AuxInt)
11475 if !(0 <= c && c <= d) {
11476 continue
11477 }
11478 v.reset(OpConstBool)
11479 v.AuxInt = boolToAuxInt(true)
11480 return true
11481 }
11482 break
11483 }
11484
11485
11486
11487 for {
11488 if v_0.Op != OpAnd64 {
11489 break
11490 }
11491 v_0_0 := v_0.Args[0]
11492 v_0_1 := v_0.Args[1]
11493 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
11494 if v_0_0.Op != OpConst64 {
11495 continue
11496 }
11497 c := auxIntToInt64(v_0_0.AuxInt)
11498 if v_1.Op != OpConst64 {
11499 continue
11500 }
11501 d := auxIntToInt64(v_1.AuxInt)
11502 if !(0 <= c && c <= d) {
11503 continue
11504 }
11505 v.reset(OpConstBool)
11506 v.AuxInt = boolToAuxInt(true)
11507 return true
11508 }
11509 break
11510 }
11511
11512
11513 for {
11514 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
11515 break
11516 }
11517 v.reset(OpConstBool)
11518 v.AuxInt = boolToAuxInt(true)
11519 return true
11520 }
11521
11522
11523 for {
11524 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
11525 break
11526 }
11527 v.reset(OpConstBool)
11528 v.AuxInt = boolToAuxInt(true)
11529 return true
11530 }
11531
11532
11533 for {
11534 if v_0.Op != OpConst32 {
11535 break
11536 }
11537 c := auxIntToInt32(v_0.AuxInt)
11538 if v_1.Op != OpConst32 {
11539 break
11540 }
11541 d := auxIntToInt32(v_1.AuxInt)
11542 v.reset(OpConstBool)
11543 v.AuxInt = boolToAuxInt(0 <= c && c <= d)
11544 return true
11545 }
11546
11547
11548 for {
11549 if v_0.Op != OpConst64 {
11550 break
11551 }
11552 c := auxIntToInt64(v_0.AuxInt)
11553 if v_1.Op != OpConst64 {
11554 break
11555 }
11556 d := auxIntToInt64(v_1.AuxInt)
11557 v.reset(OpConstBool)
11558 v.AuxInt = boolToAuxInt(0 <= c && c <= d)
11559 return true
11560 }
11561
11562
11563 for {
11564 if v_0.Op != OpSliceLen {
11565 break
11566 }
11567 x := v_0.Args[0]
11568 if v_1.Op != OpSliceCap || x != v_1.Args[0] {
11569 break
11570 }
11571 v.reset(OpConstBool)
11572 v.AuxInt = boolToAuxInt(true)
11573 return true
11574 }
11575 return false
11576 }
11577 func rewriteValuegeneric_OpLeq16(v *Value) bool {
11578 v_1 := v.Args[1]
11579 v_0 := v.Args[0]
11580 b := v.Block
11581
11582
11583 for {
11584 if v_0.Op != OpConst16 {
11585 break
11586 }
11587 c := auxIntToInt16(v_0.AuxInt)
11588 if v_1.Op != OpConst16 {
11589 break
11590 }
11591 d := auxIntToInt16(v_1.AuxInt)
11592 v.reset(OpConstBool)
11593 v.AuxInt = boolToAuxInt(c <= d)
11594 return true
11595 }
11596
11597
11598
11599 for {
11600 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 || v_1.Op != OpAnd16 {
11601 break
11602 }
11603 _ = v_1.Args[1]
11604 v_1_0 := v_1.Args[0]
11605 v_1_1 := v_1.Args[1]
11606 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
11607 if v_1_1.Op != OpConst16 {
11608 continue
11609 }
11610 c := auxIntToInt16(v_1_1.AuxInt)
11611 if !(c >= 0) {
11612 continue
11613 }
11614 v.reset(OpConstBool)
11615 v.AuxInt = boolToAuxInt(true)
11616 return true
11617 }
11618 break
11619 }
11620
11621
11622
11623 for {
11624 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 || v_1.Op != OpRsh16Ux64 {
11625 break
11626 }
11627 _ = v_1.Args[1]
11628 v_1_1 := v_1.Args[1]
11629 if v_1_1.Op != OpConst64 {
11630 break
11631 }
11632 c := auxIntToInt64(v_1_1.AuxInt)
11633 if !(c > 0) {
11634 break
11635 }
11636 v.reset(OpConstBool)
11637 v.AuxInt = boolToAuxInt(true)
11638 return true
11639 }
11640
11641
11642 for {
11643 x := v_0
11644 if v_1.Op != OpConst16 {
11645 break
11646 }
11647 t := v_1.Type
11648 if auxIntToInt16(v_1.AuxInt) != -1 {
11649 break
11650 }
11651 v.reset(OpLess16)
11652 v0 := b.NewValue0(v.Pos, OpConst16, t)
11653 v0.AuxInt = int16ToAuxInt(0)
11654 v.AddArg2(x, v0)
11655 return true
11656 }
11657
11658
11659 for {
11660 if v_0.Op != OpConst16 {
11661 break
11662 }
11663 t := v_0.Type
11664 if auxIntToInt16(v_0.AuxInt) != 1 {
11665 break
11666 }
11667 x := v_1
11668 v.reset(OpLess16)
11669 v0 := b.NewValue0(v.Pos, OpConst16, t)
11670 v0.AuxInt = int16ToAuxInt(0)
11671 v.AddArg2(v0, x)
11672 return true
11673 }
11674
11675
11676 for {
11677 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != math.MinInt16 {
11678 break
11679 }
11680 v.reset(OpConstBool)
11681 v.AuxInt = boolToAuxInt(true)
11682 return true
11683 }
11684
11685
11686 for {
11687 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != math.MaxInt16 {
11688 break
11689 }
11690 v.reset(OpConstBool)
11691 v.AuxInt = boolToAuxInt(true)
11692 return true
11693 }
11694
11695
11696 for {
11697 x := v_0
11698 c := v_1
11699 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != math.MinInt16 {
11700 break
11701 }
11702 v.reset(OpEq16)
11703 v.AddArg2(x, c)
11704 return true
11705 }
11706
11707
11708 for {
11709 c := v_0
11710 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != math.MaxInt16 {
11711 break
11712 }
11713 x := v_1
11714 v.reset(OpEq16)
11715 v.AddArg2(x, c)
11716 return true
11717 }
11718 return false
11719 }
11720 func rewriteValuegeneric_OpLeq16U(v *Value) bool {
11721 v_1 := v.Args[1]
11722 v_0 := v.Args[0]
11723 b := v.Block
11724
11725
11726 for {
11727 if v_0.Op != OpConst16 {
11728 break
11729 }
11730 c := auxIntToInt16(v_0.AuxInt)
11731 if v_1.Op != OpConst16 {
11732 break
11733 }
11734 d := auxIntToInt16(v_1.AuxInt)
11735 v.reset(OpConstBool)
11736 v.AuxInt = boolToAuxInt(uint16(c) <= uint16(d))
11737 return true
11738 }
11739
11740
11741 for {
11742 if v_0.Op != OpConst16 {
11743 break
11744 }
11745 t := v_0.Type
11746 if auxIntToInt16(v_0.AuxInt) != 1 {
11747 break
11748 }
11749 x := v_1
11750 v.reset(OpNeq16)
11751 v0 := b.NewValue0(v.Pos, OpConst16, t)
11752 v0.AuxInt = int16ToAuxInt(0)
11753 v.AddArg2(v0, x)
11754 return true
11755 }
11756
11757
11758 for {
11759 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
11760 break
11761 }
11762 v.reset(OpConstBool)
11763 v.AuxInt = boolToAuxInt(true)
11764 return true
11765 }
11766
11767
11768 for {
11769 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != -1 {
11770 break
11771 }
11772 v.reset(OpConstBool)
11773 v.AuxInt = boolToAuxInt(true)
11774 return true
11775 }
11776
11777
11778 for {
11779 x := v_0
11780 c := v_1
11781 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != 0 {
11782 break
11783 }
11784 v.reset(OpEq16)
11785 v.AddArg2(x, c)
11786 return true
11787 }
11788
11789
11790 for {
11791 c := v_0
11792 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != -1 {
11793 break
11794 }
11795 x := v_1
11796 v.reset(OpEq16)
11797 v.AddArg2(x, c)
11798 return true
11799 }
11800 return false
11801 }
11802 func rewriteValuegeneric_OpLeq32(v *Value) bool {
11803 v_1 := v.Args[1]
11804 v_0 := v.Args[0]
11805 b := v.Block
11806
11807
11808 for {
11809 if v_0.Op != OpConst32 {
11810 break
11811 }
11812 c := auxIntToInt32(v_0.AuxInt)
11813 if v_1.Op != OpConst32 {
11814 break
11815 }
11816 d := auxIntToInt32(v_1.AuxInt)
11817 v.reset(OpConstBool)
11818 v.AuxInt = boolToAuxInt(c <= d)
11819 return true
11820 }
11821
11822
11823
11824 for {
11825 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 || v_1.Op != OpAnd32 {
11826 break
11827 }
11828 _ = v_1.Args[1]
11829 v_1_0 := v_1.Args[0]
11830 v_1_1 := v_1.Args[1]
11831 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
11832 if v_1_1.Op != OpConst32 {
11833 continue
11834 }
11835 c := auxIntToInt32(v_1_1.AuxInt)
11836 if !(c >= 0) {
11837 continue
11838 }
11839 v.reset(OpConstBool)
11840 v.AuxInt = boolToAuxInt(true)
11841 return true
11842 }
11843 break
11844 }
11845
11846
11847
11848 for {
11849 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 || v_1.Op != OpRsh32Ux64 {
11850 break
11851 }
11852 _ = v_1.Args[1]
11853 v_1_1 := v_1.Args[1]
11854 if v_1_1.Op != OpConst64 {
11855 break
11856 }
11857 c := auxIntToInt64(v_1_1.AuxInt)
11858 if !(c > 0) {
11859 break
11860 }
11861 v.reset(OpConstBool)
11862 v.AuxInt = boolToAuxInt(true)
11863 return true
11864 }
11865
11866
11867 for {
11868 x := v_0
11869 if v_1.Op != OpConst32 {
11870 break
11871 }
11872 t := v_1.Type
11873 if auxIntToInt32(v_1.AuxInt) != -1 {
11874 break
11875 }
11876 v.reset(OpLess32)
11877 v0 := b.NewValue0(v.Pos, OpConst32, t)
11878 v0.AuxInt = int32ToAuxInt(0)
11879 v.AddArg2(x, v0)
11880 return true
11881 }
11882
11883
11884 for {
11885 if v_0.Op != OpConst32 {
11886 break
11887 }
11888 t := v_0.Type
11889 if auxIntToInt32(v_0.AuxInt) != 1 {
11890 break
11891 }
11892 x := v_1
11893 v.reset(OpLess32)
11894 v0 := b.NewValue0(v.Pos, OpConst32, t)
11895 v0.AuxInt = int32ToAuxInt(0)
11896 v.AddArg2(v0, x)
11897 return true
11898 }
11899
11900
11901 for {
11902 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != math.MinInt32 {
11903 break
11904 }
11905 v.reset(OpConstBool)
11906 v.AuxInt = boolToAuxInt(true)
11907 return true
11908 }
11909
11910
11911 for {
11912 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != math.MaxInt32 {
11913 break
11914 }
11915 v.reset(OpConstBool)
11916 v.AuxInt = boolToAuxInt(true)
11917 return true
11918 }
11919
11920
11921 for {
11922 x := v_0
11923 c := v_1
11924 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != math.MinInt32 {
11925 break
11926 }
11927 v.reset(OpEq32)
11928 v.AddArg2(x, c)
11929 return true
11930 }
11931
11932
11933 for {
11934 c := v_0
11935 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != math.MaxInt32 {
11936 break
11937 }
11938 x := v_1
11939 v.reset(OpEq32)
11940 v.AddArg2(x, c)
11941 return true
11942 }
11943 return false
11944 }
11945 func rewriteValuegeneric_OpLeq32F(v *Value) bool {
11946 v_1 := v.Args[1]
11947 v_0 := v.Args[0]
11948
11949
11950 for {
11951 if v_0.Op != OpConst32F {
11952 break
11953 }
11954 c := auxIntToFloat32(v_0.AuxInt)
11955 if v_1.Op != OpConst32F {
11956 break
11957 }
11958 d := auxIntToFloat32(v_1.AuxInt)
11959 v.reset(OpConstBool)
11960 v.AuxInt = boolToAuxInt(c <= d)
11961 return true
11962 }
11963 return false
11964 }
11965 func rewriteValuegeneric_OpLeq32U(v *Value) bool {
11966 v_1 := v.Args[1]
11967 v_0 := v.Args[0]
11968 b := v.Block
11969
11970
11971 for {
11972 if v_0.Op != OpConst32 {
11973 break
11974 }
11975 c := auxIntToInt32(v_0.AuxInt)
11976 if v_1.Op != OpConst32 {
11977 break
11978 }
11979 d := auxIntToInt32(v_1.AuxInt)
11980 v.reset(OpConstBool)
11981 v.AuxInt = boolToAuxInt(uint32(c) <= uint32(d))
11982 return true
11983 }
11984
11985
11986 for {
11987 if v_0.Op != OpConst32 {
11988 break
11989 }
11990 t := v_0.Type
11991 if auxIntToInt32(v_0.AuxInt) != 1 {
11992 break
11993 }
11994 x := v_1
11995 v.reset(OpNeq32)
11996 v0 := b.NewValue0(v.Pos, OpConst32, t)
11997 v0.AuxInt = int32ToAuxInt(0)
11998 v.AddArg2(v0, x)
11999 return true
12000 }
12001
12002
12003 for {
12004 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
12005 break
12006 }
12007 v.reset(OpConstBool)
12008 v.AuxInt = boolToAuxInt(true)
12009 return true
12010 }
12011
12012
12013 for {
12014 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != -1 {
12015 break
12016 }
12017 v.reset(OpConstBool)
12018 v.AuxInt = boolToAuxInt(true)
12019 return true
12020 }
12021
12022
12023 for {
12024 x := v_0
12025 c := v_1
12026 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != 0 {
12027 break
12028 }
12029 v.reset(OpEq32)
12030 v.AddArg2(x, c)
12031 return true
12032 }
12033
12034
12035 for {
12036 c := v_0
12037 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != -1 {
12038 break
12039 }
12040 x := v_1
12041 v.reset(OpEq32)
12042 v.AddArg2(x, c)
12043 return true
12044 }
12045 return false
12046 }
12047 func rewriteValuegeneric_OpLeq64(v *Value) bool {
12048 v_1 := v.Args[1]
12049 v_0 := v.Args[0]
12050 b := v.Block
12051
12052
12053 for {
12054 if v_0.Op != OpConst64 {
12055 break
12056 }
12057 c := auxIntToInt64(v_0.AuxInt)
12058 if v_1.Op != OpConst64 {
12059 break
12060 }
12061 d := auxIntToInt64(v_1.AuxInt)
12062 v.reset(OpConstBool)
12063 v.AuxInt = boolToAuxInt(c <= d)
12064 return true
12065 }
12066
12067
12068
12069 for {
12070 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 || v_1.Op != OpAnd64 {
12071 break
12072 }
12073 _ = v_1.Args[1]
12074 v_1_0 := v_1.Args[0]
12075 v_1_1 := v_1.Args[1]
12076 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
12077 if v_1_1.Op != OpConst64 {
12078 continue
12079 }
12080 c := auxIntToInt64(v_1_1.AuxInt)
12081 if !(c >= 0) {
12082 continue
12083 }
12084 v.reset(OpConstBool)
12085 v.AuxInt = boolToAuxInt(true)
12086 return true
12087 }
12088 break
12089 }
12090
12091
12092
12093 for {
12094 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 || v_1.Op != OpRsh64Ux64 {
12095 break
12096 }
12097 _ = v_1.Args[1]
12098 v_1_1 := v_1.Args[1]
12099 if v_1_1.Op != OpConst64 {
12100 break
12101 }
12102 c := auxIntToInt64(v_1_1.AuxInt)
12103 if !(c > 0) {
12104 break
12105 }
12106 v.reset(OpConstBool)
12107 v.AuxInt = boolToAuxInt(true)
12108 return true
12109 }
12110
12111
12112 for {
12113 x := v_0
12114 if v_1.Op != OpConst64 {
12115 break
12116 }
12117 t := v_1.Type
12118 if auxIntToInt64(v_1.AuxInt) != -1 {
12119 break
12120 }
12121 v.reset(OpLess64)
12122 v0 := b.NewValue0(v.Pos, OpConst64, t)
12123 v0.AuxInt = int64ToAuxInt(0)
12124 v.AddArg2(x, v0)
12125 return true
12126 }
12127
12128
12129 for {
12130 if v_0.Op != OpConst64 {
12131 break
12132 }
12133 t := v_0.Type
12134 if auxIntToInt64(v_0.AuxInt) != 1 {
12135 break
12136 }
12137 x := v_1
12138 v.reset(OpLess64)
12139 v0 := b.NewValue0(v.Pos, OpConst64, t)
12140 v0.AuxInt = int64ToAuxInt(0)
12141 v.AddArg2(v0, x)
12142 return true
12143 }
12144
12145
12146 for {
12147 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != math.MinInt64 {
12148 break
12149 }
12150 v.reset(OpConstBool)
12151 v.AuxInt = boolToAuxInt(true)
12152 return true
12153 }
12154
12155
12156 for {
12157 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != math.MaxInt64 {
12158 break
12159 }
12160 v.reset(OpConstBool)
12161 v.AuxInt = boolToAuxInt(true)
12162 return true
12163 }
12164
12165
12166 for {
12167 x := v_0
12168 c := v_1
12169 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != math.MinInt64 {
12170 break
12171 }
12172 v.reset(OpEq64)
12173 v.AddArg2(x, c)
12174 return true
12175 }
12176
12177
12178 for {
12179 c := v_0
12180 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != math.MaxInt64 {
12181 break
12182 }
12183 x := v_1
12184 v.reset(OpEq64)
12185 v.AddArg2(x, c)
12186 return true
12187 }
12188 return false
12189 }
12190 func rewriteValuegeneric_OpLeq64F(v *Value) bool {
12191 v_1 := v.Args[1]
12192 v_0 := v.Args[0]
12193
12194
12195 for {
12196 if v_0.Op != OpConst64F {
12197 break
12198 }
12199 c := auxIntToFloat64(v_0.AuxInt)
12200 if v_1.Op != OpConst64F {
12201 break
12202 }
12203 d := auxIntToFloat64(v_1.AuxInt)
12204 v.reset(OpConstBool)
12205 v.AuxInt = boolToAuxInt(c <= d)
12206 return true
12207 }
12208 return false
12209 }
12210 func rewriteValuegeneric_OpLeq64U(v *Value) bool {
12211 v_1 := v.Args[1]
12212 v_0 := v.Args[0]
12213 b := v.Block
12214
12215
12216 for {
12217 if v_0.Op != OpConst64 {
12218 break
12219 }
12220 c := auxIntToInt64(v_0.AuxInt)
12221 if v_1.Op != OpConst64 {
12222 break
12223 }
12224 d := auxIntToInt64(v_1.AuxInt)
12225 v.reset(OpConstBool)
12226 v.AuxInt = boolToAuxInt(uint64(c) <= uint64(d))
12227 return true
12228 }
12229
12230
12231 for {
12232 if v_0.Op != OpConst64 {
12233 break
12234 }
12235 t := v_0.Type
12236 if auxIntToInt64(v_0.AuxInt) != 1 {
12237 break
12238 }
12239 x := v_1
12240 v.reset(OpNeq64)
12241 v0 := b.NewValue0(v.Pos, OpConst64, t)
12242 v0.AuxInt = int64ToAuxInt(0)
12243 v.AddArg2(v0, x)
12244 return true
12245 }
12246
12247
12248 for {
12249 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
12250 break
12251 }
12252 v.reset(OpConstBool)
12253 v.AuxInt = boolToAuxInt(true)
12254 return true
12255 }
12256
12257
12258 for {
12259 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1 {
12260 break
12261 }
12262 v.reset(OpConstBool)
12263 v.AuxInt = boolToAuxInt(true)
12264 return true
12265 }
12266
12267
12268 for {
12269 x := v_0
12270 c := v_1
12271 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != 0 {
12272 break
12273 }
12274 v.reset(OpEq64)
12275 v.AddArg2(x, c)
12276 return true
12277 }
12278
12279
12280 for {
12281 c := v_0
12282 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != -1 {
12283 break
12284 }
12285 x := v_1
12286 v.reset(OpEq64)
12287 v.AddArg2(x, c)
12288 return true
12289 }
12290 return false
12291 }
12292 func rewriteValuegeneric_OpLeq8(v *Value) bool {
12293 v_1 := v.Args[1]
12294 v_0 := v.Args[0]
12295 b := v.Block
12296
12297
12298 for {
12299 if v_0.Op != OpConst8 {
12300 break
12301 }
12302 c := auxIntToInt8(v_0.AuxInt)
12303 if v_1.Op != OpConst8 {
12304 break
12305 }
12306 d := auxIntToInt8(v_1.AuxInt)
12307 v.reset(OpConstBool)
12308 v.AuxInt = boolToAuxInt(c <= d)
12309 return true
12310 }
12311
12312
12313
12314 for {
12315 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 || v_1.Op != OpAnd8 {
12316 break
12317 }
12318 _ = v_1.Args[1]
12319 v_1_0 := v_1.Args[0]
12320 v_1_1 := v_1.Args[1]
12321 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
12322 if v_1_1.Op != OpConst8 {
12323 continue
12324 }
12325 c := auxIntToInt8(v_1_1.AuxInt)
12326 if !(c >= 0) {
12327 continue
12328 }
12329 v.reset(OpConstBool)
12330 v.AuxInt = boolToAuxInt(true)
12331 return true
12332 }
12333 break
12334 }
12335
12336
12337
12338 for {
12339 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 || v_1.Op != OpRsh8Ux64 {
12340 break
12341 }
12342 _ = v_1.Args[1]
12343 v_1_1 := v_1.Args[1]
12344 if v_1_1.Op != OpConst64 {
12345 break
12346 }
12347 c := auxIntToInt64(v_1_1.AuxInt)
12348 if !(c > 0) {
12349 break
12350 }
12351 v.reset(OpConstBool)
12352 v.AuxInt = boolToAuxInt(true)
12353 return true
12354 }
12355
12356
12357 for {
12358 x := v_0
12359 if v_1.Op != OpConst8 {
12360 break
12361 }
12362 t := v_1.Type
12363 if auxIntToInt8(v_1.AuxInt) != -1 {
12364 break
12365 }
12366 v.reset(OpLess8)
12367 v0 := b.NewValue0(v.Pos, OpConst8, t)
12368 v0.AuxInt = int8ToAuxInt(0)
12369 v.AddArg2(x, v0)
12370 return true
12371 }
12372
12373
12374 for {
12375 if v_0.Op != OpConst8 {
12376 break
12377 }
12378 t := v_0.Type
12379 if auxIntToInt8(v_0.AuxInt) != 1 {
12380 break
12381 }
12382 x := v_1
12383 v.reset(OpLess8)
12384 v0 := b.NewValue0(v.Pos, OpConst8, t)
12385 v0.AuxInt = int8ToAuxInt(0)
12386 v.AddArg2(v0, x)
12387 return true
12388 }
12389
12390
12391 for {
12392 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != math.MinInt8 {
12393 break
12394 }
12395 v.reset(OpConstBool)
12396 v.AuxInt = boolToAuxInt(true)
12397 return true
12398 }
12399
12400
12401 for {
12402 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != math.MaxInt8 {
12403 break
12404 }
12405 v.reset(OpConstBool)
12406 v.AuxInt = boolToAuxInt(true)
12407 return true
12408 }
12409
12410
12411 for {
12412 x := v_0
12413 c := v_1
12414 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != math.MinInt8 {
12415 break
12416 }
12417 v.reset(OpEq8)
12418 v.AddArg2(x, c)
12419 return true
12420 }
12421
12422
12423 for {
12424 c := v_0
12425 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != math.MaxInt8 {
12426 break
12427 }
12428 x := v_1
12429 v.reset(OpEq8)
12430 v.AddArg2(x, c)
12431 return true
12432 }
12433 return false
12434 }
12435 func rewriteValuegeneric_OpLeq8U(v *Value) bool {
12436 v_1 := v.Args[1]
12437 v_0 := v.Args[0]
12438 b := v.Block
12439
12440
12441 for {
12442 if v_0.Op != OpConst8 {
12443 break
12444 }
12445 c := auxIntToInt8(v_0.AuxInt)
12446 if v_1.Op != OpConst8 {
12447 break
12448 }
12449 d := auxIntToInt8(v_1.AuxInt)
12450 v.reset(OpConstBool)
12451 v.AuxInt = boolToAuxInt(uint8(c) <= uint8(d))
12452 return true
12453 }
12454
12455
12456 for {
12457 if v_0.Op != OpConst8 {
12458 break
12459 }
12460 t := v_0.Type
12461 if auxIntToInt8(v_0.AuxInt) != 1 {
12462 break
12463 }
12464 x := v_1
12465 v.reset(OpNeq8)
12466 v0 := b.NewValue0(v.Pos, OpConst8, t)
12467 v0.AuxInt = int8ToAuxInt(0)
12468 v.AddArg2(v0, x)
12469 return true
12470 }
12471
12472
12473 for {
12474 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
12475 break
12476 }
12477 v.reset(OpConstBool)
12478 v.AuxInt = boolToAuxInt(true)
12479 return true
12480 }
12481
12482
12483 for {
12484 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != -1 {
12485 break
12486 }
12487 v.reset(OpConstBool)
12488 v.AuxInt = boolToAuxInt(true)
12489 return true
12490 }
12491
12492
12493 for {
12494 x := v_0
12495 c := v_1
12496 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != 0 {
12497 break
12498 }
12499 v.reset(OpEq8)
12500 v.AddArg2(x, c)
12501 return true
12502 }
12503
12504
12505 for {
12506 c := v_0
12507 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != -1 {
12508 break
12509 }
12510 x := v_1
12511 v.reset(OpEq8)
12512 v.AddArg2(x, c)
12513 return true
12514 }
12515 return false
12516 }
12517 func rewriteValuegeneric_OpLess16(v *Value) bool {
12518 v_1 := v.Args[1]
12519 v_0 := v.Args[0]
12520 b := v.Block
12521
12522
12523 for {
12524 if v_0.Op != OpConst16 {
12525 break
12526 }
12527 c := auxIntToInt16(v_0.AuxInt)
12528 if v_1.Op != OpConst16 {
12529 break
12530 }
12531 d := auxIntToInt16(v_1.AuxInt)
12532 v.reset(OpConstBool)
12533 v.AuxInt = boolToAuxInt(c < d)
12534 return true
12535 }
12536
12537
12538
12539 for {
12540 if v_0.Op != OpConst16 {
12541 break
12542 }
12543 t := v_0.Type
12544 if auxIntToInt16(v_0.AuxInt) != 0 {
12545 break
12546 }
12547 x := v_1
12548 if !(isNonNegative(x)) {
12549 break
12550 }
12551 v.reset(OpNeq16)
12552 v0 := b.NewValue0(v.Pos, OpConst16, t)
12553 v0.AuxInt = int16ToAuxInt(0)
12554 v.AddArg2(v0, x)
12555 return true
12556 }
12557
12558
12559
12560 for {
12561 x := v_0
12562 if v_1.Op != OpConst16 {
12563 break
12564 }
12565 t := v_1.Type
12566 if auxIntToInt16(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
12567 break
12568 }
12569 v.reset(OpEq16)
12570 v0 := b.NewValue0(v.Pos, OpConst16, t)
12571 v0.AuxInt = int16ToAuxInt(0)
12572 v.AddArg2(v0, x)
12573 return true
12574 }
12575
12576
12577 for {
12578 x := v_0
12579 if v_1.Op != OpConst16 {
12580 break
12581 }
12582 t := v_1.Type
12583 if auxIntToInt16(v_1.AuxInt) != 1 {
12584 break
12585 }
12586 v.reset(OpLeq16)
12587 v0 := b.NewValue0(v.Pos, OpConst16, t)
12588 v0.AuxInt = int16ToAuxInt(0)
12589 v.AddArg2(x, v0)
12590 return true
12591 }
12592
12593
12594 for {
12595 if v_0.Op != OpConst16 {
12596 break
12597 }
12598 t := v_0.Type
12599 if auxIntToInt16(v_0.AuxInt) != -1 {
12600 break
12601 }
12602 x := v_1
12603 v.reset(OpLeq16)
12604 v0 := b.NewValue0(v.Pos, OpConst16, t)
12605 v0.AuxInt = int16ToAuxInt(0)
12606 v.AddArg2(v0, x)
12607 return true
12608 }
12609
12610
12611 for {
12612 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != math.MinInt16 {
12613 break
12614 }
12615 v.reset(OpConstBool)
12616 v.AuxInt = boolToAuxInt(false)
12617 return true
12618 }
12619
12620
12621 for {
12622 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != math.MaxInt16 {
12623 break
12624 }
12625 v.reset(OpConstBool)
12626 v.AuxInt = boolToAuxInt(false)
12627 return true
12628 }
12629
12630
12631 for {
12632 x := v_0
12633 if v_1.Op != OpConst16 {
12634 break
12635 }
12636 t := v_1.Type
12637 if auxIntToInt16(v_1.AuxInt) != math.MinInt16+1 {
12638 break
12639 }
12640 v.reset(OpEq16)
12641 v0 := b.NewValue0(v.Pos, OpConst16, t)
12642 v0.AuxInt = int16ToAuxInt(math.MinInt16)
12643 v.AddArg2(x, v0)
12644 return true
12645 }
12646
12647
12648 for {
12649 if v_0.Op != OpConst16 {
12650 break
12651 }
12652 t := v_0.Type
12653 if auxIntToInt16(v_0.AuxInt) != math.MaxInt16-1 {
12654 break
12655 }
12656 x := v_1
12657 v.reset(OpEq16)
12658 v0 := b.NewValue0(v.Pos, OpConst16, t)
12659 v0.AuxInt = int16ToAuxInt(math.MaxInt16)
12660 v.AddArg2(x, v0)
12661 return true
12662 }
12663 return false
12664 }
12665 func rewriteValuegeneric_OpLess16U(v *Value) bool {
12666 v_1 := v.Args[1]
12667 v_0 := v.Args[0]
12668 b := v.Block
12669
12670
12671 for {
12672 if v_0.Op != OpConst16 {
12673 break
12674 }
12675 c := auxIntToInt16(v_0.AuxInt)
12676 if v_1.Op != OpConst16 {
12677 break
12678 }
12679 d := auxIntToInt16(v_1.AuxInt)
12680 v.reset(OpConstBool)
12681 v.AuxInt = boolToAuxInt(uint16(c) < uint16(d))
12682 return true
12683 }
12684
12685
12686 for {
12687 x := v_0
12688 if v_1.Op != OpConst16 {
12689 break
12690 }
12691 t := v_1.Type
12692 if auxIntToInt16(v_1.AuxInt) != 1 {
12693 break
12694 }
12695 v.reset(OpEq16)
12696 v0 := b.NewValue0(v.Pos, OpConst16, t)
12697 v0.AuxInt = int16ToAuxInt(0)
12698 v.AddArg2(v0, x)
12699 return true
12700 }
12701
12702
12703 for {
12704 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
12705 break
12706 }
12707 v.reset(OpConstBool)
12708 v.AuxInt = boolToAuxInt(false)
12709 return true
12710 }
12711
12712
12713 for {
12714 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
12715 break
12716 }
12717 v.reset(OpConstBool)
12718 v.AuxInt = boolToAuxInt(false)
12719 return true
12720 }
12721
12722
12723 for {
12724 x := v_0
12725 if v_1.Op != OpConst16 {
12726 break
12727 }
12728 t := v_1.Type
12729 if auxIntToInt16(v_1.AuxInt) != 1 {
12730 break
12731 }
12732 v.reset(OpEq16)
12733 v0 := b.NewValue0(v.Pos, OpConst16, t)
12734 v0.AuxInt = int16ToAuxInt(0)
12735 v.AddArg2(x, v0)
12736 return true
12737 }
12738
12739
12740 for {
12741 if v_0.Op != OpConst16 {
12742 break
12743 }
12744 t := v_0.Type
12745 if auxIntToInt16(v_0.AuxInt) != -2 {
12746 break
12747 }
12748 x := v_1
12749 v.reset(OpEq16)
12750 v0 := b.NewValue0(v.Pos, OpConst16, t)
12751 v0.AuxInt = int16ToAuxInt(-1)
12752 v.AddArg2(x, v0)
12753 return true
12754 }
12755 return false
12756 }
12757 func rewriteValuegeneric_OpLess32(v *Value) bool {
12758 v_1 := v.Args[1]
12759 v_0 := v.Args[0]
12760 b := v.Block
12761
12762
12763 for {
12764 if v_0.Op != OpConst32 {
12765 break
12766 }
12767 c := auxIntToInt32(v_0.AuxInt)
12768 if v_1.Op != OpConst32 {
12769 break
12770 }
12771 d := auxIntToInt32(v_1.AuxInt)
12772 v.reset(OpConstBool)
12773 v.AuxInt = boolToAuxInt(c < d)
12774 return true
12775 }
12776
12777
12778
12779 for {
12780 if v_0.Op != OpConst32 {
12781 break
12782 }
12783 t := v_0.Type
12784 if auxIntToInt32(v_0.AuxInt) != 0 {
12785 break
12786 }
12787 x := v_1
12788 if !(isNonNegative(x)) {
12789 break
12790 }
12791 v.reset(OpNeq32)
12792 v0 := b.NewValue0(v.Pos, OpConst32, t)
12793 v0.AuxInt = int32ToAuxInt(0)
12794 v.AddArg2(v0, x)
12795 return true
12796 }
12797
12798
12799
12800 for {
12801 x := v_0
12802 if v_1.Op != OpConst32 {
12803 break
12804 }
12805 t := v_1.Type
12806 if auxIntToInt32(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
12807 break
12808 }
12809 v.reset(OpEq32)
12810 v0 := b.NewValue0(v.Pos, OpConst32, t)
12811 v0.AuxInt = int32ToAuxInt(0)
12812 v.AddArg2(v0, x)
12813 return true
12814 }
12815
12816
12817 for {
12818 x := v_0
12819 if v_1.Op != OpConst32 {
12820 break
12821 }
12822 t := v_1.Type
12823 if auxIntToInt32(v_1.AuxInt) != 1 {
12824 break
12825 }
12826 v.reset(OpLeq32)
12827 v0 := b.NewValue0(v.Pos, OpConst32, t)
12828 v0.AuxInt = int32ToAuxInt(0)
12829 v.AddArg2(x, v0)
12830 return true
12831 }
12832
12833
12834 for {
12835 if v_0.Op != OpConst32 {
12836 break
12837 }
12838 t := v_0.Type
12839 if auxIntToInt32(v_0.AuxInt) != -1 {
12840 break
12841 }
12842 x := v_1
12843 v.reset(OpLeq32)
12844 v0 := b.NewValue0(v.Pos, OpConst32, t)
12845 v0.AuxInt = int32ToAuxInt(0)
12846 v.AddArg2(v0, x)
12847 return true
12848 }
12849
12850
12851 for {
12852 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != math.MinInt32 {
12853 break
12854 }
12855 v.reset(OpConstBool)
12856 v.AuxInt = boolToAuxInt(false)
12857 return true
12858 }
12859
12860
12861 for {
12862 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != math.MaxInt32 {
12863 break
12864 }
12865 v.reset(OpConstBool)
12866 v.AuxInt = boolToAuxInt(false)
12867 return true
12868 }
12869
12870
12871 for {
12872 x := v_0
12873 if v_1.Op != OpConst32 {
12874 break
12875 }
12876 t := v_1.Type
12877 if auxIntToInt32(v_1.AuxInt) != math.MinInt32+1 {
12878 break
12879 }
12880 v.reset(OpEq32)
12881 v0 := b.NewValue0(v.Pos, OpConst32, t)
12882 v0.AuxInt = int32ToAuxInt(math.MinInt32)
12883 v.AddArg2(x, v0)
12884 return true
12885 }
12886
12887
12888 for {
12889 if v_0.Op != OpConst32 {
12890 break
12891 }
12892 t := v_0.Type
12893 if auxIntToInt32(v_0.AuxInt) != math.MaxInt32-1 {
12894 break
12895 }
12896 x := v_1
12897 v.reset(OpEq32)
12898 v0 := b.NewValue0(v.Pos, OpConst32, t)
12899 v0.AuxInt = int32ToAuxInt(math.MaxInt32)
12900 v.AddArg2(x, v0)
12901 return true
12902 }
12903 return false
12904 }
12905 func rewriteValuegeneric_OpLess32F(v *Value) bool {
12906 v_1 := v.Args[1]
12907 v_0 := v.Args[0]
12908
12909
12910 for {
12911 if v_0.Op != OpConst32F {
12912 break
12913 }
12914 c := auxIntToFloat32(v_0.AuxInt)
12915 if v_1.Op != OpConst32F {
12916 break
12917 }
12918 d := auxIntToFloat32(v_1.AuxInt)
12919 v.reset(OpConstBool)
12920 v.AuxInt = boolToAuxInt(c < d)
12921 return true
12922 }
12923 return false
12924 }
12925 func rewriteValuegeneric_OpLess32U(v *Value) bool {
12926 v_1 := v.Args[1]
12927 v_0 := v.Args[0]
12928 b := v.Block
12929
12930
12931 for {
12932 if v_0.Op != OpConst32 {
12933 break
12934 }
12935 c := auxIntToInt32(v_0.AuxInt)
12936 if v_1.Op != OpConst32 {
12937 break
12938 }
12939 d := auxIntToInt32(v_1.AuxInt)
12940 v.reset(OpConstBool)
12941 v.AuxInt = boolToAuxInt(uint32(c) < uint32(d))
12942 return true
12943 }
12944
12945
12946 for {
12947 x := v_0
12948 if v_1.Op != OpConst32 {
12949 break
12950 }
12951 t := v_1.Type
12952 if auxIntToInt32(v_1.AuxInt) != 1 {
12953 break
12954 }
12955 v.reset(OpEq32)
12956 v0 := b.NewValue0(v.Pos, OpConst32, t)
12957 v0.AuxInt = int32ToAuxInt(0)
12958 v.AddArg2(v0, x)
12959 return true
12960 }
12961
12962
12963 for {
12964 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
12965 break
12966 }
12967 v.reset(OpConstBool)
12968 v.AuxInt = boolToAuxInt(false)
12969 return true
12970 }
12971
12972
12973 for {
12974 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
12975 break
12976 }
12977 v.reset(OpConstBool)
12978 v.AuxInt = boolToAuxInt(false)
12979 return true
12980 }
12981
12982
12983 for {
12984 x := v_0
12985 if v_1.Op != OpConst32 {
12986 break
12987 }
12988 t := v_1.Type
12989 if auxIntToInt32(v_1.AuxInt) != 1 {
12990 break
12991 }
12992 v.reset(OpEq32)
12993 v0 := b.NewValue0(v.Pos, OpConst32, t)
12994 v0.AuxInt = int32ToAuxInt(0)
12995 v.AddArg2(x, v0)
12996 return true
12997 }
12998
12999
13000 for {
13001 if v_0.Op != OpConst32 {
13002 break
13003 }
13004 t := v_0.Type
13005 if auxIntToInt32(v_0.AuxInt) != -2 {
13006 break
13007 }
13008 x := v_1
13009 v.reset(OpEq32)
13010 v0 := b.NewValue0(v.Pos, OpConst32, t)
13011 v0.AuxInt = int32ToAuxInt(-1)
13012 v.AddArg2(x, v0)
13013 return true
13014 }
13015 return false
13016 }
13017 func rewriteValuegeneric_OpLess64(v *Value) bool {
13018 v_1 := v.Args[1]
13019 v_0 := v.Args[0]
13020 b := v.Block
13021
13022
13023 for {
13024 if v_0.Op != OpConst64 {
13025 break
13026 }
13027 c := auxIntToInt64(v_0.AuxInt)
13028 if v_1.Op != OpConst64 {
13029 break
13030 }
13031 d := auxIntToInt64(v_1.AuxInt)
13032 v.reset(OpConstBool)
13033 v.AuxInt = boolToAuxInt(c < d)
13034 return true
13035 }
13036
13037
13038
13039 for {
13040 if v_0.Op != OpConst64 {
13041 break
13042 }
13043 t := v_0.Type
13044 if auxIntToInt64(v_0.AuxInt) != 0 {
13045 break
13046 }
13047 x := v_1
13048 if !(isNonNegative(x)) {
13049 break
13050 }
13051 v.reset(OpNeq64)
13052 v0 := b.NewValue0(v.Pos, OpConst64, t)
13053 v0.AuxInt = int64ToAuxInt(0)
13054 v.AddArg2(v0, x)
13055 return true
13056 }
13057
13058
13059
13060 for {
13061 x := v_0
13062 if v_1.Op != OpConst64 {
13063 break
13064 }
13065 t := v_1.Type
13066 if auxIntToInt64(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
13067 break
13068 }
13069 v.reset(OpEq64)
13070 v0 := b.NewValue0(v.Pos, OpConst64, t)
13071 v0.AuxInt = int64ToAuxInt(0)
13072 v.AddArg2(v0, x)
13073 return true
13074 }
13075
13076
13077 for {
13078 x := v_0
13079 if v_1.Op != OpConst64 {
13080 break
13081 }
13082 t := v_1.Type
13083 if auxIntToInt64(v_1.AuxInt) != 1 {
13084 break
13085 }
13086 v.reset(OpLeq64)
13087 v0 := b.NewValue0(v.Pos, OpConst64, t)
13088 v0.AuxInt = int64ToAuxInt(0)
13089 v.AddArg2(x, v0)
13090 return true
13091 }
13092
13093
13094 for {
13095 if v_0.Op != OpConst64 {
13096 break
13097 }
13098 t := v_0.Type
13099 if auxIntToInt64(v_0.AuxInt) != -1 {
13100 break
13101 }
13102 x := v_1
13103 v.reset(OpLeq64)
13104 v0 := b.NewValue0(v.Pos, OpConst64, t)
13105 v0.AuxInt = int64ToAuxInt(0)
13106 v.AddArg2(v0, x)
13107 return true
13108 }
13109
13110
13111 for {
13112 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != math.MinInt64 {
13113 break
13114 }
13115 v.reset(OpConstBool)
13116 v.AuxInt = boolToAuxInt(false)
13117 return true
13118 }
13119
13120
13121 for {
13122 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != math.MaxInt64 {
13123 break
13124 }
13125 v.reset(OpConstBool)
13126 v.AuxInt = boolToAuxInt(false)
13127 return true
13128 }
13129
13130
13131 for {
13132 x := v_0
13133 if v_1.Op != OpConst64 {
13134 break
13135 }
13136 t := v_1.Type
13137 if auxIntToInt64(v_1.AuxInt) != math.MinInt64+1 {
13138 break
13139 }
13140 v.reset(OpEq64)
13141 v0 := b.NewValue0(v.Pos, OpConst64, t)
13142 v0.AuxInt = int64ToAuxInt(math.MinInt64)
13143 v.AddArg2(x, v0)
13144 return true
13145 }
13146
13147
13148 for {
13149 if v_0.Op != OpConst64 {
13150 break
13151 }
13152 t := v_0.Type
13153 if auxIntToInt64(v_0.AuxInt) != math.MaxInt64-1 {
13154 break
13155 }
13156 x := v_1
13157 v.reset(OpEq64)
13158 v0 := b.NewValue0(v.Pos, OpConst64, t)
13159 v0.AuxInt = int64ToAuxInt(math.MaxInt64)
13160 v.AddArg2(x, v0)
13161 return true
13162 }
13163 return false
13164 }
13165 func rewriteValuegeneric_OpLess64F(v *Value) bool {
13166 v_1 := v.Args[1]
13167 v_0 := v.Args[0]
13168
13169
13170 for {
13171 if v_0.Op != OpConst64F {
13172 break
13173 }
13174 c := auxIntToFloat64(v_0.AuxInt)
13175 if v_1.Op != OpConst64F {
13176 break
13177 }
13178 d := auxIntToFloat64(v_1.AuxInt)
13179 v.reset(OpConstBool)
13180 v.AuxInt = boolToAuxInt(c < d)
13181 return true
13182 }
13183 return false
13184 }
13185 func rewriteValuegeneric_OpLess64U(v *Value) bool {
13186 v_1 := v.Args[1]
13187 v_0 := v.Args[0]
13188 b := v.Block
13189
13190
13191 for {
13192 if v_0.Op != OpConst64 {
13193 break
13194 }
13195 c := auxIntToInt64(v_0.AuxInt)
13196 if v_1.Op != OpConst64 {
13197 break
13198 }
13199 d := auxIntToInt64(v_1.AuxInt)
13200 v.reset(OpConstBool)
13201 v.AuxInt = boolToAuxInt(uint64(c) < uint64(d))
13202 return true
13203 }
13204
13205
13206 for {
13207 x := v_0
13208 if v_1.Op != OpConst64 {
13209 break
13210 }
13211 t := v_1.Type
13212 if auxIntToInt64(v_1.AuxInt) != 1 {
13213 break
13214 }
13215 v.reset(OpEq64)
13216 v0 := b.NewValue0(v.Pos, OpConst64, t)
13217 v0.AuxInt = int64ToAuxInt(0)
13218 v.AddArg2(v0, x)
13219 return true
13220 }
13221
13222
13223 for {
13224 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
13225 break
13226 }
13227 v.reset(OpConstBool)
13228 v.AuxInt = boolToAuxInt(false)
13229 return true
13230 }
13231
13232
13233 for {
13234 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
13235 break
13236 }
13237 v.reset(OpConstBool)
13238 v.AuxInt = boolToAuxInt(false)
13239 return true
13240 }
13241
13242
13243 for {
13244 x := v_0
13245 if v_1.Op != OpConst64 {
13246 break
13247 }
13248 t := v_1.Type
13249 if auxIntToInt64(v_1.AuxInt) != 1 {
13250 break
13251 }
13252 v.reset(OpEq64)
13253 v0 := b.NewValue0(v.Pos, OpConst64, t)
13254 v0.AuxInt = int64ToAuxInt(0)
13255 v.AddArg2(x, v0)
13256 return true
13257 }
13258
13259
13260 for {
13261 if v_0.Op != OpConst64 {
13262 break
13263 }
13264 t := v_0.Type
13265 if auxIntToInt64(v_0.AuxInt) != -2 {
13266 break
13267 }
13268 x := v_1
13269 v.reset(OpEq64)
13270 v0 := b.NewValue0(v.Pos, OpConst64, t)
13271 v0.AuxInt = int64ToAuxInt(-1)
13272 v.AddArg2(x, v0)
13273 return true
13274 }
13275 return false
13276 }
13277 func rewriteValuegeneric_OpLess8(v *Value) bool {
13278 v_1 := v.Args[1]
13279 v_0 := v.Args[0]
13280 b := v.Block
13281
13282
13283 for {
13284 if v_0.Op != OpConst8 {
13285 break
13286 }
13287 c := auxIntToInt8(v_0.AuxInt)
13288 if v_1.Op != OpConst8 {
13289 break
13290 }
13291 d := auxIntToInt8(v_1.AuxInt)
13292 v.reset(OpConstBool)
13293 v.AuxInt = boolToAuxInt(c < d)
13294 return true
13295 }
13296
13297
13298
13299 for {
13300 if v_0.Op != OpConst8 {
13301 break
13302 }
13303 t := v_0.Type
13304 if auxIntToInt8(v_0.AuxInt) != 0 {
13305 break
13306 }
13307 x := v_1
13308 if !(isNonNegative(x)) {
13309 break
13310 }
13311 v.reset(OpNeq8)
13312 v0 := b.NewValue0(v.Pos, OpConst8, t)
13313 v0.AuxInt = int8ToAuxInt(0)
13314 v.AddArg2(v0, x)
13315 return true
13316 }
13317
13318
13319
13320 for {
13321 x := v_0
13322 if v_1.Op != OpConst8 {
13323 break
13324 }
13325 t := v_1.Type
13326 if auxIntToInt8(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
13327 break
13328 }
13329 v.reset(OpEq8)
13330 v0 := b.NewValue0(v.Pos, OpConst8, t)
13331 v0.AuxInt = int8ToAuxInt(0)
13332 v.AddArg2(v0, x)
13333 return true
13334 }
13335
13336
13337 for {
13338 x := v_0
13339 if v_1.Op != OpConst8 {
13340 break
13341 }
13342 t := v_1.Type
13343 if auxIntToInt8(v_1.AuxInt) != 1 {
13344 break
13345 }
13346 v.reset(OpLeq8)
13347 v0 := b.NewValue0(v.Pos, OpConst8, t)
13348 v0.AuxInt = int8ToAuxInt(0)
13349 v.AddArg2(x, v0)
13350 return true
13351 }
13352
13353
13354 for {
13355 if v_0.Op != OpConst8 {
13356 break
13357 }
13358 t := v_0.Type
13359 if auxIntToInt8(v_0.AuxInt) != -1 {
13360 break
13361 }
13362 x := v_1
13363 v.reset(OpLeq8)
13364 v0 := b.NewValue0(v.Pos, OpConst8, t)
13365 v0.AuxInt = int8ToAuxInt(0)
13366 v.AddArg2(v0, x)
13367 return true
13368 }
13369
13370
13371 for {
13372 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != math.MinInt8 {
13373 break
13374 }
13375 v.reset(OpConstBool)
13376 v.AuxInt = boolToAuxInt(false)
13377 return true
13378 }
13379
13380
13381 for {
13382 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != math.MaxInt8 {
13383 break
13384 }
13385 v.reset(OpConstBool)
13386 v.AuxInt = boolToAuxInt(false)
13387 return true
13388 }
13389
13390
13391 for {
13392 x := v_0
13393 if v_1.Op != OpConst8 {
13394 break
13395 }
13396 t := v_1.Type
13397 if auxIntToInt8(v_1.AuxInt) != math.MinInt8+1 {
13398 break
13399 }
13400 v.reset(OpEq8)
13401 v0 := b.NewValue0(v.Pos, OpConst8, t)
13402 v0.AuxInt = int8ToAuxInt(math.MinInt8)
13403 v.AddArg2(x, v0)
13404 return true
13405 }
13406
13407
13408 for {
13409 if v_0.Op != OpConst8 {
13410 break
13411 }
13412 t := v_0.Type
13413 if auxIntToInt8(v_0.AuxInt) != math.MaxInt8-1 {
13414 break
13415 }
13416 x := v_1
13417 v.reset(OpEq8)
13418 v0 := b.NewValue0(v.Pos, OpConst8, t)
13419 v0.AuxInt = int8ToAuxInt(math.MaxInt8)
13420 v.AddArg2(x, v0)
13421 return true
13422 }
13423 return false
13424 }
13425 func rewriteValuegeneric_OpLess8U(v *Value) bool {
13426 v_1 := v.Args[1]
13427 v_0 := v.Args[0]
13428 b := v.Block
13429
13430
13431 for {
13432 if v_0.Op != OpConst8 {
13433 break
13434 }
13435 c := auxIntToInt8(v_0.AuxInt)
13436 if v_1.Op != OpConst8 {
13437 break
13438 }
13439 d := auxIntToInt8(v_1.AuxInt)
13440 v.reset(OpConstBool)
13441 v.AuxInt = boolToAuxInt(uint8(c) < uint8(d))
13442 return true
13443 }
13444
13445
13446 for {
13447 x := v_0
13448 if v_1.Op != OpConst8 {
13449 break
13450 }
13451 t := v_1.Type
13452 if auxIntToInt8(v_1.AuxInt) != 1 {
13453 break
13454 }
13455 v.reset(OpEq8)
13456 v0 := b.NewValue0(v.Pos, OpConst8, t)
13457 v0.AuxInt = int8ToAuxInt(0)
13458 v.AddArg2(v0, x)
13459 return true
13460 }
13461
13462
13463 for {
13464 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
13465 break
13466 }
13467 v.reset(OpConstBool)
13468 v.AuxInt = boolToAuxInt(false)
13469 return true
13470 }
13471
13472
13473 for {
13474 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
13475 break
13476 }
13477 v.reset(OpConstBool)
13478 v.AuxInt = boolToAuxInt(false)
13479 return true
13480 }
13481
13482
13483 for {
13484 x := v_0
13485 if v_1.Op != OpConst8 {
13486 break
13487 }
13488 t := v_1.Type
13489 if auxIntToInt8(v_1.AuxInt) != 1 {
13490 break
13491 }
13492 v.reset(OpEq8)
13493 v0 := b.NewValue0(v.Pos, OpConst8, t)
13494 v0.AuxInt = int8ToAuxInt(0)
13495 v.AddArg2(x, v0)
13496 return true
13497 }
13498
13499
13500 for {
13501 if v_0.Op != OpConst8 {
13502 break
13503 }
13504 t := v_0.Type
13505 if auxIntToInt8(v_0.AuxInt) != -2 {
13506 break
13507 }
13508 x := v_1
13509 v.reset(OpEq8)
13510 v0 := b.NewValue0(v.Pos, OpConst8, t)
13511 v0.AuxInt = int8ToAuxInt(-1)
13512 v.AddArg2(x, v0)
13513 return true
13514 }
13515 return false
13516 }
13517 func rewriteValuegeneric_OpLoad(v *Value) bool {
13518 v_1 := v.Args[1]
13519 v_0 := v.Args[0]
13520 b := v.Block
13521 config := b.Func.Config
13522
13523
13524
13525 for {
13526 t1 := v.Type
13527 p1 := v_0
13528 if v_1.Op != OpStore {
13529 break
13530 }
13531 t2 := auxToType(v_1.Aux)
13532 x := v_1.Args[1]
13533 p2 := v_1.Args[0]
13534 if !(isSamePtr(p1, p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == t2.Size()) {
13535 break
13536 }
13537 v.copyOf(x)
13538 return true
13539 }
13540
13541
13542
13543 for {
13544 t1 := v.Type
13545 p1 := v_0
13546 if v_1.Op != OpStore {
13547 break
13548 }
13549 t2 := auxToType(v_1.Aux)
13550 _ = v_1.Args[2]
13551 p2 := v_1.Args[0]
13552 v_1_2 := v_1.Args[2]
13553 if v_1_2.Op != OpStore {
13554 break
13555 }
13556 t3 := auxToType(v_1_2.Aux)
13557 x := v_1_2.Args[1]
13558 p3 := v_1_2.Args[0]
13559 if !(isSamePtr(p1, p3) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == t2.Size() && disjoint(p3, t3.Size(), p2, t2.Size())) {
13560 break
13561 }
13562 v.copyOf(x)
13563 return true
13564 }
13565
13566
13567
13568 for {
13569 t1 := v.Type
13570 p1 := v_0
13571 if v_1.Op != OpStore {
13572 break
13573 }
13574 t2 := auxToType(v_1.Aux)
13575 _ = v_1.Args[2]
13576 p2 := v_1.Args[0]
13577 v_1_2 := v_1.Args[2]
13578 if v_1_2.Op != OpStore {
13579 break
13580 }
13581 t3 := auxToType(v_1_2.Aux)
13582 _ = v_1_2.Args[2]
13583 p3 := v_1_2.Args[0]
13584 v_1_2_2 := v_1_2.Args[2]
13585 if v_1_2_2.Op != OpStore {
13586 break
13587 }
13588 t4 := auxToType(v_1_2_2.Aux)
13589 x := v_1_2_2.Args[1]
13590 p4 := v_1_2_2.Args[0]
13591 if !(isSamePtr(p1, p4) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == t2.Size() && disjoint(p4, t4.Size(), p2, t2.Size()) && disjoint(p4, t4.Size(), p3, t3.Size())) {
13592 break
13593 }
13594 v.copyOf(x)
13595 return true
13596 }
13597
13598
13599
13600 for {
13601 t1 := v.Type
13602 p1 := v_0
13603 if v_1.Op != OpStore {
13604 break
13605 }
13606 t2 := auxToType(v_1.Aux)
13607 _ = v_1.Args[2]
13608 p2 := v_1.Args[0]
13609 v_1_2 := v_1.Args[2]
13610 if v_1_2.Op != OpStore {
13611 break
13612 }
13613 t3 := auxToType(v_1_2.Aux)
13614 _ = v_1_2.Args[2]
13615 p3 := v_1_2.Args[0]
13616 v_1_2_2 := v_1_2.Args[2]
13617 if v_1_2_2.Op != OpStore {
13618 break
13619 }
13620 t4 := auxToType(v_1_2_2.Aux)
13621 _ = v_1_2_2.Args[2]
13622 p4 := v_1_2_2.Args[0]
13623 v_1_2_2_2 := v_1_2_2.Args[2]
13624 if v_1_2_2_2.Op != OpStore {
13625 break
13626 }
13627 t5 := auxToType(v_1_2_2_2.Aux)
13628 x := v_1_2_2_2.Args[1]
13629 p5 := v_1_2_2_2.Args[0]
13630 if !(isSamePtr(p1, p5) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == t2.Size() && disjoint(p5, t5.Size(), p2, t2.Size()) && disjoint(p5, t5.Size(), p3, t3.Size()) && disjoint(p5, t5.Size(), p4, t4.Size())) {
13631 break
13632 }
13633 v.copyOf(x)
13634 return true
13635 }
13636
13637
13638
13639 for {
13640 t1 := v.Type
13641 p1 := v_0
13642 if v_1.Op != OpStore {
13643 break
13644 }
13645 t2 := auxToType(v_1.Aux)
13646 _ = v_1.Args[1]
13647 p2 := v_1.Args[0]
13648 v_1_1 := v_1.Args[1]
13649 if v_1_1.Op != OpConst64 {
13650 break
13651 }
13652 x := auxIntToInt64(v_1_1.AuxInt)
13653 if !(isSamePtr(p1, p2) && t2.Size() == 8 && is64BitFloat(t1) && !math.IsNaN(math.Float64frombits(uint64(x)))) {
13654 break
13655 }
13656 v.reset(OpConst64F)
13657 v.AuxInt = float64ToAuxInt(math.Float64frombits(uint64(x)))
13658 return true
13659 }
13660
13661
13662
13663 for {
13664 t1 := v.Type
13665 p1 := v_0
13666 if v_1.Op != OpStore {
13667 break
13668 }
13669 t2 := auxToType(v_1.Aux)
13670 _ = v_1.Args[1]
13671 p2 := v_1.Args[0]
13672 v_1_1 := v_1.Args[1]
13673 if v_1_1.Op != OpConst32 {
13674 break
13675 }
13676 x := auxIntToInt32(v_1_1.AuxInt)
13677 if !(isSamePtr(p1, p2) && t2.Size() == 4 && is32BitFloat(t1) && !math.IsNaN(float64(math.Float32frombits(uint32(x))))) {
13678 break
13679 }
13680 v.reset(OpConst32F)
13681 v.AuxInt = float32ToAuxInt(math.Float32frombits(uint32(x)))
13682 return true
13683 }
13684
13685
13686
13687 for {
13688 t1 := v.Type
13689 p1 := v_0
13690 if v_1.Op != OpStore {
13691 break
13692 }
13693 t2 := auxToType(v_1.Aux)
13694 _ = v_1.Args[1]
13695 p2 := v_1.Args[0]
13696 v_1_1 := v_1.Args[1]
13697 if v_1_1.Op != OpConst64F {
13698 break
13699 }
13700 x := auxIntToFloat64(v_1_1.AuxInt)
13701 if !(isSamePtr(p1, p2) && t2.Size() == 8 && is64BitInt(t1)) {
13702 break
13703 }
13704 v.reset(OpConst64)
13705 v.AuxInt = int64ToAuxInt(int64(math.Float64bits(x)))
13706 return true
13707 }
13708
13709
13710
13711 for {
13712 t1 := v.Type
13713 p1 := v_0
13714 if v_1.Op != OpStore {
13715 break
13716 }
13717 t2 := auxToType(v_1.Aux)
13718 _ = v_1.Args[1]
13719 p2 := v_1.Args[0]
13720 v_1_1 := v_1.Args[1]
13721 if v_1_1.Op != OpConst32F {
13722 break
13723 }
13724 x := auxIntToFloat32(v_1_1.AuxInt)
13725 if !(isSamePtr(p1, p2) && t2.Size() == 4 && is32BitInt(t1)) {
13726 break
13727 }
13728 v.reset(OpConst32)
13729 v.AuxInt = int32ToAuxInt(int32(math.Float32bits(x)))
13730 return true
13731 }
13732
13733
13734
13735 for {
13736 t1 := v.Type
13737 op := v_0
13738 if op.Op != OpOffPtr {
13739 break
13740 }
13741 o1 := auxIntToInt64(op.AuxInt)
13742 p1 := op.Args[0]
13743 if v_1.Op != OpStore {
13744 break
13745 }
13746 t2 := auxToType(v_1.Aux)
13747 _ = v_1.Args[2]
13748 p2 := v_1.Args[0]
13749 mem := v_1.Args[2]
13750 if mem.Op != OpZero {
13751 break
13752 }
13753 n := auxIntToInt64(mem.AuxInt)
13754 p3 := mem.Args[0]
13755 if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p3) && CanSSA(t1) && disjoint(op, t1.Size(), p2, t2.Size())) {
13756 break
13757 }
13758 b = mem.Block
13759 v0 := b.NewValue0(v.Pos, OpLoad, t1)
13760 v.copyOf(v0)
13761 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
13762 v1.AuxInt = int64ToAuxInt(o1)
13763 v1.AddArg(p3)
13764 v0.AddArg2(v1, mem)
13765 return true
13766 }
13767
13768
13769
13770 for {
13771 t1 := v.Type
13772 op := v_0
13773 if op.Op != OpOffPtr {
13774 break
13775 }
13776 o1 := auxIntToInt64(op.AuxInt)
13777 p1 := op.Args[0]
13778 if v_1.Op != OpStore {
13779 break
13780 }
13781 t2 := auxToType(v_1.Aux)
13782 _ = v_1.Args[2]
13783 p2 := v_1.Args[0]
13784 v_1_2 := v_1.Args[2]
13785 if v_1_2.Op != OpStore {
13786 break
13787 }
13788 t3 := auxToType(v_1_2.Aux)
13789 _ = v_1_2.Args[2]
13790 p3 := v_1_2.Args[0]
13791 mem := v_1_2.Args[2]
13792 if mem.Op != OpZero {
13793 break
13794 }
13795 n := auxIntToInt64(mem.AuxInt)
13796 p4 := mem.Args[0]
13797 if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p4) && CanSSA(t1) && disjoint(op, t1.Size(), p2, t2.Size()) && disjoint(op, t1.Size(), p3, t3.Size())) {
13798 break
13799 }
13800 b = mem.Block
13801 v0 := b.NewValue0(v.Pos, OpLoad, t1)
13802 v.copyOf(v0)
13803 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
13804 v1.AuxInt = int64ToAuxInt(o1)
13805 v1.AddArg(p4)
13806 v0.AddArg2(v1, mem)
13807 return true
13808 }
13809
13810
13811
13812 for {
13813 t1 := v.Type
13814 op := v_0
13815 if op.Op != OpOffPtr {
13816 break
13817 }
13818 o1 := auxIntToInt64(op.AuxInt)
13819 p1 := op.Args[0]
13820 if v_1.Op != OpStore {
13821 break
13822 }
13823 t2 := auxToType(v_1.Aux)
13824 _ = v_1.Args[2]
13825 p2 := v_1.Args[0]
13826 v_1_2 := v_1.Args[2]
13827 if v_1_2.Op != OpStore {
13828 break
13829 }
13830 t3 := auxToType(v_1_2.Aux)
13831 _ = v_1_2.Args[2]
13832 p3 := v_1_2.Args[0]
13833 v_1_2_2 := v_1_2.Args[2]
13834 if v_1_2_2.Op != OpStore {
13835 break
13836 }
13837 t4 := auxToType(v_1_2_2.Aux)
13838 _ = v_1_2_2.Args[2]
13839 p4 := v_1_2_2.Args[0]
13840 mem := v_1_2_2.Args[2]
13841 if mem.Op != OpZero {
13842 break
13843 }
13844 n := auxIntToInt64(mem.AuxInt)
13845 p5 := mem.Args[0]
13846 if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p5) && CanSSA(t1) && disjoint(op, t1.Size(), p2, t2.Size()) && disjoint(op, t1.Size(), p3, t3.Size()) && disjoint(op, t1.Size(), p4, t4.Size())) {
13847 break
13848 }
13849 b = mem.Block
13850 v0 := b.NewValue0(v.Pos, OpLoad, t1)
13851 v.copyOf(v0)
13852 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
13853 v1.AuxInt = int64ToAuxInt(o1)
13854 v1.AddArg(p5)
13855 v0.AddArg2(v1, mem)
13856 return true
13857 }
13858
13859
13860
13861 for {
13862 t1 := v.Type
13863 op := v_0
13864 if op.Op != OpOffPtr {
13865 break
13866 }
13867 o1 := auxIntToInt64(op.AuxInt)
13868 p1 := op.Args[0]
13869 if v_1.Op != OpStore {
13870 break
13871 }
13872 t2 := auxToType(v_1.Aux)
13873 _ = v_1.Args[2]
13874 p2 := v_1.Args[0]
13875 v_1_2 := v_1.Args[2]
13876 if v_1_2.Op != OpStore {
13877 break
13878 }
13879 t3 := auxToType(v_1_2.Aux)
13880 _ = v_1_2.Args[2]
13881 p3 := v_1_2.Args[0]
13882 v_1_2_2 := v_1_2.Args[2]
13883 if v_1_2_2.Op != OpStore {
13884 break
13885 }
13886 t4 := auxToType(v_1_2_2.Aux)
13887 _ = v_1_2_2.Args[2]
13888 p4 := v_1_2_2.Args[0]
13889 v_1_2_2_2 := v_1_2_2.Args[2]
13890 if v_1_2_2_2.Op != OpStore {
13891 break
13892 }
13893 t5 := auxToType(v_1_2_2_2.Aux)
13894 _ = v_1_2_2_2.Args[2]
13895 p5 := v_1_2_2_2.Args[0]
13896 mem := v_1_2_2_2.Args[2]
13897 if mem.Op != OpZero {
13898 break
13899 }
13900 n := auxIntToInt64(mem.AuxInt)
13901 p6 := mem.Args[0]
13902 if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p6) && CanSSA(t1) && disjoint(op, t1.Size(), p2, t2.Size()) && disjoint(op, t1.Size(), p3, t3.Size()) && disjoint(op, t1.Size(), p4, t4.Size()) && disjoint(op, t1.Size(), p5, t5.Size())) {
13903 break
13904 }
13905 b = mem.Block
13906 v0 := b.NewValue0(v.Pos, OpLoad, t1)
13907 v.copyOf(v0)
13908 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
13909 v1.AuxInt = int64ToAuxInt(o1)
13910 v1.AddArg(p6)
13911 v0.AddArg2(v1, mem)
13912 return true
13913 }
13914
13915
13916
13917 for {
13918 t1 := v.Type
13919 if v_0.Op != OpOffPtr {
13920 break
13921 }
13922 o := auxIntToInt64(v_0.AuxInt)
13923 p1 := v_0.Args[0]
13924 if v_1.Op != OpZero {
13925 break
13926 }
13927 n := auxIntToInt64(v_1.AuxInt)
13928 p2 := v_1.Args[0]
13929 if !(t1.IsBoolean() && isSamePtr(p1, p2) && n >= o+1) {
13930 break
13931 }
13932 v.reset(OpConstBool)
13933 v.AuxInt = boolToAuxInt(false)
13934 return true
13935 }
13936
13937
13938
13939 for {
13940 t1 := v.Type
13941 if v_0.Op != OpOffPtr {
13942 break
13943 }
13944 o := auxIntToInt64(v_0.AuxInt)
13945 p1 := v_0.Args[0]
13946 if v_1.Op != OpZero {
13947 break
13948 }
13949 n := auxIntToInt64(v_1.AuxInt)
13950 p2 := v_1.Args[0]
13951 if !(is8BitInt(t1) && isSamePtr(p1, p2) && n >= o+1) {
13952 break
13953 }
13954 v.reset(OpConst8)
13955 v.AuxInt = int8ToAuxInt(0)
13956 return true
13957 }
13958
13959
13960
13961 for {
13962 t1 := v.Type
13963 if v_0.Op != OpOffPtr {
13964 break
13965 }
13966 o := auxIntToInt64(v_0.AuxInt)
13967 p1 := v_0.Args[0]
13968 if v_1.Op != OpZero {
13969 break
13970 }
13971 n := auxIntToInt64(v_1.AuxInt)
13972 p2 := v_1.Args[0]
13973 if !(is16BitInt(t1) && isSamePtr(p1, p2) && n >= o+2) {
13974 break
13975 }
13976 v.reset(OpConst16)
13977 v.AuxInt = int16ToAuxInt(0)
13978 return true
13979 }
13980
13981
13982
13983 for {
13984 t1 := v.Type
13985 if v_0.Op != OpOffPtr {
13986 break
13987 }
13988 o := auxIntToInt64(v_0.AuxInt)
13989 p1 := v_0.Args[0]
13990 if v_1.Op != OpZero {
13991 break
13992 }
13993 n := auxIntToInt64(v_1.AuxInt)
13994 p2 := v_1.Args[0]
13995 if !(is32BitInt(t1) && isSamePtr(p1, p2) && n >= o+4) {
13996 break
13997 }
13998 v.reset(OpConst32)
13999 v.AuxInt = int32ToAuxInt(0)
14000 return true
14001 }
14002
14003
14004
14005 for {
14006 t1 := v.Type
14007 if v_0.Op != OpOffPtr {
14008 break
14009 }
14010 o := auxIntToInt64(v_0.AuxInt)
14011 p1 := v_0.Args[0]
14012 if v_1.Op != OpZero {
14013 break
14014 }
14015 n := auxIntToInt64(v_1.AuxInt)
14016 p2 := v_1.Args[0]
14017 if !(is64BitInt(t1) && isSamePtr(p1, p2) && n >= o+8) {
14018 break
14019 }
14020 v.reset(OpConst64)
14021 v.AuxInt = int64ToAuxInt(0)
14022 return true
14023 }
14024
14025
14026
14027 for {
14028 t1 := v.Type
14029 if v_0.Op != OpOffPtr {
14030 break
14031 }
14032 o := auxIntToInt64(v_0.AuxInt)
14033 p1 := v_0.Args[0]
14034 if v_1.Op != OpZero {
14035 break
14036 }
14037 n := auxIntToInt64(v_1.AuxInt)
14038 p2 := v_1.Args[0]
14039 if !(is32BitFloat(t1) && isSamePtr(p1, p2) && n >= o+4) {
14040 break
14041 }
14042 v.reset(OpConst32F)
14043 v.AuxInt = float32ToAuxInt(0)
14044 return true
14045 }
14046
14047
14048
14049 for {
14050 t1 := v.Type
14051 if v_0.Op != OpOffPtr {
14052 break
14053 }
14054 o := auxIntToInt64(v_0.AuxInt)
14055 p1 := v_0.Args[0]
14056 if v_1.Op != OpZero {
14057 break
14058 }
14059 n := auxIntToInt64(v_1.AuxInt)
14060 p2 := v_1.Args[0]
14061 if !(is64BitFloat(t1) && isSamePtr(p1, p2) && n >= o+8) {
14062 break
14063 }
14064 v.reset(OpConst64F)
14065 v.AuxInt = float64ToAuxInt(0)
14066 return true
14067 }
14068
14069
14070
14071 for {
14072 t := v.Type
14073 if !(t.IsStruct() && CanSSA(t)) {
14074 break
14075 }
14076 v.copyOf(rewriteStructLoad(v))
14077 return true
14078 }
14079
14080
14081
14082 for {
14083 t := v.Type
14084 if !(t.IsArray() && t.NumElem() == 0) {
14085 break
14086 }
14087 v.reset(OpArrayMake0)
14088 return true
14089 }
14090
14091
14092
14093 for {
14094 t := v.Type
14095 ptr := v_0
14096 mem := v_1
14097 if !(t.IsArray() && t.NumElem() == 1 && CanSSA(t)) {
14098 break
14099 }
14100 v.reset(OpArrayMake1)
14101 v0 := b.NewValue0(v.Pos, OpLoad, t.Elem())
14102 v0.AddArg2(ptr, mem)
14103 v.AddArg(v0)
14104 return true
14105 }
14106
14107
14108
14109 for {
14110 t := v.Type
14111 if v_0.Op != OpOffPtr {
14112 break
14113 }
14114 off := auxIntToInt64(v_0.AuxInt)
14115 v_0_0 := v_0.Args[0]
14116 if v_0_0.Op != OpAddr {
14117 break
14118 }
14119 s := auxToSym(v_0_0.Aux)
14120 sb := v_0_0.Args[0]
14121 if !(t.IsUintptr() && isFixedSym(s, off)) {
14122 break
14123 }
14124 v.reset(OpAddr)
14125 v.Aux = symToAux(fixedSym(b.Func, s, off))
14126 v.AddArg(sb)
14127 return true
14128 }
14129
14130
14131
14132 for {
14133 t := v.Type
14134 if v_0.Op != OpOffPtr {
14135 break
14136 }
14137 off := auxIntToInt64(v_0.AuxInt)
14138 v_0_0 := v_0.Args[0]
14139 if v_0_0.Op != OpConvert {
14140 break
14141 }
14142 v_0_0_0 := v_0_0.Args[0]
14143 if v_0_0_0.Op != OpAddr {
14144 break
14145 }
14146 s := auxToSym(v_0_0_0.Aux)
14147 sb := v_0_0_0.Args[0]
14148 if !(t.IsUintptr() && isFixedSym(s, off)) {
14149 break
14150 }
14151 v.reset(OpAddr)
14152 v.Aux = symToAux(fixedSym(b.Func, s, off))
14153 v.AddArg(sb)
14154 return true
14155 }
14156
14157
14158
14159 for {
14160 t := v.Type
14161 if v_0.Op != OpOffPtr {
14162 break
14163 }
14164 off := auxIntToInt64(v_0.AuxInt)
14165 v_0_0 := v_0.Args[0]
14166 if v_0_0.Op != OpITab {
14167 break
14168 }
14169 v_0_0_0 := v_0_0.Args[0]
14170 if v_0_0_0.Op != OpIMake {
14171 break
14172 }
14173 v_0_0_0_0 := v_0_0_0.Args[0]
14174 if v_0_0_0_0.Op != OpAddr {
14175 break
14176 }
14177 s := auxToSym(v_0_0_0_0.Aux)
14178 sb := v_0_0_0_0.Args[0]
14179 if !(t.IsUintptr() && isFixedSym(s, off)) {
14180 break
14181 }
14182 v.reset(OpAddr)
14183 v.Aux = symToAux(fixedSym(b.Func, s, off))
14184 v.AddArg(sb)
14185 return true
14186 }
14187
14188
14189
14190 for {
14191 t := v.Type
14192 if v_0.Op != OpOffPtr {
14193 break
14194 }
14195 off := auxIntToInt64(v_0.AuxInt)
14196 v_0_0 := v_0.Args[0]
14197 if v_0_0.Op != OpITab {
14198 break
14199 }
14200 v_0_0_0 := v_0_0.Args[0]
14201 if v_0_0_0.Op != OpIMake {
14202 break
14203 }
14204 v_0_0_0_0 := v_0_0_0.Args[0]
14205 if v_0_0_0_0.Op != OpConvert {
14206 break
14207 }
14208 v_0_0_0_0_0 := v_0_0_0_0.Args[0]
14209 if v_0_0_0_0_0.Op != OpAddr {
14210 break
14211 }
14212 s := auxToSym(v_0_0_0_0_0.Aux)
14213 sb := v_0_0_0_0_0.Args[0]
14214 if !(t.IsUintptr() && isFixedSym(s, off)) {
14215 break
14216 }
14217 v.reset(OpAddr)
14218 v.Aux = symToAux(fixedSym(b.Func, s, off))
14219 v.AddArg(sb)
14220 return true
14221 }
14222
14223
14224
14225 for {
14226 t := v.Type
14227 if v_0.Op != OpOffPtr {
14228 break
14229 }
14230 off := auxIntToInt64(v_0.AuxInt)
14231 v_0_0 := v_0.Args[0]
14232 if v_0_0.Op != OpAddr {
14233 break
14234 }
14235 sym := auxToSym(v_0_0.Aux)
14236 if !(t.IsInteger() && t.Size() == 4 && isFixed32(config, sym, off)) {
14237 break
14238 }
14239 v.reset(OpConst32)
14240 v.AuxInt = int32ToAuxInt(fixed32(config, sym, off))
14241 return true
14242 }
14243
14244
14245
14246 for {
14247 t := v.Type
14248 if v_0.Op != OpOffPtr {
14249 break
14250 }
14251 off := auxIntToInt64(v_0.AuxInt)
14252 v_0_0 := v_0.Args[0]
14253 if v_0_0.Op != OpConvert {
14254 break
14255 }
14256 v_0_0_0 := v_0_0.Args[0]
14257 if v_0_0_0.Op != OpAddr {
14258 break
14259 }
14260 sym := auxToSym(v_0_0_0.Aux)
14261 if !(t.IsInteger() && t.Size() == 4 && isFixed32(config, sym, off)) {
14262 break
14263 }
14264 v.reset(OpConst32)
14265 v.AuxInt = int32ToAuxInt(fixed32(config, sym, off))
14266 return true
14267 }
14268
14269
14270
14271 for {
14272 t := v.Type
14273 if v_0.Op != OpOffPtr {
14274 break
14275 }
14276 off := auxIntToInt64(v_0.AuxInt)
14277 v_0_0 := v_0.Args[0]
14278 if v_0_0.Op != OpITab {
14279 break
14280 }
14281 v_0_0_0 := v_0_0.Args[0]
14282 if v_0_0_0.Op != OpIMake {
14283 break
14284 }
14285 v_0_0_0_0 := v_0_0_0.Args[0]
14286 if v_0_0_0_0.Op != OpAddr {
14287 break
14288 }
14289 sym := auxToSym(v_0_0_0_0.Aux)
14290 if !(t.IsInteger() && t.Size() == 4 && isFixed32(config, sym, off)) {
14291 break
14292 }
14293 v.reset(OpConst32)
14294 v.AuxInt = int32ToAuxInt(fixed32(config, sym, off))
14295 return true
14296 }
14297
14298
14299
14300 for {
14301 t := v.Type
14302 if v_0.Op != OpOffPtr {
14303 break
14304 }
14305 off := auxIntToInt64(v_0.AuxInt)
14306 v_0_0 := v_0.Args[0]
14307 if v_0_0.Op != OpITab {
14308 break
14309 }
14310 v_0_0_0 := v_0_0.Args[0]
14311 if v_0_0_0.Op != OpIMake {
14312 break
14313 }
14314 v_0_0_0_0 := v_0_0_0.Args[0]
14315 if v_0_0_0_0.Op != OpConvert {
14316 break
14317 }
14318 v_0_0_0_0_0 := v_0_0_0_0.Args[0]
14319 if v_0_0_0_0_0.Op != OpAddr {
14320 break
14321 }
14322 sym := auxToSym(v_0_0_0_0_0.Aux)
14323 if !(t.IsInteger() && t.Size() == 4 && isFixed32(config, sym, off)) {
14324 break
14325 }
14326 v.reset(OpConst32)
14327 v.AuxInt = int32ToAuxInt(fixed32(config, sym, off))
14328 return true
14329 }
14330 return false
14331 }
14332 func rewriteValuegeneric_OpLsh16x16(v *Value) bool {
14333 v_1 := v.Args[1]
14334 v_0 := v.Args[0]
14335 b := v.Block
14336
14337
14338 for {
14339 t := v.Type
14340 x := v_0
14341 if v_1.Op != OpConst16 {
14342 break
14343 }
14344 c := auxIntToInt16(v_1.AuxInt)
14345 v.reset(OpLsh16x64)
14346 v0 := b.NewValue0(v.Pos, OpConst64, t)
14347 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
14348 v.AddArg2(x, v0)
14349 return true
14350 }
14351
14352
14353 for {
14354 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
14355 break
14356 }
14357 v.reset(OpConst16)
14358 v.AuxInt = int16ToAuxInt(0)
14359 return true
14360 }
14361 return false
14362 }
14363 func rewriteValuegeneric_OpLsh16x32(v *Value) bool {
14364 v_1 := v.Args[1]
14365 v_0 := v.Args[0]
14366 b := v.Block
14367
14368
14369 for {
14370 t := v.Type
14371 x := v_0
14372 if v_1.Op != OpConst32 {
14373 break
14374 }
14375 c := auxIntToInt32(v_1.AuxInt)
14376 v.reset(OpLsh16x64)
14377 v0 := b.NewValue0(v.Pos, OpConst64, t)
14378 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
14379 v.AddArg2(x, v0)
14380 return true
14381 }
14382
14383
14384 for {
14385 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
14386 break
14387 }
14388 v.reset(OpConst16)
14389 v.AuxInt = int16ToAuxInt(0)
14390 return true
14391 }
14392 return false
14393 }
14394 func rewriteValuegeneric_OpLsh16x64(v *Value) bool {
14395 v_1 := v.Args[1]
14396 v_0 := v.Args[0]
14397 b := v.Block
14398 typ := &b.Func.Config.Types
14399
14400
14401 for {
14402 if v_0.Op != OpConst16 {
14403 break
14404 }
14405 c := auxIntToInt16(v_0.AuxInt)
14406 if v_1.Op != OpConst64 {
14407 break
14408 }
14409 d := auxIntToInt64(v_1.AuxInt)
14410 v.reset(OpConst16)
14411 v.AuxInt = int16ToAuxInt(c << uint64(d))
14412 return true
14413 }
14414
14415
14416 for {
14417 x := v_0
14418 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
14419 break
14420 }
14421 v.copyOf(x)
14422 return true
14423 }
14424
14425
14426 for {
14427 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
14428 break
14429 }
14430 v.reset(OpConst16)
14431 v.AuxInt = int16ToAuxInt(0)
14432 return true
14433 }
14434
14435
14436
14437 for {
14438 if v_1.Op != OpConst64 {
14439 break
14440 }
14441 c := auxIntToInt64(v_1.AuxInt)
14442 if !(uint64(c) >= 16) {
14443 break
14444 }
14445 v.reset(OpConst16)
14446 v.AuxInt = int16ToAuxInt(0)
14447 return true
14448 }
14449
14450
14451
14452 for {
14453 t := v.Type
14454 if v_0.Op != OpLsh16x64 {
14455 break
14456 }
14457 _ = v_0.Args[1]
14458 x := v_0.Args[0]
14459 v_0_1 := v_0.Args[1]
14460 if v_0_1.Op != OpConst64 {
14461 break
14462 }
14463 c := auxIntToInt64(v_0_1.AuxInt)
14464 if v_1.Op != OpConst64 {
14465 break
14466 }
14467 d := auxIntToInt64(v_1.AuxInt)
14468 if !(!uaddOvf(c, d)) {
14469 break
14470 }
14471 v.reset(OpLsh16x64)
14472 v0 := b.NewValue0(v.Pos, OpConst64, t)
14473 v0.AuxInt = int64ToAuxInt(c + d)
14474 v.AddArg2(x, v0)
14475 return true
14476 }
14477
14478
14479
14480 for {
14481 i := v_0
14482 if i.Op != OpRsh16x64 {
14483 break
14484 }
14485 _ = i.Args[1]
14486 x := i.Args[0]
14487 i_1 := i.Args[1]
14488 if i_1.Op != OpConst64 {
14489 break
14490 }
14491 c := auxIntToInt64(i_1.AuxInt)
14492 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
14493 break
14494 }
14495 v.reset(OpAnd16)
14496 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
14497 v0.AuxInt = int16ToAuxInt(int16(-1) << c)
14498 v.AddArg2(x, v0)
14499 return true
14500 }
14501
14502
14503
14504 for {
14505 i := v_0
14506 if i.Op != OpRsh16Ux64 {
14507 break
14508 }
14509 _ = i.Args[1]
14510 x := i.Args[0]
14511 i_1 := i.Args[1]
14512 if i_1.Op != OpConst64 {
14513 break
14514 }
14515 c := auxIntToInt64(i_1.AuxInt)
14516 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
14517 break
14518 }
14519 v.reset(OpAnd16)
14520 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
14521 v0.AuxInt = int16ToAuxInt(int16(-1) << c)
14522 v.AddArg2(x, v0)
14523 return true
14524 }
14525
14526
14527
14528 for {
14529 if v_0.Op != OpRsh16Ux64 {
14530 break
14531 }
14532 _ = v_0.Args[1]
14533 v_0_0 := v_0.Args[0]
14534 if v_0_0.Op != OpLsh16x64 {
14535 break
14536 }
14537 _ = v_0_0.Args[1]
14538 x := v_0_0.Args[0]
14539 v_0_0_1 := v_0_0.Args[1]
14540 if v_0_0_1.Op != OpConst64 {
14541 break
14542 }
14543 c1 := auxIntToInt64(v_0_0_1.AuxInt)
14544 v_0_1 := v_0.Args[1]
14545 if v_0_1.Op != OpConst64 {
14546 break
14547 }
14548 c2 := auxIntToInt64(v_0_1.AuxInt)
14549 if v_1.Op != OpConst64 {
14550 break
14551 }
14552 c3 := auxIntToInt64(v_1.AuxInt)
14553 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
14554 break
14555 }
14556 v.reset(OpLsh16x64)
14557 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
14558 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
14559 v.AddArg2(x, v0)
14560 return true
14561 }
14562
14563
14564
14565 for {
14566 if v_0.Op != OpAnd16 {
14567 break
14568 }
14569 _ = v_0.Args[1]
14570 v_0_0 := v_0.Args[0]
14571 v_0_1 := v_0.Args[1]
14572 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14573 if v_0_0.Op != OpRsh16x64 {
14574 continue
14575 }
14576 t := v_0_0.Type
14577 _ = v_0_0.Args[1]
14578 x := v_0_0.Args[0]
14579 v_0_0_1 := v_0_0.Args[1]
14580 if v_0_0_1.Op != OpConst64 {
14581 continue
14582 }
14583 t2 := v_0_0_1.Type
14584 c := auxIntToInt64(v_0_0_1.AuxInt)
14585 if v_0_1.Op != OpConst16 {
14586 continue
14587 }
14588 d := auxIntToInt16(v_0_1.AuxInt)
14589 if v_1.Op != OpConst64 {
14590 continue
14591 }
14592 e := auxIntToInt64(v_1.AuxInt)
14593 if !(c >= e) {
14594 continue
14595 }
14596 v.reset(OpAnd16)
14597 v0 := b.NewValue0(v.Pos, OpRsh16x64, t)
14598 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14599 v1.AuxInt = int64ToAuxInt(c - e)
14600 v0.AddArg2(x, v1)
14601 v2 := b.NewValue0(v.Pos, OpConst16, t)
14602 v2.AuxInt = int16ToAuxInt(d << e)
14603 v.AddArg2(v0, v2)
14604 return true
14605 }
14606 break
14607 }
14608
14609
14610
14611 for {
14612 if v_0.Op != OpAnd16 {
14613 break
14614 }
14615 _ = v_0.Args[1]
14616 v_0_0 := v_0.Args[0]
14617 v_0_1 := v_0.Args[1]
14618 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14619 if v_0_0.Op != OpRsh16Ux64 {
14620 continue
14621 }
14622 t := v_0_0.Type
14623 _ = v_0_0.Args[1]
14624 x := v_0_0.Args[0]
14625 v_0_0_1 := v_0_0.Args[1]
14626 if v_0_0_1.Op != OpConst64 {
14627 continue
14628 }
14629 t2 := v_0_0_1.Type
14630 c := auxIntToInt64(v_0_0_1.AuxInt)
14631 if v_0_1.Op != OpConst16 {
14632 continue
14633 }
14634 d := auxIntToInt16(v_0_1.AuxInt)
14635 if v_1.Op != OpConst64 {
14636 continue
14637 }
14638 e := auxIntToInt64(v_1.AuxInt)
14639 if !(c >= e) {
14640 continue
14641 }
14642 v.reset(OpAnd16)
14643 v0 := b.NewValue0(v.Pos, OpRsh16Ux64, t)
14644 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14645 v1.AuxInt = int64ToAuxInt(c - e)
14646 v0.AddArg2(x, v1)
14647 v2 := b.NewValue0(v.Pos, OpConst16, t)
14648 v2.AuxInt = int16ToAuxInt(d << e)
14649 v.AddArg2(v0, v2)
14650 return true
14651 }
14652 break
14653 }
14654
14655
14656
14657 for {
14658 if v_0.Op != OpAnd16 {
14659 break
14660 }
14661 _ = v_0.Args[1]
14662 v_0_0 := v_0.Args[0]
14663 v_0_1 := v_0.Args[1]
14664 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14665 if v_0_0.Op != OpRsh16x64 {
14666 continue
14667 }
14668 t := v_0_0.Type
14669 _ = v_0_0.Args[1]
14670 x := v_0_0.Args[0]
14671 v_0_0_1 := v_0_0.Args[1]
14672 if v_0_0_1.Op != OpConst64 {
14673 continue
14674 }
14675 t2 := v_0_0_1.Type
14676 c := auxIntToInt64(v_0_0_1.AuxInt)
14677 if v_0_1.Op != OpConst16 {
14678 continue
14679 }
14680 d := auxIntToInt16(v_0_1.AuxInt)
14681 if v_1.Op != OpConst64 {
14682 continue
14683 }
14684 e := auxIntToInt64(v_1.AuxInt)
14685 if !(c < e) {
14686 continue
14687 }
14688 v.reset(OpAnd16)
14689 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
14690 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14691 v1.AuxInt = int64ToAuxInt(e - c)
14692 v0.AddArg2(x, v1)
14693 v2 := b.NewValue0(v.Pos, OpConst16, t)
14694 v2.AuxInt = int16ToAuxInt(d << e)
14695 v.AddArg2(v0, v2)
14696 return true
14697 }
14698 break
14699 }
14700
14701
14702
14703 for {
14704 if v_0.Op != OpAnd16 {
14705 break
14706 }
14707 _ = v_0.Args[1]
14708 v_0_0 := v_0.Args[0]
14709 v_0_1 := v_0.Args[1]
14710 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14711 if v_0_0.Op != OpRsh16Ux64 {
14712 continue
14713 }
14714 t := v_0_0.Type
14715 _ = v_0_0.Args[1]
14716 x := v_0_0.Args[0]
14717 v_0_0_1 := v_0_0.Args[1]
14718 if v_0_0_1.Op != OpConst64 {
14719 continue
14720 }
14721 t2 := v_0_0_1.Type
14722 c := auxIntToInt64(v_0_0_1.AuxInt)
14723 if v_0_1.Op != OpConst16 {
14724 continue
14725 }
14726 d := auxIntToInt16(v_0_1.AuxInt)
14727 if v_1.Op != OpConst64 {
14728 continue
14729 }
14730 e := auxIntToInt64(v_1.AuxInt)
14731 if !(c < e) {
14732 continue
14733 }
14734 v.reset(OpAnd16)
14735 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
14736 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14737 v1.AuxInt = int64ToAuxInt(e - c)
14738 v0.AddArg2(x, v1)
14739 v2 := b.NewValue0(v.Pos, OpConst16, t)
14740 v2.AuxInt = int16ToAuxInt(d << e)
14741 v.AddArg2(v0, v2)
14742 return true
14743 }
14744 break
14745 }
14746 return false
14747 }
14748 func rewriteValuegeneric_OpLsh16x8(v *Value) bool {
14749 v_1 := v.Args[1]
14750 v_0 := v.Args[0]
14751 b := v.Block
14752
14753
14754 for {
14755 t := v.Type
14756 x := v_0
14757 if v_1.Op != OpConst8 {
14758 break
14759 }
14760 c := auxIntToInt8(v_1.AuxInt)
14761 v.reset(OpLsh16x64)
14762 v0 := b.NewValue0(v.Pos, OpConst64, t)
14763 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
14764 v.AddArg2(x, v0)
14765 return true
14766 }
14767
14768
14769 for {
14770 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
14771 break
14772 }
14773 v.reset(OpConst16)
14774 v.AuxInt = int16ToAuxInt(0)
14775 return true
14776 }
14777 return false
14778 }
14779 func rewriteValuegeneric_OpLsh32x16(v *Value) bool {
14780 v_1 := v.Args[1]
14781 v_0 := v.Args[0]
14782 b := v.Block
14783
14784
14785 for {
14786 t := v.Type
14787 x := v_0
14788 if v_1.Op != OpConst16 {
14789 break
14790 }
14791 c := auxIntToInt16(v_1.AuxInt)
14792 v.reset(OpLsh32x64)
14793 v0 := b.NewValue0(v.Pos, OpConst64, t)
14794 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
14795 v.AddArg2(x, v0)
14796 return true
14797 }
14798
14799
14800 for {
14801 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
14802 break
14803 }
14804 v.reset(OpConst32)
14805 v.AuxInt = int32ToAuxInt(0)
14806 return true
14807 }
14808 return false
14809 }
14810 func rewriteValuegeneric_OpLsh32x32(v *Value) bool {
14811 v_1 := v.Args[1]
14812 v_0 := v.Args[0]
14813 b := v.Block
14814
14815
14816 for {
14817 t := v.Type
14818 x := v_0
14819 if v_1.Op != OpConst32 {
14820 break
14821 }
14822 c := auxIntToInt32(v_1.AuxInt)
14823 v.reset(OpLsh32x64)
14824 v0 := b.NewValue0(v.Pos, OpConst64, t)
14825 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
14826 v.AddArg2(x, v0)
14827 return true
14828 }
14829
14830
14831 for {
14832 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
14833 break
14834 }
14835 v.reset(OpConst32)
14836 v.AuxInt = int32ToAuxInt(0)
14837 return true
14838 }
14839 return false
14840 }
14841 func rewriteValuegeneric_OpLsh32x64(v *Value) bool {
14842 v_1 := v.Args[1]
14843 v_0 := v.Args[0]
14844 b := v.Block
14845 typ := &b.Func.Config.Types
14846
14847
14848 for {
14849 if v_0.Op != OpConst32 {
14850 break
14851 }
14852 c := auxIntToInt32(v_0.AuxInt)
14853 if v_1.Op != OpConst64 {
14854 break
14855 }
14856 d := auxIntToInt64(v_1.AuxInt)
14857 v.reset(OpConst32)
14858 v.AuxInt = int32ToAuxInt(c << uint64(d))
14859 return true
14860 }
14861
14862
14863 for {
14864 x := v_0
14865 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
14866 break
14867 }
14868 v.copyOf(x)
14869 return true
14870 }
14871
14872
14873 for {
14874 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
14875 break
14876 }
14877 v.reset(OpConst32)
14878 v.AuxInt = int32ToAuxInt(0)
14879 return true
14880 }
14881
14882
14883
14884 for {
14885 if v_1.Op != OpConst64 {
14886 break
14887 }
14888 c := auxIntToInt64(v_1.AuxInt)
14889 if !(uint64(c) >= 32) {
14890 break
14891 }
14892 v.reset(OpConst32)
14893 v.AuxInt = int32ToAuxInt(0)
14894 return true
14895 }
14896
14897
14898
14899 for {
14900 t := v.Type
14901 if v_0.Op != OpLsh32x64 {
14902 break
14903 }
14904 _ = v_0.Args[1]
14905 x := v_0.Args[0]
14906 v_0_1 := v_0.Args[1]
14907 if v_0_1.Op != OpConst64 {
14908 break
14909 }
14910 c := auxIntToInt64(v_0_1.AuxInt)
14911 if v_1.Op != OpConst64 {
14912 break
14913 }
14914 d := auxIntToInt64(v_1.AuxInt)
14915 if !(!uaddOvf(c, d)) {
14916 break
14917 }
14918 v.reset(OpLsh32x64)
14919 v0 := b.NewValue0(v.Pos, OpConst64, t)
14920 v0.AuxInt = int64ToAuxInt(c + d)
14921 v.AddArg2(x, v0)
14922 return true
14923 }
14924
14925
14926
14927 for {
14928 i := v_0
14929 if i.Op != OpRsh32x64 {
14930 break
14931 }
14932 _ = i.Args[1]
14933 x := i.Args[0]
14934 i_1 := i.Args[1]
14935 if i_1.Op != OpConst64 {
14936 break
14937 }
14938 c := auxIntToInt64(i_1.AuxInt)
14939 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
14940 break
14941 }
14942 v.reset(OpAnd32)
14943 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
14944 v0.AuxInt = int32ToAuxInt(int32(-1) << c)
14945 v.AddArg2(x, v0)
14946 return true
14947 }
14948
14949
14950
14951 for {
14952 i := v_0
14953 if i.Op != OpRsh32Ux64 {
14954 break
14955 }
14956 _ = i.Args[1]
14957 x := i.Args[0]
14958 i_1 := i.Args[1]
14959 if i_1.Op != OpConst64 {
14960 break
14961 }
14962 c := auxIntToInt64(i_1.AuxInt)
14963 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
14964 break
14965 }
14966 v.reset(OpAnd32)
14967 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
14968 v0.AuxInt = int32ToAuxInt(int32(-1) << c)
14969 v.AddArg2(x, v0)
14970 return true
14971 }
14972
14973
14974
14975 for {
14976 if v_0.Op != OpRsh32Ux64 {
14977 break
14978 }
14979 _ = v_0.Args[1]
14980 v_0_0 := v_0.Args[0]
14981 if v_0_0.Op != OpLsh32x64 {
14982 break
14983 }
14984 _ = v_0_0.Args[1]
14985 x := v_0_0.Args[0]
14986 v_0_0_1 := v_0_0.Args[1]
14987 if v_0_0_1.Op != OpConst64 {
14988 break
14989 }
14990 c1 := auxIntToInt64(v_0_0_1.AuxInt)
14991 v_0_1 := v_0.Args[1]
14992 if v_0_1.Op != OpConst64 {
14993 break
14994 }
14995 c2 := auxIntToInt64(v_0_1.AuxInt)
14996 if v_1.Op != OpConst64 {
14997 break
14998 }
14999 c3 := auxIntToInt64(v_1.AuxInt)
15000 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
15001 break
15002 }
15003 v.reset(OpLsh32x64)
15004 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
15005 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
15006 v.AddArg2(x, v0)
15007 return true
15008 }
15009
15010
15011
15012 for {
15013 if v_0.Op != OpAnd32 {
15014 break
15015 }
15016 _ = v_0.Args[1]
15017 v_0_0 := v_0.Args[0]
15018 v_0_1 := v_0.Args[1]
15019 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15020 if v_0_0.Op != OpRsh32x64 {
15021 continue
15022 }
15023 t := v_0_0.Type
15024 _ = v_0_0.Args[1]
15025 x := v_0_0.Args[0]
15026 v_0_0_1 := v_0_0.Args[1]
15027 if v_0_0_1.Op != OpConst64 {
15028 continue
15029 }
15030 t2 := v_0_0_1.Type
15031 c := auxIntToInt64(v_0_0_1.AuxInt)
15032 if v_0_1.Op != OpConst32 {
15033 continue
15034 }
15035 d := auxIntToInt32(v_0_1.AuxInt)
15036 if v_1.Op != OpConst64 {
15037 continue
15038 }
15039 e := auxIntToInt64(v_1.AuxInt)
15040 if !(c >= e) {
15041 continue
15042 }
15043 v.reset(OpAnd32)
15044 v0 := b.NewValue0(v.Pos, OpRsh32x64, t)
15045 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15046 v1.AuxInt = int64ToAuxInt(c - e)
15047 v0.AddArg2(x, v1)
15048 v2 := b.NewValue0(v.Pos, OpConst32, t)
15049 v2.AuxInt = int32ToAuxInt(d << e)
15050 v.AddArg2(v0, v2)
15051 return true
15052 }
15053 break
15054 }
15055
15056
15057
15058 for {
15059 if v_0.Op != OpAnd32 {
15060 break
15061 }
15062 _ = v_0.Args[1]
15063 v_0_0 := v_0.Args[0]
15064 v_0_1 := v_0.Args[1]
15065 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15066 if v_0_0.Op != OpRsh32Ux64 {
15067 continue
15068 }
15069 t := v_0_0.Type
15070 _ = v_0_0.Args[1]
15071 x := v_0_0.Args[0]
15072 v_0_0_1 := v_0_0.Args[1]
15073 if v_0_0_1.Op != OpConst64 {
15074 continue
15075 }
15076 t2 := v_0_0_1.Type
15077 c := auxIntToInt64(v_0_0_1.AuxInt)
15078 if v_0_1.Op != OpConst32 {
15079 continue
15080 }
15081 d := auxIntToInt32(v_0_1.AuxInt)
15082 if v_1.Op != OpConst64 {
15083 continue
15084 }
15085 e := auxIntToInt64(v_1.AuxInt)
15086 if !(c >= e) {
15087 continue
15088 }
15089 v.reset(OpAnd32)
15090 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, t)
15091 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15092 v1.AuxInt = int64ToAuxInt(c - e)
15093 v0.AddArg2(x, v1)
15094 v2 := b.NewValue0(v.Pos, OpConst32, t)
15095 v2.AuxInt = int32ToAuxInt(d << e)
15096 v.AddArg2(v0, v2)
15097 return true
15098 }
15099 break
15100 }
15101
15102
15103
15104 for {
15105 if v_0.Op != OpAnd32 {
15106 break
15107 }
15108 _ = v_0.Args[1]
15109 v_0_0 := v_0.Args[0]
15110 v_0_1 := v_0.Args[1]
15111 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15112 if v_0_0.Op != OpRsh32x64 {
15113 continue
15114 }
15115 t := v_0_0.Type
15116 _ = v_0_0.Args[1]
15117 x := v_0_0.Args[0]
15118 v_0_0_1 := v_0_0.Args[1]
15119 if v_0_0_1.Op != OpConst64 {
15120 continue
15121 }
15122 t2 := v_0_0_1.Type
15123 c := auxIntToInt64(v_0_0_1.AuxInt)
15124 if v_0_1.Op != OpConst32 {
15125 continue
15126 }
15127 d := auxIntToInt32(v_0_1.AuxInt)
15128 if v_1.Op != OpConst64 {
15129 continue
15130 }
15131 e := auxIntToInt64(v_1.AuxInt)
15132 if !(c < e) {
15133 continue
15134 }
15135 v.reset(OpAnd32)
15136 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
15137 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15138 v1.AuxInt = int64ToAuxInt(e - c)
15139 v0.AddArg2(x, v1)
15140 v2 := b.NewValue0(v.Pos, OpConst32, t)
15141 v2.AuxInt = int32ToAuxInt(d << e)
15142 v.AddArg2(v0, v2)
15143 return true
15144 }
15145 break
15146 }
15147
15148
15149
15150 for {
15151 if v_0.Op != OpAnd32 {
15152 break
15153 }
15154 _ = v_0.Args[1]
15155 v_0_0 := v_0.Args[0]
15156 v_0_1 := v_0.Args[1]
15157 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15158 if v_0_0.Op != OpRsh32Ux64 {
15159 continue
15160 }
15161 t := v_0_0.Type
15162 _ = v_0_0.Args[1]
15163 x := v_0_0.Args[0]
15164 v_0_0_1 := v_0_0.Args[1]
15165 if v_0_0_1.Op != OpConst64 {
15166 continue
15167 }
15168 t2 := v_0_0_1.Type
15169 c := auxIntToInt64(v_0_0_1.AuxInt)
15170 if v_0_1.Op != OpConst32 {
15171 continue
15172 }
15173 d := auxIntToInt32(v_0_1.AuxInt)
15174 if v_1.Op != OpConst64 {
15175 continue
15176 }
15177 e := auxIntToInt64(v_1.AuxInt)
15178 if !(c < e) {
15179 continue
15180 }
15181 v.reset(OpAnd32)
15182 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
15183 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15184 v1.AuxInt = int64ToAuxInt(e - c)
15185 v0.AddArg2(x, v1)
15186 v2 := b.NewValue0(v.Pos, OpConst32, t)
15187 v2.AuxInt = int32ToAuxInt(d << e)
15188 v.AddArg2(v0, v2)
15189 return true
15190 }
15191 break
15192 }
15193 return false
15194 }
15195 func rewriteValuegeneric_OpLsh32x8(v *Value) bool {
15196 v_1 := v.Args[1]
15197 v_0 := v.Args[0]
15198 b := v.Block
15199
15200
15201 for {
15202 t := v.Type
15203 x := v_0
15204 if v_1.Op != OpConst8 {
15205 break
15206 }
15207 c := auxIntToInt8(v_1.AuxInt)
15208 v.reset(OpLsh32x64)
15209 v0 := b.NewValue0(v.Pos, OpConst64, t)
15210 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
15211 v.AddArg2(x, v0)
15212 return true
15213 }
15214
15215
15216 for {
15217 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
15218 break
15219 }
15220 v.reset(OpConst32)
15221 v.AuxInt = int32ToAuxInt(0)
15222 return true
15223 }
15224 return false
15225 }
15226 func rewriteValuegeneric_OpLsh64x16(v *Value) bool {
15227 v_1 := v.Args[1]
15228 v_0 := v.Args[0]
15229 b := v.Block
15230
15231
15232 for {
15233 t := v.Type
15234 x := v_0
15235 if v_1.Op != OpConst16 {
15236 break
15237 }
15238 c := auxIntToInt16(v_1.AuxInt)
15239 v.reset(OpLsh64x64)
15240 v0 := b.NewValue0(v.Pos, OpConst64, t)
15241 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
15242 v.AddArg2(x, v0)
15243 return true
15244 }
15245
15246
15247 for {
15248 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
15249 break
15250 }
15251 v.reset(OpConst64)
15252 v.AuxInt = int64ToAuxInt(0)
15253 return true
15254 }
15255 return false
15256 }
15257 func rewriteValuegeneric_OpLsh64x32(v *Value) bool {
15258 v_1 := v.Args[1]
15259 v_0 := v.Args[0]
15260 b := v.Block
15261
15262
15263 for {
15264 t := v.Type
15265 x := v_0
15266 if v_1.Op != OpConst32 {
15267 break
15268 }
15269 c := auxIntToInt32(v_1.AuxInt)
15270 v.reset(OpLsh64x64)
15271 v0 := b.NewValue0(v.Pos, OpConst64, t)
15272 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
15273 v.AddArg2(x, v0)
15274 return true
15275 }
15276
15277
15278 for {
15279 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
15280 break
15281 }
15282 v.reset(OpConst64)
15283 v.AuxInt = int64ToAuxInt(0)
15284 return true
15285 }
15286 return false
15287 }
15288 func rewriteValuegeneric_OpLsh64x64(v *Value) bool {
15289 v_1 := v.Args[1]
15290 v_0 := v.Args[0]
15291 b := v.Block
15292 typ := &b.Func.Config.Types
15293
15294
15295 for {
15296 if v_0.Op != OpConst64 {
15297 break
15298 }
15299 c := auxIntToInt64(v_0.AuxInt)
15300 if v_1.Op != OpConst64 {
15301 break
15302 }
15303 d := auxIntToInt64(v_1.AuxInt)
15304 v.reset(OpConst64)
15305 v.AuxInt = int64ToAuxInt(c << uint64(d))
15306 return true
15307 }
15308
15309
15310 for {
15311 x := v_0
15312 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
15313 break
15314 }
15315 v.copyOf(x)
15316 return true
15317 }
15318
15319
15320 for {
15321 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
15322 break
15323 }
15324 v.reset(OpConst64)
15325 v.AuxInt = int64ToAuxInt(0)
15326 return true
15327 }
15328
15329
15330
15331 for {
15332 if v_1.Op != OpConst64 {
15333 break
15334 }
15335 c := auxIntToInt64(v_1.AuxInt)
15336 if !(uint64(c) >= 64) {
15337 break
15338 }
15339 v.reset(OpConst64)
15340 v.AuxInt = int64ToAuxInt(0)
15341 return true
15342 }
15343
15344
15345
15346 for {
15347 t := v.Type
15348 if v_0.Op != OpLsh64x64 {
15349 break
15350 }
15351 _ = v_0.Args[1]
15352 x := v_0.Args[0]
15353 v_0_1 := v_0.Args[1]
15354 if v_0_1.Op != OpConst64 {
15355 break
15356 }
15357 c := auxIntToInt64(v_0_1.AuxInt)
15358 if v_1.Op != OpConst64 {
15359 break
15360 }
15361 d := auxIntToInt64(v_1.AuxInt)
15362 if !(!uaddOvf(c, d)) {
15363 break
15364 }
15365 v.reset(OpLsh64x64)
15366 v0 := b.NewValue0(v.Pos, OpConst64, t)
15367 v0.AuxInt = int64ToAuxInt(c + d)
15368 v.AddArg2(x, v0)
15369 return true
15370 }
15371
15372
15373
15374 for {
15375 i := v_0
15376 if i.Op != OpRsh64x64 {
15377 break
15378 }
15379 _ = i.Args[1]
15380 x := i.Args[0]
15381 i_1 := i.Args[1]
15382 if i_1.Op != OpConst64 {
15383 break
15384 }
15385 c := auxIntToInt64(i_1.AuxInt)
15386 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
15387 break
15388 }
15389 v.reset(OpAnd64)
15390 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
15391 v0.AuxInt = int64ToAuxInt(int64(-1) << c)
15392 v.AddArg2(x, v0)
15393 return true
15394 }
15395
15396
15397
15398 for {
15399 i := v_0
15400 if i.Op != OpRsh64Ux64 {
15401 break
15402 }
15403 _ = i.Args[1]
15404 x := i.Args[0]
15405 i_1 := i.Args[1]
15406 if i_1.Op != OpConst64 {
15407 break
15408 }
15409 c := auxIntToInt64(i_1.AuxInt)
15410 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
15411 break
15412 }
15413 v.reset(OpAnd64)
15414 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
15415 v0.AuxInt = int64ToAuxInt(int64(-1) << c)
15416 v.AddArg2(x, v0)
15417 return true
15418 }
15419
15420
15421
15422 for {
15423 if v_0.Op != OpRsh64Ux64 {
15424 break
15425 }
15426 _ = v_0.Args[1]
15427 v_0_0 := v_0.Args[0]
15428 if v_0_0.Op != OpLsh64x64 {
15429 break
15430 }
15431 _ = v_0_0.Args[1]
15432 x := v_0_0.Args[0]
15433 v_0_0_1 := v_0_0.Args[1]
15434 if v_0_0_1.Op != OpConst64 {
15435 break
15436 }
15437 c1 := auxIntToInt64(v_0_0_1.AuxInt)
15438 v_0_1 := v_0.Args[1]
15439 if v_0_1.Op != OpConst64 {
15440 break
15441 }
15442 c2 := auxIntToInt64(v_0_1.AuxInt)
15443 if v_1.Op != OpConst64 {
15444 break
15445 }
15446 c3 := auxIntToInt64(v_1.AuxInt)
15447 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
15448 break
15449 }
15450 v.reset(OpLsh64x64)
15451 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
15452 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
15453 v.AddArg2(x, v0)
15454 return true
15455 }
15456
15457
15458
15459 for {
15460 if v_0.Op != OpAnd64 {
15461 break
15462 }
15463 _ = v_0.Args[1]
15464 v_0_0 := v_0.Args[0]
15465 v_0_1 := v_0.Args[1]
15466 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15467 if v_0_0.Op != OpRsh64x64 {
15468 continue
15469 }
15470 t := v_0_0.Type
15471 _ = v_0_0.Args[1]
15472 x := v_0_0.Args[0]
15473 v_0_0_1 := v_0_0.Args[1]
15474 if v_0_0_1.Op != OpConst64 {
15475 continue
15476 }
15477 t2 := v_0_0_1.Type
15478 c := auxIntToInt64(v_0_0_1.AuxInt)
15479 if v_0_1.Op != OpConst64 {
15480 continue
15481 }
15482 d := auxIntToInt64(v_0_1.AuxInt)
15483 if v_1.Op != OpConst64 {
15484 continue
15485 }
15486 e := auxIntToInt64(v_1.AuxInt)
15487 if !(c >= e) {
15488 continue
15489 }
15490 v.reset(OpAnd64)
15491 v0 := b.NewValue0(v.Pos, OpRsh64x64, t)
15492 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15493 v1.AuxInt = int64ToAuxInt(c - e)
15494 v0.AddArg2(x, v1)
15495 v2 := b.NewValue0(v.Pos, OpConst64, t)
15496 v2.AuxInt = int64ToAuxInt(d << e)
15497 v.AddArg2(v0, v2)
15498 return true
15499 }
15500 break
15501 }
15502
15503
15504
15505 for {
15506 if v_0.Op != OpAnd64 {
15507 break
15508 }
15509 _ = v_0.Args[1]
15510 v_0_0 := v_0.Args[0]
15511 v_0_1 := v_0.Args[1]
15512 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15513 if v_0_0.Op != OpRsh64Ux64 {
15514 continue
15515 }
15516 t := v_0_0.Type
15517 _ = v_0_0.Args[1]
15518 x := v_0_0.Args[0]
15519 v_0_0_1 := v_0_0.Args[1]
15520 if v_0_0_1.Op != OpConst64 {
15521 continue
15522 }
15523 t2 := v_0_0_1.Type
15524 c := auxIntToInt64(v_0_0_1.AuxInt)
15525 if v_0_1.Op != OpConst64 {
15526 continue
15527 }
15528 d := auxIntToInt64(v_0_1.AuxInt)
15529 if v_1.Op != OpConst64 {
15530 continue
15531 }
15532 e := auxIntToInt64(v_1.AuxInt)
15533 if !(c >= e) {
15534 continue
15535 }
15536 v.reset(OpAnd64)
15537 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t)
15538 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15539 v1.AuxInt = int64ToAuxInt(c - e)
15540 v0.AddArg2(x, v1)
15541 v2 := b.NewValue0(v.Pos, OpConst64, t)
15542 v2.AuxInt = int64ToAuxInt(d << e)
15543 v.AddArg2(v0, v2)
15544 return true
15545 }
15546 break
15547 }
15548
15549
15550
15551 for {
15552 if v_0.Op != OpAnd64 {
15553 break
15554 }
15555 _ = v_0.Args[1]
15556 v_0_0 := v_0.Args[0]
15557 v_0_1 := v_0.Args[1]
15558 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15559 if v_0_0.Op != OpRsh64x64 {
15560 continue
15561 }
15562 t := v_0_0.Type
15563 _ = v_0_0.Args[1]
15564 x := v_0_0.Args[0]
15565 v_0_0_1 := v_0_0.Args[1]
15566 if v_0_0_1.Op != OpConst64 {
15567 continue
15568 }
15569 t2 := v_0_0_1.Type
15570 c := auxIntToInt64(v_0_0_1.AuxInt)
15571 if v_0_1.Op != OpConst64 {
15572 continue
15573 }
15574 d := auxIntToInt64(v_0_1.AuxInt)
15575 if v_1.Op != OpConst64 {
15576 continue
15577 }
15578 e := auxIntToInt64(v_1.AuxInt)
15579 if !(c < e) {
15580 continue
15581 }
15582 v.reset(OpAnd64)
15583 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
15584 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15585 v1.AuxInt = int64ToAuxInt(e - c)
15586 v0.AddArg2(x, v1)
15587 v2 := b.NewValue0(v.Pos, OpConst64, t)
15588 v2.AuxInt = int64ToAuxInt(d << e)
15589 v.AddArg2(v0, v2)
15590 return true
15591 }
15592 break
15593 }
15594
15595
15596
15597 for {
15598 if v_0.Op != OpAnd64 {
15599 break
15600 }
15601 _ = v_0.Args[1]
15602 v_0_0 := v_0.Args[0]
15603 v_0_1 := v_0.Args[1]
15604 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15605 if v_0_0.Op != OpRsh64Ux64 {
15606 continue
15607 }
15608 t := v_0_0.Type
15609 _ = v_0_0.Args[1]
15610 x := v_0_0.Args[0]
15611 v_0_0_1 := v_0_0.Args[1]
15612 if v_0_0_1.Op != OpConst64 {
15613 continue
15614 }
15615 t2 := v_0_0_1.Type
15616 c := auxIntToInt64(v_0_0_1.AuxInt)
15617 if v_0_1.Op != OpConst64 {
15618 continue
15619 }
15620 d := auxIntToInt64(v_0_1.AuxInt)
15621 if v_1.Op != OpConst64 {
15622 continue
15623 }
15624 e := auxIntToInt64(v_1.AuxInt)
15625 if !(c < e) {
15626 continue
15627 }
15628 v.reset(OpAnd64)
15629 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
15630 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15631 v1.AuxInt = int64ToAuxInt(e - c)
15632 v0.AddArg2(x, v1)
15633 v2 := b.NewValue0(v.Pos, OpConst64, t)
15634 v2.AuxInt = int64ToAuxInt(d << e)
15635 v.AddArg2(v0, v2)
15636 return true
15637 }
15638 break
15639 }
15640 return false
15641 }
15642 func rewriteValuegeneric_OpLsh64x8(v *Value) bool {
15643 v_1 := v.Args[1]
15644 v_0 := v.Args[0]
15645 b := v.Block
15646
15647
15648 for {
15649 t := v.Type
15650 x := v_0
15651 if v_1.Op != OpConst8 {
15652 break
15653 }
15654 c := auxIntToInt8(v_1.AuxInt)
15655 v.reset(OpLsh64x64)
15656 v0 := b.NewValue0(v.Pos, OpConst64, t)
15657 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
15658 v.AddArg2(x, v0)
15659 return true
15660 }
15661
15662
15663 for {
15664 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
15665 break
15666 }
15667 v.reset(OpConst64)
15668 v.AuxInt = int64ToAuxInt(0)
15669 return true
15670 }
15671 return false
15672 }
15673 func rewriteValuegeneric_OpLsh8x16(v *Value) bool {
15674 v_1 := v.Args[1]
15675 v_0 := v.Args[0]
15676 b := v.Block
15677
15678
15679 for {
15680 t := v.Type
15681 x := v_0
15682 if v_1.Op != OpConst16 {
15683 break
15684 }
15685 c := auxIntToInt16(v_1.AuxInt)
15686 v.reset(OpLsh8x64)
15687 v0 := b.NewValue0(v.Pos, OpConst64, t)
15688 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
15689 v.AddArg2(x, v0)
15690 return true
15691 }
15692
15693
15694 for {
15695 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
15696 break
15697 }
15698 v.reset(OpConst8)
15699 v.AuxInt = int8ToAuxInt(0)
15700 return true
15701 }
15702 return false
15703 }
15704 func rewriteValuegeneric_OpLsh8x32(v *Value) bool {
15705 v_1 := v.Args[1]
15706 v_0 := v.Args[0]
15707 b := v.Block
15708
15709
15710 for {
15711 t := v.Type
15712 x := v_0
15713 if v_1.Op != OpConst32 {
15714 break
15715 }
15716 c := auxIntToInt32(v_1.AuxInt)
15717 v.reset(OpLsh8x64)
15718 v0 := b.NewValue0(v.Pos, OpConst64, t)
15719 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
15720 v.AddArg2(x, v0)
15721 return true
15722 }
15723
15724
15725 for {
15726 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
15727 break
15728 }
15729 v.reset(OpConst8)
15730 v.AuxInt = int8ToAuxInt(0)
15731 return true
15732 }
15733 return false
15734 }
15735 func rewriteValuegeneric_OpLsh8x64(v *Value) bool {
15736 v_1 := v.Args[1]
15737 v_0 := v.Args[0]
15738 b := v.Block
15739 typ := &b.Func.Config.Types
15740
15741
15742 for {
15743 if v_0.Op != OpConst8 {
15744 break
15745 }
15746 c := auxIntToInt8(v_0.AuxInt)
15747 if v_1.Op != OpConst64 {
15748 break
15749 }
15750 d := auxIntToInt64(v_1.AuxInt)
15751 v.reset(OpConst8)
15752 v.AuxInt = int8ToAuxInt(c << uint64(d))
15753 return true
15754 }
15755
15756
15757 for {
15758 x := v_0
15759 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
15760 break
15761 }
15762 v.copyOf(x)
15763 return true
15764 }
15765
15766
15767 for {
15768 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
15769 break
15770 }
15771 v.reset(OpConst8)
15772 v.AuxInt = int8ToAuxInt(0)
15773 return true
15774 }
15775
15776
15777
15778 for {
15779 if v_1.Op != OpConst64 {
15780 break
15781 }
15782 c := auxIntToInt64(v_1.AuxInt)
15783 if !(uint64(c) >= 8) {
15784 break
15785 }
15786 v.reset(OpConst8)
15787 v.AuxInt = int8ToAuxInt(0)
15788 return true
15789 }
15790
15791
15792
15793 for {
15794 t := v.Type
15795 if v_0.Op != OpLsh8x64 {
15796 break
15797 }
15798 _ = v_0.Args[1]
15799 x := v_0.Args[0]
15800 v_0_1 := v_0.Args[1]
15801 if v_0_1.Op != OpConst64 {
15802 break
15803 }
15804 c := auxIntToInt64(v_0_1.AuxInt)
15805 if v_1.Op != OpConst64 {
15806 break
15807 }
15808 d := auxIntToInt64(v_1.AuxInt)
15809 if !(!uaddOvf(c, d)) {
15810 break
15811 }
15812 v.reset(OpLsh8x64)
15813 v0 := b.NewValue0(v.Pos, OpConst64, t)
15814 v0.AuxInt = int64ToAuxInt(c + d)
15815 v.AddArg2(x, v0)
15816 return true
15817 }
15818
15819
15820
15821 for {
15822 i := v_0
15823 if i.Op != OpRsh8x64 {
15824 break
15825 }
15826 _ = i.Args[1]
15827 x := i.Args[0]
15828 i_1 := i.Args[1]
15829 if i_1.Op != OpConst64 {
15830 break
15831 }
15832 c := auxIntToInt64(i_1.AuxInt)
15833 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
15834 break
15835 }
15836 v.reset(OpAnd8)
15837 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
15838 v0.AuxInt = int8ToAuxInt(int8(-1) << c)
15839 v.AddArg2(x, v0)
15840 return true
15841 }
15842
15843
15844
15845 for {
15846 i := v_0
15847 if i.Op != OpRsh8Ux64 {
15848 break
15849 }
15850 _ = i.Args[1]
15851 x := i.Args[0]
15852 i_1 := i.Args[1]
15853 if i_1.Op != OpConst64 {
15854 break
15855 }
15856 c := auxIntToInt64(i_1.AuxInt)
15857 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
15858 break
15859 }
15860 v.reset(OpAnd8)
15861 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
15862 v0.AuxInt = int8ToAuxInt(int8(-1) << c)
15863 v.AddArg2(x, v0)
15864 return true
15865 }
15866
15867
15868
15869 for {
15870 if v_0.Op != OpRsh8Ux64 {
15871 break
15872 }
15873 _ = v_0.Args[1]
15874 v_0_0 := v_0.Args[0]
15875 if v_0_0.Op != OpLsh8x64 {
15876 break
15877 }
15878 _ = v_0_0.Args[1]
15879 x := v_0_0.Args[0]
15880 v_0_0_1 := v_0_0.Args[1]
15881 if v_0_0_1.Op != OpConst64 {
15882 break
15883 }
15884 c1 := auxIntToInt64(v_0_0_1.AuxInt)
15885 v_0_1 := v_0.Args[1]
15886 if v_0_1.Op != OpConst64 {
15887 break
15888 }
15889 c2 := auxIntToInt64(v_0_1.AuxInt)
15890 if v_1.Op != OpConst64 {
15891 break
15892 }
15893 c3 := auxIntToInt64(v_1.AuxInt)
15894 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
15895 break
15896 }
15897 v.reset(OpLsh8x64)
15898 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
15899 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
15900 v.AddArg2(x, v0)
15901 return true
15902 }
15903
15904
15905
15906 for {
15907 if v_0.Op != OpAnd8 {
15908 break
15909 }
15910 _ = v_0.Args[1]
15911 v_0_0 := v_0.Args[0]
15912 v_0_1 := v_0.Args[1]
15913 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15914 if v_0_0.Op != OpRsh8x64 {
15915 continue
15916 }
15917 t := v_0_0.Type
15918 _ = v_0_0.Args[1]
15919 x := v_0_0.Args[0]
15920 v_0_0_1 := v_0_0.Args[1]
15921 if v_0_0_1.Op != OpConst64 {
15922 continue
15923 }
15924 t2 := v_0_0_1.Type
15925 c := auxIntToInt64(v_0_0_1.AuxInt)
15926 if v_0_1.Op != OpConst8 {
15927 continue
15928 }
15929 d := auxIntToInt8(v_0_1.AuxInt)
15930 if v_1.Op != OpConst64 {
15931 continue
15932 }
15933 e := auxIntToInt64(v_1.AuxInt)
15934 if !(c >= e) {
15935 continue
15936 }
15937 v.reset(OpAnd8)
15938 v0 := b.NewValue0(v.Pos, OpRsh8x64, t)
15939 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15940 v1.AuxInt = int64ToAuxInt(c - e)
15941 v0.AddArg2(x, v1)
15942 v2 := b.NewValue0(v.Pos, OpConst8, t)
15943 v2.AuxInt = int8ToAuxInt(d << e)
15944 v.AddArg2(v0, v2)
15945 return true
15946 }
15947 break
15948 }
15949
15950
15951
15952 for {
15953 if v_0.Op != OpAnd8 {
15954 break
15955 }
15956 _ = v_0.Args[1]
15957 v_0_0 := v_0.Args[0]
15958 v_0_1 := v_0.Args[1]
15959 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15960 if v_0_0.Op != OpRsh8Ux64 {
15961 continue
15962 }
15963 t := v_0_0.Type
15964 _ = v_0_0.Args[1]
15965 x := v_0_0.Args[0]
15966 v_0_0_1 := v_0_0.Args[1]
15967 if v_0_0_1.Op != OpConst64 {
15968 continue
15969 }
15970 t2 := v_0_0_1.Type
15971 c := auxIntToInt64(v_0_0_1.AuxInt)
15972 if v_0_1.Op != OpConst8 {
15973 continue
15974 }
15975 d := auxIntToInt8(v_0_1.AuxInt)
15976 if v_1.Op != OpConst64 {
15977 continue
15978 }
15979 e := auxIntToInt64(v_1.AuxInt)
15980 if !(c >= e) {
15981 continue
15982 }
15983 v.reset(OpAnd8)
15984 v0 := b.NewValue0(v.Pos, OpRsh8Ux64, t)
15985 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15986 v1.AuxInt = int64ToAuxInt(c - e)
15987 v0.AddArg2(x, v1)
15988 v2 := b.NewValue0(v.Pos, OpConst8, t)
15989 v2.AuxInt = int8ToAuxInt(d << e)
15990 v.AddArg2(v0, v2)
15991 return true
15992 }
15993 break
15994 }
15995
15996
15997
15998 for {
15999 if v_0.Op != OpAnd8 {
16000 break
16001 }
16002 _ = v_0.Args[1]
16003 v_0_0 := v_0.Args[0]
16004 v_0_1 := v_0.Args[1]
16005 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
16006 if v_0_0.Op != OpRsh8x64 {
16007 continue
16008 }
16009 t := v_0_0.Type
16010 _ = v_0_0.Args[1]
16011 x := v_0_0.Args[0]
16012 v_0_0_1 := v_0_0.Args[1]
16013 if v_0_0_1.Op != OpConst64 {
16014 continue
16015 }
16016 t2 := v_0_0_1.Type
16017 c := auxIntToInt64(v_0_0_1.AuxInt)
16018 if v_0_1.Op != OpConst8 {
16019 continue
16020 }
16021 d := auxIntToInt8(v_0_1.AuxInt)
16022 if v_1.Op != OpConst64 {
16023 continue
16024 }
16025 e := auxIntToInt64(v_1.AuxInt)
16026 if !(c < e) {
16027 continue
16028 }
16029 v.reset(OpAnd8)
16030 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
16031 v1 := b.NewValue0(v.Pos, OpConst64, t2)
16032 v1.AuxInt = int64ToAuxInt(e - c)
16033 v0.AddArg2(x, v1)
16034 v2 := b.NewValue0(v.Pos, OpConst8, t)
16035 v2.AuxInt = int8ToAuxInt(d << e)
16036 v.AddArg2(v0, v2)
16037 return true
16038 }
16039 break
16040 }
16041
16042
16043
16044 for {
16045 if v_0.Op != OpAnd8 {
16046 break
16047 }
16048 _ = v_0.Args[1]
16049 v_0_0 := v_0.Args[0]
16050 v_0_1 := v_0.Args[1]
16051 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
16052 if v_0_0.Op != OpRsh8Ux64 {
16053 continue
16054 }
16055 t := v_0_0.Type
16056 _ = v_0_0.Args[1]
16057 x := v_0_0.Args[0]
16058 v_0_0_1 := v_0_0.Args[1]
16059 if v_0_0_1.Op != OpConst64 {
16060 continue
16061 }
16062 t2 := v_0_0_1.Type
16063 c := auxIntToInt64(v_0_0_1.AuxInt)
16064 if v_0_1.Op != OpConst8 {
16065 continue
16066 }
16067 d := auxIntToInt8(v_0_1.AuxInt)
16068 if v_1.Op != OpConst64 {
16069 continue
16070 }
16071 e := auxIntToInt64(v_1.AuxInt)
16072 if !(c < e) {
16073 continue
16074 }
16075 v.reset(OpAnd8)
16076 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
16077 v1 := b.NewValue0(v.Pos, OpConst64, t2)
16078 v1.AuxInt = int64ToAuxInt(e - c)
16079 v0.AddArg2(x, v1)
16080 v2 := b.NewValue0(v.Pos, OpConst8, t)
16081 v2.AuxInt = int8ToAuxInt(d << e)
16082 v.AddArg2(v0, v2)
16083 return true
16084 }
16085 break
16086 }
16087 return false
16088 }
16089 func rewriteValuegeneric_OpLsh8x8(v *Value) bool {
16090 v_1 := v.Args[1]
16091 v_0 := v.Args[0]
16092 b := v.Block
16093
16094
16095 for {
16096 t := v.Type
16097 x := v_0
16098 if v_1.Op != OpConst8 {
16099 break
16100 }
16101 c := auxIntToInt8(v_1.AuxInt)
16102 v.reset(OpLsh8x64)
16103 v0 := b.NewValue0(v.Pos, OpConst64, t)
16104 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
16105 v.AddArg2(x, v0)
16106 return true
16107 }
16108
16109
16110 for {
16111 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
16112 break
16113 }
16114 v.reset(OpConst8)
16115 v.AuxInt = int8ToAuxInt(0)
16116 return true
16117 }
16118 return false
16119 }
16120 func rewriteValuegeneric_OpMod16(v *Value) bool {
16121 v_1 := v.Args[1]
16122 v_0 := v.Args[0]
16123 b := v.Block
16124
16125
16126
16127 for {
16128 if v_0.Op != OpConst16 {
16129 break
16130 }
16131 c := auxIntToInt16(v_0.AuxInt)
16132 if v_1.Op != OpConst16 {
16133 break
16134 }
16135 d := auxIntToInt16(v_1.AuxInt)
16136 if !(d != 0) {
16137 break
16138 }
16139 v.reset(OpConst16)
16140 v.AuxInt = int16ToAuxInt(c % d)
16141 return true
16142 }
16143
16144
16145
16146 for {
16147 t := v.Type
16148 n := v_0
16149 if v_1.Op != OpConst16 {
16150 break
16151 }
16152 c := auxIntToInt16(v_1.AuxInt)
16153 if !(isNonNegative(n) && isPowerOfTwo(c)) {
16154 break
16155 }
16156 v.reset(OpAnd16)
16157 v0 := b.NewValue0(v.Pos, OpConst16, t)
16158 v0.AuxInt = int16ToAuxInt(c - 1)
16159 v.AddArg2(n, v0)
16160 return true
16161 }
16162
16163
16164
16165 for {
16166 t := v.Type
16167 n := v_0
16168 if v_1.Op != OpConst16 {
16169 break
16170 }
16171 c := auxIntToInt16(v_1.AuxInt)
16172 if !(c < 0 && c != -1<<15) {
16173 break
16174 }
16175 v.reset(OpMod16)
16176 v.Type = t
16177 v0 := b.NewValue0(v.Pos, OpConst16, t)
16178 v0.AuxInt = int16ToAuxInt(-c)
16179 v.AddArg2(n, v0)
16180 return true
16181 }
16182
16183
16184
16185 for {
16186 t := v.Type
16187 x := v_0
16188 if v_1.Op != OpConst16 {
16189 break
16190 }
16191 c := auxIntToInt16(v_1.AuxInt)
16192 if !(x.Op != OpConst16 && (c > 0 || c == -1<<15)) {
16193 break
16194 }
16195 v.reset(OpSub16)
16196 v0 := b.NewValue0(v.Pos, OpMul16, t)
16197 v1 := b.NewValue0(v.Pos, OpDiv16, t)
16198 v2 := b.NewValue0(v.Pos, OpConst16, t)
16199 v2.AuxInt = int16ToAuxInt(c)
16200 v1.AddArg2(x, v2)
16201 v0.AddArg2(v1, v2)
16202 v.AddArg2(x, v0)
16203 return true
16204 }
16205 return false
16206 }
16207 func rewriteValuegeneric_OpMod16u(v *Value) bool {
16208 v_1 := v.Args[1]
16209 v_0 := v.Args[0]
16210 b := v.Block
16211
16212
16213
16214 for {
16215 if v_0.Op != OpConst16 {
16216 break
16217 }
16218 c := auxIntToInt16(v_0.AuxInt)
16219 if v_1.Op != OpConst16 {
16220 break
16221 }
16222 d := auxIntToInt16(v_1.AuxInt)
16223 if !(d != 0) {
16224 break
16225 }
16226 v.reset(OpConst16)
16227 v.AuxInt = int16ToAuxInt(int16(uint16(c) % uint16(d)))
16228 return true
16229 }
16230
16231
16232
16233 for {
16234 t := v.Type
16235 n := v_0
16236 if v_1.Op != OpConst16 {
16237 break
16238 }
16239 c := auxIntToInt16(v_1.AuxInt)
16240 if !(isPowerOfTwo(c)) {
16241 break
16242 }
16243 v.reset(OpAnd16)
16244 v0 := b.NewValue0(v.Pos, OpConst16, t)
16245 v0.AuxInt = int16ToAuxInt(c - 1)
16246 v.AddArg2(n, v0)
16247 return true
16248 }
16249
16250
16251
16252 for {
16253 t := v.Type
16254 x := v_0
16255 if v_1.Op != OpConst16 {
16256 break
16257 }
16258 c := auxIntToInt16(v_1.AuxInt)
16259 if !(x.Op != OpConst16 && c > 0 && umagicOK16(c)) {
16260 break
16261 }
16262 v.reset(OpSub16)
16263 v0 := b.NewValue0(v.Pos, OpMul16, t)
16264 v1 := b.NewValue0(v.Pos, OpDiv16u, t)
16265 v2 := b.NewValue0(v.Pos, OpConst16, t)
16266 v2.AuxInt = int16ToAuxInt(c)
16267 v1.AddArg2(x, v2)
16268 v0.AddArg2(v1, v2)
16269 v.AddArg2(x, v0)
16270 return true
16271 }
16272 return false
16273 }
16274 func rewriteValuegeneric_OpMod32(v *Value) bool {
16275 v_1 := v.Args[1]
16276 v_0 := v.Args[0]
16277 b := v.Block
16278
16279
16280
16281 for {
16282 if v_0.Op != OpConst32 {
16283 break
16284 }
16285 c := auxIntToInt32(v_0.AuxInt)
16286 if v_1.Op != OpConst32 {
16287 break
16288 }
16289 d := auxIntToInt32(v_1.AuxInt)
16290 if !(d != 0) {
16291 break
16292 }
16293 v.reset(OpConst32)
16294 v.AuxInt = int32ToAuxInt(c % d)
16295 return true
16296 }
16297
16298
16299
16300 for {
16301 t := v.Type
16302 n := v_0
16303 if v_1.Op != OpConst32 {
16304 break
16305 }
16306 c := auxIntToInt32(v_1.AuxInt)
16307 if !(isNonNegative(n) && isPowerOfTwo(c)) {
16308 break
16309 }
16310 v.reset(OpAnd32)
16311 v0 := b.NewValue0(v.Pos, OpConst32, t)
16312 v0.AuxInt = int32ToAuxInt(c - 1)
16313 v.AddArg2(n, v0)
16314 return true
16315 }
16316
16317
16318
16319 for {
16320 t := v.Type
16321 n := v_0
16322 if v_1.Op != OpConst32 {
16323 break
16324 }
16325 c := auxIntToInt32(v_1.AuxInt)
16326 if !(c < 0 && c != -1<<31) {
16327 break
16328 }
16329 v.reset(OpMod32)
16330 v.Type = t
16331 v0 := b.NewValue0(v.Pos, OpConst32, t)
16332 v0.AuxInt = int32ToAuxInt(-c)
16333 v.AddArg2(n, v0)
16334 return true
16335 }
16336
16337
16338
16339 for {
16340 t := v.Type
16341 x := v_0
16342 if v_1.Op != OpConst32 {
16343 break
16344 }
16345 c := auxIntToInt32(v_1.AuxInt)
16346 if !(x.Op != OpConst32 && (c > 0 || c == -1<<31)) {
16347 break
16348 }
16349 v.reset(OpSub32)
16350 v0 := b.NewValue0(v.Pos, OpMul32, t)
16351 v1 := b.NewValue0(v.Pos, OpDiv32, t)
16352 v2 := b.NewValue0(v.Pos, OpConst32, t)
16353 v2.AuxInt = int32ToAuxInt(c)
16354 v1.AddArg2(x, v2)
16355 v0.AddArg2(v1, v2)
16356 v.AddArg2(x, v0)
16357 return true
16358 }
16359 return false
16360 }
16361 func rewriteValuegeneric_OpMod32u(v *Value) bool {
16362 v_1 := v.Args[1]
16363 v_0 := v.Args[0]
16364 b := v.Block
16365
16366
16367
16368 for {
16369 if v_0.Op != OpConst32 {
16370 break
16371 }
16372 c := auxIntToInt32(v_0.AuxInt)
16373 if v_1.Op != OpConst32 {
16374 break
16375 }
16376 d := auxIntToInt32(v_1.AuxInt)
16377 if !(d != 0) {
16378 break
16379 }
16380 v.reset(OpConst32)
16381 v.AuxInt = int32ToAuxInt(int32(uint32(c) % uint32(d)))
16382 return true
16383 }
16384
16385
16386
16387 for {
16388 t := v.Type
16389 n := v_0
16390 if v_1.Op != OpConst32 {
16391 break
16392 }
16393 c := auxIntToInt32(v_1.AuxInt)
16394 if !(isPowerOfTwo(c)) {
16395 break
16396 }
16397 v.reset(OpAnd32)
16398 v0 := b.NewValue0(v.Pos, OpConst32, t)
16399 v0.AuxInt = int32ToAuxInt(c - 1)
16400 v.AddArg2(n, v0)
16401 return true
16402 }
16403
16404
16405
16406 for {
16407 t := v.Type
16408 x := v_0
16409 if v_1.Op != OpConst32 {
16410 break
16411 }
16412 c := auxIntToInt32(v_1.AuxInt)
16413 if !(x.Op != OpConst32 && c > 0 && umagicOK32(c)) {
16414 break
16415 }
16416 v.reset(OpSub32)
16417 v0 := b.NewValue0(v.Pos, OpMul32, t)
16418 v1 := b.NewValue0(v.Pos, OpDiv32u, t)
16419 v2 := b.NewValue0(v.Pos, OpConst32, t)
16420 v2.AuxInt = int32ToAuxInt(c)
16421 v1.AddArg2(x, v2)
16422 v0.AddArg2(v1, v2)
16423 v.AddArg2(x, v0)
16424 return true
16425 }
16426 return false
16427 }
16428 func rewriteValuegeneric_OpMod64(v *Value) bool {
16429 v_1 := v.Args[1]
16430 v_0 := v.Args[0]
16431 b := v.Block
16432
16433
16434
16435 for {
16436 if v_0.Op != OpConst64 {
16437 break
16438 }
16439 c := auxIntToInt64(v_0.AuxInt)
16440 if v_1.Op != OpConst64 {
16441 break
16442 }
16443 d := auxIntToInt64(v_1.AuxInt)
16444 if !(d != 0) {
16445 break
16446 }
16447 v.reset(OpConst64)
16448 v.AuxInt = int64ToAuxInt(c % d)
16449 return true
16450 }
16451
16452
16453
16454 for {
16455 t := v.Type
16456 n := v_0
16457 if v_1.Op != OpConst64 {
16458 break
16459 }
16460 c := auxIntToInt64(v_1.AuxInt)
16461 if !(isNonNegative(n) && isPowerOfTwo(c)) {
16462 break
16463 }
16464 v.reset(OpAnd64)
16465 v0 := b.NewValue0(v.Pos, OpConst64, t)
16466 v0.AuxInt = int64ToAuxInt(c - 1)
16467 v.AddArg2(n, v0)
16468 return true
16469 }
16470
16471
16472
16473 for {
16474 n := v_0
16475 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 || !(isNonNegative(n)) {
16476 break
16477 }
16478 v.copyOf(n)
16479 return true
16480 }
16481
16482
16483
16484 for {
16485 t := v.Type
16486 n := v_0
16487 if v_1.Op != OpConst64 {
16488 break
16489 }
16490 c := auxIntToInt64(v_1.AuxInt)
16491 if !(c < 0 && c != -1<<63) {
16492 break
16493 }
16494 v.reset(OpMod64)
16495 v.Type = t
16496 v0 := b.NewValue0(v.Pos, OpConst64, t)
16497 v0.AuxInt = int64ToAuxInt(-c)
16498 v.AddArg2(n, v0)
16499 return true
16500 }
16501
16502
16503
16504 for {
16505 t := v.Type
16506 x := v_0
16507 if v_1.Op != OpConst64 {
16508 break
16509 }
16510 c := auxIntToInt64(v_1.AuxInt)
16511 if !(x.Op != OpConst64 && (c > 0 || c == -1<<63)) {
16512 break
16513 }
16514 v.reset(OpSub64)
16515 v0 := b.NewValue0(v.Pos, OpMul64, t)
16516 v1 := b.NewValue0(v.Pos, OpDiv64, t)
16517 v2 := b.NewValue0(v.Pos, OpConst64, t)
16518 v2.AuxInt = int64ToAuxInt(c)
16519 v1.AddArg2(x, v2)
16520 v0.AddArg2(v1, v2)
16521 v.AddArg2(x, v0)
16522 return true
16523 }
16524 return false
16525 }
16526 func rewriteValuegeneric_OpMod64u(v *Value) bool {
16527 v_1 := v.Args[1]
16528 v_0 := v.Args[0]
16529 b := v.Block
16530
16531
16532
16533 for {
16534 if v_0.Op != OpConst64 {
16535 break
16536 }
16537 c := auxIntToInt64(v_0.AuxInt)
16538 if v_1.Op != OpConst64 {
16539 break
16540 }
16541 d := auxIntToInt64(v_1.AuxInt)
16542 if !(d != 0) {
16543 break
16544 }
16545 v.reset(OpConst64)
16546 v.AuxInt = int64ToAuxInt(int64(uint64(c) % uint64(d)))
16547 return true
16548 }
16549
16550
16551
16552 for {
16553 t := v.Type
16554 n := v_0
16555 if v_1.Op != OpConst64 {
16556 break
16557 }
16558 c := auxIntToInt64(v_1.AuxInt)
16559 if !(isPowerOfTwo(c)) {
16560 break
16561 }
16562 v.reset(OpAnd64)
16563 v0 := b.NewValue0(v.Pos, OpConst64, t)
16564 v0.AuxInt = int64ToAuxInt(c - 1)
16565 v.AddArg2(n, v0)
16566 return true
16567 }
16568
16569
16570 for {
16571 t := v.Type
16572 n := v_0
16573 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 {
16574 break
16575 }
16576 v.reset(OpAnd64)
16577 v0 := b.NewValue0(v.Pos, OpConst64, t)
16578 v0.AuxInt = int64ToAuxInt(1<<63 - 1)
16579 v.AddArg2(n, v0)
16580 return true
16581 }
16582
16583
16584
16585 for {
16586 t := v.Type
16587 x := v_0
16588 if v_1.Op != OpConst64 {
16589 break
16590 }
16591 c := auxIntToInt64(v_1.AuxInt)
16592 if !(x.Op != OpConst64 && c > 0 && umagicOK64(c)) {
16593 break
16594 }
16595 v.reset(OpSub64)
16596 v0 := b.NewValue0(v.Pos, OpMul64, t)
16597 v1 := b.NewValue0(v.Pos, OpDiv64u, t)
16598 v2 := b.NewValue0(v.Pos, OpConst64, t)
16599 v2.AuxInt = int64ToAuxInt(c)
16600 v1.AddArg2(x, v2)
16601 v0.AddArg2(v1, v2)
16602 v.AddArg2(x, v0)
16603 return true
16604 }
16605 return false
16606 }
16607 func rewriteValuegeneric_OpMod8(v *Value) bool {
16608 v_1 := v.Args[1]
16609 v_0 := v.Args[0]
16610 b := v.Block
16611
16612
16613
16614 for {
16615 if v_0.Op != OpConst8 {
16616 break
16617 }
16618 c := auxIntToInt8(v_0.AuxInt)
16619 if v_1.Op != OpConst8 {
16620 break
16621 }
16622 d := auxIntToInt8(v_1.AuxInt)
16623 if !(d != 0) {
16624 break
16625 }
16626 v.reset(OpConst8)
16627 v.AuxInt = int8ToAuxInt(c % d)
16628 return true
16629 }
16630
16631
16632
16633 for {
16634 t := v.Type
16635 n := v_0
16636 if v_1.Op != OpConst8 {
16637 break
16638 }
16639 c := auxIntToInt8(v_1.AuxInt)
16640 if !(isNonNegative(n) && isPowerOfTwo(c)) {
16641 break
16642 }
16643 v.reset(OpAnd8)
16644 v0 := b.NewValue0(v.Pos, OpConst8, t)
16645 v0.AuxInt = int8ToAuxInt(c - 1)
16646 v.AddArg2(n, v0)
16647 return true
16648 }
16649
16650
16651
16652 for {
16653 t := v.Type
16654 n := v_0
16655 if v_1.Op != OpConst8 {
16656 break
16657 }
16658 c := auxIntToInt8(v_1.AuxInt)
16659 if !(c < 0 && c != -1<<7) {
16660 break
16661 }
16662 v.reset(OpMod8)
16663 v.Type = t
16664 v0 := b.NewValue0(v.Pos, OpConst8, t)
16665 v0.AuxInt = int8ToAuxInt(-c)
16666 v.AddArg2(n, v0)
16667 return true
16668 }
16669
16670
16671
16672 for {
16673 t := v.Type
16674 x := v_0
16675 if v_1.Op != OpConst8 {
16676 break
16677 }
16678 c := auxIntToInt8(v_1.AuxInt)
16679 if !(x.Op != OpConst8 && (c > 0 || c == -1<<7)) {
16680 break
16681 }
16682 v.reset(OpSub8)
16683 v0 := b.NewValue0(v.Pos, OpMul8, t)
16684 v1 := b.NewValue0(v.Pos, OpDiv8, t)
16685 v2 := b.NewValue0(v.Pos, OpConst8, t)
16686 v2.AuxInt = int8ToAuxInt(c)
16687 v1.AddArg2(x, v2)
16688 v0.AddArg2(v1, v2)
16689 v.AddArg2(x, v0)
16690 return true
16691 }
16692 return false
16693 }
16694 func rewriteValuegeneric_OpMod8u(v *Value) bool {
16695 v_1 := v.Args[1]
16696 v_0 := v.Args[0]
16697 b := v.Block
16698
16699
16700
16701 for {
16702 if v_0.Op != OpConst8 {
16703 break
16704 }
16705 c := auxIntToInt8(v_0.AuxInt)
16706 if v_1.Op != OpConst8 {
16707 break
16708 }
16709 d := auxIntToInt8(v_1.AuxInt)
16710 if !(d != 0) {
16711 break
16712 }
16713 v.reset(OpConst8)
16714 v.AuxInt = int8ToAuxInt(int8(uint8(c) % uint8(d)))
16715 return true
16716 }
16717
16718
16719
16720 for {
16721 t := v.Type
16722 n := v_0
16723 if v_1.Op != OpConst8 {
16724 break
16725 }
16726 c := auxIntToInt8(v_1.AuxInt)
16727 if !(isPowerOfTwo(c)) {
16728 break
16729 }
16730 v.reset(OpAnd8)
16731 v0 := b.NewValue0(v.Pos, OpConst8, t)
16732 v0.AuxInt = int8ToAuxInt(c - 1)
16733 v.AddArg2(n, v0)
16734 return true
16735 }
16736
16737
16738
16739 for {
16740 t := v.Type
16741 x := v_0
16742 if v_1.Op != OpConst8 {
16743 break
16744 }
16745 c := auxIntToInt8(v_1.AuxInt)
16746 if !(x.Op != OpConst8 && c > 0 && umagicOK8(c)) {
16747 break
16748 }
16749 v.reset(OpSub8)
16750 v0 := b.NewValue0(v.Pos, OpMul8, t)
16751 v1 := b.NewValue0(v.Pos, OpDiv8u, t)
16752 v2 := b.NewValue0(v.Pos, OpConst8, t)
16753 v2.AuxInt = int8ToAuxInt(c)
16754 v1.AddArg2(x, v2)
16755 v0.AddArg2(v1, v2)
16756 v.AddArg2(x, v0)
16757 return true
16758 }
16759 return false
16760 }
16761 func rewriteValuegeneric_OpMove(v *Value) bool {
16762 v_2 := v.Args[2]
16763 v_1 := v.Args[1]
16764 v_0 := v.Args[0]
16765 b := v.Block
16766 config := b.Func.Config
16767
16768
16769
16770 for {
16771 n := auxIntToInt64(v.AuxInt)
16772 t := auxToType(v.Aux)
16773 dst1 := v_0
16774 src := v_1
16775 mem := v_2
16776 if mem.Op != OpZero || auxIntToInt64(mem.AuxInt) != n || auxToType(mem.Aux) != t {
16777 break
16778 }
16779 dst2 := mem.Args[0]
16780 if !(isSamePtr(src, dst2)) {
16781 break
16782 }
16783 v.reset(OpZero)
16784 v.AuxInt = int64ToAuxInt(n)
16785 v.Aux = typeToAux(t)
16786 v.AddArg2(dst1, mem)
16787 return true
16788 }
16789
16790
16791
16792 for {
16793 n := auxIntToInt64(v.AuxInt)
16794 t := auxToType(v.Aux)
16795 dst1 := v_0
16796 src := v_1
16797 mem := v_2
16798 if mem.Op != OpVarDef {
16799 break
16800 }
16801 mem_0 := mem.Args[0]
16802 if mem_0.Op != OpZero || auxIntToInt64(mem_0.AuxInt) != n || auxToType(mem_0.Aux) != t {
16803 break
16804 }
16805 dst0 := mem_0.Args[0]
16806 if !(isSamePtr(src, dst0)) {
16807 break
16808 }
16809 v.reset(OpZero)
16810 v.AuxInt = int64ToAuxInt(n)
16811 v.Aux = typeToAux(t)
16812 v.AddArg2(dst1, mem)
16813 return true
16814 }
16815
16816
16817
16818 for {
16819 n := auxIntToInt64(v.AuxInt)
16820 t := auxToType(v.Aux)
16821 dst := v_0
16822 if v_1.Op != OpAddr {
16823 break
16824 }
16825 sym := auxToSym(v_1.Aux)
16826 v_1_0 := v_1.Args[0]
16827 if v_1_0.Op != OpSB {
16828 break
16829 }
16830 mem := v_2
16831 if !(symIsROZero(sym)) {
16832 break
16833 }
16834 v.reset(OpZero)
16835 v.AuxInt = int64ToAuxInt(n)
16836 v.Aux = typeToAux(t)
16837 v.AddArg2(dst, mem)
16838 return true
16839 }
16840
16841
16842
16843 for {
16844 n := auxIntToInt64(v.AuxInt)
16845 t1 := auxToType(v.Aux)
16846 dst1 := v_0
16847 src1 := v_1
16848 store := v_2
16849 if store.Op != OpStore {
16850 break
16851 }
16852 t2 := auxToType(store.Aux)
16853 mem := store.Args[2]
16854 op := store.Args[0]
16855 if op.Op != OpOffPtr {
16856 break
16857 }
16858 o2 := auxIntToInt64(op.AuxInt)
16859 dst2 := op.Args[0]
16860 if !(isSamePtr(dst1, dst2) && store.Uses == 1 && n >= o2+t2.Size() && disjoint(src1, n, op, t2.Size()) && clobber(store)) {
16861 break
16862 }
16863 v.reset(OpMove)
16864 v.AuxInt = int64ToAuxInt(n)
16865 v.Aux = typeToAux(t1)
16866 v.AddArg3(dst1, src1, mem)
16867 return true
16868 }
16869
16870
16871
16872 for {
16873 n := auxIntToInt64(v.AuxInt)
16874 t := auxToType(v.Aux)
16875 dst1 := v_0
16876 src1 := v_1
16877 move := v_2
16878 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
16879 break
16880 }
16881 mem := move.Args[2]
16882 dst2 := move.Args[0]
16883 if !(move.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move)) {
16884 break
16885 }
16886 v.reset(OpMove)
16887 v.AuxInt = int64ToAuxInt(n)
16888 v.Aux = typeToAux(t)
16889 v.AddArg3(dst1, src1, mem)
16890 return true
16891 }
16892
16893
16894
16895 for {
16896 n := auxIntToInt64(v.AuxInt)
16897 t := auxToType(v.Aux)
16898 dst1 := v_0
16899 src1 := v_1
16900 vardef := v_2
16901 if vardef.Op != OpVarDef {
16902 break
16903 }
16904 x := auxToSym(vardef.Aux)
16905 move := vardef.Args[0]
16906 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
16907 break
16908 }
16909 mem := move.Args[2]
16910 dst2 := move.Args[0]
16911 if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move, vardef)) {
16912 break
16913 }
16914 v.reset(OpMove)
16915 v.AuxInt = int64ToAuxInt(n)
16916 v.Aux = typeToAux(t)
16917 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
16918 v0.Aux = symToAux(x)
16919 v0.AddArg(mem)
16920 v.AddArg3(dst1, src1, v0)
16921 return true
16922 }
16923
16924
16925
16926 for {
16927 n := auxIntToInt64(v.AuxInt)
16928 t := auxToType(v.Aux)
16929 dst1 := v_0
16930 src1 := v_1
16931 zero := v_2
16932 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != n || auxToType(zero.Aux) != t {
16933 break
16934 }
16935 mem := zero.Args[1]
16936 dst2 := zero.Args[0]
16937 if !(zero.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero)) {
16938 break
16939 }
16940 v.reset(OpMove)
16941 v.AuxInt = int64ToAuxInt(n)
16942 v.Aux = typeToAux(t)
16943 v.AddArg3(dst1, src1, mem)
16944 return true
16945 }
16946
16947
16948
16949 for {
16950 n := auxIntToInt64(v.AuxInt)
16951 t := auxToType(v.Aux)
16952 dst1 := v_0
16953 src1 := v_1
16954 vardef := v_2
16955 if vardef.Op != OpVarDef {
16956 break
16957 }
16958 x := auxToSym(vardef.Aux)
16959 zero := vardef.Args[0]
16960 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != n || auxToType(zero.Aux) != t {
16961 break
16962 }
16963 mem := zero.Args[1]
16964 dst2 := zero.Args[0]
16965 if !(zero.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero, vardef)) {
16966 break
16967 }
16968 v.reset(OpMove)
16969 v.AuxInt = int64ToAuxInt(n)
16970 v.Aux = typeToAux(t)
16971 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
16972 v0.Aux = symToAux(x)
16973 v0.AddArg(mem)
16974 v.AddArg3(dst1, src1, v0)
16975 return true
16976 }
16977
16978
16979
16980 for {
16981 n := auxIntToInt64(v.AuxInt)
16982 t1 := auxToType(v.Aux)
16983 dst := v_0
16984 p1 := v_1
16985 mem := v_2
16986 if mem.Op != OpStore {
16987 break
16988 }
16989 t2 := auxToType(mem.Aux)
16990 _ = mem.Args[2]
16991 op2 := mem.Args[0]
16992 if op2.Op != OpOffPtr {
16993 break
16994 }
16995 tt2 := op2.Type
16996 o2 := auxIntToInt64(op2.AuxInt)
16997 p2 := op2.Args[0]
16998 d1 := mem.Args[1]
16999 mem_2 := mem.Args[2]
17000 if mem_2.Op != OpStore {
17001 break
17002 }
17003 t3 := auxToType(mem_2.Aux)
17004 d2 := mem_2.Args[1]
17005 op3 := mem_2.Args[0]
17006 if op3.Op != OpOffPtr {
17007 break
17008 }
17009 tt3 := op3.Type
17010 if auxIntToInt64(op3.AuxInt) != 0 {
17011 break
17012 }
17013 p3 := op3.Args[0]
17014 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && registerizable(b, t2) && registerizable(b, t3) && o2 == t3.Size() && n == t2.Size()+t3.Size()) {
17015 break
17016 }
17017 v.reset(OpStore)
17018 v.Aux = typeToAux(t2)
17019 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17020 v0.AuxInt = int64ToAuxInt(o2)
17021 v0.AddArg(dst)
17022 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17023 v1.Aux = typeToAux(t3)
17024 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17025 v2.AuxInt = int64ToAuxInt(0)
17026 v2.AddArg(dst)
17027 v1.AddArg3(v2, d2, mem)
17028 v.AddArg3(v0, d1, v1)
17029 return true
17030 }
17031
17032
17033
17034 for {
17035 n := auxIntToInt64(v.AuxInt)
17036 t1 := auxToType(v.Aux)
17037 dst := v_0
17038 p1 := v_1
17039 mem := v_2
17040 if mem.Op != OpStore {
17041 break
17042 }
17043 t2 := auxToType(mem.Aux)
17044 _ = mem.Args[2]
17045 op2 := mem.Args[0]
17046 if op2.Op != OpOffPtr {
17047 break
17048 }
17049 tt2 := op2.Type
17050 o2 := auxIntToInt64(op2.AuxInt)
17051 p2 := op2.Args[0]
17052 d1 := mem.Args[1]
17053 mem_2 := mem.Args[2]
17054 if mem_2.Op != OpStore {
17055 break
17056 }
17057 t3 := auxToType(mem_2.Aux)
17058 _ = mem_2.Args[2]
17059 op3 := mem_2.Args[0]
17060 if op3.Op != OpOffPtr {
17061 break
17062 }
17063 tt3 := op3.Type
17064 o3 := auxIntToInt64(op3.AuxInt)
17065 p3 := op3.Args[0]
17066 d2 := mem_2.Args[1]
17067 mem_2_2 := mem_2.Args[2]
17068 if mem_2_2.Op != OpStore {
17069 break
17070 }
17071 t4 := auxToType(mem_2_2.Aux)
17072 d3 := mem_2_2.Args[1]
17073 op4 := mem_2_2.Args[0]
17074 if op4.Op != OpOffPtr {
17075 break
17076 }
17077 tt4 := op4.Type
17078 if auxIntToInt64(op4.AuxInt) != 0 {
17079 break
17080 }
17081 p4 := op4.Args[0]
17082 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && t4.Alignment() <= t1.Alignment() && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && o3 == t4.Size() && o2-o3 == t3.Size() && n == t2.Size()+t3.Size()+t4.Size()) {
17083 break
17084 }
17085 v.reset(OpStore)
17086 v.Aux = typeToAux(t2)
17087 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17088 v0.AuxInt = int64ToAuxInt(o2)
17089 v0.AddArg(dst)
17090 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17091 v1.Aux = typeToAux(t3)
17092 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17093 v2.AuxInt = int64ToAuxInt(o3)
17094 v2.AddArg(dst)
17095 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17096 v3.Aux = typeToAux(t4)
17097 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17098 v4.AuxInt = int64ToAuxInt(0)
17099 v4.AddArg(dst)
17100 v3.AddArg3(v4, d3, mem)
17101 v1.AddArg3(v2, d2, v3)
17102 v.AddArg3(v0, d1, v1)
17103 return true
17104 }
17105
17106
17107
17108 for {
17109 n := auxIntToInt64(v.AuxInt)
17110 t1 := auxToType(v.Aux)
17111 dst := v_0
17112 p1 := v_1
17113 mem := v_2
17114 if mem.Op != OpStore {
17115 break
17116 }
17117 t2 := auxToType(mem.Aux)
17118 _ = mem.Args[2]
17119 op2 := mem.Args[0]
17120 if op2.Op != OpOffPtr {
17121 break
17122 }
17123 tt2 := op2.Type
17124 o2 := auxIntToInt64(op2.AuxInt)
17125 p2 := op2.Args[0]
17126 d1 := mem.Args[1]
17127 mem_2 := mem.Args[2]
17128 if mem_2.Op != OpStore {
17129 break
17130 }
17131 t3 := auxToType(mem_2.Aux)
17132 _ = mem_2.Args[2]
17133 op3 := mem_2.Args[0]
17134 if op3.Op != OpOffPtr {
17135 break
17136 }
17137 tt3 := op3.Type
17138 o3 := auxIntToInt64(op3.AuxInt)
17139 p3 := op3.Args[0]
17140 d2 := mem_2.Args[1]
17141 mem_2_2 := mem_2.Args[2]
17142 if mem_2_2.Op != OpStore {
17143 break
17144 }
17145 t4 := auxToType(mem_2_2.Aux)
17146 _ = mem_2_2.Args[2]
17147 op4 := mem_2_2.Args[0]
17148 if op4.Op != OpOffPtr {
17149 break
17150 }
17151 tt4 := op4.Type
17152 o4 := auxIntToInt64(op4.AuxInt)
17153 p4 := op4.Args[0]
17154 d3 := mem_2_2.Args[1]
17155 mem_2_2_2 := mem_2_2.Args[2]
17156 if mem_2_2_2.Op != OpStore {
17157 break
17158 }
17159 t5 := auxToType(mem_2_2_2.Aux)
17160 d4 := mem_2_2_2.Args[1]
17161 op5 := mem_2_2_2.Args[0]
17162 if op5.Op != OpOffPtr {
17163 break
17164 }
17165 tt5 := op5.Type
17166 if auxIntToInt64(op5.AuxInt) != 0 {
17167 break
17168 }
17169 p5 := op5.Args[0]
17170 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && t4.Alignment() <= t1.Alignment() && t5.Alignment() <= t1.Alignment() && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && o4 == t5.Size() && o3-o4 == t4.Size() && o2-o3 == t3.Size() && n == t2.Size()+t3.Size()+t4.Size()+t5.Size()) {
17171 break
17172 }
17173 v.reset(OpStore)
17174 v.Aux = typeToAux(t2)
17175 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17176 v0.AuxInt = int64ToAuxInt(o2)
17177 v0.AddArg(dst)
17178 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17179 v1.Aux = typeToAux(t3)
17180 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17181 v2.AuxInt = int64ToAuxInt(o3)
17182 v2.AddArg(dst)
17183 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17184 v3.Aux = typeToAux(t4)
17185 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17186 v4.AuxInt = int64ToAuxInt(o4)
17187 v4.AddArg(dst)
17188 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17189 v5.Aux = typeToAux(t5)
17190 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
17191 v6.AuxInt = int64ToAuxInt(0)
17192 v6.AddArg(dst)
17193 v5.AddArg3(v6, d4, mem)
17194 v3.AddArg3(v4, d3, v5)
17195 v1.AddArg3(v2, d2, v3)
17196 v.AddArg3(v0, d1, v1)
17197 return true
17198 }
17199
17200
17201
17202 for {
17203 n := auxIntToInt64(v.AuxInt)
17204 t1 := auxToType(v.Aux)
17205 dst := v_0
17206 p1 := v_1
17207 mem := v_2
17208 if mem.Op != OpVarDef {
17209 break
17210 }
17211 mem_0 := mem.Args[0]
17212 if mem_0.Op != OpStore {
17213 break
17214 }
17215 t2 := auxToType(mem_0.Aux)
17216 _ = mem_0.Args[2]
17217 op2 := mem_0.Args[0]
17218 if op2.Op != OpOffPtr {
17219 break
17220 }
17221 tt2 := op2.Type
17222 o2 := auxIntToInt64(op2.AuxInt)
17223 p2 := op2.Args[0]
17224 d1 := mem_0.Args[1]
17225 mem_0_2 := mem_0.Args[2]
17226 if mem_0_2.Op != OpStore {
17227 break
17228 }
17229 t3 := auxToType(mem_0_2.Aux)
17230 d2 := mem_0_2.Args[1]
17231 op3 := mem_0_2.Args[0]
17232 if op3.Op != OpOffPtr {
17233 break
17234 }
17235 tt3 := op3.Type
17236 if auxIntToInt64(op3.AuxInt) != 0 {
17237 break
17238 }
17239 p3 := op3.Args[0]
17240 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && registerizable(b, t2) && registerizable(b, t3) && o2 == t3.Size() && n == t2.Size()+t3.Size()) {
17241 break
17242 }
17243 v.reset(OpStore)
17244 v.Aux = typeToAux(t2)
17245 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17246 v0.AuxInt = int64ToAuxInt(o2)
17247 v0.AddArg(dst)
17248 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17249 v1.Aux = typeToAux(t3)
17250 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17251 v2.AuxInt = int64ToAuxInt(0)
17252 v2.AddArg(dst)
17253 v1.AddArg3(v2, d2, mem)
17254 v.AddArg3(v0, d1, v1)
17255 return true
17256 }
17257
17258
17259
17260 for {
17261 n := auxIntToInt64(v.AuxInt)
17262 t1 := auxToType(v.Aux)
17263 dst := v_0
17264 p1 := v_1
17265 mem := v_2
17266 if mem.Op != OpVarDef {
17267 break
17268 }
17269 mem_0 := mem.Args[0]
17270 if mem_0.Op != OpStore {
17271 break
17272 }
17273 t2 := auxToType(mem_0.Aux)
17274 _ = mem_0.Args[2]
17275 op2 := mem_0.Args[0]
17276 if op2.Op != OpOffPtr {
17277 break
17278 }
17279 tt2 := op2.Type
17280 o2 := auxIntToInt64(op2.AuxInt)
17281 p2 := op2.Args[0]
17282 d1 := mem_0.Args[1]
17283 mem_0_2 := mem_0.Args[2]
17284 if mem_0_2.Op != OpStore {
17285 break
17286 }
17287 t3 := auxToType(mem_0_2.Aux)
17288 _ = mem_0_2.Args[2]
17289 op3 := mem_0_2.Args[0]
17290 if op3.Op != OpOffPtr {
17291 break
17292 }
17293 tt3 := op3.Type
17294 o3 := auxIntToInt64(op3.AuxInt)
17295 p3 := op3.Args[0]
17296 d2 := mem_0_2.Args[1]
17297 mem_0_2_2 := mem_0_2.Args[2]
17298 if mem_0_2_2.Op != OpStore {
17299 break
17300 }
17301 t4 := auxToType(mem_0_2_2.Aux)
17302 d3 := mem_0_2_2.Args[1]
17303 op4 := mem_0_2_2.Args[0]
17304 if op4.Op != OpOffPtr {
17305 break
17306 }
17307 tt4 := op4.Type
17308 if auxIntToInt64(op4.AuxInt) != 0 {
17309 break
17310 }
17311 p4 := op4.Args[0]
17312 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && t4.Alignment() <= t1.Alignment() && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && o3 == t4.Size() && o2-o3 == t3.Size() && n == t2.Size()+t3.Size()+t4.Size()) {
17313 break
17314 }
17315 v.reset(OpStore)
17316 v.Aux = typeToAux(t2)
17317 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17318 v0.AuxInt = int64ToAuxInt(o2)
17319 v0.AddArg(dst)
17320 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17321 v1.Aux = typeToAux(t3)
17322 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17323 v2.AuxInt = int64ToAuxInt(o3)
17324 v2.AddArg(dst)
17325 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17326 v3.Aux = typeToAux(t4)
17327 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17328 v4.AuxInt = int64ToAuxInt(0)
17329 v4.AddArg(dst)
17330 v3.AddArg3(v4, d3, mem)
17331 v1.AddArg3(v2, d2, v3)
17332 v.AddArg3(v0, d1, v1)
17333 return true
17334 }
17335
17336
17337
17338 for {
17339 n := auxIntToInt64(v.AuxInt)
17340 t1 := auxToType(v.Aux)
17341 dst := v_0
17342 p1 := v_1
17343 mem := v_2
17344 if mem.Op != OpVarDef {
17345 break
17346 }
17347 mem_0 := mem.Args[0]
17348 if mem_0.Op != OpStore {
17349 break
17350 }
17351 t2 := auxToType(mem_0.Aux)
17352 _ = mem_0.Args[2]
17353 op2 := mem_0.Args[0]
17354 if op2.Op != OpOffPtr {
17355 break
17356 }
17357 tt2 := op2.Type
17358 o2 := auxIntToInt64(op2.AuxInt)
17359 p2 := op2.Args[0]
17360 d1 := mem_0.Args[1]
17361 mem_0_2 := mem_0.Args[2]
17362 if mem_0_2.Op != OpStore {
17363 break
17364 }
17365 t3 := auxToType(mem_0_2.Aux)
17366 _ = mem_0_2.Args[2]
17367 op3 := mem_0_2.Args[0]
17368 if op3.Op != OpOffPtr {
17369 break
17370 }
17371 tt3 := op3.Type
17372 o3 := auxIntToInt64(op3.AuxInt)
17373 p3 := op3.Args[0]
17374 d2 := mem_0_2.Args[1]
17375 mem_0_2_2 := mem_0_2.Args[2]
17376 if mem_0_2_2.Op != OpStore {
17377 break
17378 }
17379 t4 := auxToType(mem_0_2_2.Aux)
17380 _ = mem_0_2_2.Args[2]
17381 op4 := mem_0_2_2.Args[0]
17382 if op4.Op != OpOffPtr {
17383 break
17384 }
17385 tt4 := op4.Type
17386 o4 := auxIntToInt64(op4.AuxInt)
17387 p4 := op4.Args[0]
17388 d3 := mem_0_2_2.Args[1]
17389 mem_0_2_2_2 := mem_0_2_2.Args[2]
17390 if mem_0_2_2_2.Op != OpStore {
17391 break
17392 }
17393 t5 := auxToType(mem_0_2_2_2.Aux)
17394 d4 := mem_0_2_2_2.Args[1]
17395 op5 := mem_0_2_2_2.Args[0]
17396 if op5.Op != OpOffPtr {
17397 break
17398 }
17399 tt5 := op5.Type
17400 if auxIntToInt64(op5.AuxInt) != 0 {
17401 break
17402 }
17403 p5 := op5.Args[0]
17404 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && t4.Alignment() <= t1.Alignment() && t5.Alignment() <= t1.Alignment() && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && o4 == t5.Size() && o3-o4 == t4.Size() && o2-o3 == t3.Size() && n == t2.Size()+t3.Size()+t4.Size()+t5.Size()) {
17405 break
17406 }
17407 v.reset(OpStore)
17408 v.Aux = typeToAux(t2)
17409 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17410 v0.AuxInt = int64ToAuxInt(o2)
17411 v0.AddArg(dst)
17412 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17413 v1.Aux = typeToAux(t3)
17414 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17415 v2.AuxInt = int64ToAuxInt(o3)
17416 v2.AddArg(dst)
17417 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17418 v3.Aux = typeToAux(t4)
17419 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17420 v4.AuxInt = int64ToAuxInt(o4)
17421 v4.AddArg(dst)
17422 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17423 v5.Aux = typeToAux(t5)
17424 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
17425 v6.AuxInt = int64ToAuxInt(0)
17426 v6.AddArg(dst)
17427 v5.AddArg3(v6, d4, mem)
17428 v3.AddArg3(v4, d3, v5)
17429 v1.AddArg3(v2, d2, v3)
17430 v.AddArg3(v0, d1, v1)
17431 return true
17432 }
17433
17434
17435
17436 for {
17437 n := auxIntToInt64(v.AuxInt)
17438 t1 := auxToType(v.Aux)
17439 dst := v_0
17440 p1 := v_1
17441 mem := v_2
17442 if mem.Op != OpStore {
17443 break
17444 }
17445 t2 := auxToType(mem.Aux)
17446 _ = mem.Args[2]
17447 op2 := mem.Args[0]
17448 if op2.Op != OpOffPtr {
17449 break
17450 }
17451 tt2 := op2.Type
17452 o2 := auxIntToInt64(op2.AuxInt)
17453 p2 := op2.Args[0]
17454 d1 := mem.Args[1]
17455 mem_2 := mem.Args[2]
17456 if mem_2.Op != OpZero || auxIntToInt64(mem_2.AuxInt) != n {
17457 break
17458 }
17459 t3 := auxToType(mem_2.Aux)
17460 p3 := mem_2.Args[0]
17461 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && registerizable(b, t2) && n >= o2+t2.Size()) {
17462 break
17463 }
17464 v.reset(OpStore)
17465 v.Aux = typeToAux(t2)
17466 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17467 v0.AuxInt = int64ToAuxInt(o2)
17468 v0.AddArg(dst)
17469 v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17470 v1.AuxInt = int64ToAuxInt(n)
17471 v1.Aux = typeToAux(t1)
17472 v1.AddArg2(dst, mem)
17473 v.AddArg3(v0, d1, v1)
17474 return true
17475 }
17476
17477
17478
17479 for {
17480 n := auxIntToInt64(v.AuxInt)
17481 t1 := auxToType(v.Aux)
17482 dst := v_0
17483 p1 := v_1
17484 mem := v_2
17485 if mem.Op != OpStore {
17486 break
17487 }
17488 t2 := auxToType(mem.Aux)
17489 _ = mem.Args[2]
17490 mem_0 := mem.Args[0]
17491 if mem_0.Op != OpOffPtr {
17492 break
17493 }
17494 tt2 := mem_0.Type
17495 o2 := auxIntToInt64(mem_0.AuxInt)
17496 p2 := mem_0.Args[0]
17497 d1 := mem.Args[1]
17498 mem_2 := mem.Args[2]
17499 if mem_2.Op != OpStore {
17500 break
17501 }
17502 t3 := auxToType(mem_2.Aux)
17503 _ = mem_2.Args[2]
17504 mem_2_0 := mem_2.Args[0]
17505 if mem_2_0.Op != OpOffPtr {
17506 break
17507 }
17508 tt3 := mem_2_0.Type
17509 o3 := auxIntToInt64(mem_2_0.AuxInt)
17510 p3 := mem_2_0.Args[0]
17511 d2 := mem_2.Args[1]
17512 mem_2_2 := mem_2.Args[2]
17513 if mem_2_2.Op != OpZero || auxIntToInt64(mem_2_2.AuxInt) != n {
17514 break
17515 }
17516 t4 := auxToType(mem_2_2.Aux)
17517 p4 := mem_2_2.Args[0]
17518 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && t4.Alignment() <= t1.Alignment() && registerizable(b, t2) && registerizable(b, t3) && n >= o2+t2.Size() && n >= o3+t3.Size()) {
17519 break
17520 }
17521 v.reset(OpStore)
17522 v.Aux = typeToAux(t2)
17523 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17524 v0.AuxInt = int64ToAuxInt(o2)
17525 v0.AddArg(dst)
17526 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17527 v1.Aux = typeToAux(t3)
17528 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17529 v2.AuxInt = int64ToAuxInt(o3)
17530 v2.AddArg(dst)
17531 v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17532 v3.AuxInt = int64ToAuxInt(n)
17533 v3.Aux = typeToAux(t1)
17534 v3.AddArg2(dst, mem)
17535 v1.AddArg3(v2, d2, v3)
17536 v.AddArg3(v0, d1, v1)
17537 return true
17538 }
17539
17540
17541
17542 for {
17543 n := auxIntToInt64(v.AuxInt)
17544 t1 := auxToType(v.Aux)
17545 dst := v_0
17546 p1 := v_1
17547 mem := v_2
17548 if mem.Op != OpStore {
17549 break
17550 }
17551 t2 := auxToType(mem.Aux)
17552 _ = mem.Args[2]
17553 mem_0 := mem.Args[0]
17554 if mem_0.Op != OpOffPtr {
17555 break
17556 }
17557 tt2 := mem_0.Type
17558 o2 := auxIntToInt64(mem_0.AuxInt)
17559 p2 := mem_0.Args[0]
17560 d1 := mem.Args[1]
17561 mem_2 := mem.Args[2]
17562 if mem_2.Op != OpStore {
17563 break
17564 }
17565 t3 := auxToType(mem_2.Aux)
17566 _ = mem_2.Args[2]
17567 mem_2_0 := mem_2.Args[0]
17568 if mem_2_0.Op != OpOffPtr {
17569 break
17570 }
17571 tt3 := mem_2_0.Type
17572 o3 := auxIntToInt64(mem_2_0.AuxInt)
17573 p3 := mem_2_0.Args[0]
17574 d2 := mem_2.Args[1]
17575 mem_2_2 := mem_2.Args[2]
17576 if mem_2_2.Op != OpStore {
17577 break
17578 }
17579 t4 := auxToType(mem_2_2.Aux)
17580 _ = mem_2_2.Args[2]
17581 mem_2_2_0 := mem_2_2.Args[0]
17582 if mem_2_2_0.Op != OpOffPtr {
17583 break
17584 }
17585 tt4 := mem_2_2_0.Type
17586 o4 := auxIntToInt64(mem_2_2_0.AuxInt)
17587 p4 := mem_2_2_0.Args[0]
17588 d3 := mem_2_2.Args[1]
17589 mem_2_2_2 := mem_2_2.Args[2]
17590 if mem_2_2_2.Op != OpZero || auxIntToInt64(mem_2_2_2.AuxInt) != n {
17591 break
17592 }
17593 t5 := auxToType(mem_2_2_2.Aux)
17594 p5 := mem_2_2_2.Args[0]
17595 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && t4.Alignment() <= t1.Alignment() && t5.Alignment() <= t1.Alignment() && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && n >= o2+t2.Size() && n >= o3+t3.Size() && n >= o4+t4.Size()) {
17596 break
17597 }
17598 v.reset(OpStore)
17599 v.Aux = typeToAux(t2)
17600 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17601 v0.AuxInt = int64ToAuxInt(o2)
17602 v0.AddArg(dst)
17603 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17604 v1.Aux = typeToAux(t3)
17605 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17606 v2.AuxInt = int64ToAuxInt(o3)
17607 v2.AddArg(dst)
17608 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17609 v3.Aux = typeToAux(t4)
17610 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17611 v4.AuxInt = int64ToAuxInt(o4)
17612 v4.AddArg(dst)
17613 v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17614 v5.AuxInt = int64ToAuxInt(n)
17615 v5.Aux = typeToAux(t1)
17616 v5.AddArg2(dst, mem)
17617 v3.AddArg3(v4, d3, v5)
17618 v1.AddArg3(v2, d2, v3)
17619 v.AddArg3(v0, d1, v1)
17620 return true
17621 }
17622
17623
17624
17625 for {
17626 n := auxIntToInt64(v.AuxInt)
17627 t1 := auxToType(v.Aux)
17628 dst := v_0
17629 p1 := v_1
17630 mem := v_2
17631 if mem.Op != OpStore {
17632 break
17633 }
17634 t2 := auxToType(mem.Aux)
17635 _ = mem.Args[2]
17636 mem_0 := mem.Args[0]
17637 if mem_0.Op != OpOffPtr {
17638 break
17639 }
17640 tt2 := mem_0.Type
17641 o2 := auxIntToInt64(mem_0.AuxInt)
17642 p2 := mem_0.Args[0]
17643 d1 := mem.Args[1]
17644 mem_2 := mem.Args[2]
17645 if mem_2.Op != OpStore {
17646 break
17647 }
17648 t3 := auxToType(mem_2.Aux)
17649 _ = mem_2.Args[2]
17650 mem_2_0 := mem_2.Args[0]
17651 if mem_2_0.Op != OpOffPtr {
17652 break
17653 }
17654 tt3 := mem_2_0.Type
17655 o3 := auxIntToInt64(mem_2_0.AuxInt)
17656 p3 := mem_2_0.Args[0]
17657 d2 := mem_2.Args[1]
17658 mem_2_2 := mem_2.Args[2]
17659 if mem_2_2.Op != OpStore {
17660 break
17661 }
17662 t4 := auxToType(mem_2_2.Aux)
17663 _ = mem_2_2.Args[2]
17664 mem_2_2_0 := mem_2_2.Args[0]
17665 if mem_2_2_0.Op != OpOffPtr {
17666 break
17667 }
17668 tt4 := mem_2_2_0.Type
17669 o4 := auxIntToInt64(mem_2_2_0.AuxInt)
17670 p4 := mem_2_2_0.Args[0]
17671 d3 := mem_2_2.Args[1]
17672 mem_2_2_2 := mem_2_2.Args[2]
17673 if mem_2_2_2.Op != OpStore {
17674 break
17675 }
17676 t5 := auxToType(mem_2_2_2.Aux)
17677 _ = mem_2_2_2.Args[2]
17678 mem_2_2_2_0 := mem_2_2_2.Args[0]
17679 if mem_2_2_2_0.Op != OpOffPtr {
17680 break
17681 }
17682 tt5 := mem_2_2_2_0.Type
17683 o5 := auxIntToInt64(mem_2_2_2_0.AuxInt)
17684 p5 := mem_2_2_2_0.Args[0]
17685 d4 := mem_2_2_2.Args[1]
17686 mem_2_2_2_2 := mem_2_2_2.Args[2]
17687 if mem_2_2_2_2.Op != OpZero || auxIntToInt64(mem_2_2_2_2.AuxInt) != n {
17688 break
17689 }
17690 t6 := auxToType(mem_2_2_2_2.Aux)
17691 p6 := mem_2_2_2_2.Args[0]
17692 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && isSamePtr(p5, p6) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && t4.Alignment() <= t1.Alignment() && t5.Alignment() <= t1.Alignment() && t6.Alignment() <= t1.Alignment() && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && n >= o2+t2.Size() && n >= o3+t3.Size() && n >= o4+t4.Size() && n >= o5+t5.Size()) {
17693 break
17694 }
17695 v.reset(OpStore)
17696 v.Aux = typeToAux(t2)
17697 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17698 v0.AuxInt = int64ToAuxInt(o2)
17699 v0.AddArg(dst)
17700 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17701 v1.Aux = typeToAux(t3)
17702 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17703 v2.AuxInt = int64ToAuxInt(o3)
17704 v2.AddArg(dst)
17705 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17706 v3.Aux = typeToAux(t4)
17707 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17708 v4.AuxInt = int64ToAuxInt(o4)
17709 v4.AddArg(dst)
17710 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17711 v5.Aux = typeToAux(t5)
17712 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
17713 v6.AuxInt = int64ToAuxInt(o5)
17714 v6.AddArg(dst)
17715 v7 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17716 v7.AuxInt = int64ToAuxInt(n)
17717 v7.Aux = typeToAux(t1)
17718 v7.AddArg2(dst, mem)
17719 v5.AddArg3(v6, d4, v7)
17720 v3.AddArg3(v4, d3, v5)
17721 v1.AddArg3(v2, d2, v3)
17722 v.AddArg3(v0, d1, v1)
17723 return true
17724 }
17725
17726
17727
17728 for {
17729 n := auxIntToInt64(v.AuxInt)
17730 t1 := auxToType(v.Aux)
17731 dst := v_0
17732 p1 := v_1
17733 mem := v_2
17734 if mem.Op != OpVarDef {
17735 break
17736 }
17737 mem_0 := mem.Args[0]
17738 if mem_0.Op != OpStore {
17739 break
17740 }
17741 t2 := auxToType(mem_0.Aux)
17742 _ = mem_0.Args[2]
17743 op2 := mem_0.Args[0]
17744 if op2.Op != OpOffPtr {
17745 break
17746 }
17747 tt2 := op2.Type
17748 o2 := auxIntToInt64(op2.AuxInt)
17749 p2 := op2.Args[0]
17750 d1 := mem_0.Args[1]
17751 mem_0_2 := mem_0.Args[2]
17752 if mem_0_2.Op != OpZero || auxIntToInt64(mem_0_2.AuxInt) != n {
17753 break
17754 }
17755 t3 := auxToType(mem_0_2.Aux)
17756 p3 := mem_0_2.Args[0]
17757 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && registerizable(b, t2) && n >= o2+t2.Size()) {
17758 break
17759 }
17760 v.reset(OpStore)
17761 v.Aux = typeToAux(t2)
17762 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17763 v0.AuxInt = int64ToAuxInt(o2)
17764 v0.AddArg(dst)
17765 v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17766 v1.AuxInt = int64ToAuxInt(n)
17767 v1.Aux = typeToAux(t1)
17768 v1.AddArg2(dst, mem)
17769 v.AddArg3(v0, d1, v1)
17770 return true
17771 }
17772
17773
17774
17775 for {
17776 n := auxIntToInt64(v.AuxInt)
17777 t1 := auxToType(v.Aux)
17778 dst := v_0
17779 p1 := v_1
17780 mem := v_2
17781 if mem.Op != OpVarDef {
17782 break
17783 }
17784 mem_0 := mem.Args[0]
17785 if mem_0.Op != OpStore {
17786 break
17787 }
17788 t2 := auxToType(mem_0.Aux)
17789 _ = mem_0.Args[2]
17790 mem_0_0 := mem_0.Args[0]
17791 if mem_0_0.Op != OpOffPtr {
17792 break
17793 }
17794 tt2 := mem_0_0.Type
17795 o2 := auxIntToInt64(mem_0_0.AuxInt)
17796 p2 := mem_0_0.Args[0]
17797 d1 := mem_0.Args[1]
17798 mem_0_2 := mem_0.Args[2]
17799 if mem_0_2.Op != OpStore {
17800 break
17801 }
17802 t3 := auxToType(mem_0_2.Aux)
17803 _ = mem_0_2.Args[2]
17804 mem_0_2_0 := mem_0_2.Args[0]
17805 if mem_0_2_0.Op != OpOffPtr {
17806 break
17807 }
17808 tt3 := mem_0_2_0.Type
17809 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
17810 p3 := mem_0_2_0.Args[0]
17811 d2 := mem_0_2.Args[1]
17812 mem_0_2_2 := mem_0_2.Args[2]
17813 if mem_0_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2.AuxInt) != n {
17814 break
17815 }
17816 t4 := auxToType(mem_0_2_2.Aux)
17817 p4 := mem_0_2_2.Args[0]
17818 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && t4.Alignment() <= t1.Alignment() && registerizable(b, t2) && registerizable(b, t3) && n >= o2+t2.Size() && n >= o3+t3.Size()) {
17819 break
17820 }
17821 v.reset(OpStore)
17822 v.Aux = typeToAux(t2)
17823 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17824 v0.AuxInt = int64ToAuxInt(o2)
17825 v0.AddArg(dst)
17826 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17827 v1.Aux = typeToAux(t3)
17828 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17829 v2.AuxInt = int64ToAuxInt(o3)
17830 v2.AddArg(dst)
17831 v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17832 v3.AuxInt = int64ToAuxInt(n)
17833 v3.Aux = typeToAux(t1)
17834 v3.AddArg2(dst, mem)
17835 v1.AddArg3(v2, d2, v3)
17836 v.AddArg3(v0, d1, v1)
17837 return true
17838 }
17839
17840
17841
17842 for {
17843 n := auxIntToInt64(v.AuxInt)
17844 t1 := auxToType(v.Aux)
17845 dst := v_0
17846 p1 := v_1
17847 mem := v_2
17848 if mem.Op != OpVarDef {
17849 break
17850 }
17851 mem_0 := mem.Args[0]
17852 if mem_0.Op != OpStore {
17853 break
17854 }
17855 t2 := auxToType(mem_0.Aux)
17856 _ = mem_0.Args[2]
17857 mem_0_0 := mem_0.Args[0]
17858 if mem_0_0.Op != OpOffPtr {
17859 break
17860 }
17861 tt2 := mem_0_0.Type
17862 o2 := auxIntToInt64(mem_0_0.AuxInt)
17863 p2 := mem_0_0.Args[0]
17864 d1 := mem_0.Args[1]
17865 mem_0_2 := mem_0.Args[2]
17866 if mem_0_2.Op != OpStore {
17867 break
17868 }
17869 t3 := auxToType(mem_0_2.Aux)
17870 _ = mem_0_2.Args[2]
17871 mem_0_2_0 := mem_0_2.Args[0]
17872 if mem_0_2_0.Op != OpOffPtr {
17873 break
17874 }
17875 tt3 := mem_0_2_0.Type
17876 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
17877 p3 := mem_0_2_0.Args[0]
17878 d2 := mem_0_2.Args[1]
17879 mem_0_2_2 := mem_0_2.Args[2]
17880 if mem_0_2_2.Op != OpStore {
17881 break
17882 }
17883 t4 := auxToType(mem_0_2_2.Aux)
17884 _ = mem_0_2_2.Args[2]
17885 mem_0_2_2_0 := mem_0_2_2.Args[0]
17886 if mem_0_2_2_0.Op != OpOffPtr {
17887 break
17888 }
17889 tt4 := mem_0_2_2_0.Type
17890 o4 := auxIntToInt64(mem_0_2_2_0.AuxInt)
17891 p4 := mem_0_2_2_0.Args[0]
17892 d3 := mem_0_2_2.Args[1]
17893 mem_0_2_2_2 := mem_0_2_2.Args[2]
17894 if mem_0_2_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2_2.AuxInt) != n {
17895 break
17896 }
17897 t5 := auxToType(mem_0_2_2_2.Aux)
17898 p5 := mem_0_2_2_2.Args[0]
17899 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && t4.Alignment() <= t1.Alignment() && t5.Alignment() <= t1.Alignment() && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && n >= o2+t2.Size() && n >= o3+t3.Size() && n >= o4+t4.Size()) {
17900 break
17901 }
17902 v.reset(OpStore)
17903 v.Aux = typeToAux(t2)
17904 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17905 v0.AuxInt = int64ToAuxInt(o2)
17906 v0.AddArg(dst)
17907 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17908 v1.Aux = typeToAux(t3)
17909 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17910 v2.AuxInt = int64ToAuxInt(o3)
17911 v2.AddArg(dst)
17912 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17913 v3.Aux = typeToAux(t4)
17914 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17915 v4.AuxInt = int64ToAuxInt(o4)
17916 v4.AddArg(dst)
17917 v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17918 v5.AuxInt = int64ToAuxInt(n)
17919 v5.Aux = typeToAux(t1)
17920 v5.AddArg2(dst, mem)
17921 v3.AddArg3(v4, d3, v5)
17922 v1.AddArg3(v2, d2, v3)
17923 v.AddArg3(v0, d1, v1)
17924 return true
17925 }
17926
17927
17928
17929 for {
17930 n := auxIntToInt64(v.AuxInt)
17931 t1 := auxToType(v.Aux)
17932 dst := v_0
17933 p1 := v_1
17934 mem := v_2
17935 if mem.Op != OpVarDef {
17936 break
17937 }
17938 mem_0 := mem.Args[0]
17939 if mem_0.Op != OpStore {
17940 break
17941 }
17942 t2 := auxToType(mem_0.Aux)
17943 _ = mem_0.Args[2]
17944 mem_0_0 := mem_0.Args[0]
17945 if mem_0_0.Op != OpOffPtr {
17946 break
17947 }
17948 tt2 := mem_0_0.Type
17949 o2 := auxIntToInt64(mem_0_0.AuxInt)
17950 p2 := mem_0_0.Args[0]
17951 d1 := mem_0.Args[1]
17952 mem_0_2 := mem_0.Args[2]
17953 if mem_0_2.Op != OpStore {
17954 break
17955 }
17956 t3 := auxToType(mem_0_2.Aux)
17957 _ = mem_0_2.Args[2]
17958 mem_0_2_0 := mem_0_2.Args[0]
17959 if mem_0_2_0.Op != OpOffPtr {
17960 break
17961 }
17962 tt3 := mem_0_2_0.Type
17963 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
17964 p3 := mem_0_2_0.Args[0]
17965 d2 := mem_0_2.Args[1]
17966 mem_0_2_2 := mem_0_2.Args[2]
17967 if mem_0_2_2.Op != OpStore {
17968 break
17969 }
17970 t4 := auxToType(mem_0_2_2.Aux)
17971 _ = mem_0_2_2.Args[2]
17972 mem_0_2_2_0 := mem_0_2_2.Args[0]
17973 if mem_0_2_2_0.Op != OpOffPtr {
17974 break
17975 }
17976 tt4 := mem_0_2_2_0.Type
17977 o4 := auxIntToInt64(mem_0_2_2_0.AuxInt)
17978 p4 := mem_0_2_2_0.Args[0]
17979 d3 := mem_0_2_2.Args[1]
17980 mem_0_2_2_2 := mem_0_2_2.Args[2]
17981 if mem_0_2_2_2.Op != OpStore {
17982 break
17983 }
17984 t5 := auxToType(mem_0_2_2_2.Aux)
17985 _ = mem_0_2_2_2.Args[2]
17986 mem_0_2_2_2_0 := mem_0_2_2_2.Args[0]
17987 if mem_0_2_2_2_0.Op != OpOffPtr {
17988 break
17989 }
17990 tt5 := mem_0_2_2_2_0.Type
17991 o5 := auxIntToInt64(mem_0_2_2_2_0.AuxInt)
17992 p5 := mem_0_2_2_2_0.Args[0]
17993 d4 := mem_0_2_2_2.Args[1]
17994 mem_0_2_2_2_2 := mem_0_2_2_2.Args[2]
17995 if mem_0_2_2_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2_2_2.AuxInt) != n {
17996 break
17997 }
17998 t6 := auxToType(mem_0_2_2_2_2.Aux)
17999 p6 := mem_0_2_2_2_2.Args[0]
18000 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && isSamePtr(p5, p6) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && t4.Alignment() <= t1.Alignment() && t5.Alignment() <= t1.Alignment() && t6.Alignment() <= t1.Alignment() && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && n >= o2+t2.Size() && n >= o3+t3.Size() && n >= o4+t4.Size() && n >= o5+t5.Size()) {
18001 break
18002 }
18003 v.reset(OpStore)
18004 v.Aux = typeToAux(t2)
18005 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
18006 v0.AuxInt = int64ToAuxInt(o2)
18007 v0.AddArg(dst)
18008 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18009 v1.Aux = typeToAux(t3)
18010 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
18011 v2.AuxInt = int64ToAuxInt(o3)
18012 v2.AddArg(dst)
18013 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18014 v3.Aux = typeToAux(t4)
18015 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
18016 v4.AuxInt = int64ToAuxInt(o4)
18017 v4.AddArg(dst)
18018 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18019 v5.Aux = typeToAux(t5)
18020 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
18021 v6.AuxInt = int64ToAuxInt(o5)
18022 v6.AddArg(dst)
18023 v7 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
18024 v7.AuxInt = int64ToAuxInt(n)
18025 v7.Aux = typeToAux(t1)
18026 v7.AddArg2(dst, mem)
18027 v5.AddArg3(v6, d4, v7)
18028 v3.AddArg3(v4, d3, v5)
18029 v1.AddArg3(v2, d2, v3)
18030 v.AddArg3(v0, d1, v1)
18031 return true
18032 }
18033
18034
18035
18036 for {
18037 s := auxIntToInt64(v.AuxInt)
18038 t1 := auxToType(v.Aux)
18039 dst := v_0
18040 tmp1 := v_1
18041 midmem := v_2
18042 if midmem.Op != OpMove || auxIntToInt64(midmem.AuxInt) != s {
18043 break
18044 }
18045 t2 := auxToType(midmem.Aux)
18046 src := midmem.Args[1]
18047 tmp2 := midmem.Args[0]
18048 if !(t1.Compare(t2) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && !isVolatile(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))) {
18049 break
18050 }
18051 v.reset(OpMove)
18052 v.AuxInt = int64ToAuxInt(s)
18053 v.Aux = typeToAux(t1)
18054 v.AddArg3(dst, src, midmem)
18055 return true
18056 }
18057
18058
18059
18060 for {
18061 s := auxIntToInt64(v.AuxInt)
18062 t1 := auxToType(v.Aux)
18063 dst := v_0
18064 tmp1 := v_1
18065 midmem := v_2
18066 if midmem.Op != OpVarDef {
18067 break
18068 }
18069 midmem_0 := midmem.Args[0]
18070 if midmem_0.Op != OpMove || auxIntToInt64(midmem_0.AuxInt) != s {
18071 break
18072 }
18073 t2 := auxToType(midmem_0.Aux)
18074 src := midmem_0.Args[1]
18075 tmp2 := midmem_0.Args[0]
18076 if !(t1.Compare(t2) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && !isVolatile(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))) {
18077 break
18078 }
18079 v.reset(OpMove)
18080 v.AuxInt = int64ToAuxInt(s)
18081 v.Aux = typeToAux(t1)
18082 v.AddArg3(dst, src, midmem)
18083 return true
18084 }
18085
18086
18087
18088 for {
18089 dst := v_0
18090 src := v_1
18091 mem := v_2
18092 if !(isSamePtr(dst, src)) {
18093 break
18094 }
18095 v.copyOf(mem)
18096 return true
18097 }
18098 return false
18099 }
18100 func rewriteValuegeneric_OpMul16(v *Value) bool {
18101 v_1 := v.Args[1]
18102 v_0 := v.Args[0]
18103 b := v.Block
18104 typ := &b.Func.Config.Types
18105
18106
18107 for {
18108 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18109 if v_0.Op != OpConst16 {
18110 continue
18111 }
18112 c := auxIntToInt16(v_0.AuxInt)
18113 if v_1.Op != OpConst16 {
18114 continue
18115 }
18116 d := auxIntToInt16(v_1.AuxInt)
18117 v.reset(OpConst16)
18118 v.AuxInt = int16ToAuxInt(c * d)
18119 return true
18120 }
18121 break
18122 }
18123
18124
18125 for {
18126 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18127 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 1 {
18128 continue
18129 }
18130 x := v_1
18131 v.copyOf(x)
18132 return true
18133 }
18134 break
18135 }
18136
18137
18138 for {
18139 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18140 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
18141 continue
18142 }
18143 x := v_1
18144 v.reset(OpNeg16)
18145 v.AddArg(x)
18146 return true
18147 }
18148 break
18149 }
18150
18151
18152
18153 for {
18154 t := v.Type
18155 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18156 n := v_0
18157 if v_1.Op != OpConst16 {
18158 continue
18159 }
18160 c := auxIntToInt16(v_1.AuxInt)
18161 if !(isPowerOfTwo(c)) {
18162 continue
18163 }
18164 v.reset(OpLsh16x64)
18165 v.Type = t
18166 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18167 v0.AuxInt = int64ToAuxInt(log16(c))
18168 v.AddArg2(n, v0)
18169 return true
18170 }
18171 break
18172 }
18173
18174
18175
18176 for {
18177 t := v.Type
18178 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18179 n := v_0
18180 if v_1.Op != OpConst16 {
18181 continue
18182 }
18183 c := auxIntToInt16(v_1.AuxInt)
18184 if !(t.IsSigned() && isPowerOfTwo(-c)) {
18185 continue
18186 }
18187 v.reset(OpNeg16)
18188 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
18189 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18190 v1.AuxInt = int64ToAuxInt(log16(-c))
18191 v0.AddArg2(n, v1)
18192 v.AddArg(v0)
18193 return true
18194 }
18195 break
18196 }
18197
18198
18199 for {
18200 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18201 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
18202 continue
18203 }
18204 v.reset(OpConst16)
18205 v.AuxInt = int16ToAuxInt(0)
18206 return true
18207 }
18208 break
18209 }
18210
18211
18212
18213 for {
18214 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18215 if v_0.Op != OpMul16 {
18216 continue
18217 }
18218 _ = v_0.Args[1]
18219 v_0_0 := v_0.Args[0]
18220 v_0_1 := v_0.Args[1]
18221 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18222 i := v_0_0
18223 if i.Op != OpConst16 {
18224 continue
18225 }
18226 t := i.Type
18227 z := v_0_1
18228 x := v_1
18229 if !(z.Op != OpConst16 && x.Op != OpConst16) {
18230 continue
18231 }
18232 v.reset(OpMul16)
18233 v0 := b.NewValue0(v.Pos, OpMul16, t)
18234 v0.AddArg2(x, z)
18235 v.AddArg2(i, v0)
18236 return true
18237 }
18238 }
18239 break
18240 }
18241
18242
18243 for {
18244 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18245 if v_0.Op != OpConst16 {
18246 continue
18247 }
18248 t := v_0.Type
18249 c := auxIntToInt16(v_0.AuxInt)
18250 if v_1.Op != OpMul16 {
18251 continue
18252 }
18253 _ = v_1.Args[1]
18254 v_1_0 := v_1.Args[0]
18255 v_1_1 := v_1.Args[1]
18256 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18257 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
18258 continue
18259 }
18260 d := auxIntToInt16(v_1_0.AuxInt)
18261 x := v_1_1
18262 v.reset(OpMul16)
18263 v0 := b.NewValue0(v.Pos, OpConst16, t)
18264 v0.AuxInt = int16ToAuxInt(c * d)
18265 v.AddArg2(v0, x)
18266 return true
18267 }
18268 }
18269 break
18270 }
18271 return false
18272 }
18273 func rewriteValuegeneric_OpMul32(v *Value) bool {
18274 v_1 := v.Args[1]
18275 v_0 := v.Args[0]
18276 b := v.Block
18277 typ := &b.Func.Config.Types
18278
18279
18280 for {
18281 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18282 if v_0.Op != OpConst32 {
18283 continue
18284 }
18285 c := auxIntToInt32(v_0.AuxInt)
18286 if v_1.Op != OpConst32 {
18287 continue
18288 }
18289 d := auxIntToInt32(v_1.AuxInt)
18290 v.reset(OpConst32)
18291 v.AuxInt = int32ToAuxInt(c * d)
18292 return true
18293 }
18294 break
18295 }
18296
18297
18298 for {
18299 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18300 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 {
18301 continue
18302 }
18303 x := v_1
18304 v.copyOf(x)
18305 return true
18306 }
18307 break
18308 }
18309
18310
18311 for {
18312 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18313 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
18314 continue
18315 }
18316 x := v_1
18317 v.reset(OpNeg32)
18318 v.AddArg(x)
18319 return true
18320 }
18321 break
18322 }
18323
18324
18325
18326 for {
18327 t := v.Type
18328 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18329 n := v_0
18330 if v_1.Op != OpConst32 {
18331 continue
18332 }
18333 c := auxIntToInt32(v_1.AuxInt)
18334 if !(isPowerOfTwo(c)) {
18335 continue
18336 }
18337 v.reset(OpLsh32x64)
18338 v.Type = t
18339 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18340 v0.AuxInt = int64ToAuxInt(log32(c))
18341 v.AddArg2(n, v0)
18342 return true
18343 }
18344 break
18345 }
18346
18347
18348
18349 for {
18350 t := v.Type
18351 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18352 n := v_0
18353 if v_1.Op != OpConst32 {
18354 continue
18355 }
18356 c := auxIntToInt32(v_1.AuxInt)
18357 if !(t.IsSigned() && isPowerOfTwo(-c)) {
18358 continue
18359 }
18360 v.reset(OpNeg32)
18361 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
18362 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18363 v1.AuxInt = int64ToAuxInt(log32(-c))
18364 v0.AddArg2(n, v1)
18365 v.AddArg(v0)
18366 return true
18367 }
18368 break
18369 }
18370
18371
18372 for {
18373 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18374 if v_0.Op != OpConst32 {
18375 continue
18376 }
18377 t := v_0.Type
18378 c := auxIntToInt32(v_0.AuxInt)
18379 if v_1.Op != OpAdd32 || v_1.Type != t {
18380 continue
18381 }
18382 _ = v_1.Args[1]
18383 v_1_0 := v_1.Args[0]
18384 v_1_1 := v_1.Args[1]
18385 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18386 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
18387 continue
18388 }
18389 d := auxIntToInt32(v_1_0.AuxInt)
18390 x := v_1_1
18391 v.reset(OpAdd32)
18392 v0 := b.NewValue0(v.Pos, OpConst32, t)
18393 v0.AuxInt = int32ToAuxInt(c * d)
18394 v1 := b.NewValue0(v.Pos, OpMul32, t)
18395 v2 := b.NewValue0(v.Pos, OpConst32, t)
18396 v2.AuxInt = int32ToAuxInt(c)
18397 v1.AddArg2(v2, x)
18398 v.AddArg2(v0, v1)
18399 return true
18400 }
18401 }
18402 break
18403 }
18404
18405
18406 for {
18407 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18408 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
18409 continue
18410 }
18411 v.reset(OpConst32)
18412 v.AuxInt = int32ToAuxInt(0)
18413 return true
18414 }
18415 break
18416 }
18417
18418
18419
18420 for {
18421 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18422 if v_0.Op != OpMul32 {
18423 continue
18424 }
18425 _ = v_0.Args[1]
18426 v_0_0 := v_0.Args[0]
18427 v_0_1 := v_0.Args[1]
18428 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18429 i := v_0_0
18430 if i.Op != OpConst32 {
18431 continue
18432 }
18433 t := i.Type
18434 z := v_0_1
18435 x := v_1
18436 if !(z.Op != OpConst32 && x.Op != OpConst32) {
18437 continue
18438 }
18439 v.reset(OpMul32)
18440 v0 := b.NewValue0(v.Pos, OpMul32, t)
18441 v0.AddArg2(x, z)
18442 v.AddArg2(i, v0)
18443 return true
18444 }
18445 }
18446 break
18447 }
18448
18449
18450 for {
18451 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18452 if v_0.Op != OpConst32 {
18453 continue
18454 }
18455 t := v_0.Type
18456 c := auxIntToInt32(v_0.AuxInt)
18457 if v_1.Op != OpMul32 {
18458 continue
18459 }
18460 _ = v_1.Args[1]
18461 v_1_0 := v_1.Args[0]
18462 v_1_1 := v_1.Args[1]
18463 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18464 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
18465 continue
18466 }
18467 d := auxIntToInt32(v_1_0.AuxInt)
18468 x := v_1_1
18469 v.reset(OpMul32)
18470 v0 := b.NewValue0(v.Pos, OpConst32, t)
18471 v0.AuxInt = int32ToAuxInt(c * d)
18472 v.AddArg2(v0, x)
18473 return true
18474 }
18475 }
18476 break
18477 }
18478 return false
18479 }
18480 func rewriteValuegeneric_OpMul32F(v *Value) bool {
18481 v_1 := v.Args[1]
18482 v_0 := v.Args[0]
18483
18484
18485
18486 for {
18487 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18488 if v_0.Op != OpConst32F {
18489 continue
18490 }
18491 c := auxIntToFloat32(v_0.AuxInt)
18492 if v_1.Op != OpConst32F {
18493 continue
18494 }
18495 d := auxIntToFloat32(v_1.AuxInt)
18496 if !(c*d == c*d) {
18497 continue
18498 }
18499 v.reset(OpConst32F)
18500 v.AuxInt = float32ToAuxInt(c * d)
18501 return true
18502 }
18503 break
18504 }
18505
18506
18507 for {
18508 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18509 x := v_0
18510 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != 1 {
18511 continue
18512 }
18513 v.copyOf(x)
18514 return true
18515 }
18516 break
18517 }
18518
18519
18520 for {
18521 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18522 x := v_0
18523 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != -1 {
18524 continue
18525 }
18526 v.reset(OpNeg32F)
18527 v.AddArg(x)
18528 return true
18529 }
18530 break
18531 }
18532
18533
18534 for {
18535 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18536 x := v_0
18537 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != 2 {
18538 continue
18539 }
18540 v.reset(OpAdd32F)
18541 v.AddArg2(x, x)
18542 return true
18543 }
18544 break
18545 }
18546 return false
18547 }
18548 func rewriteValuegeneric_OpMul64(v *Value) bool {
18549 v_1 := v.Args[1]
18550 v_0 := v.Args[0]
18551 b := v.Block
18552 typ := &b.Func.Config.Types
18553
18554
18555 for {
18556 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18557 if v_0.Op != OpConst64 {
18558 continue
18559 }
18560 c := auxIntToInt64(v_0.AuxInt)
18561 if v_1.Op != OpConst64 {
18562 continue
18563 }
18564 d := auxIntToInt64(v_1.AuxInt)
18565 v.reset(OpConst64)
18566 v.AuxInt = int64ToAuxInt(c * d)
18567 return true
18568 }
18569 break
18570 }
18571
18572
18573 for {
18574 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18575 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 {
18576 continue
18577 }
18578 x := v_1
18579 v.copyOf(x)
18580 return true
18581 }
18582 break
18583 }
18584
18585
18586 for {
18587 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18588 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
18589 continue
18590 }
18591 x := v_1
18592 v.reset(OpNeg64)
18593 v.AddArg(x)
18594 return true
18595 }
18596 break
18597 }
18598
18599
18600
18601 for {
18602 t := v.Type
18603 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18604 n := v_0
18605 if v_1.Op != OpConst64 {
18606 continue
18607 }
18608 c := auxIntToInt64(v_1.AuxInt)
18609 if !(isPowerOfTwo(c)) {
18610 continue
18611 }
18612 v.reset(OpLsh64x64)
18613 v.Type = t
18614 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18615 v0.AuxInt = int64ToAuxInt(log64(c))
18616 v.AddArg2(n, v0)
18617 return true
18618 }
18619 break
18620 }
18621
18622
18623
18624 for {
18625 t := v.Type
18626 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18627 n := v_0
18628 if v_1.Op != OpConst64 {
18629 continue
18630 }
18631 c := auxIntToInt64(v_1.AuxInt)
18632 if !(t.IsSigned() && isPowerOfTwo(-c)) {
18633 continue
18634 }
18635 v.reset(OpNeg64)
18636 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
18637 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18638 v1.AuxInt = int64ToAuxInt(log64(-c))
18639 v0.AddArg2(n, v1)
18640 v.AddArg(v0)
18641 return true
18642 }
18643 break
18644 }
18645
18646
18647 for {
18648 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18649 if v_0.Op != OpConst64 {
18650 continue
18651 }
18652 t := v_0.Type
18653 c := auxIntToInt64(v_0.AuxInt)
18654 if v_1.Op != OpAdd64 || v_1.Type != t {
18655 continue
18656 }
18657 _ = v_1.Args[1]
18658 v_1_0 := v_1.Args[0]
18659 v_1_1 := v_1.Args[1]
18660 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18661 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
18662 continue
18663 }
18664 d := auxIntToInt64(v_1_0.AuxInt)
18665 x := v_1_1
18666 v.reset(OpAdd64)
18667 v0 := b.NewValue0(v.Pos, OpConst64, t)
18668 v0.AuxInt = int64ToAuxInt(c * d)
18669 v1 := b.NewValue0(v.Pos, OpMul64, t)
18670 v2 := b.NewValue0(v.Pos, OpConst64, t)
18671 v2.AuxInt = int64ToAuxInt(c)
18672 v1.AddArg2(v2, x)
18673 v.AddArg2(v0, v1)
18674 return true
18675 }
18676 }
18677 break
18678 }
18679
18680
18681 for {
18682 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18683 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
18684 continue
18685 }
18686 v.reset(OpConst64)
18687 v.AuxInt = int64ToAuxInt(0)
18688 return true
18689 }
18690 break
18691 }
18692
18693
18694
18695 for {
18696 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18697 if v_0.Op != OpMul64 {
18698 continue
18699 }
18700 _ = v_0.Args[1]
18701 v_0_0 := v_0.Args[0]
18702 v_0_1 := v_0.Args[1]
18703 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18704 i := v_0_0
18705 if i.Op != OpConst64 {
18706 continue
18707 }
18708 t := i.Type
18709 z := v_0_1
18710 x := v_1
18711 if !(z.Op != OpConst64 && x.Op != OpConst64) {
18712 continue
18713 }
18714 v.reset(OpMul64)
18715 v0 := b.NewValue0(v.Pos, OpMul64, t)
18716 v0.AddArg2(x, z)
18717 v.AddArg2(i, v0)
18718 return true
18719 }
18720 }
18721 break
18722 }
18723
18724
18725 for {
18726 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18727 if v_0.Op != OpConst64 {
18728 continue
18729 }
18730 t := v_0.Type
18731 c := auxIntToInt64(v_0.AuxInt)
18732 if v_1.Op != OpMul64 {
18733 continue
18734 }
18735 _ = v_1.Args[1]
18736 v_1_0 := v_1.Args[0]
18737 v_1_1 := v_1.Args[1]
18738 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18739 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
18740 continue
18741 }
18742 d := auxIntToInt64(v_1_0.AuxInt)
18743 x := v_1_1
18744 v.reset(OpMul64)
18745 v0 := b.NewValue0(v.Pos, OpConst64, t)
18746 v0.AuxInt = int64ToAuxInt(c * d)
18747 v.AddArg2(v0, x)
18748 return true
18749 }
18750 }
18751 break
18752 }
18753 return false
18754 }
18755 func rewriteValuegeneric_OpMul64F(v *Value) bool {
18756 v_1 := v.Args[1]
18757 v_0 := v.Args[0]
18758
18759
18760
18761 for {
18762 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18763 if v_0.Op != OpConst64F {
18764 continue
18765 }
18766 c := auxIntToFloat64(v_0.AuxInt)
18767 if v_1.Op != OpConst64F {
18768 continue
18769 }
18770 d := auxIntToFloat64(v_1.AuxInt)
18771 if !(c*d == c*d) {
18772 continue
18773 }
18774 v.reset(OpConst64F)
18775 v.AuxInt = float64ToAuxInt(c * d)
18776 return true
18777 }
18778 break
18779 }
18780
18781
18782 for {
18783 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18784 x := v_0
18785 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != 1 {
18786 continue
18787 }
18788 v.copyOf(x)
18789 return true
18790 }
18791 break
18792 }
18793
18794
18795 for {
18796 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18797 x := v_0
18798 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != -1 {
18799 continue
18800 }
18801 v.reset(OpNeg64F)
18802 v.AddArg(x)
18803 return true
18804 }
18805 break
18806 }
18807
18808
18809 for {
18810 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18811 x := v_0
18812 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != 2 {
18813 continue
18814 }
18815 v.reset(OpAdd64F)
18816 v.AddArg2(x, x)
18817 return true
18818 }
18819 break
18820 }
18821 return false
18822 }
18823 func rewriteValuegeneric_OpMul8(v *Value) bool {
18824 v_1 := v.Args[1]
18825 v_0 := v.Args[0]
18826 b := v.Block
18827 typ := &b.Func.Config.Types
18828
18829
18830 for {
18831 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18832 if v_0.Op != OpConst8 {
18833 continue
18834 }
18835 c := auxIntToInt8(v_0.AuxInt)
18836 if v_1.Op != OpConst8 {
18837 continue
18838 }
18839 d := auxIntToInt8(v_1.AuxInt)
18840 v.reset(OpConst8)
18841 v.AuxInt = int8ToAuxInt(c * d)
18842 return true
18843 }
18844 break
18845 }
18846
18847
18848 for {
18849 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18850 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 1 {
18851 continue
18852 }
18853 x := v_1
18854 v.copyOf(x)
18855 return true
18856 }
18857 break
18858 }
18859
18860
18861 for {
18862 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18863 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
18864 continue
18865 }
18866 x := v_1
18867 v.reset(OpNeg8)
18868 v.AddArg(x)
18869 return true
18870 }
18871 break
18872 }
18873
18874
18875
18876 for {
18877 t := v.Type
18878 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18879 n := v_0
18880 if v_1.Op != OpConst8 {
18881 continue
18882 }
18883 c := auxIntToInt8(v_1.AuxInt)
18884 if !(isPowerOfTwo(c)) {
18885 continue
18886 }
18887 v.reset(OpLsh8x64)
18888 v.Type = t
18889 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18890 v0.AuxInt = int64ToAuxInt(log8(c))
18891 v.AddArg2(n, v0)
18892 return true
18893 }
18894 break
18895 }
18896
18897
18898
18899 for {
18900 t := v.Type
18901 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18902 n := v_0
18903 if v_1.Op != OpConst8 {
18904 continue
18905 }
18906 c := auxIntToInt8(v_1.AuxInt)
18907 if !(t.IsSigned() && isPowerOfTwo(-c)) {
18908 continue
18909 }
18910 v.reset(OpNeg8)
18911 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
18912 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18913 v1.AuxInt = int64ToAuxInt(log8(-c))
18914 v0.AddArg2(n, v1)
18915 v.AddArg(v0)
18916 return true
18917 }
18918 break
18919 }
18920
18921
18922 for {
18923 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18924 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
18925 continue
18926 }
18927 v.reset(OpConst8)
18928 v.AuxInt = int8ToAuxInt(0)
18929 return true
18930 }
18931 break
18932 }
18933
18934
18935
18936 for {
18937 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18938 if v_0.Op != OpMul8 {
18939 continue
18940 }
18941 _ = v_0.Args[1]
18942 v_0_0 := v_0.Args[0]
18943 v_0_1 := v_0.Args[1]
18944 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18945 i := v_0_0
18946 if i.Op != OpConst8 {
18947 continue
18948 }
18949 t := i.Type
18950 z := v_0_1
18951 x := v_1
18952 if !(z.Op != OpConst8 && x.Op != OpConst8) {
18953 continue
18954 }
18955 v.reset(OpMul8)
18956 v0 := b.NewValue0(v.Pos, OpMul8, t)
18957 v0.AddArg2(x, z)
18958 v.AddArg2(i, v0)
18959 return true
18960 }
18961 }
18962 break
18963 }
18964
18965
18966 for {
18967 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18968 if v_0.Op != OpConst8 {
18969 continue
18970 }
18971 t := v_0.Type
18972 c := auxIntToInt8(v_0.AuxInt)
18973 if v_1.Op != OpMul8 {
18974 continue
18975 }
18976 _ = v_1.Args[1]
18977 v_1_0 := v_1.Args[0]
18978 v_1_1 := v_1.Args[1]
18979 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18980 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
18981 continue
18982 }
18983 d := auxIntToInt8(v_1_0.AuxInt)
18984 x := v_1_1
18985 v.reset(OpMul8)
18986 v0 := b.NewValue0(v.Pos, OpConst8, t)
18987 v0.AuxInt = int8ToAuxInt(c * d)
18988 v.AddArg2(v0, x)
18989 return true
18990 }
18991 }
18992 break
18993 }
18994 return false
18995 }
18996 func rewriteValuegeneric_OpNeg16(v *Value) bool {
18997 v_0 := v.Args[0]
18998 b := v.Block
18999
19000
19001 for {
19002 if v_0.Op != OpConst16 {
19003 break
19004 }
19005 c := auxIntToInt16(v_0.AuxInt)
19006 v.reset(OpConst16)
19007 v.AuxInt = int16ToAuxInt(-c)
19008 return true
19009 }
19010
19011
19012 for {
19013 if v_0.Op != OpSub16 {
19014 break
19015 }
19016 y := v_0.Args[1]
19017 x := v_0.Args[0]
19018 v.reset(OpSub16)
19019 v.AddArg2(y, x)
19020 return true
19021 }
19022
19023
19024 for {
19025 if v_0.Op != OpNeg16 {
19026 break
19027 }
19028 x := v_0.Args[0]
19029 v.copyOf(x)
19030 return true
19031 }
19032
19033
19034 for {
19035 t := v.Type
19036 if v_0.Op != OpCom16 {
19037 break
19038 }
19039 x := v_0.Args[0]
19040 v.reset(OpAdd16)
19041 v0 := b.NewValue0(v.Pos, OpConst16, t)
19042 v0.AuxInt = int16ToAuxInt(1)
19043 v.AddArg2(v0, x)
19044 return true
19045 }
19046 return false
19047 }
19048 func rewriteValuegeneric_OpNeg32(v *Value) bool {
19049 v_0 := v.Args[0]
19050 b := v.Block
19051
19052
19053 for {
19054 if v_0.Op != OpConst32 {
19055 break
19056 }
19057 c := auxIntToInt32(v_0.AuxInt)
19058 v.reset(OpConst32)
19059 v.AuxInt = int32ToAuxInt(-c)
19060 return true
19061 }
19062
19063
19064 for {
19065 if v_0.Op != OpSub32 {
19066 break
19067 }
19068 y := v_0.Args[1]
19069 x := v_0.Args[0]
19070 v.reset(OpSub32)
19071 v.AddArg2(y, x)
19072 return true
19073 }
19074
19075
19076 for {
19077 if v_0.Op != OpNeg32 {
19078 break
19079 }
19080 x := v_0.Args[0]
19081 v.copyOf(x)
19082 return true
19083 }
19084
19085
19086 for {
19087 t := v.Type
19088 if v_0.Op != OpCom32 {
19089 break
19090 }
19091 x := v_0.Args[0]
19092 v.reset(OpAdd32)
19093 v0 := b.NewValue0(v.Pos, OpConst32, t)
19094 v0.AuxInt = int32ToAuxInt(1)
19095 v.AddArg2(v0, x)
19096 return true
19097 }
19098 return false
19099 }
19100 func rewriteValuegeneric_OpNeg32F(v *Value) bool {
19101 v_0 := v.Args[0]
19102
19103
19104
19105 for {
19106 if v_0.Op != OpConst32F {
19107 break
19108 }
19109 c := auxIntToFloat32(v_0.AuxInt)
19110 if !(c != 0) {
19111 break
19112 }
19113 v.reset(OpConst32F)
19114 v.AuxInt = float32ToAuxInt(-c)
19115 return true
19116 }
19117 return false
19118 }
19119 func rewriteValuegeneric_OpNeg64(v *Value) bool {
19120 v_0 := v.Args[0]
19121 b := v.Block
19122
19123
19124 for {
19125 if v_0.Op != OpConst64 {
19126 break
19127 }
19128 c := auxIntToInt64(v_0.AuxInt)
19129 v.reset(OpConst64)
19130 v.AuxInt = int64ToAuxInt(-c)
19131 return true
19132 }
19133
19134
19135 for {
19136 if v_0.Op != OpSub64 {
19137 break
19138 }
19139 y := v_0.Args[1]
19140 x := v_0.Args[0]
19141 v.reset(OpSub64)
19142 v.AddArg2(y, x)
19143 return true
19144 }
19145
19146
19147 for {
19148 if v_0.Op != OpNeg64 {
19149 break
19150 }
19151 x := v_0.Args[0]
19152 v.copyOf(x)
19153 return true
19154 }
19155
19156
19157 for {
19158 t := v.Type
19159 if v_0.Op != OpCom64 {
19160 break
19161 }
19162 x := v_0.Args[0]
19163 v.reset(OpAdd64)
19164 v0 := b.NewValue0(v.Pos, OpConst64, t)
19165 v0.AuxInt = int64ToAuxInt(1)
19166 v.AddArg2(v0, x)
19167 return true
19168 }
19169 return false
19170 }
19171 func rewriteValuegeneric_OpNeg64F(v *Value) bool {
19172 v_0 := v.Args[0]
19173
19174
19175
19176 for {
19177 if v_0.Op != OpConst64F {
19178 break
19179 }
19180 c := auxIntToFloat64(v_0.AuxInt)
19181 if !(c != 0) {
19182 break
19183 }
19184 v.reset(OpConst64F)
19185 v.AuxInt = float64ToAuxInt(-c)
19186 return true
19187 }
19188 return false
19189 }
19190 func rewriteValuegeneric_OpNeg8(v *Value) bool {
19191 v_0 := v.Args[0]
19192 b := v.Block
19193
19194
19195 for {
19196 if v_0.Op != OpConst8 {
19197 break
19198 }
19199 c := auxIntToInt8(v_0.AuxInt)
19200 v.reset(OpConst8)
19201 v.AuxInt = int8ToAuxInt(-c)
19202 return true
19203 }
19204
19205
19206 for {
19207 if v_0.Op != OpSub8 {
19208 break
19209 }
19210 y := v_0.Args[1]
19211 x := v_0.Args[0]
19212 v.reset(OpSub8)
19213 v.AddArg2(y, x)
19214 return true
19215 }
19216
19217
19218 for {
19219 if v_0.Op != OpNeg8 {
19220 break
19221 }
19222 x := v_0.Args[0]
19223 v.copyOf(x)
19224 return true
19225 }
19226
19227
19228 for {
19229 t := v.Type
19230 if v_0.Op != OpCom8 {
19231 break
19232 }
19233 x := v_0.Args[0]
19234 v.reset(OpAdd8)
19235 v0 := b.NewValue0(v.Pos, OpConst8, t)
19236 v0.AuxInt = int8ToAuxInt(1)
19237 v.AddArg2(v0, x)
19238 return true
19239 }
19240 return false
19241 }
19242 func rewriteValuegeneric_OpNeq16(v *Value) bool {
19243 v_1 := v.Args[1]
19244 v_0 := v.Args[0]
19245 b := v.Block
19246 typ := &b.Func.Config.Types
19247
19248
19249 for {
19250 x := v_0
19251 if x != v_1 {
19252 break
19253 }
19254 v.reset(OpConstBool)
19255 v.AuxInt = boolToAuxInt(false)
19256 return true
19257 }
19258
19259
19260 for {
19261 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19262 if v_0.Op != OpConst16 {
19263 continue
19264 }
19265 t := v_0.Type
19266 c := auxIntToInt16(v_0.AuxInt)
19267 if v_1.Op != OpAdd16 {
19268 continue
19269 }
19270 _ = v_1.Args[1]
19271 v_1_0 := v_1.Args[0]
19272 v_1_1 := v_1.Args[1]
19273 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19274 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
19275 continue
19276 }
19277 d := auxIntToInt16(v_1_0.AuxInt)
19278 x := v_1_1
19279 v.reset(OpNeq16)
19280 v0 := b.NewValue0(v.Pos, OpConst16, t)
19281 v0.AuxInt = int16ToAuxInt(c - d)
19282 v.AddArg2(v0, x)
19283 return true
19284 }
19285 }
19286 break
19287 }
19288
19289
19290 for {
19291 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19292 if v_0.Op != OpConst16 {
19293 continue
19294 }
19295 c := auxIntToInt16(v_0.AuxInt)
19296 if v_1.Op != OpConst16 {
19297 continue
19298 }
19299 d := auxIntToInt16(v_1.AuxInt)
19300 v.reset(OpConstBool)
19301 v.AuxInt = boolToAuxInt(c != d)
19302 return true
19303 }
19304 break
19305 }
19306
19307
19308
19309 for {
19310 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19311 n := v_0
19312 if v_1.Op != OpLsh16x64 {
19313 continue
19314 }
19315 _ = v_1.Args[1]
19316 v_1_0 := v_1.Args[0]
19317 if v_1_0.Op != OpRsh16x64 {
19318 continue
19319 }
19320 _ = v_1_0.Args[1]
19321 v_1_0_0 := v_1_0.Args[0]
19322 if v_1_0_0.Op != OpAdd16 {
19323 continue
19324 }
19325 t := v_1_0_0.Type
19326 _ = v_1_0_0.Args[1]
19327 v_1_0_0_0 := v_1_0_0.Args[0]
19328 v_1_0_0_1 := v_1_0_0.Args[1]
19329 for _i1 := 0; _i1 <= 1; _i1, v_1_0_0_0, v_1_0_0_1 = _i1+1, v_1_0_0_1, v_1_0_0_0 {
19330 if n != v_1_0_0_0 || v_1_0_0_1.Op != OpRsh16Ux64 || v_1_0_0_1.Type != t {
19331 continue
19332 }
19333 _ = v_1_0_0_1.Args[1]
19334 v_1_0_0_1_0 := v_1_0_0_1.Args[0]
19335 if v_1_0_0_1_0.Op != OpRsh16x64 || v_1_0_0_1_0.Type != t {
19336 continue
19337 }
19338 _ = v_1_0_0_1_0.Args[1]
19339 if n != v_1_0_0_1_0.Args[0] {
19340 continue
19341 }
19342 v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1]
19343 if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || auxIntToInt64(v_1_0_0_1_0_1.AuxInt) != 15 {
19344 continue
19345 }
19346 v_1_0_0_1_1 := v_1_0_0_1.Args[1]
19347 if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 {
19348 continue
19349 }
19350 kbar := auxIntToInt64(v_1_0_0_1_1.AuxInt)
19351 v_1_0_1 := v_1_0.Args[1]
19352 if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 {
19353 continue
19354 }
19355 k := auxIntToInt64(v_1_0_1.AuxInt)
19356 v_1_1 := v_1.Args[1]
19357 if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || auxIntToInt64(v_1_1.AuxInt) != k || !(k > 0 && k < 15 && kbar == 16-k) {
19358 continue
19359 }
19360 v.reset(OpNeq16)
19361 v0 := b.NewValue0(v.Pos, OpAnd16, t)
19362 v1 := b.NewValue0(v.Pos, OpConst16, t)
19363 v1.AuxInt = int16ToAuxInt(1<<uint(k) - 1)
19364 v0.AddArg2(n, v1)
19365 v2 := b.NewValue0(v.Pos, OpConst16, t)
19366 v2.AuxInt = int16ToAuxInt(0)
19367 v.AddArg2(v0, v2)
19368 return true
19369 }
19370 }
19371 break
19372 }
19373
19374
19375
19376 for {
19377 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19378 s := v_0
19379 if s.Op != OpSub16 {
19380 continue
19381 }
19382 y := s.Args[1]
19383 x := s.Args[0]
19384 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(s.Uses == 1) {
19385 continue
19386 }
19387 v.reset(OpNeq16)
19388 v.AddArg2(x, y)
19389 return true
19390 }
19391 break
19392 }
19393
19394
19395
19396 for {
19397 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19398 if v_0.Op != OpAnd16 {
19399 continue
19400 }
19401 t := v_0.Type
19402 _ = v_0.Args[1]
19403 v_0_0 := v_0.Args[0]
19404 v_0_1 := v_0.Args[1]
19405 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19406 x := v_0_0
19407 if v_0_1.Op != OpConst16 || v_0_1.Type != t {
19408 continue
19409 }
19410 y := auxIntToInt16(v_0_1.AuxInt)
19411 if v_1.Op != OpConst16 || v_1.Type != t || auxIntToInt16(v_1.AuxInt) != y || !(oneBit16(y)) {
19412 continue
19413 }
19414 v.reset(OpEq16)
19415 v0 := b.NewValue0(v.Pos, OpAnd16, t)
19416 v1 := b.NewValue0(v.Pos, OpConst16, t)
19417 v1.AuxInt = int16ToAuxInt(y)
19418 v0.AddArg2(x, v1)
19419 v2 := b.NewValue0(v.Pos, OpConst16, t)
19420 v2.AuxInt = int16ToAuxInt(0)
19421 v.AddArg2(v0, v2)
19422 return true
19423 }
19424 }
19425 break
19426 }
19427 return false
19428 }
19429 func rewriteValuegeneric_OpNeq32(v *Value) bool {
19430 v_1 := v.Args[1]
19431 v_0 := v.Args[0]
19432 b := v.Block
19433 typ := &b.Func.Config.Types
19434
19435
19436 for {
19437 x := v_0
19438 if x != v_1 {
19439 break
19440 }
19441 v.reset(OpConstBool)
19442 v.AuxInt = boolToAuxInt(false)
19443 return true
19444 }
19445
19446
19447 for {
19448 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19449 if v_0.Op != OpConst32 {
19450 continue
19451 }
19452 t := v_0.Type
19453 c := auxIntToInt32(v_0.AuxInt)
19454 if v_1.Op != OpAdd32 {
19455 continue
19456 }
19457 _ = v_1.Args[1]
19458 v_1_0 := v_1.Args[0]
19459 v_1_1 := v_1.Args[1]
19460 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19461 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
19462 continue
19463 }
19464 d := auxIntToInt32(v_1_0.AuxInt)
19465 x := v_1_1
19466 v.reset(OpNeq32)
19467 v0 := b.NewValue0(v.Pos, OpConst32, t)
19468 v0.AuxInt = int32ToAuxInt(c - d)
19469 v.AddArg2(v0, x)
19470 return true
19471 }
19472 }
19473 break
19474 }
19475
19476
19477 for {
19478 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19479 if v_0.Op != OpConst32 {
19480 continue
19481 }
19482 c := auxIntToInt32(v_0.AuxInt)
19483 if v_1.Op != OpConst32 {
19484 continue
19485 }
19486 d := auxIntToInt32(v_1.AuxInt)
19487 v.reset(OpConstBool)
19488 v.AuxInt = boolToAuxInt(c != d)
19489 return true
19490 }
19491 break
19492 }
19493
19494
19495
19496 for {
19497 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19498 n := v_0
19499 if v_1.Op != OpLsh32x64 {
19500 continue
19501 }
19502 _ = v_1.Args[1]
19503 v_1_0 := v_1.Args[0]
19504 if v_1_0.Op != OpRsh32x64 {
19505 continue
19506 }
19507 _ = v_1_0.Args[1]
19508 v_1_0_0 := v_1_0.Args[0]
19509 if v_1_0_0.Op != OpAdd32 {
19510 continue
19511 }
19512 t := v_1_0_0.Type
19513 _ = v_1_0_0.Args[1]
19514 v_1_0_0_0 := v_1_0_0.Args[0]
19515 v_1_0_0_1 := v_1_0_0.Args[1]
19516 for _i1 := 0; _i1 <= 1; _i1, v_1_0_0_0, v_1_0_0_1 = _i1+1, v_1_0_0_1, v_1_0_0_0 {
19517 if n != v_1_0_0_0 || v_1_0_0_1.Op != OpRsh32Ux64 || v_1_0_0_1.Type != t {
19518 continue
19519 }
19520 _ = v_1_0_0_1.Args[1]
19521 v_1_0_0_1_0 := v_1_0_0_1.Args[0]
19522 if v_1_0_0_1_0.Op != OpRsh32x64 || v_1_0_0_1_0.Type != t {
19523 continue
19524 }
19525 _ = v_1_0_0_1_0.Args[1]
19526 if n != v_1_0_0_1_0.Args[0] {
19527 continue
19528 }
19529 v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1]
19530 if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || auxIntToInt64(v_1_0_0_1_0_1.AuxInt) != 31 {
19531 continue
19532 }
19533 v_1_0_0_1_1 := v_1_0_0_1.Args[1]
19534 if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 {
19535 continue
19536 }
19537 kbar := auxIntToInt64(v_1_0_0_1_1.AuxInt)
19538 v_1_0_1 := v_1_0.Args[1]
19539 if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 {
19540 continue
19541 }
19542 k := auxIntToInt64(v_1_0_1.AuxInt)
19543 v_1_1 := v_1.Args[1]
19544 if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || auxIntToInt64(v_1_1.AuxInt) != k || !(k > 0 && k < 31 && kbar == 32-k) {
19545 continue
19546 }
19547 v.reset(OpNeq32)
19548 v0 := b.NewValue0(v.Pos, OpAnd32, t)
19549 v1 := b.NewValue0(v.Pos, OpConst32, t)
19550 v1.AuxInt = int32ToAuxInt(1<<uint(k) - 1)
19551 v0.AddArg2(n, v1)
19552 v2 := b.NewValue0(v.Pos, OpConst32, t)
19553 v2.AuxInt = int32ToAuxInt(0)
19554 v.AddArg2(v0, v2)
19555 return true
19556 }
19557 }
19558 break
19559 }
19560
19561
19562
19563 for {
19564 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19565 s := v_0
19566 if s.Op != OpSub32 {
19567 continue
19568 }
19569 y := s.Args[1]
19570 x := s.Args[0]
19571 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 || !(s.Uses == 1) {
19572 continue
19573 }
19574 v.reset(OpNeq32)
19575 v.AddArg2(x, y)
19576 return true
19577 }
19578 break
19579 }
19580
19581
19582
19583 for {
19584 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19585 if v_0.Op != OpAnd32 {
19586 continue
19587 }
19588 t := v_0.Type
19589 _ = v_0.Args[1]
19590 v_0_0 := v_0.Args[0]
19591 v_0_1 := v_0.Args[1]
19592 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19593 x := v_0_0
19594 if v_0_1.Op != OpConst32 || v_0_1.Type != t {
19595 continue
19596 }
19597 y := auxIntToInt32(v_0_1.AuxInt)
19598 if v_1.Op != OpConst32 || v_1.Type != t || auxIntToInt32(v_1.AuxInt) != y || !(oneBit32(y)) {
19599 continue
19600 }
19601 v.reset(OpEq32)
19602 v0 := b.NewValue0(v.Pos, OpAnd32, t)
19603 v1 := b.NewValue0(v.Pos, OpConst32, t)
19604 v1.AuxInt = int32ToAuxInt(y)
19605 v0.AddArg2(x, v1)
19606 v2 := b.NewValue0(v.Pos, OpConst32, t)
19607 v2.AuxInt = int32ToAuxInt(0)
19608 v.AddArg2(v0, v2)
19609 return true
19610 }
19611 }
19612 break
19613 }
19614 return false
19615 }
19616 func rewriteValuegeneric_OpNeq32F(v *Value) bool {
19617 v_1 := v.Args[1]
19618 v_0 := v.Args[0]
19619
19620
19621 for {
19622 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19623 if v_0.Op != OpConst32F {
19624 continue
19625 }
19626 c := auxIntToFloat32(v_0.AuxInt)
19627 if v_1.Op != OpConst32F {
19628 continue
19629 }
19630 d := auxIntToFloat32(v_1.AuxInt)
19631 v.reset(OpConstBool)
19632 v.AuxInt = boolToAuxInt(c != d)
19633 return true
19634 }
19635 break
19636 }
19637 return false
19638 }
19639 func rewriteValuegeneric_OpNeq64(v *Value) bool {
19640 v_1 := v.Args[1]
19641 v_0 := v.Args[0]
19642 b := v.Block
19643 typ := &b.Func.Config.Types
19644
19645
19646 for {
19647 x := v_0
19648 if x != v_1 {
19649 break
19650 }
19651 v.reset(OpConstBool)
19652 v.AuxInt = boolToAuxInt(false)
19653 return true
19654 }
19655
19656
19657 for {
19658 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19659 if v_0.Op != OpConst64 {
19660 continue
19661 }
19662 t := v_0.Type
19663 c := auxIntToInt64(v_0.AuxInt)
19664 if v_1.Op != OpAdd64 {
19665 continue
19666 }
19667 _ = v_1.Args[1]
19668 v_1_0 := v_1.Args[0]
19669 v_1_1 := v_1.Args[1]
19670 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19671 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
19672 continue
19673 }
19674 d := auxIntToInt64(v_1_0.AuxInt)
19675 x := v_1_1
19676 v.reset(OpNeq64)
19677 v0 := b.NewValue0(v.Pos, OpConst64, t)
19678 v0.AuxInt = int64ToAuxInt(c - d)
19679 v.AddArg2(v0, x)
19680 return true
19681 }
19682 }
19683 break
19684 }
19685
19686
19687 for {
19688 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19689 if v_0.Op != OpConst64 {
19690 continue
19691 }
19692 c := auxIntToInt64(v_0.AuxInt)
19693 if v_1.Op != OpConst64 {
19694 continue
19695 }
19696 d := auxIntToInt64(v_1.AuxInt)
19697 v.reset(OpConstBool)
19698 v.AuxInt = boolToAuxInt(c != d)
19699 return true
19700 }
19701 break
19702 }
19703
19704
19705
19706 for {
19707 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19708 n := v_0
19709 if v_1.Op != OpLsh64x64 {
19710 continue
19711 }
19712 _ = v_1.Args[1]
19713 v_1_0 := v_1.Args[0]
19714 if v_1_0.Op != OpRsh64x64 {
19715 continue
19716 }
19717 _ = v_1_0.Args[1]
19718 v_1_0_0 := v_1_0.Args[0]
19719 if v_1_0_0.Op != OpAdd64 {
19720 continue
19721 }
19722 t := v_1_0_0.Type
19723 _ = v_1_0_0.Args[1]
19724 v_1_0_0_0 := v_1_0_0.Args[0]
19725 v_1_0_0_1 := v_1_0_0.Args[1]
19726 for _i1 := 0; _i1 <= 1; _i1, v_1_0_0_0, v_1_0_0_1 = _i1+1, v_1_0_0_1, v_1_0_0_0 {
19727 if n != v_1_0_0_0 || v_1_0_0_1.Op != OpRsh64Ux64 || v_1_0_0_1.Type != t {
19728 continue
19729 }
19730 _ = v_1_0_0_1.Args[1]
19731 v_1_0_0_1_0 := v_1_0_0_1.Args[0]
19732 if v_1_0_0_1_0.Op != OpRsh64x64 || v_1_0_0_1_0.Type != t {
19733 continue
19734 }
19735 _ = v_1_0_0_1_0.Args[1]
19736 if n != v_1_0_0_1_0.Args[0] {
19737 continue
19738 }
19739 v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1]
19740 if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || auxIntToInt64(v_1_0_0_1_0_1.AuxInt) != 63 {
19741 continue
19742 }
19743 v_1_0_0_1_1 := v_1_0_0_1.Args[1]
19744 if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 {
19745 continue
19746 }
19747 kbar := auxIntToInt64(v_1_0_0_1_1.AuxInt)
19748 v_1_0_1 := v_1_0.Args[1]
19749 if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 {
19750 continue
19751 }
19752 k := auxIntToInt64(v_1_0_1.AuxInt)
19753 v_1_1 := v_1.Args[1]
19754 if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || auxIntToInt64(v_1_1.AuxInt) != k || !(k > 0 && k < 63 && kbar == 64-k) {
19755 continue
19756 }
19757 v.reset(OpNeq64)
19758 v0 := b.NewValue0(v.Pos, OpAnd64, t)
19759 v1 := b.NewValue0(v.Pos, OpConst64, t)
19760 v1.AuxInt = int64ToAuxInt(1<<uint(k) - 1)
19761 v0.AddArg2(n, v1)
19762 v2 := b.NewValue0(v.Pos, OpConst64, t)
19763 v2.AuxInt = int64ToAuxInt(0)
19764 v.AddArg2(v0, v2)
19765 return true
19766 }
19767 }
19768 break
19769 }
19770
19771
19772
19773 for {
19774 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19775 s := v_0
19776 if s.Op != OpSub64 {
19777 continue
19778 }
19779 y := s.Args[1]
19780 x := s.Args[0]
19781 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 || !(s.Uses == 1) {
19782 continue
19783 }
19784 v.reset(OpNeq64)
19785 v.AddArg2(x, y)
19786 return true
19787 }
19788 break
19789 }
19790
19791
19792
19793 for {
19794 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19795 if v_0.Op != OpAnd64 {
19796 continue
19797 }
19798 t := v_0.Type
19799 _ = v_0.Args[1]
19800 v_0_0 := v_0.Args[0]
19801 v_0_1 := v_0.Args[1]
19802 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19803 x := v_0_0
19804 if v_0_1.Op != OpConst64 || v_0_1.Type != t {
19805 continue
19806 }
19807 y := auxIntToInt64(v_0_1.AuxInt)
19808 if v_1.Op != OpConst64 || v_1.Type != t || auxIntToInt64(v_1.AuxInt) != y || !(oneBit64(y)) {
19809 continue
19810 }
19811 v.reset(OpEq64)
19812 v0 := b.NewValue0(v.Pos, OpAnd64, t)
19813 v1 := b.NewValue0(v.Pos, OpConst64, t)
19814 v1.AuxInt = int64ToAuxInt(y)
19815 v0.AddArg2(x, v1)
19816 v2 := b.NewValue0(v.Pos, OpConst64, t)
19817 v2.AuxInt = int64ToAuxInt(0)
19818 v.AddArg2(v0, v2)
19819 return true
19820 }
19821 }
19822 break
19823 }
19824 return false
19825 }
19826 func rewriteValuegeneric_OpNeq64F(v *Value) bool {
19827 v_1 := v.Args[1]
19828 v_0 := v.Args[0]
19829
19830
19831 for {
19832 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19833 if v_0.Op != OpConst64F {
19834 continue
19835 }
19836 c := auxIntToFloat64(v_0.AuxInt)
19837 if v_1.Op != OpConst64F {
19838 continue
19839 }
19840 d := auxIntToFloat64(v_1.AuxInt)
19841 v.reset(OpConstBool)
19842 v.AuxInt = boolToAuxInt(c != d)
19843 return true
19844 }
19845 break
19846 }
19847 return false
19848 }
19849 func rewriteValuegeneric_OpNeq8(v *Value) bool {
19850 v_1 := v.Args[1]
19851 v_0 := v.Args[0]
19852 b := v.Block
19853 typ := &b.Func.Config.Types
19854
19855
19856 for {
19857 x := v_0
19858 if x != v_1 {
19859 break
19860 }
19861 v.reset(OpConstBool)
19862 v.AuxInt = boolToAuxInt(false)
19863 return true
19864 }
19865
19866
19867 for {
19868 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19869 if v_0.Op != OpConst8 {
19870 continue
19871 }
19872 t := v_0.Type
19873 c := auxIntToInt8(v_0.AuxInt)
19874 if v_1.Op != OpAdd8 {
19875 continue
19876 }
19877 _ = v_1.Args[1]
19878 v_1_0 := v_1.Args[0]
19879 v_1_1 := v_1.Args[1]
19880 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19881 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
19882 continue
19883 }
19884 d := auxIntToInt8(v_1_0.AuxInt)
19885 x := v_1_1
19886 v.reset(OpNeq8)
19887 v0 := b.NewValue0(v.Pos, OpConst8, t)
19888 v0.AuxInt = int8ToAuxInt(c - d)
19889 v.AddArg2(v0, x)
19890 return true
19891 }
19892 }
19893 break
19894 }
19895
19896
19897 for {
19898 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19899 if v_0.Op != OpConst8 {
19900 continue
19901 }
19902 c := auxIntToInt8(v_0.AuxInt)
19903 if v_1.Op != OpConst8 {
19904 continue
19905 }
19906 d := auxIntToInt8(v_1.AuxInt)
19907 v.reset(OpConstBool)
19908 v.AuxInt = boolToAuxInt(c != d)
19909 return true
19910 }
19911 break
19912 }
19913
19914
19915
19916 for {
19917 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19918 n := v_0
19919 if v_1.Op != OpLsh8x64 {
19920 continue
19921 }
19922 _ = v_1.Args[1]
19923 v_1_0 := v_1.Args[0]
19924 if v_1_0.Op != OpRsh8x64 {
19925 continue
19926 }
19927 _ = v_1_0.Args[1]
19928 v_1_0_0 := v_1_0.Args[0]
19929 if v_1_0_0.Op != OpAdd8 {
19930 continue
19931 }
19932 t := v_1_0_0.Type
19933 _ = v_1_0_0.Args[1]
19934 v_1_0_0_0 := v_1_0_0.Args[0]
19935 v_1_0_0_1 := v_1_0_0.Args[1]
19936 for _i1 := 0; _i1 <= 1; _i1, v_1_0_0_0, v_1_0_0_1 = _i1+1, v_1_0_0_1, v_1_0_0_0 {
19937 if n != v_1_0_0_0 || v_1_0_0_1.Op != OpRsh8Ux64 || v_1_0_0_1.Type != t {
19938 continue
19939 }
19940 _ = v_1_0_0_1.Args[1]
19941 v_1_0_0_1_0 := v_1_0_0_1.Args[0]
19942 if v_1_0_0_1_0.Op != OpRsh8x64 || v_1_0_0_1_0.Type != t {
19943 continue
19944 }
19945 _ = v_1_0_0_1_0.Args[1]
19946 if n != v_1_0_0_1_0.Args[0] {
19947 continue
19948 }
19949 v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1]
19950 if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || auxIntToInt64(v_1_0_0_1_0_1.AuxInt) != 7 {
19951 continue
19952 }
19953 v_1_0_0_1_1 := v_1_0_0_1.Args[1]
19954 if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 {
19955 continue
19956 }
19957 kbar := auxIntToInt64(v_1_0_0_1_1.AuxInt)
19958 v_1_0_1 := v_1_0.Args[1]
19959 if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 {
19960 continue
19961 }
19962 k := auxIntToInt64(v_1_0_1.AuxInt)
19963 v_1_1 := v_1.Args[1]
19964 if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || auxIntToInt64(v_1_1.AuxInt) != k || !(k > 0 && k < 7 && kbar == 8-k) {
19965 continue
19966 }
19967 v.reset(OpNeq8)
19968 v0 := b.NewValue0(v.Pos, OpAnd8, t)
19969 v1 := b.NewValue0(v.Pos, OpConst8, t)
19970 v1.AuxInt = int8ToAuxInt(1<<uint(k) - 1)
19971 v0.AddArg2(n, v1)
19972 v2 := b.NewValue0(v.Pos, OpConst8, t)
19973 v2.AuxInt = int8ToAuxInt(0)
19974 v.AddArg2(v0, v2)
19975 return true
19976 }
19977 }
19978 break
19979 }
19980
19981
19982
19983 for {
19984 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19985 s := v_0
19986 if s.Op != OpSub8 {
19987 continue
19988 }
19989 y := s.Args[1]
19990 x := s.Args[0]
19991 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(s.Uses == 1) {
19992 continue
19993 }
19994 v.reset(OpNeq8)
19995 v.AddArg2(x, y)
19996 return true
19997 }
19998 break
19999 }
20000
20001
20002
20003 for {
20004 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20005 if v_0.Op != OpAnd8 {
20006 continue
20007 }
20008 t := v_0.Type
20009 _ = v_0.Args[1]
20010 v_0_0 := v_0.Args[0]
20011 v_0_1 := v_0.Args[1]
20012 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
20013 x := v_0_0
20014 if v_0_1.Op != OpConst8 || v_0_1.Type != t {
20015 continue
20016 }
20017 y := auxIntToInt8(v_0_1.AuxInt)
20018 if v_1.Op != OpConst8 || v_1.Type != t || auxIntToInt8(v_1.AuxInt) != y || !(oneBit8(y)) {
20019 continue
20020 }
20021 v.reset(OpEq8)
20022 v0 := b.NewValue0(v.Pos, OpAnd8, t)
20023 v1 := b.NewValue0(v.Pos, OpConst8, t)
20024 v1.AuxInt = int8ToAuxInt(y)
20025 v0.AddArg2(x, v1)
20026 v2 := b.NewValue0(v.Pos, OpConst8, t)
20027 v2.AuxInt = int8ToAuxInt(0)
20028 v.AddArg2(v0, v2)
20029 return true
20030 }
20031 }
20032 break
20033 }
20034 return false
20035 }
20036 func rewriteValuegeneric_OpNeqB(v *Value) bool {
20037 v_1 := v.Args[1]
20038 v_0 := v.Args[0]
20039
20040
20041 for {
20042 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20043 if v_0.Op != OpConstBool {
20044 continue
20045 }
20046 c := auxIntToBool(v_0.AuxInt)
20047 if v_1.Op != OpConstBool {
20048 continue
20049 }
20050 d := auxIntToBool(v_1.AuxInt)
20051 v.reset(OpConstBool)
20052 v.AuxInt = boolToAuxInt(c != d)
20053 return true
20054 }
20055 break
20056 }
20057
20058
20059 for {
20060 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20061 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
20062 continue
20063 }
20064 x := v_1
20065 v.copyOf(x)
20066 return true
20067 }
20068 break
20069 }
20070
20071
20072 for {
20073 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20074 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
20075 continue
20076 }
20077 x := v_1
20078 v.reset(OpNot)
20079 v.AddArg(x)
20080 return true
20081 }
20082 break
20083 }
20084
20085
20086 for {
20087 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20088 if v_0.Op != OpNot {
20089 continue
20090 }
20091 x := v_0.Args[0]
20092 if v_1.Op != OpNot {
20093 continue
20094 }
20095 y := v_1.Args[0]
20096 v.reset(OpNeqB)
20097 v.AddArg2(x, y)
20098 return true
20099 }
20100 break
20101 }
20102 return false
20103 }
20104 func rewriteValuegeneric_OpNeqInter(v *Value) bool {
20105 v_1 := v.Args[1]
20106 v_0 := v.Args[0]
20107 b := v.Block
20108 typ := &b.Func.Config.Types
20109
20110
20111 for {
20112 x := v_0
20113 y := v_1
20114 v.reset(OpNeqPtr)
20115 v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
20116 v0.AddArg(x)
20117 v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
20118 v1.AddArg(y)
20119 v.AddArg2(v0, v1)
20120 return true
20121 }
20122 }
20123 func rewriteValuegeneric_OpNeqPtr(v *Value) bool {
20124 v_1 := v.Args[1]
20125 v_0 := v.Args[0]
20126
20127
20128 for {
20129 x := v_0
20130 if x != v_1 {
20131 break
20132 }
20133 v.reset(OpConstBool)
20134 v.AuxInt = boolToAuxInt(false)
20135 return true
20136 }
20137
20138
20139 for {
20140 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20141 if v_0.Op != OpAddr {
20142 continue
20143 }
20144 x := auxToSym(v_0.Aux)
20145 if v_1.Op != OpAddr {
20146 continue
20147 }
20148 y := auxToSym(v_1.Aux)
20149 v.reset(OpConstBool)
20150 v.AuxInt = boolToAuxInt(x != y)
20151 return true
20152 }
20153 break
20154 }
20155
20156
20157 for {
20158 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20159 if v_0.Op != OpAddr {
20160 continue
20161 }
20162 x := auxToSym(v_0.Aux)
20163 if v_1.Op != OpOffPtr {
20164 continue
20165 }
20166 o := auxIntToInt64(v_1.AuxInt)
20167 v_1_0 := v_1.Args[0]
20168 if v_1_0.Op != OpAddr {
20169 continue
20170 }
20171 y := auxToSym(v_1_0.Aux)
20172 v.reset(OpConstBool)
20173 v.AuxInt = boolToAuxInt(x != y || o != 0)
20174 return true
20175 }
20176 break
20177 }
20178
20179
20180 for {
20181 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20182 if v_0.Op != OpOffPtr {
20183 continue
20184 }
20185 o1 := auxIntToInt64(v_0.AuxInt)
20186 v_0_0 := v_0.Args[0]
20187 if v_0_0.Op != OpAddr {
20188 continue
20189 }
20190 x := auxToSym(v_0_0.Aux)
20191 if v_1.Op != OpOffPtr {
20192 continue
20193 }
20194 o2 := auxIntToInt64(v_1.AuxInt)
20195 v_1_0 := v_1.Args[0]
20196 if v_1_0.Op != OpAddr {
20197 continue
20198 }
20199 y := auxToSym(v_1_0.Aux)
20200 v.reset(OpConstBool)
20201 v.AuxInt = boolToAuxInt(x != y || o1 != o2)
20202 return true
20203 }
20204 break
20205 }
20206
20207
20208 for {
20209 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20210 if v_0.Op != OpLocalAddr {
20211 continue
20212 }
20213 x := auxToSym(v_0.Aux)
20214 if v_1.Op != OpLocalAddr {
20215 continue
20216 }
20217 y := auxToSym(v_1.Aux)
20218 v.reset(OpConstBool)
20219 v.AuxInt = boolToAuxInt(x != y)
20220 return true
20221 }
20222 break
20223 }
20224
20225
20226 for {
20227 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20228 if v_0.Op != OpLocalAddr {
20229 continue
20230 }
20231 x := auxToSym(v_0.Aux)
20232 if v_1.Op != OpOffPtr {
20233 continue
20234 }
20235 o := auxIntToInt64(v_1.AuxInt)
20236 v_1_0 := v_1.Args[0]
20237 if v_1_0.Op != OpLocalAddr {
20238 continue
20239 }
20240 y := auxToSym(v_1_0.Aux)
20241 v.reset(OpConstBool)
20242 v.AuxInt = boolToAuxInt(x != y || o != 0)
20243 return true
20244 }
20245 break
20246 }
20247
20248
20249 for {
20250 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20251 if v_0.Op != OpOffPtr {
20252 continue
20253 }
20254 o1 := auxIntToInt64(v_0.AuxInt)
20255 v_0_0 := v_0.Args[0]
20256 if v_0_0.Op != OpLocalAddr {
20257 continue
20258 }
20259 x := auxToSym(v_0_0.Aux)
20260 if v_1.Op != OpOffPtr {
20261 continue
20262 }
20263 o2 := auxIntToInt64(v_1.AuxInt)
20264 v_1_0 := v_1.Args[0]
20265 if v_1_0.Op != OpLocalAddr {
20266 continue
20267 }
20268 y := auxToSym(v_1_0.Aux)
20269 v.reset(OpConstBool)
20270 v.AuxInt = boolToAuxInt(x != y || o1 != o2)
20271 return true
20272 }
20273 break
20274 }
20275
20276
20277
20278 for {
20279 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20280 if v_0.Op != OpOffPtr {
20281 continue
20282 }
20283 o1 := auxIntToInt64(v_0.AuxInt)
20284 p1 := v_0.Args[0]
20285 p2 := v_1
20286 if !(isSamePtr(p1, p2)) {
20287 continue
20288 }
20289 v.reset(OpConstBool)
20290 v.AuxInt = boolToAuxInt(o1 != 0)
20291 return true
20292 }
20293 break
20294 }
20295
20296
20297
20298 for {
20299 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20300 if v_0.Op != OpOffPtr {
20301 continue
20302 }
20303 o1 := auxIntToInt64(v_0.AuxInt)
20304 p1 := v_0.Args[0]
20305 if v_1.Op != OpOffPtr {
20306 continue
20307 }
20308 o2 := auxIntToInt64(v_1.AuxInt)
20309 p2 := v_1.Args[0]
20310 if !(isSamePtr(p1, p2)) {
20311 continue
20312 }
20313 v.reset(OpConstBool)
20314 v.AuxInt = boolToAuxInt(o1 != o2)
20315 return true
20316 }
20317 break
20318 }
20319
20320
20321 for {
20322 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20323 if v_0.Op != OpConst32 {
20324 continue
20325 }
20326 c := auxIntToInt32(v_0.AuxInt)
20327 if v_1.Op != OpConst32 {
20328 continue
20329 }
20330 d := auxIntToInt32(v_1.AuxInt)
20331 v.reset(OpConstBool)
20332 v.AuxInt = boolToAuxInt(c != d)
20333 return true
20334 }
20335 break
20336 }
20337
20338
20339 for {
20340 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20341 if v_0.Op != OpConst64 {
20342 continue
20343 }
20344 c := auxIntToInt64(v_0.AuxInt)
20345 if v_1.Op != OpConst64 {
20346 continue
20347 }
20348 d := auxIntToInt64(v_1.AuxInt)
20349 v.reset(OpConstBool)
20350 v.AuxInt = boolToAuxInt(c != d)
20351 return true
20352 }
20353 break
20354 }
20355
20356
20357 for {
20358 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20359 if v_0.Op != OpConvert {
20360 continue
20361 }
20362 v_0_0 := v_0.Args[0]
20363 if v_0_0.Op != OpAddr {
20364 continue
20365 }
20366 x := auxToSym(v_0_0.Aux)
20367 if v_1.Op != OpAddr {
20368 continue
20369 }
20370 y := auxToSym(v_1.Aux)
20371 v.reset(OpConstBool)
20372 v.AuxInt = boolToAuxInt(x != y)
20373 return true
20374 }
20375 break
20376 }
20377
20378
20379 for {
20380 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20381 if v_0.Op != OpLocalAddr || v_1.Op != OpAddr {
20382 continue
20383 }
20384 v.reset(OpConstBool)
20385 v.AuxInt = boolToAuxInt(true)
20386 return true
20387 }
20388 break
20389 }
20390
20391
20392 for {
20393 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20394 if v_0.Op != OpOffPtr {
20395 continue
20396 }
20397 v_0_0 := v_0.Args[0]
20398 if v_0_0.Op != OpLocalAddr || v_1.Op != OpAddr {
20399 continue
20400 }
20401 v.reset(OpConstBool)
20402 v.AuxInt = boolToAuxInt(true)
20403 return true
20404 }
20405 break
20406 }
20407
20408
20409 for {
20410 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20411 if v_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
20412 continue
20413 }
20414 v_1_0 := v_1.Args[0]
20415 if v_1_0.Op != OpAddr {
20416 continue
20417 }
20418 v.reset(OpConstBool)
20419 v.AuxInt = boolToAuxInt(true)
20420 return true
20421 }
20422 break
20423 }
20424
20425
20426 for {
20427 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20428 if v_0.Op != OpOffPtr {
20429 continue
20430 }
20431 v_0_0 := v_0.Args[0]
20432 if v_0_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
20433 continue
20434 }
20435 v_1_0 := v_1.Args[0]
20436 if v_1_0.Op != OpAddr {
20437 continue
20438 }
20439 v.reset(OpConstBool)
20440 v.AuxInt = boolToAuxInt(true)
20441 return true
20442 }
20443 break
20444 }
20445
20446
20447
20448 for {
20449 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20450 if v_0.Op != OpAddPtr {
20451 continue
20452 }
20453 o1 := v_0.Args[1]
20454 p1 := v_0.Args[0]
20455 p2 := v_1
20456 if !(isSamePtr(p1, p2)) {
20457 continue
20458 }
20459 v.reset(OpIsNonNil)
20460 v.AddArg(o1)
20461 return true
20462 }
20463 break
20464 }
20465
20466
20467 for {
20468 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20469 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
20470 continue
20471 }
20472 p := v_1
20473 v.reset(OpIsNonNil)
20474 v.AddArg(p)
20475 return true
20476 }
20477 break
20478 }
20479
20480
20481 for {
20482 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20483 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
20484 continue
20485 }
20486 p := v_1
20487 v.reset(OpIsNonNil)
20488 v.AddArg(p)
20489 return true
20490 }
20491 break
20492 }
20493
20494
20495 for {
20496 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20497 if v_0.Op != OpConstNil {
20498 continue
20499 }
20500 p := v_1
20501 v.reset(OpIsNonNil)
20502 v.AddArg(p)
20503 return true
20504 }
20505 break
20506 }
20507 return false
20508 }
20509 func rewriteValuegeneric_OpNeqSlice(v *Value) bool {
20510 v_1 := v.Args[1]
20511 v_0 := v.Args[0]
20512 b := v.Block
20513 typ := &b.Func.Config.Types
20514
20515
20516 for {
20517 x := v_0
20518 y := v_1
20519 v.reset(OpNeqPtr)
20520 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
20521 v0.AddArg(x)
20522 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
20523 v1.AddArg(y)
20524 v.AddArg2(v0, v1)
20525 return true
20526 }
20527 }
20528 func rewriteValuegeneric_OpNilCheck(v *Value) bool {
20529 v_1 := v.Args[1]
20530 v_0 := v.Args[0]
20531 b := v.Block
20532 fe := b.Func.fe
20533
20534
20535 for {
20536 ptr := v_0
20537 if ptr.Op != OpGetG {
20538 break
20539 }
20540 mem := ptr.Args[0]
20541 if mem != v_1 {
20542 break
20543 }
20544 v.copyOf(ptr)
20545 return true
20546 }
20547
20548
20549
20550 for {
20551 ptr := v_0
20552 if ptr.Op != OpSelectN || auxIntToInt64(ptr.AuxInt) != 0 {
20553 break
20554 }
20555 call := ptr.Args[0]
20556 if call.Op != OpStaticLECall || len(call.Args) != 2 || !(isSameCall(call.Aux, "runtime.newobject") && warnRule(fe.Debug_checknil(), v, "removed nil check")) {
20557 break
20558 }
20559 v.copyOf(ptr)
20560 return true
20561 }
20562
20563
20564
20565 for {
20566 ptr := v_0
20567 if ptr.Op != OpOffPtr {
20568 break
20569 }
20570 ptr_0 := ptr.Args[0]
20571 if ptr_0.Op != OpSelectN || auxIntToInt64(ptr_0.AuxInt) != 0 {
20572 break
20573 }
20574 call := ptr_0.Args[0]
20575 if call.Op != OpStaticLECall || len(call.Args) != 2 || !(isSameCall(call.Aux, "runtime.newobject") && warnRule(fe.Debug_checknil(), v, "removed nil check")) {
20576 break
20577 }
20578 v.copyOf(ptr)
20579 return true
20580 }
20581
20582
20583 for {
20584 ptr := v_0
20585 if ptr.Op != OpAddr {
20586 break
20587 }
20588 ptr_0 := ptr.Args[0]
20589 if ptr_0.Op != OpSB {
20590 break
20591 }
20592 v.copyOf(ptr)
20593 return true
20594 }
20595
20596
20597 for {
20598 ptr := v_0
20599 if ptr.Op != OpConvert {
20600 break
20601 }
20602 ptr_0 := ptr.Args[0]
20603 if ptr_0.Op != OpAddr {
20604 break
20605 }
20606 ptr_0_0 := ptr_0.Args[0]
20607 if ptr_0_0.Op != OpSB {
20608 break
20609 }
20610 v.copyOf(ptr)
20611 return true
20612 }
20613
20614
20615 for {
20616 ptr := v_0
20617 if ptr.Op != OpNilCheck {
20618 break
20619 }
20620 v.copyOf(ptr)
20621 return true
20622 }
20623 return false
20624 }
20625 func rewriteValuegeneric_OpNot(v *Value) bool {
20626 v_0 := v.Args[0]
20627
20628
20629 for {
20630 if v_0.Op != OpConstBool {
20631 break
20632 }
20633 c := auxIntToBool(v_0.AuxInt)
20634 v.reset(OpConstBool)
20635 v.AuxInt = boolToAuxInt(!c)
20636 return true
20637 }
20638
20639
20640 for {
20641 if v_0.Op != OpEq64 {
20642 break
20643 }
20644 y := v_0.Args[1]
20645 x := v_0.Args[0]
20646 v.reset(OpNeq64)
20647 v.AddArg2(x, y)
20648 return true
20649 }
20650
20651
20652 for {
20653 if v_0.Op != OpEq32 {
20654 break
20655 }
20656 y := v_0.Args[1]
20657 x := v_0.Args[0]
20658 v.reset(OpNeq32)
20659 v.AddArg2(x, y)
20660 return true
20661 }
20662
20663
20664 for {
20665 if v_0.Op != OpEq16 {
20666 break
20667 }
20668 y := v_0.Args[1]
20669 x := v_0.Args[0]
20670 v.reset(OpNeq16)
20671 v.AddArg2(x, y)
20672 return true
20673 }
20674
20675
20676 for {
20677 if v_0.Op != OpEq8 {
20678 break
20679 }
20680 y := v_0.Args[1]
20681 x := v_0.Args[0]
20682 v.reset(OpNeq8)
20683 v.AddArg2(x, y)
20684 return true
20685 }
20686
20687
20688 for {
20689 if v_0.Op != OpEqB {
20690 break
20691 }
20692 y := v_0.Args[1]
20693 x := v_0.Args[0]
20694 v.reset(OpNeqB)
20695 v.AddArg2(x, y)
20696 return true
20697 }
20698
20699
20700 for {
20701 if v_0.Op != OpEqPtr {
20702 break
20703 }
20704 y := v_0.Args[1]
20705 x := v_0.Args[0]
20706 v.reset(OpNeqPtr)
20707 v.AddArg2(x, y)
20708 return true
20709 }
20710
20711
20712 for {
20713 if v_0.Op != OpEq64F {
20714 break
20715 }
20716 y := v_0.Args[1]
20717 x := v_0.Args[0]
20718 v.reset(OpNeq64F)
20719 v.AddArg2(x, y)
20720 return true
20721 }
20722
20723
20724 for {
20725 if v_0.Op != OpEq32F {
20726 break
20727 }
20728 y := v_0.Args[1]
20729 x := v_0.Args[0]
20730 v.reset(OpNeq32F)
20731 v.AddArg2(x, y)
20732 return true
20733 }
20734
20735
20736 for {
20737 if v_0.Op != OpNeq64 {
20738 break
20739 }
20740 y := v_0.Args[1]
20741 x := v_0.Args[0]
20742 v.reset(OpEq64)
20743 v.AddArg2(x, y)
20744 return true
20745 }
20746
20747
20748 for {
20749 if v_0.Op != OpNeq32 {
20750 break
20751 }
20752 y := v_0.Args[1]
20753 x := v_0.Args[0]
20754 v.reset(OpEq32)
20755 v.AddArg2(x, y)
20756 return true
20757 }
20758
20759
20760 for {
20761 if v_0.Op != OpNeq16 {
20762 break
20763 }
20764 y := v_0.Args[1]
20765 x := v_0.Args[0]
20766 v.reset(OpEq16)
20767 v.AddArg2(x, y)
20768 return true
20769 }
20770
20771
20772 for {
20773 if v_0.Op != OpNeq8 {
20774 break
20775 }
20776 y := v_0.Args[1]
20777 x := v_0.Args[0]
20778 v.reset(OpEq8)
20779 v.AddArg2(x, y)
20780 return true
20781 }
20782
20783
20784 for {
20785 if v_0.Op != OpNeqB {
20786 break
20787 }
20788 y := v_0.Args[1]
20789 x := v_0.Args[0]
20790 v.reset(OpEqB)
20791 v.AddArg2(x, y)
20792 return true
20793 }
20794
20795
20796 for {
20797 if v_0.Op != OpNeqPtr {
20798 break
20799 }
20800 y := v_0.Args[1]
20801 x := v_0.Args[0]
20802 v.reset(OpEqPtr)
20803 v.AddArg2(x, y)
20804 return true
20805 }
20806
20807
20808 for {
20809 if v_0.Op != OpNeq64F {
20810 break
20811 }
20812 y := v_0.Args[1]
20813 x := v_0.Args[0]
20814 v.reset(OpEq64F)
20815 v.AddArg2(x, y)
20816 return true
20817 }
20818
20819
20820 for {
20821 if v_0.Op != OpNeq32F {
20822 break
20823 }
20824 y := v_0.Args[1]
20825 x := v_0.Args[0]
20826 v.reset(OpEq32F)
20827 v.AddArg2(x, y)
20828 return true
20829 }
20830
20831
20832 for {
20833 if v_0.Op != OpLess64 {
20834 break
20835 }
20836 y := v_0.Args[1]
20837 x := v_0.Args[0]
20838 v.reset(OpLeq64)
20839 v.AddArg2(y, x)
20840 return true
20841 }
20842
20843
20844 for {
20845 if v_0.Op != OpLess32 {
20846 break
20847 }
20848 y := v_0.Args[1]
20849 x := v_0.Args[0]
20850 v.reset(OpLeq32)
20851 v.AddArg2(y, x)
20852 return true
20853 }
20854
20855
20856 for {
20857 if v_0.Op != OpLess16 {
20858 break
20859 }
20860 y := v_0.Args[1]
20861 x := v_0.Args[0]
20862 v.reset(OpLeq16)
20863 v.AddArg2(y, x)
20864 return true
20865 }
20866
20867
20868 for {
20869 if v_0.Op != OpLess8 {
20870 break
20871 }
20872 y := v_0.Args[1]
20873 x := v_0.Args[0]
20874 v.reset(OpLeq8)
20875 v.AddArg2(y, x)
20876 return true
20877 }
20878
20879
20880 for {
20881 if v_0.Op != OpLess64U {
20882 break
20883 }
20884 y := v_0.Args[1]
20885 x := v_0.Args[0]
20886 v.reset(OpLeq64U)
20887 v.AddArg2(y, x)
20888 return true
20889 }
20890
20891
20892 for {
20893 if v_0.Op != OpLess32U {
20894 break
20895 }
20896 y := v_0.Args[1]
20897 x := v_0.Args[0]
20898 v.reset(OpLeq32U)
20899 v.AddArg2(y, x)
20900 return true
20901 }
20902
20903
20904 for {
20905 if v_0.Op != OpLess16U {
20906 break
20907 }
20908 y := v_0.Args[1]
20909 x := v_0.Args[0]
20910 v.reset(OpLeq16U)
20911 v.AddArg2(y, x)
20912 return true
20913 }
20914
20915
20916 for {
20917 if v_0.Op != OpLess8U {
20918 break
20919 }
20920 y := v_0.Args[1]
20921 x := v_0.Args[0]
20922 v.reset(OpLeq8U)
20923 v.AddArg2(y, x)
20924 return true
20925 }
20926
20927
20928 for {
20929 if v_0.Op != OpLeq64 {
20930 break
20931 }
20932 y := v_0.Args[1]
20933 x := v_0.Args[0]
20934 v.reset(OpLess64)
20935 v.AddArg2(y, x)
20936 return true
20937 }
20938
20939
20940 for {
20941 if v_0.Op != OpLeq32 {
20942 break
20943 }
20944 y := v_0.Args[1]
20945 x := v_0.Args[0]
20946 v.reset(OpLess32)
20947 v.AddArg2(y, x)
20948 return true
20949 }
20950
20951
20952 for {
20953 if v_0.Op != OpLeq16 {
20954 break
20955 }
20956 y := v_0.Args[1]
20957 x := v_0.Args[0]
20958 v.reset(OpLess16)
20959 v.AddArg2(y, x)
20960 return true
20961 }
20962
20963
20964 for {
20965 if v_0.Op != OpLeq8 {
20966 break
20967 }
20968 y := v_0.Args[1]
20969 x := v_0.Args[0]
20970 v.reset(OpLess8)
20971 v.AddArg2(y, x)
20972 return true
20973 }
20974
20975
20976 for {
20977 if v_0.Op != OpLeq64U {
20978 break
20979 }
20980 y := v_0.Args[1]
20981 x := v_0.Args[0]
20982 v.reset(OpLess64U)
20983 v.AddArg2(y, x)
20984 return true
20985 }
20986
20987
20988 for {
20989 if v_0.Op != OpLeq32U {
20990 break
20991 }
20992 y := v_0.Args[1]
20993 x := v_0.Args[0]
20994 v.reset(OpLess32U)
20995 v.AddArg2(y, x)
20996 return true
20997 }
20998
20999
21000 for {
21001 if v_0.Op != OpLeq16U {
21002 break
21003 }
21004 y := v_0.Args[1]
21005 x := v_0.Args[0]
21006 v.reset(OpLess16U)
21007 v.AddArg2(y, x)
21008 return true
21009 }
21010
21011
21012 for {
21013 if v_0.Op != OpLeq8U {
21014 break
21015 }
21016 y := v_0.Args[1]
21017 x := v_0.Args[0]
21018 v.reset(OpLess8U)
21019 v.AddArg2(y, x)
21020 return true
21021 }
21022 return false
21023 }
21024 func rewriteValuegeneric_OpOffPtr(v *Value) bool {
21025 v_0 := v.Args[0]
21026
21027
21028 for {
21029 x := auxIntToInt64(v.AuxInt)
21030 if v_0.Op != OpOffPtr {
21031 break
21032 }
21033 y := auxIntToInt64(v_0.AuxInt)
21034 p := v_0.Args[0]
21035 v.reset(OpOffPtr)
21036 v.AuxInt = int64ToAuxInt(x + y)
21037 v.AddArg(p)
21038 return true
21039 }
21040
21041
21042
21043 for {
21044 if auxIntToInt64(v.AuxInt) != 0 {
21045 break
21046 }
21047 p := v_0
21048 if !(v.Type.Compare(p.Type) == types.CMPeq) {
21049 break
21050 }
21051 v.copyOf(p)
21052 return true
21053 }
21054 return false
21055 }
21056 func rewriteValuegeneric_OpOr16(v *Value) bool {
21057 v_1 := v.Args[1]
21058 v_0 := v.Args[0]
21059 b := v.Block
21060 config := b.Func.Config
21061
21062
21063 for {
21064 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21065 if v_0.Op != OpConst16 {
21066 continue
21067 }
21068 c := auxIntToInt16(v_0.AuxInt)
21069 if v_1.Op != OpConst16 {
21070 continue
21071 }
21072 d := auxIntToInt16(v_1.AuxInt)
21073 v.reset(OpConst16)
21074 v.AuxInt = int16ToAuxInt(c | d)
21075 return true
21076 }
21077 break
21078 }
21079
21080
21081 for {
21082 t := v.Type
21083 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21084 if v_0.Op != OpCom16 {
21085 continue
21086 }
21087 x := v_0.Args[0]
21088 if v_1.Op != OpCom16 {
21089 continue
21090 }
21091 y := v_1.Args[0]
21092 v.reset(OpCom16)
21093 v0 := b.NewValue0(v.Pos, OpAnd16, t)
21094 v0.AddArg2(x, y)
21095 v.AddArg(v0)
21096 return true
21097 }
21098 break
21099 }
21100
21101
21102 for {
21103 x := v_0
21104 if x != v_1 {
21105 break
21106 }
21107 v.copyOf(x)
21108 return true
21109 }
21110
21111
21112 for {
21113 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21114 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
21115 continue
21116 }
21117 x := v_1
21118 v.copyOf(x)
21119 return true
21120 }
21121 break
21122 }
21123
21124
21125 for {
21126 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21127 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
21128 continue
21129 }
21130 v.reset(OpConst16)
21131 v.AuxInt = int16ToAuxInt(-1)
21132 return true
21133 }
21134 break
21135 }
21136
21137
21138 for {
21139 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21140 if v_0.Op != OpCom16 {
21141 continue
21142 }
21143 x := v_0.Args[0]
21144 if x != v_1 {
21145 continue
21146 }
21147 v.reset(OpConst16)
21148 v.AuxInt = int16ToAuxInt(-1)
21149 return true
21150 }
21151 break
21152 }
21153
21154
21155 for {
21156 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21157 x := v_0
21158 if v_1.Op != OpOr16 {
21159 continue
21160 }
21161 _ = v_1.Args[1]
21162 v_1_0 := v_1.Args[0]
21163 v_1_1 := v_1.Args[1]
21164 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21165 if x != v_1_0 {
21166 continue
21167 }
21168 y := v_1_1
21169 v.reset(OpOr16)
21170 v.AddArg2(x, y)
21171 return true
21172 }
21173 }
21174 break
21175 }
21176
21177
21178
21179 for {
21180 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21181 if v_0.Op != OpAnd16 {
21182 continue
21183 }
21184 _ = v_0.Args[1]
21185 v_0_0 := v_0.Args[0]
21186 v_0_1 := v_0.Args[1]
21187 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21188 x := v_0_0
21189 if v_0_1.Op != OpConst16 {
21190 continue
21191 }
21192 c2 := auxIntToInt16(v_0_1.AuxInt)
21193 if v_1.Op != OpConst16 {
21194 continue
21195 }
21196 t := v_1.Type
21197 c1 := auxIntToInt16(v_1.AuxInt)
21198 if !(^(c1 | c2) == 0) {
21199 continue
21200 }
21201 v.reset(OpOr16)
21202 v0 := b.NewValue0(v.Pos, OpConst16, t)
21203 v0.AuxInt = int16ToAuxInt(c1)
21204 v.AddArg2(v0, x)
21205 return true
21206 }
21207 }
21208 break
21209 }
21210
21211
21212
21213 for {
21214 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21215 if v_0.Op != OpOr16 {
21216 continue
21217 }
21218 _ = v_0.Args[1]
21219 v_0_0 := v_0.Args[0]
21220 v_0_1 := v_0.Args[1]
21221 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21222 i := v_0_0
21223 if i.Op != OpConst16 {
21224 continue
21225 }
21226 t := i.Type
21227 z := v_0_1
21228 x := v_1
21229 if !(z.Op != OpConst16 && x.Op != OpConst16) {
21230 continue
21231 }
21232 v.reset(OpOr16)
21233 v0 := b.NewValue0(v.Pos, OpOr16, t)
21234 v0.AddArg2(z, x)
21235 v.AddArg2(i, v0)
21236 return true
21237 }
21238 }
21239 break
21240 }
21241
21242
21243 for {
21244 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21245 if v_0.Op != OpConst16 {
21246 continue
21247 }
21248 t := v_0.Type
21249 c := auxIntToInt16(v_0.AuxInt)
21250 if v_1.Op != OpOr16 {
21251 continue
21252 }
21253 _ = v_1.Args[1]
21254 v_1_0 := v_1.Args[0]
21255 v_1_1 := v_1.Args[1]
21256 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21257 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
21258 continue
21259 }
21260 d := auxIntToInt16(v_1_0.AuxInt)
21261 x := v_1_1
21262 v.reset(OpOr16)
21263 v0 := b.NewValue0(v.Pos, OpConst16, t)
21264 v0.AuxInt = int16ToAuxInt(c | d)
21265 v.AddArg2(v0, x)
21266 return true
21267 }
21268 }
21269 break
21270 }
21271
21272
21273
21274 for {
21275 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21276 if v_0.Op != OpLsh16x64 {
21277 continue
21278 }
21279 _ = v_0.Args[1]
21280 x := v_0.Args[0]
21281 z := v_0.Args[1]
21282 if z.Op != OpConst64 {
21283 continue
21284 }
21285 c := auxIntToInt64(z.AuxInt)
21286 if v_1.Op != OpRsh16Ux64 {
21287 continue
21288 }
21289 _ = v_1.Args[1]
21290 if x != v_1.Args[0] {
21291 continue
21292 }
21293 v_1_1 := v_1.Args[1]
21294 if v_1_1.Op != OpConst64 {
21295 continue
21296 }
21297 d := auxIntToInt64(v_1_1.AuxInt)
21298 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
21299 continue
21300 }
21301 v.reset(OpRotateLeft16)
21302 v.AddArg2(x, z)
21303 return true
21304 }
21305 break
21306 }
21307
21308
21309
21310 for {
21311 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21312 left := v_0
21313 if left.Op != OpLsh16x64 {
21314 continue
21315 }
21316 y := left.Args[1]
21317 x := left.Args[0]
21318 right := v_1
21319 if right.Op != OpRsh16Ux64 {
21320 continue
21321 }
21322 _ = right.Args[1]
21323 if x != right.Args[0] {
21324 continue
21325 }
21326 right_1 := right.Args[1]
21327 if right_1.Op != OpSub64 {
21328 continue
21329 }
21330 _ = right_1.Args[1]
21331 right_1_0 := right_1.Args[0]
21332 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21333 continue
21334 }
21335 v.reset(OpRotateLeft16)
21336 v.AddArg2(x, y)
21337 return true
21338 }
21339 break
21340 }
21341
21342
21343
21344 for {
21345 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21346 left := v_0
21347 if left.Op != OpLsh16x32 {
21348 continue
21349 }
21350 y := left.Args[1]
21351 x := left.Args[0]
21352 right := v_1
21353 if right.Op != OpRsh16Ux32 {
21354 continue
21355 }
21356 _ = right.Args[1]
21357 if x != right.Args[0] {
21358 continue
21359 }
21360 right_1 := right.Args[1]
21361 if right_1.Op != OpSub32 {
21362 continue
21363 }
21364 _ = right_1.Args[1]
21365 right_1_0 := right_1.Args[0]
21366 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21367 continue
21368 }
21369 v.reset(OpRotateLeft16)
21370 v.AddArg2(x, y)
21371 return true
21372 }
21373 break
21374 }
21375
21376
21377
21378 for {
21379 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21380 left := v_0
21381 if left.Op != OpLsh16x16 {
21382 continue
21383 }
21384 y := left.Args[1]
21385 x := left.Args[0]
21386 right := v_1
21387 if right.Op != OpRsh16Ux16 {
21388 continue
21389 }
21390 _ = right.Args[1]
21391 if x != right.Args[0] {
21392 continue
21393 }
21394 right_1 := right.Args[1]
21395 if right_1.Op != OpSub16 {
21396 continue
21397 }
21398 _ = right_1.Args[1]
21399 right_1_0 := right_1.Args[0]
21400 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21401 continue
21402 }
21403 v.reset(OpRotateLeft16)
21404 v.AddArg2(x, y)
21405 return true
21406 }
21407 break
21408 }
21409
21410
21411
21412 for {
21413 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21414 left := v_0
21415 if left.Op != OpLsh16x8 {
21416 continue
21417 }
21418 y := left.Args[1]
21419 x := left.Args[0]
21420 right := v_1
21421 if right.Op != OpRsh16Ux8 {
21422 continue
21423 }
21424 _ = right.Args[1]
21425 if x != right.Args[0] {
21426 continue
21427 }
21428 right_1 := right.Args[1]
21429 if right_1.Op != OpSub8 {
21430 continue
21431 }
21432 _ = right_1.Args[1]
21433 right_1_0 := right_1.Args[0]
21434 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21435 continue
21436 }
21437 v.reset(OpRotateLeft16)
21438 v.AddArg2(x, y)
21439 return true
21440 }
21441 break
21442 }
21443
21444
21445
21446 for {
21447 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21448 right := v_0
21449 if right.Op != OpRsh16Ux64 {
21450 continue
21451 }
21452 y := right.Args[1]
21453 x := right.Args[0]
21454 left := v_1
21455 if left.Op != OpLsh16x64 {
21456 continue
21457 }
21458 _ = left.Args[1]
21459 if x != left.Args[0] {
21460 continue
21461 }
21462 z := left.Args[1]
21463 if z.Op != OpSub64 {
21464 continue
21465 }
21466 _ = z.Args[1]
21467 z_0 := z.Args[0]
21468 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21469 continue
21470 }
21471 v.reset(OpRotateLeft16)
21472 v.AddArg2(x, z)
21473 return true
21474 }
21475 break
21476 }
21477
21478
21479
21480 for {
21481 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21482 right := v_0
21483 if right.Op != OpRsh16Ux32 {
21484 continue
21485 }
21486 y := right.Args[1]
21487 x := right.Args[0]
21488 left := v_1
21489 if left.Op != OpLsh16x32 {
21490 continue
21491 }
21492 _ = left.Args[1]
21493 if x != left.Args[0] {
21494 continue
21495 }
21496 z := left.Args[1]
21497 if z.Op != OpSub32 {
21498 continue
21499 }
21500 _ = z.Args[1]
21501 z_0 := z.Args[0]
21502 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21503 continue
21504 }
21505 v.reset(OpRotateLeft16)
21506 v.AddArg2(x, z)
21507 return true
21508 }
21509 break
21510 }
21511
21512
21513
21514 for {
21515 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21516 right := v_0
21517 if right.Op != OpRsh16Ux16 {
21518 continue
21519 }
21520 y := right.Args[1]
21521 x := right.Args[0]
21522 left := v_1
21523 if left.Op != OpLsh16x16 {
21524 continue
21525 }
21526 _ = left.Args[1]
21527 if x != left.Args[0] {
21528 continue
21529 }
21530 z := left.Args[1]
21531 if z.Op != OpSub16 {
21532 continue
21533 }
21534 _ = z.Args[1]
21535 z_0 := z.Args[0]
21536 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21537 continue
21538 }
21539 v.reset(OpRotateLeft16)
21540 v.AddArg2(x, z)
21541 return true
21542 }
21543 break
21544 }
21545
21546
21547
21548 for {
21549 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21550 right := v_0
21551 if right.Op != OpRsh16Ux8 {
21552 continue
21553 }
21554 y := right.Args[1]
21555 x := right.Args[0]
21556 left := v_1
21557 if left.Op != OpLsh16x8 {
21558 continue
21559 }
21560 _ = left.Args[1]
21561 if x != left.Args[0] {
21562 continue
21563 }
21564 z := left.Args[1]
21565 if z.Op != OpSub8 {
21566 continue
21567 }
21568 _ = z.Args[1]
21569 z_0 := z.Args[0]
21570 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21571 continue
21572 }
21573 v.reset(OpRotateLeft16)
21574 v.AddArg2(x, z)
21575 return true
21576 }
21577 break
21578 }
21579 return false
21580 }
21581 func rewriteValuegeneric_OpOr32(v *Value) bool {
21582 v_1 := v.Args[1]
21583 v_0 := v.Args[0]
21584 b := v.Block
21585 config := b.Func.Config
21586
21587
21588 for {
21589 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21590 if v_0.Op != OpConst32 {
21591 continue
21592 }
21593 c := auxIntToInt32(v_0.AuxInt)
21594 if v_1.Op != OpConst32 {
21595 continue
21596 }
21597 d := auxIntToInt32(v_1.AuxInt)
21598 v.reset(OpConst32)
21599 v.AuxInt = int32ToAuxInt(c | d)
21600 return true
21601 }
21602 break
21603 }
21604
21605
21606 for {
21607 t := v.Type
21608 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21609 if v_0.Op != OpCom32 {
21610 continue
21611 }
21612 x := v_0.Args[0]
21613 if v_1.Op != OpCom32 {
21614 continue
21615 }
21616 y := v_1.Args[0]
21617 v.reset(OpCom32)
21618 v0 := b.NewValue0(v.Pos, OpAnd32, t)
21619 v0.AddArg2(x, y)
21620 v.AddArg(v0)
21621 return true
21622 }
21623 break
21624 }
21625
21626
21627 for {
21628 x := v_0
21629 if x != v_1 {
21630 break
21631 }
21632 v.copyOf(x)
21633 return true
21634 }
21635
21636
21637 for {
21638 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21639 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
21640 continue
21641 }
21642 x := v_1
21643 v.copyOf(x)
21644 return true
21645 }
21646 break
21647 }
21648
21649
21650 for {
21651 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21652 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
21653 continue
21654 }
21655 v.reset(OpConst32)
21656 v.AuxInt = int32ToAuxInt(-1)
21657 return true
21658 }
21659 break
21660 }
21661
21662
21663 for {
21664 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21665 if v_0.Op != OpCom32 {
21666 continue
21667 }
21668 x := v_0.Args[0]
21669 if x != v_1 {
21670 continue
21671 }
21672 v.reset(OpConst32)
21673 v.AuxInt = int32ToAuxInt(-1)
21674 return true
21675 }
21676 break
21677 }
21678
21679
21680 for {
21681 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21682 x := v_0
21683 if v_1.Op != OpOr32 {
21684 continue
21685 }
21686 _ = v_1.Args[1]
21687 v_1_0 := v_1.Args[0]
21688 v_1_1 := v_1.Args[1]
21689 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21690 if x != v_1_0 {
21691 continue
21692 }
21693 y := v_1_1
21694 v.reset(OpOr32)
21695 v.AddArg2(x, y)
21696 return true
21697 }
21698 }
21699 break
21700 }
21701
21702
21703
21704 for {
21705 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21706 if v_0.Op != OpAnd32 {
21707 continue
21708 }
21709 _ = v_0.Args[1]
21710 v_0_0 := v_0.Args[0]
21711 v_0_1 := v_0.Args[1]
21712 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21713 x := v_0_0
21714 if v_0_1.Op != OpConst32 {
21715 continue
21716 }
21717 c2 := auxIntToInt32(v_0_1.AuxInt)
21718 if v_1.Op != OpConst32 {
21719 continue
21720 }
21721 t := v_1.Type
21722 c1 := auxIntToInt32(v_1.AuxInt)
21723 if !(^(c1 | c2) == 0) {
21724 continue
21725 }
21726 v.reset(OpOr32)
21727 v0 := b.NewValue0(v.Pos, OpConst32, t)
21728 v0.AuxInt = int32ToAuxInt(c1)
21729 v.AddArg2(v0, x)
21730 return true
21731 }
21732 }
21733 break
21734 }
21735
21736
21737
21738 for {
21739 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21740 if v_0.Op != OpOr32 {
21741 continue
21742 }
21743 _ = v_0.Args[1]
21744 v_0_0 := v_0.Args[0]
21745 v_0_1 := v_0.Args[1]
21746 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21747 i := v_0_0
21748 if i.Op != OpConst32 {
21749 continue
21750 }
21751 t := i.Type
21752 z := v_0_1
21753 x := v_1
21754 if !(z.Op != OpConst32 && x.Op != OpConst32) {
21755 continue
21756 }
21757 v.reset(OpOr32)
21758 v0 := b.NewValue0(v.Pos, OpOr32, t)
21759 v0.AddArg2(z, x)
21760 v.AddArg2(i, v0)
21761 return true
21762 }
21763 }
21764 break
21765 }
21766
21767
21768 for {
21769 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21770 if v_0.Op != OpConst32 {
21771 continue
21772 }
21773 t := v_0.Type
21774 c := auxIntToInt32(v_0.AuxInt)
21775 if v_1.Op != OpOr32 {
21776 continue
21777 }
21778 _ = v_1.Args[1]
21779 v_1_0 := v_1.Args[0]
21780 v_1_1 := v_1.Args[1]
21781 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21782 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
21783 continue
21784 }
21785 d := auxIntToInt32(v_1_0.AuxInt)
21786 x := v_1_1
21787 v.reset(OpOr32)
21788 v0 := b.NewValue0(v.Pos, OpConst32, t)
21789 v0.AuxInt = int32ToAuxInt(c | d)
21790 v.AddArg2(v0, x)
21791 return true
21792 }
21793 }
21794 break
21795 }
21796
21797
21798
21799 for {
21800 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21801 if v_0.Op != OpLsh32x64 {
21802 continue
21803 }
21804 _ = v_0.Args[1]
21805 x := v_0.Args[0]
21806 z := v_0.Args[1]
21807 if z.Op != OpConst64 {
21808 continue
21809 }
21810 c := auxIntToInt64(z.AuxInt)
21811 if v_1.Op != OpRsh32Ux64 {
21812 continue
21813 }
21814 _ = v_1.Args[1]
21815 if x != v_1.Args[0] {
21816 continue
21817 }
21818 v_1_1 := v_1.Args[1]
21819 if v_1_1.Op != OpConst64 {
21820 continue
21821 }
21822 d := auxIntToInt64(v_1_1.AuxInt)
21823 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
21824 continue
21825 }
21826 v.reset(OpRotateLeft32)
21827 v.AddArg2(x, z)
21828 return true
21829 }
21830 break
21831 }
21832
21833
21834
21835 for {
21836 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21837 left := v_0
21838 if left.Op != OpLsh32x64 {
21839 continue
21840 }
21841 y := left.Args[1]
21842 x := left.Args[0]
21843 right := v_1
21844 if right.Op != OpRsh32Ux64 {
21845 continue
21846 }
21847 _ = right.Args[1]
21848 if x != right.Args[0] {
21849 continue
21850 }
21851 right_1 := right.Args[1]
21852 if right_1.Op != OpSub64 {
21853 continue
21854 }
21855 _ = right_1.Args[1]
21856 right_1_0 := right_1.Args[0]
21857 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21858 continue
21859 }
21860 v.reset(OpRotateLeft32)
21861 v.AddArg2(x, y)
21862 return true
21863 }
21864 break
21865 }
21866
21867
21868
21869 for {
21870 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21871 left := v_0
21872 if left.Op != OpLsh32x32 {
21873 continue
21874 }
21875 y := left.Args[1]
21876 x := left.Args[0]
21877 right := v_1
21878 if right.Op != OpRsh32Ux32 {
21879 continue
21880 }
21881 _ = right.Args[1]
21882 if x != right.Args[0] {
21883 continue
21884 }
21885 right_1 := right.Args[1]
21886 if right_1.Op != OpSub32 {
21887 continue
21888 }
21889 _ = right_1.Args[1]
21890 right_1_0 := right_1.Args[0]
21891 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21892 continue
21893 }
21894 v.reset(OpRotateLeft32)
21895 v.AddArg2(x, y)
21896 return true
21897 }
21898 break
21899 }
21900
21901
21902
21903 for {
21904 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21905 left := v_0
21906 if left.Op != OpLsh32x16 {
21907 continue
21908 }
21909 y := left.Args[1]
21910 x := left.Args[0]
21911 right := v_1
21912 if right.Op != OpRsh32Ux16 {
21913 continue
21914 }
21915 _ = right.Args[1]
21916 if x != right.Args[0] {
21917 continue
21918 }
21919 right_1 := right.Args[1]
21920 if right_1.Op != OpSub16 {
21921 continue
21922 }
21923 _ = right_1.Args[1]
21924 right_1_0 := right_1.Args[0]
21925 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21926 continue
21927 }
21928 v.reset(OpRotateLeft32)
21929 v.AddArg2(x, y)
21930 return true
21931 }
21932 break
21933 }
21934
21935
21936
21937 for {
21938 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21939 left := v_0
21940 if left.Op != OpLsh32x8 {
21941 continue
21942 }
21943 y := left.Args[1]
21944 x := left.Args[0]
21945 right := v_1
21946 if right.Op != OpRsh32Ux8 {
21947 continue
21948 }
21949 _ = right.Args[1]
21950 if x != right.Args[0] {
21951 continue
21952 }
21953 right_1 := right.Args[1]
21954 if right_1.Op != OpSub8 {
21955 continue
21956 }
21957 _ = right_1.Args[1]
21958 right_1_0 := right_1.Args[0]
21959 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21960 continue
21961 }
21962 v.reset(OpRotateLeft32)
21963 v.AddArg2(x, y)
21964 return true
21965 }
21966 break
21967 }
21968
21969
21970
21971 for {
21972 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21973 right := v_0
21974 if right.Op != OpRsh32Ux64 {
21975 continue
21976 }
21977 y := right.Args[1]
21978 x := right.Args[0]
21979 left := v_1
21980 if left.Op != OpLsh32x64 {
21981 continue
21982 }
21983 _ = left.Args[1]
21984 if x != left.Args[0] {
21985 continue
21986 }
21987 z := left.Args[1]
21988 if z.Op != OpSub64 {
21989 continue
21990 }
21991 _ = z.Args[1]
21992 z_0 := z.Args[0]
21993 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21994 continue
21995 }
21996 v.reset(OpRotateLeft32)
21997 v.AddArg2(x, z)
21998 return true
21999 }
22000 break
22001 }
22002
22003
22004
22005 for {
22006 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22007 right := v_0
22008 if right.Op != OpRsh32Ux32 {
22009 continue
22010 }
22011 y := right.Args[1]
22012 x := right.Args[0]
22013 left := v_1
22014 if left.Op != OpLsh32x32 {
22015 continue
22016 }
22017 _ = left.Args[1]
22018 if x != left.Args[0] {
22019 continue
22020 }
22021 z := left.Args[1]
22022 if z.Op != OpSub32 {
22023 continue
22024 }
22025 _ = z.Args[1]
22026 z_0 := z.Args[0]
22027 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22028 continue
22029 }
22030 v.reset(OpRotateLeft32)
22031 v.AddArg2(x, z)
22032 return true
22033 }
22034 break
22035 }
22036
22037
22038
22039 for {
22040 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22041 right := v_0
22042 if right.Op != OpRsh32Ux16 {
22043 continue
22044 }
22045 y := right.Args[1]
22046 x := right.Args[0]
22047 left := v_1
22048 if left.Op != OpLsh32x16 {
22049 continue
22050 }
22051 _ = left.Args[1]
22052 if x != left.Args[0] {
22053 continue
22054 }
22055 z := left.Args[1]
22056 if z.Op != OpSub16 {
22057 continue
22058 }
22059 _ = z.Args[1]
22060 z_0 := z.Args[0]
22061 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22062 continue
22063 }
22064 v.reset(OpRotateLeft32)
22065 v.AddArg2(x, z)
22066 return true
22067 }
22068 break
22069 }
22070
22071
22072
22073 for {
22074 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22075 right := v_0
22076 if right.Op != OpRsh32Ux8 {
22077 continue
22078 }
22079 y := right.Args[1]
22080 x := right.Args[0]
22081 left := v_1
22082 if left.Op != OpLsh32x8 {
22083 continue
22084 }
22085 _ = left.Args[1]
22086 if x != left.Args[0] {
22087 continue
22088 }
22089 z := left.Args[1]
22090 if z.Op != OpSub8 {
22091 continue
22092 }
22093 _ = z.Args[1]
22094 z_0 := z.Args[0]
22095 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22096 continue
22097 }
22098 v.reset(OpRotateLeft32)
22099 v.AddArg2(x, z)
22100 return true
22101 }
22102 break
22103 }
22104 return false
22105 }
22106 func rewriteValuegeneric_OpOr64(v *Value) bool {
22107 v_1 := v.Args[1]
22108 v_0 := v.Args[0]
22109 b := v.Block
22110 config := b.Func.Config
22111
22112
22113 for {
22114 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22115 if v_0.Op != OpConst64 {
22116 continue
22117 }
22118 c := auxIntToInt64(v_0.AuxInt)
22119 if v_1.Op != OpConst64 {
22120 continue
22121 }
22122 d := auxIntToInt64(v_1.AuxInt)
22123 v.reset(OpConst64)
22124 v.AuxInt = int64ToAuxInt(c | d)
22125 return true
22126 }
22127 break
22128 }
22129
22130
22131 for {
22132 t := v.Type
22133 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22134 if v_0.Op != OpCom64 {
22135 continue
22136 }
22137 x := v_0.Args[0]
22138 if v_1.Op != OpCom64 {
22139 continue
22140 }
22141 y := v_1.Args[0]
22142 v.reset(OpCom64)
22143 v0 := b.NewValue0(v.Pos, OpAnd64, t)
22144 v0.AddArg2(x, y)
22145 v.AddArg(v0)
22146 return true
22147 }
22148 break
22149 }
22150
22151
22152 for {
22153 x := v_0
22154 if x != v_1 {
22155 break
22156 }
22157 v.copyOf(x)
22158 return true
22159 }
22160
22161
22162 for {
22163 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22164 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
22165 continue
22166 }
22167 x := v_1
22168 v.copyOf(x)
22169 return true
22170 }
22171 break
22172 }
22173
22174
22175 for {
22176 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22177 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
22178 continue
22179 }
22180 v.reset(OpConst64)
22181 v.AuxInt = int64ToAuxInt(-1)
22182 return true
22183 }
22184 break
22185 }
22186
22187
22188 for {
22189 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22190 if v_0.Op != OpCom64 {
22191 continue
22192 }
22193 x := v_0.Args[0]
22194 if x != v_1 {
22195 continue
22196 }
22197 v.reset(OpConst64)
22198 v.AuxInt = int64ToAuxInt(-1)
22199 return true
22200 }
22201 break
22202 }
22203
22204
22205 for {
22206 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22207 x := v_0
22208 if v_1.Op != OpOr64 {
22209 continue
22210 }
22211 _ = v_1.Args[1]
22212 v_1_0 := v_1.Args[0]
22213 v_1_1 := v_1.Args[1]
22214 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22215 if x != v_1_0 {
22216 continue
22217 }
22218 y := v_1_1
22219 v.reset(OpOr64)
22220 v.AddArg2(x, y)
22221 return true
22222 }
22223 }
22224 break
22225 }
22226
22227
22228
22229 for {
22230 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22231 if v_0.Op != OpAnd64 {
22232 continue
22233 }
22234 _ = v_0.Args[1]
22235 v_0_0 := v_0.Args[0]
22236 v_0_1 := v_0.Args[1]
22237 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22238 x := v_0_0
22239 if v_0_1.Op != OpConst64 {
22240 continue
22241 }
22242 c2 := auxIntToInt64(v_0_1.AuxInt)
22243 if v_1.Op != OpConst64 {
22244 continue
22245 }
22246 t := v_1.Type
22247 c1 := auxIntToInt64(v_1.AuxInt)
22248 if !(^(c1 | c2) == 0) {
22249 continue
22250 }
22251 v.reset(OpOr64)
22252 v0 := b.NewValue0(v.Pos, OpConst64, t)
22253 v0.AuxInt = int64ToAuxInt(c1)
22254 v.AddArg2(v0, x)
22255 return true
22256 }
22257 }
22258 break
22259 }
22260
22261
22262
22263 for {
22264 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22265 if v_0.Op != OpOr64 {
22266 continue
22267 }
22268 _ = v_0.Args[1]
22269 v_0_0 := v_0.Args[0]
22270 v_0_1 := v_0.Args[1]
22271 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22272 i := v_0_0
22273 if i.Op != OpConst64 {
22274 continue
22275 }
22276 t := i.Type
22277 z := v_0_1
22278 x := v_1
22279 if !(z.Op != OpConst64 && x.Op != OpConst64) {
22280 continue
22281 }
22282 v.reset(OpOr64)
22283 v0 := b.NewValue0(v.Pos, OpOr64, t)
22284 v0.AddArg2(z, x)
22285 v.AddArg2(i, v0)
22286 return true
22287 }
22288 }
22289 break
22290 }
22291
22292
22293 for {
22294 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22295 if v_0.Op != OpConst64 {
22296 continue
22297 }
22298 t := v_0.Type
22299 c := auxIntToInt64(v_0.AuxInt)
22300 if v_1.Op != OpOr64 {
22301 continue
22302 }
22303 _ = v_1.Args[1]
22304 v_1_0 := v_1.Args[0]
22305 v_1_1 := v_1.Args[1]
22306 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22307 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
22308 continue
22309 }
22310 d := auxIntToInt64(v_1_0.AuxInt)
22311 x := v_1_1
22312 v.reset(OpOr64)
22313 v0 := b.NewValue0(v.Pos, OpConst64, t)
22314 v0.AuxInt = int64ToAuxInt(c | d)
22315 v.AddArg2(v0, x)
22316 return true
22317 }
22318 }
22319 break
22320 }
22321
22322
22323
22324 for {
22325 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22326 if v_0.Op != OpLsh64x64 {
22327 continue
22328 }
22329 _ = v_0.Args[1]
22330 x := v_0.Args[0]
22331 z := v_0.Args[1]
22332 if z.Op != OpConst64 {
22333 continue
22334 }
22335 c := auxIntToInt64(z.AuxInt)
22336 if v_1.Op != OpRsh64Ux64 {
22337 continue
22338 }
22339 _ = v_1.Args[1]
22340 if x != v_1.Args[0] {
22341 continue
22342 }
22343 v_1_1 := v_1.Args[1]
22344 if v_1_1.Op != OpConst64 {
22345 continue
22346 }
22347 d := auxIntToInt64(v_1_1.AuxInt)
22348 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
22349 continue
22350 }
22351 v.reset(OpRotateLeft64)
22352 v.AddArg2(x, z)
22353 return true
22354 }
22355 break
22356 }
22357
22358
22359
22360 for {
22361 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22362 left := v_0
22363 if left.Op != OpLsh64x64 {
22364 continue
22365 }
22366 y := left.Args[1]
22367 x := left.Args[0]
22368 right := v_1
22369 if right.Op != OpRsh64Ux64 {
22370 continue
22371 }
22372 _ = right.Args[1]
22373 if x != right.Args[0] {
22374 continue
22375 }
22376 right_1 := right.Args[1]
22377 if right_1.Op != OpSub64 {
22378 continue
22379 }
22380 _ = right_1.Args[1]
22381 right_1_0 := right_1.Args[0]
22382 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22383 continue
22384 }
22385 v.reset(OpRotateLeft64)
22386 v.AddArg2(x, y)
22387 return true
22388 }
22389 break
22390 }
22391
22392
22393
22394 for {
22395 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22396 left := v_0
22397 if left.Op != OpLsh64x32 {
22398 continue
22399 }
22400 y := left.Args[1]
22401 x := left.Args[0]
22402 right := v_1
22403 if right.Op != OpRsh64Ux32 {
22404 continue
22405 }
22406 _ = right.Args[1]
22407 if x != right.Args[0] {
22408 continue
22409 }
22410 right_1 := right.Args[1]
22411 if right_1.Op != OpSub32 {
22412 continue
22413 }
22414 _ = right_1.Args[1]
22415 right_1_0 := right_1.Args[0]
22416 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22417 continue
22418 }
22419 v.reset(OpRotateLeft64)
22420 v.AddArg2(x, y)
22421 return true
22422 }
22423 break
22424 }
22425
22426
22427
22428 for {
22429 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22430 left := v_0
22431 if left.Op != OpLsh64x16 {
22432 continue
22433 }
22434 y := left.Args[1]
22435 x := left.Args[0]
22436 right := v_1
22437 if right.Op != OpRsh64Ux16 {
22438 continue
22439 }
22440 _ = right.Args[1]
22441 if x != right.Args[0] {
22442 continue
22443 }
22444 right_1 := right.Args[1]
22445 if right_1.Op != OpSub16 {
22446 continue
22447 }
22448 _ = right_1.Args[1]
22449 right_1_0 := right_1.Args[0]
22450 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22451 continue
22452 }
22453 v.reset(OpRotateLeft64)
22454 v.AddArg2(x, y)
22455 return true
22456 }
22457 break
22458 }
22459
22460
22461
22462 for {
22463 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22464 left := v_0
22465 if left.Op != OpLsh64x8 {
22466 continue
22467 }
22468 y := left.Args[1]
22469 x := left.Args[0]
22470 right := v_1
22471 if right.Op != OpRsh64Ux8 {
22472 continue
22473 }
22474 _ = right.Args[1]
22475 if x != right.Args[0] {
22476 continue
22477 }
22478 right_1 := right.Args[1]
22479 if right_1.Op != OpSub8 {
22480 continue
22481 }
22482 _ = right_1.Args[1]
22483 right_1_0 := right_1.Args[0]
22484 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22485 continue
22486 }
22487 v.reset(OpRotateLeft64)
22488 v.AddArg2(x, y)
22489 return true
22490 }
22491 break
22492 }
22493
22494
22495
22496 for {
22497 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22498 right := v_0
22499 if right.Op != OpRsh64Ux64 {
22500 continue
22501 }
22502 y := right.Args[1]
22503 x := right.Args[0]
22504 left := v_1
22505 if left.Op != OpLsh64x64 {
22506 continue
22507 }
22508 _ = left.Args[1]
22509 if x != left.Args[0] {
22510 continue
22511 }
22512 z := left.Args[1]
22513 if z.Op != OpSub64 {
22514 continue
22515 }
22516 _ = z.Args[1]
22517 z_0 := z.Args[0]
22518 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22519 continue
22520 }
22521 v.reset(OpRotateLeft64)
22522 v.AddArg2(x, z)
22523 return true
22524 }
22525 break
22526 }
22527
22528
22529
22530 for {
22531 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22532 right := v_0
22533 if right.Op != OpRsh64Ux32 {
22534 continue
22535 }
22536 y := right.Args[1]
22537 x := right.Args[0]
22538 left := v_1
22539 if left.Op != OpLsh64x32 {
22540 continue
22541 }
22542 _ = left.Args[1]
22543 if x != left.Args[0] {
22544 continue
22545 }
22546 z := left.Args[1]
22547 if z.Op != OpSub32 {
22548 continue
22549 }
22550 _ = z.Args[1]
22551 z_0 := z.Args[0]
22552 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22553 continue
22554 }
22555 v.reset(OpRotateLeft64)
22556 v.AddArg2(x, z)
22557 return true
22558 }
22559 break
22560 }
22561
22562
22563
22564 for {
22565 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22566 right := v_0
22567 if right.Op != OpRsh64Ux16 {
22568 continue
22569 }
22570 y := right.Args[1]
22571 x := right.Args[0]
22572 left := v_1
22573 if left.Op != OpLsh64x16 {
22574 continue
22575 }
22576 _ = left.Args[1]
22577 if x != left.Args[0] {
22578 continue
22579 }
22580 z := left.Args[1]
22581 if z.Op != OpSub16 {
22582 continue
22583 }
22584 _ = z.Args[1]
22585 z_0 := z.Args[0]
22586 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22587 continue
22588 }
22589 v.reset(OpRotateLeft64)
22590 v.AddArg2(x, z)
22591 return true
22592 }
22593 break
22594 }
22595
22596
22597
22598 for {
22599 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22600 right := v_0
22601 if right.Op != OpRsh64Ux8 {
22602 continue
22603 }
22604 y := right.Args[1]
22605 x := right.Args[0]
22606 left := v_1
22607 if left.Op != OpLsh64x8 {
22608 continue
22609 }
22610 _ = left.Args[1]
22611 if x != left.Args[0] {
22612 continue
22613 }
22614 z := left.Args[1]
22615 if z.Op != OpSub8 {
22616 continue
22617 }
22618 _ = z.Args[1]
22619 z_0 := z.Args[0]
22620 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22621 continue
22622 }
22623 v.reset(OpRotateLeft64)
22624 v.AddArg2(x, z)
22625 return true
22626 }
22627 break
22628 }
22629 return false
22630 }
22631 func rewriteValuegeneric_OpOr8(v *Value) bool {
22632 v_1 := v.Args[1]
22633 v_0 := v.Args[0]
22634 b := v.Block
22635 config := b.Func.Config
22636
22637
22638 for {
22639 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22640 if v_0.Op != OpConst8 {
22641 continue
22642 }
22643 c := auxIntToInt8(v_0.AuxInt)
22644 if v_1.Op != OpConst8 {
22645 continue
22646 }
22647 d := auxIntToInt8(v_1.AuxInt)
22648 v.reset(OpConst8)
22649 v.AuxInt = int8ToAuxInt(c | d)
22650 return true
22651 }
22652 break
22653 }
22654
22655
22656 for {
22657 t := v.Type
22658 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22659 if v_0.Op != OpCom8 {
22660 continue
22661 }
22662 x := v_0.Args[0]
22663 if v_1.Op != OpCom8 {
22664 continue
22665 }
22666 y := v_1.Args[0]
22667 v.reset(OpCom8)
22668 v0 := b.NewValue0(v.Pos, OpAnd8, t)
22669 v0.AddArg2(x, y)
22670 v.AddArg(v0)
22671 return true
22672 }
22673 break
22674 }
22675
22676
22677 for {
22678 x := v_0
22679 if x != v_1 {
22680 break
22681 }
22682 v.copyOf(x)
22683 return true
22684 }
22685
22686
22687 for {
22688 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22689 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
22690 continue
22691 }
22692 x := v_1
22693 v.copyOf(x)
22694 return true
22695 }
22696 break
22697 }
22698
22699
22700 for {
22701 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22702 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
22703 continue
22704 }
22705 v.reset(OpConst8)
22706 v.AuxInt = int8ToAuxInt(-1)
22707 return true
22708 }
22709 break
22710 }
22711
22712
22713 for {
22714 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22715 if v_0.Op != OpCom8 {
22716 continue
22717 }
22718 x := v_0.Args[0]
22719 if x != v_1 {
22720 continue
22721 }
22722 v.reset(OpConst8)
22723 v.AuxInt = int8ToAuxInt(-1)
22724 return true
22725 }
22726 break
22727 }
22728
22729
22730 for {
22731 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22732 x := v_0
22733 if v_1.Op != OpOr8 {
22734 continue
22735 }
22736 _ = v_1.Args[1]
22737 v_1_0 := v_1.Args[0]
22738 v_1_1 := v_1.Args[1]
22739 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22740 if x != v_1_0 {
22741 continue
22742 }
22743 y := v_1_1
22744 v.reset(OpOr8)
22745 v.AddArg2(x, y)
22746 return true
22747 }
22748 }
22749 break
22750 }
22751
22752
22753
22754 for {
22755 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22756 if v_0.Op != OpAnd8 {
22757 continue
22758 }
22759 _ = v_0.Args[1]
22760 v_0_0 := v_0.Args[0]
22761 v_0_1 := v_0.Args[1]
22762 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22763 x := v_0_0
22764 if v_0_1.Op != OpConst8 {
22765 continue
22766 }
22767 c2 := auxIntToInt8(v_0_1.AuxInt)
22768 if v_1.Op != OpConst8 {
22769 continue
22770 }
22771 t := v_1.Type
22772 c1 := auxIntToInt8(v_1.AuxInt)
22773 if !(^(c1 | c2) == 0) {
22774 continue
22775 }
22776 v.reset(OpOr8)
22777 v0 := b.NewValue0(v.Pos, OpConst8, t)
22778 v0.AuxInt = int8ToAuxInt(c1)
22779 v.AddArg2(v0, x)
22780 return true
22781 }
22782 }
22783 break
22784 }
22785
22786
22787
22788 for {
22789 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22790 if v_0.Op != OpOr8 {
22791 continue
22792 }
22793 _ = v_0.Args[1]
22794 v_0_0 := v_0.Args[0]
22795 v_0_1 := v_0.Args[1]
22796 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22797 i := v_0_0
22798 if i.Op != OpConst8 {
22799 continue
22800 }
22801 t := i.Type
22802 z := v_0_1
22803 x := v_1
22804 if !(z.Op != OpConst8 && x.Op != OpConst8) {
22805 continue
22806 }
22807 v.reset(OpOr8)
22808 v0 := b.NewValue0(v.Pos, OpOr8, t)
22809 v0.AddArg2(z, x)
22810 v.AddArg2(i, v0)
22811 return true
22812 }
22813 }
22814 break
22815 }
22816
22817
22818 for {
22819 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22820 if v_0.Op != OpConst8 {
22821 continue
22822 }
22823 t := v_0.Type
22824 c := auxIntToInt8(v_0.AuxInt)
22825 if v_1.Op != OpOr8 {
22826 continue
22827 }
22828 _ = v_1.Args[1]
22829 v_1_0 := v_1.Args[0]
22830 v_1_1 := v_1.Args[1]
22831 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22832 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
22833 continue
22834 }
22835 d := auxIntToInt8(v_1_0.AuxInt)
22836 x := v_1_1
22837 v.reset(OpOr8)
22838 v0 := b.NewValue0(v.Pos, OpConst8, t)
22839 v0.AuxInt = int8ToAuxInt(c | d)
22840 v.AddArg2(v0, x)
22841 return true
22842 }
22843 }
22844 break
22845 }
22846
22847
22848
22849 for {
22850 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22851 if v_0.Op != OpLsh8x64 {
22852 continue
22853 }
22854 _ = v_0.Args[1]
22855 x := v_0.Args[0]
22856 z := v_0.Args[1]
22857 if z.Op != OpConst64 {
22858 continue
22859 }
22860 c := auxIntToInt64(z.AuxInt)
22861 if v_1.Op != OpRsh8Ux64 {
22862 continue
22863 }
22864 _ = v_1.Args[1]
22865 if x != v_1.Args[0] {
22866 continue
22867 }
22868 v_1_1 := v_1.Args[1]
22869 if v_1_1.Op != OpConst64 {
22870 continue
22871 }
22872 d := auxIntToInt64(v_1_1.AuxInt)
22873 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
22874 continue
22875 }
22876 v.reset(OpRotateLeft8)
22877 v.AddArg2(x, z)
22878 return true
22879 }
22880 break
22881 }
22882
22883
22884
22885 for {
22886 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22887 left := v_0
22888 if left.Op != OpLsh8x64 {
22889 continue
22890 }
22891 y := left.Args[1]
22892 x := left.Args[0]
22893 right := v_1
22894 if right.Op != OpRsh8Ux64 {
22895 continue
22896 }
22897 _ = right.Args[1]
22898 if x != right.Args[0] {
22899 continue
22900 }
22901 right_1 := right.Args[1]
22902 if right_1.Op != OpSub64 {
22903 continue
22904 }
22905 _ = right_1.Args[1]
22906 right_1_0 := right_1.Args[0]
22907 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22908 continue
22909 }
22910 v.reset(OpRotateLeft8)
22911 v.AddArg2(x, y)
22912 return true
22913 }
22914 break
22915 }
22916
22917
22918
22919 for {
22920 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22921 left := v_0
22922 if left.Op != OpLsh8x32 {
22923 continue
22924 }
22925 y := left.Args[1]
22926 x := left.Args[0]
22927 right := v_1
22928 if right.Op != OpRsh8Ux32 {
22929 continue
22930 }
22931 _ = right.Args[1]
22932 if x != right.Args[0] {
22933 continue
22934 }
22935 right_1 := right.Args[1]
22936 if right_1.Op != OpSub32 {
22937 continue
22938 }
22939 _ = right_1.Args[1]
22940 right_1_0 := right_1.Args[0]
22941 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22942 continue
22943 }
22944 v.reset(OpRotateLeft8)
22945 v.AddArg2(x, y)
22946 return true
22947 }
22948 break
22949 }
22950
22951
22952
22953 for {
22954 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22955 left := v_0
22956 if left.Op != OpLsh8x16 {
22957 continue
22958 }
22959 y := left.Args[1]
22960 x := left.Args[0]
22961 right := v_1
22962 if right.Op != OpRsh8Ux16 {
22963 continue
22964 }
22965 _ = right.Args[1]
22966 if x != right.Args[0] {
22967 continue
22968 }
22969 right_1 := right.Args[1]
22970 if right_1.Op != OpSub16 {
22971 continue
22972 }
22973 _ = right_1.Args[1]
22974 right_1_0 := right_1.Args[0]
22975 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22976 continue
22977 }
22978 v.reset(OpRotateLeft8)
22979 v.AddArg2(x, y)
22980 return true
22981 }
22982 break
22983 }
22984
22985
22986
22987 for {
22988 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22989 left := v_0
22990 if left.Op != OpLsh8x8 {
22991 continue
22992 }
22993 y := left.Args[1]
22994 x := left.Args[0]
22995 right := v_1
22996 if right.Op != OpRsh8Ux8 {
22997 continue
22998 }
22999 _ = right.Args[1]
23000 if x != right.Args[0] {
23001 continue
23002 }
23003 right_1 := right.Args[1]
23004 if right_1.Op != OpSub8 {
23005 continue
23006 }
23007 _ = right_1.Args[1]
23008 right_1_0 := right_1.Args[0]
23009 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23010 continue
23011 }
23012 v.reset(OpRotateLeft8)
23013 v.AddArg2(x, y)
23014 return true
23015 }
23016 break
23017 }
23018
23019
23020
23021 for {
23022 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23023 right := v_0
23024 if right.Op != OpRsh8Ux64 {
23025 continue
23026 }
23027 y := right.Args[1]
23028 x := right.Args[0]
23029 left := v_1
23030 if left.Op != OpLsh8x64 {
23031 continue
23032 }
23033 _ = left.Args[1]
23034 if x != left.Args[0] {
23035 continue
23036 }
23037 z := left.Args[1]
23038 if z.Op != OpSub64 {
23039 continue
23040 }
23041 _ = z.Args[1]
23042 z_0 := z.Args[0]
23043 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23044 continue
23045 }
23046 v.reset(OpRotateLeft8)
23047 v.AddArg2(x, z)
23048 return true
23049 }
23050 break
23051 }
23052
23053
23054
23055 for {
23056 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23057 right := v_0
23058 if right.Op != OpRsh8Ux32 {
23059 continue
23060 }
23061 y := right.Args[1]
23062 x := right.Args[0]
23063 left := v_1
23064 if left.Op != OpLsh8x32 {
23065 continue
23066 }
23067 _ = left.Args[1]
23068 if x != left.Args[0] {
23069 continue
23070 }
23071 z := left.Args[1]
23072 if z.Op != OpSub32 {
23073 continue
23074 }
23075 _ = z.Args[1]
23076 z_0 := z.Args[0]
23077 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23078 continue
23079 }
23080 v.reset(OpRotateLeft8)
23081 v.AddArg2(x, z)
23082 return true
23083 }
23084 break
23085 }
23086
23087
23088
23089 for {
23090 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23091 right := v_0
23092 if right.Op != OpRsh8Ux16 {
23093 continue
23094 }
23095 y := right.Args[1]
23096 x := right.Args[0]
23097 left := v_1
23098 if left.Op != OpLsh8x16 {
23099 continue
23100 }
23101 _ = left.Args[1]
23102 if x != left.Args[0] {
23103 continue
23104 }
23105 z := left.Args[1]
23106 if z.Op != OpSub16 {
23107 continue
23108 }
23109 _ = z.Args[1]
23110 z_0 := z.Args[0]
23111 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23112 continue
23113 }
23114 v.reset(OpRotateLeft8)
23115 v.AddArg2(x, z)
23116 return true
23117 }
23118 break
23119 }
23120
23121
23122
23123 for {
23124 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23125 right := v_0
23126 if right.Op != OpRsh8Ux8 {
23127 continue
23128 }
23129 y := right.Args[1]
23130 x := right.Args[0]
23131 left := v_1
23132 if left.Op != OpLsh8x8 {
23133 continue
23134 }
23135 _ = left.Args[1]
23136 if x != left.Args[0] {
23137 continue
23138 }
23139 z := left.Args[1]
23140 if z.Op != OpSub8 {
23141 continue
23142 }
23143 _ = z.Args[1]
23144 z_0 := z.Args[0]
23145 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23146 continue
23147 }
23148 v.reset(OpRotateLeft8)
23149 v.AddArg2(x, z)
23150 return true
23151 }
23152 break
23153 }
23154 return false
23155 }
23156 func rewriteValuegeneric_OpOrB(v *Value) bool {
23157 v_1 := v.Args[1]
23158 v_0 := v.Args[0]
23159 b := v.Block
23160
23161
23162
23163 for {
23164 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23165 if v_0.Op != OpLess64 {
23166 continue
23167 }
23168 x := v_0.Args[1]
23169 v_0_0 := v_0.Args[0]
23170 if v_0_0.Op != OpConst64 {
23171 continue
23172 }
23173 c := auxIntToInt64(v_0_0.AuxInt)
23174 if v_1.Op != OpLess64 {
23175 continue
23176 }
23177 _ = v_1.Args[1]
23178 if x != v_1.Args[0] {
23179 continue
23180 }
23181 v_1_1 := v_1.Args[1]
23182 if v_1_1.Op != OpConst64 {
23183 continue
23184 }
23185 d := auxIntToInt64(v_1_1.AuxInt)
23186 if !(c >= d) {
23187 continue
23188 }
23189 v.reset(OpLess64U)
23190 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23191 v0.AuxInt = int64ToAuxInt(c - d)
23192 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23193 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23194 v2.AuxInt = int64ToAuxInt(d)
23195 v1.AddArg2(x, v2)
23196 v.AddArg2(v0, v1)
23197 return true
23198 }
23199 break
23200 }
23201
23202
23203
23204 for {
23205 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23206 if v_0.Op != OpLeq64 {
23207 continue
23208 }
23209 x := v_0.Args[1]
23210 v_0_0 := v_0.Args[0]
23211 if v_0_0.Op != OpConst64 {
23212 continue
23213 }
23214 c := auxIntToInt64(v_0_0.AuxInt)
23215 if v_1.Op != OpLess64 {
23216 continue
23217 }
23218 _ = v_1.Args[1]
23219 if x != v_1.Args[0] {
23220 continue
23221 }
23222 v_1_1 := v_1.Args[1]
23223 if v_1_1.Op != OpConst64 {
23224 continue
23225 }
23226 d := auxIntToInt64(v_1_1.AuxInt)
23227 if !(c >= d) {
23228 continue
23229 }
23230 v.reset(OpLeq64U)
23231 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23232 v0.AuxInt = int64ToAuxInt(c - d)
23233 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23234 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23235 v2.AuxInt = int64ToAuxInt(d)
23236 v1.AddArg2(x, v2)
23237 v.AddArg2(v0, v1)
23238 return true
23239 }
23240 break
23241 }
23242
23243
23244
23245 for {
23246 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23247 if v_0.Op != OpLess32 {
23248 continue
23249 }
23250 x := v_0.Args[1]
23251 v_0_0 := v_0.Args[0]
23252 if v_0_0.Op != OpConst32 {
23253 continue
23254 }
23255 c := auxIntToInt32(v_0_0.AuxInt)
23256 if v_1.Op != OpLess32 {
23257 continue
23258 }
23259 _ = v_1.Args[1]
23260 if x != v_1.Args[0] {
23261 continue
23262 }
23263 v_1_1 := v_1.Args[1]
23264 if v_1_1.Op != OpConst32 {
23265 continue
23266 }
23267 d := auxIntToInt32(v_1_1.AuxInt)
23268 if !(c >= d) {
23269 continue
23270 }
23271 v.reset(OpLess32U)
23272 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23273 v0.AuxInt = int32ToAuxInt(c - d)
23274 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23275 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23276 v2.AuxInt = int32ToAuxInt(d)
23277 v1.AddArg2(x, v2)
23278 v.AddArg2(v0, v1)
23279 return true
23280 }
23281 break
23282 }
23283
23284
23285
23286 for {
23287 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23288 if v_0.Op != OpLeq32 {
23289 continue
23290 }
23291 x := v_0.Args[1]
23292 v_0_0 := v_0.Args[0]
23293 if v_0_0.Op != OpConst32 {
23294 continue
23295 }
23296 c := auxIntToInt32(v_0_0.AuxInt)
23297 if v_1.Op != OpLess32 {
23298 continue
23299 }
23300 _ = v_1.Args[1]
23301 if x != v_1.Args[0] {
23302 continue
23303 }
23304 v_1_1 := v_1.Args[1]
23305 if v_1_1.Op != OpConst32 {
23306 continue
23307 }
23308 d := auxIntToInt32(v_1_1.AuxInt)
23309 if !(c >= d) {
23310 continue
23311 }
23312 v.reset(OpLeq32U)
23313 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23314 v0.AuxInt = int32ToAuxInt(c - d)
23315 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23316 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23317 v2.AuxInt = int32ToAuxInt(d)
23318 v1.AddArg2(x, v2)
23319 v.AddArg2(v0, v1)
23320 return true
23321 }
23322 break
23323 }
23324
23325
23326
23327 for {
23328 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23329 if v_0.Op != OpLess16 {
23330 continue
23331 }
23332 x := v_0.Args[1]
23333 v_0_0 := v_0.Args[0]
23334 if v_0_0.Op != OpConst16 {
23335 continue
23336 }
23337 c := auxIntToInt16(v_0_0.AuxInt)
23338 if v_1.Op != OpLess16 {
23339 continue
23340 }
23341 _ = v_1.Args[1]
23342 if x != v_1.Args[0] {
23343 continue
23344 }
23345 v_1_1 := v_1.Args[1]
23346 if v_1_1.Op != OpConst16 {
23347 continue
23348 }
23349 d := auxIntToInt16(v_1_1.AuxInt)
23350 if !(c >= d) {
23351 continue
23352 }
23353 v.reset(OpLess16U)
23354 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23355 v0.AuxInt = int16ToAuxInt(c - d)
23356 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23357 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23358 v2.AuxInt = int16ToAuxInt(d)
23359 v1.AddArg2(x, v2)
23360 v.AddArg2(v0, v1)
23361 return true
23362 }
23363 break
23364 }
23365
23366
23367
23368 for {
23369 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23370 if v_0.Op != OpLeq16 {
23371 continue
23372 }
23373 x := v_0.Args[1]
23374 v_0_0 := v_0.Args[0]
23375 if v_0_0.Op != OpConst16 {
23376 continue
23377 }
23378 c := auxIntToInt16(v_0_0.AuxInt)
23379 if v_1.Op != OpLess16 {
23380 continue
23381 }
23382 _ = v_1.Args[1]
23383 if x != v_1.Args[0] {
23384 continue
23385 }
23386 v_1_1 := v_1.Args[1]
23387 if v_1_1.Op != OpConst16 {
23388 continue
23389 }
23390 d := auxIntToInt16(v_1_1.AuxInt)
23391 if !(c >= d) {
23392 continue
23393 }
23394 v.reset(OpLeq16U)
23395 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23396 v0.AuxInt = int16ToAuxInt(c - d)
23397 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23398 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23399 v2.AuxInt = int16ToAuxInt(d)
23400 v1.AddArg2(x, v2)
23401 v.AddArg2(v0, v1)
23402 return true
23403 }
23404 break
23405 }
23406
23407
23408
23409 for {
23410 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23411 if v_0.Op != OpLess8 {
23412 continue
23413 }
23414 x := v_0.Args[1]
23415 v_0_0 := v_0.Args[0]
23416 if v_0_0.Op != OpConst8 {
23417 continue
23418 }
23419 c := auxIntToInt8(v_0_0.AuxInt)
23420 if v_1.Op != OpLess8 {
23421 continue
23422 }
23423 _ = v_1.Args[1]
23424 if x != v_1.Args[0] {
23425 continue
23426 }
23427 v_1_1 := v_1.Args[1]
23428 if v_1_1.Op != OpConst8 {
23429 continue
23430 }
23431 d := auxIntToInt8(v_1_1.AuxInt)
23432 if !(c >= d) {
23433 continue
23434 }
23435 v.reset(OpLess8U)
23436 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23437 v0.AuxInt = int8ToAuxInt(c - d)
23438 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23439 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23440 v2.AuxInt = int8ToAuxInt(d)
23441 v1.AddArg2(x, v2)
23442 v.AddArg2(v0, v1)
23443 return true
23444 }
23445 break
23446 }
23447
23448
23449
23450 for {
23451 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23452 if v_0.Op != OpLeq8 {
23453 continue
23454 }
23455 x := v_0.Args[1]
23456 v_0_0 := v_0.Args[0]
23457 if v_0_0.Op != OpConst8 {
23458 continue
23459 }
23460 c := auxIntToInt8(v_0_0.AuxInt)
23461 if v_1.Op != OpLess8 {
23462 continue
23463 }
23464 _ = v_1.Args[1]
23465 if x != v_1.Args[0] {
23466 continue
23467 }
23468 v_1_1 := v_1.Args[1]
23469 if v_1_1.Op != OpConst8 {
23470 continue
23471 }
23472 d := auxIntToInt8(v_1_1.AuxInt)
23473 if !(c >= d) {
23474 continue
23475 }
23476 v.reset(OpLeq8U)
23477 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23478 v0.AuxInt = int8ToAuxInt(c - d)
23479 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23480 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23481 v2.AuxInt = int8ToAuxInt(d)
23482 v1.AddArg2(x, v2)
23483 v.AddArg2(v0, v1)
23484 return true
23485 }
23486 break
23487 }
23488
23489
23490
23491 for {
23492 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23493 if v_0.Op != OpLess64 {
23494 continue
23495 }
23496 x := v_0.Args[1]
23497 v_0_0 := v_0.Args[0]
23498 if v_0_0.Op != OpConst64 {
23499 continue
23500 }
23501 c := auxIntToInt64(v_0_0.AuxInt)
23502 if v_1.Op != OpLeq64 {
23503 continue
23504 }
23505 _ = v_1.Args[1]
23506 if x != v_1.Args[0] {
23507 continue
23508 }
23509 v_1_1 := v_1.Args[1]
23510 if v_1_1.Op != OpConst64 {
23511 continue
23512 }
23513 d := auxIntToInt64(v_1_1.AuxInt)
23514 if !(c >= d+1 && d+1 > d) {
23515 continue
23516 }
23517 v.reset(OpLess64U)
23518 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23519 v0.AuxInt = int64ToAuxInt(c - d - 1)
23520 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23521 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23522 v2.AuxInt = int64ToAuxInt(d + 1)
23523 v1.AddArg2(x, v2)
23524 v.AddArg2(v0, v1)
23525 return true
23526 }
23527 break
23528 }
23529
23530
23531
23532 for {
23533 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23534 if v_0.Op != OpLeq64 {
23535 continue
23536 }
23537 x := v_0.Args[1]
23538 v_0_0 := v_0.Args[0]
23539 if v_0_0.Op != OpConst64 {
23540 continue
23541 }
23542 c := auxIntToInt64(v_0_0.AuxInt)
23543 if v_1.Op != OpLeq64 {
23544 continue
23545 }
23546 _ = v_1.Args[1]
23547 if x != v_1.Args[0] {
23548 continue
23549 }
23550 v_1_1 := v_1.Args[1]
23551 if v_1_1.Op != OpConst64 {
23552 continue
23553 }
23554 d := auxIntToInt64(v_1_1.AuxInt)
23555 if !(c >= d+1 && d+1 > d) {
23556 continue
23557 }
23558 v.reset(OpLeq64U)
23559 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23560 v0.AuxInt = int64ToAuxInt(c - d - 1)
23561 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23562 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23563 v2.AuxInt = int64ToAuxInt(d + 1)
23564 v1.AddArg2(x, v2)
23565 v.AddArg2(v0, v1)
23566 return true
23567 }
23568 break
23569 }
23570
23571
23572
23573 for {
23574 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23575 if v_0.Op != OpLess32 {
23576 continue
23577 }
23578 x := v_0.Args[1]
23579 v_0_0 := v_0.Args[0]
23580 if v_0_0.Op != OpConst32 {
23581 continue
23582 }
23583 c := auxIntToInt32(v_0_0.AuxInt)
23584 if v_1.Op != OpLeq32 {
23585 continue
23586 }
23587 _ = v_1.Args[1]
23588 if x != v_1.Args[0] {
23589 continue
23590 }
23591 v_1_1 := v_1.Args[1]
23592 if v_1_1.Op != OpConst32 {
23593 continue
23594 }
23595 d := auxIntToInt32(v_1_1.AuxInt)
23596 if !(c >= d+1 && d+1 > d) {
23597 continue
23598 }
23599 v.reset(OpLess32U)
23600 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23601 v0.AuxInt = int32ToAuxInt(c - d - 1)
23602 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23603 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23604 v2.AuxInt = int32ToAuxInt(d + 1)
23605 v1.AddArg2(x, v2)
23606 v.AddArg2(v0, v1)
23607 return true
23608 }
23609 break
23610 }
23611
23612
23613
23614 for {
23615 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23616 if v_0.Op != OpLeq32 {
23617 continue
23618 }
23619 x := v_0.Args[1]
23620 v_0_0 := v_0.Args[0]
23621 if v_0_0.Op != OpConst32 {
23622 continue
23623 }
23624 c := auxIntToInt32(v_0_0.AuxInt)
23625 if v_1.Op != OpLeq32 {
23626 continue
23627 }
23628 _ = v_1.Args[1]
23629 if x != v_1.Args[0] {
23630 continue
23631 }
23632 v_1_1 := v_1.Args[1]
23633 if v_1_1.Op != OpConst32 {
23634 continue
23635 }
23636 d := auxIntToInt32(v_1_1.AuxInt)
23637 if !(c >= d+1 && d+1 > d) {
23638 continue
23639 }
23640 v.reset(OpLeq32U)
23641 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23642 v0.AuxInt = int32ToAuxInt(c - d - 1)
23643 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23644 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23645 v2.AuxInt = int32ToAuxInt(d + 1)
23646 v1.AddArg2(x, v2)
23647 v.AddArg2(v0, v1)
23648 return true
23649 }
23650 break
23651 }
23652
23653
23654
23655 for {
23656 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23657 if v_0.Op != OpLess16 {
23658 continue
23659 }
23660 x := v_0.Args[1]
23661 v_0_0 := v_0.Args[0]
23662 if v_0_0.Op != OpConst16 {
23663 continue
23664 }
23665 c := auxIntToInt16(v_0_0.AuxInt)
23666 if v_1.Op != OpLeq16 {
23667 continue
23668 }
23669 _ = v_1.Args[1]
23670 if x != v_1.Args[0] {
23671 continue
23672 }
23673 v_1_1 := v_1.Args[1]
23674 if v_1_1.Op != OpConst16 {
23675 continue
23676 }
23677 d := auxIntToInt16(v_1_1.AuxInt)
23678 if !(c >= d+1 && d+1 > d) {
23679 continue
23680 }
23681 v.reset(OpLess16U)
23682 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23683 v0.AuxInt = int16ToAuxInt(c - d - 1)
23684 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23685 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23686 v2.AuxInt = int16ToAuxInt(d + 1)
23687 v1.AddArg2(x, v2)
23688 v.AddArg2(v0, v1)
23689 return true
23690 }
23691 break
23692 }
23693
23694
23695
23696 for {
23697 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23698 if v_0.Op != OpLeq16 {
23699 continue
23700 }
23701 x := v_0.Args[1]
23702 v_0_0 := v_0.Args[0]
23703 if v_0_0.Op != OpConst16 {
23704 continue
23705 }
23706 c := auxIntToInt16(v_0_0.AuxInt)
23707 if v_1.Op != OpLeq16 {
23708 continue
23709 }
23710 _ = v_1.Args[1]
23711 if x != v_1.Args[0] {
23712 continue
23713 }
23714 v_1_1 := v_1.Args[1]
23715 if v_1_1.Op != OpConst16 {
23716 continue
23717 }
23718 d := auxIntToInt16(v_1_1.AuxInt)
23719 if !(c >= d+1 && d+1 > d) {
23720 continue
23721 }
23722 v.reset(OpLeq16U)
23723 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23724 v0.AuxInt = int16ToAuxInt(c - d - 1)
23725 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23726 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23727 v2.AuxInt = int16ToAuxInt(d + 1)
23728 v1.AddArg2(x, v2)
23729 v.AddArg2(v0, v1)
23730 return true
23731 }
23732 break
23733 }
23734
23735
23736
23737 for {
23738 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23739 if v_0.Op != OpLess8 {
23740 continue
23741 }
23742 x := v_0.Args[1]
23743 v_0_0 := v_0.Args[0]
23744 if v_0_0.Op != OpConst8 {
23745 continue
23746 }
23747 c := auxIntToInt8(v_0_0.AuxInt)
23748 if v_1.Op != OpLeq8 {
23749 continue
23750 }
23751 _ = v_1.Args[1]
23752 if x != v_1.Args[0] {
23753 continue
23754 }
23755 v_1_1 := v_1.Args[1]
23756 if v_1_1.Op != OpConst8 {
23757 continue
23758 }
23759 d := auxIntToInt8(v_1_1.AuxInt)
23760 if !(c >= d+1 && d+1 > d) {
23761 continue
23762 }
23763 v.reset(OpLess8U)
23764 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23765 v0.AuxInt = int8ToAuxInt(c - d - 1)
23766 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23767 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23768 v2.AuxInt = int8ToAuxInt(d + 1)
23769 v1.AddArg2(x, v2)
23770 v.AddArg2(v0, v1)
23771 return true
23772 }
23773 break
23774 }
23775
23776
23777
23778 for {
23779 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23780 if v_0.Op != OpLeq8 {
23781 continue
23782 }
23783 x := v_0.Args[1]
23784 v_0_0 := v_0.Args[0]
23785 if v_0_0.Op != OpConst8 {
23786 continue
23787 }
23788 c := auxIntToInt8(v_0_0.AuxInt)
23789 if v_1.Op != OpLeq8 {
23790 continue
23791 }
23792 _ = v_1.Args[1]
23793 if x != v_1.Args[0] {
23794 continue
23795 }
23796 v_1_1 := v_1.Args[1]
23797 if v_1_1.Op != OpConst8 {
23798 continue
23799 }
23800 d := auxIntToInt8(v_1_1.AuxInt)
23801 if !(c >= d+1 && d+1 > d) {
23802 continue
23803 }
23804 v.reset(OpLeq8U)
23805 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23806 v0.AuxInt = int8ToAuxInt(c - d - 1)
23807 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23808 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23809 v2.AuxInt = int8ToAuxInt(d + 1)
23810 v1.AddArg2(x, v2)
23811 v.AddArg2(v0, v1)
23812 return true
23813 }
23814 break
23815 }
23816
23817
23818
23819 for {
23820 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23821 if v_0.Op != OpLess64U {
23822 continue
23823 }
23824 x := v_0.Args[1]
23825 v_0_0 := v_0.Args[0]
23826 if v_0_0.Op != OpConst64 {
23827 continue
23828 }
23829 c := auxIntToInt64(v_0_0.AuxInt)
23830 if v_1.Op != OpLess64U {
23831 continue
23832 }
23833 _ = v_1.Args[1]
23834 if x != v_1.Args[0] {
23835 continue
23836 }
23837 v_1_1 := v_1.Args[1]
23838 if v_1_1.Op != OpConst64 {
23839 continue
23840 }
23841 d := auxIntToInt64(v_1_1.AuxInt)
23842 if !(uint64(c) >= uint64(d)) {
23843 continue
23844 }
23845 v.reset(OpLess64U)
23846 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23847 v0.AuxInt = int64ToAuxInt(c - d)
23848 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23849 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23850 v2.AuxInt = int64ToAuxInt(d)
23851 v1.AddArg2(x, v2)
23852 v.AddArg2(v0, v1)
23853 return true
23854 }
23855 break
23856 }
23857
23858
23859
23860 for {
23861 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23862 if v_0.Op != OpLeq64U {
23863 continue
23864 }
23865 x := v_0.Args[1]
23866 v_0_0 := v_0.Args[0]
23867 if v_0_0.Op != OpConst64 {
23868 continue
23869 }
23870 c := auxIntToInt64(v_0_0.AuxInt)
23871 if v_1.Op != OpLess64U {
23872 continue
23873 }
23874 _ = v_1.Args[1]
23875 if x != v_1.Args[0] {
23876 continue
23877 }
23878 v_1_1 := v_1.Args[1]
23879 if v_1_1.Op != OpConst64 {
23880 continue
23881 }
23882 d := auxIntToInt64(v_1_1.AuxInt)
23883 if !(uint64(c) >= uint64(d)) {
23884 continue
23885 }
23886 v.reset(OpLeq64U)
23887 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23888 v0.AuxInt = int64ToAuxInt(c - d)
23889 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23890 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23891 v2.AuxInt = int64ToAuxInt(d)
23892 v1.AddArg2(x, v2)
23893 v.AddArg2(v0, v1)
23894 return true
23895 }
23896 break
23897 }
23898
23899
23900
23901 for {
23902 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23903 if v_0.Op != OpLess32U {
23904 continue
23905 }
23906 x := v_0.Args[1]
23907 v_0_0 := v_0.Args[0]
23908 if v_0_0.Op != OpConst32 {
23909 continue
23910 }
23911 c := auxIntToInt32(v_0_0.AuxInt)
23912 if v_1.Op != OpLess32U {
23913 continue
23914 }
23915 _ = v_1.Args[1]
23916 if x != v_1.Args[0] {
23917 continue
23918 }
23919 v_1_1 := v_1.Args[1]
23920 if v_1_1.Op != OpConst32 {
23921 continue
23922 }
23923 d := auxIntToInt32(v_1_1.AuxInt)
23924 if !(uint32(c) >= uint32(d)) {
23925 continue
23926 }
23927 v.reset(OpLess32U)
23928 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23929 v0.AuxInt = int32ToAuxInt(c - d)
23930 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23931 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23932 v2.AuxInt = int32ToAuxInt(d)
23933 v1.AddArg2(x, v2)
23934 v.AddArg2(v0, v1)
23935 return true
23936 }
23937 break
23938 }
23939
23940
23941
23942 for {
23943 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23944 if v_0.Op != OpLeq32U {
23945 continue
23946 }
23947 x := v_0.Args[1]
23948 v_0_0 := v_0.Args[0]
23949 if v_0_0.Op != OpConst32 {
23950 continue
23951 }
23952 c := auxIntToInt32(v_0_0.AuxInt)
23953 if v_1.Op != OpLess32U {
23954 continue
23955 }
23956 _ = v_1.Args[1]
23957 if x != v_1.Args[0] {
23958 continue
23959 }
23960 v_1_1 := v_1.Args[1]
23961 if v_1_1.Op != OpConst32 {
23962 continue
23963 }
23964 d := auxIntToInt32(v_1_1.AuxInt)
23965 if !(uint32(c) >= uint32(d)) {
23966 continue
23967 }
23968 v.reset(OpLeq32U)
23969 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23970 v0.AuxInt = int32ToAuxInt(c - d)
23971 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23972 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23973 v2.AuxInt = int32ToAuxInt(d)
23974 v1.AddArg2(x, v2)
23975 v.AddArg2(v0, v1)
23976 return true
23977 }
23978 break
23979 }
23980
23981
23982
23983 for {
23984 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23985 if v_0.Op != OpLess16U {
23986 continue
23987 }
23988 x := v_0.Args[1]
23989 v_0_0 := v_0.Args[0]
23990 if v_0_0.Op != OpConst16 {
23991 continue
23992 }
23993 c := auxIntToInt16(v_0_0.AuxInt)
23994 if v_1.Op != OpLess16U {
23995 continue
23996 }
23997 _ = v_1.Args[1]
23998 if x != v_1.Args[0] {
23999 continue
24000 }
24001 v_1_1 := v_1.Args[1]
24002 if v_1_1.Op != OpConst16 {
24003 continue
24004 }
24005 d := auxIntToInt16(v_1_1.AuxInt)
24006 if !(uint16(c) >= uint16(d)) {
24007 continue
24008 }
24009 v.reset(OpLess16U)
24010 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24011 v0.AuxInt = int16ToAuxInt(c - d)
24012 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24013 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24014 v2.AuxInt = int16ToAuxInt(d)
24015 v1.AddArg2(x, v2)
24016 v.AddArg2(v0, v1)
24017 return true
24018 }
24019 break
24020 }
24021
24022
24023
24024 for {
24025 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24026 if v_0.Op != OpLeq16U {
24027 continue
24028 }
24029 x := v_0.Args[1]
24030 v_0_0 := v_0.Args[0]
24031 if v_0_0.Op != OpConst16 {
24032 continue
24033 }
24034 c := auxIntToInt16(v_0_0.AuxInt)
24035 if v_1.Op != OpLess16U {
24036 continue
24037 }
24038 _ = v_1.Args[1]
24039 if x != v_1.Args[0] {
24040 continue
24041 }
24042 v_1_1 := v_1.Args[1]
24043 if v_1_1.Op != OpConst16 {
24044 continue
24045 }
24046 d := auxIntToInt16(v_1_1.AuxInt)
24047 if !(uint16(c) >= uint16(d)) {
24048 continue
24049 }
24050 v.reset(OpLeq16U)
24051 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24052 v0.AuxInt = int16ToAuxInt(c - d)
24053 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24054 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24055 v2.AuxInt = int16ToAuxInt(d)
24056 v1.AddArg2(x, v2)
24057 v.AddArg2(v0, v1)
24058 return true
24059 }
24060 break
24061 }
24062
24063
24064
24065 for {
24066 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24067 if v_0.Op != OpLess8U {
24068 continue
24069 }
24070 x := v_0.Args[1]
24071 v_0_0 := v_0.Args[0]
24072 if v_0_0.Op != OpConst8 {
24073 continue
24074 }
24075 c := auxIntToInt8(v_0_0.AuxInt)
24076 if v_1.Op != OpLess8U {
24077 continue
24078 }
24079 _ = v_1.Args[1]
24080 if x != v_1.Args[0] {
24081 continue
24082 }
24083 v_1_1 := v_1.Args[1]
24084 if v_1_1.Op != OpConst8 {
24085 continue
24086 }
24087 d := auxIntToInt8(v_1_1.AuxInt)
24088 if !(uint8(c) >= uint8(d)) {
24089 continue
24090 }
24091 v.reset(OpLess8U)
24092 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24093 v0.AuxInt = int8ToAuxInt(c - d)
24094 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24095 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24096 v2.AuxInt = int8ToAuxInt(d)
24097 v1.AddArg2(x, v2)
24098 v.AddArg2(v0, v1)
24099 return true
24100 }
24101 break
24102 }
24103
24104
24105
24106 for {
24107 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24108 if v_0.Op != OpLeq8U {
24109 continue
24110 }
24111 x := v_0.Args[1]
24112 v_0_0 := v_0.Args[0]
24113 if v_0_0.Op != OpConst8 {
24114 continue
24115 }
24116 c := auxIntToInt8(v_0_0.AuxInt)
24117 if v_1.Op != OpLess8U {
24118 continue
24119 }
24120 _ = v_1.Args[1]
24121 if x != v_1.Args[0] {
24122 continue
24123 }
24124 v_1_1 := v_1.Args[1]
24125 if v_1_1.Op != OpConst8 {
24126 continue
24127 }
24128 d := auxIntToInt8(v_1_1.AuxInt)
24129 if !(uint8(c) >= uint8(d)) {
24130 continue
24131 }
24132 v.reset(OpLeq8U)
24133 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24134 v0.AuxInt = int8ToAuxInt(c - d)
24135 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24136 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24137 v2.AuxInt = int8ToAuxInt(d)
24138 v1.AddArg2(x, v2)
24139 v.AddArg2(v0, v1)
24140 return true
24141 }
24142 break
24143 }
24144
24145
24146
24147 for {
24148 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24149 if v_0.Op != OpLess64U {
24150 continue
24151 }
24152 x := v_0.Args[1]
24153 v_0_0 := v_0.Args[0]
24154 if v_0_0.Op != OpConst64 {
24155 continue
24156 }
24157 c := auxIntToInt64(v_0_0.AuxInt)
24158 if v_1.Op != OpLeq64U {
24159 continue
24160 }
24161 _ = v_1.Args[1]
24162 if x != v_1.Args[0] {
24163 continue
24164 }
24165 v_1_1 := v_1.Args[1]
24166 if v_1_1.Op != OpConst64 {
24167 continue
24168 }
24169 d := auxIntToInt64(v_1_1.AuxInt)
24170 if !(uint64(c) >= uint64(d+1) && uint64(d+1) > uint64(d)) {
24171 continue
24172 }
24173 v.reset(OpLess64U)
24174 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
24175 v0.AuxInt = int64ToAuxInt(c - d - 1)
24176 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
24177 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
24178 v2.AuxInt = int64ToAuxInt(d + 1)
24179 v1.AddArg2(x, v2)
24180 v.AddArg2(v0, v1)
24181 return true
24182 }
24183 break
24184 }
24185
24186
24187
24188 for {
24189 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24190 if v_0.Op != OpLeq64U {
24191 continue
24192 }
24193 x := v_0.Args[1]
24194 v_0_0 := v_0.Args[0]
24195 if v_0_0.Op != OpConst64 {
24196 continue
24197 }
24198 c := auxIntToInt64(v_0_0.AuxInt)
24199 if v_1.Op != OpLeq64U {
24200 continue
24201 }
24202 _ = v_1.Args[1]
24203 if x != v_1.Args[0] {
24204 continue
24205 }
24206 v_1_1 := v_1.Args[1]
24207 if v_1_1.Op != OpConst64 {
24208 continue
24209 }
24210 d := auxIntToInt64(v_1_1.AuxInt)
24211 if !(uint64(c) >= uint64(d+1) && uint64(d+1) > uint64(d)) {
24212 continue
24213 }
24214 v.reset(OpLeq64U)
24215 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
24216 v0.AuxInt = int64ToAuxInt(c - d - 1)
24217 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
24218 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
24219 v2.AuxInt = int64ToAuxInt(d + 1)
24220 v1.AddArg2(x, v2)
24221 v.AddArg2(v0, v1)
24222 return true
24223 }
24224 break
24225 }
24226
24227
24228
24229 for {
24230 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24231 if v_0.Op != OpLess32U {
24232 continue
24233 }
24234 x := v_0.Args[1]
24235 v_0_0 := v_0.Args[0]
24236 if v_0_0.Op != OpConst32 {
24237 continue
24238 }
24239 c := auxIntToInt32(v_0_0.AuxInt)
24240 if v_1.Op != OpLeq32U {
24241 continue
24242 }
24243 _ = v_1.Args[1]
24244 if x != v_1.Args[0] {
24245 continue
24246 }
24247 v_1_1 := v_1.Args[1]
24248 if v_1_1.Op != OpConst32 {
24249 continue
24250 }
24251 d := auxIntToInt32(v_1_1.AuxInt)
24252 if !(uint32(c) >= uint32(d+1) && uint32(d+1) > uint32(d)) {
24253 continue
24254 }
24255 v.reset(OpLess32U)
24256 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
24257 v0.AuxInt = int32ToAuxInt(c - d - 1)
24258 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
24259 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
24260 v2.AuxInt = int32ToAuxInt(d + 1)
24261 v1.AddArg2(x, v2)
24262 v.AddArg2(v0, v1)
24263 return true
24264 }
24265 break
24266 }
24267
24268
24269
24270 for {
24271 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24272 if v_0.Op != OpLeq32U {
24273 continue
24274 }
24275 x := v_0.Args[1]
24276 v_0_0 := v_0.Args[0]
24277 if v_0_0.Op != OpConst32 {
24278 continue
24279 }
24280 c := auxIntToInt32(v_0_0.AuxInt)
24281 if v_1.Op != OpLeq32U {
24282 continue
24283 }
24284 _ = v_1.Args[1]
24285 if x != v_1.Args[0] {
24286 continue
24287 }
24288 v_1_1 := v_1.Args[1]
24289 if v_1_1.Op != OpConst32 {
24290 continue
24291 }
24292 d := auxIntToInt32(v_1_1.AuxInt)
24293 if !(uint32(c) >= uint32(d+1) && uint32(d+1) > uint32(d)) {
24294 continue
24295 }
24296 v.reset(OpLeq32U)
24297 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
24298 v0.AuxInt = int32ToAuxInt(c - d - 1)
24299 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
24300 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
24301 v2.AuxInt = int32ToAuxInt(d + 1)
24302 v1.AddArg2(x, v2)
24303 v.AddArg2(v0, v1)
24304 return true
24305 }
24306 break
24307 }
24308
24309
24310
24311 for {
24312 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24313 if v_0.Op != OpLess16U {
24314 continue
24315 }
24316 x := v_0.Args[1]
24317 v_0_0 := v_0.Args[0]
24318 if v_0_0.Op != OpConst16 {
24319 continue
24320 }
24321 c := auxIntToInt16(v_0_0.AuxInt)
24322 if v_1.Op != OpLeq16U {
24323 continue
24324 }
24325 _ = v_1.Args[1]
24326 if x != v_1.Args[0] {
24327 continue
24328 }
24329 v_1_1 := v_1.Args[1]
24330 if v_1_1.Op != OpConst16 {
24331 continue
24332 }
24333 d := auxIntToInt16(v_1_1.AuxInt)
24334 if !(uint16(c) >= uint16(d+1) && uint16(d+1) > uint16(d)) {
24335 continue
24336 }
24337 v.reset(OpLess16U)
24338 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24339 v0.AuxInt = int16ToAuxInt(c - d - 1)
24340 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24341 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24342 v2.AuxInt = int16ToAuxInt(d + 1)
24343 v1.AddArg2(x, v2)
24344 v.AddArg2(v0, v1)
24345 return true
24346 }
24347 break
24348 }
24349
24350
24351
24352 for {
24353 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24354 if v_0.Op != OpLeq16U {
24355 continue
24356 }
24357 x := v_0.Args[1]
24358 v_0_0 := v_0.Args[0]
24359 if v_0_0.Op != OpConst16 {
24360 continue
24361 }
24362 c := auxIntToInt16(v_0_0.AuxInt)
24363 if v_1.Op != OpLeq16U {
24364 continue
24365 }
24366 _ = v_1.Args[1]
24367 if x != v_1.Args[0] {
24368 continue
24369 }
24370 v_1_1 := v_1.Args[1]
24371 if v_1_1.Op != OpConst16 {
24372 continue
24373 }
24374 d := auxIntToInt16(v_1_1.AuxInt)
24375 if !(uint16(c) >= uint16(d+1) && uint16(d+1) > uint16(d)) {
24376 continue
24377 }
24378 v.reset(OpLeq16U)
24379 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24380 v0.AuxInt = int16ToAuxInt(c - d - 1)
24381 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24382 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24383 v2.AuxInt = int16ToAuxInt(d + 1)
24384 v1.AddArg2(x, v2)
24385 v.AddArg2(v0, v1)
24386 return true
24387 }
24388 break
24389 }
24390
24391
24392
24393 for {
24394 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24395 if v_0.Op != OpLess8U {
24396 continue
24397 }
24398 x := v_0.Args[1]
24399 v_0_0 := v_0.Args[0]
24400 if v_0_0.Op != OpConst8 {
24401 continue
24402 }
24403 c := auxIntToInt8(v_0_0.AuxInt)
24404 if v_1.Op != OpLeq8U {
24405 continue
24406 }
24407 _ = v_1.Args[1]
24408 if x != v_1.Args[0] {
24409 continue
24410 }
24411 v_1_1 := v_1.Args[1]
24412 if v_1_1.Op != OpConst8 {
24413 continue
24414 }
24415 d := auxIntToInt8(v_1_1.AuxInt)
24416 if !(uint8(c) >= uint8(d+1) && uint8(d+1) > uint8(d)) {
24417 continue
24418 }
24419 v.reset(OpLess8U)
24420 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24421 v0.AuxInt = int8ToAuxInt(c - d - 1)
24422 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24423 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24424 v2.AuxInt = int8ToAuxInt(d + 1)
24425 v1.AddArg2(x, v2)
24426 v.AddArg2(v0, v1)
24427 return true
24428 }
24429 break
24430 }
24431
24432
24433
24434 for {
24435 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24436 if v_0.Op != OpLeq8U {
24437 continue
24438 }
24439 x := v_0.Args[1]
24440 v_0_0 := v_0.Args[0]
24441 if v_0_0.Op != OpConst8 {
24442 continue
24443 }
24444 c := auxIntToInt8(v_0_0.AuxInt)
24445 if v_1.Op != OpLeq8U {
24446 continue
24447 }
24448 _ = v_1.Args[1]
24449 if x != v_1.Args[0] {
24450 continue
24451 }
24452 v_1_1 := v_1.Args[1]
24453 if v_1_1.Op != OpConst8 {
24454 continue
24455 }
24456 d := auxIntToInt8(v_1_1.AuxInt)
24457 if !(uint8(c) >= uint8(d+1) && uint8(d+1) > uint8(d)) {
24458 continue
24459 }
24460 v.reset(OpLeq8U)
24461 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24462 v0.AuxInt = int8ToAuxInt(c - d - 1)
24463 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24464 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24465 v2.AuxInt = int8ToAuxInt(d + 1)
24466 v1.AddArg2(x, v2)
24467 v.AddArg2(v0, v1)
24468 return true
24469 }
24470 break
24471 }
24472 return false
24473 }
24474 func rewriteValuegeneric_OpPhi(v *Value) bool {
24475 b := v.Block
24476
24477
24478 for {
24479 if len(v.Args) != 2 {
24480 break
24481 }
24482 _ = v.Args[1]
24483 v_0 := v.Args[0]
24484 if v_0.Op != OpConst8 {
24485 break
24486 }
24487 c := auxIntToInt8(v_0.AuxInt)
24488 v_1 := v.Args[1]
24489 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != c {
24490 break
24491 }
24492 v.reset(OpConst8)
24493 v.AuxInt = int8ToAuxInt(c)
24494 return true
24495 }
24496
24497
24498 for {
24499 if len(v.Args) != 2 {
24500 break
24501 }
24502 _ = v.Args[1]
24503 v_0 := v.Args[0]
24504 if v_0.Op != OpConst16 {
24505 break
24506 }
24507 c := auxIntToInt16(v_0.AuxInt)
24508 v_1 := v.Args[1]
24509 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != c {
24510 break
24511 }
24512 v.reset(OpConst16)
24513 v.AuxInt = int16ToAuxInt(c)
24514 return true
24515 }
24516
24517
24518 for {
24519 if len(v.Args) != 2 {
24520 break
24521 }
24522 _ = v.Args[1]
24523 v_0 := v.Args[0]
24524 if v_0.Op != OpConst32 {
24525 break
24526 }
24527 c := auxIntToInt32(v_0.AuxInt)
24528 v_1 := v.Args[1]
24529 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != c {
24530 break
24531 }
24532 v.reset(OpConst32)
24533 v.AuxInt = int32ToAuxInt(c)
24534 return true
24535 }
24536
24537
24538 for {
24539 if len(v.Args) != 2 {
24540 break
24541 }
24542 _ = v.Args[1]
24543 v_0 := v.Args[0]
24544 if v_0.Op != OpConst64 {
24545 break
24546 }
24547 c := auxIntToInt64(v_0.AuxInt)
24548 v_1 := v.Args[1]
24549 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c {
24550 break
24551 }
24552 v.reset(OpConst64)
24553 v.AuxInt = int64ToAuxInt(c)
24554 return true
24555 }
24556
24557
24558
24559 for {
24560 if len(v.Args) != 2 {
24561 break
24562 }
24563 t := v.Type
24564 _ = v.Args[1]
24565 nx := v.Args[0]
24566 if nx.Op != OpNot {
24567 break
24568 }
24569 x := nx.Args[0]
24570 ny := v.Args[1]
24571 if ny.Op != OpNot {
24572 break
24573 }
24574 y := ny.Args[0]
24575 if !(nx.Uses == 1 && ny.Uses == 1) {
24576 break
24577 }
24578 v.reset(OpNot)
24579 v0 := b.NewValue0(v.Pos, OpPhi, t)
24580 v0.AddArg2(x, y)
24581 v.AddArg(v0)
24582 return true
24583 }
24584 return false
24585 }
24586 func rewriteValuegeneric_OpPtrIndex(v *Value) bool {
24587 v_1 := v.Args[1]
24588 v_0 := v.Args[0]
24589 b := v.Block
24590 config := b.Func.Config
24591 typ := &b.Func.Config.Types
24592
24593
24594
24595 for {
24596 t := v.Type
24597 ptr := v_0
24598 idx := v_1
24599 if !(config.PtrSize == 4 && is32Bit(t.Elem().Size())) {
24600 break
24601 }
24602 v.reset(OpAddPtr)
24603 v0 := b.NewValue0(v.Pos, OpMul32, typ.Int)
24604 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
24605 v1.AuxInt = int32ToAuxInt(int32(t.Elem().Size()))
24606 v0.AddArg2(idx, v1)
24607 v.AddArg2(ptr, v0)
24608 return true
24609 }
24610
24611
24612
24613 for {
24614 t := v.Type
24615 ptr := v_0
24616 idx := v_1
24617 if !(config.PtrSize == 8) {
24618 break
24619 }
24620 v.reset(OpAddPtr)
24621 v0 := b.NewValue0(v.Pos, OpMul64, typ.Int)
24622 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
24623 v1.AuxInt = int64ToAuxInt(t.Elem().Size())
24624 v0.AddArg2(idx, v1)
24625 v.AddArg2(ptr, v0)
24626 return true
24627 }
24628 return false
24629 }
24630 func rewriteValuegeneric_OpRotateLeft16(v *Value) bool {
24631 v_1 := v.Args[1]
24632 v_0 := v.Args[0]
24633 b := v.Block
24634 config := b.Func.Config
24635
24636
24637
24638 for {
24639 x := v_0
24640 if v_1.Op != OpConst16 {
24641 break
24642 }
24643 c := auxIntToInt16(v_1.AuxInt)
24644 if !(c%16 == 0) {
24645 break
24646 }
24647 v.copyOf(x)
24648 return true
24649 }
24650
24651
24652
24653 for {
24654 x := v_0
24655 if v_1.Op != OpAnd64 {
24656 break
24657 }
24658 _ = v_1.Args[1]
24659 v_1_0 := v_1.Args[0]
24660 v_1_1 := v_1.Args[1]
24661 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24662 y := v_1_0
24663 if v_1_1.Op != OpConst64 {
24664 continue
24665 }
24666 c := auxIntToInt64(v_1_1.AuxInt)
24667 if !(c&15 == 15) {
24668 continue
24669 }
24670 v.reset(OpRotateLeft16)
24671 v.AddArg2(x, y)
24672 return true
24673 }
24674 break
24675 }
24676
24677
24678
24679 for {
24680 x := v_0
24681 if v_1.Op != OpAnd32 {
24682 break
24683 }
24684 _ = v_1.Args[1]
24685 v_1_0 := v_1.Args[0]
24686 v_1_1 := v_1.Args[1]
24687 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24688 y := v_1_0
24689 if v_1_1.Op != OpConst32 {
24690 continue
24691 }
24692 c := auxIntToInt32(v_1_1.AuxInt)
24693 if !(c&15 == 15) {
24694 continue
24695 }
24696 v.reset(OpRotateLeft16)
24697 v.AddArg2(x, y)
24698 return true
24699 }
24700 break
24701 }
24702
24703
24704
24705 for {
24706 x := v_0
24707 if v_1.Op != OpAnd16 {
24708 break
24709 }
24710 _ = v_1.Args[1]
24711 v_1_0 := v_1.Args[0]
24712 v_1_1 := v_1.Args[1]
24713 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24714 y := v_1_0
24715 if v_1_1.Op != OpConst16 {
24716 continue
24717 }
24718 c := auxIntToInt16(v_1_1.AuxInt)
24719 if !(c&15 == 15) {
24720 continue
24721 }
24722 v.reset(OpRotateLeft16)
24723 v.AddArg2(x, y)
24724 return true
24725 }
24726 break
24727 }
24728
24729
24730
24731 for {
24732 x := v_0
24733 if v_1.Op != OpAnd8 {
24734 break
24735 }
24736 _ = v_1.Args[1]
24737 v_1_0 := v_1.Args[0]
24738 v_1_1 := v_1.Args[1]
24739 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24740 y := v_1_0
24741 if v_1_1.Op != OpConst8 {
24742 continue
24743 }
24744 c := auxIntToInt8(v_1_1.AuxInt)
24745 if !(c&15 == 15) {
24746 continue
24747 }
24748 v.reset(OpRotateLeft16)
24749 v.AddArg2(x, y)
24750 return true
24751 }
24752 break
24753 }
24754
24755
24756
24757 for {
24758 x := v_0
24759 if v_1.Op != OpNeg64 {
24760 break
24761 }
24762 v_1_0 := v_1.Args[0]
24763 if v_1_0.Op != OpAnd64 {
24764 break
24765 }
24766 _ = v_1_0.Args[1]
24767 v_1_0_0 := v_1_0.Args[0]
24768 v_1_0_1 := v_1_0.Args[1]
24769 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
24770 y := v_1_0_0
24771 if v_1_0_1.Op != OpConst64 {
24772 continue
24773 }
24774 c := auxIntToInt64(v_1_0_1.AuxInt)
24775 if !(c&15 == 15) {
24776 continue
24777 }
24778 v.reset(OpRotateLeft16)
24779 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
24780 v0.AddArg(y)
24781 v.AddArg2(x, v0)
24782 return true
24783 }
24784 break
24785 }
24786
24787
24788
24789 for {
24790 x := v_0
24791 if v_1.Op != OpNeg32 {
24792 break
24793 }
24794 v_1_0 := v_1.Args[0]
24795 if v_1_0.Op != OpAnd32 {
24796 break
24797 }
24798 _ = v_1_0.Args[1]
24799 v_1_0_0 := v_1_0.Args[0]
24800 v_1_0_1 := v_1_0.Args[1]
24801 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
24802 y := v_1_0_0
24803 if v_1_0_1.Op != OpConst32 {
24804 continue
24805 }
24806 c := auxIntToInt32(v_1_0_1.AuxInt)
24807 if !(c&15 == 15) {
24808 continue
24809 }
24810 v.reset(OpRotateLeft16)
24811 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
24812 v0.AddArg(y)
24813 v.AddArg2(x, v0)
24814 return true
24815 }
24816 break
24817 }
24818
24819
24820
24821 for {
24822 x := v_0
24823 if v_1.Op != OpNeg16 {
24824 break
24825 }
24826 v_1_0 := v_1.Args[0]
24827 if v_1_0.Op != OpAnd16 {
24828 break
24829 }
24830 _ = v_1_0.Args[1]
24831 v_1_0_0 := v_1_0.Args[0]
24832 v_1_0_1 := v_1_0.Args[1]
24833 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
24834 y := v_1_0_0
24835 if v_1_0_1.Op != OpConst16 {
24836 continue
24837 }
24838 c := auxIntToInt16(v_1_0_1.AuxInt)
24839 if !(c&15 == 15) {
24840 continue
24841 }
24842 v.reset(OpRotateLeft16)
24843 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
24844 v0.AddArg(y)
24845 v.AddArg2(x, v0)
24846 return true
24847 }
24848 break
24849 }
24850
24851
24852
24853 for {
24854 x := v_0
24855 if v_1.Op != OpNeg8 {
24856 break
24857 }
24858 v_1_0 := v_1.Args[0]
24859 if v_1_0.Op != OpAnd8 {
24860 break
24861 }
24862 _ = v_1_0.Args[1]
24863 v_1_0_0 := v_1_0.Args[0]
24864 v_1_0_1 := v_1_0.Args[1]
24865 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
24866 y := v_1_0_0
24867 if v_1_0_1.Op != OpConst8 {
24868 continue
24869 }
24870 c := auxIntToInt8(v_1_0_1.AuxInt)
24871 if !(c&15 == 15) {
24872 continue
24873 }
24874 v.reset(OpRotateLeft16)
24875 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
24876 v0.AddArg(y)
24877 v.AddArg2(x, v0)
24878 return true
24879 }
24880 break
24881 }
24882
24883
24884
24885 for {
24886 x := v_0
24887 if v_1.Op != OpAdd64 {
24888 break
24889 }
24890 _ = v_1.Args[1]
24891 v_1_0 := v_1.Args[0]
24892 v_1_1 := v_1.Args[1]
24893 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24894 y := v_1_0
24895 if v_1_1.Op != OpConst64 {
24896 continue
24897 }
24898 c := auxIntToInt64(v_1_1.AuxInt)
24899 if !(c&15 == 0) {
24900 continue
24901 }
24902 v.reset(OpRotateLeft16)
24903 v.AddArg2(x, y)
24904 return true
24905 }
24906 break
24907 }
24908
24909
24910
24911 for {
24912 x := v_0
24913 if v_1.Op != OpAdd32 {
24914 break
24915 }
24916 _ = v_1.Args[1]
24917 v_1_0 := v_1.Args[0]
24918 v_1_1 := v_1.Args[1]
24919 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24920 y := v_1_0
24921 if v_1_1.Op != OpConst32 {
24922 continue
24923 }
24924 c := auxIntToInt32(v_1_1.AuxInt)
24925 if !(c&15 == 0) {
24926 continue
24927 }
24928 v.reset(OpRotateLeft16)
24929 v.AddArg2(x, y)
24930 return true
24931 }
24932 break
24933 }
24934
24935
24936
24937 for {
24938 x := v_0
24939 if v_1.Op != OpAdd16 {
24940 break
24941 }
24942 _ = v_1.Args[1]
24943 v_1_0 := v_1.Args[0]
24944 v_1_1 := v_1.Args[1]
24945 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24946 y := v_1_0
24947 if v_1_1.Op != OpConst16 {
24948 continue
24949 }
24950 c := auxIntToInt16(v_1_1.AuxInt)
24951 if !(c&15 == 0) {
24952 continue
24953 }
24954 v.reset(OpRotateLeft16)
24955 v.AddArg2(x, y)
24956 return true
24957 }
24958 break
24959 }
24960
24961
24962
24963 for {
24964 x := v_0
24965 if v_1.Op != OpAdd8 {
24966 break
24967 }
24968 _ = v_1.Args[1]
24969 v_1_0 := v_1.Args[0]
24970 v_1_1 := v_1.Args[1]
24971 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24972 y := v_1_0
24973 if v_1_1.Op != OpConst8 {
24974 continue
24975 }
24976 c := auxIntToInt8(v_1_1.AuxInt)
24977 if !(c&15 == 0) {
24978 continue
24979 }
24980 v.reset(OpRotateLeft16)
24981 v.AddArg2(x, y)
24982 return true
24983 }
24984 break
24985 }
24986
24987
24988
24989 for {
24990 x := v_0
24991 if v_1.Op != OpSub64 {
24992 break
24993 }
24994 y := v_1.Args[1]
24995 v_1_0 := v_1.Args[0]
24996 if v_1_0.Op != OpConst64 {
24997 break
24998 }
24999 c := auxIntToInt64(v_1_0.AuxInt)
25000 if !(c&15 == 0) {
25001 break
25002 }
25003 v.reset(OpRotateLeft16)
25004 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
25005 v0.AddArg(y)
25006 v.AddArg2(x, v0)
25007 return true
25008 }
25009
25010
25011
25012 for {
25013 x := v_0
25014 if v_1.Op != OpSub32 {
25015 break
25016 }
25017 y := v_1.Args[1]
25018 v_1_0 := v_1.Args[0]
25019 if v_1_0.Op != OpConst32 {
25020 break
25021 }
25022 c := auxIntToInt32(v_1_0.AuxInt)
25023 if !(c&15 == 0) {
25024 break
25025 }
25026 v.reset(OpRotateLeft16)
25027 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
25028 v0.AddArg(y)
25029 v.AddArg2(x, v0)
25030 return true
25031 }
25032
25033
25034
25035 for {
25036 x := v_0
25037 if v_1.Op != OpSub16 {
25038 break
25039 }
25040 y := v_1.Args[1]
25041 v_1_0 := v_1.Args[0]
25042 if v_1_0.Op != OpConst16 {
25043 break
25044 }
25045 c := auxIntToInt16(v_1_0.AuxInt)
25046 if !(c&15 == 0) {
25047 break
25048 }
25049 v.reset(OpRotateLeft16)
25050 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
25051 v0.AddArg(y)
25052 v.AddArg2(x, v0)
25053 return true
25054 }
25055
25056
25057
25058 for {
25059 x := v_0
25060 if v_1.Op != OpSub8 {
25061 break
25062 }
25063 y := v_1.Args[1]
25064 v_1_0 := v_1.Args[0]
25065 if v_1_0.Op != OpConst8 {
25066 break
25067 }
25068 c := auxIntToInt8(v_1_0.AuxInt)
25069 if !(c&15 == 0) {
25070 break
25071 }
25072 v.reset(OpRotateLeft16)
25073 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
25074 v0.AddArg(y)
25075 v.AddArg2(x, v0)
25076 return true
25077 }
25078
25079
25080
25081 for {
25082 x := v_0
25083 if v_1.Op != OpConst64 {
25084 break
25085 }
25086 t := v_1.Type
25087 c := auxIntToInt64(v_1.AuxInt)
25088 if !(config.PtrSize == 4) {
25089 break
25090 }
25091 v.reset(OpRotateLeft16)
25092 v0 := b.NewValue0(v.Pos, OpConst32, t)
25093 v0.AuxInt = int32ToAuxInt(int32(c))
25094 v.AddArg2(x, v0)
25095 return true
25096 }
25097
25098
25099
25100 for {
25101 if v_0.Op != OpRotateLeft16 {
25102 break
25103 }
25104 c := v_0.Args[1]
25105 x := v_0.Args[0]
25106 d := v_1
25107 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
25108 break
25109 }
25110 v.reset(OpRotateLeft16)
25111 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
25112 v0.AddArg2(c, d)
25113 v.AddArg2(x, v0)
25114 return true
25115 }
25116
25117
25118
25119 for {
25120 if v_0.Op != OpRotateLeft16 {
25121 break
25122 }
25123 c := v_0.Args[1]
25124 x := v_0.Args[0]
25125 d := v_1
25126 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
25127 break
25128 }
25129 v.reset(OpRotateLeft16)
25130 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
25131 v0.AddArg2(c, d)
25132 v.AddArg2(x, v0)
25133 return true
25134 }
25135
25136
25137
25138 for {
25139 if v_0.Op != OpRotateLeft16 {
25140 break
25141 }
25142 c := v_0.Args[1]
25143 x := v_0.Args[0]
25144 d := v_1
25145 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
25146 break
25147 }
25148 v.reset(OpRotateLeft16)
25149 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
25150 v0.AddArg2(c, d)
25151 v.AddArg2(x, v0)
25152 return true
25153 }
25154
25155
25156
25157 for {
25158 if v_0.Op != OpRotateLeft16 {
25159 break
25160 }
25161 c := v_0.Args[1]
25162 x := v_0.Args[0]
25163 d := v_1
25164 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
25165 break
25166 }
25167 v.reset(OpRotateLeft16)
25168 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
25169 v0.AddArg2(c, d)
25170 v.AddArg2(x, v0)
25171 return true
25172 }
25173 return false
25174 }
25175 func rewriteValuegeneric_OpRotateLeft32(v *Value) bool {
25176 v_1 := v.Args[1]
25177 v_0 := v.Args[0]
25178 b := v.Block
25179 config := b.Func.Config
25180
25181
25182
25183 for {
25184 x := v_0
25185 if v_1.Op != OpConst32 {
25186 break
25187 }
25188 c := auxIntToInt32(v_1.AuxInt)
25189 if !(c%32 == 0) {
25190 break
25191 }
25192 v.copyOf(x)
25193 return true
25194 }
25195
25196
25197
25198 for {
25199 x := v_0
25200 if v_1.Op != OpAnd64 {
25201 break
25202 }
25203 _ = v_1.Args[1]
25204 v_1_0 := v_1.Args[0]
25205 v_1_1 := v_1.Args[1]
25206 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25207 y := v_1_0
25208 if v_1_1.Op != OpConst64 {
25209 continue
25210 }
25211 c := auxIntToInt64(v_1_1.AuxInt)
25212 if !(c&31 == 31) {
25213 continue
25214 }
25215 v.reset(OpRotateLeft32)
25216 v.AddArg2(x, y)
25217 return true
25218 }
25219 break
25220 }
25221
25222
25223
25224 for {
25225 x := v_0
25226 if v_1.Op != OpAnd32 {
25227 break
25228 }
25229 _ = v_1.Args[1]
25230 v_1_0 := v_1.Args[0]
25231 v_1_1 := v_1.Args[1]
25232 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25233 y := v_1_0
25234 if v_1_1.Op != OpConst32 {
25235 continue
25236 }
25237 c := auxIntToInt32(v_1_1.AuxInt)
25238 if !(c&31 == 31) {
25239 continue
25240 }
25241 v.reset(OpRotateLeft32)
25242 v.AddArg2(x, y)
25243 return true
25244 }
25245 break
25246 }
25247
25248
25249
25250 for {
25251 x := v_0
25252 if v_1.Op != OpAnd16 {
25253 break
25254 }
25255 _ = v_1.Args[1]
25256 v_1_0 := v_1.Args[0]
25257 v_1_1 := v_1.Args[1]
25258 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25259 y := v_1_0
25260 if v_1_1.Op != OpConst16 {
25261 continue
25262 }
25263 c := auxIntToInt16(v_1_1.AuxInt)
25264 if !(c&31 == 31) {
25265 continue
25266 }
25267 v.reset(OpRotateLeft32)
25268 v.AddArg2(x, y)
25269 return true
25270 }
25271 break
25272 }
25273
25274
25275
25276 for {
25277 x := v_0
25278 if v_1.Op != OpAnd8 {
25279 break
25280 }
25281 _ = v_1.Args[1]
25282 v_1_0 := v_1.Args[0]
25283 v_1_1 := v_1.Args[1]
25284 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25285 y := v_1_0
25286 if v_1_1.Op != OpConst8 {
25287 continue
25288 }
25289 c := auxIntToInt8(v_1_1.AuxInt)
25290 if !(c&31 == 31) {
25291 continue
25292 }
25293 v.reset(OpRotateLeft32)
25294 v.AddArg2(x, y)
25295 return true
25296 }
25297 break
25298 }
25299
25300
25301
25302 for {
25303 x := v_0
25304 if v_1.Op != OpNeg64 {
25305 break
25306 }
25307 v_1_0 := v_1.Args[0]
25308 if v_1_0.Op != OpAnd64 {
25309 break
25310 }
25311 _ = v_1_0.Args[1]
25312 v_1_0_0 := v_1_0.Args[0]
25313 v_1_0_1 := v_1_0.Args[1]
25314 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25315 y := v_1_0_0
25316 if v_1_0_1.Op != OpConst64 {
25317 continue
25318 }
25319 c := auxIntToInt64(v_1_0_1.AuxInt)
25320 if !(c&31 == 31) {
25321 continue
25322 }
25323 v.reset(OpRotateLeft32)
25324 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
25325 v0.AddArg(y)
25326 v.AddArg2(x, v0)
25327 return true
25328 }
25329 break
25330 }
25331
25332
25333
25334 for {
25335 x := v_0
25336 if v_1.Op != OpNeg32 {
25337 break
25338 }
25339 v_1_0 := v_1.Args[0]
25340 if v_1_0.Op != OpAnd32 {
25341 break
25342 }
25343 _ = v_1_0.Args[1]
25344 v_1_0_0 := v_1_0.Args[0]
25345 v_1_0_1 := v_1_0.Args[1]
25346 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25347 y := v_1_0_0
25348 if v_1_0_1.Op != OpConst32 {
25349 continue
25350 }
25351 c := auxIntToInt32(v_1_0_1.AuxInt)
25352 if !(c&31 == 31) {
25353 continue
25354 }
25355 v.reset(OpRotateLeft32)
25356 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
25357 v0.AddArg(y)
25358 v.AddArg2(x, v0)
25359 return true
25360 }
25361 break
25362 }
25363
25364
25365
25366 for {
25367 x := v_0
25368 if v_1.Op != OpNeg16 {
25369 break
25370 }
25371 v_1_0 := v_1.Args[0]
25372 if v_1_0.Op != OpAnd16 {
25373 break
25374 }
25375 _ = v_1_0.Args[1]
25376 v_1_0_0 := v_1_0.Args[0]
25377 v_1_0_1 := v_1_0.Args[1]
25378 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25379 y := v_1_0_0
25380 if v_1_0_1.Op != OpConst16 {
25381 continue
25382 }
25383 c := auxIntToInt16(v_1_0_1.AuxInt)
25384 if !(c&31 == 31) {
25385 continue
25386 }
25387 v.reset(OpRotateLeft32)
25388 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
25389 v0.AddArg(y)
25390 v.AddArg2(x, v0)
25391 return true
25392 }
25393 break
25394 }
25395
25396
25397
25398 for {
25399 x := v_0
25400 if v_1.Op != OpNeg8 {
25401 break
25402 }
25403 v_1_0 := v_1.Args[0]
25404 if v_1_0.Op != OpAnd8 {
25405 break
25406 }
25407 _ = v_1_0.Args[1]
25408 v_1_0_0 := v_1_0.Args[0]
25409 v_1_0_1 := v_1_0.Args[1]
25410 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25411 y := v_1_0_0
25412 if v_1_0_1.Op != OpConst8 {
25413 continue
25414 }
25415 c := auxIntToInt8(v_1_0_1.AuxInt)
25416 if !(c&31 == 31) {
25417 continue
25418 }
25419 v.reset(OpRotateLeft32)
25420 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
25421 v0.AddArg(y)
25422 v.AddArg2(x, v0)
25423 return true
25424 }
25425 break
25426 }
25427
25428
25429
25430 for {
25431 x := v_0
25432 if v_1.Op != OpAdd64 {
25433 break
25434 }
25435 _ = v_1.Args[1]
25436 v_1_0 := v_1.Args[0]
25437 v_1_1 := v_1.Args[1]
25438 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25439 y := v_1_0
25440 if v_1_1.Op != OpConst64 {
25441 continue
25442 }
25443 c := auxIntToInt64(v_1_1.AuxInt)
25444 if !(c&31 == 0) {
25445 continue
25446 }
25447 v.reset(OpRotateLeft32)
25448 v.AddArg2(x, y)
25449 return true
25450 }
25451 break
25452 }
25453
25454
25455
25456 for {
25457 x := v_0
25458 if v_1.Op != OpAdd32 {
25459 break
25460 }
25461 _ = v_1.Args[1]
25462 v_1_0 := v_1.Args[0]
25463 v_1_1 := v_1.Args[1]
25464 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25465 y := v_1_0
25466 if v_1_1.Op != OpConst32 {
25467 continue
25468 }
25469 c := auxIntToInt32(v_1_1.AuxInt)
25470 if !(c&31 == 0) {
25471 continue
25472 }
25473 v.reset(OpRotateLeft32)
25474 v.AddArg2(x, y)
25475 return true
25476 }
25477 break
25478 }
25479
25480
25481
25482 for {
25483 x := v_0
25484 if v_1.Op != OpAdd16 {
25485 break
25486 }
25487 _ = v_1.Args[1]
25488 v_1_0 := v_1.Args[0]
25489 v_1_1 := v_1.Args[1]
25490 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25491 y := v_1_0
25492 if v_1_1.Op != OpConst16 {
25493 continue
25494 }
25495 c := auxIntToInt16(v_1_1.AuxInt)
25496 if !(c&31 == 0) {
25497 continue
25498 }
25499 v.reset(OpRotateLeft32)
25500 v.AddArg2(x, y)
25501 return true
25502 }
25503 break
25504 }
25505
25506
25507
25508 for {
25509 x := v_0
25510 if v_1.Op != OpAdd8 {
25511 break
25512 }
25513 _ = v_1.Args[1]
25514 v_1_0 := v_1.Args[0]
25515 v_1_1 := v_1.Args[1]
25516 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25517 y := v_1_0
25518 if v_1_1.Op != OpConst8 {
25519 continue
25520 }
25521 c := auxIntToInt8(v_1_1.AuxInt)
25522 if !(c&31 == 0) {
25523 continue
25524 }
25525 v.reset(OpRotateLeft32)
25526 v.AddArg2(x, y)
25527 return true
25528 }
25529 break
25530 }
25531
25532
25533
25534 for {
25535 x := v_0
25536 if v_1.Op != OpSub64 {
25537 break
25538 }
25539 y := v_1.Args[1]
25540 v_1_0 := v_1.Args[0]
25541 if v_1_0.Op != OpConst64 {
25542 break
25543 }
25544 c := auxIntToInt64(v_1_0.AuxInt)
25545 if !(c&31 == 0) {
25546 break
25547 }
25548 v.reset(OpRotateLeft32)
25549 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
25550 v0.AddArg(y)
25551 v.AddArg2(x, v0)
25552 return true
25553 }
25554
25555
25556
25557 for {
25558 x := v_0
25559 if v_1.Op != OpSub32 {
25560 break
25561 }
25562 y := v_1.Args[1]
25563 v_1_0 := v_1.Args[0]
25564 if v_1_0.Op != OpConst32 {
25565 break
25566 }
25567 c := auxIntToInt32(v_1_0.AuxInt)
25568 if !(c&31 == 0) {
25569 break
25570 }
25571 v.reset(OpRotateLeft32)
25572 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
25573 v0.AddArg(y)
25574 v.AddArg2(x, v0)
25575 return true
25576 }
25577
25578
25579
25580 for {
25581 x := v_0
25582 if v_1.Op != OpSub16 {
25583 break
25584 }
25585 y := v_1.Args[1]
25586 v_1_0 := v_1.Args[0]
25587 if v_1_0.Op != OpConst16 {
25588 break
25589 }
25590 c := auxIntToInt16(v_1_0.AuxInt)
25591 if !(c&31 == 0) {
25592 break
25593 }
25594 v.reset(OpRotateLeft32)
25595 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
25596 v0.AddArg(y)
25597 v.AddArg2(x, v0)
25598 return true
25599 }
25600
25601
25602
25603 for {
25604 x := v_0
25605 if v_1.Op != OpSub8 {
25606 break
25607 }
25608 y := v_1.Args[1]
25609 v_1_0 := v_1.Args[0]
25610 if v_1_0.Op != OpConst8 {
25611 break
25612 }
25613 c := auxIntToInt8(v_1_0.AuxInt)
25614 if !(c&31 == 0) {
25615 break
25616 }
25617 v.reset(OpRotateLeft32)
25618 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
25619 v0.AddArg(y)
25620 v.AddArg2(x, v0)
25621 return true
25622 }
25623
25624
25625
25626 for {
25627 x := v_0
25628 if v_1.Op != OpConst64 {
25629 break
25630 }
25631 t := v_1.Type
25632 c := auxIntToInt64(v_1.AuxInt)
25633 if !(config.PtrSize == 4) {
25634 break
25635 }
25636 v.reset(OpRotateLeft32)
25637 v0 := b.NewValue0(v.Pos, OpConst32, t)
25638 v0.AuxInt = int32ToAuxInt(int32(c))
25639 v.AddArg2(x, v0)
25640 return true
25641 }
25642
25643
25644
25645 for {
25646 if v_0.Op != OpRotateLeft32 {
25647 break
25648 }
25649 c := v_0.Args[1]
25650 x := v_0.Args[0]
25651 d := v_1
25652 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
25653 break
25654 }
25655 v.reset(OpRotateLeft32)
25656 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
25657 v0.AddArg2(c, d)
25658 v.AddArg2(x, v0)
25659 return true
25660 }
25661
25662
25663
25664 for {
25665 if v_0.Op != OpRotateLeft32 {
25666 break
25667 }
25668 c := v_0.Args[1]
25669 x := v_0.Args[0]
25670 d := v_1
25671 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
25672 break
25673 }
25674 v.reset(OpRotateLeft32)
25675 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
25676 v0.AddArg2(c, d)
25677 v.AddArg2(x, v0)
25678 return true
25679 }
25680
25681
25682
25683 for {
25684 if v_0.Op != OpRotateLeft32 {
25685 break
25686 }
25687 c := v_0.Args[1]
25688 x := v_0.Args[0]
25689 d := v_1
25690 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
25691 break
25692 }
25693 v.reset(OpRotateLeft32)
25694 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
25695 v0.AddArg2(c, d)
25696 v.AddArg2(x, v0)
25697 return true
25698 }
25699
25700
25701
25702 for {
25703 if v_0.Op != OpRotateLeft32 {
25704 break
25705 }
25706 c := v_0.Args[1]
25707 x := v_0.Args[0]
25708 d := v_1
25709 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
25710 break
25711 }
25712 v.reset(OpRotateLeft32)
25713 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
25714 v0.AddArg2(c, d)
25715 v.AddArg2(x, v0)
25716 return true
25717 }
25718 return false
25719 }
25720 func rewriteValuegeneric_OpRotateLeft64(v *Value) bool {
25721 v_1 := v.Args[1]
25722 v_0 := v.Args[0]
25723 b := v.Block
25724 config := b.Func.Config
25725
25726
25727
25728 for {
25729 x := v_0
25730 if v_1.Op != OpConst64 {
25731 break
25732 }
25733 c := auxIntToInt64(v_1.AuxInt)
25734 if !(c%64 == 0) {
25735 break
25736 }
25737 v.copyOf(x)
25738 return true
25739 }
25740
25741
25742
25743 for {
25744 x := v_0
25745 if v_1.Op != OpAnd64 {
25746 break
25747 }
25748 _ = v_1.Args[1]
25749 v_1_0 := v_1.Args[0]
25750 v_1_1 := v_1.Args[1]
25751 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25752 y := v_1_0
25753 if v_1_1.Op != OpConst64 {
25754 continue
25755 }
25756 c := auxIntToInt64(v_1_1.AuxInt)
25757 if !(c&63 == 63) {
25758 continue
25759 }
25760 v.reset(OpRotateLeft64)
25761 v.AddArg2(x, y)
25762 return true
25763 }
25764 break
25765 }
25766
25767
25768
25769 for {
25770 x := v_0
25771 if v_1.Op != OpAnd32 {
25772 break
25773 }
25774 _ = v_1.Args[1]
25775 v_1_0 := v_1.Args[0]
25776 v_1_1 := v_1.Args[1]
25777 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25778 y := v_1_0
25779 if v_1_1.Op != OpConst32 {
25780 continue
25781 }
25782 c := auxIntToInt32(v_1_1.AuxInt)
25783 if !(c&63 == 63) {
25784 continue
25785 }
25786 v.reset(OpRotateLeft64)
25787 v.AddArg2(x, y)
25788 return true
25789 }
25790 break
25791 }
25792
25793
25794
25795 for {
25796 x := v_0
25797 if v_1.Op != OpAnd16 {
25798 break
25799 }
25800 _ = v_1.Args[1]
25801 v_1_0 := v_1.Args[0]
25802 v_1_1 := v_1.Args[1]
25803 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25804 y := v_1_0
25805 if v_1_1.Op != OpConst16 {
25806 continue
25807 }
25808 c := auxIntToInt16(v_1_1.AuxInt)
25809 if !(c&63 == 63) {
25810 continue
25811 }
25812 v.reset(OpRotateLeft64)
25813 v.AddArg2(x, y)
25814 return true
25815 }
25816 break
25817 }
25818
25819
25820
25821 for {
25822 x := v_0
25823 if v_1.Op != OpAnd8 {
25824 break
25825 }
25826 _ = v_1.Args[1]
25827 v_1_0 := v_1.Args[0]
25828 v_1_1 := v_1.Args[1]
25829 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25830 y := v_1_0
25831 if v_1_1.Op != OpConst8 {
25832 continue
25833 }
25834 c := auxIntToInt8(v_1_1.AuxInt)
25835 if !(c&63 == 63) {
25836 continue
25837 }
25838 v.reset(OpRotateLeft64)
25839 v.AddArg2(x, y)
25840 return true
25841 }
25842 break
25843 }
25844
25845
25846
25847 for {
25848 x := v_0
25849 if v_1.Op != OpNeg64 {
25850 break
25851 }
25852 v_1_0 := v_1.Args[0]
25853 if v_1_0.Op != OpAnd64 {
25854 break
25855 }
25856 _ = v_1_0.Args[1]
25857 v_1_0_0 := v_1_0.Args[0]
25858 v_1_0_1 := v_1_0.Args[1]
25859 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25860 y := v_1_0_0
25861 if v_1_0_1.Op != OpConst64 {
25862 continue
25863 }
25864 c := auxIntToInt64(v_1_0_1.AuxInt)
25865 if !(c&63 == 63) {
25866 continue
25867 }
25868 v.reset(OpRotateLeft64)
25869 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
25870 v0.AddArg(y)
25871 v.AddArg2(x, v0)
25872 return true
25873 }
25874 break
25875 }
25876
25877
25878
25879 for {
25880 x := v_0
25881 if v_1.Op != OpNeg32 {
25882 break
25883 }
25884 v_1_0 := v_1.Args[0]
25885 if v_1_0.Op != OpAnd32 {
25886 break
25887 }
25888 _ = v_1_0.Args[1]
25889 v_1_0_0 := v_1_0.Args[0]
25890 v_1_0_1 := v_1_0.Args[1]
25891 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25892 y := v_1_0_0
25893 if v_1_0_1.Op != OpConst32 {
25894 continue
25895 }
25896 c := auxIntToInt32(v_1_0_1.AuxInt)
25897 if !(c&63 == 63) {
25898 continue
25899 }
25900 v.reset(OpRotateLeft64)
25901 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
25902 v0.AddArg(y)
25903 v.AddArg2(x, v0)
25904 return true
25905 }
25906 break
25907 }
25908
25909
25910
25911 for {
25912 x := v_0
25913 if v_1.Op != OpNeg16 {
25914 break
25915 }
25916 v_1_0 := v_1.Args[0]
25917 if v_1_0.Op != OpAnd16 {
25918 break
25919 }
25920 _ = v_1_0.Args[1]
25921 v_1_0_0 := v_1_0.Args[0]
25922 v_1_0_1 := v_1_0.Args[1]
25923 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25924 y := v_1_0_0
25925 if v_1_0_1.Op != OpConst16 {
25926 continue
25927 }
25928 c := auxIntToInt16(v_1_0_1.AuxInt)
25929 if !(c&63 == 63) {
25930 continue
25931 }
25932 v.reset(OpRotateLeft64)
25933 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
25934 v0.AddArg(y)
25935 v.AddArg2(x, v0)
25936 return true
25937 }
25938 break
25939 }
25940
25941
25942
25943 for {
25944 x := v_0
25945 if v_1.Op != OpNeg8 {
25946 break
25947 }
25948 v_1_0 := v_1.Args[0]
25949 if v_1_0.Op != OpAnd8 {
25950 break
25951 }
25952 _ = v_1_0.Args[1]
25953 v_1_0_0 := v_1_0.Args[0]
25954 v_1_0_1 := v_1_0.Args[1]
25955 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25956 y := v_1_0_0
25957 if v_1_0_1.Op != OpConst8 {
25958 continue
25959 }
25960 c := auxIntToInt8(v_1_0_1.AuxInt)
25961 if !(c&63 == 63) {
25962 continue
25963 }
25964 v.reset(OpRotateLeft64)
25965 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
25966 v0.AddArg(y)
25967 v.AddArg2(x, v0)
25968 return true
25969 }
25970 break
25971 }
25972
25973
25974
25975 for {
25976 x := v_0
25977 if v_1.Op != OpAdd64 {
25978 break
25979 }
25980 _ = v_1.Args[1]
25981 v_1_0 := v_1.Args[0]
25982 v_1_1 := v_1.Args[1]
25983 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25984 y := v_1_0
25985 if v_1_1.Op != OpConst64 {
25986 continue
25987 }
25988 c := auxIntToInt64(v_1_1.AuxInt)
25989 if !(c&63 == 0) {
25990 continue
25991 }
25992 v.reset(OpRotateLeft64)
25993 v.AddArg2(x, y)
25994 return true
25995 }
25996 break
25997 }
25998
25999
26000
26001 for {
26002 x := v_0
26003 if v_1.Op != OpAdd32 {
26004 break
26005 }
26006 _ = v_1.Args[1]
26007 v_1_0 := v_1.Args[0]
26008 v_1_1 := v_1.Args[1]
26009 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26010 y := v_1_0
26011 if v_1_1.Op != OpConst32 {
26012 continue
26013 }
26014 c := auxIntToInt32(v_1_1.AuxInt)
26015 if !(c&63 == 0) {
26016 continue
26017 }
26018 v.reset(OpRotateLeft64)
26019 v.AddArg2(x, y)
26020 return true
26021 }
26022 break
26023 }
26024
26025
26026
26027 for {
26028 x := v_0
26029 if v_1.Op != OpAdd16 {
26030 break
26031 }
26032 _ = v_1.Args[1]
26033 v_1_0 := v_1.Args[0]
26034 v_1_1 := v_1.Args[1]
26035 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26036 y := v_1_0
26037 if v_1_1.Op != OpConst16 {
26038 continue
26039 }
26040 c := auxIntToInt16(v_1_1.AuxInt)
26041 if !(c&63 == 0) {
26042 continue
26043 }
26044 v.reset(OpRotateLeft64)
26045 v.AddArg2(x, y)
26046 return true
26047 }
26048 break
26049 }
26050
26051
26052
26053 for {
26054 x := v_0
26055 if v_1.Op != OpAdd8 {
26056 break
26057 }
26058 _ = v_1.Args[1]
26059 v_1_0 := v_1.Args[0]
26060 v_1_1 := v_1.Args[1]
26061 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26062 y := v_1_0
26063 if v_1_1.Op != OpConst8 {
26064 continue
26065 }
26066 c := auxIntToInt8(v_1_1.AuxInt)
26067 if !(c&63 == 0) {
26068 continue
26069 }
26070 v.reset(OpRotateLeft64)
26071 v.AddArg2(x, y)
26072 return true
26073 }
26074 break
26075 }
26076
26077
26078
26079 for {
26080 x := v_0
26081 if v_1.Op != OpSub64 {
26082 break
26083 }
26084 y := v_1.Args[1]
26085 v_1_0 := v_1.Args[0]
26086 if v_1_0.Op != OpConst64 {
26087 break
26088 }
26089 c := auxIntToInt64(v_1_0.AuxInt)
26090 if !(c&63 == 0) {
26091 break
26092 }
26093 v.reset(OpRotateLeft64)
26094 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26095 v0.AddArg(y)
26096 v.AddArg2(x, v0)
26097 return true
26098 }
26099
26100
26101
26102 for {
26103 x := v_0
26104 if v_1.Op != OpSub32 {
26105 break
26106 }
26107 y := v_1.Args[1]
26108 v_1_0 := v_1.Args[0]
26109 if v_1_0.Op != OpConst32 {
26110 break
26111 }
26112 c := auxIntToInt32(v_1_0.AuxInt)
26113 if !(c&63 == 0) {
26114 break
26115 }
26116 v.reset(OpRotateLeft64)
26117 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26118 v0.AddArg(y)
26119 v.AddArg2(x, v0)
26120 return true
26121 }
26122
26123
26124
26125 for {
26126 x := v_0
26127 if v_1.Op != OpSub16 {
26128 break
26129 }
26130 y := v_1.Args[1]
26131 v_1_0 := v_1.Args[0]
26132 if v_1_0.Op != OpConst16 {
26133 break
26134 }
26135 c := auxIntToInt16(v_1_0.AuxInt)
26136 if !(c&63 == 0) {
26137 break
26138 }
26139 v.reset(OpRotateLeft64)
26140 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
26141 v0.AddArg(y)
26142 v.AddArg2(x, v0)
26143 return true
26144 }
26145
26146
26147
26148 for {
26149 x := v_0
26150 if v_1.Op != OpSub8 {
26151 break
26152 }
26153 y := v_1.Args[1]
26154 v_1_0 := v_1.Args[0]
26155 if v_1_0.Op != OpConst8 {
26156 break
26157 }
26158 c := auxIntToInt8(v_1_0.AuxInt)
26159 if !(c&63 == 0) {
26160 break
26161 }
26162 v.reset(OpRotateLeft64)
26163 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
26164 v0.AddArg(y)
26165 v.AddArg2(x, v0)
26166 return true
26167 }
26168
26169
26170
26171 for {
26172 x := v_0
26173 if v_1.Op != OpConst64 {
26174 break
26175 }
26176 t := v_1.Type
26177 c := auxIntToInt64(v_1.AuxInt)
26178 if !(config.PtrSize == 4) {
26179 break
26180 }
26181 v.reset(OpRotateLeft64)
26182 v0 := b.NewValue0(v.Pos, OpConst32, t)
26183 v0.AuxInt = int32ToAuxInt(int32(c))
26184 v.AddArg2(x, v0)
26185 return true
26186 }
26187
26188
26189
26190 for {
26191 if v_0.Op != OpRotateLeft64 {
26192 break
26193 }
26194 c := v_0.Args[1]
26195 x := v_0.Args[0]
26196 d := v_1
26197 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
26198 break
26199 }
26200 v.reset(OpRotateLeft64)
26201 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
26202 v0.AddArg2(c, d)
26203 v.AddArg2(x, v0)
26204 return true
26205 }
26206
26207
26208
26209 for {
26210 if v_0.Op != OpRotateLeft64 {
26211 break
26212 }
26213 c := v_0.Args[1]
26214 x := v_0.Args[0]
26215 d := v_1
26216 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
26217 break
26218 }
26219 v.reset(OpRotateLeft64)
26220 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
26221 v0.AddArg2(c, d)
26222 v.AddArg2(x, v0)
26223 return true
26224 }
26225
26226
26227
26228 for {
26229 if v_0.Op != OpRotateLeft64 {
26230 break
26231 }
26232 c := v_0.Args[1]
26233 x := v_0.Args[0]
26234 d := v_1
26235 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
26236 break
26237 }
26238 v.reset(OpRotateLeft64)
26239 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
26240 v0.AddArg2(c, d)
26241 v.AddArg2(x, v0)
26242 return true
26243 }
26244
26245
26246
26247 for {
26248 if v_0.Op != OpRotateLeft64 {
26249 break
26250 }
26251 c := v_0.Args[1]
26252 x := v_0.Args[0]
26253 d := v_1
26254 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
26255 break
26256 }
26257 v.reset(OpRotateLeft64)
26258 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
26259 v0.AddArg2(c, d)
26260 v.AddArg2(x, v0)
26261 return true
26262 }
26263 return false
26264 }
26265 func rewriteValuegeneric_OpRotateLeft8(v *Value) bool {
26266 v_1 := v.Args[1]
26267 v_0 := v.Args[0]
26268 b := v.Block
26269 config := b.Func.Config
26270
26271
26272
26273 for {
26274 x := v_0
26275 if v_1.Op != OpConst8 {
26276 break
26277 }
26278 c := auxIntToInt8(v_1.AuxInt)
26279 if !(c%8 == 0) {
26280 break
26281 }
26282 v.copyOf(x)
26283 return true
26284 }
26285
26286
26287
26288 for {
26289 x := v_0
26290 if v_1.Op != OpAnd64 {
26291 break
26292 }
26293 _ = v_1.Args[1]
26294 v_1_0 := v_1.Args[0]
26295 v_1_1 := v_1.Args[1]
26296 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26297 y := v_1_0
26298 if v_1_1.Op != OpConst64 {
26299 continue
26300 }
26301 c := auxIntToInt64(v_1_1.AuxInt)
26302 if !(c&7 == 7) {
26303 continue
26304 }
26305 v.reset(OpRotateLeft8)
26306 v.AddArg2(x, y)
26307 return true
26308 }
26309 break
26310 }
26311
26312
26313
26314 for {
26315 x := v_0
26316 if v_1.Op != OpAnd32 {
26317 break
26318 }
26319 _ = v_1.Args[1]
26320 v_1_0 := v_1.Args[0]
26321 v_1_1 := v_1.Args[1]
26322 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26323 y := v_1_0
26324 if v_1_1.Op != OpConst32 {
26325 continue
26326 }
26327 c := auxIntToInt32(v_1_1.AuxInt)
26328 if !(c&7 == 7) {
26329 continue
26330 }
26331 v.reset(OpRotateLeft8)
26332 v.AddArg2(x, y)
26333 return true
26334 }
26335 break
26336 }
26337
26338
26339
26340 for {
26341 x := v_0
26342 if v_1.Op != OpAnd16 {
26343 break
26344 }
26345 _ = v_1.Args[1]
26346 v_1_0 := v_1.Args[0]
26347 v_1_1 := v_1.Args[1]
26348 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26349 y := v_1_0
26350 if v_1_1.Op != OpConst16 {
26351 continue
26352 }
26353 c := auxIntToInt16(v_1_1.AuxInt)
26354 if !(c&7 == 7) {
26355 continue
26356 }
26357 v.reset(OpRotateLeft8)
26358 v.AddArg2(x, y)
26359 return true
26360 }
26361 break
26362 }
26363
26364
26365
26366 for {
26367 x := v_0
26368 if v_1.Op != OpAnd8 {
26369 break
26370 }
26371 _ = v_1.Args[1]
26372 v_1_0 := v_1.Args[0]
26373 v_1_1 := v_1.Args[1]
26374 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26375 y := v_1_0
26376 if v_1_1.Op != OpConst8 {
26377 continue
26378 }
26379 c := auxIntToInt8(v_1_1.AuxInt)
26380 if !(c&7 == 7) {
26381 continue
26382 }
26383 v.reset(OpRotateLeft8)
26384 v.AddArg2(x, y)
26385 return true
26386 }
26387 break
26388 }
26389
26390
26391
26392 for {
26393 x := v_0
26394 if v_1.Op != OpNeg64 {
26395 break
26396 }
26397 v_1_0 := v_1.Args[0]
26398 if v_1_0.Op != OpAnd64 {
26399 break
26400 }
26401 _ = v_1_0.Args[1]
26402 v_1_0_0 := v_1_0.Args[0]
26403 v_1_0_1 := v_1_0.Args[1]
26404 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26405 y := v_1_0_0
26406 if v_1_0_1.Op != OpConst64 {
26407 continue
26408 }
26409 c := auxIntToInt64(v_1_0_1.AuxInt)
26410 if !(c&7 == 7) {
26411 continue
26412 }
26413 v.reset(OpRotateLeft8)
26414 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26415 v0.AddArg(y)
26416 v.AddArg2(x, v0)
26417 return true
26418 }
26419 break
26420 }
26421
26422
26423
26424 for {
26425 x := v_0
26426 if v_1.Op != OpNeg32 {
26427 break
26428 }
26429 v_1_0 := v_1.Args[0]
26430 if v_1_0.Op != OpAnd32 {
26431 break
26432 }
26433 _ = v_1_0.Args[1]
26434 v_1_0_0 := v_1_0.Args[0]
26435 v_1_0_1 := v_1_0.Args[1]
26436 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26437 y := v_1_0_0
26438 if v_1_0_1.Op != OpConst32 {
26439 continue
26440 }
26441 c := auxIntToInt32(v_1_0_1.AuxInt)
26442 if !(c&7 == 7) {
26443 continue
26444 }
26445 v.reset(OpRotateLeft8)
26446 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26447 v0.AddArg(y)
26448 v.AddArg2(x, v0)
26449 return true
26450 }
26451 break
26452 }
26453
26454
26455
26456 for {
26457 x := v_0
26458 if v_1.Op != OpNeg16 {
26459 break
26460 }
26461 v_1_0 := v_1.Args[0]
26462 if v_1_0.Op != OpAnd16 {
26463 break
26464 }
26465 _ = v_1_0.Args[1]
26466 v_1_0_0 := v_1_0.Args[0]
26467 v_1_0_1 := v_1_0.Args[1]
26468 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26469 y := v_1_0_0
26470 if v_1_0_1.Op != OpConst16 {
26471 continue
26472 }
26473 c := auxIntToInt16(v_1_0_1.AuxInt)
26474 if !(c&7 == 7) {
26475 continue
26476 }
26477 v.reset(OpRotateLeft8)
26478 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
26479 v0.AddArg(y)
26480 v.AddArg2(x, v0)
26481 return true
26482 }
26483 break
26484 }
26485
26486
26487
26488 for {
26489 x := v_0
26490 if v_1.Op != OpNeg8 {
26491 break
26492 }
26493 v_1_0 := v_1.Args[0]
26494 if v_1_0.Op != OpAnd8 {
26495 break
26496 }
26497 _ = v_1_0.Args[1]
26498 v_1_0_0 := v_1_0.Args[0]
26499 v_1_0_1 := v_1_0.Args[1]
26500 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26501 y := v_1_0_0
26502 if v_1_0_1.Op != OpConst8 {
26503 continue
26504 }
26505 c := auxIntToInt8(v_1_0_1.AuxInt)
26506 if !(c&7 == 7) {
26507 continue
26508 }
26509 v.reset(OpRotateLeft8)
26510 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
26511 v0.AddArg(y)
26512 v.AddArg2(x, v0)
26513 return true
26514 }
26515 break
26516 }
26517
26518
26519
26520 for {
26521 x := v_0
26522 if v_1.Op != OpAdd64 {
26523 break
26524 }
26525 _ = v_1.Args[1]
26526 v_1_0 := v_1.Args[0]
26527 v_1_1 := v_1.Args[1]
26528 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26529 y := v_1_0
26530 if v_1_1.Op != OpConst64 {
26531 continue
26532 }
26533 c := auxIntToInt64(v_1_1.AuxInt)
26534 if !(c&7 == 0) {
26535 continue
26536 }
26537 v.reset(OpRotateLeft8)
26538 v.AddArg2(x, y)
26539 return true
26540 }
26541 break
26542 }
26543
26544
26545
26546 for {
26547 x := v_0
26548 if v_1.Op != OpAdd32 {
26549 break
26550 }
26551 _ = v_1.Args[1]
26552 v_1_0 := v_1.Args[0]
26553 v_1_1 := v_1.Args[1]
26554 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26555 y := v_1_0
26556 if v_1_1.Op != OpConst32 {
26557 continue
26558 }
26559 c := auxIntToInt32(v_1_1.AuxInt)
26560 if !(c&7 == 0) {
26561 continue
26562 }
26563 v.reset(OpRotateLeft8)
26564 v.AddArg2(x, y)
26565 return true
26566 }
26567 break
26568 }
26569
26570
26571
26572 for {
26573 x := v_0
26574 if v_1.Op != OpAdd16 {
26575 break
26576 }
26577 _ = v_1.Args[1]
26578 v_1_0 := v_1.Args[0]
26579 v_1_1 := v_1.Args[1]
26580 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26581 y := v_1_0
26582 if v_1_1.Op != OpConst16 {
26583 continue
26584 }
26585 c := auxIntToInt16(v_1_1.AuxInt)
26586 if !(c&7 == 0) {
26587 continue
26588 }
26589 v.reset(OpRotateLeft8)
26590 v.AddArg2(x, y)
26591 return true
26592 }
26593 break
26594 }
26595
26596
26597
26598 for {
26599 x := v_0
26600 if v_1.Op != OpAdd8 {
26601 break
26602 }
26603 _ = v_1.Args[1]
26604 v_1_0 := v_1.Args[0]
26605 v_1_1 := v_1.Args[1]
26606 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26607 y := v_1_0
26608 if v_1_1.Op != OpConst8 {
26609 continue
26610 }
26611 c := auxIntToInt8(v_1_1.AuxInt)
26612 if !(c&7 == 0) {
26613 continue
26614 }
26615 v.reset(OpRotateLeft8)
26616 v.AddArg2(x, y)
26617 return true
26618 }
26619 break
26620 }
26621
26622
26623
26624 for {
26625 x := v_0
26626 if v_1.Op != OpSub64 {
26627 break
26628 }
26629 y := v_1.Args[1]
26630 v_1_0 := v_1.Args[0]
26631 if v_1_0.Op != OpConst64 {
26632 break
26633 }
26634 c := auxIntToInt64(v_1_0.AuxInt)
26635 if !(c&7 == 0) {
26636 break
26637 }
26638 v.reset(OpRotateLeft8)
26639 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26640 v0.AddArg(y)
26641 v.AddArg2(x, v0)
26642 return true
26643 }
26644
26645
26646
26647 for {
26648 x := v_0
26649 if v_1.Op != OpSub32 {
26650 break
26651 }
26652 y := v_1.Args[1]
26653 v_1_0 := v_1.Args[0]
26654 if v_1_0.Op != OpConst32 {
26655 break
26656 }
26657 c := auxIntToInt32(v_1_0.AuxInt)
26658 if !(c&7 == 0) {
26659 break
26660 }
26661 v.reset(OpRotateLeft8)
26662 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26663 v0.AddArg(y)
26664 v.AddArg2(x, v0)
26665 return true
26666 }
26667
26668
26669
26670 for {
26671 x := v_0
26672 if v_1.Op != OpSub16 {
26673 break
26674 }
26675 y := v_1.Args[1]
26676 v_1_0 := v_1.Args[0]
26677 if v_1_0.Op != OpConst16 {
26678 break
26679 }
26680 c := auxIntToInt16(v_1_0.AuxInt)
26681 if !(c&7 == 0) {
26682 break
26683 }
26684 v.reset(OpRotateLeft8)
26685 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
26686 v0.AddArg(y)
26687 v.AddArg2(x, v0)
26688 return true
26689 }
26690
26691
26692
26693 for {
26694 x := v_0
26695 if v_1.Op != OpSub8 {
26696 break
26697 }
26698 y := v_1.Args[1]
26699 v_1_0 := v_1.Args[0]
26700 if v_1_0.Op != OpConst8 {
26701 break
26702 }
26703 c := auxIntToInt8(v_1_0.AuxInt)
26704 if !(c&7 == 0) {
26705 break
26706 }
26707 v.reset(OpRotateLeft8)
26708 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
26709 v0.AddArg(y)
26710 v.AddArg2(x, v0)
26711 return true
26712 }
26713
26714
26715
26716 for {
26717 x := v_0
26718 if v_1.Op != OpConst64 {
26719 break
26720 }
26721 t := v_1.Type
26722 c := auxIntToInt64(v_1.AuxInt)
26723 if !(config.PtrSize == 4) {
26724 break
26725 }
26726 v.reset(OpRotateLeft8)
26727 v0 := b.NewValue0(v.Pos, OpConst32, t)
26728 v0.AuxInt = int32ToAuxInt(int32(c))
26729 v.AddArg2(x, v0)
26730 return true
26731 }
26732
26733
26734
26735 for {
26736 if v_0.Op != OpRotateLeft8 {
26737 break
26738 }
26739 c := v_0.Args[1]
26740 x := v_0.Args[0]
26741 d := v_1
26742 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
26743 break
26744 }
26745 v.reset(OpRotateLeft8)
26746 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
26747 v0.AddArg2(c, d)
26748 v.AddArg2(x, v0)
26749 return true
26750 }
26751
26752
26753
26754 for {
26755 if v_0.Op != OpRotateLeft8 {
26756 break
26757 }
26758 c := v_0.Args[1]
26759 x := v_0.Args[0]
26760 d := v_1
26761 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
26762 break
26763 }
26764 v.reset(OpRotateLeft8)
26765 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
26766 v0.AddArg2(c, d)
26767 v.AddArg2(x, v0)
26768 return true
26769 }
26770
26771
26772
26773 for {
26774 if v_0.Op != OpRotateLeft8 {
26775 break
26776 }
26777 c := v_0.Args[1]
26778 x := v_0.Args[0]
26779 d := v_1
26780 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
26781 break
26782 }
26783 v.reset(OpRotateLeft8)
26784 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
26785 v0.AddArg2(c, d)
26786 v.AddArg2(x, v0)
26787 return true
26788 }
26789
26790
26791
26792 for {
26793 if v_0.Op != OpRotateLeft8 {
26794 break
26795 }
26796 c := v_0.Args[1]
26797 x := v_0.Args[0]
26798 d := v_1
26799 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
26800 break
26801 }
26802 v.reset(OpRotateLeft8)
26803 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
26804 v0.AddArg2(c, d)
26805 v.AddArg2(x, v0)
26806 return true
26807 }
26808 return false
26809 }
26810 func rewriteValuegeneric_OpRound32F(v *Value) bool {
26811 v_0 := v.Args[0]
26812
26813
26814 for {
26815 x := v_0
26816 if x.Op != OpConst32F {
26817 break
26818 }
26819 v.copyOf(x)
26820 return true
26821 }
26822 return false
26823 }
26824 func rewriteValuegeneric_OpRound64F(v *Value) bool {
26825 v_0 := v.Args[0]
26826
26827
26828 for {
26829 x := v_0
26830 if x.Op != OpConst64F {
26831 break
26832 }
26833 v.copyOf(x)
26834 return true
26835 }
26836 return false
26837 }
26838 func rewriteValuegeneric_OpRoundToEven(v *Value) bool {
26839 v_0 := v.Args[0]
26840
26841
26842 for {
26843 if v_0.Op != OpConst64F {
26844 break
26845 }
26846 c := auxIntToFloat64(v_0.AuxInt)
26847 v.reset(OpConst64F)
26848 v.AuxInt = float64ToAuxInt(math.RoundToEven(c))
26849 return true
26850 }
26851 return false
26852 }
26853 func rewriteValuegeneric_OpRsh16Ux16(v *Value) bool {
26854 v_1 := v.Args[1]
26855 v_0 := v.Args[0]
26856 b := v.Block
26857
26858
26859 for {
26860 t := v.Type
26861 x := v_0
26862 if v_1.Op != OpConst16 {
26863 break
26864 }
26865 c := auxIntToInt16(v_1.AuxInt)
26866 v.reset(OpRsh16Ux64)
26867 v0 := b.NewValue0(v.Pos, OpConst64, t)
26868 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
26869 v.AddArg2(x, v0)
26870 return true
26871 }
26872
26873
26874 for {
26875 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
26876 break
26877 }
26878 v.reset(OpConst16)
26879 v.AuxInt = int16ToAuxInt(0)
26880 return true
26881 }
26882 return false
26883 }
26884 func rewriteValuegeneric_OpRsh16Ux32(v *Value) bool {
26885 v_1 := v.Args[1]
26886 v_0 := v.Args[0]
26887 b := v.Block
26888
26889
26890 for {
26891 t := v.Type
26892 x := v_0
26893 if v_1.Op != OpConst32 {
26894 break
26895 }
26896 c := auxIntToInt32(v_1.AuxInt)
26897 v.reset(OpRsh16Ux64)
26898 v0 := b.NewValue0(v.Pos, OpConst64, t)
26899 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
26900 v.AddArg2(x, v0)
26901 return true
26902 }
26903
26904
26905 for {
26906 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
26907 break
26908 }
26909 v.reset(OpConst16)
26910 v.AuxInt = int16ToAuxInt(0)
26911 return true
26912 }
26913 return false
26914 }
26915 func rewriteValuegeneric_OpRsh16Ux64(v *Value) bool {
26916 v_1 := v.Args[1]
26917 v_0 := v.Args[0]
26918 b := v.Block
26919 typ := &b.Func.Config.Types
26920
26921
26922 for {
26923 if v_0.Op != OpConst16 {
26924 break
26925 }
26926 c := auxIntToInt16(v_0.AuxInt)
26927 if v_1.Op != OpConst64 {
26928 break
26929 }
26930 d := auxIntToInt64(v_1.AuxInt)
26931 v.reset(OpConst16)
26932 v.AuxInt = int16ToAuxInt(int16(uint16(c) >> uint64(d)))
26933 return true
26934 }
26935
26936
26937 for {
26938 x := v_0
26939 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
26940 break
26941 }
26942 v.copyOf(x)
26943 return true
26944 }
26945
26946
26947 for {
26948 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
26949 break
26950 }
26951 v.reset(OpConst16)
26952 v.AuxInt = int16ToAuxInt(0)
26953 return true
26954 }
26955
26956
26957
26958 for {
26959 if v_1.Op != OpConst64 {
26960 break
26961 }
26962 c := auxIntToInt64(v_1.AuxInt)
26963 if !(uint64(c) >= 16) {
26964 break
26965 }
26966 v.reset(OpConst16)
26967 v.AuxInt = int16ToAuxInt(0)
26968 return true
26969 }
26970
26971
26972
26973 for {
26974 t := v.Type
26975 if v_0.Op != OpRsh16Ux64 {
26976 break
26977 }
26978 _ = v_0.Args[1]
26979 x := v_0.Args[0]
26980 v_0_1 := v_0.Args[1]
26981 if v_0_1.Op != OpConst64 {
26982 break
26983 }
26984 c := auxIntToInt64(v_0_1.AuxInt)
26985 if v_1.Op != OpConst64 {
26986 break
26987 }
26988 d := auxIntToInt64(v_1.AuxInt)
26989 if !(!uaddOvf(c, d)) {
26990 break
26991 }
26992 v.reset(OpRsh16Ux64)
26993 v0 := b.NewValue0(v.Pos, OpConst64, t)
26994 v0.AuxInt = int64ToAuxInt(c + d)
26995 v.AddArg2(x, v0)
26996 return true
26997 }
26998
26999
27000 for {
27001 if v_0.Op != OpRsh16x64 {
27002 break
27003 }
27004 x := v_0.Args[0]
27005 if v_1.Op != OpConst64 {
27006 break
27007 }
27008 t := v_1.Type
27009 if auxIntToInt64(v_1.AuxInt) != 15 {
27010 break
27011 }
27012 v.reset(OpRsh16Ux64)
27013 v0 := b.NewValue0(v.Pos, OpConst64, t)
27014 v0.AuxInt = int64ToAuxInt(15)
27015 v.AddArg2(x, v0)
27016 return true
27017 }
27018
27019
27020
27021 for {
27022 i := v_0
27023 if i.Op != OpLsh16x64 {
27024 break
27025 }
27026 _ = i.Args[1]
27027 x := i.Args[0]
27028 i_1 := i.Args[1]
27029 if i_1.Op != OpConst64 {
27030 break
27031 }
27032 c := auxIntToInt64(i_1.AuxInt)
27033 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
27034 break
27035 }
27036 v.reset(OpAnd16)
27037 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
27038 v0.AuxInt = int16ToAuxInt(int16(^uint16(0) >> c))
27039 v.AddArg2(x, v0)
27040 return true
27041 }
27042
27043
27044
27045 for {
27046 if v_0.Op != OpLsh16x64 {
27047 break
27048 }
27049 _ = v_0.Args[1]
27050 v_0_0 := v_0.Args[0]
27051 if v_0_0.Op != OpRsh16Ux64 {
27052 break
27053 }
27054 _ = v_0_0.Args[1]
27055 x := v_0_0.Args[0]
27056 v_0_0_1 := v_0_0.Args[1]
27057 if v_0_0_1.Op != OpConst64 {
27058 break
27059 }
27060 c1 := auxIntToInt64(v_0_0_1.AuxInt)
27061 v_0_1 := v_0.Args[1]
27062 if v_0_1.Op != OpConst64 {
27063 break
27064 }
27065 c2 := auxIntToInt64(v_0_1.AuxInt)
27066 if v_1.Op != OpConst64 {
27067 break
27068 }
27069 c3 := auxIntToInt64(v_1.AuxInt)
27070 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
27071 break
27072 }
27073 v.reset(OpRsh16Ux64)
27074 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
27075 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
27076 v.AddArg2(x, v0)
27077 return true
27078 }
27079
27080
27081 for {
27082 if v_0.Op != OpLsh16x64 {
27083 break
27084 }
27085 _ = v_0.Args[1]
27086 x := v_0.Args[0]
27087 v_0_1 := v_0.Args[1]
27088 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 8 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 8 {
27089 break
27090 }
27091 v.reset(OpZeroExt8to16)
27092 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.UInt8)
27093 v0.AddArg(x)
27094 v.AddArg(v0)
27095 return true
27096 }
27097 return false
27098 }
27099 func rewriteValuegeneric_OpRsh16Ux8(v *Value) bool {
27100 v_1 := v.Args[1]
27101 v_0 := v.Args[0]
27102 b := v.Block
27103
27104
27105 for {
27106 t := v.Type
27107 x := v_0
27108 if v_1.Op != OpConst8 {
27109 break
27110 }
27111 c := auxIntToInt8(v_1.AuxInt)
27112 v.reset(OpRsh16Ux64)
27113 v0 := b.NewValue0(v.Pos, OpConst64, t)
27114 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
27115 v.AddArg2(x, v0)
27116 return true
27117 }
27118
27119
27120 for {
27121 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27122 break
27123 }
27124 v.reset(OpConst16)
27125 v.AuxInt = int16ToAuxInt(0)
27126 return true
27127 }
27128 return false
27129 }
27130 func rewriteValuegeneric_OpRsh16x16(v *Value) bool {
27131 v_1 := v.Args[1]
27132 v_0 := v.Args[0]
27133 b := v.Block
27134
27135
27136 for {
27137 t := v.Type
27138 x := v_0
27139 if v_1.Op != OpConst16 {
27140 break
27141 }
27142 c := auxIntToInt16(v_1.AuxInt)
27143 v.reset(OpRsh16x64)
27144 v0 := b.NewValue0(v.Pos, OpConst64, t)
27145 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
27146 v.AddArg2(x, v0)
27147 return true
27148 }
27149
27150
27151 for {
27152 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27153 break
27154 }
27155 v.reset(OpConst16)
27156 v.AuxInt = int16ToAuxInt(0)
27157 return true
27158 }
27159 return false
27160 }
27161 func rewriteValuegeneric_OpRsh16x32(v *Value) bool {
27162 v_1 := v.Args[1]
27163 v_0 := v.Args[0]
27164 b := v.Block
27165
27166
27167 for {
27168 t := v.Type
27169 x := v_0
27170 if v_1.Op != OpConst32 {
27171 break
27172 }
27173 c := auxIntToInt32(v_1.AuxInt)
27174 v.reset(OpRsh16x64)
27175 v0 := b.NewValue0(v.Pos, OpConst64, t)
27176 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
27177 v.AddArg2(x, v0)
27178 return true
27179 }
27180
27181
27182 for {
27183 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27184 break
27185 }
27186 v.reset(OpConst16)
27187 v.AuxInt = int16ToAuxInt(0)
27188 return true
27189 }
27190 return false
27191 }
27192 func rewriteValuegeneric_OpRsh16x64(v *Value) bool {
27193 v_1 := v.Args[1]
27194 v_0 := v.Args[0]
27195 b := v.Block
27196 typ := &b.Func.Config.Types
27197
27198
27199 for {
27200 if v_0.Op != OpConst16 {
27201 break
27202 }
27203 c := auxIntToInt16(v_0.AuxInt)
27204 if v_1.Op != OpConst64 {
27205 break
27206 }
27207 d := auxIntToInt64(v_1.AuxInt)
27208 v.reset(OpConst16)
27209 v.AuxInt = int16ToAuxInt(c >> uint64(d))
27210 return true
27211 }
27212
27213
27214 for {
27215 x := v_0
27216 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
27217 break
27218 }
27219 v.copyOf(x)
27220 return true
27221 }
27222
27223
27224 for {
27225 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27226 break
27227 }
27228 v.reset(OpConst16)
27229 v.AuxInt = int16ToAuxInt(0)
27230 return true
27231 }
27232
27233
27234
27235 for {
27236 t := v.Type
27237 if v_0.Op != OpRsh16x64 {
27238 break
27239 }
27240 _ = v_0.Args[1]
27241 x := v_0.Args[0]
27242 v_0_1 := v_0.Args[1]
27243 if v_0_1.Op != OpConst64 {
27244 break
27245 }
27246 c := auxIntToInt64(v_0_1.AuxInt)
27247 if v_1.Op != OpConst64 {
27248 break
27249 }
27250 d := auxIntToInt64(v_1.AuxInt)
27251 if !(!uaddOvf(c, d)) {
27252 break
27253 }
27254 v.reset(OpRsh16x64)
27255 v0 := b.NewValue0(v.Pos, OpConst64, t)
27256 v0.AuxInt = int64ToAuxInt(c + d)
27257 v.AddArg2(x, v0)
27258 return true
27259 }
27260
27261
27262 for {
27263 if v_0.Op != OpLsh16x64 {
27264 break
27265 }
27266 _ = v_0.Args[1]
27267 x := v_0.Args[0]
27268 v_0_1 := v_0.Args[1]
27269 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 8 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 8 {
27270 break
27271 }
27272 v.reset(OpSignExt8to16)
27273 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.Int8)
27274 v0.AddArg(x)
27275 v.AddArg(v0)
27276 return true
27277 }
27278 return false
27279 }
27280 func rewriteValuegeneric_OpRsh16x8(v *Value) bool {
27281 v_1 := v.Args[1]
27282 v_0 := v.Args[0]
27283 b := v.Block
27284
27285
27286 for {
27287 t := v.Type
27288 x := v_0
27289 if v_1.Op != OpConst8 {
27290 break
27291 }
27292 c := auxIntToInt8(v_1.AuxInt)
27293 v.reset(OpRsh16x64)
27294 v0 := b.NewValue0(v.Pos, OpConst64, t)
27295 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
27296 v.AddArg2(x, v0)
27297 return true
27298 }
27299
27300
27301 for {
27302 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27303 break
27304 }
27305 v.reset(OpConst16)
27306 v.AuxInt = int16ToAuxInt(0)
27307 return true
27308 }
27309 return false
27310 }
27311 func rewriteValuegeneric_OpRsh32Ux16(v *Value) bool {
27312 v_1 := v.Args[1]
27313 v_0 := v.Args[0]
27314 b := v.Block
27315
27316
27317 for {
27318 t := v.Type
27319 x := v_0
27320 if v_1.Op != OpConst16 {
27321 break
27322 }
27323 c := auxIntToInt16(v_1.AuxInt)
27324 v.reset(OpRsh32Ux64)
27325 v0 := b.NewValue0(v.Pos, OpConst64, t)
27326 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
27327 v.AddArg2(x, v0)
27328 return true
27329 }
27330
27331
27332 for {
27333 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
27334 break
27335 }
27336 v.reset(OpConst32)
27337 v.AuxInt = int32ToAuxInt(0)
27338 return true
27339 }
27340 return false
27341 }
27342 func rewriteValuegeneric_OpRsh32Ux32(v *Value) bool {
27343 v_1 := v.Args[1]
27344 v_0 := v.Args[0]
27345 b := v.Block
27346
27347
27348 for {
27349 t := v.Type
27350 x := v_0
27351 if v_1.Op != OpConst32 {
27352 break
27353 }
27354 c := auxIntToInt32(v_1.AuxInt)
27355 v.reset(OpRsh32Ux64)
27356 v0 := b.NewValue0(v.Pos, OpConst64, t)
27357 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
27358 v.AddArg2(x, v0)
27359 return true
27360 }
27361
27362
27363 for {
27364 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
27365 break
27366 }
27367 v.reset(OpConst32)
27368 v.AuxInt = int32ToAuxInt(0)
27369 return true
27370 }
27371 return false
27372 }
27373 func rewriteValuegeneric_OpRsh32Ux64(v *Value) bool {
27374 v_1 := v.Args[1]
27375 v_0 := v.Args[0]
27376 b := v.Block
27377 typ := &b.Func.Config.Types
27378
27379
27380 for {
27381 if v_0.Op != OpConst32 {
27382 break
27383 }
27384 c := auxIntToInt32(v_0.AuxInt)
27385 if v_1.Op != OpConst64 {
27386 break
27387 }
27388 d := auxIntToInt64(v_1.AuxInt)
27389 v.reset(OpConst32)
27390 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
27391 return true
27392 }
27393
27394
27395 for {
27396 x := v_0
27397 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
27398 break
27399 }
27400 v.copyOf(x)
27401 return true
27402 }
27403
27404
27405 for {
27406 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
27407 break
27408 }
27409 v.reset(OpConst32)
27410 v.AuxInt = int32ToAuxInt(0)
27411 return true
27412 }
27413
27414
27415
27416 for {
27417 if v_1.Op != OpConst64 {
27418 break
27419 }
27420 c := auxIntToInt64(v_1.AuxInt)
27421 if !(uint64(c) >= 32) {
27422 break
27423 }
27424 v.reset(OpConst32)
27425 v.AuxInt = int32ToAuxInt(0)
27426 return true
27427 }
27428
27429
27430
27431 for {
27432 t := v.Type
27433 if v_0.Op != OpRsh32Ux64 {
27434 break
27435 }
27436 _ = v_0.Args[1]
27437 x := v_0.Args[0]
27438 v_0_1 := v_0.Args[1]
27439 if v_0_1.Op != OpConst64 {
27440 break
27441 }
27442 c := auxIntToInt64(v_0_1.AuxInt)
27443 if v_1.Op != OpConst64 {
27444 break
27445 }
27446 d := auxIntToInt64(v_1.AuxInt)
27447 if !(!uaddOvf(c, d)) {
27448 break
27449 }
27450 v.reset(OpRsh32Ux64)
27451 v0 := b.NewValue0(v.Pos, OpConst64, t)
27452 v0.AuxInt = int64ToAuxInt(c + d)
27453 v.AddArg2(x, v0)
27454 return true
27455 }
27456
27457
27458 for {
27459 if v_0.Op != OpRsh32x64 {
27460 break
27461 }
27462 x := v_0.Args[0]
27463 if v_1.Op != OpConst64 {
27464 break
27465 }
27466 t := v_1.Type
27467 if auxIntToInt64(v_1.AuxInt) != 31 {
27468 break
27469 }
27470 v.reset(OpRsh32Ux64)
27471 v0 := b.NewValue0(v.Pos, OpConst64, t)
27472 v0.AuxInt = int64ToAuxInt(31)
27473 v.AddArg2(x, v0)
27474 return true
27475 }
27476
27477
27478
27479 for {
27480 i := v_0
27481 if i.Op != OpLsh32x64 {
27482 break
27483 }
27484 _ = i.Args[1]
27485 x := i.Args[0]
27486 i_1 := i.Args[1]
27487 if i_1.Op != OpConst64 {
27488 break
27489 }
27490 c := auxIntToInt64(i_1.AuxInt)
27491 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
27492 break
27493 }
27494 v.reset(OpAnd32)
27495 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
27496 v0.AuxInt = int32ToAuxInt(int32(^uint32(0) >> c))
27497 v.AddArg2(x, v0)
27498 return true
27499 }
27500
27501
27502
27503 for {
27504 if v_0.Op != OpLsh32x64 {
27505 break
27506 }
27507 _ = v_0.Args[1]
27508 v_0_0 := v_0.Args[0]
27509 if v_0_0.Op != OpRsh32Ux64 {
27510 break
27511 }
27512 _ = v_0_0.Args[1]
27513 x := v_0_0.Args[0]
27514 v_0_0_1 := v_0_0.Args[1]
27515 if v_0_0_1.Op != OpConst64 {
27516 break
27517 }
27518 c1 := auxIntToInt64(v_0_0_1.AuxInt)
27519 v_0_1 := v_0.Args[1]
27520 if v_0_1.Op != OpConst64 {
27521 break
27522 }
27523 c2 := auxIntToInt64(v_0_1.AuxInt)
27524 if v_1.Op != OpConst64 {
27525 break
27526 }
27527 c3 := auxIntToInt64(v_1.AuxInt)
27528 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
27529 break
27530 }
27531 v.reset(OpRsh32Ux64)
27532 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
27533 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
27534 v.AddArg2(x, v0)
27535 return true
27536 }
27537
27538
27539 for {
27540 if v_0.Op != OpLsh32x64 {
27541 break
27542 }
27543 _ = v_0.Args[1]
27544 x := v_0.Args[0]
27545 v_0_1 := v_0.Args[1]
27546 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 24 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 24 {
27547 break
27548 }
27549 v.reset(OpZeroExt8to32)
27550 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.UInt8)
27551 v0.AddArg(x)
27552 v.AddArg(v0)
27553 return true
27554 }
27555
27556
27557 for {
27558 if v_0.Op != OpLsh32x64 {
27559 break
27560 }
27561 _ = v_0.Args[1]
27562 x := v_0.Args[0]
27563 v_0_1 := v_0.Args[1]
27564 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 16 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 16 {
27565 break
27566 }
27567 v.reset(OpZeroExt16to32)
27568 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.UInt16)
27569 v0.AddArg(x)
27570 v.AddArg(v0)
27571 return true
27572 }
27573 return false
27574 }
27575 func rewriteValuegeneric_OpRsh32Ux8(v *Value) bool {
27576 v_1 := v.Args[1]
27577 v_0 := v.Args[0]
27578 b := v.Block
27579
27580
27581 for {
27582 t := v.Type
27583 x := v_0
27584 if v_1.Op != OpConst8 {
27585 break
27586 }
27587 c := auxIntToInt8(v_1.AuxInt)
27588 v.reset(OpRsh32Ux64)
27589 v0 := b.NewValue0(v.Pos, OpConst64, t)
27590 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
27591 v.AddArg2(x, v0)
27592 return true
27593 }
27594
27595
27596 for {
27597 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
27598 break
27599 }
27600 v.reset(OpConst32)
27601 v.AuxInt = int32ToAuxInt(0)
27602 return true
27603 }
27604 return false
27605 }
27606 func rewriteValuegeneric_OpRsh32x16(v *Value) bool {
27607 v_1 := v.Args[1]
27608 v_0 := v.Args[0]
27609 b := v.Block
27610
27611
27612 for {
27613 t := v.Type
27614 x := v_0
27615 if v_1.Op != OpConst16 {
27616 break
27617 }
27618 c := auxIntToInt16(v_1.AuxInt)
27619 v.reset(OpRsh32x64)
27620 v0 := b.NewValue0(v.Pos, OpConst64, t)
27621 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
27622 v.AddArg2(x, v0)
27623 return true
27624 }
27625
27626
27627 for {
27628 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
27629 break
27630 }
27631 v.reset(OpConst32)
27632 v.AuxInt = int32ToAuxInt(0)
27633 return true
27634 }
27635 return false
27636 }
27637 func rewriteValuegeneric_OpRsh32x32(v *Value) bool {
27638 v_1 := v.Args[1]
27639 v_0 := v.Args[0]
27640 b := v.Block
27641
27642
27643 for {
27644 t := v.Type
27645 x := v_0
27646 if v_1.Op != OpConst32 {
27647 break
27648 }
27649 c := auxIntToInt32(v_1.AuxInt)
27650 v.reset(OpRsh32x64)
27651 v0 := b.NewValue0(v.Pos, OpConst64, t)
27652 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
27653 v.AddArg2(x, v0)
27654 return true
27655 }
27656
27657
27658 for {
27659 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
27660 break
27661 }
27662 v.reset(OpConst32)
27663 v.AuxInt = int32ToAuxInt(0)
27664 return true
27665 }
27666 return false
27667 }
27668 func rewriteValuegeneric_OpRsh32x64(v *Value) bool {
27669 v_1 := v.Args[1]
27670 v_0 := v.Args[0]
27671 b := v.Block
27672 typ := &b.Func.Config.Types
27673
27674
27675 for {
27676 if v_0.Op != OpConst32 {
27677 break
27678 }
27679 c := auxIntToInt32(v_0.AuxInt)
27680 if v_1.Op != OpConst64 {
27681 break
27682 }
27683 d := auxIntToInt64(v_1.AuxInt)
27684 v.reset(OpConst32)
27685 v.AuxInt = int32ToAuxInt(c >> uint64(d))
27686 return true
27687 }
27688
27689
27690 for {
27691 x := v_0
27692 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
27693 break
27694 }
27695 v.copyOf(x)
27696 return true
27697 }
27698
27699
27700 for {
27701 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
27702 break
27703 }
27704 v.reset(OpConst32)
27705 v.AuxInt = int32ToAuxInt(0)
27706 return true
27707 }
27708
27709
27710
27711 for {
27712 t := v.Type
27713 if v_0.Op != OpRsh32x64 {
27714 break
27715 }
27716 _ = v_0.Args[1]
27717 x := v_0.Args[0]
27718 v_0_1 := v_0.Args[1]
27719 if v_0_1.Op != OpConst64 {
27720 break
27721 }
27722 c := auxIntToInt64(v_0_1.AuxInt)
27723 if v_1.Op != OpConst64 {
27724 break
27725 }
27726 d := auxIntToInt64(v_1.AuxInt)
27727 if !(!uaddOvf(c, d)) {
27728 break
27729 }
27730 v.reset(OpRsh32x64)
27731 v0 := b.NewValue0(v.Pos, OpConst64, t)
27732 v0.AuxInt = int64ToAuxInt(c + d)
27733 v.AddArg2(x, v0)
27734 return true
27735 }
27736
27737
27738 for {
27739 if v_0.Op != OpLsh32x64 {
27740 break
27741 }
27742 _ = v_0.Args[1]
27743 x := v_0.Args[0]
27744 v_0_1 := v_0.Args[1]
27745 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 24 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 24 {
27746 break
27747 }
27748 v.reset(OpSignExt8to32)
27749 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.Int8)
27750 v0.AddArg(x)
27751 v.AddArg(v0)
27752 return true
27753 }
27754
27755
27756 for {
27757 if v_0.Op != OpLsh32x64 {
27758 break
27759 }
27760 _ = v_0.Args[1]
27761 x := v_0.Args[0]
27762 v_0_1 := v_0.Args[1]
27763 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 16 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 16 {
27764 break
27765 }
27766 v.reset(OpSignExt16to32)
27767 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.Int16)
27768 v0.AddArg(x)
27769 v.AddArg(v0)
27770 return true
27771 }
27772 return false
27773 }
27774 func rewriteValuegeneric_OpRsh32x8(v *Value) bool {
27775 v_1 := v.Args[1]
27776 v_0 := v.Args[0]
27777 b := v.Block
27778
27779
27780 for {
27781 t := v.Type
27782 x := v_0
27783 if v_1.Op != OpConst8 {
27784 break
27785 }
27786 c := auxIntToInt8(v_1.AuxInt)
27787 v.reset(OpRsh32x64)
27788 v0 := b.NewValue0(v.Pos, OpConst64, t)
27789 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
27790 v.AddArg2(x, v0)
27791 return true
27792 }
27793
27794
27795 for {
27796 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
27797 break
27798 }
27799 v.reset(OpConst32)
27800 v.AuxInt = int32ToAuxInt(0)
27801 return true
27802 }
27803 return false
27804 }
27805 func rewriteValuegeneric_OpRsh64Ux16(v *Value) bool {
27806 v_1 := v.Args[1]
27807 v_0 := v.Args[0]
27808 b := v.Block
27809
27810
27811 for {
27812 t := v.Type
27813 x := v_0
27814 if v_1.Op != OpConst16 {
27815 break
27816 }
27817 c := auxIntToInt16(v_1.AuxInt)
27818 v.reset(OpRsh64Ux64)
27819 v0 := b.NewValue0(v.Pos, OpConst64, t)
27820 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
27821 v.AddArg2(x, v0)
27822 return true
27823 }
27824
27825
27826 for {
27827 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
27828 break
27829 }
27830 v.reset(OpConst64)
27831 v.AuxInt = int64ToAuxInt(0)
27832 return true
27833 }
27834 return false
27835 }
27836 func rewriteValuegeneric_OpRsh64Ux32(v *Value) bool {
27837 v_1 := v.Args[1]
27838 v_0 := v.Args[0]
27839 b := v.Block
27840
27841
27842 for {
27843 t := v.Type
27844 x := v_0
27845 if v_1.Op != OpConst32 {
27846 break
27847 }
27848 c := auxIntToInt32(v_1.AuxInt)
27849 v.reset(OpRsh64Ux64)
27850 v0 := b.NewValue0(v.Pos, OpConst64, t)
27851 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
27852 v.AddArg2(x, v0)
27853 return true
27854 }
27855
27856
27857 for {
27858 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
27859 break
27860 }
27861 v.reset(OpConst64)
27862 v.AuxInt = int64ToAuxInt(0)
27863 return true
27864 }
27865 return false
27866 }
27867 func rewriteValuegeneric_OpRsh64Ux64(v *Value) bool {
27868 v_1 := v.Args[1]
27869 v_0 := v.Args[0]
27870 b := v.Block
27871 typ := &b.Func.Config.Types
27872
27873
27874 for {
27875 if v_0.Op != OpConst64 {
27876 break
27877 }
27878 c := auxIntToInt64(v_0.AuxInt)
27879 if v_1.Op != OpConst64 {
27880 break
27881 }
27882 d := auxIntToInt64(v_1.AuxInt)
27883 v.reset(OpConst64)
27884 v.AuxInt = int64ToAuxInt(int64(uint64(c) >> uint64(d)))
27885 return true
27886 }
27887
27888
27889 for {
27890 x := v_0
27891 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
27892 break
27893 }
27894 v.copyOf(x)
27895 return true
27896 }
27897
27898
27899 for {
27900 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
27901 break
27902 }
27903 v.reset(OpConst64)
27904 v.AuxInt = int64ToAuxInt(0)
27905 return true
27906 }
27907
27908
27909
27910 for {
27911 if v_1.Op != OpConst64 {
27912 break
27913 }
27914 c := auxIntToInt64(v_1.AuxInt)
27915 if !(uint64(c) >= 64) {
27916 break
27917 }
27918 v.reset(OpConst64)
27919 v.AuxInt = int64ToAuxInt(0)
27920 return true
27921 }
27922
27923
27924
27925 for {
27926 t := v.Type
27927 if v_0.Op != OpRsh64Ux64 {
27928 break
27929 }
27930 _ = v_0.Args[1]
27931 x := v_0.Args[0]
27932 v_0_1 := v_0.Args[1]
27933 if v_0_1.Op != OpConst64 {
27934 break
27935 }
27936 c := auxIntToInt64(v_0_1.AuxInt)
27937 if v_1.Op != OpConst64 {
27938 break
27939 }
27940 d := auxIntToInt64(v_1.AuxInt)
27941 if !(!uaddOvf(c, d)) {
27942 break
27943 }
27944 v.reset(OpRsh64Ux64)
27945 v0 := b.NewValue0(v.Pos, OpConst64, t)
27946 v0.AuxInt = int64ToAuxInt(c + d)
27947 v.AddArg2(x, v0)
27948 return true
27949 }
27950
27951
27952 for {
27953 if v_0.Op != OpRsh64x64 {
27954 break
27955 }
27956 x := v_0.Args[0]
27957 if v_1.Op != OpConst64 {
27958 break
27959 }
27960 t := v_1.Type
27961 if auxIntToInt64(v_1.AuxInt) != 63 {
27962 break
27963 }
27964 v.reset(OpRsh64Ux64)
27965 v0 := b.NewValue0(v.Pos, OpConst64, t)
27966 v0.AuxInt = int64ToAuxInt(63)
27967 v.AddArg2(x, v0)
27968 return true
27969 }
27970
27971
27972
27973 for {
27974 i := v_0
27975 if i.Op != OpLsh64x64 {
27976 break
27977 }
27978 _ = i.Args[1]
27979 x := i.Args[0]
27980 i_1 := i.Args[1]
27981 if i_1.Op != OpConst64 {
27982 break
27983 }
27984 c := auxIntToInt64(i_1.AuxInt)
27985 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
27986 break
27987 }
27988 v.reset(OpAnd64)
27989 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
27990 v0.AuxInt = int64ToAuxInt(int64(^uint64(0) >> c))
27991 v.AddArg2(x, v0)
27992 return true
27993 }
27994
27995
27996
27997 for {
27998 if v_0.Op != OpLsh64x64 {
27999 break
28000 }
28001 _ = v_0.Args[1]
28002 v_0_0 := v_0.Args[0]
28003 if v_0_0.Op != OpRsh64Ux64 {
28004 break
28005 }
28006 _ = v_0_0.Args[1]
28007 x := v_0_0.Args[0]
28008 v_0_0_1 := v_0_0.Args[1]
28009 if v_0_0_1.Op != OpConst64 {
28010 break
28011 }
28012 c1 := auxIntToInt64(v_0_0_1.AuxInt)
28013 v_0_1 := v_0.Args[1]
28014 if v_0_1.Op != OpConst64 {
28015 break
28016 }
28017 c2 := auxIntToInt64(v_0_1.AuxInt)
28018 if v_1.Op != OpConst64 {
28019 break
28020 }
28021 c3 := auxIntToInt64(v_1.AuxInt)
28022 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
28023 break
28024 }
28025 v.reset(OpRsh64Ux64)
28026 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
28027 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
28028 v.AddArg2(x, v0)
28029 return true
28030 }
28031
28032
28033 for {
28034 if v_0.Op != OpLsh64x64 {
28035 break
28036 }
28037 _ = v_0.Args[1]
28038 x := v_0.Args[0]
28039 v_0_1 := v_0.Args[1]
28040 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 56 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 56 {
28041 break
28042 }
28043 v.reset(OpZeroExt8to64)
28044 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.UInt8)
28045 v0.AddArg(x)
28046 v.AddArg(v0)
28047 return true
28048 }
28049
28050
28051 for {
28052 if v_0.Op != OpLsh64x64 {
28053 break
28054 }
28055 _ = v_0.Args[1]
28056 x := v_0.Args[0]
28057 v_0_1 := v_0.Args[1]
28058 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 48 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 48 {
28059 break
28060 }
28061 v.reset(OpZeroExt16to64)
28062 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.UInt16)
28063 v0.AddArg(x)
28064 v.AddArg(v0)
28065 return true
28066 }
28067
28068
28069 for {
28070 if v_0.Op != OpLsh64x64 {
28071 break
28072 }
28073 _ = v_0.Args[1]
28074 x := v_0.Args[0]
28075 v_0_1 := v_0.Args[1]
28076 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 32 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 32 {
28077 break
28078 }
28079 v.reset(OpZeroExt32to64)
28080 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.UInt32)
28081 v0.AddArg(x)
28082 v.AddArg(v0)
28083 return true
28084 }
28085 return false
28086 }
28087 func rewriteValuegeneric_OpRsh64Ux8(v *Value) bool {
28088 v_1 := v.Args[1]
28089 v_0 := v.Args[0]
28090 b := v.Block
28091
28092
28093 for {
28094 t := v.Type
28095 x := v_0
28096 if v_1.Op != OpConst8 {
28097 break
28098 }
28099 c := auxIntToInt8(v_1.AuxInt)
28100 v.reset(OpRsh64Ux64)
28101 v0 := b.NewValue0(v.Pos, OpConst64, t)
28102 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
28103 v.AddArg2(x, v0)
28104 return true
28105 }
28106
28107
28108 for {
28109 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
28110 break
28111 }
28112 v.reset(OpConst64)
28113 v.AuxInt = int64ToAuxInt(0)
28114 return true
28115 }
28116 return false
28117 }
28118 func rewriteValuegeneric_OpRsh64x16(v *Value) bool {
28119 v_1 := v.Args[1]
28120 v_0 := v.Args[0]
28121 b := v.Block
28122
28123
28124 for {
28125 t := v.Type
28126 x := v_0
28127 if v_1.Op != OpConst16 {
28128 break
28129 }
28130 c := auxIntToInt16(v_1.AuxInt)
28131 v.reset(OpRsh64x64)
28132 v0 := b.NewValue0(v.Pos, OpConst64, t)
28133 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28134 v.AddArg2(x, v0)
28135 return true
28136 }
28137
28138
28139 for {
28140 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
28141 break
28142 }
28143 v.reset(OpConst64)
28144 v.AuxInt = int64ToAuxInt(0)
28145 return true
28146 }
28147 return false
28148 }
28149 func rewriteValuegeneric_OpRsh64x32(v *Value) bool {
28150 v_1 := v.Args[1]
28151 v_0 := v.Args[0]
28152 b := v.Block
28153
28154
28155 for {
28156 t := v.Type
28157 x := v_0
28158 if v_1.Op != OpConst32 {
28159 break
28160 }
28161 c := auxIntToInt32(v_1.AuxInt)
28162 v.reset(OpRsh64x64)
28163 v0 := b.NewValue0(v.Pos, OpConst64, t)
28164 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
28165 v.AddArg2(x, v0)
28166 return true
28167 }
28168
28169
28170 for {
28171 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
28172 break
28173 }
28174 v.reset(OpConst64)
28175 v.AuxInt = int64ToAuxInt(0)
28176 return true
28177 }
28178 return false
28179 }
28180 func rewriteValuegeneric_OpRsh64x64(v *Value) bool {
28181 v_1 := v.Args[1]
28182 v_0 := v.Args[0]
28183 b := v.Block
28184 typ := &b.Func.Config.Types
28185
28186
28187 for {
28188 if v_0.Op != OpConst64 {
28189 break
28190 }
28191 c := auxIntToInt64(v_0.AuxInt)
28192 if v_1.Op != OpConst64 {
28193 break
28194 }
28195 d := auxIntToInt64(v_1.AuxInt)
28196 v.reset(OpConst64)
28197 v.AuxInt = int64ToAuxInt(c >> uint64(d))
28198 return true
28199 }
28200
28201
28202 for {
28203 x := v_0
28204 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
28205 break
28206 }
28207 v.copyOf(x)
28208 return true
28209 }
28210
28211
28212 for {
28213 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
28214 break
28215 }
28216 v.reset(OpConst64)
28217 v.AuxInt = int64ToAuxInt(0)
28218 return true
28219 }
28220
28221
28222
28223 for {
28224 t := v.Type
28225 if v_0.Op != OpRsh64x64 {
28226 break
28227 }
28228 _ = v_0.Args[1]
28229 x := v_0.Args[0]
28230 v_0_1 := v_0.Args[1]
28231 if v_0_1.Op != OpConst64 {
28232 break
28233 }
28234 c := auxIntToInt64(v_0_1.AuxInt)
28235 if v_1.Op != OpConst64 {
28236 break
28237 }
28238 d := auxIntToInt64(v_1.AuxInt)
28239 if !(!uaddOvf(c, d)) {
28240 break
28241 }
28242 v.reset(OpRsh64x64)
28243 v0 := b.NewValue0(v.Pos, OpConst64, t)
28244 v0.AuxInt = int64ToAuxInt(c + d)
28245 v.AddArg2(x, v0)
28246 return true
28247 }
28248
28249
28250 for {
28251 if v_0.Op != OpLsh64x64 {
28252 break
28253 }
28254 _ = v_0.Args[1]
28255 x := v_0.Args[0]
28256 v_0_1 := v_0.Args[1]
28257 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 56 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 56 {
28258 break
28259 }
28260 v.reset(OpSignExt8to64)
28261 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.Int8)
28262 v0.AddArg(x)
28263 v.AddArg(v0)
28264 return true
28265 }
28266
28267
28268 for {
28269 if v_0.Op != OpLsh64x64 {
28270 break
28271 }
28272 _ = v_0.Args[1]
28273 x := v_0.Args[0]
28274 v_0_1 := v_0.Args[1]
28275 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 48 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 48 {
28276 break
28277 }
28278 v.reset(OpSignExt16to64)
28279 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.Int16)
28280 v0.AddArg(x)
28281 v.AddArg(v0)
28282 return true
28283 }
28284
28285
28286 for {
28287 if v_0.Op != OpLsh64x64 {
28288 break
28289 }
28290 _ = v_0.Args[1]
28291 x := v_0.Args[0]
28292 v_0_1 := v_0.Args[1]
28293 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 32 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 32 {
28294 break
28295 }
28296 v.reset(OpSignExt32to64)
28297 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.Int32)
28298 v0.AddArg(x)
28299 v.AddArg(v0)
28300 return true
28301 }
28302 return false
28303 }
28304 func rewriteValuegeneric_OpRsh64x8(v *Value) bool {
28305 v_1 := v.Args[1]
28306 v_0 := v.Args[0]
28307 b := v.Block
28308
28309
28310 for {
28311 t := v.Type
28312 x := v_0
28313 if v_1.Op != OpConst8 {
28314 break
28315 }
28316 c := auxIntToInt8(v_1.AuxInt)
28317 v.reset(OpRsh64x64)
28318 v0 := b.NewValue0(v.Pos, OpConst64, t)
28319 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
28320 v.AddArg2(x, v0)
28321 return true
28322 }
28323
28324
28325 for {
28326 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
28327 break
28328 }
28329 v.reset(OpConst64)
28330 v.AuxInt = int64ToAuxInt(0)
28331 return true
28332 }
28333 return false
28334 }
28335 func rewriteValuegeneric_OpRsh8Ux16(v *Value) bool {
28336 v_1 := v.Args[1]
28337 v_0 := v.Args[0]
28338 b := v.Block
28339
28340
28341 for {
28342 t := v.Type
28343 x := v_0
28344 if v_1.Op != OpConst16 {
28345 break
28346 }
28347 c := auxIntToInt16(v_1.AuxInt)
28348 v.reset(OpRsh8Ux64)
28349 v0 := b.NewValue0(v.Pos, OpConst64, t)
28350 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28351 v.AddArg2(x, v0)
28352 return true
28353 }
28354
28355
28356 for {
28357 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
28358 break
28359 }
28360 v.reset(OpConst8)
28361 v.AuxInt = int8ToAuxInt(0)
28362 return true
28363 }
28364 return false
28365 }
28366 func rewriteValuegeneric_OpRsh8Ux32(v *Value) bool {
28367 v_1 := v.Args[1]
28368 v_0 := v.Args[0]
28369 b := v.Block
28370
28371
28372 for {
28373 t := v.Type
28374 x := v_0
28375 if v_1.Op != OpConst32 {
28376 break
28377 }
28378 c := auxIntToInt32(v_1.AuxInt)
28379 v.reset(OpRsh8Ux64)
28380 v0 := b.NewValue0(v.Pos, OpConst64, t)
28381 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
28382 v.AddArg2(x, v0)
28383 return true
28384 }
28385
28386
28387 for {
28388 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
28389 break
28390 }
28391 v.reset(OpConst8)
28392 v.AuxInt = int8ToAuxInt(0)
28393 return true
28394 }
28395 return false
28396 }
28397 func rewriteValuegeneric_OpRsh8Ux64(v *Value) bool {
28398 v_1 := v.Args[1]
28399 v_0 := v.Args[0]
28400 b := v.Block
28401 typ := &b.Func.Config.Types
28402
28403
28404 for {
28405 if v_0.Op != OpConst8 {
28406 break
28407 }
28408 c := auxIntToInt8(v_0.AuxInt)
28409 if v_1.Op != OpConst64 {
28410 break
28411 }
28412 d := auxIntToInt64(v_1.AuxInt)
28413 v.reset(OpConst8)
28414 v.AuxInt = int8ToAuxInt(int8(uint8(c) >> uint64(d)))
28415 return true
28416 }
28417
28418
28419 for {
28420 x := v_0
28421 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
28422 break
28423 }
28424 v.copyOf(x)
28425 return true
28426 }
28427
28428
28429 for {
28430 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
28431 break
28432 }
28433 v.reset(OpConst8)
28434 v.AuxInt = int8ToAuxInt(0)
28435 return true
28436 }
28437
28438
28439
28440 for {
28441 if v_1.Op != OpConst64 {
28442 break
28443 }
28444 c := auxIntToInt64(v_1.AuxInt)
28445 if !(uint64(c) >= 8) {
28446 break
28447 }
28448 v.reset(OpConst8)
28449 v.AuxInt = int8ToAuxInt(0)
28450 return true
28451 }
28452
28453
28454
28455 for {
28456 t := v.Type
28457 if v_0.Op != OpRsh8Ux64 {
28458 break
28459 }
28460 _ = v_0.Args[1]
28461 x := v_0.Args[0]
28462 v_0_1 := v_0.Args[1]
28463 if v_0_1.Op != OpConst64 {
28464 break
28465 }
28466 c := auxIntToInt64(v_0_1.AuxInt)
28467 if v_1.Op != OpConst64 {
28468 break
28469 }
28470 d := auxIntToInt64(v_1.AuxInt)
28471 if !(!uaddOvf(c, d)) {
28472 break
28473 }
28474 v.reset(OpRsh8Ux64)
28475 v0 := b.NewValue0(v.Pos, OpConst64, t)
28476 v0.AuxInt = int64ToAuxInt(c + d)
28477 v.AddArg2(x, v0)
28478 return true
28479 }
28480
28481
28482 for {
28483 if v_0.Op != OpRsh8x64 {
28484 break
28485 }
28486 x := v_0.Args[0]
28487 if v_1.Op != OpConst64 {
28488 break
28489 }
28490 t := v_1.Type
28491 if auxIntToInt64(v_1.AuxInt) != 7 {
28492 break
28493 }
28494 v.reset(OpRsh8Ux64)
28495 v0 := b.NewValue0(v.Pos, OpConst64, t)
28496 v0.AuxInt = int64ToAuxInt(7)
28497 v.AddArg2(x, v0)
28498 return true
28499 }
28500
28501
28502
28503 for {
28504 i := v_0
28505 if i.Op != OpLsh8x64 {
28506 break
28507 }
28508 _ = i.Args[1]
28509 x := i.Args[0]
28510 i_1 := i.Args[1]
28511 if i_1.Op != OpConst64 {
28512 break
28513 }
28514 c := auxIntToInt64(i_1.AuxInt)
28515 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
28516 break
28517 }
28518 v.reset(OpAnd8)
28519 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
28520 v0.AuxInt = int8ToAuxInt(int8(^uint8(0) >> c))
28521 v.AddArg2(x, v0)
28522 return true
28523 }
28524
28525
28526
28527 for {
28528 if v_0.Op != OpLsh8x64 {
28529 break
28530 }
28531 _ = v_0.Args[1]
28532 v_0_0 := v_0.Args[0]
28533 if v_0_0.Op != OpRsh8Ux64 {
28534 break
28535 }
28536 _ = v_0_0.Args[1]
28537 x := v_0_0.Args[0]
28538 v_0_0_1 := v_0_0.Args[1]
28539 if v_0_0_1.Op != OpConst64 {
28540 break
28541 }
28542 c1 := auxIntToInt64(v_0_0_1.AuxInt)
28543 v_0_1 := v_0.Args[1]
28544 if v_0_1.Op != OpConst64 {
28545 break
28546 }
28547 c2 := auxIntToInt64(v_0_1.AuxInt)
28548 if v_1.Op != OpConst64 {
28549 break
28550 }
28551 c3 := auxIntToInt64(v_1.AuxInt)
28552 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
28553 break
28554 }
28555 v.reset(OpRsh8Ux64)
28556 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
28557 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
28558 v.AddArg2(x, v0)
28559 return true
28560 }
28561 return false
28562 }
28563 func rewriteValuegeneric_OpRsh8Ux8(v *Value) bool {
28564 v_1 := v.Args[1]
28565 v_0 := v.Args[0]
28566 b := v.Block
28567
28568
28569 for {
28570 t := v.Type
28571 x := v_0
28572 if v_1.Op != OpConst8 {
28573 break
28574 }
28575 c := auxIntToInt8(v_1.AuxInt)
28576 v.reset(OpRsh8Ux64)
28577 v0 := b.NewValue0(v.Pos, OpConst64, t)
28578 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
28579 v.AddArg2(x, v0)
28580 return true
28581 }
28582
28583
28584 for {
28585 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
28586 break
28587 }
28588 v.reset(OpConst8)
28589 v.AuxInt = int8ToAuxInt(0)
28590 return true
28591 }
28592 return false
28593 }
28594 func rewriteValuegeneric_OpRsh8x16(v *Value) bool {
28595 v_1 := v.Args[1]
28596 v_0 := v.Args[0]
28597 b := v.Block
28598
28599
28600 for {
28601 t := v.Type
28602 x := v_0
28603 if v_1.Op != OpConst16 {
28604 break
28605 }
28606 c := auxIntToInt16(v_1.AuxInt)
28607 v.reset(OpRsh8x64)
28608 v0 := b.NewValue0(v.Pos, OpConst64, t)
28609 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28610 v.AddArg2(x, v0)
28611 return true
28612 }
28613
28614
28615 for {
28616 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
28617 break
28618 }
28619 v.reset(OpConst8)
28620 v.AuxInt = int8ToAuxInt(0)
28621 return true
28622 }
28623 return false
28624 }
28625 func rewriteValuegeneric_OpRsh8x32(v *Value) bool {
28626 v_1 := v.Args[1]
28627 v_0 := v.Args[0]
28628 b := v.Block
28629
28630
28631 for {
28632 t := v.Type
28633 x := v_0
28634 if v_1.Op != OpConst32 {
28635 break
28636 }
28637 c := auxIntToInt32(v_1.AuxInt)
28638 v.reset(OpRsh8x64)
28639 v0 := b.NewValue0(v.Pos, OpConst64, t)
28640 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
28641 v.AddArg2(x, v0)
28642 return true
28643 }
28644
28645
28646 for {
28647 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
28648 break
28649 }
28650 v.reset(OpConst8)
28651 v.AuxInt = int8ToAuxInt(0)
28652 return true
28653 }
28654 return false
28655 }
28656 func rewriteValuegeneric_OpRsh8x64(v *Value) bool {
28657 v_1 := v.Args[1]
28658 v_0 := v.Args[0]
28659 b := v.Block
28660
28661
28662 for {
28663 if v_0.Op != OpConst8 {
28664 break
28665 }
28666 c := auxIntToInt8(v_0.AuxInt)
28667 if v_1.Op != OpConst64 {
28668 break
28669 }
28670 d := auxIntToInt64(v_1.AuxInt)
28671 v.reset(OpConst8)
28672 v.AuxInt = int8ToAuxInt(c >> uint64(d))
28673 return true
28674 }
28675
28676
28677 for {
28678 x := v_0
28679 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
28680 break
28681 }
28682 v.copyOf(x)
28683 return true
28684 }
28685
28686
28687 for {
28688 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
28689 break
28690 }
28691 v.reset(OpConst8)
28692 v.AuxInt = int8ToAuxInt(0)
28693 return true
28694 }
28695
28696
28697
28698 for {
28699 t := v.Type
28700 if v_0.Op != OpRsh8x64 {
28701 break
28702 }
28703 _ = v_0.Args[1]
28704 x := v_0.Args[0]
28705 v_0_1 := v_0.Args[1]
28706 if v_0_1.Op != OpConst64 {
28707 break
28708 }
28709 c := auxIntToInt64(v_0_1.AuxInt)
28710 if v_1.Op != OpConst64 {
28711 break
28712 }
28713 d := auxIntToInt64(v_1.AuxInt)
28714 if !(!uaddOvf(c, d)) {
28715 break
28716 }
28717 v.reset(OpRsh8x64)
28718 v0 := b.NewValue0(v.Pos, OpConst64, t)
28719 v0.AuxInt = int64ToAuxInt(c + d)
28720 v.AddArg2(x, v0)
28721 return true
28722 }
28723 return false
28724 }
28725 func rewriteValuegeneric_OpRsh8x8(v *Value) bool {
28726 v_1 := v.Args[1]
28727 v_0 := v.Args[0]
28728 b := v.Block
28729
28730
28731 for {
28732 t := v.Type
28733 x := v_0
28734 if v_1.Op != OpConst8 {
28735 break
28736 }
28737 c := auxIntToInt8(v_1.AuxInt)
28738 v.reset(OpRsh8x64)
28739 v0 := b.NewValue0(v.Pos, OpConst64, t)
28740 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
28741 v.AddArg2(x, v0)
28742 return true
28743 }
28744
28745
28746 for {
28747 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
28748 break
28749 }
28750 v.reset(OpConst8)
28751 v.AuxInt = int8ToAuxInt(0)
28752 return true
28753 }
28754 return false
28755 }
28756 func rewriteValuegeneric_OpSelect0(v *Value) bool {
28757 v_0 := v.Args[0]
28758
28759
28760 for {
28761 if v_0.Op != OpDiv128u {
28762 break
28763 }
28764 y := v_0.Args[2]
28765 v_0_0 := v_0.Args[0]
28766 if v_0_0.Op != OpConst64 || auxIntToInt64(v_0_0.AuxInt) != 0 {
28767 break
28768 }
28769 lo := v_0.Args[1]
28770 v.reset(OpDiv64u)
28771 v.AddArg2(lo, y)
28772 return true
28773 }
28774
28775
28776 for {
28777 if v_0.Op != OpMul32uover {
28778 break
28779 }
28780 _ = v_0.Args[1]
28781 v_0_0 := v_0.Args[0]
28782 v_0_1 := v_0.Args[1]
28783 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
28784 if v_0_0.Op != OpConst32 || auxIntToInt32(v_0_0.AuxInt) != 1 {
28785 continue
28786 }
28787 x := v_0_1
28788 v.copyOf(x)
28789 return true
28790 }
28791 break
28792 }
28793
28794
28795 for {
28796 if v_0.Op != OpMul64uover {
28797 break
28798 }
28799 _ = v_0.Args[1]
28800 v_0_0 := v_0.Args[0]
28801 v_0_1 := v_0.Args[1]
28802 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
28803 if v_0_0.Op != OpConst64 || auxIntToInt64(v_0_0.AuxInt) != 1 {
28804 continue
28805 }
28806 x := v_0_1
28807 v.copyOf(x)
28808 return true
28809 }
28810 break
28811 }
28812
28813
28814 for {
28815 if v_0.Op != OpMul64uover {
28816 break
28817 }
28818 _ = v_0.Args[1]
28819 v_0_0 := v_0.Args[0]
28820 v_0_1 := v_0.Args[1]
28821 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
28822 if v_0_0.Op != OpConst64 || auxIntToInt64(v_0_0.AuxInt) != 0 {
28823 continue
28824 }
28825 v.reset(OpConst64)
28826 v.AuxInt = int64ToAuxInt(0)
28827 return true
28828 }
28829 break
28830 }
28831
28832
28833 for {
28834 if v_0.Op != OpMul32uover {
28835 break
28836 }
28837 _ = v_0.Args[1]
28838 v_0_0 := v_0.Args[0]
28839 v_0_1 := v_0.Args[1]
28840 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
28841 if v_0_0.Op != OpConst32 || auxIntToInt32(v_0_0.AuxInt) != 0 {
28842 continue
28843 }
28844 v.reset(OpConst32)
28845 v.AuxInt = int32ToAuxInt(0)
28846 return true
28847 }
28848 break
28849 }
28850 return false
28851 }
28852 func rewriteValuegeneric_OpSelect1(v *Value) bool {
28853 v_0 := v.Args[0]
28854
28855
28856 for {
28857 if v_0.Op != OpDiv128u {
28858 break
28859 }
28860 y := v_0.Args[2]
28861 v_0_0 := v_0.Args[0]
28862 if v_0_0.Op != OpConst64 || auxIntToInt64(v_0_0.AuxInt) != 0 {
28863 break
28864 }
28865 lo := v_0.Args[1]
28866 v.reset(OpMod64u)
28867 v.AddArg2(lo, y)
28868 return true
28869 }
28870
28871
28872 for {
28873 if v_0.Op != OpMul32uover {
28874 break
28875 }
28876 _ = v_0.Args[1]
28877 v_0_0 := v_0.Args[0]
28878 v_0_1 := v_0.Args[1]
28879 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
28880 if v_0_0.Op != OpConst32 || auxIntToInt32(v_0_0.AuxInt) != 1 {
28881 continue
28882 }
28883 v.reset(OpConstBool)
28884 v.AuxInt = boolToAuxInt(false)
28885 return true
28886 }
28887 break
28888 }
28889
28890
28891 for {
28892 if v_0.Op != OpMul64uover {
28893 break
28894 }
28895 _ = v_0.Args[1]
28896 v_0_0 := v_0.Args[0]
28897 v_0_1 := v_0.Args[1]
28898 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
28899 if v_0_0.Op != OpConst64 || auxIntToInt64(v_0_0.AuxInt) != 1 {
28900 continue
28901 }
28902 v.reset(OpConstBool)
28903 v.AuxInt = boolToAuxInt(false)
28904 return true
28905 }
28906 break
28907 }
28908
28909
28910 for {
28911 if v_0.Op != OpMul64uover {
28912 break
28913 }
28914 _ = v_0.Args[1]
28915 v_0_0 := v_0.Args[0]
28916 v_0_1 := v_0.Args[1]
28917 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
28918 if v_0_0.Op != OpConst64 || auxIntToInt64(v_0_0.AuxInt) != 0 {
28919 continue
28920 }
28921 v.reset(OpConstBool)
28922 v.AuxInt = boolToAuxInt(false)
28923 return true
28924 }
28925 break
28926 }
28927
28928
28929 for {
28930 if v_0.Op != OpMul32uover {
28931 break
28932 }
28933 _ = v_0.Args[1]
28934 v_0_0 := v_0.Args[0]
28935 v_0_1 := v_0.Args[1]
28936 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
28937 if v_0_0.Op != OpConst32 || auxIntToInt32(v_0_0.AuxInt) != 0 {
28938 continue
28939 }
28940 v.reset(OpConstBool)
28941 v.AuxInt = boolToAuxInt(false)
28942 return true
28943 }
28944 break
28945 }
28946 return false
28947 }
28948 func rewriteValuegeneric_OpSelectN(v *Value) bool {
28949 v_0 := v.Args[0]
28950 b := v.Block
28951 config := b.Func.Config
28952 typ := &b.Func.Config.Types
28953
28954
28955 for {
28956 if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpMakeResult || len(v_0.Args) < 1 {
28957 break
28958 }
28959 x := v_0.Args[0]
28960 v.copyOf(x)
28961 return true
28962 }
28963
28964
28965 for {
28966 if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpMakeResult || len(v_0.Args) < 2 {
28967 break
28968 }
28969 y := v_0.Args[1]
28970 v.copyOf(y)
28971 return true
28972 }
28973
28974
28975 for {
28976 if auxIntToInt64(v.AuxInt) != 2 || v_0.Op != OpMakeResult || len(v_0.Args) < 3 {
28977 break
28978 }
28979 z := v_0.Args[2]
28980 v.copyOf(z)
28981 return true
28982 }
28983
28984
28985
28986 for {
28987 if auxIntToInt64(v.AuxInt) != 0 {
28988 break
28989 }
28990 call := v_0
28991 if call.Op != OpStaticCall || len(call.Args) != 3 {
28992 break
28993 }
28994 sym := auxToCall(call.Aux)
28995 mem := call.Args[2]
28996 sptr := call.Args[0]
28997 call_1 := call.Args[1]
28998 if call_1.Op != OpConst64 {
28999 break
29000 }
29001 c := auxIntToInt64(call_1.AuxInt)
29002 if !(isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)) {
29003 break
29004 }
29005 v.reset(OpZero)
29006 v.AuxInt = int64ToAuxInt(int64(c))
29007 v.Aux = typeToAux(types.Types[types.TUINT8])
29008 v.AddArg2(sptr, mem)
29009 return true
29010 }
29011
29012
29013
29014 for {
29015 if auxIntToInt64(v.AuxInt) != 0 {
29016 break
29017 }
29018 call := v_0
29019 if call.Op != OpStaticCall || len(call.Args) != 3 {
29020 break
29021 }
29022 sym := auxToCall(call.Aux)
29023 mem := call.Args[2]
29024 sptr := call.Args[0]
29025 call_1 := call.Args[1]
29026 if call_1.Op != OpConst32 {
29027 break
29028 }
29029 c := auxIntToInt32(call_1.AuxInt)
29030 if !(isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)) {
29031 break
29032 }
29033 v.reset(OpZero)
29034 v.AuxInt = int64ToAuxInt(int64(c))
29035 v.Aux = typeToAux(types.Types[types.TUINT8])
29036 v.AddArg2(sptr, mem)
29037 return true
29038 }
29039
29040
29041
29042 for {
29043 if auxIntToInt64(v.AuxInt) != 0 {
29044 break
29045 }
29046 call := v_0
29047 if call.Op != OpStaticCall || len(call.Args) != 1 {
29048 break
29049 }
29050 sym := auxToCall(call.Aux)
29051 s1 := call.Args[0]
29052 if s1.Op != OpStore {
29053 break
29054 }
29055 _ = s1.Args[2]
29056 s1_1 := s1.Args[1]
29057 if s1_1.Op != OpConst64 {
29058 break
29059 }
29060 sz := auxIntToInt64(s1_1.AuxInt)
29061 s2 := s1.Args[2]
29062 if s2.Op != OpStore {
29063 break
29064 }
29065 _ = s2.Args[2]
29066 src := s2.Args[1]
29067 s3 := s2.Args[2]
29068 if s3.Op != OpStore {
29069 break
29070 }
29071 mem := s3.Args[2]
29072 dst := s3.Args[1]
29073 if !(sz >= 0 && isSameCall(sym, "runtime.memmove") && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst, src, int64(sz), config) && clobber(s1, s2, s3, call)) {
29074 break
29075 }
29076 v.reset(OpMove)
29077 v.AuxInt = int64ToAuxInt(int64(sz))
29078 v.Aux = typeToAux(types.Types[types.TUINT8])
29079 v.AddArg3(dst, src, mem)
29080 return true
29081 }
29082
29083
29084
29085 for {
29086 if auxIntToInt64(v.AuxInt) != 0 {
29087 break
29088 }
29089 call := v_0
29090 if call.Op != OpStaticCall || len(call.Args) != 1 {
29091 break
29092 }
29093 sym := auxToCall(call.Aux)
29094 s1 := call.Args[0]
29095 if s1.Op != OpStore {
29096 break
29097 }
29098 _ = s1.Args[2]
29099 s1_1 := s1.Args[1]
29100 if s1_1.Op != OpConst32 {
29101 break
29102 }
29103 sz := auxIntToInt32(s1_1.AuxInt)
29104 s2 := s1.Args[2]
29105 if s2.Op != OpStore {
29106 break
29107 }
29108 _ = s2.Args[2]
29109 src := s2.Args[1]
29110 s3 := s2.Args[2]
29111 if s3.Op != OpStore {
29112 break
29113 }
29114 mem := s3.Args[2]
29115 dst := s3.Args[1]
29116 if !(sz >= 0 && isSameCall(sym, "runtime.memmove") && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst, src, int64(sz), config) && clobber(s1, s2, s3, call)) {
29117 break
29118 }
29119 v.reset(OpMove)
29120 v.AuxInt = int64ToAuxInt(int64(sz))
29121 v.Aux = typeToAux(types.Types[types.TUINT8])
29122 v.AddArg3(dst, src, mem)
29123 return true
29124 }
29125
29126
29127
29128 for {
29129 if auxIntToInt64(v.AuxInt) != 0 {
29130 break
29131 }
29132 call := v_0
29133 if call.Op != OpStaticCall || len(call.Args) != 4 {
29134 break
29135 }
29136 sym := auxToCall(call.Aux)
29137 mem := call.Args[3]
29138 dst := call.Args[0]
29139 src := call.Args[1]
29140 call_2 := call.Args[2]
29141 if call_2.Op != OpConst64 {
29142 break
29143 }
29144 sz := auxIntToInt64(call_2.AuxInt)
29145 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
29146 break
29147 }
29148 v.reset(OpMove)
29149 v.AuxInt = int64ToAuxInt(int64(sz))
29150 v.Aux = typeToAux(types.Types[types.TUINT8])
29151 v.AddArg3(dst, src, mem)
29152 return true
29153 }
29154
29155
29156
29157 for {
29158 if auxIntToInt64(v.AuxInt) != 0 {
29159 break
29160 }
29161 call := v_0
29162 if call.Op != OpStaticCall || len(call.Args) != 4 {
29163 break
29164 }
29165 sym := auxToCall(call.Aux)
29166 mem := call.Args[3]
29167 dst := call.Args[0]
29168 src := call.Args[1]
29169 call_2 := call.Args[2]
29170 if call_2.Op != OpConst32 {
29171 break
29172 }
29173 sz := auxIntToInt32(call_2.AuxInt)
29174 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
29175 break
29176 }
29177 v.reset(OpMove)
29178 v.AuxInt = int64ToAuxInt(int64(sz))
29179 v.Aux = typeToAux(types.Types[types.TUINT8])
29180 v.AddArg3(dst, src, mem)
29181 return true
29182 }
29183
29184
29185
29186 for {
29187 if auxIntToInt64(v.AuxInt) != 0 {
29188 break
29189 }
29190 call := v_0
29191 if call.Op != OpStaticLECall || len(call.Args) != 4 {
29192 break
29193 }
29194 sym := auxToCall(call.Aux)
29195 mem := call.Args[3]
29196 dst := call.Args[0]
29197 src := call.Args[1]
29198 call_2 := call.Args[2]
29199 if call_2.Op != OpConst64 {
29200 break
29201 }
29202 sz := auxIntToInt64(call_2.AuxInt)
29203 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
29204 break
29205 }
29206 v.reset(OpMove)
29207 v.AuxInt = int64ToAuxInt(int64(sz))
29208 v.Aux = typeToAux(types.Types[types.TUINT8])
29209 v.AddArg3(dst, src, mem)
29210 return true
29211 }
29212
29213
29214
29215 for {
29216 if auxIntToInt64(v.AuxInt) != 0 {
29217 break
29218 }
29219 call := v_0
29220 if call.Op != OpStaticLECall || len(call.Args) != 4 {
29221 break
29222 }
29223 sym := auxToCall(call.Aux)
29224 mem := call.Args[3]
29225 dst := call.Args[0]
29226 src := call.Args[1]
29227 call_2 := call.Args[2]
29228 if call_2.Op != OpConst32 {
29229 break
29230 }
29231 sz := auxIntToInt32(call_2.AuxInt)
29232 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
29233 break
29234 }
29235 v.reset(OpMove)
29236 v.AuxInt = int64ToAuxInt(int64(sz))
29237 v.Aux = typeToAux(types.Types[types.TUINT8])
29238 v.AddArg3(dst, src, mem)
29239 return true
29240 }
29241
29242
29243
29244 for {
29245 if auxIntToInt64(v.AuxInt) != 0 {
29246 break
29247 }
29248 call := v_0
29249 if call.Op != OpStaticLECall || len(call.Args) != 2 {
29250 break
29251 }
29252 sym := auxToCall(call.Aux)
29253 x := call.Args[1]
29254 if !(needRaceCleanup(sym, call) && clobber(call)) {
29255 break
29256 }
29257 v.copyOf(x)
29258 return true
29259 }
29260
29261
29262
29263 for {
29264 if auxIntToInt64(v.AuxInt) != 0 {
29265 break
29266 }
29267 call := v_0
29268 if call.Op != OpStaticLECall || len(call.Args) != 1 {
29269 break
29270 }
29271 sym := auxToCall(call.Aux)
29272 x := call.Args[0]
29273 if !(needRaceCleanup(sym, call) && clobber(call)) {
29274 break
29275 }
29276 v.copyOf(x)
29277 return true
29278 }
29279
29280
29281
29282 for {
29283 if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpStaticCall || len(v_0.Args) != 6 {
29284 break
29285 }
29286 sym := auxToCall(v_0.Aux)
29287 _ = v_0.Args[1]
29288 newLen := v_0.Args[1]
29289 if newLen.Op != OpConst64 || !(v.Type.IsInteger() && isSameCall(sym, "runtime.growslice")) {
29290 break
29291 }
29292 v.copyOf(newLen)
29293 return true
29294 }
29295
29296
29297
29298 for {
29299 if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpStaticCall || len(v_0.Args) != 6 {
29300 break
29301 }
29302 sym := auxToCall(v_0.Aux)
29303 _ = v_0.Args[1]
29304 newLen := v_0.Args[1]
29305 if newLen.Op != OpConst32 || !(v.Type.IsInteger() && isSameCall(sym, "runtime.growslice")) {
29306 break
29307 }
29308 v.copyOf(newLen)
29309 return true
29310 }
29311
29312
29313
29314 for {
29315 if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpStaticLECall || len(v_0.Args) != 3 {
29316 break
29317 }
29318 f := auxToCall(v_0.Aux)
29319 _ = v_0.Args[2]
29320 x := v_0.Args[0]
29321 y := v_0.Args[1]
29322 v_0_2 := v_0.Args[2]
29323 if v_0_2.Op != OpSelectN || auxIntToInt64(v_0_2.AuxInt) != 1 {
29324 break
29325 }
29326 c := v_0_2.Args[0]
29327 if c.Op != OpStaticLECall || len(c.Args) != 3 {
29328 break
29329 }
29330 g := auxToCall(c.Aux)
29331 if x != c.Args[0] || y != c.Args[1] || !(isSameCall(f, "runtime.cmpstring") && isSameCall(g, "runtime.cmpstring")) {
29332 break
29333 }
29334 b = c.Block
29335 v0 := b.NewValue0(v.Pos, OpSelectN, typ.Int)
29336 v.copyOf(v0)
29337 v0.AuxInt = int64ToAuxInt(0)
29338 v0.AddArg(c)
29339 return true
29340 }
29341
29342
29343
29344 for {
29345 if auxIntToInt64(v.AuxInt) != 1 {
29346 break
29347 }
29348 c := v_0
29349 if c.Op != OpStaticLECall || len(c.Args) != 3 {
29350 break
29351 }
29352 f := auxToCall(c.Aux)
29353 mem := c.Args[2]
29354 if !(c.Uses == 1 && isSameCall(f, "runtime.cmpstring") && clobber(c)) {
29355 break
29356 }
29357 v.copyOf(mem)
29358 return true
29359 }
29360 return false
29361 }
29362 func rewriteValuegeneric_OpSignExt16to32(v *Value) bool {
29363 v_0 := v.Args[0]
29364
29365
29366 for {
29367 if v_0.Op != OpConst16 {
29368 break
29369 }
29370 c := auxIntToInt16(v_0.AuxInt)
29371 v.reset(OpConst32)
29372 v.AuxInt = int32ToAuxInt(int32(c))
29373 return true
29374 }
29375
29376
29377
29378 for {
29379 if v_0.Op != OpTrunc32to16 {
29380 break
29381 }
29382 x := v_0.Args[0]
29383 if x.Op != OpRsh32x64 {
29384 break
29385 }
29386 _ = x.Args[1]
29387 x_1 := x.Args[1]
29388 if x_1.Op != OpConst64 {
29389 break
29390 }
29391 s := auxIntToInt64(x_1.AuxInt)
29392 if !(s >= 16) {
29393 break
29394 }
29395 v.copyOf(x)
29396 return true
29397 }
29398 return false
29399 }
29400 func rewriteValuegeneric_OpSignExt16to64(v *Value) bool {
29401 v_0 := v.Args[0]
29402
29403
29404 for {
29405 if v_0.Op != OpConst16 {
29406 break
29407 }
29408 c := auxIntToInt16(v_0.AuxInt)
29409 v.reset(OpConst64)
29410 v.AuxInt = int64ToAuxInt(int64(c))
29411 return true
29412 }
29413
29414
29415
29416 for {
29417 if v_0.Op != OpTrunc64to16 {
29418 break
29419 }
29420 x := v_0.Args[0]
29421 if x.Op != OpRsh64x64 {
29422 break
29423 }
29424 _ = x.Args[1]
29425 x_1 := x.Args[1]
29426 if x_1.Op != OpConst64 {
29427 break
29428 }
29429 s := auxIntToInt64(x_1.AuxInt)
29430 if !(s >= 48) {
29431 break
29432 }
29433 v.copyOf(x)
29434 return true
29435 }
29436 return false
29437 }
29438 func rewriteValuegeneric_OpSignExt32to64(v *Value) bool {
29439 v_0 := v.Args[0]
29440
29441
29442 for {
29443 if v_0.Op != OpConst32 {
29444 break
29445 }
29446 c := auxIntToInt32(v_0.AuxInt)
29447 v.reset(OpConst64)
29448 v.AuxInt = int64ToAuxInt(int64(c))
29449 return true
29450 }
29451
29452
29453
29454 for {
29455 if v_0.Op != OpTrunc64to32 {
29456 break
29457 }
29458 x := v_0.Args[0]
29459 if x.Op != OpRsh64x64 {
29460 break
29461 }
29462 _ = x.Args[1]
29463 x_1 := x.Args[1]
29464 if x_1.Op != OpConst64 {
29465 break
29466 }
29467 s := auxIntToInt64(x_1.AuxInt)
29468 if !(s >= 32) {
29469 break
29470 }
29471 v.copyOf(x)
29472 return true
29473 }
29474 return false
29475 }
29476 func rewriteValuegeneric_OpSignExt8to16(v *Value) bool {
29477 v_0 := v.Args[0]
29478
29479
29480 for {
29481 if v_0.Op != OpConst8 {
29482 break
29483 }
29484 c := auxIntToInt8(v_0.AuxInt)
29485 v.reset(OpConst16)
29486 v.AuxInt = int16ToAuxInt(int16(c))
29487 return true
29488 }
29489
29490
29491
29492 for {
29493 if v_0.Op != OpTrunc16to8 {
29494 break
29495 }
29496 x := v_0.Args[0]
29497 if x.Op != OpRsh16x64 {
29498 break
29499 }
29500 _ = x.Args[1]
29501 x_1 := x.Args[1]
29502 if x_1.Op != OpConst64 {
29503 break
29504 }
29505 s := auxIntToInt64(x_1.AuxInt)
29506 if !(s >= 8) {
29507 break
29508 }
29509 v.copyOf(x)
29510 return true
29511 }
29512 return false
29513 }
29514 func rewriteValuegeneric_OpSignExt8to32(v *Value) bool {
29515 v_0 := v.Args[0]
29516
29517
29518 for {
29519 if v_0.Op != OpConst8 {
29520 break
29521 }
29522 c := auxIntToInt8(v_0.AuxInt)
29523 v.reset(OpConst32)
29524 v.AuxInt = int32ToAuxInt(int32(c))
29525 return true
29526 }
29527
29528
29529
29530 for {
29531 if v_0.Op != OpTrunc32to8 {
29532 break
29533 }
29534 x := v_0.Args[0]
29535 if x.Op != OpRsh32x64 {
29536 break
29537 }
29538 _ = x.Args[1]
29539 x_1 := x.Args[1]
29540 if x_1.Op != OpConst64 {
29541 break
29542 }
29543 s := auxIntToInt64(x_1.AuxInt)
29544 if !(s >= 24) {
29545 break
29546 }
29547 v.copyOf(x)
29548 return true
29549 }
29550 return false
29551 }
29552 func rewriteValuegeneric_OpSignExt8to64(v *Value) bool {
29553 v_0 := v.Args[0]
29554
29555
29556 for {
29557 if v_0.Op != OpConst8 {
29558 break
29559 }
29560 c := auxIntToInt8(v_0.AuxInt)
29561 v.reset(OpConst64)
29562 v.AuxInt = int64ToAuxInt(int64(c))
29563 return true
29564 }
29565
29566
29567
29568 for {
29569 if v_0.Op != OpTrunc64to8 {
29570 break
29571 }
29572 x := v_0.Args[0]
29573 if x.Op != OpRsh64x64 {
29574 break
29575 }
29576 _ = x.Args[1]
29577 x_1 := x.Args[1]
29578 if x_1.Op != OpConst64 {
29579 break
29580 }
29581 s := auxIntToInt64(x_1.AuxInt)
29582 if !(s >= 56) {
29583 break
29584 }
29585 v.copyOf(x)
29586 return true
29587 }
29588 return false
29589 }
29590 func rewriteValuegeneric_OpSliceCap(v *Value) bool {
29591 v_0 := v.Args[0]
29592
29593
29594 for {
29595 if v_0.Op != OpSliceMake {
29596 break
29597 }
29598 _ = v_0.Args[2]
29599 v_0_2 := v_0.Args[2]
29600 if v_0_2.Op != OpConst64 {
29601 break
29602 }
29603 t := v_0_2.Type
29604 c := auxIntToInt64(v_0_2.AuxInt)
29605 v.reset(OpConst64)
29606 v.Type = t
29607 v.AuxInt = int64ToAuxInt(c)
29608 return true
29609 }
29610
29611
29612 for {
29613 if v_0.Op != OpSliceMake {
29614 break
29615 }
29616 _ = v_0.Args[2]
29617 v_0_2 := v_0.Args[2]
29618 if v_0_2.Op != OpConst32 {
29619 break
29620 }
29621 t := v_0_2.Type
29622 c := auxIntToInt32(v_0_2.AuxInt)
29623 v.reset(OpConst32)
29624 v.Type = t
29625 v.AuxInt = int32ToAuxInt(c)
29626 return true
29627 }
29628
29629
29630 for {
29631 if v_0.Op != OpSliceMake {
29632 break
29633 }
29634 _ = v_0.Args[2]
29635 v_0_2 := v_0.Args[2]
29636 if v_0_2.Op != OpSliceCap {
29637 break
29638 }
29639 x := v_0_2.Args[0]
29640 v.reset(OpSliceCap)
29641 v.AddArg(x)
29642 return true
29643 }
29644
29645
29646 for {
29647 if v_0.Op != OpSliceMake {
29648 break
29649 }
29650 _ = v_0.Args[2]
29651 v_0_2 := v_0.Args[2]
29652 if v_0_2.Op != OpSliceLen {
29653 break
29654 }
29655 x := v_0_2.Args[0]
29656 v.reset(OpSliceLen)
29657 v.AddArg(x)
29658 return true
29659 }
29660 return false
29661 }
29662 func rewriteValuegeneric_OpSliceLen(v *Value) bool {
29663 v_0 := v.Args[0]
29664
29665
29666 for {
29667 if v_0.Op != OpSliceMake {
29668 break
29669 }
29670 _ = v_0.Args[1]
29671 v_0_1 := v_0.Args[1]
29672 if v_0_1.Op != OpConst64 {
29673 break
29674 }
29675 t := v_0_1.Type
29676 c := auxIntToInt64(v_0_1.AuxInt)
29677 v.reset(OpConst64)
29678 v.Type = t
29679 v.AuxInt = int64ToAuxInt(c)
29680 return true
29681 }
29682
29683
29684 for {
29685 if v_0.Op != OpSliceMake {
29686 break
29687 }
29688 _ = v_0.Args[1]
29689 v_0_1 := v_0.Args[1]
29690 if v_0_1.Op != OpConst32 {
29691 break
29692 }
29693 t := v_0_1.Type
29694 c := auxIntToInt32(v_0_1.AuxInt)
29695 v.reset(OpConst32)
29696 v.Type = t
29697 v.AuxInt = int32ToAuxInt(c)
29698 return true
29699 }
29700
29701
29702 for {
29703 if v_0.Op != OpSliceMake {
29704 break
29705 }
29706 _ = v_0.Args[1]
29707 v_0_1 := v_0.Args[1]
29708 if v_0_1.Op != OpSliceLen {
29709 break
29710 }
29711 x := v_0_1.Args[0]
29712 v.reset(OpSliceLen)
29713 v.AddArg(x)
29714 return true
29715 }
29716
29717
29718
29719 for {
29720 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
29721 break
29722 }
29723 v_0_0 := v_0.Args[0]
29724 if v_0_0.Op != OpStaticLECall || len(v_0_0.Args) != 6 {
29725 break
29726 }
29727 sym := auxToCall(v_0_0.Aux)
29728 _ = v_0_0.Args[1]
29729 newLen := v_0_0.Args[1]
29730 if newLen.Op != OpConst64 || !(isSameCall(sym, "runtime.growslice")) {
29731 break
29732 }
29733 v.copyOf(newLen)
29734 return true
29735 }
29736
29737
29738
29739 for {
29740 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
29741 break
29742 }
29743 v_0_0 := v_0.Args[0]
29744 if v_0_0.Op != OpStaticLECall || len(v_0_0.Args) != 6 {
29745 break
29746 }
29747 sym := auxToCall(v_0_0.Aux)
29748 _ = v_0_0.Args[1]
29749 newLen := v_0_0.Args[1]
29750 if newLen.Op != OpConst32 || !(isSameCall(sym, "runtime.growslice")) {
29751 break
29752 }
29753 v.copyOf(newLen)
29754 return true
29755 }
29756 return false
29757 }
29758 func rewriteValuegeneric_OpSlicePtr(v *Value) bool {
29759 v_0 := v.Args[0]
29760
29761
29762 for {
29763 if v_0.Op != OpSliceMake {
29764 break
29765 }
29766 v_0_0 := v_0.Args[0]
29767 if v_0_0.Op != OpSlicePtr {
29768 break
29769 }
29770 x := v_0_0.Args[0]
29771 v.reset(OpSlicePtr)
29772 v.AddArg(x)
29773 return true
29774 }
29775 return false
29776 }
29777 func rewriteValuegeneric_OpSlicemask(v *Value) bool {
29778 v_0 := v.Args[0]
29779
29780
29781
29782 for {
29783 if v_0.Op != OpConst32 {
29784 break
29785 }
29786 x := auxIntToInt32(v_0.AuxInt)
29787 if !(x > 0) {
29788 break
29789 }
29790 v.reset(OpConst32)
29791 v.AuxInt = int32ToAuxInt(-1)
29792 return true
29793 }
29794
29795
29796 for {
29797 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
29798 break
29799 }
29800 v.reset(OpConst32)
29801 v.AuxInt = int32ToAuxInt(0)
29802 return true
29803 }
29804
29805
29806
29807 for {
29808 if v_0.Op != OpConst64 {
29809 break
29810 }
29811 x := auxIntToInt64(v_0.AuxInt)
29812 if !(x > 0) {
29813 break
29814 }
29815 v.reset(OpConst64)
29816 v.AuxInt = int64ToAuxInt(-1)
29817 return true
29818 }
29819
29820
29821 for {
29822 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29823 break
29824 }
29825 v.reset(OpConst64)
29826 v.AuxInt = int64ToAuxInt(0)
29827 return true
29828 }
29829 return false
29830 }
29831 func rewriteValuegeneric_OpSqrt(v *Value) bool {
29832 v_0 := v.Args[0]
29833
29834
29835
29836 for {
29837 if v_0.Op != OpConst64F {
29838 break
29839 }
29840 c := auxIntToFloat64(v_0.AuxInt)
29841 if !(!math.IsNaN(math.Sqrt(c))) {
29842 break
29843 }
29844 v.reset(OpConst64F)
29845 v.AuxInt = float64ToAuxInt(math.Sqrt(c))
29846 return true
29847 }
29848 return false
29849 }
29850 func rewriteValuegeneric_OpStaticCall(v *Value) bool {
29851 b := v.Block
29852 typ := &b.Func.Config.Types
29853
29854
29855
29856 for {
29857 if len(v.Args) != 4 {
29858 break
29859 }
29860 callAux := auxToCall(v.Aux)
29861 mem := v.Args[3]
29862 p := v.Args[0]
29863 q := v.Args[1]
29864 if !(isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)) {
29865 break
29866 }
29867 v.reset(OpMakeResult)
29868 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
29869 v0.AuxInt = boolToAuxInt(true)
29870 v.AddArg2(v0, mem)
29871 return true
29872 }
29873 return false
29874 }
29875 func rewriteValuegeneric_OpStaticLECall(v *Value) bool {
29876 b := v.Block
29877 config := b.Func.Config
29878 typ := &b.Func.Config.Types
29879
29880
29881
29882 for {
29883 if len(v.Args) != 4 {
29884 break
29885 }
29886 callAux := auxToCall(v.Aux)
29887 mem := v.Args[3]
29888 sptr := v.Args[0]
29889 v_1 := v.Args[1]
29890 if v_1.Op != OpAddr {
29891 break
29892 }
29893 scon := auxToSym(v_1.Aux)
29894 v_1_0 := v_1.Args[0]
29895 if v_1_0.Op != OpSB {
29896 break
29897 }
29898 v_2 := v.Args[2]
29899 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon)) {
29900 break
29901 }
29902 v.reset(OpMakeResult)
29903 v0 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
29904 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
29905 v1.AddArg2(sptr, mem)
29906 v2 := b.NewValue0(v.Pos, OpConst8, typ.Int8)
29907 v2.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
29908 v0.AddArg2(v1, v2)
29909 v.AddArg2(v0, mem)
29910 return true
29911 }
29912
29913
29914
29915 for {
29916 if len(v.Args) != 4 {
29917 break
29918 }
29919 callAux := auxToCall(v.Aux)
29920 mem := v.Args[3]
29921 v_0 := v.Args[0]
29922 if v_0.Op != OpAddr {
29923 break
29924 }
29925 scon := auxToSym(v_0.Aux)
29926 v_0_0 := v_0.Args[0]
29927 if v_0_0.Op != OpSB {
29928 break
29929 }
29930 sptr := v.Args[1]
29931 v_2 := v.Args[2]
29932 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon)) {
29933 break
29934 }
29935 v.reset(OpMakeResult)
29936 v0 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
29937 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
29938 v1.AddArg2(sptr, mem)
29939 v2 := b.NewValue0(v.Pos, OpConst8, typ.Int8)
29940 v2.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
29941 v0.AddArg2(v1, v2)
29942 v.AddArg2(v0, mem)
29943 return true
29944 }
29945
29946
29947
29948 for {
29949 if len(v.Args) != 4 {
29950 break
29951 }
29952 callAux := auxToCall(v.Aux)
29953 mem := v.Args[3]
29954 sptr := v.Args[0]
29955 v_1 := v.Args[1]
29956 if v_1.Op != OpAddr {
29957 break
29958 }
29959 scon := auxToSym(v_1.Aux)
29960 v_1_0 := v_1.Args[0]
29961 if v_1_0.Op != OpSB {
29962 break
29963 }
29964 v_2 := v.Args[2]
29965 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
29966 break
29967 }
29968 v.reset(OpMakeResult)
29969 v0 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
29970 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
29971 v1.AddArg2(sptr, mem)
29972 v2 := b.NewValue0(v.Pos, OpConst16, typ.Int16)
29973 v2.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
29974 v0.AddArg2(v1, v2)
29975 v.AddArg2(v0, mem)
29976 return true
29977 }
29978
29979
29980
29981 for {
29982 if len(v.Args) != 4 {
29983 break
29984 }
29985 callAux := auxToCall(v.Aux)
29986 mem := v.Args[3]
29987 v_0 := v.Args[0]
29988 if v_0.Op != OpAddr {
29989 break
29990 }
29991 scon := auxToSym(v_0.Aux)
29992 v_0_0 := v_0.Args[0]
29993 if v_0_0.Op != OpSB {
29994 break
29995 }
29996 sptr := v.Args[1]
29997 v_2 := v.Args[2]
29998 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
29999 break
30000 }
30001 v.reset(OpMakeResult)
30002 v0 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
30003 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
30004 v1.AddArg2(sptr, mem)
30005 v2 := b.NewValue0(v.Pos, OpConst16, typ.Int16)
30006 v2.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
30007 v0.AddArg2(v1, v2)
30008 v.AddArg2(v0, mem)
30009 return true
30010 }
30011
30012
30013
30014 for {
30015 if len(v.Args) != 4 {
30016 break
30017 }
30018 callAux := auxToCall(v.Aux)
30019 mem := v.Args[3]
30020 sptr := v.Args[0]
30021 v_1 := v.Args[1]
30022 if v_1.Op != OpAddr {
30023 break
30024 }
30025 scon := auxToSym(v_1.Aux)
30026 v_1_0 := v_1.Args[0]
30027 if v_1_0.Op != OpSB {
30028 break
30029 }
30030 v_2 := v.Args[2]
30031 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
30032 break
30033 }
30034 v.reset(OpMakeResult)
30035 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
30036 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
30037 v1.AddArg2(sptr, mem)
30038 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
30039 v2.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
30040 v0.AddArg2(v1, v2)
30041 v.AddArg2(v0, mem)
30042 return true
30043 }
30044
30045
30046
30047 for {
30048 if len(v.Args) != 4 {
30049 break
30050 }
30051 callAux := auxToCall(v.Aux)
30052 mem := v.Args[3]
30053 v_0 := v.Args[0]
30054 if v_0.Op != OpAddr {
30055 break
30056 }
30057 scon := auxToSym(v_0.Aux)
30058 v_0_0 := v_0.Args[0]
30059 if v_0_0.Op != OpSB {
30060 break
30061 }
30062 sptr := v.Args[1]
30063 v_2 := v.Args[2]
30064 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
30065 break
30066 }
30067 v.reset(OpMakeResult)
30068 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
30069 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
30070 v1.AddArg2(sptr, mem)
30071 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
30072 v2.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
30073 v0.AddArg2(v1, v2)
30074 v.AddArg2(v0, mem)
30075 return true
30076 }
30077
30078
30079
30080 for {
30081 if len(v.Args) != 4 {
30082 break
30083 }
30084 callAux := auxToCall(v.Aux)
30085 mem := v.Args[3]
30086 sptr := v.Args[0]
30087 v_1 := v.Args[1]
30088 if v_1.Op != OpAddr {
30089 break
30090 }
30091 scon := auxToSym(v_1.Aux)
30092 v_1_0 := v_1.Args[0]
30093 if v_1_0.Op != OpSB {
30094 break
30095 }
30096 v_2 := v.Args[2]
30097 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
30098 break
30099 }
30100 v.reset(OpMakeResult)
30101 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
30102 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
30103 v1.AddArg2(sptr, mem)
30104 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
30105 v2.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
30106 v0.AddArg2(v1, v2)
30107 v.AddArg2(v0, mem)
30108 return true
30109 }
30110
30111
30112
30113 for {
30114 if len(v.Args) != 4 {
30115 break
30116 }
30117 callAux := auxToCall(v.Aux)
30118 mem := v.Args[3]
30119 v_0 := v.Args[0]
30120 if v_0.Op != OpAddr {
30121 break
30122 }
30123 scon := auxToSym(v_0.Aux)
30124 v_0_0 := v_0.Args[0]
30125 if v_0_0.Op != OpSB {
30126 break
30127 }
30128 sptr := v.Args[1]
30129 v_2 := v.Args[2]
30130 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
30131 break
30132 }
30133 v.reset(OpMakeResult)
30134 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
30135 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
30136 v1.AddArg2(sptr, mem)
30137 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
30138 v2.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
30139 v0.AddArg2(v1, v2)
30140 v.AddArg2(v0, mem)
30141 return true
30142 }
30143
30144
30145
30146 for {
30147 if len(v.Args) != 4 {
30148 break
30149 }
30150 callAux := auxToCall(v.Aux)
30151 mem := v.Args[3]
30152 v_2 := v.Args[2]
30153 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.memequal")) {
30154 break
30155 }
30156 v.reset(OpMakeResult)
30157 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
30158 v0.AuxInt = boolToAuxInt(true)
30159 v.AddArg2(v0, mem)
30160 return true
30161 }
30162
30163
30164
30165 for {
30166 if len(v.Args) != 4 {
30167 break
30168 }
30169 callAux := auxToCall(v.Aux)
30170 mem := v.Args[3]
30171 p := v.Args[0]
30172 q := v.Args[1]
30173 if !(isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)) {
30174 break
30175 }
30176 v.reset(OpMakeResult)
30177 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
30178 v0.AuxInt = boolToAuxInt(true)
30179 v.AddArg2(v0, mem)
30180 return true
30181 }
30182
30183
30184
30185 for {
30186 if len(v.Args) != 4 {
30187 break
30188 }
30189 callAux := auxToCall(v.Aux)
30190 mem := v.Args[3]
30191 v_1 := v.Args[1]
30192 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
30193 break
30194 }
30195 v_2 := v.Args[2]
30196 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.makeslice")) {
30197 break
30198 }
30199 v.reset(OpMakeResult)
30200 v0 := b.NewValue0(v.Pos, OpAddr, v.Type.FieldType(0))
30201 v0.Aux = symToAux(ir.Syms.Zerobase)
30202 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
30203 v0.AddArg(v1)
30204 v.AddArg2(v0, mem)
30205 return true
30206 }
30207
30208
30209
30210 for {
30211 if len(v.Args) != 4 {
30212 break
30213 }
30214 callAux := auxToCall(v.Aux)
30215 mem := v.Args[3]
30216 v_1 := v.Args[1]
30217 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
30218 break
30219 }
30220 v_2 := v.Args[2]
30221 if v_2.Op != OpConst32 || auxIntToInt32(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.makeslice")) {
30222 break
30223 }
30224 v.reset(OpMakeResult)
30225 v0 := b.NewValue0(v.Pos, OpAddr, v.Type.FieldType(0))
30226 v0.Aux = symToAux(ir.Syms.Zerobase)
30227 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
30228 v0.AddArg(v1)
30229 v.AddArg2(v0, mem)
30230 return true
30231 }
30232 return false
30233 }
30234 func rewriteValuegeneric_OpStore(v *Value) bool {
30235 v_2 := v.Args[2]
30236 v_1 := v.Args[1]
30237 v_0 := v.Args[0]
30238 b := v.Block
30239
30240
30241
30242 for {
30243 t1 := auxToType(v.Aux)
30244 p1 := v_0
30245 if v_1.Op != OpLoad {
30246 break
30247 }
30248 t2 := v_1.Type
30249 mem := v_1.Args[1]
30250 p2 := v_1.Args[0]
30251 if mem != v_2 || !(isSamePtr(p1, p2) && t2.Size() == t1.Size()) {
30252 break
30253 }
30254 v.copyOf(mem)
30255 return true
30256 }
30257
30258
30259
30260 for {
30261 t1 := auxToType(v.Aux)
30262 p1 := v_0
30263 if v_1.Op != OpLoad {
30264 break
30265 }
30266 t2 := v_1.Type
30267 oldmem := v_1.Args[1]
30268 p2 := v_1.Args[0]
30269 mem := v_2
30270 if mem.Op != OpStore {
30271 break
30272 }
30273 t3 := auxToType(mem.Aux)
30274 _ = mem.Args[2]
30275 p3 := mem.Args[0]
30276 if oldmem != mem.Args[2] || !(isSamePtr(p1, p2) && t2.Size() == t1.Size() && disjoint(p1, t1.Size(), p3, t3.Size())) {
30277 break
30278 }
30279 v.copyOf(mem)
30280 return true
30281 }
30282
30283
30284
30285 for {
30286 t1 := auxToType(v.Aux)
30287 p1 := v_0
30288 if v_1.Op != OpLoad {
30289 break
30290 }
30291 t2 := v_1.Type
30292 oldmem := v_1.Args[1]
30293 p2 := v_1.Args[0]
30294 mem := v_2
30295 if mem.Op != OpStore {
30296 break
30297 }
30298 t3 := auxToType(mem.Aux)
30299 _ = mem.Args[2]
30300 p3 := mem.Args[0]
30301 mem_2 := mem.Args[2]
30302 if mem_2.Op != OpStore {
30303 break
30304 }
30305 t4 := auxToType(mem_2.Aux)
30306 _ = mem_2.Args[2]
30307 p4 := mem_2.Args[0]
30308 if oldmem != mem_2.Args[2] || !(isSamePtr(p1, p2) && t2.Size() == t1.Size() && disjoint(p1, t1.Size(), p3, t3.Size()) && disjoint(p1, t1.Size(), p4, t4.Size())) {
30309 break
30310 }
30311 v.copyOf(mem)
30312 return true
30313 }
30314
30315
30316
30317 for {
30318 t1 := auxToType(v.Aux)
30319 p1 := v_0
30320 if v_1.Op != OpLoad {
30321 break
30322 }
30323 t2 := v_1.Type
30324 oldmem := v_1.Args[1]
30325 p2 := v_1.Args[0]
30326 mem := v_2
30327 if mem.Op != OpStore {
30328 break
30329 }
30330 t3 := auxToType(mem.Aux)
30331 _ = mem.Args[2]
30332 p3 := mem.Args[0]
30333 mem_2 := mem.Args[2]
30334 if mem_2.Op != OpStore {
30335 break
30336 }
30337 t4 := auxToType(mem_2.Aux)
30338 _ = mem_2.Args[2]
30339 p4 := mem_2.Args[0]
30340 mem_2_2 := mem_2.Args[2]
30341 if mem_2_2.Op != OpStore {
30342 break
30343 }
30344 t5 := auxToType(mem_2_2.Aux)
30345 _ = mem_2_2.Args[2]
30346 p5 := mem_2_2.Args[0]
30347 if oldmem != mem_2_2.Args[2] || !(isSamePtr(p1, p2) && t2.Size() == t1.Size() && disjoint(p1, t1.Size(), p3, t3.Size()) && disjoint(p1, t1.Size(), p4, t4.Size()) && disjoint(p1, t1.Size(), p5, t5.Size())) {
30348 break
30349 }
30350 v.copyOf(mem)
30351 return true
30352 }
30353
30354
30355
30356 for {
30357 t := auxToType(v.Aux)
30358 if v_0.Op != OpOffPtr {
30359 break
30360 }
30361 o := auxIntToInt64(v_0.AuxInt)
30362 p1 := v_0.Args[0]
30363 x := v_1
30364 mem := v_2
30365 if mem.Op != OpZero {
30366 break
30367 }
30368 n := auxIntToInt64(mem.AuxInt)
30369 p2 := mem.Args[0]
30370 if !(isConstZero(x) && o >= 0 && t.Size()+o <= n && isSamePtr(p1, p2)) {
30371 break
30372 }
30373 v.copyOf(mem)
30374 return true
30375 }
30376
30377
30378
30379 for {
30380 t1 := auxToType(v.Aux)
30381 op := v_0
30382 if op.Op != OpOffPtr {
30383 break
30384 }
30385 o1 := auxIntToInt64(op.AuxInt)
30386 p1 := op.Args[0]
30387 x := v_1
30388 mem := v_2
30389 if mem.Op != OpStore {
30390 break
30391 }
30392 t2 := auxToType(mem.Aux)
30393 _ = mem.Args[2]
30394 p2 := mem.Args[0]
30395 mem_2 := mem.Args[2]
30396 if mem_2.Op != OpZero {
30397 break
30398 }
30399 n := auxIntToInt64(mem_2.AuxInt)
30400 p3 := mem_2.Args[0]
30401 if !(isConstZero(x) && o1 >= 0 && t1.Size()+o1 <= n && isSamePtr(p1, p3) && disjoint(op, t1.Size(), p2, t2.Size())) {
30402 break
30403 }
30404 v.copyOf(mem)
30405 return true
30406 }
30407
30408
30409
30410 for {
30411 t1 := auxToType(v.Aux)
30412 op := v_0
30413 if op.Op != OpOffPtr {
30414 break
30415 }
30416 o1 := auxIntToInt64(op.AuxInt)
30417 p1 := op.Args[0]
30418 x := v_1
30419 mem := v_2
30420 if mem.Op != OpStore {
30421 break
30422 }
30423 t2 := auxToType(mem.Aux)
30424 _ = mem.Args[2]
30425 p2 := mem.Args[0]
30426 mem_2 := mem.Args[2]
30427 if mem_2.Op != OpStore {
30428 break
30429 }
30430 t3 := auxToType(mem_2.Aux)
30431 _ = mem_2.Args[2]
30432 p3 := mem_2.Args[0]
30433 mem_2_2 := mem_2.Args[2]
30434 if mem_2_2.Op != OpZero {
30435 break
30436 }
30437 n := auxIntToInt64(mem_2_2.AuxInt)
30438 p4 := mem_2_2.Args[0]
30439 if !(isConstZero(x) && o1 >= 0 && t1.Size()+o1 <= n && isSamePtr(p1, p4) && disjoint(op, t1.Size(), p2, t2.Size()) && disjoint(op, t1.Size(), p3, t3.Size())) {
30440 break
30441 }
30442 v.copyOf(mem)
30443 return true
30444 }
30445
30446
30447
30448 for {
30449 t1 := auxToType(v.Aux)
30450 op := v_0
30451 if op.Op != OpOffPtr {
30452 break
30453 }
30454 o1 := auxIntToInt64(op.AuxInt)
30455 p1 := op.Args[0]
30456 x := v_1
30457 mem := v_2
30458 if mem.Op != OpStore {
30459 break
30460 }
30461 t2 := auxToType(mem.Aux)
30462 _ = mem.Args[2]
30463 p2 := mem.Args[0]
30464 mem_2 := mem.Args[2]
30465 if mem_2.Op != OpStore {
30466 break
30467 }
30468 t3 := auxToType(mem_2.Aux)
30469 _ = mem_2.Args[2]
30470 p3 := mem_2.Args[0]
30471 mem_2_2 := mem_2.Args[2]
30472 if mem_2_2.Op != OpStore {
30473 break
30474 }
30475 t4 := auxToType(mem_2_2.Aux)
30476 _ = mem_2_2.Args[2]
30477 p4 := mem_2_2.Args[0]
30478 mem_2_2_2 := mem_2_2.Args[2]
30479 if mem_2_2_2.Op != OpZero {
30480 break
30481 }
30482 n := auxIntToInt64(mem_2_2_2.AuxInt)
30483 p5 := mem_2_2_2.Args[0]
30484 if !(isConstZero(x) && o1 >= 0 && t1.Size()+o1 <= n && isSamePtr(p1, p5) && disjoint(op, t1.Size(), p2, t2.Size()) && disjoint(op, t1.Size(), p3, t3.Size()) && disjoint(op, t1.Size(), p4, t4.Size())) {
30485 break
30486 }
30487 v.copyOf(mem)
30488 return true
30489 }
30490
30491
30492 for {
30493 if v_1.Op != OpStructMake {
30494 break
30495 }
30496 v.copyOf(rewriteStructStore(v))
30497 return true
30498 }
30499
30500
30501
30502 for {
30503 t := auxToType(v.Aux)
30504 dst := v_0
30505 if v_1.Op != OpLoad {
30506 break
30507 }
30508 mem := v_1.Args[1]
30509 src := v_1.Args[0]
30510 if mem != v_2 || !(!CanSSA(t)) {
30511 break
30512 }
30513 v.reset(OpMove)
30514 v.AuxInt = int64ToAuxInt(t.Size())
30515 v.Aux = typeToAux(t)
30516 v.AddArg3(dst, src, mem)
30517 return true
30518 }
30519
30520
30521
30522 for {
30523 t := auxToType(v.Aux)
30524 dst := v_0
30525 if v_1.Op != OpLoad {
30526 break
30527 }
30528 mem := v_1.Args[1]
30529 src := v_1.Args[0]
30530 if v_2.Op != OpVarDef {
30531 break
30532 }
30533 x := auxToSym(v_2.Aux)
30534 if mem != v_2.Args[0] || !(!CanSSA(t)) {
30535 break
30536 }
30537 v.reset(OpMove)
30538 v.AuxInt = int64ToAuxInt(t.Size())
30539 v.Aux = typeToAux(t)
30540 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
30541 v0.Aux = symToAux(x)
30542 v0.AddArg(mem)
30543 v.AddArg3(dst, src, v0)
30544 return true
30545 }
30546
30547
30548 for {
30549 if v_1.Op != OpArrayMake0 {
30550 break
30551 }
30552 mem := v_2
30553 v.copyOf(mem)
30554 return true
30555 }
30556
30557
30558 for {
30559 dst := v_0
30560 if v_1.Op != OpArrayMake1 {
30561 break
30562 }
30563 e := v_1.Args[0]
30564 mem := v_2
30565 v.reset(OpStore)
30566 v.Aux = typeToAux(e.Type)
30567 v.AddArg3(dst, e, mem)
30568 return true
30569 }
30570
30571
30572
30573 for {
30574 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
30575 break
30576 }
30577 call := v_0.Args[0]
30578 if call.Op != OpStaticLECall || len(call.Args) != 2 {
30579 break
30580 }
30581 x := v_1
30582 mem := v_2
30583 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isConstZero(x) && isSameCall(call.Aux, "runtime.newobject")) {
30584 break
30585 }
30586 v.copyOf(mem)
30587 return true
30588 }
30589
30590
30591
30592 for {
30593 if v_0.Op != OpOffPtr {
30594 break
30595 }
30596 v_0_0 := v_0.Args[0]
30597 if v_0_0.Op != OpSelectN || auxIntToInt64(v_0_0.AuxInt) != 0 {
30598 break
30599 }
30600 call := v_0_0.Args[0]
30601 if call.Op != OpStaticLECall || len(call.Args) != 2 {
30602 break
30603 }
30604 x := v_1
30605 mem := v_2
30606 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isConstZero(x) && isSameCall(call.Aux, "runtime.newobject")) {
30607 break
30608 }
30609 v.copyOf(mem)
30610 return true
30611 }
30612
30613
30614
30615 for {
30616 t1 := auxToType(v.Aux)
30617 op1 := v_0
30618 if op1.Op != OpOffPtr {
30619 break
30620 }
30621 o1 := auxIntToInt64(op1.AuxInt)
30622 p1 := op1.Args[0]
30623 d1 := v_1
30624 m2 := v_2
30625 if m2.Op != OpStore {
30626 break
30627 }
30628 t2 := auxToType(m2.Aux)
30629 _ = m2.Args[2]
30630 op2 := m2.Args[0]
30631 if op2.Op != OpOffPtr || auxIntToInt64(op2.AuxInt) != 0 {
30632 break
30633 }
30634 p2 := op2.Args[0]
30635 d2 := m2.Args[1]
30636 m3 := m2.Args[2]
30637 if m3.Op != OpMove {
30638 break
30639 }
30640 n := auxIntToInt64(m3.AuxInt)
30641 mem := m3.Args[2]
30642 p3 := m3.Args[0]
30643 if !(m2.Uses == 1 && m3.Uses == 1 && o1 == t2.Size() && n == t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2, m3)) {
30644 break
30645 }
30646 v.reset(OpStore)
30647 v.Aux = typeToAux(t1)
30648 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
30649 v0.Aux = typeToAux(t2)
30650 v0.AddArg3(op2, d2, mem)
30651 v.AddArg3(op1, d1, v0)
30652 return true
30653 }
30654
30655
30656
30657 for {
30658 t1 := auxToType(v.Aux)
30659 op1 := v_0
30660 if op1.Op != OpOffPtr {
30661 break
30662 }
30663 o1 := auxIntToInt64(op1.AuxInt)
30664 p1 := op1.Args[0]
30665 d1 := v_1
30666 m2 := v_2
30667 if m2.Op != OpStore {
30668 break
30669 }
30670 t2 := auxToType(m2.Aux)
30671 _ = m2.Args[2]
30672 op2 := m2.Args[0]
30673 if op2.Op != OpOffPtr {
30674 break
30675 }
30676 o2 := auxIntToInt64(op2.AuxInt)
30677 p2 := op2.Args[0]
30678 d2 := m2.Args[1]
30679 m3 := m2.Args[2]
30680 if m3.Op != OpStore {
30681 break
30682 }
30683 t3 := auxToType(m3.Aux)
30684 _ = m3.Args[2]
30685 op3 := m3.Args[0]
30686 if op3.Op != OpOffPtr || auxIntToInt64(op3.AuxInt) != 0 {
30687 break
30688 }
30689 p3 := op3.Args[0]
30690 d3 := m3.Args[1]
30691 m4 := m3.Args[2]
30692 if m4.Op != OpMove {
30693 break
30694 }
30695 n := auxIntToInt64(m4.AuxInt)
30696 mem := m4.Args[2]
30697 p4 := m4.Args[0]
30698 if !(m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && o2 == t3.Size() && o1-o2 == t2.Size() && n == t3.Size()+t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && clobber(m2, m3, m4)) {
30699 break
30700 }
30701 v.reset(OpStore)
30702 v.Aux = typeToAux(t1)
30703 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
30704 v0.Aux = typeToAux(t2)
30705 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
30706 v1.Aux = typeToAux(t3)
30707 v1.AddArg3(op3, d3, mem)
30708 v0.AddArg3(op2, d2, v1)
30709 v.AddArg3(op1, d1, v0)
30710 return true
30711 }
30712
30713
30714
30715 for {
30716 t1 := auxToType(v.Aux)
30717 op1 := v_0
30718 if op1.Op != OpOffPtr {
30719 break
30720 }
30721 o1 := auxIntToInt64(op1.AuxInt)
30722 p1 := op1.Args[0]
30723 d1 := v_1
30724 m2 := v_2
30725 if m2.Op != OpStore {
30726 break
30727 }
30728 t2 := auxToType(m2.Aux)
30729 _ = m2.Args[2]
30730 op2 := m2.Args[0]
30731 if op2.Op != OpOffPtr {
30732 break
30733 }
30734 o2 := auxIntToInt64(op2.AuxInt)
30735 p2 := op2.Args[0]
30736 d2 := m2.Args[1]
30737 m3 := m2.Args[2]
30738 if m3.Op != OpStore {
30739 break
30740 }
30741 t3 := auxToType(m3.Aux)
30742 _ = m3.Args[2]
30743 op3 := m3.Args[0]
30744 if op3.Op != OpOffPtr {
30745 break
30746 }
30747 o3 := auxIntToInt64(op3.AuxInt)
30748 p3 := op3.Args[0]
30749 d3 := m3.Args[1]
30750 m4 := m3.Args[2]
30751 if m4.Op != OpStore {
30752 break
30753 }
30754 t4 := auxToType(m4.Aux)
30755 _ = m4.Args[2]
30756 op4 := m4.Args[0]
30757 if op4.Op != OpOffPtr || auxIntToInt64(op4.AuxInt) != 0 {
30758 break
30759 }
30760 p4 := op4.Args[0]
30761 d4 := m4.Args[1]
30762 m5 := m4.Args[2]
30763 if m5.Op != OpMove {
30764 break
30765 }
30766 n := auxIntToInt64(m5.AuxInt)
30767 mem := m5.Args[2]
30768 p5 := m5.Args[0]
30769 if !(m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && m5.Uses == 1 && o3 == t4.Size() && o2-o3 == t3.Size() && o1-o2 == t2.Size() && n == t4.Size()+t3.Size()+t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && clobber(m2, m3, m4, m5)) {
30770 break
30771 }
30772 v.reset(OpStore)
30773 v.Aux = typeToAux(t1)
30774 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
30775 v0.Aux = typeToAux(t2)
30776 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
30777 v1.Aux = typeToAux(t3)
30778 v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
30779 v2.Aux = typeToAux(t4)
30780 v2.AddArg3(op4, d4, mem)
30781 v1.AddArg3(op3, d3, v2)
30782 v0.AddArg3(op2, d2, v1)
30783 v.AddArg3(op1, d1, v0)
30784 return true
30785 }
30786
30787
30788
30789 for {
30790 t1 := auxToType(v.Aux)
30791 op1 := v_0
30792 if op1.Op != OpOffPtr {
30793 break
30794 }
30795 o1 := auxIntToInt64(op1.AuxInt)
30796 p1 := op1.Args[0]
30797 d1 := v_1
30798 m2 := v_2
30799 if m2.Op != OpStore {
30800 break
30801 }
30802 t2 := auxToType(m2.Aux)
30803 _ = m2.Args[2]
30804 op2 := m2.Args[0]
30805 if op2.Op != OpOffPtr || auxIntToInt64(op2.AuxInt) != 0 {
30806 break
30807 }
30808 p2 := op2.Args[0]
30809 d2 := m2.Args[1]
30810 m3 := m2.Args[2]
30811 if m3.Op != OpZero {
30812 break
30813 }
30814 n := auxIntToInt64(m3.AuxInt)
30815 mem := m3.Args[1]
30816 p3 := m3.Args[0]
30817 if !(m2.Uses == 1 && m3.Uses == 1 && o1 == t2.Size() && n == t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2, m3)) {
30818 break
30819 }
30820 v.reset(OpStore)
30821 v.Aux = typeToAux(t1)
30822 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
30823 v0.Aux = typeToAux(t2)
30824 v0.AddArg3(op2, d2, mem)
30825 v.AddArg3(op1, d1, v0)
30826 return true
30827 }
30828
30829
30830
30831 for {
30832 t1 := auxToType(v.Aux)
30833 op1 := v_0
30834 if op1.Op != OpOffPtr {
30835 break
30836 }
30837 o1 := auxIntToInt64(op1.AuxInt)
30838 p1 := op1.Args[0]
30839 d1 := v_1
30840 m2 := v_2
30841 if m2.Op != OpStore {
30842 break
30843 }
30844 t2 := auxToType(m2.Aux)
30845 _ = m2.Args[2]
30846 op2 := m2.Args[0]
30847 if op2.Op != OpOffPtr {
30848 break
30849 }
30850 o2 := auxIntToInt64(op2.AuxInt)
30851 p2 := op2.Args[0]
30852 d2 := m2.Args[1]
30853 m3 := m2.Args[2]
30854 if m3.Op != OpStore {
30855 break
30856 }
30857 t3 := auxToType(m3.Aux)
30858 _ = m3.Args[2]
30859 op3 := m3.Args[0]
30860 if op3.Op != OpOffPtr || auxIntToInt64(op3.AuxInt) != 0 {
30861 break
30862 }
30863 p3 := op3.Args[0]
30864 d3 := m3.Args[1]
30865 m4 := m3.Args[2]
30866 if m4.Op != OpZero {
30867 break
30868 }
30869 n := auxIntToInt64(m4.AuxInt)
30870 mem := m4.Args[1]
30871 p4 := m4.Args[0]
30872 if !(m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && o2 == t3.Size() && o1-o2 == t2.Size() && n == t3.Size()+t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && clobber(m2, m3, m4)) {
30873 break
30874 }
30875 v.reset(OpStore)
30876 v.Aux = typeToAux(t1)
30877 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
30878 v0.Aux = typeToAux(t2)
30879 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
30880 v1.Aux = typeToAux(t3)
30881 v1.AddArg3(op3, d3, mem)
30882 v0.AddArg3(op2, d2, v1)
30883 v.AddArg3(op1, d1, v0)
30884 return true
30885 }
30886
30887
30888
30889 for {
30890 t1 := auxToType(v.Aux)
30891 op1 := v_0
30892 if op1.Op != OpOffPtr {
30893 break
30894 }
30895 o1 := auxIntToInt64(op1.AuxInt)
30896 p1 := op1.Args[0]
30897 d1 := v_1
30898 m2 := v_2
30899 if m2.Op != OpStore {
30900 break
30901 }
30902 t2 := auxToType(m2.Aux)
30903 _ = m2.Args[2]
30904 op2 := m2.Args[0]
30905 if op2.Op != OpOffPtr {
30906 break
30907 }
30908 o2 := auxIntToInt64(op2.AuxInt)
30909 p2 := op2.Args[0]
30910 d2 := m2.Args[1]
30911 m3 := m2.Args[2]
30912 if m3.Op != OpStore {
30913 break
30914 }
30915 t3 := auxToType(m3.Aux)
30916 _ = m3.Args[2]
30917 op3 := m3.Args[0]
30918 if op3.Op != OpOffPtr {
30919 break
30920 }
30921 o3 := auxIntToInt64(op3.AuxInt)
30922 p3 := op3.Args[0]
30923 d3 := m3.Args[1]
30924 m4 := m3.Args[2]
30925 if m4.Op != OpStore {
30926 break
30927 }
30928 t4 := auxToType(m4.Aux)
30929 _ = m4.Args[2]
30930 op4 := m4.Args[0]
30931 if op4.Op != OpOffPtr || auxIntToInt64(op4.AuxInt) != 0 {
30932 break
30933 }
30934 p4 := op4.Args[0]
30935 d4 := m4.Args[1]
30936 m5 := m4.Args[2]
30937 if m5.Op != OpZero {
30938 break
30939 }
30940 n := auxIntToInt64(m5.AuxInt)
30941 mem := m5.Args[1]
30942 p5 := m5.Args[0]
30943 if !(m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && m5.Uses == 1 && o3 == t4.Size() && o2-o3 == t3.Size() && o1-o2 == t2.Size() && n == t4.Size()+t3.Size()+t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && clobber(m2, m3, m4, m5)) {
30944 break
30945 }
30946 v.reset(OpStore)
30947 v.Aux = typeToAux(t1)
30948 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
30949 v0.Aux = typeToAux(t2)
30950 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
30951 v1.Aux = typeToAux(t3)
30952 v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
30953 v2.Aux = typeToAux(t4)
30954 v2.AddArg3(op4, d4, mem)
30955 v1.AddArg3(op3, d3, v2)
30956 v0.AddArg3(op2, d2, v1)
30957 v.AddArg3(op1, d1, v0)
30958 return true
30959 }
30960 return false
30961 }
30962 func rewriteValuegeneric_OpStringLen(v *Value) bool {
30963 v_0 := v.Args[0]
30964
30965
30966 for {
30967 if v_0.Op != OpStringMake {
30968 break
30969 }
30970 _ = v_0.Args[1]
30971 v_0_1 := v_0.Args[1]
30972 if v_0_1.Op != OpConst64 {
30973 break
30974 }
30975 t := v_0_1.Type
30976 c := auxIntToInt64(v_0_1.AuxInt)
30977 v.reset(OpConst64)
30978 v.Type = t
30979 v.AuxInt = int64ToAuxInt(c)
30980 return true
30981 }
30982 return false
30983 }
30984 func rewriteValuegeneric_OpStringPtr(v *Value) bool {
30985 v_0 := v.Args[0]
30986
30987
30988 for {
30989 if v_0.Op != OpStringMake {
30990 break
30991 }
30992 v_0_0 := v_0.Args[0]
30993 if v_0_0.Op != OpAddr {
30994 break
30995 }
30996 t := v_0_0.Type
30997 s := auxToSym(v_0_0.Aux)
30998 base := v_0_0.Args[0]
30999 v.reset(OpAddr)
31000 v.Type = t
31001 v.Aux = symToAux(s)
31002 v.AddArg(base)
31003 return true
31004 }
31005 return false
31006 }
31007 func rewriteValuegeneric_OpStructSelect(v *Value) bool {
31008 v_0 := v.Args[0]
31009 b := v.Block
31010
31011
31012 for {
31013 i := auxIntToInt64(v.AuxInt)
31014 x := v_0
31015 if x.Op != OpStructMake {
31016 break
31017 }
31018 v.copyOf(x.Args[i])
31019 return true
31020 }
31021
31022
31023
31024 for {
31025 i := auxIntToInt64(v.AuxInt)
31026 x := v_0
31027 if x.Op != OpLoad {
31028 break
31029 }
31030 t := x.Type
31031 mem := x.Args[1]
31032 ptr := x.Args[0]
31033 if !(!CanSSA(t)) {
31034 break
31035 }
31036 b = x.Block
31037 v0 := b.NewValue0(v.Pos, OpLoad, v.Type)
31038 v.copyOf(v0)
31039 v1 := b.NewValue0(v.Pos, OpOffPtr, v.Type.PtrTo())
31040 v1.AuxInt = int64ToAuxInt(t.FieldOff(int(i)))
31041 v1.AddArg(ptr)
31042 v0.AddArg2(v1, mem)
31043 return true
31044 }
31045
31046
31047 for {
31048 if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpIData {
31049 break
31050 }
31051 x := v_0.Args[0]
31052 v.reset(OpIData)
31053 v.AddArg(x)
31054 return true
31055 }
31056 return false
31057 }
31058 func rewriteValuegeneric_OpSub16(v *Value) bool {
31059 v_1 := v.Args[1]
31060 v_0 := v.Args[0]
31061 b := v.Block
31062
31063
31064 for {
31065 if v_0.Op != OpConst16 {
31066 break
31067 }
31068 c := auxIntToInt16(v_0.AuxInt)
31069 if v_1.Op != OpConst16 {
31070 break
31071 }
31072 d := auxIntToInt16(v_1.AuxInt)
31073 v.reset(OpConst16)
31074 v.AuxInt = int16ToAuxInt(c - d)
31075 return true
31076 }
31077
31078
31079
31080 for {
31081 x := v_0
31082 if v_1.Op != OpConst16 {
31083 break
31084 }
31085 t := v_1.Type
31086 c := auxIntToInt16(v_1.AuxInt)
31087 if !(x.Op != OpConst16) {
31088 break
31089 }
31090 v.reset(OpAdd16)
31091 v0 := b.NewValue0(v.Pos, OpConst16, t)
31092 v0.AuxInt = int16ToAuxInt(-c)
31093 v.AddArg2(v0, x)
31094 return true
31095 }
31096
31097
31098 for {
31099 t := v.Type
31100 if v_0.Op != OpMul16 {
31101 break
31102 }
31103 _ = v_0.Args[1]
31104 v_0_0 := v_0.Args[0]
31105 v_0_1 := v_0.Args[1]
31106 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
31107 x := v_0_0
31108 y := v_0_1
31109 if v_1.Op != OpMul16 {
31110 continue
31111 }
31112 _ = v_1.Args[1]
31113 v_1_0 := v_1.Args[0]
31114 v_1_1 := v_1.Args[1]
31115 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
31116 if x != v_1_0 {
31117 continue
31118 }
31119 z := v_1_1
31120 v.reset(OpMul16)
31121 v0 := b.NewValue0(v.Pos, OpSub16, t)
31122 v0.AddArg2(y, z)
31123 v.AddArg2(x, v0)
31124 return true
31125 }
31126 }
31127 break
31128 }
31129
31130
31131 for {
31132 x := v_0
31133 if x != v_1 {
31134 break
31135 }
31136 v.reset(OpConst16)
31137 v.AuxInt = int16ToAuxInt(0)
31138 return true
31139 }
31140
31141
31142 for {
31143 if v_0.Op != OpNeg16 {
31144 break
31145 }
31146 x := v_0.Args[0]
31147 if v_1.Op != OpCom16 || x != v_1.Args[0] {
31148 break
31149 }
31150 v.reset(OpConst16)
31151 v.AuxInt = int16ToAuxInt(1)
31152 return true
31153 }
31154
31155
31156 for {
31157 if v_0.Op != OpCom16 {
31158 break
31159 }
31160 x := v_0.Args[0]
31161 if v_1.Op != OpNeg16 || x != v_1.Args[0] {
31162 break
31163 }
31164 v.reset(OpConst16)
31165 v.AuxInt = int16ToAuxInt(-1)
31166 return true
31167 }
31168
31169
31170 for {
31171 if v_0.Op != OpAdd16 {
31172 break
31173 }
31174 _ = v_0.Args[1]
31175 v_0_0 := v_0.Args[0]
31176 v_0_1 := v_0.Args[1]
31177 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
31178 t := v_0_0
31179 x := v_0_1
31180 if v_1.Op != OpAdd16 {
31181 continue
31182 }
31183 _ = v_1.Args[1]
31184 v_1_0 := v_1.Args[0]
31185 v_1_1 := v_1.Args[1]
31186 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
31187 if t != v_1_0 {
31188 continue
31189 }
31190 y := v_1_1
31191 v.reset(OpSub16)
31192 v.AddArg2(x, y)
31193 return true
31194 }
31195 }
31196 break
31197 }
31198
31199
31200 for {
31201 if v_0.Op != OpAdd16 {
31202 break
31203 }
31204 _ = v_0.Args[1]
31205 v_0_0 := v_0.Args[0]
31206 v_0_1 := v_0.Args[1]
31207 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
31208 x := v_0_0
31209 y := v_0_1
31210 if x != v_1 {
31211 continue
31212 }
31213 v.copyOf(y)
31214 return true
31215 }
31216 break
31217 }
31218
31219
31220 for {
31221 if v_0.Op != OpAdd16 {
31222 break
31223 }
31224 _ = v_0.Args[1]
31225 v_0_0 := v_0.Args[0]
31226 v_0_1 := v_0.Args[1]
31227 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
31228 x := v_0_0
31229 y := v_0_1
31230 if y != v_1 {
31231 continue
31232 }
31233 v.copyOf(x)
31234 return true
31235 }
31236 break
31237 }
31238
31239
31240 for {
31241 if v_0.Op != OpSub16 {
31242 break
31243 }
31244 y := v_0.Args[1]
31245 x := v_0.Args[0]
31246 if x != v_1 {
31247 break
31248 }
31249 v.reset(OpNeg16)
31250 v.AddArg(y)
31251 return true
31252 }
31253
31254
31255 for {
31256 x := v_0
31257 if v_1.Op != OpAdd16 {
31258 break
31259 }
31260 _ = v_1.Args[1]
31261 v_1_0 := v_1.Args[0]
31262 v_1_1 := v_1.Args[1]
31263 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
31264 if x != v_1_0 {
31265 continue
31266 }
31267 y := v_1_1
31268 v.reset(OpNeg16)
31269 v.AddArg(y)
31270 return true
31271 }
31272 break
31273 }
31274
31275
31276
31277 for {
31278 x := v_0
31279 if v_1.Op != OpSub16 {
31280 break
31281 }
31282 z := v_1.Args[1]
31283 i := v_1.Args[0]
31284 if i.Op != OpConst16 {
31285 break
31286 }
31287 t := i.Type
31288 if !(z.Op != OpConst16 && x.Op != OpConst16) {
31289 break
31290 }
31291 v.reset(OpSub16)
31292 v0 := b.NewValue0(v.Pos, OpAdd16, t)
31293 v0.AddArg2(x, z)
31294 v.AddArg2(v0, i)
31295 return true
31296 }
31297
31298
31299
31300 for {
31301 x := v_0
31302 if v_1.Op != OpAdd16 {
31303 break
31304 }
31305 _ = v_1.Args[1]
31306 v_1_0 := v_1.Args[0]
31307 v_1_1 := v_1.Args[1]
31308 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
31309 z := v_1_0
31310 i := v_1_1
31311 if i.Op != OpConst16 {
31312 continue
31313 }
31314 t := i.Type
31315 if !(z.Op != OpConst16 && x.Op != OpConst16) {
31316 continue
31317 }
31318 v.reset(OpSub16)
31319 v0 := b.NewValue0(v.Pos, OpSub16, t)
31320 v0.AddArg2(x, z)
31321 v.AddArg2(v0, i)
31322 return true
31323 }
31324 break
31325 }
31326
31327
31328
31329 for {
31330 if v_0.Op != OpSub16 {
31331 break
31332 }
31333 z := v_0.Args[1]
31334 i := v_0.Args[0]
31335 if i.Op != OpConst16 {
31336 break
31337 }
31338 t := i.Type
31339 x := v_1
31340 if !(z.Op != OpConst16 && x.Op != OpConst16) {
31341 break
31342 }
31343 v.reset(OpSub16)
31344 v0 := b.NewValue0(v.Pos, OpAdd16, t)
31345 v0.AddArg2(z, x)
31346 v.AddArg2(i, v0)
31347 return true
31348 }
31349
31350
31351
31352 for {
31353 if v_0.Op != OpAdd16 {
31354 break
31355 }
31356 _ = v_0.Args[1]
31357 v_0_0 := v_0.Args[0]
31358 v_0_1 := v_0.Args[1]
31359 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
31360 z := v_0_0
31361 i := v_0_1
31362 if i.Op != OpConst16 {
31363 continue
31364 }
31365 t := i.Type
31366 x := v_1
31367 if !(z.Op != OpConst16 && x.Op != OpConst16) {
31368 continue
31369 }
31370 v.reset(OpAdd16)
31371 v0 := b.NewValue0(v.Pos, OpSub16, t)
31372 v0.AddArg2(z, x)
31373 v.AddArg2(i, v0)
31374 return true
31375 }
31376 break
31377 }
31378
31379
31380 for {
31381 if v_0.Op != OpConst16 {
31382 break
31383 }
31384 t := v_0.Type
31385 c := auxIntToInt16(v_0.AuxInt)
31386 if v_1.Op != OpSub16 {
31387 break
31388 }
31389 x := v_1.Args[1]
31390 v_1_0 := v_1.Args[0]
31391 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
31392 break
31393 }
31394 d := auxIntToInt16(v_1_0.AuxInt)
31395 v.reset(OpAdd16)
31396 v0 := b.NewValue0(v.Pos, OpConst16, t)
31397 v0.AuxInt = int16ToAuxInt(c - d)
31398 v.AddArg2(v0, x)
31399 return true
31400 }
31401
31402
31403 for {
31404 if v_0.Op != OpConst16 {
31405 break
31406 }
31407 t := v_0.Type
31408 c := auxIntToInt16(v_0.AuxInt)
31409 if v_1.Op != OpAdd16 {
31410 break
31411 }
31412 _ = v_1.Args[1]
31413 v_1_0 := v_1.Args[0]
31414 v_1_1 := v_1.Args[1]
31415 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
31416 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
31417 continue
31418 }
31419 d := auxIntToInt16(v_1_0.AuxInt)
31420 x := v_1_1
31421 v.reset(OpSub16)
31422 v0 := b.NewValue0(v.Pos, OpConst16, t)
31423 v0.AuxInt = int16ToAuxInt(c - d)
31424 v.AddArg2(v0, x)
31425 return true
31426 }
31427 break
31428 }
31429 return false
31430 }
31431 func rewriteValuegeneric_OpSub32(v *Value) bool {
31432 v_1 := v.Args[1]
31433 v_0 := v.Args[0]
31434 b := v.Block
31435
31436
31437 for {
31438 if v_0.Op != OpConst32 {
31439 break
31440 }
31441 c := auxIntToInt32(v_0.AuxInt)
31442 if v_1.Op != OpConst32 {
31443 break
31444 }
31445 d := auxIntToInt32(v_1.AuxInt)
31446 v.reset(OpConst32)
31447 v.AuxInt = int32ToAuxInt(c - d)
31448 return true
31449 }
31450
31451
31452
31453 for {
31454 x := v_0
31455 if v_1.Op != OpConst32 {
31456 break
31457 }
31458 t := v_1.Type
31459 c := auxIntToInt32(v_1.AuxInt)
31460 if !(x.Op != OpConst32) {
31461 break
31462 }
31463 v.reset(OpAdd32)
31464 v0 := b.NewValue0(v.Pos, OpConst32, t)
31465 v0.AuxInt = int32ToAuxInt(-c)
31466 v.AddArg2(v0, x)
31467 return true
31468 }
31469
31470
31471 for {
31472 t := v.Type
31473 if v_0.Op != OpMul32 {
31474 break
31475 }
31476 _ = v_0.Args[1]
31477 v_0_0 := v_0.Args[0]
31478 v_0_1 := v_0.Args[1]
31479 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
31480 x := v_0_0
31481 y := v_0_1
31482 if v_1.Op != OpMul32 {
31483 continue
31484 }
31485 _ = v_1.Args[1]
31486 v_1_0 := v_1.Args[0]
31487 v_1_1 := v_1.Args[1]
31488 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
31489 if x != v_1_0 {
31490 continue
31491 }
31492 z := v_1_1
31493 v.reset(OpMul32)
31494 v0 := b.NewValue0(v.Pos, OpSub32, t)
31495 v0.AddArg2(y, z)
31496 v.AddArg2(x, v0)
31497 return true
31498 }
31499 }
31500 break
31501 }
31502
31503
31504 for {
31505 x := v_0
31506 if x != v_1 {
31507 break
31508 }
31509 v.reset(OpConst32)
31510 v.AuxInt = int32ToAuxInt(0)
31511 return true
31512 }
31513
31514
31515 for {
31516 if v_0.Op != OpNeg32 {
31517 break
31518 }
31519 x := v_0.Args[0]
31520 if v_1.Op != OpCom32 || x != v_1.Args[0] {
31521 break
31522 }
31523 v.reset(OpConst32)
31524 v.AuxInt = int32ToAuxInt(1)
31525 return true
31526 }
31527
31528
31529 for {
31530 if v_0.Op != OpCom32 {
31531 break
31532 }
31533 x := v_0.Args[0]
31534 if v_1.Op != OpNeg32 || x != v_1.Args[0] {
31535 break
31536 }
31537 v.reset(OpConst32)
31538 v.AuxInt = int32ToAuxInt(-1)
31539 return true
31540 }
31541
31542
31543 for {
31544 if v_0.Op != OpAdd32 {
31545 break
31546 }
31547 _ = v_0.Args[1]
31548 v_0_0 := v_0.Args[0]
31549 v_0_1 := v_0.Args[1]
31550 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
31551 t := v_0_0
31552 x := v_0_1
31553 if v_1.Op != OpAdd32 {
31554 continue
31555 }
31556 _ = v_1.Args[1]
31557 v_1_0 := v_1.Args[0]
31558 v_1_1 := v_1.Args[1]
31559 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
31560 if t != v_1_0 {
31561 continue
31562 }
31563 y := v_1_1
31564 v.reset(OpSub32)
31565 v.AddArg2(x, y)
31566 return true
31567 }
31568 }
31569 break
31570 }
31571
31572
31573 for {
31574 if v_0.Op != OpAdd32 {
31575 break
31576 }
31577 _ = v_0.Args[1]
31578 v_0_0 := v_0.Args[0]
31579 v_0_1 := v_0.Args[1]
31580 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
31581 x := v_0_0
31582 y := v_0_1
31583 if x != v_1 {
31584 continue
31585 }
31586 v.copyOf(y)
31587 return true
31588 }
31589 break
31590 }
31591
31592
31593 for {
31594 if v_0.Op != OpAdd32 {
31595 break
31596 }
31597 _ = v_0.Args[1]
31598 v_0_0 := v_0.Args[0]
31599 v_0_1 := v_0.Args[1]
31600 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
31601 x := v_0_0
31602 y := v_0_1
31603 if y != v_1 {
31604 continue
31605 }
31606 v.copyOf(x)
31607 return true
31608 }
31609 break
31610 }
31611
31612
31613 for {
31614 if v_0.Op != OpSub32 {
31615 break
31616 }
31617 y := v_0.Args[1]
31618 x := v_0.Args[0]
31619 if x != v_1 {
31620 break
31621 }
31622 v.reset(OpNeg32)
31623 v.AddArg(y)
31624 return true
31625 }
31626
31627
31628 for {
31629 x := v_0
31630 if v_1.Op != OpAdd32 {
31631 break
31632 }
31633 _ = v_1.Args[1]
31634 v_1_0 := v_1.Args[0]
31635 v_1_1 := v_1.Args[1]
31636 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
31637 if x != v_1_0 {
31638 continue
31639 }
31640 y := v_1_1
31641 v.reset(OpNeg32)
31642 v.AddArg(y)
31643 return true
31644 }
31645 break
31646 }
31647
31648
31649
31650 for {
31651 x := v_0
31652 if v_1.Op != OpSub32 {
31653 break
31654 }
31655 z := v_1.Args[1]
31656 i := v_1.Args[0]
31657 if i.Op != OpConst32 {
31658 break
31659 }
31660 t := i.Type
31661 if !(z.Op != OpConst32 && x.Op != OpConst32) {
31662 break
31663 }
31664 v.reset(OpSub32)
31665 v0 := b.NewValue0(v.Pos, OpAdd32, t)
31666 v0.AddArg2(x, z)
31667 v.AddArg2(v0, i)
31668 return true
31669 }
31670
31671
31672
31673 for {
31674 x := v_0
31675 if v_1.Op != OpAdd32 {
31676 break
31677 }
31678 _ = v_1.Args[1]
31679 v_1_0 := v_1.Args[0]
31680 v_1_1 := v_1.Args[1]
31681 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
31682 z := v_1_0
31683 i := v_1_1
31684 if i.Op != OpConst32 {
31685 continue
31686 }
31687 t := i.Type
31688 if !(z.Op != OpConst32 && x.Op != OpConst32) {
31689 continue
31690 }
31691 v.reset(OpSub32)
31692 v0 := b.NewValue0(v.Pos, OpSub32, t)
31693 v0.AddArg2(x, z)
31694 v.AddArg2(v0, i)
31695 return true
31696 }
31697 break
31698 }
31699
31700
31701
31702 for {
31703 if v_0.Op != OpSub32 {
31704 break
31705 }
31706 z := v_0.Args[1]
31707 i := v_0.Args[0]
31708 if i.Op != OpConst32 {
31709 break
31710 }
31711 t := i.Type
31712 x := v_1
31713 if !(z.Op != OpConst32 && x.Op != OpConst32) {
31714 break
31715 }
31716 v.reset(OpSub32)
31717 v0 := b.NewValue0(v.Pos, OpAdd32, t)
31718 v0.AddArg2(z, x)
31719 v.AddArg2(i, v0)
31720 return true
31721 }
31722
31723
31724
31725 for {
31726 if v_0.Op != OpAdd32 {
31727 break
31728 }
31729 _ = v_0.Args[1]
31730 v_0_0 := v_0.Args[0]
31731 v_0_1 := v_0.Args[1]
31732 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
31733 z := v_0_0
31734 i := v_0_1
31735 if i.Op != OpConst32 {
31736 continue
31737 }
31738 t := i.Type
31739 x := v_1
31740 if !(z.Op != OpConst32 && x.Op != OpConst32) {
31741 continue
31742 }
31743 v.reset(OpAdd32)
31744 v0 := b.NewValue0(v.Pos, OpSub32, t)
31745 v0.AddArg2(z, x)
31746 v.AddArg2(i, v0)
31747 return true
31748 }
31749 break
31750 }
31751
31752
31753 for {
31754 if v_0.Op != OpConst32 {
31755 break
31756 }
31757 t := v_0.Type
31758 c := auxIntToInt32(v_0.AuxInt)
31759 if v_1.Op != OpSub32 {
31760 break
31761 }
31762 x := v_1.Args[1]
31763 v_1_0 := v_1.Args[0]
31764 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
31765 break
31766 }
31767 d := auxIntToInt32(v_1_0.AuxInt)
31768 v.reset(OpAdd32)
31769 v0 := b.NewValue0(v.Pos, OpConst32, t)
31770 v0.AuxInt = int32ToAuxInt(c - d)
31771 v.AddArg2(v0, x)
31772 return true
31773 }
31774
31775
31776 for {
31777 if v_0.Op != OpConst32 {
31778 break
31779 }
31780 t := v_0.Type
31781 c := auxIntToInt32(v_0.AuxInt)
31782 if v_1.Op != OpAdd32 {
31783 break
31784 }
31785 _ = v_1.Args[1]
31786 v_1_0 := v_1.Args[0]
31787 v_1_1 := v_1.Args[1]
31788 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
31789 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
31790 continue
31791 }
31792 d := auxIntToInt32(v_1_0.AuxInt)
31793 x := v_1_1
31794 v.reset(OpSub32)
31795 v0 := b.NewValue0(v.Pos, OpConst32, t)
31796 v0.AuxInt = int32ToAuxInt(c - d)
31797 v.AddArg2(v0, x)
31798 return true
31799 }
31800 break
31801 }
31802 return false
31803 }
31804 func rewriteValuegeneric_OpSub32F(v *Value) bool {
31805 v_1 := v.Args[1]
31806 v_0 := v.Args[0]
31807
31808
31809
31810 for {
31811 if v_0.Op != OpConst32F {
31812 break
31813 }
31814 c := auxIntToFloat32(v_0.AuxInt)
31815 if v_1.Op != OpConst32F {
31816 break
31817 }
31818 d := auxIntToFloat32(v_1.AuxInt)
31819 if !(c-d == c-d) {
31820 break
31821 }
31822 v.reset(OpConst32F)
31823 v.AuxInt = float32ToAuxInt(c - d)
31824 return true
31825 }
31826 return false
31827 }
31828 func rewriteValuegeneric_OpSub64(v *Value) bool {
31829 v_1 := v.Args[1]
31830 v_0 := v.Args[0]
31831 b := v.Block
31832
31833
31834 for {
31835 if v_0.Op != OpConst64 {
31836 break
31837 }
31838 c := auxIntToInt64(v_0.AuxInt)
31839 if v_1.Op != OpConst64 {
31840 break
31841 }
31842 d := auxIntToInt64(v_1.AuxInt)
31843 v.reset(OpConst64)
31844 v.AuxInt = int64ToAuxInt(c - d)
31845 return true
31846 }
31847
31848
31849
31850 for {
31851 x := v_0
31852 if v_1.Op != OpConst64 {
31853 break
31854 }
31855 t := v_1.Type
31856 c := auxIntToInt64(v_1.AuxInt)
31857 if !(x.Op != OpConst64) {
31858 break
31859 }
31860 v.reset(OpAdd64)
31861 v0 := b.NewValue0(v.Pos, OpConst64, t)
31862 v0.AuxInt = int64ToAuxInt(-c)
31863 v.AddArg2(v0, x)
31864 return true
31865 }
31866
31867
31868 for {
31869 t := v.Type
31870 if v_0.Op != OpMul64 {
31871 break
31872 }
31873 _ = v_0.Args[1]
31874 v_0_0 := v_0.Args[0]
31875 v_0_1 := v_0.Args[1]
31876 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
31877 x := v_0_0
31878 y := v_0_1
31879 if v_1.Op != OpMul64 {
31880 continue
31881 }
31882 _ = v_1.Args[1]
31883 v_1_0 := v_1.Args[0]
31884 v_1_1 := v_1.Args[1]
31885 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
31886 if x != v_1_0 {
31887 continue
31888 }
31889 z := v_1_1
31890 v.reset(OpMul64)
31891 v0 := b.NewValue0(v.Pos, OpSub64, t)
31892 v0.AddArg2(y, z)
31893 v.AddArg2(x, v0)
31894 return true
31895 }
31896 }
31897 break
31898 }
31899
31900
31901 for {
31902 x := v_0
31903 if x != v_1 {
31904 break
31905 }
31906 v.reset(OpConst64)
31907 v.AuxInt = int64ToAuxInt(0)
31908 return true
31909 }
31910
31911
31912 for {
31913 if v_0.Op != OpNeg64 {
31914 break
31915 }
31916 x := v_0.Args[0]
31917 if v_1.Op != OpCom64 || x != v_1.Args[0] {
31918 break
31919 }
31920 v.reset(OpConst64)
31921 v.AuxInt = int64ToAuxInt(1)
31922 return true
31923 }
31924
31925
31926 for {
31927 if v_0.Op != OpCom64 {
31928 break
31929 }
31930 x := v_0.Args[0]
31931 if v_1.Op != OpNeg64 || x != v_1.Args[0] {
31932 break
31933 }
31934 v.reset(OpConst64)
31935 v.AuxInt = int64ToAuxInt(-1)
31936 return true
31937 }
31938
31939
31940 for {
31941 if v_0.Op != OpAdd64 {
31942 break
31943 }
31944 _ = v_0.Args[1]
31945 v_0_0 := v_0.Args[0]
31946 v_0_1 := v_0.Args[1]
31947 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
31948 t := v_0_0
31949 x := v_0_1
31950 if v_1.Op != OpAdd64 {
31951 continue
31952 }
31953 _ = v_1.Args[1]
31954 v_1_0 := v_1.Args[0]
31955 v_1_1 := v_1.Args[1]
31956 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
31957 if t != v_1_0 {
31958 continue
31959 }
31960 y := v_1_1
31961 v.reset(OpSub64)
31962 v.AddArg2(x, y)
31963 return true
31964 }
31965 }
31966 break
31967 }
31968
31969
31970 for {
31971 if v_0.Op != OpAdd64 {
31972 break
31973 }
31974 _ = v_0.Args[1]
31975 v_0_0 := v_0.Args[0]
31976 v_0_1 := v_0.Args[1]
31977 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
31978 x := v_0_0
31979 y := v_0_1
31980 if x != v_1 {
31981 continue
31982 }
31983 v.copyOf(y)
31984 return true
31985 }
31986 break
31987 }
31988
31989
31990 for {
31991 if v_0.Op != OpAdd64 {
31992 break
31993 }
31994 _ = v_0.Args[1]
31995 v_0_0 := v_0.Args[0]
31996 v_0_1 := v_0.Args[1]
31997 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
31998 x := v_0_0
31999 y := v_0_1
32000 if y != v_1 {
32001 continue
32002 }
32003 v.copyOf(x)
32004 return true
32005 }
32006 break
32007 }
32008
32009
32010 for {
32011 if v_0.Op != OpSub64 {
32012 break
32013 }
32014 y := v_0.Args[1]
32015 x := v_0.Args[0]
32016 if x != v_1 {
32017 break
32018 }
32019 v.reset(OpNeg64)
32020 v.AddArg(y)
32021 return true
32022 }
32023
32024
32025 for {
32026 x := v_0
32027 if v_1.Op != OpAdd64 {
32028 break
32029 }
32030 _ = v_1.Args[1]
32031 v_1_0 := v_1.Args[0]
32032 v_1_1 := v_1.Args[1]
32033 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
32034 if x != v_1_0 {
32035 continue
32036 }
32037 y := v_1_1
32038 v.reset(OpNeg64)
32039 v.AddArg(y)
32040 return true
32041 }
32042 break
32043 }
32044
32045
32046
32047 for {
32048 x := v_0
32049 if v_1.Op != OpSub64 {
32050 break
32051 }
32052 z := v_1.Args[1]
32053 i := v_1.Args[0]
32054 if i.Op != OpConst64 {
32055 break
32056 }
32057 t := i.Type
32058 if !(z.Op != OpConst64 && x.Op != OpConst64) {
32059 break
32060 }
32061 v.reset(OpSub64)
32062 v0 := b.NewValue0(v.Pos, OpAdd64, t)
32063 v0.AddArg2(x, z)
32064 v.AddArg2(v0, i)
32065 return true
32066 }
32067
32068
32069
32070 for {
32071 x := v_0
32072 if v_1.Op != OpAdd64 {
32073 break
32074 }
32075 _ = v_1.Args[1]
32076 v_1_0 := v_1.Args[0]
32077 v_1_1 := v_1.Args[1]
32078 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
32079 z := v_1_0
32080 i := v_1_1
32081 if i.Op != OpConst64 {
32082 continue
32083 }
32084 t := i.Type
32085 if !(z.Op != OpConst64 && x.Op != OpConst64) {
32086 continue
32087 }
32088 v.reset(OpSub64)
32089 v0 := b.NewValue0(v.Pos, OpSub64, t)
32090 v0.AddArg2(x, z)
32091 v.AddArg2(v0, i)
32092 return true
32093 }
32094 break
32095 }
32096
32097
32098
32099 for {
32100 if v_0.Op != OpSub64 {
32101 break
32102 }
32103 z := v_0.Args[1]
32104 i := v_0.Args[0]
32105 if i.Op != OpConst64 {
32106 break
32107 }
32108 t := i.Type
32109 x := v_1
32110 if !(z.Op != OpConst64 && x.Op != OpConst64) {
32111 break
32112 }
32113 v.reset(OpSub64)
32114 v0 := b.NewValue0(v.Pos, OpAdd64, t)
32115 v0.AddArg2(z, x)
32116 v.AddArg2(i, v0)
32117 return true
32118 }
32119
32120
32121
32122 for {
32123 if v_0.Op != OpAdd64 {
32124 break
32125 }
32126 _ = v_0.Args[1]
32127 v_0_0 := v_0.Args[0]
32128 v_0_1 := v_0.Args[1]
32129 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32130 z := v_0_0
32131 i := v_0_1
32132 if i.Op != OpConst64 {
32133 continue
32134 }
32135 t := i.Type
32136 x := v_1
32137 if !(z.Op != OpConst64 && x.Op != OpConst64) {
32138 continue
32139 }
32140 v.reset(OpAdd64)
32141 v0 := b.NewValue0(v.Pos, OpSub64, t)
32142 v0.AddArg2(z, x)
32143 v.AddArg2(i, v0)
32144 return true
32145 }
32146 break
32147 }
32148
32149
32150 for {
32151 if v_0.Op != OpConst64 {
32152 break
32153 }
32154 t := v_0.Type
32155 c := auxIntToInt64(v_0.AuxInt)
32156 if v_1.Op != OpSub64 {
32157 break
32158 }
32159 x := v_1.Args[1]
32160 v_1_0 := v_1.Args[0]
32161 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
32162 break
32163 }
32164 d := auxIntToInt64(v_1_0.AuxInt)
32165 v.reset(OpAdd64)
32166 v0 := b.NewValue0(v.Pos, OpConst64, t)
32167 v0.AuxInt = int64ToAuxInt(c - d)
32168 v.AddArg2(v0, x)
32169 return true
32170 }
32171
32172
32173 for {
32174 if v_0.Op != OpConst64 {
32175 break
32176 }
32177 t := v_0.Type
32178 c := auxIntToInt64(v_0.AuxInt)
32179 if v_1.Op != OpAdd64 {
32180 break
32181 }
32182 _ = v_1.Args[1]
32183 v_1_0 := v_1.Args[0]
32184 v_1_1 := v_1.Args[1]
32185 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
32186 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
32187 continue
32188 }
32189 d := auxIntToInt64(v_1_0.AuxInt)
32190 x := v_1_1
32191 v.reset(OpSub64)
32192 v0 := b.NewValue0(v.Pos, OpConst64, t)
32193 v0.AuxInt = int64ToAuxInt(c - d)
32194 v.AddArg2(v0, x)
32195 return true
32196 }
32197 break
32198 }
32199 return false
32200 }
32201 func rewriteValuegeneric_OpSub64F(v *Value) bool {
32202 v_1 := v.Args[1]
32203 v_0 := v.Args[0]
32204
32205
32206
32207 for {
32208 if v_0.Op != OpConst64F {
32209 break
32210 }
32211 c := auxIntToFloat64(v_0.AuxInt)
32212 if v_1.Op != OpConst64F {
32213 break
32214 }
32215 d := auxIntToFloat64(v_1.AuxInt)
32216 if !(c-d == c-d) {
32217 break
32218 }
32219 v.reset(OpConst64F)
32220 v.AuxInt = float64ToAuxInt(c - d)
32221 return true
32222 }
32223 return false
32224 }
32225 func rewriteValuegeneric_OpSub8(v *Value) bool {
32226 v_1 := v.Args[1]
32227 v_0 := v.Args[0]
32228 b := v.Block
32229
32230
32231 for {
32232 if v_0.Op != OpConst8 {
32233 break
32234 }
32235 c := auxIntToInt8(v_0.AuxInt)
32236 if v_1.Op != OpConst8 {
32237 break
32238 }
32239 d := auxIntToInt8(v_1.AuxInt)
32240 v.reset(OpConst8)
32241 v.AuxInt = int8ToAuxInt(c - d)
32242 return true
32243 }
32244
32245
32246
32247 for {
32248 x := v_0
32249 if v_1.Op != OpConst8 {
32250 break
32251 }
32252 t := v_1.Type
32253 c := auxIntToInt8(v_1.AuxInt)
32254 if !(x.Op != OpConst8) {
32255 break
32256 }
32257 v.reset(OpAdd8)
32258 v0 := b.NewValue0(v.Pos, OpConst8, t)
32259 v0.AuxInt = int8ToAuxInt(-c)
32260 v.AddArg2(v0, x)
32261 return true
32262 }
32263
32264
32265 for {
32266 t := v.Type
32267 if v_0.Op != OpMul8 {
32268 break
32269 }
32270 _ = v_0.Args[1]
32271 v_0_0 := v_0.Args[0]
32272 v_0_1 := v_0.Args[1]
32273 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32274 x := v_0_0
32275 y := v_0_1
32276 if v_1.Op != OpMul8 {
32277 continue
32278 }
32279 _ = v_1.Args[1]
32280 v_1_0 := v_1.Args[0]
32281 v_1_1 := v_1.Args[1]
32282 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
32283 if x != v_1_0 {
32284 continue
32285 }
32286 z := v_1_1
32287 v.reset(OpMul8)
32288 v0 := b.NewValue0(v.Pos, OpSub8, t)
32289 v0.AddArg2(y, z)
32290 v.AddArg2(x, v0)
32291 return true
32292 }
32293 }
32294 break
32295 }
32296
32297
32298 for {
32299 x := v_0
32300 if x != v_1 {
32301 break
32302 }
32303 v.reset(OpConst8)
32304 v.AuxInt = int8ToAuxInt(0)
32305 return true
32306 }
32307
32308
32309 for {
32310 if v_0.Op != OpNeg8 {
32311 break
32312 }
32313 x := v_0.Args[0]
32314 if v_1.Op != OpCom8 || x != v_1.Args[0] {
32315 break
32316 }
32317 v.reset(OpConst8)
32318 v.AuxInt = int8ToAuxInt(1)
32319 return true
32320 }
32321
32322
32323 for {
32324 if v_0.Op != OpCom8 {
32325 break
32326 }
32327 x := v_0.Args[0]
32328 if v_1.Op != OpNeg8 || x != v_1.Args[0] {
32329 break
32330 }
32331 v.reset(OpConst8)
32332 v.AuxInt = int8ToAuxInt(-1)
32333 return true
32334 }
32335
32336
32337 for {
32338 if v_0.Op != OpAdd8 {
32339 break
32340 }
32341 _ = v_0.Args[1]
32342 v_0_0 := v_0.Args[0]
32343 v_0_1 := v_0.Args[1]
32344 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32345 t := v_0_0
32346 x := v_0_1
32347 if v_1.Op != OpAdd8 {
32348 continue
32349 }
32350 _ = v_1.Args[1]
32351 v_1_0 := v_1.Args[0]
32352 v_1_1 := v_1.Args[1]
32353 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
32354 if t != v_1_0 {
32355 continue
32356 }
32357 y := v_1_1
32358 v.reset(OpSub8)
32359 v.AddArg2(x, y)
32360 return true
32361 }
32362 }
32363 break
32364 }
32365
32366
32367 for {
32368 if v_0.Op != OpAdd8 {
32369 break
32370 }
32371 _ = v_0.Args[1]
32372 v_0_0 := v_0.Args[0]
32373 v_0_1 := v_0.Args[1]
32374 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32375 x := v_0_0
32376 y := v_0_1
32377 if x != v_1 {
32378 continue
32379 }
32380 v.copyOf(y)
32381 return true
32382 }
32383 break
32384 }
32385
32386
32387 for {
32388 if v_0.Op != OpAdd8 {
32389 break
32390 }
32391 _ = v_0.Args[1]
32392 v_0_0 := v_0.Args[0]
32393 v_0_1 := v_0.Args[1]
32394 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32395 x := v_0_0
32396 y := v_0_1
32397 if y != v_1 {
32398 continue
32399 }
32400 v.copyOf(x)
32401 return true
32402 }
32403 break
32404 }
32405
32406
32407 for {
32408 if v_0.Op != OpSub8 {
32409 break
32410 }
32411 y := v_0.Args[1]
32412 x := v_0.Args[0]
32413 if x != v_1 {
32414 break
32415 }
32416 v.reset(OpNeg8)
32417 v.AddArg(y)
32418 return true
32419 }
32420
32421
32422 for {
32423 x := v_0
32424 if v_1.Op != OpAdd8 {
32425 break
32426 }
32427 _ = v_1.Args[1]
32428 v_1_0 := v_1.Args[0]
32429 v_1_1 := v_1.Args[1]
32430 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
32431 if x != v_1_0 {
32432 continue
32433 }
32434 y := v_1_1
32435 v.reset(OpNeg8)
32436 v.AddArg(y)
32437 return true
32438 }
32439 break
32440 }
32441
32442
32443
32444 for {
32445 x := v_0
32446 if v_1.Op != OpSub8 {
32447 break
32448 }
32449 z := v_1.Args[1]
32450 i := v_1.Args[0]
32451 if i.Op != OpConst8 {
32452 break
32453 }
32454 t := i.Type
32455 if !(z.Op != OpConst8 && x.Op != OpConst8) {
32456 break
32457 }
32458 v.reset(OpSub8)
32459 v0 := b.NewValue0(v.Pos, OpAdd8, t)
32460 v0.AddArg2(x, z)
32461 v.AddArg2(v0, i)
32462 return true
32463 }
32464
32465
32466
32467 for {
32468 x := v_0
32469 if v_1.Op != OpAdd8 {
32470 break
32471 }
32472 _ = v_1.Args[1]
32473 v_1_0 := v_1.Args[0]
32474 v_1_1 := v_1.Args[1]
32475 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
32476 z := v_1_0
32477 i := v_1_1
32478 if i.Op != OpConst8 {
32479 continue
32480 }
32481 t := i.Type
32482 if !(z.Op != OpConst8 && x.Op != OpConst8) {
32483 continue
32484 }
32485 v.reset(OpSub8)
32486 v0 := b.NewValue0(v.Pos, OpSub8, t)
32487 v0.AddArg2(x, z)
32488 v.AddArg2(v0, i)
32489 return true
32490 }
32491 break
32492 }
32493
32494
32495
32496 for {
32497 if v_0.Op != OpSub8 {
32498 break
32499 }
32500 z := v_0.Args[1]
32501 i := v_0.Args[0]
32502 if i.Op != OpConst8 {
32503 break
32504 }
32505 t := i.Type
32506 x := v_1
32507 if !(z.Op != OpConst8 && x.Op != OpConst8) {
32508 break
32509 }
32510 v.reset(OpSub8)
32511 v0 := b.NewValue0(v.Pos, OpAdd8, t)
32512 v0.AddArg2(z, x)
32513 v.AddArg2(i, v0)
32514 return true
32515 }
32516
32517
32518
32519 for {
32520 if v_0.Op != OpAdd8 {
32521 break
32522 }
32523 _ = v_0.Args[1]
32524 v_0_0 := v_0.Args[0]
32525 v_0_1 := v_0.Args[1]
32526 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32527 z := v_0_0
32528 i := v_0_1
32529 if i.Op != OpConst8 {
32530 continue
32531 }
32532 t := i.Type
32533 x := v_1
32534 if !(z.Op != OpConst8 && x.Op != OpConst8) {
32535 continue
32536 }
32537 v.reset(OpAdd8)
32538 v0 := b.NewValue0(v.Pos, OpSub8, t)
32539 v0.AddArg2(z, x)
32540 v.AddArg2(i, v0)
32541 return true
32542 }
32543 break
32544 }
32545
32546
32547 for {
32548 if v_0.Op != OpConst8 {
32549 break
32550 }
32551 t := v_0.Type
32552 c := auxIntToInt8(v_0.AuxInt)
32553 if v_1.Op != OpSub8 {
32554 break
32555 }
32556 x := v_1.Args[1]
32557 v_1_0 := v_1.Args[0]
32558 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
32559 break
32560 }
32561 d := auxIntToInt8(v_1_0.AuxInt)
32562 v.reset(OpAdd8)
32563 v0 := b.NewValue0(v.Pos, OpConst8, t)
32564 v0.AuxInt = int8ToAuxInt(c - d)
32565 v.AddArg2(v0, x)
32566 return true
32567 }
32568
32569
32570 for {
32571 if v_0.Op != OpConst8 {
32572 break
32573 }
32574 t := v_0.Type
32575 c := auxIntToInt8(v_0.AuxInt)
32576 if v_1.Op != OpAdd8 {
32577 break
32578 }
32579 _ = v_1.Args[1]
32580 v_1_0 := v_1.Args[0]
32581 v_1_1 := v_1.Args[1]
32582 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
32583 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
32584 continue
32585 }
32586 d := auxIntToInt8(v_1_0.AuxInt)
32587 x := v_1_1
32588 v.reset(OpSub8)
32589 v0 := b.NewValue0(v.Pos, OpConst8, t)
32590 v0.AuxInt = int8ToAuxInt(c - d)
32591 v.AddArg2(v0, x)
32592 return true
32593 }
32594 break
32595 }
32596 return false
32597 }
32598 func rewriteValuegeneric_OpTrunc(v *Value) bool {
32599 v_0 := v.Args[0]
32600
32601
32602 for {
32603 if v_0.Op != OpConst64F {
32604 break
32605 }
32606 c := auxIntToFloat64(v_0.AuxInt)
32607 v.reset(OpConst64F)
32608 v.AuxInt = float64ToAuxInt(math.Trunc(c))
32609 return true
32610 }
32611 return false
32612 }
32613 func rewriteValuegeneric_OpTrunc16to8(v *Value) bool {
32614 v_0 := v.Args[0]
32615
32616
32617 for {
32618 if v_0.Op != OpConst16 {
32619 break
32620 }
32621 c := auxIntToInt16(v_0.AuxInt)
32622 v.reset(OpConst8)
32623 v.AuxInt = int8ToAuxInt(int8(c))
32624 return true
32625 }
32626
32627
32628 for {
32629 if v_0.Op != OpZeroExt8to16 {
32630 break
32631 }
32632 x := v_0.Args[0]
32633 v.copyOf(x)
32634 return true
32635 }
32636
32637
32638 for {
32639 if v_0.Op != OpSignExt8to16 {
32640 break
32641 }
32642 x := v_0.Args[0]
32643 v.copyOf(x)
32644 return true
32645 }
32646
32647
32648
32649 for {
32650 if v_0.Op != OpAnd16 {
32651 break
32652 }
32653 _ = v_0.Args[1]
32654 v_0_0 := v_0.Args[0]
32655 v_0_1 := v_0.Args[1]
32656 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32657 if v_0_0.Op != OpConst16 {
32658 continue
32659 }
32660 y := auxIntToInt16(v_0_0.AuxInt)
32661 x := v_0_1
32662 if !(y&0xFF == 0xFF) {
32663 continue
32664 }
32665 v.reset(OpTrunc16to8)
32666 v.AddArg(x)
32667 return true
32668 }
32669 break
32670 }
32671 return false
32672 }
32673 func rewriteValuegeneric_OpTrunc32to16(v *Value) bool {
32674 v_0 := v.Args[0]
32675
32676
32677 for {
32678 if v_0.Op != OpConst32 {
32679 break
32680 }
32681 c := auxIntToInt32(v_0.AuxInt)
32682 v.reset(OpConst16)
32683 v.AuxInt = int16ToAuxInt(int16(c))
32684 return true
32685 }
32686
32687
32688 for {
32689 if v_0.Op != OpZeroExt8to32 {
32690 break
32691 }
32692 x := v_0.Args[0]
32693 v.reset(OpZeroExt8to16)
32694 v.AddArg(x)
32695 return true
32696 }
32697
32698
32699 for {
32700 if v_0.Op != OpZeroExt16to32 {
32701 break
32702 }
32703 x := v_0.Args[0]
32704 v.copyOf(x)
32705 return true
32706 }
32707
32708
32709 for {
32710 if v_0.Op != OpSignExt8to32 {
32711 break
32712 }
32713 x := v_0.Args[0]
32714 v.reset(OpSignExt8to16)
32715 v.AddArg(x)
32716 return true
32717 }
32718
32719
32720 for {
32721 if v_0.Op != OpSignExt16to32 {
32722 break
32723 }
32724 x := v_0.Args[0]
32725 v.copyOf(x)
32726 return true
32727 }
32728
32729
32730
32731 for {
32732 if v_0.Op != OpAnd32 {
32733 break
32734 }
32735 _ = v_0.Args[1]
32736 v_0_0 := v_0.Args[0]
32737 v_0_1 := v_0.Args[1]
32738 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32739 if v_0_0.Op != OpConst32 {
32740 continue
32741 }
32742 y := auxIntToInt32(v_0_0.AuxInt)
32743 x := v_0_1
32744 if !(y&0xFFFF == 0xFFFF) {
32745 continue
32746 }
32747 v.reset(OpTrunc32to16)
32748 v.AddArg(x)
32749 return true
32750 }
32751 break
32752 }
32753 return false
32754 }
32755 func rewriteValuegeneric_OpTrunc32to8(v *Value) bool {
32756 v_0 := v.Args[0]
32757
32758
32759 for {
32760 if v_0.Op != OpConst32 {
32761 break
32762 }
32763 c := auxIntToInt32(v_0.AuxInt)
32764 v.reset(OpConst8)
32765 v.AuxInt = int8ToAuxInt(int8(c))
32766 return true
32767 }
32768
32769
32770 for {
32771 if v_0.Op != OpZeroExt8to32 {
32772 break
32773 }
32774 x := v_0.Args[0]
32775 v.copyOf(x)
32776 return true
32777 }
32778
32779
32780 for {
32781 if v_0.Op != OpSignExt8to32 {
32782 break
32783 }
32784 x := v_0.Args[0]
32785 v.copyOf(x)
32786 return true
32787 }
32788
32789
32790
32791 for {
32792 if v_0.Op != OpAnd32 {
32793 break
32794 }
32795 _ = v_0.Args[1]
32796 v_0_0 := v_0.Args[0]
32797 v_0_1 := v_0.Args[1]
32798 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32799 if v_0_0.Op != OpConst32 {
32800 continue
32801 }
32802 y := auxIntToInt32(v_0_0.AuxInt)
32803 x := v_0_1
32804 if !(y&0xFF == 0xFF) {
32805 continue
32806 }
32807 v.reset(OpTrunc32to8)
32808 v.AddArg(x)
32809 return true
32810 }
32811 break
32812 }
32813 return false
32814 }
32815 func rewriteValuegeneric_OpTrunc64to16(v *Value) bool {
32816 v_0 := v.Args[0]
32817
32818
32819 for {
32820 if v_0.Op != OpConst64 {
32821 break
32822 }
32823 c := auxIntToInt64(v_0.AuxInt)
32824 v.reset(OpConst16)
32825 v.AuxInt = int16ToAuxInt(int16(c))
32826 return true
32827 }
32828
32829
32830 for {
32831 if v_0.Op != OpZeroExt8to64 {
32832 break
32833 }
32834 x := v_0.Args[0]
32835 v.reset(OpZeroExt8to16)
32836 v.AddArg(x)
32837 return true
32838 }
32839
32840
32841 for {
32842 if v_0.Op != OpZeroExt16to64 {
32843 break
32844 }
32845 x := v_0.Args[0]
32846 v.copyOf(x)
32847 return true
32848 }
32849
32850
32851 for {
32852 if v_0.Op != OpSignExt8to64 {
32853 break
32854 }
32855 x := v_0.Args[0]
32856 v.reset(OpSignExt8to16)
32857 v.AddArg(x)
32858 return true
32859 }
32860
32861
32862 for {
32863 if v_0.Op != OpSignExt16to64 {
32864 break
32865 }
32866 x := v_0.Args[0]
32867 v.copyOf(x)
32868 return true
32869 }
32870
32871
32872
32873 for {
32874 if v_0.Op != OpAnd64 {
32875 break
32876 }
32877 _ = v_0.Args[1]
32878 v_0_0 := v_0.Args[0]
32879 v_0_1 := v_0.Args[1]
32880 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32881 if v_0_0.Op != OpConst64 {
32882 continue
32883 }
32884 y := auxIntToInt64(v_0_0.AuxInt)
32885 x := v_0_1
32886 if !(y&0xFFFF == 0xFFFF) {
32887 continue
32888 }
32889 v.reset(OpTrunc64to16)
32890 v.AddArg(x)
32891 return true
32892 }
32893 break
32894 }
32895 return false
32896 }
32897 func rewriteValuegeneric_OpTrunc64to32(v *Value) bool {
32898 v_0 := v.Args[0]
32899
32900
32901 for {
32902 if v_0.Op != OpConst64 {
32903 break
32904 }
32905 c := auxIntToInt64(v_0.AuxInt)
32906 v.reset(OpConst32)
32907 v.AuxInt = int32ToAuxInt(int32(c))
32908 return true
32909 }
32910
32911
32912 for {
32913 if v_0.Op != OpZeroExt8to64 {
32914 break
32915 }
32916 x := v_0.Args[0]
32917 v.reset(OpZeroExt8to32)
32918 v.AddArg(x)
32919 return true
32920 }
32921
32922
32923 for {
32924 if v_0.Op != OpZeroExt16to64 {
32925 break
32926 }
32927 x := v_0.Args[0]
32928 v.reset(OpZeroExt16to32)
32929 v.AddArg(x)
32930 return true
32931 }
32932
32933
32934 for {
32935 if v_0.Op != OpZeroExt32to64 {
32936 break
32937 }
32938 x := v_0.Args[0]
32939 v.copyOf(x)
32940 return true
32941 }
32942
32943
32944 for {
32945 if v_0.Op != OpSignExt8to64 {
32946 break
32947 }
32948 x := v_0.Args[0]
32949 v.reset(OpSignExt8to32)
32950 v.AddArg(x)
32951 return true
32952 }
32953
32954
32955 for {
32956 if v_0.Op != OpSignExt16to64 {
32957 break
32958 }
32959 x := v_0.Args[0]
32960 v.reset(OpSignExt16to32)
32961 v.AddArg(x)
32962 return true
32963 }
32964
32965
32966 for {
32967 if v_0.Op != OpSignExt32to64 {
32968 break
32969 }
32970 x := v_0.Args[0]
32971 v.copyOf(x)
32972 return true
32973 }
32974
32975
32976
32977 for {
32978 if v_0.Op != OpAnd64 {
32979 break
32980 }
32981 _ = v_0.Args[1]
32982 v_0_0 := v_0.Args[0]
32983 v_0_1 := v_0.Args[1]
32984 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32985 if v_0_0.Op != OpConst64 {
32986 continue
32987 }
32988 y := auxIntToInt64(v_0_0.AuxInt)
32989 x := v_0_1
32990 if !(y&0xFFFFFFFF == 0xFFFFFFFF) {
32991 continue
32992 }
32993 v.reset(OpTrunc64to32)
32994 v.AddArg(x)
32995 return true
32996 }
32997 break
32998 }
32999 return false
33000 }
33001 func rewriteValuegeneric_OpTrunc64to8(v *Value) bool {
33002 v_0 := v.Args[0]
33003
33004
33005 for {
33006 if v_0.Op != OpConst64 {
33007 break
33008 }
33009 c := auxIntToInt64(v_0.AuxInt)
33010 v.reset(OpConst8)
33011 v.AuxInt = int8ToAuxInt(int8(c))
33012 return true
33013 }
33014
33015
33016 for {
33017 if v_0.Op != OpZeroExt8to64 {
33018 break
33019 }
33020 x := v_0.Args[0]
33021 v.copyOf(x)
33022 return true
33023 }
33024
33025
33026 for {
33027 if v_0.Op != OpSignExt8to64 {
33028 break
33029 }
33030 x := v_0.Args[0]
33031 v.copyOf(x)
33032 return true
33033 }
33034
33035
33036
33037 for {
33038 if v_0.Op != OpAnd64 {
33039 break
33040 }
33041 _ = v_0.Args[1]
33042 v_0_0 := v_0.Args[0]
33043 v_0_1 := v_0.Args[1]
33044 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33045 if v_0_0.Op != OpConst64 {
33046 continue
33047 }
33048 y := auxIntToInt64(v_0_0.AuxInt)
33049 x := v_0_1
33050 if !(y&0xFF == 0xFF) {
33051 continue
33052 }
33053 v.reset(OpTrunc64to8)
33054 v.AddArg(x)
33055 return true
33056 }
33057 break
33058 }
33059 return false
33060 }
33061 func rewriteValuegeneric_OpXor16(v *Value) bool {
33062 v_1 := v.Args[1]
33063 v_0 := v.Args[0]
33064 b := v.Block
33065 config := b.Func.Config
33066
33067
33068 for {
33069 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33070 if v_0.Op != OpConst16 {
33071 continue
33072 }
33073 c := auxIntToInt16(v_0.AuxInt)
33074 if v_1.Op != OpConst16 {
33075 continue
33076 }
33077 d := auxIntToInt16(v_1.AuxInt)
33078 v.reset(OpConst16)
33079 v.AuxInt = int16ToAuxInt(c ^ d)
33080 return true
33081 }
33082 break
33083 }
33084
33085
33086 for {
33087 x := v_0
33088 if x != v_1 {
33089 break
33090 }
33091 v.reset(OpConst16)
33092 v.AuxInt = int16ToAuxInt(0)
33093 return true
33094 }
33095
33096
33097 for {
33098 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33099 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
33100 continue
33101 }
33102 x := v_1
33103 v.copyOf(x)
33104 return true
33105 }
33106 break
33107 }
33108
33109
33110 for {
33111 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33112 if v_0.Op != OpCom16 {
33113 continue
33114 }
33115 x := v_0.Args[0]
33116 if x != v_1 {
33117 continue
33118 }
33119 v.reset(OpConst16)
33120 v.AuxInt = int16ToAuxInt(-1)
33121 return true
33122 }
33123 break
33124 }
33125
33126
33127 for {
33128 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33129 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
33130 continue
33131 }
33132 x := v_1
33133 v.reset(OpCom16)
33134 v.AddArg(x)
33135 return true
33136 }
33137 break
33138 }
33139
33140
33141 for {
33142 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33143 x := v_0
33144 if v_1.Op != OpXor16 {
33145 continue
33146 }
33147 _ = v_1.Args[1]
33148 v_1_0 := v_1.Args[0]
33149 v_1_1 := v_1.Args[1]
33150 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33151 if x != v_1_0 {
33152 continue
33153 }
33154 y := v_1_1
33155 v.copyOf(y)
33156 return true
33157 }
33158 }
33159 break
33160 }
33161
33162
33163
33164 for {
33165 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33166 if v_0.Op != OpXor16 {
33167 continue
33168 }
33169 _ = v_0.Args[1]
33170 v_0_0 := v_0.Args[0]
33171 v_0_1 := v_0.Args[1]
33172 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
33173 i := v_0_0
33174 if i.Op != OpConst16 {
33175 continue
33176 }
33177 t := i.Type
33178 z := v_0_1
33179 x := v_1
33180 if !(z.Op != OpConst16 && x.Op != OpConst16) {
33181 continue
33182 }
33183 v.reset(OpXor16)
33184 v0 := b.NewValue0(v.Pos, OpXor16, t)
33185 v0.AddArg2(z, x)
33186 v.AddArg2(i, v0)
33187 return true
33188 }
33189 }
33190 break
33191 }
33192
33193
33194 for {
33195 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33196 if v_0.Op != OpConst16 {
33197 continue
33198 }
33199 t := v_0.Type
33200 c := auxIntToInt16(v_0.AuxInt)
33201 if v_1.Op != OpXor16 {
33202 continue
33203 }
33204 _ = v_1.Args[1]
33205 v_1_0 := v_1.Args[0]
33206 v_1_1 := v_1.Args[1]
33207 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33208 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
33209 continue
33210 }
33211 d := auxIntToInt16(v_1_0.AuxInt)
33212 x := v_1_1
33213 v.reset(OpXor16)
33214 v0 := b.NewValue0(v.Pos, OpConst16, t)
33215 v0.AuxInt = int16ToAuxInt(c ^ d)
33216 v.AddArg2(v0, x)
33217 return true
33218 }
33219 }
33220 break
33221 }
33222
33223
33224
33225 for {
33226 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33227 if v_0.Op != OpLsh16x64 {
33228 continue
33229 }
33230 _ = v_0.Args[1]
33231 x := v_0.Args[0]
33232 z := v_0.Args[1]
33233 if z.Op != OpConst64 {
33234 continue
33235 }
33236 c := auxIntToInt64(z.AuxInt)
33237 if v_1.Op != OpRsh16Ux64 {
33238 continue
33239 }
33240 _ = v_1.Args[1]
33241 if x != v_1.Args[0] {
33242 continue
33243 }
33244 v_1_1 := v_1.Args[1]
33245 if v_1_1.Op != OpConst64 {
33246 continue
33247 }
33248 d := auxIntToInt64(v_1_1.AuxInt)
33249 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
33250 continue
33251 }
33252 v.reset(OpRotateLeft16)
33253 v.AddArg2(x, z)
33254 return true
33255 }
33256 break
33257 }
33258
33259
33260
33261 for {
33262 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33263 left := v_0
33264 if left.Op != OpLsh16x64 {
33265 continue
33266 }
33267 y := left.Args[1]
33268 x := left.Args[0]
33269 right := v_1
33270 if right.Op != OpRsh16Ux64 {
33271 continue
33272 }
33273 _ = right.Args[1]
33274 if x != right.Args[0] {
33275 continue
33276 }
33277 right_1 := right.Args[1]
33278 if right_1.Op != OpSub64 {
33279 continue
33280 }
33281 _ = right_1.Args[1]
33282 right_1_0 := right_1.Args[0]
33283 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
33284 continue
33285 }
33286 v.reset(OpRotateLeft16)
33287 v.AddArg2(x, y)
33288 return true
33289 }
33290 break
33291 }
33292
33293
33294
33295 for {
33296 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33297 left := v_0
33298 if left.Op != OpLsh16x32 {
33299 continue
33300 }
33301 y := left.Args[1]
33302 x := left.Args[0]
33303 right := v_1
33304 if right.Op != OpRsh16Ux32 {
33305 continue
33306 }
33307 _ = right.Args[1]
33308 if x != right.Args[0] {
33309 continue
33310 }
33311 right_1 := right.Args[1]
33312 if right_1.Op != OpSub32 {
33313 continue
33314 }
33315 _ = right_1.Args[1]
33316 right_1_0 := right_1.Args[0]
33317 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
33318 continue
33319 }
33320 v.reset(OpRotateLeft16)
33321 v.AddArg2(x, y)
33322 return true
33323 }
33324 break
33325 }
33326
33327
33328
33329 for {
33330 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33331 left := v_0
33332 if left.Op != OpLsh16x16 {
33333 continue
33334 }
33335 y := left.Args[1]
33336 x := left.Args[0]
33337 right := v_1
33338 if right.Op != OpRsh16Ux16 {
33339 continue
33340 }
33341 _ = right.Args[1]
33342 if x != right.Args[0] {
33343 continue
33344 }
33345 right_1 := right.Args[1]
33346 if right_1.Op != OpSub16 {
33347 continue
33348 }
33349 _ = right_1.Args[1]
33350 right_1_0 := right_1.Args[0]
33351 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
33352 continue
33353 }
33354 v.reset(OpRotateLeft16)
33355 v.AddArg2(x, y)
33356 return true
33357 }
33358 break
33359 }
33360
33361
33362
33363 for {
33364 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33365 left := v_0
33366 if left.Op != OpLsh16x8 {
33367 continue
33368 }
33369 y := left.Args[1]
33370 x := left.Args[0]
33371 right := v_1
33372 if right.Op != OpRsh16Ux8 {
33373 continue
33374 }
33375 _ = right.Args[1]
33376 if x != right.Args[0] {
33377 continue
33378 }
33379 right_1 := right.Args[1]
33380 if right_1.Op != OpSub8 {
33381 continue
33382 }
33383 _ = right_1.Args[1]
33384 right_1_0 := right_1.Args[0]
33385 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
33386 continue
33387 }
33388 v.reset(OpRotateLeft16)
33389 v.AddArg2(x, y)
33390 return true
33391 }
33392 break
33393 }
33394
33395
33396
33397 for {
33398 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33399 right := v_0
33400 if right.Op != OpRsh16Ux64 {
33401 continue
33402 }
33403 y := right.Args[1]
33404 x := right.Args[0]
33405 left := v_1
33406 if left.Op != OpLsh16x64 {
33407 continue
33408 }
33409 _ = left.Args[1]
33410 if x != left.Args[0] {
33411 continue
33412 }
33413 z := left.Args[1]
33414 if z.Op != OpSub64 {
33415 continue
33416 }
33417 _ = z.Args[1]
33418 z_0 := z.Args[0]
33419 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
33420 continue
33421 }
33422 v.reset(OpRotateLeft16)
33423 v.AddArg2(x, z)
33424 return true
33425 }
33426 break
33427 }
33428
33429
33430
33431 for {
33432 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33433 right := v_0
33434 if right.Op != OpRsh16Ux32 {
33435 continue
33436 }
33437 y := right.Args[1]
33438 x := right.Args[0]
33439 left := v_1
33440 if left.Op != OpLsh16x32 {
33441 continue
33442 }
33443 _ = left.Args[1]
33444 if x != left.Args[0] {
33445 continue
33446 }
33447 z := left.Args[1]
33448 if z.Op != OpSub32 {
33449 continue
33450 }
33451 _ = z.Args[1]
33452 z_0 := z.Args[0]
33453 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
33454 continue
33455 }
33456 v.reset(OpRotateLeft16)
33457 v.AddArg2(x, z)
33458 return true
33459 }
33460 break
33461 }
33462
33463
33464
33465 for {
33466 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33467 right := v_0
33468 if right.Op != OpRsh16Ux16 {
33469 continue
33470 }
33471 y := right.Args[1]
33472 x := right.Args[0]
33473 left := v_1
33474 if left.Op != OpLsh16x16 {
33475 continue
33476 }
33477 _ = left.Args[1]
33478 if x != left.Args[0] {
33479 continue
33480 }
33481 z := left.Args[1]
33482 if z.Op != OpSub16 {
33483 continue
33484 }
33485 _ = z.Args[1]
33486 z_0 := z.Args[0]
33487 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
33488 continue
33489 }
33490 v.reset(OpRotateLeft16)
33491 v.AddArg2(x, z)
33492 return true
33493 }
33494 break
33495 }
33496
33497
33498
33499 for {
33500 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33501 right := v_0
33502 if right.Op != OpRsh16Ux8 {
33503 continue
33504 }
33505 y := right.Args[1]
33506 x := right.Args[0]
33507 left := v_1
33508 if left.Op != OpLsh16x8 {
33509 continue
33510 }
33511 _ = left.Args[1]
33512 if x != left.Args[0] {
33513 continue
33514 }
33515 z := left.Args[1]
33516 if z.Op != OpSub8 {
33517 continue
33518 }
33519 _ = z.Args[1]
33520 z_0 := z.Args[0]
33521 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
33522 continue
33523 }
33524 v.reset(OpRotateLeft16)
33525 v.AddArg2(x, z)
33526 return true
33527 }
33528 break
33529 }
33530 return false
33531 }
33532 func rewriteValuegeneric_OpXor32(v *Value) bool {
33533 v_1 := v.Args[1]
33534 v_0 := v.Args[0]
33535 b := v.Block
33536 config := b.Func.Config
33537
33538
33539 for {
33540 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33541 if v_0.Op != OpConst32 {
33542 continue
33543 }
33544 c := auxIntToInt32(v_0.AuxInt)
33545 if v_1.Op != OpConst32 {
33546 continue
33547 }
33548 d := auxIntToInt32(v_1.AuxInt)
33549 v.reset(OpConst32)
33550 v.AuxInt = int32ToAuxInt(c ^ d)
33551 return true
33552 }
33553 break
33554 }
33555
33556
33557 for {
33558 x := v_0
33559 if x != v_1 {
33560 break
33561 }
33562 v.reset(OpConst32)
33563 v.AuxInt = int32ToAuxInt(0)
33564 return true
33565 }
33566
33567
33568 for {
33569 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33570 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
33571 continue
33572 }
33573 x := v_1
33574 v.copyOf(x)
33575 return true
33576 }
33577 break
33578 }
33579
33580
33581 for {
33582 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33583 if v_0.Op != OpCom32 {
33584 continue
33585 }
33586 x := v_0.Args[0]
33587 if x != v_1 {
33588 continue
33589 }
33590 v.reset(OpConst32)
33591 v.AuxInt = int32ToAuxInt(-1)
33592 return true
33593 }
33594 break
33595 }
33596
33597
33598 for {
33599 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33600 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
33601 continue
33602 }
33603 x := v_1
33604 v.reset(OpCom32)
33605 v.AddArg(x)
33606 return true
33607 }
33608 break
33609 }
33610
33611
33612 for {
33613 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33614 x := v_0
33615 if v_1.Op != OpXor32 {
33616 continue
33617 }
33618 _ = v_1.Args[1]
33619 v_1_0 := v_1.Args[0]
33620 v_1_1 := v_1.Args[1]
33621 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33622 if x != v_1_0 {
33623 continue
33624 }
33625 y := v_1_1
33626 v.copyOf(y)
33627 return true
33628 }
33629 }
33630 break
33631 }
33632
33633
33634
33635 for {
33636 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33637 if v_0.Op != OpXor32 {
33638 continue
33639 }
33640 _ = v_0.Args[1]
33641 v_0_0 := v_0.Args[0]
33642 v_0_1 := v_0.Args[1]
33643 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
33644 i := v_0_0
33645 if i.Op != OpConst32 {
33646 continue
33647 }
33648 t := i.Type
33649 z := v_0_1
33650 x := v_1
33651 if !(z.Op != OpConst32 && x.Op != OpConst32) {
33652 continue
33653 }
33654 v.reset(OpXor32)
33655 v0 := b.NewValue0(v.Pos, OpXor32, t)
33656 v0.AddArg2(z, x)
33657 v.AddArg2(i, v0)
33658 return true
33659 }
33660 }
33661 break
33662 }
33663
33664
33665 for {
33666 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33667 if v_0.Op != OpConst32 {
33668 continue
33669 }
33670 t := v_0.Type
33671 c := auxIntToInt32(v_0.AuxInt)
33672 if v_1.Op != OpXor32 {
33673 continue
33674 }
33675 _ = v_1.Args[1]
33676 v_1_0 := v_1.Args[0]
33677 v_1_1 := v_1.Args[1]
33678 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33679 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
33680 continue
33681 }
33682 d := auxIntToInt32(v_1_0.AuxInt)
33683 x := v_1_1
33684 v.reset(OpXor32)
33685 v0 := b.NewValue0(v.Pos, OpConst32, t)
33686 v0.AuxInt = int32ToAuxInt(c ^ d)
33687 v.AddArg2(v0, x)
33688 return true
33689 }
33690 }
33691 break
33692 }
33693
33694
33695
33696 for {
33697 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33698 if v_0.Op != OpLsh32x64 {
33699 continue
33700 }
33701 _ = v_0.Args[1]
33702 x := v_0.Args[0]
33703 z := v_0.Args[1]
33704 if z.Op != OpConst64 {
33705 continue
33706 }
33707 c := auxIntToInt64(z.AuxInt)
33708 if v_1.Op != OpRsh32Ux64 {
33709 continue
33710 }
33711 _ = v_1.Args[1]
33712 if x != v_1.Args[0] {
33713 continue
33714 }
33715 v_1_1 := v_1.Args[1]
33716 if v_1_1.Op != OpConst64 {
33717 continue
33718 }
33719 d := auxIntToInt64(v_1_1.AuxInt)
33720 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
33721 continue
33722 }
33723 v.reset(OpRotateLeft32)
33724 v.AddArg2(x, z)
33725 return true
33726 }
33727 break
33728 }
33729
33730
33731
33732 for {
33733 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33734 left := v_0
33735 if left.Op != OpLsh32x64 {
33736 continue
33737 }
33738 y := left.Args[1]
33739 x := left.Args[0]
33740 right := v_1
33741 if right.Op != OpRsh32Ux64 {
33742 continue
33743 }
33744 _ = right.Args[1]
33745 if x != right.Args[0] {
33746 continue
33747 }
33748 right_1 := right.Args[1]
33749 if right_1.Op != OpSub64 {
33750 continue
33751 }
33752 _ = right_1.Args[1]
33753 right_1_0 := right_1.Args[0]
33754 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
33755 continue
33756 }
33757 v.reset(OpRotateLeft32)
33758 v.AddArg2(x, y)
33759 return true
33760 }
33761 break
33762 }
33763
33764
33765
33766 for {
33767 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33768 left := v_0
33769 if left.Op != OpLsh32x32 {
33770 continue
33771 }
33772 y := left.Args[1]
33773 x := left.Args[0]
33774 right := v_1
33775 if right.Op != OpRsh32Ux32 {
33776 continue
33777 }
33778 _ = right.Args[1]
33779 if x != right.Args[0] {
33780 continue
33781 }
33782 right_1 := right.Args[1]
33783 if right_1.Op != OpSub32 {
33784 continue
33785 }
33786 _ = right_1.Args[1]
33787 right_1_0 := right_1.Args[0]
33788 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
33789 continue
33790 }
33791 v.reset(OpRotateLeft32)
33792 v.AddArg2(x, y)
33793 return true
33794 }
33795 break
33796 }
33797
33798
33799
33800 for {
33801 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33802 left := v_0
33803 if left.Op != OpLsh32x16 {
33804 continue
33805 }
33806 y := left.Args[1]
33807 x := left.Args[0]
33808 right := v_1
33809 if right.Op != OpRsh32Ux16 {
33810 continue
33811 }
33812 _ = right.Args[1]
33813 if x != right.Args[0] {
33814 continue
33815 }
33816 right_1 := right.Args[1]
33817 if right_1.Op != OpSub16 {
33818 continue
33819 }
33820 _ = right_1.Args[1]
33821 right_1_0 := right_1.Args[0]
33822 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
33823 continue
33824 }
33825 v.reset(OpRotateLeft32)
33826 v.AddArg2(x, y)
33827 return true
33828 }
33829 break
33830 }
33831
33832
33833
33834 for {
33835 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33836 left := v_0
33837 if left.Op != OpLsh32x8 {
33838 continue
33839 }
33840 y := left.Args[1]
33841 x := left.Args[0]
33842 right := v_1
33843 if right.Op != OpRsh32Ux8 {
33844 continue
33845 }
33846 _ = right.Args[1]
33847 if x != right.Args[0] {
33848 continue
33849 }
33850 right_1 := right.Args[1]
33851 if right_1.Op != OpSub8 {
33852 continue
33853 }
33854 _ = right_1.Args[1]
33855 right_1_0 := right_1.Args[0]
33856 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
33857 continue
33858 }
33859 v.reset(OpRotateLeft32)
33860 v.AddArg2(x, y)
33861 return true
33862 }
33863 break
33864 }
33865
33866
33867
33868 for {
33869 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33870 right := v_0
33871 if right.Op != OpRsh32Ux64 {
33872 continue
33873 }
33874 y := right.Args[1]
33875 x := right.Args[0]
33876 left := v_1
33877 if left.Op != OpLsh32x64 {
33878 continue
33879 }
33880 _ = left.Args[1]
33881 if x != left.Args[0] {
33882 continue
33883 }
33884 z := left.Args[1]
33885 if z.Op != OpSub64 {
33886 continue
33887 }
33888 _ = z.Args[1]
33889 z_0 := z.Args[0]
33890 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
33891 continue
33892 }
33893 v.reset(OpRotateLeft32)
33894 v.AddArg2(x, z)
33895 return true
33896 }
33897 break
33898 }
33899
33900
33901
33902 for {
33903 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33904 right := v_0
33905 if right.Op != OpRsh32Ux32 {
33906 continue
33907 }
33908 y := right.Args[1]
33909 x := right.Args[0]
33910 left := v_1
33911 if left.Op != OpLsh32x32 {
33912 continue
33913 }
33914 _ = left.Args[1]
33915 if x != left.Args[0] {
33916 continue
33917 }
33918 z := left.Args[1]
33919 if z.Op != OpSub32 {
33920 continue
33921 }
33922 _ = z.Args[1]
33923 z_0 := z.Args[0]
33924 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
33925 continue
33926 }
33927 v.reset(OpRotateLeft32)
33928 v.AddArg2(x, z)
33929 return true
33930 }
33931 break
33932 }
33933
33934
33935
33936 for {
33937 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33938 right := v_0
33939 if right.Op != OpRsh32Ux16 {
33940 continue
33941 }
33942 y := right.Args[1]
33943 x := right.Args[0]
33944 left := v_1
33945 if left.Op != OpLsh32x16 {
33946 continue
33947 }
33948 _ = left.Args[1]
33949 if x != left.Args[0] {
33950 continue
33951 }
33952 z := left.Args[1]
33953 if z.Op != OpSub16 {
33954 continue
33955 }
33956 _ = z.Args[1]
33957 z_0 := z.Args[0]
33958 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
33959 continue
33960 }
33961 v.reset(OpRotateLeft32)
33962 v.AddArg2(x, z)
33963 return true
33964 }
33965 break
33966 }
33967
33968
33969
33970 for {
33971 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33972 right := v_0
33973 if right.Op != OpRsh32Ux8 {
33974 continue
33975 }
33976 y := right.Args[1]
33977 x := right.Args[0]
33978 left := v_1
33979 if left.Op != OpLsh32x8 {
33980 continue
33981 }
33982 _ = left.Args[1]
33983 if x != left.Args[0] {
33984 continue
33985 }
33986 z := left.Args[1]
33987 if z.Op != OpSub8 {
33988 continue
33989 }
33990 _ = z.Args[1]
33991 z_0 := z.Args[0]
33992 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
33993 continue
33994 }
33995 v.reset(OpRotateLeft32)
33996 v.AddArg2(x, z)
33997 return true
33998 }
33999 break
34000 }
34001 return false
34002 }
34003 func rewriteValuegeneric_OpXor64(v *Value) bool {
34004 v_1 := v.Args[1]
34005 v_0 := v.Args[0]
34006 b := v.Block
34007 config := b.Func.Config
34008
34009
34010 for {
34011 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34012 if v_0.Op != OpConst64 {
34013 continue
34014 }
34015 c := auxIntToInt64(v_0.AuxInt)
34016 if v_1.Op != OpConst64 {
34017 continue
34018 }
34019 d := auxIntToInt64(v_1.AuxInt)
34020 v.reset(OpConst64)
34021 v.AuxInt = int64ToAuxInt(c ^ d)
34022 return true
34023 }
34024 break
34025 }
34026
34027
34028 for {
34029 x := v_0
34030 if x != v_1 {
34031 break
34032 }
34033 v.reset(OpConst64)
34034 v.AuxInt = int64ToAuxInt(0)
34035 return true
34036 }
34037
34038
34039 for {
34040 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34041 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
34042 continue
34043 }
34044 x := v_1
34045 v.copyOf(x)
34046 return true
34047 }
34048 break
34049 }
34050
34051
34052 for {
34053 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34054 if v_0.Op != OpCom64 {
34055 continue
34056 }
34057 x := v_0.Args[0]
34058 if x != v_1 {
34059 continue
34060 }
34061 v.reset(OpConst64)
34062 v.AuxInt = int64ToAuxInt(-1)
34063 return true
34064 }
34065 break
34066 }
34067
34068
34069 for {
34070 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34071 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
34072 continue
34073 }
34074 x := v_1
34075 v.reset(OpCom64)
34076 v.AddArg(x)
34077 return true
34078 }
34079 break
34080 }
34081
34082
34083 for {
34084 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34085 x := v_0
34086 if v_1.Op != OpXor64 {
34087 continue
34088 }
34089 _ = v_1.Args[1]
34090 v_1_0 := v_1.Args[0]
34091 v_1_1 := v_1.Args[1]
34092 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34093 if x != v_1_0 {
34094 continue
34095 }
34096 y := v_1_1
34097 v.copyOf(y)
34098 return true
34099 }
34100 }
34101 break
34102 }
34103
34104
34105
34106 for {
34107 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34108 if v_0.Op != OpXor64 {
34109 continue
34110 }
34111 _ = v_0.Args[1]
34112 v_0_0 := v_0.Args[0]
34113 v_0_1 := v_0.Args[1]
34114 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
34115 i := v_0_0
34116 if i.Op != OpConst64 {
34117 continue
34118 }
34119 t := i.Type
34120 z := v_0_1
34121 x := v_1
34122 if !(z.Op != OpConst64 && x.Op != OpConst64) {
34123 continue
34124 }
34125 v.reset(OpXor64)
34126 v0 := b.NewValue0(v.Pos, OpXor64, t)
34127 v0.AddArg2(z, x)
34128 v.AddArg2(i, v0)
34129 return true
34130 }
34131 }
34132 break
34133 }
34134
34135
34136 for {
34137 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34138 if v_0.Op != OpConst64 {
34139 continue
34140 }
34141 t := v_0.Type
34142 c := auxIntToInt64(v_0.AuxInt)
34143 if v_1.Op != OpXor64 {
34144 continue
34145 }
34146 _ = v_1.Args[1]
34147 v_1_0 := v_1.Args[0]
34148 v_1_1 := v_1.Args[1]
34149 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34150 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
34151 continue
34152 }
34153 d := auxIntToInt64(v_1_0.AuxInt)
34154 x := v_1_1
34155 v.reset(OpXor64)
34156 v0 := b.NewValue0(v.Pos, OpConst64, t)
34157 v0.AuxInt = int64ToAuxInt(c ^ d)
34158 v.AddArg2(v0, x)
34159 return true
34160 }
34161 }
34162 break
34163 }
34164
34165
34166
34167 for {
34168 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34169 if v_0.Op != OpLsh64x64 {
34170 continue
34171 }
34172 _ = v_0.Args[1]
34173 x := v_0.Args[0]
34174 z := v_0.Args[1]
34175 if z.Op != OpConst64 {
34176 continue
34177 }
34178 c := auxIntToInt64(z.AuxInt)
34179 if v_1.Op != OpRsh64Ux64 {
34180 continue
34181 }
34182 _ = v_1.Args[1]
34183 if x != v_1.Args[0] {
34184 continue
34185 }
34186 v_1_1 := v_1.Args[1]
34187 if v_1_1.Op != OpConst64 {
34188 continue
34189 }
34190 d := auxIntToInt64(v_1_1.AuxInt)
34191 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
34192 continue
34193 }
34194 v.reset(OpRotateLeft64)
34195 v.AddArg2(x, z)
34196 return true
34197 }
34198 break
34199 }
34200
34201
34202
34203 for {
34204 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34205 left := v_0
34206 if left.Op != OpLsh64x64 {
34207 continue
34208 }
34209 y := left.Args[1]
34210 x := left.Args[0]
34211 right := v_1
34212 if right.Op != OpRsh64Ux64 {
34213 continue
34214 }
34215 _ = right.Args[1]
34216 if x != right.Args[0] {
34217 continue
34218 }
34219 right_1 := right.Args[1]
34220 if right_1.Op != OpSub64 {
34221 continue
34222 }
34223 _ = right_1.Args[1]
34224 right_1_0 := right_1.Args[0]
34225 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
34226 continue
34227 }
34228 v.reset(OpRotateLeft64)
34229 v.AddArg2(x, y)
34230 return true
34231 }
34232 break
34233 }
34234
34235
34236
34237 for {
34238 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34239 left := v_0
34240 if left.Op != OpLsh64x32 {
34241 continue
34242 }
34243 y := left.Args[1]
34244 x := left.Args[0]
34245 right := v_1
34246 if right.Op != OpRsh64Ux32 {
34247 continue
34248 }
34249 _ = right.Args[1]
34250 if x != right.Args[0] {
34251 continue
34252 }
34253 right_1 := right.Args[1]
34254 if right_1.Op != OpSub32 {
34255 continue
34256 }
34257 _ = right_1.Args[1]
34258 right_1_0 := right_1.Args[0]
34259 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
34260 continue
34261 }
34262 v.reset(OpRotateLeft64)
34263 v.AddArg2(x, y)
34264 return true
34265 }
34266 break
34267 }
34268
34269
34270
34271 for {
34272 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34273 left := v_0
34274 if left.Op != OpLsh64x16 {
34275 continue
34276 }
34277 y := left.Args[1]
34278 x := left.Args[0]
34279 right := v_1
34280 if right.Op != OpRsh64Ux16 {
34281 continue
34282 }
34283 _ = right.Args[1]
34284 if x != right.Args[0] {
34285 continue
34286 }
34287 right_1 := right.Args[1]
34288 if right_1.Op != OpSub16 {
34289 continue
34290 }
34291 _ = right_1.Args[1]
34292 right_1_0 := right_1.Args[0]
34293 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
34294 continue
34295 }
34296 v.reset(OpRotateLeft64)
34297 v.AddArg2(x, y)
34298 return true
34299 }
34300 break
34301 }
34302
34303
34304
34305 for {
34306 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34307 left := v_0
34308 if left.Op != OpLsh64x8 {
34309 continue
34310 }
34311 y := left.Args[1]
34312 x := left.Args[0]
34313 right := v_1
34314 if right.Op != OpRsh64Ux8 {
34315 continue
34316 }
34317 _ = right.Args[1]
34318 if x != right.Args[0] {
34319 continue
34320 }
34321 right_1 := right.Args[1]
34322 if right_1.Op != OpSub8 {
34323 continue
34324 }
34325 _ = right_1.Args[1]
34326 right_1_0 := right_1.Args[0]
34327 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
34328 continue
34329 }
34330 v.reset(OpRotateLeft64)
34331 v.AddArg2(x, y)
34332 return true
34333 }
34334 break
34335 }
34336
34337
34338
34339 for {
34340 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34341 right := v_0
34342 if right.Op != OpRsh64Ux64 {
34343 continue
34344 }
34345 y := right.Args[1]
34346 x := right.Args[0]
34347 left := v_1
34348 if left.Op != OpLsh64x64 {
34349 continue
34350 }
34351 _ = left.Args[1]
34352 if x != left.Args[0] {
34353 continue
34354 }
34355 z := left.Args[1]
34356 if z.Op != OpSub64 {
34357 continue
34358 }
34359 _ = z.Args[1]
34360 z_0 := z.Args[0]
34361 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
34362 continue
34363 }
34364 v.reset(OpRotateLeft64)
34365 v.AddArg2(x, z)
34366 return true
34367 }
34368 break
34369 }
34370
34371
34372
34373 for {
34374 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34375 right := v_0
34376 if right.Op != OpRsh64Ux32 {
34377 continue
34378 }
34379 y := right.Args[1]
34380 x := right.Args[0]
34381 left := v_1
34382 if left.Op != OpLsh64x32 {
34383 continue
34384 }
34385 _ = left.Args[1]
34386 if x != left.Args[0] {
34387 continue
34388 }
34389 z := left.Args[1]
34390 if z.Op != OpSub32 {
34391 continue
34392 }
34393 _ = z.Args[1]
34394 z_0 := z.Args[0]
34395 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
34396 continue
34397 }
34398 v.reset(OpRotateLeft64)
34399 v.AddArg2(x, z)
34400 return true
34401 }
34402 break
34403 }
34404
34405
34406
34407 for {
34408 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34409 right := v_0
34410 if right.Op != OpRsh64Ux16 {
34411 continue
34412 }
34413 y := right.Args[1]
34414 x := right.Args[0]
34415 left := v_1
34416 if left.Op != OpLsh64x16 {
34417 continue
34418 }
34419 _ = left.Args[1]
34420 if x != left.Args[0] {
34421 continue
34422 }
34423 z := left.Args[1]
34424 if z.Op != OpSub16 {
34425 continue
34426 }
34427 _ = z.Args[1]
34428 z_0 := z.Args[0]
34429 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
34430 continue
34431 }
34432 v.reset(OpRotateLeft64)
34433 v.AddArg2(x, z)
34434 return true
34435 }
34436 break
34437 }
34438
34439
34440
34441 for {
34442 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34443 right := v_0
34444 if right.Op != OpRsh64Ux8 {
34445 continue
34446 }
34447 y := right.Args[1]
34448 x := right.Args[0]
34449 left := v_1
34450 if left.Op != OpLsh64x8 {
34451 continue
34452 }
34453 _ = left.Args[1]
34454 if x != left.Args[0] {
34455 continue
34456 }
34457 z := left.Args[1]
34458 if z.Op != OpSub8 {
34459 continue
34460 }
34461 _ = z.Args[1]
34462 z_0 := z.Args[0]
34463 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
34464 continue
34465 }
34466 v.reset(OpRotateLeft64)
34467 v.AddArg2(x, z)
34468 return true
34469 }
34470 break
34471 }
34472 return false
34473 }
34474 func rewriteValuegeneric_OpXor8(v *Value) bool {
34475 v_1 := v.Args[1]
34476 v_0 := v.Args[0]
34477 b := v.Block
34478 config := b.Func.Config
34479
34480
34481 for {
34482 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34483 if v_0.Op != OpConst8 {
34484 continue
34485 }
34486 c := auxIntToInt8(v_0.AuxInt)
34487 if v_1.Op != OpConst8 {
34488 continue
34489 }
34490 d := auxIntToInt8(v_1.AuxInt)
34491 v.reset(OpConst8)
34492 v.AuxInt = int8ToAuxInt(c ^ d)
34493 return true
34494 }
34495 break
34496 }
34497
34498
34499 for {
34500 x := v_0
34501 if x != v_1 {
34502 break
34503 }
34504 v.reset(OpConst8)
34505 v.AuxInt = int8ToAuxInt(0)
34506 return true
34507 }
34508
34509
34510 for {
34511 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34512 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
34513 continue
34514 }
34515 x := v_1
34516 v.copyOf(x)
34517 return true
34518 }
34519 break
34520 }
34521
34522
34523 for {
34524 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34525 if v_0.Op != OpCom8 {
34526 continue
34527 }
34528 x := v_0.Args[0]
34529 if x != v_1 {
34530 continue
34531 }
34532 v.reset(OpConst8)
34533 v.AuxInt = int8ToAuxInt(-1)
34534 return true
34535 }
34536 break
34537 }
34538
34539
34540 for {
34541 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34542 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
34543 continue
34544 }
34545 x := v_1
34546 v.reset(OpCom8)
34547 v.AddArg(x)
34548 return true
34549 }
34550 break
34551 }
34552
34553
34554 for {
34555 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34556 x := v_0
34557 if v_1.Op != OpXor8 {
34558 continue
34559 }
34560 _ = v_1.Args[1]
34561 v_1_0 := v_1.Args[0]
34562 v_1_1 := v_1.Args[1]
34563 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34564 if x != v_1_0 {
34565 continue
34566 }
34567 y := v_1_1
34568 v.copyOf(y)
34569 return true
34570 }
34571 }
34572 break
34573 }
34574
34575
34576
34577 for {
34578 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34579 if v_0.Op != OpXor8 {
34580 continue
34581 }
34582 _ = v_0.Args[1]
34583 v_0_0 := v_0.Args[0]
34584 v_0_1 := v_0.Args[1]
34585 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
34586 i := v_0_0
34587 if i.Op != OpConst8 {
34588 continue
34589 }
34590 t := i.Type
34591 z := v_0_1
34592 x := v_1
34593 if !(z.Op != OpConst8 && x.Op != OpConst8) {
34594 continue
34595 }
34596 v.reset(OpXor8)
34597 v0 := b.NewValue0(v.Pos, OpXor8, t)
34598 v0.AddArg2(z, x)
34599 v.AddArg2(i, v0)
34600 return true
34601 }
34602 }
34603 break
34604 }
34605
34606
34607 for {
34608 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34609 if v_0.Op != OpConst8 {
34610 continue
34611 }
34612 t := v_0.Type
34613 c := auxIntToInt8(v_0.AuxInt)
34614 if v_1.Op != OpXor8 {
34615 continue
34616 }
34617 _ = v_1.Args[1]
34618 v_1_0 := v_1.Args[0]
34619 v_1_1 := v_1.Args[1]
34620 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34621 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
34622 continue
34623 }
34624 d := auxIntToInt8(v_1_0.AuxInt)
34625 x := v_1_1
34626 v.reset(OpXor8)
34627 v0 := b.NewValue0(v.Pos, OpConst8, t)
34628 v0.AuxInt = int8ToAuxInt(c ^ d)
34629 v.AddArg2(v0, x)
34630 return true
34631 }
34632 }
34633 break
34634 }
34635
34636
34637
34638 for {
34639 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34640 if v_0.Op != OpLsh8x64 {
34641 continue
34642 }
34643 _ = v_0.Args[1]
34644 x := v_0.Args[0]
34645 z := v_0.Args[1]
34646 if z.Op != OpConst64 {
34647 continue
34648 }
34649 c := auxIntToInt64(z.AuxInt)
34650 if v_1.Op != OpRsh8Ux64 {
34651 continue
34652 }
34653 _ = v_1.Args[1]
34654 if x != v_1.Args[0] {
34655 continue
34656 }
34657 v_1_1 := v_1.Args[1]
34658 if v_1_1.Op != OpConst64 {
34659 continue
34660 }
34661 d := auxIntToInt64(v_1_1.AuxInt)
34662 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
34663 continue
34664 }
34665 v.reset(OpRotateLeft8)
34666 v.AddArg2(x, z)
34667 return true
34668 }
34669 break
34670 }
34671
34672
34673
34674 for {
34675 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34676 left := v_0
34677 if left.Op != OpLsh8x64 {
34678 continue
34679 }
34680 y := left.Args[1]
34681 x := left.Args[0]
34682 right := v_1
34683 if right.Op != OpRsh8Ux64 {
34684 continue
34685 }
34686 _ = right.Args[1]
34687 if x != right.Args[0] {
34688 continue
34689 }
34690 right_1 := right.Args[1]
34691 if right_1.Op != OpSub64 {
34692 continue
34693 }
34694 _ = right_1.Args[1]
34695 right_1_0 := right_1.Args[0]
34696 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
34697 continue
34698 }
34699 v.reset(OpRotateLeft8)
34700 v.AddArg2(x, y)
34701 return true
34702 }
34703 break
34704 }
34705
34706
34707
34708 for {
34709 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34710 left := v_0
34711 if left.Op != OpLsh8x32 {
34712 continue
34713 }
34714 y := left.Args[1]
34715 x := left.Args[0]
34716 right := v_1
34717 if right.Op != OpRsh8Ux32 {
34718 continue
34719 }
34720 _ = right.Args[1]
34721 if x != right.Args[0] {
34722 continue
34723 }
34724 right_1 := right.Args[1]
34725 if right_1.Op != OpSub32 {
34726 continue
34727 }
34728 _ = right_1.Args[1]
34729 right_1_0 := right_1.Args[0]
34730 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
34731 continue
34732 }
34733 v.reset(OpRotateLeft8)
34734 v.AddArg2(x, y)
34735 return true
34736 }
34737 break
34738 }
34739
34740
34741
34742 for {
34743 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34744 left := v_0
34745 if left.Op != OpLsh8x16 {
34746 continue
34747 }
34748 y := left.Args[1]
34749 x := left.Args[0]
34750 right := v_1
34751 if right.Op != OpRsh8Ux16 {
34752 continue
34753 }
34754 _ = right.Args[1]
34755 if x != right.Args[0] {
34756 continue
34757 }
34758 right_1 := right.Args[1]
34759 if right_1.Op != OpSub16 {
34760 continue
34761 }
34762 _ = right_1.Args[1]
34763 right_1_0 := right_1.Args[0]
34764 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
34765 continue
34766 }
34767 v.reset(OpRotateLeft8)
34768 v.AddArg2(x, y)
34769 return true
34770 }
34771 break
34772 }
34773
34774
34775
34776 for {
34777 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34778 left := v_0
34779 if left.Op != OpLsh8x8 {
34780 continue
34781 }
34782 y := left.Args[1]
34783 x := left.Args[0]
34784 right := v_1
34785 if right.Op != OpRsh8Ux8 {
34786 continue
34787 }
34788 _ = right.Args[1]
34789 if x != right.Args[0] {
34790 continue
34791 }
34792 right_1 := right.Args[1]
34793 if right_1.Op != OpSub8 {
34794 continue
34795 }
34796 _ = right_1.Args[1]
34797 right_1_0 := right_1.Args[0]
34798 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
34799 continue
34800 }
34801 v.reset(OpRotateLeft8)
34802 v.AddArg2(x, y)
34803 return true
34804 }
34805 break
34806 }
34807
34808
34809
34810 for {
34811 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34812 right := v_0
34813 if right.Op != OpRsh8Ux64 {
34814 continue
34815 }
34816 y := right.Args[1]
34817 x := right.Args[0]
34818 left := v_1
34819 if left.Op != OpLsh8x64 {
34820 continue
34821 }
34822 _ = left.Args[1]
34823 if x != left.Args[0] {
34824 continue
34825 }
34826 z := left.Args[1]
34827 if z.Op != OpSub64 {
34828 continue
34829 }
34830 _ = z.Args[1]
34831 z_0 := z.Args[0]
34832 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
34833 continue
34834 }
34835 v.reset(OpRotateLeft8)
34836 v.AddArg2(x, z)
34837 return true
34838 }
34839 break
34840 }
34841
34842
34843
34844 for {
34845 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34846 right := v_0
34847 if right.Op != OpRsh8Ux32 {
34848 continue
34849 }
34850 y := right.Args[1]
34851 x := right.Args[0]
34852 left := v_1
34853 if left.Op != OpLsh8x32 {
34854 continue
34855 }
34856 _ = left.Args[1]
34857 if x != left.Args[0] {
34858 continue
34859 }
34860 z := left.Args[1]
34861 if z.Op != OpSub32 {
34862 continue
34863 }
34864 _ = z.Args[1]
34865 z_0 := z.Args[0]
34866 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
34867 continue
34868 }
34869 v.reset(OpRotateLeft8)
34870 v.AddArg2(x, z)
34871 return true
34872 }
34873 break
34874 }
34875
34876
34877
34878 for {
34879 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34880 right := v_0
34881 if right.Op != OpRsh8Ux16 {
34882 continue
34883 }
34884 y := right.Args[1]
34885 x := right.Args[0]
34886 left := v_1
34887 if left.Op != OpLsh8x16 {
34888 continue
34889 }
34890 _ = left.Args[1]
34891 if x != left.Args[0] {
34892 continue
34893 }
34894 z := left.Args[1]
34895 if z.Op != OpSub16 {
34896 continue
34897 }
34898 _ = z.Args[1]
34899 z_0 := z.Args[0]
34900 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
34901 continue
34902 }
34903 v.reset(OpRotateLeft8)
34904 v.AddArg2(x, z)
34905 return true
34906 }
34907 break
34908 }
34909
34910
34911
34912 for {
34913 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34914 right := v_0
34915 if right.Op != OpRsh8Ux8 {
34916 continue
34917 }
34918 y := right.Args[1]
34919 x := right.Args[0]
34920 left := v_1
34921 if left.Op != OpLsh8x8 {
34922 continue
34923 }
34924 _ = left.Args[1]
34925 if x != left.Args[0] {
34926 continue
34927 }
34928 z := left.Args[1]
34929 if z.Op != OpSub8 {
34930 continue
34931 }
34932 _ = z.Args[1]
34933 z_0 := z.Args[0]
34934 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
34935 continue
34936 }
34937 v.reset(OpRotateLeft8)
34938 v.AddArg2(x, z)
34939 return true
34940 }
34941 break
34942 }
34943 return false
34944 }
34945 func rewriteValuegeneric_OpZero(v *Value) bool {
34946 v_1 := v.Args[1]
34947 v_0 := v.Args[0]
34948 b := v.Block
34949
34950
34951
34952 for {
34953 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
34954 break
34955 }
34956 call := v_0.Args[0]
34957 if call.Op != OpStaticLECall || len(call.Args) != 2 {
34958 break
34959 }
34960 mem := v_1
34961 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isSameCall(call.Aux, "runtime.newobject")) {
34962 break
34963 }
34964 v.copyOf(mem)
34965 return true
34966 }
34967
34968
34969
34970 for {
34971 n := auxIntToInt64(v.AuxInt)
34972 t1 := auxToType(v.Aux)
34973 p1 := v_0
34974 store := v_1
34975 if store.Op != OpStore {
34976 break
34977 }
34978 t2 := auxToType(store.Aux)
34979 mem := store.Args[2]
34980 store_0 := store.Args[0]
34981 if store_0.Op != OpOffPtr {
34982 break
34983 }
34984 o2 := auxIntToInt64(store_0.AuxInt)
34985 p2 := store_0.Args[0]
34986 if !(isSamePtr(p1, p2) && store.Uses == 1 && n >= o2+t2.Size() && clobber(store)) {
34987 break
34988 }
34989 v.reset(OpZero)
34990 v.AuxInt = int64ToAuxInt(n)
34991 v.Aux = typeToAux(t1)
34992 v.AddArg2(p1, mem)
34993 return true
34994 }
34995
34996
34997
34998 for {
34999 n := auxIntToInt64(v.AuxInt)
35000 t := auxToType(v.Aux)
35001 dst1 := v_0
35002 move := v_1
35003 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
35004 break
35005 }
35006 mem := move.Args[2]
35007 dst2 := move.Args[0]
35008 if !(move.Uses == 1 && isSamePtr(dst1, dst2) && clobber(move)) {
35009 break
35010 }
35011 v.reset(OpZero)
35012 v.AuxInt = int64ToAuxInt(n)
35013 v.Aux = typeToAux(t)
35014 v.AddArg2(dst1, mem)
35015 return true
35016 }
35017
35018
35019
35020 for {
35021 n := auxIntToInt64(v.AuxInt)
35022 t := auxToType(v.Aux)
35023 dst1 := v_0
35024 vardef := v_1
35025 if vardef.Op != OpVarDef {
35026 break
35027 }
35028 x := auxToSym(vardef.Aux)
35029 move := vardef.Args[0]
35030 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
35031 break
35032 }
35033 mem := move.Args[2]
35034 dst2 := move.Args[0]
35035 if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && clobber(move, vardef)) {
35036 break
35037 }
35038 v.reset(OpZero)
35039 v.AuxInt = int64ToAuxInt(n)
35040 v.Aux = typeToAux(t)
35041 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
35042 v0.Aux = symToAux(x)
35043 v0.AddArg(mem)
35044 v.AddArg2(dst1, v0)
35045 return true
35046 }
35047
35048
35049
35050 for {
35051 s := auxIntToInt64(v.AuxInt)
35052 t := auxToType(v.Aux)
35053 dst1 := v_0
35054 zero := v_1
35055 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != s || auxToType(zero.Aux) != t {
35056 break
35057 }
35058 dst2 := zero.Args[0]
35059 if !(isSamePtr(dst1, dst2)) {
35060 break
35061 }
35062 v.copyOf(zero)
35063 return true
35064 }
35065
35066
35067
35068 for {
35069 s := auxIntToInt64(v.AuxInt)
35070 t := auxToType(v.Aux)
35071 dst1 := v_0
35072 vardef := v_1
35073 if vardef.Op != OpVarDef {
35074 break
35075 }
35076 vardef_0 := vardef.Args[0]
35077 if vardef_0.Op != OpZero || auxIntToInt64(vardef_0.AuxInt) != s || auxToType(vardef_0.Aux) != t {
35078 break
35079 }
35080 dst2 := vardef_0.Args[0]
35081 if !(isSamePtr(dst1, dst2)) {
35082 break
35083 }
35084 v.copyOf(vardef)
35085 return true
35086 }
35087 return false
35088 }
35089 func rewriteValuegeneric_OpZeroExt16to32(v *Value) bool {
35090 v_0 := v.Args[0]
35091
35092
35093 for {
35094 if v_0.Op != OpConst16 {
35095 break
35096 }
35097 c := auxIntToInt16(v_0.AuxInt)
35098 v.reset(OpConst32)
35099 v.AuxInt = int32ToAuxInt(int32(uint16(c)))
35100 return true
35101 }
35102
35103
35104
35105 for {
35106 if v_0.Op != OpTrunc32to16 {
35107 break
35108 }
35109 x := v_0.Args[0]
35110 if x.Op != OpRsh32Ux64 {
35111 break
35112 }
35113 _ = x.Args[1]
35114 x_1 := x.Args[1]
35115 if x_1.Op != OpConst64 {
35116 break
35117 }
35118 s := auxIntToInt64(x_1.AuxInt)
35119 if !(s >= 16) {
35120 break
35121 }
35122 v.copyOf(x)
35123 return true
35124 }
35125 return false
35126 }
35127 func rewriteValuegeneric_OpZeroExt16to64(v *Value) bool {
35128 v_0 := v.Args[0]
35129
35130
35131 for {
35132 if v_0.Op != OpConst16 {
35133 break
35134 }
35135 c := auxIntToInt16(v_0.AuxInt)
35136 v.reset(OpConst64)
35137 v.AuxInt = int64ToAuxInt(int64(uint16(c)))
35138 return true
35139 }
35140
35141
35142
35143 for {
35144 if v_0.Op != OpTrunc64to16 {
35145 break
35146 }
35147 x := v_0.Args[0]
35148 if x.Op != OpRsh64Ux64 {
35149 break
35150 }
35151 _ = x.Args[1]
35152 x_1 := x.Args[1]
35153 if x_1.Op != OpConst64 {
35154 break
35155 }
35156 s := auxIntToInt64(x_1.AuxInt)
35157 if !(s >= 48) {
35158 break
35159 }
35160 v.copyOf(x)
35161 return true
35162 }
35163 return false
35164 }
35165 func rewriteValuegeneric_OpZeroExt32to64(v *Value) bool {
35166 v_0 := v.Args[0]
35167
35168
35169 for {
35170 if v_0.Op != OpConst32 {
35171 break
35172 }
35173 c := auxIntToInt32(v_0.AuxInt)
35174 v.reset(OpConst64)
35175 v.AuxInt = int64ToAuxInt(int64(uint32(c)))
35176 return true
35177 }
35178
35179
35180
35181 for {
35182 if v_0.Op != OpTrunc64to32 {
35183 break
35184 }
35185 x := v_0.Args[0]
35186 if x.Op != OpRsh64Ux64 {
35187 break
35188 }
35189 _ = x.Args[1]
35190 x_1 := x.Args[1]
35191 if x_1.Op != OpConst64 {
35192 break
35193 }
35194 s := auxIntToInt64(x_1.AuxInt)
35195 if !(s >= 32) {
35196 break
35197 }
35198 v.copyOf(x)
35199 return true
35200 }
35201 return false
35202 }
35203 func rewriteValuegeneric_OpZeroExt8to16(v *Value) bool {
35204 v_0 := v.Args[0]
35205
35206
35207 for {
35208 if v_0.Op != OpConst8 {
35209 break
35210 }
35211 c := auxIntToInt8(v_0.AuxInt)
35212 v.reset(OpConst16)
35213 v.AuxInt = int16ToAuxInt(int16(uint8(c)))
35214 return true
35215 }
35216
35217
35218
35219 for {
35220 if v_0.Op != OpTrunc16to8 {
35221 break
35222 }
35223 x := v_0.Args[0]
35224 if x.Op != OpRsh16Ux64 {
35225 break
35226 }
35227 _ = x.Args[1]
35228 x_1 := x.Args[1]
35229 if x_1.Op != OpConst64 {
35230 break
35231 }
35232 s := auxIntToInt64(x_1.AuxInt)
35233 if !(s >= 8) {
35234 break
35235 }
35236 v.copyOf(x)
35237 return true
35238 }
35239 return false
35240 }
35241 func rewriteValuegeneric_OpZeroExt8to32(v *Value) bool {
35242 v_0 := v.Args[0]
35243
35244
35245 for {
35246 if v_0.Op != OpConst8 {
35247 break
35248 }
35249 c := auxIntToInt8(v_0.AuxInt)
35250 v.reset(OpConst32)
35251 v.AuxInt = int32ToAuxInt(int32(uint8(c)))
35252 return true
35253 }
35254
35255
35256
35257 for {
35258 if v_0.Op != OpTrunc32to8 {
35259 break
35260 }
35261 x := v_0.Args[0]
35262 if x.Op != OpRsh32Ux64 {
35263 break
35264 }
35265 _ = x.Args[1]
35266 x_1 := x.Args[1]
35267 if x_1.Op != OpConst64 {
35268 break
35269 }
35270 s := auxIntToInt64(x_1.AuxInt)
35271 if !(s >= 24) {
35272 break
35273 }
35274 v.copyOf(x)
35275 return true
35276 }
35277 return false
35278 }
35279 func rewriteValuegeneric_OpZeroExt8to64(v *Value) bool {
35280 v_0 := v.Args[0]
35281
35282
35283 for {
35284 if v_0.Op != OpConst8 {
35285 break
35286 }
35287 c := auxIntToInt8(v_0.AuxInt)
35288 v.reset(OpConst64)
35289 v.AuxInt = int64ToAuxInt(int64(uint8(c)))
35290 return true
35291 }
35292
35293
35294
35295 for {
35296 if v_0.Op != OpTrunc64to8 {
35297 break
35298 }
35299 x := v_0.Args[0]
35300 if x.Op != OpRsh64Ux64 {
35301 break
35302 }
35303 _ = x.Args[1]
35304 x_1 := x.Args[1]
35305 if x_1.Op != OpConst64 {
35306 break
35307 }
35308 s := auxIntToInt64(x_1.AuxInt)
35309 if !(s >= 56) {
35310 break
35311 }
35312 v.copyOf(x)
35313 return true
35314 }
35315 return false
35316 }
35317 func rewriteBlockgeneric(b *Block) bool {
35318 switch b.Kind {
35319 case BlockIf:
35320
35321
35322 for b.Controls[0].Op == OpNot {
35323 v_0 := b.Controls[0]
35324 cond := v_0.Args[0]
35325 b.resetWithControl(BlockIf, cond)
35326 b.swapSuccessors()
35327 return true
35328 }
35329
35330
35331
35332 for b.Controls[0].Op == OpConstBool {
35333 v_0 := b.Controls[0]
35334 c := auxIntToBool(v_0.AuxInt)
35335 if !(c) {
35336 break
35337 }
35338 b.Reset(BlockFirst)
35339 return true
35340 }
35341
35342
35343
35344 for b.Controls[0].Op == OpConstBool {
35345 v_0 := b.Controls[0]
35346 c := auxIntToBool(v_0.AuxInt)
35347 if !(!c) {
35348 break
35349 }
35350 b.Reset(BlockFirst)
35351 b.swapSuccessors()
35352 return true
35353 }
35354 }
35355 return false
35356 }
35357
View as plain text