1
2
3 package ssa
4
5 import "math"
6 import "math/bits"
7 import "cmd/internal/obj"
8 import "cmd/compile/internal/types"
9 import "cmd/compile/internal/ir"
10
11 func rewriteValuegeneric(v *Value) bool {
12 switch v.Op {
13 case OpAdd16:
14 return rewriteValuegeneric_OpAdd16(v)
15 case OpAdd32:
16 return rewriteValuegeneric_OpAdd32(v)
17 case OpAdd32F:
18 return rewriteValuegeneric_OpAdd32F(v)
19 case OpAdd64:
20 return rewriteValuegeneric_OpAdd64(v)
21 case OpAdd64F:
22 return rewriteValuegeneric_OpAdd64F(v)
23 case OpAdd64carry:
24 return rewriteValuegeneric_OpAdd64carry(v)
25 case OpAdd8:
26 return rewriteValuegeneric_OpAdd8(v)
27 case OpAddPtr:
28 return rewriteValuegeneric_OpAddPtr(v)
29 case OpAnd16:
30 return rewriteValuegeneric_OpAnd16(v)
31 case OpAnd32:
32 return rewriteValuegeneric_OpAnd32(v)
33 case OpAnd64:
34 return rewriteValuegeneric_OpAnd64(v)
35 case OpAnd8:
36 return rewriteValuegeneric_OpAnd8(v)
37 case OpAndB:
38 return rewriteValuegeneric_OpAndB(v)
39 case OpArraySelect:
40 return rewriteValuegeneric_OpArraySelect(v)
41 case OpBitLen16:
42 return rewriteValuegeneric_OpBitLen16(v)
43 case OpBitLen32:
44 return rewriteValuegeneric_OpBitLen32(v)
45 case OpBitLen64:
46 return rewriteValuegeneric_OpBitLen64(v)
47 case OpBitLen8:
48 return rewriteValuegeneric_OpBitLen8(v)
49 case OpCeil:
50 return rewriteValuegeneric_OpCeil(v)
51 case OpCom16:
52 return rewriteValuegeneric_OpCom16(v)
53 case OpCom32:
54 return rewriteValuegeneric_OpCom32(v)
55 case OpCom64:
56 return rewriteValuegeneric_OpCom64(v)
57 case OpCom8:
58 return rewriteValuegeneric_OpCom8(v)
59 case OpCondSelect:
60 return rewriteValuegeneric_OpCondSelect(v)
61 case OpConstInterface:
62 return rewriteValuegeneric_OpConstInterface(v)
63 case OpConstSlice:
64 return rewriteValuegeneric_OpConstSlice(v)
65 case OpConstString:
66 return rewriteValuegeneric_OpConstString(v)
67 case OpConvert:
68 return rewriteValuegeneric_OpConvert(v)
69 case OpCtz16:
70 return rewriteValuegeneric_OpCtz16(v)
71 case OpCtz32:
72 return rewriteValuegeneric_OpCtz32(v)
73 case OpCtz64:
74 return rewriteValuegeneric_OpCtz64(v)
75 case OpCtz8:
76 return rewriteValuegeneric_OpCtz8(v)
77 case OpCvt32Fto32:
78 return rewriteValuegeneric_OpCvt32Fto32(v)
79 case OpCvt32Fto64:
80 return rewriteValuegeneric_OpCvt32Fto64(v)
81 case OpCvt32Fto64F:
82 return rewriteValuegeneric_OpCvt32Fto64F(v)
83 case OpCvt32to32F:
84 return rewriteValuegeneric_OpCvt32to32F(v)
85 case OpCvt32to64F:
86 return rewriteValuegeneric_OpCvt32to64F(v)
87 case OpCvt64Fto32:
88 return rewriteValuegeneric_OpCvt64Fto32(v)
89 case OpCvt64Fto32F:
90 return rewriteValuegeneric_OpCvt64Fto32F(v)
91 case OpCvt64Fto64:
92 return rewriteValuegeneric_OpCvt64Fto64(v)
93 case OpCvt64to32F:
94 return rewriteValuegeneric_OpCvt64to32F(v)
95 case OpCvt64to64F:
96 return rewriteValuegeneric_OpCvt64to64F(v)
97 case OpCvtBoolToUint8:
98 return rewriteValuegeneric_OpCvtBoolToUint8(v)
99 case OpDiv128u:
100 return rewriteValuegeneric_OpDiv128u(v)
101 case OpDiv16:
102 return rewriteValuegeneric_OpDiv16(v)
103 case OpDiv16u:
104 return rewriteValuegeneric_OpDiv16u(v)
105 case OpDiv32:
106 return rewriteValuegeneric_OpDiv32(v)
107 case OpDiv32F:
108 return rewriteValuegeneric_OpDiv32F(v)
109 case OpDiv32u:
110 return rewriteValuegeneric_OpDiv32u(v)
111 case OpDiv64:
112 return rewriteValuegeneric_OpDiv64(v)
113 case OpDiv64F:
114 return rewriteValuegeneric_OpDiv64F(v)
115 case OpDiv64u:
116 return rewriteValuegeneric_OpDiv64u(v)
117 case OpDiv8:
118 return rewriteValuegeneric_OpDiv8(v)
119 case OpDiv8u:
120 return rewriteValuegeneric_OpDiv8u(v)
121 case OpEq16:
122 return rewriteValuegeneric_OpEq16(v)
123 case OpEq32:
124 return rewriteValuegeneric_OpEq32(v)
125 case OpEq32F:
126 return rewriteValuegeneric_OpEq32F(v)
127 case OpEq64:
128 return rewriteValuegeneric_OpEq64(v)
129 case OpEq64F:
130 return rewriteValuegeneric_OpEq64F(v)
131 case OpEq8:
132 return rewriteValuegeneric_OpEq8(v)
133 case OpEqB:
134 return rewriteValuegeneric_OpEqB(v)
135 case OpEqInter:
136 return rewriteValuegeneric_OpEqInter(v)
137 case OpEqPtr:
138 return rewriteValuegeneric_OpEqPtr(v)
139 case OpEqSlice:
140 return rewriteValuegeneric_OpEqSlice(v)
141 case OpFloor:
142 return rewriteValuegeneric_OpFloor(v)
143 case OpIMake:
144 return rewriteValuegeneric_OpIMake(v)
145 case OpInterLECall:
146 return rewriteValuegeneric_OpInterLECall(v)
147 case OpIsInBounds:
148 return rewriteValuegeneric_OpIsInBounds(v)
149 case OpIsNonNil:
150 return rewriteValuegeneric_OpIsNonNil(v)
151 case OpIsSliceInBounds:
152 return rewriteValuegeneric_OpIsSliceInBounds(v)
153 case OpLeq16:
154 return rewriteValuegeneric_OpLeq16(v)
155 case OpLeq16U:
156 return rewriteValuegeneric_OpLeq16U(v)
157 case OpLeq32:
158 return rewriteValuegeneric_OpLeq32(v)
159 case OpLeq32F:
160 return rewriteValuegeneric_OpLeq32F(v)
161 case OpLeq32U:
162 return rewriteValuegeneric_OpLeq32U(v)
163 case OpLeq64:
164 return rewriteValuegeneric_OpLeq64(v)
165 case OpLeq64F:
166 return rewriteValuegeneric_OpLeq64F(v)
167 case OpLeq64U:
168 return rewriteValuegeneric_OpLeq64U(v)
169 case OpLeq8:
170 return rewriteValuegeneric_OpLeq8(v)
171 case OpLeq8U:
172 return rewriteValuegeneric_OpLeq8U(v)
173 case OpLess16:
174 return rewriteValuegeneric_OpLess16(v)
175 case OpLess16U:
176 return rewriteValuegeneric_OpLess16U(v)
177 case OpLess32:
178 return rewriteValuegeneric_OpLess32(v)
179 case OpLess32F:
180 return rewriteValuegeneric_OpLess32F(v)
181 case OpLess32U:
182 return rewriteValuegeneric_OpLess32U(v)
183 case OpLess64:
184 return rewriteValuegeneric_OpLess64(v)
185 case OpLess64F:
186 return rewriteValuegeneric_OpLess64F(v)
187 case OpLess64U:
188 return rewriteValuegeneric_OpLess64U(v)
189 case OpLess8:
190 return rewriteValuegeneric_OpLess8(v)
191 case OpLess8U:
192 return rewriteValuegeneric_OpLess8U(v)
193 case OpLoad:
194 return rewriteValuegeneric_OpLoad(v)
195 case OpLsh16x16:
196 return rewriteValuegeneric_OpLsh16x16(v)
197 case OpLsh16x32:
198 return rewriteValuegeneric_OpLsh16x32(v)
199 case OpLsh16x64:
200 return rewriteValuegeneric_OpLsh16x64(v)
201 case OpLsh16x8:
202 return rewriteValuegeneric_OpLsh16x8(v)
203 case OpLsh32x16:
204 return rewriteValuegeneric_OpLsh32x16(v)
205 case OpLsh32x32:
206 return rewriteValuegeneric_OpLsh32x32(v)
207 case OpLsh32x64:
208 return rewriteValuegeneric_OpLsh32x64(v)
209 case OpLsh32x8:
210 return rewriteValuegeneric_OpLsh32x8(v)
211 case OpLsh64x16:
212 return rewriteValuegeneric_OpLsh64x16(v)
213 case OpLsh64x32:
214 return rewriteValuegeneric_OpLsh64x32(v)
215 case OpLsh64x64:
216 return rewriteValuegeneric_OpLsh64x64(v)
217 case OpLsh64x8:
218 return rewriteValuegeneric_OpLsh64x8(v)
219 case OpLsh8x16:
220 return rewriteValuegeneric_OpLsh8x16(v)
221 case OpLsh8x32:
222 return rewriteValuegeneric_OpLsh8x32(v)
223 case OpLsh8x64:
224 return rewriteValuegeneric_OpLsh8x64(v)
225 case OpLsh8x8:
226 return rewriteValuegeneric_OpLsh8x8(v)
227 case OpMemEq:
228 return rewriteValuegeneric_OpMemEq(v)
229 case OpMod16:
230 return rewriteValuegeneric_OpMod16(v)
231 case OpMod16u:
232 return rewriteValuegeneric_OpMod16u(v)
233 case OpMod32:
234 return rewriteValuegeneric_OpMod32(v)
235 case OpMod32u:
236 return rewriteValuegeneric_OpMod32u(v)
237 case OpMod64:
238 return rewriteValuegeneric_OpMod64(v)
239 case OpMod64u:
240 return rewriteValuegeneric_OpMod64u(v)
241 case OpMod8:
242 return rewriteValuegeneric_OpMod8(v)
243 case OpMod8u:
244 return rewriteValuegeneric_OpMod8u(v)
245 case OpMove:
246 return rewriteValuegeneric_OpMove(v)
247 case OpMul16:
248 return rewriteValuegeneric_OpMul16(v)
249 case OpMul32:
250 return rewriteValuegeneric_OpMul32(v)
251 case OpMul32F:
252 return rewriteValuegeneric_OpMul32F(v)
253 case OpMul32uhilo:
254 return rewriteValuegeneric_OpMul32uhilo(v)
255 case OpMul32uover:
256 return rewriteValuegeneric_OpMul32uover(v)
257 case OpMul64:
258 return rewriteValuegeneric_OpMul64(v)
259 case OpMul64F:
260 return rewriteValuegeneric_OpMul64F(v)
261 case OpMul64uhilo:
262 return rewriteValuegeneric_OpMul64uhilo(v)
263 case OpMul64uover:
264 return rewriteValuegeneric_OpMul64uover(v)
265 case OpMul8:
266 return rewriteValuegeneric_OpMul8(v)
267 case OpNeg16:
268 return rewriteValuegeneric_OpNeg16(v)
269 case OpNeg32:
270 return rewriteValuegeneric_OpNeg32(v)
271 case OpNeg32F:
272 return rewriteValuegeneric_OpNeg32F(v)
273 case OpNeg64:
274 return rewriteValuegeneric_OpNeg64(v)
275 case OpNeg64F:
276 return rewriteValuegeneric_OpNeg64F(v)
277 case OpNeg8:
278 return rewriteValuegeneric_OpNeg8(v)
279 case OpNeq16:
280 return rewriteValuegeneric_OpNeq16(v)
281 case OpNeq32:
282 return rewriteValuegeneric_OpNeq32(v)
283 case OpNeq32F:
284 return rewriteValuegeneric_OpNeq32F(v)
285 case OpNeq64:
286 return rewriteValuegeneric_OpNeq64(v)
287 case OpNeq64F:
288 return rewriteValuegeneric_OpNeq64F(v)
289 case OpNeq8:
290 return rewriteValuegeneric_OpNeq8(v)
291 case OpNeqB:
292 return rewriteValuegeneric_OpNeqB(v)
293 case OpNeqInter:
294 return rewriteValuegeneric_OpNeqInter(v)
295 case OpNeqPtr:
296 return rewriteValuegeneric_OpNeqPtr(v)
297 case OpNeqSlice:
298 return rewriteValuegeneric_OpNeqSlice(v)
299 case OpNilCheck:
300 return rewriteValuegeneric_OpNilCheck(v)
301 case OpNot:
302 return rewriteValuegeneric_OpNot(v)
303 case OpOffPtr:
304 return rewriteValuegeneric_OpOffPtr(v)
305 case OpOr16:
306 return rewriteValuegeneric_OpOr16(v)
307 case OpOr32:
308 return rewriteValuegeneric_OpOr32(v)
309 case OpOr64:
310 return rewriteValuegeneric_OpOr64(v)
311 case OpOr8:
312 return rewriteValuegeneric_OpOr8(v)
313 case OpOrB:
314 return rewriteValuegeneric_OpOrB(v)
315 case OpPhi:
316 return rewriteValuegeneric_OpPhi(v)
317 case OpPopCount16:
318 return rewriteValuegeneric_OpPopCount16(v)
319 case OpPopCount32:
320 return rewriteValuegeneric_OpPopCount32(v)
321 case OpPopCount64:
322 return rewriteValuegeneric_OpPopCount64(v)
323 case OpPopCount8:
324 return rewriteValuegeneric_OpPopCount8(v)
325 case OpPtrIndex:
326 return rewriteValuegeneric_OpPtrIndex(v)
327 case OpRotateLeft16:
328 return rewriteValuegeneric_OpRotateLeft16(v)
329 case OpRotateLeft32:
330 return rewriteValuegeneric_OpRotateLeft32(v)
331 case OpRotateLeft64:
332 return rewriteValuegeneric_OpRotateLeft64(v)
333 case OpRotateLeft8:
334 return rewriteValuegeneric_OpRotateLeft8(v)
335 case OpRound32F:
336 return rewriteValuegeneric_OpRound32F(v)
337 case OpRound64F:
338 return rewriteValuegeneric_OpRound64F(v)
339 case OpRoundToEven:
340 return rewriteValuegeneric_OpRoundToEven(v)
341 case OpRsh16Ux16:
342 return rewriteValuegeneric_OpRsh16Ux16(v)
343 case OpRsh16Ux32:
344 return rewriteValuegeneric_OpRsh16Ux32(v)
345 case OpRsh16Ux64:
346 return rewriteValuegeneric_OpRsh16Ux64(v)
347 case OpRsh16Ux8:
348 return rewriteValuegeneric_OpRsh16Ux8(v)
349 case OpRsh16x16:
350 return rewriteValuegeneric_OpRsh16x16(v)
351 case OpRsh16x32:
352 return rewriteValuegeneric_OpRsh16x32(v)
353 case OpRsh16x64:
354 return rewriteValuegeneric_OpRsh16x64(v)
355 case OpRsh16x8:
356 return rewriteValuegeneric_OpRsh16x8(v)
357 case OpRsh32Ux16:
358 return rewriteValuegeneric_OpRsh32Ux16(v)
359 case OpRsh32Ux32:
360 return rewriteValuegeneric_OpRsh32Ux32(v)
361 case OpRsh32Ux64:
362 return rewriteValuegeneric_OpRsh32Ux64(v)
363 case OpRsh32Ux8:
364 return rewriteValuegeneric_OpRsh32Ux8(v)
365 case OpRsh32x16:
366 return rewriteValuegeneric_OpRsh32x16(v)
367 case OpRsh32x32:
368 return rewriteValuegeneric_OpRsh32x32(v)
369 case OpRsh32x64:
370 return rewriteValuegeneric_OpRsh32x64(v)
371 case OpRsh32x8:
372 return rewriteValuegeneric_OpRsh32x8(v)
373 case OpRsh64Ux16:
374 return rewriteValuegeneric_OpRsh64Ux16(v)
375 case OpRsh64Ux32:
376 return rewriteValuegeneric_OpRsh64Ux32(v)
377 case OpRsh64Ux64:
378 return rewriteValuegeneric_OpRsh64Ux64(v)
379 case OpRsh64Ux8:
380 return rewriteValuegeneric_OpRsh64Ux8(v)
381 case OpRsh64x16:
382 return rewriteValuegeneric_OpRsh64x16(v)
383 case OpRsh64x32:
384 return rewriteValuegeneric_OpRsh64x32(v)
385 case OpRsh64x64:
386 return rewriteValuegeneric_OpRsh64x64(v)
387 case OpRsh64x8:
388 return rewriteValuegeneric_OpRsh64x8(v)
389 case OpRsh8Ux16:
390 return rewriteValuegeneric_OpRsh8Ux16(v)
391 case OpRsh8Ux32:
392 return rewriteValuegeneric_OpRsh8Ux32(v)
393 case OpRsh8Ux64:
394 return rewriteValuegeneric_OpRsh8Ux64(v)
395 case OpRsh8Ux8:
396 return rewriteValuegeneric_OpRsh8Ux8(v)
397 case OpRsh8x16:
398 return rewriteValuegeneric_OpRsh8x16(v)
399 case OpRsh8x32:
400 return rewriteValuegeneric_OpRsh8x32(v)
401 case OpRsh8x64:
402 return rewriteValuegeneric_OpRsh8x64(v)
403 case OpRsh8x8:
404 return rewriteValuegeneric_OpRsh8x8(v)
405 case OpSelect0:
406 return rewriteValuegeneric_OpSelect0(v)
407 case OpSelect1:
408 return rewriteValuegeneric_OpSelect1(v)
409 case OpSelectN:
410 return rewriteValuegeneric_OpSelectN(v)
411 case OpSignExt16to32:
412 return rewriteValuegeneric_OpSignExt16to32(v)
413 case OpSignExt16to64:
414 return rewriteValuegeneric_OpSignExt16to64(v)
415 case OpSignExt32to64:
416 return rewriteValuegeneric_OpSignExt32to64(v)
417 case OpSignExt8to16:
418 return rewriteValuegeneric_OpSignExt8to16(v)
419 case OpSignExt8to32:
420 return rewriteValuegeneric_OpSignExt8to32(v)
421 case OpSignExt8to64:
422 return rewriteValuegeneric_OpSignExt8to64(v)
423 case OpSliceCap:
424 return rewriteValuegeneric_OpSliceCap(v)
425 case OpSliceLen:
426 return rewriteValuegeneric_OpSliceLen(v)
427 case OpSliceMake:
428 return rewriteValuegeneric_OpSliceMake(v)
429 case OpSlicePtr:
430 return rewriteValuegeneric_OpSlicePtr(v)
431 case OpSlicemask:
432 return rewriteValuegeneric_OpSlicemask(v)
433 case OpSqrt:
434 return rewriteValuegeneric_OpSqrt(v)
435 case OpStaticCall:
436 return rewriteValuegeneric_OpStaticCall(v)
437 case OpStaticLECall:
438 return rewriteValuegeneric_OpStaticLECall(v)
439 case OpStore:
440 return rewriteValuegeneric_OpStore(v)
441 case OpStringLen:
442 return rewriteValuegeneric_OpStringLen(v)
443 case OpStringPtr:
444 return rewriteValuegeneric_OpStringPtr(v)
445 case OpStructSelect:
446 return rewriteValuegeneric_OpStructSelect(v)
447 case OpSub16:
448 return rewriteValuegeneric_OpSub16(v)
449 case OpSub32:
450 return rewriteValuegeneric_OpSub32(v)
451 case OpSub32F:
452 return rewriteValuegeneric_OpSub32F(v)
453 case OpSub64:
454 return rewriteValuegeneric_OpSub64(v)
455 case OpSub64F:
456 return rewriteValuegeneric_OpSub64F(v)
457 case OpSub8:
458 return rewriteValuegeneric_OpSub8(v)
459 case OpTrunc:
460 return rewriteValuegeneric_OpTrunc(v)
461 case OpTrunc16to8:
462 return rewriteValuegeneric_OpTrunc16to8(v)
463 case OpTrunc32to16:
464 return rewriteValuegeneric_OpTrunc32to16(v)
465 case OpTrunc32to8:
466 return rewriteValuegeneric_OpTrunc32to8(v)
467 case OpTrunc64to16:
468 return rewriteValuegeneric_OpTrunc64to16(v)
469 case OpTrunc64to32:
470 return rewriteValuegeneric_OpTrunc64to32(v)
471 case OpTrunc64to8:
472 return rewriteValuegeneric_OpTrunc64to8(v)
473 case OpXor16:
474 return rewriteValuegeneric_OpXor16(v)
475 case OpXor32:
476 return rewriteValuegeneric_OpXor32(v)
477 case OpXor64:
478 return rewriteValuegeneric_OpXor64(v)
479 case OpXor8:
480 return rewriteValuegeneric_OpXor8(v)
481 case OpZero:
482 return rewriteValuegeneric_OpZero(v)
483 case OpZeroExt16to32:
484 return rewriteValuegeneric_OpZeroExt16to32(v)
485 case OpZeroExt16to64:
486 return rewriteValuegeneric_OpZeroExt16to64(v)
487 case OpZeroExt32to64:
488 return rewriteValuegeneric_OpZeroExt32to64(v)
489 case OpZeroExt8to16:
490 return rewriteValuegeneric_OpZeroExt8to16(v)
491 case OpZeroExt8to32:
492 return rewriteValuegeneric_OpZeroExt8to32(v)
493 case OpZeroExt8to64:
494 return rewriteValuegeneric_OpZeroExt8to64(v)
495 }
496 return false
497 }
498 func rewriteValuegeneric_OpAdd16(v *Value) bool {
499 v_1 := v.Args[1]
500 v_0 := v.Args[0]
501 b := v.Block
502 config := b.Func.Config
503
504
505 for {
506 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
507 if v_0.Op != OpConst16 {
508 continue
509 }
510 c := auxIntToInt16(v_0.AuxInt)
511 if v_1.Op != OpConst16 {
512 continue
513 }
514 d := auxIntToInt16(v_1.AuxInt)
515 v.reset(OpConst16)
516 v.AuxInt = int16ToAuxInt(c + d)
517 return true
518 }
519 break
520 }
521
522
523 for {
524 t := v.Type
525 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
526 if v_0.Op != OpMul16 {
527 continue
528 }
529 _ = v_0.Args[1]
530 v_0_0 := v_0.Args[0]
531 v_0_1 := v_0.Args[1]
532 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
533 x := v_0_0
534 y := v_0_1
535 if v_1.Op != OpMul16 {
536 continue
537 }
538 _ = v_1.Args[1]
539 v_1_0 := v_1.Args[0]
540 v_1_1 := v_1.Args[1]
541 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
542 if x != v_1_0 {
543 continue
544 }
545 z := v_1_1
546 v.reset(OpMul16)
547 v0 := b.NewValue0(v.Pos, OpAdd16, t)
548 v0.AddArg2(y, z)
549 v.AddArg2(x, v0)
550 return true
551 }
552 }
553 }
554 break
555 }
556
557
558 for {
559 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
560 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
561 continue
562 }
563 x := v_1
564 v.copyOf(x)
565 return true
566 }
567 break
568 }
569
570
571 for {
572 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
573 x := v_0
574 if v_1.Op != OpNeg16 {
575 continue
576 }
577 y := v_1.Args[0]
578 v.reset(OpSub16)
579 v.AddArg2(x, y)
580 return true
581 }
582 break
583 }
584
585
586 for {
587 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
588 if v_0.Op != OpCom16 {
589 continue
590 }
591 x := v_0.Args[0]
592 if x != v_1 {
593 continue
594 }
595 v.reset(OpConst16)
596 v.AuxInt = int16ToAuxInt(-1)
597 return true
598 }
599 break
600 }
601
602
603 for {
604 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
605 if v_0.Op != OpSub16 {
606 continue
607 }
608 t := v_0.Args[1]
609 x := v_0.Args[0]
610 if v_1.Op != OpAdd16 {
611 continue
612 }
613 _ = v_1.Args[1]
614 v_1_0 := v_1.Args[0]
615 v_1_1 := v_1.Args[1]
616 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
617 if t != v_1_0 {
618 continue
619 }
620 y := v_1_1
621 v.reset(OpAdd16)
622 v.AddArg2(x, y)
623 return true
624 }
625 }
626 break
627 }
628
629
630 for {
631 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
632 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 1 || v_1.Op != OpCom16 {
633 continue
634 }
635 x := v_1.Args[0]
636 v.reset(OpNeg16)
637 v.AddArg(x)
638 return true
639 }
640 break
641 }
642
643
644 for {
645 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
646 x := v_0
647 if v_1.Op != OpSub16 {
648 continue
649 }
650 _ = v_1.Args[1]
651 y := v_1.Args[0]
652 if x != v_1.Args[1] {
653 continue
654 }
655 v.copyOf(y)
656 return true
657 }
658 break
659 }
660
661
662 for {
663 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
664 x := v_0
665 if v_1.Op != OpAdd16 {
666 continue
667 }
668 _ = v_1.Args[1]
669 v_1_0 := v_1.Args[0]
670 v_1_1 := v_1.Args[1]
671 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
672 y := v_1_0
673 if v_1_1.Op != OpSub16 {
674 continue
675 }
676 _ = v_1_1.Args[1]
677 z := v_1_1.Args[0]
678 if x != v_1_1.Args[1] {
679 continue
680 }
681 v.reset(OpAdd16)
682 v.AddArg2(y, z)
683 return true
684 }
685 }
686 break
687 }
688
689
690
691 for {
692 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
693 if v_0.Op != OpAdd16 {
694 continue
695 }
696 _ = v_0.Args[1]
697 v_0_0 := v_0.Args[0]
698 v_0_1 := v_0.Args[1]
699 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
700 i := v_0_0
701 if i.Op != OpConst16 {
702 continue
703 }
704 t := i.Type
705 z := v_0_1
706 x := v_1
707 if !(z.Op != OpConst16 && x.Op != OpConst16) {
708 continue
709 }
710 v.reset(OpAdd16)
711 v0 := b.NewValue0(v.Pos, OpAdd16, t)
712 v0.AddArg2(z, x)
713 v.AddArg2(i, v0)
714 return true
715 }
716 }
717 break
718 }
719
720
721
722 for {
723 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
724 if v_0.Op != OpSub16 {
725 continue
726 }
727 z := v_0.Args[1]
728 i := v_0.Args[0]
729 if i.Op != OpConst16 {
730 continue
731 }
732 t := i.Type
733 x := v_1
734 if !(z.Op != OpConst16 && x.Op != OpConst16) {
735 continue
736 }
737 v.reset(OpAdd16)
738 v0 := b.NewValue0(v.Pos, OpSub16, t)
739 v0.AddArg2(x, z)
740 v.AddArg2(i, v0)
741 return true
742 }
743 break
744 }
745
746
747 for {
748 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
749 if v_0.Op != OpConst16 {
750 continue
751 }
752 t := v_0.Type
753 c := auxIntToInt16(v_0.AuxInt)
754 if v_1.Op != OpAdd16 {
755 continue
756 }
757 _ = v_1.Args[1]
758 v_1_0 := v_1.Args[0]
759 v_1_1 := v_1.Args[1]
760 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
761 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
762 continue
763 }
764 d := auxIntToInt16(v_1_0.AuxInt)
765 x := v_1_1
766 v.reset(OpAdd16)
767 v0 := b.NewValue0(v.Pos, OpConst16, t)
768 v0.AuxInt = int16ToAuxInt(c + d)
769 v.AddArg2(v0, x)
770 return true
771 }
772 }
773 break
774 }
775
776
777 for {
778 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
779 if v_0.Op != OpConst16 {
780 continue
781 }
782 t := v_0.Type
783 c := auxIntToInt16(v_0.AuxInt)
784 if v_1.Op != OpSub16 {
785 continue
786 }
787 x := v_1.Args[1]
788 v_1_0 := v_1.Args[0]
789 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
790 continue
791 }
792 d := auxIntToInt16(v_1_0.AuxInt)
793 v.reset(OpSub16)
794 v0 := b.NewValue0(v.Pos, OpConst16, t)
795 v0.AuxInt = int16ToAuxInt(c + d)
796 v.AddArg2(v0, x)
797 return true
798 }
799 break
800 }
801
802
803
804 for {
805 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
806 if v_0.Op != OpLsh16x64 {
807 continue
808 }
809 _ = v_0.Args[1]
810 x := v_0.Args[0]
811 z := v_0.Args[1]
812 if z.Op != OpConst64 {
813 continue
814 }
815 c := auxIntToInt64(z.AuxInt)
816 if v_1.Op != OpRsh16Ux64 {
817 continue
818 }
819 _ = v_1.Args[1]
820 if x != v_1.Args[0] {
821 continue
822 }
823 v_1_1 := v_1.Args[1]
824 if v_1_1.Op != OpConst64 {
825 continue
826 }
827 d := auxIntToInt64(v_1_1.AuxInt)
828 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
829 continue
830 }
831 v.reset(OpRotateLeft16)
832 v.AddArg2(x, z)
833 return true
834 }
835 break
836 }
837
838
839
840 for {
841 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
842 left := v_0
843 if left.Op != OpLsh16x64 {
844 continue
845 }
846 y := left.Args[1]
847 x := left.Args[0]
848 right := v_1
849 if right.Op != OpRsh16Ux64 {
850 continue
851 }
852 _ = right.Args[1]
853 if x != right.Args[0] {
854 continue
855 }
856 right_1 := right.Args[1]
857 if right_1.Op != OpSub64 {
858 continue
859 }
860 _ = right_1.Args[1]
861 right_1_0 := right_1.Args[0]
862 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
863 continue
864 }
865 v.reset(OpRotateLeft16)
866 v.AddArg2(x, y)
867 return true
868 }
869 break
870 }
871
872
873
874 for {
875 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
876 left := v_0
877 if left.Op != OpLsh16x32 {
878 continue
879 }
880 y := left.Args[1]
881 x := left.Args[0]
882 right := v_1
883 if right.Op != OpRsh16Ux32 {
884 continue
885 }
886 _ = right.Args[1]
887 if x != right.Args[0] {
888 continue
889 }
890 right_1 := right.Args[1]
891 if right_1.Op != OpSub32 {
892 continue
893 }
894 _ = right_1.Args[1]
895 right_1_0 := right_1.Args[0]
896 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
897 continue
898 }
899 v.reset(OpRotateLeft16)
900 v.AddArg2(x, y)
901 return true
902 }
903 break
904 }
905
906
907
908 for {
909 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
910 left := v_0
911 if left.Op != OpLsh16x16 {
912 continue
913 }
914 y := left.Args[1]
915 x := left.Args[0]
916 right := v_1
917 if right.Op != OpRsh16Ux16 {
918 continue
919 }
920 _ = right.Args[1]
921 if x != right.Args[0] {
922 continue
923 }
924 right_1 := right.Args[1]
925 if right_1.Op != OpSub16 {
926 continue
927 }
928 _ = right_1.Args[1]
929 right_1_0 := right_1.Args[0]
930 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
931 continue
932 }
933 v.reset(OpRotateLeft16)
934 v.AddArg2(x, y)
935 return true
936 }
937 break
938 }
939
940
941
942 for {
943 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
944 left := v_0
945 if left.Op != OpLsh16x8 {
946 continue
947 }
948 y := left.Args[1]
949 x := left.Args[0]
950 right := v_1
951 if right.Op != OpRsh16Ux8 {
952 continue
953 }
954 _ = right.Args[1]
955 if x != right.Args[0] {
956 continue
957 }
958 right_1 := right.Args[1]
959 if right_1.Op != OpSub8 {
960 continue
961 }
962 _ = right_1.Args[1]
963 right_1_0 := right_1.Args[0]
964 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
965 continue
966 }
967 v.reset(OpRotateLeft16)
968 v.AddArg2(x, y)
969 return true
970 }
971 break
972 }
973
974
975
976 for {
977 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
978 right := v_0
979 if right.Op != OpRsh16Ux64 {
980 continue
981 }
982 y := right.Args[1]
983 x := right.Args[0]
984 left := v_1
985 if left.Op != OpLsh16x64 {
986 continue
987 }
988 _ = left.Args[1]
989 if x != left.Args[0] {
990 continue
991 }
992 z := left.Args[1]
993 if z.Op != OpSub64 {
994 continue
995 }
996 _ = z.Args[1]
997 z_0 := z.Args[0]
998 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
999 continue
1000 }
1001 v.reset(OpRotateLeft16)
1002 v.AddArg2(x, z)
1003 return true
1004 }
1005 break
1006 }
1007
1008
1009
1010 for {
1011 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1012 right := v_0
1013 if right.Op != OpRsh16Ux32 {
1014 continue
1015 }
1016 y := right.Args[1]
1017 x := right.Args[0]
1018 left := v_1
1019 if left.Op != OpLsh16x32 {
1020 continue
1021 }
1022 _ = left.Args[1]
1023 if x != left.Args[0] {
1024 continue
1025 }
1026 z := left.Args[1]
1027 if z.Op != OpSub32 {
1028 continue
1029 }
1030 _ = z.Args[1]
1031 z_0 := z.Args[0]
1032 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1033 continue
1034 }
1035 v.reset(OpRotateLeft16)
1036 v.AddArg2(x, z)
1037 return true
1038 }
1039 break
1040 }
1041
1042
1043
1044 for {
1045 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1046 right := v_0
1047 if right.Op != OpRsh16Ux16 {
1048 continue
1049 }
1050 y := right.Args[1]
1051 x := right.Args[0]
1052 left := v_1
1053 if left.Op != OpLsh16x16 {
1054 continue
1055 }
1056 _ = left.Args[1]
1057 if x != left.Args[0] {
1058 continue
1059 }
1060 z := left.Args[1]
1061 if z.Op != OpSub16 {
1062 continue
1063 }
1064 _ = z.Args[1]
1065 z_0 := z.Args[0]
1066 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1067 continue
1068 }
1069 v.reset(OpRotateLeft16)
1070 v.AddArg2(x, z)
1071 return true
1072 }
1073 break
1074 }
1075
1076
1077
1078 for {
1079 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1080 right := v_0
1081 if right.Op != OpRsh16Ux8 {
1082 continue
1083 }
1084 y := right.Args[1]
1085 x := right.Args[0]
1086 left := v_1
1087 if left.Op != OpLsh16x8 {
1088 continue
1089 }
1090 _ = left.Args[1]
1091 if x != left.Args[0] {
1092 continue
1093 }
1094 z := left.Args[1]
1095 if z.Op != OpSub8 {
1096 continue
1097 }
1098 _ = z.Args[1]
1099 z_0 := z.Args[0]
1100 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1101 continue
1102 }
1103 v.reset(OpRotateLeft16)
1104 v.AddArg2(x, z)
1105 return true
1106 }
1107 break
1108 }
1109 return false
1110 }
1111 func rewriteValuegeneric_OpAdd32(v *Value) bool {
1112 v_1 := v.Args[1]
1113 v_0 := v.Args[0]
1114 b := v.Block
1115 config := b.Func.Config
1116
1117
1118 for {
1119 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1120 if v_0.Op != OpConst32 {
1121 continue
1122 }
1123 c := auxIntToInt32(v_0.AuxInt)
1124 if v_1.Op != OpConst32 {
1125 continue
1126 }
1127 d := auxIntToInt32(v_1.AuxInt)
1128 v.reset(OpConst32)
1129 v.AuxInt = int32ToAuxInt(c + d)
1130 return true
1131 }
1132 break
1133 }
1134
1135
1136 for {
1137 t := v.Type
1138 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1139 if v_0.Op != OpMul32 {
1140 continue
1141 }
1142 _ = v_0.Args[1]
1143 v_0_0 := v_0.Args[0]
1144 v_0_1 := v_0.Args[1]
1145 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1146 x := v_0_0
1147 y := v_0_1
1148 if v_1.Op != OpMul32 {
1149 continue
1150 }
1151 _ = v_1.Args[1]
1152 v_1_0 := v_1.Args[0]
1153 v_1_1 := v_1.Args[1]
1154 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
1155 if x != v_1_0 {
1156 continue
1157 }
1158 z := v_1_1
1159 v.reset(OpMul32)
1160 v0 := b.NewValue0(v.Pos, OpAdd32, t)
1161 v0.AddArg2(y, z)
1162 v.AddArg2(x, v0)
1163 return true
1164 }
1165 }
1166 }
1167 break
1168 }
1169
1170
1171 for {
1172 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1173 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
1174 continue
1175 }
1176 x := v_1
1177 v.copyOf(x)
1178 return true
1179 }
1180 break
1181 }
1182
1183
1184 for {
1185 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1186 x := v_0
1187 if v_1.Op != OpNeg32 {
1188 continue
1189 }
1190 y := v_1.Args[0]
1191 v.reset(OpSub32)
1192 v.AddArg2(x, y)
1193 return true
1194 }
1195 break
1196 }
1197
1198
1199 for {
1200 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1201 if v_0.Op != OpCom32 {
1202 continue
1203 }
1204 x := v_0.Args[0]
1205 if x != v_1 {
1206 continue
1207 }
1208 v.reset(OpConst32)
1209 v.AuxInt = int32ToAuxInt(-1)
1210 return true
1211 }
1212 break
1213 }
1214
1215
1216 for {
1217 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1218 if v_0.Op != OpSub32 {
1219 continue
1220 }
1221 t := v_0.Args[1]
1222 x := v_0.Args[0]
1223 if v_1.Op != OpAdd32 {
1224 continue
1225 }
1226 _ = v_1.Args[1]
1227 v_1_0 := v_1.Args[0]
1228 v_1_1 := v_1.Args[1]
1229 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1230 if t != v_1_0 {
1231 continue
1232 }
1233 y := v_1_1
1234 v.reset(OpAdd32)
1235 v.AddArg2(x, y)
1236 return true
1237 }
1238 }
1239 break
1240 }
1241
1242
1243 for {
1244 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1245 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 || v_1.Op != OpCom32 {
1246 continue
1247 }
1248 x := v_1.Args[0]
1249 v.reset(OpNeg32)
1250 v.AddArg(x)
1251 return true
1252 }
1253 break
1254 }
1255
1256
1257 for {
1258 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1259 x := v_0
1260 if v_1.Op != OpSub32 {
1261 continue
1262 }
1263 _ = v_1.Args[1]
1264 y := v_1.Args[0]
1265 if x != v_1.Args[1] {
1266 continue
1267 }
1268 v.copyOf(y)
1269 return true
1270 }
1271 break
1272 }
1273
1274
1275 for {
1276 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1277 x := v_0
1278 if v_1.Op != OpAdd32 {
1279 continue
1280 }
1281 _ = v_1.Args[1]
1282 v_1_0 := v_1.Args[0]
1283 v_1_1 := v_1.Args[1]
1284 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1285 y := v_1_0
1286 if v_1_1.Op != OpSub32 {
1287 continue
1288 }
1289 _ = v_1_1.Args[1]
1290 z := v_1_1.Args[0]
1291 if x != v_1_1.Args[1] {
1292 continue
1293 }
1294 v.reset(OpAdd32)
1295 v.AddArg2(y, z)
1296 return true
1297 }
1298 }
1299 break
1300 }
1301
1302
1303
1304 for {
1305 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1306 if v_0.Op != OpAdd32 {
1307 continue
1308 }
1309 _ = v_0.Args[1]
1310 v_0_0 := v_0.Args[0]
1311 v_0_1 := v_0.Args[1]
1312 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1313 i := v_0_0
1314 if i.Op != OpConst32 {
1315 continue
1316 }
1317 t := i.Type
1318 z := v_0_1
1319 x := v_1
1320 if !(z.Op != OpConst32 && x.Op != OpConst32) {
1321 continue
1322 }
1323 v.reset(OpAdd32)
1324 v0 := b.NewValue0(v.Pos, OpAdd32, t)
1325 v0.AddArg2(z, x)
1326 v.AddArg2(i, v0)
1327 return true
1328 }
1329 }
1330 break
1331 }
1332
1333
1334
1335 for {
1336 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1337 if v_0.Op != OpSub32 {
1338 continue
1339 }
1340 z := v_0.Args[1]
1341 i := v_0.Args[0]
1342 if i.Op != OpConst32 {
1343 continue
1344 }
1345 t := i.Type
1346 x := v_1
1347 if !(z.Op != OpConst32 && x.Op != OpConst32) {
1348 continue
1349 }
1350 v.reset(OpAdd32)
1351 v0 := b.NewValue0(v.Pos, OpSub32, t)
1352 v0.AddArg2(x, z)
1353 v.AddArg2(i, v0)
1354 return true
1355 }
1356 break
1357 }
1358
1359
1360 for {
1361 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1362 if v_0.Op != OpConst32 {
1363 continue
1364 }
1365 t := v_0.Type
1366 c := auxIntToInt32(v_0.AuxInt)
1367 if v_1.Op != OpAdd32 {
1368 continue
1369 }
1370 _ = v_1.Args[1]
1371 v_1_0 := v_1.Args[0]
1372 v_1_1 := v_1.Args[1]
1373 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1374 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
1375 continue
1376 }
1377 d := auxIntToInt32(v_1_0.AuxInt)
1378 x := v_1_1
1379 v.reset(OpAdd32)
1380 v0 := b.NewValue0(v.Pos, OpConst32, t)
1381 v0.AuxInt = int32ToAuxInt(c + d)
1382 v.AddArg2(v0, x)
1383 return true
1384 }
1385 }
1386 break
1387 }
1388
1389
1390 for {
1391 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1392 if v_0.Op != OpConst32 {
1393 continue
1394 }
1395 t := v_0.Type
1396 c := auxIntToInt32(v_0.AuxInt)
1397 if v_1.Op != OpSub32 {
1398 continue
1399 }
1400 x := v_1.Args[1]
1401 v_1_0 := v_1.Args[0]
1402 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
1403 continue
1404 }
1405 d := auxIntToInt32(v_1_0.AuxInt)
1406 v.reset(OpSub32)
1407 v0 := b.NewValue0(v.Pos, OpConst32, t)
1408 v0.AuxInt = int32ToAuxInt(c + d)
1409 v.AddArg2(v0, x)
1410 return true
1411 }
1412 break
1413 }
1414
1415
1416
1417 for {
1418 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1419 if v_0.Op != OpLsh32x64 {
1420 continue
1421 }
1422 _ = v_0.Args[1]
1423 x := v_0.Args[0]
1424 z := v_0.Args[1]
1425 if z.Op != OpConst64 {
1426 continue
1427 }
1428 c := auxIntToInt64(z.AuxInt)
1429 if v_1.Op != OpRsh32Ux64 {
1430 continue
1431 }
1432 _ = v_1.Args[1]
1433 if x != v_1.Args[0] {
1434 continue
1435 }
1436 v_1_1 := v_1.Args[1]
1437 if v_1_1.Op != OpConst64 {
1438 continue
1439 }
1440 d := auxIntToInt64(v_1_1.AuxInt)
1441 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
1442 continue
1443 }
1444 v.reset(OpRotateLeft32)
1445 v.AddArg2(x, z)
1446 return true
1447 }
1448 break
1449 }
1450
1451
1452
1453 for {
1454 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1455 left := v_0
1456 if left.Op != OpLsh32x64 {
1457 continue
1458 }
1459 y := left.Args[1]
1460 x := left.Args[0]
1461 right := v_1
1462 if right.Op != OpRsh32Ux64 {
1463 continue
1464 }
1465 _ = right.Args[1]
1466 if x != right.Args[0] {
1467 continue
1468 }
1469 right_1 := right.Args[1]
1470 if right_1.Op != OpSub64 {
1471 continue
1472 }
1473 _ = right_1.Args[1]
1474 right_1_0 := right_1.Args[0]
1475 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1476 continue
1477 }
1478 v.reset(OpRotateLeft32)
1479 v.AddArg2(x, y)
1480 return true
1481 }
1482 break
1483 }
1484
1485
1486
1487 for {
1488 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1489 left := v_0
1490 if left.Op != OpLsh32x32 {
1491 continue
1492 }
1493 y := left.Args[1]
1494 x := left.Args[0]
1495 right := v_1
1496 if right.Op != OpRsh32Ux32 {
1497 continue
1498 }
1499 _ = right.Args[1]
1500 if x != right.Args[0] {
1501 continue
1502 }
1503 right_1 := right.Args[1]
1504 if right_1.Op != OpSub32 {
1505 continue
1506 }
1507 _ = right_1.Args[1]
1508 right_1_0 := right_1.Args[0]
1509 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1510 continue
1511 }
1512 v.reset(OpRotateLeft32)
1513 v.AddArg2(x, y)
1514 return true
1515 }
1516 break
1517 }
1518
1519
1520
1521 for {
1522 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1523 left := v_0
1524 if left.Op != OpLsh32x16 {
1525 continue
1526 }
1527 y := left.Args[1]
1528 x := left.Args[0]
1529 right := v_1
1530 if right.Op != OpRsh32Ux16 {
1531 continue
1532 }
1533 _ = right.Args[1]
1534 if x != right.Args[0] {
1535 continue
1536 }
1537 right_1 := right.Args[1]
1538 if right_1.Op != OpSub16 {
1539 continue
1540 }
1541 _ = right_1.Args[1]
1542 right_1_0 := right_1.Args[0]
1543 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1544 continue
1545 }
1546 v.reset(OpRotateLeft32)
1547 v.AddArg2(x, y)
1548 return true
1549 }
1550 break
1551 }
1552
1553
1554
1555 for {
1556 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1557 left := v_0
1558 if left.Op != OpLsh32x8 {
1559 continue
1560 }
1561 y := left.Args[1]
1562 x := left.Args[0]
1563 right := v_1
1564 if right.Op != OpRsh32Ux8 {
1565 continue
1566 }
1567 _ = right.Args[1]
1568 if x != right.Args[0] {
1569 continue
1570 }
1571 right_1 := right.Args[1]
1572 if right_1.Op != OpSub8 {
1573 continue
1574 }
1575 _ = right_1.Args[1]
1576 right_1_0 := right_1.Args[0]
1577 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1578 continue
1579 }
1580 v.reset(OpRotateLeft32)
1581 v.AddArg2(x, y)
1582 return true
1583 }
1584 break
1585 }
1586
1587
1588
1589 for {
1590 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1591 right := v_0
1592 if right.Op != OpRsh32Ux64 {
1593 continue
1594 }
1595 y := right.Args[1]
1596 x := right.Args[0]
1597 left := v_1
1598 if left.Op != OpLsh32x64 {
1599 continue
1600 }
1601 _ = left.Args[1]
1602 if x != left.Args[0] {
1603 continue
1604 }
1605 z := left.Args[1]
1606 if z.Op != OpSub64 {
1607 continue
1608 }
1609 _ = z.Args[1]
1610 z_0 := z.Args[0]
1611 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1612 continue
1613 }
1614 v.reset(OpRotateLeft32)
1615 v.AddArg2(x, z)
1616 return true
1617 }
1618 break
1619 }
1620
1621
1622
1623 for {
1624 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1625 right := v_0
1626 if right.Op != OpRsh32Ux32 {
1627 continue
1628 }
1629 y := right.Args[1]
1630 x := right.Args[0]
1631 left := v_1
1632 if left.Op != OpLsh32x32 {
1633 continue
1634 }
1635 _ = left.Args[1]
1636 if x != left.Args[0] {
1637 continue
1638 }
1639 z := left.Args[1]
1640 if z.Op != OpSub32 {
1641 continue
1642 }
1643 _ = z.Args[1]
1644 z_0 := z.Args[0]
1645 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1646 continue
1647 }
1648 v.reset(OpRotateLeft32)
1649 v.AddArg2(x, z)
1650 return true
1651 }
1652 break
1653 }
1654
1655
1656
1657 for {
1658 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1659 right := v_0
1660 if right.Op != OpRsh32Ux16 {
1661 continue
1662 }
1663 y := right.Args[1]
1664 x := right.Args[0]
1665 left := v_1
1666 if left.Op != OpLsh32x16 {
1667 continue
1668 }
1669 _ = left.Args[1]
1670 if x != left.Args[0] {
1671 continue
1672 }
1673 z := left.Args[1]
1674 if z.Op != OpSub16 {
1675 continue
1676 }
1677 _ = z.Args[1]
1678 z_0 := z.Args[0]
1679 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1680 continue
1681 }
1682 v.reset(OpRotateLeft32)
1683 v.AddArg2(x, z)
1684 return true
1685 }
1686 break
1687 }
1688
1689
1690
1691 for {
1692 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1693 right := v_0
1694 if right.Op != OpRsh32Ux8 {
1695 continue
1696 }
1697 y := right.Args[1]
1698 x := right.Args[0]
1699 left := v_1
1700 if left.Op != OpLsh32x8 {
1701 continue
1702 }
1703 _ = left.Args[1]
1704 if x != left.Args[0] {
1705 continue
1706 }
1707 z := left.Args[1]
1708 if z.Op != OpSub8 {
1709 continue
1710 }
1711 _ = z.Args[1]
1712 z_0 := z.Args[0]
1713 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1714 continue
1715 }
1716 v.reset(OpRotateLeft32)
1717 v.AddArg2(x, z)
1718 return true
1719 }
1720 break
1721 }
1722 return false
1723 }
1724 func rewriteValuegeneric_OpAdd32F(v *Value) bool {
1725 v_1 := v.Args[1]
1726 v_0 := v.Args[0]
1727
1728
1729
1730 for {
1731 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1732 if v_0.Op != OpConst32F {
1733 continue
1734 }
1735 c := auxIntToFloat32(v_0.AuxInt)
1736 if v_1.Op != OpConst32F {
1737 continue
1738 }
1739 d := auxIntToFloat32(v_1.AuxInt)
1740 if !(c+d == c+d) {
1741 continue
1742 }
1743 v.reset(OpConst32F)
1744 v.AuxInt = float32ToAuxInt(c + d)
1745 return true
1746 }
1747 break
1748 }
1749 return false
1750 }
1751 func rewriteValuegeneric_OpAdd64(v *Value) bool {
1752 v_1 := v.Args[1]
1753 v_0 := v.Args[0]
1754 b := v.Block
1755 config := b.Func.Config
1756
1757
1758 for {
1759 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1760 if v_0.Op != OpConst64 {
1761 continue
1762 }
1763 c := auxIntToInt64(v_0.AuxInt)
1764 if v_1.Op != OpConst64 {
1765 continue
1766 }
1767 d := auxIntToInt64(v_1.AuxInt)
1768 v.reset(OpConst64)
1769 v.AuxInt = int64ToAuxInt(c + d)
1770 return true
1771 }
1772 break
1773 }
1774
1775
1776 for {
1777 t := v.Type
1778 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1779 if v_0.Op != OpMul64 {
1780 continue
1781 }
1782 _ = v_0.Args[1]
1783 v_0_0 := v_0.Args[0]
1784 v_0_1 := v_0.Args[1]
1785 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1786 x := v_0_0
1787 y := v_0_1
1788 if v_1.Op != OpMul64 {
1789 continue
1790 }
1791 _ = v_1.Args[1]
1792 v_1_0 := v_1.Args[0]
1793 v_1_1 := v_1.Args[1]
1794 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
1795 if x != v_1_0 {
1796 continue
1797 }
1798 z := v_1_1
1799 v.reset(OpMul64)
1800 v0 := b.NewValue0(v.Pos, OpAdd64, t)
1801 v0.AddArg2(y, z)
1802 v.AddArg2(x, v0)
1803 return true
1804 }
1805 }
1806 }
1807 break
1808 }
1809
1810
1811 for {
1812 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1813 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
1814 continue
1815 }
1816 x := v_1
1817 v.copyOf(x)
1818 return true
1819 }
1820 break
1821 }
1822
1823
1824 for {
1825 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1826 x := v_0
1827 if v_1.Op != OpNeg64 {
1828 continue
1829 }
1830 y := v_1.Args[0]
1831 v.reset(OpSub64)
1832 v.AddArg2(x, y)
1833 return true
1834 }
1835 break
1836 }
1837
1838
1839 for {
1840 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1841 if v_0.Op != OpCom64 {
1842 continue
1843 }
1844 x := v_0.Args[0]
1845 if x != v_1 {
1846 continue
1847 }
1848 v.reset(OpConst64)
1849 v.AuxInt = int64ToAuxInt(-1)
1850 return true
1851 }
1852 break
1853 }
1854
1855
1856 for {
1857 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1858 if v_0.Op != OpSub64 {
1859 continue
1860 }
1861 t := v_0.Args[1]
1862 x := v_0.Args[0]
1863 if v_1.Op != OpAdd64 {
1864 continue
1865 }
1866 _ = v_1.Args[1]
1867 v_1_0 := v_1.Args[0]
1868 v_1_1 := v_1.Args[1]
1869 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1870 if t != v_1_0 {
1871 continue
1872 }
1873 y := v_1_1
1874 v.reset(OpAdd64)
1875 v.AddArg2(x, y)
1876 return true
1877 }
1878 }
1879 break
1880 }
1881
1882
1883 for {
1884 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1885 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 || v_1.Op != OpCom64 {
1886 continue
1887 }
1888 x := v_1.Args[0]
1889 v.reset(OpNeg64)
1890 v.AddArg(x)
1891 return true
1892 }
1893 break
1894 }
1895
1896
1897 for {
1898 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1899 x := v_0
1900 if v_1.Op != OpSub64 {
1901 continue
1902 }
1903 _ = v_1.Args[1]
1904 y := v_1.Args[0]
1905 if x != v_1.Args[1] {
1906 continue
1907 }
1908 v.copyOf(y)
1909 return true
1910 }
1911 break
1912 }
1913
1914
1915 for {
1916 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1917 x := v_0
1918 if v_1.Op != OpAdd64 {
1919 continue
1920 }
1921 _ = v_1.Args[1]
1922 v_1_0 := v_1.Args[0]
1923 v_1_1 := v_1.Args[1]
1924 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1925 y := v_1_0
1926 if v_1_1.Op != OpSub64 {
1927 continue
1928 }
1929 _ = v_1_1.Args[1]
1930 z := v_1_1.Args[0]
1931 if x != v_1_1.Args[1] {
1932 continue
1933 }
1934 v.reset(OpAdd64)
1935 v.AddArg2(y, z)
1936 return true
1937 }
1938 }
1939 break
1940 }
1941
1942
1943
1944 for {
1945 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1946 if v_0.Op != OpAdd64 {
1947 continue
1948 }
1949 _ = v_0.Args[1]
1950 v_0_0 := v_0.Args[0]
1951 v_0_1 := v_0.Args[1]
1952 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1953 i := v_0_0
1954 if i.Op != OpConst64 {
1955 continue
1956 }
1957 t := i.Type
1958 z := v_0_1
1959 x := v_1
1960 if !(z.Op != OpConst64 && x.Op != OpConst64) {
1961 continue
1962 }
1963 v.reset(OpAdd64)
1964 v0 := b.NewValue0(v.Pos, OpAdd64, t)
1965 v0.AddArg2(z, x)
1966 v.AddArg2(i, v0)
1967 return true
1968 }
1969 }
1970 break
1971 }
1972
1973
1974
1975 for {
1976 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1977 if v_0.Op != OpSub64 {
1978 continue
1979 }
1980 z := v_0.Args[1]
1981 i := v_0.Args[0]
1982 if i.Op != OpConst64 {
1983 continue
1984 }
1985 t := i.Type
1986 x := v_1
1987 if !(z.Op != OpConst64 && x.Op != OpConst64) {
1988 continue
1989 }
1990 v.reset(OpAdd64)
1991 v0 := b.NewValue0(v.Pos, OpSub64, t)
1992 v0.AddArg2(x, z)
1993 v.AddArg2(i, v0)
1994 return true
1995 }
1996 break
1997 }
1998
1999
2000 for {
2001 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2002 if v_0.Op != OpConst64 {
2003 continue
2004 }
2005 t := v_0.Type
2006 c := auxIntToInt64(v_0.AuxInt)
2007 if v_1.Op != OpAdd64 {
2008 continue
2009 }
2010 _ = v_1.Args[1]
2011 v_1_0 := v_1.Args[0]
2012 v_1_1 := v_1.Args[1]
2013 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2014 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
2015 continue
2016 }
2017 d := auxIntToInt64(v_1_0.AuxInt)
2018 x := v_1_1
2019 v.reset(OpAdd64)
2020 v0 := b.NewValue0(v.Pos, OpConst64, t)
2021 v0.AuxInt = int64ToAuxInt(c + d)
2022 v.AddArg2(v0, x)
2023 return true
2024 }
2025 }
2026 break
2027 }
2028
2029
2030 for {
2031 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2032 if v_0.Op != OpConst64 {
2033 continue
2034 }
2035 t := v_0.Type
2036 c := auxIntToInt64(v_0.AuxInt)
2037 if v_1.Op != OpSub64 {
2038 continue
2039 }
2040 x := v_1.Args[1]
2041 v_1_0 := v_1.Args[0]
2042 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
2043 continue
2044 }
2045 d := auxIntToInt64(v_1_0.AuxInt)
2046 v.reset(OpSub64)
2047 v0 := b.NewValue0(v.Pos, OpConst64, t)
2048 v0.AuxInt = int64ToAuxInt(c + d)
2049 v.AddArg2(v0, x)
2050 return true
2051 }
2052 break
2053 }
2054
2055
2056
2057 for {
2058 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2059 if v_0.Op != OpLsh64x64 {
2060 continue
2061 }
2062 _ = v_0.Args[1]
2063 x := v_0.Args[0]
2064 z := v_0.Args[1]
2065 if z.Op != OpConst64 {
2066 continue
2067 }
2068 c := auxIntToInt64(z.AuxInt)
2069 if v_1.Op != OpRsh64Ux64 {
2070 continue
2071 }
2072 _ = v_1.Args[1]
2073 if x != v_1.Args[0] {
2074 continue
2075 }
2076 v_1_1 := v_1.Args[1]
2077 if v_1_1.Op != OpConst64 {
2078 continue
2079 }
2080 d := auxIntToInt64(v_1_1.AuxInt)
2081 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
2082 continue
2083 }
2084 v.reset(OpRotateLeft64)
2085 v.AddArg2(x, z)
2086 return true
2087 }
2088 break
2089 }
2090
2091
2092
2093 for {
2094 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2095 left := v_0
2096 if left.Op != OpLsh64x64 {
2097 continue
2098 }
2099 y := left.Args[1]
2100 x := left.Args[0]
2101 right := v_1
2102 if right.Op != OpRsh64Ux64 {
2103 continue
2104 }
2105 _ = right.Args[1]
2106 if x != right.Args[0] {
2107 continue
2108 }
2109 right_1 := right.Args[1]
2110 if right_1.Op != OpSub64 {
2111 continue
2112 }
2113 _ = right_1.Args[1]
2114 right_1_0 := right_1.Args[0]
2115 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2116 continue
2117 }
2118 v.reset(OpRotateLeft64)
2119 v.AddArg2(x, y)
2120 return true
2121 }
2122 break
2123 }
2124
2125
2126
2127 for {
2128 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2129 left := v_0
2130 if left.Op != OpLsh64x32 {
2131 continue
2132 }
2133 y := left.Args[1]
2134 x := left.Args[0]
2135 right := v_1
2136 if right.Op != OpRsh64Ux32 {
2137 continue
2138 }
2139 _ = right.Args[1]
2140 if x != right.Args[0] {
2141 continue
2142 }
2143 right_1 := right.Args[1]
2144 if right_1.Op != OpSub32 {
2145 continue
2146 }
2147 _ = right_1.Args[1]
2148 right_1_0 := right_1.Args[0]
2149 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2150 continue
2151 }
2152 v.reset(OpRotateLeft64)
2153 v.AddArg2(x, y)
2154 return true
2155 }
2156 break
2157 }
2158
2159
2160
2161 for {
2162 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2163 left := v_0
2164 if left.Op != OpLsh64x16 {
2165 continue
2166 }
2167 y := left.Args[1]
2168 x := left.Args[0]
2169 right := v_1
2170 if right.Op != OpRsh64Ux16 {
2171 continue
2172 }
2173 _ = right.Args[1]
2174 if x != right.Args[0] {
2175 continue
2176 }
2177 right_1 := right.Args[1]
2178 if right_1.Op != OpSub16 {
2179 continue
2180 }
2181 _ = right_1.Args[1]
2182 right_1_0 := right_1.Args[0]
2183 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2184 continue
2185 }
2186 v.reset(OpRotateLeft64)
2187 v.AddArg2(x, y)
2188 return true
2189 }
2190 break
2191 }
2192
2193
2194
2195 for {
2196 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2197 left := v_0
2198 if left.Op != OpLsh64x8 {
2199 continue
2200 }
2201 y := left.Args[1]
2202 x := left.Args[0]
2203 right := v_1
2204 if right.Op != OpRsh64Ux8 {
2205 continue
2206 }
2207 _ = right.Args[1]
2208 if x != right.Args[0] {
2209 continue
2210 }
2211 right_1 := right.Args[1]
2212 if right_1.Op != OpSub8 {
2213 continue
2214 }
2215 _ = right_1.Args[1]
2216 right_1_0 := right_1.Args[0]
2217 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2218 continue
2219 }
2220 v.reset(OpRotateLeft64)
2221 v.AddArg2(x, y)
2222 return true
2223 }
2224 break
2225 }
2226
2227
2228
2229 for {
2230 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2231 right := v_0
2232 if right.Op != OpRsh64Ux64 {
2233 continue
2234 }
2235 y := right.Args[1]
2236 x := right.Args[0]
2237 left := v_1
2238 if left.Op != OpLsh64x64 {
2239 continue
2240 }
2241 _ = left.Args[1]
2242 if x != left.Args[0] {
2243 continue
2244 }
2245 z := left.Args[1]
2246 if z.Op != OpSub64 {
2247 continue
2248 }
2249 _ = z.Args[1]
2250 z_0 := z.Args[0]
2251 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2252 continue
2253 }
2254 v.reset(OpRotateLeft64)
2255 v.AddArg2(x, z)
2256 return true
2257 }
2258 break
2259 }
2260
2261
2262
2263 for {
2264 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2265 right := v_0
2266 if right.Op != OpRsh64Ux32 {
2267 continue
2268 }
2269 y := right.Args[1]
2270 x := right.Args[0]
2271 left := v_1
2272 if left.Op != OpLsh64x32 {
2273 continue
2274 }
2275 _ = left.Args[1]
2276 if x != left.Args[0] {
2277 continue
2278 }
2279 z := left.Args[1]
2280 if z.Op != OpSub32 {
2281 continue
2282 }
2283 _ = z.Args[1]
2284 z_0 := z.Args[0]
2285 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2286 continue
2287 }
2288 v.reset(OpRotateLeft64)
2289 v.AddArg2(x, z)
2290 return true
2291 }
2292 break
2293 }
2294
2295
2296
2297 for {
2298 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2299 right := v_0
2300 if right.Op != OpRsh64Ux16 {
2301 continue
2302 }
2303 y := right.Args[1]
2304 x := right.Args[0]
2305 left := v_1
2306 if left.Op != OpLsh64x16 {
2307 continue
2308 }
2309 _ = left.Args[1]
2310 if x != left.Args[0] {
2311 continue
2312 }
2313 z := left.Args[1]
2314 if z.Op != OpSub16 {
2315 continue
2316 }
2317 _ = z.Args[1]
2318 z_0 := z.Args[0]
2319 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2320 continue
2321 }
2322 v.reset(OpRotateLeft64)
2323 v.AddArg2(x, z)
2324 return true
2325 }
2326 break
2327 }
2328
2329
2330
2331 for {
2332 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2333 right := v_0
2334 if right.Op != OpRsh64Ux8 {
2335 continue
2336 }
2337 y := right.Args[1]
2338 x := right.Args[0]
2339 left := v_1
2340 if left.Op != OpLsh64x8 {
2341 continue
2342 }
2343 _ = left.Args[1]
2344 if x != left.Args[0] {
2345 continue
2346 }
2347 z := left.Args[1]
2348 if z.Op != OpSub8 {
2349 continue
2350 }
2351 _ = z.Args[1]
2352 z_0 := z.Args[0]
2353 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2354 continue
2355 }
2356 v.reset(OpRotateLeft64)
2357 v.AddArg2(x, z)
2358 return true
2359 }
2360 break
2361 }
2362 return false
2363 }
2364 func rewriteValuegeneric_OpAdd64F(v *Value) bool {
2365 v_1 := v.Args[1]
2366 v_0 := v.Args[0]
2367
2368
2369
2370 for {
2371 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2372 if v_0.Op != OpConst64F {
2373 continue
2374 }
2375 c := auxIntToFloat64(v_0.AuxInt)
2376 if v_1.Op != OpConst64F {
2377 continue
2378 }
2379 d := auxIntToFloat64(v_1.AuxInt)
2380 if !(c+d == c+d) {
2381 continue
2382 }
2383 v.reset(OpConst64F)
2384 v.AuxInt = float64ToAuxInt(c + d)
2385 return true
2386 }
2387 break
2388 }
2389 return false
2390 }
2391 func rewriteValuegeneric_OpAdd64carry(v *Value) bool {
2392 v_2 := v.Args[2]
2393 v_1 := v.Args[1]
2394 v_0 := v.Args[0]
2395 b := v.Block
2396
2397
2398
2399 for {
2400 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2401 if v_0.Op != OpConst64 {
2402 continue
2403 }
2404 t := v_0.Type
2405 x := auxIntToInt64(v_0.AuxInt)
2406 if v_1.Op != OpConst64 {
2407 continue
2408 }
2409 y := auxIntToInt64(v_1.AuxInt)
2410 if v_2.Op != OpConst64 {
2411 continue
2412 }
2413 c := auxIntToInt64(v_2.AuxInt)
2414 if !(c >= 0 && c <= 1) {
2415 continue
2416 }
2417 v.reset(OpMakeTuple)
2418 v0 := b.NewValue0(v.Pos, OpConst64, t)
2419 v0.AuxInt = int64ToAuxInt(bitsAdd64(x, y, c).sum)
2420 v1 := b.NewValue0(v.Pos, OpConst64, t)
2421 v1.AuxInt = int64ToAuxInt(bitsAdd64(x, y, c).carry)
2422 v.AddArg2(v0, v1)
2423 return true
2424 }
2425 break
2426 }
2427 return false
2428 }
2429 func rewriteValuegeneric_OpAdd8(v *Value) bool {
2430 v_1 := v.Args[1]
2431 v_0 := v.Args[0]
2432 b := v.Block
2433 config := b.Func.Config
2434
2435
2436 for {
2437 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2438 if v_0.Op != OpConst8 {
2439 continue
2440 }
2441 c := auxIntToInt8(v_0.AuxInt)
2442 if v_1.Op != OpConst8 {
2443 continue
2444 }
2445 d := auxIntToInt8(v_1.AuxInt)
2446 v.reset(OpConst8)
2447 v.AuxInt = int8ToAuxInt(c + d)
2448 return true
2449 }
2450 break
2451 }
2452
2453
2454 for {
2455 t := v.Type
2456 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2457 if v_0.Op != OpMul8 {
2458 continue
2459 }
2460 _ = v_0.Args[1]
2461 v_0_0 := v_0.Args[0]
2462 v_0_1 := v_0.Args[1]
2463 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
2464 x := v_0_0
2465 y := v_0_1
2466 if v_1.Op != OpMul8 {
2467 continue
2468 }
2469 _ = v_1.Args[1]
2470 v_1_0 := v_1.Args[0]
2471 v_1_1 := v_1.Args[1]
2472 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
2473 if x != v_1_0 {
2474 continue
2475 }
2476 z := v_1_1
2477 v.reset(OpMul8)
2478 v0 := b.NewValue0(v.Pos, OpAdd8, t)
2479 v0.AddArg2(y, z)
2480 v.AddArg2(x, v0)
2481 return true
2482 }
2483 }
2484 }
2485 break
2486 }
2487
2488
2489 for {
2490 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2491 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
2492 continue
2493 }
2494 x := v_1
2495 v.copyOf(x)
2496 return true
2497 }
2498 break
2499 }
2500
2501
2502 for {
2503 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2504 x := v_0
2505 if v_1.Op != OpNeg8 {
2506 continue
2507 }
2508 y := v_1.Args[0]
2509 v.reset(OpSub8)
2510 v.AddArg2(x, y)
2511 return true
2512 }
2513 break
2514 }
2515
2516
2517 for {
2518 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2519 if v_0.Op != OpCom8 {
2520 continue
2521 }
2522 x := v_0.Args[0]
2523 if x != v_1 {
2524 continue
2525 }
2526 v.reset(OpConst8)
2527 v.AuxInt = int8ToAuxInt(-1)
2528 return true
2529 }
2530 break
2531 }
2532
2533
2534 for {
2535 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2536 if v_0.Op != OpSub8 {
2537 continue
2538 }
2539 t := v_0.Args[1]
2540 x := v_0.Args[0]
2541 if v_1.Op != OpAdd8 {
2542 continue
2543 }
2544 _ = v_1.Args[1]
2545 v_1_0 := v_1.Args[0]
2546 v_1_1 := v_1.Args[1]
2547 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2548 if t != v_1_0 {
2549 continue
2550 }
2551 y := v_1_1
2552 v.reset(OpAdd8)
2553 v.AddArg2(x, y)
2554 return true
2555 }
2556 }
2557 break
2558 }
2559
2560
2561 for {
2562 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2563 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 1 || v_1.Op != OpCom8 {
2564 continue
2565 }
2566 x := v_1.Args[0]
2567 v.reset(OpNeg8)
2568 v.AddArg(x)
2569 return true
2570 }
2571 break
2572 }
2573
2574
2575 for {
2576 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2577 x := v_0
2578 if v_1.Op != OpSub8 {
2579 continue
2580 }
2581 _ = v_1.Args[1]
2582 y := v_1.Args[0]
2583 if x != v_1.Args[1] {
2584 continue
2585 }
2586 v.copyOf(y)
2587 return true
2588 }
2589 break
2590 }
2591
2592
2593 for {
2594 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2595 x := v_0
2596 if v_1.Op != OpAdd8 {
2597 continue
2598 }
2599 _ = v_1.Args[1]
2600 v_1_0 := v_1.Args[0]
2601 v_1_1 := v_1.Args[1]
2602 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2603 y := v_1_0
2604 if v_1_1.Op != OpSub8 {
2605 continue
2606 }
2607 _ = v_1_1.Args[1]
2608 z := v_1_1.Args[0]
2609 if x != v_1_1.Args[1] {
2610 continue
2611 }
2612 v.reset(OpAdd8)
2613 v.AddArg2(y, z)
2614 return true
2615 }
2616 }
2617 break
2618 }
2619
2620
2621
2622 for {
2623 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2624 if v_0.Op != OpAdd8 {
2625 continue
2626 }
2627 _ = v_0.Args[1]
2628 v_0_0 := v_0.Args[0]
2629 v_0_1 := v_0.Args[1]
2630 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
2631 i := v_0_0
2632 if i.Op != OpConst8 {
2633 continue
2634 }
2635 t := i.Type
2636 z := v_0_1
2637 x := v_1
2638 if !(z.Op != OpConst8 && x.Op != OpConst8) {
2639 continue
2640 }
2641 v.reset(OpAdd8)
2642 v0 := b.NewValue0(v.Pos, OpAdd8, t)
2643 v0.AddArg2(z, x)
2644 v.AddArg2(i, v0)
2645 return true
2646 }
2647 }
2648 break
2649 }
2650
2651
2652
2653 for {
2654 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2655 if v_0.Op != OpSub8 {
2656 continue
2657 }
2658 z := v_0.Args[1]
2659 i := v_0.Args[0]
2660 if i.Op != OpConst8 {
2661 continue
2662 }
2663 t := i.Type
2664 x := v_1
2665 if !(z.Op != OpConst8 && x.Op != OpConst8) {
2666 continue
2667 }
2668 v.reset(OpAdd8)
2669 v0 := b.NewValue0(v.Pos, OpSub8, t)
2670 v0.AddArg2(x, z)
2671 v.AddArg2(i, v0)
2672 return true
2673 }
2674 break
2675 }
2676
2677
2678 for {
2679 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2680 if v_0.Op != OpConst8 {
2681 continue
2682 }
2683 t := v_0.Type
2684 c := auxIntToInt8(v_0.AuxInt)
2685 if v_1.Op != OpAdd8 {
2686 continue
2687 }
2688 _ = v_1.Args[1]
2689 v_1_0 := v_1.Args[0]
2690 v_1_1 := v_1.Args[1]
2691 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2692 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
2693 continue
2694 }
2695 d := auxIntToInt8(v_1_0.AuxInt)
2696 x := v_1_1
2697 v.reset(OpAdd8)
2698 v0 := b.NewValue0(v.Pos, OpConst8, t)
2699 v0.AuxInt = int8ToAuxInt(c + d)
2700 v.AddArg2(v0, x)
2701 return true
2702 }
2703 }
2704 break
2705 }
2706
2707
2708 for {
2709 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2710 if v_0.Op != OpConst8 {
2711 continue
2712 }
2713 t := v_0.Type
2714 c := auxIntToInt8(v_0.AuxInt)
2715 if v_1.Op != OpSub8 {
2716 continue
2717 }
2718 x := v_1.Args[1]
2719 v_1_0 := v_1.Args[0]
2720 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
2721 continue
2722 }
2723 d := auxIntToInt8(v_1_0.AuxInt)
2724 v.reset(OpSub8)
2725 v0 := b.NewValue0(v.Pos, OpConst8, t)
2726 v0.AuxInt = int8ToAuxInt(c + d)
2727 v.AddArg2(v0, x)
2728 return true
2729 }
2730 break
2731 }
2732
2733
2734
2735 for {
2736 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2737 if v_0.Op != OpLsh8x64 {
2738 continue
2739 }
2740 _ = v_0.Args[1]
2741 x := v_0.Args[0]
2742 z := v_0.Args[1]
2743 if z.Op != OpConst64 {
2744 continue
2745 }
2746 c := auxIntToInt64(z.AuxInt)
2747 if v_1.Op != OpRsh8Ux64 {
2748 continue
2749 }
2750 _ = v_1.Args[1]
2751 if x != v_1.Args[0] {
2752 continue
2753 }
2754 v_1_1 := v_1.Args[1]
2755 if v_1_1.Op != OpConst64 {
2756 continue
2757 }
2758 d := auxIntToInt64(v_1_1.AuxInt)
2759 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
2760 continue
2761 }
2762 v.reset(OpRotateLeft8)
2763 v.AddArg2(x, z)
2764 return true
2765 }
2766 break
2767 }
2768
2769
2770
2771 for {
2772 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2773 left := v_0
2774 if left.Op != OpLsh8x64 {
2775 continue
2776 }
2777 y := left.Args[1]
2778 x := left.Args[0]
2779 right := v_1
2780 if right.Op != OpRsh8Ux64 {
2781 continue
2782 }
2783 _ = right.Args[1]
2784 if x != right.Args[0] {
2785 continue
2786 }
2787 right_1 := right.Args[1]
2788 if right_1.Op != OpSub64 {
2789 continue
2790 }
2791 _ = right_1.Args[1]
2792 right_1_0 := right_1.Args[0]
2793 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2794 continue
2795 }
2796 v.reset(OpRotateLeft8)
2797 v.AddArg2(x, y)
2798 return true
2799 }
2800 break
2801 }
2802
2803
2804
2805 for {
2806 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2807 left := v_0
2808 if left.Op != OpLsh8x32 {
2809 continue
2810 }
2811 y := left.Args[1]
2812 x := left.Args[0]
2813 right := v_1
2814 if right.Op != OpRsh8Ux32 {
2815 continue
2816 }
2817 _ = right.Args[1]
2818 if x != right.Args[0] {
2819 continue
2820 }
2821 right_1 := right.Args[1]
2822 if right_1.Op != OpSub32 {
2823 continue
2824 }
2825 _ = right_1.Args[1]
2826 right_1_0 := right_1.Args[0]
2827 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2828 continue
2829 }
2830 v.reset(OpRotateLeft8)
2831 v.AddArg2(x, y)
2832 return true
2833 }
2834 break
2835 }
2836
2837
2838
2839 for {
2840 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2841 left := v_0
2842 if left.Op != OpLsh8x16 {
2843 continue
2844 }
2845 y := left.Args[1]
2846 x := left.Args[0]
2847 right := v_1
2848 if right.Op != OpRsh8Ux16 {
2849 continue
2850 }
2851 _ = right.Args[1]
2852 if x != right.Args[0] {
2853 continue
2854 }
2855 right_1 := right.Args[1]
2856 if right_1.Op != OpSub16 {
2857 continue
2858 }
2859 _ = right_1.Args[1]
2860 right_1_0 := right_1.Args[0]
2861 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2862 continue
2863 }
2864 v.reset(OpRotateLeft8)
2865 v.AddArg2(x, y)
2866 return true
2867 }
2868 break
2869 }
2870
2871
2872
2873 for {
2874 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2875 left := v_0
2876 if left.Op != OpLsh8x8 {
2877 continue
2878 }
2879 y := left.Args[1]
2880 x := left.Args[0]
2881 right := v_1
2882 if right.Op != OpRsh8Ux8 {
2883 continue
2884 }
2885 _ = right.Args[1]
2886 if x != right.Args[0] {
2887 continue
2888 }
2889 right_1 := right.Args[1]
2890 if right_1.Op != OpSub8 {
2891 continue
2892 }
2893 _ = right_1.Args[1]
2894 right_1_0 := right_1.Args[0]
2895 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2896 continue
2897 }
2898 v.reset(OpRotateLeft8)
2899 v.AddArg2(x, y)
2900 return true
2901 }
2902 break
2903 }
2904
2905
2906
2907 for {
2908 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2909 right := v_0
2910 if right.Op != OpRsh8Ux64 {
2911 continue
2912 }
2913 y := right.Args[1]
2914 x := right.Args[0]
2915 left := v_1
2916 if left.Op != OpLsh8x64 {
2917 continue
2918 }
2919 _ = left.Args[1]
2920 if x != left.Args[0] {
2921 continue
2922 }
2923 z := left.Args[1]
2924 if z.Op != OpSub64 {
2925 continue
2926 }
2927 _ = z.Args[1]
2928 z_0 := z.Args[0]
2929 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2930 continue
2931 }
2932 v.reset(OpRotateLeft8)
2933 v.AddArg2(x, z)
2934 return true
2935 }
2936 break
2937 }
2938
2939
2940
2941 for {
2942 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2943 right := v_0
2944 if right.Op != OpRsh8Ux32 {
2945 continue
2946 }
2947 y := right.Args[1]
2948 x := right.Args[0]
2949 left := v_1
2950 if left.Op != OpLsh8x32 {
2951 continue
2952 }
2953 _ = left.Args[1]
2954 if x != left.Args[0] {
2955 continue
2956 }
2957 z := left.Args[1]
2958 if z.Op != OpSub32 {
2959 continue
2960 }
2961 _ = z.Args[1]
2962 z_0 := z.Args[0]
2963 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2964 continue
2965 }
2966 v.reset(OpRotateLeft8)
2967 v.AddArg2(x, z)
2968 return true
2969 }
2970 break
2971 }
2972
2973
2974
2975 for {
2976 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2977 right := v_0
2978 if right.Op != OpRsh8Ux16 {
2979 continue
2980 }
2981 y := right.Args[1]
2982 x := right.Args[0]
2983 left := v_1
2984 if left.Op != OpLsh8x16 {
2985 continue
2986 }
2987 _ = left.Args[1]
2988 if x != left.Args[0] {
2989 continue
2990 }
2991 z := left.Args[1]
2992 if z.Op != OpSub16 {
2993 continue
2994 }
2995 _ = z.Args[1]
2996 z_0 := z.Args[0]
2997 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2998 continue
2999 }
3000 v.reset(OpRotateLeft8)
3001 v.AddArg2(x, z)
3002 return true
3003 }
3004 break
3005 }
3006
3007
3008
3009 for {
3010 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3011 right := v_0
3012 if right.Op != OpRsh8Ux8 {
3013 continue
3014 }
3015 y := right.Args[1]
3016 x := right.Args[0]
3017 left := v_1
3018 if left.Op != OpLsh8x8 {
3019 continue
3020 }
3021 _ = left.Args[1]
3022 if x != left.Args[0] {
3023 continue
3024 }
3025 z := left.Args[1]
3026 if z.Op != OpSub8 {
3027 continue
3028 }
3029 _ = z.Args[1]
3030 z_0 := z.Args[0]
3031 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
3032 continue
3033 }
3034 v.reset(OpRotateLeft8)
3035 v.AddArg2(x, z)
3036 return true
3037 }
3038 break
3039 }
3040 return false
3041 }
3042 func rewriteValuegeneric_OpAddPtr(v *Value) bool {
3043 v_1 := v.Args[1]
3044 v_0 := v.Args[0]
3045
3046
3047 for {
3048 t := v.Type
3049 x := v_0
3050 if v_1.Op != OpConst64 {
3051 break
3052 }
3053 c := auxIntToInt64(v_1.AuxInt)
3054 v.reset(OpOffPtr)
3055 v.Type = t
3056 v.AuxInt = int64ToAuxInt(c)
3057 v.AddArg(x)
3058 return true
3059 }
3060
3061
3062 for {
3063 t := v.Type
3064 x := v_0
3065 if v_1.Op != OpConst32 {
3066 break
3067 }
3068 c := auxIntToInt32(v_1.AuxInt)
3069 v.reset(OpOffPtr)
3070 v.Type = t
3071 v.AuxInt = int64ToAuxInt(int64(c))
3072 v.AddArg(x)
3073 return true
3074 }
3075 return false
3076 }
3077 func rewriteValuegeneric_OpAnd16(v *Value) bool {
3078 v_1 := v.Args[1]
3079 v_0 := v.Args[0]
3080 b := v.Block
3081
3082
3083 for {
3084 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3085 if v_0.Op != OpConst16 {
3086 continue
3087 }
3088 c := auxIntToInt16(v_0.AuxInt)
3089 if v_1.Op != OpConst16 {
3090 continue
3091 }
3092 d := auxIntToInt16(v_1.AuxInt)
3093 v.reset(OpConst16)
3094 v.AuxInt = int16ToAuxInt(c & d)
3095 return true
3096 }
3097 break
3098 }
3099
3100
3101 for {
3102 t := v.Type
3103 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3104 if v_0.Op != OpCom16 {
3105 continue
3106 }
3107 x := v_0.Args[0]
3108 if v_1.Op != OpCom16 {
3109 continue
3110 }
3111 y := v_1.Args[0]
3112 v.reset(OpCom16)
3113 v0 := b.NewValue0(v.Pos, OpOr16, t)
3114 v0.AddArg2(x, y)
3115 v.AddArg(v0)
3116 return true
3117 }
3118 break
3119 }
3120
3121
3122
3123 for {
3124 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3125 if v_0.Op != OpConst16 {
3126 continue
3127 }
3128 m := auxIntToInt16(v_0.AuxInt)
3129 if v_1.Op != OpRsh16Ux64 {
3130 continue
3131 }
3132 _ = v_1.Args[1]
3133 v_1_1 := v_1.Args[1]
3134 if v_1_1.Op != OpConst64 {
3135 continue
3136 }
3137 c := auxIntToInt64(v_1_1.AuxInt)
3138 if !(c >= int64(16-ntz16(m))) {
3139 continue
3140 }
3141 v.reset(OpConst16)
3142 v.AuxInt = int16ToAuxInt(0)
3143 return true
3144 }
3145 break
3146 }
3147
3148
3149
3150 for {
3151 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3152 if v_0.Op != OpConst16 {
3153 continue
3154 }
3155 m := auxIntToInt16(v_0.AuxInt)
3156 if v_1.Op != OpLsh16x64 {
3157 continue
3158 }
3159 _ = v_1.Args[1]
3160 v_1_1 := v_1.Args[1]
3161 if v_1_1.Op != OpConst64 {
3162 continue
3163 }
3164 c := auxIntToInt64(v_1_1.AuxInt)
3165 if !(c >= int64(16-nlz16(m))) {
3166 continue
3167 }
3168 v.reset(OpConst16)
3169 v.AuxInt = int16ToAuxInt(0)
3170 return true
3171 }
3172 break
3173 }
3174
3175
3176 for {
3177 x := v_0
3178 if x != v_1 {
3179 break
3180 }
3181 v.copyOf(x)
3182 return true
3183 }
3184
3185
3186 for {
3187 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3188 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
3189 continue
3190 }
3191 x := v_1
3192 v.copyOf(x)
3193 return true
3194 }
3195 break
3196 }
3197
3198
3199 for {
3200 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3201 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
3202 continue
3203 }
3204 v.reset(OpConst16)
3205 v.AuxInt = int16ToAuxInt(0)
3206 return true
3207 }
3208 break
3209 }
3210
3211
3212 for {
3213 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3214 if v_0.Op != OpCom16 {
3215 continue
3216 }
3217 x := v_0.Args[0]
3218 if x != v_1 {
3219 continue
3220 }
3221 v.reset(OpConst16)
3222 v.AuxInt = int16ToAuxInt(0)
3223 return true
3224 }
3225 break
3226 }
3227
3228
3229 for {
3230 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3231 x := v_0
3232 if v_1.Op != OpAnd16 {
3233 continue
3234 }
3235 _ = v_1.Args[1]
3236 v_1_0 := v_1.Args[0]
3237 v_1_1 := v_1.Args[1]
3238 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3239 if x != v_1_0 {
3240 continue
3241 }
3242 y := v_1_1
3243 v.reset(OpAnd16)
3244 v.AddArg2(x, y)
3245 return true
3246 }
3247 }
3248 break
3249 }
3250
3251
3252
3253 for {
3254 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3255 if v_0.Op != OpAnd16 {
3256 continue
3257 }
3258 _ = v_0.Args[1]
3259 v_0_0 := v_0.Args[0]
3260 v_0_1 := v_0.Args[1]
3261 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3262 i := v_0_0
3263 if i.Op != OpConst16 {
3264 continue
3265 }
3266 t := i.Type
3267 z := v_0_1
3268 x := v_1
3269 if !(z.Op != OpConst16 && x.Op != OpConst16) {
3270 continue
3271 }
3272 v.reset(OpAnd16)
3273 v0 := b.NewValue0(v.Pos, OpAnd16, t)
3274 v0.AddArg2(z, x)
3275 v.AddArg2(i, v0)
3276 return true
3277 }
3278 }
3279 break
3280 }
3281
3282
3283 for {
3284 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3285 if v_0.Op != OpConst16 {
3286 continue
3287 }
3288 t := v_0.Type
3289 c := auxIntToInt16(v_0.AuxInt)
3290 if v_1.Op != OpAnd16 {
3291 continue
3292 }
3293 _ = v_1.Args[1]
3294 v_1_0 := v_1.Args[0]
3295 v_1_1 := v_1.Args[1]
3296 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3297 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
3298 continue
3299 }
3300 d := auxIntToInt16(v_1_0.AuxInt)
3301 x := v_1_1
3302 v.reset(OpAnd16)
3303 v0 := b.NewValue0(v.Pos, OpConst16, t)
3304 v0.AuxInt = int16ToAuxInt(c & d)
3305 v.AddArg2(v0, x)
3306 return true
3307 }
3308 }
3309 break
3310 }
3311 return false
3312 }
3313 func rewriteValuegeneric_OpAnd32(v *Value) bool {
3314 v_1 := v.Args[1]
3315 v_0 := v.Args[0]
3316 b := v.Block
3317
3318
3319 for {
3320 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3321 if v_0.Op != OpConst32 {
3322 continue
3323 }
3324 c := auxIntToInt32(v_0.AuxInt)
3325 if v_1.Op != OpConst32 {
3326 continue
3327 }
3328 d := auxIntToInt32(v_1.AuxInt)
3329 v.reset(OpConst32)
3330 v.AuxInt = int32ToAuxInt(c & d)
3331 return true
3332 }
3333 break
3334 }
3335
3336
3337 for {
3338 t := v.Type
3339 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3340 if v_0.Op != OpCom32 {
3341 continue
3342 }
3343 x := v_0.Args[0]
3344 if v_1.Op != OpCom32 {
3345 continue
3346 }
3347 y := v_1.Args[0]
3348 v.reset(OpCom32)
3349 v0 := b.NewValue0(v.Pos, OpOr32, t)
3350 v0.AddArg2(x, y)
3351 v.AddArg(v0)
3352 return true
3353 }
3354 break
3355 }
3356
3357
3358
3359 for {
3360 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3361 if v_0.Op != OpConst32 {
3362 continue
3363 }
3364 m := auxIntToInt32(v_0.AuxInt)
3365 if v_1.Op != OpRsh32Ux64 {
3366 continue
3367 }
3368 _ = v_1.Args[1]
3369 v_1_1 := v_1.Args[1]
3370 if v_1_1.Op != OpConst64 {
3371 continue
3372 }
3373 c := auxIntToInt64(v_1_1.AuxInt)
3374 if !(c >= int64(32-ntz32(m))) {
3375 continue
3376 }
3377 v.reset(OpConst32)
3378 v.AuxInt = int32ToAuxInt(0)
3379 return true
3380 }
3381 break
3382 }
3383
3384
3385
3386 for {
3387 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3388 if v_0.Op != OpConst32 {
3389 continue
3390 }
3391 m := auxIntToInt32(v_0.AuxInt)
3392 if v_1.Op != OpLsh32x64 {
3393 continue
3394 }
3395 _ = v_1.Args[1]
3396 v_1_1 := v_1.Args[1]
3397 if v_1_1.Op != OpConst64 {
3398 continue
3399 }
3400 c := auxIntToInt64(v_1_1.AuxInt)
3401 if !(c >= int64(32-nlz32(m))) {
3402 continue
3403 }
3404 v.reset(OpConst32)
3405 v.AuxInt = int32ToAuxInt(0)
3406 return true
3407 }
3408 break
3409 }
3410
3411
3412 for {
3413 x := v_0
3414 if x != v_1 {
3415 break
3416 }
3417 v.copyOf(x)
3418 return true
3419 }
3420
3421
3422 for {
3423 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3424 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
3425 continue
3426 }
3427 x := v_1
3428 v.copyOf(x)
3429 return true
3430 }
3431 break
3432 }
3433
3434
3435 for {
3436 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3437 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
3438 continue
3439 }
3440 v.reset(OpConst32)
3441 v.AuxInt = int32ToAuxInt(0)
3442 return true
3443 }
3444 break
3445 }
3446
3447
3448 for {
3449 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3450 if v_0.Op != OpCom32 {
3451 continue
3452 }
3453 x := v_0.Args[0]
3454 if x != v_1 {
3455 continue
3456 }
3457 v.reset(OpConst32)
3458 v.AuxInt = int32ToAuxInt(0)
3459 return true
3460 }
3461 break
3462 }
3463
3464
3465 for {
3466 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3467 x := v_0
3468 if v_1.Op != OpAnd32 {
3469 continue
3470 }
3471 _ = v_1.Args[1]
3472 v_1_0 := v_1.Args[0]
3473 v_1_1 := v_1.Args[1]
3474 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3475 if x != v_1_0 {
3476 continue
3477 }
3478 y := v_1_1
3479 v.reset(OpAnd32)
3480 v.AddArg2(x, y)
3481 return true
3482 }
3483 }
3484 break
3485 }
3486
3487
3488
3489 for {
3490 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3491 if v_0.Op != OpAnd32 {
3492 continue
3493 }
3494 _ = v_0.Args[1]
3495 v_0_0 := v_0.Args[0]
3496 v_0_1 := v_0.Args[1]
3497 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3498 i := v_0_0
3499 if i.Op != OpConst32 {
3500 continue
3501 }
3502 t := i.Type
3503 z := v_0_1
3504 x := v_1
3505 if !(z.Op != OpConst32 && x.Op != OpConst32) {
3506 continue
3507 }
3508 v.reset(OpAnd32)
3509 v0 := b.NewValue0(v.Pos, OpAnd32, t)
3510 v0.AddArg2(z, x)
3511 v.AddArg2(i, v0)
3512 return true
3513 }
3514 }
3515 break
3516 }
3517
3518
3519 for {
3520 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3521 if v_0.Op != OpConst32 {
3522 continue
3523 }
3524 t := v_0.Type
3525 c := auxIntToInt32(v_0.AuxInt)
3526 if v_1.Op != OpAnd32 {
3527 continue
3528 }
3529 _ = v_1.Args[1]
3530 v_1_0 := v_1.Args[0]
3531 v_1_1 := v_1.Args[1]
3532 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3533 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
3534 continue
3535 }
3536 d := auxIntToInt32(v_1_0.AuxInt)
3537 x := v_1_1
3538 v.reset(OpAnd32)
3539 v0 := b.NewValue0(v.Pos, OpConst32, t)
3540 v0.AuxInt = int32ToAuxInt(c & d)
3541 v.AddArg2(v0, x)
3542 return true
3543 }
3544 }
3545 break
3546 }
3547 return false
3548 }
3549 func rewriteValuegeneric_OpAnd64(v *Value) bool {
3550 v_1 := v.Args[1]
3551 v_0 := v.Args[0]
3552 b := v.Block
3553
3554
3555 for {
3556 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3557 if v_0.Op != OpConst64 {
3558 continue
3559 }
3560 c := auxIntToInt64(v_0.AuxInt)
3561 if v_1.Op != OpConst64 {
3562 continue
3563 }
3564 d := auxIntToInt64(v_1.AuxInt)
3565 v.reset(OpConst64)
3566 v.AuxInt = int64ToAuxInt(c & d)
3567 return true
3568 }
3569 break
3570 }
3571
3572
3573 for {
3574 t := v.Type
3575 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3576 if v_0.Op != OpCom64 {
3577 continue
3578 }
3579 x := v_0.Args[0]
3580 if v_1.Op != OpCom64 {
3581 continue
3582 }
3583 y := v_1.Args[0]
3584 v.reset(OpCom64)
3585 v0 := b.NewValue0(v.Pos, OpOr64, t)
3586 v0.AddArg2(x, y)
3587 v.AddArg(v0)
3588 return true
3589 }
3590 break
3591 }
3592
3593
3594
3595 for {
3596 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3597 if v_0.Op != OpConst64 {
3598 continue
3599 }
3600 m := auxIntToInt64(v_0.AuxInt)
3601 if v_1.Op != OpRsh64Ux64 {
3602 continue
3603 }
3604 _ = v_1.Args[1]
3605 v_1_1 := v_1.Args[1]
3606 if v_1_1.Op != OpConst64 {
3607 continue
3608 }
3609 c := auxIntToInt64(v_1_1.AuxInt)
3610 if !(c >= int64(64-ntz64(m))) {
3611 continue
3612 }
3613 v.reset(OpConst64)
3614 v.AuxInt = int64ToAuxInt(0)
3615 return true
3616 }
3617 break
3618 }
3619
3620
3621
3622 for {
3623 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3624 if v_0.Op != OpConst64 {
3625 continue
3626 }
3627 m := auxIntToInt64(v_0.AuxInt)
3628 if v_1.Op != OpLsh64x64 {
3629 continue
3630 }
3631 _ = v_1.Args[1]
3632 v_1_1 := v_1.Args[1]
3633 if v_1_1.Op != OpConst64 {
3634 continue
3635 }
3636 c := auxIntToInt64(v_1_1.AuxInt)
3637 if !(c >= int64(64-nlz64(m))) {
3638 continue
3639 }
3640 v.reset(OpConst64)
3641 v.AuxInt = int64ToAuxInt(0)
3642 return true
3643 }
3644 break
3645 }
3646
3647
3648 for {
3649 x := v_0
3650 if x != v_1 {
3651 break
3652 }
3653 v.copyOf(x)
3654 return true
3655 }
3656
3657
3658 for {
3659 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3660 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
3661 continue
3662 }
3663 x := v_1
3664 v.copyOf(x)
3665 return true
3666 }
3667 break
3668 }
3669
3670
3671 for {
3672 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3673 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
3674 continue
3675 }
3676 v.reset(OpConst64)
3677 v.AuxInt = int64ToAuxInt(0)
3678 return true
3679 }
3680 break
3681 }
3682
3683
3684 for {
3685 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3686 if v_0.Op != OpCom64 {
3687 continue
3688 }
3689 x := v_0.Args[0]
3690 if x != v_1 {
3691 continue
3692 }
3693 v.reset(OpConst64)
3694 v.AuxInt = int64ToAuxInt(0)
3695 return true
3696 }
3697 break
3698 }
3699
3700
3701 for {
3702 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3703 x := v_0
3704 if v_1.Op != OpAnd64 {
3705 continue
3706 }
3707 _ = v_1.Args[1]
3708 v_1_0 := v_1.Args[0]
3709 v_1_1 := v_1.Args[1]
3710 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3711 if x != v_1_0 {
3712 continue
3713 }
3714 y := v_1_1
3715 v.reset(OpAnd64)
3716 v.AddArg2(x, y)
3717 return true
3718 }
3719 }
3720 break
3721 }
3722
3723
3724
3725 for {
3726 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3727 if v_0.Op != OpAnd64 {
3728 continue
3729 }
3730 _ = v_0.Args[1]
3731 v_0_0 := v_0.Args[0]
3732 v_0_1 := v_0.Args[1]
3733 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3734 i := v_0_0
3735 if i.Op != OpConst64 {
3736 continue
3737 }
3738 t := i.Type
3739 z := v_0_1
3740 x := v_1
3741 if !(z.Op != OpConst64 && x.Op != OpConst64) {
3742 continue
3743 }
3744 v.reset(OpAnd64)
3745 v0 := b.NewValue0(v.Pos, OpAnd64, t)
3746 v0.AddArg2(z, x)
3747 v.AddArg2(i, v0)
3748 return true
3749 }
3750 }
3751 break
3752 }
3753
3754
3755 for {
3756 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3757 if v_0.Op != OpConst64 {
3758 continue
3759 }
3760 t := v_0.Type
3761 c := auxIntToInt64(v_0.AuxInt)
3762 if v_1.Op != OpAnd64 {
3763 continue
3764 }
3765 _ = v_1.Args[1]
3766 v_1_0 := v_1.Args[0]
3767 v_1_1 := v_1.Args[1]
3768 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3769 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
3770 continue
3771 }
3772 d := auxIntToInt64(v_1_0.AuxInt)
3773 x := v_1_1
3774 v.reset(OpAnd64)
3775 v0 := b.NewValue0(v.Pos, OpConst64, t)
3776 v0.AuxInt = int64ToAuxInt(c & d)
3777 v.AddArg2(v0, x)
3778 return true
3779 }
3780 }
3781 break
3782 }
3783 return false
3784 }
3785 func rewriteValuegeneric_OpAnd8(v *Value) bool {
3786 v_1 := v.Args[1]
3787 v_0 := v.Args[0]
3788 b := v.Block
3789
3790
3791 for {
3792 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3793 if v_0.Op != OpConst8 {
3794 continue
3795 }
3796 c := auxIntToInt8(v_0.AuxInt)
3797 if v_1.Op != OpConst8 {
3798 continue
3799 }
3800 d := auxIntToInt8(v_1.AuxInt)
3801 v.reset(OpConst8)
3802 v.AuxInt = int8ToAuxInt(c & d)
3803 return true
3804 }
3805 break
3806 }
3807
3808
3809 for {
3810 t := v.Type
3811 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3812 if v_0.Op != OpCom8 {
3813 continue
3814 }
3815 x := v_0.Args[0]
3816 if v_1.Op != OpCom8 {
3817 continue
3818 }
3819 y := v_1.Args[0]
3820 v.reset(OpCom8)
3821 v0 := b.NewValue0(v.Pos, OpOr8, t)
3822 v0.AddArg2(x, y)
3823 v.AddArg(v0)
3824 return true
3825 }
3826 break
3827 }
3828
3829
3830
3831 for {
3832 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3833 if v_0.Op != OpConst8 {
3834 continue
3835 }
3836 m := auxIntToInt8(v_0.AuxInt)
3837 if v_1.Op != OpRsh8Ux64 {
3838 continue
3839 }
3840 _ = v_1.Args[1]
3841 v_1_1 := v_1.Args[1]
3842 if v_1_1.Op != OpConst64 {
3843 continue
3844 }
3845 c := auxIntToInt64(v_1_1.AuxInt)
3846 if !(c >= int64(8-ntz8(m))) {
3847 continue
3848 }
3849 v.reset(OpConst8)
3850 v.AuxInt = int8ToAuxInt(0)
3851 return true
3852 }
3853 break
3854 }
3855
3856
3857
3858 for {
3859 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3860 if v_0.Op != OpConst8 {
3861 continue
3862 }
3863 m := auxIntToInt8(v_0.AuxInt)
3864 if v_1.Op != OpLsh8x64 {
3865 continue
3866 }
3867 _ = v_1.Args[1]
3868 v_1_1 := v_1.Args[1]
3869 if v_1_1.Op != OpConst64 {
3870 continue
3871 }
3872 c := auxIntToInt64(v_1_1.AuxInt)
3873 if !(c >= int64(8-nlz8(m))) {
3874 continue
3875 }
3876 v.reset(OpConst8)
3877 v.AuxInt = int8ToAuxInt(0)
3878 return true
3879 }
3880 break
3881 }
3882
3883
3884 for {
3885 x := v_0
3886 if x != v_1 {
3887 break
3888 }
3889 v.copyOf(x)
3890 return true
3891 }
3892
3893
3894 for {
3895 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3896 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
3897 continue
3898 }
3899 x := v_1
3900 v.copyOf(x)
3901 return true
3902 }
3903 break
3904 }
3905
3906
3907 for {
3908 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3909 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
3910 continue
3911 }
3912 v.reset(OpConst8)
3913 v.AuxInt = int8ToAuxInt(0)
3914 return true
3915 }
3916 break
3917 }
3918
3919
3920 for {
3921 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3922 if v_0.Op != OpCom8 {
3923 continue
3924 }
3925 x := v_0.Args[0]
3926 if x != v_1 {
3927 continue
3928 }
3929 v.reset(OpConst8)
3930 v.AuxInt = int8ToAuxInt(0)
3931 return true
3932 }
3933 break
3934 }
3935
3936
3937 for {
3938 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3939 x := v_0
3940 if v_1.Op != OpAnd8 {
3941 continue
3942 }
3943 _ = v_1.Args[1]
3944 v_1_0 := v_1.Args[0]
3945 v_1_1 := v_1.Args[1]
3946 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3947 if x != v_1_0 {
3948 continue
3949 }
3950 y := v_1_1
3951 v.reset(OpAnd8)
3952 v.AddArg2(x, y)
3953 return true
3954 }
3955 }
3956 break
3957 }
3958
3959
3960
3961 for {
3962 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3963 if v_0.Op != OpAnd8 {
3964 continue
3965 }
3966 _ = v_0.Args[1]
3967 v_0_0 := v_0.Args[0]
3968 v_0_1 := v_0.Args[1]
3969 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3970 i := v_0_0
3971 if i.Op != OpConst8 {
3972 continue
3973 }
3974 t := i.Type
3975 z := v_0_1
3976 x := v_1
3977 if !(z.Op != OpConst8 && x.Op != OpConst8) {
3978 continue
3979 }
3980 v.reset(OpAnd8)
3981 v0 := b.NewValue0(v.Pos, OpAnd8, t)
3982 v0.AddArg2(z, x)
3983 v.AddArg2(i, v0)
3984 return true
3985 }
3986 }
3987 break
3988 }
3989
3990
3991 for {
3992 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3993 if v_0.Op != OpConst8 {
3994 continue
3995 }
3996 t := v_0.Type
3997 c := auxIntToInt8(v_0.AuxInt)
3998 if v_1.Op != OpAnd8 {
3999 continue
4000 }
4001 _ = v_1.Args[1]
4002 v_1_0 := v_1.Args[0]
4003 v_1_1 := v_1.Args[1]
4004 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
4005 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
4006 continue
4007 }
4008 d := auxIntToInt8(v_1_0.AuxInt)
4009 x := v_1_1
4010 v.reset(OpAnd8)
4011 v0 := b.NewValue0(v.Pos, OpConst8, t)
4012 v0.AuxInt = int8ToAuxInt(c & d)
4013 v.AddArg2(v0, x)
4014 return true
4015 }
4016 }
4017 break
4018 }
4019 return false
4020 }
4021 func rewriteValuegeneric_OpAndB(v *Value) bool {
4022 v_1 := v.Args[1]
4023 v_0 := v.Args[0]
4024 b := v.Block
4025
4026
4027
4028 for {
4029 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4030 if v_0.Op != OpLeq64 {
4031 continue
4032 }
4033 x := v_0.Args[1]
4034 v_0_0 := v_0.Args[0]
4035 if v_0_0.Op != OpConst64 {
4036 continue
4037 }
4038 c := auxIntToInt64(v_0_0.AuxInt)
4039 if v_1.Op != OpLess64 {
4040 continue
4041 }
4042 _ = v_1.Args[1]
4043 if x != v_1.Args[0] {
4044 continue
4045 }
4046 v_1_1 := v_1.Args[1]
4047 if v_1_1.Op != OpConst64 {
4048 continue
4049 }
4050 d := auxIntToInt64(v_1_1.AuxInt)
4051 if !(d >= c) {
4052 continue
4053 }
4054 v.reset(OpLess64U)
4055 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4056 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4057 v1.AuxInt = int64ToAuxInt(c)
4058 v0.AddArg2(x, v1)
4059 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4060 v2.AuxInt = int64ToAuxInt(d - c)
4061 v.AddArg2(v0, v2)
4062 return true
4063 }
4064 break
4065 }
4066
4067
4068
4069 for {
4070 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4071 if v_0.Op != OpLeq64 {
4072 continue
4073 }
4074 x := v_0.Args[1]
4075 v_0_0 := v_0.Args[0]
4076 if v_0_0.Op != OpConst64 {
4077 continue
4078 }
4079 c := auxIntToInt64(v_0_0.AuxInt)
4080 if v_1.Op != OpLeq64 {
4081 continue
4082 }
4083 _ = v_1.Args[1]
4084 if x != v_1.Args[0] {
4085 continue
4086 }
4087 v_1_1 := v_1.Args[1]
4088 if v_1_1.Op != OpConst64 {
4089 continue
4090 }
4091 d := auxIntToInt64(v_1_1.AuxInt)
4092 if !(d >= c) {
4093 continue
4094 }
4095 v.reset(OpLeq64U)
4096 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4097 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4098 v1.AuxInt = int64ToAuxInt(c)
4099 v0.AddArg2(x, v1)
4100 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4101 v2.AuxInt = int64ToAuxInt(d - c)
4102 v.AddArg2(v0, v2)
4103 return true
4104 }
4105 break
4106 }
4107
4108
4109
4110 for {
4111 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4112 if v_0.Op != OpLeq32 {
4113 continue
4114 }
4115 x := v_0.Args[1]
4116 v_0_0 := v_0.Args[0]
4117 if v_0_0.Op != OpConst32 {
4118 continue
4119 }
4120 c := auxIntToInt32(v_0_0.AuxInt)
4121 if v_1.Op != OpLess32 {
4122 continue
4123 }
4124 _ = v_1.Args[1]
4125 if x != v_1.Args[0] {
4126 continue
4127 }
4128 v_1_1 := v_1.Args[1]
4129 if v_1_1.Op != OpConst32 {
4130 continue
4131 }
4132 d := auxIntToInt32(v_1_1.AuxInt)
4133 if !(d >= c) {
4134 continue
4135 }
4136 v.reset(OpLess32U)
4137 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4138 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4139 v1.AuxInt = int32ToAuxInt(c)
4140 v0.AddArg2(x, v1)
4141 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4142 v2.AuxInt = int32ToAuxInt(d - c)
4143 v.AddArg2(v0, v2)
4144 return true
4145 }
4146 break
4147 }
4148
4149
4150
4151 for {
4152 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4153 if v_0.Op != OpLeq32 {
4154 continue
4155 }
4156 x := v_0.Args[1]
4157 v_0_0 := v_0.Args[0]
4158 if v_0_0.Op != OpConst32 {
4159 continue
4160 }
4161 c := auxIntToInt32(v_0_0.AuxInt)
4162 if v_1.Op != OpLeq32 {
4163 continue
4164 }
4165 _ = v_1.Args[1]
4166 if x != v_1.Args[0] {
4167 continue
4168 }
4169 v_1_1 := v_1.Args[1]
4170 if v_1_1.Op != OpConst32 {
4171 continue
4172 }
4173 d := auxIntToInt32(v_1_1.AuxInt)
4174 if !(d >= c) {
4175 continue
4176 }
4177 v.reset(OpLeq32U)
4178 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4179 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4180 v1.AuxInt = int32ToAuxInt(c)
4181 v0.AddArg2(x, v1)
4182 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4183 v2.AuxInt = int32ToAuxInt(d - c)
4184 v.AddArg2(v0, v2)
4185 return true
4186 }
4187 break
4188 }
4189
4190
4191
4192 for {
4193 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4194 if v_0.Op != OpLeq16 {
4195 continue
4196 }
4197 x := v_0.Args[1]
4198 v_0_0 := v_0.Args[0]
4199 if v_0_0.Op != OpConst16 {
4200 continue
4201 }
4202 c := auxIntToInt16(v_0_0.AuxInt)
4203 if v_1.Op != OpLess16 {
4204 continue
4205 }
4206 _ = v_1.Args[1]
4207 if x != v_1.Args[0] {
4208 continue
4209 }
4210 v_1_1 := v_1.Args[1]
4211 if v_1_1.Op != OpConst16 {
4212 continue
4213 }
4214 d := auxIntToInt16(v_1_1.AuxInt)
4215 if !(d >= c) {
4216 continue
4217 }
4218 v.reset(OpLess16U)
4219 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4220 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4221 v1.AuxInt = int16ToAuxInt(c)
4222 v0.AddArg2(x, v1)
4223 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4224 v2.AuxInt = int16ToAuxInt(d - c)
4225 v.AddArg2(v0, v2)
4226 return true
4227 }
4228 break
4229 }
4230
4231
4232
4233 for {
4234 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4235 if v_0.Op != OpLeq16 {
4236 continue
4237 }
4238 x := v_0.Args[1]
4239 v_0_0 := v_0.Args[0]
4240 if v_0_0.Op != OpConst16 {
4241 continue
4242 }
4243 c := auxIntToInt16(v_0_0.AuxInt)
4244 if v_1.Op != OpLeq16 {
4245 continue
4246 }
4247 _ = v_1.Args[1]
4248 if x != v_1.Args[0] {
4249 continue
4250 }
4251 v_1_1 := v_1.Args[1]
4252 if v_1_1.Op != OpConst16 {
4253 continue
4254 }
4255 d := auxIntToInt16(v_1_1.AuxInt)
4256 if !(d >= c) {
4257 continue
4258 }
4259 v.reset(OpLeq16U)
4260 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4261 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4262 v1.AuxInt = int16ToAuxInt(c)
4263 v0.AddArg2(x, v1)
4264 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4265 v2.AuxInt = int16ToAuxInt(d - c)
4266 v.AddArg2(v0, v2)
4267 return true
4268 }
4269 break
4270 }
4271
4272
4273
4274 for {
4275 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4276 if v_0.Op != OpLeq8 {
4277 continue
4278 }
4279 x := v_0.Args[1]
4280 v_0_0 := v_0.Args[0]
4281 if v_0_0.Op != OpConst8 {
4282 continue
4283 }
4284 c := auxIntToInt8(v_0_0.AuxInt)
4285 if v_1.Op != OpLess8 {
4286 continue
4287 }
4288 _ = v_1.Args[1]
4289 if x != v_1.Args[0] {
4290 continue
4291 }
4292 v_1_1 := v_1.Args[1]
4293 if v_1_1.Op != OpConst8 {
4294 continue
4295 }
4296 d := auxIntToInt8(v_1_1.AuxInt)
4297 if !(d >= c) {
4298 continue
4299 }
4300 v.reset(OpLess8U)
4301 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4302 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4303 v1.AuxInt = int8ToAuxInt(c)
4304 v0.AddArg2(x, v1)
4305 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4306 v2.AuxInt = int8ToAuxInt(d - c)
4307 v.AddArg2(v0, v2)
4308 return true
4309 }
4310 break
4311 }
4312
4313
4314
4315 for {
4316 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4317 if v_0.Op != OpLeq8 {
4318 continue
4319 }
4320 x := v_0.Args[1]
4321 v_0_0 := v_0.Args[0]
4322 if v_0_0.Op != OpConst8 {
4323 continue
4324 }
4325 c := auxIntToInt8(v_0_0.AuxInt)
4326 if v_1.Op != OpLeq8 {
4327 continue
4328 }
4329 _ = v_1.Args[1]
4330 if x != v_1.Args[0] {
4331 continue
4332 }
4333 v_1_1 := v_1.Args[1]
4334 if v_1_1.Op != OpConst8 {
4335 continue
4336 }
4337 d := auxIntToInt8(v_1_1.AuxInt)
4338 if !(d >= c) {
4339 continue
4340 }
4341 v.reset(OpLeq8U)
4342 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4343 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4344 v1.AuxInt = int8ToAuxInt(c)
4345 v0.AddArg2(x, v1)
4346 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4347 v2.AuxInt = int8ToAuxInt(d - c)
4348 v.AddArg2(v0, v2)
4349 return true
4350 }
4351 break
4352 }
4353
4354
4355
4356 for {
4357 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4358 if v_0.Op != OpLess64 {
4359 continue
4360 }
4361 x := v_0.Args[1]
4362 v_0_0 := v_0.Args[0]
4363 if v_0_0.Op != OpConst64 {
4364 continue
4365 }
4366 c := auxIntToInt64(v_0_0.AuxInt)
4367 if v_1.Op != OpLess64 {
4368 continue
4369 }
4370 _ = v_1.Args[1]
4371 if x != v_1.Args[0] {
4372 continue
4373 }
4374 v_1_1 := v_1.Args[1]
4375 if v_1_1.Op != OpConst64 {
4376 continue
4377 }
4378 d := auxIntToInt64(v_1_1.AuxInt)
4379 if !(d >= c+1 && c+1 > c) {
4380 continue
4381 }
4382 v.reset(OpLess64U)
4383 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4384 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4385 v1.AuxInt = int64ToAuxInt(c + 1)
4386 v0.AddArg2(x, v1)
4387 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4388 v2.AuxInt = int64ToAuxInt(d - c - 1)
4389 v.AddArg2(v0, v2)
4390 return true
4391 }
4392 break
4393 }
4394
4395
4396
4397 for {
4398 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4399 if v_0.Op != OpLess64 {
4400 continue
4401 }
4402 x := v_0.Args[1]
4403 v_0_0 := v_0.Args[0]
4404 if v_0_0.Op != OpConst64 {
4405 continue
4406 }
4407 c := auxIntToInt64(v_0_0.AuxInt)
4408 if v_1.Op != OpLeq64 {
4409 continue
4410 }
4411 _ = v_1.Args[1]
4412 if x != v_1.Args[0] {
4413 continue
4414 }
4415 v_1_1 := v_1.Args[1]
4416 if v_1_1.Op != OpConst64 {
4417 continue
4418 }
4419 d := auxIntToInt64(v_1_1.AuxInt)
4420 if !(d >= c+1 && c+1 > c) {
4421 continue
4422 }
4423 v.reset(OpLeq64U)
4424 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4425 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4426 v1.AuxInt = int64ToAuxInt(c + 1)
4427 v0.AddArg2(x, v1)
4428 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4429 v2.AuxInt = int64ToAuxInt(d - c - 1)
4430 v.AddArg2(v0, v2)
4431 return true
4432 }
4433 break
4434 }
4435
4436
4437
4438 for {
4439 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4440 if v_0.Op != OpLess32 {
4441 continue
4442 }
4443 x := v_0.Args[1]
4444 v_0_0 := v_0.Args[0]
4445 if v_0_0.Op != OpConst32 {
4446 continue
4447 }
4448 c := auxIntToInt32(v_0_0.AuxInt)
4449 if v_1.Op != OpLess32 {
4450 continue
4451 }
4452 _ = v_1.Args[1]
4453 if x != v_1.Args[0] {
4454 continue
4455 }
4456 v_1_1 := v_1.Args[1]
4457 if v_1_1.Op != OpConst32 {
4458 continue
4459 }
4460 d := auxIntToInt32(v_1_1.AuxInt)
4461 if !(d >= c+1 && c+1 > c) {
4462 continue
4463 }
4464 v.reset(OpLess32U)
4465 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4466 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4467 v1.AuxInt = int32ToAuxInt(c + 1)
4468 v0.AddArg2(x, v1)
4469 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4470 v2.AuxInt = int32ToAuxInt(d - c - 1)
4471 v.AddArg2(v0, v2)
4472 return true
4473 }
4474 break
4475 }
4476
4477
4478
4479 for {
4480 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4481 if v_0.Op != OpLess32 {
4482 continue
4483 }
4484 x := v_0.Args[1]
4485 v_0_0 := v_0.Args[0]
4486 if v_0_0.Op != OpConst32 {
4487 continue
4488 }
4489 c := auxIntToInt32(v_0_0.AuxInt)
4490 if v_1.Op != OpLeq32 {
4491 continue
4492 }
4493 _ = v_1.Args[1]
4494 if x != v_1.Args[0] {
4495 continue
4496 }
4497 v_1_1 := v_1.Args[1]
4498 if v_1_1.Op != OpConst32 {
4499 continue
4500 }
4501 d := auxIntToInt32(v_1_1.AuxInt)
4502 if !(d >= c+1 && c+1 > c) {
4503 continue
4504 }
4505 v.reset(OpLeq32U)
4506 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4507 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4508 v1.AuxInt = int32ToAuxInt(c + 1)
4509 v0.AddArg2(x, v1)
4510 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4511 v2.AuxInt = int32ToAuxInt(d - c - 1)
4512 v.AddArg2(v0, v2)
4513 return true
4514 }
4515 break
4516 }
4517
4518
4519
4520 for {
4521 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4522 if v_0.Op != OpLess16 {
4523 continue
4524 }
4525 x := v_0.Args[1]
4526 v_0_0 := v_0.Args[0]
4527 if v_0_0.Op != OpConst16 {
4528 continue
4529 }
4530 c := auxIntToInt16(v_0_0.AuxInt)
4531 if v_1.Op != OpLess16 {
4532 continue
4533 }
4534 _ = v_1.Args[1]
4535 if x != v_1.Args[0] {
4536 continue
4537 }
4538 v_1_1 := v_1.Args[1]
4539 if v_1_1.Op != OpConst16 {
4540 continue
4541 }
4542 d := auxIntToInt16(v_1_1.AuxInt)
4543 if !(d >= c+1 && c+1 > c) {
4544 continue
4545 }
4546 v.reset(OpLess16U)
4547 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4548 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4549 v1.AuxInt = int16ToAuxInt(c + 1)
4550 v0.AddArg2(x, v1)
4551 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4552 v2.AuxInt = int16ToAuxInt(d - c - 1)
4553 v.AddArg2(v0, v2)
4554 return true
4555 }
4556 break
4557 }
4558
4559
4560
4561 for {
4562 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4563 if v_0.Op != OpLess16 {
4564 continue
4565 }
4566 x := v_0.Args[1]
4567 v_0_0 := v_0.Args[0]
4568 if v_0_0.Op != OpConst16 {
4569 continue
4570 }
4571 c := auxIntToInt16(v_0_0.AuxInt)
4572 if v_1.Op != OpLeq16 {
4573 continue
4574 }
4575 _ = v_1.Args[1]
4576 if x != v_1.Args[0] {
4577 continue
4578 }
4579 v_1_1 := v_1.Args[1]
4580 if v_1_1.Op != OpConst16 {
4581 continue
4582 }
4583 d := auxIntToInt16(v_1_1.AuxInt)
4584 if !(d >= c+1 && c+1 > c) {
4585 continue
4586 }
4587 v.reset(OpLeq16U)
4588 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4589 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4590 v1.AuxInt = int16ToAuxInt(c + 1)
4591 v0.AddArg2(x, v1)
4592 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4593 v2.AuxInt = int16ToAuxInt(d - c - 1)
4594 v.AddArg2(v0, v2)
4595 return true
4596 }
4597 break
4598 }
4599
4600
4601
4602 for {
4603 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4604 if v_0.Op != OpLess8 {
4605 continue
4606 }
4607 x := v_0.Args[1]
4608 v_0_0 := v_0.Args[0]
4609 if v_0_0.Op != OpConst8 {
4610 continue
4611 }
4612 c := auxIntToInt8(v_0_0.AuxInt)
4613 if v_1.Op != OpLess8 {
4614 continue
4615 }
4616 _ = v_1.Args[1]
4617 if x != v_1.Args[0] {
4618 continue
4619 }
4620 v_1_1 := v_1.Args[1]
4621 if v_1_1.Op != OpConst8 {
4622 continue
4623 }
4624 d := auxIntToInt8(v_1_1.AuxInt)
4625 if !(d >= c+1 && c+1 > c) {
4626 continue
4627 }
4628 v.reset(OpLess8U)
4629 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4630 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4631 v1.AuxInt = int8ToAuxInt(c + 1)
4632 v0.AddArg2(x, v1)
4633 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4634 v2.AuxInt = int8ToAuxInt(d - c - 1)
4635 v.AddArg2(v0, v2)
4636 return true
4637 }
4638 break
4639 }
4640
4641
4642
4643 for {
4644 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4645 if v_0.Op != OpLess8 {
4646 continue
4647 }
4648 x := v_0.Args[1]
4649 v_0_0 := v_0.Args[0]
4650 if v_0_0.Op != OpConst8 {
4651 continue
4652 }
4653 c := auxIntToInt8(v_0_0.AuxInt)
4654 if v_1.Op != OpLeq8 {
4655 continue
4656 }
4657 _ = v_1.Args[1]
4658 if x != v_1.Args[0] {
4659 continue
4660 }
4661 v_1_1 := v_1.Args[1]
4662 if v_1_1.Op != OpConst8 {
4663 continue
4664 }
4665 d := auxIntToInt8(v_1_1.AuxInt)
4666 if !(d >= c+1 && c+1 > c) {
4667 continue
4668 }
4669 v.reset(OpLeq8U)
4670 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4671 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4672 v1.AuxInt = int8ToAuxInt(c + 1)
4673 v0.AddArg2(x, v1)
4674 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4675 v2.AuxInt = int8ToAuxInt(d - c - 1)
4676 v.AddArg2(v0, v2)
4677 return true
4678 }
4679 break
4680 }
4681
4682
4683
4684 for {
4685 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4686 if v_0.Op != OpLeq64U {
4687 continue
4688 }
4689 x := v_0.Args[1]
4690 v_0_0 := v_0.Args[0]
4691 if v_0_0.Op != OpConst64 {
4692 continue
4693 }
4694 c := auxIntToInt64(v_0_0.AuxInt)
4695 if v_1.Op != OpLess64U {
4696 continue
4697 }
4698 _ = v_1.Args[1]
4699 if x != v_1.Args[0] {
4700 continue
4701 }
4702 v_1_1 := v_1.Args[1]
4703 if v_1_1.Op != OpConst64 {
4704 continue
4705 }
4706 d := auxIntToInt64(v_1_1.AuxInt)
4707 if !(uint64(d) >= uint64(c)) {
4708 continue
4709 }
4710 v.reset(OpLess64U)
4711 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4712 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4713 v1.AuxInt = int64ToAuxInt(c)
4714 v0.AddArg2(x, v1)
4715 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4716 v2.AuxInt = int64ToAuxInt(d - c)
4717 v.AddArg2(v0, v2)
4718 return true
4719 }
4720 break
4721 }
4722
4723
4724
4725 for {
4726 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4727 if v_0.Op != OpLeq64U {
4728 continue
4729 }
4730 x := v_0.Args[1]
4731 v_0_0 := v_0.Args[0]
4732 if v_0_0.Op != OpConst64 {
4733 continue
4734 }
4735 c := auxIntToInt64(v_0_0.AuxInt)
4736 if v_1.Op != OpLeq64U {
4737 continue
4738 }
4739 _ = v_1.Args[1]
4740 if x != v_1.Args[0] {
4741 continue
4742 }
4743 v_1_1 := v_1.Args[1]
4744 if v_1_1.Op != OpConst64 {
4745 continue
4746 }
4747 d := auxIntToInt64(v_1_1.AuxInt)
4748 if !(uint64(d) >= uint64(c)) {
4749 continue
4750 }
4751 v.reset(OpLeq64U)
4752 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4753 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4754 v1.AuxInt = int64ToAuxInt(c)
4755 v0.AddArg2(x, v1)
4756 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4757 v2.AuxInt = int64ToAuxInt(d - c)
4758 v.AddArg2(v0, v2)
4759 return true
4760 }
4761 break
4762 }
4763
4764
4765
4766 for {
4767 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4768 if v_0.Op != OpLeq32U {
4769 continue
4770 }
4771 x := v_0.Args[1]
4772 v_0_0 := v_0.Args[0]
4773 if v_0_0.Op != OpConst32 {
4774 continue
4775 }
4776 c := auxIntToInt32(v_0_0.AuxInt)
4777 if v_1.Op != OpLess32U {
4778 continue
4779 }
4780 _ = v_1.Args[1]
4781 if x != v_1.Args[0] {
4782 continue
4783 }
4784 v_1_1 := v_1.Args[1]
4785 if v_1_1.Op != OpConst32 {
4786 continue
4787 }
4788 d := auxIntToInt32(v_1_1.AuxInt)
4789 if !(uint32(d) >= uint32(c)) {
4790 continue
4791 }
4792 v.reset(OpLess32U)
4793 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4794 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4795 v1.AuxInt = int32ToAuxInt(c)
4796 v0.AddArg2(x, v1)
4797 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4798 v2.AuxInt = int32ToAuxInt(d - c)
4799 v.AddArg2(v0, v2)
4800 return true
4801 }
4802 break
4803 }
4804
4805
4806
4807 for {
4808 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4809 if v_0.Op != OpLeq32U {
4810 continue
4811 }
4812 x := v_0.Args[1]
4813 v_0_0 := v_0.Args[0]
4814 if v_0_0.Op != OpConst32 {
4815 continue
4816 }
4817 c := auxIntToInt32(v_0_0.AuxInt)
4818 if v_1.Op != OpLeq32U {
4819 continue
4820 }
4821 _ = v_1.Args[1]
4822 if x != v_1.Args[0] {
4823 continue
4824 }
4825 v_1_1 := v_1.Args[1]
4826 if v_1_1.Op != OpConst32 {
4827 continue
4828 }
4829 d := auxIntToInt32(v_1_1.AuxInt)
4830 if !(uint32(d) >= uint32(c)) {
4831 continue
4832 }
4833 v.reset(OpLeq32U)
4834 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4835 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4836 v1.AuxInt = int32ToAuxInt(c)
4837 v0.AddArg2(x, v1)
4838 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4839 v2.AuxInt = int32ToAuxInt(d - c)
4840 v.AddArg2(v0, v2)
4841 return true
4842 }
4843 break
4844 }
4845
4846
4847
4848 for {
4849 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4850 if v_0.Op != OpLeq16U {
4851 continue
4852 }
4853 x := v_0.Args[1]
4854 v_0_0 := v_0.Args[0]
4855 if v_0_0.Op != OpConst16 {
4856 continue
4857 }
4858 c := auxIntToInt16(v_0_0.AuxInt)
4859 if v_1.Op != OpLess16U {
4860 continue
4861 }
4862 _ = v_1.Args[1]
4863 if x != v_1.Args[0] {
4864 continue
4865 }
4866 v_1_1 := v_1.Args[1]
4867 if v_1_1.Op != OpConst16 {
4868 continue
4869 }
4870 d := auxIntToInt16(v_1_1.AuxInt)
4871 if !(uint16(d) >= uint16(c)) {
4872 continue
4873 }
4874 v.reset(OpLess16U)
4875 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4876 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4877 v1.AuxInt = int16ToAuxInt(c)
4878 v0.AddArg2(x, v1)
4879 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4880 v2.AuxInt = int16ToAuxInt(d - c)
4881 v.AddArg2(v0, v2)
4882 return true
4883 }
4884 break
4885 }
4886
4887
4888
4889 for {
4890 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4891 if v_0.Op != OpLeq16U {
4892 continue
4893 }
4894 x := v_0.Args[1]
4895 v_0_0 := v_0.Args[0]
4896 if v_0_0.Op != OpConst16 {
4897 continue
4898 }
4899 c := auxIntToInt16(v_0_0.AuxInt)
4900 if v_1.Op != OpLeq16U {
4901 continue
4902 }
4903 _ = v_1.Args[1]
4904 if x != v_1.Args[0] {
4905 continue
4906 }
4907 v_1_1 := v_1.Args[1]
4908 if v_1_1.Op != OpConst16 {
4909 continue
4910 }
4911 d := auxIntToInt16(v_1_1.AuxInt)
4912 if !(uint16(d) >= uint16(c)) {
4913 continue
4914 }
4915 v.reset(OpLeq16U)
4916 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4917 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4918 v1.AuxInt = int16ToAuxInt(c)
4919 v0.AddArg2(x, v1)
4920 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4921 v2.AuxInt = int16ToAuxInt(d - c)
4922 v.AddArg2(v0, v2)
4923 return true
4924 }
4925 break
4926 }
4927
4928
4929
4930 for {
4931 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4932 if v_0.Op != OpLeq8U {
4933 continue
4934 }
4935 x := v_0.Args[1]
4936 v_0_0 := v_0.Args[0]
4937 if v_0_0.Op != OpConst8 {
4938 continue
4939 }
4940 c := auxIntToInt8(v_0_0.AuxInt)
4941 if v_1.Op != OpLess8U {
4942 continue
4943 }
4944 _ = v_1.Args[1]
4945 if x != v_1.Args[0] {
4946 continue
4947 }
4948 v_1_1 := v_1.Args[1]
4949 if v_1_1.Op != OpConst8 {
4950 continue
4951 }
4952 d := auxIntToInt8(v_1_1.AuxInt)
4953 if !(uint8(d) >= uint8(c)) {
4954 continue
4955 }
4956 v.reset(OpLess8U)
4957 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4958 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4959 v1.AuxInt = int8ToAuxInt(c)
4960 v0.AddArg2(x, v1)
4961 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4962 v2.AuxInt = int8ToAuxInt(d - c)
4963 v.AddArg2(v0, v2)
4964 return true
4965 }
4966 break
4967 }
4968
4969
4970
4971 for {
4972 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4973 if v_0.Op != OpLeq8U {
4974 continue
4975 }
4976 x := v_0.Args[1]
4977 v_0_0 := v_0.Args[0]
4978 if v_0_0.Op != OpConst8 {
4979 continue
4980 }
4981 c := auxIntToInt8(v_0_0.AuxInt)
4982 if v_1.Op != OpLeq8U {
4983 continue
4984 }
4985 _ = v_1.Args[1]
4986 if x != v_1.Args[0] {
4987 continue
4988 }
4989 v_1_1 := v_1.Args[1]
4990 if v_1_1.Op != OpConst8 {
4991 continue
4992 }
4993 d := auxIntToInt8(v_1_1.AuxInt)
4994 if !(uint8(d) >= uint8(c)) {
4995 continue
4996 }
4997 v.reset(OpLeq8U)
4998 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4999 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5000 v1.AuxInt = int8ToAuxInt(c)
5001 v0.AddArg2(x, v1)
5002 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5003 v2.AuxInt = int8ToAuxInt(d - c)
5004 v.AddArg2(v0, v2)
5005 return true
5006 }
5007 break
5008 }
5009
5010
5011
5012 for {
5013 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5014 if v_0.Op != OpLess64U {
5015 continue
5016 }
5017 x := v_0.Args[1]
5018 v_0_0 := v_0.Args[0]
5019 if v_0_0.Op != OpConst64 {
5020 continue
5021 }
5022 c := auxIntToInt64(v_0_0.AuxInt)
5023 if v_1.Op != OpLess64U {
5024 continue
5025 }
5026 _ = v_1.Args[1]
5027 if x != v_1.Args[0] {
5028 continue
5029 }
5030 v_1_1 := v_1.Args[1]
5031 if v_1_1.Op != OpConst64 {
5032 continue
5033 }
5034 d := auxIntToInt64(v_1_1.AuxInt)
5035 if !(uint64(d) >= uint64(c+1) && uint64(c+1) > uint64(c)) {
5036 continue
5037 }
5038 v.reset(OpLess64U)
5039 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
5040 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
5041 v1.AuxInt = int64ToAuxInt(c + 1)
5042 v0.AddArg2(x, v1)
5043 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
5044 v2.AuxInt = int64ToAuxInt(d - c - 1)
5045 v.AddArg2(v0, v2)
5046 return true
5047 }
5048 break
5049 }
5050
5051
5052
5053 for {
5054 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5055 if v_0.Op != OpLess64U {
5056 continue
5057 }
5058 x := v_0.Args[1]
5059 v_0_0 := v_0.Args[0]
5060 if v_0_0.Op != OpConst64 {
5061 continue
5062 }
5063 c := auxIntToInt64(v_0_0.AuxInt)
5064 if v_1.Op != OpLeq64U {
5065 continue
5066 }
5067 _ = v_1.Args[1]
5068 if x != v_1.Args[0] {
5069 continue
5070 }
5071 v_1_1 := v_1.Args[1]
5072 if v_1_1.Op != OpConst64 {
5073 continue
5074 }
5075 d := auxIntToInt64(v_1_1.AuxInt)
5076 if !(uint64(d) >= uint64(c+1) && uint64(c+1) > uint64(c)) {
5077 continue
5078 }
5079 v.reset(OpLeq64U)
5080 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
5081 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
5082 v1.AuxInt = int64ToAuxInt(c + 1)
5083 v0.AddArg2(x, v1)
5084 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
5085 v2.AuxInt = int64ToAuxInt(d - c - 1)
5086 v.AddArg2(v0, v2)
5087 return true
5088 }
5089 break
5090 }
5091
5092
5093
5094 for {
5095 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5096 if v_0.Op != OpLess32U {
5097 continue
5098 }
5099 x := v_0.Args[1]
5100 v_0_0 := v_0.Args[0]
5101 if v_0_0.Op != OpConst32 {
5102 continue
5103 }
5104 c := auxIntToInt32(v_0_0.AuxInt)
5105 if v_1.Op != OpLess32U {
5106 continue
5107 }
5108 _ = v_1.Args[1]
5109 if x != v_1.Args[0] {
5110 continue
5111 }
5112 v_1_1 := v_1.Args[1]
5113 if v_1_1.Op != OpConst32 {
5114 continue
5115 }
5116 d := auxIntToInt32(v_1_1.AuxInt)
5117 if !(uint32(d) >= uint32(c+1) && uint32(c+1) > uint32(c)) {
5118 continue
5119 }
5120 v.reset(OpLess32U)
5121 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
5122 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
5123 v1.AuxInt = int32ToAuxInt(c + 1)
5124 v0.AddArg2(x, v1)
5125 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
5126 v2.AuxInt = int32ToAuxInt(d - c - 1)
5127 v.AddArg2(v0, v2)
5128 return true
5129 }
5130 break
5131 }
5132
5133
5134
5135 for {
5136 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5137 if v_0.Op != OpLess32U {
5138 continue
5139 }
5140 x := v_0.Args[1]
5141 v_0_0 := v_0.Args[0]
5142 if v_0_0.Op != OpConst32 {
5143 continue
5144 }
5145 c := auxIntToInt32(v_0_0.AuxInt)
5146 if v_1.Op != OpLeq32U {
5147 continue
5148 }
5149 _ = v_1.Args[1]
5150 if x != v_1.Args[0] {
5151 continue
5152 }
5153 v_1_1 := v_1.Args[1]
5154 if v_1_1.Op != OpConst32 {
5155 continue
5156 }
5157 d := auxIntToInt32(v_1_1.AuxInt)
5158 if !(uint32(d) >= uint32(c+1) && uint32(c+1) > uint32(c)) {
5159 continue
5160 }
5161 v.reset(OpLeq32U)
5162 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
5163 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
5164 v1.AuxInt = int32ToAuxInt(c + 1)
5165 v0.AddArg2(x, v1)
5166 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
5167 v2.AuxInt = int32ToAuxInt(d - c - 1)
5168 v.AddArg2(v0, v2)
5169 return true
5170 }
5171 break
5172 }
5173
5174
5175
5176 for {
5177 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5178 if v_0.Op != OpLess16U {
5179 continue
5180 }
5181 x := v_0.Args[1]
5182 v_0_0 := v_0.Args[0]
5183 if v_0_0.Op != OpConst16 {
5184 continue
5185 }
5186 c := auxIntToInt16(v_0_0.AuxInt)
5187 if v_1.Op != OpLess16U {
5188 continue
5189 }
5190 _ = v_1.Args[1]
5191 if x != v_1.Args[0] {
5192 continue
5193 }
5194 v_1_1 := v_1.Args[1]
5195 if v_1_1.Op != OpConst16 {
5196 continue
5197 }
5198 d := auxIntToInt16(v_1_1.AuxInt)
5199 if !(uint16(d) >= uint16(c+1) && uint16(c+1) > uint16(c)) {
5200 continue
5201 }
5202 v.reset(OpLess16U)
5203 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
5204 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5205 v1.AuxInt = int16ToAuxInt(c + 1)
5206 v0.AddArg2(x, v1)
5207 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
5208 v2.AuxInt = int16ToAuxInt(d - c - 1)
5209 v.AddArg2(v0, v2)
5210 return true
5211 }
5212 break
5213 }
5214
5215
5216
5217 for {
5218 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5219 if v_0.Op != OpLess16U {
5220 continue
5221 }
5222 x := v_0.Args[1]
5223 v_0_0 := v_0.Args[0]
5224 if v_0_0.Op != OpConst16 {
5225 continue
5226 }
5227 c := auxIntToInt16(v_0_0.AuxInt)
5228 if v_1.Op != OpLeq16U {
5229 continue
5230 }
5231 _ = v_1.Args[1]
5232 if x != v_1.Args[0] {
5233 continue
5234 }
5235 v_1_1 := v_1.Args[1]
5236 if v_1_1.Op != OpConst16 {
5237 continue
5238 }
5239 d := auxIntToInt16(v_1_1.AuxInt)
5240 if !(uint16(d) >= uint16(c+1) && uint16(c+1) > uint16(c)) {
5241 continue
5242 }
5243 v.reset(OpLeq16U)
5244 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
5245 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5246 v1.AuxInt = int16ToAuxInt(c + 1)
5247 v0.AddArg2(x, v1)
5248 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
5249 v2.AuxInt = int16ToAuxInt(d - c - 1)
5250 v.AddArg2(v0, v2)
5251 return true
5252 }
5253 break
5254 }
5255
5256
5257
5258 for {
5259 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5260 if v_0.Op != OpLess8U {
5261 continue
5262 }
5263 x := v_0.Args[1]
5264 v_0_0 := v_0.Args[0]
5265 if v_0_0.Op != OpConst8 {
5266 continue
5267 }
5268 c := auxIntToInt8(v_0_0.AuxInt)
5269 if v_1.Op != OpLess8U {
5270 continue
5271 }
5272 _ = v_1.Args[1]
5273 if x != v_1.Args[0] {
5274 continue
5275 }
5276 v_1_1 := v_1.Args[1]
5277 if v_1_1.Op != OpConst8 {
5278 continue
5279 }
5280 d := auxIntToInt8(v_1_1.AuxInt)
5281 if !(uint8(d) >= uint8(c+1) && uint8(c+1) > uint8(c)) {
5282 continue
5283 }
5284 v.reset(OpLess8U)
5285 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
5286 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5287 v1.AuxInt = int8ToAuxInt(c + 1)
5288 v0.AddArg2(x, v1)
5289 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5290 v2.AuxInt = int8ToAuxInt(d - c - 1)
5291 v.AddArg2(v0, v2)
5292 return true
5293 }
5294 break
5295 }
5296
5297
5298
5299 for {
5300 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5301 if v_0.Op != OpLess8U {
5302 continue
5303 }
5304 x := v_0.Args[1]
5305 v_0_0 := v_0.Args[0]
5306 if v_0_0.Op != OpConst8 {
5307 continue
5308 }
5309 c := auxIntToInt8(v_0_0.AuxInt)
5310 if v_1.Op != OpLeq8U {
5311 continue
5312 }
5313 _ = v_1.Args[1]
5314 if x != v_1.Args[0] {
5315 continue
5316 }
5317 v_1_1 := v_1.Args[1]
5318 if v_1_1.Op != OpConst8 {
5319 continue
5320 }
5321 d := auxIntToInt8(v_1_1.AuxInt)
5322 if !(uint8(d) >= uint8(c+1) && uint8(c+1) > uint8(c)) {
5323 continue
5324 }
5325 v.reset(OpLeq8U)
5326 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
5327 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5328 v1.AuxInt = int8ToAuxInt(c + 1)
5329 v0.AddArg2(x, v1)
5330 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5331 v2.AuxInt = int8ToAuxInt(d - c - 1)
5332 v.AddArg2(v0, v2)
5333 return true
5334 }
5335 break
5336 }
5337
5338
5339
5340 for {
5341 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5342 if v_0.Op != OpNeq64 {
5343 continue
5344 }
5345 _ = v_0.Args[1]
5346 v_0_0 := v_0.Args[0]
5347 v_0_1 := v_0.Args[1]
5348 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5349 x := v_0_0
5350 cv := v_0_1
5351 if cv.Op != OpConst64 {
5352 continue
5353 }
5354 c := auxIntToInt64(cv.AuxInt)
5355 if v_1.Op != OpNeq64 {
5356 continue
5357 }
5358 _ = v_1.Args[1]
5359 v_1_0 := v_1.Args[0]
5360 v_1_1 := v_1.Args[1]
5361 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5362 if x != v_1_0 || v_1_1.Op != OpConst64 {
5363 continue
5364 }
5365 d := auxIntToInt64(v_1_1.AuxInt)
5366 if !(c|d == c && oneBit(c^d)) {
5367 continue
5368 }
5369 v.reset(OpNeq64)
5370 v0 := b.NewValue0(v.Pos, OpOr64, x.Type)
5371 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
5372 v1.AuxInt = int64ToAuxInt(c ^ d)
5373 v0.AddArg2(x, v1)
5374 v.AddArg2(v0, cv)
5375 return true
5376 }
5377 }
5378 }
5379 break
5380 }
5381
5382
5383
5384 for {
5385 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5386 if v_0.Op != OpNeq32 {
5387 continue
5388 }
5389 _ = v_0.Args[1]
5390 v_0_0 := v_0.Args[0]
5391 v_0_1 := v_0.Args[1]
5392 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5393 x := v_0_0
5394 cv := v_0_1
5395 if cv.Op != OpConst32 {
5396 continue
5397 }
5398 c := auxIntToInt32(cv.AuxInt)
5399 if v_1.Op != OpNeq32 {
5400 continue
5401 }
5402 _ = v_1.Args[1]
5403 v_1_0 := v_1.Args[0]
5404 v_1_1 := v_1.Args[1]
5405 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5406 if x != v_1_0 || v_1_1.Op != OpConst32 {
5407 continue
5408 }
5409 d := auxIntToInt32(v_1_1.AuxInt)
5410 if !(c|d == c && oneBit(c^d)) {
5411 continue
5412 }
5413 v.reset(OpNeq32)
5414 v0 := b.NewValue0(v.Pos, OpOr32, x.Type)
5415 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
5416 v1.AuxInt = int32ToAuxInt(c ^ d)
5417 v0.AddArg2(x, v1)
5418 v.AddArg2(v0, cv)
5419 return true
5420 }
5421 }
5422 }
5423 break
5424 }
5425
5426
5427
5428 for {
5429 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5430 if v_0.Op != OpNeq16 {
5431 continue
5432 }
5433 _ = v_0.Args[1]
5434 v_0_0 := v_0.Args[0]
5435 v_0_1 := v_0.Args[1]
5436 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5437 x := v_0_0
5438 cv := v_0_1
5439 if cv.Op != OpConst16 {
5440 continue
5441 }
5442 c := auxIntToInt16(cv.AuxInt)
5443 if v_1.Op != OpNeq16 {
5444 continue
5445 }
5446 _ = v_1.Args[1]
5447 v_1_0 := v_1.Args[0]
5448 v_1_1 := v_1.Args[1]
5449 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5450 if x != v_1_0 || v_1_1.Op != OpConst16 {
5451 continue
5452 }
5453 d := auxIntToInt16(v_1_1.AuxInt)
5454 if !(c|d == c && oneBit(c^d)) {
5455 continue
5456 }
5457 v.reset(OpNeq16)
5458 v0 := b.NewValue0(v.Pos, OpOr16, x.Type)
5459 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5460 v1.AuxInt = int16ToAuxInt(c ^ d)
5461 v0.AddArg2(x, v1)
5462 v.AddArg2(v0, cv)
5463 return true
5464 }
5465 }
5466 }
5467 break
5468 }
5469
5470
5471
5472 for {
5473 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5474 if v_0.Op != OpNeq8 {
5475 continue
5476 }
5477 _ = v_0.Args[1]
5478 v_0_0 := v_0.Args[0]
5479 v_0_1 := v_0.Args[1]
5480 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5481 x := v_0_0
5482 cv := v_0_1
5483 if cv.Op != OpConst8 {
5484 continue
5485 }
5486 c := auxIntToInt8(cv.AuxInt)
5487 if v_1.Op != OpNeq8 {
5488 continue
5489 }
5490 _ = v_1.Args[1]
5491 v_1_0 := v_1.Args[0]
5492 v_1_1 := v_1.Args[1]
5493 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5494 if x != v_1_0 || v_1_1.Op != OpConst8 {
5495 continue
5496 }
5497 d := auxIntToInt8(v_1_1.AuxInt)
5498 if !(c|d == c && oneBit(c^d)) {
5499 continue
5500 }
5501 v.reset(OpNeq8)
5502 v0 := b.NewValue0(v.Pos, OpOr8, x.Type)
5503 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5504 v1.AuxInt = int8ToAuxInt(c ^ d)
5505 v0.AddArg2(x, v1)
5506 v.AddArg2(v0, cv)
5507 return true
5508 }
5509 }
5510 }
5511 break
5512 }
5513 return false
5514 }
5515 func rewriteValuegeneric_OpArraySelect(v *Value) bool {
5516 v_0 := v.Args[0]
5517
5518
5519 for {
5520 if v_0.Op != OpArrayMake1 {
5521 break
5522 }
5523 x := v_0.Args[0]
5524 v.copyOf(x)
5525 return true
5526 }
5527
5528
5529 for {
5530 if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpIData {
5531 break
5532 }
5533 x := v_0.Args[0]
5534 v.reset(OpIData)
5535 v.AddArg(x)
5536 return true
5537 }
5538 return false
5539 }
5540 func rewriteValuegeneric_OpBitLen16(v *Value) bool {
5541 v_0 := v.Args[0]
5542 b := v.Block
5543 config := b.Func.Config
5544
5545
5546
5547 for {
5548 if v_0.Op != OpConst16 {
5549 break
5550 }
5551 c := auxIntToInt16(v_0.AuxInt)
5552 if !(config.PtrSize == 8) {
5553 break
5554 }
5555 v.reset(OpConst64)
5556 v.AuxInt = int64ToAuxInt(int64(bits.Len16(uint16(c))))
5557 return true
5558 }
5559
5560
5561
5562 for {
5563 if v_0.Op != OpConst16 {
5564 break
5565 }
5566 c := auxIntToInt16(v_0.AuxInt)
5567 if !(config.PtrSize == 4) {
5568 break
5569 }
5570 v.reset(OpConst32)
5571 v.AuxInt = int32ToAuxInt(int32(bits.Len16(uint16(c))))
5572 return true
5573 }
5574 return false
5575 }
5576 func rewriteValuegeneric_OpBitLen32(v *Value) bool {
5577 v_0 := v.Args[0]
5578 b := v.Block
5579 config := b.Func.Config
5580
5581
5582
5583 for {
5584 if v_0.Op != OpConst32 {
5585 break
5586 }
5587 c := auxIntToInt32(v_0.AuxInt)
5588 if !(config.PtrSize == 8) {
5589 break
5590 }
5591 v.reset(OpConst64)
5592 v.AuxInt = int64ToAuxInt(int64(bits.Len32(uint32(c))))
5593 return true
5594 }
5595
5596
5597
5598 for {
5599 if v_0.Op != OpConst32 {
5600 break
5601 }
5602 c := auxIntToInt32(v_0.AuxInt)
5603 if !(config.PtrSize == 4) {
5604 break
5605 }
5606 v.reset(OpConst32)
5607 v.AuxInt = int32ToAuxInt(int32(bits.Len32(uint32(c))))
5608 return true
5609 }
5610 return false
5611 }
5612 func rewriteValuegeneric_OpBitLen64(v *Value) bool {
5613 v_0 := v.Args[0]
5614 b := v.Block
5615 config := b.Func.Config
5616
5617
5618
5619 for {
5620 if v_0.Op != OpConst64 {
5621 break
5622 }
5623 c := auxIntToInt64(v_0.AuxInt)
5624 if !(config.PtrSize == 8) {
5625 break
5626 }
5627 v.reset(OpConst64)
5628 v.AuxInt = int64ToAuxInt(int64(bits.Len64(uint64(c))))
5629 return true
5630 }
5631
5632
5633
5634 for {
5635 if v_0.Op != OpConst64 {
5636 break
5637 }
5638 c := auxIntToInt64(v_0.AuxInt)
5639 if !(config.PtrSize == 4) {
5640 break
5641 }
5642 v.reset(OpConst32)
5643 v.AuxInt = int32ToAuxInt(int32(bits.Len64(uint64(c))))
5644 return true
5645 }
5646 return false
5647 }
5648 func rewriteValuegeneric_OpBitLen8(v *Value) bool {
5649 v_0 := v.Args[0]
5650 b := v.Block
5651 config := b.Func.Config
5652
5653
5654
5655 for {
5656 if v_0.Op != OpConst8 {
5657 break
5658 }
5659 c := auxIntToInt8(v_0.AuxInt)
5660 if !(config.PtrSize == 8) {
5661 break
5662 }
5663 v.reset(OpConst64)
5664 v.AuxInt = int64ToAuxInt(int64(bits.Len8(uint8(c))))
5665 return true
5666 }
5667
5668
5669
5670 for {
5671 if v_0.Op != OpConst8 {
5672 break
5673 }
5674 c := auxIntToInt8(v_0.AuxInt)
5675 if !(config.PtrSize == 4) {
5676 break
5677 }
5678 v.reset(OpConst32)
5679 v.AuxInt = int32ToAuxInt(int32(bits.Len8(uint8(c))))
5680 return true
5681 }
5682 return false
5683 }
5684 func rewriteValuegeneric_OpCeil(v *Value) bool {
5685 v_0 := v.Args[0]
5686
5687
5688 for {
5689 if v_0.Op != OpConst64F {
5690 break
5691 }
5692 c := auxIntToFloat64(v_0.AuxInt)
5693 v.reset(OpConst64F)
5694 v.AuxInt = float64ToAuxInt(math.Ceil(c))
5695 return true
5696 }
5697 return false
5698 }
5699 func rewriteValuegeneric_OpCom16(v *Value) bool {
5700 v_0 := v.Args[0]
5701
5702
5703 for {
5704 if v_0.Op != OpCom16 {
5705 break
5706 }
5707 x := v_0.Args[0]
5708 v.copyOf(x)
5709 return true
5710 }
5711
5712
5713 for {
5714 if v_0.Op != OpConst16 {
5715 break
5716 }
5717 c := auxIntToInt16(v_0.AuxInt)
5718 v.reset(OpConst16)
5719 v.AuxInt = int16ToAuxInt(^c)
5720 return true
5721 }
5722
5723
5724 for {
5725 if v_0.Op != OpAdd16 {
5726 break
5727 }
5728 _ = v_0.Args[1]
5729 v_0_0 := v_0.Args[0]
5730 v_0_1 := v_0.Args[1]
5731 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5732 if v_0_0.Op != OpConst16 || auxIntToInt16(v_0_0.AuxInt) != -1 {
5733 continue
5734 }
5735 x := v_0_1
5736 v.reset(OpNeg16)
5737 v.AddArg(x)
5738 return true
5739 }
5740 break
5741 }
5742 return false
5743 }
5744 func rewriteValuegeneric_OpCom32(v *Value) bool {
5745 v_0 := v.Args[0]
5746
5747
5748 for {
5749 if v_0.Op != OpCom32 {
5750 break
5751 }
5752 x := v_0.Args[0]
5753 v.copyOf(x)
5754 return true
5755 }
5756
5757
5758 for {
5759 if v_0.Op != OpConst32 {
5760 break
5761 }
5762 c := auxIntToInt32(v_0.AuxInt)
5763 v.reset(OpConst32)
5764 v.AuxInt = int32ToAuxInt(^c)
5765 return true
5766 }
5767
5768
5769 for {
5770 if v_0.Op != OpAdd32 {
5771 break
5772 }
5773 _ = v_0.Args[1]
5774 v_0_0 := v_0.Args[0]
5775 v_0_1 := v_0.Args[1]
5776 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5777 if v_0_0.Op != OpConst32 || auxIntToInt32(v_0_0.AuxInt) != -1 {
5778 continue
5779 }
5780 x := v_0_1
5781 v.reset(OpNeg32)
5782 v.AddArg(x)
5783 return true
5784 }
5785 break
5786 }
5787 return false
5788 }
5789 func rewriteValuegeneric_OpCom64(v *Value) bool {
5790 v_0 := v.Args[0]
5791
5792
5793 for {
5794 if v_0.Op != OpCom64 {
5795 break
5796 }
5797 x := v_0.Args[0]
5798 v.copyOf(x)
5799 return true
5800 }
5801
5802
5803 for {
5804 if v_0.Op != OpConst64 {
5805 break
5806 }
5807 c := auxIntToInt64(v_0.AuxInt)
5808 v.reset(OpConst64)
5809 v.AuxInt = int64ToAuxInt(^c)
5810 return true
5811 }
5812
5813
5814 for {
5815 if v_0.Op != OpAdd64 {
5816 break
5817 }
5818 _ = v_0.Args[1]
5819 v_0_0 := v_0.Args[0]
5820 v_0_1 := v_0.Args[1]
5821 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5822 if v_0_0.Op != OpConst64 || auxIntToInt64(v_0_0.AuxInt) != -1 {
5823 continue
5824 }
5825 x := v_0_1
5826 v.reset(OpNeg64)
5827 v.AddArg(x)
5828 return true
5829 }
5830 break
5831 }
5832 return false
5833 }
5834 func rewriteValuegeneric_OpCom8(v *Value) bool {
5835 v_0 := v.Args[0]
5836
5837
5838 for {
5839 if v_0.Op != OpCom8 {
5840 break
5841 }
5842 x := v_0.Args[0]
5843 v.copyOf(x)
5844 return true
5845 }
5846
5847
5848 for {
5849 if v_0.Op != OpConst8 {
5850 break
5851 }
5852 c := auxIntToInt8(v_0.AuxInt)
5853 v.reset(OpConst8)
5854 v.AuxInt = int8ToAuxInt(^c)
5855 return true
5856 }
5857
5858
5859 for {
5860 if v_0.Op != OpAdd8 {
5861 break
5862 }
5863 _ = v_0.Args[1]
5864 v_0_0 := v_0.Args[0]
5865 v_0_1 := v_0.Args[1]
5866 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5867 if v_0_0.Op != OpConst8 || auxIntToInt8(v_0_0.AuxInt) != -1 {
5868 continue
5869 }
5870 x := v_0_1
5871 v.reset(OpNeg8)
5872 v.AddArg(x)
5873 return true
5874 }
5875 break
5876 }
5877 return false
5878 }
5879 func rewriteValuegeneric_OpCondSelect(v *Value) bool {
5880 v_2 := v.Args[2]
5881 v_1 := v.Args[1]
5882 v_0 := v.Args[0]
5883 b := v.Block
5884 config := b.Func.Config
5885
5886
5887 for {
5888 x := v_0
5889 if v_2.Op != OpConstBool || auxIntToBool(v_2.AuxInt) != true {
5890 break
5891 }
5892 v.copyOf(x)
5893 return true
5894 }
5895
5896
5897 for {
5898 y := v_1
5899 if v_2.Op != OpConstBool || auxIntToBool(v_2.AuxInt) != false {
5900 break
5901 }
5902 v.copyOf(y)
5903 return true
5904 }
5905
5906
5907 for {
5908 x := v_0
5909 if x != v_1 {
5910 break
5911 }
5912 v.copyOf(x)
5913 return true
5914 }
5915
5916
5917
5918 for {
5919 if v_0.Op != OpAdd8 {
5920 break
5921 }
5922 t := v_0.Type
5923 _ = v_0.Args[1]
5924 v_0_0 := v_0.Args[0]
5925 v_0_1 := v_0.Args[1]
5926 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5927 x := v_0_0
5928 if v_0_1.Op != OpConst8 || auxIntToInt8(v_0_1.AuxInt) != 1 || x != v_1 {
5929 continue
5930 }
5931 bool := v_2
5932 if !(config.arch != "arm64") {
5933 continue
5934 }
5935 v.reset(OpAdd8)
5936 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
5937 v0.AddArg(bool)
5938 v.AddArg2(x, v0)
5939 return true
5940 }
5941 break
5942 }
5943
5944
5945
5946 for {
5947 if v_0.Op != OpAdd64 {
5948 break
5949 }
5950 t := v_0.Type
5951 _ = v_0.Args[1]
5952 v_0_0 := v_0.Args[0]
5953 v_0_1 := v_0.Args[1]
5954 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5955 x := v_0_0
5956 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
5957 continue
5958 }
5959 bool := v_2
5960 if !(config.arch != "arm64") {
5961 continue
5962 }
5963 v.reset(OpAdd64)
5964 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
5965 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
5966 v1.AddArg(bool)
5967 v0.AddArg(v1)
5968 v.AddArg2(x, v0)
5969 return true
5970 }
5971 break
5972 }
5973
5974
5975
5976 for {
5977 if v_0.Op != OpAdd32 {
5978 break
5979 }
5980 t := v_0.Type
5981 _ = v_0.Args[1]
5982 v_0_0 := v_0.Args[0]
5983 v_0_1 := v_0.Args[1]
5984 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5985 x := v_0_0
5986 if v_0_1.Op != OpConst32 || auxIntToInt32(v_0_1.AuxInt) != 1 || x != v_1 {
5987 continue
5988 }
5989 bool := v_2
5990 if !(config.arch != "arm64") {
5991 continue
5992 }
5993 v.reset(OpAdd32)
5994 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
5995 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
5996 v1.AddArg(bool)
5997 v0.AddArg(v1)
5998 v.AddArg2(x, v0)
5999 return true
6000 }
6001 break
6002 }
6003
6004
6005
6006 for {
6007 if v_0.Op != OpAdd16 {
6008 break
6009 }
6010 t := v_0.Type
6011 _ = v_0.Args[1]
6012 v_0_0 := v_0.Args[0]
6013 v_0_1 := v_0.Args[1]
6014 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6015 x := v_0_0
6016 if v_0_1.Op != OpConst16 || auxIntToInt16(v_0_1.AuxInt) != 1 || x != v_1 {
6017 continue
6018 }
6019 bool := v_2
6020 if !(config.arch != "arm64") {
6021 continue
6022 }
6023 v.reset(OpAdd16)
6024 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6025 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6026 v1.AddArg(bool)
6027 v0.AddArg(v1)
6028 v.AddArg2(x, v0)
6029 return true
6030 }
6031 break
6032 }
6033
6034
6035
6036 for {
6037 x := v_0
6038 if v_1.Op != OpAdd8 {
6039 break
6040 }
6041 t := v_1.Type
6042 _ = v_1.Args[1]
6043 v_1_0 := v_1.Args[0]
6044 v_1_1 := v_1.Args[1]
6045 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
6046 if x != v_1_0 || v_1_1.Op != OpConst8 || auxIntToInt8(v_1_1.AuxInt) != 1 {
6047 continue
6048 }
6049 bool := v_2
6050 if !(config.arch != "arm64") {
6051 continue
6052 }
6053 v.reset(OpAdd8)
6054 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
6055 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6056 v1.AddArg(bool)
6057 v0.AddArg(v1)
6058 v.AddArg2(x, v0)
6059 return true
6060 }
6061 break
6062 }
6063
6064
6065
6066 for {
6067 x := v_0
6068 if v_1.Op != OpAdd64 {
6069 break
6070 }
6071 t := v_1.Type
6072 _ = v_1.Args[1]
6073 v_1_0 := v_1.Args[0]
6074 v_1_1 := v_1.Args[1]
6075 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
6076 if x != v_1_0 || v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6077 continue
6078 }
6079 bool := v_2
6080 if !(config.arch != "arm64") {
6081 continue
6082 }
6083 v.reset(OpAdd64)
6084 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
6085 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6086 v2 := b.NewValue0(v.Pos, OpNot, bool.Type)
6087 v2.AddArg(bool)
6088 v1.AddArg(v2)
6089 v0.AddArg(v1)
6090 v.AddArg2(x, v0)
6091 return true
6092 }
6093 break
6094 }
6095
6096
6097
6098 for {
6099 x := v_0
6100 if v_1.Op != OpAdd32 {
6101 break
6102 }
6103 t := v_1.Type
6104 _ = v_1.Args[1]
6105 v_1_0 := v_1.Args[0]
6106 v_1_1 := v_1.Args[1]
6107 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
6108 if x != v_1_0 || v_1_1.Op != OpConst32 || auxIntToInt32(v_1_1.AuxInt) != 1 {
6109 continue
6110 }
6111 bool := v_2
6112 if !(config.arch != "arm64") {
6113 continue
6114 }
6115 v.reset(OpAdd32)
6116 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
6117 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6118 v2 := b.NewValue0(v.Pos, OpNot, bool.Type)
6119 v2.AddArg(bool)
6120 v1.AddArg(v2)
6121 v0.AddArg(v1)
6122 v.AddArg2(x, v0)
6123 return true
6124 }
6125 break
6126 }
6127
6128
6129
6130 for {
6131 x := v_0
6132 if v_1.Op != OpAdd16 {
6133 break
6134 }
6135 t := v_1.Type
6136 _ = v_1.Args[1]
6137 v_1_0 := v_1.Args[0]
6138 v_1_1 := v_1.Args[1]
6139 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
6140 if x != v_1_0 || v_1_1.Op != OpConst16 || auxIntToInt16(v_1_1.AuxInt) != 1 {
6141 continue
6142 }
6143 bool := v_2
6144 if !(config.arch != "arm64") {
6145 continue
6146 }
6147 v.reset(OpAdd16)
6148 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6149 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6150 v2 := b.NewValue0(v.Pos, OpNot, bool.Type)
6151 v2.AddArg(bool)
6152 v1.AddArg(v2)
6153 v0.AddArg(v1)
6154 v.AddArg2(x, v0)
6155 return true
6156 }
6157 break
6158 }
6159
6160
6161 for {
6162 if v_0.Op != OpAdd8 {
6163 break
6164 }
6165 t := v_0.Type
6166 _ = v_0.Args[1]
6167 v_0_0 := v_0.Args[0]
6168 v_0_1 := v_0.Args[1]
6169 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6170 x := v_0_0
6171 if v_0_1.Op != OpConst8 || auxIntToInt8(v_0_1.AuxInt) != -1 || x != v_1 {
6172 continue
6173 }
6174 bool := v_2
6175 v.reset(OpSub8)
6176 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
6177 v0.AddArg(bool)
6178 v.AddArg2(x, v0)
6179 return true
6180 }
6181 break
6182 }
6183
6184
6185 for {
6186 if v_0.Op != OpAdd64 {
6187 break
6188 }
6189 t := v_0.Type
6190 _ = v_0.Args[1]
6191 v_0_0 := v_0.Args[0]
6192 v_0_1 := v_0.Args[1]
6193 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6194 x := v_0_0
6195 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != -1 || x != v_1 {
6196 continue
6197 }
6198 bool := v_2
6199 v.reset(OpSub64)
6200 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
6201 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6202 v1.AddArg(bool)
6203 v0.AddArg(v1)
6204 v.AddArg2(x, v0)
6205 return true
6206 }
6207 break
6208 }
6209
6210
6211 for {
6212 if v_0.Op != OpAdd32 {
6213 break
6214 }
6215 t := v_0.Type
6216 _ = v_0.Args[1]
6217 v_0_0 := v_0.Args[0]
6218 v_0_1 := v_0.Args[1]
6219 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6220 x := v_0_0
6221 if v_0_1.Op != OpConst32 || auxIntToInt32(v_0_1.AuxInt) != -1 || x != v_1 {
6222 continue
6223 }
6224 bool := v_2
6225 v.reset(OpSub32)
6226 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
6227 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6228 v1.AddArg(bool)
6229 v0.AddArg(v1)
6230 v.AddArg2(x, v0)
6231 return true
6232 }
6233 break
6234 }
6235
6236
6237 for {
6238 if v_0.Op != OpAdd16 {
6239 break
6240 }
6241 t := v_0.Type
6242 _ = v_0.Args[1]
6243 v_0_0 := v_0.Args[0]
6244 v_0_1 := v_0.Args[1]
6245 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6246 x := v_0_0
6247 if v_0_1.Op != OpConst16 || auxIntToInt16(v_0_1.AuxInt) != -1 || x != v_1 {
6248 continue
6249 }
6250 bool := v_2
6251 v.reset(OpSub16)
6252 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6253 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6254 v1.AddArg(bool)
6255 v0.AddArg(v1)
6256 v.AddArg2(x, v0)
6257 return true
6258 }
6259 break
6260 }
6261
6262
6263 for {
6264 x := v_0
6265 if v_1.Op != OpAdd8 {
6266 break
6267 }
6268 t := v_1.Type
6269 _ = v_1.Args[1]
6270 v_1_0 := v_1.Args[0]
6271 v_1_1 := v_1.Args[1]
6272 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
6273 if x != v_1_0 || v_1_1.Op != OpConst8 || auxIntToInt8(v_1_1.AuxInt) != -1 {
6274 continue
6275 }
6276 bool := v_2
6277 v.reset(OpSub8)
6278 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
6279 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6280 v1.AddArg(bool)
6281 v0.AddArg(v1)
6282 v.AddArg2(x, v0)
6283 return true
6284 }
6285 break
6286 }
6287
6288
6289 for {
6290 x := v_0
6291 if v_1.Op != OpAdd64 {
6292 break
6293 }
6294 t := v_1.Type
6295 _ = v_1.Args[1]
6296 v_1_0 := v_1.Args[0]
6297 v_1_1 := v_1.Args[1]
6298 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
6299 if x != v_1_0 || v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != -1 {
6300 continue
6301 }
6302 bool := v_2
6303 v.reset(OpSub64)
6304 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
6305 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6306 v2 := b.NewValue0(v.Pos, OpNot, bool.Type)
6307 v2.AddArg(bool)
6308 v1.AddArg(v2)
6309 v0.AddArg(v1)
6310 v.AddArg2(x, v0)
6311 return true
6312 }
6313 break
6314 }
6315
6316
6317 for {
6318 x := v_0
6319 if v_1.Op != OpAdd32 {
6320 break
6321 }
6322 t := v_1.Type
6323 _ = v_1.Args[1]
6324 v_1_0 := v_1.Args[0]
6325 v_1_1 := v_1.Args[1]
6326 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
6327 if x != v_1_0 || v_1_1.Op != OpConst32 || auxIntToInt32(v_1_1.AuxInt) != -1 {
6328 continue
6329 }
6330 bool := v_2
6331 v.reset(OpSub32)
6332 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
6333 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6334 v2 := b.NewValue0(v.Pos, OpNot, bool.Type)
6335 v2.AddArg(bool)
6336 v1.AddArg(v2)
6337 v0.AddArg(v1)
6338 v.AddArg2(x, v0)
6339 return true
6340 }
6341 break
6342 }
6343
6344
6345 for {
6346 x := v_0
6347 if v_1.Op != OpAdd16 {
6348 break
6349 }
6350 t := v_1.Type
6351 _ = v_1.Args[1]
6352 v_1_0 := v_1.Args[0]
6353 v_1_1 := v_1.Args[1]
6354 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
6355 if x != v_1_0 || v_1_1.Op != OpConst16 || auxIntToInt16(v_1_1.AuxInt) != -1 {
6356 continue
6357 }
6358 bool := v_2
6359 v.reset(OpSub16)
6360 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6361 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6362 v2 := b.NewValue0(v.Pos, OpNot, bool.Type)
6363 v2.AddArg(bool)
6364 v1.AddArg(v2)
6365 v0.AddArg(v1)
6366 v.AddArg2(x, v0)
6367 return true
6368 }
6369 break
6370 }
6371
6372
6373 for {
6374 if v_0.Op != OpLsh64x64 {
6375 break
6376 }
6377 _ = v_0.Args[1]
6378 x := v_0.Args[0]
6379 v_0_1 := v_0.Args[1]
6380 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6381 break
6382 }
6383 bool := v_2
6384 v.reset(OpLsh64x8)
6385 v.AuxInt = boolToAuxInt(true)
6386 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6387 v0.AddArg(bool)
6388 v.AddArg2(x, v0)
6389 return true
6390 }
6391
6392
6393 for {
6394 if v_0.Op != OpLsh32x64 {
6395 break
6396 }
6397 _ = v_0.Args[1]
6398 x := v_0.Args[0]
6399 v_0_1 := v_0.Args[1]
6400 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6401 break
6402 }
6403 bool := v_2
6404 v.reset(OpLsh32x8)
6405 v.AuxInt = boolToAuxInt(true)
6406 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6407 v0.AddArg(bool)
6408 v.AddArg2(x, v0)
6409 return true
6410 }
6411
6412
6413 for {
6414 if v_0.Op != OpLsh16x64 {
6415 break
6416 }
6417 _ = v_0.Args[1]
6418 x := v_0.Args[0]
6419 v_0_1 := v_0.Args[1]
6420 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6421 break
6422 }
6423 bool := v_2
6424 v.reset(OpLsh16x8)
6425 v.AuxInt = boolToAuxInt(true)
6426 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6427 v0.AddArg(bool)
6428 v.AddArg2(x, v0)
6429 return true
6430 }
6431
6432
6433 for {
6434 if v_0.Op != OpLsh8x64 {
6435 break
6436 }
6437 _ = v_0.Args[1]
6438 x := v_0.Args[0]
6439 v_0_1 := v_0.Args[1]
6440 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6441 break
6442 }
6443 bool := v_2
6444 v.reset(OpLsh8x8)
6445 v.AuxInt = boolToAuxInt(true)
6446 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6447 v0.AddArg(bool)
6448 v.AddArg2(x, v0)
6449 return true
6450 }
6451
6452
6453 for {
6454 x := v_0
6455 if v_1.Op != OpLsh64x64 {
6456 break
6457 }
6458 _ = v_1.Args[1]
6459 if x != v_1.Args[0] {
6460 break
6461 }
6462 v_1_1 := v_1.Args[1]
6463 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6464 break
6465 }
6466 bool := v_2
6467 v.reset(OpLsh64x8)
6468 v.AuxInt = boolToAuxInt(true)
6469 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6470 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6471 v1.AddArg(bool)
6472 v0.AddArg(v1)
6473 v.AddArg2(x, v0)
6474 return true
6475 }
6476
6477
6478 for {
6479 x := v_0
6480 if v_1.Op != OpLsh32x64 {
6481 break
6482 }
6483 _ = v_1.Args[1]
6484 if x != v_1.Args[0] {
6485 break
6486 }
6487 v_1_1 := v_1.Args[1]
6488 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6489 break
6490 }
6491 bool := v_2
6492 v.reset(OpLsh32x8)
6493 v.AuxInt = boolToAuxInt(true)
6494 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6495 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6496 v1.AddArg(bool)
6497 v0.AddArg(v1)
6498 v.AddArg2(x, v0)
6499 return true
6500 }
6501
6502
6503 for {
6504 x := v_0
6505 if v_1.Op != OpLsh16x64 {
6506 break
6507 }
6508 _ = v_1.Args[1]
6509 if x != v_1.Args[0] {
6510 break
6511 }
6512 v_1_1 := v_1.Args[1]
6513 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6514 break
6515 }
6516 bool := v_2
6517 v.reset(OpLsh16x8)
6518 v.AuxInt = boolToAuxInt(true)
6519 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6520 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6521 v1.AddArg(bool)
6522 v0.AddArg(v1)
6523 v.AddArg2(x, v0)
6524 return true
6525 }
6526
6527
6528 for {
6529 x := v_0
6530 if v_1.Op != OpLsh8x64 {
6531 break
6532 }
6533 _ = v_1.Args[1]
6534 if x != v_1.Args[0] {
6535 break
6536 }
6537 v_1_1 := v_1.Args[1]
6538 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6539 break
6540 }
6541 bool := v_2
6542 v.reset(OpLsh8x8)
6543 v.AuxInt = boolToAuxInt(true)
6544 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6545 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6546 v1.AddArg(bool)
6547 v0.AddArg(v1)
6548 v.AddArg2(x, v0)
6549 return true
6550 }
6551
6552
6553 for {
6554 if v_0.Op != OpRsh64x64 {
6555 break
6556 }
6557 _ = v_0.Args[1]
6558 x := v_0.Args[0]
6559 v_0_1 := v_0.Args[1]
6560 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6561 break
6562 }
6563 bool := v_2
6564 v.reset(OpRsh64x8)
6565 v.AuxInt = boolToAuxInt(true)
6566 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6567 v0.AddArg(bool)
6568 v.AddArg2(x, v0)
6569 return true
6570 }
6571
6572
6573 for {
6574 if v_0.Op != OpRsh32x64 {
6575 break
6576 }
6577 _ = v_0.Args[1]
6578 x := v_0.Args[0]
6579 v_0_1 := v_0.Args[1]
6580 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6581 break
6582 }
6583 bool := v_2
6584 v.reset(OpRsh32x8)
6585 v.AuxInt = boolToAuxInt(true)
6586 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6587 v0.AddArg(bool)
6588 v.AddArg2(x, v0)
6589 return true
6590 }
6591
6592
6593 for {
6594 if v_0.Op != OpRsh16x64 {
6595 break
6596 }
6597 _ = v_0.Args[1]
6598 x := v_0.Args[0]
6599 v_0_1 := v_0.Args[1]
6600 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6601 break
6602 }
6603 bool := v_2
6604 v.reset(OpRsh16x8)
6605 v.AuxInt = boolToAuxInt(true)
6606 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6607 v0.AddArg(bool)
6608 v.AddArg2(x, v0)
6609 return true
6610 }
6611
6612
6613 for {
6614 if v_0.Op != OpRsh8x64 {
6615 break
6616 }
6617 _ = v_0.Args[1]
6618 x := v_0.Args[0]
6619 v_0_1 := v_0.Args[1]
6620 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6621 break
6622 }
6623 bool := v_2
6624 v.reset(OpRsh8x8)
6625 v.AuxInt = boolToAuxInt(true)
6626 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6627 v0.AddArg(bool)
6628 v.AddArg2(x, v0)
6629 return true
6630 }
6631
6632
6633 for {
6634 if v_0.Op != OpRsh64Ux64 {
6635 break
6636 }
6637 _ = v_0.Args[1]
6638 x := v_0.Args[0]
6639 v_0_1 := v_0.Args[1]
6640 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6641 break
6642 }
6643 bool := v_2
6644 v.reset(OpRsh64Ux8)
6645 v.AuxInt = boolToAuxInt(true)
6646 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6647 v0.AddArg(bool)
6648 v.AddArg2(x, v0)
6649 return true
6650 }
6651
6652
6653 for {
6654 if v_0.Op != OpRsh32Ux64 {
6655 break
6656 }
6657 _ = v_0.Args[1]
6658 x := v_0.Args[0]
6659 v_0_1 := v_0.Args[1]
6660 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6661 break
6662 }
6663 bool := v_2
6664 v.reset(OpRsh32Ux8)
6665 v.AuxInt = boolToAuxInt(true)
6666 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6667 v0.AddArg(bool)
6668 v.AddArg2(x, v0)
6669 return true
6670 }
6671
6672
6673 for {
6674 if v_0.Op != OpRsh16Ux64 {
6675 break
6676 }
6677 _ = v_0.Args[1]
6678 x := v_0.Args[0]
6679 v_0_1 := v_0.Args[1]
6680 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6681 break
6682 }
6683 bool := v_2
6684 v.reset(OpRsh16Ux8)
6685 v.AuxInt = boolToAuxInt(true)
6686 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6687 v0.AddArg(bool)
6688 v.AddArg2(x, v0)
6689 return true
6690 }
6691
6692
6693 for {
6694 if v_0.Op != OpRsh8Ux64 {
6695 break
6696 }
6697 _ = v_0.Args[1]
6698 x := v_0.Args[0]
6699 v_0_1 := v_0.Args[1]
6700 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6701 break
6702 }
6703 bool := v_2
6704 v.reset(OpRsh8Ux8)
6705 v.AuxInt = boolToAuxInt(true)
6706 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6707 v0.AddArg(bool)
6708 v.AddArg2(x, v0)
6709 return true
6710 }
6711
6712
6713 for {
6714 x := v_0
6715 if v_1.Op != OpRsh64x64 {
6716 break
6717 }
6718 _ = v_1.Args[1]
6719 if x != v_1.Args[0] {
6720 break
6721 }
6722 v_1_1 := v_1.Args[1]
6723 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6724 break
6725 }
6726 bool := v_2
6727 v.reset(OpRsh64x8)
6728 v.AuxInt = boolToAuxInt(true)
6729 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6730 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6731 v1.AddArg(bool)
6732 v0.AddArg(v1)
6733 v.AddArg2(x, v0)
6734 return true
6735 }
6736
6737
6738 for {
6739 x := v_0
6740 if v_1.Op != OpRsh32x64 {
6741 break
6742 }
6743 _ = v_1.Args[1]
6744 if x != v_1.Args[0] {
6745 break
6746 }
6747 v_1_1 := v_1.Args[1]
6748 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6749 break
6750 }
6751 bool := v_2
6752 v.reset(OpRsh32x8)
6753 v.AuxInt = boolToAuxInt(true)
6754 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6755 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6756 v1.AddArg(bool)
6757 v0.AddArg(v1)
6758 v.AddArg2(x, v0)
6759 return true
6760 }
6761
6762
6763 for {
6764 x := v_0
6765 if v_1.Op != OpRsh16x64 {
6766 break
6767 }
6768 _ = v_1.Args[1]
6769 if x != v_1.Args[0] {
6770 break
6771 }
6772 v_1_1 := v_1.Args[1]
6773 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6774 break
6775 }
6776 bool := v_2
6777 v.reset(OpRsh16x8)
6778 v.AuxInt = boolToAuxInt(true)
6779 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6780 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6781 v1.AddArg(bool)
6782 v0.AddArg(v1)
6783 v.AddArg2(x, v0)
6784 return true
6785 }
6786
6787
6788 for {
6789 x := v_0
6790 if v_1.Op != OpRsh8x64 {
6791 break
6792 }
6793 _ = v_1.Args[1]
6794 if x != v_1.Args[0] {
6795 break
6796 }
6797 v_1_1 := v_1.Args[1]
6798 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6799 break
6800 }
6801 bool := v_2
6802 v.reset(OpRsh8x8)
6803 v.AuxInt = boolToAuxInt(true)
6804 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6805 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6806 v1.AddArg(bool)
6807 v0.AddArg(v1)
6808 v.AddArg2(x, v0)
6809 return true
6810 }
6811
6812
6813 for {
6814 x := v_0
6815 if v_1.Op != OpRsh64Ux64 {
6816 break
6817 }
6818 _ = v_1.Args[1]
6819 if x != v_1.Args[0] {
6820 break
6821 }
6822 v_1_1 := v_1.Args[1]
6823 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6824 break
6825 }
6826 bool := v_2
6827 v.reset(OpRsh64Ux8)
6828 v.AuxInt = boolToAuxInt(true)
6829 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6830 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6831 v1.AddArg(bool)
6832 v0.AddArg(v1)
6833 v.AddArg2(x, v0)
6834 return true
6835 }
6836
6837
6838 for {
6839 x := v_0
6840 if v_1.Op != OpRsh32Ux64 {
6841 break
6842 }
6843 _ = v_1.Args[1]
6844 if x != v_1.Args[0] {
6845 break
6846 }
6847 v_1_1 := v_1.Args[1]
6848 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6849 break
6850 }
6851 bool := v_2
6852 v.reset(OpRsh32Ux8)
6853 v.AuxInt = boolToAuxInt(true)
6854 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6855 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6856 v1.AddArg(bool)
6857 v0.AddArg(v1)
6858 v.AddArg2(x, v0)
6859 return true
6860 }
6861
6862
6863 for {
6864 x := v_0
6865 if v_1.Op != OpRsh16Ux64 {
6866 break
6867 }
6868 _ = v_1.Args[1]
6869 if x != v_1.Args[0] {
6870 break
6871 }
6872 v_1_1 := v_1.Args[1]
6873 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6874 break
6875 }
6876 bool := v_2
6877 v.reset(OpRsh16Ux8)
6878 v.AuxInt = boolToAuxInt(true)
6879 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6880 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6881 v1.AddArg(bool)
6882 v0.AddArg(v1)
6883 v.AddArg2(x, v0)
6884 return true
6885 }
6886
6887
6888 for {
6889 x := v_0
6890 if v_1.Op != OpRsh8Ux64 {
6891 break
6892 }
6893 _ = v_1.Args[1]
6894 if x != v_1.Args[0] {
6895 break
6896 }
6897 v_1_1 := v_1.Args[1]
6898 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6899 break
6900 }
6901 bool := v_2
6902 v.reset(OpRsh8Ux8)
6903 v.AuxInt = boolToAuxInt(true)
6904 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6905 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6906 v1.AddArg(bool)
6907 v0.AddArg(v1)
6908 v.AddArg2(x, v0)
6909 return true
6910 }
6911
6912
6913 for {
6914 if v_0.Op != OpOr8 {
6915 break
6916 }
6917 t := v_0.Type
6918 _ = v_0.Args[1]
6919 v_0_0 := v_0.Args[0]
6920 v_0_1 := v_0.Args[1]
6921 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6922 x := v_0_0
6923 if v_0_1.Op != OpConst8 || auxIntToInt8(v_0_1.AuxInt) != 1 || x != v_1 {
6924 continue
6925 }
6926 bool := v_2
6927 v.reset(OpOr8)
6928 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
6929 v0.AddArg(bool)
6930 v.AddArg2(x, v0)
6931 return true
6932 }
6933 break
6934 }
6935
6936
6937 for {
6938 if v_0.Op != OpOr64 {
6939 break
6940 }
6941 t := v_0.Type
6942 _ = v_0.Args[1]
6943 v_0_0 := v_0.Args[0]
6944 v_0_1 := v_0.Args[1]
6945 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6946 x := v_0_0
6947 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6948 continue
6949 }
6950 bool := v_2
6951 v.reset(OpOr64)
6952 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
6953 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6954 v1.AddArg(bool)
6955 v0.AddArg(v1)
6956 v.AddArg2(x, v0)
6957 return true
6958 }
6959 break
6960 }
6961
6962
6963 for {
6964 if v_0.Op != OpOr32 {
6965 break
6966 }
6967 t := v_0.Type
6968 _ = v_0.Args[1]
6969 v_0_0 := v_0.Args[0]
6970 v_0_1 := v_0.Args[1]
6971 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6972 x := v_0_0
6973 if v_0_1.Op != OpConst32 || auxIntToInt32(v_0_1.AuxInt) != 1 || x != v_1 {
6974 continue
6975 }
6976 bool := v_2
6977 v.reset(OpOr32)
6978 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
6979 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6980 v1.AddArg(bool)
6981 v0.AddArg(v1)
6982 v.AddArg2(x, v0)
6983 return true
6984 }
6985 break
6986 }
6987
6988
6989 for {
6990 if v_0.Op != OpOr16 {
6991 break
6992 }
6993 t := v_0.Type
6994 _ = v_0.Args[1]
6995 v_0_0 := v_0.Args[0]
6996 v_0_1 := v_0.Args[1]
6997 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6998 x := v_0_0
6999 if v_0_1.Op != OpConst16 || auxIntToInt16(v_0_1.AuxInt) != 1 || x != v_1 {
7000 continue
7001 }
7002 bool := v_2
7003 v.reset(OpOr16)
7004 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
7005 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7006 v1.AddArg(bool)
7007 v0.AddArg(v1)
7008 v.AddArg2(x, v0)
7009 return true
7010 }
7011 break
7012 }
7013
7014
7015 for {
7016 x := v_0
7017 if v_1.Op != OpOr8 {
7018 break
7019 }
7020 t := v_1.Type
7021 _ = v_1.Args[1]
7022 v_1_0 := v_1.Args[0]
7023 v_1_1 := v_1.Args[1]
7024 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
7025 if x != v_1_0 || v_1_1.Op != OpConst8 || auxIntToInt8(v_1_1.AuxInt) != 1 {
7026 continue
7027 }
7028 bool := v_2
7029 v.reset(OpOr8)
7030 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
7031 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
7032 v1.AddArg(bool)
7033 v0.AddArg(v1)
7034 v.AddArg2(x, v0)
7035 return true
7036 }
7037 break
7038 }
7039
7040
7041 for {
7042 x := v_0
7043 if v_1.Op != OpOr64 {
7044 break
7045 }
7046 t := v_1.Type
7047 _ = v_1.Args[1]
7048 v_1_0 := v_1.Args[0]
7049 v_1_1 := v_1.Args[1]
7050 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
7051 if x != v_1_0 || v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
7052 continue
7053 }
7054 bool := v_2
7055 v.reset(OpOr64)
7056 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
7057 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7058 v2 := b.NewValue0(v.Pos, OpNot, bool.Type)
7059 v2.AddArg(bool)
7060 v1.AddArg(v2)
7061 v0.AddArg(v1)
7062 v.AddArg2(x, v0)
7063 return true
7064 }
7065 break
7066 }
7067
7068
7069 for {
7070 x := v_0
7071 if v_1.Op != OpOr32 {
7072 break
7073 }
7074 t := v_1.Type
7075 _ = v_1.Args[1]
7076 v_1_0 := v_1.Args[0]
7077 v_1_1 := v_1.Args[1]
7078 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
7079 if x != v_1_0 || v_1_1.Op != OpConst32 || auxIntToInt32(v_1_1.AuxInt) != 1 {
7080 continue
7081 }
7082 bool := v_2
7083 v.reset(OpOr32)
7084 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
7085 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7086 v2 := b.NewValue0(v.Pos, OpNot, bool.Type)
7087 v2.AddArg(bool)
7088 v1.AddArg(v2)
7089 v0.AddArg(v1)
7090 v.AddArg2(x, v0)
7091 return true
7092 }
7093 break
7094 }
7095
7096
7097 for {
7098 x := v_0
7099 if v_1.Op != OpOr16 {
7100 break
7101 }
7102 t := v_1.Type
7103 _ = v_1.Args[1]
7104 v_1_0 := v_1.Args[0]
7105 v_1_1 := v_1.Args[1]
7106 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
7107 if x != v_1_0 || v_1_1.Op != OpConst16 || auxIntToInt16(v_1_1.AuxInt) != 1 {
7108 continue
7109 }
7110 bool := v_2
7111 v.reset(OpOr16)
7112 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
7113 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7114 v2 := b.NewValue0(v.Pos, OpNot, bool.Type)
7115 v2.AddArg(bool)
7116 v1.AddArg(v2)
7117 v0.AddArg(v1)
7118 v.AddArg2(x, v0)
7119 return true
7120 }
7121 break
7122 }
7123
7124
7125 for {
7126 if v_0.Op != OpXor8 {
7127 break
7128 }
7129 t := v_0.Type
7130 _ = v_0.Args[1]
7131 v_0_0 := v_0.Args[0]
7132 v_0_1 := v_0.Args[1]
7133 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
7134 x := v_0_0
7135 if v_0_1.Op != OpConst8 || auxIntToInt8(v_0_1.AuxInt) != 1 || x != v_1 {
7136 continue
7137 }
7138 bool := v_2
7139 v.reset(OpXor8)
7140 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
7141 v0.AddArg(bool)
7142 v.AddArg2(x, v0)
7143 return true
7144 }
7145 break
7146 }
7147
7148
7149 for {
7150 if v_0.Op != OpXor64 {
7151 break
7152 }
7153 t := v_0.Type
7154 _ = v_0.Args[1]
7155 v_0_0 := v_0.Args[0]
7156 v_0_1 := v_0.Args[1]
7157 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
7158 x := v_0_0
7159 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
7160 continue
7161 }
7162 bool := v_2
7163 v.reset(OpXor64)
7164 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
7165 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7166 v1.AddArg(bool)
7167 v0.AddArg(v1)
7168 v.AddArg2(x, v0)
7169 return true
7170 }
7171 break
7172 }
7173
7174
7175 for {
7176 if v_0.Op != OpXor32 {
7177 break
7178 }
7179 t := v_0.Type
7180 _ = v_0.Args[1]
7181 v_0_0 := v_0.Args[0]
7182 v_0_1 := v_0.Args[1]
7183 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
7184 x := v_0_0
7185 if v_0_1.Op != OpConst32 || auxIntToInt32(v_0_1.AuxInt) != 1 || x != v_1 {
7186 continue
7187 }
7188 bool := v_2
7189 v.reset(OpXor32)
7190 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
7191 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7192 v1.AddArg(bool)
7193 v0.AddArg(v1)
7194 v.AddArg2(x, v0)
7195 return true
7196 }
7197 break
7198 }
7199
7200
7201 for {
7202 if v_0.Op != OpXor16 {
7203 break
7204 }
7205 t := v_0.Type
7206 _ = v_0.Args[1]
7207 v_0_0 := v_0.Args[0]
7208 v_0_1 := v_0.Args[1]
7209 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
7210 x := v_0_0
7211 if v_0_1.Op != OpConst16 || auxIntToInt16(v_0_1.AuxInt) != 1 || x != v_1 {
7212 continue
7213 }
7214 bool := v_2
7215 v.reset(OpXor16)
7216 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
7217 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7218 v1.AddArg(bool)
7219 v0.AddArg(v1)
7220 v.AddArg2(x, v0)
7221 return true
7222 }
7223 break
7224 }
7225
7226
7227 for {
7228 x := v_0
7229 if v_1.Op != OpXor8 {
7230 break
7231 }
7232 t := v_1.Type
7233 _ = v_1.Args[1]
7234 v_1_0 := v_1.Args[0]
7235 v_1_1 := v_1.Args[1]
7236 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
7237 if x != v_1_0 || v_1_1.Op != OpConst8 || auxIntToInt8(v_1_1.AuxInt) != 1 {
7238 continue
7239 }
7240 bool := v_2
7241 v.reset(OpXor8)
7242 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
7243 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
7244 v1.AddArg(bool)
7245 v0.AddArg(v1)
7246 v.AddArg2(x, v0)
7247 return true
7248 }
7249 break
7250 }
7251
7252
7253 for {
7254 x := v_0
7255 if v_1.Op != OpXor64 {
7256 break
7257 }
7258 t := v_1.Type
7259 _ = v_1.Args[1]
7260 v_1_0 := v_1.Args[0]
7261 v_1_1 := v_1.Args[1]
7262 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
7263 if x != v_1_0 || v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
7264 continue
7265 }
7266 bool := v_2
7267 v.reset(OpXor64)
7268 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
7269 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7270 v2 := b.NewValue0(v.Pos, OpNot, bool.Type)
7271 v2.AddArg(bool)
7272 v1.AddArg(v2)
7273 v0.AddArg(v1)
7274 v.AddArg2(x, v0)
7275 return true
7276 }
7277 break
7278 }
7279
7280
7281 for {
7282 x := v_0
7283 if v_1.Op != OpXor32 {
7284 break
7285 }
7286 t := v_1.Type
7287 _ = v_1.Args[1]
7288 v_1_0 := v_1.Args[0]
7289 v_1_1 := v_1.Args[1]
7290 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
7291 if x != v_1_0 || v_1_1.Op != OpConst32 || auxIntToInt32(v_1_1.AuxInt) != 1 {
7292 continue
7293 }
7294 bool := v_2
7295 v.reset(OpXor32)
7296 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
7297 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7298 v2 := b.NewValue0(v.Pos, OpNot, bool.Type)
7299 v2.AddArg(bool)
7300 v1.AddArg(v2)
7301 v0.AddArg(v1)
7302 v.AddArg2(x, v0)
7303 return true
7304 }
7305 break
7306 }
7307
7308
7309 for {
7310 x := v_0
7311 if v_1.Op != OpXor16 {
7312 break
7313 }
7314 t := v_1.Type
7315 _ = v_1.Args[1]
7316 v_1_0 := v_1.Args[0]
7317 v_1_1 := v_1.Args[1]
7318 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
7319 if x != v_1_0 || v_1_1.Op != OpConst16 || auxIntToInt16(v_1_1.AuxInt) != 1 {
7320 continue
7321 }
7322 bool := v_2
7323 v.reset(OpXor16)
7324 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
7325 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7326 v2 := b.NewValue0(v.Pos, OpNot, bool.Type)
7327 v2.AddArg(bool)
7328 v1.AddArg(v2)
7329 v0.AddArg(v1)
7330 v.AddArg2(x, v0)
7331 return true
7332 }
7333 break
7334 }
7335 return false
7336 }
7337 func rewriteValuegeneric_OpConstInterface(v *Value) bool {
7338 b := v.Block
7339 typ := &b.Func.Config.Types
7340
7341
7342 for {
7343 v.reset(OpIMake)
7344 v0 := b.NewValue0(v.Pos, OpConstNil, typ.Uintptr)
7345 v1 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
7346 v.AddArg2(v0, v1)
7347 return true
7348 }
7349 }
7350 func rewriteValuegeneric_OpConstSlice(v *Value) bool {
7351 b := v.Block
7352 config := b.Func.Config
7353 typ := &b.Func.Config.Types
7354
7355
7356
7357 for {
7358 if !(config.PtrSize == 4) {
7359 break
7360 }
7361 v.reset(OpSliceMake)
7362 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo())
7363 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
7364 v1.AuxInt = int32ToAuxInt(0)
7365 v.AddArg3(v0, v1, v1)
7366 return true
7367 }
7368
7369
7370
7371 for {
7372 if !(config.PtrSize == 8) {
7373 break
7374 }
7375 v.reset(OpSliceMake)
7376 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo())
7377 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
7378 v1.AuxInt = int64ToAuxInt(0)
7379 v.AddArg3(v0, v1, v1)
7380 return true
7381 }
7382 return false
7383 }
7384 func rewriteValuegeneric_OpConstString(v *Value) bool {
7385 b := v.Block
7386 config := b.Func.Config
7387 fe := b.Func.fe
7388 typ := &b.Func.Config.Types
7389
7390
7391
7392 for {
7393 str := auxToString(v.Aux)
7394 if !(config.PtrSize == 4 && str == "") {
7395 break
7396 }
7397 v.reset(OpStringMake)
7398 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
7399 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
7400 v1.AuxInt = int32ToAuxInt(0)
7401 v.AddArg2(v0, v1)
7402 return true
7403 }
7404
7405
7406
7407 for {
7408 str := auxToString(v.Aux)
7409 if !(config.PtrSize == 8 && str == "") {
7410 break
7411 }
7412 v.reset(OpStringMake)
7413 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
7414 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
7415 v1.AuxInt = int64ToAuxInt(0)
7416 v.AddArg2(v0, v1)
7417 return true
7418 }
7419
7420
7421
7422 for {
7423 str := auxToString(v.Aux)
7424 if !(config.PtrSize == 4 && str != "") {
7425 break
7426 }
7427 v.reset(OpStringMake)
7428 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr)
7429 v0.Aux = symToAux(fe.StringData(str))
7430 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
7431 v0.AddArg(v1)
7432 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int)
7433 v2.AuxInt = int32ToAuxInt(int32(len(str)))
7434 v.AddArg2(v0, v2)
7435 return true
7436 }
7437
7438
7439
7440 for {
7441 str := auxToString(v.Aux)
7442 if !(config.PtrSize == 8 && str != "") {
7443 break
7444 }
7445 v.reset(OpStringMake)
7446 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr)
7447 v0.Aux = symToAux(fe.StringData(str))
7448 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
7449 v0.AddArg(v1)
7450 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int)
7451 v2.AuxInt = int64ToAuxInt(int64(len(str)))
7452 v.AddArg2(v0, v2)
7453 return true
7454 }
7455 return false
7456 }
7457 func rewriteValuegeneric_OpConvert(v *Value) bool {
7458 v_1 := v.Args[1]
7459 v_0 := v.Args[0]
7460 b := v.Block
7461
7462
7463 for {
7464 if v_0.Op != OpAdd64 {
7465 break
7466 }
7467 _ = v_0.Args[1]
7468 v_0_0 := v_0.Args[0]
7469 v_0_1 := v_0.Args[1]
7470 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
7471 if v_0_0.Op != OpConvert {
7472 continue
7473 }
7474 mem := v_0_0.Args[1]
7475 ptr := v_0_0.Args[0]
7476 off := v_0_1
7477 if mem != v_1 {
7478 continue
7479 }
7480 v.reset(OpAddPtr)
7481 v.AddArg2(ptr, off)
7482 return true
7483 }
7484 break
7485 }
7486
7487
7488 for {
7489 if v_0.Op != OpAdd32 {
7490 break
7491 }
7492 _ = v_0.Args[1]
7493 v_0_0 := v_0.Args[0]
7494 v_0_1 := v_0.Args[1]
7495 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
7496 if v_0_0.Op != OpConvert {
7497 continue
7498 }
7499 mem := v_0_0.Args[1]
7500 ptr := v_0_0.Args[0]
7501 off := v_0_1
7502 if mem != v_1 {
7503 continue
7504 }
7505 v.reset(OpAddPtr)
7506 v.AddArg2(ptr, off)
7507 return true
7508 }
7509 break
7510 }
7511
7512
7513 for {
7514 if v_0.Op != OpConvert {
7515 break
7516 }
7517 mem := v_0.Args[1]
7518 ptr := v_0.Args[0]
7519 if mem != v_1 {
7520 break
7521 }
7522 v.copyOf(ptr)
7523 return true
7524 }
7525
7526
7527 for {
7528 a := v_0
7529 if a.Op != OpAdd64 {
7530 break
7531 }
7532 _ = a.Args[1]
7533 a_0 := a.Args[0]
7534 a_1 := a.Args[1]
7535 for _i0 := 0; _i0 <= 1; _i0, a_0, a_1 = _i0+1, a_1, a_0 {
7536 if a_0.Op != OpAdd64 {
7537 continue
7538 }
7539 _ = a_0.Args[1]
7540 a_0_0 := a_0.Args[0]
7541 a_0_1 := a_0.Args[1]
7542 for _i1 := 0; _i1 <= 1; _i1, a_0_0, a_0_1 = _i1+1, a_0_1, a_0_0 {
7543 if a_0_0.Op != OpConvert {
7544 continue
7545 }
7546 mem := a_0_0.Args[1]
7547 ptr := a_0_0.Args[0]
7548 off1 := a_0_1
7549 off2 := a_1
7550 if mem != v_1 {
7551 continue
7552 }
7553 v.reset(OpAddPtr)
7554 v0 := b.NewValue0(v.Pos, OpAdd64, a.Type)
7555 v0.AddArg2(off1, off2)
7556 v.AddArg2(ptr, v0)
7557 return true
7558 }
7559 }
7560 break
7561 }
7562
7563
7564 for {
7565 a := v_0
7566 if a.Op != OpAdd32 {
7567 break
7568 }
7569 _ = a.Args[1]
7570 a_0 := a.Args[0]
7571 a_1 := a.Args[1]
7572 for _i0 := 0; _i0 <= 1; _i0, a_0, a_1 = _i0+1, a_1, a_0 {
7573 if a_0.Op != OpAdd32 {
7574 continue
7575 }
7576 _ = a_0.Args[1]
7577 a_0_0 := a_0.Args[0]
7578 a_0_1 := a_0.Args[1]
7579 for _i1 := 0; _i1 <= 1; _i1, a_0_0, a_0_1 = _i1+1, a_0_1, a_0_0 {
7580 if a_0_0.Op != OpConvert {
7581 continue
7582 }
7583 mem := a_0_0.Args[1]
7584 ptr := a_0_0.Args[0]
7585 off1 := a_0_1
7586 off2 := a_1
7587 if mem != v_1 {
7588 continue
7589 }
7590 v.reset(OpAddPtr)
7591 v0 := b.NewValue0(v.Pos, OpAdd32, a.Type)
7592 v0.AddArg2(off1, off2)
7593 v.AddArg2(ptr, v0)
7594 return true
7595 }
7596 }
7597 break
7598 }
7599 return false
7600 }
7601 func rewriteValuegeneric_OpCtz16(v *Value) bool {
7602 v_0 := v.Args[0]
7603 b := v.Block
7604 config := b.Func.Config
7605
7606
7607
7608 for {
7609 if v_0.Op != OpConst16 {
7610 break
7611 }
7612 c := auxIntToInt16(v_0.AuxInt)
7613 if !(config.PtrSize == 4) {
7614 break
7615 }
7616 v.reset(OpConst32)
7617 v.AuxInt = int32ToAuxInt(int32(ntz16(c)))
7618 return true
7619 }
7620
7621
7622
7623 for {
7624 if v_0.Op != OpConst16 {
7625 break
7626 }
7627 c := auxIntToInt16(v_0.AuxInt)
7628 if !(config.PtrSize == 8) {
7629 break
7630 }
7631 v.reset(OpConst64)
7632 v.AuxInt = int64ToAuxInt(int64(ntz16(c)))
7633 return true
7634 }
7635 return false
7636 }
7637 func rewriteValuegeneric_OpCtz32(v *Value) bool {
7638 v_0 := v.Args[0]
7639 b := v.Block
7640 config := b.Func.Config
7641
7642
7643
7644 for {
7645 if v_0.Op != OpConst32 {
7646 break
7647 }
7648 c := auxIntToInt32(v_0.AuxInt)
7649 if !(config.PtrSize == 4) {
7650 break
7651 }
7652 v.reset(OpConst32)
7653 v.AuxInt = int32ToAuxInt(int32(ntz32(c)))
7654 return true
7655 }
7656
7657
7658
7659 for {
7660 if v_0.Op != OpConst32 {
7661 break
7662 }
7663 c := auxIntToInt32(v_0.AuxInt)
7664 if !(config.PtrSize == 8) {
7665 break
7666 }
7667 v.reset(OpConst64)
7668 v.AuxInt = int64ToAuxInt(int64(ntz32(c)))
7669 return true
7670 }
7671 return false
7672 }
7673 func rewriteValuegeneric_OpCtz64(v *Value) bool {
7674 v_0 := v.Args[0]
7675 b := v.Block
7676 config := b.Func.Config
7677
7678
7679
7680 for {
7681 if v_0.Op != OpConst64 {
7682 break
7683 }
7684 c := auxIntToInt64(v_0.AuxInt)
7685 if !(config.PtrSize == 4) {
7686 break
7687 }
7688 v.reset(OpConst32)
7689 v.AuxInt = int32ToAuxInt(int32(ntz64(c)))
7690 return true
7691 }
7692
7693
7694
7695 for {
7696 if v_0.Op != OpConst64 {
7697 break
7698 }
7699 c := auxIntToInt64(v_0.AuxInt)
7700 if !(config.PtrSize == 8) {
7701 break
7702 }
7703 v.reset(OpConst64)
7704 v.AuxInt = int64ToAuxInt(int64(ntz64(c)))
7705 return true
7706 }
7707 return false
7708 }
7709 func rewriteValuegeneric_OpCtz8(v *Value) bool {
7710 v_0 := v.Args[0]
7711 b := v.Block
7712 config := b.Func.Config
7713
7714
7715
7716 for {
7717 if v_0.Op != OpConst8 {
7718 break
7719 }
7720 c := auxIntToInt8(v_0.AuxInt)
7721 if !(config.PtrSize == 4) {
7722 break
7723 }
7724 v.reset(OpConst32)
7725 v.AuxInt = int32ToAuxInt(int32(ntz8(c)))
7726 return true
7727 }
7728
7729
7730
7731 for {
7732 if v_0.Op != OpConst8 {
7733 break
7734 }
7735 c := auxIntToInt8(v_0.AuxInt)
7736 if !(config.PtrSize == 8) {
7737 break
7738 }
7739 v.reset(OpConst64)
7740 v.AuxInt = int64ToAuxInt(int64(ntz8(c)))
7741 return true
7742 }
7743 return false
7744 }
7745 func rewriteValuegeneric_OpCvt32Fto32(v *Value) bool {
7746 v_0 := v.Args[0]
7747
7748
7749
7750 for {
7751 if v_0.Op != OpConst32F {
7752 break
7753 }
7754 c := auxIntToFloat32(v_0.AuxInt)
7755 if !(c >= -1<<31 && c < 1<<31) {
7756 break
7757 }
7758 v.reset(OpConst32)
7759 v.AuxInt = int32ToAuxInt(int32(c))
7760 return true
7761 }
7762 return false
7763 }
7764 func rewriteValuegeneric_OpCvt32Fto64(v *Value) bool {
7765 v_0 := v.Args[0]
7766
7767
7768
7769 for {
7770 if v_0.Op != OpConst32F {
7771 break
7772 }
7773 c := auxIntToFloat32(v_0.AuxInt)
7774 if !(c >= -1<<63 && c < 1<<63) {
7775 break
7776 }
7777 v.reset(OpConst64)
7778 v.AuxInt = int64ToAuxInt(int64(c))
7779 return true
7780 }
7781 return false
7782 }
7783 func rewriteValuegeneric_OpCvt32Fto64F(v *Value) bool {
7784 v_0 := v.Args[0]
7785
7786
7787 for {
7788 if v_0.Op != OpConst32F {
7789 break
7790 }
7791 c := auxIntToFloat32(v_0.AuxInt)
7792 v.reset(OpConst64F)
7793 v.AuxInt = float64ToAuxInt(float64(c))
7794 return true
7795 }
7796 return false
7797 }
7798 func rewriteValuegeneric_OpCvt32to32F(v *Value) bool {
7799 v_0 := v.Args[0]
7800
7801
7802 for {
7803 if v_0.Op != OpConst32 {
7804 break
7805 }
7806 c := auxIntToInt32(v_0.AuxInt)
7807 v.reset(OpConst32F)
7808 v.AuxInt = float32ToAuxInt(float32(c))
7809 return true
7810 }
7811 return false
7812 }
7813 func rewriteValuegeneric_OpCvt32to64F(v *Value) bool {
7814 v_0 := v.Args[0]
7815
7816
7817 for {
7818 if v_0.Op != OpConst32 {
7819 break
7820 }
7821 c := auxIntToInt32(v_0.AuxInt)
7822 v.reset(OpConst64F)
7823 v.AuxInt = float64ToAuxInt(float64(c))
7824 return true
7825 }
7826 return false
7827 }
7828 func rewriteValuegeneric_OpCvt64Fto32(v *Value) bool {
7829 v_0 := v.Args[0]
7830
7831
7832
7833 for {
7834 if v_0.Op != OpConst64F {
7835 break
7836 }
7837 c := auxIntToFloat64(v_0.AuxInt)
7838 if !(c >= -1<<31 && c < 1<<31) {
7839 break
7840 }
7841 v.reset(OpConst32)
7842 v.AuxInt = int32ToAuxInt(int32(c))
7843 return true
7844 }
7845 return false
7846 }
7847 func rewriteValuegeneric_OpCvt64Fto32F(v *Value) bool {
7848 v_0 := v.Args[0]
7849
7850
7851 for {
7852 if v_0.Op != OpConst64F {
7853 break
7854 }
7855 c := auxIntToFloat64(v_0.AuxInt)
7856 v.reset(OpConst32F)
7857 v.AuxInt = float32ToAuxInt(float32(c))
7858 return true
7859 }
7860
7861
7862
7863 for {
7864 sqrt0 := v_0
7865 if sqrt0.Op != OpSqrt {
7866 break
7867 }
7868 sqrt0_0 := sqrt0.Args[0]
7869 if sqrt0_0.Op != OpCvt32Fto64F {
7870 break
7871 }
7872 x := sqrt0_0.Args[0]
7873 if !(sqrt0.Uses == 1) {
7874 break
7875 }
7876 v.reset(OpSqrt32)
7877 v.AddArg(x)
7878 return true
7879 }
7880 return false
7881 }
7882 func rewriteValuegeneric_OpCvt64Fto64(v *Value) bool {
7883 v_0 := v.Args[0]
7884
7885
7886
7887 for {
7888 if v_0.Op != OpConst64F {
7889 break
7890 }
7891 c := auxIntToFloat64(v_0.AuxInt)
7892 if !(c >= -1<<63 && c < 1<<63) {
7893 break
7894 }
7895 v.reset(OpConst64)
7896 v.AuxInt = int64ToAuxInt(int64(c))
7897 return true
7898 }
7899 return false
7900 }
7901 func rewriteValuegeneric_OpCvt64to32F(v *Value) bool {
7902 v_0 := v.Args[0]
7903
7904
7905 for {
7906 if v_0.Op != OpConst64 {
7907 break
7908 }
7909 c := auxIntToInt64(v_0.AuxInt)
7910 v.reset(OpConst32F)
7911 v.AuxInt = float32ToAuxInt(float32(c))
7912 return true
7913 }
7914 return false
7915 }
7916 func rewriteValuegeneric_OpCvt64to64F(v *Value) bool {
7917 v_0 := v.Args[0]
7918
7919
7920 for {
7921 if v_0.Op != OpConst64 {
7922 break
7923 }
7924 c := auxIntToInt64(v_0.AuxInt)
7925 v.reset(OpConst64F)
7926 v.AuxInt = float64ToAuxInt(float64(c))
7927 return true
7928 }
7929 return false
7930 }
7931 func rewriteValuegeneric_OpCvtBoolToUint8(v *Value) bool {
7932 v_0 := v.Args[0]
7933
7934
7935 for {
7936 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
7937 break
7938 }
7939 v.reset(OpConst8)
7940 v.AuxInt = int8ToAuxInt(0)
7941 return true
7942 }
7943
7944
7945 for {
7946 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
7947 break
7948 }
7949 v.reset(OpConst8)
7950 v.AuxInt = int8ToAuxInt(1)
7951 return true
7952 }
7953 return false
7954 }
7955 func rewriteValuegeneric_OpDiv128u(v *Value) bool {
7956 v_2 := v.Args[2]
7957 v_1 := v.Args[1]
7958 v_0 := v.Args[0]
7959 b := v.Block
7960
7961
7962 for {
7963 t := v.Type
7964 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
7965 break
7966 }
7967 lo := v_1
7968 y := v_2
7969 v.reset(OpMakeTuple)
7970 v0 := b.NewValue0(v.Pos, OpDiv64u, t.FieldType(0))
7971 v0.AddArg2(lo, y)
7972 v1 := b.NewValue0(v.Pos, OpMod64u, t.FieldType(1))
7973 v1.AddArg2(lo, y)
7974 v.AddArg2(v0, v1)
7975 return true
7976 }
7977 return false
7978 }
7979 func rewriteValuegeneric_OpDiv16(v *Value) bool {
7980 v_1 := v.Args[1]
7981 v_0 := v.Args[0]
7982 b := v.Block
7983 typ := &b.Func.Config.Types
7984
7985
7986
7987 for {
7988 if v_0.Op != OpConst16 {
7989 break
7990 }
7991 c := auxIntToInt16(v_0.AuxInt)
7992 if v_1.Op != OpConst16 {
7993 break
7994 }
7995 d := auxIntToInt16(v_1.AuxInt)
7996 if !(d != 0) {
7997 break
7998 }
7999 v.reset(OpConst16)
8000 v.AuxInt = int16ToAuxInt(c / d)
8001 return true
8002 }
8003
8004
8005
8006 for {
8007 t := v.Type
8008 n := v_0
8009 if v_1.Op != OpConst16 {
8010 break
8011 }
8012 c := auxIntToInt16(v_1.AuxInt)
8013 if !(c < 0 && c != -1<<15) {
8014 break
8015 }
8016 v.reset(OpNeg16)
8017 v0 := b.NewValue0(v.Pos, OpDiv16, t)
8018 v1 := b.NewValue0(v.Pos, OpConst16, t)
8019 v1.AuxInt = int16ToAuxInt(-c)
8020 v0.AddArg2(n, v1)
8021 v.AddArg(v0)
8022 return true
8023 }
8024
8025
8026 for {
8027 t := v.Type
8028 x := v_0
8029 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != -1<<15 {
8030 break
8031 }
8032 v.reset(OpRsh16Ux64)
8033 v0 := b.NewValue0(v.Pos, OpAnd16, t)
8034 v1 := b.NewValue0(v.Pos, OpNeg16, t)
8035 v1.AddArg(x)
8036 v0.AddArg2(x, v1)
8037 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8038 v2.AuxInt = int64ToAuxInt(15)
8039 v.AddArg2(v0, v2)
8040 return true
8041 }
8042 return false
8043 }
8044 func rewriteValuegeneric_OpDiv16u(v *Value) bool {
8045 v_1 := v.Args[1]
8046 v_0 := v.Args[0]
8047 b := v.Block
8048 typ := &b.Func.Config.Types
8049
8050
8051
8052 for {
8053 if v_0.Op != OpConst16 {
8054 break
8055 }
8056 c := auxIntToInt16(v_0.AuxInt)
8057 if v_1.Op != OpConst16 {
8058 break
8059 }
8060 d := auxIntToInt16(v_1.AuxInt)
8061 if !(d != 0) {
8062 break
8063 }
8064 v.reset(OpConst16)
8065 v.AuxInt = int16ToAuxInt(int16(uint16(c) / uint16(d)))
8066 return true
8067 }
8068
8069
8070
8071 for {
8072 n := v_0
8073 if v_1.Op != OpConst16 {
8074 break
8075 }
8076 c := auxIntToInt16(v_1.AuxInt)
8077 if !(isPowerOfTwo(uint16(c))) {
8078 break
8079 }
8080 v.reset(OpRsh16Ux64)
8081 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8082 v0.AuxInt = int64ToAuxInt(log16u(uint16(c)))
8083 v.AddArg2(n, v0)
8084 return true
8085 }
8086 return false
8087 }
8088 func rewriteValuegeneric_OpDiv32(v *Value) bool {
8089 v_1 := v.Args[1]
8090 v_0 := v.Args[0]
8091 b := v.Block
8092 typ := &b.Func.Config.Types
8093
8094
8095
8096 for {
8097 if v_0.Op != OpConst32 {
8098 break
8099 }
8100 c := auxIntToInt32(v_0.AuxInt)
8101 if v_1.Op != OpConst32 {
8102 break
8103 }
8104 d := auxIntToInt32(v_1.AuxInt)
8105 if !(d != 0) {
8106 break
8107 }
8108 v.reset(OpConst32)
8109 v.AuxInt = int32ToAuxInt(c / d)
8110 return true
8111 }
8112
8113
8114
8115 for {
8116 t := v.Type
8117 n := v_0
8118 if v_1.Op != OpConst32 {
8119 break
8120 }
8121 c := auxIntToInt32(v_1.AuxInt)
8122 if !(c < 0 && c != -1<<31) {
8123 break
8124 }
8125 v.reset(OpNeg32)
8126 v0 := b.NewValue0(v.Pos, OpDiv32, t)
8127 v1 := b.NewValue0(v.Pos, OpConst32, t)
8128 v1.AuxInt = int32ToAuxInt(-c)
8129 v0.AddArg2(n, v1)
8130 v.AddArg(v0)
8131 return true
8132 }
8133
8134
8135 for {
8136 t := v.Type
8137 x := v_0
8138 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != -1<<31 {
8139 break
8140 }
8141 v.reset(OpRsh32Ux64)
8142 v0 := b.NewValue0(v.Pos, OpAnd32, t)
8143 v1 := b.NewValue0(v.Pos, OpNeg32, t)
8144 v1.AddArg(x)
8145 v0.AddArg2(x, v1)
8146 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8147 v2.AuxInt = int64ToAuxInt(31)
8148 v.AddArg2(v0, v2)
8149 return true
8150 }
8151 return false
8152 }
8153 func rewriteValuegeneric_OpDiv32F(v *Value) bool {
8154 v_1 := v.Args[1]
8155 v_0 := v.Args[0]
8156 b := v.Block
8157
8158
8159
8160 for {
8161 if v_0.Op != OpConst32F {
8162 break
8163 }
8164 c := auxIntToFloat32(v_0.AuxInt)
8165 if v_1.Op != OpConst32F {
8166 break
8167 }
8168 d := auxIntToFloat32(v_1.AuxInt)
8169 if !(c/d == c/d) {
8170 break
8171 }
8172 v.reset(OpConst32F)
8173 v.AuxInt = float32ToAuxInt(c / d)
8174 return true
8175 }
8176
8177
8178
8179 for {
8180 x := v_0
8181 if v_1.Op != OpConst32F {
8182 break
8183 }
8184 t := v_1.Type
8185 c := auxIntToFloat32(v_1.AuxInt)
8186 if !(reciprocalExact32(c)) {
8187 break
8188 }
8189 v.reset(OpMul32F)
8190 v0 := b.NewValue0(v.Pos, OpConst32F, t)
8191 v0.AuxInt = float32ToAuxInt(1 / c)
8192 v.AddArg2(x, v0)
8193 return true
8194 }
8195 return false
8196 }
8197 func rewriteValuegeneric_OpDiv32u(v *Value) bool {
8198 v_1 := v.Args[1]
8199 v_0 := v.Args[0]
8200 b := v.Block
8201 typ := &b.Func.Config.Types
8202
8203
8204
8205 for {
8206 if v_0.Op != OpConst32 {
8207 break
8208 }
8209 c := auxIntToInt32(v_0.AuxInt)
8210 if v_1.Op != OpConst32 {
8211 break
8212 }
8213 d := auxIntToInt32(v_1.AuxInt)
8214 if !(d != 0) {
8215 break
8216 }
8217 v.reset(OpConst32)
8218 v.AuxInt = int32ToAuxInt(int32(uint32(c) / uint32(d)))
8219 return true
8220 }
8221
8222
8223
8224 for {
8225 n := v_0
8226 if v_1.Op != OpConst32 {
8227 break
8228 }
8229 c := auxIntToInt32(v_1.AuxInt)
8230 if !(isPowerOfTwo(uint32(c))) {
8231 break
8232 }
8233 v.reset(OpRsh32Ux64)
8234 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8235 v0.AuxInt = int64ToAuxInt(log32u(uint32(c)))
8236 v.AddArg2(n, v0)
8237 return true
8238 }
8239 return false
8240 }
8241 func rewriteValuegeneric_OpDiv64(v *Value) bool {
8242 v_1 := v.Args[1]
8243 v_0 := v.Args[0]
8244 b := v.Block
8245 typ := &b.Func.Config.Types
8246
8247
8248
8249 for {
8250 if v_0.Op != OpConst64 {
8251 break
8252 }
8253 c := auxIntToInt64(v_0.AuxInt)
8254 if v_1.Op != OpConst64 {
8255 break
8256 }
8257 d := auxIntToInt64(v_1.AuxInt)
8258 if !(d != 0) {
8259 break
8260 }
8261 v.reset(OpConst64)
8262 v.AuxInt = int64ToAuxInt(c / d)
8263 return true
8264 }
8265
8266
8267
8268 for {
8269 t := v.Type
8270 n := v_0
8271 if v_1.Op != OpConst64 {
8272 break
8273 }
8274 c := auxIntToInt64(v_1.AuxInt)
8275 if !(c < 0 && c != -1<<63) {
8276 break
8277 }
8278 v.reset(OpNeg64)
8279 v0 := b.NewValue0(v.Pos, OpDiv64, t)
8280 v1 := b.NewValue0(v.Pos, OpConst64, t)
8281 v1.AuxInt = int64ToAuxInt(-c)
8282 v0.AddArg2(n, v1)
8283 v.AddArg(v0)
8284 return true
8285 }
8286
8287
8288
8289 for {
8290 x := v_0
8291 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 || !(isNonNegative(x)) {
8292 break
8293 }
8294 v.reset(OpConst64)
8295 v.AuxInt = int64ToAuxInt(0)
8296 return true
8297 }
8298
8299
8300 for {
8301 t := v.Type
8302 x := v_0
8303 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 {
8304 break
8305 }
8306 v.reset(OpRsh64Ux64)
8307 v0 := b.NewValue0(v.Pos, OpAnd64, t)
8308 v1 := b.NewValue0(v.Pos, OpNeg64, t)
8309 v1.AddArg(x)
8310 v0.AddArg2(x, v1)
8311 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8312 v2.AuxInt = int64ToAuxInt(63)
8313 v.AddArg2(v0, v2)
8314 return true
8315 }
8316 return false
8317 }
8318 func rewriteValuegeneric_OpDiv64F(v *Value) bool {
8319 v_1 := v.Args[1]
8320 v_0 := v.Args[0]
8321 b := v.Block
8322
8323
8324
8325 for {
8326 if v_0.Op != OpConst64F {
8327 break
8328 }
8329 c := auxIntToFloat64(v_0.AuxInt)
8330 if v_1.Op != OpConst64F {
8331 break
8332 }
8333 d := auxIntToFloat64(v_1.AuxInt)
8334 if !(c/d == c/d) {
8335 break
8336 }
8337 v.reset(OpConst64F)
8338 v.AuxInt = float64ToAuxInt(c / d)
8339 return true
8340 }
8341
8342
8343
8344 for {
8345 x := v_0
8346 if v_1.Op != OpConst64F {
8347 break
8348 }
8349 t := v_1.Type
8350 c := auxIntToFloat64(v_1.AuxInt)
8351 if !(reciprocalExact64(c)) {
8352 break
8353 }
8354 v.reset(OpMul64F)
8355 v0 := b.NewValue0(v.Pos, OpConst64F, t)
8356 v0.AuxInt = float64ToAuxInt(1 / c)
8357 v.AddArg2(x, v0)
8358 return true
8359 }
8360 return false
8361 }
8362 func rewriteValuegeneric_OpDiv64u(v *Value) bool {
8363 v_1 := v.Args[1]
8364 v_0 := v.Args[0]
8365 b := v.Block
8366 typ := &b.Func.Config.Types
8367
8368
8369
8370 for {
8371 if v_0.Op != OpConst64 {
8372 break
8373 }
8374 c := auxIntToInt64(v_0.AuxInt)
8375 if v_1.Op != OpConst64 {
8376 break
8377 }
8378 d := auxIntToInt64(v_1.AuxInt)
8379 if !(d != 0) {
8380 break
8381 }
8382 v.reset(OpConst64)
8383 v.AuxInt = int64ToAuxInt(int64(uint64(c) / uint64(d)))
8384 return true
8385 }
8386
8387
8388
8389 for {
8390 n := v_0
8391 if v_1.Op != OpConst64 {
8392 break
8393 }
8394 c := auxIntToInt64(v_1.AuxInt)
8395 if !(isPowerOfTwo(uint64(c))) {
8396 break
8397 }
8398 v.reset(OpRsh64Ux64)
8399 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8400 v0.AuxInt = int64ToAuxInt(log64u(uint64(c)))
8401 v.AddArg2(n, v0)
8402 return true
8403 }
8404 return false
8405 }
8406 func rewriteValuegeneric_OpDiv8(v *Value) bool {
8407 v_1 := v.Args[1]
8408 v_0 := v.Args[0]
8409 b := v.Block
8410 typ := &b.Func.Config.Types
8411
8412
8413
8414 for {
8415 if v_0.Op != OpConst8 {
8416 break
8417 }
8418 c := auxIntToInt8(v_0.AuxInt)
8419 if v_1.Op != OpConst8 {
8420 break
8421 }
8422 d := auxIntToInt8(v_1.AuxInt)
8423 if !(d != 0) {
8424 break
8425 }
8426 v.reset(OpConst8)
8427 v.AuxInt = int8ToAuxInt(c / d)
8428 return true
8429 }
8430
8431
8432
8433 for {
8434 t := v.Type
8435 n := v_0
8436 if v_1.Op != OpConst8 {
8437 break
8438 }
8439 c := auxIntToInt8(v_1.AuxInt)
8440 if !(c < 0 && c != -1<<7) {
8441 break
8442 }
8443 v.reset(OpNeg8)
8444 v0 := b.NewValue0(v.Pos, OpDiv8, t)
8445 v1 := b.NewValue0(v.Pos, OpConst8, t)
8446 v1.AuxInt = int8ToAuxInt(-c)
8447 v0.AddArg2(n, v1)
8448 v.AddArg(v0)
8449 return true
8450 }
8451
8452
8453 for {
8454 t := v.Type
8455 x := v_0
8456 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != -1<<7 {
8457 break
8458 }
8459 v.reset(OpRsh8Ux64)
8460 v0 := b.NewValue0(v.Pos, OpAnd8, t)
8461 v1 := b.NewValue0(v.Pos, OpNeg8, t)
8462 v1.AddArg(x)
8463 v0.AddArg2(x, v1)
8464 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8465 v2.AuxInt = int64ToAuxInt(7)
8466 v.AddArg2(v0, v2)
8467 return true
8468 }
8469 return false
8470 }
8471 func rewriteValuegeneric_OpDiv8u(v *Value) bool {
8472 v_1 := v.Args[1]
8473 v_0 := v.Args[0]
8474 b := v.Block
8475 typ := &b.Func.Config.Types
8476
8477
8478
8479 for {
8480 if v_0.Op != OpConst8 {
8481 break
8482 }
8483 c := auxIntToInt8(v_0.AuxInt)
8484 if v_1.Op != OpConst8 {
8485 break
8486 }
8487 d := auxIntToInt8(v_1.AuxInt)
8488 if !(d != 0) {
8489 break
8490 }
8491 v.reset(OpConst8)
8492 v.AuxInt = int8ToAuxInt(int8(uint8(c) / uint8(d)))
8493 return true
8494 }
8495
8496
8497
8498 for {
8499 n := v_0
8500 if v_1.Op != OpConst8 {
8501 break
8502 }
8503 c := auxIntToInt8(v_1.AuxInt)
8504 if !(isPowerOfTwo(uint8(c))) {
8505 break
8506 }
8507 v.reset(OpRsh8Ux64)
8508 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8509 v0.AuxInt = int64ToAuxInt(log8u(uint8(c)))
8510 v.AddArg2(n, v0)
8511 return true
8512 }
8513 return false
8514 }
8515 func rewriteValuegeneric_OpEq16(v *Value) bool {
8516 v_1 := v.Args[1]
8517 v_0 := v.Args[0]
8518 b := v.Block
8519 config := b.Func.Config
8520 typ := &b.Func.Config.Types
8521
8522
8523 for {
8524 x := v_0
8525 if x != v_1 {
8526 break
8527 }
8528 v.reset(OpConstBool)
8529 v.AuxInt = boolToAuxInt(true)
8530 return true
8531 }
8532
8533
8534 for {
8535 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8536 if v_0.Op != OpConst16 {
8537 continue
8538 }
8539 t := v_0.Type
8540 c := auxIntToInt16(v_0.AuxInt)
8541 if v_1.Op != OpAdd16 {
8542 continue
8543 }
8544 _ = v_1.Args[1]
8545 v_1_0 := v_1.Args[0]
8546 v_1_1 := v_1.Args[1]
8547 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8548 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
8549 continue
8550 }
8551 d := auxIntToInt16(v_1_0.AuxInt)
8552 x := v_1_1
8553 v.reset(OpEq16)
8554 v0 := b.NewValue0(v.Pos, OpConst16, t)
8555 v0.AuxInt = int16ToAuxInt(c - d)
8556 v.AddArg2(v0, x)
8557 return true
8558 }
8559 }
8560 break
8561 }
8562
8563
8564 for {
8565 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8566 if v_0.Op != OpConst16 {
8567 continue
8568 }
8569 c := auxIntToInt16(v_0.AuxInt)
8570 if v_1.Op != OpConst16 {
8571 continue
8572 }
8573 d := auxIntToInt16(v_1.AuxInt)
8574 v.reset(OpConstBool)
8575 v.AuxInt = boolToAuxInt(c == d)
8576 return true
8577 }
8578 break
8579 }
8580
8581
8582
8583 for {
8584 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8585 if v_0.Op != OpMod16u {
8586 continue
8587 }
8588 _ = v_0.Args[1]
8589 x := v_0.Args[0]
8590 v_0_1 := v_0.Args[1]
8591 if v_0_1.Op != OpConst16 {
8592 continue
8593 }
8594 c := auxIntToInt16(v_0_1.AuxInt)
8595 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(x.Op != OpConst16 && udivisibleOK16(c) && !hasSmallRotate(config)) {
8596 continue
8597 }
8598 v.reset(OpEq32)
8599 v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32)
8600 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
8601 v1.AddArg(x)
8602 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8603 v2.AuxInt = int32ToAuxInt(int32(uint16(c)))
8604 v0.AddArg2(v1, v2)
8605 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8606 v3.AuxInt = int32ToAuxInt(0)
8607 v.AddArg2(v0, v3)
8608 return true
8609 }
8610 break
8611 }
8612
8613
8614
8615 for {
8616 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8617 if v_0.Op != OpMod16 {
8618 continue
8619 }
8620 _ = v_0.Args[1]
8621 x := v_0.Args[0]
8622 v_0_1 := v_0.Args[1]
8623 if v_0_1.Op != OpConst16 {
8624 continue
8625 }
8626 c := auxIntToInt16(v_0_1.AuxInt)
8627 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(x.Op != OpConst16 && sdivisibleOK16(c) && !hasSmallRotate(config)) {
8628 continue
8629 }
8630 v.reset(OpEq32)
8631 v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32)
8632 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
8633 v1.AddArg(x)
8634 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
8635 v2.AuxInt = int32ToAuxInt(int32(c))
8636 v0.AddArg2(v1, v2)
8637 v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
8638 v3.AuxInt = int32ToAuxInt(0)
8639 v.AddArg2(v0, v3)
8640 return true
8641 }
8642 break
8643 }
8644
8645
8646
8647 for {
8648 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8649 s := v_0
8650 if s.Op != OpSub16 {
8651 continue
8652 }
8653 y := s.Args[1]
8654 x := s.Args[0]
8655 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(s.Uses == 1) {
8656 continue
8657 }
8658 v.reset(OpEq16)
8659 v.AddArg2(x, y)
8660 return true
8661 }
8662 break
8663 }
8664
8665
8666
8667 for {
8668 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8669 if v_0.Op != OpAnd16 {
8670 continue
8671 }
8672 t := v_0.Type
8673 _ = v_0.Args[1]
8674 v_0_0 := v_0.Args[0]
8675 v_0_1 := v_0.Args[1]
8676 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
8677 x := v_0_0
8678 if v_0_1.Op != OpConst16 || v_0_1.Type != t {
8679 continue
8680 }
8681 y := auxIntToInt16(v_0_1.AuxInt)
8682 if v_1.Op != OpConst16 || v_1.Type != t || auxIntToInt16(v_1.AuxInt) != y || !(oneBit(y)) {
8683 continue
8684 }
8685 v.reset(OpNeq16)
8686 v0 := b.NewValue0(v.Pos, OpAnd16, t)
8687 v1 := b.NewValue0(v.Pos, OpConst16, t)
8688 v1.AuxInt = int16ToAuxInt(y)
8689 v0.AddArg2(x, v1)
8690 v2 := b.NewValue0(v.Pos, OpConst16, t)
8691 v2.AuxInt = int16ToAuxInt(0)
8692 v.AddArg2(v0, v2)
8693 return true
8694 }
8695 }
8696 break
8697 }
8698
8699
8700 for {
8701 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8702 if v_0.Op != OpZeroExt8to16 {
8703 continue
8704 }
8705 v_0_0 := v_0.Args[0]
8706 if v_0_0.Op != OpCvtBoolToUint8 {
8707 continue
8708 }
8709 x := v_0_0.Args[0]
8710 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
8711 continue
8712 }
8713 v.copyOf(x)
8714 return true
8715 }
8716 break
8717 }
8718
8719
8720 for {
8721 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8722 if v_0.Op != OpZeroExt8to16 {
8723 continue
8724 }
8725 v_0_0 := v_0.Args[0]
8726 if v_0_0.Op != OpCvtBoolToUint8 {
8727 continue
8728 }
8729 x := v_0_0.Args[0]
8730 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
8731 continue
8732 }
8733 v.reset(OpNot)
8734 v.AddArg(x)
8735 return true
8736 }
8737 break
8738 }
8739
8740
8741 for {
8742 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8743 if v_0.Op != OpSignExt8to16 {
8744 continue
8745 }
8746 v_0_0 := v_0.Args[0]
8747 if v_0_0.Op != OpCvtBoolToUint8 {
8748 continue
8749 }
8750 x := v_0_0.Args[0]
8751 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
8752 continue
8753 }
8754 v.copyOf(x)
8755 return true
8756 }
8757 break
8758 }
8759
8760
8761 for {
8762 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8763 if v_0.Op != OpSignExt8to16 {
8764 continue
8765 }
8766 v_0_0 := v_0.Args[0]
8767 if v_0_0.Op != OpCvtBoolToUint8 {
8768 continue
8769 }
8770 x := v_0_0.Args[0]
8771 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
8772 continue
8773 }
8774 v.reset(OpNot)
8775 v.AddArg(x)
8776 return true
8777 }
8778 break
8779 }
8780 return false
8781 }
8782 func rewriteValuegeneric_OpEq32(v *Value) bool {
8783 v_1 := v.Args[1]
8784 v_0 := v.Args[0]
8785 b := v.Block
8786
8787
8788 for {
8789 x := v_0
8790 if x != v_1 {
8791 break
8792 }
8793 v.reset(OpConstBool)
8794 v.AuxInt = boolToAuxInt(true)
8795 return true
8796 }
8797
8798
8799 for {
8800 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8801 if v_0.Op != OpConst32 {
8802 continue
8803 }
8804 t := v_0.Type
8805 c := auxIntToInt32(v_0.AuxInt)
8806 if v_1.Op != OpAdd32 {
8807 continue
8808 }
8809 _ = v_1.Args[1]
8810 v_1_0 := v_1.Args[0]
8811 v_1_1 := v_1.Args[1]
8812 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8813 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
8814 continue
8815 }
8816 d := auxIntToInt32(v_1_0.AuxInt)
8817 x := v_1_1
8818 v.reset(OpEq32)
8819 v0 := b.NewValue0(v.Pos, OpConst32, t)
8820 v0.AuxInt = int32ToAuxInt(c - d)
8821 v.AddArg2(v0, x)
8822 return true
8823 }
8824 }
8825 break
8826 }
8827
8828
8829 for {
8830 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8831 if v_0.Op != OpConst32 {
8832 continue
8833 }
8834 c := auxIntToInt32(v_0.AuxInt)
8835 if v_1.Op != OpConst32 {
8836 continue
8837 }
8838 d := auxIntToInt32(v_1.AuxInt)
8839 v.reset(OpConstBool)
8840 v.AuxInt = boolToAuxInt(c == d)
8841 return true
8842 }
8843 break
8844 }
8845
8846
8847
8848 for {
8849 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8850 s := v_0
8851 if s.Op != OpSub32 {
8852 continue
8853 }
8854 y := s.Args[1]
8855 x := s.Args[0]
8856 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 || !(s.Uses == 1) {
8857 continue
8858 }
8859 v.reset(OpEq32)
8860 v.AddArg2(x, y)
8861 return true
8862 }
8863 break
8864 }
8865
8866
8867
8868 for {
8869 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8870 if v_0.Op != OpAnd32 {
8871 continue
8872 }
8873 t := v_0.Type
8874 _ = v_0.Args[1]
8875 v_0_0 := v_0.Args[0]
8876 v_0_1 := v_0.Args[1]
8877 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
8878 x := v_0_0
8879 if v_0_1.Op != OpConst32 || v_0_1.Type != t {
8880 continue
8881 }
8882 y := auxIntToInt32(v_0_1.AuxInt)
8883 if v_1.Op != OpConst32 || v_1.Type != t || auxIntToInt32(v_1.AuxInt) != y || !(oneBit(y)) {
8884 continue
8885 }
8886 v.reset(OpNeq32)
8887 v0 := b.NewValue0(v.Pos, OpAnd32, t)
8888 v1 := b.NewValue0(v.Pos, OpConst32, t)
8889 v1.AuxInt = int32ToAuxInt(y)
8890 v0.AddArg2(x, v1)
8891 v2 := b.NewValue0(v.Pos, OpConst32, t)
8892 v2.AuxInt = int32ToAuxInt(0)
8893 v.AddArg2(v0, v2)
8894 return true
8895 }
8896 }
8897 break
8898 }
8899
8900
8901 for {
8902 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8903 if v_0.Op != OpZeroExt8to32 {
8904 continue
8905 }
8906 v_0_0 := v_0.Args[0]
8907 if v_0_0.Op != OpCvtBoolToUint8 {
8908 continue
8909 }
8910 x := v_0_0.Args[0]
8911 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
8912 continue
8913 }
8914 v.copyOf(x)
8915 return true
8916 }
8917 break
8918 }
8919
8920
8921 for {
8922 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8923 if v_0.Op != OpZeroExt8to32 {
8924 continue
8925 }
8926 v_0_0 := v_0.Args[0]
8927 if v_0_0.Op != OpCvtBoolToUint8 {
8928 continue
8929 }
8930 x := v_0_0.Args[0]
8931 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
8932 continue
8933 }
8934 v.reset(OpNot)
8935 v.AddArg(x)
8936 return true
8937 }
8938 break
8939 }
8940
8941
8942 for {
8943 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8944 if v_0.Op != OpSignExt8to32 {
8945 continue
8946 }
8947 v_0_0 := v_0.Args[0]
8948 if v_0_0.Op != OpCvtBoolToUint8 {
8949 continue
8950 }
8951 x := v_0_0.Args[0]
8952 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
8953 continue
8954 }
8955 v.copyOf(x)
8956 return true
8957 }
8958 break
8959 }
8960
8961
8962 for {
8963 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8964 if v_0.Op != OpSignExt8to32 {
8965 continue
8966 }
8967 v_0_0 := v_0.Args[0]
8968 if v_0_0.Op != OpCvtBoolToUint8 {
8969 continue
8970 }
8971 x := v_0_0.Args[0]
8972 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
8973 continue
8974 }
8975 v.reset(OpNot)
8976 v.AddArg(x)
8977 return true
8978 }
8979 break
8980 }
8981 return false
8982 }
8983 func rewriteValuegeneric_OpEq32F(v *Value) bool {
8984 v_1 := v.Args[1]
8985 v_0 := v.Args[0]
8986
8987
8988 for {
8989 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8990 if v_0.Op != OpConst32F {
8991 continue
8992 }
8993 c := auxIntToFloat32(v_0.AuxInt)
8994 if v_1.Op != OpConst32F {
8995 continue
8996 }
8997 d := auxIntToFloat32(v_1.AuxInt)
8998 v.reset(OpConstBool)
8999 v.AuxInt = boolToAuxInt(c == d)
9000 return true
9001 }
9002 break
9003 }
9004 return false
9005 }
9006 func rewriteValuegeneric_OpEq64(v *Value) bool {
9007 v_1 := v.Args[1]
9008 v_0 := v.Args[0]
9009 b := v.Block
9010
9011
9012 for {
9013 x := v_0
9014 if x != v_1 {
9015 break
9016 }
9017 v.reset(OpConstBool)
9018 v.AuxInt = boolToAuxInt(true)
9019 return true
9020 }
9021
9022
9023 for {
9024 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9025 if v_0.Op != OpConst64 {
9026 continue
9027 }
9028 t := v_0.Type
9029 c := auxIntToInt64(v_0.AuxInt)
9030 if v_1.Op != OpAdd64 {
9031 continue
9032 }
9033 _ = v_1.Args[1]
9034 v_1_0 := v_1.Args[0]
9035 v_1_1 := v_1.Args[1]
9036 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
9037 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
9038 continue
9039 }
9040 d := auxIntToInt64(v_1_0.AuxInt)
9041 x := v_1_1
9042 v.reset(OpEq64)
9043 v0 := b.NewValue0(v.Pos, OpConst64, t)
9044 v0.AuxInt = int64ToAuxInt(c - d)
9045 v.AddArg2(v0, x)
9046 return true
9047 }
9048 }
9049 break
9050 }
9051
9052
9053 for {
9054 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9055 if v_0.Op != OpConst64 {
9056 continue
9057 }
9058 c := auxIntToInt64(v_0.AuxInt)
9059 if v_1.Op != OpConst64 {
9060 continue
9061 }
9062 d := auxIntToInt64(v_1.AuxInt)
9063 v.reset(OpConstBool)
9064 v.AuxInt = boolToAuxInt(c == d)
9065 return true
9066 }
9067 break
9068 }
9069
9070
9071
9072 for {
9073 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9074 s := v_0
9075 if s.Op != OpSub64 {
9076 continue
9077 }
9078 y := s.Args[1]
9079 x := s.Args[0]
9080 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 || !(s.Uses == 1) {
9081 continue
9082 }
9083 v.reset(OpEq64)
9084 v.AddArg2(x, y)
9085 return true
9086 }
9087 break
9088 }
9089
9090
9091
9092 for {
9093 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9094 if v_0.Op != OpAnd64 {
9095 continue
9096 }
9097 t := v_0.Type
9098 _ = v_0.Args[1]
9099 v_0_0 := v_0.Args[0]
9100 v_0_1 := v_0.Args[1]
9101 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
9102 x := v_0_0
9103 if v_0_1.Op != OpConst64 || v_0_1.Type != t {
9104 continue
9105 }
9106 y := auxIntToInt64(v_0_1.AuxInt)
9107 if v_1.Op != OpConst64 || v_1.Type != t || auxIntToInt64(v_1.AuxInt) != y || !(oneBit(y)) {
9108 continue
9109 }
9110 v.reset(OpNeq64)
9111 v0 := b.NewValue0(v.Pos, OpAnd64, t)
9112 v1 := b.NewValue0(v.Pos, OpConst64, t)
9113 v1.AuxInt = int64ToAuxInt(y)
9114 v0.AddArg2(x, v1)
9115 v2 := b.NewValue0(v.Pos, OpConst64, t)
9116 v2.AuxInt = int64ToAuxInt(0)
9117 v.AddArg2(v0, v2)
9118 return true
9119 }
9120 }
9121 break
9122 }
9123
9124
9125 for {
9126 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9127 if v_0.Op != OpZeroExt8to64 {
9128 continue
9129 }
9130 v_0_0 := v_0.Args[0]
9131 if v_0_0.Op != OpCvtBoolToUint8 {
9132 continue
9133 }
9134 x := v_0_0.Args[0]
9135 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
9136 continue
9137 }
9138 v.copyOf(x)
9139 return true
9140 }
9141 break
9142 }
9143
9144
9145 for {
9146 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9147 if v_0.Op != OpZeroExt8to64 {
9148 continue
9149 }
9150 v_0_0 := v_0.Args[0]
9151 if v_0_0.Op != OpCvtBoolToUint8 {
9152 continue
9153 }
9154 x := v_0_0.Args[0]
9155 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
9156 continue
9157 }
9158 v.reset(OpNot)
9159 v.AddArg(x)
9160 return true
9161 }
9162 break
9163 }
9164
9165
9166 for {
9167 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9168 if v_0.Op != OpSignExt8to64 {
9169 continue
9170 }
9171 v_0_0 := v_0.Args[0]
9172 if v_0_0.Op != OpCvtBoolToUint8 {
9173 continue
9174 }
9175 x := v_0_0.Args[0]
9176 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
9177 continue
9178 }
9179 v.copyOf(x)
9180 return true
9181 }
9182 break
9183 }
9184
9185
9186 for {
9187 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9188 if v_0.Op != OpSignExt8to64 {
9189 continue
9190 }
9191 v_0_0 := v_0.Args[0]
9192 if v_0_0.Op != OpCvtBoolToUint8 {
9193 continue
9194 }
9195 x := v_0_0.Args[0]
9196 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
9197 continue
9198 }
9199 v.reset(OpNot)
9200 v.AddArg(x)
9201 return true
9202 }
9203 break
9204 }
9205 return false
9206 }
9207 func rewriteValuegeneric_OpEq64F(v *Value) bool {
9208 v_1 := v.Args[1]
9209 v_0 := v.Args[0]
9210
9211
9212 for {
9213 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9214 if v_0.Op != OpConst64F {
9215 continue
9216 }
9217 c := auxIntToFloat64(v_0.AuxInt)
9218 if v_1.Op != OpConst64F {
9219 continue
9220 }
9221 d := auxIntToFloat64(v_1.AuxInt)
9222 v.reset(OpConstBool)
9223 v.AuxInt = boolToAuxInt(c == d)
9224 return true
9225 }
9226 break
9227 }
9228 return false
9229 }
9230 func rewriteValuegeneric_OpEq8(v *Value) bool {
9231 v_1 := v.Args[1]
9232 v_0 := v.Args[0]
9233 b := v.Block
9234 config := b.Func.Config
9235 typ := &b.Func.Config.Types
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 != OpConst8 {
9252 continue
9253 }
9254 t := v_0.Type
9255 c := auxIntToInt8(v_0.AuxInt)
9256 if v_1.Op != OpAdd8 {
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 != OpConst8 || v_1_0.Type != t {
9264 continue
9265 }
9266 d := auxIntToInt8(v_1_0.AuxInt)
9267 x := v_1_1
9268 v.reset(OpEq8)
9269 v0 := b.NewValue0(v.Pos, OpConst8, t)
9270 v0.AuxInt = int8ToAuxInt(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 != OpConst8 {
9282 continue
9283 }
9284 c := auxIntToInt8(v_0.AuxInt)
9285 if v_1.Op != OpConst8 {
9286 continue
9287 }
9288 d := auxIntToInt8(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 if v_0.Op != OpMod8u {
9301 continue
9302 }
9303 _ = v_0.Args[1]
9304 x := v_0.Args[0]
9305 v_0_1 := v_0.Args[1]
9306 if v_0_1.Op != OpConst8 {
9307 continue
9308 }
9309 c := auxIntToInt8(v_0_1.AuxInt)
9310 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(x.Op != OpConst8 && udivisibleOK8(c) && !hasSmallRotate(config)) {
9311 continue
9312 }
9313 v.reset(OpEq32)
9314 v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32)
9315 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
9316 v1.AddArg(x)
9317 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
9318 v2.AuxInt = int32ToAuxInt(int32(uint8(c)))
9319 v0.AddArg2(v1, v2)
9320 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
9321 v3.AuxInt = int32ToAuxInt(0)
9322 v.AddArg2(v0, v3)
9323 return true
9324 }
9325 break
9326 }
9327
9328
9329
9330 for {
9331 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9332 if v_0.Op != OpMod8 {
9333 continue
9334 }
9335 _ = v_0.Args[1]
9336 x := v_0.Args[0]
9337 v_0_1 := v_0.Args[1]
9338 if v_0_1.Op != OpConst8 {
9339 continue
9340 }
9341 c := auxIntToInt8(v_0_1.AuxInt)
9342 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(x.Op != OpConst8 && sdivisibleOK8(c) && !hasSmallRotate(config)) {
9343 continue
9344 }
9345 v.reset(OpEq32)
9346 v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32)
9347 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
9348 v1.AddArg(x)
9349 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
9350 v2.AuxInt = int32ToAuxInt(int32(c))
9351 v0.AddArg2(v1, v2)
9352 v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
9353 v3.AuxInt = int32ToAuxInt(0)
9354 v.AddArg2(v0, v3)
9355 return true
9356 }
9357 break
9358 }
9359
9360
9361
9362 for {
9363 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9364 s := v_0
9365 if s.Op != OpSub8 {
9366 continue
9367 }
9368 y := s.Args[1]
9369 x := s.Args[0]
9370 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(s.Uses == 1) {
9371 continue
9372 }
9373 v.reset(OpEq8)
9374 v.AddArg2(x, y)
9375 return true
9376 }
9377 break
9378 }
9379
9380
9381
9382 for {
9383 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9384 if v_0.Op != OpAnd8 {
9385 continue
9386 }
9387 t := v_0.Type
9388 _ = v_0.Args[1]
9389 v_0_0 := v_0.Args[0]
9390 v_0_1 := v_0.Args[1]
9391 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
9392 x := v_0_0
9393 if v_0_1.Op != OpConst8 || v_0_1.Type != t {
9394 continue
9395 }
9396 y := auxIntToInt8(v_0_1.AuxInt)
9397 if v_1.Op != OpConst8 || v_1.Type != t || auxIntToInt8(v_1.AuxInt) != y || !(oneBit(y)) {
9398 continue
9399 }
9400 v.reset(OpNeq8)
9401 v0 := b.NewValue0(v.Pos, OpAnd8, t)
9402 v1 := b.NewValue0(v.Pos, OpConst8, t)
9403 v1.AuxInt = int8ToAuxInt(y)
9404 v0.AddArg2(x, v1)
9405 v2 := b.NewValue0(v.Pos, OpConst8, t)
9406 v2.AuxInt = int8ToAuxInt(0)
9407 v.AddArg2(v0, v2)
9408 return true
9409 }
9410 }
9411 break
9412 }
9413
9414
9415 for {
9416 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9417 if v_0.Op != OpCvtBoolToUint8 {
9418 continue
9419 }
9420 x := v_0.Args[0]
9421 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 1 {
9422 continue
9423 }
9424 v.copyOf(x)
9425 return true
9426 }
9427 break
9428 }
9429
9430
9431 for {
9432 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9433 if v_0.Op != OpCvtBoolToUint8 {
9434 continue
9435 }
9436 x := v_0.Args[0]
9437 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
9438 continue
9439 }
9440 v.reset(OpNot)
9441 v.AddArg(x)
9442 return true
9443 }
9444 break
9445 }
9446 return false
9447 }
9448 func rewriteValuegeneric_OpEqB(v *Value) bool {
9449 v_1 := v.Args[1]
9450 v_0 := v.Args[0]
9451
9452
9453 for {
9454 x := v_0
9455 if x != v_1 {
9456 break
9457 }
9458 v.reset(OpConstBool)
9459 v.AuxInt = boolToAuxInt(true)
9460 return true
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 != OpConstBool {
9467 continue
9468 }
9469 c := auxIntToBool(v_0.AuxInt)
9470 if v_1.Op != OpConstBool {
9471 continue
9472 }
9473 d := auxIntToBool(v_1.AuxInt)
9474 v.reset(OpConstBool)
9475 v.AuxInt = boolToAuxInt(c == d)
9476 return true
9477 }
9478 break
9479 }
9480
9481
9482 for {
9483 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9484 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
9485 continue
9486 }
9487 x := v_1
9488 v.reset(OpNot)
9489 v.AddArg(x)
9490 return true
9491 }
9492 break
9493 }
9494
9495
9496 for {
9497 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9498 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
9499 continue
9500 }
9501 x := v_1
9502 v.copyOf(x)
9503 return true
9504 }
9505 break
9506 }
9507
9508
9509 for {
9510 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9511 if v_0.Op != OpNot {
9512 continue
9513 }
9514 x := v_0.Args[0]
9515 y := v_1
9516 v.reset(OpNeqB)
9517 v.AddArg2(x, y)
9518 return true
9519 }
9520 break
9521 }
9522 return false
9523 }
9524 func rewriteValuegeneric_OpEqInter(v *Value) bool {
9525 v_1 := v.Args[1]
9526 v_0 := v.Args[0]
9527 b := v.Block
9528 typ := &b.Func.Config.Types
9529
9530
9531 for {
9532 x := v_0
9533 y := v_1
9534 v.reset(OpEqPtr)
9535 v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
9536 v0.AddArg(x)
9537 v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
9538 v1.AddArg(y)
9539 v.AddArg2(v0, v1)
9540 return true
9541 }
9542 }
9543 func rewriteValuegeneric_OpEqPtr(v *Value) bool {
9544 v_1 := v.Args[1]
9545 v_0 := v.Args[0]
9546 b := v.Block
9547 typ := &b.Func.Config.Types
9548
9549
9550 for {
9551 x := v_0
9552 if x != v_1 {
9553 break
9554 }
9555 v.reset(OpConstBool)
9556 v.AuxInt = boolToAuxInt(true)
9557 return true
9558 }
9559
9560
9561 for {
9562 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9563 if v_0.Op != OpAddr {
9564 continue
9565 }
9566 x := auxToSym(v_0.Aux)
9567 if v_1.Op != OpAddr {
9568 continue
9569 }
9570 y := auxToSym(v_1.Aux)
9571 v.reset(OpConstBool)
9572 v.AuxInt = boolToAuxInt(x == y)
9573 return true
9574 }
9575 break
9576 }
9577
9578
9579 for {
9580 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9581 if v_0.Op != OpAddr {
9582 continue
9583 }
9584 x := auxToSym(v_0.Aux)
9585 if v_1.Op != OpOffPtr {
9586 continue
9587 }
9588 o := auxIntToInt64(v_1.AuxInt)
9589 v_1_0 := v_1.Args[0]
9590 if v_1_0.Op != OpAddr {
9591 continue
9592 }
9593 y := auxToSym(v_1_0.Aux)
9594 v.reset(OpConstBool)
9595 v.AuxInt = boolToAuxInt(x == y && o == 0)
9596 return true
9597 }
9598 break
9599 }
9600
9601
9602 for {
9603 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9604 if v_0.Op != OpOffPtr {
9605 continue
9606 }
9607 o1 := auxIntToInt64(v_0.AuxInt)
9608 v_0_0 := v_0.Args[0]
9609 if v_0_0.Op != OpAddr {
9610 continue
9611 }
9612 x := auxToSym(v_0_0.Aux)
9613 if v_1.Op != OpOffPtr {
9614 continue
9615 }
9616 o2 := auxIntToInt64(v_1.AuxInt)
9617 v_1_0 := v_1.Args[0]
9618 if v_1_0.Op != OpAddr {
9619 continue
9620 }
9621 y := auxToSym(v_1_0.Aux)
9622 v.reset(OpConstBool)
9623 v.AuxInt = boolToAuxInt(x == y && o1 == o2)
9624 return true
9625 }
9626 break
9627 }
9628
9629
9630 for {
9631 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9632 if v_0.Op != OpLocalAddr {
9633 continue
9634 }
9635 x := auxToSym(v_0.Aux)
9636 if v_1.Op != OpLocalAddr {
9637 continue
9638 }
9639 y := auxToSym(v_1.Aux)
9640 v.reset(OpConstBool)
9641 v.AuxInt = boolToAuxInt(x == y)
9642 return true
9643 }
9644 break
9645 }
9646
9647
9648 for {
9649 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9650 if v_0.Op != OpLocalAddr {
9651 continue
9652 }
9653 x := auxToSym(v_0.Aux)
9654 if v_1.Op != OpOffPtr {
9655 continue
9656 }
9657 o := auxIntToInt64(v_1.AuxInt)
9658 v_1_0 := v_1.Args[0]
9659 if v_1_0.Op != OpLocalAddr {
9660 continue
9661 }
9662 y := auxToSym(v_1_0.Aux)
9663 v.reset(OpConstBool)
9664 v.AuxInt = boolToAuxInt(x == y && o == 0)
9665 return true
9666 }
9667 break
9668 }
9669
9670
9671 for {
9672 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9673 if v_0.Op != OpOffPtr {
9674 continue
9675 }
9676 o1 := auxIntToInt64(v_0.AuxInt)
9677 v_0_0 := v_0.Args[0]
9678 if v_0_0.Op != OpLocalAddr {
9679 continue
9680 }
9681 x := auxToSym(v_0_0.Aux)
9682 if v_1.Op != OpOffPtr {
9683 continue
9684 }
9685 o2 := auxIntToInt64(v_1.AuxInt)
9686 v_1_0 := v_1.Args[0]
9687 if v_1_0.Op != OpLocalAddr {
9688 continue
9689 }
9690 y := auxToSym(v_1_0.Aux)
9691 v.reset(OpConstBool)
9692 v.AuxInt = boolToAuxInt(x == y && o1 == o2)
9693 return true
9694 }
9695 break
9696 }
9697
9698
9699
9700 for {
9701 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9702 if v_0.Op != OpOffPtr {
9703 continue
9704 }
9705 o1 := auxIntToInt64(v_0.AuxInt)
9706 p1 := v_0.Args[0]
9707 p2 := v_1
9708 if !(isSamePtr(p1, p2)) {
9709 continue
9710 }
9711 v.reset(OpConstBool)
9712 v.AuxInt = boolToAuxInt(o1 == 0)
9713 return true
9714 }
9715 break
9716 }
9717
9718
9719
9720 for {
9721 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9722 if v_0.Op != OpOffPtr {
9723 continue
9724 }
9725 o1 := auxIntToInt64(v_0.AuxInt)
9726 p1 := v_0.Args[0]
9727 if v_1.Op != OpOffPtr {
9728 continue
9729 }
9730 o2 := auxIntToInt64(v_1.AuxInt)
9731 p2 := v_1.Args[0]
9732 if !(isSamePtr(p1, p2)) {
9733 continue
9734 }
9735 v.reset(OpConstBool)
9736 v.AuxInt = boolToAuxInt(o1 == o2)
9737 return true
9738 }
9739 break
9740 }
9741
9742
9743 for {
9744 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9745 if v_0.Op != OpConst32 {
9746 continue
9747 }
9748 c := auxIntToInt32(v_0.AuxInt)
9749 if v_1.Op != OpConst32 {
9750 continue
9751 }
9752 d := auxIntToInt32(v_1.AuxInt)
9753 v.reset(OpConstBool)
9754 v.AuxInt = boolToAuxInt(c == d)
9755 return true
9756 }
9757 break
9758 }
9759
9760
9761 for {
9762 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9763 if v_0.Op != OpConst64 {
9764 continue
9765 }
9766 c := auxIntToInt64(v_0.AuxInt)
9767 if v_1.Op != OpConst64 {
9768 continue
9769 }
9770 d := auxIntToInt64(v_1.AuxInt)
9771 v.reset(OpConstBool)
9772 v.AuxInt = boolToAuxInt(c == d)
9773 return true
9774 }
9775 break
9776 }
9777
9778
9779 for {
9780 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9781 if v_0.Op != OpConvert {
9782 continue
9783 }
9784 v_0_0 := v_0.Args[0]
9785 if v_0_0.Op != OpAddr {
9786 continue
9787 }
9788 x := auxToSym(v_0_0.Aux)
9789 if v_1.Op != OpAddr {
9790 continue
9791 }
9792 y := auxToSym(v_1.Aux)
9793 v.reset(OpConstBool)
9794 v.AuxInt = boolToAuxInt(x == y)
9795 return true
9796 }
9797 break
9798 }
9799
9800
9801 for {
9802 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9803 if v_0.Op != OpLocalAddr || v_1.Op != OpAddr {
9804 continue
9805 }
9806 v.reset(OpConstBool)
9807 v.AuxInt = boolToAuxInt(false)
9808 return true
9809 }
9810 break
9811 }
9812
9813
9814 for {
9815 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9816 if v_0.Op != OpOffPtr {
9817 continue
9818 }
9819 v_0_0 := v_0.Args[0]
9820 if v_0_0.Op != OpLocalAddr || v_1.Op != OpAddr {
9821 continue
9822 }
9823 v.reset(OpConstBool)
9824 v.AuxInt = boolToAuxInt(false)
9825 return true
9826 }
9827 break
9828 }
9829
9830
9831 for {
9832 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9833 if v_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
9834 continue
9835 }
9836 v_1_0 := v_1.Args[0]
9837 if v_1_0.Op != OpAddr {
9838 continue
9839 }
9840 v.reset(OpConstBool)
9841 v.AuxInt = boolToAuxInt(false)
9842 return true
9843 }
9844 break
9845 }
9846
9847
9848 for {
9849 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9850 if v_0.Op != OpOffPtr {
9851 continue
9852 }
9853 v_0_0 := v_0.Args[0]
9854 if v_0_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
9855 continue
9856 }
9857 v_1_0 := v_1.Args[0]
9858 if v_1_0.Op != OpAddr {
9859 continue
9860 }
9861 v.reset(OpConstBool)
9862 v.AuxInt = boolToAuxInt(false)
9863 return true
9864 }
9865 break
9866 }
9867
9868
9869
9870 for {
9871 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9872 if v_0.Op != OpAddPtr {
9873 continue
9874 }
9875 o1 := v_0.Args[1]
9876 p1 := v_0.Args[0]
9877 p2 := v_1
9878 if !(isSamePtr(p1, p2)) {
9879 continue
9880 }
9881 v.reset(OpNot)
9882 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
9883 v0.AddArg(o1)
9884 v.AddArg(v0)
9885 return true
9886 }
9887 break
9888 }
9889
9890
9891 for {
9892 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9893 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
9894 continue
9895 }
9896 p := v_1
9897 v.reset(OpNot)
9898 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
9899 v0.AddArg(p)
9900 v.AddArg(v0)
9901 return true
9902 }
9903 break
9904 }
9905
9906
9907 for {
9908 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9909 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
9910 continue
9911 }
9912 p := v_1
9913 v.reset(OpNot)
9914 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
9915 v0.AddArg(p)
9916 v.AddArg(v0)
9917 return true
9918 }
9919 break
9920 }
9921
9922
9923 for {
9924 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9925 if v_0.Op != OpConstNil {
9926 continue
9927 }
9928 p := v_1
9929 v.reset(OpNot)
9930 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
9931 v0.AddArg(p)
9932 v.AddArg(v0)
9933 return true
9934 }
9935 break
9936 }
9937 return false
9938 }
9939 func rewriteValuegeneric_OpEqSlice(v *Value) bool {
9940 v_1 := v.Args[1]
9941 v_0 := v.Args[0]
9942 b := v.Block
9943 typ := &b.Func.Config.Types
9944
9945
9946 for {
9947 x := v_0
9948 y := v_1
9949 v.reset(OpEqPtr)
9950 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
9951 v0.AddArg(x)
9952 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
9953 v1.AddArg(y)
9954 v.AddArg2(v0, v1)
9955 return true
9956 }
9957 }
9958 func rewriteValuegeneric_OpFloor(v *Value) bool {
9959 v_0 := v.Args[0]
9960
9961
9962 for {
9963 if v_0.Op != OpConst64F {
9964 break
9965 }
9966 c := auxIntToFloat64(v_0.AuxInt)
9967 v.reset(OpConst64F)
9968 v.AuxInt = float64ToAuxInt(math.Floor(c))
9969 return true
9970 }
9971 return false
9972 }
9973 func rewriteValuegeneric_OpIMake(v *Value) bool {
9974 v_1 := v.Args[1]
9975 v_0 := v.Args[0]
9976
9977
9978 for {
9979 if v_1.Op != OpStructMake {
9980 break
9981 }
9982 v.copyOf(imakeOfStructMake(v))
9983 return true
9984 }
9985
9986
9987 for {
9988 _typ := v_0
9989 if v_1.Op != OpArrayMake1 {
9990 break
9991 }
9992 val := v_1.Args[0]
9993 v.reset(OpIMake)
9994 v.AddArg2(_typ, val)
9995 return true
9996 }
9997 return false
9998 }
9999 func rewriteValuegeneric_OpInterLECall(v *Value) bool {
10000
10001
10002 for {
10003 if len(v.Args) < 1 {
10004 break
10005 }
10006 v_0 := v.Args[0]
10007 if v_0.Op != OpAddr {
10008 break
10009 }
10010 fn := auxToSym(v_0.Aux)
10011 v_0_0 := v_0.Args[0]
10012 if v_0_0.Op != OpSB {
10013 break
10014 }
10015 v.copyOf(devirtLECall(v, fn.(*obj.LSym)))
10016 return true
10017 }
10018 return false
10019 }
10020 func rewriteValuegeneric_OpIsInBounds(v *Value) bool {
10021 v_1 := v.Args[1]
10022 v_0 := v.Args[0]
10023
10024
10025
10026 for {
10027 if v_0.Op != OpZeroExt8to32 || v_1.Op != OpConst32 {
10028 break
10029 }
10030 c := auxIntToInt32(v_1.AuxInt)
10031 if !((1 << 8) <= c) {
10032 break
10033 }
10034 v.reset(OpConstBool)
10035 v.AuxInt = boolToAuxInt(true)
10036 return true
10037 }
10038
10039
10040
10041 for {
10042 if v_0.Op != OpZeroExt8to64 || v_1.Op != OpConst64 {
10043 break
10044 }
10045 c := auxIntToInt64(v_1.AuxInt)
10046 if !((1 << 8) <= c) {
10047 break
10048 }
10049 v.reset(OpConstBool)
10050 v.AuxInt = boolToAuxInt(true)
10051 return true
10052 }
10053
10054
10055
10056 for {
10057 if v_0.Op != OpZeroExt16to32 || v_1.Op != OpConst32 {
10058 break
10059 }
10060 c := auxIntToInt32(v_1.AuxInt)
10061 if !((1 << 16) <= c) {
10062 break
10063 }
10064 v.reset(OpConstBool)
10065 v.AuxInt = boolToAuxInt(true)
10066 return true
10067 }
10068
10069
10070
10071 for {
10072 if v_0.Op != OpZeroExt16to64 || v_1.Op != OpConst64 {
10073 break
10074 }
10075 c := auxIntToInt64(v_1.AuxInt)
10076 if !((1 << 16) <= c) {
10077 break
10078 }
10079 v.reset(OpConstBool)
10080 v.AuxInt = boolToAuxInt(true)
10081 return true
10082 }
10083
10084
10085 for {
10086 x := v_0
10087 if x != v_1 {
10088 break
10089 }
10090 v.reset(OpConstBool)
10091 v.AuxInt = boolToAuxInt(false)
10092 return true
10093 }
10094
10095
10096
10097 for {
10098 if v_0.Op != OpAnd8 {
10099 break
10100 }
10101 v_0_0 := v_0.Args[0]
10102 v_0_1 := v_0.Args[1]
10103 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
10104 if v_0_0.Op != OpConst8 {
10105 continue
10106 }
10107 c := auxIntToInt8(v_0_0.AuxInt)
10108 if v_1.Op != OpConst8 {
10109 continue
10110 }
10111 d := auxIntToInt8(v_1.AuxInt)
10112 if !(0 <= c && c < d) {
10113 continue
10114 }
10115 v.reset(OpConstBool)
10116 v.AuxInt = boolToAuxInt(true)
10117 return true
10118 }
10119 break
10120 }
10121
10122
10123
10124 for {
10125 if v_0.Op != OpZeroExt8to16 {
10126 break
10127 }
10128 v_0_0 := v_0.Args[0]
10129 if v_0_0.Op != OpAnd8 {
10130 break
10131 }
10132 v_0_0_0 := v_0_0.Args[0]
10133 v_0_0_1 := v_0_0.Args[1]
10134 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
10135 if v_0_0_0.Op != OpConst8 {
10136 continue
10137 }
10138 c := auxIntToInt8(v_0_0_0.AuxInt)
10139 if v_1.Op != OpConst16 {
10140 continue
10141 }
10142 d := auxIntToInt16(v_1.AuxInt)
10143 if !(0 <= c && int16(c) < d) {
10144 continue
10145 }
10146 v.reset(OpConstBool)
10147 v.AuxInt = boolToAuxInt(true)
10148 return true
10149 }
10150 break
10151 }
10152
10153
10154
10155 for {
10156 if v_0.Op != OpZeroExt8to32 {
10157 break
10158 }
10159 v_0_0 := v_0.Args[0]
10160 if v_0_0.Op != OpAnd8 {
10161 break
10162 }
10163 v_0_0_0 := v_0_0.Args[0]
10164 v_0_0_1 := v_0_0.Args[1]
10165 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
10166 if v_0_0_0.Op != OpConst8 {
10167 continue
10168 }
10169 c := auxIntToInt8(v_0_0_0.AuxInt)
10170 if v_1.Op != OpConst32 {
10171 continue
10172 }
10173 d := auxIntToInt32(v_1.AuxInt)
10174 if !(0 <= c && int32(c) < d) {
10175 continue
10176 }
10177 v.reset(OpConstBool)
10178 v.AuxInt = boolToAuxInt(true)
10179 return true
10180 }
10181 break
10182 }
10183
10184
10185
10186 for {
10187 if v_0.Op != OpZeroExt8to64 {
10188 break
10189 }
10190 v_0_0 := v_0.Args[0]
10191 if v_0_0.Op != OpAnd8 {
10192 break
10193 }
10194 v_0_0_0 := v_0_0.Args[0]
10195 v_0_0_1 := v_0_0.Args[1]
10196 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
10197 if v_0_0_0.Op != OpConst8 {
10198 continue
10199 }
10200 c := auxIntToInt8(v_0_0_0.AuxInt)
10201 if v_1.Op != OpConst64 {
10202 continue
10203 }
10204 d := auxIntToInt64(v_1.AuxInt)
10205 if !(0 <= c && int64(c) < d) {
10206 continue
10207 }
10208 v.reset(OpConstBool)
10209 v.AuxInt = boolToAuxInt(true)
10210 return true
10211 }
10212 break
10213 }
10214
10215
10216
10217 for {
10218 if v_0.Op != OpAnd16 {
10219 break
10220 }
10221 v_0_0 := v_0.Args[0]
10222 v_0_1 := v_0.Args[1]
10223 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
10224 if v_0_0.Op != OpConst16 {
10225 continue
10226 }
10227 c := auxIntToInt16(v_0_0.AuxInt)
10228 if v_1.Op != OpConst16 {
10229 continue
10230 }
10231 d := auxIntToInt16(v_1.AuxInt)
10232 if !(0 <= c && c < d) {
10233 continue
10234 }
10235 v.reset(OpConstBool)
10236 v.AuxInt = boolToAuxInt(true)
10237 return true
10238 }
10239 break
10240 }
10241
10242
10243
10244 for {
10245 if v_0.Op != OpZeroExt16to32 {
10246 break
10247 }
10248 v_0_0 := v_0.Args[0]
10249 if v_0_0.Op != OpAnd16 {
10250 break
10251 }
10252 v_0_0_0 := v_0_0.Args[0]
10253 v_0_0_1 := v_0_0.Args[1]
10254 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
10255 if v_0_0_0.Op != OpConst16 {
10256 continue
10257 }
10258 c := auxIntToInt16(v_0_0_0.AuxInt)
10259 if v_1.Op != OpConst32 {
10260 continue
10261 }
10262 d := auxIntToInt32(v_1.AuxInt)
10263 if !(0 <= c && int32(c) < d) {
10264 continue
10265 }
10266 v.reset(OpConstBool)
10267 v.AuxInt = boolToAuxInt(true)
10268 return true
10269 }
10270 break
10271 }
10272
10273
10274
10275 for {
10276 if v_0.Op != OpZeroExt16to64 {
10277 break
10278 }
10279 v_0_0 := v_0.Args[0]
10280 if v_0_0.Op != OpAnd16 {
10281 break
10282 }
10283 v_0_0_0 := v_0_0.Args[0]
10284 v_0_0_1 := v_0_0.Args[1]
10285 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
10286 if v_0_0_0.Op != OpConst16 {
10287 continue
10288 }
10289 c := auxIntToInt16(v_0_0_0.AuxInt)
10290 if v_1.Op != OpConst64 {
10291 continue
10292 }
10293 d := auxIntToInt64(v_1.AuxInt)
10294 if !(0 <= c && int64(c) < d) {
10295 continue
10296 }
10297 v.reset(OpConstBool)
10298 v.AuxInt = boolToAuxInt(true)
10299 return true
10300 }
10301 break
10302 }
10303
10304
10305
10306 for {
10307 if v_0.Op != OpAnd32 {
10308 break
10309 }
10310 v_0_0 := v_0.Args[0]
10311 v_0_1 := v_0.Args[1]
10312 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
10313 if v_0_0.Op != OpConst32 {
10314 continue
10315 }
10316 c := auxIntToInt32(v_0_0.AuxInt)
10317 if v_1.Op != OpConst32 {
10318 continue
10319 }
10320 d := auxIntToInt32(v_1.AuxInt)
10321 if !(0 <= c && c < d) {
10322 continue
10323 }
10324 v.reset(OpConstBool)
10325 v.AuxInt = boolToAuxInt(true)
10326 return true
10327 }
10328 break
10329 }
10330
10331
10332
10333 for {
10334 if v_0.Op != OpZeroExt32to64 {
10335 break
10336 }
10337 v_0_0 := v_0.Args[0]
10338 if v_0_0.Op != OpAnd32 {
10339 break
10340 }
10341 v_0_0_0 := v_0_0.Args[0]
10342 v_0_0_1 := v_0_0.Args[1]
10343 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
10344 if v_0_0_0.Op != OpConst32 {
10345 continue
10346 }
10347 c := auxIntToInt32(v_0_0_0.AuxInt)
10348 if v_1.Op != OpConst64 {
10349 continue
10350 }
10351 d := auxIntToInt64(v_1.AuxInt)
10352 if !(0 <= c && int64(c) < d) {
10353 continue
10354 }
10355 v.reset(OpConstBool)
10356 v.AuxInt = boolToAuxInt(true)
10357 return true
10358 }
10359 break
10360 }
10361
10362
10363
10364 for {
10365 if v_0.Op != OpAnd64 {
10366 break
10367 }
10368 v_0_0 := v_0.Args[0]
10369 v_0_1 := v_0.Args[1]
10370 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
10371 if v_0_0.Op != OpConst64 {
10372 continue
10373 }
10374 c := auxIntToInt64(v_0_0.AuxInt)
10375 if v_1.Op != OpConst64 {
10376 continue
10377 }
10378 d := auxIntToInt64(v_1.AuxInt)
10379 if !(0 <= c && c < d) {
10380 continue
10381 }
10382 v.reset(OpConstBool)
10383 v.AuxInt = boolToAuxInt(true)
10384 return true
10385 }
10386 break
10387 }
10388
10389
10390 for {
10391 if v_0.Op != OpConst32 {
10392 break
10393 }
10394 c := auxIntToInt32(v_0.AuxInt)
10395 if v_1.Op != OpConst32 {
10396 break
10397 }
10398 d := auxIntToInt32(v_1.AuxInt)
10399 v.reset(OpConstBool)
10400 v.AuxInt = boolToAuxInt(0 <= c && c < d)
10401 return true
10402 }
10403
10404
10405 for {
10406 if v_0.Op != OpConst64 {
10407 break
10408 }
10409 c := auxIntToInt64(v_0.AuxInt)
10410 if v_1.Op != OpConst64 {
10411 break
10412 }
10413 d := auxIntToInt64(v_1.AuxInt)
10414 v.reset(OpConstBool)
10415 v.AuxInt = boolToAuxInt(0 <= c && c < d)
10416 return true
10417 }
10418
10419
10420 for {
10421 if v_0.Op != OpMod32u {
10422 break
10423 }
10424 y := v_0.Args[1]
10425 if y != v_1 {
10426 break
10427 }
10428 v.reset(OpConstBool)
10429 v.AuxInt = boolToAuxInt(true)
10430 return true
10431 }
10432
10433
10434 for {
10435 if v_0.Op != OpMod64u {
10436 break
10437 }
10438 y := v_0.Args[1]
10439 if y != v_1 {
10440 break
10441 }
10442 v.reset(OpConstBool)
10443 v.AuxInt = boolToAuxInt(true)
10444 return true
10445 }
10446
10447
10448
10449 for {
10450 if v_0.Op != OpZeroExt8to64 {
10451 break
10452 }
10453 v_0_0 := v_0.Args[0]
10454 if v_0_0.Op != OpRsh8Ux64 {
10455 break
10456 }
10457 _ = v_0_0.Args[1]
10458 v_0_0_1 := v_0_0.Args[1]
10459 if v_0_0_1.Op != OpConst64 {
10460 break
10461 }
10462 c := auxIntToInt64(v_0_0_1.AuxInt)
10463 if v_1.Op != OpConst64 {
10464 break
10465 }
10466 d := auxIntToInt64(v_1.AuxInt)
10467 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
10468 break
10469 }
10470 v.reset(OpConstBool)
10471 v.AuxInt = boolToAuxInt(true)
10472 return true
10473 }
10474
10475
10476
10477 for {
10478 if v_0.Op != OpZeroExt8to32 {
10479 break
10480 }
10481 v_0_0 := v_0.Args[0]
10482 if v_0_0.Op != OpRsh8Ux64 {
10483 break
10484 }
10485 _ = v_0_0.Args[1]
10486 v_0_0_1 := v_0_0.Args[1]
10487 if v_0_0_1.Op != OpConst64 {
10488 break
10489 }
10490 c := auxIntToInt64(v_0_0_1.AuxInt)
10491 if v_1.Op != OpConst32 {
10492 break
10493 }
10494 d := auxIntToInt32(v_1.AuxInt)
10495 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
10496 break
10497 }
10498 v.reset(OpConstBool)
10499 v.AuxInt = boolToAuxInt(true)
10500 return true
10501 }
10502
10503
10504
10505 for {
10506 if v_0.Op != OpZeroExt8to16 {
10507 break
10508 }
10509 v_0_0 := v_0.Args[0]
10510 if v_0_0.Op != OpRsh8Ux64 {
10511 break
10512 }
10513 _ = v_0_0.Args[1]
10514 v_0_0_1 := v_0_0.Args[1]
10515 if v_0_0_1.Op != OpConst64 {
10516 break
10517 }
10518 c := auxIntToInt64(v_0_0_1.AuxInt)
10519 if v_1.Op != OpConst16 {
10520 break
10521 }
10522 d := auxIntToInt16(v_1.AuxInt)
10523 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
10524 break
10525 }
10526 v.reset(OpConstBool)
10527 v.AuxInt = boolToAuxInt(true)
10528 return true
10529 }
10530
10531
10532
10533 for {
10534 if v_0.Op != OpRsh8Ux64 {
10535 break
10536 }
10537 _ = v_0.Args[1]
10538 v_0_1 := v_0.Args[1]
10539 if v_0_1.Op != OpConst64 {
10540 break
10541 }
10542 c := auxIntToInt64(v_0_1.AuxInt)
10543 if v_1.Op != OpConst64 {
10544 break
10545 }
10546 d := auxIntToInt64(v_1.AuxInt)
10547 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
10548 break
10549 }
10550 v.reset(OpConstBool)
10551 v.AuxInt = boolToAuxInt(true)
10552 return true
10553 }
10554
10555
10556
10557 for {
10558 if v_0.Op != OpZeroExt16to64 {
10559 break
10560 }
10561 v_0_0 := v_0.Args[0]
10562 if v_0_0.Op != OpRsh16Ux64 {
10563 break
10564 }
10565 _ = v_0_0.Args[1]
10566 v_0_0_1 := v_0_0.Args[1]
10567 if v_0_0_1.Op != OpConst64 {
10568 break
10569 }
10570 c := auxIntToInt64(v_0_0_1.AuxInt)
10571 if v_1.Op != OpConst64 {
10572 break
10573 }
10574 d := auxIntToInt64(v_1.AuxInt)
10575 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
10576 break
10577 }
10578 v.reset(OpConstBool)
10579 v.AuxInt = boolToAuxInt(true)
10580 return true
10581 }
10582
10583
10584
10585 for {
10586 if v_0.Op != OpZeroExt16to32 {
10587 break
10588 }
10589 v_0_0 := v_0.Args[0]
10590 if v_0_0.Op != OpRsh16Ux64 {
10591 break
10592 }
10593 _ = v_0_0.Args[1]
10594 v_0_0_1 := v_0_0.Args[1]
10595 if v_0_0_1.Op != OpConst64 {
10596 break
10597 }
10598 c := auxIntToInt64(v_0_0_1.AuxInt)
10599 if v_1.Op != OpConst64 {
10600 break
10601 }
10602 d := auxIntToInt64(v_1.AuxInt)
10603 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
10604 break
10605 }
10606 v.reset(OpConstBool)
10607 v.AuxInt = boolToAuxInt(true)
10608 return true
10609 }
10610
10611
10612
10613 for {
10614 if v_0.Op != OpRsh16Ux64 {
10615 break
10616 }
10617 _ = v_0.Args[1]
10618 v_0_1 := v_0.Args[1]
10619 if v_0_1.Op != OpConst64 {
10620 break
10621 }
10622 c := auxIntToInt64(v_0_1.AuxInt)
10623 if v_1.Op != OpConst64 {
10624 break
10625 }
10626 d := auxIntToInt64(v_1.AuxInt)
10627 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
10628 break
10629 }
10630 v.reset(OpConstBool)
10631 v.AuxInt = boolToAuxInt(true)
10632 return true
10633 }
10634
10635
10636
10637 for {
10638 if v_0.Op != OpZeroExt32to64 {
10639 break
10640 }
10641 v_0_0 := v_0.Args[0]
10642 if v_0_0.Op != OpRsh32Ux64 {
10643 break
10644 }
10645 _ = v_0_0.Args[1]
10646 v_0_0_1 := v_0_0.Args[1]
10647 if v_0_0_1.Op != OpConst64 {
10648 break
10649 }
10650 c := auxIntToInt64(v_0_0_1.AuxInt)
10651 if v_1.Op != OpConst64 {
10652 break
10653 }
10654 d := auxIntToInt64(v_1.AuxInt)
10655 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) {
10656 break
10657 }
10658 v.reset(OpConstBool)
10659 v.AuxInt = boolToAuxInt(true)
10660 return true
10661 }
10662
10663
10664
10665 for {
10666 if v_0.Op != OpRsh32Ux64 {
10667 break
10668 }
10669 _ = v_0.Args[1]
10670 v_0_1 := v_0.Args[1]
10671 if v_0_1.Op != OpConst64 {
10672 break
10673 }
10674 c := auxIntToInt64(v_0_1.AuxInt)
10675 if v_1.Op != OpConst64 {
10676 break
10677 }
10678 d := auxIntToInt64(v_1.AuxInt)
10679 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) {
10680 break
10681 }
10682 v.reset(OpConstBool)
10683 v.AuxInt = boolToAuxInt(true)
10684 return true
10685 }
10686
10687
10688
10689 for {
10690 if v_0.Op != OpRsh64Ux64 {
10691 break
10692 }
10693 _ = v_0.Args[1]
10694 v_0_1 := v_0.Args[1]
10695 if v_0_1.Op != OpConst64 {
10696 break
10697 }
10698 c := auxIntToInt64(v_0_1.AuxInt)
10699 if v_1.Op != OpConst64 {
10700 break
10701 }
10702 d := auxIntToInt64(v_1.AuxInt)
10703 if !(0 < c && c < 64 && 1<<uint(64-c)-1 < d) {
10704 break
10705 }
10706 v.reset(OpConstBool)
10707 v.AuxInt = boolToAuxInt(true)
10708 return true
10709 }
10710 return false
10711 }
10712 func rewriteValuegeneric_OpIsNonNil(v *Value) bool {
10713 v_0 := v.Args[0]
10714
10715
10716 for {
10717 if v_0.Op != OpConstNil {
10718 break
10719 }
10720 v.reset(OpConstBool)
10721 v.AuxInt = boolToAuxInt(false)
10722 return true
10723 }
10724
10725
10726 for {
10727 if v_0.Op != OpConst32 {
10728 break
10729 }
10730 c := auxIntToInt32(v_0.AuxInt)
10731 v.reset(OpConstBool)
10732 v.AuxInt = boolToAuxInt(c != 0)
10733 return true
10734 }
10735
10736
10737 for {
10738 if v_0.Op != OpConst64 {
10739 break
10740 }
10741 c := auxIntToInt64(v_0.AuxInt)
10742 v.reset(OpConstBool)
10743 v.AuxInt = boolToAuxInt(c != 0)
10744 return true
10745 }
10746
10747
10748 for {
10749 if v_0.Op != OpAddr {
10750 break
10751 }
10752 v.reset(OpConstBool)
10753 v.AuxInt = boolToAuxInt(true)
10754 return true
10755 }
10756
10757
10758 for {
10759 if v_0.Op != OpConvert {
10760 break
10761 }
10762 v_0_0 := v_0.Args[0]
10763 if v_0_0.Op != OpAddr {
10764 break
10765 }
10766 v.reset(OpConstBool)
10767 v.AuxInt = boolToAuxInt(true)
10768 return true
10769 }
10770
10771
10772 for {
10773 if v_0.Op != OpLocalAddr {
10774 break
10775 }
10776 v.reset(OpConstBool)
10777 v.AuxInt = boolToAuxInt(true)
10778 return true
10779 }
10780 return false
10781 }
10782 func rewriteValuegeneric_OpIsSliceInBounds(v *Value) bool {
10783 v_1 := v.Args[1]
10784 v_0 := v.Args[0]
10785
10786
10787 for {
10788 x := v_0
10789 if x != v_1 {
10790 break
10791 }
10792 v.reset(OpConstBool)
10793 v.AuxInt = boolToAuxInt(true)
10794 return true
10795 }
10796
10797
10798
10799 for {
10800 if v_0.Op != OpAnd32 {
10801 break
10802 }
10803 v_0_0 := v_0.Args[0]
10804 v_0_1 := v_0.Args[1]
10805 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
10806 if v_0_0.Op != OpConst32 {
10807 continue
10808 }
10809 c := auxIntToInt32(v_0_0.AuxInt)
10810 if v_1.Op != OpConst32 {
10811 continue
10812 }
10813 d := auxIntToInt32(v_1.AuxInt)
10814 if !(0 <= c && c <= d) {
10815 continue
10816 }
10817 v.reset(OpConstBool)
10818 v.AuxInt = boolToAuxInt(true)
10819 return true
10820 }
10821 break
10822 }
10823
10824
10825
10826 for {
10827 if v_0.Op != OpAnd64 {
10828 break
10829 }
10830 v_0_0 := v_0.Args[0]
10831 v_0_1 := v_0.Args[1]
10832 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
10833 if v_0_0.Op != OpConst64 {
10834 continue
10835 }
10836 c := auxIntToInt64(v_0_0.AuxInt)
10837 if v_1.Op != OpConst64 {
10838 continue
10839 }
10840 d := auxIntToInt64(v_1.AuxInt)
10841 if !(0 <= c && c <= d) {
10842 continue
10843 }
10844 v.reset(OpConstBool)
10845 v.AuxInt = boolToAuxInt(true)
10846 return true
10847 }
10848 break
10849 }
10850
10851
10852 for {
10853 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
10854 break
10855 }
10856 v.reset(OpConstBool)
10857 v.AuxInt = boolToAuxInt(true)
10858 return true
10859 }
10860
10861
10862 for {
10863 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
10864 break
10865 }
10866 v.reset(OpConstBool)
10867 v.AuxInt = boolToAuxInt(true)
10868 return true
10869 }
10870
10871
10872 for {
10873 if v_0.Op != OpConst32 {
10874 break
10875 }
10876 c := auxIntToInt32(v_0.AuxInt)
10877 if v_1.Op != OpConst32 {
10878 break
10879 }
10880 d := auxIntToInt32(v_1.AuxInt)
10881 v.reset(OpConstBool)
10882 v.AuxInt = boolToAuxInt(0 <= c && c <= d)
10883 return true
10884 }
10885
10886
10887 for {
10888 if v_0.Op != OpConst64 {
10889 break
10890 }
10891 c := auxIntToInt64(v_0.AuxInt)
10892 if v_1.Op != OpConst64 {
10893 break
10894 }
10895 d := auxIntToInt64(v_1.AuxInt)
10896 v.reset(OpConstBool)
10897 v.AuxInt = boolToAuxInt(0 <= c && c <= d)
10898 return true
10899 }
10900
10901
10902 for {
10903 if v_0.Op != OpSliceLen {
10904 break
10905 }
10906 x := v_0.Args[0]
10907 if v_1.Op != OpSliceCap || x != v_1.Args[0] {
10908 break
10909 }
10910 v.reset(OpConstBool)
10911 v.AuxInt = boolToAuxInt(true)
10912 return true
10913 }
10914 return false
10915 }
10916 func rewriteValuegeneric_OpLeq16(v *Value) bool {
10917 v_1 := v.Args[1]
10918 v_0 := v.Args[0]
10919 b := v.Block
10920
10921
10922 for {
10923 if v_0.Op != OpConst16 {
10924 break
10925 }
10926 c := auxIntToInt16(v_0.AuxInt)
10927 if v_1.Op != OpConst16 {
10928 break
10929 }
10930 d := auxIntToInt16(v_1.AuxInt)
10931 v.reset(OpConstBool)
10932 v.AuxInt = boolToAuxInt(c <= d)
10933 return true
10934 }
10935
10936
10937
10938 for {
10939 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 || v_1.Op != OpAnd16 {
10940 break
10941 }
10942 _ = v_1.Args[1]
10943 v_1_0 := v_1.Args[0]
10944 v_1_1 := v_1.Args[1]
10945 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
10946 if v_1_1.Op != OpConst16 {
10947 continue
10948 }
10949 c := auxIntToInt16(v_1_1.AuxInt)
10950 if !(c >= 0) {
10951 continue
10952 }
10953 v.reset(OpConstBool)
10954 v.AuxInt = boolToAuxInt(true)
10955 return true
10956 }
10957 break
10958 }
10959
10960
10961
10962 for {
10963 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 || v_1.Op != OpRsh16Ux64 {
10964 break
10965 }
10966 _ = v_1.Args[1]
10967 v_1_1 := v_1.Args[1]
10968 if v_1_1.Op != OpConst64 {
10969 break
10970 }
10971 c := auxIntToInt64(v_1_1.AuxInt)
10972 if !(c > 0) {
10973 break
10974 }
10975 v.reset(OpConstBool)
10976 v.AuxInt = boolToAuxInt(true)
10977 return true
10978 }
10979
10980
10981 for {
10982 x := v_0
10983 if v_1.Op != OpConst16 {
10984 break
10985 }
10986 t := v_1.Type
10987 if auxIntToInt16(v_1.AuxInt) != -1 {
10988 break
10989 }
10990 v.reset(OpLess16)
10991 v0 := b.NewValue0(v.Pos, OpConst16, t)
10992 v0.AuxInt = int16ToAuxInt(0)
10993 v.AddArg2(x, v0)
10994 return true
10995 }
10996
10997
10998 for {
10999 if v_0.Op != OpConst16 {
11000 break
11001 }
11002 t := v_0.Type
11003 if auxIntToInt16(v_0.AuxInt) != 1 {
11004 break
11005 }
11006 x := v_1
11007 v.reset(OpLess16)
11008 v0 := b.NewValue0(v.Pos, OpConst16, t)
11009 v0.AuxInt = int16ToAuxInt(0)
11010 v.AddArg2(v0, x)
11011 return true
11012 }
11013
11014
11015 for {
11016 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != math.MinInt16 {
11017 break
11018 }
11019 v.reset(OpConstBool)
11020 v.AuxInt = boolToAuxInt(true)
11021 return true
11022 }
11023
11024
11025 for {
11026 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != math.MaxInt16 {
11027 break
11028 }
11029 v.reset(OpConstBool)
11030 v.AuxInt = boolToAuxInt(true)
11031 return true
11032 }
11033
11034
11035 for {
11036 x := v_0
11037 c := v_1
11038 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != math.MinInt16 {
11039 break
11040 }
11041 v.reset(OpEq16)
11042 v.AddArg2(x, c)
11043 return true
11044 }
11045
11046
11047 for {
11048 c := v_0
11049 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != math.MaxInt16 {
11050 break
11051 }
11052 x := v_1
11053 v.reset(OpEq16)
11054 v.AddArg2(x, c)
11055 return true
11056 }
11057 return false
11058 }
11059 func rewriteValuegeneric_OpLeq16U(v *Value) bool {
11060 v_1 := v.Args[1]
11061 v_0 := v.Args[0]
11062 b := v.Block
11063
11064
11065 for {
11066 if v_0.Op != OpConst16 {
11067 break
11068 }
11069 c := auxIntToInt16(v_0.AuxInt)
11070 if v_1.Op != OpConst16 {
11071 break
11072 }
11073 d := auxIntToInt16(v_1.AuxInt)
11074 v.reset(OpConstBool)
11075 v.AuxInt = boolToAuxInt(uint16(c) <= uint16(d))
11076 return true
11077 }
11078
11079
11080 for {
11081 if v_0.Op != OpConst16 {
11082 break
11083 }
11084 t := v_0.Type
11085 if auxIntToInt16(v_0.AuxInt) != 1 {
11086 break
11087 }
11088 x := v_1
11089 v.reset(OpNeq16)
11090 v0 := b.NewValue0(v.Pos, OpConst16, t)
11091 v0.AuxInt = int16ToAuxInt(0)
11092 v.AddArg2(v0, x)
11093 return true
11094 }
11095
11096
11097 for {
11098 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
11099 break
11100 }
11101 v.reset(OpConstBool)
11102 v.AuxInt = boolToAuxInt(true)
11103 return true
11104 }
11105
11106
11107 for {
11108 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != -1 {
11109 break
11110 }
11111 v.reset(OpConstBool)
11112 v.AuxInt = boolToAuxInt(true)
11113 return true
11114 }
11115
11116
11117 for {
11118 x := v_0
11119 c := v_1
11120 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != 0 {
11121 break
11122 }
11123 v.reset(OpEq16)
11124 v.AddArg2(x, c)
11125 return true
11126 }
11127
11128
11129 for {
11130 c := v_0
11131 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != -1 {
11132 break
11133 }
11134 x := v_1
11135 v.reset(OpEq16)
11136 v.AddArg2(x, c)
11137 return true
11138 }
11139 return false
11140 }
11141 func rewriteValuegeneric_OpLeq32(v *Value) bool {
11142 v_1 := v.Args[1]
11143 v_0 := v.Args[0]
11144 b := v.Block
11145
11146
11147 for {
11148 if v_0.Op != OpConst32 {
11149 break
11150 }
11151 c := auxIntToInt32(v_0.AuxInt)
11152 if v_1.Op != OpConst32 {
11153 break
11154 }
11155 d := auxIntToInt32(v_1.AuxInt)
11156 v.reset(OpConstBool)
11157 v.AuxInt = boolToAuxInt(c <= d)
11158 return true
11159 }
11160
11161
11162
11163 for {
11164 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 || v_1.Op != OpAnd32 {
11165 break
11166 }
11167 _ = v_1.Args[1]
11168 v_1_0 := v_1.Args[0]
11169 v_1_1 := v_1.Args[1]
11170 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
11171 if v_1_1.Op != OpConst32 {
11172 continue
11173 }
11174 c := auxIntToInt32(v_1_1.AuxInt)
11175 if !(c >= 0) {
11176 continue
11177 }
11178 v.reset(OpConstBool)
11179 v.AuxInt = boolToAuxInt(true)
11180 return true
11181 }
11182 break
11183 }
11184
11185
11186
11187 for {
11188 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 || v_1.Op != OpRsh32Ux64 {
11189 break
11190 }
11191 _ = v_1.Args[1]
11192 v_1_1 := v_1.Args[1]
11193 if v_1_1.Op != OpConst64 {
11194 break
11195 }
11196 c := auxIntToInt64(v_1_1.AuxInt)
11197 if !(c > 0) {
11198 break
11199 }
11200 v.reset(OpConstBool)
11201 v.AuxInt = boolToAuxInt(true)
11202 return true
11203 }
11204
11205
11206 for {
11207 x := v_0
11208 if v_1.Op != OpConst32 {
11209 break
11210 }
11211 t := v_1.Type
11212 if auxIntToInt32(v_1.AuxInt) != -1 {
11213 break
11214 }
11215 v.reset(OpLess32)
11216 v0 := b.NewValue0(v.Pos, OpConst32, t)
11217 v0.AuxInt = int32ToAuxInt(0)
11218 v.AddArg2(x, v0)
11219 return true
11220 }
11221
11222
11223 for {
11224 if v_0.Op != OpConst32 {
11225 break
11226 }
11227 t := v_0.Type
11228 if auxIntToInt32(v_0.AuxInt) != 1 {
11229 break
11230 }
11231 x := v_1
11232 v.reset(OpLess32)
11233 v0 := b.NewValue0(v.Pos, OpConst32, t)
11234 v0.AuxInt = int32ToAuxInt(0)
11235 v.AddArg2(v0, x)
11236 return true
11237 }
11238
11239
11240 for {
11241 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != math.MinInt32 {
11242 break
11243 }
11244 v.reset(OpConstBool)
11245 v.AuxInt = boolToAuxInt(true)
11246 return true
11247 }
11248
11249
11250 for {
11251 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != math.MaxInt32 {
11252 break
11253 }
11254 v.reset(OpConstBool)
11255 v.AuxInt = boolToAuxInt(true)
11256 return true
11257 }
11258
11259
11260 for {
11261 x := v_0
11262 c := v_1
11263 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != math.MinInt32 {
11264 break
11265 }
11266 v.reset(OpEq32)
11267 v.AddArg2(x, c)
11268 return true
11269 }
11270
11271
11272 for {
11273 c := v_0
11274 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != math.MaxInt32 {
11275 break
11276 }
11277 x := v_1
11278 v.reset(OpEq32)
11279 v.AddArg2(x, c)
11280 return true
11281 }
11282 return false
11283 }
11284 func rewriteValuegeneric_OpLeq32F(v *Value) bool {
11285 v_1 := v.Args[1]
11286 v_0 := v.Args[0]
11287
11288
11289 for {
11290 if v_0.Op != OpConst32F {
11291 break
11292 }
11293 c := auxIntToFloat32(v_0.AuxInt)
11294 if v_1.Op != OpConst32F {
11295 break
11296 }
11297 d := auxIntToFloat32(v_1.AuxInt)
11298 v.reset(OpConstBool)
11299 v.AuxInt = boolToAuxInt(c <= d)
11300 return true
11301 }
11302 return false
11303 }
11304 func rewriteValuegeneric_OpLeq32U(v *Value) bool {
11305 v_1 := v.Args[1]
11306 v_0 := v.Args[0]
11307 b := v.Block
11308
11309
11310 for {
11311 if v_0.Op != OpConst32 {
11312 break
11313 }
11314 c := auxIntToInt32(v_0.AuxInt)
11315 if v_1.Op != OpConst32 {
11316 break
11317 }
11318 d := auxIntToInt32(v_1.AuxInt)
11319 v.reset(OpConstBool)
11320 v.AuxInt = boolToAuxInt(uint32(c) <= uint32(d))
11321 return true
11322 }
11323
11324
11325 for {
11326 if v_0.Op != OpConst32 {
11327 break
11328 }
11329 t := v_0.Type
11330 if auxIntToInt32(v_0.AuxInt) != 1 {
11331 break
11332 }
11333 x := v_1
11334 v.reset(OpNeq32)
11335 v0 := b.NewValue0(v.Pos, OpConst32, t)
11336 v0.AuxInt = int32ToAuxInt(0)
11337 v.AddArg2(v0, x)
11338 return true
11339 }
11340
11341
11342 for {
11343 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
11344 break
11345 }
11346 v.reset(OpConstBool)
11347 v.AuxInt = boolToAuxInt(true)
11348 return true
11349 }
11350
11351
11352 for {
11353 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != -1 {
11354 break
11355 }
11356 v.reset(OpConstBool)
11357 v.AuxInt = boolToAuxInt(true)
11358 return true
11359 }
11360
11361
11362 for {
11363 x := v_0
11364 c := v_1
11365 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != 0 {
11366 break
11367 }
11368 v.reset(OpEq32)
11369 v.AddArg2(x, c)
11370 return true
11371 }
11372
11373
11374 for {
11375 c := v_0
11376 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != -1 {
11377 break
11378 }
11379 x := v_1
11380 v.reset(OpEq32)
11381 v.AddArg2(x, c)
11382 return true
11383 }
11384 return false
11385 }
11386 func rewriteValuegeneric_OpLeq64(v *Value) bool {
11387 v_1 := v.Args[1]
11388 v_0 := v.Args[0]
11389 b := v.Block
11390
11391
11392 for {
11393 if v_0.Op != OpConst64 {
11394 break
11395 }
11396 c := auxIntToInt64(v_0.AuxInt)
11397 if v_1.Op != OpConst64 {
11398 break
11399 }
11400 d := auxIntToInt64(v_1.AuxInt)
11401 v.reset(OpConstBool)
11402 v.AuxInt = boolToAuxInt(c <= d)
11403 return true
11404 }
11405
11406
11407
11408 for {
11409 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 || v_1.Op != OpAnd64 {
11410 break
11411 }
11412 _ = v_1.Args[1]
11413 v_1_0 := v_1.Args[0]
11414 v_1_1 := v_1.Args[1]
11415 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
11416 if v_1_1.Op != OpConst64 {
11417 continue
11418 }
11419 c := auxIntToInt64(v_1_1.AuxInt)
11420 if !(c >= 0) {
11421 continue
11422 }
11423 v.reset(OpConstBool)
11424 v.AuxInt = boolToAuxInt(true)
11425 return true
11426 }
11427 break
11428 }
11429
11430
11431
11432 for {
11433 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 || v_1.Op != OpRsh64Ux64 {
11434 break
11435 }
11436 _ = v_1.Args[1]
11437 v_1_1 := v_1.Args[1]
11438 if v_1_1.Op != OpConst64 {
11439 break
11440 }
11441 c := auxIntToInt64(v_1_1.AuxInt)
11442 if !(c > 0) {
11443 break
11444 }
11445 v.reset(OpConstBool)
11446 v.AuxInt = boolToAuxInt(true)
11447 return true
11448 }
11449
11450
11451 for {
11452 x := v_0
11453 if v_1.Op != OpConst64 {
11454 break
11455 }
11456 t := v_1.Type
11457 if auxIntToInt64(v_1.AuxInt) != -1 {
11458 break
11459 }
11460 v.reset(OpLess64)
11461 v0 := b.NewValue0(v.Pos, OpConst64, t)
11462 v0.AuxInt = int64ToAuxInt(0)
11463 v.AddArg2(x, v0)
11464 return true
11465 }
11466
11467
11468 for {
11469 if v_0.Op != OpConst64 {
11470 break
11471 }
11472 t := v_0.Type
11473 if auxIntToInt64(v_0.AuxInt) != 1 {
11474 break
11475 }
11476 x := v_1
11477 v.reset(OpLess64)
11478 v0 := b.NewValue0(v.Pos, OpConst64, t)
11479 v0.AuxInt = int64ToAuxInt(0)
11480 v.AddArg2(v0, x)
11481 return true
11482 }
11483
11484
11485 for {
11486 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != math.MinInt64 {
11487 break
11488 }
11489 v.reset(OpConstBool)
11490 v.AuxInt = boolToAuxInt(true)
11491 return true
11492 }
11493
11494
11495 for {
11496 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != math.MaxInt64 {
11497 break
11498 }
11499 v.reset(OpConstBool)
11500 v.AuxInt = boolToAuxInt(true)
11501 return true
11502 }
11503
11504
11505 for {
11506 x := v_0
11507 c := v_1
11508 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != math.MinInt64 {
11509 break
11510 }
11511 v.reset(OpEq64)
11512 v.AddArg2(x, c)
11513 return true
11514 }
11515
11516
11517 for {
11518 c := v_0
11519 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != math.MaxInt64 {
11520 break
11521 }
11522 x := v_1
11523 v.reset(OpEq64)
11524 v.AddArg2(x, c)
11525 return true
11526 }
11527 return false
11528 }
11529 func rewriteValuegeneric_OpLeq64F(v *Value) bool {
11530 v_1 := v.Args[1]
11531 v_0 := v.Args[0]
11532
11533
11534 for {
11535 if v_0.Op != OpConst64F {
11536 break
11537 }
11538 c := auxIntToFloat64(v_0.AuxInt)
11539 if v_1.Op != OpConst64F {
11540 break
11541 }
11542 d := auxIntToFloat64(v_1.AuxInt)
11543 v.reset(OpConstBool)
11544 v.AuxInt = boolToAuxInt(c <= d)
11545 return true
11546 }
11547 return false
11548 }
11549 func rewriteValuegeneric_OpLeq64U(v *Value) bool {
11550 v_1 := v.Args[1]
11551 v_0 := v.Args[0]
11552 b := v.Block
11553
11554
11555 for {
11556 if v_0.Op != OpConst64 {
11557 break
11558 }
11559 c := auxIntToInt64(v_0.AuxInt)
11560 if v_1.Op != OpConst64 {
11561 break
11562 }
11563 d := auxIntToInt64(v_1.AuxInt)
11564 v.reset(OpConstBool)
11565 v.AuxInt = boolToAuxInt(uint64(c) <= uint64(d))
11566 return true
11567 }
11568
11569
11570 for {
11571 if v_0.Op != OpConst64 {
11572 break
11573 }
11574 t := v_0.Type
11575 if auxIntToInt64(v_0.AuxInt) != 1 {
11576 break
11577 }
11578 x := v_1
11579 v.reset(OpNeq64)
11580 v0 := b.NewValue0(v.Pos, OpConst64, t)
11581 v0.AuxInt = int64ToAuxInt(0)
11582 v.AddArg2(v0, x)
11583 return true
11584 }
11585
11586
11587 for {
11588 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
11589 break
11590 }
11591 v.reset(OpConstBool)
11592 v.AuxInt = boolToAuxInt(true)
11593 return true
11594 }
11595
11596
11597 for {
11598 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1 {
11599 break
11600 }
11601 v.reset(OpConstBool)
11602 v.AuxInt = boolToAuxInt(true)
11603 return true
11604 }
11605
11606
11607 for {
11608 x := v_0
11609 c := v_1
11610 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != 0 {
11611 break
11612 }
11613 v.reset(OpEq64)
11614 v.AddArg2(x, c)
11615 return true
11616 }
11617
11618
11619 for {
11620 c := v_0
11621 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != -1 {
11622 break
11623 }
11624 x := v_1
11625 v.reset(OpEq64)
11626 v.AddArg2(x, c)
11627 return true
11628 }
11629 return false
11630 }
11631 func rewriteValuegeneric_OpLeq8(v *Value) bool {
11632 v_1 := v.Args[1]
11633 v_0 := v.Args[0]
11634 b := v.Block
11635
11636
11637 for {
11638 if v_0.Op != OpConst8 {
11639 break
11640 }
11641 c := auxIntToInt8(v_0.AuxInt)
11642 if v_1.Op != OpConst8 {
11643 break
11644 }
11645 d := auxIntToInt8(v_1.AuxInt)
11646 v.reset(OpConstBool)
11647 v.AuxInt = boolToAuxInt(c <= d)
11648 return true
11649 }
11650
11651
11652
11653 for {
11654 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 || v_1.Op != OpAnd8 {
11655 break
11656 }
11657 _ = v_1.Args[1]
11658 v_1_0 := v_1.Args[0]
11659 v_1_1 := v_1.Args[1]
11660 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
11661 if v_1_1.Op != OpConst8 {
11662 continue
11663 }
11664 c := auxIntToInt8(v_1_1.AuxInt)
11665 if !(c >= 0) {
11666 continue
11667 }
11668 v.reset(OpConstBool)
11669 v.AuxInt = boolToAuxInt(true)
11670 return true
11671 }
11672 break
11673 }
11674
11675
11676
11677 for {
11678 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 || v_1.Op != OpRsh8Ux64 {
11679 break
11680 }
11681 _ = v_1.Args[1]
11682 v_1_1 := v_1.Args[1]
11683 if v_1_1.Op != OpConst64 {
11684 break
11685 }
11686 c := auxIntToInt64(v_1_1.AuxInt)
11687 if !(c > 0) {
11688 break
11689 }
11690 v.reset(OpConstBool)
11691 v.AuxInt = boolToAuxInt(true)
11692 return true
11693 }
11694
11695
11696 for {
11697 x := v_0
11698 if v_1.Op != OpConst8 {
11699 break
11700 }
11701 t := v_1.Type
11702 if auxIntToInt8(v_1.AuxInt) != -1 {
11703 break
11704 }
11705 v.reset(OpLess8)
11706 v0 := b.NewValue0(v.Pos, OpConst8, t)
11707 v0.AuxInt = int8ToAuxInt(0)
11708 v.AddArg2(x, v0)
11709 return true
11710 }
11711
11712
11713 for {
11714 if v_0.Op != OpConst8 {
11715 break
11716 }
11717 t := v_0.Type
11718 if auxIntToInt8(v_0.AuxInt) != 1 {
11719 break
11720 }
11721 x := v_1
11722 v.reset(OpLess8)
11723 v0 := b.NewValue0(v.Pos, OpConst8, t)
11724 v0.AuxInt = int8ToAuxInt(0)
11725 v.AddArg2(v0, x)
11726 return true
11727 }
11728
11729
11730 for {
11731 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != math.MinInt8 {
11732 break
11733 }
11734 v.reset(OpConstBool)
11735 v.AuxInt = boolToAuxInt(true)
11736 return true
11737 }
11738
11739
11740 for {
11741 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != math.MaxInt8 {
11742 break
11743 }
11744 v.reset(OpConstBool)
11745 v.AuxInt = boolToAuxInt(true)
11746 return true
11747 }
11748
11749
11750 for {
11751 x := v_0
11752 c := v_1
11753 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != math.MinInt8 {
11754 break
11755 }
11756 v.reset(OpEq8)
11757 v.AddArg2(x, c)
11758 return true
11759 }
11760
11761
11762 for {
11763 c := v_0
11764 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != math.MaxInt8 {
11765 break
11766 }
11767 x := v_1
11768 v.reset(OpEq8)
11769 v.AddArg2(x, c)
11770 return true
11771 }
11772 return false
11773 }
11774 func rewriteValuegeneric_OpLeq8U(v *Value) bool {
11775 v_1 := v.Args[1]
11776 v_0 := v.Args[0]
11777 b := v.Block
11778
11779
11780 for {
11781 if v_0.Op != OpConst8 {
11782 break
11783 }
11784 c := auxIntToInt8(v_0.AuxInt)
11785 if v_1.Op != OpConst8 {
11786 break
11787 }
11788 d := auxIntToInt8(v_1.AuxInt)
11789 v.reset(OpConstBool)
11790 v.AuxInt = boolToAuxInt(uint8(c) <= uint8(d))
11791 return true
11792 }
11793
11794
11795 for {
11796 if v_0.Op != OpConst8 {
11797 break
11798 }
11799 t := v_0.Type
11800 if auxIntToInt8(v_0.AuxInt) != 1 {
11801 break
11802 }
11803 x := v_1
11804 v.reset(OpNeq8)
11805 v0 := b.NewValue0(v.Pos, OpConst8, t)
11806 v0.AuxInt = int8ToAuxInt(0)
11807 v.AddArg2(v0, x)
11808 return true
11809 }
11810
11811
11812 for {
11813 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
11814 break
11815 }
11816 v.reset(OpConstBool)
11817 v.AuxInt = boolToAuxInt(true)
11818 return true
11819 }
11820
11821
11822 for {
11823 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != -1 {
11824 break
11825 }
11826 v.reset(OpConstBool)
11827 v.AuxInt = boolToAuxInt(true)
11828 return true
11829 }
11830
11831
11832 for {
11833 x := v_0
11834 c := v_1
11835 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != 0 {
11836 break
11837 }
11838 v.reset(OpEq8)
11839 v.AddArg2(x, c)
11840 return true
11841 }
11842
11843
11844 for {
11845 c := v_0
11846 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != -1 {
11847 break
11848 }
11849 x := v_1
11850 v.reset(OpEq8)
11851 v.AddArg2(x, c)
11852 return true
11853 }
11854 return false
11855 }
11856 func rewriteValuegeneric_OpLess16(v *Value) bool {
11857 v_1 := v.Args[1]
11858 v_0 := v.Args[0]
11859 b := v.Block
11860
11861
11862 for {
11863 if v_0.Op != OpConst16 {
11864 break
11865 }
11866 c := auxIntToInt16(v_0.AuxInt)
11867 if v_1.Op != OpConst16 {
11868 break
11869 }
11870 d := auxIntToInt16(v_1.AuxInt)
11871 v.reset(OpConstBool)
11872 v.AuxInt = boolToAuxInt(c < d)
11873 return true
11874 }
11875
11876
11877
11878 for {
11879 if v_0.Op != OpConst16 {
11880 break
11881 }
11882 t := v_0.Type
11883 if auxIntToInt16(v_0.AuxInt) != 0 {
11884 break
11885 }
11886 x := v_1
11887 if !(isNonNegative(x)) {
11888 break
11889 }
11890 v.reset(OpNeq16)
11891 v0 := b.NewValue0(v.Pos, OpConst16, t)
11892 v0.AuxInt = int16ToAuxInt(0)
11893 v.AddArg2(v0, x)
11894 return true
11895 }
11896
11897
11898
11899 for {
11900 x := v_0
11901 if v_1.Op != OpConst16 {
11902 break
11903 }
11904 t := v_1.Type
11905 if auxIntToInt16(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
11906 break
11907 }
11908 v.reset(OpEq16)
11909 v0 := b.NewValue0(v.Pos, OpConst16, t)
11910 v0.AuxInt = int16ToAuxInt(0)
11911 v.AddArg2(v0, x)
11912 return true
11913 }
11914
11915
11916 for {
11917 x := v_0
11918 if v_1.Op != OpConst16 {
11919 break
11920 }
11921 t := v_1.Type
11922 if auxIntToInt16(v_1.AuxInt) != 1 {
11923 break
11924 }
11925 v.reset(OpLeq16)
11926 v0 := b.NewValue0(v.Pos, OpConst16, t)
11927 v0.AuxInt = int16ToAuxInt(0)
11928 v.AddArg2(x, v0)
11929 return true
11930 }
11931
11932
11933 for {
11934 if v_0.Op != OpConst16 {
11935 break
11936 }
11937 t := v_0.Type
11938 if auxIntToInt16(v_0.AuxInt) != -1 {
11939 break
11940 }
11941 x := v_1
11942 v.reset(OpLeq16)
11943 v0 := b.NewValue0(v.Pos, OpConst16, t)
11944 v0.AuxInt = int16ToAuxInt(0)
11945 v.AddArg2(v0, x)
11946 return true
11947 }
11948
11949
11950 for {
11951 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != math.MinInt16 {
11952 break
11953 }
11954 v.reset(OpConstBool)
11955 v.AuxInt = boolToAuxInt(false)
11956 return true
11957 }
11958
11959
11960 for {
11961 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != math.MaxInt16 {
11962 break
11963 }
11964 v.reset(OpConstBool)
11965 v.AuxInt = boolToAuxInt(false)
11966 return true
11967 }
11968
11969
11970 for {
11971 x := v_0
11972 if v_1.Op != OpConst16 {
11973 break
11974 }
11975 t := v_1.Type
11976 if auxIntToInt16(v_1.AuxInt) != math.MinInt16+1 {
11977 break
11978 }
11979 v.reset(OpEq16)
11980 v0 := b.NewValue0(v.Pos, OpConst16, t)
11981 v0.AuxInt = int16ToAuxInt(math.MinInt16)
11982 v.AddArg2(x, v0)
11983 return true
11984 }
11985
11986
11987 for {
11988 if v_0.Op != OpConst16 {
11989 break
11990 }
11991 t := v_0.Type
11992 if auxIntToInt16(v_0.AuxInt) != math.MaxInt16-1 {
11993 break
11994 }
11995 x := v_1
11996 v.reset(OpEq16)
11997 v0 := b.NewValue0(v.Pos, OpConst16, t)
11998 v0.AuxInt = int16ToAuxInt(math.MaxInt16)
11999 v.AddArg2(x, v0)
12000 return true
12001 }
12002 return false
12003 }
12004 func rewriteValuegeneric_OpLess16U(v *Value) bool {
12005 v_1 := v.Args[1]
12006 v_0 := v.Args[0]
12007 b := v.Block
12008
12009
12010 for {
12011 if v_0.Op != OpConst16 {
12012 break
12013 }
12014 c := auxIntToInt16(v_0.AuxInt)
12015 if v_1.Op != OpConst16 {
12016 break
12017 }
12018 d := auxIntToInt16(v_1.AuxInt)
12019 v.reset(OpConstBool)
12020 v.AuxInt = boolToAuxInt(uint16(c) < uint16(d))
12021 return true
12022 }
12023
12024
12025 for {
12026 x := v_0
12027 if v_1.Op != OpConst16 {
12028 break
12029 }
12030 t := v_1.Type
12031 if auxIntToInt16(v_1.AuxInt) != 1 {
12032 break
12033 }
12034 v.reset(OpEq16)
12035 v0 := b.NewValue0(v.Pos, OpConst16, t)
12036 v0.AuxInt = int16ToAuxInt(0)
12037 v.AddArg2(v0, x)
12038 return true
12039 }
12040
12041
12042 for {
12043 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
12044 break
12045 }
12046 v.reset(OpConstBool)
12047 v.AuxInt = boolToAuxInt(false)
12048 return true
12049 }
12050
12051
12052 for {
12053 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
12054 break
12055 }
12056 v.reset(OpConstBool)
12057 v.AuxInt = boolToAuxInt(false)
12058 return true
12059 }
12060
12061
12062 for {
12063 x := v_0
12064 if v_1.Op != OpConst16 {
12065 break
12066 }
12067 t := v_1.Type
12068 if auxIntToInt16(v_1.AuxInt) != 1 {
12069 break
12070 }
12071 v.reset(OpEq16)
12072 v0 := b.NewValue0(v.Pos, OpConst16, t)
12073 v0.AuxInt = int16ToAuxInt(0)
12074 v.AddArg2(x, v0)
12075 return true
12076 }
12077
12078
12079 for {
12080 if v_0.Op != OpConst16 {
12081 break
12082 }
12083 t := v_0.Type
12084 if auxIntToInt16(v_0.AuxInt) != -2 {
12085 break
12086 }
12087 x := v_1
12088 v.reset(OpEq16)
12089 v0 := b.NewValue0(v.Pos, OpConst16, t)
12090 v0.AuxInt = int16ToAuxInt(-1)
12091 v.AddArg2(x, v0)
12092 return true
12093 }
12094 return false
12095 }
12096 func rewriteValuegeneric_OpLess32(v *Value) bool {
12097 v_1 := v.Args[1]
12098 v_0 := v.Args[0]
12099 b := v.Block
12100
12101
12102 for {
12103 if v_0.Op != OpConst32 {
12104 break
12105 }
12106 c := auxIntToInt32(v_0.AuxInt)
12107 if v_1.Op != OpConst32 {
12108 break
12109 }
12110 d := auxIntToInt32(v_1.AuxInt)
12111 v.reset(OpConstBool)
12112 v.AuxInt = boolToAuxInt(c < d)
12113 return true
12114 }
12115
12116
12117
12118 for {
12119 if v_0.Op != OpConst32 {
12120 break
12121 }
12122 t := v_0.Type
12123 if auxIntToInt32(v_0.AuxInt) != 0 {
12124 break
12125 }
12126 x := v_1
12127 if !(isNonNegative(x)) {
12128 break
12129 }
12130 v.reset(OpNeq32)
12131 v0 := b.NewValue0(v.Pos, OpConst32, t)
12132 v0.AuxInt = int32ToAuxInt(0)
12133 v.AddArg2(v0, x)
12134 return true
12135 }
12136
12137
12138
12139 for {
12140 x := v_0
12141 if v_1.Op != OpConst32 {
12142 break
12143 }
12144 t := v_1.Type
12145 if auxIntToInt32(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
12146 break
12147 }
12148 v.reset(OpEq32)
12149 v0 := b.NewValue0(v.Pos, OpConst32, t)
12150 v0.AuxInt = int32ToAuxInt(0)
12151 v.AddArg2(v0, x)
12152 return true
12153 }
12154
12155
12156 for {
12157 x := v_0
12158 if v_1.Op != OpConst32 {
12159 break
12160 }
12161 t := v_1.Type
12162 if auxIntToInt32(v_1.AuxInt) != 1 {
12163 break
12164 }
12165 v.reset(OpLeq32)
12166 v0 := b.NewValue0(v.Pos, OpConst32, t)
12167 v0.AuxInt = int32ToAuxInt(0)
12168 v.AddArg2(x, v0)
12169 return true
12170 }
12171
12172
12173 for {
12174 if v_0.Op != OpConst32 {
12175 break
12176 }
12177 t := v_0.Type
12178 if auxIntToInt32(v_0.AuxInt) != -1 {
12179 break
12180 }
12181 x := v_1
12182 v.reset(OpLeq32)
12183 v0 := b.NewValue0(v.Pos, OpConst32, t)
12184 v0.AuxInt = int32ToAuxInt(0)
12185 v.AddArg2(v0, x)
12186 return true
12187 }
12188
12189
12190 for {
12191 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != math.MinInt32 {
12192 break
12193 }
12194 v.reset(OpConstBool)
12195 v.AuxInt = boolToAuxInt(false)
12196 return true
12197 }
12198
12199
12200 for {
12201 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != math.MaxInt32 {
12202 break
12203 }
12204 v.reset(OpConstBool)
12205 v.AuxInt = boolToAuxInt(false)
12206 return true
12207 }
12208
12209
12210 for {
12211 x := v_0
12212 if v_1.Op != OpConst32 {
12213 break
12214 }
12215 t := v_1.Type
12216 if auxIntToInt32(v_1.AuxInt) != math.MinInt32+1 {
12217 break
12218 }
12219 v.reset(OpEq32)
12220 v0 := b.NewValue0(v.Pos, OpConst32, t)
12221 v0.AuxInt = int32ToAuxInt(math.MinInt32)
12222 v.AddArg2(x, v0)
12223 return true
12224 }
12225
12226
12227 for {
12228 if v_0.Op != OpConst32 {
12229 break
12230 }
12231 t := v_0.Type
12232 if auxIntToInt32(v_0.AuxInt) != math.MaxInt32-1 {
12233 break
12234 }
12235 x := v_1
12236 v.reset(OpEq32)
12237 v0 := b.NewValue0(v.Pos, OpConst32, t)
12238 v0.AuxInt = int32ToAuxInt(math.MaxInt32)
12239 v.AddArg2(x, v0)
12240 return true
12241 }
12242 return false
12243 }
12244 func rewriteValuegeneric_OpLess32F(v *Value) bool {
12245 v_1 := v.Args[1]
12246 v_0 := v.Args[0]
12247
12248
12249 for {
12250 if v_0.Op != OpConst32F {
12251 break
12252 }
12253 c := auxIntToFloat32(v_0.AuxInt)
12254 if v_1.Op != OpConst32F {
12255 break
12256 }
12257 d := auxIntToFloat32(v_1.AuxInt)
12258 v.reset(OpConstBool)
12259 v.AuxInt = boolToAuxInt(c < d)
12260 return true
12261 }
12262 return false
12263 }
12264 func rewriteValuegeneric_OpLess32U(v *Value) bool {
12265 v_1 := v.Args[1]
12266 v_0 := v.Args[0]
12267 b := v.Block
12268
12269
12270 for {
12271 if v_0.Op != OpConst32 {
12272 break
12273 }
12274 c := auxIntToInt32(v_0.AuxInt)
12275 if v_1.Op != OpConst32 {
12276 break
12277 }
12278 d := auxIntToInt32(v_1.AuxInt)
12279 v.reset(OpConstBool)
12280 v.AuxInt = boolToAuxInt(uint32(c) < uint32(d))
12281 return true
12282 }
12283
12284
12285 for {
12286 x := v_0
12287 if v_1.Op != OpConst32 {
12288 break
12289 }
12290 t := v_1.Type
12291 if auxIntToInt32(v_1.AuxInt) != 1 {
12292 break
12293 }
12294 v.reset(OpEq32)
12295 v0 := b.NewValue0(v.Pos, OpConst32, t)
12296 v0.AuxInt = int32ToAuxInt(0)
12297 v.AddArg2(v0, x)
12298 return true
12299 }
12300
12301
12302 for {
12303 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
12304 break
12305 }
12306 v.reset(OpConstBool)
12307 v.AuxInt = boolToAuxInt(false)
12308 return true
12309 }
12310
12311
12312 for {
12313 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
12314 break
12315 }
12316 v.reset(OpConstBool)
12317 v.AuxInt = boolToAuxInt(false)
12318 return true
12319 }
12320
12321
12322 for {
12323 x := v_0
12324 if v_1.Op != OpConst32 {
12325 break
12326 }
12327 t := v_1.Type
12328 if auxIntToInt32(v_1.AuxInt) != 1 {
12329 break
12330 }
12331 v.reset(OpEq32)
12332 v0 := b.NewValue0(v.Pos, OpConst32, t)
12333 v0.AuxInt = int32ToAuxInt(0)
12334 v.AddArg2(x, v0)
12335 return true
12336 }
12337
12338
12339 for {
12340 if v_0.Op != OpConst32 {
12341 break
12342 }
12343 t := v_0.Type
12344 if auxIntToInt32(v_0.AuxInt) != -2 {
12345 break
12346 }
12347 x := v_1
12348 v.reset(OpEq32)
12349 v0 := b.NewValue0(v.Pos, OpConst32, t)
12350 v0.AuxInt = int32ToAuxInt(-1)
12351 v.AddArg2(x, v0)
12352 return true
12353 }
12354 return false
12355 }
12356 func rewriteValuegeneric_OpLess64(v *Value) bool {
12357 v_1 := v.Args[1]
12358 v_0 := v.Args[0]
12359 b := v.Block
12360
12361
12362 for {
12363 if v_0.Op != OpConst64 {
12364 break
12365 }
12366 c := auxIntToInt64(v_0.AuxInt)
12367 if v_1.Op != OpConst64 {
12368 break
12369 }
12370 d := auxIntToInt64(v_1.AuxInt)
12371 v.reset(OpConstBool)
12372 v.AuxInt = boolToAuxInt(c < d)
12373 return true
12374 }
12375
12376
12377
12378 for {
12379 if v_0.Op != OpConst64 {
12380 break
12381 }
12382 t := v_0.Type
12383 if auxIntToInt64(v_0.AuxInt) != 0 {
12384 break
12385 }
12386 x := v_1
12387 if !(isNonNegative(x)) {
12388 break
12389 }
12390 v.reset(OpNeq64)
12391 v0 := b.NewValue0(v.Pos, OpConst64, t)
12392 v0.AuxInt = int64ToAuxInt(0)
12393 v.AddArg2(v0, x)
12394 return true
12395 }
12396
12397
12398
12399 for {
12400 x := v_0
12401 if v_1.Op != OpConst64 {
12402 break
12403 }
12404 t := v_1.Type
12405 if auxIntToInt64(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
12406 break
12407 }
12408 v.reset(OpEq64)
12409 v0 := b.NewValue0(v.Pos, OpConst64, t)
12410 v0.AuxInt = int64ToAuxInt(0)
12411 v.AddArg2(v0, x)
12412 return true
12413 }
12414
12415
12416 for {
12417 x := v_0
12418 if v_1.Op != OpConst64 {
12419 break
12420 }
12421 t := v_1.Type
12422 if auxIntToInt64(v_1.AuxInt) != 1 {
12423 break
12424 }
12425 v.reset(OpLeq64)
12426 v0 := b.NewValue0(v.Pos, OpConst64, t)
12427 v0.AuxInt = int64ToAuxInt(0)
12428 v.AddArg2(x, v0)
12429 return true
12430 }
12431
12432
12433 for {
12434 if v_0.Op != OpConst64 {
12435 break
12436 }
12437 t := v_0.Type
12438 if auxIntToInt64(v_0.AuxInt) != -1 {
12439 break
12440 }
12441 x := v_1
12442 v.reset(OpLeq64)
12443 v0 := b.NewValue0(v.Pos, OpConst64, t)
12444 v0.AuxInt = int64ToAuxInt(0)
12445 v.AddArg2(v0, x)
12446 return true
12447 }
12448
12449
12450 for {
12451 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != math.MinInt64 {
12452 break
12453 }
12454 v.reset(OpConstBool)
12455 v.AuxInt = boolToAuxInt(false)
12456 return true
12457 }
12458
12459
12460 for {
12461 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != math.MaxInt64 {
12462 break
12463 }
12464 v.reset(OpConstBool)
12465 v.AuxInt = boolToAuxInt(false)
12466 return true
12467 }
12468
12469
12470 for {
12471 x := v_0
12472 if v_1.Op != OpConst64 {
12473 break
12474 }
12475 t := v_1.Type
12476 if auxIntToInt64(v_1.AuxInt) != math.MinInt64+1 {
12477 break
12478 }
12479 v.reset(OpEq64)
12480 v0 := b.NewValue0(v.Pos, OpConst64, t)
12481 v0.AuxInt = int64ToAuxInt(math.MinInt64)
12482 v.AddArg2(x, v0)
12483 return true
12484 }
12485
12486
12487 for {
12488 if v_0.Op != OpConst64 {
12489 break
12490 }
12491 t := v_0.Type
12492 if auxIntToInt64(v_0.AuxInt) != math.MaxInt64-1 {
12493 break
12494 }
12495 x := v_1
12496 v.reset(OpEq64)
12497 v0 := b.NewValue0(v.Pos, OpConst64, t)
12498 v0.AuxInt = int64ToAuxInt(math.MaxInt64)
12499 v.AddArg2(x, v0)
12500 return true
12501 }
12502 return false
12503 }
12504 func rewriteValuegeneric_OpLess64F(v *Value) bool {
12505 v_1 := v.Args[1]
12506 v_0 := v.Args[0]
12507
12508
12509 for {
12510 if v_0.Op != OpConst64F {
12511 break
12512 }
12513 c := auxIntToFloat64(v_0.AuxInt)
12514 if v_1.Op != OpConst64F {
12515 break
12516 }
12517 d := auxIntToFloat64(v_1.AuxInt)
12518 v.reset(OpConstBool)
12519 v.AuxInt = boolToAuxInt(c < d)
12520 return true
12521 }
12522 return false
12523 }
12524 func rewriteValuegeneric_OpLess64U(v *Value) bool {
12525 v_1 := v.Args[1]
12526 v_0 := v.Args[0]
12527 b := v.Block
12528
12529
12530 for {
12531 if v_0.Op != OpConst64 {
12532 break
12533 }
12534 c := auxIntToInt64(v_0.AuxInt)
12535 if v_1.Op != OpConst64 {
12536 break
12537 }
12538 d := auxIntToInt64(v_1.AuxInt)
12539 v.reset(OpConstBool)
12540 v.AuxInt = boolToAuxInt(uint64(c) < uint64(d))
12541 return true
12542 }
12543
12544
12545 for {
12546 x := v_0
12547 if v_1.Op != OpConst64 {
12548 break
12549 }
12550 t := v_1.Type
12551 if auxIntToInt64(v_1.AuxInt) != 1 {
12552 break
12553 }
12554 v.reset(OpEq64)
12555 v0 := b.NewValue0(v.Pos, OpConst64, t)
12556 v0.AuxInt = int64ToAuxInt(0)
12557 v.AddArg2(v0, x)
12558 return true
12559 }
12560
12561
12562 for {
12563 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
12564 break
12565 }
12566 v.reset(OpConstBool)
12567 v.AuxInt = boolToAuxInt(false)
12568 return true
12569 }
12570
12571
12572 for {
12573 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
12574 break
12575 }
12576 v.reset(OpConstBool)
12577 v.AuxInt = boolToAuxInt(false)
12578 return true
12579 }
12580
12581
12582 for {
12583 x := v_0
12584 if v_1.Op != OpConst64 {
12585 break
12586 }
12587 t := v_1.Type
12588 if auxIntToInt64(v_1.AuxInt) != 1 {
12589 break
12590 }
12591 v.reset(OpEq64)
12592 v0 := b.NewValue0(v.Pos, OpConst64, t)
12593 v0.AuxInt = int64ToAuxInt(0)
12594 v.AddArg2(x, v0)
12595 return true
12596 }
12597
12598
12599 for {
12600 if v_0.Op != OpConst64 {
12601 break
12602 }
12603 t := v_0.Type
12604 if auxIntToInt64(v_0.AuxInt) != -2 {
12605 break
12606 }
12607 x := v_1
12608 v.reset(OpEq64)
12609 v0 := b.NewValue0(v.Pos, OpConst64, t)
12610 v0.AuxInt = int64ToAuxInt(-1)
12611 v.AddArg2(x, v0)
12612 return true
12613 }
12614 return false
12615 }
12616 func rewriteValuegeneric_OpLess8(v *Value) bool {
12617 v_1 := v.Args[1]
12618 v_0 := v.Args[0]
12619 b := v.Block
12620
12621
12622 for {
12623 if v_0.Op != OpConst8 {
12624 break
12625 }
12626 c := auxIntToInt8(v_0.AuxInt)
12627 if v_1.Op != OpConst8 {
12628 break
12629 }
12630 d := auxIntToInt8(v_1.AuxInt)
12631 v.reset(OpConstBool)
12632 v.AuxInt = boolToAuxInt(c < d)
12633 return true
12634 }
12635
12636
12637
12638 for {
12639 if v_0.Op != OpConst8 {
12640 break
12641 }
12642 t := v_0.Type
12643 if auxIntToInt8(v_0.AuxInt) != 0 {
12644 break
12645 }
12646 x := v_1
12647 if !(isNonNegative(x)) {
12648 break
12649 }
12650 v.reset(OpNeq8)
12651 v0 := b.NewValue0(v.Pos, OpConst8, t)
12652 v0.AuxInt = int8ToAuxInt(0)
12653 v.AddArg2(v0, x)
12654 return true
12655 }
12656
12657
12658
12659 for {
12660 x := v_0
12661 if v_1.Op != OpConst8 {
12662 break
12663 }
12664 t := v_1.Type
12665 if auxIntToInt8(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
12666 break
12667 }
12668 v.reset(OpEq8)
12669 v0 := b.NewValue0(v.Pos, OpConst8, t)
12670 v0.AuxInt = int8ToAuxInt(0)
12671 v.AddArg2(v0, x)
12672 return true
12673 }
12674
12675
12676 for {
12677 x := v_0
12678 if v_1.Op != OpConst8 {
12679 break
12680 }
12681 t := v_1.Type
12682 if auxIntToInt8(v_1.AuxInt) != 1 {
12683 break
12684 }
12685 v.reset(OpLeq8)
12686 v0 := b.NewValue0(v.Pos, OpConst8, t)
12687 v0.AuxInt = int8ToAuxInt(0)
12688 v.AddArg2(x, v0)
12689 return true
12690 }
12691
12692
12693 for {
12694 if v_0.Op != OpConst8 {
12695 break
12696 }
12697 t := v_0.Type
12698 if auxIntToInt8(v_0.AuxInt) != -1 {
12699 break
12700 }
12701 x := v_1
12702 v.reset(OpLeq8)
12703 v0 := b.NewValue0(v.Pos, OpConst8, t)
12704 v0.AuxInt = int8ToAuxInt(0)
12705 v.AddArg2(v0, x)
12706 return true
12707 }
12708
12709
12710 for {
12711 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != math.MinInt8 {
12712 break
12713 }
12714 v.reset(OpConstBool)
12715 v.AuxInt = boolToAuxInt(false)
12716 return true
12717 }
12718
12719
12720 for {
12721 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != math.MaxInt8 {
12722 break
12723 }
12724 v.reset(OpConstBool)
12725 v.AuxInt = boolToAuxInt(false)
12726 return true
12727 }
12728
12729
12730 for {
12731 x := v_0
12732 if v_1.Op != OpConst8 {
12733 break
12734 }
12735 t := v_1.Type
12736 if auxIntToInt8(v_1.AuxInt) != math.MinInt8+1 {
12737 break
12738 }
12739 v.reset(OpEq8)
12740 v0 := b.NewValue0(v.Pos, OpConst8, t)
12741 v0.AuxInt = int8ToAuxInt(math.MinInt8)
12742 v.AddArg2(x, v0)
12743 return true
12744 }
12745
12746
12747 for {
12748 if v_0.Op != OpConst8 {
12749 break
12750 }
12751 t := v_0.Type
12752 if auxIntToInt8(v_0.AuxInt) != math.MaxInt8-1 {
12753 break
12754 }
12755 x := v_1
12756 v.reset(OpEq8)
12757 v0 := b.NewValue0(v.Pos, OpConst8, t)
12758 v0.AuxInt = int8ToAuxInt(math.MaxInt8)
12759 v.AddArg2(x, v0)
12760 return true
12761 }
12762 return false
12763 }
12764 func rewriteValuegeneric_OpLess8U(v *Value) bool {
12765 v_1 := v.Args[1]
12766 v_0 := v.Args[0]
12767 b := v.Block
12768
12769
12770 for {
12771 if v_0.Op != OpConst8 {
12772 break
12773 }
12774 c := auxIntToInt8(v_0.AuxInt)
12775 if v_1.Op != OpConst8 {
12776 break
12777 }
12778 d := auxIntToInt8(v_1.AuxInt)
12779 v.reset(OpConstBool)
12780 v.AuxInt = boolToAuxInt(uint8(c) < uint8(d))
12781 return true
12782 }
12783
12784
12785 for {
12786 x := v_0
12787 if v_1.Op != OpConst8 {
12788 break
12789 }
12790 t := v_1.Type
12791 if auxIntToInt8(v_1.AuxInt) != 1 {
12792 break
12793 }
12794 v.reset(OpEq8)
12795 v0 := b.NewValue0(v.Pos, OpConst8, t)
12796 v0.AuxInt = int8ToAuxInt(0)
12797 v.AddArg2(v0, x)
12798 return true
12799 }
12800
12801
12802 for {
12803 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
12804 break
12805 }
12806 v.reset(OpConstBool)
12807 v.AuxInt = boolToAuxInt(false)
12808 return true
12809 }
12810
12811
12812 for {
12813 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
12814 break
12815 }
12816 v.reset(OpConstBool)
12817 v.AuxInt = boolToAuxInt(false)
12818 return true
12819 }
12820
12821
12822 for {
12823 x := v_0
12824 if v_1.Op != OpConst8 {
12825 break
12826 }
12827 t := v_1.Type
12828 if auxIntToInt8(v_1.AuxInt) != 1 {
12829 break
12830 }
12831 v.reset(OpEq8)
12832 v0 := b.NewValue0(v.Pos, OpConst8, t)
12833 v0.AuxInt = int8ToAuxInt(0)
12834 v.AddArg2(x, v0)
12835 return true
12836 }
12837
12838
12839 for {
12840 if v_0.Op != OpConst8 {
12841 break
12842 }
12843 t := v_0.Type
12844 if auxIntToInt8(v_0.AuxInt) != -2 {
12845 break
12846 }
12847 x := v_1
12848 v.reset(OpEq8)
12849 v0 := b.NewValue0(v.Pos, OpConst8, t)
12850 v0.AuxInt = int8ToAuxInt(-1)
12851 v.AddArg2(x, v0)
12852 return true
12853 }
12854 return false
12855 }
12856 func rewriteValuegeneric_OpLoad(v *Value) bool {
12857 v_1 := v.Args[1]
12858 v_0 := v.Args[0]
12859 b := v.Block
12860 config := b.Func.Config
12861 typ := &b.Func.Config.Types
12862
12863
12864
12865 for {
12866 t1 := v.Type
12867 p1 := v_0
12868 if v_1.Op != OpStore {
12869 break
12870 }
12871 t2 := auxToType(v_1.Aux)
12872 x := v_1.Args[1]
12873 p2 := v_1.Args[0]
12874 if !(isSamePtr(p1, p2) && copyCompatibleType(t1, x.Type) && t1.Size() == t2.Size()) {
12875 break
12876 }
12877 v.copyOf(x)
12878 return true
12879 }
12880
12881
12882
12883 for {
12884 t1 := v.Type
12885 p1 := v_0
12886 if v_1.Op != OpStore {
12887 break
12888 }
12889 t2 := auxToType(v_1.Aux)
12890 _ = v_1.Args[2]
12891 p2 := v_1.Args[0]
12892 v_1_2 := v_1.Args[2]
12893 if v_1_2.Op != OpStore {
12894 break
12895 }
12896 t3 := auxToType(v_1_2.Aux)
12897 x := v_1_2.Args[1]
12898 p3 := v_1_2.Args[0]
12899 if !(isSamePtr(p1, p3) && copyCompatibleType(t1, x.Type) && t1.Size() == t3.Size() && disjoint(p3, t3.Size(), p2, t2.Size())) {
12900 break
12901 }
12902 v.copyOf(x)
12903 return true
12904 }
12905
12906
12907
12908 for {
12909 t1 := v.Type
12910 p1 := v_0
12911 if v_1.Op != OpStore {
12912 break
12913 }
12914 t2 := auxToType(v_1.Aux)
12915 _ = v_1.Args[2]
12916 p2 := v_1.Args[0]
12917 v_1_2 := v_1.Args[2]
12918 if v_1_2.Op != OpStore {
12919 break
12920 }
12921 t3 := auxToType(v_1_2.Aux)
12922 _ = v_1_2.Args[2]
12923 p3 := v_1_2.Args[0]
12924 v_1_2_2 := v_1_2.Args[2]
12925 if v_1_2_2.Op != OpStore {
12926 break
12927 }
12928 t4 := auxToType(v_1_2_2.Aux)
12929 x := v_1_2_2.Args[1]
12930 p4 := v_1_2_2.Args[0]
12931 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())) {
12932 break
12933 }
12934 v.copyOf(x)
12935 return true
12936 }
12937
12938
12939
12940 for {
12941 t1 := v.Type
12942 p1 := v_0
12943 if v_1.Op != OpStore {
12944 break
12945 }
12946 t2 := auxToType(v_1.Aux)
12947 _ = v_1.Args[2]
12948 p2 := v_1.Args[0]
12949 v_1_2 := v_1.Args[2]
12950 if v_1_2.Op != OpStore {
12951 break
12952 }
12953 t3 := auxToType(v_1_2.Aux)
12954 _ = v_1_2.Args[2]
12955 p3 := v_1_2.Args[0]
12956 v_1_2_2 := v_1_2.Args[2]
12957 if v_1_2_2.Op != OpStore {
12958 break
12959 }
12960 t4 := auxToType(v_1_2_2.Aux)
12961 _ = v_1_2_2.Args[2]
12962 p4 := v_1_2_2.Args[0]
12963 v_1_2_2_2 := v_1_2_2.Args[2]
12964 if v_1_2_2_2.Op != OpStore {
12965 break
12966 }
12967 t5 := auxToType(v_1_2_2_2.Aux)
12968 x := v_1_2_2_2.Args[1]
12969 p5 := v_1_2_2_2.Args[0]
12970 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())) {
12971 break
12972 }
12973 v.copyOf(x)
12974 return true
12975 }
12976
12977
12978
12979 for {
12980 t1 := v.Type
12981 op := v_0
12982 if op.Op != OpOffPtr {
12983 break
12984 }
12985 o1 := auxIntToInt64(op.AuxInt)
12986 p1 := op.Args[0]
12987 move := v_1
12988 if move.Op != OpMove {
12989 break
12990 }
12991 n := auxIntToInt64(move.AuxInt)
12992 mem := move.Args[2]
12993 p2 := move.Args[0]
12994 src := move.Args[1]
12995 if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p2) && !isVolatile(src)) {
12996 break
12997 }
12998 b = move.Block
12999 v0 := b.NewValue0(v.Pos, OpLoad, t1)
13000 v.copyOf(v0)
13001 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
13002 v1.AuxInt = int64ToAuxInt(o1)
13003 v1.AddArg(src)
13004 v0.AddArg2(v1, mem)
13005 return true
13006 }
13007
13008
13009
13010 for {
13011 t1 := v.Type
13012 p1 := v_0
13013 if v_1.Op != OpStore {
13014 break
13015 }
13016 t2 := auxToType(v_1.Aux)
13017 _ = v_1.Args[1]
13018 p2 := v_1.Args[0]
13019 v_1_1 := v_1.Args[1]
13020 if v_1_1.Op != OpConst64 {
13021 break
13022 }
13023 x := auxIntToInt64(v_1_1.AuxInt)
13024 if !(isSamePtr(p1, p2) && t2.Size() == 8 && is64BitFloat(t1) && !math.IsNaN(math.Float64frombits(uint64(x)))) {
13025 break
13026 }
13027 v.reset(OpConst64F)
13028 v.AuxInt = float64ToAuxInt(math.Float64frombits(uint64(x)))
13029 return true
13030 }
13031
13032
13033
13034 for {
13035 t1 := v.Type
13036 p1 := v_0
13037 if v_1.Op != OpStore {
13038 break
13039 }
13040 t2 := auxToType(v_1.Aux)
13041 _ = v_1.Args[1]
13042 p2 := v_1.Args[0]
13043 v_1_1 := v_1.Args[1]
13044 if v_1_1.Op != OpConst32 {
13045 break
13046 }
13047 x := auxIntToInt32(v_1_1.AuxInt)
13048 if !(isSamePtr(p1, p2) && t2.Size() == 4 && is32BitFloat(t1) && !math.IsNaN(float64(math.Float32frombits(uint32(x))))) {
13049 break
13050 }
13051 v.reset(OpConst32F)
13052 v.AuxInt = float32ToAuxInt(math.Float32frombits(uint32(x)))
13053 return true
13054 }
13055
13056
13057
13058 for {
13059 t1 := v.Type
13060 p1 := v_0
13061 if v_1.Op != OpStore {
13062 break
13063 }
13064 t2 := auxToType(v_1.Aux)
13065 _ = v_1.Args[1]
13066 p2 := v_1.Args[0]
13067 v_1_1 := v_1.Args[1]
13068 if v_1_1.Op != OpConst64F {
13069 break
13070 }
13071 x := auxIntToFloat64(v_1_1.AuxInt)
13072 if !(isSamePtr(p1, p2) && t2.Size() == 8 && is64BitInt(t1)) {
13073 break
13074 }
13075 v.reset(OpConst64)
13076 v.AuxInt = int64ToAuxInt(int64(math.Float64bits(x)))
13077 return true
13078 }
13079
13080
13081
13082 for {
13083 t1 := v.Type
13084 p1 := v_0
13085 if v_1.Op != OpStore {
13086 break
13087 }
13088 t2 := auxToType(v_1.Aux)
13089 _ = v_1.Args[1]
13090 p2 := v_1.Args[0]
13091 v_1_1 := v_1.Args[1]
13092 if v_1_1.Op != OpConst32F {
13093 break
13094 }
13095 x := auxIntToFloat32(v_1_1.AuxInt)
13096 if !(isSamePtr(p1, p2) && t2.Size() == 4 && is32BitInt(t1)) {
13097 break
13098 }
13099 v.reset(OpConst32)
13100 v.AuxInt = int32ToAuxInt(int32(math.Float32bits(x)))
13101 return true
13102 }
13103
13104
13105
13106 for {
13107 t1 := v.Type
13108 op := v_0
13109 if op.Op != OpOffPtr {
13110 break
13111 }
13112 o1 := auxIntToInt64(op.AuxInt)
13113 p1 := op.Args[0]
13114 if v_1.Op != OpStore {
13115 break
13116 }
13117 t2 := auxToType(v_1.Aux)
13118 _ = v_1.Args[2]
13119 p2 := v_1.Args[0]
13120 mem := v_1.Args[2]
13121 if mem.Op != OpZero {
13122 break
13123 }
13124 n := auxIntToInt64(mem.AuxInt)
13125 p3 := mem.Args[0]
13126 if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p3) && CanSSA(t1) && disjoint(op, t1.Size(), p2, t2.Size())) {
13127 break
13128 }
13129 b = mem.Block
13130 v0 := b.NewValue0(v.Pos, OpLoad, t1)
13131 v.copyOf(v0)
13132 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
13133 v1.AuxInt = int64ToAuxInt(o1)
13134 v1.AddArg(p3)
13135 v0.AddArg2(v1, mem)
13136 return true
13137 }
13138
13139
13140
13141 for {
13142 t1 := v.Type
13143 op := v_0
13144 if op.Op != OpOffPtr {
13145 break
13146 }
13147 o1 := auxIntToInt64(op.AuxInt)
13148 p1 := op.Args[0]
13149 if v_1.Op != OpStore {
13150 break
13151 }
13152 t2 := auxToType(v_1.Aux)
13153 _ = v_1.Args[2]
13154 p2 := v_1.Args[0]
13155 v_1_2 := v_1.Args[2]
13156 if v_1_2.Op != OpStore {
13157 break
13158 }
13159 t3 := auxToType(v_1_2.Aux)
13160 _ = v_1_2.Args[2]
13161 p3 := v_1_2.Args[0]
13162 mem := v_1_2.Args[2]
13163 if mem.Op != OpZero {
13164 break
13165 }
13166 n := auxIntToInt64(mem.AuxInt)
13167 p4 := mem.Args[0]
13168 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())) {
13169 break
13170 }
13171 b = mem.Block
13172 v0 := b.NewValue0(v.Pos, OpLoad, t1)
13173 v.copyOf(v0)
13174 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
13175 v1.AuxInt = int64ToAuxInt(o1)
13176 v1.AddArg(p4)
13177 v0.AddArg2(v1, mem)
13178 return true
13179 }
13180
13181
13182
13183 for {
13184 t1 := v.Type
13185 op := v_0
13186 if op.Op != OpOffPtr {
13187 break
13188 }
13189 o1 := auxIntToInt64(op.AuxInt)
13190 p1 := op.Args[0]
13191 if v_1.Op != OpStore {
13192 break
13193 }
13194 t2 := auxToType(v_1.Aux)
13195 _ = v_1.Args[2]
13196 p2 := v_1.Args[0]
13197 v_1_2 := v_1.Args[2]
13198 if v_1_2.Op != OpStore {
13199 break
13200 }
13201 t3 := auxToType(v_1_2.Aux)
13202 _ = v_1_2.Args[2]
13203 p3 := v_1_2.Args[0]
13204 v_1_2_2 := v_1_2.Args[2]
13205 if v_1_2_2.Op != OpStore {
13206 break
13207 }
13208 t4 := auxToType(v_1_2_2.Aux)
13209 _ = v_1_2_2.Args[2]
13210 p4 := v_1_2_2.Args[0]
13211 mem := v_1_2_2.Args[2]
13212 if mem.Op != OpZero {
13213 break
13214 }
13215 n := auxIntToInt64(mem.AuxInt)
13216 p5 := mem.Args[0]
13217 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())) {
13218 break
13219 }
13220 b = mem.Block
13221 v0 := b.NewValue0(v.Pos, OpLoad, t1)
13222 v.copyOf(v0)
13223 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
13224 v1.AuxInt = int64ToAuxInt(o1)
13225 v1.AddArg(p5)
13226 v0.AddArg2(v1, mem)
13227 return true
13228 }
13229
13230
13231
13232 for {
13233 t1 := v.Type
13234 op := v_0
13235 if op.Op != OpOffPtr {
13236 break
13237 }
13238 o1 := auxIntToInt64(op.AuxInt)
13239 p1 := op.Args[0]
13240 if v_1.Op != OpStore {
13241 break
13242 }
13243 t2 := auxToType(v_1.Aux)
13244 _ = v_1.Args[2]
13245 p2 := v_1.Args[0]
13246 v_1_2 := v_1.Args[2]
13247 if v_1_2.Op != OpStore {
13248 break
13249 }
13250 t3 := auxToType(v_1_2.Aux)
13251 _ = v_1_2.Args[2]
13252 p3 := v_1_2.Args[0]
13253 v_1_2_2 := v_1_2.Args[2]
13254 if v_1_2_2.Op != OpStore {
13255 break
13256 }
13257 t4 := auxToType(v_1_2_2.Aux)
13258 _ = v_1_2_2.Args[2]
13259 p4 := v_1_2_2.Args[0]
13260 v_1_2_2_2 := v_1_2_2.Args[2]
13261 if v_1_2_2_2.Op != OpStore {
13262 break
13263 }
13264 t5 := auxToType(v_1_2_2_2.Aux)
13265 _ = v_1_2_2_2.Args[2]
13266 p5 := v_1_2_2_2.Args[0]
13267 mem := v_1_2_2_2.Args[2]
13268 if mem.Op != OpZero {
13269 break
13270 }
13271 n := auxIntToInt64(mem.AuxInt)
13272 p6 := mem.Args[0]
13273 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())) {
13274 break
13275 }
13276 b = mem.Block
13277 v0 := b.NewValue0(v.Pos, OpLoad, t1)
13278 v.copyOf(v0)
13279 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
13280 v1.AuxInt = int64ToAuxInt(o1)
13281 v1.AddArg(p6)
13282 v0.AddArg2(v1, mem)
13283 return true
13284 }
13285
13286
13287
13288 for {
13289 t1 := v.Type
13290 if v_0.Op != OpOffPtr {
13291 break
13292 }
13293 o := auxIntToInt64(v_0.AuxInt)
13294 p1 := v_0.Args[0]
13295 if v_1.Op != OpZero {
13296 break
13297 }
13298 n := auxIntToInt64(v_1.AuxInt)
13299 p2 := v_1.Args[0]
13300 if !(t1.IsBoolean() && isSamePtr(p1, p2) && n >= o+1) {
13301 break
13302 }
13303 v.reset(OpConstBool)
13304 v.AuxInt = boolToAuxInt(false)
13305 return true
13306 }
13307
13308
13309
13310 for {
13311 t1 := v.Type
13312 if v_0.Op != OpOffPtr {
13313 break
13314 }
13315 o := auxIntToInt64(v_0.AuxInt)
13316 p1 := v_0.Args[0]
13317 if v_1.Op != OpZero {
13318 break
13319 }
13320 n := auxIntToInt64(v_1.AuxInt)
13321 p2 := v_1.Args[0]
13322 if !(is8BitInt(t1) && isSamePtr(p1, p2) && n >= o+1) {
13323 break
13324 }
13325 v.reset(OpConst8)
13326 v.AuxInt = int8ToAuxInt(0)
13327 return true
13328 }
13329
13330
13331
13332 for {
13333 t1 := v.Type
13334 if v_0.Op != OpOffPtr {
13335 break
13336 }
13337 o := auxIntToInt64(v_0.AuxInt)
13338 p1 := v_0.Args[0]
13339 if v_1.Op != OpZero {
13340 break
13341 }
13342 n := auxIntToInt64(v_1.AuxInt)
13343 p2 := v_1.Args[0]
13344 if !(is16BitInt(t1) && isSamePtr(p1, p2) && n >= o+2) {
13345 break
13346 }
13347 v.reset(OpConst16)
13348 v.AuxInt = int16ToAuxInt(0)
13349 return true
13350 }
13351
13352
13353
13354 for {
13355 t1 := v.Type
13356 if v_0.Op != OpOffPtr {
13357 break
13358 }
13359 o := auxIntToInt64(v_0.AuxInt)
13360 p1 := v_0.Args[0]
13361 if v_1.Op != OpZero {
13362 break
13363 }
13364 n := auxIntToInt64(v_1.AuxInt)
13365 p2 := v_1.Args[0]
13366 if !(is32BitInt(t1) && isSamePtr(p1, p2) && n >= o+4) {
13367 break
13368 }
13369 v.reset(OpConst32)
13370 v.AuxInt = int32ToAuxInt(0)
13371 return true
13372 }
13373
13374
13375
13376 for {
13377 t1 := v.Type
13378 if v_0.Op != OpOffPtr {
13379 break
13380 }
13381 o := auxIntToInt64(v_0.AuxInt)
13382 p1 := v_0.Args[0]
13383 if v_1.Op != OpZero {
13384 break
13385 }
13386 n := auxIntToInt64(v_1.AuxInt)
13387 p2 := v_1.Args[0]
13388 if !(is64BitInt(t1) && isSamePtr(p1, p2) && n >= o+8) {
13389 break
13390 }
13391 v.reset(OpConst64)
13392 v.AuxInt = int64ToAuxInt(0)
13393 return true
13394 }
13395
13396
13397
13398 for {
13399 t1 := v.Type
13400 if v_0.Op != OpOffPtr {
13401 break
13402 }
13403 o := auxIntToInt64(v_0.AuxInt)
13404 p1 := v_0.Args[0]
13405 if v_1.Op != OpZero {
13406 break
13407 }
13408 n := auxIntToInt64(v_1.AuxInt)
13409 p2 := v_1.Args[0]
13410 if !(is32BitFloat(t1) && isSamePtr(p1, p2) && n >= o+4) {
13411 break
13412 }
13413 v.reset(OpConst32F)
13414 v.AuxInt = float32ToAuxInt(0)
13415 return true
13416 }
13417
13418
13419
13420 for {
13421 t1 := v.Type
13422 if v_0.Op != OpOffPtr {
13423 break
13424 }
13425 o := auxIntToInt64(v_0.AuxInt)
13426 p1 := v_0.Args[0]
13427 if v_1.Op != OpZero {
13428 break
13429 }
13430 n := auxIntToInt64(v_1.AuxInt)
13431 p2 := v_1.Args[0]
13432 if !(is64BitFloat(t1) && isSamePtr(p1, p2) && n >= o+8) {
13433 break
13434 }
13435 v.reset(OpConst64F)
13436 v.AuxInt = float64ToAuxInt(0)
13437 return true
13438 }
13439
13440
13441
13442 for {
13443 t := v.Type
13444 if !(t.IsStruct() && t.Size() > 0 && CanSSA(t) && !t.IsSIMD()) {
13445 break
13446 }
13447 v.copyOf(rewriteStructLoad(v))
13448 return true
13449 }
13450
13451
13452
13453 for {
13454 t := v.Type
13455 ptr := v_0
13456 mem := v_1
13457 if !(t.IsArray() && t.NumElem() == 1 && CanSSA(t)) {
13458 break
13459 }
13460 v.reset(OpArrayMake1)
13461 v0 := b.NewValue0(v.Pos, OpLoad, t.Elem())
13462 v0.AddArg2(ptr, mem)
13463 v.AddArg(v0)
13464 return true
13465 }
13466
13467
13468
13469 for {
13470 t := v.Type
13471 if !(t.Size() == 0) {
13472 break
13473 }
13474 v.reset(OpEmpty)
13475 return true
13476 }
13477
13478
13479
13480 for {
13481 if v.Type != typ.Int8 {
13482 break
13483 }
13484 sptr := v_0
13485 if sptr.Op != OpAddr {
13486 break
13487 }
13488 scon := auxToSym(sptr.Aux)
13489 sptr_0 := sptr.Args[0]
13490 if sptr_0.Op != OpSB {
13491 break
13492 }
13493 if !(symIsRO(scon)) {
13494 break
13495 }
13496 v.reset(OpConst8)
13497 v.Type = typ.Int8
13498 v.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
13499 return true
13500 }
13501
13502
13503
13504 for {
13505 if v.Type != typ.Int16 {
13506 break
13507 }
13508 sptr := v_0
13509 if sptr.Op != OpAddr {
13510 break
13511 }
13512 scon := auxToSym(sptr.Aux)
13513 sptr_0 := sptr.Args[0]
13514 if sptr_0.Op != OpSB {
13515 break
13516 }
13517 if !(symIsRO(scon)) {
13518 break
13519 }
13520 v.reset(OpConst16)
13521 v.Type = typ.Int16
13522 v.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
13523 return true
13524 }
13525
13526
13527
13528 for {
13529 if v.Type != typ.Int32 {
13530 break
13531 }
13532 sptr := v_0
13533 if sptr.Op != OpAddr {
13534 break
13535 }
13536 scon := auxToSym(sptr.Aux)
13537 sptr_0 := sptr.Args[0]
13538 if sptr_0.Op != OpSB {
13539 break
13540 }
13541 if !(symIsRO(scon)) {
13542 break
13543 }
13544 v.reset(OpConst32)
13545 v.Type = typ.Int32
13546 v.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
13547 return true
13548 }
13549
13550
13551
13552 for {
13553 if v.Type != typ.Int64 {
13554 break
13555 }
13556 sptr := v_0
13557 if sptr.Op != OpAddr {
13558 break
13559 }
13560 scon := auxToSym(sptr.Aux)
13561 sptr_0 := sptr.Args[0]
13562 if sptr_0.Op != OpSB {
13563 break
13564 }
13565 if !(symIsRO(scon)) {
13566 break
13567 }
13568 v.reset(OpConst64)
13569 v.Type = typ.Int64
13570 v.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
13571 return true
13572 }
13573
13574
13575
13576 for {
13577 if v_0.Op != OpAddr {
13578 break
13579 }
13580 s := auxToSym(v_0.Aux)
13581 sb := v_0.Args[0]
13582 if !(isFixedLoad(v, s, 0)) {
13583 break
13584 }
13585 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
13586 return true
13587 }
13588
13589
13590
13591 for {
13592 if v_0.Op != OpConvert {
13593 break
13594 }
13595 v_0_0 := v_0.Args[0]
13596 if v_0_0.Op != OpAddr {
13597 break
13598 }
13599 s := auxToSym(v_0_0.Aux)
13600 sb := v_0_0.Args[0]
13601 if !(isFixedLoad(v, s, 0)) {
13602 break
13603 }
13604 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
13605 return true
13606 }
13607
13608
13609
13610 for {
13611 if v_0.Op != OpITab {
13612 break
13613 }
13614 v_0_0 := v_0.Args[0]
13615 if v_0_0.Op != OpIMake {
13616 break
13617 }
13618 v_0_0_0 := v_0_0.Args[0]
13619 if v_0_0_0.Op != OpAddr {
13620 break
13621 }
13622 s := auxToSym(v_0_0_0.Aux)
13623 sb := v_0_0_0.Args[0]
13624 if !(isFixedLoad(v, s, 0)) {
13625 break
13626 }
13627 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
13628 return true
13629 }
13630
13631
13632
13633 for {
13634 if v_0.Op != OpITab {
13635 break
13636 }
13637 v_0_0 := v_0.Args[0]
13638 if v_0_0.Op != OpIMake {
13639 break
13640 }
13641 v_0_0_0 := v_0_0.Args[0]
13642 if v_0_0_0.Op != OpConvert {
13643 break
13644 }
13645 v_0_0_0_0 := v_0_0_0.Args[0]
13646 if v_0_0_0_0.Op != OpAddr {
13647 break
13648 }
13649 s := auxToSym(v_0_0_0_0.Aux)
13650 sb := v_0_0_0_0.Args[0]
13651 if !(isFixedLoad(v, s, 0)) {
13652 break
13653 }
13654 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
13655 return true
13656 }
13657
13658
13659
13660 for {
13661 if v_0.Op != OpOffPtr {
13662 break
13663 }
13664 off := auxIntToInt64(v_0.AuxInt)
13665 v_0_0 := v_0.Args[0]
13666 if v_0_0.Op != OpAddr {
13667 break
13668 }
13669 s := auxToSym(v_0_0.Aux)
13670 sb := v_0_0.Args[0]
13671 if !(isFixedLoad(v, s, off)) {
13672 break
13673 }
13674 v.copyOf(rewriteFixedLoad(v, s, sb, off))
13675 return true
13676 }
13677
13678
13679
13680 for {
13681 if v_0.Op != OpOffPtr {
13682 break
13683 }
13684 off := auxIntToInt64(v_0.AuxInt)
13685 v_0_0 := v_0.Args[0]
13686 if v_0_0.Op != OpConvert {
13687 break
13688 }
13689 v_0_0_0 := v_0_0.Args[0]
13690 if v_0_0_0.Op != OpAddr {
13691 break
13692 }
13693 s := auxToSym(v_0_0_0.Aux)
13694 sb := v_0_0_0.Args[0]
13695 if !(isFixedLoad(v, s, off)) {
13696 break
13697 }
13698 v.copyOf(rewriteFixedLoad(v, s, sb, off))
13699 return true
13700 }
13701
13702
13703
13704 for {
13705 if v_0.Op != OpOffPtr {
13706 break
13707 }
13708 off := auxIntToInt64(v_0.AuxInt)
13709 v_0_0 := v_0.Args[0]
13710 if v_0_0.Op != OpITab {
13711 break
13712 }
13713 v_0_0_0 := v_0_0.Args[0]
13714 if v_0_0_0.Op != OpIMake {
13715 break
13716 }
13717 v_0_0_0_0 := v_0_0_0.Args[0]
13718 if v_0_0_0_0.Op != OpAddr {
13719 break
13720 }
13721 s := auxToSym(v_0_0_0_0.Aux)
13722 sb := v_0_0_0_0.Args[0]
13723 if !(isFixedLoad(v, s, off)) {
13724 break
13725 }
13726 v.copyOf(rewriteFixedLoad(v, s, sb, off))
13727 return true
13728 }
13729
13730
13731
13732 for {
13733 if v_0.Op != OpOffPtr {
13734 break
13735 }
13736 off := auxIntToInt64(v_0.AuxInt)
13737 v_0_0 := v_0.Args[0]
13738 if v_0_0.Op != OpITab {
13739 break
13740 }
13741 v_0_0_0 := v_0_0.Args[0]
13742 if v_0_0_0.Op != OpIMake {
13743 break
13744 }
13745 v_0_0_0_0 := v_0_0_0.Args[0]
13746 if v_0_0_0_0.Op != OpConvert {
13747 break
13748 }
13749 v_0_0_0_0_0 := v_0_0_0_0.Args[0]
13750 if v_0_0_0_0_0.Op != OpAddr {
13751 break
13752 }
13753 s := auxToSym(v_0_0_0_0_0.Aux)
13754 sb := v_0_0_0_0_0.Args[0]
13755 if !(isFixedLoad(v, s, off)) {
13756 break
13757 }
13758 v.copyOf(rewriteFixedLoad(v, s, sb, off))
13759 return true
13760 }
13761 return false
13762 }
13763 func rewriteValuegeneric_OpLsh16x16(v *Value) bool {
13764 v_1 := v.Args[1]
13765 v_0 := v.Args[0]
13766 b := v.Block
13767
13768
13769 for {
13770 t := v.Type
13771 x := v_0
13772 if v_1.Op != OpConst16 {
13773 break
13774 }
13775 c := auxIntToInt16(v_1.AuxInt)
13776 v.reset(OpLsh16x64)
13777 v0 := b.NewValue0(v.Pos, OpConst64, t)
13778 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
13779 v.AddArg2(x, v0)
13780 return true
13781 }
13782
13783
13784 for {
13785 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
13786 break
13787 }
13788 v.reset(OpConst16)
13789 v.AuxInt = int16ToAuxInt(0)
13790 return true
13791 }
13792
13793
13794
13795 for {
13796 if auxIntToBool(v.AuxInt) != false {
13797 break
13798 }
13799 x := v_0
13800 con := v_1
13801 if con.Op != OpConst16 {
13802 break
13803 }
13804 c := auxIntToInt16(con.AuxInt)
13805 if !(0 < c && c < 16) {
13806 break
13807 }
13808 v.reset(OpLsh16x16)
13809 v.AuxInt = boolToAuxInt(true)
13810 v.AddArg2(x, con)
13811 return true
13812 }
13813 return false
13814 }
13815 func rewriteValuegeneric_OpLsh16x32(v *Value) bool {
13816 v_1 := v.Args[1]
13817 v_0 := v.Args[0]
13818 b := v.Block
13819
13820
13821 for {
13822 t := v.Type
13823 x := v_0
13824 if v_1.Op != OpConst32 {
13825 break
13826 }
13827 c := auxIntToInt32(v_1.AuxInt)
13828 v.reset(OpLsh16x64)
13829 v0 := b.NewValue0(v.Pos, OpConst64, t)
13830 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
13831 v.AddArg2(x, v0)
13832 return true
13833 }
13834
13835
13836 for {
13837 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
13838 break
13839 }
13840 v.reset(OpConst16)
13841 v.AuxInt = int16ToAuxInt(0)
13842 return true
13843 }
13844
13845
13846
13847 for {
13848 if auxIntToBool(v.AuxInt) != false {
13849 break
13850 }
13851 x := v_0
13852 con := v_1
13853 if con.Op != OpConst32 {
13854 break
13855 }
13856 c := auxIntToInt32(con.AuxInt)
13857 if !(0 < c && c < 16) {
13858 break
13859 }
13860 v.reset(OpLsh16x32)
13861 v.AuxInt = boolToAuxInt(true)
13862 v.AddArg2(x, con)
13863 return true
13864 }
13865 return false
13866 }
13867 func rewriteValuegeneric_OpLsh16x64(v *Value) bool {
13868 v_1 := v.Args[1]
13869 v_0 := v.Args[0]
13870 b := v.Block
13871 typ := &b.Func.Config.Types
13872
13873
13874 for {
13875 if v_0.Op != OpConst16 {
13876 break
13877 }
13878 c := auxIntToInt16(v_0.AuxInt)
13879 if v_1.Op != OpConst64 {
13880 break
13881 }
13882 d := auxIntToInt64(v_1.AuxInt)
13883 v.reset(OpConst16)
13884 v.AuxInt = int16ToAuxInt(c << uint64(d))
13885 return true
13886 }
13887
13888
13889 for {
13890 x := v_0
13891 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
13892 break
13893 }
13894 v.copyOf(x)
13895 return true
13896 }
13897
13898
13899 for {
13900 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
13901 break
13902 }
13903 v.reset(OpConst16)
13904 v.AuxInt = int16ToAuxInt(0)
13905 return true
13906 }
13907
13908
13909
13910 for {
13911 if v_1.Op != OpConst64 {
13912 break
13913 }
13914 c := auxIntToInt64(v_1.AuxInt)
13915 if !(uint64(c) >= 16) {
13916 break
13917 }
13918 v.reset(OpConst16)
13919 v.AuxInt = int16ToAuxInt(0)
13920 return true
13921 }
13922
13923
13924
13925 for {
13926 t := v.Type
13927 if v_0.Op != OpLsh16x64 {
13928 break
13929 }
13930 _ = v_0.Args[1]
13931 x := v_0.Args[0]
13932 v_0_1 := v_0.Args[1]
13933 if v_0_1.Op != OpConst64 {
13934 break
13935 }
13936 c := auxIntToInt64(v_0_1.AuxInt)
13937 if v_1.Op != OpConst64 {
13938 break
13939 }
13940 d := auxIntToInt64(v_1.AuxInt)
13941 if !(!uaddOvf(c, d)) {
13942 break
13943 }
13944 v.reset(OpLsh16x64)
13945 v0 := b.NewValue0(v.Pos, OpConst64, t)
13946 v0.AuxInt = int64ToAuxInt(c + d)
13947 v.AddArg2(x, v0)
13948 return true
13949 }
13950
13951
13952
13953 for {
13954 i := v_0
13955 if i.Op != OpRsh16x64 {
13956 break
13957 }
13958 _ = i.Args[1]
13959 x := i.Args[0]
13960 i_1 := i.Args[1]
13961 if i_1.Op != OpConst64 {
13962 break
13963 }
13964 c := auxIntToInt64(i_1.AuxInt)
13965 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
13966 break
13967 }
13968 v.reset(OpAnd16)
13969 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
13970 v0.AuxInt = int16ToAuxInt(int16(-1) << c)
13971 v.AddArg2(x, v0)
13972 return true
13973 }
13974
13975
13976
13977 for {
13978 i := v_0
13979 if i.Op != OpRsh16Ux64 {
13980 break
13981 }
13982 _ = i.Args[1]
13983 x := i.Args[0]
13984 i_1 := i.Args[1]
13985 if i_1.Op != OpConst64 {
13986 break
13987 }
13988 c := auxIntToInt64(i_1.AuxInt)
13989 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
13990 break
13991 }
13992 v.reset(OpAnd16)
13993 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
13994 v0.AuxInt = int16ToAuxInt(int16(-1) << c)
13995 v.AddArg2(x, v0)
13996 return true
13997 }
13998
13999
14000
14001 for {
14002 if v_0.Op != OpRsh16Ux64 {
14003 break
14004 }
14005 _ = v_0.Args[1]
14006 v_0_0 := v_0.Args[0]
14007 if v_0_0.Op != OpLsh16x64 {
14008 break
14009 }
14010 _ = v_0_0.Args[1]
14011 x := v_0_0.Args[0]
14012 v_0_0_1 := v_0_0.Args[1]
14013 if v_0_0_1.Op != OpConst64 {
14014 break
14015 }
14016 c1 := auxIntToInt64(v_0_0_1.AuxInt)
14017 v_0_1 := v_0.Args[1]
14018 if v_0_1.Op != OpConst64 {
14019 break
14020 }
14021 c2 := auxIntToInt64(v_0_1.AuxInt)
14022 if v_1.Op != OpConst64 {
14023 break
14024 }
14025 c3 := auxIntToInt64(v_1.AuxInt)
14026 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
14027 break
14028 }
14029 v.reset(OpLsh16x64)
14030 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
14031 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
14032 v.AddArg2(x, v0)
14033 return true
14034 }
14035
14036
14037
14038 for {
14039 if v_0.Op != OpAnd16 {
14040 break
14041 }
14042 _ = v_0.Args[1]
14043 v_0_0 := v_0.Args[0]
14044 v_0_1 := v_0.Args[1]
14045 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14046 if v_0_0.Op != OpRsh16x64 {
14047 continue
14048 }
14049 t := v_0_0.Type
14050 _ = v_0_0.Args[1]
14051 x := v_0_0.Args[0]
14052 v_0_0_1 := v_0_0.Args[1]
14053 if v_0_0_1.Op != OpConst64 {
14054 continue
14055 }
14056 t2 := v_0_0_1.Type
14057 c := auxIntToInt64(v_0_0_1.AuxInt)
14058 if v_0_1.Op != OpConst16 {
14059 continue
14060 }
14061 d := auxIntToInt16(v_0_1.AuxInt)
14062 if v_1.Op != OpConst64 {
14063 continue
14064 }
14065 e := auxIntToInt64(v_1.AuxInt)
14066 if !(c >= e) {
14067 continue
14068 }
14069 v.reset(OpAnd16)
14070 v0 := b.NewValue0(v.Pos, OpRsh16x64, t)
14071 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14072 v1.AuxInt = int64ToAuxInt(c - e)
14073 v0.AddArg2(x, v1)
14074 v2 := b.NewValue0(v.Pos, OpConst16, t)
14075 v2.AuxInt = int16ToAuxInt(d << e)
14076 v.AddArg2(v0, v2)
14077 return true
14078 }
14079 break
14080 }
14081
14082
14083
14084 for {
14085 if v_0.Op != OpAnd16 {
14086 break
14087 }
14088 _ = v_0.Args[1]
14089 v_0_0 := v_0.Args[0]
14090 v_0_1 := v_0.Args[1]
14091 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14092 if v_0_0.Op != OpRsh16Ux64 {
14093 continue
14094 }
14095 t := v_0_0.Type
14096 _ = v_0_0.Args[1]
14097 x := v_0_0.Args[0]
14098 v_0_0_1 := v_0_0.Args[1]
14099 if v_0_0_1.Op != OpConst64 {
14100 continue
14101 }
14102 t2 := v_0_0_1.Type
14103 c := auxIntToInt64(v_0_0_1.AuxInt)
14104 if v_0_1.Op != OpConst16 {
14105 continue
14106 }
14107 d := auxIntToInt16(v_0_1.AuxInt)
14108 if v_1.Op != OpConst64 {
14109 continue
14110 }
14111 e := auxIntToInt64(v_1.AuxInt)
14112 if !(c >= e) {
14113 continue
14114 }
14115 v.reset(OpAnd16)
14116 v0 := b.NewValue0(v.Pos, OpRsh16Ux64, t)
14117 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14118 v1.AuxInt = int64ToAuxInt(c - e)
14119 v0.AddArg2(x, v1)
14120 v2 := b.NewValue0(v.Pos, OpConst16, t)
14121 v2.AuxInt = int16ToAuxInt(d << e)
14122 v.AddArg2(v0, v2)
14123 return true
14124 }
14125 break
14126 }
14127
14128
14129
14130 for {
14131 if v_0.Op != OpAnd16 {
14132 break
14133 }
14134 _ = v_0.Args[1]
14135 v_0_0 := v_0.Args[0]
14136 v_0_1 := v_0.Args[1]
14137 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14138 if v_0_0.Op != OpRsh16x64 {
14139 continue
14140 }
14141 t := v_0_0.Type
14142 _ = v_0_0.Args[1]
14143 x := v_0_0.Args[0]
14144 v_0_0_1 := v_0_0.Args[1]
14145 if v_0_0_1.Op != OpConst64 {
14146 continue
14147 }
14148 t2 := v_0_0_1.Type
14149 c := auxIntToInt64(v_0_0_1.AuxInt)
14150 if v_0_1.Op != OpConst16 {
14151 continue
14152 }
14153 d := auxIntToInt16(v_0_1.AuxInt)
14154 if v_1.Op != OpConst64 {
14155 continue
14156 }
14157 e := auxIntToInt64(v_1.AuxInt)
14158 if !(c < e) {
14159 continue
14160 }
14161 v.reset(OpAnd16)
14162 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
14163 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14164 v1.AuxInt = int64ToAuxInt(e - c)
14165 v0.AddArg2(x, v1)
14166 v2 := b.NewValue0(v.Pos, OpConst16, t)
14167 v2.AuxInt = int16ToAuxInt(d << e)
14168 v.AddArg2(v0, v2)
14169 return true
14170 }
14171 break
14172 }
14173
14174
14175
14176 for {
14177 if v_0.Op != OpAnd16 {
14178 break
14179 }
14180 _ = v_0.Args[1]
14181 v_0_0 := v_0.Args[0]
14182 v_0_1 := v_0.Args[1]
14183 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14184 if v_0_0.Op != OpRsh16Ux64 {
14185 continue
14186 }
14187 t := v_0_0.Type
14188 _ = v_0_0.Args[1]
14189 x := v_0_0.Args[0]
14190 v_0_0_1 := v_0_0.Args[1]
14191 if v_0_0_1.Op != OpConst64 {
14192 continue
14193 }
14194 t2 := v_0_0_1.Type
14195 c := auxIntToInt64(v_0_0_1.AuxInt)
14196 if v_0_1.Op != OpConst16 {
14197 continue
14198 }
14199 d := auxIntToInt16(v_0_1.AuxInt)
14200 if v_1.Op != OpConst64 {
14201 continue
14202 }
14203 e := auxIntToInt64(v_1.AuxInt)
14204 if !(c < e) {
14205 continue
14206 }
14207 v.reset(OpAnd16)
14208 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
14209 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14210 v1.AuxInt = int64ToAuxInt(e - c)
14211 v0.AddArg2(x, v1)
14212 v2 := b.NewValue0(v.Pos, OpConst16, t)
14213 v2.AuxInt = int16ToAuxInt(d << e)
14214 v.AddArg2(v0, v2)
14215 return true
14216 }
14217 break
14218 }
14219
14220
14221
14222 for {
14223 if auxIntToBool(v.AuxInt) != false {
14224 break
14225 }
14226 x := v_0
14227 con := v_1
14228 if con.Op != OpConst64 {
14229 break
14230 }
14231 c := auxIntToInt64(con.AuxInt)
14232 if !(0 < c && c < 16) {
14233 break
14234 }
14235 v.reset(OpLsh16x64)
14236 v.AuxInt = boolToAuxInt(true)
14237 v.AddArg2(x, con)
14238 return true
14239 }
14240 return false
14241 }
14242 func rewriteValuegeneric_OpLsh16x8(v *Value) bool {
14243 v_1 := v.Args[1]
14244 v_0 := v.Args[0]
14245 b := v.Block
14246
14247
14248 for {
14249 t := v.Type
14250 x := v_0
14251 if v_1.Op != OpConst8 {
14252 break
14253 }
14254 c := auxIntToInt8(v_1.AuxInt)
14255 v.reset(OpLsh16x64)
14256 v0 := b.NewValue0(v.Pos, OpConst64, t)
14257 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
14258 v.AddArg2(x, v0)
14259 return true
14260 }
14261
14262
14263 for {
14264 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
14265 break
14266 }
14267 v.reset(OpConst16)
14268 v.AuxInt = int16ToAuxInt(0)
14269 return true
14270 }
14271
14272
14273
14274 for {
14275 if auxIntToBool(v.AuxInt) != false {
14276 break
14277 }
14278 x := v_0
14279 con := v_1
14280 if con.Op != OpConst8 {
14281 break
14282 }
14283 c := auxIntToInt8(con.AuxInt)
14284 if !(0 < c && c < 16) {
14285 break
14286 }
14287 v.reset(OpLsh16x8)
14288 v.AuxInt = boolToAuxInt(true)
14289 v.AddArg2(x, con)
14290 return true
14291 }
14292 return false
14293 }
14294 func rewriteValuegeneric_OpLsh32x16(v *Value) bool {
14295 v_1 := v.Args[1]
14296 v_0 := v.Args[0]
14297 b := v.Block
14298
14299
14300 for {
14301 t := v.Type
14302 x := v_0
14303 if v_1.Op != OpConst16 {
14304 break
14305 }
14306 c := auxIntToInt16(v_1.AuxInt)
14307 v.reset(OpLsh32x64)
14308 v0 := b.NewValue0(v.Pos, OpConst64, t)
14309 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
14310 v.AddArg2(x, v0)
14311 return true
14312 }
14313
14314
14315 for {
14316 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
14317 break
14318 }
14319 v.reset(OpConst32)
14320 v.AuxInt = int32ToAuxInt(0)
14321 return true
14322 }
14323
14324
14325
14326 for {
14327 if auxIntToBool(v.AuxInt) != false {
14328 break
14329 }
14330 x := v_0
14331 con := v_1
14332 if con.Op != OpConst16 {
14333 break
14334 }
14335 c := auxIntToInt16(con.AuxInt)
14336 if !(0 < c && c < 32) {
14337 break
14338 }
14339 v.reset(OpLsh32x16)
14340 v.AuxInt = boolToAuxInt(true)
14341 v.AddArg2(x, con)
14342 return true
14343 }
14344 return false
14345 }
14346 func rewriteValuegeneric_OpLsh32x32(v *Value) bool {
14347 v_1 := v.Args[1]
14348 v_0 := v.Args[0]
14349 b := v.Block
14350
14351
14352 for {
14353 t := v.Type
14354 x := v_0
14355 if v_1.Op != OpConst32 {
14356 break
14357 }
14358 c := auxIntToInt32(v_1.AuxInt)
14359 v.reset(OpLsh32x64)
14360 v0 := b.NewValue0(v.Pos, OpConst64, t)
14361 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
14362 v.AddArg2(x, v0)
14363 return true
14364 }
14365
14366
14367 for {
14368 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
14369 break
14370 }
14371 v.reset(OpConst32)
14372 v.AuxInt = int32ToAuxInt(0)
14373 return true
14374 }
14375
14376
14377
14378 for {
14379 if auxIntToBool(v.AuxInt) != false {
14380 break
14381 }
14382 x := v_0
14383 con := v_1
14384 if con.Op != OpConst32 {
14385 break
14386 }
14387 c := auxIntToInt32(con.AuxInt)
14388 if !(0 < c && c < 32) {
14389 break
14390 }
14391 v.reset(OpLsh32x32)
14392 v.AuxInt = boolToAuxInt(true)
14393 v.AddArg2(x, con)
14394 return true
14395 }
14396 return false
14397 }
14398 func rewriteValuegeneric_OpLsh32x64(v *Value) bool {
14399 v_1 := v.Args[1]
14400 v_0 := v.Args[0]
14401 b := v.Block
14402 typ := &b.Func.Config.Types
14403
14404
14405 for {
14406 if v_0.Op != OpConst32 {
14407 break
14408 }
14409 c := auxIntToInt32(v_0.AuxInt)
14410 if v_1.Op != OpConst64 {
14411 break
14412 }
14413 d := auxIntToInt64(v_1.AuxInt)
14414 v.reset(OpConst32)
14415 v.AuxInt = int32ToAuxInt(c << uint64(d))
14416 return true
14417 }
14418
14419
14420 for {
14421 x := v_0
14422 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
14423 break
14424 }
14425 v.copyOf(x)
14426 return true
14427 }
14428
14429
14430 for {
14431 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
14432 break
14433 }
14434 v.reset(OpConst32)
14435 v.AuxInt = int32ToAuxInt(0)
14436 return true
14437 }
14438
14439
14440
14441 for {
14442 if v_1.Op != OpConst64 {
14443 break
14444 }
14445 c := auxIntToInt64(v_1.AuxInt)
14446 if !(uint64(c) >= 32) {
14447 break
14448 }
14449 v.reset(OpConst32)
14450 v.AuxInt = int32ToAuxInt(0)
14451 return true
14452 }
14453
14454
14455
14456 for {
14457 t := v.Type
14458 if v_0.Op != OpLsh32x64 {
14459 break
14460 }
14461 _ = v_0.Args[1]
14462 x := v_0.Args[0]
14463 v_0_1 := v_0.Args[1]
14464 if v_0_1.Op != OpConst64 {
14465 break
14466 }
14467 c := auxIntToInt64(v_0_1.AuxInt)
14468 if v_1.Op != OpConst64 {
14469 break
14470 }
14471 d := auxIntToInt64(v_1.AuxInt)
14472 if !(!uaddOvf(c, d)) {
14473 break
14474 }
14475 v.reset(OpLsh32x64)
14476 v0 := b.NewValue0(v.Pos, OpConst64, t)
14477 v0.AuxInt = int64ToAuxInt(c + d)
14478 v.AddArg2(x, v0)
14479 return true
14480 }
14481
14482
14483
14484 for {
14485 i := v_0
14486 if i.Op != OpRsh32x64 {
14487 break
14488 }
14489 _ = i.Args[1]
14490 x := i.Args[0]
14491 i_1 := i.Args[1]
14492 if i_1.Op != OpConst64 {
14493 break
14494 }
14495 c := auxIntToInt64(i_1.AuxInt)
14496 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
14497 break
14498 }
14499 v.reset(OpAnd32)
14500 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
14501 v0.AuxInt = int32ToAuxInt(int32(-1) << c)
14502 v.AddArg2(x, v0)
14503 return true
14504 }
14505
14506
14507
14508 for {
14509 i := v_0
14510 if i.Op != OpRsh32Ux64 {
14511 break
14512 }
14513 _ = i.Args[1]
14514 x := i.Args[0]
14515 i_1 := i.Args[1]
14516 if i_1.Op != OpConst64 {
14517 break
14518 }
14519 c := auxIntToInt64(i_1.AuxInt)
14520 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
14521 break
14522 }
14523 v.reset(OpAnd32)
14524 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
14525 v0.AuxInt = int32ToAuxInt(int32(-1) << c)
14526 v.AddArg2(x, v0)
14527 return true
14528 }
14529
14530
14531
14532 for {
14533 if v_0.Op != OpRsh32Ux64 {
14534 break
14535 }
14536 _ = v_0.Args[1]
14537 v_0_0 := v_0.Args[0]
14538 if v_0_0.Op != OpLsh32x64 {
14539 break
14540 }
14541 _ = v_0_0.Args[1]
14542 x := v_0_0.Args[0]
14543 v_0_0_1 := v_0_0.Args[1]
14544 if v_0_0_1.Op != OpConst64 {
14545 break
14546 }
14547 c1 := auxIntToInt64(v_0_0_1.AuxInt)
14548 v_0_1 := v_0.Args[1]
14549 if v_0_1.Op != OpConst64 {
14550 break
14551 }
14552 c2 := auxIntToInt64(v_0_1.AuxInt)
14553 if v_1.Op != OpConst64 {
14554 break
14555 }
14556 c3 := auxIntToInt64(v_1.AuxInt)
14557 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
14558 break
14559 }
14560 v.reset(OpLsh32x64)
14561 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
14562 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
14563 v.AddArg2(x, v0)
14564 return true
14565 }
14566
14567
14568
14569 for {
14570 if v_0.Op != OpAnd32 {
14571 break
14572 }
14573 _ = v_0.Args[1]
14574 v_0_0 := v_0.Args[0]
14575 v_0_1 := v_0.Args[1]
14576 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14577 if v_0_0.Op != OpRsh32x64 {
14578 continue
14579 }
14580 t := v_0_0.Type
14581 _ = v_0_0.Args[1]
14582 x := v_0_0.Args[0]
14583 v_0_0_1 := v_0_0.Args[1]
14584 if v_0_0_1.Op != OpConst64 {
14585 continue
14586 }
14587 t2 := v_0_0_1.Type
14588 c := auxIntToInt64(v_0_0_1.AuxInt)
14589 if v_0_1.Op != OpConst32 {
14590 continue
14591 }
14592 d := auxIntToInt32(v_0_1.AuxInt)
14593 if v_1.Op != OpConst64 {
14594 continue
14595 }
14596 e := auxIntToInt64(v_1.AuxInt)
14597 if !(c >= e) {
14598 continue
14599 }
14600 v.reset(OpAnd32)
14601 v0 := b.NewValue0(v.Pos, OpRsh32x64, t)
14602 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14603 v1.AuxInt = int64ToAuxInt(c - e)
14604 v0.AddArg2(x, v1)
14605 v2 := b.NewValue0(v.Pos, OpConst32, t)
14606 v2.AuxInt = int32ToAuxInt(d << e)
14607 v.AddArg2(v0, v2)
14608 return true
14609 }
14610 break
14611 }
14612
14613
14614
14615 for {
14616 if v_0.Op != OpAnd32 {
14617 break
14618 }
14619 _ = v_0.Args[1]
14620 v_0_0 := v_0.Args[0]
14621 v_0_1 := v_0.Args[1]
14622 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14623 if v_0_0.Op != OpRsh32Ux64 {
14624 continue
14625 }
14626 t := v_0_0.Type
14627 _ = v_0_0.Args[1]
14628 x := v_0_0.Args[0]
14629 v_0_0_1 := v_0_0.Args[1]
14630 if v_0_0_1.Op != OpConst64 {
14631 continue
14632 }
14633 t2 := v_0_0_1.Type
14634 c := auxIntToInt64(v_0_0_1.AuxInt)
14635 if v_0_1.Op != OpConst32 {
14636 continue
14637 }
14638 d := auxIntToInt32(v_0_1.AuxInt)
14639 if v_1.Op != OpConst64 {
14640 continue
14641 }
14642 e := auxIntToInt64(v_1.AuxInt)
14643 if !(c >= e) {
14644 continue
14645 }
14646 v.reset(OpAnd32)
14647 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, t)
14648 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14649 v1.AuxInt = int64ToAuxInt(c - e)
14650 v0.AddArg2(x, v1)
14651 v2 := b.NewValue0(v.Pos, OpConst32, t)
14652 v2.AuxInt = int32ToAuxInt(d << e)
14653 v.AddArg2(v0, v2)
14654 return true
14655 }
14656 break
14657 }
14658
14659
14660
14661 for {
14662 if v_0.Op != OpAnd32 {
14663 break
14664 }
14665 _ = v_0.Args[1]
14666 v_0_0 := v_0.Args[0]
14667 v_0_1 := v_0.Args[1]
14668 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14669 if v_0_0.Op != OpRsh32x64 {
14670 continue
14671 }
14672 t := v_0_0.Type
14673 _ = v_0_0.Args[1]
14674 x := v_0_0.Args[0]
14675 v_0_0_1 := v_0_0.Args[1]
14676 if v_0_0_1.Op != OpConst64 {
14677 continue
14678 }
14679 t2 := v_0_0_1.Type
14680 c := auxIntToInt64(v_0_0_1.AuxInt)
14681 if v_0_1.Op != OpConst32 {
14682 continue
14683 }
14684 d := auxIntToInt32(v_0_1.AuxInt)
14685 if v_1.Op != OpConst64 {
14686 continue
14687 }
14688 e := auxIntToInt64(v_1.AuxInt)
14689 if !(c < e) {
14690 continue
14691 }
14692 v.reset(OpAnd32)
14693 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
14694 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14695 v1.AuxInt = int64ToAuxInt(e - c)
14696 v0.AddArg2(x, v1)
14697 v2 := b.NewValue0(v.Pos, OpConst32, t)
14698 v2.AuxInt = int32ToAuxInt(d << e)
14699 v.AddArg2(v0, v2)
14700 return true
14701 }
14702 break
14703 }
14704
14705
14706
14707 for {
14708 if v_0.Op != OpAnd32 {
14709 break
14710 }
14711 _ = v_0.Args[1]
14712 v_0_0 := v_0.Args[0]
14713 v_0_1 := v_0.Args[1]
14714 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14715 if v_0_0.Op != OpRsh32Ux64 {
14716 continue
14717 }
14718 t := v_0_0.Type
14719 _ = v_0_0.Args[1]
14720 x := v_0_0.Args[0]
14721 v_0_0_1 := v_0_0.Args[1]
14722 if v_0_0_1.Op != OpConst64 {
14723 continue
14724 }
14725 t2 := v_0_0_1.Type
14726 c := auxIntToInt64(v_0_0_1.AuxInt)
14727 if v_0_1.Op != OpConst32 {
14728 continue
14729 }
14730 d := auxIntToInt32(v_0_1.AuxInt)
14731 if v_1.Op != OpConst64 {
14732 continue
14733 }
14734 e := auxIntToInt64(v_1.AuxInt)
14735 if !(c < e) {
14736 continue
14737 }
14738 v.reset(OpAnd32)
14739 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
14740 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14741 v1.AuxInt = int64ToAuxInt(e - c)
14742 v0.AddArg2(x, v1)
14743 v2 := b.NewValue0(v.Pos, OpConst32, t)
14744 v2.AuxInt = int32ToAuxInt(d << e)
14745 v.AddArg2(v0, v2)
14746 return true
14747 }
14748 break
14749 }
14750
14751
14752
14753 for {
14754 if auxIntToBool(v.AuxInt) != false {
14755 break
14756 }
14757 x := v_0
14758 con := v_1
14759 if con.Op != OpConst64 {
14760 break
14761 }
14762 c := auxIntToInt64(con.AuxInt)
14763 if !(0 < c && c < 32) {
14764 break
14765 }
14766 v.reset(OpLsh32x64)
14767 v.AuxInt = boolToAuxInt(true)
14768 v.AddArg2(x, con)
14769 return true
14770 }
14771 return false
14772 }
14773 func rewriteValuegeneric_OpLsh32x8(v *Value) bool {
14774 v_1 := v.Args[1]
14775 v_0 := v.Args[0]
14776 b := v.Block
14777
14778
14779 for {
14780 t := v.Type
14781 x := v_0
14782 if v_1.Op != OpConst8 {
14783 break
14784 }
14785 c := auxIntToInt8(v_1.AuxInt)
14786 v.reset(OpLsh32x64)
14787 v0 := b.NewValue0(v.Pos, OpConst64, t)
14788 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
14789 v.AddArg2(x, v0)
14790 return true
14791 }
14792
14793
14794 for {
14795 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
14796 break
14797 }
14798 v.reset(OpConst32)
14799 v.AuxInt = int32ToAuxInt(0)
14800 return true
14801 }
14802
14803
14804
14805 for {
14806 if auxIntToBool(v.AuxInt) != false {
14807 break
14808 }
14809 x := v_0
14810 con := v_1
14811 if con.Op != OpConst8 {
14812 break
14813 }
14814 c := auxIntToInt8(con.AuxInt)
14815 if !(0 < c && c < 32) {
14816 break
14817 }
14818 v.reset(OpLsh32x8)
14819 v.AuxInt = boolToAuxInt(true)
14820 v.AddArg2(x, con)
14821 return true
14822 }
14823 return false
14824 }
14825 func rewriteValuegeneric_OpLsh64x16(v *Value) bool {
14826 v_1 := v.Args[1]
14827 v_0 := v.Args[0]
14828 b := v.Block
14829
14830
14831 for {
14832 t := v.Type
14833 x := v_0
14834 if v_1.Op != OpConst16 {
14835 break
14836 }
14837 c := auxIntToInt16(v_1.AuxInt)
14838 v.reset(OpLsh64x64)
14839 v0 := b.NewValue0(v.Pos, OpConst64, t)
14840 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
14841 v.AddArg2(x, v0)
14842 return true
14843 }
14844
14845
14846 for {
14847 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
14848 break
14849 }
14850 v.reset(OpConst64)
14851 v.AuxInt = int64ToAuxInt(0)
14852 return true
14853 }
14854
14855
14856
14857 for {
14858 if auxIntToBool(v.AuxInt) != false {
14859 break
14860 }
14861 x := v_0
14862 con := v_1
14863 if con.Op != OpConst16 {
14864 break
14865 }
14866 c := auxIntToInt16(con.AuxInt)
14867 if !(0 < c && c < 64) {
14868 break
14869 }
14870 v.reset(OpLsh64x16)
14871 v.AuxInt = boolToAuxInt(true)
14872 v.AddArg2(x, con)
14873 return true
14874 }
14875 return false
14876 }
14877 func rewriteValuegeneric_OpLsh64x32(v *Value) bool {
14878 v_1 := v.Args[1]
14879 v_0 := v.Args[0]
14880 b := v.Block
14881
14882
14883 for {
14884 t := v.Type
14885 x := v_0
14886 if v_1.Op != OpConst32 {
14887 break
14888 }
14889 c := auxIntToInt32(v_1.AuxInt)
14890 v.reset(OpLsh64x64)
14891 v0 := b.NewValue0(v.Pos, OpConst64, t)
14892 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
14893 v.AddArg2(x, v0)
14894 return true
14895 }
14896
14897
14898 for {
14899 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
14900 break
14901 }
14902 v.reset(OpConst64)
14903 v.AuxInt = int64ToAuxInt(0)
14904 return true
14905 }
14906
14907
14908
14909 for {
14910 if auxIntToBool(v.AuxInt) != false {
14911 break
14912 }
14913 x := v_0
14914 con := v_1
14915 if con.Op != OpConst32 {
14916 break
14917 }
14918 c := auxIntToInt32(con.AuxInt)
14919 if !(0 < c && c < 64) {
14920 break
14921 }
14922 v.reset(OpLsh64x32)
14923 v.AuxInt = boolToAuxInt(true)
14924 v.AddArg2(x, con)
14925 return true
14926 }
14927 return false
14928 }
14929 func rewriteValuegeneric_OpLsh64x64(v *Value) bool {
14930 v_1 := v.Args[1]
14931 v_0 := v.Args[0]
14932 b := v.Block
14933 typ := &b.Func.Config.Types
14934
14935
14936 for {
14937 if v_0.Op != OpConst64 {
14938 break
14939 }
14940 c := auxIntToInt64(v_0.AuxInt)
14941 if v_1.Op != OpConst64 {
14942 break
14943 }
14944 d := auxIntToInt64(v_1.AuxInt)
14945 v.reset(OpConst64)
14946 v.AuxInt = int64ToAuxInt(c << uint64(d))
14947 return true
14948 }
14949
14950
14951 for {
14952 x := v_0
14953 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
14954 break
14955 }
14956 v.copyOf(x)
14957 return true
14958 }
14959
14960
14961 for {
14962 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
14963 break
14964 }
14965 v.reset(OpConst64)
14966 v.AuxInt = int64ToAuxInt(0)
14967 return true
14968 }
14969
14970
14971
14972 for {
14973 if v_1.Op != OpConst64 {
14974 break
14975 }
14976 c := auxIntToInt64(v_1.AuxInt)
14977 if !(uint64(c) >= 64) {
14978 break
14979 }
14980 v.reset(OpConst64)
14981 v.AuxInt = int64ToAuxInt(0)
14982 return true
14983 }
14984
14985
14986
14987 for {
14988 t := v.Type
14989 if v_0.Op != OpLsh64x64 {
14990 break
14991 }
14992 _ = v_0.Args[1]
14993 x := v_0.Args[0]
14994 v_0_1 := v_0.Args[1]
14995 if v_0_1.Op != OpConst64 {
14996 break
14997 }
14998 c := auxIntToInt64(v_0_1.AuxInt)
14999 if v_1.Op != OpConst64 {
15000 break
15001 }
15002 d := auxIntToInt64(v_1.AuxInt)
15003 if !(!uaddOvf(c, d)) {
15004 break
15005 }
15006 v.reset(OpLsh64x64)
15007 v0 := b.NewValue0(v.Pos, OpConst64, t)
15008 v0.AuxInt = int64ToAuxInt(c + d)
15009 v.AddArg2(x, v0)
15010 return true
15011 }
15012
15013
15014
15015 for {
15016 i := v_0
15017 if i.Op != OpRsh64x64 {
15018 break
15019 }
15020 _ = i.Args[1]
15021 x := i.Args[0]
15022 i_1 := i.Args[1]
15023 if i_1.Op != OpConst64 {
15024 break
15025 }
15026 c := auxIntToInt64(i_1.AuxInt)
15027 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
15028 break
15029 }
15030 v.reset(OpAnd64)
15031 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
15032 v0.AuxInt = int64ToAuxInt(int64(-1) << c)
15033 v.AddArg2(x, v0)
15034 return true
15035 }
15036
15037
15038
15039 for {
15040 i := v_0
15041 if i.Op != OpRsh64Ux64 {
15042 break
15043 }
15044 _ = i.Args[1]
15045 x := i.Args[0]
15046 i_1 := i.Args[1]
15047 if i_1.Op != OpConst64 {
15048 break
15049 }
15050 c := auxIntToInt64(i_1.AuxInt)
15051 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
15052 break
15053 }
15054 v.reset(OpAnd64)
15055 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
15056 v0.AuxInt = int64ToAuxInt(int64(-1) << c)
15057 v.AddArg2(x, v0)
15058 return true
15059 }
15060
15061
15062
15063 for {
15064 if v_0.Op != OpRsh64Ux64 {
15065 break
15066 }
15067 _ = v_0.Args[1]
15068 v_0_0 := v_0.Args[0]
15069 if v_0_0.Op != OpLsh64x64 {
15070 break
15071 }
15072 _ = v_0_0.Args[1]
15073 x := v_0_0.Args[0]
15074 v_0_0_1 := v_0_0.Args[1]
15075 if v_0_0_1.Op != OpConst64 {
15076 break
15077 }
15078 c1 := auxIntToInt64(v_0_0_1.AuxInt)
15079 v_0_1 := v_0.Args[1]
15080 if v_0_1.Op != OpConst64 {
15081 break
15082 }
15083 c2 := auxIntToInt64(v_0_1.AuxInt)
15084 if v_1.Op != OpConst64 {
15085 break
15086 }
15087 c3 := auxIntToInt64(v_1.AuxInt)
15088 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
15089 break
15090 }
15091 v.reset(OpLsh64x64)
15092 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
15093 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
15094 v.AddArg2(x, v0)
15095 return true
15096 }
15097
15098
15099
15100 for {
15101 if v_0.Op != OpAnd64 {
15102 break
15103 }
15104 _ = v_0.Args[1]
15105 v_0_0 := v_0.Args[0]
15106 v_0_1 := v_0.Args[1]
15107 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15108 if v_0_0.Op != OpRsh64x64 {
15109 continue
15110 }
15111 t := v_0_0.Type
15112 _ = v_0_0.Args[1]
15113 x := v_0_0.Args[0]
15114 v_0_0_1 := v_0_0.Args[1]
15115 if v_0_0_1.Op != OpConst64 {
15116 continue
15117 }
15118 t2 := v_0_0_1.Type
15119 c := auxIntToInt64(v_0_0_1.AuxInt)
15120 if v_0_1.Op != OpConst64 {
15121 continue
15122 }
15123 d := auxIntToInt64(v_0_1.AuxInt)
15124 if v_1.Op != OpConst64 {
15125 continue
15126 }
15127 e := auxIntToInt64(v_1.AuxInt)
15128 if !(c >= e) {
15129 continue
15130 }
15131 v.reset(OpAnd64)
15132 v0 := b.NewValue0(v.Pos, OpRsh64x64, t)
15133 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15134 v1.AuxInt = int64ToAuxInt(c - e)
15135 v0.AddArg2(x, v1)
15136 v2 := b.NewValue0(v.Pos, OpConst64, t)
15137 v2.AuxInt = int64ToAuxInt(d << e)
15138 v.AddArg2(v0, v2)
15139 return true
15140 }
15141 break
15142 }
15143
15144
15145
15146 for {
15147 if v_0.Op != OpAnd64 {
15148 break
15149 }
15150 _ = v_0.Args[1]
15151 v_0_0 := v_0.Args[0]
15152 v_0_1 := v_0.Args[1]
15153 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15154 if v_0_0.Op != OpRsh64Ux64 {
15155 continue
15156 }
15157 t := v_0_0.Type
15158 _ = v_0_0.Args[1]
15159 x := v_0_0.Args[0]
15160 v_0_0_1 := v_0_0.Args[1]
15161 if v_0_0_1.Op != OpConst64 {
15162 continue
15163 }
15164 t2 := v_0_0_1.Type
15165 c := auxIntToInt64(v_0_0_1.AuxInt)
15166 if v_0_1.Op != OpConst64 {
15167 continue
15168 }
15169 d := auxIntToInt64(v_0_1.AuxInt)
15170 if v_1.Op != OpConst64 {
15171 continue
15172 }
15173 e := auxIntToInt64(v_1.AuxInt)
15174 if !(c >= e) {
15175 continue
15176 }
15177 v.reset(OpAnd64)
15178 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t)
15179 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15180 v1.AuxInt = int64ToAuxInt(c - e)
15181 v0.AddArg2(x, v1)
15182 v2 := b.NewValue0(v.Pos, OpConst64, t)
15183 v2.AuxInt = int64ToAuxInt(d << e)
15184 v.AddArg2(v0, v2)
15185 return true
15186 }
15187 break
15188 }
15189
15190
15191
15192 for {
15193 if v_0.Op != OpAnd64 {
15194 break
15195 }
15196 _ = v_0.Args[1]
15197 v_0_0 := v_0.Args[0]
15198 v_0_1 := v_0.Args[1]
15199 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15200 if v_0_0.Op != OpRsh64x64 {
15201 continue
15202 }
15203 t := v_0_0.Type
15204 _ = v_0_0.Args[1]
15205 x := v_0_0.Args[0]
15206 v_0_0_1 := v_0_0.Args[1]
15207 if v_0_0_1.Op != OpConst64 {
15208 continue
15209 }
15210 t2 := v_0_0_1.Type
15211 c := auxIntToInt64(v_0_0_1.AuxInt)
15212 if v_0_1.Op != OpConst64 {
15213 continue
15214 }
15215 d := auxIntToInt64(v_0_1.AuxInt)
15216 if v_1.Op != OpConst64 {
15217 continue
15218 }
15219 e := auxIntToInt64(v_1.AuxInt)
15220 if !(c < e) {
15221 continue
15222 }
15223 v.reset(OpAnd64)
15224 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
15225 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15226 v1.AuxInt = int64ToAuxInt(e - c)
15227 v0.AddArg2(x, v1)
15228 v2 := b.NewValue0(v.Pos, OpConst64, t)
15229 v2.AuxInt = int64ToAuxInt(d << e)
15230 v.AddArg2(v0, v2)
15231 return true
15232 }
15233 break
15234 }
15235
15236
15237
15238 for {
15239 if v_0.Op != OpAnd64 {
15240 break
15241 }
15242 _ = v_0.Args[1]
15243 v_0_0 := v_0.Args[0]
15244 v_0_1 := v_0.Args[1]
15245 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15246 if v_0_0.Op != OpRsh64Ux64 {
15247 continue
15248 }
15249 t := v_0_0.Type
15250 _ = v_0_0.Args[1]
15251 x := v_0_0.Args[0]
15252 v_0_0_1 := v_0_0.Args[1]
15253 if v_0_0_1.Op != OpConst64 {
15254 continue
15255 }
15256 t2 := v_0_0_1.Type
15257 c := auxIntToInt64(v_0_0_1.AuxInt)
15258 if v_0_1.Op != OpConst64 {
15259 continue
15260 }
15261 d := auxIntToInt64(v_0_1.AuxInt)
15262 if v_1.Op != OpConst64 {
15263 continue
15264 }
15265 e := auxIntToInt64(v_1.AuxInt)
15266 if !(c < e) {
15267 continue
15268 }
15269 v.reset(OpAnd64)
15270 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
15271 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15272 v1.AuxInt = int64ToAuxInt(e - c)
15273 v0.AddArg2(x, v1)
15274 v2 := b.NewValue0(v.Pos, OpConst64, t)
15275 v2.AuxInt = int64ToAuxInt(d << e)
15276 v.AddArg2(v0, v2)
15277 return true
15278 }
15279 break
15280 }
15281
15282
15283
15284 for {
15285 if auxIntToBool(v.AuxInt) != false {
15286 break
15287 }
15288 x := v_0
15289 con := v_1
15290 if con.Op != OpConst64 {
15291 break
15292 }
15293 c := auxIntToInt64(con.AuxInt)
15294 if !(0 < c && c < 64) {
15295 break
15296 }
15297 v.reset(OpLsh64x64)
15298 v.AuxInt = boolToAuxInt(true)
15299 v.AddArg2(x, con)
15300 return true
15301 }
15302 return false
15303 }
15304 func rewriteValuegeneric_OpLsh64x8(v *Value) bool {
15305 v_1 := v.Args[1]
15306 v_0 := v.Args[0]
15307 b := v.Block
15308
15309
15310 for {
15311 t := v.Type
15312 x := v_0
15313 if v_1.Op != OpConst8 {
15314 break
15315 }
15316 c := auxIntToInt8(v_1.AuxInt)
15317 v.reset(OpLsh64x64)
15318 v0 := b.NewValue0(v.Pos, OpConst64, t)
15319 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
15320 v.AddArg2(x, v0)
15321 return true
15322 }
15323
15324
15325 for {
15326 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
15327 break
15328 }
15329 v.reset(OpConst64)
15330 v.AuxInt = int64ToAuxInt(0)
15331 return true
15332 }
15333
15334
15335
15336 for {
15337 if auxIntToBool(v.AuxInt) != false {
15338 break
15339 }
15340 x := v_0
15341 con := v_1
15342 if con.Op != OpConst8 {
15343 break
15344 }
15345 c := auxIntToInt8(con.AuxInt)
15346 if !(0 < c && c < 64) {
15347 break
15348 }
15349 v.reset(OpLsh64x8)
15350 v.AuxInt = boolToAuxInt(true)
15351 v.AddArg2(x, con)
15352 return true
15353 }
15354 return false
15355 }
15356 func rewriteValuegeneric_OpLsh8x16(v *Value) bool {
15357 v_1 := v.Args[1]
15358 v_0 := v.Args[0]
15359 b := v.Block
15360
15361
15362 for {
15363 t := v.Type
15364 x := v_0
15365 if v_1.Op != OpConst16 {
15366 break
15367 }
15368 c := auxIntToInt16(v_1.AuxInt)
15369 v.reset(OpLsh8x64)
15370 v0 := b.NewValue0(v.Pos, OpConst64, t)
15371 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
15372 v.AddArg2(x, v0)
15373 return true
15374 }
15375
15376
15377 for {
15378 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
15379 break
15380 }
15381 v.reset(OpConst8)
15382 v.AuxInt = int8ToAuxInt(0)
15383 return true
15384 }
15385
15386
15387
15388 for {
15389 if auxIntToBool(v.AuxInt) != false {
15390 break
15391 }
15392 x := v_0
15393 con := v_1
15394 if con.Op != OpConst16 {
15395 break
15396 }
15397 c := auxIntToInt16(con.AuxInt)
15398 if !(0 < c && c < 8) {
15399 break
15400 }
15401 v.reset(OpLsh8x16)
15402 v.AuxInt = boolToAuxInt(true)
15403 v.AddArg2(x, con)
15404 return true
15405 }
15406 return false
15407 }
15408 func rewriteValuegeneric_OpLsh8x32(v *Value) bool {
15409 v_1 := v.Args[1]
15410 v_0 := v.Args[0]
15411 b := v.Block
15412
15413
15414 for {
15415 t := v.Type
15416 x := v_0
15417 if v_1.Op != OpConst32 {
15418 break
15419 }
15420 c := auxIntToInt32(v_1.AuxInt)
15421 v.reset(OpLsh8x64)
15422 v0 := b.NewValue0(v.Pos, OpConst64, t)
15423 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
15424 v.AddArg2(x, v0)
15425 return true
15426 }
15427
15428
15429 for {
15430 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
15431 break
15432 }
15433 v.reset(OpConst8)
15434 v.AuxInt = int8ToAuxInt(0)
15435 return true
15436 }
15437
15438
15439
15440 for {
15441 if auxIntToBool(v.AuxInt) != false {
15442 break
15443 }
15444 x := v_0
15445 con := v_1
15446 if con.Op != OpConst32 {
15447 break
15448 }
15449 c := auxIntToInt32(con.AuxInt)
15450 if !(0 < c && c < 8) {
15451 break
15452 }
15453 v.reset(OpLsh8x32)
15454 v.AuxInt = boolToAuxInt(true)
15455 v.AddArg2(x, con)
15456 return true
15457 }
15458 return false
15459 }
15460 func rewriteValuegeneric_OpLsh8x64(v *Value) bool {
15461 v_1 := v.Args[1]
15462 v_0 := v.Args[0]
15463 b := v.Block
15464 typ := &b.Func.Config.Types
15465
15466
15467 for {
15468 if v_0.Op != OpConst8 {
15469 break
15470 }
15471 c := auxIntToInt8(v_0.AuxInt)
15472 if v_1.Op != OpConst64 {
15473 break
15474 }
15475 d := auxIntToInt64(v_1.AuxInt)
15476 v.reset(OpConst8)
15477 v.AuxInt = int8ToAuxInt(c << uint64(d))
15478 return true
15479 }
15480
15481
15482 for {
15483 x := v_0
15484 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
15485 break
15486 }
15487 v.copyOf(x)
15488 return true
15489 }
15490
15491
15492 for {
15493 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
15494 break
15495 }
15496 v.reset(OpConst8)
15497 v.AuxInt = int8ToAuxInt(0)
15498 return true
15499 }
15500
15501
15502
15503 for {
15504 if v_1.Op != OpConst64 {
15505 break
15506 }
15507 c := auxIntToInt64(v_1.AuxInt)
15508 if !(uint64(c) >= 8) {
15509 break
15510 }
15511 v.reset(OpConst8)
15512 v.AuxInt = int8ToAuxInt(0)
15513 return true
15514 }
15515
15516
15517
15518 for {
15519 t := v.Type
15520 if v_0.Op != OpLsh8x64 {
15521 break
15522 }
15523 _ = v_0.Args[1]
15524 x := v_0.Args[0]
15525 v_0_1 := v_0.Args[1]
15526 if v_0_1.Op != OpConst64 {
15527 break
15528 }
15529 c := auxIntToInt64(v_0_1.AuxInt)
15530 if v_1.Op != OpConst64 {
15531 break
15532 }
15533 d := auxIntToInt64(v_1.AuxInt)
15534 if !(!uaddOvf(c, d)) {
15535 break
15536 }
15537 v.reset(OpLsh8x64)
15538 v0 := b.NewValue0(v.Pos, OpConst64, t)
15539 v0.AuxInt = int64ToAuxInt(c + d)
15540 v.AddArg2(x, v0)
15541 return true
15542 }
15543
15544
15545
15546 for {
15547 i := v_0
15548 if i.Op != OpRsh8x64 {
15549 break
15550 }
15551 _ = i.Args[1]
15552 x := i.Args[0]
15553 i_1 := i.Args[1]
15554 if i_1.Op != OpConst64 {
15555 break
15556 }
15557 c := auxIntToInt64(i_1.AuxInt)
15558 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
15559 break
15560 }
15561 v.reset(OpAnd8)
15562 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
15563 v0.AuxInt = int8ToAuxInt(int8(-1) << c)
15564 v.AddArg2(x, v0)
15565 return true
15566 }
15567
15568
15569
15570 for {
15571 i := v_0
15572 if i.Op != OpRsh8Ux64 {
15573 break
15574 }
15575 _ = i.Args[1]
15576 x := i.Args[0]
15577 i_1 := i.Args[1]
15578 if i_1.Op != OpConst64 {
15579 break
15580 }
15581 c := auxIntToInt64(i_1.AuxInt)
15582 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
15583 break
15584 }
15585 v.reset(OpAnd8)
15586 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
15587 v0.AuxInt = int8ToAuxInt(int8(-1) << c)
15588 v.AddArg2(x, v0)
15589 return true
15590 }
15591
15592
15593
15594 for {
15595 if v_0.Op != OpRsh8Ux64 {
15596 break
15597 }
15598 _ = v_0.Args[1]
15599 v_0_0 := v_0.Args[0]
15600 if v_0_0.Op != OpLsh8x64 {
15601 break
15602 }
15603 _ = v_0_0.Args[1]
15604 x := v_0_0.Args[0]
15605 v_0_0_1 := v_0_0.Args[1]
15606 if v_0_0_1.Op != OpConst64 {
15607 break
15608 }
15609 c1 := auxIntToInt64(v_0_0_1.AuxInt)
15610 v_0_1 := v_0.Args[1]
15611 if v_0_1.Op != OpConst64 {
15612 break
15613 }
15614 c2 := auxIntToInt64(v_0_1.AuxInt)
15615 if v_1.Op != OpConst64 {
15616 break
15617 }
15618 c3 := auxIntToInt64(v_1.AuxInt)
15619 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
15620 break
15621 }
15622 v.reset(OpLsh8x64)
15623 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
15624 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
15625 v.AddArg2(x, v0)
15626 return true
15627 }
15628
15629
15630
15631 for {
15632 if v_0.Op != OpAnd8 {
15633 break
15634 }
15635 _ = v_0.Args[1]
15636 v_0_0 := v_0.Args[0]
15637 v_0_1 := v_0.Args[1]
15638 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15639 if v_0_0.Op != OpRsh8x64 {
15640 continue
15641 }
15642 t := v_0_0.Type
15643 _ = v_0_0.Args[1]
15644 x := v_0_0.Args[0]
15645 v_0_0_1 := v_0_0.Args[1]
15646 if v_0_0_1.Op != OpConst64 {
15647 continue
15648 }
15649 t2 := v_0_0_1.Type
15650 c := auxIntToInt64(v_0_0_1.AuxInt)
15651 if v_0_1.Op != OpConst8 {
15652 continue
15653 }
15654 d := auxIntToInt8(v_0_1.AuxInt)
15655 if v_1.Op != OpConst64 {
15656 continue
15657 }
15658 e := auxIntToInt64(v_1.AuxInt)
15659 if !(c >= e) {
15660 continue
15661 }
15662 v.reset(OpAnd8)
15663 v0 := b.NewValue0(v.Pos, OpRsh8x64, t)
15664 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15665 v1.AuxInt = int64ToAuxInt(c - e)
15666 v0.AddArg2(x, v1)
15667 v2 := b.NewValue0(v.Pos, OpConst8, t)
15668 v2.AuxInt = int8ToAuxInt(d << e)
15669 v.AddArg2(v0, v2)
15670 return true
15671 }
15672 break
15673 }
15674
15675
15676
15677 for {
15678 if v_0.Op != OpAnd8 {
15679 break
15680 }
15681 _ = v_0.Args[1]
15682 v_0_0 := v_0.Args[0]
15683 v_0_1 := v_0.Args[1]
15684 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15685 if v_0_0.Op != OpRsh8Ux64 {
15686 continue
15687 }
15688 t := v_0_0.Type
15689 _ = v_0_0.Args[1]
15690 x := v_0_0.Args[0]
15691 v_0_0_1 := v_0_0.Args[1]
15692 if v_0_0_1.Op != OpConst64 {
15693 continue
15694 }
15695 t2 := v_0_0_1.Type
15696 c := auxIntToInt64(v_0_0_1.AuxInt)
15697 if v_0_1.Op != OpConst8 {
15698 continue
15699 }
15700 d := auxIntToInt8(v_0_1.AuxInt)
15701 if v_1.Op != OpConst64 {
15702 continue
15703 }
15704 e := auxIntToInt64(v_1.AuxInt)
15705 if !(c >= e) {
15706 continue
15707 }
15708 v.reset(OpAnd8)
15709 v0 := b.NewValue0(v.Pos, OpRsh8Ux64, t)
15710 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15711 v1.AuxInt = int64ToAuxInt(c - e)
15712 v0.AddArg2(x, v1)
15713 v2 := b.NewValue0(v.Pos, OpConst8, t)
15714 v2.AuxInt = int8ToAuxInt(d << e)
15715 v.AddArg2(v0, v2)
15716 return true
15717 }
15718 break
15719 }
15720
15721
15722
15723 for {
15724 if v_0.Op != OpAnd8 {
15725 break
15726 }
15727 _ = v_0.Args[1]
15728 v_0_0 := v_0.Args[0]
15729 v_0_1 := v_0.Args[1]
15730 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15731 if v_0_0.Op != OpRsh8x64 {
15732 continue
15733 }
15734 t := v_0_0.Type
15735 _ = v_0_0.Args[1]
15736 x := v_0_0.Args[0]
15737 v_0_0_1 := v_0_0.Args[1]
15738 if v_0_0_1.Op != OpConst64 {
15739 continue
15740 }
15741 t2 := v_0_0_1.Type
15742 c := auxIntToInt64(v_0_0_1.AuxInt)
15743 if v_0_1.Op != OpConst8 {
15744 continue
15745 }
15746 d := auxIntToInt8(v_0_1.AuxInt)
15747 if v_1.Op != OpConst64 {
15748 continue
15749 }
15750 e := auxIntToInt64(v_1.AuxInt)
15751 if !(c < e) {
15752 continue
15753 }
15754 v.reset(OpAnd8)
15755 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
15756 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15757 v1.AuxInt = int64ToAuxInt(e - c)
15758 v0.AddArg2(x, v1)
15759 v2 := b.NewValue0(v.Pos, OpConst8, t)
15760 v2.AuxInt = int8ToAuxInt(d << e)
15761 v.AddArg2(v0, v2)
15762 return true
15763 }
15764 break
15765 }
15766
15767
15768
15769 for {
15770 if v_0.Op != OpAnd8 {
15771 break
15772 }
15773 _ = v_0.Args[1]
15774 v_0_0 := v_0.Args[0]
15775 v_0_1 := v_0.Args[1]
15776 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15777 if v_0_0.Op != OpRsh8Ux64 {
15778 continue
15779 }
15780 t := v_0_0.Type
15781 _ = v_0_0.Args[1]
15782 x := v_0_0.Args[0]
15783 v_0_0_1 := v_0_0.Args[1]
15784 if v_0_0_1.Op != OpConst64 {
15785 continue
15786 }
15787 t2 := v_0_0_1.Type
15788 c := auxIntToInt64(v_0_0_1.AuxInt)
15789 if v_0_1.Op != OpConst8 {
15790 continue
15791 }
15792 d := auxIntToInt8(v_0_1.AuxInt)
15793 if v_1.Op != OpConst64 {
15794 continue
15795 }
15796 e := auxIntToInt64(v_1.AuxInt)
15797 if !(c < e) {
15798 continue
15799 }
15800 v.reset(OpAnd8)
15801 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
15802 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15803 v1.AuxInt = int64ToAuxInt(e - c)
15804 v0.AddArg2(x, v1)
15805 v2 := b.NewValue0(v.Pos, OpConst8, t)
15806 v2.AuxInt = int8ToAuxInt(d << e)
15807 v.AddArg2(v0, v2)
15808 return true
15809 }
15810 break
15811 }
15812
15813
15814
15815 for {
15816 if auxIntToBool(v.AuxInt) != false {
15817 break
15818 }
15819 x := v_0
15820 con := v_1
15821 if con.Op != OpConst64 {
15822 break
15823 }
15824 c := auxIntToInt64(con.AuxInt)
15825 if !(0 < c && c < 8) {
15826 break
15827 }
15828 v.reset(OpLsh8x64)
15829 v.AuxInt = boolToAuxInt(true)
15830 v.AddArg2(x, con)
15831 return true
15832 }
15833 return false
15834 }
15835 func rewriteValuegeneric_OpLsh8x8(v *Value) bool {
15836 v_1 := v.Args[1]
15837 v_0 := v.Args[0]
15838 b := v.Block
15839
15840
15841 for {
15842 t := v.Type
15843 x := v_0
15844 if v_1.Op != OpConst8 {
15845 break
15846 }
15847 c := auxIntToInt8(v_1.AuxInt)
15848 v.reset(OpLsh8x64)
15849 v0 := b.NewValue0(v.Pos, OpConst64, t)
15850 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
15851 v.AddArg2(x, v0)
15852 return true
15853 }
15854
15855
15856 for {
15857 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
15858 break
15859 }
15860 v.reset(OpConst8)
15861 v.AuxInt = int8ToAuxInt(0)
15862 return true
15863 }
15864
15865
15866
15867 for {
15868 if auxIntToBool(v.AuxInt) != false {
15869 break
15870 }
15871 x := v_0
15872 con := v_1
15873 if con.Op != OpConst8 {
15874 break
15875 }
15876 c := auxIntToInt8(con.AuxInt)
15877 if !(0 < c && c < 8) {
15878 break
15879 }
15880 v.reset(OpLsh8x8)
15881 v.AuxInt = boolToAuxInt(true)
15882 v.AddArg2(x, con)
15883 return true
15884 }
15885 return false
15886 }
15887 func rewriteValuegeneric_OpMemEq(v *Value) bool {
15888 v_3 := v.Args[3]
15889 v_2 := v.Args[2]
15890 v_1 := v.Args[1]
15891 v_0 := v.Args[0]
15892 b := v.Block
15893 config := b.Func.Config
15894 typ := &b.Func.Config.Types
15895
15896
15897 for {
15898 sptr := v_0
15899 tptr := v_1
15900 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 {
15901 break
15902 }
15903 mem := v_3
15904 v.reset(OpEq8)
15905 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
15906 v0.AddArg2(sptr, mem)
15907 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
15908 v1.AddArg2(tptr, mem)
15909 v.AddArg2(v0, v1)
15910 return true
15911 }
15912
15913
15914
15915 for {
15916 sptr := v_0
15917 tptr := v_1
15918 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 {
15919 break
15920 }
15921 mem := v_3
15922 if !(canLoadUnaligned(config)) {
15923 break
15924 }
15925 v.reset(OpEq16)
15926 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
15927 v0.AddArg2(sptr, mem)
15928 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
15929 v1.AddArg2(tptr, mem)
15930 v.AddArg2(v0, v1)
15931 return true
15932 }
15933
15934
15935
15936 for {
15937 sptr := v_0
15938 tptr := v_1
15939 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 {
15940 break
15941 }
15942 mem := v_3
15943 if !(canLoadUnaligned(config)) {
15944 break
15945 }
15946 v.reset(OpEq32)
15947 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
15948 v0.AddArg2(sptr, mem)
15949 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
15950 v1.AddArg2(tptr, mem)
15951 v.AddArg2(v0, v1)
15952 return true
15953 }
15954
15955
15956
15957 for {
15958 sptr := v_0
15959 tptr := v_1
15960 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 {
15961 break
15962 }
15963 mem := v_3
15964 if !(canLoadUnaligned(config) && config.PtrSize == 8) {
15965 break
15966 }
15967 v.reset(OpEq64)
15968 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
15969 v0.AddArg2(sptr, mem)
15970 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
15971 v1.AddArg2(tptr, mem)
15972 v.AddArg2(v0, v1)
15973 return true
15974 }
15975
15976
15977 for {
15978 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 {
15979 break
15980 }
15981 v.reset(OpConstBool)
15982 v.Type = typ.Bool
15983 v.AuxInt = boolToAuxInt(true)
15984 return true
15985 }
15986
15987
15988
15989 for {
15990 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
15991 p := v_0
15992 q := v_1
15993 if !(isSamePtr(p, q)) {
15994 continue
15995 }
15996 v.reset(OpConstBool)
15997 v.Type = typ.Bool
15998 v.AuxInt = boolToAuxInt(true)
15999 return true
16000 }
16001 break
16002 }
16003
16004
16005
16006 for {
16007 p := v_0
16008 q := v_1
16009 if v_2.Op != OpConst64 {
16010 break
16011 }
16012 c := auxIntToInt64(v_2.AuxInt)
16013 mem := v_3
16014 if !((c == 3 || c == 5 || c == 9 || c == 17) && canLoadUnaligned(config) && config.RegSize == 8) {
16015 break
16016 }
16017 v.reset(OpAndB)
16018 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
16019 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
16020 v1.AuxInt = int64ToAuxInt(c - 1)
16021 v0.AddArg4(p, q, v1, mem)
16022 v2 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
16023 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
16024 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
16025 v4.AuxInt = int64ToAuxInt(c - 1)
16026 v4.AddArg(p)
16027 v3.AddArg2(v4, mem)
16028 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
16029 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
16030 v6.AuxInt = int64ToAuxInt(c - 1)
16031 v6.AddArg(q)
16032 v5.AddArg2(v6, mem)
16033 v2.AddArg2(v3, v5)
16034 v.AddArg2(v0, v2)
16035 return true
16036 }
16037
16038
16039
16040 for {
16041 p := v_0
16042 q := v_1
16043 if v_2.Op != OpConst64 {
16044 break
16045 }
16046 c := auxIntToInt64(v_2.AuxInt)
16047 mem := v_3
16048 if !((c == 6 || c == 10 || c == 18) && canLoadUnaligned(config) && config.RegSize == 8) {
16049 break
16050 }
16051 v.reset(OpAndB)
16052 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
16053 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
16054 v1.AuxInt = int64ToAuxInt(c - 2)
16055 v0.AddArg4(p, q, v1, mem)
16056 v2 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
16057 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
16058 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
16059 v4.AuxInt = int64ToAuxInt(c - 2)
16060 v4.AddArg(p)
16061 v3.AddArg2(v4, mem)
16062 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
16063 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
16064 v6.AuxInt = int64ToAuxInt(c - 2)
16065 v6.AddArg(q)
16066 v5.AddArg2(v6, mem)
16067 v2.AddArg2(v3, v5)
16068 v.AddArg2(v0, v2)
16069 return true
16070 }
16071
16072
16073
16074 for {
16075 p := v_0
16076 q := v_1
16077 if v_2.Op != OpConst64 {
16078 break
16079 }
16080 c := auxIntToInt64(v_2.AuxInt)
16081 mem := v_3
16082 if !((c == 7 || c == 11 || c == 19 || c == 20) && canLoadUnaligned(config) && config.RegSize == 8) {
16083 break
16084 }
16085 v.reset(OpAndB)
16086 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
16087 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
16088 v1.AuxInt = int64ToAuxInt(min(c-3, 16))
16089 v0.AddArg4(p, q, v1, mem)
16090 v2 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
16091 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
16092 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
16093 v4.AuxInt = int64ToAuxInt(c - 4)
16094 v4.AddArg(p)
16095 v3.AddArg2(v4, mem)
16096 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
16097 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
16098 v6.AuxInt = int64ToAuxInt(c - 4)
16099 v6.AddArg(q)
16100 v5.AddArg2(v6, mem)
16101 v2.AddArg2(v3, v5)
16102 v.AddArg2(v0, v2)
16103 return true
16104 }
16105
16106
16107
16108 for {
16109 p := v_0
16110 q := v_1
16111 if v_2.Op != OpConst64 {
16112 break
16113 }
16114 c := auxIntToInt64(v_2.AuxInt)
16115 mem := v_3
16116 if !(((c >= 12 && c <= 16) || (c >= 21 && c <= 24)) && canLoadUnaligned(config) && config.RegSize == 8) {
16117 break
16118 }
16119 v.reset(OpAndB)
16120 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
16121 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
16122 v1.AuxInt = int64ToAuxInt(8 + int64(bool2int(c > 16))*8)
16123 v0.AddArg4(p, q, v1, mem)
16124 v2 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
16125 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
16126 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
16127 v4.AuxInt = int64ToAuxInt(c - 8)
16128 v4.AddArg(p)
16129 v3.AddArg2(v4, mem)
16130 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
16131 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
16132 v6.AuxInt = int64ToAuxInt(c - 8)
16133 v6.AddArg(q)
16134 v5.AddArg2(v6, mem)
16135 v2.AddArg2(v3, v5)
16136 v.AddArg2(v0, v2)
16137 return true
16138 }
16139
16140
16141
16142 for {
16143 p := v_0
16144 q := v_1
16145 if v_2.Op != OpConst64 {
16146 break
16147 }
16148 c := auxIntToInt64(v_2.AuxInt)
16149 mem := v_3
16150 if !(c >= 25 && c <= 32 && canLoadUnaligned(config) && config.RegSize == 8) {
16151 break
16152 }
16153 v.reset(OpAndB)
16154 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
16155 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
16156 v1.AuxInt = int64ToAuxInt(16)
16157 v0.AddArg4(p, q, v1, mem)
16158 v2 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
16159 v3 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
16160 v3.AuxInt = int64ToAuxInt(16)
16161 v3.AddArg(p)
16162 v4 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
16163 v4.AuxInt = int64ToAuxInt(16)
16164 v4.AddArg(q)
16165 v5 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
16166 v5.AuxInt = int64ToAuxInt(c - 16)
16167 v2.AddArg4(v3, v4, v5, mem)
16168 v.AddArg2(v0, v2)
16169 return true
16170 }
16171 return false
16172 }
16173 func rewriteValuegeneric_OpMod16(v *Value) bool {
16174 v_1 := v.Args[1]
16175 v_0 := v.Args[0]
16176 b := v.Block
16177
16178
16179
16180 for {
16181 if v_0.Op != OpConst16 {
16182 break
16183 }
16184 c := auxIntToInt16(v_0.AuxInt)
16185 if v_1.Op != OpConst16 {
16186 break
16187 }
16188 d := auxIntToInt16(v_1.AuxInt)
16189 if !(d != 0) {
16190 break
16191 }
16192 v.reset(OpConst16)
16193 v.AuxInt = int16ToAuxInt(c % d)
16194 return true
16195 }
16196
16197
16198
16199 for {
16200 t := v.Type
16201 n := v_0
16202 if v_1.Op != OpConst16 {
16203 break
16204 }
16205 c := auxIntToInt16(v_1.AuxInt)
16206 if !(isNonNegative(n) && isPowerOfTwo(c)) {
16207 break
16208 }
16209 v.reset(OpAnd16)
16210 v0 := b.NewValue0(v.Pos, OpConst16, t)
16211 v0.AuxInt = int16ToAuxInt(c - 1)
16212 v.AddArg2(n, v0)
16213 return true
16214 }
16215
16216
16217
16218 for {
16219 t := v.Type
16220 n := v_0
16221 if v_1.Op != OpConst16 {
16222 break
16223 }
16224 c := auxIntToInt16(v_1.AuxInt)
16225 if !(c < 0 && c != -1<<15) {
16226 break
16227 }
16228 v.reset(OpMod16)
16229 v.Type = t
16230 v0 := b.NewValue0(v.Pos, OpConst16, t)
16231 v0.AuxInt = int16ToAuxInt(-c)
16232 v.AddArg2(n, v0)
16233 return true
16234 }
16235
16236
16237
16238 for {
16239 t := v.Type
16240 x := v_0
16241 if v_1.Op != OpConst16 {
16242 break
16243 }
16244 c := auxIntToInt16(v_1.AuxInt)
16245 if !(x.Op != OpConst16 && (c > 0 || c == -1<<15)) {
16246 break
16247 }
16248 v.reset(OpSub16)
16249 v0 := b.NewValue0(v.Pos, OpMul16, t)
16250 v1 := b.NewValue0(v.Pos, OpDiv16, t)
16251 v2 := b.NewValue0(v.Pos, OpConst16, t)
16252 v2.AuxInt = int16ToAuxInt(c)
16253 v1.AddArg2(x, v2)
16254 v0.AddArg2(v1, v2)
16255 v.AddArg2(x, v0)
16256 return true
16257 }
16258 return false
16259 }
16260 func rewriteValuegeneric_OpMod16u(v *Value) bool {
16261 v_1 := v.Args[1]
16262 v_0 := v.Args[0]
16263 b := v.Block
16264
16265
16266
16267 for {
16268 if v_0.Op != OpConst16 {
16269 break
16270 }
16271 c := auxIntToInt16(v_0.AuxInt)
16272 if v_1.Op != OpConst16 {
16273 break
16274 }
16275 d := auxIntToInt16(v_1.AuxInt)
16276 if !(d != 0) {
16277 break
16278 }
16279 v.reset(OpConst16)
16280 v.AuxInt = int16ToAuxInt(int16(uint16(c) % uint16(d)))
16281 return true
16282 }
16283
16284
16285
16286 for {
16287 t := v.Type
16288 n := v_0
16289 if v_1.Op != OpConst16 {
16290 break
16291 }
16292 c := auxIntToInt16(v_1.AuxInt)
16293 if !(isPowerOfTwo(uint16(c))) {
16294 break
16295 }
16296 v.reset(OpAnd16)
16297 v0 := b.NewValue0(v.Pos, OpConst16, t)
16298 v0.AuxInt = int16ToAuxInt(c - 1)
16299 v.AddArg2(n, v0)
16300 return true
16301 }
16302
16303
16304
16305 for {
16306 t := v.Type
16307 x := v_0
16308 if v_1.Op != OpConst16 {
16309 break
16310 }
16311 c := auxIntToInt16(v_1.AuxInt)
16312 if !(x.Op != OpConst16 && c != 0) {
16313 break
16314 }
16315 v.reset(OpSub16)
16316 v0 := b.NewValue0(v.Pos, OpMul16, t)
16317 v1 := b.NewValue0(v.Pos, OpDiv16u, t)
16318 v2 := b.NewValue0(v.Pos, OpConst16, t)
16319 v2.AuxInt = int16ToAuxInt(c)
16320 v1.AddArg2(x, v2)
16321 v0.AddArg2(v1, v2)
16322 v.AddArg2(x, v0)
16323 return true
16324 }
16325 return false
16326 }
16327 func rewriteValuegeneric_OpMod32(v *Value) bool {
16328 v_1 := v.Args[1]
16329 v_0 := v.Args[0]
16330 b := v.Block
16331
16332
16333
16334 for {
16335 if v_0.Op != OpConst32 {
16336 break
16337 }
16338 c := auxIntToInt32(v_0.AuxInt)
16339 if v_1.Op != OpConst32 {
16340 break
16341 }
16342 d := auxIntToInt32(v_1.AuxInt)
16343 if !(d != 0) {
16344 break
16345 }
16346 v.reset(OpConst32)
16347 v.AuxInt = int32ToAuxInt(c % d)
16348 return true
16349 }
16350
16351
16352
16353 for {
16354 t := v.Type
16355 n := v_0
16356 if v_1.Op != OpConst32 {
16357 break
16358 }
16359 c := auxIntToInt32(v_1.AuxInt)
16360 if !(isNonNegative(n) && isPowerOfTwo(c)) {
16361 break
16362 }
16363 v.reset(OpAnd32)
16364 v0 := b.NewValue0(v.Pos, OpConst32, t)
16365 v0.AuxInt = int32ToAuxInt(c - 1)
16366 v.AddArg2(n, v0)
16367 return true
16368 }
16369
16370
16371
16372 for {
16373 t := v.Type
16374 n := v_0
16375 if v_1.Op != OpConst32 {
16376 break
16377 }
16378 c := auxIntToInt32(v_1.AuxInt)
16379 if !(c < 0 && c != -1<<31) {
16380 break
16381 }
16382 v.reset(OpMod32)
16383 v.Type = t
16384 v0 := b.NewValue0(v.Pos, OpConst32, t)
16385 v0.AuxInt = int32ToAuxInt(-c)
16386 v.AddArg2(n, v0)
16387 return true
16388 }
16389
16390
16391
16392 for {
16393 t := v.Type
16394 x := v_0
16395 if v_1.Op != OpConst32 {
16396 break
16397 }
16398 c := auxIntToInt32(v_1.AuxInt)
16399 if !(x.Op != OpConst32 && (c > 0 || c == -1<<31)) {
16400 break
16401 }
16402 v.reset(OpSub32)
16403 v0 := b.NewValue0(v.Pos, OpMul32, t)
16404 v1 := b.NewValue0(v.Pos, OpDiv32, t)
16405 v2 := b.NewValue0(v.Pos, OpConst32, t)
16406 v2.AuxInt = int32ToAuxInt(c)
16407 v1.AddArg2(x, v2)
16408 v0.AddArg2(v1, v2)
16409 v.AddArg2(x, v0)
16410 return true
16411 }
16412 return false
16413 }
16414 func rewriteValuegeneric_OpMod32u(v *Value) bool {
16415 v_1 := v.Args[1]
16416 v_0 := v.Args[0]
16417 b := v.Block
16418
16419
16420
16421 for {
16422 if v_0.Op != OpConst32 {
16423 break
16424 }
16425 c := auxIntToInt32(v_0.AuxInt)
16426 if v_1.Op != OpConst32 {
16427 break
16428 }
16429 d := auxIntToInt32(v_1.AuxInt)
16430 if !(d != 0) {
16431 break
16432 }
16433 v.reset(OpConst32)
16434 v.AuxInt = int32ToAuxInt(int32(uint32(c) % uint32(d)))
16435 return true
16436 }
16437
16438
16439
16440 for {
16441 t := v.Type
16442 n := v_0
16443 if v_1.Op != OpConst32 {
16444 break
16445 }
16446 c := auxIntToInt32(v_1.AuxInt)
16447 if !(isPowerOfTwo(uint32(c))) {
16448 break
16449 }
16450 v.reset(OpAnd32)
16451 v0 := b.NewValue0(v.Pos, OpConst32, t)
16452 v0.AuxInt = int32ToAuxInt(c - 1)
16453 v.AddArg2(n, v0)
16454 return true
16455 }
16456
16457
16458
16459 for {
16460 t := v.Type
16461 x := v_0
16462 if v_1.Op != OpConst32 {
16463 break
16464 }
16465 c := auxIntToInt32(v_1.AuxInt)
16466 if !(x.Op != OpConst32 && c != 0) {
16467 break
16468 }
16469 v.reset(OpSub32)
16470 v0 := b.NewValue0(v.Pos, OpMul32, t)
16471 v1 := b.NewValue0(v.Pos, OpDiv32u, t)
16472 v2 := b.NewValue0(v.Pos, OpConst32, t)
16473 v2.AuxInt = int32ToAuxInt(c)
16474 v1.AddArg2(x, v2)
16475 v0.AddArg2(v1, v2)
16476 v.AddArg2(x, v0)
16477 return true
16478 }
16479 return false
16480 }
16481 func rewriteValuegeneric_OpMod64(v *Value) bool {
16482 v_1 := v.Args[1]
16483 v_0 := v.Args[0]
16484 b := v.Block
16485
16486
16487
16488 for {
16489 if v_0.Op != OpConst64 {
16490 break
16491 }
16492 c := auxIntToInt64(v_0.AuxInt)
16493 if v_1.Op != OpConst64 {
16494 break
16495 }
16496 d := auxIntToInt64(v_1.AuxInt)
16497 if !(d != 0) {
16498 break
16499 }
16500 v.reset(OpConst64)
16501 v.AuxInt = int64ToAuxInt(c % d)
16502 return true
16503 }
16504
16505
16506
16507 for {
16508 t := v.Type
16509 n := v_0
16510 if v_1.Op != OpConst64 {
16511 break
16512 }
16513 c := auxIntToInt64(v_1.AuxInt)
16514 if !(isNonNegative(n) && isPowerOfTwo(c)) {
16515 break
16516 }
16517 v.reset(OpAnd64)
16518 v0 := b.NewValue0(v.Pos, OpConst64, t)
16519 v0.AuxInt = int64ToAuxInt(c - 1)
16520 v.AddArg2(n, v0)
16521 return true
16522 }
16523
16524
16525
16526 for {
16527 n := v_0
16528 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 || !(isNonNegative(n)) {
16529 break
16530 }
16531 v.copyOf(n)
16532 return true
16533 }
16534
16535
16536
16537 for {
16538 t := v.Type
16539 n := v_0
16540 if v_1.Op != OpConst64 {
16541 break
16542 }
16543 c := auxIntToInt64(v_1.AuxInt)
16544 if !(c < 0 && c != -1<<63) {
16545 break
16546 }
16547 v.reset(OpMod64)
16548 v.Type = t
16549 v0 := b.NewValue0(v.Pos, OpConst64, t)
16550 v0.AuxInt = int64ToAuxInt(-c)
16551 v.AddArg2(n, v0)
16552 return true
16553 }
16554
16555
16556
16557 for {
16558 t := v.Type
16559 x := v_0
16560 if v_1.Op != OpConst64 {
16561 break
16562 }
16563 c := auxIntToInt64(v_1.AuxInt)
16564 if !(x.Op != OpConst64 && (c > 0 || c == -1<<63)) {
16565 break
16566 }
16567 v.reset(OpSub64)
16568 v0 := b.NewValue0(v.Pos, OpMul64, t)
16569 v1 := b.NewValue0(v.Pos, OpDiv64, t)
16570 v2 := b.NewValue0(v.Pos, OpConst64, t)
16571 v2.AuxInt = int64ToAuxInt(c)
16572 v1.AddArg2(x, v2)
16573 v0.AddArg2(v1, v2)
16574 v.AddArg2(x, v0)
16575 return true
16576 }
16577 return false
16578 }
16579 func rewriteValuegeneric_OpMod64u(v *Value) bool {
16580 v_1 := v.Args[1]
16581 v_0 := v.Args[0]
16582 b := v.Block
16583
16584
16585
16586 for {
16587 if v_0.Op != OpConst64 {
16588 break
16589 }
16590 c := auxIntToInt64(v_0.AuxInt)
16591 if v_1.Op != OpConst64 {
16592 break
16593 }
16594 d := auxIntToInt64(v_1.AuxInt)
16595 if !(d != 0) {
16596 break
16597 }
16598 v.reset(OpConst64)
16599 v.AuxInt = int64ToAuxInt(int64(uint64(c) % uint64(d)))
16600 return true
16601 }
16602
16603
16604
16605 for {
16606 t := v.Type
16607 n := v_0
16608 if v_1.Op != OpConst64 {
16609 break
16610 }
16611 c := auxIntToInt64(v_1.AuxInt)
16612 if !(isPowerOfTwo(uint64(c))) {
16613 break
16614 }
16615 v.reset(OpAnd64)
16616 v0 := b.NewValue0(v.Pos, OpConst64, t)
16617 v0.AuxInt = int64ToAuxInt(c - 1)
16618 v.AddArg2(n, v0)
16619 return true
16620 }
16621
16622
16623
16624 for {
16625 t := v.Type
16626 x := v_0
16627 if v_1.Op != OpConst64 {
16628 break
16629 }
16630 c := auxIntToInt64(v_1.AuxInt)
16631 if !(x.Op != OpConst64 && c != 0) {
16632 break
16633 }
16634 v.reset(OpSub64)
16635 v0 := b.NewValue0(v.Pos, OpMul64, t)
16636 v1 := b.NewValue0(v.Pos, OpDiv64u, t)
16637 v2 := b.NewValue0(v.Pos, OpConst64, t)
16638 v2.AuxInt = int64ToAuxInt(c)
16639 v1.AddArg2(x, v2)
16640 v0.AddArg2(v1, v2)
16641 v.AddArg2(x, v0)
16642 return true
16643 }
16644 return false
16645 }
16646 func rewriteValuegeneric_OpMod8(v *Value) bool {
16647 v_1 := v.Args[1]
16648 v_0 := v.Args[0]
16649 b := v.Block
16650
16651
16652
16653 for {
16654 if v_0.Op != OpConst8 {
16655 break
16656 }
16657 c := auxIntToInt8(v_0.AuxInt)
16658 if v_1.Op != OpConst8 {
16659 break
16660 }
16661 d := auxIntToInt8(v_1.AuxInt)
16662 if !(d != 0) {
16663 break
16664 }
16665 v.reset(OpConst8)
16666 v.AuxInt = int8ToAuxInt(c % d)
16667 return true
16668 }
16669
16670
16671
16672 for {
16673 t := v.Type
16674 n := v_0
16675 if v_1.Op != OpConst8 {
16676 break
16677 }
16678 c := auxIntToInt8(v_1.AuxInt)
16679 if !(isNonNegative(n) && isPowerOfTwo(c)) {
16680 break
16681 }
16682 v.reset(OpAnd8)
16683 v0 := b.NewValue0(v.Pos, OpConst8, t)
16684 v0.AuxInt = int8ToAuxInt(c - 1)
16685 v.AddArg2(n, v0)
16686 return true
16687 }
16688
16689
16690
16691 for {
16692 t := v.Type
16693 n := v_0
16694 if v_1.Op != OpConst8 {
16695 break
16696 }
16697 c := auxIntToInt8(v_1.AuxInt)
16698 if !(c < 0 && c != -1<<7) {
16699 break
16700 }
16701 v.reset(OpMod8)
16702 v.Type = t
16703 v0 := b.NewValue0(v.Pos, OpConst8, t)
16704 v0.AuxInt = int8ToAuxInt(-c)
16705 v.AddArg2(n, v0)
16706 return true
16707 }
16708
16709
16710
16711 for {
16712 t := v.Type
16713 x := v_0
16714 if v_1.Op != OpConst8 {
16715 break
16716 }
16717 c := auxIntToInt8(v_1.AuxInt)
16718 if !(x.Op != OpConst8 && (c > 0 || c == -1<<7)) {
16719 break
16720 }
16721 v.reset(OpSub8)
16722 v0 := b.NewValue0(v.Pos, OpMul8, t)
16723 v1 := b.NewValue0(v.Pos, OpDiv8, t)
16724 v2 := b.NewValue0(v.Pos, OpConst8, t)
16725 v2.AuxInt = int8ToAuxInt(c)
16726 v1.AddArg2(x, v2)
16727 v0.AddArg2(v1, v2)
16728 v.AddArg2(x, v0)
16729 return true
16730 }
16731 return false
16732 }
16733 func rewriteValuegeneric_OpMod8u(v *Value) bool {
16734 v_1 := v.Args[1]
16735 v_0 := v.Args[0]
16736 b := v.Block
16737
16738
16739
16740 for {
16741 if v_0.Op != OpConst8 {
16742 break
16743 }
16744 c := auxIntToInt8(v_0.AuxInt)
16745 if v_1.Op != OpConst8 {
16746 break
16747 }
16748 d := auxIntToInt8(v_1.AuxInt)
16749 if !(d != 0) {
16750 break
16751 }
16752 v.reset(OpConst8)
16753 v.AuxInt = int8ToAuxInt(int8(uint8(c) % uint8(d)))
16754 return true
16755 }
16756
16757
16758
16759 for {
16760 t := v.Type
16761 n := v_0
16762 if v_1.Op != OpConst8 {
16763 break
16764 }
16765 c := auxIntToInt8(v_1.AuxInt)
16766 if !(isPowerOfTwo(uint8(c))) {
16767 break
16768 }
16769 v.reset(OpAnd8)
16770 v0 := b.NewValue0(v.Pos, OpConst8, t)
16771 v0.AuxInt = int8ToAuxInt(c - 1)
16772 v.AddArg2(n, v0)
16773 return true
16774 }
16775
16776
16777
16778 for {
16779 t := v.Type
16780 x := v_0
16781 if v_1.Op != OpConst8 {
16782 break
16783 }
16784 c := auxIntToInt8(v_1.AuxInt)
16785 if !(x.Op != OpConst8 && c != 0) {
16786 break
16787 }
16788 v.reset(OpSub8)
16789 v0 := b.NewValue0(v.Pos, OpMul8, t)
16790 v1 := b.NewValue0(v.Pos, OpDiv8u, t)
16791 v2 := b.NewValue0(v.Pos, OpConst8, t)
16792 v2.AuxInt = int8ToAuxInt(c)
16793 v1.AddArg2(x, v2)
16794 v0.AddArg2(v1, v2)
16795 v.AddArg2(x, v0)
16796 return true
16797 }
16798 return false
16799 }
16800 func rewriteValuegeneric_OpMove(v *Value) bool {
16801 v_2 := v.Args[2]
16802 v_1 := v.Args[1]
16803 v_0 := v.Args[0]
16804 b := v.Block
16805 config := b.Func.Config
16806
16807
16808
16809 for {
16810 n := auxIntToInt64(v.AuxInt)
16811 t := auxToType(v.Aux)
16812 dst1 := v_0
16813 src := v_1
16814 mem := v_2
16815 if mem.Op != OpZero || auxIntToInt64(mem.AuxInt) != n || auxToType(mem.Aux) != t {
16816 break
16817 }
16818 dst2 := mem.Args[0]
16819 if !(isSamePtr(src, dst2)) {
16820 break
16821 }
16822 v.reset(OpZero)
16823 v.AuxInt = int64ToAuxInt(n)
16824 v.Aux = typeToAux(t)
16825 v.AddArg2(dst1, mem)
16826 return true
16827 }
16828
16829
16830
16831 for {
16832 n := auxIntToInt64(v.AuxInt)
16833 t := auxToType(v.Aux)
16834 dst1 := v_0
16835 src := v_1
16836 mem := v_2
16837 if mem.Op != OpVarDef {
16838 break
16839 }
16840 mem_0 := mem.Args[0]
16841 if mem_0.Op != OpZero || auxIntToInt64(mem_0.AuxInt) != n || auxToType(mem_0.Aux) != t {
16842 break
16843 }
16844 dst0 := mem_0.Args[0]
16845 if !(isSamePtr(src, dst0)) {
16846 break
16847 }
16848 v.reset(OpZero)
16849 v.AuxInt = int64ToAuxInt(n)
16850 v.Aux = typeToAux(t)
16851 v.AddArg2(dst1, mem)
16852 return true
16853 }
16854
16855
16856
16857 for {
16858 n := auxIntToInt64(v.AuxInt)
16859 t := auxToType(v.Aux)
16860 dst := v_0
16861 if v_1.Op != OpAddr {
16862 break
16863 }
16864 sym := auxToSym(v_1.Aux)
16865 v_1_0 := v_1.Args[0]
16866 if v_1_0.Op != OpSB {
16867 break
16868 }
16869 mem := v_2
16870 if !(symIsROZero(sym)) {
16871 break
16872 }
16873 v.reset(OpZero)
16874 v.AuxInt = int64ToAuxInt(n)
16875 v.Aux = typeToAux(t)
16876 v.AddArg2(dst, mem)
16877 return true
16878 }
16879
16880
16881
16882 for {
16883 n := auxIntToInt64(v.AuxInt)
16884 t1 := auxToType(v.Aux)
16885 dst1 := v_0
16886 src1 := v_1
16887 store := v_2
16888 if store.Op != OpStore {
16889 break
16890 }
16891 t2 := auxToType(store.Aux)
16892 mem := store.Args[2]
16893 op := store.Args[0]
16894 if op.Op != OpOffPtr {
16895 break
16896 }
16897 o2 := auxIntToInt64(op.AuxInt)
16898 dst2 := op.Args[0]
16899 if !(isSamePtr(dst1, dst2) && store.Uses == 1 && n >= o2+t2.Size() && disjoint(src1, n, op, t2.Size()) && clobber(store)) {
16900 break
16901 }
16902 v.reset(OpMove)
16903 v.AuxInt = int64ToAuxInt(n)
16904 v.Aux = typeToAux(t1)
16905 v.AddArg3(dst1, src1, mem)
16906 return true
16907 }
16908
16909
16910
16911 for {
16912 n := auxIntToInt64(v.AuxInt)
16913 t := auxToType(v.Aux)
16914 dst1 := v_0
16915 src1 := v_1
16916 move := v_2
16917 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
16918 break
16919 }
16920 mem := move.Args[2]
16921 dst2 := move.Args[0]
16922 if !(move.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move)) {
16923 break
16924 }
16925 v.reset(OpMove)
16926 v.AuxInt = int64ToAuxInt(n)
16927 v.Aux = typeToAux(t)
16928 v.AddArg3(dst1, src1, mem)
16929 return true
16930 }
16931
16932
16933
16934 for {
16935 n := auxIntToInt64(v.AuxInt)
16936 t := auxToType(v.Aux)
16937 dst1 := v_0
16938 src1 := v_1
16939 vardef := v_2
16940 if vardef.Op != OpVarDef {
16941 break
16942 }
16943 x := auxToSym(vardef.Aux)
16944 move := vardef.Args[0]
16945 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
16946 break
16947 }
16948 mem := move.Args[2]
16949 dst2 := move.Args[0]
16950 if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move, vardef)) {
16951 break
16952 }
16953 v.reset(OpMove)
16954 v.AuxInt = int64ToAuxInt(n)
16955 v.Aux = typeToAux(t)
16956 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
16957 v0.Aux = symToAux(x)
16958 v0.AddArg(mem)
16959 v.AddArg3(dst1, src1, v0)
16960 return true
16961 }
16962
16963
16964
16965 for {
16966 n := auxIntToInt64(v.AuxInt)
16967 t := auxToType(v.Aux)
16968 dst1 := v_0
16969 src1 := v_1
16970 zero := v_2
16971 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != n || auxToType(zero.Aux) != t {
16972 break
16973 }
16974 mem := zero.Args[1]
16975 dst2 := zero.Args[0]
16976 if !(zero.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero)) {
16977 break
16978 }
16979 v.reset(OpMove)
16980 v.AuxInt = int64ToAuxInt(n)
16981 v.Aux = typeToAux(t)
16982 v.AddArg3(dst1, src1, mem)
16983 return true
16984 }
16985
16986
16987
16988 for {
16989 n := auxIntToInt64(v.AuxInt)
16990 t := auxToType(v.Aux)
16991 dst1 := v_0
16992 src1 := v_1
16993 vardef := v_2
16994 if vardef.Op != OpVarDef {
16995 break
16996 }
16997 x := auxToSym(vardef.Aux)
16998 zero := vardef.Args[0]
16999 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != n || auxToType(zero.Aux) != t {
17000 break
17001 }
17002 mem := zero.Args[1]
17003 dst2 := zero.Args[0]
17004 if !(zero.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero, vardef)) {
17005 break
17006 }
17007 v.reset(OpMove)
17008 v.AuxInt = int64ToAuxInt(n)
17009 v.Aux = typeToAux(t)
17010 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
17011 v0.Aux = symToAux(x)
17012 v0.AddArg(mem)
17013 v.AddArg3(dst1, src1, v0)
17014 return true
17015 }
17016
17017
17018
17019 for {
17020 n := auxIntToInt64(v.AuxInt)
17021 t1 := auxToType(v.Aux)
17022 dst := v_0
17023 p1 := v_1
17024 mem := v_2
17025 if mem.Op != OpStore {
17026 break
17027 }
17028 t2 := auxToType(mem.Aux)
17029 _ = mem.Args[2]
17030 op2 := mem.Args[0]
17031 if op2.Op != OpOffPtr {
17032 break
17033 }
17034 tt2 := op2.Type
17035 o2 := auxIntToInt64(op2.AuxInt)
17036 p2 := op2.Args[0]
17037 d1 := mem.Args[1]
17038 mem_2 := mem.Args[2]
17039 if mem_2.Op != OpStore {
17040 break
17041 }
17042 t3 := auxToType(mem_2.Aux)
17043 d2 := mem_2.Args[1]
17044 op3 := mem_2.Args[0]
17045 if op3.Op != OpOffPtr {
17046 break
17047 }
17048 tt3 := op3.Type
17049 if auxIntToInt64(op3.AuxInt) != 0 {
17050 break
17051 }
17052 p3 := op3.Args[0]
17053 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()) {
17054 break
17055 }
17056 v.reset(OpStore)
17057 v.Aux = typeToAux(t2)
17058 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17059 v0.AuxInt = int64ToAuxInt(o2)
17060 v0.AddArg(dst)
17061 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17062 v1.Aux = typeToAux(t3)
17063 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17064 v2.AuxInt = int64ToAuxInt(0)
17065 v2.AddArg(dst)
17066 v1.AddArg3(v2, d2, mem)
17067 v.AddArg3(v0, d1, v1)
17068 return true
17069 }
17070
17071
17072
17073 for {
17074 n := auxIntToInt64(v.AuxInt)
17075 t1 := auxToType(v.Aux)
17076 dst := v_0
17077 p1 := v_1
17078 mem := v_2
17079 if mem.Op != OpStore {
17080 break
17081 }
17082 t2 := auxToType(mem.Aux)
17083 _ = mem.Args[2]
17084 op2 := mem.Args[0]
17085 if op2.Op != OpOffPtr {
17086 break
17087 }
17088 tt2 := op2.Type
17089 o2 := auxIntToInt64(op2.AuxInt)
17090 p2 := op2.Args[0]
17091 d1 := mem.Args[1]
17092 mem_2 := mem.Args[2]
17093 if mem_2.Op != OpStore {
17094 break
17095 }
17096 t3 := auxToType(mem_2.Aux)
17097 _ = mem_2.Args[2]
17098 op3 := mem_2.Args[0]
17099 if op3.Op != OpOffPtr {
17100 break
17101 }
17102 tt3 := op3.Type
17103 o3 := auxIntToInt64(op3.AuxInt)
17104 p3 := op3.Args[0]
17105 d2 := mem_2.Args[1]
17106 mem_2_2 := mem_2.Args[2]
17107 if mem_2_2.Op != OpStore {
17108 break
17109 }
17110 t4 := auxToType(mem_2_2.Aux)
17111 d3 := mem_2_2.Args[1]
17112 op4 := mem_2_2.Args[0]
17113 if op4.Op != OpOffPtr {
17114 break
17115 }
17116 tt4 := op4.Type
17117 if auxIntToInt64(op4.AuxInt) != 0 {
17118 break
17119 }
17120 p4 := op4.Args[0]
17121 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()) {
17122 break
17123 }
17124 v.reset(OpStore)
17125 v.Aux = typeToAux(t2)
17126 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17127 v0.AuxInt = int64ToAuxInt(o2)
17128 v0.AddArg(dst)
17129 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17130 v1.Aux = typeToAux(t3)
17131 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17132 v2.AuxInt = int64ToAuxInt(o3)
17133 v2.AddArg(dst)
17134 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17135 v3.Aux = typeToAux(t4)
17136 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17137 v4.AuxInt = int64ToAuxInt(0)
17138 v4.AddArg(dst)
17139 v3.AddArg3(v4, d3, mem)
17140 v1.AddArg3(v2, d2, v3)
17141 v.AddArg3(v0, d1, v1)
17142 return true
17143 }
17144
17145
17146
17147 for {
17148 n := auxIntToInt64(v.AuxInt)
17149 t1 := auxToType(v.Aux)
17150 dst := v_0
17151 p1 := v_1
17152 mem := v_2
17153 if mem.Op != OpStore {
17154 break
17155 }
17156 t2 := auxToType(mem.Aux)
17157 _ = mem.Args[2]
17158 op2 := mem.Args[0]
17159 if op2.Op != OpOffPtr {
17160 break
17161 }
17162 tt2 := op2.Type
17163 o2 := auxIntToInt64(op2.AuxInt)
17164 p2 := op2.Args[0]
17165 d1 := mem.Args[1]
17166 mem_2 := mem.Args[2]
17167 if mem_2.Op != OpStore {
17168 break
17169 }
17170 t3 := auxToType(mem_2.Aux)
17171 _ = mem_2.Args[2]
17172 op3 := mem_2.Args[0]
17173 if op3.Op != OpOffPtr {
17174 break
17175 }
17176 tt3 := op3.Type
17177 o3 := auxIntToInt64(op3.AuxInt)
17178 p3 := op3.Args[0]
17179 d2 := mem_2.Args[1]
17180 mem_2_2 := mem_2.Args[2]
17181 if mem_2_2.Op != OpStore {
17182 break
17183 }
17184 t4 := auxToType(mem_2_2.Aux)
17185 _ = mem_2_2.Args[2]
17186 op4 := mem_2_2.Args[0]
17187 if op4.Op != OpOffPtr {
17188 break
17189 }
17190 tt4 := op4.Type
17191 o4 := auxIntToInt64(op4.AuxInt)
17192 p4 := op4.Args[0]
17193 d3 := mem_2_2.Args[1]
17194 mem_2_2_2 := mem_2_2.Args[2]
17195 if mem_2_2_2.Op != OpStore {
17196 break
17197 }
17198 t5 := auxToType(mem_2_2_2.Aux)
17199 d4 := mem_2_2_2.Args[1]
17200 op5 := mem_2_2_2.Args[0]
17201 if op5.Op != OpOffPtr {
17202 break
17203 }
17204 tt5 := op5.Type
17205 if auxIntToInt64(op5.AuxInt) != 0 {
17206 break
17207 }
17208 p5 := op5.Args[0]
17209 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()) {
17210 break
17211 }
17212 v.reset(OpStore)
17213 v.Aux = typeToAux(t2)
17214 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17215 v0.AuxInt = int64ToAuxInt(o2)
17216 v0.AddArg(dst)
17217 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17218 v1.Aux = typeToAux(t3)
17219 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17220 v2.AuxInt = int64ToAuxInt(o3)
17221 v2.AddArg(dst)
17222 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17223 v3.Aux = typeToAux(t4)
17224 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17225 v4.AuxInt = int64ToAuxInt(o4)
17226 v4.AddArg(dst)
17227 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17228 v5.Aux = typeToAux(t5)
17229 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
17230 v6.AuxInt = int64ToAuxInt(0)
17231 v6.AddArg(dst)
17232 v5.AddArg3(v6, d4, mem)
17233 v3.AddArg3(v4, d3, v5)
17234 v1.AddArg3(v2, d2, v3)
17235 v.AddArg3(v0, d1, v1)
17236 return true
17237 }
17238
17239
17240
17241 for {
17242 n := auxIntToInt64(v.AuxInt)
17243 t1 := auxToType(v.Aux)
17244 dst := v_0
17245 p1 := v_1
17246 mem := v_2
17247 if mem.Op != OpVarDef {
17248 break
17249 }
17250 mem_0 := mem.Args[0]
17251 if mem_0.Op != OpStore {
17252 break
17253 }
17254 t2 := auxToType(mem_0.Aux)
17255 _ = mem_0.Args[2]
17256 op2 := mem_0.Args[0]
17257 if op2.Op != OpOffPtr {
17258 break
17259 }
17260 tt2 := op2.Type
17261 o2 := auxIntToInt64(op2.AuxInt)
17262 p2 := op2.Args[0]
17263 d1 := mem_0.Args[1]
17264 mem_0_2 := mem_0.Args[2]
17265 if mem_0_2.Op != OpStore {
17266 break
17267 }
17268 t3 := auxToType(mem_0_2.Aux)
17269 d2 := mem_0_2.Args[1]
17270 op3 := mem_0_2.Args[0]
17271 if op3.Op != OpOffPtr {
17272 break
17273 }
17274 tt3 := op3.Type
17275 if auxIntToInt64(op3.AuxInt) != 0 {
17276 break
17277 }
17278 p3 := op3.Args[0]
17279 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()) {
17280 break
17281 }
17282 v.reset(OpStore)
17283 v.Aux = typeToAux(t2)
17284 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17285 v0.AuxInt = int64ToAuxInt(o2)
17286 v0.AddArg(dst)
17287 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17288 v1.Aux = typeToAux(t3)
17289 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17290 v2.AuxInt = int64ToAuxInt(0)
17291 v2.AddArg(dst)
17292 v1.AddArg3(v2, d2, mem)
17293 v.AddArg3(v0, d1, v1)
17294 return true
17295 }
17296
17297
17298
17299 for {
17300 n := auxIntToInt64(v.AuxInt)
17301 t1 := auxToType(v.Aux)
17302 dst := v_0
17303 p1 := v_1
17304 mem := v_2
17305 if mem.Op != OpVarDef {
17306 break
17307 }
17308 mem_0 := mem.Args[0]
17309 if mem_0.Op != OpStore {
17310 break
17311 }
17312 t2 := auxToType(mem_0.Aux)
17313 _ = mem_0.Args[2]
17314 op2 := mem_0.Args[0]
17315 if op2.Op != OpOffPtr {
17316 break
17317 }
17318 tt2 := op2.Type
17319 o2 := auxIntToInt64(op2.AuxInt)
17320 p2 := op2.Args[0]
17321 d1 := mem_0.Args[1]
17322 mem_0_2 := mem_0.Args[2]
17323 if mem_0_2.Op != OpStore {
17324 break
17325 }
17326 t3 := auxToType(mem_0_2.Aux)
17327 _ = mem_0_2.Args[2]
17328 op3 := mem_0_2.Args[0]
17329 if op3.Op != OpOffPtr {
17330 break
17331 }
17332 tt3 := op3.Type
17333 o3 := auxIntToInt64(op3.AuxInt)
17334 p3 := op3.Args[0]
17335 d2 := mem_0_2.Args[1]
17336 mem_0_2_2 := mem_0_2.Args[2]
17337 if mem_0_2_2.Op != OpStore {
17338 break
17339 }
17340 t4 := auxToType(mem_0_2_2.Aux)
17341 d3 := mem_0_2_2.Args[1]
17342 op4 := mem_0_2_2.Args[0]
17343 if op4.Op != OpOffPtr {
17344 break
17345 }
17346 tt4 := op4.Type
17347 if auxIntToInt64(op4.AuxInt) != 0 {
17348 break
17349 }
17350 p4 := op4.Args[0]
17351 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()) {
17352 break
17353 }
17354 v.reset(OpStore)
17355 v.Aux = typeToAux(t2)
17356 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17357 v0.AuxInt = int64ToAuxInt(o2)
17358 v0.AddArg(dst)
17359 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17360 v1.Aux = typeToAux(t3)
17361 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17362 v2.AuxInt = int64ToAuxInt(o3)
17363 v2.AddArg(dst)
17364 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17365 v3.Aux = typeToAux(t4)
17366 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17367 v4.AuxInt = int64ToAuxInt(0)
17368 v4.AddArg(dst)
17369 v3.AddArg3(v4, d3, mem)
17370 v1.AddArg3(v2, d2, v3)
17371 v.AddArg3(v0, d1, v1)
17372 return true
17373 }
17374
17375
17376
17377 for {
17378 n := auxIntToInt64(v.AuxInt)
17379 t1 := auxToType(v.Aux)
17380 dst := v_0
17381 p1 := v_1
17382 mem := v_2
17383 if mem.Op != OpVarDef {
17384 break
17385 }
17386 mem_0 := mem.Args[0]
17387 if mem_0.Op != OpStore {
17388 break
17389 }
17390 t2 := auxToType(mem_0.Aux)
17391 _ = mem_0.Args[2]
17392 op2 := mem_0.Args[0]
17393 if op2.Op != OpOffPtr {
17394 break
17395 }
17396 tt2 := op2.Type
17397 o2 := auxIntToInt64(op2.AuxInt)
17398 p2 := op2.Args[0]
17399 d1 := mem_0.Args[1]
17400 mem_0_2 := mem_0.Args[2]
17401 if mem_0_2.Op != OpStore {
17402 break
17403 }
17404 t3 := auxToType(mem_0_2.Aux)
17405 _ = mem_0_2.Args[2]
17406 op3 := mem_0_2.Args[0]
17407 if op3.Op != OpOffPtr {
17408 break
17409 }
17410 tt3 := op3.Type
17411 o3 := auxIntToInt64(op3.AuxInt)
17412 p3 := op3.Args[0]
17413 d2 := mem_0_2.Args[1]
17414 mem_0_2_2 := mem_0_2.Args[2]
17415 if mem_0_2_2.Op != OpStore {
17416 break
17417 }
17418 t4 := auxToType(mem_0_2_2.Aux)
17419 _ = mem_0_2_2.Args[2]
17420 op4 := mem_0_2_2.Args[0]
17421 if op4.Op != OpOffPtr {
17422 break
17423 }
17424 tt4 := op4.Type
17425 o4 := auxIntToInt64(op4.AuxInt)
17426 p4 := op4.Args[0]
17427 d3 := mem_0_2_2.Args[1]
17428 mem_0_2_2_2 := mem_0_2_2.Args[2]
17429 if mem_0_2_2_2.Op != OpStore {
17430 break
17431 }
17432 t5 := auxToType(mem_0_2_2_2.Aux)
17433 d4 := mem_0_2_2_2.Args[1]
17434 op5 := mem_0_2_2_2.Args[0]
17435 if op5.Op != OpOffPtr {
17436 break
17437 }
17438 tt5 := op5.Type
17439 if auxIntToInt64(op5.AuxInt) != 0 {
17440 break
17441 }
17442 p5 := op5.Args[0]
17443 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()) {
17444 break
17445 }
17446 v.reset(OpStore)
17447 v.Aux = typeToAux(t2)
17448 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17449 v0.AuxInt = int64ToAuxInt(o2)
17450 v0.AddArg(dst)
17451 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17452 v1.Aux = typeToAux(t3)
17453 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17454 v2.AuxInt = int64ToAuxInt(o3)
17455 v2.AddArg(dst)
17456 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17457 v3.Aux = typeToAux(t4)
17458 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17459 v4.AuxInt = int64ToAuxInt(o4)
17460 v4.AddArg(dst)
17461 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17462 v5.Aux = typeToAux(t5)
17463 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
17464 v6.AuxInt = int64ToAuxInt(0)
17465 v6.AddArg(dst)
17466 v5.AddArg3(v6, d4, mem)
17467 v3.AddArg3(v4, d3, v5)
17468 v1.AddArg3(v2, d2, v3)
17469 v.AddArg3(v0, d1, v1)
17470 return true
17471 }
17472
17473
17474
17475 for {
17476 n := auxIntToInt64(v.AuxInt)
17477 t1 := auxToType(v.Aux)
17478 dst := v_0
17479 p1 := v_1
17480 mem := v_2
17481 if mem.Op != OpStore {
17482 break
17483 }
17484 t2 := auxToType(mem.Aux)
17485 _ = mem.Args[2]
17486 op2 := mem.Args[0]
17487 if op2.Op != OpOffPtr {
17488 break
17489 }
17490 tt2 := op2.Type
17491 o2 := auxIntToInt64(op2.AuxInt)
17492 p2 := op2.Args[0]
17493 d1 := mem.Args[1]
17494 mem_2 := mem.Args[2]
17495 if mem_2.Op != OpZero || auxIntToInt64(mem_2.AuxInt) != n {
17496 break
17497 }
17498 t3 := auxToType(mem_2.Aux)
17499 p3 := mem_2.Args[0]
17500 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && registerizable(b, t2) && n >= o2+t2.Size()) {
17501 break
17502 }
17503 v.reset(OpStore)
17504 v.Aux = typeToAux(t2)
17505 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17506 v0.AuxInt = int64ToAuxInt(o2)
17507 v0.AddArg(dst)
17508 v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17509 v1.AuxInt = int64ToAuxInt(n)
17510 v1.Aux = typeToAux(t1)
17511 v1.AddArg2(dst, mem)
17512 v.AddArg3(v0, d1, v1)
17513 return true
17514 }
17515
17516
17517
17518 for {
17519 n := auxIntToInt64(v.AuxInt)
17520 t1 := auxToType(v.Aux)
17521 dst := v_0
17522 p1 := v_1
17523 mem := v_2
17524 if mem.Op != OpStore {
17525 break
17526 }
17527 t2 := auxToType(mem.Aux)
17528 _ = mem.Args[2]
17529 mem_0 := mem.Args[0]
17530 if mem_0.Op != OpOffPtr {
17531 break
17532 }
17533 tt2 := mem_0.Type
17534 o2 := auxIntToInt64(mem_0.AuxInt)
17535 p2 := mem_0.Args[0]
17536 d1 := mem.Args[1]
17537 mem_2 := mem.Args[2]
17538 if mem_2.Op != OpStore {
17539 break
17540 }
17541 t3 := auxToType(mem_2.Aux)
17542 _ = mem_2.Args[2]
17543 mem_2_0 := mem_2.Args[0]
17544 if mem_2_0.Op != OpOffPtr {
17545 break
17546 }
17547 tt3 := mem_2_0.Type
17548 o3 := auxIntToInt64(mem_2_0.AuxInt)
17549 p3 := mem_2_0.Args[0]
17550 d2 := mem_2.Args[1]
17551 mem_2_2 := mem_2.Args[2]
17552 if mem_2_2.Op != OpZero || auxIntToInt64(mem_2_2.AuxInt) != n {
17553 break
17554 }
17555 t4 := auxToType(mem_2_2.Aux)
17556 p4 := mem_2_2.Args[0]
17557 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()) {
17558 break
17559 }
17560 v.reset(OpStore)
17561 v.Aux = typeToAux(t2)
17562 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17563 v0.AuxInt = int64ToAuxInt(o2)
17564 v0.AddArg(dst)
17565 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17566 v1.Aux = typeToAux(t3)
17567 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17568 v2.AuxInt = int64ToAuxInt(o3)
17569 v2.AddArg(dst)
17570 v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17571 v3.AuxInt = int64ToAuxInt(n)
17572 v3.Aux = typeToAux(t1)
17573 v3.AddArg2(dst, mem)
17574 v1.AddArg3(v2, d2, v3)
17575 v.AddArg3(v0, d1, v1)
17576 return true
17577 }
17578
17579
17580
17581 for {
17582 n := auxIntToInt64(v.AuxInt)
17583 t1 := auxToType(v.Aux)
17584 dst := v_0
17585 p1 := v_1
17586 mem := v_2
17587 if mem.Op != OpStore {
17588 break
17589 }
17590 t2 := auxToType(mem.Aux)
17591 _ = mem.Args[2]
17592 mem_0 := mem.Args[0]
17593 if mem_0.Op != OpOffPtr {
17594 break
17595 }
17596 tt2 := mem_0.Type
17597 o2 := auxIntToInt64(mem_0.AuxInt)
17598 p2 := mem_0.Args[0]
17599 d1 := mem.Args[1]
17600 mem_2 := mem.Args[2]
17601 if mem_2.Op != OpStore {
17602 break
17603 }
17604 t3 := auxToType(mem_2.Aux)
17605 _ = mem_2.Args[2]
17606 mem_2_0 := mem_2.Args[0]
17607 if mem_2_0.Op != OpOffPtr {
17608 break
17609 }
17610 tt3 := mem_2_0.Type
17611 o3 := auxIntToInt64(mem_2_0.AuxInt)
17612 p3 := mem_2_0.Args[0]
17613 d2 := mem_2.Args[1]
17614 mem_2_2 := mem_2.Args[2]
17615 if mem_2_2.Op != OpStore {
17616 break
17617 }
17618 t4 := auxToType(mem_2_2.Aux)
17619 _ = mem_2_2.Args[2]
17620 mem_2_2_0 := mem_2_2.Args[0]
17621 if mem_2_2_0.Op != OpOffPtr {
17622 break
17623 }
17624 tt4 := mem_2_2_0.Type
17625 o4 := auxIntToInt64(mem_2_2_0.AuxInt)
17626 p4 := mem_2_2_0.Args[0]
17627 d3 := mem_2_2.Args[1]
17628 mem_2_2_2 := mem_2_2.Args[2]
17629 if mem_2_2_2.Op != OpZero || auxIntToInt64(mem_2_2_2.AuxInt) != n {
17630 break
17631 }
17632 t5 := auxToType(mem_2_2_2.Aux)
17633 p5 := mem_2_2_2.Args[0]
17634 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()) {
17635 break
17636 }
17637 v.reset(OpStore)
17638 v.Aux = typeToAux(t2)
17639 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17640 v0.AuxInt = int64ToAuxInt(o2)
17641 v0.AddArg(dst)
17642 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17643 v1.Aux = typeToAux(t3)
17644 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17645 v2.AuxInt = int64ToAuxInt(o3)
17646 v2.AddArg(dst)
17647 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17648 v3.Aux = typeToAux(t4)
17649 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17650 v4.AuxInt = int64ToAuxInt(o4)
17651 v4.AddArg(dst)
17652 v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17653 v5.AuxInt = int64ToAuxInt(n)
17654 v5.Aux = typeToAux(t1)
17655 v5.AddArg2(dst, mem)
17656 v3.AddArg3(v4, d3, v5)
17657 v1.AddArg3(v2, d2, v3)
17658 v.AddArg3(v0, d1, v1)
17659 return true
17660 }
17661
17662
17663
17664 for {
17665 n := auxIntToInt64(v.AuxInt)
17666 t1 := auxToType(v.Aux)
17667 dst := v_0
17668 p1 := v_1
17669 mem := v_2
17670 if mem.Op != OpStore {
17671 break
17672 }
17673 t2 := auxToType(mem.Aux)
17674 _ = mem.Args[2]
17675 mem_0 := mem.Args[0]
17676 if mem_0.Op != OpOffPtr {
17677 break
17678 }
17679 tt2 := mem_0.Type
17680 o2 := auxIntToInt64(mem_0.AuxInt)
17681 p2 := mem_0.Args[0]
17682 d1 := mem.Args[1]
17683 mem_2 := mem.Args[2]
17684 if mem_2.Op != OpStore {
17685 break
17686 }
17687 t3 := auxToType(mem_2.Aux)
17688 _ = mem_2.Args[2]
17689 mem_2_0 := mem_2.Args[0]
17690 if mem_2_0.Op != OpOffPtr {
17691 break
17692 }
17693 tt3 := mem_2_0.Type
17694 o3 := auxIntToInt64(mem_2_0.AuxInt)
17695 p3 := mem_2_0.Args[0]
17696 d2 := mem_2.Args[1]
17697 mem_2_2 := mem_2.Args[2]
17698 if mem_2_2.Op != OpStore {
17699 break
17700 }
17701 t4 := auxToType(mem_2_2.Aux)
17702 _ = mem_2_2.Args[2]
17703 mem_2_2_0 := mem_2_2.Args[0]
17704 if mem_2_2_0.Op != OpOffPtr {
17705 break
17706 }
17707 tt4 := mem_2_2_0.Type
17708 o4 := auxIntToInt64(mem_2_2_0.AuxInt)
17709 p4 := mem_2_2_0.Args[0]
17710 d3 := mem_2_2.Args[1]
17711 mem_2_2_2 := mem_2_2.Args[2]
17712 if mem_2_2_2.Op != OpStore {
17713 break
17714 }
17715 t5 := auxToType(mem_2_2_2.Aux)
17716 _ = mem_2_2_2.Args[2]
17717 mem_2_2_2_0 := mem_2_2_2.Args[0]
17718 if mem_2_2_2_0.Op != OpOffPtr {
17719 break
17720 }
17721 tt5 := mem_2_2_2_0.Type
17722 o5 := auxIntToInt64(mem_2_2_2_0.AuxInt)
17723 p5 := mem_2_2_2_0.Args[0]
17724 d4 := mem_2_2_2.Args[1]
17725 mem_2_2_2_2 := mem_2_2_2.Args[2]
17726 if mem_2_2_2_2.Op != OpZero || auxIntToInt64(mem_2_2_2_2.AuxInt) != n {
17727 break
17728 }
17729 t6 := auxToType(mem_2_2_2_2.Aux)
17730 p6 := mem_2_2_2_2.Args[0]
17731 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()) {
17732 break
17733 }
17734 v.reset(OpStore)
17735 v.Aux = typeToAux(t2)
17736 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17737 v0.AuxInt = int64ToAuxInt(o2)
17738 v0.AddArg(dst)
17739 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17740 v1.Aux = typeToAux(t3)
17741 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17742 v2.AuxInt = int64ToAuxInt(o3)
17743 v2.AddArg(dst)
17744 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17745 v3.Aux = typeToAux(t4)
17746 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17747 v4.AuxInt = int64ToAuxInt(o4)
17748 v4.AddArg(dst)
17749 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17750 v5.Aux = typeToAux(t5)
17751 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
17752 v6.AuxInt = int64ToAuxInt(o5)
17753 v6.AddArg(dst)
17754 v7 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17755 v7.AuxInt = int64ToAuxInt(n)
17756 v7.Aux = typeToAux(t1)
17757 v7.AddArg2(dst, mem)
17758 v5.AddArg3(v6, d4, v7)
17759 v3.AddArg3(v4, d3, v5)
17760 v1.AddArg3(v2, d2, v3)
17761 v.AddArg3(v0, d1, v1)
17762 return true
17763 }
17764
17765
17766
17767 for {
17768 n := auxIntToInt64(v.AuxInt)
17769 t1 := auxToType(v.Aux)
17770 dst := v_0
17771 p1 := v_1
17772 mem := v_2
17773 if mem.Op != OpVarDef {
17774 break
17775 }
17776 mem_0 := mem.Args[0]
17777 if mem_0.Op != OpStore {
17778 break
17779 }
17780 t2 := auxToType(mem_0.Aux)
17781 _ = mem_0.Args[2]
17782 op2 := mem_0.Args[0]
17783 if op2.Op != OpOffPtr {
17784 break
17785 }
17786 tt2 := op2.Type
17787 o2 := auxIntToInt64(op2.AuxInt)
17788 p2 := op2.Args[0]
17789 d1 := mem_0.Args[1]
17790 mem_0_2 := mem_0.Args[2]
17791 if mem_0_2.Op != OpZero || auxIntToInt64(mem_0_2.AuxInt) != n {
17792 break
17793 }
17794 t3 := auxToType(mem_0_2.Aux)
17795 p3 := mem_0_2.Args[0]
17796 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && registerizable(b, t2) && n >= o2+t2.Size()) {
17797 break
17798 }
17799 v.reset(OpStore)
17800 v.Aux = typeToAux(t2)
17801 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17802 v0.AuxInt = int64ToAuxInt(o2)
17803 v0.AddArg(dst)
17804 v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17805 v1.AuxInt = int64ToAuxInt(n)
17806 v1.Aux = typeToAux(t1)
17807 v1.AddArg2(dst, mem)
17808 v.AddArg3(v0, d1, v1)
17809 return true
17810 }
17811
17812
17813
17814 for {
17815 n := auxIntToInt64(v.AuxInt)
17816 t1 := auxToType(v.Aux)
17817 dst := v_0
17818 p1 := v_1
17819 mem := v_2
17820 if mem.Op != OpVarDef {
17821 break
17822 }
17823 mem_0 := mem.Args[0]
17824 if mem_0.Op != OpStore {
17825 break
17826 }
17827 t2 := auxToType(mem_0.Aux)
17828 _ = mem_0.Args[2]
17829 mem_0_0 := mem_0.Args[0]
17830 if mem_0_0.Op != OpOffPtr {
17831 break
17832 }
17833 tt2 := mem_0_0.Type
17834 o2 := auxIntToInt64(mem_0_0.AuxInt)
17835 p2 := mem_0_0.Args[0]
17836 d1 := mem_0.Args[1]
17837 mem_0_2 := mem_0.Args[2]
17838 if mem_0_2.Op != OpStore {
17839 break
17840 }
17841 t3 := auxToType(mem_0_2.Aux)
17842 _ = mem_0_2.Args[2]
17843 mem_0_2_0 := mem_0_2.Args[0]
17844 if mem_0_2_0.Op != OpOffPtr {
17845 break
17846 }
17847 tt3 := mem_0_2_0.Type
17848 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
17849 p3 := mem_0_2_0.Args[0]
17850 d2 := mem_0_2.Args[1]
17851 mem_0_2_2 := mem_0_2.Args[2]
17852 if mem_0_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2.AuxInt) != n {
17853 break
17854 }
17855 t4 := auxToType(mem_0_2_2.Aux)
17856 p4 := mem_0_2_2.Args[0]
17857 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()) {
17858 break
17859 }
17860 v.reset(OpStore)
17861 v.Aux = typeToAux(t2)
17862 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17863 v0.AuxInt = int64ToAuxInt(o2)
17864 v0.AddArg(dst)
17865 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17866 v1.Aux = typeToAux(t3)
17867 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17868 v2.AuxInt = int64ToAuxInt(o3)
17869 v2.AddArg(dst)
17870 v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17871 v3.AuxInt = int64ToAuxInt(n)
17872 v3.Aux = typeToAux(t1)
17873 v3.AddArg2(dst, mem)
17874 v1.AddArg3(v2, d2, v3)
17875 v.AddArg3(v0, d1, v1)
17876 return true
17877 }
17878
17879
17880
17881 for {
17882 n := auxIntToInt64(v.AuxInt)
17883 t1 := auxToType(v.Aux)
17884 dst := v_0
17885 p1 := v_1
17886 mem := v_2
17887 if mem.Op != OpVarDef {
17888 break
17889 }
17890 mem_0 := mem.Args[0]
17891 if mem_0.Op != OpStore {
17892 break
17893 }
17894 t2 := auxToType(mem_0.Aux)
17895 _ = mem_0.Args[2]
17896 mem_0_0 := mem_0.Args[0]
17897 if mem_0_0.Op != OpOffPtr {
17898 break
17899 }
17900 tt2 := mem_0_0.Type
17901 o2 := auxIntToInt64(mem_0_0.AuxInt)
17902 p2 := mem_0_0.Args[0]
17903 d1 := mem_0.Args[1]
17904 mem_0_2 := mem_0.Args[2]
17905 if mem_0_2.Op != OpStore {
17906 break
17907 }
17908 t3 := auxToType(mem_0_2.Aux)
17909 _ = mem_0_2.Args[2]
17910 mem_0_2_0 := mem_0_2.Args[0]
17911 if mem_0_2_0.Op != OpOffPtr {
17912 break
17913 }
17914 tt3 := mem_0_2_0.Type
17915 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
17916 p3 := mem_0_2_0.Args[0]
17917 d2 := mem_0_2.Args[1]
17918 mem_0_2_2 := mem_0_2.Args[2]
17919 if mem_0_2_2.Op != OpStore {
17920 break
17921 }
17922 t4 := auxToType(mem_0_2_2.Aux)
17923 _ = mem_0_2_2.Args[2]
17924 mem_0_2_2_0 := mem_0_2_2.Args[0]
17925 if mem_0_2_2_0.Op != OpOffPtr {
17926 break
17927 }
17928 tt4 := mem_0_2_2_0.Type
17929 o4 := auxIntToInt64(mem_0_2_2_0.AuxInt)
17930 p4 := mem_0_2_2_0.Args[0]
17931 d3 := mem_0_2_2.Args[1]
17932 mem_0_2_2_2 := mem_0_2_2.Args[2]
17933 if mem_0_2_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2_2.AuxInt) != n {
17934 break
17935 }
17936 t5 := auxToType(mem_0_2_2_2.Aux)
17937 p5 := mem_0_2_2_2.Args[0]
17938 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()) {
17939 break
17940 }
17941 v.reset(OpStore)
17942 v.Aux = typeToAux(t2)
17943 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17944 v0.AuxInt = int64ToAuxInt(o2)
17945 v0.AddArg(dst)
17946 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17947 v1.Aux = typeToAux(t3)
17948 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17949 v2.AuxInt = int64ToAuxInt(o3)
17950 v2.AddArg(dst)
17951 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17952 v3.Aux = typeToAux(t4)
17953 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17954 v4.AuxInt = int64ToAuxInt(o4)
17955 v4.AddArg(dst)
17956 v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17957 v5.AuxInt = int64ToAuxInt(n)
17958 v5.Aux = typeToAux(t1)
17959 v5.AddArg2(dst, mem)
17960 v3.AddArg3(v4, d3, v5)
17961 v1.AddArg3(v2, d2, v3)
17962 v.AddArg3(v0, d1, v1)
17963 return true
17964 }
17965
17966
17967
17968 for {
17969 n := auxIntToInt64(v.AuxInt)
17970 t1 := auxToType(v.Aux)
17971 dst := v_0
17972 p1 := v_1
17973 mem := v_2
17974 if mem.Op != OpVarDef {
17975 break
17976 }
17977 mem_0 := mem.Args[0]
17978 if mem_0.Op != OpStore {
17979 break
17980 }
17981 t2 := auxToType(mem_0.Aux)
17982 _ = mem_0.Args[2]
17983 mem_0_0 := mem_0.Args[0]
17984 if mem_0_0.Op != OpOffPtr {
17985 break
17986 }
17987 tt2 := mem_0_0.Type
17988 o2 := auxIntToInt64(mem_0_0.AuxInt)
17989 p2 := mem_0_0.Args[0]
17990 d1 := mem_0.Args[1]
17991 mem_0_2 := mem_0.Args[2]
17992 if mem_0_2.Op != OpStore {
17993 break
17994 }
17995 t3 := auxToType(mem_0_2.Aux)
17996 _ = mem_0_2.Args[2]
17997 mem_0_2_0 := mem_0_2.Args[0]
17998 if mem_0_2_0.Op != OpOffPtr {
17999 break
18000 }
18001 tt3 := mem_0_2_0.Type
18002 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
18003 p3 := mem_0_2_0.Args[0]
18004 d2 := mem_0_2.Args[1]
18005 mem_0_2_2 := mem_0_2.Args[2]
18006 if mem_0_2_2.Op != OpStore {
18007 break
18008 }
18009 t4 := auxToType(mem_0_2_2.Aux)
18010 _ = mem_0_2_2.Args[2]
18011 mem_0_2_2_0 := mem_0_2_2.Args[0]
18012 if mem_0_2_2_0.Op != OpOffPtr {
18013 break
18014 }
18015 tt4 := mem_0_2_2_0.Type
18016 o4 := auxIntToInt64(mem_0_2_2_0.AuxInt)
18017 p4 := mem_0_2_2_0.Args[0]
18018 d3 := mem_0_2_2.Args[1]
18019 mem_0_2_2_2 := mem_0_2_2.Args[2]
18020 if mem_0_2_2_2.Op != OpStore {
18021 break
18022 }
18023 t5 := auxToType(mem_0_2_2_2.Aux)
18024 _ = mem_0_2_2_2.Args[2]
18025 mem_0_2_2_2_0 := mem_0_2_2_2.Args[0]
18026 if mem_0_2_2_2_0.Op != OpOffPtr {
18027 break
18028 }
18029 tt5 := mem_0_2_2_2_0.Type
18030 o5 := auxIntToInt64(mem_0_2_2_2_0.AuxInt)
18031 p5 := mem_0_2_2_2_0.Args[0]
18032 d4 := mem_0_2_2_2.Args[1]
18033 mem_0_2_2_2_2 := mem_0_2_2_2.Args[2]
18034 if mem_0_2_2_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2_2_2.AuxInt) != n {
18035 break
18036 }
18037 t6 := auxToType(mem_0_2_2_2_2.Aux)
18038 p6 := mem_0_2_2_2_2.Args[0]
18039 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()) {
18040 break
18041 }
18042 v.reset(OpStore)
18043 v.Aux = typeToAux(t2)
18044 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
18045 v0.AuxInt = int64ToAuxInt(o2)
18046 v0.AddArg(dst)
18047 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18048 v1.Aux = typeToAux(t3)
18049 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
18050 v2.AuxInt = int64ToAuxInt(o3)
18051 v2.AddArg(dst)
18052 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18053 v3.Aux = typeToAux(t4)
18054 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
18055 v4.AuxInt = int64ToAuxInt(o4)
18056 v4.AddArg(dst)
18057 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18058 v5.Aux = typeToAux(t5)
18059 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
18060 v6.AuxInt = int64ToAuxInt(o5)
18061 v6.AddArg(dst)
18062 v7 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
18063 v7.AuxInt = int64ToAuxInt(n)
18064 v7.Aux = typeToAux(t1)
18065 v7.AddArg2(dst, mem)
18066 v5.AddArg3(v6, d4, v7)
18067 v3.AddArg3(v4, d3, v5)
18068 v1.AddArg3(v2, d2, v3)
18069 v.AddArg3(v0, d1, v1)
18070 return true
18071 }
18072
18073
18074
18075 for {
18076 s := auxIntToInt64(v.AuxInt)
18077 t1 := auxToType(v.Aux)
18078 dst := v_0
18079 tmp1 := v_1
18080 midmem := v_2
18081 if midmem.Op != OpMove || auxIntToInt64(midmem.AuxInt) != s {
18082 break
18083 }
18084 t2 := auxToType(midmem.Aux)
18085 src := midmem.Args[1]
18086 tmp2 := midmem.Args[0]
18087 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))) {
18088 break
18089 }
18090 v.reset(OpMove)
18091 v.AuxInt = int64ToAuxInt(s)
18092 v.Aux = typeToAux(t1)
18093 v.AddArg3(dst, src, midmem)
18094 return true
18095 }
18096
18097
18098
18099 for {
18100 s := auxIntToInt64(v.AuxInt)
18101 t1 := auxToType(v.Aux)
18102 dst := v_0
18103 tmp1 := v_1
18104 midmem := v_2
18105 if midmem.Op != OpVarDef {
18106 break
18107 }
18108 midmem_0 := midmem.Args[0]
18109 if midmem_0.Op != OpMove || auxIntToInt64(midmem_0.AuxInt) != s {
18110 break
18111 }
18112 t2 := auxToType(midmem_0.Aux)
18113 src := midmem_0.Args[1]
18114 tmp2 := midmem_0.Args[0]
18115 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))) {
18116 break
18117 }
18118 v.reset(OpMove)
18119 v.AuxInt = int64ToAuxInt(s)
18120 v.Aux = typeToAux(t1)
18121 v.AddArg3(dst, src, midmem)
18122 return true
18123 }
18124
18125
18126
18127 for {
18128 dst := v_0
18129 src := v_1
18130 mem := v_2
18131 if !(isSamePtr(dst, src)) {
18132 break
18133 }
18134 v.copyOf(mem)
18135 return true
18136 }
18137 return false
18138 }
18139 func rewriteValuegeneric_OpMul16(v *Value) bool {
18140 v_1 := v.Args[1]
18141 v_0 := v.Args[0]
18142 b := v.Block
18143 typ := &b.Func.Config.Types
18144
18145
18146 for {
18147 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18148 if v_0.Op != OpConst16 {
18149 continue
18150 }
18151 c := auxIntToInt16(v_0.AuxInt)
18152 if v_1.Op != OpConst16 {
18153 continue
18154 }
18155 d := auxIntToInt16(v_1.AuxInt)
18156 v.reset(OpConst16)
18157 v.AuxInt = int16ToAuxInt(c * d)
18158 return true
18159 }
18160 break
18161 }
18162
18163
18164 for {
18165 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18166 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 1 {
18167 continue
18168 }
18169 x := v_1
18170 v.copyOf(x)
18171 return true
18172 }
18173 break
18174 }
18175
18176
18177 for {
18178 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18179 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
18180 continue
18181 }
18182 x := v_1
18183 v.reset(OpNeg16)
18184 v.AddArg(x)
18185 return true
18186 }
18187 break
18188 }
18189
18190
18191 for {
18192 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18193 if v_0.Op != OpConst16 {
18194 continue
18195 }
18196 t := v_0.Type
18197 c := auxIntToInt16(v_0.AuxInt)
18198 if v_1.Op != OpNeg16 {
18199 continue
18200 }
18201 x := v_1.Args[0]
18202 v.reset(OpMul16)
18203 v0 := b.NewValue0(v.Pos, OpConst16, t)
18204 v0.AuxInt = int16ToAuxInt(-c)
18205 v.AddArg2(x, v0)
18206 return true
18207 }
18208 break
18209 }
18210
18211
18212 for {
18213 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18214 if v_0.Op != OpNeg16 {
18215 continue
18216 }
18217 x := v_0.Args[0]
18218 if v_1.Op != OpNeg16 {
18219 continue
18220 }
18221 y := v_1.Args[0]
18222 v.reset(OpMul16)
18223 v.AddArg2(x, y)
18224 return true
18225 }
18226 break
18227 }
18228
18229
18230
18231 for {
18232 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18233 if v_0.Op != OpConst16 {
18234 continue
18235 }
18236 t := v_0.Type
18237 c := auxIntToInt16(v_0.AuxInt)
18238 if v_1.Op != OpAdd16 || v_1.Type != t {
18239 continue
18240 }
18241 _ = v_1.Args[1]
18242 v_1_0 := v_1.Args[0]
18243 v_1_1 := v_1.Args[1]
18244 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18245 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
18246 continue
18247 }
18248 d := auxIntToInt16(v_1_0.AuxInt)
18249 x := v_1_1
18250 if !(!isPowerOfTwo(c)) {
18251 continue
18252 }
18253 v.reset(OpAdd16)
18254 v0 := b.NewValue0(v.Pos, OpConst16, t)
18255 v0.AuxInt = int16ToAuxInt(c * d)
18256 v1 := b.NewValue0(v.Pos, OpMul16, t)
18257 v2 := b.NewValue0(v.Pos, OpConst16, t)
18258 v2.AuxInt = int16ToAuxInt(c)
18259 v1.AddArg2(v2, x)
18260 v.AddArg2(v0, v1)
18261 return true
18262 }
18263 }
18264 break
18265 }
18266
18267
18268 for {
18269 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18270 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
18271 continue
18272 }
18273 v.reset(OpConst16)
18274 v.AuxInt = int16ToAuxInt(0)
18275 return true
18276 }
18277 break
18278 }
18279
18280
18281
18282 for {
18283 t := v.Type
18284 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18285 x := v_0
18286 if v_1.Op != OpConst16 {
18287 continue
18288 }
18289 c := auxIntToInt16(v_1.AuxInt)
18290 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
18291 continue
18292 }
18293 v.reset(OpLsh16x64)
18294 v.Type = t
18295 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18296 v0.AuxInt = int64ToAuxInt(log16(c))
18297 v.AddArg2(x, v0)
18298 return true
18299 }
18300 break
18301 }
18302
18303
18304
18305 for {
18306 t := v.Type
18307 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18308 x := v_0
18309 if v_1.Op != OpConst16 {
18310 continue
18311 }
18312 c := auxIntToInt16(v_1.AuxInt)
18313 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
18314 continue
18315 }
18316 v.reset(OpNeg16)
18317 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
18318 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18319 v1.AuxInt = int64ToAuxInt(log16(-c))
18320 v0.AddArg2(x, v1)
18321 v.AddArg(v0)
18322 return true
18323 }
18324 break
18325 }
18326
18327
18328
18329 for {
18330 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18331 if v_0.Op != OpMul16 {
18332 continue
18333 }
18334 _ = v_0.Args[1]
18335 v_0_0 := v_0.Args[0]
18336 v_0_1 := v_0.Args[1]
18337 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18338 i := v_0_0
18339 if i.Op != OpConst16 {
18340 continue
18341 }
18342 t := i.Type
18343 z := v_0_1
18344 x := v_1
18345 if !(z.Op != OpConst16 && x.Op != OpConst16) {
18346 continue
18347 }
18348 v.reset(OpMul16)
18349 v0 := b.NewValue0(v.Pos, OpMul16, t)
18350 v0.AddArg2(x, z)
18351 v.AddArg2(i, v0)
18352 return true
18353 }
18354 }
18355 break
18356 }
18357
18358
18359 for {
18360 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18361 if v_0.Op != OpConst16 {
18362 continue
18363 }
18364 t := v_0.Type
18365 c := auxIntToInt16(v_0.AuxInt)
18366 if v_1.Op != OpMul16 {
18367 continue
18368 }
18369 _ = v_1.Args[1]
18370 v_1_0 := v_1.Args[0]
18371 v_1_1 := v_1.Args[1]
18372 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18373 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
18374 continue
18375 }
18376 d := auxIntToInt16(v_1_0.AuxInt)
18377 x := v_1_1
18378 v.reset(OpMul16)
18379 v0 := b.NewValue0(v.Pos, OpConst16, t)
18380 v0.AuxInt = int16ToAuxInt(c * d)
18381 v.AddArg2(v0, x)
18382 return true
18383 }
18384 }
18385 break
18386 }
18387 return false
18388 }
18389 func rewriteValuegeneric_OpMul32(v *Value) bool {
18390 v_1 := v.Args[1]
18391 v_0 := v.Args[0]
18392 b := v.Block
18393 typ := &b.Func.Config.Types
18394
18395
18396 for {
18397 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18398 if v_0.Op != OpConst32 {
18399 continue
18400 }
18401 c := auxIntToInt32(v_0.AuxInt)
18402 if v_1.Op != OpConst32 {
18403 continue
18404 }
18405 d := auxIntToInt32(v_1.AuxInt)
18406 v.reset(OpConst32)
18407 v.AuxInt = int32ToAuxInt(c * d)
18408 return true
18409 }
18410 break
18411 }
18412
18413
18414 for {
18415 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18416 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 {
18417 continue
18418 }
18419 x := v_1
18420 v.copyOf(x)
18421 return true
18422 }
18423 break
18424 }
18425
18426
18427 for {
18428 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18429 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
18430 continue
18431 }
18432 x := v_1
18433 v.reset(OpNeg32)
18434 v.AddArg(x)
18435 return true
18436 }
18437 break
18438 }
18439
18440
18441 for {
18442 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18443 if v_0.Op != OpConst32 {
18444 continue
18445 }
18446 t := v_0.Type
18447 c := auxIntToInt32(v_0.AuxInt)
18448 if v_1.Op != OpNeg32 {
18449 continue
18450 }
18451 x := v_1.Args[0]
18452 v.reset(OpMul32)
18453 v0 := b.NewValue0(v.Pos, OpConst32, t)
18454 v0.AuxInt = int32ToAuxInt(-c)
18455 v.AddArg2(x, v0)
18456 return true
18457 }
18458 break
18459 }
18460
18461
18462 for {
18463 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18464 if v_0.Op != OpNeg32 {
18465 continue
18466 }
18467 x := v_0.Args[0]
18468 if v_1.Op != OpNeg32 {
18469 continue
18470 }
18471 y := v_1.Args[0]
18472 v.reset(OpMul32)
18473 v.AddArg2(x, y)
18474 return true
18475 }
18476 break
18477 }
18478
18479
18480
18481 for {
18482 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18483 if v_0.Op != OpConst32 {
18484 continue
18485 }
18486 t := v_0.Type
18487 c := auxIntToInt32(v_0.AuxInt)
18488 if v_1.Op != OpAdd32 || v_1.Type != t {
18489 continue
18490 }
18491 _ = v_1.Args[1]
18492 v_1_0 := v_1.Args[0]
18493 v_1_1 := v_1.Args[1]
18494 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18495 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
18496 continue
18497 }
18498 d := auxIntToInt32(v_1_0.AuxInt)
18499 x := v_1_1
18500 if !(!isPowerOfTwo(c)) {
18501 continue
18502 }
18503 v.reset(OpAdd32)
18504 v0 := b.NewValue0(v.Pos, OpConst32, t)
18505 v0.AuxInt = int32ToAuxInt(c * d)
18506 v1 := b.NewValue0(v.Pos, OpMul32, t)
18507 v2 := b.NewValue0(v.Pos, OpConst32, t)
18508 v2.AuxInt = int32ToAuxInt(c)
18509 v1.AddArg2(v2, x)
18510 v.AddArg2(v0, v1)
18511 return true
18512 }
18513 }
18514 break
18515 }
18516
18517
18518 for {
18519 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18520 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
18521 continue
18522 }
18523 v.reset(OpConst32)
18524 v.AuxInt = int32ToAuxInt(0)
18525 return true
18526 }
18527 break
18528 }
18529
18530
18531
18532 for {
18533 t := v.Type
18534 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18535 x := v_0
18536 if v_1.Op != OpConst32 {
18537 continue
18538 }
18539 c := auxIntToInt32(v_1.AuxInt)
18540 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
18541 continue
18542 }
18543 v.reset(OpLsh32x64)
18544 v.Type = t
18545 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18546 v0.AuxInt = int64ToAuxInt(log32(c))
18547 v.AddArg2(x, v0)
18548 return true
18549 }
18550 break
18551 }
18552
18553
18554
18555 for {
18556 t := v.Type
18557 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18558 x := v_0
18559 if v_1.Op != OpConst32 {
18560 continue
18561 }
18562 c := auxIntToInt32(v_1.AuxInt)
18563 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
18564 continue
18565 }
18566 v.reset(OpNeg32)
18567 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
18568 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18569 v1.AuxInt = int64ToAuxInt(log32(-c))
18570 v0.AddArg2(x, v1)
18571 v.AddArg(v0)
18572 return true
18573 }
18574 break
18575 }
18576
18577
18578
18579 for {
18580 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18581 if v_0.Op != OpMul32 {
18582 continue
18583 }
18584 _ = v_0.Args[1]
18585 v_0_0 := v_0.Args[0]
18586 v_0_1 := v_0.Args[1]
18587 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18588 i := v_0_0
18589 if i.Op != OpConst32 {
18590 continue
18591 }
18592 t := i.Type
18593 z := v_0_1
18594 x := v_1
18595 if !(z.Op != OpConst32 && x.Op != OpConst32) {
18596 continue
18597 }
18598 v.reset(OpMul32)
18599 v0 := b.NewValue0(v.Pos, OpMul32, t)
18600 v0.AddArg2(x, z)
18601 v.AddArg2(i, v0)
18602 return true
18603 }
18604 }
18605 break
18606 }
18607
18608
18609 for {
18610 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18611 if v_0.Op != OpConst32 {
18612 continue
18613 }
18614 t := v_0.Type
18615 c := auxIntToInt32(v_0.AuxInt)
18616 if v_1.Op != OpMul32 {
18617 continue
18618 }
18619 _ = v_1.Args[1]
18620 v_1_0 := v_1.Args[0]
18621 v_1_1 := v_1.Args[1]
18622 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18623 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
18624 continue
18625 }
18626 d := auxIntToInt32(v_1_0.AuxInt)
18627 x := v_1_1
18628 v.reset(OpMul32)
18629 v0 := b.NewValue0(v.Pos, OpConst32, t)
18630 v0.AuxInt = int32ToAuxInt(c * d)
18631 v.AddArg2(v0, x)
18632 return true
18633 }
18634 }
18635 break
18636 }
18637 return false
18638 }
18639 func rewriteValuegeneric_OpMul32F(v *Value) bool {
18640 v_1 := v.Args[1]
18641 v_0 := v.Args[0]
18642
18643
18644
18645 for {
18646 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18647 if v_0.Op != OpConst32F {
18648 continue
18649 }
18650 c := auxIntToFloat32(v_0.AuxInt)
18651 if v_1.Op != OpConst32F {
18652 continue
18653 }
18654 d := auxIntToFloat32(v_1.AuxInt)
18655 if !(c*d == c*d) {
18656 continue
18657 }
18658 v.reset(OpConst32F)
18659 v.AuxInt = float32ToAuxInt(c * d)
18660 return true
18661 }
18662 break
18663 }
18664
18665
18666 for {
18667 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18668 x := v_0
18669 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != 1 {
18670 continue
18671 }
18672 v.copyOf(x)
18673 return true
18674 }
18675 break
18676 }
18677
18678
18679 for {
18680 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18681 x := v_0
18682 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != -1 {
18683 continue
18684 }
18685 v.reset(OpNeg32F)
18686 v.AddArg(x)
18687 return true
18688 }
18689 break
18690 }
18691
18692
18693 for {
18694 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18695 x := v_0
18696 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != 2 {
18697 continue
18698 }
18699 v.reset(OpAdd32F)
18700 v.AddArg2(x, x)
18701 return true
18702 }
18703 break
18704 }
18705 return false
18706 }
18707 func rewriteValuegeneric_OpMul32uhilo(v *Value) bool {
18708 v_1 := v.Args[1]
18709 v_0 := v.Args[0]
18710 b := v.Block
18711 typ := &b.Func.Config.Types
18712
18713
18714 for {
18715 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18716 if v_0.Op != OpConst32 {
18717 continue
18718 }
18719 c := auxIntToInt32(v_0.AuxInt)
18720 if v_1.Op != OpConst32 {
18721 continue
18722 }
18723 d := auxIntToInt32(v_1.AuxInt)
18724 v.reset(OpMakeTuple)
18725 v0 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
18726 v0.AuxInt = int32ToAuxInt(bitsMulU32(c, d).hi)
18727 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
18728 v1.AuxInt = int32ToAuxInt(bitsMulU32(c, d).lo)
18729 v.AddArg2(v0, v1)
18730 return true
18731 }
18732 break
18733 }
18734 return false
18735 }
18736 func rewriteValuegeneric_OpMul32uover(v *Value) bool {
18737 v_1 := v.Args[1]
18738 v_0 := v.Args[0]
18739 b := v.Block
18740 typ := &b.Func.Config.Types
18741
18742
18743 for {
18744 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18745 if v_0.Op != OpConst32 {
18746 continue
18747 }
18748 c := auxIntToInt32(v_0.AuxInt)
18749 if v_1.Op != OpConst32 {
18750 continue
18751 }
18752 d := auxIntToInt32(v_1.AuxInt)
18753 v.reset(OpMakeTuple)
18754 v0 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
18755 v0.AuxInt = int32ToAuxInt(bitsMulU32(c, d).lo)
18756 v1 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
18757 v1.AuxInt = boolToAuxInt(bitsMulU32(c, d).hi != 0)
18758 v.AddArg2(v0, v1)
18759 return true
18760 }
18761 break
18762 }
18763
18764
18765 for {
18766 t := v.Type
18767 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18768 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 {
18769 continue
18770 }
18771 x := v_1
18772 v.reset(OpMakeTuple)
18773 v0 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
18774 v0.AuxInt = boolToAuxInt(false)
18775 v.AddArg2(x, v0)
18776 return true
18777 }
18778 break
18779 }
18780
18781
18782 for {
18783 t := v.Type
18784 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18785 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
18786 continue
18787 }
18788 v.reset(OpMakeTuple)
18789 v0 := b.NewValue0(v.Pos, OpConst32, t.FieldType(0))
18790 v0.AuxInt = int32ToAuxInt(0)
18791 v1 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
18792 v1.AuxInt = boolToAuxInt(false)
18793 v.AddArg2(v0, v1)
18794 return true
18795 }
18796 break
18797 }
18798 return false
18799 }
18800 func rewriteValuegeneric_OpMul64(v *Value) bool {
18801 v_1 := v.Args[1]
18802 v_0 := v.Args[0]
18803 b := v.Block
18804 typ := &b.Func.Config.Types
18805
18806
18807 for {
18808 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18809 if v_0.Op != OpConst64 {
18810 continue
18811 }
18812 c := auxIntToInt64(v_0.AuxInt)
18813 if v_1.Op != OpConst64 {
18814 continue
18815 }
18816 d := auxIntToInt64(v_1.AuxInt)
18817 v.reset(OpConst64)
18818 v.AuxInt = int64ToAuxInt(c * d)
18819 return true
18820 }
18821 break
18822 }
18823
18824
18825 for {
18826 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18827 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 {
18828 continue
18829 }
18830 x := v_1
18831 v.copyOf(x)
18832 return true
18833 }
18834 break
18835 }
18836
18837
18838 for {
18839 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18840 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
18841 continue
18842 }
18843 x := v_1
18844 v.reset(OpNeg64)
18845 v.AddArg(x)
18846 return true
18847 }
18848 break
18849 }
18850
18851
18852 for {
18853 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18854 if v_0.Op != OpConst64 {
18855 continue
18856 }
18857 t := v_0.Type
18858 c := auxIntToInt64(v_0.AuxInt)
18859 if v_1.Op != OpNeg64 {
18860 continue
18861 }
18862 x := v_1.Args[0]
18863 v.reset(OpMul64)
18864 v0 := b.NewValue0(v.Pos, OpConst64, t)
18865 v0.AuxInt = int64ToAuxInt(-c)
18866 v.AddArg2(x, v0)
18867 return true
18868 }
18869 break
18870 }
18871
18872
18873 for {
18874 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18875 if v_0.Op != OpNeg64 {
18876 continue
18877 }
18878 x := v_0.Args[0]
18879 if v_1.Op != OpNeg64 {
18880 continue
18881 }
18882 y := v_1.Args[0]
18883 v.reset(OpMul64)
18884 v.AddArg2(x, y)
18885 return true
18886 }
18887 break
18888 }
18889
18890
18891
18892 for {
18893 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18894 if v_0.Op != OpConst64 {
18895 continue
18896 }
18897 t := v_0.Type
18898 c := auxIntToInt64(v_0.AuxInt)
18899 if v_1.Op != OpAdd64 || v_1.Type != t {
18900 continue
18901 }
18902 _ = v_1.Args[1]
18903 v_1_0 := v_1.Args[0]
18904 v_1_1 := v_1.Args[1]
18905 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18906 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
18907 continue
18908 }
18909 d := auxIntToInt64(v_1_0.AuxInt)
18910 x := v_1_1
18911 if !(!isPowerOfTwo(c)) {
18912 continue
18913 }
18914 v.reset(OpAdd64)
18915 v0 := b.NewValue0(v.Pos, OpConst64, t)
18916 v0.AuxInt = int64ToAuxInt(c * d)
18917 v1 := b.NewValue0(v.Pos, OpMul64, t)
18918 v2 := b.NewValue0(v.Pos, OpConst64, t)
18919 v2.AuxInt = int64ToAuxInt(c)
18920 v1.AddArg2(v2, x)
18921 v.AddArg2(v0, v1)
18922 return true
18923 }
18924 }
18925 break
18926 }
18927
18928
18929 for {
18930 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18931 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
18932 continue
18933 }
18934 v.reset(OpConst64)
18935 v.AuxInt = int64ToAuxInt(0)
18936 return true
18937 }
18938 break
18939 }
18940
18941
18942
18943 for {
18944 t := v.Type
18945 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18946 x := v_0
18947 if v_1.Op != OpConst64 {
18948 continue
18949 }
18950 c := auxIntToInt64(v_1.AuxInt)
18951 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
18952 continue
18953 }
18954 v.reset(OpLsh64x64)
18955 v.Type = t
18956 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18957 v0.AuxInt = int64ToAuxInt(log64(c))
18958 v.AddArg2(x, v0)
18959 return true
18960 }
18961 break
18962 }
18963
18964
18965
18966 for {
18967 t := v.Type
18968 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18969 x := v_0
18970 if v_1.Op != OpConst64 {
18971 continue
18972 }
18973 c := auxIntToInt64(v_1.AuxInt)
18974 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
18975 continue
18976 }
18977 v.reset(OpNeg64)
18978 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
18979 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18980 v1.AuxInt = int64ToAuxInt(log64(-c))
18981 v0.AddArg2(x, v1)
18982 v.AddArg(v0)
18983 return true
18984 }
18985 break
18986 }
18987
18988
18989
18990 for {
18991 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18992 if v_0.Op != OpMul64 {
18993 continue
18994 }
18995 _ = v_0.Args[1]
18996 v_0_0 := v_0.Args[0]
18997 v_0_1 := v_0.Args[1]
18998 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18999 i := v_0_0
19000 if i.Op != OpConst64 {
19001 continue
19002 }
19003 t := i.Type
19004 z := v_0_1
19005 x := v_1
19006 if !(z.Op != OpConst64 && x.Op != OpConst64) {
19007 continue
19008 }
19009 v.reset(OpMul64)
19010 v0 := b.NewValue0(v.Pos, OpMul64, t)
19011 v0.AddArg2(x, z)
19012 v.AddArg2(i, v0)
19013 return true
19014 }
19015 }
19016 break
19017 }
19018
19019
19020 for {
19021 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19022 if v_0.Op != OpConst64 {
19023 continue
19024 }
19025 t := v_0.Type
19026 c := auxIntToInt64(v_0.AuxInt)
19027 if v_1.Op != OpMul64 {
19028 continue
19029 }
19030 _ = v_1.Args[1]
19031 v_1_0 := v_1.Args[0]
19032 v_1_1 := v_1.Args[1]
19033 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19034 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
19035 continue
19036 }
19037 d := auxIntToInt64(v_1_0.AuxInt)
19038 x := v_1_1
19039 v.reset(OpMul64)
19040 v0 := b.NewValue0(v.Pos, OpConst64, t)
19041 v0.AuxInt = int64ToAuxInt(c * d)
19042 v.AddArg2(v0, x)
19043 return true
19044 }
19045 }
19046 break
19047 }
19048 return false
19049 }
19050 func rewriteValuegeneric_OpMul64F(v *Value) bool {
19051 v_1 := v.Args[1]
19052 v_0 := v.Args[0]
19053
19054
19055
19056 for {
19057 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19058 if v_0.Op != OpConst64F {
19059 continue
19060 }
19061 c := auxIntToFloat64(v_0.AuxInt)
19062 if v_1.Op != OpConst64F {
19063 continue
19064 }
19065 d := auxIntToFloat64(v_1.AuxInt)
19066 if !(c*d == c*d) {
19067 continue
19068 }
19069 v.reset(OpConst64F)
19070 v.AuxInt = float64ToAuxInt(c * d)
19071 return true
19072 }
19073 break
19074 }
19075
19076
19077 for {
19078 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19079 x := v_0
19080 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != 1 {
19081 continue
19082 }
19083 v.copyOf(x)
19084 return true
19085 }
19086 break
19087 }
19088
19089
19090 for {
19091 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19092 x := v_0
19093 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != -1 {
19094 continue
19095 }
19096 v.reset(OpNeg64F)
19097 v.AddArg(x)
19098 return true
19099 }
19100 break
19101 }
19102
19103
19104 for {
19105 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19106 x := v_0
19107 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != 2 {
19108 continue
19109 }
19110 v.reset(OpAdd64F)
19111 v.AddArg2(x, x)
19112 return true
19113 }
19114 break
19115 }
19116 return false
19117 }
19118 func rewriteValuegeneric_OpMul64uhilo(v *Value) bool {
19119 v_1 := v.Args[1]
19120 v_0 := v.Args[0]
19121 b := v.Block
19122 typ := &b.Func.Config.Types
19123
19124
19125 for {
19126 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19127 if v_0.Op != OpConst64 {
19128 continue
19129 }
19130 c := auxIntToInt64(v_0.AuxInt)
19131 if v_1.Op != OpConst64 {
19132 continue
19133 }
19134 d := auxIntToInt64(v_1.AuxInt)
19135 v.reset(OpMakeTuple)
19136 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
19137 v0.AuxInt = int64ToAuxInt(bitsMulU64(c, d).hi)
19138 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
19139 v1.AuxInt = int64ToAuxInt(bitsMulU64(c, d).lo)
19140 v.AddArg2(v0, v1)
19141 return true
19142 }
19143 break
19144 }
19145 return false
19146 }
19147 func rewriteValuegeneric_OpMul64uover(v *Value) bool {
19148 v_1 := v.Args[1]
19149 v_0 := v.Args[0]
19150 b := v.Block
19151 typ := &b.Func.Config.Types
19152
19153
19154 for {
19155 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19156 if v_0.Op != OpConst64 {
19157 continue
19158 }
19159 c := auxIntToInt64(v_0.AuxInt)
19160 if v_1.Op != OpConst64 {
19161 continue
19162 }
19163 d := auxIntToInt64(v_1.AuxInt)
19164 v.reset(OpMakeTuple)
19165 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
19166 v0.AuxInt = int64ToAuxInt(bitsMulU64(c, d).lo)
19167 v1 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
19168 v1.AuxInt = boolToAuxInt(bitsMulU64(c, d).hi != 0)
19169 v.AddArg2(v0, v1)
19170 return true
19171 }
19172 break
19173 }
19174
19175
19176 for {
19177 t := v.Type
19178 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19179 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 {
19180 continue
19181 }
19182 x := v_1
19183 v.reset(OpMakeTuple)
19184 v0 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
19185 v0.AuxInt = boolToAuxInt(false)
19186 v.AddArg2(x, v0)
19187 return true
19188 }
19189 break
19190 }
19191
19192
19193 for {
19194 t := v.Type
19195 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19196 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
19197 continue
19198 }
19199 v.reset(OpMakeTuple)
19200 v0 := b.NewValue0(v.Pos, OpConst64, t.FieldType(0))
19201 v0.AuxInt = int64ToAuxInt(0)
19202 v1 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
19203 v1.AuxInt = boolToAuxInt(false)
19204 v.AddArg2(v0, v1)
19205 return true
19206 }
19207 break
19208 }
19209 return false
19210 }
19211 func rewriteValuegeneric_OpMul8(v *Value) bool {
19212 v_1 := v.Args[1]
19213 v_0 := v.Args[0]
19214 b := v.Block
19215 typ := &b.Func.Config.Types
19216
19217
19218 for {
19219 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19220 if v_0.Op != OpConst8 {
19221 continue
19222 }
19223 c := auxIntToInt8(v_0.AuxInt)
19224 if v_1.Op != OpConst8 {
19225 continue
19226 }
19227 d := auxIntToInt8(v_1.AuxInt)
19228 v.reset(OpConst8)
19229 v.AuxInt = int8ToAuxInt(c * d)
19230 return true
19231 }
19232 break
19233 }
19234
19235
19236 for {
19237 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19238 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 1 {
19239 continue
19240 }
19241 x := v_1
19242 v.copyOf(x)
19243 return true
19244 }
19245 break
19246 }
19247
19248
19249 for {
19250 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19251 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
19252 continue
19253 }
19254 x := v_1
19255 v.reset(OpNeg8)
19256 v.AddArg(x)
19257 return true
19258 }
19259 break
19260 }
19261
19262
19263 for {
19264 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19265 if v_0.Op != OpConst8 {
19266 continue
19267 }
19268 t := v_0.Type
19269 c := auxIntToInt8(v_0.AuxInt)
19270 if v_1.Op != OpNeg8 {
19271 continue
19272 }
19273 x := v_1.Args[0]
19274 v.reset(OpMul8)
19275 v0 := b.NewValue0(v.Pos, OpConst8, t)
19276 v0.AuxInt = int8ToAuxInt(-c)
19277 v.AddArg2(x, v0)
19278 return true
19279 }
19280 break
19281 }
19282
19283
19284 for {
19285 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19286 if v_0.Op != OpNeg8 {
19287 continue
19288 }
19289 x := v_0.Args[0]
19290 if v_1.Op != OpNeg8 {
19291 continue
19292 }
19293 y := v_1.Args[0]
19294 v.reset(OpMul8)
19295 v.AddArg2(x, y)
19296 return true
19297 }
19298 break
19299 }
19300
19301
19302
19303 for {
19304 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19305 if v_0.Op != OpConst8 {
19306 continue
19307 }
19308 t := v_0.Type
19309 c := auxIntToInt8(v_0.AuxInt)
19310 if v_1.Op != OpAdd8 || v_1.Type != t {
19311 continue
19312 }
19313 _ = v_1.Args[1]
19314 v_1_0 := v_1.Args[0]
19315 v_1_1 := v_1.Args[1]
19316 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19317 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
19318 continue
19319 }
19320 d := auxIntToInt8(v_1_0.AuxInt)
19321 x := v_1_1
19322 if !(!isPowerOfTwo(c)) {
19323 continue
19324 }
19325 v.reset(OpAdd8)
19326 v0 := b.NewValue0(v.Pos, OpConst8, t)
19327 v0.AuxInt = int8ToAuxInt(c * d)
19328 v1 := b.NewValue0(v.Pos, OpMul8, t)
19329 v2 := b.NewValue0(v.Pos, OpConst8, t)
19330 v2.AuxInt = int8ToAuxInt(c)
19331 v1.AddArg2(v2, x)
19332 v.AddArg2(v0, v1)
19333 return true
19334 }
19335 }
19336 break
19337 }
19338
19339
19340 for {
19341 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19342 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
19343 continue
19344 }
19345 v.reset(OpConst8)
19346 v.AuxInt = int8ToAuxInt(0)
19347 return true
19348 }
19349 break
19350 }
19351
19352
19353
19354 for {
19355 t := v.Type
19356 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19357 x := v_0
19358 if v_1.Op != OpConst8 {
19359 continue
19360 }
19361 c := auxIntToInt8(v_1.AuxInt)
19362 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
19363 continue
19364 }
19365 v.reset(OpLsh8x64)
19366 v.Type = t
19367 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
19368 v0.AuxInt = int64ToAuxInt(log8(c))
19369 v.AddArg2(x, v0)
19370 return true
19371 }
19372 break
19373 }
19374
19375
19376
19377 for {
19378 t := v.Type
19379 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19380 x := v_0
19381 if v_1.Op != OpConst8 {
19382 continue
19383 }
19384 c := auxIntToInt8(v_1.AuxInt)
19385 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
19386 continue
19387 }
19388 v.reset(OpNeg8)
19389 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
19390 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
19391 v1.AuxInt = int64ToAuxInt(log8(-c))
19392 v0.AddArg2(x, v1)
19393 v.AddArg(v0)
19394 return true
19395 }
19396 break
19397 }
19398
19399
19400
19401 for {
19402 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19403 if v_0.Op != OpMul8 {
19404 continue
19405 }
19406 _ = v_0.Args[1]
19407 v_0_0 := v_0.Args[0]
19408 v_0_1 := v_0.Args[1]
19409 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19410 i := v_0_0
19411 if i.Op != OpConst8 {
19412 continue
19413 }
19414 t := i.Type
19415 z := v_0_1
19416 x := v_1
19417 if !(z.Op != OpConst8 && x.Op != OpConst8) {
19418 continue
19419 }
19420 v.reset(OpMul8)
19421 v0 := b.NewValue0(v.Pos, OpMul8, t)
19422 v0.AddArg2(x, z)
19423 v.AddArg2(i, v0)
19424 return true
19425 }
19426 }
19427 break
19428 }
19429
19430
19431 for {
19432 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19433 if v_0.Op != OpConst8 {
19434 continue
19435 }
19436 t := v_0.Type
19437 c := auxIntToInt8(v_0.AuxInt)
19438 if v_1.Op != OpMul8 {
19439 continue
19440 }
19441 _ = v_1.Args[1]
19442 v_1_0 := v_1.Args[0]
19443 v_1_1 := v_1.Args[1]
19444 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19445 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
19446 continue
19447 }
19448 d := auxIntToInt8(v_1_0.AuxInt)
19449 x := v_1_1
19450 v.reset(OpMul8)
19451 v0 := b.NewValue0(v.Pos, OpConst8, t)
19452 v0.AuxInt = int8ToAuxInt(c * d)
19453 v.AddArg2(v0, x)
19454 return true
19455 }
19456 }
19457 break
19458 }
19459 return false
19460 }
19461 func rewriteValuegeneric_OpNeg16(v *Value) bool {
19462 v_0 := v.Args[0]
19463 b := v.Block
19464
19465
19466 for {
19467 if v_0.Op != OpConst16 {
19468 break
19469 }
19470 c := auxIntToInt16(v_0.AuxInt)
19471 v.reset(OpConst16)
19472 v.AuxInt = int16ToAuxInt(-c)
19473 return true
19474 }
19475
19476
19477 for {
19478 if v_0.Op != OpMul16 {
19479 break
19480 }
19481 _ = v_0.Args[1]
19482 v_0_0 := v_0.Args[0]
19483 v_0_1 := v_0.Args[1]
19484 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
19485 x := v_0_0
19486 if v_0_1.Op != OpConst16 {
19487 continue
19488 }
19489 t := v_0_1.Type
19490 c := auxIntToInt16(v_0_1.AuxInt)
19491 v.reset(OpMul16)
19492 v0 := b.NewValue0(v.Pos, OpConst16, t)
19493 v0.AuxInt = int16ToAuxInt(-c)
19494 v.AddArg2(x, v0)
19495 return true
19496 }
19497 break
19498 }
19499
19500
19501 for {
19502 if v_0.Op != OpMul16 {
19503 break
19504 }
19505 _ = v_0.Args[1]
19506 v_0_0 := v_0.Args[0]
19507 v_0_1 := v_0.Args[1]
19508 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
19509 x := v_0_0
19510 if v_0_1.Op != OpNeg16 {
19511 continue
19512 }
19513 y := v_0_1.Args[0]
19514 v.reset(OpMul16)
19515 v.AddArg2(x, y)
19516 return true
19517 }
19518 break
19519 }
19520
19521
19522 for {
19523 if v_0.Op != OpSub16 {
19524 break
19525 }
19526 y := v_0.Args[1]
19527 x := v_0.Args[0]
19528 v.reset(OpSub16)
19529 v.AddArg2(y, x)
19530 return true
19531 }
19532
19533
19534 for {
19535 if v_0.Op != OpNeg16 {
19536 break
19537 }
19538 x := v_0.Args[0]
19539 v.copyOf(x)
19540 return true
19541 }
19542
19543
19544 for {
19545 t := v.Type
19546 if v_0.Op != OpCom16 {
19547 break
19548 }
19549 x := v_0.Args[0]
19550 v.reset(OpAdd16)
19551 v0 := b.NewValue0(v.Pos, OpConst16, t)
19552 v0.AuxInt = int16ToAuxInt(1)
19553 v.AddArg2(v0, x)
19554 return true
19555 }
19556 return false
19557 }
19558 func rewriteValuegeneric_OpNeg32(v *Value) bool {
19559 v_0 := v.Args[0]
19560 b := v.Block
19561
19562
19563 for {
19564 if v_0.Op != OpConst32 {
19565 break
19566 }
19567 c := auxIntToInt32(v_0.AuxInt)
19568 v.reset(OpConst32)
19569 v.AuxInt = int32ToAuxInt(-c)
19570 return true
19571 }
19572
19573
19574 for {
19575 if v_0.Op != OpMul32 {
19576 break
19577 }
19578 _ = v_0.Args[1]
19579 v_0_0 := v_0.Args[0]
19580 v_0_1 := v_0.Args[1]
19581 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
19582 x := v_0_0
19583 if v_0_1.Op != OpConst32 {
19584 continue
19585 }
19586 t := v_0_1.Type
19587 c := auxIntToInt32(v_0_1.AuxInt)
19588 v.reset(OpMul32)
19589 v0 := b.NewValue0(v.Pos, OpConst32, t)
19590 v0.AuxInt = int32ToAuxInt(-c)
19591 v.AddArg2(x, v0)
19592 return true
19593 }
19594 break
19595 }
19596
19597
19598 for {
19599 if v_0.Op != OpMul32 {
19600 break
19601 }
19602 _ = v_0.Args[1]
19603 v_0_0 := v_0.Args[0]
19604 v_0_1 := v_0.Args[1]
19605 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
19606 x := v_0_0
19607 if v_0_1.Op != OpNeg32 {
19608 continue
19609 }
19610 y := v_0_1.Args[0]
19611 v.reset(OpMul32)
19612 v.AddArg2(x, y)
19613 return true
19614 }
19615 break
19616 }
19617
19618
19619 for {
19620 if v_0.Op != OpSub32 {
19621 break
19622 }
19623 y := v_0.Args[1]
19624 x := v_0.Args[0]
19625 v.reset(OpSub32)
19626 v.AddArg2(y, x)
19627 return true
19628 }
19629
19630
19631 for {
19632 if v_0.Op != OpNeg32 {
19633 break
19634 }
19635 x := v_0.Args[0]
19636 v.copyOf(x)
19637 return true
19638 }
19639
19640
19641 for {
19642 t := v.Type
19643 if v_0.Op != OpCom32 {
19644 break
19645 }
19646 x := v_0.Args[0]
19647 v.reset(OpAdd32)
19648 v0 := b.NewValue0(v.Pos, OpConst32, t)
19649 v0.AuxInt = int32ToAuxInt(1)
19650 v.AddArg2(v0, x)
19651 return true
19652 }
19653 return false
19654 }
19655 func rewriteValuegeneric_OpNeg32F(v *Value) bool {
19656 v_0 := v.Args[0]
19657
19658
19659
19660 for {
19661 if v_0.Op != OpConst32F {
19662 break
19663 }
19664 c := auxIntToFloat32(v_0.AuxInt)
19665 if !(c != 0) {
19666 break
19667 }
19668 v.reset(OpConst32F)
19669 v.AuxInt = float32ToAuxInt(-c)
19670 return true
19671 }
19672 return false
19673 }
19674 func rewriteValuegeneric_OpNeg64(v *Value) bool {
19675 v_0 := v.Args[0]
19676 b := v.Block
19677
19678
19679 for {
19680 if v_0.Op != OpConst64 {
19681 break
19682 }
19683 c := auxIntToInt64(v_0.AuxInt)
19684 v.reset(OpConst64)
19685 v.AuxInt = int64ToAuxInt(-c)
19686 return true
19687 }
19688
19689
19690 for {
19691 if v_0.Op != OpMul64 {
19692 break
19693 }
19694 _ = v_0.Args[1]
19695 v_0_0 := v_0.Args[0]
19696 v_0_1 := v_0.Args[1]
19697 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
19698 x := v_0_0
19699 if v_0_1.Op != OpConst64 {
19700 continue
19701 }
19702 t := v_0_1.Type
19703 c := auxIntToInt64(v_0_1.AuxInt)
19704 v.reset(OpMul64)
19705 v0 := b.NewValue0(v.Pos, OpConst64, t)
19706 v0.AuxInt = int64ToAuxInt(-c)
19707 v.AddArg2(x, v0)
19708 return true
19709 }
19710 break
19711 }
19712
19713
19714 for {
19715 if v_0.Op != OpMul64 {
19716 break
19717 }
19718 _ = v_0.Args[1]
19719 v_0_0 := v_0.Args[0]
19720 v_0_1 := v_0.Args[1]
19721 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
19722 x := v_0_0
19723 if v_0_1.Op != OpNeg64 {
19724 continue
19725 }
19726 y := v_0_1.Args[0]
19727 v.reset(OpMul64)
19728 v.AddArg2(x, y)
19729 return true
19730 }
19731 break
19732 }
19733
19734
19735 for {
19736 if v_0.Op != OpSub64 {
19737 break
19738 }
19739 y := v_0.Args[1]
19740 x := v_0.Args[0]
19741 v.reset(OpSub64)
19742 v.AddArg2(y, x)
19743 return true
19744 }
19745
19746
19747 for {
19748 if v_0.Op != OpNeg64 {
19749 break
19750 }
19751 x := v_0.Args[0]
19752 v.copyOf(x)
19753 return true
19754 }
19755
19756
19757 for {
19758 t := v.Type
19759 if v_0.Op != OpCom64 {
19760 break
19761 }
19762 x := v_0.Args[0]
19763 v.reset(OpAdd64)
19764 v0 := b.NewValue0(v.Pos, OpConst64, t)
19765 v0.AuxInt = int64ToAuxInt(1)
19766 v.AddArg2(v0, x)
19767 return true
19768 }
19769 return false
19770 }
19771 func rewriteValuegeneric_OpNeg64F(v *Value) bool {
19772 v_0 := v.Args[0]
19773
19774
19775
19776 for {
19777 if v_0.Op != OpConst64F {
19778 break
19779 }
19780 c := auxIntToFloat64(v_0.AuxInt)
19781 if !(c != 0) {
19782 break
19783 }
19784 v.reset(OpConst64F)
19785 v.AuxInt = float64ToAuxInt(-c)
19786 return true
19787 }
19788 return false
19789 }
19790 func rewriteValuegeneric_OpNeg8(v *Value) bool {
19791 v_0 := v.Args[0]
19792 b := v.Block
19793
19794
19795 for {
19796 if v_0.Op != OpConst8 {
19797 break
19798 }
19799 c := auxIntToInt8(v_0.AuxInt)
19800 v.reset(OpConst8)
19801 v.AuxInt = int8ToAuxInt(-c)
19802 return true
19803 }
19804
19805
19806 for {
19807 if v_0.Op != OpMul8 {
19808 break
19809 }
19810 _ = v_0.Args[1]
19811 v_0_0 := v_0.Args[0]
19812 v_0_1 := v_0.Args[1]
19813 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
19814 x := v_0_0
19815 if v_0_1.Op != OpConst8 {
19816 continue
19817 }
19818 t := v_0_1.Type
19819 c := auxIntToInt8(v_0_1.AuxInt)
19820 v.reset(OpMul8)
19821 v0 := b.NewValue0(v.Pos, OpConst8, t)
19822 v0.AuxInt = int8ToAuxInt(-c)
19823 v.AddArg2(x, v0)
19824 return true
19825 }
19826 break
19827 }
19828
19829
19830 for {
19831 if v_0.Op != OpMul8 {
19832 break
19833 }
19834 _ = v_0.Args[1]
19835 v_0_0 := v_0.Args[0]
19836 v_0_1 := v_0.Args[1]
19837 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
19838 x := v_0_0
19839 if v_0_1.Op != OpNeg8 {
19840 continue
19841 }
19842 y := v_0_1.Args[0]
19843 v.reset(OpMul8)
19844 v.AddArg2(x, y)
19845 return true
19846 }
19847 break
19848 }
19849
19850
19851 for {
19852 if v_0.Op != OpSub8 {
19853 break
19854 }
19855 y := v_0.Args[1]
19856 x := v_0.Args[0]
19857 v.reset(OpSub8)
19858 v.AddArg2(y, x)
19859 return true
19860 }
19861
19862
19863 for {
19864 if v_0.Op != OpNeg8 {
19865 break
19866 }
19867 x := v_0.Args[0]
19868 v.copyOf(x)
19869 return true
19870 }
19871
19872
19873 for {
19874 t := v.Type
19875 if v_0.Op != OpCom8 {
19876 break
19877 }
19878 x := v_0.Args[0]
19879 v.reset(OpAdd8)
19880 v0 := b.NewValue0(v.Pos, OpConst8, t)
19881 v0.AuxInt = int8ToAuxInt(1)
19882 v.AddArg2(v0, x)
19883 return true
19884 }
19885 return false
19886 }
19887 func rewriteValuegeneric_OpNeq16(v *Value) bool {
19888 v_1 := v.Args[1]
19889 v_0 := v.Args[0]
19890 b := v.Block
19891
19892
19893 for {
19894 x := v_0
19895 if x != v_1 {
19896 break
19897 }
19898 v.reset(OpConstBool)
19899 v.AuxInt = boolToAuxInt(false)
19900 return true
19901 }
19902
19903
19904 for {
19905 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19906 if v_0.Op != OpConst16 {
19907 continue
19908 }
19909 t := v_0.Type
19910 c := auxIntToInt16(v_0.AuxInt)
19911 if v_1.Op != OpAdd16 {
19912 continue
19913 }
19914 _ = v_1.Args[1]
19915 v_1_0 := v_1.Args[0]
19916 v_1_1 := v_1.Args[1]
19917 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19918 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
19919 continue
19920 }
19921 d := auxIntToInt16(v_1_0.AuxInt)
19922 x := v_1_1
19923 v.reset(OpNeq16)
19924 v0 := b.NewValue0(v.Pos, OpConst16, t)
19925 v0.AuxInt = int16ToAuxInt(c - d)
19926 v.AddArg2(v0, x)
19927 return true
19928 }
19929 }
19930 break
19931 }
19932
19933
19934 for {
19935 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19936 if v_0.Op != OpConst16 {
19937 continue
19938 }
19939 c := auxIntToInt16(v_0.AuxInt)
19940 if v_1.Op != OpConst16 {
19941 continue
19942 }
19943 d := auxIntToInt16(v_1.AuxInt)
19944 v.reset(OpConstBool)
19945 v.AuxInt = boolToAuxInt(c != d)
19946 return true
19947 }
19948 break
19949 }
19950
19951
19952
19953 for {
19954 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19955 s := v_0
19956 if s.Op != OpSub16 {
19957 continue
19958 }
19959 y := s.Args[1]
19960 x := s.Args[0]
19961 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(s.Uses == 1) {
19962 continue
19963 }
19964 v.reset(OpNeq16)
19965 v.AddArg2(x, y)
19966 return true
19967 }
19968 break
19969 }
19970
19971
19972
19973 for {
19974 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19975 if v_0.Op != OpAnd16 {
19976 continue
19977 }
19978 t := v_0.Type
19979 _ = v_0.Args[1]
19980 v_0_0 := v_0.Args[0]
19981 v_0_1 := v_0.Args[1]
19982 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19983 x := v_0_0
19984 if v_0_1.Op != OpConst16 || v_0_1.Type != t {
19985 continue
19986 }
19987 y := auxIntToInt16(v_0_1.AuxInt)
19988 if v_1.Op != OpConst16 || v_1.Type != t || auxIntToInt16(v_1.AuxInt) != y || !(oneBit(y)) {
19989 continue
19990 }
19991 v.reset(OpEq16)
19992 v0 := b.NewValue0(v.Pos, OpAnd16, t)
19993 v1 := b.NewValue0(v.Pos, OpConst16, t)
19994 v1.AuxInt = int16ToAuxInt(y)
19995 v0.AddArg2(x, v1)
19996 v2 := b.NewValue0(v.Pos, OpConst16, t)
19997 v2.AuxInt = int16ToAuxInt(0)
19998 v.AddArg2(v0, v2)
19999 return true
20000 }
20001 }
20002 break
20003 }
20004
20005
20006 for {
20007 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20008 if v_0.Op != OpZeroExt8to16 {
20009 continue
20010 }
20011 v_0_0 := v_0.Args[0]
20012 if v_0_0.Op != OpCvtBoolToUint8 {
20013 continue
20014 }
20015 x := v_0_0.Args[0]
20016 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
20017 continue
20018 }
20019 v.copyOf(x)
20020 return true
20021 }
20022 break
20023 }
20024
20025
20026 for {
20027 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20028 if v_0.Op != OpZeroExt8to16 {
20029 continue
20030 }
20031 v_0_0 := v_0.Args[0]
20032 if v_0_0.Op != OpCvtBoolToUint8 {
20033 continue
20034 }
20035 x := v_0_0.Args[0]
20036 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
20037 continue
20038 }
20039 v.reset(OpNot)
20040 v.AddArg(x)
20041 return true
20042 }
20043 break
20044 }
20045
20046
20047 for {
20048 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20049 if v_0.Op != OpSignExt8to16 {
20050 continue
20051 }
20052 v_0_0 := v_0.Args[0]
20053 if v_0_0.Op != OpCvtBoolToUint8 {
20054 continue
20055 }
20056 x := v_0_0.Args[0]
20057 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
20058 continue
20059 }
20060 v.copyOf(x)
20061 return true
20062 }
20063 break
20064 }
20065
20066
20067 for {
20068 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20069 if v_0.Op != OpSignExt8to16 {
20070 continue
20071 }
20072 v_0_0 := v_0.Args[0]
20073 if v_0_0.Op != OpCvtBoolToUint8 {
20074 continue
20075 }
20076 x := v_0_0.Args[0]
20077 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
20078 continue
20079 }
20080 v.reset(OpNot)
20081 v.AddArg(x)
20082 return true
20083 }
20084 break
20085 }
20086 return false
20087 }
20088 func rewriteValuegeneric_OpNeq32(v *Value) bool {
20089 v_1 := v.Args[1]
20090 v_0 := v.Args[0]
20091 b := v.Block
20092
20093
20094 for {
20095 x := v_0
20096 if x != v_1 {
20097 break
20098 }
20099 v.reset(OpConstBool)
20100 v.AuxInt = boolToAuxInt(false)
20101 return true
20102 }
20103
20104
20105 for {
20106 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20107 if v_0.Op != OpConst32 {
20108 continue
20109 }
20110 t := v_0.Type
20111 c := auxIntToInt32(v_0.AuxInt)
20112 if v_1.Op != OpAdd32 {
20113 continue
20114 }
20115 _ = v_1.Args[1]
20116 v_1_0 := v_1.Args[0]
20117 v_1_1 := v_1.Args[1]
20118 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
20119 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
20120 continue
20121 }
20122 d := auxIntToInt32(v_1_0.AuxInt)
20123 x := v_1_1
20124 v.reset(OpNeq32)
20125 v0 := b.NewValue0(v.Pos, OpConst32, t)
20126 v0.AuxInt = int32ToAuxInt(c - d)
20127 v.AddArg2(v0, x)
20128 return true
20129 }
20130 }
20131 break
20132 }
20133
20134
20135 for {
20136 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20137 if v_0.Op != OpConst32 {
20138 continue
20139 }
20140 c := auxIntToInt32(v_0.AuxInt)
20141 if v_1.Op != OpConst32 {
20142 continue
20143 }
20144 d := auxIntToInt32(v_1.AuxInt)
20145 v.reset(OpConstBool)
20146 v.AuxInt = boolToAuxInt(c != d)
20147 return true
20148 }
20149 break
20150 }
20151
20152
20153
20154 for {
20155 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20156 s := v_0
20157 if s.Op != OpSub32 {
20158 continue
20159 }
20160 y := s.Args[1]
20161 x := s.Args[0]
20162 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 || !(s.Uses == 1) {
20163 continue
20164 }
20165 v.reset(OpNeq32)
20166 v.AddArg2(x, y)
20167 return true
20168 }
20169 break
20170 }
20171
20172
20173
20174 for {
20175 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20176 if v_0.Op != OpAnd32 {
20177 continue
20178 }
20179 t := v_0.Type
20180 _ = v_0.Args[1]
20181 v_0_0 := v_0.Args[0]
20182 v_0_1 := v_0.Args[1]
20183 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
20184 x := v_0_0
20185 if v_0_1.Op != OpConst32 || v_0_1.Type != t {
20186 continue
20187 }
20188 y := auxIntToInt32(v_0_1.AuxInt)
20189 if v_1.Op != OpConst32 || v_1.Type != t || auxIntToInt32(v_1.AuxInt) != y || !(oneBit(y)) {
20190 continue
20191 }
20192 v.reset(OpEq32)
20193 v0 := b.NewValue0(v.Pos, OpAnd32, t)
20194 v1 := b.NewValue0(v.Pos, OpConst32, t)
20195 v1.AuxInt = int32ToAuxInt(y)
20196 v0.AddArg2(x, v1)
20197 v2 := b.NewValue0(v.Pos, OpConst32, t)
20198 v2.AuxInt = int32ToAuxInt(0)
20199 v.AddArg2(v0, v2)
20200 return true
20201 }
20202 }
20203 break
20204 }
20205
20206
20207 for {
20208 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20209 if v_0.Op != OpZeroExt8to32 {
20210 continue
20211 }
20212 v_0_0 := v_0.Args[0]
20213 if v_0_0.Op != OpCvtBoolToUint8 {
20214 continue
20215 }
20216 x := v_0_0.Args[0]
20217 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
20218 continue
20219 }
20220 v.copyOf(x)
20221 return true
20222 }
20223 break
20224 }
20225
20226
20227 for {
20228 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20229 if v_0.Op != OpZeroExt8to32 {
20230 continue
20231 }
20232 v_0_0 := v_0.Args[0]
20233 if v_0_0.Op != OpCvtBoolToUint8 {
20234 continue
20235 }
20236 x := v_0_0.Args[0]
20237 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
20238 continue
20239 }
20240 v.reset(OpNot)
20241 v.AddArg(x)
20242 return true
20243 }
20244 break
20245 }
20246
20247
20248 for {
20249 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20250 if v_0.Op != OpSignExt8to32 {
20251 continue
20252 }
20253 v_0_0 := v_0.Args[0]
20254 if v_0_0.Op != OpCvtBoolToUint8 {
20255 continue
20256 }
20257 x := v_0_0.Args[0]
20258 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
20259 continue
20260 }
20261 v.copyOf(x)
20262 return true
20263 }
20264 break
20265 }
20266
20267
20268 for {
20269 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20270 if v_0.Op != OpSignExt8to32 {
20271 continue
20272 }
20273 v_0_0 := v_0.Args[0]
20274 if v_0_0.Op != OpCvtBoolToUint8 {
20275 continue
20276 }
20277 x := v_0_0.Args[0]
20278 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
20279 continue
20280 }
20281 v.reset(OpNot)
20282 v.AddArg(x)
20283 return true
20284 }
20285 break
20286 }
20287 return false
20288 }
20289 func rewriteValuegeneric_OpNeq32F(v *Value) bool {
20290 v_1 := v.Args[1]
20291 v_0 := v.Args[0]
20292
20293
20294 for {
20295 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20296 if v_0.Op != OpConst32F {
20297 continue
20298 }
20299 c := auxIntToFloat32(v_0.AuxInt)
20300 if v_1.Op != OpConst32F {
20301 continue
20302 }
20303 d := auxIntToFloat32(v_1.AuxInt)
20304 v.reset(OpConstBool)
20305 v.AuxInt = boolToAuxInt(c != d)
20306 return true
20307 }
20308 break
20309 }
20310 return false
20311 }
20312 func rewriteValuegeneric_OpNeq64(v *Value) bool {
20313 v_1 := v.Args[1]
20314 v_0 := v.Args[0]
20315 b := v.Block
20316
20317
20318 for {
20319 x := v_0
20320 if x != v_1 {
20321 break
20322 }
20323 v.reset(OpConstBool)
20324 v.AuxInt = boolToAuxInt(false)
20325 return true
20326 }
20327
20328
20329 for {
20330 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20331 if v_0.Op != OpConst64 {
20332 continue
20333 }
20334 t := v_0.Type
20335 c := auxIntToInt64(v_0.AuxInt)
20336 if v_1.Op != OpAdd64 {
20337 continue
20338 }
20339 _ = v_1.Args[1]
20340 v_1_0 := v_1.Args[0]
20341 v_1_1 := v_1.Args[1]
20342 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
20343 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
20344 continue
20345 }
20346 d := auxIntToInt64(v_1_0.AuxInt)
20347 x := v_1_1
20348 v.reset(OpNeq64)
20349 v0 := b.NewValue0(v.Pos, OpConst64, t)
20350 v0.AuxInt = int64ToAuxInt(c - d)
20351 v.AddArg2(v0, x)
20352 return true
20353 }
20354 }
20355 break
20356 }
20357
20358
20359 for {
20360 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20361 if v_0.Op != OpConst64 {
20362 continue
20363 }
20364 c := auxIntToInt64(v_0.AuxInt)
20365 if v_1.Op != OpConst64 {
20366 continue
20367 }
20368 d := auxIntToInt64(v_1.AuxInt)
20369 v.reset(OpConstBool)
20370 v.AuxInt = boolToAuxInt(c != d)
20371 return true
20372 }
20373 break
20374 }
20375
20376
20377
20378 for {
20379 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20380 s := v_0
20381 if s.Op != OpSub64 {
20382 continue
20383 }
20384 y := s.Args[1]
20385 x := s.Args[0]
20386 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 || !(s.Uses == 1) {
20387 continue
20388 }
20389 v.reset(OpNeq64)
20390 v.AddArg2(x, y)
20391 return true
20392 }
20393 break
20394 }
20395
20396
20397
20398 for {
20399 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20400 if v_0.Op != OpAnd64 {
20401 continue
20402 }
20403 t := v_0.Type
20404 _ = v_0.Args[1]
20405 v_0_0 := v_0.Args[0]
20406 v_0_1 := v_0.Args[1]
20407 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
20408 x := v_0_0
20409 if v_0_1.Op != OpConst64 || v_0_1.Type != t {
20410 continue
20411 }
20412 y := auxIntToInt64(v_0_1.AuxInt)
20413 if v_1.Op != OpConst64 || v_1.Type != t || auxIntToInt64(v_1.AuxInt) != y || !(oneBit(y)) {
20414 continue
20415 }
20416 v.reset(OpEq64)
20417 v0 := b.NewValue0(v.Pos, OpAnd64, t)
20418 v1 := b.NewValue0(v.Pos, OpConst64, t)
20419 v1.AuxInt = int64ToAuxInt(y)
20420 v0.AddArg2(x, v1)
20421 v2 := b.NewValue0(v.Pos, OpConst64, t)
20422 v2.AuxInt = int64ToAuxInt(0)
20423 v.AddArg2(v0, v2)
20424 return true
20425 }
20426 }
20427 break
20428 }
20429
20430
20431 for {
20432 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20433 if v_0.Op != OpZeroExt8to64 {
20434 continue
20435 }
20436 v_0_0 := v_0.Args[0]
20437 if v_0_0.Op != OpCvtBoolToUint8 {
20438 continue
20439 }
20440 x := v_0_0.Args[0]
20441 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
20442 continue
20443 }
20444 v.copyOf(x)
20445 return true
20446 }
20447 break
20448 }
20449
20450
20451 for {
20452 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20453 if v_0.Op != OpZeroExt8to64 {
20454 continue
20455 }
20456 v_0_0 := v_0.Args[0]
20457 if v_0_0.Op != OpCvtBoolToUint8 {
20458 continue
20459 }
20460 x := v_0_0.Args[0]
20461 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
20462 continue
20463 }
20464 v.reset(OpNot)
20465 v.AddArg(x)
20466 return true
20467 }
20468 break
20469 }
20470
20471
20472 for {
20473 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20474 if v_0.Op != OpSignExt8to64 {
20475 continue
20476 }
20477 v_0_0 := v_0.Args[0]
20478 if v_0_0.Op != OpCvtBoolToUint8 {
20479 continue
20480 }
20481 x := v_0_0.Args[0]
20482 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
20483 continue
20484 }
20485 v.copyOf(x)
20486 return true
20487 }
20488 break
20489 }
20490
20491
20492 for {
20493 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20494 if v_0.Op != OpSignExt8to64 {
20495 continue
20496 }
20497 v_0_0 := v_0.Args[0]
20498 if v_0_0.Op != OpCvtBoolToUint8 {
20499 continue
20500 }
20501 x := v_0_0.Args[0]
20502 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
20503 continue
20504 }
20505 v.reset(OpNot)
20506 v.AddArg(x)
20507 return true
20508 }
20509 break
20510 }
20511 return false
20512 }
20513 func rewriteValuegeneric_OpNeq64F(v *Value) bool {
20514 v_1 := v.Args[1]
20515 v_0 := v.Args[0]
20516
20517
20518 for {
20519 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20520 if v_0.Op != OpConst64F {
20521 continue
20522 }
20523 c := auxIntToFloat64(v_0.AuxInt)
20524 if v_1.Op != OpConst64F {
20525 continue
20526 }
20527 d := auxIntToFloat64(v_1.AuxInt)
20528 v.reset(OpConstBool)
20529 v.AuxInt = boolToAuxInt(c != d)
20530 return true
20531 }
20532 break
20533 }
20534 return false
20535 }
20536 func rewriteValuegeneric_OpNeq8(v *Value) bool {
20537 v_1 := v.Args[1]
20538 v_0 := v.Args[0]
20539 b := v.Block
20540
20541
20542 for {
20543 x := v_0
20544 if x != v_1 {
20545 break
20546 }
20547 v.reset(OpConstBool)
20548 v.AuxInt = boolToAuxInt(false)
20549 return true
20550 }
20551
20552
20553 for {
20554 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20555 if v_0.Op != OpConst8 {
20556 continue
20557 }
20558 t := v_0.Type
20559 c := auxIntToInt8(v_0.AuxInt)
20560 if v_1.Op != OpAdd8 {
20561 continue
20562 }
20563 _ = v_1.Args[1]
20564 v_1_0 := v_1.Args[0]
20565 v_1_1 := v_1.Args[1]
20566 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
20567 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
20568 continue
20569 }
20570 d := auxIntToInt8(v_1_0.AuxInt)
20571 x := v_1_1
20572 v.reset(OpNeq8)
20573 v0 := b.NewValue0(v.Pos, OpConst8, t)
20574 v0.AuxInt = int8ToAuxInt(c - d)
20575 v.AddArg2(v0, x)
20576 return true
20577 }
20578 }
20579 break
20580 }
20581
20582
20583 for {
20584 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20585 if v_0.Op != OpConst8 {
20586 continue
20587 }
20588 c := auxIntToInt8(v_0.AuxInt)
20589 if v_1.Op != OpConst8 {
20590 continue
20591 }
20592 d := auxIntToInt8(v_1.AuxInt)
20593 v.reset(OpConstBool)
20594 v.AuxInt = boolToAuxInt(c != d)
20595 return true
20596 }
20597 break
20598 }
20599
20600
20601
20602 for {
20603 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20604 s := v_0
20605 if s.Op != OpSub8 {
20606 continue
20607 }
20608 y := s.Args[1]
20609 x := s.Args[0]
20610 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(s.Uses == 1) {
20611 continue
20612 }
20613 v.reset(OpNeq8)
20614 v.AddArg2(x, y)
20615 return true
20616 }
20617 break
20618 }
20619
20620
20621
20622 for {
20623 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20624 if v_0.Op != OpAnd8 {
20625 continue
20626 }
20627 t := v_0.Type
20628 _ = v_0.Args[1]
20629 v_0_0 := v_0.Args[0]
20630 v_0_1 := v_0.Args[1]
20631 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
20632 x := v_0_0
20633 if v_0_1.Op != OpConst8 || v_0_1.Type != t {
20634 continue
20635 }
20636 y := auxIntToInt8(v_0_1.AuxInt)
20637 if v_1.Op != OpConst8 || v_1.Type != t || auxIntToInt8(v_1.AuxInt) != y || !(oneBit(y)) {
20638 continue
20639 }
20640 v.reset(OpEq8)
20641 v0 := b.NewValue0(v.Pos, OpAnd8, t)
20642 v1 := b.NewValue0(v.Pos, OpConst8, t)
20643 v1.AuxInt = int8ToAuxInt(y)
20644 v0.AddArg2(x, v1)
20645 v2 := b.NewValue0(v.Pos, OpConst8, t)
20646 v2.AuxInt = int8ToAuxInt(0)
20647 v.AddArg2(v0, v2)
20648 return true
20649 }
20650 }
20651 break
20652 }
20653
20654
20655 for {
20656 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20657 if v_0.Op != OpCvtBoolToUint8 {
20658 continue
20659 }
20660 x := v_0.Args[0]
20661 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
20662 continue
20663 }
20664 v.copyOf(x)
20665 return true
20666 }
20667 break
20668 }
20669
20670
20671 for {
20672 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20673 if v_0.Op != OpCvtBoolToUint8 {
20674 continue
20675 }
20676 x := v_0.Args[0]
20677 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 1 {
20678 continue
20679 }
20680 v.reset(OpNot)
20681 v.AddArg(x)
20682 return true
20683 }
20684 break
20685 }
20686 return false
20687 }
20688 func rewriteValuegeneric_OpNeqB(v *Value) bool {
20689 v_1 := v.Args[1]
20690 v_0 := v.Args[0]
20691
20692
20693 for {
20694 x := v_0
20695 if x != v_1 {
20696 break
20697 }
20698 v.reset(OpConstBool)
20699 v.AuxInt = boolToAuxInt(false)
20700 return true
20701 }
20702
20703
20704 for {
20705 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20706 if v_0.Op != OpConstBool {
20707 continue
20708 }
20709 c := auxIntToBool(v_0.AuxInt)
20710 if v_1.Op != OpConstBool {
20711 continue
20712 }
20713 d := auxIntToBool(v_1.AuxInt)
20714 v.reset(OpConstBool)
20715 v.AuxInt = boolToAuxInt(c != d)
20716 return true
20717 }
20718 break
20719 }
20720
20721
20722 for {
20723 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20724 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
20725 continue
20726 }
20727 x := v_1
20728 v.copyOf(x)
20729 return true
20730 }
20731 break
20732 }
20733
20734
20735 for {
20736 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20737 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
20738 continue
20739 }
20740 x := v_1
20741 v.reset(OpNot)
20742 v.AddArg(x)
20743 return true
20744 }
20745 break
20746 }
20747
20748
20749 for {
20750 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20751 if v_0.Op != OpNot {
20752 continue
20753 }
20754 x := v_0.Args[0]
20755 y := v_1
20756 v.reset(OpEqB)
20757 v.AddArg2(x, y)
20758 return true
20759 }
20760 break
20761 }
20762 return false
20763 }
20764 func rewriteValuegeneric_OpNeqInter(v *Value) bool {
20765 v_1 := v.Args[1]
20766 v_0 := v.Args[0]
20767 b := v.Block
20768 typ := &b.Func.Config.Types
20769
20770
20771 for {
20772 x := v_0
20773 y := v_1
20774 v.reset(OpNeqPtr)
20775 v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
20776 v0.AddArg(x)
20777 v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
20778 v1.AddArg(y)
20779 v.AddArg2(v0, v1)
20780 return true
20781 }
20782 }
20783 func rewriteValuegeneric_OpNeqPtr(v *Value) bool {
20784 v_1 := v.Args[1]
20785 v_0 := v.Args[0]
20786
20787
20788 for {
20789 x := v_0
20790 if x != v_1 {
20791 break
20792 }
20793 v.reset(OpConstBool)
20794 v.AuxInt = boolToAuxInt(false)
20795 return true
20796 }
20797
20798
20799 for {
20800 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20801 if v_0.Op != OpAddr {
20802 continue
20803 }
20804 x := auxToSym(v_0.Aux)
20805 if v_1.Op != OpAddr {
20806 continue
20807 }
20808 y := auxToSym(v_1.Aux)
20809 v.reset(OpConstBool)
20810 v.AuxInt = boolToAuxInt(x != y)
20811 return true
20812 }
20813 break
20814 }
20815
20816
20817 for {
20818 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20819 if v_0.Op != OpAddr {
20820 continue
20821 }
20822 x := auxToSym(v_0.Aux)
20823 if v_1.Op != OpOffPtr {
20824 continue
20825 }
20826 o := auxIntToInt64(v_1.AuxInt)
20827 v_1_0 := v_1.Args[0]
20828 if v_1_0.Op != OpAddr {
20829 continue
20830 }
20831 y := auxToSym(v_1_0.Aux)
20832 v.reset(OpConstBool)
20833 v.AuxInt = boolToAuxInt(x != y || o != 0)
20834 return true
20835 }
20836 break
20837 }
20838
20839
20840 for {
20841 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20842 if v_0.Op != OpOffPtr {
20843 continue
20844 }
20845 o1 := auxIntToInt64(v_0.AuxInt)
20846 v_0_0 := v_0.Args[0]
20847 if v_0_0.Op != OpAddr {
20848 continue
20849 }
20850 x := auxToSym(v_0_0.Aux)
20851 if v_1.Op != OpOffPtr {
20852 continue
20853 }
20854 o2 := auxIntToInt64(v_1.AuxInt)
20855 v_1_0 := v_1.Args[0]
20856 if v_1_0.Op != OpAddr {
20857 continue
20858 }
20859 y := auxToSym(v_1_0.Aux)
20860 v.reset(OpConstBool)
20861 v.AuxInt = boolToAuxInt(x != y || o1 != o2)
20862 return true
20863 }
20864 break
20865 }
20866
20867
20868 for {
20869 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20870 if v_0.Op != OpLocalAddr {
20871 continue
20872 }
20873 x := auxToSym(v_0.Aux)
20874 if v_1.Op != OpLocalAddr {
20875 continue
20876 }
20877 y := auxToSym(v_1.Aux)
20878 v.reset(OpConstBool)
20879 v.AuxInt = boolToAuxInt(x != y)
20880 return true
20881 }
20882 break
20883 }
20884
20885
20886 for {
20887 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20888 if v_0.Op != OpLocalAddr {
20889 continue
20890 }
20891 x := auxToSym(v_0.Aux)
20892 if v_1.Op != OpOffPtr {
20893 continue
20894 }
20895 o := auxIntToInt64(v_1.AuxInt)
20896 v_1_0 := v_1.Args[0]
20897 if v_1_0.Op != OpLocalAddr {
20898 continue
20899 }
20900 y := auxToSym(v_1_0.Aux)
20901 v.reset(OpConstBool)
20902 v.AuxInt = boolToAuxInt(x != y || o != 0)
20903 return true
20904 }
20905 break
20906 }
20907
20908
20909 for {
20910 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20911 if v_0.Op != OpOffPtr {
20912 continue
20913 }
20914 o1 := auxIntToInt64(v_0.AuxInt)
20915 v_0_0 := v_0.Args[0]
20916 if v_0_0.Op != OpLocalAddr {
20917 continue
20918 }
20919 x := auxToSym(v_0_0.Aux)
20920 if v_1.Op != OpOffPtr {
20921 continue
20922 }
20923 o2 := auxIntToInt64(v_1.AuxInt)
20924 v_1_0 := v_1.Args[0]
20925 if v_1_0.Op != OpLocalAddr {
20926 continue
20927 }
20928 y := auxToSym(v_1_0.Aux)
20929 v.reset(OpConstBool)
20930 v.AuxInt = boolToAuxInt(x != y || o1 != o2)
20931 return true
20932 }
20933 break
20934 }
20935
20936
20937
20938 for {
20939 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20940 if v_0.Op != OpOffPtr {
20941 continue
20942 }
20943 o1 := auxIntToInt64(v_0.AuxInt)
20944 p1 := v_0.Args[0]
20945 p2 := v_1
20946 if !(isSamePtr(p1, p2)) {
20947 continue
20948 }
20949 v.reset(OpConstBool)
20950 v.AuxInt = boolToAuxInt(o1 != 0)
20951 return true
20952 }
20953 break
20954 }
20955
20956
20957
20958 for {
20959 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20960 if v_0.Op != OpOffPtr {
20961 continue
20962 }
20963 o1 := auxIntToInt64(v_0.AuxInt)
20964 p1 := v_0.Args[0]
20965 if v_1.Op != OpOffPtr {
20966 continue
20967 }
20968 o2 := auxIntToInt64(v_1.AuxInt)
20969 p2 := v_1.Args[0]
20970 if !(isSamePtr(p1, p2)) {
20971 continue
20972 }
20973 v.reset(OpConstBool)
20974 v.AuxInt = boolToAuxInt(o1 != o2)
20975 return true
20976 }
20977 break
20978 }
20979
20980
20981 for {
20982 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20983 if v_0.Op != OpConst32 {
20984 continue
20985 }
20986 c := auxIntToInt32(v_0.AuxInt)
20987 if v_1.Op != OpConst32 {
20988 continue
20989 }
20990 d := auxIntToInt32(v_1.AuxInt)
20991 v.reset(OpConstBool)
20992 v.AuxInt = boolToAuxInt(c != d)
20993 return true
20994 }
20995 break
20996 }
20997
20998
20999 for {
21000 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21001 if v_0.Op != OpConst64 {
21002 continue
21003 }
21004 c := auxIntToInt64(v_0.AuxInt)
21005 if v_1.Op != OpConst64 {
21006 continue
21007 }
21008 d := auxIntToInt64(v_1.AuxInt)
21009 v.reset(OpConstBool)
21010 v.AuxInt = boolToAuxInt(c != d)
21011 return true
21012 }
21013 break
21014 }
21015
21016
21017 for {
21018 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21019 if v_0.Op != OpConvert {
21020 continue
21021 }
21022 v_0_0 := v_0.Args[0]
21023 if v_0_0.Op != OpAddr {
21024 continue
21025 }
21026 x := auxToSym(v_0_0.Aux)
21027 if v_1.Op != OpAddr {
21028 continue
21029 }
21030 y := auxToSym(v_1.Aux)
21031 v.reset(OpConstBool)
21032 v.AuxInt = boolToAuxInt(x != y)
21033 return true
21034 }
21035 break
21036 }
21037
21038
21039 for {
21040 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21041 if v_0.Op != OpLocalAddr || v_1.Op != OpAddr {
21042 continue
21043 }
21044 v.reset(OpConstBool)
21045 v.AuxInt = boolToAuxInt(true)
21046 return true
21047 }
21048 break
21049 }
21050
21051
21052 for {
21053 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21054 if v_0.Op != OpOffPtr {
21055 continue
21056 }
21057 v_0_0 := v_0.Args[0]
21058 if v_0_0.Op != OpLocalAddr || v_1.Op != OpAddr {
21059 continue
21060 }
21061 v.reset(OpConstBool)
21062 v.AuxInt = boolToAuxInt(true)
21063 return true
21064 }
21065 break
21066 }
21067
21068
21069 for {
21070 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21071 if v_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
21072 continue
21073 }
21074 v_1_0 := v_1.Args[0]
21075 if v_1_0.Op != OpAddr {
21076 continue
21077 }
21078 v.reset(OpConstBool)
21079 v.AuxInt = boolToAuxInt(true)
21080 return true
21081 }
21082 break
21083 }
21084
21085
21086 for {
21087 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21088 if v_0.Op != OpOffPtr {
21089 continue
21090 }
21091 v_0_0 := v_0.Args[0]
21092 if v_0_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
21093 continue
21094 }
21095 v_1_0 := v_1.Args[0]
21096 if v_1_0.Op != OpAddr {
21097 continue
21098 }
21099 v.reset(OpConstBool)
21100 v.AuxInt = boolToAuxInt(true)
21101 return true
21102 }
21103 break
21104 }
21105
21106
21107
21108 for {
21109 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21110 if v_0.Op != OpAddPtr {
21111 continue
21112 }
21113 o1 := v_0.Args[1]
21114 p1 := v_0.Args[0]
21115 p2 := v_1
21116 if !(isSamePtr(p1, p2)) {
21117 continue
21118 }
21119 v.reset(OpIsNonNil)
21120 v.AddArg(o1)
21121 return true
21122 }
21123 break
21124 }
21125
21126
21127 for {
21128 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21129 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
21130 continue
21131 }
21132 p := v_1
21133 v.reset(OpIsNonNil)
21134 v.AddArg(p)
21135 return true
21136 }
21137 break
21138 }
21139
21140
21141 for {
21142 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21143 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
21144 continue
21145 }
21146 p := v_1
21147 v.reset(OpIsNonNil)
21148 v.AddArg(p)
21149 return true
21150 }
21151 break
21152 }
21153
21154
21155 for {
21156 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21157 if v_0.Op != OpConstNil {
21158 continue
21159 }
21160 p := v_1
21161 v.reset(OpIsNonNil)
21162 v.AddArg(p)
21163 return true
21164 }
21165 break
21166 }
21167 return false
21168 }
21169 func rewriteValuegeneric_OpNeqSlice(v *Value) bool {
21170 v_1 := v.Args[1]
21171 v_0 := v.Args[0]
21172 b := v.Block
21173 typ := &b.Func.Config.Types
21174
21175
21176 for {
21177 x := v_0
21178 y := v_1
21179 v.reset(OpNeqPtr)
21180 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
21181 v0.AddArg(x)
21182 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
21183 v1.AddArg(y)
21184 v.AddArg2(v0, v1)
21185 return true
21186 }
21187 }
21188 func rewriteValuegeneric_OpNilCheck(v *Value) bool {
21189 v_1 := v.Args[1]
21190 v_0 := v.Args[0]
21191 b := v.Block
21192 fe := b.Func.fe
21193
21194
21195 for {
21196 ptr := v_0
21197 if ptr.Op != OpGetG {
21198 break
21199 }
21200 mem := ptr.Args[0]
21201 if mem != v_1 {
21202 break
21203 }
21204 v.copyOf(ptr)
21205 return true
21206 }
21207
21208
21209
21210 for {
21211 ptr := v_0
21212 if ptr.Op != OpSelectN || auxIntToInt64(ptr.AuxInt) != 0 {
21213 break
21214 }
21215 call := ptr.Args[0]
21216 if call.Op != OpStaticLECall {
21217 break
21218 }
21219 if !(isMalloc(call.Aux) && warnRule(fe.Debug_checknil(), v, "removed nil check")) {
21220 break
21221 }
21222 v.copyOf(ptr)
21223 return true
21224 }
21225
21226
21227
21228 for {
21229 ptr := v_0
21230 if ptr.Op != OpOffPtr {
21231 break
21232 }
21233 ptr_0 := ptr.Args[0]
21234 if ptr_0.Op != OpSelectN || auxIntToInt64(ptr_0.AuxInt) != 0 {
21235 break
21236 }
21237 call := ptr_0.Args[0]
21238 if call.Op != OpStaticLECall {
21239 break
21240 }
21241 if !(isMalloc(call.Aux) && warnRule(fe.Debug_checknil(), v, "removed nil check")) {
21242 break
21243 }
21244 v.copyOf(ptr)
21245 return true
21246 }
21247
21248
21249 for {
21250 ptr := v_0
21251 if ptr.Op != OpAddr {
21252 break
21253 }
21254 ptr_0 := ptr.Args[0]
21255 if ptr_0.Op != OpSB {
21256 break
21257 }
21258 v.copyOf(ptr)
21259 return true
21260 }
21261
21262
21263 for {
21264 ptr := v_0
21265 if ptr.Op != OpConvert {
21266 break
21267 }
21268 ptr_0 := ptr.Args[0]
21269 if ptr_0.Op != OpAddr {
21270 break
21271 }
21272 ptr_0_0 := ptr_0.Args[0]
21273 if ptr_0_0.Op != OpSB {
21274 break
21275 }
21276 v.copyOf(ptr)
21277 return true
21278 }
21279
21280
21281
21282 for {
21283 ptr := v_0
21284 if ptr.Op != OpLocalAddr || !(warnRule(fe.Debug_checknil(), v, "removed nil check")) {
21285 break
21286 }
21287 v.copyOf(ptr)
21288 return true
21289 }
21290
21291
21292
21293 for {
21294 ptr := v_0
21295 if ptr.Op != OpArg {
21296 break
21297 }
21298 sym := auxToSym(ptr.Aux)
21299 if !(isDictArgSym(sym)) {
21300 break
21301 }
21302 v.copyOf(ptr)
21303 return true
21304 }
21305
21306
21307 for {
21308 ptr := v_0
21309 if ptr.Op != OpNilCheck {
21310 break
21311 }
21312 v.copyOf(ptr)
21313 return true
21314 }
21315 return false
21316 }
21317 func rewriteValuegeneric_OpNot(v *Value) bool {
21318 v_0 := v.Args[0]
21319
21320
21321 for {
21322 if v_0.Op != OpConstBool {
21323 break
21324 }
21325 c := auxIntToBool(v_0.AuxInt)
21326 v.reset(OpConstBool)
21327 v.AuxInt = boolToAuxInt(!c)
21328 return true
21329 }
21330
21331
21332 for {
21333 if v_0.Op != OpEq64 {
21334 break
21335 }
21336 y := v_0.Args[1]
21337 x := v_0.Args[0]
21338 v.reset(OpNeq64)
21339 v.AddArg2(x, y)
21340 return true
21341 }
21342
21343
21344 for {
21345 if v_0.Op != OpEq32 {
21346 break
21347 }
21348 y := v_0.Args[1]
21349 x := v_0.Args[0]
21350 v.reset(OpNeq32)
21351 v.AddArg2(x, y)
21352 return true
21353 }
21354
21355
21356 for {
21357 if v_0.Op != OpEq16 {
21358 break
21359 }
21360 y := v_0.Args[1]
21361 x := v_0.Args[0]
21362 v.reset(OpNeq16)
21363 v.AddArg2(x, y)
21364 return true
21365 }
21366
21367
21368 for {
21369 if v_0.Op != OpEq8 {
21370 break
21371 }
21372 y := v_0.Args[1]
21373 x := v_0.Args[0]
21374 v.reset(OpNeq8)
21375 v.AddArg2(x, y)
21376 return true
21377 }
21378
21379
21380 for {
21381 if v_0.Op != OpEqB {
21382 break
21383 }
21384 y := v_0.Args[1]
21385 x := v_0.Args[0]
21386 v.reset(OpNeqB)
21387 v.AddArg2(x, y)
21388 return true
21389 }
21390
21391
21392 for {
21393 if v_0.Op != OpEqPtr {
21394 break
21395 }
21396 y := v_0.Args[1]
21397 x := v_0.Args[0]
21398 v.reset(OpNeqPtr)
21399 v.AddArg2(x, y)
21400 return true
21401 }
21402
21403
21404 for {
21405 if v_0.Op != OpEq64F {
21406 break
21407 }
21408 y := v_0.Args[1]
21409 x := v_0.Args[0]
21410 v.reset(OpNeq64F)
21411 v.AddArg2(x, y)
21412 return true
21413 }
21414
21415
21416 for {
21417 if v_0.Op != OpEq32F {
21418 break
21419 }
21420 y := v_0.Args[1]
21421 x := v_0.Args[0]
21422 v.reset(OpNeq32F)
21423 v.AddArg2(x, y)
21424 return true
21425 }
21426
21427
21428 for {
21429 if v_0.Op != OpNeq64 {
21430 break
21431 }
21432 y := v_0.Args[1]
21433 x := v_0.Args[0]
21434 v.reset(OpEq64)
21435 v.AddArg2(x, y)
21436 return true
21437 }
21438
21439
21440 for {
21441 if v_0.Op != OpNeq32 {
21442 break
21443 }
21444 y := v_0.Args[1]
21445 x := v_0.Args[0]
21446 v.reset(OpEq32)
21447 v.AddArg2(x, y)
21448 return true
21449 }
21450
21451
21452 for {
21453 if v_0.Op != OpNeq16 {
21454 break
21455 }
21456 y := v_0.Args[1]
21457 x := v_0.Args[0]
21458 v.reset(OpEq16)
21459 v.AddArg2(x, y)
21460 return true
21461 }
21462
21463
21464 for {
21465 if v_0.Op != OpNeq8 {
21466 break
21467 }
21468 y := v_0.Args[1]
21469 x := v_0.Args[0]
21470 v.reset(OpEq8)
21471 v.AddArg2(x, y)
21472 return true
21473 }
21474
21475
21476 for {
21477 if v_0.Op != OpNeqB {
21478 break
21479 }
21480 y := v_0.Args[1]
21481 x := v_0.Args[0]
21482 v.reset(OpEqB)
21483 v.AddArg2(x, y)
21484 return true
21485 }
21486
21487
21488 for {
21489 if v_0.Op != OpNeqPtr {
21490 break
21491 }
21492 y := v_0.Args[1]
21493 x := v_0.Args[0]
21494 v.reset(OpEqPtr)
21495 v.AddArg2(x, y)
21496 return true
21497 }
21498
21499
21500 for {
21501 if v_0.Op != OpNeq64F {
21502 break
21503 }
21504 y := v_0.Args[1]
21505 x := v_0.Args[0]
21506 v.reset(OpEq64F)
21507 v.AddArg2(x, y)
21508 return true
21509 }
21510
21511
21512 for {
21513 if v_0.Op != OpNeq32F {
21514 break
21515 }
21516 y := v_0.Args[1]
21517 x := v_0.Args[0]
21518 v.reset(OpEq32F)
21519 v.AddArg2(x, y)
21520 return true
21521 }
21522
21523
21524 for {
21525 if v_0.Op != OpLess64 {
21526 break
21527 }
21528 y := v_0.Args[1]
21529 x := v_0.Args[0]
21530 v.reset(OpLeq64)
21531 v.AddArg2(y, x)
21532 return true
21533 }
21534
21535
21536 for {
21537 if v_0.Op != OpLess32 {
21538 break
21539 }
21540 y := v_0.Args[1]
21541 x := v_0.Args[0]
21542 v.reset(OpLeq32)
21543 v.AddArg2(y, x)
21544 return true
21545 }
21546
21547
21548 for {
21549 if v_0.Op != OpLess16 {
21550 break
21551 }
21552 y := v_0.Args[1]
21553 x := v_0.Args[0]
21554 v.reset(OpLeq16)
21555 v.AddArg2(y, x)
21556 return true
21557 }
21558
21559
21560 for {
21561 if v_0.Op != OpLess8 {
21562 break
21563 }
21564 y := v_0.Args[1]
21565 x := v_0.Args[0]
21566 v.reset(OpLeq8)
21567 v.AddArg2(y, x)
21568 return true
21569 }
21570
21571
21572 for {
21573 if v_0.Op != OpLess64U {
21574 break
21575 }
21576 y := v_0.Args[1]
21577 x := v_0.Args[0]
21578 v.reset(OpLeq64U)
21579 v.AddArg2(y, x)
21580 return true
21581 }
21582
21583
21584 for {
21585 if v_0.Op != OpLess32U {
21586 break
21587 }
21588 y := v_0.Args[1]
21589 x := v_0.Args[0]
21590 v.reset(OpLeq32U)
21591 v.AddArg2(y, x)
21592 return true
21593 }
21594
21595
21596 for {
21597 if v_0.Op != OpLess16U {
21598 break
21599 }
21600 y := v_0.Args[1]
21601 x := v_0.Args[0]
21602 v.reset(OpLeq16U)
21603 v.AddArg2(y, x)
21604 return true
21605 }
21606
21607
21608 for {
21609 if v_0.Op != OpLess8U {
21610 break
21611 }
21612 y := v_0.Args[1]
21613 x := v_0.Args[0]
21614 v.reset(OpLeq8U)
21615 v.AddArg2(y, x)
21616 return true
21617 }
21618
21619
21620 for {
21621 if v_0.Op != OpLeq64 {
21622 break
21623 }
21624 y := v_0.Args[1]
21625 x := v_0.Args[0]
21626 v.reset(OpLess64)
21627 v.AddArg2(y, x)
21628 return true
21629 }
21630
21631
21632 for {
21633 if v_0.Op != OpLeq32 {
21634 break
21635 }
21636 y := v_0.Args[1]
21637 x := v_0.Args[0]
21638 v.reset(OpLess32)
21639 v.AddArg2(y, x)
21640 return true
21641 }
21642
21643
21644 for {
21645 if v_0.Op != OpLeq16 {
21646 break
21647 }
21648 y := v_0.Args[1]
21649 x := v_0.Args[0]
21650 v.reset(OpLess16)
21651 v.AddArg2(y, x)
21652 return true
21653 }
21654
21655
21656 for {
21657 if v_0.Op != OpLeq8 {
21658 break
21659 }
21660 y := v_0.Args[1]
21661 x := v_0.Args[0]
21662 v.reset(OpLess8)
21663 v.AddArg2(y, x)
21664 return true
21665 }
21666
21667
21668 for {
21669 if v_0.Op != OpLeq64U {
21670 break
21671 }
21672 y := v_0.Args[1]
21673 x := v_0.Args[0]
21674 v.reset(OpLess64U)
21675 v.AddArg2(y, x)
21676 return true
21677 }
21678
21679
21680 for {
21681 if v_0.Op != OpLeq32U {
21682 break
21683 }
21684 y := v_0.Args[1]
21685 x := v_0.Args[0]
21686 v.reset(OpLess32U)
21687 v.AddArg2(y, x)
21688 return true
21689 }
21690
21691
21692 for {
21693 if v_0.Op != OpLeq16U {
21694 break
21695 }
21696 y := v_0.Args[1]
21697 x := v_0.Args[0]
21698 v.reset(OpLess16U)
21699 v.AddArg2(y, x)
21700 return true
21701 }
21702
21703
21704 for {
21705 if v_0.Op != OpLeq8U {
21706 break
21707 }
21708 y := v_0.Args[1]
21709 x := v_0.Args[0]
21710 v.reset(OpLess8U)
21711 v.AddArg2(y, x)
21712 return true
21713 }
21714 return false
21715 }
21716 func rewriteValuegeneric_OpOffPtr(v *Value) bool {
21717 v_0 := v.Args[0]
21718
21719
21720 for {
21721 x := auxIntToInt64(v.AuxInt)
21722 if v_0.Op != OpOffPtr {
21723 break
21724 }
21725 y := auxIntToInt64(v_0.AuxInt)
21726 p := v_0.Args[0]
21727 v.reset(OpOffPtr)
21728 v.AuxInt = int64ToAuxInt(x + y)
21729 v.AddArg(p)
21730 return true
21731 }
21732
21733
21734
21735 for {
21736 if auxIntToInt64(v.AuxInt) != 0 {
21737 break
21738 }
21739 p := v_0
21740 if !(v.Type.Compare(p.Type) == types.CMPeq) {
21741 break
21742 }
21743 v.copyOf(p)
21744 return true
21745 }
21746 return false
21747 }
21748 func rewriteValuegeneric_OpOr16(v *Value) bool {
21749 v_1 := v.Args[1]
21750 v_0 := v.Args[0]
21751 b := v.Block
21752 config := b.Func.Config
21753
21754
21755 for {
21756 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21757 if v_0.Op != OpConst16 {
21758 continue
21759 }
21760 c := auxIntToInt16(v_0.AuxInt)
21761 if v_1.Op != OpConst16 {
21762 continue
21763 }
21764 d := auxIntToInt16(v_1.AuxInt)
21765 v.reset(OpConst16)
21766 v.AuxInt = int16ToAuxInt(c | d)
21767 return true
21768 }
21769 break
21770 }
21771
21772
21773 for {
21774 t := v.Type
21775 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21776 if v_0.Op != OpCom16 {
21777 continue
21778 }
21779 x := v_0.Args[0]
21780 if v_1.Op != OpCom16 {
21781 continue
21782 }
21783 y := v_1.Args[0]
21784 v.reset(OpCom16)
21785 v0 := b.NewValue0(v.Pos, OpAnd16, t)
21786 v0.AddArg2(x, y)
21787 v.AddArg(v0)
21788 return true
21789 }
21790 break
21791 }
21792
21793
21794 for {
21795 x := v_0
21796 if x != v_1 {
21797 break
21798 }
21799 v.copyOf(x)
21800 return true
21801 }
21802
21803
21804 for {
21805 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21806 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
21807 continue
21808 }
21809 x := v_1
21810 v.copyOf(x)
21811 return true
21812 }
21813 break
21814 }
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 || auxIntToInt16(v_0.AuxInt) != -1 {
21820 continue
21821 }
21822 v.reset(OpConst16)
21823 v.AuxInt = int16ToAuxInt(-1)
21824 return true
21825 }
21826 break
21827 }
21828
21829
21830 for {
21831 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21832 if v_0.Op != OpCom16 {
21833 continue
21834 }
21835 x := v_0.Args[0]
21836 if x != v_1 {
21837 continue
21838 }
21839 v.reset(OpConst16)
21840 v.AuxInt = int16ToAuxInt(-1)
21841 return true
21842 }
21843 break
21844 }
21845
21846
21847 for {
21848 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21849 x := v_0
21850 if v_1.Op != OpOr16 {
21851 continue
21852 }
21853 _ = v_1.Args[1]
21854 v_1_0 := v_1.Args[0]
21855 v_1_1 := v_1.Args[1]
21856 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21857 if x != v_1_0 {
21858 continue
21859 }
21860 y := v_1_1
21861 v.reset(OpOr16)
21862 v.AddArg2(x, y)
21863 return true
21864 }
21865 }
21866 break
21867 }
21868
21869
21870
21871 for {
21872 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21873 if v_0.Op != OpAnd16 {
21874 continue
21875 }
21876 _ = v_0.Args[1]
21877 v_0_0 := v_0.Args[0]
21878 v_0_1 := v_0.Args[1]
21879 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21880 x := v_0_0
21881 if v_0_1.Op != OpConst16 {
21882 continue
21883 }
21884 c2 := auxIntToInt16(v_0_1.AuxInt)
21885 if v_1.Op != OpConst16 {
21886 continue
21887 }
21888 t := v_1.Type
21889 c1 := auxIntToInt16(v_1.AuxInt)
21890 if !(^(c1 | c2) == 0) {
21891 continue
21892 }
21893 v.reset(OpOr16)
21894 v0 := b.NewValue0(v.Pos, OpConst16, t)
21895 v0.AuxInt = int16ToAuxInt(c1)
21896 v.AddArg2(v0, x)
21897 return true
21898 }
21899 }
21900 break
21901 }
21902
21903
21904
21905 for {
21906 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21907 if v_0.Op != OpOr16 {
21908 continue
21909 }
21910 _ = v_0.Args[1]
21911 v_0_0 := v_0.Args[0]
21912 v_0_1 := v_0.Args[1]
21913 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21914 i := v_0_0
21915 if i.Op != OpConst16 {
21916 continue
21917 }
21918 t := i.Type
21919 z := v_0_1
21920 x := v_1
21921 if !(z.Op != OpConst16 && x.Op != OpConst16) {
21922 continue
21923 }
21924 v.reset(OpOr16)
21925 v0 := b.NewValue0(v.Pos, OpOr16, t)
21926 v0.AddArg2(z, x)
21927 v.AddArg2(i, v0)
21928 return true
21929 }
21930 }
21931 break
21932 }
21933
21934
21935 for {
21936 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21937 if v_0.Op != OpConst16 {
21938 continue
21939 }
21940 t := v_0.Type
21941 c := auxIntToInt16(v_0.AuxInt)
21942 if v_1.Op != OpOr16 {
21943 continue
21944 }
21945 _ = v_1.Args[1]
21946 v_1_0 := v_1.Args[0]
21947 v_1_1 := v_1.Args[1]
21948 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21949 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
21950 continue
21951 }
21952 d := auxIntToInt16(v_1_0.AuxInt)
21953 x := v_1_1
21954 v.reset(OpOr16)
21955 v0 := b.NewValue0(v.Pos, OpConst16, t)
21956 v0.AuxInt = int16ToAuxInt(c | d)
21957 v.AddArg2(v0, x)
21958 return true
21959 }
21960 }
21961 break
21962 }
21963
21964
21965
21966 for {
21967 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21968 if v_0.Op != OpLsh16x64 {
21969 continue
21970 }
21971 _ = v_0.Args[1]
21972 x := v_0.Args[0]
21973 z := v_0.Args[1]
21974 if z.Op != OpConst64 {
21975 continue
21976 }
21977 c := auxIntToInt64(z.AuxInt)
21978 if v_1.Op != OpRsh16Ux64 {
21979 continue
21980 }
21981 _ = v_1.Args[1]
21982 if x != v_1.Args[0] {
21983 continue
21984 }
21985 v_1_1 := v_1.Args[1]
21986 if v_1_1.Op != OpConst64 {
21987 continue
21988 }
21989 d := auxIntToInt64(v_1_1.AuxInt)
21990 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
21991 continue
21992 }
21993 v.reset(OpRotateLeft16)
21994 v.AddArg2(x, z)
21995 return true
21996 }
21997 break
21998 }
21999
22000
22001
22002 for {
22003 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22004 left := v_0
22005 if left.Op != OpLsh16x64 {
22006 continue
22007 }
22008 y := left.Args[1]
22009 x := left.Args[0]
22010 right := v_1
22011 if right.Op != OpRsh16Ux64 {
22012 continue
22013 }
22014 _ = right.Args[1]
22015 if x != right.Args[0] {
22016 continue
22017 }
22018 right_1 := right.Args[1]
22019 if right_1.Op != OpSub64 {
22020 continue
22021 }
22022 _ = right_1.Args[1]
22023 right_1_0 := right_1.Args[0]
22024 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
22025 continue
22026 }
22027 v.reset(OpRotateLeft16)
22028 v.AddArg2(x, y)
22029 return true
22030 }
22031 break
22032 }
22033
22034
22035
22036 for {
22037 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22038 left := v_0
22039 if left.Op != OpLsh16x32 {
22040 continue
22041 }
22042 y := left.Args[1]
22043 x := left.Args[0]
22044 right := v_1
22045 if right.Op != OpRsh16Ux32 {
22046 continue
22047 }
22048 _ = right.Args[1]
22049 if x != right.Args[0] {
22050 continue
22051 }
22052 right_1 := right.Args[1]
22053 if right_1.Op != OpSub32 {
22054 continue
22055 }
22056 _ = right_1.Args[1]
22057 right_1_0 := right_1.Args[0]
22058 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
22059 continue
22060 }
22061 v.reset(OpRotateLeft16)
22062 v.AddArg2(x, y)
22063 return true
22064 }
22065 break
22066 }
22067
22068
22069
22070 for {
22071 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22072 left := v_0
22073 if left.Op != OpLsh16x16 {
22074 continue
22075 }
22076 y := left.Args[1]
22077 x := left.Args[0]
22078 right := v_1
22079 if right.Op != OpRsh16Ux16 {
22080 continue
22081 }
22082 _ = right.Args[1]
22083 if x != right.Args[0] {
22084 continue
22085 }
22086 right_1 := right.Args[1]
22087 if right_1.Op != OpSub16 {
22088 continue
22089 }
22090 _ = right_1.Args[1]
22091 right_1_0 := right_1.Args[0]
22092 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
22093 continue
22094 }
22095 v.reset(OpRotateLeft16)
22096 v.AddArg2(x, y)
22097 return true
22098 }
22099 break
22100 }
22101
22102
22103
22104 for {
22105 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22106 left := v_0
22107 if left.Op != OpLsh16x8 {
22108 continue
22109 }
22110 y := left.Args[1]
22111 x := left.Args[0]
22112 right := v_1
22113 if right.Op != OpRsh16Ux8 {
22114 continue
22115 }
22116 _ = right.Args[1]
22117 if x != right.Args[0] {
22118 continue
22119 }
22120 right_1 := right.Args[1]
22121 if right_1.Op != OpSub8 {
22122 continue
22123 }
22124 _ = right_1.Args[1]
22125 right_1_0 := right_1.Args[0]
22126 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
22127 continue
22128 }
22129 v.reset(OpRotateLeft16)
22130 v.AddArg2(x, y)
22131 return true
22132 }
22133 break
22134 }
22135
22136
22137
22138 for {
22139 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22140 right := v_0
22141 if right.Op != OpRsh16Ux64 {
22142 continue
22143 }
22144 y := right.Args[1]
22145 x := right.Args[0]
22146 left := v_1
22147 if left.Op != OpLsh16x64 {
22148 continue
22149 }
22150 _ = left.Args[1]
22151 if x != left.Args[0] {
22152 continue
22153 }
22154 z := left.Args[1]
22155 if z.Op != OpSub64 {
22156 continue
22157 }
22158 _ = z.Args[1]
22159 z_0 := z.Args[0]
22160 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
22161 continue
22162 }
22163 v.reset(OpRotateLeft16)
22164 v.AddArg2(x, z)
22165 return true
22166 }
22167 break
22168 }
22169
22170
22171
22172 for {
22173 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22174 right := v_0
22175 if right.Op != OpRsh16Ux32 {
22176 continue
22177 }
22178 y := right.Args[1]
22179 x := right.Args[0]
22180 left := v_1
22181 if left.Op != OpLsh16x32 {
22182 continue
22183 }
22184 _ = left.Args[1]
22185 if x != left.Args[0] {
22186 continue
22187 }
22188 z := left.Args[1]
22189 if z.Op != OpSub32 {
22190 continue
22191 }
22192 _ = z.Args[1]
22193 z_0 := z.Args[0]
22194 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
22195 continue
22196 }
22197 v.reset(OpRotateLeft16)
22198 v.AddArg2(x, z)
22199 return true
22200 }
22201 break
22202 }
22203
22204
22205
22206 for {
22207 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22208 right := v_0
22209 if right.Op != OpRsh16Ux16 {
22210 continue
22211 }
22212 y := right.Args[1]
22213 x := right.Args[0]
22214 left := v_1
22215 if left.Op != OpLsh16x16 {
22216 continue
22217 }
22218 _ = left.Args[1]
22219 if x != left.Args[0] {
22220 continue
22221 }
22222 z := left.Args[1]
22223 if z.Op != OpSub16 {
22224 continue
22225 }
22226 _ = z.Args[1]
22227 z_0 := z.Args[0]
22228 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
22229 continue
22230 }
22231 v.reset(OpRotateLeft16)
22232 v.AddArg2(x, z)
22233 return true
22234 }
22235 break
22236 }
22237
22238
22239
22240 for {
22241 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22242 right := v_0
22243 if right.Op != OpRsh16Ux8 {
22244 continue
22245 }
22246 y := right.Args[1]
22247 x := right.Args[0]
22248 left := v_1
22249 if left.Op != OpLsh16x8 {
22250 continue
22251 }
22252 _ = left.Args[1]
22253 if x != left.Args[0] {
22254 continue
22255 }
22256 z := left.Args[1]
22257 if z.Op != OpSub8 {
22258 continue
22259 }
22260 _ = z.Args[1]
22261 z_0 := z.Args[0]
22262 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
22263 continue
22264 }
22265 v.reset(OpRotateLeft16)
22266 v.AddArg2(x, z)
22267 return true
22268 }
22269 break
22270 }
22271 return false
22272 }
22273 func rewriteValuegeneric_OpOr32(v *Value) bool {
22274 v_1 := v.Args[1]
22275 v_0 := v.Args[0]
22276 b := v.Block
22277 config := b.Func.Config
22278
22279
22280 for {
22281 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22282 if v_0.Op != OpConst32 {
22283 continue
22284 }
22285 c := auxIntToInt32(v_0.AuxInt)
22286 if v_1.Op != OpConst32 {
22287 continue
22288 }
22289 d := auxIntToInt32(v_1.AuxInt)
22290 v.reset(OpConst32)
22291 v.AuxInt = int32ToAuxInt(c | d)
22292 return true
22293 }
22294 break
22295 }
22296
22297
22298 for {
22299 t := v.Type
22300 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22301 if v_0.Op != OpCom32 {
22302 continue
22303 }
22304 x := v_0.Args[0]
22305 if v_1.Op != OpCom32 {
22306 continue
22307 }
22308 y := v_1.Args[0]
22309 v.reset(OpCom32)
22310 v0 := b.NewValue0(v.Pos, OpAnd32, t)
22311 v0.AddArg2(x, y)
22312 v.AddArg(v0)
22313 return true
22314 }
22315 break
22316 }
22317
22318
22319 for {
22320 x := v_0
22321 if x != v_1 {
22322 break
22323 }
22324 v.copyOf(x)
22325 return true
22326 }
22327
22328
22329 for {
22330 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22331 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
22332 continue
22333 }
22334 x := v_1
22335 v.copyOf(x)
22336 return true
22337 }
22338 break
22339 }
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 || auxIntToInt32(v_0.AuxInt) != -1 {
22345 continue
22346 }
22347 v.reset(OpConst32)
22348 v.AuxInt = int32ToAuxInt(-1)
22349 return true
22350 }
22351 break
22352 }
22353
22354
22355 for {
22356 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22357 if v_0.Op != OpCom32 {
22358 continue
22359 }
22360 x := v_0.Args[0]
22361 if x != v_1 {
22362 continue
22363 }
22364 v.reset(OpConst32)
22365 v.AuxInt = int32ToAuxInt(-1)
22366 return true
22367 }
22368 break
22369 }
22370
22371
22372 for {
22373 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22374 x := v_0
22375 if v_1.Op != OpOr32 {
22376 continue
22377 }
22378 _ = v_1.Args[1]
22379 v_1_0 := v_1.Args[0]
22380 v_1_1 := v_1.Args[1]
22381 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22382 if x != v_1_0 {
22383 continue
22384 }
22385 y := v_1_1
22386 v.reset(OpOr32)
22387 v.AddArg2(x, y)
22388 return true
22389 }
22390 }
22391 break
22392 }
22393
22394
22395
22396 for {
22397 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22398 if v_0.Op != OpAnd32 {
22399 continue
22400 }
22401 _ = v_0.Args[1]
22402 v_0_0 := v_0.Args[0]
22403 v_0_1 := v_0.Args[1]
22404 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22405 x := v_0_0
22406 if v_0_1.Op != OpConst32 {
22407 continue
22408 }
22409 c2 := auxIntToInt32(v_0_1.AuxInt)
22410 if v_1.Op != OpConst32 {
22411 continue
22412 }
22413 t := v_1.Type
22414 c1 := auxIntToInt32(v_1.AuxInt)
22415 if !(^(c1 | c2) == 0) {
22416 continue
22417 }
22418 v.reset(OpOr32)
22419 v0 := b.NewValue0(v.Pos, OpConst32, t)
22420 v0.AuxInt = int32ToAuxInt(c1)
22421 v.AddArg2(v0, x)
22422 return true
22423 }
22424 }
22425 break
22426 }
22427
22428
22429
22430 for {
22431 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22432 if v_0.Op != OpOr32 {
22433 continue
22434 }
22435 _ = v_0.Args[1]
22436 v_0_0 := v_0.Args[0]
22437 v_0_1 := v_0.Args[1]
22438 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22439 i := v_0_0
22440 if i.Op != OpConst32 {
22441 continue
22442 }
22443 t := i.Type
22444 z := v_0_1
22445 x := v_1
22446 if !(z.Op != OpConst32 && x.Op != OpConst32) {
22447 continue
22448 }
22449 v.reset(OpOr32)
22450 v0 := b.NewValue0(v.Pos, OpOr32, t)
22451 v0.AddArg2(z, x)
22452 v.AddArg2(i, v0)
22453 return true
22454 }
22455 }
22456 break
22457 }
22458
22459
22460 for {
22461 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22462 if v_0.Op != OpConst32 {
22463 continue
22464 }
22465 t := v_0.Type
22466 c := auxIntToInt32(v_0.AuxInt)
22467 if v_1.Op != OpOr32 {
22468 continue
22469 }
22470 _ = v_1.Args[1]
22471 v_1_0 := v_1.Args[0]
22472 v_1_1 := v_1.Args[1]
22473 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22474 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
22475 continue
22476 }
22477 d := auxIntToInt32(v_1_0.AuxInt)
22478 x := v_1_1
22479 v.reset(OpOr32)
22480 v0 := b.NewValue0(v.Pos, OpConst32, t)
22481 v0.AuxInt = int32ToAuxInt(c | d)
22482 v.AddArg2(v0, x)
22483 return true
22484 }
22485 }
22486 break
22487 }
22488
22489
22490
22491 for {
22492 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22493 if v_0.Op != OpLsh32x64 {
22494 continue
22495 }
22496 _ = v_0.Args[1]
22497 x := v_0.Args[0]
22498 z := v_0.Args[1]
22499 if z.Op != OpConst64 {
22500 continue
22501 }
22502 c := auxIntToInt64(z.AuxInt)
22503 if v_1.Op != OpRsh32Ux64 {
22504 continue
22505 }
22506 _ = v_1.Args[1]
22507 if x != v_1.Args[0] {
22508 continue
22509 }
22510 v_1_1 := v_1.Args[1]
22511 if v_1_1.Op != OpConst64 {
22512 continue
22513 }
22514 d := auxIntToInt64(v_1_1.AuxInt)
22515 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
22516 continue
22517 }
22518 v.reset(OpRotateLeft32)
22519 v.AddArg2(x, z)
22520 return true
22521 }
22522 break
22523 }
22524
22525
22526
22527 for {
22528 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22529 left := v_0
22530 if left.Op != OpLsh32x64 {
22531 continue
22532 }
22533 y := left.Args[1]
22534 x := left.Args[0]
22535 right := v_1
22536 if right.Op != OpRsh32Ux64 {
22537 continue
22538 }
22539 _ = right.Args[1]
22540 if x != right.Args[0] {
22541 continue
22542 }
22543 right_1 := right.Args[1]
22544 if right_1.Op != OpSub64 {
22545 continue
22546 }
22547 _ = right_1.Args[1]
22548 right_1_0 := right_1.Args[0]
22549 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22550 continue
22551 }
22552 v.reset(OpRotateLeft32)
22553 v.AddArg2(x, y)
22554 return true
22555 }
22556 break
22557 }
22558
22559
22560
22561 for {
22562 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22563 left := v_0
22564 if left.Op != OpLsh32x32 {
22565 continue
22566 }
22567 y := left.Args[1]
22568 x := left.Args[0]
22569 right := v_1
22570 if right.Op != OpRsh32Ux32 {
22571 continue
22572 }
22573 _ = right.Args[1]
22574 if x != right.Args[0] {
22575 continue
22576 }
22577 right_1 := right.Args[1]
22578 if right_1.Op != OpSub32 {
22579 continue
22580 }
22581 _ = right_1.Args[1]
22582 right_1_0 := right_1.Args[0]
22583 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22584 continue
22585 }
22586 v.reset(OpRotateLeft32)
22587 v.AddArg2(x, y)
22588 return true
22589 }
22590 break
22591 }
22592
22593
22594
22595 for {
22596 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22597 left := v_0
22598 if left.Op != OpLsh32x16 {
22599 continue
22600 }
22601 y := left.Args[1]
22602 x := left.Args[0]
22603 right := v_1
22604 if right.Op != OpRsh32Ux16 {
22605 continue
22606 }
22607 _ = right.Args[1]
22608 if x != right.Args[0] {
22609 continue
22610 }
22611 right_1 := right.Args[1]
22612 if right_1.Op != OpSub16 {
22613 continue
22614 }
22615 _ = right_1.Args[1]
22616 right_1_0 := right_1.Args[0]
22617 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22618 continue
22619 }
22620 v.reset(OpRotateLeft32)
22621 v.AddArg2(x, y)
22622 return true
22623 }
22624 break
22625 }
22626
22627
22628
22629 for {
22630 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22631 left := v_0
22632 if left.Op != OpLsh32x8 {
22633 continue
22634 }
22635 y := left.Args[1]
22636 x := left.Args[0]
22637 right := v_1
22638 if right.Op != OpRsh32Ux8 {
22639 continue
22640 }
22641 _ = right.Args[1]
22642 if x != right.Args[0] {
22643 continue
22644 }
22645 right_1 := right.Args[1]
22646 if right_1.Op != OpSub8 {
22647 continue
22648 }
22649 _ = right_1.Args[1]
22650 right_1_0 := right_1.Args[0]
22651 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22652 continue
22653 }
22654 v.reset(OpRotateLeft32)
22655 v.AddArg2(x, y)
22656 return true
22657 }
22658 break
22659 }
22660
22661
22662
22663 for {
22664 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22665 right := v_0
22666 if right.Op != OpRsh32Ux64 {
22667 continue
22668 }
22669 y := right.Args[1]
22670 x := right.Args[0]
22671 left := v_1
22672 if left.Op != OpLsh32x64 {
22673 continue
22674 }
22675 _ = left.Args[1]
22676 if x != left.Args[0] {
22677 continue
22678 }
22679 z := left.Args[1]
22680 if z.Op != OpSub64 {
22681 continue
22682 }
22683 _ = z.Args[1]
22684 z_0 := z.Args[0]
22685 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22686 continue
22687 }
22688 v.reset(OpRotateLeft32)
22689 v.AddArg2(x, z)
22690 return true
22691 }
22692 break
22693 }
22694
22695
22696
22697 for {
22698 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22699 right := v_0
22700 if right.Op != OpRsh32Ux32 {
22701 continue
22702 }
22703 y := right.Args[1]
22704 x := right.Args[0]
22705 left := v_1
22706 if left.Op != OpLsh32x32 {
22707 continue
22708 }
22709 _ = left.Args[1]
22710 if x != left.Args[0] {
22711 continue
22712 }
22713 z := left.Args[1]
22714 if z.Op != OpSub32 {
22715 continue
22716 }
22717 _ = z.Args[1]
22718 z_0 := z.Args[0]
22719 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22720 continue
22721 }
22722 v.reset(OpRotateLeft32)
22723 v.AddArg2(x, z)
22724 return true
22725 }
22726 break
22727 }
22728
22729
22730
22731 for {
22732 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22733 right := v_0
22734 if right.Op != OpRsh32Ux16 {
22735 continue
22736 }
22737 y := right.Args[1]
22738 x := right.Args[0]
22739 left := v_1
22740 if left.Op != OpLsh32x16 {
22741 continue
22742 }
22743 _ = left.Args[1]
22744 if x != left.Args[0] {
22745 continue
22746 }
22747 z := left.Args[1]
22748 if z.Op != OpSub16 {
22749 continue
22750 }
22751 _ = z.Args[1]
22752 z_0 := z.Args[0]
22753 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22754 continue
22755 }
22756 v.reset(OpRotateLeft32)
22757 v.AddArg2(x, z)
22758 return true
22759 }
22760 break
22761 }
22762
22763
22764
22765 for {
22766 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22767 right := v_0
22768 if right.Op != OpRsh32Ux8 {
22769 continue
22770 }
22771 y := right.Args[1]
22772 x := right.Args[0]
22773 left := v_1
22774 if left.Op != OpLsh32x8 {
22775 continue
22776 }
22777 _ = left.Args[1]
22778 if x != left.Args[0] {
22779 continue
22780 }
22781 z := left.Args[1]
22782 if z.Op != OpSub8 {
22783 continue
22784 }
22785 _ = z.Args[1]
22786 z_0 := z.Args[0]
22787 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22788 continue
22789 }
22790 v.reset(OpRotateLeft32)
22791 v.AddArg2(x, z)
22792 return true
22793 }
22794 break
22795 }
22796 return false
22797 }
22798 func rewriteValuegeneric_OpOr64(v *Value) bool {
22799 v_1 := v.Args[1]
22800 v_0 := v.Args[0]
22801 b := v.Block
22802 config := b.Func.Config
22803
22804
22805 for {
22806 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22807 if v_0.Op != OpConst64 {
22808 continue
22809 }
22810 c := auxIntToInt64(v_0.AuxInt)
22811 if v_1.Op != OpConst64 {
22812 continue
22813 }
22814 d := auxIntToInt64(v_1.AuxInt)
22815 v.reset(OpConst64)
22816 v.AuxInt = int64ToAuxInt(c | d)
22817 return true
22818 }
22819 break
22820 }
22821
22822
22823 for {
22824 t := v.Type
22825 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22826 if v_0.Op != OpCom64 {
22827 continue
22828 }
22829 x := v_0.Args[0]
22830 if v_1.Op != OpCom64 {
22831 continue
22832 }
22833 y := v_1.Args[0]
22834 v.reset(OpCom64)
22835 v0 := b.NewValue0(v.Pos, OpAnd64, t)
22836 v0.AddArg2(x, y)
22837 v.AddArg(v0)
22838 return true
22839 }
22840 break
22841 }
22842
22843
22844 for {
22845 x := v_0
22846 if x != v_1 {
22847 break
22848 }
22849 v.copyOf(x)
22850 return true
22851 }
22852
22853
22854 for {
22855 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22856 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
22857 continue
22858 }
22859 x := v_1
22860 v.copyOf(x)
22861 return true
22862 }
22863 break
22864 }
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 || auxIntToInt64(v_0.AuxInt) != -1 {
22870 continue
22871 }
22872 v.reset(OpConst64)
22873 v.AuxInt = int64ToAuxInt(-1)
22874 return true
22875 }
22876 break
22877 }
22878
22879
22880 for {
22881 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22882 if v_0.Op != OpCom64 {
22883 continue
22884 }
22885 x := v_0.Args[0]
22886 if x != v_1 {
22887 continue
22888 }
22889 v.reset(OpConst64)
22890 v.AuxInt = int64ToAuxInt(-1)
22891 return true
22892 }
22893 break
22894 }
22895
22896
22897 for {
22898 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22899 x := v_0
22900 if v_1.Op != OpOr64 {
22901 continue
22902 }
22903 _ = v_1.Args[1]
22904 v_1_0 := v_1.Args[0]
22905 v_1_1 := v_1.Args[1]
22906 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22907 if x != v_1_0 {
22908 continue
22909 }
22910 y := v_1_1
22911 v.reset(OpOr64)
22912 v.AddArg2(x, y)
22913 return true
22914 }
22915 }
22916 break
22917 }
22918
22919
22920
22921 for {
22922 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22923 if v_0.Op != OpAnd64 {
22924 continue
22925 }
22926 _ = v_0.Args[1]
22927 v_0_0 := v_0.Args[0]
22928 v_0_1 := v_0.Args[1]
22929 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22930 x := v_0_0
22931 if v_0_1.Op != OpConst64 {
22932 continue
22933 }
22934 c2 := auxIntToInt64(v_0_1.AuxInt)
22935 if v_1.Op != OpConst64 {
22936 continue
22937 }
22938 t := v_1.Type
22939 c1 := auxIntToInt64(v_1.AuxInt)
22940 if !(^(c1 | c2) == 0) {
22941 continue
22942 }
22943 v.reset(OpOr64)
22944 v0 := b.NewValue0(v.Pos, OpConst64, t)
22945 v0.AuxInt = int64ToAuxInt(c1)
22946 v.AddArg2(v0, x)
22947 return true
22948 }
22949 }
22950 break
22951 }
22952
22953
22954
22955 for {
22956 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22957 if v_0.Op != OpOr64 {
22958 continue
22959 }
22960 _ = v_0.Args[1]
22961 v_0_0 := v_0.Args[0]
22962 v_0_1 := v_0.Args[1]
22963 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22964 i := v_0_0
22965 if i.Op != OpConst64 {
22966 continue
22967 }
22968 t := i.Type
22969 z := v_0_1
22970 x := v_1
22971 if !(z.Op != OpConst64 && x.Op != OpConst64) {
22972 continue
22973 }
22974 v.reset(OpOr64)
22975 v0 := b.NewValue0(v.Pos, OpOr64, t)
22976 v0.AddArg2(z, x)
22977 v.AddArg2(i, v0)
22978 return true
22979 }
22980 }
22981 break
22982 }
22983
22984
22985 for {
22986 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22987 if v_0.Op != OpConst64 {
22988 continue
22989 }
22990 t := v_0.Type
22991 c := auxIntToInt64(v_0.AuxInt)
22992 if v_1.Op != OpOr64 {
22993 continue
22994 }
22995 _ = v_1.Args[1]
22996 v_1_0 := v_1.Args[0]
22997 v_1_1 := v_1.Args[1]
22998 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22999 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
23000 continue
23001 }
23002 d := auxIntToInt64(v_1_0.AuxInt)
23003 x := v_1_1
23004 v.reset(OpOr64)
23005 v0 := b.NewValue0(v.Pos, OpConst64, t)
23006 v0.AuxInt = int64ToAuxInt(c | d)
23007 v.AddArg2(v0, x)
23008 return true
23009 }
23010 }
23011 break
23012 }
23013
23014
23015
23016 for {
23017 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23018 if v_0.Op != OpLsh64x64 {
23019 continue
23020 }
23021 _ = v_0.Args[1]
23022 x := v_0.Args[0]
23023 z := v_0.Args[1]
23024 if z.Op != OpConst64 {
23025 continue
23026 }
23027 c := auxIntToInt64(z.AuxInt)
23028 if v_1.Op != OpRsh64Ux64 {
23029 continue
23030 }
23031 _ = v_1.Args[1]
23032 if x != v_1.Args[0] {
23033 continue
23034 }
23035 v_1_1 := v_1.Args[1]
23036 if v_1_1.Op != OpConst64 {
23037 continue
23038 }
23039 d := auxIntToInt64(v_1_1.AuxInt)
23040 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
23041 continue
23042 }
23043 v.reset(OpRotateLeft64)
23044 v.AddArg2(x, z)
23045 return true
23046 }
23047 break
23048 }
23049
23050
23051
23052 for {
23053 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23054 left := v_0
23055 if left.Op != OpLsh64x64 {
23056 continue
23057 }
23058 y := left.Args[1]
23059 x := left.Args[0]
23060 right := v_1
23061 if right.Op != OpRsh64Ux64 {
23062 continue
23063 }
23064 _ = right.Args[1]
23065 if x != right.Args[0] {
23066 continue
23067 }
23068 right_1 := right.Args[1]
23069 if right_1.Op != OpSub64 {
23070 continue
23071 }
23072 _ = right_1.Args[1]
23073 right_1_0 := right_1.Args[0]
23074 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
23075 continue
23076 }
23077 v.reset(OpRotateLeft64)
23078 v.AddArg2(x, y)
23079 return true
23080 }
23081 break
23082 }
23083
23084
23085
23086 for {
23087 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23088 left := v_0
23089 if left.Op != OpLsh64x32 {
23090 continue
23091 }
23092 y := left.Args[1]
23093 x := left.Args[0]
23094 right := v_1
23095 if right.Op != OpRsh64Ux32 {
23096 continue
23097 }
23098 _ = right.Args[1]
23099 if x != right.Args[0] {
23100 continue
23101 }
23102 right_1 := right.Args[1]
23103 if right_1.Op != OpSub32 {
23104 continue
23105 }
23106 _ = right_1.Args[1]
23107 right_1_0 := right_1.Args[0]
23108 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
23109 continue
23110 }
23111 v.reset(OpRotateLeft64)
23112 v.AddArg2(x, y)
23113 return true
23114 }
23115 break
23116 }
23117
23118
23119
23120 for {
23121 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23122 left := v_0
23123 if left.Op != OpLsh64x16 {
23124 continue
23125 }
23126 y := left.Args[1]
23127 x := left.Args[0]
23128 right := v_1
23129 if right.Op != OpRsh64Ux16 {
23130 continue
23131 }
23132 _ = right.Args[1]
23133 if x != right.Args[0] {
23134 continue
23135 }
23136 right_1 := right.Args[1]
23137 if right_1.Op != OpSub16 {
23138 continue
23139 }
23140 _ = right_1.Args[1]
23141 right_1_0 := right_1.Args[0]
23142 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
23143 continue
23144 }
23145 v.reset(OpRotateLeft64)
23146 v.AddArg2(x, y)
23147 return true
23148 }
23149 break
23150 }
23151
23152
23153
23154 for {
23155 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23156 left := v_0
23157 if left.Op != OpLsh64x8 {
23158 continue
23159 }
23160 y := left.Args[1]
23161 x := left.Args[0]
23162 right := v_1
23163 if right.Op != OpRsh64Ux8 {
23164 continue
23165 }
23166 _ = right.Args[1]
23167 if x != right.Args[0] {
23168 continue
23169 }
23170 right_1 := right.Args[1]
23171 if right_1.Op != OpSub8 {
23172 continue
23173 }
23174 _ = right_1.Args[1]
23175 right_1_0 := right_1.Args[0]
23176 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
23177 continue
23178 }
23179 v.reset(OpRotateLeft64)
23180 v.AddArg2(x, y)
23181 return true
23182 }
23183 break
23184 }
23185
23186
23187
23188 for {
23189 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23190 right := v_0
23191 if right.Op != OpRsh64Ux64 {
23192 continue
23193 }
23194 y := right.Args[1]
23195 x := right.Args[0]
23196 left := v_1
23197 if left.Op != OpLsh64x64 {
23198 continue
23199 }
23200 _ = left.Args[1]
23201 if x != left.Args[0] {
23202 continue
23203 }
23204 z := left.Args[1]
23205 if z.Op != OpSub64 {
23206 continue
23207 }
23208 _ = z.Args[1]
23209 z_0 := z.Args[0]
23210 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
23211 continue
23212 }
23213 v.reset(OpRotateLeft64)
23214 v.AddArg2(x, z)
23215 return true
23216 }
23217 break
23218 }
23219
23220
23221
23222 for {
23223 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23224 right := v_0
23225 if right.Op != OpRsh64Ux32 {
23226 continue
23227 }
23228 y := right.Args[1]
23229 x := right.Args[0]
23230 left := v_1
23231 if left.Op != OpLsh64x32 {
23232 continue
23233 }
23234 _ = left.Args[1]
23235 if x != left.Args[0] {
23236 continue
23237 }
23238 z := left.Args[1]
23239 if z.Op != OpSub32 {
23240 continue
23241 }
23242 _ = z.Args[1]
23243 z_0 := z.Args[0]
23244 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
23245 continue
23246 }
23247 v.reset(OpRotateLeft64)
23248 v.AddArg2(x, z)
23249 return true
23250 }
23251 break
23252 }
23253
23254
23255
23256 for {
23257 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23258 right := v_0
23259 if right.Op != OpRsh64Ux16 {
23260 continue
23261 }
23262 y := right.Args[1]
23263 x := right.Args[0]
23264 left := v_1
23265 if left.Op != OpLsh64x16 {
23266 continue
23267 }
23268 _ = left.Args[1]
23269 if x != left.Args[0] {
23270 continue
23271 }
23272 z := left.Args[1]
23273 if z.Op != OpSub16 {
23274 continue
23275 }
23276 _ = z.Args[1]
23277 z_0 := z.Args[0]
23278 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
23279 continue
23280 }
23281 v.reset(OpRotateLeft64)
23282 v.AddArg2(x, z)
23283 return true
23284 }
23285 break
23286 }
23287
23288
23289
23290 for {
23291 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23292 right := v_0
23293 if right.Op != OpRsh64Ux8 {
23294 continue
23295 }
23296 y := right.Args[1]
23297 x := right.Args[0]
23298 left := v_1
23299 if left.Op != OpLsh64x8 {
23300 continue
23301 }
23302 _ = left.Args[1]
23303 if x != left.Args[0] {
23304 continue
23305 }
23306 z := left.Args[1]
23307 if z.Op != OpSub8 {
23308 continue
23309 }
23310 _ = z.Args[1]
23311 z_0 := z.Args[0]
23312 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
23313 continue
23314 }
23315 v.reset(OpRotateLeft64)
23316 v.AddArg2(x, z)
23317 return true
23318 }
23319 break
23320 }
23321 return false
23322 }
23323 func rewriteValuegeneric_OpOr8(v *Value) bool {
23324 v_1 := v.Args[1]
23325 v_0 := v.Args[0]
23326 b := v.Block
23327 config := b.Func.Config
23328
23329
23330 for {
23331 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23332 if v_0.Op != OpConst8 {
23333 continue
23334 }
23335 c := auxIntToInt8(v_0.AuxInt)
23336 if v_1.Op != OpConst8 {
23337 continue
23338 }
23339 d := auxIntToInt8(v_1.AuxInt)
23340 v.reset(OpConst8)
23341 v.AuxInt = int8ToAuxInt(c | d)
23342 return true
23343 }
23344 break
23345 }
23346
23347
23348 for {
23349 t := v.Type
23350 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23351 if v_0.Op != OpCom8 {
23352 continue
23353 }
23354 x := v_0.Args[0]
23355 if v_1.Op != OpCom8 {
23356 continue
23357 }
23358 y := v_1.Args[0]
23359 v.reset(OpCom8)
23360 v0 := b.NewValue0(v.Pos, OpAnd8, t)
23361 v0.AddArg2(x, y)
23362 v.AddArg(v0)
23363 return true
23364 }
23365 break
23366 }
23367
23368
23369 for {
23370 x := v_0
23371 if x != v_1 {
23372 break
23373 }
23374 v.copyOf(x)
23375 return true
23376 }
23377
23378
23379 for {
23380 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23381 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
23382 continue
23383 }
23384 x := v_1
23385 v.copyOf(x)
23386 return true
23387 }
23388 break
23389 }
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 || auxIntToInt8(v_0.AuxInt) != -1 {
23395 continue
23396 }
23397 v.reset(OpConst8)
23398 v.AuxInt = int8ToAuxInt(-1)
23399 return true
23400 }
23401 break
23402 }
23403
23404
23405 for {
23406 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23407 if v_0.Op != OpCom8 {
23408 continue
23409 }
23410 x := v_0.Args[0]
23411 if x != v_1 {
23412 continue
23413 }
23414 v.reset(OpConst8)
23415 v.AuxInt = int8ToAuxInt(-1)
23416 return true
23417 }
23418 break
23419 }
23420
23421
23422 for {
23423 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23424 x := v_0
23425 if v_1.Op != OpOr8 {
23426 continue
23427 }
23428 _ = v_1.Args[1]
23429 v_1_0 := v_1.Args[0]
23430 v_1_1 := v_1.Args[1]
23431 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
23432 if x != v_1_0 {
23433 continue
23434 }
23435 y := v_1_1
23436 v.reset(OpOr8)
23437 v.AddArg2(x, y)
23438 return true
23439 }
23440 }
23441 break
23442 }
23443
23444
23445
23446 for {
23447 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23448 if v_0.Op != OpAnd8 {
23449 continue
23450 }
23451 _ = v_0.Args[1]
23452 v_0_0 := v_0.Args[0]
23453 v_0_1 := v_0.Args[1]
23454 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
23455 x := v_0_0
23456 if v_0_1.Op != OpConst8 {
23457 continue
23458 }
23459 c2 := auxIntToInt8(v_0_1.AuxInt)
23460 if v_1.Op != OpConst8 {
23461 continue
23462 }
23463 t := v_1.Type
23464 c1 := auxIntToInt8(v_1.AuxInt)
23465 if !(^(c1 | c2) == 0) {
23466 continue
23467 }
23468 v.reset(OpOr8)
23469 v0 := b.NewValue0(v.Pos, OpConst8, t)
23470 v0.AuxInt = int8ToAuxInt(c1)
23471 v.AddArg2(v0, x)
23472 return true
23473 }
23474 }
23475 break
23476 }
23477
23478
23479
23480 for {
23481 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23482 if v_0.Op != OpOr8 {
23483 continue
23484 }
23485 _ = v_0.Args[1]
23486 v_0_0 := v_0.Args[0]
23487 v_0_1 := v_0.Args[1]
23488 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
23489 i := v_0_0
23490 if i.Op != OpConst8 {
23491 continue
23492 }
23493 t := i.Type
23494 z := v_0_1
23495 x := v_1
23496 if !(z.Op != OpConst8 && x.Op != OpConst8) {
23497 continue
23498 }
23499 v.reset(OpOr8)
23500 v0 := b.NewValue0(v.Pos, OpOr8, t)
23501 v0.AddArg2(z, x)
23502 v.AddArg2(i, v0)
23503 return true
23504 }
23505 }
23506 break
23507 }
23508
23509
23510 for {
23511 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23512 if v_0.Op != OpConst8 {
23513 continue
23514 }
23515 t := v_0.Type
23516 c := auxIntToInt8(v_0.AuxInt)
23517 if v_1.Op != OpOr8 {
23518 continue
23519 }
23520 _ = v_1.Args[1]
23521 v_1_0 := v_1.Args[0]
23522 v_1_1 := v_1.Args[1]
23523 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
23524 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
23525 continue
23526 }
23527 d := auxIntToInt8(v_1_0.AuxInt)
23528 x := v_1_1
23529 v.reset(OpOr8)
23530 v0 := b.NewValue0(v.Pos, OpConst8, t)
23531 v0.AuxInt = int8ToAuxInt(c | d)
23532 v.AddArg2(v0, x)
23533 return true
23534 }
23535 }
23536 break
23537 }
23538
23539
23540
23541 for {
23542 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23543 if v_0.Op != OpLsh8x64 {
23544 continue
23545 }
23546 _ = v_0.Args[1]
23547 x := v_0.Args[0]
23548 z := v_0.Args[1]
23549 if z.Op != OpConst64 {
23550 continue
23551 }
23552 c := auxIntToInt64(z.AuxInt)
23553 if v_1.Op != OpRsh8Ux64 {
23554 continue
23555 }
23556 _ = v_1.Args[1]
23557 if x != v_1.Args[0] {
23558 continue
23559 }
23560 v_1_1 := v_1.Args[1]
23561 if v_1_1.Op != OpConst64 {
23562 continue
23563 }
23564 d := auxIntToInt64(v_1_1.AuxInt)
23565 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
23566 continue
23567 }
23568 v.reset(OpRotateLeft8)
23569 v.AddArg2(x, z)
23570 return true
23571 }
23572 break
23573 }
23574
23575
23576
23577 for {
23578 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23579 left := v_0
23580 if left.Op != OpLsh8x64 {
23581 continue
23582 }
23583 y := left.Args[1]
23584 x := left.Args[0]
23585 right := v_1
23586 if right.Op != OpRsh8Ux64 {
23587 continue
23588 }
23589 _ = right.Args[1]
23590 if x != right.Args[0] {
23591 continue
23592 }
23593 right_1 := right.Args[1]
23594 if right_1.Op != OpSub64 {
23595 continue
23596 }
23597 _ = right_1.Args[1]
23598 right_1_0 := right_1.Args[0]
23599 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23600 continue
23601 }
23602 v.reset(OpRotateLeft8)
23603 v.AddArg2(x, y)
23604 return true
23605 }
23606 break
23607 }
23608
23609
23610
23611 for {
23612 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23613 left := v_0
23614 if left.Op != OpLsh8x32 {
23615 continue
23616 }
23617 y := left.Args[1]
23618 x := left.Args[0]
23619 right := v_1
23620 if right.Op != OpRsh8Ux32 {
23621 continue
23622 }
23623 _ = right.Args[1]
23624 if x != right.Args[0] {
23625 continue
23626 }
23627 right_1 := right.Args[1]
23628 if right_1.Op != OpSub32 {
23629 continue
23630 }
23631 _ = right_1.Args[1]
23632 right_1_0 := right_1.Args[0]
23633 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23634 continue
23635 }
23636 v.reset(OpRotateLeft8)
23637 v.AddArg2(x, y)
23638 return true
23639 }
23640 break
23641 }
23642
23643
23644
23645 for {
23646 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23647 left := v_0
23648 if left.Op != OpLsh8x16 {
23649 continue
23650 }
23651 y := left.Args[1]
23652 x := left.Args[0]
23653 right := v_1
23654 if right.Op != OpRsh8Ux16 {
23655 continue
23656 }
23657 _ = right.Args[1]
23658 if x != right.Args[0] {
23659 continue
23660 }
23661 right_1 := right.Args[1]
23662 if right_1.Op != OpSub16 {
23663 continue
23664 }
23665 _ = right_1.Args[1]
23666 right_1_0 := right_1.Args[0]
23667 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23668 continue
23669 }
23670 v.reset(OpRotateLeft8)
23671 v.AddArg2(x, y)
23672 return true
23673 }
23674 break
23675 }
23676
23677
23678
23679 for {
23680 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23681 left := v_0
23682 if left.Op != OpLsh8x8 {
23683 continue
23684 }
23685 y := left.Args[1]
23686 x := left.Args[0]
23687 right := v_1
23688 if right.Op != OpRsh8Ux8 {
23689 continue
23690 }
23691 _ = right.Args[1]
23692 if x != right.Args[0] {
23693 continue
23694 }
23695 right_1 := right.Args[1]
23696 if right_1.Op != OpSub8 {
23697 continue
23698 }
23699 _ = right_1.Args[1]
23700 right_1_0 := right_1.Args[0]
23701 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23702 continue
23703 }
23704 v.reset(OpRotateLeft8)
23705 v.AddArg2(x, y)
23706 return true
23707 }
23708 break
23709 }
23710
23711
23712
23713 for {
23714 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23715 right := v_0
23716 if right.Op != OpRsh8Ux64 {
23717 continue
23718 }
23719 y := right.Args[1]
23720 x := right.Args[0]
23721 left := v_1
23722 if left.Op != OpLsh8x64 {
23723 continue
23724 }
23725 _ = left.Args[1]
23726 if x != left.Args[0] {
23727 continue
23728 }
23729 z := left.Args[1]
23730 if z.Op != OpSub64 {
23731 continue
23732 }
23733 _ = z.Args[1]
23734 z_0 := z.Args[0]
23735 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23736 continue
23737 }
23738 v.reset(OpRotateLeft8)
23739 v.AddArg2(x, z)
23740 return true
23741 }
23742 break
23743 }
23744
23745
23746
23747 for {
23748 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23749 right := v_0
23750 if right.Op != OpRsh8Ux32 {
23751 continue
23752 }
23753 y := right.Args[1]
23754 x := right.Args[0]
23755 left := v_1
23756 if left.Op != OpLsh8x32 {
23757 continue
23758 }
23759 _ = left.Args[1]
23760 if x != left.Args[0] {
23761 continue
23762 }
23763 z := left.Args[1]
23764 if z.Op != OpSub32 {
23765 continue
23766 }
23767 _ = z.Args[1]
23768 z_0 := z.Args[0]
23769 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23770 continue
23771 }
23772 v.reset(OpRotateLeft8)
23773 v.AddArg2(x, z)
23774 return true
23775 }
23776 break
23777 }
23778
23779
23780
23781 for {
23782 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23783 right := v_0
23784 if right.Op != OpRsh8Ux16 {
23785 continue
23786 }
23787 y := right.Args[1]
23788 x := right.Args[0]
23789 left := v_1
23790 if left.Op != OpLsh8x16 {
23791 continue
23792 }
23793 _ = left.Args[1]
23794 if x != left.Args[0] {
23795 continue
23796 }
23797 z := left.Args[1]
23798 if z.Op != OpSub16 {
23799 continue
23800 }
23801 _ = z.Args[1]
23802 z_0 := z.Args[0]
23803 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23804 continue
23805 }
23806 v.reset(OpRotateLeft8)
23807 v.AddArg2(x, z)
23808 return true
23809 }
23810 break
23811 }
23812
23813
23814
23815 for {
23816 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23817 right := v_0
23818 if right.Op != OpRsh8Ux8 {
23819 continue
23820 }
23821 y := right.Args[1]
23822 x := right.Args[0]
23823 left := v_1
23824 if left.Op != OpLsh8x8 {
23825 continue
23826 }
23827 _ = left.Args[1]
23828 if x != left.Args[0] {
23829 continue
23830 }
23831 z := left.Args[1]
23832 if z.Op != OpSub8 {
23833 continue
23834 }
23835 _ = z.Args[1]
23836 z_0 := z.Args[0]
23837 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23838 continue
23839 }
23840 v.reset(OpRotateLeft8)
23841 v.AddArg2(x, z)
23842 return true
23843 }
23844 break
23845 }
23846 return false
23847 }
23848 func rewriteValuegeneric_OpOrB(v *Value) bool {
23849 v_1 := v.Args[1]
23850 v_0 := v.Args[0]
23851 b := v.Block
23852 typ := &b.Func.Config.Types
23853
23854
23855
23856 for {
23857 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23858 if v_0.Op != OpLess64 {
23859 continue
23860 }
23861 x := v_0.Args[1]
23862 v_0_0 := v_0.Args[0]
23863 if v_0_0.Op != OpConst64 {
23864 continue
23865 }
23866 c := auxIntToInt64(v_0_0.AuxInt)
23867 if v_1.Op != OpLess64 {
23868 continue
23869 }
23870 _ = v_1.Args[1]
23871 if x != v_1.Args[0] {
23872 continue
23873 }
23874 v_1_1 := v_1.Args[1]
23875 if v_1_1.Op != OpConst64 {
23876 continue
23877 }
23878 d := auxIntToInt64(v_1_1.AuxInt)
23879 if !(c >= d) {
23880 continue
23881 }
23882 v.reset(OpLess64U)
23883 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23884 v0.AuxInt = int64ToAuxInt(c - d)
23885 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23886 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23887 v2.AuxInt = int64ToAuxInt(d)
23888 v1.AddArg2(x, v2)
23889 v.AddArg2(v0, v1)
23890 return true
23891 }
23892 break
23893 }
23894
23895
23896
23897 for {
23898 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23899 if v_0.Op != OpLeq64 {
23900 continue
23901 }
23902 x := v_0.Args[1]
23903 v_0_0 := v_0.Args[0]
23904 if v_0_0.Op != OpConst64 {
23905 continue
23906 }
23907 c := auxIntToInt64(v_0_0.AuxInt)
23908 if v_1.Op != OpLess64 {
23909 continue
23910 }
23911 _ = v_1.Args[1]
23912 if x != v_1.Args[0] {
23913 continue
23914 }
23915 v_1_1 := v_1.Args[1]
23916 if v_1_1.Op != OpConst64 {
23917 continue
23918 }
23919 d := auxIntToInt64(v_1_1.AuxInt)
23920 if !(c >= d) {
23921 continue
23922 }
23923 v.reset(OpLeq64U)
23924 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23925 v0.AuxInt = int64ToAuxInt(c - d)
23926 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23927 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23928 v2.AuxInt = int64ToAuxInt(d)
23929 v1.AddArg2(x, v2)
23930 v.AddArg2(v0, v1)
23931 return true
23932 }
23933 break
23934 }
23935
23936
23937
23938 for {
23939 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23940 if v_0.Op != OpLess32 {
23941 continue
23942 }
23943 x := v_0.Args[1]
23944 v_0_0 := v_0.Args[0]
23945 if v_0_0.Op != OpConst32 {
23946 continue
23947 }
23948 c := auxIntToInt32(v_0_0.AuxInt)
23949 if v_1.Op != OpLess32 {
23950 continue
23951 }
23952 _ = v_1.Args[1]
23953 if x != v_1.Args[0] {
23954 continue
23955 }
23956 v_1_1 := v_1.Args[1]
23957 if v_1_1.Op != OpConst32 {
23958 continue
23959 }
23960 d := auxIntToInt32(v_1_1.AuxInt)
23961 if !(c >= d) {
23962 continue
23963 }
23964 v.reset(OpLess32U)
23965 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23966 v0.AuxInt = int32ToAuxInt(c - d)
23967 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23968 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23969 v2.AuxInt = int32ToAuxInt(d)
23970 v1.AddArg2(x, v2)
23971 v.AddArg2(v0, v1)
23972 return true
23973 }
23974 break
23975 }
23976
23977
23978
23979 for {
23980 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23981 if v_0.Op != OpLeq32 {
23982 continue
23983 }
23984 x := v_0.Args[1]
23985 v_0_0 := v_0.Args[0]
23986 if v_0_0.Op != OpConst32 {
23987 continue
23988 }
23989 c := auxIntToInt32(v_0_0.AuxInt)
23990 if v_1.Op != OpLess32 {
23991 continue
23992 }
23993 _ = v_1.Args[1]
23994 if x != v_1.Args[0] {
23995 continue
23996 }
23997 v_1_1 := v_1.Args[1]
23998 if v_1_1.Op != OpConst32 {
23999 continue
24000 }
24001 d := auxIntToInt32(v_1_1.AuxInt)
24002 if !(c >= d) {
24003 continue
24004 }
24005 v.reset(OpLeq32U)
24006 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
24007 v0.AuxInt = int32ToAuxInt(c - d)
24008 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
24009 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
24010 v2.AuxInt = int32ToAuxInt(d)
24011 v1.AddArg2(x, v2)
24012 v.AddArg2(v0, v1)
24013 return true
24014 }
24015 break
24016 }
24017
24018
24019
24020 for {
24021 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24022 if v_0.Op != OpLess16 {
24023 continue
24024 }
24025 x := v_0.Args[1]
24026 v_0_0 := v_0.Args[0]
24027 if v_0_0.Op != OpConst16 {
24028 continue
24029 }
24030 c := auxIntToInt16(v_0_0.AuxInt)
24031 if v_1.Op != OpLess16 {
24032 continue
24033 }
24034 _ = v_1.Args[1]
24035 if x != v_1.Args[0] {
24036 continue
24037 }
24038 v_1_1 := v_1.Args[1]
24039 if v_1_1.Op != OpConst16 {
24040 continue
24041 }
24042 d := auxIntToInt16(v_1_1.AuxInt)
24043 if !(c >= d) {
24044 continue
24045 }
24046 v.reset(OpLess16U)
24047 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24048 v0.AuxInt = int16ToAuxInt(c - d)
24049 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24050 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24051 v2.AuxInt = int16ToAuxInt(d)
24052 v1.AddArg2(x, v2)
24053 v.AddArg2(v0, v1)
24054 return true
24055 }
24056 break
24057 }
24058
24059
24060
24061 for {
24062 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24063 if v_0.Op != OpLeq16 {
24064 continue
24065 }
24066 x := v_0.Args[1]
24067 v_0_0 := v_0.Args[0]
24068 if v_0_0.Op != OpConst16 {
24069 continue
24070 }
24071 c := auxIntToInt16(v_0_0.AuxInt)
24072 if v_1.Op != OpLess16 {
24073 continue
24074 }
24075 _ = v_1.Args[1]
24076 if x != v_1.Args[0] {
24077 continue
24078 }
24079 v_1_1 := v_1.Args[1]
24080 if v_1_1.Op != OpConst16 {
24081 continue
24082 }
24083 d := auxIntToInt16(v_1_1.AuxInt)
24084 if !(c >= d) {
24085 continue
24086 }
24087 v.reset(OpLeq16U)
24088 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24089 v0.AuxInt = int16ToAuxInt(c - d)
24090 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24091 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24092 v2.AuxInt = int16ToAuxInt(d)
24093 v1.AddArg2(x, v2)
24094 v.AddArg2(v0, v1)
24095 return true
24096 }
24097 break
24098 }
24099
24100
24101
24102 for {
24103 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24104 if v_0.Op != OpLess8 {
24105 continue
24106 }
24107 x := v_0.Args[1]
24108 v_0_0 := v_0.Args[0]
24109 if v_0_0.Op != OpConst8 {
24110 continue
24111 }
24112 c := auxIntToInt8(v_0_0.AuxInt)
24113 if v_1.Op != OpLess8 {
24114 continue
24115 }
24116 _ = v_1.Args[1]
24117 if x != v_1.Args[0] {
24118 continue
24119 }
24120 v_1_1 := v_1.Args[1]
24121 if v_1_1.Op != OpConst8 {
24122 continue
24123 }
24124 d := auxIntToInt8(v_1_1.AuxInt)
24125 if !(c >= d) {
24126 continue
24127 }
24128 v.reset(OpLess8U)
24129 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24130 v0.AuxInt = int8ToAuxInt(c - d)
24131 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24132 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24133 v2.AuxInt = int8ToAuxInt(d)
24134 v1.AddArg2(x, v2)
24135 v.AddArg2(v0, v1)
24136 return true
24137 }
24138 break
24139 }
24140
24141
24142
24143 for {
24144 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24145 if v_0.Op != OpLeq8 {
24146 continue
24147 }
24148 x := v_0.Args[1]
24149 v_0_0 := v_0.Args[0]
24150 if v_0_0.Op != OpConst8 {
24151 continue
24152 }
24153 c := auxIntToInt8(v_0_0.AuxInt)
24154 if v_1.Op != OpLess8 {
24155 continue
24156 }
24157 _ = v_1.Args[1]
24158 if x != v_1.Args[0] {
24159 continue
24160 }
24161 v_1_1 := v_1.Args[1]
24162 if v_1_1.Op != OpConst8 {
24163 continue
24164 }
24165 d := auxIntToInt8(v_1_1.AuxInt)
24166 if !(c >= d) {
24167 continue
24168 }
24169 v.reset(OpLeq8U)
24170 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24171 v0.AuxInt = int8ToAuxInt(c - d)
24172 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24173 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24174 v2.AuxInt = int8ToAuxInt(d)
24175 v1.AddArg2(x, v2)
24176 v.AddArg2(v0, v1)
24177 return true
24178 }
24179 break
24180 }
24181
24182
24183
24184 for {
24185 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24186 if v_0.Op != OpLess64 {
24187 continue
24188 }
24189 x := v_0.Args[1]
24190 v_0_0 := v_0.Args[0]
24191 if v_0_0.Op != OpConst64 {
24192 continue
24193 }
24194 c := auxIntToInt64(v_0_0.AuxInt)
24195 if v_1.Op != OpLeq64 {
24196 continue
24197 }
24198 _ = v_1.Args[1]
24199 if x != v_1.Args[0] {
24200 continue
24201 }
24202 v_1_1 := v_1.Args[1]
24203 if v_1_1.Op != OpConst64 {
24204 continue
24205 }
24206 d := auxIntToInt64(v_1_1.AuxInt)
24207 if !(c >= d+1 && d+1 > d) {
24208 continue
24209 }
24210 v.reset(OpLess64U)
24211 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
24212 v0.AuxInt = int64ToAuxInt(c - d - 1)
24213 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
24214 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
24215 v2.AuxInt = int64ToAuxInt(d + 1)
24216 v1.AddArg2(x, v2)
24217 v.AddArg2(v0, v1)
24218 return true
24219 }
24220 break
24221 }
24222
24223
24224
24225 for {
24226 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24227 if v_0.Op != OpLeq64 {
24228 continue
24229 }
24230 x := v_0.Args[1]
24231 v_0_0 := v_0.Args[0]
24232 if v_0_0.Op != OpConst64 {
24233 continue
24234 }
24235 c := auxIntToInt64(v_0_0.AuxInt)
24236 if v_1.Op != OpLeq64 {
24237 continue
24238 }
24239 _ = v_1.Args[1]
24240 if x != v_1.Args[0] {
24241 continue
24242 }
24243 v_1_1 := v_1.Args[1]
24244 if v_1_1.Op != OpConst64 {
24245 continue
24246 }
24247 d := auxIntToInt64(v_1_1.AuxInt)
24248 if !(c >= d+1 && d+1 > d) {
24249 continue
24250 }
24251 v.reset(OpLeq64U)
24252 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
24253 v0.AuxInt = int64ToAuxInt(c - d - 1)
24254 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
24255 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
24256 v2.AuxInt = int64ToAuxInt(d + 1)
24257 v1.AddArg2(x, v2)
24258 v.AddArg2(v0, v1)
24259 return true
24260 }
24261 break
24262 }
24263
24264
24265
24266 for {
24267 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24268 if v_0.Op != OpLess32 {
24269 continue
24270 }
24271 x := v_0.Args[1]
24272 v_0_0 := v_0.Args[0]
24273 if v_0_0.Op != OpConst32 {
24274 continue
24275 }
24276 c := auxIntToInt32(v_0_0.AuxInt)
24277 if v_1.Op != OpLeq32 {
24278 continue
24279 }
24280 _ = v_1.Args[1]
24281 if x != v_1.Args[0] {
24282 continue
24283 }
24284 v_1_1 := v_1.Args[1]
24285 if v_1_1.Op != OpConst32 {
24286 continue
24287 }
24288 d := auxIntToInt32(v_1_1.AuxInt)
24289 if !(c >= d+1 && d+1 > d) {
24290 continue
24291 }
24292 v.reset(OpLess32U)
24293 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
24294 v0.AuxInt = int32ToAuxInt(c - d - 1)
24295 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
24296 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
24297 v2.AuxInt = int32ToAuxInt(d + 1)
24298 v1.AddArg2(x, v2)
24299 v.AddArg2(v0, v1)
24300 return true
24301 }
24302 break
24303 }
24304
24305
24306
24307 for {
24308 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24309 if v_0.Op != OpLeq32 {
24310 continue
24311 }
24312 x := v_0.Args[1]
24313 v_0_0 := v_0.Args[0]
24314 if v_0_0.Op != OpConst32 {
24315 continue
24316 }
24317 c := auxIntToInt32(v_0_0.AuxInt)
24318 if v_1.Op != OpLeq32 {
24319 continue
24320 }
24321 _ = v_1.Args[1]
24322 if x != v_1.Args[0] {
24323 continue
24324 }
24325 v_1_1 := v_1.Args[1]
24326 if v_1_1.Op != OpConst32 {
24327 continue
24328 }
24329 d := auxIntToInt32(v_1_1.AuxInt)
24330 if !(c >= d+1 && d+1 > d) {
24331 continue
24332 }
24333 v.reset(OpLeq32U)
24334 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
24335 v0.AuxInt = int32ToAuxInt(c - d - 1)
24336 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
24337 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
24338 v2.AuxInt = int32ToAuxInt(d + 1)
24339 v1.AddArg2(x, v2)
24340 v.AddArg2(v0, v1)
24341 return true
24342 }
24343 break
24344 }
24345
24346
24347
24348 for {
24349 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24350 if v_0.Op != OpLess16 {
24351 continue
24352 }
24353 x := v_0.Args[1]
24354 v_0_0 := v_0.Args[0]
24355 if v_0_0.Op != OpConst16 {
24356 continue
24357 }
24358 c := auxIntToInt16(v_0_0.AuxInt)
24359 if v_1.Op != OpLeq16 {
24360 continue
24361 }
24362 _ = v_1.Args[1]
24363 if x != v_1.Args[0] {
24364 continue
24365 }
24366 v_1_1 := v_1.Args[1]
24367 if v_1_1.Op != OpConst16 {
24368 continue
24369 }
24370 d := auxIntToInt16(v_1_1.AuxInt)
24371 if !(c >= d+1 && d+1 > d) {
24372 continue
24373 }
24374 v.reset(OpLess16U)
24375 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24376 v0.AuxInt = int16ToAuxInt(c - d - 1)
24377 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24378 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24379 v2.AuxInt = int16ToAuxInt(d + 1)
24380 v1.AddArg2(x, v2)
24381 v.AddArg2(v0, v1)
24382 return true
24383 }
24384 break
24385 }
24386
24387
24388
24389 for {
24390 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24391 if v_0.Op != OpLeq16 {
24392 continue
24393 }
24394 x := v_0.Args[1]
24395 v_0_0 := v_0.Args[0]
24396 if v_0_0.Op != OpConst16 {
24397 continue
24398 }
24399 c := auxIntToInt16(v_0_0.AuxInt)
24400 if v_1.Op != OpLeq16 {
24401 continue
24402 }
24403 _ = v_1.Args[1]
24404 if x != v_1.Args[0] {
24405 continue
24406 }
24407 v_1_1 := v_1.Args[1]
24408 if v_1_1.Op != OpConst16 {
24409 continue
24410 }
24411 d := auxIntToInt16(v_1_1.AuxInt)
24412 if !(c >= d+1 && d+1 > d) {
24413 continue
24414 }
24415 v.reset(OpLeq16U)
24416 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24417 v0.AuxInt = int16ToAuxInt(c - d - 1)
24418 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24419 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24420 v2.AuxInt = int16ToAuxInt(d + 1)
24421 v1.AddArg2(x, v2)
24422 v.AddArg2(v0, v1)
24423 return true
24424 }
24425 break
24426 }
24427
24428
24429
24430 for {
24431 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24432 if v_0.Op != OpLess8 {
24433 continue
24434 }
24435 x := v_0.Args[1]
24436 v_0_0 := v_0.Args[0]
24437 if v_0_0.Op != OpConst8 {
24438 continue
24439 }
24440 c := auxIntToInt8(v_0_0.AuxInt)
24441 if v_1.Op != OpLeq8 {
24442 continue
24443 }
24444 _ = v_1.Args[1]
24445 if x != v_1.Args[0] {
24446 continue
24447 }
24448 v_1_1 := v_1.Args[1]
24449 if v_1_1.Op != OpConst8 {
24450 continue
24451 }
24452 d := auxIntToInt8(v_1_1.AuxInt)
24453 if !(c >= d+1 && d+1 > d) {
24454 continue
24455 }
24456 v.reset(OpLess8U)
24457 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24458 v0.AuxInt = int8ToAuxInt(c - d - 1)
24459 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24460 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24461 v2.AuxInt = int8ToAuxInt(d + 1)
24462 v1.AddArg2(x, v2)
24463 v.AddArg2(v0, v1)
24464 return true
24465 }
24466 break
24467 }
24468
24469
24470
24471 for {
24472 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24473 if v_0.Op != OpLeq8 {
24474 continue
24475 }
24476 x := v_0.Args[1]
24477 v_0_0 := v_0.Args[0]
24478 if v_0_0.Op != OpConst8 {
24479 continue
24480 }
24481 c := auxIntToInt8(v_0_0.AuxInt)
24482 if v_1.Op != OpLeq8 {
24483 continue
24484 }
24485 _ = v_1.Args[1]
24486 if x != v_1.Args[0] {
24487 continue
24488 }
24489 v_1_1 := v_1.Args[1]
24490 if v_1_1.Op != OpConst8 {
24491 continue
24492 }
24493 d := auxIntToInt8(v_1_1.AuxInt)
24494 if !(c >= d+1 && d+1 > d) {
24495 continue
24496 }
24497 v.reset(OpLeq8U)
24498 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24499 v0.AuxInt = int8ToAuxInt(c - d - 1)
24500 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24501 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24502 v2.AuxInt = int8ToAuxInt(d + 1)
24503 v1.AddArg2(x, v2)
24504 v.AddArg2(v0, v1)
24505 return true
24506 }
24507 break
24508 }
24509
24510
24511
24512 for {
24513 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24514 if v_0.Op != OpLess64U {
24515 continue
24516 }
24517 x := v_0.Args[1]
24518 v_0_0 := v_0.Args[0]
24519 if v_0_0.Op != OpConst64 {
24520 continue
24521 }
24522 c := auxIntToInt64(v_0_0.AuxInt)
24523 if v_1.Op != OpLess64U {
24524 continue
24525 }
24526 _ = v_1.Args[1]
24527 if x != v_1.Args[0] {
24528 continue
24529 }
24530 v_1_1 := v_1.Args[1]
24531 if v_1_1.Op != OpConst64 {
24532 continue
24533 }
24534 d := auxIntToInt64(v_1_1.AuxInt)
24535 if !(uint64(c) >= uint64(d)) {
24536 continue
24537 }
24538 v.reset(OpLess64U)
24539 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
24540 v0.AuxInt = int64ToAuxInt(c - d)
24541 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
24542 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
24543 v2.AuxInt = int64ToAuxInt(d)
24544 v1.AddArg2(x, v2)
24545 v.AddArg2(v0, v1)
24546 return true
24547 }
24548 break
24549 }
24550
24551
24552
24553 for {
24554 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24555 if v_0.Op != OpLeq64U {
24556 continue
24557 }
24558 x := v_0.Args[1]
24559 v_0_0 := v_0.Args[0]
24560 if v_0_0.Op != OpConst64 {
24561 continue
24562 }
24563 c := auxIntToInt64(v_0_0.AuxInt)
24564 if v_1.Op != OpLess64U {
24565 continue
24566 }
24567 _ = v_1.Args[1]
24568 if x != v_1.Args[0] {
24569 continue
24570 }
24571 v_1_1 := v_1.Args[1]
24572 if v_1_1.Op != OpConst64 {
24573 continue
24574 }
24575 d := auxIntToInt64(v_1_1.AuxInt)
24576 if !(uint64(c) >= uint64(d)) {
24577 continue
24578 }
24579 v.reset(OpLeq64U)
24580 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
24581 v0.AuxInt = int64ToAuxInt(c - d)
24582 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
24583 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
24584 v2.AuxInt = int64ToAuxInt(d)
24585 v1.AddArg2(x, v2)
24586 v.AddArg2(v0, v1)
24587 return true
24588 }
24589 break
24590 }
24591
24592
24593
24594 for {
24595 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24596 if v_0.Op != OpLess32U {
24597 continue
24598 }
24599 x := v_0.Args[1]
24600 v_0_0 := v_0.Args[0]
24601 if v_0_0.Op != OpConst32 {
24602 continue
24603 }
24604 c := auxIntToInt32(v_0_0.AuxInt)
24605 if v_1.Op != OpLess32U {
24606 continue
24607 }
24608 _ = v_1.Args[1]
24609 if x != v_1.Args[0] {
24610 continue
24611 }
24612 v_1_1 := v_1.Args[1]
24613 if v_1_1.Op != OpConst32 {
24614 continue
24615 }
24616 d := auxIntToInt32(v_1_1.AuxInt)
24617 if !(uint32(c) >= uint32(d)) {
24618 continue
24619 }
24620 v.reset(OpLess32U)
24621 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
24622 v0.AuxInt = int32ToAuxInt(c - d)
24623 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
24624 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
24625 v2.AuxInt = int32ToAuxInt(d)
24626 v1.AddArg2(x, v2)
24627 v.AddArg2(v0, v1)
24628 return true
24629 }
24630 break
24631 }
24632
24633
24634
24635 for {
24636 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24637 if v_0.Op != OpLeq32U {
24638 continue
24639 }
24640 x := v_0.Args[1]
24641 v_0_0 := v_0.Args[0]
24642 if v_0_0.Op != OpConst32 {
24643 continue
24644 }
24645 c := auxIntToInt32(v_0_0.AuxInt)
24646 if v_1.Op != OpLess32U {
24647 continue
24648 }
24649 _ = v_1.Args[1]
24650 if x != v_1.Args[0] {
24651 continue
24652 }
24653 v_1_1 := v_1.Args[1]
24654 if v_1_1.Op != OpConst32 {
24655 continue
24656 }
24657 d := auxIntToInt32(v_1_1.AuxInt)
24658 if !(uint32(c) >= uint32(d)) {
24659 continue
24660 }
24661 v.reset(OpLeq32U)
24662 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
24663 v0.AuxInt = int32ToAuxInt(c - d)
24664 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
24665 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
24666 v2.AuxInt = int32ToAuxInt(d)
24667 v1.AddArg2(x, v2)
24668 v.AddArg2(v0, v1)
24669 return true
24670 }
24671 break
24672 }
24673
24674
24675
24676 for {
24677 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24678 if v_0.Op != OpLess16U {
24679 continue
24680 }
24681 x := v_0.Args[1]
24682 v_0_0 := v_0.Args[0]
24683 if v_0_0.Op != OpConst16 {
24684 continue
24685 }
24686 c := auxIntToInt16(v_0_0.AuxInt)
24687 if v_1.Op != OpLess16U {
24688 continue
24689 }
24690 _ = v_1.Args[1]
24691 if x != v_1.Args[0] {
24692 continue
24693 }
24694 v_1_1 := v_1.Args[1]
24695 if v_1_1.Op != OpConst16 {
24696 continue
24697 }
24698 d := auxIntToInt16(v_1_1.AuxInt)
24699 if !(uint16(c) >= uint16(d)) {
24700 continue
24701 }
24702 v.reset(OpLess16U)
24703 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24704 v0.AuxInt = int16ToAuxInt(c - d)
24705 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24706 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24707 v2.AuxInt = int16ToAuxInt(d)
24708 v1.AddArg2(x, v2)
24709 v.AddArg2(v0, v1)
24710 return true
24711 }
24712 break
24713 }
24714
24715
24716
24717 for {
24718 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24719 if v_0.Op != OpLeq16U {
24720 continue
24721 }
24722 x := v_0.Args[1]
24723 v_0_0 := v_0.Args[0]
24724 if v_0_0.Op != OpConst16 {
24725 continue
24726 }
24727 c := auxIntToInt16(v_0_0.AuxInt)
24728 if v_1.Op != OpLess16U {
24729 continue
24730 }
24731 _ = v_1.Args[1]
24732 if x != v_1.Args[0] {
24733 continue
24734 }
24735 v_1_1 := v_1.Args[1]
24736 if v_1_1.Op != OpConst16 {
24737 continue
24738 }
24739 d := auxIntToInt16(v_1_1.AuxInt)
24740 if !(uint16(c) >= uint16(d)) {
24741 continue
24742 }
24743 v.reset(OpLeq16U)
24744 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24745 v0.AuxInt = int16ToAuxInt(c - d)
24746 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24747 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24748 v2.AuxInt = int16ToAuxInt(d)
24749 v1.AddArg2(x, v2)
24750 v.AddArg2(v0, v1)
24751 return true
24752 }
24753 break
24754 }
24755
24756
24757
24758 for {
24759 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24760 if v_0.Op != OpLess8U {
24761 continue
24762 }
24763 x := v_0.Args[1]
24764 v_0_0 := v_0.Args[0]
24765 if v_0_0.Op != OpConst8 {
24766 continue
24767 }
24768 c := auxIntToInt8(v_0_0.AuxInt)
24769 if v_1.Op != OpLess8U {
24770 continue
24771 }
24772 _ = v_1.Args[1]
24773 if x != v_1.Args[0] {
24774 continue
24775 }
24776 v_1_1 := v_1.Args[1]
24777 if v_1_1.Op != OpConst8 {
24778 continue
24779 }
24780 d := auxIntToInt8(v_1_1.AuxInt)
24781 if !(uint8(c) >= uint8(d)) {
24782 continue
24783 }
24784 v.reset(OpLess8U)
24785 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24786 v0.AuxInt = int8ToAuxInt(c - d)
24787 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24788 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24789 v2.AuxInt = int8ToAuxInt(d)
24790 v1.AddArg2(x, v2)
24791 v.AddArg2(v0, v1)
24792 return true
24793 }
24794 break
24795 }
24796
24797
24798
24799 for {
24800 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24801 if v_0.Op != OpLeq8U {
24802 continue
24803 }
24804 x := v_0.Args[1]
24805 v_0_0 := v_0.Args[0]
24806 if v_0_0.Op != OpConst8 {
24807 continue
24808 }
24809 c := auxIntToInt8(v_0_0.AuxInt)
24810 if v_1.Op != OpLess8U {
24811 continue
24812 }
24813 _ = v_1.Args[1]
24814 if x != v_1.Args[0] {
24815 continue
24816 }
24817 v_1_1 := v_1.Args[1]
24818 if v_1_1.Op != OpConst8 {
24819 continue
24820 }
24821 d := auxIntToInt8(v_1_1.AuxInt)
24822 if !(uint8(c) >= uint8(d)) {
24823 continue
24824 }
24825 v.reset(OpLeq8U)
24826 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24827 v0.AuxInt = int8ToAuxInt(c - d)
24828 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24829 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24830 v2.AuxInt = int8ToAuxInt(d)
24831 v1.AddArg2(x, v2)
24832 v.AddArg2(v0, v1)
24833 return true
24834 }
24835 break
24836 }
24837
24838
24839
24840 for {
24841 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24842 if v_0.Op != OpLess64U {
24843 continue
24844 }
24845 x := v_0.Args[1]
24846 v_0_0 := v_0.Args[0]
24847 if v_0_0.Op != OpConst64 {
24848 continue
24849 }
24850 c := auxIntToInt64(v_0_0.AuxInt)
24851 if v_1.Op != OpLeq64U {
24852 continue
24853 }
24854 _ = v_1.Args[1]
24855 if x != v_1.Args[0] {
24856 continue
24857 }
24858 v_1_1 := v_1.Args[1]
24859 if v_1_1.Op != OpConst64 {
24860 continue
24861 }
24862 d := auxIntToInt64(v_1_1.AuxInt)
24863 if !(uint64(c) >= uint64(d+1) && uint64(d+1) > uint64(d)) {
24864 continue
24865 }
24866 v.reset(OpLess64U)
24867 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
24868 v0.AuxInt = int64ToAuxInt(c - d - 1)
24869 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
24870 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
24871 v2.AuxInt = int64ToAuxInt(d + 1)
24872 v1.AddArg2(x, v2)
24873 v.AddArg2(v0, v1)
24874 return true
24875 }
24876 break
24877 }
24878
24879
24880
24881 for {
24882 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24883 if v_0.Op != OpLeq64U {
24884 continue
24885 }
24886 x := v_0.Args[1]
24887 v_0_0 := v_0.Args[0]
24888 if v_0_0.Op != OpConst64 {
24889 continue
24890 }
24891 c := auxIntToInt64(v_0_0.AuxInt)
24892 if v_1.Op != OpLeq64U {
24893 continue
24894 }
24895 _ = v_1.Args[1]
24896 if x != v_1.Args[0] {
24897 continue
24898 }
24899 v_1_1 := v_1.Args[1]
24900 if v_1_1.Op != OpConst64 {
24901 continue
24902 }
24903 d := auxIntToInt64(v_1_1.AuxInt)
24904 if !(uint64(c) >= uint64(d+1) && uint64(d+1) > uint64(d)) {
24905 continue
24906 }
24907 v.reset(OpLeq64U)
24908 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
24909 v0.AuxInt = int64ToAuxInt(c - d - 1)
24910 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
24911 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
24912 v2.AuxInt = int64ToAuxInt(d + 1)
24913 v1.AddArg2(x, v2)
24914 v.AddArg2(v0, v1)
24915 return true
24916 }
24917 break
24918 }
24919
24920
24921
24922 for {
24923 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24924 if v_0.Op != OpLess32U {
24925 continue
24926 }
24927 x := v_0.Args[1]
24928 v_0_0 := v_0.Args[0]
24929 if v_0_0.Op != OpConst32 {
24930 continue
24931 }
24932 c := auxIntToInt32(v_0_0.AuxInt)
24933 if v_1.Op != OpLeq32U {
24934 continue
24935 }
24936 _ = v_1.Args[1]
24937 if x != v_1.Args[0] {
24938 continue
24939 }
24940 v_1_1 := v_1.Args[1]
24941 if v_1_1.Op != OpConst32 {
24942 continue
24943 }
24944 d := auxIntToInt32(v_1_1.AuxInt)
24945 if !(uint32(c) >= uint32(d+1) && uint32(d+1) > uint32(d)) {
24946 continue
24947 }
24948 v.reset(OpLess32U)
24949 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
24950 v0.AuxInt = int32ToAuxInt(c - d - 1)
24951 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
24952 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
24953 v2.AuxInt = int32ToAuxInt(d + 1)
24954 v1.AddArg2(x, v2)
24955 v.AddArg2(v0, v1)
24956 return true
24957 }
24958 break
24959 }
24960
24961
24962
24963 for {
24964 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24965 if v_0.Op != OpLeq32U {
24966 continue
24967 }
24968 x := v_0.Args[1]
24969 v_0_0 := v_0.Args[0]
24970 if v_0_0.Op != OpConst32 {
24971 continue
24972 }
24973 c := auxIntToInt32(v_0_0.AuxInt)
24974 if v_1.Op != OpLeq32U {
24975 continue
24976 }
24977 _ = v_1.Args[1]
24978 if x != v_1.Args[0] {
24979 continue
24980 }
24981 v_1_1 := v_1.Args[1]
24982 if v_1_1.Op != OpConst32 {
24983 continue
24984 }
24985 d := auxIntToInt32(v_1_1.AuxInt)
24986 if !(uint32(c) >= uint32(d+1) && uint32(d+1) > uint32(d)) {
24987 continue
24988 }
24989 v.reset(OpLeq32U)
24990 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
24991 v0.AuxInt = int32ToAuxInt(c - d - 1)
24992 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
24993 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
24994 v2.AuxInt = int32ToAuxInt(d + 1)
24995 v1.AddArg2(x, v2)
24996 v.AddArg2(v0, v1)
24997 return true
24998 }
24999 break
25000 }
25001
25002
25003
25004 for {
25005 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25006 if v_0.Op != OpLess16U {
25007 continue
25008 }
25009 x := v_0.Args[1]
25010 v_0_0 := v_0.Args[0]
25011 if v_0_0.Op != OpConst16 {
25012 continue
25013 }
25014 c := auxIntToInt16(v_0_0.AuxInt)
25015 if v_1.Op != OpLeq16U {
25016 continue
25017 }
25018 _ = v_1.Args[1]
25019 if x != v_1.Args[0] {
25020 continue
25021 }
25022 v_1_1 := v_1.Args[1]
25023 if v_1_1.Op != OpConst16 {
25024 continue
25025 }
25026 d := auxIntToInt16(v_1_1.AuxInt)
25027 if !(uint16(c) >= uint16(d+1) && uint16(d+1) > uint16(d)) {
25028 continue
25029 }
25030 v.reset(OpLess16U)
25031 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
25032 v0.AuxInt = int16ToAuxInt(c - d - 1)
25033 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
25034 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
25035 v2.AuxInt = int16ToAuxInt(d + 1)
25036 v1.AddArg2(x, v2)
25037 v.AddArg2(v0, v1)
25038 return true
25039 }
25040 break
25041 }
25042
25043
25044
25045 for {
25046 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25047 if v_0.Op != OpLeq16U {
25048 continue
25049 }
25050 x := v_0.Args[1]
25051 v_0_0 := v_0.Args[0]
25052 if v_0_0.Op != OpConst16 {
25053 continue
25054 }
25055 c := auxIntToInt16(v_0_0.AuxInt)
25056 if v_1.Op != OpLeq16U {
25057 continue
25058 }
25059 _ = v_1.Args[1]
25060 if x != v_1.Args[0] {
25061 continue
25062 }
25063 v_1_1 := v_1.Args[1]
25064 if v_1_1.Op != OpConst16 {
25065 continue
25066 }
25067 d := auxIntToInt16(v_1_1.AuxInt)
25068 if !(uint16(c) >= uint16(d+1) && uint16(d+1) > uint16(d)) {
25069 continue
25070 }
25071 v.reset(OpLeq16U)
25072 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
25073 v0.AuxInt = int16ToAuxInt(c - d - 1)
25074 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
25075 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
25076 v2.AuxInt = int16ToAuxInt(d + 1)
25077 v1.AddArg2(x, v2)
25078 v.AddArg2(v0, v1)
25079 return true
25080 }
25081 break
25082 }
25083
25084
25085
25086 for {
25087 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25088 if v_0.Op != OpLess8U {
25089 continue
25090 }
25091 x := v_0.Args[1]
25092 v_0_0 := v_0.Args[0]
25093 if v_0_0.Op != OpConst8 {
25094 continue
25095 }
25096 c := auxIntToInt8(v_0_0.AuxInt)
25097 if v_1.Op != OpLeq8U {
25098 continue
25099 }
25100 _ = v_1.Args[1]
25101 if x != v_1.Args[0] {
25102 continue
25103 }
25104 v_1_1 := v_1.Args[1]
25105 if v_1_1.Op != OpConst8 {
25106 continue
25107 }
25108 d := auxIntToInt8(v_1_1.AuxInt)
25109 if !(uint8(c) >= uint8(d+1) && uint8(d+1) > uint8(d)) {
25110 continue
25111 }
25112 v.reset(OpLess8U)
25113 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
25114 v0.AuxInt = int8ToAuxInt(c - d - 1)
25115 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
25116 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
25117 v2.AuxInt = int8ToAuxInt(d + 1)
25118 v1.AddArg2(x, v2)
25119 v.AddArg2(v0, v1)
25120 return true
25121 }
25122 break
25123 }
25124
25125
25126
25127 for {
25128 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25129 if v_0.Op != OpLeq8U {
25130 continue
25131 }
25132 x := v_0.Args[1]
25133 v_0_0 := v_0.Args[0]
25134 if v_0_0.Op != OpConst8 {
25135 continue
25136 }
25137 c := auxIntToInt8(v_0_0.AuxInt)
25138 if v_1.Op != OpLeq8U {
25139 continue
25140 }
25141 _ = v_1.Args[1]
25142 if x != v_1.Args[0] {
25143 continue
25144 }
25145 v_1_1 := v_1.Args[1]
25146 if v_1_1.Op != OpConst8 {
25147 continue
25148 }
25149 d := auxIntToInt8(v_1_1.AuxInt)
25150 if !(uint8(c) >= uint8(d+1) && uint8(d+1) > uint8(d)) {
25151 continue
25152 }
25153 v.reset(OpLeq8U)
25154 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
25155 v0.AuxInt = int8ToAuxInt(c - d - 1)
25156 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
25157 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
25158 v2.AuxInt = int8ToAuxInt(d + 1)
25159 v1.AddArg2(x, v2)
25160 v.AddArg2(v0, v1)
25161 return true
25162 }
25163 break
25164 }
25165
25166
25167
25168 for {
25169 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25170 if v_0.Op != OpEq64 {
25171 continue
25172 }
25173 _ = v_0.Args[1]
25174 v_0_0 := v_0.Args[0]
25175 v_0_1 := v_0.Args[1]
25176 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
25177 x := v_0_0
25178 cv := v_0_1
25179 if cv.Op != OpConst64 {
25180 continue
25181 }
25182 c := auxIntToInt64(cv.AuxInt)
25183 if v_1.Op != OpEq64 {
25184 continue
25185 }
25186 _ = v_1.Args[1]
25187 v_1_0 := v_1.Args[0]
25188 v_1_1 := v_1.Args[1]
25189 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
25190 if x != v_1_0 || v_1_1.Op != OpConst64 {
25191 continue
25192 }
25193 d := auxIntToInt64(v_1_1.AuxInt)
25194 if !(c|d == c && oneBit(c^d)) {
25195 continue
25196 }
25197 v.reset(OpEq64)
25198 v0 := b.NewValue0(v.Pos, OpOr64, x.Type)
25199 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
25200 v1.AuxInt = int64ToAuxInt(c ^ d)
25201 v0.AddArg2(x, v1)
25202 v.AddArg2(v0, cv)
25203 return true
25204 }
25205 }
25206 }
25207 break
25208 }
25209
25210
25211
25212 for {
25213 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25214 if v_0.Op != OpEq32 {
25215 continue
25216 }
25217 _ = v_0.Args[1]
25218 v_0_0 := v_0.Args[0]
25219 v_0_1 := v_0.Args[1]
25220 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
25221 x := v_0_0
25222 cv := v_0_1
25223 if cv.Op != OpConst32 {
25224 continue
25225 }
25226 c := auxIntToInt32(cv.AuxInt)
25227 if v_1.Op != OpEq32 {
25228 continue
25229 }
25230 _ = v_1.Args[1]
25231 v_1_0 := v_1.Args[0]
25232 v_1_1 := v_1.Args[1]
25233 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
25234 if x != v_1_0 || v_1_1.Op != OpConst32 {
25235 continue
25236 }
25237 d := auxIntToInt32(v_1_1.AuxInt)
25238 if !(c|d == c && oneBit(c^d)) {
25239 continue
25240 }
25241 v.reset(OpEq32)
25242 v0 := b.NewValue0(v.Pos, OpOr32, x.Type)
25243 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
25244 v1.AuxInt = int32ToAuxInt(c ^ d)
25245 v0.AddArg2(x, v1)
25246 v.AddArg2(v0, cv)
25247 return true
25248 }
25249 }
25250 }
25251 break
25252 }
25253
25254
25255
25256 for {
25257 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25258 if v_0.Op != OpEq16 {
25259 continue
25260 }
25261 _ = v_0.Args[1]
25262 v_0_0 := v_0.Args[0]
25263 v_0_1 := v_0.Args[1]
25264 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
25265 x := v_0_0
25266 cv := v_0_1
25267 if cv.Op != OpConst16 {
25268 continue
25269 }
25270 c := auxIntToInt16(cv.AuxInt)
25271 if v_1.Op != OpEq16 {
25272 continue
25273 }
25274 _ = v_1.Args[1]
25275 v_1_0 := v_1.Args[0]
25276 v_1_1 := v_1.Args[1]
25277 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
25278 if x != v_1_0 || v_1_1.Op != OpConst16 {
25279 continue
25280 }
25281 d := auxIntToInt16(v_1_1.AuxInt)
25282 if !(c|d == c && oneBit(c^d)) {
25283 continue
25284 }
25285 v.reset(OpEq16)
25286 v0 := b.NewValue0(v.Pos, OpOr16, x.Type)
25287 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
25288 v1.AuxInt = int16ToAuxInt(c ^ d)
25289 v0.AddArg2(x, v1)
25290 v.AddArg2(v0, cv)
25291 return true
25292 }
25293 }
25294 }
25295 break
25296 }
25297
25298
25299
25300 for {
25301 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25302 if v_0.Op != OpEq8 {
25303 continue
25304 }
25305 _ = v_0.Args[1]
25306 v_0_0 := v_0.Args[0]
25307 v_0_1 := v_0.Args[1]
25308 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
25309 x := v_0_0
25310 cv := v_0_1
25311 if cv.Op != OpConst8 {
25312 continue
25313 }
25314 c := auxIntToInt8(cv.AuxInt)
25315 if v_1.Op != OpEq8 {
25316 continue
25317 }
25318 _ = v_1.Args[1]
25319 v_1_0 := v_1.Args[0]
25320 v_1_1 := v_1.Args[1]
25321 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
25322 if x != v_1_0 || v_1_1.Op != OpConst8 {
25323 continue
25324 }
25325 d := auxIntToInt8(v_1_1.AuxInt)
25326 if !(c|d == c && oneBit(c^d)) {
25327 continue
25328 }
25329 v.reset(OpEq8)
25330 v0 := b.NewValue0(v.Pos, OpOr8, x.Type)
25331 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
25332 v1.AuxInt = int8ToAuxInt(c ^ d)
25333 v0.AddArg2(x, v1)
25334 v.AddArg2(v0, cv)
25335 return true
25336 }
25337 }
25338 }
25339 break
25340 }
25341
25342
25343 for {
25344 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25345 if v_0.Op != OpNeq64F {
25346 continue
25347 }
25348 x := v_0.Args[1]
25349 if x != v_0.Args[0] || v_1.Op != OpLess64F {
25350 continue
25351 }
25352 _ = v_1.Args[1]
25353 if x != v_1.Args[0] {
25354 continue
25355 }
25356 y := v_1.Args[1]
25357 if y.Op != OpConst64F {
25358 continue
25359 }
25360 v.reset(OpNot)
25361 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
25362 v0.AddArg2(y, x)
25363 v.AddArg(v0)
25364 return true
25365 }
25366 break
25367 }
25368
25369
25370 for {
25371 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25372 if v_0.Op != OpNeq64F {
25373 continue
25374 }
25375 x := v_0.Args[1]
25376 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
25377 continue
25378 }
25379 _ = v_1.Args[1]
25380 if x != v_1.Args[0] {
25381 continue
25382 }
25383 y := v_1.Args[1]
25384 if y.Op != OpConst64F {
25385 continue
25386 }
25387 v.reset(OpNot)
25388 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
25389 v0.AddArg2(y, x)
25390 v.AddArg(v0)
25391 return true
25392 }
25393 break
25394 }
25395
25396
25397 for {
25398 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25399 if v_0.Op != OpNeq64F {
25400 continue
25401 }
25402 x := v_0.Args[1]
25403 if x != v_0.Args[0] || v_1.Op != OpLess64F {
25404 continue
25405 }
25406 _ = v_1.Args[1]
25407 y := v_1.Args[0]
25408 if y.Op != OpConst64F {
25409 continue
25410 }
25411 if x != v_1.Args[1] {
25412 continue
25413 }
25414 v.reset(OpNot)
25415 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
25416 v0.AddArg2(x, y)
25417 v.AddArg(v0)
25418 return true
25419 }
25420 break
25421 }
25422
25423
25424 for {
25425 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25426 if v_0.Op != OpNeq64F {
25427 continue
25428 }
25429 x := v_0.Args[1]
25430 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
25431 continue
25432 }
25433 _ = v_1.Args[1]
25434 y := v_1.Args[0]
25435 if y.Op != OpConst64F {
25436 continue
25437 }
25438 if x != v_1.Args[1] {
25439 continue
25440 }
25441 v.reset(OpNot)
25442 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
25443 v0.AddArg2(x, y)
25444 v.AddArg(v0)
25445 return true
25446 }
25447 break
25448 }
25449
25450
25451 for {
25452 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25453 if v_0.Op != OpNeq32F {
25454 continue
25455 }
25456 x := v_0.Args[1]
25457 if x != v_0.Args[0] || v_1.Op != OpLess32F {
25458 continue
25459 }
25460 _ = v_1.Args[1]
25461 if x != v_1.Args[0] {
25462 continue
25463 }
25464 y := v_1.Args[1]
25465 if y.Op != OpConst32F {
25466 continue
25467 }
25468 v.reset(OpNot)
25469 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
25470 v0.AddArg2(y, x)
25471 v.AddArg(v0)
25472 return true
25473 }
25474 break
25475 }
25476
25477
25478 for {
25479 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25480 if v_0.Op != OpNeq32F {
25481 continue
25482 }
25483 x := v_0.Args[1]
25484 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
25485 continue
25486 }
25487 _ = v_1.Args[1]
25488 if x != v_1.Args[0] {
25489 continue
25490 }
25491 y := v_1.Args[1]
25492 if y.Op != OpConst32F {
25493 continue
25494 }
25495 v.reset(OpNot)
25496 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
25497 v0.AddArg2(y, x)
25498 v.AddArg(v0)
25499 return true
25500 }
25501 break
25502 }
25503
25504
25505 for {
25506 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25507 if v_0.Op != OpNeq32F {
25508 continue
25509 }
25510 x := v_0.Args[1]
25511 if x != v_0.Args[0] || v_1.Op != OpLess32F {
25512 continue
25513 }
25514 _ = v_1.Args[1]
25515 y := v_1.Args[0]
25516 if y.Op != OpConst32F {
25517 continue
25518 }
25519 if x != v_1.Args[1] {
25520 continue
25521 }
25522 v.reset(OpNot)
25523 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
25524 v0.AddArg2(x, y)
25525 v.AddArg(v0)
25526 return true
25527 }
25528 break
25529 }
25530
25531
25532 for {
25533 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25534 if v_0.Op != OpNeq32F {
25535 continue
25536 }
25537 x := v_0.Args[1]
25538 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
25539 continue
25540 }
25541 _ = v_1.Args[1]
25542 y := v_1.Args[0]
25543 if y.Op != OpConst32F {
25544 continue
25545 }
25546 if x != v_1.Args[1] {
25547 continue
25548 }
25549 v.reset(OpNot)
25550 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
25551 v0.AddArg2(x, y)
25552 v.AddArg(v0)
25553 return true
25554 }
25555 break
25556 }
25557
25558
25559 for {
25560 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25561 if v_0.Op != OpNeq64F {
25562 continue
25563 }
25564 x := v_0.Args[1]
25565 if x != v_0.Args[0] || v_1.Op != OpLess64F {
25566 continue
25567 }
25568 _ = v_1.Args[1]
25569 abs := v_1.Args[0]
25570 if abs.Op != OpAbs || x != abs.Args[0] {
25571 continue
25572 }
25573 y := v_1.Args[1]
25574 if y.Op != OpConst64F {
25575 continue
25576 }
25577 v.reset(OpNot)
25578 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
25579 v0.AddArg2(y, abs)
25580 v.AddArg(v0)
25581 return true
25582 }
25583 break
25584 }
25585
25586
25587 for {
25588 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25589 if v_0.Op != OpNeq64F {
25590 continue
25591 }
25592 x := v_0.Args[1]
25593 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
25594 continue
25595 }
25596 _ = v_1.Args[1]
25597 abs := v_1.Args[0]
25598 if abs.Op != OpAbs || x != abs.Args[0] {
25599 continue
25600 }
25601 y := v_1.Args[1]
25602 if y.Op != OpConst64F {
25603 continue
25604 }
25605 v.reset(OpNot)
25606 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
25607 v0.AddArg2(y, abs)
25608 v.AddArg(v0)
25609 return true
25610 }
25611 break
25612 }
25613
25614
25615 for {
25616 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25617 if v_0.Op != OpNeq64F {
25618 continue
25619 }
25620 x := v_0.Args[1]
25621 if x != v_0.Args[0] || v_1.Op != OpLess64F {
25622 continue
25623 }
25624 _ = v_1.Args[1]
25625 y := v_1.Args[0]
25626 if y.Op != OpConst64F {
25627 continue
25628 }
25629 abs := v_1.Args[1]
25630 if abs.Op != OpAbs || x != abs.Args[0] {
25631 continue
25632 }
25633 v.reset(OpNot)
25634 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
25635 v0.AddArg2(abs, y)
25636 v.AddArg(v0)
25637 return true
25638 }
25639 break
25640 }
25641
25642
25643 for {
25644 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25645 if v_0.Op != OpNeq64F {
25646 continue
25647 }
25648 x := v_0.Args[1]
25649 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
25650 continue
25651 }
25652 _ = v_1.Args[1]
25653 y := v_1.Args[0]
25654 if y.Op != OpConst64F {
25655 continue
25656 }
25657 abs := v_1.Args[1]
25658 if abs.Op != OpAbs || x != abs.Args[0] {
25659 continue
25660 }
25661 v.reset(OpNot)
25662 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
25663 v0.AddArg2(abs, y)
25664 v.AddArg(v0)
25665 return true
25666 }
25667 break
25668 }
25669
25670
25671 for {
25672 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25673 if v_0.Op != OpNeq64F {
25674 continue
25675 }
25676 x := v_0.Args[1]
25677 if x != v_0.Args[0] || v_1.Op != OpLess64F {
25678 continue
25679 }
25680 _ = v_1.Args[1]
25681 neg := v_1.Args[0]
25682 if neg.Op != OpNeg64F || x != neg.Args[0] {
25683 continue
25684 }
25685 y := v_1.Args[1]
25686 if y.Op != OpConst64F {
25687 continue
25688 }
25689 v.reset(OpNot)
25690 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
25691 v0.AddArg2(y, neg)
25692 v.AddArg(v0)
25693 return true
25694 }
25695 break
25696 }
25697
25698
25699 for {
25700 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25701 if v_0.Op != OpNeq64F {
25702 continue
25703 }
25704 x := v_0.Args[1]
25705 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
25706 continue
25707 }
25708 _ = v_1.Args[1]
25709 neg := v_1.Args[0]
25710 if neg.Op != OpNeg64F || x != neg.Args[0] {
25711 continue
25712 }
25713 y := v_1.Args[1]
25714 if y.Op != OpConst64F {
25715 continue
25716 }
25717 v.reset(OpNot)
25718 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
25719 v0.AddArg2(y, neg)
25720 v.AddArg(v0)
25721 return true
25722 }
25723 break
25724 }
25725
25726
25727 for {
25728 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25729 if v_0.Op != OpNeq64F {
25730 continue
25731 }
25732 x := v_0.Args[1]
25733 if x != v_0.Args[0] || v_1.Op != OpLess64F {
25734 continue
25735 }
25736 _ = v_1.Args[1]
25737 y := v_1.Args[0]
25738 if y.Op != OpConst64F {
25739 continue
25740 }
25741 neg := v_1.Args[1]
25742 if neg.Op != OpNeg64F || x != neg.Args[0] {
25743 continue
25744 }
25745 v.reset(OpNot)
25746 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
25747 v0.AddArg2(neg, y)
25748 v.AddArg(v0)
25749 return true
25750 }
25751 break
25752 }
25753
25754
25755 for {
25756 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25757 if v_0.Op != OpNeq64F {
25758 continue
25759 }
25760 x := v_0.Args[1]
25761 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
25762 continue
25763 }
25764 _ = v_1.Args[1]
25765 y := v_1.Args[0]
25766 if y.Op != OpConst64F {
25767 continue
25768 }
25769 neg := v_1.Args[1]
25770 if neg.Op != OpNeg64F || x != neg.Args[0] {
25771 continue
25772 }
25773 v.reset(OpNot)
25774 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
25775 v0.AddArg2(neg, y)
25776 v.AddArg(v0)
25777 return true
25778 }
25779 break
25780 }
25781
25782
25783 for {
25784 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25785 if v_0.Op != OpNeq32F {
25786 continue
25787 }
25788 x := v_0.Args[1]
25789 if x != v_0.Args[0] || v_1.Op != OpLess32F {
25790 continue
25791 }
25792 _ = v_1.Args[1]
25793 neg := v_1.Args[0]
25794 if neg.Op != OpNeg32F || x != neg.Args[0] {
25795 continue
25796 }
25797 y := v_1.Args[1]
25798 if y.Op != OpConst32F {
25799 continue
25800 }
25801 v.reset(OpNot)
25802 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
25803 v0.AddArg2(y, neg)
25804 v.AddArg(v0)
25805 return true
25806 }
25807 break
25808 }
25809
25810
25811 for {
25812 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25813 if v_0.Op != OpNeq32F {
25814 continue
25815 }
25816 x := v_0.Args[1]
25817 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
25818 continue
25819 }
25820 _ = v_1.Args[1]
25821 neg := v_1.Args[0]
25822 if neg.Op != OpNeg32F || x != neg.Args[0] {
25823 continue
25824 }
25825 y := v_1.Args[1]
25826 if y.Op != OpConst32F {
25827 continue
25828 }
25829 v.reset(OpNot)
25830 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
25831 v0.AddArg2(y, neg)
25832 v.AddArg(v0)
25833 return true
25834 }
25835 break
25836 }
25837
25838
25839 for {
25840 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25841 if v_0.Op != OpNeq32F {
25842 continue
25843 }
25844 x := v_0.Args[1]
25845 if x != v_0.Args[0] || v_1.Op != OpLess32F {
25846 continue
25847 }
25848 _ = v_1.Args[1]
25849 y := v_1.Args[0]
25850 if y.Op != OpConst32F {
25851 continue
25852 }
25853 neg := v_1.Args[1]
25854 if neg.Op != OpNeg32F || x != neg.Args[0] {
25855 continue
25856 }
25857 v.reset(OpNot)
25858 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
25859 v0.AddArg2(neg, y)
25860 v.AddArg(v0)
25861 return true
25862 }
25863 break
25864 }
25865
25866
25867 for {
25868 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25869 if v_0.Op != OpNeq32F {
25870 continue
25871 }
25872 x := v_0.Args[1]
25873 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
25874 continue
25875 }
25876 _ = v_1.Args[1]
25877 y := v_1.Args[0]
25878 if y.Op != OpConst32F {
25879 continue
25880 }
25881 neg := v_1.Args[1]
25882 if neg.Op != OpNeg32F || x != neg.Args[0] {
25883 continue
25884 }
25885 v.reset(OpNot)
25886 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
25887 v0.AddArg2(neg, y)
25888 v.AddArg(v0)
25889 return true
25890 }
25891 break
25892 }
25893 return false
25894 }
25895 func rewriteValuegeneric_OpPhi(v *Value) bool {
25896 b := v.Block
25897
25898
25899 for {
25900 if len(v.Args) != 2 {
25901 break
25902 }
25903 _ = v.Args[1]
25904 v_0 := v.Args[0]
25905 if v_0.Op != OpConst8 {
25906 break
25907 }
25908 c := auxIntToInt8(v_0.AuxInt)
25909 v_1 := v.Args[1]
25910 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != c {
25911 break
25912 }
25913 v.reset(OpConst8)
25914 v.AuxInt = int8ToAuxInt(c)
25915 return true
25916 }
25917
25918
25919 for {
25920 if len(v.Args) != 2 {
25921 break
25922 }
25923 _ = v.Args[1]
25924 v_0 := v.Args[0]
25925 if v_0.Op != OpConst16 {
25926 break
25927 }
25928 c := auxIntToInt16(v_0.AuxInt)
25929 v_1 := v.Args[1]
25930 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != c {
25931 break
25932 }
25933 v.reset(OpConst16)
25934 v.AuxInt = int16ToAuxInt(c)
25935 return true
25936 }
25937
25938
25939 for {
25940 if len(v.Args) != 2 {
25941 break
25942 }
25943 _ = v.Args[1]
25944 v_0 := v.Args[0]
25945 if v_0.Op != OpConst32 {
25946 break
25947 }
25948 c := auxIntToInt32(v_0.AuxInt)
25949 v_1 := v.Args[1]
25950 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != c {
25951 break
25952 }
25953 v.reset(OpConst32)
25954 v.AuxInt = int32ToAuxInt(c)
25955 return true
25956 }
25957
25958
25959 for {
25960 if len(v.Args) != 2 {
25961 break
25962 }
25963 _ = v.Args[1]
25964 v_0 := v.Args[0]
25965 if v_0.Op != OpConst64 {
25966 break
25967 }
25968 c := auxIntToInt64(v_0.AuxInt)
25969 v_1 := v.Args[1]
25970 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c {
25971 break
25972 }
25973 v.reset(OpConst64)
25974 v.AuxInt = int64ToAuxInt(c)
25975 return true
25976 }
25977
25978
25979
25980 for {
25981 if len(v.Args) != 2 {
25982 break
25983 }
25984 t := v.Type
25985 _ = v.Args[1]
25986 nx := v.Args[0]
25987 if nx.Op != OpNot {
25988 break
25989 }
25990 x := nx.Args[0]
25991 ny := v.Args[1]
25992 if ny.Op != OpNot {
25993 break
25994 }
25995 y := ny.Args[0]
25996 if !(nx.Uses == 1 && ny.Uses == 1) {
25997 break
25998 }
25999 v.reset(OpNot)
26000 v0 := b.NewValue0(v.Pos, OpPhi, t)
26001 v0.AddArg2(x, y)
26002 v.AddArg(v0)
26003 return true
26004 }
26005 return false
26006 }
26007 func rewriteValuegeneric_OpPopCount16(v *Value) bool {
26008 v_0 := v.Args[0]
26009 b := v.Block
26010 config := b.Func.Config
26011
26012
26013
26014 for {
26015 if v_0.Op != OpConst16 {
26016 break
26017 }
26018 c := auxIntToInt16(v_0.AuxInt)
26019 if !(config.PtrSize == 8) {
26020 break
26021 }
26022 v.reset(OpConst64)
26023 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount16(uint16(c))))
26024 return true
26025 }
26026
26027
26028
26029 for {
26030 if v_0.Op != OpConst16 {
26031 break
26032 }
26033 c := auxIntToInt16(v_0.AuxInt)
26034 if !(config.PtrSize == 4) {
26035 break
26036 }
26037 v.reset(OpConst32)
26038 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount16(uint16(c))))
26039 return true
26040 }
26041 return false
26042 }
26043 func rewriteValuegeneric_OpPopCount32(v *Value) bool {
26044 v_0 := v.Args[0]
26045 b := v.Block
26046 config := b.Func.Config
26047
26048
26049
26050 for {
26051 if v_0.Op != OpConst32 {
26052 break
26053 }
26054 c := auxIntToInt32(v_0.AuxInt)
26055 if !(config.PtrSize == 8) {
26056 break
26057 }
26058 v.reset(OpConst64)
26059 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount32(uint32(c))))
26060 return true
26061 }
26062
26063
26064
26065 for {
26066 if v_0.Op != OpConst32 {
26067 break
26068 }
26069 c := auxIntToInt32(v_0.AuxInt)
26070 if !(config.PtrSize == 4) {
26071 break
26072 }
26073 v.reset(OpConst32)
26074 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount32(uint32(c))))
26075 return true
26076 }
26077 return false
26078 }
26079 func rewriteValuegeneric_OpPopCount64(v *Value) bool {
26080 v_0 := v.Args[0]
26081 b := v.Block
26082 config := b.Func.Config
26083
26084
26085
26086 for {
26087 if v_0.Op != OpConst64 {
26088 break
26089 }
26090 c := auxIntToInt64(v_0.AuxInt)
26091 if !(config.PtrSize == 8) {
26092 break
26093 }
26094 v.reset(OpConst64)
26095 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount64(uint64(c))))
26096 return true
26097 }
26098
26099
26100
26101 for {
26102 if v_0.Op != OpConst64 {
26103 break
26104 }
26105 c := auxIntToInt64(v_0.AuxInt)
26106 if !(config.PtrSize == 4) {
26107 break
26108 }
26109 v.reset(OpConst32)
26110 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount64(uint64(c))))
26111 return true
26112 }
26113 return false
26114 }
26115 func rewriteValuegeneric_OpPopCount8(v *Value) bool {
26116 v_0 := v.Args[0]
26117 b := v.Block
26118 config := b.Func.Config
26119
26120
26121
26122 for {
26123 if v_0.Op != OpConst8 {
26124 break
26125 }
26126 c := auxIntToInt8(v_0.AuxInt)
26127 if !(config.PtrSize == 8) {
26128 break
26129 }
26130 v.reset(OpConst64)
26131 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount8(uint8(c))))
26132 return true
26133 }
26134
26135
26136
26137 for {
26138 if v_0.Op != OpConst8 {
26139 break
26140 }
26141 c := auxIntToInt8(v_0.AuxInt)
26142 if !(config.PtrSize == 4) {
26143 break
26144 }
26145 v.reset(OpConst32)
26146 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount8(uint8(c))))
26147 return true
26148 }
26149 return false
26150 }
26151 func rewriteValuegeneric_OpPtrIndex(v *Value) bool {
26152 v_1 := v.Args[1]
26153 v_0 := v.Args[0]
26154 b := v.Block
26155 config := b.Func.Config
26156 typ := &b.Func.Config.Types
26157
26158
26159
26160 for {
26161 t := v.Type
26162 ptr := v_0
26163 idx := v_1
26164 if !(config.PtrSize == 4 && is32Bit(t.Elem().Size())) {
26165 break
26166 }
26167 v.reset(OpAddPtr)
26168 v0 := b.NewValue0(v.Pos, OpMul32, typ.Int)
26169 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
26170 v1.AuxInt = int32ToAuxInt(int32(t.Elem().Size()))
26171 v0.AddArg2(idx, v1)
26172 v.AddArg2(ptr, v0)
26173 return true
26174 }
26175
26176
26177
26178 for {
26179 t := v.Type
26180 ptr := v_0
26181 idx := v_1
26182 if !(config.PtrSize == 8) {
26183 break
26184 }
26185 v.reset(OpAddPtr)
26186 v0 := b.NewValue0(v.Pos, OpMul64, typ.Int)
26187 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
26188 v1.AuxInt = int64ToAuxInt(t.Elem().Size())
26189 v0.AddArg2(idx, v1)
26190 v.AddArg2(ptr, v0)
26191 return true
26192 }
26193 return false
26194 }
26195 func rewriteValuegeneric_OpRotateLeft16(v *Value) bool {
26196 v_1 := v.Args[1]
26197 v_0 := v.Args[0]
26198 b := v.Block
26199 config := b.Func.Config
26200
26201
26202
26203 for {
26204 x := v_0
26205 if v_1.Op != OpConst16 {
26206 break
26207 }
26208 c := auxIntToInt16(v_1.AuxInt)
26209 if !(c%16 == 0) {
26210 break
26211 }
26212 v.copyOf(x)
26213 return true
26214 }
26215
26216
26217
26218 for {
26219 x := v_0
26220 if v_1.Op != OpAnd64 {
26221 break
26222 }
26223 _ = v_1.Args[1]
26224 v_1_0 := v_1.Args[0]
26225 v_1_1 := v_1.Args[1]
26226 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26227 y := v_1_0
26228 if v_1_1.Op != OpConst64 {
26229 continue
26230 }
26231 c := auxIntToInt64(v_1_1.AuxInt)
26232 if !(c&15 == 15) {
26233 continue
26234 }
26235 v.reset(OpRotateLeft16)
26236 v.AddArg2(x, y)
26237 return true
26238 }
26239 break
26240 }
26241
26242
26243
26244 for {
26245 x := v_0
26246 if v_1.Op != OpAnd32 {
26247 break
26248 }
26249 _ = v_1.Args[1]
26250 v_1_0 := v_1.Args[0]
26251 v_1_1 := v_1.Args[1]
26252 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26253 y := v_1_0
26254 if v_1_1.Op != OpConst32 {
26255 continue
26256 }
26257 c := auxIntToInt32(v_1_1.AuxInt)
26258 if !(c&15 == 15) {
26259 continue
26260 }
26261 v.reset(OpRotateLeft16)
26262 v.AddArg2(x, y)
26263 return true
26264 }
26265 break
26266 }
26267
26268
26269
26270 for {
26271 x := v_0
26272 if v_1.Op != OpAnd16 {
26273 break
26274 }
26275 _ = v_1.Args[1]
26276 v_1_0 := v_1.Args[0]
26277 v_1_1 := v_1.Args[1]
26278 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26279 y := v_1_0
26280 if v_1_1.Op != OpConst16 {
26281 continue
26282 }
26283 c := auxIntToInt16(v_1_1.AuxInt)
26284 if !(c&15 == 15) {
26285 continue
26286 }
26287 v.reset(OpRotateLeft16)
26288 v.AddArg2(x, y)
26289 return true
26290 }
26291 break
26292 }
26293
26294
26295
26296 for {
26297 x := v_0
26298 if v_1.Op != OpAnd8 {
26299 break
26300 }
26301 _ = v_1.Args[1]
26302 v_1_0 := v_1.Args[0]
26303 v_1_1 := v_1.Args[1]
26304 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26305 y := v_1_0
26306 if v_1_1.Op != OpConst8 {
26307 continue
26308 }
26309 c := auxIntToInt8(v_1_1.AuxInt)
26310 if !(c&15 == 15) {
26311 continue
26312 }
26313 v.reset(OpRotateLeft16)
26314 v.AddArg2(x, y)
26315 return true
26316 }
26317 break
26318 }
26319
26320
26321
26322 for {
26323 x := v_0
26324 if v_1.Op != OpNeg64 {
26325 break
26326 }
26327 v_1_0 := v_1.Args[0]
26328 if v_1_0.Op != OpAnd64 {
26329 break
26330 }
26331 _ = v_1_0.Args[1]
26332 v_1_0_0 := v_1_0.Args[0]
26333 v_1_0_1 := v_1_0.Args[1]
26334 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26335 y := v_1_0_0
26336 if v_1_0_1.Op != OpConst64 {
26337 continue
26338 }
26339 c := auxIntToInt64(v_1_0_1.AuxInt)
26340 if !(c&15 == 15) {
26341 continue
26342 }
26343 v.reset(OpRotateLeft16)
26344 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26345 v0.AddArg(y)
26346 v.AddArg2(x, v0)
26347 return true
26348 }
26349 break
26350 }
26351
26352
26353
26354 for {
26355 x := v_0
26356 if v_1.Op != OpNeg32 {
26357 break
26358 }
26359 v_1_0 := v_1.Args[0]
26360 if v_1_0.Op != OpAnd32 {
26361 break
26362 }
26363 _ = v_1_0.Args[1]
26364 v_1_0_0 := v_1_0.Args[0]
26365 v_1_0_1 := v_1_0.Args[1]
26366 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26367 y := v_1_0_0
26368 if v_1_0_1.Op != OpConst32 {
26369 continue
26370 }
26371 c := auxIntToInt32(v_1_0_1.AuxInt)
26372 if !(c&15 == 15) {
26373 continue
26374 }
26375 v.reset(OpRotateLeft16)
26376 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26377 v0.AddArg(y)
26378 v.AddArg2(x, v0)
26379 return true
26380 }
26381 break
26382 }
26383
26384
26385
26386 for {
26387 x := v_0
26388 if v_1.Op != OpNeg16 {
26389 break
26390 }
26391 v_1_0 := v_1.Args[0]
26392 if v_1_0.Op != OpAnd16 {
26393 break
26394 }
26395 _ = v_1_0.Args[1]
26396 v_1_0_0 := v_1_0.Args[0]
26397 v_1_0_1 := v_1_0.Args[1]
26398 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26399 y := v_1_0_0
26400 if v_1_0_1.Op != OpConst16 {
26401 continue
26402 }
26403 c := auxIntToInt16(v_1_0_1.AuxInt)
26404 if !(c&15 == 15) {
26405 continue
26406 }
26407 v.reset(OpRotateLeft16)
26408 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
26409 v0.AddArg(y)
26410 v.AddArg2(x, v0)
26411 return true
26412 }
26413 break
26414 }
26415
26416
26417
26418 for {
26419 x := v_0
26420 if v_1.Op != OpNeg8 {
26421 break
26422 }
26423 v_1_0 := v_1.Args[0]
26424 if v_1_0.Op != OpAnd8 {
26425 break
26426 }
26427 _ = v_1_0.Args[1]
26428 v_1_0_0 := v_1_0.Args[0]
26429 v_1_0_1 := v_1_0.Args[1]
26430 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26431 y := v_1_0_0
26432 if v_1_0_1.Op != OpConst8 {
26433 continue
26434 }
26435 c := auxIntToInt8(v_1_0_1.AuxInt)
26436 if !(c&15 == 15) {
26437 continue
26438 }
26439 v.reset(OpRotateLeft16)
26440 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
26441 v0.AddArg(y)
26442 v.AddArg2(x, v0)
26443 return true
26444 }
26445 break
26446 }
26447
26448
26449
26450 for {
26451 x := v_0
26452 if v_1.Op != OpAdd64 {
26453 break
26454 }
26455 _ = v_1.Args[1]
26456 v_1_0 := v_1.Args[0]
26457 v_1_1 := v_1.Args[1]
26458 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26459 y := v_1_0
26460 if v_1_1.Op != OpConst64 {
26461 continue
26462 }
26463 c := auxIntToInt64(v_1_1.AuxInt)
26464 if !(c&15 == 0) {
26465 continue
26466 }
26467 v.reset(OpRotateLeft16)
26468 v.AddArg2(x, y)
26469 return true
26470 }
26471 break
26472 }
26473
26474
26475
26476 for {
26477 x := v_0
26478 if v_1.Op != OpAdd32 {
26479 break
26480 }
26481 _ = v_1.Args[1]
26482 v_1_0 := v_1.Args[0]
26483 v_1_1 := v_1.Args[1]
26484 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26485 y := v_1_0
26486 if v_1_1.Op != OpConst32 {
26487 continue
26488 }
26489 c := auxIntToInt32(v_1_1.AuxInt)
26490 if !(c&15 == 0) {
26491 continue
26492 }
26493 v.reset(OpRotateLeft16)
26494 v.AddArg2(x, y)
26495 return true
26496 }
26497 break
26498 }
26499
26500
26501
26502 for {
26503 x := v_0
26504 if v_1.Op != OpAdd16 {
26505 break
26506 }
26507 _ = v_1.Args[1]
26508 v_1_0 := v_1.Args[0]
26509 v_1_1 := v_1.Args[1]
26510 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26511 y := v_1_0
26512 if v_1_1.Op != OpConst16 {
26513 continue
26514 }
26515 c := auxIntToInt16(v_1_1.AuxInt)
26516 if !(c&15 == 0) {
26517 continue
26518 }
26519 v.reset(OpRotateLeft16)
26520 v.AddArg2(x, y)
26521 return true
26522 }
26523 break
26524 }
26525
26526
26527
26528 for {
26529 x := v_0
26530 if v_1.Op != OpAdd8 {
26531 break
26532 }
26533 _ = v_1.Args[1]
26534 v_1_0 := v_1.Args[0]
26535 v_1_1 := v_1.Args[1]
26536 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26537 y := v_1_0
26538 if v_1_1.Op != OpConst8 {
26539 continue
26540 }
26541 c := auxIntToInt8(v_1_1.AuxInt)
26542 if !(c&15 == 0) {
26543 continue
26544 }
26545 v.reset(OpRotateLeft16)
26546 v.AddArg2(x, y)
26547 return true
26548 }
26549 break
26550 }
26551
26552
26553
26554 for {
26555 x := v_0
26556 if v_1.Op != OpSub64 {
26557 break
26558 }
26559 y := v_1.Args[1]
26560 v_1_0 := v_1.Args[0]
26561 if v_1_0.Op != OpConst64 {
26562 break
26563 }
26564 c := auxIntToInt64(v_1_0.AuxInt)
26565 if !(c&15 == 0) {
26566 break
26567 }
26568 v.reset(OpRotateLeft16)
26569 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26570 v0.AddArg(y)
26571 v.AddArg2(x, v0)
26572 return true
26573 }
26574
26575
26576
26577 for {
26578 x := v_0
26579 if v_1.Op != OpSub32 {
26580 break
26581 }
26582 y := v_1.Args[1]
26583 v_1_0 := v_1.Args[0]
26584 if v_1_0.Op != OpConst32 {
26585 break
26586 }
26587 c := auxIntToInt32(v_1_0.AuxInt)
26588 if !(c&15 == 0) {
26589 break
26590 }
26591 v.reset(OpRotateLeft16)
26592 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26593 v0.AddArg(y)
26594 v.AddArg2(x, v0)
26595 return true
26596 }
26597
26598
26599
26600 for {
26601 x := v_0
26602 if v_1.Op != OpSub16 {
26603 break
26604 }
26605 y := v_1.Args[1]
26606 v_1_0 := v_1.Args[0]
26607 if v_1_0.Op != OpConst16 {
26608 break
26609 }
26610 c := auxIntToInt16(v_1_0.AuxInt)
26611 if !(c&15 == 0) {
26612 break
26613 }
26614 v.reset(OpRotateLeft16)
26615 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
26616 v0.AddArg(y)
26617 v.AddArg2(x, v0)
26618 return true
26619 }
26620
26621
26622
26623 for {
26624 x := v_0
26625 if v_1.Op != OpSub8 {
26626 break
26627 }
26628 y := v_1.Args[1]
26629 v_1_0 := v_1.Args[0]
26630 if v_1_0.Op != OpConst8 {
26631 break
26632 }
26633 c := auxIntToInt8(v_1_0.AuxInt)
26634 if !(c&15 == 0) {
26635 break
26636 }
26637 v.reset(OpRotateLeft16)
26638 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
26639 v0.AddArg(y)
26640 v.AddArg2(x, v0)
26641 return true
26642 }
26643
26644
26645
26646 for {
26647 x := v_0
26648 if v_1.Op != OpConst64 {
26649 break
26650 }
26651 t := v_1.Type
26652 c := auxIntToInt64(v_1.AuxInt)
26653 if !(config.PtrSize == 4) {
26654 break
26655 }
26656 v.reset(OpRotateLeft16)
26657 v0 := b.NewValue0(v.Pos, OpConst32, t)
26658 v0.AuxInt = int32ToAuxInt(int32(c))
26659 v.AddArg2(x, v0)
26660 return true
26661 }
26662
26663
26664
26665 for {
26666 if v_0.Op != OpRotateLeft16 {
26667 break
26668 }
26669 c := v_0.Args[1]
26670 x := v_0.Args[0]
26671 d := v_1
26672 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
26673 break
26674 }
26675 v.reset(OpRotateLeft16)
26676 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
26677 v0.AddArg2(c, d)
26678 v.AddArg2(x, v0)
26679 return true
26680 }
26681
26682
26683
26684 for {
26685 if v_0.Op != OpRotateLeft16 {
26686 break
26687 }
26688 c := v_0.Args[1]
26689 x := v_0.Args[0]
26690 d := v_1
26691 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
26692 break
26693 }
26694 v.reset(OpRotateLeft16)
26695 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
26696 v0.AddArg2(c, d)
26697 v.AddArg2(x, v0)
26698 return true
26699 }
26700
26701
26702
26703 for {
26704 if v_0.Op != OpRotateLeft16 {
26705 break
26706 }
26707 c := v_0.Args[1]
26708 x := v_0.Args[0]
26709 d := v_1
26710 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
26711 break
26712 }
26713 v.reset(OpRotateLeft16)
26714 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
26715 v0.AddArg2(c, d)
26716 v.AddArg2(x, v0)
26717 return true
26718 }
26719
26720
26721
26722 for {
26723 if v_0.Op != OpRotateLeft16 {
26724 break
26725 }
26726 c := v_0.Args[1]
26727 x := v_0.Args[0]
26728 d := v_1
26729 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
26730 break
26731 }
26732 v.reset(OpRotateLeft16)
26733 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
26734 v0.AddArg2(c, d)
26735 v.AddArg2(x, v0)
26736 return true
26737 }
26738 return false
26739 }
26740 func rewriteValuegeneric_OpRotateLeft32(v *Value) bool {
26741 v_1 := v.Args[1]
26742 v_0 := v.Args[0]
26743 b := v.Block
26744 config := b.Func.Config
26745
26746
26747
26748 for {
26749 x := v_0
26750 if v_1.Op != OpConst32 {
26751 break
26752 }
26753 c := auxIntToInt32(v_1.AuxInt)
26754 if !(c%32 == 0) {
26755 break
26756 }
26757 v.copyOf(x)
26758 return true
26759 }
26760
26761
26762
26763 for {
26764 x := v_0
26765 if v_1.Op != OpAnd64 {
26766 break
26767 }
26768 _ = v_1.Args[1]
26769 v_1_0 := v_1.Args[0]
26770 v_1_1 := v_1.Args[1]
26771 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26772 y := v_1_0
26773 if v_1_1.Op != OpConst64 {
26774 continue
26775 }
26776 c := auxIntToInt64(v_1_1.AuxInt)
26777 if !(c&31 == 31) {
26778 continue
26779 }
26780 v.reset(OpRotateLeft32)
26781 v.AddArg2(x, y)
26782 return true
26783 }
26784 break
26785 }
26786
26787
26788
26789 for {
26790 x := v_0
26791 if v_1.Op != OpAnd32 {
26792 break
26793 }
26794 _ = v_1.Args[1]
26795 v_1_0 := v_1.Args[0]
26796 v_1_1 := v_1.Args[1]
26797 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26798 y := v_1_0
26799 if v_1_1.Op != OpConst32 {
26800 continue
26801 }
26802 c := auxIntToInt32(v_1_1.AuxInt)
26803 if !(c&31 == 31) {
26804 continue
26805 }
26806 v.reset(OpRotateLeft32)
26807 v.AddArg2(x, y)
26808 return true
26809 }
26810 break
26811 }
26812
26813
26814
26815 for {
26816 x := v_0
26817 if v_1.Op != OpAnd16 {
26818 break
26819 }
26820 _ = v_1.Args[1]
26821 v_1_0 := v_1.Args[0]
26822 v_1_1 := v_1.Args[1]
26823 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26824 y := v_1_0
26825 if v_1_1.Op != OpConst16 {
26826 continue
26827 }
26828 c := auxIntToInt16(v_1_1.AuxInt)
26829 if !(c&31 == 31) {
26830 continue
26831 }
26832 v.reset(OpRotateLeft32)
26833 v.AddArg2(x, y)
26834 return true
26835 }
26836 break
26837 }
26838
26839
26840
26841 for {
26842 x := v_0
26843 if v_1.Op != OpAnd8 {
26844 break
26845 }
26846 _ = v_1.Args[1]
26847 v_1_0 := v_1.Args[0]
26848 v_1_1 := v_1.Args[1]
26849 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26850 y := v_1_0
26851 if v_1_1.Op != OpConst8 {
26852 continue
26853 }
26854 c := auxIntToInt8(v_1_1.AuxInt)
26855 if !(c&31 == 31) {
26856 continue
26857 }
26858 v.reset(OpRotateLeft32)
26859 v.AddArg2(x, y)
26860 return true
26861 }
26862 break
26863 }
26864
26865
26866
26867 for {
26868 x := v_0
26869 if v_1.Op != OpNeg64 {
26870 break
26871 }
26872 v_1_0 := v_1.Args[0]
26873 if v_1_0.Op != OpAnd64 {
26874 break
26875 }
26876 _ = v_1_0.Args[1]
26877 v_1_0_0 := v_1_0.Args[0]
26878 v_1_0_1 := v_1_0.Args[1]
26879 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26880 y := v_1_0_0
26881 if v_1_0_1.Op != OpConst64 {
26882 continue
26883 }
26884 c := auxIntToInt64(v_1_0_1.AuxInt)
26885 if !(c&31 == 31) {
26886 continue
26887 }
26888 v.reset(OpRotateLeft32)
26889 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26890 v0.AddArg(y)
26891 v.AddArg2(x, v0)
26892 return true
26893 }
26894 break
26895 }
26896
26897
26898
26899 for {
26900 x := v_0
26901 if v_1.Op != OpNeg32 {
26902 break
26903 }
26904 v_1_0 := v_1.Args[0]
26905 if v_1_0.Op != OpAnd32 {
26906 break
26907 }
26908 _ = v_1_0.Args[1]
26909 v_1_0_0 := v_1_0.Args[0]
26910 v_1_0_1 := v_1_0.Args[1]
26911 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26912 y := v_1_0_0
26913 if v_1_0_1.Op != OpConst32 {
26914 continue
26915 }
26916 c := auxIntToInt32(v_1_0_1.AuxInt)
26917 if !(c&31 == 31) {
26918 continue
26919 }
26920 v.reset(OpRotateLeft32)
26921 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26922 v0.AddArg(y)
26923 v.AddArg2(x, v0)
26924 return true
26925 }
26926 break
26927 }
26928
26929
26930
26931 for {
26932 x := v_0
26933 if v_1.Op != OpNeg16 {
26934 break
26935 }
26936 v_1_0 := v_1.Args[0]
26937 if v_1_0.Op != OpAnd16 {
26938 break
26939 }
26940 _ = v_1_0.Args[1]
26941 v_1_0_0 := v_1_0.Args[0]
26942 v_1_0_1 := v_1_0.Args[1]
26943 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26944 y := v_1_0_0
26945 if v_1_0_1.Op != OpConst16 {
26946 continue
26947 }
26948 c := auxIntToInt16(v_1_0_1.AuxInt)
26949 if !(c&31 == 31) {
26950 continue
26951 }
26952 v.reset(OpRotateLeft32)
26953 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
26954 v0.AddArg(y)
26955 v.AddArg2(x, v0)
26956 return true
26957 }
26958 break
26959 }
26960
26961
26962
26963 for {
26964 x := v_0
26965 if v_1.Op != OpNeg8 {
26966 break
26967 }
26968 v_1_0 := v_1.Args[0]
26969 if v_1_0.Op != OpAnd8 {
26970 break
26971 }
26972 _ = v_1_0.Args[1]
26973 v_1_0_0 := v_1_0.Args[0]
26974 v_1_0_1 := v_1_0.Args[1]
26975 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26976 y := v_1_0_0
26977 if v_1_0_1.Op != OpConst8 {
26978 continue
26979 }
26980 c := auxIntToInt8(v_1_0_1.AuxInt)
26981 if !(c&31 == 31) {
26982 continue
26983 }
26984 v.reset(OpRotateLeft32)
26985 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
26986 v0.AddArg(y)
26987 v.AddArg2(x, v0)
26988 return true
26989 }
26990 break
26991 }
26992
26993
26994
26995 for {
26996 x := v_0
26997 if v_1.Op != OpAdd64 {
26998 break
26999 }
27000 _ = v_1.Args[1]
27001 v_1_0 := v_1.Args[0]
27002 v_1_1 := v_1.Args[1]
27003 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27004 y := v_1_0
27005 if v_1_1.Op != OpConst64 {
27006 continue
27007 }
27008 c := auxIntToInt64(v_1_1.AuxInt)
27009 if !(c&31 == 0) {
27010 continue
27011 }
27012 v.reset(OpRotateLeft32)
27013 v.AddArg2(x, y)
27014 return true
27015 }
27016 break
27017 }
27018
27019
27020
27021 for {
27022 x := v_0
27023 if v_1.Op != OpAdd32 {
27024 break
27025 }
27026 _ = v_1.Args[1]
27027 v_1_0 := v_1.Args[0]
27028 v_1_1 := v_1.Args[1]
27029 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27030 y := v_1_0
27031 if v_1_1.Op != OpConst32 {
27032 continue
27033 }
27034 c := auxIntToInt32(v_1_1.AuxInt)
27035 if !(c&31 == 0) {
27036 continue
27037 }
27038 v.reset(OpRotateLeft32)
27039 v.AddArg2(x, y)
27040 return true
27041 }
27042 break
27043 }
27044
27045
27046
27047 for {
27048 x := v_0
27049 if v_1.Op != OpAdd16 {
27050 break
27051 }
27052 _ = v_1.Args[1]
27053 v_1_0 := v_1.Args[0]
27054 v_1_1 := v_1.Args[1]
27055 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27056 y := v_1_0
27057 if v_1_1.Op != OpConst16 {
27058 continue
27059 }
27060 c := auxIntToInt16(v_1_1.AuxInt)
27061 if !(c&31 == 0) {
27062 continue
27063 }
27064 v.reset(OpRotateLeft32)
27065 v.AddArg2(x, y)
27066 return true
27067 }
27068 break
27069 }
27070
27071
27072
27073 for {
27074 x := v_0
27075 if v_1.Op != OpAdd8 {
27076 break
27077 }
27078 _ = v_1.Args[1]
27079 v_1_0 := v_1.Args[0]
27080 v_1_1 := v_1.Args[1]
27081 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27082 y := v_1_0
27083 if v_1_1.Op != OpConst8 {
27084 continue
27085 }
27086 c := auxIntToInt8(v_1_1.AuxInt)
27087 if !(c&31 == 0) {
27088 continue
27089 }
27090 v.reset(OpRotateLeft32)
27091 v.AddArg2(x, y)
27092 return true
27093 }
27094 break
27095 }
27096
27097
27098
27099 for {
27100 x := v_0
27101 if v_1.Op != OpSub64 {
27102 break
27103 }
27104 y := v_1.Args[1]
27105 v_1_0 := v_1.Args[0]
27106 if v_1_0.Op != OpConst64 {
27107 break
27108 }
27109 c := auxIntToInt64(v_1_0.AuxInt)
27110 if !(c&31 == 0) {
27111 break
27112 }
27113 v.reset(OpRotateLeft32)
27114 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
27115 v0.AddArg(y)
27116 v.AddArg2(x, v0)
27117 return true
27118 }
27119
27120
27121
27122 for {
27123 x := v_0
27124 if v_1.Op != OpSub32 {
27125 break
27126 }
27127 y := v_1.Args[1]
27128 v_1_0 := v_1.Args[0]
27129 if v_1_0.Op != OpConst32 {
27130 break
27131 }
27132 c := auxIntToInt32(v_1_0.AuxInt)
27133 if !(c&31 == 0) {
27134 break
27135 }
27136 v.reset(OpRotateLeft32)
27137 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
27138 v0.AddArg(y)
27139 v.AddArg2(x, v0)
27140 return true
27141 }
27142
27143
27144
27145 for {
27146 x := v_0
27147 if v_1.Op != OpSub16 {
27148 break
27149 }
27150 y := v_1.Args[1]
27151 v_1_0 := v_1.Args[0]
27152 if v_1_0.Op != OpConst16 {
27153 break
27154 }
27155 c := auxIntToInt16(v_1_0.AuxInt)
27156 if !(c&31 == 0) {
27157 break
27158 }
27159 v.reset(OpRotateLeft32)
27160 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
27161 v0.AddArg(y)
27162 v.AddArg2(x, v0)
27163 return true
27164 }
27165
27166
27167
27168 for {
27169 x := v_0
27170 if v_1.Op != OpSub8 {
27171 break
27172 }
27173 y := v_1.Args[1]
27174 v_1_0 := v_1.Args[0]
27175 if v_1_0.Op != OpConst8 {
27176 break
27177 }
27178 c := auxIntToInt8(v_1_0.AuxInt)
27179 if !(c&31 == 0) {
27180 break
27181 }
27182 v.reset(OpRotateLeft32)
27183 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
27184 v0.AddArg(y)
27185 v.AddArg2(x, v0)
27186 return true
27187 }
27188
27189
27190
27191 for {
27192 x := v_0
27193 if v_1.Op != OpConst64 {
27194 break
27195 }
27196 t := v_1.Type
27197 c := auxIntToInt64(v_1.AuxInt)
27198 if !(config.PtrSize == 4) {
27199 break
27200 }
27201 v.reset(OpRotateLeft32)
27202 v0 := b.NewValue0(v.Pos, OpConst32, t)
27203 v0.AuxInt = int32ToAuxInt(int32(c))
27204 v.AddArg2(x, v0)
27205 return true
27206 }
27207
27208
27209
27210 for {
27211 if v_0.Op != OpRotateLeft32 {
27212 break
27213 }
27214 c := v_0.Args[1]
27215 x := v_0.Args[0]
27216 d := v_1
27217 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
27218 break
27219 }
27220 v.reset(OpRotateLeft32)
27221 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
27222 v0.AddArg2(c, d)
27223 v.AddArg2(x, v0)
27224 return true
27225 }
27226
27227
27228
27229 for {
27230 if v_0.Op != OpRotateLeft32 {
27231 break
27232 }
27233 c := v_0.Args[1]
27234 x := v_0.Args[0]
27235 d := v_1
27236 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
27237 break
27238 }
27239 v.reset(OpRotateLeft32)
27240 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
27241 v0.AddArg2(c, d)
27242 v.AddArg2(x, v0)
27243 return true
27244 }
27245
27246
27247
27248 for {
27249 if v_0.Op != OpRotateLeft32 {
27250 break
27251 }
27252 c := v_0.Args[1]
27253 x := v_0.Args[0]
27254 d := v_1
27255 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
27256 break
27257 }
27258 v.reset(OpRotateLeft32)
27259 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
27260 v0.AddArg2(c, d)
27261 v.AddArg2(x, v0)
27262 return true
27263 }
27264
27265
27266
27267 for {
27268 if v_0.Op != OpRotateLeft32 {
27269 break
27270 }
27271 c := v_0.Args[1]
27272 x := v_0.Args[0]
27273 d := v_1
27274 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
27275 break
27276 }
27277 v.reset(OpRotateLeft32)
27278 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
27279 v0.AddArg2(c, d)
27280 v.AddArg2(x, v0)
27281 return true
27282 }
27283 return false
27284 }
27285 func rewriteValuegeneric_OpRotateLeft64(v *Value) bool {
27286 v_1 := v.Args[1]
27287 v_0 := v.Args[0]
27288 b := v.Block
27289 config := b.Func.Config
27290
27291
27292
27293 for {
27294 x := v_0
27295 if v_1.Op != OpConst64 {
27296 break
27297 }
27298 c := auxIntToInt64(v_1.AuxInt)
27299 if !(c%64 == 0) {
27300 break
27301 }
27302 v.copyOf(x)
27303 return true
27304 }
27305
27306
27307
27308 for {
27309 x := v_0
27310 if v_1.Op != OpAnd64 {
27311 break
27312 }
27313 _ = v_1.Args[1]
27314 v_1_0 := v_1.Args[0]
27315 v_1_1 := v_1.Args[1]
27316 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27317 y := v_1_0
27318 if v_1_1.Op != OpConst64 {
27319 continue
27320 }
27321 c := auxIntToInt64(v_1_1.AuxInt)
27322 if !(c&63 == 63) {
27323 continue
27324 }
27325 v.reset(OpRotateLeft64)
27326 v.AddArg2(x, y)
27327 return true
27328 }
27329 break
27330 }
27331
27332
27333
27334 for {
27335 x := v_0
27336 if v_1.Op != OpAnd32 {
27337 break
27338 }
27339 _ = v_1.Args[1]
27340 v_1_0 := v_1.Args[0]
27341 v_1_1 := v_1.Args[1]
27342 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27343 y := v_1_0
27344 if v_1_1.Op != OpConst32 {
27345 continue
27346 }
27347 c := auxIntToInt32(v_1_1.AuxInt)
27348 if !(c&63 == 63) {
27349 continue
27350 }
27351 v.reset(OpRotateLeft64)
27352 v.AddArg2(x, y)
27353 return true
27354 }
27355 break
27356 }
27357
27358
27359
27360 for {
27361 x := v_0
27362 if v_1.Op != OpAnd16 {
27363 break
27364 }
27365 _ = v_1.Args[1]
27366 v_1_0 := v_1.Args[0]
27367 v_1_1 := v_1.Args[1]
27368 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27369 y := v_1_0
27370 if v_1_1.Op != OpConst16 {
27371 continue
27372 }
27373 c := auxIntToInt16(v_1_1.AuxInt)
27374 if !(c&63 == 63) {
27375 continue
27376 }
27377 v.reset(OpRotateLeft64)
27378 v.AddArg2(x, y)
27379 return true
27380 }
27381 break
27382 }
27383
27384
27385
27386 for {
27387 x := v_0
27388 if v_1.Op != OpAnd8 {
27389 break
27390 }
27391 _ = v_1.Args[1]
27392 v_1_0 := v_1.Args[0]
27393 v_1_1 := v_1.Args[1]
27394 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27395 y := v_1_0
27396 if v_1_1.Op != OpConst8 {
27397 continue
27398 }
27399 c := auxIntToInt8(v_1_1.AuxInt)
27400 if !(c&63 == 63) {
27401 continue
27402 }
27403 v.reset(OpRotateLeft64)
27404 v.AddArg2(x, y)
27405 return true
27406 }
27407 break
27408 }
27409
27410
27411
27412 for {
27413 x := v_0
27414 if v_1.Op != OpNeg64 {
27415 break
27416 }
27417 v_1_0 := v_1.Args[0]
27418 if v_1_0.Op != OpAnd64 {
27419 break
27420 }
27421 _ = v_1_0.Args[1]
27422 v_1_0_0 := v_1_0.Args[0]
27423 v_1_0_1 := v_1_0.Args[1]
27424 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
27425 y := v_1_0_0
27426 if v_1_0_1.Op != OpConst64 {
27427 continue
27428 }
27429 c := auxIntToInt64(v_1_0_1.AuxInt)
27430 if !(c&63 == 63) {
27431 continue
27432 }
27433 v.reset(OpRotateLeft64)
27434 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
27435 v0.AddArg(y)
27436 v.AddArg2(x, v0)
27437 return true
27438 }
27439 break
27440 }
27441
27442
27443
27444 for {
27445 x := v_0
27446 if v_1.Op != OpNeg32 {
27447 break
27448 }
27449 v_1_0 := v_1.Args[0]
27450 if v_1_0.Op != OpAnd32 {
27451 break
27452 }
27453 _ = v_1_0.Args[1]
27454 v_1_0_0 := v_1_0.Args[0]
27455 v_1_0_1 := v_1_0.Args[1]
27456 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
27457 y := v_1_0_0
27458 if v_1_0_1.Op != OpConst32 {
27459 continue
27460 }
27461 c := auxIntToInt32(v_1_0_1.AuxInt)
27462 if !(c&63 == 63) {
27463 continue
27464 }
27465 v.reset(OpRotateLeft64)
27466 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
27467 v0.AddArg(y)
27468 v.AddArg2(x, v0)
27469 return true
27470 }
27471 break
27472 }
27473
27474
27475
27476 for {
27477 x := v_0
27478 if v_1.Op != OpNeg16 {
27479 break
27480 }
27481 v_1_0 := v_1.Args[0]
27482 if v_1_0.Op != OpAnd16 {
27483 break
27484 }
27485 _ = v_1_0.Args[1]
27486 v_1_0_0 := v_1_0.Args[0]
27487 v_1_0_1 := v_1_0.Args[1]
27488 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
27489 y := v_1_0_0
27490 if v_1_0_1.Op != OpConst16 {
27491 continue
27492 }
27493 c := auxIntToInt16(v_1_0_1.AuxInt)
27494 if !(c&63 == 63) {
27495 continue
27496 }
27497 v.reset(OpRotateLeft64)
27498 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
27499 v0.AddArg(y)
27500 v.AddArg2(x, v0)
27501 return true
27502 }
27503 break
27504 }
27505
27506
27507
27508 for {
27509 x := v_0
27510 if v_1.Op != OpNeg8 {
27511 break
27512 }
27513 v_1_0 := v_1.Args[0]
27514 if v_1_0.Op != OpAnd8 {
27515 break
27516 }
27517 _ = v_1_0.Args[1]
27518 v_1_0_0 := v_1_0.Args[0]
27519 v_1_0_1 := v_1_0.Args[1]
27520 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
27521 y := v_1_0_0
27522 if v_1_0_1.Op != OpConst8 {
27523 continue
27524 }
27525 c := auxIntToInt8(v_1_0_1.AuxInt)
27526 if !(c&63 == 63) {
27527 continue
27528 }
27529 v.reset(OpRotateLeft64)
27530 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
27531 v0.AddArg(y)
27532 v.AddArg2(x, v0)
27533 return true
27534 }
27535 break
27536 }
27537
27538
27539
27540 for {
27541 x := v_0
27542 if v_1.Op != OpAdd64 {
27543 break
27544 }
27545 _ = v_1.Args[1]
27546 v_1_0 := v_1.Args[0]
27547 v_1_1 := v_1.Args[1]
27548 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27549 y := v_1_0
27550 if v_1_1.Op != OpConst64 {
27551 continue
27552 }
27553 c := auxIntToInt64(v_1_1.AuxInt)
27554 if !(c&63 == 0) {
27555 continue
27556 }
27557 v.reset(OpRotateLeft64)
27558 v.AddArg2(x, y)
27559 return true
27560 }
27561 break
27562 }
27563
27564
27565
27566 for {
27567 x := v_0
27568 if v_1.Op != OpAdd32 {
27569 break
27570 }
27571 _ = v_1.Args[1]
27572 v_1_0 := v_1.Args[0]
27573 v_1_1 := v_1.Args[1]
27574 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27575 y := v_1_0
27576 if v_1_1.Op != OpConst32 {
27577 continue
27578 }
27579 c := auxIntToInt32(v_1_1.AuxInt)
27580 if !(c&63 == 0) {
27581 continue
27582 }
27583 v.reset(OpRotateLeft64)
27584 v.AddArg2(x, y)
27585 return true
27586 }
27587 break
27588 }
27589
27590
27591
27592 for {
27593 x := v_0
27594 if v_1.Op != OpAdd16 {
27595 break
27596 }
27597 _ = v_1.Args[1]
27598 v_1_0 := v_1.Args[0]
27599 v_1_1 := v_1.Args[1]
27600 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27601 y := v_1_0
27602 if v_1_1.Op != OpConst16 {
27603 continue
27604 }
27605 c := auxIntToInt16(v_1_1.AuxInt)
27606 if !(c&63 == 0) {
27607 continue
27608 }
27609 v.reset(OpRotateLeft64)
27610 v.AddArg2(x, y)
27611 return true
27612 }
27613 break
27614 }
27615
27616
27617
27618 for {
27619 x := v_0
27620 if v_1.Op != OpAdd8 {
27621 break
27622 }
27623 _ = v_1.Args[1]
27624 v_1_0 := v_1.Args[0]
27625 v_1_1 := v_1.Args[1]
27626 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27627 y := v_1_0
27628 if v_1_1.Op != OpConst8 {
27629 continue
27630 }
27631 c := auxIntToInt8(v_1_1.AuxInt)
27632 if !(c&63 == 0) {
27633 continue
27634 }
27635 v.reset(OpRotateLeft64)
27636 v.AddArg2(x, y)
27637 return true
27638 }
27639 break
27640 }
27641
27642
27643
27644 for {
27645 x := v_0
27646 if v_1.Op != OpSub64 {
27647 break
27648 }
27649 y := v_1.Args[1]
27650 v_1_0 := v_1.Args[0]
27651 if v_1_0.Op != OpConst64 {
27652 break
27653 }
27654 c := auxIntToInt64(v_1_0.AuxInt)
27655 if !(c&63 == 0) {
27656 break
27657 }
27658 v.reset(OpRotateLeft64)
27659 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
27660 v0.AddArg(y)
27661 v.AddArg2(x, v0)
27662 return true
27663 }
27664
27665
27666
27667 for {
27668 x := v_0
27669 if v_1.Op != OpSub32 {
27670 break
27671 }
27672 y := v_1.Args[1]
27673 v_1_0 := v_1.Args[0]
27674 if v_1_0.Op != OpConst32 {
27675 break
27676 }
27677 c := auxIntToInt32(v_1_0.AuxInt)
27678 if !(c&63 == 0) {
27679 break
27680 }
27681 v.reset(OpRotateLeft64)
27682 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
27683 v0.AddArg(y)
27684 v.AddArg2(x, v0)
27685 return true
27686 }
27687
27688
27689
27690 for {
27691 x := v_0
27692 if v_1.Op != OpSub16 {
27693 break
27694 }
27695 y := v_1.Args[1]
27696 v_1_0 := v_1.Args[0]
27697 if v_1_0.Op != OpConst16 {
27698 break
27699 }
27700 c := auxIntToInt16(v_1_0.AuxInt)
27701 if !(c&63 == 0) {
27702 break
27703 }
27704 v.reset(OpRotateLeft64)
27705 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
27706 v0.AddArg(y)
27707 v.AddArg2(x, v0)
27708 return true
27709 }
27710
27711
27712
27713 for {
27714 x := v_0
27715 if v_1.Op != OpSub8 {
27716 break
27717 }
27718 y := v_1.Args[1]
27719 v_1_0 := v_1.Args[0]
27720 if v_1_0.Op != OpConst8 {
27721 break
27722 }
27723 c := auxIntToInt8(v_1_0.AuxInt)
27724 if !(c&63 == 0) {
27725 break
27726 }
27727 v.reset(OpRotateLeft64)
27728 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
27729 v0.AddArg(y)
27730 v.AddArg2(x, v0)
27731 return true
27732 }
27733
27734
27735
27736 for {
27737 x := v_0
27738 if v_1.Op != OpConst64 {
27739 break
27740 }
27741 t := v_1.Type
27742 c := auxIntToInt64(v_1.AuxInt)
27743 if !(config.PtrSize == 4) {
27744 break
27745 }
27746 v.reset(OpRotateLeft64)
27747 v0 := b.NewValue0(v.Pos, OpConst32, t)
27748 v0.AuxInt = int32ToAuxInt(int32(c))
27749 v.AddArg2(x, v0)
27750 return true
27751 }
27752
27753
27754
27755 for {
27756 if v_0.Op != OpRotateLeft64 {
27757 break
27758 }
27759 c := v_0.Args[1]
27760 x := v_0.Args[0]
27761 d := v_1
27762 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
27763 break
27764 }
27765 v.reset(OpRotateLeft64)
27766 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
27767 v0.AddArg2(c, d)
27768 v.AddArg2(x, v0)
27769 return true
27770 }
27771
27772
27773
27774 for {
27775 if v_0.Op != OpRotateLeft64 {
27776 break
27777 }
27778 c := v_0.Args[1]
27779 x := v_0.Args[0]
27780 d := v_1
27781 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
27782 break
27783 }
27784 v.reset(OpRotateLeft64)
27785 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
27786 v0.AddArg2(c, d)
27787 v.AddArg2(x, v0)
27788 return true
27789 }
27790
27791
27792
27793 for {
27794 if v_0.Op != OpRotateLeft64 {
27795 break
27796 }
27797 c := v_0.Args[1]
27798 x := v_0.Args[0]
27799 d := v_1
27800 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
27801 break
27802 }
27803 v.reset(OpRotateLeft64)
27804 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
27805 v0.AddArg2(c, d)
27806 v.AddArg2(x, v0)
27807 return true
27808 }
27809
27810
27811
27812 for {
27813 if v_0.Op != OpRotateLeft64 {
27814 break
27815 }
27816 c := v_0.Args[1]
27817 x := v_0.Args[0]
27818 d := v_1
27819 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
27820 break
27821 }
27822 v.reset(OpRotateLeft64)
27823 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
27824 v0.AddArg2(c, d)
27825 v.AddArg2(x, v0)
27826 return true
27827 }
27828 return false
27829 }
27830 func rewriteValuegeneric_OpRotateLeft8(v *Value) bool {
27831 v_1 := v.Args[1]
27832 v_0 := v.Args[0]
27833 b := v.Block
27834 config := b.Func.Config
27835
27836
27837
27838 for {
27839 x := v_0
27840 if v_1.Op != OpConst8 {
27841 break
27842 }
27843 c := auxIntToInt8(v_1.AuxInt)
27844 if !(c%8 == 0) {
27845 break
27846 }
27847 v.copyOf(x)
27848 return true
27849 }
27850
27851
27852
27853 for {
27854 x := v_0
27855 if v_1.Op != OpAnd64 {
27856 break
27857 }
27858 _ = v_1.Args[1]
27859 v_1_0 := v_1.Args[0]
27860 v_1_1 := v_1.Args[1]
27861 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27862 y := v_1_0
27863 if v_1_1.Op != OpConst64 {
27864 continue
27865 }
27866 c := auxIntToInt64(v_1_1.AuxInt)
27867 if !(c&7 == 7) {
27868 continue
27869 }
27870 v.reset(OpRotateLeft8)
27871 v.AddArg2(x, y)
27872 return true
27873 }
27874 break
27875 }
27876
27877
27878
27879 for {
27880 x := v_0
27881 if v_1.Op != OpAnd32 {
27882 break
27883 }
27884 _ = v_1.Args[1]
27885 v_1_0 := v_1.Args[0]
27886 v_1_1 := v_1.Args[1]
27887 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27888 y := v_1_0
27889 if v_1_1.Op != OpConst32 {
27890 continue
27891 }
27892 c := auxIntToInt32(v_1_1.AuxInt)
27893 if !(c&7 == 7) {
27894 continue
27895 }
27896 v.reset(OpRotateLeft8)
27897 v.AddArg2(x, y)
27898 return true
27899 }
27900 break
27901 }
27902
27903
27904
27905 for {
27906 x := v_0
27907 if v_1.Op != OpAnd16 {
27908 break
27909 }
27910 _ = v_1.Args[1]
27911 v_1_0 := v_1.Args[0]
27912 v_1_1 := v_1.Args[1]
27913 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27914 y := v_1_0
27915 if v_1_1.Op != OpConst16 {
27916 continue
27917 }
27918 c := auxIntToInt16(v_1_1.AuxInt)
27919 if !(c&7 == 7) {
27920 continue
27921 }
27922 v.reset(OpRotateLeft8)
27923 v.AddArg2(x, y)
27924 return true
27925 }
27926 break
27927 }
27928
27929
27930
27931 for {
27932 x := v_0
27933 if v_1.Op != OpAnd8 {
27934 break
27935 }
27936 _ = v_1.Args[1]
27937 v_1_0 := v_1.Args[0]
27938 v_1_1 := v_1.Args[1]
27939 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27940 y := v_1_0
27941 if v_1_1.Op != OpConst8 {
27942 continue
27943 }
27944 c := auxIntToInt8(v_1_1.AuxInt)
27945 if !(c&7 == 7) {
27946 continue
27947 }
27948 v.reset(OpRotateLeft8)
27949 v.AddArg2(x, y)
27950 return true
27951 }
27952 break
27953 }
27954
27955
27956
27957 for {
27958 x := v_0
27959 if v_1.Op != OpNeg64 {
27960 break
27961 }
27962 v_1_0 := v_1.Args[0]
27963 if v_1_0.Op != OpAnd64 {
27964 break
27965 }
27966 _ = v_1_0.Args[1]
27967 v_1_0_0 := v_1_0.Args[0]
27968 v_1_0_1 := v_1_0.Args[1]
27969 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
27970 y := v_1_0_0
27971 if v_1_0_1.Op != OpConst64 {
27972 continue
27973 }
27974 c := auxIntToInt64(v_1_0_1.AuxInt)
27975 if !(c&7 == 7) {
27976 continue
27977 }
27978 v.reset(OpRotateLeft8)
27979 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
27980 v0.AddArg(y)
27981 v.AddArg2(x, v0)
27982 return true
27983 }
27984 break
27985 }
27986
27987
27988
27989 for {
27990 x := v_0
27991 if v_1.Op != OpNeg32 {
27992 break
27993 }
27994 v_1_0 := v_1.Args[0]
27995 if v_1_0.Op != OpAnd32 {
27996 break
27997 }
27998 _ = v_1_0.Args[1]
27999 v_1_0_0 := v_1_0.Args[0]
28000 v_1_0_1 := v_1_0.Args[1]
28001 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
28002 y := v_1_0_0
28003 if v_1_0_1.Op != OpConst32 {
28004 continue
28005 }
28006 c := auxIntToInt32(v_1_0_1.AuxInt)
28007 if !(c&7 == 7) {
28008 continue
28009 }
28010 v.reset(OpRotateLeft8)
28011 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
28012 v0.AddArg(y)
28013 v.AddArg2(x, v0)
28014 return true
28015 }
28016 break
28017 }
28018
28019
28020
28021 for {
28022 x := v_0
28023 if v_1.Op != OpNeg16 {
28024 break
28025 }
28026 v_1_0 := v_1.Args[0]
28027 if v_1_0.Op != OpAnd16 {
28028 break
28029 }
28030 _ = v_1_0.Args[1]
28031 v_1_0_0 := v_1_0.Args[0]
28032 v_1_0_1 := v_1_0.Args[1]
28033 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
28034 y := v_1_0_0
28035 if v_1_0_1.Op != OpConst16 {
28036 continue
28037 }
28038 c := auxIntToInt16(v_1_0_1.AuxInt)
28039 if !(c&7 == 7) {
28040 continue
28041 }
28042 v.reset(OpRotateLeft8)
28043 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
28044 v0.AddArg(y)
28045 v.AddArg2(x, v0)
28046 return true
28047 }
28048 break
28049 }
28050
28051
28052
28053 for {
28054 x := v_0
28055 if v_1.Op != OpNeg8 {
28056 break
28057 }
28058 v_1_0 := v_1.Args[0]
28059 if v_1_0.Op != OpAnd8 {
28060 break
28061 }
28062 _ = v_1_0.Args[1]
28063 v_1_0_0 := v_1_0.Args[0]
28064 v_1_0_1 := v_1_0.Args[1]
28065 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
28066 y := v_1_0_0
28067 if v_1_0_1.Op != OpConst8 {
28068 continue
28069 }
28070 c := auxIntToInt8(v_1_0_1.AuxInt)
28071 if !(c&7 == 7) {
28072 continue
28073 }
28074 v.reset(OpRotateLeft8)
28075 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
28076 v0.AddArg(y)
28077 v.AddArg2(x, v0)
28078 return true
28079 }
28080 break
28081 }
28082
28083
28084
28085 for {
28086 x := v_0
28087 if v_1.Op != OpAdd64 {
28088 break
28089 }
28090 _ = v_1.Args[1]
28091 v_1_0 := v_1.Args[0]
28092 v_1_1 := v_1.Args[1]
28093 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28094 y := v_1_0
28095 if v_1_1.Op != OpConst64 {
28096 continue
28097 }
28098 c := auxIntToInt64(v_1_1.AuxInt)
28099 if !(c&7 == 0) {
28100 continue
28101 }
28102 v.reset(OpRotateLeft8)
28103 v.AddArg2(x, y)
28104 return true
28105 }
28106 break
28107 }
28108
28109
28110
28111 for {
28112 x := v_0
28113 if v_1.Op != OpAdd32 {
28114 break
28115 }
28116 _ = v_1.Args[1]
28117 v_1_0 := v_1.Args[0]
28118 v_1_1 := v_1.Args[1]
28119 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28120 y := v_1_0
28121 if v_1_1.Op != OpConst32 {
28122 continue
28123 }
28124 c := auxIntToInt32(v_1_1.AuxInt)
28125 if !(c&7 == 0) {
28126 continue
28127 }
28128 v.reset(OpRotateLeft8)
28129 v.AddArg2(x, y)
28130 return true
28131 }
28132 break
28133 }
28134
28135
28136
28137 for {
28138 x := v_0
28139 if v_1.Op != OpAdd16 {
28140 break
28141 }
28142 _ = v_1.Args[1]
28143 v_1_0 := v_1.Args[0]
28144 v_1_1 := v_1.Args[1]
28145 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28146 y := v_1_0
28147 if v_1_1.Op != OpConst16 {
28148 continue
28149 }
28150 c := auxIntToInt16(v_1_1.AuxInt)
28151 if !(c&7 == 0) {
28152 continue
28153 }
28154 v.reset(OpRotateLeft8)
28155 v.AddArg2(x, y)
28156 return true
28157 }
28158 break
28159 }
28160
28161
28162
28163 for {
28164 x := v_0
28165 if v_1.Op != OpAdd8 {
28166 break
28167 }
28168 _ = v_1.Args[1]
28169 v_1_0 := v_1.Args[0]
28170 v_1_1 := v_1.Args[1]
28171 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28172 y := v_1_0
28173 if v_1_1.Op != OpConst8 {
28174 continue
28175 }
28176 c := auxIntToInt8(v_1_1.AuxInt)
28177 if !(c&7 == 0) {
28178 continue
28179 }
28180 v.reset(OpRotateLeft8)
28181 v.AddArg2(x, y)
28182 return true
28183 }
28184 break
28185 }
28186
28187
28188
28189 for {
28190 x := v_0
28191 if v_1.Op != OpSub64 {
28192 break
28193 }
28194 y := v_1.Args[1]
28195 v_1_0 := v_1.Args[0]
28196 if v_1_0.Op != OpConst64 {
28197 break
28198 }
28199 c := auxIntToInt64(v_1_0.AuxInt)
28200 if !(c&7 == 0) {
28201 break
28202 }
28203 v.reset(OpRotateLeft8)
28204 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
28205 v0.AddArg(y)
28206 v.AddArg2(x, v0)
28207 return true
28208 }
28209
28210
28211
28212 for {
28213 x := v_0
28214 if v_1.Op != OpSub32 {
28215 break
28216 }
28217 y := v_1.Args[1]
28218 v_1_0 := v_1.Args[0]
28219 if v_1_0.Op != OpConst32 {
28220 break
28221 }
28222 c := auxIntToInt32(v_1_0.AuxInt)
28223 if !(c&7 == 0) {
28224 break
28225 }
28226 v.reset(OpRotateLeft8)
28227 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
28228 v0.AddArg(y)
28229 v.AddArg2(x, v0)
28230 return true
28231 }
28232
28233
28234
28235 for {
28236 x := v_0
28237 if v_1.Op != OpSub16 {
28238 break
28239 }
28240 y := v_1.Args[1]
28241 v_1_0 := v_1.Args[0]
28242 if v_1_0.Op != OpConst16 {
28243 break
28244 }
28245 c := auxIntToInt16(v_1_0.AuxInt)
28246 if !(c&7 == 0) {
28247 break
28248 }
28249 v.reset(OpRotateLeft8)
28250 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
28251 v0.AddArg(y)
28252 v.AddArg2(x, v0)
28253 return true
28254 }
28255
28256
28257
28258 for {
28259 x := v_0
28260 if v_1.Op != OpSub8 {
28261 break
28262 }
28263 y := v_1.Args[1]
28264 v_1_0 := v_1.Args[0]
28265 if v_1_0.Op != OpConst8 {
28266 break
28267 }
28268 c := auxIntToInt8(v_1_0.AuxInt)
28269 if !(c&7 == 0) {
28270 break
28271 }
28272 v.reset(OpRotateLeft8)
28273 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
28274 v0.AddArg(y)
28275 v.AddArg2(x, v0)
28276 return true
28277 }
28278
28279
28280
28281 for {
28282 x := v_0
28283 if v_1.Op != OpConst64 {
28284 break
28285 }
28286 t := v_1.Type
28287 c := auxIntToInt64(v_1.AuxInt)
28288 if !(config.PtrSize == 4) {
28289 break
28290 }
28291 v.reset(OpRotateLeft8)
28292 v0 := b.NewValue0(v.Pos, OpConst32, t)
28293 v0.AuxInt = int32ToAuxInt(int32(c))
28294 v.AddArg2(x, v0)
28295 return true
28296 }
28297
28298
28299
28300 for {
28301 if v_0.Op != OpRotateLeft8 {
28302 break
28303 }
28304 c := v_0.Args[1]
28305 x := v_0.Args[0]
28306 d := v_1
28307 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
28308 break
28309 }
28310 v.reset(OpRotateLeft8)
28311 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
28312 v0.AddArg2(c, d)
28313 v.AddArg2(x, v0)
28314 return true
28315 }
28316
28317
28318
28319 for {
28320 if v_0.Op != OpRotateLeft8 {
28321 break
28322 }
28323 c := v_0.Args[1]
28324 x := v_0.Args[0]
28325 d := v_1
28326 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
28327 break
28328 }
28329 v.reset(OpRotateLeft8)
28330 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
28331 v0.AddArg2(c, d)
28332 v.AddArg2(x, v0)
28333 return true
28334 }
28335
28336
28337
28338 for {
28339 if v_0.Op != OpRotateLeft8 {
28340 break
28341 }
28342 c := v_0.Args[1]
28343 x := v_0.Args[0]
28344 d := v_1
28345 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
28346 break
28347 }
28348 v.reset(OpRotateLeft8)
28349 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
28350 v0.AddArg2(c, d)
28351 v.AddArg2(x, v0)
28352 return true
28353 }
28354
28355
28356
28357 for {
28358 if v_0.Op != OpRotateLeft8 {
28359 break
28360 }
28361 c := v_0.Args[1]
28362 x := v_0.Args[0]
28363 d := v_1
28364 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
28365 break
28366 }
28367 v.reset(OpRotateLeft8)
28368 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
28369 v0.AddArg2(c, d)
28370 v.AddArg2(x, v0)
28371 return true
28372 }
28373 return false
28374 }
28375 func rewriteValuegeneric_OpRound32F(v *Value) bool {
28376 v_0 := v.Args[0]
28377
28378
28379 for {
28380 x := v_0
28381 if x.Op != OpConst32F {
28382 break
28383 }
28384 v.copyOf(x)
28385 return true
28386 }
28387 return false
28388 }
28389 func rewriteValuegeneric_OpRound64F(v *Value) bool {
28390 v_0 := v.Args[0]
28391
28392
28393 for {
28394 x := v_0
28395 if x.Op != OpConst64F {
28396 break
28397 }
28398 v.copyOf(x)
28399 return true
28400 }
28401 return false
28402 }
28403 func rewriteValuegeneric_OpRoundToEven(v *Value) bool {
28404 v_0 := v.Args[0]
28405
28406
28407 for {
28408 if v_0.Op != OpConst64F {
28409 break
28410 }
28411 c := auxIntToFloat64(v_0.AuxInt)
28412 v.reset(OpConst64F)
28413 v.AuxInt = float64ToAuxInt(math.RoundToEven(c))
28414 return true
28415 }
28416 return false
28417 }
28418 func rewriteValuegeneric_OpRsh16Ux16(v *Value) bool {
28419 v_1 := v.Args[1]
28420 v_0 := v.Args[0]
28421 b := v.Block
28422
28423
28424 for {
28425 t := v.Type
28426 x := v_0
28427 if v_1.Op != OpConst16 {
28428 break
28429 }
28430 c := auxIntToInt16(v_1.AuxInt)
28431 v.reset(OpRsh16Ux64)
28432 v0 := b.NewValue0(v.Pos, OpConst64, t)
28433 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28434 v.AddArg2(x, v0)
28435 return true
28436 }
28437
28438
28439 for {
28440 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
28441 break
28442 }
28443 v.reset(OpConst16)
28444 v.AuxInt = int16ToAuxInt(0)
28445 return true
28446 }
28447
28448
28449
28450 for {
28451 if auxIntToBool(v.AuxInt) != false {
28452 break
28453 }
28454 x := v_0
28455 con := v_1
28456 if con.Op != OpConst16 {
28457 break
28458 }
28459 c := auxIntToInt16(con.AuxInt)
28460 if !(0 < c && c < 16) {
28461 break
28462 }
28463 v.reset(OpRsh16Ux16)
28464 v.AuxInt = boolToAuxInt(true)
28465 v.AddArg2(x, con)
28466 return true
28467 }
28468 return false
28469 }
28470 func rewriteValuegeneric_OpRsh16Ux32(v *Value) bool {
28471 v_1 := v.Args[1]
28472 v_0 := v.Args[0]
28473 b := v.Block
28474
28475
28476 for {
28477 t := v.Type
28478 x := v_0
28479 if v_1.Op != OpConst32 {
28480 break
28481 }
28482 c := auxIntToInt32(v_1.AuxInt)
28483 v.reset(OpRsh16Ux64)
28484 v0 := b.NewValue0(v.Pos, OpConst64, t)
28485 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
28486 v.AddArg2(x, v0)
28487 return true
28488 }
28489
28490
28491 for {
28492 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
28493 break
28494 }
28495 v.reset(OpConst16)
28496 v.AuxInt = int16ToAuxInt(0)
28497 return true
28498 }
28499
28500
28501
28502 for {
28503 if auxIntToBool(v.AuxInt) != false {
28504 break
28505 }
28506 x := v_0
28507 con := v_1
28508 if con.Op != OpConst32 {
28509 break
28510 }
28511 c := auxIntToInt32(con.AuxInt)
28512 if !(0 < c && c < 16) {
28513 break
28514 }
28515 v.reset(OpRsh16Ux32)
28516 v.AuxInt = boolToAuxInt(true)
28517 v.AddArg2(x, con)
28518 return true
28519 }
28520 return false
28521 }
28522 func rewriteValuegeneric_OpRsh16Ux64(v *Value) bool {
28523 v_1 := v.Args[1]
28524 v_0 := v.Args[0]
28525 b := v.Block
28526 typ := &b.Func.Config.Types
28527
28528
28529 for {
28530 if v_0.Op != OpConst16 {
28531 break
28532 }
28533 c := auxIntToInt16(v_0.AuxInt)
28534 if v_1.Op != OpConst64 {
28535 break
28536 }
28537 d := auxIntToInt64(v_1.AuxInt)
28538 v.reset(OpConst16)
28539 v.AuxInt = int16ToAuxInt(int16(uint16(c) >> uint64(d)))
28540 return true
28541 }
28542
28543
28544 for {
28545 x := v_0
28546 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
28547 break
28548 }
28549 v.copyOf(x)
28550 return true
28551 }
28552
28553
28554 for {
28555 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
28556 break
28557 }
28558 v.reset(OpConst16)
28559 v.AuxInt = int16ToAuxInt(0)
28560 return true
28561 }
28562
28563
28564
28565 for {
28566 if v_1.Op != OpConst64 {
28567 break
28568 }
28569 c := auxIntToInt64(v_1.AuxInt)
28570 if !(uint64(c) >= 16) {
28571 break
28572 }
28573 v.reset(OpConst16)
28574 v.AuxInt = int16ToAuxInt(0)
28575 return true
28576 }
28577
28578
28579
28580 for {
28581 t := v.Type
28582 if v_0.Op != OpRsh16Ux64 {
28583 break
28584 }
28585 _ = v_0.Args[1]
28586 x := v_0.Args[0]
28587 v_0_1 := v_0.Args[1]
28588 if v_0_1.Op != OpConst64 {
28589 break
28590 }
28591 c := auxIntToInt64(v_0_1.AuxInt)
28592 if v_1.Op != OpConst64 {
28593 break
28594 }
28595 d := auxIntToInt64(v_1.AuxInt)
28596 if !(!uaddOvf(c, d)) {
28597 break
28598 }
28599 v.reset(OpRsh16Ux64)
28600 v0 := b.NewValue0(v.Pos, OpConst64, t)
28601 v0.AuxInt = int64ToAuxInt(c + d)
28602 v.AddArg2(x, v0)
28603 return true
28604 }
28605
28606
28607 for {
28608 if v_0.Op != OpRsh16x64 {
28609 break
28610 }
28611 x := v_0.Args[0]
28612 if v_1.Op != OpConst64 {
28613 break
28614 }
28615 t := v_1.Type
28616 if auxIntToInt64(v_1.AuxInt) != 15 {
28617 break
28618 }
28619 v.reset(OpRsh16Ux64)
28620 v0 := b.NewValue0(v.Pos, OpConst64, t)
28621 v0.AuxInt = int64ToAuxInt(15)
28622 v.AddArg2(x, v0)
28623 return true
28624 }
28625
28626
28627
28628 for {
28629 i := v_0
28630 if i.Op != OpLsh16x64 {
28631 break
28632 }
28633 _ = i.Args[1]
28634 x := i.Args[0]
28635 i_1 := i.Args[1]
28636 if i_1.Op != OpConst64 {
28637 break
28638 }
28639 c := auxIntToInt64(i_1.AuxInt)
28640 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
28641 break
28642 }
28643 v.reset(OpAnd16)
28644 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
28645 v0.AuxInt = int16ToAuxInt(int16(^uint16(0) >> c))
28646 v.AddArg2(x, v0)
28647 return true
28648 }
28649
28650
28651
28652 for {
28653 if v_0.Op != OpLsh16x64 {
28654 break
28655 }
28656 _ = v_0.Args[1]
28657 v_0_0 := v_0.Args[0]
28658 if v_0_0.Op != OpRsh16Ux64 {
28659 break
28660 }
28661 _ = v_0_0.Args[1]
28662 x := v_0_0.Args[0]
28663 v_0_0_1 := v_0_0.Args[1]
28664 if v_0_0_1.Op != OpConst64 {
28665 break
28666 }
28667 c1 := auxIntToInt64(v_0_0_1.AuxInt)
28668 v_0_1 := v_0.Args[1]
28669 if v_0_1.Op != OpConst64 {
28670 break
28671 }
28672 c2 := auxIntToInt64(v_0_1.AuxInt)
28673 if v_1.Op != OpConst64 {
28674 break
28675 }
28676 c3 := auxIntToInt64(v_1.AuxInt)
28677 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
28678 break
28679 }
28680 v.reset(OpRsh16Ux64)
28681 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
28682 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
28683 v.AddArg2(x, v0)
28684 return true
28685 }
28686
28687
28688 for {
28689 if v_0.Op != OpLsh16x64 {
28690 break
28691 }
28692 _ = v_0.Args[1]
28693 x := v_0.Args[0]
28694 v_0_1 := v_0.Args[1]
28695 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 8 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 8 {
28696 break
28697 }
28698 v.reset(OpZeroExt8to16)
28699 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.UInt8)
28700 v0.AddArg(x)
28701 v.AddArg(v0)
28702 return true
28703 }
28704
28705
28706
28707 for {
28708 if auxIntToBool(v.AuxInt) != false {
28709 break
28710 }
28711 x := v_0
28712 con := v_1
28713 if con.Op != OpConst64 {
28714 break
28715 }
28716 c := auxIntToInt64(con.AuxInt)
28717 if !(0 < c && c < 16) {
28718 break
28719 }
28720 v.reset(OpRsh16Ux64)
28721 v.AuxInt = boolToAuxInt(true)
28722 v.AddArg2(x, con)
28723 return true
28724 }
28725 return false
28726 }
28727 func rewriteValuegeneric_OpRsh16Ux8(v *Value) bool {
28728 v_1 := v.Args[1]
28729 v_0 := v.Args[0]
28730 b := v.Block
28731
28732
28733 for {
28734 t := v.Type
28735 x := v_0
28736 if v_1.Op != OpConst8 {
28737 break
28738 }
28739 c := auxIntToInt8(v_1.AuxInt)
28740 v.reset(OpRsh16Ux64)
28741 v0 := b.NewValue0(v.Pos, OpConst64, t)
28742 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
28743 v.AddArg2(x, v0)
28744 return true
28745 }
28746
28747
28748 for {
28749 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
28750 break
28751 }
28752 v.reset(OpConst16)
28753 v.AuxInt = int16ToAuxInt(0)
28754 return true
28755 }
28756
28757
28758
28759 for {
28760 if auxIntToBool(v.AuxInt) != false {
28761 break
28762 }
28763 x := v_0
28764 con := v_1
28765 if con.Op != OpConst8 {
28766 break
28767 }
28768 c := auxIntToInt8(con.AuxInt)
28769 if !(0 < c && c < 16) {
28770 break
28771 }
28772 v.reset(OpRsh16Ux8)
28773 v.AuxInt = boolToAuxInt(true)
28774 v.AddArg2(x, con)
28775 return true
28776 }
28777 return false
28778 }
28779 func rewriteValuegeneric_OpRsh16x16(v *Value) bool {
28780 v_1 := v.Args[1]
28781 v_0 := v.Args[0]
28782 b := v.Block
28783
28784
28785 for {
28786 t := v.Type
28787 x := v_0
28788 if v_1.Op != OpConst16 {
28789 break
28790 }
28791 c := auxIntToInt16(v_1.AuxInt)
28792 v.reset(OpRsh16x64)
28793 v0 := b.NewValue0(v.Pos, OpConst64, t)
28794 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28795 v.AddArg2(x, v0)
28796 return true
28797 }
28798
28799
28800 for {
28801 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
28802 break
28803 }
28804 v.reset(OpConst16)
28805 v.AuxInt = int16ToAuxInt(0)
28806 return true
28807 }
28808
28809
28810
28811 for {
28812 if auxIntToBool(v.AuxInt) != false {
28813 break
28814 }
28815 x := v_0
28816 con := v_1
28817 if con.Op != OpConst16 {
28818 break
28819 }
28820 c := auxIntToInt16(con.AuxInt)
28821 if !(0 < c && c < 16) {
28822 break
28823 }
28824 v.reset(OpRsh16x16)
28825 v.AuxInt = boolToAuxInt(true)
28826 v.AddArg2(x, con)
28827 return true
28828 }
28829 return false
28830 }
28831 func rewriteValuegeneric_OpRsh16x32(v *Value) bool {
28832 v_1 := v.Args[1]
28833 v_0 := v.Args[0]
28834 b := v.Block
28835
28836
28837 for {
28838 t := v.Type
28839 x := v_0
28840 if v_1.Op != OpConst32 {
28841 break
28842 }
28843 c := auxIntToInt32(v_1.AuxInt)
28844 v.reset(OpRsh16x64)
28845 v0 := b.NewValue0(v.Pos, OpConst64, t)
28846 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
28847 v.AddArg2(x, v0)
28848 return true
28849 }
28850
28851
28852 for {
28853 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
28854 break
28855 }
28856 v.reset(OpConst16)
28857 v.AuxInt = int16ToAuxInt(0)
28858 return true
28859 }
28860
28861
28862
28863 for {
28864 if auxIntToBool(v.AuxInt) != false {
28865 break
28866 }
28867 x := v_0
28868 con := v_1
28869 if con.Op != OpConst32 {
28870 break
28871 }
28872 c := auxIntToInt32(con.AuxInt)
28873 if !(0 < c && c < 16) {
28874 break
28875 }
28876 v.reset(OpRsh16x32)
28877 v.AuxInt = boolToAuxInt(true)
28878 v.AddArg2(x, con)
28879 return true
28880 }
28881 return false
28882 }
28883 func rewriteValuegeneric_OpRsh16x64(v *Value) bool {
28884 v_1 := v.Args[1]
28885 v_0 := v.Args[0]
28886 b := v.Block
28887 typ := &b.Func.Config.Types
28888
28889
28890 for {
28891 if v_0.Op != OpConst16 {
28892 break
28893 }
28894 c := auxIntToInt16(v_0.AuxInt)
28895 if v_1.Op != OpConst64 {
28896 break
28897 }
28898 d := auxIntToInt64(v_1.AuxInt)
28899 v.reset(OpConst16)
28900 v.AuxInt = int16ToAuxInt(c >> uint64(d))
28901 return true
28902 }
28903
28904
28905 for {
28906 x := v_0
28907 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
28908 break
28909 }
28910 v.copyOf(x)
28911 return true
28912 }
28913
28914
28915 for {
28916 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
28917 break
28918 }
28919 v.reset(OpConst16)
28920 v.AuxInt = int16ToAuxInt(0)
28921 return true
28922 }
28923
28924
28925
28926 for {
28927 t := v.Type
28928 if v_0.Op != OpRsh16x64 {
28929 break
28930 }
28931 _ = v_0.Args[1]
28932 x := v_0.Args[0]
28933 v_0_1 := v_0.Args[1]
28934 if v_0_1.Op != OpConst64 {
28935 break
28936 }
28937 c := auxIntToInt64(v_0_1.AuxInt)
28938 if v_1.Op != OpConst64 {
28939 break
28940 }
28941 d := auxIntToInt64(v_1.AuxInt)
28942 if !(!uaddOvf(c, d)) {
28943 break
28944 }
28945 v.reset(OpRsh16x64)
28946 v0 := b.NewValue0(v.Pos, OpConst64, t)
28947 v0.AuxInt = int64ToAuxInt(c + d)
28948 v.AddArg2(x, v0)
28949 return true
28950 }
28951
28952
28953 for {
28954 if v_0.Op != OpLsh16x64 {
28955 break
28956 }
28957 _ = v_0.Args[1]
28958 x := v_0.Args[0]
28959 v_0_1 := v_0.Args[1]
28960 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 8 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 8 {
28961 break
28962 }
28963 v.reset(OpSignExt8to16)
28964 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.Int8)
28965 v0.AddArg(x)
28966 v.AddArg(v0)
28967 return true
28968 }
28969
28970
28971
28972 for {
28973 if auxIntToBool(v.AuxInt) != false {
28974 break
28975 }
28976 x := v_0
28977 con := v_1
28978 if con.Op != OpConst64 {
28979 break
28980 }
28981 c := auxIntToInt64(con.AuxInt)
28982 if !(0 < c && c < 16) {
28983 break
28984 }
28985 v.reset(OpRsh16x64)
28986 v.AuxInt = boolToAuxInt(true)
28987 v.AddArg2(x, con)
28988 return true
28989 }
28990 return false
28991 }
28992 func rewriteValuegeneric_OpRsh16x8(v *Value) bool {
28993 v_1 := v.Args[1]
28994 v_0 := v.Args[0]
28995 b := v.Block
28996
28997
28998 for {
28999 t := v.Type
29000 x := v_0
29001 if v_1.Op != OpConst8 {
29002 break
29003 }
29004 c := auxIntToInt8(v_1.AuxInt)
29005 v.reset(OpRsh16x64)
29006 v0 := b.NewValue0(v.Pos, OpConst64, t)
29007 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
29008 v.AddArg2(x, v0)
29009 return true
29010 }
29011
29012
29013 for {
29014 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
29015 break
29016 }
29017 v.reset(OpConst16)
29018 v.AuxInt = int16ToAuxInt(0)
29019 return true
29020 }
29021
29022
29023
29024 for {
29025 if auxIntToBool(v.AuxInt) != false {
29026 break
29027 }
29028 x := v_0
29029 con := v_1
29030 if con.Op != OpConst8 {
29031 break
29032 }
29033 c := auxIntToInt8(con.AuxInt)
29034 if !(0 < c && c < 16) {
29035 break
29036 }
29037 v.reset(OpRsh16x8)
29038 v.AuxInt = boolToAuxInt(true)
29039 v.AddArg2(x, con)
29040 return true
29041 }
29042 return false
29043 }
29044 func rewriteValuegeneric_OpRsh32Ux16(v *Value) bool {
29045 v_1 := v.Args[1]
29046 v_0 := v.Args[0]
29047 b := v.Block
29048
29049
29050 for {
29051 t := v.Type
29052 x := v_0
29053 if v_1.Op != OpConst16 {
29054 break
29055 }
29056 c := auxIntToInt16(v_1.AuxInt)
29057 v.reset(OpRsh32Ux64)
29058 v0 := b.NewValue0(v.Pos, OpConst64, t)
29059 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
29060 v.AddArg2(x, v0)
29061 return true
29062 }
29063
29064
29065 for {
29066 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
29067 break
29068 }
29069 v.reset(OpConst32)
29070 v.AuxInt = int32ToAuxInt(0)
29071 return true
29072 }
29073
29074
29075
29076 for {
29077 if auxIntToBool(v.AuxInt) != false {
29078 break
29079 }
29080 x := v_0
29081 con := v_1
29082 if con.Op != OpConst16 {
29083 break
29084 }
29085 c := auxIntToInt16(con.AuxInt)
29086 if !(0 < c && c < 32) {
29087 break
29088 }
29089 v.reset(OpRsh32Ux16)
29090 v.AuxInt = boolToAuxInt(true)
29091 v.AddArg2(x, con)
29092 return true
29093 }
29094 return false
29095 }
29096 func rewriteValuegeneric_OpRsh32Ux32(v *Value) bool {
29097 v_1 := v.Args[1]
29098 v_0 := v.Args[0]
29099 b := v.Block
29100
29101
29102 for {
29103 t := v.Type
29104 x := v_0
29105 if v_1.Op != OpConst32 {
29106 break
29107 }
29108 c := auxIntToInt32(v_1.AuxInt)
29109 v.reset(OpRsh32Ux64)
29110 v0 := b.NewValue0(v.Pos, OpConst64, t)
29111 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
29112 v.AddArg2(x, v0)
29113 return true
29114 }
29115
29116
29117 for {
29118 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
29119 break
29120 }
29121 v.reset(OpConst32)
29122 v.AuxInt = int32ToAuxInt(0)
29123 return true
29124 }
29125
29126
29127
29128 for {
29129 if auxIntToBool(v.AuxInt) != false {
29130 break
29131 }
29132 x := v_0
29133 con := v_1
29134 if con.Op != OpConst32 {
29135 break
29136 }
29137 c := auxIntToInt32(con.AuxInt)
29138 if !(0 < c && c < 32) {
29139 break
29140 }
29141 v.reset(OpRsh32Ux32)
29142 v.AuxInt = boolToAuxInt(true)
29143 v.AddArg2(x, con)
29144 return true
29145 }
29146 return false
29147 }
29148 func rewriteValuegeneric_OpRsh32Ux64(v *Value) bool {
29149 v_1 := v.Args[1]
29150 v_0 := v.Args[0]
29151 b := v.Block
29152 typ := &b.Func.Config.Types
29153
29154
29155 for {
29156 if v_0.Op != OpConst32 {
29157 break
29158 }
29159 c := auxIntToInt32(v_0.AuxInt)
29160 if v_1.Op != OpConst64 {
29161 break
29162 }
29163 d := auxIntToInt64(v_1.AuxInt)
29164 v.reset(OpConst32)
29165 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
29166 return true
29167 }
29168
29169
29170 for {
29171 x := v_0
29172 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
29173 break
29174 }
29175 v.copyOf(x)
29176 return true
29177 }
29178
29179
29180 for {
29181 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
29182 break
29183 }
29184 v.reset(OpConst32)
29185 v.AuxInt = int32ToAuxInt(0)
29186 return true
29187 }
29188
29189
29190
29191 for {
29192 if v_1.Op != OpConst64 {
29193 break
29194 }
29195 c := auxIntToInt64(v_1.AuxInt)
29196 if !(uint64(c) >= 32) {
29197 break
29198 }
29199 v.reset(OpConst32)
29200 v.AuxInt = int32ToAuxInt(0)
29201 return true
29202 }
29203
29204
29205
29206 for {
29207 t := v.Type
29208 if v_0.Op != OpRsh32Ux64 {
29209 break
29210 }
29211 _ = v_0.Args[1]
29212 x := v_0.Args[0]
29213 v_0_1 := v_0.Args[1]
29214 if v_0_1.Op != OpConst64 {
29215 break
29216 }
29217 c := auxIntToInt64(v_0_1.AuxInt)
29218 if v_1.Op != OpConst64 {
29219 break
29220 }
29221 d := auxIntToInt64(v_1.AuxInt)
29222 if !(!uaddOvf(c, d)) {
29223 break
29224 }
29225 v.reset(OpRsh32Ux64)
29226 v0 := b.NewValue0(v.Pos, OpConst64, t)
29227 v0.AuxInt = int64ToAuxInt(c + d)
29228 v.AddArg2(x, v0)
29229 return true
29230 }
29231
29232
29233 for {
29234 if v_0.Op != OpRsh32x64 {
29235 break
29236 }
29237 x := v_0.Args[0]
29238 if v_1.Op != OpConst64 {
29239 break
29240 }
29241 t := v_1.Type
29242 if auxIntToInt64(v_1.AuxInt) != 31 {
29243 break
29244 }
29245 v.reset(OpRsh32Ux64)
29246 v0 := b.NewValue0(v.Pos, OpConst64, t)
29247 v0.AuxInt = int64ToAuxInt(31)
29248 v.AddArg2(x, v0)
29249 return true
29250 }
29251
29252
29253
29254 for {
29255 i := v_0
29256 if i.Op != OpLsh32x64 {
29257 break
29258 }
29259 _ = i.Args[1]
29260 x := i.Args[0]
29261 i_1 := i.Args[1]
29262 if i_1.Op != OpConst64 {
29263 break
29264 }
29265 c := auxIntToInt64(i_1.AuxInt)
29266 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
29267 break
29268 }
29269 v.reset(OpAnd32)
29270 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
29271 v0.AuxInt = int32ToAuxInt(int32(^uint32(0) >> c))
29272 v.AddArg2(x, v0)
29273 return true
29274 }
29275
29276
29277
29278 for {
29279 if v_0.Op != OpLsh32x64 {
29280 break
29281 }
29282 _ = v_0.Args[1]
29283 v_0_0 := v_0.Args[0]
29284 if v_0_0.Op != OpRsh32Ux64 {
29285 break
29286 }
29287 _ = v_0_0.Args[1]
29288 x := v_0_0.Args[0]
29289 v_0_0_1 := v_0_0.Args[1]
29290 if v_0_0_1.Op != OpConst64 {
29291 break
29292 }
29293 c1 := auxIntToInt64(v_0_0_1.AuxInt)
29294 v_0_1 := v_0.Args[1]
29295 if v_0_1.Op != OpConst64 {
29296 break
29297 }
29298 c2 := auxIntToInt64(v_0_1.AuxInt)
29299 if v_1.Op != OpConst64 {
29300 break
29301 }
29302 c3 := auxIntToInt64(v_1.AuxInt)
29303 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
29304 break
29305 }
29306 v.reset(OpRsh32Ux64)
29307 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
29308 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
29309 v.AddArg2(x, v0)
29310 return true
29311 }
29312
29313
29314 for {
29315 if v_0.Op != OpLsh32x64 {
29316 break
29317 }
29318 _ = v_0.Args[1]
29319 x := v_0.Args[0]
29320 v_0_1 := v_0.Args[1]
29321 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 24 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 24 {
29322 break
29323 }
29324 v.reset(OpZeroExt8to32)
29325 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.UInt8)
29326 v0.AddArg(x)
29327 v.AddArg(v0)
29328 return true
29329 }
29330
29331
29332 for {
29333 if v_0.Op != OpLsh32x64 {
29334 break
29335 }
29336 _ = v_0.Args[1]
29337 x := v_0.Args[0]
29338 v_0_1 := v_0.Args[1]
29339 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 16 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 16 {
29340 break
29341 }
29342 v.reset(OpZeroExt16to32)
29343 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.UInt16)
29344 v0.AddArg(x)
29345 v.AddArg(v0)
29346 return true
29347 }
29348
29349
29350
29351 for {
29352 if auxIntToBool(v.AuxInt) != false {
29353 break
29354 }
29355 x := v_0
29356 con := v_1
29357 if con.Op != OpConst64 {
29358 break
29359 }
29360 c := auxIntToInt64(con.AuxInt)
29361 if !(0 < c && c < 32) {
29362 break
29363 }
29364 v.reset(OpRsh32Ux64)
29365 v.AuxInt = boolToAuxInt(true)
29366 v.AddArg2(x, con)
29367 return true
29368 }
29369 return false
29370 }
29371 func rewriteValuegeneric_OpRsh32Ux8(v *Value) bool {
29372 v_1 := v.Args[1]
29373 v_0 := v.Args[0]
29374 b := v.Block
29375
29376
29377 for {
29378 t := v.Type
29379 x := v_0
29380 if v_1.Op != OpConst8 {
29381 break
29382 }
29383 c := auxIntToInt8(v_1.AuxInt)
29384 v.reset(OpRsh32Ux64)
29385 v0 := b.NewValue0(v.Pos, OpConst64, t)
29386 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
29387 v.AddArg2(x, v0)
29388 return true
29389 }
29390
29391
29392 for {
29393 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
29394 break
29395 }
29396 v.reset(OpConst32)
29397 v.AuxInt = int32ToAuxInt(0)
29398 return true
29399 }
29400
29401
29402
29403 for {
29404 if auxIntToBool(v.AuxInt) != false {
29405 break
29406 }
29407 x := v_0
29408 con := v_1
29409 if con.Op != OpConst8 {
29410 break
29411 }
29412 c := auxIntToInt8(con.AuxInt)
29413 if !(0 < c && c < 32) {
29414 break
29415 }
29416 v.reset(OpRsh32Ux8)
29417 v.AuxInt = boolToAuxInt(true)
29418 v.AddArg2(x, con)
29419 return true
29420 }
29421 return false
29422 }
29423 func rewriteValuegeneric_OpRsh32x16(v *Value) bool {
29424 v_1 := v.Args[1]
29425 v_0 := v.Args[0]
29426 b := v.Block
29427
29428
29429 for {
29430 t := v.Type
29431 x := v_0
29432 if v_1.Op != OpConst16 {
29433 break
29434 }
29435 c := auxIntToInt16(v_1.AuxInt)
29436 v.reset(OpRsh32x64)
29437 v0 := b.NewValue0(v.Pos, OpConst64, t)
29438 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
29439 v.AddArg2(x, v0)
29440 return true
29441 }
29442
29443
29444 for {
29445 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
29446 break
29447 }
29448 v.reset(OpConst32)
29449 v.AuxInt = int32ToAuxInt(0)
29450 return true
29451 }
29452
29453
29454
29455 for {
29456 if auxIntToBool(v.AuxInt) != false {
29457 break
29458 }
29459 x := v_0
29460 con := v_1
29461 if con.Op != OpConst16 {
29462 break
29463 }
29464 c := auxIntToInt16(con.AuxInt)
29465 if !(0 < c && c < 32) {
29466 break
29467 }
29468 v.reset(OpRsh32x16)
29469 v.AuxInt = boolToAuxInt(true)
29470 v.AddArg2(x, con)
29471 return true
29472 }
29473 return false
29474 }
29475 func rewriteValuegeneric_OpRsh32x32(v *Value) bool {
29476 v_1 := v.Args[1]
29477 v_0 := v.Args[0]
29478 b := v.Block
29479
29480
29481 for {
29482 t := v.Type
29483 x := v_0
29484 if v_1.Op != OpConst32 {
29485 break
29486 }
29487 c := auxIntToInt32(v_1.AuxInt)
29488 v.reset(OpRsh32x64)
29489 v0 := b.NewValue0(v.Pos, OpConst64, t)
29490 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
29491 v.AddArg2(x, v0)
29492 return true
29493 }
29494
29495
29496 for {
29497 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
29498 break
29499 }
29500 v.reset(OpConst32)
29501 v.AuxInt = int32ToAuxInt(0)
29502 return true
29503 }
29504
29505
29506
29507 for {
29508 if auxIntToBool(v.AuxInt) != false {
29509 break
29510 }
29511 x := v_0
29512 con := v_1
29513 if con.Op != OpConst32 {
29514 break
29515 }
29516 c := auxIntToInt32(con.AuxInt)
29517 if !(0 < c && c < 32) {
29518 break
29519 }
29520 v.reset(OpRsh32x32)
29521 v.AuxInt = boolToAuxInt(true)
29522 v.AddArg2(x, con)
29523 return true
29524 }
29525 return false
29526 }
29527 func rewriteValuegeneric_OpRsh32x64(v *Value) bool {
29528 v_1 := v.Args[1]
29529 v_0 := v.Args[0]
29530 b := v.Block
29531 typ := &b.Func.Config.Types
29532
29533
29534 for {
29535 if v_0.Op != OpConst32 {
29536 break
29537 }
29538 c := auxIntToInt32(v_0.AuxInt)
29539 if v_1.Op != OpConst64 {
29540 break
29541 }
29542 d := auxIntToInt64(v_1.AuxInt)
29543 v.reset(OpConst32)
29544 v.AuxInt = int32ToAuxInt(c >> uint64(d))
29545 return true
29546 }
29547
29548
29549 for {
29550 x := v_0
29551 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
29552 break
29553 }
29554 v.copyOf(x)
29555 return true
29556 }
29557
29558
29559 for {
29560 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
29561 break
29562 }
29563 v.reset(OpConst32)
29564 v.AuxInt = int32ToAuxInt(0)
29565 return true
29566 }
29567
29568
29569
29570 for {
29571 t := v.Type
29572 if v_0.Op != OpRsh32x64 {
29573 break
29574 }
29575 _ = v_0.Args[1]
29576 x := v_0.Args[0]
29577 v_0_1 := v_0.Args[1]
29578 if v_0_1.Op != OpConst64 {
29579 break
29580 }
29581 c := auxIntToInt64(v_0_1.AuxInt)
29582 if v_1.Op != OpConst64 {
29583 break
29584 }
29585 d := auxIntToInt64(v_1.AuxInt)
29586 if !(!uaddOvf(c, d)) {
29587 break
29588 }
29589 v.reset(OpRsh32x64)
29590 v0 := b.NewValue0(v.Pos, OpConst64, t)
29591 v0.AuxInt = int64ToAuxInt(c + d)
29592 v.AddArg2(x, v0)
29593 return true
29594 }
29595
29596
29597 for {
29598 if v_0.Op != OpLsh32x64 {
29599 break
29600 }
29601 _ = v_0.Args[1]
29602 x := v_0.Args[0]
29603 v_0_1 := v_0.Args[1]
29604 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 24 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 24 {
29605 break
29606 }
29607 v.reset(OpSignExt8to32)
29608 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.Int8)
29609 v0.AddArg(x)
29610 v.AddArg(v0)
29611 return true
29612 }
29613
29614
29615 for {
29616 if v_0.Op != OpLsh32x64 {
29617 break
29618 }
29619 _ = v_0.Args[1]
29620 x := v_0.Args[0]
29621 v_0_1 := v_0.Args[1]
29622 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 16 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 16 {
29623 break
29624 }
29625 v.reset(OpSignExt16to32)
29626 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.Int16)
29627 v0.AddArg(x)
29628 v.AddArg(v0)
29629 return true
29630 }
29631
29632
29633
29634 for {
29635 if auxIntToBool(v.AuxInt) != false {
29636 break
29637 }
29638 x := v_0
29639 con := v_1
29640 if con.Op != OpConst64 {
29641 break
29642 }
29643 c := auxIntToInt64(con.AuxInt)
29644 if !(0 < c && c < 32) {
29645 break
29646 }
29647 v.reset(OpRsh32x64)
29648 v.AuxInt = boolToAuxInt(true)
29649 v.AddArg2(x, con)
29650 return true
29651 }
29652 return false
29653 }
29654 func rewriteValuegeneric_OpRsh32x8(v *Value) bool {
29655 v_1 := v.Args[1]
29656 v_0 := v.Args[0]
29657 b := v.Block
29658
29659
29660 for {
29661 t := v.Type
29662 x := v_0
29663 if v_1.Op != OpConst8 {
29664 break
29665 }
29666 c := auxIntToInt8(v_1.AuxInt)
29667 v.reset(OpRsh32x64)
29668 v0 := b.NewValue0(v.Pos, OpConst64, t)
29669 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
29670 v.AddArg2(x, v0)
29671 return true
29672 }
29673
29674
29675 for {
29676 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
29677 break
29678 }
29679 v.reset(OpConst32)
29680 v.AuxInt = int32ToAuxInt(0)
29681 return true
29682 }
29683
29684
29685
29686 for {
29687 if auxIntToBool(v.AuxInt) != false {
29688 break
29689 }
29690 x := v_0
29691 con := v_1
29692 if con.Op != OpConst8 {
29693 break
29694 }
29695 c := auxIntToInt8(con.AuxInt)
29696 if !(0 < c && c < 32) {
29697 break
29698 }
29699 v.reset(OpRsh32x8)
29700 v.AuxInt = boolToAuxInt(true)
29701 v.AddArg2(x, con)
29702 return true
29703 }
29704 return false
29705 }
29706 func rewriteValuegeneric_OpRsh64Ux16(v *Value) bool {
29707 v_1 := v.Args[1]
29708 v_0 := v.Args[0]
29709 b := v.Block
29710
29711
29712 for {
29713 t := v.Type
29714 x := v_0
29715 if v_1.Op != OpConst16 {
29716 break
29717 }
29718 c := auxIntToInt16(v_1.AuxInt)
29719 v.reset(OpRsh64Ux64)
29720 v0 := b.NewValue0(v.Pos, OpConst64, t)
29721 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
29722 v.AddArg2(x, v0)
29723 return true
29724 }
29725
29726
29727 for {
29728 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29729 break
29730 }
29731 v.reset(OpConst64)
29732 v.AuxInt = int64ToAuxInt(0)
29733 return true
29734 }
29735
29736
29737
29738 for {
29739 if auxIntToBool(v.AuxInt) != false {
29740 break
29741 }
29742 x := v_0
29743 con := v_1
29744 if con.Op != OpConst16 {
29745 break
29746 }
29747 c := auxIntToInt16(con.AuxInt)
29748 if !(0 < c && c < 64) {
29749 break
29750 }
29751 v.reset(OpRsh64Ux16)
29752 v.AuxInt = boolToAuxInt(true)
29753 v.AddArg2(x, con)
29754 return true
29755 }
29756 return false
29757 }
29758 func rewriteValuegeneric_OpRsh64Ux32(v *Value) bool {
29759 v_1 := v.Args[1]
29760 v_0 := v.Args[0]
29761 b := v.Block
29762
29763
29764 for {
29765 t := v.Type
29766 x := v_0
29767 if v_1.Op != OpConst32 {
29768 break
29769 }
29770 c := auxIntToInt32(v_1.AuxInt)
29771 v.reset(OpRsh64Ux64)
29772 v0 := b.NewValue0(v.Pos, OpConst64, t)
29773 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
29774 v.AddArg2(x, v0)
29775 return true
29776 }
29777
29778
29779 for {
29780 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29781 break
29782 }
29783 v.reset(OpConst64)
29784 v.AuxInt = int64ToAuxInt(0)
29785 return true
29786 }
29787
29788
29789
29790 for {
29791 if auxIntToBool(v.AuxInt) != false {
29792 break
29793 }
29794 x := v_0
29795 con := v_1
29796 if con.Op != OpConst32 {
29797 break
29798 }
29799 c := auxIntToInt32(con.AuxInt)
29800 if !(0 < c && c < 64) {
29801 break
29802 }
29803 v.reset(OpRsh64Ux32)
29804 v.AuxInt = boolToAuxInt(true)
29805 v.AddArg2(x, con)
29806 return true
29807 }
29808 return false
29809 }
29810 func rewriteValuegeneric_OpRsh64Ux64(v *Value) bool {
29811 v_1 := v.Args[1]
29812 v_0 := v.Args[0]
29813 b := v.Block
29814 typ := &b.Func.Config.Types
29815
29816
29817 for {
29818 if v_0.Op != OpConst64 {
29819 break
29820 }
29821 c := auxIntToInt64(v_0.AuxInt)
29822 if v_1.Op != OpConst64 {
29823 break
29824 }
29825 d := auxIntToInt64(v_1.AuxInt)
29826 v.reset(OpConst64)
29827 v.AuxInt = int64ToAuxInt(int64(uint64(c) >> uint64(d)))
29828 return true
29829 }
29830
29831
29832 for {
29833 x := v_0
29834 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
29835 break
29836 }
29837 v.copyOf(x)
29838 return true
29839 }
29840
29841
29842 for {
29843 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29844 break
29845 }
29846 v.reset(OpConst64)
29847 v.AuxInt = int64ToAuxInt(0)
29848 return true
29849 }
29850
29851
29852
29853 for {
29854 if v_1.Op != OpConst64 {
29855 break
29856 }
29857 c := auxIntToInt64(v_1.AuxInt)
29858 if !(uint64(c) >= 64) {
29859 break
29860 }
29861 v.reset(OpConst64)
29862 v.AuxInt = int64ToAuxInt(0)
29863 return true
29864 }
29865
29866
29867
29868 for {
29869 t := v.Type
29870 if v_0.Op != OpRsh64Ux64 {
29871 break
29872 }
29873 _ = v_0.Args[1]
29874 x := v_0.Args[0]
29875 v_0_1 := v_0.Args[1]
29876 if v_0_1.Op != OpConst64 {
29877 break
29878 }
29879 c := auxIntToInt64(v_0_1.AuxInt)
29880 if v_1.Op != OpConst64 {
29881 break
29882 }
29883 d := auxIntToInt64(v_1.AuxInt)
29884 if !(!uaddOvf(c, d)) {
29885 break
29886 }
29887 v.reset(OpRsh64Ux64)
29888 v0 := b.NewValue0(v.Pos, OpConst64, t)
29889 v0.AuxInt = int64ToAuxInt(c + d)
29890 v.AddArg2(x, v0)
29891 return true
29892 }
29893
29894
29895 for {
29896 if v_0.Op != OpRsh64x64 {
29897 break
29898 }
29899 x := v_0.Args[0]
29900 if v_1.Op != OpConst64 {
29901 break
29902 }
29903 t := v_1.Type
29904 if auxIntToInt64(v_1.AuxInt) != 63 {
29905 break
29906 }
29907 v.reset(OpRsh64Ux64)
29908 v0 := b.NewValue0(v.Pos, OpConst64, t)
29909 v0.AuxInt = int64ToAuxInt(63)
29910 v.AddArg2(x, v0)
29911 return true
29912 }
29913
29914
29915
29916 for {
29917 i := v_0
29918 if i.Op != OpLsh64x64 {
29919 break
29920 }
29921 _ = i.Args[1]
29922 x := i.Args[0]
29923 i_1 := i.Args[1]
29924 if i_1.Op != OpConst64 {
29925 break
29926 }
29927 c := auxIntToInt64(i_1.AuxInt)
29928 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
29929 break
29930 }
29931 v.reset(OpAnd64)
29932 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
29933 v0.AuxInt = int64ToAuxInt(int64(^uint64(0) >> c))
29934 v.AddArg2(x, v0)
29935 return true
29936 }
29937
29938
29939
29940 for {
29941 if v_0.Op != OpLsh64x64 {
29942 break
29943 }
29944 _ = v_0.Args[1]
29945 v_0_0 := v_0.Args[0]
29946 if v_0_0.Op != OpRsh64Ux64 {
29947 break
29948 }
29949 _ = v_0_0.Args[1]
29950 x := v_0_0.Args[0]
29951 v_0_0_1 := v_0_0.Args[1]
29952 if v_0_0_1.Op != OpConst64 {
29953 break
29954 }
29955 c1 := auxIntToInt64(v_0_0_1.AuxInt)
29956 v_0_1 := v_0.Args[1]
29957 if v_0_1.Op != OpConst64 {
29958 break
29959 }
29960 c2 := auxIntToInt64(v_0_1.AuxInt)
29961 if v_1.Op != OpConst64 {
29962 break
29963 }
29964 c3 := auxIntToInt64(v_1.AuxInt)
29965 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
29966 break
29967 }
29968 v.reset(OpRsh64Ux64)
29969 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
29970 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
29971 v.AddArg2(x, v0)
29972 return true
29973 }
29974
29975
29976 for {
29977 if v_0.Op != OpLsh64x64 {
29978 break
29979 }
29980 _ = v_0.Args[1]
29981 x := v_0.Args[0]
29982 v_0_1 := v_0.Args[1]
29983 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 56 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 56 {
29984 break
29985 }
29986 v.reset(OpZeroExt8to64)
29987 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.UInt8)
29988 v0.AddArg(x)
29989 v.AddArg(v0)
29990 return true
29991 }
29992
29993
29994 for {
29995 if v_0.Op != OpLsh64x64 {
29996 break
29997 }
29998 _ = v_0.Args[1]
29999 x := v_0.Args[0]
30000 v_0_1 := v_0.Args[1]
30001 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 48 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 48 {
30002 break
30003 }
30004 v.reset(OpZeroExt16to64)
30005 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.UInt16)
30006 v0.AddArg(x)
30007 v.AddArg(v0)
30008 return true
30009 }
30010
30011
30012 for {
30013 if v_0.Op != OpLsh64x64 {
30014 break
30015 }
30016 _ = v_0.Args[1]
30017 x := v_0.Args[0]
30018 v_0_1 := v_0.Args[1]
30019 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 32 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 32 {
30020 break
30021 }
30022 v.reset(OpZeroExt32to64)
30023 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.UInt32)
30024 v0.AddArg(x)
30025 v.AddArg(v0)
30026 return true
30027 }
30028
30029
30030
30031 for {
30032 if auxIntToBool(v.AuxInt) != false {
30033 break
30034 }
30035 x := v_0
30036 con := v_1
30037 if con.Op != OpConst64 {
30038 break
30039 }
30040 c := auxIntToInt64(con.AuxInt)
30041 if !(0 < c && c < 64) {
30042 break
30043 }
30044 v.reset(OpRsh64Ux64)
30045 v.AuxInt = boolToAuxInt(true)
30046 v.AddArg2(x, con)
30047 return true
30048 }
30049 return false
30050 }
30051 func rewriteValuegeneric_OpRsh64Ux8(v *Value) bool {
30052 v_1 := v.Args[1]
30053 v_0 := v.Args[0]
30054 b := v.Block
30055
30056
30057 for {
30058 t := v.Type
30059 x := v_0
30060 if v_1.Op != OpConst8 {
30061 break
30062 }
30063 c := auxIntToInt8(v_1.AuxInt)
30064 v.reset(OpRsh64Ux64)
30065 v0 := b.NewValue0(v.Pos, OpConst64, t)
30066 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
30067 v.AddArg2(x, v0)
30068 return true
30069 }
30070
30071
30072 for {
30073 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
30074 break
30075 }
30076 v.reset(OpConst64)
30077 v.AuxInt = int64ToAuxInt(0)
30078 return true
30079 }
30080
30081
30082
30083 for {
30084 if auxIntToBool(v.AuxInt) != false {
30085 break
30086 }
30087 x := v_0
30088 con := v_1
30089 if con.Op != OpConst8 {
30090 break
30091 }
30092 c := auxIntToInt8(con.AuxInt)
30093 if !(0 < c && c < 64) {
30094 break
30095 }
30096 v.reset(OpRsh64Ux8)
30097 v.AuxInt = boolToAuxInt(true)
30098 v.AddArg2(x, con)
30099 return true
30100 }
30101 return false
30102 }
30103 func rewriteValuegeneric_OpRsh64x16(v *Value) bool {
30104 v_1 := v.Args[1]
30105 v_0 := v.Args[0]
30106 b := v.Block
30107
30108
30109 for {
30110 t := v.Type
30111 x := v_0
30112 if v_1.Op != OpConst16 {
30113 break
30114 }
30115 c := auxIntToInt16(v_1.AuxInt)
30116 v.reset(OpRsh64x64)
30117 v0 := b.NewValue0(v.Pos, OpConst64, t)
30118 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
30119 v.AddArg2(x, v0)
30120 return true
30121 }
30122
30123
30124 for {
30125 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
30126 break
30127 }
30128 v.reset(OpConst64)
30129 v.AuxInt = int64ToAuxInt(0)
30130 return true
30131 }
30132
30133
30134
30135 for {
30136 if auxIntToBool(v.AuxInt) != false {
30137 break
30138 }
30139 x := v_0
30140 con := v_1
30141 if con.Op != OpConst16 {
30142 break
30143 }
30144 c := auxIntToInt16(con.AuxInt)
30145 if !(0 < c && c < 64) {
30146 break
30147 }
30148 v.reset(OpRsh64x16)
30149 v.AuxInt = boolToAuxInt(true)
30150 v.AddArg2(x, con)
30151 return true
30152 }
30153 return false
30154 }
30155 func rewriteValuegeneric_OpRsh64x32(v *Value) bool {
30156 v_1 := v.Args[1]
30157 v_0 := v.Args[0]
30158 b := v.Block
30159
30160
30161 for {
30162 t := v.Type
30163 x := v_0
30164 if v_1.Op != OpConst32 {
30165 break
30166 }
30167 c := auxIntToInt32(v_1.AuxInt)
30168 v.reset(OpRsh64x64)
30169 v0 := b.NewValue0(v.Pos, OpConst64, t)
30170 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
30171 v.AddArg2(x, v0)
30172 return true
30173 }
30174
30175
30176 for {
30177 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
30178 break
30179 }
30180 v.reset(OpConst64)
30181 v.AuxInt = int64ToAuxInt(0)
30182 return true
30183 }
30184
30185
30186
30187 for {
30188 if auxIntToBool(v.AuxInt) != false {
30189 break
30190 }
30191 x := v_0
30192 con := v_1
30193 if con.Op != OpConst32 {
30194 break
30195 }
30196 c := auxIntToInt32(con.AuxInt)
30197 if !(0 < c && c < 64) {
30198 break
30199 }
30200 v.reset(OpRsh64x32)
30201 v.AuxInt = boolToAuxInt(true)
30202 v.AddArg2(x, con)
30203 return true
30204 }
30205 return false
30206 }
30207 func rewriteValuegeneric_OpRsh64x64(v *Value) bool {
30208 v_1 := v.Args[1]
30209 v_0 := v.Args[0]
30210 b := v.Block
30211 typ := &b.Func.Config.Types
30212
30213
30214 for {
30215 if v_0.Op != OpConst64 {
30216 break
30217 }
30218 c := auxIntToInt64(v_0.AuxInt)
30219 if v_1.Op != OpConst64 {
30220 break
30221 }
30222 d := auxIntToInt64(v_1.AuxInt)
30223 v.reset(OpConst64)
30224 v.AuxInt = int64ToAuxInt(c >> uint64(d))
30225 return true
30226 }
30227
30228
30229 for {
30230 x := v_0
30231 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
30232 break
30233 }
30234 v.copyOf(x)
30235 return true
30236 }
30237
30238
30239 for {
30240 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
30241 break
30242 }
30243 v.reset(OpConst64)
30244 v.AuxInt = int64ToAuxInt(0)
30245 return true
30246 }
30247
30248
30249
30250 for {
30251 t := v.Type
30252 if v_0.Op != OpRsh64x64 {
30253 break
30254 }
30255 _ = v_0.Args[1]
30256 x := v_0.Args[0]
30257 v_0_1 := v_0.Args[1]
30258 if v_0_1.Op != OpConst64 {
30259 break
30260 }
30261 c := auxIntToInt64(v_0_1.AuxInt)
30262 if v_1.Op != OpConst64 {
30263 break
30264 }
30265 d := auxIntToInt64(v_1.AuxInt)
30266 if !(!uaddOvf(c, d)) {
30267 break
30268 }
30269 v.reset(OpRsh64x64)
30270 v0 := b.NewValue0(v.Pos, OpConst64, t)
30271 v0.AuxInt = int64ToAuxInt(c + d)
30272 v.AddArg2(x, v0)
30273 return true
30274 }
30275
30276
30277 for {
30278 if v_0.Op != OpLsh64x64 {
30279 break
30280 }
30281 _ = v_0.Args[1]
30282 x := v_0.Args[0]
30283 v_0_1 := v_0.Args[1]
30284 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 56 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 56 {
30285 break
30286 }
30287 v.reset(OpSignExt8to64)
30288 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.Int8)
30289 v0.AddArg(x)
30290 v.AddArg(v0)
30291 return true
30292 }
30293
30294
30295 for {
30296 if v_0.Op != OpLsh64x64 {
30297 break
30298 }
30299 _ = v_0.Args[1]
30300 x := v_0.Args[0]
30301 v_0_1 := v_0.Args[1]
30302 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 48 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 48 {
30303 break
30304 }
30305 v.reset(OpSignExt16to64)
30306 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.Int16)
30307 v0.AddArg(x)
30308 v.AddArg(v0)
30309 return true
30310 }
30311
30312
30313 for {
30314 if v_0.Op != OpLsh64x64 {
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 || auxIntToInt64(v_0_1.AuxInt) != 32 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 32 {
30321 break
30322 }
30323 v.reset(OpSignExt32to64)
30324 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.Int32)
30325 v0.AddArg(x)
30326 v.AddArg(v0)
30327 return true
30328 }
30329
30330
30331
30332 for {
30333 if auxIntToBool(v.AuxInt) != false {
30334 break
30335 }
30336 x := v_0
30337 con := v_1
30338 if con.Op != OpConst64 {
30339 break
30340 }
30341 c := auxIntToInt64(con.AuxInt)
30342 if !(0 < c && c < 64) {
30343 break
30344 }
30345 v.reset(OpRsh64x64)
30346 v.AuxInt = boolToAuxInt(true)
30347 v.AddArg2(x, con)
30348 return true
30349 }
30350 return false
30351 }
30352 func rewriteValuegeneric_OpRsh64x8(v *Value) bool {
30353 v_1 := v.Args[1]
30354 v_0 := v.Args[0]
30355 b := v.Block
30356
30357
30358 for {
30359 t := v.Type
30360 x := v_0
30361 if v_1.Op != OpConst8 {
30362 break
30363 }
30364 c := auxIntToInt8(v_1.AuxInt)
30365 v.reset(OpRsh64x64)
30366 v0 := b.NewValue0(v.Pos, OpConst64, t)
30367 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
30368 v.AddArg2(x, v0)
30369 return true
30370 }
30371
30372
30373 for {
30374 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
30375 break
30376 }
30377 v.reset(OpConst64)
30378 v.AuxInt = int64ToAuxInt(0)
30379 return true
30380 }
30381
30382
30383
30384 for {
30385 if auxIntToBool(v.AuxInt) != false {
30386 break
30387 }
30388 x := v_0
30389 con := v_1
30390 if con.Op != OpConst8 {
30391 break
30392 }
30393 c := auxIntToInt8(con.AuxInt)
30394 if !(0 < c && c < 64) {
30395 break
30396 }
30397 v.reset(OpRsh64x8)
30398 v.AuxInt = boolToAuxInt(true)
30399 v.AddArg2(x, con)
30400 return true
30401 }
30402 return false
30403 }
30404 func rewriteValuegeneric_OpRsh8Ux16(v *Value) bool {
30405 v_1 := v.Args[1]
30406 v_0 := v.Args[0]
30407 b := v.Block
30408
30409
30410 for {
30411 t := v.Type
30412 x := v_0
30413 if v_1.Op != OpConst16 {
30414 break
30415 }
30416 c := auxIntToInt16(v_1.AuxInt)
30417 v.reset(OpRsh8Ux64)
30418 v0 := b.NewValue0(v.Pos, OpConst64, t)
30419 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
30420 v.AddArg2(x, v0)
30421 return true
30422 }
30423
30424
30425 for {
30426 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
30427 break
30428 }
30429 v.reset(OpConst8)
30430 v.AuxInt = int8ToAuxInt(0)
30431 return true
30432 }
30433
30434
30435
30436 for {
30437 if auxIntToBool(v.AuxInt) != false {
30438 break
30439 }
30440 x := v_0
30441 con := v_1
30442 if con.Op != OpConst16 {
30443 break
30444 }
30445 c := auxIntToInt16(con.AuxInt)
30446 if !(0 < c && c < 8) {
30447 break
30448 }
30449 v.reset(OpRsh8Ux16)
30450 v.AuxInt = boolToAuxInt(true)
30451 v.AddArg2(x, con)
30452 return true
30453 }
30454 return false
30455 }
30456 func rewriteValuegeneric_OpRsh8Ux32(v *Value) bool {
30457 v_1 := v.Args[1]
30458 v_0 := v.Args[0]
30459 b := v.Block
30460
30461
30462 for {
30463 t := v.Type
30464 x := v_0
30465 if v_1.Op != OpConst32 {
30466 break
30467 }
30468 c := auxIntToInt32(v_1.AuxInt)
30469 v.reset(OpRsh8Ux64)
30470 v0 := b.NewValue0(v.Pos, OpConst64, t)
30471 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
30472 v.AddArg2(x, v0)
30473 return true
30474 }
30475
30476
30477 for {
30478 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
30479 break
30480 }
30481 v.reset(OpConst8)
30482 v.AuxInt = int8ToAuxInt(0)
30483 return true
30484 }
30485
30486
30487
30488 for {
30489 if auxIntToBool(v.AuxInt) != false {
30490 break
30491 }
30492 x := v_0
30493 con := v_1
30494 if con.Op != OpConst32 {
30495 break
30496 }
30497 c := auxIntToInt32(con.AuxInt)
30498 if !(0 < c && c < 8) {
30499 break
30500 }
30501 v.reset(OpRsh8Ux32)
30502 v.AuxInt = boolToAuxInt(true)
30503 v.AddArg2(x, con)
30504 return true
30505 }
30506 return false
30507 }
30508 func rewriteValuegeneric_OpRsh8Ux64(v *Value) bool {
30509 v_1 := v.Args[1]
30510 v_0 := v.Args[0]
30511 b := v.Block
30512 typ := &b.Func.Config.Types
30513
30514
30515 for {
30516 if v_0.Op != OpConst8 {
30517 break
30518 }
30519 c := auxIntToInt8(v_0.AuxInt)
30520 if v_1.Op != OpConst64 {
30521 break
30522 }
30523 d := auxIntToInt64(v_1.AuxInt)
30524 v.reset(OpConst8)
30525 v.AuxInt = int8ToAuxInt(int8(uint8(c) >> uint64(d)))
30526 return true
30527 }
30528
30529
30530 for {
30531 x := v_0
30532 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
30533 break
30534 }
30535 v.copyOf(x)
30536 return true
30537 }
30538
30539
30540 for {
30541 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
30542 break
30543 }
30544 v.reset(OpConst8)
30545 v.AuxInt = int8ToAuxInt(0)
30546 return true
30547 }
30548
30549
30550
30551 for {
30552 if v_1.Op != OpConst64 {
30553 break
30554 }
30555 c := auxIntToInt64(v_1.AuxInt)
30556 if !(uint64(c) >= 8) {
30557 break
30558 }
30559 v.reset(OpConst8)
30560 v.AuxInt = int8ToAuxInt(0)
30561 return true
30562 }
30563
30564
30565
30566 for {
30567 t := v.Type
30568 if v_0.Op != OpRsh8Ux64 {
30569 break
30570 }
30571 _ = v_0.Args[1]
30572 x := v_0.Args[0]
30573 v_0_1 := v_0.Args[1]
30574 if v_0_1.Op != OpConst64 {
30575 break
30576 }
30577 c := auxIntToInt64(v_0_1.AuxInt)
30578 if v_1.Op != OpConst64 {
30579 break
30580 }
30581 d := auxIntToInt64(v_1.AuxInt)
30582 if !(!uaddOvf(c, d)) {
30583 break
30584 }
30585 v.reset(OpRsh8Ux64)
30586 v0 := b.NewValue0(v.Pos, OpConst64, t)
30587 v0.AuxInt = int64ToAuxInt(c + d)
30588 v.AddArg2(x, v0)
30589 return true
30590 }
30591
30592
30593 for {
30594 if v_0.Op != OpRsh8x64 {
30595 break
30596 }
30597 x := v_0.Args[0]
30598 if v_1.Op != OpConst64 {
30599 break
30600 }
30601 t := v_1.Type
30602 if auxIntToInt64(v_1.AuxInt) != 7 {
30603 break
30604 }
30605 v.reset(OpRsh8Ux64)
30606 v0 := b.NewValue0(v.Pos, OpConst64, t)
30607 v0.AuxInt = int64ToAuxInt(7)
30608 v.AddArg2(x, v0)
30609 return true
30610 }
30611
30612
30613
30614 for {
30615 i := v_0
30616 if i.Op != OpLsh8x64 {
30617 break
30618 }
30619 _ = i.Args[1]
30620 x := i.Args[0]
30621 i_1 := i.Args[1]
30622 if i_1.Op != OpConst64 {
30623 break
30624 }
30625 c := auxIntToInt64(i_1.AuxInt)
30626 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
30627 break
30628 }
30629 v.reset(OpAnd8)
30630 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
30631 v0.AuxInt = int8ToAuxInt(int8(^uint8(0) >> c))
30632 v.AddArg2(x, v0)
30633 return true
30634 }
30635
30636
30637
30638 for {
30639 if v_0.Op != OpLsh8x64 {
30640 break
30641 }
30642 _ = v_0.Args[1]
30643 v_0_0 := v_0.Args[0]
30644 if v_0_0.Op != OpRsh8Ux64 {
30645 break
30646 }
30647 _ = v_0_0.Args[1]
30648 x := v_0_0.Args[0]
30649 v_0_0_1 := v_0_0.Args[1]
30650 if v_0_0_1.Op != OpConst64 {
30651 break
30652 }
30653 c1 := auxIntToInt64(v_0_0_1.AuxInt)
30654 v_0_1 := v_0.Args[1]
30655 if v_0_1.Op != OpConst64 {
30656 break
30657 }
30658 c2 := auxIntToInt64(v_0_1.AuxInt)
30659 if v_1.Op != OpConst64 {
30660 break
30661 }
30662 c3 := auxIntToInt64(v_1.AuxInt)
30663 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
30664 break
30665 }
30666 v.reset(OpRsh8Ux64)
30667 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
30668 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
30669 v.AddArg2(x, v0)
30670 return true
30671 }
30672
30673
30674
30675 for {
30676 if auxIntToBool(v.AuxInt) != false {
30677 break
30678 }
30679 x := v_0
30680 con := v_1
30681 if con.Op != OpConst64 {
30682 break
30683 }
30684 c := auxIntToInt64(con.AuxInt)
30685 if !(0 < c && c < 8) {
30686 break
30687 }
30688 v.reset(OpRsh8Ux64)
30689 v.AuxInt = boolToAuxInt(true)
30690 v.AddArg2(x, con)
30691 return true
30692 }
30693 return false
30694 }
30695 func rewriteValuegeneric_OpRsh8Ux8(v *Value) bool {
30696 v_1 := v.Args[1]
30697 v_0 := v.Args[0]
30698 b := v.Block
30699
30700
30701 for {
30702 t := v.Type
30703 x := v_0
30704 if v_1.Op != OpConst8 {
30705 break
30706 }
30707 c := auxIntToInt8(v_1.AuxInt)
30708 v.reset(OpRsh8Ux64)
30709 v0 := b.NewValue0(v.Pos, OpConst64, t)
30710 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
30711 v.AddArg2(x, v0)
30712 return true
30713 }
30714
30715
30716 for {
30717 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
30718 break
30719 }
30720 v.reset(OpConst8)
30721 v.AuxInt = int8ToAuxInt(0)
30722 return true
30723 }
30724
30725
30726
30727 for {
30728 if auxIntToBool(v.AuxInt) != false {
30729 break
30730 }
30731 x := v_0
30732 con := v_1
30733 if con.Op != OpConst8 {
30734 break
30735 }
30736 c := auxIntToInt8(con.AuxInt)
30737 if !(0 < c && c < 8) {
30738 break
30739 }
30740 v.reset(OpRsh8Ux8)
30741 v.AuxInt = boolToAuxInt(true)
30742 v.AddArg2(x, con)
30743 return true
30744 }
30745 return false
30746 }
30747 func rewriteValuegeneric_OpRsh8x16(v *Value) bool {
30748 v_1 := v.Args[1]
30749 v_0 := v.Args[0]
30750 b := v.Block
30751
30752
30753 for {
30754 t := v.Type
30755 x := v_0
30756 if v_1.Op != OpConst16 {
30757 break
30758 }
30759 c := auxIntToInt16(v_1.AuxInt)
30760 v.reset(OpRsh8x64)
30761 v0 := b.NewValue0(v.Pos, OpConst64, t)
30762 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
30763 v.AddArg2(x, v0)
30764 return true
30765 }
30766
30767
30768 for {
30769 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
30770 break
30771 }
30772 v.reset(OpConst8)
30773 v.AuxInt = int8ToAuxInt(0)
30774 return true
30775 }
30776
30777
30778
30779 for {
30780 if auxIntToBool(v.AuxInt) != false {
30781 break
30782 }
30783 x := v_0
30784 con := v_1
30785 if con.Op != OpConst16 {
30786 break
30787 }
30788 c := auxIntToInt16(con.AuxInt)
30789 if !(0 < c && c < 8) {
30790 break
30791 }
30792 v.reset(OpRsh8x16)
30793 v.AuxInt = boolToAuxInt(true)
30794 v.AddArg2(x, con)
30795 return true
30796 }
30797 return false
30798 }
30799 func rewriteValuegeneric_OpRsh8x32(v *Value) bool {
30800 v_1 := v.Args[1]
30801 v_0 := v.Args[0]
30802 b := v.Block
30803
30804
30805 for {
30806 t := v.Type
30807 x := v_0
30808 if v_1.Op != OpConst32 {
30809 break
30810 }
30811 c := auxIntToInt32(v_1.AuxInt)
30812 v.reset(OpRsh8x64)
30813 v0 := b.NewValue0(v.Pos, OpConst64, t)
30814 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
30815 v.AddArg2(x, v0)
30816 return true
30817 }
30818
30819
30820 for {
30821 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
30822 break
30823 }
30824 v.reset(OpConst8)
30825 v.AuxInt = int8ToAuxInt(0)
30826 return true
30827 }
30828
30829
30830
30831 for {
30832 if auxIntToBool(v.AuxInt) != false {
30833 break
30834 }
30835 x := v_0
30836 con := v_1
30837 if con.Op != OpConst32 {
30838 break
30839 }
30840 c := auxIntToInt32(con.AuxInt)
30841 if !(0 < c && c < 8) {
30842 break
30843 }
30844 v.reset(OpRsh8x32)
30845 v.AuxInt = boolToAuxInt(true)
30846 v.AddArg2(x, con)
30847 return true
30848 }
30849 return false
30850 }
30851 func rewriteValuegeneric_OpRsh8x64(v *Value) bool {
30852 v_1 := v.Args[1]
30853 v_0 := v.Args[0]
30854 b := v.Block
30855
30856
30857 for {
30858 if v_0.Op != OpConst8 {
30859 break
30860 }
30861 c := auxIntToInt8(v_0.AuxInt)
30862 if v_1.Op != OpConst64 {
30863 break
30864 }
30865 d := auxIntToInt64(v_1.AuxInt)
30866 v.reset(OpConst8)
30867 v.AuxInt = int8ToAuxInt(c >> uint64(d))
30868 return true
30869 }
30870
30871
30872 for {
30873 x := v_0
30874 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
30875 break
30876 }
30877 v.copyOf(x)
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 t := v.Type
30895 if v_0.Op != OpRsh8x64 {
30896 break
30897 }
30898 _ = v_0.Args[1]
30899 x := v_0.Args[0]
30900 v_0_1 := v_0.Args[1]
30901 if v_0_1.Op != OpConst64 {
30902 break
30903 }
30904 c := auxIntToInt64(v_0_1.AuxInt)
30905 if v_1.Op != OpConst64 {
30906 break
30907 }
30908 d := auxIntToInt64(v_1.AuxInt)
30909 if !(!uaddOvf(c, d)) {
30910 break
30911 }
30912 v.reset(OpRsh8x64)
30913 v0 := b.NewValue0(v.Pos, OpConst64, t)
30914 v0.AuxInt = int64ToAuxInt(c + d)
30915 v.AddArg2(x, v0)
30916 return true
30917 }
30918
30919
30920
30921 for {
30922 if auxIntToBool(v.AuxInt) != false {
30923 break
30924 }
30925 x := v_0
30926 con := v_1
30927 if con.Op != OpConst64 {
30928 break
30929 }
30930 c := auxIntToInt64(con.AuxInt)
30931 if !(0 < c && c < 8) {
30932 break
30933 }
30934 v.reset(OpRsh8x64)
30935 v.AuxInt = boolToAuxInt(true)
30936 v.AddArg2(x, con)
30937 return true
30938 }
30939 return false
30940 }
30941 func rewriteValuegeneric_OpRsh8x8(v *Value) bool {
30942 v_1 := v.Args[1]
30943 v_0 := v.Args[0]
30944 b := v.Block
30945
30946
30947 for {
30948 t := v.Type
30949 x := v_0
30950 if v_1.Op != OpConst8 {
30951 break
30952 }
30953 c := auxIntToInt8(v_1.AuxInt)
30954 v.reset(OpRsh8x64)
30955 v0 := b.NewValue0(v.Pos, OpConst64, t)
30956 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
30957 v.AddArg2(x, v0)
30958 return true
30959 }
30960
30961
30962 for {
30963 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
30964 break
30965 }
30966 v.reset(OpConst8)
30967 v.AuxInt = int8ToAuxInt(0)
30968 return true
30969 }
30970
30971
30972
30973 for {
30974 if auxIntToBool(v.AuxInt) != false {
30975 break
30976 }
30977 x := v_0
30978 con := v_1
30979 if con.Op != OpConst8 {
30980 break
30981 }
30982 c := auxIntToInt8(con.AuxInt)
30983 if !(0 < c && c < 8) {
30984 break
30985 }
30986 v.reset(OpRsh8x8)
30987 v.AuxInt = boolToAuxInt(true)
30988 v.AddArg2(x, con)
30989 return true
30990 }
30991 return false
30992 }
30993 func rewriteValuegeneric_OpSelect0(v *Value) bool {
30994 v_0 := v.Args[0]
30995
30996
30997
30998 for {
30999 a := v_0
31000 if a.Op != OpAdd64carry {
31001 break
31002 }
31003 _ = a.Args[2]
31004 x := a.Args[0]
31005 y := a.Args[1]
31006 a_2 := a.Args[2]
31007 if a_2.Op != OpConst64 || auxIntToInt64(a_2.AuxInt) != 0 || !(a.Uses == 1) {
31008 break
31009 }
31010 v.reset(OpAdd64)
31011 v.AddArg2(x, y)
31012 return true
31013 }
31014
31015
31016 for {
31017 if v_0.Op != OpMakeTuple {
31018 break
31019 }
31020 x := v_0.Args[0]
31021 v.copyOf(x)
31022 return true
31023 }
31024 return false
31025 }
31026 func rewriteValuegeneric_OpSelect1(v *Value) bool {
31027 v_0 := v.Args[0]
31028
31029
31030 for {
31031 if v_0.Op != OpMakeTuple {
31032 break
31033 }
31034 y := v_0.Args[1]
31035 v.copyOf(y)
31036 return true
31037 }
31038 return false
31039 }
31040 func rewriteValuegeneric_OpSelectN(v *Value) bool {
31041 v_0 := v.Args[0]
31042 b := v.Block
31043 config := b.Func.Config
31044 typ := &b.Func.Config.Types
31045
31046
31047 for {
31048 n := auxIntToInt64(v.AuxInt)
31049 m := v_0
31050 if m.Op != OpMakeResult {
31051 break
31052 }
31053 v.copyOf(m.Args[n])
31054 return true
31055 }
31056
31057
31058
31059 for {
31060 if auxIntToInt64(v.AuxInt) != 0 {
31061 break
31062 }
31063 call := v_0
31064 if call.Op != OpStaticCall || len(call.Args) != 3 {
31065 break
31066 }
31067 sym := auxToCall(call.Aux)
31068 mem := call.Args[2]
31069 sptr := call.Args[0]
31070 call_1 := call.Args[1]
31071 if call_1.Op != OpConst64 {
31072 break
31073 }
31074 c := auxIntToInt64(call_1.AuxInt)
31075 if !(isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)) {
31076 break
31077 }
31078 v.reset(OpZero)
31079 v.AuxInt = int64ToAuxInt(int64(c))
31080 v.Aux = typeToAux(types.Types[types.TUINT8])
31081 v.AddArg2(sptr, mem)
31082 return true
31083 }
31084
31085
31086
31087 for {
31088 if auxIntToInt64(v.AuxInt) != 0 {
31089 break
31090 }
31091 call := v_0
31092 if call.Op != OpStaticCall || len(call.Args) != 3 {
31093 break
31094 }
31095 sym := auxToCall(call.Aux)
31096 mem := call.Args[2]
31097 sptr := call.Args[0]
31098 call_1 := call.Args[1]
31099 if call_1.Op != OpConst32 {
31100 break
31101 }
31102 c := auxIntToInt32(call_1.AuxInt)
31103 if !(isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)) {
31104 break
31105 }
31106 v.reset(OpZero)
31107 v.AuxInt = int64ToAuxInt(int64(c))
31108 v.Aux = typeToAux(types.Types[types.TUINT8])
31109 v.AddArg2(sptr, mem)
31110 return true
31111 }
31112
31113
31114
31115 for {
31116 if auxIntToInt64(v.AuxInt) != 0 {
31117 break
31118 }
31119 call := v_0
31120 if call.Op != OpStaticCall || len(call.Args) != 1 {
31121 break
31122 }
31123 sym := auxToCall(call.Aux)
31124 s1 := call.Args[0]
31125 if s1.Op != OpStore {
31126 break
31127 }
31128 _ = s1.Args[2]
31129 s1_1 := s1.Args[1]
31130 if s1_1.Op != OpConst64 {
31131 break
31132 }
31133 sz := auxIntToInt64(s1_1.AuxInt)
31134 s2 := s1.Args[2]
31135 if s2.Op != OpStore {
31136 break
31137 }
31138 _ = s2.Args[2]
31139 src := s2.Args[1]
31140 s3 := s2.Args[2]
31141 if s3.Op != OpStore {
31142 break
31143 }
31144 mem := s3.Args[2]
31145 dst := s3.Args[1]
31146 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)) {
31147 break
31148 }
31149 v.reset(OpMove)
31150 v.AuxInt = int64ToAuxInt(int64(sz))
31151 v.Aux = typeToAux(types.Types[types.TUINT8])
31152 v.AddArg3(dst, src, mem)
31153 return true
31154 }
31155
31156
31157
31158 for {
31159 if auxIntToInt64(v.AuxInt) != 0 {
31160 break
31161 }
31162 call := v_0
31163 if call.Op != OpStaticCall || len(call.Args) != 1 {
31164 break
31165 }
31166 sym := auxToCall(call.Aux)
31167 s1 := call.Args[0]
31168 if s1.Op != OpStore {
31169 break
31170 }
31171 _ = s1.Args[2]
31172 s1_1 := s1.Args[1]
31173 if s1_1.Op != OpConst32 {
31174 break
31175 }
31176 sz := auxIntToInt32(s1_1.AuxInt)
31177 s2 := s1.Args[2]
31178 if s2.Op != OpStore {
31179 break
31180 }
31181 _ = s2.Args[2]
31182 src := s2.Args[1]
31183 s3 := s2.Args[2]
31184 if s3.Op != OpStore {
31185 break
31186 }
31187 mem := s3.Args[2]
31188 dst := s3.Args[1]
31189 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)) {
31190 break
31191 }
31192 v.reset(OpMove)
31193 v.AuxInt = int64ToAuxInt(int64(sz))
31194 v.Aux = typeToAux(types.Types[types.TUINT8])
31195 v.AddArg3(dst, src, mem)
31196 return true
31197 }
31198
31199
31200
31201 for {
31202 if auxIntToInt64(v.AuxInt) != 0 {
31203 break
31204 }
31205 call := v_0
31206 if call.Op != OpStaticCall || len(call.Args) != 4 {
31207 break
31208 }
31209 sym := auxToCall(call.Aux)
31210 mem := call.Args[3]
31211 dst := call.Args[0]
31212 src := call.Args[1]
31213 call_2 := call.Args[2]
31214 if call_2.Op != OpConst64 {
31215 break
31216 }
31217 sz := auxIntToInt64(call_2.AuxInt)
31218 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
31219 break
31220 }
31221 v.reset(OpMove)
31222 v.AuxInt = int64ToAuxInt(int64(sz))
31223 v.Aux = typeToAux(types.Types[types.TUINT8])
31224 v.AddArg3(dst, src, mem)
31225 return true
31226 }
31227
31228
31229
31230 for {
31231 if auxIntToInt64(v.AuxInt) != 0 {
31232 break
31233 }
31234 call := v_0
31235 if call.Op != OpStaticCall || len(call.Args) != 4 {
31236 break
31237 }
31238 sym := auxToCall(call.Aux)
31239 mem := call.Args[3]
31240 dst := call.Args[0]
31241 src := call.Args[1]
31242 call_2 := call.Args[2]
31243 if call_2.Op != OpConst32 {
31244 break
31245 }
31246 sz := auxIntToInt32(call_2.AuxInt)
31247 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
31248 break
31249 }
31250 v.reset(OpMove)
31251 v.AuxInt = int64ToAuxInt(int64(sz))
31252 v.Aux = typeToAux(types.Types[types.TUINT8])
31253 v.AddArg3(dst, src, mem)
31254 return true
31255 }
31256
31257
31258
31259 for {
31260 if auxIntToInt64(v.AuxInt) != 0 {
31261 break
31262 }
31263 call := v_0
31264 if call.Op != OpStaticLECall || len(call.Args) != 4 {
31265 break
31266 }
31267 sym := auxToCall(call.Aux)
31268 mem := call.Args[3]
31269 dst := call.Args[0]
31270 src := call.Args[1]
31271 call_2 := call.Args[2]
31272 if call_2.Op != OpConst64 {
31273 break
31274 }
31275 sz := auxIntToInt64(call_2.AuxInt)
31276 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
31277 break
31278 }
31279 v.reset(OpMove)
31280 v.AuxInt = int64ToAuxInt(int64(sz))
31281 v.Aux = typeToAux(types.Types[types.TUINT8])
31282 v.AddArg3(dst, src, mem)
31283 return true
31284 }
31285
31286
31287
31288 for {
31289 if auxIntToInt64(v.AuxInt) != 0 {
31290 break
31291 }
31292 call := v_0
31293 if call.Op != OpStaticLECall || len(call.Args) != 4 {
31294 break
31295 }
31296 sym := auxToCall(call.Aux)
31297 mem := call.Args[3]
31298 dst := call.Args[0]
31299 src := call.Args[1]
31300 call_2 := call.Args[2]
31301 if call_2.Op != OpConst32 {
31302 break
31303 }
31304 sz := auxIntToInt32(call_2.AuxInt)
31305 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
31306 break
31307 }
31308 v.reset(OpMove)
31309 v.AuxInt = int64ToAuxInt(int64(sz))
31310 v.Aux = typeToAux(types.Types[types.TUINT8])
31311 v.AddArg3(dst, src, mem)
31312 return true
31313 }
31314
31315
31316
31317 for {
31318 if auxIntToInt64(v.AuxInt) != 0 {
31319 break
31320 }
31321 call := v_0
31322 if call.Op != OpStaticLECall || len(call.Args) != 2 {
31323 break
31324 }
31325 sym := auxToCall(call.Aux)
31326 x := call.Args[1]
31327 if !(needRaceCleanup(sym, call) && clobber(call)) {
31328 break
31329 }
31330 v.copyOf(x)
31331 return true
31332 }
31333
31334
31335
31336 for {
31337 if auxIntToInt64(v.AuxInt) != 0 {
31338 break
31339 }
31340 call := v_0
31341 if call.Op != OpStaticLECall || len(call.Args) != 1 {
31342 break
31343 }
31344 sym := auxToCall(call.Aux)
31345 x := call.Args[0]
31346 if !(needRaceCleanup(sym, call) && clobber(call)) {
31347 break
31348 }
31349 v.copyOf(x)
31350 return true
31351 }
31352
31353
31354
31355 for {
31356 if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpStaticCall || len(v_0.Args) != 6 {
31357 break
31358 }
31359 sym := auxToCall(v_0.Aux)
31360 _ = v_0.Args[1]
31361 newLen := v_0.Args[1]
31362 if newLen.Op != OpConst64 || !(v.Type.IsInteger() && (isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias"))) {
31363 break
31364 }
31365 v.copyOf(newLen)
31366 return true
31367 }
31368
31369
31370
31371 for {
31372 if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpStaticCall || len(v_0.Args) != 6 {
31373 break
31374 }
31375 sym := auxToCall(v_0.Aux)
31376 _ = v_0.Args[1]
31377 newLen := v_0.Args[1]
31378 if newLen.Op != OpConst32 || !(v.Type.IsInteger() && (isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias"))) {
31379 break
31380 }
31381 v.copyOf(newLen)
31382 return true
31383 }
31384
31385
31386
31387 for {
31388 if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpStaticLECall || len(v_0.Args) != 3 {
31389 break
31390 }
31391 f := auxToCall(v_0.Aux)
31392 _ = v_0.Args[2]
31393 x := v_0.Args[0]
31394 y := v_0.Args[1]
31395 v_0_2 := v_0.Args[2]
31396 if v_0_2.Op != OpSelectN || auxIntToInt64(v_0_2.AuxInt) != 1 {
31397 break
31398 }
31399 c := v_0_2.Args[0]
31400 if c.Op != OpStaticLECall || len(c.Args) != 3 {
31401 break
31402 }
31403 g := auxToCall(c.Aux)
31404 if x != c.Args[0] || y != c.Args[1] || !(isSameCall(f, "runtime.cmpstring") && isSameCall(g, "runtime.cmpstring")) {
31405 break
31406 }
31407 b = c.Block
31408 v0 := b.NewValue0(v.Pos, OpSelectN, typ.Int)
31409 v.copyOf(v0)
31410 v0.AuxInt = int64ToAuxInt(0)
31411 v0.AddArg(c)
31412 return true
31413 }
31414
31415
31416
31417 for {
31418 if auxIntToInt64(v.AuxInt) != 1 {
31419 break
31420 }
31421 c := v_0
31422 if c.Op != OpStaticLECall || len(c.Args) != 3 {
31423 break
31424 }
31425 f := auxToCall(c.Aux)
31426 mem := c.Args[2]
31427 if !(c.Uses == 1 && isSameCall(f, "runtime.cmpstring") && clobber(c)) {
31428 break
31429 }
31430 v.copyOf(mem)
31431 return true
31432 }
31433 return false
31434 }
31435 func rewriteValuegeneric_OpSignExt16to32(v *Value) bool {
31436 v_0 := v.Args[0]
31437
31438
31439 for {
31440 if v_0.Op != OpConst16 {
31441 break
31442 }
31443 c := auxIntToInt16(v_0.AuxInt)
31444 v.reset(OpConst32)
31445 v.AuxInt = int32ToAuxInt(int32(c))
31446 return true
31447 }
31448
31449
31450
31451 for {
31452 if v_0.Op != OpTrunc32to16 {
31453 break
31454 }
31455 x := v_0.Args[0]
31456 if x.Op != OpRsh32x64 {
31457 break
31458 }
31459 _ = x.Args[1]
31460 x_1 := x.Args[1]
31461 if x_1.Op != OpConst64 {
31462 break
31463 }
31464 s := auxIntToInt64(x_1.AuxInt)
31465 if !(s >= 16) {
31466 break
31467 }
31468 v.copyOf(x)
31469 return true
31470 }
31471 return false
31472 }
31473 func rewriteValuegeneric_OpSignExt16to64(v *Value) bool {
31474 v_0 := v.Args[0]
31475
31476
31477 for {
31478 if v_0.Op != OpConst16 {
31479 break
31480 }
31481 c := auxIntToInt16(v_0.AuxInt)
31482 v.reset(OpConst64)
31483 v.AuxInt = int64ToAuxInt(int64(c))
31484 return true
31485 }
31486
31487
31488
31489 for {
31490 if v_0.Op != OpTrunc64to16 {
31491 break
31492 }
31493 x := v_0.Args[0]
31494 if x.Op != OpRsh64x64 {
31495 break
31496 }
31497 _ = x.Args[1]
31498 x_1 := x.Args[1]
31499 if x_1.Op != OpConst64 {
31500 break
31501 }
31502 s := auxIntToInt64(x_1.AuxInt)
31503 if !(s >= 48) {
31504 break
31505 }
31506 v.copyOf(x)
31507 return true
31508 }
31509 return false
31510 }
31511 func rewriteValuegeneric_OpSignExt32to64(v *Value) bool {
31512 v_0 := v.Args[0]
31513
31514
31515 for {
31516 if v_0.Op != OpConst32 {
31517 break
31518 }
31519 c := auxIntToInt32(v_0.AuxInt)
31520 v.reset(OpConst64)
31521 v.AuxInt = int64ToAuxInt(int64(c))
31522 return true
31523 }
31524
31525
31526
31527 for {
31528 if v_0.Op != OpTrunc64to32 {
31529 break
31530 }
31531 x := v_0.Args[0]
31532 if x.Op != OpRsh64x64 {
31533 break
31534 }
31535 _ = x.Args[1]
31536 x_1 := x.Args[1]
31537 if x_1.Op != OpConst64 {
31538 break
31539 }
31540 s := auxIntToInt64(x_1.AuxInt)
31541 if !(s >= 32) {
31542 break
31543 }
31544 v.copyOf(x)
31545 return true
31546 }
31547 return false
31548 }
31549 func rewriteValuegeneric_OpSignExt8to16(v *Value) bool {
31550 v_0 := v.Args[0]
31551
31552
31553 for {
31554 if v_0.Op != OpConst8 {
31555 break
31556 }
31557 c := auxIntToInt8(v_0.AuxInt)
31558 v.reset(OpConst16)
31559 v.AuxInt = int16ToAuxInt(int16(c))
31560 return true
31561 }
31562
31563
31564
31565 for {
31566 if v_0.Op != OpTrunc16to8 {
31567 break
31568 }
31569 x := v_0.Args[0]
31570 if x.Op != OpRsh16x64 {
31571 break
31572 }
31573 _ = x.Args[1]
31574 x_1 := x.Args[1]
31575 if x_1.Op != OpConst64 {
31576 break
31577 }
31578 s := auxIntToInt64(x_1.AuxInt)
31579 if !(s >= 8) {
31580 break
31581 }
31582 v.copyOf(x)
31583 return true
31584 }
31585 return false
31586 }
31587 func rewriteValuegeneric_OpSignExt8to32(v *Value) bool {
31588 v_0 := v.Args[0]
31589
31590
31591 for {
31592 if v_0.Op != OpConst8 {
31593 break
31594 }
31595 c := auxIntToInt8(v_0.AuxInt)
31596 v.reset(OpConst32)
31597 v.AuxInt = int32ToAuxInt(int32(c))
31598 return true
31599 }
31600
31601
31602
31603 for {
31604 if v_0.Op != OpTrunc32to8 {
31605 break
31606 }
31607 x := v_0.Args[0]
31608 if x.Op != OpRsh32x64 {
31609 break
31610 }
31611 _ = x.Args[1]
31612 x_1 := x.Args[1]
31613 if x_1.Op != OpConst64 {
31614 break
31615 }
31616 s := auxIntToInt64(x_1.AuxInt)
31617 if !(s >= 24) {
31618 break
31619 }
31620 v.copyOf(x)
31621 return true
31622 }
31623 return false
31624 }
31625 func rewriteValuegeneric_OpSignExt8to64(v *Value) bool {
31626 v_0 := v.Args[0]
31627
31628
31629 for {
31630 if v_0.Op != OpConst8 {
31631 break
31632 }
31633 c := auxIntToInt8(v_0.AuxInt)
31634 v.reset(OpConst64)
31635 v.AuxInt = int64ToAuxInt(int64(c))
31636 return true
31637 }
31638
31639
31640
31641 for {
31642 if v_0.Op != OpTrunc64to8 {
31643 break
31644 }
31645 x := v_0.Args[0]
31646 if x.Op != OpRsh64x64 {
31647 break
31648 }
31649 _ = x.Args[1]
31650 x_1 := x.Args[1]
31651 if x_1.Op != OpConst64 {
31652 break
31653 }
31654 s := auxIntToInt64(x_1.AuxInt)
31655 if !(s >= 56) {
31656 break
31657 }
31658 v.copyOf(x)
31659 return true
31660 }
31661 return false
31662 }
31663 func rewriteValuegeneric_OpSliceCap(v *Value) bool {
31664 v_0 := v.Args[0]
31665
31666
31667 for {
31668 if v_0.Op != OpSliceMake {
31669 break
31670 }
31671 _ = v_0.Args[2]
31672 v_0_2 := v_0.Args[2]
31673 if v_0_2.Op != OpConst64 {
31674 break
31675 }
31676 t := v_0_2.Type
31677 c := auxIntToInt64(v_0_2.AuxInt)
31678 v.reset(OpConst64)
31679 v.Type = t
31680 v.AuxInt = int64ToAuxInt(c)
31681 return true
31682 }
31683
31684
31685 for {
31686 if v_0.Op != OpSliceMake {
31687 break
31688 }
31689 _ = v_0.Args[2]
31690 v_0_2 := v_0.Args[2]
31691 if v_0_2.Op != OpConst32 {
31692 break
31693 }
31694 t := v_0_2.Type
31695 c := auxIntToInt32(v_0_2.AuxInt)
31696 v.reset(OpConst32)
31697 v.Type = t
31698 v.AuxInt = int32ToAuxInt(c)
31699 return true
31700 }
31701
31702
31703 for {
31704 if v_0.Op != OpSliceMake {
31705 break
31706 }
31707 _ = v_0.Args[2]
31708 v_0_2 := v_0.Args[2]
31709 if v_0_2.Op != OpSliceCap {
31710 break
31711 }
31712 x := v_0_2.Args[0]
31713 v.reset(OpSliceCap)
31714 v.AddArg(x)
31715 return true
31716 }
31717
31718
31719 for {
31720 if v_0.Op != OpSliceMake {
31721 break
31722 }
31723 _ = v_0.Args[2]
31724 v_0_2 := v_0.Args[2]
31725 if v_0_2.Op != OpSliceLen {
31726 break
31727 }
31728 x := v_0_2.Args[0]
31729 v.reset(OpSliceLen)
31730 v.AddArg(x)
31731 return true
31732 }
31733
31734
31735 for {
31736 if v_0.Op != OpPhi || len(v_0.Args) != 2 {
31737 break
31738 }
31739 _ = v_0.Args[1]
31740 v_0_0 := v_0.Args[0]
31741 if v_0_0.Op != OpSliceMake {
31742 break
31743 }
31744 x := v_0_0.Args[2]
31745 v_0_1 := v_0.Args[1]
31746 if v_0_1.Op != OpSliceMake {
31747 break
31748 }
31749 _ = v_0_1.Args[2]
31750 if x != v_0_1.Args[2] {
31751 break
31752 }
31753 v.copyOf(x)
31754 return true
31755 }
31756 return false
31757 }
31758 func rewriteValuegeneric_OpSliceLen(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[1]
31767 v_0_1 := v_0.Args[1]
31768 if v_0_1.Op != OpConst64 {
31769 break
31770 }
31771 t := v_0_1.Type
31772 c := auxIntToInt64(v_0_1.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[1]
31785 v_0_1 := v_0.Args[1]
31786 if v_0_1.Op != OpConst32 {
31787 break
31788 }
31789 t := v_0_1.Type
31790 c := auxIntToInt32(v_0_1.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[1]
31803 v_0_1 := v_0.Args[1]
31804 if v_0_1.Op != OpSliceLen {
31805 break
31806 }
31807 x := v_0_1.Args[0]
31808 v.reset(OpSliceLen)
31809 v.AddArg(x)
31810 return true
31811 }
31812
31813
31814 for {
31815 if v_0.Op != OpPhi || len(v_0.Args) != 2 {
31816 break
31817 }
31818 _ = v_0.Args[1]
31819 v_0_0 := v_0.Args[0]
31820 if v_0_0.Op != OpSliceMake {
31821 break
31822 }
31823 x := v_0_0.Args[1]
31824 v_0_1 := v_0.Args[1]
31825 if v_0_1.Op != OpSliceMake {
31826 break
31827 }
31828 _ = v_0_1.Args[1]
31829 if x != v_0_1.Args[1] {
31830 break
31831 }
31832 v.copyOf(x)
31833 return true
31834 }
31835
31836
31837
31838 for {
31839 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
31840 break
31841 }
31842 v_0_0 := v_0.Args[0]
31843 if v_0_0.Op != OpStaticLECall || len(v_0_0.Args) != 6 {
31844 break
31845 }
31846 sym := auxToCall(v_0_0.Aux)
31847 _ = v_0_0.Args[1]
31848 newLen := v_0_0.Args[1]
31849 if newLen.Op != OpConst64 || !(isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias")) {
31850 break
31851 }
31852 v.copyOf(newLen)
31853 return true
31854 }
31855
31856
31857
31858 for {
31859 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
31860 break
31861 }
31862 v_0_0 := v_0.Args[0]
31863 if v_0_0.Op != OpStaticLECall || len(v_0_0.Args) != 6 {
31864 break
31865 }
31866 sym := auxToCall(v_0_0.Aux)
31867 _ = v_0_0.Args[1]
31868 newLen := v_0_0.Args[1]
31869 if newLen.Op != OpConst32 || !(isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias")) {
31870 break
31871 }
31872 v.copyOf(newLen)
31873 return true
31874 }
31875 return false
31876 }
31877 func rewriteValuegeneric_OpSliceMake(v *Value) bool {
31878 v_2 := v.Args[2]
31879 v_1 := v.Args[1]
31880 v_0 := v.Args[0]
31881 b := v.Block
31882
31883
31884
31885 for {
31886 if v_0.Op != OpAddPtr {
31887 break
31888 }
31889 t := v_0.Type
31890 _ = v_0.Args[1]
31891 x := v_0.Args[0]
31892 v_0_1 := v_0.Args[1]
31893 if v_0_1.Op != OpAnd64 {
31894 break
31895 }
31896 _ = v_0_1.Args[1]
31897 v_0_1_0 := v_0_1.Args[0]
31898 v_0_1_1 := v_0_1.Args[1]
31899 for _i0 := 0; _i0 <= 1; _i0, v_0_1_0, v_0_1_1 = _i0+1, v_0_1_1, v_0_1_0 {
31900 y := v_0_1_0
31901 if v_0_1_1.Op != OpSlicemask {
31902 continue
31903 }
31904 w := v_1
31905 if w.Op != OpConst64 {
31906 continue
31907 }
31908 c := auxIntToInt64(w.AuxInt)
31909 z := v_2
31910 if !(c > 0) {
31911 continue
31912 }
31913 v.reset(OpSliceMake)
31914 v0 := b.NewValue0(v.Pos, OpAddPtr, t)
31915 v0.AddArg2(x, y)
31916 v.AddArg3(v0, w, z)
31917 return true
31918 }
31919 break
31920 }
31921
31922
31923
31924 for {
31925 if v_0.Op != OpAddPtr {
31926 break
31927 }
31928 t := v_0.Type
31929 _ = v_0.Args[1]
31930 x := v_0.Args[0]
31931 v_0_1 := v_0.Args[1]
31932 if v_0_1.Op != OpAnd32 {
31933 break
31934 }
31935 _ = v_0_1.Args[1]
31936 v_0_1_0 := v_0_1.Args[0]
31937 v_0_1_1 := v_0_1.Args[1]
31938 for _i0 := 0; _i0 <= 1; _i0, v_0_1_0, v_0_1_1 = _i0+1, v_0_1_1, v_0_1_0 {
31939 y := v_0_1_0
31940 if v_0_1_1.Op != OpSlicemask {
31941 continue
31942 }
31943 w := v_1
31944 if w.Op != OpConst32 {
31945 continue
31946 }
31947 c := auxIntToInt32(w.AuxInt)
31948 z := v_2
31949 if !(c > 0) {
31950 continue
31951 }
31952 v.reset(OpSliceMake)
31953 v0 := b.NewValue0(v.Pos, OpAddPtr, t)
31954 v0.AddArg2(x, y)
31955 v.AddArg3(v0, w, z)
31956 return true
31957 }
31958 break
31959 }
31960 return false
31961 }
31962 func rewriteValuegeneric_OpSlicePtr(v *Value) bool {
31963 v_0 := v.Args[0]
31964
31965
31966 for {
31967 if v_0.Op != OpSliceMake {
31968 break
31969 }
31970 v_0_0 := v_0.Args[0]
31971 if v_0_0.Op != OpSlicePtr {
31972 break
31973 }
31974 x := v_0_0.Args[0]
31975 v.reset(OpSlicePtr)
31976 v.AddArg(x)
31977 return true
31978 }
31979 return false
31980 }
31981 func rewriteValuegeneric_OpSlicemask(v *Value) bool {
31982 v_0 := v.Args[0]
31983
31984
31985
31986 for {
31987 if v_0.Op != OpConst32 {
31988 break
31989 }
31990 x := auxIntToInt32(v_0.AuxInt)
31991 if !(x > 0) {
31992 break
31993 }
31994 v.reset(OpConst32)
31995 v.AuxInt = int32ToAuxInt(-1)
31996 return true
31997 }
31998
31999
32000 for {
32001 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
32002 break
32003 }
32004 v.reset(OpConst32)
32005 v.AuxInt = int32ToAuxInt(0)
32006 return true
32007 }
32008
32009
32010
32011 for {
32012 if v_0.Op != OpConst64 {
32013 break
32014 }
32015 x := auxIntToInt64(v_0.AuxInt)
32016 if !(x > 0) {
32017 break
32018 }
32019 v.reset(OpConst64)
32020 v.AuxInt = int64ToAuxInt(-1)
32021 return true
32022 }
32023
32024
32025 for {
32026 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
32027 break
32028 }
32029 v.reset(OpConst64)
32030 v.AuxInt = int64ToAuxInt(0)
32031 return true
32032 }
32033 return false
32034 }
32035 func rewriteValuegeneric_OpSqrt(v *Value) bool {
32036 v_0 := v.Args[0]
32037
32038
32039
32040 for {
32041 if v_0.Op != OpConst64F {
32042 break
32043 }
32044 c := auxIntToFloat64(v_0.AuxInt)
32045 if !(!math.IsNaN(math.Sqrt(c))) {
32046 break
32047 }
32048 v.reset(OpConst64F)
32049 v.AuxInt = float64ToAuxInt(math.Sqrt(c))
32050 return true
32051 }
32052 return false
32053 }
32054 func rewriteValuegeneric_OpStaticCall(v *Value) bool {
32055 b := v.Block
32056 typ := &b.Func.Config.Types
32057
32058
32059
32060 for {
32061 if len(v.Args) != 4 {
32062 break
32063 }
32064 callAux := auxToCall(v.Aux)
32065 mem := v.Args[3]
32066 p := v.Args[0]
32067 q := v.Args[1]
32068 if !(isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)) {
32069 break
32070 }
32071 v.reset(OpMakeResult)
32072 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
32073 v0.AuxInt = boolToAuxInt(true)
32074 v.AddArg2(v0, mem)
32075 return true
32076 }
32077 return false
32078 }
32079 func rewriteValuegeneric_OpStaticLECall(v *Value) bool {
32080 b := v.Block
32081 config := b.Func.Config
32082 typ := &b.Func.Config.Types
32083
32084
32085
32086 for {
32087 if len(v.Args) != 4 {
32088 break
32089 }
32090 callAux := auxToCall(v.Aux)
32091 mem := v.Args[3]
32092 sptr := v.Args[0]
32093 v_1 := v.Args[1]
32094 if v_1.Op != OpAddr {
32095 break
32096 }
32097 scon := auxToSym(v_1.Aux)
32098 v_1_0 := v_1.Args[0]
32099 if v_1_0.Op != OpSB {
32100 break
32101 }
32102 v_2 := v.Args[2]
32103 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon)) {
32104 break
32105 }
32106 v.reset(OpMakeResult)
32107 v0 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
32108 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
32109 v1.AddArg2(sptr, mem)
32110 v2 := b.NewValue0(v.Pos, OpConst8, typ.Int8)
32111 v2.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
32112 v0.AddArg2(v1, v2)
32113 v.AddArg2(v0, mem)
32114 return true
32115 }
32116
32117
32118
32119 for {
32120 if len(v.Args) != 4 {
32121 break
32122 }
32123 callAux := auxToCall(v.Aux)
32124 mem := v.Args[3]
32125 v_0 := v.Args[0]
32126 if v_0.Op != OpAddr {
32127 break
32128 }
32129 scon := auxToSym(v_0.Aux)
32130 v_0_0 := v_0.Args[0]
32131 if v_0_0.Op != OpSB {
32132 break
32133 }
32134 sptr := v.Args[1]
32135 v_2 := v.Args[2]
32136 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon)) {
32137 break
32138 }
32139 v.reset(OpMakeResult)
32140 v0 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
32141 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
32142 v1.AddArg2(sptr, mem)
32143 v2 := b.NewValue0(v.Pos, OpConst8, typ.Int8)
32144 v2.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
32145 v0.AddArg2(v1, v2)
32146 v.AddArg2(v0, mem)
32147 return true
32148 }
32149
32150
32151
32152 for {
32153 if len(v.Args) != 4 {
32154 break
32155 }
32156 callAux := auxToCall(v.Aux)
32157 mem := v.Args[3]
32158 sptr := v.Args[0]
32159 v_1 := v.Args[1]
32160 if v_1.Op != OpAddr {
32161 break
32162 }
32163 scon := auxToSym(v_1.Aux)
32164 v_1_0 := v_1.Args[0]
32165 if v_1_0.Op != OpSB {
32166 break
32167 }
32168 v_2 := v.Args[2]
32169 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
32170 break
32171 }
32172 v.reset(OpMakeResult)
32173 v0 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
32174 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
32175 v1.AddArg2(sptr, mem)
32176 v2 := b.NewValue0(v.Pos, OpConst16, typ.Int16)
32177 v2.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
32178 v0.AddArg2(v1, v2)
32179 v.AddArg2(v0, mem)
32180 return true
32181 }
32182
32183
32184
32185 for {
32186 if len(v.Args) != 4 {
32187 break
32188 }
32189 callAux := auxToCall(v.Aux)
32190 mem := v.Args[3]
32191 v_0 := v.Args[0]
32192 if v_0.Op != OpAddr {
32193 break
32194 }
32195 scon := auxToSym(v_0.Aux)
32196 v_0_0 := v_0.Args[0]
32197 if v_0_0.Op != OpSB {
32198 break
32199 }
32200 sptr := v.Args[1]
32201 v_2 := v.Args[2]
32202 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
32203 break
32204 }
32205 v.reset(OpMakeResult)
32206 v0 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
32207 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
32208 v1.AddArg2(sptr, mem)
32209 v2 := b.NewValue0(v.Pos, OpConst16, typ.Int16)
32210 v2.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
32211 v0.AddArg2(v1, v2)
32212 v.AddArg2(v0, mem)
32213 return true
32214 }
32215
32216
32217
32218 for {
32219 if len(v.Args) != 4 {
32220 break
32221 }
32222 callAux := auxToCall(v.Aux)
32223 mem := v.Args[3]
32224 sptr := v.Args[0]
32225 v_1 := v.Args[1]
32226 if v_1.Op != OpAddr {
32227 break
32228 }
32229 scon := auxToSym(v_1.Aux)
32230 v_1_0 := v_1.Args[0]
32231 if v_1_0.Op != OpSB {
32232 break
32233 }
32234 v_2 := v.Args[2]
32235 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
32236 break
32237 }
32238 v.reset(OpMakeResult)
32239 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
32240 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32241 v1.AddArg2(sptr, mem)
32242 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
32243 v2.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
32244 v0.AddArg2(v1, v2)
32245 v.AddArg2(v0, mem)
32246 return true
32247 }
32248
32249
32250
32251 for {
32252 if len(v.Args) != 4 {
32253 break
32254 }
32255 callAux := auxToCall(v.Aux)
32256 mem := v.Args[3]
32257 v_0 := v.Args[0]
32258 if v_0.Op != OpAddr {
32259 break
32260 }
32261 scon := auxToSym(v_0.Aux)
32262 v_0_0 := v_0.Args[0]
32263 if v_0_0.Op != OpSB {
32264 break
32265 }
32266 sptr := v.Args[1]
32267 v_2 := v.Args[2]
32268 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
32269 break
32270 }
32271 v.reset(OpMakeResult)
32272 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
32273 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32274 v1.AddArg2(sptr, mem)
32275 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
32276 v2.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
32277 v0.AddArg2(v1, v2)
32278 v.AddArg2(v0, mem)
32279 return true
32280 }
32281
32282
32283
32284 for {
32285 if len(v.Args) != 4 {
32286 break
32287 }
32288 callAux := auxToCall(v.Aux)
32289 mem := v.Args[3]
32290 sptr := v.Args[0]
32291 v_1 := v.Args[1]
32292 if v_1.Op != OpAddr {
32293 break
32294 }
32295 scon := auxToSym(v_1.Aux)
32296 v_1_0 := v_1.Args[0]
32297 if v_1_0.Op != OpSB {
32298 break
32299 }
32300 v_2 := v.Args[2]
32301 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
32302 break
32303 }
32304 v.reset(OpMakeResult)
32305 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
32306 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
32307 v1.AddArg2(sptr, mem)
32308 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32309 v2.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
32310 v0.AddArg2(v1, v2)
32311 v.AddArg2(v0, mem)
32312 return true
32313 }
32314
32315
32316
32317 for {
32318 if len(v.Args) != 4 {
32319 break
32320 }
32321 callAux := auxToCall(v.Aux)
32322 mem := v.Args[3]
32323 v_0 := v.Args[0]
32324 if v_0.Op != OpAddr {
32325 break
32326 }
32327 scon := auxToSym(v_0.Aux)
32328 v_0_0 := v_0.Args[0]
32329 if v_0_0.Op != OpSB {
32330 break
32331 }
32332 sptr := v.Args[1]
32333 v_2 := v.Args[2]
32334 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
32335 break
32336 }
32337 v.reset(OpMakeResult)
32338 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
32339 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
32340 v1.AddArg2(sptr, mem)
32341 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32342 v2.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
32343 v0.AddArg2(v1, v2)
32344 v.AddArg2(v0, mem)
32345 return true
32346 }
32347
32348
32349
32350 for {
32351 if len(v.Args) != 4 {
32352 break
32353 }
32354 callAux := auxToCall(v.Aux)
32355 mem := v.Args[3]
32356 sptr := v.Args[0]
32357 v_1 := v.Args[1]
32358 if v_1.Op != OpAddr {
32359 break
32360 }
32361 scon := auxToSym(v_1.Aux)
32362 v_1_0 := v_1.Args[0]
32363 if v_1_0.Op != OpSB {
32364 break
32365 }
32366 v_2 := v.Args[2]
32367 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 3 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
32368 break
32369 }
32370 v.reset(OpMakeResult)
32371 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
32372 v1 := b.NewValue0(v.Pos, OpOr32, typ.Int32)
32373 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.Int32)
32374 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
32375 v3.AddArg2(sptr, mem)
32376 v2.AddArg(v3)
32377 v4 := b.NewValue0(v.Pos, OpLsh32x32, typ.Int32)
32378 v5 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.Int32)
32379 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
32380 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
32381 v7.AuxInt = int64ToAuxInt(2)
32382 v7.AddArg(sptr)
32383 v6.AddArg2(v7, mem)
32384 v5.AddArg(v6)
32385 v8 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
32386 v8.AuxInt = int32ToAuxInt(16)
32387 v4.AddArg2(v5, v8)
32388 v1.AddArg2(v2, v4)
32389 v9 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
32390 v9.AuxInt = int32ToAuxInt(int32(uint32(read16(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint32(read8(scon, 2)) << 16)))
32391 v0.AddArg2(v1, v9)
32392 v.AddArg2(v0, mem)
32393 return true
32394 }
32395
32396
32397
32398 for {
32399 if len(v.Args) != 4 {
32400 break
32401 }
32402 callAux := auxToCall(v.Aux)
32403 mem := v.Args[3]
32404 v_0 := v.Args[0]
32405 if v_0.Op != OpAddr {
32406 break
32407 }
32408 scon := auxToSym(v_0.Aux)
32409 v_0_0 := v_0.Args[0]
32410 if v_0_0.Op != OpSB {
32411 break
32412 }
32413 sptr := v.Args[1]
32414 v_2 := v.Args[2]
32415 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 3 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
32416 break
32417 }
32418 v.reset(OpMakeResult)
32419 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
32420 v1 := b.NewValue0(v.Pos, OpOr32, typ.Int32)
32421 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.Int32)
32422 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
32423 v3.AddArg2(sptr, mem)
32424 v2.AddArg(v3)
32425 v4 := b.NewValue0(v.Pos, OpLsh32x32, typ.Int32)
32426 v5 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.Int32)
32427 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
32428 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
32429 v7.AuxInt = int64ToAuxInt(2)
32430 v7.AddArg(sptr)
32431 v6.AddArg2(v7, mem)
32432 v5.AddArg(v6)
32433 v8 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
32434 v8.AuxInt = int32ToAuxInt(16)
32435 v4.AddArg2(v5, v8)
32436 v1.AddArg2(v2, v4)
32437 v9 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
32438 v9.AuxInt = int32ToAuxInt(int32(uint32(read16(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint32(read8(scon, 2)) << 16)))
32439 v0.AddArg2(v1, v9)
32440 v.AddArg2(v0, mem)
32441 return true
32442 }
32443
32444
32445
32446 for {
32447 if len(v.Args) != 4 {
32448 break
32449 }
32450 callAux := auxToCall(v.Aux)
32451 mem := v.Args[3]
32452 sptr := v.Args[0]
32453 v_1 := v.Args[1]
32454 if v_1.Op != OpAddr {
32455 break
32456 }
32457 scon := auxToSym(v_1.Aux)
32458 v_1_0 := v_1.Args[0]
32459 if v_1_0.Op != OpSB {
32460 break
32461 }
32462 v_2 := v.Args[2]
32463 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 5 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
32464 break
32465 }
32466 v.reset(OpMakeResult)
32467 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
32468 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
32469 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
32470 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32471 v3.AddArg2(sptr, mem)
32472 v2.AddArg(v3)
32473 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
32474 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.Int64)
32475 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
32476 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
32477 v7.AuxInt = int64ToAuxInt(4)
32478 v7.AddArg(sptr)
32479 v6.AddArg2(v7, mem)
32480 v5.AddArg(v6)
32481 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32482 v8.AuxInt = int64ToAuxInt(32)
32483 v4.AddArg2(v5, v8)
32484 v1.AddArg2(v2, v4)
32485 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32486 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read8(scon, 4)) << 32)))
32487 v0.AddArg2(v1, v9)
32488 v.AddArg2(v0, mem)
32489 return true
32490 }
32491
32492
32493
32494 for {
32495 if len(v.Args) != 4 {
32496 break
32497 }
32498 callAux := auxToCall(v.Aux)
32499 mem := v.Args[3]
32500 v_0 := v.Args[0]
32501 if v_0.Op != OpAddr {
32502 break
32503 }
32504 scon := auxToSym(v_0.Aux)
32505 v_0_0 := v_0.Args[0]
32506 if v_0_0.Op != OpSB {
32507 break
32508 }
32509 sptr := v.Args[1]
32510 v_2 := v.Args[2]
32511 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 5 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
32512 break
32513 }
32514 v.reset(OpMakeResult)
32515 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
32516 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
32517 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
32518 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32519 v3.AddArg2(sptr, mem)
32520 v2.AddArg(v3)
32521 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
32522 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.Int64)
32523 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
32524 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
32525 v7.AuxInt = int64ToAuxInt(4)
32526 v7.AddArg(sptr)
32527 v6.AddArg2(v7, mem)
32528 v5.AddArg(v6)
32529 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32530 v8.AuxInt = int64ToAuxInt(32)
32531 v4.AddArg2(v5, v8)
32532 v1.AddArg2(v2, v4)
32533 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32534 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read8(scon, 4)) << 32)))
32535 v0.AddArg2(v1, v9)
32536 v.AddArg2(v0, mem)
32537 return true
32538 }
32539
32540
32541
32542 for {
32543 if len(v.Args) != 4 {
32544 break
32545 }
32546 callAux := auxToCall(v.Aux)
32547 mem := v.Args[3]
32548 sptr := v.Args[0]
32549 v_1 := v.Args[1]
32550 if v_1.Op != OpAddr {
32551 break
32552 }
32553 scon := auxToSym(v_1.Aux)
32554 v_1_0 := v_1.Args[0]
32555 if v_1_0.Op != OpSB {
32556 break
32557 }
32558 v_2 := v.Args[2]
32559 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 6 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
32560 break
32561 }
32562 v.reset(OpMakeResult)
32563 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
32564 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
32565 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
32566 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32567 v3.AddArg2(sptr, mem)
32568 v2.AddArg(v3)
32569 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
32570 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.Int64)
32571 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
32572 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
32573 v7.AuxInt = int64ToAuxInt(4)
32574 v7.AddArg(sptr)
32575 v6.AddArg2(v7, mem)
32576 v5.AddArg(v6)
32577 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32578 v8.AuxInt = int64ToAuxInt(32)
32579 v4.AddArg2(v5, v8)
32580 v1.AddArg2(v2, v4)
32581 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32582 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read16(scon, 4, config.ctxt.Arch.ByteOrder)) << 32)))
32583 v0.AddArg2(v1, v9)
32584 v.AddArg2(v0, mem)
32585 return true
32586 }
32587
32588
32589
32590 for {
32591 if len(v.Args) != 4 {
32592 break
32593 }
32594 callAux := auxToCall(v.Aux)
32595 mem := v.Args[3]
32596 v_0 := v.Args[0]
32597 if v_0.Op != OpAddr {
32598 break
32599 }
32600 scon := auxToSym(v_0.Aux)
32601 v_0_0 := v_0.Args[0]
32602 if v_0_0.Op != OpSB {
32603 break
32604 }
32605 sptr := v.Args[1]
32606 v_2 := v.Args[2]
32607 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 6 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
32608 break
32609 }
32610 v.reset(OpMakeResult)
32611 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
32612 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
32613 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
32614 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32615 v3.AddArg2(sptr, mem)
32616 v2.AddArg(v3)
32617 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
32618 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.Int64)
32619 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
32620 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
32621 v7.AuxInt = int64ToAuxInt(4)
32622 v7.AddArg(sptr)
32623 v6.AddArg2(v7, mem)
32624 v5.AddArg(v6)
32625 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32626 v8.AuxInt = int64ToAuxInt(32)
32627 v4.AddArg2(v5, v8)
32628 v1.AddArg2(v2, v4)
32629 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32630 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read16(scon, 4, config.ctxt.Arch.ByteOrder)) << 32)))
32631 v0.AddArg2(v1, v9)
32632 v.AddArg2(v0, mem)
32633 return true
32634 }
32635
32636
32637
32638 for {
32639 if len(v.Args) != 4 {
32640 break
32641 }
32642 callAux := auxToCall(v.Aux)
32643 mem := v.Args[3]
32644 sptr := v.Args[0]
32645 v_1 := v.Args[1]
32646 if v_1.Op != OpAddr {
32647 break
32648 }
32649 scon := auxToSym(v_1.Aux)
32650 v_1_0 := v_1.Args[0]
32651 if v_1_0.Op != OpSB {
32652 break
32653 }
32654 v_2 := v.Args[2]
32655 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 7 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
32656 break
32657 }
32658 v.reset(OpMakeResult)
32659 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
32660 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
32661 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
32662 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32663 v3.AddArg2(sptr, mem)
32664 v2.AddArg(v3)
32665 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
32666 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
32667 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32668 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
32669 v7.AuxInt = int64ToAuxInt(3)
32670 v7.AddArg(sptr)
32671 v6.AddArg2(v7, mem)
32672 v5.AddArg(v6)
32673 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32674 v8.AuxInt = int64ToAuxInt(32)
32675 v4.AddArg2(v5, v8)
32676 v1.AddArg2(v2, v4)
32677 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32678 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read32(scon, 3, config.ctxt.Arch.ByteOrder)) << 32)))
32679 v0.AddArg2(v1, v9)
32680 v.AddArg2(v0, mem)
32681 return true
32682 }
32683
32684
32685
32686 for {
32687 if len(v.Args) != 4 {
32688 break
32689 }
32690 callAux := auxToCall(v.Aux)
32691 mem := v.Args[3]
32692 v_0 := v.Args[0]
32693 if v_0.Op != OpAddr {
32694 break
32695 }
32696 scon := auxToSym(v_0.Aux)
32697 v_0_0 := v_0.Args[0]
32698 if v_0_0.Op != OpSB {
32699 break
32700 }
32701 sptr := v.Args[1]
32702 v_2 := v.Args[2]
32703 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 7 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
32704 break
32705 }
32706 v.reset(OpMakeResult)
32707 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
32708 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
32709 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
32710 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32711 v3.AddArg2(sptr, mem)
32712 v2.AddArg(v3)
32713 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
32714 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
32715 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
32716 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
32717 v7.AuxInt = int64ToAuxInt(3)
32718 v7.AddArg(sptr)
32719 v6.AddArg2(v7, mem)
32720 v5.AddArg(v6)
32721 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32722 v8.AuxInt = int64ToAuxInt(32)
32723 v4.AddArg2(v5, v8)
32724 v1.AddArg2(v2, v4)
32725 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
32726 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read32(scon, 3, config.ctxt.Arch.ByteOrder)) << 32)))
32727 v0.AddArg2(v1, v9)
32728 v.AddArg2(v0, mem)
32729 return true
32730 }
32731
32732
32733
32734 for {
32735 if len(v.Args) != 4 {
32736 break
32737 }
32738 callAux := auxToCall(v.Aux)
32739 mem := v.Args[3]
32740 v_2 := v.Args[2]
32741 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.memequal")) {
32742 break
32743 }
32744 v.reset(OpMakeResult)
32745 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
32746 v0.AuxInt = boolToAuxInt(true)
32747 v.AddArg2(v0, mem)
32748 return true
32749 }
32750
32751
32752
32753 for {
32754 if len(v.Args) != 4 {
32755 break
32756 }
32757 callAux := auxToCall(v.Aux)
32758 mem := v.Args[3]
32759 p := v.Args[0]
32760 q := v.Args[1]
32761 if !(isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)) {
32762 break
32763 }
32764 v.reset(OpMakeResult)
32765 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
32766 v0.AuxInt = boolToAuxInt(true)
32767 v.AddArg2(v0, mem)
32768 return true
32769 }
32770
32771
32772
32773 for {
32774 if len(v.Args) != 4 {
32775 break
32776 }
32777 callAux := auxToCall(v.Aux)
32778 mem := v.Args[3]
32779 v_1 := v.Args[1]
32780 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
32781 break
32782 }
32783 v_2 := v.Args[2]
32784 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.makeslice")) {
32785 break
32786 }
32787 v.reset(OpMakeResult)
32788 v0 := b.NewValue0(v.Pos, OpAddr, v.Type.FieldType(0))
32789 v0.Aux = symToAux(ir.Syms.Zerobase)
32790 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
32791 v0.AddArg(v1)
32792 v.AddArg2(v0, mem)
32793 return true
32794 }
32795
32796
32797
32798 for {
32799 if len(v.Args) != 4 {
32800 break
32801 }
32802 callAux := auxToCall(v.Aux)
32803 mem := v.Args[3]
32804 v_1 := v.Args[1]
32805 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
32806 break
32807 }
32808 v_2 := v.Args[2]
32809 if v_2.Op != OpConst32 || auxIntToInt32(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.makeslice")) {
32810 break
32811 }
32812 v.reset(OpMakeResult)
32813 v0 := b.NewValue0(v.Pos, OpAddr, v.Type.FieldType(0))
32814 v0.Aux = symToAux(ir.Syms.Zerobase)
32815 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
32816 v0.AddArg(v1)
32817 v.AddArg2(v0, mem)
32818 return true
32819 }
32820
32821
32822
32823 for {
32824 if len(v.Args) != 4 {
32825 break
32826 }
32827 f := auxToCall(v.Aux)
32828 mem := v.Args[3]
32829 typ_ := v.Args[0]
32830 x := v.Args[1]
32831 y := v.Args[2]
32832 if !(isSameCall(f, "runtime.efaceeq") && isDirectAndComparableType(typ_) && clobber(v)) {
32833 break
32834 }
32835 v.reset(OpMakeResult)
32836 v0 := b.NewValue0(v.Pos, OpEqPtr, typ.Bool)
32837 v0.AddArg2(x, y)
32838 v.AddArg2(v0, mem)
32839 return true
32840 }
32841
32842
32843
32844 for {
32845 if len(v.Args) != 4 {
32846 break
32847 }
32848 f := auxToCall(v.Aux)
32849 mem := v.Args[3]
32850 itab := v.Args[0]
32851 x := v.Args[1]
32852 y := v.Args[2]
32853 if !(isSameCall(f, "runtime.ifaceeq") && isDirectAndComparableIface(itab) && clobber(v)) {
32854 break
32855 }
32856 v.reset(OpMakeResult)
32857 v0 := b.NewValue0(v.Pos, OpEqPtr, typ.Bool)
32858 v0.AddArg2(x, y)
32859 v.AddArg2(v0, mem)
32860 return true
32861 }
32862
32863
32864
32865 for {
32866 if len(v.Args) != 4 {
32867 break
32868 }
32869 argsize := auxIntToInt32(v.AuxInt)
32870 f := auxToCall(v.Aux)
32871 _ = v.Args[3]
32872 typ_ := v.Args[0]
32873 map_ := v.Args[1]
32874 key := v.Args[2]
32875 if key.Op != OpSelectN || auxIntToInt64(key.AuxInt) != 0 {
32876 break
32877 }
32878 sbts := key.Args[0]
32879 if sbts.Op != OpStaticLECall || len(sbts.Args) != 4 {
32880 break
32881 }
32882 g := auxToCall(sbts.Aux)
32883 mem := sbts.Args[3]
32884 ptr := sbts.Args[1]
32885 len := sbts.Args[2]
32886 m := v.Args[3]
32887 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)) {
32888 break
32889 }
32890 v.reset(OpStaticLECall)
32891 v.AuxInt = int32ToAuxInt(argsize)
32892 v.Aux = callToAux(f)
32893 v0 := b.NewValue0(v.Pos, OpStringMake, typ.String)
32894 v0.AddArg2(ptr, len)
32895 v.AddArg4(typ_, map_, v0, mem)
32896 return true
32897 }
32898
32899
32900
32901 for {
32902 if len(v.Args) != 3 {
32903 break
32904 }
32905 argsize := auxIntToInt32(v.AuxInt)
32906 f := auxToCall(v.Aux)
32907 _ = v.Args[2]
32908 dict_ := v.Args[0]
32909 key := v.Args[1]
32910 if key.Op != OpSelectN || auxIntToInt64(key.AuxInt) != 0 {
32911 break
32912 }
32913 sbts := key.Args[0]
32914 if sbts.Op != OpStaticLECall || len(sbts.Args) != 4 {
32915 break
32916 }
32917 g := auxToCall(sbts.Aux)
32918 mem := sbts.Args[3]
32919 ptr := sbts.Args[1]
32920 len := sbts.Args[2]
32921 m := v.Args[2]
32922 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)) {
32923 break
32924 }
32925 v.reset(OpStaticLECall)
32926 v.AuxInt = int32ToAuxInt(argsize)
32927 v.Aux = callToAux(f)
32928 v0 := b.NewValue0(v.Pos, OpStringMake, typ.String)
32929 v0.AddArg2(ptr, len)
32930 v.AddArg3(dict_, v0, mem)
32931 return true
32932 }
32933 return false
32934 }
32935 func rewriteValuegeneric_OpStore(v *Value) bool {
32936 v_2 := v.Args[2]
32937 v_1 := v.Args[1]
32938 v_0 := v.Args[0]
32939 b := v.Block
32940
32941
32942
32943 for {
32944 t1 := auxToType(v.Aux)
32945 p1 := v_0
32946 if v_1.Op != OpLoad {
32947 break
32948 }
32949 t2 := v_1.Type
32950 mem := v_1.Args[1]
32951 p2 := v_1.Args[0]
32952 if mem != v_2 || !(isSamePtr(p1, p2) && t2.Size() == t1.Size()) {
32953 break
32954 }
32955 v.copyOf(mem)
32956 return true
32957 }
32958
32959
32960
32961 for {
32962 t1 := auxToType(v.Aux)
32963 p1 := v_0
32964 if v_1.Op != OpLoad {
32965 break
32966 }
32967 t2 := v_1.Type
32968 oldmem := v_1.Args[1]
32969 p2 := v_1.Args[0]
32970 mem := v_2
32971 if mem.Op != OpStore {
32972 break
32973 }
32974 t3 := auxToType(mem.Aux)
32975 _ = mem.Args[2]
32976 p3 := mem.Args[0]
32977 if oldmem != mem.Args[2] || !(isSamePtr(p1, p2) && t2.Size() == t1.Size() && disjoint(p1, t1.Size(), p3, t3.Size())) {
32978 break
32979 }
32980 v.copyOf(mem)
32981 return true
32982 }
32983
32984
32985
32986 for {
32987 t1 := auxToType(v.Aux)
32988 p1 := v_0
32989 if v_1.Op != OpLoad {
32990 break
32991 }
32992 t2 := v_1.Type
32993 oldmem := v_1.Args[1]
32994 p2 := v_1.Args[0]
32995 mem := v_2
32996 if mem.Op != OpStore {
32997 break
32998 }
32999 t3 := auxToType(mem.Aux)
33000 _ = mem.Args[2]
33001 p3 := mem.Args[0]
33002 mem_2 := mem.Args[2]
33003 if mem_2.Op != OpStore {
33004 break
33005 }
33006 t4 := auxToType(mem_2.Aux)
33007 _ = mem_2.Args[2]
33008 p4 := mem_2.Args[0]
33009 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())) {
33010 break
33011 }
33012 v.copyOf(mem)
33013 return true
33014 }
33015
33016
33017
33018 for {
33019 t1 := auxToType(v.Aux)
33020 p1 := v_0
33021 if v_1.Op != OpLoad {
33022 break
33023 }
33024 t2 := v_1.Type
33025 oldmem := v_1.Args[1]
33026 p2 := v_1.Args[0]
33027 mem := v_2
33028 if mem.Op != OpStore {
33029 break
33030 }
33031 t3 := auxToType(mem.Aux)
33032 _ = mem.Args[2]
33033 p3 := mem.Args[0]
33034 mem_2 := mem.Args[2]
33035 if mem_2.Op != OpStore {
33036 break
33037 }
33038 t4 := auxToType(mem_2.Aux)
33039 _ = mem_2.Args[2]
33040 p4 := mem_2.Args[0]
33041 mem_2_2 := mem_2.Args[2]
33042 if mem_2_2.Op != OpStore {
33043 break
33044 }
33045 t5 := auxToType(mem_2_2.Aux)
33046 _ = mem_2_2.Args[2]
33047 p5 := mem_2_2.Args[0]
33048 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())) {
33049 break
33050 }
33051 v.copyOf(mem)
33052 return true
33053 }
33054
33055
33056
33057 for {
33058 t := auxToType(v.Aux)
33059 if v_0.Op != OpOffPtr {
33060 break
33061 }
33062 o := auxIntToInt64(v_0.AuxInt)
33063 p1 := v_0.Args[0]
33064 x := v_1
33065 mem := v_2
33066 if mem.Op != OpZero {
33067 break
33068 }
33069 n := auxIntToInt64(mem.AuxInt)
33070 p2 := mem.Args[0]
33071 if !(isConstZero(x) && o >= 0 && t.Size()+o <= n && isSamePtr(p1, p2)) {
33072 break
33073 }
33074 v.copyOf(mem)
33075 return true
33076 }
33077
33078
33079
33080 for {
33081 t1 := auxToType(v.Aux)
33082 op := v_0
33083 if op.Op != OpOffPtr {
33084 break
33085 }
33086 o1 := auxIntToInt64(op.AuxInt)
33087 p1 := op.Args[0]
33088 x := v_1
33089 mem := v_2
33090 if mem.Op != OpStore {
33091 break
33092 }
33093 t2 := auxToType(mem.Aux)
33094 _ = mem.Args[2]
33095 p2 := mem.Args[0]
33096 mem_2 := mem.Args[2]
33097 if mem_2.Op != OpZero {
33098 break
33099 }
33100 n := auxIntToInt64(mem_2.AuxInt)
33101 p3 := mem_2.Args[0]
33102 if !(isConstZero(x) && o1 >= 0 && t1.Size()+o1 <= n && isSamePtr(p1, p3) && disjoint(op, t1.Size(), p2, t2.Size())) {
33103 break
33104 }
33105 v.copyOf(mem)
33106 return true
33107 }
33108
33109
33110
33111 for {
33112 t1 := auxToType(v.Aux)
33113 op := v_0
33114 if op.Op != OpOffPtr {
33115 break
33116 }
33117 o1 := auxIntToInt64(op.AuxInt)
33118 p1 := op.Args[0]
33119 x := v_1
33120 mem := v_2
33121 if mem.Op != OpStore {
33122 break
33123 }
33124 t2 := auxToType(mem.Aux)
33125 _ = mem.Args[2]
33126 p2 := mem.Args[0]
33127 mem_2 := mem.Args[2]
33128 if mem_2.Op != OpStore {
33129 break
33130 }
33131 t3 := auxToType(mem_2.Aux)
33132 _ = mem_2.Args[2]
33133 p3 := mem_2.Args[0]
33134 mem_2_2 := mem_2.Args[2]
33135 if mem_2_2.Op != OpZero {
33136 break
33137 }
33138 n := auxIntToInt64(mem_2_2.AuxInt)
33139 p4 := mem_2_2.Args[0]
33140 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())) {
33141 break
33142 }
33143 v.copyOf(mem)
33144 return true
33145 }
33146
33147
33148
33149 for {
33150 t1 := auxToType(v.Aux)
33151 op := v_0
33152 if op.Op != OpOffPtr {
33153 break
33154 }
33155 o1 := auxIntToInt64(op.AuxInt)
33156 p1 := op.Args[0]
33157 x := v_1
33158 mem := v_2
33159 if mem.Op != OpStore {
33160 break
33161 }
33162 t2 := auxToType(mem.Aux)
33163 _ = mem.Args[2]
33164 p2 := mem.Args[0]
33165 mem_2 := mem.Args[2]
33166 if mem_2.Op != OpStore {
33167 break
33168 }
33169 t3 := auxToType(mem_2.Aux)
33170 _ = mem_2.Args[2]
33171 p3 := mem_2.Args[0]
33172 mem_2_2 := mem_2.Args[2]
33173 if mem_2_2.Op != OpStore {
33174 break
33175 }
33176 t4 := auxToType(mem_2_2.Aux)
33177 _ = mem_2_2.Args[2]
33178 p4 := mem_2_2.Args[0]
33179 mem_2_2_2 := mem_2_2.Args[2]
33180 if mem_2_2_2.Op != OpZero {
33181 break
33182 }
33183 n := auxIntToInt64(mem_2_2_2.AuxInt)
33184 p5 := mem_2_2_2.Args[0]
33185 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())) {
33186 break
33187 }
33188 v.copyOf(mem)
33189 return true
33190 }
33191
33192
33193 for {
33194 if v_1.Op != OpStructMake {
33195 break
33196 }
33197 v.copyOf(rewriteStructStore(v))
33198 return true
33199 }
33200
33201
33202
33203 for {
33204 t := auxToType(v.Aux)
33205 dst := v_0
33206 if v_1.Op != OpLoad {
33207 break
33208 }
33209 mem := v_1.Args[1]
33210 src := v_1.Args[0]
33211 if mem != v_2 || !(!CanSSA(t)) {
33212 break
33213 }
33214 v.reset(OpMove)
33215 v.AuxInt = int64ToAuxInt(t.Size())
33216 v.Aux = typeToAux(t)
33217 v.AddArg3(dst, src, mem)
33218 return true
33219 }
33220
33221
33222
33223 for {
33224 t := auxToType(v.Aux)
33225 dst := v_0
33226 if v_1.Op != OpLoad {
33227 break
33228 }
33229 mem := v_1.Args[1]
33230 src := v_1.Args[0]
33231 if v_2.Op != OpVarDef {
33232 break
33233 }
33234 x := auxToSym(v_2.Aux)
33235 if mem != v_2.Args[0] || !(!CanSSA(t)) {
33236 break
33237 }
33238 v.reset(OpMove)
33239 v.AuxInt = int64ToAuxInt(t.Size())
33240 v.Aux = typeToAux(t)
33241 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
33242 v0.Aux = symToAux(x)
33243 v0.AddArg(mem)
33244 v.AddArg3(dst, src, v0)
33245 return true
33246 }
33247
33248
33249 for {
33250 dst := v_0
33251 if v_1.Op != OpArrayMake1 {
33252 break
33253 }
33254 e := v_1.Args[0]
33255 mem := v_2
33256 v.reset(OpStore)
33257 v.Aux = typeToAux(e.Type)
33258 v.AddArg3(dst, e, mem)
33259 return true
33260 }
33261
33262
33263 for {
33264 if v_1.Op != OpEmpty {
33265 break
33266 }
33267 mem := v_2
33268 v.copyOf(mem)
33269 return true
33270 }
33271
33272
33273
33274 for {
33275 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
33276 break
33277 }
33278 call := v_0.Args[0]
33279 if call.Op != OpStaticLECall {
33280 break
33281 }
33282 x := v_1
33283 mem := v_2
33284 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isConstZero(x) && isMalloc(call.Aux)) {
33285 break
33286 }
33287 v.copyOf(mem)
33288 return true
33289 }
33290
33291
33292
33293 for {
33294 if v_0.Op != OpOffPtr {
33295 break
33296 }
33297 v_0_0 := v_0.Args[0]
33298 if v_0_0.Op != OpSelectN || auxIntToInt64(v_0_0.AuxInt) != 0 {
33299 break
33300 }
33301 call := v_0_0.Args[0]
33302 if call.Op != OpStaticLECall {
33303 break
33304 }
33305 x := v_1
33306 mem := v_2
33307 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isConstZero(x) && isMalloc(call.Aux)) {
33308 break
33309 }
33310 v.copyOf(mem)
33311 return true
33312 }
33313
33314
33315
33316 for {
33317 t1 := auxToType(v.Aux)
33318 op1 := v_0
33319 if op1.Op != OpOffPtr {
33320 break
33321 }
33322 o1 := auxIntToInt64(op1.AuxInt)
33323 p1 := op1.Args[0]
33324 d1 := v_1
33325 m2 := v_2
33326 if m2.Op != OpStore {
33327 break
33328 }
33329 t2 := auxToType(m2.Aux)
33330 _ = m2.Args[2]
33331 op2 := m2.Args[0]
33332 if op2.Op != OpOffPtr || auxIntToInt64(op2.AuxInt) != 0 {
33333 break
33334 }
33335 p2 := op2.Args[0]
33336 d2 := m2.Args[1]
33337 m3 := m2.Args[2]
33338 if m3.Op != OpMove {
33339 break
33340 }
33341 n := auxIntToInt64(m3.AuxInt)
33342 mem := m3.Args[2]
33343 p3 := m3.Args[0]
33344 if !(m2.Uses == 1 && m3.Uses == 1 && o1 == t2.Size() && n == t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2, m3)) {
33345 break
33346 }
33347 v.reset(OpStore)
33348 v.Aux = typeToAux(t1)
33349 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33350 v0.Aux = typeToAux(t2)
33351 v0.AddArg3(op2, d2, mem)
33352 v.AddArg3(op1, d1, v0)
33353 return true
33354 }
33355
33356
33357
33358 for {
33359 t1 := auxToType(v.Aux)
33360 op1 := v_0
33361 if op1.Op != OpOffPtr {
33362 break
33363 }
33364 o1 := auxIntToInt64(op1.AuxInt)
33365 p1 := op1.Args[0]
33366 d1 := v_1
33367 m2 := v_2
33368 if m2.Op != OpStore {
33369 break
33370 }
33371 t2 := auxToType(m2.Aux)
33372 _ = m2.Args[2]
33373 op2 := m2.Args[0]
33374 if op2.Op != OpOffPtr {
33375 break
33376 }
33377 o2 := auxIntToInt64(op2.AuxInt)
33378 p2 := op2.Args[0]
33379 d2 := m2.Args[1]
33380 m3 := m2.Args[2]
33381 if m3.Op != OpStore {
33382 break
33383 }
33384 t3 := auxToType(m3.Aux)
33385 _ = m3.Args[2]
33386 op3 := m3.Args[0]
33387 if op3.Op != OpOffPtr || auxIntToInt64(op3.AuxInt) != 0 {
33388 break
33389 }
33390 p3 := op3.Args[0]
33391 d3 := m3.Args[1]
33392 m4 := m3.Args[2]
33393 if m4.Op != OpMove {
33394 break
33395 }
33396 n := auxIntToInt64(m4.AuxInt)
33397 mem := m4.Args[2]
33398 p4 := m4.Args[0]
33399 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)) {
33400 break
33401 }
33402 v.reset(OpStore)
33403 v.Aux = typeToAux(t1)
33404 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33405 v0.Aux = typeToAux(t2)
33406 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33407 v1.Aux = typeToAux(t3)
33408 v1.AddArg3(op3, d3, mem)
33409 v0.AddArg3(op2, d2, v1)
33410 v.AddArg3(op1, d1, v0)
33411 return true
33412 }
33413
33414
33415
33416 for {
33417 t1 := auxToType(v.Aux)
33418 op1 := v_0
33419 if op1.Op != OpOffPtr {
33420 break
33421 }
33422 o1 := auxIntToInt64(op1.AuxInt)
33423 p1 := op1.Args[0]
33424 d1 := v_1
33425 m2 := v_2
33426 if m2.Op != OpStore {
33427 break
33428 }
33429 t2 := auxToType(m2.Aux)
33430 _ = m2.Args[2]
33431 op2 := m2.Args[0]
33432 if op2.Op != OpOffPtr {
33433 break
33434 }
33435 o2 := auxIntToInt64(op2.AuxInt)
33436 p2 := op2.Args[0]
33437 d2 := m2.Args[1]
33438 m3 := m2.Args[2]
33439 if m3.Op != OpStore {
33440 break
33441 }
33442 t3 := auxToType(m3.Aux)
33443 _ = m3.Args[2]
33444 op3 := m3.Args[0]
33445 if op3.Op != OpOffPtr {
33446 break
33447 }
33448 o3 := auxIntToInt64(op3.AuxInt)
33449 p3 := op3.Args[0]
33450 d3 := m3.Args[1]
33451 m4 := m3.Args[2]
33452 if m4.Op != OpStore {
33453 break
33454 }
33455 t4 := auxToType(m4.Aux)
33456 _ = m4.Args[2]
33457 op4 := m4.Args[0]
33458 if op4.Op != OpOffPtr || auxIntToInt64(op4.AuxInt) != 0 {
33459 break
33460 }
33461 p4 := op4.Args[0]
33462 d4 := m4.Args[1]
33463 m5 := m4.Args[2]
33464 if m5.Op != OpMove {
33465 break
33466 }
33467 n := auxIntToInt64(m5.AuxInt)
33468 mem := m5.Args[2]
33469 p5 := m5.Args[0]
33470 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)) {
33471 break
33472 }
33473 v.reset(OpStore)
33474 v.Aux = typeToAux(t1)
33475 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33476 v0.Aux = typeToAux(t2)
33477 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33478 v1.Aux = typeToAux(t3)
33479 v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33480 v2.Aux = typeToAux(t4)
33481 v2.AddArg3(op4, d4, mem)
33482 v1.AddArg3(op3, d3, v2)
33483 v0.AddArg3(op2, d2, v1)
33484 v.AddArg3(op1, d1, v0)
33485 return true
33486 }
33487
33488
33489
33490 for {
33491 t1 := auxToType(v.Aux)
33492 op1 := v_0
33493 if op1.Op != OpOffPtr {
33494 break
33495 }
33496 o1 := auxIntToInt64(op1.AuxInt)
33497 p1 := op1.Args[0]
33498 d1 := v_1
33499 m2 := v_2
33500 if m2.Op != OpStore {
33501 break
33502 }
33503 t2 := auxToType(m2.Aux)
33504 _ = m2.Args[2]
33505 op2 := m2.Args[0]
33506 if op2.Op != OpOffPtr || auxIntToInt64(op2.AuxInt) != 0 {
33507 break
33508 }
33509 p2 := op2.Args[0]
33510 d2 := m2.Args[1]
33511 m3 := m2.Args[2]
33512 if m3.Op != OpZero {
33513 break
33514 }
33515 n := auxIntToInt64(m3.AuxInt)
33516 mem := m3.Args[1]
33517 p3 := m3.Args[0]
33518 if !(m2.Uses == 1 && m3.Uses == 1 && o1 == t2.Size() && n == t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2, m3)) {
33519 break
33520 }
33521 v.reset(OpStore)
33522 v.Aux = typeToAux(t1)
33523 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33524 v0.Aux = typeToAux(t2)
33525 v0.AddArg3(op2, d2, mem)
33526 v.AddArg3(op1, d1, v0)
33527 return true
33528 }
33529
33530
33531
33532 for {
33533 t1 := auxToType(v.Aux)
33534 op1 := v_0
33535 if op1.Op != OpOffPtr {
33536 break
33537 }
33538 o1 := auxIntToInt64(op1.AuxInt)
33539 p1 := op1.Args[0]
33540 d1 := v_1
33541 m2 := v_2
33542 if m2.Op != OpStore {
33543 break
33544 }
33545 t2 := auxToType(m2.Aux)
33546 _ = m2.Args[2]
33547 op2 := m2.Args[0]
33548 if op2.Op != OpOffPtr {
33549 break
33550 }
33551 o2 := auxIntToInt64(op2.AuxInt)
33552 p2 := op2.Args[0]
33553 d2 := m2.Args[1]
33554 m3 := m2.Args[2]
33555 if m3.Op != OpStore {
33556 break
33557 }
33558 t3 := auxToType(m3.Aux)
33559 _ = m3.Args[2]
33560 op3 := m3.Args[0]
33561 if op3.Op != OpOffPtr || auxIntToInt64(op3.AuxInt) != 0 {
33562 break
33563 }
33564 p3 := op3.Args[0]
33565 d3 := m3.Args[1]
33566 m4 := m3.Args[2]
33567 if m4.Op != OpZero {
33568 break
33569 }
33570 n := auxIntToInt64(m4.AuxInt)
33571 mem := m4.Args[1]
33572 p4 := m4.Args[0]
33573 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)) {
33574 break
33575 }
33576 v.reset(OpStore)
33577 v.Aux = typeToAux(t1)
33578 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33579 v0.Aux = typeToAux(t2)
33580 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33581 v1.Aux = typeToAux(t3)
33582 v1.AddArg3(op3, d3, mem)
33583 v0.AddArg3(op2, d2, v1)
33584 v.AddArg3(op1, d1, v0)
33585 return true
33586 }
33587
33588
33589
33590 for {
33591 t1 := auxToType(v.Aux)
33592 op1 := v_0
33593 if op1.Op != OpOffPtr {
33594 break
33595 }
33596 o1 := auxIntToInt64(op1.AuxInt)
33597 p1 := op1.Args[0]
33598 d1 := v_1
33599 m2 := v_2
33600 if m2.Op != OpStore {
33601 break
33602 }
33603 t2 := auxToType(m2.Aux)
33604 _ = m2.Args[2]
33605 op2 := m2.Args[0]
33606 if op2.Op != OpOffPtr {
33607 break
33608 }
33609 o2 := auxIntToInt64(op2.AuxInt)
33610 p2 := op2.Args[0]
33611 d2 := m2.Args[1]
33612 m3 := m2.Args[2]
33613 if m3.Op != OpStore {
33614 break
33615 }
33616 t3 := auxToType(m3.Aux)
33617 _ = m3.Args[2]
33618 op3 := m3.Args[0]
33619 if op3.Op != OpOffPtr {
33620 break
33621 }
33622 o3 := auxIntToInt64(op3.AuxInt)
33623 p3 := op3.Args[0]
33624 d3 := m3.Args[1]
33625 m4 := m3.Args[2]
33626 if m4.Op != OpStore {
33627 break
33628 }
33629 t4 := auxToType(m4.Aux)
33630 _ = m4.Args[2]
33631 op4 := m4.Args[0]
33632 if op4.Op != OpOffPtr || auxIntToInt64(op4.AuxInt) != 0 {
33633 break
33634 }
33635 p4 := op4.Args[0]
33636 d4 := m4.Args[1]
33637 m5 := m4.Args[2]
33638 if m5.Op != OpZero {
33639 break
33640 }
33641 n := auxIntToInt64(m5.AuxInt)
33642 mem := m5.Args[1]
33643 p5 := m5.Args[0]
33644 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)) {
33645 break
33646 }
33647 v.reset(OpStore)
33648 v.Aux = typeToAux(t1)
33649 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33650 v0.Aux = typeToAux(t2)
33651 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33652 v1.Aux = typeToAux(t3)
33653 v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
33654 v2.Aux = typeToAux(t4)
33655 v2.AddArg3(op4, d4, mem)
33656 v1.AddArg3(op3, d3, v2)
33657 v0.AddArg3(op2, d2, v1)
33658 v.AddArg3(op1, d1, v0)
33659 return true
33660 }
33661 return false
33662 }
33663 func rewriteValuegeneric_OpStringLen(v *Value) bool {
33664 v_0 := v.Args[0]
33665
33666
33667 for {
33668 if v_0.Op != OpStringMake {
33669 break
33670 }
33671 _ = v_0.Args[1]
33672 v_0_1 := v_0.Args[1]
33673 if v_0_1.Op != OpConst64 {
33674 break
33675 }
33676 t := v_0_1.Type
33677 c := auxIntToInt64(v_0_1.AuxInt)
33678 v.reset(OpConst64)
33679 v.Type = t
33680 v.AuxInt = int64ToAuxInt(c)
33681 return true
33682 }
33683 return false
33684 }
33685 func rewriteValuegeneric_OpStringPtr(v *Value) bool {
33686 v_0 := v.Args[0]
33687
33688
33689 for {
33690 if v_0.Op != OpStringMake {
33691 break
33692 }
33693 v_0_0 := v_0.Args[0]
33694 if v_0_0.Op != OpAddr {
33695 break
33696 }
33697 t := v_0_0.Type
33698 s := auxToSym(v_0_0.Aux)
33699 base := v_0_0.Args[0]
33700 v.reset(OpAddr)
33701 v.Type = t
33702 v.Aux = symToAux(s)
33703 v.AddArg(base)
33704 return true
33705 }
33706 return false
33707 }
33708 func rewriteValuegeneric_OpStructSelect(v *Value) bool {
33709 v_0 := v.Args[0]
33710 b := v.Block
33711
33712
33713 for {
33714 i := auxIntToInt64(v.AuxInt)
33715 x := v_0
33716 if x.Op != OpStructMake {
33717 break
33718 }
33719 v.copyOf(x.Args[i])
33720 return true
33721 }
33722
33723
33724
33725 for {
33726 i := auxIntToInt64(v.AuxInt)
33727 x := v_0
33728 if x.Op != OpLoad {
33729 break
33730 }
33731 t := x.Type
33732 mem := x.Args[1]
33733 ptr := x.Args[0]
33734 if !(!CanSSA(t)) {
33735 break
33736 }
33737 b = x.Block
33738 v0 := b.NewValue0(v.Pos, OpLoad, v.Type)
33739 v.copyOf(v0)
33740 v1 := b.NewValue0(v.Pos, OpOffPtr, v.Type.PtrTo())
33741 v1.AuxInt = int64ToAuxInt(t.FieldOff(int(i)))
33742 v1.AddArg(ptr)
33743 v0.AddArg2(v1, mem)
33744 return true
33745 }
33746
33747
33748
33749 for {
33750 if v_0.Op != OpIData {
33751 break
33752 }
33753 x := v_0.Args[0]
33754 if !(v.Type.Size() > 0) {
33755 break
33756 }
33757 v.reset(OpIData)
33758 v.AddArg(x)
33759 return true
33760 }
33761
33762
33763
33764 for {
33765 if v_0.Op != OpIData {
33766 break
33767 }
33768 if !(v.Type.Size() == 0) {
33769 break
33770 }
33771 v.reset(OpEmpty)
33772 return true
33773 }
33774 return false
33775 }
33776 func rewriteValuegeneric_OpSub16(v *Value) bool {
33777 v_1 := v.Args[1]
33778 v_0 := v.Args[0]
33779 b := v.Block
33780
33781
33782 for {
33783 if v_0.Op != OpConst16 {
33784 break
33785 }
33786 c := auxIntToInt16(v_0.AuxInt)
33787 if v_1.Op != OpConst16 {
33788 break
33789 }
33790 d := auxIntToInt16(v_1.AuxInt)
33791 v.reset(OpConst16)
33792 v.AuxInt = int16ToAuxInt(c - d)
33793 return true
33794 }
33795
33796
33797
33798 for {
33799 x := v_0
33800 if v_1.Op != OpConst16 {
33801 break
33802 }
33803 t := v_1.Type
33804 c := auxIntToInt16(v_1.AuxInt)
33805 if !(x.Op != OpConst16) {
33806 break
33807 }
33808 v.reset(OpAdd16)
33809 v0 := b.NewValue0(v.Pos, OpConst16, t)
33810 v0.AuxInt = int16ToAuxInt(-c)
33811 v.AddArg2(v0, x)
33812 return true
33813 }
33814
33815
33816 for {
33817 t := v.Type
33818 if v_0.Op != OpMul16 {
33819 break
33820 }
33821 _ = v_0.Args[1]
33822 v_0_0 := v_0.Args[0]
33823 v_0_1 := v_0.Args[1]
33824 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33825 x := v_0_0
33826 y := v_0_1
33827 if v_1.Op != OpMul16 {
33828 continue
33829 }
33830 _ = v_1.Args[1]
33831 v_1_0 := v_1.Args[0]
33832 v_1_1 := v_1.Args[1]
33833 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33834 if x != v_1_0 {
33835 continue
33836 }
33837 z := v_1_1
33838 v.reset(OpMul16)
33839 v0 := b.NewValue0(v.Pos, OpSub16, t)
33840 v0.AddArg2(y, z)
33841 v.AddArg2(x, v0)
33842 return true
33843 }
33844 }
33845 break
33846 }
33847
33848
33849 for {
33850 x := v_0
33851 if x != v_1 {
33852 break
33853 }
33854 v.reset(OpConst16)
33855 v.AuxInt = int16ToAuxInt(0)
33856 return true
33857 }
33858
33859
33860 for {
33861 if v_0.Op != OpNeg16 {
33862 break
33863 }
33864 x := v_0.Args[0]
33865 if v_1.Op != OpCom16 || x != v_1.Args[0] {
33866 break
33867 }
33868 v.reset(OpConst16)
33869 v.AuxInt = int16ToAuxInt(1)
33870 return true
33871 }
33872
33873
33874 for {
33875 if v_0.Op != OpCom16 {
33876 break
33877 }
33878 x := v_0.Args[0]
33879 if v_1.Op != OpNeg16 || x != v_1.Args[0] {
33880 break
33881 }
33882 v.reset(OpConst16)
33883 v.AuxInt = int16ToAuxInt(-1)
33884 return true
33885 }
33886
33887
33888 for {
33889 if v_0.Op != OpAdd16 {
33890 break
33891 }
33892 _ = v_0.Args[1]
33893 v_0_0 := v_0.Args[0]
33894 v_0_1 := v_0.Args[1]
33895 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33896 t := v_0_0
33897 x := v_0_1
33898 if v_1.Op != OpAdd16 {
33899 continue
33900 }
33901 _ = v_1.Args[1]
33902 v_1_0 := v_1.Args[0]
33903 v_1_1 := v_1.Args[1]
33904 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33905 if t != v_1_0 {
33906 continue
33907 }
33908 y := v_1_1
33909 v.reset(OpSub16)
33910 v.AddArg2(x, y)
33911 return true
33912 }
33913 }
33914 break
33915 }
33916
33917
33918 for {
33919 if v_0.Op != OpAdd16 {
33920 break
33921 }
33922 _ = v_0.Args[1]
33923 v_0_0 := v_0.Args[0]
33924 v_0_1 := v_0.Args[1]
33925 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33926 x := v_0_0
33927 y := v_0_1
33928 if x != v_1 {
33929 continue
33930 }
33931 v.copyOf(y)
33932 return true
33933 }
33934 break
33935 }
33936
33937
33938 for {
33939 if v_0.Op != OpAdd16 {
33940 break
33941 }
33942 _ = v_0.Args[1]
33943 v_0_0 := v_0.Args[0]
33944 v_0_1 := v_0.Args[1]
33945 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33946 x := v_0_0
33947 y := v_0_1
33948 if y != v_1 {
33949 continue
33950 }
33951 v.copyOf(x)
33952 return true
33953 }
33954 break
33955 }
33956
33957
33958 for {
33959 if v_0.Op != OpSub16 {
33960 break
33961 }
33962 y := v_0.Args[1]
33963 x := v_0.Args[0]
33964 if x != v_1 {
33965 break
33966 }
33967 v.reset(OpNeg16)
33968 v.AddArg(y)
33969 return true
33970 }
33971
33972
33973 for {
33974 x := v_0
33975 if v_1.Op != OpAdd16 {
33976 break
33977 }
33978 _ = v_1.Args[1]
33979 v_1_0 := v_1.Args[0]
33980 v_1_1 := v_1.Args[1]
33981 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33982 if x != v_1_0 {
33983 continue
33984 }
33985 y := v_1_1
33986 v.reset(OpNeg16)
33987 v.AddArg(y)
33988 return true
33989 }
33990 break
33991 }
33992
33993
33994
33995 for {
33996 x := v_0
33997 if v_1.Op != OpSub16 {
33998 break
33999 }
34000 z := v_1.Args[1]
34001 i := v_1.Args[0]
34002 if i.Op != OpConst16 {
34003 break
34004 }
34005 t := i.Type
34006 if !(z.Op != OpConst16 && x.Op != OpConst16) {
34007 break
34008 }
34009 v.reset(OpSub16)
34010 v0 := b.NewValue0(v.Pos, OpAdd16, t)
34011 v0.AddArg2(x, z)
34012 v.AddArg2(v0, i)
34013 return true
34014 }
34015
34016
34017
34018 for {
34019 x := v_0
34020 if v_1.Op != OpAdd16 {
34021 break
34022 }
34023 _ = v_1.Args[1]
34024 v_1_0 := v_1.Args[0]
34025 v_1_1 := v_1.Args[1]
34026 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34027 z := v_1_0
34028 i := v_1_1
34029 if i.Op != OpConst16 {
34030 continue
34031 }
34032 t := i.Type
34033 if !(z.Op != OpConst16 && x.Op != OpConst16) {
34034 continue
34035 }
34036 v.reset(OpSub16)
34037 v0 := b.NewValue0(v.Pos, OpSub16, t)
34038 v0.AddArg2(x, z)
34039 v.AddArg2(v0, i)
34040 return true
34041 }
34042 break
34043 }
34044
34045
34046
34047 for {
34048 if v_0.Op != OpSub16 {
34049 break
34050 }
34051 z := v_0.Args[1]
34052 i := v_0.Args[0]
34053 if i.Op != OpConst16 {
34054 break
34055 }
34056 t := i.Type
34057 x := v_1
34058 if !(z.Op != OpConst16 && x.Op != OpConst16) {
34059 break
34060 }
34061 v.reset(OpSub16)
34062 v0 := b.NewValue0(v.Pos, OpAdd16, t)
34063 v0.AddArg2(z, x)
34064 v.AddArg2(i, v0)
34065 return true
34066 }
34067
34068
34069
34070 for {
34071 if v_0.Op != OpAdd16 {
34072 break
34073 }
34074 _ = v_0.Args[1]
34075 v_0_0 := v_0.Args[0]
34076 v_0_1 := v_0.Args[1]
34077 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34078 z := v_0_0
34079 i := v_0_1
34080 if i.Op != OpConst16 {
34081 continue
34082 }
34083 t := i.Type
34084 x := v_1
34085 if !(z.Op != OpConst16 && x.Op != OpConst16) {
34086 continue
34087 }
34088 v.reset(OpAdd16)
34089 v0 := b.NewValue0(v.Pos, OpSub16, t)
34090 v0.AddArg2(z, x)
34091 v.AddArg2(i, v0)
34092 return true
34093 }
34094 break
34095 }
34096
34097
34098 for {
34099 if v_0.Op != OpConst16 {
34100 break
34101 }
34102 t := v_0.Type
34103 c := auxIntToInt16(v_0.AuxInt)
34104 if v_1.Op != OpSub16 {
34105 break
34106 }
34107 x := v_1.Args[1]
34108 v_1_0 := v_1.Args[0]
34109 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
34110 break
34111 }
34112 d := auxIntToInt16(v_1_0.AuxInt)
34113 v.reset(OpAdd16)
34114 v0 := b.NewValue0(v.Pos, OpConst16, t)
34115 v0.AuxInt = int16ToAuxInt(c - d)
34116 v.AddArg2(v0, x)
34117 return true
34118 }
34119
34120
34121 for {
34122 if v_0.Op != OpConst16 {
34123 break
34124 }
34125 t := v_0.Type
34126 c := auxIntToInt16(v_0.AuxInt)
34127 if v_1.Op != OpAdd16 {
34128 break
34129 }
34130 _ = v_1.Args[1]
34131 v_1_0 := v_1.Args[0]
34132 v_1_1 := v_1.Args[1]
34133 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34134 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
34135 continue
34136 }
34137 d := auxIntToInt16(v_1_0.AuxInt)
34138 x := v_1_1
34139 v.reset(OpSub16)
34140 v0 := b.NewValue0(v.Pos, OpConst16, t)
34141 v0.AuxInt = int16ToAuxInt(c - d)
34142 v.AddArg2(v0, x)
34143 return true
34144 }
34145 break
34146 }
34147 return false
34148 }
34149 func rewriteValuegeneric_OpSub32(v *Value) bool {
34150 v_1 := v.Args[1]
34151 v_0 := v.Args[0]
34152 b := v.Block
34153
34154
34155 for {
34156 if v_0.Op != OpConst32 {
34157 break
34158 }
34159 c := auxIntToInt32(v_0.AuxInt)
34160 if v_1.Op != OpConst32 {
34161 break
34162 }
34163 d := auxIntToInt32(v_1.AuxInt)
34164 v.reset(OpConst32)
34165 v.AuxInt = int32ToAuxInt(c - d)
34166 return true
34167 }
34168
34169
34170
34171 for {
34172 x := v_0
34173 if v_1.Op != OpConst32 {
34174 break
34175 }
34176 t := v_1.Type
34177 c := auxIntToInt32(v_1.AuxInt)
34178 if !(x.Op != OpConst32) {
34179 break
34180 }
34181 v.reset(OpAdd32)
34182 v0 := b.NewValue0(v.Pos, OpConst32, t)
34183 v0.AuxInt = int32ToAuxInt(-c)
34184 v.AddArg2(v0, x)
34185 return true
34186 }
34187
34188
34189 for {
34190 t := v.Type
34191 if v_0.Op != OpMul32 {
34192 break
34193 }
34194 _ = v_0.Args[1]
34195 v_0_0 := v_0.Args[0]
34196 v_0_1 := v_0.Args[1]
34197 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34198 x := v_0_0
34199 y := v_0_1
34200 if v_1.Op != OpMul32 {
34201 continue
34202 }
34203 _ = v_1.Args[1]
34204 v_1_0 := v_1.Args[0]
34205 v_1_1 := v_1.Args[1]
34206 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34207 if x != v_1_0 {
34208 continue
34209 }
34210 z := v_1_1
34211 v.reset(OpMul32)
34212 v0 := b.NewValue0(v.Pos, OpSub32, t)
34213 v0.AddArg2(y, z)
34214 v.AddArg2(x, v0)
34215 return true
34216 }
34217 }
34218 break
34219 }
34220
34221
34222 for {
34223 x := v_0
34224 if x != v_1 {
34225 break
34226 }
34227 v.reset(OpConst32)
34228 v.AuxInt = int32ToAuxInt(0)
34229 return true
34230 }
34231
34232
34233 for {
34234 if v_0.Op != OpNeg32 {
34235 break
34236 }
34237 x := v_0.Args[0]
34238 if v_1.Op != OpCom32 || x != v_1.Args[0] {
34239 break
34240 }
34241 v.reset(OpConst32)
34242 v.AuxInt = int32ToAuxInt(1)
34243 return true
34244 }
34245
34246
34247 for {
34248 if v_0.Op != OpCom32 {
34249 break
34250 }
34251 x := v_0.Args[0]
34252 if v_1.Op != OpNeg32 || x != v_1.Args[0] {
34253 break
34254 }
34255 v.reset(OpConst32)
34256 v.AuxInt = int32ToAuxInt(-1)
34257 return true
34258 }
34259
34260
34261 for {
34262 if v_0.Op != OpAdd32 {
34263 break
34264 }
34265 _ = v_0.Args[1]
34266 v_0_0 := v_0.Args[0]
34267 v_0_1 := v_0.Args[1]
34268 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34269 t := v_0_0
34270 x := v_0_1
34271 if v_1.Op != OpAdd32 {
34272 continue
34273 }
34274 _ = v_1.Args[1]
34275 v_1_0 := v_1.Args[0]
34276 v_1_1 := v_1.Args[1]
34277 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34278 if t != v_1_0 {
34279 continue
34280 }
34281 y := v_1_1
34282 v.reset(OpSub32)
34283 v.AddArg2(x, y)
34284 return true
34285 }
34286 }
34287 break
34288 }
34289
34290
34291 for {
34292 if v_0.Op != OpAdd32 {
34293 break
34294 }
34295 _ = v_0.Args[1]
34296 v_0_0 := v_0.Args[0]
34297 v_0_1 := v_0.Args[1]
34298 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34299 x := v_0_0
34300 y := v_0_1
34301 if x != v_1 {
34302 continue
34303 }
34304 v.copyOf(y)
34305 return true
34306 }
34307 break
34308 }
34309
34310
34311 for {
34312 if v_0.Op != OpAdd32 {
34313 break
34314 }
34315 _ = v_0.Args[1]
34316 v_0_0 := v_0.Args[0]
34317 v_0_1 := v_0.Args[1]
34318 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34319 x := v_0_0
34320 y := v_0_1
34321 if y != v_1 {
34322 continue
34323 }
34324 v.copyOf(x)
34325 return true
34326 }
34327 break
34328 }
34329
34330
34331 for {
34332 if v_0.Op != OpSub32 {
34333 break
34334 }
34335 y := v_0.Args[1]
34336 x := v_0.Args[0]
34337 if x != v_1 {
34338 break
34339 }
34340 v.reset(OpNeg32)
34341 v.AddArg(y)
34342 return true
34343 }
34344
34345
34346 for {
34347 x := v_0
34348 if v_1.Op != OpAdd32 {
34349 break
34350 }
34351 _ = v_1.Args[1]
34352 v_1_0 := v_1.Args[0]
34353 v_1_1 := v_1.Args[1]
34354 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34355 if x != v_1_0 {
34356 continue
34357 }
34358 y := v_1_1
34359 v.reset(OpNeg32)
34360 v.AddArg(y)
34361 return true
34362 }
34363 break
34364 }
34365
34366
34367
34368 for {
34369 x := v_0
34370 if v_1.Op != OpSub32 {
34371 break
34372 }
34373 z := v_1.Args[1]
34374 i := v_1.Args[0]
34375 if i.Op != OpConst32 {
34376 break
34377 }
34378 t := i.Type
34379 if !(z.Op != OpConst32 && x.Op != OpConst32) {
34380 break
34381 }
34382 v.reset(OpSub32)
34383 v0 := b.NewValue0(v.Pos, OpAdd32, t)
34384 v0.AddArg2(x, z)
34385 v.AddArg2(v0, i)
34386 return true
34387 }
34388
34389
34390
34391 for {
34392 x := v_0
34393 if v_1.Op != OpAdd32 {
34394 break
34395 }
34396 _ = v_1.Args[1]
34397 v_1_0 := v_1.Args[0]
34398 v_1_1 := v_1.Args[1]
34399 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34400 z := v_1_0
34401 i := v_1_1
34402 if i.Op != OpConst32 {
34403 continue
34404 }
34405 t := i.Type
34406 if !(z.Op != OpConst32 && x.Op != OpConst32) {
34407 continue
34408 }
34409 v.reset(OpSub32)
34410 v0 := b.NewValue0(v.Pos, OpSub32, t)
34411 v0.AddArg2(x, z)
34412 v.AddArg2(v0, i)
34413 return true
34414 }
34415 break
34416 }
34417
34418
34419
34420 for {
34421 if v_0.Op != OpSub32 {
34422 break
34423 }
34424 z := v_0.Args[1]
34425 i := v_0.Args[0]
34426 if i.Op != OpConst32 {
34427 break
34428 }
34429 t := i.Type
34430 x := v_1
34431 if !(z.Op != OpConst32 && x.Op != OpConst32) {
34432 break
34433 }
34434 v.reset(OpSub32)
34435 v0 := b.NewValue0(v.Pos, OpAdd32, t)
34436 v0.AddArg2(z, x)
34437 v.AddArg2(i, v0)
34438 return true
34439 }
34440
34441
34442
34443 for {
34444 if v_0.Op != OpAdd32 {
34445 break
34446 }
34447 _ = v_0.Args[1]
34448 v_0_0 := v_0.Args[0]
34449 v_0_1 := v_0.Args[1]
34450 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34451 z := v_0_0
34452 i := v_0_1
34453 if i.Op != OpConst32 {
34454 continue
34455 }
34456 t := i.Type
34457 x := v_1
34458 if !(z.Op != OpConst32 && x.Op != OpConst32) {
34459 continue
34460 }
34461 v.reset(OpAdd32)
34462 v0 := b.NewValue0(v.Pos, OpSub32, t)
34463 v0.AddArg2(z, x)
34464 v.AddArg2(i, v0)
34465 return true
34466 }
34467 break
34468 }
34469
34470
34471 for {
34472 if v_0.Op != OpConst32 {
34473 break
34474 }
34475 t := v_0.Type
34476 c := auxIntToInt32(v_0.AuxInt)
34477 if v_1.Op != OpSub32 {
34478 break
34479 }
34480 x := v_1.Args[1]
34481 v_1_0 := v_1.Args[0]
34482 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
34483 break
34484 }
34485 d := auxIntToInt32(v_1_0.AuxInt)
34486 v.reset(OpAdd32)
34487 v0 := b.NewValue0(v.Pos, OpConst32, t)
34488 v0.AuxInt = int32ToAuxInt(c - d)
34489 v.AddArg2(v0, x)
34490 return true
34491 }
34492
34493
34494 for {
34495 if v_0.Op != OpConst32 {
34496 break
34497 }
34498 t := v_0.Type
34499 c := auxIntToInt32(v_0.AuxInt)
34500 if v_1.Op != OpAdd32 {
34501 break
34502 }
34503 _ = v_1.Args[1]
34504 v_1_0 := v_1.Args[0]
34505 v_1_1 := v_1.Args[1]
34506 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34507 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
34508 continue
34509 }
34510 d := auxIntToInt32(v_1_0.AuxInt)
34511 x := v_1_1
34512 v.reset(OpSub32)
34513 v0 := b.NewValue0(v.Pos, OpConst32, t)
34514 v0.AuxInt = int32ToAuxInt(c - d)
34515 v.AddArg2(v0, x)
34516 return true
34517 }
34518 break
34519 }
34520 return false
34521 }
34522 func rewriteValuegeneric_OpSub32F(v *Value) bool {
34523 v_1 := v.Args[1]
34524 v_0 := v.Args[0]
34525
34526
34527
34528 for {
34529 if v_0.Op != OpConst32F {
34530 break
34531 }
34532 c := auxIntToFloat32(v_0.AuxInt)
34533 if v_1.Op != OpConst32F {
34534 break
34535 }
34536 d := auxIntToFloat32(v_1.AuxInt)
34537 if !(c-d == c-d) {
34538 break
34539 }
34540 v.reset(OpConst32F)
34541 v.AuxInt = float32ToAuxInt(c - d)
34542 return true
34543 }
34544 return false
34545 }
34546 func rewriteValuegeneric_OpSub64(v *Value) bool {
34547 v_1 := v.Args[1]
34548 v_0 := v.Args[0]
34549 b := v.Block
34550
34551
34552 for {
34553 if v_0.Op != OpConst64 {
34554 break
34555 }
34556 c := auxIntToInt64(v_0.AuxInt)
34557 if v_1.Op != OpConst64 {
34558 break
34559 }
34560 d := auxIntToInt64(v_1.AuxInt)
34561 v.reset(OpConst64)
34562 v.AuxInt = int64ToAuxInt(c - d)
34563 return true
34564 }
34565
34566
34567
34568 for {
34569 x := v_0
34570 if v_1.Op != OpConst64 {
34571 break
34572 }
34573 t := v_1.Type
34574 c := auxIntToInt64(v_1.AuxInt)
34575 if !(x.Op != OpConst64) {
34576 break
34577 }
34578 v.reset(OpAdd64)
34579 v0 := b.NewValue0(v.Pos, OpConst64, t)
34580 v0.AuxInt = int64ToAuxInt(-c)
34581 v.AddArg2(v0, x)
34582 return true
34583 }
34584
34585
34586 for {
34587 t := v.Type
34588 if v_0.Op != OpMul64 {
34589 break
34590 }
34591 _ = v_0.Args[1]
34592 v_0_0 := v_0.Args[0]
34593 v_0_1 := v_0.Args[1]
34594 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34595 x := v_0_0
34596 y := v_0_1
34597 if v_1.Op != OpMul64 {
34598 continue
34599 }
34600 _ = v_1.Args[1]
34601 v_1_0 := v_1.Args[0]
34602 v_1_1 := v_1.Args[1]
34603 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34604 if x != v_1_0 {
34605 continue
34606 }
34607 z := v_1_1
34608 v.reset(OpMul64)
34609 v0 := b.NewValue0(v.Pos, OpSub64, t)
34610 v0.AddArg2(y, z)
34611 v.AddArg2(x, v0)
34612 return true
34613 }
34614 }
34615 break
34616 }
34617
34618
34619 for {
34620 x := v_0
34621 if x != v_1 {
34622 break
34623 }
34624 v.reset(OpConst64)
34625 v.AuxInt = int64ToAuxInt(0)
34626 return true
34627 }
34628
34629
34630 for {
34631 if v_0.Op != OpNeg64 {
34632 break
34633 }
34634 x := v_0.Args[0]
34635 if v_1.Op != OpCom64 || x != v_1.Args[0] {
34636 break
34637 }
34638 v.reset(OpConst64)
34639 v.AuxInt = int64ToAuxInt(1)
34640 return true
34641 }
34642
34643
34644 for {
34645 if v_0.Op != OpCom64 {
34646 break
34647 }
34648 x := v_0.Args[0]
34649 if v_1.Op != OpNeg64 || x != v_1.Args[0] {
34650 break
34651 }
34652 v.reset(OpConst64)
34653 v.AuxInt = int64ToAuxInt(-1)
34654 return true
34655 }
34656
34657
34658 for {
34659 if v_0.Op != OpAdd64 {
34660 break
34661 }
34662 _ = v_0.Args[1]
34663 v_0_0 := v_0.Args[0]
34664 v_0_1 := v_0.Args[1]
34665 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34666 t := v_0_0
34667 x := v_0_1
34668 if v_1.Op != OpAdd64 {
34669 continue
34670 }
34671 _ = v_1.Args[1]
34672 v_1_0 := v_1.Args[0]
34673 v_1_1 := v_1.Args[1]
34674 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34675 if t != v_1_0 {
34676 continue
34677 }
34678 y := v_1_1
34679 v.reset(OpSub64)
34680 v.AddArg2(x, y)
34681 return true
34682 }
34683 }
34684 break
34685 }
34686
34687
34688 for {
34689 if v_0.Op != OpAdd64 {
34690 break
34691 }
34692 _ = v_0.Args[1]
34693 v_0_0 := v_0.Args[0]
34694 v_0_1 := v_0.Args[1]
34695 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34696 x := v_0_0
34697 y := v_0_1
34698 if x != v_1 {
34699 continue
34700 }
34701 v.copyOf(y)
34702 return true
34703 }
34704 break
34705 }
34706
34707
34708 for {
34709 if v_0.Op != OpAdd64 {
34710 break
34711 }
34712 _ = v_0.Args[1]
34713 v_0_0 := v_0.Args[0]
34714 v_0_1 := v_0.Args[1]
34715 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34716 x := v_0_0
34717 y := v_0_1
34718 if y != v_1 {
34719 continue
34720 }
34721 v.copyOf(x)
34722 return true
34723 }
34724 break
34725 }
34726
34727
34728 for {
34729 if v_0.Op != OpSub64 {
34730 break
34731 }
34732 y := v_0.Args[1]
34733 x := v_0.Args[0]
34734 if x != v_1 {
34735 break
34736 }
34737 v.reset(OpNeg64)
34738 v.AddArg(y)
34739 return true
34740 }
34741
34742
34743 for {
34744 x := v_0
34745 if v_1.Op != OpAdd64 {
34746 break
34747 }
34748 _ = v_1.Args[1]
34749 v_1_0 := v_1.Args[0]
34750 v_1_1 := v_1.Args[1]
34751 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34752 if x != v_1_0 {
34753 continue
34754 }
34755 y := v_1_1
34756 v.reset(OpNeg64)
34757 v.AddArg(y)
34758 return true
34759 }
34760 break
34761 }
34762
34763
34764
34765 for {
34766 x := v_0
34767 if v_1.Op != OpSub64 {
34768 break
34769 }
34770 z := v_1.Args[1]
34771 i := v_1.Args[0]
34772 if i.Op != OpConst64 {
34773 break
34774 }
34775 t := i.Type
34776 if !(z.Op != OpConst64 && x.Op != OpConst64) {
34777 break
34778 }
34779 v.reset(OpSub64)
34780 v0 := b.NewValue0(v.Pos, OpAdd64, t)
34781 v0.AddArg2(x, z)
34782 v.AddArg2(v0, i)
34783 return true
34784 }
34785
34786
34787
34788 for {
34789 x := v_0
34790 if v_1.Op != OpAdd64 {
34791 break
34792 }
34793 _ = v_1.Args[1]
34794 v_1_0 := v_1.Args[0]
34795 v_1_1 := v_1.Args[1]
34796 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34797 z := v_1_0
34798 i := v_1_1
34799 if i.Op != OpConst64 {
34800 continue
34801 }
34802 t := i.Type
34803 if !(z.Op != OpConst64 && x.Op != OpConst64) {
34804 continue
34805 }
34806 v.reset(OpSub64)
34807 v0 := b.NewValue0(v.Pos, OpSub64, t)
34808 v0.AddArg2(x, z)
34809 v.AddArg2(v0, i)
34810 return true
34811 }
34812 break
34813 }
34814
34815
34816
34817 for {
34818 if v_0.Op != OpSub64 {
34819 break
34820 }
34821 z := v_0.Args[1]
34822 i := v_0.Args[0]
34823 if i.Op != OpConst64 {
34824 break
34825 }
34826 t := i.Type
34827 x := v_1
34828 if !(z.Op != OpConst64 && x.Op != OpConst64) {
34829 break
34830 }
34831 v.reset(OpSub64)
34832 v0 := b.NewValue0(v.Pos, OpAdd64, t)
34833 v0.AddArg2(z, x)
34834 v.AddArg2(i, v0)
34835 return true
34836 }
34837
34838
34839
34840 for {
34841 if v_0.Op != OpAdd64 {
34842 break
34843 }
34844 _ = v_0.Args[1]
34845 v_0_0 := v_0.Args[0]
34846 v_0_1 := v_0.Args[1]
34847 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34848 z := v_0_0
34849 i := v_0_1
34850 if i.Op != OpConst64 {
34851 continue
34852 }
34853 t := i.Type
34854 x := v_1
34855 if !(z.Op != OpConst64 && x.Op != OpConst64) {
34856 continue
34857 }
34858 v.reset(OpAdd64)
34859 v0 := b.NewValue0(v.Pos, OpSub64, t)
34860 v0.AddArg2(z, x)
34861 v.AddArg2(i, v0)
34862 return true
34863 }
34864 break
34865 }
34866
34867
34868 for {
34869 if v_0.Op != OpConst64 {
34870 break
34871 }
34872 t := v_0.Type
34873 c := auxIntToInt64(v_0.AuxInt)
34874 if v_1.Op != OpSub64 {
34875 break
34876 }
34877 x := v_1.Args[1]
34878 v_1_0 := v_1.Args[0]
34879 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
34880 break
34881 }
34882 d := auxIntToInt64(v_1_0.AuxInt)
34883 v.reset(OpAdd64)
34884 v0 := b.NewValue0(v.Pos, OpConst64, t)
34885 v0.AuxInt = int64ToAuxInt(c - d)
34886 v.AddArg2(v0, x)
34887 return true
34888 }
34889
34890
34891 for {
34892 if v_0.Op != OpConst64 {
34893 break
34894 }
34895 t := v_0.Type
34896 c := auxIntToInt64(v_0.AuxInt)
34897 if v_1.Op != OpAdd64 {
34898 break
34899 }
34900 _ = v_1.Args[1]
34901 v_1_0 := v_1.Args[0]
34902 v_1_1 := v_1.Args[1]
34903 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34904 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
34905 continue
34906 }
34907 d := auxIntToInt64(v_1_0.AuxInt)
34908 x := v_1_1
34909 v.reset(OpSub64)
34910 v0 := b.NewValue0(v.Pos, OpConst64, t)
34911 v0.AuxInt = int64ToAuxInt(c - d)
34912 v.AddArg2(v0, x)
34913 return true
34914 }
34915 break
34916 }
34917 return false
34918 }
34919 func rewriteValuegeneric_OpSub64F(v *Value) bool {
34920 v_1 := v.Args[1]
34921 v_0 := v.Args[0]
34922
34923
34924
34925 for {
34926 if v_0.Op != OpConst64F {
34927 break
34928 }
34929 c := auxIntToFloat64(v_0.AuxInt)
34930 if v_1.Op != OpConst64F {
34931 break
34932 }
34933 d := auxIntToFloat64(v_1.AuxInt)
34934 if !(c-d == c-d) {
34935 break
34936 }
34937 v.reset(OpConst64F)
34938 v.AuxInt = float64ToAuxInt(c - d)
34939 return true
34940 }
34941 return false
34942 }
34943 func rewriteValuegeneric_OpSub8(v *Value) bool {
34944 v_1 := v.Args[1]
34945 v_0 := v.Args[0]
34946 b := v.Block
34947
34948
34949 for {
34950 if v_0.Op != OpConst8 {
34951 break
34952 }
34953 c := auxIntToInt8(v_0.AuxInt)
34954 if v_1.Op != OpConst8 {
34955 break
34956 }
34957 d := auxIntToInt8(v_1.AuxInt)
34958 v.reset(OpConst8)
34959 v.AuxInt = int8ToAuxInt(c - d)
34960 return true
34961 }
34962
34963
34964
34965 for {
34966 x := v_0
34967 if v_1.Op != OpConst8 {
34968 break
34969 }
34970 t := v_1.Type
34971 c := auxIntToInt8(v_1.AuxInt)
34972 if !(x.Op != OpConst8) {
34973 break
34974 }
34975 v.reset(OpAdd8)
34976 v0 := b.NewValue0(v.Pos, OpConst8, t)
34977 v0.AuxInt = int8ToAuxInt(-c)
34978 v.AddArg2(v0, x)
34979 return true
34980 }
34981
34982
34983 for {
34984 t := v.Type
34985 if v_0.Op != OpMul8 {
34986 break
34987 }
34988 _ = v_0.Args[1]
34989 v_0_0 := v_0.Args[0]
34990 v_0_1 := v_0.Args[1]
34991 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34992 x := v_0_0
34993 y := v_0_1
34994 if v_1.Op != OpMul8 {
34995 continue
34996 }
34997 _ = v_1.Args[1]
34998 v_1_0 := v_1.Args[0]
34999 v_1_1 := v_1.Args[1]
35000 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35001 if x != v_1_0 {
35002 continue
35003 }
35004 z := v_1_1
35005 v.reset(OpMul8)
35006 v0 := b.NewValue0(v.Pos, OpSub8, t)
35007 v0.AddArg2(y, z)
35008 v.AddArg2(x, v0)
35009 return true
35010 }
35011 }
35012 break
35013 }
35014
35015
35016 for {
35017 x := v_0
35018 if x != v_1 {
35019 break
35020 }
35021 v.reset(OpConst8)
35022 v.AuxInt = int8ToAuxInt(0)
35023 return true
35024 }
35025
35026
35027 for {
35028 if v_0.Op != OpNeg8 {
35029 break
35030 }
35031 x := v_0.Args[0]
35032 if v_1.Op != OpCom8 || x != v_1.Args[0] {
35033 break
35034 }
35035 v.reset(OpConst8)
35036 v.AuxInt = int8ToAuxInt(1)
35037 return true
35038 }
35039
35040
35041 for {
35042 if v_0.Op != OpCom8 {
35043 break
35044 }
35045 x := v_0.Args[0]
35046 if v_1.Op != OpNeg8 || x != v_1.Args[0] {
35047 break
35048 }
35049 v.reset(OpConst8)
35050 v.AuxInt = int8ToAuxInt(-1)
35051 return true
35052 }
35053
35054
35055 for {
35056 if v_0.Op != OpAdd8 {
35057 break
35058 }
35059 _ = v_0.Args[1]
35060 v_0_0 := v_0.Args[0]
35061 v_0_1 := v_0.Args[1]
35062 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35063 t := v_0_0
35064 x := v_0_1
35065 if v_1.Op != OpAdd8 {
35066 continue
35067 }
35068 _ = v_1.Args[1]
35069 v_1_0 := v_1.Args[0]
35070 v_1_1 := v_1.Args[1]
35071 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35072 if t != v_1_0 {
35073 continue
35074 }
35075 y := v_1_1
35076 v.reset(OpSub8)
35077 v.AddArg2(x, y)
35078 return true
35079 }
35080 }
35081 break
35082 }
35083
35084
35085 for {
35086 if v_0.Op != OpAdd8 {
35087 break
35088 }
35089 _ = v_0.Args[1]
35090 v_0_0 := v_0.Args[0]
35091 v_0_1 := v_0.Args[1]
35092 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35093 x := v_0_0
35094 y := v_0_1
35095 if x != v_1 {
35096 continue
35097 }
35098 v.copyOf(y)
35099 return true
35100 }
35101 break
35102 }
35103
35104
35105 for {
35106 if v_0.Op != OpAdd8 {
35107 break
35108 }
35109 _ = v_0.Args[1]
35110 v_0_0 := v_0.Args[0]
35111 v_0_1 := v_0.Args[1]
35112 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35113 x := v_0_0
35114 y := v_0_1
35115 if y != v_1 {
35116 continue
35117 }
35118 v.copyOf(x)
35119 return true
35120 }
35121 break
35122 }
35123
35124
35125 for {
35126 if v_0.Op != OpSub8 {
35127 break
35128 }
35129 y := v_0.Args[1]
35130 x := v_0.Args[0]
35131 if x != v_1 {
35132 break
35133 }
35134 v.reset(OpNeg8)
35135 v.AddArg(y)
35136 return true
35137 }
35138
35139
35140 for {
35141 x := v_0
35142 if v_1.Op != OpAdd8 {
35143 break
35144 }
35145 _ = v_1.Args[1]
35146 v_1_0 := v_1.Args[0]
35147 v_1_1 := v_1.Args[1]
35148 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
35149 if x != v_1_0 {
35150 continue
35151 }
35152 y := v_1_1
35153 v.reset(OpNeg8)
35154 v.AddArg(y)
35155 return true
35156 }
35157 break
35158 }
35159
35160
35161
35162 for {
35163 x := v_0
35164 if v_1.Op != OpSub8 {
35165 break
35166 }
35167 z := v_1.Args[1]
35168 i := v_1.Args[0]
35169 if i.Op != OpConst8 {
35170 break
35171 }
35172 t := i.Type
35173 if !(z.Op != OpConst8 && x.Op != OpConst8) {
35174 break
35175 }
35176 v.reset(OpSub8)
35177 v0 := b.NewValue0(v.Pos, OpAdd8, t)
35178 v0.AddArg2(x, z)
35179 v.AddArg2(v0, i)
35180 return true
35181 }
35182
35183
35184
35185 for {
35186 x := v_0
35187 if v_1.Op != OpAdd8 {
35188 break
35189 }
35190 _ = v_1.Args[1]
35191 v_1_0 := v_1.Args[0]
35192 v_1_1 := v_1.Args[1]
35193 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
35194 z := v_1_0
35195 i := v_1_1
35196 if i.Op != OpConst8 {
35197 continue
35198 }
35199 t := i.Type
35200 if !(z.Op != OpConst8 && x.Op != OpConst8) {
35201 continue
35202 }
35203 v.reset(OpSub8)
35204 v0 := b.NewValue0(v.Pos, OpSub8, t)
35205 v0.AddArg2(x, z)
35206 v.AddArg2(v0, i)
35207 return true
35208 }
35209 break
35210 }
35211
35212
35213
35214 for {
35215 if v_0.Op != OpSub8 {
35216 break
35217 }
35218 z := v_0.Args[1]
35219 i := v_0.Args[0]
35220 if i.Op != OpConst8 {
35221 break
35222 }
35223 t := i.Type
35224 x := v_1
35225 if !(z.Op != OpConst8 && x.Op != OpConst8) {
35226 break
35227 }
35228 v.reset(OpSub8)
35229 v0 := b.NewValue0(v.Pos, OpAdd8, t)
35230 v0.AddArg2(z, x)
35231 v.AddArg2(i, v0)
35232 return true
35233 }
35234
35235
35236
35237 for {
35238 if v_0.Op != OpAdd8 {
35239 break
35240 }
35241 _ = v_0.Args[1]
35242 v_0_0 := v_0.Args[0]
35243 v_0_1 := v_0.Args[1]
35244 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35245 z := v_0_0
35246 i := v_0_1
35247 if i.Op != OpConst8 {
35248 continue
35249 }
35250 t := i.Type
35251 x := v_1
35252 if !(z.Op != OpConst8 && x.Op != OpConst8) {
35253 continue
35254 }
35255 v.reset(OpAdd8)
35256 v0 := b.NewValue0(v.Pos, OpSub8, t)
35257 v0.AddArg2(z, x)
35258 v.AddArg2(i, v0)
35259 return true
35260 }
35261 break
35262 }
35263
35264
35265 for {
35266 if v_0.Op != OpConst8 {
35267 break
35268 }
35269 t := v_0.Type
35270 c := auxIntToInt8(v_0.AuxInt)
35271 if v_1.Op != OpSub8 {
35272 break
35273 }
35274 x := v_1.Args[1]
35275 v_1_0 := v_1.Args[0]
35276 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
35277 break
35278 }
35279 d := auxIntToInt8(v_1_0.AuxInt)
35280 v.reset(OpAdd8)
35281 v0 := b.NewValue0(v.Pos, OpConst8, t)
35282 v0.AuxInt = int8ToAuxInt(c - d)
35283 v.AddArg2(v0, x)
35284 return true
35285 }
35286
35287
35288 for {
35289 if v_0.Op != OpConst8 {
35290 break
35291 }
35292 t := v_0.Type
35293 c := auxIntToInt8(v_0.AuxInt)
35294 if v_1.Op != OpAdd8 {
35295 break
35296 }
35297 _ = v_1.Args[1]
35298 v_1_0 := v_1.Args[0]
35299 v_1_1 := v_1.Args[1]
35300 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
35301 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
35302 continue
35303 }
35304 d := auxIntToInt8(v_1_0.AuxInt)
35305 x := v_1_1
35306 v.reset(OpSub8)
35307 v0 := b.NewValue0(v.Pos, OpConst8, t)
35308 v0.AuxInt = int8ToAuxInt(c - d)
35309 v.AddArg2(v0, x)
35310 return true
35311 }
35312 break
35313 }
35314 return false
35315 }
35316 func rewriteValuegeneric_OpTrunc(v *Value) bool {
35317 v_0 := v.Args[0]
35318
35319
35320 for {
35321 if v_0.Op != OpConst64F {
35322 break
35323 }
35324 c := auxIntToFloat64(v_0.AuxInt)
35325 v.reset(OpConst64F)
35326 v.AuxInt = float64ToAuxInt(math.Trunc(c))
35327 return true
35328 }
35329 return false
35330 }
35331 func rewriteValuegeneric_OpTrunc16to8(v *Value) bool {
35332 v_0 := v.Args[0]
35333
35334
35335 for {
35336 if v_0.Op != OpConst16 {
35337 break
35338 }
35339 c := auxIntToInt16(v_0.AuxInt)
35340 v.reset(OpConst8)
35341 v.AuxInt = int8ToAuxInt(int8(c))
35342 return true
35343 }
35344
35345
35346 for {
35347 if v_0.Op != OpZeroExt8to16 {
35348 break
35349 }
35350 x := v_0.Args[0]
35351 v.copyOf(x)
35352 return true
35353 }
35354
35355
35356 for {
35357 if v_0.Op != OpSignExt8to16 {
35358 break
35359 }
35360 x := v_0.Args[0]
35361 v.copyOf(x)
35362 return true
35363 }
35364
35365
35366
35367 for {
35368 if v_0.Op != OpAnd16 {
35369 break
35370 }
35371 _ = v_0.Args[1]
35372 v_0_0 := v_0.Args[0]
35373 v_0_1 := v_0.Args[1]
35374 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35375 if v_0_0.Op != OpConst16 {
35376 continue
35377 }
35378 y := auxIntToInt16(v_0_0.AuxInt)
35379 x := v_0_1
35380 if !(y&0xFF == 0xFF) {
35381 continue
35382 }
35383 v.reset(OpTrunc16to8)
35384 v.AddArg(x)
35385 return true
35386 }
35387 break
35388 }
35389 return false
35390 }
35391 func rewriteValuegeneric_OpTrunc32to16(v *Value) bool {
35392 v_0 := v.Args[0]
35393
35394
35395 for {
35396 if v_0.Op != OpConst32 {
35397 break
35398 }
35399 c := auxIntToInt32(v_0.AuxInt)
35400 v.reset(OpConst16)
35401 v.AuxInt = int16ToAuxInt(int16(c))
35402 return true
35403 }
35404
35405
35406 for {
35407 if v_0.Op != OpZeroExt8to32 {
35408 break
35409 }
35410 x := v_0.Args[0]
35411 v.reset(OpZeroExt8to16)
35412 v.AddArg(x)
35413 return true
35414 }
35415
35416
35417 for {
35418 if v_0.Op != OpZeroExt16to32 {
35419 break
35420 }
35421 x := v_0.Args[0]
35422 v.copyOf(x)
35423 return true
35424 }
35425
35426
35427 for {
35428 if v_0.Op != OpSignExt8to32 {
35429 break
35430 }
35431 x := v_0.Args[0]
35432 v.reset(OpSignExt8to16)
35433 v.AddArg(x)
35434 return true
35435 }
35436
35437
35438 for {
35439 if v_0.Op != OpSignExt16to32 {
35440 break
35441 }
35442 x := v_0.Args[0]
35443 v.copyOf(x)
35444 return true
35445 }
35446
35447
35448
35449 for {
35450 if v_0.Op != OpAnd32 {
35451 break
35452 }
35453 _ = v_0.Args[1]
35454 v_0_0 := v_0.Args[0]
35455 v_0_1 := v_0.Args[1]
35456 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35457 if v_0_0.Op != OpConst32 {
35458 continue
35459 }
35460 y := auxIntToInt32(v_0_0.AuxInt)
35461 x := v_0_1
35462 if !(y&0xFFFF == 0xFFFF) {
35463 continue
35464 }
35465 v.reset(OpTrunc32to16)
35466 v.AddArg(x)
35467 return true
35468 }
35469 break
35470 }
35471 return false
35472 }
35473 func rewriteValuegeneric_OpTrunc32to8(v *Value) bool {
35474 v_0 := v.Args[0]
35475
35476
35477 for {
35478 if v_0.Op != OpConst32 {
35479 break
35480 }
35481 c := auxIntToInt32(v_0.AuxInt)
35482 v.reset(OpConst8)
35483 v.AuxInt = int8ToAuxInt(int8(c))
35484 return true
35485 }
35486
35487
35488 for {
35489 if v_0.Op != OpZeroExt8to32 {
35490 break
35491 }
35492 x := v_0.Args[0]
35493 v.copyOf(x)
35494 return true
35495 }
35496
35497
35498 for {
35499 if v_0.Op != OpSignExt8to32 {
35500 break
35501 }
35502 x := v_0.Args[0]
35503 v.copyOf(x)
35504 return true
35505 }
35506
35507
35508
35509 for {
35510 if v_0.Op != OpAnd32 {
35511 break
35512 }
35513 _ = v_0.Args[1]
35514 v_0_0 := v_0.Args[0]
35515 v_0_1 := v_0.Args[1]
35516 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35517 if v_0_0.Op != OpConst32 {
35518 continue
35519 }
35520 y := auxIntToInt32(v_0_0.AuxInt)
35521 x := v_0_1
35522 if !(y&0xFF == 0xFF) {
35523 continue
35524 }
35525 v.reset(OpTrunc32to8)
35526 v.AddArg(x)
35527 return true
35528 }
35529 break
35530 }
35531 return false
35532 }
35533 func rewriteValuegeneric_OpTrunc64to16(v *Value) bool {
35534 v_0 := v.Args[0]
35535
35536
35537 for {
35538 if v_0.Op != OpConst64 {
35539 break
35540 }
35541 c := auxIntToInt64(v_0.AuxInt)
35542 v.reset(OpConst16)
35543 v.AuxInt = int16ToAuxInt(int16(c))
35544 return true
35545 }
35546
35547
35548 for {
35549 if v_0.Op != OpZeroExt8to64 {
35550 break
35551 }
35552 x := v_0.Args[0]
35553 v.reset(OpZeroExt8to16)
35554 v.AddArg(x)
35555 return true
35556 }
35557
35558
35559 for {
35560 if v_0.Op != OpZeroExt16to64 {
35561 break
35562 }
35563 x := v_0.Args[0]
35564 v.copyOf(x)
35565 return true
35566 }
35567
35568
35569 for {
35570 if v_0.Op != OpSignExt8to64 {
35571 break
35572 }
35573 x := v_0.Args[0]
35574 v.reset(OpSignExt8to16)
35575 v.AddArg(x)
35576 return true
35577 }
35578
35579
35580 for {
35581 if v_0.Op != OpSignExt16to64 {
35582 break
35583 }
35584 x := v_0.Args[0]
35585 v.copyOf(x)
35586 return true
35587 }
35588
35589
35590
35591 for {
35592 if v_0.Op != OpAnd64 {
35593 break
35594 }
35595 _ = v_0.Args[1]
35596 v_0_0 := v_0.Args[0]
35597 v_0_1 := v_0.Args[1]
35598 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35599 if v_0_0.Op != OpConst64 {
35600 continue
35601 }
35602 y := auxIntToInt64(v_0_0.AuxInt)
35603 x := v_0_1
35604 if !(y&0xFFFF == 0xFFFF) {
35605 continue
35606 }
35607 v.reset(OpTrunc64to16)
35608 v.AddArg(x)
35609 return true
35610 }
35611 break
35612 }
35613 return false
35614 }
35615 func rewriteValuegeneric_OpTrunc64to32(v *Value) bool {
35616 v_0 := v.Args[0]
35617
35618
35619 for {
35620 if v_0.Op != OpConst64 {
35621 break
35622 }
35623 c := auxIntToInt64(v_0.AuxInt)
35624 v.reset(OpConst32)
35625 v.AuxInt = int32ToAuxInt(int32(c))
35626 return true
35627 }
35628
35629
35630 for {
35631 if v_0.Op != OpZeroExt8to64 {
35632 break
35633 }
35634 x := v_0.Args[0]
35635 v.reset(OpZeroExt8to32)
35636 v.AddArg(x)
35637 return true
35638 }
35639
35640
35641 for {
35642 if v_0.Op != OpZeroExt16to64 {
35643 break
35644 }
35645 x := v_0.Args[0]
35646 v.reset(OpZeroExt16to32)
35647 v.AddArg(x)
35648 return true
35649 }
35650
35651
35652 for {
35653 if v_0.Op != OpZeroExt32to64 {
35654 break
35655 }
35656 x := v_0.Args[0]
35657 v.copyOf(x)
35658 return true
35659 }
35660
35661
35662 for {
35663 if v_0.Op != OpSignExt8to64 {
35664 break
35665 }
35666 x := v_0.Args[0]
35667 v.reset(OpSignExt8to32)
35668 v.AddArg(x)
35669 return true
35670 }
35671
35672
35673 for {
35674 if v_0.Op != OpSignExt16to64 {
35675 break
35676 }
35677 x := v_0.Args[0]
35678 v.reset(OpSignExt16to32)
35679 v.AddArg(x)
35680 return true
35681 }
35682
35683
35684 for {
35685 if v_0.Op != OpSignExt32to64 {
35686 break
35687 }
35688 x := v_0.Args[0]
35689 v.copyOf(x)
35690 return true
35691 }
35692
35693
35694
35695 for {
35696 if v_0.Op != OpAnd64 {
35697 break
35698 }
35699 _ = v_0.Args[1]
35700 v_0_0 := v_0.Args[0]
35701 v_0_1 := v_0.Args[1]
35702 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35703 if v_0_0.Op != OpConst64 {
35704 continue
35705 }
35706 y := auxIntToInt64(v_0_0.AuxInt)
35707 x := v_0_1
35708 if !(y&0xFFFFFFFF == 0xFFFFFFFF) {
35709 continue
35710 }
35711 v.reset(OpTrunc64to32)
35712 v.AddArg(x)
35713 return true
35714 }
35715 break
35716 }
35717 return false
35718 }
35719 func rewriteValuegeneric_OpTrunc64to8(v *Value) bool {
35720 v_0 := v.Args[0]
35721
35722
35723 for {
35724 if v_0.Op != OpConst64 {
35725 break
35726 }
35727 c := auxIntToInt64(v_0.AuxInt)
35728 v.reset(OpConst8)
35729 v.AuxInt = int8ToAuxInt(int8(c))
35730 return true
35731 }
35732
35733
35734 for {
35735 if v_0.Op != OpZeroExt8to64 {
35736 break
35737 }
35738 x := v_0.Args[0]
35739 v.copyOf(x)
35740 return true
35741 }
35742
35743
35744 for {
35745 if v_0.Op != OpSignExt8to64 {
35746 break
35747 }
35748 x := v_0.Args[0]
35749 v.copyOf(x)
35750 return true
35751 }
35752
35753
35754
35755 for {
35756 if v_0.Op != OpAnd64 {
35757 break
35758 }
35759 _ = v_0.Args[1]
35760 v_0_0 := v_0.Args[0]
35761 v_0_1 := v_0.Args[1]
35762 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35763 if v_0_0.Op != OpConst64 {
35764 continue
35765 }
35766 y := auxIntToInt64(v_0_0.AuxInt)
35767 x := v_0_1
35768 if !(y&0xFF == 0xFF) {
35769 continue
35770 }
35771 v.reset(OpTrunc64to8)
35772 v.AddArg(x)
35773 return true
35774 }
35775 break
35776 }
35777 return false
35778 }
35779 func rewriteValuegeneric_OpXor16(v *Value) bool {
35780 v_1 := v.Args[1]
35781 v_0 := v.Args[0]
35782 b := v.Block
35783 config := b.Func.Config
35784
35785
35786 for {
35787 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35788 if v_0.Op != OpConst16 {
35789 continue
35790 }
35791 c := auxIntToInt16(v_0.AuxInt)
35792 if v_1.Op != OpConst16 {
35793 continue
35794 }
35795 d := auxIntToInt16(v_1.AuxInt)
35796 v.reset(OpConst16)
35797 v.AuxInt = int16ToAuxInt(c ^ d)
35798 return true
35799 }
35800 break
35801 }
35802
35803
35804 for {
35805 x := v_0
35806 if x != v_1 {
35807 break
35808 }
35809 v.reset(OpConst16)
35810 v.AuxInt = int16ToAuxInt(0)
35811 return true
35812 }
35813
35814
35815 for {
35816 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35817 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
35818 continue
35819 }
35820 x := v_1
35821 v.copyOf(x)
35822 return true
35823 }
35824 break
35825 }
35826
35827
35828 for {
35829 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35830 if v_0.Op != OpCom16 {
35831 continue
35832 }
35833 x := v_0.Args[0]
35834 if x != v_1 {
35835 continue
35836 }
35837 v.reset(OpConst16)
35838 v.AuxInt = int16ToAuxInt(-1)
35839 return true
35840 }
35841 break
35842 }
35843
35844
35845 for {
35846 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35847 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
35848 continue
35849 }
35850 x := v_1
35851 v.reset(OpCom16)
35852 v.AddArg(x)
35853 return true
35854 }
35855 break
35856 }
35857
35858
35859 for {
35860 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35861 x := v_0
35862 if v_1.Op != OpXor16 {
35863 continue
35864 }
35865 _ = v_1.Args[1]
35866 v_1_0 := v_1.Args[0]
35867 v_1_1 := v_1.Args[1]
35868 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35869 if x != v_1_0 {
35870 continue
35871 }
35872 y := v_1_1
35873 v.copyOf(y)
35874 return true
35875 }
35876 }
35877 break
35878 }
35879
35880
35881
35882 for {
35883 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35884 if v_0.Op != OpXor16 {
35885 continue
35886 }
35887 _ = v_0.Args[1]
35888 v_0_0 := v_0.Args[0]
35889 v_0_1 := v_0.Args[1]
35890 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
35891 i := v_0_0
35892 if i.Op != OpConst16 {
35893 continue
35894 }
35895 t := i.Type
35896 z := v_0_1
35897 x := v_1
35898 if !(z.Op != OpConst16 && x.Op != OpConst16) {
35899 continue
35900 }
35901 v.reset(OpXor16)
35902 v0 := b.NewValue0(v.Pos, OpXor16, t)
35903 v0.AddArg2(z, x)
35904 v.AddArg2(i, v0)
35905 return true
35906 }
35907 }
35908 break
35909 }
35910
35911
35912 for {
35913 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35914 if v_0.Op != OpConst16 {
35915 continue
35916 }
35917 t := v_0.Type
35918 c := auxIntToInt16(v_0.AuxInt)
35919 if v_1.Op != OpXor16 {
35920 continue
35921 }
35922 _ = v_1.Args[1]
35923 v_1_0 := v_1.Args[0]
35924 v_1_1 := v_1.Args[1]
35925 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35926 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
35927 continue
35928 }
35929 d := auxIntToInt16(v_1_0.AuxInt)
35930 x := v_1_1
35931 v.reset(OpXor16)
35932 v0 := b.NewValue0(v.Pos, OpConst16, t)
35933 v0.AuxInt = int16ToAuxInt(c ^ d)
35934 v.AddArg2(v0, x)
35935 return true
35936 }
35937 }
35938 break
35939 }
35940
35941
35942
35943 for {
35944 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35945 if v_0.Op != OpLsh16x64 {
35946 continue
35947 }
35948 _ = v_0.Args[1]
35949 x := v_0.Args[0]
35950 z := v_0.Args[1]
35951 if z.Op != OpConst64 {
35952 continue
35953 }
35954 c := auxIntToInt64(z.AuxInt)
35955 if v_1.Op != OpRsh16Ux64 {
35956 continue
35957 }
35958 _ = v_1.Args[1]
35959 if x != v_1.Args[0] {
35960 continue
35961 }
35962 v_1_1 := v_1.Args[1]
35963 if v_1_1.Op != OpConst64 {
35964 continue
35965 }
35966 d := auxIntToInt64(v_1_1.AuxInt)
35967 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
35968 continue
35969 }
35970 v.reset(OpRotateLeft16)
35971 v.AddArg2(x, z)
35972 return true
35973 }
35974 break
35975 }
35976
35977
35978
35979 for {
35980 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35981 left := v_0
35982 if left.Op != OpLsh16x64 {
35983 continue
35984 }
35985 y := left.Args[1]
35986 x := left.Args[0]
35987 right := v_1
35988 if right.Op != OpRsh16Ux64 {
35989 continue
35990 }
35991 _ = right.Args[1]
35992 if x != right.Args[0] {
35993 continue
35994 }
35995 right_1 := right.Args[1]
35996 if right_1.Op != OpSub64 {
35997 continue
35998 }
35999 _ = right_1.Args[1]
36000 right_1_0 := right_1.Args[0]
36001 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
36002 continue
36003 }
36004 v.reset(OpRotateLeft16)
36005 v.AddArg2(x, y)
36006 return true
36007 }
36008 break
36009 }
36010
36011
36012
36013 for {
36014 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36015 left := v_0
36016 if left.Op != OpLsh16x32 {
36017 continue
36018 }
36019 y := left.Args[1]
36020 x := left.Args[0]
36021 right := v_1
36022 if right.Op != OpRsh16Ux32 {
36023 continue
36024 }
36025 _ = right.Args[1]
36026 if x != right.Args[0] {
36027 continue
36028 }
36029 right_1 := right.Args[1]
36030 if right_1.Op != OpSub32 {
36031 continue
36032 }
36033 _ = right_1.Args[1]
36034 right_1_0 := right_1.Args[0]
36035 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
36036 continue
36037 }
36038 v.reset(OpRotateLeft16)
36039 v.AddArg2(x, y)
36040 return true
36041 }
36042 break
36043 }
36044
36045
36046
36047 for {
36048 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36049 left := v_0
36050 if left.Op != OpLsh16x16 {
36051 continue
36052 }
36053 y := left.Args[1]
36054 x := left.Args[0]
36055 right := v_1
36056 if right.Op != OpRsh16Ux16 {
36057 continue
36058 }
36059 _ = right.Args[1]
36060 if x != right.Args[0] {
36061 continue
36062 }
36063 right_1 := right.Args[1]
36064 if right_1.Op != OpSub16 {
36065 continue
36066 }
36067 _ = right_1.Args[1]
36068 right_1_0 := right_1.Args[0]
36069 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
36070 continue
36071 }
36072 v.reset(OpRotateLeft16)
36073 v.AddArg2(x, y)
36074 return true
36075 }
36076 break
36077 }
36078
36079
36080
36081 for {
36082 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36083 left := v_0
36084 if left.Op != OpLsh16x8 {
36085 continue
36086 }
36087 y := left.Args[1]
36088 x := left.Args[0]
36089 right := v_1
36090 if right.Op != OpRsh16Ux8 {
36091 continue
36092 }
36093 _ = right.Args[1]
36094 if x != right.Args[0] {
36095 continue
36096 }
36097 right_1 := right.Args[1]
36098 if right_1.Op != OpSub8 {
36099 continue
36100 }
36101 _ = right_1.Args[1]
36102 right_1_0 := right_1.Args[0]
36103 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
36104 continue
36105 }
36106 v.reset(OpRotateLeft16)
36107 v.AddArg2(x, y)
36108 return true
36109 }
36110 break
36111 }
36112
36113
36114
36115 for {
36116 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36117 right := v_0
36118 if right.Op != OpRsh16Ux64 {
36119 continue
36120 }
36121 y := right.Args[1]
36122 x := right.Args[0]
36123 left := v_1
36124 if left.Op != OpLsh16x64 {
36125 continue
36126 }
36127 _ = left.Args[1]
36128 if x != left.Args[0] {
36129 continue
36130 }
36131 z := left.Args[1]
36132 if z.Op != OpSub64 {
36133 continue
36134 }
36135 _ = z.Args[1]
36136 z_0 := z.Args[0]
36137 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
36138 continue
36139 }
36140 v.reset(OpRotateLeft16)
36141 v.AddArg2(x, z)
36142 return true
36143 }
36144 break
36145 }
36146
36147
36148
36149 for {
36150 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36151 right := v_0
36152 if right.Op != OpRsh16Ux32 {
36153 continue
36154 }
36155 y := right.Args[1]
36156 x := right.Args[0]
36157 left := v_1
36158 if left.Op != OpLsh16x32 {
36159 continue
36160 }
36161 _ = left.Args[1]
36162 if x != left.Args[0] {
36163 continue
36164 }
36165 z := left.Args[1]
36166 if z.Op != OpSub32 {
36167 continue
36168 }
36169 _ = z.Args[1]
36170 z_0 := z.Args[0]
36171 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
36172 continue
36173 }
36174 v.reset(OpRotateLeft16)
36175 v.AddArg2(x, z)
36176 return true
36177 }
36178 break
36179 }
36180
36181
36182
36183 for {
36184 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36185 right := v_0
36186 if right.Op != OpRsh16Ux16 {
36187 continue
36188 }
36189 y := right.Args[1]
36190 x := right.Args[0]
36191 left := v_1
36192 if left.Op != OpLsh16x16 {
36193 continue
36194 }
36195 _ = left.Args[1]
36196 if x != left.Args[0] {
36197 continue
36198 }
36199 z := left.Args[1]
36200 if z.Op != OpSub16 {
36201 continue
36202 }
36203 _ = z.Args[1]
36204 z_0 := z.Args[0]
36205 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
36206 continue
36207 }
36208 v.reset(OpRotateLeft16)
36209 v.AddArg2(x, z)
36210 return true
36211 }
36212 break
36213 }
36214
36215
36216
36217 for {
36218 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36219 right := v_0
36220 if right.Op != OpRsh16Ux8 {
36221 continue
36222 }
36223 y := right.Args[1]
36224 x := right.Args[0]
36225 left := v_1
36226 if left.Op != OpLsh16x8 {
36227 continue
36228 }
36229 _ = left.Args[1]
36230 if x != left.Args[0] {
36231 continue
36232 }
36233 z := left.Args[1]
36234 if z.Op != OpSub8 {
36235 continue
36236 }
36237 _ = z.Args[1]
36238 z_0 := z.Args[0]
36239 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
36240 continue
36241 }
36242 v.reset(OpRotateLeft16)
36243 v.AddArg2(x, z)
36244 return true
36245 }
36246 break
36247 }
36248 return false
36249 }
36250 func rewriteValuegeneric_OpXor32(v *Value) bool {
36251 v_1 := v.Args[1]
36252 v_0 := v.Args[0]
36253 b := v.Block
36254 config := b.Func.Config
36255
36256
36257 for {
36258 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36259 if v_0.Op != OpConst32 {
36260 continue
36261 }
36262 c := auxIntToInt32(v_0.AuxInt)
36263 if v_1.Op != OpConst32 {
36264 continue
36265 }
36266 d := auxIntToInt32(v_1.AuxInt)
36267 v.reset(OpConst32)
36268 v.AuxInt = int32ToAuxInt(c ^ d)
36269 return true
36270 }
36271 break
36272 }
36273
36274
36275 for {
36276 x := v_0
36277 if x != v_1 {
36278 break
36279 }
36280 v.reset(OpConst32)
36281 v.AuxInt = int32ToAuxInt(0)
36282 return true
36283 }
36284
36285
36286 for {
36287 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36288 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
36289 continue
36290 }
36291 x := v_1
36292 v.copyOf(x)
36293 return true
36294 }
36295 break
36296 }
36297
36298
36299 for {
36300 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36301 if v_0.Op != OpCom32 {
36302 continue
36303 }
36304 x := v_0.Args[0]
36305 if x != v_1 {
36306 continue
36307 }
36308 v.reset(OpConst32)
36309 v.AuxInt = int32ToAuxInt(-1)
36310 return true
36311 }
36312 break
36313 }
36314
36315
36316 for {
36317 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36318 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
36319 continue
36320 }
36321 x := v_1
36322 v.reset(OpCom32)
36323 v.AddArg(x)
36324 return true
36325 }
36326 break
36327 }
36328
36329
36330 for {
36331 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36332 x := v_0
36333 if v_1.Op != OpXor32 {
36334 continue
36335 }
36336 _ = v_1.Args[1]
36337 v_1_0 := v_1.Args[0]
36338 v_1_1 := v_1.Args[1]
36339 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36340 if x != v_1_0 {
36341 continue
36342 }
36343 y := v_1_1
36344 v.copyOf(y)
36345 return true
36346 }
36347 }
36348 break
36349 }
36350
36351
36352
36353 for {
36354 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36355 if v_0.Op != OpXor32 {
36356 continue
36357 }
36358 _ = v_0.Args[1]
36359 v_0_0 := v_0.Args[0]
36360 v_0_1 := v_0.Args[1]
36361 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
36362 i := v_0_0
36363 if i.Op != OpConst32 {
36364 continue
36365 }
36366 t := i.Type
36367 z := v_0_1
36368 x := v_1
36369 if !(z.Op != OpConst32 && x.Op != OpConst32) {
36370 continue
36371 }
36372 v.reset(OpXor32)
36373 v0 := b.NewValue0(v.Pos, OpXor32, t)
36374 v0.AddArg2(z, x)
36375 v.AddArg2(i, v0)
36376 return true
36377 }
36378 }
36379 break
36380 }
36381
36382
36383 for {
36384 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36385 if v_0.Op != OpConst32 {
36386 continue
36387 }
36388 t := v_0.Type
36389 c := auxIntToInt32(v_0.AuxInt)
36390 if v_1.Op != OpXor32 {
36391 continue
36392 }
36393 _ = v_1.Args[1]
36394 v_1_0 := v_1.Args[0]
36395 v_1_1 := v_1.Args[1]
36396 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36397 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
36398 continue
36399 }
36400 d := auxIntToInt32(v_1_0.AuxInt)
36401 x := v_1_1
36402 v.reset(OpXor32)
36403 v0 := b.NewValue0(v.Pos, OpConst32, t)
36404 v0.AuxInt = int32ToAuxInt(c ^ d)
36405 v.AddArg2(v0, x)
36406 return true
36407 }
36408 }
36409 break
36410 }
36411
36412
36413
36414 for {
36415 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36416 if v_0.Op != OpLsh32x64 {
36417 continue
36418 }
36419 _ = v_0.Args[1]
36420 x := v_0.Args[0]
36421 z := v_0.Args[1]
36422 if z.Op != OpConst64 {
36423 continue
36424 }
36425 c := auxIntToInt64(z.AuxInt)
36426 if v_1.Op != OpRsh32Ux64 {
36427 continue
36428 }
36429 _ = v_1.Args[1]
36430 if x != v_1.Args[0] {
36431 continue
36432 }
36433 v_1_1 := v_1.Args[1]
36434 if v_1_1.Op != OpConst64 {
36435 continue
36436 }
36437 d := auxIntToInt64(v_1_1.AuxInt)
36438 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
36439 continue
36440 }
36441 v.reset(OpRotateLeft32)
36442 v.AddArg2(x, z)
36443 return true
36444 }
36445 break
36446 }
36447
36448
36449
36450 for {
36451 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36452 left := v_0
36453 if left.Op != OpLsh32x64 {
36454 continue
36455 }
36456 y := left.Args[1]
36457 x := left.Args[0]
36458 right := v_1
36459 if right.Op != OpRsh32Ux64 {
36460 continue
36461 }
36462 _ = right.Args[1]
36463 if x != right.Args[0] {
36464 continue
36465 }
36466 right_1 := right.Args[1]
36467 if right_1.Op != OpSub64 {
36468 continue
36469 }
36470 _ = right_1.Args[1]
36471 right_1_0 := right_1.Args[0]
36472 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
36473 continue
36474 }
36475 v.reset(OpRotateLeft32)
36476 v.AddArg2(x, y)
36477 return true
36478 }
36479 break
36480 }
36481
36482
36483
36484 for {
36485 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36486 left := v_0
36487 if left.Op != OpLsh32x32 {
36488 continue
36489 }
36490 y := left.Args[1]
36491 x := left.Args[0]
36492 right := v_1
36493 if right.Op != OpRsh32Ux32 {
36494 continue
36495 }
36496 _ = right.Args[1]
36497 if x != right.Args[0] {
36498 continue
36499 }
36500 right_1 := right.Args[1]
36501 if right_1.Op != OpSub32 {
36502 continue
36503 }
36504 _ = right_1.Args[1]
36505 right_1_0 := right_1.Args[0]
36506 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
36507 continue
36508 }
36509 v.reset(OpRotateLeft32)
36510 v.AddArg2(x, y)
36511 return true
36512 }
36513 break
36514 }
36515
36516
36517
36518 for {
36519 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36520 left := v_0
36521 if left.Op != OpLsh32x16 {
36522 continue
36523 }
36524 y := left.Args[1]
36525 x := left.Args[0]
36526 right := v_1
36527 if right.Op != OpRsh32Ux16 {
36528 continue
36529 }
36530 _ = right.Args[1]
36531 if x != right.Args[0] {
36532 continue
36533 }
36534 right_1 := right.Args[1]
36535 if right_1.Op != OpSub16 {
36536 continue
36537 }
36538 _ = right_1.Args[1]
36539 right_1_0 := right_1.Args[0]
36540 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
36541 continue
36542 }
36543 v.reset(OpRotateLeft32)
36544 v.AddArg2(x, y)
36545 return true
36546 }
36547 break
36548 }
36549
36550
36551
36552 for {
36553 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36554 left := v_0
36555 if left.Op != OpLsh32x8 {
36556 continue
36557 }
36558 y := left.Args[1]
36559 x := left.Args[0]
36560 right := v_1
36561 if right.Op != OpRsh32Ux8 {
36562 continue
36563 }
36564 _ = right.Args[1]
36565 if x != right.Args[0] {
36566 continue
36567 }
36568 right_1 := right.Args[1]
36569 if right_1.Op != OpSub8 {
36570 continue
36571 }
36572 _ = right_1.Args[1]
36573 right_1_0 := right_1.Args[0]
36574 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
36575 continue
36576 }
36577 v.reset(OpRotateLeft32)
36578 v.AddArg2(x, y)
36579 return true
36580 }
36581 break
36582 }
36583
36584
36585
36586 for {
36587 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36588 right := v_0
36589 if right.Op != OpRsh32Ux64 {
36590 continue
36591 }
36592 y := right.Args[1]
36593 x := right.Args[0]
36594 left := v_1
36595 if left.Op != OpLsh32x64 {
36596 continue
36597 }
36598 _ = left.Args[1]
36599 if x != left.Args[0] {
36600 continue
36601 }
36602 z := left.Args[1]
36603 if z.Op != OpSub64 {
36604 continue
36605 }
36606 _ = z.Args[1]
36607 z_0 := z.Args[0]
36608 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
36609 continue
36610 }
36611 v.reset(OpRotateLeft32)
36612 v.AddArg2(x, z)
36613 return true
36614 }
36615 break
36616 }
36617
36618
36619
36620 for {
36621 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36622 right := v_0
36623 if right.Op != OpRsh32Ux32 {
36624 continue
36625 }
36626 y := right.Args[1]
36627 x := right.Args[0]
36628 left := v_1
36629 if left.Op != OpLsh32x32 {
36630 continue
36631 }
36632 _ = left.Args[1]
36633 if x != left.Args[0] {
36634 continue
36635 }
36636 z := left.Args[1]
36637 if z.Op != OpSub32 {
36638 continue
36639 }
36640 _ = z.Args[1]
36641 z_0 := z.Args[0]
36642 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
36643 continue
36644 }
36645 v.reset(OpRotateLeft32)
36646 v.AddArg2(x, z)
36647 return true
36648 }
36649 break
36650 }
36651
36652
36653
36654 for {
36655 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36656 right := v_0
36657 if right.Op != OpRsh32Ux16 {
36658 continue
36659 }
36660 y := right.Args[1]
36661 x := right.Args[0]
36662 left := v_1
36663 if left.Op != OpLsh32x16 {
36664 continue
36665 }
36666 _ = left.Args[1]
36667 if x != left.Args[0] {
36668 continue
36669 }
36670 z := left.Args[1]
36671 if z.Op != OpSub16 {
36672 continue
36673 }
36674 _ = z.Args[1]
36675 z_0 := z.Args[0]
36676 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
36677 continue
36678 }
36679 v.reset(OpRotateLeft32)
36680 v.AddArg2(x, z)
36681 return true
36682 }
36683 break
36684 }
36685
36686
36687
36688 for {
36689 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36690 right := v_0
36691 if right.Op != OpRsh32Ux8 {
36692 continue
36693 }
36694 y := right.Args[1]
36695 x := right.Args[0]
36696 left := v_1
36697 if left.Op != OpLsh32x8 {
36698 continue
36699 }
36700 _ = left.Args[1]
36701 if x != left.Args[0] {
36702 continue
36703 }
36704 z := left.Args[1]
36705 if z.Op != OpSub8 {
36706 continue
36707 }
36708 _ = z.Args[1]
36709 z_0 := z.Args[0]
36710 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
36711 continue
36712 }
36713 v.reset(OpRotateLeft32)
36714 v.AddArg2(x, z)
36715 return true
36716 }
36717 break
36718 }
36719 return false
36720 }
36721 func rewriteValuegeneric_OpXor64(v *Value) bool {
36722 v_1 := v.Args[1]
36723 v_0 := v.Args[0]
36724 b := v.Block
36725 config := b.Func.Config
36726
36727
36728 for {
36729 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36730 if v_0.Op != OpConst64 {
36731 continue
36732 }
36733 c := auxIntToInt64(v_0.AuxInt)
36734 if v_1.Op != OpConst64 {
36735 continue
36736 }
36737 d := auxIntToInt64(v_1.AuxInt)
36738 v.reset(OpConst64)
36739 v.AuxInt = int64ToAuxInt(c ^ d)
36740 return true
36741 }
36742 break
36743 }
36744
36745
36746 for {
36747 x := v_0
36748 if x != v_1 {
36749 break
36750 }
36751 v.reset(OpConst64)
36752 v.AuxInt = int64ToAuxInt(0)
36753 return true
36754 }
36755
36756
36757 for {
36758 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36759 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
36760 continue
36761 }
36762 x := v_1
36763 v.copyOf(x)
36764 return true
36765 }
36766 break
36767 }
36768
36769
36770 for {
36771 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36772 if v_0.Op != OpCom64 {
36773 continue
36774 }
36775 x := v_0.Args[0]
36776 if x != v_1 {
36777 continue
36778 }
36779 v.reset(OpConst64)
36780 v.AuxInt = int64ToAuxInt(-1)
36781 return true
36782 }
36783 break
36784 }
36785
36786
36787 for {
36788 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36789 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
36790 continue
36791 }
36792 x := v_1
36793 v.reset(OpCom64)
36794 v.AddArg(x)
36795 return true
36796 }
36797 break
36798 }
36799
36800
36801 for {
36802 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36803 x := v_0
36804 if v_1.Op != OpXor64 {
36805 continue
36806 }
36807 _ = v_1.Args[1]
36808 v_1_0 := v_1.Args[0]
36809 v_1_1 := v_1.Args[1]
36810 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36811 if x != v_1_0 {
36812 continue
36813 }
36814 y := v_1_1
36815 v.copyOf(y)
36816 return true
36817 }
36818 }
36819 break
36820 }
36821
36822
36823
36824 for {
36825 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36826 if v_0.Op != OpXor64 {
36827 continue
36828 }
36829 _ = v_0.Args[1]
36830 v_0_0 := v_0.Args[0]
36831 v_0_1 := v_0.Args[1]
36832 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
36833 i := v_0_0
36834 if i.Op != OpConst64 {
36835 continue
36836 }
36837 t := i.Type
36838 z := v_0_1
36839 x := v_1
36840 if !(z.Op != OpConst64 && x.Op != OpConst64) {
36841 continue
36842 }
36843 v.reset(OpXor64)
36844 v0 := b.NewValue0(v.Pos, OpXor64, t)
36845 v0.AddArg2(z, x)
36846 v.AddArg2(i, v0)
36847 return true
36848 }
36849 }
36850 break
36851 }
36852
36853
36854 for {
36855 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36856 if v_0.Op != OpConst64 {
36857 continue
36858 }
36859 t := v_0.Type
36860 c := auxIntToInt64(v_0.AuxInt)
36861 if v_1.Op != OpXor64 {
36862 continue
36863 }
36864 _ = v_1.Args[1]
36865 v_1_0 := v_1.Args[0]
36866 v_1_1 := v_1.Args[1]
36867 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36868 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
36869 continue
36870 }
36871 d := auxIntToInt64(v_1_0.AuxInt)
36872 x := v_1_1
36873 v.reset(OpXor64)
36874 v0 := b.NewValue0(v.Pos, OpConst64, t)
36875 v0.AuxInt = int64ToAuxInt(c ^ d)
36876 v.AddArg2(v0, x)
36877 return true
36878 }
36879 }
36880 break
36881 }
36882
36883
36884
36885 for {
36886 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36887 if v_0.Op != OpLsh64x64 {
36888 continue
36889 }
36890 _ = v_0.Args[1]
36891 x := v_0.Args[0]
36892 z := v_0.Args[1]
36893 if z.Op != OpConst64 {
36894 continue
36895 }
36896 c := auxIntToInt64(z.AuxInt)
36897 if v_1.Op != OpRsh64Ux64 {
36898 continue
36899 }
36900 _ = v_1.Args[1]
36901 if x != v_1.Args[0] {
36902 continue
36903 }
36904 v_1_1 := v_1.Args[1]
36905 if v_1_1.Op != OpConst64 {
36906 continue
36907 }
36908 d := auxIntToInt64(v_1_1.AuxInt)
36909 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
36910 continue
36911 }
36912 v.reset(OpRotateLeft64)
36913 v.AddArg2(x, z)
36914 return true
36915 }
36916 break
36917 }
36918
36919
36920
36921 for {
36922 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36923 left := v_0
36924 if left.Op != OpLsh64x64 {
36925 continue
36926 }
36927 y := left.Args[1]
36928 x := left.Args[0]
36929 right := v_1
36930 if right.Op != OpRsh64Ux64 {
36931 continue
36932 }
36933 _ = right.Args[1]
36934 if x != right.Args[0] {
36935 continue
36936 }
36937 right_1 := right.Args[1]
36938 if right_1.Op != OpSub64 {
36939 continue
36940 }
36941 _ = right_1.Args[1]
36942 right_1_0 := right_1.Args[0]
36943 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
36944 continue
36945 }
36946 v.reset(OpRotateLeft64)
36947 v.AddArg2(x, y)
36948 return true
36949 }
36950 break
36951 }
36952
36953
36954
36955 for {
36956 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36957 left := v_0
36958 if left.Op != OpLsh64x32 {
36959 continue
36960 }
36961 y := left.Args[1]
36962 x := left.Args[0]
36963 right := v_1
36964 if right.Op != OpRsh64Ux32 {
36965 continue
36966 }
36967 _ = right.Args[1]
36968 if x != right.Args[0] {
36969 continue
36970 }
36971 right_1 := right.Args[1]
36972 if right_1.Op != OpSub32 {
36973 continue
36974 }
36975 _ = right_1.Args[1]
36976 right_1_0 := right_1.Args[0]
36977 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
36978 continue
36979 }
36980 v.reset(OpRotateLeft64)
36981 v.AddArg2(x, y)
36982 return true
36983 }
36984 break
36985 }
36986
36987
36988
36989 for {
36990 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36991 left := v_0
36992 if left.Op != OpLsh64x16 {
36993 continue
36994 }
36995 y := left.Args[1]
36996 x := left.Args[0]
36997 right := v_1
36998 if right.Op != OpRsh64Ux16 {
36999 continue
37000 }
37001 _ = right.Args[1]
37002 if x != right.Args[0] {
37003 continue
37004 }
37005 right_1 := right.Args[1]
37006 if right_1.Op != OpSub16 {
37007 continue
37008 }
37009 _ = right_1.Args[1]
37010 right_1_0 := right_1.Args[0]
37011 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
37012 continue
37013 }
37014 v.reset(OpRotateLeft64)
37015 v.AddArg2(x, y)
37016 return true
37017 }
37018 break
37019 }
37020
37021
37022
37023 for {
37024 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37025 left := v_0
37026 if left.Op != OpLsh64x8 {
37027 continue
37028 }
37029 y := left.Args[1]
37030 x := left.Args[0]
37031 right := v_1
37032 if right.Op != OpRsh64Ux8 {
37033 continue
37034 }
37035 _ = right.Args[1]
37036 if x != right.Args[0] {
37037 continue
37038 }
37039 right_1 := right.Args[1]
37040 if right_1.Op != OpSub8 {
37041 continue
37042 }
37043 _ = right_1.Args[1]
37044 right_1_0 := right_1.Args[0]
37045 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
37046 continue
37047 }
37048 v.reset(OpRotateLeft64)
37049 v.AddArg2(x, y)
37050 return true
37051 }
37052 break
37053 }
37054
37055
37056
37057 for {
37058 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37059 right := v_0
37060 if right.Op != OpRsh64Ux64 {
37061 continue
37062 }
37063 y := right.Args[1]
37064 x := right.Args[0]
37065 left := v_1
37066 if left.Op != OpLsh64x64 {
37067 continue
37068 }
37069 _ = left.Args[1]
37070 if x != left.Args[0] {
37071 continue
37072 }
37073 z := left.Args[1]
37074 if z.Op != OpSub64 {
37075 continue
37076 }
37077 _ = z.Args[1]
37078 z_0 := z.Args[0]
37079 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
37080 continue
37081 }
37082 v.reset(OpRotateLeft64)
37083 v.AddArg2(x, z)
37084 return true
37085 }
37086 break
37087 }
37088
37089
37090
37091 for {
37092 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37093 right := v_0
37094 if right.Op != OpRsh64Ux32 {
37095 continue
37096 }
37097 y := right.Args[1]
37098 x := right.Args[0]
37099 left := v_1
37100 if left.Op != OpLsh64x32 {
37101 continue
37102 }
37103 _ = left.Args[1]
37104 if x != left.Args[0] {
37105 continue
37106 }
37107 z := left.Args[1]
37108 if z.Op != OpSub32 {
37109 continue
37110 }
37111 _ = z.Args[1]
37112 z_0 := z.Args[0]
37113 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
37114 continue
37115 }
37116 v.reset(OpRotateLeft64)
37117 v.AddArg2(x, z)
37118 return true
37119 }
37120 break
37121 }
37122
37123
37124
37125 for {
37126 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37127 right := v_0
37128 if right.Op != OpRsh64Ux16 {
37129 continue
37130 }
37131 y := right.Args[1]
37132 x := right.Args[0]
37133 left := v_1
37134 if left.Op != OpLsh64x16 {
37135 continue
37136 }
37137 _ = left.Args[1]
37138 if x != left.Args[0] {
37139 continue
37140 }
37141 z := left.Args[1]
37142 if z.Op != OpSub16 {
37143 continue
37144 }
37145 _ = z.Args[1]
37146 z_0 := z.Args[0]
37147 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
37148 continue
37149 }
37150 v.reset(OpRotateLeft64)
37151 v.AddArg2(x, z)
37152 return true
37153 }
37154 break
37155 }
37156
37157
37158
37159 for {
37160 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37161 right := v_0
37162 if right.Op != OpRsh64Ux8 {
37163 continue
37164 }
37165 y := right.Args[1]
37166 x := right.Args[0]
37167 left := v_1
37168 if left.Op != OpLsh64x8 {
37169 continue
37170 }
37171 _ = left.Args[1]
37172 if x != left.Args[0] {
37173 continue
37174 }
37175 z := left.Args[1]
37176 if z.Op != OpSub8 {
37177 continue
37178 }
37179 _ = z.Args[1]
37180 z_0 := z.Args[0]
37181 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
37182 continue
37183 }
37184 v.reset(OpRotateLeft64)
37185 v.AddArg2(x, z)
37186 return true
37187 }
37188 break
37189 }
37190 return false
37191 }
37192 func rewriteValuegeneric_OpXor8(v *Value) bool {
37193 v_1 := v.Args[1]
37194 v_0 := v.Args[0]
37195 b := v.Block
37196 config := b.Func.Config
37197
37198
37199 for {
37200 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37201 if v_0.Op != OpConst8 {
37202 continue
37203 }
37204 c := auxIntToInt8(v_0.AuxInt)
37205 if v_1.Op != OpConst8 {
37206 continue
37207 }
37208 d := auxIntToInt8(v_1.AuxInt)
37209 v.reset(OpConst8)
37210 v.AuxInt = int8ToAuxInt(c ^ d)
37211 return true
37212 }
37213 break
37214 }
37215
37216
37217 for {
37218 x := v_0
37219 if x != v_1 {
37220 break
37221 }
37222 v.reset(OpConst8)
37223 v.AuxInt = int8ToAuxInt(0)
37224 return true
37225 }
37226
37227
37228 for {
37229 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37230 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
37231 continue
37232 }
37233 x := v_1
37234 v.copyOf(x)
37235 return true
37236 }
37237 break
37238 }
37239
37240
37241 for {
37242 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37243 if v_0.Op != OpCom8 {
37244 continue
37245 }
37246 x := v_0.Args[0]
37247 if x != v_1 {
37248 continue
37249 }
37250 v.reset(OpConst8)
37251 v.AuxInt = int8ToAuxInt(-1)
37252 return true
37253 }
37254 break
37255 }
37256
37257
37258 for {
37259 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37260 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
37261 continue
37262 }
37263 x := v_1
37264 v.reset(OpCom8)
37265 v.AddArg(x)
37266 return true
37267 }
37268 break
37269 }
37270
37271
37272 for {
37273 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37274 x := v_0
37275 if v_1.Op != OpXor8 {
37276 continue
37277 }
37278 _ = v_1.Args[1]
37279 v_1_0 := v_1.Args[0]
37280 v_1_1 := v_1.Args[1]
37281 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
37282 if x != v_1_0 {
37283 continue
37284 }
37285 y := v_1_1
37286 v.copyOf(y)
37287 return true
37288 }
37289 }
37290 break
37291 }
37292
37293
37294
37295 for {
37296 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37297 if v_0.Op != OpXor8 {
37298 continue
37299 }
37300 _ = v_0.Args[1]
37301 v_0_0 := v_0.Args[0]
37302 v_0_1 := v_0.Args[1]
37303 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
37304 i := v_0_0
37305 if i.Op != OpConst8 {
37306 continue
37307 }
37308 t := i.Type
37309 z := v_0_1
37310 x := v_1
37311 if !(z.Op != OpConst8 && x.Op != OpConst8) {
37312 continue
37313 }
37314 v.reset(OpXor8)
37315 v0 := b.NewValue0(v.Pos, OpXor8, t)
37316 v0.AddArg2(z, x)
37317 v.AddArg2(i, v0)
37318 return true
37319 }
37320 }
37321 break
37322 }
37323
37324
37325 for {
37326 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37327 if v_0.Op != OpConst8 {
37328 continue
37329 }
37330 t := v_0.Type
37331 c := auxIntToInt8(v_0.AuxInt)
37332 if v_1.Op != OpXor8 {
37333 continue
37334 }
37335 _ = v_1.Args[1]
37336 v_1_0 := v_1.Args[0]
37337 v_1_1 := v_1.Args[1]
37338 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
37339 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
37340 continue
37341 }
37342 d := auxIntToInt8(v_1_0.AuxInt)
37343 x := v_1_1
37344 v.reset(OpXor8)
37345 v0 := b.NewValue0(v.Pos, OpConst8, t)
37346 v0.AuxInt = int8ToAuxInt(c ^ d)
37347 v.AddArg2(v0, x)
37348 return true
37349 }
37350 }
37351 break
37352 }
37353
37354
37355
37356 for {
37357 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37358 if v_0.Op != OpLsh8x64 {
37359 continue
37360 }
37361 _ = v_0.Args[1]
37362 x := v_0.Args[0]
37363 z := v_0.Args[1]
37364 if z.Op != OpConst64 {
37365 continue
37366 }
37367 c := auxIntToInt64(z.AuxInt)
37368 if v_1.Op != OpRsh8Ux64 {
37369 continue
37370 }
37371 _ = v_1.Args[1]
37372 if x != v_1.Args[0] {
37373 continue
37374 }
37375 v_1_1 := v_1.Args[1]
37376 if v_1_1.Op != OpConst64 {
37377 continue
37378 }
37379 d := auxIntToInt64(v_1_1.AuxInt)
37380 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
37381 continue
37382 }
37383 v.reset(OpRotateLeft8)
37384 v.AddArg2(x, z)
37385 return true
37386 }
37387 break
37388 }
37389
37390
37391
37392 for {
37393 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37394 left := v_0
37395 if left.Op != OpLsh8x64 {
37396 continue
37397 }
37398 y := left.Args[1]
37399 x := left.Args[0]
37400 right := v_1
37401 if right.Op != OpRsh8Ux64 {
37402 continue
37403 }
37404 _ = right.Args[1]
37405 if x != right.Args[0] {
37406 continue
37407 }
37408 right_1 := right.Args[1]
37409 if right_1.Op != OpSub64 {
37410 continue
37411 }
37412 _ = right_1.Args[1]
37413 right_1_0 := right_1.Args[0]
37414 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
37415 continue
37416 }
37417 v.reset(OpRotateLeft8)
37418 v.AddArg2(x, y)
37419 return true
37420 }
37421 break
37422 }
37423
37424
37425
37426 for {
37427 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37428 left := v_0
37429 if left.Op != OpLsh8x32 {
37430 continue
37431 }
37432 y := left.Args[1]
37433 x := left.Args[0]
37434 right := v_1
37435 if right.Op != OpRsh8Ux32 {
37436 continue
37437 }
37438 _ = right.Args[1]
37439 if x != right.Args[0] {
37440 continue
37441 }
37442 right_1 := right.Args[1]
37443 if right_1.Op != OpSub32 {
37444 continue
37445 }
37446 _ = right_1.Args[1]
37447 right_1_0 := right_1.Args[0]
37448 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
37449 continue
37450 }
37451 v.reset(OpRotateLeft8)
37452 v.AddArg2(x, y)
37453 return true
37454 }
37455 break
37456 }
37457
37458
37459
37460 for {
37461 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37462 left := v_0
37463 if left.Op != OpLsh8x16 {
37464 continue
37465 }
37466 y := left.Args[1]
37467 x := left.Args[0]
37468 right := v_1
37469 if right.Op != OpRsh8Ux16 {
37470 continue
37471 }
37472 _ = right.Args[1]
37473 if x != right.Args[0] {
37474 continue
37475 }
37476 right_1 := right.Args[1]
37477 if right_1.Op != OpSub16 {
37478 continue
37479 }
37480 _ = right_1.Args[1]
37481 right_1_0 := right_1.Args[0]
37482 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
37483 continue
37484 }
37485 v.reset(OpRotateLeft8)
37486 v.AddArg2(x, y)
37487 return true
37488 }
37489 break
37490 }
37491
37492
37493
37494 for {
37495 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37496 left := v_0
37497 if left.Op != OpLsh8x8 {
37498 continue
37499 }
37500 y := left.Args[1]
37501 x := left.Args[0]
37502 right := v_1
37503 if right.Op != OpRsh8Ux8 {
37504 continue
37505 }
37506 _ = right.Args[1]
37507 if x != right.Args[0] {
37508 continue
37509 }
37510 right_1 := right.Args[1]
37511 if right_1.Op != OpSub8 {
37512 continue
37513 }
37514 _ = right_1.Args[1]
37515 right_1_0 := right_1.Args[0]
37516 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
37517 continue
37518 }
37519 v.reset(OpRotateLeft8)
37520 v.AddArg2(x, y)
37521 return true
37522 }
37523 break
37524 }
37525
37526
37527
37528 for {
37529 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37530 right := v_0
37531 if right.Op != OpRsh8Ux64 {
37532 continue
37533 }
37534 y := right.Args[1]
37535 x := right.Args[0]
37536 left := v_1
37537 if left.Op != OpLsh8x64 {
37538 continue
37539 }
37540 _ = left.Args[1]
37541 if x != left.Args[0] {
37542 continue
37543 }
37544 z := left.Args[1]
37545 if z.Op != OpSub64 {
37546 continue
37547 }
37548 _ = z.Args[1]
37549 z_0 := z.Args[0]
37550 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
37551 continue
37552 }
37553 v.reset(OpRotateLeft8)
37554 v.AddArg2(x, z)
37555 return true
37556 }
37557 break
37558 }
37559
37560
37561
37562 for {
37563 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37564 right := v_0
37565 if right.Op != OpRsh8Ux32 {
37566 continue
37567 }
37568 y := right.Args[1]
37569 x := right.Args[0]
37570 left := v_1
37571 if left.Op != OpLsh8x32 {
37572 continue
37573 }
37574 _ = left.Args[1]
37575 if x != left.Args[0] {
37576 continue
37577 }
37578 z := left.Args[1]
37579 if z.Op != OpSub32 {
37580 continue
37581 }
37582 _ = z.Args[1]
37583 z_0 := z.Args[0]
37584 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
37585 continue
37586 }
37587 v.reset(OpRotateLeft8)
37588 v.AddArg2(x, z)
37589 return true
37590 }
37591 break
37592 }
37593
37594
37595
37596 for {
37597 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37598 right := v_0
37599 if right.Op != OpRsh8Ux16 {
37600 continue
37601 }
37602 y := right.Args[1]
37603 x := right.Args[0]
37604 left := v_1
37605 if left.Op != OpLsh8x16 {
37606 continue
37607 }
37608 _ = left.Args[1]
37609 if x != left.Args[0] {
37610 continue
37611 }
37612 z := left.Args[1]
37613 if z.Op != OpSub16 {
37614 continue
37615 }
37616 _ = z.Args[1]
37617 z_0 := z.Args[0]
37618 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
37619 continue
37620 }
37621 v.reset(OpRotateLeft8)
37622 v.AddArg2(x, z)
37623 return true
37624 }
37625 break
37626 }
37627
37628
37629
37630 for {
37631 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37632 right := v_0
37633 if right.Op != OpRsh8Ux8 {
37634 continue
37635 }
37636 y := right.Args[1]
37637 x := right.Args[0]
37638 left := v_1
37639 if left.Op != OpLsh8x8 {
37640 continue
37641 }
37642 _ = left.Args[1]
37643 if x != left.Args[0] {
37644 continue
37645 }
37646 z := left.Args[1]
37647 if z.Op != OpSub8 {
37648 continue
37649 }
37650 _ = z.Args[1]
37651 z_0 := z.Args[0]
37652 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
37653 continue
37654 }
37655 v.reset(OpRotateLeft8)
37656 v.AddArg2(x, z)
37657 return true
37658 }
37659 break
37660 }
37661 return false
37662 }
37663 func rewriteValuegeneric_OpZero(v *Value) bool {
37664 v_1 := v.Args[1]
37665 v_0 := v.Args[0]
37666 b := v.Block
37667
37668
37669
37670 for {
37671 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
37672 break
37673 }
37674 call := v_0.Args[0]
37675 if call.Op != OpStaticLECall {
37676 break
37677 }
37678 mem := v_1
37679 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isMalloc(call.Aux)) {
37680 break
37681 }
37682 v.copyOf(mem)
37683 return true
37684 }
37685
37686
37687
37688 for {
37689 n := auxIntToInt64(v.AuxInt)
37690 t1 := auxToType(v.Aux)
37691 p1 := v_0
37692 store := v_1
37693 if store.Op != OpStore {
37694 break
37695 }
37696 t2 := auxToType(store.Aux)
37697 mem := store.Args[2]
37698 store_0 := store.Args[0]
37699 if store_0.Op != OpOffPtr {
37700 break
37701 }
37702 o2 := auxIntToInt64(store_0.AuxInt)
37703 p2 := store_0.Args[0]
37704 if !(isSamePtr(p1, p2) && store.Uses == 1 && n >= o2+t2.Size() && clobber(store)) {
37705 break
37706 }
37707 v.reset(OpZero)
37708 v.AuxInt = int64ToAuxInt(n)
37709 v.Aux = typeToAux(t1)
37710 v.AddArg2(p1, mem)
37711 return true
37712 }
37713
37714
37715
37716 for {
37717 n := auxIntToInt64(v.AuxInt)
37718 t := auxToType(v.Aux)
37719 dst1 := v_0
37720 move := v_1
37721 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
37722 break
37723 }
37724 mem := move.Args[2]
37725 dst2 := move.Args[0]
37726 if !(move.Uses == 1 && isSamePtr(dst1, dst2) && clobber(move)) {
37727 break
37728 }
37729 v.reset(OpZero)
37730 v.AuxInt = int64ToAuxInt(n)
37731 v.Aux = typeToAux(t)
37732 v.AddArg2(dst1, mem)
37733 return true
37734 }
37735
37736
37737
37738 for {
37739 n := auxIntToInt64(v.AuxInt)
37740 t := auxToType(v.Aux)
37741 dst1 := v_0
37742 vardef := v_1
37743 if vardef.Op != OpVarDef {
37744 break
37745 }
37746 x := auxToSym(vardef.Aux)
37747 move := vardef.Args[0]
37748 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
37749 break
37750 }
37751 mem := move.Args[2]
37752 dst2 := move.Args[0]
37753 if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && clobber(move, vardef)) {
37754 break
37755 }
37756 v.reset(OpZero)
37757 v.AuxInt = int64ToAuxInt(n)
37758 v.Aux = typeToAux(t)
37759 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
37760 v0.Aux = symToAux(x)
37761 v0.AddArg(mem)
37762 v.AddArg2(dst1, v0)
37763 return true
37764 }
37765
37766
37767
37768 for {
37769 s := auxIntToInt64(v.AuxInt)
37770 t := auxToType(v.Aux)
37771 dst1 := v_0
37772 zero := v_1
37773 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != s || auxToType(zero.Aux) != t {
37774 break
37775 }
37776 dst2 := zero.Args[0]
37777 if !(isSamePtr(dst1, dst2)) {
37778 break
37779 }
37780 v.copyOf(zero)
37781 return true
37782 }
37783
37784
37785
37786 for {
37787 s := auxIntToInt64(v.AuxInt)
37788 t := auxToType(v.Aux)
37789 dst1 := v_0
37790 vardef := v_1
37791 if vardef.Op != OpVarDef {
37792 break
37793 }
37794 vardef_0 := vardef.Args[0]
37795 if vardef_0.Op != OpZero || auxIntToInt64(vardef_0.AuxInt) != s || auxToType(vardef_0.Aux) != t {
37796 break
37797 }
37798 dst2 := vardef_0.Args[0]
37799 if !(isSamePtr(dst1, dst2)) {
37800 break
37801 }
37802 v.copyOf(vardef)
37803 return true
37804 }
37805 return false
37806 }
37807 func rewriteValuegeneric_OpZeroExt16to32(v *Value) bool {
37808 v_0 := v.Args[0]
37809
37810
37811 for {
37812 if v_0.Op != OpConst16 {
37813 break
37814 }
37815 c := auxIntToInt16(v_0.AuxInt)
37816 v.reset(OpConst32)
37817 v.AuxInt = int32ToAuxInt(int32(uint16(c)))
37818 return true
37819 }
37820
37821
37822
37823 for {
37824 if v_0.Op != OpTrunc32to16 {
37825 break
37826 }
37827 x := v_0.Args[0]
37828 if x.Op != OpRsh32Ux64 {
37829 break
37830 }
37831 _ = x.Args[1]
37832 x_1 := x.Args[1]
37833 if x_1.Op != OpConst64 {
37834 break
37835 }
37836 s := auxIntToInt64(x_1.AuxInt)
37837 if !(s >= 16) {
37838 break
37839 }
37840 v.copyOf(x)
37841 return true
37842 }
37843 return false
37844 }
37845 func rewriteValuegeneric_OpZeroExt16to64(v *Value) bool {
37846 v_0 := v.Args[0]
37847
37848
37849 for {
37850 if v_0.Op != OpConst16 {
37851 break
37852 }
37853 c := auxIntToInt16(v_0.AuxInt)
37854 v.reset(OpConst64)
37855 v.AuxInt = int64ToAuxInt(int64(uint16(c)))
37856 return true
37857 }
37858
37859
37860
37861 for {
37862 if v_0.Op != OpTrunc64to16 {
37863 break
37864 }
37865 x := v_0.Args[0]
37866 if x.Op != OpRsh64Ux64 {
37867 break
37868 }
37869 _ = x.Args[1]
37870 x_1 := x.Args[1]
37871 if x_1.Op != OpConst64 {
37872 break
37873 }
37874 s := auxIntToInt64(x_1.AuxInt)
37875 if !(s >= 48) {
37876 break
37877 }
37878 v.copyOf(x)
37879 return true
37880 }
37881 return false
37882 }
37883 func rewriteValuegeneric_OpZeroExt32to64(v *Value) bool {
37884 v_0 := v.Args[0]
37885
37886
37887 for {
37888 if v_0.Op != OpConst32 {
37889 break
37890 }
37891 c := auxIntToInt32(v_0.AuxInt)
37892 v.reset(OpConst64)
37893 v.AuxInt = int64ToAuxInt(int64(uint32(c)))
37894 return true
37895 }
37896
37897
37898
37899 for {
37900 if v_0.Op != OpTrunc64to32 {
37901 break
37902 }
37903 x := v_0.Args[0]
37904 if x.Op != OpRsh64Ux64 {
37905 break
37906 }
37907 _ = x.Args[1]
37908 x_1 := x.Args[1]
37909 if x_1.Op != OpConst64 {
37910 break
37911 }
37912 s := auxIntToInt64(x_1.AuxInt)
37913 if !(s >= 32) {
37914 break
37915 }
37916 v.copyOf(x)
37917 return true
37918 }
37919 return false
37920 }
37921 func rewriteValuegeneric_OpZeroExt8to16(v *Value) bool {
37922 v_0 := v.Args[0]
37923
37924
37925 for {
37926 if v_0.Op != OpConst8 {
37927 break
37928 }
37929 c := auxIntToInt8(v_0.AuxInt)
37930 v.reset(OpConst16)
37931 v.AuxInt = int16ToAuxInt(int16(uint8(c)))
37932 return true
37933 }
37934
37935
37936
37937 for {
37938 if v_0.Op != OpTrunc16to8 {
37939 break
37940 }
37941 x := v_0.Args[0]
37942 if x.Op != OpRsh16Ux64 {
37943 break
37944 }
37945 _ = x.Args[1]
37946 x_1 := x.Args[1]
37947 if x_1.Op != OpConst64 {
37948 break
37949 }
37950 s := auxIntToInt64(x_1.AuxInt)
37951 if !(s >= 8) {
37952 break
37953 }
37954 v.copyOf(x)
37955 return true
37956 }
37957 return false
37958 }
37959 func rewriteValuegeneric_OpZeroExt8to32(v *Value) bool {
37960 v_0 := v.Args[0]
37961
37962
37963 for {
37964 if v_0.Op != OpConst8 {
37965 break
37966 }
37967 c := auxIntToInt8(v_0.AuxInt)
37968 v.reset(OpConst32)
37969 v.AuxInt = int32ToAuxInt(int32(uint8(c)))
37970 return true
37971 }
37972
37973
37974
37975 for {
37976 if v_0.Op != OpTrunc32to8 {
37977 break
37978 }
37979 x := v_0.Args[0]
37980 if x.Op != OpRsh32Ux64 {
37981 break
37982 }
37983 _ = x.Args[1]
37984 x_1 := x.Args[1]
37985 if x_1.Op != OpConst64 {
37986 break
37987 }
37988 s := auxIntToInt64(x_1.AuxInt)
37989 if !(s >= 24) {
37990 break
37991 }
37992 v.copyOf(x)
37993 return true
37994 }
37995 return false
37996 }
37997 func rewriteValuegeneric_OpZeroExt8to64(v *Value) bool {
37998 v_0 := v.Args[0]
37999
38000
38001 for {
38002 if v_0.Op != OpConst8 {
38003 break
38004 }
38005 c := auxIntToInt8(v_0.AuxInt)
38006 v.reset(OpConst64)
38007 v.AuxInt = int64ToAuxInt(int64(uint8(c)))
38008 return true
38009 }
38010
38011
38012
38013 for {
38014 if v_0.Op != OpTrunc64to8 {
38015 break
38016 }
38017 x := v_0.Args[0]
38018 if x.Op != OpRsh64Ux64 {
38019 break
38020 }
38021 _ = x.Args[1]
38022 x_1 := x.Args[1]
38023 if x_1.Op != OpConst64 {
38024 break
38025 }
38026 s := auxIntToInt64(x_1.AuxInt)
38027 if !(s >= 56) {
38028 break
38029 }
38030 v.copyOf(x)
38031 return true
38032 }
38033 return false
38034 }
38035 func rewriteBlockgeneric(b *Block) bool {
38036 switch b.Kind {
38037 case BlockIf:
38038
38039
38040 for b.Controls[0].Op == OpNot {
38041 v_0 := b.Controls[0]
38042 cond := v_0.Args[0]
38043 b.resetWithControl(BlockIf, cond)
38044 b.swapSuccessors()
38045 return true
38046 }
38047
38048
38049
38050 for b.Controls[0].Op == OpConstBool {
38051 v_0 := b.Controls[0]
38052 c := auxIntToBool(v_0.AuxInt)
38053 if !(c) {
38054 break
38055 }
38056 b.Reset(BlockFirst)
38057 return true
38058 }
38059
38060
38061
38062 for b.Controls[0].Op == OpConstBool {
38063 v_0 := b.Controls[0]
38064 c := auxIntToBool(v_0.AuxInt)
38065 if !(!c) {
38066 break
38067 }
38068 b.Reset(BlockFirst)
38069 b.swapSuccessors()
38070 return true
38071 }
38072 }
38073 return false
38074 }
38075
View as plain text