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 op := v_0
5920 if op.Op != OpAdd8 {
5921 break
5922 }
5923 t := op.Type
5924 _ = op.Args[1]
5925 op_0 := op.Args[0]
5926 op_1 := op.Args[1]
5927 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
5928 x := op_0
5929 c := op_1
5930 if c.Op != OpConst8 || x != v_1 {
5931 continue
5932 }
5933 bool := v_2
5934 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
5935 continue
5936 }
5937 v.reset(OpAdd8)
5938 v0 := b.NewValue0(v.Pos, OpMul8, t)
5939 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
5940 v1.AddArg(bool)
5941 v0.AddArg2(c, v1)
5942 v.AddArg2(x, v0)
5943 return true
5944 }
5945 break
5946 }
5947
5948
5949
5950 for {
5951 op := v_0
5952 if op.Op != OpAdd64 {
5953 break
5954 }
5955 t := op.Type
5956 _ = op.Args[1]
5957 op_0 := op.Args[0]
5958 op_1 := op.Args[1]
5959 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
5960 x := op_0
5961 c := op_1
5962 if c.Op != OpConst64 || x != v_1 {
5963 continue
5964 }
5965 bool := v_2
5966 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
5967 continue
5968 }
5969 v.reset(OpAdd64)
5970 v0 := b.NewValue0(v.Pos, OpMul64, t)
5971 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
5972 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
5973 v2.AddArg(bool)
5974 v1.AddArg(v2)
5975 v0.AddArg2(c, v1)
5976 v.AddArg2(x, v0)
5977 return true
5978 }
5979 break
5980 }
5981
5982
5983
5984 for {
5985 op := v_0
5986 if op.Op != OpAdd32 {
5987 break
5988 }
5989 t := op.Type
5990 _ = op.Args[1]
5991 op_0 := op.Args[0]
5992 op_1 := op.Args[1]
5993 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
5994 x := op_0
5995 c := op_1
5996 if c.Op != OpConst32 || x != v_1 {
5997 continue
5998 }
5999 bool := v_2
6000 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
6001 continue
6002 }
6003 v.reset(OpAdd32)
6004 v0 := b.NewValue0(v.Pos, OpMul32, t)
6005 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
6006 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6007 v2.AddArg(bool)
6008 v1.AddArg(v2)
6009 v0.AddArg2(c, v1)
6010 v.AddArg2(x, v0)
6011 return true
6012 }
6013 break
6014 }
6015
6016
6017
6018 for {
6019 op := v_0
6020 if op.Op != OpAdd16 {
6021 break
6022 }
6023 t := op.Type
6024 _ = op.Args[1]
6025 op_0 := op.Args[0]
6026 op_1 := op.Args[1]
6027 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6028 x := op_0
6029 c := op_1
6030 if c.Op != OpConst16 || x != v_1 {
6031 continue
6032 }
6033 bool := v_2
6034 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
6035 continue
6036 }
6037 v.reset(OpAdd16)
6038 v0 := b.NewValue0(v.Pos, OpMul16, t)
6039 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6040 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6041 v2.AddArg(bool)
6042 v1.AddArg(v2)
6043 v0.AddArg2(c, v1)
6044 v.AddArg2(x, v0)
6045 return true
6046 }
6047 break
6048 }
6049
6050
6051
6052 for {
6053 x := v_0
6054 op := v_1
6055 if op.Op != OpAdd8 {
6056 break
6057 }
6058 t := op.Type
6059 _ = op.Args[1]
6060 op_0 := op.Args[0]
6061 op_1 := op.Args[1]
6062 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6063 if x != op_0 {
6064 continue
6065 }
6066 c := op_1
6067 if c.Op != OpConst8 {
6068 continue
6069 }
6070 bool := v_2
6071 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
6072 continue
6073 }
6074 v.reset(OpAdd8)
6075 v0 := b.NewValue0(v.Pos, OpMul8, t)
6076 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
6077 v2 := b.NewValue0(v.Pos, OpNot, bool.Type)
6078 v2.AddArg(bool)
6079 v1.AddArg(v2)
6080 v0.AddArg2(c, v1)
6081 v.AddArg2(x, v0)
6082 return true
6083 }
6084 break
6085 }
6086
6087
6088
6089 for {
6090 x := v_0
6091 op := v_1
6092 if op.Op != OpAdd64 {
6093 break
6094 }
6095 t := op.Type
6096 _ = op.Args[1]
6097 op_0 := op.Args[0]
6098 op_1 := op.Args[1]
6099 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6100 if x != op_0 {
6101 continue
6102 }
6103 c := op_1
6104 if c.Op != OpConst64 {
6105 continue
6106 }
6107 bool := v_2
6108 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
6109 continue
6110 }
6111 v.reset(OpAdd64)
6112 v0 := b.NewValue0(v.Pos, OpMul64, t)
6113 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
6114 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6115 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
6116 v3.AddArg(bool)
6117 v2.AddArg(v3)
6118 v1.AddArg(v2)
6119 v0.AddArg2(c, v1)
6120 v.AddArg2(x, v0)
6121 return true
6122 }
6123 break
6124 }
6125
6126
6127
6128 for {
6129 x := v_0
6130 op := v_1
6131 if op.Op != OpAdd32 {
6132 break
6133 }
6134 t := op.Type
6135 _ = op.Args[1]
6136 op_0 := op.Args[0]
6137 op_1 := op.Args[1]
6138 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6139 if x != op_0 {
6140 continue
6141 }
6142 c := op_1
6143 if c.Op != OpConst32 {
6144 continue
6145 }
6146 bool := v_2
6147 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
6148 continue
6149 }
6150 v.reset(OpAdd32)
6151 v0 := b.NewValue0(v.Pos, OpMul32, t)
6152 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
6153 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6154 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
6155 v3.AddArg(bool)
6156 v2.AddArg(v3)
6157 v1.AddArg(v2)
6158 v0.AddArg2(c, v1)
6159 v.AddArg2(x, v0)
6160 return true
6161 }
6162 break
6163 }
6164
6165
6166
6167 for {
6168 x := v_0
6169 op := v_1
6170 if op.Op != OpAdd16 {
6171 break
6172 }
6173 t := op.Type
6174 _ = op.Args[1]
6175 op_0 := op.Args[0]
6176 op_1 := op.Args[1]
6177 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6178 if x != op_0 {
6179 continue
6180 }
6181 c := op_1
6182 if c.Op != OpConst16 {
6183 continue
6184 }
6185 bool := v_2
6186 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
6187 continue
6188 }
6189 v.reset(OpAdd16)
6190 v0 := b.NewValue0(v.Pos, OpMul16, t)
6191 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6192 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6193 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
6194 v3.AddArg(bool)
6195 v2.AddArg(v3)
6196 v1.AddArg(v2)
6197 v0.AddArg2(c, v1)
6198 v.AddArg2(x, v0)
6199 return true
6200 }
6201 break
6202 }
6203
6204
6205
6206 for {
6207 op := v_0
6208 if op.Op != OpAdd8 {
6209 break
6210 }
6211 t := op.Type
6212 _ = op.Args[1]
6213 op_0 := op.Args[0]
6214 op_1 := op.Args[1]
6215 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6216 x := op_0
6217 c := op_1
6218 if c.Op != OpConst8 {
6219 continue
6220 }
6221 consT := auxIntToInt8(c.AuxInt)
6222 if x != v_1 {
6223 continue
6224 }
6225 bool := v_2
6226 if !(!rewriteCondSelectIntoMath(config, op.Op, c.AuxInt) && rewriteCondSelectIntoMath(config, addToSub(op.Op), -c.AuxInt)) {
6227 continue
6228 }
6229 v.reset(OpSub8)
6230 v0 := b.NewValue0(v.Pos, OpMul8, t)
6231 v1 := b.NewValue0(v.Pos, OpConst8, t)
6232 v1.AuxInt = int8ToAuxInt(-consT)
6233 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
6234 v2.AddArg(bool)
6235 v0.AddArg2(v1, v2)
6236 v.AddArg2(x, v0)
6237 return true
6238 }
6239 break
6240 }
6241
6242
6243
6244 for {
6245 op := v_0
6246 if op.Op != OpAdd64 {
6247 break
6248 }
6249 t := op.Type
6250 _ = op.Args[1]
6251 op_0 := op.Args[0]
6252 op_1 := op.Args[1]
6253 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6254 x := op_0
6255 c := op_1
6256 if c.Op != OpConst64 {
6257 continue
6258 }
6259 consT := auxIntToInt64(c.AuxInt)
6260 if x != v_1 {
6261 continue
6262 }
6263 bool := v_2
6264 if !(!rewriteCondSelectIntoMath(config, op.Op, c.AuxInt) && rewriteCondSelectIntoMath(config, addToSub(op.Op), -c.AuxInt)) {
6265 continue
6266 }
6267 v.reset(OpSub64)
6268 v0 := b.NewValue0(v.Pos, OpMul64, t)
6269 v1 := b.NewValue0(v.Pos, OpConst64, t)
6270 v1.AuxInt = int64ToAuxInt(-consT)
6271 v2 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
6272 v3 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6273 v3.AddArg(bool)
6274 v2.AddArg(v3)
6275 v0.AddArg2(v1, v2)
6276 v.AddArg2(x, v0)
6277 return true
6278 }
6279 break
6280 }
6281
6282
6283
6284 for {
6285 op := v_0
6286 if op.Op != OpAdd32 {
6287 break
6288 }
6289 t := op.Type
6290 _ = op.Args[1]
6291 op_0 := op.Args[0]
6292 op_1 := op.Args[1]
6293 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6294 x := op_0
6295 c := op_1
6296 if c.Op != OpConst32 {
6297 continue
6298 }
6299 consT := auxIntToInt32(c.AuxInt)
6300 if x != v_1 {
6301 continue
6302 }
6303 bool := v_2
6304 if !(!rewriteCondSelectIntoMath(config, op.Op, c.AuxInt) && rewriteCondSelectIntoMath(config, addToSub(op.Op), -c.AuxInt)) {
6305 continue
6306 }
6307 v.reset(OpSub32)
6308 v0 := b.NewValue0(v.Pos, OpMul32, t)
6309 v1 := b.NewValue0(v.Pos, OpConst32, t)
6310 v1.AuxInt = int32ToAuxInt(-consT)
6311 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
6312 v3 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6313 v3.AddArg(bool)
6314 v2.AddArg(v3)
6315 v0.AddArg2(v1, v2)
6316 v.AddArg2(x, v0)
6317 return true
6318 }
6319 break
6320 }
6321
6322
6323
6324 for {
6325 op := v_0
6326 if op.Op != OpAdd16 {
6327 break
6328 }
6329 t := op.Type
6330 _ = op.Args[1]
6331 op_0 := op.Args[0]
6332 op_1 := op.Args[1]
6333 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6334 x := op_0
6335 c := op_1
6336 if c.Op != OpConst16 {
6337 continue
6338 }
6339 consT := auxIntToInt16(c.AuxInt)
6340 if x != v_1 {
6341 continue
6342 }
6343 bool := v_2
6344 if !(!rewriteCondSelectIntoMath(config, op.Op, c.AuxInt) && rewriteCondSelectIntoMath(config, addToSub(op.Op), -c.AuxInt)) {
6345 continue
6346 }
6347 v.reset(OpSub16)
6348 v0 := b.NewValue0(v.Pos, OpMul16, t)
6349 v1 := b.NewValue0(v.Pos, OpConst16, t)
6350 v1.AuxInt = int16ToAuxInt(-consT)
6351 v2 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6352 v3 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6353 v3.AddArg(bool)
6354 v2.AddArg(v3)
6355 v0.AddArg2(v1, v2)
6356 v.AddArg2(x, v0)
6357 return true
6358 }
6359 break
6360 }
6361
6362
6363
6364 for {
6365 x := v_0
6366 op := v_1
6367 if op.Op != OpAdd8 {
6368 break
6369 }
6370 t := op.Type
6371 _ = op.Args[1]
6372 op_0 := op.Args[0]
6373 op_1 := op.Args[1]
6374 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6375 if x != op_0 {
6376 continue
6377 }
6378 c := op_1
6379 if c.Op != OpConst8 {
6380 continue
6381 }
6382 consT := auxIntToInt8(c.AuxInt)
6383 bool := v_2
6384 if !(!rewriteCondSelectIntoMath(config, op.Op, c.AuxInt) && rewriteCondSelectIntoMath(config, addToSub(op.Op), -c.AuxInt)) {
6385 continue
6386 }
6387 v.reset(OpSub8)
6388 v0 := b.NewValue0(v.Pos, OpMul8, t)
6389 v1 := b.NewValue0(v.Pos, OpConst8, t)
6390 v1.AuxInt = int8ToAuxInt(-consT)
6391 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
6392 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
6393 v3.AddArg(bool)
6394 v2.AddArg(v3)
6395 v0.AddArg2(v1, v2)
6396 v.AddArg2(x, v0)
6397 return true
6398 }
6399 break
6400 }
6401
6402
6403
6404 for {
6405 x := v_0
6406 op := v_1
6407 if op.Op != OpAdd64 {
6408 break
6409 }
6410 t := op.Type
6411 _ = op.Args[1]
6412 op_0 := op.Args[0]
6413 op_1 := op.Args[1]
6414 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6415 if x != op_0 {
6416 continue
6417 }
6418 c := op_1
6419 if c.Op != OpConst64 {
6420 continue
6421 }
6422 consT := auxIntToInt64(c.AuxInt)
6423 bool := v_2
6424 if !(!rewriteCondSelectIntoMath(config, op.Op, c.AuxInt) && rewriteCondSelectIntoMath(config, addToSub(op.Op), -c.AuxInt)) {
6425 continue
6426 }
6427 v.reset(OpSub64)
6428 v0 := b.NewValue0(v.Pos, OpMul64, t)
6429 v1 := b.NewValue0(v.Pos, OpConst64, t)
6430 v1.AuxInt = int64ToAuxInt(-consT)
6431 v2 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
6432 v3 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6433 v4 := b.NewValue0(v.Pos, OpNot, bool.Type)
6434 v4.AddArg(bool)
6435 v3.AddArg(v4)
6436 v2.AddArg(v3)
6437 v0.AddArg2(v1, v2)
6438 v.AddArg2(x, v0)
6439 return true
6440 }
6441 break
6442 }
6443
6444
6445
6446 for {
6447 x := v_0
6448 op := v_1
6449 if op.Op != OpAdd32 {
6450 break
6451 }
6452 t := op.Type
6453 _ = op.Args[1]
6454 op_0 := op.Args[0]
6455 op_1 := op.Args[1]
6456 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6457 if x != op_0 {
6458 continue
6459 }
6460 c := op_1
6461 if c.Op != OpConst32 {
6462 continue
6463 }
6464 consT := auxIntToInt32(c.AuxInt)
6465 bool := v_2
6466 if !(!rewriteCondSelectIntoMath(config, op.Op, c.AuxInt) && rewriteCondSelectIntoMath(config, addToSub(op.Op), -c.AuxInt)) {
6467 continue
6468 }
6469 v.reset(OpSub32)
6470 v0 := b.NewValue0(v.Pos, OpMul32, t)
6471 v1 := b.NewValue0(v.Pos, OpConst32, t)
6472 v1.AuxInt = int32ToAuxInt(-consT)
6473 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
6474 v3 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6475 v4 := b.NewValue0(v.Pos, OpNot, bool.Type)
6476 v4.AddArg(bool)
6477 v3.AddArg(v4)
6478 v2.AddArg(v3)
6479 v0.AddArg2(v1, v2)
6480 v.AddArg2(x, v0)
6481 return true
6482 }
6483 break
6484 }
6485
6486
6487
6488 for {
6489 x := v_0
6490 op := v_1
6491 if op.Op != OpAdd16 {
6492 break
6493 }
6494 t := op.Type
6495 _ = op.Args[1]
6496 op_0 := op.Args[0]
6497 op_1 := op.Args[1]
6498 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6499 if x != op_0 {
6500 continue
6501 }
6502 c := op_1
6503 if c.Op != OpConst16 {
6504 continue
6505 }
6506 consT := auxIntToInt16(c.AuxInt)
6507 bool := v_2
6508 if !(!rewriteCondSelectIntoMath(config, op.Op, c.AuxInt) && rewriteCondSelectIntoMath(config, addToSub(op.Op), -c.AuxInt)) {
6509 continue
6510 }
6511 v.reset(OpSub16)
6512 v0 := b.NewValue0(v.Pos, OpMul16, t)
6513 v1 := b.NewValue0(v.Pos, OpConst16, t)
6514 v1.AuxInt = int16ToAuxInt(-consT)
6515 v2 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6516 v3 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6517 v4 := b.NewValue0(v.Pos, OpNot, bool.Type)
6518 v4.AddArg(bool)
6519 v3.AddArg(v4)
6520 v2.AddArg(v3)
6521 v0.AddArg2(v1, v2)
6522 v.AddArg2(x, v0)
6523 return true
6524 }
6525 break
6526 }
6527
6528
6529 for {
6530 if v_0.Op != OpLsh64x64 {
6531 break
6532 }
6533 _ = v_0.Args[1]
6534 x := v_0.Args[0]
6535 v_0_1 := v_0.Args[1]
6536 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6537 break
6538 }
6539 bool := v_2
6540 v.reset(OpLsh64x8)
6541 v.AuxInt = boolToAuxInt(true)
6542 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6543 v0.AddArg(bool)
6544 v.AddArg2(x, v0)
6545 return true
6546 }
6547
6548
6549 for {
6550 if v_0.Op != OpLsh32x64 {
6551 break
6552 }
6553 _ = v_0.Args[1]
6554 x := v_0.Args[0]
6555 v_0_1 := v_0.Args[1]
6556 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6557 break
6558 }
6559 bool := v_2
6560 v.reset(OpLsh32x8)
6561 v.AuxInt = boolToAuxInt(true)
6562 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6563 v0.AddArg(bool)
6564 v.AddArg2(x, v0)
6565 return true
6566 }
6567
6568
6569 for {
6570 if v_0.Op != OpLsh16x64 {
6571 break
6572 }
6573 _ = v_0.Args[1]
6574 x := v_0.Args[0]
6575 v_0_1 := v_0.Args[1]
6576 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6577 break
6578 }
6579 bool := v_2
6580 v.reset(OpLsh16x8)
6581 v.AuxInt = boolToAuxInt(true)
6582 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6583 v0.AddArg(bool)
6584 v.AddArg2(x, v0)
6585 return true
6586 }
6587
6588
6589 for {
6590 if v_0.Op != OpLsh8x64 {
6591 break
6592 }
6593 _ = v_0.Args[1]
6594 x := v_0.Args[0]
6595 v_0_1 := v_0.Args[1]
6596 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6597 break
6598 }
6599 bool := v_2
6600 v.reset(OpLsh8x8)
6601 v.AuxInt = boolToAuxInt(true)
6602 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6603 v0.AddArg(bool)
6604 v.AddArg2(x, v0)
6605 return true
6606 }
6607
6608
6609 for {
6610 x := v_0
6611 if v_1.Op != OpLsh64x64 {
6612 break
6613 }
6614 _ = v_1.Args[1]
6615 if x != v_1.Args[0] {
6616 break
6617 }
6618 v_1_1 := v_1.Args[1]
6619 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6620 break
6621 }
6622 bool := v_2
6623 v.reset(OpLsh64x8)
6624 v.AuxInt = boolToAuxInt(true)
6625 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6626 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6627 v1.AddArg(bool)
6628 v0.AddArg(v1)
6629 v.AddArg2(x, v0)
6630 return true
6631 }
6632
6633
6634 for {
6635 x := v_0
6636 if v_1.Op != OpLsh32x64 {
6637 break
6638 }
6639 _ = v_1.Args[1]
6640 if x != v_1.Args[0] {
6641 break
6642 }
6643 v_1_1 := v_1.Args[1]
6644 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6645 break
6646 }
6647 bool := v_2
6648 v.reset(OpLsh32x8)
6649 v.AuxInt = boolToAuxInt(true)
6650 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6651 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6652 v1.AddArg(bool)
6653 v0.AddArg(v1)
6654 v.AddArg2(x, v0)
6655 return true
6656 }
6657
6658
6659 for {
6660 x := v_0
6661 if v_1.Op != OpLsh16x64 {
6662 break
6663 }
6664 _ = v_1.Args[1]
6665 if x != v_1.Args[0] {
6666 break
6667 }
6668 v_1_1 := v_1.Args[1]
6669 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6670 break
6671 }
6672 bool := v_2
6673 v.reset(OpLsh16x8)
6674 v.AuxInt = boolToAuxInt(true)
6675 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6676 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6677 v1.AddArg(bool)
6678 v0.AddArg(v1)
6679 v.AddArg2(x, v0)
6680 return true
6681 }
6682
6683
6684 for {
6685 x := v_0
6686 if v_1.Op != OpLsh8x64 {
6687 break
6688 }
6689 _ = v_1.Args[1]
6690 if x != v_1.Args[0] {
6691 break
6692 }
6693 v_1_1 := v_1.Args[1]
6694 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6695 break
6696 }
6697 bool := v_2
6698 v.reset(OpLsh8x8)
6699 v.AuxInt = boolToAuxInt(true)
6700 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6701 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6702 v1.AddArg(bool)
6703 v0.AddArg(v1)
6704 v.AddArg2(x, v0)
6705 return true
6706 }
6707
6708
6709 for {
6710 if v_0.Op != OpRsh64x64 {
6711 break
6712 }
6713 _ = v_0.Args[1]
6714 x := v_0.Args[0]
6715 v_0_1 := v_0.Args[1]
6716 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6717 break
6718 }
6719 bool := v_2
6720 v.reset(OpRsh64x8)
6721 v.AuxInt = boolToAuxInt(true)
6722 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6723 v0.AddArg(bool)
6724 v.AddArg2(x, v0)
6725 return true
6726 }
6727
6728
6729 for {
6730 if v_0.Op != OpRsh32x64 {
6731 break
6732 }
6733 _ = v_0.Args[1]
6734 x := v_0.Args[0]
6735 v_0_1 := v_0.Args[1]
6736 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6737 break
6738 }
6739 bool := v_2
6740 v.reset(OpRsh32x8)
6741 v.AuxInt = boolToAuxInt(true)
6742 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6743 v0.AddArg(bool)
6744 v.AddArg2(x, v0)
6745 return true
6746 }
6747
6748
6749 for {
6750 if v_0.Op != OpRsh16x64 {
6751 break
6752 }
6753 _ = v_0.Args[1]
6754 x := v_0.Args[0]
6755 v_0_1 := v_0.Args[1]
6756 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6757 break
6758 }
6759 bool := v_2
6760 v.reset(OpRsh16x8)
6761 v.AuxInt = boolToAuxInt(true)
6762 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6763 v0.AddArg(bool)
6764 v.AddArg2(x, v0)
6765 return true
6766 }
6767
6768
6769 for {
6770 if v_0.Op != OpRsh8x64 {
6771 break
6772 }
6773 _ = v_0.Args[1]
6774 x := v_0.Args[0]
6775 v_0_1 := v_0.Args[1]
6776 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6777 break
6778 }
6779 bool := v_2
6780 v.reset(OpRsh8x8)
6781 v.AuxInt = boolToAuxInt(true)
6782 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6783 v0.AddArg(bool)
6784 v.AddArg2(x, v0)
6785 return true
6786 }
6787
6788
6789 for {
6790 if v_0.Op != OpRsh64Ux64 {
6791 break
6792 }
6793 _ = v_0.Args[1]
6794 x := v_0.Args[0]
6795 v_0_1 := v_0.Args[1]
6796 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6797 break
6798 }
6799 bool := v_2
6800 v.reset(OpRsh64Ux8)
6801 v.AuxInt = boolToAuxInt(true)
6802 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6803 v0.AddArg(bool)
6804 v.AddArg2(x, v0)
6805 return true
6806 }
6807
6808
6809 for {
6810 if v_0.Op != OpRsh32Ux64 {
6811 break
6812 }
6813 _ = v_0.Args[1]
6814 x := v_0.Args[0]
6815 v_0_1 := v_0.Args[1]
6816 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6817 break
6818 }
6819 bool := v_2
6820 v.reset(OpRsh32Ux8)
6821 v.AuxInt = boolToAuxInt(true)
6822 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6823 v0.AddArg(bool)
6824 v.AddArg2(x, v0)
6825 return true
6826 }
6827
6828
6829 for {
6830 if v_0.Op != OpRsh16Ux64 {
6831 break
6832 }
6833 _ = v_0.Args[1]
6834 x := v_0.Args[0]
6835 v_0_1 := v_0.Args[1]
6836 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6837 break
6838 }
6839 bool := v_2
6840 v.reset(OpRsh16Ux8)
6841 v.AuxInt = boolToAuxInt(true)
6842 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6843 v0.AddArg(bool)
6844 v.AddArg2(x, v0)
6845 return true
6846 }
6847
6848
6849 for {
6850 if v_0.Op != OpRsh8Ux64 {
6851 break
6852 }
6853 _ = v_0.Args[1]
6854 x := v_0.Args[0]
6855 v_0_1 := v_0.Args[1]
6856 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6857 break
6858 }
6859 bool := v_2
6860 v.reset(OpRsh8Ux8)
6861 v.AuxInt = boolToAuxInt(true)
6862 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6863 v0.AddArg(bool)
6864 v.AddArg2(x, v0)
6865 return true
6866 }
6867
6868
6869 for {
6870 x := v_0
6871 if v_1.Op != OpRsh64x64 {
6872 break
6873 }
6874 _ = v_1.Args[1]
6875 if x != v_1.Args[0] {
6876 break
6877 }
6878 v_1_1 := v_1.Args[1]
6879 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6880 break
6881 }
6882 bool := v_2
6883 v.reset(OpRsh64x8)
6884 v.AuxInt = boolToAuxInt(true)
6885 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6886 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6887 v1.AddArg(bool)
6888 v0.AddArg(v1)
6889 v.AddArg2(x, v0)
6890 return true
6891 }
6892
6893
6894 for {
6895 x := v_0
6896 if v_1.Op != OpRsh32x64 {
6897 break
6898 }
6899 _ = v_1.Args[1]
6900 if x != v_1.Args[0] {
6901 break
6902 }
6903 v_1_1 := v_1.Args[1]
6904 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6905 break
6906 }
6907 bool := v_2
6908 v.reset(OpRsh32x8)
6909 v.AuxInt = boolToAuxInt(true)
6910 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6911 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6912 v1.AddArg(bool)
6913 v0.AddArg(v1)
6914 v.AddArg2(x, v0)
6915 return true
6916 }
6917
6918
6919 for {
6920 x := v_0
6921 if v_1.Op != OpRsh16x64 {
6922 break
6923 }
6924 _ = v_1.Args[1]
6925 if x != v_1.Args[0] {
6926 break
6927 }
6928 v_1_1 := v_1.Args[1]
6929 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6930 break
6931 }
6932 bool := v_2
6933 v.reset(OpRsh16x8)
6934 v.AuxInt = boolToAuxInt(true)
6935 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6936 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6937 v1.AddArg(bool)
6938 v0.AddArg(v1)
6939 v.AddArg2(x, v0)
6940 return true
6941 }
6942
6943
6944 for {
6945 x := v_0
6946 if v_1.Op != OpRsh8x64 {
6947 break
6948 }
6949 _ = v_1.Args[1]
6950 if x != v_1.Args[0] {
6951 break
6952 }
6953 v_1_1 := v_1.Args[1]
6954 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6955 break
6956 }
6957 bool := v_2
6958 v.reset(OpRsh8x8)
6959 v.AuxInt = boolToAuxInt(true)
6960 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6961 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6962 v1.AddArg(bool)
6963 v0.AddArg(v1)
6964 v.AddArg2(x, v0)
6965 return true
6966 }
6967
6968
6969 for {
6970 x := v_0
6971 if v_1.Op != OpRsh64Ux64 {
6972 break
6973 }
6974 _ = v_1.Args[1]
6975 if x != v_1.Args[0] {
6976 break
6977 }
6978 v_1_1 := v_1.Args[1]
6979 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6980 break
6981 }
6982 bool := v_2
6983 v.reset(OpRsh64Ux8)
6984 v.AuxInt = boolToAuxInt(true)
6985 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6986 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6987 v1.AddArg(bool)
6988 v0.AddArg(v1)
6989 v.AddArg2(x, v0)
6990 return true
6991 }
6992
6993
6994 for {
6995 x := v_0
6996 if v_1.Op != OpRsh32Ux64 {
6997 break
6998 }
6999 _ = v_1.Args[1]
7000 if x != v_1.Args[0] {
7001 break
7002 }
7003 v_1_1 := v_1.Args[1]
7004 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
7005 break
7006 }
7007 bool := v_2
7008 v.reset(OpRsh32Ux8)
7009 v.AuxInt = boolToAuxInt(true)
7010 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7011 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
7012 v1.AddArg(bool)
7013 v0.AddArg(v1)
7014 v.AddArg2(x, v0)
7015 return true
7016 }
7017
7018
7019 for {
7020 x := v_0
7021 if v_1.Op != OpRsh16Ux64 {
7022 break
7023 }
7024 _ = v_1.Args[1]
7025 if x != v_1.Args[0] {
7026 break
7027 }
7028 v_1_1 := v_1.Args[1]
7029 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
7030 break
7031 }
7032 bool := v_2
7033 v.reset(OpRsh16Ux8)
7034 v.AuxInt = boolToAuxInt(true)
7035 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7036 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
7037 v1.AddArg(bool)
7038 v0.AddArg(v1)
7039 v.AddArg2(x, v0)
7040 return true
7041 }
7042
7043
7044 for {
7045 x := v_0
7046 if v_1.Op != OpRsh8Ux64 {
7047 break
7048 }
7049 _ = v_1.Args[1]
7050 if x != v_1.Args[0] {
7051 break
7052 }
7053 v_1_1 := v_1.Args[1]
7054 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
7055 break
7056 }
7057 bool := v_2
7058 v.reset(OpRsh8Ux8)
7059 v.AuxInt = boolToAuxInt(true)
7060 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7061 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
7062 v1.AddArg(bool)
7063 v0.AddArg(v1)
7064 v.AddArg2(x, v0)
7065 return true
7066 }
7067
7068
7069
7070 for {
7071 op := v_0
7072 if op.Op != OpOr8 {
7073 break
7074 }
7075 t := op.Type
7076 _ = op.Args[1]
7077 op_0 := op.Args[0]
7078 op_1 := op.Args[1]
7079 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7080 x := op_0
7081 c := op_1
7082 if c.Op != OpConst8 || x != v_1 {
7083 continue
7084 }
7085 bool := v_2
7086 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7087 continue
7088 }
7089 v.reset(OpOr8)
7090 v0 := b.NewValue0(v.Pos, OpMul8, t)
7091 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
7092 v1.AddArg(bool)
7093 v0.AddArg2(c, v1)
7094 v.AddArg2(x, v0)
7095 return true
7096 }
7097 break
7098 }
7099
7100
7101
7102 for {
7103 op := v_0
7104 if op.Op != OpOr64 {
7105 break
7106 }
7107 t := op.Type
7108 _ = op.Args[1]
7109 op_0 := op.Args[0]
7110 op_1 := op.Args[1]
7111 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7112 x := op_0
7113 c := op_1
7114 if c.Op != OpConst64 || x != v_1 {
7115 continue
7116 }
7117 bool := v_2
7118 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7119 continue
7120 }
7121 v.reset(OpOr64)
7122 v0 := b.NewValue0(v.Pos, OpMul64, t)
7123 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
7124 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7125 v2.AddArg(bool)
7126 v1.AddArg(v2)
7127 v0.AddArg2(c, v1)
7128 v.AddArg2(x, v0)
7129 return true
7130 }
7131 break
7132 }
7133
7134
7135
7136 for {
7137 op := v_0
7138 if op.Op != OpOr32 {
7139 break
7140 }
7141 t := op.Type
7142 _ = op.Args[1]
7143 op_0 := op.Args[0]
7144 op_1 := op.Args[1]
7145 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7146 x := op_0
7147 c := op_1
7148 if c.Op != OpConst32 || x != v_1 {
7149 continue
7150 }
7151 bool := v_2
7152 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7153 continue
7154 }
7155 v.reset(OpOr32)
7156 v0 := b.NewValue0(v.Pos, OpMul32, t)
7157 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
7158 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7159 v2.AddArg(bool)
7160 v1.AddArg(v2)
7161 v0.AddArg2(c, v1)
7162 v.AddArg2(x, v0)
7163 return true
7164 }
7165 break
7166 }
7167
7168
7169
7170 for {
7171 op := v_0
7172 if op.Op != OpOr16 {
7173 break
7174 }
7175 t := op.Type
7176 _ = op.Args[1]
7177 op_0 := op.Args[0]
7178 op_1 := op.Args[1]
7179 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7180 x := op_0
7181 c := op_1
7182 if c.Op != OpConst16 || x != v_1 {
7183 continue
7184 }
7185 bool := v_2
7186 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7187 continue
7188 }
7189 v.reset(OpOr16)
7190 v0 := b.NewValue0(v.Pos, OpMul16, t)
7191 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
7192 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7193 v2.AddArg(bool)
7194 v1.AddArg(v2)
7195 v0.AddArg2(c, v1)
7196 v.AddArg2(x, v0)
7197 return true
7198 }
7199 break
7200 }
7201
7202
7203
7204 for {
7205 x := v_0
7206 op := v_1
7207 if op.Op != OpOr8 {
7208 break
7209 }
7210 t := op.Type
7211 _ = op.Args[1]
7212 op_0 := op.Args[0]
7213 op_1 := op.Args[1]
7214 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7215 if x != op_0 {
7216 continue
7217 }
7218 c := op_1
7219 if c.Op != OpConst8 {
7220 continue
7221 }
7222 bool := v_2
7223 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7224 continue
7225 }
7226 v.reset(OpOr8)
7227 v0 := b.NewValue0(v.Pos, OpMul8, t)
7228 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
7229 v2 := b.NewValue0(v.Pos, OpNot, bool.Type)
7230 v2.AddArg(bool)
7231 v1.AddArg(v2)
7232 v0.AddArg2(c, v1)
7233 v.AddArg2(x, v0)
7234 return true
7235 }
7236 break
7237 }
7238
7239
7240
7241 for {
7242 x := v_0
7243 op := v_1
7244 if op.Op != OpOr64 {
7245 break
7246 }
7247 t := op.Type
7248 _ = op.Args[1]
7249 op_0 := op.Args[0]
7250 op_1 := op.Args[1]
7251 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7252 if x != op_0 {
7253 continue
7254 }
7255 c := op_1
7256 if c.Op != OpConst64 {
7257 continue
7258 }
7259 bool := v_2
7260 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7261 continue
7262 }
7263 v.reset(OpOr64)
7264 v0 := b.NewValue0(v.Pos, OpMul64, t)
7265 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
7266 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7267 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
7268 v3.AddArg(bool)
7269 v2.AddArg(v3)
7270 v1.AddArg(v2)
7271 v0.AddArg2(c, v1)
7272 v.AddArg2(x, v0)
7273 return true
7274 }
7275 break
7276 }
7277
7278
7279
7280 for {
7281 x := v_0
7282 op := v_1
7283 if op.Op != OpOr32 {
7284 break
7285 }
7286 t := op.Type
7287 _ = op.Args[1]
7288 op_0 := op.Args[0]
7289 op_1 := op.Args[1]
7290 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7291 if x != op_0 {
7292 continue
7293 }
7294 c := op_1
7295 if c.Op != OpConst32 {
7296 continue
7297 }
7298 bool := v_2
7299 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7300 continue
7301 }
7302 v.reset(OpOr32)
7303 v0 := b.NewValue0(v.Pos, OpMul32, t)
7304 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
7305 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7306 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
7307 v3.AddArg(bool)
7308 v2.AddArg(v3)
7309 v1.AddArg(v2)
7310 v0.AddArg2(c, v1)
7311 v.AddArg2(x, v0)
7312 return true
7313 }
7314 break
7315 }
7316
7317
7318
7319 for {
7320 x := v_0
7321 op := v_1
7322 if op.Op != OpOr16 {
7323 break
7324 }
7325 t := op.Type
7326 _ = op.Args[1]
7327 op_0 := op.Args[0]
7328 op_1 := op.Args[1]
7329 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7330 if x != op_0 {
7331 continue
7332 }
7333 c := op_1
7334 if c.Op != OpConst16 {
7335 continue
7336 }
7337 bool := v_2
7338 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7339 continue
7340 }
7341 v.reset(OpOr16)
7342 v0 := b.NewValue0(v.Pos, OpMul16, t)
7343 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
7344 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7345 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
7346 v3.AddArg(bool)
7347 v2.AddArg(v3)
7348 v1.AddArg(v2)
7349 v0.AddArg2(c, v1)
7350 v.AddArg2(x, v0)
7351 return true
7352 }
7353 break
7354 }
7355
7356
7357
7358 for {
7359 op := v_0
7360 if op.Op != OpXor8 {
7361 break
7362 }
7363 t := op.Type
7364 _ = op.Args[1]
7365 op_0 := op.Args[0]
7366 op_1 := op.Args[1]
7367 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7368 x := op_0
7369 c := op_1
7370 if c.Op != OpConst8 || x != v_1 {
7371 continue
7372 }
7373 bool := v_2
7374 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7375 continue
7376 }
7377 v.reset(OpXor8)
7378 v0 := b.NewValue0(v.Pos, OpMul8, t)
7379 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
7380 v1.AddArg(bool)
7381 v0.AddArg2(c, v1)
7382 v.AddArg2(x, v0)
7383 return true
7384 }
7385 break
7386 }
7387
7388
7389
7390 for {
7391 op := v_0
7392 if op.Op != OpXor64 {
7393 break
7394 }
7395 t := op.Type
7396 _ = op.Args[1]
7397 op_0 := op.Args[0]
7398 op_1 := op.Args[1]
7399 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7400 x := op_0
7401 c := op_1
7402 if c.Op != OpConst64 || x != v_1 {
7403 continue
7404 }
7405 bool := v_2
7406 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7407 continue
7408 }
7409 v.reset(OpXor64)
7410 v0 := b.NewValue0(v.Pos, OpMul64, t)
7411 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
7412 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7413 v2.AddArg(bool)
7414 v1.AddArg(v2)
7415 v0.AddArg2(c, v1)
7416 v.AddArg2(x, v0)
7417 return true
7418 }
7419 break
7420 }
7421
7422
7423
7424 for {
7425 op := v_0
7426 if op.Op != OpXor32 {
7427 break
7428 }
7429 t := op.Type
7430 _ = op.Args[1]
7431 op_0 := op.Args[0]
7432 op_1 := op.Args[1]
7433 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7434 x := op_0
7435 c := op_1
7436 if c.Op != OpConst32 || x != v_1 {
7437 continue
7438 }
7439 bool := v_2
7440 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7441 continue
7442 }
7443 v.reset(OpXor32)
7444 v0 := b.NewValue0(v.Pos, OpMul32, t)
7445 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
7446 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7447 v2.AddArg(bool)
7448 v1.AddArg(v2)
7449 v0.AddArg2(c, v1)
7450 v.AddArg2(x, v0)
7451 return true
7452 }
7453 break
7454 }
7455
7456
7457
7458 for {
7459 op := v_0
7460 if op.Op != OpXor16 {
7461 break
7462 }
7463 t := op.Type
7464 _ = op.Args[1]
7465 op_0 := op.Args[0]
7466 op_1 := op.Args[1]
7467 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7468 x := op_0
7469 c := op_1
7470 if c.Op != OpConst16 || x != v_1 {
7471 continue
7472 }
7473 bool := v_2
7474 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7475 continue
7476 }
7477 v.reset(OpXor16)
7478 v0 := b.NewValue0(v.Pos, OpMul16, t)
7479 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
7480 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7481 v2.AddArg(bool)
7482 v1.AddArg(v2)
7483 v0.AddArg2(c, v1)
7484 v.AddArg2(x, v0)
7485 return true
7486 }
7487 break
7488 }
7489
7490
7491
7492 for {
7493 x := v_0
7494 op := v_1
7495 if op.Op != OpXor8 {
7496 break
7497 }
7498 t := op.Type
7499 _ = op.Args[1]
7500 op_0 := op.Args[0]
7501 op_1 := op.Args[1]
7502 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7503 if x != op_0 {
7504 continue
7505 }
7506 c := op_1
7507 if c.Op != OpConst8 {
7508 continue
7509 }
7510 bool := v_2
7511 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7512 continue
7513 }
7514 v.reset(OpXor8)
7515 v0 := b.NewValue0(v.Pos, OpMul8, t)
7516 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
7517 v2 := b.NewValue0(v.Pos, OpNot, bool.Type)
7518 v2.AddArg(bool)
7519 v1.AddArg(v2)
7520 v0.AddArg2(c, v1)
7521 v.AddArg2(x, v0)
7522 return true
7523 }
7524 break
7525 }
7526
7527
7528
7529 for {
7530 x := v_0
7531 op := v_1
7532 if op.Op != OpXor64 {
7533 break
7534 }
7535 t := op.Type
7536 _ = op.Args[1]
7537 op_0 := op.Args[0]
7538 op_1 := op.Args[1]
7539 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7540 if x != op_0 {
7541 continue
7542 }
7543 c := op_1
7544 if c.Op != OpConst64 {
7545 continue
7546 }
7547 bool := v_2
7548 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7549 continue
7550 }
7551 v.reset(OpXor64)
7552 v0 := b.NewValue0(v.Pos, OpMul64, t)
7553 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
7554 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7555 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
7556 v3.AddArg(bool)
7557 v2.AddArg(v3)
7558 v1.AddArg(v2)
7559 v0.AddArg2(c, v1)
7560 v.AddArg2(x, v0)
7561 return true
7562 }
7563 break
7564 }
7565
7566
7567
7568 for {
7569 x := v_0
7570 op := v_1
7571 if op.Op != OpXor32 {
7572 break
7573 }
7574 t := op.Type
7575 _ = op.Args[1]
7576 op_0 := op.Args[0]
7577 op_1 := op.Args[1]
7578 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7579 if x != op_0 {
7580 continue
7581 }
7582 c := op_1
7583 if c.Op != OpConst32 {
7584 continue
7585 }
7586 bool := v_2
7587 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7588 continue
7589 }
7590 v.reset(OpXor32)
7591 v0 := b.NewValue0(v.Pos, OpMul32, t)
7592 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
7593 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7594 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
7595 v3.AddArg(bool)
7596 v2.AddArg(v3)
7597 v1.AddArg(v2)
7598 v0.AddArg2(c, v1)
7599 v.AddArg2(x, v0)
7600 return true
7601 }
7602 break
7603 }
7604
7605
7606
7607 for {
7608 x := v_0
7609 op := v_1
7610 if op.Op != OpXor16 {
7611 break
7612 }
7613 t := op.Type
7614 _ = op.Args[1]
7615 op_0 := op.Args[0]
7616 op_1 := op.Args[1]
7617 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7618 if x != op_0 {
7619 continue
7620 }
7621 c := op_1
7622 if c.Op != OpConst16 {
7623 continue
7624 }
7625 bool := v_2
7626 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7627 continue
7628 }
7629 v.reset(OpXor16)
7630 v0 := b.NewValue0(v.Pos, OpMul16, t)
7631 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
7632 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7633 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
7634 v3.AddArg(bool)
7635 v2.AddArg(v3)
7636 v1.AddArg(v2)
7637 v0.AddArg2(c, v1)
7638 v.AddArg2(x, v0)
7639 return true
7640 }
7641 break
7642 }
7643 return false
7644 }
7645 func rewriteValuegeneric_OpConstInterface(v *Value) bool {
7646 b := v.Block
7647 typ := &b.Func.Config.Types
7648
7649
7650 for {
7651 v.reset(OpIMake)
7652 v0 := b.NewValue0(v.Pos, OpConstNil, typ.Uintptr)
7653 v1 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
7654 v.AddArg2(v0, v1)
7655 return true
7656 }
7657 }
7658 func rewriteValuegeneric_OpConstSlice(v *Value) bool {
7659 b := v.Block
7660 config := b.Func.Config
7661 typ := &b.Func.Config.Types
7662
7663
7664
7665 for {
7666 if !(config.PtrSize == 4) {
7667 break
7668 }
7669 v.reset(OpSliceMake)
7670 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo())
7671 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
7672 v1.AuxInt = int32ToAuxInt(0)
7673 v.AddArg3(v0, v1, v1)
7674 return true
7675 }
7676
7677
7678
7679 for {
7680 if !(config.PtrSize == 8) {
7681 break
7682 }
7683 v.reset(OpSliceMake)
7684 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo())
7685 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
7686 v1.AuxInt = int64ToAuxInt(0)
7687 v.AddArg3(v0, v1, v1)
7688 return true
7689 }
7690 return false
7691 }
7692 func rewriteValuegeneric_OpConstString(v *Value) bool {
7693 b := v.Block
7694 config := b.Func.Config
7695 fe := b.Func.fe
7696 typ := &b.Func.Config.Types
7697
7698
7699
7700 for {
7701 str := auxToString(v.Aux)
7702 if !(config.PtrSize == 4 && str == "") {
7703 break
7704 }
7705 v.reset(OpStringMake)
7706 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
7707 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
7708 v1.AuxInt = int32ToAuxInt(0)
7709 v.AddArg2(v0, v1)
7710 return true
7711 }
7712
7713
7714
7715 for {
7716 str := auxToString(v.Aux)
7717 if !(config.PtrSize == 8 && str == "") {
7718 break
7719 }
7720 v.reset(OpStringMake)
7721 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
7722 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
7723 v1.AuxInt = int64ToAuxInt(0)
7724 v.AddArg2(v0, v1)
7725 return true
7726 }
7727
7728
7729
7730 for {
7731 str := auxToString(v.Aux)
7732 if !(config.PtrSize == 4 && str != "") {
7733 break
7734 }
7735 v.reset(OpStringMake)
7736 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr)
7737 v0.Aux = symToAux(fe.StringData(str))
7738 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
7739 v0.AddArg(v1)
7740 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int)
7741 v2.AuxInt = int32ToAuxInt(int32(len(str)))
7742 v.AddArg2(v0, v2)
7743 return true
7744 }
7745
7746
7747
7748 for {
7749 str := auxToString(v.Aux)
7750 if !(config.PtrSize == 8 && str != "") {
7751 break
7752 }
7753 v.reset(OpStringMake)
7754 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr)
7755 v0.Aux = symToAux(fe.StringData(str))
7756 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
7757 v0.AddArg(v1)
7758 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int)
7759 v2.AuxInt = int64ToAuxInt(int64(len(str)))
7760 v.AddArg2(v0, v2)
7761 return true
7762 }
7763 return false
7764 }
7765 func rewriteValuegeneric_OpConvert(v *Value) bool {
7766 v_1 := v.Args[1]
7767 v_0 := v.Args[0]
7768 b := v.Block
7769
7770
7771 for {
7772 if v_0.Op != OpAdd64 {
7773 break
7774 }
7775 _ = v_0.Args[1]
7776 v_0_0 := v_0.Args[0]
7777 v_0_1 := v_0.Args[1]
7778 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
7779 if v_0_0.Op != OpConvert {
7780 continue
7781 }
7782 mem := v_0_0.Args[1]
7783 ptr := v_0_0.Args[0]
7784 off := v_0_1
7785 if mem != v_1 {
7786 continue
7787 }
7788 v.reset(OpAddPtr)
7789 v.AddArg2(ptr, off)
7790 return true
7791 }
7792 break
7793 }
7794
7795
7796 for {
7797 if v_0.Op != OpAdd32 {
7798 break
7799 }
7800 _ = v_0.Args[1]
7801 v_0_0 := v_0.Args[0]
7802 v_0_1 := v_0.Args[1]
7803 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
7804 if v_0_0.Op != OpConvert {
7805 continue
7806 }
7807 mem := v_0_0.Args[1]
7808 ptr := v_0_0.Args[0]
7809 off := v_0_1
7810 if mem != v_1 {
7811 continue
7812 }
7813 v.reset(OpAddPtr)
7814 v.AddArg2(ptr, off)
7815 return true
7816 }
7817 break
7818 }
7819
7820
7821 for {
7822 if v_0.Op != OpConvert {
7823 break
7824 }
7825 mem := v_0.Args[1]
7826 ptr := v_0.Args[0]
7827 if mem != v_1 {
7828 break
7829 }
7830 v.copyOf(ptr)
7831 return true
7832 }
7833
7834
7835 for {
7836 a := v_0
7837 if a.Op != OpAdd64 {
7838 break
7839 }
7840 _ = a.Args[1]
7841 a_0 := a.Args[0]
7842 a_1 := a.Args[1]
7843 for _i0 := 0; _i0 <= 1; _i0, a_0, a_1 = _i0+1, a_1, a_0 {
7844 if a_0.Op != OpAdd64 {
7845 continue
7846 }
7847 _ = a_0.Args[1]
7848 a_0_0 := a_0.Args[0]
7849 a_0_1 := a_0.Args[1]
7850 for _i1 := 0; _i1 <= 1; _i1, a_0_0, a_0_1 = _i1+1, a_0_1, a_0_0 {
7851 if a_0_0.Op != OpConvert {
7852 continue
7853 }
7854 mem := a_0_0.Args[1]
7855 ptr := a_0_0.Args[0]
7856 off1 := a_0_1
7857 off2 := a_1
7858 if mem != v_1 {
7859 continue
7860 }
7861 v.reset(OpAddPtr)
7862 v0 := b.NewValue0(v.Pos, OpAdd64, a.Type)
7863 v0.AddArg2(off1, off2)
7864 v.AddArg2(ptr, v0)
7865 return true
7866 }
7867 }
7868 break
7869 }
7870
7871
7872 for {
7873 a := v_0
7874 if a.Op != OpAdd32 {
7875 break
7876 }
7877 _ = a.Args[1]
7878 a_0 := a.Args[0]
7879 a_1 := a.Args[1]
7880 for _i0 := 0; _i0 <= 1; _i0, a_0, a_1 = _i0+1, a_1, a_0 {
7881 if a_0.Op != OpAdd32 {
7882 continue
7883 }
7884 _ = a_0.Args[1]
7885 a_0_0 := a_0.Args[0]
7886 a_0_1 := a_0.Args[1]
7887 for _i1 := 0; _i1 <= 1; _i1, a_0_0, a_0_1 = _i1+1, a_0_1, a_0_0 {
7888 if a_0_0.Op != OpConvert {
7889 continue
7890 }
7891 mem := a_0_0.Args[1]
7892 ptr := a_0_0.Args[0]
7893 off1 := a_0_1
7894 off2 := a_1
7895 if mem != v_1 {
7896 continue
7897 }
7898 v.reset(OpAddPtr)
7899 v0 := b.NewValue0(v.Pos, OpAdd32, a.Type)
7900 v0.AddArg2(off1, off2)
7901 v.AddArg2(ptr, v0)
7902 return true
7903 }
7904 }
7905 break
7906 }
7907 return false
7908 }
7909 func rewriteValuegeneric_OpCtz16(v *Value) bool {
7910 v_0 := v.Args[0]
7911 b := v.Block
7912 config := b.Func.Config
7913
7914
7915
7916 for {
7917 if v_0.Op != OpConst16 {
7918 break
7919 }
7920 c := auxIntToInt16(v_0.AuxInt)
7921 if !(config.PtrSize == 4) {
7922 break
7923 }
7924 v.reset(OpConst32)
7925 v.AuxInt = int32ToAuxInt(int32(ntz16(c)))
7926 return true
7927 }
7928
7929
7930
7931 for {
7932 if v_0.Op != OpConst16 {
7933 break
7934 }
7935 c := auxIntToInt16(v_0.AuxInt)
7936 if !(config.PtrSize == 8) {
7937 break
7938 }
7939 v.reset(OpConst64)
7940 v.AuxInt = int64ToAuxInt(int64(ntz16(c)))
7941 return true
7942 }
7943 return false
7944 }
7945 func rewriteValuegeneric_OpCtz32(v *Value) bool {
7946 v_0 := v.Args[0]
7947 b := v.Block
7948 config := b.Func.Config
7949
7950
7951
7952 for {
7953 if v_0.Op != OpConst32 {
7954 break
7955 }
7956 c := auxIntToInt32(v_0.AuxInt)
7957 if !(config.PtrSize == 4) {
7958 break
7959 }
7960 v.reset(OpConst32)
7961 v.AuxInt = int32ToAuxInt(int32(ntz32(c)))
7962 return true
7963 }
7964
7965
7966
7967 for {
7968 if v_0.Op != OpConst32 {
7969 break
7970 }
7971 c := auxIntToInt32(v_0.AuxInt)
7972 if !(config.PtrSize == 8) {
7973 break
7974 }
7975 v.reset(OpConst64)
7976 v.AuxInt = int64ToAuxInt(int64(ntz32(c)))
7977 return true
7978 }
7979 return false
7980 }
7981 func rewriteValuegeneric_OpCtz64(v *Value) bool {
7982 v_0 := v.Args[0]
7983 b := v.Block
7984 config := b.Func.Config
7985
7986
7987
7988 for {
7989 if v_0.Op != OpConst64 {
7990 break
7991 }
7992 c := auxIntToInt64(v_0.AuxInt)
7993 if !(config.PtrSize == 4) {
7994 break
7995 }
7996 v.reset(OpConst32)
7997 v.AuxInt = int32ToAuxInt(int32(ntz64(c)))
7998 return true
7999 }
8000
8001
8002
8003 for {
8004 if v_0.Op != OpConst64 {
8005 break
8006 }
8007 c := auxIntToInt64(v_0.AuxInt)
8008 if !(config.PtrSize == 8) {
8009 break
8010 }
8011 v.reset(OpConst64)
8012 v.AuxInt = int64ToAuxInt(int64(ntz64(c)))
8013 return true
8014 }
8015 return false
8016 }
8017 func rewriteValuegeneric_OpCtz8(v *Value) bool {
8018 v_0 := v.Args[0]
8019 b := v.Block
8020 config := b.Func.Config
8021
8022
8023
8024 for {
8025 if v_0.Op != OpConst8 {
8026 break
8027 }
8028 c := auxIntToInt8(v_0.AuxInt)
8029 if !(config.PtrSize == 4) {
8030 break
8031 }
8032 v.reset(OpConst32)
8033 v.AuxInt = int32ToAuxInt(int32(ntz8(c)))
8034 return true
8035 }
8036
8037
8038
8039 for {
8040 if v_0.Op != OpConst8 {
8041 break
8042 }
8043 c := auxIntToInt8(v_0.AuxInt)
8044 if !(config.PtrSize == 8) {
8045 break
8046 }
8047 v.reset(OpConst64)
8048 v.AuxInt = int64ToAuxInt(int64(ntz8(c)))
8049 return true
8050 }
8051 return false
8052 }
8053 func rewriteValuegeneric_OpCvt32Fto32(v *Value) bool {
8054 v_0 := v.Args[0]
8055
8056
8057
8058 for {
8059 if v_0.Op != OpConst32F {
8060 break
8061 }
8062 c := auxIntToFloat32(v_0.AuxInt)
8063 if !(c >= -1<<31 && c < 1<<31) {
8064 break
8065 }
8066 v.reset(OpConst32)
8067 v.AuxInt = int32ToAuxInt(int32(c))
8068 return true
8069 }
8070 return false
8071 }
8072 func rewriteValuegeneric_OpCvt32Fto64(v *Value) bool {
8073 v_0 := v.Args[0]
8074
8075
8076
8077 for {
8078 if v_0.Op != OpConst32F {
8079 break
8080 }
8081 c := auxIntToFloat32(v_0.AuxInt)
8082 if !(c >= -1<<63 && c < 1<<63) {
8083 break
8084 }
8085 v.reset(OpConst64)
8086 v.AuxInt = int64ToAuxInt(int64(c))
8087 return true
8088 }
8089 return false
8090 }
8091 func rewriteValuegeneric_OpCvt32Fto64F(v *Value) bool {
8092 v_0 := v.Args[0]
8093
8094
8095 for {
8096 if v_0.Op != OpConst32F {
8097 break
8098 }
8099 c := auxIntToFloat32(v_0.AuxInt)
8100 v.reset(OpConst64F)
8101 v.AuxInt = float64ToAuxInt(float64(c))
8102 return true
8103 }
8104 return false
8105 }
8106 func rewriteValuegeneric_OpCvt32to32F(v *Value) bool {
8107 v_0 := v.Args[0]
8108
8109
8110 for {
8111 if v_0.Op != OpConst32 {
8112 break
8113 }
8114 c := auxIntToInt32(v_0.AuxInt)
8115 v.reset(OpConst32F)
8116 v.AuxInt = float32ToAuxInt(float32(c))
8117 return true
8118 }
8119 return false
8120 }
8121 func rewriteValuegeneric_OpCvt32to64F(v *Value) bool {
8122 v_0 := v.Args[0]
8123
8124
8125 for {
8126 if v_0.Op != OpConst32 {
8127 break
8128 }
8129 c := auxIntToInt32(v_0.AuxInt)
8130 v.reset(OpConst64F)
8131 v.AuxInt = float64ToAuxInt(float64(c))
8132 return true
8133 }
8134 return false
8135 }
8136 func rewriteValuegeneric_OpCvt64Fto32(v *Value) bool {
8137 v_0 := v.Args[0]
8138
8139
8140
8141 for {
8142 if v_0.Op != OpConst64F {
8143 break
8144 }
8145 c := auxIntToFloat64(v_0.AuxInt)
8146 if !(c >= -1<<31 && c < 1<<31) {
8147 break
8148 }
8149 v.reset(OpConst32)
8150 v.AuxInt = int32ToAuxInt(int32(c))
8151 return true
8152 }
8153 return false
8154 }
8155 func rewriteValuegeneric_OpCvt64Fto32F(v *Value) bool {
8156 v_0 := v.Args[0]
8157
8158
8159 for {
8160 if v_0.Op != OpConst64F {
8161 break
8162 }
8163 c := auxIntToFloat64(v_0.AuxInt)
8164 v.reset(OpConst32F)
8165 v.AuxInt = float32ToAuxInt(float32(c))
8166 return true
8167 }
8168
8169
8170
8171 for {
8172 sqrt0 := v_0
8173 if sqrt0.Op != OpSqrt {
8174 break
8175 }
8176 sqrt0_0 := sqrt0.Args[0]
8177 if sqrt0_0.Op != OpCvt32Fto64F {
8178 break
8179 }
8180 x := sqrt0_0.Args[0]
8181 if !(sqrt0.Uses == 1) {
8182 break
8183 }
8184 v.reset(OpSqrt32)
8185 v.AddArg(x)
8186 return true
8187 }
8188 return false
8189 }
8190 func rewriteValuegeneric_OpCvt64Fto64(v *Value) bool {
8191 v_0 := v.Args[0]
8192
8193
8194
8195 for {
8196 if v_0.Op != OpConst64F {
8197 break
8198 }
8199 c := auxIntToFloat64(v_0.AuxInt)
8200 if !(c >= -1<<63 && c < 1<<63) {
8201 break
8202 }
8203 v.reset(OpConst64)
8204 v.AuxInt = int64ToAuxInt(int64(c))
8205 return true
8206 }
8207 return false
8208 }
8209 func rewriteValuegeneric_OpCvt64to32F(v *Value) bool {
8210 v_0 := v.Args[0]
8211
8212
8213 for {
8214 if v_0.Op != OpConst64 {
8215 break
8216 }
8217 c := auxIntToInt64(v_0.AuxInt)
8218 v.reset(OpConst32F)
8219 v.AuxInt = float32ToAuxInt(float32(c))
8220 return true
8221 }
8222 return false
8223 }
8224 func rewriteValuegeneric_OpCvt64to64F(v *Value) bool {
8225 v_0 := v.Args[0]
8226
8227
8228 for {
8229 if v_0.Op != OpConst64 {
8230 break
8231 }
8232 c := auxIntToInt64(v_0.AuxInt)
8233 v.reset(OpConst64F)
8234 v.AuxInt = float64ToAuxInt(float64(c))
8235 return true
8236 }
8237 return false
8238 }
8239 func rewriteValuegeneric_OpCvtBoolToUint8(v *Value) bool {
8240 v_0 := v.Args[0]
8241
8242
8243 for {
8244 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
8245 break
8246 }
8247 v.reset(OpConst8)
8248 v.AuxInt = int8ToAuxInt(0)
8249 return true
8250 }
8251
8252
8253 for {
8254 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
8255 break
8256 }
8257 v.reset(OpConst8)
8258 v.AuxInt = int8ToAuxInt(1)
8259 return true
8260 }
8261 return false
8262 }
8263 func rewriteValuegeneric_OpDiv128u(v *Value) bool {
8264 v_2 := v.Args[2]
8265 v_1 := v.Args[1]
8266 v_0 := v.Args[0]
8267 b := v.Block
8268
8269
8270 for {
8271 t := v.Type
8272 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
8273 break
8274 }
8275 lo := v_1
8276 y := v_2
8277 v.reset(OpMakeTuple)
8278 v0 := b.NewValue0(v.Pos, OpDiv64u, t.FieldType(0))
8279 v0.AddArg2(lo, y)
8280 v1 := b.NewValue0(v.Pos, OpMod64u, t.FieldType(1))
8281 v1.AddArg2(lo, y)
8282 v.AddArg2(v0, v1)
8283 return true
8284 }
8285 return false
8286 }
8287 func rewriteValuegeneric_OpDiv16(v *Value) bool {
8288 v_1 := v.Args[1]
8289 v_0 := v.Args[0]
8290 b := v.Block
8291 typ := &b.Func.Config.Types
8292
8293
8294
8295 for {
8296 if v_0.Op != OpConst16 {
8297 break
8298 }
8299 c := auxIntToInt16(v_0.AuxInt)
8300 if v_1.Op != OpConst16 {
8301 break
8302 }
8303 d := auxIntToInt16(v_1.AuxInt)
8304 if !(d != 0) {
8305 break
8306 }
8307 v.reset(OpConst16)
8308 v.AuxInt = int16ToAuxInt(c / d)
8309 return true
8310 }
8311
8312
8313
8314 for {
8315 t := v.Type
8316 n := v_0
8317 if v_1.Op != OpConst16 {
8318 break
8319 }
8320 c := auxIntToInt16(v_1.AuxInt)
8321 if !(c < 0 && c != -1<<15) {
8322 break
8323 }
8324 v.reset(OpNeg16)
8325 v0 := b.NewValue0(v.Pos, OpDiv16, t)
8326 v1 := b.NewValue0(v.Pos, OpConst16, t)
8327 v1.AuxInt = int16ToAuxInt(-c)
8328 v0.AddArg2(n, v1)
8329 v.AddArg(v0)
8330 return true
8331 }
8332
8333
8334 for {
8335 t := v.Type
8336 x := v_0
8337 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != -1<<15 {
8338 break
8339 }
8340 v.reset(OpRsh16Ux64)
8341 v0 := b.NewValue0(v.Pos, OpAnd16, t)
8342 v1 := b.NewValue0(v.Pos, OpNeg16, t)
8343 v1.AddArg(x)
8344 v0.AddArg2(x, v1)
8345 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8346 v2.AuxInt = int64ToAuxInt(15)
8347 v.AddArg2(v0, v2)
8348 return true
8349 }
8350 return false
8351 }
8352 func rewriteValuegeneric_OpDiv16u(v *Value) bool {
8353 v_1 := v.Args[1]
8354 v_0 := v.Args[0]
8355 b := v.Block
8356 typ := &b.Func.Config.Types
8357
8358
8359
8360 for {
8361 if v_0.Op != OpConst16 {
8362 break
8363 }
8364 c := auxIntToInt16(v_0.AuxInt)
8365 if v_1.Op != OpConst16 {
8366 break
8367 }
8368 d := auxIntToInt16(v_1.AuxInt)
8369 if !(d != 0) {
8370 break
8371 }
8372 v.reset(OpConst16)
8373 v.AuxInt = int16ToAuxInt(int16(uint16(c) / uint16(d)))
8374 return true
8375 }
8376
8377
8378
8379 for {
8380 n := v_0
8381 if v_1.Op != OpConst16 {
8382 break
8383 }
8384 c := auxIntToInt16(v_1.AuxInt)
8385 if !(isPowerOfTwo(uint16(c))) {
8386 break
8387 }
8388 v.reset(OpRsh16Ux64)
8389 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8390 v0.AuxInt = int64ToAuxInt(log16u(uint16(c)))
8391 v.AddArg2(n, v0)
8392 return true
8393 }
8394 return false
8395 }
8396 func rewriteValuegeneric_OpDiv32(v *Value) bool {
8397 v_1 := v.Args[1]
8398 v_0 := v.Args[0]
8399 b := v.Block
8400 typ := &b.Func.Config.Types
8401
8402
8403
8404 for {
8405 if v_0.Op != OpConst32 {
8406 break
8407 }
8408 c := auxIntToInt32(v_0.AuxInt)
8409 if v_1.Op != OpConst32 {
8410 break
8411 }
8412 d := auxIntToInt32(v_1.AuxInt)
8413 if !(d != 0) {
8414 break
8415 }
8416 v.reset(OpConst32)
8417 v.AuxInt = int32ToAuxInt(c / d)
8418 return true
8419 }
8420
8421
8422
8423 for {
8424 t := v.Type
8425 n := v_0
8426 if v_1.Op != OpConst32 {
8427 break
8428 }
8429 c := auxIntToInt32(v_1.AuxInt)
8430 if !(c < 0 && c != -1<<31) {
8431 break
8432 }
8433 v.reset(OpNeg32)
8434 v0 := b.NewValue0(v.Pos, OpDiv32, t)
8435 v1 := b.NewValue0(v.Pos, OpConst32, t)
8436 v1.AuxInt = int32ToAuxInt(-c)
8437 v0.AddArg2(n, v1)
8438 v.AddArg(v0)
8439 return true
8440 }
8441
8442
8443 for {
8444 t := v.Type
8445 x := v_0
8446 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != -1<<31 {
8447 break
8448 }
8449 v.reset(OpRsh32Ux64)
8450 v0 := b.NewValue0(v.Pos, OpAnd32, t)
8451 v1 := b.NewValue0(v.Pos, OpNeg32, t)
8452 v1.AddArg(x)
8453 v0.AddArg2(x, v1)
8454 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8455 v2.AuxInt = int64ToAuxInt(31)
8456 v.AddArg2(v0, v2)
8457 return true
8458 }
8459 return false
8460 }
8461 func rewriteValuegeneric_OpDiv32F(v *Value) bool {
8462 v_1 := v.Args[1]
8463 v_0 := v.Args[0]
8464 b := v.Block
8465
8466
8467
8468 for {
8469 if v_0.Op != OpConst32F {
8470 break
8471 }
8472 c := auxIntToFloat32(v_0.AuxInt)
8473 if v_1.Op != OpConst32F {
8474 break
8475 }
8476 d := auxIntToFloat32(v_1.AuxInt)
8477 if !(c/d == c/d) {
8478 break
8479 }
8480 v.reset(OpConst32F)
8481 v.AuxInt = float32ToAuxInt(c / d)
8482 return true
8483 }
8484
8485
8486
8487 for {
8488 x := v_0
8489 if v_1.Op != OpConst32F {
8490 break
8491 }
8492 t := v_1.Type
8493 c := auxIntToFloat32(v_1.AuxInt)
8494 if !(reciprocalExact32(c)) {
8495 break
8496 }
8497 v.reset(OpMul32F)
8498 v0 := b.NewValue0(v.Pos, OpConst32F, t)
8499 v0.AuxInt = float32ToAuxInt(1 / c)
8500 v.AddArg2(x, v0)
8501 return true
8502 }
8503 return false
8504 }
8505 func rewriteValuegeneric_OpDiv32u(v *Value) bool {
8506 v_1 := v.Args[1]
8507 v_0 := v.Args[0]
8508 b := v.Block
8509 typ := &b.Func.Config.Types
8510
8511
8512
8513 for {
8514 if v_0.Op != OpConst32 {
8515 break
8516 }
8517 c := auxIntToInt32(v_0.AuxInt)
8518 if v_1.Op != OpConst32 {
8519 break
8520 }
8521 d := auxIntToInt32(v_1.AuxInt)
8522 if !(d != 0) {
8523 break
8524 }
8525 v.reset(OpConst32)
8526 v.AuxInt = int32ToAuxInt(int32(uint32(c) / uint32(d)))
8527 return true
8528 }
8529
8530
8531
8532 for {
8533 n := v_0
8534 if v_1.Op != OpConst32 {
8535 break
8536 }
8537 c := auxIntToInt32(v_1.AuxInt)
8538 if !(isPowerOfTwo(uint32(c))) {
8539 break
8540 }
8541 v.reset(OpRsh32Ux64)
8542 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8543 v0.AuxInt = int64ToAuxInt(log32u(uint32(c)))
8544 v.AddArg2(n, v0)
8545 return true
8546 }
8547 return false
8548 }
8549 func rewriteValuegeneric_OpDiv64(v *Value) bool {
8550 v_1 := v.Args[1]
8551 v_0 := v.Args[0]
8552 b := v.Block
8553 typ := &b.Func.Config.Types
8554
8555
8556
8557 for {
8558 if v_0.Op != OpConst64 {
8559 break
8560 }
8561 c := auxIntToInt64(v_0.AuxInt)
8562 if v_1.Op != OpConst64 {
8563 break
8564 }
8565 d := auxIntToInt64(v_1.AuxInt)
8566 if !(d != 0) {
8567 break
8568 }
8569 v.reset(OpConst64)
8570 v.AuxInt = int64ToAuxInt(c / d)
8571 return true
8572 }
8573
8574
8575
8576 for {
8577 t := v.Type
8578 n := v_0
8579 if v_1.Op != OpConst64 {
8580 break
8581 }
8582 c := auxIntToInt64(v_1.AuxInt)
8583 if !(c < 0 && c != -1<<63) {
8584 break
8585 }
8586 v.reset(OpNeg64)
8587 v0 := b.NewValue0(v.Pos, OpDiv64, t)
8588 v1 := b.NewValue0(v.Pos, OpConst64, t)
8589 v1.AuxInt = int64ToAuxInt(-c)
8590 v0.AddArg2(n, v1)
8591 v.AddArg(v0)
8592 return true
8593 }
8594
8595
8596
8597 for {
8598 x := v_0
8599 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 || !(isNonNegative(x)) {
8600 break
8601 }
8602 v.reset(OpConst64)
8603 v.AuxInt = int64ToAuxInt(0)
8604 return true
8605 }
8606
8607
8608 for {
8609 t := v.Type
8610 x := v_0
8611 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 {
8612 break
8613 }
8614 v.reset(OpRsh64Ux64)
8615 v0 := b.NewValue0(v.Pos, OpAnd64, t)
8616 v1 := b.NewValue0(v.Pos, OpNeg64, t)
8617 v1.AddArg(x)
8618 v0.AddArg2(x, v1)
8619 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8620 v2.AuxInt = int64ToAuxInt(63)
8621 v.AddArg2(v0, v2)
8622 return true
8623 }
8624 return false
8625 }
8626 func rewriteValuegeneric_OpDiv64F(v *Value) bool {
8627 v_1 := v.Args[1]
8628 v_0 := v.Args[0]
8629 b := v.Block
8630
8631
8632
8633 for {
8634 if v_0.Op != OpConst64F {
8635 break
8636 }
8637 c := auxIntToFloat64(v_0.AuxInt)
8638 if v_1.Op != OpConst64F {
8639 break
8640 }
8641 d := auxIntToFloat64(v_1.AuxInt)
8642 if !(c/d == c/d) {
8643 break
8644 }
8645 v.reset(OpConst64F)
8646 v.AuxInt = float64ToAuxInt(c / d)
8647 return true
8648 }
8649
8650
8651
8652 for {
8653 x := v_0
8654 if v_1.Op != OpConst64F {
8655 break
8656 }
8657 t := v_1.Type
8658 c := auxIntToFloat64(v_1.AuxInt)
8659 if !(reciprocalExact64(c)) {
8660 break
8661 }
8662 v.reset(OpMul64F)
8663 v0 := b.NewValue0(v.Pos, OpConst64F, t)
8664 v0.AuxInt = float64ToAuxInt(1 / c)
8665 v.AddArg2(x, v0)
8666 return true
8667 }
8668 return false
8669 }
8670 func rewriteValuegeneric_OpDiv64u(v *Value) bool {
8671 v_1 := v.Args[1]
8672 v_0 := v.Args[0]
8673 b := v.Block
8674 typ := &b.Func.Config.Types
8675
8676
8677
8678 for {
8679 if v_0.Op != OpConst64 {
8680 break
8681 }
8682 c := auxIntToInt64(v_0.AuxInt)
8683 if v_1.Op != OpConst64 {
8684 break
8685 }
8686 d := auxIntToInt64(v_1.AuxInt)
8687 if !(d != 0) {
8688 break
8689 }
8690 v.reset(OpConst64)
8691 v.AuxInt = int64ToAuxInt(int64(uint64(c) / uint64(d)))
8692 return true
8693 }
8694
8695
8696
8697 for {
8698 n := v_0
8699 if v_1.Op != OpConst64 {
8700 break
8701 }
8702 c := auxIntToInt64(v_1.AuxInt)
8703 if !(isPowerOfTwo(uint64(c))) {
8704 break
8705 }
8706 v.reset(OpRsh64Ux64)
8707 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8708 v0.AuxInt = int64ToAuxInt(log64u(uint64(c)))
8709 v.AddArg2(n, v0)
8710 return true
8711 }
8712 return false
8713 }
8714 func rewriteValuegeneric_OpDiv8(v *Value) bool {
8715 v_1 := v.Args[1]
8716 v_0 := v.Args[0]
8717 b := v.Block
8718 typ := &b.Func.Config.Types
8719
8720
8721
8722 for {
8723 if v_0.Op != OpConst8 {
8724 break
8725 }
8726 c := auxIntToInt8(v_0.AuxInt)
8727 if v_1.Op != OpConst8 {
8728 break
8729 }
8730 d := auxIntToInt8(v_1.AuxInt)
8731 if !(d != 0) {
8732 break
8733 }
8734 v.reset(OpConst8)
8735 v.AuxInt = int8ToAuxInt(c / d)
8736 return true
8737 }
8738
8739
8740
8741 for {
8742 t := v.Type
8743 n := v_0
8744 if v_1.Op != OpConst8 {
8745 break
8746 }
8747 c := auxIntToInt8(v_1.AuxInt)
8748 if !(c < 0 && c != -1<<7) {
8749 break
8750 }
8751 v.reset(OpNeg8)
8752 v0 := b.NewValue0(v.Pos, OpDiv8, t)
8753 v1 := b.NewValue0(v.Pos, OpConst8, t)
8754 v1.AuxInt = int8ToAuxInt(-c)
8755 v0.AddArg2(n, v1)
8756 v.AddArg(v0)
8757 return true
8758 }
8759
8760
8761 for {
8762 t := v.Type
8763 x := v_0
8764 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != -1<<7 {
8765 break
8766 }
8767 v.reset(OpRsh8Ux64)
8768 v0 := b.NewValue0(v.Pos, OpAnd8, t)
8769 v1 := b.NewValue0(v.Pos, OpNeg8, t)
8770 v1.AddArg(x)
8771 v0.AddArg2(x, v1)
8772 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8773 v2.AuxInt = int64ToAuxInt(7)
8774 v.AddArg2(v0, v2)
8775 return true
8776 }
8777 return false
8778 }
8779 func rewriteValuegeneric_OpDiv8u(v *Value) bool {
8780 v_1 := v.Args[1]
8781 v_0 := v.Args[0]
8782 b := v.Block
8783 typ := &b.Func.Config.Types
8784
8785
8786
8787 for {
8788 if v_0.Op != OpConst8 {
8789 break
8790 }
8791 c := auxIntToInt8(v_0.AuxInt)
8792 if v_1.Op != OpConst8 {
8793 break
8794 }
8795 d := auxIntToInt8(v_1.AuxInt)
8796 if !(d != 0) {
8797 break
8798 }
8799 v.reset(OpConst8)
8800 v.AuxInt = int8ToAuxInt(int8(uint8(c) / uint8(d)))
8801 return true
8802 }
8803
8804
8805
8806 for {
8807 n := v_0
8808 if v_1.Op != OpConst8 {
8809 break
8810 }
8811 c := auxIntToInt8(v_1.AuxInt)
8812 if !(isPowerOfTwo(uint8(c))) {
8813 break
8814 }
8815 v.reset(OpRsh8Ux64)
8816 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8817 v0.AuxInt = int64ToAuxInt(log8u(uint8(c)))
8818 v.AddArg2(n, v0)
8819 return true
8820 }
8821 return false
8822 }
8823 func rewriteValuegeneric_OpEq16(v *Value) bool {
8824 v_1 := v.Args[1]
8825 v_0 := v.Args[0]
8826 b := v.Block
8827 config := b.Func.Config
8828 typ := &b.Func.Config.Types
8829
8830
8831 for {
8832 x := v_0
8833 if x != v_1 {
8834 break
8835 }
8836 v.reset(OpConstBool)
8837 v.AuxInt = boolToAuxInt(true)
8838 return true
8839 }
8840
8841
8842 for {
8843 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8844 if v_0.Op != OpConst16 {
8845 continue
8846 }
8847 t := v_0.Type
8848 c := auxIntToInt16(v_0.AuxInt)
8849 if v_1.Op != OpAdd16 {
8850 continue
8851 }
8852 _ = v_1.Args[1]
8853 v_1_0 := v_1.Args[0]
8854 v_1_1 := v_1.Args[1]
8855 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8856 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
8857 continue
8858 }
8859 d := auxIntToInt16(v_1_0.AuxInt)
8860 x := v_1_1
8861 v.reset(OpEq16)
8862 v0 := b.NewValue0(v.Pos, OpConst16, t)
8863 v0.AuxInt = int16ToAuxInt(c - d)
8864 v.AddArg2(v0, x)
8865 return true
8866 }
8867 }
8868 break
8869 }
8870
8871
8872 for {
8873 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8874 if v_0.Op != OpConst16 {
8875 continue
8876 }
8877 c := auxIntToInt16(v_0.AuxInt)
8878 if v_1.Op != OpConst16 {
8879 continue
8880 }
8881 d := auxIntToInt16(v_1.AuxInt)
8882 v.reset(OpConstBool)
8883 v.AuxInt = boolToAuxInt(c == d)
8884 return true
8885 }
8886 break
8887 }
8888
8889
8890
8891 for {
8892 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8893 if v_0.Op != OpMod16u {
8894 continue
8895 }
8896 _ = v_0.Args[1]
8897 x := v_0.Args[0]
8898 v_0_1 := v_0.Args[1]
8899 if v_0_1.Op != OpConst16 {
8900 continue
8901 }
8902 c := auxIntToInt16(v_0_1.AuxInt)
8903 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(x.Op != OpConst16 && udivisibleOK16(c) && !hasSmallRotate(config)) {
8904 continue
8905 }
8906 v.reset(OpEq32)
8907 v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32)
8908 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
8909 v1.AddArg(x)
8910 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8911 v2.AuxInt = int32ToAuxInt(int32(uint16(c)))
8912 v0.AddArg2(v1, v2)
8913 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8914 v3.AuxInt = int32ToAuxInt(0)
8915 v.AddArg2(v0, v3)
8916 return true
8917 }
8918 break
8919 }
8920
8921
8922
8923 for {
8924 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8925 if v_0.Op != OpMod16 {
8926 continue
8927 }
8928 _ = v_0.Args[1]
8929 x := v_0.Args[0]
8930 v_0_1 := v_0.Args[1]
8931 if v_0_1.Op != OpConst16 {
8932 continue
8933 }
8934 c := auxIntToInt16(v_0_1.AuxInt)
8935 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(x.Op != OpConst16 && sdivisibleOK16(c) && !hasSmallRotate(config)) {
8936 continue
8937 }
8938 v.reset(OpEq32)
8939 v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32)
8940 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
8941 v1.AddArg(x)
8942 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
8943 v2.AuxInt = int32ToAuxInt(int32(c))
8944 v0.AddArg2(v1, v2)
8945 v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
8946 v3.AuxInt = int32ToAuxInt(0)
8947 v.AddArg2(v0, v3)
8948 return true
8949 }
8950 break
8951 }
8952
8953
8954
8955 for {
8956 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8957 s := v_0
8958 if s.Op != OpSub16 {
8959 continue
8960 }
8961 y := s.Args[1]
8962 x := s.Args[0]
8963 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(s.Uses == 1) {
8964 continue
8965 }
8966 v.reset(OpEq16)
8967 v.AddArg2(x, y)
8968 return true
8969 }
8970 break
8971 }
8972
8973
8974
8975 for {
8976 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8977 if v_0.Op != OpAnd16 {
8978 continue
8979 }
8980 t := v_0.Type
8981 _ = v_0.Args[1]
8982 v_0_0 := v_0.Args[0]
8983 v_0_1 := v_0.Args[1]
8984 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
8985 x := v_0_0
8986 if v_0_1.Op != OpConst16 || v_0_1.Type != t {
8987 continue
8988 }
8989 y := auxIntToInt16(v_0_1.AuxInt)
8990 if v_1.Op != OpConst16 || v_1.Type != t || auxIntToInt16(v_1.AuxInt) != y || !(oneBit(y)) {
8991 continue
8992 }
8993 v.reset(OpNeq16)
8994 v0 := b.NewValue0(v.Pos, OpAnd16, t)
8995 v1 := b.NewValue0(v.Pos, OpConst16, t)
8996 v1.AuxInt = int16ToAuxInt(y)
8997 v0.AddArg2(x, v1)
8998 v2 := b.NewValue0(v.Pos, OpConst16, t)
8999 v2.AuxInt = int16ToAuxInt(0)
9000 v.AddArg2(v0, v2)
9001 return true
9002 }
9003 }
9004 break
9005 }
9006
9007
9008 for {
9009 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9010 if v_0.Op != OpZeroExt8to16 {
9011 continue
9012 }
9013 v_0_0 := v_0.Args[0]
9014 if v_0_0.Op != OpCvtBoolToUint8 {
9015 continue
9016 }
9017 x := v_0_0.Args[0]
9018 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
9019 continue
9020 }
9021 v.copyOf(x)
9022 return true
9023 }
9024 break
9025 }
9026
9027
9028 for {
9029 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9030 if v_0.Op != OpZeroExt8to16 {
9031 continue
9032 }
9033 v_0_0 := v_0.Args[0]
9034 if v_0_0.Op != OpCvtBoolToUint8 {
9035 continue
9036 }
9037 x := v_0_0.Args[0]
9038 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
9039 continue
9040 }
9041 v.reset(OpNot)
9042 v.AddArg(x)
9043 return true
9044 }
9045 break
9046 }
9047 return false
9048 }
9049 func rewriteValuegeneric_OpEq32(v *Value) bool {
9050 v_1 := v.Args[1]
9051 v_0 := v.Args[0]
9052 b := v.Block
9053
9054
9055 for {
9056 x := v_0
9057 if x != v_1 {
9058 break
9059 }
9060 v.reset(OpConstBool)
9061 v.AuxInt = boolToAuxInt(true)
9062 return true
9063 }
9064
9065
9066 for {
9067 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9068 if v_0.Op != OpConst32 {
9069 continue
9070 }
9071 t := v_0.Type
9072 c := auxIntToInt32(v_0.AuxInt)
9073 if v_1.Op != OpAdd32 {
9074 continue
9075 }
9076 _ = v_1.Args[1]
9077 v_1_0 := v_1.Args[0]
9078 v_1_1 := v_1.Args[1]
9079 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
9080 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
9081 continue
9082 }
9083 d := auxIntToInt32(v_1_0.AuxInt)
9084 x := v_1_1
9085 v.reset(OpEq32)
9086 v0 := b.NewValue0(v.Pos, OpConst32, t)
9087 v0.AuxInt = int32ToAuxInt(c - d)
9088 v.AddArg2(v0, x)
9089 return true
9090 }
9091 }
9092 break
9093 }
9094
9095
9096 for {
9097 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9098 if v_0.Op != OpConst32 {
9099 continue
9100 }
9101 c := auxIntToInt32(v_0.AuxInt)
9102 if v_1.Op != OpConst32 {
9103 continue
9104 }
9105 d := auxIntToInt32(v_1.AuxInt)
9106 v.reset(OpConstBool)
9107 v.AuxInt = boolToAuxInt(c == d)
9108 return true
9109 }
9110 break
9111 }
9112
9113
9114
9115 for {
9116 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9117 s := v_0
9118 if s.Op != OpSub32 {
9119 continue
9120 }
9121 y := s.Args[1]
9122 x := s.Args[0]
9123 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 || !(s.Uses == 1) {
9124 continue
9125 }
9126 v.reset(OpEq32)
9127 v.AddArg2(x, y)
9128 return true
9129 }
9130 break
9131 }
9132
9133
9134
9135 for {
9136 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9137 if v_0.Op != OpAnd32 {
9138 continue
9139 }
9140 t := v_0.Type
9141 _ = v_0.Args[1]
9142 v_0_0 := v_0.Args[0]
9143 v_0_1 := v_0.Args[1]
9144 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
9145 x := v_0_0
9146 if v_0_1.Op != OpConst32 || v_0_1.Type != t {
9147 continue
9148 }
9149 y := auxIntToInt32(v_0_1.AuxInt)
9150 if v_1.Op != OpConst32 || v_1.Type != t || auxIntToInt32(v_1.AuxInt) != y || !(oneBit(y)) {
9151 continue
9152 }
9153 v.reset(OpNeq32)
9154 v0 := b.NewValue0(v.Pos, OpAnd32, t)
9155 v1 := b.NewValue0(v.Pos, OpConst32, t)
9156 v1.AuxInt = int32ToAuxInt(y)
9157 v0.AddArg2(x, v1)
9158 v2 := b.NewValue0(v.Pos, OpConst32, t)
9159 v2.AuxInt = int32ToAuxInt(0)
9160 v.AddArg2(v0, v2)
9161 return true
9162 }
9163 }
9164 break
9165 }
9166
9167
9168 for {
9169 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9170 if v_0.Op != OpZeroExt8to32 {
9171 continue
9172 }
9173 v_0_0 := v_0.Args[0]
9174 if v_0_0.Op != OpCvtBoolToUint8 {
9175 continue
9176 }
9177 x := v_0_0.Args[0]
9178 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
9179 continue
9180 }
9181 v.copyOf(x)
9182 return true
9183 }
9184 break
9185 }
9186
9187
9188 for {
9189 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9190 if v_0.Op != OpZeroExt8to32 {
9191 continue
9192 }
9193 v_0_0 := v_0.Args[0]
9194 if v_0_0.Op != OpCvtBoolToUint8 {
9195 continue
9196 }
9197 x := v_0_0.Args[0]
9198 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
9199 continue
9200 }
9201 v.reset(OpNot)
9202 v.AddArg(x)
9203 return true
9204 }
9205 break
9206 }
9207 return false
9208 }
9209 func rewriteValuegeneric_OpEq32F(v *Value) bool {
9210 v_1 := v.Args[1]
9211 v_0 := v.Args[0]
9212
9213
9214 for {
9215 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9216 if v_0.Op != OpConst32F {
9217 continue
9218 }
9219 c := auxIntToFloat32(v_0.AuxInt)
9220 if v_1.Op != OpConst32F {
9221 continue
9222 }
9223 d := auxIntToFloat32(v_1.AuxInt)
9224 v.reset(OpConstBool)
9225 v.AuxInt = boolToAuxInt(c == d)
9226 return true
9227 }
9228 break
9229 }
9230 return false
9231 }
9232 func rewriteValuegeneric_OpEq64(v *Value) bool {
9233 v_1 := v.Args[1]
9234 v_0 := v.Args[0]
9235 b := v.Block
9236
9237
9238 for {
9239 x := v_0
9240 if x != v_1 {
9241 break
9242 }
9243 v.reset(OpConstBool)
9244 v.AuxInt = boolToAuxInt(true)
9245 return true
9246 }
9247
9248
9249 for {
9250 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9251 if v_0.Op != OpConst64 {
9252 continue
9253 }
9254 t := v_0.Type
9255 c := auxIntToInt64(v_0.AuxInt)
9256 if v_1.Op != OpAdd64 {
9257 continue
9258 }
9259 _ = v_1.Args[1]
9260 v_1_0 := v_1.Args[0]
9261 v_1_1 := v_1.Args[1]
9262 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
9263 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
9264 continue
9265 }
9266 d := auxIntToInt64(v_1_0.AuxInt)
9267 x := v_1_1
9268 v.reset(OpEq64)
9269 v0 := b.NewValue0(v.Pos, OpConst64, t)
9270 v0.AuxInt = int64ToAuxInt(c - d)
9271 v.AddArg2(v0, x)
9272 return true
9273 }
9274 }
9275 break
9276 }
9277
9278
9279 for {
9280 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9281 if v_0.Op != OpConst64 {
9282 continue
9283 }
9284 c := auxIntToInt64(v_0.AuxInt)
9285 if v_1.Op != OpConst64 {
9286 continue
9287 }
9288 d := auxIntToInt64(v_1.AuxInt)
9289 v.reset(OpConstBool)
9290 v.AuxInt = boolToAuxInt(c == d)
9291 return true
9292 }
9293 break
9294 }
9295
9296
9297
9298 for {
9299 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9300 s := v_0
9301 if s.Op != OpSub64 {
9302 continue
9303 }
9304 y := s.Args[1]
9305 x := s.Args[0]
9306 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 || !(s.Uses == 1) {
9307 continue
9308 }
9309 v.reset(OpEq64)
9310 v.AddArg2(x, y)
9311 return true
9312 }
9313 break
9314 }
9315
9316
9317
9318 for {
9319 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9320 if v_0.Op != OpAnd64 {
9321 continue
9322 }
9323 t := v_0.Type
9324 _ = v_0.Args[1]
9325 v_0_0 := v_0.Args[0]
9326 v_0_1 := v_0.Args[1]
9327 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
9328 x := v_0_0
9329 if v_0_1.Op != OpConst64 || v_0_1.Type != t {
9330 continue
9331 }
9332 y := auxIntToInt64(v_0_1.AuxInt)
9333 if v_1.Op != OpConst64 || v_1.Type != t || auxIntToInt64(v_1.AuxInt) != y || !(oneBit(y)) {
9334 continue
9335 }
9336 v.reset(OpNeq64)
9337 v0 := b.NewValue0(v.Pos, OpAnd64, t)
9338 v1 := b.NewValue0(v.Pos, OpConst64, t)
9339 v1.AuxInt = int64ToAuxInt(y)
9340 v0.AddArg2(x, v1)
9341 v2 := b.NewValue0(v.Pos, OpConst64, t)
9342 v2.AuxInt = int64ToAuxInt(0)
9343 v.AddArg2(v0, v2)
9344 return true
9345 }
9346 }
9347 break
9348 }
9349
9350
9351 for {
9352 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9353 if v_0.Op != OpZeroExt8to64 {
9354 continue
9355 }
9356 v_0_0 := v_0.Args[0]
9357 if v_0_0.Op != OpCvtBoolToUint8 {
9358 continue
9359 }
9360 x := v_0_0.Args[0]
9361 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
9362 continue
9363 }
9364 v.copyOf(x)
9365 return true
9366 }
9367 break
9368 }
9369
9370
9371 for {
9372 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9373 if v_0.Op != OpZeroExt8to64 {
9374 continue
9375 }
9376 v_0_0 := v_0.Args[0]
9377 if v_0_0.Op != OpCvtBoolToUint8 {
9378 continue
9379 }
9380 x := v_0_0.Args[0]
9381 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
9382 continue
9383 }
9384 v.reset(OpNot)
9385 v.AddArg(x)
9386 return true
9387 }
9388 break
9389 }
9390 return false
9391 }
9392 func rewriteValuegeneric_OpEq64F(v *Value) bool {
9393 v_1 := v.Args[1]
9394 v_0 := v.Args[0]
9395
9396
9397 for {
9398 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9399 if v_0.Op != OpConst64F {
9400 continue
9401 }
9402 c := auxIntToFloat64(v_0.AuxInt)
9403 if v_1.Op != OpConst64F {
9404 continue
9405 }
9406 d := auxIntToFloat64(v_1.AuxInt)
9407 v.reset(OpConstBool)
9408 v.AuxInt = boolToAuxInt(c == d)
9409 return true
9410 }
9411 break
9412 }
9413 return false
9414 }
9415 func rewriteValuegeneric_OpEq8(v *Value) bool {
9416 v_1 := v.Args[1]
9417 v_0 := v.Args[0]
9418 b := v.Block
9419 config := b.Func.Config
9420 typ := &b.Func.Config.Types
9421
9422
9423 for {
9424 x := v_0
9425 if x != v_1 {
9426 break
9427 }
9428 v.reset(OpConstBool)
9429 v.AuxInt = boolToAuxInt(true)
9430 return true
9431 }
9432
9433
9434 for {
9435 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9436 if v_0.Op != OpConst8 {
9437 continue
9438 }
9439 t := v_0.Type
9440 c := auxIntToInt8(v_0.AuxInt)
9441 if v_1.Op != OpAdd8 {
9442 continue
9443 }
9444 _ = v_1.Args[1]
9445 v_1_0 := v_1.Args[0]
9446 v_1_1 := v_1.Args[1]
9447 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
9448 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
9449 continue
9450 }
9451 d := auxIntToInt8(v_1_0.AuxInt)
9452 x := v_1_1
9453 v.reset(OpEq8)
9454 v0 := b.NewValue0(v.Pos, OpConst8, t)
9455 v0.AuxInt = int8ToAuxInt(c - d)
9456 v.AddArg2(v0, x)
9457 return true
9458 }
9459 }
9460 break
9461 }
9462
9463
9464 for {
9465 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9466 if v_0.Op != OpConst8 {
9467 continue
9468 }
9469 c := auxIntToInt8(v_0.AuxInt)
9470 if v_1.Op != OpConst8 {
9471 continue
9472 }
9473 d := auxIntToInt8(v_1.AuxInt)
9474 v.reset(OpConstBool)
9475 v.AuxInt = boolToAuxInt(c == d)
9476 return true
9477 }
9478 break
9479 }
9480
9481
9482
9483 for {
9484 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9485 if v_0.Op != OpMod8u {
9486 continue
9487 }
9488 _ = v_0.Args[1]
9489 x := v_0.Args[0]
9490 v_0_1 := v_0.Args[1]
9491 if v_0_1.Op != OpConst8 {
9492 continue
9493 }
9494 c := auxIntToInt8(v_0_1.AuxInt)
9495 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(x.Op != OpConst8 && udivisibleOK8(c) && !hasSmallRotate(config)) {
9496 continue
9497 }
9498 v.reset(OpEq32)
9499 v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32)
9500 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
9501 v1.AddArg(x)
9502 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
9503 v2.AuxInt = int32ToAuxInt(int32(uint8(c)))
9504 v0.AddArg2(v1, v2)
9505 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
9506 v3.AuxInt = int32ToAuxInt(0)
9507 v.AddArg2(v0, v3)
9508 return true
9509 }
9510 break
9511 }
9512
9513
9514
9515 for {
9516 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9517 if v_0.Op != OpMod8 {
9518 continue
9519 }
9520 _ = v_0.Args[1]
9521 x := v_0.Args[0]
9522 v_0_1 := v_0.Args[1]
9523 if v_0_1.Op != OpConst8 {
9524 continue
9525 }
9526 c := auxIntToInt8(v_0_1.AuxInt)
9527 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(x.Op != OpConst8 && sdivisibleOK8(c) && !hasSmallRotate(config)) {
9528 continue
9529 }
9530 v.reset(OpEq32)
9531 v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32)
9532 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
9533 v1.AddArg(x)
9534 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
9535 v2.AuxInt = int32ToAuxInt(int32(c))
9536 v0.AddArg2(v1, v2)
9537 v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
9538 v3.AuxInt = int32ToAuxInt(0)
9539 v.AddArg2(v0, v3)
9540 return true
9541 }
9542 break
9543 }
9544
9545
9546
9547 for {
9548 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9549 s := v_0
9550 if s.Op != OpSub8 {
9551 continue
9552 }
9553 y := s.Args[1]
9554 x := s.Args[0]
9555 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(s.Uses == 1) {
9556 continue
9557 }
9558 v.reset(OpEq8)
9559 v.AddArg2(x, y)
9560 return true
9561 }
9562 break
9563 }
9564
9565
9566
9567 for {
9568 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9569 if v_0.Op != OpAnd8 {
9570 continue
9571 }
9572 t := v_0.Type
9573 _ = v_0.Args[1]
9574 v_0_0 := v_0.Args[0]
9575 v_0_1 := v_0.Args[1]
9576 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
9577 x := v_0_0
9578 if v_0_1.Op != OpConst8 || v_0_1.Type != t {
9579 continue
9580 }
9581 y := auxIntToInt8(v_0_1.AuxInt)
9582 if v_1.Op != OpConst8 || v_1.Type != t || auxIntToInt8(v_1.AuxInt) != y || !(oneBit(y)) {
9583 continue
9584 }
9585 v.reset(OpNeq8)
9586 v0 := b.NewValue0(v.Pos, OpAnd8, t)
9587 v1 := b.NewValue0(v.Pos, OpConst8, t)
9588 v1.AuxInt = int8ToAuxInt(y)
9589 v0.AddArg2(x, v1)
9590 v2 := b.NewValue0(v.Pos, OpConst8, t)
9591 v2.AuxInt = int8ToAuxInt(0)
9592 v.AddArg2(v0, v2)
9593 return true
9594 }
9595 }
9596 break
9597 }
9598
9599
9600 for {
9601 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9602 if v_0.Op != OpCvtBoolToUint8 {
9603 continue
9604 }
9605 x := v_0.Args[0]
9606 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 1 {
9607 continue
9608 }
9609 v.copyOf(x)
9610 return true
9611 }
9612 break
9613 }
9614
9615
9616 for {
9617 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9618 if v_0.Op != OpCvtBoolToUint8 {
9619 continue
9620 }
9621 x := v_0.Args[0]
9622 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
9623 continue
9624 }
9625 v.reset(OpNot)
9626 v.AddArg(x)
9627 return true
9628 }
9629 break
9630 }
9631 return false
9632 }
9633 func rewriteValuegeneric_OpEqB(v *Value) bool {
9634 v_1 := v.Args[1]
9635 v_0 := v.Args[0]
9636
9637
9638 for {
9639 x := v_0
9640 if x != v_1 {
9641 break
9642 }
9643 v.reset(OpConstBool)
9644 v.AuxInt = boolToAuxInt(true)
9645 return true
9646 }
9647
9648
9649 for {
9650 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9651 if v_0.Op != OpConstBool {
9652 continue
9653 }
9654 c := auxIntToBool(v_0.AuxInt)
9655 if v_1.Op != OpConstBool {
9656 continue
9657 }
9658 d := auxIntToBool(v_1.AuxInt)
9659 v.reset(OpConstBool)
9660 v.AuxInt = boolToAuxInt(c == d)
9661 return true
9662 }
9663 break
9664 }
9665
9666
9667 for {
9668 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9669 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
9670 continue
9671 }
9672 x := v_1
9673 v.reset(OpNot)
9674 v.AddArg(x)
9675 return true
9676 }
9677 break
9678 }
9679
9680
9681 for {
9682 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9683 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
9684 continue
9685 }
9686 x := v_1
9687 v.copyOf(x)
9688 return true
9689 }
9690 break
9691 }
9692
9693
9694 for {
9695 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9696 if v_0.Op != OpNot {
9697 continue
9698 }
9699 x := v_0.Args[0]
9700 y := v_1
9701 v.reset(OpNeqB)
9702 v.AddArg2(x, y)
9703 return true
9704 }
9705 break
9706 }
9707 return false
9708 }
9709 func rewriteValuegeneric_OpEqInter(v *Value) bool {
9710 v_1 := v.Args[1]
9711 v_0 := v.Args[0]
9712 b := v.Block
9713 typ := &b.Func.Config.Types
9714
9715
9716 for {
9717 x := v_0
9718 y := v_1
9719 v.reset(OpEqPtr)
9720 v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
9721 v0.AddArg(x)
9722 v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
9723 v1.AddArg(y)
9724 v.AddArg2(v0, v1)
9725 return true
9726 }
9727 }
9728 func rewriteValuegeneric_OpEqPtr(v *Value) bool {
9729 v_1 := v.Args[1]
9730 v_0 := v.Args[0]
9731 b := v.Block
9732 typ := &b.Func.Config.Types
9733
9734
9735 for {
9736 x := v_0
9737 if x != v_1 {
9738 break
9739 }
9740 v.reset(OpConstBool)
9741 v.AuxInt = boolToAuxInt(true)
9742 return true
9743 }
9744
9745
9746 for {
9747 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9748 if v_0.Op != OpAddr {
9749 continue
9750 }
9751 x := auxToSym(v_0.Aux)
9752 if v_1.Op != OpAddr {
9753 continue
9754 }
9755 y := auxToSym(v_1.Aux)
9756 v.reset(OpConstBool)
9757 v.AuxInt = boolToAuxInt(x == y)
9758 return true
9759 }
9760 break
9761 }
9762
9763
9764 for {
9765 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9766 if v_0.Op != OpAddr {
9767 continue
9768 }
9769 x := auxToSym(v_0.Aux)
9770 if v_1.Op != OpOffPtr {
9771 continue
9772 }
9773 o := auxIntToInt64(v_1.AuxInt)
9774 v_1_0 := v_1.Args[0]
9775 if v_1_0.Op != OpAddr {
9776 continue
9777 }
9778 y := auxToSym(v_1_0.Aux)
9779 v.reset(OpConstBool)
9780 v.AuxInt = boolToAuxInt(x == y && o == 0)
9781 return true
9782 }
9783 break
9784 }
9785
9786
9787 for {
9788 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9789 if v_0.Op != OpOffPtr {
9790 continue
9791 }
9792 o1 := auxIntToInt64(v_0.AuxInt)
9793 v_0_0 := v_0.Args[0]
9794 if v_0_0.Op != OpAddr {
9795 continue
9796 }
9797 x := auxToSym(v_0_0.Aux)
9798 if v_1.Op != OpOffPtr {
9799 continue
9800 }
9801 o2 := auxIntToInt64(v_1.AuxInt)
9802 v_1_0 := v_1.Args[0]
9803 if v_1_0.Op != OpAddr {
9804 continue
9805 }
9806 y := auxToSym(v_1_0.Aux)
9807 v.reset(OpConstBool)
9808 v.AuxInt = boolToAuxInt(x == y && o1 == o2)
9809 return true
9810 }
9811 break
9812 }
9813
9814
9815 for {
9816 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9817 if v_0.Op != OpLocalAddr {
9818 continue
9819 }
9820 x := auxToSym(v_0.Aux)
9821 if v_1.Op != OpLocalAddr {
9822 continue
9823 }
9824 y := auxToSym(v_1.Aux)
9825 v.reset(OpConstBool)
9826 v.AuxInt = boolToAuxInt(x == y)
9827 return true
9828 }
9829 break
9830 }
9831
9832
9833 for {
9834 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9835 if v_0.Op != OpLocalAddr {
9836 continue
9837 }
9838 x := auxToSym(v_0.Aux)
9839 if v_1.Op != OpOffPtr {
9840 continue
9841 }
9842 o := auxIntToInt64(v_1.AuxInt)
9843 v_1_0 := v_1.Args[0]
9844 if v_1_0.Op != OpLocalAddr {
9845 continue
9846 }
9847 y := auxToSym(v_1_0.Aux)
9848 v.reset(OpConstBool)
9849 v.AuxInt = boolToAuxInt(x == y && o == 0)
9850 return true
9851 }
9852 break
9853 }
9854
9855
9856 for {
9857 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9858 if v_0.Op != OpOffPtr {
9859 continue
9860 }
9861 o1 := auxIntToInt64(v_0.AuxInt)
9862 v_0_0 := v_0.Args[0]
9863 if v_0_0.Op != OpLocalAddr {
9864 continue
9865 }
9866 x := auxToSym(v_0_0.Aux)
9867 if v_1.Op != OpOffPtr {
9868 continue
9869 }
9870 o2 := auxIntToInt64(v_1.AuxInt)
9871 v_1_0 := v_1.Args[0]
9872 if v_1_0.Op != OpLocalAddr {
9873 continue
9874 }
9875 y := auxToSym(v_1_0.Aux)
9876 v.reset(OpConstBool)
9877 v.AuxInt = boolToAuxInt(x == y && o1 == o2)
9878 return true
9879 }
9880 break
9881 }
9882
9883
9884
9885 for {
9886 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9887 if v_0.Op != OpOffPtr {
9888 continue
9889 }
9890 o1 := auxIntToInt64(v_0.AuxInt)
9891 p1 := v_0.Args[0]
9892 p2 := v_1
9893 if !(isSamePtr(p1, p2)) {
9894 continue
9895 }
9896 v.reset(OpConstBool)
9897 v.AuxInt = boolToAuxInt(o1 == 0)
9898 return true
9899 }
9900 break
9901 }
9902
9903
9904
9905 for {
9906 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9907 if v_0.Op != OpOffPtr {
9908 continue
9909 }
9910 o1 := auxIntToInt64(v_0.AuxInt)
9911 p1 := v_0.Args[0]
9912 if v_1.Op != OpOffPtr {
9913 continue
9914 }
9915 o2 := auxIntToInt64(v_1.AuxInt)
9916 p2 := v_1.Args[0]
9917 if !(isSamePtr(p1, p2)) {
9918 continue
9919 }
9920 v.reset(OpConstBool)
9921 v.AuxInt = boolToAuxInt(o1 == o2)
9922 return true
9923 }
9924 break
9925 }
9926
9927
9928 for {
9929 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9930 if v_0.Op != OpConst32 {
9931 continue
9932 }
9933 c := auxIntToInt32(v_0.AuxInt)
9934 if v_1.Op != OpConst32 {
9935 continue
9936 }
9937 d := auxIntToInt32(v_1.AuxInt)
9938 v.reset(OpConstBool)
9939 v.AuxInt = boolToAuxInt(c == d)
9940 return true
9941 }
9942 break
9943 }
9944
9945
9946 for {
9947 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9948 if v_0.Op != OpConst64 {
9949 continue
9950 }
9951 c := auxIntToInt64(v_0.AuxInt)
9952 if v_1.Op != OpConst64 {
9953 continue
9954 }
9955 d := auxIntToInt64(v_1.AuxInt)
9956 v.reset(OpConstBool)
9957 v.AuxInt = boolToAuxInt(c == d)
9958 return true
9959 }
9960 break
9961 }
9962
9963
9964 for {
9965 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9966 if v_0.Op != OpConvert {
9967 continue
9968 }
9969 v_0_0 := v_0.Args[0]
9970 if v_0_0.Op != OpAddr {
9971 continue
9972 }
9973 x := auxToSym(v_0_0.Aux)
9974 if v_1.Op != OpAddr {
9975 continue
9976 }
9977 y := auxToSym(v_1.Aux)
9978 v.reset(OpConstBool)
9979 v.AuxInt = boolToAuxInt(x == y)
9980 return true
9981 }
9982 break
9983 }
9984
9985
9986 for {
9987 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9988 if v_0.Op != OpLocalAddr || v_1.Op != OpAddr {
9989 continue
9990 }
9991 v.reset(OpConstBool)
9992 v.AuxInt = boolToAuxInt(false)
9993 return true
9994 }
9995 break
9996 }
9997
9998
9999 for {
10000 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10001 if v_0.Op != OpOffPtr {
10002 continue
10003 }
10004 v_0_0 := v_0.Args[0]
10005 if v_0_0.Op != OpLocalAddr || v_1.Op != OpAddr {
10006 continue
10007 }
10008 v.reset(OpConstBool)
10009 v.AuxInt = boolToAuxInt(false)
10010 return true
10011 }
10012 break
10013 }
10014
10015
10016 for {
10017 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10018 if v_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
10019 continue
10020 }
10021 v_1_0 := v_1.Args[0]
10022 if v_1_0.Op != OpAddr {
10023 continue
10024 }
10025 v.reset(OpConstBool)
10026 v.AuxInt = boolToAuxInt(false)
10027 return true
10028 }
10029 break
10030 }
10031
10032
10033 for {
10034 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10035 if v_0.Op != OpOffPtr {
10036 continue
10037 }
10038 v_0_0 := v_0.Args[0]
10039 if v_0_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
10040 continue
10041 }
10042 v_1_0 := v_1.Args[0]
10043 if v_1_0.Op != OpAddr {
10044 continue
10045 }
10046 v.reset(OpConstBool)
10047 v.AuxInt = boolToAuxInt(false)
10048 return true
10049 }
10050 break
10051 }
10052
10053
10054
10055 for {
10056 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10057 if v_0.Op != OpAddPtr {
10058 continue
10059 }
10060 o1 := v_0.Args[1]
10061 p1 := v_0.Args[0]
10062 p2 := v_1
10063 if !(isSamePtr(p1, p2)) {
10064 continue
10065 }
10066 v.reset(OpNot)
10067 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
10068 v0.AddArg(o1)
10069 v.AddArg(v0)
10070 return true
10071 }
10072 break
10073 }
10074
10075
10076 for {
10077 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10078 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
10079 continue
10080 }
10081 p := v_1
10082 v.reset(OpNot)
10083 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
10084 v0.AddArg(p)
10085 v.AddArg(v0)
10086 return true
10087 }
10088 break
10089 }
10090
10091
10092 for {
10093 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10094 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
10095 continue
10096 }
10097 p := v_1
10098 v.reset(OpNot)
10099 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
10100 v0.AddArg(p)
10101 v.AddArg(v0)
10102 return true
10103 }
10104 break
10105 }
10106
10107
10108 for {
10109 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10110 if v_0.Op != OpConstNil {
10111 continue
10112 }
10113 p := v_1
10114 v.reset(OpNot)
10115 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
10116 v0.AddArg(p)
10117 v.AddArg(v0)
10118 return true
10119 }
10120 break
10121 }
10122 return false
10123 }
10124 func rewriteValuegeneric_OpEqSlice(v *Value) bool {
10125 v_1 := v.Args[1]
10126 v_0 := v.Args[0]
10127 b := v.Block
10128 typ := &b.Func.Config.Types
10129
10130
10131 for {
10132 x := v_0
10133 y := v_1
10134 v.reset(OpEqPtr)
10135 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
10136 v0.AddArg(x)
10137 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
10138 v1.AddArg(y)
10139 v.AddArg2(v0, v1)
10140 return true
10141 }
10142 }
10143 func rewriteValuegeneric_OpFloor(v *Value) bool {
10144 v_0 := v.Args[0]
10145
10146
10147 for {
10148 if v_0.Op != OpConst64F {
10149 break
10150 }
10151 c := auxIntToFloat64(v_0.AuxInt)
10152 v.reset(OpConst64F)
10153 v.AuxInt = float64ToAuxInt(math.Floor(c))
10154 return true
10155 }
10156 return false
10157 }
10158 func rewriteValuegeneric_OpIMake(v *Value) bool {
10159 v_1 := v.Args[1]
10160 v_0 := v.Args[0]
10161
10162
10163 for {
10164 if v_1.Op != OpStructMake {
10165 break
10166 }
10167 v.copyOf(imakeOfStructMake(v))
10168 return true
10169 }
10170
10171
10172 for {
10173 _typ := v_0
10174 if v_1.Op != OpArrayMake1 {
10175 break
10176 }
10177 val := v_1.Args[0]
10178 v.reset(OpIMake)
10179 v.AddArg2(_typ, val)
10180 return true
10181 }
10182 return false
10183 }
10184 func rewriteValuegeneric_OpInterLECall(v *Value) bool {
10185
10186
10187 for {
10188 if len(v.Args) < 1 {
10189 break
10190 }
10191 v_0 := v.Args[0]
10192 if v_0.Op != OpAddr {
10193 break
10194 }
10195 fn := auxToSym(v_0.Aux)
10196 v_0_0 := v_0.Args[0]
10197 if v_0_0.Op != OpSB {
10198 break
10199 }
10200 v.copyOf(devirtLECall(v, fn.(*obj.LSym)))
10201 return true
10202 }
10203 return false
10204 }
10205 func rewriteValuegeneric_OpIsInBounds(v *Value) bool {
10206 v_1 := v.Args[1]
10207 v_0 := v.Args[0]
10208
10209
10210
10211 for {
10212 if v_0.Op != OpZeroExt8to32 || v_1.Op != OpConst32 {
10213 break
10214 }
10215 c := auxIntToInt32(v_1.AuxInt)
10216 if !((1 << 8) <= c) {
10217 break
10218 }
10219 v.reset(OpConstBool)
10220 v.AuxInt = boolToAuxInt(true)
10221 return true
10222 }
10223
10224
10225
10226 for {
10227 if v_0.Op != OpZeroExt8to64 || v_1.Op != OpConst64 {
10228 break
10229 }
10230 c := auxIntToInt64(v_1.AuxInt)
10231 if !((1 << 8) <= c) {
10232 break
10233 }
10234 v.reset(OpConstBool)
10235 v.AuxInt = boolToAuxInt(true)
10236 return true
10237 }
10238
10239
10240
10241 for {
10242 if v_0.Op != OpZeroExt16to32 || v_1.Op != OpConst32 {
10243 break
10244 }
10245 c := auxIntToInt32(v_1.AuxInt)
10246 if !((1 << 16) <= c) {
10247 break
10248 }
10249 v.reset(OpConstBool)
10250 v.AuxInt = boolToAuxInt(true)
10251 return true
10252 }
10253
10254
10255
10256 for {
10257 if v_0.Op != OpZeroExt16to64 || v_1.Op != OpConst64 {
10258 break
10259 }
10260 c := auxIntToInt64(v_1.AuxInt)
10261 if !((1 << 16) <= c) {
10262 break
10263 }
10264 v.reset(OpConstBool)
10265 v.AuxInt = boolToAuxInt(true)
10266 return true
10267 }
10268
10269
10270 for {
10271 x := v_0
10272 if x != v_1 {
10273 break
10274 }
10275 v.reset(OpConstBool)
10276 v.AuxInt = boolToAuxInt(false)
10277 return true
10278 }
10279
10280
10281
10282 for {
10283 if v_0.Op != OpAnd8 {
10284 break
10285 }
10286 v_0_0 := v_0.Args[0]
10287 v_0_1 := v_0.Args[1]
10288 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
10289 if v_0_0.Op != OpConst8 {
10290 continue
10291 }
10292 c := auxIntToInt8(v_0_0.AuxInt)
10293 if v_1.Op != OpConst8 {
10294 continue
10295 }
10296 d := auxIntToInt8(v_1.AuxInt)
10297 if !(0 <= c && c < d) {
10298 continue
10299 }
10300 v.reset(OpConstBool)
10301 v.AuxInt = boolToAuxInt(true)
10302 return true
10303 }
10304 break
10305 }
10306
10307
10308
10309 for {
10310 if v_0.Op != OpZeroExt8to16 {
10311 break
10312 }
10313 v_0_0 := v_0.Args[0]
10314 if v_0_0.Op != OpAnd8 {
10315 break
10316 }
10317 v_0_0_0 := v_0_0.Args[0]
10318 v_0_0_1 := v_0_0.Args[1]
10319 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
10320 if v_0_0_0.Op != OpConst8 {
10321 continue
10322 }
10323 c := auxIntToInt8(v_0_0_0.AuxInt)
10324 if v_1.Op != OpConst16 {
10325 continue
10326 }
10327 d := auxIntToInt16(v_1.AuxInt)
10328 if !(0 <= c && int16(c) < d) {
10329 continue
10330 }
10331 v.reset(OpConstBool)
10332 v.AuxInt = boolToAuxInt(true)
10333 return true
10334 }
10335 break
10336 }
10337
10338
10339
10340 for {
10341 if v_0.Op != OpZeroExt8to32 {
10342 break
10343 }
10344 v_0_0 := v_0.Args[0]
10345 if v_0_0.Op != OpAnd8 {
10346 break
10347 }
10348 v_0_0_0 := v_0_0.Args[0]
10349 v_0_0_1 := v_0_0.Args[1]
10350 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
10351 if v_0_0_0.Op != OpConst8 {
10352 continue
10353 }
10354 c := auxIntToInt8(v_0_0_0.AuxInt)
10355 if v_1.Op != OpConst32 {
10356 continue
10357 }
10358 d := auxIntToInt32(v_1.AuxInt)
10359 if !(0 <= c && int32(c) < d) {
10360 continue
10361 }
10362 v.reset(OpConstBool)
10363 v.AuxInt = boolToAuxInt(true)
10364 return true
10365 }
10366 break
10367 }
10368
10369
10370
10371 for {
10372 if v_0.Op != OpZeroExt8to64 {
10373 break
10374 }
10375 v_0_0 := v_0.Args[0]
10376 if v_0_0.Op != OpAnd8 {
10377 break
10378 }
10379 v_0_0_0 := v_0_0.Args[0]
10380 v_0_0_1 := v_0_0.Args[1]
10381 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
10382 if v_0_0_0.Op != OpConst8 {
10383 continue
10384 }
10385 c := auxIntToInt8(v_0_0_0.AuxInt)
10386 if v_1.Op != OpConst64 {
10387 continue
10388 }
10389 d := auxIntToInt64(v_1.AuxInt)
10390 if !(0 <= c && int64(c) < d) {
10391 continue
10392 }
10393 v.reset(OpConstBool)
10394 v.AuxInt = boolToAuxInt(true)
10395 return true
10396 }
10397 break
10398 }
10399
10400
10401
10402 for {
10403 if v_0.Op != OpAnd16 {
10404 break
10405 }
10406 v_0_0 := v_0.Args[0]
10407 v_0_1 := v_0.Args[1]
10408 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
10409 if v_0_0.Op != OpConst16 {
10410 continue
10411 }
10412 c := auxIntToInt16(v_0_0.AuxInt)
10413 if v_1.Op != OpConst16 {
10414 continue
10415 }
10416 d := auxIntToInt16(v_1.AuxInt)
10417 if !(0 <= c && c < d) {
10418 continue
10419 }
10420 v.reset(OpConstBool)
10421 v.AuxInt = boolToAuxInt(true)
10422 return true
10423 }
10424 break
10425 }
10426
10427
10428
10429 for {
10430 if v_0.Op != OpZeroExt16to32 {
10431 break
10432 }
10433 v_0_0 := v_0.Args[0]
10434 if v_0_0.Op != OpAnd16 {
10435 break
10436 }
10437 v_0_0_0 := v_0_0.Args[0]
10438 v_0_0_1 := v_0_0.Args[1]
10439 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
10440 if v_0_0_0.Op != OpConst16 {
10441 continue
10442 }
10443 c := auxIntToInt16(v_0_0_0.AuxInt)
10444 if v_1.Op != OpConst32 {
10445 continue
10446 }
10447 d := auxIntToInt32(v_1.AuxInt)
10448 if !(0 <= c && int32(c) < d) {
10449 continue
10450 }
10451 v.reset(OpConstBool)
10452 v.AuxInt = boolToAuxInt(true)
10453 return true
10454 }
10455 break
10456 }
10457
10458
10459
10460 for {
10461 if v_0.Op != OpZeroExt16to64 {
10462 break
10463 }
10464 v_0_0 := v_0.Args[0]
10465 if v_0_0.Op != OpAnd16 {
10466 break
10467 }
10468 v_0_0_0 := v_0_0.Args[0]
10469 v_0_0_1 := v_0_0.Args[1]
10470 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
10471 if v_0_0_0.Op != OpConst16 {
10472 continue
10473 }
10474 c := auxIntToInt16(v_0_0_0.AuxInt)
10475 if v_1.Op != OpConst64 {
10476 continue
10477 }
10478 d := auxIntToInt64(v_1.AuxInt)
10479 if !(0 <= c && int64(c) < d) {
10480 continue
10481 }
10482 v.reset(OpConstBool)
10483 v.AuxInt = boolToAuxInt(true)
10484 return true
10485 }
10486 break
10487 }
10488
10489
10490
10491 for {
10492 if v_0.Op != OpAnd32 {
10493 break
10494 }
10495 v_0_0 := v_0.Args[0]
10496 v_0_1 := v_0.Args[1]
10497 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
10498 if v_0_0.Op != OpConst32 {
10499 continue
10500 }
10501 c := auxIntToInt32(v_0_0.AuxInt)
10502 if v_1.Op != OpConst32 {
10503 continue
10504 }
10505 d := auxIntToInt32(v_1.AuxInt)
10506 if !(0 <= c && c < d) {
10507 continue
10508 }
10509 v.reset(OpConstBool)
10510 v.AuxInt = boolToAuxInt(true)
10511 return true
10512 }
10513 break
10514 }
10515
10516
10517
10518 for {
10519 if v_0.Op != OpZeroExt32to64 {
10520 break
10521 }
10522 v_0_0 := v_0.Args[0]
10523 if v_0_0.Op != OpAnd32 {
10524 break
10525 }
10526 v_0_0_0 := v_0_0.Args[0]
10527 v_0_0_1 := v_0_0.Args[1]
10528 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
10529 if v_0_0_0.Op != OpConst32 {
10530 continue
10531 }
10532 c := auxIntToInt32(v_0_0_0.AuxInt)
10533 if v_1.Op != OpConst64 {
10534 continue
10535 }
10536 d := auxIntToInt64(v_1.AuxInt)
10537 if !(0 <= c && int64(c) < d) {
10538 continue
10539 }
10540 v.reset(OpConstBool)
10541 v.AuxInt = boolToAuxInt(true)
10542 return true
10543 }
10544 break
10545 }
10546
10547
10548
10549 for {
10550 if v_0.Op != OpAnd64 {
10551 break
10552 }
10553 v_0_0 := v_0.Args[0]
10554 v_0_1 := v_0.Args[1]
10555 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
10556 if v_0_0.Op != OpConst64 {
10557 continue
10558 }
10559 c := auxIntToInt64(v_0_0.AuxInt)
10560 if v_1.Op != OpConst64 {
10561 continue
10562 }
10563 d := auxIntToInt64(v_1.AuxInt)
10564 if !(0 <= c && c < d) {
10565 continue
10566 }
10567 v.reset(OpConstBool)
10568 v.AuxInt = boolToAuxInt(true)
10569 return true
10570 }
10571 break
10572 }
10573
10574
10575 for {
10576 if v_0.Op != OpConst32 {
10577 break
10578 }
10579 c := auxIntToInt32(v_0.AuxInt)
10580 if v_1.Op != OpConst32 {
10581 break
10582 }
10583 d := auxIntToInt32(v_1.AuxInt)
10584 v.reset(OpConstBool)
10585 v.AuxInt = boolToAuxInt(0 <= c && c < d)
10586 return true
10587 }
10588
10589
10590 for {
10591 if v_0.Op != OpConst64 {
10592 break
10593 }
10594 c := auxIntToInt64(v_0.AuxInt)
10595 if v_1.Op != OpConst64 {
10596 break
10597 }
10598 d := auxIntToInt64(v_1.AuxInt)
10599 v.reset(OpConstBool)
10600 v.AuxInt = boolToAuxInt(0 <= c && c < d)
10601 return true
10602 }
10603
10604
10605 for {
10606 if v_0.Op != OpMod32u {
10607 break
10608 }
10609 y := v_0.Args[1]
10610 if y != v_1 {
10611 break
10612 }
10613 v.reset(OpConstBool)
10614 v.AuxInt = boolToAuxInt(true)
10615 return true
10616 }
10617
10618
10619 for {
10620 if v_0.Op != OpMod64u {
10621 break
10622 }
10623 y := v_0.Args[1]
10624 if y != v_1 {
10625 break
10626 }
10627 v.reset(OpConstBool)
10628 v.AuxInt = boolToAuxInt(true)
10629 return true
10630 }
10631
10632
10633
10634 for {
10635 if v_0.Op != OpZeroExt8to64 {
10636 break
10637 }
10638 v_0_0 := v_0.Args[0]
10639 if v_0_0.Op != OpRsh8Ux64 {
10640 break
10641 }
10642 _ = v_0_0.Args[1]
10643 v_0_0_1 := v_0_0.Args[1]
10644 if v_0_0_1.Op != OpConst64 {
10645 break
10646 }
10647 c := auxIntToInt64(v_0_0_1.AuxInt)
10648 if v_1.Op != OpConst64 {
10649 break
10650 }
10651 d := auxIntToInt64(v_1.AuxInt)
10652 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
10653 break
10654 }
10655 v.reset(OpConstBool)
10656 v.AuxInt = boolToAuxInt(true)
10657 return true
10658 }
10659
10660
10661
10662 for {
10663 if v_0.Op != OpZeroExt8to32 {
10664 break
10665 }
10666 v_0_0 := v_0.Args[0]
10667 if v_0_0.Op != OpRsh8Ux64 {
10668 break
10669 }
10670 _ = v_0_0.Args[1]
10671 v_0_0_1 := v_0_0.Args[1]
10672 if v_0_0_1.Op != OpConst64 {
10673 break
10674 }
10675 c := auxIntToInt64(v_0_0_1.AuxInt)
10676 if v_1.Op != OpConst32 {
10677 break
10678 }
10679 d := auxIntToInt32(v_1.AuxInt)
10680 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
10681 break
10682 }
10683 v.reset(OpConstBool)
10684 v.AuxInt = boolToAuxInt(true)
10685 return true
10686 }
10687
10688
10689
10690 for {
10691 if v_0.Op != OpZeroExt8to16 {
10692 break
10693 }
10694 v_0_0 := v_0.Args[0]
10695 if v_0_0.Op != OpRsh8Ux64 {
10696 break
10697 }
10698 _ = v_0_0.Args[1]
10699 v_0_0_1 := v_0_0.Args[1]
10700 if v_0_0_1.Op != OpConst64 {
10701 break
10702 }
10703 c := auxIntToInt64(v_0_0_1.AuxInt)
10704 if v_1.Op != OpConst16 {
10705 break
10706 }
10707 d := auxIntToInt16(v_1.AuxInt)
10708 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
10709 break
10710 }
10711 v.reset(OpConstBool)
10712 v.AuxInt = boolToAuxInt(true)
10713 return true
10714 }
10715
10716
10717
10718 for {
10719 if v_0.Op != OpRsh8Ux64 {
10720 break
10721 }
10722 _ = v_0.Args[1]
10723 v_0_1 := v_0.Args[1]
10724 if v_0_1.Op != OpConst64 {
10725 break
10726 }
10727 c := auxIntToInt64(v_0_1.AuxInt)
10728 if v_1.Op != OpConst64 {
10729 break
10730 }
10731 d := auxIntToInt64(v_1.AuxInt)
10732 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
10733 break
10734 }
10735 v.reset(OpConstBool)
10736 v.AuxInt = boolToAuxInt(true)
10737 return true
10738 }
10739
10740
10741
10742 for {
10743 if v_0.Op != OpZeroExt16to64 {
10744 break
10745 }
10746 v_0_0 := v_0.Args[0]
10747 if v_0_0.Op != OpRsh16Ux64 {
10748 break
10749 }
10750 _ = v_0_0.Args[1]
10751 v_0_0_1 := v_0_0.Args[1]
10752 if v_0_0_1.Op != OpConst64 {
10753 break
10754 }
10755 c := auxIntToInt64(v_0_0_1.AuxInt)
10756 if v_1.Op != OpConst64 {
10757 break
10758 }
10759 d := auxIntToInt64(v_1.AuxInt)
10760 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
10761 break
10762 }
10763 v.reset(OpConstBool)
10764 v.AuxInt = boolToAuxInt(true)
10765 return true
10766 }
10767
10768
10769
10770 for {
10771 if v_0.Op != OpZeroExt16to32 {
10772 break
10773 }
10774 v_0_0 := v_0.Args[0]
10775 if v_0_0.Op != OpRsh16Ux64 {
10776 break
10777 }
10778 _ = v_0_0.Args[1]
10779 v_0_0_1 := v_0_0.Args[1]
10780 if v_0_0_1.Op != OpConst64 {
10781 break
10782 }
10783 c := auxIntToInt64(v_0_0_1.AuxInt)
10784 if v_1.Op != OpConst64 {
10785 break
10786 }
10787 d := auxIntToInt64(v_1.AuxInt)
10788 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
10789 break
10790 }
10791 v.reset(OpConstBool)
10792 v.AuxInt = boolToAuxInt(true)
10793 return true
10794 }
10795
10796
10797
10798 for {
10799 if v_0.Op != OpRsh16Ux64 {
10800 break
10801 }
10802 _ = v_0.Args[1]
10803 v_0_1 := v_0.Args[1]
10804 if v_0_1.Op != OpConst64 {
10805 break
10806 }
10807 c := auxIntToInt64(v_0_1.AuxInt)
10808 if v_1.Op != OpConst64 {
10809 break
10810 }
10811 d := auxIntToInt64(v_1.AuxInt)
10812 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
10813 break
10814 }
10815 v.reset(OpConstBool)
10816 v.AuxInt = boolToAuxInt(true)
10817 return true
10818 }
10819
10820
10821
10822 for {
10823 if v_0.Op != OpZeroExt32to64 {
10824 break
10825 }
10826 v_0_0 := v_0.Args[0]
10827 if v_0_0.Op != OpRsh32Ux64 {
10828 break
10829 }
10830 _ = v_0_0.Args[1]
10831 v_0_0_1 := v_0_0.Args[1]
10832 if v_0_0_1.Op != OpConst64 {
10833 break
10834 }
10835 c := auxIntToInt64(v_0_0_1.AuxInt)
10836 if v_1.Op != OpConst64 {
10837 break
10838 }
10839 d := auxIntToInt64(v_1.AuxInt)
10840 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) {
10841 break
10842 }
10843 v.reset(OpConstBool)
10844 v.AuxInt = boolToAuxInt(true)
10845 return true
10846 }
10847
10848
10849
10850 for {
10851 if v_0.Op != OpRsh32Ux64 {
10852 break
10853 }
10854 _ = v_0.Args[1]
10855 v_0_1 := v_0.Args[1]
10856 if v_0_1.Op != OpConst64 {
10857 break
10858 }
10859 c := auxIntToInt64(v_0_1.AuxInt)
10860 if v_1.Op != OpConst64 {
10861 break
10862 }
10863 d := auxIntToInt64(v_1.AuxInt)
10864 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) {
10865 break
10866 }
10867 v.reset(OpConstBool)
10868 v.AuxInt = boolToAuxInt(true)
10869 return true
10870 }
10871
10872
10873
10874 for {
10875 if v_0.Op != OpRsh64Ux64 {
10876 break
10877 }
10878 _ = v_0.Args[1]
10879 v_0_1 := v_0.Args[1]
10880 if v_0_1.Op != OpConst64 {
10881 break
10882 }
10883 c := auxIntToInt64(v_0_1.AuxInt)
10884 if v_1.Op != OpConst64 {
10885 break
10886 }
10887 d := auxIntToInt64(v_1.AuxInt)
10888 if !(0 < c && c < 64 && 1<<uint(64-c)-1 < d) {
10889 break
10890 }
10891 v.reset(OpConstBool)
10892 v.AuxInt = boolToAuxInt(true)
10893 return true
10894 }
10895 return false
10896 }
10897 func rewriteValuegeneric_OpIsNonNil(v *Value) bool {
10898 v_0 := v.Args[0]
10899
10900
10901 for {
10902 if v_0.Op != OpConstNil {
10903 break
10904 }
10905 v.reset(OpConstBool)
10906 v.AuxInt = boolToAuxInt(false)
10907 return true
10908 }
10909
10910
10911 for {
10912 if v_0.Op != OpConst32 {
10913 break
10914 }
10915 c := auxIntToInt32(v_0.AuxInt)
10916 v.reset(OpConstBool)
10917 v.AuxInt = boolToAuxInt(c != 0)
10918 return true
10919 }
10920
10921
10922 for {
10923 if v_0.Op != OpConst64 {
10924 break
10925 }
10926 c := auxIntToInt64(v_0.AuxInt)
10927 v.reset(OpConstBool)
10928 v.AuxInt = boolToAuxInt(c != 0)
10929 return true
10930 }
10931
10932
10933 for {
10934 if v_0.Op != OpAddr {
10935 break
10936 }
10937 v.reset(OpConstBool)
10938 v.AuxInt = boolToAuxInt(true)
10939 return true
10940 }
10941
10942
10943 for {
10944 if v_0.Op != OpConvert {
10945 break
10946 }
10947 v_0_0 := v_0.Args[0]
10948 if v_0_0.Op != OpAddr {
10949 break
10950 }
10951 v.reset(OpConstBool)
10952 v.AuxInt = boolToAuxInt(true)
10953 return true
10954 }
10955
10956
10957 for {
10958 if v_0.Op != OpLocalAddr {
10959 break
10960 }
10961 v.reset(OpConstBool)
10962 v.AuxInt = boolToAuxInt(true)
10963 return true
10964 }
10965 return false
10966 }
10967 func rewriteValuegeneric_OpIsSliceInBounds(v *Value) bool {
10968 v_1 := v.Args[1]
10969 v_0 := v.Args[0]
10970
10971
10972 for {
10973 x := v_0
10974 if x != v_1 {
10975 break
10976 }
10977 v.reset(OpConstBool)
10978 v.AuxInt = boolToAuxInt(true)
10979 return true
10980 }
10981
10982
10983
10984 for {
10985 if v_0.Op != OpAnd32 {
10986 break
10987 }
10988 v_0_0 := v_0.Args[0]
10989 v_0_1 := v_0.Args[1]
10990 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
10991 if v_0_0.Op != OpConst32 {
10992 continue
10993 }
10994 c := auxIntToInt32(v_0_0.AuxInt)
10995 if v_1.Op != OpConst32 {
10996 continue
10997 }
10998 d := auxIntToInt32(v_1.AuxInt)
10999 if !(0 <= c && c <= d) {
11000 continue
11001 }
11002 v.reset(OpConstBool)
11003 v.AuxInt = boolToAuxInt(true)
11004 return true
11005 }
11006 break
11007 }
11008
11009
11010
11011 for {
11012 if v_0.Op != OpAnd64 {
11013 break
11014 }
11015 v_0_0 := v_0.Args[0]
11016 v_0_1 := v_0.Args[1]
11017 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
11018 if v_0_0.Op != OpConst64 {
11019 continue
11020 }
11021 c := auxIntToInt64(v_0_0.AuxInt)
11022 if v_1.Op != OpConst64 {
11023 continue
11024 }
11025 d := auxIntToInt64(v_1.AuxInt)
11026 if !(0 <= c && c <= d) {
11027 continue
11028 }
11029 v.reset(OpConstBool)
11030 v.AuxInt = boolToAuxInt(true)
11031 return true
11032 }
11033 break
11034 }
11035
11036
11037 for {
11038 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
11039 break
11040 }
11041 v.reset(OpConstBool)
11042 v.AuxInt = boolToAuxInt(true)
11043 return true
11044 }
11045
11046
11047 for {
11048 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
11049 break
11050 }
11051 v.reset(OpConstBool)
11052 v.AuxInt = boolToAuxInt(true)
11053 return true
11054 }
11055
11056
11057 for {
11058 if v_0.Op != OpConst32 {
11059 break
11060 }
11061 c := auxIntToInt32(v_0.AuxInt)
11062 if v_1.Op != OpConst32 {
11063 break
11064 }
11065 d := auxIntToInt32(v_1.AuxInt)
11066 v.reset(OpConstBool)
11067 v.AuxInt = boolToAuxInt(0 <= c && c <= d)
11068 return true
11069 }
11070
11071
11072 for {
11073 if v_0.Op != OpConst64 {
11074 break
11075 }
11076 c := auxIntToInt64(v_0.AuxInt)
11077 if v_1.Op != OpConst64 {
11078 break
11079 }
11080 d := auxIntToInt64(v_1.AuxInt)
11081 v.reset(OpConstBool)
11082 v.AuxInt = boolToAuxInt(0 <= c && c <= d)
11083 return true
11084 }
11085
11086
11087 for {
11088 if v_0.Op != OpSliceLen {
11089 break
11090 }
11091 x := v_0.Args[0]
11092 if v_1.Op != OpSliceCap || x != v_1.Args[0] {
11093 break
11094 }
11095 v.reset(OpConstBool)
11096 v.AuxInt = boolToAuxInt(true)
11097 return true
11098 }
11099 return false
11100 }
11101 func rewriteValuegeneric_OpLeq16(v *Value) bool {
11102 v_1 := v.Args[1]
11103 v_0 := v.Args[0]
11104 b := v.Block
11105
11106
11107 for {
11108 if v_0.Op != OpConst16 {
11109 break
11110 }
11111 c := auxIntToInt16(v_0.AuxInt)
11112 if v_1.Op != OpConst16 {
11113 break
11114 }
11115 d := auxIntToInt16(v_1.AuxInt)
11116 v.reset(OpConstBool)
11117 v.AuxInt = boolToAuxInt(c <= d)
11118 return true
11119 }
11120
11121
11122
11123 for {
11124 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 || v_1.Op != OpAnd16 {
11125 break
11126 }
11127 _ = v_1.Args[1]
11128 v_1_0 := v_1.Args[0]
11129 v_1_1 := v_1.Args[1]
11130 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
11131 if v_1_1.Op != OpConst16 {
11132 continue
11133 }
11134 c := auxIntToInt16(v_1_1.AuxInt)
11135 if !(c >= 0) {
11136 continue
11137 }
11138 v.reset(OpConstBool)
11139 v.AuxInt = boolToAuxInt(true)
11140 return true
11141 }
11142 break
11143 }
11144
11145
11146
11147 for {
11148 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 || v_1.Op != OpRsh16Ux64 {
11149 break
11150 }
11151 _ = v_1.Args[1]
11152 v_1_1 := v_1.Args[1]
11153 if v_1_1.Op != OpConst64 {
11154 break
11155 }
11156 c := auxIntToInt64(v_1_1.AuxInt)
11157 if !(c > 0) {
11158 break
11159 }
11160 v.reset(OpConstBool)
11161 v.AuxInt = boolToAuxInt(true)
11162 return true
11163 }
11164
11165
11166 for {
11167 x := v_0
11168 if v_1.Op != OpConst16 {
11169 break
11170 }
11171 t := v_1.Type
11172 if auxIntToInt16(v_1.AuxInt) != -1 {
11173 break
11174 }
11175 v.reset(OpLess16)
11176 v0 := b.NewValue0(v.Pos, OpConst16, t)
11177 v0.AuxInt = int16ToAuxInt(0)
11178 v.AddArg2(x, v0)
11179 return true
11180 }
11181
11182
11183 for {
11184 if v_0.Op != OpConst16 {
11185 break
11186 }
11187 t := v_0.Type
11188 if auxIntToInt16(v_0.AuxInt) != 1 {
11189 break
11190 }
11191 x := v_1
11192 v.reset(OpLess16)
11193 v0 := b.NewValue0(v.Pos, OpConst16, t)
11194 v0.AuxInt = int16ToAuxInt(0)
11195 v.AddArg2(v0, x)
11196 return true
11197 }
11198
11199
11200 for {
11201 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != math.MinInt16 {
11202 break
11203 }
11204 v.reset(OpConstBool)
11205 v.AuxInt = boolToAuxInt(true)
11206 return true
11207 }
11208
11209
11210 for {
11211 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != math.MaxInt16 {
11212 break
11213 }
11214 v.reset(OpConstBool)
11215 v.AuxInt = boolToAuxInt(true)
11216 return true
11217 }
11218
11219
11220 for {
11221 x := v_0
11222 c := v_1
11223 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != math.MinInt16 {
11224 break
11225 }
11226 v.reset(OpEq16)
11227 v.AddArg2(x, c)
11228 return true
11229 }
11230
11231
11232 for {
11233 c := v_0
11234 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != math.MaxInt16 {
11235 break
11236 }
11237 x := v_1
11238 v.reset(OpEq16)
11239 v.AddArg2(x, c)
11240 return true
11241 }
11242 return false
11243 }
11244 func rewriteValuegeneric_OpLeq16U(v *Value) bool {
11245 v_1 := v.Args[1]
11246 v_0 := v.Args[0]
11247 b := v.Block
11248
11249
11250 for {
11251 if v_0.Op != OpConst16 {
11252 break
11253 }
11254 c := auxIntToInt16(v_0.AuxInt)
11255 if v_1.Op != OpConst16 {
11256 break
11257 }
11258 d := auxIntToInt16(v_1.AuxInt)
11259 v.reset(OpConstBool)
11260 v.AuxInt = boolToAuxInt(uint16(c) <= uint16(d))
11261 return true
11262 }
11263
11264
11265 for {
11266 if v_0.Op != OpConst16 {
11267 break
11268 }
11269 t := v_0.Type
11270 if auxIntToInt16(v_0.AuxInt) != 1 {
11271 break
11272 }
11273 x := v_1
11274 v.reset(OpNeq16)
11275 v0 := b.NewValue0(v.Pos, OpConst16, t)
11276 v0.AuxInt = int16ToAuxInt(0)
11277 v.AddArg2(v0, x)
11278 return true
11279 }
11280
11281
11282 for {
11283 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
11284 break
11285 }
11286 v.reset(OpConstBool)
11287 v.AuxInt = boolToAuxInt(true)
11288 return true
11289 }
11290
11291
11292 for {
11293 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != -1 {
11294 break
11295 }
11296 v.reset(OpConstBool)
11297 v.AuxInt = boolToAuxInt(true)
11298 return true
11299 }
11300
11301
11302 for {
11303 x := v_0
11304 c := v_1
11305 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != 0 {
11306 break
11307 }
11308 v.reset(OpEq16)
11309 v.AddArg2(x, c)
11310 return true
11311 }
11312
11313
11314 for {
11315 c := v_0
11316 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != -1 {
11317 break
11318 }
11319 x := v_1
11320 v.reset(OpEq16)
11321 v.AddArg2(x, c)
11322 return true
11323 }
11324 return false
11325 }
11326 func rewriteValuegeneric_OpLeq32(v *Value) bool {
11327 v_1 := v.Args[1]
11328 v_0 := v.Args[0]
11329 b := v.Block
11330
11331
11332 for {
11333 if v_0.Op != OpConst32 {
11334 break
11335 }
11336 c := auxIntToInt32(v_0.AuxInt)
11337 if v_1.Op != OpConst32 {
11338 break
11339 }
11340 d := auxIntToInt32(v_1.AuxInt)
11341 v.reset(OpConstBool)
11342 v.AuxInt = boolToAuxInt(c <= d)
11343 return true
11344 }
11345
11346
11347
11348 for {
11349 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 || v_1.Op != OpAnd32 {
11350 break
11351 }
11352 _ = v_1.Args[1]
11353 v_1_0 := v_1.Args[0]
11354 v_1_1 := v_1.Args[1]
11355 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
11356 if v_1_1.Op != OpConst32 {
11357 continue
11358 }
11359 c := auxIntToInt32(v_1_1.AuxInt)
11360 if !(c >= 0) {
11361 continue
11362 }
11363 v.reset(OpConstBool)
11364 v.AuxInt = boolToAuxInt(true)
11365 return true
11366 }
11367 break
11368 }
11369
11370
11371
11372 for {
11373 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 || v_1.Op != OpRsh32Ux64 {
11374 break
11375 }
11376 _ = v_1.Args[1]
11377 v_1_1 := v_1.Args[1]
11378 if v_1_1.Op != OpConst64 {
11379 break
11380 }
11381 c := auxIntToInt64(v_1_1.AuxInt)
11382 if !(c > 0) {
11383 break
11384 }
11385 v.reset(OpConstBool)
11386 v.AuxInt = boolToAuxInt(true)
11387 return true
11388 }
11389
11390
11391 for {
11392 x := v_0
11393 if v_1.Op != OpConst32 {
11394 break
11395 }
11396 t := v_1.Type
11397 if auxIntToInt32(v_1.AuxInt) != -1 {
11398 break
11399 }
11400 v.reset(OpLess32)
11401 v0 := b.NewValue0(v.Pos, OpConst32, t)
11402 v0.AuxInt = int32ToAuxInt(0)
11403 v.AddArg2(x, v0)
11404 return true
11405 }
11406
11407
11408 for {
11409 if v_0.Op != OpConst32 {
11410 break
11411 }
11412 t := v_0.Type
11413 if auxIntToInt32(v_0.AuxInt) != 1 {
11414 break
11415 }
11416 x := v_1
11417 v.reset(OpLess32)
11418 v0 := b.NewValue0(v.Pos, OpConst32, t)
11419 v0.AuxInt = int32ToAuxInt(0)
11420 v.AddArg2(v0, x)
11421 return true
11422 }
11423
11424
11425 for {
11426 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != math.MinInt32 {
11427 break
11428 }
11429 v.reset(OpConstBool)
11430 v.AuxInt = boolToAuxInt(true)
11431 return true
11432 }
11433
11434
11435 for {
11436 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != math.MaxInt32 {
11437 break
11438 }
11439 v.reset(OpConstBool)
11440 v.AuxInt = boolToAuxInt(true)
11441 return true
11442 }
11443
11444
11445 for {
11446 x := v_0
11447 c := v_1
11448 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != math.MinInt32 {
11449 break
11450 }
11451 v.reset(OpEq32)
11452 v.AddArg2(x, c)
11453 return true
11454 }
11455
11456
11457 for {
11458 c := v_0
11459 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != math.MaxInt32 {
11460 break
11461 }
11462 x := v_1
11463 v.reset(OpEq32)
11464 v.AddArg2(x, c)
11465 return true
11466 }
11467 return false
11468 }
11469 func rewriteValuegeneric_OpLeq32F(v *Value) bool {
11470 v_1 := v.Args[1]
11471 v_0 := v.Args[0]
11472
11473
11474 for {
11475 if v_0.Op != OpConst32F {
11476 break
11477 }
11478 c := auxIntToFloat32(v_0.AuxInt)
11479 if v_1.Op != OpConst32F {
11480 break
11481 }
11482 d := auxIntToFloat32(v_1.AuxInt)
11483 v.reset(OpConstBool)
11484 v.AuxInt = boolToAuxInt(c <= d)
11485 return true
11486 }
11487 return false
11488 }
11489 func rewriteValuegeneric_OpLeq32U(v *Value) bool {
11490 v_1 := v.Args[1]
11491 v_0 := v.Args[0]
11492 b := v.Block
11493
11494
11495 for {
11496 if v_0.Op != OpConst32 {
11497 break
11498 }
11499 c := auxIntToInt32(v_0.AuxInt)
11500 if v_1.Op != OpConst32 {
11501 break
11502 }
11503 d := auxIntToInt32(v_1.AuxInt)
11504 v.reset(OpConstBool)
11505 v.AuxInt = boolToAuxInt(uint32(c) <= uint32(d))
11506 return true
11507 }
11508
11509
11510 for {
11511 if v_0.Op != OpConst32 {
11512 break
11513 }
11514 t := v_0.Type
11515 if auxIntToInt32(v_0.AuxInt) != 1 {
11516 break
11517 }
11518 x := v_1
11519 v.reset(OpNeq32)
11520 v0 := b.NewValue0(v.Pos, OpConst32, t)
11521 v0.AuxInt = int32ToAuxInt(0)
11522 v.AddArg2(v0, x)
11523 return true
11524 }
11525
11526
11527 for {
11528 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
11529 break
11530 }
11531 v.reset(OpConstBool)
11532 v.AuxInt = boolToAuxInt(true)
11533 return true
11534 }
11535
11536
11537 for {
11538 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != -1 {
11539 break
11540 }
11541 v.reset(OpConstBool)
11542 v.AuxInt = boolToAuxInt(true)
11543 return true
11544 }
11545
11546
11547 for {
11548 x := v_0
11549 c := v_1
11550 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != 0 {
11551 break
11552 }
11553 v.reset(OpEq32)
11554 v.AddArg2(x, c)
11555 return true
11556 }
11557
11558
11559 for {
11560 c := v_0
11561 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != -1 {
11562 break
11563 }
11564 x := v_1
11565 v.reset(OpEq32)
11566 v.AddArg2(x, c)
11567 return true
11568 }
11569 return false
11570 }
11571 func rewriteValuegeneric_OpLeq64(v *Value) bool {
11572 v_1 := v.Args[1]
11573 v_0 := v.Args[0]
11574 b := v.Block
11575
11576
11577 for {
11578 if v_0.Op != OpConst64 {
11579 break
11580 }
11581 c := auxIntToInt64(v_0.AuxInt)
11582 if v_1.Op != OpConst64 {
11583 break
11584 }
11585 d := auxIntToInt64(v_1.AuxInt)
11586 v.reset(OpConstBool)
11587 v.AuxInt = boolToAuxInt(c <= d)
11588 return true
11589 }
11590
11591
11592
11593 for {
11594 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 || v_1.Op != OpAnd64 {
11595 break
11596 }
11597 _ = v_1.Args[1]
11598 v_1_0 := v_1.Args[0]
11599 v_1_1 := v_1.Args[1]
11600 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
11601 if v_1_1.Op != OpConst64 {
11602 continue
11603 }
11604 c := auxIntToInt64(v_1_1.AuxInt)
11605 if !(c >= 0) {
11606 continue
11607 }
11608 v.reset(OpConstBool)
11609 v.AuxInt = boolToAuxInt(true)
11610 return true
11611 }
11612 break
11613 }
11614
11615
11616
11617 for {
11618 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 || v_1.Op != OpRsh64Ux64 {
11619 break
11620 }
11621 _ = v_1.Args[1]
11622 v_1_1 := v_1.Args[1]
11623 if v_1_1.Op != OpConst64 {
11624 break
11625 }
11626 c := auxIntToInt64(v_1_1.AuxInt)
11627 if !(c > 0) {
11628 break
11629 }
11630 v.reset(OpConstBool)
11631 v.AuxInt = boolToAuxInt(true)
11632 return true
11633 }
11634
11635
11636 for {
11637 x := v_0
11638 if v_1.Op != OpConst64 {
11639 break
11640 }
11641 t := v_1.Type
11642 if auxIntToInt64(v_1.AuxInt) != -1 {
11643 break
11644 }
11645 v.reset(OpLess64)
11646 v0 := b.NewValue0(v.Pos, OpConst64, t)
11647 v0.AuxInt = int64ToAuxInt(0)
11648 v.AddArg2(x, v0)
11649 return true
11650 }
11651
11652
11653 for {
11654 if v_0.Op != OpConst64 {
11655 break
11656 }
11657 t := v_0.Type
11658 if auxIntToInt64(v_0.AuxInt) != 1 {
11659 break
11660 }
11661 x := v_1
11662 v.reset(OpLess64)
11663 v0 := b.NewValue0(v.Pos, OpConst64, t)
11664 v0.AuxInt = int64ToAuxInt(0)
11665 v.AddArg2(v0, x)
11666 return true
11667 }
11668
11669
11670 for {
11671 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != math.MinInt64 {
11672 break
11673 }
11674 v.reset(OpConstBool)
11675 v.AuxInt = boolToAuxInt(true)
11676 return true
11677 }
11678
11679
11680 for {
11681 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != math.MaxInt64 {
11682 break
11683 }
11684 v.reset(OpConstBool)
11685 v.AuxInt = boolToAuxInt(true)
11686 return true
11687 }
11688
11689
11690 for {
11691 x := v_0
11692 c := v_1
11693 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != math.MinInt64 {
11694 break
11695 }
11696 v.reset(OpEq64)
11697 v.AddArg2(x, c)
11698 return true
11699 }
11700
11701
11702 for {
11703 c := v_0
11704 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != math.MaxInt64 {
11705 break
11706 }
11707 x := v_1
11708 v.reset(OpEq64)
11709 v.AddArg2(x, c)
11710 return true
11711 }
11712 return false
11713 }
11714 func rewriteValuegeneric_OpLeq64F(v *Value) bool {
11715 v_1 := v.Args[1]
11716 v_0 := v.Args[0]
11717
11718
11719 for {
11720 if v_0.Op != OpConst64F {
11721 break
11722 }
11723 c := auxIntToFloat64(v_0.AuxInt)
11724 if v_1.Op != OpConst64F {
11725 break
11726 }
11727 d := auxIntToFloat64(v_1.AuxInt)
11728 v.reset(OpConstBool)
11729 v.AuxInt = boolToAuxInt(c <= d)
11730 return true
11731 }
11732 return false
11733 }
11734 func rewriteValuegeneric_OpLeq64U(v *Value) bool {
11735 v_1 := v.Args[1]
11736 v_0 := v.Args[0]
11737 b := v.Block
11738
11739
11740 for {
11741 if v_0.Op != OpConst64 {
11742 break
11743 }
11744 c := auxIntToInt64(v_0.AuxInt)
11745 if v_1.Op != OpConst64 {
11746 break
11747 }
11748 d := auxIntToInt64(v_1.AuxInt)
11749 v.reset(OpConstBool)
11750 v.AuxInt = boolToAuxInt(uint64(c) <= uint64(d))
11751 return true
11752 }
11753
11754
11755 for {
11756 if v_0.Op != OpConst64 {
11757 break
11758 }
11759 t := v_0.Type
11760 if auxIntToInt64(v_0.AuxInt) != 1 {
11761 break
11762 }
11763 x := v_1
11764 v.reset(OpNeq64)
11765 v0 := b.NewValue0(v.Pos, OpConst64, t)
11766 v0.AuxInt = int64ToAuxInt(0)
11767 v.AddArg2(v0, x)
11768 return true
11769 }
11770
11771
11772 for {
11773 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
11774 break
11775 }
11776 v.reset(OpConstBool)
11777 v.AuxInt = boolToAuxInt(true)
11778 return true
11779 }
11780
11781
11782 for {
11783 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1 {
11784 break
11785 }
11786 v.reset(OpConstBool)
11787 v.AuxInt = boolToAuxInt(true)
11788 return true
11789 }
11790
11791
11792 for {
11793 x := v_0
11794 c := v_1
11795 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != 0 {
11796 break
11797 }
11798 v.reset(OpEq64)
11799 v.AddArg2(x, c)
11800 return true
11801 }
11802
11803
11804 for {
11805 c := v_0
11806 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != -1 {
11807 break
11808 }
11809 x := v_1
11810 v.reset(OpEq64)
11811 v.AddArg2(x, c)
11812 return true
11813 }
11814 return false
11815 }
11816 func rewriteValuegeneric_OpLeq8(v *Value) bool {
11817 v_1 := v.Args[1]
11818 v_0 := v.Args[0]
11819 b := v.Block
11820
11821
11822 for {
11823 if v_0.Op != OpConst8 {
11824 break
11825 }
11826 c := auxIntToInt8(v_0.AuxInt)
11827 if v_1.Op != OpConst8 {
11828 break
11829 }
11830 d := auxIntToInt8(v_1.AuxInt)
11831 v.reset(OpConstBool)
11832 v.AuxInt = boolToAuxInt(c <= d)
11833 return true
11834 }
11835
11836
11837
11838 for {
11839 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 || v_1.Op != OpAnd8 {
11840 break
11841 }
11842 _ = v_1.Args[1]
11843 v_1_0 := v_1.Args[0]
11844 v_1_1 := v_1.Args[1]
11845 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
11846 if v_1_1.Op != OpConst8 {
11847 continue
11848 }
11849 c := auxIntToInt8(v_1_1.AuxInt)
11850 if !(c >= 0) {
11851 continue
11852 }
11853 v.reset(OpConstBool)
11854 v.AuxInt = boolToAuxInt(true)
11855 return true
11856 }
11857 break
11858 }
11859
11860
11861
11862 for {
11863 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 || v_1.Op != OpRsh8Ux64 {
11864 break
11865 }
11866 _ = v_1.Args[1]
11867 v_1_1 := v_1.Args[1]
11868 if v_1_1.Op != OpConst64 {
11869 break
11870 }
11871 c := auxIntToInt64(v_1_1.AuxInt)
11872 if !(c > 0) {
11873 break
11874 }
11875 v.reset(OpConstBool)
11876 v.AuxInt = boolToAuxInt(true)
11877 return true
11878 }
11879
11880
11881 for {
11882 x := v_0
11883 if v_1.Op != OpConst8 {
11884 break
11885 }
11886 t := v_1.Type
11887 if auxIntToInt8(v_1.AuxInt) != -1 {
11888 break
11889 }
11890 v.reset(OpLess8)
11891 v0 := b.NewValue0(v.Pos, OpConst8, t)
11892 v0.AuxInt = int8ToAuxInt(0)
11893 v.AddArg2(x, v0)
11894 return true
11895 }
11896
11897
11898 for {
11899 if v_0.Op != OpConst8 {
11900 break
11901 }
11902 t := v_0.Type
11903 if auxIntToInt8(v_0.AuxInt) != 1 {
11904 break
11905 }
11906 x := v_1
11907 v.reset(OpLess8)
11908 v0 := b.NewValue0(v.Pos, OpConst8, t)
11909 v0.AuxInt = int8ToAuxInt(0)
11910 v.AddArg2(v0, x)
11911 return true
11912 }
11913
11914
11915 for {
11916 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != math.MinInt8 {
11917 break
11918 }
11919 v.reset(OpConstBool)
11920 v.AuxInt = boolToAuxInt(true)
11921 return true
11922 }
11923
11924
11925 for {
11926 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != math.MaxInt8 {
11927 break
11928 }
11929 v.reset(OpConstBool)
11930 v.AuxInt = boolToAuxInt(true)
11931 return true
11932 }
11933
11934
11935 for {
11936 x := v_0
11937 c := v_1
11938 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != math.MinInt8 {
11939 break
11940 }
11941 v.reset(OpEq8)
11942 v.AddArg2(x, c)
11943 return true
11944 }
11945
11946
11947 for {
11948 c := v_0
11949 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != math.MaxInt8 {
11950 break
11951 }
11952 x := v_1
11953 v.reset(OpEq8)
11954 v.AddArg2(x, c)
11955 return true
11956 }
11957 return false
11958 }
11959 func rewriteValuegeneric_OpLeq8U(v *Value) bool {
11960 v_1 := v.Args[1]
11961 v_0 := v.Args[0]
11962 b := v.Block
11963
11964
11965 for {
11966 if v_0.Op != OpConst8 {
11967 break
11968 }
11969 c := auxIntToInt8(v_0.AuxInt)
11970 if v_1.Op != OpConst8 {
11971 break
11972 }
11973 d := auxIntToInt8(v_1.AuxInt)
11974 v.reset(OpConstBool)
11975 v.AuxInt = boolToAuxInt(uint8(c) <= uint8(d))
11976 return true
11977 }
11978
11979
11980 for {
11981 if v_0.Op != OpConst8 {
11982 break
11983 }
11984 t := v_0.Type
11985 if auxIntToInt8(v_0.AuxInt) != 1 {
11986 break
11987 }
11988 x := v_1
11989 v.reset(OpNeq8)
11990 v0 := b.NewValue0(v.Pos, OpConst8, t)
11991 v0.AuxInt = int8ToAuxInt(0)
11992 v.AddArg2(v0, x)
11993 return true
11994 }
11995
11996
11997 for {
11998 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
11999 break
12000 }
12001 v.reset(OpConstBool)
12002 v.AuxInt = boolToAuxInt(true)
12003 return true
12004 }
12005
12006
12007 for {
12008 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != -1 {
12009 break
12010 }
12011 v.reset(OpConstBool)
12012 v.AuxInt = boolToAuxInt(true)
12013 return true
12014 }
12015
12016
12017 for {
12018 x := v_0
12019 c := v_1
12020 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != 0 {
12021 break
12022 }
12023 v.reset(OpEq8)
12024 v.AddArg2(x, c)
12025 return true
12026 }
12027
12028
12029 for {
12030 c := v_0
12031 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != -1 {
12032 break
12033 }
12034 x := v_1
12035 v.reset(OpEq8)
12036 v.AddArg2(x, c)
12037 return true
12038 }
12039 return false
12040 }
12041 func rewriteValuegeneric_OpLess16(v *Value) bool {
12042 v_1 := v.Args[1]
12043 v_0 := v.Args[0]
12044 b := v.Block
12045
12046
12047 for {
12048 if v_0.Op != OpConst16 {
12049 break
12050 }
12051 c := auxIntToInt16(v_0.AuxInt)
12052 if v_1.Op != OpConst16 {
12053 break
12054 }
12055 d := auxIntToInt16(v_1.AuxInt)
12056 v.reset(OpConstBool)
12057 v.AuxInt = boolToAuxInt(c < d)
12058 return true
12059 }
12060
12061
12062
12063 for {
12064 if v_0.Op != OpConst16 {
12065 break
12066 }
12067 t := v_0.Type
12068 if auxIntToInt16(v_0.AuxInt) != 0 {
12069 break
12070 }
12071 x := v_1
12072 if !(isNonNegative(x)) {
12073 break
12074 }
12075 v.reset(OpNeq16)
12076 v0 := b.NewValue0(v.Pos, OpConst16, t)
12077 v0.AuxInt = int16ToAuxInt(0)
12078 v.AddArg2(v0, x)
12079 return true
12080 }
12081
12082
12083
12084 for {
12085 x := v_0
12086 if v_1.Op != OpConst16 {
12087 break
12088 }
12089 t := v_1.Type
12090 if auxIntToInt16(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
12091 break
12092 }
12093 v.reset(OpEq16)
12094 v0 := b.NewValue0(v.Pos, OpConst16, t)
12095 v0.AuxInt = int16ToAuxInt(0)
12096 v.AddArg2(v0, x)
12097 return true
12098 }
12099
12100
12101 for {
12102 x := v_0
12103 if v_1.Op != OpConst16 {
12104 break
12105 }
12106 t := v_1.Type
12107 if auxIntToInt16(v_1.AuxInt) != 1 {
12108 break
12109 }
12110 v.reset(OpLeq16)
12111 v0 := b.NewValue0(v.Pos, OpConst16, t)
12112 v0.AuxInt = int16ToAuxInt(0)
12113 v.AddArg2(x, v0)
12114 return true
12115 }
12116
12117
12118 for {
12119 if v_0.Op != OpConst16 {
12120 break
12121 }
12122 t := v_0.Type
12123 if auxIntToInt16(v_0.AuxInt) != -1 {
12124 break
12125 }
12126 x := v_1
12127 v.reset(OpLeq16)
12128 v0 := b.NewValue0(v.Pos, OpConst16, t)
12129 v0.AuxInt = int16ToAuxInt(0)
12130 v.AddArg2(v0, x)
12131 return true
12132 }
12133
12134
12135 for {
12136 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != math.MinInt16 {
12137 break
12138 }
12139 v.reset(OpConstBool)
12140 v.AuxInt = boolToAuxInt(false)
12141 return true
12142 }
12143
12144
12145 for {
12146 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != math.MaxInt16 {
12147 break
12148 }
12149 v.reset(OpConstBool)
12150 v.AuxInt = boolToAuxInt(false)
12151 return true
12152 }
12153
12154
12155 for {
12156 x := v_0
12157 if v_1.Op != OpConst16 {
12158 break
12159 }
12160 t := v_1.Type
12161 if auxIntToInt16(v_1.AuxInt) != math.MinInt16+1 {
12162 break
12163 }
12164 v.reset(OpEq16)
12165 v0 := b.NewValue0(v.Pos, OpConst16, t)
12166 v0.AuxInt = int16ToAuxInt(math.MinInt16)
12167 v.AddArg2(x, v0)
12168 return true
12169 }
12170
12171
12172 for {
12173 if v_0.Op != OpConst16 {
12174 break
12175 }
12176 t := v_0.Type
12177 if auxIntToInt16(v_0.AuxInt) != math.MaxInt16-1 {
12178 break
12179 }
12180 x := v_1
12181 v.reset(OpEq16)
12182 v0 := b.NewValue0(v.Pos, OpConst16, t)
12183 v0.AuxInt = int16ToAuxInt(math.MaxInt16)
12184 v.AddArg2(x, v0)
12185 return true
12186 }
12187 return false
12188 }
12189 func rewriteValuegeneric_OpLess16U(v *Value) bool {
12190 v_1 := v.Args[1]
12191 v_0 := v.Args[0]
12192 b := v.Block
12193
12194
12195 for {
12196 if v_0.Op != OpConst16 {
12197 break
12198 }
12199 c := auxIntToInt16(v_0.AuxInt)
12200 if v_1.Op != OpConst16 {
12201 break
12202 }
12203 d := auxIntToInt16(v_1.AuxInt)
12204 v.reset(OpConstBool)
12205 v.AuxInt = boolToAuxInt(uint16(c) < uint16(d))
12206 return true
12207 }
12208
12209
12210 for {
12211 x := v_0
12212 if v_1.Op != OpConst16 {
12213 break
12214 }
12215 t := v_1.Type
12216 if auxIntToInt16(v_1.AuxInt) != 1 {
12217 break
12218 }
12219 v.reset(OpEq16)
12220 v0 := b.NewValue0(v.Pos, OpConst16, t)
12221 v0.AuxInt = int16ToAuxInt(0)
12222 v.AddArg2(v0, x)
12223 return true
12224 }
12225
12226
12227 for {
12228 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
12229 break
12230 }
12231 v.reset(OpConstBool)
12232 v.AuxInt = boolToAuxInt(false)
12233 return true
12234 }
12235
12236
12237 for {
12238 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
12239 break
12240 }
12241 v.reset(OpConstBool)
12242 v.AuxInt = boolToAuxInt(false)
12243 return true
12244 }
12245
12246
12247 for {
12248 x := v_0
12249 if v_1.Op != OpConst16 {
12250 break
12251 }
12252 t := v_1.Type
12253 if auxIntToInt16(v_1.AuxInt) != 1 {
12254 break
12255 }
12256 v.reset(OpEq16)
12257 v0 := b.NewValue0(v.Pos, OpConst16, t)
12258 v0.AuxInt = int16ToAuxInt(0)
12259 v.AddArg2(x, v0)
12260 return true
12261 }
12262
12263
12264 for {
12265 if v_0.Op != OpConst16 {
12266 break
12267 }
12268 t := v_0.Type
12269 if auxIntToInt16(v_0.AuxInt) != -2 {
12270 break
12271 }
12272 x := v_1
12273 v.reset(OpEq16)
12274 v0 := b.NewValue0(v.Pos, OpConst16, t)
12275 v0.AuxInt = int16ToAuxInt(-1)
12276 v.AddArg2(x, v0)
12277 return true
12278 }
12279 return false
12280 }
12281 func rewriteValuegeneric_OpLess32(v *Value) bool {
12282 v_1 := v.Args[1]
12283 v_0 := v.Args[0]
12284 b := v.Block
12285
12286
12287 for {
12288 if v_0.Op != OpConst32 {
12289 break
12290 }
12291 c := auxIntToInt32(v_0.AuxInt)
12292 if v_1.Op != OpConst32 {
12293 break
12294 }
12295 d := auxIntToInt32(v_1.AuxInt)
12296 v.reset(OpConstBool)
12297 v.AuxInt = boolToAuxInt(c < d)
12298 return true
12299 }
12300
12301
12302
12303 for {
12304 if v_0.Op != OpConst32 {
12305 break
12306 }
12307 t := v_0.Type
12308 if auxIntToInt32(v_0.AuxInt) != 0 {
12309 break
12310 }
12311 x := v_1
12312 if !(isNonNegative(x)) {
12313 break
12314 }
12315 v.reset(OpNeq32)
12316 v0 := b.NewValue0(v.Pos, OpConst32, t)
12317 v0.AuxInt = int32ToAuxInt(0)
12318 v.AddArg2(v0, x)
12319 return true
12320 }
12321
12322
12323
12324 for {
12325 x := v_0
12326 if v_1.Op != OpConst32 {
12327 break
12328 }
12329 t := v_1.Type
12330 if auxIntToInt32(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
12331 break
12332 }
12333 v.reset(OpEq32)
12334 v0 := b.NewValue0(v.Pos, OpConst32, t)
12335 v0.AuxInt = int32ToAuxInt(0)
12336 v.AddArg2(v0, x)
12337 return true
12338 }
12339
12340
12341 for {
12342 x := v_0
12343 if v_1.Op != OpConst32 {
12344 break
12345 }
12346 t := v_1.Type
12347 if auxIntToInt32(v_1.AuxInt) != 1 {
12348 break
12349 }
12350 v.reset(OpLeq32)
12351 v0 := b.NewValue0(v.Pos, OpConst32, t)
12352 v0.AuxInt = int32ToAuxInt(0)
12353 v.AddArg2(x, v0)
12354 return true
12355 }
12356
12357
12358 for {
12359 if v_0.Op != OpConst32 {
12360 break
12361 }
12362 t := v_0.Type
12363 if auxIntToInt32(v_0.AuxInt) != -1 {
12364 break
12365 }
12366 x := v_1
12367 v.reset(OpLeq32)
12368 v0 := b.NewValue0(v.Pos, OpConst32, t)
12369 v0.AuxInt = int32ToAuxInt(0)
12370 v.AddArg2(v0, x)
12371 return true
12372 }
12373
12374
12375 for {
12376 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != math.MinInt32 {
12377 break
12378 }
12379 v.reset(OpConstBool)
12380 v.AuxInt = boolToAuxInt(false)
12381 return true
12382 }
12383
12384
12385 for {
12386 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != math.MaxInt32 {
12387 break
12388 }
12389 v.reset(OpConstBool)
12390 v.AuxInt = boolToAuxInt(false)
12391 return true
12392 }
12393
12394
12395 for {
12396 x := v_0
12397 if v_1.Op != OpConst32 {
12398 break
12399 }
12400 t := v_1.Type
12401 if auxIntToInt32(v_1.AuxInt) != math.MinInt32+1 {
12402 break
12403 }
12404 v.reset(OpEq32)
12405 v0 := b.NewValue0(v.Pos, OpConst32, t)
12406 v0.AuxInt = int32ToAuxInt(math.MinInt32)
12407 v.AddArg2(x, v0)
12408 return true
12409 }
12410
12411
12412 for {
12413 if v_0.Op != OpConst32 {
12414 break
12415 }
12416 t := v_0.Type
12417 if auxIntToInt32(v_0.AuxInt) != math.MaxInt32-1 {
12418 break
12419 }
12420 x := v_1
12421 v.reset(OpEq32)
12422 v0 := b.NewValue0(v.Pos, OpConst32, t)
12423 v0.AuxInt = int32ToAuxInt(math.MaxInt32)
12424 v.AddArg2(x, v0)
12425 return true
12426 }
12427 return false
12428 }
12429 func rewriteValuegeneric_OpLess32F(v *Value) bool {
12430 v_1 := v.Args[1]
12431 v_0 := v.Args[0]
12432
12433
12434 for {
12435 if v_0.Op != OpConst32F {
12436 break
12437 }
12438 c := auxIntToFloat32(v_0.AuxInt)
12439 if v_1.Op != OpConst32F {
12440 break
12441 }
12442 d := auxIntToFloat32(v_1.AuxInt)
12443 v.reset(OpConstBool)
12444 v.AuxInt = boolToAuxInt(c < d)
12445 return true
12446 }
12447 return false
12448 }
12449 func rewriteValuegeneric_OpLess32U(v *Value) bool {
12450 v_1 := v.Args[1]
12451 v_0 := v.Args[0]
12452 b := v.Block
12453
12454
12455 for {
12456 if v_0.Op != OpConst32 {
12457 break
12458 }
12459 c := auxIntToInt32(v_0.AuxInt)
12460 if v_1.Op != OpConst32 {
12461 break
12462 }
12463 d := auxIntToInt32(v_1.AuxInt)
12464 v.reset(OpConstBool)
12465 v.AuxInt = boolToAuxInt(uint32(c) < uint32(d))
12466 return true
12467 }
12468
12469
12470 for {
12471 x := v_0
12472 if v_1.Op != OpConst32 {
12473 break
12474 }
12475 t := v_1.Type
12476 if auxIntToInt32(v_1.AuxInt) != 1 {
12477 break
12478 }
12479 v.reset(OpEq32)
12480 v0 := b.NewValue0(v.Pos, OpConst32, t)
12481 v0.AuxInt = int32ToAuxInt(0)
12482 v.AddArg2(v0, x)
12483 return true
12484 }
12485
12486
12487 for {
12488 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
12489 break
12490 }
12491 v.reset(OpConstBool)
12492 v.AuxInt = boolToAuxInt(false)
12493 return true
12494 }
12495
12496
12497 for {
12498 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
12499 break
12500 }
12501 v.reset(OpConstBool)
12502 v.AuxInt = boolToAuxInt(false)
12503 return true
12504 }
12505
12506
12507 for {
12508 x := v_0
12509 if v_1.Op != OpConst32 {
12510 break
12511 }
12512 t := v_1.Type
12513 if auxIntToInt32(v_1.AuxInt) != 1 {
12514 break
12515 }
12516 v.reset(OpEq32)
12517 v0 := b.NewValue0(v.Pos, OpConst32, t)
12518 v0.AuxInt = int32ToAuxInt(0)
12519 v.AddArg2(x, v0)
12520 return true
12521 }
12522
12523
12524 for {
12525 if v_0.Op != OpConst32 {
12526 break
12527 }
12528 t := v_0.Type
12529 if auxIntToInt32(v_0.AuxInt) != -2 {
12530 break
12531 }
12532 x := v_1
12533 v.reset(OpEq32)
12534 v0 := b.NewValue0(v.Pos, OpConst32, t)
12535 v0.AuxInt = int32ToAuxInt(-1)
12536 v.AddArg2(x, v0)
12537 return true
12538 }
12539 return false
12540 }
12541 func rewriteValuegeneric_OpLess64(v *Value) bool {
12542 v_1 := v.Args[1]
12543 v_0 := v.Args[0]
12544 b := v.Block
12545
12546
12547 for {
12548 if v_0.Op != OpConst64 {
12549 break
12550 }
12551 c := auxIntToInt64(v_0.AuxInt)
12552 if v_1.Op != OpConst64 {
12553 break
12554 }
12555 d := auxIntToInt64(v_1.AuxInt)
12556 v.reset(OpConstBool)
12557 v.AuxInt = boolToAuxInt(c < d)
12558 return true
12559 }
12560
12561
12562
12563 for {
12564 if v_0.Op != OpConst64 {
12565 break
12566 }
12567 t := v_0.Type
12568 if auxIntToInt64(v_0.AuxInt) != 0 {
12569 break
12570 }
12571 x := v_1
12572 if !(isNonNegative(x)) {
12573 break
12574 }
12575 v.reset(OpNeq64)
12576 v0 := b.NewValue0(v.Pos, OpConst64, t)
12577 v0.AuxInt = int64ToAuxInt(0)
12578 v.AddArg2(v0, x)
12579 return true
12580 }
12581
12582
12583
12584 for {
12585 x := v_0
12586 if v_1.Op != OpConst64 {
12587 break
12588 }
12589 t := v_1.Type
12590 if auxIntToInt64(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
12591 break
12592 }
12593 v.reset(OpEq64)
12594 v0 := b.NewValue0(v.Pos, OpConst64, t)
12595 v0.AuxInt = int64ToAuxInt(0)
12596 v.AddArg2(v0, x)
12597 return true
12598 }
12599
12600
12601 for {
12602 x := v_0
12603 if v_1.Op != OpConst64 {
12604 break
12605 }
12606 t := v_1.Type
12607 if auxIntToInt64(v_1.AuxInt) != 1 {
12608 break
12609 }
12610 v.reset(OpLeq64)
12611 v0 := b.NewValue0(v.Pos, OpConst64, t)
12612 v0.AuxInt = int64ToAuxInt(0)
12613 v.AddArg2(x, v0)
12614 return true
12615 }
12616
12617
12618 for {
12619 if v_0.Op != OpConst64 {
12620 break
12621 }
12622 t := v_0.Type
12623 if auxIntToInt64(v_0.AuxInt) != -1 {
12624 break
12625 }
12626 x := v_1
12627 v.reset(OpLeq64)
12628 v0 := b.NewValue0(v.Pos, OpConst64, t)
12629 v0.AuxInt = int64ToAuxInt(0)
12630 v.AddArg2(v0, x)
12631 return true
12632 }
12633
12634
12635 for {
12636 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != math.MinInt64 {
12637 break
12638 }
12639 v.reset(OpConstBool)
12640 v.AuxInt = boolToAuxInt(false)
12641 return true
12642 }
12643
12644
12645 for {
12646 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != math.MaxInt64 {
12647 break
12648 }
12649 v.reset(OpConstBool)
12650 v.AuxInt = boolToAuxInt(false)
12651 return true
12652 }
12653
12654
12655 for {
12656 x := v_0
12657 if v_1.Op != OpConst64 {
12658 break
12659 }
12660 t := v_1.Type
12661 if auxIntToInt64(v_1.AuxInt) != math.MinInt64+1 {
12662 break
12663 }
12664 v.reset(OpEq64)
12665 v0 := b.NewValue0(v.Pos, OpConst64, t)
12666 v0.AuxInt = int64ToAuxInt(math.MinInt64)
12667 v.AddArg2(x, v0)
12668 return true
12669 }
12670
12671
12672 for {
12673 if v_0.Op != OpConst64 {
12674 break
12675 }
12676 t := v_0.Type
12677 if auxIntToInt64(v_0.AuxInt) != math.MaxInt64-1 {
12678 break
12679 }
12680 x := v_1
12681 v.reset(OpEq64)
12682 v0 := b.NewValue0(v.Pos, OpConst64, t)
12683 v0.AuxInt = int64ToAuxInt(math.MaxInt64)
12684 v.AddArg2(x, v0)
12685 return true
12686 }
12687 return false
12688 }
12689 func rewriteValuegeneric_OpLess64F(v *Value) bool {
12690 v_1 := v.Args[1]
12691 v_0 := v.Args[0]
12692
12693
12694 for {
12695 if v_0.Op != OpConst64F {
12696 break
12697 }
12698 c := auxIntToFloat64(v_0.AuxInt)
12699 if v_1.Op != OpConst64F {
12700 break
12701 }
12702 d := auxIntToFloat64(v_1.AuxInt)
12703 v.reset(OpConstBool)
12704 v.AuxInt = boolToAuxInt(c < d)
12705 return true
12706 }
12707 return false
12708 }
12709 func rewriteValuegeneric_OpLess64U(v *Value) bool {
12710 v_1 := v.Args[1]
12711 v_0 := v.Args[0]
12712 b := v.Block
12713
12714
12715 for {
12716 if v_0.Op != OpConst64 {
12717 break
12718 }
12719 c := auxIntToInt64(v_0.AuxInt)
12720 if v_1.Op != OpConst64 {
12721 break
12722 }
12723 d := auxIntToInt64(v_1.AuxInt)
12724 v.reset(OpConstBool)
12725 v.AuxInt = boolToAuxInt(uint64(c) < uint64(d))
12726 return true
12727 }
12728
12729
12730 for {
12731 x := v_0
12732 if v_1.Op != OpConst64 {
12733 break
12734 }
12735 t := v_1.Type
12736 if auxIntToInt64(v_1.AuxInt) != 1 {
12737 break
12738 }
12739 v.reset(OpEq64)
12740 v0 := b.NewValue0(v.Pos, OpConst64, t)
12741 v0.AuxInt = int64ToAuxInt(0)
12742 v.AddArg2(v0, x)
12743 return true
12744 }
12745
12746
12747 for {
12748 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
12749 break
12750 }
12751 v.reset(OpConstBool)
12752 v.AuxInt = boolToAuxInt(false)
12753 return true
12754 }
12755
12756
12757 for {
12758 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
12759 break
12760 }
12761 v.reset(OpConstBool)
12762 v.AuxInt = boolToAuxInt(false)
12763 return true
12764 }
12765
12766
12767 for {
12768 x := v_0
12769 if v_1.Op != OpConst64 {
12770 break
12771 }
12772 t := v_1.Type
12773 if auxIntToInt64(v_1.AuxInt) != 1 {
12774 break
12775 }
12776 v.reset(OpEq64)
12777 v0 := b.NewValue0(v.Pos, OpConst64, t)
12778 v0.AuxInt = int64ToAuxInt(0)
12779 v.AddArg2(x, v0)
12780 return true
12781 }
12782
12783
12784 for {
12785 if v_0.Op != OpConst64 {
12786 break
12787 }
12788 t := v_0.Type
12789 if auxIntToInt64(v_0.AuxInt) != -2 {
12790 break
12791 }
12792 x := v_1
12793 v.reset(OpEq64)
12794 v0 := b.NewValue0(v.Pos, OpConst64, t)
12795 v0.AuxInt = int64ToAuxInt(-1)
12796 v.AddArg2(x, v0)
12797 return true
12798 }
12799 return false
12800 }
12801 func rewriteValuegeneric_OpLess8(v *Value) bool {
12802 v_1 := v.Args[1]
12803 v_0 := v.Args[0]
12804 b := v.Block
12805
12806
12807 for {
12808 if v_0.Op != OpConst8 {
12809 break
12810 }
12811 c := auxIntToInt8(v_0.AuxInt)
12812 if v_1.Op != OpConst8 {
12813 break
12814 }
12815 d := auxIntToInt8(v_1.AuxInt)
12816 v.reset(OpConstBool)
12817 v.AuxInt = boolToAuxInt(c < d)
12818 return true
12819 }
12820
12821
12822
12823 for {
12824 if v_0.Op != OpConst8 {
12825 break
12826 }
12827 t := v_0.Type
12828 if auxIntToInt8(v_0.AuxInt) != 0 {
12829 break
12830 }
12831 x := v_1
12832 if !(isNonNegative(x)) {
12833 break
12834 }
12835 v.reset(OpNeq8)
12836 v0 := b.NewValue0(v.Pos, OpConst8, t)
12837 v0.AuxInt = int8ToAuxInt(0)
12838 v.AddArg2(v0, x)
12839 return true
12840 }
12841
12842
12843
12844 for {
12845 x := v_0
12846 if v_1.Op != OpConst8 {
12847 break
12848 }
12849 t := v_1.Type
12850 if auxIntToInt8(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
12851 break
12852 }
12853 v.reset(OpEq8)
12854 v0 := b.NewValue0(v.Pos, OpConst8, t)
12855 v0.AuxInt = int8ToAuxInt(0)
12856 v.AddArg2(v0, x)
12857 return true
12858 }
12859
12860
12861 for {
12862 x := v_0
12863 if v_1.Op != OpConst8 {
12864 break
12865 }
12866 t := v_1.Type
12867 if auxIntToInt8(v_1.AuxInt) != 1 {
12868 break
12869 }
12870 v.reset(OpLeq8)
12871 v0 := b.NewValue0(v.Pos, OpConst8, t)
12872 v0.AuxInt = int8ToAuxInt(0)
12873 v.AddArg2(x, v0)
12874 return true
12875 }
12876
12877
12878 for {
12879 if v_0.Op != OpConst8 {
12880 break
12881 }
12882 t := v_0.Type
12883 if auxIntToInt8(v_0.AuxInt) != -1 {
12884 break
12885 }
12886 x := v_1
12887 v.reset(OpLeq8)
12888 v0 := b.NewValue0(v.Pos, OpConst8, t)
12889 v0.AuxInt = int8ToAuxInt(0)
12890 v.AddArg2(v0, x)
12891 return true
12892 }
12893
12894
12895 for {
12896 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != math.MinInt8 {
12897 break
12898 }
12899 v.reset(OpConstBool)
12900 v.AuxInt = boolToAuxInt(false)
12901 return true
12902 }
12903
12904
12905 for {
12906 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != math.MaxInt8 {
12907 break
12908 }
12909 v.reset(OpConstBool)
12910 v.AuxInt = boolToAuxInt(false)
12911 return true
12912 }
12913
12914
12915 for {
12916 x := v_0
12917 if v_1.Op != OpConst8 {
12918 break
12919 }
12920 t := v_1.Type
12921 if auxIntToInt8(v_1.AuxInt) != math.MinInt8+1 {
12922 break
12923 }
12924 v.reset(OpEq8)
12925 v0 := b.NewValue0(v.Pos, OpConst8, t)
12926 v0.AuxInt = int8ToAuxInt(math.MinInt8)
12927 v.AddArg2(x, v0)
12928 return true
12929 }
12930
12931
12932 for {
12933 if v_0.Op != OpConst8 {
12934 break
12935 }
12936 t := v_0.Type
12937 if auxIntToInt8(v_0.AuxInt) != math.MaxInt8-1 {
12938 break
12939 }
12940 x := v_1
12941 v.reset(OpEq8)
12942 v0 := b.NewValue0(v.Pos, OpConst8, t)
12943 v0.AuxInt = int8ToAuxInt(math.MaxInt8)
12944 v.AddArg2(x, v0)
12945 return true
12946 }
12947 return false
12948 }
12949 func rewriteValuegeneric_OpLess8U(v *Value) bool {
12950 v_1 := v.Args[1]
12951 v_0 := v.Args[0]
12952 b := v.Block
12953
12954
12955 for {
12956 if v_0.Op != OpConst8 {
12957 break
12958 }
12959 c := auxIntToInt8(v_0.AuxInt)
12960 if v_1.Op != OpConst8 {
12961 break
12962 }
12963 d := auxIntToInt8(v_1.AuxInt)
12964 v.reset(OpConstBool)
12965 v.AuxInt = boolToAuxInt(uint8(c) < uint8(d))
12966 return true
12967 }
12968
12969
12970 for {
12971 x := v_0
12972 if v_1.Op != OpConst8 {
12973 break
12974 }
12975 t := v_1.Type
12976 if auxIntToInt8(v_1.AuxInt) != 1 {
12977 break
12978 }
12979 v.reset(OpEq8)
12980 v0 := b.NewValue0(v.Pos, OpConst8, t)
12981 v0.AuxInt = int8ToAuxInt(0)
12982 v.AddArg2(v0, x)
12983 return true
12984 }
12985
12986
12987 for {
12988 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
12989 break
12990 }
12991 v.reset(OpConstBool)
12992 v.AuxInt = boolToAuxInt(false)
12993 return true
12994 }
12995
12996
12997 for {
12998 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
12999 break
13000 }
13001 v.reset(OpConstBool)
13002 v.AuxInt = boolToAuxInt(false)
13003 return true
13004 }
13005
13006
13007 for {
13008 x := v_0
13009 if v_1.Op != OpConst8 {
13010 break
13011 }
13012 t := v_1.Type
13013 if auxIntToInt8(v_1.AuxInt) != 1 {
13014 break
13015 }
13016 v.reset(OpEq8)
13017 v0 := b.NewValue0(v.Pos, OpConst8, t)
13018 v0.AuxInt = int8ToAuxInt(0)
13019 v.AddArg2(x, v0)
13020 return true
13021 }
13022
13023
13024 for {
13025 if v_0.Op != OpConst8 {
13026 break
13027 }
13028 t := v_0.Type
13029 if auxIntToInt8(v_0.AuxInt) != -2 {
13030 break
13031 }
13032 x := v_1
13033 v.reset(OpEq8)
13034 v0 := b.NewValue0(v.Pos, OpConst8, t)
13035 v0.AuxInt = int8ToAuxInt(-1)
13036 v.AddArg2(x, v0)
13037 return true
13038 }
13039 return false
13040 }
13041 func rewriteValuegeneric_OpLoad(v *Value) bool {
13042 v_1 := v.Args[1]
13043 v_0 := v.Args[0]
13044 b := v.Block
13045 config := b.Func.Config
13046 typ := &b.Func.Config.Types
13047
13048
13049
13050 for {
13051 t1 := v.Type
13052 p1 := v_0
13053 if v_1.Op != OpStore {
13054 break
13055 }
13056 t2 := auxToType(v_1.Aux)
13057 x := v_1.Args[1]
13058 p2 := v_1.Args[0]
13059 if !(isSamePtr(p1, p2) && copyCompatibleType(t1, x.Type) && t1.Size() == t2.Size()) {
13060 break
13061 }
13062 v.copyOf(x)
13063 return true
13064 }
13065
13066
13067
13068 for {
13069 t1 := v.Type
13070 p1 := v_0
13071 if v_1.Op != OpStore {
13072 break
13073 }
13074 t2 := auxToType(v_1.Aux)
13075 _ = v_1.Args[2]
13076 p2 := v_1.Args[0]
13077 v_1_2 := v_1.Args[2]
13078 if v_1_2.Op != OpStore {
13079 break
13080 }
13081 t3 := auxToType(v_1_2.Aux)
13082 x := v_1_2.Args[1]
13083 p3 := v_1_2.Args[0]
13084 if !(isSamePtr(p1, p3) && copyCompatibleType(t1, x.Type) && t1.Size() == t3.Size() && disjoint(p3, t3.Size(), p2, t2.Size())) {
13085 break
13086 }
13087 v.copyOf(x)
13088 return true
13089 }
13090
13091
13092
13093 for {
13094 t1 := v.Type
13095 p1 := v_0
13096 if v_1.Op != OpStore {
13097 break
13098 }
13099 t2 := auxToType(v_1.Aux)
13100 _ = v_1.Args[2]
13101 p2 := v_1.Args[0]
13102 v_1_2 := v_1.Args[2]
13103 if v_1_2.Op != OpStore {
13104 break
13105 }
13106 t3 := auxToType(v_1_2.Aux)
13107 _ = v_1_2.Args[2]
13108 p3 := v_1_2.Args[0]
13109 v_1_2_2 := v_1_2.Args[2]
13110 if v_1_2_2.Op != OpStore {
13111 break
13112 }
13113 t4 := auxToType(v_1_2_2.Aux)
13114 x := v_1_2_2.Args[1]
13115 p4 := v_1_2_2.Args[0]
13116 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())) {
13117 break
13118 }
13119 v.copyOf(x)
13120 return true
13121 }
13122
13123
13124
13125 for {
13126 t1 := v.Type
13127 p1 := v_0
13128 if v_1.Op != OpStore {
13129 break
13130 }
13131 t2 := auxToType(v_1.Aux)
13132 _ = v_1.Args[2]
13133 p2 := v_1.Args[0]
13134 v_1_2 := v_1.Args[2]
13135 if v_1_2.Op != OpStore {
13136 break
13137 }
13138 t3 := auxToType(v_1_2.Aux)
13139 _ = v_1_2.Args[2]
13140 p3 := v_1_2.Args[0]
13141 v_1_2_2 := v_1_2.Args[2]
13142 if v_1_2_2.Op != OpStore {
13143 break
13144 }
13145 t4 := auxToType(v_1_2_2.Aux)
13146 _ = v_1_2_2.Args[2]
13147 p4 := v_1_2_2.Args[0]
13148 v_1_2_2_2 := v_1_2_2.Args[2]
13149 if v_1_2_2_2.Op != OpStore {
13150 break
13151 }
13152 t5 := auxToType(v_1_2_2_2.Aux)
13153 x := v_1_2_2_2.Args[1]
13154 p5 := v_1_2_2_2.Args[0]
13155 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())) {
13156 break
13157 }
13158 v.copyOf(x)
13159 return true
13160 }
13161
13162
13163
13164 for {
13165 t1 := v.Type
13166 op := v_0
13167 if op.Op != OpOffPtr {
13168 break
13169 }
13170 o1 := auxIntToInt64(op.AuxInt)
13171 p1 := op.Args[0]
13172 move := v_1
13173 if move.Op != OpMove {
13174 break
13175 }
13176 n := auxIntToInt64(move.AuxInt)
13177 mem := move.Args[2]
13178 p2 := move.Args[0]
13179 src := move.Args[1]
13180 if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p2) && !isVolatile(src)) {
13181 break
13182 }
13183 b = move.Block
13184 v0 := b.NewValue0(v.Pos, OpLoad, t1)
13185 v.copyOf(v0)
13186 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
13187 v1.AuxInt = int64ToAuxInt(o1)
13188 v1.AddArg(src)
13189 v0.AddArg2(v1, mem)
13190 return true
13191 }
13192
13193
13194
13195 for {
13196 t1 := v.Type
13197 p1 := v_0
13198 if v_1.Op != OpStore {
13199 break
13200 }
13201 t2 := auxToType(v_1.Aux)
13202 _ = v_1.Args[1]
13203 p2 := v_1.Args[0]
13204 v_1_1 := v_1.Args[1]
13205 if v_1_1.Op != OpConst64 {
13206 break
13207 }
13208 x := auxIntToInt64(v_1_1.AuxInt)
13209 if !(isSamePtr(p1, p2) && t2.Size() == 8 && is64BitFloat(t1) && !math.IsNaN(math.Float64frombits(uint64(x)))) {
13210 break
13211 }
13212 v.reset(OpConst64F)
13213 v.AuxInt = float64ToAuxInt(math.Float64frombits(uint64(x)))
13214 return true
13215 }
13216
13217
13218
13219 for {
13220 t1 := v.Type
13221 p1 := v_0
13222 if v_1.Op != OpStore {
13223 break
13224 }
13225 t2 := auxToType(v_1.Aux)
13226 _ = v_1.Args[1]
13227 p2 := v_1.Args[0]
13228 v_1_1 := v_1.Args[1]
13229 if v_1_1.Op != OpConst32 {
13230 break
13231 }
13232 x := auxIntToInt32(v_1_1.AuxInt)
13233 if !(isSamePtr(p1, p2) && t2.Size() == 4 && is32BitFloat(t1) && !math.IsNaN(float64(math.Float32frombits(uint32(x))))) {
13234 break
13235 }
13236 v.reset(OpConst32F)
13237 v.AuxInt = float32ToAuxInt(math.Float32frombits(uint32(x)))
13238 return true
13239 }
13240
13241
13242
13243 for {
13244 t1 := v.Type
13245 p1 := v_0
13246 if v_1.Op != OpStore {
13247 break
13248 }
13249 t2 := auxToType(v_1.Aux)
13250 _ = v_1.Args[1]
13251 p2 := v_1.Args[0]
13252 v_1_1 := v_1.Args[1]
13253 if v_1_1.Op != OpConst64F {
13254 break
13255 }
13256 x := auxIntToFloat64(v_1_1.AuxInt)
13257 if !(isSamePtr(p1, p2) && t2.Size() == 8 && is64BitInt(t1)) {
13258 break
13259 }
13260 v.reset(OpConst64)
13261 v.AuxInt = int64ToAuxInt(int64(math.Float64bits(x)))
13262 return true
13263 }
13264
13265
13266
13267 for {
13268 t1 := v.Type
13269 p1 := v_0
13270 if v_1.Op != OpStore {
13271 break
13272 }
13273 t2 := auxToType(v_1.Aux)
13274 _ = v_1.Args[1]
13275 p2 := v_1.Args[0]
13276 v_1_1 := v_1.Args[1]
13277 if v_1_1.Op != OpConst32F {
13278 break
13279 }
13280 x := auxIntToFloat32(v_1_1.AuxInt)
13281 if !(isSamePtr(p1, p2) && t2.Size() == 4 && is32BitInt(t1)) {
13282 break
13283 }
13284 v.reset(OpConst32)
13285 v.AuxInt = int32ToAuxInt(int32(math.Float32bits(x)))
13286 return true
13287 }
13288
13289
13290
13291 for {
13292 t1 := v.Type
13293 op := v_0
13294 if op.Op != OpOffPtr {
13295 break
13296 }
13297 o1 := auxIntToInt64(op.AuxInt)
13298 p1 := op.Args[0]
13299 if v_1.Op != OpStore {
13300 break
13301 }
13302 t2 := auxToType(v_1.Aux)
13303 _ = v_1.Args[2]
13304 p2 := v_1.Args[0]
13305 mem := v_1.Args[2]
13306 if mem.Op != OpZero {
13307 break
13308 }
13309 n := auxIntToInt64(mem.AuxInt)
13310 p3 := mem.Args[0]
13311 if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p3) && CanSSA(t1) && disjoint(op, t1.Size(), p2, t2.Size())) {
13312 break
13313 }
13314 b = mem.Block
13315 v0 := b.NewValue0(v.Pos, OpLoad, t1)
13316 v.copyOf(v0)
13317 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
13318 v1.AuxInt = int64ToAuxInt(o1)
13319 v1.AddArg(p3)
13320 v0.AddArg2(v1, mem)
13321 return true
13322 }
13323
13324
13325
13326 for {
13327 t1 := v.Type
13328 op := v_0
13329 if op.Op != OpOffPtr {
13330 break
13331 }
13332 o1 := auxIntToInt64(op.AuxInt)
13333 p1 := op.Args[0]
13334 if v_1.Op != OpStore {
13335 break
13336 }
13337 t2 := auxToType(v_1.Aux)
13338 _ = v_1.Args[2]
13339 p2 := v_1.Args[0]
13340 v_1_2 := v_1.Args[2]
13341 if v_1_2.Op != OpStore {
13342 break
13343 }
13344 t3 := auxToType(v_1_2.Aux)
13345 _ = v_1_2.Args[2]
13346 p3 := v_1_2.Args[0]
13347 mem := v_1_2.Args[2]
13348 if mem.Op != OpZero {
13349 break
13350 }
13351 n := auxIntToInt64(mem.AuxInt)
13352 p4 := mem.Args[0]
13353 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())) {
13354 break
13355 }
13356 b = mem.Block
13357 v0 := b.NewValue0(v.Pos, OpLoad, t1)
13358 v.copyOf(v0)
13359 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
13360 v1.AuxInt = int64ToAuxInt(o1)
13361 v1.AddArg(p4)
13362 v0.AddArg2(v1, mem)
13363 return true
13364 }
13365
13366
13367
13368 for {
13369 t1 := v.Type
13370 op := v_0
13371 if op.Op != OpOffPtr {
13372 break
13373 }
13374 o1 := auxIntToInt64(op.AuxInt)
13375 p1 := op.Args[0]
13376 if v_1.Op != OpStore {
13377 break
13378 }
13379 t2 := auxToType(v_1.Aux)
13380 _ = v_1.Args[2]
13381 p2 := v_1.Args[0]
13382 v_1_2 := v_1.Args[2]
13383 if v_1_2.Op != OpStore {
13384 break
13385 }
13386 t3 := auxToType(v_1_2.Aux)
13387 _ = v_1_2.Args[2]
13388 p3 := v_1_2.Args[0]
13389 v_1_2_2 := v_1_2.Args[2]
13390 if v_1_2_2.Op != OpStore {
13391 break
13392 }
13393 t4 := auxToType(v_1_2_2.Aux)
13394 _ = v_1_2_2.Args[2]
13395 p4 := v_1_2_2.Args[0]
13396 mem := v_1_2_2.Args[2]
13397 if mem.Op != OpZero {
13398 break
13399 }
13400 n := auxIntToInt64(mem.AuxInt)
13401 p5 := mem.Args[0]
13402 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())) {
13403 break
13404 }
13405 b = mem.Block
13406 v0 := b.NewValue0(v.Pos, OpLoad, t1)
13407 v.copyOf(v0)
13408 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
13409 v1.AuxInt = int64ToAuxInt(o1)
13410 v1.AddArg(p5)
13411 v0.AddArg2(v1, mem)
13412 return true
13413 }
13414
13415
13416
13417 for {
13418 t1 := v.Type
13419 op := v_0
13420 if op.Op != OpOffPtr {
13421 break
13422 }
13423 o1 := auxIntToInt64(op.AuxInt)
13424 p1 := op.Args[0]
13425 if v_1.Op != OpStore {
13426 break
13427 }
13428 t2 := auxToType(v_1.Aux)
13429 _ = v_1.Args[2]
13430 p2 := v_1.Args[0]
13431 v_1_2 := v_1.Args[2]
13432 if v_1_2.Op != OpStore {
13433 break
13434 }
13435 t3 := auxToType(v_1_2.Aux)
13436 _ = v_1_2.Args[2]
13437 p3 := v_1_2.Args[0]
13438 v_1_2_2 := v_1_2.Args[2]
13439 if v_1_2_2.Op != OpStore {
13440 break
13441 }
13442 t4 := auxToType(v_1_2_2.Aux)
13443 _ = v_1_2_2.Args[2]
13444 p4 := v_1_2_2.Args[0]
13445 v_1_2_2_2 := v_1_2_2.Args[2]
13446 if v_1_2_2_2.Op != OpStore {
13447 break
13448 }
13449 t5 := auxToType(v_1_2_2_2.Aux)
13450 _ = v_1_2_2_2.Args[2]
13451 p5 := v_1_2_2_2.Args[0]
13452 mem := v_1_2_2_2.Args[2]
13453 if mem.Op != OpZero {
13454 break
13455 }
13456 n := auxIntToInt64(mem.AuxInt)
13457 p6 := mem.Args[0]
13458 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())) {
13459 break
13460 }
13461 b = mem.Block
13462 v0 := b.NewValue0(v.Pos, OpLoad, t1)
13463 v.copyOf(v0)
13464 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
13465 v1.AuxInt = int64ToAuxInt(o1)
13466 v1.AddArg(p6)
13467 v0.AddArg2(v1, mem)
13468 return true
13469 }
13470
13471
13472
13473 for {
13474 t1 := v.Type
13475 if v_0.Op != OpOffPtr {
13476 break
13477 }
13478 o := auxIntToInt64(v_0.AuxInt)
13479 p1 := v_0.Args[0]
13480 if v_1.Op != OpZero {
13481 break
13482 }
13483 n := auxIntToInt64(v_1.AuxInt)
13484 p2 := v_1.Args[0]
13485 if !(t1.IsBoolean() && isSamePtr(p1, p2) && n >= o+1) {
13486 break
13487 }
13488 v.reset(OpConstBool)
13489 v.AuxInt = boolToAuxInt(false)
13490 return true
13491 }
13492
13493
13494
13495 for {
13496 t1 := v.Type
13497 if v_0.Op != OpOffPtr {
13498 break
13499 }
13500 o := auxIntToInt64(v_0.AuxInt)
13501 p1 := v_0.Args[0]
13502 if v_1.Op != OpZero {
13503 break
13504 }
13505 n := auxIntToInt64(v_1.AuxInt)
13506 p2 := v_1.Args[0]
13507 if !(is8BitInt(t1) && isSamePtr(p1, p2) && n >= o+1) {
13508 break
13509 }
13510 v.reset(OpConst8)
13511 v.AuxInt = int8ToAuxInt(0)
13512 return true
13513 }
13514
13515
13516
13517 for {
13518 t1 := v.Type
13519 if v_0.Op != OpOffPtr {
13520 break
13521 }
13522 o := auxIntToInt64(v_0.AuxInt)
13523 p1 := v_0.Args[0]
13524 if v_1.Op != OpZero {
13525 break
13526 }
13527 n := auxIntToInt64(v_1.AuxInt)
13528 p2 := v_1.Args[0]
13529 if !(is16BitInt(t1) && isSamePtr(p1, p2) && n >= o+2) {
13530 break
13531 }
13532 v.reset(OpConst16)
13533 v.AuxInt = int16ToAuxInt(0)
13534 return true
13535 }
13536
13537
13538
13539 for {
13540 t1 := v.Type
13541 if v_0.Op != OpOffPtr {
13542 break
13543 }
13544 o := auxIntToInt64(v_0.AuxInt)
13545 p1 := v_0.Args[0]
13546 if v_1.Op != OpZero {
13547 break
13548 }
13549 n := auxIntToInt64(v_1.AuxInt)
13550 p2 := v_1.Args[0]
13551 if !(is32BitInt(t1) && isSamePtr(p1, p2) && n >= o+4) {
13552 break
13553 }
13554 v.reset(OpConst32)
13555 v.AuxInt = int32ToAuxInt(0)
13556 return true
13557 }
13558
13559
13560
13561 for {
13562 t1 := v.Type
13563 if v_0.Op != OpOffPtr {
13564 break
13565 }
13566 o := auxIntToInt64(v_0.AuxInt)
13567 p1 := v_0.Args[0]
13568 if v_1.Op != OpZero {
13569 break
13570 }
13571 n := auxIntToInt64(v_1.AuxInt)
13572 p2 := v_1.Args[0]
13573 if !(is64BitInt(t1) && isSamePtr(p1, p2) && n >= o+8) {
13574 break
13575 }
13576 v.reset(OpConst64)
13577 v.AuxInt = int64ToAuxInt(0)
13578 return true
13579 }
13580
13581
13582
13583 for {
13584 t1 := v.Type
13585 if v_0.Op != OpOffPtr {
13586 break
13587 }
13588 o := auxIntToInt64(v_0.AuxInt)
13589 p1 := v_0.Args[0]
13590 if v_1.Op != OpZero {
13591 break
13592 }
13593 n := auxIntToInt64(v_1.AuxInt)
13594 p2 := v_1.Args[0]
13595 if !(is32BitFloat(t1) && isSamePtr(p1, p2) && n >= o+4) {
13596 break
13597 }
13598 v.reset(OpConst32F)
13599 v.AuxInt = float32ToAuxInt(0)
13600 return true
13601 }
13602
13603
13604
13605 for {
13606 t1 := v.Type
13607 if v_0.Op != OpOffPtr {
13608 break
13609 }
13610 o := auxIntToInt64(v_0.AuxInt)
13611 p1 := v_0.Args[0]
13612 if v_1.Op != OpZero {
13613 break
13614 }
13615 n := auxIntToInt64(v_1.AuxInt)
13616 p2 := v_1.Args[0]
13617 if !(is64BitFloat(t1) && isSamePtr(p1, p2) && n >= o+8) {
13618 break
13619 }
13620 v.reset(OpConst64F)
13621 v.AuxInt = float64ToAuxInt(0)
13622 return true
13623 }
13624
13625
13626
13627 for {
13628 t := v.Type
13629 if !(t.IsStruct() && t.Size() > 0 && CanSSA(t) && !t.IsSIMD()) {
13630 break
13631 }
13632 v.copyOf(rewriteStructLoad(v))
13633 return true
13634 }
13635
13636
13637
13638 for {
13639 t := v.Type
13640 ptr := v_0
13641 mem := v_1
13642 if !(t.IsArray() && t.NumElem() == 1 && CanSSA(t)) {
13643 break
13644 }
13645 v.reset(OpArrayMake1)
13646 v0 := b.NewValue0(v.Pos, OpLoad, t.Elem())
13647 v0.AddArg2(ptr, mem)
13648 v.AddArg(v0)
13649 return true
13650 }
13651
13652
13653
13654 for {
13655 t := v.Type
13656 if !(t.Size() == 0) {
13657 break
13658 }
13659 v.reset(OpEmpty)
13660 return true
13661 }
13662
13663
13664
13665 for {
13666 if v.Type != typ.Int8 {
13667 break
13668 }
13669 sptr := v_0
13670 if sptr.Op != OpAddr {
13671 break
13672 }
13673 scon := auxToSym(sptr.Aux)
13674 sptr_0 := sptr.Args[0]
13675 if sptr_0.Op != OpSB {
13676 break
13677 }
13678 if !(symIsRO(scon)) {
13679 break
13680 }
13681 v.reset(OpConst8)
13682 v.Type = typ.Int8
13683 v.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
13684 return true
13685 }
13686
13687
13688
13689 for {
13690 if v.Type != typ.Int16 {
13691 break
13692 }
13693 sptr := v_0
13694 if sptr.Op != OpAddr {
13695 break
13696 }
13697 scon := auxToSym(sptr.Aux)
13698 sptr_0 := sptr.Args[0]
13699 if sptr_0.Op != OpSB {
13700 break
13701 }
13702 if !(symIsRO(scon)) {
13703 break
13704 }
13705 v.reset(OpConst16)
13706 v.Type = typ.Int16
13707 v.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
13708 return true
13709 }
13710
13711
13712
13713 for {
13714 if v.Type != typ.Int32 {
13715 break
13716 }
13717 sptr := v_0
13718 if sptr.Op != OpAddr {
13719 break
13720 }
13721 scon := auxToSym(sptr.Aux)
13722 sptr_0 := sptr.Args[0]
13723 if sptr_0.Op != OpSB {
13724 break
13725 }
13726 if !(symIsRO(scon)) {
13727 break
13728 }
13729 v.reset(OpConst32)
13730 v.Type = typ.Int32
13731 v.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
13732 return true
13733 }
13734
13735
13736
13737 for {
13738 if v.Type != typ.Int64 {
13739 break
13740 }
13741 sptr := v_0
13742 if sptr.Op != OpAddr {
13743 break
13744 }
13745 scon := auxToSym(sptr.Aux)
13746 sptr_0 := sptr.Args[0]
13747 if sptr_0.Op != OpSB {
13748 break
13749 }
13750 if !(symIsRO(scon)) {
13751 break
13752 }
13753 v.reset(OpConst64)
13754 v.Type = typ.Int64
13755 v.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
13756 return true
13757 }
13758
13759
13760
13761 for {
13762 if v_0.Op != OpAddr {
13763 break
13764 }
13765 s := auxToSym(v_0.Aux)
13766 sb := v_0.Args[0]
13767 if !(isFixedLoad(v, s, 0)) {
13768 break
13769 }
13770 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
13771 return true
13772 }
13773
13774
13775
13776 for {
13777 if v_0.Op != OpConvert {
13778 break
13779 }
13780 v_0_0 := v_0.Args[0]
13781 if v_0_0.Op != OpAddr {
13782 break
13783 }
13784 s := auxToSym(v_0_0.Aux)
13785 sb := v_0_0.Args[0]
13786 if !(isFixedLoad(v, s, 0)) {
13787 break
13788 }
13789 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
13790 return true
13791 }
13792
13793
13794
13795 for {
13796 if v_0.Op != OpITab {
13797 break
13798 }
13799 v_0_0 := v_0.Args[0]
13800 if v_0_0.Op != OpIMake {
13801 break
13802 }
13803 v_0_0_0 := v_0_0.Args[0]
13804 if v_0_0_0.Op != OpAddr {
13805 break
13806 }
13807 s := auxToSym(v_0_0_0.Aux)
13808 sb := v_0_0_0.Args[0]
13809 if !(isFixedLoad(v, s, 0)) {
13810 break
13811 }
13812 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
13813 return true
13814 }
13815
13816
13817
13818 for {
13819 if v_0.Op != OpITab {
13820 break
13821 }
13822 v_0_0 := v_0.Args[0]
13823 if v_0_0.Op != OpIMake {
13824 break
13825 }
13826 v_0_0_0 := v_0_0.Args[0]
13827 if v_0_0_0.Op != OpConvert {
13828 break
13829 }
13830 v_0_0_0_0 := v_0_0_0.Args[0]
13831 if v_0_0_0_0.Op != OpAddr {
13832 break
13833 }
13834 s := auxToSym(v_0_0_0_0.Aux)
13835 sb := v_0_0_0_0.Args[0]
13836 if !(isFixedLoad(v, s, 0)) {
13837 break
13838 }
13839 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
13840 return true
13841 }
13842
13843
13844
13845 for {
13846 if v_0.Op != OpOffPtr {
13847 break
13848 }
13849 off := auxIntToInt64(v_0.AuxInt)
13850 v_0_0 := v_0.Args[0]
13851 if v_0_0.Op != OpAddr {
13852 break
13853 }
13854 s := auxToSym(v_0_0.Aux)
13855 sb := v_0_0.Args[0]
13856 if !(isFixedLoad(v, s, off)) {
13857 break
13858 }
13859 v.copyOf(rewriteFixedLoad(v, s, sb, off))
13860 return true
13861 }
13862
13863
13864
13865 for {
13866 if v_0.Op != OpOffPtr {
13867 break
13868 }
13869 off := auxIntToInt64(v_0.AuxInt)
13870 v_0_0 := v_0.Args[0]
13871 if v_0_0.Op != OpConvert {
13872 break
13873 }
13874 v_0_0_0 := v_0_0.Args[0]
13875 if v_0_0_0.Op != OpAddr {
13876 break
13877 }
13878 s := auxToSym(v_0_0_0.Aux)
13879 sb := v_0_0_0.Args[0]
13880 if !(isFixedLoad(v, s, off)) {
13881 break
13882 }
13883 v.copyOf(rewriteFixedLoad(v, s, sb, off))
13884 return true
13885 }
13886
13887
13888
13889 for {
13890 if v_0.Op != OpOffPtr {
13891 break
13892 }
13893 off := auxIntToInt64(v_0.AuxInt)
13894 v_0_0 := v_0.Args[0]
13895 if v_0_0.Op != OpITab {
13896 break
13897 }
13898 v_0_0_0 := v_0_0.Args[0]
13899 if v_0_0_0.Op != OpIMake {
13900 break
13901 }
13902 v_0_0_0_0 := v_0_0_0.Args[0]
13903 if v_0_0_0_0.Op != OpAddr {
13904 break
13905 }
13906 s := auxToSym(v_0_0_0_0.Aux)
13907 sb := v_0_0_0_0.Args[0]
13908 if !(isFixedLoad(v, s, off)) {
13909 break
13910 }
13911 v.copyOf(rewriteFixedLoad(v, s, sb, off))
13912 return true
13913 }
13914
13915
13916
13917 for {
13918 if v_0.Op != OpOffPtr {
13919 break
13920 }
13921 off := auxIntToInt64(v_0.AuxInt)
13922 v_0_0 := v_0.Args[0]
13923 if v_0_0.Op != OpITab {
13924 break
13925 }
13926 v_0_0_0 := v_0_0.Args[0]
13927 if v_0_0_0.Op != OpIMake {
13928 break
13929 }
13930 v_0_0_0_0 := v_0_0_0.Args[0]
13931 if v_0_0_0_0.Op != OpConvert {
13932 break
13933 }
13934 v_0_0_0_0_0 := v_0_0_0_0.Args[0]
13935 if v_0_0_0_0_0.Op != OpAddr {
13936 break
13937 }
13938 s := auxToSym(v_0_0_0_0_0.Aux)
13939 sb := v_0_0_0_0_0.Args[0]
13940 if !(isFixedLoad(v, s, off)) {
13941 break
13942 }
13943 v.copyOf(rewriteFixedLoad(v, s, sb, off))
13944 return true
13945 }
13946 return false
13947 }
13948 func rewriteValuegeneric_OpLsh16x16(v *Value) bool {
13949 v_1 := v.Args[1]
13950 v_0 := v.Args[0]
13951 b := v.Block
13952
13953
13954 for {
13955 t := v.Type
13956 x := v_0
13957 if v_1.Op != OpConst16 {
13958 break
13959 }
13960 c := auxIntToInt16(v_1.AuxInt)
13961 v.reset(OpLsh16x64)
13962 v0 := b.NewValue0(v.Pos, OpConst64, t)
13963 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
13964 v.AddArg2(x, v0)
13965 return true
13966 }
13967
13968
13969 for {
13970 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
13971 break
13972 }
13973 v.reset(OpConst16)
13974 v.AuxInt = int16ToAuxInt(0)
13975 return true
13976 }
13977
13978
13979
13980 for {
13981 if auxIntToBool(v.AuxInt) != false {
13982 break
13983 }
13984 x := v_0
13985 con := v_1
13986 if con.Op != OpConst16 {
13987 break
13988 }
13989 c := auxIntToInt16(con.AuxInt)
13990 if !(0 < c && c < 16) {
13991 break
13992 }
13993 v.reset(OpLsh16x16)
13994 v.AuxInt = boolToAuxInt(true)
13995 v.AddArg2(x, con)
13996 return true
13997 }
13998 return false
13999 }
14000 func rewriteValuegeneric_OpLsh16x32(v *Value) bool {
14001 v_1 := v.Args[1]
14002 v_0 := v.Args[0]
14003 b := v.Block
14004
14005
14006 for {
14007 t := v.Type
14008 x := v_0
14009 if v_1.Op != OpConst32 {
14010 break
14011 }
14012 c := auxIntToInt32(v_1.AuxInt)
14013 v.reset(OpLsh16x64)
14014 v0 := b.NewValue0(v.Pos, OpConst64, t)
14015 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
14016 v.AddArg2(x, v0)
14017 return true
14018 }
14019
14020
14021 for {
14022 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
14023 break
14024 }
14025 v.reset(OpConst16)
14026 v.AuxInt = int16ToAuxInt(0)
14027 return true
14028 }
14029
14030
14031
14032 for {
14033 if auxIntToBool(v.AuxInt) != false {
14034 break
14035 }
14036 x := v_0
14037 con := v_1
14038 if con.Op != OpConst32 {
14039 break
14040 }
14041 c := auxIntToInt32(con.AuxInt)
14042 if !(0 < c && c < 16) {
14043 break
14044 }
14045 v.reset(OpLsh16x32)
14046 v.AuxInt = boolToAuxInt(true)
14047 v.AddArg2(x, con)
14048 return true
14049 }
14050 return false
14051 }
14052 func rewriteValuegeneric_OpLsh16x64(v *Value) bool {
14053 v_1 := v.Args[1]
14054 v_0 := v.Args[0]
14055 b := v.Block
14056 typ := &b.Func.Config.Types
14057
14058
14059 for {
14060 if v_0.Op != OpConst16 {
14061 break
14062 }
14063 c := auxIntToInt16(v_0.AuxInt)
14064 if v_1.Op != OpConst64 {
14065 break
14066 }
14067 d := auxIntToInt64(v_1.AuxInt)
14068 v.reset(OpConst16)
14069 v.AuxInt = int16ToAuxInt(c << uint64(d))
14070 return true
14071 }
14072
14073
14074 for {
14075 x := v_0
14076 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
14077 break
14078 }
14079 v.copyOf(x)
14080 return true
14081 }
14082
14083
14084 for {
14085 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
14086 break
14087 }
14088 v.reset(OpConst16)
14089 v.AuxInt = int16ToAuxInt(0)
14090 return true
14091 }
14092
14093
14094
14095 for {
14096 if v_1.Op != OpConst64 {
14097 break
14098 }
14099 c := auxIntToInt64(v_1.AuxInt)
14100 if !(uint64(c) >= 16) {
14101 break
14102 }
14103 v.reset(OpConst16)
14104 v.AuxInt = int16ToAuxInt(0)
14105 return true
14106 }
14107
14108
14109
14110 for {
14111 t := v.Type
14112 if v_0.Op != OpLsh16x64 {
14113 break
14114 }
14115 _ = v_0.Args[1]
14116 x := v_0.Args[0]
14117 v_0_1 := v_0.Args[1]
14118 if v_0_1.Op != OpConst64 {
14119 break
14120 }
14121 c := auxIntToInt64(v_0_1.AuxInt)
14122 if v_1.Op != OpConst64 {
14123 break
14124 }
14125 d := auxIntToInt64(v_1.AuxInt)
14126 if !(!uaddOvf(c, d)) {
14127 break
14128 }
14129 v.reset(OpLsh16x64)
14130 v0 := b.NewValue0(v.Pos, OpConst64, t)
14131 v0.AuxInt = int64ToAuxInt(c + d)
14132 v.AddArg2(x, v0)
14133 return true
14134 }
14135
14136
14137
14138 for {
14139 i := v_0
14140 if i.Op != OpRsh16x64 {
14141 break
14142 }
14143 _ = i.Args[1]
14144 x := i.Args[0]
14145 i_1 := i.Args[1]
14146 if i_1.Op != OpConst64 {
14147 break
14148 }
14149 c := auxIntToInt64(i_1.AuxInt)
14150 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
14151 break
14152 }
14153 v.reset(OpAnd16)
14154 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
14155 v0.AuxInt = int16ToAuxInt(int16(-1) << c)
14156 v.AddArg2(x, v0)
14157 return true
14158 }
14159
14160
14161
14162 for {
14163 i := v_0
14164 if i.Op != OpRsh16Ux64 {
14165 break
14166 }
14167 _ = i.Args[1]
14168 x := i.Args[0]
14169 i_1 := i.Args[1]
14170 if i_1.Op != OpConst64 {
14171 break
14172 }
14173 c := auxIntToInt64(i_1.AuxInt)
14174 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
14175 break
14176 }
14177 v.reset(OpAnd16)
14178 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
14179 v0.AuxInt = int16ToAuxInt(int16(-1) << c)
14180 v.AddArg2(x, v0)
14181 return true
14182 }
14183
14184
14185
14186 for {
14187 if v_0.Op != OpRsh16Ux64 {
14188 break
14189 }
14190 _ = v_0.Args[1]
14191 v_0_0 := v_0.Args[0]
14192 if v_0_0.Op != OpLsh16x64 {
14193 break
14194 }
14195 _ = v_0_0.Args[1]
14196 x := v_0_0.Args[0]
14197 v_0_0_1 := v_0_0.Args[1]
14198 if v_0_0_1.Op != OpConst64 {
14199 break
14200 }
14201 c1 := auxIntToInt64(v_0_0_1.AuxInt)
14202 v_0_1 := v_0.Args[1]
14203 if v_0_1.Op != OpConst64 {
14204 break
14205 }
14206 c2 := auxIntToInt64(v_0_1.AuxInt)
14207 if v_1.Op != OpConst64 {
14208 break
14209 }
14210 c3 := auxIntToInt64(v_1.AuxInt)
14211 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
14212 break
14213 }
14214 v.reset(OpLsh16x64)
14215 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
14216 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
14217 v.AddArg2(x, v0)
14218 return true
14219 }
14220
14221
14222
14223 for {
14224 if v_0.Op != OpAnd16 {
14225 break
14226 }
14227 _ = v_0.Args[1]
14228 v_0_0 := v_0.Args[0]
14229 v_0_1 := v_0.Args[1]
14230 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14231 if v_0_0.Op != OpRsh16x64 {
14232 continue
14233 }
14234 t := v_0_0.Type
14235 _ = v_0_0.Args[1]
14236 x := v_0_0.Args[0]
14237 v_0_0_1 := v_0_0.Args[1]
14238 if v_0_0_1.Op != OpConst64 {
14239 continue
14240 }
14241 t2 := v_0_0_1.Type
14242 c := auxIntToInt64(v_0_0_1.AuxInt)
14243 if v_0_1.Op != OpConst16 {
14244 continue
14245 }
14246 d := auxIntToInt16(v_0_1.AuxInt)
14247 if v_1.Op != OpConst64 {
14248 continue
14249 }
14250 e := auxIntToInt64(v_1.AuxInt)
14251 if !(c >= e) {
14252 continue
14253 }
14254 v.reset(OpAnd16)
14255 v0 := b.NewValue0(v.Pos, OpRsh16x64, t)
14256 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14257 v1.AuxInt = int64ToAuxInt(c - e)
14258 v0.AddArg2(x, v1)
14259 v2 := b.NewValue0(v.Pos, OpConst16, t)
14260 v2.AuxInt = int16ToAuxInt(d << e)
14261 v.AddArg2(v0, v2)
14262 return true
14263 }
14264 break
14265 }
14266
14267
14268
14269 for {
14270 if v_0.Op != OpAnd16 {
14271 break
14272 }
14273 _ = v_0.Args[1]
14274 v_0_0 := v_0.Args[0]
14275 v_0_1 := v_0.Args[1]
14276 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14277 if v_0_0.Op != OpRsh16Ux64 {
14278 continue
14279 }
14280 t := v_0_0.Type
14281 _ = v_0_0.Args[1]
14282 x := v_0_0.Args[0]
14283 v_0_0_1 := v_0_0.Args[1]
14284 if v_0_0_1.Op != OpConst64 {
14285 continue
14286 }
14287 t2 := v_0_0_1.Type
14288 c := auxIntToInt64(v_0_0_1.AuxInt)
14289 if v_0_1.Op != OpConst16 {
14290 continue
14291 }
14292 d := auxIntToInt16(v_0_1.AuxInt)
14293 if v_1.Op != OpConst64 {
14294 continue
14295 }
14296 e := auxIntToInt64(v_1.AuxInt)
14297 if !(c >= e) {
14298 continue
14299 }
14300 v.reset(OpAnd16)
14301 v0 := b.NewValue0(v.Pos, OpRsh16Ux64, t)
14302 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14303 v1.AuxInt = int64ToAuxInt(c - e)
14304 v0.AddArg2(x, v1)
14305 v2 := b.NewValue0(v.Pos, OpConst16, t)
14306 v2.AuxInt = int16ToAuxInt(d << e)
14307 v.AddArg2(v0, v2)
14308 return true
14309 }
14310 break
14311 }
14312
14313
14314
14315 for {
14316 if v_0.Op != OpAnd16 {
14317 break
14318 }
14319 _ = v_0.Args[1]
14320 v_0_0 := v_0.Args[0]
14321 v_0_1 := v_0.Args[1]
14322 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14323 if v_0_0.Op != OpRsh16x64 {
14324 continue
14325 }
14326 t := v_0_0.Type
14327 _ = v_0_0.Args[1]
14328 x := v_0_0.Args[0]
14329 v_0_0_1 := v_0_0.Args[1]
14330 if v_0_0_1.Op != OpConst64 {
14331 continue
14332 }
14333 t2 := v_0_0_1.Type
14334 c := auxIntToInt64(v_0_0_1.AuxInt)
14335 if v_0_1.Op != OpConst16 {
14336 continue
14337 }
14338 d := auxIntToInt16(v_0_1.AuxInt)
14339 if v_1.Op != OpConst64 {
14340 continue
14341 }
14342 e := auxIntToInt64(v_1.AuxInt)
14343 if !(c < e) {
14344 continue
14345 }
14346 v.reset(OpAnd16)
14347 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
14348 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14349 v1.AuxInt = int64ToAuxInt(e - c)
14350 v0.AddArg2(x, v1)
14351 v2 := b.NewValue0(v.Pos, OpConst16, t)
14352 v2.AuxInt = int16ToAuxInt(d << e)
14353 v.AddArg2(v0, v2)
14354 return true
14355 }
14356 break
14357 }
14358
14359
14360
14361 for {
14362 if v_0.Op != OpAnd16 {
14363 break
14364 }
14365 _ = v_0.Args[1]
14366 v_0_0 := v_0.Args[0]
14367 v_0_1 := v_0.Args[1]
14368 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14369 if v_0_0.Op != OpRsh16Ux64 {
14370 continue
14371 }
14372 t := v_0_0.Type
14373 _ = v_0_0.Args[1]
14374 x := v_0_0.Args[0]
14375 v_0_0_1 := v_0_0.Args[1]
14376 if v_0_0_1.Op != OpConst64 {
14377 continue
14378 }
14379 t2 := v_0_0_1.Type
14380 c := auxIntToInt64(v_0_0_1.AuxInt)
14381 if v_0_1.Op != OpConst16 {
14382 continue
14383 }
14384 d := auxIntToInt16(v_0_1.AuxInt)
14385 if v_1.Op != OpConst64 {
14386 continue
14387 }
14388 e := auxIntToInt64(v_1.AuxInt)
14389 if !(c < e) {
14390 continue
14391 }
14392 v.reset(OpAnd16)
14393 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
14394 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14395 v1.AuxInt = int64ToAuxInt(e - c)
14396 v0.AddArg2(x, v1)
14397 v2 := b.NewValue0(v.Pos, OpConst16, t)
14398 v2.AuxInt = int16ToAuxInt(d << e)
14399 v.AddArg2(v0, v2)
14400 return true
14401 }
14402 break
14403 }
14404
14405
14406
14407 for {
14408 if auxIntToBool(v.AuxInt) != false {
14409 break
14410 }
14411 x := v_0
14412 con := v_1
14413 if con.Op != OpConst64 {
14414 break
14415 }
14416 c := auxIntToInt64(con.AuxInt)
14417 if !(0 < c && c < 16) {
14418 break
14419 }
14420 v.reset(OpLsh16x64)
14421 v.AuxInt = boolToAuxInt(true)
14422 v.AddArg2(x, con)
14423 return true
14424 }
14425 return false
14426 }
14427 func rewriteValuegeneric_OpLsh16x8(v *Value) bool {
14428 v_1 := v.Args[1]
14429 v_0 := v.Args[0]
14430 b := v.Block
14431
14432
14433 for {
14434 t := v.Type
14435 x := v_0
14436 if v_1.Op != OpConst8 {
14437 break
14438 }
14439 c := auxIntToInt8(v_1.AuxInt)
14440 v.reset(OpLsh16x64)
14441 v0 := b.NewValue0(v.Pos, OpConst64, t)
14442 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
14443 v.AddArg2(x, v0)
14444 return true
14445 }
14446
14447
14448 for {
14449 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
14450 break
14451 }
14452 v.reset(OpConst16)
14453 v.AuxInt = int16ToAuxInt(0)
14454 return true
14455 }
14456
14457
14458
14459 for {
14460 if auxIntToBool(v.AuxInt) != false {
14461 break
14462 }
14463 x := v_0
14464 con := v_1
14465 if con.Op != OpConst8 {
14466 break
14467 }
14468 c := auxIntToInt8(con.AuxInt)
14469 if !(0 < c && c < 16) {
14470 break
14471 }
14472 v.reset(OpLsh16x8)
14473 v.AuxInt = boolToAuxInt(true)
14474 v.AddArg2(x, con)
14475 return true
14476 }
14477 return false
14478 }
14479 func rewriteValuegeneric_OpLsh32x16(v *Value) bool {
14480 v_1 := v.Args[1]
14481 v_0 := v.Args[0]
14482 b := v.Block
14483
14484
14485 for {
14486 t := v.Type
14487 x := v_0
14488 if v_1.Op != OpConst16 {
14489 break
14490 }
14491 c := auxIntToInt16(v_1.AuxInt)
14492 v.reset(OpLsh32x64)
14493 v0 := b.NewValue0(v.Pos, OpConst64, t)
14494 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
14495 v.AddArg2(x, v0)
14496 return true
14497 }
14498
14499
14500 for {
14501 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
14502 break
14503 }
14504 v.reset(OpConst32)
14505 v.AuxInt = int32ToAuxInt(0)
14506 return true
14507 }
14508
14509
14510
14511 for {
14512 if auxIntToBool(v.AuxInt) != false {
14513 break
14514 }
14515 x := v_0
14516 con := v_1
14517 if con.Op != OpConst16 {
14518 break
14519 }
14520 c := auxIntToInt16(con.AuxInt)
14521 if !(0 < c && c < 32) {
14522 break
14523 }
14524 v.reset(OpLsh32x16)
14525 v.AuxInt = boolToAuxInt(true)
14526 v.AddArg2(x, con)
14527 return true
14528 }
14529 return false
14530 }
14531 func rewriteValuegeneric_OpLsh32x32(v *Value) bool {
14532 v_1 := v.Args[1]
14533 v_0 := v.Args[0]
14534 b := v.Block
14535
14536
14537 for {
14538 t := v.Type
14539 x := v_0
14540 if v_1.Op != OpConst32 {
14541 break
14542 }
14543 c := auxIntToInt32(v_1.AuxInt)
14544 v.reset(OpLsh32x64)
14545 v0 := b.NewValue0(v.Pos, OpConst64, t)
14546 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
14547 v.AddArg2(x, v0)
14548 return true
14549 }
14550
14551
14552 for {
14553 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
14554 break
14555 }
14556 v.reset(OpConst32)
14557 v.AuxInt = int32ToAuxInt(0)
14558 return true
14559 }
14560
14561
14562
14563 for {
14564 if auxIntToBool(v.AuxInt) != false {
14565 break
14566 }
14567 x := v_0
14568 con := v_1
14569 if con.Op != OpConst32 {
14570 break
14571 }
14572 c := auxIntToInt32(con.AuxInt)
14573 if !(0 < c && c < 32) {
14574 break
14575 }
14576 v.reset(OpLsh32x32)
14577 v.AuxInt = boolToAuxInt(true)
14578 v.AddArg2(x, con)
14579 return true
14580 }
14581 return false
14582 }
14583 func rewriteValuegeneric_OpLsh32x64(v *Value) bool {
14584 v_1 := v.Args[1]
14585 v_0 := v.Args[0]
14586 b := v.Block
14587 typ := &b.Func.Config.Types
14588
14589
14590 for {
14591 if v_0.Op != OpConst32 {
14592 break
14593 }
14594 c := auxIntToInt32(v_0.AuxInt)
14595 if v_1.Op != OpConst64 {
14596 break
14597 }
14598 d := auxIntToInt64(v_1.AuxInt)
14599 v.reset(OpConst32)
14600 v.AuxInt = int32ToAuxInt(c << uint64(d))
14601 return true
14602 }
14603
14604
14605 for {
14606 x := v_0
14607 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
14608 break
14609 }
14610 v.copyOf(x)
14611 return true
14612 }
14613
14614
14615 for {
14616 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
14617 break
14618 }
14619 v.reset(OpConst32)
14620 v.AuxInt = int32ToAuxInt(0)
14621 return true
14622 }
14623
14624
14625
14626 for {
14627 if v_1.Op != OpConst64 {
14628 break
14629 }
14630 c := auxIntToInt64(v_1.AuxInt)
14631 if !(uint64(c) >= 32) {
14632 break
14633 }
14634 v.reset(OpConst32)
14635 v.AuxInt = int32ToAuxInt(0)
14636 return true
14637 }
14638
14639
14640
14641 for {
14642 t := v.Type
14643 if v_0.Op != OpLsh32x64 {
14644 break
14645 }
14646 _ = v_0.Args[1]
14647 x := v_0.Args[0]
14648 v_0_1 := v_0.Args[1]
14649 if v_0_1.Op != OpConst64 {
14650 break
14651 }
14652 c := auxIntToInt64(v_0_1.AuxInt)
14653 if v_1.Op != OpConst64 {
14654 break
14655 }
14656 d := auxIntToInt64(v_1.AuxInt)
14657 if !(!uaddOvf(c, d)) {
14658 break
14659 }
14660 v.reset(OpLsh32x64)
14661 v0 := b.NewValue0(v.Pos, OpConst64, t)
14662 v0.AuxInt = int64ToAuxInt(c + d)
14663 v.AddArg2(x, v0)
14664 return true
14665 }
14666
14667
14668
14669 for {
14670 i := v_0
14671 if i.Op != OpRsh32x64 {
14672 break
14673 }
14674 _ = i.Args[1]
14675 x := i.Args[0]
14676 i_1 := i.Args[1]
14677 if i_1.Op != OpConst64 {
14678 break
14679 }
14680 c := auxIntToInt64(i_1.AuxInt)
14681 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
14682 break
14683 }
14684 v.reset(OpAnd32)
14685 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
14686 v0.AuxInt = int32ToAuxInt(int32(-1) << c)
14687 v.AddArg2(x, v0)
14688 return true
14689 }
14690
14691
14692
14693 for {
14694 i := v_0
14695 if i.Op != OpRsh32Ux64 {
14696 break
14697 }
14698 _ = i.Args[1]
14699 x := i.Args[0]
14700 i_1 := i.Args[1]
14701 if i_1.Op != OpConst64 {
14702 break
14703 }
14704 c := auxIntToInt64(i_1.AuxInt)
14705 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
14706 break
14707 }
14708 v.reset(OpAnd32)
14709 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
14710 v0.AuxInt = int32ToAuxInt(int32(-1) << c)
14711 v.AddArg2(x, v0)
14712 return true
14713 }
14714
14715
14716
14717 for {
14718 if v_0.Op != OpRsh32Ux64 {
14719 break
14720 }
14721 _ = v_0.Args[1]
14722 v_0_0 := v_0.Args[0]
14723 if v_0_0.Op != OpLsh32x64 {
14724 break
14725 }
14726 _ = v_0_0.Args[1]
14727 x := v_0_0.Args[0]
14728 v_0_0_1 := v_0_0.Args[1]
14729 if v_0_0_1.Op != OpConst64 {
14730 break
14731 }
14732 c1 := auxIntToInt64(v_0_0_1.AuxInt)
14733 v_0_1 := v_0.Args[1]
14734 if v_0_1.Op != OpConst64 {
14735 break
14736 }
14737 c2 := auxIntToInt64(v_0_1.AuxInt)
14738 if v_1.Op != OpConst64 {
14739 break
14740 }
14741 c3 := auxIntToInt64(v_1.AuxInt)
14742 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
14743 break
14744 }
14745 v.reset(OpLsh32x64)
14746 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
14747 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
14748 v.AddArg2(x, v0)
14749 return true
14750 }
14751
14752
14753
14754 for {
14755 if v_0.Op != OpAnd32 {
14756 break
14757 }
14758 _ = v_0.Args[1]
14759 v_0_0 := v_0.Args[0]
14760 v_0_1 := v_0.Args[1]
14761 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14762 if v_0_0.Op != OpRsh32x64 {
14763 continue
14764 }
14765 t := v_0_0.Type
14766 _ = v_0_0.Args[1]
14767 x := v_0_0.Args[0]
14768 v_0_0_1 := v_0_0.Args[1]
14769 if v_0_0_1.Op != OpConst64 {
14770 continue
14771 }
14772 t2 := v_0_0_1.Type
14773 c := auxIntToInt64(v_0_0_1.AuxInt)
14774 if v_0_1.Op != OpConst32 {
14775 continue
14776 }
14777 d := auxIntToInt32(v_0_1.AuxInt)
14778 if v_1.Op != OpConst64 {
14779 continue
14780 }
14781 e := auxIntToInt64(v_1.AuxInt)
14782 if !(c >= e) {
14783 continue
14784 }
14785 v.reset(OpAnd32)
14786 v0 := b.NewValue0(v.Pos, OpRsh32x64, t)
14787 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14788 v1.AuxInt = int64ToAuxInt(c - e)
14789 v0.AddArg2(x, v1)
14790 v2 := b.NewValue0(v.Pos, OpConst32, t)
14791 v2.AuxInt = int32ToAuxInt(d << e)
14792 v.AddArg2(v0, v2)
14793 return true
14794 }
14795 break
14796 }
14797
14798
14799
14800 for {
14801 if v_0.Op != OpAnd32 {
14802 break
14803 }
14804 _ = v_0.Args[1]
14805 v_0_0 := v_0.Args[0]
14806 v_0_1 := v_0.Args[1]
14807 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14808 if v_0_0.Op != OpRsh32Ux64 {
14809 continue
14810 }
14811 t := v_0_0.Type
14812 _ = v_0_0.Args[1]
14813 x := v_0_0.Args[0]
14814 v_0_0_1 := v_0_0.Args[1]
14815 if v_0_0_1.Op != OpConst64 {
14816 continue
14817 }
14818 t2 := v_0_0_1.Type
14819 c := auxIntToInt64(v_0_0_1.AuxInt)
14820 if v_0_1.Op != OpConst32 {
14821 continue
14822 }
14823 d := auxIntToInt32(v_0_1.AuxInt)
14824 if v_1.Op != OpConst64 {
14825 continue
14826 }
14827 e := auxIntToInt64(v_1.AuxInt)
14828 if !(c >= e) {
14829 continue
14830 }
14831 v.reset(OpAnd32)
14832 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, t)
14833 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14834 v1.AuxInt = int64ToAuxInt(c - e)
14835 v0.AddArg2(x, v1)
14836 v2 := b.NewValue0(v.Pos, OpConst32, t)
14837 v2.AuxInt = int32ToAuxInt(d << e)
14838 v.AddArg2(v0, v2)
14839 return true
14840 }
14841 break
14842 }
14843
14844
14845
14846 for {
14847 if v_0.Op != OpAnd32 {
14848 break
14849 }
14850 _ = v_0.Args[1]
14851 v_0_0 := v_0.Args[0]
14852 v_0_1 := v_0.Args[1]
14853 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14854 if v_0_0.Op != OpRsh32x64 {
14855 continue
14856 }
14857 t := v_0_0.Type
14858 _ = v_0_0.Args[1]
14859 x := v_0_0.Args[0]
14860 v_0_0_1 := v_0_0.Args[1]
14861 if v_0_0_1.Op != OpConst64 {
14862 continue
14863 }
14864 t2 := v_0_0_1.Type
14865 c := auxIntToInt64(v_0_0_1.AuxInt)
14866 if v_0_1.Op != OpConst32 {
14867 continue
14868 }
14869 d := auxIntToInt32(v_0_1.AuxInt)
14870 if v_1.Op != OpConst64 {
14871 continue
14872 }
14873 e := auxIntToInt64(v_1.AuxInt)
14874 if !(c < e) {
14875 continue
14876 }
14877 v.reset(OpAnd32)
14878 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
14879 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14880 v1.AuxInt = int64ToAuxInt(e - c)
14881 v0.AddArg2(x, v1)
14882 v2 := b.NewValue0(v.Pos, OpConst32, t)
14883 v2.AuxInt = int32ToAuxInt(d << e)
14884 v.AddArg2(v0, v2)
14885 return true
14886 }
14887 break
14888 }
14889
14890
14891
14892 for {
14893 if v_0.Op != OpAnd32 {
14894 break
14895 }
14896 _ = v_0.Args[1]
14897 v_0_0 := v_0.Args[0]
14898 v_0_1 := v_0.Args[1]
14899 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14900 if v_0_0.Op != OpRsh32Ux64 {
14901 continue
14902 }
14903 t := v_0_0.Type
14904 _ = v_0_0.Args[1]
14905 x := v_0_0.Args[0]
14906 v_0_0_1 := v_0_0.Args[1]
14907 if v_0_0_1.Op != OpConst64 {
14908 continue
14909 }
14910 t2 := v_0_0_1.Type
14911 c := auxIntToInt64(v_0_0_1.AuxInt)
14912 if v_0_1.Op != OpConst32 {
14913 continue
14914 }
14915 d := auxIntToInt32(v_0_1.AuxInt)
14916 if v_1.Op != OpConst64 {
14917 continue
14918 }
14919 e := auxIntToInt64(v_1.AuxInt)
14920 if !(c < e) {
14921 continue
14922 }
14923 v.reset(OpAnd32)
14924 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
14925 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14926 v1.AuxInt = int64ToAuxInt(e - c)
14927 v0.AddArg2(x, v1)
14928 v2 := b.NewValue0(v.Pos, OpConst32, t)
14929 v2.AuxInt = int32ToAuxInt(d << e)
14930 v.AddArg2(v0, v2)
14931 return true
14932 }
14933 break
14934 }
14935
14936
14937
14938 for {
14939 if auxIntToBool(v.AuxInt) != false {
14940 break
14941 }
14942 x := v_0
14943 con := v_1
14944 if con.Op != OpConst64 {
14945 break
14946 }
14947 c := auxIntToInt64(con.AuxInt)
14948 if !(0 < c && c < 32) {
14949 break
14950 }
14951 v.reset(OpLsh32x64)
14952 v.AuxInt = boolToAuxInt(true)
14953 v.AddArg2(x, con)
14954 return true
14955 }
14956 return false
14957 }
14958 func rewriteValuegeneric_OpLsh32x8(v *Value) bool {
14959 v_1 := v.Args[1]
14960 v_0 := v.Args[0]
14961 b := v.Block
14962
14963
14964 for {
14965 t := v.Type
14966 x := v_0
14967 if v_1.Op != OpConst8 {
14968 break
14969 }
14970 c := auxIntToInt8(v_1.AuxInt)
14971 v.reset(OpLsh32x64)
14972 v0 := b.NewValue0(v.Pos, OpConst64, t)
14973 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
14974 v.AddArg2(x, v0)
14975 return true
14976 }
14977
14978
14979 for {
14980 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
14981 break
14982 }
14983 v.reset(OpConst32)
14984 v.AuxInt = int32ToAuxInt(0)
14985 return true
14986 }
14987
14988
14989
14990 for {
14991 if auxIntToBool(v.AuxInt) != false {
14992 break
14993 }
14994 x := v_0
14995 con := v_1
14996 if con.Op != OpConst8 {
14997 break
14998 }
14999 c := auxIntToInt8(con.AuxInt)
15000 if !(0 < c && c < 32) {
15001 break
15002 }
15003 v.reset(OpLsh32x8)
15004 v.AuxInt = boolToAuxInt(true)
15005 v.AddArg2(x, con)
15006 return true
15007 }
15008 return false
15009 }
15010 func rewriteValuegeneric_OpLsh64x16(v *Value) bool {
15011 v_1 := v.Args[1]
15012 v_0 := v.Args[0]
15013 b := v.Block
15014
15015
15016 for {
15017 t := v.Type
15018 x := v_0
15019 if v_1.Op != OpConst16 {
15020 break
15021 }
15022 c := auxIntToInt16(v_1.AuxInt)
15023 v.reset(OpLsh64x64)
15024 v0 := b.NewValue0(v.Pos, OpConst64, t)
15025 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
15026 v.AddArg2(x, v0)
15027 return true
15028 }
15029
15030
15031 for {
15032 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
15033 break
15034 }
15035 v.reset(OpConst64)
15036 v.AuxInt = int64ToAuxInt(0)
15037 return true
15038 }
15039
15040
15041
15042 for {
15043 if auxIntToBool(v.AuxInt) != false {
15044 break
15045 }
15046 x := v_0
15047 con := v_1
15048 if con.Op != OpConst16 {
15049 break
15050 }
15051 c := auxIntToInt16(con.AuxInt)
15052 if !(0 < c && c < 64) {
15053 break
15054 }
15055 v.reset(OpLsh64x16)
15056 v.AuxInt = boolToAuxInt(true)
15057 v.AddArg2(x, con)
15058 return true
15059 }
15060 return false
15061 }
15062 func rewriteValuegeneric_OpLsh64x32(v *Value) bool {
15063 v_1 := v.Args[1]
15064 v_0 := v.Args[0]
15065 b := v.Block
15066
15067
15068 for {
15069 t := v.Type
15070 x := v_0
15071 if v_1.Op != OpConst32 {
15072 break
15073 }
15074 c := auxIntToInt32(v_1.AuxInt)
15075 v.reset(OpLsh64x64)
15076 v0 := b.NewValue0(v.Pos, OpConst64, t)
15077 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
15078 v.AddArg2(x, v0)
15079 return true
15080 }
15081
15082
15083 for {
15084 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
15085 break
15086 }
15087 v.reset(OpConst64)
15088 v.AuxInt = int64ToAuxInt(0)
15089 return true
15090 }
15091
15092
15093
15094 for {
15095 if auxIntToBool(v.AuxInt) != false {
15096 break
15097 }
15098 x := v_0
15099 con := v_1
15100 if con.Op != OpConst32 {
15101 break
15102 }
15103 c := auxIntToInt32(con.AuxInt)
15104 if !(0 < c && c < 64) {
15105 break
15106 }
15107 v.reset(OpLsh64x32)
15108 v.AuxInt = boolToAuxInt(true)
15109 v.AddArg2(x, con)
15110 return true
15111 }
15112 return false
15113 }
15114 func rewriteValuegeneric_OpLsh64x64(v *Value) bool {
15115 v_1 := v.Args[1]
15116 v_0 := v.Args[0]
15117 b := v.Block
15118 typ := &b.Func.Config.Types
15119
15120
15121 for {
15122 if v_0.Op != OpConst64 {
15123 break
15124 }
15125 c := auxIntToInt64(v_0.AuxInt)
15126 if v_1.Op != OpConst64 {
15127 break
15128 }
15129 d := auxIntToInt64(v_1.AuxInt)
15130 v.reset(OpConst64)
15131 v.AuxInt = int64ToAuxInt(c << uint64(d))
15132 return true
15133 }
15134
15135
15136 for {
15137 x := v_0
15138 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
15139 break
15140 }
15141 v.copyOf(x)
15142 return true
15143 }
15144
15145
15146 for {
15147 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
15148 break
15149 }
15150 v.reset(OpConst64)
15151 v.AuxInt = int64ToAuxInt(0)
15152 return true
15153 }
15154
15155
15156
15157 for {
15158 if v_1.Op != OpConst64 {
15159 break
15160 }
15161 c := auxIntToInt64(v_1.AuxInt)
15162 if !(uint64(c) >= 64) {
15163 break
15164 }
15165 v.reset(OpConst64)
15166 v.AuxInt = int64ToAuxInt(0)
15167 return true
15168 }
15169
15170
15171
15172 for {
15173 t := v.Type
15174 if v_0.Op != OpLsh64x64 {
15175 break
15176 }
15177 _ = v_0.Args[1]
15178 x := v_0.Args[0]
15179 v_0_1 := v_0.Args[1]
15180 if v_0_1.Op != OpConst64 {
15181 break
15182 }
15183 c := auxIntToInt64(v_0_1.AuxInt)
15184 if v_1.Op != OpConst64 {
15185 break
15186 }
15187 d := auxIntToInt64(v_1.AuxInt)
15188 if !(!uaddOvf(c, d)) {
15189 break
15190 }
15191 v.reset(OpLsh64x64)
15192 v0 := b.NewValue0(v.Pos, OpConst64, t)
15193 v0.AuxInt = int64ToAuxInt(c + d)
15194 v.AddArg2(x, v0)
15195 return true
15196 }
15197
15198
15199
15200 for {
15201 i := v_0
15202 if i.Op != OpRsh64x64 {
15203 break
15204 }
15205 _ = i.Args[1]
15206 x := i.Args[0]
15207 i_1 := i.Args[1]
15208 if i_1.Op != OpConst64 {
15209 break
15210 }
15211 c := auxIntToInt64(i_1.AuxInt)
15212 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
15213 break
15214 }
15215 v.reset(OpAnd64)
15216 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
15217 v0.AuxInt = int64ToAuxInt(int64(-1) << c)
15218 v.AddArg2(x, v0)
15219 return true
15220 }
15221
15222
15223
15224 for {
15225 i := v_0
15226 if i.Op != OpRsh64Ux64 {
15227 break
15228 }
15229 _ = i.Args[1]
15230 x := i.Args[0]
15231 i_1 := i.Args[1]
15232 if i_1.Op != OpConst64 {
15233 break
15234 }
15235 c := auxIntToInt64(i_1.AuxInt)
15236 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
15237 break
15238 }
15239 v.reset(OpAnd64)
15240 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
15241 v0.AuxInt = int64ToAuxInt(int64(-1) << c)
15242 v.AddArg2(x, v0)
15243 return true
15244 }
15245
15246
15247
15248 for {
15249 if v_0.Op != OpRsh64Ux64 {
15250 break
15251 }
15252 _ = v_0.Args[1]
15253 v_0_0 := v_0.Args[0]
15254 if v_0_0.Op != OpLsh64x64 {
15255 break
15256 }
15257 _ = v_0_0.Args[1]
15258 x := v_0_0.Args[0]
15259 v_0_0_1 := v_0_0.Args[1]
15260 if v_0_0_1.Op != OpConst64 {
15261 break
15262 }
15263 c1 := auxIntToInt64(v_0_0_1.AuxInt)
15264 v_0_1 := v_0.Args[1]
15265 if v_0_1.Op != OpConst64 {
15266 break
15267 }
15268 c2 := auxIntToInt64(v_0_1.AuxInt)
15269 if v_1.Op != OpConst64 {
15270 break
15271 }
15272 c3 := auxIntToInt64(v_1.AuxInt)
15273 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
15274 break
15275 }
15276 v.reset(OpLsh64x64)
15277 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
15278 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
15279 v.AddArg2(x, v0)
15280 return true
15281 }
15282
15283
15284
15285 for {
15286 if v_0.Op != OpAnd64 {
15287 break
15288 }
15289 _ = v_0.Args[1]
15290 v_0_0 := v_0.Args[0]
15291 v_0_1 := v_0.Args[1]
15292 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15293 if v_0_0.Op != OpRsh64x64 {
15294 continue
15295 }
15296 t := v_0_0.Type
15297 _ = v_0_0.Args[1]
15298 x := v_0_0.Args[0]
15299 v_0_0_1 := v_0_0.Args[1]
15300 if v_0_0_1.Op != OpConst64 {
15301 continue
15302 }
15303 t2 := v_0_0_1.Type
15304 c := auxIntToInt64(v_0_0_1.AuxInt)
15305 if v_0_1.Op != OpConst64 {
15306 continue
15307 }
15308 d := auxIntToInt64(v_0_1.AuxInt)
15309 if v_1.Op != OpConst64 {
15310 continue
15311 }
15312 e := auxIntToInt64(v_1.AuxInt)
15313 if !(c >= e) {
15314 continue
15315 }
15316 v.reset(OpAnd64)
15317 v0 := b.NewValue0(v.Pos, OpRsh64x64, t)
15318 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15319 v1.AuxInt = int64ToAuxInt(c - e)
15320 v0.AddArg2(x, v1)
15321 v2 := b.NewValue0(v.Pos, OpConst64, t)
15322 v2.AuxInt = int64ToAuxInt(d << e)
15323 v.AddArg2(v0, v2)
15324 return true
15325 }
15326 break
15327 }
15328
15329
15330
15331 for {
15332 if v_0.Op != OpAnd64 {
15333 break
15334 }
15335 _ = v_0.Args[1]
15336 v_0_0 := v_0.Args[0]
15337 v_0_1 := v_0.Args[1]
15338 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15339 if v_0_0.Op != OpRsh64Ux64 {
15340 continue
15341 }
15342 t := v_0_0.Type
15343 _ = v_0_0.Args[1]
15344 x := v_0_0.Args[0]
15345 v_0_0_1 := v_0_0.Args[1]
15346 if v_0_0_1.Op != OpConst64 {
15347 continue
15348 }
15349 t2 := v_0_0_1.Type
15350 c := auxIntToInt64(v_0_0_1.AuxInt)
15351 if v_0_1.Op != OpConst64 {
15352 continue
15353 }
15354 d := auxIntToInt64(v_0_1.AuxInt)
15355 if v_1.Op != OpConst64 {
15356 continue
15357 }
15358 e := auxIntToInt64(v_1.AuxInt)
15359 if !(c >= e) {
15360 continue
15361 }
15362 v.reset(OpAnd64)
15363 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t)
15364 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15365 v1.AuxInt = int64ToAuxInt(c - e)
15366 v0.AddArg2(x, v1)
15367 v2 := b.NewValue0(v.Pos, OpConst64, t)
15368 v2.AuxInt = int64ToAuxInt(d << e)
15369 v.AddArg2(v0, v2)
15370 return true
15371 }
15372 break
15373 }
15374
15375
15376
15377 for {
15378 if v_0.Op != OpAnd64 {
15379 break
15380 }
15381 _ = v_0.Args[1]
15382 v_0_0 := v_0.Args[0]
15383 v_0_1 := v_0.Args[1]
15384 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15385 if v_0_0.Op != OpRsh64x64 {
15386 continue
15387 }
15388 t := v_0_0.Type
15389 _ = v_0_0.Args[1]
15390 x := v_0_0.Args[0]
15391 v_0_0_1 := v_0_0.Args[1]
15392 if v_0_0_1.Op != OpConst64 {
15393 continue
15394 }
15395 t2 := v_0_0_1.Type
15396 c := auxIntToInt64(v_0_0_1.AuxInt)
15397 if v_0_1.Op != OpConst64 {
15398 continue
15399 }
15400 d := auxIntToInt64(v_0_1.AuxInt)
15401 if v_1.Op != OpConst64 {
15402 continue
15403 }
15404 e := auxIntToInt64(v_1.AuxInt)
15405 if !(c < e) {
15406 continue
15407 }
15408 v.reset(OpAnd64)
15409 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
15410 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15411 v1.AuxInt = int64ToAuxInt(e - c)
15412 v0.AddArg2(x, v1)
15413 v2 := b.NewValue0(v.Pos, OpConst64, t)
15414 v2.AuxInt = int64ToAuxInt(d << e)
15415 v.AddArg2(v0, v2)
15416 return true
15417 }
15418 break
15419 }
15420
15421
15422
15423 for {
15424 if v_0.Op != OpAnd64 {
15425 break
15426 }
15427 _ = v_0.Args[1]
15428 v_0_0 := v_0.Args[0]
15429 v_0_1 := v_0.Args[1]
15430 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15431 if v_0_0.Op != OpRsh64Ux64 {
15432 continue
15433 }
15434 t := v_0_0.Type
15435 _ = v_0_0.Args[1]
15436 x := v_0_0.Args[0]
15437 v_0_0_1 := v_0_0.Args[1]
15438 if v_0_0_1.Op != OpConst64 {
15439 continue
15440 }
15441 t2 := v_0_0_1.Type
15442 c := auxIntToInt64(v_0_0_1.AuxInt)
15443 if v_0_1.Op != OpConst64 {
15444 continue
15445 }
15446 d := auxIntToInt64(v_0_1.AuxInt)
15447 if v_1.Op != OpConst64 {
15448 continue
15449 }
15450 e := auxIntToInt64(v_1.AuxInt)
15451 if !(c < e) {
15452 continue
15453 }
15454 v.reset(OpAnd64)
15455 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
15456 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15457 v1.AuxInt = int64ToAuxInt(e - c)
15458 v0.AddArg2(x, v1)
15459 v2 := b.NewValue0(v.Pos, OpConst64, t)
15460 v2.AuxInt = int64ToAuxInt(d << e)
15461 v.AddArg2(v0, v2)
15462 return true
15463 }
15464 break
15465 }
15466
15467
15468
15469 for {
15470 if auxIntToBool(v.AuxInt) != false {
15471 break
15472 }
15473 x := v_0
15474 con := v_1
15475 if con.Op != OpConst64 {
15476 break
15477 }
15478 c := auxIntToInt64(con.AuxInt)
15479 if !(0 < c && c < 64) {
15480 break
15481 }
15482 v.reset(OpLsh64x64)
15483 v.AuxInt = boolToAuxInt(true)
15484 v.AddArg2(x, con)
15485 return true
15486 }
15487 return false
15488 }
15489 func rewriteValuegeneric_OpLsh64x8(v *Value) bool {
15490 v_1 := v.Args[1]
15491 v_0 := v.Args[0]
15492 b := v.Block
15493
15494
15495 for {
15496 t := v.Type
15497 x := v_0
15498 if v_1.Op != OpConst8 {
15499 break
15500 }
15501 c := auxIntToInt8(v_1.AuxInt)
15502 v.reset(OpLsh64x64)
15503 v0 := b.NewValue0(v.Pos, OpConst64, t)
15504 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
15505 v.AddArg2(x, v0)
15506 return true
15507 }
15508
15509
15510 for {
15511 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
15512 break
15513 }
15514 v.reset(OpConst64)
15515 v.AuxInt = int64ToAuxInt(0)
15516 return true
15517 }
15518
15519
15520
15521 for {
15522 if auxIntToBool(v.AuxInt) != false {
15523 break
15524 }
15525 x := v_0
15526 con := v_1
15527 if con.Op != OpConst8 {
15528 break
15529 }
15530 c := auxIntToInt8(con.AuxInt)
15531 if !(0 < c && c < 64) {
15532 break
15533 }
15534 v.reset(OpLsh64x8)
15535 v.AuxInt = boolToAuxInt(true)
15536 v.AddArg2(x, con)
15537 return true
15538 }
15539 return false
15540 }
15541 func rewriteValuegeneric_OpLsh8x16(v *Value) bool {
15542 v_1 := v.Args[1]
15543 v_0 := v.Args[0]
15544 b := v.Block
15545
15546
15547 for {
15548 t := v.Type
15549 x := v_0
15550 if v_1.Op != OpConst16 {
15551 break
15552 }
15553 c := auxIntToInt16(v_1.AuxInt)
15554 v.reset(OpLsh8x64)
15555 v0 := b.NewValue0(v.Pos, OpConst64, t)
15556 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
15557 v.AddArg2(x, v0)
15558 return true
15559 }
15560
15561
15562 for {
15563 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
15564 break
15565 }
15566 v.reset(OpConst8)
15567 v.AuxInt = int8ToAuxInt(0)
15568 return true
15569 }
15570
15571
15572
15573 for {
15574 if auxIntToBool(v.AuxInt) != false {
15575 break
15576 }
15577 x := v_0
15578 con := v_1
15579 if con.Op != OpConst16 {
15580 break
15581 }
15582 c := auxIntToInt16(con.AuxInt)
15583 if !(0 < c && c < 8) {
15584 break
15585 }
15586 v.reset(OpLsh8x16)
15587 v.AuxInt = boolToAuxInt(true)
15588 v.AddArg2(x, con)
15589 return true
15590 }
15591 return false
15592 }
15593 func rewriteValuegeneric_OpLsh8x32(v *Value) bool {
15594 v_1 := v.Args[1]
15595 v_0 := v.Args[0]
15596 b := v.Block
15597
15598
15599 for {
15600 t := v.Type
15601 x := v_0
15602 if v_1.Op != OpConst32 {
15603 break
15604 }
15605 c := auxIntToInt32(v_1.AuxInt)
15606 v.reset(OpLsh8x64)
15607 v0 := b.NewValue0(v.Pos, OpConst64, t)
15608 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
15609 v.AddArg2(x, v0)
15610 return true
15611 }
15612
15613
15614 for {
15615 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
15616 break
15617 }
15618 v.reset(OpConst8)
15619 v.AuxInt = int8ToAuxInt(0)
15620 return true
15621 }
15622
15623
15624
15625 for {
15626 if auxIntToBool(v.AuxInt) != false {
15627 break
15628 }
15629 x := v_0
15630 con := v_1
15631 if con.Op != OpConst32 {
15632 break
15633 }
15634 c := auxIntToInt32(con.AuxInt)
15635 if !(0 < c && c < 8) {
15636 break
15637 }
15638 v.reset(OpLsh8x32)
15639 v.AuxInt = boolToAuxInt(true)
15640 v.AddArg2(x, con)
15641 return true
15642 }
15643 return false
15644 }
15645 func rewriteValuegeneric_OpLsh8x64(v *Value) bool {
15646 v_1 := v.Args[1]
15647 v_0 := v.Args[0]
15648 b := v.Block
15649 typ := &b.Func.Config.Types
15650
15651
15652 for {
15653 if v_0.Op != OpConst8 {
15654 break
15655 }
15656 c := auxIntToInt8(v_0.AuxInt)
15657 if v_1.Op != OpConst64 {
15658 break
15659 }
15660 d := auxIntToInt64(v_1.AuxInt)
15661 v.reset(OpConst8)
15662 v.AuxInt = int8ToAuxInt(c << uint64(d))
15663 return true
15664 }
15665
15666
15667 for {
15668 x := v_0
15669 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
15670 break
15671 }
15672 v.copyOf(x)
15673 return true
15674 }
15675
15676
15677 for {
15678 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
15679 break
15680 }
15681 v.reset(OpConst8)
15682 v.AuxInt = int8ToAuxInt(0)
15683 return true
15684 }
15685
15686
15687
15688 for {
15689 if v_1.Op != OpConst64 {
15690 break
15691 }
15692 c := auxIntToInt64(v_1.AuxInt)
15693 if !(uint64(c) >= 8) {
15694 break
15695 }
15696 v.reset(OpConst8)
15697 v.AuxInt = int8ToAuxInt(0)
15698 return true
15699 }
15700
15701
15702
15703 for {
15704 t := v.Type
15705 if v_0.Op != OpLsh8x64 {
15706 break
15707 }
15708 _ = v_0.Args[1]
15709 x := v_0.Args[0]
15710 v_0_1 := v_0.Args[1]
15711 if v_0_1.Op != OpConst64 {
15712 break
15713 }
15714 c := auxIntToInt64(v_0_1.AuxInt)
15715 if v_1.Op != OpConst64 {
15716 break
15717 }
15718 d := auxIntToInt64(v_1.AuxInt)
15719 if !(!uaddOvf(c, d)) {
15720 break
15721 }
15722 v.reset(OpLsh8x64)
15723 v0 := b.NewValue0(v.Pos, OpConst64, t)
15724 v0.AuxInt = int64ToAuxInt(c + d)
15725 v.AddArg2(x, v0)
15726 return true
15727 }
15728
15729
15730
15731 for {
15732 i := v_0
15733 if i.Op != OpRsh8x64 {
15734 break
15735 }
15736 _ = i.Args[1]
15737 x := i.Args[0]
15738 i_1 := i.Args[1]
15739 if i_1.Op != OpConst64 {
15740 break
15741 }
15742 c := auxIntToInt64(i_1.AuxInt)
15743 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
15744 break
15745 }
15746 v.reset(OpAnd8)
15747 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
15748 v0.AuxInt = int8ToAuxInt(int8(-1) << c)
15749 v.AddArg2(x, v0)
15750 return true
15751 }
15752
15753
15754
15755 for {
15756 i := v_0
15757 if i.Op != OpRsh8Ux64 {
15758 break
15759 }
15760 _ = i.Args[1]
15761 x := i.Args[0]
15762 i_1 := i.Args[1]
15763 if i_1.Op != OpConst64 {
15764 break
15765 }
15766 c := auxIntToInt64(i_1.AuxInt)
15767 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
15768 break
15769 }
15770 v.reset(OpAnd8)
15771 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
15772 v0.AuxInt = int8ToAuxInt(int8(-1) << c)
15773 v.AddArg2(x, v0)
15774 return true
15775 }
15776
15777
15778
15779 for {
15780 if v_0.Op != OpRsh8Ux64 {
15781 break
15782 }
15783 _ = v_0.Args[1]
15784 v_0_0 := v_0.Args[0]
15785 if v_0_0.Op != OpLsh8x64 {
15786 break
15787 }
15788 _ = v_0_0.Args[1]
15789 x := v_0_0.Args[0]
15790 v_0_0_1 := v_0_0.Args[1]
15791 if v_0_0_1.Op != OpConst64 {
15792 break
15793 }
15794 c1 := auxIntToInt64(v_0_0_1.AuxInt)
15795 v_0_1 := v_0.Args[1]
15796 if v_0_1.Op != OpConst64 {
15797 break
15798 }
15799 c2 := auxIntToInt64(v_0_1.AuxInt)
15800 if v_1.Op != OpConst64 {
15801 break
15802 }
15803 c3 := auxIntToInt64(v_1.AuxInt)
15804 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
15805 break
15806 }
15807 v.reset(OpLsh8x64)
15808 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
15809 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
15810 v.AddArg2(x, v0)
15811 return true
15812 }
15813
15814
15815
15816 for {
15817 if v_0.Op != OpAnd8 {
15818 break
15819 }
15820 _ = v_0.Args[1]
15821 v_0_0 := v_0.Args[0]
15822 v_0_1 := v_0.Args[1]
15823 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15824 if v_0_0.Op != OpRsh8x64 {
15825 continue
15826 }
15827 t := v_0_0.Type
15828 _ = v_0_0.Args[1]
15829 x := v_0_0.Args[0]
15830 v_0_0_1 := v_0_0.Args[1]
15831 if v_0_0_1.Op != OpConst64 {
15832 continue
15833 }
15834 t2 := v_0_0_1.Type
15835 c := auxIntToInt64(v_0_0_1.AuxInt)
15836 if v_0_1.Op != OpConst8 {
15837 continue
15838 }
15839 d := auxIntToInt8(v_0_1.AuxInt)
15840 if v_1.Op != OpConst64 {
15841 continue
15842 }
15843 e := auxIntToInt64(v_1.AuxInt)
15844 if !(c >= e) {
15845 continue
15846 }
15847 v.reset(OpAnd8)
15848 v0 := b.NewValue0(v.Pos, OpRsh8x64, t)
15849 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15850 v1.AuxInt = int64ToAuxInt(c - e)
15851 v0.AddArg2(x, v1)
15852 v2 := b.NewValue0(v.Pos, OpConst8, t)
15853 v2.AuxInt = int8ToAuxInt(d << e)
15854 v.AddArg2(v0, v2)
15855 return true
15856 }
15857 break
15858 }
15859
15860
15861
15862 for {
15863 if v_0.Op != OpAnd8 {
15864 break
15865 }
15866 _ = v_0.Args[1]
15867 v_0_0 := v_0.Args[0]
15868 v_0_1 := v_0.Args[1]
15869 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15870 if v_0_0.Op != OpRsh8Ux64 {
15871 continue
15872 }
15873 t := v_0_0.Type
15874 _ = v_0_0.Args[1]
15875 x := v_0_0.Args[0]
15876 v_0_0_1 := v_0_0.Args[1]
15877 if v_0_0_1.Op != OpConst64 {
15878 continue
15879 }
15880 t2 := v_0_0_1.Type
15881 c := auxIntToInt64(v_0_0_1.AuxInt)
15882 if v_0_1.Op != OpConst8 {
15883 continue
15884 }
15885 d := auxIntToInt8(v_0_1.AuxInt)
15886 if v_1.Op != OpConst64 {
15887 continue
15888 }
15889 e := auxIntToInt64(v_1.AuxInt)
15890 if !(c >= e) {
15891 continue
15892 }
15893 v.reset(OpAnd8)
15894 v0 := b.NewValue0(v.Pos, OpRsh8Ux64, t)
15895 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15896 v1.AuxInt = int64ToAuxInt(c - e)
15897 v0.AddArg2(x, v1)
15898 v2 := b.NewValue0(v.Pos, OpConst8, t)
15899 v2.AuxInt = int8ToAuxInt(d << e)
15900 v.AddArg2(v0, v2)
15901 return true
15902 }
15903 break
15904 }
15905
15906
15907
15908 for {
15909 if v_0.Op != OpAnd8 {
15910 break
15911 }
15912 _ = v_0.Args[1]
15913 v_0_0 := v_0.Args[0]
15914 v_0_1 := v_0.Args[1]
15915 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15916 if v_0_0.Op != OpRsh8x64 {
15917 continue
15918 }
15919 t := v_0_0.Type
15920 _ = v_0_0.Args[1]
15921 x := v_0_0.Args[0]
15922 v_0_0_1 := v_0_0.Args[1]
15923 if v_0_0_1.Op != OpConst64 {
15924 continue
15925 }
15926 t2 := v_0_0_1.Type
15927 c := auxIntToInt64(v_0_0_1.AuxInt)
15928 if v_0_1.Op != OpConst8 {
15929 continue
15930 }
15931 d := auxIntToInt8(v_0_1.AuxInt)
15932 if v_1.Op != OpConst64 {
15933 continue
15934 }
15935 e := auxIntToInt64(v_1.AuxInt)
15936 if !(c < e) {
15937 continue
15938 }
15939 v.reset(OpAnd8)
15940 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
15941 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15942 v1.AuxInt = int64ToAuxInt(e - c)
15943 v0.AddArg2(x, v1)
15944 v2 := b.NewValue0(v.Pos, OpConst8, t)
15945 v2.AuxInt = int8ToAuxInt(d << e)
15946 v.AddArg2(v0, v2)
15947 return true
15948 }
15949 break
15950 }
15951
15952
15953
15954 for {
15955 if v_0.Op != OpAnd8 {
15956 break
15957 }
15958 _ = v_0.Args[1]
15959 v_0_0 := v_0.Args[0]
15960 v_0_1 := v_0.Args[1]
15961 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15962 if v_0_0.Op != OpRsh8Ux64 {
15963 continue
15964 }
15965 t := v_0_0.Type
15966 _ = v_0_0.Args[1]
15967 x := v_0_0.Args[0]
15968 v_0_0_1 := v_0_0.Args[1]
15969 if v_0_0_1.Op != OpConst64 {
15970 continue
15971 }
15972 t2 := v_0_0_1.Type
15973 c := auxIntToInt64(v_0_0_1.AuxInt)
15974 if v_0_1.Op != OpConst8 {
15975 continue
15976 }
15977 d := auxIntToInt8(v_0_1.AuxInt)
15978 if v_1.Op != OpConst64 {
15979 continue
15980 }
15981 e := auxIntToInt64(v_1.AuxInt)
15982 if !(c < e) {
15983 continue
15984 }
15985 v.reset(OpAnd8)
15986 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
15987 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15988 v1.AuxInt = int64ToAuxInt(e - c)
15989 v0.AddArg2(x, v1)
15990 v2 := b.NewValue0(v.Pos, OpConst8, t)
15991 v2.AuxInt = int8ToAuxInt(d << e)
15992 v.AddArg2(v0, v2)
15993 return true
15994 }
15995 break
15996 }
15997
15998
15999
16000 for {
16001 if auxIntToBool(v.AuxInt) != false {
16002 break
16003 }
16004 x := v_0
16005 con := v_1
16006 if con.Op != OpConst64 {
16007 break
16008 }
16009 c := auxIntToInt64(con.AuxInt)
16010 if !(0 < c && c < 8) {
16011 break
16012 }
16013 v.reset(OpLsh8x64)
16014 v.AuxInt = boolToAuxInt(true)
16015 v.AddArg2(x, con)
16016 return true
16017 }
16018 return false
16019 }
16020 func rewriteValuegeneric_OpLsh8x8(v *Value) bool {
16021 v_1 := v.Args[1]
16022 v_0 := v.Args[0]
16023 b := v.Block
16024
16025
16026 for {
16027 t := v.Type
16028 x := v_0
16029 if v_1.Op != OpConst8 {
16030 break
16031 }
16032 c := auxIntToInt8(v_1.AuxInt)
16033 v.reset(OpLsh8x64)
16034 v0 := b.NewValue0(v.Pos, OpConst64, t)
16035 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
16036 v.AddArg2(x, v0)
16037 return true
16038 }
16039
16040
16041 for {
16042 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
16043 break
16044 }
16045 v.reset(OpConst8)
16046 v.AuxInt = int8ToAuxInt(0)
16047 return true
16048 }
16049
16050
16051
16052 for {
16053 if auxIntToBool(v.AuxInt) != false {
16054 break
16055 }
16056 x := v_0
16057 con := v_1
16058 if con.Op != OpConst8 {
16059 break
16060 }
16061 c := auxIntToInt8(con.AuxInt)
16062 if !(0 < c && c < 8) {
16063 break
16064 }
16065 v.reset(OpLsh8x8)
16066 v.AuxInt = boolToAuxInt(true)
16067 v.AddArg2(x, con)
16068 return true
16069 }
16070 return false
16071 }
16072 func rewriteValuegeneric_OpMemEq(v *Value) bool {
16073 v_3 := v.Args[3]
16074 v_2 := v.Args[2]
16075 v_1 := v.Args[1]
16076 v_0 := v.Args[0]
16077 b := v.Block
16078 config := b.Func.Config
16079 typ := &b.Func.Config.Types
16080
16081
16082 for {
16083 sptr := v_0
16084 tptr := v_1
16085 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 {
16086 break
16087 }
16088 mem := v_3
16089 v.reset(OpEq8)
16090 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
16091 v0.AddArg2(sptr, mem)
16092 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
16093 v1.AddArg2(tptr, mem)
16094 v.AddArg2(v0, v1)
16095 return true
16096 }
16097
16098
16099
16100 for {
16101 sptr := v_0
16102 tptr := v_1
16103 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 {
16104 break
16105 }
16106 mem := v_3
16107 if !(canLoadUnaligned(config)) {
16108 break
16109 }
16110 v.reset(OpEq16)
16111 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
16112 v0.AddArg2(sptr, mem)
16113 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
16114 v1.AddArg2(tptr, mem)
16115 v.AddArg2(v0, v1)
16116 return true
16117 }
16118
16119
16120
16121 for {
16122 sptr := v_0
16123 tptr := v_1
16124 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 {
16125 break
16126 }
16127 mem := v_3
16128 if !(canLoadUnaligned(config)) {
16129 break
16130 }
16131 v.reset(OpEq32)
16132 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
16133 v0.AddArg2(sptr, mem)
16134 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
16135 v1.AddArg2(tptr, mem)
16136 v.AddArg2(v0, v1)
16137 return true
16138 }
16139
16140
16141
16142 for {
16143 sptr := v_0
16144 tptr := v_1
16145 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 {
16146 break
16147 }
16148 mem := v_3
16149 if !(canLoadUnaligned(config) && config.PtrSize == 8) {
16150 break
16151 }
16152 v.reset(OpEq64)
16153 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
16154 v0.AddArg2(sptr, mem)
16155 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
16156 v1.AddArg2(tptr, mem)
16157 v.AddArg2(v0, v1)
16158 return true
16159 }
16160
16161
16162 for {
16163 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 {
16164 break
16165 }
16166 v.reset(OpConstBool)
16167 v.Type = typ.Bool
16168 v.AuxInt = boolToAuxInt(true)
16169 return true
16170 }
16171
16172
16173
16174 for {
16175 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16176 p := v_0
16177 q := v_1
16178 if !(isSamePtr(p, q)) {
16179 continue
16180 }
16181 v.reset(OpConstBool)
16182 v.Type = typ.Bool
16183 v.AuxInt = boolToAuxInt(true)
16184 return true
16185 }
16186 break
16187 }
16188
16189
16190
16191 for {
16192 p := v_0
16193 q := v_1
16194 if v_2.Op != OpConst64 {
16195 break
16196 }
16197 c := auxIntToInt64(v_2.AuxInt)
16198 mem := v_3
16199 if !((c == 3 || c == 5 || c == 9 || c == 17) && canLoadUnaligned(config) && config.RegSize == 8) {
16200 break
16201 }
16202 v.reset(OpAndB)
16203 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
16204 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
16205 v1.AuxInt = int64ToAuxInt(c - 1)
16206 v0.AddArg4(p, q, v1, mem)
16207 v2 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
16208 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
16209 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
16210 v4.AuxInt = int64ToAuxInt(c - 1)
16211 v4.AddArg(p)
16212 v3.AddArg2(v4, mem)
16213 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
16214 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
16215 v6.AuxInt = int64ToAuxInt(c - 1)
16216 v6.AddArg(q)
16217 v5.AddArg2(v6, mem)
16218 v2.AddArg2(v3, v5)
16219 v.AddArg2(v0, v2)
16220 return true
16221 }
16222
16223
16224
16225 for {
16226 p := v_0
16227 q := v_1
16228 if v_2.Op != OpConst64 {
16229 break
16230 }
16231 c := auxIntToInt64(v_2.AuxInt)
16232 mem := v_3
16233 if !((c == 6 || c == 10 || c == 18) && canLoadUnaligned(config) && config.RegSize == 8) {
16234 break
16235 }
16236 v.reset(OpAndB)
16237 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
16238 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
16239 v1.AuxInt = int64ToAuxInt(c - 2)
16240 v0.AddArg4(p, q, v1, mem)
16241 v2 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
16242 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
16243 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
16244 v4.AuxInt = int64ToAuxInt(c - 2)
16245 v4.AddArg(p)
16246 v3.AddArg2(v4, mem)
16247 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
16248 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
16249 v6.AuxInt = int64ToAuxInt(c - 2)
16250 v6.AddArg(q)
16251 v5.AddArg2(v6, mem)
16252 v2.AddArg2(v3, v5)
16253 v.AddArg2(v0, v2)
16254 return true
16255 }
16256
16257
16258
16259 for {
16260 p := v_0
16261 q := v_1
16262 if v_2.Op != OpConst64 {
16263 break
16264 }
16265 c := auxIntToInt64(v_2.AuxInt)
16266 mem := v_3
16267 if !((c == 7 || c == 11 || c == 19 || c == 20) && canLoadUnaligned(config) && config.RegSize == 8) {
16268 break
16269 }
16270 v.reset(OpAndB)
16271 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
16272 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
16273 v1.AuxInt = int64ToAuxInt(min(c-3, 16))
16274 v0.AddArg4(p, q, v1, mem)
16275 v2 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
16276 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
16277 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
16278 v4.AuxInt = int64ToAuxInt(c - 4)
16279 v4.AddArg(p)
16280 v3.AddArg2(v4, mem)
16281 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
16282 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
16283 v6.AuxInt = int64ToAuxInt(c - 4)
16284 v6.AddArg(q)
16285 v5.AddArg2(v6, mem)
16286 v2.AddArg2(v3, v5)
16287 v.AddArg2(v0, v2)
16288 return true
16289 }
16290
16291
16292
16293 for {
16294 p := v_0
16295 q := v_1
16296 if v_2.Op != OpConst64 {
16297 break
16298 }
16299 c := auxIntToInt64(v_2.AuxInt)
16300 mem := v_3
16301 if !(((c >= 12 && c <= 16) || (c >= 21 && c <= 24)) && canLoadUnaligned(config) && config.RegSize == 8) {
16302 break
16303 }
16304 v.reset(OpAndB)
16305 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
16306 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
16307 v1.AuxInt = int64ToAuxInt(8 + int64(bool2int(c > 16))*8)
16308 v0.AddArg4(p, q, v1, mem)
16309 v2 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
16310 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
16311 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
16312 v4.AuxInt = int64ToAuxInt(c - 8)
16313 v4.AddArg(p)
16314 v3.AddArg2(v4, mem)
16315 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
16316 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
16317 v6.AuxInt = int64ToAuxInt(c - 8)
16318 v6.AddArg(q)
16319 v5.AddArg2(v6, mem)
16320 v2.AddArg2(v3, v5)
16321 v.AddArg2(v0, v2)
16322 return true
16323 }
16324
16325
16326
16327 for {
16328 p := v_0
16329 q := v_1
16330 if v_2.Op != OpConst64 {
16331 break
16332 }
16333 c := auxIntToInt64(v_2.AuxInt)
16334 mem := v_3
16335 if !(c >= 25 && c <= 32 && canLoadUnaligned(config) && config.RegSize == 8) {
16336 break
16337 }
16338 v.reset(OpAndB)
16339 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
16340 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
16341 v1.AuxInt = int64ToAuxInt(16)
16342 v0.AddArg4(p, q, v1, mem)
16343 v2 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
16344 v3 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
16345 v3.AuxInt = int64ToAuxInt(16)
16346 v3.AddArg(p)
16347 v4 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
16348 v4.AuxInt = int64ToAuxInt(16)
16349 v4.AddArg(q)
16350 v5 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
16351 v5.AuxInt = int64ToAuxInt(c - 16)
16352 v2.AddArg4(v3, v4, v5, mem)
16353 v.AddArg2(v0, v2)
16354 return true
16355 }
16356 return false
16357 }
16358 func rewriteValuegeneric_OpMod16(v *Value) bool {
16359 v_1 := v.Args[1]
16360 v_0 := v.Args[0]
16361 b := v.Block
16362
16363
16364
16365 for {
16366 if v_0.Op != OpConst16 {
16367 break
16368 }
16369 c := auxIntToInt16(v_0.AuxInt)
16370 if v_1.Op != OpConst16 {
16371 break
16372 }
16373 d := auxIntToInt16(v_1.AuxInt)
16374 if !(d != 0) {
16375 break
16376 }
16377 v.reset(OpConst16)
16378 v.AuxInt = int16ToAuxInt(c % d)
16379 return true
16380 }
16381
16382
16383
16384 for {
16385 t := v.Type
16386 n := v_0
16387 if v_1.Op != OpConst16 {
16388 break
16389 }
16390 c := auxIntToInt16(v_1.AuxInt)
16391 if !(isNonNegative(n) && isPowerOfTwo(c)) {
16392 break
16393 }
16394 v.reset(OpAnd16)
16395 v0 := b.NewValue0(v.Pos, OpConst16, t)
16396 v0.AuxInt = int16ToAuxInt(c - 1)
16397 v.AddArg2(n, v0)
16398 return true
16399 }
16400
16401
16402
16403 for {
16404 t := v.Type
16405 n := v_0
16406 if v_1.Op != OpConst16 {
16407 break
16408 }
16409 c := auxIntToInt16(v_1.AuxInt)
16410 if !(c < 0 && c != -1<<15) {
16411 break
16412 }
16413 v.reset(OpMod16)
16414 v.Type = t
16415 v0 := b.NewValue0(v.Pos, OpConst16, t)
16416 v0.AuxInt = int16ToAuxInt(-c)
16417 v.AddArg2(n, v0)
16418 return true
16419 }
16420
16421
16422
16423 for {
16424 t := v.Type
16425 x := v_0
16426 if v_1.Op != OpConst16 {
16427 break
16428 }
16429 c := auxIntToInt16(v_1.AuxInt)
16430 if !(x.Op != OpConst16 && (c > 0 || c == -1<<15)) {
16431 break
16432 }
16433 v.reset(OpSub16)
16434 v0 := b.NewValue0(v.Pos, OpMul16, t)
16435 v1 := b.NewValue0(v.Pos, OpDiv16, t)
16436 v2 := b.NewValue0(v.Pos, OpConst16, t)
16437 v2.AuxInt = int16ToAuxInt(c)
16438 v1.AddArg2(x, v2)
16439 v0.AddArg2(v1, v2)
16440 v.AddArg2(x, v0)
16441 return true
16442 }
16443 return false
16444 }
16445 func rewriteValuegeneric_OpMod16u(v *Value) bool {
16446 v_1 := v.Args[1]
16447 v_0 := v.Args[0]
16448 b := v.Block
16449
16450
16451
16452 for {
16453 if v_0.Op != OpConst16 {
16454 break
16455 }
16456 c := auxIntToInt16(v_0.AuxInt)
16457 if v_1.Op != OpConst16 {
16458 break
16459 }
16460 d := auxIntToInt16(v_1.AuxInt)
16461 if !(d != 0) {
16462 break
16463 }
16464 v.reset(OpConst16)
16465 v.AuxInt = int16ToAuxInt(int16(uint16(c) % uint16(d)))
16466 return true
16467 }
16468
16469
16470
16471 for {
16472 t := v.Type
16473 n := v_0
16474 if v_1.Op != OpConst16 {
16475 break
16476 }
16477 c := auxIntToInt16(v_1.AuxInt)
16478 if !(isPowerOfTwo(uint16(c))) {
16479 break
16480 }
16481 v.reset(OpAnd16)
16482 v0 := b.NewValue0(v.Pos, OpConst16, t)
16483 v0.AuxInt = int16ToAuxInt(c - 1)
16484 v.AddArg2(n, v0)
16485 return true
16486 }
16487
16488
16489
16490 for {
16491 t := v.Type
16492 x := v_0
16493 if v_1.Op != OpConst16 {
16494 break
16495 }
16496 c := auxIntToInt16(v_1.AuxInt)
16497 if !(x.Op != OpConst16 && c != 0) {
16498 break
16499 }
16500 v.reset(OpSub16)
16501 v0 := b.NewValue0(v.Pos, OpMul16, t)
16502 v1 := b.NewValue0(v.Pos, OpDiv16u, t)
16503 v2 := b.NewValue0(v.Pos, OpConst16, t)
16504 v2.AuxInt = int16ToAuxInt(c)
16505 v1.AddArg2(x, v2)
16506 v0.AddArg2(v1, v2)
16507 v.AddArg2(x, v0)
16508 return true
16509 }
16510 return false
16511 }
16512 func rewriteValuegeneric_OpMod32(v *Value) bool {
16513 v_1 := v.Args[1]
16514 v_0 := v.Args[0]
16515 b := v.Block
16516
16517
16518
16519 for {
16520 if v_0.Op != OpConst32 {
16521 break
16522 }
16523 c := auxIntToInt32(v_0.AuxInt)
16524 if v_1.Op != OpConst32 {
16525 break
16526 }
16527 d := auxIntToInt32(v_1.AuxInt)
16528 if !(d != 0) {
16529 break
16530 }
16531 v.reset(OpConst32)
16532 v.AuxInt = int32ToAuxInt(c % d)
16533 return true
16534 }
16535
16536
16537
16538 for {
16539 t := v.Type
16540 n := v_0
16541 if v_1.Op != OpConst32 {
16542 break
16543 }
16544 c := auxIntToInt32(v_1.AuxInt)
16545 if !(isNonNegative(n) && isPowerOfTwo(c)) {
16546 break
16547 }
16548 v.reset(OpAnd32)
16549 v0 := b.NewValue0(v.Pos, OpConst32, t)
16550 v0.AuxInt = int32ToAuxInt(c - 1)
16551 v.AddArg2(n, v0)
16552 return true
16553 }
16554
16555
16556
16557 for {
16558 t := v.Type
16559 n := v_0
16560 if v_1.Op != OpConst32 {
16561 break
16562 }
16563 c := auxIntToInt32(v_1.AuxInt)
16564 if !(c < 0 && c != -1<<31) {
16565 break
16566 }
16567 v.reset(OpMod32)
16568 v.Type = t
16569 v0 := b.NewValue0(v.Pos, OpConst32, t)
16570 v0.AuxInt = int32ToAuxInt(-c)
16571 v.AddArg2(n, v0)
16572 return true
16573 }
16574
16575
16576
16577 for {
16578 t := v.Type
16579 x := v_0
16580 if v_1.Op != OpConst32 {
16581 break
16582 }
16583 c := auxIntToInt32(v_1.AuxInt)
16584 if !(x.Op != OpConst32 && (c > 0 || c == -1<<31)) {
16585 break
16586 }
16587 v.reset(OpSub32)
16588 v0 := b.NewValue0(v.Pos, OpMul32, t)
16589 v1 := b.NewValue0(v.Pos, OpDiv32, t)
16590 v2 := b.NewValue0(v.Pos, OpConst32, t)
16591 v2.AuxInt = int32ToAuxInt(c)
16592 v1.AddArg2(x, v2)
16593 v0.AddArg2(v1, v2)
16594 v.AddArg2(x, v0)
16595 return true
16596 }
16597 return false
16598 }
16599 func rewriteValuegeneric_OpMod32u(v *Value) bool {
16600 v_1 := v.Args[1]
16601 v_0 := v.Args[0]
16602 b := v.Block
16603
16604
16605
16606 for {
16607 if v_0.Op != OpConst32 {
16608 break
16609 }
16610 c := auxIntToInt32(v_0.AuxInt)
16611 if v_1.Op != OpConst32 {
16612 break
16613 }
16614 d := auxIntToInt32(v_1.AuxInt)
16615 if !(d != 0) {
16616 break
16617 }
16618 v.reset(OpConst32)
16619 v.AuxInt = int32ToAuxInt(int32(uint32(c) % uint32(d)))
16620 return true
16621 }
16622
16623
16624
16625 for {
16626 t := v.Type
16627 n := v_0
16628 if v_1.Op != OpConst32 {
16629 break
16630 }
16631 c := auxIntToInt32(v_1.AuxInt)
16632 if !(isPowerOfTwo(uint32(c))) {
16633 break
16634 }
16635 v.reset(OpAnd32)
16636 v0 := b.NewValue0(v.Pos, OpConst32, t)
16637 v0.AuxInt = int32ToAuxInt(c - 1)
16638 v.AddArg2(n, v0)
16639 return true
16640 }
16641
16642
16643
16644 for {
16645 t := v.Type
16646 x := v_0
16647 if v_1.Op != OpConst32 {
16648 break
16649 }
16650 c := auxIntToInt32(v_1.AuxInt)
16651 if !(x.Op != OpConst32 && c != 0) {
16652 break
16653 }
16654 v.reset(OpSub32)
16655 v0 := b.NewValue0(v.Pos, OpMul32, t)
16656 v1 := b.NewValue0(v.Pos, OpDiv32u, t)
16657 v2 := b.NewValue0(v.Pos, OpConst32, t)
16658 v2.AuxInt = int32ToAuxInt(c)
16659 v1.AddArg2(x, v2)
16660 v0.AddArg2(v1, v2)
16661 v.AddArg2(x, v0)
16662 return true
16663 }
16664 return false
16665 }
16666 func rewriteValuegeneric_OpMod64(v *Value) bool {
16667 v_1 := v.Args[1]
16668 v_0 := v.Args[0]
16669 b := v.Block
16670
16671
16672
16673 for {
16674 if v_0.Op != OpConst64 {
16675 break
16676 }
16677 c := auxIntToInt64(v_0.AuxInt)
16678 if v_1.Op != OpConst64 {
16679 break
16680 }
16681 d := auxIntToInt64(v_1.AuxInt)
16682 if !(d != 0) {
16683 break
16684 }
16685 v.reset(OpConst64)
16686 v.AuxInt = int64ToAuxInt(c % d)
16687 return true
16688 }
16689
16690
16691
16692 for {
16693 t := v.Type
16694 n := v_0
16695 if v_1.Op != OpConst64 {
16696 break
16697 }
16698 c := auxIntToInt64(v_1.AuxInt)
16699 if !(isNonNegative(n) && isPowerOfTwo(c)) {
16700 break
16701 }
16702 v.reset(OpAnd64)
16703 v0 := b.NewValue0(v.Pos, OpConst64, t)
16704 v0.AuxInt = int64ToAuxInt(c - 1)
16705 v.AddArg2(n, v0)
16706 return true
16707 }
16708
16709
16710
16711 for {
16712 n := v_0
16713 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 || !(isNonNegative(n)) {
16714 break
16715 }
16716 v.copyOf(n)
16717 return true
16718 }
16719
16720
16721
16722 for {
16723 t := v.Type
16724 n := v_0
16725 if v_1.Op != OpConst64 {
16726 break
16727 }
16728 c := auxIntToInt64(v_1.AuxInt)
16729 if !(c < 0 && c != -1<<63) {
16730 break
16731 }
16732 v.reset(OpMod64)
16733 v.Type = t
16734 v0 := b.NewValue0(v.Pos, OpConst64, t)
16735 v0.AuxInt = int64ToAuxInt(-c)
16736 v.AddArg2(n, v0)
16737 return true
16738 }
16739
16740
16741
16742 for {
16743 t := v.Type
16744 x := v_0
16745 if v_1.Op != OpConst64 {
16746 break
16747 }
16748 c := auxIntToInt64(v_1.AuxInt)
16749 if !(x.Op != OpConst64 && (c > 0 || c == -1<<63)) {
16750 break
16751 }
16752 v.reset(OpSub64)
16753 v0 := b.NewValue0(v.Pos, OpMul64, t)
16754 v1 := b.NewValue0(v.Pos, OpDiv64, t)
16755 v2 := b.NewValue0(v.Pos, OpConst64, t)
16756 v2.AuxInt = int64ToAuxInt(c)
16757 v1.AddArg2(x, v2)
16758 v0.AddArg2(v1, v2)
16759 v.AddArg2(x, v0)
16760 return true
16761 }
16762 return false
16763 }
16764 func rewriteValuegeneric_OpMod64u(v *Value) bool {
16765 v_1 := v.Args[1]
16766 v_0 := v.Args[0]
16767 b := v.Block
16768
16769
16770
16771 for {
16772 if v_0.Op != OpConst64 {
16773 break
16774 }
16775 c := auxIntToInt64(v_0.AuxInt)
16776 if v_1.Op != OpConst64 {
16777 break
16778 }
16779 d := auxIntToInt64(v_1.AuxInt)
16780 if !(d != 0) {
16781 break
16782 }
16783 v.reset(OpConst64)
16784 v.AuxInt = int64ToAuxInt(int64(uint64(c) % uint64(d)))
16785 return true
16786 }
16787
16788
16789
16790 for {
16791 t := v.Type
16792 n := v_0
16793 if v_1.Op != OpConst64 {
16794 break
16795 }
16796 c := auxIntToInt64(v_1.AuxInt)
16797 if !(isPowerOfTwo(uint64(c))) {
16798 break
16799 }
16800 v.reset(OpAnd64)
16801 v0 := b.NewValue0(v.Pos, OpConst64, t)
16802 v0.AuxInt = int64ToAuxInt(c - 1)
16803 v.AddArg2(n, v0)
16804 return true
16805 }
16806
16807
16808
16809 for {
16810 t := v.Type
16811 x := v_0
16812 if v_1.Op != OpConst64 {
16813 break
16814 }
16815 c := auxIntToInt64(v_1.AuxInt)
16816 if !(x.Op != OpConst64 && c != 0) {
16817 break
16818 }
16819 v.reset(OpSub64)
16820 v0 := b.NewValue0(v.Pos, OpMul64, t)
16821 v1 := b.NewValue0(v.Pos, OpDiv64u, t)
16822 v2 := b.NewValue0(v.Pos, OpConst64, t)
16823 v2.AuxInt = int64ToAuxInt(c)
16824 v1.AddArg2(x, v2)
16825 v0.AddArg2(v1, v2)
16826 v.AddArg2(x, v0)
16827 return true
16828 }
16829 return false
16830 }
16831 func rewriteValuegeneric_OpMod8(v *Value) bool {
16832 v_1 := v.Args[1]
16833 v_0 := v.Args[0]
16834 b := v.Block
16835
16836
16837
16838 for {
16839 if v_0.Op != OpConst8 {
16840 break
16841 }
16842 c := auxIntToInt8(v_0.AuxInt)
16843 if v_1.Op != OpConst8 {
16844 break
16845 }
16846 d := auxIntToInt8(v_1.AuxInt)
16847 if !(d != 0) {
16848 break
16849 }
16850 v.reset(OpConst8)
16851 v.AuxInt = int8ToAuxInt(c % d)
16852 return true
16853 }
16854
16855
16856
16857 for {
16858 t := v.Type
16859 n := v_0
16860 if v_1.Op != OpConst8 {
16861 break
16862 }
16863 c := auxIntToInt8(v_1.AuxInt)
16864 if !(isNonNegative(n) && isPowerOfTwo(c)) {
16865 break
16866 }
16867 v.reset(OpAnd8)
16868 v0 := b.NewValue0(v.Pos, OpConst8, t)
16869 v0.AuxInt = int8ToAuxInt(c - 1)
16870 v.AddArg2(n, v0)
16871 return true
16872 }
16873
16874
16875
16876 for {
16877 t := v.Type
16878 n := v_0
16879 if v_1.Op != OpConst8 {
16880 break
16881 }
16882 c := auxIntToInt8(v_1.AuxInt)
16883 if !(c < 0 && c != -1<<7) {
16884 break
16885 }
16886 v.reset(OpMod8)
16887 v.Type = t
16888 v0 := b.NewValue0(v.Pos, OpConst8, t)
16889 v0.AuxInt = int8ToAuxInt(-c)
16890 v.AddArg2(n, v0)
16891 return true
16892 }
16893
16894
16895
16896 for {
16897 t := v.Type
16898 x := v_0
16899 if v_1.Op != OpConst8 {
16900 break
16901 }
16902 c := auxIntToInt8(v_1.AuxInt)
16903 if !(x.Op != OpConst8 && (c > 0 || c == -1<<7)) {
16904 break
16905 }
16906 v.reset(OpSub8)
16907 v0 := b.NewValue0(v.Pos, OpMul8, t)
16908 v1 := b.NewValue0(v.Pos, OpDiv8, t)
16909 v2 := b.NewValue0(v.Pos, OpConst8, t)
16910 v2.AuxInt = int8ToAuxInt(c)
16911 v1.AddArg2(x, v2)
16912 v0.AddArg2(v1, v2)
16913 v.AddArg2(x, v0)
16914 return true
16915 }
16916 return false
16917 }
16918 func rewriteValuegeneric_OpMod8u(v *Value) bool {
16919 v_1 := v.Args[1]
16920 v_0 := v.Args[0]
16921 b := v.Block
16922
16923
16924
16925 for {
16926 if v_0.Op != OpConst8 {
16927 break
16928 }
16929 c := auxIntToInt8(v_0.AuxInt)
16930 if v_1.Op != OpConst8 {
16931 break
16932 }
16933 d := auxIntToInt8(v_1.AuxInt)
16934 if !(d != 0) {
16935 break
16936 }
16937 v.reset(OpConst8)
16938 v.AuxInt = int8ToAuxInt(int8(uint8(c) % uint8(d)))
16939 return true
16940 }
16941
16942
16943
16944 for {
16945 t := v.Type
16946 n := v_0
16947 if v_1.Op != OpConst8 {
16948 break
16949 }
16950 c := auxIntToInt8(v_1.AuxInt)
16951 if !(isPowerOfTwo(uint8(c))) {
16952 break
16953 }
16954 v.reset(OpAnd8)
16955 v0 := b.NewValue0(v.Pos, OpConst8, t)
16956 v0.AuxInt = int8ToAuxInt(c - 1)
16957 v.AddArg2(n, v0)
16958 return true
16959 }
16960
16961
16962
16963 for {
16964 t := v.Type
16965 x := v_0
16966 if v_1.Op != OpConst8 {
16967 break
16968 }
16969 c := auxIntToInt8(v_1.AuxInt)
16970 if !(x.Op != OpConst8 && c != 0) {
16971 break
16972 }
16973 v.reset(OpSub8)
16974 v0 := b.NewValue0(v.Pos, OpMul8, t)
16975 v1 := b.NewValue0(v.Pos, OpDiv8u, t)
16976 v2 := b.NewValue0(v.Pos, OpConst8, t)
16977 v2.AuxInt = int8ToAuxInt(c)
16978 v1.AddArg2(x, v2)
16979 v0.AddArg2(v1, v2)
16980 v.AddArg2(x, v0)
16981 return true
16982 }
16983 return false
16984 }
16985 func rewriteValuegeneric_OpMove(v *Value) bool {
16986 v_2 := v.Args[2]
16987 v_1 := v.Args[1]
16988 v_0 := v.Args[0]
16989 b := v.Block
16990 config := b.Func.Config
16991
16992
16993
16994 for {
16995 n := auxIntToInt64(v.AuxInt)
16996 t := auxToType(v.Aux)
16997 dst1 := v_0
16998 src := v_1
16999 mem := v_2
17000 if mem.Op != OpZero || auxIntToInt64(mem.AuxInt) != n || auxToType(mem.Aux) != t {
17001 break
17002 }
17003 dst2 := mem.Args[0]
17004 if !(isSamePtr(src, dst2)) {
17005 break
17006 }
17007 v.reset(OpZero)
17008 v.AuxInt = int64ToAuxInt(n)
17009 v.Aux = typeToAux(t)
17010 v.AddArg2(dst1, mem)
17011 return true
17012 }
17013
17014
17015
17016 for {
17017 n := auxIntToInt64(v.AuxInt)
17018 t := auxToType(v.Aux)
17019 dst1 := v_0
17020 src := v_1
17021 mem := v_2
17022 if mem.Op != OpVarDef {
17023 break
17024 }
17025 mem_0 := mem.Args[0]
17026 if mem_0.Op != OpZero || auxIntToInt64(mem_0.AuxInt) != n || auxToType(mem_0.Aux) != t {
17027 break
17028 }
17029 dst0 := mem_0.Args[0]
17030 if !(isSamePtr(src, dst0)) {
17031 break
17032 }
17033 v.reset(OpZero)
17034 v.AuxInt = int64ToAuxInt(n)
17035 v.Aux = typeToAux(t)
17036 v.AddArg2(dst1, mem)
17037 return true
17038 }
17039
17040
17041
17042 for {
17043 n := auxIntToInt64(v.AuxInt)
17044 t := auxToType(v.Aux)
17045 dst := v_0
17046 if v_1.Op != OpAddr {
17047 break
17048 }
17049 sym := auxToSym(v_1.Aux)
17050 v_1_0 := v_1.Args[0]
17051 if v_1_0.Op != OpSB {
17052 break
17053 }
17054 mem := v_2
17055 if !(symIsROZero(sym)) {
17056 break
17057 }
17058 v.reset(OpZero)
17059 v.AuxInt = int64ToAuxInt(n)
17060 v.Aux = typeToAux(t)
17061 v.AddArg2(dst, mem)
17062 return true
17063 }
17064
17065
17066
17067 for {
17068 n := auxIntToInt64(v.AuxInt)
17069 t1 := auxToType(v.Aux)
17070 dst1 := v_0
17071 src1 := v_1
17072 store := v_2
17073 if store.Op != OpStore {
17074 break
17075 }
17076 t2 := auxToType(store.Aux)
17077 mem := store.Args[2]
17078 op := store.Args[0]
17079 if op.Op != OpOffPtr {
17080 break
17081 }
17082 o2 := auxIntToInt64(op.AuxInt)
17083 dst2 := op.Args[0]
17084 if !(isSamePtr(dst1, dst2) && store.Uses == 1 && n >= o2+t2.Size() && disjoint(src1, n, op, t2.Size()) && clobber(store)) {
17085 break
17086 }
17087 v.reset(OpMove)
17088 v.AuxInt = int64ToAuxInt(n)
17089 v.Aux = typeToAux(t1)
17090 v.AddArg3(dst1, src1, mem)
17091 return true
17092 }
17093
17094
17095
17096 for {
17097 n := auxIntToInt64(v.AuxInt)
17098 t := auxToType(v.Aux)
17099 dst1 := v_0
17100 src1 := v_1
17101 move := v_2
17102 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
17103 break
17104 }
17105 mem := move.Args[2]
17106 dst2 := move.Args[0]
17107 if !(move.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move)) {
17108 break
17109 }
17110 v.reset(OpMove)
17111 v.AuxInt = int64ToAuxInt(n)
17112 v.Aux = typeToAux(t)
17113 v.AddArg3(dst1, src1, mem)
17114 return true
17115 }
17116
17117
17118
17119 for {
17120 n := auxIntToInt64(v.AuxInt)
17121 t := auxToType(v.Aux)
17122 dst1 := v_0
17123 src1 := v_1
17124 vardef := v_2
17125 if vardef.Op != OpVarDef {
17126 break
17127 }
17128 x := auxToSym(vardef.Aux)
17129 move := vardef.Args[0]
17130 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
17131 break
17132 }
17133 mem := move.Args[2]
17134 dst2 := move.Args[0]
17135 if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move, vardef)) {
17136 break
17137 }
17138 v.reset(OpMove)
17139 v.AuxInt = int64ToAuxInt(n)
17140 v.Aux = typeToAux(t)
17141 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
17142 v0.Aux = symToAux(x)
17143 v0.AddArg(mem)
17144 v.AddArg3(dst1, src1, v0)
17145 return true
17146 }
17147
17148
17149
17150 for {
17151 n := auxIntToInt64(v.AuxInt)
17152 t := auxToType(v.Aux)
17153 dst1 := v_0
17154 src1 := v_1
17155 zero := v_2
17156 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != n || auxToType(zero.Aux) != t {
17157 break
17158 }
17159 mem := zero.Args[1]
17160 dst2 := zero.Args[0]
17161 if !(zero.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero)) {
17162 break
17163 }
17164 v.reset(OpMove)
17165 v.AuxInt = int64ToAuxInt(n)
17166 v.Aux = typeToAux(t)
17167 v.AddArg3(dst1, src1, mem)
17168 return true
17169 }
17170
17171
17172
17173 for {
17174 n := auxIntToInt64(v.AuxInt)
17175 t := auxToType(v.Aux)
17176 dst1 := v_0
17177 src1 := v_1
17178 vardef := v_2
17179 if vardef.Op != OpVarDef {
17180 break
17181 }
17182 x := auxToSym(vardef.Aux)
17183 zero := vardef.Args[0]
17184 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != n || auxToType(zero.Aux) != t {
17185 break
17186 }
17187 mem := zero.Args[1]
17188 dst2 := zero.Args[0]
17189 if !(zero.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero, vardef)) {
17190 break
17191 }
17192 v.reset(OpMove)
17193 v.AuxInt = int64ToAuxInt(n)
17194 v.Aux = typeToAux(t)
17195 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
17196 v0.Aux = symToAux(x)
17197 v0.AddArg(mem)
17198 v.AddArg3(dst1, src1, v0)
17199 return true
17200 }
17201
17202
17203
17204 for {
17205 n := auxIntToInt64(v.AuxInt)
17206 t1 := auxToType(v.Aux)
17207 dst := v_0
17208 p1 := v_1
17209 mem := v_2
17210 if mem.Op != OpStore {
17211 break
17212 }
17213 t2 := auxToType(mem.Aux)
17214 _ = mem.Args[2]
17215 op2 := mem.Args[0]
17216 if op2.Op != OpOffPtr {
17217 break
17218 }
17219 tt2 := op2.Type
17220 o2 := auxIntToInt64(op2.AuxInt)
17221 p2 := op2.Args[0]
17222 d1 := mem.Args[1]
17223 mem_2 := mem.Args[2]
17224 if mem_2.Op != OpStore {
17225 break
17226 }
17227 t3 := auxToType(mem_2.Aux)
17228 d2 := mem_2.Args[1]
17229 op3 := mem_2.Args[0]
17230 if op3.Op != OpOffPtr {
17231 break
17232 }
17233 tt3 := op3.Type
17234 if auxIntToInt64(op3.AuxInt) != 0 {
17235 break
17236 }
17237 p3 := op3.Args[0]
17238 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()) {
17239 break
17240 }
17241 v.reset(OpStore)
17242 v.Aux = typeToAux(t2)
17243 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17244 v0.AuxInt = int64ToAuxInt(o2)
17245 v0.AddArg(dst)
17246 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17247 v1.Aux = typeToAux(t3)
17248 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17249 v2.AuxInt = int64ToAuxInt(0)
17250 v2.AddArg(dst)
17251 v1.AddArg3(v2, d2, mem)
17252 v.AddArg3(v0, d1, v1)
17253 return true
17254 }
17255
17256
17257
17258 for {
17259 n := auxIntToInt64(v.AuxInt)
17260 t1 := auxToType(v.Aux)
17261 dst := v_0
17262 p1 := v_1
17263 mem := v_2
17264 if mem.Op != OpStore {
17265 break
17266 }
17267 t2 := auxToType(mem.Aux)
17268 _ = mem.Args[2]
17269 op2 := mem.Args[0]
17270 if op2.Op != OpOffPtr {
17271 break
17272 }
17273 tt2 := op2.Type
17274 o2 := auxIntToInt64(op2.AuxInt)
17275 p2 := op2.Args[0]
17276 d1 := mem.Args[1]
17277 mem_2 := mem.Args[2]
17278 if mem_2.Op != OpStore {
17279 break
17280 }
17281 t3 := auxToType(mem_2.Aux)
17282 _ = mem_2.Args[2]
17283 op3 := mem_2.Args[0]
17284 if op3.Op != OpOffPtr {
17285 break
17286 }
17287 tt3 := op3.Type
17288 o3 := auxIntToInt64(op3.AuxInt)
17289 p3 := op3.Args[0]
17290 d2 := mem_2.Args[1]
17291 mem_2_2 := mem_2.Args[2]
17292 if mem_2_2.Op != OpStore {
17293 break
17294 }
17295 t4 := auxToType(mem_2_2.Aux)
17296 d3 := mem_2_2.Args[1]
17297 op4 := mem_2_2.Args[0]
17298 if op4.Op != OpOffPtr {
17299 break
17300 }
17301 tt4 := op4.Type
17302 if auxIntToInt64(op4.AuxInt) != 0 {
17303 break
17304 }
17305 p4 := op4.Args[0]
17306 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()) {
17307 break
17308 }
17309 v.reset(OpStore)
17310 v.Aux = typeToAux(t2)
17311 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17312 v0.AuxInt = int64ToAuxInt(o2)
17313 v0.AddArg(dst)
17314 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17315 v1.Aux = typeToAux(t3)
17316 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17317 v2.AuxInt = int64ToAuxInt(o3)
17318 v2.AddArg(dst)
17319 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17320 v3.Aux = typeToAux(t4)
17321 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17322 v4.AuxInt = int64ToAuxInt(0)
17323 v4.AddArg(dst)
17324 v3.AddArg3(v4, d3, mem)
17325 v1.AddArg3(v2, d2, v3)
17326 v.AddArg3(v0, d1, v1)
17327 return true
17328 }
17329
17330
17331
17332 for {
17333 n := auxIntToInt64(v.AuxInt)
17334 t1 := auxToType(v.Aux)
17335 dst := v_0
17336 p1 := v_1
17337 mem := v_2
17338 if mem.Op != OpStore {
17339 break
17340 }
17341 t2 := auxToType(mem.Aux)
17342 _ = mem.Args[2]
17343 op2 := mem.Args[0]
17344 if op2.Op != OpOffPtr {
17345 break
17346 }
17347 tt2 := op2.Type
17348 o2 := auxIntToInt64(op2.AuxInt)
17349 p2 := op2.Args[0]
17350 d1 := mem.Args[1]
17351 mem_2 := mem.Args[2]
17352 if mem_2.Op != OpStore {
17353 break
17354 }
17355 t3 := auxToType(mem_2.Aux)
17356 _ = mem_2.Args[2]
17357 op3 := mem_2.Args[0]
17358 if op3.Op != OpOffPtr {
17359 break
17360 }
17361 tt3 := op3.Type
17362 o3 := auxIntToInt64(op3.AuxInt)
17363 p3 := op3.Args[0]
17364 d2 := mem_2.Args[1]
17365 mem_2_2 := mem_2.Args[2]
17366 if mem_2_2.Op != OpStore {
17367 break
17368 }
17369 t4 := auxToType(mem_2_2.Aux)
17370 _ = mem_2_2.Args[2]
17371 op4 := mem_2_2.Args[0]
17372 if op4.Op != OpOffPtr {
17373 break
17374 }
17375 tt4 := op4.Type
17376 o4 := auxIntToInt64(op4.AuxInt)
17377 p4 := op4.Args[0]
17378 d3 := mem_2_2.Args[1]
17379 mem_2_2_2 := mem_2_2.Args[2]
17380 if mem_2_2_2.Op != OpStore {
17381 break
17382 }
17383 t5 := auxToType(mem_2_2_2.Aux)
17384 d4 := mem_2_2_2.Args[1]
17385 op5 := mem_2_2_2.Args[0]
17386 if op5.Op != OpOffPtr {
17387 break
17388 }
17389 tt5 := op5.Type
17390 if auxIntToInt64(op5.AuxInt) != 0 {
17391 break
17392 }
17393 p5 := op5.Args[0]
17394 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()) {
17395 break
17396 }
17397 v.reset(OpStore)
17398 v.Aux = typeToAux(t2)
17399 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17400 v0.AuxInt = int64ToAuxInt(o2)
17401 v0.AddArg(dst)
17402 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17403 v1.Aux = typeToAux(t3)
17404 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17405 v2.AuxInt = int64ToAuxInt(o3)
17406 v2.AddArg(dst)
17407 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17408 v3.Aux = typeToAux(t4)
17409 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17410 v4.AuxInt = int64ToAuxInt(o4)
17411 v4.AddArg(dst)
17412 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17413 v5.Aux = typeToAux(t5)
17414 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
17415 v6.AuxInt = int64ToAuxInt(0)
17416 v6.AddArg(dst)
17417 v5.AddArg3(v6, d4, mem)
17418 v3.AddArg3(v4, d3, v5)
17419 v1.AddArg3(v2, d2, v3)
17420 v.AddArg3(v0, d1, v1)
17421 return true
17422 }
17423
17424
17425
17426 for {
17427 n := auxIntToInt64(v.AuxInt)
17428 t1 := auxToType(v.Aux)
17429 dst := v_0
17430 p1 := v_1
17431 mem := v_2
17432 if mem.Op != OpVarDef {
17433 break
17434 }
17435 mem_0 := mem.Args[0]
17436 if mem_0.Op != OpStore {
17437 break
17438 }
17439 t2 := auxToType(mem_0.Aux)
17440 _ = mem_0.Args[2]
17441 op2 := mem_0.Args[0]
17442 if op2.Op != OpOffPtr {
17443 break
17444 }
17445 tt2 := op2.Type
17446 o2 := auxIntToInt64(op2.AuxInt)
17447 p2 := op2.Args[0]
17448 d1 := mem_0.Args[1]
17449 mem_0_2 := mem_0.Args[2]
17450 if mem_0_2.Op != OpStore {
17451 break
17452 }
17453 t3 := auxToType(mem_0_2.Aux)
17454 d2 := mem_0_2.Args[1]
17455 op3 := mem_0_2.Args[0]
17456 if op3.Op != OpOffPtr {
17457 break
17458 }
17459 tt3 := op3.Type
17460 if auxIntToInt64(op3.AuxInt) != 0 {
17461 break
17462 }
17463 p3 := op3.Args[0]
17464 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()) {
17465 break
17466 }
17467 v.reset(OpStore)
17468 v.Aux = typeToAux(t2)
17469 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17470 v0.AuxInt = int64ToAuxInt(o2)
17471 v0.AddArg(dst)
17472 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17473 v1.Aux = typeToAux(t3)
17474 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17475 v2.AuxInt = int64ToAuxInt(0)
17476 v2.AddArg(dst)
17477 v1.AddArg3(v2, d2, mem)
17478 v.AddArg3(v0, d1, v1)
17479 return true
17480 }
17481
17482
17483
17484 for {
17485 n := auxIntToInt64(v.AuxInt)
17486 t1 := auxToType(v.Aux)
17487 dst := v_0
17488 p1 := v_1
17489 mem := v_2
17490 if mem.Op != OpVarDef {
17491 break
17492 }
17493 mem_0 := mem.Args[0]
17494 if mem_0.Op != OpStore {
17495 break
17496 }
17497 t2 := auxToType(mem_0.Aux)
17498 _ = mem_0.Args[2]
17499 op2 := mem_0.Args[0]
17500 if op2.Op != OpOffPtr {
17501 break
17502 }
17503 tt2 := op2.Type
17504 o2 := auxIntToInt64(op2.AuxInt)
17505 p2 := op2.Args[0]
17506 d1 := mem_0.Args[1]
17507 mem_0_2 := mem_0.Args[2]
17508 if mem_0_2.Op != OpStore {
17509 break
17510 }
17511 t3 := auxToType(mem_0_2.Aux)
17512 _ = mem_0_2.Args[2]
17513 op3 := mem_0_2.Args[0]
17514 if op3.Op != OpOffPtr {
17515 break
17516 }
17517 tt3 := op3.Type
17518 o3 := auxIntToInt64(op3.AuxInt)
17519 p3 := op3.Args[0]
17520 d2 := mem_0_2.Args[1]
17521 mem_0_2_2 := mem_0_2.Args[2]
17522 if mem_0_2_2.Op != OpStore {
17523 break
17524 }
17525 t4 := auxToType(mem_0_2_2.Aux)
17526 d3 := mem_0_2_2.Args[1]
17527 op4 := mem_0_2_2.Args[0]
17528 if op4.Op != OpOffPtr {
17529 break
17530 }
17531 tt4 := op4.Type
17532 if auxIntToInt64(op4.AuxInt) != 0 {
17533 break
17534 }
17535 p4 := op4.Args[0]
17536 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()) {
17537 break
17538 }
17539 v.reset(OpStore)
17540 v.Aux = typeToAux(t2)
17541 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17542 v0.AuxInt = int64ToAuxInt(o2)
17543 v0.AddArg(dst)
17544 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17545 v1.Aux = typeToAux(t3)
17546 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17547 v2.AuxInt = int64ToAuxInt(o3)
17548 v2.AddArg(dst)
17549 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17550 v3.Aux = typeToAux(t4)
17551 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17552 v4.AuxInt = int64ToAuxInt(0)
17553 v4.AddArg(dst)
17554 v3.AddArg3(v4, d3, mem)
17555 v1.AddArg3(v2, d2, v3)
17556 v.AddArg3(v0, d1, v1)
17557 return true
17558 }
17559
17560
17561
17562 for {
17563 n := auxIntToInt64(v.AuxInt)
17564 t1 := auxToType(v.Aux)
17565 dst := v_0
17566 p1 := v_1
17567 mem := v_2
17568 if mem.Op != OpVarDef {
17569 break
17570 }
17571 mem_0 := mem.Args[0]
17572 if mem_0.Op != OpStore {
17573 break
17574 }
17575 t2 := auxToType(mem_0.Aux)
17576 _ = mem_0.Args[2]
17577 op2 := mem_0.Args[0]
17578 if op2.Op != OpOffPtr {
17579 break
17580 }
17581 tt2 := op2.Type
17582 o2 := auxIntToInt64(op2.AuxInt)
17583 p2 := op2.Args[0]
17584 d1 := mem_0.Args[1]
17585 mem_0_2 := mem_0.Args[2]
17586 if mem_0_2.Op != OpStore {
17587 break
17588 }
17589 t3 := auxToType(mem_0_2.Aux)
17590 _ = mem_0_2.Args[2]
17591 op3 := mem_0_2.Args[0]
17592 if op3.Op != OpOffPtr {
17593 break
17594 }
17595 tt3 := op3.Type
17596 o3 := auxIntToInt64(op3.AuxInt)
17597 p3 := op3.Args[0]
17598 d2 := mem_0_2.Args[1]
17599 mem_0_2_2 := mem_0_2.Args[2]
17600 if mem_0_2_2.Op != OpStore {
17601 break
17602 }
17603 t4 := auxToType(mem_0_2_2.Aux)
17604 _ = mem_0_2_2.Args[2]
17605 op4 := mem_0_2_2.Args[0]
17606 if op4.Op != OpOffPtr {
17607 break
17608 }
17609 tt4 := op4.Type
17610 o4 := auxIntToInt64(op4.AuxInt)
17611 p4 := op4.Args[0]
17612 d3 := mem_0_2_2.Args[1]
17613 mem_0_2_2_2 := mem_0_2_2.Args[2]
17614 if mem_0_2_2_2.Op != OpStore {
17615 break
17616 }
17617 t5 := auxToType(mem_0_2_2_2.Aux)
17618 d4 := mem_0_2_2_2.Args[1]
17619 op5 := mem_0_2_2_2.Args[0]
17620 if op5.Op != OpOffPtr {
17621 break
17622 }
17623 tt5 := op5.Type
17624 if auxIntToInt64(op5.AuxInt) != 0 {
17625 break
17626 }
17627 p5 := op5.Args[0]
17628 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()) {
17629 break
17630 }
17631 v.reset(OpStore)
17632 v.Aux = typeToAux(t2)
17633 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17634 v0.AuxInt = int64ToAuxInt(o2)
17635 v0.AddArg(dst)
17636 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17637 v1.Aux = typeToAux(t3)
17638 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17639 v2.AuxInt = int64ToAuxInt(o3)
17640 v2.AddArg(dst)
17641 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17642 v3.Aux = typeToAux(t4)
17643 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17644 v4.AuxInt = int64ToAuxInt(o4)
17645 v4.AddArg(dst)
17646 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17647 v5.Aux = typeToAux(t5)
17648 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
17649 v6.AuxInt = int64ToAuxInt(0)
17650 v6.AddArg(dst)
17651 v5.AddArg3(v6, d4, mem)
17652 v3.AddArg3(v4, d3, v5)
17653 v1.AddArg3(v2, d2, v3)
17654 v.AddArg3(v0, d1, v1)
17655 return true
17656 }
17657
17658
17659
17660 for {
17661 n := auxIntToInt64(v.AuxInt)
17662 t1 := auxToType(v.Aux)
17663 dst := v_0
17664 p1 := v_1
17665 mem := v_2
17666 if mem.Op != OpStore {
17667 break
17668 }
17669 t2 := auxToType(mem.Aux)
17670 _ = mem.Args[2]
17671 op2 := mem.Args[0]
17672 if op2.Op != OpOffPtr {
17673 break
17674 }
17675 tt2 := op2.Type
17676 o2 := auxIntToInt64(op2.AuxInt)
17677 p2 := op2.Args[0]
17678 d1 := mem.Args[1]
17679 mem_2 := mem.Args[2]
17680 if mem_2.Op != OpZero || auxIntToInt64(mem_2.AuxInt) != n {
17681 break
17682 }
17683 t3 := auxToType(mem_2.Aux)
17684 p3 := mem_2.Args[0]
17685 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && registerizable(b, t2) && n >= o2+t2.Size()) {
17686 break
17687 }
17688 v.reset(OpStore)
17689 v.Aux = typeToAux(t2)
17690 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17691 v0.AuxInt = int64ToAuxInt(o2)
17692 v0.AddArg(dst)
17693 v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17694 v1.AuxInt = int64ToAuxInt(n)
17695 v1.Aux = typeToAux(t1)
17696 v1.AddArg2(dst, mem)
17697 v.AddArg3(v0, d1, v1)
17698 return true
17699 }
17700
17701
17702
17703 for {
17704 n := auxIntToInt64(v.AuxInt)
17705 t1 := auxToType(v.Aux)
17706 dst := v_0
17707 p1 := v_1
17708 mem := v_2
17709 if mem.Op != OpStore {
17710 break
17711 }
17712 t2 := auxToType(mem.Aux)
17713 _ = mem.Args[2]
17714 mem_0 := mem.Args[0]
17715 if mem_0.Op != OpOffPtr {
17716 break
17717 }
17718 tt2 := mem_0.Type
17719 o2 := auxIntToInt64(mem_0.AuxInt)
17720 p2 := mem_0.Args[0]
17721 d1 := mem.Args[1]
17722 mem_2 := mem.Args[2]
17723 if mem_2.Op != OpStore {
17724 break
17725 }
17726 t3 := auxToType(mem_2.Aux)
17727 _ = mem_2.Args[2]
17728 mem_2_0 := mem_2.Args[0]
17729 if mem_2_0.Op != OpOffPtr {
17730 break
17731 }
17732 tt3 := mem_2_0.Type
17733 o3 := auxIntToInt64(mem_2_0.AuxInt)
17734 p3 := mem_2_0.Args[0]
17735 d2 := mem_2.Args[1]
17736 mem_2_2 := mem_2.Args[2]
17737 if mem_2_2.Op != OpZero || auxIntToInt64(mem_2_2.AuxInt) != n {
17738 break
17739 }
17740 t4 := auxToType(mem_2_2.Aux)
17741 p4 := mem_2_2.Args[0]
17742 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()) {
17743 break
17744 }
17745 v.reset(OpStore)
17746 v.Aux = typeToAux(t2)
17747 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17748 v0.AuxInt = int64ToAuxInt(o2)
17749 v0.AddArg(dst)
17750 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17751 v1.Aux = typeToAux(t3)
17752 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17753 v2.AuxInt = int64ToAuxInt(o3)
17754 v2.AddArg(dst)
17755 v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17756 v3.AuxInt = int64ToAuxInt(n)
17757 v3.Aux = typeToAux(t1)
17758 v3.AddArg2(dst, mem)
17759 v1.AddArg3(v2, d2, v3)
17760 v.AddArg3(v0, d1, v1)
17761 return true
17762 }
17763
17764
17765
17766 for {
17767 n := auxIntToInt64(v.AuxInt)
17768 t1 := auxToType(v.Aux)
17769 dst := v_0
17770 p1 := v_1
17771 mem := v_2
17772 if mem.Op != OpStore {
17773 break
17774 }
17775 t2 := auxToType(mem.Aux)
17776 _ = mem.Args[2]
17777 mem_0 := mem.Args[0]
17778 if mem_0.Op != OpOffPtr {
17779 break
17780 }
17781 tt2 := mem_0.Type
17782 o2 := auxIntToInt64(mem_0.AuxInt)
17783 p2 := mem_0.Args[0]
17784 d1 := mem.Args[1]
17785 mem_2 := mem.Args[2]
17786 if mem_2.Op != OpStore {
17787 break
17788 }
17789 t3 := auxToType(mem_2.Aux)
17790 _ = mem_2.Args[2]
17791 mem_2_0 := mem_2.Args[0]
17792 if mem_2_0.Op != OpOffPtr {
17793 break
17794 }
17795 tt3 := mem_2_0.Type
17796 o3 := auxIntToInt64(mem_2_0.AuxInt)
17797 p3 := mem_2_0.Args[0]
17798 d2 := mem_2.Args[1]
17799 mem_2_2 := mem_2.Args[2]
17800 if mem_2_2.Op != OpStore {
17801 break
17802 }
17803 t4 := auxToType(mem_2_2.Aux)
17804 _ = mem_2_2.Args[2]
17805 mem_2_2_0 := mem_2_2.Args[0]
17806 if mem_2_2_0.Op != OpOffPtr {
17807 break
17808 }
17809 tt4 := mem_2_2_0.Type
17810 o4 := auxIntToInt64(mem_2_2_0.AuxInt)
17811 p4 := mem_2_2_0.Args[0]
17812 d3 := mem_2_2.Args[1]
17813 mem_2_2_2 := mem_2_2.Args[2]
17814 if mem_2_2_2.Op != OpZero || auxIntToInt64(mem_2_2_2.AuxInt) != n {
17815 break
17816 }
17817 t5 := auxToType(mem_2_2_2.Aux)
17818 p5 := mem_2_2_2.Args[0]
17819 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()) {
17820 break
17821 }
17822 v.reset(OpStore)
17823 v.Aux = typeToAux(t2)
17824 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17825 v0.AuxInt = int64ToAuxInt(o2)
17826 v0.AddArg(dst)
17827 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17828 v1.Aux = typeToAux(t3)
17829 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17830 v2.AuxInt = int64ToAuxInt(o3)
17831 v2.AddArg(dst)
17832 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17833 v3.Aux = typeToAux(t4)
17834 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17835 v4.AuxInt = int64ToAuxInt(o4)
17836 v4.AddArg(dst)
17837 v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17838 v5.AuxInt = int64ToAuxInt(n)
17839 v5.Aux = typeToAux(t1)
17840 v5.AddArg2(dst, mem)
17841 v3.AddArg3(v4, d3, v5)
17842 v1.AddArg3(v2, d2, v3)
17843 v.AddArg3(v0, d1, v1)
17844 return true
17845 }
17846
17847
17848
17849 for {
17850 n := auxIntToInt64(v.AuxInt)
17851 t1 := auxToType(v.Aux)
17852 dst := v_0
17853 p1 := v_1
17854 mem := v_2
17855 if mem.Op != OpStore {
17856 break
17857 }
17858 t2 := auxToType(mem.Aux)
17859 _ = mem.Args[2]
17860 mem_0 := mem.Args[0]
17861 if mem_0.Op != OpOffPtr {
17862 break
17863 }
17864 tt2 := mem_0.Type
17865 o2 := auxIntToInt64(mem_0.AuxInt)
17866 p2 := mem_0.Args[0]
17867 d1 := mem.Args[1]
17868 mem_2 := mem.Args[2]
17869 if mem_2.Op != OpStore {
17870 break
17871 }
17872 t3 := auxToType(mem_2.Aux)
17873 _ = mem_2.Args[2]
17874 mem_2_0 := mem_2.Args[0]
17875 if mem_2_0.Op != OpOffPtr {
17876 break
17877 }
17878 tt3 := mem_2_0.Type
17879 o3 := auxIntToInt64(mem_2_0.AuxInt)
17880 p3 := mem_2_0.Args[0]
17881 d2 := mem_2.Args[1]
17882 mem_2_2 := mem_2.Args[2]
17883 if mem_2_2.Op != OpStore {
17884 break
17885 }
17886 t4 := auxToType(mem_2_2.Aux)
17887 _ = mem_2_2.Args[2]
17888 mem_2_2_0 := mem_2_2.Args[0]
17889 if mem_2_2_0.Op != OpOffPtr {
17890 break
17891 }
17892 tt4 := mem_2_2_0.Type
17893 o4 := auxIntToInt64(mem_2_2_0.AuxInt)
17894 p4 := mem_2_2_0.Args[0]
17895 d3 := mem_2_2.Args[1]
17896 mem_2_2_2 := mem_2_2.Args[2]
17897 if mem_2_2_2.Op != OpStore {
17898 break
17899 }
17900 t5 := auxToType(mem_2_2_2.Aux)
17901 _ = mem_2_2_2.Args[2]
17902 mem_2_2_2_0 := mem_2_2_2.Args[0]
17903 if mem_2_2_2_0.Op != OpOffPtr {
17904 break
17905 }
17906 tt5 := mem_2_2_2_0.Type
17907 o5 := auxIntToInt64(mem_2_2_2_0.AuxInt)
17908 p5 := mem_2_2_2_0.Args[0]
17909 d4 := mem_2_2_2.Args[1]
17910 mem_2_2_2_2 := mem_2_2_2.Args[2]
17911 if mem_2_2_2_2.Op != OpZero || auxIntToInt64(mem_2_2_2_2.AuxInt) != n {
17912 break
17913 }
17914 t6 := auxToType(mem_2_2_2_2.Aux)
17915 p6 := mem_2_2_2_2.Args[0]
17916 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()) {
17917 break
17918 }
17919 v.reset(OpStore)
17920 v.Aux = typeToAux(t2)
17921 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17922 v0.AuxInt = int64ToAuxInt(o2)
17923 v0.AddArg(dst)
17924 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17925 v1.Aux = typeToAux(t3)
17926 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17927 v2.AuxInt = int64ToAuxInt(o3)
17928 v2.AddArg(dst)
17929 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17930 v3.Aux = typeToAux(t4)
17931 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17932 v4.AuxInt = int64ToAuxInt(o4)
17933 v4.AddArg(dst)
17934 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17935 v5.Aux = typeToAux(t5)
17936 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
17937 v6.AuxInt = int64ToAuxInt(o5)
17938 v6.AddArg(dst)
17939 v7 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17940 v7.AuxInt = int64ToAuxInt(n)
17941 v7.Aux = typeToAux(t1)
17942 v7.AddArg2(dst, mem)
17943 v5.AddArg3(v6, d4, v7)
17944 v3.AddArg3(v4, d3, v5)
17945 v1.AddArg3(v2, d2, v3)
17946 v.AddArg3(v0, d1, v1)
17947 return true
17948 }
17949
17950
17951
17952 for {
17953 n := auxIntToInt64(v.AuxInt)
17954 t1 := auxToType(v.Aux)
17955 dst := v_0
17956 p1 := v_1
17957 mem := v_2
17958 if mem.Op != OpVarDef {
17959 break
17960 }
17961 mem_0 := mem.Args[0]
17962 if mem_0.Op != OpStore {
17963 break
17964 }
17965 t2 := auxToType(mem_0.Aux)
17966 _ = mem_0.Args[2]
17967 op2 := mem_0.Args[0]
17968 if op2.Op != OpOffPtr {
17969 break
17970 }
17971 tt2 := op2.Type
17972 o2 := auxIntToInt64(op2.AuxInt)
17973 p2 := op2.Args[0]
17974 d1 := mem_0.Args[1]
17975 mem_0_2 := mem_0.Args[2]
17976 if mem_0_2.Op != OpZero || auxIntToInt64(mem_0_2.AuxInt) != n {
17977 break
17978 }
17979 t3 := auxToType(mem_0_2.Aux)
17980 p3 := mem_0_2.Args[0]
17981 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && registerizable(b, t2) && n >= o2+t2.Size()) {
17982 break
17983 }
17984 v.reset(OpStore)
17985 v.Aux = typeToAux(t2)
17986 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17987 v0.AuxInt = int64ToAuxInt(o2)
17988 v0.AddArg(dst)
17989 v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17990 v1.AuxInt = int64ToAuxInt(n)
17991 v1.Aux = typeToAux(t1)
17992 v1.AddArg2(dst, mem)
17993 v.AddArg3(v0, d1, v1)
17994 return true
17995 }
17996
17997
17998
17999 for {
18000 n := auxIntToInt64(v.AuxInt)
18001 t1 := auxToType(v.Aux)
18002 dst := v_0
18003 p1 := v_1
18004 mem := v_2
18005 if mem.Op != OpVarDef {
18006 break
18007 }
18008 mem_0 := mem.Args[0]
18009 if mem_0.Op != OpStore {
18010 break
18011 }
18012 t2 := auxToType(mem_0.Aux)
18013 _ = mem_0.Args[2]
18014 mem_0_0 := mem_0.Args[0]
18015 if mem_0_0.Op != OpOffPtr {
18016 break
18017 }
18018 tt2 := mem_0_0.Type
18019 o2 := auxIntToInt64(mem_0_0.AuxInt)
18020 p2 := mem_0_0.Args[0]
18021 d1 := mem_0.Args[1]
18022 mem_0_2 := mem_0.Args[2]
18023 if mem_0_2.Op != OpStore {
18024 break
18025 }
18026 t3 := auxToType(mem_0_2.Aux)
18027 _ = mem_0_2.Args[2]
18028 mem_0_2_0 := mem_0_2.Args[0]
18029 if mem_0_2_0.Op != OpOffPtr {
18030 break
18031 }
18032 tt3 := mem_0_2_0.Type
18033 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
18034 p3 := mem_0_2_0.Args[0]
18035 d2 := mem_0_2.Args[1]
18036 mem_0_2_2 := mem_0_2.Args[2]
18037 if mem_0_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2.AuxInt) != n {
18038 break
18039 }
18040 t4 := auxToType(mem_0_2_2.Aux)
18041 p4 := mem_0_2_2.Args[0]
18042 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()) {
18043 break
18044 }
18045 v.reset(OpStore)
18046 v.Aux = typeToAux(t2)
18047 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
18048 v0.AuxInt = int64ToAuxInt(o2)
18049 v0.AddArg(dst)
18050 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18051 v1.Aux = typeToAux(t3)
18052 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
18053 v2.AuxInt = int64ToAuxInt(o3)
18054 v2.AddArg(dst)
18055 v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
18056 v3.AuxInt = int64ToAuxInt(n)
18057 v3.Aux = typeToAux(t1)
18058 v3.AddArg2(dst, mem)
18059 v1.AddArg3(v2, d2, v3)
18060 v.AddArg3(v0, d1, v1)
18061 return true
18062 }
18063
18064
18065
18066 for {
18067 n := auxIntToInt64(v.AuxInt)
18068 t1 := auxToType(v.Aux)
18069 dst := v_0
18070 p1 := v_1
18071 mem := v_2
18072 if mem.Op != OpVarDef {
18073 break
18074 }
18075 mem_0 := mem.Args[0]
18076 if mem_0.Op != OpStore {
18077 break
18078 }
18079 t2 := auxToType(mem_0.Aux)
18080 _ = mem_0.Args[2]
18081 mem_0_0 := mem_0.Args[0]
18082 if mem_0_0.Op != OpOffPtr {
18083 break
18084 }
18085 tt2 := mem_0_0.Type
18086 o2 := auxIntToInt64(mem_0_0.AuxInt)
18087 p2 := mem_0_0.Args[0]
18088 d1 := mem_0.Args[1]
18089 mem_0_2 := mem_0.Args[2]
18090 if mem_0_2.Op != OpStore {
18091 break
18092 }
18093 t3 := auxToType(mem_0_2.Aux)
18094 _ = mem_0_2.Args[2]
18095 mem_0_2_0 := mem_0_2.Args[0]
18096 if mem_0_2_0.Op != OpOffPtr {
18097 break
18098 }
18099 tt3 := mem_0_2_0.Type
18100 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
18101 p3 := mem_0_2_0.Args[0]
18102 d2 := mem_0_2.Args[1]
18103 mem_0_2_2 := mem_0_2.Args[2]
18104 if mem_0_2_2.Op != OpStore {
18105 break
18106 }
18107 t4 := auxToType(mem_0_2_2.Aux)
18108 _ = mem_0_2_2.Args[2]
18109 mem_0_2_2_0 := mem_0_2_2.Args[0]
18110 if mem_0_2_2_0.Op != OpOffPtr {
18111 break
18112 }
18113 tt4 := mem_0_2_2_0.Type
18114 o4 := auxIntToInt64(mem_0_2_2_0.AuxInt)
18115 p4 := mem_0_2_2_0.Args[0]
18116 d3 := mem_0_2_2.Args[1]
18117 mem_0_2_2_2 := mem_0_2_2.Args[2]
18118 if mem_0_2_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2_2.AuxInt) != n {
18119 break
18120 }
18121 t5 := auxToType(mem_0_2_2_2.Aux)
18122 p5 := mem_0_2_2_2.Args[0]
18123 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()) {
18124 break
18125 }
18126 v.reset(OpStore)
18127 v.Aux = typeToAux(t2)
18128 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
18129 v0.AuxInt = int64ToAuxInt(o2)
18130 v0.AddArg(dst)
18131 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18132 v1.Aux = typeToAux(t3)
18133 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
18134 v2.AuxInt = int64ToAuxInt(o3)
18135 v2.AddArg(dst)
18136 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18137 v3.Aux = typeToAux(t4)
18138 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
18139 v4.AuxInt = int64ToAuxInt(o4)
18140 v4.AddArg(dst)
18141 v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
18142 v5.AuxInt = int64ToAuxInt(n)
18143 v5.Aux = typeToAux(t1)
18144 v5.AddArg2(dst, mem)
18145 v3.AddArg3(v4, d3, v5)
18146 v1.AddArg3(v2, d2, v3)
18147 v.AddArg3(v0, d1, v1)
18148 return true
18149 }
18150
18151
18152
18153 for {
18154 n := auxIntToInt64(v.AuxInt)
18155 t1 := auxToType(v.Aux)
18156 dst := v_0
18157 p1 := v_1
18158 mem := v_2
18159 if mem.Op != OpVarDef {
18160 break
18161 }
18162 mem_0 := mem.Args[0]
18163 if mem_0.Op != OpStore {
18164 break
18165 }
18166 t2 := auxToType(mem_0.Aux)
18167 _ = mem_0.Args[2]
18168 mem_0_0 := mem_0.Args[0]
18169 if mem_0_0.Op != OpOffPtr {
18170 break
18171 }
18172 tt2 := mem_0_0.Type
18173 o2 := auxIntToInt64(mem_0_0.AuxInt)
18174 p2 := mem_0_0.Args[0]
18175 d1 := mem_0.Args[1]
18176 mem_0_2 := mem_0.Args[2]
18177 if mem_0_2.Op != OpStore {
18178 break
18179 }
18180 t3 := auxToType(mem_0_2.Aux)
18181 _ = mem_0_2.Args[2]
18182 mem_0_2_0 := mem_0_2.Args[0]
18183 if mem_0_2_0.Op != OpOffPtr {
18184 break
18185 }
18186 tt3 := mem_0_2_0.Type
18187 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
18188 p3 := mem_0_2_0.Args[0]
18189 d2 := mem_0_2.Args[1]
18190 mem_0_2_2 := mem_0_2.Args[2]
18191 if mem_0_2_2.Op != OpStore {
18192 break
18193 }
18194 t4 := auxToType(mem_0_2_2.Aux)
18195 _ = mem_0_2_2.Args[2]
18196 mem_0_2_2_0 := mem_0_2_2.Args[0]
18197 if mem_0_2_2_0.Op != OpOffPtr {
18198 break
18199 }
18200 tt4 := mem_0_2_2_0.Type
18201 o4 := auxIntToInt64(mem_0_2_2_0.AuxInt)
18202 p4 := mem_0_2_2_0.Args[0]
18203 d3 := mem_0_2_2.Args[1]
18204 mem_0_2_2_2 := mem_0_2_2.Args[2]
18205 if mem_0_2_2_2.Op != OpStore {
18206 break
18207 }
18208 t5 := auxToType(mem_0_2_2_2.Aux)
18209 _ = mem_0_2_2_2.Args[2]
18210 mem_0_2_2_2_0 := mem_0_2_2_2.Args[0]
18211 if mem_0_2_2_2_0.Op != OpOffPtr {
18212 break
18213 }
18214 tt5 := mem_0_2_2_2_0.Type
18215 o5 := auxIntToInt64(mem_0_2_2_2_0.AuxInt)
18216 p5 := mem_0_2_2_2_0.Args[0]
18217 d4 := mem_0_2_2_2.Args[1]
18218 mem_0_2_2_2_2 := mem_0_2_2_2.Args[2]
18219 if mem_0_2_2_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2_2_2.AuxInt) != n {
18220 break
18221 }
18222 t6 := auxToType(mem_0_2_2_2_2.Aux)
18223 p6 := mem_0_2_2_2_2.Args[0]
18224 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()) {
18225 break
18226 }
18227 v.reset(OpStore)
18228 v.Aux = typeToAux(t2)
18229 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
18230 v0.AuxInt = int64ToAuxInt(o2)
18231 v0.AddArg(dst)
18232 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18233 v1.Aux = typeToAux(t3)
18234 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
18235 v2.AuxInt = int64ToAuxInt(o3)
18236 v2.AddArg(dst)
18237 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18238 v3.Aux = typeToAux(t4)
18239 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
18240 v4.AuxInt = int64ToAuxInt(o4)
18241 v4.AddArg(dst)
18242 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18243 v5.Aux = typeToAux(t5)
18244 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
18245 v6.AuxInt = int64ToAuxInt(o5)
18246 v6.AddArg(dst)
18247 v7 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
18248 v7.AuxInt = int64ToAuxInt(n)
18249 v7.Aux = typeToAux(t1)
18250 v7.AddArg2(dst, mem)
18251 v5.AddArg3(v6, d4, v7)
18252 v3.AddArg3(v4, d3, v5)
18253 v1.AddArg3(v2, d2, v3)
18254 v.AddArg3(v0, d1, v1)
18255 return true
18256 }
18257
18258
18259
18260 for {
18261 s := auxIntToInt64(v.AuxInt)
18262 t1 := auxToType(v.Aux)
18263 dst := v_0
18264 tmp1 := v_1
18265 midmem := v_2
18266 if midmem.Op != OpMove || auxIntToInt64(midmem.AuxInt) != s {
18267 break
18268 }
18269 t2 := auxToType(midmem.Aux)
18270 src := midmem.Args[1]
18271 tmp2 := midmem.Args[0]
18272 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))) {
18273 break
18274 }
18275 v.reset(OpMove)
18276 v.AuxInt = int64ToAuxInt(s)
18277 v.Aux = typeToAux(t1)
18278 v.AddArg3(dst, src, midmem)
18279 return true
18280 }
18281
18282
18283
18284 for {
18285 s := auxIntToInt64(v.AuxInt)
18286 t1 := auxToType(v.Aux)
18287 dst := v_0
18288 tmp1 := v_1
18289 midmem := v_2
18290 if midmem.Op != OpVarDef {
18291 break
18292 }
18293 midmem_0 := midmem.Args[0]
18294 if midmem_0.Op != OpMove || auxIntToInt64(midmem_0.AuxInt) != s {
18295 break
18296 }
18297 t2 := auxToType(midmem_0.Aux)
18298 src := midmem_0.Args[1]
18299 tmp2 := midmem_0.Args[0]
18300 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))) {
18301 break
18302 }
18303 v.reset(OpMove)
18304 v.AuxInt = int64ToAuxInt(s)
18305 v.Aux = typeToAux(t1)
18306 v.AddArg3(dst, src, midmem)
18307 return true
18308 }
18309
18310
18311
18312 for {
18313 dst := v_0
18314 src := v_1
18315 mem := v_2
18316 if !(isSamePtr(dst, src)) {
18317 break
18318 }
18319 v.copyOf(mem)
18320 return true
18321 }
18322 return false
18323 }
18324 func rewriteValuegeneric_OpMul16(v *Value) bool {
18325 v_1 := v.Args[1]
18326 v_0 := v.Args[0]
18327 b := v.Block
18328 typ := &b.Func.Config.Types
18329
18330
18331 for {
18332 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18333 if v_0.Op != OpConst16 {
18334 continue
18335 }
18336 c := auxIntToInt16(v_0.AuxInt)
18337 if v_1.Op != OpConst16 {
18338 continue
18339 }
18340 d := auxIntToInt16(v_1.AuxInt)
18341 v.reset(OpConst16)
18342 v.AuxInt = int16ToAuxInt(c * d)
18343 return true
18344 }
18345 break
18346 }
18347
18348
18349 for {
18350 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18351 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 1 {
18352 continue
18353 }
18354 x := v_1
18355 v.copyOf(x)
18356 return true
18357 }
18358 break
18359 }
18360
18361
18362 for {
18363 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18364 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
18365 continue
18366 }
18367 x := v_1
18368 v.reset(OpNeg16)
18369 v.AddArg(x)
18370 return true
18371 }
18372 break
18373 }
18374
18375
18376 for {
18377 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18378 if v_0.Op != OpConst16 {
18379 continue
18380 }
18381 t := v_0.Type
18382 c := auxIntToInt16(v_0.AuxInt)
18383 if v_1.Op != OpNeg16 {
18384 continue
18385 }
18386 x := v_1.Args[0]
18387 v.reset(OpMul16)
18388 v0 := b.NewValue0(v.Pos, OpConst16, t)
18389 v0.AuxInt = int16ToAuxInt(-c)
18390 v.AddArg2(x, v0)
18391 return true
18392 }
18393 break
18394 }
18395
18396
18397 for {
18398 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18399 if v_0.Op != OpNeg16 {
18400 continue
18401 }
18402 x := v_0.Args[0]
18403 if v_1.Op != OpNeg16 {
18404 continue
18405 }
18406 y := v_1.Args[0]
18407 v.reset(OpMul16)
18408 v.AddArg2(x, y)
18409 return true
18410 }
18411 break
18412 }
18413
18414
18415
18416 for {
18417 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18418 if v_0.Op != OpConst16 {
18419 continue
18420 }
18421 t := v_0.Type
18422 c := auxIntToInt16(v_0.AuxInt)
18423 if v_1.Op != OpAdd16 || v_1.Type != t {
18424 continue
18425 }
18426 _ = v_1.Args[1]
18427 v_1_0 := v_1.Args[0]
18428 v_1_1 := v_1.Args[1]
18429 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18430 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
18431 continue
18432 }
18433 d := auxIntToInt16(v_1_0.AuxInt)
18434 x := v_1_1
18435 if !(!isPowerOfTwo(c)) {
18436 continue
18437 }
18438 v.reset(OpAdd16)
18439 v0 := b.NewValue0(v.Pos, OpConst16, t)
18440 v0.AuxInt = int16ToAuxInt(c * d)
18441 v1 := b.NewValue0(v.Pos, OpMul16, t)
18442 v2 := b.NewValue0(v.Pos, OpConst16, t)
18443 v2.AuxInt = int16ToAuxInt(c)
18444 v1.AddArg2(v2, x)
18445 v.AddArg2(v0, v1)
18446 return true
18447 }
18448 }
18449 break
18450 }
18451
18452
18453 for {
18454 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18455 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
18456 continue
18457 }
18458 v.reset(OpConst16)
18459 v.AuxInt = int16ToAuxInt(0)
18460 return true
18461 }
18462 break
18463 }
18464
18465
18466
18467 for {
18468 t := v.Type
18469 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18470 x := v_0
18471 if v_1.Op != OpConst16 {
18472 continue
18473 }
18474 c := auxIntToInt16(v_1.AuxInt)
18475 if !(isPowerOfTwo(uint16(c)) && v.Block.Func.pass.name != "opt") {
18476 continue
18477 }
18478 v.reset(OpLsh16x64)
18479 v.Type = t
18480 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18481 v0.AuxInt = int64ToAuxInt(log16u(uint16(c)))
18482 v.AddArg2(x, v0)
18483 return true
18484 }
18485 break
18486 }
18487
18488
18489
18490 for {
18491 t := v.Type
18492 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18493 x := v_0
18494 if v_1.Op != OpConst16 {
18495 continue
18496 }
18497 c := auxIntToInt16(v_1.AuxInt)
18498 if !(isPowerOfTwo(uint16(-c)) && v.Block.Func.pass.name != "opt") {
18499 continue
18500 }
18501 v.reset(OpNeg16)
18502 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
18503 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18504 v1.AuxInt = int64ToAuxInt(log16u(uint16(-c)))
18505 v0.AddArg2(x, v1)
18506 v.AddArg(v0)
18507 return true
18508 }
18509 break
18510 }
18511
18512
18513
18514 for {
18515 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18516 if v_0.Op != OpMul16 {
18517 continue
18518 }
18519 _ = v_0.Args[1]
18520 v_0_0 := v_0.Args[0]
18521 v_0_1 := v_0.Args[1]
18522 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18523 i := v_0_0
18524 if i.Op != OpConst16 {
18525 continue
18526 }
18527 t := i.Type
18528 z := v_0_1
18529 x := v_1
18530 if !(z.Op != OpConst16 && x.Op != OpConst16) {
18531 continue
18532 }
18533 v.reset(OpMul16)
18534 v0 := b.NewValue0(v.Pos, OpMul16, t)
18535 v0.AddArg2(x, z)
18536 v.AddArg2(i, v0)
18537 return true
18538 }
18539 }
18540 break
18541 }
18542
18543
18544 for {
18545 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18546 if v_0.Op != OpConst16 {
18547 continue
18548 }
18549 t := v_0.Type
18550 c := auxIntToInt16(v_0.AuxInt)
18551 if v_1.Op != OpMul16 {
18552 continue
18553 }
18554 _ = v_1.Args[1]
18555 v_1_0 := v_1.Args[0]
18556 v_1_1 := v_1.Args[1]
18557 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18558 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
18559 continue
18560 }
18561 d := auxIntToInt16(v_1_0.AuxInt)
18562 x := v_1_1
18563 v.reset(OpMul16)
18564 v0 := b.NewValue0(v.Pos, OpConst16, t)
18565 v0.AuxInt = int16ToAuxInt(c * d)
18566 v.AddArg2(v0, x)
18567 return true
18568 }
18569 }
18570 break
18571 }
18572 return false
18573 }
18574 func rewriteValuegeneric_OpMul32(v *Value) bool {
18575 v_1 := v.Args[1]
18576 v_0 := v.Args[0]
18577 b := v.Block
18578 typ := &b.Func.Config.Types
18579
18580
18581 for {
18582 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18583 if v_0.Op != OpConst32 {
18584 continue
18585 }
18586 c := auxIntToInt32(v_0.AuxInt)
18587 if v_1.Op != OpConst32 {
18588 continue
18589 }
18590 d := auxIntToInt32(v_1.AuxInt)
18591 v.reset(OpConst32)
18592 v.AuxInt = int32ToAuxInt(c * d)
18593 return true
18594 }
18595 break
18596 }
18597
18598
18599 for {
18600 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18601 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 {
18602 continue
18603 }
18604 x := v_1
18605 v.copyOf(x)
18606 return true
18607 }
18608 break
18609 }
18610
18611
18612 for {
18613 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18614 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
18615 continue
18616 }
18617 x := v_1
18618 v.reset(OpNeg32)
18619 v.AddArg(x)
18620 return true
18621 }
18622 break
18623 }
18624
18625
18626 for {
18627 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18628 if v_0.Op != OpConst32 {
18629 continue
18630 }
18631 t := v_0.Type
18632 c := auxIntToInt32(v_0.AuxInt)
18633 if v_1.Op != OpNeg32 {
18634 continue
18635 }
18636 x := v_1.Args[0]
18637 v.reset(OpMul32)
18638 v0 := b.NewValue0(v.Pos, OpConst32, t)
18639 v0.AuxInt = int32ToAuxInt(-c)
18640 v.AddArg2(x, v0)
18641 return true
18642 }
18643 break
18644 }
18645
18646
18647 for {
18648 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18649 if v_0.Op != OpNeg32 {
18650 continue
18651 }
18652 x := v_0.Args[0]
18653 if v_1.Op != OpNeg32 {
18654 continue
18655 }
18656 y := v_1.Args[0]
18657 v.reset(OpMul32)
18658 v.AddArg2(x, y)
18659 return true
18660 }
18661 break
18662 }
18663
18664
18665
18666 for {
18667 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18668 if v_0.Op != OpConst32 {
18669 continue
18670 }
18671 t := v_0.Type
18672 c := auxIntToInt32(v_0.AuxInt)
18673 if v_1.Op != OpAdd32 || v_1.Type != t {
18674 continue
18675 }
18676 _ = v_1.Args[1]
18677 v_1_0 := v_1.Args[0]
18678 v_1_1 := v_1.Args[1]
18679 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18680 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
18681 continue
18682 }
18683 d := auxIntToInt32(v_1_0.AuxInt)
18684 x := v_1_1
18685 if !(!isPowerOfTwo(c)) {
18686 continue
18687 }
18688 v.reset(OpAdd32)
18689 v0 := b.NewValue0(v.Pos, OpConst32, t)
18690 v0.AuxInt = int32ToAuxInt(c * d)
18691 v1 := b.NewValue0(v.Pos, OpMul32, t)
18692 v2 := b.NewValue0(v.Pos, OpConst32, t)
18693 v2.AuxInt = int32ToAuxInt(c)
18694 v1.AddArg2(v2, x)
18695 v.AddArg2(v0, v1)
18696 return true
18697 }
18698 }
18699 break
18700 }
18701
18702
18703 for {
18704 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18705 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
18706 continue
18707 }
18708 v.reset(OpConst32)
18709 v.AuxInt = int32ToAuxInt(0)
18710 return true
18711 }
18712 break
18713 }
18714
18715
18716
18717 for {
18718 t := v.Type
18719 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18720 x := v_0
18721 if v_1.Op != OpConst32 {
18722 continue
18723 }
18724 c := auxIntToInt32(v_1.AuxInt)
18725 if !(isPowerOfTwo(uint32(c)) && v.Block.Func.pass.name != "opt") {
18726 continue
18727 }
18728 v.reset(OpLsh32x64)
18729 v.Type = t
18730 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18731 v0.AuxInt = int64ToAuxInt(log32u(uint32(c)))
18732 v.AddArg2(x, v0)
18733 return true
18734 }
18735 break
18736 }
18737
18738
18739
18740 for {
18741 t := v.Type
18742 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18743 x := v_0
18744 if v_1.Op != OpConst32 {
18745 continue
18746 }
18747 c := auxIntToInt32(v_1.AuxInt)
18748 if !(isPowerOfTwo(uint32(-c)) && v.Block.Func.pass.name != "opt") {
18749 continue
18750 }
18751 v.reset(OpNeg32)
18752 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
18753 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18754 v1.AuxInt = int64ToAuxInt(log32u(uint32(-c)))
18755 v0.AddArg2(x, v1)
18756 v.AddArg(v0)
18757 return true
18758 }
18759 break
18760 }
18761
18762
18763
18764 for {
18765 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18766 if v_0.Op != OpMul32 {
18767 continue
18768 }
18769 _ = v_0.Args[1]
18770 v_0_0 := v_0.Args[0]
18771 v_0_1 := v_0.Args[1]
18772 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18773 i := v_0_0
18774 if i.Op != OpConst32 {
18775 continue
18776 }
18777 t := i.Type
18778 z := v_0_1
18779 x := v_1
18780 if !(z.Op != OpConst32 && x.Op != OpConst32) {
18781 continue
18782 }
18783 v.reset(OpMul32)
18784 v0 := b.NewValue0(v.Pos, OpMul32, t)
18785 v0.AddArg2(x, z)
18786 v.AddArg2(i, v0)
18787 return true
18788 }
18789 }
18790 break
18791 }
18792
18793
18794 for {
18795 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18796 if v_0.Op != OpConst32 {
18797 continue
18798 }
18799 t := v_0.Type
18800 c := auxIntToInt32(v_0.AuxInt)
18801 if v_1.Op != OpMul32 {
18802 continue
18803 }
18804 _ = v_1.Args[1]
18805 v_1_0 := v_1.Args[0]
18806 v_1_1 := v_1.Args[1]
18807 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18808 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
18809 continue
18810 }
18811 d := auxIntToInt32(v_1_0.AuxInt)
18812 x := v_1_1
18813 v.reset(OpMul32)
18814 v0 := b.NewValue0(v.Pos, OpConst32, t)
18815 v0.AuxInt = int32ToAuxInt(c * d)
18816 v.AddArg2(v0, x)
18817 return true
18818 }
18819 }
18820 break
18821 }
18822 return false
18823 }
18824 func rewriteValuegeneric_OpMul32F(v *Value) bool {
18825 v_1 := v.Args[1]
18826 v_0 := v.Args[0]
18827
18828
18829
18830 for {
18831 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18832 if v_0.Op != OpConst32F {
18833 continue
18834 }
18835 c := auxIntToFloat32(v_0.AuxInt)
18836 if v_1.Op != OpConst32F {
18837 continue
18838 }
18839 d := auxIntToFloat32(v_1.AuxInt)
18840 if !(c*d == c*d) {
18841 continue
18842 }
18843 v.reset(OpConst32F)
18844 v.AuxInt = float32ToAuxInt(c * d)
18845 return true
18846 }
18847 break
18848 }
18849
18850
18851 for {
18852 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18853 x := v_0
18854 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != 1 {
18855 continue
18856 }
18857 v.copyOf(x)
18858 return true
18859 }
18860 break
18861 }
18862
18863
18864 for {
18865 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18866 x := v_0
18867 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != -1 {
18868 continue
18869 }
18870 v.reset(OpNeg32F)
18871 v.AddArg(x)
18872 return true
18873 }
18874 break
18875 }
18876
18877
18878 for {
18879 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18880 x := v_0
18881 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != 2 {
18882 continue
18883 }
18884 v.reset(OpAdd32F)
18885 v.AddArg2(x, x)
18886 return true
18887 }
18888 break
18889 }
18890 return false
18891 }
18892 func rewriteValuegeneric_OpMul32uhilo(v *Value) bool {
18893 v_1 := v.Args[1]
18894 v_0 := v.Args[0]
18895 b := v.Block
18896 typ := &b.Func.Config.Types
18897
18898
18899 for {
18900 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18901 if v_0.Op != OpConst32 {
18902 continue
18903 }
18904 c := auxIntToInt32(v_0.AuxInt)
18905 if v_1.Op != OpConst32 {
18906 continue
18907 }
18908 d := auxIntToInt32(v_1.AuxInt)
18909 v.reset(OpMakeTuple)
18910 v0 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
18911 v0.AuxInt = int32ToAuxInt(bitsMulU32(c, d).hi)
18912 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
18913 v1.AuxInt = int32ToAuxInt(bitsMulU32(c, d).lo)
18914 v.AddArg2(v0, v1)
18915 return true
18916 }
18917 break
18918 }
18919 return false
18920 }
18921 func rewriteValuegeneric_OpMul32uover(v *Value) bool {
18922 v_1 := v.Args[1]
18923 v_0 := v.Args[0]
18924 b := v.Block
18925 typ := &b.Func.Config.Types
18926
18927
18928 for {
18929 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18930 if v_0.Op != OpConst32 {
18931 continue
18932 }
18933 c := auxIntToInt32(v_0.AuxInt)
18934 if v_1.Op != OpConst32 {
18935 continue
18936 }
18937 d := auxIntToInt32(v_1.AuxInt)
18938 v.reset(OpMakeTuple)
18939 v0 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
18940 v0.AuxInt = int32ToAuxInt(bitsMulU32(c, d).lo)
18941 v1 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
18942 v1.AuxInt = boolToAuxInt(bitsMulU32(c, d).hi != 0)
18943 v.AddArg2(v0, v1)
18944 return true
18945 }
18946 break
18947 }
18948
18949
18950 for {
18951 t := v.Type
18952 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18953 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 {
18954 continue
18955 }
18956 x := v_1
18957 v.reset(OpMakeTuple)
18958 v0 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
18959 v0.AuxInt = boolToAuxInt(false)
18960 v.AddArg2(x, v0)
18961 return true
18962 }
18963 break
18964 }
18965
18966
18967 for {
18968 t := v.Type
18969 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18970 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
18971 continue
18972 }
18973 v.reset(OpMakeTuple)
18974 v0 := b.NewValue0(v.Pos, OpConst32, t.FieldType(0))
18975 v0.AuxInt = int32ToAuxInt(0)
18976 v1 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
18977 v1.AuxInt = boolToAuxInt(false)
18978 v.AddArg2(v0, v1)
18979 return true
18980 }
18981 break
18982 }
18983 return false
18984 }
18985 func rewriteValuegeneric_OpMul64(v *Value) bool {
18986 v_1 := v.Args[1]
18987 v_0 := v.Args[0]
18988 b := v.Block
18989 typ := &b.Func.Config.Types
18990
18991
18992 for {
18993 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18994 if v_0.Op != OpConst64 {
18995 continue
18996 }
18997 c := auxIntToInt64(v_0.AuxInt)
18998 if v_1.Op != OpConst64 {
18999 continue
19000 }
19001 d := auxIntToInt64(v_1.AuxInt)
19002 v.reset(OpConst64)
19003 v.AuxInt = int64ToAuxInt(c * d)
19004 return true
19005 }
19006 break
19007 }
19008
19009
19010 for {
19011 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19012 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 {
19013 continue
19014 }
19015 x := v_1
19016 v.copyOf(x)
19017 return true
19018 }
19019 break
19020 }
19021
19022
19023 for {
19024 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19025 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
19026 continue
19027 }
19028 x := v_1
19029 v.reset(OpNeg64)
19030 v.AddArg(x)
19031 return true
19032 }
19033 break
19034 }
19035
19036
19037 for {
19038 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19039 if v_0.Op != OpConst64 {
19040 continue
19041 }
19042 t := v_0.Type
19043 c := auxIntToInt64(v_0.AuxInt)
19044 if v_1.Op != OpNeg64 {
19045 continue
19046 }
19047 x := v_1.Args[0]
19048 v.reset(OpMul64)
19049 v0 := b.NewValue0(v.Pos, OpConst64, t)
19050 v0.AuxInt = int64ToAuxInt(-c)
19051 v.AddArg2(x, v0)
19052 return true
19053 }
19054 break
19055 }
19056
19057
19058 for {
19059 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19060 if v_0.Op != OpNeg64 {
19061 continue
19062 }
19063 x := v_0.Args[0]
19064 if v_1.Op != OpNeg64 {
19065 continue
19066 }
19067 y := v_1.Args[0]
19068 v.reset(OpMul64)
19069 v.AddArg2(x, y)
19070 return true
19071 }
19072 break
19073 }
19074
19075
19076
19077 for {
19078 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19079 if v_0.Op != OpConst64 {
19080 continue
19081 }
19082 t := v_0.Type
19083 c := auxIntToInt64(v_0.AuxInt)
19084 if v_1.Op != OpAdd64 || v_1.Type != t {
19085 continue
19086 }
19087 _ = v_1.Args[1]
19088 v_1_0 := v_1.Args[0]
19089 v_1_1 := v_1.Args[1]
19090 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19091 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
19092 continue
19093 }
19094 d := auxIntToInt64(v_1_0.AuxInt)
19095 x := v_1_1
19096 if !(!isPowerOfTwo(c)) {
19097 continue
19098 }
19099 v.reset(OpAdd64)
19100 v0 := b.NewValue0(v.Pos, OpConst64, t)
19101 v0.AuxInt = int64ToAuxInt(c * d)
19102 v1 := b.NewValue0(v.Pos, OpMul64, t)
19103 v2 := b.NewValue0(v.Pos, OpConst64, t)
19104 v2.AuxInt = int64ToAuxInt(c)
19105 v1.AddArg2(v2, x)
19106 v.AddArg2(v0, v1)
19107 return true
19108 }
19109 }
19110 break
19111 }
19112
19113
19114 for {
19115 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19116 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
19117 continue
19118 }
19119 v.reset(OpConst64)
19120 v.AuxInt = int64ToAuxInt(0)
19121 return true
19122 }
19123 break
19124 }
19125
19126
19127
19128 for {
19129 t := v.Type
19130 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19131 x := v_0
19132 if v_1.Op != OpConst64 {
19133 continue
19134 }
19135 c := auxIntToInt64(v_1.AuxInt)
19136 if !(isPowerOfTwo(uint64(c)) && v.Block.Func.pass.name != "opt") {
19137 continue
19138 }
19139 v.reset(OpLsh64x64)
19140 v.Type = t
19141 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
19142 v0.AuxInt = int64ToAuxInt(log64u(uint64(c)))
19143 v.AddArg2(x, v0)
19144 return true
19145 }
19146 break
19147 }
19148
19149
19150
19151 for {
19152 t := v.Type
19153 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19154 x := v_0
19155 if v_1.Op != OpConst64 {
19156 continue
19157 }
19158 c := auxIntToInt64(v_1.AuxInt)
19159 if !(isPowerOfTwo(uint64(-c)) && v.Block.Func.pass.name != "opt") {
19160 continue
19161 }
19162 v.reset(OpNeg64)
19163 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
19164 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
19165 v1.AuxInt = int64ToAuxInt(log64u(uint64(-c)))
19166 v0.AddArg2(x, v1)
19167 v.AddArg(v0)
19168 return true
19169 }
19170 break
19171 }
19172
19173
19174
19175 for {
19176 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19177 if v_0.Op != OpMul64 {
19178 continue
19179 }
19180 _ = v_0.Args[1]
19181 v_0_0 := v_0.Args[0]
19182 v_0_1 := v_0.Args[1]
19183 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19184 i := v_0_0
19185 if i.Op != OpConst64 {
19186 continue
19187 }
19188 t := i.Type
19189 z := v_0_1
19190 x := v_1
19191 if !(z.Op != OpConst64 && x.Op != OpConst64) {
19192 continue
19193 }
19194 v.reset(OpMul64)
19195 v0 := b.NewValue0(v.Pos, OpMul64, t)
19196 v0.AddArg2(x, z)
19197 v.AddArg2(i, v0)
19198 return true
19199 }
19200 }
19201 break
19202 }
19203
19204
19205 for {
19206 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19207 if v_0.Op != OpConst64 {
19208 continue
19209 }
19210 t := v_0.Type
19211 c := auxIntToInt64(v_0.AuxInt)
19212 if v_1.Op != OpMul64 {
19213 continue
19214 }
19215 _ = v_1.Args[1]
19216 v_1_0 := v_1.Args[0]
19217 v_1_1 := v_1.Args[1]
19218 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19219 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
19220 continue
19221 }
19222 d := auxIntToInt64(v_1_0.AuxInt)
19223 x := v_1_1
19224 v.reset(OpMul64)
19225 v0 := b.NewValue0(v.Pos, OpConst64, t)
19226 v0.AuxInt = int64ToAuxInt(c * d)
19227 v.AddArg2(v0, x)
19228 return true
19229 }
19230 }
19231 break
19232 }
19233 return false
19234 }
19235 func rewriteValuegeneric_OpMul64F(v *Value) bool {
19236 v_1 := v.Args[1]
19237 v_0 := v.Args[0]
19238
19239
19240
19241 for {
19242 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19243 if v_0.Op != OpConst64F {
19244 continue
19245 }
19246 c := auxIntToFloat64(v_0.AuxInt)
19247 if v_1.Op != OpConst64F {
19248 continue
19249 }
19250 d := auxIntToFloat64(v_1.AuxInt)
19251 if !(c*d == c*d) {
19252 continue
19253 }
19254 v.reset(OpConst64F)
19255 v.AuxInt = float64ToAuxInt(c * d)
19256 return true
19257 }
19258 break
19259 }
19260
19261
19262 for {
19263 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19264 x := v_0
19265 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != 1 {
19266 continue
19267 }
19268 v.copyOf(x)
19269 return true
19270 }
19271 break
19272 }
19273
19274
19275 for {
19276 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19277 x := v_0
19278 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != -1 {
19279 continue
19280 }
19281 v.reset(OpNeg64F)
19282 v.AddArg(x)
19283 return true
19284 }
19285 break
19286 }
19287
19288
19289 for {
19290 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19291 x := v_0
19292 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != 2 {
19293 continue
19294 }
19295 v.reset(OpAdd64F)
19296 v.AddArg2(x, x)
19297 return true
19298 }
19299 break
19300 }
19301 return false
19302 }
19303 func rewriteValuegeneric_OpMul64uhilo(v *Value) bool {
19304 v_1 := v.Args[1]
19305 v_0 := v.Args[0]
19306 b := v.Block
19307 typ := &b.Func.Config.Types
19308
19309
19310 for {
19311 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19312 if v_0.Op != OpConst64 {
19313 continue
19314 }
19315 c := auxIntToInt64(v_0.AuxInt)
19316 if v_1.Op != OpConst64 {
19317 continue
19318 }
19319 d := auxIntToInt64(v_1.AuxInt)
19320 v.reset(OpMakeTuple)
19321 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
19322 v0.AuxInt = int64ToAuxInt(bitsMulU64(c, d).hi)
19323 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
19324 v1.AuxInt = int64ToAuxInt(bitsMulU64(c, d).lo)
19325 v.AddArg2(v0, v1)
19326 return true
19327 }
19328 break
19329 }
19330 return false
19331 }
19332 func rewriteValuegeneric_OpMul64uover(v *Value) bool {
19333 v_1 := v.Args[1]
19334 v_0 := v.Args[0]
19335 b := v.Block
19336 typ := &b.Func.Config.Types
19337
19338
19339 for {
19340 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19341 if v_0.Op != OpConst64 {
19342 continue
19343 }
19344 c := auxIntToInt64(v_0.AuxInt)
19345 if v_1.Op != OpConst64 {
19346 continue
19347 }
19348 d := auxIntToInt64(v_1.AuxInt)
19349 v.reset(OpMakeTuple)
19350 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
19351 v0.AuxInt = int64ToAuxInt(bitsMulU64(c, d).lo)
19352 v1 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
19353 v1.AuxInt = boolToAuxInt(bitsMulU64(c, d).hi != 0)
19354 v.AddArg2(v0, v1)
19355 return true
19356 }
19357 break
19358 }
19359
19360
19361 for {
19362 t := v.Type
19363 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19364 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 {
19365 continue
19366 }
19367 x := v_1
19368 v.reset(OpMakeTuple)
19369 v0 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
19370 v0.AuxInt = boolToAuxInt(false)
19371 v.AddArg2(x, v0)
19372 return true
19373 }
19374 break
19375 }
19376
19377
19378 for {
19379 t := v.Type
19380 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19381 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
19382 continue
19383 }
19384 v.reset(OpMakeTuple)
19385 v0 := b.NewValue0(v.Pos, OpConst64, t.FieldType(0))
19386 v0.AuxInt = int64ToAuxInt(0)
19387 v1 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
19388 v1.AuxInt = boolToAuxInt(false)
19389 v.AddArg2(v0, v1)
19390 return true
19391 }
19392 break
19393 }
19394 return false
19395 }
19396 func rewriteValuegeneric_OpMul8(v *Value) bool {
19397 v_1 := v.Args[1]
19398 v_0 := v.Args[0]
19399 b := v.Block
19400 typ := &b.Func.Config.Types
19401
19402
19403 for {
19404 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19405 if v_0.Op != OpConst8 {
19406 continue
19407 }
19408 c := auxIntToInt8(v_0.AuxInt)
19409 if v_1.Op != OpConst8 {
19410 continue
19411 }
19412 d := auxIntToInt8(v_1.AuxInt)
19413 v.reset(OpConst8)
19414 v.AuxInt = int8ToAuxInt(c * d)
19415 return true
19416 }
19417 break
19418 }
19419
19420
19421 for {
19422 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19423 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 1 {
19424 continue
19425 }
19426 x := v_1
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 != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
19437 continue
19438 }
19439 x := v_1
19440 v.reset(OpNeg8)
19441 v.AddArg(x)
19442 return true
19443 }
19444 break
19445 }
19446
19447
19448 for {
19449 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19450 if v_0.Op != OpConst8 {
19451 continue
19452 }
19453 t := v_0.Type
19454 c := auxIntToInt8(v_0.AuxInt)
19455 if v_1.Op != OpNeg8 {
19456 continue
19457 }
19458 x := v_1.Args[0]
19459 v.reset(OpMul8)
19460 v0 := b.NewValue0(v.Pos, OpConst8, t)
19461 v0.AuxInt = int8ToAuxInt(-c)
19462 v.AddArg2(x, v0)
19463 return true
19464 }
19465 break
19466 }
19467
19468
19469 for {
19470 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19471 if v_0.Op != OpNeg8 {
19472 continue
19473 }
19474 x := v_0.Args[0]
19475 if v_1.Op != OpNeg8 {
19476 continue
19477 }
19478 y := v_1.Args[0]
19479 v.reset(OpMul8)
19480 v.AddArg2(x, y)
19481 return true
19482 }
19483 break
19484 }
19485
19486
19487
19488 for {
19489 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19490 if v_0.Op != OpConst8 {
19491 continue
19492 }
19493 t := v_0.Type
19494 c := auxIntToInt8(v_0.AuxInt)
19495 if v_1.Op != OpAdd8 || v_1.Type != t {
19496 continue
19497 }
19498 _ = v_1.Args[1]
19499 v_1_0 := v_1.Args[0]
19500 v_1_1 := v_1.Args[1]
19501 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19502 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
19503 continue
19504 }
19505 d := auxIntToInt8(v_1_0.AuxInt)
19506 x := v_1_1
19507 if !(!isPowerOfTwo(c)) {
19508 continue
19509 }
19510 v.reset(OpAdd8)
19511 v0 := b.NewValue0(v.Pos, OpConst8, t)
19512 v0.AuxInt = int8ToAuxInt(c * d)
19513 v1 := b.NewValue0(v.Pos, OpMul8, t)
19514 v2 := b.NewValue0(v.Pos, OpConst8, t)
19515 v2.AuxInt = int8ToAuxInt(c)
19516 v1.AddArg2(v2, x)
19517 v.AddArg2(v0, v1)
19518 return true
19519 }
19520 }
19521 break
19522 }
19523
19524
19525 for {
19526 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19527 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
19528 continue
19529 }
19530 v.reset(OpConst8)
19531 v.AuxInt = int8ToAuxInt(0)
19532 return true
19533 }
19534 break
19535 }
19536
19537
19538
19539 for {
19540 t := v.Type
19541 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19542 x := v_0
19543 if v_1.Op != OpConst8 {
19544 continue
19545 }
19546 c := auxIntToInt8(v_1.AuxInt)
19547 if !(isPowerOfTwo(uint8(c)) && v.Block.Func.pass.name != "opt") {
19548 continue
19549 }
19550 v.reset(OpLsh8x64)
19551 v.Type = t
19552 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
19553 v0.AuxInt = int64ToAuxInt(log8u(uint8(c)))
19554 v.AddArg2(x, v0)
19555 return true
19556 }
19557 break
19558 }
19559
19560
19561
19562 for {
19563 t := v.Type
19564 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19565 x := v_0
19566 if v_1.Op != OpConst8 {
19567 continue
19568 }
19569 c := auxIntToInt8(v_1.AuxInt)
19570 if !(isPowerOfTwo(uint8(-c)) && v.Block.Func.pass.name != "opt") {
19571 continue
19572 }
19573 v.reset(OpNeg8)
19574 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
19575 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
19576 v1.AuxInt = int64ToAuxInt(log8u(uint8(-c)))
19577 v0.AddArg2(x, v1)
19578 v.AddArg(v0)
19579 return true
19580 }
19581 break
19582 }
19583
19584
19585
19586 for {
19587 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19588 if v_0.Op != OpMul8 {
19589 continue
19590 }
19591 _ = v_0.Args[1]
19592 v_0_0 := v_0.Args[0]
19593 v_0_1 := v_0.Args[1]
19594 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19595 i := v_0_0
19596 if i.Op != OpConst8 {
19597 continue
19598 }
19599 t := i.Type
19600 z := v_0_1
19601 x := v_1
19602 if !(z.Op != OpConst8 && x.Op != OpConst8) {
19603 continue
19604 }
19605 v.reset(OpMul8)
19606 v0 := b.NewValue0(v.Pos, OpMul8, t)
19607 v0.AddArg2(x, z)
19608 v.AddArg2(i, v0)
19609 return true
19610 }
19611 }
19612 break
19613 }
19614
19615
19616 for {
19617 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19618 if v_0.Op != OpConst8 {
19619 continue
19620 }
19621 t := v_0.Type
19622 c := auxIntToInt8(v_0.AuxInt)
19623 if v_1.Op != OpMul8 {
19624 continue
19625 }
19626 _ = v_1.Args[1]
19627 v_1_0 := v_1.Args[0]
19628 v_1_1 := v_1.Args[1]
19629 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19630 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
19631 continue
19632 }
19633 d := auxIntToInt8(v_1_0.AuxInt)
19634 x := v_1_1
19635 v.reset(OpMul8)
19636 v0 := b.NewValue0(v.Pos, OpConst8, t)
19637 v0.AuxInt = int8ToAuxInt(c * d)
19638 v.AddArg2(v0, x)
19639 return true
19640 }
19641 }
19642 break
19643 }
19644 return false
19645 }
19646 func rewriteValuegeneric_OpNeg16(v *Value) bool {
19647 v_0 := v.Args[0]
19648 b := v.Block
19649
19650
19651 for {
19652 if v_0.Op != OpConst16 {
19653 break
19654 }
19655 c := auxIntToInt16(v_0.AuxInt)
19656 v.reset(OpConst16)
19657 v.AuxInt = int16ToAuxInt(-c)
19658 return true
19659 }
19660
19661
19662 for {
19663 if v_0.Op != OpMul16 {
19664 break
19665 }
19666 _ = v_0.Args[1]
19667 v_0_0 := v_0.Args[0]
19668 v_0_1 := v_0.Args[1]
19669 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
19670 x := v_0_0
19671 if v_0_1.Op != OpConst16 {
19672 continue
19673 }
19674 t := v_0_1.Type
19675 c := auxIntToInt16(v_0_1.AuxInt)
19676 v.reset(OpMul16)
19677 v0 := b.NewValue0(v.Pos, OpConst16, t)
19678 v0.AuxInt = int16ToAuxInt(-c)
19679 v.AddArg2(x, v0)
19680 return true
19681 }
19682 break
19683 }
19684
19685
19686 for {
19687 if v_0.Op != OpMul16 {
19688 break
19689 }
19690 _ = v_0.Args[1]
19691 v_0_0 := v_0.Args[0]
19692 v_0_1 := v_0.Args[1]
19693 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
19694 x := v_0_0
19695 if v_0_1.Op != OpNeg16 {
19696 continue
19697 }
19698 y := v_0_1.Args[0]
19699 v.reset(OpMul16)
19700 v.AddArg2(x, y)
19701 return true
19702 }
19703 break
19704 }
19705
19706
19707 for {
19708 if v_0.Op != OpSub16 {
19709 break
19710 }
19711 y := v_0.Args[1]
19712 x := v_0.Args[0]
19713 v.reset(OpSub16)
19714 v.AddArg2(y, x)
19715 return true
19716 }
19717
19718
19719 for {
19720 if v_0.Op != OpNeg16 {
19721 break
19722 }
19723 x := v_0.Args[0]
19724 v.copyOf(x)
19725 return true
19726 }
19727
19728
19729 for {
19730 t := v.Type
19731 if v_0.Op != OpCom16 {
19732 break
19733 }
19734 x := v_0.Args[0]
19735 v.reset(OpAdd16)
19736 v0 := b.NewValue0(v.Pos, OpConst16, t)
19737 v0.AuxInt = int16ToAuxInt(1)
19738 v.AddArg2(v0, x)
19739 return true
19740 }
19741 return false
19742 }
19743 func rewriteValuegeneric_OpNeg32(v *Value) bool {
19744 v_0 := v.Args[0]
19745 b := v.Block
19746
19747
19748 for {
19749 if v_0.Op != OpConst32 {
19750 break
19751 }
19752 c := auxIntToInt32(v_0.AuxInt)
19753 v.reset(OpConst32)
19754 v.AuxInt = int32ToAuxInt(-c)
19755 return true
19756 }
19757
19758
19759 for {
19760 if v_0.Op != OpMul32 {
19761 break
19762 }
19763 _ = v_0.Args[1]
19764 v_0_0 := v_0.Args[0]
19765 v_0_1 := v_0.Args[1]
19766 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
19767 x := v_0_0
19768 if v_0_1.Op != OpConst32 {
19769 continue
19770 }
19771 t := v_0_1.Type
19772 c := auxIntToInt32(v_0_1.AuxInt)
19773 v.reset(OpMul32)
19774 v0 := b.NewValue0(v.Pos, OpConst32, t)
19775 v0.AuxInt = int32ToAuxInt(-c)
19776 v.AddArg2(x, v0)
19777 return true
19778 }
19779 break
19780 }
19781
19782
19783 for {
19784 if v_0.Op != OpMul32 {
19785 break
19786 }
19787 _ = v_0.Args[1]
19788 v_0_0 := v_0.Args[0]
19789 v_0_1 := v_0.Args[1]
19790 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
19791 x := v_0_0
19792 if v_0_1.Op != OpNeg32 {
19793 continue
19794 }
19795 y := v_0_1.Args[0]
19796 v.reset(OpMul32)
19797 v.AddArg2(x, y)
19798 return true
19799 }
19800 break
19801 }
19802
19803
19804 for {
19805 if v_0.Op != OpSub32 {
19806 break
19807 }
19808 y := v_0.Args[1]
19809 x := v_0.Args[0]
19810 v.reset(OpSub32)
19811 v.AddArg2(y, x)
19812 return true
19813 }
19814
19815
19816 for {
19817 if v_0.Op != OpNeg32 {
19818 break
19819 }
19820 x := v_0.Args[0]
19821 v.copyOf(x)
19822 return true
19823 }
19824
19825
19826 for {
19827 t := v.Type
19828 if v_0.Op != OpCom32 {
19829 break
19830 }
19831 x := v_0.Args[0]
19832 v.reset(OpAdd32)
19833 v0 := b.NewValue0(v.Pos, OpConst32, t)
19834 v0.AuxInt = int32ToAuxInt(1)
19835 v.AddArg2(v0, x)
19836 return true
19837 }
19838 return false
19839 }
19840 func rewriteValuegeneric_OpNeg32F(v *Value) bool {
19841 v_0 := v.Args[0]
19842
19843
19844
19845 for {
19846 if v_0.Op != OpConst32F {
19847 break
19848 }
19849 c := auxIntToFloat32(v_0.AuxInt)
19850 if !(c != 0) {
19851 break
19852 }
19853 v.reset(OpConst32F)
19854 v.AuxInt = float32ToAuxInt(-c)
19855 return true
19856 }
19857 return false
19858 }
19859 func rewriteValuegeneric_OpNeg64(v *Value) bool {
19860 v_0 := v.Args[0]
19861 b := v.Block
19862
19863
19864 for {
19865 if v_0.Op != OpConst64 {
19866 break
19867 }
19868 c := auxIntToInt64(v_0.AuxInt)
19869 v.reset(OpConst64)
19870 v.AuxInt = int64ToAuxInt(-c)
19871 return true
19872 }
19873
19874
19875 for {
19876 if v_0.Op != OpMul64 {
19877 break
19878 }
19879 _ = v_0.Args[1]
19880 v_0_0 := v_0.Args[0]
19881 v_0_1 := v_0.Args[1]
19882 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
19883 x := v_0_0
19884 if v_0_1.Op != OpConst64 {
19885 continue
19886 }
19887 t := v_0_1.Type
19888 c := auxIntToInt64(v_0_1.AuxInt)
19889 v.reset(OpMul64)
19890 v0 := b.NewValue0(v.Pos, OpConst64, t)
19891 v0.AuxInt = int64ToAuxInt(-c)
19892 v.AddArg2(x, v0)
19893 return true
19894 }
19895 break
19896 }
19897
19898
19899 for {
19900 if v_0.Op != OpMul64 {
19901 break
19902 }
19903 _ = v_0.Args[1]
19904 v_0_0 := v_0.Args[0]
19905 v_0_1 := v_0.Args[1]
19906 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
19907 x := v_0_0
19908 if v_0_1.Op != OpNeg64 {
19909 continue
19910 }
19911 y := v_0_1.Args[0]
19912 v.reset(OpMul64)
19913 v.AddArg2(x, y)
19914 return true
19915 }
19916 break
19917 }
19918
19919
19920 for {
19921 if v_0.Op != OpSub64 {
19922 break
19923 }
19924 y := v_0.Args[1]
19925 x := v_0.Args[0]
19926 v.reset(OpSub64)
19927 v.AddArg2(y, x)
19928 return true
19929 }
19930
19931
19932 for {
19933 if v_0.Op != OpNeg64 {
19934 break
19935 }
19936 x := v_0.Args[0]
19937 v.copyOf(x)
19938 return true
19939 }
19940
19941
19942 for {
19943 t := v.Type
19944 if v_0.Op != OpCom64 {
19945 break
19946 }
19947 x := v_0.Args[0]
19948 v.reset(OpAdd64)
19949 v0 := b.NewValue0(v.Pos, OpConst64, t)
19950 v0.AuxInt = int64ToAuxInt(1)
19951 v.AddArg2(v0, x)
19952 return true
19953 }
19954 return false
19955 }
19956 func rewriteValuegeneric_OpNeg64F(v *Value) bool {
19957 v_0 := v.Args[0]
19958
19959
19960
19961 for {
19962 if v_0.Op != OpConst64F {
19963 break
19964 }
19965 c := auxIntToFloat64(v_0.AuxInt)
19966 if !(c != 0) {
19967 break
19968 }
19969 v.reset(OpConst64F)
19970 v.AuxInt = float64ToAuxInt(-c)
19971 return true
19972 }
19973 return false
19974 }
19975 func rewriteValuegeneric_OpNeg8(v *Value) bool {
19976 v_0 := v.Args[0]
19977 b := v.Block
19978
19979
19980 for {
19981 if v_0.Op != OpConst8 {
19982 break
19983 }
19984 c := auxIntToInt8(v_0.AuxInt)
19985 v.reset(OpConst8)
19986 v.AuxInt = int8ToAuxInt(-c)
19987 return true
19988 }
19989
19990
19991 for {
19992 if v_0.Op != OpMul8 {
19993 break
19994 }
19995 _ = v_0.Args[1]
19996 v_0_0 := v_0.Args[0]
19997 v_0_1 := v_0.Args[1]
19998 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
19999 x := v_0_0
20000 if v_0_1.Op != OpConst8 {
20001 continue
20002 }
20003 t := v_0_1.Type
20004 c := auxIntToInt8(v_0_1.AuxInt)
20005 v.reset(OpMul8)
20006 v0 := b.NewValue0(v.Pos, OpConst8, t)
20007 v0.AuxInt = int8ToAuxInt(-c)
20008 v.AddArg2(x, v0)
20009 return true
20010 }
20011 break
20012 }
20013
20014
20015 for {
20016 if v_0.Op != OpMul8 {
20017 break
20018 }
20019 _ = v_0.Args[1]
20020 v_0_0 := v_0.Args[0]
20021 v_0_1 := v_0.Args[1]
20022 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
20023 x := v_0_0
20024 if v_0_1.Op != OpNeg8 {
20025 continue
20026 }
20027 y := v_0_1.Args[0]
20028 v.reset(OpMul8)
20029 v.AddArg2(x, y)
20030 return true
20031 }
20032 break
20033 }
20034
20035
20036 for {
20037 if v_0.Op != OpSub8 {
20038 break
20039 }
20040 y := v_0.Args[1]
20041 x := v_0.Args[0]
20042 v.reset(OpSub8)
20043 v.AddArg2(y, x)
20044 return true
20045 }
20046
20047
20048 for {
20049 if v_0.Op != OpNeg8 {
20050 break
20051 }
20052 x := v_0.Args[0]
20053 v.copyOf(x)
20054 return true
20055 }
20056
20057
20058 for {
20059 t := v.Type
20060 if v_0.Op != OpCom8 {
20061 break
20062 }
20063 x := v_0.Args[0]
20064 v.reset(OpAdd8)
20065 v0 := b.NewValue0(v.Pos, OpConst8, t)
20066 v0.AuxInt = int8ToAuxInt(1)
20067 v.AddArg2(v0, x)
20068 return true
20069 }
20070 return false
20071 }
20072 func rewriteValuegeneric_OpNeq16(v *Value) bool {
20073 v_1 := v.Args[1]
20074 v_0 := v.Args[0]
20075 b := v.Block
20076
20077
20078 for {
20079 x := v_0
20080 if x != v_1 {
20081 break
20082 }
20083 v.reset(OpConstBool)
20084 v.AuxInt = boolToAuxInt(false)
20085 return true
20086 }
20087
20088
20089 for {
20090 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20091 if v_0.Op != OpConst16 {
20092 continue
20093 }
20094 t := v_0.Type
20095 c := auxIntToInt16(v_0.AuxInt)
20096 if v_1.Op != OpAdd16 {
20097 continue
20098 }
20099 _ = v_1.Args[1]
20100 v_1_0 := v_1.Args[0]
20101 v_1_1 := v_1.Args[1]
20102 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
20103 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
20104 continue
20105 }
20106 d := auxIntToInt16(v_1_0.AuxInt)
20107 x := v_1_1
20108 v.reset(OpNeq16)
20109 v0 := b.NewValue0(v.Pos, OpConst16, t)
20110 v0.AuxInt = int16ToAuxInt(c - d)
20111 v.AddArg2(v0, x)
20112 return true
20113 }
20114 }
20115 break
20116 }
20117
20118
20119 for {
20120 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20121 if v_0.Op != OpConst16 {
20122 continue
20123 }
20124 c := auxIntToInt16(v_0.AuxInt)
20125 if v_1.Op != OpConst16 {
20126 continue
20127 }
20128 d := auxIntToInt16(v_1.AuxInt)
20129 v.reset(OpConstBool)
20130 v.AuxInt = boolToAuxInt(c != d)
20131 return true
20132 }
20133 break
20134 }
20135
20136
20137
20138 for {
20139 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20140 s := v_0
20141 if s.Op != OpSub16 {
20142 continue
20143 }
20144 y := s.Args[1]
20145 x := s.Args[0]
20146 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(s.Uses == 1) {
20147 continue
20148 }
20149 v.reset(OpNeq16)
20150 v.AddArg2(x, y)
20151 return true
20152 }
20153 break
20154 }
20155
20156
20157
20158 for {
20159 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20160 if v_0.Op != OpAnd16 {
20161 continue
20162 }
20163 t := v_0.Type
20164 _ = v_0.Args[1]
20165 v_0_0 := v_0.Args[0]
20166 v_0_1 := v_0.Args[1]
20167 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
20168 x := v_0_0
20169 if v_0_1.Op != OpConst16 || v_0_1.Type != t {
20170 continue
20171 }
20172 y := auxIntToInt16(v_0_1.AuxInt)
20173 if v_1.Op != OpConst16 || v_1.Type != t || auxIntToInt16(v_1.AuxInt) != y || !(oneBit(y)) {
20174 continue
20175 }
20176 v.reset(OpEq16)
20177 v0 := b.NewValue0(v.Pos, OpAnd16, t)
20178 v1 := b.NewValue0(v.Pos, OpConst16, t)
20179 v1.AuxInt = int16ToAuxInt(y)
20180 v0.AddArg2(x, v1)
20181 v2 := b.NewValue0(v.Pos, OpConst16, t)
20182 v2.AuxInt = int16ToAuxInt(0)
20183 v.AddArg2(v0, v2)
20184 return true
20185 }
20186 }
20187 break
20188 }
20189
20190
20191 for {
20192 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20193 if v_0.Op != OpZeroExt8to16 {
20194 continue
20195 }
20196 v_0_0 := v_0.Args[0]
20197 if v_0_0.Op != OpCvtBoolToUint8 {
20198 continue
20199 }
20200 x := v_0_0.Args[0]
20201 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
20202 continue
20203 }
20204 v.copyOf(x)
20205 return true
20206 }
20207 break
20208 }
20209
20210
20211 for {
20212 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20213 if v_0.Op != OpZeroExt8to16 {
20214 continue
20215 }
20216 v_0_0 := v_0.Args[0]
20217 if v_0_0.Op != OpCvtBoolToUint8 {
20218 continue
20219 }
20220 x := v_0_0.Args[0]
20221 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
20222 continue
20223 }
20224 v.reset(OpNot)
20225 v.AddArg(x)
20226 return true
20227 }
20228 break
20229 }
20230 return false
20231 }
20232 func rewriteValuegeneric_OpNeq32(v *Value) bool {
20233 v_1 := v.Args[1]
20234 v_0 := v.Args[0]
20235 b := v.Block
20236
20237
20238 for {
20239 x := v_0
20240 if x != v_1 {
20241 break
20242 }
20243 v.reset(OpConstBool)
20244 v.AuxInt = boolToAuxInt(false)
20245 return true
20246 }
20247
20248
20249 for {
20250 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20251 if v_0.Op != OpConst32 {
20252 continue
20253 }
20254 t := v_0.Type
20255 c := auxIntToInt32(v_0.AuxInt)
20256 if v_1.Op != OpAdd32 {
20257 continue
20258 }
20259 _ = v_1.Args[1]
20260 v_1_0 := v_1.Args[0]
20261 v_1_1 := v_1.Args[1]
20262 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
20263 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
20264 continue
20265 }
20266 d := auxIntToInt32(v_1_0.AuxInt)
20267 x := v_1_1
20268 v.reset(OpNeq32)
20269 v0 := b.NewValue0(v.Pos, OpConst32, t)
20270 v0.AuxInt = int32ToAuxInt(c - d)
20271 v.AddArg2(v0, x)
20272 return true
20273 }
20274 }
20275 break
20276 }
20277
20278
20279 for {
20280 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20281 if v_0.Op != OpConst32 {
20282 continue
20283 }
20284 c := auxIntToInt32(v_0.AuxInt)
20285 if v_1.Op != OpConst32 {
20286 continue
20287 }
20288 d := auxIntToInt32(v_1.AuxInt)
20289 v.reset(OpConstBool)
20290 v.AuxInt = boolToAuxInt(c != d)
20291 return true
20292 }
20293 break
20294 }
20295
20296
20297
20298 for {
20299 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20300 s := v_0
20301 if s.Op != OpSub32 {
20302 continue
20303 }
20304 y := s.Args[1]
20305 x := s.Args[0]
20306 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 || !(s.Uses == 1) {
20307 continue
20308 }
20309 v.reset(OpNeq32)
20310 v.AddArg2(x, y)
20311 return true
20312 }
20313 break
20314 }
20315
20316
20317
20318 for {
20319 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20320 if v_0.Op != OpAnd32 {
20321 continue
20322 }
20323 t := v_0.Type
20324 _ = v_0.Args[1]
20325 v_0_0 := v_0.Args[0]
20326 v_0_1 := v_0.Args[1]
20327 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
20328 x := v_0_0
20329 if v_0_1.Op != OpConst32 || v_0_1.Type != t {
20330 continue
20331 }
20332 y := auxIntToInt32(v_0_1.AuxInt)
20333 if v_1.Op != OpConst32 || v_1.Type != t || auxIntToInt32(v_1.AuxInt) != y || !(oneBit(y)) {
20334 continue
20335 }
20336 v.reset(OpEq32)
20337 v0 := b.NewValue0(v.Pos, OpAnd32, t)
20338 v1 := b.NewValue0(v.Pos, OpConst32, t)
20339 v1.AuxInt = int32ToAuxInt(y)
20340 v0.AddArg2(x, v1)
20341 v2 := b.NewValue0(v.Pos, OpConst32, t)
20342 v2.AuxInt = int32ToAuxInt(0)
20343 v.AddArg2(v0, v2)
20344 return true
20345 }
20346 }
20347 break
20348 }
20349
20350
20351 for {
20352 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20353 if v_0.Op != OpZeroExt8to32 {
20354 continue
20355 }
20356 v_0_0 := v_0.Args[0]
20357 if v_0_0.Op != OpCvtBoolToUint8 {
20358 continue
20359 }
20360 x := v_0_0.Args[0]
20361 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
20362 continue
20363 }
20364 v.copyOf(x)
20365 return true
20366 }
20367 break
20368 }
20369
20370
20371 for {
20372 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20373 if v_0.Op != OpZeroExt8to32 {
20374 continue
20375 }
20376 v_0_0 := v_0.Args[0]
20377 if v_0_0.Op != OpCvtBoolToUint8 {
20378 continue
20379 }
20380 x := v_0_0.Args[0]
20381 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
20382 continue
20383 }
20384 v.reset(OpNot)
20385 v.AddArg(x)
20386 return true
20387 }
20388 break
20389 }
20390 return false
20391 }
20392 func rewriteValuegeneric_OpNeq32F(v *Value) bool {
20393 v_1 := v.Args[1]
20394 v_0 := v.Args[0]
20395
20396
20397 for {
20398 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20399 if v_0.Op != OpConst32F {
20400 continue
20401 }
20402 c := auxIntToFloat32(v_0.AuxInt)
20403 if v_1.Op != OpConst32F {
20404 continue
20405 }
20406 d := auxIntToFloat32(v_1.AuxInt)
20407 v.reset(OpConstBool)
20408 v.AuxInt = boolToAuxInt(c != d)
20409 return true
20410 }
20411 break
20412 }
20413 return false
20414 }
20415 func rewriteValuegeneric_OpNeq64(v *Value) bool {
20416 v_1 := v.Args[1]
20417 v_0 := v.Args[0]
20418 b := v.Block
20419
20420
20421 for {
20422 x := v_0
20423 if x != v_1 {
20424 break
20425 }
20426 v.reset(OpConstBool)
20427 v.AuxInt = boolToAuxInt(false)
20428 return true
20429 }
20430
20431
20432 for {
20433 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20434 if v_0.Op != OpConst64 {
20435 continue
20436 }
20437 t := v_0.Type
20438 c := auxIntToInt64(v_0.AuxInt)
20439 if v_1.Op != OpAdd64 {
20440 continue
20441 }
20442 _ = v_1.Args[1]
20443 v_1_0 := v_1.Args[0]
20444 v_1_1 := v_1.Args[1]
20445 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
20446 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
20447 continue
20448 }
20449 d := auxIntToInt64(v_1_0.AuxInt)
20450 x := v_1_1
20451 v.reset(OpNeq64)
20452 v0 := b.NewValue0(v.Pos, OpConst64, t)
20453 v0.AuxInt = int64ToAuxInt(c - d)
20454 v.AddArg2(v0, x)
20455 return true
20456 }
20457 }
20458 break
20459 }
20460
20461
20462 for {
20463 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20464 if v_0.Op != OpConst64 {
20465 continue
20466 }
20467 c := auxIntToInt64(v_0.AuxInt)
20468 if v_1.Op != OpConst64 {
20469 continue
20470 }
20471 d := auxIntToInt64(v_1.AuxInt)
20472 v.reset(OpConstBool)
20473 v.AuxInt = boolToAuxInt(c != d)
20474 return true
20475 }
20476 break
20477 }
20478
20479
20480
20481 for {
20482 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20483 s := v_0
20484 if s.Op != OpSub64 {
20485 continue
20486 }
20487 y := s.Args[1]
20488 x := s.Args[0]
20489 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 || !(s.Uses == 1) {
20490 continue
20491 }
20492 v.reset(OpNeq64)
20493 v.AddArg2(x, y)
20494 return true
20495 }
20496 break
20497 }
20498
20499
20500
20501 for {
20502 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20503 if v_0.Op != OpAnd64 {
20504 continue
20505 }
20506 t := v_0.Type
20507 _ = v_0.Args[1]
20508 v_0_0 := v_0.Args[0]
20509 v_0_1 := v_0.Args[1]
20510 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
20511 x := v_0_0
20512 if v_0_1.Op != OpConst64 || v_0_1.Type != t {
20513 continue
20514 }
20515 y := auxIntToInt64(v_0_1.AuxInt)
20516 if v_1.Op != OpConst64 || v_1.Type != t || auxIntToInt64(v_1.AuxInt) != y || !(oneBit(y)) {
20517 continue
20518 }
20519 v.reset(OpEq64)
20520 v0 := b.NewValue0(v.Pos, OpAnd64, t)
20521 v1 := b.NewValue0(v.Pos, OpConst64, t)
20522 v1.AuxInt = int64ToAuxInt(y)
20523 v0.AddArg2(x, v1)
20524 v2 := b.NewValue0(v.Pos, OpConst64, t)
20525 v2.AuxInt = int64ToAuxInt(0)
20526 v.AddArg2(v0, v2)
20527 return true
20528 }
20529 }
20530 break
20531 }
20532
20533
20534 for {
20535 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20536 if v_0.Op != OpZeroExt8to64 {
20537 continue
20538 }
20539 v_0_0 := v_0.Args[0]
20540 if v_0_0.Op != OpCvtBoolToUint8 {
20541 continue
20542 }
20543 x := v_0_0.Args[0]
20544 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
20545 continue
20546 }
20547 v.copyOf(x)
20548 return true
20549 }
20550 break
20551 }
20552
20553
20554 for {
20555 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20556 if v_0.Op != OpZeroExt8to64 {
20557 continue
20558 }
20559 v_0_0 := v_0.Args[0]
20560 if v_0_0.Op != OpCvtBoolToUint8 {
20561 continue
20562 }
20563 x := v_0_0.Args[0]
20564 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
20565 continue
20566 }
20567 v.reset(OpNot)
20568 v.AddArg(x)
20569 return true
20570 }
20571 break
20572 }
20573 return false
20574 }
20575 func rewriteValuegeneric_OpNeq64F(v *Value) bool {
20576 v_1 := v.Args[1]
20577 v_0 := v.Args[0]
20578
20579
20580 for {
20581 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20582 if v_0.Op != OpConst64F {
20583 continue
20584 }
20585 c := auxIntToFloat64(v_0.AuxInt)
20586 if v_1.Op != OpConst64F {
20587 continue
20588 }
20589 d := auxIntToFloat64(v_1.AuxInt)
20590 v.reset(OpConstBool)
20591 v.AuxInt = boolToAuxInt(c != d)
20592 return true
20593 }
20594 break
20595 }
20596 return false
20597 }
20598 func rewriteValuegeneric_OpNeq8(v *Value) bool {
20599 v_1 := v.Args[1]
20600 v_0 := v.Args[0]
20601 b := v.Block
20602
20603
20604 for {
20605 x := v_0
20606 if x != v_1 {
20607 break
20608 }
20609 v.reset(OpConstBool)
20610 v.AuxInt = boolToAuxInt(false)
20611 return true
20612 }
20613
20614
20615 for {
20616 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20617 if v_0.Op != OpConst8 {
20618 continue
20619 }
20620 t := v_0.Type
20621 c := auxIntToInt8(v_0.AuxInt)
20622 if v_1.Op != OpAdd8 {
20623 continue
20624 }
20625 _ = v_1.Args[1]
20626 v_1_0 := v_1.Args[0]
20627 v_1_1 := v_1.Args[1]
20628 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
20629 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
20630 continue
20631 }
20632 d := auxIntToInt8(v_1_0.AuxInt)
20633 x := v_1_1
20634 v.reset(OpNeq8)
20635 v0 := b.NewValue0(v.Pos, OpConst8, t)
20636 v0.AuxInt = int8ToAuxInt(c - d)
20637 v.AddArg2(v0, x)
20638 return true
20639 }
20640 }
20641 break
20642 }
20643
20644
20645 for {
20646 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20647 if v_0.Op != OpConst8 {
20648 continue
20649 }
20650 c := auxIntToInt8(v_0.AuxInt)
20651 if v_1.Op != OpConst8 {
20652 continue
20653 }
20654 d := auxIntToInt8(v_1.AuxInt)
20655 v.reset(OpConstBool)
20656 v.AuxInt = boolToAuxInt(c != d)
20657 return true
20658 }
20659 break
20660 }
20661
20662
20663
20664 for {
20665 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20666 s := v_0
20667 if s.Op != OpSub8 {
20668 continue
20669 }
20670 y := s.Args[1]
20671 x := s.Args[0]
20672 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(s.Uses == 1) {
20673 continue
20674 }
20675 v.reset(OpNeq8)
20676 v.AddArg2(x, y)
20677 return true
20678 }
20679 break
20680 }
20681
20682
20683
20684 for {
20685 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20686 if v_0.Op != OpAnd8 {
20687 continue
20688 }
20689 t := v_0.Type
20690 _ = v_0.Args[1]
20691 v_0_0 := v_0.Args[0]
20692 v_0_1 := v_0.Args[1]
20693 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
20694 x := v_0_0
20695 if v_0_1.Op != OpConst8 || v_0_1.Type != t {
20696 continue
20697 }
20698 y := auxIntToInt8(v_0_1.AuxInt)
20699 if v_1.Op != OpConst8 || v_1.Type != t || auxIntToInt8(v_1.AuxInt) != y || !(oneBit(y)) {
20700 continue
20701 }
20702 v.reset(OpEq8)
20703 v0 := b.NewValue0(v.Pos, OpAnd8, t)
20704 v1 := b.NewValue0(v.Pos, OpConst8, t)
20705 v1.AuxInt = int8ToAuxInt(y)
20706 v0.AddArg2(x, v1)
20707 v2 := b.NewValue0(v.Pos, OpConst8, t)
20708 v2.AuxInt = int8ToAuxInt(0)
20709 v.AddArg2(v0, v2)
20710 return true
20711 }
20712 }
20713 break
20714 }
20715
20716
20717 for {
20718 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20719 if v_0.Op != OpCvtBoolToUint8 {
20720 continue
20721 }
20722 x := v_0.Args[0]
20723 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
20724 continue
20725 }
20726 v.copyOf(x)
20727 return true
20728 }
20729 break
20730 }
20731
20732
20733 for {
20734 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20735 if v_0.Op != OpCvtBoolToUint8 {
20736 continue
20737 }
20738 x := v_0.Args[0]
20739 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 1 {
20740 continue
20741 }
20742 v.reset(OpNot)
20743 v.AddArg(x)
20744 return true
20745 }
20746 break
20747 }
20748 return false
20749 }
20750 func rewriteValuegeneric_OpNeqB(v *Value) bool {
20751 v_1 := v.Args[1]
20752 v_0 := v.Args[0]
20753
20754
20755 for {
20756 x := v_0
20757 if x != v_1 {
20758 break
20759 }
20760 v.reset(OpConstBool)
20761 v.AuxInt = boolToAuxInt(false)
20762 return true
20763 }
20764
20765
20766 for {
20767 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20768 if v_0.Op != OpConstBool {
20769 continue
20770 }
20771 c := auxIntToBool(v_0.AuxInt)
20772 if v_1.Op != OpConstBool {
20773 continue
20774 }
20775 d := auxIntToBool(v_1.AuxInt)
20776 v.reset(OpConstBool)
20777 v.AuxInt = boolToAuxInt(c != d)
20778 return true
20779 }
20780 break
20781 }
20782
20783
20784 for {
20785 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20786 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
20787 continue
20788 }
20789 x := v_1
20790 v.copyOf(x)
20791 return true
20792 }
20793 break
20794 }
20795
20796
20797 for {
20798 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20799 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
20800 continue
20801 }
20802 x := v_1
20803 v.reset(OpNot)
20804 v.AddArg(x)
20805 return true
20806 }
20807 break
20808 }
20809
20810
20811 for {
20812 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20813 if v_0.Op != OpNot {
20814 continue
20815 }
20816 x := v_0.Args[0]
20817 y := v_1
20818 v.reset(OpEqB)
20819 v.AddArg2(x, y)
20820 return true
20821 }
20822 break
20823 }
20824 return false
20825 }
20826 func rewriteValuegeneric_OpNeqInter(v *Value) bool {
20827 v_1 := v.Args[1]
20828 v_0 := v.Args[0]
20829 b := v.Block
20830 typ := &b.Func.Config.Types
20831
20832
20833 for {
20834 x := v_0
20835 y := v_1
20836 v.reset(OpNeqPtr)
20837 v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
20838 v0.AddArg(x)
20839 v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
20840 v1.AddArg(y)
20841 v.AddArg2(v0, v1)
20842 return true
20843 }
20844 }
20845 func rewriteValuegeneric_OpNeqPtr(v *Value) bool {
20846 v_1 := v.Args[1]
20847 v_0 := v.Args[0]
20848
20849
20850 for {
20851 x := v_0
20852 if x != v_1 {
20853 break
20854 }
20855 v.reset(OpConstBool)
20856 v.AuxInt = boolToAuxInt(false)
20857 return true
20858 }
20859
20860
20861 for {
20862 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20863 if v_0.Op != OpAddr {
20864 continue
20865 }
20866 x := auxToSym(v_0.Aux)
20867 if v_1.Op != OpAddr {
20868 continue
20869 }
20870 y := auxToSym(v_1.Aux)
20871 v.reset(OpConstBool)
20872 v.AuxInt = boolToAuxInt(x != y)
20873 return true
20874 }
20875 break
20876 }
20877
20878
20879 for {
20880 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20881 if v_0.Op != OpAddr {
20882 continue
20883 }
20884 x := auxToSym(v_0.Aux)
20885 if v_1.Op != OpOffPtr {
20886 continue
20887 }
20888 o := auxIntToInt64(v_1.AuxInt)
20889 v_1_0 := v_1.Args[0]
20890 if v_1_0.Op != OpAddr {
20891 continue
20892 }
20893 y := auxToSym(v_1_0.Aux)
20894 v.reset(OpConstBool)
20895 v.AuxInt = boolToAuxInt(x != y || o != 0)
20896 return true
20897 }
20898 break
20899 }
20900
20901
20902 for {
20903 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20904 if v_0.Op != OpOffPtr {
20905 continue
20906 }
20907 o1 := auxIntToInt64(v_0.AuxInt)
20908 v_0_0 := v_0.Args[0]
20909 if v_0_0.Op != OpAddr {
20910 continue
20911 }
20912 x := auxToSym(v_0_0.Aux)
20913 if v_1.Op != OpOffPtr {
20914 continue
20915 }
20916 o2 := auxIntToInt64(v_1.AuxInt)
20917 v_1_0 := v_1.Args[0]
20918 if v_1_0.Op != OpAddr {
20919 continue
20920 }
20921 y := auxToSym(v_1_0.Aux)
20922 v.reset(OpConstBool)
20923 v.AuxInt = boolToAuxInt(x != y || o1 != o2)
20924 return true
20925 }
20926 break
20927 }
20928
20929
20930 for {
20931 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20932 if v_0.Op != OpLocalAddr {
20933 continue
20934 }
20935 x := auxToSym(v_0.Aux)
20936 if v_1.Op != OpLocalAddr {
20937 continue
20938 }
20939 y := auxToSym(v_1.Aux)
20940 v.reset(OpConstBool)
20941 v.AuxInt = boolToAuxInt(x != y)
20942 return true
20943 }
20944 break
20945 }
20946
20947
20948 for {
20949 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20950 if v_0.Op != OpLocalAddr {
20951 continue
20952 }
20953 x := auxToSym(v_0.Aux)
20954 if v_1.Op != OpOffPtr {
20955 continue
20956 }
20957 o := auxIntToInt64(v_1.AuxInt)
20958 v_1_0 := v_1.Args[0]
20959 if v_1_0.Op != OpLocalAddr {
20960 continue
20961 }
20962 y := auxToSym(v_1_0.Aux)
20963 v.reset(OpConstBool)
20964 v.AuxInt = boolToAuxInt(x != y || o != 0)
20965 return true
20966 }
20967 break
20968 }
20969
20970
20971 for {
20972 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20973 if v_0.Op != OpOffPtr {
20974 continue
20975 }
20976 o1 := auxIntToInt64(v_0.AuxInt)
20977 v_0_0 := v_0.Args[0]
20978 if v_0_0.Op != OpLocalAddr {
20979 continue
20980 }
20981 x := auxToSym(v_0_0.Aux)
20982 if v_1.Op != OpOffPtr {
20983 continue
20984 }
20985 o2 := auxIntToInt64(v_1.AuxInt)
20986 v_1_0 := v_1.Args[0]
20987 if v_1_0.Op != OpLocalAddr {
20988 continue
20989 }
20990 y := auxToSym(v_1_0.Aux)
20991 v.reset(OpConstBool)
20992 v.AuxInt = boolToAuxInt(x != y || o1 != o2)
20993 return true
20994 }
20995 break
20996 }
20997
20998
20999
21000 for {
21001 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21002 if v_0.Op != OpOffPtr {
21003 continue
21004 }
21005 o1 := auxIntToInt64(v_0.AuxInt)
21006 p1 := v_0.Args[0]
21007 p2 := v_1
21008 if !(isSamePtr(p1, p2)) {
21009 continue
21010 }
21011 v.reset(OpConstBool)
21012 v.AuxInt = boolToAuxInt(o1 != 0)
21013 return true
21014 }
21015 break
21016 }
21017
21018
21019
21020 for {
21021 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21022 if v_0.Op != OpOffPtr {
21023 continue
21024 }
21025 o1 := auxIntToInt64(v_0.AuxInt)
21026 p1 := v_0.Args[0]
21027 if v_1.Op != OpOffPtr {
21028 continue
21029 }
21030 o2 := auxIntToInt64(v_1.AuxInt)
21031 p2 := v_1.Args[0]
21032 if !(isSamePtr(p1, p2)) {
21033 continue
21034 }
21035 v.reset(OpConstBool)
21036 v.AuxInt = boolToAuxInt(o1 != o2)
21037 return true
21038 }
21039 break
21040 }
21041
21042
21043 for {
21044 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21045 if v_0.Op != OpConst32 {
21046 continue
21047 }
21048 c := auxIntToInt32(v_0.AuxInt)
21049 if v_1.Op != OpConst32 {
21050 continue
21051 }
21052 d := auxIntToInt32(v_1.AuxInt)
21053 v.reset(OpConstBool)
21054 v.AuxInt = boolToAuxInt(c != d)
21055 return true
21056 }
21057 break
21058 }
21059
21060
21061 for {
21062 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21063 if v_0.Op != OpConst64 {
21064 continue
21065 }
21066 c := auxIntToInt64(v_0.AuxInt)
21067 if v_1.Op != OpConst64 {
21068 continue
21069 }
21070 d := auxIntToInt64(v_1.AuxInt)
21071 v.reset(OpConstBool)
21072 v.AuxInt = boolToAuxInt(c != d)
21073 return true
21074 }
21075 break
21076 }
21077
21078
21079 for {
21080 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21081 if v_0.Op != OpConvert {
21082 continue
21083 }
21084 v_0_0 := v_0.Args[0]
21085 if v_0_0.Op != OpAddr {
21086 continue
21087 }
21088 x := auxToSym(v_0_0.Aux)
21089 if v_1.Op != OpAddr {
21090 continue
21091 }
21092 y := auxToSym(v_1.Aux)
21093 v.reset(OpConstBool)
21094 v.AuxInt = boolToAuxInt(x != y)
21095 return true
21096 }
21097 break
21098 }
21099
21100
21101 for {
21102 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21103 if v_0.Op != OpLocalAddr || v_1.Op != OpAddr {
21104 continue
21105 }
21106 v.reset(OpConstBool)
21107 v.AuxInt = boolToAuxInt(true)
21108 return true
21109 }
21110 break
21111 }
21112
21113
21114 for {
21115 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21116 if v_0.Op != OpOffPtr {
21117 continue
21118 }
21119 v_0_0 := v_0.Args[0]
21120 if v_0_0.Op != OpLocalAddr || v_1.Op != OpAddr {
21121 continue
21122 }
21123 v.reset(OpConstBool)
21124 v.AuxInt = boolToAuxInt(true)
21125 return true
21126 }
21127 break
21128 }
21129
21130
21131 for {
21132 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21133 if v_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
21134 continue
21135 }
21136 v_1_0 := v_1.Args[0]
21137 if v_1_0.Op != OpAddr {
21138 continue
21139 }
21140 v.reset(OpConstBool)
21141 v.AuxInt = boolToAuxInt(true)
21142 return true
21143 }
21144 break
21145 }
21146
21147
21148 for {
21149 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21150 if v_0.Op != OpOffPtr {
21151 continue
21152 }
21153 v_0_0 := v_0.Args[0]
21154 if v_0_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
21155 continue
21156 }
21157 v_1_0 := v_1.Args[0]
21158 if v_1_0.Op != OpAddr {
21159 continue
21160 }
21161 v.reset(OpConstBool)
21162 v.AuxInt = boolToAuxInt(true)
21163 return true
21164 }
21165 break
21166 }
21167
21168
21169
21170 for {
21171 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21172 if v_0.Op != OpAddPtr {
21173 continue
21174 }
21175 o1 := v_0.Args[1]
21176 p1 := v_0.Args[0]
21177 p2 := v_1
21178 if !(isSamePtr(p1, p2)) {
21179 continue
21180 }
21181 v.reset(OpIsNonNil)
21182 v.AddArg(o1)
21183 return true
21184 }
21185 break
21186 }
21187
21188
21189 for {
21190 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21191 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
21192 continue
21193 }
21194 p := v_1
21195 v.reset(OpIsNonNil)
21196 v.AddArg(p)
21197 return true
21198 }
21199 break
21200 }
21201
21202
21203 for {
21204 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21205 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
21206 continue
21207 }
21208 p := v_1
21209 v.reset(OpIsNonNil)
21210 v.AddArg(p)
21211 return true
21212 }
21213 break
21214 }
21215
21216
21217 for {
21218 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21219 if v_0.Op != OpConstNil {
21220 continue
21221 }
21222 p := v_1
21223 v.reset(OpIsNonNil)
21224 v.AddArg(p)
21225 return true
21226 }
21227 break
21228 }
21229 return false
21230 }
21231 func rewriteValuegeneric_OpNeqSlice(v *Value) bool {
21232 v_1 := v.Args[1]
21233 v_0 := v.Args[0]
21234 b := v.Block
21235 typ := &b.Func.Config.Types
21236
21237
21238 for {
21239 x := v_0
21240 y := v_1
21241 v.reset(OpNeqPtr)
21242 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
21243 v0.AddArg(x)
21244 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
21245 v1.AddArg(y)
21246 v.AddArg2(v0, v1)
21247 return true
21248 }
21249 }
21250 func rewriteValuegeneric_OpNilCheck(v *Value) bool {
21251 v_1 := v.Args[1]
21252 v_0 := v.Args[0]
21253 b := v.Block
21254 fe := b.Func.fe
21255
21256
21257 for {
21258 ptr := v_0
21259 if ptr.Op != OpGetG {
21260 break
21261 }
21262 mem := ptr.Args[0]
21263 if mem != v_1 {
21264 break
21265 }
21266 v.copyOf(ptr)
21267 return true
21268 }
21269
21270
21271
21272 for {
21273 ptr := v_0
21274 if ptr.Op != OpSelectN || auxIntToInt64(ptr.AuxInt) != 0 {
21275 break
21276 }
21277 call := ptr.Args[0]
21278 if call.Op != OpStaticLECall {
21279 break
21280 }
21281 if !(isMalloc(call.Aux) && warnRule(fe.Debug_checknil(), v, "removed nil check")) {
21282 break
21283 }
21284 v.copyOf(ptr)
21285 return true
21286 }
21287
21288
21289
21290 for {
21291 ptr := v_0
21292 if ptr.Op != OpOffPtr {
21293 break
21294 }
21295 ptr_0 := ptr.Args[0]
21296 if ptr_0.Op != OpSelectN || auxIntToInt64(ptr_0.AuxInt) != 0 {
21297 break
21298 }
21299 call := ptr_0.Args[0]
21300 if call.Op != OpStaticLECall {
21301 break
21302 }
21303 if !(isMalloc(call.Aux) && warnRule(fe.Debug_checknil(), v, "removed nil check")) {
21304 break
21305 }
21306 v.copyOf(ptr)
21307 return true
21308 }
21309
21310
21311 for {
21312 ptr := v_0
21313 if ptr.Op != OpAddr {
21314 break
21315 }
21316 ptr_0 := ptr.Args[0]
21317 if ptr_0.Op != OpSB {
21318 break
21319 }
21320 v.copyOf(ptr)
21321 return true
21322 }
21323
21324
21325 for {
21326 ptr := v_0
21327 if ptr.Op != OpConvert {
21328 break
21329 }
21330 ptr_0 := ptr.Args[0]
21331 if ptr_0.Op != OpAddr {
21332 break
21333 }
21334 ptr_0_0 := ptr_0.Args[0]
21335 if ptr_0_0.Op != OpSB {
21336 break
21337 }
21338 v.copyOf(ptr)
21339 return true
21340 }
21341
21342
21343
21344 for {
21345 ptr := v_0
21346 if ptr.Op != OpLocalAddr || !(warnRule(fe.Debug_checknil(), v, "removed nil check")) {
21347 break
21348 }
21349 v.copyOf(ptr)
21350 return true
21351 }
21352
21353
21354
21355 for {
21356 ptr := v_0
21357 if ptr.Op != OpArg {
21358 break
21359 }
21360 sym := auxToSym(ptr.Aux)
21361 if !(isDictArgSym(sym)) {
21362 break
21363 }
21364 v.copyOf(ptr)
21365 return true
21366 }
21367
21368
21369 for {
21370 ptr := v_0
21371 if ptr.Op != OpNilCheck {
21372 break
21373 }
21374 v.copyOf(ptr)
21375 return true
21376 }
21377 return false
21378 }
21379 func rewriteValuegeneric_OpNot(v *Value) bool {
21380 v_0 := v.Args[0]
21381
21382
21383 for {
21384 if v_0.Op != OpConstBool {
21385 break
21386 }
21387 c := auxIntToBool(v_0.AuxInt)
21388 v.reset(OpConstBool)
21389 v.AuxInt = boolToAuxInt(!c)
21390 return true
21391 }
21392
21393
21394 for {
21395 if v_0.Op != OpEq64 {
21396 break
21397 }
21398 y := v_0.Args[1]
21399 x := v_0.Args[0]
21400 v.reset(OpNeq64)
21401 v.AddArg2(x, y)
21402 return true
21403 }
21404
21405
21406 for {
21407 if v_0.Op != OpEq32 {
21408 break
21409 }
21410 y := v_0.Args[1]
21411 x := v_0.Args[0]
21412 v.reset(OpNeq32)
21413 v.AddArg2(x, y)
21414 return true
21415 }
21416
21417
21418 for {
21419 if v_0.Op != OpEq16 {
21420 break
21421 }
21422 y := v_0.Args[1]
21423 x := v_0.Args[0]
21424 v.reset(OpNeq16)
21425 v.AddArg2(x, y)
21426 return true
21427 }
21428
21429
21430 for {
21431 if v_0.Op != OpEq8 {
21432 break
21433 }
21434 y := v_0.Args[1]
21435 x := v_0.Args[0]
21436 v.reset(OpNeq8)
21437 v.AddArg2(x, y)
21438 return true
21439 }
21440
21441
21442 for {
21443 if v_0.Op != OpEqB {
21444 break
21445 }
21446 y := v_0.Args[1]
21447 x := v_0.Args[0]
21448 v.reset(OpNeqB)
21449 v.AddArg2(x, y)
21450 return true
21451 }
21452
21453
21454 for {
21455 if v_0.Op != OpEqPtr {
21456 break
21457 }
21458 y := v_0.Args[1]
21459 x := v_0.Args[0]
21460 v.reset(OpNeqPtr)
21461 v.AddArg2(x, y)
21462 return true
21463 }
21464
21465
21466 for {
21467 if v_0.Op != OpEq64F {
21468 break
21469 }
21470 y := v_0.Args[1]
21471 x := v_0.Args[0]
21472 v.reset(OpNeq64F)
21473 v.AddArg2(x, y)
21474 return true
21475 }
21476
21477
21478 for {
21479 if v_0.Op != OpEq32F {
21480 break
21481 }
21482 y := v_0.Args[1]
21483 x := v_0.Args[0]
21484 v.reset(OpNeq32F)
21485 v.AddArg2(x, y)
21486 return true
21487 }
21488
21489
21490 for {
21491 if v_0.Op != OpNeq64 {
21492 break
21493 }
21494 y := v_0.Args[1]
21495 x := v_0.Args[0]
21496 v.reset(OpEq64)
21497 v.AddArg2(x, y)
21498 return true
21499 }
21500
21501
21502 for {
21503 if v_0.Op != OpNeq32 {
21504 break
21505 }
21506 y := v_0.Args[1]
21507 x := v_0.Args[0]
21508 v.reset(OpEq32)
21509 v.AddArg2(x, y)
21510 return true
21511 }
21512
21513
21514 for {
21515 if v_0.Op != OpNeq16 {
21516 break
21517 }
21518 y := v_0.Args[1]
21519 x := v_0.Args[0]
21520 v.reset(OpEq16)
21521 v.AddArg2(x, y)
21522 return true
21523 }
21524
21525
21526 for {
21527 if v_0.Op != OpNeq8 {
21528 break
21529 }
21530 y := v_0.Args[1]
21531 x := v_0.Args[0]
21532 v.reset(OpEq8)
21533 v.AddArg2(x, y)
21534 return true
21535 }
21536
21537
21538 for {
21539 if v_0.Op != OpNeqB {
21540 break
21541 }
21542 y := v_0.Args[1]
21543 x := v_0.Args[0]
21544 v.reset(OpEqB)
21545 v.AddArg2(x, y)
21546 return true
21547 }
21548
21549
21550 for {
21551 if v_0.Op != OpNeqPtr {
21552 break
21553 }
21554 y := v_0.Args[1]
21555 x := v_0.Args[0]
21556 v.reset(OpEqPtr)
21557 v.AddArg2(x, y)
21558 return true
21559 }
21560
21561
21562 for {
21563 if v_0.Op != OpNeq64F {
21564 break
21565 }
21566 y := v_0.Args[1]
21567 x := v_0.Args[0]
21568 v.reset(OpEq64F)
21569 v.AddArg2(x, y)
21570 return true
21571 }
21572
21573
21574 for {
21575 if v_0.Op != OpNeq32F {
21576 break
21577 }
21578 y := v_0.Args[1]
21579 x := v_0.Args[0]
21580 v.reset(OpEq32F)
21581 v.AddArg2(x, y)
21582 return true
21583 }
21584
21585
21586 for {
21587 if v_0.Op != OpLess64 {
21588 break
21589 }
21590 y := v_0.Args[1]
21591 x := v_0.Args[0]
21592 v.reset(OpLeq64)
21593 v.AddArg2(y, x)
21594 return true
21595 }
21596
21597
21598 for {
21599 if v_0.Op != OpLess32 {
21600 break
21601 }
21602 y := v_0.Args[1]
21603 x := v_0.Args[0]
21604 v.reset(OpLeq32)
21605 v.AddArg2(y, x)
21606 return true
21607 }
21608
21609
21610 for {
21611 if v_0.Op != OpLess16 {
21612 break
21613 }
21614 y := v_0.Args[1]
21615 x := v_0.Args[0]
21616 v.reset(OpLeq16)
21617 v.AddArg2(y, x)
21618 return true
21619 }
21620
21621
21622 for {
21623 if v_0.Op != OpLess8 {
21624 break
21625 }
21626 y := v_0.Args[1]
21627 x := v_0.Args[0]
21628 v.reset(OpLeq8)
21629 v.AddArg2(y, x)
21630 return true
21631 }
21632
21633
21634 for {
21635 if v_0.Op != OpLess64U {
21636 break
21637 }
21638 y := v_0.Args[1]
21639 x := v_0.Args[0]
21640 v.reset(OpLeq64U)
21641 v.AddArg2(y, x)
21642 return true
21643 }
21644
21645
21646 for {
21647 if v_0.Op != OpLess32U {
21648 break
21649 }
21650 y := v_0.Args[1]
21651 x := v_0.Args[0]
21652 v.reset(OpLeq32U)
21653 v.AddArg2(y, x)
21654 return true
21655 }
21656
21657
21658 for {
21659 if v_0.Op != OpLess16U {
21660 break
21661 }
21662 y := v_0.Args[1]
21663 x := v_0.Args[0]
21664 v.reset(OpLeq16U)
21665 v.AddArg2(y, x)
21666 return true
21667 }
21668
21669
21670 for {
21671 if v_0.Op != OpLess8U {
21672 break
21673 }
21674 y := v_0.Args[1]
21675 x := v_0.Args[0]
21676 v.reset(OpLeq8U)
21677 v.AddArg2(y, x)
21678 return true
21679 }
21680
21681
21682 for {
21683 if v_0.Op != OpLeq64 {
21684 break
21685 }
21686 y := v_0.Args[1]
21687 x := v_0.Args[0]
21688 v.reset(OpLess64)
21689 v.AddArg2(y, x)
21690 return true
21691 }
21692
21693
21694 for {
21695 if v_0.Op != OpLeq32 {
21696 break
21697 }
21698 y := v_0.Args[1]
21699 x := v_0.Args[0]
21700 v.reset(OpLess32)
21701 v.AddArg2(y, x)
21702 return true
21703 }
21704
21705
21706 for {
21707 if v_0.Op != OpLeq16 {
21708 break
21709 }
21710 y := v_0.Args[1]
21711 x := v_0.Args[0]
21712 v.reset(OpLess16)
21713 v.AddArg2(y, x)
21714 return true
21715 }
21716
21717
21718 for {
21719 if v_0.Op != OpLeq8 {
21720 break
21721 }
21722 y := v_0.Args[1]
21723 x := v_0.Args[0]
21724 v.reset(OpLess8)
21725 v.AddArg2(y, x)
21726 return true
21727 }
21728
21729
21730 for {
21731 if v_0.Op != OpLeq64U {
21732 break
21733 }
21734 y := v_0.Args[1]
21735 x := v_0.Args[0]
21736 v.reset(OpLess64U)
21737 v.AddArg2(y, x)
21738 return true
21739 }
21740
21741
21742 for {
21743 if v_0.Op != OpLeq32U {
21744 break
21745 }
21746 y := v_0.Args[1]
21747 x := v_0.Args[0]
21748 v.reset(OpLess32U)
21749 v.AddArg2(y, x)
21750 return true
21751 }
21752
21753
21754 for {
21755 if v_0.Op != OpLeq16U {
21756 break
21757 }
21758 y := v_0.Args[1]
21759 x := v_0.Args[0]
21760 v.reset(OpLess16U)
21761 v.AddArg2(y, x)
21762 return true
21763 }
21764
21765
21766 for {
21767 if v_0.Op != OpLeq8U {
21768 break
21769 }
21770 y := v_0.Args[1]
21771 x := v_0.Args[0]
21772 v.reset(OpLess8U)
21773 v.AddArg2(y, x)
21774 return true
21775 }
21776 return false
21777 }
21778 func rewriteValuegeneric_OpOffPtr(v *Value) bool {
21779 v_0 := v.Args[0]
21780
21781
21782 for {
21783 x := auxIntToInt64(v.AuxInt)
21784 if v_0.Op != OpOffPtr {
21785 break
21786 }
21787 y := auxIntToInt64(v_0.AuxInt)
21788 p := v_0.Args[0]
21789 v.reset(OpOffPtr)
21790 v.AuxInt = int64ToAuxInt(x + y)
21791 v.AddArg(p)
21792 return true
21793 }
21794
21795
21796
21797 for {
21798 if auxIntToInt64(v.AuxInt) != 0 {
21799 break
21800 }
21801 p := v_0
21802 if !(v.Type.Compare(p.Type) == types.CMPeq) {
21803 break
21804 }
21805 v.copyOf(p)
21806 return true
21807 }
21808 return false
21809 }
21810 func rewriteValuegeneric_OpOr16(v *Value) bool {
21811 v_1 := v.Args[1]
21812 v_0 := v.Args[0]
21813 b := v.Block
21814 config := b.Func.Config
21815
21816
21817 for {
21818 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21819 if v_0.Op != OpConst16 {
21820 continue
21821 }
21822 c := auxIntToInt16(v_0.AuxInt)
21823 if v_1.Op != OpConst16 {
21824 continue
21825 }
21826 d := auxIntToInt16(v_1.AuxInt)
21827 v.reset(OpConst16)
21828 v.AuxInt = int16ToAuxInt(c | d)
21829 return true
21830 }
21831 break
21832 }
21833
21834
21835 for {
21836 t := v.Type
21837 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21838 if v_0.Op != OpCom16 {
21839 continue
21840 }
21841 x := v_0.Args[0]
21842 if v_1.Op != OpCom16 {
21843 continue
21844 }
21845 y := v_1.Args[0]
21846 v.reset(OpCom16)
21847 v0 := b.NewValue0(v.Pos, OpAnd16, t)
21848 v0.AddArg2(x, y)
21849 v.AddArg(v0)
21850 return true
21851 }
21852 break
21853 }
21854
21855
21856 for {
21857 x := v_0
21858 if x != v_1 {
21859 break
21860 }
21861 v.copyOf(x)
21862 return true
21863 }
21864
21865
21866 for {
21867 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21868 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
21869 continue
21870 }
21871 x := v_1
21872 v.copyOf(x)
21873 return true
21874 }
21875 break
21876 }
21877
21878
21879 for {
21880 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21881 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
21882 continue
21883 }
21884 v.reset(OpConst16)
21885 v.AuxInt = int16ToAuxInt(-1)
21886 return true
21887 }
21888 break
21889 }
21890
21891
21892 for {
21893 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21894 if v_0.Op != OpCom16 {
21895 continue
21896 }
21897 x := v_0.Args[0]
21898 if x != v_1 {
21899 continue
21900 }
21901 v.reset(OpConst16)
21902 v.AuxInt = int16ToAuxInt(-1)
21903 return true
21904 }
21905 break
21906 }
21907
21908
21909 for {
21910 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21911 x := v_0
21912 if v_1.Op != OpOr16 {
21913 continue
21914 }
21915 _ = v_1.Args[1]
21916 v_1_0 := v_1.Args[0]
21917 v_1_1 := v_1.Args[1]
21918 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21919 if x != v_1_0 {
21920 continue
21921 }
21922 y := v_1_1
21923 v.reset(OpOr16)
21924 v.AddArg2(x, y)
21925 return true
21926 }
21927 }
21928 break
21929 }
21930
21931
21932
21933 for {
21934 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21935 if v_0.Op != OpAnd16 {
21936 continue
21937 }
21938 _ = v_0.Args[1]
21939 v_0_0 := v_0.Args[0]
21940 v_0_1 := v_0.Args[1]
21941 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21942 x := v_0_0
21943 if v_0_1.Op != OpConst16 {
21944 continue
21945 }
21946 c2 := auxIntToInt16(v_0_1.AuxInt)
21947 if v_1.Op != OpConst16 {
21948 continue
21949 }
21950 t := v_1.Type
21951 c1 := auxIntToInt16(v_1.AuxInt)
21952 if !(^(c1 | c2) == 0) {
21953 continue
21954 }
21955 v.reset(OpOr16)
21956 v0 := b.NewValue0(v.Pos, OpConst16, t)
21957 v0.AuxInt = int16ToAuxInt(c1)
21958 v.AddArg2(v0, x)
21959 return true
21960 }
21961 }
21962 break
21963 }
21964
21965
21966
21967 for {
21968 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21969 if v_0.Op != OpOr16 {
21970 continue
21971 }
21972 _ = v_0.Args[1]
21973 v_0_0 := v_0.Args[0]
21974 v_0_1 := v_0.Args[1]
21975 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21976 i := v_0_0
21977 if i.Op != OpConst16 {
21978 continue
21979 }
21980 t := i.Type
21981 z := v_0_1
21982 x := v_1
21983 if !(z.Op != OpConst16 && x.Op != OpConst16) {
21984 continue
21985 }
21986 v.reset(OpOr16)
21987 v0 := b.NewValue0(v.Pos, OpOr16, t)
21988 v0.AddArg2(z, x)
21989 v.AddArg2(i, v0)
21990 return true
21991 }
21992 }
21993 break
21994 }
21995
21996
21997 for {
21998 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21999 if v_0.Op != OpConst16 {
22000 continue
22001 }
22002 t := v_0.Type
22003 c := auxIntToInt16(v_0.AuxInt)
22004 if v_1.Op != OpOr16 {
22005 continue
22006 }
22007 _ = v_1.Args[1]
22008 v_1_0 := v_1.Args[0]
22009 v_1_1 := v_1.Args[1]
22010 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22011 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
22012 continue
22013 }
22014 d := auxIntToInt16(v_1_0.AuxInt)
22015 x := v_1_1
22016 v.reset(OpOr16)
22017 v0 := b.NewValue0(v.Pos, OpConst16, t)
22018 v0.AuxInt = int16ToAuxInt(c | d)
22019 v.AddArg2(v0, x)
22020 return true
22021 }
22022 }
22023 break
22024 }
22025
22026
22027
22028 for {
22029 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22030 if v_0.Op != OpLsh16x64 {
22031 continue
22032 }
22033 _ = v_0.Args[1]
22034 x := v_0.Args[0]
22035 z := v_0.Args[1]
22036 if z.Op != OpConst64 {
22037 continue
22038 }
22039 c := auxIntToInt64(z.AuxInt)
22040 if v_1.Op != OpRsh16Ux64 {
22041 continue
22042 }
22043 _ = v_1.Args[1]
22044 if x != v_1.Args[0] {
22045 continue
22046 }
22047 v_1_1 := v_1.Args[1]
22048 if v_1_1.Op != OpConst64 {
22049 continue
22050 }
22051 d := auxIntToInt64(v_1_1.AuxInt)
22052 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
22053 continue
22054 }
22055 v.reset(OpRotateLeft16)
22056 v.AddArg2(x, z)
22057 return true
22058 }
22059 break
22060 }
22061
22062
22063
22064 for {
22065 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22066 left := v_0
22067 if left.Op != OpLsh16x64 {
22068 continue
22069 }
22070 y := left.Args[1]
22071 x := left.Args[0]
22072 right := v_1
22073 if right.Op != OpRsh16Ux64 {
22074 continue
22075 }
22076 _ = right.Args[1]
22077 if x != right.Args[0] {
22078 continue
22079 }
22080 right_1 := right.Args[1]
22081 if right_1.Op != OpSub64 {
22082 continue
22083 }
22084 _ = right_1.Args[1]
22085 right_1_0 := right_1.Args[0]
22086 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
22087 continue
22088 }
22089 v.reset(OpRotateLeft16)
22090 v.AddArg2(x, y)
22091 return true
22092 }
22093 break
22094 }
22095
22096
22097
22098 for {
22099 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22100 left := v_0
22101 if left.Op != OpLsh16x32 {
22102 continue
22103 }
22104 y := left.Args[1]
22105 x := left.Args[0]
22106 right := v_1
22107 if right.Op != OpRsh16Ux32 {
22108 continue
22109 }
22110 _ = right.Args[1]
22111 if x != right.Args[0] {
22112 continue
22113 }
22114 right_1 := right.Args[1]
22115 if right_1.Op != OpSub32 {
22116 continue
22117 }
22118 _ = right_1.Args[1]
22119 right_1_0 := right_1.Args[0]
22120 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
22121 continue
22122 }
22123 v.reset(OpRotateLeft16)
22124 v.AddArg2(x, y)
22125 return true
22126 }
22127 break
22128 }
22129
22130
22131
22132 for {
22133 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22134 left := v_0
22135 if left.Op != OpLsh16x16 {
22136 continue
22137 }
22138 y := left.Args[1]
22139 x := left.Args[0]
22140 right := v_1
22141 if right.Op != OpRsh16Ux16 {
22142 continue
22143 }
22144 _ = right.Args[1]
22145 if x != right.Args[0] {
22146 continue
22147 }
22148 right_1 := right.Args[1]
22149 if right_1.Op != OpSub16 {
22150 continue
22151 }
22152 _ = right_1.Args[1]
22153 right_1_0 := right_1.Args[0]
22154 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
22155 continue
22156 }
22157 v.reset(OpRotateLeft16)
22158 v.AddArg2(x, y)
22159 return true
22160 }
22161 break
22162 }
22163
22164
22165
22166 for {
22167 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22168 left := v_0
22169 if left.Op != OpLsh16x8 {
22170 continue
22171 }
22172 y := left.Args[1]
22173 x := left.Args[0]
22174 right := v_1
22175 if right.Op != OpRsh16Ux8 {
22176 continue
22177 }
22178 _ = right.Args[1]
22179 if x != right.Args[0] {
22180 continue
22181 }
22182 right_1 := right.Args[1]
22183 if right_1.Op != OpSub8 {
22184 continue
22185 }
22186 _ = right_1.Args[1]
22187 right_1_0 := right_1.Args[0]
22188 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
22189 continue
22190 }
22191 v.reset(OpRotateLeft16)
22192 v.AddArg2(x, y)
22193 return true
22194 }
22195 break
22196 }
22197
22198
22199
22200 for {
22201 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22202 right := v_0
22203 if right.Op != OpRsh16Ux64 {
22204 continue
22205 }
22206 y := right.Args[1]
22207 x := right.Args[0]
22208 left := v_1
22209 if left.Op != OpLsh16x64 {
22210 continue
22211 }
22212 _ = left.Args[1]
22213 if x != left.Args[0] {
22214 continue
22215 }
22216 z := left.Args[1]
22217 if z.Op != OpSub64 {
22218 continue
22219 }
22220 _ = z.Args[1]
22221 z_0 := z.Args[0]
22222 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
22223 continue
22224 }
22225 v.reset(OpRotateLeft16)
22226 v.AddArg2(x, z)
22227 return true
22228 }
22229 break
22230 }
22231
22232
22233
22234 for {
22235 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22236 right := v_0
22237 if right.Op != OpRsh16Ux32 {
22238 continue
22239 }
22240 y := right.Args[1]
22241 x := right.Args[0]
22242 left := v_1
22243 if left.Op != OpLsh16x32 {
22244 continue
22245 }
22246 _ = left.Args[1]
22247 if x != left.Args[0] {
22248 continue
22249 }
22250 z := left.Args[1]
22251 if z.Op != OpSub32 {
22252 continue
22253 }
22254 _ = z.Args[1]
22255 z_0 := z.Args[0]
22256 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
22257 continue
22258 }
22259 v.reset(OpRotateLeft16)
22260 v.AddArg2(x, z)
22261 return true
22262 }
22263 break
22264 }
22265
22266
22267
22268 for {
22269 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22270 right := v_0
22271 if right.Op != OpRsh16Ux16 {
22272 continue
22273 }
22274 y := right.Args[1]
22275 x := right.Args[0]
22276 left := v_1
22277 if left.Op != OpLsh16x16 {
22278 continue
22279 }
22280 _ = left.Args[1]
22281 if x != left.Args[0] {
22282 continue
22283 }
22284 z := left.Args[1]
22285 if z.Op != OpSub16 {
22286 continue
22287 }
22288 _ = z.Args[1]
22289 z_0 := z.Args[0]
22290 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
22291 continue
22292 }
22293 v.reset(OpRotateLeft16)
22294 v.AddArg2(x, z)
22295 return true
22296 }
22297 break
22298 }
22299
22300
22301
22302 for {
22303 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22304 right := v_0
22305 if right.Op != OpRsh16Ux8 {
22306 continue
22307 }
22308 y := right.Args[1]
22309 x := right.Args[0]
22310 left := v_1
22311 if left.Op != OpLsh16x8 {
22312 continue
22313 }
22314 _ = left.Args[1]
22315 if x != left.Args[0] {
22316 continue
22317 }
22318 z := left.Args[1]
22319 if z.Op != OpSub8 {
22320 continue
22321 }
22322 _ = z.Args[1]
22323 z_0 := z.Args[0]
22324 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
22325 continue
22326 }
22327 v.reset(OpRotateLeft16)
22328 v.AddArg2(x, z)
22329 return true
22330 }
22331 break
22332 }
22333 return false
22334 }
22335 func rewriteValuegeneric_OpOr32(v *Value) bool {
22336 v_1 := v.Args[1]
22337 v_0 := v.Args[0]
22338 b := v.Block
22339 config := b.Func.Config
22340
22341
22342 for {
22343 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22344 if v_0.Op != OpConst32 {
22345 continue
22346 }
22347 c := auxIntToInt32(v_0.AuxInt)
22348 if v_1.Op != OpConst32 {
22349 continue
22350 }
22351 d := auxIntToInt32(v_1.AuxInt)
22352 v.reset(OpConst32)
22353 v.AuxInt = int32ToAuxInt(c | d)
22354 return true
22355 }
22356 break
22357 }
22358
22359
22360 for {
22361 t := v.Type
22362 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22363 if v_0.Op != OpCom32 {
22364 continue
22365 }
22366 x := v_0.Args[0]
22367 if v_1.Op != OpCom32 {
22368 continue
22369 }
22370 y := v_1.Args[0]
22371 v.reset(OpCom32)
22372 v0 := b.NewValue0(v.Pos, OpAnd32, t)
22373 v0.AddArg2(x, y)
22374 v.AddArg(v0)
22375 return true
22376 }
22377 break
22378 }
22379
22380
22381 for {
22382 x := v_0
22383 if x != v_1 {
22384 break
22385 }
22386 v.copyOf(x)
22387 return true
22388 }
22389
22390
22391 for {
22392 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22393 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
22394 continue
22395 }
22396 x := v_1
22397 v.copyOf(x)
22398 return true
22399 }
22400 break
22401 }
22402
22403
22404 for {
22405 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22406 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
22407 continue
22408 }
22409 v.reset(OpConst32)
22410 v.AuxInt = int32ToAuxInt(-1)
22411 return true
22412 }
22413 break
22414 }
22415
22416
22417 for {
22418 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22419 if v_0.Op != OpCom32 {
22420 continue
22421 }
22422 x := v_0.Args[0]
22423 if x != v_1 {
22424 continue
22425 }
22426 v.reset(OpConst32)
22427 v.AuxInt = int32ToAuxInt(-1)
22428 return true
22429 }
22430 break
22431 }
22432
22433
22434 for {
22435 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22436 x := v_0
22437 if v_1.Op != OpOr32 {
22438 continue
22439 }
22440 _ = v_1.Args[1]
22441 v_1_0 := v_1.Args[0]
22442 v_1_1 := v_1.Args[1]
22443 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22444 if x != v_1_0 {
22445 continue
22446 }
22447 y := v_1_1
22448 v.reset(OpOr32)
22449 v.AddArg2(x, y)
22450 return true
22451 }
22452 }
22453 break
22454 }
22455
22456
22457
22458 for {
22459 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22460 if v_0.Op != OpAnd32 {
22461 continue
22462 }
22463 _ = v_0.Args[1]
22464 v_0_0 := v_0.Args[0]
22465 v_0_1 := v_0.Args[1]
22466 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22467 x := v_0_0
22468 if v_0_1.Op != OpConst32 {
22469 continue
22470 }
22471 c2 := auxIntToInt32(v_0_1.AuxInt)
22472 if v_1.Op != OpConst32 {
22473 continue
22474 }
22475 t := v_1.Type
22476 c1 := auxIntToInt32(v_1.AuxInt)
22477 if !(^(c1 | c2) == 0) {
22478 continue
22479 }
22480 v.reset(OpOr32)
22481 v0 := b.NewValue0(v.Pos, OpConst32, t)
22482 v0.AuxInt = int32ToAuxInt(c1)
22483 v.AddArg2(v0, x)
22484 return true
22485 }
22486 }
22487 break
22488 }
22489
22490
22491
22492 for {
22493 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22494 if v_0.Op != OpOr32 {
22495 continue
22496 }
22497 _ = v_0.Args[1]
22498 v_0_0 := v_0.Args[0]
22499 v_0_1 := v_0.Args[1]
22500 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22501 i := v_0_0
22502 if i.Op != OpConst32 {
22503 continue
22504 }
22505 t := i.Type
22506 z := v_0_1
22507 x := v_1
22508 if !(z.Op != OpConst32 && x.Op != OpConst32) {
22509 continue
22510 }
22511 v.reset(OpOr32)
22512 v0 := b.NewValue0(v.Pos, OpOr32, t)
22513 v0.AddArg2(z, x)
22514 v.AddArg2(i, v0)
22515 return true
22516 }
22517 }
22518 break
22519 }
22520
22521
22522 for {
22523 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22524 if v_0.Op != OpConst32 {
22525 continue
22526 }
22527 t := v_0.Type
22528 c := auxIntToInt32(v_0.AuxInt)
22529 if v_1.Op != OpOr32 {
22530 continue
22531 }
22532 _ = v_1.Args[1]
22533 v_1_0 := v_1.Args[0]
22534 v_1_1 := v_1.Args[1]
22535 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22536 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
22537 continue
22538 }
22539 d := auxIntToInt32(v_1_0.AuxInt)
22540 x := v_1_1
22541 v.reset(OpOr32)
22542 v0 := b.NewValue0(v.Pos, OpConst32, t)
22543 v0.AuxInt = int32ToAuxInt(c | d)
22544 v.AddArg2(v0, x)
22545 return true
22546 }
22547 }
22548 break
22549 }
22550
22551
22552
22553 for {
22554 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22555 if v_0.Op != OpLsh32x64 {
22556 continue
22557 }
22558 _ = v_0.Args[1]
22559 x := v_0.Args[0]
22560 z := v_0.Args[1]
22561 if z.Op != OpConst64 {
22562 continue
22563 }
22564 c := auxIntToInt64(z.AuxInt)
22565 if v_1.Op != OpRsh32Ux64 {
22566 continue
22567 }
22568 _ = v_1.Args[1]
22569 if x != v_1.Args[0] {
22570 continue
22571 }
22572 v_1_1 := v_1.Args[1]
22573 if v_1_1.Op != OpConst64 {
22574 continue
22575 }
22576 d := auxIntToInt64(v_1_1.AuxInt)
22577 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
22578 continue
22579 }
22580 v.reset(OpRotateLeft32)
22581 v.AddArg2(x, z)
22582 return true
22583 }
22584 break
22585 }
22586
22587
22588
22589 for {
22590 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22591 left := v_0
22592 if left.Op != OpLsh32x64 {
22593 continue
22594 }
22595 y := left.Args[1]
22596 x := left.Args[0]
22597 right := v_1
22598 if right.Op != OpRsh32Ux64 {
22599 continue
22600 }
22601 _ = right.Args[1]
22602 if x != right.Args[0] {
22603 continue
22604 }
22605 right_1 := right.Args[1]
22606 if right_1.Op != OpSub64 {
22607 continue
22608 }
22609 _ = right_1.Args[1]
22610 right_1_0 := right_1.Args[0]
22611 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22612 continue
22613 }
22614 v.reset(OpRotateLeft32)
22615 v.AddArg2(x, y)
22616 return true
22617 }
22618 break
22619 }
22620
22621
22622
22623 for {
22624 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22625 left := v_0
22626 if left.Op != OpLsh32x32 {
22627 continue
22628 }
22629 y := left.Args[1]
22630 x := left.Args[0]
22631 right := v_1
22632 if right.Op != OpRsh32Ux32 {
22633 continue
22634 }
22635 _ = right.Args[1]
22636 if x != right.Args[0] {
22637 continue
22638 }
22639 right_1 := right.Args[1]
22640 if right_1.Op != OpSub32 {
22641 continue
22642 }
22643 _ = right_1.Args[1]
22644 right_1_0 := right_1.Args[0]
22645 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22646 continue
22647 }
22648 v.reset(OpRotateLeft32)
22649 v.AddArg2(x, y)
22650 return true
22651 }
22652 break
22653 }
22654
22655
22656
22657 for {
22658 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22659 left := v_0
22660 if left.Op != OpLsh32x16 {
22661 continue
22662 }
22663 y := left.Args[1]
22664 x := left.Args[0]
22665 right := v_1
22666 if right.Op != OpRsh32Ux16 {
22667 continue
22668 }
22669 _ = right.Args[1]
22670 if x != right.Args[0] {
22671 continue
22672 }
22673 right_1 := right.Args[1]
22674 if right_1.Op != OpSub16 {
22675 continue
22676 }
22677 _ = right_1.Args[1]
22678 right_1_0 := right_1.Args[0]
22679 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22680 continue
22681 }
22682 v.reset(OpRotateLeft32)
22683 v.AddArg2(x, y)
22684 return true
22685 }
22686 break
22687 }
22688
22689
22690
22691 for {
22692 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22693 left := v_0
22694 if left.Op != OpLsh32x8 {
22695 continue
22696 }
22697 y := left.Args[1]
22698 x := left.Args[0]
22699 right := v_1
22700 if right.Op != OpRsh32Ux8 {
22701 continue
22702 }
22703 _ = right.Args[1]
22704 if x != right.Args[0] {
22705 continue
22706 }
22707 right_1 := right.Args[1]
22708 if right_1.Op != OpSub8 {
22709 continue
22710 }
22711 _ = right_1.Args[1]
22712 right_1_0 := right_1.Args[0]
22713 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22714 continue
22715 }
22716 v.reset(OpRotateLeft32)
22717 v.AddArg2(x, y)
22718 return true
22719 }
22720 break
22721 }
22722
22723
22724
22725 for {
22726 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22727 right := v_0
22728 if right.Op != OpRsh32Ux64 {
22729 continue
22730 }
22731 y := right.Args[1]
22732 x := right.Args[0]
22733 left := v_1
22734 if left.Op != OpLsh32x64 {
22735 continue
22736 }
22737 _ = left.Args[1]
22738 if x != left.Args[0] {
22739 continue
22740 }
22741 z := left.Args[1]
22742 if z.Op != OpSub64 {
22743 continue
22744 }
22745 _ = z.Args[1]
22746 z_0 := z.Args[0]
22747 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22748 continue
22749 }
22750 v.reset(OpRotateLeft32)
22751 v.AddArg2(x, z)
22752 return true
22753 }
22754 break
22755 }
22756
22757
22758
22759 for {
22760 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22761 right := v_0
22762 if right.Op != OpRsh32Ux32 {
22763 continue
22764 }
22765 y := right.Args[1]
22766 x := right.Args[0]
22767 left := v_1
22768 if left.Op != OpLsh32x32 {
22769 continue
22770 }
22771 _ = left.Args[1]
22772 if x != left.Args[0] {
22773 continue
22774 }
22775 z := left.Args[1]
22776 if z.Op != OpSub32 {
22777 continue
22778 }
22779 _ = z.Args[1]
22780 z_0 := z.Args[0]
22781 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22782 continue
22783 }
22784 v.reset(OpRotateLeft32)
22785 v.AddArg2(x, z)
22786 return true
22787 }
22788 break
22789 }
22790
22791
22792
22793 for {
22794 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22795 right := v_0
22796 if right.Op != OpRsh32Ux16 {
22797 continue
22798 }
22799 y := right.Args[1]
22800 x := right.Args[0]
22801 left := v_1
22802 if left.Op != OpLsh32x16 {
22803 continue
22804 }
22805 _ = left.Args[1]
22806 if x != left.Args[0] {
22807 continue
22808 }
22809 z := left.Args[1]
22810 if z.Op != OpSub16 {
22811 continue
22812 }
22813 _ = z.Args[1]
22814 z_0 := z.Args[0]
22815 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22816 continue
22817 }
22818 v.reset(OpRotateLeft32)
22819 v.AddArg2(x, z)
22820 return true
22821 }
22822 break
22823 }
22824
22825
22826
22827 for {
22828 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22829 right := v_0
22830 if right.Op != OpRsh32Ux8 {
22831 continue
22832 }
22833 y := right.Args[1]
22834 x := right.Args[0]
22835 left := v_1
22836 if left.Op != OpLsh32x8 {
22837 continue
22838 }
22839 _ = left.Args[1]
22840 if x != left.Args[0] {
22841 continue
22842 }
22843 z := left.Args[1]
22844 if z.Op != OpSub8 {
22845 continue
22846 }
22847 _ = z.Args[1]
22848 z_0 := z.Args[0]
22849 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22850 continue
22851 }
22852 v.reset(OpRotateLeft32)
22853 v.AddArg2(x, z)
22854 return true
22855 }
22856 break
22857 }
22858 return false
22859 }
22860 func rewriteValuegeneric_OpOr64(v *Value) bool {
22861 v_1 := v.Args[1]
22862 v_0 := v.Args[0]
22863 b := v.Block
22864 config := b.Func.Config
22865
22866
22867 for {
22868 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22869 if v_0.Op != OpConst64 {
22870 continue
22871 }
22872 c := auxIntToInt64(v_0.AuxInt)
22873 if v_1.Op != OpConst64 {
22874 continue
22875 }
22876 d := auxIntToInt64(v_1.AuxInt)
22877 v.reset(OpConst64)
22878 v.AuxInt = int64ToAuxInt(c | d)
22879 return true
22880 }
22881 break
22882 }
22883
22884
22885 for {
22886 t := v.Type
22887 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22888 if v_0.Op != OpCom64 {
22889 continue
22890 }
22891 x := v_0.Args[0]
22892 if v_1.Op != OpCom64 {
22893 continue
22894 }
22895 y := v_1.Args[0]
22896 v.reset(OpCom64)
22897 v0 := b.NewValue0(v.Pos, OpAnd64, t)
22898 v0.AddArg2(x, y)
22899 v.AddArg(v0)
22900 return true
22901 }
22902 break
22903 }
22904
22905
22906 for {
22907 x := v_0
22908 if x != v_1 {
22909 break
22910 }
22911 v.copyOf(x)
22912 return true
22913 }
22914
22915
22916 for {
22917 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22918 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
22919 continue
22920 }
22921 x := v_1
22922 v.copyOf(x)
22923 return true
22924 }
22925 break
22926 }
22927
22928
22929 for {
22930 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22931 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
22932 continue
22933 }
22934 v.reset(OpConst64)
22935 v.AuxInt = int64ToAuxInt(-1)
22936 return true
22937 }
22938 break
22939 }
22940
22941
22942 for {
22943 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22944 if v_0.Op != OpCom64 {
22945 continue
22946 }
22947 x := v_0.Args[0]
22948 if x != v_1 {
22949 continue
22950 }
22951 v.reset(OpConst64)
22952 v.AuxInt = int64ToAuxInt(-1)
22953 return true
22954 }
22955 break
22956 }
22957
22958
22959 for {
22960 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22961 x := v_0
22962 if v_1.Op != OpOr64 {
22963 continue
22964 }
22965 _ = v_1.Args[1]
22966 v_1_0 := v_1.Args[0]
22967 v_1_1 := v_1.Args[1]
22968 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22969 if x != v_1_0 {
22970 continue
22971 }
22972 y := v_1_1
22973 v.reset(OpOr64)
22974 v.AddArg2(x, y)
22975 return true
22976 }
22977 }
22978 break
22979 }
22980
22981
22982
22983 for {
22984 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22985 if v_0.Op != OpAnd64 {
22986 continue
22987 }
22988 _ = v_0.Args[1]
22989 v_0_0 := v_0.Args[0]
22990 v_0_1 := v_0.Args[1]
22991 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22992 x := v_0_0
22993 if v_0_1.Op != OpConst64 {
22994 continue
22995 }
22996 c2 := auxIntToInt64(v_0_1.AuxInt)
22997 if v_1.Op != OpConst64 {
22998 continue
22999 }
23000 t := v_1.Type
23001 c1 := auxIntToInt64(v_1.AuxInt)
23002 if !(^(c1 | c2) == 0) {
23003 continue
23004 }
23005 v.reset(OpOr64)
23006 v0 := b.NewValue0(v.Pos, OpConst64, t)
23007 v0.AuxInt = int64ToAuxInt(c1)
23008 v.AddArg2(v0, x)
23009 return true
23010 }
23011 }
23012 break
23013 }
23014
23015
23016
23017 for {
23018 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23019 if v_0.Op != OpOr64 {
23020 continue
23021 }
23022 _ = v_0.Args[1]
23023 v_0_0 := v_0.Args[0]
23024 v_0_1 := v_0.Args[1]
23025 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
23026 i := v_0_0
23027 if i.Op != OpConst64 {
23028 continue
23029 }
23030 t := i.Type
23031 z := v_0_1
23032 x := v_1
23033 if !(z.Op != OpConst64 && x.Op != OpConst64) {
23034 continue
23035 }
23036 v.reset(OpOr64)
23037 v0 := b.NewValue0(v.Pos, OpOr64, t)
23038 v0.AddArg2(z, x)
23039 v.AddArg2(i, v0)
23040 return true
23041 }
23042 }
23043 break
23044 }
23045
23046
23047 for {
23048 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23049 if v_0.Op != OpConst64 {
23050 continue
23051 }
23052 t := v_0.Type
23053 c := auxIntToInt64(v_0.AuxInt)
23054 if v_1.Op != OpOr64 {
23055 continue
23056 }
23057 _ = v_1.Args[1]
23058 v_1_0 := v_1.Args[0]
23059 v_1_1 := v_1.Args[1]
23060 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
23061 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
23062 continue
23063 }
23064 d := auxIntToInt64(v_1_0.AuxInt)
23065 x := v_1_1
23066 v.reset(OpOr64)
23067 v0 := b.NewValue0(v.Pos, OpConst64, t)
23068 v0.AuxInt = int64ToAuxInt(c | d)
23069 v.AddArg2(v0, x)
23070 return true
23071 }
23072 }
23073 break
23074 }
23075
23076
23077
23078 for {
23079 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23080 if v_0.Op != OpLsh64x64 {
23081 continue
23082 }
23083 _ = v_0.Args[1]
23084 x := v_0.Args[0]
23085 z := v_0.Args[1]
23086 if z.Op != OpConst64 {
23087 continue
23088 }
23089 c := auxIntToInt64(z.AuxInt)
23090 if v_1.Op != OpRsh64Ux64 {
23091 continue
23092 }
23093 _ = v_1.Args[1]
23094 if x != v_1.Args[0] {
23095 continue
23096 }
23097 v_1_1 := v_1.Args[1]
23098 if v_1_1.Op != OpConst64 {
23099 continue
23100 }
23101 d := auxIntToInt64(v_1_1.AuxInt)
23102 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
23103 continue
23104 }
23105 v.reset(OpRotateLeft64)
23106 v.AddArg2(x, z)
23107 return true
23108 }
23109 break
23110 }
23111
23112
23113
23114 for {
23115 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23116 left := v_0
23117 if left.Op != OpLsh64x64 {
23118 continue
23119 }
23120 y := left.Args[1]
23121 x := left.Args[0]
23122 right := v_1
23123 if right.Op != OpRsh64Ux64 {
23124 continue
23125 }
23126 _ = right.Args[1]
23127 if x != right.Args[0] {
23128 continue
23129 }
23130 right_1 := right.Args[1]
23131 if right_1.Op != OpSub64 {
23132 continue
23133 }
23134 _ = right_1.Args[1]
23135 right_1_0 := right_1.Args[0]
23136 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
23137 continue
23138 }
23139 v.reset(OpRotateLeft64)
23140 v.AddArg2(x, y)
23141 return true
23142 }
23143 break
23144 }
23145
23146
23147
23148 for {
23149 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23150 left := v_0
23151 if left.Op != OpLsh64x32 {
23152 continue
23153 }
23154 y := left.Args[1]
23155 x := left.Args[0]
23156 right := v_1
23157 if right.Op != OpRsh64Ux32 {
23158 continue
23159 }
23160 _ = right.Args[1]
23161 if x != right.Args[0] {
23162 continue
23163 }
23164 right_1 := right.Args[1]
23165 if right_1.Op != OpSub32 {
23166 continue
23167 }
23168 _ = right_1.Args[1]
23169 right_1_0 := right_1.Args[0]
23170 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
23171 continue
23172 }
23173 v.reset(OpRotateLeft64)
23174 v.AddArg2(x, y)
23175 return true
23176 }
23177 break
23178 }
23179
23180
23181
23182 for {
23183 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23184 left := v_0
23185 if left.Op != OpLsh64x16 {
23186 continue
23187 }
23188 y := left.Args[1]
23189 x := left.Args[0]
23190 right := v_1
23191 if right.Op != OpRsh64Ux16 {
23192 continue
23193 }
23194 _ = right.Args[1]
23195 if x != right.Args[0] {
23196 continue
23197 }
23198 right_1 := right.Args[1]
23199 if right_1.Op != OpSub16 {
23200 continue
23201 }
23202 _ = right_1.Args[1]
23203 right_1_0 := right_1.Args[0]
23204 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
23205 continue
23206 }
23207 v.reset(OpRotateLeft64)
23208 v.AddArg2(x, y)
23209 return true
23210 }
23211 break
23212 }
23213
23214
23215
23216 for {
23217 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23218 left := v_0
23219 if left.Op != OpLsh64x8 {
23220 continue
23221 }
23222 y := left.Args[1]
23223 x := left.Args[0]
23224 right := v_1
23225 if right.Op != OpRsh64Ux8 {
23226 continue
23227 }
23228 _ = right.Args[1]
23229 if x != right.Args[0] {
23230 continue
23231 }
23232 right_1 := right.Args[1]
23233 if right_1.Op != OpSub8 {
23234 continue
23235 }
23236 _ = right_1.Args[1]
23237 right_1_0 := right_1.Args[0]
23238 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
23239 continue
23240 }
23241 v.reset(OpRotateLeft64)
23242 v.AddArg2(x, y)
23243 return true
23244 }
23245 break
23246 }
23247
23248
23249
23250 for {
23251 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23252 right := v_0
23253 if right.Op != OpRsh64Ux64 {
23254 continue
23255 }
23256 y := right.Args[1]
23257 x := right.Args[0]
23258 left := v_1
23259 if left.Op != OpLsh64x64 {
23260 continue
23261 }
23262 _ = left.Args[1]
23263 if x != left.Args[0] {
23264 continue
23265 }
23266 z := left.Args[1]
23267 if z.Op != OpSub64 {
23268 continue
23269 }
23270 _ = z.Args[1]
23271 z_0 := z.Args[0]
23272 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
23273 continue
23274 }
23275 v.reset(OpRotateLeft64)
23276 v.AddArg2(x, z)
23277 return true
23278 }
23279 break
23280 }
23281
23282
23283
23284 for {
23285 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23286 right := v_0
23287 if right.Op != OpRsh64Ux32 {
23288 continue
23289 }
23290 y := right.Args[1]
23291 x := right.Args[0]
23292 left := v_1
23293 if left.Op != OpLsh64x32 {
23294 continue
23295 }
23296 _ = left.Args[1]
23297 if x != left.Args[0] {
23298 continue
23299 }
23300 z := left.Args[1]
23301 if z.Op != OpSub32 {
23302 continue
23303 }
23304 _ = z.Args[1]
23305 z_0 := z.Args[0]
23306 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
23307 continue
23308 }
23309 v.reset(OpRotateLeft64)
23310 v.AddArg2(x, z)
23311 return true
23312 }
23313 break
23314 }
23315
23316
23317
23318 for {
23319 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23320 right := v_0
23321 if right.Op != OpRsh64Ux16 {
23322 continue
23323 }
23324 y := right.Args[1]
23325 x := right.Args[0]
23326 left := v_1
23327 if left.Op != OpLsh64x16 {
23328 continue
23329 }
23330 _ = left.Args[1]
23331 if x != left.Args[0] {
23332 continue
23333 }
23334 z := left.Args[1]
23335 if z.Op != OpSub16 {
23336 continue
23337 }
23338 _ = z.Args[1]
23339 z_0 := z.Args[0]
23340 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
23341 continue
23342 }
23343 v.reset(OpRotateLeft64)
23344 v.AddArg2(x, z)
23345 return true
23346 }
23347 break
23348 }
23349
23350
23351
23352 for {
23353 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23354 right := v_0
23355 if right.Op != OpRsh64Ux8 {
23356 continue
23357 }
23358 y := right.Args[1]
23359 x := right.Args[0]
23360 left := v_1
23361 if left.Op != OpLsh64x8 {
23362 continue
23363 }
23364 _ = left.Args[1]
23365 if x != left.Args[0] {
23366 continue
23367 }
23368 z := left.Args[1]
23369 if z.Op != OpSub8 {
23370 continue
23371 }
23372 _ = z.Args[1]
23373 z_0 := z.Args[0]
23374 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
23375 continue
23376 }
23377 v.reset(OpRotateLeft64)
23378 v.AddArg2(x, z)
23379 return true
23380 }
23381 break
23382 }
23383 return false
23384 }
23385 func rewriteValuegeneric_OpOr8(v *Value) bool {
23386 v_1 := v.Args[1]
23387 v_0 := v.Args[0]
23388 b := v.Block
23389 config := b.Func.Config
23390
23391
23392 for {
23393 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23394 if v_0.Op != OpConst8 {
23395 continue
23396 }
23397 c := auxIntToInt8(v_0.AuxInt)
23398 if v_1.Op != OpConst8 {
23399 continue
23400 }
23401 d := auxIntToInt8(v_1.AuxInt)
23402 v.reset(OpConst8)
23403 v.AuxInt = int8ToAuxInt(c | d)
23404 return true
23405 }
23406 break
23407 }
23408
23409
23410 for {
23411 t := v.Type
23412 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23413 if v_0.Op != OpCom8 {
23414 continue
23415 }
23416 x := v_0.Args[0]
23417 if v_1.Op != OpCom8 {
23418 continue
23419 }
23420 y := v_1.Args[0]
23421 v.reset(OpCom8)
23422 v0 := b.NewValue0(v.Pos, OpAnd8, t)
23423 v0.AddArg2(x, y)
23424 v.AddArg(v0)
23425 return true
23426 }
23427 break
23428 }
23429
23430
23431 for {
23432 x := v_0
23433 if x != v_1 {
23434 break
23435 }
23436 v.copyOf(x)
23437 return true
23438 }
23439
23440
23441 for {
23442 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23443 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
23444 continue
23445 }
23446 x := v_1
23447 v.copyOf(x)
23448 return true
23449 }
23450 break
23451 }
23452
23453
23454 for {
23455 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23456 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
23457 continue
23458 }
23459 v.reset(OpConst8)
23460 v.AuxInt = int8ToAuxInt(-1)
23461 return true
23462 }
23463 break
23464 }
23465
23466
23467 for {
23468 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23469 if v_0.Op != OpCom8 {
23470 continue
23471 }
23472 x := v_0.Args[0]
23473 if x != v_1 {
23474 continue
23475 }
23476 v.reset(OpConst8)
23477 v.AuxInt = int8ToAuxInt(-1)
23478 return true
23479 }
23480 break
23481 }
23482
23483
23484 for {
23485 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23486 x := v_0
23487 if v_1.Op != OpOr8 {
23488 continue
23489 }
23490 _ = v_1.Args[1]
23491 v_1_0 := v_1.Args[0]
23492 v_1_1 := v_1.Args[1]
23493 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
23494 if x != v_1_0 {
23495 continue
23496 }
23497 y := v_1_1
23498 v.reset(OpOr8)
23499 v.AddArg2(x, y)
23500 return true
23501 }
23502 }
23503 break
23504 }
23505
23506
23507
23508 for {
23509 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23510 if v_0.Op != OpAnd8 {
23511 continue
23512 }
23513 _ = v_0.Args[1]
23514 v_0_0 := v_0.Args[0]
23515 v_0_1 := v_0.Args[1]
23516 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
23517 x := v_0_0
23518 if v_0_1.Op != OpConst8 {
23519 continue
23520 }
23521 c2 := auxIntToInt8(v_0_1.AuxInt)
23522 if v_1.Op != OpConst8 {
23523 continue
23524 }
23525 t := v_1.Type
23526 c1 := auxIntToInt8(v_1.AuxInt)
23527 if !(^(c1 | c2) == 0) {
23528 continue
23529 }
23530 v.reset(OpOr8)
23531 v0 := b.NewValue0(v.Pos, OpConst8, t)
23532 v0.AuxInt = int8ToAuxInt(c1)
23533 v.AddArg2(v0, x)
23534 return true
23535 }
23536 }
23537 break
23538 }
23539
23540
23541
23542 for {
23543 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23544 if v_0.Op != OpOr8 {
23545 continue
23546 }
23547 _ = v_0.Args[1]
23548 v_0_0 := v_0.Args[0]
23549 v_0_1 := v_0.Args[1]
23550 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
23551 i := v_0_0
23552 if i.Op != OpConst8 {
23553 continue
23554 }
23555 t := i.Type
23556 z := v_0_1
23557 x := v_1
23558 if !(z.Op != OpConst8 && x.Op != OpConst8) {
23559 continue
23560 }
23561 v.reset(OpOr8)
23562 v0 := b.NewValue0(v.Pos, OpOr8, t)
23563 v0.AddArg2(z, x)
23564 v.AddArg2(i, v0)
23565 return true
23566 }
23567 }
23568 break
23569 }
23570
23571
23572 for {
23573 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23574 if v_0.Op != OpConst8 {
23575 continue
23576 }
23577 t := v_0.Type
23578 c := auxIntToInt8(v_0.AuxInt)
23579 if v_1.Op != OpOr8 {
23580 continue
23581 }
23582 _ = v_1.Args[1]
23583 v_1_0 := v_1.Args[0]
23584 v_1_1 := v_1.Args[1]
23585 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
23586 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
23587 continue
23588 }
23589 d := auxIntToInt8(v_1_0.AuxInt)
23590 x := v_1_1
23591 v.reset(OpOr8)
23592 v0 := b.NewValue0(v.Pos, OpConst8, t)
23593 v0.AuxInt = int8ToAuxInt(c | d)
23594 v.AddArg2(v0, x)
23595 return true
23596 }
23597 }
23598 break
23599 }
23600
23601
23602
23603 for {
23604 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23605 if v_0.Op != OpLsh8x64 {
23606 continue
23607 }
23608 _ = v_0.Args[1]
23609 x := v_0.Args[0]
23610 z := v_0.Args[1]
23611 if z.Op != OpConst64 {
23612 continue
23613 }
23614 c := auxIntToInt64(z.AuxInt)
23615 if v_1.Op != OpRsh8Ux64 {
23616 continue
23617 }
23618 _ = v_1.Args[1]
23619 if x != v_1.Args[0] {
23620 continue
23621 }
23622 v_1_1 := v_1.Args[1]
23623 if v_1_1.Op != OpConst64 {
23624 continue
23625 }
23626 d := auxIntToInt64(v_1_1.AuxInt)
23627 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
23628 continue
23629 }
23630 v.reset(OpRotateLeft8)
23631 v.AddArg2(x, z)
23632 return true
23633 }
23634 break
23635 }
23636
23637
23638
23639 for {
23640 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23641 left := v_0
23642 if left.Op != OpLsh8x64 {
23643 continue
23644 }
23645 y := left.Args[1]
23646 x := left.Args[0]
23647 right := v_1
23648 if right.Op != OpRsh8Ux64 {
23649 continue
23650 }
23651 _ = right.Args[1]
23652 if x != right.Args[0] {
23653 continue
23654 }
23655 right_1 := right.Args[1]
23656 if right_1.Op != OpSub64 {
23657 continue
23658 }
23659 _ = right_1.Args[1]
23660 right_1_0 := right_1.Args[0]
23661 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23662 continue
23663 }
23664 v.reset(OpRotateLeft8)
23665 v.AddArg2(x, y)
23666 return true
23667 }
23668 break
23669 }
23670
23671
23672
23673 for {
23674 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23675 left := v_0
23676 if left.Op != OpLsh8x32 {
23677 continue
23678 }
23679 y := left.Args[1]
23680 x := left.Args[0]
23681 right := v_1
23682 if right.Op != OpRsh8Ux32 {
23683 continue
23684 }
23685 _ = right.Args[1]
23686 if x != right.Args[0] {
23687 continue
23688 }
23689 right_1 := right.Args[1]
23690 if right_1.Op != OpSub32 {
23691 continue
23692 }
23693 _ = right_1.Args[1]
23694 right_1_0 := right_1.Args[0]
23695 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23696 continue
23697 }
23698 v.reset(OpRotateLeft8)
23699 v.AddArg2(x, y)
23700 return true
23701 }
23702 break
23703 }
23704
23705
23706
23707 for {
23708 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23709 left := v_0
23710 if left.Op != OpLsh8x16 {
23711 continue
23712 }
23713 y := left.Args[1]
23714 x := left.Args[0]
23715 right := v_1
23716 if right.Op != OpRsh8Ux16 {
23717 continue
23718 }
23719 _ = right.Args[1]
23720 if x != right.Args[0] {
23721 continue
23722 }
23723 right_1 := right.Args[1]
23724 if right_1.Op != OpSub16 {
23725 continue
23726 }
23727 _ = right_1.Args[1]
23728 right_1_0 := right_1.Args[0]
23729 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23730 continue
23731 }
23732 v.reset(OpRotateLeft8)
23733 v.AddArg2(x, y)
23734 return true
23735 }
23736 break
23737 }
23738
23739
23740
23741 for {
23742 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23743 left := v_0
23744 if left.Op != OpLsh8x8 {
23745 continue
23746 }
23747 y := left.Args[1]
23748 x := left.Args[0]
23749 right := v_1
23750 if right.Op != OpRsh8Ux8 {
23751 continue
23752 }
23753 _ = right.Args[1]
23754 if x != right.Args[0] {
23755 continue
23756 }
23757 right_1 := right.Args[1]
23758 if right_1.Op != OpSub8 {
23759 continue
23760 }
23761 _ = right_1.Args[1]
23762 right_1_0 := right_1.Args[0]
23763 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23764 continue
23765 }
23766 v.reset(OpRotateLeft8)
23767 v.AddArg2(x, y)
23768 return true
23769 }
23770 break
23771 }
23772
23773
23774
23775 for {
23776 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23777 right := v_0
23778 if right.Op != OpRsh8Ux64 {
23779 continue
23780 }
23781 y := right.Args[1]
23782 x := right.Args[0]
23783 left := v_1
23784 if left.Op != OpLsh8x64 {
23785 continue
23786 }
23787 _ = left.Args[1]
23788 if x != left.Args[0] {
23789 continue
23790 }
23791 z := left.Args[1]
23792 if z.Op != OpSub64 {
23793 continue
23794 }
23795 _ = z.Args[1]
23796 z_0 := z.Args[0]
23797 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23798 continue
23799 }
23800 v.reset(OpRotateLeft8)
23801 v.AddArg2(x, z)
23802 return true
23803 }
23804 break
23805 }
23806
23807
23808
23809 for {
23810 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23811 right := v_0
23812 if right.Op != OpRsh8Ux32 {
23813 continue
23814 }
23815 y := right.Args[1]
23816 x := right.Args[0]
23817 left := v_1
23818 if left.Op != OpLsh8x32 {
23819 continue
23820 }
23821 _ = left.Args[1]
23822 if x != left.Args[0] {
23823 continue
23824 }
23825 z := left.Args[1]
23826 if z.Op != OpSub32 {
23827 continue
23828 }
23829 _ = z.Args[1]
23830 z_0 := z.Args[0]
23831 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23832 continue
23833 }
23834 v.reset(OpRotateLeft8)
23835 v.AddArg2(x, z)
23836 return true
23837 }
23838 break
23839 }
23840
23841
23842
23843 for {
23844 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23845 right := v_0
23846 if right.Op != OpRsh8Ux16 {
23847 continue
23848 }
23849 y := right.Args[1]
23850 x := right.Args[0]
23851 left := v_1
23852 if left.Op != OpLsh8x16 {
23853 continue
23854 }
23855 _ = left.Args[1]
23856 if x != left.Args[0] {
23857 continue
23858 }
23859 z := left.Args[1]
23860 if z.Op != OpSub16 {
23861 continue
23862 }
23863 _ = z.Args[1]
23864 z_0 := z.Args[0]
23865 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23866 continue
23867 }
23868 v.reset(OpRotateLeft8)
23869 v.AddArg2(x, z)
23870 return true
23871 }
23872 break
23873 }
23874
23875
23876
23877 for {
23878 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23879 right := v_0
23880 if right.Op != OpRsh8Ux8 {
23881 continue
23882 }
23883 y := right.Args[1]
23884 x := right.Args[0]
23885 left := v_1
23886 if left.Op != OpLsh8x8 {
23887 continue
23888 }
23889 _ = left.Args[1]
23890 if x != left.Args[0] {
23891 continue
23892 }
23893 z := left.Args[1]
23894 if z.Op != OpSub8 {
23895 continue
23896 }
23897 _ = z.Args[1]
23898 z_0 := z.Args[0]
23899 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23900 continue
23901 }
23902 v.reset(OpRotateLeft8)
23903 v.AddArg2(x, z)
23904 return true
23905 }
23906 break
23907 }
23908 return false
23909 }
23910 func rewriteValuegeneric_OpOrB(v *Value) bool {
23911 v_1 := v.Args[1]
23912 v_0 := v.Args[0]
23913 b := v.Block
23914 typ := &b.Func.Config.Types
23915
23916
23917
23918 for {
23919 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23920 if v_0.Op != OpLess64 {
23921 continue
23922 }
23923 x := v_0.Args[1]
23924 v_0_0 := v_0.Args[0]
23925 if v_0_0.Op != OpConst64 {
23926 continue
23927 }
23928 c := auxIntToInt64(v_0_0.AuxInt)
23929 if v_1.Op != OpLess64 {
23930 continue
23931 }
23932 _ = v_1.Args[1]
23933 if x != v_1.Args[0] {
23934 continue
23935 }
23936 v_1_1 := v_1.Args[1]
23937 if v_1_1.Op != OpConst64 {
23938 continue
23939 }
23940 d := auxIntToInt64(v_1_1.AuxInt)
23941 if !(c >= d) {
23942 continue
23943 }
23944 v.reset(OpLess64U)
23945 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23946 v0.AuxInt = int64ToAuxInt(c - d)
23947 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23948 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23949 v2.AuxInt = int64ToAuxInt(d)
23950 v1.AddArg2(x, v2)
23951 v.AddArg2(v0, v1)
23952 return true
23953 }
23954 break
23955 }
23956
23957
23958
23959 for {
23960 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23961 if v_0.Op != OpLeq64 {
23962 continue
23963 }
23964 x := v_0.Args[1]
23965 v_0_0 := v_0.Args[0]
23966 if v_0_0.Op != OpConst64 {
23967 continue
23968 }
23969 c := auxIntToInt64(v_0_0.AuxInt)
23970 if v_1.Op != OpLess64 {
23971 continue
23972 }
23973 _ = v_1.Args[1]
23974 if x != v_1.Args[0] {
23975 continue
23976 }
23977 v_1_1 := v_1.Args[1]
23978 if v_1_1.Op != OpConst64 {
23979 continue
23980 }
23981 d := auxIntToInt64(v_1_1.AuxInt)
23982 if !(c >= d) {
23983 continue
23984 }
23985 v.reset(OpLeq64U)
23986 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23987 v0.AuxInt = int64ToAuxInt(c - d)
23988 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23989 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23990 v2.AuxInt = int64ToAuxInt(d)
23991 v1.AddArg2(x, v2)
23992 v.AddArg2(v0, v1)
23993 return true
23994 }
23995 break
23996 }
23997
23998
23999
24000 for {
24001 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24002 if v_0.Op != OpLess32 {
24003 continue
24004 }
24005 x := v_0.Args[1]
24006 v_0_0 := v_0.Args[0]
24007 if v_0_0.Op != OpConst32 {
24008 continue
24009 }
24010 c := auxIntToInt32(v_0_0.AuxInt)
24011 if v_1.Op != OpLess32 {
24012 continue
24013 }
24014 _ = v_1.Args[1]
24015 if x != v_1.Args[0] {
24016 continue
24017 }
24018 v_1_1 := v_1.Args[1]
24019 if v_1_1.Op != OpConst32 {
24020 continue
24021 }
24022 d := auxIntToInt32(v_1_1.AuxInt)
24023 if !(c >= d) {
24024 continue
24025 }
24026 v.reset(OpLess32U)
24027 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
24028 v0.AuxInt = int32ToAuxInt(c - d)
24029 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
24030 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
24031 v2.AuxInt = int32ToAuxInt(d)
24032 v1.AddArg2(x, v2)
24033 v.AddArg2(v0, v1)
24034 return true
24035 }
24036 break
24037 }
24038
24039
24040
24041 for {
24042 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24043 if v_0.Op != OpLeq32 {
24044 continue
24045 }
24046 x := v_0.Args[1]
24047 v_0_0 := v_0.Args[0]
24048 if v_0_0.Op != OpConst32 {
24049 continue
24050 }
24051 c := auxIntToInt32(v_0_0.AuxInt)
24052 if v_1.Op != OpLess32 {
24053 continue
24054 }
24055 _ = v_1.Args[1]
24056 if x != v_1.Args[0] {
24057 continue
24058 }
24059 v_1_1 := v_1.Args[1]
24060 if v_1_1.Op != OpConst32 {
24061 continue
24062 }
24063 d := auxIntToInt32(v_1_1.AuxInt)
24064 if !(c >= d) {
24065 continue
24066 }
24067 v.reset(OpLeq32U)
24068 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
24069 v0.AuxInt = int32ToAuxInt(c - d)
24070 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
24071 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
24072 v2.AuxInt = int32ToAuxInt(d)
24073 v1.AddArg2(x, v2)
24074 v.AddArg2(v0, v1)
24075 return true
24076 }
24077 break
24078 }
24079
24080
24081
24082 for {
24083 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24084 if v_0.Op != OpLess16 {
24085 continue
24086 }
24087 x := v_0.Args[1]
24088 v_0_0 := v_0.Args[0]
24089 if v_0_0.Op != OpConst16 {
24090 continue
24091 }
24092 c := auxIntToInt16(v_0_0.AuxInt)
24093 if v_1.Op != OpLess16 {
24094 continue
24095 }
24096 _ = v_1.Args[1]
24097 if x != v_1.Args[0] {
24098 continue
24099 }
24100 v_1_1 := v_1.Args[1]
24101 if v_1_1.Op != OpConst16 {
24102 continue
24103 }
24104 d := auxIntToInt16(v_1_1.AuxInt)
24105 if !(c >= d) {
24106 continue
24107 }
24108 v.reset(OpLess16U)
24109 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24110 v0.AuxInt = int16ToAuxInt(c - d)
24111 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24112 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24113 v2.AuxInt = int16ToAuxInt(d)
24114 v1.AddArg2(x, v2)
24115 v.AddArg2(v0, v1)
24116 return true
24117 }
24118 break
24119 }
24120
24121
24122
24123 for {
24124 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24125 if v_0.Op != OpLeq16 {
24126 continue
24127 }
24128 x := v_0.Args[1]
24129 v_0_0 := v_0.Args[0]
24130 if v_0_0.Op != OpConst16 {
24131 continue
24132 }
24133 c := auxIntToInt16(v_0_0.AuxInt)
24134 if v_1.Op != OpLess16 {
24135 continue
24136 }
24137 _ = v_1.Args[1]
24138 if x != v_1.Args[0] {
24139 continue
24140 }
24141 v_1_1 := v_1.Args[1]
24142 if v_1_1.Op != OpConst16 {
24143 continue
24144 }
24145 d := auxIntToInt16(v_1_1.AuxInt)
24146 if !(c >= d) {
24147 continue
24148 }
24149 v.reset(OpLeq16U)
24150 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24151 v0.AuxInt = int16ToAuxInt(c - d)
24152 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24153 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24154 v2.AuxInt = int16ToAuxInt(d)
24155 v1.AddArg2(x, v2)
24156 v.AddArg2(v0, v1)
24157 return true
24158 }
24159 break
24160 }
24161
24162
24163
24164 for {
24165 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24166 if v_0.Op != OpLess8 {
24167 continue
24168 }
24169 x := v_0.Args[1]
24170 v_0_0 := v_0.Args[0]
24171 if v_0_0.Op != OpConst8 {
24172 continue
24173 }
24174 c := auxIntToInt8(v_0_0.AuxInt)
24175 if v_1.Op != OpLess8 {
24176 continue
24177 }
24178 _ = v_1.Args[1]
24179 if x != v_1.Args[0] {
24180 continue
24181 }
24182 v_1_1 := v_1.Args[1]
24183 if v_1_1.Op != OpConst8 {
24184 continue
24185 }
24186 d := auxIntToInt8(v_1_1.AuxInt)
24187 if !(c >= d) {
24188 continue
24189 }
24190 v.reset(OpLess8U)
24191 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24192 v0.AuxInt = int8ToAuxInt(c - d)
24193 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24194 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24195 v2.AuxInt = int8ToAuxInt(d)
24196 v1.AddArg2(x, v2)
24197 v.AddArg2(v0, v1)
24198 return true
24199 }
24200 break
24201 }
24202
24203
24204
24205 for {
24206 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24207 if v_0.Op != OpLeq8 {
24208 continue
24209 }
24210 x := v_0.Args[1]
24211 v_0_0 := v_0.Args[0]
24212 if v_0_0.Op != OpConst8 {
24213 continue
24214 }
24215 c := auxIntToInt8(v_0_0.AuxInt)
24216 if v_1.Op != OpLess8 {
24217 continue
24218 }
24219 _ = v_1.Args[1]
24220 if x != v_1.Args[0] {
24221 continue
24222 }
24223 v_1_1 := v_1.Args[1]
24224 if v_1_1.Op != OpConst8 {
24225 continue
24226 }
24227 d := auxIntToInt8(v_1_1.AuxInt)
24228 if !(c >= d) {
24229 continue
24230 }
24231 v.reset(OpLeq8U)
24232 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24233 v0.AuxInt = int8ToAuxInt(c - d)
24234 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24235 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24236 v2.AuxInt = int8ToAuxInt(d)
24237 v1.AddArg2(x, v2)
24238 v.AddArg2(v0, v1)
24239 return true
24240 }
24241 break
24242 }
24243
24244
24245
24246 for {
24247 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24248 if v_0.Op != OpLess64 {
24249 continue
24250 }
24251 x := v_0.Args[1]
24252 v_0_0 := v_0.Args[0]
24253 if v_0_0.Op != OpConst64 {
24254 continue
24255 }
24256 c := auxIntToInt64(v_0_0.AuxInt)
24257 if v_1.Op != OpLeq64 {
24258 continue
24259 }
24260 _ = v_1.Args[1]
24261 if x != v_1.Args[0] {
24262 continue
24263 }
24264 v_1_1 := v_1.Args[1]
24265 if v_1_1.Op != OpConst64 {
24266 continue
24267 }
24268 d := auxIntToInt64(v_1_1.AuxInt)
24269 if !(c >= d+1 && d+1 > d) {
24270 continue
24271 }
24272 v.reset(OpLess64U)
24273 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
24274 v0.AuxInt = int64ToAuxInt(c - d - 1)
24275 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
24276 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
24277 v2.AuxInt = int64ToAuxInt(d + 1)
24278 v1.AddArg2(x, v2)
24279 v.AddArg2(v0, v1)
24280 return true
24281 }
24282 break
24283 }
24284
24285
24286
24287 for {
24288 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24289 if v_0.Op != OpLeq64 {
24290 continue
24291 }
24292 x := v_0.Args[1]
24293 v_0_0 := v_0.Args[0]
24294 if v_0_0.Op != OpConst64 {
24295 continue
24296 }
24297 c := auxIntToInt64(v_0_0.AuxInt)
24298 if v_1.Op != OpLeq64 {
24299 continue
24300 }
24301 _ = v_1.Args[1]
24302 if x != v_1.Args[0] {
24303 continue
24304 }
24305 v_1_1 := v_1.Args[1]
24306 if v_1_1.Op != OpConst64 {
24307 continue
24308 }
24309 d := auxIntToInt64(v_1_1.AuxInt)
24310 if !(c >= d+1 && d+1 > d) {
24311 continue
24312 }
24313 v.reset(OpLeq64U)
24314 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
24315 v0.AuxInt = int64ToAuxInt(c - d - 1)
24316 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
24317 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
24318 v2.AuxInt = int64ToAuxInt(d + 1)
24319 v1.AddArg2(x, v2)
24320 v.AddArg2(v0, v1)
24321 return true
24322 }
24323 break
24324 }
24325
24326
24327
24328 for {
24329 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24330 if v_0.Op != OpLess32 {
24331 continue
24332 }
24333 x := v_0.Args[1]
24334 v_0_0 := v_0.Args[0]
24335 if v_0_0.Op != OpConst32 {
24336 continue
24337 }
24338 c := auxIntToInt32(v_0_0.AuxInt)
24339 if v_1.Op != OpLeq32 {
24340 continue
24341 }
24342 _ = v_1.Args[1]
24343 if x != v_1.Args[0] {
24344 continue
24345 }
24346 v_1_1 := v_1.Args[1]
24347 if v_1_1.Op != OpConst32 {
24348 continue
24349 }
24350 d := auxIntToInt32(v_1_1.AuxInt)
24351 if !(c >= d+1 && d+1 > d) {
24352 continue
24353 }
24354 v.reset(OpLess32U)
24355 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
24356 v0.AuxInt = int32ToAuxInt(c - d - 1)
24357 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
24358 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
24359 v2.AuxInt = int32ToAuxInt(d + 1)
24360 v1.AddArg2(x, v2)
24361 v.AddArg2(v0, v1)
24362 return true
24363 }
24364 break
24365 }
24366
24367
24368
24369 for {
24370 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24371 if v_0.Op != OpLeq32 {
24372 continue
24373 }
24374 x := v_0.Args[1]
24375 v_0_0 := v_0.Args[0]
24376 if v_0_0.Op != OpConst32 {
24377 continue
24378 }
24379 c := auxIntToInt32(v_0_0.AuxInt)
24380 if v_1.Op != OpLeq32 {
24381 continue
24382 }
24383 _ = v_1.Args[1]
24384 if x != v_1.Args[0] {
24385 continue
24386 }
24387 v_1_1 := v_1.Args[1]
24388 if v_1_1.Op != OpConst32 {
24389 continue
24390 }
24391 d := auxIntToInt32(v_1_1.AuxInt)
24392 if !(c >= d+1 && d+1 > d) {
24393 continue
24394 }
24395 v.reset(OpLeq32U)
24396 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
24397 v0.AuxInt = int32ToAuxInt(c - d - 1)
24398 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
24399 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
24400 v2.AuxInt = int32ToAuxInt(d + 1)
24401 v1.AddArg2(x, v2)
24402 v.AddArg2(v0, v1)
24403 return true
24404 }
24405 break
24406 }
24407
24408
24409
24410 for {
24411 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24412 if v_0.Op != OpLess16 {
24413 continue
24414 }
24415 x := v_0.Args[1]
24416 v_0_0 := v_0.Args[0]
24417 if v_0_0.Op != OpConst16 {
24418 continue
24419 }
24420 c := auxIntToInt16(v_0_0.AuxInt)
24421 if v_1.Op != OpLeq16 {
24422 continue
24423 }
24424 _ = v_1.Args[1]
24425 if x != v_1.Args[0] {
24426 continue
24427 }
24428 v_1_1 := v_1.Args[1]
24429 if v_1_1.Op != OpConst16 {
24430 continue
24431 }
24432 d := auxIntToInt16(v_1_1.AuxInt)
24433 if !(c >= d+1 && d+1 > d) {
24434 continue
24435 }
24436 v.reset(OpLess16U)
24437 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24438 v0.AuxInt = int16ToAuxInt(c - d - 1)
24439 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24440 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24441 v2.AuxInt = int16ToAuxInt(d + 1)
24442 v1.AddArg2(x, v2)
24443 v.AddArg2(v0, v1)
24444 return true
24445 }
24446 break
24447 }
24448
24449
24450
24451 for {
24452 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24453 if v_0.Op != OpLeq16 {
24454 continue
24455 }
24456 x := v_0.Args[1]
24457 v_0_0 := v_0.Args[0]
24458 if v_0_0.Op != OpConst16 {
24459 continue
24460 }
24461 c := auxIntToInt16(v_0_0.AuxInt)
24462 if v_1.Op != OpLeq16 {
24463 continue
24464 }
24465 _ = v_1.Args[1]
24466 if x != v_1.Args[0] {
24467 continue
24468 }
24469 v_1_1 := v_1.Args[1]
24470 if v_1_1.Op != OpConst16 {
24471 continue
24472 }
24473 d := auxIntToInt16(v_1_1.AuxInt)
24474 if !(c >= d+1 && d+1 > d) {
24475 continue
24476 }
24477 v.reset(OpLeq16U)
24478 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24479 v0.AuxInt = int16ToAuxInt(c - d - 1)
24480 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24481 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24482 v2.AuxInt = int16ToAuxInt(d + 1)
24483 v1.AddArg2(x, v2)
24484 v.AddArg2(v0, v1)
24485 return true
24486 }
24487 break
24488 }
24489
24490
24491
24492 for {
24493 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24494 if v_0.Op != OpLess8 {
24495 continue
24496 }
24497 x := v_0.Args[1]
24498 v_0_0 := v_0.Args[0]
24499 if v_0_0.Op != OpConst8 {
24500 continue
24501 }
24502 c := auxIntToInt8(v_0_0.AuxInt)
24503 if v_1.Op != OpLeq8 {
24504 continue
24505 }
24506 _ = v_1.Args[1]
24507 if x != v_1.Args[0] {
24508 continue
24509 }
24510 v_1_1 := v_1.Args[1]
24511 if v_1_1.Op != OpConst8 {
24512 continue
24513 }
24514 d := auxIntToInt8(v_1_1.AuxInt)
24515 if !(c >= d+1 && d+1 > d) {
24516 continue
24517 }
24518 v.reset(OpLess8U)
24519 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24520 v0.AuxInt = int8ToAuxInt(c - d - 1)
24521 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24522 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24523 v2.AuxInt = int8ToAuxInt(d + 1)
24524 v1.AddArg2(x, v2)
24525 v.AddArg2(v0, v1)
24526 return true
24527 }
24528 break
24529 }
24530
24531
24532
24533 for {
24534 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24535 if v_0.Op != OpLeq8 {
24536 continue
24537 }
24538 x := v_0.Args[1]
24539 v_0_0 := v_0.Args[0]
24540 if v_0_0.Op != OpConst8 {
24541 continue
24542 }
24543 c := auxIntToInt8(v_0_0.AuxInt)
24544 if v_1.Op != OpLeq8 {
24545 continue
24546 }
24547 _ = v_1.Args[1]
24548 if x != v_1.Args[0] {
24549 continue
24550 }
24551 v_1_1 := v_1.Args[1]
24552 if v_1_1.Op != OpConst8 {
24553 continue
24554 }
24555 d := auxIntToInt8(v_1_1.AuxInt)
24556 if !(c >= d+1 && d+1 > d) {
24557 continue
24558 }
24559 v.reset(OpLeq8U)
24560 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24561 v0.AuxInt = int8ToAuxInt(c - d - 1)
24562 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24563 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24564 v2.AuxInt = int8ToAuxInt(d + 1)
24565 v1.AddArg2(x, v2)
24566 v.AddArg2(v0, v1)
24567 return true
24568 }
24569 break
24570 }
24571
24572
24573
24574 for {
24575 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24576 if v_0.Op != OpLess64U {
24577 continue
24578 }
24579 x := v_0.Args[1]
24580 v_0_0 := v_0.Args[0]
24581 if v_0_0.Op != OpConst64 {
24582 continue
24583 }
24584 c := auxIntToInt64(v_0_0.AuxInt)
24585 if v_1.Op != OpLess64U {
24586 continue
24587 }
24588 _ = v_1.Args[1]
24589 if x != v_1.Args[0] {
24590 continue
24591 }
24592 v_1_1 := v_1.Args[1]
24593 if v_1_1.Op != OpConst64 {
24594 continue
24595 }
24596 d := auxIntToInt64(v_1_1.AuxInt)
24597 if !(uint64(c) >= uint64(d)) {
24598 continue
24599 }
24600 v.reset(OpLess64U)
24601 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
24602 v0.AuxInt = int64ToAuxInt(c - d)
24603 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
24604 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
24605 v2.AuxInt = int64ToAuxInt(d)
24606 v1.AddArg2(x, v2)
24607 v.AddArg2(v0, v1)
24608 return true
24609 }
24610 break
24611 }
24612
24613
24614
24615 for {
24616 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24617 if v_0.Op != OpLeq64U {
24618 continue
24619 }
24620 x := v_0.Args[1]
24621 v_0_0 := v_0.Args[0]
24622 if v_0_0.Op != OpConst64 {
24623 continue
24624 }
24625 c := auxIntToInt64(v_0_0.AuxInt)
24626 if v_1.Op != OpLess64U {
24627 continue
24628 }
24629 _ = v_1.Args[1]
24630 if x != v_1.Args[0] {
24631 continue
24632 }
24633 v_1_1 := v_1.Args[1]
24634 if v_1_1.Op != OpConst64 {
24635 continue
24636 }
24637 d := auxIntToInt64(v_1_1.AuxInt)
24638 if !(uint64(c) >= uint64(d)) {
24639 continue
24640 }
24641 v.reset(OpLeq64U)
24642 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
24643 v0.AuxInt = int64ToAuxInt(c - d)
24644 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
24645 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
24646 v2.AuxInt = int64ToAuxInt(d)
24647 v1.AddArg2(x, v2)
24648 v.AddArg2(v0, v1)
24649 return true
24650 }
24651 break
24652 }
24653
24654
24655
24656 for {
24657 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24658 if v_0.Op != OpLess32U {
24659 continue
24660 }
24661 x := v_0.Args[1]
24662 v_0_0 := v_0.Args[0]
24663 if v_0_0.Op != OpConst32 {
24664 continue
24665 }
24666 c := auxIntToInt32(v_0_0.AuxInt)
24667 if v_1.Op != OpLess32U {
24668 continue
24669 }
24670 _ = v_1.Args[1]
24671 if x != v_1.Args[0] {
24672 continue
24673 }
24674 v_1_1 := v_1.Args[1]
24675 if v_1_1.Op != OpConst32 {
24676 continue
24677 }
24678 d := auxIntToInt32(v_1_1.AuxInt)
24679 if !(uint32(c) >= uint32(d)) {
24680 continue
24681 }
24682 v.reset(OpLess32U)
24683 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
24684 v0.AuxInt = int32ToAuxInt(c - d)
24685 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
24686 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
24687 v2.AuxInt = int32ToAuxInt(d)
24688 v1.AddArg2(x, v2)
24689 v.AddArg2(v0, v1)
24690 return true
24691 }
24692 break
24693 }
24694
24695
24696
24697 for {
24698 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24699 if v_0.Op != OpLeq32U {
24700 continue
24701 }
24702 x := v_0.Args[1]
24703 v_0_0 := v_0.Args[0]
24704 if v_0_0.Op != OpConst32 {
24705 continue
24706 }
24707 c := auxIntToInt32(v_0_0.AuxInt)
24708 if v_1.Op != OpLess32U {
24709 continue
24710 }
24711 _ = v_1.Args[1]
24712 if x != v_1.Args[0] {
24713 continue
24714 }
24715 v_1_1 := v_1.Args[1]
24716 if v_1_1.Op != OpConst32 {
24717 continue
24718 }
24719 d := auxIntToInt32(v_1_1.AuxInt)
24720 if !(uint32(c) >= uint32(d)) {
24721 continue
24722 }
24723 v.reset(OpLeq32U)
24724 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
24725 v0.AuxInt = int32ToAuxInt(c - d)
24726 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
24727 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
24728 v2.AuxInt = int32ToAuxInt(d)
24729 v1.AddArg2(x, v2)
24730 v.AddArg2(v0, v1)
24731 return true
24732 }
24733 break
24734 }
24735
24736
24737
24738 for {
24739 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24740 if v_0.Op != OpLess16U {
24741 continue
24742 }
24743 x := v_0.Args[1]
24744 v_0_0 := v_0.Args[0]
24745 if v_0_0.Op != OpConst16 {
24746 continue
24747 }
24748 c := auxIntToInt16(v_0_0.AuxInt)
24749 if v_1.Op != OpLess16U {
24750 continue
24751 }
24752 _ = v_1.Args[1]
24753 if x != v_1.Args[0] {
24754 continue
24755 }
24756 v_1_1 := v_1.Args[1]
24757 if v_1_1.Op != OpConst16 {
24758 continue
24759 }
24760 d := auxIntToInt16(v_1_1.AuxInt)
24761 if !(uint16(c) >= uint16(d)) {
24762 continue
24763 }
24764 v.reset(OpLess16U)
24765 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24766 v0.AuxInt = int16ToAuxInt(c - d)
24767 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24768 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24769 v2.AuxInt = int16ToAuxInt(d)
24770 v1.AddArg2(x, v2)
24771 v.AddArg2(v0, v1)
24772 return true
24773 }
24774 break
24775 }
24776
24777
24778
24779 for {
24780 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24781 if v_0.Op != OpLeq16U {
24782 continue
24783 }
24784 x := v_0.Args[1]
24785 v_0_0 := v_0.Args[0]
24786 if v_0_0.Op != OpConst16 {
24787 continue
24788 }
24789 c := auxIntToInt16(v_0_0.AuxInt)
24790 if v_1.Op != OpLess16U {
24791 continue
24792 }
24793 _ = v_1.Args[1]
24794 if x != v_1.Args[0] {
24795 continue
24796 }
24797 v_1_1 := v_1.Args[1]
24798 if v_1_1.Op != OpConst16 {
24799 continue
24800 }
24801 d := auxIntToInt16(v_1_1.AuxInt)
24802 if !(uint16(c) >= uint16(d)) {
24803 continue
24804 }
24805 v.reset(OpLeq16U)
24806 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24807 v0.AuxInt = int16ToAuxInt(c - d)
24808 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24809 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24810 v2.AuxInt = int16ToAuxInt(d)
24811 v1.AddArg2(x, v2)
24812 v.AddArg2(v0, v1)
24813 return true
24814 }
24815 break
24816 }
24817
24818
24819
24820 for {
24821 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24822 if v_0.Op != OpLess8U {
24823 continue
24824 }
24825 x := v_0.Args[1]
24826 v_0_0 := v_0.Args[0]
24827 if v_0_0.Op != OpConst8 {
24828 continue
24829 }
24830 c := auxIntToInt8(v_0_0.AuxInt)
24831 if v_1.Op != OpLess8U {
24832 continue
24833 }
24834 _ = v_1.Args[1]
24835 if x != v_1.Args[0] {
24836 continue
24837 }
24838 v_1_1 := v_1.Args[1]
24839 if v_1_1.Op != OpConst8 {
24840 continue
24841 }
24842 d := auxIntToInt8(v_1_1.AuxInt)
24843 if !(uint8(c) >= uint8(d)) {
24844 continue
24845 }
24846 v.reset(OpLess8U)
24847 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24848 v0.AuxInt = int8ToAuxInt(c - d)
24849 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24850 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24851 v2.AuxInt = int8ToAuxInt(d)
24852 v1.AddArg2(x, v2)
24853 v.AddArg2(v0, v1)
24854 return true
24855 }
24856 break
24857 }
24858
24859
24860
24861 for {
24862 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24863 if v_0.Op != OpLeq8U {
24864 continue
24865 }
24866 x := v_0.Args[1]
24867 v_0_0 := v_0.Args[0]
24868 if v_0_0.Op != OpConst8 {
24869 continue
24870 }
24871 c := auxIntToInt8(v_0_0.AuxInt)
24872 if v_1.Op != OpLess8U {
24873 continue
24874 }
24875 _ = v_1.Args[1]
24876 if x != v_1.Args[0] {
24877 continue
24878 }
24879 v_1_1 := v_1.Args[1]
24880 if v_1_1.Op != OpConst8 {
24881 continue
24882 }
24883 d := auxIntToInt8(v_1_1.AuxInt)
24884 if !(uint8(c) >= uint8(d)) {
24885 continue
24886 }
24887 v.reset(OpLeq8U)
24888 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24889 v0.AuxInt = int8ToAuxInt(c - d)
24890 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24891 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24892 v2.AuxInt = int8ToAuxInt(d)
24893 v1.AddArg2(x, v2)
24894 v.AddArg2(v0, v1)
24895 return true
24896 }
24897 break
24898 }
24899
24900
24901
24902 for {
24903 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24904 if v_0.Op != OpLess64U {
24905 continue
24906 }
24907 x := v_0.Args[1]
24908 v_0_0 := v_0.Args[0]
24909 if v_0_0.Op != OpConst64 {
24910 continue
24911 }
24912 c := auxIntToInt64(v_0_0.AuxInt)
24913 if v_1.Op != OpLeq64U {
24914 continue
24915 }
24916 _ = v_1.Args[1]
24917 if x != v_1.Args[0] {
24918 continue
24919 }
24920 v_1_1 := v_1.Args[1]
24921 if v_1_1.Op != OpConst64 {
24922 continue
24923 }
24924 d := auxIntToInt64(v_1_1.AuxInt)
24925 if !(uint64(c) >= uint64(d+1) && uint64(d+1) > uint64(d)) {
24926 continue
24927 }
24928 v.reset(OpLess64U)
24929 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
24930 v0.AuxInt = int64ToAuxInt(c - d - 1)
24931 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
24932 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
24933 v2.AuxInt = int64ToAuxInt(d + 1)
24934 v1.AddArg2(x, v2)
24935 v.AddArg2(v0, v1)
24936 return true
24937 }
24938 break
24939 }
24940
24941
24942
24943 for {
24944 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24945 if v_0.Op != OpLeq64U {
24946 continue
24947 }
24948 x := v_0.Args[1]
24949 v_0_0 := v_0.Args[0]
24950 if v_0_0.Op != OpConst64 {
24951 continue
24952 }
24953 c := auxIntToInt64(v_0_0.AuxInt)
24954 if v_1.Op != OpLeq64U {
24955 continue
24956 }
24957 _ = v_1.Args[1]
24958 if x != v_1.Args[0] {
24959 continue
24960 }
24961 v_1_1 := v_1.Args[1]
24962 if v_1_1.Op != OpConst64 {
24963 continue
24964 }
24965 d := auxIntToInt64(v_1_1.AuxInt)
24966 if !(uint64(c) >= uint64(d+1) && uint64(d+1) > uint64(d)) {
24967 continue
24968 }
24969 v.reset(OpLeq64U)
24970 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
24971 v0.AuxInt = int64ToAuxInt(c - d - 1)
24972 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
24973 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
24974 v2.AuxInt = int64ToAuxInt(d + 1)
24975 v1.AddArg2(x, v2)
24976 v.AddArg2(v0, v1)
24977 return true
24978 }
24979 break
24980 }
24981
24982
24983
24984 for {
24985 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24986 if v_0.Op != OpLess32U {
24987 continue
24988 }
24989 x := v_0.Args[1]
24990 v_0_0 := v_0.Args[0]
24991 if v_0_0.Op != OpConst32 {
24992 continue
24993 }
24994 c := auxIntToInt32(v_0_0.AuxInt)
24995 if v_1.Op != OpLeq32U {
24996 continue
24997 }
24998 _ = v_1.Args[1]
24999 if x != v_1.Args[0] {
25000 continue
25001 }
25002 v_1_1 := v_1.Args[1]
25003 if v_1_1.Op != OpConst32 {
25004 continue
25005 }
25006 d := auxIntToInt32(v_1_1.AuxInt)
25007 if !(uint32(c) >= uint32(d+1) && uint32(d+1) > uint32(d)) {
25008 continue
25009 }
25010 v.reset(OpLess32U)
25011 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
25012 v0.AuxInt = int32ToAuxInt(c - d - 1)
25013 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
25014 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
25015 v2.AuxInt = int32ToAuxInt(d + 1)
25016 v1.AddArg2(x, v2)
25017 v.AddArg2(v0, v1)
25018 return true
25019 }
25020 break
25021 }
25022
25023
25024
25025 for {
25026 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25027 if v_0.Op != OpLeq32U {
25028 continue
25029 }
25030 x := v_0.Args[1]
25031 v_0_0 := v_0.Args[0]
25032 if v_0_0.Op != OpConst32 {
25033 continue
25034 }
25035 c := auxIntToInt32(v_0_0.AuxInt)
25036 if v_1.Op != OpLeq32U {
25037 continue
25038 }
25039 _ = v_1.Args[1]
25040 if x != v_1.Args[0] {
25041 continue
25042 }
25043 v_1_1 := v_1.Args[1]
25044 if v_1_1.Op != OpConst32 {
25045 continue
25046 }
25047 d := auxIntToInt32(v_1_1.AuxInt)
25048 if !(uint32(c) >= uint32(d+1) && uint32(d+1) > uint32(d)) {
25049 continue
25050 }
25051 v.reset(OpLeq32U)
25052 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
25053 v0.AuxInt = int32ToAuxInt(c - d - 1)
25054 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
25055 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
25056 v2.AuxInt = int32ToAuxInt(d + 1)
25057 v1.AddArg2(x, v2)
25058 v.AddArg2(v0, v1)
25059 return true
25060 }
25061 break
25062 }
25063
25064
25065
25066 for {
25067 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25068 if v_0.Op != OpLess16U {
25069 continue
25070 }
25071 x := v_0.Args[1]
25072 v_0_0 := v_0.Args[0]
25073 if v_0_0.Op != OpConst16 {
25074 continue
25075 }
25076 c := auxIntToInt16(v_0_0.AuxInt)
25077 if v_1.Op != OpLeq16U {
25078 continue
25079 }
25080 _ = v_1.Args[1]
25081 if x != v_1.Args[0] {
25082 continue
25083 }
25084 v_1_1 := v_1.Args[1]
25085 if v_1_1.Op != OpConst16 {
25086 continue
25087 }
25088 d := auxIntToInt16(v_1_1.AuxInt)
25089 if !(uint16(c) >= uint16(d+1) && uint16(d+1) > uint16(d)) {
25090 continue
25091 }
25092 v.reset(OpLess16U)
25093 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
25094 v0.AuxInt = int16ToAuxInt(c - d - 1)
25095 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
25096 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
25097 v2.AuxInt = int16ToAuxInt(d + 1)
25098 v1.AddArg2(x, v2)
25099 v.AddArg2(v0, v1)
25100 return true
25101 }
25102 break
25103 }
25104
25105
25106
25107 for {
25108 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25109 if v_0.Op != OpLeq16U {
25110 continue
25111 }
25112 x := v_0.Args[1]
25113 v_0_0 := v_0.Args[0]
25114 if v_0_0.Op != OpConst16 {
25115 continue
25116 }
25117 c := auxIntToInt16(v_0_0.AuxInt)
25118 if v_1.Op != OpLeq16U {
25119 continue
25120 }
25121 _ = v_1.Args[1]
25122 if x != v_1.Args[0] {
25123 continue
25124 }
25125 v_1_1 := v_1.Args[1]
25126 if v_1_1.Op != OpConst16 {
25127 continue
25128 }
25129 d := auxIntToInt16(v_1_1.AuxInt)
25130 if !(uint16(c) >= uint16(d+1) && uint16(d+1) > uint16(d)) {
25131 continue
25132 }
25133 v.reset(OpLeq16U)
25134 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
25135 v0.AuxInt = int16ToAuxInt(c - d - 1)
25136 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
25137 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
25138 v2.AuxInt = int16ToAuxInt(d + 1)
25139 v1.AddArg2(x, v2)
25140 v.AddArg2(v0, v1)
25141 return true
25142 }
25143 break
25144 }
25145
25146
25147
25148 for {
25149 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25150 if v_0.Op != OpLess8U {
25151 continue
25152 }
25153 x := v_0.Args[1]
25154 v_0_0 := v_0.Args[0]
25155 if v_0_0.Op != OpConst8 {
25156 continue
25157 }
25158 c := auxIntToInt8(v_0_0.AuxInt)
25159 if v_1.Op != OpLeq8U {
25160 continue
25161 }
25162 _ = v_1.Args[1]
25163 if x != v_1.Args[0] {
25164 continue
25165 }
25166 v_1_1 := v_1.Args[1]
25167 if v_1_1.Op != OpConst8 {
25168 continue
25169 }
25170 d := auxIntToInt8(v_1_1.AuxInt)
25171 if !(uint8(c) >= uint8(d+1) && uint8(d+1) > uint8(d)) {
25172 continue
25173 }
25174 v.reset(OpLess8U)
25175 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
25176 v0.AuxInt = int8ToAuxInt(c - d - 1)
25177 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
25178 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
25179 v2.AuxInt = int8ToAuxInt(d + 1)
25180 v1.AddArg2(x, v2)
25181 v.AddArg2(v0, v1)
25182 return true
25183 }
25184 break
25185 }
25186
25187
25188
25189 for {
25190 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25191 if v_0.Op != OpLeq8U {
25192 continue
25193 }
25194 x := v_0.Args[1]
25195 v_0_0 := v_0.Args[0]
25196 if v_0_0.Op != OpConst8 {
25197 continue
25198 }
25199 c := auxIntToInt8(v_0_0.AuxInt)
25200 if v_1.Op != OpLeq8U {
25201 continue
25202 }
25203 _ = v_1.Args[1]
25204 if x != v_1.Args[0] {
25205 continue
25206 }
25207 v_1_1 := v_1.Args[1]
25208 if v_1_1.Op != OpConst8 {
25209 continue
25210 }
25211 d := auxIntToInt8(v_1_1.AuxInt)
25212 if !(uint8(c) >= uint8(d+1) && uint8(d+1) > uint8(d)) {
25213 continue
25214 }
25215 v.reset(OpLeq8U)
25216 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
25217 v0.AuxInt = int8ToAuxInt(c - d - 1)
25218 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
25219 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
25220 v2.AuxInt = int8ToAuxInt(d + 1)
25221 v1.AddArg2(x, v2)
25222 v.AddArg2(v0, v1)
25223 return true
25224 }
25225 break
25226 }
25227
25228
25229
25230 for {
25231 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25232 if v_0.Op != OpEq64 {
25233 continue
25234 }
25235 _ = v_0.Args[1]
25236 v_0_0 := v_0.Args[0]
25237 v_0_1 := v_0.Args[1]
25238 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
25239 x := v_0_0
25240 cv := v_0_1
25241 if cv.Op != OpConst64 {
25242 continue
25243 }
25244 c := auxIntToInt64(cv.AuxInt)
25245 if v_1.Op != OpEq64 {
25246 continue
25247 }
25248 _ = v_1.Args[1]
25249 v_1_0 := v_1.Args[0]
25250 v_1_1 := v_1.Args[1]
25251 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
25252 if x != v_1_0 || v_1_1.Op != OpConst64 {
25253 continue
25254 }
25255 d := auxIntToInt64(v_1_1.AuxInt)
25256 if !(c|d == c && oneBit(c^d)) {
25257 continue
25258 }
25259 v.reset(OpEq64)
25260 v0 := b.NewValue0(v.Pos, OpOr64, x.Type)
25261 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
25262 v1.AuxInt = int64ToAuxInt(c ^ d)
25263 v0.AddArg2(x, v1)
25264 v.AddArg2(v0, cv)
25265 return true
25266 }
25267 }
25268 }
25269 break
25270 }
25271
25272
25273
25274 for {
25275 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25276 if v_0.Op != OpEq32 {
25277 continue
25278 }
25279 _ = v_0.Args[1]
25280 v_0_0 := v_0.Args[0]
25281 v_0_1 := v_0.Args[1]
25282 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
25283 x := v_0_0
25284 cv := v_0_1
25285 if cv.Op != OpConst32 {
25286 continue
25287 }
25288 c := auxIntToInt32(cv.AuxInt)
25289 if v_1.Op != OpEq32 {
25290 continue
25291 }
25292 _ = v_1.Args[1]
25293 v_1_0 := v_1.Args[0]
25294 v_1_1 := v_1.Args[1]
25295 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
25296 if x != v_1_0 || v_1_1.Op != OpConst32 {
25297 continue
25298 }
25299 d := auxIntToInt32(v_1_1.AuxInt)
25300 if !(c|d == c && oneBit(c^d)) {
25301 continue
25302 }
25303 v.reset(OpEq32)
25304 v0 := b.NewValue0(v.Pos, OpOr32, x.Type)
25305 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
25306 v1.AuxInt = int32ToAuxInt(c ^ d)
25307 v0.AddArg2(x, v1)
25308 v.AddArg2(v0, cv)
25309 return true
25310 }
25311 }
25312 }
25313 break
25314 }
25315
25316
25317
25318 for {
25319 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25320 if v_0.Op != OpEq16 {
25321 continue
25322 }
25323 _ = v_0.Args[1]
25324 v_0_0 := v_0.Args[0]
25325 v_0_1 := v_0.Args[1]
25326 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
25327 x := v_0_0
25328 cv := v_0_1
25329 if cv.Op != OpConst16 {
25330 continue
25331 }
25332 c := auxIntToInt16(cv.AuxInt)
25333 if v_1.Op != OpEq16 {
25334 continue
25335 }
25336 _ = v_1.Args[1]
25337 v_1_0 := v_1.Args[0]
25338 v_1_1 := v_1.Args[1]
25339 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
25340 if x != v_1_0 || v_1_1.Op != OpConst16 {
25341 continue
25342 }
25343 d := auxIntToInt16(v_1_1.AuxInt)
25344 if !(c|d == c && oneBit(c^d)) {
25345 continue
25346 }
25347 v.reset(OpEq16)
25348 v0 := b.NewValue0(v.Pos, OpOr16, x.Type)
25349 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
25350 v1.AuxInt = int16ToAuxInt(c ^ d)
25351 v0.AddArg2(x, v1)
25352 v.AddArg2(v0, cv)
25353 return true
25354 }
25355 }
25356 }
25357 break
25358 }
25359
25360
25361
25362 for {
25363 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25364 if v_0.Op != OpEq8 {
25365 continue
25366 }
25367 _ = v_0.Args[1]
25368 v_0_0 := v_0.Args[0]
25369 v_0_1 := v_0.Args[1]
25370 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
25371 x := v_0_0
25372 cv := v_0_1
25373 if cv.Op != OpConst8 {
25374 continue
25375 }
25376 c := auxIntToInt8(cv.AuxInt)
25377 if v_1.Op != OpEq8 {
25378 continue
25379 }
25380 _ = v_1.Args[1]
25381 v_1_0 := v_1.Args[0]
25382 v_1_1 := v_1.Args[1]
25383 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
25384 if x != v_1_0 || v_1_1.Op != OpConst8 {
25385 continue
25386 }
25387 d := auxIntToInt8(v_1_1.AuxInt)
25388 if !(c|d == c && oneBit(c^d)) {
25389 continue
25390 }
25391 v.reset(OpEq8)
25392 v0 := b.NewValue0(v.Pos, OpOr8, x.Type)
25393 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
25394 v1.AuxInt = int8ToAuxInt(c ^ d)
25395 v0.AddArg2(x, v1)
25396 v.AddArg2(v0, cv)
25397 return true
25398 }
25399 }
25400 }
25401 break
25402 }
25403
25404
25405 for {
25406 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25407 if v_0.Op != OpNeq64F {
25408 continue
25409 }
25410 x := v_0.Args[1]
25411 if x != v_0.Args[0] || v_1.Op != OpLess64F {
25412 continue
25413 }
25414 _ = v_1.Args[1]
25415 if x != v_1.Args[0] {
25416 continue
25417 }
25418 y := v_1.Args[1]
25419 if y.Op != OpConst64F {
25420 continue
25421 }
25422 v.reset(OpNot)
25423 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
25424 v0.AddArg2(y, x)
25425 v.AddArg(v0)
25426 return true
25427 }
25428 break
25429 }
25430
25431
25432 for {
25433 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25434 if v_0.Op != OpNeq64F {
25435 continue
25436 }
25437 x := v_0.Args[1]
25438 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
25439 continue
25440 }
25441 _ = v_1.Args[1]
25442 if x != v_1.Args[0] {
25443 continue
25444 }
25445 y := v_1.Args[1]
25446 if y.Op != OpConst64F {
25447 continue
25448 }
25449 v.reset(OpNot)
25450 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
25451 v0.AddArg2(y, x)
25452 v.AddArg(v0)
25453 return true
25454 }
25455 break
25456 }
25457
25458
25459 for {
25460 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25461 if v_0.Op != OpNeq64F {
25462 continue
25463 }
25464 x := v_0.Args[1]
25465 if x != v_0.Args[0] || v_1.Op != OpLess64F {
25466 continue
25467 }
25468 _ = v_1.Args[1]
25469 y := v_1.Args[0]
25470 if y.Op != OpConst64F {
25471 continue
25472 }
25473 if x != v_1.Args[1] {
25474 continue
25475 }
25476 v.reset(OpNot)
25477 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
25478 v0.AddArg2(x, y)
25479 v.AddArg(v0)
25480 return true
25481 }
25482 break
25483 }
25484
25485
25486 for {
25487 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25488 if v_0.Op != OpNeq64F {
25489 continue
25490 }
25491 x := v_0.Args[1]
25492 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
25493 continue
25494 }
25495 _ = v_1.Args[1]
25496 y := v_1.Args[0]
25497 if y.Op != OpConst64F {
25498 continue
25499 }
25500 if x != v_1.Args[1] {
25501 continue
25502 }
25503 v.reset(OpNot)
25504 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
25505 v0.AddArg2(x, y)
25506 v.AddArg(v0)
25507 return true
25508 }
25509 break
25510 }
25511
25512
25513 for {
25514 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25515 if v_0.Op != OpNeq32F {
25516 continue
25517 }
25518 x := v_0.Args[1]
25519 if x != v_0.Args[0] || v_1.Op != OpLess32F {
25520 continue
25521 }
25522 _ = v_1.Args[1]
25523 if x != v_1.Args[0] {
25524 continue
25525 }
25526 y := v_1.Args[1]
25527 if y.Op != OpConst32F {
25528 continue
25529 }
25530 v.reset(OpNot)
25531 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
25532 v0.AddArg2(y, x)
25533 v.AddArg(v0)
25534 return true
25535 }
25536 break
25537 }
25538
25539
25540 for {
25541 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25542 if v_0.Op != OpNeq32F {
25543 continue
25544 }
25545 x := v_0.Args[1]
25546 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
25547 continue
25548 }
25549 _ = v_1.Args[1]
25550 if x != v_1.Args[0] {
25551 continue
25552 }
25553 y := v_1.Args[1]
25554 if y.Op != OpConst32F {
25555 continue
25556 }
25557 v.reset(OpNot)
25558 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
25559 v0.AddArg2(y, x)
25560 v.AddArg(v0)
25561 return true
25562 }
25563 break
25564 }
25565
25566
25567 for {
25568 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25569 if v_0.Op != OpNeq32F {
25570 continue
25571 }
25572 x := v_0.Args[1]
25573 if x != v_0.Args[0] || v_1.Op != OpLess32F {
25574 continue
25575 }
25576 _ = v_1.Args[1]
25577 y := v_1.Args[0]
25578 if y.Op != OpConst32F {
25579 continue
25580 }
25581 if x != v_1.Args[1] {
25582 continue
25583 }
25584 v.reset(OpNot)
25585 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
25586 v0.AddArg2(x, y)
25587 v.AddArg(v0)
25588 return true
25589 }
25590 break
25591 }
25592
25593
25594 for {
25595 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25596 if v_0.Op != OpNeq32F {
25597 continue
25598 }
25599 x := v_0.Args[1]
25600 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
25601 continue
25602 }
25603 _ = v_1.Args[1]
25604 y := v_1.Args[0]
25605 if y.Op != OpConst32F {
25606 continue
25607 }
25608 if x != v_1.Args[1] {
25609 continue
25610 }
25611 v.reset(OpNot)
25612 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
25613 v0.AddArg2(x, y)
25614 v.AddArg(v0)
25615 return true
25616 }
25617 break
25618 }
25619
25620
25621 for {
25622 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25623 if v_0.Op != OpNeq64F {
25624 continue
25625 }
25626 x := v_0.Args[1]
25627 if x != v_0.Args[0] || v_1.Op != OpLess64F {
25628 continue
25629 }
25630 _ = v_1.Args[1]
25631 abs := v_1.Args[0]
25632 if abs.Op != OpAbs || x != abs.Args[0] {
25633 continue
25634 }
25635 y := v_1.Args[1]
25636 if y.Op != OpConst64F {
25637 continue
25638 }
25639 v.reset(OpNot)
25640 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
25641 v0.AddArg2(y, abs)
25642 v.AddArg(v0)
25643 return true
25644 }
25645 break
25646 }
25647
25648
25649 for {
25650 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25651 if v_0.Op != OpNeq64F {
25652 continue
25653 }
25654 x := v_0.Args[1]
25655 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
25656 continue
25657 }
25658 _ = v_1.Args[1]
25659 abs := v_1.Args[0]
25660 if abs.Op != OpAbs || x != abs.Args[0] {
25661 continue
25662 }
25663 y := v_1.Args[1]
25664 if y.Op != OpConst64F {
25665 continue
25666 }
25667 v.reset(OpNot)
25668 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
25669 v0.AddArg2(y, abs)
25670 v.AddArg(v0)
25671 return true
25672 }
25673 break
25674 }
25675
25676
25677 for {
25678 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25679 if v_0.Op != OpNeq64F {
25680 continue
25681 }
25682 x := v_0.Args[1]
25683 if x != v_0.Args[0] || v_1.Op != OpLess64F {
25684 continue
25685 }
25686 _ = v_1.Args[1]
25687 y := v_1.Args[0]
25688 if y.Op != OpConst64F {
25689 continue
25690 }
25691 abs := v_1.Args[1]
25692 if abs.Op != OpAbs || x != abs.Args[0] {
25693 continue
25694 }
25695 v.reset(OpNot)
25696 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
25697 v0.AddArg2(abs, y)
25698 v.AddArg(v0)
25699 return true
25700 }
25701 break
25702 }
25703
25704
25705 for {
25706 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25707 if v_0.Op != OpNeq64F {
25708 continue
25709 }
25710 x := v_0.Args[1]
25711 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
25712 continue
25713 }
25714 _ = v_1.Args[1]
25715 y := v_1.Args[0]
25716 if y.Op != OpConst64F {
25717 continue
25718 }
25719 abs := v_1.Args[1]
25720 if abs.Op != OpAbs || x != abs.Args[0] {
25721 continue
25722 }
25723 v.reset(OpNot)
25724 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
25725 v0.AddArg2(abs, y)
25726 v.AddArg(v0)
25727 return true
25728 }
25729 break
25730 }
25731
25732
25733 for {
25734 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25735 if v_0.Op != OpNeq64F {
25736 continue
25737 }
25738 x := v_0.Args[1]
25739 if x != v_0.Args[0] || v_1.Op != OpLess64F {
25740 continue
25741 }
25742 _ = v_1.Args[1]
25743 neg := v_1.Args[0]
25744 if neg.Op != OpNeg64F || x != neg.Args[0] {
25745 continue
25746 }
25747 y := v_1.Args[1]
25748 if y.Op != OpConst64F {
25749 continue
25750 }
25751 v.reset(OpNot)
25752 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
25753 v0.AddArg2(y, neg)
25754 v.AddArg(v0)
25755 return true
25756 }
25757 break
25758 }
25759
25760
25761 for {
25762 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25763 if v_0.Op != OpNeq64F {
25764 continue
25765 }
25766 x := v_0.Args[1]
25767 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
25768 continue
25769 }
25770 _ = v_1.Args[1]
25771 neg := v_1.Args[0]
25772 if neg.Op != OpNeg64F || x != neg.Args[0] {
25773 continue
25774 }
25775 y := v_1.Args[1]
25776 if y.Op != OpConst64F {
25777 continue
25778 }
25779 v.reset(OpNot)
25780 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
25781 v0.AddArg2(y, neg)
25782 v.AddArg(v0)
25783 return true
25784 }
25785 break
25786 }
25787
25788
25789 for {
25790 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25791 if v_0.Op != OpNeq64F {
25792 continue
25793 }
25794 x := v_0.Args[1]
25795 if x != v_0.Args[0] || v_1.Op != OpLess64F {
25796 continue
25797 }
25798 _ = v_1.Args[1]
25799 y := v_1.Args[0]
25800 if y.Op != OpConst64F {
25801 continue
25802 }
25803 neg := v_1.Args[1]
25804 if neg.Op != OpNeg64F || x != neg.Args[0] {
25805 continue
25806 }
25807 v.reset(OpNot)
25808 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
25809 v0.AddArg2(neg, y)
25810 v.AddArg(v0)
25811 return true
25812 }
25813 break
25814 }
25815
25816
25817 for {
25818 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25819 if v_0.Op != OpNeq64F {
25820 continue
25821 }
25822 x := v_0.Args[1]
25823 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
25824 continue
25825 }
25826 _ = v_1.Args[1]
25827 y := v_1.Args[0]
25828 if y.Op != OpConst64F {
25829 continue
25830 }
25831 neg := v_1.Args[1]
25832 if neg.Op != OpNeg64F || x != neg.Args[0] {
25833 continue
25834 }
25835 v.reset(OpNot)
25836 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
25837 v0.AddArg2(neg, y)
25838 v.AddArg(v0)
25839 return true
25840 }
25841 break
25842 }
25843
25844
25845 for {
25846 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25847 if v_0.Op != OpNeq32F {
25848 continue
25849 }
25850 x := v_0.Args[1]
25851 if x != v_0.Args[0] || v_1.Op != OpLess32F {
25852 continue
25853 }
25854 _ = v_1.Args[1]
25855 neg := v_1.Args[0]
25856 if neg.Op != OpNeg32F || x != neg.Args[0] {
25857 continue
25858 }
25859 y := v_1.Args[1]
25860 if y.Op != OpConst32F {
25861 continue
25862 }
25863 v.reset(OpNot)
25864 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
25865 v0.AddArg2(y, neg)
25866 v.AddArg(v0)
25867 return true
25868 }
25869 break
25870 }
25871
25872
25873 for {
25874 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25875 if v_0.Op != OpNeq32F {
25876 continue
25877 }
25878 x := v_0.Args[1]
25879 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
25880 continue
25881 }
25882 _ = v_1.Args[1]
25883 neg := v_1.Args[0]
25884 if neg.Op != OpNeg32F || x != neg.Args[0] {
25885 continue
25886 }
25887 y := v_1.Args[1]
25888 if y.Op != OpConst32F {
25889 continue
25890 }
25891 v.reset(OpNot)
25892 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
25893 v0.AddArg2(y, neg)
25894 v.AddArg(v0)
25895 return true
25896 }
25897 break
25898 }
25899
25900
25901 for {
25902 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25903 if v_0.Op != OpNeq32F {
25904 continue
25905 }
25906 x := v_0.Args[1]
25907 if x != v_0.Args[0] || v_1.Op != OpLess32F {
25908 continue
25909 }
25910 _ = v_1.Args[1]
25911 y := v_1.Args[0]
25912 if y.Op != OpConst32F {
25913 continue
25914 }
25915 neg := v_1.Args[1]
25916 if neg.Op != OpNeg32F || x != neg.Args[0] {
25917 continue
25918 }
25919 v.reset(OpNot)
25920 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
25921 v0.AddArg2(neg, y)
25922 v.AddArg(v0)
25923 return true
25924 }
25925 break
25926 }
25927
25928
25929 for {
25930 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25931 if v_0.Op != OpNeq32F {
25932 continue
25933 }
25934 x := v_0.Args[1]
25935 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
25936 continue
25937 }
25938 _ = v_1.Args[1]
25939 y := v_1.Args[0]
25940 if y.Op != OpConst32F {
25941 continue
25942 }
25943 neg := v_1.Args[1]
25944 if neg.Op != OpNeg32F || x != neg.Args[0] {
25945 continue
25946 }
25947 v.reset(OpNot)
25948 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
25949 v0.AddArg2(neg, y)
25950 v.AddArg(v0)
25951 return true
25952 }
25953 break
25954 }
25955 return false
25956 }
25957 func rewriteValuegeneric_OpPhi(v *Value) bool {
25958 b := v.Block
25959
25960
25961 for {
25962 if len(v.Args) != 2 {
25963 break
25964 }
25965 _ = v.Args[1]
25966 v_0 := v.Args[0]
25967 if v_0.Op != OpConst8 {
25968 break
25969 }
25970 c := auxIntToInt8(v_0.AuxInt)
25971 v_1 := v.Args[1]
25972 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != c {
25973 break
25974 }
25975 v.reset(OpConst8)
25976 v.AuxInt = int8ToAuxInt(c)
25977 return true
25978 }
25979
25980
25981 for {
25982 if len(v.Args) != 2 {
25983 break
25984 }
25985 _ = v.Args[1]
25986 v_0 := v.Args[0]
25987 if v_0.Op != OpConst16 {
25988 break
25989 }
25990 c := auxIntToInt16(v_0.AuxInt)
25991 v_1 := v.Args[1]
25992 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != c {
25993 break
25994 }
25995 v.reset(OpConst16)
25996 v.AuxInt = int16ToAuxInt(c)
25997 return true
25998 }
25999
26000
26001 for {
26002 if len(v.Args) != 2 {
26003 break
26004 }
26005 _ = v.Args[1]
26006 v_0 := v.Args[0]
26007 if v_0.Op != OpConst32 {
26008 break
26009 }
26010 c := auxIntToInt32(v_0.AuxInt)
26011 v_1 := v.Args[1]
26012 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != c {
26013 break
26014 }
26015 v.reset(OpConst32)
26016 v.AuxInt = int32ToAuxInt(c)
26017 return true
26018 }
26019
26020
26021 for {
26022 if len(v.Args) != 2 {
26023 break
26024 }
26025 _ = v.Args[1]
26026 v_0 := v.Args[0]
26027 if v_0.Op != OpConst64 {
26028 break
26029 }
26030 c := auxIntToInt64(v_0.AuxInt)
26031 v_1 := v.Args[1]
26032 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c {
26033 break
26034 }
26035 v.reset(OpConst64)
26036 v.AuxInt = int64ToAuxInt(c)
26037 return true
26038 }
26039
26040
26041
26042 for {
26043 if len(v.Args) != 2 {
26044 break
26045 }
26046 t := v.Type
26047 _ = v.Args[1]
26048 nx := v.Args[0]
26049 if nx.Op != OpNot {
26050 break
26051 }
26052 x := nx.Args[0]
26053 ny := v.Args[1]
26054 if ny.Op != OpNot {
26055 break
26056 }
26057 y := ny.Args[0]
26058 if !(nx.Uses == 1 && ny.Uses == 1) {
26059 break
26060 }
26061 v.reset(OpNot)
26062 v0 := b.NewValue0(v.Pos, OpPhi, t)
26063 v0.AddArg2(x, y)
26064 v.AddArg(v0)
26065 return true
26066 }
26067 return false
26068 }
26069 func rewriteValuegeneric_OpPopCount16(v *Value) bool {
26070 v_0 := v.Args[0]
26071 b := v.Block
26072 config := b.Func.Config
26073
26074
26075
26076 for {
26077 if v_0.Op != OpConst16 {
26078 break
26079 }
26080 c := auxIntToInt16(v_0.AuxInt)
26081 if !(config.PtrSize == 8) {
26082 break
26083 }
26084 v.reset(OpConst64)
26085 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount16(uint16(c))))
26086 return true
26087 }
26088
26089
26090
26091 for {
26092 if v_0.Op != OpConst16 {
26093 break
26094 }
26095 c := auxIntToInt16(v_0.AuxInt)
26096 if !(config.PtrSize == 4) {
26097 break
26098 }
26099 v.reset(OpConst32)
26100 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount16(uint16(c))))
26101 return true
26102 }
26103 return false
26104 }
26105 func rewriteValuegeneric_OpPopCount32(v *Value) bool {
26106 v_0 := v.Args[0]
26107 b := v.Block
26108 config := b.Func.Config
26109
26110
26111
26112 for {
26113 if v_0.Op != OpConst32 {
26114 break
26115 }
26116 c := auxIntToInt32(v_0.AuxInt)
26117 if !(config.PtrSize == 8) {
26118 break
26119 }
26120 v.reset(OpConst64)
26121 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount32(uint32(c))))
26122 return true
26123 }
26124
26125
26126
26127 for {
26128 if v_0.Op != OpConst32 {
26129 break
26130 }
26131 c := auxIntToInt32(v_0.AuxInt)
26132 if !(config.PtrSize == 4) {
26133 break
26134 }
26135 v.reset(OpConst32)
26136 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount32(uint32(c))))
26137 return true
26138 }
26139 return false
26140 }
26141 func rewriteValuegeneric_OpPopCount64(v *Value) bool {
26142 v_0 := v.Args[0]
26143 b := v.Block
26144 config := b.Func.Config
26145
26146
26147
26148 for {
26149 if v_0.Op != OpConst64 {
26150 break
26151 }
26152 c := auxIntToInt64(v_0.AuxInt)
26153 if !(config.PtrSize == 8) {
26154 break
26155 }
26156 v.reset(OpConst64)
26157 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount64(uint64(c))))
26158 return true
26159 }
26160
26161
26162
26163 for {
26164 if v_0.Op != OpConst64 {
26165 break
26166 }
26167 c := auxIntToInt64(v_0.AuxInt)
26168 if !(config.PtrSize == 4) {
26169 break
26170 }
26171 v.reset(OpConst32)
26172 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount64(uint64(c))))
26173 return true
26174 }
26175 return false
26176 }
26177 func rewriteValuegeneric_OpPopCount8(v *Value) bool {
26178 v_0 := v.Args[0]
26179 b := v.Block
26180 config := b.Func.Config
26181
26182
26183
26184 for {
26185 if v_0.Op != OpConst8 {
26186 break
26187 }
26188 c := auxIntToInt8(v_0.AuxInt)
26189 if !(config.PtrSize == 8) {
26190 break
26191 }
26192 v.reset(OpConst64)
26193 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount8(uint8(c))))
26194 return true
26195 }
26196
26197
26198
26199 for {
26200 if v_0.Op != OpConst8 {
26201 break
26202 }
26203 c := auxIntToInt8(v_0.AuxInt)
26204 if !(config.PtrSize == 4) {
26205 break
26206 }
26207 v.reset(OpConst32)
26208 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount8(uint8(c))))
26209 return true
26210 }
26211 return false
26212 }
26213 func rewriteValuegeneric_OpPtrIndex(v *Value) bool {
26214 v_1 := v.Args[1]
26215 v_0 := v.Args[0]
26216 b := v.Block
26217 config := b.Func.Config
26218 typ := &b.Func.Config.Types
26219
26220
26221
26222 for {
26223 t := v.Type
26224 ptr := v_0
26225 idx := v_1
26226 if !(config.PtrSize == 4 && is32Bit(t.Elem().Size())) {
26227 break
26228 }
26229 v.reset(OpAddPtr)
26230 v0 := b.NewValue0(v.Pos, OpMul32, typ.Int)
26231 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
26232 v1.AuxInt = int32ToAuxInt(int32(t.Elem().Size()))
26233 v0.AddArg2(idx, v1)
26234 v.AddArg2(ptr, v0)
26235 return true
26236 }
26237
26238
26239
26240 for {
26241 t := v.Type
26242 ptr := v_0
26243 idx := v_1
26244 if !(config.PtrSize == 8) {
26245 break
26246 }
26247 v.reset(OpAddPtr)
26248 v0 := b.NewValue0(v.Pos, OpMul64, typ.Int)
26249 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
26250 v1.AuxInt = int64ToAuxInt(t.Elem().Size())
26251 v0.AddArg2(idx, v1)
26252 v.AddArg2(ptr, v0)
26253 return true
26254 }
26255 return false
26256 }
26257 func rewriteValuegeneric_OpRotateLeft16(v *Value) bool {
26258 v_1 := v.Args[1]
26259 v_0 := v.Args[0]
26260 b := v.Block
26261 config := b.Func.Config
26262
26263
26264
26265 for {
26266 x := v_0
26267 if v_1.Op != OpConst16 {
26268 break
26269 }
26270 c := auxIntToInt16(v_1.AuxInt)
26271 if !(c%16 == 0) {
26272 break
26273 }
26274 v.copyOf(x)
26275 return true
26276 }
26277
26278
26279
26280 for {
26281 x := v_0
26282 if v_1.Op != OpAnd64 {
26283 break
26284 }
26285 _ = v_1.Args[1]
26286 v_1_0 := v_1.Args[0]
26287 v_1_1 := v_1.Args[1]
26288 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26289 y := v_1_0
26290 if v_1_1.Op != OpConst64 {
26291 continue
26292 }
26293 c := auxIntToInt64(v_1_1.AuxInt)
26294 if !(c&15 == 15) {
26295 continue
26296 }
26297 v.reset(OpRotateLeft16)
26298 v.AddArg2(x, y)
26299 return true
26300 }
26301 break
26302 }
26303
26304
26305
26306 for {
26307 x := v_0
26308 if v_1.Op != OpAnd32 {
26309 break
26310 }
26311 _ = v_1.Args[1]
26312 v_1_0 := v_1.Args[0]
26313 v_1_1 := v_1.Args[1]
26314 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26315 y := v_1_0
26316 if v_1_1.Op != OpConst32 {
26317 continue
26318 }
26319 c := auxIntToInt32(v_1_1.AuxInt)
26320 if !(c&15 == 15) {
26321 continue
26322 }
26323 v.reset(OpRotateLeft16)
26324 v.AddArg2(x, y)
26325 return true
26326 }
26327 break
26328 }
26329
26330
26331
26332 for {
26333 x := v_0
26334 if v_1.Op != OpAnd16 {
26335 break
26336 }
26337 _ = v_1.Args[1]
26338 v_1_0 := v_1.Args[0]
26339 v_1_1 := v_1.Args[1]
26340 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26341 y := v_1_0
26342 if v_1_1.Op != OpConst16 {
26343 continue
26344 }
26345 c := auxIntToInt16(v_1_1.AuxInt)
26346 if !(c&15 == 15) {
26347 continue
26348 }
26349 v.reset(OpRotateLeft16)
26350 v.AddArg2(x, y)
26351 return true
26352 }
26353 break
26354 }
26355
26356
26357
26358 for {
26359 x := v_0
26360 if v_1.Op != OpAnd8 {
26361 break
26362 }
26363 _ = v_1.Args[1]
26364 v_1_0 := v_1.Args[0]
26365 v_1_1 := v_1.Args[1]
26366 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26367 y := v_1_0
26368 if v_1_1.Op != OpConst8 {
26369 continue
26370 }
26371 c := auxIntToInt8(v_1_1.AuxInt)
26372 if !(c&15 == 15) {
26373 continue
26374 }
26375 v.reset(OpRotateLeft16)
26376 v.AddArg2(x, y)
26377 return true
26378 }
26379 break
26380 }
26381
26382
26383
26384 for {
26385 x := v_0
26386 if v_1.Op != OpNeg64 {
26387 break
26388 }
26389 v_1_0 := v_1.Args[0]
26390 if v_1_0.Op != OpAnd64 {
26391 break
26392 }
26393 _ = v_1_0.Args[1]
26394 v_1_0_0 := v_1_0.Args[0]
26395 v_1_0_1 := v_1_0.Args[1]
26396 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26397 y := v_1_0_0
26398 if v_1_0_1.Op != OpConst64 {
26399 continue
26400 }
26401 c := auxIntToInt64(v_1_0_1.AuxInt)
26402 if !(c&15 == 15) {
26403 continue
26404 }
26405 v.reset(OpRotateLeft16)
26406 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26407 v0.AddArg(y)
26408 v.AddArg2(x, v0)
26409 return true
26410 }
26411 break
26412 }
26413
26414
26415
26416 for {
26417 x := v_0
26418 if v_1.Op != OpNeg32 {
26419 break
26420 }
26421 v_1_0 := v_1.Args[0]
26422 if v_1_0.Op != OpAnd32 {
26423 break
26424 }
26425 _ = v_1_0.Args[1]
26426 v_1_0_0 := v_1_0.Args[0]
26427 v_1_0_1 := v_1_0.Args[1]
26428 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26429 y := v_1_0_0
26430 if v_1_0_1.Op != OpConst32 {
26431 continue
26432 }
26433 c := auxIntToInt32(v_1_0_1.AuxInt)
26434 if !(c&15 == 15) {
26435 continue
26436 }
26437 v.reset(OpRotateLeft16)
26438 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26439 v0.AddArg(y)
26440 v.AddArg2(x, v0)
26441 return true
26442 }
26443 break
26444 }
26445
26446
26447
26448 for {
26449 x := v_0
26450 if v_1.Op != OpNeg16 {
26451 break
26452 }
26453 v_1_0 := v_1.Args[0]
26454 if v_1_0.Op != OpAnd16 {
26455 break
26456 }
26457 _ = v_1_0.Args[1]
26458 v_1_0_0 := v_1_0.Args[0]
26459 v_1_0_1 := v_1_0.Args[1]
26460 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26461 y := v_1_0_0
26462 if v_1_0_1.Op != OpConst16 {
26463 continue
26464 }
26465 c := auxIntToInt16(v_1_0_1.AuxInt)
26466 if !(c&15 == 15) {
26467 continue
26468 }
26469 v.reset(OpRotateLeft16)
26470 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
26471 v0.AddArg(y)
26472 v.AddArg2(x, v0)
26473 return true
26474 }
26475 break
26476 }
26477
26478
26479
26480 for {
26481 x := v_0
26482 if v_1.Op != OpNeg8 {
26483 break
26484 }
26485 v_1_0 := v_1.Args[0]
26486 if v_1_0.Op != OpAnd8 {
26487 break
26488 }
26489 _ = v_1_0.Args[1]
26490 v_1_0_0 := v_1_0.Args[0]
26491 v_1_0_1 := v_1_0.Args[1]
26492 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26493 y := v_1_0_0
26494 if v_1_0_1.Op != OpConst8 {
26495 continue
26496 }
26497 c := auxIntToInt8(v_1_0_1.AuxInt)
26498 if !(c&15 == 15) {
26499 continue
26500 }
26501 v.reset(OpRotateLeft16)
26502 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
26503 v0.AddArg(y)
26504 v.AddArg2(x, v0)
26505 return true
26506 }
26507 break
26508 }
26509
26510
26511
26512 for {
26513 x := v_0
26514 if v_1.Op != OpAdd64 {
26515 break
26516 }
26517 _ = v_1.Args[1]
26518 v_1_0 := v_1.Args[0]
26519 v_1_1 := v_1.Args[1]
26520 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26521 y := v_1_0
26522 if v_1_1.Op != OpConst64 {
26523 continue
26524 }
26525 c := auxIntToInt64(v_1_1.AuxInt)
26526 if !(c&15 == 0) {
26527 continue
26528 }
26529 v.reset(OpRotateLeft16)
26530 v.AddArg2(x, y)
26531 return true
26532 }
26533 break
26534 }
26535
26536
26537
26538 for {
26539 x := v_0
26540 if v_1.Op != OpAdd32 {
26541 break
26542 }
26543 _ = v_1.Args[1]
26544 v_1_0 := v_1.Args[0]
26545 v_1_1 := v_1.Args[1]
26546 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26547 y := v_1_0
26548 if v_1_1.Op != OpConst32 {
26549 continue
26550 }
26551 c := auxIntToInt32(v_1_1.AuxInt)
26552 if !(c&15 == 0) {
26553 continue
26554 }
26555 v.reset(OpRotateLeft16)
26556 v.AddArg2(x, y)
26557 return true
26558 }
26559 break
26560 }
26561
26562
26563
26564 for {
26565 x := v_0
26566 if v_1.Op != OpAdd16 {
26567 break
26568 }
26569 _ = v_1.Args[1]
26570 v_1_0 := v_1.Args[0]
26571 v_1_1 := v_1.Args[1]
26572 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26573 y := v_1_0
26574 if v_1_1.Op != OpConst16 {
26575 continue
26576 }
26577 c := auxIntToInt16(v_1_1.AuxInt)
26578 if !(c&15 == 0) {
26579 continue
26580 }
26581 v.reset(OpRotateLeft16)
26582 v.AddArg2(x, y)
26583 return true
26584 }
26585 break
26586 }
26587
26588
26589
26590 for {
26591 x := v_0
26592 if v_1.Op != OpAdd8 {
26593 break
26594 }
26595 _ = v_1.Args[1]
26596 v_1_0 := v_1.Args[0]
26597 v_1_1 := v_1.Args[1]
26598 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26599 y := v_1_0
26600 if v_1_1.Op != OpConst8 {
26601 continue
26602 }
26603 c := auxIntToInt8(v_1_1.AuxInt)
26604 if !(c&15 == 0) {
26605 continue
26606 }
26607 v.reset(OpRotateLeft16)
26608 v.AddArg2(x, y)
26609 return true
26610 }
26611 break
26612 }
26613
26614
26615
26616 for {
26617 x := v_0
26618 if v_1.Op != OpSub64 {
26619 break
26620 }
26621 y := v_1.Args[1]
26622 v_1_0 := v_1.Args[0]
26623 if v_1_0.Op != OpConst64 {
26624 break
26625 }
26626 c := auxIntToInt64(v_1_0.AuxInt)
26627 if !(c&15 == 0) {
26628 break
26629 }
26630 v.reset(OpRotateLeft16)
26631 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26632 v0.AddArg(y)
26633 v.AddArg2(x, v0)
26634 return true
26635 }
26636
26637
26638
26639 for {
26640 x := v_0
26641 if v_1.Op != OpSub32 {
26642 break
26643 }
26644 y := v_1.Args[1]
26645 v_1_0 := v_1.Args[0]
26646 if v_1_0.Op != OpConst32 {
26647 break
26648 }
26649 c := auxIntToInt32(v_1_0.AuxInt)
26650 if !(c&15 == 0) {
26651 break
26652 }
26653 v.reset(OpRotateLeft16)
26654 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26655 v0.AddArg(y)
26656 v.AddArg2(x, v0)
26657 return true
26658 }
26659
26660
26661
26662 for {
26663 x := v_0
26664 if v_1.Op != OpSub16 {
26665 break
26666 }
26667 y := v_1.Args[1]
26668 v_1_0 := v_1.Args[0]
26669 if v_1_0.Op != OpConst16 {
26670 break
26671 }
26672 c := auxIntToInt16(v_1_0.AuxInt)
26673 if !(c&15 == 0) {
26674 break
26675 }
26676 v.reset(OpRotateLeft16)
26677 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
26678 v0.AddArg(y)
26679 v.AddArg2(x, v0)
26680 return true
26681 }
26682
26683
26684
26685 for {
26686 x := v_0
26687 if v_1.Op != OpSub8 {
26688 break
26689 }
26690 y := v_1.Args[1]
26691 v_1_0 := v_1.Args[0]
26692 if v_1_0.Op != OpConst8 {
26693 break
26694 }
26695 c := auxIntToInt8(v_1_0.AuxInt)
26696 if !(c&15 == 0) {
26697 break
26698 }
26699 v.reset(OpRotateLeft16)
26700 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
26701 v0.AddArg(y)
26702 v.AddArg2(x, v0)
26703 return true
26704 }
26705
26706
26707
26708 for {
26709 x := v_0
26710 if v_1.Op != OpConst64 {
26711 break
26712 }
26713 t := v_1.Type
26714 c := auxIntToInt64(v_1.AuxInt)
26715 if !(config.PtrSize == 4) {
26716 break
26717 }
26718 v.reset(OpRotateLeft16)
26719 v0 := b.NewValue0(v.Pos, OpConst32, t)
26720 v0.AuxInt = int32ToAuxInt(int32(c))
26721 v.AddArg2(x, v0)
26722 return true
26723 }
26724
26725
26726
26727 for {
26728 if v_0.Op != OpRotateLeft16 {
26729 break
26730 }
26731 c := v_0.Args[1]
26732 x := v_0.Args[0]
26733 d := v_1
26734 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
26735 break
26736 }
26737 v.reset(OpRotateLeft16)
26738 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
26739 v0.AddArg2(c, d)
26740 v.AddArg2(x, v0)
26741 return true
26742 }
26743
26744
26745
26746 for {
26747 if v_0.Op != OpRotateLeft16 {
26748 break
26749 }
26750 c := v_0.Args[1]
26751 x := v_0.Args[0]
26752 d := v_1
26753 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
26754 break
26755 }
26756 v.reset(OpRotateLeft16)
26757 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
26758 v0.AddArg2(c, d)
26759 v.AddArg2(x, v0)
26760 return true
26761 }
26762
26763
26764
26765 for {
26766 if v_0.Op != OpRotateLeft16 {
26767 break
26768 }
26769 c := v_0.Args[1]
26770 x := v_0.Args[0]
26771 d := v_1
26772 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
26773 break
26774 }
26775 v.reset(OpRotateLeft16)
26776 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
26777 v0.AddArg2(c, d)
26778 v.AddArg2(x, v0)
26779 return true
26780 }
26781
26782
26783
26784 for {
26785 if v_0.Op != OpRotateLeft16 {
26786 break
26787 }
26788 c := v_0.Args[1]
26789 x := v_0.Args[0]
26790 d := v_1
26791 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
26792 break
26793 }
26794 v.reset(OpRotateLeft16)
26795 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
26796 v0.AddArg2(c, d)
26797 v.AddArg2(x, v0)
26798 return true
26799 }
26800 return false
26801 }
26802 func rewriteValuegeneric_OpRotateLeft32(v *Value) bool {
26803 v_1 := v.Args[1]
26804 v_0 := v.Args[0]
26805 b := v.Block
26806 config := b.Func.Config
26807
26808
26809
26810 for {
26811 x := v_0
26812 if v_1.Op != OpConst32 {
26813 break
26814 }
26815 c := auxIntToInt32(v_1.AuxInt)
26816 if !(c%32 == 0) {
26817 break
26818 }
26819 v.copyOf(x)
26820 return true
26821 }
26822
26823
26824
26825 for {
26826 x := v_0
26827 if v_1.Op != OpAnd64 {
26828 break
26829 }
26830 _ = v_1.Args[1]
26831 v_1_0 := v_1.Args[0]
26832 v_1_1 := v_1.Args[1]
26833 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26834 y := v_1_0
26835 if v_1_1.Op != OpConst64 {
26836 continue
26837 }
26838 c := auxIntToInt64(v_1_1.AuxInt)
26839 if !(c&31 == 31) {
26840 continue
26841 }
26842 v.reset(OpRotateLeft32)
26843 v.AddArg2(x, y)
26844 return true
26845 }
26846 break
26847 }
26848
26849
26850
26851 for {
26852 x := v_0
26853 if v_1.Op != OpAnd32 {
26854 break
26855 }
26856 _ = v_1.Args[1]
26857 v_1_0 := v_1.Args[0]
26858 v_1_1 := v_1.Args[1]
26859 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26860 y := v_1_0
26861 if v_1_1.Op != OpConst32 {
26862 continue
26863 }
26864 c := auxIntToInt32(v_1_1.AuxInt)
26865 if !(c&31 == 31) {
26866 continue
26867 }
26868 v.reset(OpRotateLeft32)
26869 v.AddArg2(x, y)
26870 return true
26871 }
26872 break
26873 }
26874
26875
26876
26877 for {
26878 x := v_0
26879 if v_1.Op != OpAnd16 {
26880 break
26881 }
26882 _ = v_1.Args[1]
26883 v_1_0 := v_1.Args[0]
26884 v_1_1 := v_1.Args[1]
26885 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26886 y := v_1_0
26887 if v_1_1.Op != OpConst16 {
26888 continue
26889 }
26890 c := auxIntToInt16(v_1_1.AuxInt)
26891 if !(c&31 == 31) {
26892 continue
26893 }
26894 v.reset(OpRotateLeft32)
26895 v.AddArg2(x, y)
26896 return true
26897 }
26898 break
26899 }
26900
26901
26902
26903 for {
26904 x := v_0
26905 if v_1.Op != OpAnd8 {
26906 break
26907 }
26908 _ = v_1.Args[1]
26909 v_1_0 := v_1.Args[0]
26910 v_1_1 := v_1.Args[1]
26911 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26912 y := v_1_0
26913 if v_1_1.Op != OpConst8 {
26914 continue
26915 }
26916 c := auxIntToInt8(v_1_1.AuxInt)
26917 if !(c&31 == 31) {
26918 continue
26919 }
26920 v.reset(OpRotateLeft32)
26921 v.AddArg2(x, y)
26922 return true
26923 }
26924 break
26925 }
26926
26927
26928
26929 for {
26930 x := v_0
26931 if v_1.Op != OpNeg64 {
26932 break
26933 }
26934 v_1_0 := v_1.Args[0]
26935 if v_1_0.Op != OpAnd64 {
26936 break
26937 }
26938 _ = v_1_0.Args[1]
26939 v_1_0_0 := v_1_0.Args[0]
26940 v_1_0_1 := v_1_0.Args[1]
26941 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26942 y := v_1_0_0
26943 if v_1_0_1.Op != OpConst64 {
26944 continue
26945 }
26946 c := auxIntToInt64(v_1_0_1.AuxInt)
26947 if !(c&31 == 31) {
26948 continue
26949 }
26950 v.reset(OpRotateLeft32)
26951 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26952 v0.AddArg(y)
26953 v.AddArg2(x, v0)
26954 return true
26955 }
26956 break
26957 }
26958
26959
26960
26961 for {
26962 x := v_0
26963 if v_1.Op != OpNeg32 {
26964 break
26965 }
26966 v_1_0 := v_1.Args[0]
26967 if v_1_0.Op != OpAnd32 {
26968 break
26969 }
26970 _ = v_1_0.Args[1]
26971 v_1_0_0 := v_1_0.Args[0]
26972 v_1_0_1 := v_1_0.Args[1]
26973 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26974 y := v_1_0_0
26975 if v_1_0_1.Op != OpConst32 {
26976 continue
26977 }
26978 c := auxIntToInt32(v_1_0_1.AuxInt)
26979 if !(c&31 == 31) {
26980 continue
26981 }
26982 v.reset(OpRotateLeft32)
26983 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26984 v0.AddArg(y)
26985 v.AddArg2(x, v0)
26986 return true
26987 }
26988 break
26989 }
26990
26991
26992
26993 for {
26994 x := v_0
26995 if v_1.Op != OpNeg16 {
26996 break
26997 }
26998 v_1_0 := v_1.Args[0]
26999 if v_1_0.Op != OpAnd16 {
27000 break
27001 }
27002 _ = v_1_0.Args[1]
27003 v_1_0_0 := v_1_0.Args[0]
27004 v_1_0_1 := v_1_0.Args[1]
27005 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
27006 y := v_1_0_0
27007 if v_1_0_1.Op != OpConst16 {
27008 continue
27009 }
27010 c := auxIntToInt16(v_1_0_1.AuxInt)
27011 if !(c&31 == 31) {
27012 continue
27013 }
27014 v.reset(OpRotateLeft32)
27015 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
27016 v0.AddArg(y)
27017 v.AddArg2(x, v0)
27018 return true
27019 }
27020 break
27021 }
27022
27023
27024
27025 for {
27026 x := v_0
27027 if v_1.Op != OpNeg8 {
27028 break
27029 }
27030 v_1_0 := v_1.Args[0]
27031 if v_1_0.Op != OpAnd8 {
27032 break
27033 }
27034 _ = v_1_0.Args[1]
27035 v_1_0_0 := v_1_0.Args[0]
27036 v_1_0_1 := v_1_0.Args[1]
27037 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
27038 y := v_1_0_0
27039 if v_1_0_1.Op != OpConst8 {
27040 continue
27041 }
27042 c := auxIntToInt8(v_1_0_1.AuxInt)
27043 if !(c&31 == 31) {
27044 continue
27045 }
27046 v.reset(OpRotateLeft32)
27047 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
27048 v0.AddArg(y)
27049 v.AddArg2(x, v0)
27050 return true
27051 }
27052 break
27053 }
27054
27055
27056
27057 for {
27058 x := v_0
27059 if v_1.Op != OpAdd64 {
27060 break
27061 }
27062 _ = v_1.Args[1]
27063 v_1_0 := v_1.Args[0]
27064 v_1_1 := v_1.Args[1]
27065 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27066 y := v_1_0
27067 if v_1_1.Op != OpConst64 {
27068 continue
27069 }
27070 c := auxIntToInt64(v_1_1.AuxInt)
27071 if !(c&31 == 0) {
27072 continue
27073 }
27074 v.reset(OpRotateLeft32)
27075 v.AddArg2(x, y)
27076 return true
27077 }
27078 break
27079 }
27080
27081
27082
27083 for {
27084 x := v_0
27085 if v_1.Op != OpAdd32 {
27086 break
27087 }
27088 _ = v_1.Args[1]
27089 v_1_0 := v_1.Args[0]
27090 v_1_1 := v_1.Args[1]
27091 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27092 y := v_1_0
27093 if v_1_1.Op != OpConst32 {
27094 continue
27095 }
27096 c := auxIntToInt32(v_1_1.AuxInt)
27097 if !(c&31 == 0) {
27098 continue
27099 }
27100 v.reset(OpRotateLeft32)
27101 v.AddArg2(x, y)
27102 return true
27103 }
27104 break
27105 }
27106
27107
27108
27109 for {
27110 x := v_0
27111 if v_1.Op != OpAdd16 {
27112 break
27113 }
27114 _ = v_1.Args[1]
27115 v_1_0 := v_1.Args[0]
27116 v_1_1 := v_1.Args[1]
27117 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27118 y := v_1_0
27119 if v_1_1.Op != OpConst16 {
27120 continue
27121 }
27122 c := auxIntToInt16(v_1_1.AuxInt)
27123 if !(c&31 == 0) {
27124 continue
27125 }
27126 v.reset(OpRotateLeft32)
27127 v.AddArg2(x, y)
27128 return true
27129 }
27130 break
27131 }
27132
27133
27134
27135 for {
27136 x := v_0
27137 if v_1.Op != OpAdd8 {
27138 break
27139 }
27140 _ = v_1.Args[1]
27141 v_1_0 := v_1.Args[0]
27142 v_1_1 := v_1.Args[1]
27143 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27144 y := v_1_0
27145 if v_1_1.Op != OpConst8 {
27146 continue
27147 }
27148 c := auxIntToInt8(v_1_1.AuxInt)
27149 if !(c&31 == 0) {
27150 continue
27151 }
27152 v.reset(OpRotateLeft32)
27153 v.AddArg2(x, y)
27154 return true
27155 }
27156 break
27157 }
27158
27159
27160
27161 for {
27162 x := v_0
27163 if v_1.Op != OpSub64 {
27164 break
27165 }
27166 y := v_1.Args[1]
27167 v_1_0 := v_1.Args[0]
27168 if v_1_0.Op != OpConst64 {
27169 break
27170 }
27171 c := auxIntToInt64(v_1_0.AuxInt)
27172 if !(c&31 == 0) {
27173 break
27174 }
27175 v.reset(OpRotateLeft32)
27176 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
27177 v0.AddArg(y)
27178 v.AddArg2(x, v0)
27179 return true
27180 }
27181
27182
27183
27184 for {
27185 x := v_0
27186 if v_1.Op != OpSub32 {
27187 break
27188 }
27189 y := v_1.Args[1]
27190 v_1_0 := v_1.Args[0]
27191 if v_1_0.Op != OpConst32 {
27192 break
27193 }
27194 c := auxIntToInt32(v_1_0.AuxInt)
27195 if !(c&31 == 0) {
27196 break
27197 }
27198 v.reset(OpRotateLeft32)
27199 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
27200 v0.AddArg(y)
27201 v.AddArg2(x, v0)
27202 return true
27203 }
27204
27205
27206
27207 for {
27208 x := v_0
27209 if v_1.Op != OpSub16 {
27210 break
27211 }
27212 y := v_1.Args[1]
27213 v_1_0 := v_1.Args[0]
27214 if v_1_0.Op != OpConst16 {
27215 break
27216 }
27217 c := auxIntToInt16(v_1_0.AuxInt)
27218 if !(c&31 == 0) {
27219 break
27220 }
27221 v.reset(OpRotateLeft32)
27222 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
27223 v0.AddArg(y)
27224 v.AddArg2(x, v0)
27225 return true
27226 }
27227
27228
27229
27230 for {
27231 x := v_0
27232 if v_1.Op != OpSub8 {
27233 break
27234 }
27235 y := v_1.Args[1]
27236 v_1_0 := v_1.Args[0]
27237 if v_1_0.Op != OpConst8 {
27238 break
27239 }
27240 c := auxIntToInt8(v_1_0.AuxInt)
27241 if !(c&31 == 0) {
27242 break
27243 }
27244 v.reset(OpRotateLeft32)
27245 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
27246 v0.AddArg(y)
27247 v.AddArg2(x, v0)
27248 return true
27249 }
27250
27251
27252
27253 for {
27254 x := v_0
27255 if v_1.Op != OpConst64 {
27256 break
27257 }
27258 t := v_1.Type
27259 c := auxIntToInt64(v_1.AuxInt)
27260 if !(config.PtrSize == 4) {
27261 break
27262 }
27263 v.reset(OpRotateLeft32)
27264 v0 := b.NewValue0(v.Pos, OpConst32, t)
27265 v0.AuxInt = int32ToAuxInt(int32(c))
27266 v.AddArg2(x, v0)
27267 return true
27268 }
27269
27270
27271
27272 for {
27273 if v_0.Op != OpRotateLeft32 {
27274 break
27275 }
27276 c := v_0.Args[1]
27277 x := v_0.Args[0]
27278 d := v_1
27279 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
27280 break
27281 }
27282 v.reset(OpRotateLeft32)
27283 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
27284 v0.AddArg2(c, d)
27285 v.AddArg2(x, v0)
27286 return true
27287 }
27288
27289
27290
27291 for {
27292 if v_0.Op != OpRotateLeft32 {
27293 break
27294 }
27295 c := v_0.Args[1]
27296 x := v_0.Args[0]
27297 d := v_1
27298 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
27299 break
27300 }
27301 v.reset(OpRotateLeft32)
27302 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
27303 v0.AddArg2(c, d)
27304 v.AddArg2(x, v0)
27305 return true
27306 }
27307
27308
27309
27310 for {
27311 if v_0.Op != OpRotateLeft32 {
27312 break
27313 }
27314 c := v_0.Args[1]
27315 x := v_0.Args[0]
27316 d := v_1
27317 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
27318 break
27319 }
27320 v.reset(OpRotateLeft32)
27321 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
27322 v0.AddArg2(c, d)
27323 v.AddArg2(x, v0)
27324 return true
27325 }
27326
27327
27328
27329 for {
27330 if v_0.Op != OpRotateLeft32 {
27331 break
27332 }
27333 c := v_0.Args[1]
27334 x := v_0.Args[0]
27335 d := v_1
27336 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
27337 break
27338 }
27339 v.reset(OpRotateLeft32)
27340 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
27341 v0.AddArg2(c, d)
27342 v.AddArg2(x, v0)
27343 return true
27344 }
27345 return false
27346 }
27347 func rewriteValuegeneric_OpRotateLeft64(v *Value) bool {
27348 v_1 := v.Args[1]
27349 v_0 := v.Args[0]
27350 b := v.Block
27351 config := b.Func.Config
27352
27353
27354
27355 for {
27356 x := v_0
27357 if v_1.Op != OpConst64 {
27358 break
27359 }
27360 c := auxIntToInt64(v_1.AuxInt)
27361 if !(c%64 == 0) {
27362 break
27363 }
27364 v.copyOf(x)
27365 return true
27366 }
27367
27368
27369
27370 for {
27371 x := v_0
27372 if v_1.Op != OpAnd64 {
27373 break
27374 }
27375 _ = v_1.Args[1]
27376 v_1_0 := v_1.Args[0]
27377 v_1_1 := v_1.Args[1]
27378 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27379 y := v_1_0
27380 if v_1_1.Op != OpConst64 {
27381 continue
27382 }
27383 c := auxIntToInt64(v_1_1.AuxInt)
27384 if !(c&63 == 63) {
27385 continue
27386 }
27387 v.reset(OpRotateLeft64)
27388 v.AddArg2(x, y)
27389 return true
27390 }
27391 break
27392 }
27393
27394
27395
27396 for {
27397 x := v_0
27398 if v_1.Op != OpAnd32 {
27399 break
27400 }
27401 _ = v_1.Args[1]
27402 v_1_0 := v_1.Args[0]
27403 v_1_1 := v_1.Args[1]
27404 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27405 y := v_1_0
27406 if v_1_1.Op != OpConst32 {
27407 continue
27408 }
27409 c := auxIntToInt32(v_1_1.AuxInt)
27410 if !(c&63 == 63) {
27411 continue
27412 }
27413 v.reset(OpRotateLeft64)
27414 v.AddArg2(x, y)
27415 return true
27416 }
27417 break
27418 }
27419
27420
27421
27422 for {
27423 x := v_0
27424 if v_1.Op != OpAnd16 {
27425 break
27426 }
27427 _ = v_1.Args[1]
27428 v_1_0 := v_1.Args[0]
27429 v_1_1 := v_1.Args[1]
27430 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27431 y := v_1_0
27432 if v_1_1.Op != OpConst16 {
27433 continue
27434 }
27435 c := auxIntToInt16(v_1_1.AuxInt)
27436 if !(c&63 == 63) {
27437 continue
27438 }
27439 v.reset(OpRotateLeft64)
27440 v.AddArg2(x, y)
27441 return true
27442 }
27443 break
27444 }
27445
27446
27447
27448 for {
27449 x := v_0
27450 if v_1.Op != OpAnd8 {
27451 break
27452 }
27453 _ = v_1.Args[1]
27454 v_1_0 := v_1.Args[0]
27455 v_1_1 := v_1.Args[1]
27456 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27457 y := v_1_0
27458 if v_1_1.Op != OpConst8 {
27459 continue
27460 }
27461 c := auxIntToInt8(v_1_1.AuxInt)
27462 if !(c&63 == 63) {
27463 continue
27464 }
27465 v.reset(OpRotateLeft64)
27466 v.AddArg2(x, y)
27467 return true
27468 }
27469 break
27470 }
27471
27472
27473
27474 for {
27475 x := v_0
27476 if v_1.Op != OpNeg64 {
27477 break
27478 }
27479 v_1_0 := v_1.Args[0]
27480 if v_1_0.Op != OpAnd64 {
27481 break
27482 }
27483 _ = v_1_0.Args[1]
27484 v_1_0_0 := v_1_0.Args[0]
27485 v_1_0_1 := v_1_0.Args[1]
27486 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
27487 y := v_1_0_0
27488 if v_1_0_1.Op != OpConst64 {
27489 continue
27490 }
27491 c := auxIntToInt64(v_1_0_1.AuxInt)
27492 if !(c&63 == 63) {
27493 continue
27494 }
27495 v.reset(OpRotateLeft64)
27496 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
27497 v0.AddArg(y)
27498 v.AddArg2(x, v0)
27499 return true
27500 }
27501 break
27502 }
27503
27504
27505
27506 for {
27507 x := v_0
27508 if v_1.Op != OpNeg32 {
27509 break
27510 }
27511 v_1_0 := v_1.Args[0]
27512 if v_1_0.Op != OpAnd32 {
27513 break
27514 }
27515 _ = v_1_0.Args[1]
27516 v_1_0_0 := v_1_0.Args[0]
27517 v_1_0_1 := v_1_0.Args[1]
27518 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
27519 y := v_1_0_0
27520 if v_1_0_1.Op != OpConst32 {
27521 continue
27522 }
27523 c := auxIntToInt32(v_1_0_1.AuxInt)
27524 if !(c&63 == 63) {
27525 continue
27526 }
27527 v.reset(OpRotateLeft64)
27528 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
27529 v0.AddArg(y)
27530 v.AddArg2(x, v0)
27531 return true
27532 }
27533 break
27534 }
27535
27536
27537
27538 for {
27539 x := v_0
27540 if v_1.Op != OpNeg16 {
27541 break
27542 }
27543 v_1_0 := v_1.Args[0]
27544 if v_1_0.Op != OpAnd16 {
27545 break
27546 }
27547 _ = v_1_0.Args[1]
27548 v_1_0_0 := v_1_0.Args[0]
27549 v_1_0_1 := v_1_0.Args[1]
27550 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
27551 y := v_1_0_0
27552 if v_1_0_1.Op != OpConst16 {
27553 continue
27554 }
27555 c := auxIntToInt16(v_1_0_1.AuxInt)
27556 if !(c&63 == 63) {
27557 continue
27558 }
27559 v.reset(OpRotateLeft64)
27560 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
27561 v0.AddArg(y)
27562 v.AddArg2(x, v0)
27563 return true
27564 }
27565 break
27566 }
27567
27568
27569
27570 for {
27571 x := v_0
27572 if v_1.Op != OpNeg8 {
27573 break
27574 }
27575 v_1_0 := v_1.Args[0]
27576 if v_1_0.Op != OpAnd8 {
27577 break
27578 }
27579 _ = v_1_0.Args[1]
27580 v_1_0_0 := v_1_0.Args[0]
27581 v_1_0_1 := v_1_0.Args[1]
27582 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
27583 y := v_1_0_0
27584 if v_1_0_1.Op != OpConst8 {
27585 continue
27586 }
27587 c := auxIntToInt8(v_1_0_1.AuxInt)
27588 if !(c&63 == 63) {
27589 continue
27590 }
27591 v.reset(OpRotateLeft64)
27592 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
27593 v0.AddArg(y)
27594 v.AddArg2(x, v0)
27595 return true
27596 }
27597 break
27598 }
27599
27600
27601
27602 for {
27603 x := v_0
27604 if v_1.Op != OpAdd64 {
27605 break
27606 }
27607 _ = v_1.Args[1]
27608 v_1_0 := v_1.Args[0]
27609 v_1_1 := v_1.Args[1]
27610 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27611 y := v_1_0
27612 if v_1_1.Op != OpConst64 {
27613 continue
27614 }
27615 c := auxIntToInt64(v_1_1.AuxInt)
27616 if !(c&63 == 0) {
27617 continue
27618 }
27619 v.reset(OpRotateLeft64)
27620 v.AddArg2(x, y)
27621 return true
27622 }
27623 break
27624 }
27625
27626
27627
27628 for {
27629 x := v_0
27630 if v_1.Op != OpAdd32 {
27631 break
27632 }
27633 _ = v_1.Args[1]
27634 v_1_0 := v_1.Args[0]
27635 v_1_1 := v_1.Args[1]
27636 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27637 y := v_1_0
27638 if v_1_1.Op != OpConst32 {
27639 continue
27640 }
27641 c := auxIntToInt32(v_1_1.AuxInt)
27642 if !(c&63 == 0) {
27643 continue
27644 }
27645 v.reset(OpRotateLeft64)
27646 v.AddArg2(x, y)
27647 return true
27648 }
27649 break
27650 }
27651
27652
27653
27654 for {
27655 x := v_0
27656 if v_1.Op != OpAdd16 {
27657 break
27658 }
27659 _ = v_1.Args[1]
27660 v_1_0 := v_1.Args[0]
27661 v_1_1 := v_1.Args[1]
27662 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27663 y := v_1_0
27664 if v_1_1.Op != OpConst16 {
27665 continue
27666 }
27667 c := auxIntToInt16(v_1_1.AuxInt)
27668 if !(c&63 == 0) {
27669 continue
27670 }
27671 v.reset(OpRotateLeft64)
27672 v.AddArg2(x, y)
27673 return true
27674 }
27675 break
27676 }
27677
27678
27679
27680 for {
27681 x := v_0
27682 if v_1.Op != OpAdd8 {
27683 break
27684 }
27685 _ = v_1.Args[1]
27686 v_1_0 := v_1.Args[0]
27687 v_1_1 := v_1.Args[1]
27688 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27689 y := v_1_0
27690 if v_1_1.Op != OpConst8 {
27691 continue
27692 }
27693 c := auxIntToInt8(v_1_1.AuxInt)
27694 if !(c&63 == 0) {
27695 continue
27696 }
27697 v.reset(OpRotateLeft64)
27698 v.AddArg2(x, y)
27699 return true
27700 }
27701 break
27702 }
27703
27704
27705
27706 for {
27707 x := v_0
27708 if v_1.Op != OpSub64 {
27709 break
27710 }
27711 y := v_1.Args[1]
27712 v_1_0 := v_1.Args[0]
27713 if v_1_0.Op != OpConst64 {
27714 break
27715 }
27716 c := auxIntToInt64(v_1_0.AuxInt)
27717 if !(c&63 == 0) {
27718 break
27719 }
27720 v.reset(OpRotateLeft64)
27721 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
27722 v0.AddArg(y)
27723 v.AddArg2(x, v0)
27724 return true
27725 }
27726
27727
27728
27729 for {
27730 x := v_0
27731 if v_1.Op != OpSub32 {
27732 break
27733 }
27734 y := v_1.Args[1]
27735 v_1_0 := v_1.Args[0]
27736 if v_1_0.Op != OpConst32 {
27737 break
27738 }
27739 c := auxIntToInt32(v_1_0.AuxInt)
27740 if !(c&63 == 0) {
27741 break
27742 }
27743 v.reset(OpRotateLeft64)
27744 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
27745 v0.AddArg(y)
27746 v.AddArg2(x, v0)
27747 return true
27748 }
27749
27750
27751
27752 for {
27753 x := v_0
27754 if v_1.Op != OpSub16 {
27755 break
27756 }
27757 y := v_1.Args[1]
27758 v_1_0 := v_1.Args[0]
27759 if v_1_0.Op != OpConst16 {
27760 break
27761 }
27762 c := auxIntToInt16(v_1_0.AuxInt)
27763 if !(c&63 == 0) {
27764 break
27765 }
27766 v.reset(OpRotateLeft64)
27767 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
27768 v0.AddArg(y)
27769 v.AddArg2(x, v0)
27770 return true
27771 }
27772
27773
27774
27775 for {
27776 x := v_0
27777 if v_1.Op != OpSub8 {
27778 break
27779 }
27780 y := v_1.Args[1]
27781 v_1_0 := v_1.Args[0]
27782 if v_1_0.Op != OpConst8 {
27783 break
27784 }
27785 c := auxIntToInt8(v_1_0.AuxInt)
27786 if !(c&63 == 0) {
27787 break
27788 }
27789 v.reset(OpRotateLeft64)
27790 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
27791 v0.AddArg(y)
27792 v.AddArg2(x, v0)
27793 return true
27794 }
27795
27796
27797
27798 for {
27799 x := v_0
27800 if v_1.Op != OpConst64 {
27801 break
27802 }
27803 t := v_1.Type
27804 c := auxIntToInt64(v_1.AuxInt)
27805 if !(config.PtrSize == 4) {
27806 break
27807 }
27808 v.reset(OpRotateLeft64)
27809 v0 := b.NewValue0(v.Pos, OpConst32, t)
27810 v0.AuxInt = int32ToAuxInt(int32(c))
27811 v.AddArg2(x, v0)
27812 return true
27813 }
27814
27815
27816
27817 for {
27818 if v_0.Op != OpRotateLeft64 {
27819 break
27820 }
27821 c := v_0.Args[1]
27822 x := v_0.Args[0]
27823 d := v_1
27824 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
27825 break
27826 }
27827 v.reset(OpRotateLeft64)
27828 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
27829 v0.AddArg2(c, d)
27830 v.AddArg2(x, v0)
27831 return true
27832 }
27833
27834
27835
27836 for {
27837 if v_0.Op != OpRotateLeft64 {
27838 break
27839 }
27840 c := v_0.Args[1]
27841 x := v_0.Args[0]
27842 d := v_1
27843 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
27844 break
27845 }
27846 v.reset(OpRotateLeft64)
27847 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
27848 v0.AddArg2(c, d)
27849 v.AddArg2(x, v0)
27850 return true
27851 }
27852
27853
27854
27855 for {
27856 if v_0.Op != OpRotateLeft64 {
27857 break
27858 }
27859 c := v_0.Args[1]
27860 x := v_0.Args[0]
27861 d := v_1
27862 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
27863 break
27864 }
27865 v.reset(OpRotateLeft64)
27866 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
27867 v0.AddArg2(c, d)
27868 v.AddArg2(x, v0)
27869 return true
27870 }
27871
27872
27873
27874 for {
27875 if v_0.Op != OpRotateLeft64 {
27876 break
27877 }
27878 c := v_0.Args[1]
27879 x := v_0.Args[0]
27880 d := v_1
27881 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
27882 break
27883 }
27884 v.reset(OpRotateLeft64)
27885 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
27886 v0.AddArg2(c, d)
27887 v.AddArg2(x, v0)
27888 return true
27889 }
27890 return false
27891 }
27892 func rewriteValuegeneric_OpRotateLeft8(v *Value) bool {
27893 v_1 := v.Args[1]
27894 v_0 := v.Args[0]
27895 b := v.Block
27896 config := b.Func.Config
27897
27898
27899
27900 for {
27901 x := v_0
27902 if v_1.Op != OpConst8 {
27903 break
27904 }
27905 c := auxIntToInt8(v_1.AuxInt)
27906 if !(c%8 == 0) {
27907 break
27908 }
27909 v.copyOf(x)
27910 return true
27911 }
27912
27913
27914
27915 for {
27916 x := v_0
27917 if v_1.Op != OpAnd64 {
27918 break
27919 }
27920 _ = v_1.Args[1]
27921 v_1_0 := v_1.Args[0]
27922 v_1_1 := v_1.Args[1]
27923 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27924 y := v_1_0
27925 if v_1_1.Op != OpConst64 {
27926 continue
27927 }
27928 c := auxIntToInt64(v_1_1.AuxInt)
27929 if !(c&7 == 7) {
27930 continue
27931 }
27932 v.reset(OpRotateLeft8)
27933 v.AddArg2(x, y)
27934 return true
27935 }
27936 break
27937 }
27938
27939
27940
27941 for {
27942 x := v_0
27943 if v_1.Op != OpAnd32 {
27944 break
27945 }
27946 _ = v_1.Args[1]
27947 v_1_0 := v_1.Args[0]
27948 v_1_1 := v_1.Args[1]
27949 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27950 y := v_1_0
27951 if v_1_1.Op != OpConst32 {
27952 continue
27953 }
27954 c := auxIntToInt32(v_1_1.AuxInt)
27955 if !(c&7 == 7) {
27956 continue
27957 }
27958 v.reset(OpRotateLeft8)
27959 v.AddArg2(x, y)
27960 return true
27961 }
27962 break
27963 }
27964
27965
27966
27967 for {
27968 x := v_0
27969 if v_1.Op != OpAnd16 {
27970 break
27971 }
27972 _ = v_1.Args[1]
27973 v_1_0 := v_1.Args[0]
27974 v_1_1 := v_1.Args[1]
27975 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27976 y := v_1_0
27977 if v_1_1.Op != OpConst16 {
27978 continue
27979 }
27980 c := auxIntToInt16(v_1_1.AuxInt)
27981 if !(c&7 == 7) {
27982 continue
27983 }
27984 v.reset(OpRotateLeft8)
27985 v.AddArg2(x, y)
27986 return true
27987 }
27988 break
27989 }
27990
27991
27992
27993 for {
27994 x := v_0
27995 if v_1.Op != OpAnd8 {
27996 break
27997 }
27998 _ = v_1.Args[1]
27999 v_1_0 := v_1.Args[0]
28000 v_1_1 := v_1.Args[1]
28001 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28002 y := v_1_0
28003 if v_1_1.Op != OpConst8 {
28004 continue
28005 }
28006 c := auxIntToInt8(v_1_1.AuxInt)
28007 if !(c&7 == 7) {
28008 continue
28009 }
28010 v.reset(OpRotateLeft8)
28011 v.AddArg2(x, y)
28012 return true
28013 }
28014 break
28015 }
28016
28017
28018
28019 for {
28020 x := v_0
28021 if v_1.Op != OpNeg64 {
28022 break
28023 }
28024 v_1_0 := v_1.Args[0]
28025 if v_1_0.Op != OpAnd64 {
28026 break
28027 }
28028 _ = v_1_0.Args[1]
28029 v_1_0_0 := v_1_0.Args[0]
28030 v_1_0_1 := v_1_0.Args[1]
28031 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
28032 y := v_1_0_0
28033 if v_1_0_1.Op != OpConst64 {
28034 continue
28035 }
28036 c := auxIntToInt64(v_1_0_1.AuxInt)
28037 if !(c&7 == 7) {
28038 continue
28039 }
28040 v.reset(OpRotateLeft8)
28041 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
28042 v0.AddArg(y)
28043 v.AddArg2(x, v0)
28044 return true
28045 }
28046 break
28047 }
28048
28049
28050
28051 for {
28052 x := v_0
28053 if v_1.Op != OpNeg32 {
28054 break
28055 }
28056 v_1_0 := v_1.Args[0]
28057 if v_1_0.Op != OpAnd32 {
28058 break
28059 }
28060 _ = v_1_0.Args[1]
28061 v_1_0_0 := v_1_0.Args[0]
28062 v_1_0_1 := v_1_0.Args[1]
28063 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
28064 y := v_1_0_0
28065 if v_1_0_1.Op != OpConst32 {
28066 continue
28067 }
28068 c := auxIntToInt32(v_1_0_1.AuxInt)
28069 if !(c&7 == 7) {
28070 continue
28071 }
28072 v.reset(OpRotateLeft8)
28073 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
28074 v0.AddArg(y)
28075 v.AddArg2(x, v0)
28076 return true
28077 }
28078 break
28079 }
28080
28081
28082
28083 for {
28084 x := v_0
28085 if v_1.Op != OpNeg16 {
28086 break
28087 }
28088 v_1_0 := v_1.Args[0]
28089 if v_1_0.Op != OpAnd16 {
28090 break
28091 }
28092 _ = v_1_0.Args[1]
28093 v_1_0_0 := v_1_0.Args[0]
28094 v_1_0_1 := v_1_0.Args[1]
28095 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
28096 y := v_1_0_0
28097 if v_1_0_1.Op != OpConst16 {
28098 continue
28099 }
28100 c := auxIntToInt16(v_1_0_1.AuxInt)
28101 if !(c&7 == 7) {
28102 continue
28103 }
28104 v.reset(OpRotateLeft8)
28105 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
28106 v0.AddArg(y)
28107 v.AddArg2(x, v0)
28108 return true
28109 }
28110 break
28111 }
28112
28113
28114
28115 for {
28116 x := v_0
28117 if v_1.Op != OpNeg8 {
28118 break
28119 }
28120 v_1_0 := v_1.Args[0]
28121 if v_1_0.Op != OpAnd8 {
28122 break
28123 }
28124 _ = v_1_0.Args[1]
28125 v_1_0_0 := v_1_0.Args[0]
28126 v_1_0_1 := v_1_0.Args[1]
28127 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
28128 y := v_1_0_0
28129 if v_1_0_1.Op != OpConst8 {
28130 continue
28131 }
28132 c := auxIntToInt8(v_1_0_1.AuxInt)
28133 if !(c&7 == 7) {
28134 continue
28135 }
28136 v.reset(OpRotateLeft8)
28137 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
28138 v0.AddArg(y)
28139 v.AddArg2(x, v0)
28140 return true
28141 }
28142 break
28143 }
28144
28145
28146
28147 for {
28148 x := v_0
28149 if v_1.Op != OpAdd64 {
28150 break
28151 }
28152 _ = v_1.Args[1]
28153 v_1_0 := v_1.Args[0]
28154 v_1_1 := v_1.Args[1]
28155 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28156 y := v_1_0
28157 if v_1_1.Op != OpConst64 {
28158 continue
28159 }
28160 c := auxIntToInt64(v_1_1.AuxInt)
28161 if !(c&7 == 0) {
28162 continue
28163 }
28164 v.reset(OpRotateLeft8)
28165 v.AddArg2(x, y)
28166 return true
28167 }
28168 break
28169 }
28170
28171
28172
28173 for {
28174 x := v_0
28175 if v_1.Op != OpAdd32 {
28176 break
28177 }
28178 _ = v_1.Args[1]
28179 v_1_0 := v_1.Args[0]
28180 v_1_1 := v_1.Args[1]
28181 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28182 y := v_1_0
28183 if v_1_1.Op != OpConst32 {
28184 continue
28185 }
28186 c := auxIntToInt32(v_1_1.AuxInt)
28187 if !(c&7 == 0) {
28188 continue
28189 }
28190 v.reset(OpRotateLeft8)
28191 v.AddArg2(x, y)
28192 return true
28193 }
28194 break
28195 }
28196
28197
28198
28199 for {
28200 x := v_0
28201 if v_1.Op != OpAdd16 {
28202 break
28203 }
28204 _ = v_1.Args[1]
28205 v_1_0 := v_1.Args[0]
28206 v_1_1 := v_1.Args[1]
28207 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28208 y := v_1_0
28209 if v_1_1.Op != OpConst16 {
28210 continue
28211 }
28212 c := auxIntToInt16(v_1_1.AuxInt)
28213 if !(c&7 == 0) {
28214 continue
28215 }
28216 v.reset(OpRotateLeft8)
28217 v.AddArg2(x, y)
28218 return true
28219 }
28220 break
28221 }
28222
28223
28224
28225 for {
28226 x := v_0
28227 if v_1.Op != OpAdd8 {
28228 break
28229 }
28230 _ = v_1.Args[1]
28231 v_1_0 := v_1.Args[0]
28232 v_1_1 := v_1.Args[1]
28233 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28234 y := v_1_0
28235 if v_1_1.Op != OpConst8 {
28236 continue
28237 }
28238 c := auxIntToInt8(v_1_1.AuxInt)
28239 if !(c&7 == 0) {
28240 continue
28241 }
28242 v.reset(OpRotateLeft8)
28243 v.AddArg2(x, y)
28244 return true
28245 }
28246 break
28247 }
28248
28249
28250
28251 for {
28252 x := v_0
28253 if v_1.Op != OpSub64 {
28254 break
28255 }
28256 y := v_1.Args[1]
28257 v_1_0 := v_1.Args[0]
28258 if v_1_0.Op != OpConst64 {
28259 break
28260 }
28261 c := auxIntToInt64(v_1_0.AuxInt)
28262 if !(c&7 == 0) {
28263 break
28264 }
28265 v.reset(OpRotateLeft8)
28266 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
28267 v0.AddArg(y)
28268 v.AddArg2(x, v0)
28269 return true
28270 }
28271
28272
28273
28274 for {
28275 x := v_0
28276 if v_1.Op != OpSub32 {
28277 break
28278 }
28279 y := v_1.Args[1]
28280 v_1_0 := v_1.Args[0]
28281 if v_1_0.Op != OpConst32 {
28282 break
28283 }
28284 c := auxIntToInt32(v_1_0.AuxInt)
28285 if !(c&7 == 0) {
28286 break
28287 }
28288 v.reset(OpRotateLeft8)
28289 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
28290 v0.AddArg(y)
28291 v.AddArg2(x, v0)
28292 return true
28293 }
28294
28295
28296
28297 for {
28298 x := v_0
28299 if v_1.Op != OpSub16 {
28300 break
28301 }
28302 y := v_1.Args[1]
28303 v_1_0 := v_1.Args[0]
28304 if v_1_0.Op != OpConst16 {
28305 break
28306 }
28307 c := auxIntToInt16(v_1_0.AuxInt)
28308 if !(c&7 == 0) {
28309 break
28310 }
28311 v.reset(OpRotateLeft8)
28312 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
28313 v0.AddArg(y)
28314 v.AddArg2(x, v0)
28315 return true
28316 }
28317
28318
28319
28320 for {
28321 x := v_0
28322 if v_1.Op != OpSub8 {
28323 break
28324 }
28325 y := v_1.Args[1]
28326 v_1_0 := v_1.Args[0]
28327 if v_1_0.Op != OpConst8 {
28328 break
28329 }
28330 c := auxIntToInt8(v_1_0.AuxInt)
28331 if !(c&7 == 0) {
28332 break
28333 }
28334 v.reset(OpRotateLeft8)
28335 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
28336 v0.AddArg(y)
28337 v.AddArg2(x, v0)
28338 return true
28339 }
28340
28341
28342
28343 for {
28344 x := v_0
28345 if v_1.Op != OpConst64 {
28346 break
28347 }
28348 t := v_1.Type
28349 c := auxIntToInt64(v_1.AuxInt)
28350 if !(config.PtrSize == 4) {
28351 break
28352 }
28353 v.reset(OpRotateLeft8)
28354 v0 := b.NewValue0(v.Pos, OpConst32, t)
28355 v0.AuxInt = int32ToAuxInt(int32(c))
28356 v.AddArg2(x, v0)
28357 return true
28358 }
28359
28360
28361
28362 for {
28363 if v_0.Op != OpRotateLeft8 {
28364 break
28365 }
28366 c := v_0.Args[1]
28367 x := v_0.Args[0]
28368 d := v_1
28369 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
28370 break
28371 }
28372 v.reset(OpRotateLeft8)
28373 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
28374 v0.AddArg2(c, d)
28375 v.AddArg2(x, v0)
28376 return true
28377 }
28378
28379
28380
28381 for {
28382 if v_0.Op != OpRotateLeft8 {
28383 break
28384 }
28385 c := v_0.Args[1]
28386 x := v_0.Args[0]
28387 d := v_1
28388 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
28389 break
28390 }
28391 v.reset(OpRotateLeft8)
28392 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
28393 v0.AddArg2(c, d)
28394 v.AddArg2(x, v0)
28395 return true
28396 }
28397
28398
28399
28400 for {
28401 if v_0.Op != OpRotateLeft8 {
28402 break
28403 }
28404 c := v_0.Args[1]
28405 x := v_0.Args[0]
28406 d := v_1
28407 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
28408 break
28409 }
28410 v.reset(OpRotateLeft8)
28411 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
28412 v0.AddArg2(c, d)
28413 v.AddArg2(x, v0)
28414 return true
28415 }
28416
28417
28418
28419 for {
28420 if v_0.Op != OpRotateLeft8 {
28421 break
28422 }
28423 c := v_0.Args[1]
28424 x := v_0.Args[0]
28425 d := v_1
28426 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
28427 break
28428 }
28429 v.reset(OpRotateLeft8)
28430 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
28431 v0.AddArg2(c, d)
28432 v.AddArg2(x, v0)
28433 return true
28434 }
28435 return false
28436 }
28437 func rewriteValuegeneric_OpRound32F(v *Value) bool {
28438 v_0 := v.Args[0]
28439
28440
28441 for {
28442 x := v_0
28443 if x.Op != OpConst32F {
28444 break
28445 }
28446 v.copyOf(x)
28447 return true
28448 }
28449 return false
28450 }
28451 func rewriteValuegeneric_OpRound64F(v *Value) bool {
28452 v_0 := v.Args[0]
28453
28454
28455 for {
28456 x := v_0
28457 if x.Op != OpConst64F {
28458 break
28459 }
28460 v.copyOf(x)
28461 return true
28462 }
28463 return false
28464 }
28465 func rewriteValuegeneric_OpRoundToEven(v *Value) bool {
28466 v_0 := v.Args[0]
28467
28468
28469 for {
28470 if v_0.Op != OpConst64F {
28471 break
28472 }
28473 c := auxIntToFloat64(v_0.AuxInt)
28474 v.reset(OpConst64F)
28475 v.AuxInt = float64ToAuxInt(math.RoundToEven(c))
28476 return true
28477 }
28478 return false
28479 }
28480 func rewriteValuegeneric_OpRsh16Ux16(v *Value) bool {
28481 v_1 := v.Args[1]
28482 v_0 := v.Args[0]
28483 b := v.Block
28484
28485
28486 for {
28487 t := v.Type
28488 x := v_0
28489 if v_1.Op != OpConst16 {
28490 break
28491 }
28492 c := auxIntToInt16(v_1.AuxInt)
28493 v.reset(OpRsh16Ux64)
28494 v0 := b.NewValue0(v.Pos, OpConst64, t)
28495 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28496 v.AddArg2(x, v0)
28497 return true
28498 }
28499
28500
28501 for {
28502 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
28503 break
28504 }
28505 v.reset(OpConst16)
28506 v.AuxInt = int16ToAuxInt(0)
28507 return true
28508 }
28509
28510
28511
28512 for {
28513 if auxIntToBool(v.AuxInt) != false {
28514 break
28515 }
28516 x := v_0
28517 con := v_1
28518 if con.Op != OpConst16 {
28519 break
28520 }
28521 c := auxIntToInt16(con.AuxInt)
28522 if !(0 < c && c < 16) {
28523 break
28524 }
28525 v.reset(OpRsh16Ux16)
28526 v.AuxInt = boolToAuxInt(true)
28527 v.AddArg2(x, con)
28528 return true
28529 }
28530 return false
28531 }
28532 func rewriteValuegeneric_OpRsh16Ux32(v *Value) bool {
28533 v_1 := v.Args[1]
28534 v_0 := v.Args[0]
28535 b := v.Block
28536
28537
28538 for {
28539 t := v.Type
28540 x := v_0
28541 if v_1.Op != OpConst32 {
28542 break
28543 }
28544 c := auxIntToInt32(v_1.AuxInt)
28545 v.reset(OpRsh16Ux64)
28546 v0 := b.NewValue0(v.Pos, OpConst64, t)
28547 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
28548 v.AddArg2(x, v0)
28549 return true
28550 }
28551
28552
28553 for {
28554 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
28555 break
28556 }
28557 v.reset(OpConst16)
28558 v.AuxInt = int16ToAuxInt(0)
28559 return true
28560 }
28561
28562
28563
28564 for {
28565 if auxIntToBool(v.AuxInt) != false {
28566 break
28567 }
28568 x := v_0
28569 con := v_1
28570 if con.Op != OpConst32 {
28571 break
28572 }
28573 c := auxIntToInt32(con.AuxInt)
28574 if !(0 < c && c < 16) {
28575 break
28576 }
28577 v.reset(OpRsh16Ux32)
28578 v.AuxInt = boolToAuxInt(true)
28579 v.AddArg2(x, con)
28580 return true
28581 }
28582 return false
28583 }
28584 func rewriteValuegeneric_OpRsh16Ux64(v *Value) bool {
28585 v_1 := v.Args[1]
28586 v_0 := v.Args[0]
28587 b := v.Block
28588 typ := &b.Func.Config.Types
28589
28590
28591 for {
28592 if v_0.Op != OpConst16 {
28593 break
28594 }
28595 c := auxIntToInt16(v_0.AuxInt)
28596 if v_1.Op != OpConst64 {
28597 break
28598 }
28599 d := auxIntToInt64(v_1.AuxInt)
28600 v.reset(OpConst16)
28601 v.AuxInt = int16ToAuxInt(int16(uint16(c) >> uint64(d)))
28602 return true
28603 }
28604
28605
28606 for {
28607 x := v_0
28608 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
28609 break
28610 }
28611 v.copyOf(x)
28612 return true
28613 }
28614
28615
28616 for {
28617 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
28618 break
28619 }
28620 v.reset(OpConst16)
28621 v.AuxInt = int16ToAuxInt(0)
28622 return true
28623 }
28624
28625
28626
28627 for {
28628 if v_1.Op != OpConst64 {
28629 break
28630 }
28631 c := auxIntToInt64(v_1.AuxInt)
28632 if !(uint64(c) >= 16) {
28633 break
28634 }
28635 v.reset(OpConst16)
28636 v.AuxInt = int16ToAuxInt(0)
28637 return true
28638 }
28639
28640
28641
28642 for {
28643 t := v.Type
28644 if v_0.Op != OpRsh16Ux64 {
28645 break
28646 }
28647 _ = v_0.Args[1]
28648 x := v_0.Args[0]
28649 v_0_1 := v_0.Args[1]
28650 if v_0_1.Op != OpConst64 {
28651 break
28652 }
28653 c := auxIntToInt64(v_0_1.AuxInt)
28654 if v_1.Op != OpConst64 {
28655 break
28656 }
28657 d := auxIntToInt64(v_1.AuxInt)
28658 if !(!uaddOvf(c, d)) {
28659 break
28660 }
28661 v.reset(OpRsh16Ux64)
28662 v0 := b.NewValue0(v.Pos, OpConst64, t)
28663 v0.AuxInt = int64ToAuxInt(c + d)
28664 v.AddArg2(x, v0)
28665 return true
28666 }
28667
28668
28669 for {
28670 if v_0.Op != OpRsh16x64 {
28671 break
28672 }
28673 x := v_0.Args[0]
28674 if v_1.Op != OpConst64 {
28675 break
28676 }
28677 t := v_1.Type
28678 if auxIntToInt64(v_1.AuxInt) != 15 {
28679 break
28680 }
28681 v.reset(OpRsh16Ux64)
28682 v0 := b.NewValue0(v.Pos, OpConst64, t)
28683 v0.AuxInt = int64ToAuxInt(15)
28684 v.AddArg2(x, v0)
28685 return true
28686 }
28687
28688
28689
28690 for {
28691 i := v_0
28692 if i.Op != OpLsh16x64 {
28693 break
28694 }
28695 _ = i.Args[1]
28696 x := i.Args[0]
28697 i_1 := i.Args[1]
28698 if i_1.Op != OpConst64 {
28699 break
28700 }
28701 c := auxIntToInt64(i_1.AuxInt)
28702 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
28703 break
28704 }
28705 v.reset(OpAnd16)
28706 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
28707 v0.AuxInt = int16ToAuxInt(int16(^uint16(0) >> c))
28708 v.AddArg2(x, v0)
28709 return true
28710 }
28711
28712
28713
28714 for {
28715 if v_0.Op != OpLsh16x64 {
28716 break
28717 }
28718 _ = v_0.Args[1]
28719 v_0_0 := v_0.Args[0]
28720 if v_0_0.Op != OpRsh16Ux64 {
28721 break
28722 }
28723 _ = v_0_0.Args[1]
28724 x := v_0_0.Args[0]
28725 v_0_0_1 := v_0_0.Args[1]
28726 if v_0_0_1.Op != OpConst64 {
28727 break
28728 }
28729 c1 := auxIntToInt64(v_0_0_1.AuxInt)
28730 v_0_1 := v_0.Args[1]
28731 if v_0_1.Op != OpConst64 {
28732 break
28733 }
28734 c2 := auxIntToInt64(v_0_1.AuxInt)
28735 if v_1.Op != OpConst64 {
28736 break
28737 }
28738 c3 := auxIntToInt64(v_1.AuxInt)
28739 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
28740 break
28741 }
28742 v.reset(OpRsh16Ux64)
28743 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
28744 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
28745 v.AddArg2(x, v0)
28746 return true
28747 }
28748
28749
28750 for {
28751 if v_0.Op != OpLsh16x64 {
28752 break
28753 }
28754 _ = v_0.Args[1]
28755 x := v_0.Args[0]
28756 v_0_1 := v_0.Args[1]
28757 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 8 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 8 {
28758 break
28759 }
28760 v.reset(OpZeroExt8to16)
28761 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.UInt8)
28762 v0.AddArg(x)
28763 v.AddArg(v0)
28764 return true
28765 }
28766
28767
28768
28769 for {
28770 if auxIntToBool(v.AuxInt) != false {
28771 break
28772 }
28773 x := v_0
28774 con := v_1
28775 if con.Op != OpConst64 {
28776 break
28777 }
28778 c := auxIntToInt64(con.AuxInt)
28779 if !(0 < c && c < 16) {
28780 break
28781 }
28782 v.reset(OpRsh16Ux64)
28783 v.AuxInt = boolToAuxInt(true)
28784 v.AddArg2(x, con)
28785 return true
28786 }
28787 return false
28788 }
28789 func rewriteValuegeneric_OpRsh16Ux8(v *Value) bool {
28790 v_1 := v.Args[1]
28791 v_0 := v.Args[0]
28792 b := v.Block
28793
28794
28795 for {
28796 t := v.Type
28797 x := v_0
28798 if v_1.Op != OpConst8 {
28799 break
28800 }
28801 c := auxIntToInt8(v_1.AuxInt)
28802 v.reset(OpRsh16Ux64)
28803 v0 := b.NewValue0(v.Pos, OpConst64, t)
28804 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
28805 v.AddArg2(x, v0)
28806 return true
28807 }
28808
28809
28810 for {
28811 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
28812 break
28813 }
28814 v.reset(OpConst16)
28815 v.AuxInt = int16ToAuxInt(0)
28816 return true
28817 }
28818
28819
28820
28821 for {
28822 if auxIntToBool(v.AuxInt) != false {
28823 break
28824 }
28825 x := v_0
28826 con := v_1
28827 if con.Op != OpConst8 {
28828 break
28829 }
28830 c := auxIntToInt8(con.AuxInt)
28831 if !(0 < c && c < 16) {
28832 break
28833 }
28834 v.reset(OpRsh16Ux8)
28835 v.AuxInt = boolToAuxInt(true)
28836 v.AddArg2(x, con)
28837 return true
28838 }
28839 return false
28840 }
28841 func rewriteValuegeneric_OpRsh16x16(v *Value) bool {
28842 v_1 := v.Args[1]
28843 v_0 := v.Args[0]
28844 b := v.Block
28845
28846
28847 for {
28848 t := v.Type
28849 x := v_0
28850 if v_1.Op != OpConst16 {
28851 break
28852 }
28853 c := auxIntToInt16(v_1.AuxInt)
28854 v.reset(OpRsh16x64)
28855 v0 := b.NewValue0(v.Pos, OpConst64, t)
28856 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28857 v.AddArg2(x, v0)
28858 return true
28859 }
28860
28861
28862 for {
28863 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
28864 break
28865 }
28866 v.reset(OpConst16)
28867 v.AuxInt = int16ToAuxInt(0)
28868 return true
28869 }
28870
28871
28872
28873 for {
28874 if auxIntToBool(v.AuxInt) != false {
28875 break
28876 }
28877 x := v_0
28878 con := v_1
28879 if con.Op != OpConst16 {
28880 break
28881 }
28882 c := auxIntToInt16(con.AuxInt)
28883 if !(0 < c && c < 16) {
28884 break
28885 }
28886 v.reset(OpRsh16x16)
28887 v.AuxInt = boolToAuxInt(true)
28888 v.AddArg2(x, con)
28889 return true
28890 }
28891 return false
28892 }
28893 func rewriteValuegeneric_OpRsh16x32(v *Value) bool {
28894 v_1 := v.Args[1]
28895 v_0 := v.Args[0]
28896 b := v.Block
28897
28898
28899 for {
28900 t := v.Type
28901 x := v_0
28902 if v_1.Op != OpConst32 {
28903 break
28904 }
28905 c := auxIntToInt32(v_1.AuxInt)
28906 v.reset(OpRsh16x64)
28907 v0 := b.NewValue0(v.Pos, OpConst64, t)
28908 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
28909 v.AddArg2(x, v0)
28910 return true
28911 }
28912
28913
28914 for {
28915 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
28916 break
28917 }
28918 v.reset(OpConst16)
28919 v.AuxInt = int16ToAuxInt(0)
28920 return true
28921 }
28922
28923
28924
28925 for {
28926 if auxIntToBool(v.AuxInt) != false {
28927 break
28928 }
28929 x := v_0
28930 con := v_1
28931 if con.Op != OpConst32 {
28932 break
28933 }
28934 c := auxIntToInt32(con.AuxInt)
28935 if !(0 < c && c < 16) {
28936 break
28937 }
28938 v.reset(OpRsh16x32)
28939 v.AuxInt = boolToAuxInt(true)
28940 v.AddArg2(x, con)
28941 return true
28942 }
28943 return false
28944 }
28945 func rewriteValuegeneric_OpRsh16x64(v *Value) bool {
28946 v_1 := v.Args[1]
28947 v_0 := v.Args[0]
28948 b := v.Block
28949 typ := &b.Func.Config.Types
28950
28951
28952 for {
28953 if v_0.Op != OpConst16 {
28954 break
28955 }
28956 c := auxIntToInt16(v_0.AuxInt)
28957 if v_1.Op != OpConst64 {
28958 break
28959 }
28960 d := auxIntToInt64(v_1.AuxInt)
28961 v.reset(OpConst16)
28962 v.AuxInt = int16ToAuxInt(c >> uint64(d))
28963 return true
28964 }
28965
28966
28967 for {
28968 x := v_0
28969 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
28970 break
28971 }
28972 v.copyOf(x)
28973 return true
28974 }
28975
28976
28977 for {
28978 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
28979 break
28980 }
28981 v.reset(OpConst16)
28982 v.AuxInt = int16ToAuxInt(0)
28983 return true
28984 }
28985
28986
28987
28988 for {
28989 t := v.Type
28990 if v_0.Op != OpRsh16x64 {
28991 break
28992 }
28993 _ = v_0.Args[1]
28994 x := v_0.Args[0]
28995 v_0_1 := v_0.Args[1]
28996 if v_0_1.Op != OpConst64 {
28997 break
28998 }
28999 c := auxIntToInt64(v_0_1.AuxInt)
29000 if v_1.Op != OpConst64 {
29001 break
29002 }
29003 d := auxIntToInt64(v_1.AuxInt)
29004 if !(!uaddOvf(c, d)) {
29005 break
29006 }
29007 v.reset(OpRsh16x64)
29008 v0 := b.NewValue0(v.Pos, OpConst64, t)
29009 v0.AuxInt = int64ToAuxInt(c + d)
29010 v.AddArg2(x, v0)
29011 return true
29012 }
29013
29014
29015 for {
29016 if v_0.Op != OpLsh16x64 {
29017 break
29018 }
29019 _ = v_0.Args[1]
29020 x := v_0.Args[0]
29021 v_0_1 := v_0.Args[1]
29022 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 8 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 8 {
29023 break
29024 }
29025 v.reset(OpSignExt8to16)
29026 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.Int8)
29027 v0.AddArg(x)
29028 v.AddArg(v0)
29029 return true
29030 }
29031
29032
29033
29034 for {
29035 if auxIntToBool(v.AuxInt) != false {
29036 break
29037 }
29038 x := v_0
29039 con := v_1
29040 if con.Op != OpConst64 {
29041 break
29042 }
29043 c := auxIntToInt64(con.AuxInt)
29044 if !(0 < c && c < 16) {
29045 break
29046 }
29047 v.reset(OpRsh16x64)
29048 v.AuxInt = boolToAuxInt(true)
29049 v.AddArg2(x, con)
29050 return true
29051 }
29052 return false
29053 }
29054 func rewriteValuegeneric_OpRsh16x8(v *Value) bool {
29055 v_1 := v.Args[1]
29056 v_0 := v.Args[0]
29057 b := v.Block
29058
29059
29060 for {
29061 t := v.Type
29062 x := v_0
29063 if v_1.Op != OpConst8 {
29064 break
29065 }
29066 c := auxIntToInt8(v_1.AuxInt)
29067 v.reset(OpRsh16x64)
29068 v0 := b.NewValue0(v.Pos, OpConst64, t)
29069 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
29070 v.AddArg2(x, v0)
29071 return true
29072 }
29073
29074
29075 for {
29076 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
29077 break
29078 }
29079 v.reset(OpConst16)
29080 v.AuxInt = int16ToAuxInt(0)
29081 return true
29082 }
29083
29084
29085
29086 for {
29087 if auxIntToBool(v.AuxInt) != false {
29088 break
29089 }
29090 x := v_0
29091 con := v_1
29092 if con.Op != OpConst8 {
29093 break
29094 }
29095 c := auxIntToInt8(con.AuxInt)
29096 if !(0 < c && c < 16) {
29097 break
29098 }
29099 v.reset(OpRsh16x8)
29100 v.AuxInt = boolToAuxInt(true)
29101 v.AddArg2(x, con)
29102 return true
29103 }
29104 return false
29105 }
29106 func rewriteValuegeneric_OpRsh32Ux16(v *Value) bool {
29107 v_1 := v.Args[1]
29108 v_0 := v.Args[0]
29109 b := v.Block
29110
29111
29112 for {
29113 t := v.Type
29114 x := v_0
29115 if v_1.Op != OpConst16 {
29116 break
29117 }
29118 c := auxIntToInt16(v_1.AuxInt)
29119 v.reset(OpRsh32Ux64)
29120 v0 := b.NewValue0(v.Pos, OpConst64, t)
29121 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
29122 v.AddArg2(x, v0)
29123 return true
29124 }
29125
29126
29127 for {
29128 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
29129 break
29130 }
29131 v.reset(OpConst32)
29132 v.AuxInt = int32ToAuxInt(0)
29133 return true
29134 }
29135
29136
29137
29138 for {
29139 if auxIntToBool(v.AuxInt) != false {
29140 break
29141 }
29142 x := v_0
29143 con := v_1
29144 if con.Op != OpConst16 {
29145 break
29146 }
29147 c := auxIntToInt16(con.AuxInt)
29148 if !(0 < c && c < 32) {
29149 break
29150 }
29151 v.reset(OpRsh32Ux16)
29152 v.AuxInt = boolToAuxInt(true)
29153 v.AddArg2(x, con)
29154 return true
29155 }
29156 return false
29157 }
29158 func rewriteValuegeneric_OpRsh32Ux32(v *Value) bool {
29159 v_1 := v.Args[1]
29160 v_0 := v.Args[0]
29161 b := v.Block
29162
29163
29164 for {
29165 t := v.Type
29166 x := v_0
29167 if v_1.Op != OpConst32 {
29168 break
29169 }
29170 c := auxIntToInt32(v_1.AuxInt)
29171 v.reset(OpRsh32Ux64)
29172 v0 := b.NewValue0(v.Pos, OpConst64, t)
29173 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
29174 v.AddArg2(x, v0)
29175 return true
29176 }
29177
29178
29179 for {
29180 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
29181 break
29182 }
29183 v.reset(OpConst32)
29184 v.AuxInt = int32ToAuxInt(0)
29185 return true
29186 }
29187
29188
29189
29190 for {
29191 if auxIntToBool(v.AuxInt) != false {
29192 break
29193 }
29194 x := v_0
29195 con := v_1
29196 if con.Op != OpConst32 {
29197 break
29198 }
29199 c := auxIntToInt32(con.AuxInt)
29200 if !(0 < c && c < 32) {
29201 break
29202 }
29203 v.reset(OpRsh32Ux32)
29204 v.AuxInt = boolToAuxInt(true)
29205 v.AddArg2(x, con)
29206 return true
29207 }
29208 return false
29209 }
29210 func rewriteValuegeneric_OpRsh32Ux64(v *Value) bool {
29211 v_1 := v.Args[1]
29212 v_0 := v.Args[0]
29213 b := v.Block
29214 typ := &b.Func.Config.Types
29215
29216
29217 for {
29218 if v_0.Op != OpConst32 {
29219 break
29220 }
29221 c := auxIntToInt32(v_0.AuxInt)
29222 if v_1.Op != OpConst64 {
29223 break
29224 }
29225 d := auxIntToInt64(v_1.AuxInt)
29226 v.reset(OpConst32)
29227 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
29228 return true
29229 }
29230
29231
29232 for {
29233 x := v_0
29234 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
29235 break
29236 }
29237 v.copyOf(x)
29238 return true
29239 }
29240
29241
29242 for {
29243 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
29244 break
29245 }
29246 v.reset(OpConst32)
29247 v.AuxInt = int32ToAuxInt(0)
29248 return true
29249 }
29250
29251
29252
29253 for {
29254 if v_1.Op != OpConst64 {
29255 break
29256 }
29257 c := auxIntToInt64(v_1.AuxInt)
29258 if !(uint64(c) >= 32) {
29259 break
29260 }
29261 v.reset(OpConst32)
29262 v.AuxInt = int32ToAuxInt(0)
29263 return true
29264 }
29265
29266
29267
29268 for {
29269 t := v.Type
29270 if v_0.Op != OpRsh32Ux64 {
29271 break
29272 }
29273 _ = v_0.Args[1]
29274 x := v_0.Args[0]
29275 v_0_1 := v_0.Args[1]
29276 if v_0_1.Op != OpConst64 {
29277 break
29278 }
29279 c := auxIntToInt64(v_0_1.AuxInt)
29280 if v_1.Op != OpConst64 {
29281 break
29282 }
29283 d := auxIntToInt64(v_1.AuxInt)
29284 if !(!uaddOvf(c, d)) {
29285 break
29286 }
29287 v.reset(OpRsh32Ux64)
29288 v0 := b.NewValue0(v.Pos, OpConst64, t)
29289 v0.AuxInt = int64ToAuxInt(c + d)
29290 v.AddArg2(x, v0)
29291 return true
29292 }
29293
29294
29295 for {
29296 if v_0.Op != OpRsh32x64 {
29297 break
29298 }
29299 x := v_0.Args[0]
29300 if v_1.Op != OpConst64 {
29301 break
29302 }
29303 t := v_1.Type
29304 if auxIntToInt64(v_1.AuxInt) != 31 {
29305 break
29306 }
29307 v.reset(OpRsh32Ux64)
29308 v0 := b.NewValue0(v.Pos, OpConst64, t)
29309 v0.AuxInt = int64ToAuxInt(31)
29310 v.AddArg2(x, v0)
29311 return true
29312 }
29313
29314
29315
29316 for {
29317 i := v_0
29318 if i.Op != OpLsh32x64 {
29319 break
29320 }
29321 _ = i.Args[1]
29322 x := i.Args[0]
29323 i_1 := i.Args[1]
29324 if i_1.Op != OpConst64 {
29325 break
29326 }
29327 c := auxIntToInt64(i_1.AuxInt)
29328 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
29329 break
29330 }
29331 v.reset(OpAnd32)
29332 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
29333 v0.AuxInt = int32ToAuxInt(int32(^uint32(0) >> c))
29334 v.AddArg2(x, v0)
29335 return true
29336 }
29337
29338
29339
29340 for {
29341 if v_0.Op != OpLsh32x64 {
29342 break
29343 }
29344 _ = v_0.Args[1]
29345 v_0_0 := v_0.Args[0]
29346 if v_0_0.Op != OpRsh32Ux64 {
29347 break
29348 }
29349 _ = v_0_0.Args[1]
29350 x := v_0_0.Args[0]
29351 v_0_0_1 := v_0_0.Args[1]
29352 if v_0_0_1.Op != OpConst64 {
29353 break
29354 }
29355 c1 := auxIntToInt64(v_0_0_1.AuxInt)
29356 v_0_1 := v_0.Args[1]
29357 if v_0_1.Op != OpConst64 {
29358 break
29359 }
29360 c2 := auxIntToInt64(v_0_1.AuxInt)
29361 if v_1.Op != OpConst64 {
29362 break
29363 }
29364 c3 := auxIntToInt64(v_1.AuxInt)
29365 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
29366 break
29367 }
29368 v.reset(OpRsh32Ux64)
29369 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
29370 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
29371 v.AddArg2(x, v0)
29372 return true
29373 }
29374
29375
29376 for {
29377 if v_0.Op != OpLsh32x64 {
29378 break
29379 }
29380 _ = v_0.Args[1]
29381 x := v_0.Args[0]
29382 v_0_1 := v_0.Args[1]
29383 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 24 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 24 {
29384 break
29385 }
29386 v.reset(OpZeroExt8to32)
29387 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.UInt8)
29388 v0.AddArg(x)
29389 v.AddArg(v0)
29390 return true
29391 }
29392
29393
29394 for {
29395 if v_0.Op != OpLsh32x64 {
29396 break
29397 }
29398 _ = v_0.Args[1]
29399 x := v_0.Args[0]
29400 v_0_1 := v_0.Args[1]
29401 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 16 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 16 {
29402 break
29403 }
29404 v.reset(OpZeroExt16to32)
29405 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.UInt16)
29406 v0.AddArg(x)
29407 v.AddArg(v0)
29408 return true
29409 }
29410
29411
29412
29413 for {
29414 if auxIntToBool(v.AuxInt) != false {
29415 break
29416 }
29417 x := v_0
29418 con := v_1
29419 if con.Op != OpConst64 {
29420 break
29421 }
29422 c := auxIntToInt64(con.AuxInt)
29423 if !(0 < c && c < 32) {
29424 break
29425 }
29426 v.reset(OpRsh32Ux64)
29427 v.AuxInt = boolToAuxInt(true)
29428 v.AddArg2(x, con)
29429 return true
29430 }
29431 return false
29432 }
29433 func rewriteValuegeneric_OpRsh32Ux8(v *Value) bool {
29434 v_1 := v.Args[1]
29435 v_0 := v.Args[0]
29436 b := v.Block
29437
29438
29439 for {
29440 t := v.Type
29441 x := v_0
29442 if v_1.Op != OpConst8 {
29443 break
29444 }
29445 c := auxIntToInt8(v_1.AuxInt)
29446 v.reset(OpRsh32Ux64)
29447 v0 := b.NewValue0(v.Pos, OpConst64, t)
29448 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
29449 v.AddArg2(x, v0)
29450 return true
29451 }
29452
29453
29454 for {
29455 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
29456 break
29457 }
29458 v.reset(OpConst32)
29459 v.AuxInt = int32ToAuxInt(0)
29460 return true
29461 }
29462
29463
29464
29465 for {
29466 if auxIntToBool(v.AuxInt) != false {
29467 break
29468 }
29469 x := v_0
29470 con := v_1
29471 if con.Op != OpConst8 {
29472 break
29473 }
29474 c := auxIntToInt8(con.AuxInt)
29475 if !(0 < c && c < 32) {
29476 break
29477 }
29478 v.reset(OpRsh32Ux8)
29479 v.AuxInt = boolToAuxInt(true)
29480 v.AddArg2(x, con)
29481 return true
29482 }
29483 return false
29484 }
29485 func rewriteValuegeneric_OpRsh32x16(v *Value) bool {
29486 v_1 := v.Args[1]
29487 v_0 := v.Args[0]
29488 b := v.Block
29489
29490
29491 for {
29492 t := v.Type
29493 x := v_0
29494 if v_1.Op != OpConst16 {
29495 break
29496 }
29497 c := auxIntToInt16(v_1.AuxInt)
29498 v.reset(OpRsh32x64)
29499 v0 := b.NewValue0(v.Pos, OpConst64, t)
29500 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
29501 v.AddArg2(x, v0)
29502 return true
29503 }
29504
29505
29506 for {
29507 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
29508 break
29509 }
29510 v.reset(OpConst32)
29511 v.AuxInt = int32ToAuxInt(0)
29512 return true
29513 }
29514
29515
29516
29517 for {
29518 if auxIntToBool(v.AuxInt) != false {
29519 break
29520 }
29521 x := v_0
29522 con := v_1
29523 if con.Op != OpConst16 {
29524 break
29525 }
29526 c := auxIntToInt16(con.AuxInt)
29527 if !(0 < c && c < 32) {
29528 break
29529 }
29530 v.reset(OpRsh32x16)
29531 v.AuxInt = boolToAuxInt(true)
29532 v.AddArg2(x, con)
29533 return true
29534 }
29535 return false
29536 }
29537 func rewriteValuegeneric_OpRsh32x32(v *Value) bool {
29538 v_1 := v.Args[1]
29539 v_0 := v.Args[0]
29540 b := v.Block
29541
29542
29543 for {
29544 t := v.Type
29545 x := v_0
29546 if v_1.Op != OpConst32 {
29547 break
29548 }
29549 c := auxIntToInt32(v_1.AuxInt)
29550 v.reset(OpRsh32x64)
29551 v0 := b.NewValue0(v.Pos, OpConst64, t)
29552 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
29553 v.AddArg2(x, v0)
29554 return true
29555 }
29556
29557
29558 for {
29559 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
29560 break
29561 }
29562 v.reset(OpConst32)
29563 v.AuxInt = int32ToAuxInt(0)
29564 return true
29565 }
29566
29567
29568
29569 for {
29570 if auxIntToBool(v.AuxInt) != false {
29571 break
29572 }
29573 x := v_0
29574 con := v_1
29575 if con.Op != OpConst32 {
29576 break
29577 }
29578 c := auxIntToInt32(con.AuxInt)
29579 if !(0 < c && c < 32) {
29580 break
29581 }
29582 v.reset(OpRsh32x32)
29583 v.AuxInt = boolToAuxInt(true)
29584 v.AddArg2(x, con)
29585 return true
29586 }
29587 return false
29588 }
29589 func rewriteValuegeneric_OpRsh32x64(v *Value) bool {
29590 v_1 := v.Args[1]
29591 v_0 := v.Args[0]
29592 b := v.Block
29593 typ := &b.Func.Config.Types
29594
29595
29596 for {
29597 if v_0.Op != OpConst32 {
29598 break
29599 }
29600 c := auxIntToInt32(v_0.AuxInt)
29601 if v_1.Op != OpConst64 {
29602 break
29603 }
29604 d := auxIntToInt64(v_1.AuxInt)
29605 v.reset(OpConst32)
29606 v.AuxInt = int32ToAuxInt(c >> uint64(d))
29607 return true
29608 }
29609
29610
29611 for {
29612 x := v_0
29613 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
29614 break
29615 }
29616 v.copyOf(x)
29617 return true
29618 }
29619
29620
29621 for {
29622 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
29623 break
29624 }
29625 v.reset(OpConst32)
29626 v.AuxInt = int32ToAuxInt(0)
29627 return true
29628 }
29629
29630
29631
29632 for {
29633 t := v.Type
29634 if v_0.Op != OpRsh32x64 {
29635 break
29636 }
29637 _ = v_0.Args[1]
29638 x := v_0.Args[0]
29639 v_0_1 := v_0.Args[1]
29640 if v_0_1.Op != OpConst64 {
29641 break
29642 }
29643 c := auxIntToInt64(v_0_1.AuxInt)
29644 if v_1.Op != OpConst64 {
29645 break
29646 }
29647 d := auxIntToInt64(v_1.AuxInt)
29648 if !(!uaddOvf(c, d)) {
29649 break
29650 }
29651 v.reset(OpRsh32x64)
29652 v0 := b.NewValue0(v.Pos, OpConst64, t)
29653 v0.AuxInt = int64ToAuxInt(c + d)
29654 v.AddArg2(x, v0)
29655 return true
29656 }
29657
29658
29659 for {
29660 if v_0.Op != OpLsh32x64 {
29661 break
29662 }
29663 _ = v_0.Args[1]
29664 x := v_0.Args[0]
29665 v_0_1 := v_0.Args[1]
29666 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 24 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 24 {
29667 break
29668 }
29669 v.reset(OpSignExt8to32)
29670 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.Int8)
29671 v0.AddArg(x)
29672 v.AddArg(v0)
29673 return true
29674 }
29675
29676
29677 for {
29678 if v_0.Op != OpLsh32x64 {
29679 break
29680 }
29681 _ = v_0.Args[1]
29682 x := v_0.Args[0]
29683 v_0_1 := v_0.Args[1]
29684 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 16 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 16 {
29685 break
29686 }
29687 v.reset(OpSignExt16to32)
29688 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.Int16)
29689 v0.AddArg(x)
29690 v.AddArg(v0)
29691 return true
29692 }
29693
29694
29695
29696 for {
29697 if auxIntToBool(v.AuxInt) != false {
29698 break
29699 }
29700 x := v_0
29701 con := v_1
29702 if con.Op != OpConst64 {
29703 break
29704 }
29705 c := auxIntToInt64(con.AuxInt)
29706 if !(0 < c && c < 32) {
29707 break
29708 }
29709 v.reset(OpRsh32x64)
29710 v.AuxInt = boolToAuxInt(true)
29711 v.AddArg2(x, con)
29712 return true
29713 }
29714 return false
29715 }
29716 func rewriteValuegeneric_OpRsh32x8(v *Value) bool {
29717 v_1 := v.Args[1]
29718 v_0 := v.Args[0]
29719 b := v.Block
29720
29721
29722 for {
29723 t := v.Type
29724 x := v_0
29725 if v_1.Op != OpConst8 {
29726 break
29727 }
29728 c := auxIntToInt8(v_1.AuxInt)
29729 v.reset(OpRsh32x64)
29730 v0 := b.NewValue0(v.Pos, OpConst64, t)
29731 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
29732 v.AddArg2(x, v0)
29733 return true
29734 }
29735
29736
29737 for {
29738 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
29739 break
29740 }
29741 v.reset(OpConst32)
29742 v.AuxInt = int32ToAuxInt(0)
29743 return true
29744 }
29745
29746
29747
29748 for {
29749 if auxIntToBool(v.AuxInt) != false {
29750 break
29751 }
29752 x := v_0
29753 con := v_1
29754 if con.Op != OpConst8 {
29755 break
29756 }
29757 c := auxIntToInt8(con.AuxInt)
29758 if !(0 < c && c < 32) {
29759 break
29760 }
29761 v.reset(OpRsh32x8)
29762 v.AuxInt = boolToAuxInt(true)
29763 v.AddArg2(x, con)
29764 return true
29765 }
29766 return false
29767 }
29768 func rewriteValuegeneric_OpRsh64Ux16(v *Value) bool {
29769 v_1 := v.Args[1]
29770 v_0 := v.Args[0]
29771 b := v.Block
29772
29773
29774 for {
29775 t := v.Type
29776 x := v_0
29777 if v_1.Op != OpConst16 {
29778 break
29779 }
29780 c := auxIntToInt16(v_1.AuxInt)
29781 v.reset(OpRsh64Ux64)
29782 v0 := b.NewValue0(v.Pos, OpConst64, t)
29783 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
29784 v.AddArg2(x, v0)
29785 return true
29786 }
29787
29788
29789 for {
29790 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29791 break
29792 }
29793 v.reset(OpConst64)
29794 v.AuxInt = int64ToAuxInt(0)
29795 return true
29796 }
29797
29798
29799
29800 for {
29801 if auxIntToBool(v.AuxInt) != false {
29802 break
29803 }
29804 x := v_0
29805 con := v_1
29806 if con.Op != OpConst16 {
29807 break
29808 }
29809 c := auxIntToInt16(con.AuxInt)
29810 if !(0 < c && c < 64) {
29811 break
29812 }
29813 v.reset(OpRsh64Ux16)
29814 v.AuxInt = boolToAuxInt(true)
29815 v.AddArg2(x, con)
29816 return true
29817 }
29818 return false
29819 }
29820 func rewriteValuegeneric_OpRsh64Ux32(v *Value) bool {
29821 v_1 := v.Args[1]
29822 v_0 := v.Args[0]
29823 b := v.Block
29824
29825
29826 for {
29827 t := v.Type
29828 x := v_0
29829 if v_1.Op != OpConst32 {
29830 break
29831 }
29832 c := auxIntToInt32(v_1.AuxInt)
29833 v.reset(OpRsh64Ux64)
29834 v0 := b.NewValue0(v.Pos, OpConst64, t)
29835 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
29836 v.AddArg2(x, v0)
29837 return true
29838 }
29839
29840
29841 for {
29842 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29843 break
29844 }
29845 v.reset(OpConst64)
29846 v.AuxInt = int64ToAuxInt(0)
29847 return true
29848 }
29849
29850
29851
29852 for {
29853 if auxIntToBool(v.AuxInt) != false {
29854 break
29855 }
29856 x := v_0
29857 con := v_1
29858 if con.Op != OpConst32 {
29859 break
29860 }
29861 c := auxIntToInt32(con.AuxInt)
29862 if !(0 < c && c < 64) {
29863 break
29864 }
29865 v.reset(OpRsh64Ux32)
29866 v.AuxInt = boolToAuxInt(true)
29867 v.AddArg2(x, con)
29868 return true
29869 }
29870 return false
29871 }
29872 func rewriteValuegeneric_OpRsh64Ux64(v *Value) bool {
29873 v_1 := v.Args[1]
29874 v_0 := v.Args[0]
29875 b := v.Block
29876 typ := &b.Func.Config.Types
29877
29878
29879 for {
29880 if v_0.Op != OpConst64 {
29881 break
29882 }
29883 c := auxIntToInt64(v_0.AuxInt)
29884 if v_1.Op != OpConst64 {
29885 break
29886 }
29887 d := auxIntToInt64(v_1.AuxInt)
29888 v.reset(OpConst64)
29889 v.AuxInt = int64ToAuxInt(int64(uint64(c) >> uint64(d)))
29890 return true
29891 }
29892
29893
29894 for {
29895 x := v_0
29896 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
29897 break
29898 }
29899 v.copyOf(x)
29900 return true
29901 }
29902
29903
29904 for {
29905 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29906 break
29907 }
29908 v.reset(OpConst64)
29909 v.AuxInt = int64ToAuxInt(0)
29910 return true
29911 }
29912
29913
29914
29915 for {
29916 if v_1.Op != OpConst64 {
29917 break
29918 }
29919 c := auxIntToInt64(v_1.AuxInt)
29920 if !(uint64(c) >= 64) {
29921 break
29922 }
29923 v.reset(OpConst64)
29924 v.AuxInt = int64ToAuxInt(0)
29925 return true
29926 }
29927
29928
29929
29930 for {
29931 t := v.Type
29932 if v_0.Op != OpRsh64Ux64 {
29933 break
29934 }
29935 _ = v_0.Args[1]
29936 x := v_0.Args[0]
29937 v_0_1 := v_0.Args[1]
29938 if v_0_1.Op != OpConst64 {
29939 break
29940 }
29941 c := auxIntToInt64(v_0_1.AuxInt)
29942 if v_1.Op != OpConst64 {
29943 break
29944 }
29945 d := auxIntToInt64(v_1.AuxInt)
29946 if !(!uaddOvf(c, d)) {
29947 break
29948 }
29949 v.reset(OpRsh64Ux64)
29950 v0 := b.NewValue0(v.Pos, OpConst64, t)
29951 v0.AuxInt = int64ToAuxInt(c + d)
29952 v.AddArg2(x, v0)
29953 return true
29954 }
29955
29956
29957 for {
29958 if v_0.Op != OpRsh64x64 {
29959 break
29960 }
29961 x := v_0.Args[0]
29962 if v_1.Op != OpConst64 {
29963 break
29964 }
29965 t := v_1.Type
29966 if auxIntToInt64(v_1.AuxInt) != 63 {
29967 break
29968 }
29969 v.reset(OpRsh64Ux64)
29970 v0 := b.NewValue0(v.Pos, OpConst64, t)
29971 v0.AuxInt = int64ToAuxInt(63)
29972 v.AddArg2(x, v0)
29973 return true
29974 }
29975
29976
29977
29978 for {
29979 i := v_0
29980 if i.Op != OpLsh64x64 {
29981 break
29982 }
29983 _ = i.Args[1]
29984 x := i.Args[0]
29985 i_1 := i.Args[1]
29986 if i_1.Op != OpConst64 {
29987 break
29988 }
29989 c := auxIntToInt64(i_1.AuxInt)
29990 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
29991 break
29992 }
29993 v.reset(OpAnd64)
29994 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
29995 v0.AuxInt = int64ToAuxInt(int64(^uint64(0) >> c))
29996 v.AddArg2(x, v0)
29997 return true
29998 }
29999
30000
30001
30002 for {
30003 if v_0.Op != OpLsh64x64 {
30004 break
30005 }
30006 _ = v_0.Args[1]
30007 v_0_0 := v_0.Args[0]
30008 if v_0_0.Op != OpRsh64Ux64 {
30009 break
30010 }
30011 _ = v_0_0.Args[1]
30012 x := v_0_0.Args[0]
30013 v_0_0_1 := v_0_0.Args[1]
30014 if v_0_0_1.Op != OpConst64 {
30015 break
30016 }
30017 c1 := auxIntToInt64(v_0_0_1.AuxInt)
30018 v_0_1 := v_0.Args[1]
30019 if v_0_1.Op != OpConst64 {
30020 break
30021 }
30022 c2 := auxIntToInt64(v_0_1.AuxInt)
30023 if v_1.Op != OpConst64 {
30024 break
30025 }
30026 c3 := auxIntToInt64(v_1.AuxInt)
30027 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
30028 break
30029 }
30030 v.reset(OpRsh64Ux64)
30031 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
30032 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
30033 v.AddArg2(x, v0)
30034 return true
30035 }
30036
30037
30038 for {
30039 if v_0.Op != OpLsh64x64 {
30040 break
30041 }
30042 _ = v_0.Args[1]
30043 x := v_0.Args[0]
30044 v_0_1 := v_0.Args[1]
30045 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 56 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 56 {
30046 break
30047 }
30048 v.reset(OpZeroExt8to64)
30049 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.UInt8)
30050 v0.AddArg(x)
30051 v.AddArg(v0)
30052 return true
30053 }
30054
30055
30056 for {
30057 if v_0.Op != OpLsh64x64 {
30058 break
30059 }
30060 _ = v_0.Args[1]
30061 x := v_0.Args[0]
30062 v_0_1 := v_0.Args[1]
30063 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 48 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 48 {
30064 break
30065 }
30066 v.reset(OpZeroExt16to64)
30067 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.UInt16)
30068 v0.AddArg(x)
30069 v.AddArg(v0)
30070 return true
30071 }
30072
30073
30074 for {
30075 if v_0.Op != OpLsh64x64 {
30076 break
30077 }
30078 _ = v_0.Args[1]
30079 x := v_0.Args[0]
30080 v_0_1 := v_0.Args[1]
30081 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 32 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 32 {
30082 break
30083 }
30084 v.reset(OpZeroExt32to64)
30085 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.UInt32)
30086 v0.AddArg(x)
30087 v.AddArg(v0)
30088 return true
30089 }
30090
30091
30092
30093 for {
30094 if auxIntToBool(v.AuxInt) != false {
30095 break
30096 }
30097 x := v_0
30098 con := v_1
30099 if con.Op != OpConst64 {
30100 break
30101 }
30102 c := auxIntToInt64(con.AuxInt)
30103 if !(0 < c && c < 64) {
30104 break
30105 }
30106 v.reset(OpRsh64Ux64)
30107 v.AuxInt = boolToAuxInt(true)
30108 v.AddArg2(x, con)
30109 return true
30110 }
30111 return false
30112 }
30113 func rewriteValuegeneric_OpRsh64Ux8(v *Value) bool {
30114 v_1 := v.Args[1]
30115 v_0 := v.Args[0]
30116 b := v.Block
30117
30118
30119 for {
30120 t := v.Type
30121 x := v_0
30122 if v_1.Op != OpConst8 {
30123 break
30124 }
30125 c := auxIntToInt8(v_1.AuxInt)
30126 v.reset(OpRsh64Ux64)
30127 v0 := b.NewValue0(v.Pos, OpConst64, t)
30128 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
30129 v.AddArg2(x, v0)
30130 return true
30131 }
30132
30133
30134 for {
30135 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
30136 break
30137 }
30138 v.reset(OpConst64)
30139 v.AuxInt = int64ToAuxInt(0)
30140 return true
30141 }
30142
30143
30144
30145 for {
30146 if auxIntToBool(v.AuxInt) != false {
30147 break
30148 }
30149 x := v_0
30150 con := v_1
30151 if con.Op != OpConst8 {
30152 break
30153 }
30154 c := auxIntToInt8(con.AuxInt)
30155 if !(0 < c && c < 64) {
30156 break
30157 }
30158 v.reset(OpRsh64Ux8)
30159 v.AuxInt = boolToAuxInt(true)
30160 v.AddArg2(x, con)
30161 return true
30162 }
30163 return false
30164 }
30165 func rewriteValuegeneric_OpRsh64x16(v *Value) bool {
30166 v_1 := v.Args[1]
30167 v_0 := v.Args[0]
30168 b := v.Block
30169
30170
30171 for {
30172 t := v.Type
30173 x := v_0
30174 if v_1.Op != OpConst16 {
30175 break
30176 }
30177 c := auxIntToInt16(v_1.AuxInt)
30178 v.reset(OpRsh64x64)
30179 v0 := b.NewValue0(v.Pos, OpConst64, t)
30180 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
30181 v.AddArg2(x, v0)
30182 return true
30183 }
30184
30185
30186 for {
30187 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
30188 break
30189 }
30190 v.reset(OpConst64)
30191 v.AuxInt = int64ToAuxInt(0)
30192 return true
30193 }
30194
30195
30196
30197 for {
30198 if auxIntToBool(v.AuxInt) != false {
30199 break
30200 }
30201 x := v_0
30202 con := v_1
30203 if con.Op != OpConst16 {
30204 break
30205 }
30206 c := auxIntToInt16(con.AuxInt)
30207 if !(0 < c && c < 64) {
30208 break
30209 }
30210 v.reset(OpRsh64x16)
30211 v.AuxInt = boolToAuxInt(true)
30212 v.AddArg2(x, con)
30213 return true
30214 }
30215 return false
30216 }
30217 func rewriteValuegeneric_OpRsh64x32(v *Value) bool {
30218 v_1 := v.Args[1]
30219 v_0 := v.Args[0]
30220 b := v.Block
30221
30222
30223 for {
30224 t := v.Type
30225 x := v_0
30226 if v_1.Op != OpConst32 {
30227 break
30228 }
30229 c := auxIntToInt32(v_1.AuxInt)
30230 v.reset(OpRsh64x64)
30231 v0 := b.NewValue0(v.Pos, OpConst64, t)
30232 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
30233 v.AddArg2(x, v0)
30234 return true
30235 }
30236
30237
30238 for {
30239 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
30240 break
30241 }
30242 v.reset(OpConst64)
30243 v.AuxInt = int64ToAuxInt(0)
30244 return true
30245 }
30246
30247
30248
30249 for {
30250 if auxIntToBool(v.AuxInt) != false {
30251 break
30252 }
30253 x := v_0
30254 con := v_1
30255 if con.Op != OpConst32 {
30256 break
30257 }
30258 c := auxIntToInt32(con.AuxInt)
30259 if !(0 < c && c < 64) {
30260 break
30261 }
30262 v.reset(OpRsh64x32)
30263 v.AuxInt = boolToAuxInt(true)
30264 v.AddArg2(x, con)
30265 return true
30266 }
30267 return false
30268 }
30269 func rewriteValuegeneric_OpRsh64x64(v *Value) bool {
30270 v_1 := v.Args[1]
30271 v_0 := v.Args[0]
30272 b := v.Block
30273 typ := &b.Func.Config.Types
30274
30275
30276 for {
30277 if v_0.Op != OpConst64 {
30278 break
30279 }
30280 c := auxIntToInt64(v_0.AuxInt)
30281 if v_1.Op != OpConst64 {
30282 break
30283 }
30284 d := auxIntToInt64(v_1.AuxInt)
30285 v.reset(OpConst64)
30286 v.AuxInt = int64ToAuxInt(c >> uint64(d))
30287 return true
30288 }
30289
30290
30291 for {
30292 x := v_0
30293 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
30294 break
30295 }
30296 v.copyOf(x)
30297 return true
30298 }
30299
30300
30301 for {
30302 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
30303 break
30304 }
30305 v.reset(OpConst64)
30306 v.AuxInt = int64ToAuxInt(0)
30307 return true
30308 }
30309
30310
30311
30312 for {
30313 t := v.Type
30314 if v_0.Op != OpRsh64x64 {
30315 break
30316 }
30317 _ = v_0.Args[1]
30318 x := v_0.Args[0]
30319 v_0_1 := v_0.Args[1]
30320 if v_0_1.Op != OpConst64 {
30321 break
30322 }
30323 c := auxIntToInt64(v_0_1.AuxInt)
30324 if v_1.Op != OpConst64 {
30325 break
30326 }
30327 d := auxIntToInt64(v_1.AuxInt)
30328 if !(!uaddOvf(c, d)) {
30329 break
30330 }
30331 v.reset(OpRsh64x64)
30332 v0 := b.NewValue0(v.Pos, OpConst64, t)
30333 v0.AuxInt = int64ToAuxInt(c + d)
30334 v.AddArg2(x, v0)
30335 return true
30336 }
30337
30338
30339 for {
30340 if v_0.Op != OpLsh64x64 {
30341 break
30342 }
30343 _ = v_0.Args[1]
30344 x := v_0.Args[0]
30345 v_0_1 := v_0.Args[1]
30346 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 56 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 56 {
30347 break
30348 }
30349 v.reset(OpSignExt8to64)
30350 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.Int8)
30351 v0.AddArg(x)
30352 v.AddArg(v0)
30353 return true
30354 }
30355
30356
30357 for {
30358 if v_0.Op != OpLsh64x64 {
30359 break
30360 }
30361 _ = v_0.Args[1]
30362 x := v_0.Args[0]
30363 v_0_1 := v_0.Args[1]
30364 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 48 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 48 {
30365 break
30366 }
30367 v.reset(OpSignExt16to64)
30368 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.Int16)
30369 v0.AddArg(x)
30370 v.AddArg(v0)
30371 return true
30372 }
30373
30374
30375 for {
30376 if v_0.Op != OpLsh64x64 {
30377 break
30378 }
30379 _ = v_0.Args[1]
30380 x := v_0.Args[0]
30381 v_0_1 := v_0.Args[1]
30382 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 32 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 32 {
30383 break
30384 }
30385 v.reset(OpSignExt32to64)
30386 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.Int32)
30387 v0.AddArg(x)
30388 v.AddArg(v0)
30389 return true
30390 }
30391
30392
30393
30394 for {
30395 if auxIntToBool(v.AuxInt) != false {
30396 break
30397 }
30398 x := v_0
30399 con := v_1
30400 if con.Op != OpConst64 {
30401 break
30402 }
30403 c := auxIntToInt64(con.AuxInt)
30404 if !(0 < c && c < 64) {
30405 break
30406 }
30407 v.reset(OpRsh64x64)
30408 v.AuxInt = boolToAuxInt(true)
30409 v.AddArg2(x, con)
30410 return true
30411 }
30412 return false
30413 }
30414 func rewriteValuegeneric_OpRsh64x8(v *Value) bool {
30415 v_1 := v.Args[1]
30416 v_0 := v.Args[0]
30417 b := v.Block
30418
30419
30420 for {
30421 t := v.Type
30422 x := v_0
30423 if v_1.Op != OpConst8 {
30424 break
30425 }
30426 c := auxIntToInt8(v_1.AuxInt)
30427 v.reset(OpRsh64x64)
30428 v0 := b.NewValue0(v.Pos, OpConst64, t)
30429 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
30430 v.AddArg2(x, v0)
30431 return true
30432 }
30433
30434
30435 for {
30436 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
30437 break
30438 }
30439 v.reset(OpConst64)
30440 v.AuxInt = int64ToAuxInt(0)
30441 return true
30442 }
30443
30444
30445
30446 for {
30447 if auxIntToBool(v.AuxInt) != false {
30448 break
30449 }
30450 x := v_0
30451 con := v_1
30452 if con.Op != OpConst8 {
30453 break
30454 }
30455 c := auxIntToInt8(con.AuxInt)
30456 if !(0 < c && c < 64) {
30457 break
30458 }
30459 v.reset(OpRsh64x8)
30460 v.AuxInt = boolToAuxInt(true)
30461 v.AddArg2(x, con)
30462 return true
30463 }
30464 return false
30465 }
30466 func rewriteValuegeneric_OpRsh8Ux16(v *Value) bool {
30467 v_1 := v.Args[1]
30468 v_0 := v.Args[0]
30469 b := v.Block
30470
30471
30472 for {
30473 t := v.Type
30474 x := v_0
30475 if v_1.Op != OpConst16 {
30476 break
30477 }
30478 c := auxIntToInt16(v_1.AuxInt)
30479 v.reset(OpRsh8Ux64)
30480 v0 := b.NewValue0(v.Pos, OpConst64, t)
30481 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
30482 v.AddArg2(x, v0)
30483 return true
30484 }
30485
30486
30487 for {
30488 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
30489 break
30490 }
30491 v.reset(OpConst8)
30492 v.AuxInt = int8ToAuxInt(0)
30493 return true
30494 }
30495
30496
30497
30498 for {
30499 if auxIntToBool(v.AuxInt) != false {
30500 break
30501 }
30502 x := v_0
30503 con := v_1
30504 if con.Op != OpConst16 {
30505 break
30506 }
30507 c := auxIntToInt16(con.AuxInt)
30508 if !(0 < c && c < 8) {
30509 break
30510 }
30511 v.reset(OpRsh8Ux16)
30512 v.AuxInt = boolToAuxInt(true)
30513 v.AddArg2(x, con)
30514 return true
30515 }
30516 return false
30517 }
30518 func rewriteValuegeneric_OpRsh8Ux32(v *Value) bool {
30519 v_1 := v.Args[1]
30520 v_0 := v.Args[0]
30521 b := v.Block
30522
30523
30524 for {
30525 t := v.Type
30526 x := v_0
30527 if v_1.Op != OpConst32 {
30528 break
30529 }
30530 c := auxIntToInt32(v_1.AuxInt)
30531 v.reset(OpRsh8Ux64)
30532 v0 := b.NewValue0(v.Pos, OpConst64, t)
30533 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
30534 v.AddArg2(x, v0)
30535 return true
30536 }
30537
30538
30539 for {
30540 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
30541 break
30542 }
30543 v.reset(OpConst8)
30544 v.AuxInt = int8ToAuxInt(0)
30545 return true
30546 }
30547
30548
30549
30550 for {
30551 if auxIntToBool(v.AuxInt) != false {
30552 break
30553 }
30554 x := v_0
30555 con := v_1
30556 if con.Op != OpConst32 {
30557 break
30558 }
30559 c := auxIntToInt32(con.AuxInt)
30560 if !(0 < c && c < 8) {
30561 break
30562 }
30563 v.reset(OpRsh8Ux32)
30564 v.AuxInt = boolToAuxInt(true)
30565 v.AddArg2(x, con)
30566 return true
30567 }
30568 return false
30569 }
30570 func rewriteValuegeneric_OpRsh8Ux64(v *Value) bool {
30571 v_1 := v.Args[1]
30572 v_0 := v.Args[0]
30573 b := v.Block
30574 typ := &b.Func.Config.Types
30575
30576
30577 for {
30578 if v_0.Op != OpConst8 {
30579 break
30580 }
30581 c := auxIntToInt8(v_0.AuxInt)
30582 if v_1.Op != OpConst64 {
30583 break
30584 }
30585 d := auxIntToInt64(v_1.AuxInt)
30586 v.reset(OpConst8)
30587 v.AuxInt = int8ToAuxInt(int8(uint8(c) >> uint64(d)))
30588 return true
30589 }
30590
30591
30592 for {
30593 x := v_0
30594 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
30595 break
30596 }
30597 v.copyOf(x)
30598 return true
30599 }
30600
30601
30602 for {
30603 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
30604 break
30605 }
30606 v.reset(OpConst8)
30607 v.AuxInt = int8ToAuxInt(0)
30608 return true
30609 }
30610
30611
30612
30613 for {
30614 if v_1.Op != OpConst64 {
30615 break
30616 }
30617 c := auxIntToInt64(v_1.AuxInt)
30618 if !(uint64(c) >= 8) {
30619 break
30620 }
30621 v.reset(OpConst8)
30622 v.AuxInt = int8ToAuxInt(0)
30623 return true
30624 }
30625
30626
30627
30628 for {
30629 t := v.Type
30630 if v_0.Op != OpRsh8Ux64 {
30631 break
30632 }
30633 _ = v_0.Args[1]
30634 x := v_0.Args[0]
30635 v_0_1 := v_0.Args[1]
30636 if v_0_1.Op != OpConst64 {
30637 break
30638 }
30639 c := auxIntToInt64(v_0_1.AuxInt)
30640 if v_1.Op != OpConst64 {
30641 break
30642 }
30643 d := auxIntToInt64(v_1.AuxInt)
30644 if !(!uaddOvf(c, d)) {
30645 break
30646 }
30647 v.reset(OpRsh8Ux64)
30648 v0 := b.NewValue0(v.Pos, OpConst64, t)
30649 v0.AuxInt = int64ToAuxInt(c + d)
30650 v.AddArg2(x, v0)
30651 return true
30652 }
30653
30654
30655 for {
30656 if v_0.Op != OpRsh8x64 {
30657 break
30658 }
30659 x := v_0.Args[0]
30660 if v_1.Op != OpConst64 {
30661 break
30662 }
30663 t := v_1.Type
30664 if auxIntToInt64(v_1.AuxInt) != 7 {
30665 break
30666 }
30667 v.reset(OpRsh8Ux64)
30668 v0 := b.NewValue0(v.Pos, OpConst64, t)
30669 v0.AuxInt = int64ToAuxInt(7)
30670 v.AddArg2(x, v0)
30671 return true
30672 }
30673
30674
30675
30676 for {
30677 i := v_0
30678 if i.Op != OpLsh8x64 {
30679 break
30680 }
30681 _ = i.Args[1]
30682 x := i.Args[0]
30683 i_1 := i.Args[1]
30684 if i_1.Op != OpConst64 {
30685 break
30686 }
30687 c := auxIntToInt64(i_1.AuxInt)
30688 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
30689 break
30690 }
30691 v.reset(OpAnd8)
30692 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
30693 v0.AuxInt = int8ToAuxInt(int8(^uint8(0) >> c))
30694 v.AddArg2(x, v0)
30695 return true
30696 }
30697
30698
30699
30700 for {
30701 if v_0.Op != OpLsh8x64 {
30702 break
30703 }
30704 _ = v_0.Args[1]
30705 v_0_0 := v_0.Args[0]
30706 if v_0_0.Op != OpRsh8Ux64 {
30707 break
30708 }
30709 _ = v_0_0.Args[1]
30710 x := v_0_0.Args[0]
30711 v_0_0_1 := v_0_0.Args[1]
30712 if v_0_0_1.Op != OpConst64 {
30713 break
30714 }
30715 c1 := auxIntToInt64(v_0_0_1.AuxInt)
30716 v_0_1 := v_0.Args[1]
30717 if v_0_1.Op != OpConst64 {
30718 break
30719 }
30720 c2 := auxIntToInt64(v_0_1.AuxInt)
30721 if v_1.Op != OpConst64 {
30722 break
30723 }
30724 c3 := auxIntToInt64(v_1.AuxInt)
30725 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
30726 break
30727 }
30728 v.reset(OpRsh8Ux64)
30729 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
30730 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
30731 v.AddArg2(x, v0)
30732 return true
30733 }
30734
30735
30736
30737 for {
30738 if auxIntToBool(v.AuxInt) != false {
30739 break
30740 }
30741 x := v_0
30742 con := v_1
30743 if con.Op != OpConst64 {
30744 break
30745 }
30746 c := auxIntToInt64(con.AuxInt)
30747 if !(0 < c && c < 8) {
30748 break
30749 }
30750 v.reset(OpRsh8Ux64)
30751 v.AuxInt = boolToAuxInt(true)
30752 v.AddArg2(x, con)
30753 return true
30754 }
30755 return false
30756 }
30757 func rewriteValuegeneric_OpRsh8Ux8(v *Value) bool {
30758 v_1 := v.Args[1]
30759 v_0 := v.Args[0]
30760 b := v.Block
30761
30762
30763 for {
30764 t := v.Type
30765 x := v_0
30766 if v_1.Op != OpConst8 {
30767 break
30768 }
30769 c := auxIntToInt8(v_1.AuxInt)
30770 v.reset(OpRsh8Ux64)
30771 v0 := b.NewValue0(v.Pos, OpConst64, t)
30772 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
30773 v.AddArg2(x, v0)
30774 return true
30775 }
30776
30777
30778 for {
30779 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
30780 break
30781 }
30782 v.reset(OpConst8)
30783 v.AuxInt = int8ToAuxInt(0)
30784 return true
30785 }
30786
30787
30788
30789 for {
30790 if auxIntToBool(v.AuxInt) != false {
30791 break
30792 }
30793 x := v_0
30794 con := v_1
30795 if con.Op != OpConst8 {
30796 break
30797 }
30798 c := auxIntToInt8(con.AuxInt)
30799 if !(0 < c && c < 8) {
30800 break
30801 }
30802 v.reset(OpRsh8Ux8)
30803 v.AuxInt = boolToAuxInt(true)
30804 v.AddArg2(x, con)
30805 return true
30806 }
30807 return false
30808 }
30809 func rewriteValuegeneric_OpRsh8x16(v *Value) bool {
30810 v_1 := v.Args[1]
30811 v_0 := v.Args[0]
30812 b := v.Block
30813
30814
30815 for {
30816 t := v.Type
30817 x := v_0
30818 if v_1.Op != OpConst16 {
30819 break
30820 }
30821 c := auxIntToInt16(v_1.AuxInt)
30822 v.reset(OpRsh8x64)
30823 v0 := b.NewValue0(v.Pos, OpConst64, t)
30824 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
30825 v.AddArg2(x, v0)
30826 return true
30827 }
30828
30829
30830 for {
30831 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
30832 break
30833 }
30834 v.reset(OpConst8)
30835 v.AuxInt = int8ToAuxInt(0)
30836 return true
30837 }
30838
30839
30840
30841 for {
30842 if auxIntToBool(v.AuxInt) != false {
30843 break
30844 }
30845 x := v_0
30846 con := v_1
30847 if con.Op != OpConst16 {
30848 break
30849 }
30850 c := auxIntToInt16(con.AuxInt)
30851 if !(0 < c && c < 8) {
30852 break
30853 }
30854 v.reset(OpRsh8x16)
30855 v.AuxInt = boolToAuxInt(true)
30856 v.AddArg2(x, con)
30857 return true
30858 }
30859 return false
30860 }
30861 func rewriteValuegeneric_OpRsh8x32(v *Value) bool {
30862 v_1 := v.Args[1]
30863 v_0 := v.Args[0]
30864 b := v.Block
30865
30866
30867 for {
30868 t := v.Type
30869 x := v_0
30870 if v_1.Op != OpConst32 {
30871 break
30872 }
30873 c := auxIntToInt32(v_1.AuxInt)
30874 v.reset(OpRsh8x64)
30875 v0 := b.NewValue0(v.Pos, OpConst64, t)
30876 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
30877 v.AddArg2(x, v0)
30878 return true
30879 }
30880
30881
30882 for {
30883 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
30884 break
30885 }
30886 v.reset(OpConst8)
30887 v.AuxInt = int8ToAuxInt(0)
30888 return true
30889 }
30890
30891
30892
30893 for {
30894 if auxIntToBool(v.AuxInt) != false {
30895 break
30896 }
30897 x := v_0
30898 con := v_1
30899 if con.Op != OpConst32 {
30900 break
30901 }
30902 c := auxIntToInt32(con.AuxInt)
30903 if !(0 < c && c < 8) {
30904 break
30905 }
30906 v.reset(OpRsh8x32)
30907 v.AuxInt = boolToAuxInt(true)
30908 v.AddArg2(x, con)
30909 return true
30910 }
30911 return false
30912 }
30913 func rewriteValuegeneric_OpRsh8x64(v *Value) bool {
30914 v_1 := v.Args[1]
30915 v_0 := v.Args[0]
30916 b := v.Block
30917
30918
30919 for {
30920 if v_0.Op != OpConst8 {
30921 break
30922 }
30923 c := auxIntToInt8(v_0.AuxInt)
30924 if v_1.Op != OpConst64 {
30925 break
30926 }
30927 d := auxIntToInt64(v_1.AuxInt)
30928 v.reset(OpConst8)
30929 v.AuxInt = int8ToAuxInt(c >> uint64(d))
30930 return true
30931 }
30932
30933
30934 for {
30935 x := v_0
30936 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
30937 break
30938 }
30939 v.copyOf(x)
30940 return true
30941 }
30942
30943
30944 for {
30945 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
30946 break
30947 }
30948 v.reset(OpConst8)
30949 v.AuxInt = int8ToAuxInt(0)
30950 return true
30951 }
30952
30953
30954
30955 for {
30956 t := v.Type
30957 if v_0.Op != OpRsh8x64 {
30958 break
30959 }
30960 _ = v_0.Args[1]
30961 x := v_0.Args[0]
30962 v_0_1 := v_0.Args[1]
30963 if v_0_1.Op != OpConst64 {
30964 break
30965 }
30966 c := auxIntToInt64(v_0_1.AuxInt)
30967 if v_1.Op != OpConst64 {
30968 break
30969 }
30970 d := auxIntToInt64(v_1.AuxInt)
30971 if !(!uaddOvf(c, d)) {
30972 break
30973 }
30974 v.reset(OpRsh8x64)
30975 v0 := b.NewValue0(v.Pos, OpConst64, t)
30976 v0.AuxInt = int64ToAuxInt(c + d)
30977 v.AddArg2(x, v0)
30978 return true
30979 }
30980
30981
30982
30983 for {
30984 if auxIntToBool(v.AuxInt) != false {
30985 break
30986 }
30987 x := v_0
30988 con := v_1
30989 if con.Op != OpConst64 {
30990 break
30991 }
30992 c := auxIntToInt64(con.AuxInt)
30993 if !(0 < c && c < 8) {
30994 break
30995 }
30996 v.reset(OpRsh8x64)
30997 v.AuxInt = boolToAuxInt(true)
30998 v.AddArg2(x, con)
30999 return true
31000 }
31001 return false
31002 }
31003 func rewriteValuegeneric_OpRsh8x8(v *Value) bool {
31004 v_1 := v.Args[1]
31005 v_0 := v.Args[0]
31006 b := v.Block
31007
31008
31009 for {
31010 t := v.Type
31011 x := v_0
31012 if v_1.Op != OpConst8 {
31013 break
31014 }
31015 c := auxIntToInt8(v_1.AuxInt)
31016 v.reset(OpRsh8x64)
31017 v0 := b.NewValue0(v.Pos, OpConst64, t)
31018 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
31019 v.AddArg2(x, v0)
31020 return true
31021 }
31022
31023
31024 for {
31025 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
31026 break
31027 }
31028 v.reset(OpConst8)
31029 v.AuxInt = int8ToAuxInt(0)
31030 return true
31031 }
31032
31033
31034
31035 for {
31036 if auxIntToBool(v.AuxInt) != false {
31037 break
31038 }
31039 x := v_0
31040 con := v_1
31041 if con.Op != OpConst8 {
31042 break
31043 }
31044 c := auxIntToInt8(con.AuxInt)
31045 if !(0 < c && c < 8) {
31046 break
31047 }
31048 v.reset(OpRsh8x8)
31049 v.AuxInt = boolToAuxInt(true)
31050 v.AddArg2(x, con)
31051 return true
31052 }
31053 return false
31054 }
31055 func rewriteValuegeneric_OpSelect0(v *Value) bool {
31056 v_0 := v.Args[0]
31057
31058
31059
31060 for {
31061 a := v_0
31062 if a.Op != OpAdd64carry {
31063 break
31064 }
31065 _ = a.Args[2]
31066 x := a.Args[0]
31067 y := a.Args[1]
31068 a_2 := a.Args[2]
31069 if a_2.Op != OpConst64 || auxIntToInt64(a_2.AuxInt) != 0 || !(a.Uses == 1) {
31070 break
31071 }
31072 v.reset(OpAdd64)
31073 v.AddArg2(x, y)
31074 return true
31075 }
31076
31077
31078 for {
31079 if v_0.Op != OpMakeTuple {
31080 break
31081 }
31082 x := v_0.Args[0]
31083 v.copyOf(x)
31084 return true
31085 }
31086 return false
31087 }
31088 func rewriteValuegeneric_OpSelect1(v *Value) bool {
31089 v_0 := v.Args[0]
31090
31091
31092 for {
31093 if v_0.Op != OpMakeTuple {
31094 break
31095 }
31096 y := v_0.Args[1]
31097 v.copyOf(y)
31098 return true
31099 }
31100 return false
31101 }
31102 func rewriteValuegeneric_OpSelectN(v *Value) bool {
31103 v_0 := v.Args[0]
31104 b := v.Block
31105 config := b.Func.Config
31106 typ := &b.Func.Config.Types
31107
31108
31109 for {
31110 n := auxIntToInt64(v.AuxInt)
31111 m := v_0
31112 if m.Op != OpMakeResult {
31113 break
31114 }
31115 v.copyOf(m.Args[n])
31116 return true
31117 }
31118
31119
31120
31121 for {
31122 if auxIntToInt64(v.AuxInt) != 0 {
31123 break
31124 }
31125 call := v_0
31126 if call.Op != OpStaticCall || len(call.Args) != 3 {
31127 break
31128 }
31129 sym := auxToCall(call.Aux)
31130 mem := call.Args[2]
31131 sptr := call.Args[0]
31132 call_1 := call.Args[1]
31133 if call_1.Op != OpConst64 {
31134 break
31135 }
31136 c := auxIntToInt64(call_1.AuxInt)
31137 if !(isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)) {
31138 break
31139 }
31140 v.reset(OpZero)
31141 v.AuxInt = int64ToAuxInt(int64(c))
31142 v.Aux = typeToAux(types.Types[types.TUINT8])
31143 v.AddArg2(sptr, mem)
31144 return true
31145 }
31146
31147
31148
31149 for {
31150 if auxIntToInt64(v.AuxInt) != 0 {
31151 break
31152 }
31153 call := v_0
31154 if call.Op != OpStaticCall || len(call.Args) != 3 {
31155 break
31156 }
31157 sym := auxToCall(call.Aux)
31158 mem := call.Args[2]
31159 sptr := call.Args[0]
31160 call_1 := call.Args[1]
31161 if call_1.Op != OpConst32 {
31162 break
31163 }
31164 c := auxIntToInt32(call_1.AuxInt)
31165 if !(isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)) {
31166 break
31167 }
31168 v.reset(OpZero)
31169 v.AuxInt = int64ToAuxInt(int64(c))
31170 v.Aux = typeToAux(types.Types[types.TUINT8])
31171 v.AddArg2(sptr, mem)
31172 return true
31173 }
31174
31175
31176
31177 for {
31178 if auxIntToInt64(v.AuxInt) != 0 {
31179 break
31180 }
31181 call := v_0
31182 if call.Op != OpStaticCall || len(call.Args) != 1 {
31183 break
31184 }
31185 sym := auxToCall(call.Aux)
31186 s1 := call.Args[0]
31187 if s1.Op != OpStore {
31188 break
31189 }
31190 _ = s1.Args[2]
31191 s1_1 := s1.Args[1]
31192 if s1_1.Op != OpConst64 {
31193 break
31194 }
31195 sz := auxIntToInt64(s1_1.AuxInt)
31196 s2 := s1.Args[2]
31197 if s2.Op != OpStore {
31198 break
31199 }
31200 _ = s2.Args[2]
31201 src := s2.Args[1]
31202 s3 := s2.Args[2]
31203 if s3.Op != OpStore {
31204 break
31205 }
31206 mem := s3.Args[2]
31207 dst := s3.Args[1]
31208 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)) {
31209 break
31210 }
31211 v.reset(OpMove)
31212 v.AuxInt = int64ToAuxInt(int64(sz))
31213 v.Aux = typeToAux(types.Types[types.TUINT8])
31214 v.AddArg3(dst, src, mem)
31215 return true
31216 }
31217
31218
31219
31220 for {
31221 if auxIntToInt64(v.AuxInt) != 0 {
31222 break
31223 }
31224 call := v_0
31225 if call.Op != OpStaticCall || len(call.Args) != 1 {
31226 break
31227 }
31228 sym := auxToCall(call.Aux)
31229 s1 := call.Args[0]
31230 if s1.Op != OpStore {
31231 break
31232 }
31233 _ = s1.Args[2]
31234 s1_1 := s1.Args[1]
31235 if s1_1.Op != OpConst32 {
31236 break
31237 }
31238 sz := auxIntToInt32(s1_1.AuxInt)
31239 s2 := s1.Args[2]
31240 if s2.Op != OpStore {
31241 break
31242 }
31243 _ = s2.Args[2]
31244 src := s2.Args[1]
31245 s3 := s2.Args[2]
31246 if s3.Op != OpStore {
31247 break
31248 }
31249 mem := s3.Args[2]
31250 dst := s3.Args[1]
31251 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)) {
31252 break
31253 }
31254 v.reset(OpMove)
31255 v.AuxInt = int64ToAuxInt(int64(sz))
31256 v.Aux = typeToAux(types.Types[types.TUINT8])
31257 v.AddArg3(dst, src, mem)
31258 return true
31259 }
31260
31261
31262
31263 for {
31264 if auxIntToInt64(v.AuxInt) != 0 {
31265 break
31266 }
31267 call := v_0
31268 if call.Op != OpStaticCall || len(call.Args) != 4 {
31269 break
31270 }
31271 sym := auxToCall(call.Aux)
31272 mem := call.Args[3]
31273 dst := call.Args[0]
31274 src := call.Args[1]
31275 call_2 := call.Args[2]
31276 if call_2.Op != OpConst64 {
31277 break
31278 }
31279 sz := auxIntToInt64(call_2.AuxInt)
31280 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
31281 break
31282 }
31283 v.reset(OpMove)
31284 v.AuxInt = int64ToAuxInt(int64(sz))
31285 v.Aux = typeToAux(types.Types[types.TUINT8])
31286 v.AddArg3(dst, src, mem)
31287 return true
31288 }
31289
31290
31291
31292 for {
31293 if auxIntToInt64(v.AuxInt) != 0 {
31294 break
31295 }
31296 call := v_0
31297 if call.Op != OpStaticCall || len(call.Args) != 4 {
31298 break
31299 }
31300 sym := auxToCall(call.Aux)
31301 mem := call.Args[3]
31302 dst := call.Args[0]
31303 src := call.Args[1]
31304 call_2 := call.Args[2]
31305 if call_2.Op != OpConst32 {
31306 break
31307 }
31308 sz := auxIntToInt32(call_2.AuxInt)
31309 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
31310 break
31311 }
31312 v.reset(OpMove)
31313 v.AuxInt = int64ToAuxInt(int64(sz))
31314 v.Aux = typeToAux(types.Types[types.TUINT8])
31315 v.AddArg3(dst, src, mem)
31316 return true
31317 }
31318
31319
31320
31321 for {
31322 if auxIntToInt64(v.AuxInt) != 0 {
31323 break
31324 }
31325 call := v_0
31326 if call.Op != OpStaticLECall || len(call.Args) != 4 {
31327 break
31328 }
31329 sym := auxToCall(call.Aux)
31330 mem := call.Args[3]
31331 dst := call.Args[0]
31332 src := call.Args[1]
31333 call_2 := call.Args[2]
31334 if call_2.Op != OpConst64 {
31335 break
31336 }
31337 sz := auxIntToInt64(call_2.AuxInt)
31338 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
31339 break
31340 }
31341 v.reset(OpMove)
31342 v.AuxInt = int64ToAuxInt(int64(sz))
31343 v.Aux = typeToAux(types.Types[types.TUINT8])
31344 v.AddArg3(dst, src, mem)
31345 return true
31346 }
31347
31348
31349
31350 for {
31351 if auxIntToInt64(v.AuxInt) != 0 {
31352 break
31353 }
31354 call := v_0
31355 if call.Op != OpStaticLECall || len(call.Args) != 4 {
31356 break
31357 }
31358 sym := auxToCall(call.Aux)
31359 mem := call.Args[3]
31360 dst := call.Args[0]
31361 src := call.Args[1]
31362 call_2 := call.Args[2]
31363 if call_2.Op != OpConst32 {
31364 break
31365 }
31366 sz := auxIntToInt32(call_2.AuxInt)
31367 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
31368 break
31369 }
31370 v.reset(OpMove)
31371 v.AuxInt = int64ToAuxInt(int64(sz))
31372 v.Aux = typeToAux(types.Types[types.TUINT8])
31373 v.AddArg3(dst, src, mem)
31374 return true
31375 }
31376
31377
31378
31379 for {
31380 if auxIntToInt64(v.AuxInt) != 0 {
31381 break
31382 }
31383 call := v_0
31384 if call.Op != OpStaticLECall || len(call.Args) != 2 {
31385 break
31386 }
31387 sym := auxToCall(call.Aux)
31388 x := call.Args[1]
31389 if !(needRaceCleanup(sym, call) && clobber(call)) {
31390 break
31391 }
31392 v.copyOf(x)
31393 return true
31394 }
31395
31396
31397
31398 for {
31399 if auxIntToInt64(v.AuxInt) != 0 {
31400 break
31401 }
31402 call := v_0
31403 if call.Op != OpStaticLECall || len(call.Args) != 1 {
31404 break
31405 }
31406 sym := auxToCall(call.Aux)
31407 x := call.Args[0]
31408 if !(needRaceCleanup(sym, call) && clobber(call)) {
31409 break
31410 }
31411 v.copyOf(x)
31412 return true
31413 }
31414
31415
31416
31417 for {
31418 if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpStaticCall || len(v_0.Args) != 6 {
31419 break
31420 }
31421 sym := auxToCall(v_0.Aux)
31422 _ = v_0.Args[1]
31423 newLen := v_0.Args[1]
31424 if newLen.Op != OpConst64 || !(v.Type.IsInteger() && (isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias"))) {
31425 break
31426 }
31427 v.copyOf(newLen)
31428 return true
31429 }
31430
31431
31432
31433 for {
31434 if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpStaticCall || len(v_0.Args) != 6 {
31435 break
31436 }
31437 sym := auxToCall(v_0.Aux)
31438 _ = v_0.Args[1]
31439 newLen := v_0.Args[1]
31440 if newLen.Op != OpConst32 || !(v.Type.IsInteger() && (isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias"))) {
31441 break
31442 }
31443 v.copyOf(newLen)
31444 return true
31445 }
31446
31447
31448
31449 for {
31450 if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpStaticLECall || len(v_0.Args) != 3 {
31451 break
31452 }
31453 f := auxToCall(v_0.Aux)
31454 _ = v_0.Args[2]
31455 x := v_0.Args[0]
31456 y := v_0.Args[1]
31457 v_0_2 := v_0.Args[2]
31458 if v_0_2.Op != OpSelectN || auxIntToInt64(v_0_2.AuxInt) != 1 {
31459 break
31460 }
31461 c := v_0_2.Args[0]
31462 if c.Op != OpStaticLECall || len(c.Args) != 3 {
31463 break
31464 }
31465 g := auxToCall(c.Aux)
31466 if x != c.Args[0] || y != c.Args[1] || !(isSameCall(f, "runtime.cmpstring") && isSameCall(g, "runtime.cmpstring")) {
31467 break
31468 }
31469 b = c.Block
31470 v0 := b.NewValue0(v.Pos, OpSelectN, typ.Int)
31471 v.copyOf(v0)
31472 v0.AuxInt = int64ToAuxInt(0)
31473 v0.AddArg(c)
31474 return true
31475 }
31476
31477
31478
31479 for {
31480 if auxIntToInt64(v.AuxInt) != 1 {
31481 break
31482 }
31483 c := v_0
31484 if c.Op != OpStaticLECall || len(c.Args) != 3 {
31485 break
31486 }
31487 f := auxToCall(c.Aux)
31488 mem := c.Args[2]
31489 if !(c.Uses == 1 && isSameCall(f, "runtime.cmpstring") && clobber(c)) {
31490 break
31491 }
31492 v.copyOf(mem)
31493 return true
31494 }
31495 return false
31496 }
31497 func rewriteValuegeneric_OpSignExt16to32(v *Value) bool {
31498 v_0 := v.Args[0]
31499
31500
31501 for {
31502 if v_0.Op != OpConst16 {
31503 break
31504 }
31505 c := auxIntToInt16(v_0.AuxInt)
31506 v.reset(OpConst32)
31507 v.AuxInt = int32ToAuxInt(int32(c))
31508 return true
31509 }
31510
31511
31512
31513 for {
31514 if v_0.Op != OpTrunc32to16 {
31515 break
31516 }
31517 x := v_0.Args[0]
31518 if x.Op != OpRsh32x64 {
31519 break
31520 }
31521 _ = x.Args[1]
31522 x_1 := x.Args[1]
31523 if x_1.Op != OpConst64 {
31524 break
31525 }
31526 s := auxIntToInt64(x_1.AuxInt)
31527 if !(s >= 16) {
31528 break
31529 }
31530 v.copyOf(x)
31531 return true
31532 }
31533 return false
31534 }
31535 func rewriteValuegeneric_OpSignExt16to64(v *Value) bool {
31536 v_0 := v.Args[0]
31537
31538
31539 for {
31540 if v_0.Op != OpConst16 {
31541 break
31542 }
31543 c := auxIntToInt16(v_0.AuxInt)
31544 v.reset(OpConst64)
31545 v.AuxInt = int64ToAuxInt(int64(c))
31546 return true
31547 }
31548
31549
31550
31551 for {
31552 if v_0.Op != OpTrunc64to16 {
31553 break
31554 }
31555 x := v_0.Args[0]
31556 if x.Op != OpRsh64x64 {
31557 break
31558 }
31559 _ = x.Args[1]
31560 x_1 := x.Args[1]
31561 if x_1.Op != OpConst64 {
31562 break
31563 }
31564 s := auxIntToInt64(x_1.AuxInt)
31565 if !(s >= 48) {
31566 break
31567 }
31568 v.copyOf(x)
31569 return true
31570 }
31571 return false
31572 }
31573 func rewriteValuegeneric_OpSignExt32to64(v *Value) bool {
31574 v_0 := v.Args[0]
31575
31576
31577 for {
31578 if v_0.Op != OpConst32 {
31579 break
31580 }
31581 c := auxIntToInt32(v_0.AuxInt)
31582 v.reset(OpConst64)
31583 v.AuxInt = int64ToAuxInt(int64(c))
31584 return true
31585 }
31586
31587
31588
31589 for {
31590 if v_0.Op != OpTrunc64to32 {
31591 break
31592 }
31593 x := v_0.Args[0]
31594 if x.Op != OpRsh64x64 {
31595 break
31596 }
31597 _ = x.Args[1]
31598 x_1 := x.Args[1]
31599 if x_1.Op != OpConst64 {
31600 break
31601 }
31602 s := auxIntToInt64(x_1.AuxInt)
31603 if !(s >= 32) {
31604 break
31605 }
31606 v.copyOf(x)
31607 return true
31608 }
31609 return false
31610 }
31611 func rewriteValuegeneric_OpSignExt8to16(v *Value) bool {
31612 v_0 := v.Args[0]
31613
31614
31615 for {
31616 if v_0.Op != OpConst8 {
31617 break
31618 }
31619 c := auxIntToInt8(v_0.AuxInt)
31620 v.reset(OpConst16)
31621 v.AuxInt = int16ToAuxInt(int16(c))
31622 return true
31623 }
31624
31625
31626
31627 for {
31628 if v_0.Op != OpTrunc16to8 {
31629 break
31630 }
31631 x := v_0.Args[0]
31632 if x.Op != OpRsh16x64 {
31633 break
31634 }
31635 _ = x.Args[1]
31636 x_1 := x.Args[1]
31637 if x_1.Op != OpConst64 {
31638 break
31639 }
31640 s := auxIntToInt64(x_1.AuxInt)
31641 if !(s >= 8) {
31642 break
31643 }
31644 v.copyOf(x)
31645 return true
31646 }
31647
31648
31649 for {
31650 cvt := v_0
31651 if cvt.Op != OpCvtBoolToUint8 {
31652 break
31653 }
31654 v.reset(OpZeroExt8to16)
31655 v.AddArg(cvt)
31656 return true
31657 }
31658 return false
31659 }
31660 func rewriteValuegeneric_OpSignExt8to32(v *Value) bool {
31661 v_0 := v.Args[0]
31662
31663
31664 for {
31665 if v_0.Op != OpConst8 {
31666 break
31667 }
31668 c := auxIntToInt8(v_0.AuxInt)
31669 v.reset(OpConst32)
31670 v.AuxInt = int32ToAuxInt(int32(c))
31671 return true
31672 }
31673
31674
31675
31676 for {
31677 if v_0.Op != OpTrunc32to8 {
31678 break
31679 }
31680 x := v_0.Args[0]
31681 if x.Op != OpRsh32x64 {
31682 break
31683 }
31684 _ = x.Args[1]
31685 x_1 := x.Args[1]
31686 if x_1.Op != OpConst64 {
31687 break
31688 }
31689 s := auxIntToInt64(x_1.AuxInt)
31690 if !(s >= 24) {
31691 break
31692 }
31693 v.copyOf(x)
31694 return true
31695 }
31696
31697
31698 for {
31699 cvt := v_0
31700 if cvt.Op != OpCvtBoolToUint8 {
31701 break
31702 }
31703 v.reset(OpZeroExt8to32)
31704 v.AddArg(cvt)
31705 return true
31706 }
31707 return false
31708 }
31709 func rewriteValuegeneric_OpSignExt8to64(v *Value) bool {
31710 v_0 := v.Args[0]
31711
31712
31713 for {
31714 if v_0.Op != OpConst8 {
31715 break
31716 }
31717 c := auxIntToInt8(v_0.AuxInt)
31718 v.reset(OpConst64)
31719 v.AuxInt = int64ToAuxInt(int64(c))
31720 return true
31721 }
31722
31723
31724
31725 for {
31726 if v_0.Op != OpTrunc64to8 {
31727 break
31728 }
31729 x := v_0.Args[0]
31730 if x.Op != OpRsh64x64 {
31731 break
31732 }
31733 _ = x.Args[1]
31734 x_1 := x.Args[1]
31735 if x_1.Op != OpConst64 {
31736 break
31737 }
31738 s := auxIntToInt64(x_1.AuxInt)
31739 if !(s >= 56) {
31740 break
31741 }
31742 v.copyOf(x)
31743 return true
31744 }
31745
31746
31747 for {
31748 cvt := v_0
31749 if cvt.Op != OpCvtBoolToUint8 {
31750 break
31751 }
31752 v.reset(OpZeroExt8to64)
31753 v.AddArg(cvt)
31754 return true
31755 }
31756 return false
31757 }
31758 func rewriteValuegeneric_OpSliceCap(v *Value) bool {
31759 v_0 := v.Args[0]
31760
31761
31762 for {
31763 if v_0.Op != OpSliceMake {
31764 break
31765 }
31766 _ = v_0.Args[2]
31767 v_0_2 := v_0.Args[2]
31768 if v_0_2.Op != OpConst64 {
31769 break
31770 }
31771 t := v_0_2.Type
31772 c := auxIntToInt64(v_0_2.AuxInt)
31773 v.reset(OpConst64)
31774 v.Type = t
31775 v.AuxInt = int64ToAuxInt(c)
31776 return true
31777 }
31778
31779
31780 for {
31781 if v_0.Op != OpSliceMake {
31782 break
31783 }
31784 _ = v_0.Args[2]
31785 v_0_2 := v_0.Args[2]
31786 if v_0_2.Op != OpConst32 {
31787 break
31788 }
31789 t := v_0_2.Type
31790 c := auxIntToInt32(v_0_2.AuxInt)
31791 v.reset(OpConst32)
31792 v.Type = t
31793 v.AuxInt = int32ToAuxInt(c)
31794 return true
31795 }
31796
31797
31798 for {
31799 if v_0.Op != OpSliceMake {
31800 break
31801 }
31802 _ = v_0.Args[2]
31803 v_0_2 := v_0.Args[2]
31804 if v_0_2.Op != OpSliceCap {
31805 break
31806 }
31807 x := v_0_2.Args[0]
31808 v.reset(OpSliceCap)
31809 v.AddArg(x)
31810 return true
31811 }
31812
31813
31814 for {
31815 if v_0.Op != OpSliceMake {
31816 break
31817 }
31818 _ = v_0.Args[2]
31819 v_0_2 := v_0.Args[2]
31820 if v_0_2.Op != OpSliceLen {
31821 break
31822 }
31823 x := v_0_2.Args[0]
31824 v.reset(OpSliceLen)
31825 v.AddArg(x)
31826 return true
31827 }
31828
31829
31830 for {
31831 if v_0.Op != OpPhi || len(v_0.Args) != 2 {
31832 break
31833 }
31834 _ = v_0.Args[1]
31835 v_0_0 := v_0.Args[0]
31836 if v_0_0.Op != OpSliceMake {
31837 break
31838 }
31839 x := v_0_0.Args[2]
31840 v_0_1 := v_0.Args[1]
31841 if v_0_1.Op != OpSliceMake {
31842 break
31843 }
31844 _ = v_0_1.Args[2]
31845 if x != v_0_1.Args[2] {
31846 break
31847 }
31848 v.copyOf(x)
31849 return true
31850 }
31851 return false
31852 }
31853 func rewriteValuegeneric_OpSliceLen(v *Value) bool {
31854 v_0 := v.Args[0]
31855
31856
31857 for {
31858 if v_0.Op != OpSliceMake {
31859 break
31860 }
31861 _ = v_0.Args[1]
31862 v_0_1 := v_0.Args[1]
31863 if v_0_1.Op != OpConst64 {
31864 break
31865 }
31866 t := v_0_1.Type
31867 c := auxIntToInt64(v_0_1.AuxInt)
31868 v.reset(OpConst64)
31869 v.Type = t
31870 v.AuxInt = int64ToAuxInt(c)
31871 return true
31872 }
31873
31874
31875 for {
31876 if v_0.Op != OpSliceMake {
31877 break
31878 }
31879 _ = v_0.Args[1]
31880 v_0_1 := v_0.Args[1]
31881 if v_0_1.Op != OpConst32 {
31882 break
31883 }
31884 t := v_0_1.Type
31885 c := auxIntToInt32(v_0_1.AuxInt)
31886 v.reset(OpConst32)
31887 v.Type = t
31888 v.AuxInt = int32ToAuxInt(c)
31889 return true
31890 }
31891
31892
31893 for {
31894 if v_0.Op != OpSliceMake {
31895 break
31896 }
31897 _ = v_0.Args[1]
31898 v_0_1 := v_0.Args[1]
31899 if v_0_1.Op != OpSliceLen {
31900 break
31901 }
31902 x := v_0_1.Args[0]
31903 v.reset(OpSliceLen)
31904 v.AddArg(x)
31905 return true
31906 }
31907
31908
31909 for {
31910 if v_0.Op != OpPhi || len(v_0.Args) != 2 {
31911 break
31912 }
31913 _ = v_0.Args[1]
31914 v_0_0 := v_0.Args[0]
31915 if v_0_0.Op != OpSliceMake {
31916 break
31917 }
31918 x := v_0_0.Args[1]
31919 v_0_1 := v_0.Args[1]
31920 if v_0_1.Op != OpSliceMake {
31921 break
31922 }
31923 _ = v_0_1.Args[1]
31924 if x != v_0_1.Args[1] {
31925 break
31926 }
31927 v.copyOf(x)
31928 return true
31929 }
31930
31931
31932
31933 for {
31934 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
31935 break
31936 }
31937 v_0_0 := v_0.Args[0]
31938 if v_0_0.Op != OpStaticLECall || len(v_0_0.Args) != 6 {
31939 break
31940 }
31941 sym := auxToCall(v_0_0.Aux)
31942 _ = v_0_0.Args[1]
31943 newLen := v_0_0.Args[1]
31944 if newLen.Op != OpConst64 || !(isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias")) {
31945 break
31946 }
31947 v.copyOf(newLen)
31948 return true
31949 }
31950
31951
31952
31953 for {
31954 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
31955 break
31956 }
31957 v_0_0 := v_0.Args[0]
31958 if v_0_0.Op != OpStaticLECall || len(v_0_0.Args) != 6 {
31959 break
31960 }
31961 sym := auxToCall(v_0_0.Aux)
31962 _ = v_0_0.Args[1]
31963 newLen := v_0_0.Args[1]
31964 if newLen.Op != OpConst32 || !(isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias")) {
31965 break
31966 }
31967 v.copyOf(newLen)
31968 return true
31969 }
31970 return false
31971 }
31972 func rewriteValuegeneric_OpSliceMake(v *Value) bool {
31973 v_2 := v.Args[2]
31974 v_1 := v.Args[1]
31975 v_0 := v.Args[0]
31976 b := v.Block
31977
31978
31979
31980 for {
31981 if v_0.Op != OpAddPtr {
31982 break
31983 }
31984 t := v_0.Type
31985 _ = v_0.Args[1]
31986 x := v_0.Args[0]
31987 v_0_1 := v_0.Args[1]
31988 if v_0_1.Op != OpAnd64 {
31989 break
31990 }
31991 _ = v_0_1.Args[1]
31992 v_0_1_0 := v_0_1.Args[0]
31993 v_0_1_1 := v_0_1.Args[1]
31994 for _i0 := 0; _i0 <= 1; _i0, v_0_1_0, v_0_1_1 = _i0+1, v_0_1_1, v_0_1_0 {
31995 y := v_0_1_0
31996 if v_0_1_1.Op != OpSlicemask {
31997 continue
31998 }
31999 w := v_1
32000 if w.Op != OpConst64 {
32001 continue
32002 }
32003 c := auxIntToInt64(w.AuxInt)
32004 z := v_2
32005 if !(c > 0) {
32006 continue
32007 }
32008 v.reset(OpSliceMake)
32009 v0 := b.NewValue0(v.Pos, OpAddPtr, t)
32010 v0.AddArg2(x, y)
32011 v.AddArg3(v0, w, z)
32012 return true
32013 }
32014 break
32015 }
32016
32017
32018
32019 for {
32020 if v_0.Op != OpAddPtr {
32021 break
32022 }
32023 t := v_0.Type
32024 _ = v_0.Args[1]
32025 x := v_0.Args[0]
32026 v_0_1 := v_0.Args[1]
32027 if v_0_1.Op != OpAnd32 {
32028 break
32029 }
32030 _ = v_0_1.Args[1]
32031 v_0_1_0 := v_0_1.Args[0]
32032 v_0_1_1 := v_0_1.Args[1]
32033 for _i0 := 0; _i0 <= 1; _i0, v_0_1_0, v_0_1_1 = _i0+1, v_0_1_1, v_0_1_0 {
32034 y := v_0_1_0
32035 if v_0_1_1.Op != OpSlicemask {
32036 continue
32037 }
32038 w := v_1
32039 if w.Op != OpConst32 {
32040 continue
32041 }
32042 c := auxIntToInt32(w.AuxInt)
32043 z := v_2
32044 if !(c > 0) {
32045 continue
32046 }
32047 v.reset(OpSliceMake)
32048 v0 := b.NewValue0(v.Pos, OpAddPtr, t)
32049 v0.AddArg2(x, y)
32050 v.AddArg3(v0, w, z)
32051 return true
32052 }
32053 break
32054 }
32055 return false
32056 }
32057 func rewriteValuegeneric_OpSlicePtr(v *Value) bool {
32058 v_0 := v.Args[0]
32059
32060
32061 for {
32062 if v_0.Op != OpSliceMake {
32063 break
32064 }
32065 v_0_0 := v_0.Args[0]
32066 if v_0_0.Op != OpSlicePtr {
32067 break
32068 }
32069 x := v_0_0.Args[0]
32070 v.reset(OpSlicePtr)
32071 v.AddArg(x)
32072 return true
32073 }
32074 return false
32075 }
32076 func rewriteValuegeneric_OpSlicemask(v *Value) bool {
32077 v_0 := v.Args[0]
32078
32079
32080
32081 for {
32082 if v_0.Op != OpConst32 {
32083 break
32084 }
32085 x := auxIntToInt32(v_0.AuxInt)
32086 if !(x > 0) {
32087 break
32088 }
32089 v.reset(OpConst32)
32090 v.AuxInt = int32ToAuxInt(-1)
32091 return true
32092 }
32093
32094
32095 for {
32096 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
32097 break
32098 }
32099 v.reset(OpConst32)
32100 v.AuxInt = int32ToAuxInt(0)
32101 return true
32102 }
32103
32104
32105
32106 for {
32107 if v_0.Op != OpConst64 {
32108 break
32109 }
32110 x := auxIntToInt64(v_0.AuxInt)
32111 if !(x > 0) {
32112 break
32113 }
32114 v.reset(OpConst64)
32115 v.AuxInt = int64ToAuxInt(-1)
32116 return true
32117 }
32118
32119
32120 for {
32121 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
32122 break
32123 }
32124 v.reset(OpConst64)
32125 v.AuxInt = int64ToAuxInt(0)
32126 return true
32127 }
32128 return false
32129 }
32130 func rewriteValuegeneric_OpSqrt(v *Value) bool {
32131 v_0 := v.Args[0]
32132
32133
32134
32135 for {
32136 if v_0.Op != OpConst64F {
32137 break
32138 }
32139 c := auxIntToFloat64(v_0.AuxInt)
32140 if !(!math.IsNaN(math.Sqrt(c))) {
32141 break
32142 }
32143 v.reset(OpConst64F)
32144 v.AuxInt = float64ToAuxInt(math.Sqrt(c))
32145 return true
32146 }
32147 return false
32148 }
32149 func rewriteValuegeneric_OpStaticCall(v *Value) bool {
32150 b := v.Block
32151 typ := &b.Func.Config.Types
32152
32153
32154
32155 for {
32156 if len(v.Args) != 4 {
32157 break
32158 }
32159 callAux := auxToCall(v.Aux)
32160 mem := v.Args[3]
32161 p := v.Args[0]
32162 q := v.Args[1]
32163 if !(isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)) {
32164 break
32165 }
32166 v.reset(OpMakeResult)
32167 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
32168 v0.AuxInt = boolToAuxInt(true)
32169 v.AddArg2(v0, mem)
32170 return true
32171 }
32172 return false
32173 }
32174 func rewriteValuegeneric_OpStaticLECall(v *Value) bool {
32175 b := v.Block
32176 config := b.Func.Config
32177 typ := &b.Func.Config.Types
32178
32179
32180
32181 for {
32182 if len(v.Args) != 4 {
32183 break
32184 }
32185 callAux := auxToCall(v.Aux)
32186 mem := v.Args[3]
32187 sptr := v.Args[0]
32188 v_1 := v.Args[1]
32189 if v_1.Op != OpAddr {
32190 break
32191 }
32192 scon := auxToSym(v_1.Aux)
32193 v_1_0 := v_1.Args[0]
32194 if v_1_0.Op != OpSB {
32195 break
32196 }
32197 v_2 := v.Args[2]
32198 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon)) {
32199 break
32200 }
32201 v.reset(OpMakeResult)
32202 v0 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
32203 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
32204 v1.AddArg2(sptr, mem)
32205 v2 := b.NewValue0(v.Pos, OpConst8, typ.Int8)
32206 v2.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
32207 v0.AddArg2(v1, v2)
32208 v.AddArg2(v0, mem)
32209 return true
32210 }
32211
32212
32213
32214 for {
32215 if len(v.Args) != 4 {
32216 break
32217 }
32218 callAux := auxToCall(v.Aux)
32219 mem := v.Args[3]
32220 v_0 := v.Args[0]
32221 if v_0.Op != OpAddr {
32222 break
32223 }
32224 scon := auxToSym(v_0.Aux)
32225 v_0_0 := v_0.Args[0]
32226 if v_0_0.Op != OpSB {
32227 break
32228 }
32229 sptr := v.Args[1]
32230 v_2 := v.Args[2]
32231 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon)) {
32232 break
32233 }
32234 v.reset(OpMakeResult)
32235 v0 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
32236 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
32237 v1.AddArg2(sptr, mem)
32238 v2 := b.NewValue0(v.Pos, OpConst8, typ.Int8)
32239 v2.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
32240 v0.AddArg2(v1, v2)
32241 v.AddArg2(v0, mem)
32242 return true
32243 }
32244
32245
32246
32247 for {
32248 if len(v.Args) != 4 {
32249 break
32250 }
32251 callAux := auxToCall(v.Aux)
32252 mem := v.Args[3]
32253 sptr := v.Args[0]
32254 v_1 := v.Args[1]
32255 if v_1.Op != OpAddr {
32256 break
32257 }
32258 scon := auxToSym(v_1.Aux)
32259 v_1_0 := v_1.Args[0]
32260 if v_1_0.Op != OpSB {
32261 break
32262 }
32263 v_2 := v.Args[2]
32264 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
32265 break
32266 }
32267 v.reset(OpMakeResult)
32268 v0 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
32269 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
32270 v1.AddArg2(sptr, mem)
32271 v2 := b.NewValue0(v.Pos, OpConst16, typ.Int16)
32272 v2.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
32273 v0.AddArg2(v1, v2)
32274 v.AddArg2(v0, mem)
32275 return true
32276 }
32277
32278
32279
32280 for {
32281 if len(v.Args) != 4 {
32282 break
32283 }
32284 callAux := auxToCall(v.Aux)
32285 mem := v.Args[3]
32286 v_0 := v.Args[0]
32287 if v_0.Op != OpAddr {
32288 break
32289 }
32290 scon := auxToSym(v_0.Aux)
32291 v_0_0 := v_0.Args[0]
32292 if v_0_0.Op != OpSB {
32293 break
32294 }
32295 sptr := v.Args[1]
32296 v_2 := v.Args[2]
32297 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
32298 break
32299 }
32300 v.reset(OpMakeResult)
32301 v0 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
32302 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
32303 v1.AddArg2(sptr, mem)
32304 v2 := b.NewValue0(v.Pos, OpConst16, typ.Int16)
32305 v2.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
32306 v0.AddArg2(v1, v2)
32307 v.AddArg2(v0, mem)
32308 return true
32309 }
32310
32311
32312
32313 for {
32314 if len(v.Args) != 4 {
32315 break
32316 }
32317 callAux := auxToCall(v.Aux)
32318 mem := v.Args[3]
32319 sptr := v.Args[0]
32320 v_1 := v.Args[1]
32321 if v_1.Op != OpAddr {
32322 break
32323 }
32324 scon := auxToSym(v_1.Aux)
32325 v_1_0 := v_1.Args[0]
32326 if v_1_0.Op != OpSB {
32327 break
32328 }
32329 v_2 := v.Args[2]
32330 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
32331 break
32332 }
32333 v.reset(OpMakeResult)
32334 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
32335 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32336 v1.AddArg2(sptr, mem)
32337 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
32338 v2.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
32339 v0.AddArg2(v1, v2)
32340 v.AddArg2(v0, mem)
32341 return true
32342 }
32343
32344
32345
32346 for {
32347 if len(v.Args) != 4 {
32348 break
32349 }
32350 callAux := auxToCall(v.Aux)
32351 mem := v.Args[3]
32352 v_0 := v.Args[0]
32353 if v_0.Op != OpAddr {
32354 break
32355 }
32356 scon := auxToSym(v_0.Aux)
32357 v_0_0 := v_0.Args[0]
32358 if v_0_0.Op != OpSB {
32359 break
32360 }
32361 sptr := v.Args[1]
32362 v_2 := v.Args[2]
32363 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
32364 break
32365 }
32366 v.reset(OpMakeResult)
32367 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
32368 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32369 v1.AddArg2(sptr, mem)
32370 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
32371 v2.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
32372 v0.AddArg2(v1, v2)
32373 v.AddArg2(v0, mem)
32374 return true
32375 }
32376
32377
32378
32379 for {
32380 if len(v.Args) != 4 {
32381 break
32382 }
32383 callAux := auxToCall(v.Aux)
32384 mem := v.Args[3]
32385 sptr := v.Args[0]
32386 v_1 := v.Args[1]
32387 if v_1.Op != OpAddr {
32388 break
32389 }
32390 scon := auxToSym(v_1.Aux)
32391 v_1_0 := v_1.Args[0]
32392 if v_1_0.Op != OpSB {
32393 break
32394 }
32395 v_2 := v.Args[2]
32396 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
32397 break
32398 }
32399 v.reset(OpMakeResult)
32400 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
32401 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
32402 v1.AddArg2(sptr, mem)
32403 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32404 v2.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
32405 v0.AddArg2(v1, v2)
32406 v.AddArg2(v0, mem)
32407 return true
32408 }
32409
32410
32411
32412 for {
32413 if len(v.Args) != 4 {
32414 break
32415 }
32416 callAux := auxToCall(v.Aux)
32417 mem := v.Args[3]
32418 v_0 := v.Args[0]
32419 if v_0.Op != OpAddr {
32420 break
32421 }
32422 scon := auxToSym(v_0.Aux)
32423 v_0_0 := v_0.Args[0]
32424 if v_0_0.Op != OpSB {
32425 break
32426 }
32427 sptr := v.Args[1]
32428 v_2 := v.Args[2]
32429 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
32430 break
32431 }
32432 v.reset(OpMakeResult)
32433 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
32434 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
32435 v1.AddArg2(sptr, mem)
32436 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32437 v2.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
32438 v0.AddArg2(v1, v2)
32439 v.AddArg2(v0, mem)
32440 return true
32441 }
32442
32443
32444
32445 for {
32446 if len(v.Args) != 4 {
32447 break
32448 }
32449 callAux := auxToCall(v.Aux)
32450 mem := v.Args[3]
32451 sptr := v.Args[0]
32452 v_1 := v.Args[1]
32453 if v_1.Op != OpAddr {
32454 break
32455 }
32456 scon := auxToSym(v_1.Aux)
32457 v_1_0 := v_1.Args[0]
32458 if v_1_0.Op != OpSB {
32459 break
32460 }
32461 v_2 := v.Args[2]
32462 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 3 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
32463 break
32464 }
32465 v.reset(OpMakeResult)
32466 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
32467 v1 := b.NewValue0(v.Pos, OpOr32, typ.Int32)
32468 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.Int32)
32469 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
32470 v3.AddArg2(sptr, mem)
32471 v2.AddArg(v3)
32472 v4 := b.NewValue0(v.Pos, OpLsh32x32, typ.Int32)
32473 v5 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.Int32)
32474 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
32475 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
32476 v7.AuxInt = int64ToAuxInt(2)
32477 v7.AddArg(sptr)
32478 v6.AddArg2(v7, mem)
32479 v5.AddArg(v6)
32480 v8 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
32481 v8.AuxInt = int32ToAuxInt(16)
32482 v4.AddArg2(v5, v8)
32483 v1.AddArg2(v2, v4)
32484 v9 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
32485 v9.AuxInt = int32ToAuxInt(int32(uint32(read16(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint32(read8(scon, 2)) << 16)))
32486 v0.AddArg2(v1, v9)
32487 v.AddArg2(v0, mem)
32488 return true
32489 }
32490
32491
32492
32493 for {
32494 if len(v.Args) != 4 {
32495 break
32496 }
32497 callAux := auxToCall(v.Aux)
32498 mem := v.Args[3]
32499 v_0 := v.Args[0]
32500 if v_0.Op != OpAddr {
32501 break
32502 }
32503 scon := auxToSym(v_0.Aux)
32504 v_0_0 := v_0.Args[0]
32505 if v_0_0.Op != OpSB {
32506 break
32507 }
32508 sptr := v.Args[1]
32509 v_2 := v.Args[2]
32510 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 3 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
32511 break
32512 }
32513 v.reset(OpMakeResult)
32514 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
32515 v1 := b.NewValue0(v.Pos, OpOr32, typ.Int32)
32516 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.Int32)
32517 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
32518 v3.AddArg2(sptr, mem)
32519 v2.AddArg(v3)
32520 v4 := b.NewValue0(v.Pos, OpLsh32x32, typ.Int32)
32521 v5 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.Int32)
32522 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
32523 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
32524 v7.AuxInt = int64ToAuxInt(2)
32525 v7.AddArg(sptr)
32526 v6.AddArg2(v7, mem)
32527 v5.AddArg(v6)
32528 v8 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
32529 v8.AuxInt = int32ToAuxInt(16)
32530 v4.AddArg2(v5, v8)
32531 v1.AddArg2(v2, v4)
32532 v9 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
32533 v9.AuxInt = int32ToAuxInt(int32(uint32(read16(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint32(read8(scon, 2)) << 16)))
32534 v0.AddArg2(v1, v9)
32535 v.AddArg2(v0, mem)
32536 return true
32537 }
32538
32539
32540
32541 for {
32542 if len(v.Args) != 4 {
32543 break
32544 }
32545 callAux := auxToCall(v.Aux)
32546 mem := v.Args[3]
32547 sptr := v.Args[0]
32548 v_1 := v.Args[1]
32549 if v_1.Op != OpAddr {
32550 break
32551 }
32552 scon := auxToSym(v_1.Aux)
32553 v_1_0 := v_1.Args[0]
32554 if v_1_0.Op != OpSB {
32555 break
32556 }
32557 v_2 := v.Args[2]
32558 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 5 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
32559 break
32560 }
32561 v.reset(OpMakeResult)
32562 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
32563 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
32564 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
32565 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32566 v3.AddArg2(sptr, mem)
32567 v2.AddArg(v3)
32568 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
32569 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.Int64)
32570 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
32571 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
32572 v7.AuxInt = int64ToAuxInt(4)
32573 v7.AddArg(sptr)
32574 v6.AddArg2(v7, mem)
32575 v5.AddArg(v6)
32576 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32577 v8.AuxInt = int64ToAuxInt(32)
32578 v4.AddArg2(v5, v8)
32579 v1.AddArg2(v2, v4)
32580 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32581 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read8(scon, 4)) << 32)))
32582 v0.AddArg2(v1, v9)
32583 v.AddArg2(v0, mem)
32584 return true
32585 }
32586
32587
32588
32589 for {
32590 if len(v.Args) != 4 {
32591 break
32592 }
32593 callAux := auxToCall(v.Aux)
32594 mem := v.Args[3]
32595 v_0 := v.Args[0]
32596 if v_0.Op != OpAddr {
32597 break
32598 }
32599 scon := auxToSym(v_0.Aux)
32600 v_0_0 := v_0.Args[0]
32601 if v_0_0.Op != OpSB {
32602 break
32603 }
32604 sptr := v.Args[1]
32605 v_2 := v.Args[2]
32606 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 5 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
32607 break
32608 }
32609 v.reset(OpMakeResult)
32610 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
32611 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
32612 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
32613 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32614 v3.AddArg2(sptr, mem)
32615 v2.AddArg(v3)
32616 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
32617 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.Int64)
32618 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
32619 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
32620 v7.AuxInt = int64ToAuxInt(4)
32621 v7.AddArg(sptr)
32622 v6.AddArg2(v7, mem)
32623 v5.AddArg(v6)
32624 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32625 v8.AuxInt = int64ToAuxInt(32)
32626 v4.AddArg2(v5, v8)
32627 v1.AddArg2(v2, v4)
32628 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32629 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read8(scon, 4)) << 32)))
32630 v0.AddArg2(v1, v9)
32631 v.AddArg2(v0, mem)
32632 return true
32633 }
32634
32635
32636
32637 for {
32638 if len(v.Args) != 4 {
32639 break
32640 }
32641 callAux := auxToCall(v.Aux)
32642 mem := v.Args[3]
32643 sptr := v.Args[0]
32644 v_1 := v.Args[1]
32645 if v_1.Op != OpAddr {
32646 break
32647 }
32648 scon := auxToSym(v_1.Aux)
32649 v_1_0 := v_1.Args[0]
32650 if v_1_0.Op != OpSB {
32651 break
32652 }
32653 v_2 := v.Args[2]
32654 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 6 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
32655 break
32656 }
32657 v.reset(OpMakeResult)
32658 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
32659 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
32660 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
32661 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32662 v3.AddArg2(sptr, mem)
32663 v2.AddArg(v3)
32664 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
32665 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.Int64)
32666 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
32667 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
32668 v7.AuxInt = int64ToAuxInt(4)
32669 v7.AddArg(sptr)
32670 v6.AddArg2(v7, mem)
32671 v5.AddArg(v6)
32672 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32673 v8.AuxInt = int64ToAuxInt(32)
32674 v4.AddArg2(v5, v8)
32675 v1.AddArg2(v2, v4)
32676 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32677 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read16(scon, 4, config.ctxt.Arch.ByteOrder)) << 32)))
32678 v0.AddArg2(v1, v9)
32679 v.AddArg2(v0, mem)
32680 return true
32681 }
32682
32683
32684
32685 for {
32686 if len(v.Args) != 4 {
32687 break
32688 }
32689 callAux := auxToCall(v.Aux)
32690 mem := v.Args[3]
32691 v_0 := v.Args[0]
32692 if v_0.Op != OpAddr {
32693 break
32694 }
32695 scon := auxToSym(v_0.Aux)
32696 v_0_0 := v_0.Args[0]
32697 if v_0_0.Op != OpSB {
32698 break
32699 }
32700 sptr := v.Args[1]
32701 v_2 := v.Args[2]
32702 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 6 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
32703 break
32704 }
32705 v.reset(OpMakeResult)
32706 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
32707 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
32708 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
32709 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32710 v3.AddArg2(sptr, mem)
32711 v2.AddArg(v3)
32712 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
32713 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.Int64)
32714 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
32715 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
32716 v7.AuxInt = int64ToAuxInt(4)
32717 v7.AddArg(sptr)
32718 v6.AddArg2(v7, mem)
32719 v5.AddArg(v6)
32720 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32721 v8.AuxInt = int64ToAuxInt(32)
32722 v4.AddArg2(v5, v8)
32723 v1.AddArg2(v2, v4)
32724 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32725 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read16(scon, 4, config.ctxt.Arch.ByteOrder)) << 32)))
32726 v0.AddArg2(v1, v9)
32727 v.AddArg2(v0, mem)
32728 return true
32729 }
32730
32731
32732
32733 for {
32734 if len(v.Args) != 4 {
32735 break
32736 }
32737 callAux := auxToCall(v.Aux)
32738 mem := v.Args[3]
32739 sptr := v.Args[0]
32740 v_1 := v.Args[1]
32741 if v_1.Op != OpAddr {
32742 break
32743 }
32744 scon := auxToSym(v_1.Aux)
32745 v_1_0 := v_1.Args[0]
32746 if v_1_0.Op != OpSB {
32747 break
32748 }
32749 v_2 := v.Args[2]
32750 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 7 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
32751 break
32752 }
32753 v.reset(OpMakeResult)
32754 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
32755 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
32756 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
32757 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32758 v3.AddArg2(sptr, mem)
32759 v2.AddArg(v3)
32760 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
32761 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
32762 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32763 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
32764 v7.AuxInt = int64ToAuxInt(3)
32765 v7.AddArg(sptr)
32766 v6.AddArg2(v7, mem)
32767 v5.AddArg(v6)
32768 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32769 v8.AuxInt = int64ToAuxInt(32)
32770 v4.AddArg2(v5, v8)
32771 v1.AddArg2(v2, v4)
32772 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32773 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read32(scon, 3, config.ctxt.Arch.ByteOrder)) << 32)))
32774 v0.AddArg2(v1, v9)
32775 v.AddArg2(v0, mem)
32776 return true
32777 }
32778
32779
32780
32781 for {
32782 if len(v.Args) != 4 {
32783 break
32784 }
32785 callAux := auxToCall(v.Aux)
32786 mem := v.Args[3]
32787 v_0 := v.Args[0]
32788 if v_0.Op != OpAddr {
32789 break
32790 }
32791 scon := auxToSym(v_0.Aux)
32792 v_0_0 := v_0.Args[0]
32793 if v_0_0.Op != OpSB {
32794 break
32795 }
32796 sptr := v.Args[1]
32797 v_2 := v.Args[2]
32798 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 7 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
32799 break
32800 }
32801 v.reset(OpMakeResult)
32802 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
32803 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
32804 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
32805 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32806 v3.AddArg2(sptr, mem)
32807 v2.AddArg(v3)
32808 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
32809 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
32810 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32811 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
32812 v7.AuxInt = int64ToAuxInt(3)
32813 v7.AddArg(sptr)
32814 v6.AddArg2(v7, mem)
32815 v5.AddArg(v6)
32816 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32817 v8.AuxInt = int64ToAuxInt(32)
32818 v4.AddArg2(v5, v8)
32819 v1.AddArg2(v2, v4)
32820 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32821 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read32(scon, 3, config.ctxt.Arch.ByteOrder)) << 32)))
32822 v0.AddArg2(v1, v9)
32823 v.AddArg2(v0, mem)
32824 return true
32825 }
32826
32827
32828
32829 for {
32830 if len(v.Args) != 4 {
32831 break
32832 }
32833 callAux := auxToCall(v.Aux)
32834 mem := v.Args[3]
32835 v_2 := v.Args[2]
32836 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.memequal")) {
32837 break
32838 }
32839 v.reset(OpMakeResult)
32840 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
32841 v0.AuxInt = boolToAuxInt(true)
32842 v.AddArg2(v0, mem)
32843 return true
32844 }
32845
32846
32847
32848 for {
32849 if len(v.Args) != 4 {
32850 break
32851 }
32852 callAux := auxToCall(v.Aux)
32853 mem := v.Args[3]
32854 p := v.Args[0]
32855 q := v.Args[1]
32856 if !(isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)) {
32857 break
32858 }
32859 v.reset(OpMakeResult)
32860 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
32861 v0.AuxInt = boolToAuxInt(true)
32862 v.AddArg2(v0, mem)
32863 return true
32864 }
32865
32866
32867
32868 for {
32869 if len(v.Args) != 4 {
32870 break
32871 }
32872 callAux := auxToCall(v.Aux)
32873 mem := v.Args[3]
32874 v_1 := v.Args[1]
32875 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
32876 break
32877 }
32878 v_2 := v.Args[2]
32879 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.makeslice")) {
32880 break
32881 }
32882 v.reset(OpMakeResult)
32883 v0 := b.NewValue0(v.Pos, OpAddr, v.Type.FieldType(0))
32884 v0.Aux = symToAux(ir.Syms.Zerobase)
32885 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
32886 v0.AddArg(v1)
32887 v.AddArg2(v0, mem)
32888 return true
32889 }
32890
32891
32892
32893 for {
32894 if len(v.Args) != 4 {
32895 break
32896 }
32897 callAux := auxToCall(v.Aux)
32898 mem := v.Args[3]
32899 v_1 := v.Args[1]
32900 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
32901 break
32902 }
32903 v_2 := v.Args[2]
32904 if v_2.Op != OpConst32 || auxIntToInt32(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.makeslice")) {
32905 break
32906 }
32907 v.reset(OpMakeResult)
32908 v0 := b.NewValue0(v.Pos, OpAddr, v.Type.FieldType(0))
32909 v0.Aux = symToAux(ir.Syms.Zerobase)
32910 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
32911 v0.AddArg(v1)
32912 v.AddArg2(v0, mem)
32913 return true
32914 }
32915
32916
32917
32918 for {
32919 if len(v.Args) != 4 {
32920 break
32921 }
32922 f := auxToCall(v.Aux)
32923 mem := v.Args[3]
32924 typ_ := v.Args[0]
32925 x := v.Args[1]
32926 y := v.Args[2]
32927 if !(isSameCall(f, "runtime.efaceeq") && isDirectAndComparableType(typ_) && clobber(v)) {
32928 break
32929 }
32930 v.reset(OpMakeResult)
32931 v0 := b.NewValue0(v.Pos, OpEqPtr, typ.Bool)
32932 v0.AddArg2(x, y)
32933 v.AddArg2(v0, mem)
32934 return true
32935 }
32936
32937
32938
32939 for {
32940 if len(v.Args) != 4 {
32941 break
32942 }
32943 f := auxToCall(v.Aux)
32944 mem := v.Args[3]
32945 itab := v.Args[0]
32946 x := v.Args[1]
32947 y := v.Args[2]
32948 if !(isSameCall(f, "runtime.ifaceeq") && isDirectAndComparableIface(itab) && clobber(v)) {
32949 break
32950 }
32951 v.reset(OpMakeResult)
32952 v0 := b.NewValue0(v.Pos, OpEqPtr, typ.Bool)
32953 v0.AddArg2(x, y)
32954 v.AddArg2(v0, mem)
32955 return true
32956 }
32957
32958
32959
32960 for {
32961 if len(v.Args) != 4 {
32962 break
32963 }
32964 argsize := auxIntToInt32(v.AuxInt)
32965 f := auxToCall(v.Aux)
32966 _ = v.Args[3]
32967 typ_ := v.Args[0]
32968 map_ := v.Args[1]
32969 key := v.Args[2]
32970 if key.Op != OpSelectN || auxIntToInt64(key.AuxInt) != 0 {
32971 break
32972 }
32973 sbts := key.Args[0]
32974 if sbts.Op != OpStaticLECall || len(sbts.Args) != 4 {
32975 break
32976 }
32977 g := auxToCall(sbts.Aux)
32978 mem := sbts.Args[3]
32979 ptr := sbts.Args[1]
32980 len := sbts.Args[2]
32981 m := v.Args[3]
32982 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)) {
32983 break
32984 }
32985 v.reset(OpStaticLECall)
32986 v.AuxInt = int32ToAuxInt(argsize)
32987 v.Aux = callToAux(f)
32988 v0 := b.NewValue0(v.Pos, OpStringMake, typ.String)
32989 v0.AddArg2(ptr, len)
32990 v.AddArg4(typ_, map_, v0, mem)
32991 return true
32992 }
32993
32994
32995
32996 for {
32997 if len(v.Args) != 3 {
32998 break
32999 }
33000 argsize := auxIntToInt32(v.AuxInt)
33001 f := auxToCall(v.Aux)
33002 _ = v.Args[2]
33003 dict_ := v.Args[0]
33004 key := v.Args[1]
33005 if key.Op != OpSelectN || auxIntToInt64(key.AuxInt) != 0 {
33006 break
33007 }
33008 sbts := key.Args[0]
33009 if sbts.Op != OpStaticLECall || len(sbts.Args) != 4 {
33010 break
33011 }
33012 g := auxToCall(sbts.Aux)
33013 mem := sbts.Args[3]
33014 ptr := sbts.Args[1]
33015 len := sbts.Args[2]
33016 m := v.Args[2]
33017 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)) {
33018 break
33019 }
33020 v.reset(OpStaticLECall)
33021 v.AuxInt = int32ToAuxInt(argsize)
33022 v.Aux = callToAux(f)
33023 v0 := b.NewValue0(v.Pos, OpStringMake, typ.String)
33024 v0.AddArg2(ptr, len)
33025 v.AddArg3(dict_, v0, mem)
33026 return true
33027 }
33028 return false
33029 }
33030 func rewriteValuegeneric_OpStore(v *Value) bool {
33031 v_2 := v.Args[2]
33032 v_1 := v.Args[1]
33033 v_0 := v.Args[0]
33034 b := v.Block
33035
33036
33037
33038 for {
33039 t1 := auxToType(v.Aux)
33040 p1 := v_0
33041 if v_1.Op != OpLoad {
33042 break
33043 }
33044 t2 := v_1.Type
33045 mem := v_1.Args[1]
33046 p2 := v_1.Args[0]
33047 if mem != v_2 || !(isSamePtr(p1, p2) && t2.Size() == t1.Size()) {
33048 break
33049 }
33050 v.copyOf(mem)
33051 return true
33052 }
33053
33054
33055
33056 for {
33057 t1 := auxToType(v.Aux)
33058 p1 := v_0
33059 if v_1.Op != OpLoad {
33060 break
33061 }
33062 t2 := v_1.Type
33063 oldmem := v_1.Args[1]
33064 p2 := v_1.Args[0]
33065 mem := v_2
33066 if mem.Op != OpStore {
33067 break
33068 }
33069 t3 := auxToType(mem.Aux)
33070 _ = mem.Args[2]
33071 p3 := mem.Args[0]
33072 if oldmem != mem.Args[2] || !(isSamePtr(p1, p2) && t2.Size() == t1.Size() && disjoint(p1, t1.Size(), p3, t3.Size())) {
33073 break
33074 }
33075 v.copyOf(mem)
33076 return true
33077 }
33078
33079
33080
33081 for {
33082 t1 := auxToType(v.Aux)
33083 p1 := v_0
33084 if v_1.Op != OpLoad {
33085 break
33086 }
33087 t2 := v_1.Type
33088 oldmem := v_1.Args[1]
33089 p2 := v_1.Args[0]
33090 mem := v_2
33091 if mem.Op != OpStore {
33092 break
33093 }
33094 t3 := auxToType(mem.Aux)
33095 _ = mem.Args[2]
33096 p3 := mem.Args[0]
33097 mem_2 := mem.Args[2]
33098 if mem_2.Op != OpStore {
33099 break
33100 }
33101 t4 := auxToType(mem_2.Aux)
33102 _ = mem_2.Args[2]
33103 p4 := mem_2.Args[0]
33104 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())) {
33105 break
33106 }
33107 v.copyOf(mem)
33108 return true
33109 }
33110
33111
33112
33113 for {
33114 t1 := auxToType(v.Aux)
33115 p1 := v_0
33116 if v_1.Op != OpLoad {
33117 break
33118 }
33119 t2 := v_1.Type
33120 oldmem := v_1.Args[1]
33121 p2 := v_1.Args[0]
33122 mem := v_2
33123 if mem.Op != OpStore {
33124 break
33125 }
33126 t3 := auxToType(mem.Aux)
33127 _ = mem.Args[2]
33128 p3 := mem.Args[0]
33129 mem_2 := mem.Args[2]
33130 if mem_2.Op != OpStore {
33131 break
33132 }
33133 t4 := auxToType(mem_2.Aux)
33134 _ = mem_2.Args[2]
33135 p4 := mem_2.Args[0]
33136 mem_2_2 := mem_2.Args[2]
33137 if mem_2_2.Op != OpStore {
33138 break
33139 }
33140 t5 := auxToType(mem_2_2.Aux)
33141 _ = mem_2_2.Args[2]
33142 p5 := mem_2_2.Args[0]
33143 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())) {
33144 break
33145 }
33146 v.copyOf(mem)
33147 return true
33148 }
33149
33150
33151
33152 for {
33153 t := auxToType(v.Aux)
33154 if v_0.Op != OpOffPtr {
33155 break
33156 }
33157 o := auxIntToInt64(v_0.AuxInt)
33158 p1 := v_0.Args[0]
33159 x := v_1
33160 mem := v_2
33161 if mem.Op != OpZero {
33162 break
33163 }
33164 n := auxIntToInt64(mem.AuxInt)
33165 p2 := mem.Args[0]
33166 if !(isConstZero(x) && o >= 0 && t.Size()+o <= n && isSamePtr(p1, p2)) {
33167 break
33168 }
33169 v.copyOf(mem)
33170 return true
33171 }
33172
33173
33174
33175 for {
33176 t1 := auxToType(v.Aux)
33177 op := v_0
33178 if op.Op != OpOffPtr {
33179 break
33180 }
33181 o1 := auxIntToInt64(op.AuxInt)
33182 p1 := op.Args[0]
33183 x := v_1
33184 mem := v_2
33185 if mem.Op != OpStore {
33186 break
33187 }
33188 t2 := auxToType(mem.Aux)
33189 _ = mem.Args[2]
33190 p2 := mem.Args[0]
33191 mem_2 := mem.Args[2]
33192 if mem_2.Op != OpZero {
33193 break
33194 }
33195 n := auxIntToInt64(mem_2.AuxInt)
33196 p3 := mem_2.Args[0]
33197 if !(isConstZero(x) && o1 >= 0 && t1.Size()+o1 <= n && isSamePtr(p1, p3) && disjoint(op, t1.Size(), p2, t2.Size())) {
33198 break
33199 }
33200 v.copyOf(mem)
33201 return true
33202 }
33203
33204
33205
33206 for {
33207 t1 := auxToType(v.Aux)
33208 op := v_0
33209 if op.Op != OpOffPtr {
33210 break
33211 }
33212 o1 := auxIntToInt64(op.AuxInt)
33213 p1 := op.Args[0]
33214 x := v_1
33215 mem := v_2
33216 if mem.Op != OpStore {
33217 break
33218 }
33219 t2 := auxToType(mem.Aux)
33220 _ = mem.Args[2]
33221 p2 := mem.Args[0]
33222 mem_2 := mem.Args[2]
33223 if mem_2.Op != OpStore {
33224 break
33225 }
33226 t3 := auxToType(mem_2.Aux)
33227 _ = mem_2.Args[2]
33228 p3 := mem_2.Args[0]
33229 mem_2_2 := mem_2.Args[2]
33230 if mem_2_2.Op != OpZero {
33231 break
33232 }
33233 n := auxIntToInt64(mem_2_2.AuxInt)
33234 p4 := mem_2_2.Args[0]
33235 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())) {
33236 break
33237 }
33238 v.copyOf(mem)
33239 return true
33240 }
33241
33242
33243
33244 for {
33245 t1 := auxToType(v.Aux)
33246 op := v_0
33247 if op.Op != OpOffPtr {
33248 break
33249 }
33250 o1 := auxIntToInt64(op.AuxInt)
33251 p1 := op.Args[0]
33252 x := v_1
33253 mem := v_2
33254 if mem.Op != OpStore {
33255 break
33256 }
33257 t2 := auxToType(mem.Aux)
33258 _ = mem.Args[2]
33259 p2 := mem.Args[0]
33260 mem_2 := mem.Args[2]
33261 if mem_2.Op != OpStore {
33262 break
33263 }
33264 t3 := auxToType(mem_2.Aux)
33265 _ = mem_2.Args[2]
33266 p3 := mem_2.Args[0]
33267 mem_2_2 := mem_2.Args[2]
33268 if mem_2_2.Op != OpStore {
33269 break
33270 }
33271 t4 := auxToType(mem_2_2.Aux)
33272 _ = mem_2_2.Args[2]
33273 p4 := mem_2_2.Args[0]
33274 mem_2_2_2 := mem_2_2.Args[2]
33275 if mem_2_2_2.Op != OpZero {
33276 break
33277 }
33278 n := auxIntToInt64(mem_2_2_2.AuxInt)
33279 p5 := mem_2_2_2.Args[0]
33280 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())) {
33281 break
33282 }
33283 v.copyOf(mem)
33284 return true
33285 }
33286
33287
33288 for {
33289 if v_1.Op != OpStructMake {
33290 break
33291 }
33292 v.copyOf(rewriteStructStore(v))
33293 return true
33294 }
33295
33296
33297
33298 for {
33299 t := auxToType(v.Aux)
33300 dst := v_0
33301 if v_1.Op != OpLoad {
33302 break
33303 }
33304 mem := v_1.Args[1]
33305 src := v_1.Args[0]
33306 if mem != v_2 || !(!CanSSA(t)) {
33307 break
33308 }
33309 v.reset(OpMove)
33310 v.AuxInt = int64ToAuxInt(t.Size())
33311 v.Aux = typeToAux(t)
33312 v.AddArg3(dst, src, mem)
33313 return true
33314 }
33315
33316
33317
33318 for {
33319 t := auxToType(v.Aux)
33320 dst := v_0
33321 if v_1.Op != OpLoad {
33322 break
33323 }
33324 mem := v_1.Args[1]
33325 src := v_1.Args[0]
33326 if v_2.Op != OpVarDef {
33327 break
33328 }
33329 x := auxToSym(v_2.Aux)
33330 if mem != v_2.Args[0] || !(!CanSSA(t)) {
33331 break
33332 }
33333 v.reset(OpMove)
33334 v.AuxInt = int64ToAuxInt(t.Size())
33335 v.Aux = typeToAux(t)
33336 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
33337 v0.Aux = symToAux(x)
33338 v0.AddArg(mem)
33339 v.AddArg3(dst, src, v0)
33340 return true
33341 }
33342
33343
33344 for {
33345 dst := v_0
33346 if v_1.Op != OpArrayMake1 {
33347 break
33348 }
33349 e := v_1.Args[0]
33350 mem := v_2
33351 v.reset(OpStore)
33352 v.Aux = typeToAux(e.Type)
33353 v.AddArg3(dst, e, mem)
33354 return true
33355 }
33356
33357
33358 for {
33359 if v_1.Op != OpEmpty {
33360 break
33361 }
33362 mem := v_2
33363 v.copyOf(mem)
33364 return true
33365 }
33366
33367
33368
33369 for {
33370 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
33371 break
33372 }
33373 call := v_0.Args[0]
33374 if call.Op != OpStaticLECall {
33375 break
33376 }
33377 x := v_1
33378 mem := v_2
33379 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isConstZero(x) && isMalloc(call.Aux)) {
33380 break
33381 }
33382 v.copyOf(mem)
33383 return true
33384 }
33385
33386
33387
33388 for {
33389 if v_0.Op != OpOffPtr {
33390 break
33391 }
33392 v_0_0 := v_0.Args[0]
33393 if v_0_0.Op != OpSelectN || auxIntToInt64(v_0_0.AuxInt) != 0 {
33394 break
33395 }
33396 call := v_0_0.Args[0]
33397 if call.Op != OpStaticLECall {
33398 break
33399 }
33400 x := v_1
33401 mem := v_2
33402 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isConstZero(x) && isMalloc(call.Aux)) {
33403 break
33404 }
33405 v.copyOf(mem)
33406 return true
33407 }
33408
33409
33410
33411 for {
33412 t1 := auxToType(v.Aux)
33413 op1 := v_0
33414 if op1.Op != OpOffPtr {
33415 break
33416 }
33417 o1 := auxIntToInt64(op1.AuxInt)
33418 p1 := op1.Args[0]
33419 d1 := v_1
33420 m2 := v_2
33421 if m2.Op != OpStore {
33422 break
33423 }
33424 t2 := auxToType(m2.Aux)
33425 _ = m2.Args[2]
33426 op2 := m2.Args[0]
33427 if op2.Op != OpOffPtr || auxIntToInt64(op2.AuxInt) != 0 {
33428 break
33429 }
33430 p2 := op2.Args[0]
33431 d2 := m2.Args[1]
33432 m3 := m2.Args[2]
33433 if m3.Op != OpMove {
33434 break
33435 }
33436 n := auxIntToInt64(m3.AuxInt)
33437 mem := m3.Args[2]
33438 p3 := m3.Args[0]
33439 if !(m2.Uses == 1 && m3.Uses == 1 && o1 == t2.Size() && n == t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2, m3)) {
33440 break
33441 }
33442 v.reset(OpStore)
33443 v.Aux = typeToAux(t1)
33444 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33445 v0.Aux = typeToAux(t2)
33446 v0.AddArg3(op2, d2, mem)
33447 v.AddArg3(op1, d1, v0)
33448 return true
33449 }
33450
33451
33452
33453 for {
33454 t1 := auxToType(v.Aux)
33455 op1 := v_0
33456 if op1.Op != OpOffPtr {
33457 break
33458 }
33459 o1 := auxIntToInt64(op1.AuxInt)
33460 p1 := op1.Args[0]
33461 d1 := v_1
33462 m2 := v_2
33463 if m2.Op != OpStore {
33464 break
33465 }
33466 t2 := auxToType(m2.Aux)
33467 _ = m2.Args[2]
33468 op2 := m2.Args[0]
33469 if op2.Op != OpOffPtr {
33470 break
33471 }
33472 o2 := auxIntToInt64(op2.AuxInt)
33473 p2 := op2.Args[0]
33474 d2 := m2.Args[1]
33475 m3 := m2.Args[2]
33476 if m3.Op != OpStore {
33477 break
33478 }
33479 t3 := auxToType(m3.Aux)
33480 _ = m3.Args[2]
33481 op3 := m3.Args[0]
33482 if op3.Op != OpOffPtr || auxIntToInt64(op3.AuxInt) != 0 {
33483 break
33484 }
33485 p3 := op3.Args[0]
33486 d3 := m3.Args[1]
33487 m4 := m3.Args[2]
33488 if m4.Op != OpMove {
33489 break
33490 }
33491 n := auxIntToInt64(m4.AuxInt)
33492 mem := m4.Args[2]
33493 p4 := m4.Args[0]
33494 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)) {
33495 break
33496 }
33497 v.reset(OpStore)
33498 v.Aux = typeToAux(t1)
33499 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33500 v0.Aux = typeToAux(t2)
33501 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33502 v1.Aux = typeToAux(t3)
33503 v1.AddArg3(op3, d3, mem)
33504 v0.AddArg3(op2, d2, v1)
33505 v.AddArg3(op1, d1, v0)
33506 return true
33507 }
33508
33509
33510
33511 for {
33512 t1 := auxToType(v.Aux)
33513 op1 := v_0
33514 if op1.Op != OpOffPtr {
33515 break
33516 }
33517 o1 := auxIntToInt64(op1.AuxInt)
33518 p1 := op1.Args[0]
33519 d1 := v_1
33520 m2 := v_2
33521 if m2.Op != OpStore {
33522 break
33523 }
33524 t2 := auxToType(m2.Aux)
33525 _ = m2.Args[2]
33526 op2 := m2.Args[0]
33527 if op2.Op != OpOffPtr {
33528 break
33529 }
33530 o2 := auxIntToInt64(op2.AuxInt)
33531 p2 := op2.Args[0]
33532 d2 := m2.Args[1]
33533 m3 := m2.Args[2]
33534 if m3.Op != OpStore {
33535 break
33536 }
33537 t3 := auxToType(m3.Aux)
33538 _ = m3.Args[2]
33539 op3 := m3.Args[0]
33540 if op3.Op != OpOffPtr {
33541 break
33542 }
33543 o3 := auxIntToInt64(op3.AuxInt)
33544 p3 := op3.Args[0]
33545 d3 := m3.Args[1]
33546 m4 := m3.Args[2]
33547 if m4.Op != OpStore {
33548 break
33549 }
33550 t4 := auxToType(m4.Aux)
33551 _ = m4.Args[2]
33552 op4 := m4.Args[0]
33553 if op4.Op != OpOffPtr || auxIntToInt64(op4.AuxInt) != 0 {
33554 break
33555 }
33556 p4 := op4.Args[0]
33557 d4 := m4.Args[1]
33558 m5 := m4.Args[2]
33559 if m5.Op != OpMove {
33560 break
33561 }
33562 n := auxIntToInt64(m5.AuxInt)
33563 mem := m5.Args[2]
33564 p5 := m5.Args[0]
33565 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)) {
33566 break
33567 }
33568 v.reset(OpStore)
33569 v.Aux = typeToAux(t1)
33570 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33571 v0.Aux = typeToAux(t2)
33572 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33573 v1.Aux = typeToAux(t3)
33574 v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33575 v2.Aux = typeToAux(t4)
33576 v2.AddArg3(op4, d4, mem)
33577 v1.AddArg3(op3, d3, v2)
33578 v0.AddArg3(op2, d2, v1)
33579 v.AddArg3(op1, d1, v0)
33580 return true
33581 }
33582
33583
33584
33585 for {
33586 t1 := auxToType(v.Aux)
33587 op1 := v_0
33588 if op1.Op != OpOffPtr {
33589 break
33590 }
33591 o1 := auxIntToInt64(op1.AuxInt)
33592 p1 := op1.Args[0]
33593 d1 := v_1
33594 m2 := v_2
33595 if m2.Op != OpStore {
33596 break
33597 }
33598 t2 := auxToType(m2.Aux)
33599 _ = m2.Args[2]
33600 op2 := m2.Args[0]
33601 if op2.Op != OpOffPtr || auxIntToInt64(op2.AuxInt) != 0 {
33602 break
33603 }
33604 p2 := op2.Args[0]
33605 d2 := m2.Args[1]
33606 m3 := m2.Args[2]
33607 if m3.Op != OpZero {
33608 break
33609 }
33610 n := auxIntToInt64(m3.AuxInt)
33611 mem := m3.Args[1]
33612 p3 := m3.Args[0]
33613 if !(m2.Uses == 1 && m3.Uses == 1 && o1 == t2.Size() && n == t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2, m3)) {
33614 break
33615 }
33616 v.reset(OpStore)
33617 v.Aux = typeToAux(t1)
33618 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33619 v0.Aux = typeToAux(t2)
33620 v0.AddArg3(op2, d2, mem)
33621 v.AddArg3(op1, d1, v0)
33622 return true
33623 }
33624
33625
33626
33627 for {
33628 t1 := auxToType(v.Aux)
33629 op1 := v_0
33630 if op1.Op != OpOffPtr {
33631 break
33632 }
33633 o1 := auxIntToInt64(op1.AuxInt)
33634 p1 := op1.Args[0]
33635 d1 := v_1
33636 m2 := v_2
33637 if m2.Op != OpStore {
33638 break
33639 }
33640 t2 := auxToType(m2.Aux)
33641 _ = m2.Args[2]
33642 op2 := m2.Args[0]
33643 if op2.Op != OpOffPtr {
33644 break
33645 }
33646 o2 := auxIntToInt64(op2.AuxInt)
33647 p2 := op2.Args[0]
33648 d2 := m2.Args[1]
33649 m3 := m2.Args[2]
33650 if m3.Op != OpStore {
33651 break
33652 }
33653 t3 := auxToType(m3.Aux)
33654 _ = m3.Args[2]
33655 op3 := m3.Args[0]
33656 if op3.Op != OpOffPtr || auxIntToInt64(op3.AuxInt) != 0 {
33657 break
33658 }
33659 p3 := op3.Args[0]
33660 d3 := m3.Args[1]
33661 m4 := m3.Args[2]
33662 if m4.Op != OpZero {
33663 break
33664 }
33665 n := auxIntToInt64(m4.AuxInt)
33666 mem := m4.Args[1]
33667 p4 := m4.Args[0]
33668 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)) {
33669 break
33670 }
33671 v.reset(OpStore)
33672 v.Aux = typeToAux(t1)
33673 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33674 v0.Aux = typeToAux(t2)
33675 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33676 v1.Aux = typeToAux(t3)
33677 v1.AddArg3(op3, d3, mem)
33678 v0.AddArg3(op2, d2, v1)
33679 v.AddArg3(op1, d1, v0)
33680 return true
33681 }
33682
33683
33684
33685 for {
33686 t1 := auxToType(v.Aux)
33687 op1 := v_0
33688 if op1.Op != OpOffPtr {
33689 break
33690 }
33691 o1 := auxIntToInt64(op1.AuxInt)
33692 p1 := op1.Args[0]
33693 d1 := v_1
33694 m2 := v_2
33695 if m2.Op != OpStore {
33696 break
33697 }
33698 t2 := auxToType(m2.Aux)
33699 _ = m2.Args[2]
33700 op2 := m2.Args[0]
33701 if op2.Op != OpOffPtr {
33702 break
33703 }
33704 o2 := auxIntToInt64(op2.AuxInt)
33705 p2 := op2.Args[0]
33706 d2 := m2.Args[1]
33707 m3 := m2.Args[2]
33708 if m3.Op != OpStore {
33709 break
33710 }
33711 t3 := auxToType(m3.Aux)
33712 _ = m3.Args[2]
33713 op3 := m3.Args[0]
33714 if op3.Op != OpOffPtr {
33715 break
33716 }
33717 o3 := auxIntToInt64(op3.AuxInt)
33718 p3 := op3.Args[0]
33719 d3 := m3.Args[1]
33720 m4 := m3.Args[2]
33721 if m4.Op != OpStore {
33722 break
33723 }
33724 t4 := auxToType(m4.Aux)
33725 _ = m4.Args[2]
33726 op4 := m4.Args[0]
33727 if op4.Op != OpOffPtr || auxIntToInt64(op4.AuxInt) != 0 {
33728 break
33729 }
33730 p4 := op4.Args[0]
33731 d4 := m4.Args[1]
33732 m5 := m4.Args[2]
33733 if m5.Op != OpZero {
33734 break
33735 }
33736 n := auxIntToInt64(m5.AuxInt)
33737 mem := m5.Args[1]
33738 p5 := m5.Args[0]
33739 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)) {
33740 break
33741 }
33742 v.reset(OpStore)
33743 v.Aux = typeToAux(t1)
33744 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33745 v0.Aux = typeToAux(t2)
33746 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33747 v1.Aux = typeToAux(t3)
33748 v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33749 v2.Aux = typeToAux(t4)
33750 v2.AddArg3(op4, d4, mem)
33751 v1.AddArg3(op3, d3, v2)
33752 v0.AddArg3(op2, d2, v1)
33753 v.AddArg3(op1, d1, v0)
33754 return true
33755 }
33756 return false
33757 }
33758 func rewriteValuegeneric_OpStringLen(v *Value) bool {
33759 v_0 := v.Args[0]
33760
33761
33762 for {
33763 if v_0.Op != OpStringMake {
33764 break
33765 }
33766 _ = v_0.Args[1]
33767 v_0_1 := v_0.Args[1]
33768 if v_0_1.Op != OpConst64 {
33769 break
33770 }
33771 t := v_0_1.Type
33772 c := auxIntToInt64(v_0_1.AuxInt)
33773 v.reset(OpConst64)
33774 v.Type = t
33775 v.AuxInt = int64ToAuxInt(c)
33776 return true
33777 }
33778 return false
33779 }
33780 func rewriteValuegeneric_OpStringPtr(v *Value) bool {
33781 v_0 := v.Args[0]
33782
33783
33784 for {
33785 if v_0.Op != OpStringMake {
33786 break
33787 }
33788 v_0_0 := v_0.Args[0]
33789 if v_0_0.Op != OpAddr {
33790 break
33791 }
33792 t := v_0_0.Type
33793 s := auxToSym(v_0_0.Aux)
33794 base := v_0_0.Args[0]
33795 v.reset(OpAddr)
33796 v.Type = t
33797 v.Aux = symToAux(s)
33798 v.AddArg(base)
33799 return true
33800 }
33801 return false
33802 }
33803 func rewriteValuegeneric_OpStructSelect(v *Value) bool {
33804 v_0 := v.Args[0]
33805 b := v.Block
33806
33807
33808 for {
33809 i := auxIntToInt64(v.AuxInt)
33810 x := v_0
33811 if x.Op != OpStructMake {
33812 break
33813 }
33814 v.copyOf(x.Args[i])
33815 return true
33816 }
33817
33818
33819
33820 for {
33821 i := auxIntToInt64(v.AuxInt)
33822 x := v_0
33823 if x.Op != OpLoad {
33824 break
33825 }
33826 t := x.Type
33827 mem := x.Args[1]
33828 ptr := x.Args[0]
33829 if !(!CanSSA(t)) {
33830 break
33831 }
33832 b = x.Block
33833 v0 := b.NewValue0(v.Pos, OpLoad, v.Type)
33834 v.copyOf(v0)
33835 v1 := b.NewValue0(v.Pos, OpOffPtr, v.Type.PtrTo())
33836 v1.AuxInt = int64ToAuxInt(t.FieldOff(int(i)))
33837 v1.AddArg(ptr)
33838 v0.AddArg2(v1, mem)
33839 return true
33840 }
33841
33842
33843
33844 for {
33845 if v_0.Op != OpIData {
33846 break
33847 }
33848 x := v_0.Args[0]
33849 if !(v.Type.Size() > 0) {
33850 break
33851 }
33852 v.reset(OpIData)
33853 v.AddArg(x)
33854 return true
33855 }
33856
33857
33858
33859 for {
33860 if v_0.Op != OpIData {
33861 break
33862 }
33863 if !(v.Type.Size() == 0) {
33864 break
33865 }
33866 v.reset(OpEmpty)
33867 return true
33868 }
33869 return false
33870 }
33871 func rewriteValuegeneric_OpSub16(v *Value) bool {
33872 v_1 := v.Args[1]
33873 v_0 := v.Args[0]
33874 b := v.Block
33875
33876
33877 for {
33878 if v_0.Op != OpConst16 {
33879 break
33880 }
33881 c := auxIntToInt16(v_0.AuxInt)
33882 if v_1.Op != OpConst16 {
33883 break
33884 }
33885 d := auxIntToInt16(v_1.AuxInt)
33886 v.reset(OpConst16)
33887 v.AuxInt = int16ToAuxInt(c - d)
33888 return true
33889 }
33890
33891
33892
33893 for {
33894 x := v_0
33895 if v_1.Op != OpConst16 {
33896 break
33897 }
33898 t := v_1.Type
33899 c := auxIntToInt16(v_1.AuxInt)
33900 if !(x.Op != OpConst16) {
33901 break
33902 }
33903 v.reset(OpAdd16)
33904 v0 := b.NewValue0(v.Pos, OpConst16, t)
33905 v0.AuxInt = int16ToAuxInt(-c)
33906 v.AddArg2(v0, x)
33907 return true
33908 }
33909
33910
33911 for {
33912 t := v.Type
33913 if v_0.Op != OpMul16 {
33914 break
33915 }
33916 _ = v_0.Args[1]
33917 v_0_0 := v_0.Args[0]
33918 v_0_1 := v_0.Args[1]
33919 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33920 x := v_0_0
33921 y := v_0_1
33922 if v_1.Op != OpMul16 {
33923 continue
33924 }
33925 _ = v_1.Args[1]
33926 v_1_0 := v_1.Args[0]
33927 v_1_1 := v_1.Args[1]
33928 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33929 if x != v_1_0 {
33930 continue
33931 }
33932 z := v_1_1
33933 v.reset(OpMul16)
33934 v0 := b.NewValue0(v.Pos, OpSub16, t)
33935 v0.AddArg2(y, z)
33936 v.AddArg2(x, v0)
33937 return true
33938 }
33939 }
33940 break
33941 }
33942
33943
33944 for {
33945 x := v_0
33946 if x != v_1 {
33947 break
33948 }
33949 v.reset(OpConst16)
33950 v.AuxInt = int16ToAuxInt(0)
33951 return true
33952 }
33953
33954
33955 for {
33956 if v_0.Op != OpNeg16 {
33957 break
33958 }
33959 x := v_0.Args[0]
33960 if v_1.Op != OpCom16 || x != v_1.Args[0] {
33961 break
33962 }
33963 v.reset(OpConst16)
33964 v.AuxInt = int16ToAuxInt(1)
33965 return true
33966 }
33967
33968
33969 for {
33970 if v_0.Op != OpCom16 {
33971 break
33972 }
33973 x := v_0.Args[0]
33974 if v_1.Op != OpNeg16 || x != v_1.Args[0] {
33975 break
33976 }
33977 v.reset(OpConst16)
33978 v.AuxInt = int16ToAuxInt(-1)
33979 return true
33980 }
33981
33982
33983 for {
33984 if v_0.Op != OpAdd16 {
33985 break
33986 }
33987 _ = v_0.Args[1]
33988 v_0_0 := v_0.Args[0]
33989 v_0_1 := v_0.Args[1]
33990 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33991 t := v_0_0
33992 x := v_0_1
33993 if v_1.Op != OpAdd16 {
33994 continue
33995 }
33996 _ = v_1.Args[1]
33997 v_1_0 := v_1.Args[0]
33998 v_1_1 := v_1.Args[1]
33999 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34000 if t != v_1_0 {
34001 continue
34002 }
34003 y := v_1_1
34004 v.reset(OpSub16)
34005 v.AddArg2(x, y)
34006 return true
34007 }
34008 }
34009 break
34010 }
34011
34012
34013 for {
34014 if v_0.Op != OpAdd16 {
34015 break
34016 }
34017 _ = v_0.Args[1]
34018 v_0_0 := v_0.Args[0]
34019 v_0_1 := v_0.Args[1]
34020 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34021 x := v_0_0
34022 y := v_0_1
34023 if x != v_1 {
34024 continue
34025 }
34026 v.copyOf(y)
34027 return true
34028 }
34029 break
34030 }
34031
34032
34033 for {
34034 if v_0.Op != OpAdd16 {
34035 break
34036 }
34037 _ = v_0.Args[1]
34038 v_0_0 := v_0.Args[0]
34039 v_0_1 := v_0.Args[1]
34040 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34041 x := v_0_0
34042 y := v_0_1
34043 if y != v_1 {
34044 continue
34045 }
34046 v.copyOf(x)
34047 return true
34048 }
34049 break
34050 }
34051
34052
34053 for {
34054 if v_0.Op != OpSub16 {
34055 break
34056 }
34057 y := v_0.Args[1]
34058 x := v_0.Args[0]
34059 if x != v_1 {
34060 break
34061 }
34062 v.reset(OpNeg16)
34063 v.AddArg(y)
34064 return true
34065 }
34066
34067
34068 for {
34069 x := v_0
34070 if v_1.Op != OpAdd16 {
34071 break
34072 }
34073 _ = v_1.Args[1]
34074 v_1_0 := v_1.Args[0]
34075 v_1_1 := v_1.Args[1]
34076 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34077 if x != v_1_0 {
34078 continue
34079 }
34080 y := v_1_1
34081 v.reset(OpNeg16)
34082 v.AddArg(y)
34083 return true
34084 }
34085 break
34086 }
34087
34088
34089
34090 for {
34091 x := v_0
34092 if v_1.Op != OpSub16 {
34093 break
34094 }
34095 z := v_1.Args[1]
34096 i := v_1.Args[0]
34097 if i.Op != OpConst16 {
34098 break
34099 }
34100 t := i.Type
34101 if !(z.Op != OpConst16 && x.Op != OpConst16) {
34102 break
34103 }
34104 v.reset(OpSub16)
34105 v0 := b.NewValue0(v.Pos, OpAdd16, t)
34106 v0.AddArg2(x, z)
34107 v.AddArg2(v0, i)
34108 return true
34109 }
34110
34111
34112
34113 for {
34114 x := v_0
34115 if v_1.Op != OpAdd16 {
34116 break
34117 }
34118 _ = v_1.Args[1]
34119 v_1_0 := v_1.Args[0]
34120 v_1_1 := v_1.Args[1]
34121 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34122 z := v_1_0
34123 i := v_1_1
34124 if i.Op != OpConst16 {
34125 continue
34126 }
34127 t := i.Type
34128 if !(z.Op != OpConst16 && x.Op != OpConst16) {
34129 continue
34130 }
34131 v.reset(OpSub16)
34132 v0 := b.NewValue0(v.Pos, OpSub16, t)
34133 v0.AddArg2(x, z)
34134 v.AddArg2(v0, i)
34135 return true
34136 }
34137 break
34138 }
34139
34140
34141
34142 for {
34143 if v_0.Op != OpSub16 {
34144 break
34145 }
34146 z := v_0.Args[1]
34147 i := v_0.Args[0]
34148 if i.Op != OpConst16 {
34149 break
34150 }
34151 t := i.Type
34152 x := v_1
34153 if !(z.Op != OpConst16 && x.Op != OpConst16) {
34154 break
34155 }
34156 v.reset(OpSub16)
34157 v0 := b.NewValue0(v.Pos, OpAdd16, t)
34158 v0.AddArg2(z, x)
34159 v.AddArg2(i, v0)
34160 return true
34161 }
34162
34163
34164
34165 for {
34166 if v_0.Op != OpAdd16 {
34167 break
34168 }
34169 _ = v_0.Args[1]
34170 v_0_0 := v_0.Args[0]
34171 v_0_1 := v_0.Args[1]
34172 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34173 z := v_0_0
34174 i := v_0_1
34175 if i.Op != OpConst16 {
34176 continue
34177 }
34178 t := i.Type
34179 x := v_1
34180 if !(z.Op != OpConst16 && x.Op != OpConst16) {
34181 continue
34182 }
34183 v.reset(OpAdd16)
34184 v0 := b.NewValue0(v.Pos, OpSub16, t)
34185 v0.AddArg2(z, x)
34186 v.AddArg2(i, v0)
34187 return true
34188 }
34189 break
34190 }
34191
34192
34193 for {
34194 if v_0.Op != OpConst16 {
34195 break
34196 }
34197 t := v_0.Type
34198 c := auxIntToInt16(v_0.AuxInt)
34199 if v_1.Op != OpSub16 {
34200 break
34201 }
34202 x := v_1.Args[1]
34203 v_1_0 := v_1.Args[0]
34204 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
34205 break
34206 }
34207 d := auxIntToInt16(v_1_0.AuxInt)
34208 v.reset(OpAdd16)
34209 v0 := b.NewValue0(v.Pos, OpConst16, t)
34210 v0.AuxInt = int16ToAuxInt(c - d)
34211 v.AddArg2(v0, x)
34212 return true
34213 }
34214
34215
34216 for {
34217 if v_0.Op != OpConst16 {
34218 break
34219 }
34220 t := v_0.Type
34221 c := auxIntToInt16(v_0.AuxInt)
34222 if v_1.Op != OpAdd16 {
34223 break
34224 }
34225 _ = v_1.Args[1]
34226 v_1_0 := v_1.Args[0]
34227 v_1_1 := v_1.Args[1]
34228 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34229 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
34230 continue
34231 }
34232 d := auxIntToInt16(v_1_0.AuxInt)
34233 x := v_1_1
34234 v.reset(OpSub16)
34235 v0 := b.NewValue0(v.Pos, OpConst16, t)
34236 v0.AuxInt = int16ToAuxInt(c - d)
34237 v.AddArg2(v0, x)
34238 return true
34239 }
34240 break
34241 }
34242 return false
34243 }
34244 func rewriteValuegeneric_OpSub32(v *Value) bool {
34245 v_1 := v.Args[1]
34246 v_0 := v.Args[0]
34247 b := v.Block
34248
34249
34250 for {
34251 if v_0.Op != OpConst32 {
34252 break
34253 }
34254 c := auxIntToInt32(v_0.AuxInt)
34255 if v_1.Op != OpConst32 {
34256 break
34257 }
34258 d := auxIntToInt32(v_1.AuxInt)
34259 v.reset(OpConst32)
34260 v.AuxInt = int32ToAuxInt(c - d)
34261 return true
34262 }
34263
34264
34265
34266 for {
34267 x := v_0
34268 if v_1.Op != OpConst32 {
34269 break
34270 }
34271 t := v_1.Type
34272 c := auxIntToInt32(v_1.AuxInt)
34273 if !(x.Op != OpConst32) {
34274 break
34275 }
34276 v.reset(OpAdd32)
34277 v0 := b.NewValue0(v.Pos, OpConst32, t)
34278 v0.AuxInt = int32ToAuxInt(-c)
34279 v.AddArg2(v0, x)
34280 return true
34281 }
34282
34283
34284 for {
34285 t := v.Type
34286 if v_0.Op != OpMul32 {
34287 break
34288 }
34289 _ = v_0.Args[1]
34290 v_0_0 := v_0.Args[0]
34291 v_0_1 := v_0.Args[1]
34292 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34293 x := v_0_0
34294 y := v_0_1
34295 if v_1.Op != OpMul32 {
34296 continue
34297 }
34298 _ = v_1.Args[1]
34299 v_1_0 := v_1.Args[0]
34300 v_1_1 := v_1.Args[1]
34301 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34302 if x != v_1_0 {
34303 continue
34304 }
34305 z := v_1_1
34306 v.reset(OpMul32)
34307 v0 := b.NewValue0(v.Pos, OpSub32, t)
34308 v0.AddArg2(y, z)
34309 v.AddArg2(x, v0)
34310 return true
34311 }
34312 }
34313 break
34314 }
34315
34316
34317 for {
34318 x := v_0
34319 if x != v_1 {
34320 break
34321 }
34322 v.reset(OpConst32)
34323 v.AuxInt = int32ToAuxInt(0)
34324 return true
34325 }
34326
34327
34328 for {
34329 if v_0.Op != OpNeg32 {
34330 break
34331 }
34332 x := v_0.Args[0]
34333 if v_1.Op != OpCom32 || x != v_1.Args[0] {
34334 break
34335 }
34336 v.reset(OpConst32)
34337 v.AuxInt = int32ToAuxInt(1)
34338 return true
34339 }
34340
34341
34342 for {
34343 if v_0.Op != OpCom32 {
34344 break
34345 }
34346 x := v_0.Args[0]
34347 if v_1.Op != OpNeg32 || x != v_1.Args[0] {
34348 break
34349 }
34350 v.reset(OpConst32)
34351 v.AuxInt = int32ToAuxInt(-1)
34352 return true
34353 }
34354
34355
34356 for {
34357 if v_0.Op != OpAdd32 {
34358 break
34359 }
34360 _ = v_0.Args[1]
34361 v_0_0 := v_0.Args[0]
34362 v_0_1 := v_0.Args[1]
34363 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34364 t := v_0_0
34365 x := v_0_1
34366 if v_1.Op != OpAdd32 {
34367 continue
34368 }
34369 _ = v_1.Args[1]
34370 v_1_0 := v_1.Args[0]
34371 v_1_1 := v_1.Args[1]
34372 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34373 if t != v_1_0 {
34374 continue
34375 }
34376 y := v_1_1
34377 v.reset(OpSub32)
34378 v.AddArg2(x, y)
34379 return true
34380 }
34381 }
34382 break
34383 }
34384
34385
34386 for {
34387 if v_0.Op != OpAdd32 {
34388 break
34389 }
34390 _ = v_0.Args[1]
34391 v_0_0 := v_0.Args[0]
34392 v_0_1 := v_0.Args[1]
34393 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34394 x := v_0_0
34395 y := v_0_1
34396 if x != v_1 {
34397 continue
34398 }
34399 v.copyOf(y)
34400 return true
34401 }
34402 break
34403 }
34404
34405
34406 for {
34407 if v_0.Op != OpAdd32 {
34408 break
34409 }
34410 _ = v_0.Args[1]
34411 v_0_0 := v_0.Args[0]
34412 v_0_1 := v_0.Args[1]
34413 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34414 x := v_0_0
34415 y := v_0_1
34416 if y != v_1 {
34417 continue
34418 }
34419 v.copyOf(x)
34420 return true
34421 }
34422 break
34423 }
34424
34425
34426 for {
34427 if v_0.Op != OpSub32 {
34428 break
34429 }
34430 y := v_0.Args[1]
34431 x := v_0.Args[0]
34432 if x != v_1 {
34433 break
34434 }
34435 v.reset(OpNeg32)
34436 v.AddArg(y)
34437 return true
34438 }
34439
34440
34441 for {
34442 x := v_0
34443 if v_1.Op != OpAdd32 {
34444 break
34445 }
34446 _ = v_1.Args[1]
34447 v_1_0 := v_1.Args[0]
34448 v_1_1 := v_1.Args[1]
34449 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34450 if x != v_1_0 {
34451 continue
34452 }
34453 y := v_1_1
34454 v.reset(OpNeg32)
34455 v.AddArg(y)
34456 return true
34457 }
34458 break
34459 }
34460
34461
34462
34463 for {
34464 x := v_0
34465 if v_1.Op != OpSub32 {
34466 break
34467 }
34468 z := v_1.Args[1]
34469 i := v_1.Args[0]
34470 if i.Op != OpConst32 {
34471 break
34472 }
34473 t := i.Type
34474 if !(z.Op != OpConst32 && x.Op != OpConst32) {
34475 break
34476 }
34477 v.reset(OpSub32)
34478 v0 := b.NewValue0(v.Pos, OpAdd32, t)
34479 v0.AddArg2(x, z)
34480 v.AddArg2(v0, i)
34481 return true
34482 }
34483
34484
34485
34486 for {
34487 x := v_0
34488 if v_1.Op != OpAdd32 {
34489 break
34490 }
34491 _ = v_1.Args[1]
34492 v_1_0 := v_1.Args[0]
34493 v_1_1 := v_1.Args[1]
34494 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34495 z := v_1_0
34496 i := v_1_1
34497 if i.Op != OpConst32 {
34498 continue
34499 }
34500 t := i.Type
34501 if !(z.Op != OpConst32 && x.Op != OpConst32) {
34502 continue
34503 }
34504 v.reset(OpSub32)
34505 v0 := b.NewValue0(v.Pos, OpSub32, t)
34506 v0.AddArg2(x, z)
34507 v.AddArg2(v0, i)
34508 return true
34509 }
34510 break
34511 }
34512
34513
34514
34515 for {
34516 if v_0.Op != OpSub32 {
34517 break
34518 }
34519 z := v_0.Args[1]
34520 i := v_0.Args[0]
34521 if i.Op != OpConst32 {
34522 break
34523 }
34524 t := i.Type
34525 x := v_1
34526 if !(z.Op != OpConst32 && x.Op != OpConst32) {
34527 break
34528 }
34529 v.reset(OpSub32)
34530 v0 := b.NewValue0(v.Pos, OpAdd32, t)
34531 v0.AddArg2(z, x)
34532 v.AddArg2(i, v0)
34533 return true
34534 }
34535
34536
34537
34538 for {
34539 if v_0.Op != OpAdd32 {
34540 break
34541 }
34542 _ = v_0.Args[1]
34543 v_0_0 := v_0.Args[0]
34544 v_0_1 := v_0.Args[1]
34545 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34546 z := v_0_0
34547 i := v_0_1
34548 if i.Op != OpConst32 {
34549 continue
34550 }
34551 t := i.Type
34552 x := v_1
34553 if !(z.Op != OpConst32 && x.Op != OpConst32) {
34554 continue
34555 }
34556 v.reset(OpAdd32)
34557 v0 := b.NewValue0(v.Pos, OpSub32, t)
34558 v0.AddArg2(z, x)
34559 v.AddArg2(i, v0)
34560 return true
34561 }
34562 break
34563 }
34564
34565
34566 for {
34567 if v_0.Op != OpConst32 {
34568 break
34569 }
34570 t := v_0.Type
34571 c := auxIntToInt32(v_0.AuxInt)
34572 if v_1.Op != OpSub32 {
34573 break
34574 }
34575 x := v_1.Args[1]
34576 v_1_0 := v_1.Args[0]
34577 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
34578 break
34579 }
34580 d := auxIntToInt32(v_1_0.AuxInt)
34581 v.reset(OpAdd32)
34582 v0 := b.NewValue0(v.Pos, OpConst32, t)
34583 v0.AuxInt = int32ToAuxInt(c - d)
34584 v.AddArg2(v0, x)
34585 return true
34586 }
34587
34588
34589 for {
34590 if v_0.Op != OpConst32 {
34591 break
34592 }
34593 t := v_0.Type
34594 c := auxIntToInt32(v_0.AuxInt)
34595 if v_1.Op != OpAdd32 {
34596 break
34597 }
34598 _ = v_1.Args[1]
34599 v_1_0 := v_1.Args[0]
34600 v_1_1 := v_1.Args[1]
34601 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34602 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
34603 continue
34604 }
34605 d := auxIntToInt32(v_1_0.AuxInt)
34606 x := v_1_1
34607 v.reset(OpSub32)
34608 v0 := b.NewValue0(v.Pos, OpConst32, t)
34609 v0.AuxInt = int32ToAuxInt(c - d)
34610 v.AddArg2(v0, x)
34611 return true
34612 }
34613 break
34614 }
34615 return false
34616 }
34617 func rewriteValuegeneric_OpSub32F(v *Value) bool {
34618 v_1 := v.Args[1]
34619 v_0 := v.Args[0]
34620
34621
34622
34623 for {
34624 if v_0.Op != OpConst32F {
34625 break
34626 }
34627 c := auxIntToFloat32(v_0.AuxInt)
34628 if v_1.Op != OpConst32F {
34629 break
34630 }
34631 d := auxIntToFloat32(v_1.AuxInt)
34632 if !(c-d == c-d) {
34633 break
34634 }
34635 v.reset(OpConst32F)
34636 v.AuxInt = float32ToAuxInt(c - d)
34637 return true
34638 }
34639 return false
34640 }
34641 func rewriteValuegeneric_OpSub64(v *Value) bool {
34642 v_1 := v.Args[1]
34643 v_0 := v.Args[0]
34644 b := v.Block
34645
34646
34647 for {
34648 if v_0.Op != OpConst64 {
34649 break
34650 }
34651 c := auxIntToInt64(v_0.AuxInt)
34652 if v_1.Op != OpConst64 {
34653 break
34654 }
34655 d := auxIntToInt64(v_1.AuxInt)
34656 v.reset(OpConst64)
34657 v.AuxInt = int64ToAuxInt(c - d)
34658 return true
34659 }
34660
34661
34662
34663 for {
34664 x := v_0
34665 if v_1.Op != OpConst64 {
34666 break
34667 }
34668 t := v_1.Type
34669 c := auxIntToInt64(v_1.AuxInt)
34670 if !(x.Op != OpConst64) {
34671 break
34672 }
34673 v.reset(OpAdd64)
34674 v0 := b.NewValue0(v.Pos, OpConst64, t)
34675 v0.AuxInt = int64ToAuxInt(-c)
34676 v.AddArg2(v0, x)
34677 return true
34678 }
34679
34680
34681 for {
34682 t := v.Type
34683 if v_0.Op != OpMul64 {
34684 break
34685 }
34686 _ = v_0.Args[1]
34687 v_0_0 := v_0.Args[0]
34688 v_0_1 := v_0.Args[1]
34689 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34690 x := v_0_0
34691 y := v_0_1
34692 if v_1.Op != OpMul64 {
34693 continue
34694 }
34695 _ = v_1.Args[1]
34696 v_1_0 := v_1.Args[0]
34697 v_1_1 := v_1.Args[1]
34698 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34699 if x != v_1_0 {
34700 continue
34701 }
34702 z := v_1_1
34703 v.reset(OpMul64)
34704 v0 := b.NewValue0(v.Pos, OpSub64, t)
34705 v0.AddArg2(y, z)
34706 v.AddArg2(x, v0)
34707 return true
34708 }
34709 }
34710 break
34711 }
34712
34713
34714 for {
34715 x := v_0
34716 if x != v_1 {
34717 break
34718 }
34719 v.reset(OpConst64)
34720 v.AuxInt = int64ToAuxInt(0)
34721 return true
34722 }
34723
34724
34725 for {
34726 if v_0.Op != OpNeg64 {
34727 break
34728 }
34729 x := v_0.Args[0]
34730 if v_1.Op != OpCom64 || x != v_1.Args[0] {
34731 break
34732 }
34733 v.reset(OpConst64)
34734 v.AuxInt = int64ToAuxInt(1)
34735 return true
34736 }
34737
34738
34739 for {
34740 if v_0.Op != OpCom64 {
34741 break
34742 }
34743 x := v_0.Args[0]
34744 if v_1.Op != OpNeg64 || x != v_1.Args[0] {
34745 break
34746 }
34747 v.reset(OpConst64)
34748 v.AuxInt = int64ToAuxInt(-1)
34749 return true
34750 }
34751
34752
34753 for {
34754 if v_0.Op != OpAdd64 {
34755 break
34756 }
34757 _ = v_0.Args[1]
34758 v_0_0 := v_0.Args[0]
34759 v_0_1 := v_0.Args[1]
34760 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34761 t := v_0_0
34762 x := v_0_1
34763 if v_1.Op != OpAdd64 {
34764 continue
34765 }
34766 _ = v_1.Args[1]
34767 v_1_0 := v_1.Args[0]
34768 v_1_1 := v_1.Args[1]
34769 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34770 if t != v_1_0 {
34771 continue
34772 }
34773 y := v_1_1
34774 v.reset(OpSub64)
34775 v.AddArg2(x, y)
34776 return true
34777 }
34778 }
34779 break
34780 }
34781
34782
34783 for {
34784 if v_0.Op != OpAdd64 {
34785 break
34786 }
34787 _ = v_0.Args[1]
34788 v_0_0 := v_0.Args[0]
34789 v_0_1 := v_0.Args[1]
34790 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34791 x := v_0_0
34792 y := v_0_1
34793 if x != v_1 {
34794 continue
34795 }
34796 v.copyOf(y)
34797 return true
34798 }
34799 break
34800 }
34801
34802
34803 for {
34804 if v_0.Op != OpAdd64 {
34805 break
34806 }
34807 _ = v_0.Args[1]
34808 v_0_0 := v_0.Args[0]
34809 v_0_1 := v_0.Args[1]
34810 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34811 x := v_0_0
34812 y := v_0_1
34813 if y != v_1 {
34814 continue
34815 }
34816 v.copyOf(x)
34817 return true
34818 }
34819 break
34820 }
34821
34822
34823 for {
34824 if v_0.Op != OpSub64 {
34825 break
34826 }
34827 y := v_0.Args[1]
34828 x := v_0.Args[0]
34829 if x != v_1 {
34830 break
34831 }
34832 v.reset(OpNeg64)
34833 v.AddArg(y)
34834 return true
34835 }
34836
34837
34838 for {
34839 x := v_0
34840 if v_1.Op != OpAdd64 {
34841 break
34842 }
34843 _ = v_1.Args[1]
34844 v_1_0 := v_1.Args[0]
34845 v_1_1 := v_1.Args[1]
34846 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34847 if x != v_1_0 {
34848 continue
34849 }
34850 y := v_1_1
34851 v.reset(OpNeg64)
34852 v.AddArg(y)
34853 return true
34854 }
34855 break
34856 }
34857
34858
34859
34860 for {
34861 x := v_0
34862 if v_1.Op != OpSub64 {
34863 break
34864 }
34865 z := v_1.Args[1]
34866 i := v_1.Args[0]
34867 if i.Op != OpConst64 {
34868 break
34869 }
34870 t := i.Type
34871 if !(z.Op != OpConst64 && x.Op != OpConst64) {
34872 break
34873 }
34874 v.reset(OpSub64)
34875 v0 := b.NewValue0(v.Pos, OpAdd64, t)
34876 v0.AddArg2(x, z)
34877 v.AddArg2(v0, i)
34878 return true
34879 }
34880
34881
34882
34883 for {
34884 x := v_0
34885 if v_1.Op != OpAdd64 {
34886 break
34887 }
34888 _ = v_1.Args[1]
34889 v_1_0 := v_1.Args[0]
34890 v_1_1 := v_1.Args[1]
34891 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34892 z := v_1_0
34893 i := v_1_1
34894 if i.Op != OpConst64 {
34895 continue
34896 }
34897 t := i.Type
34898 if !(z.Op != OpConst64 && x.Op != OpConst64) {
34899 continue
34900 }
34901 v.reset(OpSub64)
34902 v0 := b.NewValue0(v.Pos, OpSub64, t)
34903 v0.AddArg2(x, z)
34904 v.AddArg2(v0, i)
34905 return true
34906 }
34907 break
34908 }
34909
34910
34911
34912 for {
34913 if v_0.Op != OpSub64 {
34914 break
34915 }
34916 z := v_0.Args[1]
34917 i := v_0.Args[0]
34918 if i.Op != OpConst64 {
34919 break
34920 }
34921 t := i.Type
34922 x := v_1
34923 if !(z.Op != OpConst64 && x.Op != OpConst64) {
34924 break
34925 }
34926 v.reset(OpSub64)
34927 v0 := b.NewValue0(v.Pos, OpAdd64, t)
34928 v0.AddArg2(z, x)
34929 v.AddArg2(i, v0)
34930 return true
34931 }
34932
34933
34934
34935 for {
34936 if v_0.Op != OpAdd64 {
34937 break
34938 }
34939 _ = v_0.Args[1]
34940 v_0_0 := v_0.Args[0]
34941 v_0_1 := v_0.Args[1]
34942 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34943 z := v_0_0
34944 i := v_0_1
34945 if i.Op != OpConst64 {
34946 continue
34947 }
34948 t := i.Type
34949 x := v_1
34950 if !(z.Op != OpConst64 && x.Op != OpConst64) {
34951 continue
34952 }
34953 v.reset(OpAdd64)
34954 v0 := b.NewValue0(v.Pos, OpSub64, t)
34955 v0.AddArg2(z, x)
34956 v.AddArg2(i, v0)
34957 return true
34958 }
34959 break
34960 }
34961
34962
34963 for {
34964 if v_0.Op != OpConst64 {
34965 break
34966 }
34967 t := v_0.Type
34968 c := auxIntToInt64(v_0.AuxInt)
34969 if v_1.Op != OpSub64 {
34970 break
34971 }
34972 x := v_1.Args[1]
34973 v_1_0 := v_1.Args[0]
34974 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
34975 break
34976 }
34977 d := auxIntToInt64(v_1_0.AuxInt)
34978 v.reset(OpAdd64)
34979 v0 := b.NewValue0(v.Pos, OpConst64, t)
34980 v0.AuxInt = int64ToAuxInt(c - d)
34981 v.AddArg2(v0, x)
34982 return true
34983 }
34984
34985
34986 for {
34987 if v_0.Op != OpConst64 {
34988 break
34989 }
34990 t := v_0.Type
34991 c := auxIntToInt64(v_0.AuxInt)
34992 if v_1.Op != OpAdd64 {
34993 break
34994 }
34995 _ = v_1.Args[1]
34996 v_1_0 := v_1.Args[0]
34997 v_1_1 := v_1.Args[1]
34998 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34999 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
35000 continue
35001 }
35002 d := auxIntToInt64(v_1_0.AuxInt)
35003 x := v_1_1
35004 v.reset(OpSub64)
35005 v0 := b.NewValue0(v.Pos, OpConst64, t)
35006 v0.AuxInt = int64ToAuxInt(c - d)
35007 v.AddArg2(v0, x)
35008 return true
35009 }
35010 break
35011 }
35012 return false
35013 }
35014 func rewriteValuegeneric_OpSub64F(v *Value) bool {
35015 v_1 := v.Args[1]
35016 v_0 := v.Args[0]
35017
35018
35019
35020 for {
35021 if v_0.Op != OpConst64F {
35022 break
35023 }
35024 c := auxIntToFloat64(v_0.AuxInt)
35025 if v_1.Op != OpConst64F {
35026 break
35027 }
35028 d := auxIntToFloat64(v_1.AuxInt)
35029 if !(c-d == c-d) {
35030 break
35031 }
35032 v.reset(OpConst64F)
35033 v.AuxInt = float64ToAuxInt(c - d)
35034 return true
35035 }
35036 return false
35037 }
35038 func rewriteValuegeneric_OpSub8(v *Value) bool {
35039 v_1 := v.Args[1]
35040 v_0 := v.Args[0]
35041 b := v.Block
35042
35043
35044 for {
35045 if v_0.Op != OpConst8 {
35046 break
35047 }
35048 c := auxIntToInt8(v_0.AuxInt)
35049 if v_1.Op != OpConst8 {
35050 break
35051 }
35052 d := auxIntToInt8(v_1.AuxInt)
35053 v.reset(OpConst8)
35054 v.AuxInt = int8ToAuxInt(c - d)
35055 return true
35056 }
35057
35058
35059
35060 for {
35061 x := v_0
35062 if v_1.Op != OpConst8 {
35063 break
35064 }
35065 t := v_1.Type
35066 c := auxIntToInt8(v_1.AuxInt)
35067 if !(x.Op != OpConst8) {
35068 break
35069 }
35070 v.reset(OpAdd8)
35071 v0 := b.NewValue0(v.Pos, OpConst8, t)
35072 v0.AuxInt = int8ToAuxInt(-c)
35073 v.AddArg2(v0, x)
35074 return true
35075 }
35076
35077
35078 for {
35079 t := v.Type
35080 if v_0.Op != OpMul8 {
35081 break
35082 }
35083 _ = v_0.Args[1]
35084 v_0_0 := v_0.Args[0]
35085 v_0_1 := v_0.Args[1]
35086 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35087 x := v_0_0
35088 y := v_0_1
35089 if v_1.Op != OpMul8 {
35090 continue
35091 }
35092 _ = v_1.Args[1]
35093 v_1_0 := v_1.Args[0]
35094 v_1_1 := v_1.Args[1]
35095 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35096 if x != v_1_0 {
35097 continue
35098 }
35099 z := v_1_1
35100 v.reset(OpMul8)
35101 v0 := b.NewValue0(v.Pos, OpSub8, t)
35102 v0.AddArg2(y, z)
35103 v.AddArg2(x, v0)
35104 return true
35105 }
35106 }
35107 break
35108 }
35109
35110
35111 for {
35112 x := v_0
35113 if x != v_1 {
35114 break
35115 }
35116 v.reset(OpConst8)
35117 v.AuxInt = int8ToAuxInt(0)
35118 return true
35119 }
35120
35121
35122 for {
35123 if v_0.Op != OpNeg8 {
35124 break
35125 }
35126 x := v_0.Args[0]
35127 if v_1.Op != OpCom8 || x != v_1.Args[0] {
35128 break
35129 }
35130 v.reset(OpConst8)
35131 v.AuxInt = int8ToAuxInt(1)
35132 return true
35133 }
35134
35135
35136 for {
35137 if v_0.Op != OpCom8 {
35138 break
35139 }
35140 x := v_0.Args[0]
35141 if v_1.Op != OpNeg8 || x != v_1.Args[0] {
35142 break
35143 }
35144 v.reset(OpConst8)
35145 v.AuxInt = int8ToAuxInt(-1)
35146 return true
35147 }
35148
35149
35150 for {
35151 if v_0.Op != OpAdd8 {
35152 break
35153 }
35154 _ = v_0.Args[1]
35155 v_0_0 := v_0.Args[0]
35156 v_0_1 := v_0.Args[1]
35157 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35158 t := v_0_0
35159 x := v_0_1
35160 if v_1.Op != OpAdd8 {
35161 continue
35162 }
35163 _ = v_1.Args[1]
35164 v_1_0 := v_1.Args[0]
35165 v_1_1 := v_1.Args[1]
35166 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35167 if t != v_1_0 {
35168 continue
35169 }
35170 y := v_1_1
35171 v.reset(OpSub8)
35172 v.AddArg2(x, y)
35173 return true
35174 }
35175 }
35176 break
35177 }
35178
35179
35180 for {
35181 if v_0.Op != OpAdd8 {
35182 break
35183 }
35184 _ = v_0.Args[1]
35185 v_0_0 := v_0.Args[0]
35186 v_0_1 := v_0.Args[1]
35187 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35188 x := v_0_0
35189 y := v_0_1
35190 if x != v_1 {
35191 continue
35192 }
35193 v.copyOf(y)
35194 return true
35195 }
35196 break
35197 }
35198
35199
35200 for {
35201 if v_0.Op != OpAdd8 {
35202 break
35203 }
35204 _ = v_0.Args[1]
35205 v_0_0 := v_0.Args[0]
35206 v_0_1 := v_0.Args[1]
35207 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35208 x := v_0_0
35209 y := v_0_1
35210 if y != v_1 {
35211 continue
35212 }
35213 v.copyOf(x)
35214 return true
35215 }
35216 break
35217 }
35218
35219
35220 for {
35221 if v_0.Op != OpSub8 {
35222 break
35223 }
35224 y := v_0.Args[1]
35225 x := v_0.Args[0]
35226 if x != v_1 {
35227 break
35228 }
35229 v.reset(OpNeg8)
35230 v.AddArg(y)
35231 return true
35232 }
35233
35234
35235 for {
35236 x := v_0
35237 if v_1.Op != OpAdd8 {
35238 break
35239 }
35240 _ = v_1.Args[1]
35241 v_1_0 := v_1.Args[0]
35242 v_1_1 := v_1.Args[1]
35243 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
35244 if x != v_1_0 {
35245 continue
35246 }
35247 y := v_1_1
35248 v.reset(OpNeg8)
35249 v.AddArg(y)
35250 return true
35251 }
35252 break
35253 }
35254
35255
35256
35257 for {
35258 x := v_0
35259 if v_1.Op != OpSub8 {
35260 break
35261 }
35262 z := v_1.Args[1]
35263 i := v_1.Args[0]
35264 if i.Op != OpConst8 {
35265 break
35266 }
35267 t := i.Type
35268 if !(z.Op != OpConst8 && x.Op != OpConst8) {
35269 break
35270 }
35271 v.reset(OpSub8)
35272 v0 := b.NewValue0(v.Pos, OpAdd8, t)
35273 v0.AddArg2(x, z)
35274 v.AddArg2(v0, i)
35275 return true
35276 }
35277
35278
35279
35280 for {
35281 x := v_0
35282 if v_1.Op != OpAdd8 {
35283 break
35284 }
35285 _ = v_1.Args[1]
35286 v_1_0 := v_1.Args[0]
35287 v_1_1 := v_1.Args[1]
35288 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
35289 z := v_1_0
35290 i := v_1_1
35291 if i.Op != OpConst8 {
35292 continue
35293 }
35294 t := i.Type
35295 if !(z.Op != OpConst8 && x.Op != OpConst8) {
35296 continue
35297 }
35298 v.reset(OpSub8)
35299 v0 := b.NewValue0(v.Pos, OpSub8, t)
35300 v0.AddArg2(x, z)
35301 v.AddArg2(v0, i)
35302 return true
35303 }
35304 break
35305 }
35306
35307
35308
35309 for {
35310 if v_0.Op != OpSub8 {
35311 break
35312 }
35313 z := v_0.Args[1]
35314 i := v_0.Args[0]
35315 if i.Op != OpConst8 {
35316 break
35317 }
35318 t := i.Type
35319 x := v_1
35320 if !(z.Op != OpConst8 && x.Op != OpConst8) {
35321 break
35322 }
35323 v.reset(OpSub8)
35324 v0 := b.NewValue0(v.Pos, OpAdd8, t)
35325 v0.AddArg2(z, x)
35326 v.AddArg2(i, v0)
35327 return true
35328 }
35329
35330
35331
35332 for {
35333 if v_0.Op != OpAdd8 {
35334 break
35335 }
35336 _ = v_0.Args[1]
35337 v_0_0 := v_0.Args[0]
35338 v_0_1 := v_0.Args[1]
35339 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35340 z := v_0_0
35341 i := v_0_1
35342 if i.Op != OpConst8 {
35343 continue
35344 }
35345 t := i.Type
35346 x := v_1
35347 if !(z.Op != OpConst8 && x.Op != OpConst8) {
35348 continue
35349 }
35350 v.reset(OpAdd8)
35351 v0 := b.NewValue0(v.Pos, OpSub8, t)
35352 v0.AddArg2(z, x)
35353 v.AddArg2(i, v0)
35354 return true
35355 }
35356 break
35357 }
35358
35359
35360 for {
35361 if v_0.Op != OpConst8 {
35362 break
35363 }
35364 t := v_0.Type
35365 c := auxIntToInt8(v_0.AuxInt)
35366 if v_1.Op != OpSub8 {
35367 break
35368 }
35369 x := v_1.Args[1]
35370 v_1_0 := v_1.Args[0]
35371 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
35372 break
35373 }
35374 d := auxIntToInt8(v_1_0.AuxInt)
35375 v.reset(OpAdd8)
35376 v0 := b.NewValue0(v.Pos, OpConst8, t)
35377 v0.AuxInt = int8ToAuxInt(c - d)
35378 v.AddArg2(v0, x)
35379 return true
35380 }
35381
35382
35383 for {
35384 if v_0.Op != OpConst8 {
35385 break
35386 }
35387 t := v_0.Type
35388 c := auxIntToInt8(v_0.AuxInt)
35389 if v_1.Op != OpAdd8 {
35390 break
35391 }
35392 _ = v_1.Args[1]
35393 v_1_0 := v_1.Args[0]
35394 v_1_1 := v_1.Args[1]
35395 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
35396 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
35397 continue
35398 }
35399 d := auxIntToInt8(v_1_0.AuxInt)
35400 x := v_1_1
35401 v.reset(OpSub8)
35402 v0 := b.NewValue0(v.Pos, OpConst8, t)
35403 v0.AuxInt = int8ToAuxInt(c - d)
35404 v.AddArg2(v0, x)
35405 return true
35406 }
35407 break
35408 }
35409 return false
35410 }
35411 func rewriteValuegeneric_OpTrunc(v *Value) bool {
35412 v_0 := v.Args[0]
35413
35414
35415 for {
35416 if v_0.Op != OpConst64F {
35417 break
35418 }
35419 c := auxIntToFloat64(v_0.AuxInt)
35420 v.reset(OpConst64F)
35421 v.AuxInt = float64ToAuxInt(math.Trunc(c))
35422 return true
35423 }
35424 return false
35425 }
35426 func rewriteValuegeneric_OpTrunc16to8(v *Value) bool {
35427 v_0 := v.Args[0]
35428
35429
35430 for {
35431 if v_0.Op != OpConst16 {
35432 break
35433 }
35434 c := auxIntToInt16(v_0.AuxInt)
35435 v.reset(OpConst8)
35436 v.AuxInt = int8ToAuxInt(int8(c))
35437 return true
35438 }
35439
35440
35441 for {
35442 if v_0.Op != OpZeroExt8to16 {
35443 break
35444 }
35445 x := v_0.Args[0]
35446 v.copyOf(x)
35447 return true
35448 }
35449
35450
35451 for {
35452 if v_0.Op != OpSignExt8to16 {
35453 break
35454 }
35455 x := v_0.Args[0]
35456 v.copyOf(x)
35457 return true
35458 }
35459
35460
35461
35462 for {
35463 if v_0.Op != OpAnd16 {
35464 break
35465 }
35466 _ = v_0.Args[1]
35467 v_0_0 := v_0.Args[0]
35468 v_0_1 := v_0.Args[1]
35469 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35470 if v_0_0.Op != OpConst16 {
35471 continue
35472 }
35473 y := auxIntToInt16(v_0_0.AuxInt)
35474 x := v_0_1
35475 if !(y&0xFF == 0xFF) {
35476 continue
35477 }
35478 v.reset(OpTrunc16to8)
35479 v.AddArg(x)
35480 return true
35481 }
35482 break
35483 }
35484 return false
35485 }
35486 func rewriteValuegeneric_OpTrunc32to16(v *Value) bool {
35487 v_0 := v.Args[0]
35488
35489
35490 for {
35491 if v_0.Op != OpConst32 {
35492 break
35493 }
35494 c := auxIntToInt32(v_0.AuxInt)
35495 v.reset(OpConst16)
35496 v.AuxInt = int16ToAuxInt(int16(c))
35497 return true
35498 }
35499
35500
35501 for {
35502 if v_0.Op != OpZeroExt8to32 {
35503 break
35504 }
35505 x := v_0.Args[0]
35506 v.reset(OpZeroExt8to16)
35507 v.AddArg(x)
35508 return true
35509 }
35510
35511
35512 for {
35513 if v_0.Op != OpZeroExt16to32 {
35514 break
35515 }
35516 x := v_0.Args[0]
35517 v.copyOf(x)
35518 return true
35519 }
35520
35521
35522 for {
35523 if v_0.Op != OpSignExt8to32 {
35524 break
35525 }
35526 x := v_0.Args[0]
35527 v.reset(OpSignExt8to16)
35528 v.AddArg(x)
35529 return true
35530 }
35531
35532
35533 for {
35534 if v_0.Op != OpSignExt16to32 {
35535 break
35536 }
35537 x := v_0.Args[0]
35538 v.copyOf(x)
35539 return true
35540 }
35541
35542
35543
35544 for {
35545 if v_0.Op != OpAnd32 {
35546 break
35547 }
35548 _ = v_0.Args[1]
35549 v_0_0 := v_0.Args[0]
35550 v_0_1 := v_0.Args[1]
35551 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35552 if v_0_0.Op != OpConst32 {
35553 continue
35554 }
35555 y := auxIntToInt32(v_0_0.AuxInt)
35556 x := v_0_1
35557 if !(y&0xFFFF == 0xFFFF) {
35558 continue
35559 }
35560 v.reset(OpTrunc32to16)
35561 v.AddArg(x)
35562 return true
35563 }
35564 break
35565 }
35566 return false
35567 }
35568 func rewriteValuegeneric_OpTrunc32to8(v *Value) bool {
35569 v_0 := v.Args[0]
35570
35571
35572 for {
35573 if v_0.Op != OpConst32 {
35574 break
35575 }
35576 c := auxIntToInt32(v_0.AuxInt)
35577 v.reset(OpConst8)
35578 v.AuxInt = int8ToAuxInt(int8(c))
35579 return true
35580 }
35581
35582
35583 for {
35584 if v_0.Op != OpZeroExt8to32 {
35585 break
35586 }
35587 x := v_0.Args[0]
35588 v.copyOf(x)
35589 return true
35590 }
35591
35592
35593 for {
35594 if v_0.Op != OpSignExt8to32 {
35595 break
35596 }
35597 x := v_0.Args[0]
35598 v.copyOf(x)
35599 return true
35600 }
35601
35602
35603
35604 for {
35605 if v_0.Op != OpAnd32 {
35606 break
35607 }
35608 _ = v_0.Args[1]
35609 v_0_0 := v_0.Args[0]
35610 v_0_1 := v_0.Args[1]
35611 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35612 if v_0_0.Op != OpConst32 {
35613 continue
35614 }
35615 y := auxIntToInt32(v_0_0.AuxInt)
35616 x := v_0_1
35617 if !(y&0xFF == 0xFF) {
35618 continue
35619 }
35620 v.reset(OpTrunc32to8)
35621 v.AddArg(x)
35622 return true
35623 }
35624 break
35625 }
35626 return false
35627 }
35628 func rewriteValuegeneric_OpTrunc64to16(v *Value) bool {
35629 v_0 := v.Args[0]
35630
35631
35632 for {
35633 if v_0.Op != OpConst64 {
35634 break
35635 }
35636 c := auxIntToInt64(v_0.AuxInt)
35637 v.reset(OpConst16)
35638 v.AuxInt = int16ToAuxInt(int16(c))
35639 return true
35640 }
35641
35642
35643 for {
35644 if v_0.Op != OpZeroExt8to64 {
35645 break
35646 }
35647 x := v_0.Args[0]
35648 v.reset(OpZeroExt8to16)
35649 v.AddArg(x)
35650 return true
35651 }
35652
35653
35654 for {
35655 if v_0.Op != OpZeroExt16to64 {
35656 break
35657 }
35658 x := v_0.Args[0]
35659 v.copyOf(x)
35660 return true
35661 }
35662
35663
35664 for {
35665 if v_0.Op != OpSignExt8to64 {
35666 break
35667 }
35668 x := v_0.Args[0]
35669 v.reset(OpSignExt8to16)
35670 v.AddArg(x)
35671 return true
35672 }
35673
35674
35675 for {
35676 if v_0.Op != OpSignExt16to64 {
35677 break
35678 }
35679 x := v_0.Args[0]
35680 v.copyOf(x)
35681 return true
35682 }
35683
35684
35685
35686 for {
35687 if v_0.Op != OpAnd64 {
35688 break
35689 }
35690 _ = v_0.Args[1]
35691 v_0_0 := v_0.Args[0]
35692 v_0_1 := v_0.Args[1]
35693 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35694 if v_0_0.Op != OpConst64 {
35695 continue
35696 }
35697 y := auxIntToInt64(v_0_0.AuxInt)
35698 x := v_0_1
35699 if !(y&0xFFFF == 0xFFFF) {
35700 continue
35701 }
35702 v.reset(OpTrunc64to16)
35703 v.AddArg(x)
35704 return true
35705 }
35706 break
35707 }
35708 return false
35709 }
35710 func rewriteValuegeneric_OpTrunc64to32(v *Value) bool {
35711 v_0 := v.Args[0]
35712
35713
35714 for {
35715 if v_0.Op != OpConst64 {
35716 break
35717 }
35718 c := auxIntToInt64(v_0.AuxInt)
35719 v.reset(OpConst32)
35720 v.AuxInt = int32ToAuxInt(int32(c))
35721 return true
35722 }
35723
35724
35725 for {
35726 if v_0.Op != OpZeroExt8to64 {
35727 break
35728 }
35729 x := v_0.Args[0]
35730 v.reset(OpZeroExt8to32)
35731 v.AddArg(x)
35732 return true
35733 }
35734
35735
35736 for {
35737 if v_0.Op != OpZeroExt16to64 {
35738 break
35739 }
35740 x := v_0.Args[0]
35741 v.reset(OpZeroExt16to32)
35742 v.AddArg(x)
35743 return true
35744 }
35745
35746
35747 for {
35748 if v_0.Op != OpZeroExt32to64 {
35749 break
35750 }
35751 x := v_0.Args[0]
35752 v.copyOf(x)
35753 return true
35754 }
35755
35756
35757 for {
35758 if v_0.Op != OpSignExt8to64 {
35759 break
35760 }
35761 x := v_0.Args[0]
35762 v.reset(OpSignExt8to32)
35763 v.AddArg(x)
35764 return true
35765 }
35766
35767
35768 for {
35769 if v_0.Op != OpSignExt16to64 {
35770 break
35771 }
35772 x := v_0.Args[0]
35773 v.reset(OpSignExt16to32)
35774 v.AddArg(x)
35775 return true
35776 }
35777
35778
35779 for {
35780 if v_0.Op != OpSignExt32to64 {
35781 break
35782 }
35783 x := v_0.Args[0]
35784 v.copyOf(x)
35785 return true
35786 }
35787
35788
35789
35790 for {
35791 if v_0.Op != OpAnd64 {
35792 break
35793 }
35794 _ = v_0.Args[1]
35795 v_0_0 := v_0.Args[0]
35796 v_0_1 := v_0.Args[1]
35797 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35798 if v_0_0.Op != OpConst64 {
35799 continue
35800 }
35801 y := auxIntToInt64(v_0_0.AuxInt)
35802 x := v_0_1
35803 if !(y&0xFFFFFFFF == 0xFFFFFFFF) {
35804 continue
35805 }
35806 v.reset(OpTrunc64to32)
35807 v.AddArg(x)
35808 return true
35809 }
35810 break
35811 }
35812 return false
35813 }
35814 func rewriteValuegeneric_OpTrunc64to8(v *Value) bool {
35815 v_0 := v.Args[0]
35816
35817
35818 for {
35819 if v_0.Op != OpConst64 {
35820 break
35821 }
35822 c := auxIntToInt64(v_0.AuxInt)
35823 v.reset(OpConst8)
35824 v.AuxInt = int8ToAuxInt(int8(c))
35825 return true
35826 }
35827
35828
35829 for {
35830 if v_0.Op != OpZeroExt8to64 {
35831 break
35832 }
35833 x := v_0.Args[0]
35834 v.copyOf(x)
35835 return true
35836 }
35837
35838
35839 for {
35840 if v_0.Op != OpSignExt8to64 {
35841 break
35842 }
35843 x := v_0.Args[0]
35844 v.copyOf(x)
35845 return true
35846 }
35847
35848
35849
35850 for {
35851 if v_0.Op != OpAnd64 {
35852 break
35853 }
35854 _ = v_0.Args[1]
35855 v_0_0 := v_0.Args[0]
35856 v_0_1 := v_0.Args[1]
35857 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35858 if v_0_0.Op != OpConst64 {
35859 continue
35860 }
35861 y := auxIntToInt64(v_0_0.AuxInt)
35862 x := v_0_1
35863 if !(y&0xFF == 0xFF) {
35864 continue
35865 }
35866 v.reset(OpTrunc64to8)
35867 v.AddArg(x)
35868 return true
35869 }
35870 break
35871 }
35872 return false
35873 }
35874 func rewriteValuegeneric_OpXor16(v *Value) bool {
35875 v_1 := v.Args[1]
35876 v_0 := v.Args[0]
35877 b := v.Block
35878 config := b.Func.Config
35879
35880
35881 for {
35882 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35883 if v_0.Op != OpConst16 {
35884 continue
35885 }
35886 c := auxIntToInt16(v_0.AuxInt)
35887 if v_1.Op != OpConst16 {
35888 continue
35889 }
35890 d := auxIntToInt16(v_1.AuxInt)
35891 v.reset(OpConst16)
35892 v.AuxInt = int16ToAuxInt(c ^ d)
35893 return true
35894 }
35895 break
35896 }
35897
35898
35899 for {
35900 x := v_0
35901 if x != v_1 {
35902 break
35903 }
35904 v.reset(OpConst16)
35905 v.AuxInt = int16ToAuxInt(0)
35906 return true
35907 }
35908
35909
35910 for {
35911 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35912 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
35913 continue
35914 }
35915 x := v_1
35916 v.copyOf(x)
35917 return true
35918 }
35919 break
35920 }
35921
35922
35923 for {
35924 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35925 if v_0.Op != OpCom16 {
35926 continue
35927 }
35928 x := v_0.Args[0]
35929 if x != v_1 {
35930 continue
35931 }
35932 v.reset(OpConst16)
35933 v.AuxInt = int16ToAuxInt(-1)
35934 return true
35935 }
35936 break
35937 }
35938
35939
35940 for {
35941 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35942 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
35943 continue
35944 }
35945 x := v_1
35946 v.reset(OpCom16)
35947 v.AddArg(x)
35948 return true
35949 }
35950 break
35951 }
35952
35953
35954 for {
35955 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35956 x := v_0
35957 if v_1.Op != OpXor16 {
35958 continue
35959 }
35960 _ = v_1.Args[1]
35961 v_1_0 := v_1.Args[0]
35962 v_1_1 := v_1.Args[1]
35963 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35964 if x != v_1_0 {
35965 continue
35966 }
35967 y := v_1_1
35968 v.copyOf(y)
35969 return true
35970 }
35971 }
35972 break
35973 }
35974
35975
35976
35977 for {
35978 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35979 if v_0.Op != OpXor16 {
35980 continue
35981 }
35982 _ = v_0.Args[1]
35983 v_0_0 := v_0.Args[0]
35984 v_0_1 := v_0.Args[1]
35985 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
35986 i := v_0_0
35987 if i.Op != OpConst16 {
35988 continue
35989 }
35990 t := i.Type
35991 z := v_0_1
35992 x := v_1
35993 if !(z.Op != OpConst16 && x.Op != OpConst16) {
35994 continue
35995 }
35996 v.reset(OpXor16)
35997 v0 := b.NewValue0(v.Pos, OpXor16, t)
35998 v0.AddArg2(z, x)
35999 v.AddArg2(i, v0)
36000 return true
36001 }
36002 }
36003 break
36004 }
36005
36006
36007 for {
36008 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36009 if v_0.Op != OpConst16 {
36010 continue
36011 }
36012 t := v_0.Type
36013 c := auxIntToInt16(v_0.AuxInt)
36014 if v_1.Op != OpXor16 {
36015 continue
36016 }
36017 _ = v_1.Args[1]
36018 v_1_0 := v_1.Args[0]
36019 v_1_1 := v_1.Args[1]
36020 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36021 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
36022 continue
36023 }
36024 d := auxIntToInt16(v_1_0.AuxInt)
36025 x := v_1_1
36026 v.reset(OpXor16)
36027 v0 := b.NewValue0(v.Pos, OpConst16, t)
36028 v0.AuxInt = int16ToAuxInt(c ^ d)
36029 v.AddArg2(v0, x)
36030 return true
36031 }
36032 }
36033 break
36034 }
36035
36036
36037
36038 for {
36039 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36040 if v_0.Op != OpLsh16x64 {
36041 continue
36042 }
36043 _ = v_0.Args[1]
36044 x := v_0.Args[0]
36045 z := v_0.Args[1]
36046 if z.Op != OpConst64 {
36047 continue
36048 }
36049 c := auxIntToInt64(z.AuxInt)
36050 if v_1.Op != OpRsh16Ux64 {
36051 continue
36052 }
36053 _ = v_1.Args[1]
36054 if x != v_1.Args[0] {
36055 continue
36056 }
36057 v_1_1 := v_1.Args[1]
36058 if v_1_1.Op != OpConst64 {
36059 continue
36060 }
36061 d := auxIntToInt64(v_1_1.AuxInt)
36062 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
36063 continue
36064 }
36065 v.reset(OpRotateLeft16)
36066 v.AddArg2(x, z)
36067 return true
36068 }
36069 break
36070 }
36071
36072
36073
36074 for {
36075 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36076 left := v_0
36077 if left.Op != OpLsh16x64 {
36078 continue
36079 }
36080 y := left.Args[1]
36081 x := left.Args[0]
36082 right := v_1
36083 if right.Op != OpRsh16Ux64 {
36084 continue
36085 }
36086 _ = right.Args[1]
36087 if x != right.Args[0] {
36088 continue
36089 }
36090 right_1 := right.Args[1]
36091 if right_1.Op != OpSub64 {
36092 continue
36093 }
36094 _ = right_1.Args[1]
36095 right_1_0 := right_1.Args[0]
36096 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
36097 continue
36098 }
36099 v.reset(OpRotateLeft16)
36100 v.AddArg2(x, y)
36101 return true
36102 }
36103 break
36104 }
36105
36106
36107
36108 for {
36109 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36110 left := v_0
36111 if left.Op != OpLsh16x32 {
36112 continue
36113 }
36114 y := left.Args[1]
36115 x := left.Args[0]
36116 right := v_1
36117 if right.Op != OpRsh16Ux32 {
36118 continue
36119 }
36120 _ = right.Args[1]
36121 if x != right.Args[0] {
36122 continue
36123 }
36124 right_1 := right.Args[1]
36125 if right_1.Op != OpSub32 {
36126 continue
36127 }
36128 _ = right_1.Args[1]
36129 right_1_0 := right_1.Args[0]
36130 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
36131 continue
36132 }
36133 v.reset(OpRotateLeft16)
36134 v.AddArg2(x, y)
36135 return true
36136 }
36137 break
36138 }
36139
36140
36141
36142 for {
36143 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36144 left := v_0
36145 if left.Op != OpLsh16x16 {
36146 continue
36147 }
36148 y := left.Args[1]
36149 x := left.Args[0]
36150 right := v_1
36151 if right.Op != OpRsh16Ux16 {
36152 continue
36153 }
36154 _ = right.Args[1]
36155 if x != right.Args[0] {
36156 continue
36157 }
36158 right_1 := right.Args[1]
36159 if right_1.Op != OpSub16 {
36160 continue
36161 }
36162 _ = right_1.Args[1]
36163 right_1_0 := right_1.Args[0]
36164 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
36165 continue
36166 }
36167 v.reset(OpRotateLeft16)
36168 v.AddArg2(x, y)
36169 return true
36170 }
36171 break
36172 }
36173
36174
36175
36176 for {
36177 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36178 left := v_0
36179 if left.Op != OpLsh16x8 {
36180 continue
36181 }
36182 y := left.Args[1]
36183 x := left.Args[0]
36184 right := v_1
36185 if right.Op != OpRsh16Ux8 {
36186 continue
36187 }
36188 _ = right.Args[1]
36189 if x != right.Args[0] {
36190 continue
36191 }
36192 right_1 := right.Args[1]
36193 if right_1.Op != OpSub8 {
36194 continue
36195 }
36196 _ = right_1.Args[1]
36197 right_1_0 := right_1.Args[0]
36198 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
36199 continue
36200 }
36201 v.reset(OpRotateLeft16)
36202 v.AddArg2(x, y)
36203 return true
36204 }
36205 break
36206 }
36207
36208
36209
36210 for {
36211 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36212 right := v_0
36213 if right.Op != OpRsh16Ux64 {
36214 continue
36215 }
36216 y := right.Args[1]
36217 x := right.Args[0]
36218 left := v_1
36219 if left.Op != OpLsh16x64 {
36220 continue
36221 }
36222 _ = left.Args[1]
36223 if x != left.Args[0] {
36224 continue
36225 }
36226 z := left.Args[1]
36227 if z.Op != OpSub64 {
36228 continue
36229 }
36230 _ = z.Args[1]
36231 z_0 := z.Args[0]
36232 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
36233 continue
36234 }
36235 v.reset(OpRotateLeft16)
36236 v.AddArg2(x, z)
36237 return true
36238 }
36239 break
36240 }
36241
36242
36243
36244 for {
36245 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36246 right := v_0
36247 if right.Op != OpRsh16Ux32 {
36248 continue
36249 }
36250 y := right.Args[1]
36251 x := right.Args[0]
36252 left := v_1
36253 if left.Op != OpLsh16x32 {
36254 continue
36255 }
36256 _ = left.Args[1]
36257 if x != left.Args[0] {
36258 continue
36259 }
36260 z := left.Args[1]
36261 if z.Op != OpSub32 {
36262 continue
36263 }
36264 _ = z.Args[1]
36265 z_0 := z.Args[0]
36266 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
36267 continue
36268 }
36269 v.reset(OpRotateLeft16)
36270 v.AddArg2(x, z)
36271 return true
36272 }
36273 break
36274 }
36275
36276
36277
36278 for {
36279 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36280 right := v_0
36281 if right.Op != OpRsh16Ux16 {
36282 continue
36283 }
36284 y := right.Args[1]
36285 x := right.Args[0]
36286 left := v_1
36287 if left.Op != OpLsh16x16 {
36288 continue
36289 }
36290 _ = left.Args[1]
36291 if x != left.Args[0] {
36292 continue
36293 }
36294 z := left.Args[1]
36295 if z.Op != OpSub16 {
36296 continue
36297 }
36298 _ = z.Args[1]
36299 z_0 := z.Args[0]
36300 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
36301 continue
36302 }
36303 v.reset(OpRotateLeft16)
36304 v.AddArg2(x, z)
36305 return true
36306 }
36307 break
36308 }
36309
36310
36311
36312 for {
36313 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36314 right := v_0
36315 if right.Op != OpRsh16Ux8 {
36316 continue
36317 }
36318 y := right.Args[1]
36319 x := right.Args[0]
36320 left := v_1
36321 if left.Op != OpLsh16x8 {
36322 continue
36323 }
36324 _ = left.Args[1]
36325 if x != left.Args[0] {
36326 continue
36327 }
36328 z := left.Args[1]
36329 if z.Op != OpSub8 {
36330 continue
36331 }
36332 _ = z.Args[1]
36333 z_0 := z.Args[0]
36334 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
36335 continue
36336 }
36337 v.reset(OpRotateLeft16)
36338 v.AddArg2(x, z)
36339 return true
36340 }
36341 break
36342 }
36343 return false
36344 }
36345 func rewriteValuegeneric_OpXor32(v *Value) bool {
36346 v_1 := v.Args[1]
36347 v_0 := v.Args[0]
36348 b := v.Block
36349 config := b.Func.Config
36350
36351
36352 for {
36353 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36354 if v_0.Op != OpConst32 {
36355 continue
36356 }
36357 c := auxIntToInt32(v_0.AuxInt)
36358 if v_1.Op != OpConst32 {
36359 continue
36360 }
36361 d := auxIntToInt32(v_1.AuxInt)
36362 v.reset(OpConst32)
36363 v.AuxInt = int32ToAuxInt(c ^ d)
36364 return true
36365 }
36366 break
36367 }
36368
36369
36370 for {
36371 x := v_0
36372 if x != v_1 {
36373 break
36374 }
36375 v.reset(OpConst32)
36376 v.AuxInt = int32ToAuxInt(0)
36377 return true
36378 }
36379
36380
36381 for {
36382 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36383 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
36384 continue
36385 }
36386 x := v_1
36387 v.copyOf(x)
36388 return true
36389 }
36390 break
36391 }
36392
36393
36394 for {
36395 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36396 if v_0.Op != OpCom32 {
36397 continue
36398 }
36399 x := v_0.Args[0]
36400 if x != v_1 {
36401 continue
36402 }
36403 v.reset(OpConst32)
36404 v.AuxInt = int32ToAuxInt(-1)
36405 return true
36406 }
36407 break
36408 }
36409
36410
36411 for {
36412 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36413 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
36414 continue
36415 }
36416 x := v_1
36417 v.reset(OpCom32)
36418 v.AddArg(x)
36419 return true
36420 }
36421 break
36422 }
36423
36424
36425 for {
36426 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36427 x := v_0
36428 if v_1.Op != OpXor32 {
36429 continue
36430 }
36431 _ = v_1.Args[1]
36432 v_1_0 := v_1.Args[0]
36433 v_1_1 := v_1.Args[1]
36434 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36435 if x != v_1_0 {
36436 continue
36437 }
36438 y := v_1_1
36439 v.copyOf(y)
36440 return true
36441 }
36442 }
36443 break
36444 }
36445
36446
36447
36448 for {
36449 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36450 if v_0.Op != OpXor32 {
36451 continue
36452 }
36453 _ = v_0.Args[1]
36454 v_0_0 := v_0.Args[0]
36455 v_0_1 := v_0.Args[1]
36456 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
36457 i := v_0_0
36458 if i.Op != OpConst32 {
36459 continue
36460 }
36461 t := i.Type
36462 z := v_0_1
36463 x := v_1
36464 if !(z.Op != OpConst32 && x.Op != OpConst32) {
36465 continue
36466 }
36467 v.reset(OpXor32)
36468 v0 := b.NewValue0(v.Pos, OpXor32, t)
36469 v0.AddArg2(z, x)
36470 v.AddArg2(i, v0)
36471 return true
36472 }
36473 }
36474 break
36475 }
36476
36477
36478 for {
36479 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36480 if v_0.Op != OpConst32 {
36481 continue
36482 }
36483 t := v_0.Type
36484 c := auxIntToInt32(v_0.AuxInt)
36485 if v_1.Op != OpXor32 {
36486 continue
36487 }
36488 _ = v_1.Args[1]
36489 v_1_0 := v_1.Args[0]
36490 v_1_1 := v_1.Args[1]
36491 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36492 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
36493 continue
36494 }
36495 d := auxIntToInt32(v_1_0.AuxInt)
36496 x := v_1_1
36497 v.reset(OpXor32)
36498 v0 := b.NewValue0(v.Pos, OpConst32, t)
36499 v0.AuxInt = int32ToAuxInt(c ^ d)
36500 v.AddArg2(v0, x)
36501 return true
36502 }
36503 }
36504 break
36505 }
36506
36507
36508
36509 for {
36510 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36511 if v_0.Op != OpLsh32x64 {
36512 continue
36513 }
36514 _ = v_0.Args[1]
36515 x := v_0.Args[0]
36516 z := v_0.Args[1]
36517 if z.Op != OpConst64 {
36518 continue
36519 }
36520 c := auxIntToInt64(z.AuxInt)
36521 if v_1.Op != OpRsh32Ux64 {
36522 continue
36523 }
36524 _ = v_1.Args[1]
36525 if x != v_1.Args[0] {
36526 continue
36527 }
36528 v_1_1 := v_1.Args[1]
36529 if v_1_1.Op != OpConst64 {
36530 continue
36531 }
36532 d := auxIntToInt64(v_1_1.AuxInt)
36533 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
36534 continue
36535 }
36536 v.reset(OpRotateLeft32)
36537 v.AddArg2(x, z)
36538 return true
36539 }
36540 break
36541 }
36542
36543
36544
36545 for {
36546 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36547 left := v_0
36548 if left.Op != OpLsh32x64 {
36549 continue
36550 }
36551 y := left.Args[1]
36552 x := left.Args[0]
36553 right := v_1
36554 if right.Op != OpRsh32Ux64 {
36555 continue
36556 }
36557 _ = right.Args[1]
36558 if x != right.Args[0] {
36559 continue
36560 }
36561 right_1 := right.Args[1]
36562 if right_1.Op != OpSub64 {
36563 continue
36564 }
36565 _ = right_1.Args[1]
36566 right_1_0 := right_1.Args[0]
36567 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
36568 continue
36569 }
36570 v.reset(OpRotateLeft32)
36571 v.AddArg2(x, y)
36572 return true
36573 }
36574 break
36575 }
36576
36577
36578
36579 for {
36580 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36581 left := v_0
36582 if left.Op != OpLsh32x32 {
36583 continue
36584 }
36585 y := left.Args[1]
36586 x := left.Args[0]
36587 right := v_1
36588 if right.Op != OpRsh32Ux32 {
36589 continue
36590 }
36591 _ = right.Args[1]
36592 if x != right.Args[0] {
36593 continue
36594 }
36595 right_1 := right.Args[1]
36596 if right_1.Op != OpSub32 {
36597 continue
36598 }
36599 _ = right_1.Args[1]
36600 right_1_0 := right_1.Args[0]
36601 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
36602 continue
36603 }
36604 v.reset(OpRotateLeft32)
36605 v.AddArg2(x, y)
36606 return true
36607 }
36608 break
36609 }
36610
36611
36612
36613 for {
36614 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36615 left := v_0
36616 if left.Op != OpLsh32x16 {
36617 continue
36618 }
36619 y := left.Args[1]
36620 x := left.Args[0]
36621 right := v_1
36622 if right.Op != OpRsh32Ux16 {
36623 continue
36624 }
36625 _ = right.Args[1]
36626 if x != right.Args[0] {
36627 continue
36628 }
36629 right_1 := right.Args[1]
36630 if right_1.Op != OpSub16 {
36631 continue
36632 }
36633 _ = right_1.Args[1]
36634 right_1_0 := right_1.Args[0]
36635 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
36636 continue
36637 }
36638 v.reset(OpRotateLeft32)
36639 v.AddArg2(x, y)
36640 return true
36641 }
36642 break
36643 }
36644
36645
36646
36647 for {
36648 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36649 left := v_0
36650 if left.Op != OpLsh32x8 {
36651 continue
36652 }
36653 y := left.Args[1]
36654 x := left.Args[0]
36655 right := v_1
36656 if right.Op != OpRsh32Ux8 {
36657 continue
36658 }
36659 _ = right.Args[1]
36660 if x != right.Args[0] {
36661 continue
36662 }
36663 right_1 := right.Args[1]
36664 if right_1.Op != OpSub8 {
36665 continue
36666 }
36667 _ = right_1.Args[1]
36668 right_1_0 := right_1.Args[0]
36669 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
36670 continue
36671 }
36672 v.reset(OpRotateLeft32)
36673 v.AddArg2(x, y)
36674 return true
36675 }
36676 break
36677 }
36678
36679
36680
36681 for {
36682 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36683 right := v_0
36684 if right.Op != OpRsh32Ux64 {
36685 continue
36686 }
36687 y := right.Args[1]
36688 x := right.Args[0]
36689 left := v_1
36690 if left.Op != OpLsh32x64 {
36691 continue
36692 }
36693 _ = left.Args[1]
36694 if x != left.Args[0] {
36695 continue
36696 }
36697 z := left.Args[1]
36698 if z.Op != OpSub64 {
36699 continue
36700 }
36701 _ = z.Args[1]
36702 z_0 := z.Args[0]
36703 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
36704 continue
36705 }
36706 v.reset(OpRotateLeft32)
36707 v.AddArg2(x, z)
36708 return true
36709 }
36710 break
36711 }
36712
36713
36714
36715 for {
36716 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36717 right := v_0
36718 if right.Op != OpRsh32Ux32 {
36719 continue
36720 }
36721 y := right.Args[1]
36722 x := right.Args[0]
36723 left := v_1
36724 if left.Op != OpLsh32x32 {
36725 continue
36726 }
36727 _ = left.Args[1]
36728 if x != left.Args[0] {
36729 continue
36730 }
36731 z := left.Args[1]
36732 if z.Op != OpSub32 {
36733 continue
36734 }
36735 _ = z.Args[1]
36736 z_0 := z.Args[0]
36737 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
36738 continue
36739 }
36740 v.reset(OpRotateLeft32)
36741 v.AddArg2(x, z)
36742 return true
36743 }
36744 break
36745 }
36746
36747
36748
36749 for {
36750 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36751 right := v_0
36752 if right.Op != OpRsh32Ux16 {
36753 continue
36754 }
36755 y := right.Args[1]
36756 x := right.Args[0]
36757 left := v_1
36758 if left.Op != OpLsh32x16 {
36759 continue
36760 }
36761 _ = left.Args[1]
36762 if x != left.Args[0] {
36763 continue
36764 }
36765 z := left.Args[1]
36766 if z.Op != OpSub16 {
36767 continue
36768 }
36769 _ = z.Args[1]
36770 z_0 := z.Args[0]
36771 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
36772 continue
36773 }
36774 v.reset(OpRotateLeft32)
36775 v.AddArg2(x, z)
36776 return true
36777 }
36778 break
36779 }
36780
36781
36782
36783 for {
36784 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36785 right := v_0
36786 if right.Op != OpRsh32Ux8 {
36787 continue
36788 }
36789 y := right.Args[1]
36790 x := right.Args[0]
36791 left := v_1
36792 if left.Op != OpLsh32x8 {
36793 continue
36794 }
36795 _ = left.Args[1]
36796 if x != left.Args[0] {
36797 continue
36798 }
36799 z := left.Args[1]
36800 if z.Op != OpSub8 {
36801 continue
36802 }
36803 _ = z.Args[1]
36804 z_0 := z.Args[0]
36805 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
36806 continue
36807 }
36808 v.reset(OpRotateLeft32)
36809 v.AddArg2(x, z)
36810 return true
36811 }
36812 break
36813 }
36814 return false
36815 }
36816 func rewriteValuegeneric_OpXor64(v *Value) bool {
36817 v_1 := v.Args[1]
36818 v_0 := v.Args[0]
36819 b := v.Block
36820 config := b.Func.Config
36821
36822
36823 for {
36824 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36825 if v_0.Op != OpConst64 {
36826 continue
36827 }
36828 c := auxIntToInt64(v_0.AuxInt)
36829 if v_1.Op != OpConst64 {
36830 continue
36831 }
36832 d := auxIntToInt64(v_1.AuxInt)
36833 v.reset(OpConst64)
36834 v.AuxInt = int64ToAuxInt(c ^ d)
36835 return true
36836 }
36837 break
36838 }
36839
36840
36841 for {
36842 x := v_0
36843 if x != v_1 {
36844 break
36845 }
36846 v.reset(OpConst64)
36847 v.AuxInt = int64ToAuxInt(0)
36848 return true
36849 }
36850
36851
36852 for {
36853 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36854 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
36855 continue
36856 }
36857 x := v_1
36858 v.copyOf(x)
36859 return true
36860 }
36861 break
36862 }
36863
36864
36865 for {
36866 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36867 if v_0.Op != OpCom64 {
36868 continue
36869 }
36870 x := v_0.Args[0]
36871 if x != v_1 {
36872 continue
36873 }
36874 v.reset(OpConst64)
36875 v.AuxInt = int64ToAuxInt(-1)
36876 return true
36877 }
36878 break
36879 }
36880
36881
36882 for {
36883 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36884 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
36885 continue
36886 }
36887 x := v_1
36888 v.reset(OpCom64)
36889 v.AddArg(x)
36890 return true
36891 }
36892 break
36893 }
36894
36895
36896 for {
36897 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36898 x := v_0
36899 if v_1.Op != OpXor64 {
36900 continue
36901 }
36902 _ = v_1.Args[1]
36903 v_1_0 := v_1.Args[0]
36904 v_1_1 := v_1.Args[1]
36905 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36906 if x != v_1_0 {
36907 continue
36908 }
36909 y := v_1_1
36910 v.copyOf(y)
36911 return true
36912 }
36913 }
36914 break
36915 }
36916
36917
36918
36919 for {
36920 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36921 if v_0.Op != OpXor64 {
36922 continue
36923 }
36924 _ = v_0.Args[1]
36925 v_0_0 := v_0.Args[0]
36926 v_0_1 := v_0.Args[1]
36927 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
36928 i := v_0_0
36929 if i.Op != OpConst64 {
36930 continue
36931 }
36932 t := i.Type
36933 z := v_0_1
36934 x := v_1
36935 if !(z.Op != OpConst64 && x.Op != OpConst64) {
36936 continue
36937 }
36938 v.reset(OpXor64)
36939 v0 := b.NewValue0(v.Pos, OpXor64, t)
36940 v0.AddArg2(z, x)
36941 v.AddArg2(i, v0)
36942 return true
36943 }
36944 }
36945 break
36946 }
36947
36948
36949 for {
36950 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36951 if v_0.Op != OpConst64 {
36952 continue
36953 }
36954 t := v_0.Type
36955 c := auxIntToInt64(v_0.AuxInt)
36956 if v_1.Op != OpXor64 {
36957 continue
36958 }
36959 _ = v_1.Args[1]
36960 v_1_0 := v_1.Args[0]
36961 v_1_1 := v_1.Args[1]
36962 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36963 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
36964 continue
36965 }
36966 d := auxIntToInt64(v_1_0.AuxInt)
36967 x := v_1_1
36968 v.reset(OpXor64)
36969 v0 := b.NewValue0(v.Pos, OpConst64, t)
36970 v0.AuxInt = int64ToAuxInt(c ^ d)
36971 v.AddArg2(v0, x)
36972 return true
36973 }
36974 }
36975 break
36976 }
36977
36978
36979
36980 for {
36981 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36982 if v_0.Op != OpLsh64x64 {
36983 continue
36984 }
36985 _ = v_0.Args[1]
36986 x := v_0.Args[0]
36987 z := v_0.Args[1]
36988 if z.Op != OpConst64 {
36989 continue
36990 }
36991 c := auxIntToInt64(z.AuxInt)
36992 if v_1.Op != OpRsh64Ux64 {
36993 continue
36994 }
36995 _ = v_1.Args[1]
36996 if x != v_1.Args[0] {
36997 continue
36998 }
36999 v_1_1 := v_1.Args[1]
37000 if v_1_1.Op != OpConst64 {
37001 continue
37002 }
37003 d := auxIntToInt64(v_1_1.AuxInt)
37004 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
37005 continue
37006 }
37007 v.reset(OpRotateLeft64)
37008 v.AddArg2(x, z)
37009 return true
37010 }
37011 break
37012 }
37013
37014
37015
37016 for {
37017 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37018 left := v_0
37019 if left.Op != OpLsh64x64 {
37020 continue
37021 }
37022 y := left.Args[1]
37023 x := left.Args[0]
37024 right := v_1
37025 if right.Op != OpRsh64Ux64 {
37026 continue
37027 }
37028 _ = right.Args[1]
37029 if x != right.Args[0] {
37030 continue
37031 }
37032 right_1 := right.Args[1]
37033 if right_1.Op != OpSub64 {
37034 continue
37035 }
37036 _ = right_1.Args[1]
37037 right_1_0 := right_1.Args[0]
37038 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
37039 continue
37040 }
37041 v.reset(OpRotateLeft64)
37042 v.AddArg2(x, y)
37043 return true
37044 }
37045 break
37046 }
37047
37048
37049
37050 for {
37051 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37052 left := v_0
37053 if left.Op != OpLsh64x32 {
37054 continue
37055 }
37056 y := left.Args[1]
37057 x := left.Args[0]
37058 right := v_1
37059 if right.Op != OpRsh64Ux32 {
37060 continue
37061 }
37062 _ = right.Args[1]
37063 if x != right.Args[0] {
37064 continue
37065 }
37066 right_1 := right.Args[1]
37067 if right_1.Op != OpSub32 {
37068 continue
37069 }
37070 _ = right_1.Args[1]
37071 right_1_0 := right_1.Args[0]
37072 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
37073 continue
37074 }
37075 v.reset(OpRotateLeft64)
37076 v.AddArg2(x, y)
37077 return true
37078 }
37079 break
37080 }
37081
37082
37083
37084 for {
37085 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37086 left := v_0
37087 if left.Op != OpLsh64x16 {
37088 continue
37089 }
37090 y := left.Args[1]
37091 x := left.Args[0]
37092 right := v_1
37093 if right.Op != OpRsh64Ux16 {
37094 continue
37095 }
37096 _ = right.Args[1]
37097 if x != right.Args[0] {
37098 continue
37099 }
37100 right_1 := right.Args[1]
37101 if right_1.Op != OpSub16 {
37102 continue
37103 }
37104 _ = right_1.Args[1]
37105 right_1_0 := right_1.Args[0]
37106 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
37107 continue
37108 }
37109 v.reset(OpRotateLeft64)
37110 v.AddArg2(x, y)
37111 return true
37112 }
37113 break
37114 }
37115
37116
37117
37118 for {
37119 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37120 left := v_0
37121 if left.Op != OpLsh64x8 {
37122 continue
37123 }
37124 y := left.Args[1]
37125 x := left.Args[0]
37126 right := v_1
37127 if right.Op != OpRsh64Ux8 {
37128 continue
37129 }
37130 _ = right.Args[1]
37131 if x != right.Args[0] {
37132 continue
37133 }
37134 right_1 := right.Args[1]
37135 if right_1.Op != OpSub8 {
37136 continue
37137 }
37138 _ = right_1.Args[1]
37139 right_1_0 := right_1.Args[0]
37140 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
37141 continue
37142 }
37143 v.reset(OpRotateLeft64)
37144 v.AddArg2(x, y)
37145 return true
37146 }
37147 break
37148 }
37149
37150
37151
37152 for {
37153 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37154 right := v_0
37155 if right.Op != OpRsh64Ux64 {
37156 continue
37157 }
37158 y := right.Args[1]
37159 x := right.Args[0]
37160 left := v_1
37161 if left.Op != OpLsh64x64 {
37162 continue
37163 }
37164 _ = left.Args[1]
37165 if x != left.Args[0] {
37166 continue
37167 }
37168 z := left.Args[1]
37169 if z.Op != OpSub64 {
37170 continue
37171 }
37172 _ = z.Args[1]
37173 z_0 := z.Args[0]
37174 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
37175 continue
37176 }
37177 v.reset(OpRotateLeft64)
37178 v.AddArg2(x, z)
37179 return true
37180 }
37181 break
37182 }
37183
37184
37185
37186 for {
37187 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37188 right := v_0
37189 if right.Op != OpRsh64Ux32 {
37190 continue
37191 }
37192 y := right.Args[1]
37193 x := right.Args[0]
37194 left := v_1
37195 if left.Op != OpLsh64x32 {
37196 continue
37197 }
37198 _ = left.Args[1]
37199 if x != left.Args[0] {
37200 continue
37201 }
37202 z := left.Args[1]
37203 if z.Op != OpSub32 {
37204 continue
37205 }
37206 _ = z.Args[1]
37207 z_0 := z.Args[0]
37208 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
37209 continue
37210 }
37211 v.reset(OpRotateLeft64)
37212 v.AddArg2(x, z)
37213 return true
37214 }
37215 break
37216 }
37217
37218
37219
37220 for {
37221 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37222 right := v_0
37223 if right.Op != OpRsh64Ux16 {
37224 continue
37225 }
37226 y := right.Args[1]
37227 x := right.Args[0]
37228 left := v_1
37229 if left.Op != OpLsh64x16 {
37230 continue
37231 }
37232 _ = left.Args[1]
37233 if x != left.Args[0] {
37234 continue
37235 }
37236 z := left.Args[1]
37237 if z.Op != OpSub16 {
37238 continue
37239 }
37240 _ = z.Args[1]
37241 z_0 := z.Args[0]
37242 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
37243 continue
37244 }
37245 v.reset(OpRotateLeft64)
37246 v.AddArg2(x, z)
37247 return true
37248 }
37249 break
37250 }
37251
37252
37253
37254 for {
37255 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37256 right := v_0
37257 if right.Op != OpRsh64Ux8 {
37258 continue
37259 }
37260 y := right.Args[1]
37261 x := right.Args[0]
37262 left := v_1
37263 if left.Op != OpLsh64x8 {
37264 continue
37265 }
37266 _ = left.Args[1]
37267 if x != left.Args[0] {
37268 continue
37269 }
37270 z := left.Args[1]
37271 if z.Op != OpSub8 {
37272 continue
37273 }
37274 _ = z.Args[1]
37275 z_0 := z.Args[0]
37276 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
37277 continue
37278 }
37279 v.reset(OpRotateLeft64)
37280 v.AddArg2(x, z)
37281 return true
37282 }
37283 break
37284 }
37285 return false
37286 }
37287 func rewriteValuegeneric_OpXor8(v *Value) bool {
37288 v_1 := v.Args[1]
37289 v_0 := v.Args[0]
37290 b := v.Block
37291 config := b.Func.Config
37292
37293
37294 for {
37295 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37296 if v_0.Op != OpConst8 {
37297 continue
37298 }
37299 c := auxIntToInt8(v_0.AuxInt)
37300 if v_1.Op != OpConst8 {
37301 continue
37302 }
37303 d := auxIntToInt8(v_1.AuxInt)
37304 v.reset(OpConst8)
37305 v.AuxInt = int8ToAuxInt(c ^ d)
37306 return true
37307 }
37308 break
37309 }
37310
37311
37312 for {
37313 x := v_0
37314 if x != v_1 {
37315 break
37316 }
37317 v.reset(OpConst8)
37318 v.AuxInt = int8ToAuxInt(0)
37319 return true
37320 }
37321
37322
37323 for {
37324 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37325 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
37326 continue
37327 }
37328 x := v_1
37329 v.copyOf(x)
37330 return true
37331 }
37332 break
37333 }
37334
37335
37336 for {
37337 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37338 if v_0.Op != OpCom8 {
37339 continue
37340 }
37341 x := v_0.Args[0]
37342 if x != v_1 {
37343 continue
37344 }
37345 v.reset(OpConst8)
37346 v.AuxInt = int8ToAuxInt(-1)
37347 return true
37348 }
37349 break
37350 }
37351
37352
37353 for {
37354 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37355 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
37356 continue
37357 }
37358 x := v_1
37359 v.reset(OpCom8)
37360 v.AddArg(x)
37361 return true
37362 }
37363 break
37364 }
37365
37366
37367 for {
37368 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37369 x := v_0
37370 if v_1.Op != OpXor8 {
37371 continue
37372 }
37373 _ = v_1.Args[1]
37374 v_1_0 := v_1.Args[0]
37375 v_1_1 := v_1.Args[1]
37376 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
37377 if x != v_1_0 {
37378 continue
37379 }
37380 y := v_1_1
37381 v.copyOf(y)
37382 return true
37383 }
37384 }
37385 break
37386 }
37387
37388
37389
37390 for {
37391 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37392 if v_0.Op != OpXor8 {
37393 continue
37394 }
37395 _ = v_0.Args[1]
37396 v_0_0 := v_0.Args[0]
37397 v_0_1 := v_0.Args[1]
37398 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
37399 i := v_0_0
37400 if i.Op != OpConst8 {
37401 continue
37402 }
37403 t := i.Type
37404 z := v_0_1
37405 x := v_1
37406 if !(z.Op != OpConst8 && x.Op != OpConst8) {
37407 continue
37408 }
37409 v.reset(OpXor8)
37410 v0 := b.NewValue0(v.Pos, OpXor8, t)
37411 v0.AddArg2(z, x)
37412 v.AddArg2(i, v0)
37413 return true
37414 }
37415 }
37416 break
37417 }
37418
37419
37420 for {
37421 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37422 if v_0.Op != OpConst8 {
37423 continue
37424 }
37425 t := v_0.Type
37426 c := auxIntToInt8(v_0.AuxInt)
37427 if v_1.Op != OpXor8 {
37428 continue
37429 }
37430 _ = v_1.Args[1]
37431 v_1_0 := v_1.Args[0]
37432 v_1_1 := v_1.Args[1]
37433 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
37434 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
37435 continue
37436 }
37437 d := auxIntToInt8(v_1_0.AuxInt)
37438 x := v_1_1
37439 v.reset(OpXor8)
37440 v0 := b.NewValue0(v.Pos, OpConst8, t)
37441 v0.AuxInt = int8ToAuxInt(c ^ d)
37442 v.AddArg2(v0, x)
37443 return true
37444 }
37445 }
37446 break
37447 }
37448
37449
37450
37451 for {
37452 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37453 if v_0.Op != OpLsh8x64 {
37454 continue
37455 }
37456 _ = v_0.Args[1]
37457 x := v_0.Args[0]
37458 z := v_0.Args[1]
37459 if z.Op != OpConst64 {
37460 continue
37461 }
37462 c := auxIntToInt64(z.AuxInt)
37463 if v_1.Op != OpRsh8Ux64 {
37464 continue
37465 }
37466 _ = v_1.Args[1]
37467 if x != v_1.Args[0] {
37468 continue
37469 }
37470 v_1_1 := v_1.Args[1]
37471 if v_1_1.Op != OpConst64 {
37472 continue
37473 }
37474 d := auxIntToInt64(v_1_1.AuxInt)
37475 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
37476 continue
37477 }
37478 v.reset(OpRotateLeft8)
37479 v.AddArg2(x, z)
37480 return true
37481 }
37482 break
37483 }
37484
37485
37486
37487 for {
37488 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37489 left := v_0
37490 if left.Op != OpLsh8x64 {
37491 continue
37492 }
37493 y := left.Args[1]
37494 x := left.Args[0]
37495 right := v_1
37496 if right.Op != OpRsh8Ux64 {
37497 continue
37498 }
37499 _ = right.Args[1]
37500 if x != right.Args[0] {
37501 continue
37502 }
37503 right_1 := right.Args[1]
37504 if right_1.Op != OpSub64 {
37505 continue
37506 }
37507 _ = right_1.Args[1]
37508 right_1_0 := right_1.Args[0]
37509 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
37510 continue
37511 }
37512 v.reset(OpRotateLeft8)
37513 v.AddArg2(x, y)
37514 return true
37515 }
37516 break
37517 }
37518
37519
37520
37521 for {
37522 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37523 left := v_0
37524 if left.Op != OpLsh8x32 {
37525 continue
37526 }
37527 y := left.Args[1]
37528 x := left.Args[0]
37529 right := v_1
37530 if right.Op != OpRsh8Ux32 {
37531 continue
37532 }
37533 _ = right.Args[1]
37534 if x != right.Args[0] {
37535 continue
37536 }
37537 right_1 := right.Args[1]
37538 if right_1.Op != OpSub32 {
37539 continue
37540 }
37541 _ = right_1.Args[1]
37542 right_1_0 := right_1.Args[0]
37543 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
37544 continue
37545 }
37546 v.reset(OpRotateLeft8)
37547 v.AddArg2(x, y)
37548 return true
37549 }
37550 break
37551 }
37552
37553
37554
37555 for {
37556 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37557 left := v_0
37558 if left.Op != OpLsh8x16 {
37559 continue
37560 }
37561 y := left.Args[1]
37562 x := left.Args[0]
37563 right := v_1
37564 if right.Op != OpRsh8Ux16 {
37565 continue
37566 }
37567 _ = right.Args[1]
37568 if x != right.Args[0] {
37569 continue
37570 }
37571 right_1 := right.Args[1]
37572 if right_1.Op != OpSub16 {
37573 continue
37574 }
37575 _ = right_1.Args[1]
37576 right_1_0 := right_1.Args[0]
37577 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
37578 continue
37579 }
37580 v.reset(OpRotateLeft8)
37581 v.AddArg2(x, y)
37582 return true
37583 }
37584 break
37585 }
37586
37587
37588
37589 for {
37590 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37591 left := v_0
37592 if left.Op != OpLsh8x8 {
37593 continue
37594 }
37595 y := left.Args[1]
37596 x := left.Args[0]
37597 right := v_1
37598 if right.Op != OpRsh8Ux8 {
37599 continue
37600 }
37601 _ = right.Args[1]
37602 if x != right.Args[0] {
37603 continue
37604 }
37605 right_1 := right.Args[1]
37606 if right_1.Op != OpSub8 {
37607 continue
37608 }
37609 _ = right_1.Args[1]
37610 right_1_0 := right_1.Args[0]
37611 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
37612 continue
37613 }
37614 v.reset(OpRotateLeft8)
37615 v.AddArg2(x, y)
37616 return true
37617 }
37618 break
37619 }
37620
37621
37622
37623 for {
37624 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37625 right := v_0
37626 if right.Op != OpRsh8Ux64 {
37627 continue
37628 }
37629 y := right.Args[1]
37630 x := right.Args[0]
37631 left := v_1
37632 if left.Op != OpLsh8x64 {
37633 continue
37634 }
37635 _ = left.Args[1]
37636 if x != left.Args[0] {
37637 continue
37638 }
37639 z := left.Args[1]
37640 if z.Op != OpSub64 {
37641 continue
37642 }
37643 _ = z.Args[1]
37644 z_0 := z.Args[0]
37645 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
37646 continue
37647 }
37648 v.reset(OpRotateLeft8)
37649 v.AddArg2(x, z)
37650 return true
37651 }
37652 break
37653 }
37654
37655
37656
37657 for {
37658 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37659 right := v_0
37660 if right.Op != OpRsh8Ux32 {
37661 continue
37662 }
37663 y := right.Args[1]
37664 x := right.Args[0]
37665 left := v_1
37666 if left.Op != OpLsh8x32 {
37667 continue
37668 }
37669 _ = left.Args[1]
37670 if x != left.Args[0] {
37671 continue
37672 }
37673 z := left.Args[1]
37674 if z.Op != OpSub32 {
37675 continue
37676 }
37677 _ = z.Args[1]
37678 z_0 := z.Args[0]
37679 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
37680 continue
37681 }
37682 v.reset(OpRotateLeft8)
37683 v.AddArg2(x, z)
37684 return true
37685 }
37686 break
37687 }
37688
37689
37690
37691 for {
37692 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37693 right := v_0
37694 if right.Op != OpRsh8Ux16 {
37695 continue
37696 }
37697 y := right.Args[1]
37698 x := right.Args[0]
37699 left := v_1
37700 if left.Op != OpLsh8x16 {
37701 continue
37702 }
37703 _ = left.Args[1]
37704 if x != left.Args[0] {
37705 continue
37706 }
37707 z := left.Args[1]
37708 if z.Op != OpSub16 {
37709 continue
37710 }
37711 _ = z.Args[1]
37712 z_0 := z.Args[0]
37713 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
37714 continue
37715 }
37716 v.reset(OpRotateLeft8)
37717 v.AddArg2(x, z)
37718 return true
37719 }
37720 break
37721 }
37722
37723
37724
37725 for {
37726 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37727 right := v_0
37728 if right.Op != OpRsh8Ux8 {
37729 continue
37730 }
37731 y := right.Args[1]
37732 x := right.Args[0]
37733 left := v_1
37734 if left.Op != OpLsh8x8 {
37735 continue
37736 }
37737 _ = left.Args[1]
37738 if x != left.Args[0] {
37739 continue
37740 }
37741 z := left.Args[1]
37742 if z.Op != OpSub8 {
37743 continue
37744 }
37745 _ = z.Args[1]
37746 z_0 := z.Args[0]
37747 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
37748 continue
37749 }
37750 v.reset(OpRotateLeft8)
37751 v.AddArg2(x, z)
37752 return true
37753 }
37754 break
37755 }
37756 return false
37757 }
37758 func rewriteValuegeneric_OpZero(v *Value) bool {
37759 v_1 := v.Args[1]
37760 v_0 := v.Args[0]
37761 b := v.Block
37762
37763
37764
37765 for {
37766 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
37767 break
37768 }
37769 call := v_0.Args[0]
37770 if call.Op != OpStaticLECall {
37771 break
37772 }
37773 mem := v_1
37774 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isMalloc(call.Aux)) {
37775 break
37776 }
37777 v.copyOf(mem)
37778 return true
37779 }
37780
37781
37782
37783 for {
37784 n := auxIntToInt64(v.AuxInt)
37785 t1 := auxToType(v.Aux)
37786 p1 := v_0
37787 store := v_1
37788 if store.Op != OpStore {
37789 break
37790 }
37791 t2 := auxToType(store.Aux)
37792 mem := store.Args[2]
37793 store_0 := store.Args[0]
37794 if store_0.Op != OpOffPtr {
37795 break
37796 }
37797 o2 := auxIntToInt64(store_0.AuxInt)
37798 p2 := store_0.Args[0]
37799 if !(isSamePtr(p1, p2) && store.Uses == 1 && n >= o2+t2.Size() && clobber(store)) {
37800 break
37801 }
37802 v.reset(OpZero)
37803 v.AuxInt = int64ToAuxInt(n)
37804 v.Aux = typeToAux(t1)
37805 v.AddArg2(p1, mem)
37806 return true
37807 }
37808
37809
37810
37811 for {
37812 n := auxIntToInt64(v.AuxInt)
37813 t := auxToType(v.Aux)
37814 dst1 := v_0
37815 move := v_1
37816 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
37817 break
37818 }
37819 mem := move.Args[2]
37820 dst2 := move.Args[0]
37821 if !(move.Uses == 1 && isSamePtr(dst1, dst2) && clobber(move)) {
37822 break
37823 }
37824 v.reset(OpZero)
37825 v.AuxInt = int64ToAuxInt(n)
37826 v.Aux = typeToAux(t)
37827 v.AddArg2(dst1, mem)
37828 return true
37829 }
37830
37831
37832
37833 for {
37834 n := auxIntToInt64(v.AuxInt)
37835 t := auxToType(v.Aux)
37836 dst1 := v_0
37837 vardef := v_1
37838 if vardef.Op != OpVarDef {
37839 break
37840 }
37841 x := auxToSym(vardef.Aux)
37842 move := vardef.Args[0]
37843 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
37844 break
37845 }
37846 mem := move.Args[2]
37847 dst2 := move.Args[0]
37848 if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && clobber(move, vardef)) {
37849 break
37850 }
37851 v.reset(OpZero)
37852 v.AuxInt = int64ToAuxInt(n)
37853 v.Aux = typeToAux(t)
37854 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
37855 v0.Aux = symToAux(x)
37856 v0.AddArg(mem)
37857 v.AddArg2(dst1, v0)
37858 return true
37859 }
37860
37861
37862
37863 for {
37864 s := auxIntToInt64(v.AuxInt)
37865 t := auxToType(v.Aux)
37866 dst1 := v_0
37867 zero := v_1
37868 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != s || auxToType(zero.Aux) != t {
37869 break
37870 }
37871 dst2 := zero.Args[0]
37872 if !(isSamePtr(dst1, dst2)) {
37873 break
37874 }
37875 v.copyOf(zero)
37876 return true
37877 }
37878
37879
37880
37881 for {
37882 s := auxIntToInt64(v.AuxInt)
37883 t := auxToType(v.Aux)
37884 dst1 := v_0
37885 vardef := v_1
37886 if vardef.Op != OpVarDef {
37887 break
37888 }
37889 vardef_0 := vardef.Args[0]
37890 if vardef_0.Op != OpZero || auxIntToInt64(vardef_0.AuxInt) != s || auxToType(vardef_0.Aux) != t {
37891 break
37892 }
37893 dst2 := vardef_0.Args[0]
37894 if !(isSamePtr(dst1, dst2)) {
37895 break
37896 }
37897 v.copyOf(vardef)
37898 return true
37899 }
37900 return false
37901 }
37902 func rewriteValuegeneric_OpZeroExt16to32(v *Value) bool {
37903 v_0 := v.Args[0]
37904
37905
37906 for {
37907 if v_0.Op != OpConst16 {
37908 break
37909 }
37910 c := auxIntToInt16(v_0.AuxInt)
37911 v.reset(OpConst32)
37912 v.AuxInt = int32ToAuxInt(int32(uint16(c)))
37913 return true
37914 }
37915
37916
37917
37918 for {
37919 if v_0.Op != OpTrunc32to16 {
37920 break
37921 }
37922 x := v_0.Args[0]
37923 if x.Op != OpRsh32Ux64 {
37924 break
37925 }
37926 _ = x.Args[1]
37927 x_1 := x.Args[1]
37928 if x_1.Op != OpConst64 {
37929 break
37930 }
37931 s := auxIntToInt64(x_1.AuxInt)
37932 if !(s >= 16) {
37933 break
37934 }
37935 v.copyOf(x)
37936 return true
37937 }
37938 return false
37939 }
37940 func rewriteValuegeneric_OpZeroExt16to64(v *Value) bool {
37941 v_0 := v.Args[0]
37942
37943
37944 for {
37945 if v_0.Op != OpConst16 {
37946 break
37947 }
37948 c := auxIntToInt16(v_0.AuxInt)
37949 v.reset(OpConst64)
37950 v.AuxInt = int64ToAuxInt(int64(uint16(c)))
37951 return true
37952 }
37953
37954
37955
37956 for {
37957 if v_0.Op != OpTrunc64to16 {
37958 break
37959 }
37960 x := v_0.Args[0]
37961 if x.Op != OpRsh64Ux64 {
37962 break
37963 }
37964 _ = x.Args[1]
37965 x_1 := x.Args[1]
37966 if x_1.Op != OpConst64 {
37967 break
37968 }
37969 s := auxIntToInt64(x_1.AuxInt)
37970 if !(s >= 48) {
37971 break
37972 }
37973 v.copyOf(x)
37974 return true
37975 }
37976 return false
37977 }
37978 func rewriteValuegeneric_OpZeroExt32to64(v *Value) bool {
37979 v_0 := v.Args[0]
37980
37981
37982 for {
37983 if v_0.Op != OpConst32 {
37984 break
37985 }
37986 c := auxIntToInt32(v_0.AuxInt)
37987 v.reset(OpConst64)
37988 v.AuxInt = int64ToAuxInt(int64(uint32(c)))
37989 return true
37990 }
37991
37992
37993
37994 for {
37995 if v_0.Op != OpTrunc64to32 {
37996 break
37997 }
37998 x := v_0.Args[0]
37999 if x.Op != OpRsh64Ux64 {
38000 break
38001 }
38002 _ = x.Args[1]
38003 x_1 := x.Args[1]
38004 if x_1.Op != OpConst64 {
38005 break
38006 }
38007 s := auxIntToInt64(x_1.AuxInt)
38008 if !(s >= 32) {
38009 break
38010 }
38011 v.copyOf(x)
38012 return true
38013 }
38014 return false
38015 }
38016 func rewriteValuegeneric_OpZeroExt8to16(v *Value) bool {
38017 v_0 := v.Args[0]
38018
38019
38020 for {
38021 if v_0.Op != OpConst8 {
38022 break
38023 }
38024 c := auxIntToInt8(v_0.AuxInt)
38025 v.reset(OpConst16)
38026 v.AuxInt = int16ToAuxInt(int16(uint8(c)))
38027 return true
38028 }
38029
38030
38031
38032 for {
38033 if v_0.Op != OpTrunc16to8 {
38034 break
38035 }
38036 x := v_0.Args[0]
38037 if x.Op != OpRsh16Ux64 {
38038 break
38039 }
38040 _ = x.Args[1]
38041 x_1 := x.Args[1]
38042 if x_1.Op != OpConst64 {
38043 break
38044 }
38045 s := auxIntToInt64(x_1.AuxInt)
38046 if !(s >= 8) {
38047 break
38048 }
38049 v.copyOf(x)
38050 return true
38051 }
38052 return false
38053 }
38054 func rewriteValuegeneric_OpZeroExt8to32(v *Value) bool {
38055 v_0 := v.Args[0]
38056
38057
38058 for {
38059 if v_0.Op != OpConst8 {
38060 break
38061 }
38062 c := auxIntToInt8(v_0.AuxInt)
38063 v.reset(OpConst32)
38064 v.AuxInt = int32ToAuxInt(int32(uint8(c)))
38065 return true
38066 }
38067
38068
38069
38070 for {
38071 if v_0.Op != OpTrunc32to8 {
38072 break
38073 }
38074 x := v_0.Args[0]
38075 if x.Op != OpRsh32Ux64 {
38076 break
38077 }
38078 _ = x.Args[1]
38079 x_1 := x.Args[1]
38080 if x_1.Op != OpConst64 {
38081 break
38082 }
38083 s := auxIntToInt64(x_1.AuxInt)
38084 if !(s >= 24) {
38085 break
38086 }
38087 v.copyOf(x)
38088 return true
38089 }
38090 return false
38091 }
38092 func rewriteValuegeneric_OpZeroExt8to64(v *Value) bool {
38093 v_0 := v.Args[0]
38094
38095
38096 for {
38097 if v_0.Op != OpConst8 {
38098 break
38099 }
38100 c := auxIntToInt8(v_0.AuxInt)
38101 v.reset(OpConst64)
38102 v.AuxInt = int64ToAuxInt(int64(uint8(c)))
38103 return true
38104 }
38105
38106
38107
38108 for {
38109 if v_0.Op != OpTrunc64to8 {
38110 break
38111 }
38112 x := v_0.Args[0]
38113 if x.Op != OpRsh64Ux64 {
38114 break
38115 }
38116 _ = x.Args[1]
38117 x_1 := x.Args[1]
38118 if x_1.Op != OpConst64 {
38119 break
38120 }
38121 s := auxIntToInt64(x_1.AuxInt)
38122 if !(s >= 56) {
38123 break
38124 }
38125 v.copyOf(x)
38126 return true
38127 }
38128 return false
38129 }
38130 func rewriteBlockgeneric(b *Block) bool {
38131 switch b.Kind {
38132 case BlockIf:
38133
38134
38135 for b.Controls[0].Op == OpNot {
38136 v_0 := b.Controls[0]
38137 cond := v_0.Args[0]
38138 b.resetWithControl(BlockIf, cond)
38139 b.swapSuccessors()
38140 return true
38141 }
38142
38143
38144
38145 for b.Controls[0].Op == OpConstBool {
38146 v_0 := b.Controls[0]
38147 c := auxIntToBool(v_0.AuxInt)
38148 if !(c) {
38149 break
38150 }
38151 b.Reset(BlockFirst)
38152 return true
38153 }
38154
38155
38156
38157 for b.Controls[0].Op == OpConstBool {
38158 v_0 := b.Controls[0]
38159 c := auxIntToBool(v_0.AuxInt)
38160 if !(!c) {
38161 break
38162 }
38163 b.Reset(BlockFirst)
38164 b.swapSuccessors()
38165 return true
38166 }
38167 }
38168 return false
38169 }
38170
View as plain text