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 OpAdd64carry:
24 return rewriteValuegeneric_OpAdd64carry(v)
25 case OpAdd8:
26 return rewriteValuegeneric_OpAdd8(v)
27 case OpAddPtr:
28 return rewriteValuegeneric_OpAddPtr(v)
29 case OpAnd16:
30 return rewriteValuegeneric_OpAnd16(v)
31 case OpAnd32:
32 return rewriteValuegeneric_OpAnd32(v)
33 case OpAnd64:
34 return rewriteValuegeneric_OpAnd64(v)
35 case OpAnd8:
36 return rewriteValuegeneric_OpAnd8(v)
37 case OpAndB:
38 return rewriteValuegeneric_OpAndB(v)
39 case OpArraySelect:
40 return rewriteValuegeneric_OpArraySelect(v)
41 case OpBitLen16:
42 return rewriteValuegeneric_OpBitLen16(v)
43 case OpBitLen32:
44 return rewriteValuegeneric_OpBitLen32(v)
45 case OpBitLen64:
46 return rewriteValuegeneric_OpBitLen64(v)
47 case OpBitLen8:
48 return rewriteValuegeneric_OpBitLen8(v)
49 case OpCeil:
50 return rewriteValuegeneric_OpCeil(v)
51 case OpCom16:
52 return rewriteValuegeneric_OpCom16(v)
53 case OpCom32:
54 return rewriteValuegeneric_OpCom32(v)
55 case OpCom64:
56 return rewriteValuegeneric_OpCom64(v)
57 case OpCom8:
58 return rewriteValuegeneric_OpCom8(v)
59 case OpCondSelect:
60 return rewriteValuegeneric_OpCondSelect(v)
61 case OpConstInterface:
62 return rewriteValuegeneric_OpConstInterface(v)
63 case OpConstSlice:
64 return rewriteValuegeneric_OpConstSlice(v)
65 case OpConstString:
66 return rewriteValuegeneric_OpConstString(v)
67 case OpConvert:
68 return rewriteValuegeneric_OpConvert(v)
69 case OpCtz16:
70 return rewriteValuegeneric_OpCtz16(v)
71 case OpCtz32:
72 return rewriteValuegeneric_OpCtz32(v)
73 case OpCtz64:
74 return rewriteValuegeneric_OpCtz64(v)
75 case OpCtz8:
76 return rewriteValuegeneric_OpCtz8(v)
77 case OpCvt32Fto32:
78 return rewriteValuegeneric_OpCvt32Fto32(v)
79 case OpCvt32Fto64:
80 return rewriteValuegeneric_OpCvt32Fto64(v)
81 case OpCvt32Fto64F:
82 return rewriteValuegeneric_OpCvt32Fto64F(v)
83 case OpCvt32to32F:
84 return rewriteValuegeneric_OpCvt32to32F(v)
85 case OpCvt32to64F:
86 return rewriteValuegeneric_OpCvt32to64F(v)
87 case OpCvt64Fto32:
88 return rewriteValuegeneric_OpCvt64Fto32(v)
89 case OpCvt64Fto32F:
90 return rewriteValuegeneric_OpCvt64Fto32F(v)
91 case OpCvt64Fto64:
92 return rewriteValuegeneric_OpCvt64Fto64(v)
93 case OpCvt64to32F:
94 return rewriteValuegeneric_OpCvt64to32F(v)
95 case OpCvt64to64F:
96 return rewriteValuegeneric_OpCvt64to64F(v)
97 case OpCvtBoolToUint8:
98 return rewriteValuegeneric_OpCvtBoolToUint8(v)
99 case OpDiv128u:
100 return rewriteValuegeneric_OpDiv128u(v)
101 case OpDiv16:
102 return rewriteValuegeneric_OpDiv16(v)
103 case OpDiv16u:
104 return rewriteValuegeneric_OpDiv16u(v)
105 case OpDiv32:
106 return rewriteValuegeneric_OpDiv32(v)
107 case OpDiv32F:
108 return rewriteValuegeneric_OpDiv32F(v)
109 case OpDiv32u:
110 return rewriteValuegeneric_OpDiv32u(v)
111 case OpDiv64:
112 return rewriteValuegeneric_OpDiv64(v)
113 case OpDiv64F:
114 return rewriteValuegeneric_OpDiv64F(v)
115 case OpDiv64u:
116 return rewriteValuegeneric_OpDiv64u(v)
117 case OpDiv8:
118 return rewriteValuegeneric_OpDiv8(v)
119 case OpDiv8u:
120 return rewriteValuegeneric_OpDiv8u(v)
121 case OpEq16:
122 return rewriteValuegeneric_OpEq16(v)
123 case OpEq32:
124 return rewriteValuegeneric_OpEq32(v)
125 case OpEq32F:
126 return rewriteValuegeneric_OpEq32F(v)
127 case OpEq64:
128 return rewriteValuegeneric_OpEq64(v)
129 case OpEq64F:
130 return rewriteValuegeneric_OpEq64F(v)
131 case OpEq8:
132 return rewriteValuegeneric_OpEq8(v)
133 case OpEqB:
134 return rewriteValuegeneric_OpEqB(v)
135 case OpEqInter:
136 return rewriteValuegeneric_OpEqInter(v)
137 case OpEqPtr:
138 return rewriteValuegeneric_OpEqPtr(v)
139 case OpEqSlice:
140 return rewriteValuegeneric_OpEqSlice(v)
141 case OpFloor:
142 return rewriteValuegeneric_OpFloor(v)
143 case OpIMake:
144 return rewriteValuegeneric_OpIMake(v)
145 case OpInterLECall:
146 return rewriteValuegeneric_OpInterLECall(v)
147 case OpIsInBounds:
148 return rewriteValuegeneric_OpIsInBounds(v)
149 case OpIsNonNil:
150 return rewriteValuegeneric_OpIsNonNil(v)
151 case OpIsSliceInBounds:
152 return rewriteValuegeneric_OpIsSliceInBounds(v)
153 case OpLeq16:
154 return rewriteValuegeneric_OpLeq16(v)
155 case OpLeq16U:
156 return rewriteValuegeneric_OpLeq16U(v)
157 case OpLeq32:
158 return rewriteValuegeneric_OpLeq32(v)
159 case OpLeq32F:
160 return rewriteValuegeneric_OpLeq32F(v)
161 case OpLeq32U:
162 return rewriteValuegeneric_OpLeq32U(v)
163 case OpLeq64:
164 return rewriteValuegeneric_OpLeq64(v)
165 case OpLeq64F:
166 return rewriteValuegeneric_OpLeq64F(v)
167 case OpLeq64U:
168 return rewriteValuegeneric_OpLeq64U(v)
169 case OpLeq8:
170 return rewriteValuegeneric_OpLeq8(v)
171 case OpLeq8U:
172 return rewriteValuegeneric_OpLeq8U(v)
173 case OpLess16:
174 return rewriteValuegeneric_OpLess16(v)
175 case OpLess16U:
176 return rewriteValuegeneric_OpLess16U(v)
177 case OpLess32:
178 return rewriteValuegeneric_OpLess32(v)
179 case OpLess32F:
180 return rewriteValuegeneric_OpLess32F(v)
181 case OpLess32U:
182 return rewriteValuegeneric_OpLess32U(v)
183 case OpLess64:
184 return rewriteValuegeneric_OpLess64(v)
185 case OpLess64F:
186 return rewriteValuegeneric_OpLess64F(v)
187 case OpLess64U:
188 return rewriteValuegeneric_OpLess64U(v)
189 case OpLess8:
190 return rewriteValuegeneric_OpLess8(v)
191 case OpLess8U:
192 return rewriteValuegeneric_OpLess8U(v)
193 case OpLoad:
194 return rewriteValuegeneric_OpLoad(v)
195 case OpLsh16x16:
196 return rewriteValuegeneric_OpLsh16x16(v)
197 case OpLsh16x32:
198 return rewriteValuegeneric_OpLsh16x32(v)
199 case OpLsh16x64:
200 return rewriteValuegeneric_OpLsh16x64(v)
201 case OpLsh16x8:
202 return rewriteValuegeneric_OpLsh16x8(v)
203 case OpLsh32x16:
204 return rewriteValuegeneric_OpLsh32x16(v)
205 case OpLsh32x32:
206 return rewriteValuegeneric_OpLsh32x32(v)
207 case OpLsh32x64:
208 return rewriteValuegeneric_OpLsh32x64(v)
209 case OpLsh32x8:
210 return rewriteValuegeneric_OpLsh32x8(v)
211 case OpLsh64x16:
212 return rewriteValuegeneric_OpLsh64x16(v)
213 case OpLsh64x32:
214 return rewriteValuegeneric_OpLsh64x32(v)
215 case OpLsh64x64:
216 return rewriteValuegeneric_OpLsh64x64(v)
217 case OpLsh64x8:
218 return rewriteValuegeneric_OpLsh64x8(v)
219 case OpLsh8x16:
220 return rewriteValuegeneric_OpLsh8x16(v)
221 case OpLsh8x32:
222 return rewriteValuegeneric_OpLsh8x32(v)
223 case OpLsh8x64:
224 return rewriteValuegeneric_OpLsh8x64(v)
225 case OpLsh8x8:
226 return rewriteValuegeneric_OpLsh8x8(v)
227 case OpMemEq:
228 return rewriteValuegeneric_OpMemEq(v)
229 case OpMod16:
230 return rewriteValuegeneric_OpMod16(v)
231 case OpMod16u:
232 return rewriteValuegeneric_OpMod16u(v)
233 case OpMod32:
234 return rewriteValuegeneric_OpMod32(v)
235 case OpMod32u:
236 return rewriteValuegeneric_OpMod32u(v)
237 case OpMod64:
238 return rewriteValuegeneric_OpMod64(v)
239 case OpMod64u:
240 return rewriteValuegeneric_OpMod64u(v)
241 case OpMod8:
242 return rewriteValuegeneric_OpMod8(v)
243 case OpMod8u:
244 return rewriteValuegeneric_OpMod8u(v)
245 case OpMove:
246 return rewriteValuegeneric_OpMove(v)
247 case OpMul16:
248 return rewriteValuegeneric_OpMul16(v)
249 case OpMul32:
250 return rewriteValuegeneric_OpMul32(v)
251 case OpMul32F:
252 return rewriteValuegeneric_OpMul32F(v)
253 case OpMul32uhilo:
254 return rewriteValuegeneric_OpMul32uhilo(v)
255 case OpMul32uover:
256 return rewriteValuegeneric_OpMul32uover(v)
257 case OpMul64:
258 return rewriteValuegeneric_OpMul64(v)
259 case OpMul64F:
260 return rewriteValuegeneric_OpMul64F(v)
261 case OpMul64uhilo:
262 return rewriteValuegeneric_OpMul64uhilo(v)
263 case OpMul64uover:
264 return rewriteValuegeneric_OpMul64uover(v)
265 case OpMul8:
266 return rewriteValuegeneric_OpMul8(v)
267 case OpNeg16:
268 return rewriteValuegeneric_OpNeg16(v)
269 case OpNeg32:
270 return rewriteValuegeneric_OpNeg32(v)
271 case OpNeg32F:
272 return rewriteValuegeneric_OpNeg32F(v)
273 case OpNeg64:
274 return rewriteValuegeneric_OpNeg64(v)
275 case OpNeg64F:
276 return rewriteValuegeneric_OpNeg64F(v)
277 case OpNeg8:
278 return rewriteValuegeneric_OpNeg8(v)
279 case OpNeq16:
280 return rewriteValuegeneric_OpNeq16(v)
281 case OpNeq32:
282 return rewriteValuegeneric_OpNeq32(v)
283 case OpNeq32F:
284 return rewriteValuegeneric_OpNeq32F(v)
285 case OpNeq64:
286 return rewriteValuegeneric_OpNeq64(v)
287 case OpNeq64F:
288 return rewriteValuegeneric_OpNeq64F(v)
289 case OpNeq8:
290 return rewriteValuegeneric_OpNeq8(v)
291 case OpNeqB:
292 return rewriteValuegeneric_OpNeqB(v)
293 case OpNeqInter:
294 return rewriteValuegeneric_OpNeqInter(v)
295 case OpNeqPtr:
296 return rewriteValuegeneric_OpNeqPtr(v)
297 case OpNeqSlice:
298 return rewriteValuegeneric_OpNeqSlice(v)
299 case OpNilCheck:
300 return rewriteValuegeneric_OpNilCheck(v)
301 case OpNot:
302 return rewriteValuegeneric_OpNot(v)
303 case OpOffPtr:
304 return rewriteValuegeneric_OpOffPtr(v)
305 case OpOr16:
306 return rewriteValuegeneric_OpOr16(v)
307 case OpOr32:
308 return rewriteValuegeneric_OpOr32(v)
309 case OpOr64:
310 return rewriteValuegeneric_OpOr64(v)
311 case OpOr8:
312 return rewriteValuegeneric_OpOr8(v)
313 case OpOrB:
314 return rewriteValuegeneric_OpOrB(v)
315 case OpPhi:
316 return rewriteValuegeneric_OpPhi(v)
317 case OpPopCount16:
318 return rewriteValuegeneric_OpPopCount16(v)
319 case OpPopCount32:
320 return rewriteValuegeneric_OpPopCount32(v)
321 case OpPopCount64:
322 return rewriteValuegeneric_OpPopCount64(v)
323 case OpPopCount8:
324 return rewriteValuegeneric_OpPopCount8(v)
325 case OpPtrIndex:
326 return rewriteValuegeneric_OpPtrIndex(v)
327 case OpRotateLeft16:
328 return rewriteValuegeneric_OpRotateLeft16(v)
329 case OpRotateLeft32:
330 return rewriteValuegeneric_OpRotateLeft32(v)
331 case OpRotateLeft64:
332 return rewriteValuegeneric_OpRotateLeft64(v)
333 case OpRotateLeft8:
334 return rewriteValuegeneric_OpRotateLeft8(v)
335 case OpRound32F:
336 return rewriteValuegeneric_OpRound32F(v)
337 case OpRound64F:
338 return rewriteValuegeneric_OpRound64F(v)
339 case OpRoundToEven:
340 return rewriteValuegeneric_OpRoundToEven(v)
341 case OpRsh16Ux16:
342 return rewriteValuegeneric_OpRsh16Ux16(v)
343 case OpRsh16Ux32:
344 return rewriteValuegeneric_OpRsh16Ux32(v)
345 case OpRsh16Ux64:
346 return rewriteValuegeneric_OpRsh16Ux64(v)
347 case OpRsh16Ux8:
348 return rewriteValuegeneric_OpRsh16Ux8(v)
349 case OpRsh16x16:
350 return rewriteValuegeneric_OpRsh16x16(v)
351 case OpRsh16x32:
352 return rewriteValuegeneric_OpRsh16x32(v)
353 case OpRsh16x64:
354 return rewriteValuegeneric_OpRsh16x64(v)
355 case OpRsh16x8:
356 return rewriteValuegeneric_OpRsh16x8(v)
357 case OpRsh32Ux16:
358 return rewriteValuegeneric_OpRsh32Ux16(v)
359 case OpRsh32Ux32:
360 return rewriteValuegeneric_OpRsh32Ux32(v)
361 case OpRsh32Ux64:
362 return rewriteValuegeneric_OpRsh32Ux64(v)
363 case OpRsh32Ux8:
364 return rewriteValuegeneric_OpRsh32Ux8(v)
365 case OpRsh32x16:
366 return rewriteValuegeneric_OpRsh32x16(v)
367 case OpRsh32x32:
368 return rewriteValuegeneric_OpRsh32x32(v)
369 case OpRsh32x64:
370 return rewriteValuegeneric_OpRsh32x64(v)
371 case OpRsh32x8:
372 return rewriteValuegeneric_OpRsh32x8(v)
373 case OpRsh64Ux16:
374 return rewriteValuegeneric_OpRsh64Ux16(v)
375 case OpRsh64Ux32:
376 return rewriteValuegeneric_OpRsh64Ux32(v)
377 case OpRsh64Ux64:
378 return rewriteValuegeneric_OpRsh64Ux64(v)
379 case OpRsh64Ux8:
380 return rewriteValuegeneric_OpRsh64Ux8(v)
381 case OpRsh64x16:
382 return rewriteValuegeneric_OpRsh64x16(v)
383 case OpRsh64x32:
384 return rewriteValuegeneric_OpRsh64x32(v)
385 case OpRsh64x64:
386 return rewriteValuegeneric_OpRsh64x64(v)
387 case OpRsh64x8:
388 return rewriteValuegeneric_OpRsh64x8(v)
389 case OpRsh8Ux16:
390 return rewriteValuegeneric_OpRsh8Ux16(v)
391 case OpRsh8Ux32:
392 return rewriteValuegeneric_OpRsh8Ux32(v)
393 case OpRsh8Ux64:
394 return rewriteValuegeneric_OpRsh8Ux64(v)
395 case OpRsh8Ux8:
396 return rewriteValuegeneric_OpRsh8Ux8(v)
397 case OpRsh8x16:
398 return rewriteValuegeneric_OpRsh8x16(v)
399 case OpRsh8x32:
400 return rewriteValuegeneric_OpRsh8x32(v)
401 case OpRsh8x64:
402 return rewriteValuegeneric_OpRsh8x64(v)
403 case OpRsh8x8:
404 return rewriteValuegeneric_OpRsh8x8(v)
405 case OpSelect0:
406 return rewriteValuegeneric_OpSelect0(v)
407 case OpSelect1:
408 return rewriteValuegeneric_OpSelect1(v)
409 case OpSelectN:
410 return rewriteValuegeneric_OpSelectN(v)
411 case OpSignExt16to32:
412 return rewriteValuegeneric_OpSignExt16to32(v)
413 case OpSignExt16to64:
414 return rewriteValuegeneric_OpSignExt16to64(v)
415 case OpSignExt32to64:
416 return rewriteValuegeneric_OpSignExt32to64(v)
417 case OpSignExt8to16:
418 return rewriteValuegeneric_OpSignExt8to16(v)
419 case OpSignExt8to32:
420 return rewriteValuegeneric_OpSignExt8to32(v)
421 case OpSignExt8to64:
422 return rewriteValuegeneric_OpSignExt8to64(v)
423 case OpSliceCap:
424 return rewriteValuegeneric_OpSliceCap(v)
425 case OpSliceLen:
426 return rewriteValuegeneric_OpSliceLen(v)
427 case OpSliceMake:
428 return rewriteValuegeneric_OpSliceMake(v)
429 case OpSlicePtr:
430 return rewriteValuegeneric_OpSlicePtr(v)
431 case OpSlicemask:
432 return rewriteValuegeneric_OpSlicemask(v)
433 case OpSqrt:
434 return rewriteValuegeneric_OpSqrt(v)
435 case OpStaticCall:
436 return rewriteValuegeneric_OpStaticCall(v)
437 case OpStaticLECall:
438 return rewriteValuegeneric_OpStaticLECall(v)
439 case OpStore:
440 return rewriteValuegeneric_OpStore(v)
441 case OpStringLen:
442 return rewriteValuegeneric_OpStringLen(v)
443 case OpStringPtr:
444 return rewriteValuegeneric_OpStringPtr(v)
445 case OpStructSelect:
446 return rewriteValuegeneric_OpStructSelect(v)
447 case OpSub16:
448 return rewriteValuegeneric_OpSub16(v)
449 case OpSub32:
450 return rewriteValuegeneric_OpSub32(v)
451 case OpSub32F:
452 return rewriteValuegeneric_OpSub32F(v)
453 case OpSub64:
454 return rewriteValuegeneric_OpSub64(v)
455 case OpSub64F:
456 return rewriteValuegeneric_OpSub64F(v)
457 case OpSub8:
458 return rewriteValuegeneric_OpSub8(v)
459 case OpTrunc:
460 return rewriteValuegeneric_OpTrunc(v)
461 case OpTrunc16to8:
462 return rewriteValuegeneric_OpTrunc16to8(v)
463 case OpTrunc32to16:
464 return rewriteValuegeneric_OpTrunc32to16(v)
465 case OpTrunc32to8:
466 return rewriteValuegeneric_OpTrunc32to8(v)
467 case OpTrunc64to16:
468 return rewriteValuegeneric_OpTrunc64to16(v)
469 case OpTrunc64to32:
470 return rewriteValuegeneric_OpTrunc64to32(v)
471 case OpTrunc64to8:
472 return rewriteValuegeneric_OpTrunc64to8(v)
473 case OpXor16:
474 return rewriteValuegeneric_OpXor16(v)
475 case OpXor32:
476 return rewriteValuegeneric_OpXor32(v)
477 case OpXor64:
478 return rewriteValuegeneric_OpXor64(v)
479 case OpXor8:
480 return rewriteValuegeneric_OpXor8(v)
481 case OpZero:
482 return rewriteValuegeneric_OpZero(v)
483 case OpZeroExt16to32:
484 return rewriteValuegeneric_OpZeroExt16to32(v)
485 case OpZeroExt16to64:
486 return rewriteValuegeneric_OpZeroExt16to64(v)
487 case OpZeroExt32to64:
488 return rewriteValuegeneric_OpZeroExt32to64(v)
489 case OpZeroExt8to16:
490 return rewriteValuegeneric_OpZeroExt8to16(v)
491 case OpZeroExt8to32:
492 return rewriteValuegeneric_OpZeroExt8to32(v)
493 case OpZeroExt8to64:
494 return rewriteValuegeneric_OpZeroExt8to64(v)
495 }
496 return false
497 }
498 func rewriteValuegeneric_OpAdd16(v *Value) bool {
499 v_1 := v.Args[1]
500 v_0 := v.Args[0]
501 b := v.Block
502 config := b.Func.Config
503
504
505 for {
506 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
507 if v_0.Op != OpConst16 {
508 continue
509 }
510 c := auxIntToInt16(v_0.AuxInt)
511 if v_1.Op != OpConst16 {
512 continue
513 }
514 d := auxIntToInt16(v_1.AuxInt)
515 v.reset(OpConst16)
516 v.AuxInt = int16ToAuxInt(c + d)
517 return true
518 }
519 break
520 }
521
522
523 for {
524 t := v.Type
525 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
526 if v_0.Op != OpMul16 {
527 continue
528 }
529 _ = v_0.Args[1]
530 v_0_0 := v_0.Args[0]
531 v_0_1 := v_0.Args[1]
532 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
533 x := v_0_0
534 y := v_0_1
535 if v_1.Op != OpMul16 {
536 continue
537 }
538 _ = v_1.Args[1]
539 v_1_0 := v_1.Args[0]
540 v_1_1 := v_1.Args[1]
541 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
542 if x != v_1_0 {
543 continue
544 }
545 z := v_1_1
546 v.reset(OpMul16)
547 v0 := b.NewValue0(v.Pos, OpAdd16, t)
548 v0.AddArg2(y, z)
549 v.AddArg2(x, v0)
550 return true
551 }
552 }
553 }
554 break
555 }
556
557
558 for {
559 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
560 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
561 continue
562 }
563 x := v_1
564 v.copyOf(x)
565 return true
566 }
567 break
568 }
569
570
571 for {
572 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
573 x := v_0
574 if v_1.Op != OpNeg16 {
575 continue
576 }
577 y := v_1.Args[0]
578 v.reset(OpSub16)
579 v.AddArg2(x, y)
580 return true
581 }
582 break
583 }
584
585
586 for {
587 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
588 if v_0.Op != OpCom16 {
589 continue
590 }
591 x := v_0.Args[0]
592 if x != v_1 {
593 continue
594 }
595 v.reset(OpConst16)
596 v.AuxInt = int16ToAuxInt(-1)
597 return true
598 }
599 break
600 }
601
602
603 for {
604 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
605 if v_0.Op != OpSub16 {
606 continue
607 }
608 t := v_0.Args[1]
609 x := v_0.Args[0]
610 if v_1.Op != OpAdd16 {
611 continue
612 }
613 _ = v_1.Args[1]
614 v_1_0 := v_1.Args[0]
615 v_1_1 := v_1.Args[1]
616 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
617 if t != v_1_0 {
618 continue
619 }
620 y := v_1_1
621 v.reset(OpAdd16)
622 v.AddArg2(x, y)
623 return true
624 }
625 }
626 break
627 }
628
629
630 for {
631 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
632 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 1 || v_1.Op != OpCom16 {
633 continue
634 }
635 x := v_1.Args[0]
636 v.reset(OpNeg16)
637 v.AddArg(x)
638 return true
639 }
640 break
641 }
642
643
644 for {
645 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
646 x := v_0
647 if v_1.Op != OpSub16 {
648 continue
649 }
650 _ = v_1.Args[1]
651 y := v_1.Args[0]
652 if x != v_1.Args[1] {
653 continue
654 }
655 v.copyOf(y)
656 return true
657 }
658 break
659 }
660
661
662 for {
663 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
664 x := v_0
665 if v_1.Op != OpAdd16 {
666 continue
667 }
668 _ = v_1.Args[1]
669 v_1_0 := v_1.Args[0]
670 v_1_1 := v_1.Args[1]
671 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
672 y := v_1_0
673 if v_1_1.Op != OpSub16 {
674 continue
675 }
676 _ = v_1_1.Args[1]
677 z := v_1_1.Args[0]
678 if x != v_1_1.Args[1] {
679 continue
680 }
681 v.reset(OpAdd16)
682 v.AddArg2(y, z)
683 return true
684 }
685 }
686 break
687 }
688
689
690
691 for {
692 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
693 if v_0.Op != OpAdd16 {
694 continue
695 }
696 _ = v_0.Args[1]
697 v_0_0 := v_0.Args[0]
698 v_0_1 := v_0.Args[1]
699 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
700 i := v_0_0
701 if i.Op != OpConst16 {
702 continue
703 }
704 t := i.Type
705 z := v_0_1
706 x := v_1
707 if !(z.Op != OpConst16 && x.Op != OpConst16) {
708 continue
709 }
710 v.reset(OpAdd16)
711 v0 := b.NewValue0(v.Pos, OpAdd16, t)
712 v0.AddArg2(z, x)
713 v.AddArg2(i, v0)
714 return true
715 }
716 }
717 break
718 }
719
720
721
722 for {
723 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
724 if v_0.Op != OpSub16 {
725 continue
726 }
727 z := v_0.Args[1]
728 i := v_0.Args[0]
729 if i.Op != OpConst16 {
730 continue
731 }
732 t := i.Type
733 x := v_1
734 if !(z.Op != OpConst16 && x.Op != OpConst16) {
735 continue
736 }
737 v.reset(OpAdd16)
738 v0 := b.NewValue0(v.Pos, OpSub16, t)
739 v0.AddArg2(x, z)
740 v.AddArg2(i, v0)
741 return true
742 }
743 break
744 }
745
746
747 for {
748 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
749 if v_0.Op != OpConst16 {
750 continue
751 }
752 t := v_0.Type
753 c := auxIntToInt16(v_0.AuxInt)
754 if v_1.Op != OpAdd16 {
755 continue
756 }
757 _ = v_1.Args[1]
758 v_1_0 := v_1.Args[0]
759 v_1_1 := v_1.Args[1]
760 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
761 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
762 continue
763 }
764 d := auxIntToInt16(v_1_0.AuxInt)
765 x := v_1_1
766 v.reset(OpAdd16)
767 v0 := b.NewValue0(v.Pos, OpConst16, t)
768 v0.AuxInt = int16ToAuxInt(c + d)
769 v.AddArg2(v0, x)
770 return true
771 }
772 }
773 break
774 }
775
776
777 for {
778 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
779 if v_0.Op != OpConst16 {
780 continue
781 }
782 t := v_0.Type
783 c := auxIntToInt16(v_0.AuxInt)
784 if v_1.Op != OpSub16 {
785 continue
786 }
787 x := v_1.Args[1]
788 v_1_0 := v_1.Args[0]
789 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
790 continue
791 }
792 d := auxIntToInt16(v_1_0.AuxInt)
793 v.reset(OpSub16)
794 v0 := b.NewValue0(v.Pos, OpConst16, t)
795 v0.AuxInt = int16ToAuxInt(c + d)
796 v.AddArg2(v0, x)
797 return true
798 }
799 break
800 }
801
802
803
804 for {
805 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
806 if v_0.Op != OpLsh16x64 {
807 continue
808 }
809 _ = v_0.Args[1]
810 x := v_0.Args[0]
811 z := v_0.Args[1]
812 if z.Op != OpConst64 {
813 continue
814 }
815 c := auxIntToInt64(z.AuxInt)
816 if v_1.Op != OpRsh16Ux64 {
817 continue
818 }
819 _ = v_1.Args[1]
820 if x != v_1.Args[0] {
821 continue
822 }
823 v_1_1 := v_1.Args[1]
824 if v_1_1.Op != OpConst64 {
825 continue
826 }
827 d := auxIntToInt64(v_1_1.AuxInt)
828 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
829 continue
830 }
831 v.reset(OpRotateLeft16)
832 v.AddArg2(x, z)
833 return true
834 }
835 break
836 }
837
838
839
840 for {
841 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
842 left := v_0
843 if left.Op != OpLsh16x64 {
844 continue
845 }
846 y := left.Args[1]
847 x := left.Args[0]
848 right := v_1
849 if right.Op != OpRsh16Ux64 {
850 continue
851 }
852 _ = right.Args[1]
853 if x != right.Args[0] {
854 continue
855 }
856 right_1 := right.Args[1]
857 if right_1.Op != OpSub64 {
858 continue
859 }
860 _ = right_1.Args[1]
861 right_1_0 := right_1.Args[0]
862 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
863 continue
864 }
865 v.reset(OpRotateLeft16)
866 v.AddArg2(x, y)
867 return true
868 }
869 break
870 }
871
872
873
874 for {
875 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
876 left := v_0
877 if left.Op != OpLsh16x32 {
878 continue
879 }
880 y := left.Args[1]
881 x := left.Args[0]
882 right := v_1
883 if right.Op != OpRsh16Ux32 {
884 continue
885 }
886 _ = right.Args[1]
887 if x != right.Args[0] {
888 continue
889 }
890 right_1 := right.Args[1]
891 if right_1.Op != OpSub32 {
892 continue
893 }
894 _ = right_1.Args[1]
895 right_1_0 := right_1.Args[0]
896 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
897 continue
898 }
899 v.reset(OpRotateLeft16)
900 v.AddArg2(x, y)
901 return true
902 }
903 break
904 }
905
906
907
908 for {
909 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
910 left := v_0
911 if left.Op != OpLsh16x16 {
912 continue
913 }
914 y := left.Args[1]
915 x := left.Args[0]
916 right := v_1
917 if right.Op != OpRsh16Ux16 {
918 continue
919 }
920 _ = right.Args[1]
921 if x != right.Args[0] {
922 continue
923 }
924 right_1 := right.Args[1]
925 if right_1.Op != OpSub16 {
926 continue
927 }
928 _ = right_1.Args[1]
929 right_1_0 := right_1.Args[0]
930 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
931 continue
932 }
933 v.reset(OpRotateLeft16)
934 v.AddArg2(x, y)
935 return true
936 }
937 break
938 }
939
940
941
942 for {
943 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
944 left := v_0
945 if left.Op != OpLsh16x8 {
946 continue
947 }
948 y := left.Args[1]
949 x := left.Args[0]
950 right := v_1
951 if right.Op != OpRsh16Ux8 {
952 continue
953 }
954 _ = right.Args[1]
955 if x != right.Args[0] {
956 continue
957 }
958 right_1 := right.Args[1]
959 if right_1.Op != OpSub8 {
960 continue
961 }
962 _ = right_1.Args[1]
963 right_1_0 := right_1.Args[0]
964 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
965 continue
966 }
967 v.reset(OpRotateLeft16)
968 v.AddArg2(x, y)
969 return true
970 }
971 break
972 }
973
974
975
976 for {
977 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
978 right := v_0
979 if right.Op != OpRsh16Ux64 {
980 continue
981 }
982 y := right.Args[1]
983 x := right.Args[0]
984 left := v_1
985 if left.Op != OpLsh16x64 {
986 continue
987 }
988 _ = left.Args[1]
989 if x != left.Args[0] {
990 continue
991 }
992 z := left.Args[1]
993 if z.Op != OpSub64 {
994 continue
995 }
996 _ = z.Args[1]
997 z_0 := z.Args[0]
998 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
999 continue
1000 }
1001 v.reset(OpRotateLeft16)
1002 v.AddArg2(x, z)
1003 return true
1004 }
1005 break
1006 }
1007
1008
1009
1010 for {
1011 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1012 right := v_0
1013 if right.Op != OpRsh16Ux32 {
1014 continue
1015 }
1016 y := right.Args[1]
1017 x := right.Args[0]
1018 left := v_1
1019 if left.Op != OpLsh16x32 {
1020 continue
1021 }
1022 _ = left.Args[1]
1023 if x != left.Args[0] {
1024 continue
1025 }
1026 z := left.Args[1]
1027 if z.Op != OpSub32 {
1028 continue
1029 }
1030 _ = z.Args[1]
1031 z_0 := z.Args[0]
1032 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1033 continue
1034 }
1035 v.reset(OpRotateLeft16)
1036 v.AddArg2(x, z)
1037 return true
1038 }
1039 break
1040 }
1041
1042
1043
1044 for {
1045 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1046 right := v_0
1047 if right.Op != OpRsh16Ux16 {
1048 continue
1049 }
1050 y := right.Args[1]
1051 x := right.Args[0]
1052 left := v_1
1053 if left.Op != OpLsh16x16 {
1054 continue
1055 }
1056 _ = left.Args[1]
1057 if x != left.Args[0] {
1058 continue
1059 }
1060 z := left.Args[1]
1061 if z.Op != OpSub16 {
1062 continue
1063 }
1064 _ = z.Args[1]
1065 z_0 := z.Args[0]
1066 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1067 continue
1068 }
1069 v.reset(OpRotateLeft16)
1070 v.AddArg2(x, z)
1071 return true
1072 }
1073 break
1074 }
1075
1076
1077
1078 for {
1079 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1080 right := v_0
1081 if right.Op != OpRsh16Ux8 {
1082 continue
1083 }
1084 y := right.Args[1]
1085 x := right.Args[0]
1086 left := v_1
1087 if left.Op != OpLsh16x8 {
1088 continue
1089 }
1090 _ = left.Args[1]
1091 if x != left.Args[0] {
1092 continue
1093 }
1094 z := left.Args[1]
1095 if z.Op != OpSub8 {
1096 continue
1097 }
1098 _ = z.Args[1]
1099 z_0 := z.Args[0]
1100 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1101 continue
1102 }
1103 v.reset(OpRotateLeft16)
1104 v.AddArg2(x, z)
1105 return true
1106 }
1107 break
1108 }
1109 return false
1110 }
1111 func rewriteValuegeneric_OpAdd32(v *Value) bool {
1112 v_1 := v.Args[1]
1113 v_0 := v.Args[0]
1114 b := v.Block
1115 config := b.Func.Config
1116
1117
1118 for {
1119 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1120 if v_0.Op != OpConst32 {
1121 continue
1122 }
1123 c := auxIntToInt32(v_0.AuxInt)
1124 if v_1.Op != OpConst32 {
1125 continue
1126 }
1127 d := auxIntToInt32(v_1.AuxInt)
1128 v.reset(OpConst32)
1129 v.AuxInt = int32ToAuxInt(c + d)
1130 return true
1131 }
1132 break
1133 }
1134
1135
1136 for {
1137 t := v.Type
1138 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1139 if v_0.Op != OpMul32 {
1140 continue
1141 }
1142 _ = v_0.Args[1]
1143 v_0_0 := v_0.Args[0]
1144 v_0_1 := v_0.Args[1]
1145 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1146 x := v_0_0
1147 y := v_0_1
1148 if v_1.Op != OpMul32 {
1149 continue
1150 }
1151 _ = v_1.Args[1]
1152 v_1_0 := v_1.Args[0]
1153 v_1_1 := v_1.Args[1]
1154 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
1155 if x != v_1_0 {
1156 continue
1157 }
1158 z := v_1_1
1159 v.reset(OpMul32)
1160 v0 := b.NewValue0(v.Pos, OpAdd32, t)
1161 v0.AddArg2(y, z)
1162 v.AddArg2(x, v0)
1163 return true
1164 }
1165 }
1166 }
1167 break
1168 }
1169
1170
1171 for {
1172 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1173 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
1174 continue
1175 }
1176 x := v_1
1177 v.copyOf(x)
1178 return true
1179 }
1180 break
1181 }
1182
1183
1184 for {
1185 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1186 x := v_0
1187 if v_1.Op != OpNeg32 {
1188 continue
1189 }
1190 y := v_1.Args[0]
1191 v.reset(OpSub32)
1192 v.AddArg2(x, y)
1193 return true
1194 }
1195 break
1196 }
1197
1198
1199 for {
1200 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1201 if v_0.Op != OpCom32 {
1202 continue
1203 }
1204 x := v_0.Args[0]
1205 if x != v_1 {
1206 continue
1207 }
1208 v.reset(OpConst32)
1209 v.AuxInt = int32ToAuxInt(-1)
1210 return true
1211 }
1212 break
1213 }
1214
1215
1216 for {
1217 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1218 if v_0.Op != OpSub32 {
1219 continue
1220 }
1221 t := v_0.Args[1]
1222 x := v_0.Args[0]
1223 if v_1.Op != OpAdd32 {
1224 continue
1225 }
1226 _ = v_1.Args[1]
1227 v_1_0 := v_1.Args[0]
1228 v_1_1 := v_1.Args[1]
1229 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1230 if t != v_1_0 {
1231 continue
1232 }
1233 y := v_1_1
1234 v.reset(OpAdd32)
1235 v.AddArg2(x, y)
1236 return true
1237 }
1238 }
1239 break
1240 }
1241
1242
1243 for {
1244 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1245 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 || v_1.Op != OpCom32 {
1246 continue
1247 }
1248 x := v_1.Args[0]
1249 v.reset(OpNeg32)
1250 v.AddArg(x)
1251 return true
1252 }
1253 break
1254 }
1255
1256
1257 for {
1258 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1259 x := v_0
1260 if v_1.Op != OpSub32 {
1261 continue
1262 }
1263 _ = v_1.Args[1]
1264 y := v_1.Args[0]
1265 if x != v_1.Args[1] {
1266 continue
1267 }
1268 v.copyOf(y)
1269 return true
1270 }
1271 break
1272 }
1273
1274
1275 for {
1276 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1277 x := v_0
1278 if v_1.Op != OpAdd32 {
1279 continue
1280 }
1281 _ = v_1.Args[1]
1282 v_1_0 := v_1.Args[0]
1283 v_1_1 := v_1.Args[1]
1284 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1285 y := v_1_0
1286 if v_1_1.Op != OpSub32 {
1287 continue
1288 }
1289 _ = v_1_1.Args[1]
1290 z := v_1_1.Args[0]
1291 if x != v_1_1.Args[1] {
1292 continue
1293 }
1294 v.reset(OpAdd32)
1295 v.AddArg2(y, z)
1296 return true
1297 }
1298 }
1299 break
1300 }
1301
1302
1303
1304 for {
1305 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1306 if v_0.Op != OpAdd32 {
1307 continue
1308 }
1309 _ = v_0.Args[1]
1310 v_0_0 := v_0.Args[0]
1311 v_0_1 := v_0.Args[1]
1312 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1313 i := v_0_0
1314 if i.Op != OpConst32 {
1315 continue
1316 }
1317 t := i.Type
1318 z := v_0_1
1319 x := v_1
1320 if !(z.Op != OpConst32 && x.Op != OpConst32) {
1321 continue
1322 }
1323 v.reset(OpAdd32)
1324 v0 := b.NewValue0(v.Pos, OpAdd32, t)
1325 v0.AddArg2(z, x)
1326 v.AddArg2(i, v0)
1327 return true
1328 }
1329 }
1330 break
1331 }
1332
1333
1334
1335 for {
1336 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1337 if v_0.Op != OpSub32 {
1338 continue
1339 }
1340 z := v_0.Args[1]
1341 i := v_0.Args[0]
1342 if i.Op != OpConst32 {
1343 continue
1344 }
1345 t := i.Type
1346 x := v_1
1347 if !(z.Op != OpConst32 && x.Op != OpConst32) {
1348 continue
1349 }
1350 v.reset(OpAdd32)
1351 v0 := b.NewValue0(v.Pos, OpSub32, t)
1352 v0.AddArg2(x, z)
1353 v.AddArg2(i, v0)
1354 return true
1355 }
1356 break
1357 }
1358
1359
1360 for {
1361 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1362 if v_0.Op != OpConst32 {
1363 continue
1364 }
1365 t := v_0.Type
1366 c := auxIntToInt32(v_0.AuxInt)
1367 if v_1.Op != OpAdd32 {
1368 continue
1369 }
1370 _ = v_1.Args[1]
1371 v_1_0 := v_1.Args[0]
1372 v_1_1 := v_1.Args[1]
1373 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1374 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
1375 continue
1376 }
1377 d := auxIntToInt32(v_1_0.AuxInt)
1378 x := v_1_1
1379 v.reset(OpAdd32)
1380 v0 := b.NewValue0(v.Pos, OpConst32, t)
1381 v0.AuxInt = int32ToAuxInt(c + d)
1382 v.AddArg2(v0, x)
1383 return true
1384 }
1385 }
1386 break
1387 }
1388
1389
1390 for {
1391 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1392 if v_0.Op != OpConst32 {
1393 continue
1394 }
1395 t := v_0.Type
1396 c := auxIntToInt32(v_0.AuxInt)
1397 if v_1.Op != OpSub32 {
1398 continue
1399 }
1400 x := v_1.Args[1]
1401 v_1_0 := v_1.Args[0]
1402 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
1403 continue
1404 }
1405 d := auxIntToInt32(v_1_0.AuxInt)
1406 v.reset(OpSub32)
1407 v0 := b.NewValue0(v.Pos, OpConst32, t)
1408 v0.AuxInt = int32ToAuxInt(c + d)
1409 v.AddArg2(v0, x)
1410 return true
1411 }
1412 break
1413 }
1414
1415
1416
1417 for {
1418 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1419 if v_0.Op != OpLsh32x64 {
1420 continue
1421 }
1422 _ = v_0.Args[1]
1423 x := v_0.Args[0]
1424 z := v_0.Args[1]
1425 if z.Op != OpConst64 {
1426 continue
1427 }
1428 c := auxIntToInt64(z.AuxInt)
1429 if v_1.Op != OpRsh32Ux64 {
1430 continue
1431 }
1432 _ = v_1.Args[1]
1433 if x != v_1.Args[0] {
1434 continue
1435 }
1436 v_1_1 := v_1.Args[1]
1437 if v_1_1.Op != OpConst64 {
1438 continue
1439 }
1440 d := auxIntToInt64(v_1_1.AuxInt)
1441 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
1442 continue
1443 }
1444 v.reset(OpRotateLeft32)
1445 v.AddArg2(x, z)
1446 return true
1447 }
1448 break
1449 }
1450
1451
1452
1453 for {
1454 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1455 left := v_0
1456 if left.Op != OpLsh32x64 {
1457 continue
1458 }
1459 y := left.Args[1]
1460 x := left.Args[0]
1461 right := v_1
1462 if right.Op != OpRsh32Ux64 {
1463 continue
1464 }
1465 _ = right.Args[1]
1466 if x != right.Args[0] {
1467 continue
1468 }
1469 right_1 := right.Args[1]
1470 if right_1.Op != OpSub64 {
1471 continue
1472 }
1473 _ = right_1.Args[1]
1474 right_1_0 := right_1.Args[0]
1475 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1476 continue
1477 }
1478 v.reset(OpRotateLeft32)
1479 v.AddArg2(x, y)
1480 return true
1481 }
1482 break
1483 }
1484
1485
1486
1487 for {
1488 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1489 left := v_0
1490 if left.Op != OpLsh32x32 {
1491 continue
1492 }
1493 y := left.Args[1]
1494 x := left.Args[0]
1495 right := v_1
1496 if right.Op != OpRsh32Ux32 {
1497 continue
1498 }
1499 _ = right.Args[1]
1500 if x != right.Args[0] {
1501 continue
1502 }
1503 right_1 := right.Args[1]
1504 if right_1.Op != OpSub32 {
1505 continue
1506 }
1507 _ = right_1.Args[1]
1508 right_1_0 := right_1.Args[0]
1509 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1510 continue
1511 }
1512 v.reset(OpRotateLeft32)
1513 v.AddArg2(x, y)
1514 return true
1515 }
1516 break
1517 }
1518
1519
1520
1521 for {
1522 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1523 left := v_0
1524 if left.Op != OpLsh32x16 {
1525 continue
1526 }
1527 y := left.Args[1]
1528 x := left.Args[0]
1529 right := v_1
1530 if right.Op != OpRsh32Ux16 {
1531 continue
1532 }
1533 _ = right.Args[1]
1534 if x != right.Args[0] {
1535 continue
1536 }
1537 right_1 := right.Args[1]
1538 if right_1.Op != OpSub16 {
1539 continue
1540 }
1541 _ = right_1.Args[1]
1542 right_1_0 := right_1.Args[0]
1543 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1544 continue
1545 }
1546 v.reset(OpRotateLeft32)
1547 v.AddArg2(x, y)
1548 return true
1549 }
1550 break
1551 }
1552
1553
1554
1555 for {
1556 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1557 left := v_0
1558 if left.Op != OpLsh32x8 {
1559 continue
1560 }
1561 y := left.Args[1]
1562 x := left.Args[0]
1563 right := v_1
1564 if right.Op != OpRsh32Ux8 {
1565 continue
1566 }
1567 _ = right.Args[1]
1568 if x != right.Args[0] {
1569 continue
1570 }
1571 right_1 := right.Args[1]
1572 if right_1.Op != OpSub8 {
1573 continue
1574 }
1575 _ = right_1.Args[1]
1576 right_1_0 := right_1.Args[0]
1577 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1578 continue
1579 }
1580 v.reset(OpRotateLeft32)
1581 v.AddArg2(x, y)
1582 return true
1583 }
1584 break
1585 }
1586
1587
1588
1589 for {
1590 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1591 right := v_0
1592 if right.Op != OpRsh32Ux64 {
1593 continue
1594 }
1595 y := right.Args[1]
1596 x := right.Args[0]
1597 left := v_1
1598 if left.Op != OpLsh32x64 {
1599 continue
1600 }
1601 _ = left.Args[1]
1602 if x != left.Args[0] {
1603 continue
1604 }
1605 z := left.Args[1]
1606 if z.Op != OpSub64 {
1607 continue
1608 }
1609 _ = z.Args[1]
1610 z_0 := z.Args[0]
1611 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1612 continue
1613 }
1614 v.reset(OpRotateLeft32)
1615 v.AddArg2(x, z)
1616 return true
1617 }
1618 break
1619 }
1620
1621
1622
1623 for {
1624 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1625 right := v_0
1626 if right.Op != OpRsh32Ux32 {
1627 continue
1628 }
1629 y := right.Args[1]
1630 x := right.Args[0]
1631 left := v_1
1632 if left.Op != OpLsh32x32 {
1633 continue
1634 }
1635 _ = left.Args[1]
1636 if x != left.Args[0] {
1637 continue
1638 }
1639 z := left.Args[1]
1640 if z.Op != OpSub32 {
1641 continue
1642 }
1643 _ = z.Args[1]
1644 z_0 := z.Args[0]
1645 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1646 continue
1647 }
1648 v.reset(OpRotateLeft32)
1649 v.AddArg2(x, z)
1650 return true
1651 }
1652 break
1653 }
1654
1655
1656
1657 for {
1658 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1659 right := v_0
1660 if right.Op != OpRsh32Ux16 {
1661 continue
1662 }
1663 y := right.Args[1]
1664 x := right.Args[0]
1665 left := v_1
1666 if left.Op != OpLsh32x16 {
1667 continue
1668 }
1669 _ = left.Args[1]
1670 if x != left.Args[0] {
1671 continue
1672 }
1673 z := left.Args[1]
1674 if z.Op != OpSub16 {
1675 continue
1676 }
1677 _ = z.Args[1]
1678 z_0 := z.Args[0]
1679 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1680 continue
1681 }
1682 v.reset(OpRotateLeft32)
1683 v.AddArg2(x, z)
1684 return true
1685 }
1686 break
1687 }
1688
1689
1690
1691 for {
1692 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1693 right := v_0
1694 if right.Op != OpRsh32Ux8 {
1695 continue
1696 }
1697 y := right.Args[1]
1698 x := right.Args[0]
1699 left := v_1
1700 if left.Op != OpLsh32x8 {
1701 continue
1702 }
1703 _ = left.Args[1]
1704 if x != left.Args[0] {
1705 continue
1706 }
1707 z := left.Args[1]
1708 if z.Op != OpSub8 {
1709 continue
1710 }
1711 _ = z.Args[1]
1712 z_0 := z.Args[0]
1713 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1714 continue
1715 }
1716 v.reset(OpRotateLeft32)
1717 v.AddArg2(x, z)
1718 return true
1719 }
1720 break
1721 }
1722 return false
1723 }
1724 func rewriteValuegeneric_OpAdd32F(v *Value) bool {
1725 v_1 := v.Args[1]
1726 v_0 := v.Args[0]
1727
1728
1729
1730 for {
1731 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1732 if v_0.Op != OpConst32F {
1733 continue
1734 }
1735 c := auxIntToFloat32(v_0.AuxInt)
1736 if v_1.Op != OpConst32F {
1737 continue
1738 }
1739 d := auxIntToFloat32(v_1.AuxInt)
1740 if !(c+d == c+d) {
1741 continue
1742 }
1743 v.reset(OpConst32F)
1744 v.AuxInt = float32ToAuxInt(c + d)
1745 return true
1746 }
1747 break
1748 }
1749 return false
1750 }
1751 func rewriteValuegeneric_OpAdd64(v *Value) bool {
1752 v_1 := v.Args[1]
1753 v_0 := v.Args[0]
1754 b := v.Block
1755 config := b.Func.Config
1756
1757
1758 for {
1759 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1760 if v_0.Op != OpConst64 {
1761 continue
1762 }
1763 c := auxIntToInt64(v_0.AuxInt)
1764 if v_1.Op != OpConst64 {
1765 continue
1766 }
1767 d := auxIntToInt64(v_1.AuxInt)
1768 v.reset(OpConst64)
1769 v.AuxInt = int64ToAuxInt(c + d)
1770 return true
1771 }
1772 break
1773 }
1774
1775
1776 for {
1777 t := v.Type
1778 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1779 if v_0.Op != OpMul64 {
1780 continue
1781 }
1782 _ = v_0.Args[1]
1783 v_0_0 := v_0.Args[0]
1784 v_0_1 := v_0.Args[1]
1785 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1786 x := v_0_0
1787 y := v_0_1
1788 if v_1.Op != OpMul64 {
1789 continue
1790 }
1791 _ = v_1.Args[1]
1792 v_1_0 := v_1.Args[0]
1793 v_1_1 := v_1.Args[1]
1794 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
1795 if x != v_1_0 {
1796 continue
1797 }
1798 z := v_1_1
1799 v.reset(OpMul64)
1800 v0 := b.NewValue0(v.Pos, OpAdd64, t)
1801 v0.AddArg2(y, z)
1802 v.AddArg2(x, v0)
1803 return true
1804 }
1805 }
1806 }
1807 break
1808 }
1809
1810
1811 for {
1812 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1813 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
1814 continue
1815 }
1816 x := v_1
1817 v.copyOf(x)
1818 return true
1819 }
1820 break
1821 }
1822
1823
1824 for {
1825 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1826 x := v_0
1827 if v_1.Op != OpNeg64 {
1828 continue
1829 }
1830 y := v_1.Args[0]
1831 v.reset(OpSub64)
1832 v.AddArg2(x, y)
1833 return true
1834 }
1835 break
1836 }
1837
1838
1839 for {
1840 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1841 if v_0.Op != OpCom64 {
1842 continue
1843 }
1844 x := v_0.Args[0]
1845 if x != v_1 {
1846 continue
1847 }
1848 v.reset(OpConst64)
1849 v.AuxInt = int64ToAuxInt(-1)
1850 return true
1851 }
1852 break
1853 }
1854
1855
1856 for {
1857 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1858 if v_0.Op != OpSub64 {
1859 continue
1860 }
1861 t := v_0.Args[1]
1862 x := v_0.Args[0]
1863 if v_1.Op != OpAdd64 {
1864 continue
1865 }
1866 _ = v_1.Args[1]
1867 v_1_0 := v_1.Args[0]
1868 v_1_1 := v_1.Args[1]
1869 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1870 if t != v_1_0 {
1871 continue
1872 }
1873 y := v_1_1
1874 v.reset(OpAdd64)
1875 v.AddArg2(x, y)
1876 return true
1877 }
1878 }
1879 break
1880 }
1881
1882
1883 for {
1884 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1885 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 || v_1.Op != OpCom64 {
1886 continue
1887 }
1888 x := v_1.Args[0]
1889 v.reset(OpNeg64)
1890 v.AddArg(x)
1891 return true
1892 }
1893 break
1894 }
1895
1896
1897 for {
1898 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1899 x := v_0
1900 if v_1.Op != OpSub64 {
1901 continue
1902 }
1903 _ = v_1.Args[1]
1904 y := v_1.Args[0]
1905 if x != v_1.Args[1] {
1906 continue
1907 }
1908 v.copyOf(y)
1909 return true
1910 }
1911 break
1912 }
1913
1914
1915 for {
1916 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1917 x := v_0
1918 if v_1.Op != OpAdd64 {
1919 continue
1920 }
1921 _ = v_1.Args[1]
1922 v_1_0 := v_1.Args[0]
1923 v_1_1 := v_1.Args[1]
1924 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1925 y := v_1_0
1926 if v_1_1.Op != OpSub64 {
1927 continue
1928 }
1929 _ = v_1_1.Args[1]
1930 z := v_1_1.Args[0]
1931 if x != v_1_1.Args[1] {
1932 continue
1933 }
1934 v.reset(OpAdd64)
1935 v.AddArg2(y, z)
1936 return true
1937 }
1938 }
1939 break
1940 }
1941
1942
1943
1944 for {
1945 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1946 if v_0.Op != OpAdd64 {
1947 continue
1948 }
1949 _ = v_0.Args[1]
1950 v_0_0 := v_0.Args[0]
1951 v_0_1 := v_0.Args[1]
1952 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1953 i := v_0_0
1954 if i.Op != OpConst64 {
1955 continue
1956 }
1957 t := i.Type
1958 z := v_0_1
1959 x := v_1
1960 if !(z.Op != OpConst64 && x.Op != OpConst64) {
1961 continue
1962 }
1963 v.reset(OpAdd64)
1964 v0 := b.NewValue0(v.Pos, OpAdd64, t)
1965 v0.AddArg2(z, x)
1966 v.AddArg2(i, v0)
1967 return true
1968 }
1969 }
1970 break
1971 }
1972
1973
1974
1975 for {
1976 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1977 if v_0.Op != OpSub64 {
1978 continue
1979 }
1980 z := v_0.Args[1]
1981 i := v_0.Args[0]
1982 if i.Op != OpConst64 {
1983 continue
1984 }
1985 t := i.Type
1986 x := v_1
1987 if !(z.Op != OpConst64 && x.Op != OpConst64) {
1988 continue
1989 }
1990 v.reset(OpAdd64)
1991 v0 := b.NewValue0(v.Pos, OpSub64, t)
1992 v0.AddArg2(x, z)
1993 v.AddArg2(i, v0)
1994 return true
1995 }
1996 break
1997 }
1998
1999
2000 for {
2001 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2002 if v_0.Op != OpConst64 {
2003 continue
2004 }
2005 t := v_0.Type
2006 c := auxIntToInt64(v_0.AuxInt)
2007 if v_1.Op != OpAdd64 {
2008 continue
2009 }
2010 _ = v_1.Args[1]
2011 v_1_0 := v_1.Args[0]
2012 v_1_1 := v_1.Args[1]
2013 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2014 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
2015 continue
2016 }
2017 d := auxIntToInt64(v_1_0.AuxInt)
2018 x := v_1_1
2019 v.reset(OpAdd64)
2020 v0 := b.NewValue0(v.Pos, OpConst64, t)
2021 v0.AuxInt = int64ToAuxInt(c + d)
2022 v.AddArg2(v0, x)
2023 return true
2024 }
2025 }
2026 break
2027 }
2028
2029
2030 for {
2031 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2032 if v_0.Op != OpConst64 {
2033 continue
2034 }
2035 t := v_0.Type
2036 c := auxIntToInt64(v_0.AuxInt)
2037 if v_1.Op != OpSub64 {
2038 continue
2039 }
2040 x := v_1.Args[1]
2041 v_1_0 := v_1.Args[0]
2042 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
2043 continue
2044 }
2045 d := auxIntToInt64(v_1_0.AuxInt)
2046 v.reset(OpSub64)
2047 v0 := b.NewValue0(v.Pos, OpConst64, t)
2048 v0.AuxInt = int64ToAuxInt(c + d)
2049 v.AddArg2(v0, x)
2050 return true
2051 }
2052 break
2053 }
2054
2055
2056
2057 for {
2058 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2059 if v_0.Op != OpLsh64x64 {
2060 continue
2061 }
2062 _ = v_0.Args[1]
2063 x := v_0.Args[0]
2064 z := v_0.Args[1]
2065 if z.Op != OpConst64 {
2066 continue
2067 }
2068 c := auxIntToInt64(z.AuxInt)
2069 if v_1.Op != OpRsh64Ux64 {
2070 continue
2071 }
2072 _ = v_1.Args[1]
2073 if x != v_1.Args[0] {
2074 continue
2075 }
2076 v_1_1 := v_1.Args[1]
2077 if v_1_1.Op != OpConst64 {
2078 continue
2079 }
2080 d := auxIntToInt64(v_1_1.AuxInt)
2081 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
2082 continue
2083 }
2084 v.reset(OpRotateLeft64)
2085 v.AddArg2(x, z)
2086 return true
2087 }
2088 break
2089 }
2090
2091
2092
2093 for {
2094 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2095 left := v_0
2096 if left.Op != OpLsh64x64 {
2097 continue
2098 }
2099 y := left.Args[1]
2100 x := left.Args[0]
2101 right := v_1
2102 if right.Op != OpRsh64Ux64 {
2103 continue
2104 }
2105 _ = right.Args[1]
2106 if x != right.Args[0] {
2107 continue
2108 }
2109 right_1 := right.Args[1]
2110 if right_1.Op != OpSub64 {
2111 continue
2112 }
2113 _ = right_1.Args[1]
2114 right_1_0 := right_1.Args[0]
2115 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2116 continue
2117 }
2118 v.reset(OpRotateLeft64)
2119 v.AddArg2(x, y)
2120 return true
2121 }
2122 break
2123 }
2124
2125
2126
2127 for {
2128 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2129 left := v_0
2130 if left.Op != OpLsh64x32 {
2131 continue
2132 }
2133 y := left.Args[1]
2134 x := left.Args[0]
2135 right := v_1
2136 if right.Op != OpRsh64Ux32 {
2137 continue
2138 }
2139 _ = right.Args[1]
2140 if x != right.Args[0] {
2141 continue
2142 }
2143 right_1 := right.Args[1]
2144 if right_1.Op != OpSub32 {
2145 continue
2146 }
2147 _ = right_1.Args[1]
2148 right_1_0 := right_1.Args[0]
2149 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2150 continue
2151 }
2152 v.reset(OpRotateLeft64)
2153 v.AddArg2(x, y)
2154 return true
2155 }
2156 break
2157 }
2158
2159
2160
2161 for {
2162 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2163 left := v_0
2164 if left.Op != OpLsh64x16 {
2165 continue
2166 }
2167 y := left.Args[1]
2168 x := left.Args[0]
2169 right := v_1
2170 if right.Op != OpRsh64Ux16 {
2171 continue
2172 }
2173 _ = right.Args[1]
2174 if x != right.Args[0] {
2175 continue
2176 }
2177 right_1 := right.Args[1]
2178 if right_1.Op != OpSub16 {
2179 continue
2180 }
2181 _ = right_1.Args[1]
2182 right_1_0 := right_1.Args[0]
2183 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2184 continue
2185 }
2186 v.reset(OpRotateLeft64)
2187 v.AddArg2(x, y)
2188 return true
2189 }
2190 break
2191 }
2192
2193
2194
2195 for {
2196 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2197 left := v_0
2198 if left.Op != OpLsh64x8 {
2199 continue
2200 }
2201 y := left.Args[1]
2202 x := left.Args[0]
2203 right := v_1
2204 if right.Op != OpRsh64Ux8 {
2205 continue
2206 }
2207 _ = right.Args[1]
2208 if x != right.Args[0] {
2209 continue
2210 }
2211 right_1 := right.Args[1]
2212 if right_1.Op != OpSub8 {
2213 continue
2214 }
2215 _ = right_1.Args[1]
2216 right_1_0 := right_1.Args[0]
2217 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2218 continue
2219 }
2220 v.reset(OpRotateLeft64)
2221 v.AddArg2(x, y)
2222 return true
2223 }
2224 break
2225 }
2226
2227
2228
2229 for {
2230 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2231 right := v_0
2232 if right.Op != OpRsh64Ux64 {
2233 continue
2234 }
2235 y := right.Args[1]
2236 x := right.Args[0]
2237 left := v_1
2238 if left.Op != OpLsh64x64 {
2239 continue
2240 }
2241 _ = left.Args[1]
2242 if x != left.Args[0] {
2243 continue
2244 }
2245 z := left.Args[1]
2246 if z.Op != OpSub64 {
2247 continue
2248 }
2249 _ = z.Args[1]
2250 z_0 := z.Args[0]
2251 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2252 continue
2253 }
2254 v.reset(OpRotateLeft64)
2255 v.AddArg2(x, z)
2256 return true
2257 }
2258 break
2259 }
2260
2261
2262
2263 for {
2264 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2265 right := v_0
2266 if right.Op != OpRsh64Ux32 {
2267 continue
2268 }
2269 y := right.Args[1]
2270 x := right.Args[0]
2271 left := v_1
2272 if left.Op != OpLsh64x32 {
2273 continue
2274 }
2275 _ = left.Args[1]
2276 if x != left.Args[0] {
2277 continue
2278 }
2279 z := left.Args[1]
2280 if z.Op != OpSub32 {
2281 continue
2282 }
2283 _ = z.Args[1]
2284 z_0 := z.Args[0]
2285 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2286 continue
2287 }
2288 v.reset(OpRotateLeft64)
2289 v.AddArg2(x, z)
2290 return true
2291 }
2292 break
2293 }
2294
2295
2296
2297 for {
2298 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2299 right := v_0
2300 if right.Op != OpRsh64Ux16 {
2301 continue
2302 }
2303 y := right.Args[1]
2304 x := right.Args[0]
2305 left := v_1
2306 if left.Op != OpLsh64x16 {
2307 continue
2308 }
2309 _ = left.Args[1]
2310 if x != left.Args[0] {
2311 continue
2312 }
2313 z := left.Args[1]
2314 if z.Op != OpSub16 {
2315 continue
2316 }
2317 _ = z.Args[1]
2318 z_0 := z.Args[0]
2319 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2320 continue
2321 }
2322 v.reset(OpRotateLeft64)
2323 v.AddArg2(x, z)
2324 return true
2325 }
2326 break
2327 }
2328
2329
2330
2331 for {
2332 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2333 right := v_0
2334 if right.Op != OpRsh64Ux8 {
2335 continue
2336 }
2337 y := right.Args[1]
2338 x := right.Args[0]
2339 left := v_1
2340 if left.Op != OpLsh64x8 {
2341 continue
2342 }
2343 _ = left.Args[1]
2344 if x != left.Args[0] {
2345 continue
2346 }
2347 z := left.Args[1]
2348 if z.Op != OpSub8 {
2349 continue
2350 }
2351 _ = z.Args[1]
2352 z_0 := z.Args[0]
2353 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2354 continue
2355 }
2356 v.reset(OpRotateLeft64)
2357 v.AddArg2(x, z)
2358 return true
2359 }
2360 break
2361 }
2362 return false
2363 }
2364 func rewriteValuegeneric_OpAdd64F(v *Value) bool {
2365 v_1 := v.Args[1]
2366 v_0 := v.Args[0]
2367
2368
2369
2370 for {
2371 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2372 if v_0.Op != OpConst64F {
2373 continue
2374 }
2375 c := auxIntToFloat64(v_0.AuxInt)
2376 if v_1.Op != OpConst64F {
2377 continue
2378 }
2379 d := auxIntToFloat64(v_1.AuxInt)
2380 if !(c+d == c+d) {
2381 continue
2382 }
2383 v.reset(OpConst64F)
2384 v.AuxInt = float64ToAuxInt(c + d)
2385 return true
2386 }
2387 break
2388 }
2389 return false
2390 }
2391 func rewriteValuegeneric_OpAdd64carry(v *Value) bool {
2392 v_2 := v.Args[2]
2393 v_1 := v.Args[1]
2394 v_0 := v.Args[0]
2395 b := v.Block
2396
2397
2398
2399 for {
2400 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2401 if v_0.Op != OpConst64 {
2402 continue
2403 }
2404 t := v_0.Type
2405 x := auxIntToInt64(v_0.AuxInt)
2406 if v_1.Op != OpConst64 {
2407 continue
2408 }
2409 y := auxIntToInt64(v_1.AuxInt)
2410 if v_2.Op != OpConst64 {
2411 continue
2412 }
2413 c := auxIntToInt64(v_2.AuxInt)
2414 if !(c >= 0 && c <= 1) {
2415 continue
2416 }
2417 v.reset(OpMakeTuple)
2418 v0 := b.NewValue0(v.Pos, OpConst64, t)
2419 v0.AuxInt = int64ToAuxInt(bitsAdd64(x, y, c).sum)
2420 v1 := b.NewValue0(v.Pos, OpConst64, t)
2421 v1.AuxInt = int64ToAuxInt(bitsAdd64(x, y, c).carry)
2422 v.AddArg2(v0, v1)
2423 return true
2424 }
2425 break
2426 }
2427 return false
2428 }
2429 func rewriteValuegeneric_OpAdd8(v *Value) bool {
2430 v_1 := v.Args[1]
2431 v_0 := v.Args[0]
2432 b := v.Block
2433 config := b.Func.Config
2434
2435
2436 for {
2437 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2438 if v_0.Op != OpConst8 {
2439 continue
2440 }
2441 c := auxIntToInt8(v_0.AuxInt)
2442 if v_1.Op != OpConst8 {
2443 continue
2444 }
2445 d := auxIntToInt8(v_1.AuxInt)
2446 v.reset(OpConst8)
2447 v.AuxInt = int8ToAuxInt(c + d)
2448 return true
2449 }
2450 break
2451 }
2452
2453
2454 for {
2455 t := v.Type
2456 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2457 if v_0.Op != OpMul8 {
2458 continue
2459 }
2460 _ = v_0.Args[1]
2461 v_0_0 := v_0.Args[0]
2462 v_0_1 := v_0.Args[1]
2463 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
2464 x := v_0_0
2465 y := v_0_1
2466 if v_1.Op != OpMul8 {
2467 continue
2468 }
2469 _ = v_1.Args[1]
2470 v_1_0 := v_1.Args[0]
2471 v_1_1 := v_1.Args[1]
2472 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
2473 if x != v_1_0 {
2474 continue
2475 }
2476 z := v_1_1
2477 v.reset(OpMul8)
2478 v0 := b.NewValue0(v.Pos, OpAdd8, t)
2479 v0.AddArg2(y, z)
2480 v.AddArg2(x, v0)
2481 return true
2482 }
2483 }
2484 }
2485 break
2486 }
2487
2488
2489 for {
2490 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2491 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
2492 continue
2493 }
2494 x := v_1
2495 v.copyOf(x)
2496 return true
2497 }
2498 break
2499 }
2500
2501
2502 for {
2503 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2504 x := v_0
2505 if v_1.Op != OpNeg8 {
2506 continue
2507 }
2508 y := v_1.Args[0]
2509 v.reset(OpSub8)
2510 v.AddArg2(x, y)
2511 return true
2512 }
2513 break
2514 }
2515
2516
2517 for {
2518 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2519 if v_0.Op != OpCom8 {
2520 continue
2521 }
2522 x := v_0.Args[0]
2523 if x != v_1 {
2524 continue
2525 }
2526 v.reset(OpConst8)
2527 v.AuxInt = int8ToAuxInt(-1)
2528 return true
2529 }
2530 break
2531 }
2532
2533
2534 for {
2535 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2536 if v_0.Op != OpSub8 {
2537 continue
2538 }
2539 t := v_0.Args[1]
2540 x := v_0.Args[0]
2541 if v_1.Op != OpAdd8 {
2542 continue
2543 }
2544 _ = v_1.Args[1]
2545 v_1_0 := v_1.Args[0]
2546 v_1_1 := v_1.Args[1]
2547 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2548 if t != v_1_0 {
2549 continue
2550 }
2551 y := v_1_1
2552 v.reset(OpAdd8)
2553 v.AddArg2(x, y)
2554 return true
2555 }
2556 }
2557 break
2558 }
2559
2560
2561 for {
2562 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2563 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 1 || v_1.Op != OpCom8 {
2564 continue
2565 }
2566 x := v_1.Args[0]
2567 v.reset(OpNeg8)
2568 v.AddArg(x)
2569 return true
2570 }
2571 break
2572 }
2573
2574
2575 for {
2576 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2577 x := v_0
2578 if v_1.Op != OpSub8 {
2579 continue
2580 }
2581 _ = v_1.Args[1]
2582 y := v_1.Args[0]
2583 if x != v_1.Args[1] {
2584 continue
2585 }
2586 v.copyOf(y)
2587 return true
2588 }
2589 break
2590 }
2591
2592
2593 for {
2594 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2595 x := v_0
2596 if v_1.Op != OpAdd8 {
2597 continue
2598 }
2599 _ = v_1.Args[1]
2600 v_1_0 := v_1.Args[0]
2601 v_1_1 := v_1.Args[1]
2602 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2603 y := v_1_0
2604 if v_1_1.Op != OpSub8 {
2605 continue
2606 }
2607 _ = v_1_1.Args[1]
2608 z := v_1_1.Args[0]
2609 if x != v_1_1.Args[1] {
2610 continue
2611 }
2612 v.reset(OpAdd8)
2613 v.AddArg2(y, z)
2614 return true
2615 }
2616 }
2617 break
2618 }
2619
2620
2621
2622 for {
2623 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2624 if v_0.Op != OpAdd8 {
2625 continue
2626 }
2627 _ = v_0.Args[1]
2628 v_0_0 := v_0.Args[0]
2629 v_0_1 := v_0.Args[1]
2630 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
2631 i := v_0_0
2632 if i.Op != OpConst8 {
2633 continue
2634 }
2635 t := i.Type
2636 z := v_0_1
2637 x := v_1
2638 if !(z.Op != OpConst8 && x.Op != OpConst8) {
2639 continue
2640 }
2641 v.reset(OpAdd8)
2642 v0 := b.NewValue0(v.Pos, OpAdd8, t)
2643 v0.AddArg2(z, x)
2644 v.AddArg2(i, v0)
2645 return true
2646 }
2647 }
2648 break
2649 }
2650
2651
2652
2653 for {
2654 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2655 if v_0.Op != OpSub8 {
2656 continue
2657 }
2658 z := v_0.Args[1]
2659 i := v_0.Args[0]
2660 if i.Op != OpConst8 {
2661 continue
2662 }
2663 t := i.Type
2664 x := v_1
2665 if !(z.Op != OpConst8 && x.Op != OpConst8) {
2666 continue
2667 }
2668 v.reset(OpAdd8)
2669 v0 := b.NewValue0(v.Pos, OpSub8, t)
2670 v0.AddArg2(x, z)
2671 v.AddArg2(i, v0)
2672 return true
2673 }
2674 break
2675 }
2676
2677
2678 for {
2679 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2680 if v_0.Op != OpConst8 {
2681 continue
2682 }
2683 t := v_0.Type
2684 c := auxIntToInt8(v_0.AuxInt)
2685 if v_1.Op != OpAdd8 {
2686 continue
2687 }
2688 _ = v_1.Args[1]
2689 v_1_0 := v_1.Args[0]
2690 v_1_1 := v_1.Args[1]
2691 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2692 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
2693 continue
2694 }
2695 d := auxIntToInt8(v_1_0.AuxInt)
2696 x := v_1_1
2697 v.reset(OpAdd8)
2698 v0 := b.NewValue0(v.Pos, OpConst8, t)
2699 v0.AuxInt = int8ToAuxInt(c + d)
2700 v.AddArg2(v0, x)
2701 return true
2702 }
2703 }
2704 break
2705 }
2706
2707
2708 for {
2709 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2710 if v_0.Op != OpConst8 {
2711 continue
2712 }
2713 t := v_0.Type
2714 c := auxIntToInt8(v_0.AuxInt)
2715 if v_1.Op != OpSub8 {
2716 continue
2717 }
2718 x := v_1.Args[1]
2719 v_1_0 := v_1.Args[0]
2720 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
2721 continue
2722 }
2723 d := auxIntToInt8(v_1_0.AuxInt)
2724 v.reset(OpSub8)
2725 v0 := b.NewValue0(v.Pos, OpConst8, t)
2726 v0.AuxInt = int8ToAuxInt(c + d)
2727 v.AddArg2(v0, x)
2728 return true
2729 }
2730 break
2731 }
2732
2733
2734
2735 for {
2736 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2737 if v_0.Op != OpLsh8x64 {
2738 continue
2739 }
2740 _ = v_0.Args[1]
2741 x := v_0.Args[0]
2742 z := v_0.Args[1]
2743 if z.Op != OpConst64 {
2744 continue
2745 }
2746 c := auxIntToInt64(z.AuxInt)
2747 if v_1.Op != OpRsh8Ux64 {
2748 continue
2749 }
2750 _ = v_1.Args[1]
2751 if x != v_1.Args[0] {
2752 continue
2753 }
2754 v_1_1 := v_1.Args[1]
2755 if v_1_1.Op != OpConst64 {
2756 continue
2757 }
2758 d := auxIntToInt64(v_1_1.AuxInt)
2759 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
2760 continue
2761 }
2762 v.reset(OpRotateLeft8)
2763 v.AddArg2(x, z)
2764 return true
2765 }
2766 break
2767 }
2768
2769
2770
2771 for {
2772 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2773 left := v_0
2774 if left.Op != OpLsh8x64 {
2775 continue
2776 }
2777 y := left.Args[1]
2778 x := left.Args[0]
2779 right := v_1
2780 if right.Op != OpRsh8Ux64 {
2781 continue
2782 }
2783 _ = right.Args[1]
2784 if x != right.Args[0] {
2785 continue
2786 }
2787 right_1 := right.Args[1]
2788 if right_1.Op != OpSub64 {
2789 continue
2790 }
2791 _ = right_1.Args[1]
2792 right_1_0 := right_1.Args[0]
2793 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2794 continue
2795 }
2796 v.reset(OpRotateLeft8)
2797 v.AddArg2(x, y)
2798 return true
2799 }
2800 break
2801 }
2802
2803
2804
2805 for {
2806 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2807 left := v_0
2808 if left.Op != OpLsh8x32 {
2809 continue
2810 }
2811 y := left.Args[1]
2812 x := left.Args[0]
2813 right := v_1
2814 if right.Op != OpRsh8Ux32 {
2815 continue
2816 }
2817 _ = right.Args[1]
2818 if x != right.Args[0] {
2819 continue
2820 }
2821 right_1 := right.Args[1]
2822 if right_1.Op != OpSub32 {
2823 continue
2824 }
2825 _ = right_1.Args[1]
2826 right_1_0 := right_1.Args[0]
2827 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2828 continue
2829 }
2830 v.reset(OpRotateLeft8)
2831 v.AddArg2(x, y)
2832 return true
2833 }
2834 break
2835 }
2836
2837
2838
2839 for {
2840 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2841 left := v_0
2842 if left.Op != OpLsh8x16 {
2843 continue
2844 }
2845 y := left.Args[1]
2846 x := left.Args[0]
2847 right := v_1
2848 if right.Op != OpRsh8Ux16 {
2849 continue
2850 }
2851 _ = right.Args[1]
2852 if x != right.Args[0] {
2853 continue
2854 }
2855 right_1 := right.Args[1]
2856 if right_1.Op != OpSub16 {
2857 continue
2858 }
2859 _ = right_1.Args[1]
2860 right_1_0 := right_1.Args[0]
2861 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2862 continue
2863 }
2864 v.reset(OpRotateLeft8)
2865 v.AddArg2(x, y)
2866 return true
2867 }
2868 break
2869 }
2870
2871
2872
2873 for {
2874 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2875 left := v_0
2876 if left.Op != OpLsh8x8 {
2877 continue
2878 }
2879 y := left.Args[1]
2880 x := left.Args[0]
2881 right := v_1
2882 if right.Op != OpRsh8Ux8 {
2883 continue
2884 }
2885 _ = right.Args[1]
2886 if x != right.Args[0] {
2887 continue
2888 }
2889 right_1 := right.Args[1]
2890 if right_1.Op != OpSub8 {
2891 continue
2892 }
2893 _ = right_1.Args[1]
2894 right_1_0 := right_1.Args[0]
2895 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2896 continue
2897 }
2898 v.reset(OpRotateLeft8)
2899 v.AddArg2(x, y)
2900 return true
2901 }
2902 break
2903 }
2904
2905
2906
2907 for {
2908 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2909 right := v_0
2910 if right.Op != OpRsh8Ux64 {
2911 continue
2912 }
2913 y := right.Args[1]
2914 x := right.Args[0]
2915 left := v_1
2916 if left.Op != OpLsh8x64 {
2917 continue
2918 }
2919 _ = left.Args[1]
2920 if x != left.Args[0] {
2921 continue
2922 }
2923 z := left.Args[1]
2924 if z.Op != OpSub64 {
2925 continue
2926 }
2927 _ = z.Args[1]
2928 z_0 := z.Args[0]
2929 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2930 continue
2931 }
2932 v.reset(OpRotateLeft8)
2933 v.AddArg2(x, z)
2934 return true
2935 }
2936 break
2937 }
2938
2939
2940
2941 for {
2942 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2943 right := v_0
2944 if right.Op != OpRsh8Ux32 {
2945 continue
2946 }
2947 y := right.Args[1]
2948 x := right.Args[0]
2949 left := v_1
2950 if left.Op != OpLsh8x32 {
2951 continue
2952 }
2953 _ = left.Args[1]
2954 if x != left.Args[0] {
2955 continue
2956 }
2957 z := left.Args[1]
2958 if z.Op != OpSub32 {
2959 continue
2960 }
2961 _ = z.Args[1]
2962 z_0 := z.Args[0]
2963 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2964 continue
2965 }
2966 v.reset(OpRotateLeft8)
2967 v.AddArg2(x, z)
2968 return true
2969 }
2970 break
2971 }
2972
2973
2974
2975 for {
2976 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2977 right := v_0
2978 if right.Op != OpRsh8Ux16 {
2979 continue
2980 }
2981 y := right.Args[1]
2982 x := right.Args[0]
2983 left := v_1
2984 if left.Op != OpLsh8x16 {
2985 continue
2986 }
2987 _ = left.Args[1]
2988 if x != left.Args[0] {
2989 continue
2990 }
2991 z := left.Args[1]
2992 if z.Op != OpSub16 {
2993 continue
2994 }
2995 _ = z.Args[1]
2996 z_0 := z.Args[0]
2997 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2998 continue
2999 }
3000 v.reset(OpRotateLeft8)
3001 v.AddArg2(x, z)
3002 return true
3003 }
3004 break
3005 }
3006
3007
3008
3009 for {
3010 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3011 right := v_0
3012 if right.Op != OpRsh8Ux8 {
3013 continue
3014 }
3015 y := right.Args[1]
3016 x := right.Args[0]
3017 left := v_1
3018 if left.Op != OpLsh8x8 {
3019 continue
3020 }
3021 _ = left.Args[1]
3022 if x != left.Args[0] {
3023 continue
3024 }
3025 z := left.Args[1]
3026 if z.Op != OpSub8 {
3027 continue
3028 }
3029 _ = z.Args[1]
3030 z_0 := z.Args[0]
3031 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
3032 continue
3033 }
3034 v.reset(OpRotateLeft8)
3035 v.AddArg2(x, z)
3036 return true
3037 }
3038 break
3039 }
3040 return false
3041 }
3042 func rewriteValuegeneric_OpAddPtr(v *Value) bool {
3043 v_1 := v.Args[1]
3044 v_0 := v.Args[0]
3045
3046
3047 for {
3048 t := v.Type
3049 x := v_0
3050 if v_1.Op != OpConst64 {
3051 break
3052 }
3053 c := auxIntToInt64(v_1.AuxInt)
3054 v.reset(OpOffPtr)
3055 v.Type = t
3056 v.AuxInt = int64ToAuxInt(c)
3057 v.AddArg(x)
3058 return true
3059 }
3060
3061
3062 for {
3063 t := v.Type
3064 x := v_0
3065 if v_1.Op != OpConst32 {
3066 break
3067 }
3068 c := auxIntToInt32(v_1.AuxInt)
3069 v.reset(OpOffPtr)
3070 v.Type = t
3071 v.AuxInt = int64ToAuxInt(int64(c))
3072 v.AddArg(x)
3073 return true
3074 }
3075 return false
3076 }
3077 func rewriteValuegeneric_OpAnd16(v *Value) bool {
3078 v_1 := v.Args[1]
3079 v_0 := v.Args[0]
3080 b := v.Block
3081
3082
3083 for {
3084 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3085 if v_0.Op != OpConst16 {
3086 continue
3087 }
3088 c := auxIntToInt16(v_0.AuxInt)
3089 if v_1.Op != OpConst16 {
3090 continue
3091 }
3092 d := auxIntToInt16(v_1.AuxInt)
3093 v.reset(OpConst16)
3094 v.AuxInt = int16ToAuxInt(c & d)
3095 return true
3096 }
3097 break
3098 }
3099
3100
3101 for {
3102 t := v.Type
3103 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3104 if v_0.Op != OpCom16 {
3105 continue
3106 }
3107 x := v_0.Args[0]
3108 if v_1.Op != OpCom16 {
3109 continue
3110 }
3111 y := v_1.Args[0]
3112 v.reset(OpCom16)
3113 v0 := b.NewValue0(v.Pos, OpOr16, t)
3114 v0.AddArg2(x, y)
3115 v.AddArg(v0)
3116 return true
3117 }
3118 break
3119 }
3120
3121
3122
3123 for {
3124 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3125 if v_0.Op != OpConst16 {
3126 continue
3127 }
3128 m := auxIntToInt16(v_0.AuxInt)
3129 if v_1.Op != OpRsh16Ux64 {
3130 continue
3131 }
3132 _ = v_1.Args[1]
3133 v_1_1 := v_1.Args[1]
3134 if v_1_1.Op != OpConst64 {
3135 continue
3136 }
3137 c := auxIntToInt64(v_1_1.AuxInt)
3138 if !(c >= int64(16-ntz16(m))) {
3139 continue
3140 }
3141 v.reset(OpConst16)
3142 v.AuxInt = int16ToAuxInt(0)
3143 return true
3144 }
3145 break
3146 }
3147
3148
3149
3150 for {
3151 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3152 if v_0.Op != OpConst16 {
3153 continue
3154 }
3155 m := auxIntToInt16(v_0.AuxInt)
3156 if v_1.Op != OpLsh16x64 {
3157 continue
3158 }
3159 _ = v_1.Args[1]
3160 v_1_1 := v_1.Args[1]
3161 if v_1_1.Op != OpConst64 {
3162 continue
3163 }
3164 c := auxIntToInt64(v_1_1.AuxInt)
3165 if !(c >= int64(16-nlz16(m))) {
3166 continue
3167 }
3168 v.reset(OpConst16)
3169 v.AuxInt = int16ToAuxInt(0)
3170 return true
3171 }
3172 break
3173 }
3174
3175
3176 for {
3177 x := v_0
3178 if x != v_1 {
3179 break
3180 }
3181 v.copyOf(x)
3182 return true
3183 }
3184
3185
3186 for {
3187 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3188 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
3189 continue
3190 }
3191 x := v_1
3192 v.copyOf(x)
3193 return true
3194 }
3195 break
3196 }
3197
3198
3199 for {
3200 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3201 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
3202 continue
3203 }
3204 v.reset(OpConst16)
3205 v.AuxInt = int16ToAuxInt(0)
3206 return true
3207 }
3208 break
3209 }
3210
3211
3212 for {
3213 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3214 if v_0.Op != OpCom16 {
3215 continue
3216 }
3217 x := v_0.Args[0]
3218 if x != v_1 {
3219 continue
3220 }
3221 v.reset(OpConst16)
3222 v.AuxInt = int16ToAuxInt(0)
3223 return true
3224 }
3225 break
3226 }
3227
3228
3229 for {
3230 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3231 x := v_0
3232 if v_1.Op != OpAnd16 {
3233 continue
3234 }
3235 _ = v_1.Args[1]
3236 v_1_0 := v_1.Args[0]
3237 v_1_1 := v_1.Args[1]
3238 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3239 if x != v_1_0 {
3240 continue
3241 }
3242 y := v_1_1
3243 v.reset(OpAnd16)
3244 v.AddArg2(x, y)
3245 return true
3246 }
3247 }
3248 break
3249 }
3250
3251
3252
3253 for {
3254 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3255 if v_0.Op != OpAnd16 {
3256 continue
3257 }
3258 _ = v_0.Args[1]
3259 v_0_0 := v_0.Args[0]
3260 v_0_1 := v_0.Args[1]
3261 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3262 i := v_0_0
3263 if i.Op != OpConst16 {
3264 continue
3265 }
3266 t := i.Type
3267 z := v_0_1
3268 x := v_1
3269 if !(z.Op != OpConst16 && x.Op != OpConst16) {
3270 continue
3271 }
3272 v.reset(OpAnd16)
3273 v0 := b.NewValue0(v.Pos, OpAnd16, t)
3274 v0.AddArg2(z, x)
3275 v.AddArg2(i, v0)
3276 return true
3277 }
3278 }
3279 break
3280 }
3281
3282
3283 for {
3284 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3285 if v_0.Op != OpConst16 {
3286 continue
3287 }
3288 t := v_0.Type
3289 c := auxIntToInt16(v_0.AuxInt)
3290 if v_1.Op != OpAnd16 {
3291 continue
3292 }
3293 _ = v_1.Args[1]
3294 v_1_0 := v_1.Args[0]
3295 v_1_1 := v_1.Args[1]
3296 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3297 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
3298 continue
3299 }
3300 d := auxIntToInt16(v_1_0.AuxInt)
3301 x := v_1_1
3302 v.reset(OpAnd16)
3303 v0 := b.NewValue0(v.Pos, OpConst16, t)
3304 v0.AuxInt = int16ToAuxInt(c & d)
3305 v.AddArg2(v0, x)
3306 return true
3307 }
3308 }
3309 break
3310 }
3311 return false
3312 }
3313 func rewriteValuegeneric_OpAnd32(v *Value) bool {
3314 v_1 := v.Args[1]
3315 v_0 := v.Args[0]
3316 b := v.Block
3317
3318
3319 for {
3320 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3321 if v_0.Op != OpConst32 {
3322 continue
3323 }
3324 c := auxIntToInt32(v_0.AuxInt)
3325 if v_1.Op != OpConst32 {
3326 continue
3327 }
3328 d := auxIntToInt32(v_1.AuxInt)
3329 v.reset(OpConst32)
3330 v.AuxInt = int32ToAuxInt(c & d)
3331 return true
3332 }
3333 break
3334 }
3335
3336
3337 for {
3338 t := v.Type
3339 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3340 if v_0.Op != OpCom32 {
3341 continue
3342 }
3343 x := v_0.Args[0]
3344 if v_1.Op != OpCom32 {
3345 continue
3346 }
3347 y := v_1.Args[0]
3348 v.reset(OpCom32)
3349 v0 := b.NewValue0(v.Pos, OpOr32, t)
3350 v0.AddArg2(x, y)
3351 v.AddArg(v0)
3352 return true
3353 }
3354 break
3355 }
3356
3357
3358
3359 for {
3360 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3361 if v_0.Op != OpConst32 {
3362 continue
3363 }
3364 m := auxIntToInt32(v_0.AuxInt)
3365 if v_1.Op != OpRsh32Ux64 {
3366 continue
3367 }
3368 _ = v_1.Args[1]
3369 v_1_1 := v_1.Args[1]
3370 if v_1_1.Op != OpConst64 {
3371 continue
3372 }
3373 c := auxIntToInt64(v_1_1.AuxInt)
3374 if !(c >= int64(32-ntz32(m))) {
3375 continue
3376 }
3377 v.reset(OpConst32)
3378 v.AuxInt = int32ToAuxInt(0)
3379 return true
3380 }
3381 break
3382 }
3383
3384
3385
3386 for {
3387 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3388 if v_0.Op != OpConst32 {
3389 continue
3390 }
3391 m := auxIntToInt32(v_0.AuxInt)
3392 if v_1.Op != OpLsh32x64 {
3393 continue
3394 }
3395 _ = v_1.Args[1]
3396 v_1_1 := v_1.Args[1]
3397 if v_1_1.Op != OpConst64 {
3398 continue
3399 }
3400 c := auxIntToInt64(v_1_1.AuxInt)
3401 if !(c >= int64(32-nlz32(m))) {
3402 continue
3403 }
3404 v.reset(OpConst32)
3405 v.AuxInt = int32ToAuxInt(0)
3406 return true
3407 }
3408 break
3409 }
3410
3411
3412 for {
3413 x := v_0
3414 if x != v_1 {
3415 break
3416 }
3417 v.copyOf(x)
3418 return true
3419 }
3420
3421
3422 for {
3423 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3424 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
3425 continue
3426 }
3427 x := v_1
3428 v.copyOf(x)
3429 return true
3430 }
3431 break
3432 }
3433
3434
3435 for {
3436 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3437 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
3438 continue
3439 }
3440 v.reset(OpConst32)
3441 v.AuxInt = int32ToAuxInt(0)
3442 return true
3443 }
3444 break
3445 }
3446
3447
3448 for {
3449 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3450 if v_0.Op != OpCom32 {
3451 continue
3452 }
3453 x := v_0.Args[0]
3454 if x != v_1 {
3455 continue
3456 }
3457 v.reset(OpConst32)
3458 v.AuxInt = int32ToAuxInt(0)
3459 return true
3460 }
3461 break
3462 }
3463
3464
3465 for {
3466 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3467 x := v_0
3468 if v_1.Op != OpAnd32 {
3469 continue
3470 }
3471 _ = v_1.Args[1]
3472 v_1_0 := v_1.Args[0]
3473 v_1_1 := v_1.Args[1]
3474 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3475 if x != v_1_0 {
3476 continue
3477 }
3478 y := v_1_1
3479 v.reset(OpAnd32)
3480 v.AddArg2(x, y)
3481 return true
3482 }
3483 }
3484 break
3485 }
3486
3487
3488
3489 for {
3490 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3491 if v_0.Op != OpAnd32 {
3492 continue
3493 }
3494 _ = v_0.Args[1]
3495 v_0_0 := v_0.Args[0]
3496 v_0_1 := v_0.Args[1]
3497 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3498 i := v_0_0
3499 if i.Op != OpConst32 {
3500 continue
3501 }
3502 t := i.Type
3503 z := v_0_1
3504 x := v_1
3505 if !(z.Op != OpConst32 && x.Op != OpConst32) {
3506 continue
3507 }
3508 v.reset(OpAnd32)
3509 v0 := b.NewValue0(v.Pos, OpAnd32, t)
3510 v0.AddArg2(z, x)
3511 v.AddArg2(i, v0)
3512 return true
3513 }
3514 }
3515 break
3516 }
3517
3518
3519 for {
3520 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3521 if v_0.Op != OpConst32 {
3522 continue
3523 }
3524 t := v_0.Type
3525 c := auxIntToInt32(v_0.AuxInt)
3526 if v_1.Op != OpAnd32 {
3527 continue
3528 }
3529 _ = v_1.Args[1]
3530 v_1_0 := v_1.Args[0]
3531 v_1_1 := v_1.Args[1]
3532 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3533 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
3534 continue
3535 }
3536 d := auxIntToInt32(v_1_0.AuxInt)
3537 x := v_1_1
3538 v.reset(OpAnd32)
3539 v0 := b.NewValue0(v.Pos, OpConst32, t)
3540 v0.AuxInt = int32ToAuxInt(c & d)
3541 v.AddArg2(v0, x)
3542 return true
3543 }
3544 }
3545 break
3546 }
3547 return false
3548 }
3549 func rewriteValuegeneric_OpAnd64(v *Value) bool {
3550 v_1 := v.Args[1]
3551 v_0 := v.Args[0]
3552 b := v.Block
3553
3554
3555 for {
3556 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3557 if v_0.Op != OpConst64 {
3558 continue
3559 }
3560 c := auxIntToInt64(v_0.AuxInt)
3561 if v_1.Op != OpConst64 {
3562 continue
3563 }
3564 d := auxIntToInt64(v_1.AuxInt)
3565 v.reset(OpConst64)
3566 v.AuxInt = int64ToAuxInt(c & d)
3567 return true
3568 }
3569 break
3570 }
3571
3572
3573 for {
3574 t := v.Type
3575 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3576 if v_0.Op != OpCom64 {
3577 continue
3578 }
3579 x := v_0.Args[0]
3580 if v_1.Op != OpCom64 {
3581 continue
3582 }
3583 y := v_1.Args[0]
3584 v.reset(OpCom64)
3585 v0 := b.NewValue0(v.Pos, OpOr64, t)
3586 v0.AddArg2(x, y)
3587 v.AddArg(v0)
3588 return true
3589 }
3590 break
3591 }
3592
3593
3594
3595 for {
3596 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3597 if v_0.Op != OpConst64 {
3598 continue
3599 }
3600 m := auxIntToInt64(v_0.AuxInt)
3601 if v_1.Op != OpRsh64Ux64 {
3602 continue
3603 }
3604 _ = v_1.Args[1]
3605 v_1_1 := v_1.Args[1]
3606 if v_1_1.Op != OpConst64 {
3607 continue
3608 }
3609 c := auxIntToInt64(v_1_1.AuxInt)
3610 if !(c >= int64(64-ntz64(m))) {
3611 continue
3612 }
3613 v.reset(OpConst64)
3614 v.AuxInt = int64ToAuxInt(0)
3615 return true
3616 }
3617 break
3618 }
3619
3620
3621
3622 for {
3623 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3624 if v_0.Op != OpConst64 {
3625 continue
3626 }
3627 m := auxIntToInt64(v_0.AuxInt)
3628 if v_1.Op != OpLsh64x64 {
3629 continue
3630 }
3631 _ = v_1.Args[1]
3632 v_1_1 := v_1.Args[1]
3633 if v_1_1.Op != OpConst64 {
3634 continue
3635 }
3636 c := auxIntToInt64(v_1_1.AuxInt)
3637 if !(c >= int64(64-nlz64(m))) {
3638 continue
3639 }
3640 v.reset(OpConst64)
3641 v.AuxInt = int64ToAuxInt(0)
3642 return true
3643 }
3644 break
3645 }
3646
3647
3648 for {
3649 x := v_0
3650 if x != v_1 {
3651 break
3652 }
3653 v.copyOf(x)
3654 return true
3655 }
3656
3657
3658 for {
3659 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3660 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
3661 continue
3662 }
3663 x := v_1
3664 v.copyOf(x)
3665 return true
3666 }
3667 break
3668 }
3669
3670
3671 for {
3672 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3673 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
3674 continue
3675 }
3676 v.reset(OpConst64)
3677 v.AuxInt = int64ToAuxInt(0)
3678 return true
3679 }
3680 break
3681 }
3682
3683
3684 for {
3685 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3686 if v_0.Op != OpCom64 {
3687 continue
3688 }
3689 x := v_0.Args[0]
3690 if x != v_1 {
3691 continue
3692 }
3693 v.reset(OpConst64)
3694 v.AuxInt = int64ToAuxInt(0)
3695 return true
3696 }
3697 break
3698 }
3699
3700
3701 for {
3702 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3703 x := v_0
3704 if v_1.Op != OpAnd64 {
3705 continue
3706 }
3707 _ = v_1.Args[1]
3708 v_1_0 := v_1.Args[0]
3709 v_1_1 := v_1.Args[1]
3710 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3711 if x != v_1_0 {
3712 continue
3713 }
3714 y := v_1_1
3715 v.reset(OpAnd64)
3716 v.AddArg2(x, y)
3717 return true
3718 }
3719 }
3720 break
3721 }
3722
3723
3724
3725 for {
3726 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3727 if v_0.Op != OpAnd64 {
3728 continue
3729 }
3730 _ = v_0.Args[1]
3731 v_0_0 := v_0.Args[0]
3732 v_0_1 := v_0.Args[1]
3733 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3734 i := v_0_0
3735 if i.Op != OpConst64 {
3736 continue
3737 }
3738 t := i.Type
3739 z := v_0_1
3740 x := v_1
3741 if !(z.Op != OpConst64 && x.Op != OpConst64) {
3742 continue
3743 }
3744 v.reset(OpAnd64)
3745 v0 := b.NewValue0(v.Pos, OpAnd64, t)
3746 v0.AddArg2(z, x)
3747 v.AddArg2(i, v0)
3748 return true
3749 }
3750 }
3751 break
3752 }
3753
3754
3755 for {
3756 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3757 if v_0.Op != OpConst64 {
3758 continue
3759 }
3760 t := v_0.Type
3761 c := auxIntToInt64(v_0.AuxInt)
3762 if v_1.Op != OpAnd64 {
3763 continue
3764 }
3765 _ = v_1.Args[1]
3766 v_1_0 := v_1.Args[0]
3767 v_1_1 := v_1.Args[1]
3768 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3769 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
3770 continue
3771 }
3772 d := auxIntToInt64(v_1_0.AuxInt)
3773 x := v_1_1
3774 v.reset(OpAnd64)
3775 v0 := b.NewValue0(v.Pos, OpConst64, t)
3776 v0.AuxInt = int64ToAuxInt(c & d)
3777 v.AddArg2(v0, x)
3778 return true
3779 }
3780 }
3781 break
3782 }
3783 return false
3784 }
3785 func rewriteValuegeneric_OpAnd8(v *Value) bool {
3786 v_1 := v.Args[1]
3787 v_0 := v.Args[0]
3788 b := v.Block
3789
3790
3791 for {
3792 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3793 if v_0.Op != OpConst8 {
3794 continue
3795 }
3796 c := auxIntToInt8(v_0.AuxInt)
3797 if v_1.Op != OpConst8 {
3798 continue
3799 }
3800 d := auxIntToInt8(v_1.AuxInt)
3801 v.reset(OpConst8)
3802 v.AuxInt = int8ToAuxInt(c & d)
3803 return true
3804 }
3805 break
3806 }
3807
3808
3809 for {
3810 t := v.Type
3811 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3812 if v_0.Op != OpCom8 {
3813 continue
3814 }
3815 x := v_0.Args[0]
3816 if v_1.Op != OpCom8 {
3817 continue
3818 }
3819 y := v_1.Args[0]
3820 v.reset(OpCom8)
3821 v0 := b.NewValue0(v.Pos, OpOr8, t)
3822 v0.AddArg2(x, y)
3823 v.AddArg(v0)
3824 return true
3825 }
3826 break
3827 }
3828
3829
3830
3831 for {
3832 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3833 if v_0.Op != OpConst8 {
3834 continue
3835 }
3836 m := auxIntToInt8(v_0.AuxInt)
3837 if v_1.Op != OpRsh8Ux64 {
3838 continue
3839 }
3840 _ = v_1.Args[1]
3841 v_1_1 := v_1.Args[1]
3842 if v_1_1.Op != OpConst64 {
3843 continue
3844 }
3845 c := auxIntToInt64(v_1_1.AuxInt)
3846 if !(c >= int64(8-ntz8(m))) {
3847 continue
3848 }
3849 v.reset(OpConst8)
3850 v.AuxInt = int8ToAuxInt(0)
3851 return true
3852 }
3853 break
3854 }
3855
3856
3857
3858 for {
3859 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3860 if v_0.Op != OpConst8 {
3861 continue
3862 }
3863 m := auxIntToInt8(v_0.AuxInt)
3864 if v_1.Op != OpLsh8x64 {
3865 continue
3866 }
3867 _ = v_1.Args[1]
3868 v_1_1 := v_1.Args[1]
3869 if v_1_1.Op != OpConst64 {
3870 continue
3871 }
3872 c := auxIntToInt64(v_1_1.AuxInt)
3873 if !(c >= int64(8-nlz8(m))) {
3874 continue
3875 }
3876 v.reset(OpConst8)
3877 v.AuxInt = int8ToAuxInt(0)
3878 return true
3879 }
3880 break
3881 }
3882
3883
3884 for {
3885 x := v_0
3886 if x != v_1 {
3887 break
3888 }
3889 v.copyOf(x)
3890 return true
3891 }
3892
3893
3894 for {
3895 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3896 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
3897 continue
3898 }
3899 x := v_1
3900 v.copyOf(x)
3901 return true
3902 }
3903 break
3904 }
3905
3906
3907 for {
3908 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3909 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
3910 continue
3911 }
3912 v.reset(OpConst8)
3913 v.AuxInt = int8ToAuxInt(0)
3914 return true
3915 }
3916 break
3917 }
3918
3919
3920 for {
3921 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3922 if v_0.Op != OpCom8 {
3923 continue
3924 }
3925 x := v_0.Args[0]
3926 if x != v_1 {
3927 continue
3928 }
3929 v.reset(OpConst8)
3930 v.AuxInt = int8ToAuxInt(0)
3931 return true
3932 }
3933 break
3934 }
3935
3936
3937 for {
3938 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3939 x := v_0
3940 if v_1.Op != OpAnd8 {
3941 continue
3942 }
3943 _ = v_1.Args[1]
3944 v_1_0 := v_1.Args[0]
3945 v_1_1 := v_1.Args[1]
3946 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3947 if x != v_1_0 {
3948 continue
3949 }
3950 y := v_1_1
3951 v.reset(OpAnd8)
3952 v.AddArg2(x, y)
3953 return true
3954 }
3955 }
3956 break
3957 }
3958
3959
3960
3961 for {
3962 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3963 if v_0.Op != OpAnd8 {
3964 continue
3965 }
3966 _ = v_0.Args[1]
3967 v_0_0 := v_0.Args[0]
3968 v_0_1 := v_0.Args[1]
3969 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3970 i := v_0_0
3971 if i.Op != OpConst8 {
3972 continue
3973 }
3974 t := i.Type
3975 z := v_0_1
3976 x := v_1
3977 if !(z.Op != OpConst8 && x.Op != OpConst8) {
3978 continue
3979 }
3980 v.reset(OpAnd8)
3981 v0 := b.NewValue0(v.Pos, OpAnd8, t)
3982 v0.AddArg2(z, x)
3983 v.AddArg2(i, v0)
3984 return true
3985 }
3986 }
3987 break
3988 }
3989
3990
3991 for {
3992 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3993 if v_0.Op != OpConst8 {
3994 continue
3995 }
3996 t := v_0.Type
3997 c := auxIntToInt8(v_0.AuxInt)
3998 if v_1.Op != OpAnd8 {
3999 continue
4000 }
4001 _ = v_1.Args[1]
4002 v_1_0 := v_1.Args[0]
4003 v_1_1 := v_1.Args[1]
4004 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
4005 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
4006 continue
4007 }
4008 d := auxIntToInt8(v_1_0.AuxInt)
4009 x := v_1_1
4010 v.reset(OpAnd8)
4011 v0 := b.NewValue0(v.Pos, OpConst8, t)
4012 v0.AuxInt = int8ToAuxInt(c & d)
4013 v.AddArg2(v0, x)
4014 return true
4015 }
4016 }
4017 break
4018 }
4019 return false
4020 }
4021 func rewriteValuegeneric_OpAndB(v *Value) bool {
4022 v_1 := v.Args[1]
4023 v_0 := v.Args[0]
4024 b := v.Block
4025
4026
4027
4028 for {
4029 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4030 if v_0.Op != OpLeq64 {
4031 continue
4032 }
4033 x := v_0.Args[1]
4034 v_0_0 := v_0.Args[0]
4035 if v_0_0.Op != OpConst64 {
4036 continue
4037 }
4038 c := auxIntToInt64(v_0_0.AuxInt)
4039 if v_1.Op != OpLess64 {
4040 continue
4041 }
4042 _ = v_1.Args[1]
4043 if x != v_1.Args[0] {
4044 continue
4045 }
4046 v_1_1 := v_1.Args[1]
4047 if v_1_1.Op != OpConst64 {
4048 continue
4049 }
4050 d := auxIntToInt64(v_1_1.AuxInt)
4051 if !(d >= c) {
4052 continue
4053 }
4054 v.reset(OpLess64U)
4055 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4056 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4057 v1.AuxInt = int64ToAuxInt(c)
4058 v0.AddArg2(x, v1)
4059 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4060 v2.AuxInt = int64ToAuxInt(d - c)
4061 v.AddArg2(v0, v2)
4062 return true
4063 }
4064 break
4065 }
4066
4067
4068
4069 for {
4070 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4071 if v_0.Op != OpLeq64 {
4072 continue
4073 }
4074 x := v_0.Args[1]
4075 v_0_0 := v_0.Args[0]
4076 if v_0_0.Op != OpConst64 {
4077 continue
4078 }
4079 c := auxIntToInt64(v_0_0.AuxInt)
4080 if v_1.Op != OpLeq64 {
4081 continue
4082 }
4083 _ = v_1.Args[1]
4084 if x != v_1.Args[0] {
4085 continue
4086 }
4087 v_1_1 := v_1.Args[1]
4088 if v_1_1.Op != OpConst64 {
4089 continue
4090 }
4091 d := auxIntToInt64(v_1_1.AuxInt)
4092 if !(d >= c) {
4093 continue
4094 }
4095 v.reset(OpLeq64U)
4096 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4097 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4098 v1.AuxInt = int64ToAuxInt(c)
4099 v0.AddArg2(x, v1)
4100 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4101 v2.AuxInt = int64ToAuxInt(d - c)
4102 v.AddArg2(v0, v2)
4103 return true
4104 }
4105 break
4106 }
4107
4108
4109
4110 for {
4111 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4112 if v_0.Op != OpLeq32 {
4113 continue
4114 }
4115 x := v_0.Args[1]
4116 v_0_0 := v_0.Args[0]
4117 if v_0_0.Op != OpConst32 {
4118 continue
4119 }
4120 c := auxIntToInt32(v_0_0.AuxInt)
4121 if v_1.Op != OpLess32 {
4122 continue
4123 }
4124 _ = v_1.Args[1]
4125 if x != v_1.Args[0] {
4126 continue
4127 }
4128 v_1_1 := v_1.Args[1]
4129 if v_1_1.Op != OpConst32 {
4130 continue
4131 }
4132 d := auxIntToInt32(v_1_1.AuxInt)
4133 if !(d >= c) {
4134 continue
4135 }
4136 v.reset(OpLess32U)
4137 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4138 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4139 v1.AuxInt = int32ToAuxInt(c)
4140 v0.AddArg2(x, v1)
4141 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4142 v2.AuxInt = int32ToAuxInt(d - c)
4143 v.AddArg2(v0, v2)
4144 return true
4145 }
4146 break
4147 }
4148
4149
4150
4151 for {
4152 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4153 if v_0.Op != OpLeq32 {
4154 continue
4155 }
4156 x := v_0.Args[1]
4157 v_0_0 := v_0.Args[0]
4158 if v_0_0.Op != OpConst32 {
4159 continue
4160 }
4161 c := auxIntToInt32(v_0_0.AuxInt)
4162 if v_1.Op != OpLeq32 {
4163 continue
4164 }
4165 _ = v_1.Args[1]
4166 if x != v_1.Args[0] {
4167 continue
4168 }
4169 v_1_1 := v_1.Args[1]
4170 if v_1_1.Op != OpConst32 {
4171 continue
4172 }
4173 d := auxIntToInt32(v_1_1.AuxInt)
4174 if !(d >= c) {
4175 continue
4176 }
4177 v.reset(OpLeq32U)
4178 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4179 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4180 v1.AuxInt = int32ToAuxInt(c)
4181 v0.AddArg2(x, v1)
4182 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4183 v2.AuxInt = int32ToAuxInt(d - c)
4184 v.AddArg2(v0, v2)
4185 return true
4186 }
4187 break
4188 }
4189
4190
4191
4192 for {
4193 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4194 if v_0.Op != OpLeq16 {
4195 continue
4196 }
4197 x := v_0.Args[1]
4198 v_0_0 := v_0.Args[0]
4199 if v_0_0.Op != OpConst16 {
4200 continue
4201 }
4202 c := auxIntToInt16(v_0_0.AuxInt)
4203 if v_1.Op != OpLess16 {
4204 continue
4205 }
4206 _ = v_1.Args[1]
4207 if x != v_1.Args[0] {
4208 continue
4209 }
4210 v_1_1 := v_1.Args[1]
4211 if v_1_1.Op != OpConst16 {
4212 continue
4213 }
4214 d := auxIntToInt16(v_1_1.AuxInt)
4215 if !(d >= c) {
4216 continue
4217 }
4218 v.reset(OpLess16U)
4219 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4220 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4221 v1.AuxInt = int16ToAuxInt(c)
4222 v0.AddArg2(x, v1)
4223 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4224 v2.AuxInt = int16ToAuxInt(d - c)
4225 v.AddArg2(v0, v2)
4226 return true
4227 }
4228 break
4229 }
4230
4231
4232
4233 for {
4234 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4235 if v_0.Op != OpLeq16 {
4236 continue
4237 }
4238 x := v_0.Args[1]
4239 v_0_0 := v_0.Args[0]
4240 if v_0_0.Op != OpConst16 {
4241 continue
4242 }
4243 c := auxIntToInt16(v_0_0.AuxInt)
4244 if v_1.Op != OpLeq16 {
4245 continue
4246 }
4247 _ = v_1.Args[1]
4248 if x != v_1.Args[0] {
4249 continue
4250 }
4251 v_1_1 := v_1.Args[1]
4252 if v_1_1.Op != OpConst16 {
4253 continue
4254 }
4255 d := auxIntToInt16(v_1_1.AuxInt)
4256 if !(d >= c) {
4257 continue
4258 }
4259 v.reset(OpLeq16U)
4260 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4261 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4262 v1.AuxInt = int16ToAuxInt(c)
4263 v0.AddArg2(x, v1)
4264 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4265 v2.AuxInt = int16ToAuxInt(d - c)
4266 v.AddArg2(v0, v2)
4267 return true
4268 }
4269 break
4270 }
4271
4272
4273
4274 for {
4275 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4276 if v_0.Op != OpLeq8 {
4277 continue
4278 }
4279 x := v_0.Args[1]
4280 v_0_0 := v_0.Args[0]
4281 if v_0_0.Op != OpConst8 {
4282 continue
4283 }
4284 c := auxIntToInt8(v_0_0.AuxInt)
4285 if v_1.Op != OpLess8 {
4286 continue
4287 }
4288 _ = v_1.Args[1]
4289 if x != v_1.Args[0] {
4290 continue
4291 }
4292 v_1_1 := v_1.Args[1]
4293 if v_1_1.Op != OpConst8 {
4294 continue
4295 }
4296 d := auxIntToInt8(v_1_1.AuxInt)
4297 if !(d >= c) {
4298 continue
4299 }
4300 v.reset(OpLess8U)
4301 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4302 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4303 v1.AuxInt = int8ToAuxInt(c)
4304 v0.AddArg2(x, v1)
4305 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4306 v2.AuxInt = int8ToAuxInt(d - c)
4307 v.AddArg2(v0, v2)
4308 return true
4309 }
4310 break
4311 }
4312
4313
4314
4315 for {
4316 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4317 if v_0.Op != OpLeq8 {
4318 continue
4319 }
4320 x := v_0.Args[1]
4321 v_0_0 := v_0.Args[0]
4322 if v_0_0.Op != OpConst8 {
4323 continue
4324 }
4325 c := auxIntToInt8(v_0_0.AuxInt)
4326 if v_1.Op != OpLeq8 {
4327 continue
4328 }
4329 _ = v_1.Args[1]
4330 if x != v_1.Args[0] {
4331 continue
4332 }
4333 v_1_1 := v_1.Args[1]
4334 if v_1_1.Op != OpConst8 {
4335 continue
4336 }
4337 d := auxIntToInt8(v_1_1.AuxInt)
4338 if !(d >= c) {
4339 continue
4340 }
4341 v.reset(OpLeq8U)
4342 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4343 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4344 v1.AuxInt = int8ToAuxInt(c)
4345 v0.AddArg2(x, v1)
4346 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4347 v2.AuxInt = int8ToAuxInt(d - c)
4348 v.AddArg2(v0, v2)
4349 return true
4350 }
4351 break
4352 }
4353
4354
4355
4356 for {
4357 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4358 if v_0.Op != OpLess64 {
4359 continue
4360 }
4361 x := v_0.Args[1]
4362 v_0_0 := v_0.Args[0]
4363 if v_0_0.Op != OpConst64 {
4364 continue
4365 }
4366 c := auxIntToInt64(v_0_0.AuxInt)
4367 if v_1.Op != OpLess64 {
4368 continue
4369 }
4370 _ = v_1.Args[1]
4371 if x != v_1.Args[0] {
4372 continue
4373 }
4374 v_1_1 := v_1.Args[1]
4375 if v_1_1.Op != OpConst64 {
4376 continue
4377 }
4378 d := auxIntToInt64(v_1_1.AuxInt)
4379 if !(d >= c+1 && c+1 > c) {
4380 continue
4381 }
4382 v.reset(OpLess64U)
4383 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4384 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4385 v1.AuxInt = int64ToAuxInt(c + 1)
4386 v0.AddArg2(x, v1)
4387 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4388 v2.AuxInt = int64ToAuxInt(d - c - 1)
4389 v.AddArg2(v0, v2)
4390 return true
4391 }
4392 break
4393 }
4394
4395
4396
4397 for {
4398 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4399 if v_0.Op != OpLess64 {
4400 continue
4401 }
4402 x := v_0.Args[1]
4403 v_0_0 := v_0.Args[0]
4404 if v_0_0.Op != OpConst64 {
4405 continue
4406 }
4407 c := auxIntToInt64(v_0_0.AuxInt)
4408 if v_1.Op != OpLeq64 {
4409 continue
4410 }
4411 _ = v_1.Args[1]
4412 if x != v_1.Args[0] {
4413 continue
4414 }
4415 v_1_1 := v_1.Args[1]
4416 if v_1_1.Op != OpConst64 {
4417 continue
4418 }
4419 d := auxIntToInt64(v_1_1.AuxInt)
4420 if !(d >= c+1 && c+1 > c) {
4421 continue
4422 }
4423 v.reset(OpLeq64U)
4424 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4425 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4426 v1.AuxInt = int64ToAuxInt(c + 1)
4427 v0.AddArg2(x, v1)
4428 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4429 v2.AuxInt = int64ToAuxInt(d - c - 1)
4430 v.AddArg2(v0, v2)
4431 return true
4432 }
4433 break
4434 }
4435
4436
4437
4438 for {
4439 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4440 if v_0.Op != OpLess32 {
4441 continue
4442 }
4443 x := v_0.Args[1]
4444 v_0_0 := v_0.Args[0]
4445 if v_0_0.Op != OpConst32 {
4446 continue
4447 }
4448 c := auxIntToInt32(v_0_0.AuxInt)
4449 if v_1.Op != OpLess32 {
4450 continue
4451 }
4452 _ = v_1.Args[1]
4453 if x != v_1.Args[0] {
4454 continue
4455 }
4456 v_1_1 := v_1.Args[1]
4457 if v_1_1.Op != OpConst32 {
4458 continue
4459 }
4460 d := auxIntToInt32(v_1_1.AuxInt)
4461 if !(d >= c+1 && c+1 > c) {
4462 continue
4463 }
4464 v.reset(OpLess32U)
4465 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4466 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4467 v1.AuxInt = int32ToAuxInt(c + 1)
4468 v0.AddArg2(x, v1)
4469 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4470 v2.AuxInt = int32ToAuxInt(d - c - 1)
4471 v.AddArg2(v0, v2)
4472 return true
4473 }
4474 break
4475 }
4476
4477
4478
4479 for {
4480 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4481 if v_0.Op != OpLess32 {
4482 continue
4483 }
4484 x := v_0.Args[1]
4485 v_0_0 := v_0.Args[0]
4486 if v_0_0.Op != OpConst32 {
4487 continue
4488 }
4489 c := auxIntToInt32(v_0_0.AuxInt)
4490 if v_1.Op != OpLeq32 {
4491 continue
4492 }
4493 _ = v_1.Args[1]
4494 if x != v_1.Args[0] {
4495 continue
4496 }
4497 v_1_1 := v_1.Args[1]
4498 if v_1_1.Op != OpConst32 {
4499 continue
4500 }
4501 d := auxIntToInt32(v_1_1.AuxInt)
4502 if !(d >= c+1 && c+1 > c) {
4503 continue
4504 }
4505 v.reset(OpLeq32U)
4506 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4507 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4508 v1.AuxInt = int32ToAuxInt(c + 1)
4509 v0.AddArg2(x, v1)
4510 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4511 v2.AuxInt = int32ToAuxInt(d - c - 1)
4512 v.AddArg2(v0, v2)
4513 return true
4514 }
4515 break
4516 }
4517
4518
4519
4520 for {
4521 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4522 if v_0.Op != OpLess16 {
4523 continue
4524 }
4525 x := v_0.Args[1]
4526 v_0_0 := v_0.Args[0]
4527 if v_0_0.Op != OpConst16 {
4528 continue
4529 }
4530 c := auxIntToInt16(v_0_0.AuxInt)
4531 if v_1.Op != OpLess16 {
4532 continue
4533 }
4534 _ = v_1.Args[1]
4535 if x != v_1.Args[0] {
4536 continue
4537 }
4538 v_1_1 := v_1.Args[1]
4539 if v_1_1.Op != OpConst16 {
4540 continue
4541 }
4542 d := auxIntToInt16(v_1_1.AuxInt)
4543 if !(d >= c+1 && c+1 > c) {
4544 continue
4545 }
4546 v.reset(OpLess16U)
4547 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4548 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4549 v1.AuxInt = int16ToAuxInt(c + 1)
4550 v0.AddArg2(x, v1)
4551 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4552 v2.AuxInt = int16ToAuxInt(d - c - 1)
4553 v.AddArg2(v0, v2)
4554 return true
4555 }
4556 break
4557 }
4558
4559
4560
4561 for {
4562 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4563 if v_0.Op != OpLess16 {
4564 continue
4565 }
4566 x := v_0.Args[1]
4567 v_0_0 := v_0.Args[0]
4568 if v_0_0.Op != OpConst16 {
4569 continue
4570 }
4571 c := auxIntToInt16(v_0_0.AuxInt)
4572 if v_1.Op != OpLeq16 {
4573 continue
4574 }
4575 _ = v_1.Args[1]
4576 if x != v_1.Args[0] {
4577 continue
4578 }
4579 v_1_1 := v_1.Args[1]
4580 if v_1_1.Op != OpConst16 {
4581 continue
4582 }
4583 d := auxIntToInt16(v_1_1.AuxInt)
4584 if !(d >= c+1 && c+1 > c) {
4585 continue
4586 }
4587 v.reset(OpLeq16U)
4588 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4589 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4590 v1.AuxInt = int16ToAuxInt(c + 1)
4591 v0.AddArg2(x, v1)
4592 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4593 v2.AuxInt = int16ToAuxInt(d - c - 1)
4594 v.AddArg2(v0, v2)
4595 return true
4596 }
4597 break
4598 }
4599
4600
4601
4602 for {
4603 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4604 if v_0.Op != OpLess8 {
4605 continue
4606 }
4607 x := v_0.Args[1]
4608 v_0_0 := v_0.Args[0]
4609 if v_0_0.Op != OpConst8 {
4610 continue
4611 }
4612 c := auxIntToInt8(v_0_0.AuxInt)
4613 if v_1.Op != OpLess8 {
4614 continue
4615 }
4616 _ = v_1.Args[1]
4617 if x != v_1.Args[0] {
4618 continue
4619 }
4620 v_1_1 := v_1.Args[1]
4621 if v_1_1.Op != OpConst8 {
4622 continue
4623 }
4624 d := auxIntToInt8(v_1_1.AuxInt)
4625 if !(d >= c+1 && c+1 > c) {
4626 continue
4627 }
4628 v.reset(OpLess8U)
4629 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4630 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4631 v1.AuxInt = int8ToAuxInt(c + 1)
4632 v0.AddArg2(x, v1)
4633 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4634 v2.AuxInt = int8ToAuxInt(d - c - 1)
4635 v.AddArg2(v0, v2)
4636 return true
4637 }
4638 break
4639 }
4640
4641
4642
4643 for {
4644 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4645 if v_0.Op != OpLess8 {
4646 continue
4647 }
4648 x := v_0.Args[1]
4649 v_0_0 := v_0.Args[0]
4650 if v_0_0.Op != OpConst8 {
4651 continue
4652 }
4653 c := auxIntToInt8(v_0_0.AuxInt)
4654 if v_1.Op != OpLeq8 {
4655 continue
4656 }
4657 _ = v_1.Args[1]
4658 if x != v_1.Args[0] {
4659 continue
4660 }
4661 v_1_1 := v_1.Args[1]
4662 if v_1_1.Op != OpConst8 {
4663 continue
4664 }
4665 d := auxIntToInt8(v_1_1.AuxInt)
4666 if !(d >= c+1 && c+1 > c) {
4667 continue
4668 }
4669 v.reset(OpLeq8U)
4670 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4671 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4672 v1.AuxInt = int8ToAuxInt(c + 1)
4673 v0.AddArg2(x, v1)
4674 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4675 v2.AuxInt = int8ToAuxInt(d - c - 1)
4676 v.AddArg2(v0, v2)
4677 return true
4678 }
4679 break
4680 }
4681
4682
4683
4684 for {
4685 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4686 if v_0.Op != OpLeq64U {
4687 continue
4688 }
4689 x := v_0.Args[1]
4690 v_0_0 := v_0.Args[0]
4691 if v_0_0.Op != OpConst64 {
4692 continue
4693 }
4694 c := auxIntToInt64(v_0_0.AuxInt)
4695 if v_1.Op != OpLess64U {
4696 continue
4697 }
4698 _ = v_1.Args[1]
4699 if x != v_1.Args[0] {
4700 continue
4701 }
4702 v_1_1 := v_1.Args[1]
4703 if v_1_1.Op != OpConst64 {
4704 continue
4705 }
4706 d := auxIntToInt64(v_1_1.AuxInt)
4707 if !(uint64(d) >= uint64(c)) {
4708 continue
4709 }
4710 v.reset(OpLess64U)
4711 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4712 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4713 v1.AuxInt = int64ToAuxInt(c)
4714 v0.AddArg2(x, v1)
4715 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4716 v2.AuxInt = int64ToAuxInt(d - c)
4717 v.AddArg2(v0, v2)
4718 return true
4719 }
4720 break
4721 }
4722
4723
4724
4725 for {
4726 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4727 if v_0.Op != OpLeq64U {
4728 continue
4729 }
4730 x := v_0.Args[1]
4731 v_0_0 := v_0.Args[0]
4732 if v_0_0.Op != OpConst64 {
4733 continue
4734 }
4735 c := auxIntToInt64(v_0_0.AuxInt)
4736 if v_1.Op != OpLeq64U {
4737 continue
4738 }
4739 _ = v_1.Args[1]
4740 if x != v_1.Args[0] {
4741 continue
4742 }
4743 v_1_1 := v_1.Args[1]
4744 if v_1_1.Op != OpConst64 {
4745 continue
4746 }
4747 d := auxIntToInt64(v_1_1.AuxInt)
4748 if !(uint64(d) >= uint64(c)) {
4749 continue
4750 }
4751 v.reset(OpLeq64U)
4752 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4753 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4754 v1.AuxInt = int64ToAuxInt(c)
4755 v0.AddArg2(x, v1)
4756 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4757 v2.AuxInt = int64ToAuxInt(d - c)
4758 v.AddArg2(v0, v2)
4759 return true
4760 }
4761 break
4762 }
4763
4764
4765
4766 for {
4767 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4768 if v_0.Op != OpLeq32U {
4769 continue
4770 }
4771 x := v_0.Args[1]
4772 v_0_0 := v_0.Args[0]
4773 if v_0_0.Op != OpConst32 {
4774 continue
4775 }
4776 c := auxIntToInt32(v_0_0.AuxInt)
4777 if v_1.Op != OpLess32U {
4778 continue
4779 }
4780 _ = v_1.Args[1]
4781 if x != v_1.Args[0] {
4782 continue
4783 }
4784 v_1_1 := v_1.Args[1]
4785 if v_1_1.Op != OpConst32 {
4786 continue
4787 }
4788 d := auxIntToInt32(v_1_1.AuxInt)
4789 if !(uint32(d) >= uint32(c)) {
4790 continue
4791 }
4792 v.reset(OpLess32U)
4793 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4794 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4795 v1.AuxInt = int32ToAuxInt(c)
4796 v0.AddArg2(x, v1)
4797 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4798 v2.AuxInt = int32ToAuxInt(d - c)
4799 v.AddArg2(v0, v2)
4800 return true
4801 }
4802 break
4803 }
4804
4805
4806
4807 for {
4808 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4809 if v_0.Op != OpLeq32U {
4810 continue
4811 }
4812 x := v_0.Args[1]
4813 v_0_0 := v_0.Args[0]
4814 if v_0_0.Op != OpConst32 {
4815 continue
4816 }
4817 c := auxIntToInt32(v_0_0.AuxInt)
4818 if v_1.Op != OpLeq32U {
4819 continue
4820 }
4821 _ = v_1.Args[1]
4822 if x != v_1.Args[0] {
4823 continue
4824 }
4825 v_1_1 := v_1.Args[1]
4826 if v_1_1.Op != OpConst32 {
4827 continue
4828 }
4829 d := auxIntToInt32(v_1_1.AuxInt)
4830 if !(uint32(d) >= uint32(c)) {
4831 continue
4832 }
4833 v.reset(OpLeq32U)
4834 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4835 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4836 v1.AuxInt = int32ToAuxInt(c)
4837 v0.AddArg2(x, v1)
4838 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4839 v2.AuxInt = int32ToAuxInt(d - c)
4840 v.AddArg2(v0, v2)
4841 return true
4842 }
4843 break
4844 }
4845
4846
4847
4848 for {
4849 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4850 if v_0.Op != OpLeq16U {
4851 continue
4852 }
4853 x := v_0.Args[1]
4854 v_0_0 := v_0.Args[0]
4855 if v_0_0.Op != OpConst16 {
4856 continue
4857 }
4858 c := auxIntToInt16(v_0_0.AuxInt)
4859 if v_1.Op != OpLess16U {
4860 continue
4861 }
4862 _ = v_1.Args[1]
4863 if x != v_1.Args[0] {
4864 continue
4865 }
4866 v_1_1 := v_1.Args[1]
4867 if v_1_1.Op != OpConst16 {
4868 continue
4869 }
4870 d := auxIntToInt16(v_1_1.AuxInt)
4871 if !(uint16(d) >= uint16(c)) {
4872 continue
4873 }
4874 v.reset(OpLess16U)
4875 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4876 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4877 v1.AuxInt = int16ToAuxInt(c)
4878 v0.AddArg2(x, v1)
4879 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4880 v2.AuxInt = int16ToAuxInt(d - c)
4881 v.AddArg2(v0, v2)
4882 return true
4883 }
4884 break
4885 }
4886
4887
4888
4889 for {
4890 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4891 if v_0.Op != OpLeq16U {
4892 continue
4893 }
4894 x := v_0.Args[1]
4895 v_0_0 := v_0.Args[0]
4896 if v_0_0.Op != OpConst16 {
4897 continue
4898 }
4899 c := auxIntToInt16(v_0_0.AuxInt)
4900 if v_1.Op != OpLeq16U {
4901 continue
4902 }
4903 _ = v_1.Args[1]
4904 if x != v_1.Args[0] {
4905 continue
4906 }
4907 v_1_1 := v_1.Args[1]
4908 if v_1_1.Op != OpConst16 {
4909 continue
4910 }
4911 d := auxIntToInt16(v_1_1.AuxInt)
4912 if !(uint16(d) >= uint16(c)) {
4913 continue
4914 }
4915 v.reset(OpLeq16U)
4916 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4917 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4918 v1.AuxInt = int16ToAuxInt(c)
4919 v0.AddArg2(x, v1)
4920 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4921 v2.AuxInt = int16ToAuxInt(d - c)
4922 v.AddArg2(v0, v2)
4923 return true
4924 }
4925 break
4926 }
4927
4928
4929
4930 for {
4931 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4932 if v_0.Op != OpLeq8U {
4933 continue
4934 }
4935 x := v_0.Args[1]
4936 v_0_0 := v_0.Args[0]
4937 if v_0_0.Op != OpConst8 {
4938 continue
4939 }
4940 c := auxIntToInt8(v_0_0.AuxInt)
4941 if v_1.Op != OpLess8U {
4942 continue
4943 }
4944 _ = v_1.Args[1]
4945 if x != v_1.Args[0] {
4946 continue
4947 }
4948 v_1_1 := v_1.Args[1]
4949 if v_1_1.Op != OpConst8 {
4950 continue
4951 }
4952 d := auxIntToInt8(v_1_1.AuxInt)
4953 if !(uint8(d) >= uint8(c)) {
4954 continue
4955 }
4956 v.reset(OpLess8U)
4957 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4958 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4959 v1.AuxInt = int8ToAuxInt(c)
4960 v0.AddArg2(x, v1)
4961 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4962 v2.AuxInt = int8ToAuxInt(d - c)
4963 v.AddArg2(v0, v2)
4964 return true
4965 }
4966 break
4967 }
4968
4969
4970
4971 for {
4972 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4973 if v_0.Op != OpLeq8U {
4974 continue
4975 }
4976 x := v_0.Args[1]
4977 v_0_0 := v_0.Args[0]
4978 if v_0_0.Op != OpConst8 {
4979 continue
4980 }
4981 c := auxIntToInt8(v_0_0.AuxInt)
4982 if v_1.Op != OpLeq8U {
4983 continue
4984 }
4985 _ = v_1.Args[1]
4986 if x != v_1.Args[0] {
4987 continue
4988 }
4989 v_1_1 := v_1.Args[1]
4990 if v_1_1.Op != OpConst8 {
4991 continue
4992 }
4993 d := auxIntToInt8(v_1_1.AuxInt)
4994 if !(uint8(d) >= uint8(c)) {
4995 continue
4996 }
4997 v.reset(OpLeq8U)
4998 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4999 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5000 v1.AuxInt = int8ToAuxInt(c)
5001 v0.AddArg2(x, v1)
5002 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5003 v2.AuxInt = int8ToAuxInt(d - c)
5004 v.AddArg2(v0, v2)
5005 return true
5006 }
5007 break
5008 }
5009
5010
5011
5012 for {
5013 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5014 if v_0.Op != OpLess64U {
5015 continue
5016 }
5017 x := v_0.Args[1]
5018 v_0_0 := v_0.Args[0]
5019 if v_0_0.Op != OpConst64 {
5020 continue
5021 }
5022 c := auxIntToInt64(v_0_0.AuxInt)
5023 if v_1.Op != OpLess64U {
5024 continue
5025 }
5026 _ = v_1.Args[1]
5027 if x != v_1.Args[0] {
5028 continue
5029 }
5030 v_1_1 := v_1.Args[1]
5031 if v_1_1.Op != OpConst64 {
5032 continue
5033 }
5034 d := auxIntToInt64(v_1_1.AuxInt)
5035 if !(uint64(d) >= uint64(c+1) && uint64(c+1) > uint64(c)) {
5036 continue
5037 }
5038 v.reset(OpLess64U)
5039 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
5040 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
5041 v1.AuxInt = int64ToAuxInt(c + 1)
5042 v0.AddArg2(x, v1)
5043 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
5044 v2.AuxInt = int64ToAuxInt(d - c - 1)
5045 v.AddArg2(v0, v2)
5046 return true
5047 }
5048 break
5049 }
5050
5051
5052
5053 for {
5054 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5055 if v_0.Op != OpLess64U {
5056 continue
5057 }
5058 x := v_0.Args[1]
5059 v_0_0 := v_0.Args[0]
5060 if v_0_0.Op != OpConst64 {
5061 continue
5062 }
5063 c := auxIntToInt64(v_0_0.AuxInt)
5064 if v_1.Op != OpLeq64U {
5065 continue
5066 }
5067 _ = v_1.Args[1]
5068 if x != v_1.Args[0] {
5069 continue
5070 }
5071 v_1_1 := v_1.Args[1]
5072 if v_1_1.Op != OpConst64 {
5073 continue
5074 }
5075 d := auxIntToInt64(v_1_1.AuxInt)
5076 if !(uint64(d) >= uint64(c+1) && uint64(c+1) > uint64(c)) {
5077 continue
5078 }
5079 v.reset(OpLeq64U)
5080 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
5081 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
5082 v1.AuxInt = int64ToAuxInt(c + 1)
5083 v0.AddArg2(x, v1)
5084 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
5085 v2.AuxInt = int64ToAuxInt(d - c - 1)
5086 v.AddArg2(v0, v2)
5087 return true
5088 }
5089 break
5090 }
5091
5092
5093
5094 for {
5095 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5096 if v_0.Op != OpLess32U {
5097 continue
5098 }
5099 x := v_0.Args[1]
5100 v_0_0 := v_0.Args[0]
5101 if v_0_0.Op != OpConst32 {
5102 continue
5103 }
5104 c := auxIntToInt32(v_0_0.AuxInt)
5105 if v_1.Op != OpLess32U {
5106 continue
5107 }
5108 _ = v_1.Args[1]
5109 if x != v_1.Args[0] {
5110 continue
5111 }
5112 v_1_1 := v_1.Args[1]
5113 if v_1_1.Op != OpConst32 {
5114 continue
5115 }
5116 d := auxIntToInt32(v_1_1.AuxInt)
5117 if !(uint32(d) >= uint32(c+1) && uint32(c+1) > uint32(c)) {
5118 continue
5119 }
5120 v.reset(OpLess32U)
5121 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
5122 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
5123 v1.AuxInt = int32ToAuxInt(c + 1)
5124 v0.AddArg2(x, v1)
5125 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
5126 v2.AuxInt = int32ToAuxInt(d - c - 1)
5127 v.AddArg2(v0, v2)
5128 return true
5129 }
5130 break
5131 }
5132
5133
5134
5135 for {
5136 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5137 if v_0.Op != OpLess32U {
5138 continue
5139 }
5140 x := v_0.Args[1]
5141 v_0_0 := v_0.Args[0]
5142 if v_0_0.Op != OpConst32 {
5143 continue
5144 }
5145 c := auxIntToInt32(v_0_0.AuxInt)
5146 if v_1.Op != OpLeq32U {
5147 continue
5148 }
5149 _ = v_1.Args[1]
5150 if x != v_1.Args[0] {
5151 continue
5152 }
5153 v_1_1 := v_1.Args[1]
5154 if v_1_1.Op != OpConst32 {
5155 continue
5156 }
5157 d := auxIntToInt32(v_1_1.AuxInt)
5158 if !(uint32(d) >= uint32(c+1) && uint32(c+1) > uint32(c)) {
5159 continue
5160 }
5161 v.reset(OpLeq32U)
5162 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
5163 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
5164 v1.AuxInt = int32ToAuxInt(c + 1)
5165 v0.AddArg2(x, v1)
5166 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
5167 v2.AuxInt = int32ToAuxInt(d - c - 1)
5168 v.AddArg2(v0, v2)
5169 return true
5170 }
5171 break
5172 }
5173
5174
5175
5176 for {
5177 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5178 if v_0.Op != OpLess16U {
5179 continue
5180 }
5181 x := v_0.Args[1]
5182 v_0_0 := v_0.Args[0]
5183 if v_0_0.Op != OpConst16 {
5184 continue
5185 }
5186 c := auxIntToInt16(v_0_0.AuxInt)
5187 if v_1.Op != OpLess16U {
5188 continue
5189 }
5190 _ = v_1.Args[1]
5191 if x != v_1.Args[0] {
5192 continue
5193 }
5194 v_1_1 := v_1.Args[1]
5195 if v_1_1.Op != OpConst16 {
5196 continue
5197 }
5198 d := auxIntToInt16(v_1_1.AuxInt)
5199 if !(uint16(d) >= uint16(c+1) && uint16(c+1) > uint16(c)) {
5200 continue
5201 }
5202 v.reset(OpLess16U)
5203 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
5204 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5205 v1.AuxInt = int16ToAuxInt(c + 1)
5206 v0.AddArg2(x, v1)
5207 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
5208 v2.AuxInt = int16ToAuxInt(d - c - 1)
5209 v.AddArg2(v0, v2)
5210 return true
5211 }
5212 break
5213 }
5214
5215
5216
5217 for {
5218 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5219 if v_0.Op != OpLess16U {
5220 continue
5221 }
5222 x := v_0.Args[1]
5223 v_0_0 := v_0.Args[0]
5224 if v_0_0.Op != OpConst16 {
5225 continue
5226 }
5227 c := auxIntToInt16(v_0_0.AuxInt)
5228 if v_1.Op != OpLeq16U {
5229 continue
5230 }
5231 _ = v_1.Args[1]
5232 if x != v_1.Args[0] {
5233 continue
5234 }
5235 v_1_1 := v_1.Args[1]
5236 if v_1_1.Op != OpConst16 {
5237 continue
5238 }
5239 d := auxIntToInt16(v_1_1.AuxInt)
5240 if !(uint16(d) >= uint16(c+1) && uint16(c+1) > uint16(c)) {
5241 continue
5242 }
5243 v.reset(OpLeq16U)
5244 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
5245 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5246 v1.AuxInt = int16ToAuxInt(c + 1)
5247 v0.AddArg2(x, v1)
5248 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
5249 v2.AuxInt = int16ToAuxInt(d - c - 1)
5250 v.AddArg2(v0, v2)
5251 return true
5252 }
5253 break
5254 }
5255
5256
5257
5258 for {
5259 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5260 if v_0.Op != OpLess8U {
5261 continue
5262 }
5263 x := v_0.Args[1]
5264 v_0_0 := v_0.Args[0]
5265 if v_0_0.Op != OpConst8 {
5266 continue
5267 }
5268 c := auxIntToInt8(v_0_0.AuxInt)
5269 if v_1.Op != OpLess8U {
5270 continue
5271 }
5272 _ = v_1.Args[1]
5273 if x != v_1.Args[0] {
5274 continue
5275 }
5276 v_1_1 := v_1.Args[1]
5277 if v_1_1.Op != OpConst8 {
5278 continue
5279 }
5280 d := auxIntToInt8(v_1_1.AuxInt)
5281 if !(uint8(d) >= uint8(c+1) && uint8(c+1) > uint8(c)) {
5282 continue
5283 }
5284 v.reset(OpLess8U)
5285 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
5286 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5287 v1.AuxInt = int8ToAuxInt(c + 1)
5288 v0.AddArg2(x, v1)
5289 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5290 v2.AuxInt = int8ToAuxInt(d - c - 1)
5291 v.AddArg2(v0, v2)
5292 return true
5293 }
5294 break
5295 }
5296
5297
5298
5299 for {
5300 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5301 if v_0.Op != OpLess8U {
5302 continue
5303 }
5304 x := v_0.Args[1]
5305 v_0_0 := v_0.Args[0]
5306 if v_0_0.Op != OpConst8 {
5307 continue
5308 }
5309 c := auxIntToInt8(v_0_0.AuxInt)
5310 if v_1.Op != OpLeq8U {
5311 continue
5312 }
5313 _ = v_1.Args[1]
5314 if x != v_1.Args[0] {
5315 continue
5316 }
5317 v_1_1 := v_1.Args[1]
5318 if v_1_1.Op != OpConst8 {
5319 continue
5320 }
5321 d := auxIntToInt8(v_1_1.AuxInt)
5322 if !(uint8(d) >= uint8(c+1) && uint8(c+1) > uint8(c)) {
5323 continue
5324 }
5325 v.reset(OpLeq8U)
5326 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
5327 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5328 v1.AuxInt = int8ToAuxInt(c + 1)
5329 v0.AddArg2(x, v1)
5330 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5331 v2.AuxInt = int8ToAuxInt(d - c - 1)
5332 v.AddArg2(v0, v2)
5333 return true
5334 }
5335 break
5336 }
5337
5338
5339
5340 for {
5341 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5342 if v_0.Op != OpNeq64 {
5343 continue
5344 }
5345 _ = v_0.Args[1]
5346 v_0_0 := v_0.Args[0]
5347 v_0_1 := v_0.Args[1]
5348 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5349 x := v_0_0
5350 cv := v_0_1
5351 if cv.Op != OpConst64 {
5352 continue
5353 }
5354 c := auxIntToInt64(cv.AuxInt)
5355 if v_1.Op != OpNeq64 {
5356 continue
5357 }
5358 _ = v_1.Args[1]
5359 v_1_0 := v_1.Args[0]
5360 v_1_1 := v_1.Args[1]
5361 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5362 if x != v_1_0 || v_1_1.Op != OpConst64 {
5363 continue
5364 }
5365 d := auxIntToInt64(v_1_1.AuxInt)
5366 if !(c|d == c && oneBit(c^d)) {
5367 continue
5368 }
5369 v.reset(OpNeq64)
5370 v0 := b.NewValue0(v.Pos, OpOr64, x.Type)
5371 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
5372 v1.AuxInt = int64ToAuxInt(c ^ d)
5373 v0.AddArg2(x, v1)
5374 v.AddArg2(v0, cv)
5375 return true
5376 }
5377 }
5378 }
5379 break
5380 }
5381
5382
5383
5384 for {
5385 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5386 if v_0.Op != OpNeq32 {
5387 continue
5388 }
5389 _ = v_0.Args[1]
5390 v_0_0 := v_0.Args[0]
5391 v_0_1 := v_0.Args[1]
5392 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5393 x := v_0_0
5394 cv := v_0_1
5395 if cv.Op != OpConst32 {
5396 continue
5397 }
5398 c := auxIntToInt32(cv.AuxInt)
5399 if v_1.Op != OpNeq32 {
5400 continue
5401 }
5402 _ = v_1.Args[1]
5403 v_1_0 := v_1.Args[0]
5404 v_1_1 := v_1.Args[1]
5405 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5406 if x != v_1_0 || v_1_1.Op != OpConst32 {
5407 continue
5408 }
5409 d := auxIntToInt32(v_1_1.AuxInt)
5410 if !(c|d == c && oneBit(c^d)) {
5411 continue
5412 }
5413 v.reset(OpNeq32)
5414 v0 := b.NewValue0(v.Pos, OpOr32, x.Type)
5415 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
5416 v1.AuxInt = int32ToAuxInt(c ^ d)
5417 v0.AddArg2(x, v1)
5418 v.AddArg2(v0, cv)
5419 return true
5420 }
5421 }
5422 }
5423 break
5424 }
5425
5426
5427
5428 for {
5429 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5430 if v_0.Op != OpNeq16 {
5431 continue
5432 }
5433 _ = v_0.Args[1]
5434 v_0_0 := v_0.Args[0]
5435 v_0_1 := v_0.Args[1]
5436 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5437 x := v_0_0
5438 cv := v_0_1
5439 if cv.Op != OpConst16 {
5440 continue
5441 }
5442 c := auxIntToInt16(cv.AuxInt)
5443 if v_1.Op != OpNeq16 {
5444 continue
5445 }
5446 _ = v_1.Args[1]
5447 v_1_0 := v_1.Args[0]
5448 v_1_1 := v_1.Args[1]
5449 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5450 if x != v_1_0 || v_1_1.Op != OpConst16 {
5451 continue
5452 }
5453 d := auxIntToInt16(v_1_1.AuxInt)
5454 if !(c|d == c && oneBit(c^d)) {
5455 continue
5456 }
5457 v.reset(OpNeq16)
5458 v0 := b.NewValue0(v.Pos, OpOr16, x.Type)
5459 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5460 v1.AuxInt = int16ToAuxInt(c ^ d)
5461 v0.AddArg2(x, v1)
5462 v.AddArg2(v0, cv)
5463 return true
5464 }
5465 }
5466 }
5467 break
5468 }
5469
5470
5471
5472 for {
5473 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5474 if v_0.Op != OpNeq8 {
5475 continue
5476 }
5477 _ = v_0.Args[1]
5478 v_0_0 := v_0.Args[0]
5479 v_0_1 := v_0.Args[1]
5480 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5481 x := v_0_0
5482 cv := v_0_1
5483 if cv.Op != OpConst8 {
5484 continue
5485 }
5486 c := auxIntToInt8(cv.AuxInt)
5487 if v_1.Op != OpNeq8 {
5488 continue
5489 }
5490 _ = v_1.Args[1]
5491 v_1_0 := v_1.Args[0]
5492 v_1_1 := v_1.Args[1]
5493 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5494 if x != v_1_0 || v_1_1.Op != OpConst8 {
5495 continue
5496 }
5497 d := auxIntToInt8(v_1_1.AuxInt)
5498 if !(c|d == c && oneBit(c^d)) {
5499 continue
5500 }
5501 v.reset(OpNeq8)
5502 v0 := b.NewValue0(v.Pos, OpOr8, x.Type)
5503 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5504 v1.AuxInt = int8ToAuxInt(c ^ d)
5505 v0.AddArg2(x, v1)
5506 v.AddArg2(v0, cv)
5507 return true
5508 }
5509 }
5510 }
5511 break
5512 }
5513 return false
5514 }
5515 func rewriteValuegeneric_OpArraySelect(v *Value) bool {
5516 v_0 := v.Args[0]
5517
5518
5519 for {
5520 if v_0.Op != OpArrayMake1 {
5521 break
5522 }
5523 x := v_0.Args[0]
5524 v.copyOf(x)
5525 return true
5526 }
5527
5528
5529 for {
5530 if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpIData {
5531 break
5532 }
5533 x := v_0.Args[0]
5534 v.reset(OpIData)
5535 v.AddArg(x)
5536 return true
5537 }
5538 return false
5539 }
5540 func rewriteValuegeneric_OpBitLen16(v *Value) bool {
5541 v_0 := v.Args[0]
5542 b := v.Block
5543 config := b.Func.Config
5544
5545
5546
5547 for {
5548 if v_0.Op != OpConst16 {
5549 break
5550 }
5551 c := auxIntToInt16(v_0.AuxInt)
5552 if !(config.PtrSize == 8) {
5553 break
5554 }
5555 v.reset(OpConst64)
5556 v.AuxInt = int64ToAuxInt(int64(bits.Len16(uint16(c))))
5557 return true
5558 }
5559
5560
5561
5562 for {
5563 if v_0.Op != OpConst16 {
5564 break
5565 }
5566 c := auxIntToInt16(v_0.AuxInt)
5567 if !(config.PtrSize == 4) {
5568 break
5569 }
5570 v.reset(OpConst32)
5571 v.AuxInt = int32ToAuxInt(int32(bits.Len16(uint16(c))))
5572 return true
5573 }
5574 return false
5575 }
5576 func rewriteValuegeneric_OpBitLen32(v *Value) bool {
5577 v_0 := v.Args[0]
5578 b := v.Block
5579 config := b.Func.Config
5580
5581
5582
5583 for {
5584 if v_0.Op != OpConst32 {
5585 break
5586 }
5587 c := auxIntToInt32(v_0.AuxInt)
5588 if !(config.PtrSize == 8) {
5589 break
5590 }
5591 v.reset(OpConst64)
5592 v.AuxInt = int64ToAuxInt(int64(bits.Len32(uint32(c))))
5593 return true
5594 }
5595
5596
5597
5598 for {
5599 if v_0.Op != OpConst32 {
5600 break
5601 }
5602 c := auxIntToInt32(v_0.AuxInt)
5603 if !(config.PtrSize == 4) {
5604 break
5605 }
5606 v.reset(OpConst32)
5607 v.AuxInt = int32ToAuxInt(int32(bits.Len32(uint32(c))))
5608 return true
5609 }
5610 return false
5611 }
5612 func rewriteValuegeneric_OpBitLen64(v *Value) bool {
5613 v_0 := v.Args[0]
5614 b := v.Block
5615 config := b.Func.Config
5616
5617
5618
5619 for {
5620 if v_0.Op != OpConst64 {
5621 break
5622 }
5623 c := auxIntToInt64(v_0.AuxInt)
5624 if !(config.PtrSize == 8) {
5625 break
5626 }
5627 v.reset(OpConst64)
5628 v.AuxInt = int64ToAuxInt(int64(bits.Len64(uint64(c))))
5629 return true
5630 }
5631
5632
5633
5634 for {
5635 if v_0.Op != OpConst64 {
5636 break
5637 }
5638 c := auxIntToInt64(v_0.AuxInt)
5639 if !(config.PtrSize == 4) {
5640 break
5641 }
5642 v.reset(OpConst32)
5643 v.AuxInt = int32ToAuxInt(int32(bits.Len64(uint64(c))))
5644 return true
5645 }
5646 return false
5647 }
5648 func rewriteValuegeneric_OpBitLen8(v *Value) bool {
5649 v_0 := v.Args[0]
5650 b := v.Block
5651 config := b.Func.Config
5652
5653
5654
5655 for {
5656 if v_0.Op != OpConst8 {
5657 break
5658 }
5659 c := auxIntToInt8(v_0.AuxInt)
5660 if !(config.PtrSize == 8) {
5661 break
5662 }
5663 v.reset(OpConst64)
5664 v.AuxInt = int64ToAuxInt(int64(bits.Len8(uint8(c))))
5665 return true
5666 }
5667
5668
5669
5670 for {
5671 if v_0.Op != OpConst8 {
5672 break
5673 }
5674 c := auxIntToInt8(v_0.AuxInt)
5675 if !(config.PtrSize == 4) {
5676 break
5677 }
5678 v.reset(OpConst32)
5679 v.AuxInt = int32ToAuxInt(int32(bits.Len8(uint8(c))))
5680 return true
5681 }
5682 return false
5683 }
5684 func rewriteValuegeneric_OpCeil(v *Value) bool {
5685 v_0 := v.Args[0]
5686
5687
5688 for {
5689 if v_0.Op != OpConst64F {
5690 break
5691 }
5692 c := auxIntToFloat64(v_0.AuxInt)
5693 v.reset(OpConst64F)
5694 v.AuxInt = float64ToAuxInt(math.Ceil(c))
5695 return true
5696 }
5697 return false
5698 }
5699 func rewriteValuegeneric_OpCom16(v *Value) bool {
5700 v_0 := v.Args[0]
5701
5702
5703 for {
5704 if v_0.Op != OpCom16 {
5705 break
5706 }
5707 x := v_0.Args[0]
5708 v.copyOf(x)
5709 return true
5710 }
5711
5712
5713 for {
5714 if v_0.Op != OpConst16 {
5715 break
5716 }
5717 c := auxIntToInt16(v_0.AuxInt)
5718 v.reset(OpConst16)
5719 v.AuxInt = int16ToAuxInt(^c)
5720 return true
5721 }
5722
5723
5724 for {
5725 if v_0.Op != OpAdd16 {
5726 break
5727 }
5728 _ = v_0.Args[1]
5729 v_0_0 := v_0.Args[0]
5730 v_0_1 := v_0.Args[1]
5731 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5732 if v_0_0.Op != OpConst16 || auxIntToInt16(v_0_0.AuxInt) != -1 {
5733 continue
5734 }
5735 x := v_0_1
5736 v.reset(OpNeg16)
5737 v.AddArg(x)
5738 return true
5739 }
5740 break
5741 }
5742 return false
5743 }
5744 func rewriteValuegeneric_OpCom32(v *Value) bool {
5745 v_0 := v.Args[0]
5746
5747
5748 for {
5749 if v_0.Op != OpCom32 {
5750 break
5751 }
5752 x := v_0.Args[0]
5753 v.copyOf(x)
5754 return true
5755 }
5756
5757
5758 for {
5759 if v_0.Op != OpConst32 {
5760 break
5761 }
5762 c := auxIntToInt32(v_0.AuxInt)
5763 v.reset(OpConst32)
5764 v.AuxInt = int32ToAuxInt(^c)
5765 return true
5766 }
5767
5768
5769 for {
5770 if v_0.Op != OpAdd32 {
5771 break
5772 }
5773 _ = v_0.Args[1]
5774 v_0_0 := v_0.Args[0]
5775 v_0_1 := v_0.Args[1]
5776 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5777 if v_0_0.Op != OpConst32 || auxIntToInt32(v_0_0.AuxInt) != -1 {
5778 continue
5779 }
5780 x := v_0_1
5781 v.reset(OpNeg32)
5782 v.AddArg(x)
5783 return true
5784 }
5785 break
5786 }
5787 return false
5788 }
5789 func rewriteValuegeneric_OpCom64(v *Value) bool {
5790 v_0 := v.Args[0]
5791
5792
5793 for {
5794 if v_0.Op != OpCom64 {
5795 break
5796 }
5797 x := v_0.Args[0]
5798 v.copyOf(x)
5799 return true
5800 }
5801
5802
5803 for {
5804 if v_0.Op != OpConst64 {
5805 break
5806 }
5807 c := auxIntToInt64(v_0.AuxInt)
5808 v.reset(OpConst64)
5809 v.AuxInt = int64ToAuxInt(^c)
5810 return true
5811 }
5812
5813
5814 for {
5815 if v_0.Op != OpAdd64 {
5816 break
5817 }
5818 _ = v_0.Args[1]
5819 v_0_0 := v_0.Args[0]
5820 v_0_1 := v_0.Args[1]
5821 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5822 if v_0_0.Op != OpConst64 || auxIntToInt64(v_0_0.AuxInt) != -1 {
5823 continue
5824 }
5825 x := v_0_1
5826 v.reset(OpNeg64)
5827 v.AddArg(x)
5828 return true
5829 }
5830 break
5831 }
5832 return false
5833 }
5834 func rewriteValuegeneric_OpCom8(v *Value) bool {
5835 v_0 := v.Args[0]
5836
5837
5838 for {
5839 if v_0.Op != OpCom8 {
5840 break
5841 }
5842 x := v_0.Args[0]
5843 v.copyOf(x)
5844 return true
5845 }
5846
5847
5848 for {
5849 if v_0.Op != OpConst8 {
5850 break
5851 }
5852 c := auxIntToInt8(v_0.AuxInt)
5853 v.reset(OpConst8)
5854 v.AuxInt = int8ToAuxInt(^c)
5855 return true
5856 }
5857
5858
5859 for {
5860 if v_0.Op != OpAdd8 {
5861 break
5862 }
5863 _ = v_0.Args[1]
5864 v_0_0 := v_0.Args[0]
5865 v_0_1 := v_0.Args[1]
5866 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5867 if v_0_0.Op != OpConst8 || auxIntToInt8(v_0_0.AuxInt) != -1 {
5868 continue
5869 }
5870 x := v_0_1
5871 v.reset(OpNeg8)
5872 v.AddArg(x)
5873 return true
5874 }
5875 break
5876 }
5877 return false
5878 }
5879 func rewriteValuegeneric_OpCondSelect(v *Value) bool {
5880 v_2 := v.Args[2]
5881 v_1 := v.Args[1]
5882 v_0 := v.Args[0]
5883 b := v.Block
5884 config := b.Func.Config
5885
5886
5887 for {
5888 x := v_0
5889 if v_2.Op != OpConstBool || auxIntToBool(v_2.AuxInt) != true {
5890 break
5891 }
5892 v.copyOf(x)
5893 return true
5894 }
5895
5896
5897 for {
5898 y := v_1
5899 if v_2.Op != OpConstBool || auxIntToBool(v_2.AuxInt) != false {
5900 break
5901 }
5902 v.copyOf(y)
5903 return true
5904 }
5905
5906
5907 for {
5908 x := v_0
5909 if x != v_1 {
5910 break
5911 }
5912 v.copyOf(x)
5913 return true
5914 }
5915
5916
5917
5918 for {
5919 if v_0.Op != OpAdd8 {
5920 break
5921 }
5922 t := v_0.Type
5923 _ = v_0.Args[1]
5924 v_0_0 := v_0.Args[0]
5925 v_0_1 := v_0.Args[1]
5926 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5927 x := v_0_0
5928 if v_0_1.Op != OpConst8 || auxIntToInt8(v_0_1.AuxInt) != 1 || x != v_1 {
5929 continue
5930 }
5931 bool := v_2
5932 if !(config.arch != "arm64") {
5933 continue
5934 }
5935 v.reset(OpAdd8)
5936 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
5937 v0.AddArg(bool)
5938 v.AddArg2(x, v0)
5939 return true
5940 }
5941 break
5942 }
5943
5944
5945
5946 for {
5947 if v_0.Op != OpAdd64 {
5948 break
5949 }
5950 t := v_0.Type
5951 _ = v_0.Args[1]
5952 v_0_0 := v_0.Args[0]
5953 v_0_1 := v_0.Args[1]
5954 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5955 x := v_0_0
5956 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
5957 continue
5958 }
5959 bool := v_2
5960 if !(config.arch != "arm64") {
5961 continue
5962 }
5963 v.reset(OpAdd64)
5964 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
5965 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
5966 v1.AddArg(bool)
5967 v0.AddArg(v1)
5968 v.AddArg2(x, v0)
5969 return true
5970 }
5971 break
5972 }
5973
5974
5975
5976 for {
5977 if v_0.Op != OpAdd32 {
5978 break
5979 }
5980 t := v_0.Type
5981 _ = v_0.Args[1]
5982 v_0_0 := v_0.Args[0]
5983 v_0_1 := v_0.Args[1]
5984 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5985 x := v_0_0
5986 if v_0_1.Op != OpConst32 || auxIntToInt32(v_0_1.AuxInt) != 1 || x != v_1 {
5987 continue
5988 }
5989 bool := v_2
5990 if !(config.arch != "arm64") {
5991 continue
5992 }
5993 v.reset(OpAdd32)
5994 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
5995 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
5996 v1.AddArg(bool)
5997 v0.AddArg(v1)
5998 v.AddArg2(x, v0)
5999 return true
6000 }
6001 break
6002 }
6003
6004
6005
6006 for {
6007 if v_0.Op != OpAdd16 {
6008 break
6009 }
6010 t := v_0.Type
6011 _ = v_0.Args[1]
6012 v_0_0 := v_0.Args[0]
6013 v_0_1 := v_0.Args[1]
6014 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6015 x := v_0_0
6016 if v_0_1.Op != OpConst16 || auxIntToInt16(v_0_1.AuxInt) != 1 || x != v_1 {
6017 continue
6018 }
6019 bool := v_2
6020 if !(config.arch != "arm64") {
6021 continue
6022 }
6023 v.reset(OpAdd16)
6024 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6025 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6026 v1.AddArg(bool)
6027 v0.AddArg(v1)
6028 v.AddArg2(x, v0)
6029 return true
6030 }
6031 break
6032 }
6033
6034
6035 for {
6036 if v_0.Op != OpAdd8 {
6037 break
6038 }
6039 t := v_0.Type
6040 _ = v_0.Args[1]
6041 v_0_0 := v_0.Args[0]
6042 v_0_1 := v_0.Args[1]
6043 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6044 x := v_0_0
6045 if v_0_1.Op != OpConst8 || auxIntToInt8(v_0_1.AuxInt) != -1 || x != v_1 {
6046 continue
6047 }
6048 bool := v_2
6049 v.reset(OpSub8)
6050 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
6051 v0.AddArg(bool)
6052 v.AddArg2(x, v0)
6053 return true
6054 }
6055 break
6056 }
6057
6058
6059 for {
6060 if v_0.Op != OpAdd64 {
6061 break
6062 }
6063 t := v_0.Type
6064 _ = v_0.Args[1]
6065 v_0_0 := v_0.Args[0]
6066 v_0_1 := v_0.Args[1]
6067 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6068 x := v_0_0
6069 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != -1 || x != v_1 {
6070 continue
6071 }
6072 bool := v_2
6073 v.reset(OpSub64)
6074 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
6075 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6076 v1.AddArg(bool)
6077 v0.AddArg(v1)
6078 v.AddArg2(x, v0)
6079 return true
6080 }
6081 break
6082 }
6083
6084
6085 for {
6086 if v_0.Op != OpAdd32 {
6087 break
6088 }
6089 t := v_0.Type
6090 _ = v_0.Args[1]
6091 v_0_0 := v_0.Args[0]
6092 v_0_1 := v_0.Args[1]
6093 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6094 x := v_0_0
6095 if v_0_1.Op != OpConst32 || auxIntToInt32(v_0_1.AuxInt) != -1 || x != v_1 {
6096 continue
6097 }
6098 bool := v_2
6099 v.reset(OpSub32)
6100 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
6101 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6102 v1.AddArg(bool)
6103 v0.AddArg(v1)
6104 v.AddArg2(x, v0)
6105 return true
6106 }
6107 break
6108 }
6109
6110
6111 for {
6112 if v_0.Op != OpAdd16 {
6113 break
6114 }
6115 t := v_0.Type
6116 _ = v_0.Args[1]
6117 v_0_0 := v_0.Args[0]
6118 v_0_1 := v_0.Args[1]
6119 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6120 x := v_0_0
6121 if v_0_1.Op != OpConst16 || auxIntToInt16(v_0_1.AuxInt) != -1 || x != v_1 {
6122 continue
6123 }
6124 bool := v_2
6125 v.reset(OpSub16)
6126 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6127 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6128 v1.AddArg(bool)
6129 v0.AddArg(v1)
6130 v.AddArg2(x, v0)
6131 return true
6132 }
6133 break
6134 }
6135
6136
6137 for {
6138 if v_0.Op != OpLsh64x64 {
6139 break
6140 }
6141 _ = v_0.Args[1]
6142 x := v_0.Args[0]
6143 v_0_1 := v_0.Args[1]
6144 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6145 break
6146 }
6147 bool := v_2
6148 v.reset(OpLsh64x8)
6149 v.AuxInt = boolToAuxInt(true)
6150 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6151 v0.AddArg(bool)
6152 v.AddArg2(x, v0)
6153 return true
6154 }
6155
6156
6157 for {
6158 if v_0.Op != OpLsh32x64 {
6159 break
6160 }
6161 _ = v_0.Args[1]
6162 x := v_0.Args[0]
6163 v_0_1 := v_0.Args[1]
6164 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6165 break
6166 }
6167 bool := v_2
6168 v.reset(OpLsh32x8)
6169 v.AuxInt = boolToAuxInt(true)
6170 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6171 v0.AddArg(bool)
6172 v.AddArg2(x, v0)
6173 return true
6174 }
6175
6176
6177 for {
6178 if v_0.Op != OpLsh16x64 {
6179 break
6180 }
6181 _ = v_0.Args[1]
6182 x := v_0.Args[0]
6183 v_0_1 := v_0.Args[1]
6184 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6185 break
6186 }
6187 bool := v_2
6188 v.reset(OpLsh16x8)
6189 v.AuxInt = boolToAuxInt(true)
6190 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6191 v0.AddArg(bool)
6192 v.AddArg2(x, v0)
6193 return true
6194 }
6195
6196
6197 for {
6198 if v_0.Op != OpLsh8x64 {
6199 break
6200 }
6201 _ = v_0.Args[1]
6202 x := v_0.Args[0]
6203 v_0_1 := v_0.Args[1]
6204 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6205 break
6206 }
6207 bool := v_2
6208 v.reset(OpLsh8x8)
6209 v.AuxInt = boolToAuxInt(true)
6210 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6211 v0.AddArg(bool)
6212 v.AddArg2(x, v0)
6213 return true
6214 }
6215
6216
6217 for {
6218 if v_0.Op != OpRsh64x64 {
6219 break
6220 }
6221 _ = v_0.Args[1]
6222 x := v_0.Args[0]
6223 v_0_1 := v_0.Args[1]
6224 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6225 break
6226 }
6227 bool := v_2
6228 v.reset(OpRsh64x8)
6229 v.AuxInt = boolToAuxInt(true)
6230 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6231 v0.AddArg(bool)
6232 v.AddArg2(x, v0)
6233 return true
6234 }
6235
6236
6237 for {
6238 if v_0.Op != OpRsh32x64 {
6239 break
6240 }
6241 _ = v_0.Args[1]
6242 x := v_0.Args[0]
6243 v_0_1 := v_0.Args[1]
6244 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6245 break
6246 }
6247 bool := v_2
6248 v.reset(OpRsh32x8)
6249 v.AuxInt = boolToAuxInt(true)
6250 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6251 v0.AddArg(bool)
6252 v.AddArg2(x, v0)
6253 return true
6254 }
6255
6256
6257 for {
6258 if v_0.Op != OpRsh16x64 {
6259 break
6260 }
6261 _ = v_0.Args[1]
6262 x := v_0.Args[0]
6263 v_0_1 := v_0.Args[1]
6264 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6265 break
6266 }
6267 bool := v_2
6268 v.reset(OpRsh16x8)
6269 v.AuxInt = boolToAuxInt(true)
6270 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6271 v0.AddArg(bool)
6272 v.AddArg2(x, v0)
6273 return true
6274 }
6275
6276
6277 for {
6278 if v_0.Op != OpRsh8x64 {
6279 break
6280 }
6281 _ = v_0.Args[1]
6282 x := v_0.Args[0]
6283 v_0_1 := v_0.Args[1]
6284 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6285 break
6286 }
6287 bool := v_2
6288 v.reset(OpRsh8x8)
6289 v.AuxInt = boolToAuxInt(true)
6290 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6291 v0.AddArg(bool)
6292 v.AddArg2(x, v0)
6293 return true
6294 }
6295
6296
6297 for {
6298 if v_0.Op != OpRsh64Ux64 {
6299 break
6300 }
6301 _ = v_0.Args[1]
6302 x := v_0.Args[0]
6303 v_0_1 := v_0.Args[1]
6304 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6305 break
6306 }
6307 bool := v_2
6308 v.reset(OpRsh64Ux8)
6309 v.AuxInt = boolToAuxInt(true)
6310 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6311 v0.AddArg(bool)
6312 v.AddArg2(x, v0)
6313 return true
6314 }
6315
6316
6317 for {
6318 if v_0.Op != OpRsh32Ux64 {
6319 break
6320 }
6321 _ = v_0.Args[1]
6322 x := v_0.Args[0]
6323 v_0_1 := v_0.Args[1]
6324 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6325 break
6326 }
6327 bool := v_2
6328 v.reset(OpRsh32Ux8)
6329 v.AuxInt = boolToAuxInt(true)
6330 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6331 v0.AddArg(bool)
6332 v.AddArg2(x, v0)
6333 return true
6334 }
6335
6336
6337 for {
6338 if v_0.Op != OpRsh16Ux64 {
6339 break
6340 }
6341 _ = v_0.Args[1]
6342 x := v_0.Args[0]
6343 v_0_1 := v_0.Args[1]
6344 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6345 break
6346 }
6347 bool := v_2
6348 v.reset(OpRsh16Ux8)
6349 v.AuxInt = boolToAuxInt(true)
6350 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6351 v0.AddArg(bool)
6352 v.AddArg2(x, v0)
6353 return true
6354 }
6355
6356
6357 for {
6358 if v_0.Op != OpRsh8Ux64 {
6359 break
6360 }
6361 _ = v_0.Args[1]
6362 x := v_0.Args[0]
6363 v_0_1 := v_0.Args[1]
6364 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6365 break
6366 }
6367 bool := v_2
6368 v.reset(OpRsh8Ux8)
6369 v.AuxInt = boolToAuxInt(true)
6370 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6371 v0.AddArg(bool)
6372 v.AddArg2(x, v0)
6373 return true
6374 }
6375 return false
6376 }
6377 func rewriteValuegeneric_OpConstInterface(v *Value) bool {
6378 b := v.Block
6379 typ := &b.Func.Config.Types
6380
6381
6382 for {
6383 v.reset(OpIMake)
6384 v0 := b.NewValue0(v.Pos, OpConstNil, typ.Uintptr)
6385 v1 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
6386 v.AddArg2(v0, v1)
6387 return true
6388 }
6389 }
6390 func rewriteValuegeneric_OpConstSlice(v *Value) bool {
6391 b := v.Block
6392 config := b.Func.Config
6393 typ := &b.Func.Config.Types
6394
6395
6396
6397 for {
6398 if !(config.PtrSize == 4) {
6399 break
6400 }
6401 v.reset(OpSliceMake)
6402 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo())
6403 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
6404 v1.AuxInt = int32ToAuxInt(0)
6405 v.AddArg3(v0, v1, v1)
6406 return true
6407 }
6408
6409
6410
6411 for {
6412 if !(config.PtrSize == 8) {
6413 break
6414 }
6415 v.reset(OpSliceMake)
6416 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo())
6417 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
6418 v1.AuxInt = int64ToAuxInt(0)
6419 v.AddArg3(v0, v1, v1)
6420 return true
6421 }
6422 return false
6423 }
6424 func rewriteValuegeneric_OpConstString(v *Value) bool {
6425 b := v.Block
6426 config := b.Func.Config
6427 fe := b.Func.fe
6428 typ := &b.Func.Config.Types
6429
6430
6431
6432 for {
6433 str := auxToString(v.Aux)
6434 if !(config.PtrSize == 4 && str == "") {
6435 break
6436 }
6437 v.reset(OpStringMake)
6438 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
6439 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
6440 v1.AuxInt = int32ToAuxInt(0)
6441 v.AddArg2(v0, v1)
6442 return true
6443 }
6444
6445
6446
6447 for {
6448 str := auxToString(v.Aux)
6449 if !(config.PtrSize == 8 && str == "") {
6450 break
6451 }
6452 v.reset(OpStringMake)
6453 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
6454 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
6455 v1.AuxInt = int64ToAuxInt(0)
6456 v.AddArg2(v0, v1)
6457 return true
6458 }
6459
6460
6461
6462 for {
6463 str := auxToString(v.Aux)
6464 if !(config.PtrSize == 4 && str != "") {
6465 break
6466 }
6467 v.reset(OpStringMake)
6468 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr)
6469 v0.Aux = symToAux(fe.StringData(str))
6470 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
6471 v0.AddArg(v1)
6472 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int)
6473 v2.AuxInt = int32ToAuxInt(int32(len(str)))
6474 v.AddArg2(v0, v2)
6475 return true
6476 }
6477
6478
6479
6480 for {
6481 str := auxToString(v.Aux)
6482 if !(config.PtrSize == 8 && str != "") {
6483 break
6484 }
6485 v.reset(OpStringMake)
6486 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr)
6487 v0.Aux = symToAux(fe.StringData(str))
6488 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
6489 v0.AddArg(v1)
6490 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int)
6491 v2.AuxInt = int64ToAuxInt(int64(len(str)))
6492 v.AddArg2(v0, v2)
6493 return true
6494 }
6495 return false
6496 }
6497 func rewriteValuegeneric_OpConvert(v *Value) bool {
6498 v_1 := v.Args[1]
6499 v_0 := v.Args[0]
6500 b := v.Block
6501
6502
6503 for {
6504 if v_0.Op != OpAdd64 {
6505 break
6506 }
6507 _ = v_0.Args[1]
6508 v_0_0 := v_0.Args[0]
6509 v_0_1 := v_0.Args[1]
6510 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6511 if v_0_0.Op != OpConvert {
6512 continue
6513 }
6514 mem := v_0_0.Args[1]
6515 ptr := v_0_0.Args[0]
6516 off := v_0_1
6517 if mem != v_1 {
6518 continue
6519 }
6520 v.reset(OpAddPtr)
6521 v.AddArg2(ptr, off)
6522 return true
6523 }
6524 break
6525 }
6526
6527
6528 for {
6529 if v_0.Op != OpAdd32 {
6530 break
6531 }
6532 _ = v_0.Args[1]
6533 v_0_0 := v_0.Args[0]
6534 v_0_1 := v_0.Args[1]
6535 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6536 if v_0_0.Op != OpConvert {
6537 continue
6538 }
6539 mem := v_0_0.Args[1]
6540 ptr := v_0_0.Args[0]
6541 off := v_0_1
6542 if mem != v_1 {
6543 continue
6544 }
6545 v.reset(OpAddPtr)
6546 v.AddArg2(ptr, off)
6547 return true
6548 }
6549 break
6550 }
6551
6552
6553 for {
6554 if v_0.Op != OpConvert {
6555 break
6556 }
6557 mem := v_0.Args[1]
6558 ptr := v_0.Args[0]
6559 if mem != v_1 {
6560 break
6561 }
6562 v.copyOf(ptr)
6563 return true
6564 }
6565
6566
6567 for {
6568 a := v_0
6569 if a.Op != OpAdd64 {
6570 break
6571 }
6572 _ = a.Args[1]
6573 a_0 := a.Args[0]
6574 a_1 := a.Args[1]
6575 for _i0 := 0; _i0 <= 1; _i0, a_0, a_1 = _i0+1, a_1, a_0 {
6576 if a_0.Op != OpAdd64 {
6577 continue
6578 }
6579 _ = a_0.Args[1]
6580 a_0_0 := a_0.Args[0]
6581 a_0_1 := a_0.Args[1]
6582 for _i1 := 0; _i1 <= 1; _i1, a_0_0, a_0_1 = _i1+1, a_0_1, a_0_0 {
6583 if a_0_0.Op != OpConvert {
6584 continue
6585 }
6586 mem := a_0_0.Args[1]
6587 ptr := a_0_0.Args[0]
6588 off1 := a_0_1
6589 off2 := a_1
6590 if mem != v_1 {
6591 continue
6592 }
6593 v.reset(OpAddPtr)
6594 v0 := b.NewValue0(v.Pos, OpAdd64, a.Type)
6595 v0.AddArg2(off1, off2)
6596 v.AddArg2(ptr, v0)
6597 return true
6598 }
6599 }
6600 break
6601 }
6602
6603
6604 for {
6605 a := v_0
6606 if a.Op != OpAdd32 {
6607 break
6608 }
6609 _ = a.Args[1]
6610 a_0 := a.Args[0]
6611 a_1 := a.Args[1]
6612 for _i0 := 0; _i0 <= 1; _i0, a_0, a_1 = _i0+1, a_1, a_0 {
6613 if a_0.Op != OpAdd32 {
6614 continue
6615 }
6616 _ = a_0.Args[1]
6617 a_0_0 := a_0.Args[0]
6618 a_0_1 := a_0.Args[1]
6619 for _i1 := 0; _i1 <= 1; _i1, a_0_0, a_0_1 = _i1+1, a_0_1, a_0_0 {
6620 if a_0_0.Op != OpConvert {
6621 continue
6622 }
6623 mem := a_0_0.Args[1]
6624 ptr := a_0_0.Args[0]
6625 off1 := a_0_1
6626 off2 := a_1
6627 if mem != v_1 {
6628 continue
6629 }
6630 v.reset(OpAddPtr)
6631 v0 := b.NewValue0(v.Pos, OpAdd32, a.Type)
6632 v0.AddArg2(off1, off2)
6633 v.AddArg2(ptr, v0)
6634 return true
6635 }
6636 }
6637 break
6638 }
6639 return false
6640 }
6641 func rewriteValuegeneric_OpCtz16(v *Value) bool {
6642 v_0 := v.Args[0]
6643 b := v.Block
6644 config := b.Func.Config
6645
6646
6647
6648 for {
6649 if v_0.Op != OpConst16 {
6650 break
6651 }
6652 c := auxIntToInt16(v_0.AuxInt)
6653 if !(config.PtrSize == 4) {
6654 break
6655 }
6656 v.reset(OpConst32)
6657 v.AuxInt = int32ToAuxInt(int32(ntz16(c)))
6658 return true
6659 }
6660
6661
6662
6663 for {
6664 if v_0.Op != OpConst16 {
6665 break
6666 }
6667 c := auxIntToInt16(v_0.AuxInt)
6668 if !(config.PtrSize == 8) {
6669 break
6670 }
6671 v.reset(OpConst64)
6672 v.AuxInt = int64ToAuxInt(int64(ntz16(c)))
6673 return true
6674 }
6675 return false
6676 }
6677 func rewriteValuegeneric_OpCtz32(v *Value) bool {
6678 v_0 := v.Args[0]
6679 b := v.Block
6680 config := b.Func.Config
6681
6682
6683
6684 for {
6685 if v_0.Op != OpConst32 {
6686 break
6687 }
6688 c := auxIntToInt32(v_0.AuxInt)
6689 if !(config.PtrSize == 4) {
6690 break
6691 }
6692 v.reset(OpConst32)
6693 v.AuxInt = int32ToAuxInt(int32(ntz32(c)))
6694 return true
6695 }
6696
6697
6698
6699 for {
6700 if v_0.Op != OpConst32 {
6701 break
6702 }
6703 c := auxIntToInt32(v_0.AuxInt)
6704 if !(config.PtrSize == 8) {
6705 break
6706 }
6707 v.reset(OpConst64)
6708 v.AuxInt = int64ToAuxInt(int64(ntz32(c)))
6709 return true
6710 }
6711 return false
6712 }
6713 func rewriteValuegeneric_OpCtz64(v *Value) bool {
6714 v_0 := v.Args[0]
6715 b := v.Block
6716 config := b.Func.Config
6717
6718
6719
6720 for {
6721 if v_0.Op != OpConst64 {
6722 break
6723 }
6724 c := auxIntToInt64(v_0.AuxInt)
6725 if !(config.PtrSize == 4) {
6726 break
6727 }
6728 v.reset(OpConst32)
6729 v.AuxInt = int32ToAuxInt(int32(ntz64(c)))
6730 return true
6731 }
6732
6733
6734
6735 for {
6736 if v_0.Op != OpConst64 {
6737 break
6738 }
6739 c := auxIntToInt64(v_0.AuxInt)
6740 if !(config.PtrSize == 8) {
6741 break
6742 }
6743 v.reset(OpConst64)
6744 v.AuxInt = int64ToAuxInt(int64(ntz64(c)))
6745 return true
6746 }
6747 return false
6748 }
6749 func rewriteValuegeneric_OpCtz8(v *Value) bool {
6750 v_0 := v.Args[0]
6751 b := v.Block
6752 config := b.Func.Config
6753
6754
6755
6756 for {
6757 if v_0.Op != OpConst8 {
6758 break
6759 }
6760 c := auxIntToInt8(v_0.AuxInt)
6761 if !(config.PtrSize == 4) {
6762 break
6763 }
6764 v.reset(OpConst32)
6765 v.AuxInt = int32ToAuxInt(int32(ntz8(c)))
6766 return true
6767 }
6768
6769
6770
6771 for {
6772 if v_0.Op != OpConst8 {
6773 break
6774 }
6775 c := auxIntToInt8(v_0.AuxInt)
6776 if !(config.PtrSize == 8) {
6777 break
6778 }
6779 v.reset(OpConst64)
6780 v.AuxInt = int64ToAuxInt(int64(ntz8(c)))
6781 return true
6782 }
6783 return false
6784 }
6785 func rewriteValuegeneric_OpCvt32Fto32(v *Value) bool {
6786 v_0 := v.Args[0]
6787
6788
6789
6790 for {
6791 if v_0.Op != OpConst32F {
6792 break
6793 }
6794 c := auxIntToFloat32(v_0.AuxInt)
6795 if !(c >= -1<<31 && c < 1<<31) {
6796 break
6797 }
6798 v.reset(OpConst32)
6799 v.AuxInt = int32ToAuxInt(int32(c))
6800 return true
6801 }
6802 return false
6803 }
6804 func rewriteValuegeneric_OpCvt32Fto64(v *Value) bool {
6805 v_0 := v.Args[0]
6806
6807
6808
6809 for {
6810 if v_0.Op != OpConst32F {
6811 break
6812 }
6813 c := auxIntToFloat32(v_0.AuxInt)
6814 if !(c >= -1<<63 && c < 1<<63) {
6815 break
6816 }
6817 v.reset(OpConst64)
6818 v.AuxInt = int64ToAuxInt(int64(c))
6819 return true
6820 }
6821 return false
6822 }
6823 func rewriteValuegeneric_OpCvt32Fto64F(v *Value) bool {
6824 v_0 := v.Args[0]
6825
6826
6827 for {
6828 if v_0.Op != OpConst32F {
6829 break
6830 }
6831 c := auxIntToFloat32(v_0.AuxInt)
6832 v.reset(OpConst64F)
6833 v.AuxInt = float64ToAuxInt(float64(c))
6834 return true
6835 }
6836 return false
6837 }
6838 func rewriteValuegeneric_OpCvt32to32F(v *Value) bool {
6839 v_0 := v.Args[0]
6840
6841
6842 for {
6843 if v_0.Op != OpConst32 {
6844 break
6845 }
6846 c := auxIntToInt32(v_0.AuxInt)
6847 v.reset(OpConst32F)
6848 v.AuxInt = float32ToAuxInt(float32(c))
6849 return true
6850 }
6851 return false
6852 }
6853 func rewriteValuegeneric_OpCvt32to64F(v *Value) bool {
6854 v_0 := v.Args[0]
6855
6856
6857 for {
6858 if v_0.Op != OpConst32 {
6859 break
6860 }
6861 c := auxIntToInt32(v_0.AuxInt)
6862 v.reset(OpConst64F)
6863 v.AuxInt = float64ToAuxInt(float64(c))
6864 return true
6865 }
6866 return false
6867 }
6868 func rewriteValuegeneric_OpCvt64Fto32(v *Value) bool {
6869 v_0 := v.Args[0]
6870
6871
6872
6873 for {
6874 if v_0.Op != OpConst64F {
6875 break
6876 }
6877 c := auxIntToFloat64(v_0.AuxInt)
6878 if !(c >= -1<<31 && c < 1<<31) {
6879 break
6880 }
6881 v.reset(OpConst32)
6882 v.AuxInt = int32ToAuxInt(int32(c))
6883 return true
6884 }
6885 return false
6886 }
6887 func rewriteValuegeneric_OpCvt64Fto32F(v *Value) bool {
6888 v_0 := v.Args[0]
6889
6890
6891 for {
6892 if v_0.Op != OpConst64F {
6893 break
6894 }
6895 c := auxIntToFloat64(v_0.AuxInt)
6896 v.reset(OpConst32F)
6897 v.AuxInt = float32ToAuxInt(float32(c))
6898 return true
6899 }
6900
6901
6902
6903 for {
6904 sqrt0 := v_0
6905 if sqrt0.Op != OpSqrt {
6906 break
6907 }
6908 sqrt0_0 := sqrt0.Args[0]
6909 if sqrt0_0.Op != OpCvt32Fto64F {
6910 break
6911 }
6912 x := sqrt0_0.Args[0]
6913 if !(sqrt0.Uses == 1) {
6914 break
6915 }
6916 v.reset(OpSqrt32)
6917 v.AddArg(x)
6918 return true
6919 }
6920 return false
6921 }
6922 func rewriteValuegeneric_OpCvt64Fto64(v *Value) bool {
6923 v_0 := v.Args[0]
6924
6925
6926
6927 for {
6928 if v_0.Op != OpConst64F {
6929 break
6930 }
6931 c := auxIntToFloat64(v_0.AuxInt)
6932 if !(c >= -1<<63 && c < 1<<63) {
6933 break
6934 }
6935 v.reset(OpConst64)
6936 v.AuxInt = int64ToAuxInt(int64(c))
6937 return true
6938 }
6939 return false
6940 }
6941 func rewriteValuegeneric_OpCvt64to32F(v *Value) bool {
6942 v_0 := v.Args[0]
6943
6944
6945 for {
6946 if v_0.Op != OpConst64 {
6947 break
6948 }
6949 c := auxIntToInt64(v_0.AuxInt)
6950 v.reset(OpConst32F)
6951 v.AuxInt = float32ToAuxInt(float32(c))
6952 return true
6953 }
6954 return false
6955 }
6956 func rewriteValuegeneric_OpCvt64to64F(v *Value) bool {
6957 v_0 := v.Args[0]
6958
6959
6960 for {
6961 if v_0.Op != OpConst64 {
6962 break
6963 }
6964 c := auxIntToInt64(v_0.AuxInt)
6965 v.reset(OpConst64F)
6966 v.AuxInt = float64ToAuxInt(float64(c))
6967 return true
6968 }
6969 return false
6970 }
6971 func rewriteValuegeneric_OpCvtBoolToUint8(v *Value) bool {
6972 v_0 := v.Args[0]
6973
6974
6975 for {
6976 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
6977 break
6978 }
6979 v.reset(OpConst8)
6980 v.AuxInt = int8ToAuxInt(0)
6981 return true
6982 }
6983
6984
6985 for {
6986 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
6987 break
6988 }
6989 v.reset(OpConst8)
6990 v.AuxInt = int8ToAuxInt(1)
6991 return true
6992 }
6993 return false
6994 }
6995 func rewriteValuegeneric_OpDiv128u(v *Value) bool {
6996 v_2 := v.Args[2]
6997 v_1 := v.Args[1]
6998 v_0 := v.Args[0]
6999 b := v.Block
7000
7001
7002 for {
7003 t := v.Type
7004 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
7005 break
7006 }
7007 lo := v_1
7008 y := v_2
7009 v.reset(OpMakeTuple)
7010 v0 := b.NewValue0(v.Pos, OpDiv64u, t.FieldType(0))
7011 v0.AddArg2(lo, y)
7012 v1 := b.NewValue0(v.Pos, OpMod64u, t.FieldType(1))
7013 v1.AddArg2(lo, y)
7014 v.AddArg2(v0, v1)
7015 return true
7016 }
7017 return false
7018 }
7019 func rewriteValuegeneric_OpDiv16(v *Value) bool {
7020 v_1 := v.Args[1]
7021 v_0 := v.Args[0]
7022 b := v.Block
7023 typ := &b.Func.Config.Types
7024
7025
7026
7027 for {
7028 if v_0.Op != OpConst16 {
7029 break
7030 }
7031 c := auxIntToInt16(v_0.AuxInt)
7032 if v_1.Op != OpConst16 {
7033 break
7034 }
7035 d := auxIntToInt16(v_1.AuxInt)
7036 if !(d != 0) {
7037 break
7038 }
7039 v.reset(OpConst16)
7040 v.AuxInt = int16ToAuxInt(c / d)
7041 return true
7042 }
7043
7044
7045
7046 for {
7047 t := v.Type
7048 n := v_0
7049 if v_1.Op != OpConst16 {
7050 break
7051 }
7052 c := auxIntToInt16(v_1.AuxInt)
7053 if !(c < 0 && c != -1<<15) {
7054 break
7055 }
7056 v.reset(OpNeg16)
7057 v0 := b.NewValue0(v.Pos, OpDiv16, t)
7058 v1 := b.NewValue0(v.Pos, OpConst16, t)
7059 v1.AuxInt = int16ToAuxInt(-c)
7060 v0.AddArg2(n, v1)
7061 v.AddArg(v0)
7062 return true
7063 }
7064
7065
7066 for {
7067 t := v.Type
7068 x := v_0
7069 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != -1<<15 {
7070 break
7071 }
7072 v.reset(OpRsh16Ux64)
7073 v0 := b.NewValue0(v.Pos, OpAnd16, t)
7074 v1 := b.NewValue0(v.Pos, OpNeg16, t)
7075 v1.AddArg(x)
7076 v0.AddArg2(x, v1)
7077 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7078 v2.AuxInt = int64ToAuxInt(15)
7079 v.AddArg2(v0, v2)
7080 return true
7081 }
7082 return false
7083 }
7084 func rewriteValuegeneric_OpDiv16u(v *Value) bool {
7085 v_1 := v.Args[1]
7086 v_0 := v.Args[0]
7087 b := v.Block
7088 typ := &b.Func.Config.Types
7089
7090
7091
7092 for {
7093 if v_0.Op != OpConst16 {
7094 break
7095 }
7096 c := auxIntToInt16(v_0.AuxInt)
7097 if v_1.Op != OpConst16 {
7098 break
7099 }
7100 d := auxIntToInt16(v_1.AuxInt)
7101 if !(d != 0) {
7102 break
7103 }
7104 v.reset(OpConst16)
7105 v.AuxInt = int16ToAuxInt(int16(uint16(c) / uint16(d)))
7106 return true
7107 }
7108
7109
7110
7111 for {
7112 n := v_0
7113 if v_1.Op != OpConst16 {
7114 break
7115 }
7116 c := auxIntToInt16(v_1.AuxInt)
7117 if !(isPowerOfTwo(uint16(c))) {
7118 break
7119 }
7120 v.reset(OpRsh16Ux64)
7121 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7122 v0.AuxInt = int64ToAuxInt(log16u(uint16(c)))
7123 v.AddArg2(n, v0)
7124 return true
7125 }
7126 return false
7127 }
7128 func rewriteValuegeneric_OpDiv32(v *Value) bool {
7129 v_1 := v.Args[1]
7130 v_0 := v.Args[0]
7131 b := v.Block
7132 typ := &b.Func.Config.Types
7133
7134
7135
7136 for {
7137 if v_0.Op != OpConst32 {
7138 break
7139 }
7140 c := auxIntToInt32(v_0.AuxInt)
7141 if v_1.Op != OpConst32 {
7142 break
7143 }
7144 d := auxIntToInt32(v_1.AuxInt)
7145 if !(d != 0) {
7146 break
7147 }
7148 v.reset(OpConst32)
7149 v.AuxInt = int32ToAuxInt(c / d)
7150 return true
7151 }
7152
7153
7154
7155 for {
7156 t := v.Type
7157 n := v_0
7158 if v_1.Op != OpConst32 {
7159 break
7160 }
7161 c := auxIntToInt32(v_1.AuxInt)
7162 if !(c < 0 && c != -1<<31) {
7163 break
7164 }
7165 v.reset(OpNeg32)
7166 v0 := b.NewValue0(v.Pos, OpDiv32, t)
7167 v1 := b.NewValue0(v.Pos, OpConst32, t)
7168 v1.AuxInt = int32ToAuxInt(-c)
7169 v0.AddArg2(n, v1)
7170 v.AddArg(v0)
7171 return true
7172 }
7173
7174
7175 for {
7176 t := v.Type
7177 x := v_0
7178 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != -1<<31 {
7179 break
7180 }
7181 v.reset(OpRsh32Ux64)
7182 v0 := b.NewValue0(v.Pos, OpAnd32, t)
7183 v1 := b.NewValue0(v.Pos, OpNeg32, t)
7184 v1.AddArg(x)
7185 v0.AddArg2(x, v1)
7186 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7187 v2.AuxInt = int64ToAuxInt(31)
7188 v.AddArg2(v0, v2)
7189 return true
7190 }
7191 return false
7192 }
7193 func rewriteValuegeneric_OpDiv32F(v *Value) bool {
7194 v_1 := v.Args[1]
7195 v_0 := v.Args[0]
7196 b := v.Block
7197
7198
7199
7200 for {
7201 if v_0.Op != OpConst32F {
7202 break
7203 }
7204 c := auxIntToFloat32(v_0.AuxInt)
7205 if v_1.Op != OpConst32F {
7206 break
7207 }
7208 d := auxIntToFloat32(v_1.AuxInt)
7209 if !(c/d == c/d) {
7210 break
7211 }
7212 v.reset(OpConst32F)
7213 v.AuxInt = float32ToAuxInt(c / d)
7214 return true
7215 }
7216
7217
7218
7219 for {
7220 x := v_0
7221 if v_1.Op != OpConst32F {
7222 break
7223 }
7224 t := v_1.Type
7225 c := auxIntToFloat32(v_1.AuxInt)
7226 if !(reciprocalExact32(c)) {
7227 break
7228 }
7229 v.reset(OpMul32F)
7230 v0 := b.NewValue0(v.Pos, OpConst32F, t)
7231 v0.AuxInt = float32ToAuxInt(1 / c)
7232 v.AddArg2(x, v0)
7233 return true
7234 }
7235 return false
7236 }
7237 func rewriteValuegeneric_OpDiv32u(v *Value) bool {
7238 v_1 := v.Args[1]
7239 v_0 := v.Args[0]
7240 b := v.Block
7241 typ := &b.Func.Config.Types
7242
7243
7244
7245 for {
7246 if v_0.Op != OpConst32 {
7247 break
7248 }
7249 c := auxIntToInt32(v_0.AuxInt)
7250 if v_1.Op != OpConst32 {
7251 break
7252 }
7253 d := auxIntToInt32(v_1.AuxInt)
7254 if !(d != 0) {
7255 break
7256 }
7257 v.reset(OpConst32)
7258 v.AuxInt = int32ToAuxInt(int32(uint32(c) / uint32(d)))
7259 return true
7260 }
7261
7262
7263
7264 for {
7265 n := v_0
7266 if v_1.Op != OpConst32 {
7267 break
7268 }
7269 c := auxIntToInt32(v_1.AuxInt)
7270 if !(isPowerOfTwo(uint32(c))) {
7271 break
7272 }
7273 v.reset(OpRsh32Ux64)
7274 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7275 v0.AuxInt = int64ToAuxInt(log32u(uint32(c)))
7276 v.AddArg2(n, v0)
7277 return true
7278 }
7279 return false
7280 }
7281 func rewriteValuegeneric_OpDiv64(v *Value) bool {
7282 v_1 := v.Args[1]
7283 v_0 := v.Args[0]
7284 b := v.Block
7285 typ := &b.Func.Config.Types
7286
7287
7288
7289 for {
7290 if v_0.Op != OpConst64 {
7291 break
7292 }
7293 c := auxIntToInt64(v_0.AuxInt)
7294 if v_1.Op != OpConst64 {
7295 break
7296 }
7297 d := auxIntToInt64(v_1.AuxInt)
7298 if !(d != 0) {
7299 break
7300 }
7301 v.reset(OpConst64)
7302 v.AuxInt = int64ToAuxInt(c / d)
7303 return true
7304 }
7305
7306
7307
7308 for {
7309 t := v.Type
7310 n := v_0
7311 if v_1.Op != OpConst64 {
7312 break
7313 }
7314 c := auxIntToInt64(v_1.AuxInt)
7315 if !(c < 0 && c != -1<<63) {
7316 break
7317 }
7318 v.reset(OpNeg64)
7319 v0 := b.NewValue0(v.Pos, OpDiv64, t)
7320 v1 := b.NewValue0(v.Pos, OpConst64, t)
7321 v1.AuxInt = int64ToAuxInt(-c)
7322 v0.AddArg2(n, v1)
7323 v.AddArg(v0)
7324 return true
7325 }
7326
7327
7328
7329 for {
7330 x := v_0
7331 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 || !(isNonNegative(x)) {
7332 break
7333 }
7334 v.reset(OpConst64)
7335 v.AuxInt = int64ToAuxInt(0)
7336 return true
7337 }
7338
7339
7340 for {
7341 t := v.Type
7342 x := v_0
7343 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 {
7344 break
7345 }
7346 v.reset(OpRsh64Ux64)
7347 v0 := b.NewValue0(v.Pos, OpAnd64, t)
7348 v1 := b.NewValue0(v.Pos, OpNeg64, t)
7349 v1.AddArg(x)
7350 v0.AddArg2(x, v1)
7351 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7352 v2.AuxInt = int64ToAuxInt(63)
7353 v.AddArg2(v0, v2)
7354 return true
7355 }
7356 return false
7357 }
7358 func rewriteValuegeneric_OpDiv64F(v *Value) bool {
7359 v_1 := v.Args[1]
7360 v_0 := v.Args[0]
7361 b := v.Block
7362
7363
7364
7365 for {
7366 if v_0.Op != OpConst64F {
7367 break
7368 }
7369 c := auxIntToFloat64(v_0.AuxInt)
7370 if v_1.Op != OpConst64F {
7371 break
7372 }
7373 d := auxIntToFloat64(v_1.AuxInt)
7374 if !(c/d == c/d) {
7375 break
7376 }
7377 v.reset(OpConst64F)
7378 v.AuxInt = float64ToAuxInt(c / d)
7379 return true
7380 }
7381
7382
7383
7384 for {
7385 x := v_0
7386 if v_1.Op != OpConst64F {
7387 break
7388 }
7389 t := v_1.Type
7390 c := auxIntToFloat64(v_1.AuxInt)
7391 if !(reciprocalExact64(c)) {
7392 break
7393 }
7394 v.reset(OpMul64F)
7395 v0 := b.NewValue0(v.Pos, OpConst64F, t)
7396 v0.AuxInt = float64ToAuxInt(1 / c)
7397 v.AddArg2(x, v0)
7398 return true
7399 }
7400 return false
7401 }
7402 func rewriteValuegeneric_OpDiv64u(v *Value) bool {
7403 v_1 := v.Args[1]
7404 v_0 := v.Args[0]
7405 b := v.Block
7406 typ := &b.Func.Config.Types
7407
7408
7409
7410 for {
7411 if v_0.Op != OpConst64 {
7412 break
7413 }
7414 c := auxIntToInt64(v_0.AuxInt)
7415 if v_1.Op != OpConst64 {
7416 break
7417 }
7418 d := auxIntToInt64(v_1.AuxInt)
7419 if !(d != 0) {
7420 break
7421 }
7422 v.reset(OpConst64)
7423 v.AuxInt = int64ToAuxInt(int64(uint64(c) / uint64(d)))
7424 return true
7425 }
7426
7427
7428
7429 for {
7430 n := v_0
7431 if v_1.Op != OpConst64 {
7432 break
7433 }
7434 c := auxIntToInt64(v_1.AuxInt)
7435 if !(isPowerOfTwo(uint64(c))) {
7436 break
7437 }
7438 v.reset(OpRsh64Ux64)
7439 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7440 v0.AuxInt = int64ToAuxInt(log64u(uint64(c)))
7441 v.AddArg2(n, v0)
7442 return true
7443 }
7444 return false
7445 }
7446 func rewriteValuegeneric_OpDiv8(v *Value) bool {
7447 v_1 := v.Args[1]
7448 v_0 := v.Args[0]
7449 b := v.Block
7450 typ := &b.Func.Config.Types
7451
7452
7453
7454 for {
7455 if v_0.Op != OpConst8 {
7456 break
7457 }
7458 c := auxIntToInt8(v_0.AuxInt)
7459 if v_1.Op != OpConst8 {
7460 break
7461 }
7462 d := auxIntToInt8(v_1.AuxInt)
7463 if !(d != 0) {
7464 break
7465 }
7466 v.reset(OpConst8)
7467 v.AuxInt = int8ToAuxInt(c / d)
7468 return true
7469 }
7470
7471
7472
7473 for {
7474 t := v.Type
7475 n := v_0
7476 if v_1.Op != OpConst8 {
7477 break
7478 }
7479 c := auxIntToInt8(v_1.AuxInt)
7480 if !(c < 0 && c != -1<<7) {
7481 break
7482 }
7483 v.reset(OpNeg8)
7484 v0 := b.NewValue0(v.Pos, OpDiv8, t)
7485 v1 := b.NewValue0(v.Pos, OpConst8, t)
7486 v1.AuxInt = int8ToAuxInt(-c)
7487 v0.AddArg2(n, v1)
7488 v.AddArg(v0)
7489 return true
7490 }
7491
7492
7493 for {
7494 t := v.Type
7495 x := v_0
7496 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != -1<<7 {
7497 break
7498 }
7499 v.reset(OpRsh8Ux64)
7500 v0 := b.NewValue0(v.Pos, OpAnd8, t)
7501 v1 := b.NewValue0(v.Pos, OpNeg8, t)
7502 v1.AddArg(x)
7503 v0.AddArg2(x, v1)
7504 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7505 v2.AuxInt = int64ToAuxInt(7)
7506 v.AddArg2(v0, v2)
7507 return true
7508 }
7509 return false
7510 }
7511 func rewriteValuegeneric_OpDiv8u(v *Value) bool {
7512 v_1 := v.Args[1]
7513 v_0 := v.Args[0]
7514 b := v.Block
7515 typ := &b.Func.Config.Types
7516
7517
7518
7519 for {
7520 if v_0.Op != OpConst8 {
7521 break
7522 }
7523 c := auxIntToInt8(v_0.AuxInt)
7524 if v_1.Op != OpConst8 {
7525 break
7526 }
7527 d := auxIntToInt8(v_1.AuxInt)
7528 if !(d != 0) {
7529 break
7530 }
7531 v.reset(OpConst8)
7532 v.AuxInt = int8ToAuxInt(int8(uint8(c) / uint8(d)))
7533 return true
7534 }
7535
7536
7537
7538 for {
7539 n := v_0
7540 if v_1.Op != OpConst8 {
7541 break
7542 }
7543 c := auxIntToInt8(v_1.AuxInt)
7544 if !(isPowerOfTwo(uint8(c))) {
7545 break
7546 }
7547 v.reset(OpRsh8Ux64)
7548 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7549 v0.AuxInt = int64ToAuxInt(log8u(uint8(c)))
7550 v.AddArg2(n, v0)
7551 return true
7552 }
7553 return false
7554 }
7555 func rewriteValuegeneric_OpEq16(v *Value) bool {
7556 v_1 := v.Args[1]
7557 v_0 := v.Args[0]
7558 b := v.Block
7559 config := b.Func.Config
7560 typ := &b.Func.Config.Types
7561
7562
7563 for {
7564 x := v_0
7565 if x != v_1 {
7566 break
7567 }
7568 v.reset(OpConstBool)
7569 v.AuxInt = boolToAuxInt(true)
7570 return true
7571 }
7572
7573
7574 for {
7575 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7576 if v_0.Op != OpConst16 {
7577 continue
7578 }
7579 t := v_0.Type
7580 c := auxIntToInt16(v_0.AuxInt)
7581 if v_1.Op != OpAdd16 {
7582 continue
7583 }
7584 _ = v_1.Args[1]
7585 v_1_0 := v_1.Args[0]
7586 v_1_1 := v_1.Args[1]
7587 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
7588 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
7589 continue
7590 }
7591 d := auxIntToInt16(v_1_0.AuxInt)
7592 x := v_1_1
7593 v.reset(OpEq16)
7594 v0 := b.NewValue0(v.Pos, OpConst16, t)
7595 v0.AuxInt = int16ToAuxInt(c - d)
7596 v.AddArg2(v0, x)
7597 return true
7598 }
7599 }
7600 break
7601 }
7602
7603
7604 for {
7605 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7606 if v_0.Op != OpConst16 {
7607 continue
7608 }
7609 c := auxIntToInt16(v_0.AuxInt)
7610 if v_1.Op != OpConst16 {
7611 continue
7612 }
7613 d := auxIntToInt16(v_1.AuxInt)
7614 v.reset(OpConstBool)
7615 v.AuxInt = boolToAuxInt(c == d)
7616 return true
7617 }
7618 break
7619 }
7620
7621
7622
7623 for {
7624 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7625 if v_0.Op != OpMod16u {
7626 continue
7627 }
7628 _ = v_0.Args[1]
7629 x := v_0.Args[0]
7630 v_0_1 := v_0.Args[1]
7631 if v_0_1.Op != OpConst16 {
7632 continue
7633 }
7634 c := auxIntToInt16(v_0_1.AuxInt)
7635 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(x.Op != OpConst16 && udivisibleOK16(c) && !hasSmallRotate(config)) {
7636 continue
7637 }
7638 v.reset(OpEq32)
7639 v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32)
7640 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
7641 v1.AddArg(x)
7642 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
7643 v2.AuxInt = int32ToAuxInt(int32(uint16(c)))
7644 v0.AddArg2(v1, v2)
7645 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
7646 v3.AuxInt = int32ToAuxInt(0)
7647 v.AddArg2(v0, v3)
7648 return true
7649 }
7650 break
7651 }
7652
7653
7654
7655 for {
7656 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7657 if v_0.Op != OpMod16 {
7658 continue
7659 }
7660 _ = v_0.Args[1]
7661 x := v_0.Args[0]
7662 v_0_1 := v_0.Args[1]
7663 if v_0_1.Op != OpConst16 {
7664 continue
7665 }
7666 c := auxIntToInt16(v_0_1.AuxInt)
7667 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(x.Op != OpConst16 && sdivisibleOK16(c) && !hasSmallRotate(config)) {
7668 continue
7669 }
7670 v.reset(OpEq32)
7671 v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32)
7672 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
7673 v1.AddArg(x)
7674 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
7675 v2.AuxInt = int32ToAuxInt(int32(c))
7676 v0.AddArg2(v1, v2)
7677 v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
7678 v3.AuxInt = int32ToAuxInt(0)
7679 v.AddArg2(v0, v3)
7680 return true
7681 }
7682 break
7683 }
7684
7685
7686
7687 for {
7688 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7689 s := v_0
7690 if s.Op != OpSub16 {
7691 continue
7692 }
7693 y := s.Args[1]
7694 x := s.Args[0]
7695 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(s.Uses == 1) {
7696 continue
7697 }
7698 v.reset(OpEq16)
7699 v.AddArg2(x, y)
7700 return true
7701 }
7702 break
7703 }
7704
7705
7706
7707 for {
7708 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7709 if v_0.Op != OpAnd16 {
7710 continue
7711 }
7712 t := v_0.Type
7713 _ = v_0.Args[1]
7714 v_0_0 := v_0.Args[0]
7715 v_0_1 := v_0.Args[1]
7716 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
7717 x := v_0_0
7718 if v_0_1.Op != OpConst16 || v_0_1.Type != t {
7719 continue
7720 }
7721 y := auxIntToInt16(v_0_1.AuxInt)
7722 if v_1.Op != OpConst16 || v_1.Type != t || auxIntToInt16(v_1.AuxInt) != y || !(oneBit(y)) {
7723 continue
7724 }
7725 v.reset(OpNeq16)
7726 v0 := b.NewValue0(v.Pos, OpAnd16, t)
7727 v1 := b.NewValue0(v.Pos, OpConst16, t)
7728 v1.AuxInt = int16ToAuxInt(y)
7729 v0.AddArg2(x, v1)
7730 v2 := b.NewValue0(v.Pos, OpConst16, t)
7731 v2.AuxInt = int16ToAuxInt(0)
7732 v.AddArg2(v0, v2)
7733 return true
7734 }
7735 }
7736 break
7737 }
7738
7739
7740 for {
7741 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7742 if v_0.Op != OpZeroExt8to16 {
7743 continue
7744 }
7745 v_0_0 := v_0.Args[0]
7746 if v_0_0.Op != OpCvtBoolToUint8 {
7747 continue
7748 }
7749 x := v_0_0.Args[0]
7750 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
7751 continue
7752 }
7753 v.copyOf(x)
7754 return true
7755 }
7756 break
7757 }
7758
7759
7760 for {
7761 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7762 if v_0.Op != OpZeroExt8to16 {
7763 continue
7764 }
7765 v_0_0 := v_0.Args[0]
7766 if v_0_0.Op != OpCvtBoolToUint8 {
7767 continue
7768 }
7769 x := v_0_0.Args[0]
7770 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
7771 continue
7772 }
7773 v.reset(OpNot)
7774 v.AddArg(x)
7775 return true
7776 }
7777 break
7778 }
7779
7780
7781 for {
7782 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7783 if v_0.Op != OpSignExt8to16 {
7784 continue
7785 }
7786 v_0_0 := v_0.Args[0]
7787 if v_0_0.Op != OpCvtBoolToUint8 {
7788 continue
7789 }
7790 x := v_0_0.Args[0]
7791 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
7792 continue
7793 }
7794 v.copyOf(x)
7795 return true
7796 }
7797 break
7798 }
7799
7800
7801 for {
7802 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7803 if v_0.Op != OpSignExt8to16 {
7804 continue
7805 }
7806 v_0_0 := v_0.Args[0]
7807 if v_0_0.Op != OpCvtBoolToUint8 {
7808 continue
7809 }
7810 x := v_0_0.Args[0]
7811 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
7812 continue
7813 }
7814 v.reset(OpNot)
7815 v.AddArg(x)
7816 return true
7817 }
7818 break
7819 }
7820 return false
7821 }
7822 func rewriteValuegeneric_OpEq32(v *Value) bool {
7823 v_1 := v.Args[1]
7824 v_0 := v.Args[0]
7825 b := v.Block
7826
7827
7828 for {
7829 x := v_0
7830 if x != v_1 {
7831 break
7832 }
7833 v.reset(OpConstBool)
7834 v.AuxInt = boolToAuxInt(true)
7835 return true
7836 }
7837
7838
7839 for {
7840 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7841 if v_0.Op != OpConst32 {
7842 continue
7843 }
7844 t := v_0.Type
7845 c := auxIntToInt32(v_0.AuxInt)
7846 if v_1.Op != OpAdd32 {
7847 continue
7848 }
7849 _ = v_1.Args[1]
7850 v_1_0 := v_1.Args[0]
7851 v_1_1 := v_1.Args[1]
7852 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
7853 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
7854 continue
7855 }
7856 d := auxIntToInt32(v_1_0.AuxInt)
7857 x := v_1_1
7858 v.reset(OpEq32)
7859 v0 := b.NewValue0(v.Pos, OpConst32, t)
7860 v0.AuxInt = int32ToAuxInt(c - d)
7861 v.AddArg2(v0, x)
7862 return true
7863 }
7864 }
7865 break
7866 }
7867
7868
7869 for {
7870 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7871 if v_0.Op != OpConst32 {
7872 continue
7873 }
7874 c := auxIntToInt32(v_0.AuxInt)
7875 if v_1.Op != OpConst32 {
7876 continue
7877 }
7878 d := auxIntToInt32(v_1.AuxInt)
7879 v.reset(OpConstBool)
7880 v.AuxInt = boolToAuxInt(c == d)
7881 return true
7882 }
7883 break
7884 }
7885
7886
7887
7888 for {
7889 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7890 s := v_0
7891 if s.Op != OpSub32 {
7892 continue
7893 }
7894 y := s.Args[1]
7895 x := s.Args[0]
7896 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 || !(s.Uses == 1) {
7897 continue
7898 }
7899 v.reset(OpEq32)
7900 v.AddArg2(x, y)
7901 return true
7902 }
7903 break
7904 }
7905
7906
7907
7908 for {
7909 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7910 if v_0.Op != OpAnd32 {
7911 continue
7912 }
7913 t := v_0.Type
7914 _ = v_0.Args[1]
7915 v_0_0 := v_0.Args[0]
7916 v_0_1 := v_0.Args[1]
7917 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
7918 x := v_0_0
7919 if v_0_1.Op != OpConst32 || v_0_1.Type != t {
7920 continue
7921 }
7922 y := auxIntToInt32(v_0_1.AuxInt)
7923 if v_1.Op != OpConst32 || v_1.Type != t || auxIntToInt32(v_1.AuxInt) != y || !(oneBit(y)) {
7924 continue
7925 }
7926 v.reset(OpNeq32)
7927 v0 := b.NewValue0(v.Pos, OpAnd32, t)
7928 v1 := b.NewValue0(v.Pos, OpConst32, t)
7929 v1.AuxInt = int32ToAuxInt(y)
7930 v0.AddArg2(x, v1)
7931 v2 := b.NewValue0(v.Pos, OpConst32, t)
7932 v2.AuxInt = int32ToAuxInt(0)
7933 v.AddArg2(v0, v2)
7934 return true
7935 }
7936 }
7937 break
7938 }
7939
7940
7941 for {
7942 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7943 if v_0.Op != OpZeroExt8to32 {
7944 continue
7945 }
7946 v_0_0 := v_0.Args[0]
7947 if v_0_0.Op != OpCvtBoolToUint8 {
7948 continue
7949 }
7950 x := v_0_0.Args[0]
7951 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
7952 continue
7953 }
7954 v.copyOf(x)
7955 return true
7956 }
7957 break
7958 }
7959
7960
7961 for {
7962 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7963 if v_0.Op != OpZeroExt8to32 {
7964 continue
7965 }
7966 v_0_0 := v_0.Args[0]
7967 if v_0_0.Op != OpCvtBoolToUint8 {
7968 continue
7969 }
7970 x := v_0_0.Args[0]
7971 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
7972 continue
7973 }
7974 v.reset(OpNot)
7975 v.AddArg(x)
7976 return true
7977 }
7978 break
7979 }
7980
7981
7982 for {
7983 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7984 if v_0.Op != OpSignExt8to32 {
7985 continue
7986 }
7987 v_0_0 := v_0.Args[0]
7988 if v_0_0.Op != OpCvtBoolToUint8 {
7989 continue
7990 }
7991 x := v_0_0.Args[0]
7992 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
7993 continue
7994 }
7995 v.copyOf(x)
7996 return true
7997 }
7998 break
7999 }
8000
8001
8002 for {
8003 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8004 if v_0.Op != OpSignExt8to32 {
8005 continue
8006 }
8007 v_0_0 := v_0.Args[0]
8008 if v_0_0.Op != OpCvtBoolToUint8 {
8009 continue
8010 }
8011 x := v_0_0.Args[0]
8012 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
8013 continue
8014 }
8015 v.reset(OpNot)
8016 v.AddArg(x)
8017 return true
8018 }
8019 break
8020 }
8021 return false
8022 }
8023 func rewriteValuegeneric_OpEq32F(v *Value) bool {
8024 v_1 := v.Args[1]
8025 v_0 := v.Args[0]
8026
8027
8028 for {
8029 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8030 if v_0.Op != OpConst32F {
8031 continue
8032 }
8033 c := auxIntToFloat32(v_0.AuxInt)
8034 if v_1.Op != OpConst32F {
8035 continue
8036 }
8037 d := auxIntToFloat32(v_1.AuxInt)
8038 v.reset(OpConstBool)
8039 v.AuxInt = boolToAuxInt(c == d)
8040 return true
8041 }
8042 break
8043 }
8044 return false
8045 }
8046 func rewriteValuegeneric_OpEq64(v *Value) bool {
8047 v_1 := v.Args[1]
8048 v_0 := v.Args[0]
8049 b := v.Block
8050
8051
8052 for {
8053 x := v_0
8054 if x != v_1 {
8055 break
8056 }
8057 v.reset(OpConstBool)
8058 v.AuxInt = boolToAuxInt(true)
8059 return true
8060 }
8061
8062
8063 for {
8064 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8065 if v_0.Op != OpConst64 {
8066 continue
8067 }
8068 t := v_0.Type
8069 c := auxIntToInt64(v_0.AuxInt)
8070 if v_1.Op != OpAdd64 {
8071 continue
8072 }
8073 _ = v_1.Args[1]
8074 v_1_0 := v_1.Args[0]
8075 v_1_1 := v_1.Args[1]
8076 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8077 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
8078 continue
8079 }
8080 d := auxIntToInt64(v_1_0.AuxInt)
8081 x := v_1_1
8082 v.reset(OpEq64)
8083 v0 := b.NewValue0(v.Pos, OpConst64, t)
8084 v0.AuxInt = int64ToAuxInt(c - d)
8085 v.AddArg2(v0, x)
8086 return true
8087 }
8088 }
8089 break
8090 }
8091
8092
8093 for {
8094 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8095 if v_0.Op != OpConst64 {
8096 continue
8097 }
8098 c := auxIntToInt64(v_0.AuxInt)
8099 if v_1.Op != OpConst64 {
8100 continue
8101 }
8102 d := auxIntToInt64(v_1.AuxInt)
8103 v.reset(OpConstBool)
8104 v.AuxInt = boolToAuxInt(c == d)
8105 return true
8106 }
8107 break
8108 }
8109
8110
8111
8112 for {
8113 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8114 s := v_0
8115 if s.Op != OpSub64 {
8116 continue
8117 }
8118 y := s.Args[1]
8119 x := s.Args[0]
8120 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 || !(s.Uses == 1) {
8121 continue
8122 }
8123 v.reset(OpEq64)
8124 v.AddArg2(x, y)
8125 return true
8126 }
8127 break
8128 }
8129
8130
8131
8132 for {
8133 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8134 if v_0.Op != OpAnd64 {
8135 continue
8136 }
8137 t := v_0.Type
8138 _ = v_0.Args[1]
8139 v_0_0 := v_0.Args[0]
8140 v_0_1 := v_0.Args[1]
8141 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
8142 x := v_0_0
8143 if v_0_1.Op != OpConst64 || v_0_1.Type != t {
8144 continue
8145 }
8146 y := auxIntToInt64(v_0_1.AuxInt)
8147 if v_1.Op != OpConst64 || v_1.Type != t || auxIntToInt64(v_1.AuxInt) != y || !(oneBit(y)) {
8148 continue
8149 }
8150 v.reset(OpNeq64)
8151 v0 := b.NewValue0(v.Pos, OpAnd64, t)
8152 v1 := b.NewValue0(v.Pos, OpConst64, t)
8153 v1.AuxInt = int64ToAuxInt(y)
8154 v0.AddArg2(x, v1)
8155 v2 := b.NewValue0(v.Pos, OpConst64, t)
8156 v2.AuxInt = int64ToAuxInt(0)
8157 v.AddArg2(v0, v2)
8158 return true
8159 }
8160 }
8161 break
8162 }
8163
8164
8165 for {
8166 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8167 if v_0.Op != OpZeroExt8to64 {
8168 continue
8169 }
8170 v_0_0 := v_0.Args[0]
8171 if v_0_0.Op != OpCvtBoolToUint8 {
8172 continue
8173 }
8174 x := v_0_0.Args[0]
8175 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
8176 continue
8177 }
8178 v.copyOf(x)
8179 return true
8180 }
8181 break
8182 }
8183
8184
8185 for {
8186 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8187 if v_0.Op != OpZeroExt8to64 {
8188 continue
8189 }
8190 v_0_0 := v_0.Args[0]
8191 if v_0_0.Op != OpCvtBoolToUint8 {
8192 continue
8193 }
8194 x := v_0_0.Args[0]
8195 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
8196 continue
8197 }
8198 v.reset(OpNot)
8199 v.AddArg(x)
8200 return true
8201 }
8202 break
8203 }
8204
8205
8206 for {
8207 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8208 if v_0.Op != OpSignExt8to64 {
8209 continue
8210 }
8211 v_0_0 := v_0.Args[0]
8212 if v_0_0.Op != OpCvtBoolToUint8 {
8213 continue
8214 }
8215 x := v_0_0.Args[0]
8216 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
8217 continue
8218 }
8219 v.copyOf(x)
8220 return true
8221 }
8222 break
8223 }
8224
8225
8226 for {
8227 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8228 if v_0.Op != OpSignExt8to64 {
8229 continue
8230 }
8231 v_0_0 := v_0.Args[0]
8232 if v_0_0.Op != OpCvtBoolToUint8 {
8233 continue
8234 }
8235 x := v_0_0.Args[0]
8236 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
8237 continue
8238 }
8239 v.reset(OpNot)
8240 v.AddArg(x)
8241 return true
8242 }
8243 break
8244 }
8245 return false
8246 }
8247 func rewriteValuegeneric_OpEq64F(v *Value) bool {
8248 v_1 := v.Args[1]
8249 v_0 := v.Args[0]
8250
8251
8252 for {
8253 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8254 if v_0.Op != OpConst64F {
8255 continue
8256 }
8257 c := auxIntToFloat64(v_0.AuxInt)
8258 if v_1.Op != OpConst64F {
8259 continue
8260 }
8261 d := auxIntToFloat64(v_1.AuxInt)
8262 v.reset(OpConstBool)
8263 v.AuxInt = boolToAuxInt(c == d)
8264 return true
8265 }
8266 break
8267 }
8268 return false
8269 }
8270 func rewriteValuegeneric_OpEq8(v *Value) bool {
8271 v_1 := v.Args[1]
8272 v_0 := v.Args[0]
8273 b := v.Block
8274 config := b.Func.Config
8275 typ := &b.Func.Config.Types
8276
8277
8278 for {
8279 x := v_0
8280 if x != v_1 {
8281 break
8282 }
8283 v.reset(OpConstBool)
8284 v.AuxInt = boolToAuxInt(true)
8285 return true
8286 }
8287
8288
8289 for {
8290 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8291 if v_0.Op != OpConst8 {
8292 continue
8293 }
8294 t := v_0.Type
8295 c := auxIntToInt8(v_0.AuxInt)
8296 if v_1.Op != OpAdd8 {
8297 continue
8298 }
8299 _ = v_1.Args[1]
8300 v_1_0 := v_1.Args[0]
8301 v_1_1 := v_1.Args[1]
8302 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8303 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
8304 continue
8305 }
8306 d := auxIntToInt8(v_1_0.AuxInt)
8307 x := v_1_1
8308 v.reset(OpEq8)
8309 v0 := b.NewValue0(v.Pos, OpConst8, t)
8310 v0.AuxInt = int8ToAuxInt(c - d)
8311 v.AddArg2(v0, x)
8312 return true
8313 }
8314 }
8315 break
8316 }
8317
8318
8319 for {
8320 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8321 if v_0.Op != OpConst8 {
8322 continue
8323 }
8324 c := auxIntToInt8(v_0.AuxInt)
8325 if v_1.Op != OpConst8 {
8326 continue
8327 }
8328 d := auxIntToInt8(v_1.AuxInt)
8329 v.reset(OpConstBool)
8330 v.AuxInt = boolToAuxInt(c == d)
8331 return true
8332 }
8333 break
8334 }
8335
8336
8337
8338 for {
8339 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8340 if v_0.Op != OpMod8u {
8341 continue
8342 }
8343 _ = v_0.Args[1]
8344 x := v_0.Args[0]
8345 v_0_1 := v_0.Args[1]
8346 if v_0_1.Op != OpConst8 {
8347 continue
8348 }
8349 c := auxIntToInt8(v_0_1.AuxInt)
8350 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(x.Op != OpConst8 && udivisibleOK8(c) && !hasSmallRotate(config)) {
8351 continue
8352 }
8353 v.reset(OpEq32)
8354 v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32)
8355 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
8356 v1.AddArg(x)
8357 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8358 v2.AuxInt = int32ToAuxInt(int32(uint8(c)))
8359 v0.AddArg2(v1, v2)
8360 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8361 v3.AuxInt = int32ToAuxInt(0)
8362 v.AddArg2(v0, v3)
8363 return true
8364 }
8365 break
8366 }
8367
8368
8369
8370 for {
8371 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8372 if v_0.Op != OpMod8 {
8373 continue
8374 }
8375 _ = v_0.Args[1]
8376 x := v_0.Args[0]
8377 v_0_1 := v_0.Args[1]
8378 if v_0_1.Op != OpConst8 {
8379 continue
8380 }
8381 c := auxIntToInt8(v_0_1.AuxInt)
8382 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(x.Op != OpConst8 && sdivisibleOK8(c) && !hasSmallRotate(config)) {
8383 continue
8384 }
8385 v.reset(OpEq32)
8386 v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32)
8387 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
8388 v1.AddArg(x)
8389 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
8390 v2.AuxInt = int32ToAuxInt(int32(c))
8391 v0.AddArg2(v1, v2)
8392 v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
8393 v3.AuxInt = int32ToAuxInt(0)
8394 v.AddArg2(v0, v3)
8395 return true
8396 }
8397 break
8398 }
8399
8400
8401
8402 for {
8403 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8404 s := v_0
8405 if s.Op != OpSub8 {
8406 continue
8407 }
8408 y := s.Args[1]
8409 x := s.Args[0]
8410 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(s.Uses == 1) {
8411 continue
8412 }
8413 v.reset(OpEq8)
8414 v.AddArg2(x, y)
8415 return true
8416 }
8417 break
8418 }
8419
8420
8421
8422 for {
8423 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8424 if v_0.Op != OpAnd8 {
8425 continue
8426 }
8427 t := v_0.Type
8428 _ = v_0.Args[1]
8429 v_0_0 := v_0.Args[0]
8430 v_0_1 := v_0.Args[1]
8431 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
8432 x := v_0_0
8433 if v_0_1.Op != OpConst8 || v_0_1.Type != t {
8434 continue
8435 }
8436 y := auxIntToInt8(v_0_1.AuxInt)
8437 if v_1.Op != OpConst8 || v_1.Type != t || auxIntToInt8(v_1.AuxInt) != y || !(oneBit(y)) {
8438 continue
8439 }
8440 v.reset(OpNeq8)
8441 v0 := b.NewValue0(v.Pos, OpAnd8, t)
8442 v1 := b.NewValue0(v.Pos, OpConst8, t)
8443 v1.AuxInt = int8ToAuxInt(y)
8444 v0.AddArg2(x, v1)
8445 v2 := b.NewValue0(v.Pos, OpConst8, t)
8446 v2.AuxInt = int8ToAuxInt(0)
8447 v.AddArg2(v0, v2)
8448 return true
8449 }
8450 }
8451 break
8452 }
8453
8454
8455 for {
8456 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8457 if v_0.Op != OpCvtBoolToUint8 {
8458 continue
8459 }
8460 x := v_0.Args[0]
8461 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 1 {
8462 continue
8463 }
8464 v.copyOf(x)
8465 return true
8466 }
8467 break
8468 }
8469
8470
8471 for {
8472 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8473 if v_0.Op != OpCvtBoolToUint8 {
8474 continue
8475 }
8476 x := v_0.Args[0]
8477 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
8478 continue
8479 }
8480 v.reset(OpNot)
8481 v.AddArg(x)
8482 return true
8483 }
8484 break
8485 }
8486 return false
8487 }
8488 func rewriteValuegeneric_OpEqB(v *Value) bool {
8489 v_1 := v.Args[1]
8490 v_0 := v.Args[0]
8491
8492
8493 for {
8494 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8495 if v_0.Op != OpConstBool {
8496 continue
8497 }
8498 c := auxIntToBool(v_0.AuxInt)
8499 if v_1.Op != OpConstBool {
8500 continue
8501 }
8502 d := auxIntToBool(v_1.AuxInt)
8503 v.reset(OpConstBool)
8504 v.AuxInt = boolToAuxInt(c == d)
8505 return true
8506 }
8507 break
8508 }
8509
8510
8511 for {
8512 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8513 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
8514 continue
8515 }
8516 x := v_1
8517 v.reset(OpNot)
8518 v.AddArg(x)
8519 return true
8520 }
8521 break
8522 }
8523
8524
8525 for {
8526 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8527 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
8528 continue
8529 }
8530 x := v_1
8531 v.copyOf(x)
8532 return true
8533 }
8534 break
8535 }
8536 return false
8537 }
8538 func rewriteValuegeneric_OpEqInter(v *Value) bool {
8539 v_1 := v.Args[1]
8540 v_0 := v.Args[0]
8541 b := v.Block
8542 typ := &b.Func.Config.Types
8543
8544
8545 for {
8546 x := v_0
8547 y := v_1
8548 v.reset(OpEqPtr)
8549 v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
8550 v0.AddArg(x)
8551 v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
8552 v1.AddArg(y)
8553 v.AddArg2(v0, v1)
8554 return true
8555 }
8556 }
8557 func rewriteValuegeneric_OpEqPtr(v *Value) bool {
8558 v_1 := v.Args[1]
8559 v_0 := v.Args[0]
8560 b := v.Block
8561 typ := &b.Func.Config.Types
8562
8563
8564 for {
8565 x := v_0
8566 if x != v_1 {
8567 break
8568 }
8569 v.reset(OpConstBool)
8570 v.AuxInt = boolToAuxInt(true)
8571 return true
8572 }
8573
8574
8575 for {
8576 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8577 if v_0.Op != OpAddr {
8578 continue
8579 }
8580 x := auxToSym(v_0.Aux)
8581 if v_1.Op != OpAddr {
8582 continue
8583 }
8584 y := auxToSym(v_1.Aux)
8585 v.reset(OpConstBool)
8586 v.AuxInt = boolToAuxInt(x == y)
8587 return true
8588 }
8589 break
8590 }
8591
8592
8593 for {
8594 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8595 if v_0.Op != OpAddr {
8596 continue
8597 }
8598 x := auxToSym(v_0.Aux)
8599 if v_1.Op != OpOffPtr {
8600 continue
8601 }
8602 o := auxIntToInt64(v_1.AuxInt)
8603 v_1_0 := v_1.Args[0]
8604 if v_1_0.Op != OpAddr {
8605 continue
8606 }
8607 y := auxToSym(v_1_0.Aux)
8608 v.reset(OpConstBool)
8609 v.AuxInt = boolToAuxInt(x == y && o == 0)
8610 return true
8611 }
8612 break
8613 }
8614
8615
8616 for {
8617 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8618 if v_0.Op != OpOffPtr {
8619 continue
8620 }
8621 o1 := auxIntToInt64(v_0.AuxInt)
8622 v_0_0 := v_0.Args[0]
8623 if v_0_0.Op != OpAddr {
8624 continue
8625 }
8626 x := auxToSym(v_0_0.Aux)
8627 if v_1.Op != OpOffPtr {
8628 continue
8629 }
8630 o2 := auxIntToInt64(v_1.AuxInt)
8631 v_1_0 := v_1.Args[0]
8632 if v_1_0.Op != OpAddr {
8633 continue
8634 }
8635 y := auxToSym(v_1_0.Aux)
8636 v.reset(OpConstBool)
8637 v.AuxInt = boolToAuxInt(x == y && o1 == o2)
8638 return true
8639 }
8640 break
8641 }
8642
8643
8644 for {
8645 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8646 if v_0.Op != OpLocalAddr {
8647 continue
8648 }
8649 x := auxToSym(v_0.Aux)
8650 if v_1.Op != OpLocalAddr {
8651 continue
8652 }
8653 y := auxToSym(v_1.Aux)
8654 v.reset(OpConstBool)
8655 v.AuxInt = boolToAuxInt(x == y)
8656 return true
8657 }
8658 break
8659 }
8660
8661
8662 for {
8663 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8664 if v_0.Op != OpLocalAddr {
8665 continue
8666 }
8667 x := auxToSym(v_0.Aux)
8668 if v_1.Op != OpOffPtr {
8669 continue
8670 }
8671 o := auxIntToInt64(v_1.AuxInt)
8672 v_1_0 := v_1.Args[0]
8673 if v_1_0.Op != OpLocalAddr {
8674 continue
8675 }
8676 y := auxToSym(v_1_0.Aux)
8677 v.reset(OpConstBool)
8678 v.AuxInt = boolToAuxInt(x == y && o == 0)
8679 return true
8680 }
8681 break
8682 }
8683
8684
8685 for {
8686 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8687 if v_0.Op != OpOffPtr {
8688 continue
8689 }
8690 o1 := auxIntToInt64(v_0.AuxInt)
8691 v_0_0 := v_0.Args[0]
8692 if v_0_0.Op != OpLocalAddr {
8693 continue
8694 }
8695 x := auxToSym(v_0_0.Aux)
8696 if v_1.Op != OpOffPtr {
8697 continue
8698 }
8699 o2 := auxIntToInt64(v_1.AuxInt)
8700 v_1_0 := v_1.Args[0]
8701 if v_1_0.Op != OpLocalAddr {
8702 continue
8703 }
8704 y := auxToSym(v_1_0.Aux)
8705 v.reset(OpConstBool)
8706 v.AuxInt = boolToAuxInt(x == y && o1 == o2)
8707 return true
8708 }
8709 break
8710 }
8711
8712
8713
8714 for {
8715 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8716 if v_0.Op != OpOffPtr {
8717 continue
8718 }
8719 o1 := auxIntToInt64(v_0.AuxInt)
8720 p1 := v_0.Args[0]
8721 p2 := v_1
8722 if !(isSamePtr(p1, p2)) {
8723 continue
8724 }
8725 v.reset(OpConstBool)
8726 v.AuxInt = boolToAuxInt(o1 == 0)
8727 return true
8728 }
8729 break
8730 }
8731
8732
8733
8734 for {
8735 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8736 if v_0.Op != OpOffPtr {
8737 continue
8738 }
8739 o1 := auxIntToInt64(v_0.AuxInt)
8740 p1 := v_0.Args[0]
8741 if v_1.Op != OpOffPtr {
8742 continue
8743 }
8744 o2 := auxIntToInt64(v_1.AuxInt)
8745 p2 := v_1.Args[0]
8746 if !(isSamePtr(p1, p2)) {
8747 continue
8748 }
8749 v.reset(OpConstBool)
8750 v.AuxInt = boolToAuxInt(o1 == o2)
8751 return true
8752 }
8753 break
8754 }
8755
8756
8757 for {
8758 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8759 if v_0.Op != OpConst32 {
8760 continue
8761 }
8762 c := auxIntToInt32(v_0.AuxInt)
8763 if v_1.Op != OpConst32 {
8764 continue
8765 }
8766 d := auxIntToInt32(v_1.AuxInt)
8767 v.reset(OpConstBool)
8768 v.AuxInt = boolToAuxInt(c == d)
8769 return true
8770 }
8771 break
8772 }
8773
8774
8775 for {
8776 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8777 if v_0.Op != OpConst64 {
8778 continue
8779 }
8780 c := auxIntToInt64(v_0.AuxInt)
8781 if v_1.Op != OpConst64 {
8782 continue
8783 }
8784 d := auxIntToInt64(v_1.AuxInt)
8785 v.reset(OpConstBool)
8786 v.AuxInt = boolToAuxInt(c == d)
8787 return true
8788 }
8789 break
8790 }
8791
8792
8793 for {
8794 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8795 if v_0.Op != OpConvert {
8796 continue
8797 }
8798 v_0_0 := v_0.Args[0]
8799 if v_0_0.Op != OpAddr {
8800 continue
8801 }
8802 x := auxToSym(v_0_0.Aux)
8803 if v_1.Op != OpAddr {
8804 continue
8805 }
8806 y := auxToSym(v_1.Aux)
8807 v.reset(OpConstBool)
8808 v.AuxInt = boolToAuxInt(x == y)
8809 return true
8810 }
8811 break
8812 }
8813
8814
8815 for {
8816 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8817 if v_0.Op != OpLocalAddr || v_1.Op != OpAddr {
8818 continue
8819 }
8820 v.reset(OpConstBool)
8821 v.AuxInt = boolToAuxInt(false)
8822 return true
8823 }
8824 break
8825 }
8826
8827
8828 for {
8829 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8830 if v_0.Op != OpOffPtr {
8831 continue
8832 }
8833 v_0_0 := v_0.Args[0]
8834 if v_0_0.Op != OpLocalAddr || v_1.Op != OpAddr {
8835 continue
8836 }
8837 v.reset(OpConstBool)
8838 v.AuxInt = boolToAuxInt(false)
8839 return true
8840 }
8841 break
8842 }
8843
8844
8845 for {
8846 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8847 if v_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
8848 continue
8849 }
8850 v_1_0 := v_1.Args[0]
8851 if v_1_0.Op != OpAddr {
8852 continue
8853 }
8854 v.reset(OpConstBool)
8855 v.AuxInt = boolToAuxInt(false)
8856 return true
8857 }
8858 break
8859 }
8860
8861
8862 for {
8863 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8864 if v_0.Op != OpOffPtr {
8865 continue
8866 }
8867 v_0_0 := v_0.Args[0]
8868 if v_0_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
8869 continue
8870 }
8871 v_1_0 := v_1.Args[0]
8872 if v_1_0.Op != OpAddr {
8873 continue
8874 }
8875 v.reset(OpConstBool)
8876 v.AuxInt = boolToAuxInt(false)
8877 return true
8878 }
8879 break
8880 }
8881
8882
8883
8884 for {
8885 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8886 if v_0.Op != OpAddPtr {
8887 continue
8888 }
8889 o1 := v_0.Args[1]
8890 p1 := v_0.Args[0]
8891 p2 := v_1
8892 if !(isSamePtr(p1, p2)) {
8893 continue
8894 }
8895 v.reset(OpNot)
8896 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
8897 v0.AddArg(o1)
8898 v.AddArg(v0)
8899 return true
8900 }
8901 break
8902 }
8903
8904
8905 for {
8906 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8907 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
8908 continue
8909 }
8910 p := v_1
8911 v.reset(OpNot)
8912 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
8913 v0.AddArg(p)
8914 v.AddArg(v0)
8915 return true
8916 }
8917 break
8918 }
8919
8920
8921 for {
8922 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8923 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
8924 continue
8925 }
8926 p := v_1
8927 v.reset(OpNot)
8928 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
8929 v0.AddArg(p)
8930 v.AddArg(v0)
8931 return true
8932 }
8933 break
8934 }
8935
8936
8937 for {
8938 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8939 if v_0.Op != OpConstNil {
8940 continue
8941 }
8942 p := v_1
8943 v.reset(OpNot)
8944 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
8945 v0.AddArg(p)
8946 v.AddArg(v0)
8947 return true
8948 }
8949 break
8950 }
8951 return false
8952 }
8953 func rewriteValuegeneric_OpEqSlice(v *Value) bool {
8954 v_1 := v.Args[1]
8955 v_0 := v.Args[0]
8956 b := v.Block
8957 typ := &b.Func.Config.Types
8958
8959
8960 for {
8961 x := v_0
8962 y := v_1
8963 v.reset(OpEqPtr)
8964 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
8965 v0.AddArg(x)
8966 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
8967 v1.AddArg(y)
8968 v.AddArg2(v0, v1)
8969 return true
8970 }
8971 }
8972 func rewriteValuegeneric_OpFloor(v *Value) bool {
8973 v_0 := v.Args[0]
8974
8975
8976 for {
8977 if v_0.Op != OpConst64F {
8978 break
8979 }
8980 c := auxIntToFloat64(v_0.AuxInt)
8981 v.reset(OpConst64F)
8982 v.AuxInt = float64ToAuxInt(math.Floor(c))
8983 return true
8984 }
8985 return false
8986 }
8987 func rewriteValuegeneric_OpIMake(v *Value) bool {
8988 v_1 := v.Args[1]
8989 v_0 := v.Args[0]
8990
8991
8992 for {
8993 if v_1.Op != OpStructMake {
8994 break
8995 }
8996 v.copyOf(imakeOfStructMake(v))
8997 return true
8998 }
8999
9000
9001 for {
9002 _typ := v_0
9003 if v_1.Op != OpArrayMake1 {
9004 break
9005 }
9006 val := v_1.Args[0]
9007 v.reset(OpIMake)
9008 v.AddArg2(_typ, val)
9009 return true
9010 }
9011 return false
9012 }
9013 func rewriteValuegeneric_OpInterLECall(v *Value) bool {
9014
9015
9016 for {
9017 if len(v.Args) < 1 {
9018 break
9019 }
9020 v_0 := v.Args[0]
9021 if v_0.Op != OpAddr {
9022 break
9023 }
9024 fn := auxToSym(v_0.Aux)
9025 v_0_0 := v_0.Args[0]
9026 if v_0_0.Op != OpSB {
9027 break
9028 }
9029 v.copyOf(devirtLECall(v, fn.(*obj.LSym)))
9030 return true
9031 }
9032 return false
9033 }
9034 func rewriteValuegeneric_OpIsInBounds(v *Value) bool {
9035 v_1 := v.Args[1]
9036 v_0 := v.Args[0]
9037
9038
9039
9040 for {
9041 if v_0.Op != OpZeroExt8to32 || v_1.Op != OpConst32 {
9042 break
9043 }
9044 c := auxIntToInt32(v_1.AuxInt)
9045 if !((1 << 8) <= c) {
9046 break
9047 }
9048 v.reset(OpConstBool)
9049 v.AuxInt = boolToAuxInt(true)
9050 return true
9051 }
9052
9053
9054
9055 for {
9056 if v_0.Op != OpZeroExt8to64 || v_1.Op != OpConst64 {
9057 break
9058 }
9059 c := auxIntToInt64(v_1.AuxInt)
9060 if !((1 << 8) <= c) {
9061 break
9062 }
9063 v.reset(OpConstBool)
9064 v.AuxInt = boolToAuxInt(true)
9065 return true
9066 }
9067
9068
9069
9070 for {
9071 if v_0.Op != OpZeroExt16to32 || v_1.Op != OpConst32 {
9072 break
9073 }
9074 c := auxIntToInt32(v_1.AuxInt)
9075 if !((1 << 16) <= c) {
9076 break
9077 }
9078 v.reset(OpConstBool)
9079 v.AuxInt = boolToAuxInt(true)
9080 return true
9081 }
9082
9083
9084
9085 for {
9086 if v_0.Op != OpZeroExt16to64 || v_1.Op != OpConst64 {
9087 break
9088 }
9089 c := auxIntToInt64(v_1.AuxInt)
9090 if !((1 << 16) <= c) {
9091 break
9092 }
9093 v.reset(OpConstBool)
9094 v.AuxInt = boolToAuxInt(true)
9095 return true
9096 }
9097
9098
9099 for {
9100 x := v_0
9101 if x != v_1 {
9102 break
9103 }
9104 v.reset(OpConstBool)
9105 v.AuxInt = boolToAuxInt(false)
9106 return true
9107 }
9108
9109
9110
9111 for {
9112 if v_0.Op != OpAnd8 {
9113 break
9114 }
9115 v_0_0 := v_0.Args[0]
9116 v_0_1 := v_0.Args[1]
9117 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9118 if v_0_0.Op != OpConst8 {
9119 continue
9120 }
9121 c := auxIntToInt8(v_0_0.AuxInt)
9122 if v_1.Op != OpConst8 {
9123 continue
9124 }
9125 d := auxIntToInt8(v_1.AuxInt)
9126 if !(0 <= c && c < d) {
9127 continue
9128 }
9129 v.reset(OpConstBool)
9130 v.AuxInt = boolToAuxInt(true)
9131 return true
9132 }
9133 break
9134 }
9135
9136
9137
9138 for {
9139 if v_0.Op != OpZeroExt8to16 {
9140 break
9141 }
9142 v_0_0 := v_0.Args[0]
9143 if v_0_0.Op != OpAnd8 {
9144 break
9145 }
9146 v_0_0_0 := v_0_0.Args[0]
9147 v_0_0_1 := v_0_0.Args[1]
9148 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9149 if v_0_0_0.Op != OpConst8 {
9150 continue
9151 }
9152 c := auxIntToInt8(v_0_0_0.AuxInt)
9153 if v_1.Op != OpConst16 {
9154 continue
9155 }
9156 d := auxIntToInt16(v_1.AuxInt)
9157 if !(0 <= c && int16(c) < d) {
9158 continue
9159 }
9160 v.reset(OpConstBool)
9161 v.AuxInt = boolToAuxInt(true)
9162 return true
9163 }
9164 break
9165 }
9166
9167
9168
9169 for {
9170 if v_0.Op != OpZeroExt8to32 {
9171 break
9172 }
9173 v_0_0 := v_0.Args[0]
9174 if v_0_0.Op != OpAnd8 {
9175 break
9176 }
9177 v_0_0_0 := v_0_0.Args[0]
9178 v_0_0_1 := v_0_0.Args[1]
9179 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9180 if v_0_0_0.Op != OpConst8 {
9181 continue
9182 }
9183 c := auxIntToInt8(v_0_0_0.AuxInt)
9184 if v_1.Op != OpConst32 {
9185 continue
9186 }
9187 d := auxIntToInt32(v_1.AuxInt)
9188 if !(0 <= c && int32(c) < d) {
9189 continue
9190 }
9191 v.reset(OpConstBool)
9192 v.AuxInt = boolToAuxInt(true)
9193 return true
9194 }
9195 break
9196 }
9197
9198
9199
9200 for {
9201 if v_0.Op != OpZeroExt8to64 {
9202 break
9203 }
9204 v_0_0 := v_0.Args[0]
9205 if v_0_0.Op != OpAnd8 {
9206 break
9207 }
9208 v_0_0_0 := v_0_0.Args[0]
9209 v_0_0_1 := v_0_0.Args[1]
9210 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9211 if v_0_0_0.Op != OpConst8 {
9212 continue
9213 }
9214 c := auxIntToInt8(v_0_0_0.AuxInt)
9215 if v_1.Op != OpConst64 {
9216 continue
9217 }
9218 d := auxIntToInt64(v_1.AuxInt)
9219 if !(0 <= c && int64(c) < d) {
9220 continue
9221 }
9222 v.reset(OpConstBool)
9223 v.AuxInt = boolToAuxInt(true)
9224 return true
9225 }
9226 break
9227 }
9228
9229
9230
9231 for {
9232 if v_0.Op != OpAnd16 {
9233 break
9234 }
9235 v_0_0 := v_0.Args[0]
9236 v_0_1 := v_0.Args[1]
9237 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9238 if v_0_0.Op != OpConst16 {
9239 continue
9240 }
9241 c := auxIntToInt16(v_0_0.AuxInt)
9242 if v_1.Op != OpConst16 {
9243 continue
9244 }
9245 d := auxIntToInt16(v_1.AuxInt)
9246 if !(0 <= c && c < d) {
9247 continue
9248 }
9249 v.reset(OpConstBool)
9250 v.AuxInt = boolToAuxInt(true)
9251 return true
9252 }
9253 break
9254 }
9255
9256
9257
9258 for {
9259 if v_0.Op != OpZeroExt16to32 {
9260 break
9261 }
9262 v_0_0 := v_0.Args[0]
9263 if v_0_0.Op != OpAnd16 {
9264 break
9265 }
9266 v_0_0_0 := v_0_0.Args[0]
9267 v_0_0_1 := v_0_0.Args[1]
9268 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9269 if v_0_0_0.Op != OpConst16 {
9270 continue
9271 }
9272 c := auxIntToInt16(v_0_0_0.AuxInt)
9273 if v_1.Op != OpConst32 {
9274 continue
9275 }
9276 d := auxIntToInt32(v_1.AuxInt)
9277 if !(0 <= c && int32(c) < d) {
9278 continue
9279 }
9280 v.reset(OpConstBool)
9281 v.AuxInt = boolToAuxInt(true)
9282 return true
9283 }
9284 break
9285 }
9286
9287
9288
9289 for {
9290 if v_0.Op != OpZeroExt16to64 {
9291 break
9292 }
9293 v_0_0 := v_0.Args[0]
9294 if v_0_0.Op != OpAnd16 {
9295 break
9296 }
9297 v_0_0_0 := v_0_0.Args[0]
9298 v_0_0_1 := v_0_0.Args[1]
9299 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9300 if v_0_0_0.Op != OpConst16 {
9301 continue
9302 }
9303 c := auxIntToInt16(v_0_0_0.AuxInt)
9304 if v_1.Op != OpConst64 {
9305 continue
9306 }
9307 d := auxIntToInt64(v_1.AuxInt)
9308 if !(0 <= c && int64(c) < d) {
9309 continue
9310 }
9311 v.reset(OpConstBool)
9312 v.AuxInt = boolToAuxInt(true)
9313 return true
9314 }
9315 break
9316 }
9317
9318
9319
9320 for {
9321 if v_0.Op != OpAnd32 {
9322 break
9323 }
9324 v_0_0 := v_0.Args[0]
9325 v_0_1 := v_0.Args[1]
9326 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9327 if v_0_0.Op != OpConst32 {
9328 continue
9329 }
9330 c := auxIntToInt32(v_0_0.AuxInt)
9331 if v_1.Op != OpConst32 {
9332 continue
9333 }
9334 d := auxIntToInt32(v_1.AuxInt)
9335 if !(0 <= c && c < d) {
9336 continue
9337 }
9338 v.reset(OpConstBool)
9339 v.AuxInt = boolToAuxInt(true)
9340 return true
9341 }
9342 break
9343 }
9344
9345
9346
9347 for {
9348 if v_0.Op != OpZeroExt32to64 {
9349 break
9350 }
9351 v_0_0 := v_0.Args[0]
9352 if v_0_0.Op != OpAnd32 {
9353 break
9354 }
9355 v_0_0_0 := v_0_0.Args[0]
9356 v_0_0_1 := v_0_0.Args[1]
9357 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9358 if v_0_0_0.Op != OpConst32 {
9359 continue
9360 }
9361 c := auxIntToInt32(v_0_0_0.AuxInt)
9362 if v_1.Op != OpConst64 {
9363 continue
9364 }
9365 d := auxIntToInt64(v_1.AuxInt)
9366 if !(0 <= c && int64(c) < d) {
9367 continue
9368 }
9369 v.reset(OpConstBool)
9370 v.AuxInt = boolToAuxInt(true)
9371 return true
9372 }
9373 break
9374 }
9375
9376
9377
9378 for {
9379 if v_0.Op != OpAnd64 {
9380 break
9381 }
9382 v_0_0 := v_0.Args[0]
9383 v_0_1 := v_0.Args[1]
9384 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9385 if v_0_0.Op != OpConst64 {
9386 continue
9387 }
9388 c := auxIntToInt64(v_0_0.AuxInt)
9389 if v_1.Op != OpConst64 {
9390 continue
9391 }
9392 d := auxIntToInt64(v_1.AuxInt)
9393 if !(0 <= c && c < d) {
9394 continue
9395 }
9396 v.reset(OpConstBool)
9397 v.AuxInt = boolToAuxInt(true)
9398 return true
9399 }
9400 break
9401 }
9402
9403
9404 for {
9405 if v_0.Op != OpConst32 {
9406 break
9407 }
9408 c := auxIntToInt32(v_0.AuxInt)
9409 if v_1.Op != OpConst32 {
9410 break
9411 }
9412 d := auxIntToInt32(v_1.AuxInt)
9413 v.reset(OpConstBool)
9414 v.AuxInt = boolToAuxInt(0 <= c && c < d)
9415 return true
9416 }
9417
9418
9419 for {
9420 if v_0.Op != OpConst64 {
9421 break
9422 }
9423 c := auxIntToInt64(v_0.AuxInt)
9424 if v_1.Op != OpConst64 {
9425 break
9426 }
9427 d := auxIntToInt64(v_1.AuxInt)
9428 v.reset(OpConstBool)
9429 v.AuxInt = boolToAuxInt(0 <= c && c < d)
9430 return true
9431 }
9432
9433
9434 for {
9435 if v_0.Op != OpMod32u {
9436 break
9437 }
9438 y := v_0.Args[1]
9439 if y != v_1 {
9440 break
9441 }
9442 v.reset(OpConstBool)
9443 v.AuxInt = boolToAuxInt(true)
9444 return true
9445 }
9446
9447
9448 for {
9449 if v_0.Op != OpMod64u {
9450 break
9451 }
9452 y := v_0.Args[1]
9453 if y != v_1 {
9454 break
9455 }
9456 v.reset(OpConstBool)
9457 v.AuxInt = boolToAuxInt(true)
9458 return true
9459 }
9460
9461
9462
9463 for {
9464 if v_0.Op != OpZeroExt8to64 {
9465 break
9466 }
9467 v_0_0 := v_0.Args[0]
9468 if v_0_0.Op != OpRsh8Ux64 {
9469 break
9470 }
9471 _ = v_0_0.Args[1]
9472 v_0_0_1 := v_0_0.Args[1]
9473 if v_0_0_1.Op != OpConst64 {
9474 break
9475 }
9476 c := auxIntToInt64(v_0_0_1.AuxInt)
9477 if v_1.Op != OpConst64 {
9478 break
9479 }
9480 d := auxIntToInt64(v_1.AuxInt)
9481 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
9482 break
9483 }
9484 v.reset(OpConstBool)
9485 v.AuxInt = boolToAuxInt(true)
9486 return true
9487 }
9488
9489
9490
9491 for {
9492 if v_0.Op != OpZeroExt8to32 {
9493 break
9494 }
9495 v_0_0 := v_0.Args[0]
9496 if v_0_0.Op != OpRsh8Ux64 {
9497 break
9498 }
9499 _ = v_0_0.Args[1]
9500 v_0_0_1 := v_0_0.Args[1]
9501 if v_0_0_1.Op != OpConst64 {
9502 break
9503 }
9504 c := auxIntToInt64(v_0_0_1.AuxInt)
9505 if v_1.Op != OpConst32 {
9506 break
9507 }
9508 d := auxIntToInt32(v_1.AuxInt)
9509 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
9510 break
9511 }
9512 v.reset(OpConstBool)
9513 v.AuxInt = boolToAuxInt(true)
9514 return true
9515 }
9516
9517
9518
9519 for {
9520 if v_0.Op != OpZeroExt8to16 {
9521 break
9522 }
9523 v_0_0 := v_0.Args[0]
9524 if v_0_0.Op != OpRsh8Ux64 {
9525 break
9526 }
9527 _ = v_0_0.Args[1]
9528 v_0_0_1 := v_0_0.Args[1]
9529 if v_0_0_1.Op != OpConst64 {
9530 break
9531 }
9532 c := auxIntToInt64(v_0_0_1.AuxInt)
9533 if v_1.Op != OpConst16 {
9534 break
9535 }
9536 d := auxIntToInt16(v_1.AuxInt)
9537 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
9538 break
9539 }
9540 v.reset(OpConstBool)
9541 v.AuxInt = boolToAuxInt(true)
9542 return true
9543 }
9544
9545
9546
9547 for {
9548 if v_0.Op != OpRsh8Ux64 {
9549 break
9550 }
9551 _ = v_0.Args[1]
9552 v_0_1 := v_0.Args[1]
9553 if v_0_1.Op != OpConst64 {
9554 break
9555 }
9556 c := auxIntToInt64(v_0_1.AuxInt)
9557 if v_1.Op != OpConst64 {
9558 break
9559 }
9560 d := auxIntToInt64(v_1.AuxInt)
9561 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
9562 break
9563 }
9564 v.reset(OpConstBool)
9565 v.AuxInt = boolToAuxInt(true)
9566 return true
9567 }
9568
9569
9570
9571 for {
9572 if v_0.Op != OpZeroExt16to64 {
9573 break
9574 }
9575 v_0_0 := v_0.Args[0]
9576 if v_0_0.Op != OpRsh16Ux64 {
9577 break
9578 }
9579 _ = v_0_0.Args[1]
9580 v_0_0_1 := v_0_0.Args[1]
9581 if v_0_0_1.Op != OpConst64 {
9582 break
9583 }
9584 c := auxIntToInt64(v_0_0_1.AuxInt)
9585 if v_1.Op != OpConst64 {
9586 break
9587 }
9588 d := auxIntToInt64(v_1.AuxInt)
9589 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
9590 break
9591 }
9592 v.reset(OpConstBool)
9593 v.AuxInt = boolToAuxInt(true)
9594 return true
9595 }
9596
9597
9598
9599 for {
9600 if v_0.Op != OpZeroExt16to32 {
9601 break
9602 }
9603 v_0_0 := v_0.Args[0]
9604 if v_0_0.Op != OpRsh16Ux64 {
9605 break
9606 }
9607 _ = v_0_0.Args[1]
9608 v_0_0_1 := v_0_0.Args[1]
9609 if v_0_0_1.Op != OpConst64 {
9610 break
9611 }
9612 c := auxIntToInt64(v_0_0_1.AuxInt)
9613 if v_1.Op != OpConst64 {
9614 break
9615 }
9616 d := auxIntToInt64(v_1.AuxInt)
9617 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
9618 break
9619 }
9620 v.reset(OpConstBool)
9621 v.AuxInt = boolToAuxInt(true)
9622 return true
9623 }
9624
9625
9626
9627 for {
9628 if v_0.Op != OpRsh16Ux64 {
9629 break
9630 }
9631 _ = v_0.Args[1]
9632 v_0_1 := v_0.Args[1]
9633 if v_0_1.Op != OpConst64 {
9634 break
9635 }
9636 c := auxIntToInt64(v_0_1.AuxInt)
9637 if v_1.Op != OpConst64 {
9638 break
9639 }
9640 d := auxIntToInt64(v_1.AuxInt)
9641 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
9642 break
9643 }
9644 v.reset(OpConstBool)
9645 v.AuxInt = boolToAuxInt(true)
9646 return true
9647 }
9648
9649
9650
9651 for {
9652 if v_0.Op != OpZeroExt32to64 {
9653 break
9654 }
9655 v_0_0 := v_0.Args[0]
9656 if v_0_0.Op != OpRsh32Ux64 {
9657 break
9658 }
9659 _ = v_0_0.Args[1]
9660 v_0_0_1 := v_0_0.Args[1]
9661 if v_0_0_1.Op != OpConst64 {
9662 break
9663 }
9664 c := auxIntToInt64(v_0_0_1.AuxInt)
9665 if v_1.Op != OpConst64 {
9666 break
9667 }
9668 d := auxIntToInt64(v_1.AuxInt)
9669 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) {
9670 break
9671 }
9672 v.reset(OpConstBool)
9673 v.AuxInt = boolToAuxInt(true)
9674 return true
9675 }
9676
9677
9678
9679 for {
9680 if v_0.Op != OpRsh32Ux64 {
9681 break
9682 }
9683 _ = v_0.Args[1]
9684 v_0_1 := v_0.Args[1]
9685 if v_0_1.Op != OpConst64 {
9686 break
9687 }
9688 c := auxIntToInt64(v_0_1.AuxInt)
9689 if v_1.Op != OpConst64 {
9690 break
9691 }
9692 d := auxIntToInt64(v_1.AuxInt)
9693 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) {
9694 break
9695 }
9696 v.reset(OpConstBool)
9697 v.AuxInt = boolToAuxInt(true)
9698 return true
9699 }
9700
9701
9702
9703 for {
9704 if v_0.Op != OpRsh64Ux64 {
9705 break
9706 }
9707 _ = v_0.Args[1]
9708 v_0_1 := v_0.Args[1]
9709 if v_0_1.Op != OpConst64 {
9710 break
9711 }
9712 c := auxIntToInt64(v_0_1.AuxInt)
9713 if v_1.Op != OpConst64 {
9714 break
9715 }
9716 d := auxIntToInt64(v_1.AuxInt)
9717 if !(0 < c && c < 64 && 1<<uint(64-c)-1 < d) {
9718 break
9719 }
9720 v.reset(OpConstBool)
9721 v.AuxInt = boolToAuxInt(true)
9722 return true
9723 }
9724 return false
9725 }
9726 func rewriteValuegeneric_OpIsNonNil(v *Value) bool {
9727 v_0 := v.Args[0]
9728
9729
9730 for {
9731 if v_0.Op != OpConstNil {
9732 break
9733 }
9734 v.reset(OpConstBool)
9735 v.AuxInt = boolToAuxInt(false)
9736 return true
9737 }
9738
9739
9740 for {
9741 if v_0.Op != OpConst32 {
9742 break
9743 }
9744 c := auxIntToInt32(v_0.AuxInt)
9745 v.reset(OpConstBool)
9746 v.AuxInt = boolToAuxInt(c != 0)
9747 return true
9748 }
9749
9750
9751 for {
9752 if v_0.Op != OpConst64 {
9753 break
9754 }
9755 c := auxIntToInt64(v_0.AuxInt)
9756 v.reset(OpConstBool)
9757 v.AuxInt = boolToAuxInt(c != 0)
9758 return true
9759 }
9760
9761
9762 for {
9763 if v_0.Op != OpAddr {
9764 break
9765 }
9766 v.reset(OpConstBool)
9767 v.AuxInt = boolToAuxInt(true)
9768 return true
9769 }
9770
9771
9772 for {
9773 if v_0.Op != OpConvert {
9774 break
9775 }
9776 v_0_0 := v_0.Args[0]
9777 if v_0_0.Op != OpAddr {
9778 break
9779 }
9780 v.reset(OpConstBool)
9781 v.AuxInt = boolToAuxInt(true)
9782 return true
9783 }
9784
9785
9786 for {
9787 if v_0.Op != OpLocalAddr {
9788 break
9789 }
9790 v.reset(OpConstBool)
9791 v.AuxInt = boolToAuxInt(true)
9792 return true
9793 }
9794 return false
9795 }
9796 func rewriteValuegeneric_OpIsSliceInBounds(v *Value) bool {
9797 v_1 := v.Args[1]
9798 v_0 := v.Args[0]
9799
9800
9801 for {
9802 x := v_0
9803 if x != v_1 {
9804 break
9805 }
9806 v.reset(OpConstBool)
9807 v.AuxInt = boolToAuxInt(true)
9808 return true
9809 }
9810
9811
9812
9813 for {
9814 if v_0.Op != OpAnd32 {
9815 break
9816 }
9817 v_0_0 := v_0.Args[0]
9818 v_0_1 := v_0.Args[1]
9819 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9820 if v_0_0.Op != OpConst32 {
9821 continue
9822 }
9823 c := auxIntToInt32(v_0_0.AuxInt)
9824 if v_1.Op != OpConst32 {
9825 continue
9826 }
9827 d := auxIntToInt32(v_1.AuxInt)
9828 if !(0 <= c && c <= d) {
9829 continue
9830 }
9831 v.reset(OpConstBool)
9832 v.AuxInt = boolToAuxInt(true)
9833 return true
9834 }
9835 break
9836 }
9837
9838
9839
9840 for {
9841 if v_0.Op != OpAnd64 {
9842 break
9843 }
9844 v_0_0 := v_0.Args[0]
9845 v_0_1 := v_0.Args[1]
9846 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9847 if v_0_0.Op != OpConst64 {
9848 continue
9849 }
9850 c := auxIntToInt64(v_0_0.AuxInt)
9851 if v_1.Op != OpConst64 {
9852 continue
9853 }
9854 d := auxIntToInt64(v_1.AuxInt)
9855 if !(0 <= c && c <= d) {
9856 continue
9857 }
9858 v.reset(OpConstBool)
9859 v.AuxInt = boolToAuxInt(true)
9860 return true
9861 }
9862 break
9863 }
9864
9865
9866 for {
9867 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
9868 break
9869 }
9870 v.reset(OpConstBool)
9871 v.AuxInt = boolToAuxInt(true)
9872 return true
9873 }
9874
9875
9876 for {
9877 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
9878 break
9879 }
9880 v.reset(OpConstBool)
9881 v.AuxInt = boolToAuxInt(true)
9882 return true
9883 }
9884
9885
9886 for {
9887 if v_0.Op != OpConst32 {
9888 break
9889 }
9890 c := auxIntToInt32(v_0.AuxInt)
9891 if v_1.Op != OpConst32 {
9892 break
9893 }
9894 d := auxIntToInt32(v_1.AuxInt)
9895 v.reset(OpConstBool)
9896 v.AuxInt = boolToAuxInt(0 <= c && c <= d)
9897 return true
9898 }
9899
9900
9901 for {
9902 if v_0.Op != OpConst64 {
9903 break
9904 }
9905 c := auxIntToInt64(v_0.AuxInt)
9906 if v_1.Op != OpConst64 {
9907 break
9908 }
9909 d := auxIntToInt64(v_1.AuxInt)
9910 v.reset(OpConstBool)
9911 v.AuxInt = boolToAuxInt(0 <= c && c <= d)
9912 return true
9913 }
9914
9915
9916 for {
9917 if v_0.Op != OpSliceLen {
9918 break
9919 }
9920 x := v_0.Args[0]
9921 if v_1.Op != OpSliceCap || x != v_1.Args[0] {
9922 break
9923 }
9924 v.reset(OpConstBool)
9925 v.AuxInt = boolToAuxInt(true)
9926 return true
9927 }
9928 return false
9929 }
9930 func rewriteValuegeneric_OpLeq16(v *Value) bool {
9931 v_1 := v.Args[1]
9932 v_0 := v.Args[0]
9933 b := v.Block
9934
9935
9936 for {
9937 if v_0.Op != OpConst16 {
9938 break
9939 }
9940 c := auxIntToInt16(v_0.AuxInt)
9941 if v_1.Op != OpConst16 {
9942 break
9943 }
9944 d := auxIntToInt16(v_1.AuxInt)
9945 v.reset(OpConstBool)
9946 v.AuxInt = boolToAuxInt(c <= d)
9947 return true
9948 }
9949
9950
9951
9952 for {
9953 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 || v_1.Op != OpAnd16 {
9954 break
9955 }
9956 _ = v_1.Args[1]
9957 v_1_0 := v_1.Args[0]
9958 v_1_1 := v_1.Args[1]
9959 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
9960 if v_1_1.Op != OpConst16 {
9961 continue
9962 }
9963 c := auxIntToInt16(v_1_1.AuxInt)
9964 if !(c >= 0) {
9965 continue
9966 }
9967 v.reset(OpConstBool)
9968 v.AuxInt = boolToAuxInt(true)
9969 return true
9970 }
9971 break
9972 }
9973
9974
9975
9976 for {
9977 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 || v_1.Op != OpRsh16Ux64 {
9978 break
9979 }
9980 _ = v_1.Args[1]
9981 v_1_1 := v_1.Args[1]
9982 if v_1_1.Op != OpConst64 {
9983 break
9984 }
9985 c := auxIntToInt64(v_1_1.AuxInt)
9986 if !(c > 0) {
9987 break
9988 }
9989 v.reset(OpConstBool)
9990 v.AuxInt = boolToAuxInt(true)
9991 return true
9992 }
9993
9994
9995 for {
9996 x := v_0
9997 if v_1.Op != OpConst16 {
9998 break
9999 }
10000 t := v_1.Type
10001 if auxIntToInt16(v_1.AuxInt) != -1 {
10002 break
10003 }
10004 v.reset(OpLess16)
10005 v0 := b.NewValue0(v.Pos, OpConst16, t)
10006 v0.AuxInt = int16ToAuxInt(0)
10007 v.AddArg2(x, v0)
10008 return true
10009 }
10010
10011
10012 for {
10013 if v_0.Op != OpConst16 {
10014 break
10015 }
10016 t := v_0.Type
10017 if auxIntToInt16(v_0.AuxInt) != 1 {
10018 break
10019 }
10020 x := v_1
10021 v.reset(OpLess16)
10022 v0 := b.NewValue0(v.Pos, OpConst16, t)
10023 v0.AuxInt = int16ToAuxInt(0)
10024 v.AddArg2(v0, x)
10025 return true
10026 }
10027
10028
10029 for {
10030 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != math.MinInt16 {
10031 break
10032 }
10033 v.reset(OpConstBool)
10034 v.AuxInt = boolToAuxInt(true)
10035 return true
10036 }
10037
10038
10039 for {
10040 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != math.MaxInt16 {
10041 break
10042 }
10043 v.reset(OpConstBool)
10044 v.AuxInt = boolToAuxInt(true)
10045 return true
10046 }
10047
10048
10049 for {
10050 x := v_0
10051 c := v_1
10052 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != math.MinInt16 {
10053 break
10054 }
10055 v.reset(OpEq16)
10056 v.AddArg2(x, c)
10057 return true
10058 }
10059
10060
10061 for {
10062 c := v_0
10063 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != math.MaxInt16 {
10064 break
10065 }
10066 x := v_1
10067 v.reset(OpEq16)
10068 v.AddArg2(x, c)
10069 return true
10070 }
10071 return false
10072 }
10073 func rewriteValuegeneric_OpLeq16U(v *Value) bool {
10074 v_1 := v.Args[1]
10075 v_0 := v.Args[0]
10076 b := v.Block
10077
10078
10079 for {
10080 if v_0.Op != OpConst16 {
10081 break
10082 }
10083 c := auxIntToInt16(v_0.AuxInt)
10084 if v_1.Op != OpConst16 {
10085 break
10086 }
10087 d := auxIntToInt16(v_1.AuxInt)
10088 v.reset(OpConstBool)
10089 v.AuxInt = boolToAuxInt(uint16(c) <= uint16(d))
10090 return true
10091 }
10092
10093
10094 for {
10095 if v_0.Op != OpConst16 {
10096 break
10097 }
10098 t := v_0.Type
10099 if auxIntToInt16(v_0.AuxInt) != 1 {
10100 break
10101 }
10102 x := v_1
10103 v.reset(OpNeq16)
10104 v0 := b.NewValue0(v.Pos, OpConst16, t)
10105 v0.AuxInt = int16ToAuxInt(0)
10106 v.AddArg2(v0, x)
10107 return true
10108 }
10109
10110
10111 for {
10112 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
10113 break
10114 }
10115 v.reset(OpConstBool)
10116 v.AuxInt = boolToAuxInt(true)
10117 return true
10118 }
10119
10120
10121 for {
10122 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != -1 {
10123 break
10124 }
10125 v.reset(OpConstBool)
10126 v.AuxInt = boolToAuxInt(true)
10127 return true
10128 }
10129
10130
10131 for {
10132 x := v_0
10133 c := v_1
10134 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != 0 {
10135 break
10136 }
10137 v.reset(OpEq16)
10138 v.AddArg2(x, c)
10139 return true
10140 }
10141
10142
10143 for {
10144 c := v_0
10145 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != -1 {
10146 break
10147 }
10148 x := v_1
10149 v.reset(OpEq16)
10150 v.AddArg2(x, c)
10151 return true
10152 }
10153 return false
10154 }
10155 func rewriteValuegeneric_OpLeq32(v *Value) bool {
10156 v_1 := v.Args[1]
10157 v_0 := v.Args[0]
10158 b := v.Block
10159
10160
10161 for {
10162 if v_0.Op != OpConst32 {
10163 break
10164 }
10165 c := auxIntToInt32(v_0.AuxInt)
10166 if v_1.Op != OpConst32 {
10167 break
10168 }
10169 d := auxIntToInt32(v_1.AuxInt)
10170 v.reset(OpConstBool)
10171 v.AuxInt = boolToAuxInt(c <= d)
10172 return true
10173 }
10174
10175
10176
10177 for {
10178 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 || v_1.Op != OpAnd32 {
10179 break
10180 }
10181 _ = v_1.Args[1]
10182 v_1_0 := v_1.Args[0]
10183 v_1_1 := v_1.Args[1]
10184 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
10185 if v_1_1.Op != OpConst32 {
10186 continue
10187 }
10188 c := auxIntToInt32(v_1_1.AuxInt)
10189 if !(c >= 0) {
10190 continue
10191 }
10192 v.reset(OpConstBool)
10193 v.AuxInt = boolToAuxInt(true)
10194 return true
10195 }
10196 break
10197 }
10198
10199
10200
10201 for {
10202 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 || v_1.Op != OpRsh32Ux64 {
10203 break
10204 }
10205 _ = v_1.Args[1]
10206 v_1_1 := v_1.Args[1]
10207 if v_1_1.Op != OpConst64 {
10208 break
10209 }
10210 c := auxIntToInt64(v_1_1.AuxInt)
10211 if !(c > 0) {
10212 break
10213 }
10214 v.reset(OpConstBool)
10215 v.AuxInt = boolToAuxInt(true)
10216 return true
10217 }
10218
10219
10220 for {
10221 x := v_0
10222 if v_1.Op != OpConst32 {
10223 break
10224 }
10225 t := v_1.Type
10226 if auxIntToInt32(v_1.AuxInt) != -1 {
10227 break
10228 }
10229 v.reset(OpLess32)
10230 v0 := b.NewValue0(v.Pos, OpConst32, t)
10231 v0.AuxInt = int32ToAuxInt(0)
10232 v.AddArg2(x, v0)
10233 return true
10234 }
10235
10236
10237 for {
10238 if v_0.Op != OpConst32 {
10239 break
10240 }
10241 t := v_0.Type
10242 if auxIntToInt32(v_0.AuxInt) != 1 {
10243 break
10244 }
10245 x := v_1
10246 v.reset(OpLess32)
10247 v0 := b.NewValue0(v.Pos, OpConst32, t)
10248 v0.AuxInt = int32ToAuxInt(0)
10249 v.AddArg2(v0, x)
10250 return true
10251 }
10252
10253
10254 for {
10255 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != math.MinInt32 {
10256 break
10257 }
10258 v.reset(OpConstBool)
10259 v.AuxInt = boolToAuxInt(true)
10260 return true
10261 }
10262
10263
10264 for {
10265 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != math.MaxInt32 {
10266 break
10267 }
10268 v.reset(OpConstBool)
10269 v.AuxInt = boolToAuxInt(true)
10270 return true
10271 }
10272
10273
10274 for {
10275 x := v_0
10276 c := v_1
10277 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != math.MinInt32 {
10278 break
10279 }
10280 v.reset(OpEq32)
10281 v.AddArg2(x, c)
10282 return true
10283 }
10284
10285
10286 for {
10287 c := v_0
10288 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != math.MaxInt32 {
10289 break
10290 }
10291 x := v_1
10292 v.reset(OpEq32)
10293 v.AddArg2(x, c)
10294 return true
10295 }
10296 return false
10297 }
10298 func rewriteValuegeneric_OpLeq32F(v *Value) bool {
10299 v_1 := v.Args[1]
10300 v_0 := v.Args[0]
10301
10302
10303 for {
10304 if v_0.Op != OpConst32F {
10305 break
10306 }
10307 c := auxIntToFloat32(v_0.AuxInt)
10308 if v_1.Op != OpConst32F {
10309 break
10310 }
10311 d := auxIntToFloat32(v_1.AuxInt)
10312 v.reset(OpConstBool)
10313 v.AuxInt = boolToAuxInt(c <= d)
10314 return true
10315 }
10316 return false
10317 }
10318 func rewriteValuegeneric_OpLeq32U(v *Value) bool {
10319 v_1 := v.Args[1]
10320 v_0 := v.Args[0]
10321 b := v.Block
10322
10323
10324 for {
10325 if v_0.Op != OpConst32 {
10326 break
10327 }
10328 c := auxIntToInt32(v_0.AuxInt)
10329 if v_1.Op != OpConst32 {
10330 break
10331 }
10332 d := auxIntToInt32(v_1.AuxInt)
10333 v.reset(OpConstBool)
10334 v.AuxInt = boolToAuxInt(uint32(c) <= uint32(d))
10335 return true
10336 }
10337
10338
10339 for {
10340 if v_0.Op != OpConst32 {
10341 break
10342 }
10343 t := v_0.Type
10344 if auxIntToInt32(v_0.AuxInt) != 1 {
10345 break
10346 }
10347 x := v_1
10348 v.reset(OpNeq32)
10349 v0 := b.NewValue0(v.Pos, OpConst32, t)
10350 v0.AuxInt = int32ToAuxInt(0)
10351 v.AddArg2(v0, x)
10352 return true
10353 }
10354
10355
10356 for {
10357 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
10358 break
10359 }
10360 v.reset(OpConstBool)
10361 v.AuxInt = boolToAuxInt(true)
10362 return true
10363 }
10364
10365
10366 for {
10367 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != -1 {
10368 break
10369 }
10370 v.reset(OpConstBool)
10371 v.AuxInt = boolToAuxInt(true)
10372 return true
10373 }
10374
10375
10376 for {
10377 x := v_0
10378 c := v_1
10379 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != 0 {
10380 break
10381 }
10382 v.reset(OpEq32)
10383 v.AddArg2(x, c)
10384 return true
10385 }
10386
10387
10388 for {
10389 c := v_0
10390 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != -1 {
10391 break
10392 }
10393 x := v_1
10394 v.reset(OpEq32)
10395 v.AddArg2(x, c)
10396 return true
10397 }
10398 return false
10399 }
10400 func rewriteValuegeneric_OpLeq64(v *Value) bool {
10401 v_1 := v.Args[1]
10402 v_0 := v.Args[0]
10403 b := v.Block
10404
10405
10406 for {
10407 if v_0.Op != OpConst64 {
10408 break
10409 }
10410 c := auxIntToInt64(v_0.AuxInt)
10411 if v_1.Op != OpConst64 {
10412 break
10413 }
10414 d := auxIntToInt64(v_1.AuxInt)
10415 v.reset(OpConstBool)
10416 v.AuxInt = boolToAuxInt(c <= d)
10417 return true
10418 }
10419
10420
10421
10422 for {
10423 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 || v_1.Op != OpAnd64 {
10424 break
10425 }
10426 _ = v_1.Args[1]
10427 v_1_0 := v_1.Args[0]
10428 v_1_1 := v_1.Args[1]
10429 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
10430 if v_1_1.Op != OpConst64 {
10431 continue
10432 }
10433 c := auxIntToInt64(v_1_1.AuxInt)
10434 if !(c >= 0) {
10435 continue
10436 }
10437 v.reset(OpConstBool)
10438 v.AuxInt = boolToAuxInt(true)
10439 return true
10440 }
10441 break
10442 }
10443
10444
10445
10446 for {
10447 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 || v_1.Op != OpRsh64Ux64 {
10448 break
10449 }
10450 _ = v_1.Args[1]
10451 v_1_1 := v_1.Args[1]
10452 if v_1_1.Op != OpConst64 {
10453 break
10454 }
10455 c := auxIntToInt64(v_1_1.AuxInt)
10456 if !(c > 0) {
10457 break
10458 }
10459 v.reset(OpConstBool)
10460 v.AuxInt = boolToAuxInt(true)
10461 return true
10462 }
10463
10464
10465 for {
10466 x := v_0
10467 if v_1.Op != OpConst64 {
10468 break
10469 }
10470 t := v_1.Type
10471 if auxIntToInt64(v_1.AuxInt) != -1 {
10472 break
10473 }
10474 v.reset(OpLess64)
10475 v0 := b.NewValue0(v.Pos, OpConst64, t)
10476 v0.AuxInt = int64ToAuxInt(0)
10477 v.AddArg2(x, v0)
10478 return true
10479 }
10480
10481
10482 for {
10483 if v_0.Op != OpConst64 {
10484 break
10485 }
10486 t := v_0.Type
10487 if auxIntToInt64(v_0.AuxInt) != 1 {
10488 break
10489 }
10490 x := v_1
10491 v.reset(OpLess64)
10492 v0 := b.NewValue0(v.Pos, OpConst64, t)
10493 v0.AuxInt = int64ToAuxInt(0)
10494 v.AddArg2(v0, x)
10495 return true
10496 }
10497
10498
10499 for {
10500 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != math.MinInt64 {
10501 break
10502 }
10503 v.reset(OpConstBool)
10504 v.AuxInt = boolToAuxInt(true)
10505 return true
10506 }
10507
10508
10509 for {
10510 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != math.MaxInt64 {
10511 break
10512 }
10513 v.reset(OpConstBool)
10514 v.AuxInt = boolToAuxInt(true)
10515 return true
10516 }
10517
10518
10519 for {
10520 x := v_0
10521 c := v_1
10522 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != math.MinInt64 {
10523 break
10524 }
10525 v.reset(OpEq64)
10526 v.AddArg2(x, c)
10527 return true
10528 }
10529
10530
10531 for {
10532 c := v_0
10533 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != math.MaxInt64 {
10534 break
10535 }
10536 x := v_1
10537 v.reset(OpEq64)
10538 v.AddArg2(x, c)
10539 return true
10540 }
10541 return false
10542 }
10543 func rewriteValuegeneric_OpLeq64F(v *Value) bool {
10544 v_1 := v.Args[1]
10545 v_0 := v.Args[0]
10546
10547
10548 for {
10549 if v_0.Op != OpConst64F {
10550 break
10551 }
10552 c := auxIntToFloat64(v_0.AuxInt)
10553 if v_1.Op != OpConst64F {
10554 break
10555 }
10556 d := auxIntToFloat64(v_1.AuxInt)
10557 v.reset(OpConstBool)
10558 v.AuxInt = boolToAuxInt(c <= d)
10559 return true
10560 }
10561 return false
10562 }
10563 func rewriteValuegeneric_OpLeq64U(v *Value) bool {
10564 v_1 := v.Args[1]
10565 v_0 := v.Args[0]
10566 b := v.Block
10567
10568
10569 for {
10570 if v_0.Op != OpConst64 {
10571 break
10572 }
10573 c := auxIntToInt64(v_0.AuxInt)
10574 if v_1.Op != OpConst64 {
10575 break
10576 }
10577 d := auxIntToInt64(v_1.AuxInt)
10578 v.reset(OpConstBool)
10579 v.AuxInt = boolToAuxInt(uint64(c) <= uint64(d))
10580 return true
10581 }
10582
10583
10584 for {
10585 if v_0.Op != OpConst64 {
10586 break
10587 }
10588 t := v_0.Type
10589 if auxIntToInt64(v_0.AuxInt) != 1 {
10590 break
10591 }
10592 x := v_1
10593 v.reset(OpNeq64)
10594 v0 := b.NewValue0(v.Pos, OpConst64, t)
10595 v0.AuxInt = int64ToAuxInt(0)
10596 v.AddArg2(v0, x)
10597 return true
10598 }
10599
10600
10601 for {
10602 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
10603 break
10604 }
10605 v.reset(OpConstBool)
10606 v.AuxInt = boolToAuxInt(true)
10607 return true
10608 }
10609
10610
10611 for {
10612 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1 {
10613 break
10614 }
10615 v.reset(OpConstBool)
10616 v.AuxInt = boolToAuxInt(true)
10617 return true
10618 }
10619
10620
10621 for {
10622 x := v_0
10623 c := v_1
10624 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != 0 {
10625 break
10626 }
10627 v.reset(OpEq64)
10628 v.AddArg2(x, c)
10629 return true
10630 }
10631
10632
10633 for {
10634 c := v_0
10635 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != -1 {
10636 break
10637 }
10638 x := v_1
10639 v.reset(OpEq64)
10640 v.AddArg2(x, c)
10641 return true
10642 }
10643 return false
10644 }
10645 func rewriteValuegeneric_OpLeq8(v *Value) bool {
10646 v_1 := v.Args[1]
10647 v_0 := v.Args[0]
10648 b := v.Block
10649
10650
10651 for {
10652 if v_0.Op != OpConst8 {
10653 break
10654 }
10655 c := auxIntToInt8(v_0.AuxInt)
10656 if v_1.Op != OpConst8 {
10657 break
10658 }
10659 d := auxIntToInt8(v_1.AuxInt)
10660 v.reset(OpConstBool)
10661 v.AuxInt = boolToAuxInt(c <= d)
10662 return true
10663 }
10664
10665
10666
10667 for {
10668 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 || v_1.Op != OpAnd8 {
10669 break
10670 }
10671 _ = v_1.Args[1]
10672 v_1_0 := v_1.Args[0]
10673 v_1_1 := v_1.Args[1]
10674 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
10675 if v_1_1.Op != OpConst8 {
10676 continue
10677 }
10678 c := auxIntToInt8(v_1_1.AuxInt)
10679 if !(c >= 0) {
10680 continue
10681 }
10682 v.reset(OpConstBool)
10683 v.AuxInt = boolToAuxInt(true)
10684 return true
10685 }
10686 break
10687 }
10688
10689
10690
10691 for {
10692 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 || v_1.Op != OpRsh8Ux64 {
10693 break
10694 }
10695 _ = v_1.Args[1]
10696 v_1_1 := v_1.Args[1]
10697 if v_1_1.Op != OpConst64 {
10698 break
10699 }
10700 c := auxIntToInt64(v_1_1.AuxInt)
10701 if !(c > 0) {
10702 break
10703 }
10704 v.reset(OpConstBool)
10705 v.AuxInt = boolToAuxInt(true)
10706 return true
10707 }
10708
10709
10710 for {
10711 x := v_0
10712 if v_1.Op != OpConst8 {
10713 break
10714 }
10715 t := v_1.Type
10716 if auxIntToInt8(v_1.AuxInt) != -1 {
10717 break
10718 }
10719 v.reset(OpLess8)
10720 v0 := b.NewValue0(v.Pos, OpConst8, t)
10721 v0.AuxInt = int8ToAuxInt(0)
10722 v.AddArg2(x, v0)
10723 return true
10724 }
10725
10726
10727 for {
10728 if v_0.Op != OpConst8 {
10729 break
10730 }
10731 t := v_0.Type
10732 if auxIntToInt8(v_0.AuxInt) != 1 {
10733 break
10734 }
10735 x := v_1
10736 v.reset(OpLess8)
10737 v0 := b.NewValue0(v.Pos, OpConst8, t)
10738 v0.AuxInt = int8ToAuxInt(0)
10739 v.AddArg2(v0, x)
10740 return true
10741 }
10742
10743
10744 for {
10745 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != math.MinInt8 {
10746 break
10747 }
10748 v.reset(OpConstBool)
10749 v.AuxInt = boolToAuxInt(true)
10750 return true
10751 }
10752
10753
10754 for {
10755 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != math.MaxInt8 {
10756 break
10757 }
10758 v.reset(OpConstBool)
10759 v.AuxInt = boolToAuxInt(true)
10760 return true
10761 }
10762
10763
10764 for {
10765 x := v_0
10766 c := v_1
10767 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != math.MinInt8 {
10768 break
10769 }
10770 v.reset(OpEq8)
10771 v.AddArg2(x, c)
10772 return true
10773 }
10774
10775
10776 for {
10777 c := v_0
10778 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != math.MaxInt8 {
10779 break
10780 }
10781 x := v_1
10782 v.reset(OpEq8)
10783 v.AddArg2(x, c)
10784 return true
10785 }
10786 return false
10787 }
10788 func rewriteValuegeneric_OpLeq8U(v *Value) bool {
10789 v_1 := v.Args[1]
10790 v_0 := v.Args[0]
10791 b := v.Block
10792
10793
10794 for {
10795 if v_0.Op != OpConst8 {
10796 break
10797 }
10798 c := auxIntToInt8(v_0.AuxInt)
10799 if v_1.Op != OpConst8 {
10800 break
10801 }
10802 d := auxIntToInt8(v_1.AuxInt)
10803 v.reset(OpConstBool)
10804 v.AuxInt = boolToAuxInt(uint8(c) <= uint8(d))
10805 return true
10806 }
10807
10808
10809 for {
10810 if v_0.Op != OpConst8 {
10811 break
10812 }
10813 t := v_0.Type
10814 if auxIntToInt8(v_0.AuxInt) != 1 {
10815 break
10816 }
10817 x := v_1
10818 v.reset(OpNeq8)
10819 v0 := b.NewValue0(v.Pos, OpConst8, t)
10820 v0.AuxInt = int8ToAuxInt(0)
10821 v.AddArg2(v0, x)
10822 return true
10823 }
10824
10825
10826 for {
10827 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
10828 break
10829 }
10830 v.reset(OpConstBool)
10831 v.AuxInt = boolToAuxInt(true)
10832 return true
10833 }
10834
10835
10836 for {
10837 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != -1 {
10838 break
10839 }
10840 v.reset(OpConstBool)
10841 v.AuxInt = boolToAuxInt(true)
10842 return true
10843 }
10844
10845
10846 for {
10847 x := v_0
10848 c := v_1
10849 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != 0 {
10850 break
10851 }
10852 v.reset(OpEq8)
10853 v.AddArg2(x, c)
10854 return true
10855 }
10856
10857
10858 for {
10859 c := v_0
10860 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != -1 {
10861 break
10862 }
10863 x := v_1
10864 v.reset(OpEq8)
10865 v.AddArg2(x, c)
10866 return true
10867 }
10868 return false
10869 }
10870 func rewriteValuegeneric_OpLess16(v *Value) bool {
10871 v_1 := v.Args[1]
10872 v_0 := v.Args[0]
10873 b := v.Block
10874
10875
10876 for {
10877 if v_0.Op != OpConst16 {
10878 break
10879 }
10880 c := auxIntToInt16(v_0.AuxInt)
10881 if v_1.Op != OpConst16 {
10882 break
10883 }
10884 d := auxIntToInt16(v_1.AuxInt)
10885 v.reset(OpConstBool)
10886 v.AuxInt = boolToAuxInt(c < d)
10887 return true
10888 }
10889
10890
10891
10892 for {
10893 if v_0.Op != OpConst16 {
10894 break
10895 }
10896 t := v_0.Type
10897 if auxIntToInt16(v_0.AuxInt) != 0 {
10898 break
10899 }
10900 x := v_1
10901 if !(isNonNegative(x)) {
10902 break
10903 }
10904 v.reset(OpNeq16)
10905 v0 := b.NewValue0(v.Pos, OpConst16, t)
10906 v0.AuxInt = int16ToAuxInt(0)
10907 v.AddArg2(v0, x)
10908 return true
10909 }
10910
10911
10912
10913 for {
10914 x := v_0
10915 if v_1.Op != OpConst16 {
10916 break
10917 }
10918 t := v_1.Type
10919 if auxIntToInt16(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
10920 break
10921 }
10922 v.reset(OpEq16)
10923 v0 := b.NewValue0(v.Pos, OpConst16, t)
10924 v0.AuxInt = int16ToAuxInt(0)
10925 v.AddArg2(v0, x)
10926 return true
10927 }
10928
10929
10930 for {
10931 x := v_0
10932 if v_1.Op != OpConst16 {
10933 break
10934 }
10935 t := v_1.Type
10936 if auxIntToInt16(v_1.AuxInt) != 1 {
10937 break
10938 }
10939 v.reset(OpLeq16)
10940 v0 := b.NewValue0(v.Pos, OpConst16, t)
10941 v0.AuxInt = int16ToAuxInt(0)
10942 v.AddArg2(x, v0)
10943 return true
10944 }
10945
10946
10947 for {
10948 if v_0.Op != OpConst16 {
10949 break
10950 }
10951 t := v_0.Type
10952 if auxIntToInt16(v_0.AuxInt) != -1 {
10953 break
10954 }
10955 x := v_1
10956 v.reset(OpLeq16)
10957 v0 := b.NewValue0(v.Pos, OpConst16, t)
10958 v0.AuxInt = int16ToAuxInt(0)
10959 v.AddArg2(v0, x)
10960 return true
10961 }
10962
10963
10964 for {
10965 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != math.MinInt16 {
10966 break
10967 }
10968 v.reset(OpConstBool)
10969 v.AuxInt = boolToAuxInt(false)
10970 return true
10971 }
10972
10973
10974 for {
10975 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != math.MaxInt16 {
10976 break
10977 }
10978 v.reset(OpConstBool)
10979 v.AuxInt = boolToAuxInt(false)
10980 return true
10981 }
10982
10983
10984 for {
10985 x := v_0
10986 if v_1.Op != OpConst16 {
10987 break
10988 }
10989 t := v_1.Type
10990 if auxIntToInt16(v_1.AuxInt) != math.MinInt16+1 {
10991 break
10992 }
10993 v.reset(OpEq16)
10994 v0 := b.NewValue0(v.Pos, OpConst16, t)
10995 v0.AuxInt = int16ToAuxInt(math.MinInt16)
10996 v.AddArg2(x, v0)
10997 return true
10998 }
10999
11000
11001 for {
11002 if v_0.Op != OpConst16 {
11003 break
11004 }
11005 t := v_0.Type
11006 if auxIntToInt16(v_0.AuxInt) != math.MaxInt16-1 {
11007 break
11008 }
11009 x := v_1
11010 v.reset(OpEq16)
11011 v0 := b.NewValue0(v.Pos, OpConst16, t)
11012 v0.AuxInt = int16ToAuxInt(math.MaxInt16)
11013 v.AddArg2(x, v0)
11014 return true
11015 }
11016 return false
11017 }
11018 func rewriteValuegeneric_OpLess16U(v *Value) bool {
11019 v_1 := v.Args[1]
11020 v_0 := v.Args[0]
11021 b := v.Block
11022
11023
11024 for {
11025 if v_0.Op != OpConst16 {
11026 break
11027 }
11028 c := auxIntToInt16(v_0.AuxInt)
11029 if v_1.Op != OpConst16 {
11030 break
11031 }
11032 d := auxIntToInt16(v_1.AuxInt)
11033 v.reset(OpConstBool)
11034 v.AuxInt = boolToAuxInt(uint16(c) < uint16(d))
11035 return true
11036 }
11037
11038
11039 for {
11040 x := v_0
11041 if v_1.Op != OpConst16 {
11042 break
11043 }
11044 t := v_1.Type
11045 if auxIntToInt16(v_1.AuxInt) != 1 {
11046 break
11047 }
11048 v.reset(OpEq16)
11049 v0 := b.NewValue0(v.Pos, OpConst16, t)
11050 v0.AuxInt = int16ToAuxInt(0)
11051 v.AddArg2(v0, x)
11052 return true
11053 }
11054
11055
11056 for {
11057 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
11058 break
11059 }
11060 v.reset(OpConstBool)
11061 v.AuxInt = boolToAuxInt(false)
11062 return true
11063 }
11064
11065
11066 for {
11067 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
11068 break
11069 }
11070 v.reset(OpConstBool)
11071 v.AuxInt = boolToAuxInt(false)
11072 return true
11073 }
11074
11075
11076 for {
11077 x := v_0
11078 if v_1.Op != OpConst16 {
11079 break
11080 }
11081 t := v_1.Type
11082 if auxIntToInt16(v_1.AuxInt) != 1 {
11083 break
11084 }
11085 v.reset(OpEq16)
11086 v0 := b.NewValue0(v.Pos, OpConst16, t)
11087 v0.AuxInt = int16ToAuxInt(0)
11088 v.AddArg2(x, v0)
11089 return true
11090 }
11091
11092
11093 for {
11094 if v_0.Op != OpConst16 {
11095 break
11096 }
11097 t := v_0.Type
11098 if auxIntToInt16(v_0.AuxInt) != -2 {
11099 break
11100 }
11101 x := v_1
11102 v.reset(OpEq16)
11103 v0 := b.NewValue0(v.Pos, OpConst16, t)
11104 v0.AuxInt = int16ToAuxInt(-1)
11105 v.AddArg2(x, v0)
11106 return true
11107 }
11108 return false
11109 }
11110 func rewriteValuegeneric_OpLess32(v *Value) bool {
11111 v_1 := v.Args[1]
11112 v_0 := v.Args[0]
11113 b := v.Block
11114
11115
11116 for {
11117 if v_0.Op != OpConst32 {
11118 break
11119 }
11120 c := auxIntToInt32(v_0.AuxInt)
11121 if v_1.Op != OpConst32 {
11122 break
11123 }
11124 d := auxIntToInt32(v_1.AuxInt)
11125 v.reset(OpConstBool)
11126 v.AuxInt = boolToAuxInt(c < d)
11127 return true
11128 }
11129
11130
11131
11132 for {
11133 if v_0.Op != OpConst32 {
11134 break
11135 }
11136 t := v_0.Type
11137 if auxIntToInt32(v_0.AuxInt) != 0 {
11138 break
11139 }
11140 x := v_1
11141 if !(isNonNegative(x)) {
11142 break
11143 }
11144 v.reset(OpNeq32)
11145 v0 := b.NewValue0(v.Pos, OpConst32, t)
11146 v0.AuxInt = int32ToAuxInt(0)
11147 v.AddArg2(v0, x)
11148 return true
11149 }
11150
11151
11152
11153 for {
11154 x := v_0
11155 if v_1.Op != OpConst32 {
11156 break
11157 }
11158 t := v_1.Type
11159 if auxIntToInt32(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
11160 break
11161 }
11162 v.reset(OpEq32)
11163 v0 := b.NewValue0(v.Pos, OpConst32, t)
11164 v0.AuxInt = int32ToAuxInt(0)
11165 v.AddArg2(v0, x)
11166 return true
11167 }
11168
11169
11170 for {
11171 x := v_0
11172 if v_1.Op != OpConst32 {
11173 break
11174 }
11175 t := v_1.Type
11176 if auxIntToInt32(v_1.AuxInt) != 1 {
11177 break
11178 }
11179 v.reset(OpLeq32)
11180 v0 := b.NewValue0(v.Pos, OpConst32, t)
11181 v0.AuxInt = int32ToAuxInt(0)
11182 v.AddArg2(x, v0)
11183 return true
11184 }
11185
11186
11187 for {
11188 if v_0.Op != OpConst32 {
11189 break
11190 }
11191 t := v_0.Type
11192 if auxIntToInt32(v_0.AuxInt) != -1 {
11193 break
11194 }
11195 x := v_1
11196 v.reset(OpLeq32)
11197 v0 := b.NewValue0(v.Pos, OpConst32, t)
11198 v0.AuxInt = int32ToAuxInt(0)
11199 v.AddArg2(v0, x)
11200 return true
11201 }
11202
11203
11204 for {
11205 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != math.MinInt32 {
11206 break
11207 }
11208 v.reset(OpConstBool)
11209 v.AuxInt = boolToAuxInt(false)
11210 return true
11211 }
11212
11213
11214 for {
11215 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != math.MaxInt32 {
11216 break
11217 }
11218 v.reset(OpConstBool)
11219 v.AuxInt = boolToAuxInt(false)
11220 return true
11221 }
11222
11223
11224 for {
11225 x := v_0
11226 if v_1.Op != OpConst32 {
11227 break
11228 }
11229 t := v_1.Type
11230 if auxIntToInt32(v_1.AuxInt) != math.MinInt32+1 {
11231 break
11232 }
11233 v.reset(OpEq32)
11234 v0 := b.NewValue0(v.Pos, OpConst32, t)
11235 v0.AuxInt = int32ToAuxInt(math.MinInt32)
11236 v.AddArg2(x, v0)
11237 return true
11238 }
11239
11240
11241 for {
11242 if v_0.Op != OpConst32 {
11243 break
11244 }
11245 t := v_0.Type
11246 if auxIntToInt32(v_0.AuxInt) != math.MaxInt32-1 {
11247 break
11248 }
11249 x := v_1
11250 v.reset(OpEq32)
11251 v0 := b.NewValue0(v.Pos, OpConst32, t)
11252 v0.AuxInt = int32ToAuxInt(math.MaxInt32)
11253 v.AddArg2(x, v0)
11254 return true
11255 }
11256 return false
11257 }
11258 func rewriteValuegeneric_OpLess32F(v *Value) bool {
11259 v_1 := v.Args[1]
11260 v_0 := v.Args[0]
11261
11262
11263 for {
11264 if v_0.Op != OpConst32F {
11265 break
11266 }
11267 c := auxIntToFloat32(v_0.AuxInt)
11268 if v_1.Op != OpConst32F {
11269 break
11270 }
11271 d := auxIntToFloat32(v_1.AuxInt)
11272 v.reset(OpConstBool)
11273 v.AuxInt = boolToAuxInt(c < d)
11274 return true
11275 }
11276 return false
11277 }
11278 func rewriteValuegeneric_OpLess32U(v *Value) bool {
11279 v_1 := v.Args[1]
11280 v_0 := v.Args[0]
11281 b := v.Block
11282
11283
11284 for {
11285 if v_0.Op != OpConst32 {
11286 break
11287 }
11288 c := auxIntToInt32(v_0.AuxInt)
11289 if v_1.Op != OpConst32 {
11290 break
11291 }
11292 d := auxIntToInt32(v_1.AuxInt)
11293 v.reset(OpConstBool)
11294 v.AuxInt = boolToAuxInt(uint32(c) < uint32(d))
11295 return true
11296 }
11297
11298
11299 for {
11300 x := v_0
11301 if v_1.Op != OpConst32 {
11302 break
11303 }
11304 t := v_1.Type
11305 if auxIntToInt32(v_1.AuxInt) != 1 {
11306 break
11307 }
11308 v.reset(OpEq32)
11309 v0 := b.NewValue0(v.Pos, OpConst32, t)
11310 v0.AuxInt = int32ToAuxInt(0)
11311 v.AddArg2(v0, x)
11312 return true
11313 }
11314
11315
11316 for {
11317 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
11318 break
11319 }
11320 v.reset(OpConstBool)
11321 v.AuxInt = boolToAuxInt(false)
11322 return true
11323 }
11324
11325
11326 for {
11327 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
11328 break
11329 }
11330 v.reset(OpConstBool)
11331 v.AuxInt = boolToAuxInt(false)
11332 return true
11333 }
11334
11335
11336 for {
11337 x := v_0
11338 if v_1.Op != OpConst32 {
11339 break
11340 }
11341 t := v_1.Type
11342 if auxIntToInt32(v_1.AuxInt) != 1 {
11343 break
11344 }
11345 v.reset(OpEq32)
11346 v0 := b.NewValue0(v.Pos, OpConst32, t)
11347 v0.AuxInt = int32ToAuxInt(0)
11348 v.AddArg2(x, v0)
11349 return true
11350 }
11351
11352
11353 for {
11354 if v_0.Op != OpConst32 {
11355 break
11356 }
11357 t := v_0.Type
11358 if auxIntToInt32(v_0.AuxInt) != -2 {
11359 break
11360 }
11361 x := v_1
11362 v.reset(OpEq32)
11363 v0 := b.NewValue0(v.Pos, OpConst32, t)
11364 v0.AuxInt = int32ToAuxInt(-1)
11365 v.AddArg2(x, v0)
11366 return true
11367 }
11368 return false
11369 }
11370 func rewriteValuegeneric_OpLess64(v *Value) bool {
11371 v_1 := v.Args[1]
11372 v_0 := v.Args[0]
11373 b := v.Block
11374
11375
11376 for {
11377 if v_0.Op != OpConst64 {
11378 break
11379 }
11380 c := auxIntToInt64(v_0.AuxInt)
11381 if v_1.Op != OpConst64 {
11382 break
11383 }
11384 d := auxIntToInt64(v_1.AuxInt)
11385 v.reset(OpConstBool)
11386 v.AuxInt = boolToAuxInt(c < d)
11387 return true
11388 }
11389
11390
11391
11392 for {
11393 if v_0.Op != OpConst64 {
11394 break
11395 }
11396 t := v_0.Type
11397 if auxIntToInt64(v_0.AuxInt) != 0 {
11398 break
11399 }
11400 x := v_1
11401 if !(isNonNegative(x)) {
11402 break
11403 }
11404 v.reset(OpNeq64)
11405 v0 := b.NewValue0(v.Pos, OpConst64, t)
11406 v0.AuxInt = int64ToAuxInt(0)
11407 v.AddArg2(v0, x)
11408 return true
11409 }
11410
11411
11412
11413 for {
11414 x := v_0
11415 if v_1.Op != OpConst64 {
11416 break
11417 }
11418 t := v_1.Type
11419 if auxIntToInt64(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
11420 break
11421 }
11422 v.reset(OpEq64)
11423 v0 := b.NewValue0(v.Pos, OpConst64, t)
11424 v0.AuxInt = int64ToAuxInt(0)
11425 v.AddArg2(v0, x)
11426 return true
11427 }
11428
11429
11430 for {
11431 x := v_0
11432 if v_1.Op != OpConst64 {
11433 break
11434 }
11435 t := v_1.Type
11436 if auxIntToInt64(v_1.AuxInt) != 1 {
11437 break
11438 }
11439 v.reset(OpLeq64)
11440 v0 := b.NewValue0(v.Pos, OpConst64, t)
11441 v0.AuxInt = int64ToAuxInt(0)
11442 v.AddArg2(x, v0)
11443 return true
11444 }
11445
11446
11447 for {
11448 if v_0.Op != OpConst64 {
11449 break
11450 }
11451 t := v_0.Type
11452 if auxIntToInt64(v_0.AuxInt) != -1 {
11453 break
11454 }
11455 x := v_1
11456 v.reset(OpLeq64)
11457 v0 := b.NewValue0(v.Pos, OpConst64, t)
11458 v0.AuxInt = int64ToAuxInt(0)
11459 v.AddArg2(v0, x)
11460 return true
11461 }
11462
11463
11464 for {
11465 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != math.MinInt64 {
11466 break
11467 }
11468 v.reset(OpConstBool)
11469 v.AuxInt = boolToAuxInt(false)
11470 return true
11471 }
11472
11473
11474 for {
11475 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != math.MaxInt64 {
11476 break
11477 }
11478 v.reset(OpConstBool)
11479 v.AuxInt = boolToAuxInt(false)
11480 return true
11481 }
11482
11483
11484 for {
11485 x := v_0
11486 if v_1.Op != OpConst64 {
11487 break
11488 }
11489 t := v_1.Type
11490 if auxIntToInt64(v_1.AuxInt) != math.MinInt64+1 {
11491 break
11492 }
11493 v.reset(OpEq64)
11494 v0 := b.NewValue0(v.Pos, OpConst64, t)
11495 v0.AuxInt = int64ToAuxInt(math.MinInt64)
11496 v.AddArg2(x, v0)
11497 return true
11498 }
11499
11500
11501 for {
11502 if v_0.Op != OpConst64 {
11503 break
11504 }
11505 t := v_0.Type
11506 if auxIntToInt64(v_0.AuxInt) != math.MaxInt64-1 {
11507 break
11508 }
11509 x := v_1
11510 v.reset(OpEq64)
11511 v0 := b.NewValue0(v.Pos, OpConst64, t)
11512 v0.AuxInt = int64ToAuxInt(math.MaxInt64)
11513 v.AddArg2(x, v0)
11514 return true
11515 }
11516 return false
11517 }
11518 func rewriteValuegeneric_OpLess64F(v *Value) bool {
11519 v_1 := v.Args[1]
11520 v_0 := v.Args[0]
11521
11522
11523 for {
11524 if v_0.Op != OpConst64F {
11525 break
11526 }
11527 c := auxIntToFloat64(v_0.AuxInt)
11528 if v_1.Op != OpConst64F {
11529 break
11530 }
11531 d := auxIntToFloat64(v_1.AuxInt)
11532 v.reset(OpConstBool)
11533 v.AuxInt = boolToAuxInt(c < d)
11534 return true
11535 }
11536 return false
11537 }
11538 func rewriteValuegeneric_OpLess64U(v *Value) bool {
11539 v_1 := v.Args[1]
11540 v_0 := v.Args[0]
11541 b := v.Block
11542
11543
11544 for {
11545 if v_0.Op != OpConst64 {
11546 break
11547 }
11548 c := auxIntToInt64(v_0.AuxInt)
11549 if v_1.Op != OpConst64 {
11550 break
11551 }
11552 d := auxIntToInt64(v_1.AuxInt)
11553 v.reset(OpConstBool)
11554 v.AuxInt = boolToAuxInt(uint64(c) < uint64(d))
11555 return true
11556 }
11557
11558
11559 for {
11560 x := v_0
11561 if v_1.Op != OpConst64 {
11562 break
11563 }
11564 t := v_1.Type
11565 if auxIntToInt64(v_1.AuxInt) != 1 {
11566 break
11567 }
11568 v.reset(OpEq64)
11569 v0 := b.NewValue0(v.Pos, OpConst64, t)
11570 v0.AuxInt = int64ToAuxInt(0)
11571 v.AddArg2(v0, x)
11572 return true
11573 }
11574
11575
11576 for {
11577 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
11578 break
11579 }
11580 v.reset(OpConstBool)
11581 v.AuxInt = boolToAuxInt(false)
11582 return true
11583 }
11584
11585
11586 for {
11587 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
11588 break
11589 }
11590 v.reset(OpConstBool)
11591 v.AuxInt = boolToAuxInt(false)
11592 return true
11593 }
11594
11595
11596 for {
11597 x := v_0
11598 if v_1.Op != OpConst64 {
11599 break
11600 }
11601 t := v_1.Type
11602 if auxIntToInt64(v_1.AuxInt) != 1 {
11603 break
11604 }
11605 v.reset(OpEq64)
11606 v0 := b.NewValue0(v.Pos, OpConst64, t)
11607 v0.AuxInt = int64ToAuxInt(0)
11608 v.AddArg2(x, v0)
11609 return true
11610 }
11611
11612
11613 for {
11614 if v_0.Op != OpConst64 {
11615 break
11616 }
11617 t := v_0.Type
11618 if auxIntToInt64(v_0.AuxInt) != -2 {
11619 break
11620 }
11621 x := v_1
11622 v.reset(OpEq64)
11623 v0 := b.NewValue0(v.Pos, OpConst64, t)
11624 v0.AuxInt = int64ToAuxInt(-1)
11625 v.AddArg2(x, v0)
11626 return true
11627 }
11628 return false
11629 }
11630 func rewriteValuegeneric_OpLess8(v *Value) bool {
11631 v_1 := v.Args[1]
11632 v_0 := v.Args[0]
11633 b := v.Block
11634
11635
11636 for {
11637 if v_0.Op != OpConst8 {
11638 break
11639 }
11640 c := auxIntToInt8(v_0.AuxInt)
11641 if v_1.Op != OpConst8 {
11642 break
11643 }
11644 d := auxIntToInt8(v_1.AuxInt)
11645 v.reset(OpConstBool)
11646 v.AuxInt = boolToAuxInt(c < d)
11647 return true
11648 }
11649
11650
11651
11652 for {
11653 if v_0.Op != OpConst8 {
11654 break
11655 }
11656 t := v_0.Type
11657 if auxIntToInt8(v_0.AuxInt) != 0 {
11658 break
11659 }
11660 x := v_1
11661 if !(isNonNegative(x)) {
11662 break
11663 }
11664 v.reset(OpNeq8)
11665 v0 := b.NewValue0(v.Pos, OpConst8, t)
11666 v0.AuxInt = int8ToAuxInt(0)
11667 v.AddArg2(v0, x)
11668 return true
11669 }
11670
11671
11672
11673 for {
11674 x := v_0
11675 if v_1.Op != OpConst8 {
11676 break
11677 }
11678 t := v_1.Type
11679 if auxIntToInt8(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
11680 break
11681 }
11682 v.reset(OpEq8)
11683 v0 := b.NewValue0(v.Pos, OpConst8, t)
11684 v0.AuxInt = int8ToAuxInt(0)
11685 v.AddArg2(v0, x)
11686 return true
11687 }
11688
11689
11690 for {
11691 x := v_0
11692 if v_1.Op != OpConst8 {
11693 break
11694 }
11695 t := v_1.Type
11696 if auxIntToInt8(v_1.AuxInt) != 1 {
11697 break
11698 }
11699 v.reset(OpLeq8)
11700 v0 := b.NewValue0(v.Pos, OpConst8, t)
11701 v0.AuxInt = int8ToAuxInt(0)
11702 v.AddArg2(x, v0)
11703 return true
11704 }
11705
11706
11707 for {
11708 if v_0.Op != OpConst8 {
11709 break
11710 }
11711 t := v_0.Type
11712 if auxIntToInt8(v_0.AuxInt) != -1 {
11713 break
11714 }
11715 x := v_1
11716 v.reset(OpLeq8)
11717 v0 := b.NewValue0(v.Pos, OpConst8, t)
11718 v0.AuxInt = int8ToAuxInt(0)
11719 v.AddArg2(v0, x)
11720 return true
11721 }
11722
11723
11724 for {
11725 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != math.MinInt8 {
11726 break
11727 }
11728 v.reset(OpConstBool)
11729 v.AuxInt = boolToAuxInt(false)
11730 return true
11731 }
11732
11733
11734 for {
11735 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != math.MaxInt8 {
11736 break
11737 }
11738 v.reset(OpConstBool)
11739 v.AuxInt = boolToAuxInt(false)
11740 return true
11741 }
11742
11743
11744 for {
11745 x := v_0
11746 if v_1.Op != OpConst8 {
11747 break
11748 }
11749 t := v_1.Type
11750 if auxIntToInt8(v_1.AuxInt) != math.MinInt8+1 {
11751 break
11752 }
11753 v.reset(OpEq8)
11754 v0 := b.NewValue0(v.Pos, OpConst8, t)
11755 v0.AuxInt = int8ToAuxInt(math.MinInt8)
11756 v.AddArg2(x, v0)
11757 return true
11758 }
11759
11760
11761 for {
11762 if v_0.Op != OpConst8 {
11763 break
11764 }
11765 t := v_0.Type
11766 if auxIntToInt8(v_0.AuxInt) != math.MaxInt8-1 {
11767 break
11768 }
11769 x := v_1
11770 v.reset(OpEq8)
11771 v0 := b.NewValue0(v.Pos, OpConst8, t)
11772 v0.AuxInt = int8ToAuxInt(math.MaxInt8)
11773 v.AddArg2(x, v0)
11774 return true
11775 }
11776 return false
11777 }
11778 func rewriteValuegeneric_OpLess8U(v *Value) bool {
11779 v_1 := v.Args[1]
11780 v_0 := v.Args[0]
11781 b := v.Block
11782
11783
11784 for {
11785 if v_0.Op != OpConst8 {
11786 break
11787 }
11788 c := auxIntToInt8(v_0.AuxInt)
11789 if v_1.Op != OpConst8 {
11790 break
11791 }
11792 d := auxIntToInt8(v_1.AuxInt)
11793 v.reset(OpConstBool)
11794 v.AuxInt = boolToAuxInt(uint8(c) < uint8(d))
11795 return true
11796 }
11797
11798
11799 for {
11800 x := v_0
11801 if v_1.Op != OpConst8 {
11802 break
11803 }
11804 t := v_1.Type
11805 if auxIntToInt8(v_1.AuxInt) != 1 {
11806 break
11807 }
11808 v.reset(OpEq8)
11809 v0 := b.NewValue0(v.Pos, OpConst8, t)
11810 v0.AuxInt = int8ToAuxInt(0)
11811 v.AddArg2(v0, x)
11812 return true
11813 }
11814
11815
11816 for {
11817 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
11818 break
11819 }
11820 v.reset(OpConstBool)
11821 v.AuxInt = boolToAuxInt(false)
11822 return true
11823 }
11824
11825
11826 for {
11827 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
11828 break
11829 }
11830 v.reset(OpConstBool)
11831 v.AuxInt = boolToAuxInt(false)
11832 return true
11833 }
11834
11835
11836 for {
11837 x := v_0
11838 if v_1.Op != OpConst8 {
11839 break
11840 }
11841 t := v_1.Type
11842 if auxIntToInt8(v_1.AuxInt) != 1 {
11843 break
11844 }
11845 v.reset(OpEq8)
11846 v0 := b.NewValue0(v.Pos, OpConst8, t)
11847 v0.AuxInt = int8ToAuxInt(0)
11848 v.AddArg2(x, v0)
11849 return true
11850 }
11851
11852
11853 for {
11854 if v_0.Op != OpConst8 {
11855 break
11856 }
11857 t := v_0.Type
11858 if auxIntToInt8(v_0.AuxInt) != -2 {
11859 break
11860 }
11861 x := v_1
11862 v.reset(OpEq8)
11863 v0 := b.NewValue0(v.Pos, OpConst8, t)
11864 v0.AuxInt = int8ToAuxInt(-1)
11865 v.AddArg2(x, v0)
11866 return true
11867 }
11868 return false
11869 }
11870 func rewriteValuegeneric_OpLoad(v *Value) bool {
11871 v_1 := v.Args[1]
11872 v_0 := v.Args[0]
11873 b := v.Block
11874 config := b.Func.Config
11875 typ := &b.Func.Config.Types
11876
11877
11878
11879 for {
11880 t1 := v.Type
11881 p1 := v_0
11882 if v_1.Op != OpStore {
11883 break
11884 }
11885 t2 := auxToType(v_1.Aux)
11886 x := v_1.Args[1]
11887 p2 := v_1.Args[0]
11888 if !(isSamePtr(p1, p2) && copyCompatibleType(t1, x.Type) && t1.Size() == t2.Size()) {
11889 break
11890 }
11891 v.copyOf(x)
11892 return true
11893 }
11894
11895
11896
11897 for {
11898 t1 := v.Type
11899 p1 := v_0
11900 if v_1.Op != OpStore {
11901 break
11902 }
11903 t2 := auxToType(v_1.Aux)
11904 _ = v_1.Args[2]
11905 p2 := v_1.Args[0]
11906 v_1_2 := v_1.Args[2]
11907 if v_1_2.Op != OpStore {
11908 break
11909 }
11910 t3 := auxToType(v_1_2.Aux)
11911 x := v_1_2.Args[1]
11912 p3 := v_1_2.Args[0]
11913 if !(isSamePtr(p1, p3) && copyCompatibleType(t1, x.Type) && t1.Size() == t3.Size() && disjoint(p3, t3.Size(), p2, t2.Size())) {
11914 break
11915 }
11916 v.copyOf(x)
11917 return true
11918 }
11919
11920
11921
11922 for {
11923 t1 := v.Type
11924 p1 := v_0
11925 if v_1.Op != OpStore {
11926 break
11927 }
11928 t2 := auxToType(v_1.Aux)
11929 _ = v_1.Args[2]
11930 p2 := v_1.Args[0]
11931 v_1_2 := v_1.Args[2]
11932 if v_1_2.Op != OpStore {
11933 break
11934 }
11935 t3 := auxToType(v_1_2.Aux)
11936 _ = v_1_2.Args[2]
11937 p3 := v_1_2.Args[0]
11938 v_1_2_2 := v_1_2.Args[2]
11939 if v_1_2_2.Op != OpStore {
11940 break
11941 }
11942 t4 := auxToType(v_1_2_2.Aux)
11943 x := v_1_2_2.Args[1]
11944 p4 := v_1_2_2.Args[0]
11945 if !(isSamePtr(p1, p4) && copyCompatibleType(t1, x.Type) && t1.Size() == t4.Size() && disjoint(p4, t4.Size(), p2, t2.Size()) && disjoint(p4, t4.Size(), p3, t3.Size())) {
11946 break
11947 }
11948 v.copyOf(x)
11949 return true
11950 }
11951
11952
11953
11954 for {
11955 t1 := v.Type
11956 p1 := v_0
11957 if v_1.Op != OpStore {
11958 break
11959 }
11960 t2 := auxToType(v_1.Aux)
11961 _ = v_1.Args[2]
11962 p2 := v_1.Args[0]
11963 v_1_2 := v_1.Args[2]
11964 if v_1_2.Op != OpStore {
11965 break
11966 }
11967 t3 := auxToType(v_1_2.Aux)
11968 _ = v_1_2.Args[2]
11969 p3 := v_1_2.Args[0]
11970 v_1_2_2 := v_1_2.Args[2]
11971 if v_1_2_2.Op != OpStore {
11972 break
11973 }
11974 t4 := auxToType(v_1_2_2.Aux)
11975 _ = v_1_2_2.Args[2]
11976 p4 := v_1_2_2.Args[0]
11977 v_1_2_2_2 := v_1_2_2.Args[2]
11978 if v_1_2_2_2.Op != OpStore {
11979 break
11980 }
11981 t5 := auxToType(v_1_2_2_2.Aux)
11982 x := v_1_2_2_2.Args[1]
11983 p5 := v_1_2_2_2.Args[0]
11984 if !(isSamePtr(p1, p5) && copyCompatibleType(t1, x.Type) && t1.Size() == t5.Size() && disjoint(p5, t5.Size(), p2, t2.Size()) && disjoint(p5, t5.Size(), p3, t3.Size()) && disjoint(p5, t5.Size(), p4, t4.Size())) {
11985 break
11986 }
11987 v.copyOf(x)
11988 return true
11989 }
11990
11991
11992
11993 for {
11994 t1 := v.Type
11995 p1 := v_0
11996 if v_1.Op != OpStore {
11997 break
11998 }
11999 t2 := auxToType(v_1.Aux)
12000 _ = v_1.Args[1]
12001 p2 := v_1.Args[0]
12002 v_1_1 := v_1.Args[1]
12003 if v_1_1.Op != OpConst64 {
12004 break
12005 }
12006 x := auxIntToInt64(v_1_1.AuxInt)
12007 if !(isSamePtr(p1, p2) && t2.Size() == 8 && is64BitFloat(t1) && !math.IsNaN(math.Float64frombits(uint64(x)))) {
12008 break
12009 }
12010 v.reset(OpConst64F)
12011 v.AuxInt = float64ToAuxInt(math.Float64frombits(uint64(x)))
12012 return true
12013 }
12014
12015
12016
12017 for {
12018 t1 := v.Type
12019 p1 := v_0
12020 if v_1.Op != OpStore {
12021 break
12022 }
12023 t2 := auxToType(v_1.Aux)
12024 _ = v_1.Args[1]
12025 p2 := v_1.Args[0]
12026 v_1_1 := v_1.Args[1]
12027 if v_1_1.Op != OpConst32 {
12028 break
12029 }
12030 x := auxIntToInt32(v_1_1.AuxInt)
12031 if !(isSamePtr(p1, p2) && t2.Size() == 4 && is32BitFloat(t1) && !math.IsNaN(float64(math.Float32frombits(uint32(x))))) {
12032 break
12033 }
12034 v.reset(OpConst32F)
12035 v.AuxInt = float32ToAuxInt(math.Float32frombits(uint32(x)))
12036 return true
12037 }
12038
12039
12040
12041 for {
12042 t1 := v.Type
12043 p1 := v_0
12044 if v_1.Op != OpStore {
12045 break
12046 }
12047 t2 := auxToType(v_1.Aux)
12048 _ = v_1.Args[1]
12049 p2 := v_1.Args[0]
12050 v_1_1 := v_1.Args[1]
12051 if v_1_1.Op != OpConst64F {
12052 break
12053 }
12054 x := auxIntToFloat64(v_1_1.AuxInt)
12055 if !(isSamePtr(p1, p2) && t2.Size() == 8 && is64BitInt(t1)) {
12056 break
12057 }
12058 v.reset(OpConst64)
12059 v.AuxInt = int64ToAuxInt(int64(math.Float64bits(x)))
12060 return true
12061 }
12062
12063
12064
12065 for {
12066 t1 := v.Type
12067 p1 := v_0
12068 if v_1.Op != OpStore {
12069 break
12070 }
12071 t2 := auxToType(v_1.Aux)
12072 _ = v_1.Args[1]
12073 p2 := v_1.Args[0]
12074 v_1_1 := v_1.Args[1]
12075 if v_1_1.Op != OpConst32F {
12076 break
12077 }
12078 x := auxIntToFloat32(v_1_1.AuxInt)
12079 if !(isSamePtr(p1, p2) && t2.Size() == 4 && is32BitInt(t1)) {
12080 break
12081 }
12082 v.reset(OpConst32)
12083 v.AuxInt = int32ToAuxInt(int32(math.Float32bits(x)))
12084 return true
12085 }
12086
12087
12088
12089 for {
12090 t1 := v.Type
12091 op := v_0
12092 if op.Op != OpOffPtr {
12093 break
12094 }
12095 o1 := auxIntToInt64(op.AuxInt)
12096 p1 := op.Args[0]
12097 if v_1.Op != OpStore {
12098 break
12099 }
12100 t2 := auxToType(v_1.Aux)
12101 _ = v_1.Args[2]
12102 p2 := v_1.Args[0]
12103 mem := v_1.Args[2]
12104 if mem.Op != OpZero {
12105 break
12106 }
12107 n := auxIntToInt64(mem.AuxInt)
12108 p3 := mem.Args[0]
12109 if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p3) && CanSSA(t1) && disjoint(op, t1.Size(), p2, t2.Size())) {
12110 break
12111 }
12112 b = mem.Block
12113 v0 := b.NewValue0(v.Pos, OpLoad, t1)
12114 v.copyOf(v0)
12115 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
12116 v1.AuxInt = int64ToAuxInt(o1)
12117 v1.AddArg(p3)
12118 v0.AddArg2(v1, mem)
12119 return true
12120 }
12121
12122
12123
12124 for {
12125 t1 := v.Type
12126 op := v_0
12127 if op.Op != OpOffPtr {
12128 break
12129 }
12130 o1 := auxIntToInt64(op.AuxInt)
12131 p1 := op.Args[0]
12132 if v_1.Op != OpStore {
12133 break
12134 }
12135 t2 := auxToType(v_1.Aux)
12136 _ = v_1.Args[2]
12137 p2 := v_1.Args[0]
12138 v_1_2 := v_1.Args[2]
12139 if v_1_2.Op != OpStore {
12140 break
12141 }
12142 t3 := auxToType(v_1_2.Aux)
12143 _ = v_1_2.Args[2]
12144 p3 := v_1_2.Args[0]
12145 mem := v_1_2.Args[2]
12146 if mem.Op != OpZero {
12147 break
12148 }
12149 n := auxIntToInt64(mem.AuxInt)
12150 p4 := mem.Args[0]
12151 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())) {
12152 break
12153 }
12154 b = mem.Block
12155 v0 := b.NewValue0(v.Pos, OpLoad, t1)
12156 v.copyOf(v0)
12157 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
12158 v1.AuxInt = int64ToAuxInt(o1)
12159 v1.AddArg(p4)
12160 v0.AddArg2(v1, mem)
12161 return true
12162 }
12163
12164
12165
12166 for {
12167 t1 := v.Type
12168 op := v_0
12169 if op.Op != OpOffPtr {
12170 break
12171 }
12172 o1 := auxIntToInt64(op.AuxInt)
12173 p1 := op.Args[0]
12174 if v_1.Op != OpStore {
12175 break
12176 }
12177 t2 := auxToType(v_1.Aux)
12178 _ = v_1.Args[2]
12179 p2 := v_1.Args[0]
12180 v_1_2 := v_1.Args[2]
12181 if v_1_2.Op != OpStore {
12182 break
12183 }
12184 t3 := auxToType(v_1_2.Aux)
12185 _ = v_1_2.Args[2]
12186 p3 := v_1_2.Args[0]
12187 v_1_2_2 := v_1_2.Args[2]
12188 if v_1_2_2.Op != OpStore {
12189 break
12190 }
12191 t4 := auxToType(v_1_2_2.Aux)
12192 _ = v_1_2_2.Args[2]
12193 p4 := v_1_2_2.Args[0]
12194 mem := v_1_2_2.Args[2]
12195 if mem.Op != OpZero {
12196 break
12197 }
12198 n := auxIntToInt64(mem.AuxInt)
12199 p5 := mem.Args[0]
12200 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())) {
12201 break
12202 }
12203 b = mem.Block
12204 v0 := b.NewValue0(v.Pos, OpLoad, t1)
12205 v.copyOf(v0)
12206 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
12207 v1.AuxInt = int64ToAuxInt(o1)
12208 v1.AddArg(p5)
12209 v0.AddArg2(v1, mem)
12210 return true
12211 }
12212
12213
12214
12215 for {
12216 t1 := v.Type
12217 op := v_0
12218 if op.Op != OpOffPtr {
12219 break
12220 }
12221 o1 := auxIntToInt64(op.AuxInt)
12222 p1 := op.Args[0]
12223 if v_1.Op != OpStore {
12224 break
12225 }
12226 t2 := auxToType(v_1.Aux)
12227 _ = v_1.Args[2]
12228 p2 := v_1.Args[0]
12229 v_1_2 := v_1.Args[2]
12230 if v_1_2.Op != OpStore {
12231 break
12232 }
12233 t3 := auxToType(v_1_2.Aux)
12234 _ = v_1_2.Args[2]
12235 p3 := v_1_2.Args[0]
12236 v_1_2_2 := v_1_2.Args[2]
12237 if v_1_2_2.Op != OpStore {
12238 break
12239 }
12240 t4 := auxToType(v_1_2_2.Aux)
12241 _ = v_1_2_2.Args[2]
12242 p4 := v_1_2_2.Args[0]
12243 v_1_2_2_2 := v_1_2_2.Args[2]
12244 if v_1_2_2_2.Op != OpStore {
12245 break
12246 }
12247 t5 := auxToType(v_1_2_2_2.Aux)
12248 _ = v_1_2_2_2.Args[2]
12249 p5 := v_1_2_2_2.Args[0]
12250 mem := v_1_2_2_2.Args[2]
12251 if mem.Op != OpZero {
12252 break
12253 }
12254 n := auxIntToInt64(mem.AuxInt)
12255 p6 := mem.Args[0]
12256 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())) {
12257 break
12258 }
12259 b = mem.Block
12260 v0 := b.NewValue0(v.Pos, OpLoad, t1)
12261 v.copyOf(v0)
12262 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
12263 v1.AuxInt = int64ToAuxInt(o1)
12264 v1.AddArg(p6)
12265 v0.AddArg2(v1, mem)
12266 return true
12267 }
12268
12269
12270
12271 for {
12272 t1 := v.Type
12273 if v_0.Op != OpOffPtr {
12274 break
12275 }
12276 o := auxIntToInt64(v_0.AuxInt)
12277 p1 := v_0.Args[0]
12278 if v_1.Op != OpZero {
12279 break
12280 }
12281 n := auxIntToInt64(v_1.AuxInt)
12282 p2 := v_1.Args[0]
12283 if !(t1.IsBoolean() && isSamePtr(p1, p2) && n >= o+1) {
12284 break
12285 }
12286 v.reset(OpConstBool)
12287 v.AuxInt = boolToAuxInt(false)
12288 return true
12289 }
12290
12291
12292
12293 for {
12294 t1 := v.Type
12295 if v_0.Op != OpOffPtr {
12296 break
12297 }
12298 o := auxIntToInt64(v_0.AuxInt)
12299 p1 := v_0.Args[0]
12300 if v_1.Op != OpZero {
12301 break
12302 }
12303 n := auxIntToInt64(v_1.AuxInt)
12304 p2 := v_1.Args[0]
12305 if !(is8BitInt(t1) && isSamePtr(p1, p2) && n >= o+1) {
12306 break
12307 }
12308 v.reset(OpConst8)
12309 v.AuxInt = int8ToAuxInt(0)
12310 return true
12311 }
12312
12313
12314
12315 for {
12316 t1 := v.Type
12317 if v_0.Op != OpOffPtr {
12318 break
12319 }
12320 o := auxIntToInt64(v_0.AuxInt)
12321 p1 := v_0.Args[0]
12322 if v_1.Op != OpZero {
12323 break
12324 }
12325 n := auxIntToInt64(v_1.AuxInt)
12326 p2 := v_1.Args[0]
12327 if !(is16BitInt(t1) && isSamePtr(p1, p2) && n >= o+2) {
12328 break
12329 }
12330 v.reset(OpConst16)
12331 v.AuxInt = int16ToAuxInt(0)
12332 return true
12333 }
12334
12335
12336
12337 for {
12338 t1 := v.Type
12339 if v_0.Op != OpOffPtr {
12340 break
12341 }
12342 o := auxIntToInt64(v_0.AuxInt)
12343 p1 := v_0.Args[0]
12344 if v_1.Op != OpZero {
12345 break
12346 }
12347 n := auxIntToInt64(v_1.AuxInt)
12348 p2 := v_1.Args[0]
12349 if !(is32BitInt(t1) && isSamePtr(p1, p2) && n >= o+4) {
12350 break
12351 }
12352 v.reset(OpConst32)
12353 v.AuxInt = int32ToAuxInt(0)
12354 return true
12355 }
12356
12357
12358
12359 for {
12360 t1 := v.Type
12361 if v_0.Op != OpOffPtr {
12362 break
12363 }
12364 o := auxIntToInt64(v_0.AuxInt)
12365 p1 := v_0.Args[0]
12366 if v_1.Op != OpZero {
12367 break
12368 }
12369 n := auxIntToInt64(v_1.AuxInt)
12370 p2 := v_1.Args[0]
12371 if !(is64BitInt(t1) && isSamePtr(p1, p2) && n >= o+8) {
12372 break
12373 }
12374 v.reset(OpConst64)
12375 v.AuxInt = int64ToAuxInt(0)
12376 return true
12377 }
12378
12379
12380
12381 for {
12382 t1 := v.Type
12383 if v_0.Op != OpOffPtr {
12384 break
12385 }
12386 o := auxIntToInt64(v_0.AuxInt)
12387 p1 := v_0.Args[0]
12388 if v_1.Op != OpZero {
12389 break
12390 }
12391 n := auxIntToInt64(v_1.AuxInt)
12392 p2 := v_1.Args[0]
12393 if !(is32BitFloat(t1) && isSamePtr(p1, p2) && n >= o+4) {
12394 break
12395 }
12396 v.reset(OpConst32F)
12397 v.AuxInt = float32ToAuxInt(0)
12398 return true
12399 }
12400
12401
12402
12403 for {
12404 t1 := v.Type
12405 if v_0.Op != OpOffPtr {
12406 break
12407 }
12408 o := auxIntToInt64(v_0.AuxInt)
12409 p1 := v_0.Args[0]
12410 if v_1.Op != OpZero {
12411 break
12412 }
12413 n := auxIntToInt64(v_1.AuxInt)
12414 p2 := v_1.Args[0]
12415 if !(is64BitFloat(t1) && isSamePtr(p1, p2) && n >= o+8) {
12416 break
12417 }
12418 v.reset(OpConst64F)
12419 v.AuxInt = float64ToAuxInt(0)
12420 return true
12421 }
12422
12423
12424
12425 for {
12426 t := v.Type
12427 if !(t.IsStruct() && CanSSA(t) && !t.IsSIMD()) {
12428 break
12429 }
12430 v.copyOf(rewriteStructLoad(v))
12431 return true
12432 }
12433
12434
12435
12436 for {
12437 t := v.Type
12438 if !(t.IsArray() && t.NumElem() == 0) {
12439 break
12440 }
12441 v.reset(OpArrayMake0)
12442 return true
12443 }
12444
12445
12446
12447 for {
12448 t := v.Type
12449 ptr := v_0
12450 mem := v_1
12451 if !(t.IsArray() && t.NumElem() == 1 && CanSSA(t)) {
12452 break
12453 }
12454 v.reset(OpArrayMake1)
12455 v0 := b.NewValue0(v.Pos, OpLoad, t.Elem())
12456 v0.AddArg2(ptr, mem)
12457 v.AddArg(v0)
12458 return true
12459 }
12460
12461
12462
12463 for {
12464 if v.Type != typ.Int8 {
12465 break
12466 }
12467 sptr := v_0
12468 if sptr.Op != OpAddr {
12469 break
12470 }
12471 scon := auxToSym(sptr.Aux)
12472 sptr_0 := sptr.Args[0]
12473 if sptr_0.Op != OpSB {
12474 break
12475 }
12476 if !(symIsRO(scon)) {
12477 break
12478 }
12479 v.reset(OpConst8)
12480 v.Type = typ.Int8
12481 v.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
12482 return true
12483 }
12484
12485
12486
12487 for {
12488 if v.Type != typ.Int16 {
12489 break
12490 }
12491 sptr := v_0
12492 if sptr.Op != OpAddr {
12493 break
12494 }
12495 scon := auxToSym(sptr.Aux)
12496 sptr_0 := sptr.Args[0]
12497 if sptr_0.Op != OpSB {
12498 break
12499 }
12500 if !(symIsRO(scon)) {
12501 break
12502 }
12503 v.reset(OpConst16)
12504 v.Type = typ.Int16
12505 v.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
12506 return true
12507 }
12508
12509
12510
12511 for {
12512 if v.Type != typ.Int32 {
12513 break
12514 }
12515 sptr := v_0
12516 if sptr.Op != OpAddr {
12517 break
12518 }
12519 scon := auxToSym(sptr.Aux)
12520 sptr_0 := sptr.Args[0]
12521 if sptr_0.Op != OpSB {
12522 break
12523 }
12524 if !(symIsRO(scon)) {
12525 break
12526 }
12527 v.reset(OpConst32)
12528 v.Type = typ.Int32
12529 v.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
12530 return true
12531 }
12532
12533
12534
12535 for {
12536 if v.Type != typ.Int64 {
12537 break
12538 }
12539 sptr := v_0
12540 if sptr.Op != OpAddr {
12541 break
12542 }
12543 scon := auxToSym(sptr.Aux)
12544 sptr_0 := sptr.Args[0]
12545 if sptr_0.Op != OpSB {
12546 break
12547 }
12548 if !(symIsRO(scon)) {
12549 break
12550 }
12551 v.reset(OpConst64)
12552 v.Type = typ.Int64
12553 v.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
12554 return true
12555 }
12556
12557
12558
12559 for {
12560 if v_0.Op != OpAddr {
12561 break
12562 }
12563 s := auxToSym(v_0.Aux)
12564 sb := v_0.Args[0]
12565 if !(isFixedLoad(v, s, 0)) {
12566 break
12567 }
12568 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
12569 return true
12570 }
12571
12572
12573
12574 for {
12575 if v_0.Op != OpConvert {
12576 break
12577 }
12578 v_0_0 := v_0.Args[0]
12579 if v_0_0.Op != OpAddr {
12580 break
12581 }
12582 s := auxToSym(v_0_0.Aux)
12583 sb := v_0_0.Args[0]
12584 if !(isFixedLoad(v, s, 0)) {
12585 break
12586 }
12587 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
12588 return true
12589 }
12590
12591
12592
12593 for {
12594 if v_0.Op != OpITab {
12595 break
12596 }
12597 v_0_0 := v_0.Args[0]
12598 if v_0_0.Op != OpIMake {
12599 break
12600 }
12601 v_0_0_0 := v_0_0.Args[0]
12602 if v_0_0_0.Op != OpAddr {
12603 break
12604 }
12605 s := auxToSym(v_0_0_0.Aux)
12606 sb := v_0_0_0.Args[0]
12607 if !(isFixedLoad(v, s, 0)) {
12608 break
12609 }
12610 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
12611 return true
12612 }
12613
12614
12615
12616 for {
12617 if v_0.Op != OpITab {
12618 break
12619 }
12620 v_0_0 := v_0.Args[0]
12621 if v_0_0.Op != OpIMake {
12622 break
12623 }
12624 v_0_0_0 := v_0_0.Args[0]
12625 if v_0_0_0.Op != OpConvert {
12626 break
12627 }
12628 v_0_0_0_0 := v_0_0_0.Args[0]
12629 if v_0_0_0_0.Op != OpAddr {
12630 break
12631 }
12632 s := auxToSym(v_0_0_0_0.Aux)
12633 sb := v_0_0_0_0.Args[0]
12634 if !(isFixedLoad(v, s, 0)) {
12635 break
12636 }
12637 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
12638 return true
12639 }
12640
12641
12642
12643 for {
12644 if v_0.Op != OpOffPtr {
12645 break
12646 }
12647 off := auxIntToInt64(v_0.AuxInt)
12648 v_0_0 := v_0.Args[0]
12649 if v_0_0.Op != OpAddr {
12650 break
12651 }
12652 s := auxToSym(v_0_0.Aux)
12653 sb := v_0_0.Args[0]
12654 if !(isFixedLoad(v, s, off)) {
12655 break
12656 }
12657 v.copyOf(rewriteFixedLoad(v, s, sb, off))
12658 return true
12659 }
12660
12661
12662
12663 for {
12664 if v_0.Op != OpOffPtr {
12665 break
12666 }
12667 off := auxIntToInt64(v_0.AuxInt)
12668 v_0_0 := v_0.Args[0]
12669 if v_0_0.Op != OpConvert {
12670 break
12671 }
12672 v_0_0_0 := v_0_0.Args[0]
12673 if v_0_0_0.Op != OpAddr {
12674 break
12675 }
12676 s := auxToSym(v_0_0_0.Aux)
12677 sb := v_0_0_0.Args[0]
12678 if !(isFixedLoad(v, s, off)) {
12679 break
12680 }
12681 v.copyOf(rewriteFixedLoad(v, s, sb, off))
12682 return true
12683 }
12684
12685
12686
12687 for {
12688 if v_0.Op != OpOffPtr {
12689 break
12690 }
12691 off := auxIntToInt64(v_0.AuxInt)
12692 v_0_0 := v_0.Args[0]
12693 if v_0_0.Op != OpITab {
12694 break
12695 }
12696 v_0_0_0 := v_0_0.Args[0]
12697 if v_0_0_0.Op != OpIMake {
12698 break
12699 }
12700 v_0_0_0_0 := v_0_0_0.Args[0]
12701 if v_0_0_0_0.Op != OpAddr {
12702 break
12703 }
12704 s := auxToSym(v_0_0_0_0.Aux)
12705 sb := v_0_0_0_0.Args[0]
12706 if !(isFixedLoad(v, s, off)) {
12707 break
12708 }
12709 v.copyOf(rewriteFixedLoad(v, s, sb, off))
12710 return true
12711 }
12712
12713
12714
12715 for {
12716 if v_0.Op != OpOffPtr {
12717 break
12718 }
12719 off := auxIntToInt64(v_0.AuxInt)
12720 v_0_0 := v_0.Args[0]
12721 if v_0_0.Op != OpITab {
12722 break
12723 }
12724 v_0_0_0 := v_0_0.Args[0]
12725 if v_0_0_0.Op != OpIMake {
12726 break
12727 }
12728 v_0_0_0_0 := v_0_0_0.Args[0]
12729 if v_0_0_0_0.Op != OpConvert {
12730 break
12731 }
12732 v_0_0_0_0_0 := v_0_0_0_0.Args[0]
12733 if v_0_0_0_0_0.Op != OpAddr {
12734 break
12735 }
12736 s := auxToSym(v_0_0_0_0_0.Aux)
12737 sb := v_0_0_0_0_0.Args[0]
12738 if !(isFixedLoad(v, s, off)) {
12739 break
12740 }
12741 v.copyOf(rewriteFixedLoad(v, s, sb, off))
12742 return true
12743 }
12744 return false
12745 }
12746 func rewriteValuegeneric_OpLsh16x16(v *Value) bool {
12747 v_1 := v.Args[1]
12748 v_0 := v.Args[0]
12749 b := v.Block
12750
12751
12752 for {
12753 t := v.Type
12754 x := v_0
12755 if v_1.Op != OpConst16 {
12756 break
12757 }
12758 c := auxIntToInt16(v_1.AuxInt)
12759 v.reset(OpLsh16x64)
12760 v0 := b.NewValue0(v.Pos, OpConst64, t)
12761 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
12762 v.AddArg2(x, v0)
12763 return true
12764 }
12765
12766
12767 for {
12768 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
12769 break
12770 }
12771 v.reset(OpConst16)
12772 v.AuxInt = int16ToAuxInt(0)
12773 return true
12774 }
12775
12776
12777
12778 for {
12779 if auxIntToBool(v.AuxInt) != false {
12780 break
12781 }
12782 x := v_0
12783 con := v_1
12784 if con.Op != OpConst16 {
12785 break
12786 }
12787 c := auxIntToInt16(con.AuxInt)
12788 if !(0 < c && c < 16) {
12789 break
12790 }
12791 v.reset(OpLsh16x16)
12792 v.AuxInt = boolToAuxInt(true)
12793 v.AddArg2(x, con)
12794 return true
12795 }
12796 return false
12797 }
12798 func rewriteValuegeneric_OpLsh16x32(v *Value) bool {
12799 v_1 := v.Args[1]
12800 v_0 := v.Args[0]
12801 b := v.Block
12802
12803
12804 for {
12805 t := v.Type
12806 x := v_0
12807 if v_1.Op != OpConst32 {
12808 break
12809 }
12810 c := auxIntToInt32(v_1.AuxInt)
12811 v.reset(OpLsh16x64)
12812 v0 := b.NewValue0(v.Pos, OpConst64, t)
12813 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
12814 v.AddArg2(x, v0)
12815 return true
12816 }
12817
12818
12819 for {
12820 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
12821 break
12822 }
12823 v.reset(OpConst16)
12824 v.AuxInt = int16ToAuxInt(0)
12825 return true
12826 }
12827
12828
12829
12830 for {
12831 if auxIntToBool(v.AuxInt) != false {
12832 break
12833 }
12834 x := v_0
12835 con := v_1
12836 if con.Op != OpConst32 {
12837 break
12838 }
12839 c := auxIntToInt32(con.AuxInt)
12840 if !(0 < c && c < 16) {
12841 break
12842 }
12843 v.reset(OpLsh16x32)
12844 v.AuxInt = boolToAuxInt(true)
12845 v.AddArg2(x, con)
12846 return true
12847 }
12848 return false
12849 }
12850 func rewriteValuegeneric_OpLsh16x64(v *Value) bool {
12851 v_1 := v.Args[1]
12852 v_0 := v.Args[0]
12853 b := v.Block
12854 typ := &b.Func.Config.Types
12855
12856
12857 for {
12858 if v_0.Op != OpConst16 {
12859 break
12860 }
12861 c := auxIntToInt16(v_0.AuxInt)
12862 if v_1.Op != OpConst64 {
12863 break
12864 }
12865 d := auxIntToInt64(v_1.AuxInt)
12866 v.reset(OpConst16)
12867 v.AuxInt = int16ToAuxInt(c << uint64(d))
12868 return true
12869 }
12870
12871
12872 for {
12873 x := v_0
12874 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
12875 break
12876 }
12877 v.copyOf(x)
12878 return true
12879 }
12880
12881
12882 for {
12883 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
12884 break
12885 }
12886 v.reset(OpConst16)
12887 v.AuxInt = int16ToAuxInt(0)
12888 return true
12889 }
12890
12891
12892
12893 for {
12894 if v_1.Op != OpConst64 {
12895 break
12896 }
12897 c := auxIntToInt64(v_1.AuxInt)
12898 if !(uint64(c) >= 16) {
12899 break
12900 }
12901 v.reset(OpConst16)
12902 v.AuxInt = int16ToAuxInt(0)
12903 return true
12904 }
12905
12906
12907
12908 for {
12909 t := v.Type
12910 if v_0.Op != OpLsh16x64 {
12911 break
12912 }
12913 _ = v_0.Args[1]
12914 x := v_0.Args[0]
12915 v_0_1 := v_0.Args[1]
12916 if v_0_1.Op != OpConst64 {
12917 break
12918 }
12919 c := auxIntToInt64(v_0_1.AuxInt)
12920 if v_1.Op != OpConst64 {
12921 break
12922 }
12923 d := auxIntToInt64(v_1.AuxInt)
12924 if !(!uaddOvf(c, d)) {
12925 break
12926 }
12927 v.reset(OpLsh16x64)
12928 v0 := b.NewValue0(v.Pos, OpConst64, t)
12929 v0.AuxInt = int64ToAuxInt(c + d)
12930 v.AddArg2(x, v0)
12931 return true
12932 }
12933
12934
12935
12936 for {
12937 i := v_0
12938 if i.Op != OpRsh16x64 {
12939 break
12940 }
12941 _ = i.Args[1]
12942 x := i.Args[0]
12943 i_1 := i.Args[1]
12944 if i_1.Op != OpConst64 {
12945 break
12946 }
12947 c := auxIntToInt64(i_1.AuxInt)
12948 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
12949 break
12950 }
12951 v.reset(OpAnd16)
12952 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
12953 v0.AuxInt = int16ToAuxInt(int16(-1) << c)
12954 v.AddArg2(x, v0)
12955 return true
12956 }
12957
12958
12959
12960 for {
12961 i := v_0
12962 if i.Op != OpRsh16Ux64 {
12963 break
12964 }
12965 _ = i.Args[1]
12966 x := i.Args[0]
12967 i_1 := i.Args[1]
12968 if i_1.Op != OpConst64 {
12969 break
12970 }
12971 c := auxIntToInt64(i_1.AuxInt)
12972 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
12973 break
12974 }
12975 v.reset(OpAnd16)
12976 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
12977 v0.AuxInt = int16ToAuxInt(int16(-1) << c)
12978 v.AddArg2(x, v0)
12979 return true
12980 }
12981
12982
12983
12984 for {
12985 if v_0.Op != OpRsh16Ux64 {
12986 break
12987 }
12988 _ = v_0.Args[1]
12989 v_0_0 := v_0.Args[0]
12990 if v_0_0.Op != OpLsh16x64 {
12991 break
12992 }
12993 _ = v_0_0.Args[1]
12994 x := v_0_0.Args[0]
12995 v_0_0_1 := v_0_0.Args[1]
12996 if v_0_0_1.Op != OpConst64 {
12997 break
12998 }
12999 c1 := auxIntToInt64(v_0_0_1.AuxInt)
13000 v_0_1 := v_0.Args[1]
13001 if v_0_1.Op != OpConst64 {
13002 break
13003 }
13004 c2 := auxIntToInt64(v_0_1.AuxInt)
13005 if v_1.Op != OpConst64 {
13006 break
13007 }
13008 c3 := auxIntToInt64(v_1.AuxInt)
13009 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
13010 break
13011 }
13012 v.reset(OpLsh16x64)
13013 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
13014 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
13015 v.AddArg2(x, v0)
13016 return true
13017 }
13018
13019
13020
13021 for {
13022 if v_0.Op != OpAnd16 {
13023 break
13024 }
13025 _ = v_0.Args[1]
13026 v_0_0 := v_0.Args[0]
13027 v_0_1 := v_0.Args[1]
13028 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13029 if v_0_0.Op != OpRsh16x64 {
13030 continue
13031 }
13032 t := v_0_0.Type
13033 _ = v_0_0.Args[1]
13034 x := v_0_0.Args[0]
13035 v_0_0_1 := v_0_0.Args[1]
13036 if v_0_0_1.Op != OpConst64 {
13037 continue
13038 }
13039 t2 := v_0_0_1.Type
13040 c := auxIntToInt64(v_0_0_1.AuxInt)
13041 if v_0_1.Op != OpConst16 {
13042 continue
13043 }
13044 d := auxIntToInt16(v_0_1.AuxInt)
13045 if v_1.Op != OpConst64 {
13046 continue
13047 }
13048 e := auxIntToInt64(v_1.AuxInt)
13049 if !(c >= e) {
13050 continue
13051 }
13052 v.reset(OpAnd16)
13053 v0 := b.NewValue0(v.Pos, OpRsh16x64, t)
13054 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13055 v1.AuxInt = int64ToAuxInt(c - e)
13056 v0.AddArg2(x, v1)
13057 v2 := b.NewValue0(v.Pos, OpConst16, t)
13058 v2.AuxInt = int16ToAuxInt(d << e)
13059 v.AddArg2(v0, v2)
13060 return true
13061 }
13062 break
13063 }
13064
13065
13066
13067 for {
13068 if v_0.Op != OpAnd16 {
13069 break
13070 }
13071 _ = v_0.Args[1]
13072 v_0_0 := v_0.Args[0]
13073 v_0_1 := v_0.Args[1]
13074 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13075 if v_0_0.Op != OpRsh16Ux64 {
13076 continue
13077 }
13078 t := v_0_0.Type
13079 _ = v_0_0.Args[1]
13080 x := v_0_0.Args[0]
13081 v_0_0_1 := v_0_0.Args[1]
13082 if v_0_0_1.Op != OpConst64 {
13083 continue
13084 }
13085 t2 := v_0_0_1.Type
13086 c := auxIntToInt64(v_0_0_1.AuxInt)
13087 if v_0_1.Op != OpConst16 {
13088 continue
13089 }
13090 d := auxIntToInt16(v_0_1.AuxInt)
13091 if v_1.Op != OpConst64 {
13092 continue
13093 }
13094 e := auxIntToInt64(v_1.AuxInt)
13095 if !(c >= e) {
13096 continue
13097 }
13098 v.reset(OpAnd16)
13099 v0 := b.NewValue0(v.Pos, OpRsh16Ux64, t)
13100 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13101 v1.AuxInt = int64ToAuxInt(c - e)
13102 v0.AddArg2(x, v1)
13103 v2 := b.NewValue0(v.Pos, OpConst16, t)
13104 v2.AuxInt = int16ToAuxInt(d << e)
13105 v.AddArg2(v0, v2)
13106 return true
13107 }
13108 break
13109 }
13110
13111
13112
13113 for {
13114 if v_0.Op != OpAnd16 {
13115 break
13116 }
13117 _ = v_0.Args[1]
13118 v_0_0 := v_0.Args[0]
13119 v_0_1 := v_0.Args[1]
13120 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13121 if v_0_0.Op != OpRsh16x64 {
13122 continue
13123 }
13124 t := v_0_0.Type
13125 _ = v_0_0.Args[1]
13126 x := v_0_0.Args[0]
13127 v_0_0_1 := v_0_0.Args[1]
13128 if v_0_0_1.Op != OpConst64 {
13129 continue
13130 }
13131 t2 := v_0_0_1.Type
13132 c := auxIntToInt64(v_0_0_1.AuxInt)
13133 if v_0_1.Op != OpConst16 {
13134 continue
13135 }
13136 d := auxIntToInt16(v_0_1.AuxInt)
13137 if v_1.Op != OpConst64 {
13138 continue
13139 }
13140 e := auxIntToInt64(v_1.AuxInt)
13141 if !(c < e) {
13142 continue
13143 }
13144 v.reset(OpAnd16)
13145 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
13146 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13147 v1.AuxInt = int64ToAuxInt(e - c)
13148 v0.AddArg2(x, v1)
13149 v2 := b.NewValue0(v.Pos, OpConst16, t)
13150 v2.AuxInt = int16ToAuxInt(d << e)
13151 v.AddArg2(v0, v2)
13152 return true
13153 }
13154 break
13155 }
13156
13157
13158
13159 for {
13160 if v_0.Op != OpAnd16 {
13161 break
13162 }
13163 _ = v_0.Args[1]
13164 v_0_0 := v_0.Args[0]
13165 v_0_1 := v_0.Args[1]
13166 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13167 if v_0_0.Op != OpRsh16Ux64 {
13168 continue
13169 }
13170 t := v_0_0.Type
13171 _ = v_0_0.Args[1]
13172 x := v_0_0.Args[0]
13173 v_0_0_1 := v_0_0.Args[1]
13174 if v_0_0_1.Op != OpConst64 {
13175 continue
13176 }
13177 t2 := v_0_0_1.Type
13178 c := auxIntToInt64(v_0_0_1.AuxInt)
13179 if v_0_1.Op != OpConst16 {
13180 continue
13181 }
13182 d := auxIntToInt16(v_0_1.AuxInt)
13183 if v_1.Op != OpConst64 {
13184 continue
13185 }
13186 e := auxIntToInt64(v_1.AuxInt)
13187 if !(c < e) {
13188 continue
13189 }
13190 v.reset(OpAnd16)
13191 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
13192 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13193 v1.AuxInt = int64ToAuxInt(e - c)
13194 v0.AddArg2(x, v1)
13195 v2 := b.NewValue0(v.Pos, OpConst16, t)
13196 v2.AuxInt = int16ToAuxInt(d << e)
13197 v.AddArg2(v0, v2)
13198 return true
13199 }
13200 break
13201 }
13202
13203
13204
13205 for {
13206 if auxIntToBool(v.AuxInt) != false {
13207 break
13208 }
13209 x := v_0
13210 con := v_1
13211 if con.Op != OpConst64 {
13212 break
13213 }
13214 c := auxIntToInt64(con.AuxInt)
13215 if !(0 < c && c < 16) {
13216 break
13217 }
13218 v.reset(OpLsh16x64)
13219 v.AuxInt = boolToAuxInt(true)
13220 v.AddArg2(x, con)
13221 return true
13222 }
13223 return false
13224 }
13225 func rewriteValuegeneric_OpLsh16x8(v *Value) bool {
13226 v_1 := v.Args[1]
13227 v_0 := v.Args[0]
13228 b := v.Block
13229
13230
13231 for {
13232 t := v.Type
13233 x := v_0
13234 if v_1.Op != OpConst8 {
13235 break
13236 }
13237 c := auxIntToInt8(v_1.AuxInt)
13238 v.reset(OpLsh16x64)
13239 v0 := b.NewValue0(v.Pos, OpConst64, t)
13240 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
13241 v.AddArg2(x, v0)
13242 return true
13243 }
13244
13245
13246 for {
13247 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
13248 break
13249 }
13250 v.reset(OpConst16)
13251 v.AuxInt = int16ToAuxInt(0)
13252 return true
13253 }
13254
13255
13256
13257 for {
13258 if auxIntToBool(v.AuxInt) != false {
13259 break
13260 }
13261 x := v_0
13262 con := v_1
13263 if con.Op != OpConst8 {
13264 break
13265 }
13266 c := auxIntToInt8(con.AuxInt)
13267 if !(0 < c && c < 16) {
13268 break
13269 }
13270 v.reset(OpLsh16x8)
13271 v.AuxInt = boolToAuxInt(true)
13272 v.AddArg2(x, con)
13273 return true
13274 }
13275 return false
13276 }
13277 func rewriteValuegeneric_OpLsh32x16(v *Value) bool {
13278 v_1 := v.Args[1]
13279 v_0 := v.Args[0]
13280 b := v.Block
13281
13282
13283 for {
13284 t := v.Type
13285 x := v_0
13286 if v_1.Op != OpConst16 {
13287 break
13288 }
13289 c := auxIntToInt16(v_1.AuxInt)
13290 v.reset(OpLsh32x64)
13291 v0 := b.NewValue0(v.Pos, OpConst64, t)
13292 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
13293 v.AddArg2(x, v0)
13294 return true
13295 }
13296
13297
13298 for {
13299 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
13300 break
13301 }
13302 v.reset(OpConst32)
13303 v.AuxInt = int32ToAuxInt(0)
13304 return true
13305 }
13306
13307
13308
13309 for {
13310 if auxIntToBool(v.AuxInt) != false {
13311 break
13312 }
13313 x := v_0
13314 con := v_1
13315 if con.Op != OpConst16 {
13316 break
13317 }
13318 c := auxIntToInt16(con.AuxInt)
13319 if !(0 < c && c < 32) {
13320 break
13321 }
13322 v.reset(OpLsh32x16)
13323 v.AuxInt = boolToAuxInt(true)
13324 v.AddArg2(x, con)
13325 return true
13326 }
13327 return false
13328 }
13329 func rewriteValuegeneric_OpLsh32x32(v *Value) bool {
13330 v_1 := v.Args[1]
13331 v_0 := v.Args[0]
13332 b := v.Block
13333
13334
13335 for {
13336 t := v.Type
13337 x := v_0
13338 if v_1.Op != OpConst32 {
13339 break
13340 }
13341 c := auxIntToInt32(v_1.AuxInt)
13342 v.reset(OpLsh32x64)
13343 v0 := b.NewValue0(v.Pos, OpConst64, t)
13344 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
13345 v.AddArg2(x, v0)
13346 return true
13347 }
13348
13349
13350 for {
13351 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
13352 break
13353 }
13354 v.reset(OpConst32)
13355 v.AuxInt = int32ToAuxInt(0)
13356 return true
13357 }
13358
13359
13360
13361 for {
13362 if auxIntToBool(v.AuxInt) != false {
13363 break
13364 }
13365 x := v_0
13366 con := v_1
13367 if con.Op != OpConst32 {
13368 break
13369 }
13370 c := auxIntToInt32(con.AuxInt)
13371 if !(0 < c && c < 32) {
13372 break
13373 }
13374 v.reset(OpLsh32x32)
13375 v.AuxInt = boolToAuxInt(true)
13376 v.AddArg2(x, con)
13377 return true
13378 }
13379 return false
13380 }
13381 func rewriteValuegeneric_OpLsh32x64(v *Value) bool {
13382 v_1 := v.Args[1]
13383 v_0 := v.Args[0]
13384 b := v.Block
13385 typ := &b.Func.Config.Types
13386
13387
13388 for {
13389 if v_0.Op != OpConst32 {
13390 break
13391 }
13392 c := auxIntToInt32(v_0.AuxInt)
13393 if v_1.Op != OpConst64 {
13394 break
13395 }
13396 d := auxIntToInt64(v_1.AuxInt)
13397 v.reset(OpConst32)
13398 v.AuxInt = int32ToAuxInt(c << uint64(d))
13399 return true
13400 }
13401
13402
13403 for {
13404 x := v_0
13405 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
13406 break
13407 }
13408 v.copyOf(x)
13409 return true
13410 }
13411
13412
13413 for {
13414 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
13415 break
13416 }
13417 v.reset(OpConst32)
13418 v.AuxInt = int32ToAuxInt(0)
13419 return true
13420 }
13421
13422
13423
13424 for {
13425 if v_1.Op != OpConst64 {
13426 break
13427 }
13428 c := auxIntToInt64(v_1.AuxInt)
13429 if !(uint64(c) >= 32) {
13430 break
13431 }
13432 v.reset(OpConst32)
13433 v.AuxInt = int32ToAuxInt(0)
13434 return true
13435 }
13436
13437
13438
13439 for {
13440 t := v.Type
13441 if v_0.Op != OpLsh32x64 {
13442 break
13443 }
13444 _ = v_0.Args[1]
13445 x := v_0.Args[0]
13446 v_0_1 := v_0.Args[1]
13447 if v_0_1.Op != OpConst64 {
13448 break
13449 }
13450 c := auxIntToInt64(v_0_1.AuxInt)
13451 if v_1.Op != OpConst64 {
13452 break
13453 }
13454 d := auxIntToInt64(v_1.AuxInt)
13455 if !(!uaddOvf(c, d)) {
13456 break
13457 }
13458 v.reset(OpLsh32x64)
13459 v0 := b.NewValue0(v.Pos, OpConst64, t)
13460 v0.AuxInt = int64ToAuxInt(c + d)
13461 v.AddArg2(x, v0)
13462 return true
13463 }
13464
13465
13466
13467 for {
13468 i := v_0
13469 if i.Op != OpRsh32x64 {
13470 break
13471 }
13472 _ = i.Args[1]
13473 x := i.Args[0]
13474 i_1 := i.Args[1]
13475 if i_1.Op != OpConst64 {
13476 break
13477 }
13478 c := auxIntToInt64(i_1.AuxInt)
13479 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
13480 break
13481 }
13482 v.reset(OpAnd32)
13483 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
13484 v0.AuxInt = int32ToAuxInt(int32(-1) << c)
13485 v.AddArg2(x, v0)
13486 return true
13487 }
13488
13489
13490
13491 for {
13492 i := v_0
13493 if i.Op != OpRsh32Ux64 {
13494 break
13495 }
13496 _ = i.Args[1]
13497 x := i.Args[0]
13498 i_1 := i.Args[1]
13499 if i_1.Op != OpConst64 {
13500 break
13501 }
13502 c := auxIntToInt64(i_1.AuxInt)
13503 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
13504 break
13505 }
13506 v.reset(OpAnd32)
13507 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
13508 v0.AuxInt = int32ToAuxInt(int32(-1) << c)
13509 v.AddArg2(x, v0)
13510 return true
13511 }
13512
13513
13514
13515 for {
13516 if v_0.Op != OpRsh32Ux64 {
13517 break
13518 }
13519 _ = v_0.Args[1]
13520 v_0_0 := v_0.Args[0]
13521 if v_0_0.Op != OpLsh32x64 {
13522 break
13523 }
13524 _ = v_0_0.Args[1]
13525 x := v_0_0.Args[0]
13526 v_0_0_1 := v_0_0.Args[1]
13527 if v_0_0_1.Op != OpConst64 {
13528 break
13529 }
13530 c1 := auxIntToInt64(v_0_0_1.AuxInt)
13531 v_0_1 := v_0.Args[1]
13532 if v_0_1.Op != OpConst64 {
13533 break
13534 }
13535 c2 := auxIntToInt64(v_0_1.AuxInt)
13536 if v_1.Op != OpConst64 {
13537 break
13538 }
13539 c3 := auxIntToInt64(v_1.AuxInt)
13540 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
13541 break
13542 }
13543 v.reset(OpLsh32x64)
13544 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
13545 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
13546 v.AddArg2(x, v0)
13547 return true
13548 }
13549
13550
13551
13552 for {
13553 if v_0.Op != OpAnd32 {
13554 break
13555 }
13556 _ = v_0.Args[1]
13557 v_0_0 := v_0.Args[0]
13558 v_0_1 := v_0.Args[1]
13559 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13560 if v_0_0.Op != OpRsh32x64 {
13561 continue
13562 }
13563 t := v_0_0.Type
13564 _ = v_0_0.Args[1]
13565 x := v_0_0.Args[0]
13566 v_0_0_1 := v_0_0.Args[1]
13567 if v_0_0_1.Op != OpConst64 {
13568 continue
13569 }
13570 t2 := v_0_0_1.Type
13571 c := auxIntToInt64(v_0_0_1.AuxInt)
13572 if v_0_1.Op != OpConst32 {
13573 continue
13574 }
13575 d := auxIntToInt32(v_0_1.AuxInt)
13576 if v_1.Op != OpConst64 {
13577 continue
13578 }
13579 e := auxIntToInt64(v_1.AuxInt)
13580 if !(c >= e) {
13581 continue
13582 }
13583 v.reset(OpAnd32)
13584 v0 := b.NewValue0(v.Pos, OpRsh32x64, t)
13585 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13586 v1.AuxInt = int64ToAuxInt(c - e)
13587 v0.AddArg2(x, v1)
13588 v2 := b.NewValue0(v.Pos, OpConst32, t)
13589 v2.AuxInt = int32ToAuxInt(d << e)
13590 v.AddArg2(v0, v2)
13591 return true
13592 }
13593 break
13594 }
13595
13596
13597
13598 for {
13599 if v_0.Op != OpAnd32 {
13600 break
13601 }
13602 _ = v_0.Args[1]
13603 v_0_0 := v_0.Args[0]
13604 v_0_1 := v_0.Args[1]
13605 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13606 if v_0_0.Op != OpRsh32Ux64 {
13607 continue
13608 }
13609 t := v_0_0.Type
13610 _ = v_0_0.Args[1]
13611 x := v_0_0.Args[0]
13612 v_0_0_1 := v_0_0.Args[1]
13613 if v_0_0_1.Op != OpConst64 {
13614 continue
13615 }
13616 t2 := v_0_0_1.Type
13617 c := auxIntToInt64(v_0_0_1.AuxInt)
13618 if v_0_1.Op != OpConst32 {
13619 continue
13620 }
13621 d := auxIntToInt32(v_0_1.AuxInt)
13622 if v_1.Op != OpConst64 {
13623 continue
13624 }
13625 e := auxIntToInt64(v_1.AuxInt)
13626 if !(c >= e) {
13627 continue
13628 }
13629 v.reset(OpAnd32)
13630 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, t)
13631 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13632 v1.AuxInt = int64ToAuxInt(c - e)
13633 v0.AddArg2(x, v1)
13634 v2 := b.NewValue0(v.Pos, OpConst32, t)
13635 v2.AuxInt = int32ToAuxInt(d << e)
13636 v.AddArg2(v0, v2)
13637 return true
13638 }
13639 break
13640 }
13641
13642
13643
13644 for {
13645 if v_0.Op != OpAnd32 {
13646 break
13647 }
13648 _ = v_0.Args[1]
13649 v_0_0 := v_0.Args[0]
13650 v_0_1 := v_0.Args[1]
13651 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13652 if v_0_0.Op != OpRsh32x64 {
13653 continue
13654 }
13655 t := v_0_0.Type
13656 _ = v_0_0.Args[1]
13657 x := v_0_0.Args[0]
13658 v_0_0_1 := v_0_0.Args[1]
13659 if v_0_0_1.Op != OpConst64 {
13660 continue
13661 }
13662 t2 := v_0_0_1.Type
13663 c := auxIntToInt64(v_0_0_1.AuxInt)
13664 if v_0_1.Op != OpConst32 {
13665 continue
13666 }
13667 d := auxIntToInt32(v_0_1.AuxInt)
13668 if v_1.Op != OpConst64 {
13669 continue
13670 }
13671 e := auxIntToInt64(v_1.AuxInt)
13672 if !(c < e) {
13673 continue
13674 }
13675 v.reset(OpAnd32)
13676 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
13677 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13678 v1.AuxInt = int64ToAuxInt(e - c)
13679 v0.AddArg2(x, v1)
13680 v2 := b.NewValue0(v.Pos, OpConst32, t)
13681 v2.AuxInt = int32ToAuxInt(d << e)
13682 v.AddArg2(v0, v2)
13683 return true
13684 }
13685 break
13686 }
13687
13688
13689
13690 for {
13691 if v_0.Op != OpAnd32 {
13692 break
13693 }
13694 _ = v_0.Args[1]
13695 v_0_0 := v_0.Args[0]
13696 v_0_1 := v_0.Args[1]
13697 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13698 if v_0_0.Op != OpRsh32Ux64 {
13699 continue
13700 }
13701 t := v_0_0.Type
13702 _ = v_0_0.Args[1]
13703 x := v_0_0.Args[0]
13704 v_0_0_1 := v_0_0.Args[1]
13705 if v_0_0_1.Op != OpConst64 {
13706 continue
13707 }
13708 t2 := v_0_0_1.Type
13709 c := auxIntToInt64(v_0_0_1.AuxInt)
13710 if v_0_1.Op != OpConst32 {
13711 continue
13712 }
13713 d := auxIntToInt32(v_0_1.AuxInt)
13714 if v_1.Op != OpConst64 {
13715 continue
13716 }
13717 e := auxIntToInt64(v_1.AuxInt)
13718 if !(c < e) {
13719 continue
13720 }
13721 v.reset(OpAnd32)
13722 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
13723 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13724 v1.AuxInt = int64ToAuxInt(e - c)
13725 v0.AddArg2(x, v1)
13726 v2 := b.NewValue0(v.Pos, OpConst32, t)
13727 v2.AuxInt = int32ToAuxInt(d << e)
13728 v.AddArg2(v0, v2)
13729 return true
13730 }
13731 break
13732 }
13733
13734
13735
13736 for {
13737 if auxIntToBool(v.AuxInt) != false {
13738 break
13739 }
13740 x := v_0
13741 con := v_1
13742 if con.Op != OpConst64 {
13743 break
13744 }
13745 c := auxIntToInt64(con.AuxInt)
13746 if !(0 < c && c < 32) {
13747 break
13748 }
13749 v.reset(OpLsh32x64)
13750 v.AuxInt = boolToAuxInt(true)
13751 v.AddArg2(x, con)
13752 return true
13753 }
13754 return false
13755 }
13756 func rewriteValuegeneric_OpLsh32x8(v *Value) bool {
13757 v_1 := v.Args[1]
13758 v_0 := v.Args[0]
13759 b := v.Block
13760
13761
13762 for {
13763 t := v.Type
13764 x := v_0
13765 if v_1.Op != OpConst8 {
13766 break
13767 }
13768 c := auxIntToInt8(v_1.AuxInt)
13769 v.reset(OpLsh32x64)
13770 v0 := b.NewValue0(v.Pos, OpConst64, t)
13771 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
13772 v.AddArg2(x, v0)
13773 return true
13774 }
13775
13776
13777 for {
13778 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
13779 break
13780 }
13781 v.reset(OpConst32)
13782 v.AuxInt = int32ToAuxInt(0)
13783 return true
13784 }
13785
13786
13787
13788 for {
13789 if auxIntToBool(v.AuxInt) != false {
13790 break
13791 }
13792 x := v_0
13793 con := v_1
13794 if con.Op != OpConst8 {
13795 break
13796 }
13797 c := auxIntToInt8(con.AuxInt)
13798 if !(0 < c && c < 32) {
13799 break
13800 }
13801 v.reset(OpLsh32x8)
13802 v.AuxInt = boolToAuxInt(true)
13803 v.AddArg2(x, con)
13804 return true
13805 }
13806 return false
13807 }
13808 func rewriteValuegeneric_OpLsh64x16(v *Value) bool {
13809 v_1 := v.Args[1]
13810 v_0 := v.Args[0]
13811 b := v.Block
13812
13813
13814 for {
13815 t := v.Type
13816 x := v_0
13817 if v_1.Op != OpConst16 {
13818 break
13819 }
13820 c := auxIntToInt16(v_1.AuxInt)
13821 v.reset(OpLsh64x64)
13822 v0 := b.NewValue0(v.Pos, OpConst64, t)
13823 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
13824 v.AddArg2(x, v0)
13825 return true
13826 }
13827
13828
13829 for {
13830 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
13831 break
13832 }
13833 v.reset(OpConst64)
13834 v.AuxInt = int64ToAuxInt(0)
13835 return true
13836 }
13837
13838
13839
13840 for {
13841 if auxIntToBool(v.AuxInt) != false {
13842 break
13843 }
13844 x := v_0
13845 con := v_1
13846 if con.Op != OpConst16 {
13847 break
13848 }
13849 c := auxIntToInt16(con.AuxInt)
13850 if !(0 < c && c < 64) {
13851 break
13852 }
13853 v.reset(OpLsh64x16)
13854 v.AuxInt = boolToAuxInt(true)
13855 v.AddArg2(x, con)
13856 return true
13857 }
13858 return false
13859 }
13860 func rewriteValuegeneric_OpLsh64x32(v *Value) bool {
13861 v_1 := v.Args[1]
13862 v_0 := v.Args[0]
13863 b := v.Block
13864
13865
13866 for {
13867 t := v.Type
13868 x := v_0
13869 if v_1.Op != OpConst32 {
13870 break
13871 }
13872 c := auxIntToInt32(v_1.AuxInt)
13873 v.reset(OpLsh64x64)
13874 v0 := b.NewValue0(v.Pos, OpConst64, t)
13875 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
13876 v.AddArg2(x, v0)
13877 return true
13878 }
13879
13880
13881 for {
13882 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
13883 break
13884 }
13885 v.reset(OpConst64)
13886 v.AuxInt = int64ToAuxInt(0)
13887 return true
13888 }
13889
13890
13891
13892 for {
13893 if auxIntToBool(v.AuxInt) != false {
13894 break
13895 }
13896 x := v_0
13897 con := v_1
13898 if con.Op != OpConst32 {
13899 break
13900 }
13901 c := auxIntToInt32(con.AuxInt)
13902 if !(0 < c && c < 64) {
13903 break
13904 }
13905 v.reset(OpLsh64x32)
13906 v.AuxInt = boolToAuxInt(true)
13907 v.AddArg2(x, con)
13908 return true
13909 }
13910 return false
13911 }
13912 func rewriteValuegeneric_OpLsh64x64(v *Value) bool {
13913 v_1 := v.Args[1]
13914 v_0 := v.Args[0]
13915 b := v.Block
13916 typ := &b.Func.Config.Types
13917
13918
13919 for {
13920 if v_0.Op != OpConst64 {
13921 break
13922 }
13923 c := auxIntToInt64(v_0.AuxInt)
13924 if v_1.Op != OpConst64 {
13925 break
13926 }
13927 d := auxIntToInt64(v_1.AuxInt)
13928 v.reset(OpConst64)
13929 v.AuxInt = int64ToAuxInt(c << uint64(d))
13930 return true
13931 }
13932
13933
13934 for {
13935 x := v_0
13936 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
13937 break
13938 }
13939 v.copyOf(x)
13940 return true
13941 }
13942
13943
13944 for {
13945 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
13946 break
13947 }
13948 v.reset(OpConst64)
13949 v.AuxInt = int64ToAuxInt(0)
13950 return true
13951 }
13952
13953
13954
13955 for {
13956 if v_1.Op != OpConst64 {
13957 break
13958 }
13959 c := auxIntToInt64(v_1.AuxInt)
13960 if !(uint64(c) >= 64) {
13961 break
13962 }
13963 v.reset(OpConst64)
13964 v.AuxInt = int64ToAuxInt(0)
13965 return true
13966 }
13967
13968
13969
13970 for {
13971 t := v.Type
13972 if v_0.Op != OpLsh64x64 {
13973 break
13974 }
13975 _ = v_0.Args[1]
13976 x := v_0.Args[0]
13977 v_0_1 := v_0.Args[1]
13978 if v_0_1.Op != OpConst64 {
13979 break
13980 }
13981 c := auxIntToInt64(v_0_1.AuxInt)
13982 if v_1.Op != OpConst64 {
13983 break
13984 }
13985 d := auxIntToInt64(v_1.AuxInt)
13986 if !(!uaddOvf(c, d)) {
13987 break
13988 }
13989 v.reset(OpLsh64x64)
13990 v0 := b.NewValue0(v.Pos, OpConst64, t)
13991 v0.AuxInt = int64ToAuxInt(c + d)
13992 v.AddArg2(x, v0)
13993 return true
13994 }
13995
13996
13997
13998 for {
13999 i := v_0
14000 if i.Op != OpRsh64x64 {
14001 break
14002 }
14003 _ = i.Args[1]
14004 x := i.Args[0]
14005 i_1 := i.Args[1]
14006 if i_1.Op != OpConst64 {
14007 break
14008 }
14009 c := auxIntToInt64(i_1.AuxInt)
14010 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
14011 break
14012 }
14013 v.reset(OpAnd64)
14014 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
14015 v0.AuxInt = int64ToAuxInt(int64(-1) << c)
14016 v.AddArg2(x, v0)
14017 return true
14018 }
14019
14020
14021
14022 for {
14023 i := v_0
14024 if i.Op != OpRsh64Ux64 {
14025 break
14026 }
14027 _ = i.Args[1]
14028 x := i.Args[0]
14029 i_1 := i.Args[1]
14030 if i_1.Op != OpConst64 {
14031 break
14032 }
14033 c := auxIntToInt64(i_1.AuxInt)
14034 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
14035 break
14036 }
14037 v.reset(OpAnd64)
14038 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
14039 v0.AuxInt = int64ToAuxInt(int64(-1) << c)
14040 v.AddArg2(x, v0)
14041 return true
14042 }
14043
14044
14045
14046 for {
14047 if v_0.Op != OpRsh64Ux64 {
14048 break
14049 }
14050 _ = v_0.Args[1]
14051 v_0_0 := v_0.Args[0]
14052 if v_0_0.Op != OpLsh64x64 {
14053 break
14054 }
14055 _ = v_0_0.Args[1]
14056 x := v_0_0.Args[0]
14057 v_0_0_1 := v_0_0.Args[1]
14058 if v_0_0_1.Op != OpConst64 {
14059 break
14060 }
14061 c1 := auxIntToInt64(v_0_0_1.AuxInt)
14062 v_0_1 := v_0.Args[1]
14063 if v_0_1.Op != OpConst64 {
14064 break
14065 }
14066 c2 := auxIntToInt64(v_0_1.AuxInt)
14067 if v_1.Op != OpConst64 {
14068 break
14069 }
14070 c3 := auxIntToInt64(v_1.AuxInt)
14071 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
14072 break
14073 }
14074 v.reset(OpLsh64x64)
14075 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
14076 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
14077 v.AddArg2(x, v0)
14078 return true
14079 }
14080
14081
14082
14083 for {
14084 if v_0.Op != OpAnd64 {
14085 break
14086 }
14087 _ = v_0.Args[1]
14088 v_0_0 := v_0.Args[0]
14089 v_0_1 := v_0.Args[1]
14090 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14091 if v_0_0.Op != OpRsh64x64 {
14092 continue
14093 }
14094 t := v_0_0.Type
14095 _ = v_0_0.Args[1]
14096 x := v_0_0.Args[0]
14097 v_0_0_1 := v_0_0.Args[1]
14098 if v_0_0_1.Op != OpConst64 {
14099 continue
14100 }
14101 t2 := v_0_0_1.Type
14102 c := auxIntToInt64(v_0_0_1.AuxInt)
14103 if v_0_1.Op != OpConst64 {
14104 continue
14105 }
14106 d := auxIntToInt64(v_0_1.AuxInt)
14107 if v_1.Op != OpConst64 {
14108 continue
14109 }
14110 e := auxIntToInt64(v_1.AuxInt)
14111 if !(c >= e) {
14112 continue
14113 }
14114 v.reset(OpAnd64)
14115 v0 := b.NewValue0(v.Pos, OpRsh64x64, t)
14116 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14117 v1.AuxInt = int64ToAuxInt(c - e)
14118 v0.AddArg2(x, v1)
14119 v2 := b.NewValue0(v.Pos, OpConst64, t)
14120 v2.AuxInt = int64ToAuxInt(d << e)
14121 v.AddArg2(v0, v2)
14122 return true
14123 }
14124 break
14125 }
14126
14127
14128
14129 for {
14130 if v_0.Op != OpAnd64 {
14131 break
14132 }
14133 _ = v_0.Args[1]
14134 v_0_0 := v_0.Args[0]
14135 v_0_1 := v_0.Args[1]
14136 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14137 if v_0_0.Op != OpRsh64Ux64 {
14138 continue
14139 }
14140 t := v_0_0.Type
14141 _ = v_0_0.Args[1]
14142 x := v_0_0.Args[0]
14143 v_0_0_1 := v_0_0.Args[1]
14144 if v_0_0_1.Op != OpConst64 {
14145 continue
14146 }
14147 t2 := v_0_0_1.Type
14148 c := auxIntToInt64(v_0_0_1.AuxInt)
14149 if v_0_1.Op != OpConst64 {
14150 continue
14151 }
14152 d := auxIntToInt64(v_0_1.AuxInt)
14153 if v_1.Op != OpConst64 {
14154 continue
14155 }
14156 e := auxIntToInt64(v_1.AuxInt)
14157 if !(c >= e) {
14158 continue
14159 }
14160 v.reset(OpAnd64)
14161 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t)
14162 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14163 v1.AuxInt = int64ToAuxInt(c - e)
14164 v0.AddArg2(x, v1)
14165 v2 := b.NewValue0(v.Pos, OpConst64, t)
14166 v2.AuxInt = int64ToAuxInt(d << e)
14167 v.AddArg2(v0, v2)
14168 return true
14169 }
14170 break
14171 }
14172
14173
14174
14175 for {
14176 if v_0.Op != OpAnd64 {
14177 break
14178 }
14179 _ = v_0.Args[1]
14180 v_0_0 := v_0.Args[0]
14181 v_0_1 := v_0.Args[1]
14182 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14183 if v_0_0.Op != OpRsh64x64 {
14184 continue
14185 }
14186 t := v_0_0.Type
14187 _ = v_0_0.Args[1]
14188 x := v_0_0.Args[0]
14189 v_0_0_1 := v_0_0.Args[1]
14190 if v_0_0_1.Op != OpConst64 {
14191 continue
14192 }
14193 t2 := v_0_0_1.Type
14194 c := auxIntToInt64(v_0_0_1.AuxInt)
14195 if v_0_1.Op != OpConst64 {
14196 continue
14197 }
14198 d := auxIntToInt64(v_0_1.AuxInt)
14199 if v_1.Op != OpConst64 {
14200 continue
14201 }
14202 e := auxIntToInt64(v_1.AuxInt)
14203 if !(c < e) {
14204 continue
14205 }
14206 v.reset(OpAnd64)
14207 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
14208 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14209 v1.AuxInt = int64ToAuxInt(e - c)
14210 v0.AddArg2(x, v1)
14211 v2 := b.NewValue0(v.Pos, OpConst64, t)
14212 v2.AuxInt = int64ToAuxInt(d << e)
14213 v.AddArg2(v0, v2)
14214 return true
14215 }
14216 break
14217 }
14218
14219
14220
14221 for {
14222 if v_0.Op != OpAnd64 {
14223 break
14224 }
14225 _ = v_0.Args[1]
14226 v_0_0 := v_0.Args[0]
14227 v_0_1 := v_0.Args[1]
14228 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14229 if v_0_0.Op != OpRsh64Ux64 {
14230 continue
14231 }
14232 t := v_0_0.Type
14233 _ = v_0_0.Args[1]
14234 x := v_0_0.Args[0]
14235 v_0_0_1 := v_0_0.Args[1]
14236 if v_0_0_1.Op != OpConst64 {
14237 continue
14238 }
14239 t2 := v_0_0_1.Type
14240 c := auxIntToInt64(v_0_0_1.AuxInt)
14241 if v_0_1.Op != OpConst64 {
14242 continue
14243 }
14244 d := auxIntToInt64(v_0_1.AuxInt)
14245 if v_1.Op != OpConst64 {
14246 continue
14247 }
14248 e := auxIntToInt64(v_1.AuxInt)
14249 if !(c < e) {
14250 continue
14251 }
14252 v.reset(OpAnd64)
14253 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
14254 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14255 v1.AuxInt = int64ToAuxInt(e - c)
14256 v0.AddArg2(x, v1)
14257 v2 := b.NewValue0(v.Pos, OpConst64, t)
14258 v2.AuxInt = int64ToAuxInt(d << e)
14259 v.AddArg2(v0, v2)
14260 return true
14261 }
14262 break
14263 }
14264
14265
14266
14267 for {
14268 if auxIntToBool(v.AuxInt) != false {
14269 break
14270 }
14271 x := v_0
14272 con := v_1
14273 if con.Op != OpConst64 {
14274 break
14275 }
14276 c := auxIntToInt64(con.AuxInt)
14277 if !(0 < c && c < 64) {
14278 break
14279 }
14280 v.reset(OpLsh64x64)
14281 v.AuxInt = boolToAuxInt(true)
14282 v.AddArg2(x, con)
14283 return true
14284 }
14285 return false
14286 }
14287 func rewriteValuegeneric_OpLsh64x8(v *Value) bool {
14288 v_1 := v.Args[1]
14289 v_0 := v.Args[0]
14290 b := v.Block
14291
14292
14293 for {
14294 t := v.Type
14295 x := v_0
14296 if v_1.Op != OpConst8 {
14297 break
14298 }
14299 c := auxIntToInt8(v_1.AuxInt)
14300 v.reset(OpLsh64x64)
14301 v0 := b.NewValue0(v.Pos, OpConst64, t)
14302 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
14303 v.AddArg2(x, v0)
14304 return true
14305 }
14306
14307
14308 for {
14309 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
14310 break
14311 }
14312 v.reset(OpConst64)
14313 v.AuxInt = int64ToAuxInt(0)
14314 return true
14315 }
14316
14317
14318
14319 for {
14320 if auxIntToBool(v.AuxInt) != false {
14321 break
14322 }
14323 x := v_0
14324 con := v_1
14325 if con.Op != OpConst8 {
14326 break
14327 }
14328 c := auxIntToInt8(con.AuxInt)
14329 if !(0 < c && c < 64) {
14330 break
14331 }
14332 v.reset(OpLsh64x8)
14333 v.AuxInt = boolToAuxInt(true)
14334 v.AddArg2(x, con)
14335 return true
14336 }
14337 return false
14338 }
14339 func rewriteValuegeneric_OpLsh8x16(v *Value) bool {
14340 v_1 := v.Args[1]
14341 v_0 := v.Args[0]
14342 b := v.Block
14343
14344
14345 for {
14346 t := v.Type
14347 x := v_0
14348 if v_1.Op != OpConst16 {
14349 break
14350 }
14351 c := auxIntToInt16(v_1.AuxInt)
14352 v.reset(OpLsh8x64)
14353 v0 := b.NewValue0(v.Pos, OpConst64, t)
14354 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
14355 v.AddArg2(x, v0)
14356 return true
14357 }
14358
14359
14360 for {
14361 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
14362 break
14363 }
14364 v.reset(OpConst8)
14365 v.AuxInt = int8ToAuxInt(0)
14366 return true
14367 }
14368
14369
14370
14371 for {
14372 if auxIntToBool(v.AuxInt) != false {
14373 break
14374 }
14375 x := v_0
14376 con := v_1
14377 if con.Op != OpConst16 {
14378 break
14379 }
14380 c := auxIntToInt16(con.AuxInt)
14381 if !(0 < c && c < 8) {
14382 break
14383 }
14384 v.reset(OpLsh8x16)
14385 v.AuxInt = boolToAuxInt(true)
14386 v.AddArg2(x, con)
14387 return true
14388 }
14389 return false
14390 }
14391 func rewriteValuegeneric_OpLsh8x32(v *Value) bool {
14392 v_1 := v.Args[1]
14393 v_0 := v.Args[0]
14394 b := v.Block
14395
14396
14397 for {
14398 t := v.Type
14399 x := v_0
14400 if v_1.Op != OpConst32 {
14401 break
14402 }
14403 c := auxIntToInt32(v_1.AuxInt)
14404 v.reset(OpLsh8x64)
14405 v0 := b.NewValue0(v.Pos, OpConst64, t)
14406 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
14407 v.AddArg2(x, v0)
14408 return true
14409 }
14410
14411
14412 for {
14413 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
14414 break
14415 }
14416 v.reset(OpConst8)
14417 v.AuxInt = int8ToAuxInt(0)
14418 return true
14419 }
14420
14421
14422
14423 for {
14424 if auxIntToBool(v.AuxInt) != false {
14425 break
14426 }
14427 x := v_0
14428 con := v_1
14429 if con.Op != OpConst32 {
14430 break
14431 }
14432 c := auxIntToInt32(con.AuxInt)
14433 if !(0 < c && c < 8) {
14434 break
14435 }
14436 v.reset(OpLsh8x32)
14437 v.AuxInt = boolToAuxInt(true)
14438 v.AddArg2(x, con)
14439 return true
14440 }
14441 return false
14442 }
14443 func rewriteValuegeneric_OpLsh8x64(v *Value) bool {
14444 v_1 := v.Args[1]
14445 v_0 := v.Args[0]
14446 b := v.Block
14447 typ := &b.Func.Config.Types
14448
14449
14450 for {
14451 if v_0.Op != OpConst8 {
14452 break
14453 }
14454 c := auxIntToInt8(v_0.AuxInt)
14455 if v_1.Op != OpConst64 {
14456 break
14457 }
14458 d := auxIntToInt64(v_1.AuxInt)
14459 v.reset(OpConst8)
14460 v.AuxInt = int8ToAuxInt(c << uint64(d))
14461 return true
14462 }
14463
14464
14465 for {
14466 x := v_0
14467 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
14468 break
14469 }
14470 v.copyOf(x)
14471 return true
14472 }
14473
14474
14475 for {
14476 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
14477 break
14478 }
14479 v.reset(OpConst8)
14480 v.AuxInt = int8ToAuxInt(0)
14481 return true
14482 }
14483
14484
14485
14486 for {
14487 if v_1.Op != OpConst64 {
14488 break
14489 }
14490 c := auxIntToInt64(v_1.AuxInt)
14491 if !(uint64(c) >= 8) {
14492 break
14493 }
14494 v.reset(OpConst8)
14495 v.AuxInt = int8ToAuxInt(0)
14496 return true
14497 }
14498
14499
14500
14501 for {
14502 t := v.Type
14503 if v_0.Op != OpLsh8x64 {
14504 break
14505 }
14506 _ = v_0.Args[1]
14507 x := v_0.Args[0]
14508 v_0_1 := v_0.Args[1]
14509 if v_0_1.Op != OpConst64 {
14510 break
14511 }
14512 c := auxIntToInt64(v_0_1.AuxInt)
14513 if v_1.Op != OpConst64 {
14514 break
14515 }
14516 d := auxIntToInt64(v_1.AuxInt)
14517 if !(!uaddOvf(c, d)) {
14518 break
14519 }
14520 v.reset(OpLsh8x64)
14521 v0 := b.NewValue0(v.Pos, OpConst64, t)
14522 v0.AuxInt = int64ToAuxInt(c + d)
14523 v.AddArg2(x, v0)
14524 return true
14525 }
14526
14527
14528
14529 for {
14530 i := v_0
14531 if i.Op != OpRsh8x64 {
14532 break
14533 }
14534 _ = i.Args[1]
14535 x := i.Args[0]
14536 i_1 := i.Args[1]
14537 if i_1.Op != OpConst64 {
14538 break
14539 }
14540 c := auxIntToInt64(i_1.AuxInt)
14541 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
14542 break
14543 }
14544 v.reset(OpAnd8)
14545 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
14546 v0.AuxInt = int8ToAuxInt(int8(-1) << c)
14547 v.AddArg2(x, v0)
14548 return true
14549 }
14550
14551
14552
14553 for {
14554 i := v_0
14555 if i.Op != OpRsh8Ux64 {
14556 break
14557 }
14558 _ = i.Args[1]
14559 x := i.Args[0]
14560 i_1 := i.Args[1]
14561 if i_1.Op != OpConst64 {
14562 break
14563 }
14564 c := auxIntToInt64(i_1.AuxInt)
14565 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
14566 break
14567 }
14568 v.reset(OpAnd8)
14569 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
14570 v0.AuxInt = int8ToAuxInt(int8(-1) << c)
14571 v.AddArg2(x, v0)
14572 return true
14573 }
14574
14575
14576
14577 for {
14578 if v_0.Op != OpRsh8Ux64 {
14579 break
14580 }
14581 _ = v_0.Args[1]
14582 v_0_0 := v_0.Args[0]
14583 if v_0_0.Op != OpLsh8x64 {
14584 break
14585 }
14586 _ = v_0_0.Args[1]
14587 x := v_0_0.Args[0]
14588 v_0_0_1 := v_0_0.Args[1]
14589 if v_0_0_1.Op != OpConst64 {
14590 break
14591 }
14592 c1 := auxIntToInt64(v_0_0_1.AuxInt)
14593 v_0_1 := v_0.Args[1]
14594 if v_0_1.Op != OpConst64 {
14595 break
14596 }
14597 c2 := auxIntToInt64(v_0_1.AuxInt)
14598 if v_1.Op != OpConst64 {
14599 break
14600 }
14601 c3 := auxIntToInt64(v_1.AuxInt)
14602 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
14603 break
14604 }
14605 v.reset(OpLsh8x64)
14606 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
14607 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
14608 v.AddArg2(x, v0)
14609 return true
14610 }
14611
14612
14613
14614 for {
14615 if v_0.Op != OpAnd8 {
14616 break
14617 }
14618 _ = v_0.Args[1]
14619 v_0_0 := v_0.Args[0]
14620 v_0_1 := v_0.Args[1]
14621 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14622 if v_0_0.Op != OpRsh8x64 {
14623 continue
14624 }
14625 t := v_0_0.Type
14626 _ = v_0_0.Args[1]
14627 x := v_0_0.Args[0]
14628 v_0_0_1 := v_0_0.Args[1]
14629 if v_0_0_1.Op != OpConst64 {
14630 continue
14631 }
14632 t2 := v_0_0_1.Type
14633 c := auxIntToInt64(v_0_0_1.AuxInt)
14634 if v_0_1.Op != OpConst8 {
14635 continue
14636 }
14637 d := auxIntToInt8(v_0_1.AuxInt)
14638 if v_1.Op != OpConst64 {
14639 continue
14640 }
14641 e := auxIntToInt64(v_1.AuxInt)
14642 if !(c >= e) {
14643 continue
14644 }
14645 v.reset(OpAnd8)
14646 v0 := b.NewValue0(v.Pos, OpRsh8x64, t)
14647 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14648 v1.AuxInt = int64ToAuxInt(c - e)
14649 v0.AddArg2(x, v1)
14650 v2 := b.NewValue0(v.Pos, OpConst8, t)
14651 v2.AuxInt = int8ToAuxInt(d << e)
14652 v.AddArg2(v0, v2)
14653 return true
14654 }
14655 break
14656 }
14657
14658
14659
14660 for {
14661 if v_0.Op != OpAnd8 {
14662 break
14663 }
14664 _ = v_0.Args[1]
14665 v_0_0 := v_0.Args[0]
14666 v_0_1 := v_0.Args[1]
14667 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14668 if v_0_0.Op != OpRsh8Ux64 {
14669 continue
14670 }
14671 t := v_0_0.Type
14672 _ = v_0_0.Args[1]
14673 x := v_0_0.Args[0]
14674 v_0_0_1 := v_0_0.Args[1]
14675 if v_0_0_1.Op != OpConst64 {
14676 continue
14677 }
14678 t2 := v_0_0_1.Type
14679 c := auxIntToInt64(v_0_0_1.AuxInt)
14680 if v_0_1.Op != OpConst8 {
14681 continue
14682 }
14683 d := auxIntToInt8(v_0_1.AuxInt)
14684 if v_1.Op != OpConst64 {
14685 continue
14686 }
14687 e := auxIntToInt64(v_1.AuxInt)
14688 if !(c >= e) {
14689 continue
14690 }
14691 v.reset(OpAnd8)
14692 v0 := b.NewValue0(v.Pos, OpRsh8Ux64, t)
14693 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14694 v1.AuxInt = int64ToAuxInt(c - e)
14695 v0.AddArg2(x, v1)
14696 v2 := b.NewValue0(v.Pos, OpConst8, t)
14697 v2.AuxInt = int8ToAuxInt(d << e)
14698 v.AddArg2(v0, v2)
14699 return true
14700 }
14701 break
14702 }
14703
14704
14705
14706 for {
14707 if v_0.Op != OpAnd8 {
14708 break
14709 }
14710 _ = v_0.Args[1]
14711 v_0_0 := v_0.Args[0]
14712 v_0_1 := v_0.Args[1]
14713 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14714 if v_0_0.Op != OpRsh8x64 {
14715 continue
14716 }
14717 t := v_0_0.Type
14718 _ = v_0_0.Args[1]
14719 x := v_0_0.Args[0]
14720 v_0_0_1 := v_0_0.Args[1]
14721 if v_0_0_1.Op != OpConst64 {
14722 continue
14723 }
14724 t2 := v_0_0_1.Type
14725 c := auxIntToInt64(v_0_0_1.AuxInt)
14726 if v_0_1.Op != OpConst8 {
14727 continue
14728 }
14729 d := auxIntToInt8(v_0_1.AuxInt)
14730 if v_1.Op != OpConst64 {
14731 continue
14732 }
14733 e := auxIntToInt64(v_1.AuxInt)
14734 if !(c < e) {
14735 continue
14736 }
14737 v.reset(OpAnd8)
14738 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
14739 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14740 v1.AuxInt = int64ToAuxInt(e - c)
14741 v0.AddArg2(x, v1)
14742 v2 := b.NewValue0(v.Pos, OpConst8, t)
14743 v2.AuxInt = int8ToAuxInt(d << e)
14744 v.AddArg2(v0, v2)
14745 return true
14746 }
14747 break
14748 }
14749
14750
14751
14752 for {
14753 if v_0.Op != OpAnd8 {
14754 break
14755 }
14756 _ = v_0.Args[1]
14757 v_0_0 := v_0.Args[0]
14758 v_0_1 := v_0.Args[1]
14759 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14760 if v_0_0.Op != OpRsh8Ux64 {
14761 continue
14762 }
14763 t := v_0_0.Type
14764 _ = v_0_0.Args[1]
14765 x := v_0_0.Args[0]
14766 v_0_0_1 := v_0_0.Args[1]
14767 if v_0_0_1.Op != OpConst64 {
14768 continue
14769 }
14770 t2 := v_0_0_1.Type
14771 c := auxIntToInt64(v_0_0_1.AuxInt)
14772 if v_0_1.Op != OpConst8 {
14773 continue
14774 }
14775 d := auxIntToInt8(v_0_1.AuxInt)
14776 if v_1.Op != OpConst64 {
14777 continue
14778 }
14779 e := auxIntToInt64(v_1.AuxInt)
14780 if !(c < e) {
14781 continue
14782 }
14783 v.reset(OpAnd8)
14784 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
14785 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14786 v1.AuxInt = int64ToAuxInt(e - c)
14787 v0.AddArg2(x, v1)
14788 v2 := b.NewValue0(v.Pos, OpConst8, t)
14789 v2.AuxInt = int8ToAuxInt(d << e)
14790 v.AddArg2(v0, v2)
14791 return true
14792 }
14793 break
14794 }
14795
14796
14797
14798 for {
14799 if auxIntToBool(v.AuxInt) != false {
14800 break
14801 }
14802 x := v_0
14803 con := v_1
14804 if con.Op != OpConst64 {
14805 break
14806 }
14807 c := auxIntToInt64(con.AuxInt)
14808 if !(0 < c && c < 8) {
14809 break
14810 }
14811 v.reset(OpLsh8x64)
14812 v.AuxInt = boolToAuxInt(true)
14813 v.AddArg2(x, con)
14814 return true
14815 }
14816 return false
14817 }
14818 func rewriteValuegeneric_OpLsh8x8(v *Value) bool {
14819 v_1 := v.Args[1]
14820 v_0 := v.Args[0]
14821 b := v.Block
14822
14823
14824 for {
14825 t := v.Type
14826 x := v_0
14827 if v_1.Op != OpConst8 {
14828 break
14829 }
14830 c := auxIntToInt8(v_1.AuxInt)
14831 v.reset(OpLsh8x64)
14832 v0 := b.NewValue0(v.Pos, OpConst64, t)
14833 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
14834 v.AddArg2(x, v0)
14835 return true
14836 }
14837
14838
14839 for {
14840 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
14841 break
14842 }
14843 v.reset(OpConst8)
14844 v.AuxInt = int8ToAuxInt(0)
14845 return true
14846 }
14847
14848
14849
14850 for {
14851 if auxIntToBool(v.AuxInt) != false {
14852 break
14853 }
14854 x := v_0
14855 con := v_1
14856 if con.Op != OpConst8 {
14857 break
14858 }
14859 c := auxIntToInt8(con.AuxInt)
14860 if !(0 < c && c < 8) {
14861 break
14862 }
14863 v.reset(OpLsh8x8)
14864 v.AuxInt = boolToAuxInt(true)
14865 v.AddArg2(x, con)
14866 return true
14867 }
14868 return false
14869 }
14870 func rewriteValuegeneric_OpMemEq(v *Value) bool {
14871 v_3 := v.Args[3]
14872 v_2 := v.Args[2]
14873 v_1 := v.Args[1]
14874 v_0 := v.Args[0]
14875 b := v.Block
14876 config := b.Func.Config
14877 typ := &b.Func.Config.Types
14878
14879
14880 for {
14881 sptr := v_0
14882 tptr := v_1
14883 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 {
14884 break
14885 }
14886 mem := v_3
14887 v.reset(OpEq8)
14888 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
14889 v0.AddArg2(sptr, mem)
14890 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
14891 v1.AddArg2(tptr, mem)
14892 v.AddArg2(v0, v1)
14893 return true
14894 }
14895
14896
14897
14898 for {
14899 sptr := v_0
14900 tptr := v_1
14901 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 {
14902 break
14903 }
14904 mem := v_3
14905 if !(canLoadUnaligned(config)) {
14906 break
14907 }
14908 v.reset(OpEq16)
14909 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
14910 v0.AddArg2(sptr, mem)
14911 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
14912 v1.AddArg2(tptr, mem)
14913 v.AddArg2(v0, v1)
14914 return true
14915 }
14916
14917
14918
14919 for {
14920 sptr := v_0
14921 tptr := v_1
14922 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 {
14923 break
14924 }
14925 mem := v_3
14926 if !(canLoadUnaligned(config)) {
14927 break
14928 }
14929 v.reset(OpEq32)
14930 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
14931 v0.AddArg2(sptr, mem)
14932 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
14933 v1.AddArg2(tptr, mem)
14934 v.AddArg2(v0, v1)
14935 return true
14936 }
14937
14938
14939
14940 for {
14941 sptr := v_0
14942 tptr := v_1
14943 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 {
14944 break
14945 }
14946 mem := v_3
14947 if !(canLoadUnaligned(config) && config.PtrSize == 8) {
14948 break
14949 }
14950 v.reset(OpEq64)
14951 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
14952 v0.AddArg2(sptr, mem)
14953 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
14954 v1.AddArg2(tptr, mem)
14955 v.AddArg2(v0, v1)
14956 return true
14957 }
14958
14959
14960 for {
14961 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 {
14962 break
14963 }
14964 v.reset(OpConstBool)
14965 v.Type = typ.Bool
14966 v.AuxInt = boolToAuxInt(true)
14967 return true
14968 }
14969
14970
14971
14972 for {
14973 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
14974 p := v_0
14975 q := v_1
14976 if !(isSamePtr(p, q)) {
14977 continue
14978 }
14979 v.reset(OpConstBool)
14980 v.Type = typ.Bool
14981 v.AuxInt = boolToAuxInt(true)
14982 return true
14983 }
14984 break
14985 }
14986
14987
14988
14989 for {
14990 p := v_0
14991 q := v_1
14992 if v_2.Op != OpConst64 {
14993 break
14994 }
14995 c := auxIntToInt64(v_2.AuxInt)
14996 mem := v_3
14997 if !((c == 3 || c == 5 || c == 9 || c == 17) && canLoadUnaligned(config) && config.RegSize == 8) {
14998 break
14999 }
15000 v.reset(OpAndB)
15001 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
15002 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
15003 v1.AuxInt = int64ToAuxInt(c - 1)
15004 v0.AddArg4(p, q, v1, mem)
15005 v2 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
15006 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
15007 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
15008 v4.AuxInt = int64ToAuxInt(c - 1)
15009 v4.AddArg(p)
15010 v3.AddArg2(v4, mem)
15011 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
15012 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
15013 v6.AuxInt = int64ToAuxInt(c - 1)
15014 v6.AddArg(q)
15015 v5.AddArg2(v6, mem)
15016 v2.AddArg2(v3, v5)
15017 v.AddArg2(v0, v2)
15018 return true
15019 }
15020
15021
15022
15023 for {
15024 p := v_0
15025 q := v_1
15026 if v_2.Op != OpConst64 {
15027 break
15028 }
15029 c := auxIntToInt64(v_2.AuxInt)
15030 mem := v_3
15031 if !((c == 6 || c == 10 || c == 18) && canLoadUnaligned(config) && config.RegSize == 8) {
15032 break
15033 }
15034 v.reset(OpAndB)
15035 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
15036 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
15037 v1.AuxInt = int64ToAuxInt(c - 2)
15038 v0.AddArg4(p, q, v1, mem)
15039 v2 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
15040 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
15041 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
15042 v4.AuxInt = int64ToAuxInt(c - 2)
15043 v4.AddArg(p)
15044 v3.AddArg2(v4, mem)
15045 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
15046 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
15047 v6.AuxInt = int64ToAuxInt(c - 2)
15048 v6.AddArg(q)
15049 v5.AddArg2(v6, mem)
15050 v2.AddArg2(v3, v5)
15051 v.AddArg2(v0, v2)
15052 return true
15053 }
15054
15055
15056
15057 for {
15058 p := v_0
15059 q := v_1
15060 if v_2.Op != OpConst64 {
15061 break
15062 }
15063 c := auxIntToInt64(v_2.AuxInt)
15064 mem := v_3
15065 if !((c == 7 || c == 11 || c == 19 || c == 20) && canLoadUnaligned(config) && config.RegSize == 8) {
15066 break
15067 }
15068 v.reset(OpAndB)
15069 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
15070 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
15071 v1.AuxInt = int64ToAuxInt(min(c-3, 16))
15072 v0.AddArg4(p, q, v1, mem)
15073 v2 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
15074 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
15075 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
15076 v4.AuxInt = int64ToAuxInt(c - 4)
15077 v4.AddArg(p)
15078 v3.AddArg2(v4, mem)
15079 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
15080 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
15081 v6.AuxInt = int64ToAuxInt(c - 4)
15082 v6.AddArg(q)
15083 v5.AddArg2(v6, mem)
15084 v2.AddArg2(v3, v5)
15085 v.AddArg2(v0, v2)
15086 return true
15087 }
15088
15089
15090
15091 for {
15092 p := v_0
15093 q := v_1
15094 if v_2.Op != OpConst64 {
15095 break
15096 }
15097 c := auxIntToInt64(v_2.AuxInt)
15098 mem := v_3
15099 if !(((c >= 12 && c <= 16) || (c >= 21 && c <= 24)) && canLoadUnaligned(config) && config.RegSize == 8) {
15100 break
15101 }
15102 v.reset(OpAndB)
15103 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
15104 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
15105 v1.AuxInt = int64ToAuxInt(8 + int64(bool2int(c > 16))*8)
15106 v0.AddArg4(p, q, v1, mem)
15107 v2 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
15108 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
15109 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
15110 v4.AuxInt = int64ToAuxInt(c - 8)
15111 v4.AddArg(p)
15112 v3.AddArg2(v4, mem)
15113 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
15114 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
15115 v6.AuxInt = int64ToAuxInt(c - 8)
15116 v6.AddArg(q)
15117 v5.AddArg2(v6, mem)
15118 v2.AddArg2(v3, v5)
15119 v.AddArg2(v0, v2)
15120 return true
15121 }
15122
15123
15124
15125 for {
15126 p := v_0
15127 q := v_1
15128 if v_2.Op != OpConst64 {
15129 break
15130 }
15131 c := auxIntToInt64(v_2.AuxInt)
15132 mem := v_3
15133 if !(c >= 25 && c <= 32 && canLoadUnaligned(config) && config.RegSize == 8) {
15134 break
15135 }
15136 v.reset(OpAndB)
15137 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
15138 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
15139 v1.AuxInt = int64ToAuxInt(16)
15140 v0.AddArg4(p, q, v1, mem)
15141 v2 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
15142 v3 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
15143 v3.AuxInt = int64ToAuxInt(16)
15144 v3.AddArg(p)
15145 v4 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
15146 v4.AuxInt = int64ToAuxInt(16)
15147 v4.AddArg(q)
15148 v5 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
15149 v5.AuxInt = int64ToAuxInt(c - 16)
15150 v2.AddArg4(v3, v4, v5, mem)
15151 v.AddArg2(v0, v2)
15152 return true
15153 }
15154 return false
15155 }
15156 func rewriteValuegeneric_OpMod16(v *Value) bool {
15157 v_1 := v.Args[1]
15158 v_0 := v.Args[0]
15159 b := v.Block
15160
15161
15162
15163 for {
15164 if v_0.Op != OpConst16 {
15165 break
15166 }
15167 c := auxIntToInt16(v_0.AuxInt)
15168 if v_1.Op != OpConst16 {
15169 break
15170 }
15171 d := auxIntToInt16(v_1.AuxInt)
15172 if !(d != 0) {
15173 break
15174 }
15175 v.reset(OpConst16)
15176 v.AuxInt = int16ToAuxInt(c % d)
15177 return true
15178 }
15179
15180
15181
15182 for {
15183 t := v.Type
15184 n := v_0
15185 if v_1.Op != OpConst16 {
15186 break
15187 }
15188 c := auxIntToInt16(v_1.AuxInt)
15189 if !(isNonNegative(n) && isPowerOfTwo(c)) {
15190 break
15191 }
15192 v.reset(OpAnd16)
15193 v0 := b.NewValue0(v.Pos, OpConst16, t)
15194 v0.AuxInt = int16ToAuxInt(c - 1)
15195 v.AddArg2(n, v0)
15196 return true
15197 }
15198
15199
15200
15201 for {
15202 t := v.Type
15203 n := v_0
15204 if v_1.Op != OpConst16 {
15205 break
15206 }
15207 c := auxIntToInt16(v_1.AuxInt)
15208 if !(c < 0 && c != -1<<15) {
15209 break
15210 }
15211 v.reset(OpMod16)
15212 v.Type = t
15213 v0 := b.NewValue0(v.Pos, OpConst16, t)
15214 v0.AuxInt = int16ToAuxInt(-c)
15215 v.AddArg2(n, v0)
15216 return true
15217 }
15218
15219
15220
15221 for {
15222 t := v.Type
15223 x := v_0
15224 if v_1.Op != OpConst16 {
15225 break
15226 }
15227 c := auxIntToInt16(v_1.AuxInt)
15228 if !(x.Op != OpConst16 && (c > 0 || c == -1<<15)) {
15229 break
15230 }
15231 v.reset(OpSub16)
15232 v0 := b.NewValue0(v.Pos, OpMul16, t)
15233 v1 := b.NewValue0(v.Pos, OpDiv16, t)
15234 v2 := b.NewValue0(v.Pos, OpConst16, t)
15235 v2.AuxInt = int16ToAuxInt(c)
15236 v1.AddArg2(x, v2)
15237 v0.AddArg2(v1, v2)
15238 v.AddArg2(x, v0)
15239 return true
15240 }
15241 return false
15242 }
15243 func rewriteValuegeneric_OpMod16u(v *Value) bool {
15244 v_1 := v.Args[1]
15245 v_0 := v.Args[0]
15246 b := v.Block
15247
15248
15249
15250 for {
15251 if v_0.Op != OpConst16 {
15252 break
15253 }
15254 c := auxIntToInt16(v_0.AuxInt)
15255 if v_1.Op != OpConst16 {
15256 break
15257 }
15258 d := auxIntToInt16(v_1.AuxInt)
15259 if !(d != 0) {
15260 break
15261 }
15262 v.reset(OpConst16)
15263 v.AuxInt = int16ToAuxInt(int16(uint16(c) % uint16(d)))
15264 return true
15265 }
15266
15267
15268
15269 for {
15270 t := v.Type
15271 n := v_0
15272 if v_1.Op != OpConst16 {
15273 break
15274 }
15275 c := auxIntToInt16(v_1.AuxInt)
15276 if !(isPowerOfTwo(uint16(c))) {
15277 break
15278 }
15279 v.reset(OpAnd16)
15280 v0 := b.NewValue0(v.Pos, OpConst16, t)
15281 v0.AuxInt = int16ToAuxInt(c - 1)
15282 v.AddArg2(n, v0)
15283 return true
15284 }
15285
15286
15287
15288 for {
15289 t := v.Type
15290 x := v_0
15291 if v_1.Op != OpConst16 {
15292 break
15293 }
15294 c := auxIntToInt16(v_1.AuxInt)
15295 if !(x.Op != OpConst16 && c != 0) {
15296 break
15297 }
15298 v.reset(OpSub16)
15299 v0 := b.NewValue0(v.Pos, OpMul16, t)
15300 v1 := b.NewValue0(v.Pos, OpDiv16u, t)
15301 v2 := b.NewValue0(v.Pos, OpConst16, t)
15302 v2.AuxInt = int16ToAuxInt(c)
15303 v1.AddArg2(x, v2)
15304 v0.AddArg2(v1, v2)
15305 v.AddArg2(x, v0)
15306 return true
15307 }
15308 return false
15309 }
15310 func rewriteValuegeneric_OpMod32(v *Value) bool {
15311 v_1 := v.Args[1]
15312 v_0 := v.Args[0]
15313 b := v.Block
15314
15315
15316
15317 for {
15318 if v_0.Op != OpConst32 {
15319 break
15320 }
15321 c := auxIntToInt32(v_0.AuxInt)
15322 if v_1.Op != OpConst32 {
15323 break
15324 }
15325 d := auxIntToInt32(v_1.AuxInt)
15326 if !(d != 0) {
15327 break
15328 }
15329 v.reset(OpConst32)
15330 v.AuxInt = int32ToAuxInt(c % d)
15331 return true
15332 }
15333
15334
15335
15336 for {
15337 t := v.Type
15338 n := v_0
15339 if v_1.Op != OpConst32 {
15340 break
15341 }
15342 c := auxIntToInt32(v_1.AuxInt)
15343 if !(isNonNegative(n) && isPowerOfTwo(c)) {
15344 break
15345 }
15346 v.reset(OpAnd32)
15347 v0 := b.NewValue0(v.Pos, OpConst32, t)
15348 v0.AuxInt = int32ToAuxInt(c - 1)
15349 v.AddArg2(n, v0)
15350 return true
15351 }
15352
15353
15354
15355 for {
15356 t := v.Type
15357 n := v_0
15358 if v_1.Op != OpConst32 {
15359 break
15360 }
15361 c := auxIntToInt32(v_1.AuxInt)
15362 if !(c < 0 && c != -1<<31) {
15363 break
15364 }
15365 v.reset(OpMod32)
15366 v.Type = t
15367 v0 := b.NewValue0(v.Pos, OpConst32, t)
15368 v0.AuxInt = int32ToAuxInt(-c)
15369 v.AddArg2(n, v0)
15370 return true
15371 }
15372
15373
15374
15375 for {
15376 t := v.Type
15377 x := v_0
15378 if v_1.Op != OpConst32 {
15379 break
15380 }
15381 c := auxIntToInt32(v_1.AuxInt)
15382 if !(x.Op != OpConst32 && (c > 0 || c == -1<<31)) {
15383 break
15384 }
15385 v.reset(OpSub32)
15386 v0 := b.NewValue0(v.Pos, OpMul32, t)
15387 v1 := b.NewValue0(v.Pos, OpDiv32, t)
15388 v2 := b.NewValue0(v.Pos, OpConst32, t)
15389 v2.AuxInt = int32ToAuxInt(c)
15390 v1.AddArg2(x, v2)
15391 v0.AddArg2(v1, v2)
15392 v.AddArg2(x, v0)
15393 return true
15394 }
15395 return false
15396 }
15397 func rewriteValuegeneric_OpMod32u(v *Value) bool {
15398 v_1 := v.Args[1]
15399 v_0 := v.Args[0]
15400 b := v.Block
15401
15402
15403
15404 for {
15405 if v_0.Op != OpConst32 {
15406 break
15407 }
15408 c := auxIntToInt32(v_0.AuxInt)
15409 if v_1.Op != OpConst32 {
15410 break
15411 }
15412 d := auxIntToInt32(v_1.AuxInt)
15413 if !(d != 0) {
15414 break
15415 }
15416 v.reset(OpConst32)
15417 v.AuxInt = int32ToAuxInt(int32(uint32(c) % uint32(d)))
15418 return true
15419 }
15420
15421
15422
15423 for {
15424 t := v.Type
15425 n := v_0
15426 if v_1.Op != OpConst32 {
15427 break
15428 }
15429 c := auxIntToInt32(v_1.AuxInt)
15430 if !(isPowerOfTwo(uint32(c))) {
15431 break
15432 }
15433 v.reset(OpAnd32)
15434 v0 := b.NewValue0(v.Pos, OpConst32, t)
15435 v0.AuxInt = int32ToAuxInt(c - 1)
15436 v.AddArg2(n, v0)
15437 return true
15438 }
15439
15440
15441
15442 for {
15443 t := v.Type
15444 x := v_0
15445 if v_1.Op != OpConst32 {
15446 break
15447 }
15448 c := auxIntToInt32(v_1.AuxInt)
15449 if !(x.Op != OpConst32 && c != 0) {
15450 break
15451 }
15452 v.reset(OpSub32)
15453 v0 := b.NewValue0(v.Pos, OpMul32, t)
15454 v1 := b.NewValue0(v.Pos, OpDiv32u, t)
15455 v2 := b.NewValue0(v.Pos, OpConst32, t)
15456 v2.AuxInt = int32ToAuxInt(c)
15457 v1.AddArg2(x, v2)
15458 v0.AddArg2(v1, v2)
15459 v.AddArg2(x, v0)
15460 return true
15461 }
15462 return false
15463 }
15464 func rewriteValuegeneric_OpMod64(v *Value) bool {
15465 v_1 := v.Args[1]
15466 v_0 := v.Args[0]
15467 b := v.Block
15468
15469
15470
15471 for {
15472 if v_0.Op != OpConst64 {
15473 break
15474 }
15475 c := auxIntToInt64(v_0.AuxInt)
15476 if v_1.Op != OpConst64 {
15477 break
15478 }
15479 d := auxIntToInt64(v_1.AuxInt)
15480 if !(d != 0) {
15481 break
15482 }
15483 v.reset(OpConst64)
15484 v.AuxInt = int64ToAuxInt(c % d)
15485 return true
15486 }
15487
15488
15489
15490 for {
15491 t := v.Type
15492 n := v_0
15493 if v_1.Op != OpConst64 {
15494 break
15495 }
15496 c := auxIntToInt64(v_1.AuxInt)
15497 if !(isNonNegative(n) && isPowerOfTwo(c)) {
15498 break
15499 }
15500 v.reset(OpAnd64)
15501 v0 := b.NewValue0(v.Pos, OpConst64, t)
15502 v0.AuxInt = int64ToAuxInt(c - 1)
15503 v.AddArg2(n, v0)
15504 return true
15505 }
15506
15507
15508
15509 for {
15510 n := v_0
15511 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 || !(isNonNegative(n)) {
15512 break
15513 }
15514 v.copyOf(n)
15515 return true
15516 }
15517
15518
15519
15520 for {
15521 t := v.Type
15522 n := v_0
15523 if v_1.Op != OpConst64 {
15524 break
15525 }
15526 c := auxIntToInt64(v_1.AuxInt)
15527 if !(c < 0 && c != -1<<63) {
15528 break
15529 }
15530 v.reset(OpMod64)
15531 v.Type = t
15532 v0 := b.NewValue0(v.Pos, OpConst64, t)
15533 v0.AuxInt = int64ToAuxInt(-c)
15534 v.AddArg2(n, v0)
15535 return true
15536 }
15537
15538
15539
15540 for {
15541 t := v.Type
15542 x := v_0
15543 if v_1.Op != OpConst64 {
15544 break
15545 }
15546 c := auxIntToInt64(v_1.AuxInt)
15547 if !(x.Op != OpConst64 && (c > 0 || c == -1<<63)) {
15548 break
15549 }
15550 v.reset(OpSub64)
15551 v0 := b.NewValue0(v.Pos, OpMul64, t)
15552 v1 := b.NewValue0(v.Pos, OpDiv64, t)
15553 v2 := b.NewValue0(v.Pos, OpConst64, t)
15554 v2.AuxInt = int64ToAuxInt(c)
15555 v1.AddArg2(x, v2)
15556 v0.AddArg2(v1, v2)
15557 v.AddArg2(x, v0)
15558 return true
15559 }
15560 return false
15561 }
15562 func rewriteValuegeneric_OpMod64u(v *Value) bool {
15563 v_1 := v.Args[1]
15564 v_0 := v.Args[0]
15565 b := v.Block
15566
15567
15568
15569 for {
15570 if v_0.Op != OpConst64 {
15571 break
15572 }
15573 c := auxIntToInt64(v_0.AuxInt)
15574 if v_1.Op != OpConst64 {
15575 break
15576 }
15577 d := auxIntToInt64(v_1.AuxInt)
15578 if !(d != 0) {
15579 break
15580 }
15581 v.reset(OpConst64)
15582 v.AuxInt = int64ToAuxInt(int64(uint64(c) % uint64(d)))
15583 return true
15584 }
15585
15586
15587
15588 for {
15589 t := v.Type
15590 n := v_0
15591 if v_1.Op != OpConst64 {
15592 break
15593 }
15594 c := auxIntToInt64(v_1.AuxInt)
15595 if !(isPowerOfTwo(uint64(c))) {
15596 break
15597 }
15598 v.reset(OpAnd64)
15599 v0 := b.NewValue0(v.Pos, OpConst64, t)
15600 v0.AuxInt = int64ToAuxInt(c - 1)
15601 v.AddArg2(n, v0)
15602 return true
15603 }
15604
15605
15606
15607 for {
15608 t := v.Type
15609 x := v_0
15610 if v_1.Op != OpConst64 {
15611 break
15612 }
15613 c := auxIntToInt64(v_1.AuxInt)
15614 if !(x.Op != OpConst64 && c != 0) {
15615 break
15616 }
15617 v.reset(OpSub64)
15618 v0 := b.NewValue0(v.Pos, OpMul64, t)
15619 v1 := b.NewValue0(v.Pos, OpDiv64u, t)
15620 v2 := b.NewValue0(v.Pos, OpConst64, t)
15621 v2.AuxInt = int64ToAuxInt(c)
15622 v1.AddArg2(x, v2)
15623 v0.AddArg2(v1, v2)
15624 v.AddArg2(x, v0)
15625 return true
15626 }
15627 return false
15628 }
15629 func rewriteValuegeneric_OpMod8(v *Value) bool {
15630 v_1 := v.Args[1]
15631 v_0 := v.Args[0]
15632 b := v.Block
15633
15634
15635
15636 for {
15637 if v_0.Op != OpConst8 {
15638 break
15639 }
15640 c := auxIntToInt8(v_0.AuxInt)
15641 if v_1.Op != OpConst8 {
15642 break
15643 }
15644 d := auxIntToInt8(v_1.AuxInt)
15645 if !(d != 0) {
15646 break
15647 }
15648 v.reset(OpConst8)
15649 v.AuxInt = int8ToAuxInt(c % d)
15650 return true
15651 }
15652
15653
15654
15655 for {
15656 t := v.Type
15657 n := v_0
15658 if v_1.Op != OpConst8 {
15659 break
15660 }
15661 c := auxIntToInt8(v_1.AuxInt)
15662 if !(isNonNegative(n) && isPowerOfTwo(c)) {
15663 break
15664 }
15665 v.reset(OpAnd8)
15666 v0 := b.NewValue0(v.Pos, OpConst8, t)
15667 v0.AuxInt = int8ToAuxInt(c - 1)
15668 v.AddArg2(n, v0)
15669 return true
15670 }
15671
15672
15673
15674 for {
15675 t := v.Type
15676 n := v_0
15677 if v_1.Op != OpConst8 {
15678 break
15679 }
15680 c := auxIntToInt8(v_1.AuxInt)
15681 if !(c < 0 && c != -1<<7) {
15682 break
15683 }
15684 v.reset(OpMod8)
15685 v.Type = t
15686 v0 := b.NewValue0(v.Pos, OpConst8, t)
15687 v0.AuxInt = int8ToAuxInt(-c)
15688 v.AddArg2(n, v0)
15689 return true
15690 }
15691
15692
15693
15694 for {
15695 t := v.Type
15696 x := v_0
15697 if v_1.Op != OpConst8 {
15698 break
15699 }
15700 c := auxIntToInt8(v_1.AuxInt)
15701 if !(x.Op != OpConst8 && (c > 0 || c == -1<<7)) {
15702 break
15703 }
15704 v.reset(OpSub8)
15705 v0 := b.NewValue0(v.Pos, OpMul8, t)
15706 v1 := b.NewValue0(v.Pos, OpDiv8, t)
15707 v2 := b.NewValue0(v.Pos, OpConst8, t)
15708 v2.AuxInt = int8ToAuxInt(c)
15709 v1.AddArg2(x, v2)
15710 v0.AddArg2(v1, v2)
15711 v.AddArg2(x, v0)
15712 return true
15713 }
15714 return false
15715 }
15716 func rewriteValuegeneric_OpMod8u(v *Value) bool {
15717 v_1 := v.Args[1]
15718 v_0 := v.Args[0]
15719 b := v.Block
15720
15721
15722
15723 for {
15724 if v_0.Op != OpConst8 {
15725 break
15726 }
15727 c := auxIntToInt8(v_0.AuxInt)
15728 if v_1.Op != OpConst8 {
15729 break
15730 }
15731 d := auxIntToInt8(v_1.AuxInt)
15732 if !(d != 0) {
15733 break
15734 }
15735 v.reset(OpConst8)
15736 v.AuxInt = int8ToAuxInt(int8(uint8(c) % uint8(d)))
15737 return true
15738 }
15739
15740
15741
15742 for {
15743 t := v.Type
15744 n := v_0
15745 if v_1.Op != OpConst8 {
15746 break
15747 }
15748 c := auxIntToInt8(v_1.AuxInt)
15749 if !(isPowerOfTwo(uint8(c))) {
15750 break
15751 }
15752 v.reset(OpAnd8)
15753 v0 := b.NewValue0(v.Pos, OpConst8, t)
15754 v0.AuxInt = int8ToAuxInt(c - 1)
15755 v.AddArg2(n, v0)
15756 return true
15757 }
15758
15759
15760
15761 for {
15762 t := v.Type
15763 x := v_0
15764 if v_1.Op != OpConst8 {
15765 break
15766 }
15767 c := auxIntToInt8(v_1.AuxInt)
15768 if !(x.Op != OpConst8 && c != 0) {
15769 break
15770 }
15771 v.reset(OpSub8)
15772 v0 := b.NewValue0(v.Pos, OpMul8, t)
15773 v1 := b.NewValue0(v.Pos, OpDiv8u, t)
15774 v2 := b.NewValue0(v.Pos, OpConst8, t)
15775 v2.AuxInt = int8ToAuxInt(c)
15776 v1.AddArg2(x, v2)
15777 v0.AddArg2(v1, v2)
15778 v.AddArg2(x, v0)
15779 return true
15780 }
15781 return false
15782 }
15783 func rewriteValuegeneric_OpMove(v *Value) bool {
15784 v_2 := v.Args[2]
15785 v_1 := v.Args[1]
15786 v_0 := v.Args[0]
15787 b := v.Block
15788 config := b.Func.Config
15789
15790
15791
15792 for {
15793 n := auxIntToInt64(v.AuxInt)
15794 t := auxToType(v.Aux)
15795 dst1 := v_0
15796 src := v_1
15797 mem := v_2
15798 if mem.Op != OpZero || auxIntToInt64(mem.AuxInt) != n || auxToType(mem.Aux) != t {
15799 break
15800 }
15801 dst2 := mem.Args[0]
15802 if !(isSamePtr(src, dst2)) {
15803 break
15804 }
15805 v.reset(OpZero)
15806 v.AuxInt = int64ToAuxInt(n)
15807 v.Aux = typeToAux(t)
15808 v.AddArg2(dst1, mem)
15809 return true
15810 }
15811
15812
15813
15814 for {
15815 n := auxIntToInt64(v.AuxInt)
15816 t := auxToType(v.Aux)
15817 dst1 := v_0
15818 src := v_1
15819 mem := v_2
15820 if mem.Op != OpVarDef {
15821 break
15822 }
15823 mem_0 := mem.Args[0]
15824 if mem_0.Op != OpZero || auxIntToInt64(mem_0.AuxInt) != n || auxToType(mem_0.Aux) != t {
15825 break
15826 }
15827 dst0 := mem_0.Args[0]
15828 if !(isSamePtr(src, dst0)) {
15829 break
15830 }
15831 v.reset(OpZero)
15832 v.AuxInt = int64ToAuxInt(n)
15833 v.Aux = typeToAux(t)
15834 v.AddArg2(dst1, mem)
15835 return true
15836 }
15837
15838
15839
15840 for {
15841 n := auxIntToInt64(v.AuxInt)
15842 t := auxToType(v.Aux)
15843 dst := v_0
15844 if v_1.Op != OpAddr {
15845 break
15846 }
15847 sym := auxToSym(v_1.Aux)
15848 v_1_0 := v_1.Args[0]
15849 if v_1_0.Op != OpSB {
15850 break
15851 }
15852 mem := v_2
15853 if !(symIsROZero(sym)) {
15854 break
15855 }
15856 v.reset(OpZero)
15857 v.AuxInt = int64ToAuxInt(n)
15858 v.Aux = typeToAux(t)
15859 v.AddArg2(dst, mem)
15860 return true
15861 }
15862
15863
15864
15865 for {
15866 n := auxIntToInt64(v.AuxInt)
15867 t1 := auxToType(v.Aux)
15868 dst1 := v_0
15869 src1 := v_1
15870 store := v_2
15871 if store.Op != OpStore {
15872 break
15873 }
15874 t2 := auxToType(store.Aux)
15875 mem := store.Args[2]
15876 op := store.Args[0]
15877 if op.Op != OpOffPtr {
15878 break
15879 }
15880 o2 := auxIntToInt64(op.AuxInt)
15881 dst2 := op.Args[0]
15882 if !(isSamePtr(dst1, dst2) && store.Uses == 1 && n >= o2+t2.Size() && disjoint(src1, n, op, t2.Size()) && clobber(store)) {
15883 break
15884 }
15885 v.reset(OpMove)
15886 v.AuxInt = int64ToAuxInt(n)
15887 v.Aux = typeToAux(t1)
15888 v.AddArg3(dst1, src1, mem)
15889 return true
15890 }
15891
15892
15893
15894 for {
15895 n := auxIntToInt64(v.AuxInt)
15896 t := auxToType(v.Aux)
15897 dst1 := v_0
15898 src1 := v_1
15899 move := v_2
15900 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
15901 break
15902 }
15903 mem := move.Args[2]
15904 dst2 := move.Args[0]
15905 if !(move.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move)) {
15906 break
15907 }
15908 v.reset(OpMove)
15909 v.AuxInt = int64ToAuxInt(n)
15910 v.Aux = typeToAux(t)
15911 v.AddArg3(dst1, src1, mem)
15912 return true
15913 }
15914
15915
15916
15917 for {
15918 n := auxIntToInt64(v.AuxInt)
15919 t := auxToType(v.Aux)
15920 dst1 := v_0
15921 src1 := v_1
15922 vardef := v_2
15923 if vardef.Op != OpVarDef {
15924 break
15925 }
15926 x := auxToSym(vardef.Aux)
15927 move := vardef.Args[0]
15928 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
15929 break
15930 }
15931 mem := move.Args[2]
15932 dst2 := move.Args[0]
15933 if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move, vardef)) {
15934 break
15935 }
15936 v.reset(OpMove)
15937 v.AuxInt = int64ToAuxInt(n)
15938 v.Aux = typeToAux(t)
15939 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
15940 v0.Aux = symToAux(x)
15941 v0.AddArg(mem)
15942 v.AddArg3(dst1, src1, v0)
15943 return true
15944 }
15945
15946
15947
15948 for {
15949 n := auxIntToInt64(v.AuxInt)
15950 t := auxToType(v.Aux)
15951 dst1 := v_0
15952 src1 := v_1
15953 zero := v_2
15954 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != n || auxToType(zero.Aux) != t {
15955 break
15956 }
15957 mem := zero.Args[1]
15958 dst2 := zero.Args[0]
15959 if !(zero.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero)) {
15960 break
15961 }
15962 v.reset(OpMove)
15963 v.AuxInt = int64ToAuxInt(n)
15964 v.Aux = typeToAux(t)
15965 v.AddArg3(dst1, src1, mem)
15966 return true
15967 }
15968
15969
15970
15971 for {
15972 n := auxIntToInt64(v.AuxInt)
15973 t := auxToType(v.Aux)
15974 dst1 := v_0
15975 src1 := v_1
15976 vardef := v_2
15977 if vardef.Op != OpVarDef {
15978 break
15979 }
15980 x := auxToSym(vardef.Aux)
15981 zero := vardef.Args[0]
15982 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != n || auxToType(zero.Aux) != t {
15983 break
15984 }
15985 mem := zero.Args[1]
15986 dst2 := zero.Args[0]
15987 if !(zero.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero, vardef)) {
15988 break
15989 }
15990 v.reset(OpMove)
15991 v.AuxInt = int64ToAuxInt(n)
15992 v.Aux = typeToAux(t)
15993 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
15994 v0.Aux = symToAux(x)
15995 v0.AddArg(mem)
15996 v.AddArg3(dst1, src1, v0)
15997 return true
15998 }
15999
16000
16001
16002 for {
16003 n := auxIntToInt64(v.AuxInt)
16004 t1 := auxToType(v.Aux)
16005 dst := v_0
16006 p1 := v_1
16007 mem := v_2
16008 if mem.Op != OpStore {
16009 break
16010 }
16011 t2 := auxToType(mem.Aux)
16012 _ = mem.Args[2]
16013 op2 := mem.Args[0]
16014 if op2.Op != OpOffPtr {
16015 break
16016 }
16017 tt2 := op2.Type
16018 o2 := auxIntToInt64(op2.AuxInt)
16019 p2 := op2.Args[0]
16020 d1 := mem.Args[1]
16021 mem_2 := mem.Args[2]
16022 if mem_2.Op != OpStore {
16023 break
16024 }
16025 t3 := auxToType(mem_2.Aux)
16026 d2 := mem_2.Args[1]
16027 op3 := mem_2.Args[0]
16028 if op3.Op != OpOffPtr {
16029 break
16030 }
16031 tt3 := op3.Type
16032 if auxIntToInt64(op3.AuxInt) != 0 {
16033 break
16034 }
16035 p3 := op3.Args[0]
16036 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()) {
16037 break
16038 }
16039 v.reset(OpStore)
16040 v.Aux = typeToAux(t2)
16041 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16042 v0.AuxInt = int64ToAuxInt(o2)
16043 v0.AddArg(dst)
16044 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16045 v1.Aux = typeToAux(t3)
16046 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16047 v2.AuxInt = int64ToAuxInt(0)
16048 v2.AddArg(dst)
16049 v1.AddArg3(v2, d2, mem)
16050 v.AddArg3(v0, d1, v1)
16051 return true
16052 }
16053
16054
16055
16056 for {
16057 n := auxIntToInt64(v.AuxInt)
16058 t1 := auxToType(v.Aux)
16059 dst := v_0
16060 p1 := v_1
16061 mem := v_2
16062 if mem.Op != OpStore {
16063 break
16064 }
16065 t2 := auxToType(mem.Aux)
16066 _ = mem.Args[2]
16067 op2 := mem.Args[0]
16068 if op2.Op != OpOffPtr {
16069 break
16070 }
16071 tt2 := op2.Type
16072 o2 := auxIntToInt64(op2.AuxInt)
16073 p2 := op2.Args[0]
16074 d1 := mem.Args[1]
16075 mem_2 := mem.Args[2]
16076 if mem_2.Op != OpStore {
16077 break
16078 }
16079 t3 := auxToType(mem_2.Aux)
16080 _ = mem_2.Args[2]
16081 op3 := mem_2.Args[0]
16082 if op3.Op != OpOffPtr {
16083 break
16084 }
16085 tt3 := op3.Type
16086 o3 := auxIntToInt64(op3.AuxInt)
16087 p3 := op3.Args[0]
16088 d2 := mem_2.Args[1]
16089 mem_2_2 := mem_2.Args[2]
16090 if mem_2_2.Op != OpStore {
16091 break
16092 }
16093 t4 := auxToType(mem_2_2.Aux)
16094 d3 := mem_2_2.Args[1]
16095 op4 := mem_2_2.Args[0]
16096 if op4.Op != OpOffPtr {
16097 break
16098 }
16099 tt4 := op4.Type
16100 if auxIntToInt64(op4.AuxInt) != 0 {
16101 break
16102 }
16103 p4 := op4.Args[0]
16104 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()) {
16105 break
16106 }
16107 v.reset(OpStore)
16108 v.Aux = typeToAux(t2)
16109 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16110 v0.AuxInt = int64ToAuxInt(o2)
16111 v0.AddArg(dst)
16112 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16113 v1.Aux = typeToAux(t3)
16114 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16115 v2.AuxInt = int64ToAuxInt(o3)
16116 v2.AddArg(dst)
16117 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16118 v3.Aux = typeToAux(t4)
16119 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16120 v4.AuxInt = int64ToAuxInt(0)
16121 v4.AddArg(dst)
16122 v3.AddArg3(v4, d3, mem)
16123 v1.AddArg3(v2, d2, v3)
16124 v.AddArg3(v0, d1, v1)
16125 return true
16126 }
16127
16128
16129
16130 for {
16131 n := auxIntToInt64(v.AuxInt)
16132 t1 := auxToType(v.Aux)
16133 dst := v_0
16134 p1 := v_1
16135 mem := v_2
16136 if mem.Op != OpStore {
16137 break
16138 }
16139 t2 := auxToType(mem.Aux)
16140 _ = mem.Args[2]
16141 op2 := mem.Args[0]
16142 if op2.Op != OpOffPtr {
16143 break
16144 }
16145 tt2 := op2.Type
16146 o2 := auxIntToInt64(op2.AuxInt)
16147 p2 := op2.Args[0]
16148 d1 := mem.Args[1]
16149 mem_2 := mem.Args[2]
16150 if mem_2.Op != OpStore {
16151 break
16152 }
16153 t3 := auxToType(mem_2.Aux)
16154 _ = mem_2.Args[2]
16155 op3 := mem_2.Args[0]
16156 if op3.Op != OpOffPtr {
16157 break
16158 }
16159 tt3 := op3.Type
16160 o3 := auxIntToInt64(op3.AuxInt)
16161 p3 := op3.Args[0]
16162 d2 := mem_2.Args[1]
16163 mem_2_2 := mem_2.Args[2]
16164 if mem_2_2.Op != OpStore {
16165 break
16166 }
16167 t4 := auxToType(mem_2_2.Aux)
16168 _ = mem_2_2.Args[2]
16169 op4 := mem_2_2.Args[0]
16170 if op4.Op != OpOffPtr {
16171 break
16172 }
16173 tt4 := op4.Type
16174 o4 := auxIntToInt64(op4.AuxInt)
16175 p4 := op4.Args[0]
16176 d3 := mem_2_2.Args[1]
16177 mem_2_2_2 := mem_2_2.Args[2]
16178 if mem_2_2_2.Op != OpStore {
16179 break
16180 }
16181 t5 := auxToType(mem_2_2_2.Aux)
16182 d4 := mem_2_2_2.Args[1]
16183 op5 := mem_2_2_2.Args[0]
16184 if op5.Op != OpOffPtr {
16185 break
16186 }
16187 tt5 := op5.Type
16188 if auxIntToInt64(op5.AuxInt) != 0 {
16189 break
16190 }
16191 p5 := op5.Args[0]
16192 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()) {
16193 break
16194 }
16195 v.reset(OpStore)
16196 v.Aux = typeToAux(t2)
16197 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16198 v0.AuxInt = int64ToAuxInt(o2)
16199 v0.AddArg(dst)
16200 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16201 v1.Aux = typeToAux(t3)
16202 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16203 v2.AuxInt = int64ToAuxInt(o3)
16204 v2.AddArg(dst)
16205 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16206 v3.Aux = typeToAux(t4)
16207 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16208 v4.AuxInt = int64ToAuxInt(o4)
16209 v4.AddArg(dst)
16210 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16211 v5.Aux = typeToAux(t5)
16212 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
16213 v6.AuxInt = int64ToAuxInt(0)
16214 v6.AddArg(dst)
16215 v5.AddArg3(v6, d4, mem)
16216 v3.AddArg3(v4, d3, v5)
16217 v1.AddArg3(v2, d2, v3)
16218 v.AddArg3(v0, d1, v1)
16219 return true
16220 }
16221
16222
16223
16224 for {
16225 n := auxIntToInt64(v.AuxInt)
16226 t1 := auxToType(v.Aux)
16227 dst := v_0
16228 p1 := v_1
16229 mem := v_2
16230 if mem.Op != OpVarDef {
16231 break
16232 }
16233 mem_0 := mem.Args[0]
16234 if mem_0.Op != OpStore {
16235 break
16236 }
16237 t2 := auxToType(mem_0.Aux)
16238 _ = mem_0.Args[2]
16239 op2 := mem_0.Args[0]
16240 if op2.Op != OpOffPtr {
16241 break
16242 }
16243 tt2 := op2.Type
16244 o2 := auxIntToInt64(op2.AuxInt)
16245 p2 := op2.Args[0]
16246 d1 := mem_0.Args[1]
16247 mem_0_2 := mem_0.Args[2]
16248 if mem_0_2.Op != OpStore {
16249 break
16250 }
16251 t3 := auxToType(mem_0_2.Aux)
16252 d2 := mem_0_2.Args[1]
16253 op3 := mem_0_2.Args[0]
16254 if op3.Op != OpOffPtr {
16255 break
16256 }
16257 tt3 := op3.Type
16258 if auxIntToInt64(op3.AuxInt) != 0 {
16259 break
16260 }
16261 p3 := op3.Args[0]
16262 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()) {
16263 break
16264 }
16265 v.reset(OpStore)
16266 v.Aux = typeToAux(t2)
16267 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16268 v0.AuxInt = int64ToAuxInt(o2)
16269 v0.AddArg(dst)
16270 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16271 v1.Aux = typeToAux(t3)
16272 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16273 v2.AuxInt = int64ToAuxInt(0)
16274 v2.AddArg(dst)
16275 v1.AddArg3(v2, d2, mem)
16276 v.AddArg3(v0, d1, v1)
16277 return true
16278 }
16279
16280
16281
16282 for {
16283 n := auxIntToInt64(v.AuxInt)
16284 t1 := auxToType(v.Aux)
16285 dst := v_0
16286 p1 := v_1
16287 mem := v_2
16288 if mem.Op != OpVarDef {
16289 break
16290 }
16291 mem_0 := mem.Args[0]
16292 if mem_0.Op != OpStore {
16293 break
16294 }
16295 t2 := auxToType(mem_0.Aux)
16296 _ = mem_0.Args[2]
16297 op2 := mem_0.Args[0]
16298 if op2.Op != OpOffPtr {
16299 break
16300 }
16301 tt2 := op2.Type
16302 o2 := auxIntToInt64(op2.AuxInt)
16303 p2 := op2.Args[0]
16304 d1 := mem_0.Args[1]
16305 mem_0_2 := mem_0.Args[2]
16306 if mem_0_2.Op != OpStore {
16307 break
16308 }
16309 t3 := auxToType(mem_0_2.Aux)
16310 _ = mem_0_2.Args[2]
16311 op3 := mem_0_2.Args[0]
16312 if op3.Op != OpOffPtr {
16313 break
16314 }
16315 tt3 := op3.Type
16316 o3 := auxIntToInt64(op3.AuxInt)
16317 p3 := op3.Args[0]
16318 d2 := mem_0_2.Args[1]
16319 mem_0_2_2 := mem_0_2.Args[2]
16320 if mem_0_2_2.Op != OpStore {
16321 break
16322 }
16323 t4 := auxToType(mem_0_2_2.Aux)
16324 d3 := mem_0_2_2.Args[1]
16325 op4 := mem_0_2_2.Args[0]
16326 if op4.Op != OpOffPtr {
16327 break
16328 }
16329 tt4 := op4.Type
16330 if auxIntToInt64(op4.AuxInt) != 0 {
16331 break
16332 }
16333 p4 := op4.Args[0]
16334 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()) {
16335 break
16336 }
16337 v.reset(OpStore)
16338 v.Aux = typeToAux(t2)
16339 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16340 v0.AuxInt = int64ToAuxInt(o2)
16341 v0.AddArg(dst)
16342 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16343 v1.Aux = typeToAux(t3)
16344 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16345 v2.AuxInt = int64ToAuxInt(o3)
16346 v2.AddArg(dst)
16347 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16348 v3.Aux = typeToAux(t4)
16349 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16350 v4.AuxInt = int64ToAuxInt(0)
16351 v4.AddArg(dst)
16352 v3.AddArg3(v4, d3, mem)
16353 v1.AddArg3(v2, d2, v3)
16354 v.AddArg3(v0, d1, v1)
16355 return true
16356 }
16357
16358
16359
16360 for {
16361 n := auxIntToInt64(v.AuxInt)
16362 t1 := auxToType(v.Aux)
16363 dst := v_0
16364 p1 := v_1
16365 mem := v_2
16366 if mem.Op != OpVarDef {
16367 break
16368 }
16369 mem_0 := mem.Args[0]
16370 if mem_0.Op != OpStore {
16371 break
16372 }
16373 t2 := auxToType(mem_0.Aux)
16374 _ = mem_0.Args[2]
16375 op2 := mem_0.Args[0]
16376 if op2.Op != OpOffPtr {
16377 break
16378 }
16379 tt2 := op2.Type
16380 o2 := auxIntToInt64(op2.AuxInt)
16381 p2 := op2.Args[0]
16382 d1 := mem_0.Args[1]
16383 mem_0_2 := mem_0.Args[2]
16384 if mem_0_2.Op != OpStore {
16385 break
16386 }
16387 t3 := auxToType(mem_0_2.Aux)
16388 _ = mem_0_2.Args[2]
16389 op3 := mem_0_2.Args[0]
16390 if op3.Op != OpOffPtr {
16391 break
16392 }
16393 tt3 := op3.Type
16394 o3 := auxIntToInt64(op3.AuxInt)
16395 p3 := op3.Args[0]
16396 d2 := mem_0_2.Args[1]
16397 mem_0_2_2 := mem_0_2.Args[2]
16398 if mem_0_2_2.Op != OpStore {
16399 break
16400 }
16401 t4 := auxToType(mem_0_2_2.Aux)
16402 _ = mem_0_2_2.Args[2]
16403 op4 := mem_0_2_2.Args[0]
16404 if op4.Op != OpOffPtr {
16405 break
16406 }
16407 tt4 := op4.Type
16408 o4 := auxIntToInt64(op4.AuxInt)
16409 p4 := op4.Args[0]
16410 d3 := mem_0_2_2.Args[1]
16411 mem_0_2_2_2 := mem_0_2_2.Args[2]
16412 if mem_0_2_2_2.Op != OpStore {
16413 break
16414 }
16415 t5 := auxToType(mem_0_2_2_2.Aux)
16416 d4 := mem_0_2_2_2.Args[1]
16417 op5 := mem_0_2_2_2.Args[0]
16418 if op5.Op != OpOffPtr {
16419 break
16420 }
16421 tt5 := op5.Type
16422 if auxIntToInt64(op5.AuxInt) != 0 {
16423 break
16424 }
16425 p5 := op5.Args[0]
16426 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()) {
16427 break
16428 }
16429 v.reset(OpStore)
16430 v.Aux = typeToAux(t2)
16431 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16432 v0.AuxInt = int64ToAuxInt(o2)
16433 v0.AddArg(dst)
16434 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16435 v1.Aux = typeToAux(t3)
16436 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16437 v2.AuxInt = int64ToAuxInt(o3)
16438 v2.AddArg(dst)
16439 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16440 v3.Aux = typeToAux(t4)
16441 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16442 v4.AuxInt = int64ToAuxInt(o4)
16443 v4.AddArg(dst)
16444 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16445 v5.Aux = typeToAux(t5)
16446 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
16447 v6.AuxInt = int64ToAuxInt(0)
16448 v6.AddArg(dst)
16449 v5.AddArg3(v6, d4, mem)
16450 v3.AddArg3(v4, d3, v5)
16451 v1.AddArg3(v2, d2, v3)
16452 v.AddArg3(v0, d1, v1)
16453 return true
16454 }
16455
16456
16457
16458 for {
16459 n := auxIntToInt64(v.AuxInt)
16460 t1 := auxToType(v.Aux)
16461 dst := v_0
16462 p1 := v_1
16463 mem := v_2
16464 if mem.Op != OpStore {
16465 break
16466 }
16467 t2 := auxToType(mem.Aux)
16468 _ = mem.Args[2]
16469 op2 := mem.Args[0]
16470 if op2.Op != OpOffPtr {
16471 break
16472 }
16473 tt2 := op2.Type
16474 o2 := auxIntToInt64(op2.AuxInt)
16475 p2 := op2.Args[0]
16476 d1 := mem.Args[1]
16477 mem_2 := mem.Args[2]
16478 if mem_2.Op != OpZero || auxIntToInt64(mem_2.AuxInt) != n {
16479 break
16480 }
16481 t3 := auxToType(mem_2.Aux)
16482 p3 := mem_2.Args[0]
16483 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && registerizable(b, t2) && n >= o2+t2.Size()) {
16484 break
16485 }
16486 v.reset(OpStore)
16487 v.Aux = typeToAux(t2)
16488 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16489 v0.AuxInt = int64ToAuxInt(o2)
16490 v0.AddArg(dst)
16491 v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16492 v1.AuxInt = int64ToAuxInt(n)
16493 v1.Aux = typeToAux(t1)
16494 v1.AddArg2(dst, mem)
16495 v.AddArg3(v0, d1, v1)
16496 return true
16497 }
16498
16499
16500
16501 for {
16502 n := auxIntToInt64(v.AuxInt)
16503 t1 := auxToType(v.Aux)
16504 dst := v_0
16505 p1 := v_1
16506 mem := v_2
16507 if mem.Op != OpStore {
16508 break
16509 }
16510 t2 := auxToType(mem.Aux)
16511 _ = mem.Args[2]
16512 mem_0 := mem.Args[0]
16513 if mem_0.Op != OpOffPtr {
16514 break
16515 }
16516 tt2 := mem_0.Type
16517 o2 := auxIntToInt64(mem_0.AuxInt)
16518 p2 := mem_0.Args[0]
16519 d1 := mem.Args[1]
16520 mem_2 := mem.Args[2]
16521 if mem_2.Op != OpStore {
16522 break
16523 }
16524 t3 := auxToType(mem_2.Aux)
16525 _ = mem_2.Args[2]
16526 mem_2_0 := mem_2.Args[0]
16527 if mem_2_0.Op != OpOffPtr {
16528 break
16529 }
16530 tt3 := mem_2_0.Type
16531 o3 := auxIntToInt64(mem_2_0.AuxInt)
16532 p3 := mem_2_0.Args[0]
16533 d2 := mem_2.Args[1]
16534 mem_2_2 := mem_2.Args[2]
16535 if mem_2_2.Op != OpZero || auxIntToInt64(mem_2_2.AuxInt) != n {
16536 break
16537 }
16538 t4 := auxToType(mem_2_2.Aux)
16539 p4 := mem_2_2.Args[0]
16540 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()) {
16541 break
16542 }
16543 v.reset(OpStore)
16544 v.Aux = typeToAux(t2)
16545 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16546 v0.AuxInt = int64ToAuxInt(o2)
16547 v0.AddArg(dst)
16548 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16549 v1.Aux = typeToAux(t3)
16550 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16551 v2.AuxInt = int64ToAuxInt(o3)
16552 v2.AddArg(dst)
16553 v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16554 v3.AuxInt = int64ToAuxInt(n)
16555 v3.Aux = typeToAux(t1)
16556 v3.AddArg2(dst, mem)
16557 v1.AddArg3(v2, d2, v3)
16558 v.AddArg3(v0, d1, v1)
16559 return true
16560 }
16561
16562
16563
16564 for {
16565 n := auxIntToInt64(v.AuxInt)
16566 t1 := auxToType(v.Aux)
16567 dst := v_0
16568 p1 := v_1
16569 mem := v_2
16570 if mem.Op != OpStore {
16571 break
16572 }
16573 t2 := auxToType(mem.Aux)
16574 _ = mem.Args[2]
16575 mem_0 := mem.Args[0]
16576 if mem_0.Op != OpOffPtr {
16577 break
16578 }
16579 tt2 := mem_0.Type
16580 o2 := auxIntToInt64(mem_0.AuxInt)
16581 p2 := mem_0.Args[0]
16582 d1 := mem.Args[1]
16583 mem_2 := mem.Args[2]
16584 if mem_2.Op != OpStore {
16585 break
16586 }
16587 t3 := auxToType(mem_2.Aux)
16588 _ = mem_2.Args[2]
16589 mem_2_0 := mem_2.Args[0]
16590 if mem_2_0.Op != OpOffPtr {
16591 break
16592 }
16593 tt3 := mem_2_0.Type
16594 o3 := auxIntToInt64(mem_2_0.AuxInt)
16595 p3 := mem_2_0.Args[0]
16596 d2 := mem_2.Args[1]
16597 mem_2_2 := mem_2.Args[2]
16598 if mem_2_2.Op != OpStore {
16599 break
16600 }
16601 t4 := auxToType(mem_2_2.Aux)
16602 _ = mem_2_2.Args[2]
16603 mem_2_2_0 := mem_2_2.Args[0]
16604 if mem_2_2_0.Op != OpOffPtr {
16605 break
16606 }
16607 tt4 := mem_2_2_0.Type
16608 o4 := auxIntToInt64(mem_2_2_0.AuxInt)
16609 p4 := mem_2_2_0.Args[0]
16610 d3 := mem_2_2.Args[1]
16611 mem_2_2_2 := mem_2_2.Args[2]
16612 if mem_2_2_2.Op != OpZero || auxIntToInt64(mem_2_2_2.AuxInt) != n {
16613 break
16614 }
16615 t5 := auxToType(mem_2_2_2.Aux)
16616 p5 := mem_2_2_2.Args[0]
16617 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()) {
16618 break
16619 }
16620 v.reset(OpStore)
16621 v.Aux = typeToAux(t2)
16622 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16623 v0.AuxInt = int64ToAuxInt(o2)
16624 v0.AddArg(dst)
16625 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16626 v1.Aux = typeToAux(t3)
16627 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16628 v2.AuxInt = int64ToAuxInt(o3)
16629 v2.AddArg(dst)
16630 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16631 v3.Aux = typeToAux(t4)
16632 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16633 v4.AuxInt = int64ToAuxInt(o4)
16634 v4.AddArg(dst)
16635 v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16636 v5.AuxInt = int64ToAuxInt(n)
16637 v5.Aux = typeToAux(t1)
16638 v5.AddArg2(dst, mem)
16639 v3.AddArg3(v4, d3, v5)
16640 v1.AddArg3(v2, d2, v3)
16641 v.AddArg3(v0, d1, v1)
16642 return true
16643 }
16644
16645
16646
16647 for {
16648 n := auxIntToInt64(v.AuxInt)
16649 t1 := auxToType(v.Aux)
16650 dst := v_0
16651 p1 := v_1
16652 mem := v_2
16653 if mem.Op != OpStore {
16654 break
16655 }
16656 t2 := auxToType(mem.Aux)
16657 _ = mem.Args[2]
16658 mem_0 := mem.Args[0]
16659 if mem_0.Op != OpOffPtr {
16660 break
16661 }
16662 tt2 := mem_0.Type
16663 o2 := auxIntToInt64(mem_0.AuxInt)
16664 p2 := mem_0.Args[0]
16665 d1 := mem.Args[1]
16666 mem_2 := mem.Args[2]
16667 if mem_2.Op != OpStore {
16668 break
16669 }
16670 t3 := auxToType(mem_2.Aux)
16671 _ = mem_2.Args[2]
16672 mem_2_0 := mem_2.Args[0]
16673 if mem_2_0.Op != OpOffPtr {
16674 break
16675 }
16676 tt3 := mem_2_0.Type
16677 o3 := auxIntToInt64(mem_2_0.AuxInt)
16678 p3 := mem_2_0.Args[0]
16679 d2 := mem_2.Args[1]
16680 mem_2_2 := mem_2.Args[2]
16681 if mem_2_2.Op != OpStore {
16682 break
16683 }
16684 t4 := auxToType(mem_2_2.Aux)
16685 _ = mem_2_2.Args[2]
16686 mem_2_2_0 := mem_2_2.Args[0]
16687 if mem_2_2_0.Op != OpOffPtr {
16688 break
16689 }
16690 tt4 := mem_2_2_0.Type
16691 o4 := auxIntToInt64(mem_2_2_0.AuxInt)
16692 p4 := mem_2_2_0.Args[0]
16693 d3 := mem_2_2.Args[1]
16694 mem_2_2_2 := mem_2_2.Args[2]
16695 if mem_2_2_2.Op != OpStore {
16696 break
16697 }
16698 t5 := auxToType(mem_2_2_2.Aux)
16699 _ = mem_2_2_2.Args[2]
16700 mem_2_2_2_0 := mem_2_2_2.Args[0]
16701 if mem_2_2_2_0.Op != OpOffPtr {
16702 break
16703 }
16704 tt5 := mem_2_2_2_0.Type
16705 o5 := auxIntToInt64(mem_2_2_2_0.AuxInt)
16706 p5 := mem_2_2_2_0.Args[0]
16707 d4 := mem_2_2_2.Args[1]
16708 mem_2_2_2_2 := mem_2_2_2.Args[2]
16709 if mem_2_2_2_2.Op != OpZero || auxIntToInt64(mem_2_2_2_2.AuxInt) != n {
16710 break
16711 }
16712 t6 := auxToType(mem_2_2_2_2.Aux)
16713 p6 := mem_2_2_2_2.Args[0]
16714 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()) {
16715 break
16716 }
16717 v.reset(OpStore)
16718 v.Aux = typeToAux(t2)
16719 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16720 v0.AuxInt = int64ToAuxInt(o2)
16721 v0.AddArg(dst)
16722 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16723 v1.Aux = typeToAux(t3)
16724 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16725 v2.AuxInt = int64ToAuxInt(o3)
16726 v2.AddArg(dst)
16727 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16728 v3.Aux = typeToAux(t4)
16729 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16730 v4.AuxInt = int64ToAuxInt(o4)
16731 v4.AddArg(dst)
16732 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16733 v5.Aux = typeToAux(t5)
16734 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
16735 v6.AuxInt = int64ToAuxInt(o5)
16736 v6.AddArg(dst)
16737 v7 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16738 v7.AuxInt = int64ToAuxInt(n)
16739 v7.Aux = typeToAux(t1)
16740 v7.AddArg2(dst, mem)
16741 v5.AddArg3(v6, d4, v7)
16742 v3.AddArg3(v4, d3, v5)
16743 v1.AddArg3(v2, d2, v3)
16744 v.AddArg3(v0, d1, v1)
16745 return true
16746 }
16747
16748
16749
16750 for {
16751 n := auxIntToInt64(v.AuxInt)
16752 t1 := auxToType(v.Aux)
16753 dst := v_0
16754 p1 := v_1
16755 mem := v_2
16756 if mem.Op != OpVarDef {
16757 break
16758 }
16759 mem_0 := mem.Args[0]
16760 if mem_0.Op != OpStore {
16761 break
16762 }
16763 t2 := auxToType(mem_0.Aux)
16764 _ = mem_0.Args[2]
16765 op2 := mem_0.Args[0]
16766 if op2.Op != OpOffPtr {
16767 break
16768 }
16769 tt2 := op2.Type
16770 o2 := auxIntToInt64(op2.AuxInt)
16771 p2 := op2.Args[0]
16772 d1 := mem_0.Args[1]
16773 mem_0_2 := mem_0.Args[2]
16774 if mem_0_2.Op != OpZero || auxIntToInt64(mem_0_2.AuxInt) != n {
16775 break
16776 }
16777 t3 := auxToType(mem_0_2.Aux)
16778 p3 := mem_0_2.Args[0]
16779 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && registerizable(b, t2) && n >= o2+t2.Size()) {
16780 break
16781 }
16782 v.reset(OpStore)
16783 v.Aux = typeToAux(t2)
16784 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16785 v0.AuxInt = int64ToAuxInt(o2)
16786 v0.AddArg(dst)
16787 v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16788 v1.AuxInt = int64ToAuxInt(n)
16789 v1.Aux = typeToAux(t1)
16790 v1.AddArg2(dst, mem)
16791 v.AddArg3(v0, d1, v1)
16792 return true
16793 }
16794
16795
16796
16797 for {
16798 n := auxIntToInt64(v.AuxInt)
16799 t1 := auxToType(v.Aux)
16800 dst := v_0
16801 p1 := v_1
16802 mem := v_2
16803 if mem.Op != OpVarDef {
16804 break
16805 }
16806 mem_0 := mem.Args[0]
16807 if mem_0.Op != OpStore {
16808 break
16809 }
16810 t2 := auxToType(mem_0.Aux)
16811 _ = mem_0.Args[2]
16812 mem_0_0 := mem_0.Args[0]
16813 if mem_0_0.Op != OpOffPtr {
16814 break
16815 }
16816 tt2 := mem_0_0.Type
16817 o2 := auxIntToInt64(mem_0_0.AuxInt)
16818 p2 := mem_0_0.Args[0]
16819 d1 := mem_0.Args[1]
16820 mem_0_2 := mem_0.Args[2]
16821 if mem_0_2.Op != OpStore {
16822 break
16823 }
16824 t3 := auxToType(mem_0_2.Aux)
16825 _ = mem_0_2.Args[2]
16826 mem_0_2_0 := mem_0_2.Args[0]
16827 if mem_0_2_0.Op != OpOffPtr {
16828 break
16829 }
16830 tt3 := mem_0_2_0.Type
16831 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
16832 p3 := mem_0_2_0.Args[0]
16833 d2 := mem_0_2.Args[1]
16834 mem_0_2_2 := mem_0_2.Args[2]
16835 if mem_0_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2.AuxInt) != n {
16836 break
16837 }
16838 t4 := auxToType(mem_0_2_2.Aux)
16839 p4 := mem_0_2_2.Args[0]
16840 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()) {
16841 break
16842 }
16843 v.reset(OpStore)
16844 v.Aux = typeToAux(t2)
16845 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16846 v0.AuxInt = int64ToAuxInt(o2)
16847 v0.AddArg(dst)
16848 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16849 v1.Aux = typeToAux(t3)
16850 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16851 v2.AuxInt = int64ToAuxInt(o3)
16852 v2.AddArg(dst)
16853 v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16854 v3.AuxInt = int64ToAuxInt(n)
16855 v3.Aux = typeToAux(t1)
16856 v3.AddArg2(dst, mem)
16857 v1.AddArg3(v2, d2, v3)
16858 v.AddArg3(v0, d1, v1)
16859 return true
16860 }
16861
16862
16863
16864 for {
16865 n := auxIntToInt64(v.AuxInt)
16866 t1 := auxToType(v.Aux)
16867 dst := v_0
16868 p1 := v_1
16869 mem := v_2
16870 if mem.Op != OpVarDef {
16871 break
16872 }
16873 mem_0 := mem.Args[0]
16874 if mem_0.Op != OpStore {
16875 break
16876 }
16877 t2 := auxToType(mem_0.Aux)
16878 _ = mem_0.Args[2]
16879 mem_0_0 := mem_0.Args[0]
16880 if mem_0_0.Op != OpOffPtr {
16881 break
16882 }
16883 tt2 := mem_0_0.Type
16884 o2 := auxIntToInt64(mem_0_0.AuxInt)
16885 p2 := mem_0_0.Args[0]
16886 d1 := mem_0.Args[1]
16887 mem_0_2 := mem_0.Args[2]
16888 if mem_0_2.Op != OpStore {
16889 break
16890 }
16891 t3 := auxToType(mem_0_2.Aux)
16892 _ = mem_0_2.Args[2]
16893 mem_0_2_0 := mem_0_2.Args[0]
16894 if mem_0_2_0.Op != OpOffPtr {
16895 break
16896 }
16897 tt3 := mem_0_2_0.Type
16898 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
16899 p3 := mem_0_2_0.Args[0]
16900 d2 := mem_0_2.Args[1]
16901 mem_0_2_2 := mem_0_2.Args[2]
16902 if mem_0_2_2.Op != OpStore {
16903 break
16904 }
16905 t4 := auxToType(mem_0_2_2.Aux)
16906 _ = mem_0_2_2.Args[2]
16907 mem_0_2_2_0 := mem_0_2_2.Args[0]
16908 if mem_0_2_2_0.Op != OpOffPtr {
16909 break
16910 }
16911 tt4 := mem_0_2_2_0.Type
16912 o4 := auxIntToInt64(mem_0_2_2_0.AuxInt)
16913 p4 := mem_0_2_2_0.Args[0]
16914 d3 := mem_0_2_2.Args[1]
16915 mem_0_2_2_2 := mem_0_2_2.Args[2]
16916 if mem_0_2_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2_2.AuxInt) != n {
16917 break
16918 }
16919 t5 := auxToType(mem_0_2_2_2.Aux)
16920 p5 := mem_0_2_2_2.Args[0]
16921 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()) {
16922 break
16923 }
16924 v.reset(OpStore)
16925 v.Aux = typeToAux(t2)
16926 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16927 v0.AuxInt = int64ToAuxInt(o2)
16928 v0.AddArg(dst)
16929 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16930 v1.Aux = typeToAux(t3)
16931 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16932 v2.AuxInt = int64ToAuxInt(o3)
16933 v2.AddArg(dst)
16934 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16935 v3.Aux = typeToAux(t4)
16936 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16937 v4.AuxInt = int64ToAuxInt(o4)
16938 v4.AddArg(dst)
16939 v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16940 v5.AuxInt = int64ToAuxInt(n)
16941 v5.Aux = typeToAux(t1)
16942 v5.AddArg2(dst, mem)
16943 v3.AddArg3(v4, d3, v5)
16944 v1.AddArg3(v2, d2, v3)
16945 v.AddArg3(v0, d1, v1)
16946 return true
16947 }
16948
16949
16950
16951 for {
16952 n := auxIntToInt64(v.AuxInt)
16953 t1 := auxToType(v.Aux)
16954 dst := v_0
16955 p1 := v_1
16956 mem := v_2
16957 if mem.Op != OpVarDef {
16958 break
16959 }
16960 mem_0 := mem.Args[0]
16961 if mem_0.Op != OpStore {
16962 break
16963 }
16964 t2 := auxToType(mem_0.Aux)
16965 _ = mem_0.Args[2]
16966 mem_0_0 := mem_0.Args[0]
16967 if mem_0_0.Op != OpOffPtr {
16968 break
16969 }
16970 tt2 := mem_0_0.Type
16971 o2 := auxIntToInt64(mem_0_0.AuxInt)
16972 p2 := mem_0_0.Args[0]
16973 d1 := mem_0.Args[1]
16974 mem_0_2 := mem_0.Args[2]
16975 if mem_0_2.Op != OpStore {
16976 break
16977 }
16978 t3 := auxToType(mem_0_2.Aux)
16979 _ = mem_0_2.Args[2]
16980 mem_0_2_0 := mem_0_2.Args[0]
16981 if mem_0_2_0.Op != OpOffPtr {
16982 break
16983 }
16984 tt3 := mem_0_2_0.Type
16985 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
16986 p3 := mem_0_2_0.Args[0]
16987 d2 := mem_0_2.Args[1]
16988 mem_0_2_2 := mem_0_2.Args[2]
16989 if mem_0_2_2.Op != OpStore {
16990 break
16991 }
16992 t4 := auxToType(mem_0_2_2.Aux)
16993 _ = mem_0_2_2.Args[2]
16994 mem_0_2_2_0 := mem_0_2_2.Args[0]
16995 if mem_0_2_2_0.Op != OpOffPtr {
16996 break
16997 }
16998 tt4 := mem_0_2_2_0.Type
16999 o4 := auxIntToInt64(mem_0_2_2_0.AuxInt)
17000 p4 := mem_0_2_2_0.Args[0]
17001 d3 := mem_0_2_2.Args[1]
17002 mem_0_2_2_2 := mem_0_2_2.Args[2]
17003 if mem_0_2_2_2.Op != OpStore {
17004 break
17005 }
17006 t5 := auxToType(mem_0_2_2_2.Aux)
17007 _ = mem_0_2_2_2.Args[2]
17008 mem_0_2_2_2_0 := mem_0_2_2_2.Args[0]
17009 if mem_0_2_2_2_0.Op != OpOffPtr {
17010 break
17011 }
17012 tt5 := mem_0_2_2_2_0.Type
17013 o5 := auxIntToInt64(mem_0_2_2_2_0.AuxInt)
17014 p5 := mem_0_2_2_2_0.Args[0]
17015 d4 := mem_0_2_2_2.Args[1]
17016 mem_0_2_2_2_2 := mem_0_2_2_2.Args[2]
17017 if mem_0_2_2_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2_2_2.AuxInt) != n {
17018 break
17019 }
17020 t6 := auxToType(mem_0_2_2_2_2.Aux)
17021 p6 := mem_0_2_2_2_2.Args[0]
17022 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()) {
17023 break
17024 }
17025 v.reset(OpStore)
17026 v.Aux = typeToAux(t2)
17027 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17028 v0.AuxInt = int64ToAuxInt(o2)
17029 v0.AddArg(dst)
17030 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17031 v1.Aux = typeToAux(t3)
17032 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17033 v2.AuxInt = int64ToAuxInt(o3)
17034 v2.AddArg(dst)
17035 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17036 v3.Aux = typeToAux(t4)
17037 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17038 v4.AuxInt = int64ToAuxInt(o4)
17039 v4.AddArg(dst)
17040 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17041 v5.Aux = typeToAux(t5)
17042 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
17043 v6.AuxInt = int64ToAuxInt(o5)
17044 v6.AddArg(dst)
17045 v7 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17046 v7.AuxInt = int64ToAuxInt(n)
17047 v7.Aux = typeToAux(t1)
17048 v7.AddArg2(dst, mem)
17049 v5.AddArg3(v6, d4, v7)
17050 v3.AddArg3(v4, d3, v5)
17051 v1.AddArg3(v2, d2, v3)
17052 v.AddArg3(v0, d1, v1)
17053 return true
17054 }
17055
17056
17057
17058 for {
17059 s := auxIntToInt64(v.AuxInt)
17060 t1 := auxToType(v.Aux)
17061 dst := v_0
17062 tmp1 := v_1
17063 midmem := v_2
17064 if midmem.Op != OpMove || auxIntToInt64(midmem.AuxInt) != s {
17065 break
17066 }
17067 t2 := auxToType(midmem.Aux)
17068 src := midmem.Args[1]
17069 tmp2 := midmem.Args[0]
17070 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))) {
17071 break
17072 }
17073 v.reset(OpMove)
17074 v.AuxInt = int64ToAuxInt(s)
17075 v.Aux = typeToAux(t1)
17076 v.AddArg3(dst, src, midmem)
17077 return true
17078 }
17079
17080
17081
17082 for {
17083 s := auxIntToInt64(v.AuxInt)
17084 t1 := auxToType(v.Aux)
17085 dst := v_0
17086 tmp1 := v_1
17087 midmem := v_2
17088 if midmem.Op != OpVarDef {
17089 break
17090 }
17091 midmem_0 := midmem.Args[0]
17092 if midmem_0.Op != OpMove || auxIntToInt64(midmem_0.AuxInt) != s {
17093 break
17094 }
17095 t2 := auxToType(midmem_0.Aux)
17096 src := midmem_0.Args[1]
17097 tmp2 := midmem_0.Args[0]
17098 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))) {
17099 break
17100 }
17101 v.reset(OpMove)
17102 v.AuxInt = int64ToAuxInt(s)
17103 v.Aux = typeToAux(t1)
17104 v.AddArg3(dst, src, midmem)
17105 return true
17106 }
17107
17108
17109
17110 for {
17111 dst := v_0
17112 src := v_1
17113 mem := v_2
17114 if !(isSamePtr(dst, src)) {
17115 break
17116 }
17117 v.copyOf(mem)
17118 return true
17119 }
17120 return false
17121 }
17122 func rewriteValuegeneric_OpMul16(v *Value) bool {
17123 v_1 := v.Args[1]
17124 v_0 := v.Args[0]
17125 b := v.Block
17126 typ := &b.Func.Config.Types
17127
17128
17129 for {
17130 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17131 if v_0.Op != OpConst16 {
17132 continue
17133 }
17134 c := auxIntToInt16(v_0.AuxInt)
17135 if v_1.Op != OpConst16 {
17136 continue
17137 }
17138 d := auxIntToInt16(v_1.AuxInt)
17139 v.reset(OpConst16)
17140 v.AuxInt = int16ToAuxInt(c * d)
17141 return true
17142 }
17143 break
17144 }
17145
17146
17147 for {
17148 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17149 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 1 {
17150 continue
17151 }
17152 x := v_1
17153 v.copyOf(x)
17154 return true
17155 }
17156 break
17157 }
17158
17159
17160 for {
17161 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17162 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
17163 continue
17164 }
17165 x := v_1
17166 v.reset(OpNeg16)
17167 v.AddArg(x)
17168 return true
17169 }
17170 break
17171 }
17172
17173
17174 for {
17175 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17176 if v_0.Op != OpConst16 {
17177 continue
17178 }
17179 t := v_0.Type
17180 c := auxIntToInt16(v_0.AuxInt)
17181 if v_1.Op != OpNeg16 {
17182 continue
17183 }
17184 x := v_1.Args[0]
17185 v.reset(OpMul16)
17186 v0 := b.NewValue0(v.Pos, OpConst16, t)
17187 v0.AuxInt = int16ToAuxInt(-c)
17188 v.AddArg2(x, v0)
17189 return true
17190 }
17191 break
17192 }
17193
17194
17195 for {
17196 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17197 if v_0.Op != OpNeg16 {
17198 continue
17199 }
17200 x := v_0.Args[0]
17201 if v_1.Op != OpNeg16 {
17202 continue
17203 }
17204 y := v_1.Args[0]
17205 v.reset(OpMul16)
17206 v.AddArg2(x, y)
17207 return true
17208 }
17209 break
17210 }
17211
17212
17213
17214 for {
17215 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17216 if v_0.Op != OpConst16 {
17217 continue
17218 }
17219 t := v_0.Type
17220 c := auxIntToInt16(v_0.AuxInt)
17221 if v_1.Op != OpAdd16 || v_1.Type != t {
17222 continue
17223 }
17224 _ = v_1.Args[1]
17225 v_1_0 := v_1.Args[0]
17226 v_1_1 := v_1.Args[1]
17227 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
17228 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
17229 continue
17230 }
17231 d := auxIntToInt16(v_1_0.AuxInt)
17232 x := v_1_1
17233 if !(!isPowerOfTwo(c)) {
17234 continue
17235 }
17236 v.reset(OpAdd16)
17237 v0 := b.NewValue0(v.Pos, OpConst16, t)
17238 v0.AuxInt = int16ToAuxInt(c * d)
17239 v1 := b.NewValue0(v.Pos, OpMul16, t)
17240 v2 := b.NewValue0(v.Pos, OpConst16, t)
17241 v2.AuxInt = int16ToAuxInt(c)
17242 v1.AddArg2(v2, x)
17243 v.AddArg2(v0, v1)
17244 return true
17245 }
17246 }
17247 break
17248 }
17249
17250
17251 for {
17252 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17253 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
17254 continue
17255 }
17256 v.reset(OpConst16)
17257 v.AuxInt = int16ToAuxInt(0)
17258 return true
17259 }
17260 break
17261 }
17262
17263
17264
17265 for {
17266 t := v.Type
17267 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17268 x := v_0
17269 if v_1.Op != OpConst16 {
17270 continue
17271 }
17272 c := auxIntToInt16(v_1.AuxInt)
17273 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
17274 continue
17275 }
17276 v.reset(OpLsh16x64)
17277 v.Type = t
17278 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17279 v0.AuxInt = int64ToAuxInt(log16(c))
17280 v.AddArg2(x, v0)
17281 return true
17282 }
17283 break
17284 }
17285
17286
17287
17288 for {
17289 t := v.Type
17290 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17291 x := v_0
17292 if v_1.Op != OpConst16 {
17293 continue
17294 }
17295 c := auxIntToInt16(v_1.AuxInt)
17296 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
17297 continue
17298 }
17299 v.reset(OpNeg16)
17300 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
17301 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17302 v1.AuxInt = int64ToAuxInt(log16(-c))
17303 v0.AddArg2(x, v1)
17304 v.AddArg(v0)
17305 return true
17306 }
17307 break
17308 }
17309
17310
17311
17312 for {
17313 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17314 if v_0.Op != OpMul16 {
17315 continue
17316 }
17317 _ = v_0.Args[1]
17318 v_0_0 := v_0.Args[0]
17319 v_0_1 := v_0.Args[1]
17320 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
17321 i := v_0_0
17322 if i.Op != OpConst16 {
17323 continue
17324 }
17325 t := i.Type
17326 z := v_0_1
17327 x := v_1
17328 if !(z.Op != OpConst16 && x.Op != OpConst16) {
17329 continue
17330 }
17331 v.reset(OpMul16)
17332 v0 := b.NewValue0(v.Pos, OpMul16, t)
17333 v0.AddArg2(x, z)
17334 v.AddArg2(i, v0)
17335 return true
17336 }
17337 }
17338 break
17339 }
17340
17341
17342 for {
17343 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17344 if v_0.Op != OpConst16 {
17345 continue
17346 }
17347 t := v_0.Type
17348 c := auxIntToInt16(v_0.AuxInt)
17349 if v_1.Op != OpMul16 {
17350 continue
17351 }
17352 _ = v_1.Args[1]
17353 v_1_0 := v_1.Args[0]
17354 v_1_1 := v_1.Args[1]
17355 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
17356 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
17357 continue
17358 }
17359 d := auxIntToInt16(v_1_0.AuxInt)
17360 x := v_1_1
17361 v.reset(OpMul16)
17362 v0 := b.NewValue0(v.Pos, OpConst16, t)
17363 v0.AuxInt = int16ToAuxInt(c * d)
17364 v.AddArg2(v0, x)
17365 return true
17366 }
17367 }
17368 break
17369 }
17370 return false
17371 }
17372 func rewriteValuegeneric_OpMul32(v *Value) bool {
17373 v_1 := v.Args[1]
17374 v_0 := v.Args[0]
17375 b := v.Block
17376 typ := &b.Func.Config.Types
17377
17378
17379 for {
17380 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17381 if v_0.Op != OpConst32 {
17382 continue
17383 }
17384 c := auxIntToInt32(v_0.AuxInt)
17385 if v_1.Op != OpConst32 {
17386 continue
17387 }
17388 d := auxIntToInt32(v_1.AuxInt)
17389 v.reset(OpConst32)
17390 v.AuxInt = int32ToAuxInt(c * d)
17391 return true
17392 }
17393 break
17394 }
17395
17396
17397 for {
17398 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17399 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 {
17400 continue
17401 }
17402 x := v_1
17403 v.copyOf(x)
17404 return true
17405 }
17406 break
17407 }
17408
17409
17410 for {
17411 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17412 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
17413 continue
17414 }
17415 x := v_1
17416 v.reset(OpNeg32)
17417 v.AddArg(x)
17418 return true
17419 }
17420 break
17421 }
17422
17423
17424 for {
17425 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17426 if v_0.Op != OpConst32 {
17427 continue
17428 }
17429 t := v_0.Type
17430 c := auxIntToInt32(v_0.AuxInt)
17431 if v_1.Op != OpNeg32 {
17432 continue
17433 }
17434 x := v_1.Args[0]
17435 v.reset(OpMul32)
17436 v0 := b.NewValue0(v.Pos, OpConst32, t)
17437 v0.AuxInt = int32ToAuxInt(-c)
17438 v.AddArg2(x, v0)
17439 return true
17440 }
17441 break
17442 }
17443
17444
17445 for {
17446 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17447 if v_0.Op != OpNeg32 {
17448 continue
17449 }
17450 x := v_0.Args[0]
17451 if v_1.Op != OpNeg32 {
17452 continue
17453 }
17454 y := v_1.Args[0]
17455 v.reset(OpMul32)
17456 v.AddArg2(x, y)
17457 return true
17458 }
17459 break
17460 }
17461
17462
17463
17464 for {
17465 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17466 if v_0.Op != OpConst32 {
17467 continue
17468 }
17469 t := v_0.Type
17470 c := auxIntToInt32(v_0.AuxInt)
17471 if v_1.Op != OpAdd32 || v_1.Type != t {
17472 continue
17473 }
17474 _ = v_1.Args[1]
17475 v_1_0 := v_1.Args[0]
17476 v_1_1 := v_1.Args[1]
17477 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
17478 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
17479 continue
17480 }
17481 d := auxIntToInt32(v_1_0.AuxInt)
17482 x := v_1_1
17483 if !(!isPowerOfTwo(c)) {
17484 continue
17485 }
17486 v.reset(OpAdd32)
17487 v0 := b.NewValue0(v.Pos, OpConst32, t)
17488 v0.AuxInt = int32ToAuxInt(c * d)
17489 v1 := b.NewValue0(v.Pos, OpMul32, t)
17490 v2 := b.NewValue0(v.Pos, OpConst32, t)
17491 v2.AuxInt = int32ToAuxInt(c)
17492 v1.AddArg2(v2, x)
17493 v.AddArg2(v0, v1)
17494 return true
17495 }
17496 }
17497 break
17498 }
17499
17500
17501 for {
17502 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17503 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
17504 continue
17505 }
17506 v.reset(OpConst32)
17507 v.AuxInt = int32ToAuxInt(0)
17508 return true
17509 }
17510 break
17511 }
17512
17513
17514
17515 for {
17516 t := v.Type
17517 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17518 x := v_0
17519 if v_1.Op != OpConst32 {
17520 continue
17521 }
17522 c := auxIntToInt32(v_1.AuxInt)
17523 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
17524 continue
17525 }
17526 v.reset(OpLsh32x64)
17527 v.Type = t
17528 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17529 v0.AuxInt = int64ToAuxInt(log32(c))
17530 v.AddArg2(x, v0)
17531 return true
17532 }
17533 break
17534 }
17535
17536
17537
17538 for {
17539 t := v.Type
17540 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17541 x := v_0
17542 if v_1.Op != OpConst32 {
17543 continue
17544 }
17545 c := auxIntToInt32(v_1.AuxInt)
17546 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
17547 continue
17548 }
17549 v.reset(OpNeg32)
17550 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
17551 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17552 v1.AuxInt = int64ToAuxInt(log32(-c))
17553 v0.AddArg2(x, v1)
17554 v.AddArg(v0)
17555 return true
17556 }
17557 break
17558 }
17559
17560
17561
17562 for {
17563 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17564 if v_0.Op != OpMul32 {
17565 continue
17566 }
17567 _ = v_0.Args[1]
17568 v_0_0 := v_0.Args[0]
17569 v_0_1 := v_0.Args[1]
17570 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
17571 i := v_0_0
17572 if i.Op != OpConst32 {
17573 continue
17574 }
17575 t := i.Type
17576 z := v_0_1
17577 x := v_1
17578 if !(z.Op != OpConst32 && x.Op != OpConst32) {
17579 continue
17580 }
17581 v.reset(OpMul32)
17582 v0 := b.NewValue0(v.Pos, OpMul32, t)
17583 v0.AddArg2(x, z)
17584 v.AddArg2(i, v0)
17585 return true
17586 }
17587 }
17588 break
17589 }
17590
17591
17592 for {
17593 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17594 if v_0.Op != OpConst32 {
17595 continue
17596 }
17597 t := v_0.Type
17598 c := auxIntToInt32(v_0.AuxInt)
17599 if v_1.Op != OpMul32 {
17600 continue
17601 }
17602 _ = v_1.Args[1]
17603 v_1_0 := v_1.Args[0]
17604 v_1_1 := v_1.Args[1]
17605 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
17606 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
17607 continue
17608 }
17609 d := auxIntToInt32(v_1_0.AuxInt)
17610 x := v_1_1
17611 v.reset(OpMul32)
17612 v0 := b.NewValue0(v.Pos, OpConst32, t)
17613 v0.AuxInt = int32ToAuxInt(c * d)
17614 v.AddArg2(v0, x)
17615 return true
17616 }
17617 }
17618 break
17619 }
17620 return false
17621 }
17622 func rewriteValuegeneric_OpMul32F(v *Value) bool {
17623 v_1 := v.Args[1]
17624 v_0 := v.Args[0]
17625
17626
17627
17628 for {
17629 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17630 if v_0.Op != OpConst32F {
17631 continue
17632 }
17633 c := auxIntToFloat32(v_0.AuxInt)
17634 if v_1.Op != OpConst32F {
17635 continue
17636 }
17637 d := auxIntToFloat32(v_1.AuxInt)
17638 if !(c*d == c*d) {
17639 continue
17640 }
17641 v.reset(OpConst32F)
17642 v.AuxInt = float32ToAuxInt(c * d)
17643 return true
17644 }
17645 break
17646 }
17647
17648
17649 for {
17650 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17651 x := v_0
17652 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != 1 {
17653 continue
17654 }
17655 v.copyOf(x)
17656 return true
17657 }
17658 break
17659 }
17660
17661
17662 for {
17663 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17664 x := v_0
17665 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != -1 {
17666 continue
17667 }
17668 v.reset(OpNeg32F)
17669 v.AddArg(x)
17670 return true
17671 }
17672 break
17673 }
17674
17675
17676 for {
17677 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17678 x := v_0
17679 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != 2 {
17680 continue
17681 }
17682 v.reset(OpAdd32F)
17683 v.AddArg2(x, x)
17684 return true
17685 }
17686 break
17687 }
17688 return false
17689 }
17690 func rewriteValuegeneric_OpMul32uhilo(v *Value) bool {
17691 v_1 := v.Args[1]
17692 v_0 := v.Args[0]
17693 b := v.Block
17694 typ := &b.Func.Config.Types
17695
17696
17697 for {
17698 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17699 if v_0.Op != OpConst32 {
17700 continue
17701 }
17702 c := auxIntToInt32(v_0.AuxInt)
17703 if v_1.Op != OpConst32 {
17704 continue
17705 }
17706 d := auxIntToInt32(v_1.AuxInt)
17707 v.reset(OpMakeTuple)
17708 v0 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
17709 v0.AuxInt = int32ToAuxInt(bitsMulU32(c, d).hi)
17710 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
17711 v1.AuxInt = int32ToAuxInt(bitsMulU32(c, d).lo)
17712 v.AddArg2(v0, v1)
17713 return true
17714 }
17715 break
17716 }
17717 return false
17718 }
17719 func rewriteValuegeneric_OpMul32uover(v *Value) bool {
17720 v_1 := v.Args[1]
17721 v_0 := v.Args[0]
17722 b := v.Block
17723 typ := &b.Func.Config.Types
17724
17725
17726 for {
17727 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17728 if v_0.Op != OpConst32 {
17729 continue
17730 }
17731 c := auxIntToInt32(v_0.AuxInt)
17732 if v_1.Op != OpConst32 {
17733 continue
17734 }
17735 d := auxIntToInt32(v_1.AuxInt)
17736 v.reset(OpMakeTuple)
17737 v0 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
17738 v0.AuxInt = int32ToAuxInt(bitsMulU32(c, d).lo)
17739 v1 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
17740 v1.AuxInt = boolToAuxInt(bitsMulU32(c, d).hi != 0)
17741 v.AddArg2(v0, v1)
17742 return true
17743 }
17744 break
17745 }
17746
17747
17748 for {
17749 t := v.Type
17750 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17751 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 {
17752 continue
17753 }
17754 x := v_1
17755 v.reset(OpMakeTuple)
17756 v0 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
17757 v0.AuxInt = boolToAuxInt(false)
17758 v.AddArg2(x, v0)
17759 return true
17760 }
17761 break
17762 }
17763
17764
17765 for {
17766 t := v.Type
17767 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17768 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
17769 continue
17770 }
17771 v.reset(OpMakeTuple)
17772 v0 := b.NewValue0(v.Pos, OpConst32, t.FieldType(0))
17773 v0.AuxInt = int32ToAuxInt(0)
17774 v1 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
17775 v1.AuxInt = boolToAuxInt(false)
17776 v.AddArg2(v0, v1)
17777 return true
17778 }
17779 break
17780 }
17781 return false
17782 }
17783 func rewriteValuegeneric_OpMul64(v *Value) bool {
17784 v_1 := v.Args[1]
17785 v_0 := v.Args[0]
17786 b := v.Block
17787 typ := &b.Func.Config.Types
17788
17789
17790 for {
17791 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17792 if v_0.Op != OpConst64 {
17793 continue
17794 }
17795 c := auxIntToInt64(v_0.AuxInt)
17796 if v_1.Op != OpConst64 {
17797 continue
17798 }
17799 d := auxIntToInt64(v_1.AuxInt)
17800 v.reset(OpConst64)
17801 v.AuxInt = int64ToAuxInt(c * d)
17802 return true
17803 }
17804 break
17805 }
17806
17807
17808 for {
17809 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17810 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 {
17811 continue
17812 }
17813 x := v_1
17814 v.copyOf(x)
17815 return true
17816 }
17817 break
17818 }
17819
17820
17821 for {
17822 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17823 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
17824 continue
17825 }
17826 x := v_1
17827 v.reset(OpNeg64)
17828 v.AddArg(x)
17829 return true
17830 }
17831 break
17832 }
17833
17834
17835 for {
17836 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17837 if v_0.Op != OpConst64 {
17838 continue
17839 }
17840 t := v_0.Type
17841 c := auxIntToInt64(v_0.AuxInt)
17842 if v_1.Op != OpNeg64 {
17843 continue
17844 }
17845 x := v_1.Args[0]
17846 v.reset(OpMul64)
17847 v0 := b.NewValue0(v.Pos, OpConst64, t)
17848 v0.AuxInt = int64ToAuxInt(-c)
17849 v.AddArg2(x, v0)
17850 return true
17851 }
17852 break
17853 }
17854
17855
17856 for {
17857 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17858 if v_0.Op != OpNeg64 {
17859 continue
17860 }
17861 x := v_0.Args[0]
17862 if v_1.Op != OpNeg64 {
17863 continue
17864 }
17865 y := v_1.Args[0]
17866 v.reset(OpMul64)
17867 v.AddArg2(x, y)
17868 return true
17869 }
17870 break
17871 }
17872
17873
17874
17875 for {
17876 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17877 if v_0.Op != OpConst64 {
17878 continue
17879 }
17880 t := v_0.Type
17881 c := auxIntToInt64(v_0.AuxInt)
17882 if v_1.Op != OpAdd64 || v_1.Type != t {
17883 continue
17884 }
17885 _ = v_1.Args[1]
17886 v_1_0 := v_1.Args[0]
17887 v_1_1 := v_1.Args[1]
17888 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
17889 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
17890 continue
17891 }
17892 d := auxIntToInt64(v_1_0.AuxInt)
17893 x := v_1_1
17894 if !(!isPowerOfTwo(c)) {
17895 continue
17896 }
17897 v.reset(OpAdd64)
17898 v0 := b.NewValue0(v.Pos, OpConst64, t)
17899 v0.AuxInt = int64ToAuxInt(c * d)
17900 v1 := b.NewValue0(v.Pos, OpMul64, t)
17901 v2 := b.NewValue0(v.Pos, OpConst64, t)
17902 v2.AuxInt = int64ToAuxInt(c)
17903 v1.AddArg2(v2, x)
17904 v.AddArg2(v0, v1)
17905 return true
17906 }
17907 }
17908 break
17909 }
17910
17911
17912 for {
17913 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17914 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
17915 continue
17916 }
17917 v.reset(OpConst64)
17918 v.AuxInt = int64ToAuxInt(0)
17919 return true
17920 }
17921 break
17922 }
17923
17924
17925
17926 for {
17927 t := v.Type
17928 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17929 x := v_0
17930 if v_1.Op != OpConst64 {
17931 continue
17932 }
17933 c := auxIntToInt64(v_1.AuxInt)
17934 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
17935 continue
17936 }
17937 v.reset(OpLsh64x64)
17938 v.Type = t
17939 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17940 v0.AuxInt = int64ToAuxInt(log64(c))
17941 v.AddArg2(x, v0)
17942 return true
17943 }
17944 break
17945 }
17946
17947
17948
17949 for {
17950 t := v.Type
17951 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17952 x := v_0
17953 if v_1.Op != OpConst64 {
17954 continue
17955 }
17956 c := auxIntToInt64(v_1.AuxInt)
17957 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
17958 continue
17959 }
17960 v.reset(OpNeg64)
17961 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
17962 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17963 v1.AuxInt = int64ToAuxInt(log64(-c))
17964 v0.AddArg2(x, v1)
17965 v.AddArg(v0)
17966 return true
17967 }
17968 break
17969 }
17970
17971
17972
17973 for {
17974 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17975 if v_0.Op != OpMul64 {
17976 continue
17977 }
17978 _ = v_0.Args[1]
17979 v_0_0 := v_0.Args[0]
17980 v_0_1 := v_0.Args[1]
17981 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
17982 i := v_0_0
17983 if i.Op != OpConst64 {
17984 continue
17985 }
17986 t := i.Type
17987 z := v_0_1
17988 x := v_1
17989 if !(z.Op != OpConst64 && x.Op != OpConst64) {
17990 continue
17991 }
17992 v.reset(OpMul64)
17993 v0 := b.NewValue0(v.Pos, OpMul64, t)
17994 v0.AddArg2(x, z)
17995 v.AddArg2(i, v0)
17996 return true
17997 }
17998 }
17999 break
18000 }
18001
18002
18003 for {
18004 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18005 if v_0.Op != OpConst64 {
18006 continue
18007 }
18008 t := v_0.Type
18009 c := auxIntToInt64(v_0.AuxInt)
18010 if v_1.Op != OpMul64 {
18011 continue
18012 }
18013 _ = v_1.Args[1]
18014 v_1_0 := v_1.Args[0]
18015 v_1_1 := v_1.Args[1]
18016 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18017 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
18018 continue
18019 }
18020 d := auxIntToInt64(v_1_0.AuxInt)
18021 x := v_1_1
18022 v.reset(OpMul64)
18023 v0 := b.NewValue0(v.Pos, OpConst64, t)
18024 v0.AuxInt = int64ToAuxInt(c * d)
18025 v.AddArg2(v0, x)
18026 return true
18027 }
18028 }
18029 break
18030 }
18031 return false
18032 }
18033 func rewriteValuegeneric_OpMul64F(v *Value) bool {
18034 v_1 := v.Args[1]
18035 v_0 := v.Args[0]
18036
18037
18038
18039 for {
18040 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18041 if v_0.Op != OpConst64F {
18042 continue
18043 }
18044 c := auxIntToFloat64(v_0.AuxInt)
18045 if v_1.Op != OpConst64F {
18046 continue
18047 }
18048 d := auxIntToFloat64(v_1.AuxInt)
18049 if !(c*d == c*d) {
18050 continue
18051 }
18052 v.reset(OpConst64F)
18053 v.AuxInt = float64ToAuxInt(c * d)
18054 return true
18055 }
18056 break
18057 }
18058
18059
18060 for {
18061 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18062 x := v_0
18063 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != 1 {
18064 continue
18065 }
18066 v.copyOf(x)
18067 return true
18068 }
18069 break
18070 }
18071
18072
18073 for {
18074 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18075 x := v_0
18076 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != -1 {
18077 continue
18078 }
18079 v.reset(OpNeg64F)
18080 v.AddArg(x)
18081 return true
18082 }
18083 break
18084 }
18085
18086
18087 for {
18088 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18089 x := v_0
18090 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != 2 {
18091 continue
18092 }
18093 v.reset(OpAdd64F)
18094 v.AddArg2(x, x)
18095 return true
18096 }
18097 break
18098 }
18099 return false
18100 }
18101 func rewriteValuegeneric_OpMul64uhilo(v *Value) bool {
18102 v_1 := v.Args[1]
18103 v_0 := v.Args[0]
18104 b := v.Block
18105 typ := &b.Func.Config.Types
18106
18107
18108 for {
18109 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18110 if v_0.Op != OpConst64 {
18111 continue
18112 }
18113 c := auxIntToInt64(v_0.AuxInt)
18114 if v_1.Op != OpConst64 {
18115 continue
18116 }
18117 d := auxIntToInt64(v_1.AuxInt)
18118 v.reset(OpMakeTuple)
18119 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18120 v0.AuxInt = int64ToAuxInt(bitsMulU64(c, d).hi)
18121 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18122 v1.AuxInt = int64ToAuxInt(bitsMulU64(c, d).lo)
18123 v.AddArg2(v0, v1)
18124 return true
18125 }
18126 break
18127 }
18128 return false
18129 }
18130 func rewriteValuegeneric_OpMul64uover(v *Value) bool {
18131 v_1 := v.Args[1]
18132 v_0 := v.Args[0]
18133 b := v.Block
18134 typ := &b.Func.Config.Types
18135
18136
18137 for {
18138 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18139 if v_0.Op != OpConst64 {
18140 continue
18141 }
18142 c := auxIntToInt64(v_0.AuxInt)
18143 if v_1.Op != OpConst64 {
18144 continue
18145 }
18146 d := auxIntToInt64(v_1.AuxInt)
18147 v.reset(OpMakeTuple)
18148 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18149 v0.AuxInt = int64ToAuxInt(bitsMulU64(c, d).lo)
18150 v1 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
18151 v1.AuxInt = boolToAuxInt(bitsMulU64(c, d).hi != 0)
18152 v.AddArg2(v0, v1)
18153 return true
18154 }
18155 break
18156 }
18157
18158
18159 for {
18160 t := v.Type
18161 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18162 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 {
18163 continue
18164 }
18165 x := v_1
18166 v.reset(OpMakeTuple)
18167 v0 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
18168 v0.AuxInt = boolToAuxInt(false)
18169 v.AddArg2(x, v0)
18170 return true
18171 }
18172 break
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 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
18180 continue
18181 }
18182 v.reset(OpMakeTuple)
18183 v0 := b.NewValue0(v.Pos, OpConst64, t.FieldType(0))
18184 v0.AuxInt = int64ToAuxInt(0)
18185 v1 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
18186 v1.AuxInt = boolToAuxInt(false)
18187 v.AddArg2(v0, v1)
18188 return true
18189 }
18190 break
18191 }
18192 return false
18193 }
18194 func rewriteValuegeneric_OpMul8(v *Value) bool {
18195 v_1 := v.Args[1]
18196 v_0 := v.Args[0]
18197 b := v.Block
18198 typ := &b.Func.Config.Types
18199
18200
18201 for {
18202 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18203 if v_0.Op != OpConst8 {
18204 continue
18205 }
18206 c := auxIntToInt8(v_0.AuxInt)
18207 if v_1.Op != OpConst8 {
18208 continue
18209 }
18210 d := auxIntToInt8(v_1.AuxInt)
18211 v.reset(OpConst8)
18212 v.AuxInt = int8ToAuxInt(c * d)
18213 return true
18214 }
18215 break
18216 }
18217
18218
18219 for {
18220 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18221 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 1 {
18222 continue
18223 }
18224 x := v_1
18225 v.copyOf(x)
18226 return true
18227 }
18228 break
18229 }
18230
18231
18232 for {
18233 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18234 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
18235 continue
18236 }
18237 x := v_1
18238 v.reset(OpNeg8)
18239 v.AddArg(x)
18240 return true
18241 }
18242 break
18243 }
18244
18245
18246 for {
18247 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18248 if v_0.Op != OpConst8 {
18249 continue
18250 }
18251 t := v_0.Type
18252 c := auxIntToInt8(v_0.AuxInt)
18253 if v_1.Op != OpNeg8 {
18254 continue
18255 }
18256 x := v_1.Args[0]
18257 v.reset(OpMul8)
18258 v0 := b.NewValue0(v.Pos, OpConst8, t)
18259 v0.AuxInt = int8ToAuxInt(-c)
18260 v.AddArg2(x, v0)
18261 return true
18262 }
18263 break
18264 }
18265
18266
18267 for {
18268 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18269 if v_0.Op != OpNeg8 {
18270 continue
18271 }
18272 x := v_0.Args[0]
18273 if v_1.Op != OpNeg8 {
18274 continue
18275 }
18276 y := v_1.Args[0]
18277 v.reset(OpMul8)
18278 v.AddArg2(x, y)
18279 return true
18280 }
18281 break
18282 }
18283
18284
18285
18286 for {
18287 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18288 if v_0.Op != OpConst8 {
18289 continue
18290 }
18291 t := v_0.Type
18292 c := auxIntToInt8(v_0.AuxInt)
18293 if v_1.Op != OpAdd8 || v_1.Type != t {
18294 continue
18295 }
18296 _ = v_1.Args[1]
18297 v_1_0 := v_1.Args[0]
18298 v_1_1 := v_1.Args[1]
18299 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18300 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
18301 continue
18302 }
18303 d := auxIntToInt8(v_1_0.AuxInt)
18304 x := v_1_1
18305 if !(!isPowerOfTwo(c)) {
18306 continue
18307 }
18308 v.reset(OpAdd8)
18309 v0 := b.NewValue0(v.Pos, OpConst8, t)
18310 v0.AuxInt = int8ToAuxInt(c * d)
18311 v1 := b.NewValue0(v.Pos, OpMul8, t)
18312 v2 := b.NewValue0(v.Pos, OpConst8, t)
18313 v2.AuxInt = int8ToAuxInt(c)
18314 v1.AddArg2(v2, x)
18315 v.AddArg2(v0, v1)
18316 return true
18317 }
18318 }
18319 break
18320 }
18321
18322
18323 for {
18324 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18325 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
18326 continue
18327 }
18328 v.reset(OpConst8)
18329 v.AuxInt = int8ToAuxInt(0)
18330 return true
18331 }
18332 break
18333 }
18334
18335
18336
18337 for {
18338 t := v.Type
18339 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18340 x := v_0
18341 if v_1.Op != OpConst8 {
18342 continue
18343 }
18344 c := auxIntToInt8(v_1.AuxInt)
18345 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
18346 continue
18347 }
18348 v.reset(OpLsh8x64)
18349 v.Type = t
18350 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18351 v0.AuxInt = int64ToAuxInt(log8(c))
18352 v.AddArg2(x, v0)
18353 return true
18354 }
18355 break
18356 }
18357
18358
18359
18360 for {
18361 t := v.Type
18362 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18363 x := v_0
18364 if v_1.Op != OpConst8 {
18365 continue
18366 }
18367 c := auxIntToInt8(v_1.AuxInt)
18368 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
18369 continue
18370 }
18371 v.reset(OpNeg8)
18372 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
18373 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18374 v1.AuxInt = int64ToAuxInt(log8(-c))
18375 v0.AddArg2(x, v1)
18376 v.AddArg(v0)
18377 return true
18378 }
18379 break
18380 }
18381
18382
18383
18384 for {
18385 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18386 if v_0.Op != OpMul8 {
18387 continue
18388 }
18389 _ = v_0.Args[1]
18390 v_0_0 := v_0.Args[0]
18391 v_0_1 := v_0.Args[1]
18392 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18393 i := v_0_0
18394 if i.Op != OpConst8 {
18395 continue
18396 }
18397 t := i.Type
18398 z := v_0_1
18399 x := v_1
18400 if !(z.Op != OpConst8 && x.Op != OpConst8) {
18401 continue
18402 }
18403 v.reset(OpMul8)
18404 v0 := b.NewValue0(v.Pos, OpMul8, t)
18405 v0.AddArg2(x, z)
18406 v.AddArg2(i, v0)
18407 return true
18408 }
18409 }
18410 break
18411 }
18412
18413
18414 for {
18415 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18416 if v_0.Op != OpConst8 {
18417 continue
18418 }
18419 t := v_0.Type
18420 c := auxIntToInt8(v_0.AuxInt)
18421 if v_1.Op != OpMul8 {
18422 continue
18423 }
18424 _ = v_1.Args[1]
18425 v_1_0 := v_1.Args[0]
18426 v_1_1 := v_1.Args[1]
18427 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18428 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
18429 continue
18430 }
18431 d := auxIntToInt8(v_1_0.AuxInt)
18432 x := v_1_1
18433 v.reset(OpMul8)
18434 v0 := b.NewValue0(v.Pos, OpConst8, t)
18435 v0.AuxInt = int8ToAuxInt(c * d)
18436 v.AddArg2(v0, x)
18437 return true
18438 }
18439 }
18440 break
18441 }
18442 return false
18443 }
18444 func rewriteValuegeneric_OpNeg16(v *Value) bool {
18445 v_0 := v.Args[0]
18446 b := v.Block
18447
18448
18449 for {
18450 if v_0.Op != OpConst16 {
18451 break
18452 }
18453 c := auxIntToInt16(v_0.AuxInt)
18454 v.reset(OpConst16)
18455 v.AuxInt = int16ToAuxInt(-c)
18456 return true
18457 }
18458
18459
18460 for {
18461 if v_0.Op != OpMul16 {
18462 break
18463 }
18464 _ = v_0.Args[1]
18465 v_0_0 := v_0.Args[0]
18466 v_0_1 := v_0.Args[1]
18467 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18468 x := v_0_0
18469 if v_0_1.Op != OpConst16 {
18470 continue
18471 }
18472 t := v_0_1.Type
18473 c := auxIntToInt16(v_0_1.AuxInt)
18474 v.reset(OpMul16)
18475 v0 := b.NewValue0(v.Pos, OpConst16, t)
18476 v0.AuxInt = int16ToAuxInt(-c)
18477 v.AddArg2(x, v0)
18478 return true
18479 }
18480 break
18481 }
18482
18483
18484 for {
18485 if v_0.Op != OpMul16 {
18486 break
18487 }
18488 _ = v_0.Args[1]
18489 v_0_0 := v_0.Args[0]
18490 v_0_1 := v_0.Args[1]
18491 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18492 x := v_0_0
18493 if v_0_1.Op != OpNeg16 {
18494 continue
18495 }
18496 y := v_0_1.Args[0]
18497 v.reset(OpMul16)
18498 v.AddArg2(x, y)
18499 return true
18500 }
18501 break
18502 }
18503
18504
18505 for {
18506 if v_0.Op != OpSub16 {
18507 break
18508 }
18509 y := v_0.Args[1]
18510 x := v_0.Args[0]
18511 v.reset(OpSub16)
18512 v.AddArg2(y, x)
18513 return true
18514 }
18515
18516
18517 for {
18518 if v_0.Op != OpNeg16 {
18519 break
18520 }
18521 x := v_0.Args[0]
18522 v.copyOf(x)
18523 return true
18524 }
18525
18526
18527 for {
18528 t := v.Type
18529 if v_0.Op != OpCom16 {
18530 break
18531 }
18532 x := v_0.Args[0]
18533 v.reset(OpAdd16)
18534 v0 := b.NewValue0(v.Pos, OpConst16, t)
18535 v0.AuxInt = int16ToAuxInt(1)
18536 v.AddArg2(v0, x)
18537 return true
18538 }
18539 return false
18540 }
18541 func rewriteValuegeneric_OpNeg32(v *Value) bool {
18542 v_0 := v.Args[0]
18543 b := v.Block
18544
18545
18546 for {
18547 if v_0.Op != OpConst32 {
18548 break
18549 }
18550 c := auxIntToInt32(v_0.AuxInt)
18551 v.reset(OpConst32)
18552 v.AuxInt = int32ToAuxInt(-c)
18553 return true
18554 }
18555
18556
18557 for {
18558 if v_0.Op != OpMul32 {
18559 break
18560 }
18561 _ = v_0.Args[1]
18562 v_0_0 := v_0.Args[0]
18563 v_0_1 := v_0.Args[1]
18564 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18565 x := v_0_0
18566 if v_0_1.Op != OpConst32 {
18567 continue
18568 }
18569 t := v_0_1.Type
18570 c := auxIntToInt32(v_0_1.AuxInt)
18571 v.reset(OpMul32)
18572 v0 := b.NewValue0(v.Pos, OpConst32, t)
18573 v0.AuxInt = int32ToAuxInt(-c)
18574 v.AddArg2(x, v0)
18575 return true
18576 }
18577 break
18578 }
18579
18580
18581 for {
18582 if v_0.Op != OpMul32 {
18583 break
18584 }
18585 _ = v_0.Args[1]
18586 v_0_0 := v_0.Args[0]
18587 v_0_1 := v_0.Args[1]
18588 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18589 x := v_0_0
18590 if v_0_1.Op != OpNeg32 {
18591 continue
18592 }
18593 y := v_0_1.Args[0]
18594 v.reset(OpMul32)
18595 v.AddArg2(x, y)
18596 return true
18597 }
18598 break
18599 }
18600
18601
18602 for {
18603 if v_0.Op != OpSub32 {
18604 break
18605 }
18606 y := v_0.Args[1]
18607 x := v_0.Args[0]
18608 v.reset(OpSub32)
18609 v.AddArg2(y, x)
18610 return true
18611 }
18612
18613
18614 for {
18615 if v_0.Op != OpNeg32 {
18616 break
18617 }
18618 x := v_0.Args[0]
18619 v.copyOf(x)
18620 return true
18621 }
18622
18623
18624 for {
18625 t := v.Type
18626 if v_0.Op != OpCom32 {
18627 break
18628 }
18629 x := v_0.Args[0]
18630 v.reset(OpAdd32)
18631 v0 := b.NewValue0(v.Pos, OpConst32, t)
18632 v0.AuxInt = int32ToAuxInt(1)
18633 v.AddArg2(v0, x)
18634 return true
18635 }
18636 return false
18637 }
18638 func rewriteValuegeneric_OpNeg32F(v *Value) bool {
18639 v_0 := v.Args[0]
18640
18641
18642
18643 for {
18644 if v_0.Op != OpConst32F {
18645 break
18646 }
18647 c := auxIntToFloat32(v_0.AuxInt)
18648 if !(c != 0) {
18649 break
18650 }
18651 v.reset(OpConst32F)
18652 v.AuxInt = float32ToAuxInt(-c)
18653 return true
18654 }
18655 return false
18656 }
18657 func rewriteValuegeneric_OpNeg64(v *Value) bool {
18658 v_0 := v.Args[0]
18659 b := v.Block
18660
18661
18662 for {
18663 if v_0.Op != OpConst64 {
18664 break
18665 }
18666 c := auxIntToInt64(v_0.AuxInt)
18667 v.reset(OpConst64)
18668 v.AuxInt = int64ToAuxInt(-c)
18669 return true
18670 }
18671
18672
18673 for {
18674 if v_0.Op != OpMul64 {
18675 break
18676 }
18677 _ = v_0.Args[1]
18678 v_0_0 := v_0.Args[0]
18679 v_0_1 := v_0.Args[1]
18680 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18681 x := v_0_0
18682 if v_0_1.Op != OpConst64 {
18683 continue
18684 }
18685 t := v_0_1.Type
18686 c := auxIntToInt64(v_0_1.AuxInt)
18687 v.reset(OpMul64)
18688 v0 := b.NewValue0(v.Pos, OpConst64, t)
18689 v0.AuxInt = int64ToAuxInt(-c)
18690 v.AddArg2(x, v0)
18691 return true
18692 }
18693 break
18694 }
18695
18696
18697 for {
18698 if v_0.Op != OpMul64 {
18699 break
18700 }
18701 _ = v_0.Args[1]
18702 v_0_0 := v_0.Args[0]
18703 v_0_1 := v_0.Args[1]
18704 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18705 x := v_0_0
18706 if v_0_1.Op != OpNeg64 {
18707 continue
18708 }
18709 y := v_0_1.Args[0]
18710 v.reset(OpMul64)
18711 v.AddArg2(x, y)
18712 return true
18713 }
18714 break
18715 }
18716
18717
18718 for {
18719 if v_0.Op != OpSub64 {
18720 break
18721 }
18722 y := v_0.Args[1]
18723 x := v_0.Args[0]
18724 v.reset(OpSub64)
18725 v.AddArg2(y, x)
18726 return true
18727 }
18728
18729
18730 for {
18731 if v_0.Op != OpNeg64 {
18732 break
18733 }
18734 x := v_0.Args[0]
18735 v.copyOf(x)
18736 return true
18737 }
18738
18739
18740 for {
18741 t := v.Type
18742 if v_0.Op != OpCom64 {
18743 break
18744 }
18745 x := v_0.Args[0]
18746 v.reset(OpAdd64)
18747 v0 := b.NewValue0(v.Pos, OpConst64, t)
18748 v0.AuxInt = int64ToAuxInt(1)
18749 v.AddArg2(v0, x)
18750 return true
18751 }
18752 return false
18753 }
18754 func rewriteValuegeneric_OpNeg64F(v *Value) bool {
18755 v_0 := v.Args[0]
18756
18757
18758
18759 for {
18760 if v_0.Op != OpConst64F {
18761 break
18762 }
18763 c := auxIntToFloat64(v_0.AuxInt)
18764 if !(c != 0) {
18765 break
18766 }
18767 v.reset(OpConst64F)
18768 v.AuxInt = float64ToAuxInt(-c)
18769 return true
18770 }
18771 return false
18772 }
18773 func rewriteValuegeneric_OpNeg8(v *Value) bool {
18774 v_0 := v.Args[0]
18775 b := v.Block
18776
18777
18778 for {
18779 if v_0.Op != OpConst8 {
18780 break
18781 }
18782 c := auxIntToInt8(v_0.AuxInt)
18783 v.reset(OpConst8)
18784 v.AuxInt = int8ToAuxInt(-c)
18785 return true
18786 }
18787
18788
18789 for {
18790 if v_0.Op != OpMul8 {
18791 break
18792 }
18793 _ = v_0.Args[1]
18794 v_0_0 := v_0.Args[0]
18795 v_0_1 := v_0.Args[1]
18796 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18797 x := v_0_0
18798 if v_0_1.Op != OpConst8 {
18799 continue
18800 }
18801 t := v_0_1.Type
18802 c := auxIntToInt8(v_0_1.AuxInt)
18803 v.reset(OpMul8)
18804 v0 := b.NewValue0(v.Pos, OpConst8, t)
18805 v0.AuxInt = int8ToAuxInt(-c)
18806 v.AddArg2(x, v0)
18807 return true
18808 }
18809 break
18810 }
18811
18812
18813 for {
18814 if v_0.Op != OpMul8 {
18815 break
18816 }
18817 _ = v_0.Args[1]
18818 v_0_0 := v_0.Args[0]
18819 v_0_1 := v_0.Args[1]
18820 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18821 x := v_0_0
18822 if v_0_1.Op != OpNeg8 {
18823 continue
18824 }
18825 y := v_0_1.Args[0]
18826 v.reset(OpMul8)
18827 v.AddArg2(x, y)
18828 return true
18829 }
18830 break
18831 }
18832
18833
18834 for {
18835 if v_0.Op != OpSub8 {
18836 break
18837 }
18838 y := v_0.Args[1]
18839 x := v_0.Args[0]
18840 v.reset(OpSub8)
18841 v.AddArg2(y, x)
18842 return true
18843 }
18844
18845
18846 for {
18847 if v_0.Op != OpNeg8 {
18848 break
18849 }
18850 x := v_0.Args[0]
18851 v.copyOf(x)
18852 return true
18853 }
18854
18855
18856 for {
18857 t := v.Type
18858 if v_0.Op != OpCom8 {
18859 break
18860 }
18861 x := v_0.Args[0]
18862 v.reset(OpAdd8)
18863 v0 := b.NewValue0(v.Pos, OpConst8, t)
18864 v0.AuxInt = int8ToAuxInt(1)
18865 v.AddArg2(v0, x)
18866 return true
18867 }
18868 return false
18869 }
18870 func rewriteValuegeneric_OpNeq16(v *Value) bool {
18871 v_1 := v.Args[1]
18872 v_0 := v.Args[0]
18873 b := v.Block
18874
18875
18876 for {
18877 x := v_0
18878 if x != v_1 {
18879 break
18880 }
18881 v.reset(OpConstBool)
18882 v.AuxInt = boolToAuxInt(false)
18883 return true
18884 }
18885
18886
18887 for {
18888 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18889 if v_0.Op != OpConst16 {
18890 continue
18891 }
18892 t := v_0.Type
18893 c := auxIntToInt16(v_0.AuxInt)
18894 if v_1.Op != OpAdd16 {
18895 continue
18896 }
18897 _ = v_1.Args[1]
18898 v_1_0 := v_1.Args[0]
18899 v_1_1 := v_1.Args[1]
18900 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18901 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
18902 continue
18903 }
18904 d := auxIntToInt16(v_1_0.AuxInt)
18905 x := v_1_1
18906 v.reset(OpNeq16)
18907 v0 := b.NewValue0(v.Pos, OpConst16, t)
18908 v0.AuxInt = int16ToAuxInt(c - d)
18909 v.AddArg2(v0, x)
18910 return true
18911 }
18912 }
18913 break
18914 }
18915
18916
18917 for {
18918 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18919 if v_0.Op != OpConst16 {
18920 continue
18921 }
18922 c := auxIntToInt16(v_0.AuxInt)
18923 if v_1.Op != OpConst16 {
18924 continue
18925 }
18926 d := auxIntToInt16(v_1.AuxInt)
18927 v.reset(OpConstBool)
18928 v.AuxInt = boolToAuxInt(c != d)
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 s := v_0
18939 if s.Op != OpSub16 {
18940 continue
18941 }
18942 y := s.Args[1]
18943 x := s.Args[0]
18944 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(s.Uses == 1) {
18945 continue
18946 }
18947 v.reset(OpNeq16)
18948 v.AddArg2(x, y)
18949 return true
18950 }
18951 break
18952 }
18953
18954
18955
18956 for {
18957 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18958 if v_0.Op != OpAnd16 {
18959 continue
18960 }
18961 t := v_0.Type
18962 _ = v_0.Args[1]
18963 v_0_0 := v_0.Args[0]
18964 v_0_1 := v_0.Args[1]
18965 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18966 x := v_0_0
18967 if v_0_1.Op != OpConst16 || v_0_1.Type != t {
18968 continue
18969 }
18970 y := auxIntToInt16(v_0_1.AuxInt)
18971 if v_1.Op != OpConst16 || v_1.Type != t || auxIntToInt16(v_1.AuxInt) != y || !(oneBit(y)) {
18972 continue
18973 }
18974 v.reset(OpEq16)
18975 v0 := b.NewValue0(v.Pos, OpAnd16, t)
18976 v1 := b.NewValue0(v.Pos, OpConst16, t)
18977 v1.AuxInt = int16ToAuxInt(y)
18978 v0.AddArg2(x, v1)
18979 v2 := b.NewValue0(v.Pos, OpConst16, t)
18980 v2.AuxInt = int16ToAuxInt(0)
18981 v.AddArg2(v0, v2)
18982 return true
18983 }
18984 }
18985 break
18986 }
18987
18988
18989 for {
18990 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18991 if v_0.Op != OpZeroExt8to16 {
18992 continue
18993 }
18994 v_0_0 := v_0.Args[0]
18995 if v_0_0.Op != OpCvtBoolToUint8 {
18996 continue
18997 }
18998 x := v_0_0.Args[0]
18999 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
19000 continue
19001 }
19002 v.copyOf(x)
19003 return true
19004 }
19005 break
19006 }
19007
19008
19009 for {
19010 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19011 if v_0.Op != OpZeroExt8to16 {
19012 continue
19013 }
19014 v_0_0 := v_0.Args[0]
19015 if v_0_0.Op != OpCvtBoolToUint8 {
19016 continue
19017 }
19018 x := v_0_0.Args[0]
19019 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
19020 continue
19021 }
19022 v.reset(OpNot)
19023 v.AddArg(x)
19024 return true
19025 }
19026 break
19027 }
19028
19029
19030 for {
19031 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19032 if v_0.Op != OpSignExt8to16 {
19033 continue
19034 }
19035 v_0_0 := v_0.Args[0]
19036 if v_0_0.Op != OpCvtBoolToUint8 {
19037 continue
19038 }
19039 x := v_0_0.Args[0]
19040 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
19041 continue
19042 }
19043 v.copyOf(x)
19044 return true
19045 }
19046 break
19047 }
19048
19049
19050 for {
19051 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19052 if v_0.Op != OpSignExt8to16 {
19053 continue
19054 }
19055 v_0_0 := v_0.Args[0]
19056 if v_0_0.Op != OpCvtBoolToUint8 {
19057 continue
19058 }
19059 x := v_0_0.Args[0]
19060 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
19061 continue
19062 }
19063 v.reset(OpNot)
19064 v.AddArg(x)
19065 return true
19066 }
19067 break
19068 }
19069 return false
19070 }
19071 func rewriteValuegeneric_OpNeq32(v *Value) bool {
19072 v_1 := v.Args[1]
19073 v_0 := v.Args[0]
19074 b := v.Block
19075
19076
19077 for {
19078 x := v_0
19079 if x != v_1 {
19080 break
19081 }
19082 v.reset(OpConstBool)
19083 v.AuxInt = boolToAuxInt(false)
19084 return true
19085 }
19086
19087
19088 for {
19089 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19090 if v_0.Op != OpConst32 {
19091 continue
19092 }
19093 t := v_0.Type
19094 c := auxIntToInt32(v_0.AuxInt)
19095 if v_1.Op != OpAdd32 {
19096 continue
19097 }
19098 _ = v_1.Args[1]
19099 v_1_0 := v_1.Args[0]
19100 v_1_1 := v_1.Args[1]
19101 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19102 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
19103 continue
19104 }
19105 d := auxIntToInt32(v_1_0.AuxInt)
19106 x := v_1_1
19107 v.reset(OpNeq32)
19108 v0 := b.NewValue0(v.Pos, OpConst32, t)
19109 v0.AuxInt = int32ToAuxInt(c - d)
19110 v.AddArg2(v0, x)
19111 return true
19112 }
19113 }
19114 break
19115 }
19116
19117
19118 for {
19119 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19120 if v_0.Op != OpConst32 {
19121 continue
19122 }
19123 c := auxIntToInt32(v_0.AuxInt)
19124 if v_1.Op != OpConst32 {
19125 continue
19126 }
19127 d := auxIntToInt32(v_1.AuxInt)
19128 v.reset(OpConstBool)
19129 v.AuxInt = boolToAuxInt(c != d)
19130 return true
19131 }
19132 break
19133 }
19134
19135
19136
19137 for {
19138 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19139 s := v_0
19140 if s.Op != OpSub32 {
19141 continue
19142 }
19143 y := s.Args[1]
19144 x := s.Args[0]
19145 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 || !(s.Uses == 1) {
19146 continue
19147 }
19148 v.reset(OpNeq32)
19149 v.AddArg2(x, y)
19150 return true
19151 }
19152 break
19153 }
19154
19155
19156
19157 for {
19158 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19159 if v_0.Op != OpAnd32 {
19160 continue
19161 }
19162 t := v_0.Type
19163 _ = v_0.Args[1]
19164 v_0_0 := v_0.Args[0]
19165 v_0_1 := v_0.Args[1]
19166 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19167 x := v_0_0
19168 if v_0_1.Op != OpConst32 || v_0_1.Type != t {
19169 continue
19170 }
19171 y := auxIntToInt32(v_0_1.AuxInt)
19172 if v_1.Op != OpConst32 || v_1.Type != t || auxIntToInt32(v_1.AuxInt) != y || !(oneBit(y)) {
19173 continue
19174 }
19175 v.reset(OpEq32)
19176 v0 := b.NewValue0(v.Pos, OpAnd32, t)
19177 v1 := b.NewValue0(v.Pos, OpConst32, t)
19178 v1.AuxInt = int32ToAuxInt(y)
19179 v0.AddArg2(x, v1)
19180 v2 := b.NewValue0(v.Pos, OpConst32, t)
19181 v2.AuxInt = int32ToAuxInt(0)
19182 v.AddArg2(v0, v2)
19183 return true
19184 }
19185 }
19186 break
19187 }
19188
19189
19190 for {
19191 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19192 if v_0.Op != OpZeroExt8to32 {
19193 continue
19194 }
19195 v_0_0 := v_0.Args[0]
19196 if v_0_0.Op != OpCvtBoolToUint8 {
19197 continue
19198 }
19199 x := v_0_0.Args[0]
19200 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
19201 continue
19202 }
19203 v.copyOf(x)
19204 return true
19205 }
19206 break
19207 }
19208
19209
19210 for {
19211 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19212 if v_0.Op != OpZeroExt8to32 {
19213 continue
19214 }
19215 v_0_0 := v_0.Args[0]
19216 if v_0_0.Op != OpCvtBoolToUint8 {
19217 continue
19218 }
19219 x := v_0_0.Args[0]
19220 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
19221 continue
19222 }
19223 v.reset(OpNot)
19224 v.AddArg(x)
19225 return true
19226 }
19227 break
19228 }
19229
19230
19231 for {
19232 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19233 if v_0.Op != OpSignExt8to32 {
19234 continue
19235 }
19236 v_0_0 := v_0.Args[0]
19237 if v_0_0.Op != OpCvtBoolToUint8 {
19238 continue
19239 }
19240 x := v_0_0.Args[0]
19241 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
19242 continue
19243 }
19244 v.copyOf(x)
19245 return true
19246 }
19247 break
19248 }
19249
19250
19251 for {
19252 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19253 if v_0.Op != OpSignExt8to32 {
19254 continue
19255 }
19256 v_0_0 := v_0.Args[0]
19257 if v_0_0.Op != OpCvtBoolToUint8 {
19258 continue
19259 }
19260 x := v_0_0.Args[0]
19261 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
19262 continue
19263 }
19264 v.reset(OpNot)
19265 v.AddArg(x)
19266 return true
19267 }
19268 break
19269 }
19270 return false
19271 }
19272 func rewriteValuegeneric_OpNeq32F(v *Value) bool {
19273 v_1 := v.Args[1]
19274 v_0 := v.Args[0]
19275
19276
19277 for {
19278 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19279 if v_0.Op != OpConst32F {
19280 continue
19281 }
19282 c := auxIntToFloat32(v_0.AuxInt)
19283 if v_1.Op != OpConst32F {
19284 continue
19285 }
19286 d := auxIntToFloat32(v_1.AuxInt)
19287 v.reset(OpConstBool)
19288 v.AuxInt = boolToAuxInt(c != d)
19289 return true
19290 }
19291 break
19292 }
19293 return false
19294 }
19295 func rewriteValuegeneric_OpNeq64(v *Value) bool {
19296 v_1 := v.Args[1]
19297 v_0 := v.Args[0]
19298 b := v.Block
19299
19300
19301 for {
19302 x := v_0
19303 if x != v_1 {
19304 break
19305 }
19306 v.reset(OpConstBool)
19307 v.AuxInt = boolToAuxInt(false)
19308 return true
19309 }
19310
19311
19312 for {
19313 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19314 if v_0.Op != OpConst64 {
19315 continue
19316 }
19317 t := v_0.Type
19318 c := auxIntToInt64(v_0.AuxInt)
19319 if v_1.Op != OpAdd64 {
19320 continue
19321 }
19322 _ = v_1.Args[1]
19323 v_1_0 := v_1.Args[0]
19324 v_1_1 := v_1.Args[1]
19325 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19326 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
19327 continue
19328 }
19329 d := auxIntToInt64(v_1_0.AuxInt)
19330 x := v_1_1
19331 v.reset(OpNeq64)
19332 v0 := b.NewValue0(v.Pos, OpConst64, t)
19333 v0.AuxInt = int64ToAuxInt(c - d)
19334 v.AddArg2(v0, x)
19335 return true
19336 }
19337 }
19338 break
19339 }
19340
19341
19342 for {
19343 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19344 if v_0.Op != OpConst64 {
19345 continue
19346 }
19347 c := auxIntToInt64(v_0.AuxInt)
19348 if v_1.Op != OpConst64 {
19349 continue
19350 }
19351 d := auxIntToInt64(v_1.AuxInt)
19352 v.reset(OpConstBool)
19353 v.AuxInt = boolToAuxInt(c != d)
19354 return true
19355 }
19356 break
19357 }
19358
19359
19360
19361 for {
19362 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19363 s := v_0
19364 if s.Op != OpSub64 {
19365 continue
19366 }
19367 y := s.Args[1]
19368 x := s.Args[0]
19369 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 || !(s.Uses == 1) {
19370 continue
19371 }
19372 v.reset(OpNeq64)
19373 v.AddArg2(x, y)
19374 return true
19375 }
19376 break
19377 }
19378
19379
19380
19381 for {
19382 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19383 if v_0.Op != OpAnd64 {
19384 continue
19385 }
19386 t := v_0.Type
19387 _ = v_0.Args[1]
19388 v_0_0 := v_0.Args[0]
19389 v_0_1 := v_0.Args[1]
19390 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19391 x := v_0_0
19392 if v_0_1.Op != OpConst64 || v_0_1.Type != t {
19393 continue
19394 }
19395 y := auxIntToInt64(v_0_1.AuxInt)
19396 if v_1.Op != OpConst64 || v_1.Type != t || auxIntToInt64(v_1.AuxInt) != y || !(oneBit(y)) {
19397 continue
19398 }
19399 v.reset(OpEq64)
19400 v0 := b.NewValue0(v.Pos, OpAnd64, t)
19401 v1 := b.NewValue0(v.Pos, OpConst64, t)
19402 v1.AuxInt = int64ToAuxInt(y)
19403 v0.AddArg2(x, v1)
19404 v2 := b.NewValue0(v.Pos, OpConst64, t)
19405 v2.AuxInt = int64ToAuxInt(0)
19406 v.AddArg2(v0, v2)
19407 return true
19408 }
19409 }
19410 break
19411 }
19412
19413
19414 for {
19415 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19416 if v_0.Op != OpZeroExt8to64 {
19417 continue
19418 }
19419 v_0_0 := v_0.Args[0]
19420 if v_0_0.Op != OpCvtBoolToUint8 {
19421 continue
19422 }
19423 x := v_0_0.Args[0]
19424 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
19425 continue
19426 }
19427 v.copyOf(x)
19428 return true
19429 }
19430 break
19431 }
19432
19433
19434 for {
19435 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19436 if v_0.Op != OpZeroExt8to64 {
19437 continue
19438 }
19439 v_0_0 := v_0.Args[0]
19440 if v_0_0.Op != OpCvtBoolToUint8 {
19441 continue
19442 }
19443 x := v_0_0.Args[0]
19444 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
19445 continue
19446 }
19447 v.reset(OpNot)
19448 v.AddArg(x)
19449 return true
19450 }
19451 break
19452 }
19453
19454
19455 for {
19456 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19457 if v_0.Op != OpSignExt8to64 {
19458 continue
19459 }
19460 v_0_0 := v_0.Args[0]
19461 if v_0_0.Op != OpCvtBoolToUint8 {
19462 continue
19463 }
19464 x := v_0_0.Args[0]
19465 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
19466 continue
19467 }
19468 v.copyOf(x)
19469 return true
19470 }
19471 break
19472 }
19473
19474
19475 for {
19476 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19477 if v_0.Op != OpSignExt8to64 {
19478 continue
19479 }
19480 v_0_0 := v_0.Args[0]
19481 if v_0_0.Op != OpCvtBoolToUint8 {
19482 continue
19483 }
19484 x := v_0_0.Args[0]
19485 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
19486 continue
19487 }
19488 v.reset(OpNot)
19489 v.AddArg(x)
19490 return true
19491 }
19492 break
19493 }
19494 return false
19495 }
19496 func rewriteValuegeneric_OpNeq64F(v *Value) bool {
19497 v_1 := v.Args[1]
19498 v_0 := v.Args[0]
19499
19500
19501 for {
19502 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19503 if v_0.Op != OpConst64F {
19504 continue
19505 }
19506 c := auxIntToFloat64(v_0.AuxInt)
19507 if v_1.Op != OpConst64F {
19508 continue
19509 }
19510 d := auxIntToFloat64(v_1.AuxInt)
19511 v.reset(OpConstBool)
19512 v.AuxInt = boolToAuxInt(c != d)
19513 return true
19514 }
19515 break
19516 }
19517 return false
19518 }
19519 func rewriteValuegeneric_OpNeq8(v *Value) bool {
19520 v_1 := v.Args[1]
19521 v_0 := v.Args[0]
19522 b := v.Block
19523
19524
19525 for {
19526 x := v_0
19527 if x != v_1 {
19528 break
19529 }
19530 v.reset(OpConstBool)
19531 v.AuxInt = boolToAuxInt(false)
19532 return true
19533 }
19534
19535
19536 for {
19537 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19538 if v_0.Op != OpConst8 {
19539 continue
19540 }
19541 t := v_0.Type
19542 c := auxIntToInt8(v_0.AuxInt)
19543 if v_1.Op != OpAdd8 {
19544 continue
19545 }
19546 _ = v_1.Args[1]
19547 v_1_0 := v_1.Args[0]
19548 v_1_1 := v_1.Args[1]
19549 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19550 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
19551 continue
19552 }
19553 d := auxIntToInt8(v_1_0.AuxInt)
19554 x := v_1_1
19555 v.reset(OpNeq8)
19556 v0 := b.NewValue0(v.Pos, OpConst8, t)
19557 v0.AuxInt = int8ToAuxInt(c - d)
19558 v.AddArg2(v0, x)
19559 return true
19560 }
19561 }
19562 break
19563 }
19564
19565
19566 for {
19567 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19568 if v_0.Op != OpConst8 {
19569 continue
19570 }
19571 c := auxIntToInt8(v_0.AuxInt)
19572 if v_1.Op != OpConst8 {
19573 continue
19574 }
19575 d := auxIntToInt8(v_1.AuxInt)
19576 v.reset(OpConstBool)
19577 v.AuxInt = boolToAuxInt(c != d)
19578 return true
19579 }
19580 break
19581 }
19582
19583
19584
19585 for {
19586 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19587 s := v_0
19588 if s.Op != OpSub8 {
19589 continue
19590 }
19591 y := s.Args[1]
19592 x := s.Args[0]
19593 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(s.Uses == 1) {
19594 continue
19595 }
19596 v.reset(OpNeq8)
19597 v.AddArg2(x, y)
19598 return true
19599 }
19600 break
19601 }
19602
19603
19604
19605 for {
19606 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19607 if v_0.Op != OpAnd8 {
19608 continue
19609 }
19610 t := v_0.Type
19611 _ = v_0.Args[1]
19612 v_0_0 := v_0.Args[0]
19613 v_0_1 := v_0.Args[1]
19614 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19615 x := v_0_0
19616 if v_0_1.Op != OpConst8 || v_0_1.Type != t {
19617 continue
19618 }
19619 y := auxIntToInt8(v_0_1.AuxInt)
19620 if v_1.Op != OpConst8 || v_1.Type != t || auxIntToInt8(v_1.AuxInt) != y || !(oneBit(y)) {
19621 continue
19622 }
19623 v.reset(OpEq8)
19624 v0 := b.NewValue0(v.Pos, OpAnd8, t)
19625 v1 := b.NewValue0(v.Pos, OpConst8, t)
19626 v1.AuxInt = int8ToAuxInt(y)
19627 v0.AddArg2(x, v1)
19628 v2 := b.NewValue0(v.Pos, OpConst8, t)
19629 v2.AuxInt = int8ToAuxInt(0)
19630 v.AddArg2(v0, v2)
19631 return true
19632 }
19633 }
19634 break
19635 }
19636
19637
19638 for {
19639 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19640 if v_0.Op != OpCvtBoolToUint8 {
19641 continue
19642 }
19643 x := v_0.Args[0]
19644 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
19645 continue
19646 }
19647 v.copyOf(x)
19648 return true
19649 }
19650 break
19651 }
19652
19653
19654 for {
19655 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19656 if v_0.Op != OpCvtBoolToUint8 {
19657 continue
19658 }
19659 x := v_0.Args[0]
19660 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 1 {
19661 continue
19662 }
19663 v.reset(OpNot)
19664 v.AddArg(x)
19665 return true
19666 }
19667 break
19668 }
19669 return false
19670 }
19671 func rewriteValuegeneric_OpNeqB(v *Value) bool {
19672 v_1 := v.Args[1]
19673 v_0 := v.Args[0]
19674
19675
19676 for {
19677 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19678 if v_0.Op != OpConstBool {
19679 continue
19680 }
19681 c := auxIntToBool(v_0.AuxInt)
19682 if v_1.Op != OpConstBool {
19683 continue
19684 }
19685 d := auxIntToBool(v_1.AuxInt)
19686 v.reset(OpConstBool)
19687 v.AuxInt = boolToAuxInt(c != d)
19688 return true
19689 }
19690 break
19691 }
19692
19693
19694 for {
19695 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19696 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
19697 continue
19698 }
19699 x := v_1
19700 v.copyOf(x)
19701 return true
19702 }
19703 break
19704 }
19705
19706
19707 for {
19708 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19709 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
19710 continue
19711 }
19712 x := v_1
19713 v.reset(OpNot)
19714 v.AddArg(x)
19715 return true
19716 }
19717 break
19718 }
19719
19720
19721 for {
19722 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19723 if v_0.Op != OpNot {
19724 continue
19725 }
19726 x := v_0.Args[0]
19727 if v_1.Op != OpNot {
19728 continue
19729 }
19730 y := v_1.Args[0]
19731 v.reset(OpNeqB)
19732 v.AddArg2(x, y)
19733 return true
19734 }
19735 break
19736 }
19737 return false
19738 }
19739 func rewriteValuegeneric_OpNeqInter(v *Value) bool {
19740 v_1 := v.Args[1]
19741 v_0 := v.Args[0]
19742 b := v.Block
19743 typ := &b.Func.Config.Types
19744
19745
19746 for {
19747 x := v_0
19748 y := v_1
19749 v.reset(OpNeqPtr)
19750 v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
19751 v0.AddArg(x)
19752 v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
19753 v1.AddArg(y)
19754 v.AddArg2(v0, v1)
19755 return true
19756 }
19757 }
19758 func rewriteValuegeneric_OpNeqPtr(v *Value) bool {
19759 v_1 := v.Args[1]
19760 v_0 := v.Args[0]
19761
19762
19763 for {
19764 x := v_0
19765 if x != v_1 {
19766 break
19767 }
19768 v.reset(OpConstBool)
19769 v.AuxInt = boolToAuxInt(false)
19770 return true
19771 }
19772
19773
19774 for {
19775 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19776 if v_0.Op != OpAddr {
19777 continue
19778 }
19779 x := auxToSym(v_0.Aux)
19780 if v_1.Op != OpAddr {
19781 continue
19782 }
19783 y := auxToSym(v_1.Aux)
19784 v.reset(OpConstBool)
19785 v.AuxInt = boolToAuxInt(x != y)
19786 return true
19787 }
19788 break
19789 }
19790
19791
19792 for {
19793 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19794 if v_0.Op != OpAddr {
19795 continue
19796 }
19797 x := auxToSym(v_0.Aux)
19798 if v_1.Op != OpOffPtr {
19799 continue
19800 }
19801 o := auxIntToInt64(v_1.AuxInt)
19802 v_1_0 := v_1.Args[0]
19803 if v_1_0.Op != OpAddr {
19804 continue
19805 }
19806 y := auxToSym(v_1_0.Aux)
19807 v.reset(OpConstBool)
19808 v.AuxInt = boolToAuxInt(x != y || o != 0)
19809 return true
19810 }
19811 break
19812 }
19813
19814
19815 for {
19816 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19817 if v_0.Op != OpOffPtr {
19818 continue
19819 }
19820 o1 := auxIntToInt64(v_0.AuxInt)
19821 v_0_0 := v_0.Args[0]
19822 if v_0_0.Op != OpAddr {
19823 continue
19824 }
19825 x := auxToSym(v_0_0.Aux)
19826 if v_1.Op != OpOffPtr {
19827 continue
19828 }
19829 o2 := auxIntToInt64(v_1.AuxInt)
19830 v_1_0 := v_1.Args[0]
19831 if v_1_0.Op != OpAddr {
19832 continue
19833 }
19834 y := auxToSym(v_1_0.Aux)
19835 v.reset(OpConstBool)
19836 v.AuxInt = boolToAuxInt(x != y || o1 != o2)
19837 return true
19838 }
19839 break
19840 }
19841
19842
19843 for {
19844 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19845 if v_0.Op != OpLocalAddr {
19846 continue
19847 }
19848 x := auxToSym(v_0.Aux)
19849 if v_1.Op != OpLocalAddr {
19850 continue
19851 }
19852 y := auxToSym(v_1.Aux)
19853 v.reset(OpConstBool)
19854 v.AuxInt = boolToAuxInt(x != y)
19855 return true
19856 }
19857 break
19858 }
19859
19860
19861 for {
19862 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19863 if v_0.Op != OpLocalAddr {
19864 continue
19865 }
19866 x := auxToSym(v_0.Aux)
19867 if v_1.Op != OpOffPtr {
19868 continue
19869 }
19870 o := auxIntToInt64(v_1.AuxInt)
19871 v_1_0 := v_1.Args[0]
19872 if v_1_0.Op != OpLocalAddr {
19873 continue
19874 }
19875 y := auxToSym(v_1_0.Aux)
19876 v.reset(OpConstBool)
19877 v.AuxInt = boolToAuxInt(x != y || o != 0)
19878 return true
19879 }
19880 break
19881 }
19882
19883
19884 for {
19885 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19886 if v_0.Op != OpOffPtr {
19887 continue
19888 }
19889 o1 := auxIntToInt64(v_0.AuxInt)
19890 v_0_0 := v_0.Args[0]
19891 if v_0_0.Op != OpLocalAddr {
19892 continue
19893 }
19894 x := auxToSym(v_0_0.Aux)
19895 if v_1.Op != OpOffPtr {
19896 continue
19897 }
19898 o2 := auxIntToInt64(v_1.AuxInt)
19899 v_1_0 := v_1.Args[0]
19900 if v_1_0.Op != OpLocalAddr {
19901 continue
19902 }
19903 y := auxToSym(v_1_0.Aux)
19904 v.reset(OpConstBool)
19905 v.AuxInt = boolToAuxInt(x != y || o1 != o2)
19906 return true
19907 }
19908 break
19909 }
19910
19911
19912
19913 for {
19914 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19915 if v_0.Op != OpOffPtr {
19916 continue
19917 }
19918 o1 := auxIntToInt64(v_0.AuxInt)
19919 p1 := v_0.Args[0]
19920 p2 := v_1
19921 if !(isSamePtr(p1, p2)) {
19922 continue
19923 }
19924 v.reset(OpConstBool)
19925 v.AuxInt = boolToAuxInt(o1 != 0)
19926 return true
19927 }
19928 break
19929 }
19930
19931
19932
19933 for {
19934 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19935 if v_0.Op != OpOffPtr {
19936 continue
19937 }
19938 o1 := auxIntToInt64(v_0.AuxInt)
19939 p1 := v_0.Args[0]
19940 if v_1.Op != OpOffPtr {
19941 continue
19942 }
19943 o2 := auxIntToInt64(v_1.AuxInt)
19944 p2 := v_1.Args[0]
19945 if !(isSamePtr(p1, p2)) {
19946 continue
19947 }
19948 v.reset(OpConstBool)
19949 v.AuxInt = boolToAuxInt(o1 != o2)
19950 return true
19951 }
19952 break
19953 }
19954
19955
19956 for {
19957 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19958 if v_0.Op != OpConst32 {
19959 continue
19960 }
19961 c := auxIntToInt32(v_0.AuxInt)
19962 if v_1.Op != OpConst32 {
19963 continue
19964 }
19965 d := auxIntToInt32(v_1.AuxInt)
19966 v.reset(OpConstBool)
19967 v.AuxInt = boolToAuxInt(c != d)
19968 return true
19969 }
19970 break
19971 }
19972
19973
19974 for {
19975 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19976 if v_0.Op != OpConst64 {
19977 continue
19978 }
19979 c := auxIntToInt64(v_0.AuxInt)
19980 if v_1.Op != OpConst64 {
19981 continue
19982 }
19983 d := auxIntToInt64(v_1.AuxInt)
19984 v.reset(OpConstBool)
19985 v.AuxInt = boolToAuxInt(c != d)
19986 return true
19987 }
19988 break
19989 }
19990
19991
19992 for {
19993 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19994 if v_0.Op != OpConvert {
19995 continue
19996 }
19997 v_0_0 := v_0.Args[0]
19998 if v_0_0.Op != OpAddr {
19999 continue
20000 }
20001 x := auxToSym(v_0_0.Aux)
20002 if v_1.Op != OpAddr {
20003 continue
20004 }
20005 y := auxToSym(v_1.Aux)
20006 v.reset(OpConstBool)
20007 v.AuxInt = boolToAuxInt(x != y)
20008 return true
20009 }
20010 break
20011 }
20012
20013
20014 for {
20015 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20016 if v_0.Op != OpLocalAddr || v_1.Op != OpAddr {
20017 continue
20018 }
20019 v.reset(OpConstBool)
20020 v.AuxInt = boolToAuxInt(true)
20021 return true
20022 }
20023 break
20024 }
20025
20026
20027 for {
20028 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20029 if v_0.Op != OpOffPtr {
20030 continue
20031 }
20032 v_0_0 := v_0.Args[0]
20033 if v_0_0.Op != OpLocalAddr || v_1.Op != OpAddr {
20034 continue
20035 }
20036 v.reset(OpConstBool)
20037 v.AuxInt = boolToAuxInt(true)
20038 return true
20039 }
20040 break
20041 }
20042
20043
20044 for {
20045 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20046 if v_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
20047 continue
20048 }
20049 v_1_0 := v_1.Args[0]
20050 if v_1_0.Op != OpAddr {
20051 continue
20052 }
20053 v.reset(OpConstBool)
20054 v.AuxInt = boolToAuxInt(true)
20055 return true
20056 }
20057 break
20058 }
20059
20060
20061 for {
20062 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20063 if v_0.Op != OpOffPtr {
20064 continue
20065 }
20066 v_0_0 := v_0.Args[0]
20067 if v_0_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
20068 continue
20069 }
20070 v_1_0 := v_1.Args[0]
20071 if v_1_0.Op != OpAddr {
20072 continue
20073 }
20074 v.reset(OpConstBool)
20075 v.AuxInt = boolToAuxInt(true)
20076 return true
20077 }
20078 break
20079 }
20080
20081
20082
20083 for {
20084 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20085 if v_0.Op != OpAddPtr {
20086 continue
20087 }
20088 o1 := v_0.Args[1]
20089 p1 := v_0.Args[0]
20090 p2 := v_1
20091 if !(isSamePtr(p1, p2)) {
20092 continue
20093 }
20094 v.reset(OpIsNonNil)
20095 v.AddArg(o1)
20096 return true
20097 }
20098 break
20099 }
20100
20101
20102 for {
20103 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20104 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
20105 continue
20106 }
20107 p := v_1
20108 v.reset(OpIsNonNil)
20109 v.AddArg(p)
20110 return true
20111 }
20112 break
20113 }
20114
20115
20116 for {
20117 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20118 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
20119 continue
20120 }
20121 p := v_1
20122 v.reset(OpIsNonNil)
20123 v.AddArg(p)
20124 return true
20125 }
20126 break
20127 }
20128
20129
20130 for {
20131 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20132 if v_0.Op != OpConstNil {
20133 continue
20134 }
20135 p := v_1
20136 v.reset(OpIsNonNil)
20137 v.AddArg(p)
20138 return true
20139 }
20140 break
20141 }
20142 return false
20143 }
20144 func rewriteValuegeneric_OpNeqSlice(v *Value) bool {
20145 v_1 := v.Args[1]
20146 v_0 := v.Args[0]
20147 b := v.Block
20148 typ := &b.Func.Config.Types
20149
20150
20151 for {
20152 x := v_0
20153 y := v_1
20154 v.reset(OpNeqPtr)
20155 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
20156 v0.AddArg(x)
20157 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
20158 v1.AddArg(y)
20159 v.AddArg2(v0, v1)
20160 return true
20161 }
20162 }
20163 func rewriteValuegeneric_OpNilCheck(v *Value) bool {
20164 v_1 := v.Args[1]
20165 v_0 := v.Args[0]
20166 b := v.Block
20167 fe := b.Func.fe
20168
20169
20170 for {
20171 ptr := v_0
20172 if ptr.Op != OpGetG {
20173 break
20174 }
20175 mem := ptr.Args[0]
20176 if mem != v_1 {
20177 break
20178 }
20179 v.copyOf(ptr)
20180 return true
20181 }
20182
20183
20184
20185 for {
20186 ptr := v_0
20187 if ptr.Op != OpSelectN || auxIntToInt64(ptr.AuxInt) != 0 {
20188 break
20189 }
20190 call := ptr.Args[0]
20191 if call.Op != OpStaticLECall {
20192 break
20193 }
20194 if !(isMalloc(call.Aux) && warnRule(fe.Debug_checknil(), v, "removed nil check")) {
20195 break
20196 }
20197 v.copyOf(ptr)
20198 return true
20199 }
20200
20201
20202
20203 for {
20204 ptr := v_0
20205 if ptr.Op != OpOffPtr {
20206 break
20207 }
20208 ptr_0 := ptr.Args[0]
20209 if ptr_0.Op != OpSelectN || auxIntToInt64(ptr_0.AuxInt) != 0 {
20210 break
20211 }
20212 call := ptr_0.Args[0]
20213 if call.Op != OpStaticLECall {
20214 break
20215 }
20216 if !(isMalloc(call.Aux) && warnRule(fe.Debug_checknil(), v, "removed nil check")) {
20217 break
20218 }
20219 v.copyOf(ptr)
20220 return true
20221 }
20222
20223
20224 for {
20225 ptr := v_0
20226 if ptr.Op != OpAddr {
20227 break
20228 }
20229 ptr_0 := ptr.Args[0]
20230 if ptr_0.Op != OpSB {
20231 break
20232 }
20233 v.copyOf(ptr)
20234 return true
20235 }
20236
20237
20238 for {
20239 ptr := v_0
20240 if ptr.Op != OpConvert {
20241 break
20242 }
20243 ptr_0 := ptr.Args[0]
20244 if ptr_0.Op != OpAddr {
20245 break
20246 }
20247 ptr_0_0 := ptr_0.Args[0]
20248 if ptr_0_0.Op != OpSB {
20249 break
20250 }
20251 v.copyOf(ptr)
20252 return true
20253 }
20254
20255
20256
20257 for {
20258 ptr := v_0
20259 if ptr.Op != OpLocalAddr || !(warnRule(fe.Debug_checknil(), v, "removed nil check")) {
20260 break
20261 }
20262 v.copyOf(ptr)
20263 return true
20264 }
20265
20266
20267
20268 for {
20269 ptr := v_0
20270 if ptr.Op != OpArg {
20271 break
20272 }
20273 sym := auxToSym(ptr.Aux)
20274 if !(isDictArgSym(sym)) {
20275 break
20276 }
20277 v.copyOf(ptr)
20278 return true
20279 }
20280
20281
20282 for {
20283 ptr := v_0
20284 if ptr.Op != OpNilCheck {
20285 break
20286 }
20287 v.copyOf(ptr)
20288 return true
20289 }
20290 return false
20291 }
20292 func rewriteValuegeneric_OpNot(v *Value) bool {
20293 v_0 := v.Args[0]
20294
20295
20296 for {
20297 if v_0.Op != OpConstBool {
20298 break
20299 }
20300 c := auxIntToBool(v_0.AuxInt)
20301 v.reset(OpConstBool)
20302 v.AuxInt = boolToAuxInt(!c)
20303 return true
20304 }
20305
20306
20307 for {
20308 if v_0.Op != OpEq64 {
20309 break
20310 }
20311 y := v_0.Args[1]
20312 x := v_0.Args[0]
20313 v.reset(OpNeq64)
20314 v.AddArg2(x, y)
20315 return true
20316 }
20317
20318
20319 for {
20320 if v_0.Op != OpEq32 {
20321 break
20322 }
20323 y := v_0.Args[1]
20324 x := v_0.Args[0]
20325 v.reset(OpNeq32)
20326 v.AddArg2(x, y)
20327 return true
20328 }
20329
20330
20331 for {
20332 if v_0.Op != OpEq16 {
20333 break
20334 }
20335 y := v_0.Args[1]
20336 x := v_0.Args[0]
20337 v.reset(OpNeq16)
20338 v.AddArg2(x, y)
20339 return true
20340 }
20341
20342
20343 for {
20344 if v_0.Op != OpEq8 {
20345 break
20346 }
20347 y := v_0.Args[1]
20348 x := v_0.Args[0]
20349 v.reset(OpNeq8)
20350 v.AddArg2(x, y)
20351 return true
20352 }
20353
20354
20355 for {
20356 if v_0.Op != OpEqB {
20357 break
20358 }
20359 y := v_0.Args[1]
20360 x := v_0.Args[0]
20361 v.reset(OpNeqB)
20362 v.AddArg2(x, y)
20363 return true
20364 }
20365
20366
20367 for {
20368 if v_0.Op != OpEqPtr {
20369 break
20370 }
20371 y := v_0.Args[1]
20372 x := v_0.Args[0]
20373 v.reset(OpNeqPtr)
20374 v.AddArg2(x, y)
20375 return true
20376 }
20377
20378
20379 for {
20380 if v_0.Op != OpEq64F {
20381 break
20382 }
20383 y := v_0.Args[1]
20384 x := v_0.Args[0]
20385 v.reset(OpNeq64F)
20386 v.AddArg2(x, y)
20387 return true
20388 }
20389
20390
20391 for {
20392 if v_0.Op != OpEq32F {
20393 break
20394 }
20395 y := v_0.Args[1]
20396 x := v_0.Args[0]
20397 v.reset(OpNeq32F)
20398 v.AddArg2(x, y)
20399 return true
20400 }
20401
20402
20403 for {
20404 if v_0.Op != OpNeq64 {
20405 break
20406 }
20407 y := v_0.Args[1]
20408 x := v_0.Args[0]
20409 v.reset(OpEq64)
20410 v.AddArg2(x, y)
20411 return true
20412 }
20413
20414
20415 for {
20416 if v_0.Op != OpNeq32 {
20417 break
20418 }
20419 y := v_0.Args[1]
20420 x := v_0.Args[0]
20421 v.reset(OpEq32)
20422 v.AddArg2(x, y)
20423 return true
20424 }
20425
20426
20427 for {
20428 if v_0.Op != OpNeq16 {
20429 break
20430 }
20431 y := v_0.Args[1]
20432 x := v_0.Args[0]
20433 v.reset(OpEq16)
20434 v.AddArg2(x, y)
20435 return true
20436 }
20437
20438
20439 for {
20440 if v_0.Op != OpNeq8 {
20441 break
20442 }
20443 y := v_0.Args[1]
20444 x := v_0.Args[0]
20445 v.reset(OpEq8)
20446 v.AddArg2(x, y)
20447 return true
20448 }
20449
20450
20451 for {
20452 if v_0.Op != OpNeqB {
20453 break
20454 }
20455 y := v_0.Args[1]
20456 x := v_0.Args[0]
20457 v.reset(OpEqB)
20458 v.AddArg2(x, y)
20459 return true
20460 }
20461
20462
20463 for {
20464 if v_0.Op != OpNeqPtr {
20465 break
20466 }
20467 y := v_0.Args[1]
20468 x := v_0.Args[0]
20469 v.reset(OpEqPtr)
20470 v.AddArg2(x, y)
20471 return true
20472 }
20473
20474
20475 for {
20476 if v_0.Op != OpNeq64F {
20477 break
20478 }
20479 y := v_0.Args[1]
20480 x := v_0.Args[0]
20481 v.reset(OpEq64F)
20482 v.AddArg2(x, y)
20483 return true
20484 }
20485
20486
20487 for {
20488 if v_0.Op != OpNeq32F {
20489 break
20490 }
20491 y := v_0.Args[1]
20492 x := v_0.Args[0]
20493 v.reset(OpEq32F)
20494 v.AddArg2(x, y)
20495 return true
20496 }
20497
20498
20499 for {
20500 if v_0.Op != OpLess64 {
20501 break
20502 }
20503 y := v_0.Args[1]
20504 x := v_0.Args[0]
20505 v.reset(OpLeq64)
20506 v.AddArg2(y, x)
20507 return true
20508 }
20509
20510
20511 for {
20512 if v_0.Op != OpLess32 {
20513 break
20514 }
20515 y := v_0.Args[1]
20516 x := v_0.Args[0]
20517 v.reset(OpLeq32)
20518 v.AddArg2(y, x)
20519 return true
20520 }
20521
20522
20523 for {
20524 if v_0.Op != OpLess16 {
20525 break
20526 }
20527 y := v_0.Args[1]
20528 x := v_0.Args[0]
20529 v.reset(OpLeq16)
20530 v.AddArg2(y, x)
20531 return true
20532 }
20533
20534
20535 for {
20536 if v_0.Op != OpLess8 {
20537 break
20538 }
20539 y := v_0.Args[1]
20540 x := v_0.Args[0]
20541 v.reset(OpLeq8)
20542 v.AddArg2(y, x)
20543 return true
20544 }
20545
20546
20547 for {
20548 if v_0.Op != OpLess64U {
20549 break
20550 }
20551 y := v_0.Args[1]
20552 x := v_0.Args[0]
20553 v.reset(OpLeq64U)
20554 v.AddArg2(y, x)
20555 return true
20556 }
20557
20558
20559 for {
20560 if v_0.Op != OpLess32U {
20561 break
20562 }
20563 y := v_0.Args[1]
20564 x := v_0.Args[0]
20565 v.reset(OpLeq32U)
20566 v.AddArg2(y, x)
20567 return true
20568 }
20569
20570
20571 for {
20572 if v_0.Op != OpLess16U {
20573 break
20574 }
20575 y := v_0.Args[1]
20576 x := v_0.Args[0]
20577 v.reset(OpLeq16U)
20578 v.AddArg2(y, x)
20579 return true
20580 }
20581
20582
20583 for {
20584 if v_0.Op != OpLess8U {
20585 break
20586 }
20587 y := v_0.Args[1]
20588 x := v_0.Args[0]
20589 v.reset(OpLeq8U)
20590 v.AddArg2(y, x)
20591 return true
20592 }
20593
20594
20595 for {
20596 if v_0.Op != OpLeq64 {
20597 break
20598 }
20599 y := v_0.Args[1]
20600 x := v_0.Args[0]
20601 v.reset(OpLess64)
20602 v.AddArg2(y, x)
20603 return true
20604 }
20605
20606
20607 for {
20608 if v_0.Op != OpLeq32 {
20609 break
20610 }
20611 y := v_0.Args[1]
20612 x := v_0.Args[0]
20613 v.reset(OpLess32)
20614 v.AddArg2(y, x)
20615 return true
20616 }
20617
20618
20619 for {
20620 if v_0.Op != OpLeq16 {
20621 break
20622 }
20623 y := v_0.Args[1]
20624 x := v_0.Args[0]
20625 v.reset(OpLess16)
20626 v.AddArg2(y, x)
20627 return true
20628 }
20629
20630
20631 for {
20632 if v_0.Op != OpLeq8 {
20633 break
20634 }
20635 y := v_0.Args[1]
20636 x := v_0.Args[0]
20637 v.reset(OpLess8)
20638 v.AddArg2(y, x)
20639 return true
20640 }
20641
20642
20643 for {
20644 if v_0.Op != OpLeq64U {
20645 break
20646 }
20647 y := v_0.Args[1]
20648 x := v_0.Args[0]
20649 v.reset(OpLess64U)
20650 v.AddArg2(y, x)
20651 return true
20652 }
20653
20654
20655 for {
20656 if v_0.Op != OpLeq32U {
20657 break
20658 }
20659 y := v_0.Args[1]
20660 x := v_0.Args[0]
20661 v.reset(OpLess32U)
20662 v.AddArg2(y, x)
20663 return true
20664 }
20665
20666
20667 for {
20668 if v_0.Op != OpLeq16U {
20669 break
20670 }
20671 y := v_0.Args[1]
20672 x := v_0.Args[0]
20673 v.reset(OpLess16U)
20674 v.AddArg2(y, x)
20675 return true
20676 }
20677
20678
20679 for {
20680 if v_0.Op != OpLeq8U {
20681 break
20682 }
20683 y := v_0.Args[1]
20684 x := v_0.Args[0]
20685 v.reset(OpLess8U)
20686 v.AddArg2(y, x)
20687 return true
20688 }
20689 return false
20690 }
20691 func rewriteValuegeneric_OpOffPtr(v *Value) bool {
20692 v_0 := v.Args[0]
20693
20694
20695 for {
20696 x := auxIntToInt64(v.AuxInt)
20697 if v_0.Op != OpOffPtr {
20698 break
20699 }
20700 y := auxIntToInt64(v_0.AuxInt)
20701 p := v_0.Args[0]
20702 v.reset(OpOffPtr)
20703 v.AuxInt = int64ToAuxInt(x + y)
20704 v.AddArg(p)
20705 return true
20706 }
20707
20708
20709
20710 for {
20711 if auxIntToInt64(v.AuxInt) != 0 {
20712 break
20713 }
20714 p := v_0
20715 if !(v.Type.Compare(p.Type) == types.CMPeq) {
20716 break
20717 }
20718 v.copyOf(p)
20719 return true
20720 }
20721 return false
20722 }
20723 func rewriteValuegeneric_OpOr16(v *Value) bool {
20724 v_1 := v.Args[1]
20725 v_0 := v.Args[0]
20726 b := v.Block
20727 config := b.Func.Config
20728
20729
20730 for {
20731 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20732 if v_0.Op != OpConst16 {
20733 continue
20734 }
20735 c := auxIntToInt16(v_0.AuxInt)
20736 if v_1.Op != OpConst16 {
20737 continue
20738 }
20739 d := auxIntToInt16(v_1.AuxInt)
20740 v.reset(OpConst16)
20741 v.AuxInt = int16ToAuxInt(c | d)
20742 return true
20743 }
20744 break
20745 }
20746
20747
20748 for {
20749 t := v.Type
20750 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20751 if v_0.Op != OpCom16 {
20752 continue
20753 }
20754 x := v_0.Args[0]
20755 if v_1.Op != OpCom16 {
20756 continue
20757 }
20758 y := v_1.Args[0]
20759 v.reset(OpCom16)
20760 v0 := b.NewValue0(v.Pos, OpAnd16, t)
20761 v0.AddArg2(x, y)
20762 v.AddArg(v0)
20763 return true
20764 }
20765 break
20766 }
20767
20768
20769 for {
20770 x := v_0
20771 if x != v_1 {
20772 break
20773 }
20774 v.copyOf(x)
20775 return true
20776 }
20777
20778
20779 for {
20780 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20781 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
20782 continue
20783 }
20784 x := v_1
20785 v.copyOf(x)
20786 return true
20787 }
20788 break
20789 }
20790
20791
20792 for {
20793 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20794 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
20795 continue
20796 }
20797 v.reset(OpConst16)
20798 v.AuxInt = int16ToAuxInt(-1)
20799 return true
20800 }
20801 break
20802 }
20803
20804
20805 for {
20806 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20807 if v_0.Op != OpCom16 {
20808 continue
20809 }
20810 x := v_0.Args[0]
20811 if x != v_1 {
20812 continue
20813 }
20814 v.reset(OpConst16)
20815 v.AuxInt = int16ToAuxInt(-1)
20816 return true
20817 }
20818 break
20819 }
20820
20821
20822 for {
20823 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20824 x := v_0
20825 if v_1.Op != OpOr16 {
20826 continue
20827 }
20828 _ = v_1.Args[1]
20829 v_1_0 := v_1.Args[0]
20830 v_1_1 := v_1.Args[1]
20831 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
20832 if x != v_1_0 {
20833 continue
20834 }
20835 y := v_1_1
20836 v.reset(OpOr16)
20837 v.AddArg2(x, y)
20838 return true
20839 }
20840 }
20841 break
20842 }
20843
20844
20845
20846 for {
20847 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20848 if v_0.Op != OpAnd16 {
20849 continue
20850 }
20851 _ = v_0.Args[1]
20852 v_0_0 := v_0.Args[0]
20853 v_0_1 := v_0.Args[1]
20854 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
20855 x := v_0_0
20856 if v_0_1.Op != OpConst16 {
20857 continue
20858 }
20859 c2 := auxIntToInt16(v_0_1.AuxInt)
20860 if v_1.Op != OpConst16 {
20861 continue
20862 }
20863 t := v_1.Type
20864 c1 := auxIntToInt16(v_1.AuxInt)
20865 if !(^(c1 | c2) == 0) {
20866 continue
20867 }
20868 v.reset(OpOr16)
20869 v0 := b.NewValue0(v.Pos, OpConst16, t)
20870 v0.AuxInt = int16ToAuxInt(c1)
20871 v.AddArg2(v0, x)
20872 return true
20873 }
20874 }
20875 break
20876 }
20877
20878
20879
20880 for {
20881 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20882 if v_0.Op != OpOr16 {
20883 continue
20884 }
20885 _ = v_0.Args[1]
20886 v_0_0 := v_0.Args[0]
20887 v_0_1 := v_0.Args[1]
20888 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
20889 i := v_0_0
20890 if i.Op != OpConst16 {
20891 continue
20892 }
20893 t := i.Type
20894 z := v_0_1
20895 x := v_1
20896 if !(z.Op != OpConst16 && x.Op != OpConst16) {
20897 continue
20898 }
20899 v.reset(OpOr16)
20900 v0 := b.NewValue0(v.Pos, OpOr16, t)
20901 v0.AddArg2(z, x)
20902 v.AddArg2(i, v0)
20903 return true
20904 }
20905 }
20906 break
20907 }
20908
20909
20910 for {
20911 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20912 if v_0.Op != OpConst16 {
20913 continue
20914 }
20915 t := v_0.Type
20916 c := auxIntToInt16(v_0.AuxInt)
20917 if v_1.Op != OpOr16 {
20918 continue
20919 }
20920 _ = v_1.Args[1]
20921 v_1_0 := v_1.Args[0]
20922 v_1_1 := v_1.Args[1]
20923 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
20924 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
20925 continue
20926 }
20927 d := auxIntToInt16(v_1_0.AuxInt)
20928 x := v_1_1
20929 v.reset(OpOr16)
20930 v0 := b.NewValue0(v.Pos, OpConst16, t)
20931 v0.AuxInt = int16ToAuxInt(c | d)
20932 v.AddArg2(v0, x)
20933 return true
20934 }
20935 }
20936 break
20937 }
20938
20939
20940
20941 for {
20942 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20943 if v_0.Op != OpLsh16x64 {
20944 continue
20945 }
20946 _ = v_0.Args[1]
20947 x := v_0.Args[0]
20948 z := v_0.Args[1]
20949 if z.Op != OpConst64 {
20950 continue
20951 }
20952 c := auxIntToInt64(z.AuxInt)
20953 if v_1.Op != OpRsh16Ux64 {
20954 continue
20955 }
20956 _ = v_1.Args[1]
20957 if x != v_1.Args[0] {
20958 continue
20959 }
20960 v_1_1 := v_1.Args[1]
20961 if v_1_1.Op != OpConst64 {
20962 continue
20963 }
20964 d := auxIntToInt64(v_1_1.AuxInt)
20965 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
20966 continue
20967 }
20968 v.reset(OpRotateLeft16)
20969 v.AddArg2(x, z)
20970 return true
20971 }
20972 break
20973 }
20974
20975
20976
20977 for {
20978 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20979 left := v_0
20980 if left.Op != OpLsh16x64 {
20981 continue
20982 }
20983 y := left.Args[1]
20984 x := left.Args[0]
20985 right := v_1
20986 if right.Op != OpRsh16Ux64 {
20987 continue
20988 }
20989 _ = right.Args[1]
20990 if x != right.Args[0] {
20991 continue
20992 }
20993 right_1 := right.Args[1]
20994 if right_1.Op != OpSub64 {
20995 continue
20996 }
20997 _ = right_1.Args[1]
20998 right_1_0 := right_1.Args[0]
20999 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21000 continue
21001 }
21002 v.reset(OpRotateLeft16)
21003 v.AddArg2(x, y)
21004 return true
21005 }
21006 break
21007 }
21008
21009
21010
21011 for {
21012 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21013 left := v_0
21014 if left.Op != OpLsh16x32 {
21015 continue
21016 }
21017 y := left.Args[1]
21018 x := left.Args[0]
21019 right := v_1
21020 if right.Op != OpRsh16Ux32 {
21021 continue
21022 }
21023 _ = right.Args[1]
21024 if x != right.Args[0] {
21025 continue
21026 }
21027 right_1 := right.Args[1]
21028 if right_1.Op != OpSub32 {
21029 continue
21030 }
21031 _ = right_1.Args[1]
21032 right_1_0 := right_1.Args[0]
21033 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21034 continue
21035 }
21036 v.reset(OpRotateLeft16)
21037 v.AddArg2(x, y)
21038 return true
21039 }
21040 break
21041 }
21042
21043
21044
21045 for {
21046 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21047 left := v_0
21048 if left.Op != OpLsh16x16 {
21049 continue
21050 }
21051 y := left.Args[1]
21052 x := left.Args[0]
21053 right := v_1
21054 if right.Op != OpRsh16Ux16 {
21055 continue
21056 }
21057 _ = right.Args[1]
21058 if x != right.Args[0] {
21059 continue
21060 }
21061 right_1 := right.Args[1]
21062 if right_1.Op != OpSub16 {
21063 continue
21064 }
21065 _ = right_1.Args[1]
21066 right_1_0 := right_1.Args[0]
21067 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21068 continue
21069 }
21070 v.reset(OpRotateLeft16)
21071 v.AddArg2(x, y)
21072 return true
21073 }
21074 break
21075 }
21076
21077
21078
21079 for {
21080 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21081 left := v_0
21082 if left.Op != OpLsh16x8 {
21083 continue
21084 }
21085 y := left.Args[1]
21086 x := left.Args[0]
21087 right := v_1
21088 if right.Op != OpRsh16Ux8 {
21089 continue
21090 }
21091 _ = right.Args[1]
21092 if x != right.Args[0] {
21093 continue
21094 }
21095 right_1 := right.Args[1]
21096 if right_1.Op != OpSub8 {
21097 continue
21098 }
21099 _ = right_1.Args[1]
21100 right_1_0 := right_1.Args[0]
21101 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21102 continue
21103 }
21104 v.reset(OpRotateLeft16)
21105 v.AddArg2(x, y)
21106 return true
21107 }
21108 break
21109 }
21110
21111
21112
21113 for {
21114 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21115 right := v_0
21116 if right.Op != OpRsh16Ux64 {
21117 continue
21118 }
21119 y := right.Args[1]
21120 x := right.Args[0]
21121 left := v_1
21122 if left.Op != OpLsh16x64 {
21123 continue
21124 }
21125 _ = left.Args[1]
21126 if x != left.Args[0] {
21127 continue
21128 }
21129 z := left.Args[1]
21130 if z.Op != OpSub64 {
21131 continue
21132 }
21133 _ = z.Args[1]
21134 z_0 := z.Args[0]
21135 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21136 continue
21137 }
21138 v.reset(OpRotateLeft16)
21139 v.AddArg2(x, z)
21140 return true
21141 }
21142 break
21143 }
21144
21145
21146
21147 for {
21148 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21149 right := v_0
21150 if right.Op != OpRsh16Ux32 {
21151 continue
21152 }
21153 y := right.Args[1]
21154 x := right.Args[0]
21155 left := v_1
21156 if left.Op != OpLsh16x32 {
21157 continue
21158 }
21159 _ = left.Args[1]
21160 if x != left.Args[0] {
21161 continue
21162 }
21163 z := left.Args[1]
21164 if z.Op != OpSub32 {
21165 continue
21166 }
21167 _ = z.Args[1]
21168 z_0 := z.Args[0]
21169 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21170 continue
21171 }
21172 v.reset(OpRotateLeft16)
21173 v.AddArg2(x, z)
21174 return true
21175 }
21176 break
21177 }
21178
21179
21180
21181 for {
21182 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21183 right := v_0
21184 if right.Op != OpRsh16Ux16 {
21185 continue
21186 }
21187 y := right.Args[1]
21188 x := right.Args[0]
21189 left := v_1
21190 if left.Op != OpLsh16x16 {
21191 continue
21192 }
21193 _ = left.Args[1]
21194 if x != left.Args[0] {
21195 continue
21196 }
21197 z := left.Args[1]
21198 if z.Op != OpSub16 {
21199 continue
21200 }
21201 _ = z.Args[1]
21202 z_0 := z.Args[0]
21203 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21204 continue
21205 }
21206 v.reset(OpRotateLeft16)
21207 v.AddArg2(x, z)
21208 return true
21209 }
21210 break
21211 }
21212
21213
21214
21215 for {
21216 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21217 right := v_0
21218 if right.Op != OpRsh16Ux8 {
21219 continue
21220 }
21221 y := right.Args[1]
21222 x := right.Args[0]
21223 left := v_1
21224 if left.Op != OpLsh16x8 {
21225 continue
21226 }
21227 _ = left.Args[1]
21228 if x != left.Args[0] {
21229 continue
21230 }
21231 z := left.Args[1]
21232 if z.Op != OpSub8 {
21233 continue
21234 }
21235 _ = z.Args[1]
21236 z_0 := z.Args[0]
21237 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21238 continue
21239 }
21240 v.reset(OpRotateLeft16)
21241 v.AddArg2(x, z)
21242 return true
21243 }
21244 break
21245 }
21246 return false
21247 }
21248 func rewriteValuegeneric_OpOr32(v *Value) bool {
21249 v_1 := v.Args[1]
21250 v_0 := v.Args[0]
21251 b := v.Block
21252 config := b.Func.Config
21253
21254
21255 for {
21256 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21257 if v_0.Op != OpConst32 {
21258 continue
21259 }
21260 c := auxIntToInt32(v_0.AuxInt)
21261 if v_1.Op != OpConst32 {
21262 continue
21263 }
21264 d := auxIntToInt32(v_1.AuxInt)
21265 v.reset(OpConst32)
21266 v.AuxInt = int32ToAuxInt(c | d)
21267 return true
21268 }
21269 break
21270 }
21271
21272
21273 for {
21274 t := v.Type
21275 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21276 if v_0.Op != OpCom32 {
21277 continue
21278 }
21279 x := v_0.Args[0]
21280 if v_1.Op != OpCom32 {
21281 continue
21282 }
21283 y := v_1.Args[0]
21284 v.reset(OpCom32)
21285 v0 := b.NewValue0(v.Pos, OpAnd32, t)
21286 v0.AddArg2(x, y)
21287 v.AddArg(v0)
21288 return true
21289 }
21290 break
21291 }
21292
21293
21294 for {
21295 x := v_0
21296 if x != v_1 {
21297 break
21298 }
21299 v.copyOf(x)
21300 return true
21301 }
21302
21303
21304 for {
21305 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21306 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
21307 continue
21308 }
21309 x := v_1
21310 v.copyOf(x)
21311 return true
21312 }
21313 break
21314 }
21315
21316
21317 for {
21318 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21319 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
21320 continue
21321 }
21322 v.reset(OpConst32)
21323 v.AuxInt = int32ToAuxInt(-1)
21324 return true
21325 }
21326 break
21327 }
21328
21329
21330 for {
21331 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21332 if v_0.Op != OpCom32 {
21333 continue
21334 }
21335 x := v_0.Args[0]
21336 if x != v_1 {
21337 continue
21338 }
21339 v.reset(OpConst32)
21340 v.AuxInt = int32ToAuxInt(-1)
21341 return true
21342 }
21343 break
21344 }
21345
21346
21347 for {
21348 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21349 x := v_0
21350 if v_1.Op != OpOr32 {
21351 continue
21352 }
21353 _ = v_1.Args[1]
21354 v_1_0 := v_1.Args[0]
21355 v_1_1 := v_1.Args[1]
21356 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21357 if x != v_1_0 {
21358 continue
21359 }
21360 y := v_1_1
21361 v.reset(OpOr32)
21362 v.AddArg2(x, y)
21363 return true
21364 }
21365 }
21366 break
21367 }
21368
21369
21370
21371 for {
21372 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21373 if v_0.Op != OpAnd32 {
21374 continue
21375 }
21376 _ = v_0.Args[1]
21377 v_0_0 := v_0.Args[0]
21378 v_0_1 := v_0.Args[1]
21379 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21380 x := v_0_0
21381 if v_0_1.Op != OpConst32 {
21382 continue
21383 }
21384 c2 := auxIntToInt32(v_0_1.AuxInt)
21385 if v_1.Op != OpConst32 {
21386 continue
21387 }
21388 t := v_1.Type
21389 c1 := auxIntToInt32(v_1.AuxInt)
21390 if !(^(c1 | c2) == 0) {
21391 continue
21392 }
21393 v.reset(OpOr32)
21394 v0 := b.NewValue0(v.Pos, OpConst32, t)
21395 v0.AuxInt = int32ToAuxInt(c1)
21396 v.AddArg2(v0, x)
21397 return true
21398 }
21399 }
21400 break
21401 }
21402
21403
21404
21405 for {
21406 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21407 if v_0.Op != OpOr32 {
21408 continue
21409 }
21410 _ = v_0.Args[1]
21411 v_0_0 := v_0.Args[0]
21412 v_0_1 := v_0.Args[1]
21413 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21414 i := v_0_0
21415 if i.Op != OpConst32 {
21416 continue
21417 }
21418 t := i.Type
21419 z := v_0_1
21420 x := v_1
21421 if !(z.Op != OpConst32 && x.Op != OpConst32) {
21422 continue
21423 }
21424 v.reset(OpOr32)
21425 v0 := b.NewValue0(v.Pos, OpOr32, t)
21426 v0.AddArg2(z, x)
21427 v.AddArg2(i, v0)
21428 return true
21429 }
21430 }
21431 break
21432 }
21433
21434
21435 for {
21436 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21437 if v_0.Op != OpConst32 {
21438 continue
21439 }
21440 t := v_0.Type
21441 c := auxIntToInt32(v_0.AuxInt)
21442 if v_1.Op != OpOr32 {
21443 continue
21444 }
21445 _ = v_1.Args[1]
21446 v_1_0 := v_1.Args[0]
21447 v_1_1 := v_1.Args[1]
21448 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21449 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
21450 continue
21451 }
21452 d := auxIntToInt32(v_1_0.AuxInt)
21453 x := v_1_1
21454 v.reset(OpOr32)
21455 v0 := b.NewValue0(v.Pos, OpConst32, t)
21456 v0.AuxInt = int32ToAuxInt(c | d)
21457 v.AddArg2(v0, x)
21458 return true
21459 }
21460 }
21461 break
21462 }
21463
21464
21465
21466 for {
21467 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21468 if v_0.Op != OpLsh32x64 {
21469 continue
21470 }
21471 _ = v_0.Args[1]
21472 x := v_0.Args[0]
21473 z := v_0.Args[1]
21474 if z.Op != OpConst64 {
21475 continue
21476 }
21477 c := auxIntToInt64(z.AuxInt)
21478 if v_1.Op != OpRsh32Ux64 {
21479 continue
21480 }
21481 _ = v_1.Args[1]
21482 if x != v_1.Args[0] {
21483 continue
21484 }
21485 v_1_1 := v_1.Args[1]
21486 if v_1_1.Op != OpConst64 {
21487 continue
21488 }
21489 d := auxIntToInt64(v_1_1.AuxInt)
21490 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
21491 continue
21492 }
21493 v.reset(OpRotateLeft32)
21494 v.AddArg2(x, z)
21495 return true
21496 }
21497 break
21498 }
21499
21500
21501
21502 for {
21503 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21504 left := v_0
21505 if left.Op != OpLsh32x64 {
21506 continue
21507 }
21508 y := left.Args[1]
21509 x := left.Args[0]
21510 right := v_1
21511 if right.Op != OpRsh32Ux64 {
21512 continue
21513 }
21514 _ = right.Args[1]
21515 if x != right.Args[0] {
21516 continue
21517 }
21518 right_1 := right.Args[1]
21519 if right_1.Op != OpSub64 {
21520 continue
21521 }
21522 _ = right_1.Args[1]
21523 right_1_0 := right_1.Args[0]
21524 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21525 continue
21526 }
21527 v.reset(OpRotateLeft32)
21528 v.AddArg2(x, y)
21529 return true
21530 }
21531 break
21532 }
21533
21534
21535
21536 for {
21537 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21538 left := v_0
21539 if left.Op != OpLsh32x32 {
21540 continue
21541 }
21542 y := left.Args[1]
21543 x := left.Args[0]
21544 right := v_1
21545 if right.Op != OpRsh32Ux32 {
21546 continue
21547 }
21548 _ = right.Args[1]
21549 if x != right.Args[0] {
21550 continue
21551 }
21552 right_1 := right.Args[1]
21553 if right_1.Op != OpSub32 {
21554 continue
21555 }
21556 _ = right_1.Args[1]
21557 right_1_0 := right_1.Args[0]
21558 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21559 continue
21560 }
21561 v.reset(OpRotateLeft32)
21562 v.AddArg2(x, y)
21563 return true
21564 }
21565 break
21566 }
21567
21568
21569
21570 for {
21571 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21572 left := v_0
21573 if left.Op != OpLsh32x16 {
21574 continue
21575 }
21576 y := left.Args[1]
21577 x := left.Args[0]
21578 right := v_1
21579 if right.Op != OpRsh32Ux16 {
21580 continue
21581 }
21582 _ = right.Args[1]
21583 if x != right.Args[0] {
21584 continue
21585 }
21586 right_1 := right.Args[1]
21587 if right_1.Op != OpSub16 {
21588 continue
21589 }
21590 _ = right_1.Args[1]
21591 right_1_0 := right_1.Args[0]
21592 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21593 continue
21594 }
21595 v.reset(OpRotateLeft32)
21596 v.AddArg2(x, y)
21597 return true
21598 }
21599 break
21600 }
21601
21602
21603
21604 for {
21605 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21606 left := v_0
21607 if left.Op != OpLsh32x8 {
21608 continue
21609 }
21610 y := left.Args[1]
21611 x := left.Args[0]
21612 right := v_1
21613 if right.Op != OpRsh32Ux8 {
21614 continue
21615 }
21616 _ = right.Args[1]
21617 if x != right.Args[0] {
21618 continue
21619 }
21620 right_1 := right.Args[1]
21621 if right_1.Op != OpSub8 {
21622 continue
21623 }
21624 _ = right_1.Args[1]
21625 right_1_0 := right_1.Args[0]
21626 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21627 continue
21628 }
21629 v.reset(OpRotateLeft32)
21630 v.AddArg2(x, y)
21631 return true
21632 }
21633 break
21634 }
21635
21636
21637
21638 for {
21639 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21640 right := v_0
21641 if right.Op != OpRsh32Ux64 {
21642 continue
21643 }
21644 y := right.Args[1]
21645 x := right.Args[0]
21646 left := v_1
21647 if left.Op != OpLsh32x64 {
21648 continue
21649 }
21650 _ = left.Args[1]
21651 if x != left.Args[0] {
21652 continue
21653 }
21654 z := left.Args[1]
21655 if z.Op != OpSub64 {
21656 continue
21657 }
21658 _ = z.Args[1]
21659 z_0 := z.Args[0]
21660 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21661 continue
21662 }
21663 v.reset(OpRotateLeft32)
21664 v.AddArg2(x, z)
21665 return true
21666 }
21667 break
21668 }
21669
21670
21671
21672 for {
21673 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21674 right := v_0
21675 if right.Op != OpRsh32Ux32 {
21676 continue
21677 }
21678 y := right.Args[1]
21679 x := right.Args[0]
21680 left := v_1
21681 if left.Op != OpLsh32x32 {
21682 continue
21683 }
21684 _ = left.Args[1]
21685 if x != left.Args[0] {
21686 continue
21687 }
21688 z := left.Args[1]
21689 if z.Op != OpSub32 {
21690 continue
21691 }
21692 _ = z.Args[1]
21693 z_0 := z.Args[0]
21694 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21695 continue
21696 }
21697 v.reset(OpRotateLeft32)
21698 v.AddArg2(x, z)
21699 return true
21700 }
21701 break
21702 }
21703
21704
21705
21706 for {
21707 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21708 right := v_0
21709 if right.Op != OpRsh32Ux16 {
21710 continue
21711 }
21712 y := right.Args[1]
21713 x := right.Args[0]
21714 left := v_1
21715 if left.Op != OpLsh32x16 {
21716 continue
21717 }
21718 _ = left.Args[1]
21719 if x != left.Args[0] {
21720 continue
21721 }
21722 z := left.Args[1]
21723 if z.Op != OpSub16 {
21724 continue
21725 }
21726 _ = z.Args[1]
21727 z_0 := z.Args[0]
21728 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21729 continue
21730 }
21731 v.reset(OpRotateLeft32)
21732 v.AddArg2(x, z)
21733 return true
21734 }
21735 break
21736 }
21737
21738
21739
21740 for {
21741 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21742 right := v_0
21743 if right.Op != OpRsh32Ux8 {
21744 continue
21745 }
21746 y := right.Args[1]
21747 x := right.Args[0]
21748 left := v_1
21749 if left.Op != OpLsh32x8 {
21750 continue
21751 }
21752 _ = left.Args[1]
21753 if x != left.Args[0] {
21754 continue
21755 }
21756 z := left.Args[1]
21757 if z.Op != OpSub8 {
21758 continue
21759 }
21760 _ = z.Args[1]
21761 z_0 := z.Args[0]
21762 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21763 continue
21764 }
21765 v.reset(OpRotateLeft32)
21766 v.AddArg2(x, z)
21767 return true
21768 }
21769 break
21770 }
21771 return false
21772 }
21773 func rewriteValuegeneric_OpOr64(v *Value) bool {
21774 v_1 := v.Args[1]
21775 v_0 := v.Args[0]
21776 b := v.Block
21777 config := b.Func.Config
21778
21779
21780 for {
21781 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21782 if v_0.Op != OpConst64 {
21783 continue
21784 }
21785 c := auxIntToInt64(v_0.AuxInt)
21786 if v_1.Op != OpConst64 {
21787 continue
21788 }
21789 d := auxIntToInt64(v_1.AuxInt)
21790 v.reset(OpConst64)
21791 v.AuxInt = int64ToAuxInt(c | d)
21792 return true
21793 }
21794 break
21795 }
21796
21797
21798 for {
21799 t := v.Type
21800 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21801 if v_0.Op != OpCom64 {
21802 continue
21803 }
21804 x := v_0.Args[0]
21805 if v_1.Op != OpCom64 {
21806 continue
21807 }
21808 y := v_1.Args[0]
21809 v.reset(OpCom64)
21810 v0 := b.NewValue0(v.Pos, OpAnd64, t)
21811 v0.AddArg2(x, y)
21812 v.AddArg(v0)
21813 return true
21814 }
21815 break
21816 }
21817
21818
21819 for {
21820 x := v_0
21821 if x != v_1 {
21822 break
21823 }
21824 v.copyOf(x)
21825 return true
21826 }
21827
21828
21829 for {
21830 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21831 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
21832 continue
21833 }
21834 x := v_1
21835 v.copyOf(x)
21836 return true
21837 }
21838 break
21839 }
21840
21841
21842 for {
21843 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21844 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
21845 continue
21846 }
21847 v.reset(OpConst64)
21848 v.AuxInt = int64ToAuxInt(-1)
21849 return true
21850 }
21851 break
21852 }
21853
21854
21855 for {
21856 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21857 if v_0.Op != OpCom64 {
21858 continue
21859 }
21860 x := v_0.Args[0]
21861 if x != v_1 {
21862 continue
21863 }
21864 v.reset(OpConst64)
21865 v.AuxInt = int64ToAuxInt(-1)
21866 return true
21867 }
21868 break
21869 }
21870
21871
21872 for {
21873 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21874 x := v_0
21875 if v_1.Op != OpOr64 {
21876 continue
21877 }
21878 _ = v_1.Args[1]
21879 v_1_0 := v_1.Args[0]
21880 v_1_1 := v_1.Args[1]
21881 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21882 if x != v_1_0 {
21883 continue
21884 }
21885 y := v_1_1
21886 v.reset(OpOr64)
21887 v.AddArg2(x, y)
21888 return true
21889 }
21890 }
21891 break
21892 }
21893
21894
21895
21896 for {
21897 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21898 if v_0.Op != OpAnd64 {
21899 continue
21900 }
21901 _ = v_0.Args[1]
21902 v_0_0 := v_0.Args[0]
21903 v_0_1 := v_0.Args[1]
21904 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21905 x := v_0_0
21906 if v_0_1.Op != OpConst64 {
21907 continue
21908 }
21909 c2 := auxIntToInt64(v_0_1.AuxInt)
21910 if v_1.Op != OpConst64 {
21911 continue
21912 }
21913 t := v_1.Type
21914 c1 := auxIntToInt64(v_1.AuxInt)
21915 if !(^(c1 | c2) == 0) {
21916 continue
21917 }
21918 v.reset(OpOr64)
21919 v0 := b.NewValue0(v.Pos, OpConst64, t)
21920 v0.AuxInt = int64ToAuxInt(c1)
21921 v.AddArg2(v0, x)
21922 return true
21923 }
21924 }
21925 break
21926 }
21927
21928
21929
21930 for {
21931 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21932 if v_0.Op != OpOr64 {
21933 continue
21934 }
21935 _ = v_0.Args[1]
21936 v_0_0 := v_0.Args[0]
21937 v_0_1 := v_0.Args[1]
21938 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21939 i := v_0_0
21940 if i.Op != OpConst64 {
21941 continue
21942 }
21943 t := i.Type
21944 z := v_0_1
21945 x := v_1
21946 if !(z.Op != OpConst64 && x.Op != OpConst64) {
21947 continue
21948 }
21949 v.reset(OpOr64)
21950 v0 := b.NewValue0(v.Pos, OpOr64, t)
21951 v0.AddArg2(z, x)
21952 v.AddArg2(i, v0)
21953 return true
21954 }
21955 }
21956 break
21957 }
21958
21959
21960 for {
21961 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21962 if v_0.Op != OpConst64 {
21963 continue
21964 }
21965 t := v_0.Type
21966 c := auxIntToInt64(v_0.AuxInt)
21967 if v_1.Op != OpOr64 {
21968 continue
21969 }
21970 _ = v_1.Args[1]
21971 v_1_0 := v_1.Args[0]
21972 v_1_1 := v_1.Args[1]
21973 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21974 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
21975 continue
21976 }
21977 d := auxIntToInt64(v_1_0.AuxInt)
21978 x := v_1_1
21979 v.reset(OpOr64)
21980 v0 := b.NewValue0(v.Pos, OpConst64, t)
21981 v0.AuxInt = int64ToAuxInt(c | d)
21982 v.AddArg2(v0, x)
21983 return true
21984 }
21985 }
21986 break
21987 }
21988
21989
21990
21991 for {
21992 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21993 if v_0.Op != OpLsh64x64 {
21994 continue
21995 }
21996 _ = v_0.Args[1]
21997 x := v_0.Args[0]
21998 z := v_0.Args[1]
21999 if z.Op != OpConst64 {
22000 continue
22001 }
22002 c := auxIntToInt64(z.AuxInt)
22003 if v_1.Op != OpRsh64Ux64 {
22004 continue
22005 }
22006 _ = v_1.Args[1]
22007 if x != v_1.Args[0] {
22008 continue
22009 }
22010 v_1_1 := v_1.Args[1]
22011 if v_1_1.Op != OpConst64 {
22012 continue
22013 }
22014 d := auxIntToInt64(v_1_1.AuxInt)
22015 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
22016 continue
22017 }
22018 v.reset(OpRotateLeft64)
22019 v.AddArg2(x, z)
22020 return true
22021 }
22022 break
22023 }
22024
22025
22026
22027 for {
22028 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22029 left := v_0
22030 if left.Op != OpLsh64x64 {
22031 continue
22032 }
22033 y := left.Args[1]
22034 x := left.Args[0]
22035 right := v_1
22036 if right.Op != OpRsh64Ux64 {
22037 continue
22038 }
22039 _ = right.Args[1]
22040 if x != right.Args[0] {
22041 continue
22042 }
22043 right_1 := right.Args[1]
22044 if right_1.Op != OpSub64 {
22045 continue
22046 }
22047 _ = right_1.Args[1]
22048 right_1_0 := right_1.Args[0]
22049 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22050 continue
22051 }
22052 v.reset(OpRotateLeft64)
22053 v.AddArg2(x, y)
22054 return true
22055 }
22056 break
22057 }
22058
22059
22060
22061 for {
22062 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22063 left := v_0
22064 if left.Op != OpLsh64x32 {
22065 continue
22066 }
22067 y := left.Args[1]
22068 x := left.Args[0]
22069 right := v_1
22070 if right.Op != OpRsh64Ux32 {
22071 continue
22072 }
22073 _ = right.Args[1]
22074 if x != right.Args[0] {
22075 continue
22076 }
22077 right_1 := right.Args[1]
22078 if right_1.Op != OpSub32 {
22079 continue
22080 }
22081 _ = right_1.Args[1]
22082 right_1_0 := right_1.Args[0]
22083 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22084 continue
22085 }
22086 v.reset(OpRotateLeft64)
22087 v.AddArg2(x, y)
22088 return true
22089 }
22090 break
22091 }
22092
22093
22094
22095 for {
22096 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22097 left := v_0
22098 if left.Op != OpLsh64x16 {
22099 continue
22100 }
22101 y := left.Args[1]
22102 x := left.Args[0]
22103 right := v_1
22104 if right.Op != OpRsh64Ux16 {
22105 continue
22106 }
22107 _ = right.Args[1]
22108 if x != right.Args[0] {
22109 continue
22110 }
22111 right_1 := right.Args[1]
22112 if right_1.Op != OpSub16 {
22113 continue
22114 }
22115 _ = right_1.Args[1]
22116 right_1_0 := right_1.Args[0]
22117 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22118 continue
22119 }
22120 v.reset(OpRotateLeft64)
22121 v.AddArg2(x, y)
22122 return true
22123 }
22124 break
22125 }
22126
22127
22128
22129 for {
22130 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22131 left := v_0
22132 if left.Op != OpLsh64x8 {
22133 continue
22134 }
22135 y := left.Args[1]
22136 x := left.Args[0]
22137 right := v_1
22138 if right.Op != OpRsh64Ux8 {
22139 continue
22140 }
22141 _ = right.Args[1]
22142 if x != right.Args[0] {
22143 continue
22144 }
22145 right_1 := right.Args[1]
22146 if right_1.Op != OpSub8 {
22147 continue
22148 }
22149 _ = right_1.Args[1]
22150 right_1_0 := right_1.Args[0]
22151 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22152 continue
22153 }
22154 v.reset(OpRotateLeft64)
22155 v.AddArg2(x, y)
22156 return true
22157 }
22158 break
22159 }
22160
22161
22162
22163 for {
22164 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22165 right := v_0
22166 if right.Op != OpRsh64Ux64 {
22167 continue
22168 }
22169 y := right.Args[1]
22170 x := right.Args[0]
22171 left := v_1
22172 if left.Op != OpLsh64x64 {
22173 continue
22174 }
22175 _ = left.Args[1]
22176 if x != left.Args[0] {
22177 continue
22178 }
22179 z := left.Args[1]
22180 if z.Op != OpSub64 {
22181 continue
22182 }
22183 _ = z.Args[1]
22184 z_0 := z.Args[0]
22185 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22186 continue
22187 }
22188 v.reset(OpRotateLeft64)
22189 v.AddArg2(x, z)
22190 return true
22191 }
22192 break
22193 }
22194
22195
22196
22197 for {
22198 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22199 right := v_0
22200 if right.Op != OpRsh64Ux32 {
22201 continue
22202 }
22203 y := right.Args[1]
22204 x := right.Args[0]
22205 left := v_1
22206 if left.Op != OpLsh64x32 {
22207 continue
22208 }
22209 _ = left.Args[1]
22210 if x != left.Args[0] {
22211 continue
22212 }
22213 z := left.Args[1]
22214 if z.Op != OpSub32 {
22215 continue
22216 }
22217 _ = z.Args[1]
22218 z_0 := z.Args[0]
22219 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22220 continue
22221 }
22222 v.reset(OpRotateLeft64)
22223 v.AddArg2(x, z)
22224 return true
22225 }
22226 break
22227 }
22228
22229
22230
22231 for {
22232 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22233 right := v_0
22234 if right.Op != OpRsh64Ux16 {
22235 continue
22236 }
22237 y := right.Args[1]
22238 x := right.Args[0]
22239 left := v_1
22240 if left.Op != OpLsh64x16 {
22241 continue
22242 }
22243 _ = left.Args[1]
22244 if x != left.Args[0] {
22245 continue
22246 }
22247 z := left.Args[1]
22248 if z.Op != OpSub16 {
22249 continue
22250 }
22251 _ = z.Args[1]
22252 z_0 := z.Args[0]
22253 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22254 continue
22255 }
22256 v.reset(OpRotateLeft64)
22257 v.AddArg2(x, z)
22258 return true
22259 }
22260 break
22261 }
22262
22263
22264
22265 for {
22266 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22267 right := v_0
22268 if right.Op != OpRsh64Ux8 {
22269 continue
22270 }
22271 y := right.Args[1]
22272 x := right.Args[0]
22273 left := v_1
22274 if left.Op != OpLsh64x8 {
22275 continue
22276 }
22277 _ = left.Args[1]
22278 if x != left.Args[0] {
22279 continue
22280 }
22281 z := left.Args[1]
22282 if z.Op != OpSub8 {
22283 continue
22284 }
22285 _ = z.Args[1]
22286 z_0 := z.Args[0]
22287 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22288 continue
22289 }
22290 v.reset(OpRotateLeft64)
22291 v.AddArg2(x, z)
22292 return true
22293 }
22294 break
22295 }
22296 return false
22297 }
22298 func rewriteValuegeneric_OpOr8(v *Value) bool {
22299 v_1 := v.Args[1]
22300 v_0 := v.Args[0]
22301 b := v.Block
22302 config := b.Func.Config
22303
22304
22305 for {
22306 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22307 if v_0.Op != OpConst8 {
22308 continue
22309 }
22310 c := auxIntToInt8(v_0.AuxInt)
22311 if v_1.Op != OpConst8 {
22312 continue
22313 }
22314 d := auxIntToInt8(v_1.AuxInt)
22315 v.reset(OpConst8)
22316 v.AuxInt = int8ToAuxInt(c | d)
22317 return true
22318 }
22319 break
22320 }
22321
22322
22323 for {
22324 t := v.Type
22325 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22326 if v_0.Op != OpCom8 {
22327 continue
22328 }
22329 x := v_0.Args[0]
22330 if v_1.Op != OpCom8 {
22331 continue
22332 }
22333 y := v_1.Args[0]
22334 v.reset(OpCom8)
22335 v0 := b.NewValue0(v.Pos, OpAnd8, t)
22336 v0.AddArg2(x, y)
22337 v.AddArg(v0)
22338 return true
22339 }
22340 break
22341 }
22342
22343
22344 for {
22345 x := v_0
22346 if x != v_1 {
22347 break
22348 }
22349 v.copyOf(x)
22350 return true
22351 }
22352
22353
22354 for {
22355 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22356 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
22357 continue
22358 }
22359 x := v_1
22360 v.copyOf(x)
22361 return true
22362 }
22363 break
22364 }
22365
22366
22367 for {
22368 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22369 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
22370 continue
22371 }
22372 v.reset(OpConst8)
22373 v.AuxInt = int8ToAuxInt(-1)
22374 return true
22375 }
22376 break
22377 }
22378
22379
22380 for {
22381 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22382 if v_0.Op != OpCom8 {
22383 continue
22384 }
22385 x := v_0.Args[0]
22386 if x != v_1 {
22387 continue
22388 }
22389 v.reset(OpConst8)
22390 v.AuxInt = int8ToAuxInt(-1)
22391 return true
22392 }
22393 break
22394 }
22395
22396
22397 for {
22398 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22399 x := v_0
22400 if v_1.Op != OpOr8 {
22401 continue
22402 }
22403 _ = v_1.Args[1]
22404 v_1_0 := v_1.Args[0]
22405 v_1_1 := v_1.Args[1]
22406 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22407 if x != v_1_0 {
22408 continue
22409 }
22410 y := v_1_1
22411 v.reset(OpOr8)
22412 v.AddArg2(x, y)
22413 return true
22414 }
22415 }
22416 break
22417 }
22418
22419
22420
22421 for {
22422 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22423 if v_0.Op != OpAnd8 {
22424 continue
22425 }
22426 _ = v_0.Args[1]
22427 v_0_0 := v_0.Args[0]
22428 v_0_1 := v_0.Args[1]
22429 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22430 x := v_0_0
22431 if v_0_1.Op != OpConst8 {
22432 continue
22433 }
22434 c2 := auxIntToInt8(v_0_1.AuxInt)
22435 if v_1.Op != OpConst8 {
22436 continue
22437 }
22438 t := v_1.Type
22439 c1 := auxIntToInt8(v_1.AuxInt)
22440 if !(^(c1 | c2) == 0) {
22441 continue
22442 }
22443 v.reset(OpOr8)
22444 v0 := b.NewValue0(v.Pos, OpConst8, t)
22445 v0.AuxInt = int8ToAuxInt(c1)
22446 v.AddArg2(v0, x)
22447 return true
22448 }
22449 }
22450 break
22451 }
22452
22453
22454
22455 for {
22456 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22457 if v_0.Op != OpOr8 {
22458 continue
22459 }
22460 _ = v_0.Args[1]
22461 v_0_0 := v_0.Args[0]
22462 v_0_1 := v_0.Args[1]
22463 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22464 i := v_0_0
22465 if i.Op != OpConst8 {
22466 continue
22467 }
22468 t := i.Type
22469 z := v_0_1
22470 x := v_1
22471 if !(z.Op != OpConst8 && x.Op != OpConst8) {
22472 continue
22473 }
22474 v.reset(OpOr8)
22475 v0 := b.NewValue0(v.Pos, OpOr8, t)
22476 v0.AddArg2(z, x)
22477 v.AddArg2(i, v0)
22478 return true
22479 }
22480 }
22481 break
22482 }
22483
22484
22485 for {
22486 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22487 if v_0.Op != OpConst8 {
22488 continue
22489 }
22490 t := v_0.Type
22491 c := auxIntToInt8(v_0.AuxInt)
22492 if v_1.Op != OpOr8 {
22493 continue
22494 }
22495 _ = v_1.Args[1]
22496 v_1_0 := v_1.Args[0]
22497 v_1_1 := v_1.Args[1]
22498 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22499 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
22500 continue
22501 }
22502 d := auxIntToInt8(v_1_0.AuxInt)
22503 x := v_1_1
22504 v.reset(OpOr8)
22505 v0 := b.NewValue0(v.Pos, OpConst8, t)
22506 v0.AuxInt = int8ToAuxInt(c | d)
22507 v.AddArg2(v0, x)
22508 return true
22509 }
22510 }
22511 break
22512 }
22513
22514
22515
22516 for {
22517 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22518 if v_0.Op != OpLsh8x64 {
22519 continue
22520 }
22521 _ = v_0.Args[1]
22522 x := v_0.Args[0]
22523 z := v_0.Args[1]
22524 if z.Op != OpConst64 {
22525 continue
22526 }
22527 c := auxIntToInt64(z.AuxInt)
22528 if v_1.Op != OpRsh8Ux64 {
22529 continue
22530 }
22531 _ = v_1.Args[1]
22532 if x != v_1.Args[0] {
22533 continue
22534 }
22535 v_1_1 := v_1.Args[1]
22536 if v_1_1.Op != OpConst64 {
22537 continue
22538 }
22539 d := auxIntToInt64(v_1_1.AuxInt)
22540 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
22541 continue
22542 }
22543 v.reset(OpRotateLeft8)
22544 v.AddArg2(x, z)
22545 return true
22546 }
22547 break
22548 }
22549
22550
22551
22552 for {
22553 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22554 left := v_0
22555 if left.Op != OpLsh8x64 {
22556 continue
22557 }
22558 y := left.Args[1]
22559 x := left.Args[0]
22560 right := v_1
22561 if right.Op != OpRsh8Ux64 {
22562 continue
22563 }
22564 _ = right.Args[1]
22565 if x != right.Args[0] {
22566 continue
22567 }
22568 right_1 := right.Args[1]
22569 if right_1.Op != OpSub64 {
22570 continue
22571 }
22572 _ = right_1.Args[1]
22573 right_1_0 := right_1.Args[0]
22574 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22575 continue
22576 }
22577 v.reset(OpRotateLeft8)
22578 v.AddArg2(x, y)
22579 return true
22580 }
22581 break
22582 }
22583
22584
22585
22586 for {
22587 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22588 left := v_0
22589 if left.Op != OpLsh8x32 {
22590 continue
22591 }
22592 y := left.Args[1]
22593 x := left.Args[0]
22594 right := v_1
22595 if right.Op != OpRsh8Ux32 {
22596 continue
22597 }
22598 _ = right.Args[1]
22599 if x != right.Args[0] {
22600 continue
22601 }
22602 right_1 := right.Args[1]
22603 if right_1.Op != OpSub32 {
22604 continue
22605 }
22606 _ = right_1.Args[1]
22607 right_1_0 := right_1.Args[0]
22608 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22609 continue
22610 }
22611 v.reset(OpRotateLeft8)
22612 v.AddArg2(x, y)
22613 return true
22614 }
22615 break
22616 }
22617
22618
22619
22620 for {
22621 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22622 left := v_0
22623 if left.Op != OpLsh8x16 {
22624 continue
22625 }
22626 y := left.Args[1]
22627 x := left.Args[0]
22628 right := v_1
22629 if right.Op != OpRsh8Ux16 {
22630 continue
22631 }
22632 _ = right.Args[1]
22633 if x != right.Args[0] {
22634 continue
22635 }
22636 right_1 := right.Args[1]
22637 if right_1.Op != OpSub16 {
22638 continue
22639 }
22640 _ = right_1.Args[1]
22641 right_1_0 := right_1.Args[0]
22642 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22643 continue
22644 }
22645 v.reset(OpRotateLeft8)
22646 v.AddArg2(x, y)
22647 return true
22648 }
22649 break
22650 }
22651
22652
22653
22654 for {
22655 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22656 left := v_0
22657 if left.Op != OpLsh8x8 {
22658 continue
22659 }
22660 y := left.Args[1]
22661 x := left.Args[0]
22662 right := v_1
22663 if right.Op != OpRsh8Ux8 {
22664 continue
22665 }
22666 _ = right.Args[1]
22667 if x != right.Args[0] {
22668 continue
22669 }
22670 right_1 := right.Args[1]
22671 if right_1.Op != OpSub8 {
22672 continue
22673 }
22674 _ = right_1.Args[1]
22675 right_1_0 := right_1.Args[0]
22676 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22677 continue
22678 }
22679 v.reset(OpRotateLeft8)
22680 v.AddArg2(x, y)
22681 return true
22682 }
22683 break
22684 }
22685
22686
22687
22688 for {
22689 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22690 right := v_0
22691 if right.Op != OpRsh8Ux64 {
22692 continue
22693 }
22694 y := right.Args[1]
22695 x := right.Args[0]
22696 left := v_1
22697 if left.Op != OpLsh8x64 {
22698 continue
22699 }
22700 _ = left.Args[1]
22701 if x != left.Args[0] {
22702 continue
22703 }
22704 z := left.Args[1]
22705 if z.Op != OpSub64 {
22706 continue
22707 }
22708 _ = z.Args[1]
22709 z_0 := z.Args[0]
22710 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22711 continue
22712 }
22713 v.reset(OpRotateLeft8)
22714 v.AddArg2(x, z)
22715 return true
22716 }
22717 break
22718 }
22719
22720
22721
22722 for {
22723 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22724 right := v_0
22725 if right.Op != OpRsh8Ux32 {
22726 continue
22727 }
22728 y := right.Args[1]
22729 x := right.Args[0]
22730 left := v_1
22731 if left.Op != OpLsh8x32 {
22732 continue
22733 }
22734 _ = left.Args[1]
22735 if x != left.Args[0] {
22736 continue
22737 }
22738 z := left.Args[1]
22739 if z.Op != OpSub32 {
22740 continue
22741 }
22742 _ = z.Args[1]
22743 z_0 := z.Args[0]
22744 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22745 continue
22746 }
22747 v.reset(OpRotateLeft8)
22748 v.AddArg2(x, z)
22749 return true
22750 }
22751 break
22752 }
22753
22754
22755
22756 for {
22757 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22758 right := v_0
22759 if right.Op != OpRsh8Ux16 {
22760 continue
22761 }
22762 y := right.Args[1]
22763 x := right.Args[0]
22764 left := v_1
22765 if left.Op != OpLsh8x16 {
22766 continue
22767 }
22768 _ = left.Args[1]
22769 if x != left.Args[0] {
22770 continue
22771 }
22772 z := left.Args[1]
22773 if z.Op != OpSub16 {
22774 continue
22775 }
22776 _ = z.Args[1]
22777 z_0 := z.Args[0]
22778 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22779 continue
22780 }
22781 v.reset(OpRotateLeft8)
22782 v.AddArg2(x, z)
22783 return true
22784 }
22785 break
22786 }
22787
22788
22789
22790 for {
22791 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22792 right := v_0
22793 if right.Op != OpRsh8Ux8 {
22794 continue
22795 }
22796 y := right.Args[1]
22797 x := right.Args[0]
22798 left := v_1
22799 if left.Op != OpLsh8x8 {
22800 continue
22801 }
22802 _ = left.Args[1]
22803 if x != left.Args[0] {
22804 continue
22805 }
22806 z := left.Args[1]
22807 if z.Op != OpSub8 {
22808 continue
22809 }
22810 _ = z.Args[1]
22811 z_0 := z.Args[0]
22812 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22813 continue
22814 }
22815 v.reset(OpRotateLeft8)
22816 v.AddArg2(x, z)
22817 return true
22818 }
22819 break
22820 }
22821 return false
22822 }
22823 func rewriteValuegeneric_OpOrB(v *Value) bool {
22824 v_1 := v.Args[1]
22825 v_0 := v.Args[0]
22826 b := v.Block
22827 typ := &b.Func.Config.Types
22828
22829
22830
22831 for {
22832 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22833 if v_0.Op != OpLess64 {
22834 continue
22835 }
22836 x := v_0.Args[1]
22837 v_0_0 := v_0.Args[0]
22838 if v_0_0.Op != OpConst64 {
22839 continue
22840 }
22841 c := auxIntToInt64(v_0_0.AuxInt)
22842 if v_1.Op != OpLess64 {
22843 continue
22844 }
22845 _ = v_1.Args[1]
22846 if x != v_1.Args[0] {
22847 continue
22848 }
22849 v_1_1 := v_1.Args[1]
22850 if v_1_1.Op != OpConst64 {
22851 continue
22852 }
22853 d := auxIntToInt64(v_1_1.AuxInt)
22854 if !(c >= d) {
22855 continue
22856 }
22857 v.reset(OpLess64U)
22858 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
22859 v0.AuxInt = int64ToAuxInt(c - d)
22860 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
22861 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
22862 v2.AuxInt = int64ToAuxInt(d)
22863 v1.AddArg2(x, v2)
22864 v.AddArg2(v0, v1)
22865 return true
22866 }
22867 break
22868 }
22869
22870
22871
22872 for {
22873 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22874 if v_0.Op != OpLeq64 {
22875 continue
22876 }
22877 x := v_0.Args[1]
22878 v_0_0 := v_0.Args[0]
22879 if v_0_0.Op != OpConst64 {
22880 continue
22881 }
22882 c := auxIntToInt64(v_0_0.AuxInt)
22883 if v_1.Op != OpLess64 {
22884 continue
22885 }
22886 _ = v_1.Args[1]
22887 if x != v_1.Args[0] {
22888 continue
22889 }
22890 v_1_1 := v_1.Args[1]
22891 if v_1_1.Op != OpConst64 {
22892 continue
22893 }
22894 d := auxIntToInt64(v_1_1.AuxInt)
22895 if !(c >= d) {
22896 continue
22897 }
22898 v.reset(OpLeq64U)
22899 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
22900 v0.AuxInt = int64ToAuxInt(c - d)
22901 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
22902 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
22903 v2.AuxInt = int64ToAuxInt(d)
22904 v1.AddArg2(x, v2)
22905 v.AddArg2(v0, v1)
22906 return true
22907 }
22908 break
22909 }
22910
22911
22912
22913 for {
22914 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22915 if v_0.Op != OpLess32 {
22916 continue
22917 }
22918 x := v_0.Args[1]
22919 v_0_0 := v_0.Args[0]
22920 if v_0_0.Op != OpConst32 {
22921 continue
22922 }
22923 c := auxIntToInt32(v_0_0.AuxInt)
22924 if v_1.Op != OpLess32 {
22925 continue
22926 }
22927 _ = v_1.Args[1]
22928 if x != v_1.Args[0] {
22929 continue
22930 }
22931 v_1_1 := v_1.Args[1]
22932 if v_1_1.Op != OpConst32 {
22933 continue
22934 }
22935 d := auxIntToInt32(v_1_1.AuxInt)
22936 if !(c >= d) {
22937 continue
22938 }
22939 v.reset(OpLess32U)
22940 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
22941 v0.AuxInt = int32ToAuxInt(c - d)
22942 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
22943 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
22944 v2.AuxInt = int32ToAuxInt(d)
22945 v1.AddArg2(x, v2)
22946 v.AddArg2(v0, v1)
22947 return true
22948 }
22949 break
22950 }
22951
22952
22953
22954 for {
22955 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22956 if v_0.Op != OpLeq32 {
22957 continue
22958 }
22959 x := v_0.Args[1]
22960 v_0_0 := v_0.Args[0]
22961 if v_0_0.Op != OpConst32 {
22962 continue
22963 }
22964 c := auxIntToInt32(v_0_0.AuxInt)
22965 if v_1.Op != OpLess32 {
22966 continue
22967 }
22968 _ = v_1.Args[1]
22969 if x != v_1.Args[0] {
22970 continue
22971 }
22972 v_1_1 := v_1.Args[1]
22973 if v_1_1.Op != OpConst32 {
22974 continue
22975 }
22976 d := auxIntToInt32(v_1_1.AuxInt)
22977 if !(c >= d) {
22978 continue
22979 }
22980 v.reset(OpLeq32U)
22981 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
22982 v0.AuxInt = int32ToAuxInt(c - d)
22983 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
22984 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
22985 v2.AuxInt = int32ToAuxInt(d)
22986 v1.AddArg2(x, v2)
22987 v.AddArg2(v0, v1)
22988 return true
22989 }
22990 break
22991 }
22992
22993
22994
22995 for {
22996 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22997 if v_0.Op != OpLess16 {
22998 continue
22999 }
23000 x := v_0.Args[1]
23001 v_0_0 := v_0.Args[0]
23002 if v_0_0.Op != OpConst16 {
23003 continue
23004 }
23005 c := auxIntToInt16(v_0_0.AuxInt)
23006 if v_1.Op != OpLess16 {
23007 continue
23008 }
23009 _ = v_1.Args[1]
23010 if x != v_1.Args[0] {
23011 continue
23012 }
23013 v_1_1 := v_1.Args[1]
23014 if v_1_1.Op != OpConst16 {
23015 continue
23016 }
23017 d := auxIntToInt16(v_1_1.AuxInt)
23018 if !(c >= d) {
23019 continue
23020 }
23021 v.reset(OpLess16U)
23022 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23023 v0.AuxInt = int16ToAuxInt(c - d)
23024 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23025 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23026 v2.AuxInt = int16ToAuxInt(d)
23027 v1.AddArg2(x, v2)
23028 v.AddArg2(v0, v1)
23029 return true
23030 }
23031 break
23032 }
23033
23034
23035
23036 for {
23037 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23038 if v_0.Op != OpLeq16 {
23039 continue
23040 }
23041 x := v_0.Args[1]
23042 v_0_0 := v_0.Args[0]
23043 if v_0_0.Op != OpConst16 {
23044 continue
23045 }
23046 c := auxIntToInt16(v_0_0.AuxInt)
23047 if v_1.Op != OpLess16 {
23048 continue
23049 }
23050 _ = v_1.Args[1]
23051 if x != v_1.Args[0] {
23052 continue
23053 }
23054 v_1_1 := v_1.Args[1]
23055 if v_1_1.Op != OpConst16 {
23056 continue
23057 }
23058 d := auxIntToInt16(v_1_1.AuxInt)
23059 if !(c >= d) {
23060 continue
23061 }
23062 v.reset(OpLeq16U)
23063 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23064 v0.AuxInt = int16ToAuxInt(c - d)
23065 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23066 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23067 v2.AuxInt = int16ToAuxInt(d)
23068 v1.AddArg2(x, v2)
23069 v.AddArg2(v0, v1)
23070 return true
23071 }
23072 break
23073 }
23074
23075
23076
23077 for {
23078 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23079 if v_0.Op != OpLess8 {
23080 continue
23081 }
23082 x := v_0.Args[1]
23083 v_0_0 := v_0.Args[0]
23084 if v_0_0.Op != OpConst8 {
23085 continue
23086 }
23087 c := auxIntToInt8(v_0_0.AuxInt)
23088 if v_1.Op != OpLess8 {
23089 continue
23090 }
23091 _ = v_1.Args[1]
23092 if x != v_1.Args[0] {
23093 continue
23094 }
23095 v_1_1 := v_1.Args[1]
23096 if v_1_1.Op != OpConst8 {
23097 continue
23098 }
23099 d := auxIntToInt8(v_1_1.AuxInt)
23100 if !(c >= d) {
23101 continue
23102 }
23103 v.reset(OpLess8U)
23104 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23105 v0.AuxInt = int8ToAuxInt(c - d)
23106 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23107 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23108 v2.AuxInt = int8ToAuxInt(d)
23109 v1.AddArg2(x, v2)
23110 v.AddArg2(v0, v1)
23111 return true
23112 }
23113 break
23114 }
23115
23116
23117
23118 for {
23119 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23120 if v_0.Op != OpLeq8 {
23121 continue
23122 }
23123 x := v_0.Args[1]
23124 v_0_0 := v_0.Args[0]
23125 if v_0_0.Op != OpConst8 {
23126 continue
23127 }
23128 c := auxIntToInt8(v_0_0.AuxInt)
23129 if v_1.Op != OpLess8 {
23130 continue
23131 }
23132 _ = v_1.Args[1]
23133 if x != v_1.Args[0] {
23134 continue
23135 }
23136 v_1_1 := v_1.Args[1]
23137 if v_1_1.Op != OpConst8 {
23138 continue
23139 }
23140 d := auxIntToInt8(v_1_1.AuxInt)
23141 if !(c >= d) {
23142 continue
23143 }
23144 v.reset(OpLeq8U)
23145 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23146 v0.AuxInt = int8ToAuxInt(c - d)
23147 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23148 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23149 v2.AuxInt = int8ToAuxInt(d)
23150 v1.AddArg2(x, v2)
23151 v.AddArg2(v0, v1)
23152 return true
23153 }
23154 break
23155 }
23156
23157
23158
23159 for {
23160 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23161 if v_0.Op != OpLess64 {
23162 continue
23163 }
23164 x := v_0.Args[1]
23165 v_0_0 := v_0.Args[0]
23166 if v_0_0.Op != OpConst64 {
23167 continue
23168 }
23169 c := auxIntToInt64(v_0_0.AuxInt)
23170 if v_1.Op != OpLeq64 {
23171 continue
23172 }
23173 _ = v_1.Args[1]
23174 if x != v_1.Args[0] {
23175 continue
23176 }
23177 v_1_1 := v_1.Args[1]
23178 if v_1_1.Op != OpConst64 {
23179 continue
23180 }
23181 d := auxIntToInt64(v_1_1.AuxInt)
23182 if !(c >= d+1 && d+1 > d) {
23183 continue
23184 }
23185 v.reset(OpLess64U)
23186 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23187 v0.AuxInt = int64ToAuxInt(c - d - 1)
23188 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23189 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23190 v2.AuxInt = int64ToAuxInt(d + 1)
23191 v1.AddArg2(x, v2)
23192 v.AddArg2(v0, v1)
23193 return true
23194 }
23195 break
23196 }
23197
23198
23199
23200 for {
23201 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23202 if v_0.Op != OpLeq64 {
23203 continue
23204 }
23205 x := v_0.Args[1]
23206 v_0_0 := v_0.Args[0]
23207 if v_0_0.Op != OpConst64 {
23208 continue
23209 }
23210 c := auxIntToInt64(v_0_0.AuxInt)
23211 if v_1.Op != OpLeq64 {
23212 continue
23213 }
23214 _ = v_1.Args[1]
23215 if x != v_1.Args[0] {
23216 continue
23217 }
23218 v_1_1 := v_1.Args[1]
23219 if v_1_1.Op != OpConst64 {
23220 continue
23221 }
23222 d := auxIntToInt64(v_1_1.AuxInt)
23223 if !(c >= d+1 && d+1 > d) {
23224 continue
23225 }
23226 v.reset(OpLeq64U)
23227 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23228 v0.AuxInt = int64ToAuxInt(c - d - 1)
23229 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23230 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23231 v2.AuxInt = int64ToAuxInt(d + 1)
23232 v1.AddArg2(x, v2)
23233 v.AddArg2(v0, v1)
23234 return true
23235 }
23236 break
23237 }
23238
23239
23240
23241 for {
23242 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23243 if v_0.Op != OpLess32 {
23244 continue
23245 }
23246 x := v_0.Args[1]
23247 v_0_0 := v_0.Args[0]
23248 if v_0_0.Op != OpConst32 {
23249 continue
23250 }
23251 c := auxIntToInt32(v_0_0.AuxInt)
23252 if v_1.Op != OpLeq32 {
23253 continue
23254 }
23255 _ = v_1.Args[1]
23256 if x != v_1.Args[0] {
23257 continue
23258 }
23259 v_1_1 := v_1.Args[1]
23260 if v_1_1.Op != OpConst32 {
23261 continue
23262 }
23263 d := auxIntToInt32(v_1_1.AuxInt)
23264 if !(c >= d+1 && d+1 > d) {
23265 continue
23266 }
23267 v.reset(OpLess32U)
23268 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23269 v0.AuxInt = int32ToAuxInt(c - d - 1)
23270 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23271 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23272 v2.AuxInt = int32ToAuxInt(d + 1)
23273 v1.AddArg2(x, v2)
23274 v.AddArg2(v0, v1)
23275 return true
23276 }
23277 break
23278 }
23279
23280
23281
23282 for {
23283 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23284 if v_0.Op != OpLeq32 {
23285 continue
23286 }
23287 x := v_0.Args[1]
23288 v_0_0 := v_0.Args[0]
23289 if v_0_0.Op != OpConst32 {
23290 continue
23291 }
23292 c := auxIntToInt32(v_0_0.AuxInt)
23293 if v_1.Op != OpLeq32 {
23294 continue
23295 }
23296 _ = v_1.Args[1]
23297 if x != v_1.Args[0] {
23298 continue
23299 }
23300 v_1_1 := v_1.Args[1]
23301 if v_1_1.Op != OpConst32 {
23302 continue
23303 }
23304 d := auxIntToInt32(v_1_1.AuxInt)
23305 if !(c >= d+1 && d+1 > d) {
23306 continue
23307 }
23308 v.reset(OpLeq32U)
23309 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23310 v0.AuxInt = int32ToAuxInt(c - d - 1)
23311 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23312 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23313 v2.AuxInt = int32ToAuxInt(d + 1)
23314 v1.AddArg2(x, v2)
23315 v.AddArg2(v0, v1)
23316 return true
23317 }
23318 break
23319 }
23320
23321
23322
23323 for {
23324 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23325 if v_0.Op != OpLess16 {
23326 continue
23327 }
23328 x := v_0.Args[1]
23329 v_0_0 := v_0.Args[0]
23330 if v_0_0.Op != OpConst16 {
23331 continue
23332 }
23333 c := auxIntToInt16(v_0_0.AuxInt)
23334 if v_1.Op != OpLeq16 {
23335 continue
23336 }
23337 _ = v_1.Args[1]
23338 if x != v_1.Args[0] {
23339 continue
23340 }
23341 v_1_1 := v_1.Args[1]
23342 if v_1_1.Op != OpConst16 {
23343 continue
23344 }
23345 d := auxIntToInt16(v_1_1.AuxInt)
23346 if !(c >= d+1 && d+1 > d) {
23347 continue
23348 }
23349 v.reset(OpLess16U)
23350 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23351 v0.AuxInt = int16ToAuxInt(c - d - 1)
23352 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23353 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23354 v2.AuxInt = int16ToAuxInt(d + 1)
23355 v1.AddArg2(x, v2)
23356 v.AddArg2(v0, v1)
23357 return true
23358 }
23359 break
23360 }
23361
23362
23363
23364 for {
23365 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23366 if v_0.Op != OpLeq16 {
23367 continue
23368 }
23369 x := v_0.Args[1]
23370 v_0_0 := v_0.Args[0]
23371 if v_0_0.Op != OpConst16 {
23372 continue
23373 }
23374 c := auxIntToInt16(v_0_0.AuxInt)
23375 if v_1.Op != OpLeq16 {
23376 continue
23377 }
23378 _ = v_1.Args[1]
23379 if x != v_1.Args[0] {
23380 continue
23381 }
23382 v_1_1 := v_1.Args[1]
23383 if v_1_1.Op != OpConst16 {
23384 continue
23385 }
23386 d := auxIntToInt16(v_1_1.AuxInt)
23387 if !(c >= d+1 && d+1 > d) {
23388 continue
23389 }
23390 v.reset(OpLeq16U)
23391 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23392 v0.AuxInt = int16ToAuxInt(c - d - 1)
23393 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23394 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23395 v2.AuxInt = int16ToAuxInt(d + 1)
23396 v1.AddArg2(x, v2)
23397 v.AddArg2(v0, v1)
23398 return true
23399 }
23400 break
23401 }
23402
23403
23404
23405 for {
23406 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23407 if v_0.Op != OpLess8 {
23408 continue
23409 }
23410 x := v_0.Args[1]
23411 v_0_0 := v_0.Args[0]
23412 if v_0_0.Op != OpConst8 {
23413 continue
23414 }
23415 c := auxIntToInt8(v_0_0.AuxInt)
23416 if v_1.Op != OpLeq8 {
23417 continue
23418 }
23419 _ = v_1.Args[1]
23420 if x != v_1.Args[0] {
23421 continue
23422 }
23423 v_1_1 := v_1.Args[1]
23424 if v_1_1.Op != OpConst8 {
23425 continue
23426 }
23427 d := auxIntToInt8(v_1_1.AuxInt)
23428 if !(c >= d+1 && d+1 > d) {
23429 continue
23430 }
23431 v.reset(OpLess8U)
23432 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23433 v0.AuxInt = int8ToAuxInt(c - d - 1)
23434 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23435 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23436 v2.AuxInt = int8ToAuxInt(d + 1)
23437 v1.AddArg2(x, v2)
23438 v.AddArg2(v0, v1)
23439 return true
23440 }
23441 break
23442 }
23443
23444
23445
23446 for {
23447 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23448 if v_0.Op != OpLeq8 {
23449 continue
23450 }
23451 x := v_0.Args[1]
23452 v_0_0 := v_0.Args[0]
23453 if v_0_0.Op != OpConst8 {
23454 continue
23455 }
23456 c := auxIntToInt8(v_0_0.AuxInt)
23457 if v_1.Op != OpLeq8 {
23458 continue
23459 }
23460 _ = v_1.Args[1]
23461 if x != v_1.Args[0] {
23462 continue
23463 }
23464 v_1_1 := v_1.Args[1]
23465 if v_1_1.Op != OpConst8 {
23466 continue
23467 }
23468 d := auxIntToInt8(v_1_1.AuxInt)
23469 if !(c >= d+1 && d+1 > d) {
23470 continue
23471 }
23472 v.reset(OpLeq8U)
23473 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23474 v0.AuxInt = int8ToAuxInt(c - d - 1)
23475 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23476 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23477 v2.AuxInt = int8ToAuxInt(d + 1)
23478 v1.AddArg2(x, v2)
23479 v.AddArg2(v0, v1)
23480 return true
23481 }
23482 break
23483 }
23484
23485
23486
23487 for {
23488 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23489 if v_0.Op != OpLess64U {
23490 continue
23491 }
23492 x := v_0.Args[1]
23493 v_0_0 := v_0.Args[0]
23494 if v_0_0.Op != OpConst64 {
23495 continue
23496 }
23497 c := auxIntToInt64(v_0_0.AuxInt)
23498 if v_1.Op != OpLess64U {
23499 continue
23500 }
23501 _ = v_1.Args[1]
23502 if x != v_1.Args[0] {
23503 continue
23504 }
23505 v_1_1 := v_1.Args[1]
23506 if v_1_1.Op != OpConst64 {
23507 continue
23508 }
23509 d := auxIntToInt64(v_1_1.AuxInt)
23510 if !(uint64(c) >= uint64(d)) {
23511 continue
23512 }
23513 v.reset(OpLess64U)
23514 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23515 v0.AuxInt = int64ToAuxInt(c - d)
23516 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23517 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23518 v2.AuxInt = int64ToAuxInt(d)
23519 v1.AddArg2(x, v2)
23520 v.AddArg2(v0, v1)
23521 return true
23522 }
23523 break
23524 }
23525
23526
23527
23528 for {
23529 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23530 if v_0.Op != OpLeq64U {
23531 continue
23532 }
23533 x := v_0.Args[1]
23534 v_0_0 := v_0.Args[0]
23535 if v_0_0.Op != OpConst64 {
23536 continue
23537 }
23538 c := auxIntToInt64(v_0_0.AuxInt)
23539 if v_1.Op != OpLess64U {
23540 continue
23541 }
23542 _ = v_1.Args[1]
23543 if x != v_1.Args[0] {
23544 continue
23545 }
23546 v_1_1 := v_1.Args[1]
23547 if v_1_1.Op != OpConst64 {
23548 continue
23549 }
23550 d := auxIntToInt64(v_1_1.AuxInt)
23551 if !(uint64(c) >= uint64(d)) {
23552 continue
23553 }
23554 v.reset(OpLeq64U)
23555 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23556 v0.AuxInt = int64ToAuxInt(c - d)
23557 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23558 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23559 v2.AuxInt = int64ToAuxInt(d)
23560 v1.AddArg2(x, v2)
23561 v.AddArg2(v0, v1)
23562 return true
23563 }
23564 break
23565 }
23566
23567
23568
23569 for {
23570 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23571 if v_0.Op != OpLess32U {
23572 continue
23573 }
23574 x := v_0.Args[1]
23575 v_0_0 := v_0.Args[0]
23576 if v_0_0.Op != OpConst32 {
23577 continue
23578 }
23579 c := auxIntToInt32(v_0_0.AuxInt)
23580 if v_1.Op != OpLess32U {
23581 continue
23582 }
23583 _ = v_1.Args[1]
23584 if x != v_1.Args[0] {
23585 continue
23586 }
23587 v_1_1 := v_1.Args[1]
23588 if v_1_1.Op != OpConst32 {
23589 continue
23590 }
23591 d := auxIntToInt32(v_1_1.AuxInt)
23592 if !(uint32(c) >= uint32(d)) {
23593 continue
23594 }
23595 v.reset(OpLess32U)
23596 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23597 v0.AuxInt = int32ToAuxInt(c - d)
23598 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23599 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23600 v2.AuxInt = int32ToAuxInt(d)
23601 v1.AddArg2(x, v2)
23602 v.AddArg2(v0, v1)
23603 return true
23604 }
23605 break
23606 }
23607
23608
23609
23610 for {
23611 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23612 if v_0.Op != OpLeq32U {
23613 continue
23614 }
23615 x := v_0.Args[1]
23616 v_0_0 := v_0.Args[0]
23617 if v_0_0.Op != OpConst32 {
23618 continue
23619 }
23620 c := auxIntToInt32(v_0_0.AuxInt)
23621 if v_1.Op != OpLess32U {
23622 continue
23623 }
23624 _ = v_1.Args[1]
23625 if x != v_1.Args[0] {
23626 continue
23627 }
23628 v_1_1 := v_1.Args[1]
23629 if v_1_1.Op != OpConst32 {
23630 continue
23631 }
23632 d := auxIntToInt32(v_1_1.AuxInt)
23633 if !(uint32(c) >= uint32(d)) {
23634 continue
23635 }
23636 v.reset(OpLeq32U)
23637 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23638 v0.AuxInt = int32ToAuxInt(c - d)
23639 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23640 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23641 v2.AuxInt = int32ToAuxInt(d)
23642 v1.AddArg2(x, v2)
23643 v.AddArg2(v0, v1)
23644 return true
23645 }
23646 break
23647 }
23648
23649
23650
23651 for {
23652 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23653 if v_0.Op != OpLess16U {
23654 continue
23655 }
23656 x := v_0.Args[1]
23657 v_0_0 := v_0.Args[0]
23658 if v_0_0.Op != OpConst16 {
23659 continue
23660 }
23661 c := auxIntToInt16(v_0_0.AuxInt)
23662 if v_1.Op != OpLess16U {
23663 continue
23664 }
23665 _ = v_1.Args[1]
23666 if x != v_1.Args[0] {
23667 continue
23668 }
23669 v_1_1 := v_1.Args[1]
23670 if v_1_1.Op != OpConst16 {
23671 continue
23672 }
23673 d := auxIntToInt16(v_1_1.AuxInt)
23674 if !(uint16(c) >= uint16(d)) {
23675 continue
23676 }
23677 v.reset(OpLess16U)
23678 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23679 v0.AuxInt = int16ToAuxInt(c - d)
23680 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23681 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23682 v2.AuxInt = int16ToAuxInt(d)
23683 v1.AddArg2(x, v2)
23684 v.AddArg2(v0, v1)
23685 return true
23686 }
23687 break
23688 }
23689
23690
23691
23692 for {
23693 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23694 if v_0.Op != OpLeq16U {
23695 continue
23696 }
23697 x := v_0.Args[1]
23698 v_0_0 := v_0.Args[0]
23699 if v_0_0.Op != OpConst16 {
23700 continue
23701 }
23702 c := auxIntToInt16(v_0_0.AuxInt)
23703 if v_1.Op != OpLess16U {
23704 continue
23705 }
23706 _ = v_1.Args[1]
23707 if x != v_1.Args[0] {
23708 continue
23709 }
23710 v_1_1 := v_1.Args[1]
23711 if v_1_1.Op != OpConst16 {
23712 continue
23713 }
23714 d := auxIntToInt16(v_1_1.AuxInt)
23715 if !(uint16(c) >= uint16(d)) {
23716 continue
23717 }
23718 v.reset(OpLeq16U)
23719 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23720 v0.AuxInt = int16ToAuxInt(c - d)
23721 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23722 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23723 v2.AuxInt = int16ToAuxInt(d)
23724 v1.AddArg2(x, v2)
23725 v.AddArg2(v0, v1)
23726 return true
23727 }
23728 break
23729 }
23730
23731
23732
23733 for {
23734 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23735 if v_0.Op != OpLess8U {
23736 continue
23737 }
23738 x := v_0.Args[1]
23739 v_0_0 := v_0.Args[0]
23740 if v_0_0.Op != OpConst8 {
23741 continue
23742 }
23743 c := auxIntToInt8(v_0_0.AuxInt)
23744 if v_1.Op != OpLess8U {
23745 continue
23746 }
23747 _ = v_1.Args[1]
23748 if x != v_1.Args[0] {
23749 continue
23750 }
23751 v_1_1 := v_1.Args[1]
23752 if v_1_1.Op != OpConst8 {
23753 continue
23754 }
23755 d := auxIntToInt8(v_1_1.AuxInt)
23756 if !(uint8(c) >= uint8(d)) {
23757 continue
23758 }
23759 v.reset(OpLess8U)
23760 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23761 v0.AuxInt = int8ToAuxInt(c - d)
23762 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23763 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23764 v2.AuxInt = int8ToAuxInt(d)
23765 v1.AddArg2(x, v2)
23766 v.AddArg2(v0, v1)
23767 return true
23768 }
23769 break
23770 }
23771
23772
23773
23774 for {
23775 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23776 if v_0.Op != OpLeq8U {
23777 continue
23778 }
23779 x := v_0.Args[1]
23780 v_0_0 := v_0.Args[0]
23781 if v_0_0.Op != OpConst8 {
23782 continue
23783 }
23784 c := auxIntToInt8(v_0_0.AuxInt)
23785 if v_1.Op != OpLess8U {
23786 continue
23787 }
23788 _ = v_1.Args[1]
23789 if x != v_1.Args[0] {
23790 continue
23791 }
23792 v_1_1 := v_1.Args[1]
23793 if v_1_1.Op != OpConst8 {
23794 continue
23795 }
23796 d := auxIntToInt8(v_1_1.AuxInt)
23797 if !(uint8(c) >= uint8(d)) {
23798 continue
23799 }
23800 v.reset(OpLeq8U)
23801 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23802 v0.AuxInt = int8ToAuxInt(c - d)
23803 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23804 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23805 v2.AuxInt = int8ToAuxInt(d)
23806 v1.AddArg2(x, v2)
23807 v.AddArg2(v0, v1)
23808 return true
23809 }
23810 break
23811 }
23812
23813
23814
23815 for {
23816 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23817 if v_0.Op != OpLess64U {
23818 continue
23819 }
23820 x := v_0.Args[1]
23821 v_0_0 := v_0.Args[0]
23822 if v_0_0.Op != OpConst64 {
23823 continue
23824 }
23825 c := auxIntToInt64(v_0_0.AuxInt)
23826 if v_1.Op != OpLeq64U {
23827 continue
23828 }
23829 _ = v_1.Args[1]
23830 if x != v_1.Args[0] {
23831 continue
23832 }
23833 v_1_1 := v_1.Args[1]
23834 if v_1_1.Op != OpConst64 {
23835 continue
23836 }
23837 d := auxIntToInt64(v_1_1.AuxInt)
23838 if !(uint64(c) >= uint64(d+1) && uint64(d+1) > uint64(d)) {
23839 continue
23840 }
23841 v.reset(OpLess64U)
23842 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23843 v0.AuxInt = int64ToAuxInt(c - d - 1)
23844 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23845 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23846 v2.AuxInt = int64ToAuxInt(d + 1)
23847 v1.AddArg2(x, v2)
23848 v.AddArg2(v0, v1)
23849 return true
23850 }
23851 break
23852 }
23853
23854
23855
23856 for {
23857 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23858 if v_0.Op != OpLeq64U {
23859 continue
23860 }
23861 x := v_0.Args[1]
23862 v_0_0 := v_0.Args[0]
23863 if v_0_0.Op != OpConst64 {
23864 continue
23865 }
23866 c := auxIntToInt64(v_0_0.AuxInt)
23867 if v_1.Op != OpLeq64U {
23868 continue
23869 }
23870 _ = v_1.Args[1]
23871 if x != v_1.Args[0] {
23872 continue
23873 }
23874 v_1_1 := v_1.Args[1]
23875 if v_1_1.Op != OpConst64 {
23876 continue
23877 }
23878 d := auxIntToInt64(v_1_1.AuxInt)
23879 if !(uint64(c) >= uint64(d+1) && uint64(d+1) > uint64(d)) {
23880 continue
23881 }
23882 v.reset(OpLeq64U)
23883 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23884 v0.AuxInt = int64ToAuxInt(c - d - 1)
23885 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23886 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23887 v2.AuxInt = int64ToAuxInt(d + 1)
23888 v1.AddArg2(x, v2)
23889 v.AddArg2(v0, v1)
23890 return true
23891 }
23892 break
23893 }
23894
23895
23896
23897 for {
23898 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23899 if v_0.Op != OpLess32U {
23900 continue
23901 }
23902 x := v_0.Args[1]
23903 v_0_0 := v_0.Args[0]
23904 if v_0_0.Op != OpConst32 {
23905 continue
23906 }
23907 c := auxIntToInt32(v_0_0.AuxInt)
23908 if v_1.Op != OpLeq32U {
23909 continue
23910 }
23911 _ = v_1.Args[1]
23912 if x != v_1.Args[0] {
23913 continue
23914 }
23915 v_1_1 := v_1.Args[1]
23916 if v_1_1.Op != OpConst32 {
23917 continue
23918 }
23919 d := auxIntToInt32(v_1_1.AuxInt)
23920 if !(uint32(c) >= uint32(d+1) && uint32(d+1) > uint32(d)) {
23921 continue
23922 }
23923 v.reset(OpLess32U)
23924 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23925 v0.AuxInt = int32ToAuxInt(c - d - 1)
23926 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23927 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23928 v2.AuxInt = int32ToAuxInt(d + 1)
23929 v1.AddArg2(x, v2)
23930 v.AddArg2(v0, v1)
23931 return true
23932 }
23933 break
23934 }
23935
23936
23937
23938 for {
23939 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23940 if v_0.Op != OpLeq32U {
23941 continue
23942 }
23943 x := v_0.Args[1]
23944 v_0_0 := v_0.Args[0]
23945 if v_0_0.Op != OpConst32 {
23946 continue
23947 }
23948 c := auxIntToInt32(v_0_0.AuxInt)
23949 if v_1.Op != OpLeq32U {
23950 continue
23951 }
23952 _ = v_1.Args[1]
23953 if x != v_1.Args[0] {
23954 continue
23955 }
23956 v_1_1 := v_1.Args[1]
23957 if v_1_1.Op != OpConst32 {
23958 continue
23959 }
23960 d := auxIntToInt32(v_1_1.AuxInt)
23961 if !(uint32(c) >= uint32(d+1) && uint32(d+1) > uint32(d)) {
23962 continue
23963 }
23964 v.reset(OpLeq32U)
23965 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23966 v0.AuxInt = int32ToAuxInt(c - d - 1)
23967 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23968 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23969 v2.AuxInt = int32ToAuxInt(d + 1)
23970 v1.AddArg2(x, v2)
23971 v.AddArg2(v0, v1)
23972 return true
23973 }
23974 break
23975 }
23976
23977
23978
23979 for {
23980 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23981 if v_0.Op != OpLess16U {
23982 continue
23983 }
23984 x := v_0.Args[1]
23985 v_0_0 := v_0.Args[0]
23986 if v_0_0.Op != OpConst16 {
23987 continue
23988 }
23989 c := auxIntToInt16(v_0_0.AuxInt)
23990 if v_1.Op != OpLeq16U {
23991 continue
23992 }
23993 _ = v_1.Args[1]
23994 if x != v_1.Args[0] {
23995 continue
23996 }
23997 v_1_1 := v_1.Args[1]
23998 if v_1_1.Op != OpConst16 {
23999 continue
24000 }
24001 d := auxIntToInt16(v_1_1.AuxInt)
24002 if !(uint16(c) >= uint16(d+1) && uint16(d+1) > uint16(d)) {
24003 continue
24004 }
24005 v.reset(OpLess16U)
24006 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24007 v0.AuxInt = int16ToAuxInt(c - d - 1)
24008 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24009 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24010 v2.AuxInt = int16ToAuxInt(d + 1)
24011 v1.AddArg2(x, v2)
24012 v.AddArg2(v0, v1)
24013 return true
24014 }
24015 break
24016 }
24017
24018
24019
24020 for {
24021 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24022 if v_0.Op != OpLeq16U {
24023 continue
24024 }
24025 x := v_0.Args[1]
24026 v_0_0 := v_0.Args[0]
24027 if v_0_0.Op != OpConst16 {
24028 continue
24029 }
24030 c := auxIntToInt16(v_0_0.AuxInt)
24031 if v_1.Op != OpLeq16U {
24032 continue
24033 }
24034 _ = v_1.Args[1]
24035 if x != v_1.Args[0] {
24036 continue
24037 }
24038 v_1_1 := v_1.Args[1]
24039 if v_1_1.Op != OpConst16 {
24040 continue
24041 }
24042 d := auxIntToInt16(v_1_1.AuxInt)
24043 if !(uint16(c) >= uint16(d+1) && uint16(d+1) > uint16(d)) {
24044 continue
24045 }
24046 v.reset(OpLeq16U)
24047 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24048 v0.AuxInt = int16ToAuxInt(c - d - 1)
24049 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24050 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24051 v2.AuxInt = int16ToAuxInt(d + 1)
24052 v1.AddArg2(x, v2)
24053 v.AddArg2(v0, v1)
24054 return true
24055 }
24056 break
24057 }
24058
24059
24060
24061 for {
24062 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24063 if v_0.Op != OpLess8U {
24064 continue
24065 }
24066 x := v_0.Args[1]
24067 v_0_0 := v_0.Args[0]
24068 if v_0_0.Op != OpConst8 {
24069 continue
24070 }
24071 c := auxIntToInt8(v_0_0.AuxInt)
24072 if v_1.Op != OpLeq8U {
24073 continue
24074 }
24075 _ = v_1.Args[1]
24076 if x != v_1.Args[0] {
24077 continue
24078 }
24079 v_1_1 := v_1.Args[1]
24080 if v_1_1.Op != OpConst8 {
24081 continue
24082 }
24083 d := auxIntToInt8(v_1_1.AuxInt)
24084 if !(uint8(c) >= uint8(d+1) && uint8(d+1) > uint8(d)) {
24085 continue
24086 }
24087 v.reset(OpLess8U)
24088 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24089 v0.AuxInt = int8ToAuxInt(c - d - 1)
24090 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24091 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24092 v2.AuxInt = int8ToAuxInt(d + 1)
24093 v1.AddArg2(x, v2)
24094 v.AddArg2(v0, v1)
24095 return true
24096 }
24097 break
24098 }
24099
24100
24101
24102 for {
24103 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24104 if v_0.Op != OpLeq8U {
24105 continue
24106 }
24107 x := v_0.Args[1]
24108 v_0_0 := v_0.Args[0]
24109 if v_0_0.Op != OpConst8 {
24110 continue
24111 }
24112 c := auxIntToInt8(v_0_0.AuxInt)
24113 if v_1.Op != OpLeq8U {
24114 continue
24115 }
24116 _ = v_1.Args[1]
24117 if x != v_1.Args[0] {
24118 continue
24119 }
24120 v_1_1 := v_1.Args[1]
24121 if v_1_1.Op != OpConst8 {
24122 continue
24123 }
24124 d := auxIntToInt8(v_1_1.AuxInt)
24125 if !(uint8(c) >= uint8(d+1) && uint8(d+1) > uint8(d)) {
24126 continue
24127 }
24128 v.reset(OpLeq8U)
24129 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24130 v0.AuxInt = int8ToAuxInt(c - d - 1)
24131 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24132 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24133 v2.AuxInt = int8ToAuxInt(d + 1)
24134 v1.AddArg2(x, v2)
24135 v.AddArg2(v0, v1)
24136 return true
24137 }
24138 break
24139 }
24140
24141
24142
24143 for {
24144 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24145 if v_0.Op != OpEq64 {
24146 continue
24147 }
24148 _ = v_0.Args[1]
24149 v_0_0 := v_0.Args[0]
24150 v_0_1 := v_0.Args[1]
24151 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
24152 x := v_0_0
24153 cv := v_0_1
24154 if cv.Op != OpConst64 {
24155 continue
24156 }
24157 c := auxIntToInt64(cv.AuxInt)
24158 if v_1.Op != OpEq64 {
24159 continue
24160 }
24161 _ = v_1.Args[1]
24162 v_1_0 := v_1.Args[0]
24163 v_1_1 := v_1.Args[1]
24164 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
24165 if x != v_1_0 || v_1_1.Op != OpConst64 {
24166 continue
24167 }
24168 d := auxIntToInt64(v_1_1.AuxInt)
24169 if !(c|d == c && oneBit(c^d)) {
24170 continue
24171 }
24172 v.reset(OpEq64)
24173 v0 := b.NewValue0(v.Pos, OpOr64, x.Type)
24174 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
24175 v1.AuxInt = int64ToAuxInt(c ^ d)
24176 v0.AddArg2(x, v1)
24177 v.AddArg2(v0, cv)
24178 return true
24179 }
24180 }
24181 }
24182 break
24183 }
24184
24185
24186
24187 for {
24188 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24189 if v_0.Op != OpEq32 {
24190 continue
24191 }
24192 _ = v_0.Args[1]
24193 v_0_0 := v_0.Args[0]
24194 v_0_1 := v_0.Args[1]
24195 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
24196 x := v_0_0
24197 cv := v_0_1
24198 if cv.Op != OpConst32 {
24199 continue
24200 }
24201 c := auxIntToInt32(cv.AuxInt)
24202 if v_1.Op != OpEq32 {
24203 continue
24204 }
24205 _ = v_1.Args[1]
24206 v_1_0 := v_1.Args[0]
24207 v_1_1 := v_1.Args[1]
24208 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
24209 if x != v_1_0 || v_1_1.Op != OpConst32 {
24210 continue
24211 }
24212 d := auxIntToInt32(v_1_1.AuxInt)
24213 if !(c|d == c && oneBit(c^d)) {
24214 continue
24215 }
24216 v.reset(OpEq32)
24217 v0 := b.NewValue0(v.Pos, OpOr32, x.Type)
24218 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
24219 v1.AuxInt = int32ToAuxInt(c ^ d)
24220 v0.AddArg2(x, v1)
24221 v.AddArg2(v0, cv)
24222 return true
24223 }
24224 }
24225 }
24226 break
24227 }
24228
24229
24230
24231 for {
24232 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24233 if v_0.Op != OpEq16 {
24234 continue
24235 }
24236 _ = v_0.Args[1]
24237 v_0_0 := v_0.Args[0]
24238 v_0_1 := v_0.Args[1]
24239 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
24240 x := v_0_0
24241 cv := v_0_1
24242 if cv.Op != OpConst16 {
24243 continue
24244 }
24245 c := auxIntToInt16(cv.AuxInt)
24246 if v_1.Op != OpEq16 {
24247 continue
24248 }
24249 _ = v_1.Args[1]
24250 v_1_0 := v_1.Args[0]
24251 v_1_1 := v_1.Args[1]
24252 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
24253 if x != v_1_0 || v_1_1.Op != OpConst16 {
24254 continue
24255 }
24256 d := auxIntToInt16(v_1_1.AuxInt)
24257 if !(c|d == c && oneBit(c^d)) {
24258 continue
24259 }
24260 v.reset(OpEq16)
24261 v0 := b.NewValue0(v.Pos, OpOr16, x.Type)
24262 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
24263 v1.AuxInt = int16ToAuxInt(c ^ d)
24264 v0.AddArg2(x, v1)
24265 v.AddArg2(v0, cv)
24266 return true
24267 }
24268 }
24269 }
24270 break
24271 }
24272
24273
24274
24275 for {
24276 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24277 if v_0.Op != OpEq8 {
24278 continue
24279 }
24280 _ = v_0.Args[1]
24281 v_0_0 := v_0.Args[0]
24282 v_0_1 := v_0.Args[1]
24283 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
24284 x := v_0_0
24285 cv := v_0_1
24286 if cv.Op != OpConst8 {
24287 continue
24288 }
24289 c := auxIntToInt8(cv.AuxInt)
24290 if v_1.Op != OpEq8 {
24291 continue
24292 }
24293 _ = v_1.Args[1]
24294 v_1_0 := v_1.Args[0]
24295 v_1_1 := v_1.Args[1]
24296 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
24297 if x != v_1_0 || v_1_1.Op != OpConst8 {
24298 continue
24299 }
24300 d := auxIntToInt8(v_1_1.AuxInt)
24301 if !(c|d == c && oneBit(c^d)) {
24302 continue
24303 }
24304 v.reset(OpEq8)
24305 v0 := b.NewValue0(v.Pos, OpOr8, x.Type)
24306 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
24307 v1.AuxInt = int8ToAuxInt(c ^ d)
24308 v0.AddArg2(x, v1)
24309 v.AddArg2(v0, cv)
24310 return true
24311 }
24312 }
24313 }
24314 break
24315 }
24316
24317
24318 for {
24319 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24320 if v_0.Op != OpNeq64F {
24321 continue
24322 }
24323 x := v_0.Args[1]
24324 if x != v_0.Args[0] || v_1.Op != OpLess64F {
24325 continue
24326 }
24327 _ = v_1.Args[1]
24328 if x != v_1.Args[0] {
24329 continue
24330 }
24331 y := v_1.Args[1]
24332 if y.Op != OpConst64F {
24333 continue
24334 }
24335 v.reset(OpNot)
24336 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
24337 v0.AddArg2(y, x)
24338 v.AddArg(v0)
24339 return true
24340 }
24341 break
24342 }
24343
24344
24345 for {
24346 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24347 if v_0.Op != OpNeq64F {
24348 continue
24349 }
24350 x := v_0.Args[1]
24351 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
24352 continue
24353 }
24354 _ = v_1.Args[1]
24355 if x != v_1.Args[0] {
24356 continue
24357 }
24358 y := v_1.Args[1]
24359 if y.Op != OpConst64F {
24360 continue
24361 }
24362 v.reset(OpNot)
24363 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
24364 v0.AddArg2(y, x)
24365 v.AddArg(v0)
24366 return true
24367 }
24368 break
24369 }
24370
24371
24372 for {
24373 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24374 if v_0.Op != OpNeq64F {
24375 continue
24376 }
24377 x := v_0.Args[1]
24378 if x != v_0.Args[0] || v_1.Op != OpLess64F {
24379 continue
24380 }
24381 _ = v_1.Args[1]
24382 y := v_1.Args[0]
24383 if y.Op != OpConst64F {
24384 continue
24385 }
24386 if x != v_1.Args[1] {
24387 continue
24388 }
24389 v.reset(OpNot)
24390 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
24391 v0.AddArg2(x, y)
24392 v.AddArg(v0)
24393 return true
24394 }
24395 break
24396 }
24397
24398
24399 for {
24400 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24401 if v_0.Op != OpNeq64F {
24402 continue
24403 }
24404 x := v_0.Args[1]
24405 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
24406 continue
24407 }
24408 _ = v_1.Args[1]
24409 y := v_1.Args[0]
24410 if y.Op != OpConst64F {
24411 continue
24412 }
24413 if x != v_1.Args[1] {
24414 continue
24415 }
24416 v.reset(OpNot)
24417 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
24418 v0.AddArg2(x, y)
24419 v.AddArg(v0)
24420 return true
24421 }
24422 break
24423 }
24424
24425
24426 for {
24427 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24428 if v_0.Op != OpNeq32F {
24429 continue
24430 }
24431 x := v_0.Args[1]
24432 if x != v_0.Args[0] || v_1.Op != OpLess32F {
24433 continue
24434 }
24435 _ = v_1.Args[1]
24436 if x != v_1.Args[0] {
24437 continue
24438 }
24439 y := v_1.Args[1]
24440 if y.Op != OpConst32F {
24441 continue
24442 }
24443 v.reset(OpNot)
24444 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
24445 v0.AddArg2(y, x)
24446 v.AddArg(v0)
24447 return true
24448 }
24449 break
24450 }
24451
24452
24453 for {
24454 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24455 if v_0.Op != OpNeq32F {
24456 continue
24457 }
24458 x := v_0.Args[1]
24459 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
24460 continue
24461 }
24462 _ = v_1.Args[1]
24463 if x != v_1.Args[0] {
24464 continue
24465 }
24466 y := v_1.Args[1]
24467 if y.Op != OpConst32F {
24468 continue
24469 }
24470 v.reset(OpNot)
24471 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
24472 v0.AddArg2(y, x)
24473 v.AddArg(v0)
24474 return true
24475 }
24476 break
24477 }
24478
24479
24480 for {
24481 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24482 if v_0.Op != OpNeq32F {
24483 continue
24484 }
24485 x := v_0.Args[1]
24486 if x != v_0.Args[0] || v_1.Op != OpLess32F {
24487 continue
24488 }
24489 _ = v_1.Args[1]
24490 y := v_1.Args[0]
24491 if y.Op != OpConst32F {
24492 continue
24493 }
24494 if x != v_1.Args[1] {
24495 continue
24496 }
24497 v.reset(OpNot)
24498 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
24499 v0.AddArg2(x, y)
24500 v.AddArg(v0)
24501 return true
24502 }
24503 break
24504 }
24505
24506
24507 for {
24508 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24509 if v_0.Op != OpNeq32F {
24510 continue
24511 }
24512 x := v_0.Args[1]
24513 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
24514 continue
24515 }
24516 _ = v_1.Args[1]
24517 y := v_1.Args[0]
24518 if y.Op != OpConst32F {
24519 continue
24520 }
24521 if x != v_1.Args[1] {
24522 continue
24523 }
24524 v.reset(OpNot)
24525 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
24526 v0.AddArg2(x, y)
24527 v.AddArg(v0)
24528 return true
24529 }
24530 break
24531 }
24532
24533
24534 for {
24535 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24536 if v_0.Op != OpNeq64F {
24537 continue
24538 }
24539 x := v_0.Args[1]
24540 if x != v_0.Args[0] || v_1.Op != OpLess64F {
24541 continue
24542 }
24543 _ = v_1.Args[1]
24544 abs := v_1.Args[0]
24545 if abs.Op != OpAbs || x != abs.Args[0] {
24546 continue
24547 }
24548 y := v_1.Args[1]
24549 if y.Op != OpConst64F {
24550 continue
24551 }
24552 v.reset(OpNot)
24553 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
24554 v0.AddArg2(y, abs)
24555 v.AddArg(v0)
24556 return true
24557 }
24558 break
24559 }
24560
24561
24562 for {
24563 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24564 if v_0.Op != OpNeq64F {
24565 continue
24566 }
24567 x := v_0.Args[1]
24568 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
24569 continue
24570 }
24571 _ = v_1.Args[1]
24572 abs := v_1.Args[0]
24573 if abs.Op != OpAbs || x != abs.Args[0] {
24574 continue
24575 }
24576 y := v_1.Args[1]
24577 if y.Op != OpConst64F {
24578 continue
24579 }
24580 v.reset(OpNot)
24581 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
24582 v0.AddArg2(y, abs)
24583 v.AddArg(v0)
24584 return true
24585 }
24586 break
24587 }
24588
24589
24590 for {
24591 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24592 if v_0.Op != OpNeq64F {
24593 continue
24594 }
24595 x := v_0.Args[1]
24596 if x != v_0.Args[0] || v_1.Op != OpLess64F {
24597 continue
24598 }
24599 _ = v_1.Args[1]
24600 y := v_1.Args[0]
24601 if y.Op != OpConst64F {
24602 continue
24603 }
24604 abs := v_1.Args[1]
24605 if abs.Op != OpAbs || x != abs.Args[0] {
24606 continue
24607 }
24608 v.reset(OpNot)
24609 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
24610 v0.AddArg2(abs, y)
24611 v.AddArg(v0)
24612 return true
24613 }
24614 break
24615 }
24616
24617
24618 for {
24619 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24620 if v_0.Op != OpNeq64F {
24621 continue
24622 }
24623 x := v_0.Args[1]
24624 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
24625 continue
24626 }
24627 _ = v_1.Args[1]
24628 y := v_1.Args[0]
24629 if y.Op != OpConst64F {
24630 continue
24631 }
24632 abs := v_1.Args[1]
24633 if abs.Op != OpAbs || x != abs.Args[0] {
24634 continue
24635 }
24636 v.reset(OpNot)
24637 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
24638 v0.AddArg2(abs, y)
24639 v.AddArg(v0)
24640 return true
24641 }
24642 break
24643 }
24644
24645
24646 for {
24647 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24648 if v_0.Op != OpNeq64F {
24649 continue
24650 }
24651 x := v_0.Args[1]
24652 if x != v_0.Args[0] || v_1.Op != OpLess64F {
24653 continue
24654 }
24655 _ = v_1.Args[1]
24656 neg := v_1.Args[0]
24657 if neg.Op != OpNeg64F || x != neg.Args[0] {
24658 continue
24659 }
24660 y := v_1.Args[1]
24661 if y.Op != OpConst64F {
24662 continue
24663 }
24664 v.reset(OpNot)
24665 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
24666 v0.AddArg2(y, neg)
24667 v.AddArg(v0)
24668 return true
24669 }
24670 break
24671 }
24672
24673
24674 for {
24675 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24676 if v_0.Op != OpNeq64F {
24677 continue
24678 }
24679 x := v_0.Args[1]
24680 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
24681 continue
24682 }
24683 _ = v_1.Args[1]
24684 neg := v_1.Args[0]
24685 if neg.Op != OpNeg64F || x != neg.Args[0] {
24686 continue
24687 }
24688 y := v_1.Args[1]
24689 if y.Op != OpConst64F {
24690 continue
24691 }
24692 v.reset(OpNot)
24693 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
24694 v0.AddArg2(y, neg)
24695 v.AddArg(v0)
24696 return true
24697 }
24698 break
24699 }
24700
24701
24702 for {
24703 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24704 if v_0.Op != OpNeq64F {
24705 continue
24706 }
24707 x := v_0.Args[1]
24708 if x != v_0.Args[0] || v_1.Op != OpLess64F {
24709 continue
24710 }
24711 _ = v_1.Args[1]
24712 y := v_1.Args[0]
24713 if y.Op != OpConst64F {
24714 continue
24715 }
24716 neg := v_1.Args[1]
24717 if neg.Op != OpNeg64F || x != neg.Args[0] {
24718 continue
24719 }
24720 v.reset(OpNot)
24721 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
24722 v0.AddArg2(neg, y)
24723 v.AddArg(v0)
24724 return true
24725 }
24726 break
24727 }
24728
24729
24730 for {
24731 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24732 if v_0.Op != OpNeq64F {
24733 continue
24734 }
24735 x := v_0.Args[1]
24736 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
24737 continue
24738 }
24739 _ = v_1.Args[1]
24740 y := v_1.Args[0]
24741 if y.Op != OpConst64F {
24742 continue
24743 }
24744 neg := v_1.Args[1]
24745 if neg.Op != OpNeg64F || x != neg.Args[0] {
24746 continue
24747 }
24748 v.reset(OpNot)
24749 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
24750 v0.AddArg2(neg, y)
24751 v.AddArg(v0)
24752 return true
24753 }
24754 break
24755 }
24756
24757
24758 for {
24759 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24760 if v_0.Op != OpNeq32F {
24761 continue
24762 }
24763 x := v_0.Args[1]
24764 if x != v_0.Args[0] || v_1.Op != OpLess32F {
24765 continue
24766 }
24767 _ = v_1.Args[1]
24768 neg := v_1.Args[0]
24769 if neg.Op != OpNeg32F || x != neg.Args[0] {
24770 continue
24771 }
24772 y := v_1.Args[1]
24773 if y.Op != OpConst32F {
24774 continue
24775 }
24776 v.reset(OpNot)
24777 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
24778 v0.AddArg2(y, neg)
24779 v.AddArg(v0)
24780 return true
24781 }
24782 break
24783 }
24784
24785
24786 for {
24787 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24788 if v_0.Op != OpNeq32F {
24789 continue
24790 }
24791 x := v_0.Args[1]
24792 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
24793 continue
24794 }
24795 _ = v_1.Args[1]
24796 neg := v_1.Args[0]
24797 if neg.Op != OpNeg32F || x != neg.Args[0] {
24798 continue
24799 }
24800 y := v_1.Args[1]
24801 if y.Op != OpConst32F {
24802 continue
24803 }
24804 v.reset(OpNot)
24805 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
24806 v0.AddArg2(y, neg)
24807 v.AddArg(v0)
24808 return true
24809 }
24810 break
24811 }
24812
24813
24814 for {
24815 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24816 if v_0.Op != OpNeq32F {
24817 continue
24818 }
24819 x := v_0.Args[1]
24820 if x != v_0.Args[0] || v_1.Op != OpLess32F {
24821 continue
24822 }
24823 _ = v_1.Args[1]
24824 y := v_1.Args[0]
24825 if y.Op != OpConst32F {
24826 continue
24827 }
24828 neg := v_1.Args[1]
24829 if neg.Op != OpNeg32F || x != neg.Args[0] {
24830 continue
24831 }
24832 v.reset(OpNot)
24833 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
24834 v0.AddArg2(neg, y)
24835 v.AddArg(v0)
24836 return true
24837 }
24838 break
24839 }
24840
24841
24842 for {
24843 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24844 if v_0.Op != OpNeq32F {
24845 continue
24846 }
24847 x := v_0.Args[1]
24848 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
24849 continue
24850 }
24851 _ = v_1.Args[1]
24852 y := v_1.Args[0]
24853 if y.Op != OpConst32F {
24854 continue
24855 }
24856 neg := v_1.Args[1]
24857 if neg.Op != OpNeg32F || x != neg.Args[0] {
24858 continue
24859 }
24860 v.reset(OpNot)
24861 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
24862 v0.AddArg2(neg, y)
24863 v.AddArg(v0)
24864 return true
24865 }
24866 break
24867 }
24868 return false
24869 }
24870 func rewriteValuegeneric_OpPhi(v *Value) bool {
24871 b := v.Block
24872
24873
24874 for {
24875 if len(v.Args) != 2 {
24876 break
24877 }
24878 _ = v.Args[1]
24879 v_0 := v.Args[0]
24880 if v_0.Op != OpConst8 {
24881 break
24882 }
24883 c := auxIntToInt8(v_0.AuxInt)
24884 v_1 := v.Args[1]
24885 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != c {
24886 break
24887 }
24888 v.reset(OpConst8)
24889 v.AuxInt = int8ToAuxInt(c)
24890 return true
24891 }
24892
24893
24894 for {
24895 if len(v.Args) != 2 {
24896 break
24897 }
24898 _ = v.Args[1]
24899 v_0 := v.Args[0]
24900 if v_0.Op != OpConst16 {
24901 break
24902 }
24903 c := auxIntToInt16(v_0.AuxInt)
24904 v_1 := v.Args[1]
24905 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != c {
24906 break
24907 }
24908 v.reset(OpConst16)
24909 v.AuxInt = int16ToAuxInt(c)
24910 return true
24911 }
24912
24913
24914 for {
24915 if len(v.Args) != 2 {
24916 break
24917 }
24918 _ = v.Args[1]
24919 v_0 := v.Args[0]
24920 if v_0.Op != OpConst32 {
24921 break
24922 }
24923 c := auxIntToInt32(v_0.AuxInt)
24924 v_1 := v.Args[1]
24925 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != c {
24926 break
24927 }
24928 v.reset(OpConst32)
24929 v.AuxInt = int32ToAuxInt(c)
24930 return true
24931 }
24932
24933
24934 for {
24935 if len(v.Args) != 2 {
24936 break
24937 }
24938 _ = v.Args[1]
24939 v_0 := v.Args[0]
24940 if v_0.Op != OpConst64 {
24941 break
24942 }
24943 c := auxIntToInt64(v_0.AuxInt)
24944 v_1 := v.Args[1]
24945 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c {
24946 break
24947 }
24948 v.reset(OpConst64)
24949 v.AuxInt = int64ToAuxInt(c)
24950 return true
24951 }
24952
24953
24954
24955 for {
24956 if len(v.Args) != 2 {
24957 break
24958 }
24959 t := v.Type
24960 _ = v.Args[1]
24961 nx := v.Args[0]
24962 if nx.Op != OpNot {
24963 break
24964 }
24965 x := nx.Args[0]
24966 ny := v.Args[1]
24967 if ny.Op != OpNot {
24968 break
24969 }
24970 y := ny.Args[0]
24971 if !(nx.Uses == 1 && ny.Uses == 1) {
24972 break
24973 }
24974 v.reset(OpNot)
24975 v0 := b.NewValue0(v.Pos, OpPhi, t)
24976 v0.AddArg2(x, y)
24977 v.AddArg(v0)
24978 return true
24979 }
24980 return false
24981 }
24982 func rewriteValuegeneric_OpPopCount16(v *Value) bool {
24983 v_0 := v.Args[0]
24984 b := v.Block
24985 config := b.Func.Config
24986
24987
24988
24989 for {
24990 if v_0.Op != OpConst16 {
24991 break
24992 }
24993 c := auxIntToInt16(v_0.AuxInt)
24994 if !(config.PtrSize == 8) {
24995 break
24996 }
24997 v.reset(OpConst64)
24998 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount16(uint16(c))))
24999 return true
25000 }
25001
25002
25003
25004 for {
25005 if v_0.Op != OpConst16 {
25006 break
25007 }
25008 c := auxIntToInt16(v_0.AuxInt)
25009 if !(config.PtrSize == 4) {
25010 break
25011 }
25012 v.reset(OpConst32)
25013 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount16(uint16(c))))
25014 return true
25015 }
25016 return false
25017 }
25018 func rewriteValuegeneric_OpPopCount32(v *Value) bool {
25019 v_0 := v.Args[0]
25020 b := v.Block
25021 config := b.Func.Config
25022
25023
25024
25025 for {
25026 if v_0.Op != OpConst32 {
25027 break
25028 }
25029 c := auxIntToInt32(v_0.AuxInt)
25030 if !(config.PtrSize == 8) {
25031 break
25032 }
25033 v.reset(OpConst64)
25034 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount32(uint32(c))))
25035 return true
25036 }
25037
25038
25039
25040 for {
25041 if v_0.Op != OpConst32 {
25042 break
25043 }
25044 c := auxIntToInt32(v_0.AuxInt)
25045 if !(config.PtrSize == 4) {
25046 break
25047 }
25048 v.reset(OpConst32)
25049 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount32(uint32(c))))
25050 return true
25051 }
25052 return false
25053 }
25054 func rewriteValuegeneric_OpPopCount64(v *Value) bool {
25055 v_0 := v.Args[0]
25056 b := v.Block
25057 config := b.Func.Config
25058
25059
25060
25061 for {
25062 if v_0.Op != OpConst64 {
25063 break
25064 }
25065 c := auxIntToInt64(v_0.AuxInt)
25066 if !(config.PtrSize == 8) {
25067 break
25068 }
25069 v.reset(OpConst64)
25070 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount64(uint64(c))))
25071 return true
25072 }
25073
25074
25075
25076 for {
25077 if v_0.Op != OpConst64 {
25078 break
25079 }
25080 c := auxIntToInt64(v_0.AuxInt)
25081 if !(config.PtrSize == 4) {
25082 break
25083 }
25084 v.reset(OpConst32)
25085 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount64(uint64(c))))
25086 return true
25087 }
25088 return false
25089 }
25090 func rewriteValuegeneric_OpPopCount8(v *Value) bool {
25091 v_0 := v.Args[0]
25092 b := v.Block
25093 config := b.Func.Config
25094
25095
25096
25097 for {
25098 if v_0.Op != OpConst8 {
25099 break
25100 }
25101 c := auxIntToInt8(v_0.AuxInt)
25102 if !(config.PtrSize == 8) {
25103 break
25104 }
25105 v.reset(OpConst64)
25106 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount8(uint8(c))))
25107 return true
25108 }
25109
25110
25111
25112 for {
25113 if v_0.Op != OpConst8 {
25114 break
25115 }
25116 c := auxIntToInt8(v_0.AuxInt)
25117 if !(config.PtrSize == 4) {
25118 break
25119 }
25120 v.reset(OpConst32)
25121 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount8(uint8(c))))
25122 return true
25123 }
25124 return false
25125 }
25126 func rewriteValuegeneric_OpPtrIndex(v *Value) bool {
25127 v_1 := v.Args[1]
25128 v_0 := v.Args[0]
25129 b := v.Block
25130 config := b.Func.Config
25131 typ := &b.Func.Config.Types
25132
25133
25134
25135 for {
25136 t := v.Type
25137 ptr := v_0
25138 idx := v_1
25139 if !(config.PtrSize == 4 && is32Bit(t.Elem().Size())) {
25140 break
25141 }
25142 v.reset(OpAddPtr)
25143 v0 := b.NewValue0(v.Pos, OpMul32, typ.Int)
25144 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
25145 v1.AuxInt = int32ToAuxInt(int32(t.Elem().Size()))
25146 v0.AddArg2(idx, v1)
25147 v.AddArg2(ptr, v0)
25148 return true
25149 }
25150
25151
25152
25153 for {
25154 t := v.Type
25155 ptr := v_0
25156 idx := v_1
25157 if !(config.PtrSize == 8) {
25158 break
25159 }
25160 v.reset(OpAddPtr)
25161 v0 := b.NewValue0(v.Pos, OpMul64, typ.Int)
25162 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
25163 v1.AuxInt = int64ToAuxInt(t.Elem().Size())
25164 v0.AddArg2(idx, v1)
25165 v.AddArg2(ptr, v0)
25166 return true
25167 }
25168 return false
25169 }
25170 func rewriteValuegeneric_OpRotateLeft16(v *Value) bool {
25171 v_1 := v.Args[1]
25172 v_0 := v.Args[0]
25173 b := v.Block
25174 config := b.Func.Config
25175
25176
25177
25178 for {
25179 x := v_0
25180 if v_1.Op != OpConst16 {
25181 break
25182 }
25183 c := auxIntToInt16(v_1.AuxInt)
25184 if !(c%16 == 0) {
25185 break
25186 }
25187 v.copyOf(x)
25188 return true
25189 }
25190
25191
25192
25193 for {
25194 x := v_0
25195 if v_1.Op != OpAnd64 {
25196 break
25197 }
25198 _ = v_1.Args[1]
25199 v_1_0 := v_1.Args[0]
25200 v_1_1 := v_1.Args[1]
25201 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25202 y := v_1_0
25203 if v_1_1.Op != OpConst64 {
25204 continue
25205 }
25206 c := auxIntToInt64(v_1_1.AuxInt)
25207 if !(c&15 == 15) {
25208 continue
25209 }
25210 v.reset(OpRotateLeft16)
25211 v.AddArg2(x, y)
25212 return true
25213 }
25214 break
25215 }
25216
25217
25218
25219 for {
25220 x := v_0
25221 if v_1.Op != OpAnd32 {
25222 break
25223 }
25224 _ = v_1.Args[1]
25225 v_1_0 := v_1.Args[0]
25226 v_1_1 := v_1.Args[1]
25227 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25228 y := v_1_0
25229 if v_1_1.Op != OpConst32 {
25230 continue
25231 }
25232 c := auxIntToInt32(v_1_1.AuxInt)
25233 if !(c&15 == 15) {
25234 continue
25235 }
25236 v.reset(OpRotateLeft16)
25237 v.AddArg2(x, y)
25238 return true
25239 }
25240 break
25241 }
25242
25243
25244
25245 for {
25246 x := v_0
25247 if v_1.Op != OpAnd16 {
25248 break
25249 }
25250 _ = v_1.Args[1]
25251 v_1_0 := v_1.Args[0]
25252 v_1_1 := v_1.Args[1]
25253 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25254 y := v_1_0
25255 if v_1_1.Op != OpConst16 {
25256 continue
25257 }
25258 c := auxIntToInt16(v_1_1.AuxInt)
25259 if !(c&15 == 15) {
25260 continue
25261 }
25262 v.reset(OpRotateLeft16)
25263 v.AddArg2(x, y)
25264 return true
25265 }
25266 break
25267 }
25268
25269
25270
25271 for {
25272 x := v_0
25273 if v_1.Op != OpAnd8 {
25274 break
25275 }
25276 _ = v_1.Args[1]
25277 v_1_0 := v_1.Args[0]
25278 v_1_1 := v_1.Args[1]
25279 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25280 y := v_1_0
25281 if v_1_1.Op != OpConst8 {
25282 continue
25283 }
25284 c := auxIntToInt8(v_1_1.AuxInt)
25285 if !(c&15 == 15) {
25286 continue
25287 }
25288 v.reset(OpRotateLeft16)
25289 v.AddArg2(x, y)
25290 return true
25291 }
25292 break
25293 }
25294
25295
25296
25297 for {
25298 x := v_0
25299 if v_1.Op != OpNeg64 {
25300 break
25301 }
25302 v_1_0 := v_1.Args[0]
25303 if v_1_0.Op != OpAnd64 {
25304 break
25305 }
25306 _ = v_1_0.Args[1]
25307 v_1_0_0 := v_1_0.Args[0]
25308 v_1_0_1 := v_1_0.Args[1]
25309 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25310 y := v_1_0_0
25311 if v_1_0_1.Op != OpConst64 {
25312 continue
25313 }
25314 c := auxIntToInt64(v_1_0_1.AuxInt)
25315 if !(c&15 == 15) {
25316 continue
25317 }
25318 v.reset(OpRotateLeft16)
25319 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
25320 v0.AddArg(y)
25321 v.AddArg2(x, v0)
25322 return true
25323 }
25324 break
25325 }
25326
25327
25328
25329 for {
25330 x := v_0
25331 if v_1.Op != OpNeg32 {
25332 break
25333 }
25334 v_1_0 := v_1.Args[0]
25335 if v_1_0.Op != OpAnd32 {
25336 break
25337 }
25338 _ = v_1_0.Args[1]
25339 v_1_0_0 := v_1_0.Args[0]
25340 v_1_0_1 := v_1_0.Args[1]
25341 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25342 y := v_1_0_0
25343 if v_1_0_1.Op != OpConst32 {
25344 continue
25345 }
25346 c := auxIntToInt32(v_1_0_1.AuxInt)
25347 if !(c&15 == 15) {
25348 continue
25349 }
25350 v.reset(OpRotateLeft16)
25351 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
25352 v0.AddArg(y)
25353 v.AddArg2(x, v0)
25354 return true
25355 }
25356 break
25357 }
25358
25359
25360
25361 for {
25362 x := v_0
25363 if v_1.Op != OpNeg16 {
25364 break
25365 }
25366 v_1_0 := v_1.Args[0]
25367 if v_1_0.Op != OpAnd16 {
25368 break
25369 }
25370 _ = v_1_0.Args[1]
25371 v_1_0_0 := v_1_0.Args[0]
25372 v_1_0_1 := v_1_0.Args[1]
25373 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25374 y := v_1_0_0
25375 if v_1_0_1.Op != OpConst16 {
25376 continue
25377 }
25378 c := auxIntToInt16(v_1_0_1.AuxInt)
25379 if !(c&15 == 15) {
25380 continue
25381 }
25382 v.reset(OpRotateLeft16)
25383 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
25384 v0.AddArg(y)
25385 v.AddArg2(x, v0)
25386 return true
25387 }
25388 break
25389 }
25390
25391
25392
25393 for {
25394 x := v_0
25395 if v_1.Op != OpNeg8 {
25396 break
25397 }
25398 v_1_0 := v_1.Args[0]
25399 if v_1_0.Op != OpAnd8 {
25400 break
25401 }
25402 _ = v_1_0.Args[1]
25403 v_1_0_0 := v_1_0.Args[0]
25404 v_1_0_1 := v_1_0.Args[1]
25405 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25406 y := v_1_0_0
25407 if v_1_0_1.Op != OpConst8 {
25408 continue
25409 }
25410 c := auxIntToInt8(v_1_0_1.AuxInt)
25411 if !(c&15 == 15) {
25412 continue
25413 }
25414 v.reset(OpRotateLeft16)
25415 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
25416 v0.AddArg(y)
25417 v.AddArg2(x, v0)
25418 return true
25419 }
25420 break
25421 }
25422
25423
25424
25425 for {
25426 x := v_0
25427 if v_1.Op != OpAdd64 {
25428 break
25429 }
25430 _ = v_1.Args[1]
25431 v_1_0 := v_1.Args[0]
25432 v_1_1 := v_1.Args[1]
25433 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25434 y := v_1_0
25435 if v_1_1.Op != OpConst64 {
25436 continue
25437 }
25438 c := auxIntToInt64(v_1_1.AuxInt)
25439 if !(c&15 == 0) {
25440 continue
25441 }
25442 v.reset(OpRotateLeft16)
25443 v.AddArg2(x, y)
25444 return true
25445 }
25446 break
25447 }
25448
25449
25450
25451 for {
25452 x := v_0
25453 if v_1.Op != OpAdd32 {
25454 break
25455 }
25456 _ = v_1.Args[1]
25457 v_1_0 := v_1.Args[0]
25458 v_1_1 := v_1.Args[1]
25459 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25460 y := v_1_0
25461 if v_1_1.Op != OpConst32 {
25462 continue
25463 }
25464 c := auxIntToInt32(v_1_1.AuxInt)
25465 if !(c&15 == 0) {
25466 continue
25467 }
25468 v.reset(OpRotateLeft16)
25469 v.AddArg2(x, y)
25470 return true
25471 }
25472 break
25473 }
25474
25475
25476
25477 for {
25478 x := v_0
25479 if v_1.Op != OpAdd16 {
25480 break
25481 }
25482 _ = v_1.Args[1]
25483 v_1_0 := v_1.Args[0]
25484 v_1_1 := v_1.Args[1]
25485 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25486 y := v_1_0
25487 if v_1_1.Op != OpConst16 {
25488 continue
25489 }
25490 c := auxIntToInt16(v_1_1.AuxInt)
25491 if !(c&15 == 0) {
25492 continue
25493 }
25494 v.reset(OpRotateLeft16)
25495 v.AddArg2(x, y)
25496 return true
25497 }
25498 break
25499 }
25500
25501
25502
25503 for {
25504 x := v_0
25505 if v_1.Op != OpAdd8 {
25506 break
25507 }
25508 _ = v_1.Args[1]
25509 v_1_0 := v_1.Args[0]
25510 v_1_1 := v_1.Args[1]
25511 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25512 y := v_1_0
25513 if v_1_1.Op != OpConst8 {
25514 continue
25515 }
25516 c := auxIntToInt8(v_1_1.AuxInt)
25517 if !(c&15 == 0) {
25518 continue
25519 }
25520 v.reset(OpRotateLeft16)
25521 v.AddArg2(x, y)
25522 return true
25523 }
25524 break
25525 }
25526
25527
25528
25529 for {
25530 x := v_0
25531 if v_1.Op != OpSub64 {
25532 break
25533 }
25534 y := v_1.Args[1]
25535 v_1_0 := v_1.Args[0]
25536 if v_1_0.Op != OpConst64 {
25537 break
25538 }
25539 c := auxIntToInt64(v_1_0.AuxInt)
25540 if !(c&15 == 0) {
25541 break
25542 }
25543 v.reset(OpRotateLeft16)
25544 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
25545 v0.AddArg(y)
25546 v.AddArg2(x, v0)
25547 return true
25548 }
25549
25550
25551
25552 for {
25553 x := v_0
25554 if v_1.Op != OpSub32 {
25555 break
25556 }
25557 y := v_1.Args[1]
25558 v_1_0 := v_1.Args[0]
25559 if v_1_0.Op != OpConst32 {
25560 break
25561 }
25562 c := auxIntToInt32(v_1_0.AuxInt)
25563 if !(c&15 == 0) {
25564 break
25565 }
25566 v.reset(OpRotateLeft16)
25567 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
25568 v0.AddArg(y)
25569 v.AddArg2(x, v0)
25570 return true
25571 }
25572
25573
25574
25575 for {
25576 x := v_0
25577 if v_1.Op != OpSub16 {
25578 break
25579 }
25580 y := v_1.Args[1]
25581 v_1_0 := v_1.Args[0]
25582 if v_1_0.Op != OpConst16 {
25583 break
25584 }
25585 c := auxIntToInt16(v_1_0.AuxInt)
25586 if !(c&15 == 0) {
25587 break
25588 }
25589 v.reset(OpRotateLeft16)
25590 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
25591 v0.AddArg(y)
25592 v.AddArg2(x, v0)
25593 return true
25594 }
25595
25596
25597
25598 for {
25599 x := v_0
25600 if v_1.Op != OpSub8 {
25601 break
25602 }
25603 y := v_1.Args[1]
25604 v_1_0 := v_1.Args[0]
25605 if v_1_0.Op != OpConst8 {
25606 break
25607 }
25608 c := auxIntToInt8(v_1_0.AuxInt)
25609 if !(c&15 == 0) {
25610 break
25611 }
25612 v.reset(OpRotateLeft16)
25613 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
25614 v0.AddArg(y)
25615 v.AddArg2(x, v0)
25616 return true
25617 }
25618
25619
25620
25621 for {
25622 x := v_0
25623 if v_1.Op != OpConst64 {
25624 break
25625 }
25626 t := v_1.Type
25627 c := auxIntToInt64(v_1.AuxInt)
25628 if !(config.PtrSize == 4) {
25629 break
25630 }
25631 v.reset(OpRotateLeft16)
25632 v0 := b.NewValue0(v.Pos, OpConst32, t)
25633 v0.AuxInt = int32ToAuxInt(int32(c))
25634 v.AddArg2(x, v0)
25635 return true
25636 }
25637
25638
25639
25640 for {
25641 if v_0.Op != OpRotateLeft16 {
25642 break
25643 }
25644 c := v_0.Args[1]
25645 x := v_0.Args[0]
25646 d := v_1
25647 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
25648 break
25649 }
25650 v.reset(OpRotateLeft16)
25651 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
25652 v0.AddArg2(c, d)
25653 v.AddArg2(x, v0)
25654 return true
25655 }
25656
25657
25658
25659 for {
25660 if v_0.Op != OpRotateLeft16 {
25661 break
25662 }
25663 c := v_0.Args[1]
25664 x := v_0.Args[0]
25665 d := v_1
25666 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
25667 break
25668 }
25669 v.reset(OpRotateLeft16)
25670 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
25671 v0.AddArg2(c, d)
25672 v.AddArg2(x, v0)
25673 return true
25674 }
25675
25676
25677
25678 for {
25679 if v_0.Op != OpRotateLeft16 {
25680 break
25681 }
25682 c := v_0.Args[1]
25683 x := v_0.Args[0]
25684 d := v_1
25685 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
25686 break
25687 }
25688 v.reset(OpRotateLeft16)
25689 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
25690 v0.AddArg2(c, d)
25691 v.AddArg2(x, v0)
25692 return true
25693 }
25694
25695
25696
25697 for {
25698 if v_0.Op != OpRotateLeft16 {
25699 break
25700 }
25701 c := v_0.Args[1]
25702 x := v_0.Args[0]
25703 d := v_1
25704 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
25705 break
25706 }
25707 v.reset(OpRotateLeft16)
25708 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
25709 v0.AddArg2(c, d)
25710 v.AddArg2(x, v0)
25711 return true
25712 }
25713 return false
25714 }
25715 func rewriteValuegeneric_OpRotateLeft32(v *Value) bool {
25716 v_1 := v.Args[1]
25717 v_0 := v.Args[0]
25718 b := v.Block
25719 config := b.Func.Config
25720
25721
25722
25723 for {
25724 x := v_0
25725 if v_1.Op != OpConst32 {
25726 break
25727 }
25728 c := auxIntToInt32(v_1.AuxInt)
25729 if !(c%32 == 0) {
25730 break
25731 }
25732 v.copyOf(x)
25733 return true
25734 }
25735
25736
25737
25738 for {
25739 x := v_0
25740 if v_1.Op != OpAnd64 {
25741 break
25742 }
25743 _ = v_1.Args[1]
25744 v_1_0 := v_1.Args[0]
25745 v_1_1 := v_1.Args[1]
25746 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25747 y := v_1_0
25748 if v_1_1.Op != OpConst64 {
25749 continue
25750 }
25751 c := auxIntToInt64(v_1_1.AuxInt)
25752 if !(c&31 == 31) {
25753 continue
25754 }
25755 v.reset(OpRotateLeft32)
25756 v.AddArg2(x, y)
25757 return true
25758 }
25759 break
25760 }
25761
25762
25763
25764 for {
25765 x := v_0
25766 if v_1.Op != OpAnd32 {
25767 break
25768 }
25769 _ = v_1.Args[1]
25770 v_1_0 := v_1.Args[0]
25771 v_1_1 := v_1.Args[1]
25772 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25773 y := v_1_0
25774 if v_1_1.Op != OpConst32 {
25775 continue
25776 }
25777 c := auxIntToInt32(v_1_1.AuxInt)
25778 if !(c&31 == 31) {
25779 continue
25780 }
25781 v.reset(OpRotateLeft32)
25782 v.AddArg2(x, y)
25783 return true
25784 }
25785 break
25786 }
25787
25788
25789
25790 for {
25791 x := v_0
25792 if v_1.Op != OpAnd16 {
25793 break
25794 }
25795 _ = v_1.Args[1]
25796 v_1_0 := v_1.Args[0]
25797 v_1_1 := v_1.Args[1]
25798 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25799 y := v_1_0
25800 if v_1_1.Op != OpConst16 {
25801 continue
25802 }
25803 c := auxIntToInt16(v_1_1.AuxInt)
25804 if !(c&31 == 31) {
25805 continue
25806 }
25807 v.reset(OpRotateLeft32)
25808 v.AddArg2(x, y)
25809 return true
25810 }
25811 break
25812 }
25813
25814
25815
25816 for {
25817 x := v_0
25818 if v_1.Op != OpAnd8 {
25819 break
25820 }
25821 _ = v_1.Args[1]
25822 v_1_0 := v_1.Args[0]
25823 v_1_1 := v_1.Args[1]
25824 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25825 y := v_1_0
25826 if v_1_1.Op != OpConst8 {
25827 continue
25828 }
25829 c := auxIntToInt8(v_1_1.AuxInt)
25830 if !(c&31 == 31) {
25831 continue
25832 }
25833 v.reset(OpRotateLeft32)
25834 v.AddArg2(x, y)
25835 return true
25836 }
25837 break
25838 }
25839
25840
25841
25842 for {
25843 x := v_0
25844 if v_1.Op != OpNeg64 {
25845 break
25846 }
25847 v_1_0 := v_1.Args[0]
25848 if v_1_0.Op != OpAnd64 {
25849 break
25850 }
25851 _ = v_1_0.Args[1]
25852 v_1_0_0 := v_1_0.Args[0]
25853 v_1_0_1 := v_1_0.Args[1]
25854 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25855 y := v_1_0_0
25856 if v_1_0_1.Op != OpConst64 {
25857 continue
25858 }
25859 c := auxIntToInt64(v_1_0_1.AuxInt)
25860 if !(c&31 == 31) {
25861 continue
25862 }
25863 v.reset(OpRotateLeft32)
25864 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
25865 v0.AddArg(y)
25866 v.AddArg2(x, v0)
25867 return true
25868 }
25869 break
25870 }
25871
25872
25873
25874 for {
25875 x := v_0
25876 if v_1.Op != OpNeg32 {
25877 break
25878 }
25879 v_1_0 := v_1.Args[0]
25880 if v_1_0.Op != OpAnd32 {
25881 break
25882 }
25883 _ = v_1_0.Args[1]
25884 v_1_0_0 := v_1_0.Args[0]
25885 v_1_0_1 := v_1_0.Args[1]
25886 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25887 y := v_1_0_0
25888 if v_1_0_1.Op != OpConst32 {
25889 continue
25890 }
25891 c := auxIntToInt32(v_1_0_1.AuxInt)
25892 if !(c&31 == 31) {
25893 continue
25894 }
25895 v.reset(OpRotateLeft32)
25896 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
25897 v0.AddArg(y)
25898 v.AddArg2(x, v0)
25899 return true
25900 }
25901 break
25902 }
25903
25904
25905
25906 for {
25907 x := v_0
25908 if v_1.Op != OpNeg16 {
25909 break
25910 }
25911 v_1_0 := v_1.Args[0]
25912 if v_1_0.Op != OpAnd16 {
25913 break
25914 }
25915 _ = v_1_0.Args[1]
25916 v_1_0_0 := v_1_0.Args[0]
25917 v_1_0_1 := v_1_0.Args[1]
25918 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25919 y := v_1_0_0
25920 if v_1_0_1.Op != OpConst16 {
25921 continue
25922 }
25923 c := auxIntToInt16(v_1_0_1.AuxInt)
25924 if !(c&31 == 31) {
25925 continue
25926 }
25927 v.reset(OpRotateLeft32)
25928 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
25929 v0.AddArg(y)
25930 v.AddArg2(x, v0)
25931 return true
25932 }
25933 break
25934 }
25935
25936
25937
25938 for {
25939 x := v_0
25940 if v_1.Op != OpNeg8 {
25941 break
25942 }
25943 v_1_0 := v_1.Args[0]
25944 if v_1_0.Op != OpAnd8 {
25945 break
25946 }
25947 _ = v_1_0.Args[1]
25948 v_1_0_0 := v_1_0.Args[0]
25949 v_1_0_1 := v_1_0.Args[1]
25950 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25951 y := v_1_0_0
25952 if v_1_0_1.Op != OpConst8 {
25953 continue
25954 }
25955 c := auxIntToInt8(v_1_0_1.AuxInt)
25956 if !(c&31 == 31) {
25957 continue
25958 }
25959 v.reset(OpRotateLeft32)
25960 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
25961 v0.AddArg(y)
25962 v.AddArg2(x, v0)
25963 return true
25964 }
25965 break
25966 }
25967
25968
25969
25970 for {
25971 x := v_0
25972 if v_1.Op != OpAdd64 {
25973 break
25974 }
25975 _ = v_1.Args[1]
25976 v_1_0 := v_1.Args[0]
25977 v_1_1 := v_1.Args[1]
25978 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25979 y := v_1_0
25980 if v_1_1.Op != OpConst64 {
25981 continue
25982 }
25983 c := auxIntToInt64(v_1_1.AuxInt)
25984 if !(c&31 == 0) {
25985 continue
25986 }
25987 v.reset(OpRotateLeft32)
25988 v.AddArg2(x, y)
25989 return true
25990 }
25991 break
25992 }
25993
25994
25995
25996 for {
25997 x := v_0
25998 if v_1.Op != OpAdd32 {
25999 break
26000 }
26001 _ = v_1.Args[1]
26002 v_1_0 := v_1.Args[0]
26003 v_1_1 := v_1.Args[1]
26004 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26005 y := v_1_0
26006 if v_1_1.Op != OpConst32 {
26007 continue
26008 }
26009 c := auxIntToInt32(v_1_1.AuxInt)
26010 if !(c&31 == 0) {
26011 continue
26012 }
26013 v.reset(OpRotateLeft32)
26014 v.AddArg2(x, y)
26015 return true
26016 }
26017 break
26018 }
26019
26020
26021
26022 for {
26023 x := v_0
26024 if v_1.Op != OpAdd16 {
26025 break
26026 }
26027 _ = v_1.Args[1]
26028 v_1_0 := v_1.Args[0]
26029 v_1_1 := v_1.Args[1]
26030 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26031 y := v_1_0
26032 if v_1_1.Op != OpConst16 {
26033 continue
26034 }
26035 c := auxIntToInt16(v_1_1.AuxInt)
26036 if !(c&31 == 0) {
26037 continue
26038 }
26039 v.reset(OpRotateLeft32)
26040 v.AddArg2(x, y)
26041 return true
26042 }
26043 break
26044 }
26045
26046
26047
26048 for {
26049 x := v_0
26050 if v_1.Op != OpAdd8 {
26051 break
26052 }
26053 _ = v_1.Args[1]
26054 v_1_0 := v_1.Args[0]
26055 v_1_1 := v_1.Args[1]
26056 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26057 y := v_1_0
26058 if v_1_1.Op != OpConst8 {
26059 continue
26060 }
26061 c := auxIntToInt8(v_1_1.AuxInt)
26062 if !(c&31 == 0) {
26063 continue
26064 }
26065 v.reset(OpRotateLeft32)
26066 v.AddArg2(x, y)
26067 return true
26068 }
26069 break
26070 }
26071
26072
26073
26074 for {
26075 x := v_0
26076 if v_1.Op != OpSub64 {
26077 break
26078 }
26079 y := v_1.Args[1]
26080 v_1_0 := v_1.Args[0]
26081 if v_1_0.Op != OpConst64 {
26082 break
26083 }
26084 c := auxIntToInt64(v_1_0.AuxInt)
26085 if !(c&31 == 0) {
26086 break
26087 }
26088 v.reset(OpRotateLeft32)
26089 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26090 v0.AddArg(y)
26091 v.AddArg2(x, v0)
26092 return true
26093 }
26094
26095
26096
26097 for {
26098 x := v_0
26099 if v_1.Op != OpSub32 {
26100 break
26101 }
26102 y := v_1.Args[1]
26103 v_1_0 := v_1.Args[0]
26104 if v_1_0.Op != OpConst32 {
26105 break
26106 }
26107 c := auxIntToInt32(v_1_0.AuxInt)
26108 if !(c&31 == 0) {
26109 break
26110 }
26111 v.reset(OpRotateLeft32)
26112 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26113 v0.AddArg(y)
26114 v.AddArg2(x, v0)
26115 return true
26116 }
26117
26118
26119
26120 for {
26121 x := v_0
26122 if v_1.Op != OpSub16 {
26123 break
26124 }
26125 y := v_1.Args[1]
26126 v_1_0 := v_1.Args[0]
26127 if v_1_0.Op != OpConst16 {
26128 break
26129 }
26130 c := auxIntToInt16(v_1_0.AuxInt)
26131 if !(c&31 == 0) {
26132 break
26133 }
26134 v.reset(OpRotateLeft32)
26135 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
26136 v0.AddArg(y)
26137 v.AddArg2(x, v0)
26138 return true
26139 }
26140
26141
26142
26143 for {
26144 x := v_0
26145 if v_1.Op != OpSub8 {
26146 break
26147 }
26148 y := v_1.Args[1]
26149 v_1_0 := v_1.Args[0]
26150 if v_1_0.Op != OpConst8 {
26151 break
26152 }
26153 c := auxIntToInt8(v_1_0.AuxInt)
26154 if !(c&31 == 0) {
26155 break
26156 }
26157 v.reset(OpRotateLeft32)
26158 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
26159 v0.AddArg(y)
26160 v.AddArg2(x, v0)
26161 return true
26162 }
26163
26164
26165
26166 for {
26167 x := v_0
26168 if v_1.Op != OpConst64 {
26169 break
26170 }
26171 t := v_1.Type
26172 c := auxIntToInt64(v_1.AuxInt)
26173 if !(config.PtrSize == 4) {
26174 break
26175 }
26176 v.reset(OpRotateLeft32)
26177 v0 := b.NewValue0(v.Pos, OpConst32, t)
26178 v0.AuxInt = int32ToAuxInt(int32(c))
26179 v.AddArg2(x, v0)
26180 return true
26181 }
26182
26183
26184
26185 for {
26186 if v_0.Op != OpRotateLeft32 {
26187 break
26188 }
26189 c := v_0.Args[1]
26190 x := v_0.Args[0]
26191 d := v_1
26192 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
26193 break
26194 }
26195 v.reset(OpRotateLeft32)
26196 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
26197 v0.AddArg2(c, d)
26198 v.AddArg2(x, v0)
26199 return true
26200 }
26201
26202
26203
26204 for {
26205 if v_0.Op != OpRotateLeft32 {
26206 break
26207 }
26208 c := v_0.Args[1]
26209 x := v_0.Args[0]
26210 d := v_1
26211 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
26212 break
26213 }
26214 v.reset(OpRotateLeft32)
26215 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
26216 v0.AddArg2(c, d)
26217 v.AddArg2(x, v0)
26218 return true
26219 }
26220
26221
26222
26223 for {
26224 if v_0.Op != OpRotateLeft32 {
26225 break
26226 }
26227 c := v_0.Args[1]
26228 x := v_0.Args[0]
26229 d := v_1
26230 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
26231 break
26232 }
26233 v.reset(OpRotateLeft32)
26234 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
26235 v0.AddArg2(c, d)
26236 v.AddArg2(x, v0)
26237 return true
26238 }
26239
26240
26241
26242 for {
26243 if v_0.Op != OpRotateLeft32 {
26244 break
26245 }
26246 c := v_0.Args[1]
26247 x := v_0.Args[0]
26248 d := v_1
26249 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
26250 break
26251 }
26252 v.reset(OpRotateLeft32)
26253 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
26254 v0.AddArg2(c, d)
26255 v.AddArg2(x, v0)
26256 return true
26257 }
26258 return false
26259 }
26260 func rewriteValuegeneric_OpRotateLeft64(v *Value) bool {
26261 v_1 := v.Args[1]
26262 v_0 := v.Args[0]
26263 b := v.Block
26264 config := b.Func.Config
26265
26266
26267
26268 for {
26269 x := v_0
26270 if v_1.Op != OpConst64 {
26271 break
26272 }
26273 c := auxIntToInt64(v_1.AuxInt)
26274 if !(c%64 == 0) {
26275 break
26276 }
26277 v.copyOf(x)
26278 return true
26279 }
26280
26281
26282
26283 for {
26284 x := v_0
26285 if v_1.Op != OpAnd64 {
26286 break
26287 }
26288 _ = v_1.Args[1]
26289 v_1_0 := v_1.Args[0]
26290 v_1_1 := v_1.Args[1]
26291 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26292 y := v_1_0
26293 if v_1_1.Op != OpConst64 {
26294 continue
26295 }
26296 c := auxIntToInt64(v_1_1.AuxInt)
26297 if !(c&63 == 63) {
26298 continue
26299 }
26300 v.reset(OpRotateLeft64)
26301 v.AddArg2(x, y)
26302 return true
26303 }
26304 break
26305 }
26306
26307
26308
26309 for {
26310 x := v_0
26311 if v_1.Op != OpAnd32 {
26312 break
26313 }
26314 _ = v_1.Args[1]
26315 v_1_0 := v_1.Args[0]
26316 v_1_1 := v_1.Args[1]
26317 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26318 y := v_1_0
26319 if v_1_1.Op != OpConst32 {
26320 continue
26321 }
26322 c := auxIntToInt32(v_1_1.AuxInt)
26323 if !(c&63 == 63) {
26324 continue
26325 }
26326 v.reset(OpRotateLeft64)
26327 v.AddArg2(x, y)
26328 return true
26329 }
26330 break
26331 }
26332
26333
26334
26335 for {
26336 x := v_0
26337 if v_1.Op != OpAnd16 {
26338 break
26339 }
26340 _ = v_1.Args[1]
26341 v_1_0 := v_1.Args[0]
26342 v_1_1 := v_1.Args[1]
26343 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26344 y := v_1_0
26345 if v_1_1.Op != OpConst16 {
26346 continue
26347 }
26348 c := auxIntToInt16(v_1_1.AuxInt)
26349 if !(c&63 == 63) {
26350 continue
26351 }
26352 v.reset(OpRotateLeft64)
26353 v.AddArg2(x, y)
26354 return true
26355 }
26356 break
26357 }
26358
26359
26360
26361 for {
26362 x := v_0
26363 if v_1.Op != OpAnd8 {
26364 break
26365 }
26366 _ = v_1.Args[1]
26367 v_1_0 := v_1.Args[0]
26368 v_1_1 := v_1.Args[1]
26369 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26370 y := v_1_0
26371 if v_1_1.Op != OpConst8 {
26372 continue
26373 }
26374 c := auxIntToInt8(v_1_1.AuxInt)
26375 if !(c&63 == 63) {
26376 continue
26377 }
26378 v.reset(OpRotateLeft64)
26379 v.AddArg2(x, y)
26380 return true
26381 }
26382 break
26383 }
26384
26385
26386
26387 for {
26388 x := v_0
26389 if v_1.Op != OpNeg64 {
26390 break
26391 }
26392 v_1_0 := v_1.Args[0]
26393 if v_1_0.Op != OpAnd64 {
26394 break
26395 }
26396 _ = v_1_0.Args[1]
26397 v_1_0_0 := v_1_0.Args[0]
26398 v_1_0_1 := v_1_0.Args[1]
26399 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26400 y := v_1_0_0
26401 if v_1_0_1.Op != OpConst64 {
26402 continue
26403 }
26404 c := auxIntToInt64(v_1_0_1.AuxInt)
26405 if !(c&63 == 63) {
26406 continue
26407 }
26408 v.reset(OpRotateLeft64)
26409 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26410 v0.AddArg(y)
26411 v.AddArg2(x, v0)
26412 return true
26413 }
26414 break
26415 }
26416
26417
26418
26419 for {
26420 x := v_0
26421 if v_1.Op != OpNeg32 {
26422 break
26423 }
26424 v_1_0 := v_1.Args[0]
26425 if v_1_0.Op != OpAnd32 {
26426 break
26427 }
26428 _ = v_1_0.Args[1]
26429 v_1_0_0 := v_1_0.Args[0]
26430 v_1_0_1 := v_1_0.Args[1]
26431 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26432 y := v_1_0_0
26433 if v_1_0_1.Op != OpConst32 {
26434 continue
26435 }
26436 c := auxIntToInt32(v_1_0_1.AuxInt)
26437 if !(c&63 == 63) {
26438 continue
26439 }
26440 v.reset(OpRotateLeft64)
26441 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26442 v0.AddArg(y)
26443 v.AddArg2(x, v0)
26444 return true
26445 }
26446 break
26447 }
26448
26449
26450
26451 for {
26452 x := v_0
26453 if v_1.Op != OpNeg16 {
26454 break
26455 }
26456 v_1_0 := v_1.Args[0]
26457 if v_1_0.Op != OpAnd16 {
26458 break
26459 }
26460 _ = v_1_0.Args[1]
26461 v_1_0_0 := v_1_0.Args[0]
26462 v_1_0_1 := v_1_0.Args[1]
26463 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26464 y := v_1_0_0
26465 if v_1_0_1.Op != OpConst16 {
26466 continue
26467 }
26468 c := auxIntToInt16(v_1_0_1.AuxInt)
26469 if !(c&63 == 63) {
26470 continue
26471 }
26472 v.reset(OpRotateLeft64)
26473 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
26474 v0.AddArg(y)
26475 v.AddArg2(x, v0)
26476 return true
26477 }
26478 break
26479 }
26480
26481
26482
26483 for {
26484 x := v_0
26485 if v_1.Op != OpNeg8 {
26486 break
26487 }
26488 v_1_0 := v_1.Args[0]
26489 if v_1_0.Op != OpAnd8 {
26490 break
26491 }
26492 _ = v_1_0.Args[1]
26493 v_1_0_0 := v_1_0.Args[0]
26494 v_1_0_1 := v_1_0.Args[1]
26495 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26496 y := v_1_0_0
26497 if v_1_0_1.Op != OpConst8 {
26498 continue
26499 }
26500 c := auxIntToInt8(v_1_0_1.AuxInt)
26501 if !(c&63 == 63) {
26502 continue
26503 }
26504 v.reset(OpRotateLeft64)
26505 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
26506 v0.AddArg(y)
26507 v.AddArg2(x, v0)
26508 return true
26509 }
26510 break
26511 }
26512
26513
26514
26515 for {
26516 x := v_0
26517 if v_1.Op != OpAdd64 {
26518 break
26519 }
26520 _ = v_1.Args[1]
26521 v_1_0 := v_1.Args[0]
26522 v_1_1 := v_1.Args[1]
26523 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26524 y := v_1_0
26525 if v_1_1.Op != OpConst64 {
26526 continue
26527 }
26528 c := auxIntToInt64(v_1_1.AuxInt)
26529 if !(c&63 == 0) {
26530 continue
26531 }
26532 v.reset(OpRotateLeft64)
26533 v.AddArg2(x, y)
26534 return true
26535 }
26536 break
26537 }
26538
26539
26540
26541 for {
26542 x := v_0
26543 if v_1.Op != OpAdd32 {
26544 break
26545 }
26546 _ = v_1.Args[1]
26547 v_1_0 := v_1.Args[0]
26548 v_1_1 := v_1.Args[1]
26549 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26550 y := v_1_0
26551 if v_1_1.Op != OpConst32 {
26552 continue
26553 }
26554 c := auxIntToInt32(v_1_1.AuxInt)
26555 if !(c&63 == 0) {
26556 continue
26557 }
26558 v.reset(OpRotateLeft64)
26559 v.AddArg2(x, y)
26560 return true
26561 }
26562 break
26563 }
26564
26565
26566
26567 for {
26568 x := v_0
26569 if v_1.Op != OpAdd16 {
26570 break
26571 }
26572 _ = v_1.Args[1]
26573 v_1_0 := v_1.Args[0]
26574 v_1_1 := v_1.Args[1]
26575 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26576 y := v_1_0
26577 if v_1_1.Op != OpConst16 {
26578 continue
26579 }
26580 c := auxIntToInt16(v_1_1.AuxInt)
26581 if !(c&63 == 0) {
26582 continue
26583 }
26584 v.reset(OpRotateLeft64)
26585 v.AddArg2(x, y)
26586 return true
26587 }
26588 break
26589 }
26590
26591
26592
26593 for {
26594 x := v_0
26595 if v_1.Op != OpAdd8 {
26596 break
26597 }
26598 _ = v_1.Args[1]
26599 v_1_0 := v_1.Args[0]
26600 v_1_1 := v_1.Args[1]
26601 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26602 y := v_1_0
26603 if v_1_1.Op != OpConst8 {
26604 continue
26605 }
26606 c := auxIntToInt8(v_1_1.AuxInt)
26607 if !(c&63 == 0) {
26608 continue
26609 }
26610 v.reset(OpRotateLeft64)
26611 v.AddArg2(x, y)
26612 return true
26613 }
26614 break
26615 }
26616
26617
26618
26619 for {
26620 x := v_0
26621 if v_1.Op != OpSub64 {
26622 break
26623 }
26624 y := v_1.Args[1]
26625 v_1_0 := v_1.Args[0]
26626 if v_1_0.Op != OpConst64 {
26627 break
26628 }
26629 c := auxIntToInt64(v_1_0.AuxInt)
26630 if !(c&63 == 0) {
26631 break
26632 }
26633 v.reset(OpRotateLeft64)
26634 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26635 v0.AddArg(y)
26636 v.AddArg2(x, v0)
26637 return true
26638 }
26639
26640
26641
26642 for {
26643 x := v_0
26644 if v_1.Op != OpSub32 {
26645 break
26646 }
26647 y := v_1.Args[1]
26648 v_1_0 := v_1.Args[0]
26649 if v_1_0.Op != OpConst32 {
26650 break
26651 }
26652 c := auxIntToInt32(v_1_0.AuxInt)
26653 if !(c&63 == 0) {
26654 break
26655 }
26656 v.reset(OpRotateLeft64)
26657 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26658 v0.AddArg(y)
26659 v.AddArg2(x, v0)
26660 return true
26661 }
26662
26663
26664
26665 for {
26666 x := v_0
26667 if v_1.Op != OpSub16 {
26668 break
26669 }
26670 y := v_1.Args[1]
26671 v_1_0 := v_1.Args[0]
26672 if v_1_0.Op != OpConst16 {
26673 break
26674 }
26675 c := auxIntToInt16(v_1_0.AuxInt)
26676 if !(c&63 == 0) {
26677 break
26678 }
26679 v.reset(OpRotateLeft64)
26680 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
26681 v0.AddArg(y)
26682 v.AddArg2(x, v0)
26683 return true
26684 }
26685
26686
26687
26688 for {
26689 x := v_0
26690 if v_1.Op != OpSub8 {
26691 break
26692 }
26693 y := v_1.Args[1]
26694 v_1_0 := v_1.Args[0]
26695 if v_1_0.Op != OpConst8 {
26696 break
26697 }
26698 c := auxIntToInt8(v_1_0.AuxInt)
26699 if !(c&63 == 0) {
26700 break
26701 }
26702 v.reset(OpRotateLeft64)
26703 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
26704 v0.AddArg(y)
26705 v.AddArg2(x, v0)
26706 return true
26707 }
26708
26709
26710
26711 for {
26712 x := v_0
26713 if v_1.Op != OpConst64 {
26714 break
26715 }
26716 t := v_1.Type
26717 c := auxIntToInt64(v_1.AuxInt)
26718 if !(config.PtrSize == 4) {
26719 break
26720 }
26721 v.reset(OpRotateLeft64)
26722 v0 := b.NewValue0(v.Pos, OpConst32, t)
26723 v0.AuxInt = int32ToAuxInt(int32(c))
26724 v.AddArg2(x, v0)
26725 return true
26726 }
26727
26728
26729
26730 for {
26731 if v_0.Op != OpRotateLeft64 {
26732 break
26733 }
26734 c := v_0.Args[1]
26735 x := v_0.Args[0]
26736 d := v_1
26737 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
26738 break
26739 }
26740 v.reset(OpRotateLeft64)
26741 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
26742 v0.AddArg2(c, d)
26743 v.AddArg2(x, v0)
26744 return true
26745 }
26746
26747
26748
26749 for {
26750 if v_0.Op != OpRotateLeft64 {
26751 break
26752 }
26753 c := v_0.Args[1]
26754 x := v_0.Args[0]
26755 d := v_1
26756 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
26757 break
26758 }
26759 v.reset(OpRotateLeft64)
26760 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
26761 v0.AddArg2(c, d)
26762 v.AddArg2(x, v0)
26763 return true
26764 }
26765
26766
26767
26768 for {
26769 if v_0.Op != OpRotateLeft64 {
26770 break
26771 }
26772 c := v_0.Args[1]
26773 x := v_0.Args[0]
26774 d := v_1
26775 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
26776 break
26777 }
26778 v.reset(OpRotateLeft64)
26779 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
26780 v0.AddArg2(c, d)
26781 v.AddArg2(x, v0)
26782 return true
26783 }
26784
26785
26786
26787 for {
26788 if v_0.Op != OpRotateLeft64 {
26789 break
26790 }
26791 c := v_0.Args[1]
26792 x := v_0.Args[0]
26793 d := v_1
26794 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
26795 break
26796 }
26797 v.reset(OpRotateLeft64)
26798 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
26799 v0.AddArg2(c, d)
26800 v.AddArg2(x, v0)
26801 return true
26802 }
26803 return false
26804 }
26805 func rewriteValuegeneric_OpRotateLeft8(v *Value) bool {
26806 v_1 := v.Args[1]
26807 v_0 := v.Args[0]
26808 b := v.Block
26809 config := b.Func.Config
26810
26811
26812
26813 for {
26814 x := v_0
26815 if v_1.Op != OpConst8 {
26816 break
26817 }
26818 c := auxIntToInt8(v_1.AuxInt)
26819 if !(c%8 == 0) {
26820 break
26821 }
26822 v.copyOf(x)
26823 return true
26824 }
26825
26826
26827
26828 for {
26829 x := v_0
26830 if v_1.Op != OpAnd64 {
26831 break
26832 }
26833 _ = v_1.Args[1]
26834 v_1_0 := v_1.Args[0]
26835 v_1_1 := v_1.Args[1]
26836 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26837 y := v_1_0
26838 if v_1_1.Op != OpConst64 {
26839 continue
26840 }
26841 c := auxIntToInt64(v_1_1.AuxInt)
26842 if !(c&7 == 7) {
26843 continue
26844 }
26845 v.reset(OpRotateLeft8)
26846 v.AddArg2(x, y)
26847 return true
26848 }
26849 break
26850 }
26851
26852
26853
26854 for {
26855 x := v_0
26856 if v_1.Op != OpAnd32 {
26857 break
26858 }
26859 _ = v_1.Args[1]
26860 v_1_0 := v_1.Args[0]
26861 v_1_1 := v_1.Args[1]
26862 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26863 y := v_1_0
26864 if v_1_1.Op != OpConst32 {
26865 continue
26866 }
26867 c := auxIntToInt32(v_1_1.AuxInt)
26868 if !(c&7 == 7) {
26869 continue
26870 }
26871 v.reset(OpRotateLeft8)
26872 v.AddArg2(x, y)
26873 return true
26874 }
26875 break
26876 }
26877
26878
26879
26880 for {
26881 x := v_0
26882 if v_1.Op != OpAnd16 {
26883 break
26884 }
26885 _ = v_1.Args[1]
26886 v_1_0 := v_1.Args[0]
26887 v_1_1 := v_1.Args[1]
26888 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26889 y := v_1_0
26890 if v_1_1.Op != OpConst16 {
26891 continue
26892 }
26893 c := auxIntToInt16(v_1_1.AuxInt)
26894 if !(c&7 == 7) {
26895 continue
26896 }
26897 v.reset(OpRotateLeft8)
26898 v.AddArg2(x, y)
26899 return true
26900 }
26901 break
26902 }
26903
26904
26905
26906 for {
26907 x := v_0
26908 if v_1.Op != OpAnd8 {
26909 break
26910 }
26911 _ = v_1.Args[1]
26912 v_1_0 := v_1.Args[0]
26913 v_1_1 := v_1.Args[1]
26914 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26915 y := v_1_0
26916 if v_1_1.Op != OpConst8 {
26917 continue
26918 }
26919 c := auxIntToInt8(v_1_1.AuxInt)
26920 if !(c&7 == 7) {
26921 continue
26922 }
26923 v.reset(OpRotateLeft8)
26924 v.AddArg2(x, y)
26925 return true
26926 }
26927 break
26928 }
26929
26930
26931
26932 for {
26933 x := v_0
26934 if v_1.Op != OpNeg64 {
26935 break
26936 }
26937 v_1_0 := v_1.Args[0]
26938 if v_1_0.Op != OpAnd64 {
26939 break
26940 }
26941 _ = v_1_0.Args[1]
26942 v_1_0_0 := v_1_0.Args[0]
26943 v_1_0_1 := v_1_0.Args[1]
26944 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26945 y := v_1_0_0
26946 if v_1_0_1.Op != OpConst64 {
26947 continue
26948 }
26949 c := auxIntToInt64(v_1_0_1.AuxInt)
26950 if !(c&7 == 7) {
26951 continue
26952 }
26953 v.reset(OpRotateLeft8)
26954 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26955 v0.AddArg(y)
26956 v.AddArg2(x, v0)
26957 return true
26958 }
26959 break
26960 }
26961
26962
26963
26964 for {
26965 x := v_0
26966 if v_1.Op != OpNeg32 {
26967 break
26968 }
26969 v_1_0 := v_1.Args[0]
26970 if v_1_0.Op != OpAnd32 {
26971 break
26972 }
26973 _ = v_1_0.Args[1]
26974 v_1_0_0 := v_1_0.Args[0]
26975 v_1_0_1 := v_1_0.Args[1]
26976 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26977 y := v_1_0_0
26978 if v_1_0_1.Op != OpConst32 {
26979 continue
26980 }
26981 c := auxIntToInt32(v_1_0_1.AuxInt)
26982 if !(c&7 == 7) {
26983 continue
26984 }
26985 v.reset(OpRotateLeft8)
26986 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26987 v0.AddArg(y)
26988 v.AddArg2(x, v0)
26989 return true
26990 }
26991 break
26992 }
26993
26994
26995
26996 for {
26997 x := v_0
26998 if v_1.Op != OpNeg16 {
26999 break
27000 }
27001 v_1_0 := v_1.Args[0]
27002 if v_1_0.Op != OpAnd16 {
27003 break
27004 }
27005 _ = v_1_0.Args[1]
27006 v_1_0_0 := v_1_0.Args[0]
27007 v_1_0_1 := v_1_0.Args[1]
27008 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
27009 y := v_1_0_0
27010 if v_1_0_1.Op != OpConst16 {
27011 continue
27012 }
27013 c := auxIntToInt16(v_1_0_1.AuxInt)
27014 if !(c&7 == 7) {
27015 continue
27016 }
27017 v.reset(OpRotateLeft8)
27018 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
27019 v0.AddArg(y)
27020 v.AddArg2(x, v0)
27021 return true
27022 }
27023 break
27024 }
27025
27026
27027
27028 for {
27029 x := v_0
27030 if v_1.Op != OpNeg8 {
27031 break
27032 }
27033 v_1_0 := v_1.Args[0]
27034 if v_1_0.Op != OpAnd8 {
27035 break
27036 }
27037 _ = v_1_0.Args[1]
27038 v_1_0_0 := v_1_0.Args[0]
27039 v_1_0_1 := v_1_0.Args[1]
27040 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
27041 y := v_1_0_0
27042 if v_1_0_1.Op != OpConst8 {
27043 continue
27044 }
27045 c := auxIntToInt8(v_1_0_1.AuxInt)
27046 if !(c&7 == 7) {
27047 continue
27048 }
27049 v.reset(OpRotateLeft8)
27050 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
27051 v0.AddArg(y)
27052 v.AddArg2(x, v0)
27053 return true
27054 }
27055 break
27056 }
27057
27058
27059
27060 for {
27061 x := v_0
27062 if v_1.Op != OpAdd64 {
27063 break
27064 }
27065 _ = v_1.Args[1]
27066 v_1_0 := v_1.Args[0]
27067 v_1_1 := v_1.Args[1]
27068 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27069 y := v_1_0
27070 if v_1_1.Op != OpConst64 {
27071 continue
27072 }
27073 c := auxIntToInt64(v_1_1.AuxInt)
27074 if !(c&7 == 0) {
27075 continue
27076 }
27077 v.reset(OpRotateLeft8)
27078 v.AddArg2(x, y)
27079 return true
27080 }
27081 break
27082 }
27083
27084
27085
27086 for {
27087 x := v_0
27088 if v_1.Op != OpAdd32 {
27089 break
27090 }
27091 _ = v_1.Args[1]
27092 v_1_0 := v_1.Args[0]
27093 v_1_1 := v_1.Args[1]
27094 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27095 y := v_1_0
27096 if v_1_1.Op != OpConst32 {
27097 continue
27098 }
27099 c := auxIntToInt32(v_1_1.AuxInt)
27100 if !(c&7 == 0) {
27101 continue
27102 }
27103 v.reset(OpRotateLeft8)
27104 v.AddArg2(x, y)
27105 return true
27106 }
27107 break
27108 }
27109
27110
27111
27112 for {
27113 x := v_0
27114 if v_1.Op != OpAdd16 {
27115 break
27116 }
27117 _ = v_1.Args[1]
27118 v_1_0 := v_1.Args[0]
27119 v_1_1 := v_1.Args[1]
27120 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27121 y := v_1_0
27122 if v_1_1.Op != OpConst16 {
27123 continue
27124 }
27125 c := auxIntToInt16(v_1_1.AuxInt)
27126 if !(c&7 == 0) {
27127 continue
27128 }
27129 v.reset(OpRotateLeft8)
27130 v.AddArg2(x, y)
27131 return true
27132 }
27133 break
27134 }
27135
27136
27137
27138 for {
27139 x := v_0
27140 if v_1.Op != OpAdd8 {
27141 break
27142 }
27143 _ = v_1.Args[1]
27144 v_1_0 := v_1.Args[0]
27145 v_1_1 := v_1.Args[1]
27146 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27147 y := v_1_0
27148 if v_1_1.Op != OpConst8 {
27149 continue
27150 }
27151 c := auxIntToInt8(v_1_1.AuxInt)
27152 if !(c&7 == 0) {
27153 continue
27154 }
27155 v.reset(OpRotateLeft8)
27156 v.AddArg2(x, y)
27157 return true
27158 }
27159 break
27160 }
27161
27162
27163
27164 for {
27165 x := v_0
27166 if v_1.Op != OpSub64 {
27167 break
27168 }
27169 y := v_1.Args[1]
27170 v_1_0 := v_1.Args[0]
27171 if v_1_0.Op != OpConst64 {
27172 break
27173 }
27174 c := auxIntToInt64(v_1_0.AuxInt)
27175 if !(c&7 == 0) {
27176 break
27177 }
27178 v.reset(OpRotateLeft8)
27179 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
27180 v0.AddArg(y)
27181 v.AddArg2(x, v0)
27182 return true
27183 }
27184
27185
27186
27187 for {
27188 x := v_0
27189 if v_1.Op != OpSub32 {
27190 break
27191 }
27192 y := v_1.Args[1]
27193 v_1_0 := v_1.Args[0]
27194 if v_1_0.Op != OpConst32 {
27195 break
27196 }
27197 c := auxIntToInt32(v_1_0.AuxInt)
27198 if !(c&7 == 0) {
27199 break
27200 }
27201 v.reset(OpRotateLeft8)
27202 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
27203 v0.AddArg(y)
27204 v.AddArg2(x, v0)
27205 return true
27206 }
27207
27208
27209
27210 for {
27211 x := v_0
27212 if v_1.Op != OpSub16 {
27213 break
27214 }
27215 y := v_1.Args[1]
27216 v_1_0 := v_1.Args[0]
27217 if v_1_0.Op != OpConst16 {
27218 break
27219 }
27220 c := auxIntToInt16(v_1_0.AuxInt)
27221 if !(c&7 == 0) {
27222 break
27223 }
27224 v.reset(OpRotateLeft8)
27225 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
27226 v0.AddArg(y)
27227 v.AddArg2(x, v0)
27228 return true
27229 }
27230
27231
27232
27233 for {
27234 x := v_0
27235 if v_1.Op != OpSub8 {
27236 break
27237 }
27238 y := v_1.Args[1]
27239 v_1_0 := v_1.Args[0]
27240 if v_1_0.Op != OpConst8 {
27241 break
27242 }
27243 c := auxIntToInt8(v_1_0.AuxInt)
27244 if !(c&7 == 0) {
27245 break
27246 }
27247 v.reset(OpRotateLeft8)
27248 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
27249 v0.AddArg(y)
27250 v.AddArg2(x, v0)
27251 return true
27252 }
27253
27254
27255
27256 for {
27257 x := v_0
27258 if v_1.Op != OpConst64 {
27259 break
27260 }
27261 t := v_1.Type
27262 c := auxIntToInt64(v_1.AuxInt)
27263 if !(config.PtrSize == 4) {
27264 break
27265 }
27266 v.reset(OpRotateLeft8)
27267 v0 := b.NewValue0(v.Pos, OpConst32, t)
27268 v0.AuxInt = int32ToAuxInt(int32(c))
27269 v.AddArg2(x, v0)
27270 return true
27271 }
27272
27273
27274
27275 for {
27276 if v_0.Op != OpRotateLeft8 {
27277 break
27278 }
27279 c := v_0.Args[1]
27280 x := v_0.Args[0]
27281 d := v_1
27282 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
27283 break
27284 }
27285 v.reset(OpRotateLeft8)
27286 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
27287 v0.AddArg2(c, d)
27288 v.AddArg2(x, v0)
27289 return true
27290 }
27291
27292
27293
27294 for {
27295 if v_0.Op != OpRotateLeft8 {
27296 break
27297 }
27298 c := v_0.Args[1]
27299 x := v_0.Args[0]
27300 d := v_1
27301 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
27302 break
27303 }
27304 v.reset(OpRotateLeft8)
27305 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
27306 v0.AddArg2(c, d)
27307 v.AddArg2(x, v0)
27308 return true
27309 }
27310
27311
27312
27313 for {
27314 if v_0.Op != OpRotateLeft8 {
27315 break
27316 }
27317 c := v_0.Args[1]
27318 x := v_0.Args[0]
27319 d := v_1
27320 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
27321 break
27322 }
27323 v.reset(OpRotateLeft8)
27324 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
27325 v0.AddArg2(c, d)
27326 v.AddArg2(x, v0)
27327 return true
27328 }
27329
27330
27331
27332 for {
27333 if v_0.Op != OpRotateLeft8 {
27334 break
27335 }
27336 c := v_0.Args[1]
27337 x := v_0.Args[0]
27338 d := v_1
27339 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
27340 break
27341 }
27342 v.reset(OpRotateLeft8)
27343 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
27344 v0.AddArg2(c, d)
27345 v.AddArg2(x, v0)
27346 return true
27347 }
27348 return false
27349 }
27350 func rewriteValuegeneric_OpRound32F(v *Value) bool {
27351 v_0 := v.Args[0]
27352
27353
27354 for {
27355 x := v_0
27356 if x.Op != OpConst32F {
27357 break
27358 }
27359 v.copyOf(x)
27360 return true
27361 }
27362 return false
27363 }
27364 func rewriteValuegeneric_OpRound64F(v *Value) bool {
27365 v_0 := v.Args[0]
27366
27367
27368 for {
27369 x := v_0
27370 if x.Op != OpConst64F {
27371 break
27372 }
27373 v.copyOf(x)
27374 return true
27375 }
27376 return false
27377 }
27378 func rewriteValuegeneric_OpRoundToEven(v *Value) bool {
27379 v_0 := v.Args[0]
27380
27381
27382 for {
27383 if v_0.Op != OpConst64F {
27384 break
27385 }
27386 c := auxIntToFloat64(v_0.AuxInt)
27387 v.reset(OpConst64F)
27388 v.AuxInt = float64ToAuxInt(math.RoundToEven(c))
27389 return true
27390 }
27391 return false
27392 }
27393 func rewriteValuegeneric_OpRsh16Ux16(v *Value) bool {
27394 v_1 := v.Args[1]
27395 v_0 := v.Args[0]
27396 b := v.Block
27397
27398
27399 for {
27400 t := v.Type
27401 x := v_0
27402 if v_1.Op != OpConst16 {
27403 break
27404 }
27405 c := auxIntToInt16(v_1.AuxInt)
27406 v.reset(OpRsh16Ux64)
27407 v0 := b.NewValue0(v.Pos, OpConst64, t)
27408 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
27409 v.AddArg2(x, v0)
27410 return true
27411 }
27412
27413
27414 for {
27415 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27416 break
27417 }
27418 v.reset(OpConst16)
27419 v.AuxInt = int16ToAuxInt(0)
27420 return true
27421 }
27422
27423
27424
27425 for {
27426 if auxIntToBool(v.AuxInt) != false {
27427 break
27428 }
27429 x := v_0
27430 con := v_1
27431 if con.Op != OpConst16 {
27432 break
27433 }
27434 c := auxIntToInt16(con.AuxInt)
27435 if !(0 < c && c < 16) {
27436 break
27437 }
27438 v.reset(OpRsh16Ux16)
27439 v.AuxInt = boolToAuxInt(true)
27440 v.AddArg2(x, con)
27441 return true
27442 }
27443 return false
27444 }
27445 func rewriteValuegeneric_OpRsh16Ux32(v *Value) bool {
27446 v_1 := v.Args[1]
27447 v_0 := v.Args[0]
27448 b := v.Block
27449
27450
27451 for {
27452 t := v.Type
27453 x := v_0
27454 if v_1.Op != OpConst32 {
27455 break
27456 }
27457 c := auxIntToInt32(v_1.AuxInt)
27458 v.reset(OpRsh16Ux64)
27459 v0 := b.NewValue0(v.Pos, OpConst64, t)
27460 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
27461 v.AddArg2(x, v0)
27462 return true
27463 }
27464
27465
27466 for {
27467 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27468 break
27469 }
27470 v.reset(OpConst16)
27471 v.AuxInt = int16ToAuxInt(0)
27472 return true
27473 }
27474
27475
27476
27477 for {
27478 if auxIntToBool(v.AuxInt) != false {
27479 break
27480 }
27481 x := v_0
27482 con := v_1
27483 if con.Op != OpConst32 {
27484 break
27485 }
27486 c := auxIntToInt32(con.AuxInt)
27487 if !(0 < c && c < 16) {
27488 break
27489 }
27490 v.reset(OpRsh16Ux32)
27491 v.AuxInt = boolToAuxInt(true)
27492 v.AddArg2(x, con)
27493 return true
27494 }
27495 return false
27496 }
27497 func rewriteValuegeneric_OpRsh16Ux64(v *Value) bool {
27498 v_1 := v.Args[1]
27499 v_0 := v.Args[0]
27500 b := v.Block
27501 typ := &b.Func.Config.Types
27502
27503
27504 for {
27505 if v_0.Op != OpConst16 {
27506 break
27507 }
27508 c := auxIntToInt16(v_0.AuxInt)
27509 if v_1.Op != OpConst64 {
27510 break
27511 }
27512 d := auxIntToInt64(v_1.AuxInt)
27513 v.reset(OpConst16)
27514 v.AuxInt = int16ToAuxInt(int16(uint16(c) >> uint64(d)))
27515 return true
27516 }
27517
27518
27519 for {
27520 x := v_0
27521 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
27522 break
27523 }
27524 v.copyOf(x)
27525 return true
27526 }
27527
27528
27529 for {
27530 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27531 break
27532 }
27533 v.reset(OpConst16)
27534 v.AuxInt = int16ToAuxInt(0)
27535 return true
27536 }
27537
27538
27539
27540 for {
27541 if v_1.Op != OpConst64 {
27542 break
27543 }
27544 c := auxIntToInt64(v_1.AuxInt)
27545 if !(uint64(c) >= 16) {
27546 break
27547 }
27548 v.reset(OpConst16)
27549 v.AuxInt = int16ToAuxInt(0)
27550 return true
27551 }
27552
27553
27554
27555 for {
27556 t := v.Type
27557 if v_0.Op != OpRsh16Ux64 {
27558 break
27559 }
27560 _ = v_0.Args[1]
27561 x := v_0.Args[0]
27562 v_0_1 := v_0.Args[1]
27563 if v_0_1.Op != OpConst64 {
27564 break
27565 }
27566 c := auxIntToInt64(v_0_1.AuxInt)
27567 if v_1.Op != OpConst64 {
27568 break
27569 }
27570 d := auxIntToInt64(v_1.AuxInt)
27571 if !(!uaddOvf(c, d)) {
27572 break
27573 }
27574 v.reset(OpRsh16Ux64)
27575 v0 := b.NewValue0(v.Pos, OpConst64, t)
27576 v0.AuxInt = int64ToAuxInt(c + d)
27577 v.AddArg2(x, v0)
27578 return true
27579 }
27580
27581
27582 for {
27583 if v_0.Op != OpRsh16x64 {
27584 break
27585 }
27586 x := v_0.Args[0]
27587 if v_1.Op != OpConst64 {
27588 break
27589 }
27590 t := v_1.Type
27591 if auxIntToInt64(v_1.AuxInt) != 15 {
27592 break
27593 }
27594 v.reset(OpRsh16Ux64)
27595 v0 := b.NewValue0(v.Pos, OpConst64, t)
27596 v0.AuxInt = int64ToAuxInt(15)
27597 v.AddArg2(x, v0)
27598 return true
27599 }
27600
27601
27602
27603 for {
27604 i := v_0
27605 if i.Op != OpLsh16x64 {
27606 break
27607 }
27608 _ = i.Args[1]
27609 x := i.Args[0]
27610 i_1 := i.Args[1]
27611 if i_1.Op != OpConst64 {
27612 break
27613 }
27614 c := auxIntToInt64(i_1.AuxInt)
27615 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
27616 break
27617 }
27618 v.reset(OpAnd16)
27619 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
27620 v0.AuxInt = int16ToAuxInt(int16(^uint16(0) >> c))
27621 v.AddArg2(x, v0)
27622 return true
27623 }
27624
27625
27626
27627 for {
27628 if v_0.Op != OpLsh16x64 {
27629 break
27630 }
27631 _ = v_0.Args[1]
27632 v_0_0 := v_0.Args[0]
27633 if v_0_0.Op != OpRsh16Ux64 {
27634 break
27635 }
27636 _ = v_0_0.Args[1]
27637 x := v_0_0.Args[0]
27638 v_0_0_1 := v_0_0.Args[1]
27639 if v_0_0_1.Op != OpConst64 {
27640 break
27641 }
27642 c1 := auxIntToInt64(v_0_0_1.AuxInt)
27643 v_0_1 := v_0.Args[1]
27644 if v_0_1.Op != OpConst64 {
27645 break
27646 }
27647 c2 := auxIntToInt64(v_0_1.AuxInt)
27648 if v_1.Op != OpConst64 {
27649 break
27650 }
27651 c3 := auxIntToInt64(v_1.AuxInt)
27652 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
27653 break
27654 }
27655 v.reset(OpRsh16Ux64)
27656 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
27657 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
27658 v.AddArg2(x, v0)
27659 return true
27660 }
27661
27662
27663 for {
27664 if v_0.Op != OpLsh16x64 {
27665 break
27666 }
27667 _ = v_0.Args[1]
27668 x := v_0.Args[0]
27669 v_0_1 := v_0.Args[1]
27670 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 8 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 8 {
27671 break
27672 }
27673 v.reset(OpZeroExt8to16)
27674 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.UInt8)
27675 v0.AddArg(x)
27676 v.AddArg(v0)
27677 return true
27678 }
27679
27680
27681
27682 for {
27683 if auxIntToBool(v.AuxInt) != false {
27684 break
27685 }
27686 x := v_0
27687 con := v_1
27688 if con.Op != OpConst64 {
27689 break
27690 }
27691 c := auxIntToInt64(con.AuxInt)
27692 if !(0 < c && c < 16) {
27693 break
27694 }
27695 v.reset(OpRsh16Ux64)
27696 v.AuxInt = boolToAuxInt(true)
27697 v.AddArg2(x, con)
27698 return true
27699 }
27700 return false
27701 }
27702 func rewriteValuegeneric_OpRsh16Ux8(v *Value) bool {
27703 v_1 := v.Args[1]
27704 v_0 := v.Args[0]
27705 b := v.Block
27706
27707
27708 for {
27709 t := v.Type
27710 x := v_0
27711 if v_1.Op != OpConst8 {
27712 break
27713 }
27714 c := auxIntToInt8(v_1.AuxInt)
27715 v.reset(OpRsh16Ux64)
27716 v0 := b.NewValue0(v.Pos, OpConst64, t)
27717 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
27718 v.AddArg2(x, v0)
27719 return true
27720 }
27721
27722
27723 for {
27724 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27725 break
27726 }
27727 v.reset(OpConst16)
27728 v.AuxInt = int16ToAuxInt(0)
27729 return true
27730 }
27731
27732
27733
27734 for {
27735 if auxIntToBool(v.AuxInt) != false {
27736 break
27737 }
27738 x := v_0
27739 con := v_1
27740 if con.Op != OpConst8 {
27741 break
27742 }
27743 c := auxIntToInt8(con.AuxInt)
27744 if !(0 < c && c < 16) {
27745 break
27746 }
27747 v.reset(OpRsh16Ux8)
27748 v.AuxInt = boolToAuxInt(true)
27749 v.AddArg2(x, con)
27750 return true
27751 }
27752 return false
27753 }
27754 func rewriteValuegeneric_OpRsh16x16(v *Value) bool {
27755 v_1 := v.Args[1]
27756 v_0 := v.Args[0]
27757 b := v.Block
27758
27759
27760 for {
27761 t := v.Type
27762 x := v_0
27763 if v_1.Op != OpConst16 {
27764 break
27765 }
27766 c := auxIntToInt16(v_1.AuxInt)
27767 v.reset(OpRsh16x64)
27768 v0 := b.NewValue0(v.Pos, OpConst64, t)
27769 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
27770 v.AddArg2(x, v0)
27771 return true
27772 }
27773
27774
27775 for {
27776 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27777 break
27778 }
27779 v.reset(OpConst16)
27780 v.AuxInt = int16ToAuxInt(0)
27781 return true
27782 }
27783
27784
27785
27786 for {
27787 if auxIntToBool(v.AuxInt) != false {
27788 break
27789 }
27790 x := v_0
27791 con := v_1
27792 if con.Op != OpConst16 {
27793 break
27794 }
27795 c := auxIntToInt16(con.AuxInt)
27796 if !(0 < c && c < 16) {
27797 break
27798 }
27799 v.reset(OpRsh16x16)
27800 v.AuxInt = boolToAuxInt(true)
27801 v.AddArg2(x, con)
27802 return true
27803 }
27804 return false
27805 }
27806 func rewriteValuegeneric_OpRsh16x32(v *Value) bool {
27807 v_1 := v.Args[1]
27808 v_0 := v.Args[0]
27809 b := v.Block
27810
27811
27812 for {
27813 t := v.Type
27814 x := v_0
27815 if v_1.Op != OpConst32 {
27816 break
27817 }
27818 c := auxIntToInt32(v_1.AuxInt)
27819 v.reset(OpRsh16x64)
27820 v0 := b.NewValue0(v.Pos, OpConst64, t)
27821 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
27822 v.AddArg2(x, v0)
27823 return true
27824 }
27825
27826
27827 for {
27828 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27829 break
27830 }
27831 v.reset(OpConst16)
27832 v.AuxInt = int16ToAuxInt(0)
27833 return true
27834 }
27835
27836
27837
27838 for {
27839 if auxIntToBool(v.AuxInt) != false {
27840 break
27841 }
27842 x := v_0
27843 con := v_1
27844 if con.Op != OpConst32 {
27845 break
27846 }
27847 c := auxIntToInt32(con.AuxInt)
27848 if !(0 < c && c < 16) {
27849 break
27850 }
27851 v.reset(OpRsh16x32)
27852 v.AuxInt = boolToAuxInt(true)
27853 v.AddArg2(x, con)
27854 return true
27855 }
27856 return false
27857 }
27858 func rewriteValuegeneric_OpRsh16x64(v *Value) bool {
27859 v_1 := v.Args[1]
27860 v_0 := v.Args[0]
27861 b := v.Block
27862 typ := &b.Func.Config.Types
27863
27864
27865 for {
27866 if v_0.Op != OpConst16 {
27867 break
27868 }
27869 c := auxIntToInt16(v_0.AuxInt)
27870 if v_1.Op != OpConst64 {
27871 break
27872 }
27873 d := auxIntToInt64(v_1.AuxInt)
27874 v.reset(OpConst16)
27875 v.AuxInt = int16ToAuxInt(c >> uint64(d))
27876 return true
27877 }
27878
27879
27880 for {
27881 x := v_0
27882 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
27883 break
27884 }
27885 v.copyOf(x)
27886 return true
27887 }
27888
27889
27890 for {
27891 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27892 break
27893 }
27894 v.reset(OpConst16)
27895 v.AuxInt = int16ToAuxInt(0)
27896 return true
27897 }
27898
27899
27900
27901 for {
27902 t := v.Type
27903 if v_0.Op != OpRsh16x64 {
27904 break
27905 }
27906 _ = v_0.Args[1]
27907 x := v_0.Args[0]
27908 v_0_1 := v_0.Args[1]
27909 if v_0_1.Op != OpConst64 {
27910 break
27911 }
27912 c := auxIntToInt64(v_0_1.AuxInt)
27913 if v_1.Op != OpConst64 {
27914 break
27915 }
27916 d := auxIntToInt64(v_1.AuxInt)
27917 if !(!uaddOvf(c, d)) {
27918 break
27919 }
27920 v.reset(OpRsh16x64)
27921 v0 := b.NewValue0(v.Pos, OpConst64, t)
27922 v0.AuxInt = int64ToAuxInt(c + d)
27923 v.AddArg2(x, v0)
27924 return true
27925 }
27926
27927
27928 for {
27929 if v_0.Op != OpLsh16x64 {
27930 break
27931 }
27932 _ = v_0.Args[1]
27933 x := v_0.Args[0]
27934 v_0_1 := v_0.Args[1]
27935 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 8 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 8 {
27936 break
27937 }
27938 v.reset(OpSignExt8to16)
27939 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.Int8)
27940 v0.AddArg(x)
27941 v.AddArg(v0)
27942 return true
27943 }
27944
27945
27946
27947 for {
27948 if auxIntToBool(v.AuxInt) != false {
27949 break
27950 }
27951 x := v_0
27952 con := v_1
27953 if con.Op != OpConst64 {
27954 break
27955 }
27956 c := auxIntToInt64(con.AuxInt)
27957 if !(0 < c && c < 16) {
27958 break
27959 }
27960 v.reset(OpRsh16x64)
27961 v.AuxInt = boolToAuxInt(true)
27962 v.AddArg2(x, con)
27963 return true
27964 }
27965 return false
27966 }
27967 func rewriteValuegeneric_OpRsh16x8(v *Value) bool {
27968 v_1 := v.Args[1]
27969 v_0 := v.Args[0]
27970 b := v.Block
27971
27972
27973 for {
27974 t := v.Type
27975 x := v_0
27976 if v_1.Op != OpConst8 {
27977 break
27978 }
27979 c := auxIntToInt8(v_1.AuxInt)
27980 v.reset(OpRsh16x64)
27981 v0 := b.NewValue0(v.Pos, OpConst64, t)
27982 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
27983 v.AddArg2(x, v0)
27984 return true
27985 }
27986
27987
27988 for {
27989 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27990 break
27991 }
27992 v.reset(OpConst16)
27993 v.AuxInt = int16ToAuxInt(0)
27994 return true
27995 }
27996
27997
27998
27999 for {
28000 if auxIntToBool(v.AuxInt) != false {
28001 break
28002 }
28003 x := v_0
28004 con := v_1
28005 if con.Op != OpConst8 {
28006 break
28007 }
28008 c := auxIntToInt8(con.AuxInt)
28009 if !(0 < c && c < 16) {
28010 break
28011 }
28012 v.reset(OpRsh16x8)
28013 v.AuxInt = boolToAuxInt(true)
28014 v.AddArg2(x, con)
28015 return true
28016 }
28017 return false
28018 }
28019 func rewriteValuegeneric_OpRsh32Ux16(v *Value) bool {
28020 v_1 := v.Args[1]
28021 v_0 := v.Args[0]
28022 b := v.Block
28023
28024
28025 for {
28026 t := v.Type
28027 x := v_0
28028 if v_1.Op != OpConst16 {
28029 break
28030 }
28031 c := auxIntToInt16(v_1.AuxInt)
28032 v.reset(OpRsh32Ux64)
28033 v0 := b.NewValue0(v.Pos, OpConst64, t)
28034 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28035 v.AddArg2(x, v0)
28036 return true
28037 }
28038
28039
28040 for {
28041 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28042 break
28043 }
28044 v.reset(OpConst32)
28045 v.AuxInt = int32ToAuxInt(0)
28046 return true
28047 }
28048
28049
28050
28051 for {
28052 if auxIntToBool(v.AuxInt) != false {
28053 break
28054 }
28055 x := v_0
28056 con := v_1
28057 if con.Op != OpConst16 {
28058 break
28059 }
28060 c := auxIntToInt16(con.AuxInt)
28061 if !(0 < c && c < 32) {
28062 break
28063 }
28064 v.reset(OpRsh32Ux16)
28065 v.AuxInt = boolToAuxInt(true)
28066 v.AddArg2(x, con)
28067 return true
28068 }
28069 return false
28070 }
28071 func rewriteValuegeneric_OpRsh32Ux32(v *Value) bool {
28072 v_1 := v.Args[1]
28073 v_0 := v.Args[0]
28074 b := v.Block
28075
28076
28077 for {
28078 t := v.Type
28079 x := v_0
28080 if v_1.Op != OpConst32 {
28081 break
28082 }
28083 c := auxIntToInt32(v_1.AuxInt)
28084 v.reset(OpRsh32Ux64)
28085 v0 := b.NewValue0(v.Pos, OpConst64, t)
28086 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
28087 v.AddArg2(x, v0)
28088 return true
28089 }
28090
28091
28092 for {
28093 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28094 break
28095 }
28096 v.reset(OpConst32)
28097 v.AuxInt = int32ToAuxInt(0)
28098 return true
28099 }
28100
28101
28102
28103 for {
28104 if auxIntToBool(v.AuxInt) != false {
28105 break
28106 }
28107 x := v_0
28108 con := v_1
28109 if con.Op != OpConst32 {
28110 break
28111 }
28112 c := auxIntToInt32(con.AuxInt)
28113 if !(0 < c && c < 32) {
28114 break
28115 }
28116 v.reset(OpRsh32Ux32)
28117 v.AuxInt = boolToAuxInt(true)
28118 v.AddArg2(x, con)
28119 return true
28120 }
28121 return false
28122 }
28123 func rewriteValuegeneric_OpRsh32Ux64(v *Value) bool {
28124 v_1 := v.Args[1]
28125 v_0 := v.Args[0]
28126 b := v.Block
28127 typ := &b.Func.Config.Types
28128
28129
28130 for {
28131 if v_0.Op != OpConst32 {
28132 break
28133 }
28134 c := auxIntToInt32(v_0.AuxInt)
28135 if v_1.Op != OpConst64 {
28136 break
28137 }
28138 d := auxIntToInt64(v_1.AuxInt)
28139 v.reset(OpConst32)
28140 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
28141 return true
28142 }
28143
28144
28145 for {
28146 x := v_0
28147 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
28148 break
28149 }
28150 v.copyOf(x)
28151 return true
28152 }
28153
28154
28155 for {
28156 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28157 break
28158 }
28159 v.reset(OpConst32)
28160 v.AuxInt = int32ToAuxInt(0)
28161 return true
28162 }
28163
28164
28165
28166 for {
28167 if v_1.Op != OpConst64 {
28168 break
28169 }
28170 c := auxIntToInt64(v_1.AuxInt)
28171 if !(uint64(c) >= 32) {
28172 break
28173 }
28174 v.reset(OpConst32)
28175 v.AuxInt = int32ToAuxInt(0)
28176 return true
28177 }
28178
28179
28180
28181 for {
28182 t := v.Type
28183 if v_0.Op != OpRsh32Ux64 {
28184 break
28185 }
28186 _ = v_0.Args[1]
28187 x := v_0.Args[0]
28188 v_0_1 := v_0.Args[1]
28189 if v_0_1.Op != OpConst64 {
28190 break
28191 }
28192 c := auxIntToInt64(v_0_1.AuxInt)
28193 if v_1.Op != OpConst64 {
28194 break
28195 }
28196 d := auxIntToInt64(v_1.AuxInt)
28197 if !(!uaddOvf(c, d)) {
28198 break
28199 }
28200 v.reset(OpRsh32Ux64)
28201 v0 := b.NewValue0(v.Pos, OpConst64, t)
28202 v0.AuxInt = int64ToAuxInt(c + d)
28203 v.AddArg2(x, v0)
28204 return true
28205 }
28206
28207
28208 for {
28209 if v_0.Op != OpRsh32x64 {
28210 break
28211 }
28212 x := v_0.Args[0]
28213 if v_1.Op != OpConst64 {
28214 break
28215 }
28216 t := v_1.Type
28217 if auxIntToInt64(v_1.AuxInt) != 31 {
28218 break
28219 }
28220 v.reset(OpRsh32Ux64)
28221 v0 := b.NewValue0(v.Pos, OpConst64, t)
28222 v0.AuxInt = int64ToAuxInt(31)
28223 v.AddArg2(x, v0)
28224 return true
28225 }
28226
28227
28228
28229 for {
28230 i := v_0
28231 if i.Op != OpLsh32x64 {
28232 break
28233 }
28234 _ = i.Args[1]
28235 x := i.Args[0]
28236 i_1 := i.Args[1]
28237 if i_1.Op != OpConst64 {
28238 break
28239 }
28240 c := auxIntToInt64(i_1.AuxInt)
28241 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
28242 break
28243 }
28244 v.reset(OpAnd32)
28245 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
28246 v0.AuxInt = int32ToAuxInt(int32(^uint32(0) >> c))
28247 v.AddArg2(x, v0)
28248 return true
28249 }
28250
28251
28252
28253 for {
28254 if v_0.Op != OpLsh32x64 {
28255 break
28256 }
28257 _ = v_0.Args[1]
28258 v_0_0 := v_0.Args[0]
28259 if v_0_0.Op != OpRsh32Ux64 {
28260 break
28261 }
28262 _ = v_0_0.Args[1]
28263 x := v_0_0.Args[0]
28264 v_0_0_1 := v_0_0.Args[1]
28265 if v_0_0_1.Op != OpConst64 {
28266 break
28267 }
28268 c1 := auxIntToInt64(v_0_0_1.AuxInt)
28269 v_0_1 := v_0.Args[1]
28270 if v_0_1.Op != OpConst64 {
28271 break
28272 }
28273 c2 := auxIntToInt64(v_0_1.AuxInt)
28274 if v_1.Op != OpConst64 {
28275 break
28276 }
28277 c3 := auxIntToInt64(v_1.AuxInt)
28278 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
28279 break
28280 }
28281 v.reset(OpRsh32Ux64)
28282 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
28283 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
28284 v.AddArg2(x, v0)
28285 return true
28286 }
28287
28288
28289 for {
28290 if v_0.Op != OpLsh32x64 {
28291 break
28292 }
28293 _ = v_0.Args[1]
28294 x := v_0.Args[0]
28295 v_0_1 := v_0.Args[1]
28296 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 24 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 24 {
28297 break
28298 }
28299 v.reset(OpZeroExt8to32)
28300 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.UInt8)
28301 v0.AddArg(x)
28302 v.AddArg(v0)
28303 return true
28304 }
28305
28306
28307 for {
28308 if v_0.Op != OpLsh32x64 {
28309 break
28310 }
28311 _ = v_0.Args[1]
28312 x := v_0.Args[0]
28313 v_0_1 := v_0.Args[1]
28314 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 16 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 16 {
28315 break
28316 }
28317 v.reset(OpZeroExt16to32)
28318 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.UInt16)
28319 v0.AddArg(x)
28320 v.AddArg(v0)
28321 return true
28322 }
28323
28324
28325
28326 for {
28327 if auxIntToBool(v.AuxInt) != false {
28328 break
28329 }
28330 x := v_0
28331 con := v_1
28332 if con.Op != OpConst64 {
28333 break
28334 }
28335 c := auxIntToInt64(con.AuxInt)
28336 if !(0 < c && c < 32) {
28337 break
28338 }
28339 v.reset(OpRsh32Ux64)
28340 v.AuxInt = boolToAuxInt(true)
28341 v.AddArg2(x, con)
28342 return true
28343 }
28344 return false
28345 }
28346 func rewriteValuegeneric_OpRsh32Ux8(v *Value) bool {
28347 v_1 := v.Args[1]
28348 v_0 := v.Args[0]
28349 b := v.Block
28350
28351
28352 for {
28353 t := v.Type
28354 x := v_0
28355 if v_1.Op != OpConst8 {
28356 break
28357 }
28358 c := auxIntToInt8(v_1.AuxInt)
28359 v.reset(OpRsh32Ux64)
28360 v0 := b.NewValue0(v.Pos, OpConst64, t)
28361 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
28362 v.AddArg2(x, v0)
28363 return true
28364 }
28365
28366
28367 for {
28368 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28369 break
28370 }
28371 v.reset(OpConst32)
28372 v.AuxInt = int32ToAuxInt(0)
28373 return true
28374 }
28375
28376
28377
28378 for {
28379 if auxIntToBool(v.AuxInt) != false {
28380 break
28381 }
28382 x := v_0
28383 con := v_1
28384 if con.Op != OpConst8 {
28385 break
28386 }
28387 c := auxIntToInt8(con.AuxInt)
28388 if !(0 < c && c < 32) {
28389 break
28390 }
28391 v.reset(OpRsh32Ux8)
28392 v.AuxInt = boolToAuxInt(true)
28393 v.AddArg2(x, con)
28394 return true
28395 }
28396 return false
28397 }
28398 func rewriteValuegeneric_OpRsh32x16(v *Value) bool {
28399 v_1 := v.Args[1]
28400 v_0 := v.Args[0]
28401 b := v.Block
28402
28403
28404 for {
28405 t := v.Type
28406 x := v_0
28407 if v_1.Op != OpConst16 {
28408 break
28409 }
28410 c := auxIntToInt16(v_1.AuxInt)
28411 v.reset(OpRsh32x64)
28412 v0 := b.NewValue0(v.Pos, OpConst64, t)
28413 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28414 v.AddArg2(x, v0)
28415 return true
28416 }
28417
28418
28419 for {
28420 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28421 break
28422 }
28423 v.reset(OpConst32)
28424 v.AuxInt = int32ToAuxInt(0)
28425 return true
28426 }
28427
28428
28429
28430 for {
28431 if auxIntToBool(v.AuxInt) != false {
28432 break
28433 }
28434 x := v_0
28435 con := v_1
28436 if con.Op != OpConst16 {
28437 break
28438 }
28439 c := auxIntToInt16(con.AuxInt)
28440 if !(0 < c && c < 32) {
28441 break
28442 }
28443 v.reset(OpRsh32x16)
28444 v.AuxInt = boolToAuxInt(true)
28445 v.AddArg2(x, con)
28446 return true
28447 }
28448 return false
28449 }
28450 func rewriteValuegeneric_OpRsh32x32(v *Value) bool {
28451 v_1 := v.Args[1]
28452 v_0 := v.Args[0]
28453 b := v.Block
28454
28455
28456 for {
28457 t := v.Type
28458 x := v_0
28459 if v_1.Op != OpConst32 {
28460 break
28461 }
28462 c := auxIntToInt32(v_1.AuxInt)
28463 v.reset(OpRsh32x64)
28464 v0 := b.NewValue0(v.Pos, OpConst64, t)
28465 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
28466 v.AddArg2(x, v0)
28467 return true
28468 }
28469
28470
28471 for {
28472 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28473 break
28474 }
28475 v.reset(OpConst32)
28476 v.AuxInt = int32ToAuxInt(0)
28477 return true
28478 }
28479
28480
28481
28482 for {
28483 if auxIntToBool(v.AuxInt) != false {
28484 break
28485 }
28486 x := v_0
28487 con := v_1
28488 if con.Op != OpConst32 {
28489 break
28490 }
28491 c := auxIntToInt32(con.AuxInt)
28492 if !(0 < c && c < 32) {
28493 break
28494 }
28495 v.reset(OpRsh32x32)
28496 v.AuxInt = boolToAuxInt(true)
28497 v.AddArg2(x, con)
28498 return true
28499 }
28500 return false
28501 }
28502 func rewriteValuegeneric_OpRsh32x64(v *Value) bool {
28503 v_1 := v.Args[1]
28504 v_0 := v.Args[0]
28505 b := v.Block
28506 typ := &b.Func.Config.Types
28507
28508
28509 for {
28510 if v_0.Op != OpConst32 {
28511 break
28512 }
28513 c := auxIntToInt32(v_0.AuxInt)
28514 if v_1.Op != OpConst64 {
28515 break
28516 }
28517 d := auxIntToInt64(v_1.AuxInt)
28518 v.reset(OpConst32)
28519 v.AuxInt = int32ToAuxInt(c >> uint64(d))
28520 return true
28521 }
28522
28523
28524 for {
28525 x := v_0
28526 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
28527 break
28528 }
28529 v.copyOf(x)
28530 return true
28531 }
28532
28533
28534 for {
28535 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28536 break
28537 }
28538 v.reset(OpConst32)
28539 v.AuxInt = int32ToAuxInt(0)
28540 return true
28541 }
28542
28543
28544
28545 for {
28546 t := v.Type
28547 if v_0.Op != OpRsh32x64 {
28548 break
28549 }
28550 _ = v_0.Args[1]
28551 x := v_0.Args[0]
28552 v_0_1 := v_0.Args[1]
28553 if v_0_1.Op != OpConst64 {
28554 break
28555 }
28556 c := auxIntToInt64(v_0_1.AuxInt)
28557 if v_1.Op != OpConst64 {
28558 break
28559 }
28560 d := auxIntToInt64(v_1.AuxInt)
28561 if !(!uaddOvf(c, d)) {
28562 break
28563 }
28564 v.reset(OpRsh32x64)
28565 v0 := b.NewValue0(v.Pos, OpConst64, t)
28566 v0.AuxInt = int64ToAuxInt(c + d)
28567 v.AddArg2(x, v0)
28568 return true
28569 }
28570
28571
28572 for {
28573 if v_0.Op != OpLsh32x64 {
28574 break
28575 }
28576 _ = v_0.Args[1]
28577 x := v_0.Args[0]
28578 v_0_1 := v_0.Args[1]
28579 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 24 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 24 {
28580 break
28581 }
28582 v.reset(OpSignExt8to32)
28583 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.Int8)
28584 v0.AddArg(x)
28585 v.AddArg(v0)
28586 return true
28587 }
28588
28589
28590 for {
28591 if v_0.Op != OpLsh32x64 {
28592 break
28593 }
28594 _ = v_0.Args[1]
28595 x := v_0.Args[0]
28596 v_0_1 := v_0.Args[1]
28597 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 16 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 16 {
28598 break
28599 }
28600 v.reset(OpSignExt16to32)
28601 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.Int16)
28602 v0.AddArg(x)
28603 v.AddArg(v0)
28604 return true
28605 }
28606
28607
28608
28609 for {
28610 if auxIntToBool(v.AuxInt) != false {
28611 break
28612 }
28613 x := v_0
28614 con := v_1
28615 if con.Op != OpConst64 {
28616 break
28617 }
28618 c := auxIntToInt64(con.AuxInt)
28619 if !(0 < c && c < 32) {
28620 break
28621 }
28622 v.reset(OpRsh32x64)
28623 v.AuxInt = boolToAuxInt(true)
28624 v.AddArg2(x, con)
28625 return true
28626 }
28627 return false
28628 }
28629 func rewriteValuegeneric_OpRsh32x8(v *Value) bool {
28630 v_1 := v.Args[1]
28631 v_0 := v.Args[0]
28632 b := v.Block
28633
28634
28635 for {
28636 t := v.Type
28637 x := v_0
28638 if v_1.Op != OpConst8 {
28639 break
28640 }
28641 c := auxIntToInt8(v_1.AuxInt)
28642 v.reset(OpRsh32x64)
28643 v0 := b.NewValue0(v.Pos, OpConst64, t)
28644 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
28645 v.AddArg2(x, v0)
28646 return true
28647 }
28648
28649
28650 for {
28651 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28652 break
28653 }
28654 v.reset(OpConst32)
28655 v.AuxInt = int32ToAuxInt(0)
28656 return true
28657 }
28658
28659
28660
28661 for {
28662 if auxIntToBool(v.AuxInt) != false {
28663 break
28664 }
28665 x := v_0
28666 con := v_1
28667 if con.Op != OpConst8 {
28668 break
28669 }
28670 c := auxIntToInt8(con.AuxInt)
28671 if !(0 < c && c < 32) {
28672 break
28673 }
28674 v.reset(OpRsh32x8)
28675 v.AuxInt = boolToAuxInt(true)
28676 v.AddArg2(x, con)
28677 return true
28678 }
28679 return false
28680 }
28681 func rewriteValuegeneric_OpRsh64Ux16(v *Value) bool {
28682 v_1 := v.Args[1]
28683 v_0 := v.Args[0]
28684 b := v.Block
28685
28686
28687 for {
28688 t := v.Type
28689 x := v_0
28690 if v_1.Op != OpConst16 {
28691 break
28692 }
28693 c := auxIntToInt16(v_1.AuxInt)
28694 v.reset(OpRsh64Ux64)
28695 v0 := b.NewValue0(v.Pos, OpConst64, t)
28696 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28697 v.AddArg2(x, v0)
28698 return true
28699 }
28700
28701
28702 for {
28703 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
28704 break
28705 }
28706 v.reset(OpConst64)
28707 v.AuxInt = int64ToAuxInt(0)
28708 return true
28709 }
28710
28711
28712
28713 for {
28714 if auxIntToBool(v.AuxInt) != false {
28715 break
28716 }
28717 x := v_0
28718 con := v_1
28719 if con.Op != OpConst16 {
28720 break
28721 }
28722 c := auxIntToInt16(con.AuxInt)
28723 if !(0 < c && c < 64) {
28724 break
28725 }
28726 v.reset(OpRsh64Ux16)
28727 v.AuxInt = boolToAuxInt(true)
28728 v.AddArg2(x, con)
28729 return true
28730 }
28731 return false
28732 }
28733 func rewriteValuegeneric_OpRsh64Ux32(v *Value) bool {
28734 v_1 := v.Args[1]
28735 v_0 := v.Args[0]
28736 b := v.Block
28737
28738
28739 for {
28740 t := v.Type
28741 x := v_0
28742 if v_1.Op != OpConst32 {
28743 break
28744 }
28745 c := auxIntToInt32(v_1.AuxInt)
28746 v.reset(OpRsh64Ux64)
28747 v0 := b.NewValue0(v.Pos, OpConst64, t)
28748 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
28749 v.AddArg2(x, v0)
28750 return true
28751 }
28752
28753
28754 for {
28755 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
28756 break
28757 }
28758 v.reset(OpConst64)
28759 v.AuxInt = int64ToAuxInt(0)
28760 return true
28761 }
28762
28763
28764
28765 for {
28766 if auxIntToBool(v.AuxInt) != false {
28767 break
28768 }
28769 x := v_0
28770 con := v_1
28771 if con.Op != OpConst32 {
28772 break
28773 }
28774 c := auxIntToInt32(con.AuxInt)
28775 if !(0 < c && c < 64) {
28776 break
28777 }
28778 v.reset(OpRsh64Ux32)
28779 v.AuxInt = boolToAuxInt(true)
28780 v.AddArg2(x, con)
28781 return true
28782 }
28783 return false
28784 }
28785 func rewriteValuegeneric_OpRsh64Ux64(v *Value) bool {
28786 v_1 := v.Args[1]
28787 v_0 := v.Args[0]
28788 b := v.Block
28789 typ := &b.Func.Config.Types
28790
28791
28792 for {
28793 if v_0.Op != OpConst64 {
28794 break
28795 }
28796 c := auxIntToInt64(v_0.AuxInt)
28797 if v_1.Op != OpConst64 {
28798 break
28799 }
28800 d := auxIntToInt64(v_1.AuxInt)
28801 v.reset(OpConst64)
28802 v.AuxInt = int64ToAuxInt(int64(uint64(c) >> uint64(d)))
28803 return true
28804 }
28805
28806
28807 for {
28808 x := v_0
28809 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
28810 break
28811 }
28812 v.copyOf(x)
28813 return true
28814 }
28815
28816
28817 for {
28818 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
28819 break
28820 }
28821 v.reset(OpConst64)
28822 v.AuxInt = int64ToAuxInt(0)
28823 return true
28824 }
28825
28826
28827
28828 for {
28829 if v_1.Op != OpConst64 {
28830 break
28831 }
28832 c := auxIntToInt64(v_1.AuxInt)
28833 if !(uint64(c) >= 64) {
28834 break
28835 }
28836 v.reset(OpConst64)
28837 v.AuxInt = int64ToAuxInt(0)
28838 return true
28839 }
28840
28841
28842
28843 for {
28844 t := v.Type
28845 if v_0.Op != OpRsh64Ux64 {
28846 break
28847 }
28848 _ = v_0.Args[1]
28849 x := v_0.Args[0]
28850 v_0_1 := v_0.Args[1]
28851 if v_0_1.Op != OpConst64 {
28852 break
28853 }
28854 c := auxIntToInt64(v_0_1.AuxInt)
28855 if v_1.Op != OpConst64 {
28856 break
28857 }
28858 d := auxIntToInt64(v_1.AuxInt)
28859 if !(!uaddOvf(c, d)) {
28860 break
28861 }
28862 v.reset(OpRsh64Ux64)
28863 v0 := b.NewValue0(v.Pos, OpConst64, t)
28864 v0.AuxInt = int64ToAuxInt(c + d)
28865 v.AddArg2(x, v0)
28866 return true
28867 }
28868
28869
28870 for {
28871 if v_0.Op != OpRsh64x64 {
28872 break
28873 }
28874 x := v_0.Args[0]
28875 if v_1.Op != OpConst64 {
28876 break
28877 }
28878 t := v_1.Type
28879 if auxIntToInt64(v_1.AuxInt) != 63 {
28880 break
28881 }
28882 v.reset(OpRsh64Ux64)
28883 v0 := b.NewValue0(v.Pos, OpConst64, t)
28884 v0.AuxInt = int64ToAuxInt(63)
28885 v.AddArg2(x, v0)
28886 return true
28887 }
28888
28889
28890
28891 for {
28892 i := v_0
28893 if i.Op != OpLsh64x64 {
28894 break
28895 }
28896 _ = i.Args[1]
28897 x := i.Args[0]
28898 i_1 := i.Args[1]
28899 if i_1.Op != OpConst64 {
28900 break
28901 }
28902 c := auxIntToInt64(i_1.AuxInt)
28903 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
28904 break
28905 }
28906 v.reset(OpAnd64)
28907 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
28908 v0.AuxInt = int64ToAuxInt(int64(^uint64(0) >> c))
28909 v.AddArg2(x, v0)
28910 return true
28911 }
28912
28913
28914
28915 for {
28916 if v_0.Op != OpLsh64x64 {
28917 break
28918 }
28919 _ = v_0.Args[1]
28920 v_0_0 := v_0.Args[0]
28921 if v_0_0.Op != OpRsh64Ux64 {
28922 break
28923 }
28924 _ = v_0_0.Args[1]
28925 x := v_0_0.Args[0]
28926 v_0_0_1 := v_0_0.Args[1]
28927 if v_0_0_1.Op != OpConst64 {
28928 break
28929 }
28930 c1 := auxIntToInt64(v_0_0_1.AuxInt)
28931 v_0_1 := v_0.Args[1]
28932 if v_0_1.Op != OpConst64 {
28933 break
28934 }
28935 c2 := auxIntToInt64(v_0_1.AuxInt)
28936 if v_1.Op != OpConst64 {
28937 break
28938 }
28939 c3 := auxIntToInt64(v_1.AuxInt)
28940 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
28941 break
28942 }
28943 v.reset(OpRsh64Ux64)
28944 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
28945 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
28946 v.AddArg2(x, v0)
28947 return true
28948 }
28949
28950
28951 for {
28952 if v_0.Op != OpLsh64x64 {
28953 break
28954 }
28955 _ = v_0.Args[1]
28956 x := v_0.Args[0]
28957 v_0_1 := v_0.Args[1]
28958 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 56 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 56 {
28959 break
28960 }
28961 v.reset(OpZeroExt8to64)
28962 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.UInt8)
28963 v0.AddArg(x)
28964 v.AddArg(v0)
28965 return true
28966 }
28967
28968
28969 for {
28970 if v_0.Op != OpLsh64x64 {
28971 break
28972 }
28973 _ = v_0.Args[1]
28974 x := v_0.Args[0]
28975 v_0_1 := v_0.Args[1]
28976 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 48 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 48 {
28977 break
28978 }
28979 v.reset(OpZeroExt16to64)
28980 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.UInt16)
28981 v0.AddArg(x)
28982 v.AddArg(v0)
28983 return true
28984 }
28985
28986
28987 for {
28988 if v_0.Op != OpLsh64x64 {
28989 break
28990 }
28991 _ = v_0.Args[1]
28992 x := v_0.Args[0]
28993 v_0_1 := v_0.Args[1]
28994 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 32 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 32 {
28995 break
28996 }
28997 v.reset(OpZeroExt32to64)
28998 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.UInt32)
28999 v0.AddArg(x)
29000 v.AddArg(v0)
29001 return true
29002 }
29003
29004
29005
29006 for {
29007 if auxIntToBool(v.AuxInt) != false {
29008 break
29009 }
29010 x := v_0
29011 con := v_1
29012 if con.Op != OpConst64 {
29013 break
29014 }
29015 c := auxIntToInt64(con.AuxInt)
29016 if !(0 < c && c < 64) {
29017 break
29018 }
29019 v.reset(OpRsh64Ux64)
29020 v.AuxInt = boolToAuxInt(true)
29021 v.AddArg2(x, con)
29022 return true
29023 }
29024 return false
29025 }
29026 func rewriteValuegeneric_OpRsh64Ux8(v *Value) bool {
29027 v_1 := v.Args[1]
29028 v_0 := v.Args[0]
29029 b := v.Block
29030
29031
29032 for {
29033 t := v.Type
29034 x := v_0
29035 if v_1.Op != OpConst8 {
29036 break
29037 }
29038 c := auxIntToInt8(v_1.AuxInt)
29039 v.reset(OpRsh64Ux64)
29040 v0 := b.NewValue0(v.Pos, OpConst64, t)
29041 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
29042 v.AddArg2(x, v0)
29043 return true
29044 }
29045
29046
29047 for {
29048 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29049 break
29050 }
29051 v.reset(OpConst64)
29052 v.AuxInt = int64ToAuxInt(0)
29053 return true
29054 }
29055
29056
29057
29058 for {
29059 if auxIntToBool(v.AuxInt) != false {
29060 break
29061 }
29062 x := v_0
29063 con := v_1
29064 if con.Op != OpConst8 {
29065 break
29066 }
29067 c := auxIntToInt8(con.AuxInt)
29068 if !(0 < c && c < 64) {
29069 break
29070 }
29071 v.reset(OpRsh64Ux8)
29072 v.AuxInt = boolToAuxInt(true)
29073 v.AddArg2(x, con)
29074 return true
29075 }
29076 return false
29077 }
29078 func rewriteValuegeneric_OpRsh64x16(v *Value) bool {
29079 v_1 := v.Args[1]
29080 v_0 := v.Args[0]
29081 b := v.Block
29082
29083
29084 for {
29085 t := v.Type
29086 x := v_0
29087 if v_1.Op != OpConst16 {
29088 break
29089 }
29090 c := auxIntToInt16(v_1.AuxInt)
29091 v.reset(OpRsh64x64)
29092 v0 := b.NewValue0(v.Pos, OpConst64, t)
29093 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
29094 v.AddArg2(x, v0)
29095 return true
29096 }
29097
29098
29099 for {
29100 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29101 break
29102 }
29103 v.reset(OpConst64)
29104 v.AuxInt = int64ToAuxInt(0)
29105 return true
29106 }
29107
29108
29109
29110 for {
29111 if auxIntToBool(v.AuxInt) != false {
29112 break
29113 }
29114 x := v_0
29115 con := v_1
29116 if con.Op != OpConst16 {
29117 break
29118 }
29119 c := auxIntToInt16(con.AuxInt)
29120 if !(0 < c && c < 64) {
29121 break
29122 }
29123 v.reset(OpRsh64x16)
29124 v.AuxInt = boolToAuxInt(true)
29125 v.AddArg2(x, con)
29126 return true
29127 }
29128 return false
29129 }
29130 func rewriteValuegeneric_OpRsh64x32(v *Value) bool {
29131 v_1 := v.Args[1]
29132 v_0 := v.Args[0]
29133 b := v.Block
29134
29135
29136 for {
29137 t := v.Type
29138 x := v_0
29139 if v_1.Op != OpConst32 {
29140 break
29141 }
29142 c := auxIntToInt32(v_1.AuxInt)
29143 v.reset(OpRsh64x64)
29144 v0 := b.NewValue0(v.Pos, OpConst64, t)
29145 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
29146 v.AddArg2(x, v0)
29147 return true
29148 }
29149
29150
29151 for {
29152 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29153 break
29154 }
29155 v.reset(OpConst64)
29156 v.AuxInt = int64ToAuxInt(0)
29157 return true
29158 }
29159
29160
29161
29162 for {
29163 if auxIntToBool(v.AuxInt) != false {
29164 break
29165 }
29166 x := v_0
29167 con := v_1
29168 if con.Op != OpConst32 {
29169 break
29170 }
29171 c := auxIntToInt32(con.AuxInt)
29172 if !(0 < c && c < 64) {
29173 break
29174 }
29175 v.reset(OpRsh64x32)
29176 v.AuxInt = boolToAuxInt(true)
29177 v.AddArg2(x, con)
29178 return true
29179 }
29180 return false
29181 }
29182 func rewriteValuegeneric_OpRsh64x64(v *Value) bool {
29183 v_1 := v.Args[1]
29184 v_0 := v.Args[0]
29185 b := v.Block
29186 typ := &b.Func.Config.Types
29187
29188
29189 for {
29190 if v_0.Op != OpConst64 {
29191 break
29192 }
29193 c := auxIntToInt64(v_0.AuxInt)
29194 if v_1.Op != OpConst64 {
29195 break
29196 }
29197 d := auxIntToInt64(v_1.AuxInt)
29198 v.reset(OpConst64)
29199 v.AuxInt = int64ToAuxInt(c >> uint64(d))
29200 return true
29201 }
29202
29203
29204 for {
29205 x := v_0
29206 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
29207 break
29208 }
29209 v.copyOf(x)
29210 return true
29211 }
29212
29213
29214 for {
29215 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29216 break
29217 }
29218 v.reset(OpConst64)
29219 v.AuxInt = int64ToAuxInt(0)
29220 return true
29221 }
29222
29223
29224
29225 for {
29226 t := v.Type
29227 if v_0.Op != OpRsh64x64 {
29228 break
29229 }
29230 _ = v_0.Args[1]
29231 x := v_0.Args[0]
29232 v_0_1 := v_0.Args[1]
29233 if v_0_1.Op != OpConst64 {
29234 break
29235 }
29236 c := auxIntToInt64(v_0_1.AuxInt)
29237 if v_1.Op != OpConst64 {
29238 break
29239 }
29240 d := auxIntToInt64(v_1.AuxInt)
29241 if !(!uaddOvf(c, d)) {
29242 break
29243 }
29244 v.reset(OpRsh64x64)
29245 v0 := b.NewValue0(v.Pos, OpConst64, t)
29246 v0.AuxInt = int64ToAuxInt(c + d)
29247 v.AddArg2(x, v0)
29248 return true
29249 }
29250
29251
29252 for {
29253 if v_0.Op != OpLsh64x64 {
29254 break
29255 }
29256 _ = v_0.Args[1]
29257 x := v_0.Args[0]
29258 v_0_1 := v_0.Args[1]
29259 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 56 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 56 {
29260 break
29261 }
29262 v.reset(OpSignExt8to64)
29263 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.Int8)
29264 v0.AddArg(x)
29265 v.AddArg(v0)
29266 return true
29267 }
29268
29269
29270 for {
29271 if v_0.Op != OpLsh64x64 {
29272 break
29273 }
29274 _ = v_0.Args[1]
29275 x := v_0.Args[0]
29276 v_0_1 := v_0.Args[1]
29277 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 48 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 48 {
29278 break
29279 }
29280 v.reset(OpSignExt16to64)
29281 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.Int16)
29282 v0.AddArg(x)
29283 v.AddArg(v0)
29284 return true
29285 }
29286
29287
29288 for {
29289 if v_0.Op != OpLsh64x64 {
29290 break
29291 }
29292 _ = v_0.Args[1]
29293 x := v_0.Args[0]
29294 v_0_1 := v_0.Args[1]
29295 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 32 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 32 {
29296 break
29297 }
29298 v.reset(OpSignExt32to64)
29299 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.Int32)
29300 v0.AddArg(x)
29301 v.AddArg(v0)
29302 return true
29303 }
29304
29305
29306
29307 for {
29308 if auxIntToBool(v.AuxInt) != false {
29309 break
29310 }
29311 x := v_0
29312 con := v_1
29313 if con.Op != OpConst64 {
29314 break
29315 }
29316 c := auxIntToInt64(con.AuxInt)
29317 if !(0 < c && c < 64) {
29318 break
29319 }
29320 v.reset(OpRsh64x64)
29321 v.AuxInt = boolToAuxInt(true)
29322 v.AddArg2(x, con)
29323 return true
29324 }
29325 return false
29326 }
29327 func rewriteValuegeneric_OpRsh64x8(v *Value) bool {
29328 v_1 := v.Args[1]
29329 v_0 := v.Args[0]
29330 b := v.Block
29331
29332
29333 for {
29334 t := v.Type
29335 x := v_0
29336 if v_1.Op != OpConst8 {
29337 break
29338 }
29339 c := auxIntToInt8(v_1.AuxInt)
29340 v.reset(OpRsh64x64)
29341 v0 := b.NewValue0(v.Pos, OpConst64, t)
29342 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
29343 v.AddArg2(x, v0)
29344 return true
29345 }
29346
29347
29348 for {
29349 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29350 break
29351 }
29352 v.reset(OpConst64)
29353 v.AuxInt = int64ToAuxInt(0)
29354 return true
29355 }
29356
29357
29358
29359 for {
29360 if auxIntToBool(v.AuxInt) != false {
29361 break
29362 }
29363 x := v_0
29364 con := v_1
29365 if con.Op != OpConst8 {
29366 break
29367 }
29368 c := auxIntToInt8(con.AuxInt)
29369 if !(0 < c && c < 64) {
29370 break
29371 }
29372 v.reset(OpRsh64x8)
29373 v.AuxInt = boolToAuxInt(true)
29374 v.AddArg2(x, con)
29375 return true
29376 }
29377 return false
29378 }
29379 func rewriteValuegeneric_OpRsh8Ux16(v *Value) bool {
29380 v_1 := v.Args[1]
29381 v_0 := v.Args[0]
29382 b := v.Block
29383
29384
29385 for {
29386 t := v.Type
29387 x := v_0
29388 if v_1.Op != OpConst16 {
29389 break
29390 }
29391 c := auxIntToInt16(v_1.AuxInt)
29392 v.reset(OpRsh8Ux64)
29393 v0 := b.NewValue0(v.Pos, OpConst64, t)
29394 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
29395 v.AddArg2(x, v0)
29396 return true
29397 }
29398
29399
29400 for {
29401 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29402 break
29403 }
29404 v.reset(OpConst8)
29405 v.AuxInt = int8ToAuxInt(0)
29406 return true
29407 }
29408
29409
29410
29411 for {
29412 if auxIntToBool(v.AuxInt) != false {
29413 break
29414 }
29415 x := v_0
29416 con := v_1
29417 if con.Op != OpConst16 {
29418 break
29419 }
29420 c := auxIntToInt16(con.AuxInt)
29421 if !(0 < c && c < 8) {
29422 break
29423 }
29424 v.reset(OpRsh8Ux16)
29425 v.AuxInt = boolToAuxInt(true)
29426 v.AddArg2(x, con)
29427 return true
29428 }
29429 return false
29430 }
29431 func rewriteValuegeneric_OpRsh8Ux32(v *Value) bool {
29432 v_1 := v.Args[1]
29433 v_0 := v.Args[0]
29434 b := v.Block
29435
29436
29437 for {
29438 t := v.Type
29439 x := v_0
29440 if v_1.Op != OpConst32 {
29441 break
29442 }
29443 c := auxIntToInt32(v_1.AuxInt)
29444 v.reset(OpRsh8Ux64)
29445 v0 := b.NewValue0(v.Pos, OpConst64, t)
29446 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
29447 v.AddArg2(x, v0)
29448 return true
29449 }
29450
29451
29452 for {
29453 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29454 break
29455 }
29456 v.reset(OpConst8)
29457 v.AuxInt = int8ToAuxInt(0)
29458 return true
29459 }
29460
29461
29462
29463 for {
29464 if auxIntToBool(v.AuxInt) != false {
29465 break
29466 }
29467 x := v_0
29468 con := v_1
29469 if con.Op != OpConst32 {
29470 break
29471 }
29472 c := auxIntToInt32(con.AuxInt)
29473 if !(0 < c && c < 8) {
29474 break
29475 }
29476 v.reset(OpRsh8Ux32)
29477 v.AuxInt = boolToAuxInt(true)
29478 v.AddArg2(x, con)
29479 return true
29480 }
29481 return false
29482 }
29483 func rewriteValuegeneric_OpRsh8Ux64(v *Value) bool {
29484 v_1 := v.Args[1]
29485 v_0 := v.Args[0]
29486 b := v.Block
29487 typ := &b.Func.Config.Types
29488
29489
29490 for {
29491 if v_0.Op != OpConst8 {
29492 break
29493 }
29494 c := auxIntToInt8(v_0.AuxInt)
29495 if v_1.Op != OpConst64 {
29496 break
29497 }
29498 d := auxIntToInt64(v_1.AuxInt)
29499 v.reset(OpConst8)
29500 v.AuxInt = int8ToAuxInt(int8(uint8(c) >> uint64(d)))
29501 return true
29502 }
29503
29504
29505 for {
29506 x := v_0
29507 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
29508 break
29509 }
29510 v.copyOf(x)
29511 return true
29512 }
29513
29514
29515 for {
29516 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29517 break
29518 }
29519 v.reset(OpConst8)
29520 v.AuxInt = int8ToAuxInt(0)
29521 return true
29522 }
29523
29524
29525
29526 for {
29527 if v_1.Op != OpConst64 {
29528 break
29529 }
29530 c := auxIntToInt64(v_1.AuxInt)
29531 if !(uint64(c) >= 8) {
29532 break
29533 }
29534 v.reset(OpConst8)
29535 v.AuxInt = int8ToAuxInt(0)
29536 return true
29537 }
29538
29539
29540
29541 for {
29542 t := v.Type
29543 if v_0.Op != OpRsh8Ux64 {
29544 break
29545 }
29546 _ = v_0.Args[1]
29547 x := v_0.Args[0]
29548 v_0_1 := v_0.Args[1]
29549 if v_0_1.Op != OpConst64 {
29550 break
29551 }
29552 c := auxIntToInt64(v_0_1.AuxInt)
29553 if v_1.Op != OpConst64 {
29554 break
29555 }
29556 d := auxIntToInt64(v_1.AuxInt)
29557 if !(!uaddOvf(c, d)) {
29558 break
29559 }
29560 v.reset(OpRsh8Ux64)
29561 v0 := b.NewValue0(v.Pos, OpConst64, t)
29562 v0.AuxInt = int64ToAuxInt(c + d)
29563 v.AddArg2(x, v0)
29564 return true
29565 }
29566
29567
29568 for {
29569 if v_0.Op != OpRsh8x64 {
29570 break
29571 }
29572 x := v_0.Args[0]
29573 if v_1.Op != OpConst64 {
29574 break
29575 }
29576 t := v_1.Type
29577 if auxIntToInt64(v_1.AuxInt) != 7 {
29578 break
29579 }
29580 v.reset(OpRsh8Ux64)
29581 v0 := b.NewValue0(v.Pos, OpConst64, t)
29582 v0.AuxInt = int64ToAuxInt(7)
29583 v.AddArg2(x, v0)
29584 return true
29585 }
29586
29587
29588
29589 for {
29590 i := v_0
29591 if i.Op != OpLsh8x64 {
29592 break
29593 }
29594 _ = i.Args[1]
29595 x := i.Args[0]
29596 i_1 := i.Args[1]
29597 if i_1.Op != OpConst64 {
29598 break
29599 }
29600 c := auxIntToInt64(i_1.AuxInt)
29601 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
29602 break
29603 }
29604 v.reset(OpAnd8)
29605 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
29606 v0.AuxInt = int8ToAuxInt(int8(^uint8(0) >> c))
29607 v.AddArg2(x, v0)
29608 return true
29609 }
29610
29611
29612
29613 for {
29614 if v_0.Op != OpLsh8x64 {
29615 break
29616 }
29617 _ = v_0.Args[1]
29618 v_0_0 := v_0.Args[0]
29619 if v_0_0.Op != OpRsh8Ux64 {
29620 break
29621 }
29622 _ = v_0_0.Args[1]
29623 x := v_0_0.Args[0]
29624 v_0_0_1 := v_0_0.Args[1]
29625 if v_0_0_1.Op != OpConst64 {
29626 break
29627 }
29628 c1 := auxIntToInt64(v_0_0_1.AuxInt)
29629 v_0_1 := v_0.Args[1]
29630 if v_0_1.Op != OpConst64 {
29631 break
29632 }
29633 c2 := auxIntToInt64(v_0_1.AuxInt)
29634 if v_1.Op != OpConst64 {
29635 break
29636 }
29637 c3 := auxIntToInt64(v_1.AuxInt)
29638 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
29639 break
29640 }
29641 v.reset(OpRsh8Ux64)
29642 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
29643 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
29644 v.AddArg2(x, v0)
29645 return true
29646 }
29647
29648
29649
29650 for {
29651 if auxIntToBool(v.AuxInt) != false {
29652 break
29653 }
29654 x := v_0
29655 con := v_1
29656 if con.Op != OpConst64 {
29657 break
29658 }
29659 c := auxIntToInt64(con.AuxInt)
29660 if !(0 < c && c < 8) {
29661 break
29662 }
29663 v.reset(OpRsh8Ux64)
29664 v.AuxInt = boolToAuxInt(true)
29665 v.AddArg2(x, con)
29666 return true
29667 }
29668 return false
29669 }
29670 func rewriteValuegeneric_OpRsh8Ux8(v *Value) bool {
29671 v_1 := v.Args[1]
29672 v_0 := v.Args[0]
29673 b := v.Block
29674
29675
29676 for {
29677 t := v.Type
29678 x := v_0
29679 if v_1.Op != OpConst8 {
29680 break
29681 }
29682 c := auxIntToInt8(v_1.AuxInt)
29683 v.reset(OpRsh8Ux64)
29684 v0 := b.NewValue0(v.Pos, OpConst64, t)
29685 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
29686 v.AddArg2(x, v0)
29687 return true
29688 }
29689
29690
29691 for {
29692 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29693 break
29694 }
29695 v.reset(OpConst8)
29696 v.AuxInt = int8ToAuxInt(0)
29697 return true
29698 }
29699
29700
29701
29702 for {
29703 if auxIntToBool(v.AuxInt) != false {
29704 break
29705 }
29706 x := v_0
29707 con := v_1
29708 if con.Op != OpConst8 {
29709 break
29710 }
29711 c := auxIntToInt8(con.AuxInt)
29712 if !(0 < c && c < 8) {
29713 break
29714 }
29715 v.reset(OpRsh8Ux8)
29716 v.AuxInt = boolToAuxInt(true)
29717 v.AddArg2(x, con)
29718 return true
29719 }
29720 return false
29721 }
29722 func rewriteValuegeneric_OpRsh8x16(v *Value) bool {
29723 v_1 := v.Args[1]
29724 v_0 := v.Args[0]
29725 b := v.Block
29726
29727
29728 for {
29729 t := v.Type
29730 x := v_0
29731 if v_1.Op != OpConst16 {
29732 break
29733 }
29734 c := auxIntToInt16(v_1.AuxInt)
29735 v.reset(OpRsh8x64)
29736 v0 := b.NewValue0(v.Pos, OpConst64, t)
29737 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
29738 v.AddArg2(x, v0)
29739 return true
29740 }
29741
29742
29743 for {
29744 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29745 break
29746 }
29747 v.reset(OpConst8)
29748 v.AuxInt = int8ToAuxInt(0)
29749 return true
29750 }
29751
29752
29753
29754 for {
29755 if auxIntToBool(v.AuxInt) != false {
29756 break
29757 }
29758 x := v_0
29759 con := v_1
29760 if con.Op != OpConst16 {
29761 break
29762 }
29763 c := auxIntToInt16(con.AuxInt)
29764 if !(0 < c && c < 8) {
29765 break
29766 }
29767 v.reset(OpRsh8x16)
29768 v.AuxInt = boolToAuxInt(true)
29769 v.AddArg2(x, con)
29770 return true
29771 }
29772 return false
29773 }
29774 func rewriteValuegeneric_OpRsh8x32(v *Value) bool {
29775 v_1 := v.Args[1]
29776 v_0 := v.Args[0]
29777 b := v.Block
29778
29779
29780 for {
29781 t := v.Type
29782 x := v_0
29783 if v_1.Op != OpConst32 {
29784 break
29785 }
29786 c := auxIntToInt32(v_1.AuxInt)
29787 v.reset(OpRsh8x64)
29788 v0 := b.NewValue0(v.Pos, OpConst64, t)
29789 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
29790 v.AddArg2(x, v0)
29791 return true
29792 }
29793
29794
29795 for {
29796 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29797 break
29798 }
29799 v.reset(OpConst8)
29800 v.AuxInt = int8ToAuxInt(0)
29801 return true
29802 }
29803
29804
29805
29806 for {
29807 if auxIntToBool(v.AuxInt) != false {
29808 break
29809 }
29810 x := v_0
29811 con := v_1
29812 if con.Op != OpConst32 {
29813 break
29814 }
29815 c := auxIntToInt32(con.AuxInt)
29816 if !(0 < c && c < 8) {
29817 break
29818 }
29819 v.reset(OpRsh8x32)
29820 v.AuxInt = boolToAuxInt(true)
29821 v.AddArg2(x, con)
29822 return true
29823 }
29824 return false
29825 }
29826 func rewriteValuegeneric_OpRsh8x64(v *Value) bool {
29827 v_1 := v.Args[1]
29828 v_0 := v.Args[0]
29829 b := v.Block
29830
29831
29832 for {
29833 if v_0.Op != OpConst8 {
29834 break
29835 }
29836 c := auxIntToInt8(v_0.AuxInt)
29837 if v_1.Op != OpConst64 {
29838 break
29839 }
29840 d := auxIntToInt64(v_1.AuxInt)
29841 v.reset(OpConst8)
29842 v.AuxInt = int8ToAuxInt(c >> uint64(d))
29843 return true
29844 }
29845
29846
29847 for {
29848 x := v_0
29849 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
29850 break
29851 }
29852 v.copyOf(x)
29853 return true
29854 }
29855
29856
29857 for {
29858 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29859 break
29860 }
29861 v.reset(OpConst8)
29862 v.AuxInt = int8ToAuxInt(0)
29863 return true
29864 }
29865
29866
29867
29868 for {
29869 t := v.Type
29870 if v_0.Op != OpRsh8x64 {
29871 break
29872 }
29873 _ = v_0.Args[1]
29874 x := v_0.Args[0]
29875 v_0_1 := v_0.Args[1]
29876 if v_0_1.Op != OpConst64 {
29877 break
29878 }
29879 c := auxIntToInt64(v_0_1.AuxInt)
29880 if v_1.Op != OpConst64 {
29881 break
29882 }
29883 d := auxIntToInt64(v_1.AuxInt)
29884 if !(!uaddOvf(c, d)) {
29885 break
29886 }
29887 v.reset(OpRsh8x64)
29888 v0 := b.NewValue0(v.Pos, OpConst64, t)
29889 v0.AuxInt = int64ToAuxInt(c + d)
29890 v.AddArg2(x, v0)
29891 return true
29892 }
29893
29894
29895
29896 for {
29897 if auxIntToBool(v.AuxInt) != false {
29898 break
29899 }
29900 x := v_0
29901 con := v_1
29902 if con.Op != OpConst64 {
29903 break
29904 }
29905 c := auxIntToInt64(con.AuxInt)
29906 if !(0 < c && c < 8) {
29907 break
29908 }
29909 v.reset(OpRsh8x64)
29910 v.AuxInt = boolToAuxInt(true)
29911 v.AddArg2(x, con)
29912 return true
29913 }
29914 return false
29915 }
29916 func rewriteValuegeneric_OpRsh8x8(v *Value) bool {
29917 v_1 := v.Args[1]
29918 v_0 := v.Args[0]
29919 b := v.Block
29920
29921
29922 for {
29923 t := v.Type
29924 x := v_0
29925 if v_1.Op != OpConst8 {
29926 break
29927 }
29928 c := auxIntToInt8(v_1.AuxInt)
29929 v.reset(OpRsh8x64)
29930 v0 := b.NewValue0(v.Pos, OpConst64, t)
29931 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
29932 v.AddArg2(x, v0)
29933 return true
29934 }
29935
29936
29937 for {
29938 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29939 break
29940 }
29941 v.reset(OpConst8)
29942 v.AuxInt = int8ToAuxInt(0)
29943 return true
29944 }
29945
29946
29947
29948 for {
29949 if auxIntToBool(v.AuxInt) != false {
29950 break
29951 }
29952 x := v_0
29953 con := v_1
29954 if con.Op != OpConst8 {
29955 break
29956 }
29957 c := auxIntToInt8(con.AuxInt)
29958 if !(0 < c && c < 8) {
29959 break
29960 }
29961 v.reset(OpRsh8x8)
29962 v.AuxInt = boolToAuxInt(true)
29963 v.AddArg2(x, con)
29964 return true
29965 }
29966 return false
29967 }
29968 func rewriteValuegeneric_OpSelect0(v *Value) bool {
29969 v_0 := v.Args[0]
29970
29971
29972
29973 for {
29974 a := v_0
29975 if a.Op != OpAdd64carry {
29976 break
29977 }
29978 _ = a.Args[2]
29979 x := a.Args[0]
29980 y := a.Args[1]
29981 a_2 := a.Args[2]
29982 if a_2.Op != OpConst64 || auxIntToInt64(a_2.AuxInt) != 0 || !(a.Uses == 1) {
29983 break
29984 }
29985 v.reset(OpAdd64)
29986 v.AddArg2(x, y)
29987 return true
29988 }
29989
29990
29991 for {
29992 if v_0.Op != OpMakeTuple {
29993 break
29994 }
29995 x := v_0.Args[0]
29996 v.copyOf(x)
29997 return true
29998 }
29999 return false
30000 }
30001 func rewriteValuegeneric_OpSelect1(v *Value) bool {
30002 v_0 := v.Args[0]
30003
30004
30005 for {
30006 if v_0.Op != OpMakeTuple {
30007 break
30008 }
30009 y := v_0.Args[1]
30010 v.copyOf(y)
30011 return true
30012 }
30013 return false
30014 }
30015 func rewriteValuegeneric_OpSelectN(v *Value) bool {
30016 v_0 := v.Args[0]
30017 b := v.Block
30018 config := b.Func.Config
30019 typ := &b.Func.Config.Types
30020
30021
30022 for {
30023 n := auxIntToInt64(v.AuxInt)
30024 m := v_0
30025 if m.Op != OpMakeResult {
30026 break
30027 }
30028 v.copyOf(m.Args[n])
30029 return true
30030 }
30031
30032
30033
30034 for {
30035 if auxIntToInt64(v.AuxInt) != 0 {
30036 break
30037 }
30038 call := v_0
30039 if call.Op != OpStaticCall || len(call.Args) != 3 {
30040 break
30041 }
30042 sym := auxToCall(call.Aux)
30043 mem := call.Args[2]
30044 sptr := call.Args[0]
30045 call_1 := call.Args[1]
30046 if call_1.Op != OpConst64 {
30047 break
30048 }
30049 c := auxIntToInt64(call_1.AuxInt)
30050 if !(isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)) {
30051 break
30052 }
30053 v.reset(OpZero)
30054 v.AuxInt = int64ToAuxInt(int64(c))
30055 v.Aux = typeToAux(types.Types[types.TUINT8])
30056 v.AddArg2(sptr, mem)
30057 return true
30058 }
30059
30060
30061
30062 for {
30063 if auxIntToInt64(v.AuxInt) != 0 {
30064 break
30065 }
30066 call := v_0
30067 if call.Op != OpStaticCall || len(call.Args) != 3 {
30068 break
30069 }
30070 sym := auxToCall(call.Aux)
30071 mem := call.Args[2]
30072 sptr := call.Args[0]
30073 call_1 := call.Args[1]
30074 if call_1.Op != OpConst32 {
30075 break
30076 }
30077 c := auxIntToInt32(call_1.AuxInt)
30078 if !(isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)) {
30079 break
30080 }
30081 v.reset(OpZero)
30082 v.AuxInt = int64ToAuxInt(int64(c))
30083 v.Aux = typeToAux(types.Types[types.TUINT8])
30084 v.AddArg2(sptr, mem)
30085 return true
30086 }
30087
30088
30089
30090 for {
30091 if auxIntToInt64(v.AuxInt) != 0 {
30092 break
30093 }
30094 call := v_0
30095 if call.Op != OpStaticCall || len(call.Args) != 1 {
30096 break
30097 }
30098 sym := auxToCall(call.Aux)
30099 s1 := call.Args[0]
30100 if s1.Op != OpStore {
30101 break
30102 }
30103 _ = s1.Args[2]
30104 s1_1 := s1.Args[1]
30105 if s1_1.Op != OpConst64 {
30106 break
30107 }
30108 sz := auxIntToInt64(s1_1.AuxInt)
30109 s2 := s1.Args[2]
30110 if s2.Op != OpStore {
30111 break
30112 }
30113 _ = s2.Args[2]
30114 src := s2.Args[1]
30115 s3 := s2.Args[2]
30116 if s3.Op != OpStore {
30117 break
30118 }
30119 mem := s3.Args[2]
30120 dst := s3.Args[1]
30121 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)) {
30122 break
30123 }
30124 v.reset(OpMove)
30125 v.AuxInt = int64ToAuxInt(int64(sz))
30126 v.Aux = typeToAux(types.Types[types.TUINT8])
30127 v.AddArg3(dst, src, mem)
30128 return true
30129 }
30130
30131
30132
30133 for {
30134 if auxIntToInt64(v.AuxInt) != 0 {
30135 break
30136 }
30137 call := v_0
30138 if call.Op != OpStaticCall || len(call.Args) != 1 {
30139 break
30140 }
30141 sym := auxToCall(call.Aux)
30142 s1 := call.Args[0]
30143 if s1.Op != OpStore {
30144 break
30145 }
30146 _ = s1.Args[2]
30147 s1_1 := s1.Args[1]
30148 if s1_1.Op != OpConst32 {
30149 break
30150 }
30151 sz := auxIntToInt32(s1_1.AuxInt)
30152 s2 := s1.Args[2]
30153 if s2.Op != OpStore {
30154 break
30155 }
30156 _ = s2.Args[2]
30157 src := s2.Args[1]
30158 s3 := s2.Args[2]
30159 if s3.Op != OpStore {
30160 break
30161 }
30162 mem := s3.Args[2]
30163 dst := s3.Args[1]
30164 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)) {
30165 break
30166 }
30167 v.reset(OpMove)
30168 v.AuxInt = int64ToAuxInt(int64(sz))
30169 v.Aux = typeToAux(types.Types[types.TUINT8])
30170 v.AddArg3(dst, src, mem)
30171 return true
30172 }
30173
30174
30175
30176 for {
30177 if auxIntToInt64(v.AuxInt) != 0 {
30178 break
30179 }
30180 call := v_0
30181 if call.Op != OpStaticCall || len(call.Args) != 4 {
30182 break
30183 }
30184 sym := auxToCall(call.Aux)
30185 mem := call.Args[3]
30186 dst := call.Args[0]
30187 src := call.Args[1]
30188 call_2 := call.Args[2]
30189 if call_2.Op != OpConst64 {
30190 break
30191 }
30192 sz := auxIntToInt64(call_2.AuxInt)
30193 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
30194 break
30195 }
30196 v.reset(OpMove)
30197 v.AuxInt = int64ToAuxInt(int64(sz))
30198 v.Aux = typeToAux(types.Types[types.TUINT8])
30199 v.AddArg3(dst, src, mem)
30200 return true
30201 }
30202
30203
30204
30205 for {
30206 if auxIntToInt64(v.AuxInt) != 0 {
30207 break
30208 }
30209 call := v_0
30210 if call.Op != OpStaticCall || len(call.Args) != 4 {
30211 break
30212 }
30213 sym := auxToCall(call.Aux)
30214 mem := call.Args[3]
30215 dst := call.Args[0]
30216 src := call.Args[1]
30217 call_2 := call.Args[2]
30218 if call_2.Op != OpConst32 {
30219 break
30220 }
30221 sz := auxIntToInt32(call_2.AuxInt)
30222 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
30223 break
30224 }
30225 v.reset(OpMove)
30226 v.AuxInt = int64ToAuxInt(int64(sz))
30227 v.Aux = typeToAux(types.Types[types.TUINT8])
30228 v.AddArg3(dst, src, mem)
30229 return true
30230 }
30231
30232
30233
30234 for {
30235 if auxIntToInt64(v.AuxInt) != 0 {
30236 break
30237 }
30238 call := v_0
30239 if call.Op != OpStaticLECall || len(call.Args) != 4 {
30240 break
30241 }
30242 sym := auxToCall(call.Aux)
30243 mem := call.Args[3]
30244 dst := call.Args[0]
30245 src := call.Args[1]
30246 call_2 := call.Args[2]
30247 if call_2.Op != OpConst64 {
30248 break
30249 }
30250 sz := auxIntToInt64(call_2.AuxInt)
30251 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
30252 break
30253 }
30254 v.reset(OpMove)
30255 v.AuxInt = int64ToAuxInt(int64(sz))
30256 v.Aux = typeToAux(types.Types[types.TUINT8])
30257 v.AddArg3(dst, src, mem)
30258 return true
30259 }
30260
30261
30262
30263 for {
30264 if auxIntToInt64(v.AuxInt) != 0 {
30265 break
30266 }
30267 call := v_0
30268 if call.Op != OpStaticLECall || len(call.Args) != 4 {
30269 break
30270 }
30271 sym := auxToCall(call.Aux)
30272 mem := call.Args[3]
30273 dst := call.Args[0]
30274 src := call.Args[1]
30275 call_2 := call.Args[2]
30276 if call_2.Op != OpConst32 {
30277 break
30278 }
30279 sz := auxIntToInt32(call_2.AuxInt)
30280 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
30281 break
30282 }
30283 v.reset(OpMove)
30284 v.AuxInt = int64ToAuxInt(int64(sz))
30285 v.Aux = typeToAux(types.Types[types.TUINT8])
30286 v.AddArg3(dst, src, mem)
30287 return true
30288 }
30289
30290
30291
30292 for {
30293 if auxIntToInt64(v.AuxInt) != 0 {
30294 break
30295 }
30296 call := v_0
30297 if call.Op != OpStaticLECall || len(call.Args) != 2 {
30298 break
30299 }
30300 sym := auxToCall(call.Aux)
30301 x := call.Args[1]
30302 if !(needRaceCleanup(sym, call) && clobber(call)) {
30303 break
30304 }
30305 v.copyOf(x)
30306 return true
30307 }
30308
30309
30310
30311 for {
30312 if auxIntToInt64(v.AuxInt) != 0 {
30313 break
30314 }
30315 call := v_0
30316 if call.Op != OpStaticLECall || len(call.Args) != 1 {
30317 break
30318 }
30319 sym := auxToCall(call.Aux)
30320 x := call.Args[0]
30321 if !(needRaceCleanup(sym, call) && clobber(call)) {
30322 break
30323 }
30324 v.copyOf(x)
30325 return true
30326 }
30327
30328
30329
30330 for {
30331 if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpStaticCall || len(v_0.Args) != 6 {
30332 break
30333 }
30334 sym := auxToCall(v_0.Aux)
30335 _ = v_0.Args[1]
30336 newLen := v_0.Args[1]
30337 if newLen.Op != OpConst64 || !(v.Type.IsInteger() && (isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias"))) {
30338 break
30339 }
30340 v.copyOf(newLen)
30341 return true
30342 }
30343
30344
30345
30346 for {
30347 if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpStaticCall || len(v_0.Args) != 6 {
30348 break
30349 }
30350 sym := auxToCall(v_0.Aux)
30351 _ = v_0.Args[1]
30352 newLen := v_0.Args[1]
30353 if newLen.Op != OpConst32 || !(v.Type.IsInteger() && (isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias"))) {
30354 break
30355 }
30356 v.copyOf(newLen)
30357 return true
30358 }
30359
30360
30361
30362 for {
30363 if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpStaticLECall || len(v_0.Args) != 3 {
30364 break
30365 }
30366 f := auxToCall(v_0.Aux)
30367 _ = v_0.Args[2]
30368 x := v_0.Args[0]
30369 y := v_0.Args[1]
30370 v_0_2 := v_0.Args[2]
30371 if v_0_2.Op != OpSelectN || auxIntToInt64(v_0_2.AuxInt) != 1 {
30372 break
30373 }
30374 c := v_0_2.Args[0]
30375 if c.Op != OpStaticLECall || len(c.Args) != 3 {
30376 break
30377 }
30378 g := auxToCall(c.Aux)
30379 if x != c.Args[0] || y != c.Args[1] || !(isSameCall(f, "runtime.cmpstring") && isSameCall(g, "runtime.cmpstring")) {
30380 break
30381 }
30382 b = c.Block
30383 v0 := b.NewValue0(v.Pos, OpSelectN, typ.Int)
30384 v.copyOf(v0)
30385 v0.AuxInt = int64ToAuxInt(0)
30386 v0.AddArg(c)
30387 return true
30388 }
30389
30390
30391
30392 for {
30393 if auxIntToInt64(v.AuxInt) != 1 {
30394 break
30395 }
30396 c := v_0
30397 if c.Op != OpStaticLECall || len(c.Args) != 3 {
30398 break
30399 }
30400 f := auxToCall(c.Aux)
30401 mem := c.Args[2]
30402 if !(c.Uses == 1 && isSameCall(f, "runtime.cmpstring") && clobber(c)) {
30403 break
30404 }
30405 v.copyOf(mem)
30406 return true
30407 }
30408 return false
30409 }
30410 func rewriteValuegeneric_OpSignExt16to32(v *Value) bool {
30411 v_0 := v.Args[0]
30412
30413
30414 for {
30415 if v_0.Op != OpConst16 {
30416 break
30417 }
30418 c := auxIntToInt16(v_0.AuxInt)
30419 v.reset(OpConst32)
30420 v.AuxInt = int32ToAuxInt(int32(c))
30421 return true
30422 }
30423
30424
30425
30426 for {
30427 if v_0.Op != OpTrunc32to16 {
30428 break
30429 }
30430 x := v_0.Args[0]
30431 if x.Op != OpRsh32x64 {
30432 break
30433 }
30434 _ = x.Args[1]
30435 x_1 := x.Args[1]
30436 if x_1.Op != OpConst64 {
30437 break
30438 }
30439 s := auxIntToInt64(x_1.AuxInt)
30440 if !(s >= 16) {
30441 break
30442 }
30443 v.copyOf(x)
30444 return true
30445 }
30446 return false
30447 }
30448 func rewriteValuegeneric_OpSignExt16to64(v *Value) bool {
30449 v_0 := v.Args[0]
30450
30451
30452 for {
30453 if v_0.Op != OpConst16 {
30454 break
30455 }
30456 c := auxIntToInt16(v_0.AuxInt)
30457 v.reset(OpConst64)
30458 v.AuxInt = int64ToAuxInt(int64(c))
30459 return true
30460 }
30461
30462
30463
30464 for {
30465 if v_0.Op != OpTrunc64to16 {
30466 break
30467 }
30468 x := v_0.Args[0]
30469 if x.Op != OpRsh64x64 {
30470 break
30471 }
30472 _ = x.Args[1]
30473 x_1 := x.Args[1]
30474 if x_1.Op != OpConst64 {
30475 break
30476 }
30477 s := auxIntToInt64(x_1.AuxInt)
30478 if !(s >= 48) {
30479 break
30480 }
30481 v.copyOf(x)
30482 return true
30483 }
30484 return false
30485 }
30486 func rewriteValuegeneric_OpSignExt32to64(v *Value) bool {
30487 v_0 := v.Args[0]
30488
30489
30490 for {
30491 if v_0.Op != OpConst32 {
30492 break
30493 }
30494 c := auxIntToInt32(v_0.AuxInt)
30495 v.reset(OpConst64)
30496 v.AuxInt = int64ToAuxInt(int64(c))
30497 return true
30498 }
30499
30500
30501
30502 for {
30503 if v_0.Op != OpTrunc64to32 {
30504 break
30505 }
30506 x := v_0.Args[0]
30507 if x.Op != OpRsh64x64 {
30508 break
30509 }
30510 _ = x.Args[1]
30511 x_1 := x.Args[1]
30512 if x_1.Op != OpConst64 {
30513 break
30514 }
30515 s := auxIntToInt64(x_1.AuxInt)
30516 if !(s >= 32) {
30517 break
30518 }
30519 v.copyOf(x)
30520 return true
30521 }
30522 return false
30523 }
30524 func rewriteValuegeneric_OpSignExt8to16(v *Value) bool {
30525 v_0 := v.Args[0]
30526
30527
30528 for {
30529 if v_0.Op != OpConst8 {
30530 break
30531 }
30532 c := auxIntToInt8(v_0.AuxInt)
30533 v.reset(OpConst16)
30534 v.AuxInt = int16ToAuxInt(int16(c))
30535 return true
30536 }
30537
30538
30539
30540 for {
30541 if v_0.Op != OpTrunc16to8 {
30542 break
30543 }
30544 x := v_0.Args[0]
30545 if x.Op != OpRsh16x64 {
30546 break
30547 }
30548 _ = x.Args[1]
30549 x_1 := x.Args[1]
30550 if x_1.Op != OpConst64 {
30551 break
30552 }
30553 s := auxIntToInt64(x_1.AuxInt)
30554 if !(s >= 8) {
30555 break
30556 }
30557 v.copyOf(x)
30558 return true
30559 }
30560 return false
30561 }
30562 func rewriteValuegeneric_OpSignExt8to32(v *Value) bool {
30563 v_0 := v.Args[0]
30564
30565
30566 for {
30567 if v_0.Op != OpConst8 {
30568 break
30569 }
30570 c := auxIntToInt8(v_0.AuxInt)
30571 v.reset(OpConst32)
30572 v.AuxInt = int32ToAuxInt(int32(c))
30573 return true
30574 }
30575
30576
30577
30578 for {
30579 if v_0.Op != OpTrunc32to8 {
30580 break
30581 }
30582 x := v_0.Args[0]
30583 if x.Op != OpRsh32x64 {
30584 break
30585 }
30586 _ = x.Args[1]
30587 x_1 := x.Args[1]
30588 if x_1.Op != OpConst64 {
30589 break
30590 }
30591 s := auxIntToInt64(x_1.AuxInt)
30592 if !(s >= 24) {
30593 break
30594 }
30595 v.copyOf(x)
30596 return true
30597 }
30598 return false
30599 }
30600 func rewriteValuegeneric_OpSignExt8to64(v *Value) bool {
30601 v_0 := v.Args[0]
30602
30603
30604 for {
30605 if v_0.Op != OpConst8 {
30606 break
30607 }
30608 c := auxIntToInt8(v_0.AuxInt)
30609 v.reset(OpConst64)
30610 v.AuxInt = int64ToAuxInt(int64(c))
30611 return true
30612 }
30613
30614
30615
30616 for {
30617 if v_0.Op != OpTrunc64to8 {
30618 break
30619 }
30620 x := v_0.Args[0]
30621 if x.Op != OpRsh64x64 {
30622 break
30623 }
30624 _ = x.Args[1]
30625 x_1 := x.Args[1]
30626 if x_1.Op != OpConst64 {
30627 break
30628 }
30629 s := auxIntToInt64(x_1.AuxInt)
30630 if !(s >= 56) {
30631 break
30632 }
30633 v.copyOf(x)
30634 return true
30635 }
30636 return false
30637 }
30638 func rewriteValuegeneric_OpSliceCap(v *Value) bool {
30639 v_0 := v.Args[0]
30640
30641
30642 for {
30643 if v_0.Op != OpSliceMake {
30644 break
30645 }
30646 _ = v_0.Args[2]
30647 v_0_2 := v_0.Args[2]
30648 if v_0_2.Op != OpConst64 {
30649 break
30650 }
30651 t := v_0_2.Type
30652 c := auxIntToInt64(v_0_2.AuxInt)
30653 v.reset(OpConst64)
30654 v.Type = t
30655 v.AuxInt = int64ToAuxInt(c)
30656 return true
30657 }
30658
30659
30660 for {
30661 if v_0.Op != OpSliceMake {
30662 break
30663 }
30664 _ = v_0.Args[2]
30665 v_0_2 := v_0.Args[2]
30666 if v_0_2.Op != OpConst32 {
30667 break
30668 }
30669 t := v_0_2.Type
30670 c := auxIntToInt32(v_0_2.AuxInt)
30671 v.reset(OpConst32)
30672 v.Type = t
30673 v.AuxInt = int32ToAuxInt(c)
30674 return true
30675 }
30676
30677
30678 for {
30679 if v_0.Op != OpSliceMake {
30680 break
30681 }
30682 _ = v_0.Args[2]
30683 v_0_2 := v_0.Args[2]
30684 if v_0_2.Op != OpSliceCap {
30685 break
30686 }
30687 x := v_0_2.Args[0]
30688 v.reset(OpSliceCap)
30689 v.AddArg(x)
30690 return true
30691 }
30692
30693
30694 for {
30695 if v_0.Op != OpSliceMake {
30696 break
30697 }
30698 _ = v_0.Args[2]
30699 v_0_2 := v_0.Args[2]
30700 if v_0_2.Op != OpSliceLen {
30701 break
30702 }
30703 x := v_0_2.Args[0]
30704 v.reset(OpSliceLen)
30705 v.AddArg(x)
30706 return true
30707 }
30708 return false
30709 }
30710 func rewriteValuegeneric_OpSliceLen(v *Value) bool {
30711 v_0 := v.Args[0]
30712
30713
30714 for {
30715 if v_0.Op != OpSliceMake {
30716 break
30717 }
30718 _ = v_0.Args[1]
30719 v_0_1 := v_0.Args[1]
30720 if v_0_1.Op != OpConst64 {
30721 break
30722 }
30723 t := v_0_1.Type
30724 c := auxIntToInt64(v_0_1.AuxInt)
30725 v.reset(OpConst64)
30726 v.Type = t
30727 v.AuxInt = int64ToAuxInt(c)
30728 return true
30729 }
30730
30731
30732 for {
30733 if v_0.Op != OpSliceMake {
30734 break
30735 }
30736 _ = v_0.Args[1]
30737 v_0_1 := v_0.Args[1]
30738 if v_0_1.Op != OpConst32 {
30739 break
30740 }
30741 t := v_0_1.Type
30742 c := auxIntToInt32(v_0_1.AuxInt)
30743 v.reset(OpConst32)
30744 v.Type = t
30745 v.AuxInt = int32ToAuxInt(c)
30746 return true
30747 }
30748
30749
30750 for {
30751 if v_0.Op != OpSliceMake {
30752 break
30753 }
30754 _ = v_0.Args[1]
30755 v_0_1 := v_0.Args[1]
30756 if v_0_1.Op != OpSliceLen {
30757 break
30758 }
30759 x := v_0_1.Args[0]
30760 v.reset(OpSliceLen)
30761 v.AddArg(x)
30762 return true
30763 }
30764
30765
30766
30767 for {
30768 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
30769 break
30770 }
30771 v_0_0 := v_0.Args[0]
30772 if v_0_0.Op != OpStaticLECall || len(v_0_0.Args) != 6 {
30773 break
30774 }
30775 sym := auxToCall(v_0_0.Aux)
30776 _ = v_0_0.Args[1]
30777 newLen := v_0_0.Args[1]
30778 if newLen.Op != OpConst64 || !(isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias")) {
30779 break
30780 }
30781 v.copyOf(newLen)
30782 return true
30783 }
30784
30785
30786
30787 for {
30788 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
30789 break
30790 }
30791 v_0_0 := v_0.Args[0]
30792 if v_0_0.Op != OpStaticLECall || len(v_0_0.Args) != 6 {
30793 break
30794 }
30795 sym := auxToCall(v_0_0.Aux)
30796 _ = v_0_0.Args[1]
30797 newLen := v_0_0.Args[1]
30798 if newLen.Op != OpConst32 || !(isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias")) {
30799 break
30800 }
30801 v.copyOf(newLen)
30802 return true
30803 }
30804 return false
30805 }
30806 func rewriteValuegeneric_OpSliceMake(v *Value) bool {
30807 v_2 := v.Args[2]
30808 v_1 := v.Args[1]
30809 v_0 := v.Args[0]
30810 b := v.Block
30811
30812
30813
30814 for {
30815 if v_0.Op != OpAddPtr {
30816 break
30817 }
30818 t := v_0.Type
30819 _ = v_0.Args[1]
30820 x := v_0.Args[0]
30821 v_0_1 := v_0.Args[1]
30822 if v_0_1.Op != OpAnd64 {
30823 break
30824 }
30825 _ = v_0_1.Args[1]
30826 v_0_1_0 := v_0_1.Args[0]
30827 v_0_1_1 := v_0_1.Args[1]
30828 for _i0 := 0; _i0 <= 1; _i0, v_0_1_0, v_0_1_1 = _i0+1, v_0_1_1, v_0_1_0 {
30829 y := v_0_1_0
30830 if v_0_1_1.Op != OpSlicemask {
30831 continue
30832 }
30833 w := v_1
30834 if w.Op != OpConst64 {
30835 continue
30836 }
30837 c := auxIntToInt64(w.AuxInt)
30838 z := v_2
30839 if !(c > 0) {
30840 continue
30841 }
30842 v.reset(OpSliceMake)
30843 v0 := b.NewValue0(v.Pos, OpAddPtr, t)
30844 v0.AddArg2(x, y)
30845 v.AddArg3(v0, w, z)
30846 return true
30847 }
30848 break
30849 }
30850
30851
30852
30853 for {
30854 if v_0.Op != OpAddPtr {
30855 break
30856 }
30857 t := v_0.Type
30858 _ = v_0.Args[1]
30859 x := v_0.Args[0]
30860 v_0_1 := v_0.Args[1]
30861 if v_0_1.Op != OpAnd32 {
30862 break
30863 }
30864 _ = v_0_1.Args[1]
30865 v_0_1_0 := v_0_1.Args[0]
30866 v_0_1_1 := v_0_1.Args[1]
30867 for _i0 := 0; _i0 <= 1; _i0, v_0_1_0, v_0_1_1 = _i0+1, v_0_1_1, v_0_1_0 {
30868 y := v_0_1_0
30869 if v_0_1_1.Op != OpSlicemask {
30870 continue
30871 }
30872 w := v_1
30873 if w.Op != OpConst32 {
30874 continue
30875 }
30876 c := auxIntToInt32(w.AuxInt)
30877 z := v_2
30878 if !(c > 0) {
30879 continue
30880 }
30881 v.reset(OpSliceMake)
30882 v0 := b.NewValue0(v.Pos, OpAddPtr, t)
30883 v0.AddArg2(x, y)
30884 v.AddArg3(v0, w, z)
30885 return true
30886 }
30887 break
30888 }
30889 return false
30890 }
30891 func rewriteValuegeneric_OpSlicePtr(v *Value) bool {
30892 v_0 := v.Args[0]
30893
30894
30895 for {
30896 if v_0.Op != OpSliceMake {
30897 break
30898 }
30899 v_0_0 := v_0.Args[0]
30900 if v_0_0.Op != OpSlicePtr {
30901 break
30902 }
30903 x := v_0_0.Args[0]
30904 v.reset(OpSlicePtr)
30905 v.AddArg(x)
30906 return true
30907 }
30908 return false
30909 }
30910 func rewriteValuegeneric_OpSlicemask(v *Value) bool {
30911 v_0 := v.Args[0]
30912
30913
30914
30915 for {
30916 if v_0.Op != OpConst32 {
30917 break
30918 }
30919 x := auxIntToInt32(v_0.AuxInt)
30920 if !(x > 0) {
30921 break
30922 }
30923 v.reset(OpConst32)
30924 v.AuxInt = int32ToAuxInt(-1)
30925 return true
30926 }
30927
30928
30929 for {
30930 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
30931 break
30932 }
30933 v.reset(OpConst32)
30934 v.AuxInt = int32ToAuxInt(0)
30935 return true
30936 }
30937
30938
30939
30940 for {
30941 if v_0.Op != OpConst64 {
30942 break
30943 }
30944 x := auxIntToInt64(v_0.AuxInt)
30945 if !(x > 0) {
30946 break
30947 }
30948 v.reset(OpConst64)
30949 v.AuxInt = int64ToAuxInt(-1)
30950 return true
30951 }
30952
30953
30954 for {
30955 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
30956 break
30957 }
30958 v.reset(OpConst64)
30959 v.AuxInt = int64ToAuxInt(0)
30960 return true
30961 }
30962 return false
30963 }
30964 func rewriteValuegeneric_OpSqrt(v *Value) bool {
30965 v_0 := v.Args[0]
30966
30967
30968
30969 for {
30970 if v_0.Op != OpConst64F {
30971 break
30972 }
30973 c := auxIntToFloat64(v_0.AuxInt)
30974 if !(!math.IsNaN(math.Sqrt(c))) {
30975 break
30976 }
30977 v.reset(OpConst64F)
30978 v.AuxInt = float64ToAuxInt(math.Sqrt(c))
30979 return true
30980 }
30981 return false
30982 }
30983 func rewriteValuegeneric_OpStaticCall(v *Value) bool {
30984 b := v.Block
30985 typ := &b.Func.Config.Types
30986
30987
30988
30989 for {
30990 if len(v.Args) != 4 {
30991 break
30992 }
30993 callAux := auxToCall(v.Aux)
30994 mem := v.Args[3]
30995 p := v.Args[0]
30996 q := v.Args[1]
30997 if !(isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)) {
30998 break
30999 }
31000 v.reset(OpMakeResult)
31001 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
31002 v0.AuxInt = boolToAuxInt(true)
31003 v.AddArg2(v0, mem)
31004 return true
31005 }
31006 return false
31007 }
31008 func rewriteValuegeneric_OpStaticLECall(v *Value) bool {
31009 b := v.Block
31010 config := b.Func.Config
31011 typ := &b.Func.Config.Types
31012
31013
31014
31015 for {
31016 if len(v.Args) != 4 {
31017 break
31018 }
31019 callAux := auxToCall(v.Aux)
31020 mem := v.Args[3]
31021 sptr := v.Args[0]
31022 v_1 := v.Args[1]
31023 if v_1.Op != OpAddr {
31024 break
31025 }
31026 scon := auxToSym(v_1.Aux)
31027 v_1_0 := v_1.Args[0]
31028 if v_1_0.Op != OpSB {
31029 break
31030 }
31031 v_2 := v.Args[2]
31032 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon)) {
31033 break
31034 }
31035 v.reset(OpMakeResult)
31036 v0 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
31037 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
31038 v1.AddArg2(sptr, mem)
31039 v2 := b.NewValue0(v.Pos, OpConst8, typ.Int8)
31040 v2.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
31041 v0.AddArg2(v1, v2)
31042 v.AddArg2(v0, mem)
31043 return true
31044 }
31045
31046
31047
31048 for {
31049 if len(v.Args) != 4 {
31050 break
31051 }
31052 callAux := auxToCall(v.Aux)
31053 mem := v.Args[3]
31054 v_0 := v.Args[0]
31055 if v_0.Op != OpAddr {
31056 break
31057 }
31058 scon := auxToSym(v_0.Aux)
31059 v_0_0 := v_0.Args[0]
31060 if v_0_0.Op != OpSB {
31061 break
31062 }
31063 sptr := v.Args[1]
31064 v_2 := v.Args[2]
31065 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon)) {
31066 break
31067 }
31068 v.reset(OpMakeResult)
31069 v0 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
31070 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
31071 v1.AddArg2(sptr, mem)
31072 v2 := b.NewValue0(v.Pos, OpConst8, typ.Int8)
31073 v2.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
31074 v0.AddArg2(v1, v2)
31075 v.AddArg2(v0, mem)
31076 return true
31077 }
31078
31079
31080
31081 for {
31082 if len(v.Args) != 4 {
31083 break
31084 }
31085 callAux := auxToCall(v.Aux)
31086 mem := v.Args[3]
31087 sptr := v.Args[0]
31088 v_1 := v.Args[1]
31089 if v_1.Op != OpAddr {
31090 break
31091 }
31092 scon := auxToSym(v_1.Aux)
31093 v_1_0 := v_1.Args[0]
31094 if v_1_0.Op != OpSB {
31095 break
31096 }
31097 v_2 := v.Args[2]
31098 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
31099 break
31100 }
31101 v.reset(OpMakeResult)
31102 v0 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
31103 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
31104 v1.AddArg2(sptr, mem)
31105 v2 := b.NewValue0(v.Pos, OpConst16, typ.Int16)
31106 v2.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
31107 v0.AddArg2(v1, v2)
31108 v.AddArg2(v0, mem)
31109 return true
31110 }
31111
31112
31113
31114 for {
31115 if len(v.Args) != 4 {
31116 break
31117 }
31118 callAux := auxToCall(v.Aux)
31119 mem := v.Args[3]
31120 v_0 := v.Args[0]
31121 if v_0.Op != OpAddr {
31122 break
31123 }
31124 scon := auxToSym(v_0.Aux)
31125 v_0_0 := v_0.Args[0]
31126 if v_0_0.Op != OpSB {
31127 break
31128 }
31129 sptr := v.Args[1]
31130 v_2 := v.Args[2]
31131 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
31132 break
31133 }
31134 v.reset(OpMakeResult)
31135 v0 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
31136 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
31137 v1.AddArg2(sptr, mem)
31138 v2 := b.NewValue0(v.Pos, OpConst16, typ.Int16)
31139 v2.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
31140 v0.AddArg2(v1, v2)
31141 v.AddArg2(v0, mem)
31142 return true
31143 }
31144
31145
31146
31147 for {
31148 if len(v.Args) != 4 {
31149 break
31150 }
31151 callAux := auxToCall(v.Aux)
31152 mem := v.Args[3]
31153 sptr := v.Args[0]
31154 v_1 := v.Args[1]
31155 if v_1.Op != OpAddr {
31156 break
31157 }
31158 scon := auxToSym(v_1.Aux)
31159 v_1_0 := v_1.Args[0]
31160 if v_1_0.Op != OpSB {
31161 break
31162 }
31163 v_2 := v.Args[2]
31164 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
31165 break
31166 }
31167 v.reset(OpMakeResult)
31168 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
31169 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31170 v1.AddArg2(sptr, mem)
31171 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
31172 v2.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
31173 v0.AddArg2(v1, v2)
31174 v.AddArg2(v0, mem)
31175 return true
31176 }
31177
31178
31179
31180 for {
31181 if len(v.Args) != 4 {
31182 break
31183 }
31184 callAux := auxToCall(v.Aux)
31185 mem := v.Args[3]
31186 v_0 := v.Args[0]
31187 if v_0.Op != OpAddr {
31188 break
31189 }
31190 scon := auxToSym(v_0.Aux)
31191 v_0_0 := v_0.Args[0]
31192 if v_0_0.Op != OpSB {
31193 break
31194 }
31195 sptr := v.Args[1]
31196 v_2 := v.Args[2]
31197 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
31198 break
31199 }
31200 v.reset(OpMakeResult)
31201 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
31202 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31203 v1.AddArg2(sptr, mem)
31204 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
31205 v2.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
31206 v0.AddArg2(v1, v2)
31207 v.AddArg2(v0, mem)
31208 return true
31209 }
31210
31211
31212
31213 for {
31214 if len(v.Args) != 4 {
31215 break
31216 }
31217 callAux := auxToCall(v.Aux)
31218 mem := v.Args[3]
31219 sptr := v.Args[0]
31220 v_1 := v.Args[1]
31221 if v_1.Op != OpAddr {
31222 break
31223 }
31224 scon := auxToSym(v_1.Aux)
31225 v_1_0 := v_1.Args[0]
31226 if v_1_0.Op != OpSB {
31227 break
31228 }
31229 v_2 := v.Args[2]
31230 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31231 break
31232 }
31233 v.reset(OpMakeResult)
31234 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31235 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
31236 v1.AddArg2(sptr, mem)
31237 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31238 v2.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
31239 v0.AddArg2(v1, v2)
31240 v.AddArg2(v0, mem)
31241 return true
31242 }
31243
31244
31245
31246 for {
31247 if len(v.Args) != 4 {
31248 break
31249 }
31250 callAux := auxToCall(v.Aux)
31251 mem := v.Args[3]
31252 v_0 := v.Args[0]
31253 if v_0.Op != OpAddr {
31254 break
31255 }
31256 scon := auxToSym(v_0.Aux)
31257 v_0_0 := v_0.Args[0]
31258 if v_0_0.Op != OpSB {
31259 break
31260 }
31261 sptr := v.Args[1]
31262 v_2 := v.Args[2]
31263 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31264 break
31265 }
31266 v.reset(OpMakeResult)
31267 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31268 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
31269 v1.AddArg2(sptr, mem)
31270 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31271 v2.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
31272 v0.AddArg2(v1, v2)
31273 v.AddArg2(v0, mem)
31274 return true
31275 }
31276
31277
31278
31279 for {
31280 if len(v.Args) != 4 {
31281 break
31282 }
31283 callAux := auxToCall(v.Aux)
31284 mem := v.Args[3]
31285 sptr := v.Args[0]
31286 v_1 := v.Args[1]
31287 if v_1.Op != OpAddr {
31288 break
31289 }
31290 scon := auxToSym(v_1.Aux)
31291 v_1_0 := v_1.Args[0]
31292 if v_1_0.Op != OpSB {
31293 break
31294 }
31295 v_2 := v.Args[2]
31296 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 3 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
31297 break
31298 }
31299 v.reset(OpMakeResult)
31300 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
31301 v1 := b.NewValue0(v.Pos, OpOr32, typ.Int32)
31302 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.Int32)
31303 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
31304 v3.AddArg2(sptr, mem)
31305 v2.AddArg(v3)
31306 v4 := b.NewValue0(v.Pos, OpLsh32x32, typ.Int32)
31307 v5 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.Int32)
31308 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
31309 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31310 v7.AuxInt = int64ToAuxInt(2)
31311 v7.AddArg(sptr)
31312 v6.AddArg2(v7, mem)
31313 v5.AddArg(v6)
31314 v8 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
31315 v8.AuxInt = int32ToAuxInt(16)
31316 v4.AddArg2(v5, v8)
31317 v1.AddArg2(v2, v4)
31318 v9 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
31319 v9.AuxInt = int32ToAuxInt(int32(uint32(read16(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint32(read8(scon, 2)) << 16)))
31320 v0.AddArg2(v1, v9)
31321 v.AddArg2(v0, mem)
31322 return true
31323 }
31324
31325
31326
31327 for {
31328 if len(v.Args) != 4 {
31329 break
31330 }
31331 callAux := auxToCall(v.Aux)
31332 mem := v.Args[3]
31333 v_0 := v.Args[0]
31334 if v_0.Op != OpAddr {
31335 break
31336 }
31337 scon := auxToSym(v_0.Aux)
31338 v_0_0 := v_0.Args[0]
31339 if v_0_0.Op != OpSB {
31340 break
31341 }
31342 sptr := v.Args[1]
31343 v_2 := v.Args[2]
31344 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 3 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
31345 break
31346 }
31347 v.reset(OpMakeResult)
31348 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
31349 v1 := b.NewValue0(v.Pos, OpOr32, typ.Int32)
31350 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.Int32)
31351 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
31352 v3.AddArg2(sptr, mem)
31353 v2.AddArg(v3)
31354 v4 := b.NewValue0(v.Pos, OpLsh32x32, typ.Int32)
31355 v5 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.Int32)
31356 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
31357 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31358 v7.AuxInt = int64ToAuxInt(2)
31359 v7.AddArg(sptr)
31360 v6.AddArg2(v7, mem)
31361 v5.AddArg(v6)
31362 v8 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
31363 v8.AuxInt = int32ToAuxInt(16)
31364 v4.AddArg2(v5, v8)
31365 v1.AddArg2(v2, v4)
31366 v9 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
31367 v9.AuxInt = int32ToAuxInt(int32(uint32(read16(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint32(read8(scon, 2)) << 16)))
31368 v0.AddArg2(v1, v9)
31369 v.AddArg2(v0, mem)
31370 return true
31371 }
31372
31373
31374
31375 for {
31376 if len(v.Args) != 4 {
31377 break
31378 }
31379 callAux := auxToCall(v.Aux)
31380 mem := v.Args[3]
31381 sptr := v.Args[0]
31382 v_1 := v.Args[1]
31383 if v_1.Op != OpAddr {
31384 break
31385 }
31386 scon := auxToSym(v_1.Aux)
31387 v_1_0 := v_1.Args[0]
31388 if v_1_0.Op != OpSB {
31389 break
31390 }
31391 v_2 := v.Args[2]
31392 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 5 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31393 break
31394 }
31395 v.reset(OpMakeResult)
31396 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31397 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
31398 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31399 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31400 v3.AddArg2(sptr, mem)
31401 v2.AddArg(v3)
31402 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
31403 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.Int64)
31404 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
31405 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31406 v7.AuxInt = int64ToAuxInt(4)
31407 v7.AddArg(sptr)
31408 v6.AddArg2(v7, mem)
31409 v5.AddArg(v6)
31410 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31411 v8.AuxInt = int64ToAuxInt(32)
31412 v4.AddArg2(v5, v8)
31413 v1.AddArg2(v2, v4)
31414 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31415 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read8(scon, 4)) << 32)))
31416 v0.AddArg2(v1, v9)
31417 v.AddArg2(v0, mem)
31418 return true
31419 }
31420
31421
31422
31423 for {
31424 if len(v.Args) != 4 {
31425 break
31426 }
31427 callAux := auxToCall(v.Aux)
31428 mem := v.Args[3]
31429 v_0 := v.Args[0]
31430 if v_0.Op != OpAddr {
31431 break
31432 }
31433 scon := auxToSym(v_0.Aux)
31434 v_0_0 := v_0.Args[0]
31435 if v_0_0.Op != OpSB {
31436 break
31437 }
31438 sptr := v.Args[1]
31439 v_2 := v.Args[2]
31440 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 5 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31441 break
31442 }
31443 v.reset(OpMakeResult)
31444 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31445 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
31446 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31447 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31448 v3.AddArg2(sptr, mem)
31449 v2.AddArg(v3)
31450 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
31451 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.Int64)
31452 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
31453 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31454 v7.AuxInt = int64ToAuxInt(4)
31455 v7.AddArg(sptr)
31456 v6.AddArg2(v7, mem)
31457 v5.AddArg(v6)
31458 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31459 v8.AuxInt = int64ToAuxInt(32)
31460 v4.AddArg2(v5, v8)
31461 v1.AddArg2(v2, v4)
31462 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31463 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read8(scon, 4)) << 32)))
31464 v0.AddArg2(v1, v9)
31465 v.AddArg2(v0, mem)
31466 return true
31467 }
31468
31469
31470
31471 for {
31472 if len(v.Args) != 4 {
31473 break
31474 }
31475 callAux := auxToCall(v.Aux)
31476 mem := v.Args[3]
31477 sptr := v.Args[0]
31478 v_1 := v.Args[1]
31479 if v_1.Op != OpAddr {
31480 break
31481 }
31482 scon := auxToSym(v_1.Aux)
31483 v_1_0 := v_1.Args[0]
31484 if v_1_0.Op != OpSB {
31485 break
31486 }
31487 v_2 := v.Args[2]
31488 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 6 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31489 break
31490 }
31491 v.reset(OpMakeResult)
31492 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31493 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
31494 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31495 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31496 v3.AddArg2(sptr, mem)
31497 v2.AddArg(v3)
31498 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
31499 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.Int64)
31500 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
31501 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31502 v7.AuxInt = int64ToAuxInt(4)
31503 v7.AddArg(sptr)
31504 v6.AddArg2(v7, mem)
31505 v5.AddArg(v6)
31506 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31507 v8.AuxInt = int64ToAuxInt(32)
31508 v4.AddArg2(v5, v8)
31509 v1.AddArg2(v2, v4)
31510 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31511 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read16(scon, 4, config.ctxt.Arch.ByteOrder)) << 32)))
31512 v0.AddArg2(v1, v9)
31513 v.AddArg2(v0, mem)
31514 return true
31515 }
31516
31517
31518
31519 for {
31520 if len(v.Args) != 4 {
31521 break
31522 }
31523 callAux := auxToCall(v.Aux)
31524 mem := v.Args[3]
31525 v_0 := v.Args[0]
31526 if v_0.Op != OpAddr {
31527 break
31528 }
31529 scon := auxToSym(v_0.Aux)
31530 v_0_0 := v_0.Args[0]
31531 if v_0_0.Op != OpSB {
31532 break
31533 }
31534 sptr := v.Args[1]
31535 v_2 := v.Args[2]
31536 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 6 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31537 break
31538 }
31539 v.reset(OpMakeResult)
31540 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31541 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
31542 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31543 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31544 v3.AddArg2(sptr, mem)
31545 v2.AddArg(v3)
31546 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
31547 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.Int64)
31548 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
31549 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31550 v7.AuxInt = int64ToAuxInt(4)
31551 v7.AddArg(sptr)
31552 v6.AddArg2(v7, mem)
31553 v5.AddArg(v6)
31554 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31555 v8.AuxInt = int64ToAuxInt(32)
31556 v4.AddArg2(v5, v8)
31557 v1.AddArg2(v2, v4)
31558 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31559 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read16(scon, 4, config.ctxt.Arch.ByteOrder)) << 32)))
31560 v0.AddArg2(v1, v9)
31561 v.AddArg2(v0, mem)
31562 return true
31563 }
31564
31565
31566
31567 for {
31568 if len(v.Args) != 4 {
31569 break
31570 }
31571 callAux := auxToCall(v.Aux)
31572 mem := v.Args[3]
31573 sptr := v.Args[0]
31574 v_1 := v.Args[1]
31575 if v_1.Op != OpAddr {
31576 break
31577 }
31578 scon := auxToSym(v_1.Aux)
31579 v_1_0 := v_1.Args[0]
31580 if v_1_0.Op != OpSB {
31581 break
31582 }
31583 v_2 := v.Args[2]
31584 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 7 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31585 break
31586 }
31587 v.reset(OpMakeResult)
31588 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31589 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
31590 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31591 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31592 v3.AddArg2(sptr, mem)
31593 v2.AddArg(v3)
31594 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
31595 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31596 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31597 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31598 v7.AuxInt = int64ToAuxInt(3)
31599 v7.AddArg(sptr)
31600 v6.AddArg2(v7, mem)
31601 v5.AddArg(v6)
31602 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31603 v8.AuxInt = int64ToAuxInt(32)
31604 v4.AddArg2(v5, v8)
31605 v1.AddArg2(v2, v4)
31606 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31607 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read32(scon, 3, config.ctxt.Arch.ByteOrder)) << 32)))
31608 v0.AddArg2(v1, v9)
31609 v.AddArg2(v0, mem)
31610 return true
31611 }
31612
31613
31614
31615 for {
31616 if len(v.Args) != 4 {
31617 break
31618 }
31619 callAux := auxToCall(v.Aux)
31620 mem := v.Args[3]
31621 v_0 := v.Args[0]
31622 if v_0.Op != OpAddr {
31623 break
31624 }
31625 scon := auxToSym(v_0.Aux)
31626 v_0_0 := v_0.Args[0]
31627 if v_0_0.Op != OpSB {
31628 break
31629 }
31630 sptr := v.Args[1]
31631 v_2 := v.Args[2]
31632 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 7 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31633 break
31634 }
31635 v.reset(OpMakeResult)
31636 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31637 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
31638 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31639 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31640 v3.AddArg2(sptr, mem)
31641 v2.AddArg(v3)
31642 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
31643 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31644 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31645 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31646 v7.AuxInt = int64ToAuxInt(3)
31647 v7.AddArg(sptr)
31648 v6.AddArg2(v7, mem)
31649 v5.AddArg(v6)
31650 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31651 v8.AuxInt = int64ToAuxInt(32)
31652 v4.AddArg2(v5, v8)
31653 v1.AddArg2(v2, v4)
31654 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31655 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read32(scon, 3, config.ctxt.Arch.ByteOrder)) << 32)))
31656 v0.AddArg2(v1, v9)
31657 v.AddArg2(v0, mem)
31658 return true
31659 }
31660
31661
31662
31663 for {
31664 if len(v.Args) != 4 {
31665 break
31666 }
31667 callAux := auxToCall(v.Aux)
31668 mem := v.Args[3]
31669 v_2 := v.Args[2]
31670 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.memequal")) {
31671 break
31672 }
31673 v.reset(OpMakeResult)
31674 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
31675 v0.AuxInt = boolToAuxInt(true)
31676 v.AddArg2(v0, mem)
31677 return true
31678 }
31679
31680
31681
31682 for {
31683 if len(v.Args) != 4 {
31684 break
31685 }
31686 callAux := auxToCall(v.Aux)
31687 mem := v.Args[3]
31688 p := v.Args[0]
31689 q := v.Args[1]
31690 if !(isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)) {
31691 break
31692 }
31693 v.reset(OpMakeResult)
31694 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
31695 v0.AuxInt = boolToAuxInt(true)
31696 v.AddArg2(v0, mem)
31697 return true
31698 }
31699
31700
31701
31702 for {
31703 if len(v.Args) != 4 {
31704 break
31705 }
31706 callAux := auxToCall(v.Aux)
31707 mem := v.Args[3]
31708 v_1 := v.Args[1]
31709 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
31710 break
31711 }
31712 v_2 := v.Args[2]
31713 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.makeslice")) {
31714 break
31715 }
31716 v.reset(OpMakeResult)
31717 v0 := b.NewValue0(v.Pos, OpAddr, v.Type.FieldType(0))
31718 v0.Aux = symToAux(ir.Syms.Zerobase)
31719 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
31720 v0.AddArg(v1)
31721 v.AddArg2(v0, mem)
31722 return true
31723 }
31724
31725
31726
31727 for {
31728 if len(v.Args) != 4 {
31729 break
31730 }
31731 callAux := auxToCall(v.Aux)
31732 mem := v.Args[3]
31733 v_1 := v.Args[1]
31734 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
31735 break
31736 }
31737 v_2 := v.Args[2]
31738 if v_2.Op != OpConst32 || auxIntToInt32(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.makeslice")) {
31739 break
31740 }
31741 v.reset(OpMakeResult)
31742 v0 := b.NewValue0(v.Pos, OpAddr, v.Type.FieldType(0))
31743 v0.Aux = symToAux(ir.Syms.Zerobase)
31744 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
31745 v0.AddArg(v1)
31746 v.AddArg2(v0, mem)
31747 return true
31748 }
31749
31750
31751
31752 for {
31753 if len(v.Args) != 4 {
31754 break
31755 }
31756 f := auxToCall(v.Aux)
31757 mem := v.Args[3]
31758 typ_ := v.Args[0]
31759 x := v.Args[1]
31760 y := v.Args[2]
31761 if !(isSameCall(f, "runtime.efaceeq") && isDirectAndComparableType(typ_) && clobber(v)) {
31762 break
31763 }
31764 v.reset(OpMakeResult)
31765 v0 := b.NewValue0(v.Pos, OpEqPtr, typ.Bool)
31766 v0.AddArg2(x, y)
31767 v.AddArg2(v0, mem)
31768 return true
31769 }
31770
31771
31772
31773 for {
31774 if len(v.Args) != 4 {
31775 break
31776 }
31777 f := auxToCall(v.Aux)
31778 mem := v.Args[3]
31779 itab := v.Args[0]
31780 x := v.Args[1]
31781 y := v.Args[2]
31782 if !(isSameCall(f, "runtime.ifaceeq") && isDirectAndComparableIface(itab) && clobber(v)) {
31783 break
31784 }
31785 v.reset(OpMakeResult)
31786 v0 := b.NewValue0(v.Pos, OpEqPtr, typ.Bool)
31787 v0.AddArg2(x, y)
31788 v.AddArg2(v0, mem)
31789 return true
31790 }
31791
31792
31793
31794 for {
31795 if len(v.Args) != 4 {
31796 break
31797 }
31798 argsize := auxIntToInt32(v.AuxInt)
31799 f := auxToCall(v.Aux)
31800 _ = v.Args[3]
31801 typ_ := v.Args[0]
31802 map_ := v.Args[1]
31803 key := v.Args[2]
31804 if key.Op != OpSelectN || auxIntToInt64(key.AuxInt) != 0 {
31805 break
31806 }
31807 sbts := key.Args[0]
31808 if sbts.Op != OpStaticLECall || len(sbts.Args) != 4 {
31809 break
31810 }
31811 g := auxToCall(sbts.Aux)
31812 mem := sbts.Args[3]
31813 ptr := sbts.Args[1]
31814 len := sbts.Args[2]
31815 m := v.Args[3]
31816 if m.Op != OpSelectN || auxIntToInt64(m.AuxInt) != 1 || sbts != m.Args[0] || !((isSameCall(f, "runtime.mapaccess1_faststr") || isSameCall(f, "runtime.mapaccess2_faststr") || isSameCall(f, "runtime.mapdelete_faststr")) && isSameCall(g, "runtime.slicebytetostring") && key.Uses == 1 && sbts.Uses == 2 && resetCopy(m, mem) && clobber(sbts) && clobber(key)) {
31817 break
31818 }
31819 v.reset(OpStaticLECall)
31820 v.AuxInt = int32ToAuxInt(argsize)
31821 v.Aux = callToAux(f)
31822 v0 := b.NewValue0(v.Pos, OpStringMake, typ.String)
31823 v0.AddArg2(ptr, len)
31824 v.AddArg4(typ_, map_, v0, mem)
31825 return true
31826 }
31827
31828
31829
31830 for {
31831 if len(v.Args) != 3 {
31832 break
31833 }
31834 argsize := auxIntToInt32(v.AuxInt)
31835 f := auxToCall(v.Aux)
31836 _ = v.Args[2]
31837 dict_ := v.Args[0]
31838 key := v.Args[1]
31839 if key.Op != OpSelectN || auxIntToInt64(key.AuxInt) != 0 {
31840 break
31841 }
31842 sbts := key.Args[0]
31843 if sbts.Op != OpStaticLECall || len(sbts.Args) != 4 {
31844 break
31845 }
31846 g := auxToCall(sbts.Aux)
31847 mem := sbts.Args[3]
31848 ptr := sbts.Args[1]
31849 len := sbts.Args[2]
31850 m := v.Args[2]
31851 if m.Op != OpSelectN || auxIntToInt64(m.AuxInt) != 1 || sbts != m.Args[0] || !(isSameCall(f, "unique.Make[go.shape.string]") && isSameCall(g, "runtime.slicebytetostring") && key.Uses == 1 && sbts.Uses == 2 && resetCopy(m, mem) && clobber(sbts) && clobber(key)) {
31852 break
31853 }
31854 v.reset(OpStaticLECall)
31855 v.AuxInt = int32ToAuxInt(argsize)
31856 v.Aux = callToAux(f)
31857 v0 := b.NewValue0(v.Pos, OpStringMake, typ.String)
31858 v0.AddArg2(ptr, len)
31859 v.AddArg3(dict_, v0, mem)
31860 return true
31861 }
31862 return false
31863 }
31864 func rewriteValuegeneric_OpStore(v *Value) bool {
31865 v_2 := v.Args[2]
31866 v_1 := v.Args[1]
31867 v_0 := v.Args[0]
31868 b := v.Block
31869
31870
31871
31872 for {
31873 t1 := auxToType(v.Aux)
31874 p1 := v_0
31875 if v_1.Op != OpLoad {
31876 break
31877 }
31878 t2 := v_1.Type
31879 mem := v_1.Args[1]
31880 p2 := v_1.Args[0]
31881 if mem != v_2 || !(isSamePtr(p1, p2) && t2.Size() == t1.Size()) {
31882 break
31883 }
31884 v.copyOf(mem)
31885 return true
31886 }
31887
31888
31889
31890 for {
31891 t1 := auxToType(v.Aux)
31892 p1 := v_0
31893 if v_1.Op != OpLoad {
31894 break
31895 }
31896 t2 := v_1.Type
31897 oldmem := v_1.Args[1]
31898 p2 := v_1.Args[0]
31899 mem := v_2
31900 if mem.Op != OpStore {
31901 break
31902 }
31903 t3 := auxToType(mem.Aux)
31904 _ = mem.Args[2]
31905 p3 := mem.Args[0]
31906 if oldmem != mem.Args[2] || !(isSamePtr(p1, p2) && t2.Size() == t1.Size() && disjoint(p1, t1.Size(), p3, t3.Size())) {
31907 break
31908 }
31909 v.copyOf(mem)
31910 return true
31911 }
31912
31913
31914
31915 for {
31916 t1 := auxToType(v.Aux)
31917 p1 := v_0
31918 if v_1.Op != OpLoad {
31919 break
31920 }
31921 t2 := v_1.Type
31922 oldmem := v_1.Args[1]
31923 p2 := v_1.Args[0]
31924 mem := v_2
31925 if mem.Op != OpStore {
31926 break
31927 }
31928 t3 := auxToType(mem.Aux)
31929 _ = mem.Args[2]
31930 p3 := mem.Args[0]
31931 mem_2 := mem.Args[2]
31932 if mem_2.Op != OpStore {
31933 break
31934 }
31935 t4 := auxToType(mem_2.Aux)
31936 _ = mem_2.Args[2]
31937 p4 := mem_2.Args[0]
31938 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())) {
31939 break
31940 }
31941 v.copyOf(mem)
31942 return true
31943 }
31944
31945
31946
31947 for {
31948 t1 := auxToType(v.Aux)
31949 p1 := v_0
31950 if v_1.Op != OpLoad {
31951 break
31952 }
31953 t2 := v_1.Type
31954 oldmem := v_1.Args[1]
31955 p2 := v_1.Args[0]
31956 mem := v_2
31957 if mem.Op != OpStore {
31958 break
31959 }
31960 t3 := auxToType(mem.Aux)
31961 _ = mem.Args[2]
31962 p3 := mem.Args[0]
31963 mem_2 := mem.Args[2]
31964 if mem_2.Op != OpStore {
31965 break
31966 }
31967 t4 := auxToType(mem_2.Aux)
31968 _ = mem_2.Args[2]
31969 p4 := mem_2.Args[0]
31970 mem_2_2 := mem_2.Args[2]
31971 if mem_2_2.Op != OpStore {
31972 break
31973 }
31974 t5 := auxToType(mem_2_2.Aux)
31975 _ = mem_2_2.Args[2]
31976 p5 := mem_2_2.Args[0]
31977 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())) {
31978 break
31979 }
31980 v.copyOf(mem)
31981 return true
31982 }
31983
31984
31985
31986 for {
31987 t := auxToType(v.Aux)
31988 if v_0.Op != OpOffPtr {
31989 break
31990 }
31991 o := auxIntToInt64(v_0.AuxInt)
31992 p1 := v_0.Args[0]
31993 x := v_1
31994 mem := v_2
31995 if mem.Op != OpZero {
31996 break
31997 }
31998 n := auxIntToInt64(mem.AuxInt)
31999 p2 := mem.Args[0]
32000 if !(isConstZero(x) && o >= 0 && t.Size()+o <= n && isSamePtr(p1, p2)) {
32001 break
32002 }
32003 v.copyOf(mem)
32004 return true
32005 }
32006
32007
32008
32009 for {
32010 t1 := auxToType(v.Aux)
32011 op := v_0
32012 if op.Op != OpOffPtr {
32013 break
32014 }
32015 o1 := auxIntToInt64(op.AuxInt)
32016 p1 := op.Args[0]
32017 x := v_1
32018 mem := v_2
32019 if mem.Op != OpStore {
32020 break
32021 }
32022 t2 := auxToType(mem.Aux)
32023 _ = mem.Args[2]
32024 p2 := mem.Args[0]
32025 mem_2 := mem.Args[2]
32026 if mem_2.Op != OpZero {
32027 break
32028 }
32029 n := auxIntToInt64(mem_2.AuxInt)
32030 p3 := mem_2.Args[0]
32031 if !(isConstZero(x) && o1 >= 0 && t1.Size()+o1 <= n && isSamePtr(p1, p3) && disjoint(op, t1.Size(), p2, t2.Size())) {
32032 break
32033 }
32034 v.copyOf(mem)
32035 return true
32036 }
32037
32038
32039
32040 for {
32041 t1 := auxToType(v.Aux)
32042 op := v_0
32043 if op.Op != OpOffPtr {
32044 break
32045 }
32046 o1 := auxIntToInt64(op.AuxInt)
32047 p1 := op.Args[0]
32048 x := v_1
32049 mem := v_2
32050 if mem.Op != OpStore {
32051 break
32052 }
32053 t2 := auxToType(mem.Aux)
32054 _ = mem.Args[2]
32055 p2 := mem.Args[0]
32056 mem_2 := mem.Args[2]
32057 if mem_2.Op != OpStore {
32058 break
32059 }
32060 t3 := auxToType(mem_2.Aux)
32061 _ = mem_2.Args[2]
32062 p3 := mem_2.Args[0]
32063 mem_2_2 := mem_2.Args[2]
32064 if mem_2_2.Op != OpZero {
32065 break
32066 }
32067 n := auxIntToInt64(mem_2_2.AuxInt)
32068 p4 := mem_2_2.Args[0]
32069 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())) {
32070 break
32071 }
32072 v.copyOf(mem)
32073 return true
32074 }
32075
32076
32077
32078 for {
32079 t1 := auxToType(v.Aux)
32080 op := v_0
32081 if op.Op != OpOffPtr {
32082 break
32083 }
32084 o1 := auxIntToInt64(op.AuxInt)
32085 p1 := op.Args[0]
32086 x := v_1
32087 mem := v_2
32088 if mem.Op != OpStore {
32089 break
32090 }
32091 t2 := auxToType(mem.Aux)
32092 _ = mem.Args[2]
32093 p2 := mem.Args[0]
32094 mem_2 := mem.Args[2]
32095 if mem_2.Op != OpStore {
32096 break
32097 }
32098 t3 := auxToType(mem_2.Aux)
32099 _ = mem_2.Args[2]
32100 p3 := mem_2.Args[0]
32101 mem_2_2 := mem_2.Args[2]
32102 if mem_2_2.Op != OpStore {
32103 break
32104 }
32105 t4 := auxToType(mem_2_2.Aux)
32106 _ = mem_2_2.Args[2]
32107 p4 := mem_2_2.Args[0]
32108 mem_2_2_2 := mem_2_2.Args[2]
32109 if mem_2_2_2.Op != OpZero {
32110 break
32111 }
32112 n := auxIntToInt64(mem_2_2_2.AuxInt)
32113 p5 := mem_2_2_2.Args[0]
32114 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())) {
32115 break
32116 }
32117 v.copyOf(mem)
32118 return true
32119 }
32120
32121
32122 for {
32123 if v_1.Op != OpStructMake {
32124 break
32125 }
32126 v.copyOf(rewriteStructStore(v))
32127 return true
32128 }
32129
32130
32131
32132 for {
32133 t := auxToType(v.Aux)
32134 dst := v_0
32135 if v_1.Op != OpLoad {
32136 break
32137 }
32138 mem := v_1.Args[1]
32139 src := v_1.Args[0]
32140 if mem != v_2 || !(!CanSSA(t)) {
32141 break
32142 }
32143 v.reset(OpMove)
32144 v.AuxInt = int64ToAuxInt(t.Size())
32145 v.Aux = typeToAux(t)
32146 v.AddArg3(dst, src, mem)
32147 return true
32148 }
32149
32150
32151
32152 for {
32153 t := auxToType(v.Aux)
32154 dst := v_0
32155 if v_1.Op != OpLoad {
32156 break
32157 }
32158 mem := v_1.Args[1]
32159 src := v_1.Args[0]
32160 if v_2.Op != OpVarDef {
32161 break
32162 }
32163 x := auxToSym(v_2.Aux)
32164 if mem != v_2.Args[0] || !(!CanSSA(t)) {
32165 break
32166 }
32167 v.reset(OpMove)
32168 v.AuxInt = int64ToAuxInt(t.Size())
32169 v.Aux = typeToAux(t)
32170 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
32171 v0.Aux = symToAux(x)
32172 v0.AddArg(mem)
32173 v.AddArg3(dst, src, v0)
32174 return true
32175 }
32176
32177
32178 for {
32179 if v_1.Op != OpArrayMake0 {
32180 break
32181 }
32182 mem := v_2
32183 v.copyOf(mem)
32184 return true
32185 }
32186
32187
32188 for {
32189 dst := v_0
32190 if v_1.Op != OpArrayMake1 {
32191 break
32192 }
32193 e := v_1.Args[0]
32194 mem := v_2
32195 v.reset(OpStore)
32196 v.Aux = typeToAux(e.Type)
32197 v.AddArg3(dst, e, mem)
32198 return true
32199 }
32200
32201
32202
32203 for {
32204 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
32205 break
32206 }
32207 call := v_0.Args[0]
32208 if call.Op != OpStaticLECall {
32209 break
32210 }
32211 x := v_1
32212 mem := v_2
32213 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isConstZero(x) && isMalloc(call.Aux)) {
32214 break
32215 }
32216 v.copyOf(mem)
32217 return true
32218 }
32219
32220
32221
32222 for {
32223 if v_0.Op != OpOffPtr {
32224 break
32225 }
32226 v_0_0 := v_0.Args[0]
32227 if v_0_0.Op != OpSelectN || auxIntToInt64(v_0_0.AuxInt) != 0 {
32228 break
32229 }
32230 call := v_0_0.Args[0]
32231 if call.Op != OpStaticLECall {
32232 break
32233 }
32234 x := v_1
32235 mem := v_2
32236 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isConstZero(x) && isMalloc(call.Aux)) {
32237 break
32238 }
32239 v.copyOf(mem)
32240 return true
32241 }
32242
32243
32244
32245 for {
32246 t1 := auxToType(v.Aux)
32247 op1 := v_0
32248 if op1.Op != OpOffPtr {
32249 break
32250 }
32251 o1 := auxIntToInt64(op1.AuxInt)
32252 p1 := op1.Args[0]
32253 d1 := v_1
32254 m2 := v_2
32255 if m2.Op != OpStore {
32256 break
32257 }
32258 t2 := auxToType(m2.Aux)
32259 _ = m2.Args[2]
32260 op2 := m2.Args[0]
32261 if op2.Op != OpOffPtr || auxIntToInt64(op2.AuxInt) != 0 {
32262 break
32263 }
32264 p2 := op2.Args[0]
32265 d2 := m2.Args[1]
32266 m3 := m2.Args[2]
32267 if m3.Op != OpMove {
32268 break
32269 }
32270 n := auxIntToInt64(m3.AuxInt)
32271 mem := m3.Args[2]
32272 p3 := m3.Args[0]
32273 if !(m2.Uses == 1 && m3.Uses == 1 && o1 == t2.Size() && n == t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2, m3)) {
32274 break
32275 }
32276 v.reset(OpStore)
32277 v.Aux = typeToAux(t1)
32278 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32279 v0.Aux = typeToAux(t2)
32280 v0.AddArg3(op2, d2, mem)
32281 v.AddArg3(op1, d1, v0)
32282 return true
32283 }
32284
32285
32286
32287 for {
32288 t1 := auxToType(v.Aux)
32289 op1 := v_0
32290 if op1.Op != OpOffPtr {
32291 break
32292 }
32293 o1 := auxIntToInt64(op1.AuxInt)
32294 p1 := op1.Args[0]
32295 d1 := v_1
32296 m2 := v_2
32297 if m2.Op != OpStore {
32298 break
32299 }
32300 t2 := auxToType(m2.Aux)
32301 _ = m2.Args[2]
32302 op2 := m2.Args[0]
32303 if op2.Op != OpOffPtr {
32304 break
32305 }
32306 o2 := auxIntToInt64(op2.AuxInt)
32307 p2 := op2.Args[0]
32308 d2 := m2.Args[1]
32309 m3 := m2.Args[2]
32310 if m3.Op != OpStore {
32311 break
32312 }
32313 t3 := auxToType(m3.Aux)
32314 _ = m3.Args[2]
32315 op3 := m3.Args[0]
32316 if op3.Op != OpOffPtr || auxIntToInt64(op3.AuxInt) != 0 {
32317 break
32318 }
32319 p3 := op3.Args[0]
32320 d3 := m3.Args[1]
32321 m4 := m3.Args[2]
32322 if m4.Op != OpMove {
32323 break
32324 }
32325 n := auxIntToInt64(m4.AuxInt)
32326 mem := m4.Args[2]
32327 p4 := m4.Args[0]
32328 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)) {
32329 break
32330 }
32331 v.reset(OpStore)
32332 v.Aux = typeToAux(t1)
32333 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32334 v0.Aux = typeToAux(t2)
32335 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32336 v1.Aux = typeToAux(t3)
32337 v1.AddArg3(op3, d3, mem)
32338 v0.AddArg3(op2, d2, v1)
32339 v.AddArg3(op1, d1, v0)
32340 return true
32341 }
32342
32343
32344
32345 for {
32346 t1 := auxToType(v.Aux)
32347 op1 := v_0
32348 if op1.Op != OpOffPtr {
32349 break
32350 }
32351 o1 := auxIntToInt64(op1.AuxInt)
32352 p1 := op1.Args[0]
32353 d1 := v_1
32354 m2 := v_2
32355 if m2.Op != OpStore {
32356 break
32357 }
32358 t2 := auxToType(m2.Aux)
32359 _ = m2.Args[2]
32360 op2 := m2.Args[0]
32361 if op2.Op != OpOffPtr {
32362 break
32363 }
32364 o2 := auxIntToInt64(op2.AuxInt)
32365 p2 := op2.Args[0]
32366 d2 := m2.Args[1]
32367 m3 := m2.Args[2]
32368 if m3.Op != OpStore {
32369 break
32370 }
32371 t3 := auxToType(m3.Aux)
32372 _ = m3.Args[2]
32373 op3 := m3.Args[0]
32374 if op3.Op != OpOffPtr {
32375 break
32376 }
32377 o3 := auxIntToInt64(op3.AuxInt)
32378 p3 := op3.Args[0]
32379 d3 := m3.Args[1]
32380 m4 := m3.Args[2]
32381 if m4.Op != OpStore {
32382 break
32383 }
32384 t4 := auxToType(m4.Aux)
32385 _ = m4.Args[2]
32386 op4 := m4.Args[0]
32387 if op4.Op != OpOffPtr || auxIntToInt64(op4.AuxInt) != 0 {
32388 break
32389 }
32390 p4 := op4.Args[0]
32391 d4 := m4.Args[1]
32392 m5 := m4.Args[2]
32393 if m5.Op != OpMove {
32394 break
32395 }
32396 n := auxIntToInt64(m5.AuxInt)
32397 mem := m5.Args[2]
32398 p5 := m5.Args[0]
32399 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)) {
32400 break
32401 }
32402 v.reset(OpStore)
32403 v.Aux = typeToAux(t1)
32404 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32405 v0.Aux = typeToAux(t2)
32406 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32407 v1.Aux = typeToAux(t3)
32408 v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32409 v2.Aux = typeToAux(t4)
32410 v2.AddArg3(op4, d4, mem)
32411 v1.AddArg3(op3, d3, v2)
32412 v0.AddArg3(op2, d2, v1)
32413 v.AddArg3(op1, d1, v0)
32414 return true
32415 }
32416
32417
32418
32419 for {
32420 t1 := auxToType(v.Aux)
32421 op1 := v_0
32422 if op1.Op != OpOffPtr {
32423 break
32424 }
32425 o1 := auxIntToInt64(op1.AuxInt)
32426 p1 := op1.Args[0]
32427 d1 := v_1
32428 m2 := v_2
32429 if m2.Op != OpStore {
32430 break
32431 }
32432 t2 := auxToType(m2.Aux)
32433 _ = m2.Args[2]
32434 op2 := m2.Args[0]
32435 if op2.Op != OpOffPtr || auxIntToInt64(op2.AuxInt) != 0 {
32436 break
32437 }
32438 p2 := op2.Args[0]
32439 d2 := m2.Args[1]
32440 m3 := m2.Args[2]
32441 if m3.Op != OpZero {
32442 break
32443 }
32444 n := auxIntToInt64(m3.AuxInt)
32445 mem := m3.Args[1]
32446 p3 := m3.Args[0]
32447 if !(m2.Uses == 1 && m3.Uses == 1 && o1 == t2.Size() && n == t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2, m3)) {
32448 break
32449 }
32450 v.reset(OpStore)
32451 v.Aux = typeToAux(t1)
32452 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32453 v0.Aux = typeToAux(t2)
32454 v0.AddArg3(op2, d2, mem)
32455 v.AddArg3(op1, d1, v0)
32456 return true
32457 }
32458
32459
32460
32461 for {
32462 t1 := auxToType(v.Aux)
32463 op1 := v_0
32464 if op1.Op != OpOffPtr {
32465 break
32466 }
32467 o1 := auxIntToInt64(op1.AuxInt)
32468 p1 := op1.Args[0]
32469 d1 := v_1
32470 m2 := v_2
32471 if m2.Op != OpStore {
32472 break
32473 }
32474 t2 := auxToType(m2.Aux)
32475 _ = m2.Args[2]
32476 op2 := m2.Args[0]
32477 if op2.Op != OpOffPtr {
32478 break
32479 }
32480 o2 := auxIntToInt64(op2.AuxInt)
32481 p2 := op2.Args[0]
32482 d2 := m2.Args[1]
32483 m3 := m2.Args[2]
32484 if m3.Op != OpStore {
32485 break
32486 }
32487 t3 := auxToType(m3.Aux)
32488 _ = m3.Args[2]
32489 op3 := m3.Args[0]
32490 if op3.Op != OpOffPtr || auxIntToInt64(op3.AuxInt) != 0 {
32491 break
32492 }
32493 p3 := op3.Args[0]
32494 d3 := m3.Args[1]
32495 m4 := m3.Args[2]
32496 if m4.Op != OpZero {
32497 break
32498 }
32499 n := auxIntToInt64(m4.AuxInt)
32500 mem := m4.Args[1]
32501 p4 := m4.Args[0]
32502 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)) {
32503 break
32504 }
32505 v.reset(OpStore)
32506 v.Aux = typeToAux(t1)
32507 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32508 v0.Aux = typeToAux(t2)
32509 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32510 v1.Aux = typeToAux(t3)
32511 v1.AddArg3(op3, d3, mem)
32512 v0.AddArg3(op2, d2, v1)
32513 v.AddArg3(op1, d1, v0)
32514 return true
32515 }
32516
32517
32518
32519 for {
32520 t1 := auxToType(v.Aux)
32521 op1 := v_0
32522 if op1.Op != OpOffPtr {
32523 break
32524 }
32525 o1 := auxIntToInt64(op1.AuxInt)
32526 p1 := op1.Args[0]
32527 d1 := v_1
32528 m2 := v_2
32529 if m2.Op != OpStore {
32530 break
32531 }
32532 t2 := auxToType(m2.Aux)
32533 _ = m2.Args[2]
32534 op2 := m2.Args[0]
32535 if op2.Op != OpOffPtr {
32536 break
32537 }
32538 o2 := auxIntToInt64(op2.AuxInt)
32539 p2 := op2.Args[0]
32540 d2 := m2.Args[1]
32541 m3 := m2.Args[2]
32542 if m3.Op != OpStore {
32543 break
32544 }
32545 t3 := auxToType(m3.Aux)
32546 _ = m3.Args[2]
32547 op3 := m3.Args[0]
32548 if op3.Op != OpOffPtr {
32549 break
32550 }
32551 o3 := auxIntToInt64(op3.AuxInt)
32552 p3 := op3.Args[0]
32553 d3 := m3.Args[1]
32554 m4 := m3.Args[2]
32555 if m4.Op != OpStore {
32556 break
32557 }
32558 t4 := auxToType(m4.Aux)
32559 _ = m4.Args[2]
32560 op4 := m4.Args[0]
32561 if op4.Op != OpOffPtr || auxIntToInt64(op4.AuxInt) != 0 {
32562 break
32563 }
32564 p4 := op4.Args[0]
32565 d4 := m4.Args[1]
32566 m5 := m4.Args[2]
32567 if m5.Op != OpZero {
32568 break
32569 }
32570 n := auxIntToInt64(m5.AuxInt)
32571 mem := m5.Args[1]
32572 p5 := m5.Args[0]
32573 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)) {
32574 break
32575 }
32576 v.reset(OpStore)
32577 v.Aux = typeToAux(t1)
32578 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32579 v0.Aux = typeToAux(t2)
32580 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32581 v1.Aux = typeToAux(t3)
32582 v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32583 v2.Aux = typeToAux(t4)
32584 v2.AddArg3(op4, d4, mem)
32585 v1.AddArg3(op3, d3, v2)
32586 v0.AddArg3(op2, d2, v1)
32587 v.AddArg3(op1, d1, v0)
32588 return true
32589 }
32590 return false
32591 }
32592 func rewriteValuegeneric_OpStringLen(v *Value) bool {
32593 v_0 := v.Args[0]
32594
32595
32596 for {
32597 if v_0.Op != OpStringMake {
32598 break
32599 }
32600 _ = v_0.Args[1]
32601 v_0_1 := v_0.Args[1]
32602 if v_0_1.Op != OpConst64 {
32603 break
32604 }
32605 t := v_0_1.Type
32606 c := auxIntToInt64(v_0_1.AuxInt)
32607 v.reset(OpConst64)
32608 v.Type = t
32609 v.AuxInt = int64ToAuxInt(c)
32610 return true
32611 }
32612 return false
32613 }
32614 func rewriteValuegeneric_OpStringPtr(v *Value) bool {
32615 v_0 := v.Args[0]
32616
32617
32618 for {
32619 if v_0.Op != OpStringMake {
32620 break
32621 }
32622 v_0_0 := v_0.Args[0]
32623 if v_0_0.Op != OpAddr {
32624 break
32625 }
32626 t := v_0_0.Type
32627 s := auxToSym(v_0_0.Aux)
32628 base := v_0_0.Args[0]
32629 v.reset(OpAddr)
32630 v.Type = t
32631 v.Aux = symToAux(s)
32632 v.AddArg(base)
32633 return true
32634 }
32635 return false
32636 }
32637 func rewriteValuegeneric_OpStructSelect(v *Value) bool {
32638 v_0 := v.Args[0]
32639 b := v.Block
32640
32641
32642 for {
32643 i := auxIntToInt64(v.AuxInt)
32644 x := v_0
32645 if x.Op != OpStructMake {
32646 break
32647 }
32648 v.copyOf(x.Args[i])
32649 return true
32650 }
32651
32652
32653
32654 for {
32655 i := auxIntToInt64(v.AuxInt)
32656 x := v_0
32657 if x.Op != OpLoad {
32658 break
32659 }
32660 t := x.Type
32661 mem := x.Args[1]
32662 ptr := x.Args[0]
32663 if !(!CanSSA(t)) {
32664 break
32665 }
32666 b = x.Block
32667 v0 := b.NewValue0(v.Pos, OpLoad, v.Type)
32668 v.copyOf(v0)
32669 v1 := b.NewValue0(v.Pos, OpOffPtr, v.Type.PtrTo())
32670 v1.AuxInt = int64ToAuxInt(t.FieldOff(int(i)))
32671 v1.AddArg(ptr)
32672 v0.AddArg2(v1, mem)
32673 return true
32674 }
32675
32676
32677
32678 for {
32679 if v_0.Op != OpIData {
32680 break
32681 }
32682 x := v_0.Args[0]
32683 if !(v.Type.Size() > 0) {
32684 break
32685 }
32686 v.reset(OpIData)
32687 v.AddArg(x)
32688 return true
32689 }
32690
32691
32692
32693 for {
32694 if v_0.Op != OpIData {
32695 break
32696 }
32697 if !(v.Type.Size() == 0 && v.Type.IsStruct()) {
32698 break
32699 }
32700 v.reset(OpStructMake)
32701 return true
32702 }
32703
32704
32705
32706 for {
32707 if v_0.Op != OpIData {
32708 break
32709 }
32710 if !(v.Type.Size() == 0 && v.Type.IsArray()) {
32711 break
32712 }
32713 v.reset(OpArrayMake0)
32714 return true
32715 }
32716 return false
32717 }
32718 func rewriteValuegeneric_OpSub16(v *Value) bool {
32719 v_1 := v.Args[1]
32720 v_0 := v.Args[0]
32721 b := v.Block
32722
32723
32724 for {
32725 if v_0.Op != OpConst16 {
32726 break
32727 }
32728 c := auxIntToInt16(v_0.AuxInt)
32729 if v_1.Op != OpConst16 {
32730 break
32731 }
32732 d := auxIntToInt16(v_1.AuxInt)
32733 v.reset(OpConst16)
32734 v.AuxInt = int16ToAuxInt(c - d)
32735 return true
32736 }
32737
32738
32739
32740 for {
32741 x := v_0
32742 if v_1.Op != OpConst16 {
32743 break
32744 }
32745 t := v_1.Type
32746 c := auxIntToInt16(v_1.AuxInt)
32747 if !(x.Op != OpConst16) {
32748 break
32749 }
32750 v.reset(OpAdd16)
32751 v0 := b.NewValue0(v.Pos, OpConst16, t)
32752 v0.AuxInt = int16ToAuxInt(-c)
32753 v.AddArg2(v0, x)
32754 return true
32755 }
32756
32757
32758 for {
32759 t := v.Type
32760 if v_0.Op != OpMul16 {
32761 break
32762 }
32763 _ = v_0.Args[1]
32764 v_0_0 := v_0.Args[0]
32765 v_0_1 := v_0.Args[1]
32766 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32767 x := v_0_0
32768 y := v_0_1
32769 if v_1.Op != OpMul16 {
32770 continue
32771 }
32772 _ = v_1.Args[1]
32773 v_1_0 := v_1.Args[0]
32774 v_1_1 := v_1.Args[1]
32775 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
32776 if x != v_1_0 {
32777 continue
32778 }
32779 z := v_1_1
32780 v.reset(OpMul16)
32781 v0 := b.NewValue0(v.Pos, OpSub16, t)
32782 v0.AddArg2(y, z)
32783 v.AddArg2(x, v0)
32784 return true
32785 }
32786 }
32787 break
32788 }
32789
32790
32791 for {
32792 x := v_0
32793 if x != v_1 {
32794 break
32795 }
32796 v.reset(OpConst16)
32797 v.AuxInt = int16ToAuxInt(0)
32798 return true
32799 }
32800
32801
32802 for {
32803 if v_0.Op != OpNeg16 {
32804 break
32805 }
32806 x := v_0.Args[0]
32807 if v_1.Op != OpCom16 || x != v_1.Args[0] {
32808 break
32809 }
32810 v.reset(OpConst16)
32811 v.AuxInt = int16ToAuxInt(1)
32812 return true
32813 }
32814
32815
32816 for {
32817 if v_0.Op != OpCom16 {
32818 break
32819 }
32820 x := v_0.Args[0]
32821 if v_1.Op != OpNeg16 || x != v_1.Args[0] {
32822 break
32823 }
32824 v.reset(OpConst16)
32825 v.AuxInt = int16ToAuxInt(-1)
32826 return true
32827 }
32828
32829
32830 for {
32831 if v_0.Op != OpAdd16 {
32832 break
32833 }
32834 _ = v_0.Args[1]
32835 v_0_0 := v_0.Args[0]
32836 v_0_1 := v_0.Args[1]
32837 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32838 t := v_0_0
32839 x := v_0_1
32840 if v_1.Op != OpAdd16 {
32841 continue
32842 }
32843 _ = v_1.Args[1]
32844 v_1_0 := v_1.Args[0]
32845 v_1_1 := v_1.Args[1]
32846 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
32847 if t != v_1_0 {
32848 continue
32849 }
32850 y := v_1_1
32851 v.reset(OpSub16)
32852 v.AddArg2(x, y)
32853 return true
32854 }
32855 }
32856 break
32857 }
32858
32859
32860 for {
32861 if v_0.Op != OpAdd16 {
32862 break
32863 }
32864 _ = v_0.Args[1]
32865 v_0_0 := v_0.Args[0]
32866 v_0_1 := v_0.Args[1]
32867 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32868 x := v_0_0
32869 y := v_0_1
32870 if x != v_1 {
32871 continue
32872 }
32873 v.copyOf(y)
32874 return true
32875 }
32876 break
32877 }
32878
32879
32880 for {
32881 if v_0.Op != OpAdd16 {
32882 break
32883 }
32884 _ = v_0.Args[1]
32885 v_0_0 := v_0.Args[0]
32886 v_0_1 := v_0.Args[1]
32887 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32888 x := v_0_0
32889 y := v_0_1
32890 if y != v_1 {
32891 continue
32892 }
32893 v.copyOf(x)
32894 return true
32895 }
32896 break
32897 }
32898
32899
32900 for {
32901 if v_0.Op != OpSub16 {
32902 break
32903 }
32904 y := v_0.Args[1]
32905 x := v_0.Args[0]
32906 if x != v_1 {
32907 break
32908 }
32909 v.reset(OpNeg16)
32910 v.AddArg(y)
32911 return true
32912 }
32913
32914
32915 for {
32916 x := v_0
32917 if v_1.Op != OpAdd16 {
32918 break
32919 }
32920 _ = v_1.Args[1]
32921 v_1_0 := v_1.Args[0]
32922 v_1_1 := v_1.Args[1]
32923 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
32924 if x != v_1_0 {
32925 continue
32926 }
32927 y := v_1_1
32928 v.reset(OpNeg16)
32929 v.AddArg(y)
32930 return true
32931 }
32932 break
32933 }
32934
32935
32936
32937 for {
32938 x := v_0
32939 if v_1.Op != OpSub16 {
32940 break
32941 }
32942 z := v_1.Args[1]
32943 i := v_1.Args[0]
32944 if i.Op != OpConst16 {
32945 break
32946 }
32947 t := i.Type
32948 if !(z.Op != OpConst16 && x.Op != OpConst16) {
32949 break
32950 }
32951 v.reset(OpSub16)
32952 v0 := b.NewValue0(v.Pos, OpAdd16, t)
32953 v0.AddArg2(x, z)
32954 v.AddArg2(v0, i)
32955 return true
32956 }
32957
32958
32959
32960 for {
32961 x := v_0
32962 if v_1.Op != OpAdd16 {
32963 break
32964 }
32965 _ = v_1.Args[1]
32966 v_1_0 := v_1.Args[0]
32967 v_1_1 := v_1.Args[1]
32968 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
32969 z := v_1_0
32970 i := v_1_1
32971 if i.Op != OpConst16 {
32972 continue
32973 }
32974 t := i.Type
32975 if !(z.Op != OpConst16 && x.Op != OpConst16) {
32976 continue
32977 }
32978 v.reset(OpSub16)
32979 v0 := b.NewValue0(v.Pos, OpSub16, t)
32980 v0.AddArg2(x, z)
32981 v.AddArg2(v0, i)
32982 return true
32983 }
32984 break
32985 }
32986
32987
32988
32989 for {
32990 if v_0.Op != OpSub16 {
32991 break
32992 }
32993 z := v_0.Args[1]
32994 i := v_0.Args[0]
32995 if i.Op != OpConst16 {
32996 break
32997 }
32998 t := i.Type
32999 x := v_1
33000 if !(z.Op != OpConst16 && x.Op != OpConst16) {
33001 break
33002 }
33003 v.reset(OpSub16)
33004 v0 := b.NewValue0(v.Pos, OpAdd16, t)
33005 v0.AddArg2(z, x)
33006 v.AddArg2(i, v0)
33007 return true
33008 }
33009
33010
33011
33012 for {
33013 if v_0.Op != OpAdd16 {
33014 break
33015 }
33016 _ = v_0.Args[1]
33017 v_0_0 := v_0.Args[0]
33018 v_0_1 := v_0.Args[1]
33019 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33020 z := v_0_0
33021 i := v_0_1
33022 if i.Op != OpConst16 {
33023 continue
33024 }
33025 t := i.Type
33026 x := v_1
33027 if !(z.Op != OpConst16 && x.Op != OpConst16) {
33028 continue
33029 }
33030 v.reset(OpAdd16)
33031 v0 := b.NewValue0(v.Pos, OpSub16, t)
33032 v0.AddArg2(z, x)
33033 v.AddArg2(i, v0)
33034 return true
33035 }
33036 break
33037 }
33038
33039
33040 for {
33041 if v_0.Op != OpConst16 {
33042 break
33043 }
33044 t := v_0.Type
33045 c := auxIntToInt16(v_0.AuxInt)
33046 if v_1.Op != OpSub16 {
33047 break
33048 }
33049 x := v_1.Args[1]
33050 v_1_0 := v_1.Args[0]
33051 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
33052 break
33053 }
33054 d := auxIntToInt16(v_1_0.AuxInt)
33055 v.reset(OpAdd16)
33056 v0 := b.NewValue0(v.Pos, OpConst16, t)
33057 v0.AuxInt = int16ToAuxInt(c - d)
33058 v.AddArg2(v0, x)
33059 return true
33060 }
33061
33062
33063 for {
33064 if v_0.Op != OpConst16 {
33065 break
33066 }
33067 t := v_0.Type
33068 c := auxIntToInt16(v_0.AuxInt)
33069 if v_1.Op != OpAdd16 {
33070 break
33071 }
33072 _ = v_1.Args[1]
33073 v_1_0 := v_1.Args[0]
33074 v_1_1 := v_1.Args[1]
33075 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33076 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
33077 continue
33078 }
33079 d := auxIntToInt16(v_1_0.AuxInt)
33080 x := v_1_1
33081 v.reset(OpSub16)
33082 v0 := b.NewValue0(v.Pos, OpConst16, t)
33083 v0.AuxInt = int16ToAuxInt(c - d)
33084 v.AddArg2(v0, x)
33085 return true
33086 }
33087 break
33088 }
33089 return false
33090 }
33091 func rewriteValuegeneric_OpSub32(v *Value) bool {
33092 v_1 := v.Args[1]
33093 v_0 := v.Args[0]
33094 b := v.Block
33095
33096
33097 for {
33098 if v_0.Op != OpConst32 {
33099 break
33100 }
33101 c := auxIntToInt32(v_0.AuxInt)
33102 if v_1.Op != OpConst32 {
33103 break
33104 }
33105 d := auxIntToInt32(v_1.AuxInt)
33106 v.reset(OpConst32)
33107 v.AuxInt = int32ToAuxInt(c - d)
33108 return true
33109 }
33110
33111
33112
33113 for {
33114 x := v_0
33115 if v_1.Op != OpConst32 {
33116 break
33117 }
33118 t := v_1.Type
33119 c := auxIntToInt32(v_1.AuxInt)
33120 if !(x.Op != OpConst32) {
33121 break
33122 }
33123 v.reset(OpAdd32)
33124 v0 := b.NewValue0(v.Pos, OpConst32, t)
33125 v0.AuxInt = int32ToAuxInt(-c)
33126 v.AddArg2(v0, x)
33127 return true
33128 }
33129
33130
33131 for {
33132 t := v.Type
33133 if v_0.Op != OpMul32 {
33134 break
33135 }
33136 _ = v_0.Args[1]
33137 v_0_0 := v_0.Args[0]
33138 v_0_1 := v_0.Args[1]
33139 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33140 x := v_0_0
33141 y := v_0_1
33142 if v_1.Op != OpMul32 {
33143 continue
33144 }
33145 _ = v_1.Args[1]
33146 v_1_0 := v_1.Args[0]
33147 v_1_1 := v_1.Args[1]
33148 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33149 if x != v_1_0 {
33150 continue
33151 }
33152 z := v_1_1
33153 v.reset(OpMul32)
33154 v0 := b.NewValue0(v.Pos, OpSub32, t)
33155 v0.AddArg2(y, z)
33156 v.AddArg2(x, v0)
33157 return true
33158 }
33159 }
33160 break
33161 }
33162
33163
33164 for {
33165 x := v_0
33166 if x != v_1 {
33167 break
33168 }
33169 v.reset(OpConst32)
33170 v.AuxInt = int32ToAuxInt(0)
33171 return true
33172 }
33173
33174
33175 for {
33176 if v_0.Op != OpNeg32 {
33177 break
33178 }
33179 x := v_0.Args[0]
33180 if v_1.Op != OpCom32 || x != v_1.Args[0] {
33181 break
33182 }
33183 v.reset(OpConst32)
33184 v.AuxInt = int32ToAuxInt(1)
33185 return true
33186 }
33187
33188
33189 for {
33190 if v_0.Op != OpCom32 {
33191 break
33192 }
33193 x := v_0.Args[0]
33194 if v_1.Op != OpNeg32 || x != v_1.Args[0] {
33195 break
33196 }
33197 v.reset(OpConst32)
33198 v.AuxInt = int32ToAuxInt(-1)
33199 return true
33200 }
33201
33202
33203 for {
33204 if v_0.Op != OpAdd32 {
33205 break
33206 }
33207 _ = v_0.Args[1]
33208 v_0_0 := v_0.Args[0]
33209 v_0_1 := v_0.Args[1]
33210 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33211 t := v_0_0
33212 x := v_0_1
33213 if v_1.Op != OpAdd32 {
33214 continue
33215 }
33216 _ = v_1.Args[1]
33217 v_1_0 := v_1.Args[0]
33218 v_1_1 := v_1.Args[1]
33219 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33220 if t != v_1_0 {
33221 continue
33222 }
33223 y := v_1_1
33224 v.reset(OpSub32)
33225 v.AddArg2(x, y)
33226 return true
33227 }
33228 }
33229 break
33230 }
33231
33232
33233 for {
33234 if v_0.Op != OpAdd32 {
33235 break
33236 }
33237 _ = v_0.Args[1]
33238 v_0_0 := v_0.Args[0]
33239 v_0_1 := v_0.Args[1]
33240 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33241 x := v_0_0
33242 y := v_0_1
33243 if x != v_1 {
33244 continue
33245 }
33246 v.copyOf(y)
33247 return true
33248 }
33249 break
33250 }
33251
33252
33253 for {
33254 if v_0.Op != OpAdd32 {
33255 break
33256 }
33257 _ = v_0.Args[1]
33258 v_0_0 := v_0.Args[0]
33259 v_0_1 := v_0.Args[1]
33260 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33261 x := v_0_0
33262 y := v_0_1
33263 if y != v_1 {
33264 continue
33265 }
33266 v.copyOf(x)
33267 return true
33268 }
33269 break
33270 }
33271
33272
33273 for {
33274 if v_0.Op != OpSub32 {
33275 break
33276 }
33277 y := v_0.Args[1]
33278 x := v_0.Args[0]
33279 if x != v_1 {
33280 break
33281 }
33282 v.reset(OpNeg32)
33283 v.AddArg(y)
33284 return true
33285 }
33286
33287
33288 for {
33289 x := v_0
33290 if v_1.Op != OpAdd32 {
33291 break
33292 }
33293 _ = v_1.Args[1]
33294 v_1_0 := v_1.Args[0]
33295 v_1_1 := v_1.Args[1]
33296 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33297 if x != v_1_0 {
33298 continue
33299 }
33300 y := v_1_1
33301 v.reset(OpNeg32)
33302 v.AddArg(y)
33303 return true
33304 }
33305 break
33306 }
33307
33308
33309
33310 for {
33311 x := v_0
33312 if v_1.Op != OpSub32 {
33313 break
33314 }
33315 z := v_1.Args[1]
33316 i := v_1.Args[0]
33317 if i.Op != OpConst32 {
33318 break
33319 }
33320 t := i.Type
33321 if !(z.Op != OpConst32 && x.Op != OpConst32) {
33322 break
33323 }
33324 v.reset(OpSub32)
33325 v0 := b.NewValue0(v.Pos, OpAdd32, t)
33326 v0.AddArg2(x, z)
33327 v.AddArg2(v0, i)
33328 return true
33329 }
33330
33331
33332
33333 for {
33334 x := v_0
33335 if v_1.Op != OpAdd32 {
33336 break
33337 }
33338 _ = v_1.Args[1]
33339 v_1_0 := v_1.Args[0]
33340 v_1_1 := v_1.Args[1]
33341 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33342 z := v_1_0
33343 i := v_1_1
33344 if i.Op != OpConst32 {
33345 continue
33346 }
33347 t := i.Type
33348 if !(z.Op != OpConst32 && x.Op != OpConst32) {
33349 continue
33350 }
33351 v.reset(OpSub32)
33352 v0 := b.NewValue0(v.Pos, OpSub32, t)
33353 v0.AddArg2(x, z)
33354 v.AddArg2(v0, i)
33355 return true
33356 }
33357 break
33358 }
33359
33360
33361
33362 for {
33363 if v_0.Op != OpSub32 {
33364 break
33365 }
33366 z := v_0.Args[1]
33367 i := v_0.Args[0]
33368 if i.Op != OpConst32 {
33369 break
33370 }
33371 t := i.Type
33372 x := v_1
33373 if !(z.Op != OpConst32 && x.Op != OpConst32) {
33374 break
33375 }
33376 v.reset(OpSub32)
33377 v0 := b.NewValue0(v.Pos, OpAdd32, t)
33378 v0.AddArg2(z, x)
33379 v.AddArg2(i, v0)
33380 return true
33381 }
33382
33383
33384
33385 for {
33386 if v_0.Op != OpAdd32 {
33387 break
33388 }
33389 _ = v_0.Args[1]
33390 v_0_0 := v_0.Args[0]
33391 v_0_1 := v_0.Args[1]
33392 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33393 z := v_0_0
33394 i := v_0_1
33395 if i.Op != OpConst32 {
33396 continue
33397 }
33398 t := i.Type
33399 x := v_1
33400 if !(z.Op != OpConst32 && x.Op != OpConst32) {
33401 continue
33402 }
33403 v.reset(OpAdd32)
33404 v0 := b.NewValue0(v.Pos, OpSub32, t)
33405 v0.AddArg2(z, x)
33406 v.AddArg2(i, v0)
33407 return true
33408 }
33409 break
33410 }
33411
33412
33413 for {
33414 if v_0.Op != OpConst32 {
33415 break
33416 }
33417 t := v_0.Type
33418 c := auxIntToInt32(v_0.AuxInt)
33419 if v_1.Op != OpSub32 {
33420 break
33421 }
33422 x := v_1.Args[1]
33423 v_1_0 := v_1.Args[0]
33424 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
33425 break
33426 }
33427 d := auxIntToInt32(v_1_0.AuxInt)
33428 v.reset(OpAdd32)
33429 v0 := b.NewValue0(v.Pos, OpConst32, t)
33430 v0.AuxInt = int32ToAuxInt(c - d)
33431 v.AddArg2(v0, x)
33432 return true
33433 }
33434
33435
33436 for {
33437 if v_0.Op != OpConst32 {
33438 break
33439 }
33440 t := v_0.Type
33441 c := auxIntToInt32(v_0.AuxInt)
33442 if v_1.Op != OpAdd32 {
33443 break
33444 }
33445 _ = v_1.Args[1]
33446 v_1_0 := v_1.Args[0]
33447 v_1_1 := v_1.Args[1]
33448 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33449 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
33450 continue
33451 }
33452 d := auxIntToInt32(v_1_0.AuxInt)
33453 x := v_1_1
33454 v.reset(OpSub32)
33455 v0 := b.NewValue0(v.Pos, OpConst32, t)
33456 v0.AuxInt = int32ToAuxInt(c - d)
33457 v.AddArg2(v0, x)
33458 return true
33459 }
33460 break
33461 }
33462 return false
33463 }
33464 func rewriteValuegeneric_OpSub32F(v *Value) bool {
33465 v_1 := v.Args[1]
33466 v_0 := v.Args[0]
33467
33468
33469
33470 for {
33471 if v_0.Op != OpConst32F {
33472 break
33473 }
33474 c := auxIntToFloat32(v_0.AuxInt)
33475 if v_1.Op != OpConst32F {
33476 break
33477 }
33478 d := auxIntToFloat32(v_1.AuxInt)
33479 if !(c-d == c-d) {
33480 break
33481 }
33482 v.reset(OpConst32F)
33483 v.AuxInt = float32ToAuxInt(c - d)
33484 return true
33485 }
33486 return false
33487 }
33488 func rewriteValuegeneric_OpSub64(v *Value) bool {
33489 v_1 := v.Args[1]
33490 v_0 := v.Args[0]
33491 b := v.Block
33492
33493
33494 for {
33495 if v_0.Op != OpConst64 {
33496 break
33497 }
33498 c := auxIntToInt64(v_0.AuxInt)
33499 if v_1.Op != OpConst64 {
33500 break
33501 }
33502 d := auxIntToInt64(v_1.AuxInt)
33503 v.reset(OpConst64)
33504 v.AuxInt = int64ToAuxInt(c - d)
33505 return true
33506 }
33507
33508
33509
33510 for {
33511 x := v_0
33512 if v_1.Op != OpConst64 {
33513 break
33514 }
33515 t := v_1.Type
33516 c := auxIntToInt64(v_1.AuxInt)
33517 if !(x.Op != OpConst64) {
33518 break
33519 }
33520 v.reset(OpAdd64)
33521 v0 := b.NewValue0(v.Pos, OpConst64, t)
33522 v0.AuxInt = int64ToAuxInt(-c)
33523 v.AddArg2(v0, x)
33524 return true
33525 }
33526
33527
33528 for {
33529 t := v.Type
33530 if v_0.Op != OpMul64 {
33531 break
33532 }
33533 _ = v_0.Args[1]
33534 v_0_0 := v_0.Args[0]
33535 v_0_1 := v_0.Args[1]
33536 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33537 x := v_0_0
33538 y := v_0_1
33539 if v_1.Op != OpMul64 {
33540 continue
33541 }
33542 _ = v_1.Args[1]
33543 v_1_0 := v_1.Args[0]
33544 v_1_1 := v_1.Args[1]
33545 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33546 if x != v_1_0 {
33547 continue
33548 }
33549 z := v_1_1
33550 v.reset(OpMul64)
33551 v0 := b.NewValue0(v.Pos, OpSub64, t)
33552 v0.AddArg2(y, z)
33553 v.AddArg2(x, v0)
33554 return true
33555 }
33556 }
33557 break
33558 }
33559
33560
33561 for {
33562 x := v_0
33563 if x != v_1 {
33564 break
33565 }
33566 v.reset(OpConst64)
33567 v.AuxInt = int64ToAuxInt(0)
33568 return true
33569 }
33570
33571
33572 for {
33573 if v_0.Op != OpNeg64 {
33574 break
33575 }
33576 x := v_0.Args[0]
33577 if v_1.Op != OpCom64 || x != v_1.Args[0] {
33578 break
33579 }
33580 v.reset(OpConst64)
33581 v.AuxInt = int64ToAuxInt(1)
33582 return true
33583 }
33584
33585
33586 for {
33587 if v_0.Op != OpCom64 {
33588 break
33589 }
33590 x := v_0.Args[0]
33591 if v_1.Op != OpNeg64 || x != v_1.Args[0] {
33592 break
33593 }
33594 v.reset(OpConst64)
33595 v.AuxInt = int64ToAuxInt(-1)
33596 return true
33597 }
33598
33599
33600 for {
33601 if v_0.Op != OpAdd64 {
33602 break
33603 }
33604 _ = v_0.Args[1]
33605 v_0_0 := v_0.Args[0]
33606 v_0_1 := v_0.Args[1]
33607 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33608 t := v_0_0
33609 x := v_0_1
33610 if v_1.Op != OpAdd64 {
33611 continue
33612 }
33613 _ = v_1.Args[1]
33614 v_1_0 := v_1.Args[0]
33615 v_1_1 := v_1.Args[1]
33616 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33617 if t != v_1_0 {
33618 continue
33619 }
33620 y := v_1_1
33621 v.reset(OpSub64)
33622 v.AddArg2(x, y)
33623 return true
33624 }
33625 }
33626 break
33627 }
33628
33629
33630 for {
33631 if v_0.Op != OpAdd64 {
33632 break
33633 }
33634 _ = v_0.Args[1]
33635 v_0_0 := v_0.Args[0]
33636 v_0_1 := v_0.Args[1]
33637 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33638 x := v_0_0
33639 y := v_0_1
33640 if x != v_1 {
33641 continue
33642 }
33643 v.copyOf(y)
33644 return true
33645 }
33646 break
33647 }
33648
33649
33650 for {
33651 if v_0.Op != OpAdd64 {
33652 break
33653 }
33654 _ = v_0.Args[1]
33655 v_0_0 := v_0.Args[0]
33656 v_0_1 := v_0.Args[1]
33657 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33658 x := v_0_0
33659 y := v_0_1
33660 if y != v_1 {
33661 continue
33662 }
33663 v.copyOf(x)
33664 return true
33665 }
33666 break
33667 }
33668
33669
33670 for {
33671 if v_0.Op != OpSub64 {
33672 break
33673 }
33674 y := v_0.Args[1]
33675 x := v_0.Args[0]
33676 if x != v_1 {
33677 break
33678 }
33679 v.reset(OpNeg64)
33680 v.AddArg(y)
33681 return true
33682 }
33683
33684
33685 for {
33686 x := v_0
33687 if v_1.Op != OpAdd64 {
33688 break
33689 }
33690 _ = v_1.Args[1]
33691 v_1_0 := v_1.Args[0]
33692 v_1_1 := v_1.Args[1]
33693 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33694 if x != v_1_0 {
33695 continue
33696 }
33697 y := v_1_1
33698 v.reset(OpNeg64)
33699 v.AddArg(y)
33700 return true
33701 }
33702 break
33703 }
33704
33705
33706
33707 for {
33708 x := v_0
33709 if v_1.Op != OpSub64 {
33710 break
33711 }
33712 z := v_1.Args[1]
33713 i := v_1.Args[0]
33714 if i.Op != OpConst64 {
33715 break
33716 }
33717 t := i.Type
33718 if !(z.Op != OpConst64 && x.Op != OpConst64) {
33719 break
33720 }
33721 v.reset(OpSub64)
33722 v0 := b.NewValue0(v.Pos, OpAdd64, t)
33723 v0.AddArg2(x, z)
33724 v.AddArg2(v0, i)
33725 return true
33726 }
33727
33728
33729
33730 for {
33731 x := v_0
33732 if v_1.Op != OpAdd64 {
33733 break
33734 }
33735 _ = v_1.Args[1]
33736 v_1_0 := v_1.Args[0]
33737 v_1_1 := v_1.Args[1]
33738 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33739 z := v_1_0
33740 i := v_1_1
33741 if i.Op != OpConst64 {
33742 continue
33743 }
33744 t := i.Type
33745 if !(z.Op != OpConst64 && x.Op != OpConst64) {
33746 continue
33747 }
33748 v.reset(OpSub64)
33749 v0 := b.NewValue0(v.Pos, OpSub64, t)
33750 v0.AddArg2(x, z)
33751 v.AddArg2(v0, i)
33752 return true
33753 }
33754 break
33755 }
33756
33757
33758
33759 for {
33760 if v_0.Op != OpSub64 {
33761 break
33762 }
33763 z := v_0.Args[1]
33764 i := v_0.Args[0]
33765 if i.Op != OpConst64 {
33766 break
33767 }
33768 t := i.Type
33769 x := v_1
33770 if !(z.Op != OpConst64 && x.Op != OpConst64) {
33771 break
33772 }
33773 v.reset(OpSub64)
33774 v0 := b.NewValue0(v.Pos, OpAdd64, t)
33775 v0.AddArg2(z, x)
33776 v.AddArg2(i, v0)
33777 return true
33778 }
33779
33780
33781
33782 for {
33783 if v_0.Op != OpAdd64 {
33784 break
33785 }
33786 _ = v_0.Args[1]
33787 v_0_0 := v_0.Args[0]
33788 v_0_1 := v_0.Args[1]
33789 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33790 z := v_0_0
33791 i := v_0_1
33792 if i.Op != OpConst64 {
33793 continue
33794 }
33795 t := i.Type
33796 x := v_1
33797 if !(z.Op != OpConst64 && x.Op != OpConst64) {
33798 continue
33799 }
33800 v.reset(OpAdd64)
33801 v0 := b.NewValue0(v.Pos, OpSub64, t)
33802 v0.AddArg2(z, x)
33803 v.AddArg2(i, v0)
33804 return true
33805 }
33806 break
33807 }
33808
33809
33810 for {
33811 if v_0.Op != OpConst64 {
33812 break
33813 }
33814 t := v_0.Type
33815 c := auxIntToInt64(v_0.AuxInt)
33816 if v_1.Op != OpSub64 {
33817 break
33818 }
33819 x := v_1.Args[1]
33820 v_1_0 := v_1.Args[0]
33821 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
33822 break
33823 }
33824 d := auxIntToInt64(v_1_0.AuxInt)
33825 v.reset(OpAdd64)
33826 v0 := b.NewValue0(v.Pos, OpConst64, t)
33827 v0.AuxInt = int64ToAuxInt(c - d)
33828 v.AddArg2(v0, x)
33829 return true
33830 }
33831
33832
33833 for {
33834 if v_0.Op != OpConst64 {
33835 break
33836 }
33837 t := v_0.Type
33838 c := auxIntToInt64(v_0.AuxInt)
33839 if v_1.Op != OpAdd64 {
33840 break
33841 }
33842 _ = v_1.Args[1]
33843 v_1_0 := v_1.Args[0]
33844 v_1_1 := v_1.Args[1]
33845 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33846 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
33847 continue
33848 }
33849 d := auxIntToInt64(v_1_0.AuxInt)
33850 x := v_1_1
33851 v.reset(OpSub64)
33852 v0 := b.NewValue0(v.Pos, OpConst64, t)
33853 v0.AuxInt = int64ToAuxInt(c - d)
33854 v.AddArg2(v0, x)
33855 return true
33856 }
33857 break
33858 }
33859 return false
33860 }
33861 func rewriteValuegeneric_OpSub64F(v *Value) bool {
33862 v_1 := v.Args[1]
33863 v_0 := v.Args[0]
33864
33865
33866
33867 for {
33868 if v_0.Op != OpConst64F {
33869 break
33870 }
33871 c := auxIntToFloat64(v_0.AuxInt)
33872 if v_1.Op != OpConst64F {
33873 break
33874 }
33875 d := auxIntToFloat64(v_1.AuxInt)
33876 if !(c-d == c-d) {
33877 break
33878 }
33879 v.reset(OpConst64F)
33880 v.AuxInt = float64ToAuxInt(c - d)
33881 return true
33882 }
33883 return false
33884 }
33885 func rewriteValuegeneric_OpSub8(v *Value) bool {
33886 v_1 := v.Args[1]
33887 v_0 := v.Args[0]
33888 b := v.Block
33889
33890
33891 for {
33892 if v_0.Op != OpConst8 {
33893 break
33894 }
33895 c := auxIntToInt8(v_0.AuxInt)
33896 if v_1.Op != OpConst8 {
33897 break
33898 }
33899 d := auxIntToInt8(v_1.AuxInt)
33900 v.reset(OpConst8)
33901 v.AuxInt = int8ToAuxInt(c - d)
33902 return true
33903 }
33904
33905
33906
33907 for {
33908 x := v_0
33909 if v_1.Op != OpConst8 {
33910 break
33911 }
33912 t := v_1.Type
33913 c := auxIntToInt8(v_1.AuxInt)
33914 if !(x.Op != OpConst8) {
33915 break
33916 }
33917 v.reset(OpAdd8)
33918 v0 := b.NewValue0(v.Pos, OpConst8, t)
33919 v0.AuxInt = int8ToAuxInt(-c)
33920 v.AddArg2(v0, x)
33921 return true
33922 }
33923
33924
33925 for {
33926 t := v.Type
33927 if v_0.Op != OpMul8 {
33928 break
33929 }
33930 _ = v_0.Args[1]
33931 v_0_0 := v_0.Args[0]
33932 v_0_1 := v_0.Args[1]
33933 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33934 x := v_0_0
33935 y := v_0_1
33936 if v_1.Op != OpMul8 {
33937 continue
33938 }
33939 _ = v_1.Args[1]
33940 v_1_0 := v_1.Args[0]
33941 v_1_1 := v_1.Args[1]
33942 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33943 if x != v_1_0 {
33944 continue
33945 }
33946 z := v_1_1
33947 v.reset(OpMul8)
33948 v0 := b.NewValue0(v.Pos, OpSub8, t)
33949 v0.AddArg2(y, z)
33950 v.AddArg2(x, v0)
33951 return true
33952 }
33953 }
33954 break
33955 }
33956
33957
33958 for {
33959 x := v_0
33960 if x != v_1 {
33961 break
33962 }
33963 v.reset(OpConst8)
33964 v.AuxInt = int8ToAuxInt(0)
33965 return true
33966 }
33967
33968
33969 for {
33970 if v_0.Op != OpNeg8 {
33971 break
33972 }
33973 x := v_0.Args[0]
33974 if v_1.Op != OpCom8 || x != v_1.Args[0] {
33975 break
33976 }
33977 v.reset(OpConst8)
33978 v.AuxInt = int8ToAuxInt(1)
33979 return true
33980 }
33981
33982
33983 for {
33984 if v_0.Op != OpCom8 {
33985 break
33986 }
33987 x := v_0.Args[0]
33988 if v_1.Op != OpNeg8 || x != v_1.Args[0] {
33989 break
33990 }
33991 v.reset(OpConst8)
33992 v.AuxInt = int8ToAuxInt(-1)
33993 return true
33994 }
33995
33996
33997 for {
33998 if v_0.Op != OpAdd8 {
33999 break
34000 }
34001 _ = v_0.Args[1]
34002 v_0_0 := v_0.Args[0]
34003 v_0_1 := v_0.Args[1]
34004 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34005 t := v_0_0
34006 x := v_0_1
34007 if v_1.Op != OpAdd8 {
34008 continue
34009 }
34010 _ = v_1.Args[1]
34011 v_1_0 := v_1.Args[0]
34012 v_1_1 := v_1.Args[1]
34013 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34014 if t != v_1_0 {
34015 continue
34016 }
34017 y := v_1_1
34018 v.reset(OpSub8)
34019 v.AddArg2(x, y)
34020 return true
34021 }
34022 }
34023 break
34024 }
34025
34026
34027 for {
34028 if v_0.Op != OpAdd8 {
34029 break
34030 }
34031 _ = v_0.Args[1]
34032 v_0_0 := v_0.Args[0]
34033 v_0_1 := v_0.Args[1]
34034 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34035 x := v_0_0
34036 y := v_0_1
34037 if x != v_1 {
34038 continue
34039 }
34040 v.copyOf(y)
34041 return true
34042 }
34043 break
34044 }
34045
34046
34047 for {
34048 if v_0.Op != OpAdd8 {
34049 break
34050 }
34051 _ = v_0.Args[1]
34052 v_0_0 := v_0.Args[0]
34053 v_0_1 := v_0.Args[1]
34054 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34055 x := v_0_0
34056 y := v_0_1
34057 if y != v_1 {
34058 continue
34059 }
34060 v.copyOf(x)
34061 return true
34062 }
34063 break
34064 }
34065
34066
34067 for {
34068 if v_0.Op != OpSub8 {
34069 break
34070 }
34071 y := v_0.Args[1]
34072 x := v_0.Args[0]
34073 if x != v_1 {
34074 break
34075 }
34076 v.reset(OpNeg8)
34077 v.AddArg(y)
34078 return true
34079 }
34080
34081
34082 for {
34083 x := v_0
34084 if v_1.Op != OpAdd8 {
34085 break
34086 }
34087 _ = v_1.Args[1]
34088 v_1_0 := v_1.Args[0]
34089 v_1_1 := v_1.Args[1]
34090 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34091 if x != v_1_0 {
34092 continue
34093 }
34094 y := v_1_1
34095 v.reset(OpNeg8)
34096 v.AddArg(y)
34097 return true
34098 }
34099 break
34100 }
34101
34102
34103
34104 for {
34105 x := v_0
34106 if v_1.Op != OpSub8 {
34107 break
34108 }
34109 z := v_1.Args[1]
34110 i := v_1.Args[0]
34111 if i.Op != OpConst8 {
34112 break
34113 }
34114 t := i.Type
34115 if !(z.Op != OpConst8 && x.Op != OpConst8) {
34116 break
34117 }
34118 v.reset(OpSub8)
34119 v0 := b.NewValue0(v.Pos, OpAdd8, t)
34120 v0.AddArg2(x, z)
34121 v.AddArg2(v0, i)
34122 return true
34123 }
34124
34125
34126
34127 for {
34128 x := v_0
34129 if v_1.Op != OpAdd8 {
34130 break
34131 }
34132 _ = v_1.Args[1]
34133 v_1_0 := v_1.Args[0]
34134 v_1_1 := v_1.Args[1]
34135 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34136 z := v_1_0
34137 i := v_1_1
34138 if i.Op != OpConst8 {
34139 continue
34140 }
34141 t := i.Type
34142 if !(z.Op != OpConst8 && x.Op != OpConst8) {
34143 continue
34144 }
34145 v.reset(OpSub8)
34146 v0 := b.NewValue0(v.Pos, OpSub8, t)
34147 v0.AddArg2(x, z)
34148 v.AddArg2(v0, i)
34149 return true
34150 }
34151 break
34152 }
34153
34154
34155
34156 for {
34157 if v_0.Op != OpSub8 {
34158 break
34159 }
34160 z := v_0.Args[1]
34161 i := v_0.Args[0]
34162 if i.Op != OpConst8 {
34163 break
34164 }
34165 t := i.Type
34166 x := v_1
34167 if !(z.Op != OpConst8 && x.Op != OpConst8) {
34168 break
34169 }
34170 v.reset(OpSub8)
34171 v0 := b.NewValue0(v.Pos, OpAdd8, t)
34172 v0.AddArg2(z, x)
34173 v.AddArg2(i, v0)
34174 return true
34175 }
34176
34177
34178
34179 for {
34180 if v_0.Op != OpAdd8 {
34181 break
34182 }
34183 _ = v_0.Args[1]
34184 v_0_0 := v_0.Args[0]
34185 v_0_1 := v_0.Args[1]
34186 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34187 z := v_0_0
34188 i := v_0_1
34189 if i.Op != OpConst8 {
34190 continue
34191 }
34192 t := i.Type
34193 x := v_1
34194 if !(z.Op != OpConst8 && x.Op != OpConst8) {
34195 continue
34196 }
34197 v.reset(OpAdd8)
34198 v0 := b.NewValue0(v.Pos, OpSub8, t)
34199 v0.AddArg2(z, x)
34200 v.AddArg2(i, v0)
34201 return true
34202 }
34203 break
34204 }
34205
34206
34207 for {
34208 if v_0.Op != OpConst8 {
34209 break
34210 }
34211 t := v_0.Type
34212 c := auxIntToInt8(v_0.AuxInt)
34213 if v_1.Op != OpSub8 {
34214 break
34215 }
34216 x := v_1.Args[1]
34217 v_1_0 := v_1.Args[0]
34218 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
34219 break
34220 }
34221 d := auxIntToInt8(v_1_0.AuxInt)
34222 v.reset(OpAdd8)
34223 v0 := b.NewValue0(v.Pos, OpConst8, t)
34224 v0.AuxInt = int8ToAuxInt(c - d)
34225 v.AddArg2(v0, x)
34226 return true
34227 }
34228
34229
34230 for {
34231 if v_0.Op != OpConst8 {
34232 break
34233 }
34234 t := v_0.Type
34235 c := auxIntToInt8(v_0.AuxInt)
34236 if v_1.Op != OpAdd8 {
34237 break
34238 }
34239 _ = v_1.Args[1]
34240 v_1_0 := v_1.Args[0]
34241 v_1_1 := v_1.Args[1]
34242 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34243 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
34244 continue
34245 }
34246 d := auxIntToInt8(v_1_0.AuxInt)
34247 x := v_1_1
34248 v.reset(OpSub8)
34249 v0 := b.NewValue0(v.Pos, OpConst8, t)
34250 v0.AuxInt = int8ToAuxInt(c - d)
34251 v.AddArg2(v0, x)
34252 return true
34253 }
34254 break
34255 }
34256 return false
34257 }
34258 func rewriteValuegeneric_OpTrunc(v *Value) bool {
34259 v_0 := v.Args[0]
34260
34261
34262 for {
34263 if v_0.Op != OpConst64F {
34264 break
34265 }
34266 c := auxIntToFloat64(v_0.AuxInt)
34267 v.reset(OpConst64F)
34268 v.AuxInt = float64ToAuxInt(math.Trunc(c))
34269 return true
34270 }
34271 return false
34272 }
34273 func rewriteValuegeneric_OpTrunc16to8(v *Value) bool {
34274 v_0 := v.Args[0]
34275
34276
34277 for {
34278 if v_0.Op != OpConst16 {
34279 break
34280 }
34281 c := auxIntToInt16(v_0.AuxInt)
34282 v.reset(OpConst8)
34283 v.AuxInt = int8ToAuxInt(int8(c))
34284 return true
34285 }
34286
34287
34288 for {
34289 if v_0.Op != OpZeroExt8to16 {
34290 break
34291 }
34292 x := v_0.Args[0]
34293 v.copyOf(x)
34294 return true
34295 }
34296
34297
34298 for {
34299 if v_0.Op != OpSignExt8to16 {
34300 break
34301 }
34302 x := v_0.Args[0]
34303 v.copyOf(x)
34304 return true
34305 }
34306
34307
34308
34309 for {
34310 if v_0.Op != OpAnd16 {
34311 break
34312 }
34313 _ = v_0.Args[1]
34314 v_0_0 := v_0.Args[0]
34315 v_0_1 := v_0.Args[1]
34316 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34317 if v_0_0.Op != OpConst16 {
34318 continue
34319 }
34320 y := auxIntToInt16(v_0_0.AuxInt)
34321 x := v_0_1
34322 if !(y&0xFF == 0xFF) {
34323 continue
34324 }
34325 v.reset(OpTrunc16to8)
34326 v.AddArg(x)
34327 return true
34328 }
34329 break
34330 }
34331 return false
34332 }
34333 func rewriteValuegeneric_OpTrunc32to16(v *Value) bool {
34334 v_0 := v.Args[0]
34335
34336
34337 for {
34338 if v_0.Op != OpConst32 {
34339 break
34340 }
34341 c := auxIntToInt32(v_0.AuxInt)
34342 v.reset(OpConst16)
34343 v.AuxInt = int16ToAuxInt(int16(c))
34344 return true
34345 }
34346
34347
34348 for {
34349 if v_0.Op != OpZeroExt8to32 {
34350 break
34351 }
34352 x := v_0.Args[0]
34353 v.reset(OpZeroExt8to16)
34354 v.AddArg(x)
34355 return true
34356 }
34357
34358
34359 for {
34360 if v_0.Op != OpZeroExt16to32 {
34361 break
34362 }
34363 x := v_0.Args[0]
34364 v.copyOf(x)
34365 return true
34366 }
34367
34368
34369 for {
34370 if v_0.Op != OpSignExt8to32 {
34371 break
34372 }
34373 x := v_0.Args[0]
34374 v.reset(OpSignExt8to16)
34375 v.AddArg(x)
34376 return true
34377 }
34378
34379
34380 for {
34381 if v_0.Op != OpSignExt16to32 {
34382 break
34383 }
34384 x := v_0.Args[0]
34385 v.copyOf(x)
34386 return true
34387 }
34388
34389
34390
34391 for {
34392 if v_0.Op != OpAnd32 {
34393 break
34394 }
34395 _ = v_0.Args[1]
34396 v_0_0 := v_0.Args[0]
34397 v_0_1 := v_0.Args[1]
34398 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34399 if v_0_0.Op != OpConst32 {
34400 continue
34401 }
34402 y := auxIntToInt32(v_0_0.AuxInt)
34403 x := v_0_1
34404 if !(y&0xFFFF == 0xFFFF) {
34405 continue
34406 }
34407 v.reset(OpTrunc32to16)
34408 v.AddArg(x)
34409 return true
34410 }
34411 break
34412 }
34413 return false
34414 }
34415 func rewriteValuegeneric_OpTrunc32to8(v *Value) bool {
34416 v_0 := v.Args[0]
34417
34418
34419 for {
34420 if v_0.Op != OpConst32 {
34421 break
34422 }
34423 c := auxIntToInt32(v_0.AuxInt)
34424 v.reset(OpConst8)
34425 v.AuxInt = int8ToAuxInt(int8(c))
34426 return true
34427 }
34428
34429
34430 for {
34431 if v_0.Op != OpZeroExt8to32 {
34432 break
34433 }
34434 x := v_0.Args[0]
34435 v.copyOf(x)
34436 return true
34437 }
34438
34439
34440 for {
34441 if v_0.Op != OpSignExt8to32 {
34442 break
34443 }
34444 x := v_0.Args[0]
34445 v.copyOf(x)
34446 return true
34447 }
34448
34449
34450
34451 for {
34452 if v_0.Op != OpAnd32 {
34453 break
34454 }
34455 _ = v_0.Args[1]
34456 v_0_0 := v_0.Args[0]
34457 v_0_1 := v_0.Args[1]
34458 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34459 if v_0_0.Op != OpConst32 {
34460 continue
34461 }
34462 y := auxIntToInt32(v_0_0.AuxInt)
34463 x := v_0_1
34464 if !(y&0xFF == 0xFF) {
34465 continue
34466 }
34467 v.reset(OpTrunc32to8)
34468 v.AddArg(x)
34469 return true
34470 }
34471 break
34472 }
34473 return false
34474 }
34475 func rewriteValuegeneric_OpTrunc64to16(v *Value) bool {
34476 v_0 := v.Args[0]
34477
34478
34479 for {
34480 if v_0.Op != OpConst64 {
34481 break
34482 }
34483 c := auxIntToInt64(v_0.AuxInt)
34484 v.reset(OpConst16)
34485 v.AuxInt = int16ToAuxInt(int16(c))
34486 return true
34487 }
34488
34489
34490 for {
34491 if v_0.Op != OpZeroExt8to64 {
34492 break
34493 }
34494 x := v_0.Args[0]
34495 v.reset(OpZeroExt8to16)
34496 v.AddArg(x)
34497 return true
34498 }
34499
34500
34501 for {
34502 if v_0.Op != OpZeroExt16to64 {
34503 break
34504 }
34505 x := v_0.Args[0]
34506 v.copyOf(x)
34507 return true
34508 }
34509
34510
34511 for {
34512 if v_0.Op != OpSignExt8to64 {
34513 break
34514 }
34515 x := v_0.Args[0]
34516 v.reset(OpSignExt8to16)
34517 v.AddArg(x)
34518 return true
34519 }
34520
34521
34522 for {
34523 if v_0.Op != OpSignExt16to64 {
34524 break
34525 }
34526 x := v_0.Args[0]
34527 v.copyOf(x)
34528 return true
34529 }
34530
34531
34532
34533 for {
34534 if v_0.Op != OpAnd64 {
34535 break
34536 }
34537 _ = v_0.Args[1]
34538 v_0_0 := v_0.Args[0]
34539 v_0_1 := v_0.Args[1]
34540 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34541 if v_0_0.Op != OpConst64 {
34542 continue
34543 }
34544 y := auxIntToInt64(v_0_0.AuxInt)
34545 x := v_0_1
34546 if !(y&0xFFFF == 0xFFFF) {
34547 continue
34548 }
34549 v.reset(OpTrunc64to16)
34550 v.AddArg(x)
34551 return true
34552 }
34553 break
34554 }
34555 return false
34556 }
34557 func rewriteValuegeneric_OpTrunc64to32(v *Value) bool {
34558 v_0 := v.Args[0]
34559
34560
34561 for {
34562 if v_0.Op != OpConst64 {
34563 break
34564 }
34565 c := auxIntToInt64(v_0.AuxInt)
34566 v.reset(OpConst32)
34567 v.AuxInt = int32ToAuxInt(int32(c))
34568 return true
34569 }
34570
34571
34572 for {
34573 if v_0.Op != OpZeroExt8to64 {
34574 break
34575 }
34576 x := v_0.Args[0]
34577 v.reset(OpZeroExt8to32)
34578 v.AddArg(x)
34579 return true
34580 }
34581
34582
34583 for {
34584 if v_0.Op != OpZeroExt16to64 {
34585 break
34586 }
34587 x := v_0.Args[0]
34588 v.reset(OpZeroExt16to32)
34589 v.AddArg(x)
34590 return true
34591 }
34592
34593
34594 for {
34595 if v_0.Op != OpZeroExt32to64 {
34596 break
34597 }
34598 x := v_0.Args[0]
34599 v.copyOf(x)
34600 return true
34601 }
34602
34603
34604 for {
34605 if v_0.Op != OpSignExt8to64 {
34606 break
34607 }
34608 x := v_0.Args[0]
34609 v.reset(OpSignExt8to32)
34610 v.AddArg(x)
34611 return true
34612 }
34613
34614
34615 for {
34616 if v_0.Op != OpSignExt16to64 {
34617 break
34618 }
34619 x := v_0.Args[0]
34620 v.reset(OpSignExt16to32)
34621 v.AddArg(x)
34622 return true
34623 }
34624
34625
34626 for {
34627 if v_0.Op != OpSignExt32to64 {
34628 break
34629 }
34630 x := v_0.Args[0]
34631 v.copyOf(x)
34632 return true
34633 }
34634
34635
34636
34637 for {
34638 if v_0.Op != OpAnd64 {
34639 break
34640 }
34641 _ = v_0.Args[1]
34642 v_0_0 := v_0.Args[0]
34643 v_0_1 := v_0.Args[1]
34644 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34645 if v_0_0.Op != OpConst64 {
34646 continue
34647 }
34648 y := auxIntToInt64(v_0_0.AuxInt)
34649 x := v_0_1
34650 if !(y&0xFFFFFFFF == 0xFFFFFFFF) {
34651 continue
34652 }
34653 v.reset(OpTrunc64to32)
34654 v.AddArg(x)
34655 return true
34656 }
34657 break
34658 }
34659 return false
34660 }
34661 func rewriteValuegeneric_OpTrunc64to8(v *Value) bool {
34662 v_0 := v.Args[0]
34663
34664
34665 for {
34666 if v_0.Op != OpConst64 {
34667 break
34668 }
34669 c := auxIntToInt64(v_0.AuxInt)
34670 v.reset(OpConst8)
34671 v.AuxInt = int8ToAuxInt(int8(c))
34672 return true
34673 }
34674
34675
34676 for {
34677 if v_0.Op != OpZeroExt8to64 {
34678 break
34679 }
34680 x := v_0.Args[0]
34681 v.copyOf(x)
34682 return true
34683 }
34684
34685
34686 for {
34687 if v_0.Op != OpSignExt8to64 {
34688 break
34689 }
34690 x := v_0.Args[0]
34691 v.copyOf(x)
34692 return true
34693 }
34694
34695
34696
34697 for {
34698 if v_0.Op != OpAnd64 {
34699 break
34700 }
34701 _ = v_0.Args[1]
34702 v_0_0 := v_0.Args[0]
34703 v_0_1 := v_0.Args[1]
34704 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34705 if v_0_0.Op != OpConst64 {
34706 continue
34707 }
34708 y := auxIntToInt64(v_0_0.AuxInt)
34709 x := v_0_1
34710 if !(y&0xFF == 0xFF) {
34711 continue
34712 }
34713 v.reset(OpTrunc64to8)
34714 v.AddArg(x)
34715 return true
34716 }
34717 break
34718 }
34719 return false
34720 }
34721 func rewriteValuegeneric_OpXor16(v *Value) bool {
34722 v_1 := v.Args[1]
34723 v_0 := v.Args[0]
34724 b := v.Block
34725 config := b.Func.Config
34726
34727
34728 for {
34729 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34730 if v_0.Op != OpConst16 {
34731 continue
34732 }
34733 c := auxIntToInt16(v_0.AuxInt)
34734 if v_1.Op != OpConst16 {
34735 continue
34736 }
34737 d := auxIntToInt16(v_1.AuxInt)
34738 v.reset(OpConst16)
34739 v.AuxInt = int16ToAuxInt(c ^ d)
34740 return true
34741 }
34742 break
34743 }
34744
34745
34746 for {
34747 x := v_0
34748 if x != v_1 {
34749 break
34750 }
34751 v.reset(OpConst16)
34752 v.AuxInt = int16ToAuxInt(0)
34753 return true
34754 }
34755
34756
34757 for {
34758 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34759 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
34760 continue
34761 }
34762 x := v_1
34763 v.copyOf(x)
34764 return true
34765 }
34766 break
34767 }
34768
34769
34770 for {
34771 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34772 if v_0.Op != OpCom16 {
34773 continue
34774 }
34775 x := v_0.Args[0]
34776 if x != v_1 {
34777 continue
34778 }
34779 v.reset(OpConst16)
34780 v.AuxInt = int16ToAuxInt(-1)
34781 return true
34782 }
34783 break
34784 }
34785
34786
34787 for {
34788 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34789 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
34790 continue
34791 }
34792 x := v_1
34793 v.reset(OpCom16)
34794 v.AddArg(x)
34795 return true
34796 }
34797 break
34798 }
34799
34800
34801 for {
34802 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34803 x := v_0
34804 if v_1.Op != OpXor16 {
34805 continue
34806 }
34807 _ = v_1.Args[1]
34808 v_1_0 := v_1.Args[0]
34809 v_1_1 := v_1.Args[1]
34810 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34811 if x != v_1_0 {
34812 continue
34813 }
34814 y := v_1_1
34815 v.copyOf(y)
34816 return true
34817 }
34818 }
34819 break
34820 }
34821
34822
34823
34824 for {
34825 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34826 if v_0.Op != OpXor16 {
34827 continue
34828 }
34829 _ = v_0.Args[1]
34830 v_0_0 := v_0.Args[0]
34831 v_0_1 := v_0.Args[1]
34832 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
34833 i := v_0_0
34834 if i.Op != OpConst16 {
34835 continue
34836 }
34837 t := i.Type
34838 z := v_0_1
34839 x := v_1
34840 if !(z.Op != OpConst16 && x.Op != OpConst16) {
34841 continue
34842 }
34843 v.reset(OpXor16)
34844 v0 := b.NewValue0(v.Pos, OpXor16, t)
34845 v0.AddArg2(z, x)
34846 v.AddArg2(i, v0)
34847 return true
34848 }
34849 }
34850 break
34851 }
34852
34853
34854 for {
34855 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34856 if v_0.Op != OpConst16 {
34857 continue
34858 }
34859 t := v_0.Type
34860 c := auxIntToInt16(v_0.AuxInt)
34861 if v_1.Op != OpXor16 {
34862 continue
34863 }
34864 _ = v_1.Args[1]
34865 v_1_0 := v_1.Args[0]
34866 v_1_1 := v_1.Args[1]
34867 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34868 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
34869 continue
34870 }
34871 d := auxIntToInt16(v_1_0.AuxInt)
34872 x := v_1_1
34873 v.reset(OpXor16)
34874 v0 := b.NewValue0(v.Pos, OpConst16, t)
34875 v0.AuxInt = int16ToAuxInt(c ^ d)
34876 v.AddArg2(v0, x)
34877 return true
34878 }
34879 }
34880 break
34881 }
34882
34883
34884
34885 for {
34886 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34887 if v_0.Op != OpLsh16x64 {
34888 continue
34889 }
34890 _ = v_0.Args[1]
34891 x := v_0.Args[0]
34892 z := v_0.Args[1]
34893 if z.Op != OpConst64 {
34894 continue
34895 }
34896 c := auxIntToInt64(z.AuxInt)
34897 if v_1.Op != OpRsh16Ux64 {
34898 continue
34899 }
34900 _ = v_1.Args[1]
34901 if x != v_1.Args[0] {
34902 continue
34903 }
34904 v_1_1 := v_1.Args[1]
34905 if v_1_1.Op != OpConst64 {
34906 continue
34907 }
34908 d := auxIntToInt64(v_1_1.AuxInt)
34909 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
34910 continue
34911 }
34912 v.reset(OpRotateLeft16)
34913 v.AddArg2(x, z)
34914 return true
34915 }
34916 break
34917 }
34918
34919
34920
34921 for {
34922 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34923 left := v_0
34924 if left.Op != OpLsh16x64 {
34925 continue
34926 }
34927 y := left.Args[1]
34928 x := left.Args[0]
34929 right := v_1
34930 if right.Op != OpRsh16Ux64 {
34931 continue
34932 }
34933 _ = right.Args[1]
34934 if x != right.Args[0] {
34935 continue
34936 }
34937 right_1 := right.Args[1]
34938 if right_1.Op != OpSub64 {
34939 continue
34940 }
34941 _ = right_1.Args[1]
34942 right_1_0 := right_1.Args[0]
34943 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
34944 continue
34945 }
34946 v.reset(OpRotateLeft16)
34947 v.AddArg2(x, y)
34948 return true
34949 }
34950 break
34951 }
34952
34953
34954
34955 for {
34956 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34957 left := v_0
34958 if left.Op != OpLsh16x32 {
34959 continue
34960 }
34961 y := left.Args[1]
34962 x := left.Args[0]
34963 right := v_1
34964 if right.Op != OpRsh16Ux32 {
34965 continue
34966 }
34967 _ = right.Args[1]
34968 if x != right.Args[0] {
34969 continue
34970 }
34971 right_1 := right.Args[1]
34972 if right_1.Op != OpSub32 {
34973 continue
34974 }
34975 _ = right_1.Args[1]
34976 right_1_0 := right_1.Args[0]
34977 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
34978 continue
34979 }
34980 v.reset(OpRotateLeft16)
34981 v.AddArg2(x, y)
34982 return true
34983 }
34984 break
34985 }
34986
34987
34988
34989 for {
34990 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34991 left := v_0
34992 if left.Op != OpLsh16x16 {
34993 continue
34994 }
34995 y := left.Args[1]
34996 x := left.Args[0]
34997 right := v_1
34998 if right.Op != OpRsh16Ux16 {
34999 continue
35000 }
35001 _ = right.Args[1]
35002 if x != right.Args[0] {
35003 continue
35004 }
35005 right_1 := right.Args[1]
35006 if right_1.Op != OpSub16 {
35007 continue
35008 }
35009 _ = right_1.Args[1]
35010 right_1_0 := right_1.Args[0]
35011 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
35012 continue
35013 }
35014 v.reset(OpRotateLeft16)
35015 v.AddArg2(x, y)
35016 return true
35017 }
35018 break
35019 }
35020
35021
35022
35023 for {
35024 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35025 left := v_0
35026 if left.Op != OpLsh16x8 {
35027 continue
35028 }
35029 y := left.Args[1]
35030 x := left.Args[0]
35031 right := v_1
35032 if right.Op != OpRsh16Ux8 {
35033 continue
35034 }
35035 _ = right.Args[1]
35036 if x != right.Args[0] {
35037 continue
35038 }
35039 right_1 := right.Args[1]
35040 if right_1.Op != OpSub8 {
35041 continue
35042 }
35043 _ = right_1.Args[1]
35044 right_1_0 := right_1.Args[0]
35045 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
35046 continue
35047 }
35048 v.reset(OpRotateLeft16)
35049 v.AddArg2(x, y)
35050 return true
35051 }
35052 break
35053 }
35054
35055
35056
35057 for {
35058 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35059 right := v_0
35060 if right.Op != OpRsh16Ux64 {
35061 continue
35062 }
35063 y := right.Args[1]
35064 x := right.Args[0]
35065 left := v_1
35066 if left.Op != OpLsh16x64 {
35067 continue
35068 }
35069 _ = left.Args[1]
35070 if x != left.Args[0] {
35071 continue
35072 }
35073 z := left.Args[1]
35074 if z.Op != OpSub64 {
35075 continue
35076 }
35077 _ = z.Args[1]
35078 z_0 := z.Args[0]
35079 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
35080 continue
35081 }
35082 v.reset(OpRotateLeft16)
35083 v.AddArg2(x, z)
35084 return true
35085 }
35086 break
35087 }
35088
35089
35090
35091 for {
35092 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35093 right := v_0
35094 if right.Op != OpRsh16Ux32 {
35095 continue
35096 }
35097 y := right.Args[1]
35098 x := right.Args[0]
35099 left := v_1
35100 if left.Op != OpLsh16x32 {
35101 continue
35102 }
35103 _ = left.Args[1]
35104 if x != left.Args[0] {
35105 continue
35106 }
35107 z := left.Args[1]
35108 if z.Op != OpSub32 {
35109 continue
35110 }
35111 _ = z.Args[1]
35112 z_0 := z.Args[0]
35113 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
35114 continue
35115 }
35116 v.reset(OpRotateLeft16)
35117 v.AddArg2(x, z)
35118 return true
35119 }
35120 break
35121 }
35122
35123
35124
35125 for {
35126 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35127 right := v_0
35128 if right.Op != OpRsh16Ux16 {
35129 continue
35130 }
35131 y := right.Args[1]
35132 x := right.Args[0]
35133 left := v_1
35134 if left.Op != OpLsh16x16 {
35135 continue
35136 }
35137 _ = left.Args[1]
35138 if x != left.Args[0] {
35139 continue
35140 }
35141 z := left.Args[1]
35142 if z.Op != OpSub16 {
35143 continue
35144 }
35145 _ = z.Args[1]
35146 z_0 := z.Args[0]
35147 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
35148 continue
35149 }
35150 v.reset(OpRotateLeft16)
35151 v.AddArg2(x, z)
35152 return true
35153 }
35154 break
35155 }
35156
35157
35158
35159 for {
35160 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35161 right := v_0
35162 if right.Op != OpRsh16Ux8 {
35163 continue
35164 }
35165 y := right.Args[1]
35166 x := right.Args[0]
35167 left := v_1
35168 if left.Op != OpLsh16x8 {
35169 continue
35170 }
35171 _ = left.Args[1]
35172 if x != left.Args[0] {
35173 continue
35174 }
35175 z := left.Args[1]
35176 if z.Op != OpSub8 {
35177 continue
35178 }
35179 _ = z.Args[1]
35180 z_0 := z.Args[0]
35181 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
35182 continue
35183 }
35184 v.reset(OpRotateLeft16)
35185 v.AddArg2(x, z)
35186 return true
35187 }
35188 break
35189 }
35190 return false
35191 }
35192 func rewriteValuegeneric_OpXor32(v *Value) bool {
35193 v_1 := v.Args[1]
35194 v_0 := v.Args[0]
35195 b := v.Block
35196 config := b.Func.Config
35197
35198
35199 for {
35200 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35201 if v_0.Op != OpConst32 {
35202 continue
35203 }
35204 c := auxIntToInt32(v_0.AuxInt)
35205 if v_1.Op != OpConst32 {
35206 continue
35207 }
35208 d := auxIntToInt32(v_1.AuxInt)
35209 v.reset(OpConst32)
35210 v.AuxInt = int32ToAuxInt(c ^ d)
35211 return true
35212 }
35213 break
35214 }
35215
35216
35217 for {
35218 x := v_0
35219 if x != v_1 {
35220 break
35221 }
35222 v.reset(OpConst32)
35223 v.AuxInt = int32ToAuxInt(0)
35224 return true
35225 }
35226
35227
35228 for {
35229 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35230 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
35231 continue
35232 }
35233 x := v_1
35234 v.copyOf(x)
35235 return true
35236 }
35237 break
35238 }
35239
35240
35241 for {
35242 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35243 if v_0.Op != OpCom32 {
35244 continue
35245 }
35246 x := v_0.Args[0]
35247 if x != v_1 {
35248 continue
35249 }
35250 v.reset(OpConst32)
35251 v.AuxInt = int32ToAuxInt(-1)
35252 return true
35253 }
35254 break
35255 }
35256
35257
35258 for {
35259 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35260 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
35261 continue
35262 }
35263 x := v_1
35264 v.reset(OpCom32)
35265 v.AddArg(x)
35266 return true
35267 }
35268 break
35269 }
35270
35271
35272 for {
35273 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35274 x := v_0
35275 if v_1.Op != OpXor32 {
35276 continue
35277 }
35278 _ = v_1.Args[1]
35279 v_1_0 := v_1.Args[0]
35280 v_1_1 := v_1.Args[1]
35281 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35282 if x != v_1_0 {
35283 continue
35284 }
35285 y := v_1_1
35286 v.copyOf(y)
35287 return true
35288 }
35289 }
35290 break
35291 }
35292
35293
35294
35295 for {
35296 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35297 if v_0.Op != OpXor32 {
35298 continue
35299 }
35300 _ = v_0.Args[1]
35301 v_0_0 := v_0.Args[0]
35302 v_0_1 := v_0.Args[1]
35303 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
35304 i := v_0_0
35305 if i.Op != OpConst32 {
35306 continue
35307 }
35308 t := i.Type
35309 z := v_0_1
35310 x := v_1
35311 if !(z.Op != OpConst32 && x.Op != OpConst32) {
35312 continue
35313 }
35314 v.reset(OpXor32)
35315 v0 := b.NewValue0(v.Pos, OpXor32, t)
35316 v0.AddArg2(z, x)
35317 v.AddArg2(i, v0)
35318 return true
35319 }
35320 }
35321 break
35322 }
35323
35324
35325 for {
35326 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35327 if v_0.Op != OpConst32 {
35328 continue
35329 }
35330 t := v_0.Type
35331 c := auxIntToInt32(v_0.AuxInt)
35332 if v_1.Op != OpXor32 {
35333 continue
35334 }
35335 _ = v_1.Args[1]
35336 v_1_0 := v_1.Args[0]
35337 v_1_1 := v_1.Args[1]
35338 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35339 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
35340 continue
35341 }
35342 d := auxIntToInt32(v_1_0.AuxInt)
35343 x := v_1_1
35344 v.reset(OpXor32)
35345 v0 := b.NewValue0(v.Pos, OpConst32, t)
35346 v0.AuxInt = int32ToAuxInt(c ^ d)
35347 v.AddArg2(v0, x)
35348 return true
35349 }
35350 }
35351 break
35352 }
35353
35354
35355
35356 for {
35357 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35358 if v_0.Op != OpLsh32x64 {
35359 continue
35360 }
35361 _ = v_0.Args[1]
35362 x := v_0.Args[0]
35363 z := v_0.Args[1]
35364 if z.Op != OpConst64 {
35365 continue
35366 }
35367 c := auxIntToInt64(z.AuxInt)
35368 if v_1.Op != OpRsh32Ux64 {
35369 continue
35370 }
35371 _ = v_1.Args[1]
35372 if x != v_1.Args[0] {
35373 continue
35374 }
35375 v_1_1 := v_1.Args[1]
35376 if v_1_1.Op != OpConst64 {
35377 continue
35378 }
35379 d := auxIntToInt64(v_1_1.AuxInt)
35380 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
35381 continue
35382 }
35383 v.reset(OpRotateLeft32)
35384 v.AddArg2(x, z)
35385 return true
35386 }
35387 break
35388 }
35389
35390
35391
35392 for {
35393 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35394 left := v_0
35395 if left.Op != OpLsh32x64 {
35396 continue
35397 }
35398 y := left.Args[1]
35399 x := left.Args[0]
35400 right := v_1
35401 if right.Op != OpRsh32Ux64 {
35402 continue
35403 }
35404 _ = right.Args[1]
35405 if x != right.Args[0] {
35406 continue
35407 }
35408 right_1 := right.Args[1]
35409 if right_1.Op != OpSub64 {
35410 continue
35411 }
35412 _ = right_1.Args[1]
35413 right_1_0 := right_1.Args[0]
35414 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35415 continue
35416 }
35417 v.reset(OpRotateLeft32)
35418 v.AddArg2(x, y)
35419 return true
35420 }
35421 break
35422 }
35423
35424
35425
35426 for {
35427 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35428 left := v_0
35429 if left.Op != OpLsh32x32 {
35430 continue
35431 }
35432 y := left.Args[1]
35433 x := left.Args[0]
35434 right := v_1
35435 if right.Op != OpRsh32Ux32 {
35436 continue
35437 }
35438 _ = right.Args[1]
35439 if x != right.Args[0] {
35440 continue
35441 }
35442 right_1 := right.Args[1]
35443 if right_1.Op != OpSub32 {
35444 continue
35445 }
35446 _ = right_1.Args[1]
35447 right_1_0 := right_1.Args[0]
35448 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35449 continue
35450 }
35451 v.reset(OpRotateLeft32)
35452 v.AddArg2(x, y)
35453 return true
35454 }
35455 break
35456 }
35457
35458
35459
35460 for {
35461 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35462 left := v_0
35463 if left.Op != OpLsh32x16 {
35464 continue
35465 }
35466 y := left.Args[1]
35467 x := left.Args[0]
35468 right := v_1
35469 if right.Op != OpRsh32Ux16 {
35470 continue
35471 }
35472 _ = right.Args[1]
35473 if x != right.Args[0] {
35474 continue
35475 }
35476 right_1 := right.Args[1]
35477 if right_1.Op != OpSub16 {
35478 continue
35479 }
35480 _ = right_1.Args[1]
35481 right_1_0 := right_1.Args[0]
35482 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35483 continue
35484 }
35485 v.reset(OpRotateLeft32)
35486 v.AddArg2(x, y)
35487 return true
35488 }
35489 break
35490 }
35491
35492
35493
35494 for {
35495 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35496 left := v_0
35497 if left.Op != OpLsh32x8 {
35498 continue
35499 }
35500 y := left.Args[1]
35501 x := left.Args[0]
35502 right := v_1
35503 if right.Op != OpRsh32Ux8 {
35504 continue
35505 }
35506 _ = right.Args[1]
35507 if x != right.Args[0] {
35508 continue
35509 }
35510 right_1 := right.Args[1]
35511 if right_1.Op != OpSub8 {
35512 continue
35513 }
35514 _ = right_1.Args[1]
35515 right_1_0 := right_1.Args[0]
35516 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35517 continue
35518 }
35519 v.reset(OpRotateLeft32)
35520 v.AddArg2(x, y)
35521 return true
35522 }
35523 break
35524 }
35525
35526
35527
35528 for {
35529 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35530 right := v_0
35531 if right.Op != OpRsh32Ux64 {
35532 continue
35533 }
35534 y := right.Args[1]
35535 x := right.Args[0]
35536 left := v_1
35537 if left.Op != OpLsh32x64 {
35538 continue
35539 }
35540 _ = left.Args[1]
35541 if x != left.Args[0] {
35542 continue
35543 }
35544 z := left.Args[1]
35545 if z.Op != OpSub64 {
35546 continue
35547 }
35548 _ = z.Args[1]
35549 z_0 := z.Args[0]
35550 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35551 continue
35552 }
35553 v.reset(OpRotateLeft32)
35554 v.AddArg2(x, z)
35555 return true
35556 }
35557 break
35558 }
35559
35560
35561
35562 for {
35563 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35564 right := v_0
35565 if right.Op != OpRsh32Ux32 {
35566 continue
35567 }
35568 y := right.Args[1]
35569 x := right.Args[0]
35570 left := v_1
35571 if left.Op != OpLsh32x32 {
35572 continue
35573 }
35574 _ = left.Args[1]
35575 if x != left.Args[0] {
35576 continue
35577 }
35578 z := left.Args[1]
35579 if z.Op != OpSub32 {
35580 continue
35581 }
35582 _ = z.Args[1]
35583 z_0 := z.Args[0]
35584 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35585 continue
35586 }
35587 v.reset(OpRotateLeft32)
35588 v.AddArg2(x, z)
35589 return true
35590 }
35591 break
35592 }
35593
35594
35595
35596 for {
35597 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35598 right := v_0
35599 if right.Op != OpRsh32Ux16 {
35600 continue
35601 }
35602 y := right.Args[1]
35603 x := right.Args[0]
35604 left := v_1
35605 if left.Op != OpLsh32x16 {
35606 continue
35607 }
35608 _ = left.Args[1]
35609 if x != left.Args[0] {
35610 continue
35611 }
35612 z := left.Args[1]
35613 if z.Op != OpSub16 {
35614 continue
35615 }
35616 _ = z.Args[1]
35617 z_0 := z.Args[0]
35618 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35619 continue
35620 }
35621 v.reset(OpRotateLeft32)
35622 v.AddArg2(x, z)
35623 return true
35624 }
35625 break
35626 }
35627
35628
35629
35630 for {
35631 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35632 right := v_0
35633 if right.Op != OpRsh32Ux8 {
35634 continue
35635 }
35636 y := right.Args[1]
35637 x := right.Args[0]
35638 left := v_1
35639 if left.Op != OpLsh32x8 {
35640 continue
35641 }
35642 _ = left.Args[1]
35643 if x != left.Args[0] {
35644 continue
35645 }
35646 z := left.Args[1]
35647 if z.Op != OpSub8 {
35648 continue
35649 }
35650 _ = z.Args[1]
35651 z_0 := z.Args[0]
35652 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35653 continue
35654 }
35655 v.reset(OpRotateLeft32)
35656 v.AddArg2(x, z)
35657 return true
35658 }
35659 break
35660 }
35661 return false
35662 }
35663 func rewriteValuegeneric_OpXor64(v *Value) bool {
35664 v_1 := v.Args[1]
35665 v_0 := v.Args[0]
35666 b := v.Block
35667 config := b.Func.Config
35668
35669
35670 for {
35671 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35672 if v_0.Op != OpConst64 {
35673 continue
35674 }
35675 c := auxIntToInt64(v_0.AuxInt)
35676 if v_1.Op != OpConst64 {
35677 continue
35678 }
35679 d := auxIntToInt64(v_1.AuxInt)
35680 v.reset(OpConst64)
35681 v.AuxInt = int64ToAuxInt(c ^ d)
35682 return true
35683 }
35684 break
35685 }
35686
35687
35688 for {
35689 x := v_0
35690 if x != v_1 {
35691 break
35692 }
35693 v.reset(OpConst64)
35694 v.AuxInt = int64ToAuxInt(0)
35695 return true
35696 }
35697
35698
35699 for {
35700 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35701 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
35702 continue
35703 }
35704 x := v_1
35705 v.copyOf(x)
35706 return true
35707 }
35708 break
35709 }
35710
35711
35712 for {
35713 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35714 if v_0.Op != OpCom64 {
35715 continue
35716 }
35717 x := v_0.Args[0]
35718 if x != v_1 {
35719 continue
35720 }
35721 v.reset(OpConst64)
35722 v.AuxInt = int64ToAuxInt(-1)
35723 return true
35724 }
35725 break
35726 }
35727
35728
35729 for {
35730 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35731 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
35732 continue
35733 }
35734 x := v_1
35735 v.reset(OpCom64)
35736 v.AddArg(x)
35737 return true
35738 }
35739 break
35740 }
35741
35742
35743 for {
35744 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35745 x := v_0
35746 if v_1.Op != OpXor64 {
35747 continue
35748 }
35749 _ = v_1.Args[1]
35750 v_1_0 := v_1.Args[0]
35751 v_1_1 := v_1.Args[1]
35752 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35753 if x != v_1_0 {
35754 continue
35755 }
35756 y := v_1_1
35757 v.copyOf(y)
35758 return true
35759 }
35760 }
35761 break
35762 }
35763
35764
35765
35766 for {
35767 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35768 if v_0.Op != OpXor64 {
35769 continue
35770 }
35771 _ = v_0.Args[1]
35772 v_0_0 := v_0.Args[0]
35773 v_0_1 := v_0.Args[1]
35774 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
35775 i := v_0_0
35776 if i.Op != OpConst64 {
35777 continue
35778 }
35779 t := i.Type
35780 z := v_0_1
35781 x := v_1
35782 if !(z.Op != OpConst64 && x.Op != OpConst64) {
35783 continue
35784 }
35785 v.reset(OpXor64)
35786 v0 := b.NewValue0(v.Pos, OpXor64, t)
35787 v0.AddArg2(z, x)
35788 v.AddArg2(i, v0)
35789 return true
35790 }
35791 }
35792 break
35793 }
35794
35795
35796 for {
35797 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35798 if v_0.Op != OpConst64 {
35799 continue
35800 }
35801 t := v_0.Type
35802 c := auxIntToInt64(v_0.AuxInt)
35803 if v_1.Op != OpXor64 {
35804 continue
35805 }
35806 _ = v_1.Args[1]
35807 v_1_0 := v_1.Args[0]
35808 v_1_1 := v_1.Args[1]
35809 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35810 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
35811 continue
35812 }
35813 d := auxIntToInt64(v_1_0.AuxInt)
35814 x := v_1_1
35815 v.reset(OpXor64)
35816 v0 := b.NewValue0(v.Pos, OpConst64, t)
35817 v0.AuxInt = int64ToAuxInt(c ^ d)
35818 v.AddArg2(v0, x)
35819 return true
35820 }
35821 }
35822 break
35823 }
35824
35825
35826
35827 for {
35828 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35829 if v_0.Op != OpLsh64x64 {
35830 continue
35831 }
35832 _ = v_0.Args[1]
35833 x := v_0.Args[0]
35834 z := v_0.Args[1]
35835 if z.Op != OpConst64 {
35836 continue
35837 }
35838 c := auxIntToInt64(z.AuxInt)
35839 if v_1.Op != OpRsh64Ux64 {
35840 continue
35841 }
35842 _ = v_1.Args[1]
35843 if x != v_1.Args[0] {
35844 continue
35845 }
35846 v_1_1 := v_1.Args[1]
35847 if v_1_1.Op != OpConst64 {
35848 continue
35849 }
35850 d := auxIntToInt64(v_1_1.AuxInt)
35851 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
35852 continue
35853 }
35854 v.reset(OpRotateLeft64)
35855 v.AddArg2(x, z)
35856 return true
35857 }
35858 break
35859 }
35860
35861
35862
35863 for {
35864 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35865 left := v_0
35866 if left.Op != OpLsh64x64 {
35867 continue
35868 }
35869 y := left.Args[1]
35870 x := left.Args[0]
35871 right := v_1
35872 if right.Op != OpRsh64Ux64 {
35873 continue
35874 }
35875 _ = right.Args[1]
35876 if x != right.Args[0] {
35877 continue
35878 }
35879 right_1 := right.Args[1]
35880 if right_1.Op != OpSub64 {
35881 continue
35882 }
35883 _ = right_1.Args[1]
35884 right_1_0 := right_1.Args[0]
35885 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
35886 continue
35887 }
35888 v.reset(OpRotateLeft64)
35889 v.AddArg2(x, y)
35890 return true
35891 }
35892 break
35893 }
35894
35895
35896
35897 for {
35898 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35899 left := v_0
35900 if left.Op != OpLsh64x32 {
35901 continue
35902 }
35903 y := left.Args[1]
35904 x := left.Args[0]
35905 right := v_1
35906 if right.Op != OpRsh64Ux32 {
35907 continue
35908 }
35909 _ = right.Args[1]
35910 if x != right.Args[0] {
35911 continue
35912 }
35913 right_1 := right.Args[1]
35914 if right_1.Op != OpSub32 {
35915 continue
35916 }
35917 _ = right_1.Args[1]
35918 right_1_0 := right_1.Args[0]
35919 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
35920 continue
35921 }
35922 v.reset(OpRotateLeft64)
35923 v.AddArg2(x, y)
35924 return true
35925 }
35926 break
35927 }
35928
35929
35930
35931 for {
35932 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35933 left := v_0
35934 if left.Op != OpLsh64x16 {
35935 continue
35936 }
35937 y := left.Args[1]
35938 x := left.Args[0]
35939 right := v_1
35940 if right.Op != OpRsh64Ux16 {
35941 continue
35942 }
35943 _ = right.Args[1]
35944 if x != right.Args[0] {
35945 continue
35946 }
35947 right_1 := right.Args[1]
35948 if right_1.Op != OpSub16 {
35949 continue
35950 }
35951 _ = right_1.Args[1]
35952 right_1_0 := right_1.Args[0]
35953 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
35954 continue
35955 }
35956 v.reset(OpRotateLeft64)
35957 v.AddArg2(x, y)
35958 return true
35959 }
35960 break
35961 }
35962
35963
35964
35965 for {
35966 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35967 left := v_0
35968 if left.Op != OpLsh64x8 {
35969 continue
35970 }
35971 y := left.Args[1]
35972 x := left.Args[0]
35973 right := v_1
35974 if right.Op != OpRsh64Ux8 {
35975 continue
35976 }
35977 _ = right.Args[1]
35978 if x != right.Args[0] {
35979 continue
35980 }
35981 right_1 := right.Args[1]
35982 if right_1.Op != OpSub8 {
35983 continue
35984 }
35985 _ = right_1.Args[1]
35986 right_1_0 := right_1.Args[0]
35987 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
35988 continue
35989 }
35990 v.reset(OpRotateLeft64)
35991 v.AddArg2(x, y)
35992 return true
35993 }
35994 break
35995 }
35996
35997
35998
35999 for {
36000 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36001 right := v_0
36002 if right.Op != OpRsh64Ux64 {
36003 continue
36004 }
36005 y := right.Args[1]
36006 x := right.Args[0]
36007 left := v_1
36008 if left.Op != OpLsh64x64 {
36009 continue
36010 }
36011 _ = left.Args[1]
36012 if x != left.Args[0] {
36013 continue
36014 }
36015 z := left.Args[1]
36016 if z.Op != OpSub64 {
36017 continue
36018 }
36019 _ = z.Args[1]
36020 z_0 := z.Args[0]
36021 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
36022 continue
36023 }
36024 v.reset(OpRotateLeft64)
36025 v.AddArg2(x, z)
36026 return true
36027 }
36028 break
36029 }
36030
36031
36032
36033 for {
36034 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36035 right := v_0
36036 if right.Op != OpRsh64Ux32 {
36037 continue
36038 }
36039 y := right.Args[1]
36040 x := right.Args[0]
36041 left := v_1
36042 if left.Op != OpLsh64x32 {
36043 continue
36044 }
36045 _ = left.Args[1]
36046 if x != left.Args[0] {
36047 continue
36048 }
36049 z := left.Args[1]
36050 if z.Op != OpSub32 {
36051 continue
36052 }
36053 _ = z.Args[1]
36054 z_0 := z.Args[0]
36055 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
36056 continue
36057 }
36058 v.reset(OpRotateLeft64)
36059 v.AddArg2(x, z)
36060 return true
36061 }
36062 break
36063 }
36064
36065
36066
36067 for {
36068 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36069 right := v_0
36070 if right.Op != OpRsh64Ux16 {
36071 continue
36072 }
36073 y := right.Args[1]
36074 x := right.Args[0]
36075 left := v_1
36076 if left.Op != OpLsh64x16 {
36077 continue
36078 }
36079 _ = left.Args[1]
36080 if x != left.Args[0] {
36081 continue
36082 }
36083 z := left.Args[1]
36084 if z.Op != OpSub16 {
36085 continue
36086 }
36087 _ = z.Args[1]
36088 z_0 := z.Args[0]
36089 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
36090 continue
36091 }
36092 v.reset(OpRotateLeft64)
36093 v.AddArg2(x, z)
36094 return true
36095 }
36096 break
36097 }
36098
36099
36100
36101 for {
36102 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36103 right := v_0
36104 if right.Op != OpRsh64Ux8 {
36105 continue
36106 }
36107 y := right.Args[1]
36108 x := right.Args[0]
36109 left := v_1
36110 if left.Op != OpLsh64x8 {
36111 continue
36112 }
36113 _ = left.Args[1]
36114 if x != left.Args[0] {
36115 continue
36116 }
36117 z := left.Args[1]
36118 if z.Op != OpSub8 {
36119 continue
36120 }
36121 _ = z.Args[1]
36122 z_0 := z.Args[0]
36123 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
36124 continue
36125 }
36126 v.reset(OpRotateLeft64)
36127 v.AddArg2(x, z)
36128 return true
36129 }
36130 break
36131 }
36132 return false
36133 }
36134 func rewriteValuegeneric_OpXor8(v *Value) bool {
36135 v_1 := v.Args[1]
36136 v_0 := v.Args[0]
36137 b := v.Block
36138 config := b.Func.Config
36139
36140
36141 for {
36142 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36143 if v_0.Op != OpConst8 {
36144 continue
36145 }
36146 c := auxIntToInt8(v_0.AuxInt)
36147 if v_1.Op != OpConst8 {
36148 continue
36149 }
36150 d := auxIntToInt8(v_1.AuxInt)
36151 v.reset(OpConst8)
36152 v.AuxInt = int8ToAuxInt(c ^ d)
36153 return true
36154 }
36155 break
36156 }
36157
36158
36159 for {
36160 x := v_0
36161 if x != v_1 {
36162 break
36163 }
36164 v.reset(OpConst8)
36165 v.AuxInt = int8ToAuxInt(0)
36166 return true
36167 }
36168
36169
36170 for {
36171 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36172 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
36173 continue
36174 }
36175 x := v_1
36176 v.copyOf(x)
36177 return true
36178 }
36179 break
36180 }
36181
36182
36183 for {
36184 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36185 if v_0.Op != OpCom8 {
36186 continue
36187 }
36188 x := v_0.Args[0]
36189 if x != v_1 {
36190 continue
36191 }
36192 v.reset(OpConst8)
36193 v.AuxInt = int8ToAuxInt(-1)
36194 return true
36195 }
36196 break
36197 }
36198
36199
36200 for {
36201 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36202 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
36203 continue
36204 }
36205 x := v_1
36206 v.reset(OpCom8)
36207 v.AddArg(x)
36208 return true
36209 }
36210 break
36211 }
36212
36213
36214 for {
36215 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36216 x := v_0
36217 if v_1.Op != OpXor8 {
36218 continue
36219 }
36220 _ = v_1.Args[1]
36221 v_1_0 := v_1.Args[0]
36222 v_1_1 := v_1.Args[1]
36223 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36224 if x != v_1_0 {
36225 continue
36226 }
36227 y := v_1_1
36228 v.copyOf(y)
36229 return true
36230 }
36231 }
36232 break
36233 }
36234
36235
36236
36237 for {
36238 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36239 if v_0.Op != OpXor8 {
36240 continue
36241 }
36242 _ = v_0.Args[1]
36243 v_0_0 := v_0.Args[0]
36244 v_0_1 := v_0.Args[1]
36245 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
36246 i := v_0_0
36247 if i.Op != OpConst8 {
36248 continue
36249 }
36250 t := i.Type
36251 z := v_0_1
36252 x := v_1
36253 if !(z.Op != OpConst8 && x.Op != OpConst8) {
36254 continue
36255 }
36256 v.reset(OpXor8)
36257 v0 := b.NewValue0(v.Pos, OpXor8, t)
36258 v0.AddArg2(z, x)
36259 v.AddArg2(i, v0)
36260 return true
36261 }
36262 }
36263 break
36264 }
36265
36266
36267 for {
36268 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36269 if v_0.Op != OpConst8 {
36270 continue
36271 }
36272 t := v_0.Type
36273 c := auxIntToInt8(v_0.AuxInt)
36274 if v_1.Op != OpXor8 {
36275 continue
36276 }
36277 _ = v_1.Args[1]
36278 v_1_0 := v_1.Args[0]
36279 v_1_1 := v_1.Args[1]
36280 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36281 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
36282 continue
36283 }
36284 d := auxIntToInt8(v_1_0.AuxInt)
36285 x := v_1_1
36286 v.reset(OpXor8)
36287 v0 := b.NewValue0(v.Pos, OpConst8, t)
36288 v0.AuxInt = int8ToAuxInt(c ^ d)
36289 v.AddArg2(v0, x)
36290 return true
36291 }
36292 }
36293 break
36294 }
36295
36296
36297
36298 for {
36299 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36300 if v_0.Op != OpLsh8x64 {
36301 continue
36302 }
36303 _ = v_0.Args[1]
36304 x := v_0.Args[0]
36305 z := v_0.Args[1]
36306 if z.Op != OpConst64 {
36307 continue
36308 }
36309 c := auxIntToInt64(z.AuxInt)
36310 if v_1.Op != OpRsh8Ux64 {
36311 continue
36312 }
36313 _ = v_1.Args[1]
36314 if x != v_1.Args[0] {
36315 continue
36316 }
36317 v_1_1 := v_1.Args[1]
36318 if v_1_1.Op != OpConst64 {
36319 continue
36320 }
36321 d := auxIntToInt64(v_1_1.AuxInt)
36322 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
36323 continue
36324 }
36325 v.reset(OpRotateLeft8)
36326 v.AddArg2(x, z)
36327 return true
36328 }
36329 break
36330 }
36331
36332
36333
36334 for {
36335 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36336 left := v_0
36337 if left.Op != OpLsh8x64 {
36338 continue
36339 }
36340 y := left.Args[1]
36341 x := left.Args[0]
36342 right := v_1
36343 if right.Op != OpRsh8Ux64 {
36344 continue
36345 }
36346 _ = right.Args[1]
36347 if x != right.Args[0] {
36348 continue
36349 }
36350 right_1 := right.Args[1]
36351 if right_1.Op != OpSub64 {
36352 continue
36353 }
36354 _ = right_1.Args[1]
36355 right_1_0 := right_1.Args[0]
36356 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36357 continue
36358 }
36359 v.reset(OpRotateLeft8)
36360 v.AddArg2(x, y)
36361 return true
36362 }
36363 break
36364 }
36365
36366
36367
36368 for {
36369 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36370 left := v_0
36371 if left.Op != OpLsh8x32 {
36372 continue
36373 }
36374 y := left.Args[1]
36375 x := left.Args[0]
36376 right := v_1
36377 if right.Op != OpRsh8Ux32 {
36378 continue
36379 }
36380 _ = right.Args[1]
36381 if x != right.Args[0] {
36382 continue
36383 }
36384 right_1 := right.Args[1]
36385 if right_1.Op != OpSub32 {
36386 continue
36387 }
36388 _ = right_1.Args[1]
36389 right_1_0 := right_1.Args[0]
36390 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36391 continue
36392 }
36393 v.reset(OpRotateLeft8)
36394 v.AddArg2(x, y)
36395 return true
36396 }
36397 break
36398 }
36399
36400
36401
36402 for {
36403 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36404 left := v_0
36405 if left.Op != OpLsh8x16 {
36406 continue
36407 }
36408 y := left.Args[1]
36409 x := left.Args[0]
36410 right := v_1
36411 if right.Op != OpRsh8Ux16 {
36412 continue
36413 }
36414 _ = right.Args[1]
36415 if x != right.Args[0] {
36416 continue
36417 }
36418 right_1 := right.Args[1]
36419 if right_1.Op != OpSub16 {
36420 continue
36421 }
36422 _ = right_1.Args[1]
36423 right_1_0 := right_1.Args[0]
36424 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36425 continue
36426 }
36427 v.reset(OpRotateLeft8)
36428 v.AddArg2(x, y)
36429 return true
36430 }
36431 break
36432 }
36433
36434
36435
36436 for {
36437 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36438 left := v_0
36439 if left.Op != OpLsh8x8 {
36440 continue
36441 }
36442 y := left.Args[1]
36443 x := left.Args[0]
36444 right := v_1
36445 if right.Op != OpRsh8Ux8 {
36446 continue
36447 }
36448 _ = right.Args[1]
36449 if x != right.Args[0] {
36450 continue
36451 }
36452 right_1 := right.Args[1]
36453 if right_1.Op != OpSub8 {
36454 continue
36455 }
36456 _ = right_1.Args[1]
36457 right_1_0 := right_1.Args[0]
36458 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36459 continue
36460 }
36461 v.reset(OpRotateLeft8)
36462 v.AddArg2(x, y)
36463 return true
36464 }
36465 break
36466 }
36467
36468
36469
36470 for {
36471 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36472 right := v_0
36473 if right.Op != OpRsh8Ux64 {
36474 continue
36475 }
36476 y := right.Args[1]
36477 x := right.Args[0]
36478 left := v_1
36479 if left.Op != OpLsh8x64 {
36480 continue
36481 }
36482 _ = left.Args[1]
36483 if x != left.Args[0] {
36484 continue
36485 }
36486 z := left.Args[1]
36487 if z.Op != OpSub64 {
36488 continue
36489 }
36490 _ = z.Args[1]
36491 z_0 := z.Args[0]
36492 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36493 continue
36494 }
36495 v.reset(OpRotateLeft8)
36496 v.AddArg2(x, z)
36497 return true
36498 }
36499 break
36500 }
36501
36502
36503
36504 for {
36505 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36506 right := v_0
36507 if right.Op != OpRsh8Ux32 {
36508 continue
36509 }
36510 y := right.Args[1]
36511 x := right.Args[0]
36512 left := v_1
36513 if left.Op != OpLsh8x32 {
36514 continue
36515 }
36516 _ = left.Args[1]
36517 if x != left.Args[0] {
36518 continue
36519 }
36520 z := left.Args[1]
36521 if z.Op != OpSub32 {
36522 continue
36523 }
36524 _ = z.Args[1]
36525 z_0 := z.Args[0]
36526 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36527 continue
36528 }
36529 v.reset(OpRotateLeft8)
36530 v.AddArg2(x, z)
36531 return true
36532 }
36533 break
36534 }
36535
36536
36537
36538 for {
36539 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36540 right := v_0
36541 if right.Op != OpRsh8Ux16 {
36542 continue
36543 }
36544 y := right.Args[1]
36545 x := right.Args[0]
36546 left := v_1
36547 if left.Op != OpLsh8x16 {
36548 continue
36549 }
36550 _ = left.Args[1]
36551 if x != left.Args[0] {
36552 continue
36553 }
36554 z := left.Args[1]
36555 if z.Op != OpSub16 {
36556 continue
36557 }
36558 _ = z.Args[1]
36559 z_0 := z.Args[0]
36560 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36561 continue
36562 }
36563 v.reset(OpRotateLeft8)
36564 v.AddArg2(x, z)
36565 return true
36566 }
36567 break
36568 }
36569
36570
36571
36572 for {
36573 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36574 right := v_0
36575 if right.Op != OpRsh8Ux8 {
36576 continue
36577 }
36578 y := right.Args[1]
36579 x := right.Args[0]
36580 left := v_1
36581 if left.Op != OpLsh8x8 {
36582 continue
36583 }
36584 _ = left.Args[1]
36585 if x != left.Args[0] {
36586 continue
36587 }
36588 z := left.Args[1]
36589 if z.Op != OpSub8 {
36590 continue
36591 }
36592 _ = z.Args[1]
36593 z_0 := z.Args[0]
36594 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36595 continue
36596 }
36597 v.reset(OpRotateLeft8)
36598 v.AddArg2(x, z)
36599 return true
36600 }
36601 break
36602 }
36603 return false
36604 }
36605 func rewriteValuegeneric_OpZero(v *Value) bool {
36606 v_1 := v.Args[1]
36607 v_0 := v.Args[0]
36608 b := v.Block
36609
36610
36611
36612 for {
36613 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
36614 break
36615 }
36616 call := v_0.Args[0]
36617 if call.Op != OpStaticLECall {
36618 break
36619 }
36620 mem := v_1
36621 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isMalloc(call.Aux)) {
36622 break
36623 }
36624 v.copyOf(mem)
36625 return true
36626 }
36627
36628
36629
36630 for {
36631 n := auxIntToInt64(v.AuxInt)
36632 t1 := auxToType(v.Aux)
36633 p1 := v_0
36634 store := v_1
36635 if store.Op != OpStore {
36636 break
36637 }
36638 t2 := auxToType(store.Aux)
36639 mem := store.Args[2]
36640 store_0 := store.Args[0]
36641 if store_0.Op != OpOffPtr {
36642 break
36643 }
36644 o2 := auxIntToInt64(store_0.AuxInt)
36645 p2 := store_0.Args[0]
36646 if !(isSamePtr(p1, p2) && store.Uses == 1 && n >= o2+t2.Size() && clobber(store)) {
36647 break
36648 }
36649 v.reset(OpZero)
36650 v.AuxInt = int64ToAuxInt(n)
36651 v.Aux = typeToAux(t1)
36652 v.AddArg2(p1, mem)
36653 return true
36654 }
36655
36656
36657
36658 for {
36659 n := auxIntToInt64(v.AuxInt)
36660 t := auxToType(v.Aux)
36661 dst1 := v_0
36662 move := v_1
36663 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
36664 break
36665 }
36666 mem := move.Args[2]
36667 dst2 := move.Args[0]
36668 if !(move.Uses == 1 && isSamePtr(dst1, dst2) && clobber(move)) {
36669 break
36670 }
36671 v.reset(OpZero)
36672 v.AuxInt = int64ToAuxInt(n)
36673 v.Aux = typeToAux(t)
36674 v.AddArg2(dst1, mem)
36675 return true
36676 }
36677
36678
36679
36680 for {
36681 n := auxIntToInt64(v.AuxInt)
36682 t := auxToType(v.Aux)
36683 dst1 := v_0
36684 vardef := v_1
36685 if vardef.Op != OpVarDef {
36686 break
36687 }
36688 x := auxToSym(vardef.Aux)
36689 move := vardef.Args[0]
36690 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
36691 break
36692 }
36693 mem := move.Args[2]
36694 dst2 := move.Args[0]
36695 if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && clobber(move, vardef)) {
36696 break
36697 }
36698 v.reset(OpZero)
36699 v.AuxInt = int64ToAuxInt(n)
36700 v.Aux = typeToAux(t)
36701 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
36702 v0.Aux = symToAux(x)
36703 v0.AddArg(mem)
36704 v.AddArg2(dst1, v0)
36705 return true
36706 }
36707
36708
36709
36710 for {
36711 s := auxIntToInt64(v.AuxInt)
36712 t := auxToType(v.Aux)
36713 dst1 := v_0
36714 zero := v_1
36715 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != s || auxToType(zero.Aux) != t {
36716 break
36717 }
36718 dst2 := zero.Args[0]
36719 if !(isSamePtr(dst1, dst2)) {
36720 break
36721 }
36722 v.copyOf(zero)
36723 return true
36724 }
36725
36726
36727
36728 for {
36729 s := auxIntToInt64(v.AuxInt)
36730 t := auxToType(v.Aux)
36731 dst1 := v_0
36732 vardef := v_1
36733 if vardef.Op != OpVarDef {
36734 break
36735 }
36736 vardef_0 := vardef.Args[0]
36737 if vardef_0.Op != OpZero || auxIntToInt64(vardef_0.AuxInt) != s || auxToType(vardef_0.Aux) != t {
36738 break
36739 }
36740 dst2 := vardef_0.Args[0]
36741 if !(isSamePtr(dst1, dst2)) {
36742 break
36743 }
36744 v.copyOf(vardef)
36745 return true
36746 }
36747 return false
36748 }
36749 func rewriteValuegeneric_OpZeroExt16to32(v *Value) bool {
36750 v_0 := v.Args[0]
36751
36752
36753 for {
36754 if v_0.Op != OpConst16 {
36755 break
36756 }
36757 c := auxIntToInt16(v_0.AuxInt)
36758 v.reset(OpConst32)
36759 v.AuxInt = int32ToAuxInt(int32(uint16(c)))
36760 return true
36761 }
36762
36763
36764
36765 for {
36766 if v_0.Op != OpTrunc32to16 {
36767 break
36768 }
36769 x := v_0.Args[0]
36770 if x.Op != OpRsh32Ux64 {
36771 break
36772 }
36773 _ = x.Args[1]
36774 x_1 := x.Args[1]
36775 if x_1.Op != OpConst64 {
36776 break
36777 }
36778 s := auxIntToInt64(x_1.AuxInt)
36779 if !(s >= 16) {
36780 break
36781 }
36782 v.copyOf(x)
36783 return true
36784 }
36785 return false
36786 }
36787 func rewriteValuegeneric_OpZeroExt16to64(v *Value) bool {
36788 v_0 := v.Args[0]
36789
36790
36791 for {
36792 if v_0.Op != OpConst16 {
36793 break
36794 }
36795 c := auxIntToInt16(v_0.AuxInt)
36796 v.reset(OpConst64)
36797 v.AuxInt = int64ToAuxInt(int64(uint16(c)))
36798 return true
36799 }
36800
36801
36802
36803 for {
36804 if v_0.Op != OpTrunc64to16 {
36805 break
36806 }
36807 x := v_0.Args[0]
36808 if x.Op != OpRsh64Ux64 {
36809 break
36810 }
36811 _ = x.Args[1]
36812 x_1 := x.Args[1]
36813 if x_1.Op != OpConst64 {
36814 break
36815 }
36816 s := auxIntToInt64(x_1.AuxInt)
36817 if !(s >= 48) {
36818 break
36819 }
36820 v.copyOf(x)
36821 return true
36822 }
36823 return false
36824 }
36825 func rewriteValuegeneric_OpZeroExt32to64(v *Value) bool {
36826 v_0 := v.Args[0]
36827
36828
36829 for {
36830 if v_0.Op != OpConst32 {
36831 break
36832 }
36833 c := auxIntToInt32(v_0.AuxInt)
36834 v.reset(OpConst64)
36835 v.AuxInt = int64ToAuxInt(int64(uint32(c)))
36836 return true
36837 }
36838
36839
36840
36841 for {
36842 if v_0.Op != OpTrunc64to32 {
36843 break
36844 }
36845 x := v_0.Args[0]
36846 if x.Op != OpRsh64Ux64 {
36847 break
36848 }
36849 _ = x.Args[1]
36850 x_1 := x.Args[1]
36851 if x_1.Op != OpConst64 {
36852 break
36853 }
36854 s := auxIntToInt64(x_1.AuxInt)
36855 if !(s >= 32) {
36856 break
36857 }
36858 v.copyOf(x)
36859 return true
36860 }
36861 return false
36862 }
36863 func rewriteValuegeneric_OpZeroExt8to16(v *Value) bool {
36864 v_0 := v.Args[0]
36865
36866
36867 for {
36868 if v_0.Op != OpConst8 {
36869 break
36870 }
36871 c := auxIntToInt8(v_0.AuxInt)
36872 v.reset(OpConst16)
36873 v.AuxInt = int16ToAuxInt(int16(uint8(c)))
36874 return true
36875 }
36876
36877
36878
36879 for {
36880 if v_0.Op != OpTrunc16to8 {
36881 break
36882 }
36883 x := v_0.Args[0]
36884 if x.Op != OpRsh16Ux64 {
36885 break
36886 }
36887 _ = x.Args[1]
36888 x_1 := x.Args[1]
36889 if x_1.Op != OpConst64 {
36890 break
36891 }
36892 s := auxIntToInt64(x_1.AuxInt)
36893 if !(s >= 8) {
36894 break
36895 }
36896 v.copyOf(x)
36897 return true
36898 }
36899 return false
36900 }
36901 func rewriteValuegeneric_OpZeroExt8to32(v *Value) bool {
36902 v_0 := v.Args[0]
36903
36904
36905 for {
36906 if v_0.Op != OpConst8 {
36907 break
36908 }
36909 c := auxIntToInt8(v_0.AuxInt)
36910 v.reset(OpConst32)
36911 v.AuxInt = int32ToAuxInt(int32(uint8(c)))
36912 return true
36913 }
36914
36915
36916
36917 for {
36918 if v_0.Op != OpTrunc32to8 {
36919 break
36920 }
36921 x := v_0.Args[0]
36922 if x.Op != OpRsh32Ux64 {
36923 break
36924 }
36925 _ = x.Args[1]
36926 x_1 := x.Args[1]
36927 if x_1.Op != OpConst64 {
36928 break
36929 }
36930 s := auxIntToInt64(x_1.AuxInt)
36931 if !(s >= 24) {
36932 break
36933 }
36934 v.copyOf(x)
36935 return true
36936 }
36937 return false
36938 }
36939 func rewriteValuegeneric_OpZeroExt8to64(v *Value) bool {
36940 v_0 := v.Args[0]
36941
36942
36943 for {
36944 if v_0.Op != OpConst8 {
36945 break
36946 }
36947 c := auxIntToInt8(v_0.AuxInt)
36948 v.reset(OpConst64)
36949 v.AuxInt = int64ToAuxInt(int64(uint8(c)))
36950 return true
36951 }
36952
36953
36954
36955 for {
36956 if v_0.Op != OpTrunc64to8 {
36957 break
36958 }
36959 x := v_0.Args[0]
36960 if x.Op != OpRsh64Ux64 {
36961 break
36962 }
36963 _ = x.Args[1]
36964 x_1 := x.Args[1]
36965 if x_1.Op != OpConst64 {
36966 break
36967 }
36968 s := auxIntToInt64(x_1.AuxInt)
36969 if !(s >= 56) {
36970 break
36971 }
36972 v.copyOf(x)
36973 return true
36974 }
36975 return false
36976 }
36977 func rewriteBlockgeneric(b *Block) bool {
36978 switch b.Kind {
36979 case BlockIf:
36980
36981
36982 for b.Controls[0].Op == OpNot {
36983 v_0 := b.Controls[0]
36984 cond := v_0.Args[0]
36985 b.resetWithControl(BlockIf, cond)
36986 b.swapSuccessors()
36987 return true
36988 }
36989
36990
36991
36992 for b.Controls[0].Op == OpConstBool {
36993 v_0 := b.Controls[0]
36994 c := auxIntToBool(v_0.AuxInt)
36995 if !(c) {
36996 break
36997 }
36998 b.Reset(BlockFirst)
36999 return true
37000 }
37001
37002
37003
37004 for b.Controls[0].Op == OpConstBool {
37005 v_0 := b.Controls[0]
37006 c := auxIntToBool(v_0.AuxInt)
37007 if !(!c) {
37008 break
37009 }
37010 b.Reset(BlockFirst)
37011 b.swapSuccessors()
37012 return true
37013 }
37014 }
37015 return false
37016 }
37017
View as plain text