1
2
3 package ssa
4
5 import "math"
6 import "math/bits"
7 import "cmd/internal/obj"
8 import "cmd/compile/internal/types"
9 import "cmd/compile/internal/ir"
10
11 func rewriteValuegeneric(v *Value) bool {
12 switch v.Op {
13 case OpAdd16:
14 return rewriteValuegeneric_OpAdd16(v)
15 case OpAdd32:
16 return rewriteValuegeneric_OpAdd32(v)
17 case OpAdd32F:
18 return rewriteValuegeneric_OpAdd32F(v)
19 case OpAdd64:
20 return rewriteValuegeneric_OpAdd64(v)
21 case OpAdd64F:
22 return rewriteValuegeneric_OpAdd64F(v)
23 case OpAdd64carry:
24 return rewriteValuegeneric_OpAdd64carry(v)
25 case OpAdd8:
26 return rewriteValuegeneric_OpAdd8(v)
27 case OpAddPtr:
28 return rewriteValuegeneric_OpAddPtr(v)
29 case OpAnd16:
30 return rewriteValuegeneric_OpAnd16(v)
31 case OpAnd32:
32 return rewriteValuegeneric_OpAnd32(v)
33 case OpAnd64:
34 return rewriteValuegeneric_OpAnd64(v)
35 case OpAnd8:
36 return rewriteValuegeneric_OpAnd8(v)
37 case OpAndB:
38 return rewriteValuegeneric_OpAndB(v)
39 case OpArraySelect:
40 return rewriteValuegeneric_OpArraySelect(v)
41 case OpBitLen16:
42 return rewriteValuegeneric_OpBitLen16(v)
43 case OpBitLen32:
44 return rewriteValuegeneric_OpBitLen32(v)
45 case OpBitLen64:
46 return rewriteValuegeneric_OpBitLen64(v)
47 case OpBitLen8:
48 return rewriteValuegeneric_OpBitLen8(v)
49 case OpCeil:
50 return rewriteValuegeneric_OpCeil(v)
51 case OpCom16:
52 return rewriteValuegeneric_OpCom16(v)
53 case OpCom32:
54 return rewriteValuegeneric_OpCom32(v)
55 case OpCom64:
56 return rewriteValuegeneric_OpCom64(v)
57 case OpCom8:
58 return rewriteValuegeneric_OpCom8(v)
59 case OpCondSelect:
60 return rewriteValuegeneric_OpCondSelect(v)
61 case OpConstInterface:
62 return rewriteValuegeneric_OpConstInterface(v)
63 case OpConstSlice:
64 return rewriteValuegeneric_OpConstSlice(v)
65 case OpConstString:
66 return rewriteValuegeneric_OpConstString(v)
67 case OpConvert:
68 return rewriteValuegeneric_OpConvert(v)
69 case OpCtz16:
70 return rewriteValuegeneric_OpCtz16(v)
71 case OpCtz32:
72 return rewriteValuegeneric_OpCtz32(v)
73 case OpCtz64:
74 return rewriteValuegeneric_OpCtz64(v)
75 case OpCtz8:
76 return rewriteValuegeneric_OpCtz8(v)
77 case OpCvt32Fto32:
78 return rewriteValuegeneric_OpCvt32Fto32(v)
79 case OpCvt32Fto64:
80 return rewriteValuegeneric_OpCvt32Fto64(v)
81 case OpCvt32Fto64F:
82 return rewriteValuegeneric_OpCvt32Fto64F(v)
83 case OpCvt32to32F:
84 return rewriteValuegeneric_OpCvt32to32F(v)
85 case OpCvt32to64F:
86 return rewriteValuegeneric_OpCvt32to64F(v)
87 case OpCvt64Fto32:
88 return rewriteValuegeneric_OpCvt64Fto32(v)
89 case OpCvt64Fto32F:
90 return rewriteValuegeneric_OpCvt64Fto32F(v)
91 case OpCvt64Fto64:
92 return rewriteValuegeneric_OpCvt64Fto64(v)
93 case OpCvt64to32F:
94 return rewriteValuegeneric_OpCvt64to32F(v)
95 case OpCvt64to64F:
96 return rewriteValuegeneric_OpCvt64to64F(v)
97 case OpCvtBoolToUint8:
98 return rewriteValuegeneric_OpCvtBoolToUint8(v)
99 case OpDiv128u:
100 return rewriteValuegeneric_OpDiv128u(v)
101 case OpDiv16:
102 return rewriteValuegeneric_OpDiv16(v)
103 case OpDiv16u:
104 return rewriteValuegeneric_OpDiv16u(v)
105 case OpDiv32:
106 return rewriteValuegeneric_OpDiv32(v)
107 case OpDiv32F:
108 return rewriteValuegeneric_OpDiv32F(v)
109 case OpDiv32u:
110 return rewriteValuegeneric_OpDiv32u(v)
111 case OpDiv64:
112 return rewriteValuegeneric_OpDiv64(v)
113 case OpDiv64F:
114 return rewriteValuegeneric_OpDiv64F(v)
115 case OpDiv64u:
116 return rewriteValuegeneric_OpDiv64u(v)
117 case OpDiv8:
118 return rewriteValuegeneric_OpDiv8(v)
119 case OpDiv8u:
120 return rewriteValuegeneric_OpDiv8u(v)
121 case OpEq16:
122 return rewriteValuegeneric_OpEq16(v)
123 case OpEq32:
124 return rewriteValuegeneric_OpEq32(v)
125 case OpEq32F:
126 return rewriteValuegeneric_OpEq32F(v)
127 case OpEq64:
128 return rewriteValuegeneric_OpEq64(v)
129 case OpEq64F:
130 return rewriteValuegeneric_OpEq64F(v)
131 case OpEq8:
132 return rewriteValuegeneric_OpEq8(v)
133 case OpEqB:
134 return rewriteValuegeneric_OpEqB(v)
135 case OpEqInter:
136 return rewriteValuegeneric_OpEqInter(v)
137 case OpEqPtr:
138 return rewriteValuegeneric_OpEqPtr(v)
139 case OpEqSlice:
140 return rewriteValuegeneric_OpEqSlice(v)
141 case OpFloor:
142 return rewriteValuegeneric_OpFloor(v)
143 case OpIMake:
144 return rewriteValuegeneric_OpIMake(v)
145 case OpInterLECall:
146 return rewriteValuegeneric_OpInterLECall(v)
147 case OpIsInBounds:
148 return rewriteValuegeneric_OpIsInBounds(v)
149 case OpIsNonNil:
150 return rewriteValuegeneric_OpIsNonNil(v)
151 case OpIsSliceInBounds:
152 return rewriteValuegeneric_OpIsSliceInBounds(v)
153 case OpLeq16:
154 return rewriteValuegeneric_OpLeq16(v)
155 case OpLeq16U:
156 return rewriteValuegeneric_OpLeq16U(v)
157 case OpLeq32:
158 return rewriteValuegeneric_OpLeq32(v)
159 case OpLeq32F:
160 return rewriteValuegeneric_OpLeq32F(v)
161 case OpLeq32U:
162 return rewriteValuegeneric_OpLeq32U(v)
163 case OpLeq64:
164 return rewriteValuegeneric_OpLeq64(v)
165 case OpLeq64F:
166 return rewriteValuegeneric_OpLeq64F(v)
167 case OpLeq64U:
168 return rewriteValuegeneric_OpLeq64U(v)
169 case OpLeq8:
170 return rewriteValuegeneric_OpLeq8(v)
171 case OpLeq8U:
172 return rewriteValuegeneric_OpLeq8U(v)
173 case OpLess16:
174 return rewriteValuegeneric_OpLess16(v)
175 case OpLess16U:
176 return rewriteValuegeneric_OpLess16U(v)
177 case OpLess32:
178 return rewriteValuegeneric_OpLess32(v)
179 case OpLess32F:
180 return rewriteValuegeneric_OpLess32F(v)
181 case OpLess32U:
182 return rewriteValuegeneric_OpLess32U(v)
183 case OpLess64:
184 return rewriteValuegeneric_OpLess64(v)
185 case OpLess64F:
186 return rewriteValuegeneric_OpLess64F(v)
187 case OpLess64U:
188 return rewriteValuegeneric_OpLess64U(v)
189 case OpLess8:
190 return rewriteValuegeneric_OpLess8(v)
191 case OpLess8U:
192 return rewriteValuegeneric_OpLess8U(v)
193 case OpLoad:
194 return rewriteValuegeneric_OpLoad(v)
195 case OpLsh16x16:
196 return rewriteValuegeneric_OpLsh16x16(v)
197 case OpLsh16x32:
198 return rewriteValuegeneric_OpLsh16x32(v)
199 case OpLsh16x64:
200 return rewriteValuegeneric_OpLsh16x64(v)
201 case OpLsh16x8:
202 return rewriteValuegeneric_OpLsh16x8(v)
203 case OpLsh32x16:
204 return rewriteValuegeneric_OpLsh32x16(v)
205 case OpLsh32x32:
206 return rewriteValuegeneric_OpLsh32x32(v)
207 case OpLsh32x64:
208 return rewriteValuegeneric_OpLsh32x64(v)
209 case OpLsh32x8:
210 return rewriteValuegeneric_OpLsh32x8(v)
211 case OpLsh64x16:
212 return rewriteValuegeneric_OpLsh64x16(v)
213 case OpLsh64x32:
214 return rewriteValuegeneric_OpLsh64x32(v)
215 case OpLsh64x64:
216 return rewriteValuegeneric_OpLsh64x64(v)
217 case OpLsh64x8:
218 return rewriteValuegeneric_OpLsh64x8(v)
219 case OpLsh8x16:
220 return rewriteValuegeneric_OpLsh8x16(v)
221 case OpLsh8x32:
222 return rewriteValuegeneric_OpLsh8x32(v)
223 case OpLsh8x64:
224 return rewriteValuegeneric_OpLsh8x64(v)
225 case OpLsh8x8:
226 return rewriteValuegeneric_OpLsh8x8(v)
227 case OpMemEq:
228 return rewriteValuegeneric_OpMemEq(v)
229 case OpMod16:
230 return rewriteValuegeneric_OpMod16(v)
231 case OpMod16u:
232 return rewriteValuegeneric_OpMod16u(v)
233 case OpMod32:
234 return rewriteValuegeneric_OpMod32(v)
235 case OpMod32u:
236 return rewriteValuegeneric_OpMod32u(v)
237 case OpMod64:
238 return rewriteValuegeneric_OpMod64(v)
239 case OpMod64u:
240 return rewriteValuegeneric_OpMod64u(v)
241 case OpMod8:
242 return rewriteValuegeneric_OpMod8(v)
243 case OpMod8u:
244 return rewriteValuegeneric_OpMod8u(v)
245 case OpMove:
246 return rewriteValuegeneric_OpMove(v)
247 case OpMul16:
248 return rewriteValuegeneric_OpMul16(v)
249 case OpMul32:
250 return rewriteValuegeneric_OpMul32(v)
251 case OpMul32F:
252 return rewriteValuegeneric_OpMul32F(v)
253 case OpMul32uhilo:
254 return rewriteValuegeneric_OpMul32uhilo(v)
255 case OpMul32uover:
256 return rewriteValuegeneric_OpMul32uover(v)
257 case OpMul64:
258 return rewriteValuegeneric_OpMul64(v)
259 case OpMul64F:
260 return rewriteValuegeneric_OpMul64F(v)
261 case OpMul64uhilo:
262 return rewriteValuegeneric_OpMul64uhilo(v)
263 case OpMul64uover:
264 return rewriteValuegeneric_OpMul64uover(v)
265 case OpMul8:
266 return rewriteValuegeneric_OpMul8(v)
267 case OpNeg16:
268 return rewriteValuegeneric_OpNeg16(v)
269 case OpNeg32:
270 return rewriteValuegeneric_OpNeg32(v)
271 case OpNeg32F:
272 return rewriteValuegeneric_OpNeg32F(v)
273 case OpNeg64:
274 return rewriteValuegeneric_OpNeg64(v)
275 case OpNeg64F:
276 return rewriteValuegeneric_OpNeg64F(v)
277 case OpNeg8:
278 return rewriteValuegeneric_OpNeg8(v)
279 case OpNeq16:
280 return rewriteValuegeneric_OpNeq16(v)
281 case OpNeq32:
282 return rewriteValuegeneric_OpNeq32(v)
283 case OpNeq32F:
284 return rewriteValuegeneric_OpNeq32F(v)
285 case OpNeq64:
286 return rewriteValuegeneric_OpNeq64(v)
287 case OpNeq64F:
288 return rewriteValuegeneric_OpNeq64F(v)
289 case OpNeq8:
290 return rewriteValuegeneric_OpNeq8(v)
291 case OpNeqB:
292 return rewriteValuegeneric_OpNeqB(v)
293 case OpNeqInter:
294 return rewriteValuegeneric_OpNeqInter(v)
295 case OpNeqPtr:
296 return rewriteValuegeneric_OpNeqPtr(v)
297 case OpNeqSlice:
298 return rewriteValuegeneric_OpNeqSlice(v)
299 case OpNilCheck:
300 return rewriteValuegeneric_OpNilCheck(v)
301 case OpNot:
302 return rewriteValuegeneric_OpNot(v)
303 case OpOffPtr:
304 return rewriteValuegeneric_OpOffPtr(v)
305 case OpOr16:
306 return rewriteValuegeneric_OpOr16(v)
307 case OpOr32:
308 return rewriteValuegeneric_OpOr32(v)
309 case OpOr64:
310 return rewriteValuegeneric_OpOr64(v)
311 case OpOr8:
312 return rewriteValuegeneric_OpOr8(v)
313 case OpOrB:
314 return rewriteValuegeneric_OpOrB(v)
315 case OpPhi:
316 return rewriteValuegeneric_OpPhi(v)
317 case OpPopCount16:
318 return rewriteValuegeneric_OpPopCount16(v)
319 case OpPopCount32:
320 return rewriteValuegeneric_OpPopCount32(v)
321 case OpPopCount64:
322 return rewriteValuegeneric_OpPopCount64(v)
323 case OpPopCount8:
324 return rewriteValuegeneric_OpPopCount8(v)
325 case OpPtrIndex:
326 return rewriteValuegeneric_OpPtrIndex(v)
327 case OpRotateLeft16:
328 return rewriteValuegeneric_OpRotateLeft16(v)
329 case OpRotateLeft32:
330 return rewriteValuegeneric_OpRotateLeft32(v)
331 case OpRotateLeft64:
332 return rewriteValuegeneric_OpRotateLeft64(v)
333 case OpRotateLeft8:
334 return rewriteValuegeneric_OpRotateLeft8(v)
335 case OpRound32F:
336 return rewriteValuegeneric_OpRound32F(v)
337 case OpRound64F:
338 return rewriteValuegeneric_OpRound64F(v)
339 case OpRoundToEven:
340 return rewriteValuegeneric_OpRoundToEven(v)
341 case OpRsh16Ux16:
342 return rewriteValuegeneric_OpRsh16Ux16(v)
343 case OpRsh16Ux32:
344 return rewriteValuegeneric_OpRsh16Ux32(v)
345 case OpRsh16Ux64:
346 return rewriteValuegeneric_OpRsh16Ux64(v)
347 case OpRsh16Ux8:
348 return rewriteValuegeneric_OpRsh16Ux8(v)
349 case OpRsh16x16:
350 return rewriteValuegeneric_OpRsh16x16(v)
351 case OpRsh16x32:
352 return rewriteValuegeneric_OpRsh16x32(v)
353 case OpRsh16x64:
354 return rewriteValuegeneric_OpRsh16x64(v)
355 case OpRsh16x8:
356 return rewriteValuegeneric_OpRsh16x8(v)
357 case OpRsh32Ux16:
358 return rewriteValuegeneric_OpRsh32Ux16(v)
359 case OpRsh32Ux32:
360 return rewriteValuegeneric_OpRsh32Ux32(v)
361 case OpRsh32Ux64:
362 return rewriteValuegeneric_OpRsh32Ux64(v)
363 case OpRsh32Ux8:
364 return rewriteValuegeneric_OpRsh32Ux8(v)
365 case OpRsh32x16:
366 return rewriteValuegeneric_OpRsh32x16(v)
367 case OpRsh32x32:
368 return rewriteValuegeneric_OpRsh32x32(v)
369 case OpRsh32x64:
370 return rewriteValuegeneric_OpRsh32x64(v)
371 case OpRsh32x8:
372 return rewriteValuegeneric_OpRsh32x8(v)
373 case OpRsh64Ux16:
374 return rewriteValuegeneric_OpRsh64Ux16(v)
375 case OpRsh64Ux32:
376 return rewriteValuegeneric_OpRsh64Ux32(v)
377 case OpRsh64Ux64:
378 return rewriteValuegeneric_OpRsh64Ux64(v)
379 case OpRsh64Ux8:
380 return rewriteValuegeneric_OpRsh64Ux8(v)
381 case OpRsh64x16:
382 return rewriteValuegeneric_OpRsh64x16(v)
383 case OpRsh64x32:
384 return rewriteValuegeneric_OpRsh64x32(v)
385 case OpRsh64x64:
386 return rewriteValuegeneric_OpRsh64x64(v)
387 case OpRsh64x8:
388 return rewriteValuegeneric_OpRsh64x8(v)
389 case OpRsh8Ux16:
390 return rewriteValuegeneric_OpRsh8Ux16(v)
391 case OpRsh8Ux32:
392 return rewriteValuegeneric_OpRsh8Ux32(v)
393 case OpRsh8Ux64:
394 return rewriteValuegeneric_OpRsh8Ux64(v)
395 case OpRsh8Ux8:
396 return rewriteValuegeneric_OpRsh8Ux8(v)
397 case OpRsh8x16:
398 return rewriteValuegeneric_OpRsh8x16(v)
399 case OpRsh8x32:
400 return rewriteValuegeneric_OpRsh8x32(v)
401 case OpRsh8x64:
402 return rewriteValuegeneric_OpRsh8x64(v)
403 case OpRsh8x8:
404 return rewriteValuegeneric_OpRsh8x8(v)
405 case OpSelect0:
406 return rewriteValuegeneric_OpSelect0(v)
407 case OpSelect1:
408 return rewriteValuegeneric_OpSelect1(v)
409 case OpSelectN:
410 return rewriteValuegeneric_OpSelectN(v)
411 case OpSignExt16to32:
412 return rewriteValuegeneric_OpSignExt16to32(v)
413 case OpSignExt16to64:
414 return rewriteValuegeneric_OpSignExt16to64(v)
415 case OpSignExt32to64:
416 return rewriteValuegeneric_OpSignExt32to64(v)
417 case OpSignExt8to16:
418 return rewriteValuegeneric_OpSignExt8to16(v)
419 case OpSignExt8to32:
420 return rewriteValuegeneric_OpSignExt8to32(v)
421 case OpSignExt8to64:
422 return rewriteValuegeneric_OpSignExt8to64(v)
423 case OpSliceCap:
424 return rewriteValuegeneric_OpSliceCap(v)
425 case OpSliceLen:
426 return rewriteValuegeneric_OpSliceLen(v)
427 case OpSliceMake:
428 return rewriteValuegeneric_OpSliceMake(v)
429 case OpSlicePtr:
430 return rewriteValuegeneric_OpSlicePtr(v)
431 case OpSlicemask:
432 return rewriteValuegeneric_OpSlicemask(v)
433 case OpSqrt:
434 return rewriteValuegeneric_OpSqrt(v)
435 case OpStaticCall:
436 return rewriteValuegeneric_OpStaticCall(v)
437 case OpStaticLECall:
438 return rewriteValuegeneric_OpStaticLECall(v)
439 case OpStore:
440 return rewriteValuegeneric_OpStore(v)
441 case OpStringLen:
442 return rewriteValuegeneric_OpStringLen(v)
443 case OpStringPtr:
444 return rewriteValuegeneric_OpStringPtr(v)
445 case OpStructSelect:
446 return rewriteValuegeneric_OpStructSelect(v)
447 case OpSub16:
448 return rewriteValuegeneric_OpSub16(v)
449 case OpSub32:
450 return rewriteValuegeneric_OpSub32(v)
451 case OpSub32F:
452 return rewriteValuegeneric_OpSub32F(v)
453 case OpSub64:
454 return rewriteValuegeneric_OpSub64(v)
455 case OpSub64F:
456 return rewriteValuegeneric_OpSub64F(v)
457 case OpSub8:
458 return rewriteValuegeneric_OpSub8(v)
459 case OpTrunc:
460 return rewriteValuegeneric_OpTrunc(v)
461 case OpTrunc16to8:
462 return rewriteValuegeneric_OpTrunc16to8(v)
463 case OpTrunc32to16:
464 return rewriteValuegeneric_OpTrunc32to16(v)
465 case OpTrunc32to8:
466 return rewriteValuegeneric_OpTrunc32to8(v)
467 case OpTrunc64to16:
468 return rewriteValuegeneric_OpTrunc64to16(v)
469 case OpTrunc64to32:
470 return rewriteValuegeneric_OpTrunc64to32(v)
471 case OpTrunc64to8:
472 return rewriteValuegeneric_OpTrunc64to8(v)
473 case OpXor16:
474 return rewriteValuegeneric_OpXor16(v)
475 case OpXor32:
476 return rewriteValuegeneric_OpXor32(v)
477 case OpXor64:
478 return rewriteValuegeneric_OpXor64(v)
479 case OpXor8:
480 return rewriteValuegeneric_OpXor8(v)
481 case OpZero:
482 return rewriteValuegeneric_OpZero(v)
483 case OpZeroExt16to32:
484 return rewriteValuegeneric_OpZeroExt16to32(v)
485 case OpZeroExt16to64:
486 return rewriteValuegeneric_OpZeroExt16to64(v)
487 case OpZeroExt32to64:
488 return rewriteValuegeneric_OpZeroExt32to64(v)
489 case OpZeroExt8to16:
490 return rewriteValuegeneric_OpZeroExt8to16(v)
491 case OpZeroExt8to32:
492 return rewriteValuegeneric_OpZeroExt8to32(v)
493 case OpZeroExt8to64:
494 return rewriteValuegeneric_OpZeroExt8to64(v)
495 }
496 return false
497 }
498 func rewriteValuegeneric_OpAdd16(v *Value) bool {
499 v_1 := v.Args[1]
500 v_0 := v.Args[0]
501 b := v.Block
502 config := b.Func.Config
503
504
505 for {
506 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
507 if v_0.Op != OpConst16 {
508 continue
509 }
510 c := auxIntToInt16(v_0.AuxInt)
511 if v_1.Op != OpConst16 {
512 continue
513 }
514 d := auxIntToInt16(v_1.AuxInt)
515 v.reset(OpConst16)
516 v.AuxInt = int16ToAuxInt(c + d)
517 return true
518 }
519 break
520 }
521
522
523 for {
524 t := v.Type
525 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
526 if v_0.Op != OpMul16 {
527 continue
528 }
529 _ = v_0.Args[1]
530 v_0_0 := v_0.Args[0]
531 v_0_1 := v_0.Args[1]
532 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
533 x := v_0_0
534 y := v_0_1
535 if v_1.Op != OpMul16 {
536 continue
537 }
538 _ = v_1.Args[1]
539 v_1_0 := v_1.Args[0]
540 v_1_1 := v_1.Args[1]
541 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
542 if x != v_1_0 {
543 continue
544 }
545 z := v_1_1
546 v.reset(OpMul16)
547 v0 := b.NewValue0(v.Pos, OpAdd16, t)
548 v0.AddArg2(y, z)
549 v.AddArg2(x, v0)
550 return true
551 }
552 }
553 }
554 break
555 }
556
557
558 for {
559 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
560 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
561 continue
562 }
563 x := v_1
564 v.copyOf(x)
565 return true
566 }
567 break
568 }
569
570
571 for {
572 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
573 x := v_0
574 if v_1.Op != OpNeg16 {
575 continue
576 }
577 y := v_1.Args[0]
578 v.reset(OpSub16)
579 v.AddArg2(x, y)
580 return true
581 }
582 break
583 }
584
585
586 for {
587 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
588 if v_0.Op != OpCom16 {
589 continue
590 }
591 x := v_0.Args[0]
592 if x != v_1 {
593 continue
594 }
595 v.reset(OpConst16)
596 v.AuxInt = int16ToAuxInt(-1)
597 return true
598 }
599 break
600 }
601
602
603 for {
604 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
605 if v_0.Op != OpSub16 {
606 continue
607 }
608 t := v_0.Args[1]
609 x := v_0.Args[0]
610 if v_1.Op != OpAdd16 {
611 continue
612 }
613 _ = v_1.Args[1]
614 v_1_0 := v_1.Args[0]
615 v_1_1 := v_1.Args[1]
616 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
617 if t != v_1_0 {
618 continue
619 }
620 y := v_1_1
621 v.reset(OpAdd16)
622 v.AddArg2(x, y)
623 return true
624 }
625 }
626 break
627 }
628
629
630 for {
631 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
632 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 1 || v_1.Op != OpCom16 {
633 continue
634 }
635 x := v_1.Args[0]
636 v.reset(OpNeg16)
637 v.AddArg(x)
638 return true
639 }
640 break
641 }
642
643
644 for {
645 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
646 x := v_0
647 if v_1.Op != OpSub16 {
648 continue
649 }
650 _ = v_1.Args[1]
651 y := v_1.Args[0]
652 if x != v_1.Args[1] {
653 continue
654 }
655 v.copyOf(y)
656 return true
657 }
658 break
659 }
660
661
662 for {
663 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
664 x := v_0
665 if v_1.Op != OpAdd16 {
666 continue
667 }
668 _ = v_1.Args[1]
669 v_1_0 := v_1.Args[0]
670 v_1_1 := v_1.Args[1]
671 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
672 y := v_1_0
673 if v_1_1.Op != OpSub16 {
674 continue
675 }
676 _ = v_1_1.Args[1]
677 z := v_1_1.Args[0]
678 if x != v_1_1.Args[1] {
679 continue
680 }
681 v.reset(OpAdd16)
682 v.AddArg2(y, z)
683 return true
684 }
685 }
686 break
687 }
688
689
690
691 for {
692 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
693 if v_0.Op != OpAdd16 {
694 continue
695 }
696 _ = v_0.Args[1]
697 v_0_0 := v_0.Args[0]
698 v_0_1 := v_0.Args[1]
699 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
700 i := v_0_0
701 if i.Op != OpConst16 {
702 continue
703 }
704 t := i.Type
705 z := v_0_1
706 x := v_1
707 if !(z.Op != OpConst16 && x.Op != OpConst16) {
708 continue
709 }
710 v.reset(OpAdd16)
711 v0 := b.NewValue0(v.Pos, OpAdd16, t)
712 v0.AddArg2(z, x)
713 v.AddArg2(i, v0)
714 return true
715 }
716 }
717 break
718 }
719
720
721
722 for {
723 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
724 if v_0.Op != OpSub16 {
725 continue
726 }
727 z := v_0.Args[1]
728 i := v_0.Args[0]
729 if i.Op != OpConst16 {
730 continue
731 }
732 t := i.Type
733 x := v_1
734 if !(z.Op != OpConst16 && x.Op != OpConst16) {
735 continue
736 }
737 v.reset(OpAdd16)
738 v0 := b.NewValue0(v.Pos, OpSub16, t)
739 v0.AddArg2(x, z)
740 v.AddArg2(i, v0)
741 return true
742 }
743 break
744 }
745
746
747 for {
748 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
749 if v_0.Op != OpConst16 {
750 continue
751 }
752 t := v_0.Type
753 c := auxIntToInt16(v_0.AuxInt)
754 if v_1.Op != OpAdd16 {
755 continue
756 }
757 _ = v_1.Args[1]
758 v_1_0 := v_1.Args[0]
759 v_1_1 := v_1.Args[1]
760 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
761 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
762 continue
763 }
764 d := auxIntToInt16(v_1_0.AuxInt)
765 x := v_1_1
766 v.reset(OpAdd16)
767 v0 := b.NewValue0(v.Pos, OpConst16, t)
768 v0.AuxInt = int16ToAuxInt(c + d)
769 v.AddArg2(v0, x)
770 return true
771 }
772 }
773 break
774 }
775
776
777 for {
778 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
779 if v_0.Op != OpConst16 {
780 continue
781 }
782 t := v_0.Type
783 c := auxIntToInt16(v_0.AuxInt)
784 if v_1.Op != OpSub16 {
785 continue
786 }
787 x := v_1.Args[1]
788 v_1_0 := v_1.Args[0]
789 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
790 continue
791 }
792 d := auxIntToInt16(v_1_0.AuxInt)
793 v.reset(OpSub16)
794 v0 := b.NewValue0(v.Pos, OpConst16, t)
795 v0.AuxInt = int16ToAuxInt(c + d)
796 v.AddArg2(v0, x)
797 return true
798 }
799 break
800 }
801
802
803
804 for {
805 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
806 if v_0.Op != OpLsh16x64 {
807 continue
808 }
809 _ = v_0.Args[1]
810 x := v_0.Args[0]
811 z := v_0.Args[1]
812 if z.Op != OpConst64 {
813 continue
814 }
815 c := auxIntToInt64(z.AuxInt)
816 if v_1.Op != OpRsh16Ux64 {
817 continue
818 }
819 _ = v_1.Args[1]
820 if x != v_1.Args[0] {
821 continue
822 }
823 v_1_1 := v_1.Args[1]
824 if v_1_1.Op != OpConst64 {
825 continue
826 }
827 d := auxIntToInt64(v_1_1.AuxInt)
828 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
829 continue
830 }
831 v.reset(OpRotateLeft16)
832 v.AddArg2(x, z)
833 return true
834 }
835 break
836 }
837
838
839
840 for {
841 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
842 left := v_0
843 if left.Op != OpLsh16x64 {
844 continue
845 }
846 y := left.Args[1]
847 x := left.Args[0]
848 right := v_1
849 if right.Op != OpRsh16Ux64 {
850 continue
851 }
852 _ = right.Args[1]
853 if x != right.Args[0] {
854 continue
855 }
856 right_1 := right.Args[1]
857 if right_1.Op != OpSub64 {
858 continue
859 }
860 _ = right_1.Args[1]
861 right_1_0 := right_1.Args[0]
862 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
863 continue
864 }
865 v.reset(OpRotateLeft16)
866 v.AddArg2(x, y)
867 return true
868 }
869 break
870 }
871
872
873
874 for {
875 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
876 left := v_0
877 if left.Op != OpLsh16x32 {
878 continue
879 }
880 y := left.Args[1]
881 x := left.Args[0]
882 right := v_1
883 if right.Op != OpRsh16Ux32 {
884 continue
885 }
886 _ = right.Args[1]
887 if x != right.Args[0] {
888 continue
889 }
890 right_1 := right.Args[1]
891 if right_1.Op != OpSub32 {
892 continue
893 }
894 _ = right_1.Args[1]
895 right_1_0 := right_1.Args[0]
896 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
897 continue
898 }
899 v.reset(OpRotateLeft16)
900 v.AddArg2(x, y)
901 return true
902 }
903 break
904 }
905
906
907
908 for {
909 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
910 left := v_0
911 if left.Op != OpLsh16x16 {
912 continue
913 }
914 y := left.Args[1]
915 x := left.Args[0]
916 right := v_1
917 if right.Op != OpRsh16Ux16 {
918 continue
919 }
920 _ = right.Args[1]
921 if x != right.Args[0] {
922 continue
923 }
924 right_1 := right.Args[1]
925 if right_1.Op != OpSub16 {
926 continue
927 }
928 _ = right_1.Args[1]
929 right_1_0 := right_1.Args[0]
930 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
931 continue
932 }
933 v.reset(OpRotateLeft16)
934 v.AddArg2(x, y)
935 return true
936 }
937 break
938 }
939
940
941
942 for {
943 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
944 left := v_0
945 if left.Op != OpLsh16x8 {
946 continue
947 }
948 y := left.Args[1]
949 x := left.Args[0]
950 right := v_1
951 if right.Op != OpRsh16Ux8 {
952 continue
953 }
954 _ = right.Args[1]
955 if x != right.Args[0] {
956 continue
957 }
958 right_1 := right.Args[1]
959 if right_1.Op != OpSub8 {
960 continue
961 }
962 _ = right_1.Args[1]
963 right_1_0 := right_1.Args[0]
964 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
965 continue
966 }
967 v.reset(OpRotateLeft16)
968 v.AddArg2(x, y)
969 return true
970 }
971 break
972 }
973
974
975
976 for {
977 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
978 right := v_0
979 if right.Op != OpRsh16Ux64 {
980 continue
981 }
982 y := right.Args[1]
983 x := right.Args[0]
984 left := v_1
985 if left.Op != OpLsh16x64 {
986 continue
987 }
988 _ = left.Args[1]
989 if x != left.Args[0] {
990 continue
991 }
992 z := left.Args[1]
993 if z.Op != OpSub64 {
994 continue
995 }
996 _ = z.Args[1]
997 z_0 := z.Args[0]
998 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
999 continue
1000 }
1001 v.reset(OpRotateLeft16)
1002 v.AddArg2(x, z)
1003 return true
1004 }
1005 break
1006 }
1007
1008
1009
1010 for {
1011 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1012 right := v_0
1013 if right.Op != OpRsh16Ux32 {
1014 continue
1015 }
1016 y := right.Args[1]
1017 x := right.Args[0]
1018 left := v_1
1019 if left.Op != OpLsh16x32 {
1020 continue
1021 }
1022 _ = left.Args[1]
1023 if x != left.Args[0] {
1024 continue
1025 }
1026 z := left.Args[1]
1027 if z.Op != OpSub32 {
1028 continue
1029 }
1030 _ = z.Args[1]
1031 z_0 := z.Args[0]
1032 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1033 continue
1034 }
1035 v.reset(OpRotateLeft16)
1036 v.AddArg2(x, z)
1037 return true
1038 }
1039 break
1040 }
1041
1042
1043
1044 for {
1045 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1046 right := v_0
1047 if right.Op != OpRsh16Ux16 {
1048 continue
1049 }
1050 y := right.Args[1]
1051 x := right.Args[0]
1052 left := v_1
1053 if left.Op != OpLsh16x16 {
1054 continue
1055 }
1056 _ = left.Args[1]
1057 if x != left.Args[0] {
1058 continue
1059 }
1060 z := left.Args[1]
1061 if z.Op != OpSub16 {
1062 continue
1063 }
1064 _ = z.Args[1]
1065 z_0 := z.Args[0]
1066 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1067 continue
1068 }
1069 v.reset(OpRotateLeft16)
1070 v.AddArg2(x, z)
1071 return true
1072 }
1073 break
1074 }
1075
1076
1077
1078 for {
1079 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1080 right := v_0
1081 if right.Op != OpRsh16Ux8 {
1082 continue
1083 }
1084 y := right.Args[1]
1085 x := right.Args[0]
1086 left := v_1
1087 if left.Op != OpLsh16x8 {
1088 continue
1089 }
1090 _ = left.Args[1]
1091 if x != left.Args[0] {
1092 continue
1093 }
1094 z := left.Args[1]
1095 if z.Op != OpSub8 {
1096 continue
1097 }
1098 _ = z.Args[1]
1099 z_0 := z.Args[0]
1100 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1101 continue
1102 }
1103 v.reset(OpRotateLeft16)
1104 v.AddArg2(x, z)
1105 return true
1106 }
1107 break
1108 }
1109 return false
1110 }
1111 func rewriteValuegeneric_OpAdd32(v *Value) bool {
1112 v_1 := v.Args[1]
1113 v_0 := v.Args[0]
1114 b := v.Block
1115 config := b.Func.Config
1116
1117
1118 for {
1119 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1120 if v_0.Op != OpConst32 {
1121 continue
1122 }
1123 c := auxIntToInt32(v_0.AuxInt)
1124 if v_1.Op != OpConst32 {
1125 continue
1126 }
1127 d := auxIntToInt32(v_1.AuxInt)
1128 v.reset(OpConst32)
1129 v.AuxInt = int32ToAuxInt(c + d)
1130 return true
1131 }
1132 break
1133 }
1134
1135
1136 for {
1137 t := v.Type
1138 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1139 if v_0.Op != OpMul32 {
1140 continue
1141 }
1142 _ = v_0.Args[1]
1143 v_0_0 := v_0.Args[0]
1144 v_0_1 := v_0.Args[1]
1145 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1146 x := v_0_0
1147 y := v_0_1
1148 if v_1.Op != OpMul32 {
1149 continue
1150 }
1151 _ = v_1.Args[1]
1152 v_1_0 := v_1.Args[0]
1153 v_1_1 := v_1.Args[1]
1154 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
1155 if x != v_1_0 {
1156 continue
1157 }
1158 z := v_1_1
1159 v.reset(OpMul32)
1160 v0 := b.NewValue0(v.Pos, OpAdd32, t)
1161 v0.AddArg2(y, z)
1162 v.AddArg2(x, v0)
1163 return true
1164 }
1165 }
1166 }
1167 break
1168 }
1169
1170
1171 for {
1172 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1173 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
1174 continue
1175 }
1176 x := v_1
1177 v.copyOf(x)
1178 return true
1179 }
1180 break
1181 }
1182
1183
1184 for {
1185 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1186 x := v_0
1187 if v_1.Op != OpNeg32 {
1188 continue
1189 }
1190 y := v_1.Args[0]
1191 v.reset(OpSub32)
1192 v.AddArg2(x, y)
1193 return true
1194 }
1195 break
1196 }
1197
1198
1199 for {
1200 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1201 if v_0.Op != OpCom32 {
1202 continue
1203 }
1204 x := v_0.Args[0]
1205 if x != v_1 {
1206 continue
1207 }
1208 v.reset(OpConst32)
1209 v.AuxInt = int32ToAuxInt(-1)
1210 return true
1211 }
1212 break
1213 }
1214
1215
1216 for {
1217 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1218 if v_0.Op != OpSub32 {
1219 continue
1220 }
1221 t := v_0.Args[1]
1222 x := v_0.Args[0]
1223 if v_1.Op != OpAdd32 {
1224 continue
1225 }
1226 _ = v_1.Args[1]
1227 v_1_0 := v_1.Args[0]
1228 v_1_1 := v_1.Args[1]
1229 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1230 if t != v_1_0 {
1231 continue
1232 }
1233 y := v_1_1
1234 v.reset(OpAdd32)
1235 v.AddArg2(x, y)
1236 return true
1237 }
1238 }
1239 break
1240 }
1241
1242
1243 for {
1244 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1245 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 || v_1.Op != OpCom32 {
1246 continue
1247 }
1248 x := v_1.Args[0]
1249 v.reset(OpNeg32)
1250 v.AddArg(x)
1251 return true
1252 }
1253 break
1254 }
1255
1256
1257 for {
1258 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1259 x := v_0
1260 if v_1.Op != OpSub32 {
1261 continue
1262 }
1263 _ = v_1.Args[1]
1264 y := v_1.Args[0]
1265 if x != v_1.Args[1] {
1266 continue
1267 }
1268 v.copyOf(y)
1269 return true
1270 }
1271 break
1272 }
1273
1274
1275 for {
1276 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1277 x := v_0
1278 if v_1.Op != OpAdd32 {
1279 continue
1280 }
1281 _ = v_1.Args[1]
1282 v_1_0 := v_1.Args[0]
1283 v_1_1 := v_1.Args[1]
1284 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1285 y := v_1_0
1286 if v_1_1.Op != OpSub32 {
1287 continue
1288 }
1289 _ = v_1_1.Args[1]
1290 z := v_1_1.Args[0]
1291 if x != v_1_1.Args[1] {
1292 continue
1293 }
1294 v.reset(OpAdd32)
1295 v.AddArg2(y, z)
1296 return true
1297 }
1298 }
1299 break
1300 }
1301
1302
1303
1304 for {
1305 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1306 if v_0.Op != OpAdd32 {
1307 continue
1308 }
1309 _ = v_0.Args[1]
1310 v_0_0 := v_0.Args[0]
1311 v_0_1 := v_0.Args[1]
1312 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1313 i := v_0_0
1314 if i.Op != OpConst32 {
1315 continue
1316 }
1317 t := i.Type
1318 z := v_0_1
1319 x := v_1
1320 if !(z.Op != OpConst32 && x.Op != OpConst32) {
1321 continue
1322 }
1323 v.reset(OpAdd32)
1324 v0 := b.NewValue0(v.Pos, OpAdd32, t)
1325 v0.AddArg2(z, x)
1326 v.AddArg2(i, v0)
1327 return true
1328 }
1329 }
1330 break
1331 }
1332
1333
1334
1335 for {
1336 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1337 if v_0.Op != OpSub32 {
1338 continue
1339 }
1340 z := v_0.Args[1]
1341 i := v_0.Args[0]
1342 if i.Op != OpConst32 {
1343 continue
1344 }
1345 t := i.Type
1346 x := v_1
1347 if !(z.Op != OpConst32 && x.Op != OpConst32) {
1348 continue
1349 }
1350 v.reset(OpAdd32)
1351 v0 := b.NewValue0(v.Pos, OpSub32, t)
1352 v0.AddArg2(x, z)
1353 v.AddArg2(i, v0)
1354 return true
1355 }
1356 break
1357 }
1358
1359
1360 for {
1361 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1362 if v_0.Op != OpConst32 {
1363 continue
1364 }
1365 t := v_0.Type
1366 c := auxIntToInt32(v_0.AuxInt)
1367 if v_1.Op != OpAdd32 {
1368 continue
1369 }
1370 _ = v_1.Args[1]
1371 v_1_0 := v_1.Args[0]
1372 v_1_1 := v_1.Args[1]
1373 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1374 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
1375 continue
1376 }
1377 d := auxIntToInt32(v_1_0.AuxInt)
1378 x := v_1_1
1379 v.reset(OpAdd32)
1380 v0 := b.NewValue0(v.Pos, OpConst32, t)
1381 v0.AuxInt = int32ToAuxInt(c + d)
1382 v.AddArg2(v0, x)
1383 return true
1384 }
1385 }
1386 break
1387 }
1388
1389
1390 for {
1391 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1392 if v_0.Op != OpConst32 {
1393 continue
1394 }
1395 t := v_0.Type
1396 c := auxIntToInt32(v_0.AuxInt)
1397 if v_1.Op != OpSub32 {
1398 continue
1399 }
1400 x := v_1.Args[1]
1401 v_1_0 := v_1.Args[0]
1402 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
1403 continue
1404 }
1405 d := auxIntToInt32(v_1_0.AuxInt)
1406 v.reset(OpSub32)
1407 v0 := b.NewValue0(v.Pos, OpConst32, t)
1408 v0.AuxInt = int32ToAuxInt(c + d)
1409 v.AddArg2(v0, x)
1410 return true
1411 }
1412 break
1413 }
1414
1415
1416
1417 for {
1418 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1419 if v_0.Op != OpLsh32x64 {
1420 continue
1421 }
1422 _ = v_0.Args[1]
1423 x := v_0.Args[0]
1424 z := v_0.Args[1]
1425 if z.Op != OpConst64 {
1426 continue
1427 }
1428 c := auxIntToInt64(z.AuxInt)
1429 if v_1.Op != OpRsh32Ux64 {
1430 continue
1431 }
1432 _ = v_1.Args[1]
1433 if x != v_1.Args[0] {
1434 continue
1435 }
1436 v_1_1 := v_1.Args[1]
1437 if v_1_1.Op != OpConst64 {
1438 continue
1439 }
1440 d := auxIntToInt64(v_1_1.AuxInt)
1441 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
1442 continue
1443 }
1444 v.reset(OpRotateLeft32)
1445 v.AddArg2(x, z)
1446 return true
1447 }
1448 break
1449 }
1450
1451
1452
1453 for {
1454 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1455 left := v_0
1456 if left.Op != OpLsh32x64 {
1457 continue
1458 }
1459 y := left.Args[1]
1460 x := left.Args[0]
1461 right := v_1
1462 if right.Op != OpRsh32Ux64 {
1463 continue
1464 }
1465 _ = right.Args[1]
1466 if x != right.Args[0] {
1467 continue
1468 }
1469 right_1 := right.Args[1]
1470 if right_1.Op != OpSub64 {
1471 continue
1472 }
1473 _ = right_1.Args[1]
1474 right_1_0 := right_1.Args[0]
1475 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1476 continue
1477 }
1478 v.reset(OpRotateLeft32)
1479 v.AddArg2(x, y)
1480 return true
1481 }
1482 break
1483 }
1484
1485
1486
1487 for {
1488 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1489 left := v_0
1490 if left.Op != OpLsh32x32 {
1491 continue
1492 }
1493 y := left.Args[1]
1494 x := left.Args[0]
1495 right := v_1
1496 if right.Op != OpRsh32Ux32 {
1497 continue
1498 }
1499 _ = right.Args[1]
1500 if x != right.Args[0] {
1501 continue
1502 }
1503 right_1 := right.Args[1]
1504 if right_1.Op != OpSub32 {
1505 continue
1506 }
1507 _ = right_1.Args[1]
1508 right_1_0 := right_1.Args[0]
1509 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1510 continue
1511 }
1512 v.reset(OpRotateLeft32)
1513 v.AddArg2(x, y)
1514 return true
1515 }
1516 break
1517 }
1518
1519
1520
1521 for {
1522 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1523 left := v_0
1524 if left.Op != OpLsh32x16 {
1525 continue
1526 }
1527 y := left.Args[1]
1528 x := left.Args[0]
1529 right := v_1
1530 if right.Op != OpRsh32Ux16 {
1531 continue
1532 }
1533 _ = right.Args[1]
1534 if x != right.Args[0] {
1535 continue
1536 }
1537 right_1 := right.Args[1]
1538 if right_1.Op != OpSub16 {
1539 continue
1540 }
1541 _ = right_1.Args[1]
1542 right_1_0 := right_1.Args[0]
1543 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1544 continue
1545 }
1546 v.reset(OpRotateLeft32)
1547 v.AddArg2(x, y)
1548 return true
1549 }
1550 break
1551 }
1552
1553
1554
1555 for {
1556 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1557 left := v_0
1558 if left.Op != OpLsh32x8 {
1559 continue
1560 }
1561 y := left.Args[1]
1562 x := left.Args[0]
1563 right := v_1
1564 if right.Op != OpRsh32Ux8 {
1565 continue
1566 }
1567 _ = right.Args[1]
1568 if x != right.Args[0] {
1569 continue
1570 }
1571 right_1 := right.Args[1]
1572 if right_1.Op != OpSub8 {
1573 continue
1574 }
1575 _ = right_1.Args[1]
1576 right_1_0 := right_1.Args[0]
1577 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1578 continue
1579 }
1580 v.reset(OpRotateLeft32)
1581 v.AddArg2(x, y)
1582 return true
1583 }
1584 break
1585 }
1586
1587
1588
1589 for {
1590 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1591 right := v_0
1592 if right.Op != OpRsh32Ux64 {
1593 continue
1594 }
1595 y := right.Args[1]
1596 x := right.Args[0]
1597 left := v_1
1598 if left.Op != OpLsh32x64 {
1599 continue
1600 }
1601 _ = left.Args[1]
1602 if x != left.Args[0] {
1603 continue
1604 }
1605 z := left.Args[1]
1606 if z.Op != OpSub64 {
1607 continue
1608 }
1609 _ = z.Args[1]
1610 z_0 := z.Args[0]
1611 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1612 continue
1613 }
1614 v.reset(OpRotateLeft32)
1615 v.AddArg2(x, z)
1616 return true
1617 }
1618 break
1619 }
1620
1621
1622
1623 for {
1624 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1625 right := v_0
1626 if right.Op != OpRsh32Ux32 {
1627 continue
1628 }
1629 y := right.Args[1]
1630 x := right.Args[0]
1631 left := v_1
1632 if left.Op != OpLsh32x32 {
1633 continue
1634 }
1635 _ = left.Args[1]
1636 if x != left.Args[0] {
1637 continue
1638 }
1639 z := left.Args[1]
1640 if z.Op != OpSub32 {
1641 continue
1642 }
1643 _ = z.Args[1]
1644 z_0 := z.Args[0]
1645 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1646 continue
1647 }
1648 v.reset(OpRotateLeft32)
1649 v.AddArg2(x, z)
1650 return true
1651 }
1652 break
1653 }
1654
1655
1656
1657 for {
1658 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1659 right := v_0
1660 if right.Op != OpRsh32Ux16 {
1661 continue
1662 }
1663 y := right.Args[1]
1664 x := right.Args[0]
1665 left := v_1
1666 if left.Op != OpLsh32x16 {
1667 continue
1668 }
1669 _ = left.Args[1]
1670 if x != left.Args[0] {
1671 continue
1672 }
1673 z := left.Args[1]
1674 if z.Op != OpSub16 {
1675 continue
1676 }
1677 _ = z.Args[1]
1678 z_0 := z.Args[0]
1679 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1680 continue
1681 }
1682 v.reset(OpRotateLeft32)
1683 v.AddArg2(x, z)
1684 return true
1685 }
1686 break
1687 }
1688
1689
1690
1691 for {
1692 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1693 right := v_0
1694 if right.Op != OpRsh32Ux8 {
1695 continue
1696 }
1697 y := right.Args[1]
1698 x := right.Args[0]
1699 left := v_1
1700 if left.Op != OpLsh32x8 {
1701 continue
1702 }
1703 _ = left.Args[1]
1704 if x != left.Args[0] {
1705 continue
1706 }
1707 z := left.Args[1]
1708 if z.Op != OpSub8 {
1709 continue
1710 }
1711 _ = z.Args[1]
1712 z_0 := z.Args[0]
1713 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1714 continue
1715 }
1716 v.reset(OpRotateLeft32)
1717 v.AddArg2(x, z)
1718 return true
1719 }
1720 break
1721 }
1722 return false
1723 }
1724 func rewriteValuegeneric_OpAdd32F(v *Value) bool {
1725 v_1 := v.Args[1]
1726 v_0 := v.Args[0]
1727
1728
1729
1730 for {
1731 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1732 if v_0.Op != OpConst32F {
1733 continue
1734 }
1735 c := auxIntToFloat32(v_0.AuxInt)
1736 if v_1.Op != OpConst32F {
1737 continue
1738 }
1739 d := auxIntToFloat32(v_1.AuxInt)
1740 if !(c+d == c+d) {
1741 continue
1742 }
1743 v.reset(OpConst32F)
1744 v.AuxInt = float32ToAuxInt(c + d)
1745 return true
1746 }
1747 break
1748 }
1749 return false
1750 }
1751 func rewriteValuegeneric_OpAdd64(v *Value) bool {
1752 v_1 := v.Args[1]
1753 v_0 := v.Args[0]
1754 b := v.Block
1755 config := b.Func.Config
1756
1757
1758 for {
1759 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1760 if v_0.Op != OpConst64 {
1761 continue
1762 }
1763 c := auxIntToInt64(v_0.AuxInt)
1764 if v_1.Op != OpConst64 {
1765 continue
1766 }
1767 d := auxIntToInt64(v_1.AuxInt)
1768 v.reset(OpConst64)
1769 v.AuxInt = int64ToAuxInt(c + d)
1770 return true
1771 }
1772 break
1773 }
1774
1775
1776 for {
1777 t := v.Type
1778 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1779 if v_0.Op != OpMul64 {
1780 continue
1781 }
1782 _ = v_0.Args[1]
1783 v_0_0 := v_0.Args[0]
1784 v_0_1 := v_0.Args[1]
1785 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1786 x := v_0_0
1787 y := v_0_1
1788 if v_1.Op != OpMul64 {
1789 continue
1790 }
1791 _ = v_1.Args[1]
1792 v_1_0 := v_1.Args[0]
1793 v_1_1 := v_1.Args[1]
1794 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
1795 if x != v_1_0 {
1796 continue
1797 }
1798 z := v_1_1
1799 v.reset(OpMul64)
1800 v0 := b.NewValue0(v.Pos, OpAdd64, t)
1801 v0.AddArg2(y, z)
1802 v.AddArg2(x, v0)
1803 return true
1804 }
1805 }
1806 }
1807 break
1808 }
1809
1810
1811 for {
1812 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1813 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
1814 continue
1815 }
1816 x := v_1
1817 v.copyOf(x)
1818 return true
1819 }
1820 break
1821 }
1822
1823
1824 for {
1825 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1826 x := v_0
1827 if v_1.Op != OpNeg64 {
1828 continue
1829 }
1830 y := v_1.Args[0]
1831 v.reset(OpSub64)
1832 v.AddArg2(x, y)
1833 return true
1834 }
1835 break
1836 }
1837
1838
1839 for {
1840 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1841 if v_0.Op != OpCom64 {
1842 continue
1843 }
1844 x := v_0.Args[0]
1845 if x != v_1 {
1846 continue
1847 }
1848 v.reset(OpConst64)
1849 v.AuxInt = int64ToAuxInt(-1)
1850 return true
1851 }
1852 break
1853 }
1854
1855
1856 for {
1857 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1858 if v_0.Op != OpSub64 {
1859 continue
1860 }
1861 t := v_0.Args[1]
1862 x := v_0.Args[0]
1863 if v_1.Op != OpAdd64 {
1864 continue
1865 }
1866 _ = v_1.Args[1]
1867 v_1_0 := v_1.Args[0]
1868 v_1_1 := v_1.Args[1]
1869 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1870 if t != v_1_0 {
1871 continue
1872 }
1873 y := v_1_1
1874 v.reset(OpAdd64)
1875 v.AddArg2(x, y)
1876 return true
1877 }
1878 }
1879 break
1880 }
1881
1882
1883 for {
1884 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1885 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 || v_1.Op != OpCom64 {
1886 continue
1887 }
1888 x := v_1.Args[0]
1889 v.reset(OpNeg64)
1890 v.AddArg(x)
1891 return true
1892 }
1893 break
1894 }
1895
1896
1897 for {
1898 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1899 x := v_0
1900 if v_1.Op != OpSub64 {
1901 continue
1902 }
1903 _ = v_1.Args[1]
1904 y := v_1.Args[0]
1905 if x != v_1.Args[1] {
1906 continue
1907 }
1908 v.copyOf(y)
1909 return true
1910 }
1911 break
1912 }
1913
1914
1915 for {
1916 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1917 x := v_0
1918 if v_1.Op != OpAdd64 {
1919 continue
1920 }
1921 _ = v_1.Args[1]
1922 v_1_0 := v_1.Args[0]
1923 v_1_1 := v_1.Args[1]
1924 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1925 y := v_1_0
1926 if v_1_1.Op != OpSub64 {
1927 continue
1928 }
1929 _ = v_1_1.Args[1]
1930 z := v_1_1.Args[0]
1931 if x != v_1_1.Args[1] {
1932 continue
1933 }
1934 v.reset(OpAdd64)
1935 v.AddArg2(y, z)
1936 return true
1937 }
1938 }
1939 break
1940 }
1941
1942
1943
1944 for {
1945 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1946 if v_0.Op != OpAdd64 {
1947 continue
1948 }
1949 _ = v_0.Args[1]
1950 v_0_0 := v_0.Args[0]
1951 v_0_1 := v_0.Args[1]
1952 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1953 i := v_0_0
1954 if i.Op != OpConst64 {
1955 continue
1956 }
1957 t := i.Type
1958 z := v_0_1
1959 x := v_1
1960 if !(z.Op != OpConst64 && x.Op != OpConst64) {
1961 continue
1962 }
1963 v.reset(OpAdd64)
1964 v0 := b.NewValue0(v.Pos, OpAdd64, t)
1965 v0.AddArg2(z, x)
1966 v.AddArg2(i, v0)
1967 return true
1968 }
1969 }
1970 break
1971 }
1972
1973
1974
1975 for {
1976 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1977 if v_0.Op != OpSub64 {
1978 continue
1979 }
1980 z := v_0.Args[1]
1981 i := v_0.Args[0]
1982 if i.Op != OpConst64 {
1983 continue
1984 }
1985 t := i.Type
1986 x := v_1
1987 if !(z.Op != OpConst64 && x.Op != OpConst64) {
1988 continue
1989 }
1990 v.reset(OpAdd64)
1991 v0 := b.NewValue0(v.Pos, OpSub64, t)
1992 v0.AddArg2(x, z)
1993 v.AddArg2(i, v0)
1994 return true
1995 }
1996 break
1997 }
1998
1999
2000 for {
2001 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2002 if v_0.Op != OpConst64 {
2003 continue
2004 }
2005 t := v_0.Type
2006 c := auxIntToInt64(v_0.AuxInt)
2007 if v_1.Op != OpAdd64 {
2008 continue
2009 }
2010 _ = v_1.Args[1]
2011 v_1_0 := v_1.Args[0]
2012 v_1_1 := v_1.Args[1]
2013 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2014 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
2015 continue
2016 }
2017 d := auxIntToInt64(v_1_0.AuxInt)
2018 x := v_1_1
2019 v.reset(OpAdd64)
2020 v0 := b.NewValue0(v.Pos, OpConst64, t)
2021 v0.AuxInt = int64ToAuxInt(c + d)
2022 v.AddArg2(v0, x)
2023 return true
2024 }
2025 }
2026 break
2027 }
2028
2029
2030 for {
2031 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2032 if v_0.Op != OpConst64 {
2033 continue
2034 }
2035 t := v_0.Type
2036 c := auxIntToInt64(v_0.AuxInt)
2037 if v_1.Op != OpSub64 {
2038 continue
2039 }
2040 x := v_1.Args[1]
2041 v_1_0 := v_1.Args[0]
2042 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
2043 continue
2044 }
2045 d := auxIntToInt64(v_1_0.AuxInt)
2046 v.reset(OpSub64)
2047 v0 := b.NewValue0(v.Pos, OpConst64, t)
2048 v0.AuxInt = int64ToAuxInt(c + d)
2049 v.AddArg2(v0, x)
2050 return true
2051 }
2052 break
2053 }
2054
2055
2056
2057 for {
2058 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2059 if v_0.Op != OpLsh64x64 {
2060 continue
2061 }
2062 _ = v_0.Args[1]
2063 x := v_0.Args[0]
2064 z := v_0.Args[1]
2065 if z.Op != OpConst64 {
2066 continue
2067 }
2068 c := auxIntToInt64(z.AuxInt)
2069 if v_1.Op != OpRsh64Ux64 {
2070 continue
2071 }
2072 _ = v_1.Args[1]
2073 if x != v_1.Args[0] {
2074 continue
2075 }
2076 v_1_1 := v_1.Args[1]
2077 if v_1_1.Op != OpConst64 {
2078 continue
2079 }
2080 d := auxIntToInt64(v_1_1.AuxInt)
2081 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
2082 continue
2083 }
2084 v.reset(OpRotateLeft64)
2085 v.AddArg2(x, z)
2086 return true
2087 }
2088 break
2089 }
2090
2091
2092
2093 for {
2094 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2095 left := v_0
2096 if left.Op != OpLsh64x64 {
2097 continue
2098 }
2099 y := left.Args[1]
2100 x := left.Args[0]
2101 right := v_1
2102 if right.Op != OpRsh64Ux64 {
2103 continue
2104 }
2105 _ = right.Args[1]
2106 if x != right.Args[0] {
2107 continue
2108 }
2109 right_1 := right.Args[1]
2110 if right_1.Op != OpSub64 {
2111 continue
2112 }
2113 _ = right_1.Args[1]
2114 right_1_0 := right_1.Args[0]
2115 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2116 continue
2117 }
2118 v.reset(OpRotateLeft64)
2119 v.AddArg2(x, y)
2120 return true
2121 }
2122 break
2123 }
2124
2125
2126
2127 for {
2128 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2129 left := v_0
2130 if left.Op != OpLsh64x32 {
2131 continue
2132 }
2133 y := left.Args[1]
2134 x := left.Args[0]
2135 right := v_1
2136 if right.Op != OpRsh64Ux32 {
2137 continue
2138 }
2139 _ = right.Args[1]
2140 if x != right.Args[0] {
2141 continue
2142 }
2143 right_1 := right.Args[1]
2144 if right_1.Op != OpSub32 {
2145 continue
2146 }
2147 _ = right_1.Args[1]
2148 right_1_0 := right_1.Args[0]
2149 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2150 continue
2151 }
2152 v.reset(OpRotateLeft64)
2153 v.AddArg2(x, y)
2154 return true
2155 }
2156 break
2157 }
2158
2159
2160
2161 for {
2162 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2163 left := v_0
2164 if left.Op != OpLsh64x16 {
2165 continue
2166 }
2167 y := left.Args[1]
2168 x := left.Args[0]
2169 right := v_1
2170 if right.Op != OpRsh64Ux16 {
2171 continue
2172 }
2173 _ = right.Args[1]
2174 if x != right.Args[0] {
2175 continue
2176 }
2177 right_1 := right.Args[1]
2178 if right_1.Op != OpSub16 {
2179 continue
2180 }
2181 _ = right_1.Args[1]
2182 right_1_0 := right_1.Args[0]
2183 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2184 continue
2185 }
2186 v.reset(OpRotateLeft64)
2187 v.AddArg2(x, y)
2188 return true
2189 }
2190 break
2191 }
2192
2193
2194
2195 for {
2196 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2197 left := v_0
2198 if left.Op != OpLsh64x8 {
2199 continue
2200 }
2201 y := left.Args[1]
2202 x := left.Args[0]
2203 right := v_1
2204 if right.Op != OpRsh64Ux8 {
2205 continue
2206 }
2207 _ = right.Args[1]
2208 if x != right.Args[0] {
2209 continue
2210 }
2211 right_1 := right.Args[1]
2212 if right_1.Op != OpSub8 {
2213 continue
2214 }
2215 _ = right_1.Args[1]
2216 right_1_0 := right_1.Args[0]
2217 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2218 continue
2219 }
2220 v.reset(OpRotateLeft64)
2221 v.AddArg2(x, y)
2222 return true
2223 }
2224 break
2225 }
2226
2227
2228
2229 for {
2230 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2231 right := v_0
2232 if right.Op != OpRsh64Ux64 {
2233 continue
2234 }
2235 y := right.Args[1]
2236 x := right.Args[0]
2237 left := v_1
2238 if left.Op != OpLsh64x64 {
2239 continue
2240 }
2241 _ = left.Args[1]
2242 if x != left.Args[0] {
2243 continue
2244 }
2245 z := left.Args[1]
2246 if z.Op != OpSub64 {
2247 continue
2248 }
2249 _ = z.Args[1]
2250 z_0 := z.Args[0]
2251 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2252 continue
2253 }
2254 v.reset(OpRotateLeft64)
2255 v.AddArg2(x, z)
2256 return true
2257 }
2258 break
2259 }
2260
2261
2262
2263 for {
2264 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2265 right := v_0
2266 if right.Op != OpRsh64Ux32 {
2267 continue
2268 }
2269 y := right.Args[1]
2270 x := right.Args[0]
2271 left := v_1
2272 if left.Op != OpLsh64x32 {
2273 continue
2274 }
2275 _ = left.Args[1]
2276 if x != left.Args[0] {
2277 continue
2278 }
2279 z := left.Args[1]
2280 if z.Op != OpSub32 {
2281 continue
2282 }
2283 _ = z.Args[1]
2284 z_0 := z.Args[0]
2285 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2286 continue
2287 }
2288 v.reset(OpRotateLeft64)
2289 v.AddArg2(x, z)
2290 return true
2291 }
2292 break
2293 }
2294
2295
2296
2297 for {
2298 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2299 right := v_0
2300 if right.Op != OpRsh64Ux16 {
2301 continue
2302 }
2303 y := right.Args[1]
2304 x := right.Args[0]
2305 left := v_1
2306 if left.Op != OpLsh64x16 {
2307 continue
2308 }
2309 _ = left.Args[1]
2310 if x != left.Args[0] {
2311 continue
2312 }
2313 z := left.Args[1]
2314 if z.Op != OpSub16 {
2315 continue
2316 }
2317 _ = z.Args[1]
2318 z_0 := z.Args[0]
2319 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2320 continue
2321 }
2322 v.reset(OpRotateLeft64)
2323 v.AddArg2(x, z)
2324 return true
2325 }
2326 break
2327 }
2328
2329
2330
2331 for {
2332 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2333 right := v_0
2334 if right.Op != OpRsh64Ux8 {
2335 continue
2336 }
2337 y := right.Args[1]
2338 x := right.Args[0]
2339 left := v_1
2340 if left.Op != OpLsh64x8 {
2341 continue
2342 }
2343 _ = left.Args[1]
2344 if x != left.Args[0] {
2345 continue
2346 }
2347 z := left.Args[1]
2348 if z.Op != OpSub8 {
2349 continue
2350 }
2351 _ = z.Args[1]
2352 z_0 := z.Args[0]
2353 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2354 continue
2355 }
2356 v.reset(OpRotateLeft64)
2357 v.AddArg2(x, z)
2358 return true
2359 }
2360 break
2361 }
2362 return false
2363 }
2364 func rewriteValuegeneric_OpAdd64F(v *Value) bool {
2365 v_1 := v.Args[1]
2366 v_0 := v.Args[0]
2367
2368
2369
2370 for {
2371 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2372 if v_0.Op != OpConst64F {
2373 continue
2374 }
2375 c := auxIntToFloat64(v_0.AuxInt)
2376 if v_1.Op != OpConst64F {
2377 continue
2378 }
2379 d := auxIntToFloat64(v_1.AuxInt)
2380 if !(c+d == c+d) {
2381 continue
2382 }
2383 v.reset(OpConst64F)
2384 v.AuxInt = float64ToAuxInt(c + d)
2385 return true
2386 }
2387 break
2388 }
2389 return false
2390 }
2391 func rewriteValuegeneric_OpAdd64carry(v *Value) bool {
2392 v_2 := v.Args[2]
2393 v_1 := v.Args[1]
2394 v_0 := v.Args[0]
2395 b := v.Block
2396
2397
2398
2399 for {
2400 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2401 if v_0.Op != OpConst64 {
2402 continue
2403 }
2404 t := v_0.Type
2405 x := auxIntToInt64(v_0.AuxInt)
2406 if v_1.Op != OpConst64 {
2407 continue
2408 }
2409 y := auxIntToInt64(v_1.AuxInt)
2410 if v_2.Op != OpConst64 {
2411 continue
2412 }
2413 c := auxIntToInt64(v_2.AuxInt)
2414 if !(c >= 0 && c <= 1) {
2415 continue
2416 }
2417 v.reset(OpMakeTuple)
2418 v0 := b.NewValue0(v.Pos, OpConst64, t)
2419 v0.AuxInt = int64ToAuxInt(bitsAdd64(x, y, c).sum)
2420 v1 := b.NewValue0(v.Pos, OpConst64, t)
2421 v1.AuxInt = int64ToAuxInt(bitsAdd64(x, y, c).carry)
2422 v.AddArg2(v0, v1)
2423 return true
2424 }
2425 break
2426 }
2427 return false
2428 }
2429 func rewriteValuegeneric_OpAdd8(v *Value) bool {
2430 v_1 := v.Args[1]
2431 v_0 := v.Args[0]
2432 b := v.Block
2433 config := b.Func.Config
2434
2435
2436 for {
2437 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2438 if v_0.Op != OpConst8 {
2439 continue
2440 }
2441 c := auxIntToInt8(v_0.AuxInt)
2442 if v_1.Op != OpConst8 {
2443 continue
2444 }
2445 d := auxIntToInt8(v_1.AuxInt)
2446 v.reset(OpConst8)
2447 v.AuxInt = int8ToAuxInt(c + d)
2448 return true
2449 }
2450 break
2451 }
2452
2453
2454 for {
2455 t := v.Type
2456 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2457 if v_0.Op != OpMul8 {
2458 continue
2459 }
2460 _ = v_0.Args[1]
2461 v_0_0 := v_0.Args[0]
2462 v_0_1 := v_0.Args[1]
2463 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
2464 x := v_0_0
2465 y := v_0_1
2466 if v_1.Op != OpMul8 {
2467 continue
2468 }
2469 _ = v_1.Args[1]
2470 v_1_0 := v_1.Args[0]
2471 v_1_1 := v_1.Args[1]
2472 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
2473 if x != v_1_0 {
2474 continue
2475 }
2476 z := v_1_1
2477 v.reset(OpMul8)
2478 v0 := b.NewValue0(v.Pos, OpAdd8, t)
2479 v0.AddArg2(y, z)
2480 v.AddArg2(x, v0)
2481 return true
2482 }
2483 }
2484 }
2485 break
2486 }
2487
2488
2489 for {
2490 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2491 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
2492 continue
2493 }
2494 x := v_1
2495 v.copyOf(x)
2496 return true
2497 }
2498 break
2499 }
2500
2501
2502 for {
2503 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2504 x := v_0
2505 if v_1.Op != OpNeg8 {
2506 continue
2507 }
2508 y := v_1.Args[0]
2509 v.reset(OpSub8)
2510 v.AddArg2(x, y)
2511 return true
2512 }
2513 break
2514 }
2515
2516
2517 for {
2518 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2519 if v_0.Op != OpCom8 {
2520 continue
2521 }
2522 x := v_0.Args[0]
2523 if x != v_1 {
2524 continue
2525 }
2526 v.reset(OpConst8)
2527 v.AuxInt = int8ToAuxInt(-1)
2528 return true
2529 }
2530 break
2531 }
2532
2533
2534 for {
2535 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2536 if v_0.Op != OpSub8 {
2537 continue
2538 }
2539 t := v_0.Args[1]
2540 x := v_0.Args[0]
2541 if v_1.Op != OpAdd8 {
2542 continue
2543 }
2544 _ = v_1.Args[1]
2545 v_1_0 := v_1.Args[0]
2546 v_1_1 := v_1.Args[1]
2547 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2548 if t != v_1_0 {
2549 continue
2550 }
2551 y := v_1_1
2552 v.reset(OpAdd8)
2553 v.AddArg2(x, y)
2554 return true
2555 }
2556 }
2557 break
2558 }
2559
2560
2561 for {
2562 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2563 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 1 || v_1.Op != OpCom8 {
2564 continue
2565 }
2566 x := v_1.Args[0]
2567 v.reset(OpNeg8)
2568 v.AddArg(x)
2569 return true
2570 }
2571 break
2572 }
2573
2574
2575 for {
2576 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2577 x := v_0
2578 if v_1.Op != OpSub8 {
2579 continue
2580 }
2581 _ = v_1.Args[1]
2582 y := v_1.Args[0]
2583 if x != v_1.Args[1] {
2584 continue
2585 }
2586 v.copyOf(y)
2587 return true
2588 }
2589 break
2590 }
2591
2592
2593 for {
2594 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2595 x := v_0
2596 if v_1.Op != OpAdd8 {
2597 continue
2598 }
2599 _ = v_1.Args[1]
2600 v_1_0 := v_1.Args[0]
2601 v_1_1 := v_1.Args[1]
2602 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2603 y := v_1_0
2604 if v_1_1.Op != OpSub8 {
2605 continue
2606 }
2607 _ = v_1_1.Args[1]
2608 z := v_1_1.Args[0]
2609 if x != v_1_1.Args[1] {
2610 continue
2611 }
2612 v.reset(OpAdd8)
2613 v.AddArg2(y, z)
2614 return true
2615 }
2616 }
2617 break
2618 }
2619
2620
2621
2622 for {
2623 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2624 if v_0.Op != OpAdd8 {
2625 continue
2626 }
2627 _ = v_0.Args[1]
2628 v_0_0 := v_0.Args[0]
2629 v_0_1 := v_0.Args[1]
2630 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
2631 i := v_0_0
2632 if i.Op != OpConst8 {
2633 continue
2634 }
2635 t := i.Type
2636 z := v_0_1
2637 x := v_1
2638 if !(z.Op != OpConst8 && x.Op != OpConst8) {
2639 continue
2640 }
2641 v.reset(OpAdd8)
2642 v0 := b.NewValue0(v.Pos, OpAdd8, t)
2643 v0.AddArg2(z, x)
2644 v.AddArg2(i, v0)
2645 return true
2646 }
2647 }
2648 break
2649 }
2650
2651
2652
2653 for {
2654 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2655 if v_0.Op != OpSub8 {
2656 continue
2657 }
2658 z := v_0.Args[1]
2659 i := v_0.Args[0]
2660 if i.Op != OpConst8 {
2661 continue
2662 }
2663 t := i.Type
2664 x := v_1
2665 if !(z.Op != OpConst8 && x.Op != OpConst8) {
2666 continue
2667 }
2668 v.reset(OpAdd8)
2669 v0 := b.NewValue0(v.Pos, OpSub8, t)
2670 v0.AddArg2(x, z)
2671 v.AddArg2(i, v0)
2672 return true
2673 }
2674 break
2675 }
2676
2677
2678 for {
2679 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2680 if v_0.Op != OpConst8 {
2681 continue
2682 }
2683 t := v_0.Type
2684 c := auxIntToInt8(v_0.AuxInt)
2685 if v_1.Op != OpAdd8 {
2686 continue
2687 }
2688 _ = v_1.Args[1]
2689 v_1_0 := v_1.Args[0]
2690 v_1_1 := v_1.Args[1]
2691 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2692 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
2693 continue
2694 }
2695 d := auxIntToInt8(v_1_0.AuxInt)
2696 x := v_1_1
2697 v.reset(OpAdd8)
2698 v0 := b.NewValue0(v.Pos, OpConst8, t)
2699 v0.AuxInt = int8ToAuxInt(c + d)
2700 v.AddArg2(v0, x)
2701 return true
2702 }
2703 }
2704 break
2705 }
2706
2707
2708 for {
2709 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2710 if v_0.Op != OpConst8 {
2711 continue
2712 }
2713 t := v_0.Type
2714 c := auxIntToInt8(v_0.AuxInt)
2715 if v_1.Op != OpSub8 {
2716 continue
2717 }
2718 x := v_1.Args[1]
2719 v_1_0 := v_1.Args[0]
2720 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
2721 continue
2722 }
2723 d := auxIntToInt8(v_1_0.AuxInt)
2724 v.reset(OpSub8)
2725 v0 := b.NewValue0(v.Pos, OpConst8, t)
2726 v0.AuxInt = int8ToAuxInt(c + d)
2727 v.AddArg2(v0, x)
2728 return true
2729 }
2730 break
2731 }
2732
2733
2734
2735 for {
2736 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2737 if v_0.Op != OpLsh8x64 {
2738 continue
2739 }
2740 _ = v_0.Args[1]
2741 x := v_0.Args[0]
2742 z := v_0.Args[1]
2743 if z.Op != OpConst64 {
2744 continue
2745 }
2746 c := auxIntToInt64(z.AuxInt)
2747 if v_1.Op != OpRsh8Ux64 {
2748 continue
2749 }
2750 _ = v_1.Args[1]
2751 if x != v_1.Args[0] {
2752 continue
2753 }
2754 v_1_1 := v_1.Args[1]
2755 if v_1_1.Op != OpConst64 {
2756 continue
2757 }
2758 d := auxIntToInt64(v_1_1.AuxInt)
2759 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
2760 continue
2761 }
2762 v.reset(OpRotateLeft8)
2763 v.AddArg2(x, z)
2764 return true
2765 }
2766 break
2767 }
2768
2769
2770
2771 for {
2772 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2773 left := v_0
2774 if left.Op != OpLsh8x64 {
2775 continue
2776 }
2777 y := left.Args[1]
2778 x := left.Args[0]
2779 right := v_1
2780 if right.Op != OpRsh8Ux64 {
2781 continue
2782 }
2783 _ = right.Args[1]
2784 if x != right.Args[0] {
2785 continue
2786 }
2787 right_1 := right.Args[1]
2788 if right_1.Op != OpSub64 {
2789 continue
2790 }
2791 _ = right_1.Args[1]
2792 right_1_0 := right_1.Args[0]
2793 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2794 continue
2795 }
2796 v.reset(OpRotateLeft8)
2797 v.AddArg2(x, y)
2798 return true
2799 }
2800 break
2801 }
2802
2803
2804
2805 for {
2806 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2807 left := v_0
2808 if left.Op != OpLsh8x32 {
2809 continue
2810 }
2811 y := left.Args[1]
2812 x := left.Args[0]
2813 right := v_1
2814 if right.Op != OpRsh8Ux32 {
2815 continue
2816 }
2817 _ = right.Args[1]
2818 if x != right.Args[0] {
2819 continue
2820 }
2821 right_1 := right.Args[1]
2822 if right_1.Op != OpSub32 {
2823 continue
2824 }
2825 _ = right_1.Args[1]
2826 right_1_0 := right_1.Args[0]
2827 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2828 continue
2829 }
2830 v.reset(OpRotateLeft8)
2831 v.AddArg2(x, y)
2832 return true
2833 }
2834 break
2835 }
2836
2837
2838
2839 for {
2840 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2841 left := v_0
2842 if left.Op != OpLsh8x16 {
2843 continue
2844 }
2845 y := left.Args[1]
2846 x := left.Args[0]
2847 right := v_1
2848 if right.Op != OpRsh8Ux16 {
2849 continue
2850 }
2851 _ = right.Args[1]
2852 if x != right.Args[0] {
2853 continue
2854 }
2855 right_1 := right.Args[1]
2856 if right_1.Op != OpSub16 {
2857 continue
2858 }
2859 _ = right_1.Args[1]
2860 right_1_0 := right_1.Args[0]
2861 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2862 continue
2863 }
2864 v.reset(OpRotateLeft8)
2865 v.AddArg2(x, y)
2866 return true
2867 }
2868 break
2869 }
2870
2871
2872
2873 for {
2874 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2875 left := v_0
2876 if left.Op != OpLsh8x8 {
2877 continue
2878 }
2879 y := left.Args[1]
2880 x := left.Args[0]
2881 right := v_1
2882 if right.Op != OpRsh8Ux8 {
2883 continue
2884 }
2885 _ = right.Args[1]
2886 if x != right.Args[0] {
2887 continue
2888 }
2889 right_1 := right.Args[1]
2890 if right_1.Op != OpSub8 {
2891 continue
2892 }
2893 _ = right_1.Args[1]
2894 right_1_0 := right_1.Args[0]
2895 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2896 continue
2897 }
2898 v.reset(OpRotateLeft8)
2899 v.AddArg2(x, y)
2900 return true
2901 }
2902 break
2903 }
2904
2905
2906
2907 for {
2908 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2909 right := v_0
2910 if right.Op != OpRsh8Ux64 {
2911 continue
2912 }
2913 y := right.Args[1]
2914 x := right.Args[0]
2915 left := v_1
2916 if left.Op != OpLsh8x64 {
2917 continue
2918 }
2919 _ = left.Args[1]
2920 if x != left.Args[0] {
2921 continue
2922 }
2923 z := left.Args[1]
2924 if z.Op != OpSub64 {
2925 continue
2926 }
2927 _ = z.Args[1]
2928 z_0 := z.Args[0]
2929 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2930 continue
2931 }
2932 v.reset(OpRotateLeft8)
2933 v.AddArg2(x, z)
2934 return true
2935 }
2936 break
2937 }
2938
2939
2940
2941 for {
2942 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2943 right := v_0
2944 if right.Op != OpRsh8Ux32 {
2945 continue
2946 }
2947 y := right.Args[1]
2948 x := right.Args[0]
2949 left := v_1
2950 if left.Op != OpLsh8x32 {
2951 continue
2952 }
2953 _ = left.Args[1]
2954 if x != left.Args[0] {
2955 continue
2956 }
2957 z := left.Args[1]
2958 if z.Op != OpSub32 {
2959 continue
2960 }
2961 _ = z.Args[1]
2962 z_0 := z.Args[0]
2963 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2964 continue
2965 }
2966 v.reset(OpRotateLeft8)
2967 v.AddArg2(x, z)
2968 return true
2969 }
2970 break
2971 }
2972
2973
2974
2975 for {
2976 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2977 right := v_0
2978 if right.Op != OpRsh8Ux16 {
2979 continue
2980 }
2981 y := right.Args[1]
2982 x := right.Args[0]
2983 left := v_1
2984 if left.Op != OpLsh8x16 {
2985 continue
2986 }
2987 _ = left.Args[1]
2988 if x != left.Args[0] {
2989 continue
2990 }
2991 z := left.Args[1]
2992 if z.Op != OpSub16 {
2993 continue
2994 }
2995 _ = z.Args[1]
2996 z_0 := z.Args[0]
2997 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2998 continue
2999 }
3000 v.reset(OpRotateLeft8)
3001 v.AddArg2(x, z)
3002 return true
3003 }
3004 break
3005 }
3006
3007
3008
3009 for {
3010 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3011 right := v_0
3012 if right.Op != OpRsh8Ux8 {
3013 continue
3014 }
3015 y := right.Args[1]
3016 x := right.Args[0]
3017 left := v_1
3018 if left.Op != OpLsh8x8 {
3019 continue
3020 }
3021 _ = left.Args[1]
3022 if x != left.Args[0] {
3023 continue
3024 }
3025 z := left.Args[1]
3026 if z.Op != OpSub8 {
3027 continue
3028 }
3029 _ = z.Args[1]
3030 z_0 := z.Args[0]
3031 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
3032 continue
3033 }
3034 v.reset(OpRotateLeft8)
3035 v.AddArg2(x, z)
3036 return true
3037 }
3038 break
3039 }
3040 return false
3041 }
3042 func rewriteValuegeneric_OpAddPtr(v *Value) bool {
3043 v_1 := v.Args[1]
3044 v_0 := v.Args[0]
3045
3046
3047 for {
3048 t := v.Type
3049 x := v_0
3050 if v_1.Op != OpConst64 {
3051 break
3052 }
3053 c := auxIntToInt64(v_1.AuxInt)
3054 v.reset(OpOffPtr)
3055 v.Type = t
3056 v.AuxInt = int64ToAuxInt(c)
3057 v.AddArg(x)
3058 return true
3059 }
3060
3061
3062 for {
3063 t := v.Type
3064 x := v_0
3065 if v_1.Op != OpConst32 {
3066 break
3067 }
3068 c := auxIntToInt32(v_1.AuxInt)
3069 v.reset(OpOffPtr)
3070 v.Type = t
3071 v.AuxInt = int64ToAuxInt(int64(c))
3072 v.AddArg(x)
3073 return true
3074 }
3075 return false
3076 }
3077 func rewriteValuegeneric_OpAnd16(v *Value) bool {
3078 v_1 := v.Args[1]
3079 v_0 := v.Args[0]
3080 b := v.Block
3081
3082
3083 for {
3084 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3085 if v_0.Op != OpConst16 {
3086 continue
3087 }
3088 c := auxIntToInt16(v_0.AuxInt)
3089 if v_1.Op != OpConst16 {
3090 continue
3091 }
3092 d := auxIntToInt16(v_1.AuxInt)
3093 v.reset(OpConst16)
3094 v.AuxInt = int16ToAuxInt(c & d)
3095 return true
3096 }
3097 break
3098 }
3099
3100
3101 for {
3102 t := v.Type
3103 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3104 if v_0.Op != OpCom16 {
3105 continue
3106 }
3107 x := v_0.Args[0]
3108 if v_1.Op != OpCom16 {
3109 continue
3110 }
3111 y := v_1.Args[0]
3112 v.reset(OpCom16)
3113 v0 := b.NewValue0(v.Pos, OpOr16, t)
3114 v0.AddArg2(x, y)
3115 v.AddArg(v0)
3116 return true
3117 }
3118 break
3119 }
3120
3121
3122
3123 for {
3124 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3125 if v_0.Op != OpConst16 {
3126 continue
3127 }
3128 m := auxIntToInt16(v_0.AuxInt)
3129 if v_1.Op != OpRsh16Ux64 {
3130 continue
3131 }
3132 _ = v_1.Args[1]
3133 v_1_1 := v_1.Args[1]
3134 if v_1_1.Op != OpConst64 {
3135 continue
3136 }
3137 c := auxIntToInt64(v_1_1.AuxInt)
3138 if !(c >= int64(16-ntz16(m))) {
3139 continue
3140 }
3141 v.reset(OpConst16)
3142 v.AuxInt = int16ToAuxInt(0)
3143 return true
3144 }
3145 break
3146 }
3147
3148
3149
3150 for {
3151 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3152 if v_0.Op != OpConst16 {
3153 continue
3154 }
3155 m := auxIntToInt16(v_0.AuxInt)
3156 if v_1.Op != OpLsh16x64 {
3157 continue
3158 }
3159 _ = v_1.Args[1]
3160 v_1_1 := v_1.Args[1]
3161 if v_1_1.Op != OpConst64 {
3162 continue
3163 }
3164 c := auxIntToInt64(v_1_1.AuxInt)
3165 if !(c >= int64(16-nlz16(m))) {
3166 continue
3167 }
3168 v.reset(OpConst16)
3169 v.AuxInt = int16ToAuxInt(0)
3170 return true
3171 }
3172 break
3173 }
3174
3175
3176 for {
3177 x := v_0
3178 if x != v_1 {
3179 break
3180 }
3181 v.copyOf(x)
3182 return true
3183 }
3184
3185
3186 for {
3187 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3188 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
3189 continue
3190 }
3191 x := v_1
3192 v.copyOf(x)
3193 return true
3194 }
3195 break
3196 }
3197
3198
3199 for {
3200 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3201 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
3202 continue
3203 }
3204 v.reset(OpConst16)
3205 v.AuxInt = int16ToAuxInt(0)
3206 return true
3207 }
3208 break
3209 }
3210
3211
3212 for {
3213 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3214 if v_0.Op != OpCom16 {
3215 continue
3216 }
3217 x := v_0.Args[0]
3218 if x != v_1 {
3219 continue
3220 }
3221 v.reset(OpConst16)
3222 v.AuxInt = int16ToAuxInt(0)
3223 return true
3224 }
3225 break
3226 }
3227
3228
3229 for {
3230 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3231 x := v_0
3232 if v_1.Op != OpAnd16 {
3233 continue
3234 }
3235 _ = v_1.Args[1]
3236 v_1_0 := v_1.Args[0]
3237 v_1_1 := v_1.Args[1]
3238 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3239 if x != v_1_0 {
3240 continue
3241 }
3242 y := v_1_1
3243 v.reset(OpAnd16)
3244 v.AddArg2(x, y)
3245 return true
3246 }
3247 }
3248 break
3249 }
3250
3251
3252
3253 for {
3254 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3255 if v_0.Op != OpAnd16 {
3256 continue
3257 }
3258 _ = v_0.Args[1]
3259 v_0_0 := v_0.Args[0]
3260 v_0_1 := v_0.Args[1]
3261 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3262 i := v_0_0
3263 if i.Op != OpConst16 {
3264 continue
3265 }
3266 t := i.Type
3267 z := v_0_1
3268 x := v_1
3269 if !(z.Op != OpConst16 && x.Op != OpConst16) {
3270 continue
3271 }
3272 v.reset(OpAnd16)
3273 v0 := b.NewValue0(v.Pos, OpAnd16, t)
3274 v0.AddArg2(z, x)
3275 v.AddArg2(i, v0)
3276 return true
3277 }
3278 }
3279 break
3280 }
3281
3282
3283 for {
3284 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3285 if v_0.Op != OpConst16 {
3286 continue
3287 }
3288 t := v_0.Type
3289 c := auxIntToInt16(v_0.AuxInt)
3290 if v_1.Op != OpAnd16 {
3291 continue
3292 }
3293 _ = v_1.Args[1]
3294 v_1_0 := v_1.Args[0]
3295 v_1_1 := v_1.Args[1]
3296 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3297 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
3298 continue
3299 }
3300 d := auxIntToInt16(v_1_0.AuxInt)
3301 x := v_1_1
3302 v.reset(OpAnd16)
3303 v0 := b.NewValue0(v.Pos, OpConst16, t)
3304 v0.AuxInt = int16ToAuxInt(c & d)
3305 v.AddArg2(v0, x)
3306 return true
3307 }
3308 }
3309 break
3310 }
3311 return false
3312 }
3313 func rewriteValuegeneric_OpAnd32(v *Value) bool {
3314 v_1 := v.Args[1]
3315 v_0 := v.Args[0]
3316 b := v.Block
3317
3318
3319 for {
3320 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3321 if v_0.Op != OpConst32 {
3322 continue
3323 }
3324 c := auxIntToInt32(v_0.AuxInt)
3325 if v_1.Op != OpConst32 {
3326 continue
3327 }
3328 d := auxIntToInt32(v_1.AuxInt)
3329 v.reset(OpConst32)
3330 v.AuxInt = int32ToAuxInt(c & d)
3331 return true
3332 }
3333 break
3334 }
3335
3336
3337 for {
3338 t := v.Type
3339 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3340 if v_0.Op != OpCom32 {
3341 continue
3342 }
3343 x := v_0.Args[0]
3344 if v_1.Op != OpCom32 {
3345 continue
3346 }
3347 y := v_1.Args[0]
3348 v.reset(OpCom32)
3349 v0 := b.NewValue0(v.Pos, OpOr32, t)
3350 v0.AddArg2(x, y)
3351 v.AddArg(v0)
3352 return true
3353 }
3354 break
3355 }
3356
3357
3358
3359 for {
3360 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3361 if v_0.Op != OpConst32 {
3362 continue
3363 }
3364 m := auxIntToInt32(v_0.AuxInt)
3365 if v_1.Op != OpRsh32Ux64 {
3366 continue
3367 }
3368 _ = v_1.Args[1]
3369 v_1_1 := v_1.Args[1]
3370 if v_1_1.Op != OpConst64 {
3371 continue
3372 }
3373 c := auxIntToInt64(v_1_1.AuxInt)
3374 if !(c >= int64(32-ntz32(m))) {
3375 continue
3376 }
3377 v.reset(OpConst32)
3378 v.AuxInt = int32ToAuxInt(0)
3379 return true
3380 }
3381 break
3382 }
3383
3384
3385
3386 for {
3387 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3388 if v_0.Op != OpConst32 {
3389 continue
3390 }
3391 m := auxIntToInt32(v_0.AuxInt)
3392 if v_1.Op != OpLsh32x64 {
3393 continue
3394 }
3395 _ = v_1.Args[1]
3396 v_1_1 := v_1.Args[1]
3397 if v_1_1.Op != OpConst64 {
3398 continue
3399 }
3400 c := auxIntToInt64(v_1_1.AuxInt)
3401 if !(c >= int64(32-nlz32(m))) {
3402 continue
3403 }
3404 v.reset(OpConst32)
3405 v.AuxInt = int32ToAuxInt(0)
3406 return true
3407 }
3408 break
3409 }
3410
3411
3412 for {
3413 x := v_0
3414 if x != v_1 {
3415 break
3416 }
3417 v.copyOf(x)
3418 return true
3419 }
3420
3421
3422 for {
3423 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3424 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
3425 continue
3426 }
3427 x := v_1
3428 v.copyOf(x)
3429 return true
3430 }
3431 break
3432 }
3433
3434
3435 for {
3436 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3437 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
3438 continue
3439 }
3440 v.reset(OpConst32)
3441 v.AuxInt = int32ToAuxInt(0)
3442 return true
3443 }
3444 break
3445 }
3446
3447
3448 for {
3449 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3450 if v_0.Op != OpCom32 {
3451 continue
3452 }
3453 x := v_0.Args[0]
3454 if x != v_1 {
3455 continue
3456 }
3457 v.reset(OpConst32)
3458 v.AuxInt = int32ToAuxInt(0)
3459 return true
3460 }
3461 break
3462 }
3463
3464
3465 for {
3466 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3467 x := v_0
3468 if v_1.Op != OpAnd32 {
3469 continue
3470 }
3471 _ = v_1.Args[1]
3472 v_1_0 := v_1.Args[0]
3473 v_1_1 := v_1.Args[1]
3474 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3475 if x != v_1_0 {
3476 continue
3477 }
3478 y := v_1_1
3479 v.reset(OpAnd32)
3480 v.AddArg2(x, y)
3481 return true
3482 }
3483 }
3484 break
3485 }
3486
3487
3488
3489 for {
3490 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3491 if v_0.Op != OpAnd32 {
3492 continue
3493 }
3494 _ = v_0.Args[1]
3495 v_0_0 := v_0.Args[0]
3496 v_0_1 := v_0.Args[1]
3497 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3498 i := v_0_0
3499 if i.Op != OpConst32 {
3500 continue
3501 }
3502 t := i.Type
3503 z := v_0_1
3504 x := v_1
3505 if !(z.Op != OpConst32 && x.Op != OpConst32) {
3506 continue
3507 }
3508 v.reset(OpAnd32)
3509 v0 := b.NewValue0(v.Pos, OpAnd32, t)
3510 v0.AddArg2(z, x)
3511 v.AddArg2(i, v0)
3512 return true
3513 }
3514 }
3515 break
3516 }
3517
3518
3519 for {
3520 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3521 if v_0.Op != OpConst32 {
3522 continue
3523 }
3524 t := v_0.Type
3525 c := auxIntToInt32(v_0.AuxInt)
3526 if v_1.Op != OpAnd32 {
3527 continue
3528 }
3529 _ = v_1.Args[1]
3530 v_1_0 := v_1.Args[0]
3531 v_1_1 := v_1.Args[1]
3532 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3533 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
3534 continue
3535 }
3536 d := auxIntToInt32(v_1_0.AuxInt)
3537 x := v_1_1
3538 v.reset(OpAnd32)
3539 v0 := b.NewValue0(v.Pos, OpConst32, t)
3540 v0.AuxInt = int32ToAuxInt(c & d)
3541 v.AddArg2(v0, x)
3542 return true
3543 }
3544 }
3545 break
3546 }
3547 return false
3548 }
3549 func rewriteValuegeneric_OpAnd64(v *Value) bool {
3550 v_1 := v.Args[1]
3551 v_0 := v.Args[0]
3552 b := v.Block
3553
3554
3555 for {
3556 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3557 if v_0.Op != OpConst64 {
3558 continue
3559 }
3560 c := auxIntToInt64(v_0.AuxInt)
3561 if v_1.Op != OpConst64 {
3562 continue
3563 }
3564 d := auxIntToInt64(v_1.AuxInt)
3565 v.reset(OpConst64)
3566 v.AuxInt = int64ToAuxInt(c & d)
3567 return true
3568 }
3569 break
3570 }
3571
3572
3573 for {
3574 t := v.Type
3575 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3576 if v_0.Op != OpCom64 {
3577 continue
3578 }
3579 x := v_0.Args[0]
3580 if v_1.Op != OpCom64 {
3581 continue
3582 }
3583 y := v_1.Args[0]
3584 v.reset(OpCom64)
3585 v0 := b.NewValue0(v.Pos, OpOr64, t)
3586 v0.AddArg2(x, y)
3587 v.AddArg(v0)
3588 return true
3589 }
3590 break
3591 }
3592
3593
3594
3595 for {
3596 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3597 if v_0.Op != OpConst64 {
3598 continue
3599 }
3600 m := auxIntToInt64(v_0.AuxInt)
3601 if v_1.Op != OpRsh64Ux64 {
3602 continue
3603 }
3604 _ = v_1.Args[1]
3605 v_1_1 := v_1.Args[1]
3606 if v_1_1.Op != OpConst64 {
3607 continue
3608 }
3609 c := auxIntToInt64(v_1_1.AuxInt)
3610 if !(c >= int64(64-ntz64(m))) {
3611 continue
3612 }
3613 v.reset(OpConst64)
3614 v.AuxInt = int64ToAuxInt(0)
3615 return true
3616 }
3617 break
3618 }
3619
3620
3621
3622 for {
3623 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3624 if v_0.Op != OpConst64 {
3625 continue
3626 }
3627 m := auxIntToInt64(v_0.AuxInt)
3628 if v_1.Op != OpLsh64x64 {
3629 continue
3630 }
3631 _ = v_1.Args[1]
3632 v_1_1 := v_1.Args[1]
3633 if v_1_1.Op != OpConst64 {
3634 continue
3635 }
3636 c := auxIntToInt64(v_1_1.AuxInt)
3637 if !(c >= int64(64-nlz64(m))) {
3638 continue
3639 }
3640 v.reset(OpConst64)
3641 v.AuxInt = int64ToAuxInt(0)
3642 return true
3643 }
3644 break
3645 }
3646
3647
3648 for {
3649 x := v_0
3650 if x != v_1 {
3651 break
3652 }
3653 v.copyOf(x)
3654 return true
3655 }
3656
3657
3658 for {
3659 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3660 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
3661 continue
3662 }
3663 x := v_1
3664 v.copyOf(x)
3665 return true
3666 }
3667 break
3668 }
3669
3670
3671 for {
3672 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3673 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
3674 continue
3675 }
3676 v.reset(OpConst64)
3677 v.AuxInt = int64ToAuxInt(0)
3678 return true
3679 }
3680 break
3681 }
3682
3683
3684 for {
3685 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3686 if v_0.Op != OpCom64 {
3687 continue
3688 }
3689 x := v_0.Args[0]
3690 if x != v_1 {
3691 continue
3692 }
3693 v.reset(OpConst64)
3694 v.AuxInt = int64ToAuxInt(0)
3695 return true
3696 }
3697 break
3698 }
3699
3700
3701 for {
3702 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3703 x := v_0
3704 if v_1.Op != OpAnd64 {
3705 continue
3706 }
3707 _ = v_1.Args[1]
3708 v_1_0 := v_1.Args[0]
3709 v_1_1 := v_1.Args[1]
3710 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3711 if x != v_1_0 {
3712 continue
3713 }
3714 y := v_1_1
3715 v.reset(OpAnd64)
3716 v.AddArg2(x, y)
3717 return true
3718 }
3719 }
3720 break
3721 }
3722
3723
3724
3725 for {
3726 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3727 if v_0.Op != OpAnd64 {
3728 continue
3729 }
3730 _ = v_0.Args[1]
3731 v_0_0 := v_0.Args[0]
3732 v_0_1 := v_0.Args[1]
3733 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3734 i := v_0_0
3735 if i.Op != OpConst64 {
3736 continue
3737 }
3738 t := i.Type
3739 z := v_0_1
3740 x := v_1
3741 if !(z.Op != OpConst64 && x.Op != OpConst64) {
3742 continue
3743 }
3744 v.reset(OpAnd64)
3745 v0 := b.NewValue0(v.Pos, OpAnd64, t)
3746 v0.AddArg2(z, x)
3747 v.AddArg2(i, v0)
3748 return true
3749 }
3750 }
3751 break
3752 }
3753
3754
3755 for {
3756 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3757 if v_0.Op != OpConst64 {
3758 continue
3759 }
3760 t := v_0.Type
3761 c := auxIntToInt64(v_0.AuxInt)
3762 if v_1.Op != OpAnd64 {
3763 continue
3764 }
3765 _ = v_1.Args[1]
3766 v_1_0 := v_1.Args[0]
3767 v_1_1 := v_1.Args[1]
3768 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3769 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
3770 continue
3771 }
3772 d := auxIntToInt64(v_1_0.AuxInt)
3773 x := v_1_1
3774 v.reset(OpAnd64)
3775 v0 := b.NewValue0(v.Pos, OpConst64, t)
3776 v0.AuxInt = int64ToAuxInt(c & d)
3777 v.AddArg2(v0, x)
3778 return true
3779 }
3780 }
3781 break
3782 }
3783 return false
3784 }
3785 func rewriteValuegeneric_OpAnd8(v *Value) bool {
3786 v_1 := v.Args[1]
3787 v_0 := v.Args[0]
3788 b := v.Block
3789
3790
3791 for {
3792 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3793 if v_0.Op != OpConst8 {
3794 continue
3795 }
3796 c := auxIntToInt8(v_0.AuxInt)
3797 if v_1.Op != OpConst8 {
3798 continue
3799 }
3800 d := auxIntToInt8(v_1.AuxInt)
3801 v.reset(OpConst8)
3802 v.AuxInt = int8ToAuxInt(c & d)
3803 return true
3804 }
3805 break
3806 }
3807
3808
3809 for {
3810 t := v.Type
3811 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3812 if v_0.Op != OpCom8 {
3813 continue
3814 }
3815 x := v_0.Args[0]
3816 if v_1.Op != OpCom8 {
3817 continue
3818 }
3819 y := v_1.Args[0]
3820 v.reset(OpCom8)
3821 v0 := b.NewValue0(v.Pos, OpOr8, t)
3822 v0.AddArg2(x, y)
3823 v.AddArg(v0)
3824 return true
3825 }
3826 break
3827 }
3828
3829
3830
3831 for {
3832 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3833 if v_0.Op != OpConst8 {
3834 continue
3835 }
3836 m := auxIntToInt8(v_0.AuxInt)
3837 if v_1.Op != OpRsh8Ux64 {
3838 continue
3839 }
3840 _ = v_1.Args[1]
3841 v_1_1 := v_1.Args[1]
3842 if v_1_1.Op != OpConst64 {
3843 continue
3844 }
3845 c := auxIntToInt64(v_1_1.AuxInt)
3846 if !(c >= int64(8-ntz8(m))) {
3847 continue
3848 }
3849 v.reset(OpConst8)
3850 v.AuxInt = int8ToAuxInt(0)
3851 return true
3852 }
3853 break
3854 }
3855
3856
3857
3858 for {
3859 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3860 if v_0.Op != OpConst8 {
3861 continue
3862 }
3863 m := auxIntToInt8(v_0.AuxInt)
3864 if v_1.Op != OpLsh8x64 {
3865 continue
3866 }
3867 _ = v_1.Args[1]
3868 v_1_1 := v_1.Args[1]
3869 if v_1_1.Op != OpConst64 {
3870 continue
3871 }
3872 c := auxIntToInt64(v_1_1.AuxInt)
3873 if !(c >= int64(8-nlz8(m))) {
3874 continue
3875 }
3876 v.reset(OpConst8)
3877 v.AuxInt = int8ToAuxInt(0)
3878 return true
3879 }
3880 break
3881 }
3882
3883
3884 for {
3885 x := v_0
3886 if x != v_1 {
3887 break
3888 }
3889 v.copyOf(x)
3890 return true
3891 }
3892
3893
3894 for {
3895 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3896 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
3897 continue
3898 }
3899 x := v_1
3900 v.copyOf(x)
3901 return true
3902 }
3903 break
3904 }
3905
3906
3907 for {
3908 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3909 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
3910 continue
3911 }
3912 v.reset(OpConst8)
3913 v.AuxInt = int8ToAuxInt(0)
3914 return true
3915 }
3916 break
3917 }
3918
3919
3920 for {
3921 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3922 if v_0.Op != OpCom8 {
3923 continue
3924 }
3925 x := v_0.Args[0]
3926 if x != v_1 {
3927 continue
3928 }
3929 v.reset(OpConst8)
3930 v.AuxInt = int8ToAuxInt(0)
3931 return true
3932 }
3933 break
3934 }
3935
3936
3937 for {
3938 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3939 x := v_0
3940 if v_1.Op != OpAnd8 {
3941 continue
3942 }
3943 _ = v_1.Args[1]
3944 v_1_0 := v_1.Args[0]
3945 v_1_1 := v_1.Args[1]
3946 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3947 if x != v_1_0 {
3948 continue
3949 }
3950 y := v_1_1
3951 v.reset(OpAnd8)
3952 v.AddArg2(x, y)
3953 return true
3954 }
3955 }
3956 break
3957 }
3958
3959
3960
3961 for {
3962 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3963 if v_0.Op != OpAnd8 {
3964 continue
3965 }
3966 _ = v_0.Args[1]
3967 v_0_0 := v_0.Args[0]
3968 v_0_1 := v_0.Args[1]
3969 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3970 i := v_0_0
3971 if i.Op != OpConst8 {
3972 continue
3973 }
3974 t := i.Type
3975 z := v_0_1
3976 x := v_1
3977 if !(z.Op != OpConst8 && x.Op != OpConst8) {
3978 continue
3979 }
3980 v.reset(OpAnd8)
3981 v0 := b.NewValue0(v.Pos, OpAnd8, t)
3982 v0.AddArg2(z, x)
3983 v.AddArg2(i, v0)
3984 return true
3985 }
3986 }
3987 break
3988 }
3989
3990
3991 for {
3992 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3993 if v_0.Op != OpConst8 {
3994 continue
3995 }
3996 t := v_0.Type
3997 c := auxIntToInt8(v_0.AuxInt)
3998 if v_1.Op != OpAnd8 {
3999 continue
4000 }
4001 _ = v_1.Args[1]
4002 v_1_0 := v_1.Args[0]
4003 v_1_1 := v_1.Args[1]
4004 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
4005 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
4006 continue
4007 }
4008 d := auxIntToInt8(v_1_0.AuxInt)
4009 x := v_1_1
4010 v.reset(OpAnd8)
4011 v0 := b.NewValue0(v.Pos, OpConst8, t)
4012 v0.AuxInt = int8ToAuxInt(c & d)
4013 v.AddArg2(v0, x)
4014 return true
4015 }
4016 }
4017 break
4018 }
4019 return false
4020 }
4021 func rewriteValuegeneric_OpAndB(v *Value) bool {
4022 v_1 := v.Args[1]
4023 v_0 := v.Args[0]
4024 b := v.Block
4025
4026
4027
4028 for {
4029 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4030 if v_0.Op != OpLeq64 {
4031 continue
4032 }
4033 x := v_0.Args[1]
4034 v_0_0 := v_0.Args[0]
4035 if v_0_0.Op != OpConst64 {
4036 continue
4037 }
4038 c := auxIntToInt64(v_0_0.AuxInt)
4039 if v_1.Op != OpLess64 {
4040 continue
4041 }
4042 _ = v_1.Args[1]
4043 if x != v_1.Args[0] {
4044 continue
4045 }
4046 v_1_1 := v_1.Args[1]
4047 if v_1_1.Op != OpConst64 {
4048 continue
4049 }
4050 d := auxIntToInt64(v_1_1.AuxInt)
4051 if !(d >= c) {
4052 continue
4053 }
4054 v.reset(OpLess64U)
4055 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4056 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4057 v1.AuxInt = int64ToAuxInt(c)
4058 v0.AddArg2(x, v1)
4059 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4060 v2.AuxInt = int64ToAuxInt(d - c)
4061 v.AddArg2(v0, v2)
4062 return true
4063 }
4064 break
4065 }
4066
4067
4068
4069 for {
4070 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4071 if v_0.Op != OpLeq64 {
4072 continue
4073 }
4074 x := v_0.Args[1]
4075 v_0_0 := v_0.Args[0]
4076 if v_0_0.Op != OpConst64 {
4077 continue
4078 }
4079 c := auxIntToInt64(v_0_0.AuxInt)
4080 if v_1.Op != OpLeq64 {
4081 continue
4082 }
4083 _ = v_1.Args[1]
4084 if x != v_1.Args[0] {
4085 continue
4086 }
4087 v_1_1 := v_1.Args[1]
4088 if v_1_1.Op != OpConst64 {
4089 continue
4090 }
4091 d := auxIntToInt64(v_1_1.AuxInt)
4092 if !(d >= c) {
4093 continue
4094 }
4095 v.reset(OpLeq64U)
4096 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4097 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4098 v1.AuxInt = int64ToAuxInt(c)
4099 v0.AddArg2(x, v1)
4100 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4101 v2.AuxInt = int64ToAuxInt(d - c)
4102 v.AddArg2(v0, v2)
4103 return true
4104 }
4105 break
4106 }
4107
4108
4109
4110 for {
4111 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4112 if v_0.Op != OpLeq32 {
4113 continue
4114 }
4115 x := v_0.Args[1]
4116 v_0_0 := v_0.Args[0]
4117 if v_0_0.Op != OpConst32 {
4118 continue
4119 }
4120 c := auxIntToInt32(v_0_0.AuxInt)
4121 if v_1.Op != OpLess32 {
4122 continue
4123 }
4124 _ = v_1.Args[1]
4125 if x != v_1.Args[0] {
4126 continue
4127 }
4128 v_1_1 := v_1.Args[1]
4129 if v_1_1.Op != OpConst32 {
4130 continue
4131 }
4132 d := auxIntToInt32(v_1_1.AuxInt)
4133 if !(d >= c) {
4134 continue
4135 }
4136 v.reset(OpLess32U)
4137 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4138 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4139 v1.AuxInt = int32ToAuxInt(c)
4140 v0.AddArg2(x, v1)
4141 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4142 v2.AuxInt = int32ToAuxInt(d - c)
4143 v.AddArg2(v0, v2)
4144 return true
4145 }
4146 break
4147 }
4148
4149
4150
4151 for {
4152 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4153 if v_0.Op != OpLeq32 {
4154 continue
4155 }
4156 x := v_0.Args[1]
4157 v_0_0 := v_0.Args[0]
4158 if v_0_0.Op != OpConst32 {
4159 continue
4160 }
4161 c := auxIntToInt32(v_0_0.AuxInt)
4162 if v_1.Op != OpLeq32 {
4163 continue
4164 }
4165 _ = v_1.Args[1]
4166 if x != v_1.Args[0] {
4167 continue
4168 }
4169 v_1_1 := v_1.Args[1]
4170 if v_1_1.Op != OpConst32 {
4171 continue
4172 }
4173 d := auxIntToInt32(v_1_1.AuxInt)
4174 if !(d >= c) {
4175 continue
4176 }
4177 v.reset(OpLeq32U)
4178 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4179 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4180 v1.AuxInt = int32ToAuxInt(c)
4181 v0.AddArg2(x, v1)
4182 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4183 v2.AuxInt = int32ToAuxInt(d - c)
4184 v.AddArg2(v0, v2)
4185 return true
4186 }
4187 break
4188 }
4189
4190
4191
4192 for {
4193 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4194 if v_0.Op != OpLeq16 {
4195 continue
4196 }
4197 x := v_0.Args[1]
4198 v_0_0 := v_0.Args[0]
4199 if v_0_0.Op != OpConst16 {
4200 continue
4201 }
4202 c := auxIntToInt16(v_0_0.AuxInt)
4203 if v_1.Op != OpLess16 {
4204 continue
4205 }
4206 _ = v_1.Args[1]
4207 if x != v_1.Args[0] {
4208 continue
4209 }
4210 v_1_1 := v_1.Args[1]
4211 if v_1_1.Op != OpConst16 {
4212 continue
4213 }
4214 d := auxIntToInt16(v_1_1.AuxInt)
4215 if !(d >= c) {
4216 continue
4217 }
4218 v.reset(OpLess16U)
4219 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4220 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4221 v1.AuxInt = int16ToAuxInt(c)
4222 v0.AddArg2(x, v1)
4223 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4224 v2.AuxInt = int16ToAuxInt(d - c)
4225 v.AddArg2(v0, v2)
4226 return true
4227 }
4228 break
4229 }
4230
4231
4232
4233 for {
4234 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4235 if v_0.Op != OpLeq16 {
4236 continue
4237 }
4238 x := v_0.Args[1]
4239 v_0_0 := v_0.Args[0]
4240 if v_0_0.Op != OpConst16 {
4241 continue
4242 }
4243 c := auxIntToInt16(v_0_0.AuxInt)
4244 if v_1.Op != OpLeq16 {
4245 continue
4246 }
4247 _ = v_1.Args[1]
4248 if x != v_1.Args[0] {
4249 continue
4250 }
4251 v_1_1 := v_1.Args[1]
4252 if v_1_1.Op != OpConst16 {
4253 continue
4254 }
4255 d := auxIntToInt16(v_1_1.AuxInt)
4256 if !(d >= c) {
4257 continue
4258 }
4259 v.reset(OpLeq16U)
4260 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4261 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4262 v1.AuxInt = int16ToAuxInt(c)
4263 v0.AddArg2(x, v1)
4264 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4265 v2.AuxInt = int16ToAuxInt(d - c)
4266 v.AddArg2(v0, v2)
4267 return true
4268 }
4269 break
4270 }
4271
4272
4273
4274 for {
4275 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4276 if v_0.Op != OpLeq8 {
4277 continue
4278 }
4279 x := v_0.Args[1]
4280 v_0_0 := v_0.Args[0]
4281 if v_0_0.Op != OpConst8 {
4282 continue
4283 }
4284 c := auxIntToInt8(v_0_0.AuxInt)
4285 if v_1.Op != OpLess8 {
4286 continue
4287 }
4288 _ = v_1.Args[1]
4289 if x != v_1.Args[0] {
4290 continue
4291 }
4292 v_1_1 := v_1.Args[1]
4293 if v_1_1.Op != OpConst8 {
4294 continue
4295 }
4296 d := auxIntToInt8(v_1_1.AuxInt)
4297 if !(d >= c) {
4298 continue
4299 }
4300 v.reset(OpLess8U)
4301 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4302 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4303 v1.AuxInt = int8ToAuxInt(c)
4304 v0.AddArg2(x, v1)
4305 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4306 v2.AuxInt = int8ToAuxInt(d - c)
4307 v.AddArg2(v0, v2)
4308 return true
4309 }
4310 break
4311 }
4312
4313
4314
4315 for {
4316 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4317 if v_0.Op != OpLeq8 {
4318 continue
4319 }
4320 x := v_0.Args[1]
4321 v_0_0 := v_0.Args[0]
4322 if v_0_0.Op != OpConst8 {
4323 continue
4324 }
4325 c := auxIntToInt8(v_0_0.AuxInt)
4326 if v_1.Op != OpLeq8 {
4327 continue
4328 }
4329 _ = v_1.Args[1]
4330 if x != v_1.Args[0] {
4331 continue
4332 }
4333 v_1_1 := v_1.Args[1]
4334 if v_1_1.Op != OpConst8 {
4335 continue
4336 }
4337 d := auxIntToInt8(v_1_1.AuxInt)
4338 if !(d >= c) {
4339 continue
4340 }
4341 v.reset(OpLeq8U)
4342 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4343 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4344 v1.AuxInt = int8ToAuxInt(c)
4345 v0.AddArg2(x, v1)
4346 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4347 v2.AuxInt = int8ToAuxInt(d - c)
4348 v.AddArg2(v0, v2)
4349 return true
4350 }
4351 break
4352 }
4353
4354
4355
4356 for {
4357 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4358 if v_0.Op != OpLess64 {
4359 continue
4360 }
4361 x := v_0.Args[1]
4362 v_0_0 := v_0.Args[0]
4363 if v_0_0.Op != OpConst64 {
4364 continue
4365 }
4366 c := auxIntToInt64(v_0_0.AuxInt)
4367 if v_1.Op != OpLess64 {
4368 continue
4369 }
4370 _ = v_1.Args[1]
4371 if x != v_1.Args[0] {
4372 continue
4373 }
4374 v_1_1 := v_1.Args[1]
4375 if v_1_1.Op != OpConst64 {
4376 continue
4377 }
4378 d := auxIntToInt64(v_1_1.AuxInt)
4379 if !(d >= c+1 && c+1 > c) {
4380 continue
4381 }
4382 v.reset(OpLess64U)
4383 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4384 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4385 v1.AuxInt = int64ToAuxInt(c + 1)
4386 v0.AddArg2(x, v1)
4387 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4388 v2.AuxInt = int64ToAuxInt(d - c - 1)
4389 v.AddArg2(v0, v2)
4390 return true
4391 }
4392 break
4393 }
4394
4395
4396
4397 for {
4398 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4399 if v_0.Op != OpLess64 {
4400 continue
4401 }
4402 x := v_0.Args[1]
4403 v_0_0 := v_0.Args[0]
4404 if v_0_0.Op != OpConst64 {
4405 continue
4406 }
4407 c := auxIntToInt64(v_0_0.AuxInt)
4408 if v_1.Op != OpLeq64 {
4409 continue
4410 }
4411 _ = v_1.Args[1]
4412 if x != v_1.Args[0] {
4413 continue
4414 }
4415 v_1_1 := v_1.Args[1]
4416 if v_1_1.Op != OpConst64 {
4417 continue
4418 }
4419 d := auxIntToInt64(v_1_1.AuxInt)
4420 if !(d >= c+1 && c+1 > c) {
4421 continue
4422 }
4423 v.reset(OpLeq64U)
4424 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4425 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4426 v1.AuxInt = int64ToAuxInt(c + 1)
4427 v0.AddArg2(x, v1)
4428 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4429 v2.AuxInt = int64ToAuxInt(d - c - 1)
4430 v.AddArg2(v0, v2)
4431 return true
4432 }
4433 break
4434 }
4435
4436
4437
4438 for {
4439 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4440 if v_0.Op != OpLess32 {
4441 continue
4442 }
4443 x := v_0.Args[1]
4444 v_0_0 := v_0.Args[0]
4445 if v_0_0.Op != OpConst32 {
4446 continue
4447 }
4448 c := auxIntToInt32(v_0_0.AuxInt)
4449 if v_1.Op != OpLess32 {
4450 continue
4451 }
4452 _ = v_1.Args[1]
4453 if x != v_1.Args[0] {
4454 continue
4455 }
4456 v_1_1 := v_1.Args[1]
4457 if v_1_1.Op != OpConst32 {
4458 continue
4459 }
4460 d := auxIntToInt32(v_1_1.AuxInt)
4461 if !(d >= c+1 && c+1 > c) {
4462 continue
4463 }
4464 v.reset(OpLess32U)
4465 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4466 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4467 v1.AuxInt = int32ToAuxInt(c + 1)
4468 v0.AddArg2(x, v1)
4469 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4470 v2.AuxInt = int32ToAuxInt(d - c - 1)
4471 v.AddArg2(v0, v2)
4472 return true
4473 }
4474 break
4475 }
4476
4477
4478
4479 for {
4480 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4481 if v_0.Op != OpLess32 {
4482 continue
4483 }
4484 x := v_0.Args[1]
4485 v_0_0 := v_0.Args[0]
4486 if v_0_0.Op != OpConst32 {
4487 continue
4488 }
4489 c := auxIntToInt32(v_0_0.AuxInt)
4490 if v_1.Op != OpLeq32 {
4491 continue
4492 }
4493 _ = v_1.Args[1]
4494 if x != v_1.Args[0] {
4495 continue
4496 }
4497 v_1_1 := v_1.Args[1]
4498 if v_1_1.Op != OpConst32 {
4499 continue
4500 }
4501 d := auxIntToInt32(v_1_1.AuxInt)
4502 if !(d >= c+1 && c+1 > c) {
4503 continue
4504 }
4505 v.reset(OpLeq32U)
4506 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4507 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4508 v1.AuxInt = int32ToAuxInt(c + 1)
4509 v0.AddArg2(x, v1)
4510 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4511 v2.AuxInt = int32ToAuxInt(d - c - 1)
4512 v.AddArg2(v0, v2)
4513 return true
4514 }
4515 break
4516 }
4517
4518
4519
4520 for {
4521 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4522 if v_0.Op != OpLess16 {
4523 continue
4524 }
4525 x := v_0.Args[1]
4526 v_0_0 := v_0.Args[0]
4527 if v_0_0.Op != OpConst16 {
4528 continue
4529 }
4530 c := auxIntToInt16(v_0_0.AuxInt)
4531 if v_1.Op != OpLess16 {
4532 continue
4533 }
4534 _ = v_1.Args[1]
4535 if x != v_1.Args[0] {
4536 continue
4537 }
4538 v_1_1 := v_1.Args[1]
4539 if v_1_1.Op != OpConst16 {
4540 continue
4541 }
4542 d := auxIntToInt16(v_1_1.AuxInt)
4543 if !(d >= c+1 && c+1 > c) {
4544 continue
4545 }
4546 v.reset(OpLess16U)
4547 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4548 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4549 v1.AuxInt = int16ToAuxInt(c + 1)
4550 v0.AddArg2(x, v1)
4551 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4552 v2.AuxInt = int16ToAuxInt(d - c - 1)
4553 v.AddArg2(v0, v2)
4554 return true
4555 }
4556 break
4557 }
4558
4559
4560
4561 for {
4562 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4563 if v_0.Op != OpLess16 {
4564 continue
4565 }
4566 x := v_0.Args[1]
4567 v_0_0 := v_0.Args[0]
4568 if v_0_0.Op != OpConst16 {
4569 continue
4570 }
4571 c := auxIntToInt16(v_0_0.AuxInt)
4572 if v_1.Op != OpLeq16 {
4573 continue
4574 }
4575 _ = v_1.Args[1]
4576 if x != v_1.Args[0] {
4577 continue
4578 }
4579 v_1_1 := v_1.Args[1]
4580 if v_1_1.Op != OpConst16 {
4581 continue
4582 }
4583 d := auxIntToInt16(v_1_1.AuxInt)
4584 if !(d >= c+1 && c+1 > c) {
4585 continue
4586 }
4587 v.reset(OpLeq16U)
4588 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4589 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4590 v1.AuxInt = int16ToAuxInt(c + 1)
4591 v0.AddArg2(x, v1)
4592 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4593 v2.AuxInt = int16ToAuxInt(d - c - 1)
4594 v.AddArg2(v0, v2)
4595 return true
4596 }
4597 break
4598 }
4599
4600
4601
4602 for {
4603 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4604 if v_0.Op != OpLess8 {
4605 continue
4606 }
4607 x := v_0.Args[1]
4608 v_0_0 := v_0.Args[0]
4609 if v_0_0.Op != OpConst8 {
4610 continue
4611 }
4612 c := auxIntToInt8(v_0_0.AuxInt)
4613 if v_1.Op != OpLess8 {
4614 continue
4615 }
4616 _ = v_1.Args[1]
4617 if x != v_1.Args[0] {
4618 continue
4619 }
4620 v_1_1 := v_1.Args[1]
4621 if v_1_1.Op != OpConst8 {
4622 continue
4623 }
4624 d := auxIntToInt8(v_1_1.AuxInt)
4625 if !(d >= c+1 && c+1 > c) {
4626 continue
4627 }
4628 v.reset(OpLess8U)
4629 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4630 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4631 v1.AuxInt = int8ToAuxInt(c + 1)
4632 v0.AddArg2(x, v1)
4633 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4634 v2.AuxInt = int8ToAuxInt(d - c - 1)
4635 v.AddArg2(v0, v2)
4636 return true
4637 }
4638 break
4639 }
4640
4641
4642
4643 for {
4644 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4645 if v_0.Op != OpLess8 {
4646 continue
4647 }
4648 x := v_0.Args[1]
4649 v_0_0 := v_0.Args[0]
4650 if v_0_0.Op != OpConst8 {
4651 continue
4652 }
4653 c := auxIntToInt8(v_0_0.AuxInt)
4654 if v_1.Op != OpLeq8 {
4655 continue
4656 }
4657 _ = v_1.Args[1]
4658 if x != v_1.Args[0] {
4659 continue
4660 }
4661 v_1_1 := v_1.Args[1]
4662 if v_1_1.Op != OpConst8 {
4663 continue
4664 }
4665 d := auxIntToInt8(v_1_1.AuxInt)
4666 if !(d >= c+1 && c+1 > c) {
4667 continue
4668 }
4669 v.reset(OpLeq8U)
4670 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4671 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4672 v1.AuxInt = int8ToAuxInt(c + 1)
4673 v0.AddArg2(x, v1)
4674 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4675 v2.AuxInt = int8ToAuxInt(d - c - 1)
4676 v.AddArg2(v0, v2)
4677 return true
4678 }
4679 break
4680 }
4681
4682
4683
4684 for {
4685 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4686 if v_0.Op != OpLeq64U {
4687 continue
4688 }
4689 x := v_0.Args[1]
4690 v_0_0 := v_0.Args[0]
4691 if v_0_0.Op != OpConst64 {
4692 continue
4693 }
4694 c := auxIntToInt64(v_0_0.AuxInt)
4695 if v_1.Op != OpLess64U {
4696 continue
4697 }
4698 _ = v_1.Args[1]
4699 if x != v_1.Args[0] {
4700 continue
4701 }
4702 v_1_1 := v_1.Args[1]
4703 if v_1_1.Op != OpConst64 {
4704 continue
4705 }
4706 d := auxIntToInt64(v_1_1.AuxInt)
4707 if !(uint64(d) >= uint64(c)) {
4708 continue
4709 }
4710 v.reset(OpLess64U)
4711 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4712 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4713 v1.AuxInt = int64ToAuxInt(c)
4714 v0.AddArg2(x, v1)
4715 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4716 v2.AuxInt = int64ToAuxInt(d - c)
4717 v.AddArg2(v0, v2)
4718 return true
4719 }
4720 break
4721 }
4722
4723
4724
4725 for {
4726 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4727 if v_0.Op != OpLeq64U {
4728 continue
4729 }
4730 x := v_0.Args[1]
4731 v_0_0 := v_0.Args[0]
4732 if v_0_0.Op != OpConst64 {
4733 continue
4734 }
4735 c := auxIntToInt64(v_0_0.AuxInt)
4736 if v_1.Op != OpLeq64U {
4737 continue
4738 }
4739 _ = v_1.Args[1]
4740 if x != v_1.Args[0] {
4741 continue
4742 }
4743 v_1_1 := v_1.Args[1]
4744 if v_1_1.Op != OpConst64 {
4745 continue
4746 }
4747 d := auxIntToInt64(v_1_1.AuxInt)
4748 if !(uint64(d) >= uint64(c)) {
4749 continue
4750 }
4751 v.reset(OpLeq64U)
4752 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4753 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4754 v1.AuxInt = int64ToAuxInt(c)
4755 v0.AddArg2(x, v1)
4756 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4757 v2.AuxInt = int64ToAuxInt(d - c)
4758 v.AddArg2(v0, v2)
4759 return true
4760 }
4761 break
4762 }
4763
4764
4765
4766 for {
4767 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4768 if v_0.Op != OpLeq32U {
4769 continue
4770 }
4771 x := v_0.Args[1]
4772 v_0_0 := v_0.Args[0]
4773 if v_0_0.Op != OpConst32 {
4774 continue
4775 }
4776 c := auxIntToInt32(v_0_0.AuxInt)
4777 if v_1.Op != OpLess32U {
4778 continue
4779 }
4780 _ = v_1.Args[1]
4781 if x != v_1.Args[0] {
4782 continue
4783 }
4784 v_1_1 := v_1.Args[1]
4785 if v_1_1.Op != OpConst32 {
4786 continue
4787 }
4788 d := auxIntToInt32(v_1_1.AuxInt)
4789 if !(uint32(d) >= uint32(c)) {
4790 continue
4791 }
4792 v.reset(OpLess32U)
4793 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4794 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4795 v1.AuxInt = int32ToAuxInt(c)
4796 v0.AddArg2(x, v1)
4797 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4798 v2.AuxInt = int32ToAuxInt(d - c)
4799 v.AddArg2(v0, v2)
4800 return true
4801 }
4802 break
4803 }
4804
4805
4806
4807 for {
4808 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4809 if v_0.Op != OpLeq32U {
4810 continue
4811 }
4812 x := v_0.Args[1]
4813 v_0_0 := v_0.Args[0]
4814 if v_0_0.Op != OpConst32 {
4815 continue
4816 }
4817 c := auxIntToInt32(v_0_0.AuxInt)
4818 if v_1.Op != OpLeq32U {
4819 continue
4820 }
4821 _ = v_1.Args[1]
4822 if x != v_1.Args[0] {
4823 continue
4824 }
4825 v_1_1 := v_1.Args[1]
4826 if v_1_1.Op != OpConst32 {
4827 continue
4828 }
4829 d := auxIntToInt32(v_1_1.AuxInt)
4830 if !(uint32(d) >= uint32(c)) {
4831 continue
4832 }
4833 v.reset(OpLeq32U)
4834 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4835 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4836 v1.AuxInt = int32ToAuxInt(c)
4837 v0.AddArg2(x, v1)
4838 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4839 v2.AuxInt = int32ToAuxInt(d - c)
4840 v.AddArg2(v0, v2)
4841 return true
4842 }
4843 break
4844 }
4845
4846
4847
4848 for {
4849 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4850 if v_0.Op != OpLeq16U {
4851 continue
4852 }
4853 x := v_0.Args[1]
4854 v_0_0 := v_0.Args[0]
4855 if v_0_0.Op != OpConst16 {
4856 continue
4857 }
4858 c := auxIntToInt16(v_0_0.AuxInt)
4859 if v_1.Op != OpLess16U {
4860 continue
4861 }
4862 _ = v_1.Args[1]
4863 if x != v_1.Args[0] {
4864 continue
4865 }
4866 v_1_1 := v_1.Args[1]
4867 if v_1_1.Op != OpConst16 {
4868 continue
4869 }
4870 d := auxIntToInt16(v_1_1.AuxInt)
4871 if !(uint16(d) >= uint16(c)) {
4872 continue
4873 }
4874 v.reset(OpLess16U)
4875 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4876 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4877 v1.AuxInt = int16ToAuxInt(c)
4878 v0.AddArg2(x, v1)
4879 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4880 v2.AuxInt = int16ToAuxInt(d - c)
4881 v.AddArg2(v0, v2)
4882 return true
4883 }
4884 break
4885 }
4886
4887
4888
4889 for {
4890 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4891 if v_0.Op != OpLeq16U {
4892 continue
4893 }
4894 x := v_0.Args[1]
4895 v_0_0 := v_0.Args[0]
4896 if v_0_0.Op != OpConst16 {
4897 continue
4898 }
4899 c := auxIntToInt16(v_0_0.AuxInt)
4900 if v_1.Op != OpLeq16U {
4901 continue
4902 }
4903 _ = v_1.Args[1]
4904 if x != v_1.Args[0] {
4905 continue
4906 }
4907 v_1_1 := v_1.Args[1]
4908 if v_1_1.Op != OpConst16 {
4909 continue
4910 }
4911 d := auxIntToInt16(v_1_1.AuxInt)
4912 if !(uint16(d) >= uint16(c)) {
4913 continue
4914 }
4915 v.reset(OpLeq16U)
4916 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4917 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4918 v1.AuxInt = int16ToAuxInt(c)
4919 v0.AddArg2(x, v1)
4920 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4921 v2.AuxInt = int16ToAuxInt(d - c)
4922 v.AddArg2(v0, v2)
4923 return true
4924 }
4925 break
4926 }
4927
4928
4929
4930 for {
4931 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4932 if v_0.Op != OpLeq8U {
4933 continue
4934 }
4935 x := v_0.Args[1]
4936 v_0_0 := v_0.Args[0]
4937 if v_0_0.Op != OpConst8 {
4938 continue
4939 }
4940 c := auxIntToInt8(v_0_0.AuxInt)
4941 if v_1.Op != OpLess8U {
4942 continue
4943 }
4944 _ = v_1.Args[1]
4945 if x != v_1.Args[0] {
4946 continue
4947 }
4948 v_1_1 := v_1.Args[1]
4949 if v_1_1.Op != OpConst8 {
4950 continue
4951 }
4952 d := auxIntToInt8(v_1_1.AuxInt)
4953 if !(uint8(d) >= uint8(c)) {
4954 continue
4955 }
4956 v.reset(OpLess8U)
4957 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4958 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4959 v1.AuxInt = int8ToAuxInt(c)
4960 v0.AddArg2(x, v1)
4961 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4962 v2.AuxInt = int8ToAuxInt(d - c)
4963 v.AddArg2(v0, v2)
4964 return true
4965 }
4966 break
4967 }
4968
4969
4970
4971 for {
4972 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4973 if v_0.Op != OpLeq8U {
4974 continue
4975 }
4976 x := v_0.Args[1]
4977 v_0_0 := v_0.Args[0]
4978 if v_0_0.Op != OpConst8 {
4979 continue
4980 }
4981 c := auxIntToInt8(v_0_0.AuxInt)
4982 if v_1.Op != OpLeq8U {
4983 continue
4984 }
4985 _ = v_1.Args[1]
4986 if x != v_1.Args[0] {
4987 continue
4988 }
4989 v_1_1 := v_1.Args[1]
4990 if v_1_1.Op != OpConst8 {
4991 continue
4992 }
4993 d := auxIntToInt8(v_1_1.AuxInt)
4994 if !(uint8(d) >= uint8(c)) {
4995 continue
4996 }
4997 v.reset(OpLeq8U)
4998 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4999 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5000 v1.AuxInt = int8ToAuxInt(c)
5001 v0.AddArg2(x, v1)
5002 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5003 v2.AuxInt = int8ToAuxInt(d - c)
5004 v.AddArg2(v0, v2)
5005 return true
5006 }
5007 break
5008 }
5009
5010
5011
5012 for {
5013 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5014 if v_0.Op != OpLess64U {
5015 continue
5016 }
5017 x := v_0.Args[1]
5018 v_0_0 := v_0.Args[0]
5019 if v_0_0.Op != OpConst64 {
5020 continue
5021 }
5022 c := auxIntToInt64(v_0_0.AuxInt)
5023 if v_1.Op != OpLess64U {
5024 continue
5025 }
5026 _ = v_1.Args[1]
5027 if x != v_1.Args[0] {
5028 continue
5029 }
5030 v_1_1 := v_1.Args[1]
5031 if v_1_1.Op != OpConst64 {
5032 continue
5033 }
5034 d := auxIntToInt64(v_1_1.AuxInt)
5035 if !(uint64(d) >= uint64(c+1) && uint64(c+1) > uint64(c)) {
5036 continue
5037 }
5038 v.reset(OpLess64U)
5039 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
5040 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
5041 v1.AuxInt = int64ToAuxInt(c + 1)
5042 v0.AddArg2(x, v1)
5043 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
5044 v2.AuxInt = int64ToAuxInt(d - c - 1)
5045 v.AddArg2(v0, v2)
5046 return true
5047 }
5048 break
5049 }
5050
5051
5052
5053 for {
5054 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5055 if v_0.Op != OpLess64U {
5056 continue
5057 }
5058 x := v_0.Args[1]
5059 v_0_0 := v_0.Args[0]
5060 if v_0_0.Op != OpConst64 {
5061 continue
5062 }
5063 c := auxIntToInt64(v_0_0.AuxInt)
5064 if v_1.Op != OpLeq64U {
5065 continue
5066 }
5067 _ = v_1.Args[1]
5068 if x != v_1.Args[0] {
5069 continue
5070 }
5071 v_1_1 := v_1.Args[1]
5072 if v_1_1.Op != OpConst64 {
5073 continue
5074 }
5075 d := auxIntToInt64(v_1_1.AuxInt)
5076 if !(uint64(d) >= uint64(c+1) && uint64(c+1) > uint64(c)) {
5077 continue
5078 }
5079 v.reset(OpLeq64U)
5080 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
5081 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
5082 v1.AuxInt = int64ToAuxInt(c + 1)
5083 v0.AddArg2(x, v1)
5084 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
5085 v2.AuxInt = int64ToAuxInt(d - c - 1)
5086 v.AddArg2(v0, v2)
5087 return true
5088 }
5089 break
5090 }
5091
5092
5093
5094 for {
5095 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5096 if v_0.Op != OpLess32U {
5097 continue
5098 }
5099 x := v_0.Args[1]
5100 v_0_0 := v_0.Args[0]
5101 if v_0_0.Op != OpConst32 {
5102 continue
5103 }
5104 c := auxIntToInt32(v_0_0.AuxInt)
5105 if v_1.Op != OpLess32U {
5106 continue
5107 }
5108 _ = v_1.Args[1]
5109 if x != v_1.Args[0] {
5110 continue
5111 }
5112 v_1_1 := v_1.Args[1]
5113 if v_1_1.Op != OpConst32 {
5114 continue
5115 }
5116 d := auxIntToInt32(v_1_1.AuxInt)
5117 if !(uint32(d) >= uint32(c+1) && uint32(c+1) > uint32(c)) {
5118 continue
5119 }
5120 v.reset(OpLess32U)
5121 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
5122 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
5123 v1.AuxInt = int32ToAuxInt(c + 1)
5124 v0.AddArg2(x, v1)
5125 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
5126 v2.AuxInt = int32ToAuxInt(d - c - 1)
5127 v.AddArg2(v0, v2)
5128 return true
5129 }
5130 break
5131 }
5132
5133
5134
5135 for {
5136 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5137 if v_0.Op != OpLess32U {
5138 continue
5139 }
5140 x := v_0.Args[1]
5141 v_0_0 := v_0.Args[0]
5142 if v_0_0.Op != OpConst32 {
5143 continue
5144 }
5145 c := auxIntToInt32(v_0_0.AuxInt)
5146 if v_1.Op != OpLeq32U {
5147 continue
5148 }
5149 _ = v_1.Args[1]
5150 if x != v_1.Args[0] {
5151 continue
5152 }
5153 v_1_1 := v_1.Args[1]
5154 if v_1_1.Op != OpConst32 {
5155 continue
5156 }
5157 d := auxIntToInt32(v_1_1.AuxInt)
5158 if !(uint32(d) >= uint32(c+1) && uint32(c+1) > uint32(c)) {
5159 continue
5160 }
5161 v.reset(OpLeq32U)
5162 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
5163 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
5164 v1.AuxInt = int32ToAuxInt(c + 1)
5165 v0.AddArg2(x, v1)
5166 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
5167 v2.AuxInt = int32ToAuxInt(d - c - 1)
5168 v.AddArg2(v0, v2)
5169 return true
5170 }
5171 break
5172 }
5173
5174
5175
5176 for {
5177 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5178 if v_0.Op != OpLess16U {
5179 continue
5180 }
5181 x := v_0.Args[1]
5182 v_0_0 := v_0.Args[0]
5183 if v_0_0.Op != OpConst16 {
5184 continue
5185 }
5186 c := auxIntToInt16(v_0_0.AuxInt)
5187 if v_1.Op != OpLess16U {
5188 continue
5189 }
5190 _ = v_1.Args[1]
5191 if x != v_1.Args[0] {
5192 continue
5193 }
5194 v_1_1 := v_1.Args[1]
5195 if v_1_1.Op != OpConst16 {
5196 continue
5197 }
5198 d := auxIntToInt16(v_1_1.AuxInt)
5199 if !(uint16(d) >= uint16(c+1) && uint16(c+1) > uint16(c)) {
5200 continue
5201 }
5202 v.reset(OpLess16U)
5203 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
5204 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5205 v1.AuxInt = int16ToAuxInt(c + 1)
5206 v0.AddArg2(x, v1)
5207 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
5208 v2.AuxInt = int16ToAuxInt(d - c - 1)
5209 v.AddArg2(v0, v2)
5210 return true
5211 }
5212 break
5213 }
5214
5215
5216
5217 for {
5218 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5219 if v_0.Op != OpLess16U {
5220 continue
5221 }
5222 x := v_0.Args[1]
5223 v_0_0 := v_0.Args[0]
5224 if v_0_0.Op != OpConst16 {
5225 continue
5226 }
5227 c := auxIntToInt16(v_0_0.AuxInt)
5228 if v_1.Op != OpLeq16U {
5229 continue
5230 }
5231 _ = v_1.Args[1]
5232 if x != v_1.Args[0] {
5233 continue
5234 }
5235 v_1_1 := v_1.Args[1]
5236 if v_1_1.Op != OpConst16 {
5237 continue
5238 }
5239 d := auxIntToInt16(v_1_1.AuxInt)
5240 if !(uint16(d) >= uint16(c+1) && uint16(c+1) > uint16(c)) {
5241 continue
5242 }
5243 v.reset(OpLeq16U)
5244 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
5245 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5246 v1.AuxInt = int16ToAuxInt(c + 1)
5247 v0.AddArg2(x, v1)
5248 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
5249 v2.AuxInt = int16ToAuxInt(d - c - 1)
5250 v.AddArg2(v0, v2)
5251 return true
5252 }
5253 break
5254 }
5255
5256
5257
5258 for {
5259 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5260 if v_0.Op != OpLess8U {
5261 continue
5262 }
5263 x := v_0.Args[1]
5264 v_0_0 := v_0.Args[0]
5265 if v_0_0.Op != OpConst8 {
5266 continue
5267 }
5268 c := auxIntToInt8(v_0_0.AuxInt)
5269 if v_1.Op != OpLess8U {
5270 continue
5271 }
5272 _ = v_1.Args[1]
5273 if x != v_1.Args[0] {
5274 continue
5275 }
5276 v_1_1 := v_1.Args[1]
5277 if v_1_1.Op != OpConst8 {
5278 continue
5279 }
5280 d := auxIntToInt8(v_1_1.AuxInt)
5281 if !(uint8(d) >= uint8(c+1) && uint8(c+1) > uint8(c)) {
5282 continue
5283 }
5284 v.reset(OpLess8U)
5285 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
5286 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5287 v1.AuxInt = int8ToAuxInt(c + 1)
5288 v0.AddArg2(x, v1)
5289 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5290 v2.AuxInt = int8ToAuxInt(d - c - 1)
5291 v.AddArg2(v0, v2)
5292 return true
5293 }
5294 break
5295 }
5296
5297
5298
5299 for {
5300 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5301 if v_0.Op != OpLess8U {
5302 continue
5303 }
5304 x := v_0.Args[1]
5305 v_0_0 := v_0.Args[0]
5306 if v_0_0.Op != OpConst8 {
5307 continue
5308 }
5309 c := auxIntToInt8(v_0_0.AuxInt)
5310 if v_1.Op != OpLeq8U {
5311 continue
5312 }
5313 _ = v_1.Args[1]
5314 if x != v_1.Args[0] {
5315 continue
5316 }
5317 v_1_1 := v_1.Args[1]
5318 if v_1_1.Op != OpConst8 {
5319 continue
5320 }
5321 d := auxIntToInt8(v_1_1.AuxInt)
5322 if !(uint8(d) >= uint8(c+1) && uint8(c+1) > uint8(c)) {
5323 continue
5324 }
5325 v.reset(OpLeq8U)
5326 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
5327 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5328 v1.AuxInt = int8ToAuxInt(c + 1)
5329 v0.AddArg2(x, v1)
5330 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5331 v2.AuxInt = int8ToAuxInt(d - c - 1)
5332 v.AddArg2(v0, v2)
5333 return true
5334 }
5335 break
5336 }
5337
5338
5339
5340 for {
5341 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5342 if v_0.Op != OpNeq64 {
5343 continue
5344 }
5345 _ = v_0.Args[1]
5346 v_0_0 := v_0.Args[0]
5347 v_0_1 := v_0.Args[1]
5348 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5349 x := v_0_0
5350 cv := v_0_1
5351 if cv.Op != OpConst64 {
5352 continue
5353 }
5354 c := auxIntToInt64(cv.AuxInt)
5355 if v_1.Op != OpNeq64 {
5356 continue
5357 }
5358 _ = v_1.Args[1]
5359 v_1_0 := v_1.Args[0]
5360 v_1_1 := v_1.Args[1]
5361 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5362 if x != v_1_0 || v_1_1.Op != OpConst64 {
5363 continue
5364 }
5365 d := auxIntToInt64(v_1_1.AuxInt)
5366 if !(c|d == c && oneBit(c^d)) {
5367 continue
5368 }
5369 v.reset(OpNeq64)
5370 v0 := b.NewValue0(v.Pos, OpOr64, x.Type)
5371 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
5372 v1.AuxInt = int64ToAuxInt(c ^ d)
5373 v0.AddArg2(x, v1)
5374 v.AddArg2(v0, cv)
5375 return true
5376 }
5377 }
5378 }
5379 break
5380 }
5381
5382
5383
5384 for {
5385 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5386 if v_0.Op != OpNeq32 {
5387 continue
5388 }
5389 _ = v_0.Args[1]
5390 v_0_0 := v_0.Args[0]
5391 v_0_1 := v_0.Args[1]
5392 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5393 x := v_0_0
5394 cv := v_0_1
5395 if cv.Op != OpConst32 {
5396 continue
5397 }
5398 c := auxIntToInt32(cv.AuxInt)
5399 if v_1.Op != OpNeq32 {
5400 continue
5401 }
5402 _ = v_1.Args[1]
5403 v_1_0 := v_1.Args[0]
5404 v_1_1 := v_1.Args[1]
5405 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5406 if x != v_1_0 || v_1_1.Op != OpConst32 {
5407 continue
5408 }
5409 d := auxIntToInt32(v_1_1.AuxInt)
5410 if !(c|d == c && oneBit(c^d)) {
5411 continue
5412 }
5413 v.reset(OpNeq32)
5414 v0 := b.NewValue0(v.Pos, OpOr32, x.Type)
5415 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
5416 v1.AuxInt = int32ToAuxInt(c ^ d)
5417 v0.AddArg2(x, v1)
5418 v.AddArg2(v0, cv)
5419 return true
5420 }
5421 }
5422 }
5423 break
5424 }
5425
5426
5427
5428 for {
5429 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5430 if v_0.Op != OpNeq16 {
5431 continue
5432 }
5433 _ = v_0.Args[1]
5434 v_0_0 := v_0.Args[0]
5435 v_0_1 := v_0.Args[1]
5436 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5437 x := v_0_0
5438 cv := v_0_1
5439 if cv.Op != OpConst16 {
5440 continue
5441 }
5442 c := auxIntToInt16(cv.AuxInt)
5443 if v_1.Op != OpNeq16 {
5444 continue
5445 }
5446 _ = v_1.Args[1]
5447 v_1_0 := v_1.Args[0]
5448 v_1_1 := v_1.Args[1]
5449 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5450 if x != v_1_0 || v_1_1.Op != OpConst16 {
5451 continue
5452 }
5453 d := auxIntToInt16(v_1_1.AuxInt)
5454 if !(c|d == c && oneBit(c^d)) {
5455 continue
5456 }
5457 v.reset(OpNeq16)
5458 v0 := b.NewValue0(v.Pos, OpOr16, x.Type)
5459 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5460 v1.AuxInt = int16ToAuxInt(c ^ d)
5461 v0.AddArg2(x, v1)
5462 v.AddArg2(v0, cv)
5463 return true
5464 }
5465 }
5466 }
5467 break
5468 }
5469
5470
5471
5472 for {
5473 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5474 if v_0.Op != OpNeq8 {
5475 continue
5476 }
5477 _ = v_0.Args[1]
5478 v_0_0 := v_0.Args[0]
5479 v_0_1 := v_0.Args[1]
5480 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5481 x := v_0_0
5482 cv := v_0_1
5483 if cv.Op != OpConst8 {
5484 continue
5485 }
5486 c := auxIntToInt8(cv.AuxInt)
5487 if v_1.Op != OpNeq8 {
5488 continue
5489 }
5490 _ = v_1.Args[1]
5491 v_1_0 := v_1.Args[0]
5492 v_1_1 := v_1.Args[1]
5493 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5494 if x != v_1_0 || v_1_1.Op != OpConst8 {
5495 continue
5496 }
5497 d := auxIntToInt8(v_1_1.AuxInt)
5498 if !(c|d == c && oneBit(c^d)) {
5499 continue
5500 }
5501 v.reset(OpNeq8)
5502 v0 := b.NewValue0(v.Pos, OpOr8, x.Type)
5503 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5504 v1.AuxInt = int8ToAuxInt(c ^ d)
5505 v0.AddArg2(x, v1)
5506 v.AddArg2(v0, cv)
5507 return true
5508 }
5509 }
5510 }
5511 break
5512 }
5513 return false
5514 }
5515 func rewriteValuegeneric_OpArraySelect(v *Value) bool {
5516 v_0 := v.Args[0]
5517
5518
5519 for {
5520 if v_0.Op != OpArrayMake1 {
5521 break
5522 }
5523 x := v_0.Args[0]
5524 v.copyOf(x)
5525 return true
5526 }
5527
5528
5529 for {
5530 if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpIData {
5531 break
5532 }
5533 x := v_0.Args[0]
5534 v.reset(OpIData)
5535 v.AddArg(x)
5536 return true
5537 }
5538 return false
5539 }
5540 func rewriteValuegeneric_OpBitLen16(v *Value) bool {
5541 v_0 := v.Args[0]
5542 b := v.Block
5543 config := b.Func.Config
5544
5545
5546
5547 for {
5548 if v_0.Op != OpConst16 {
5549 break
5550 }
5551 c := auxIntToInt16(v_0.AuxInt)
5552 if !(config.PtrSize == 8) {
5553 break
5554 }
5555 v.reset(OpConst64)
5556 v.AuxInt = int64ToAuxInt(int64(bits.Len16(uint16(c))))
5557 return true
5558 }
5559
5560
5561
5562 for {
5563 if v_0.Op != OpConst16 {
5564 break
5565 }
5566 c := auxIntToInt16(v_0.AuxInt)
5567 if !(config.PtrSize == 4) {
5568 break
5569 }
5570 v.reset(OpConst32)
5571 v.AuxInt = int32ToAuxInt(int32(bits.Len16(uint16(c))))
5572 return true
5573 }
5574 return false
5575 }
5576 func rewriteValuegeneric_OpBitLen32(v *Value) bool {
5577 v_0 := v.Args[0]
5578 b := v.Block
5579 config := b.Func.Config
5580
5581
5582
5583 for {
5584 if v_0.Op != OpConst32 {
5585 break
5586 }
5587 c := auxIntToInt32(v_0.AuxInt)
5588 if !(config.PtrSize == 8) {
5589 break
5590 }
5591 v.reset(OpConst64)
5592 v.AuxInt = int64ToAuxInt(int64(bits.Len32(uint32(c))))
5593 return true
5594 }
5595
5596
5597
5598 for {
5599 if v_0.Op != OpConst32 {
5600 break
5601 }
5602 c := auxIntToInt32(v_0.AuxInt)
5603 if !(config.PtrSize == 4) {
5604 break
5605 }
5606 v.reset(OpConst32)
5607 v.AuxInt = int32ToAuxInt(int32(bits.Len32(uint32(c))))
5608 return true
5609 }
5610 return false
5611 }
5612 func rewriteValuegeneric_OpBitLen64(v *Value) bool {
5613 v_0 := v.Args[0]
5614 b := v.Block
5615 config := b.Func.Config
5616
5617
5618
5619 for {
5620 if v_0.Op != OpConst64 {
5621 break
5622 }
5623 c := auxIntToInt64(v_0.AuxInt)
5624 if !(config.PtrSize == 8) {
5625 break
5626 }
5627 v.reset(OpConst64)
5628 v.AuxInt = int64ToAuxInt(int64(bits.Len64(uint64(c))))
5629 return true
5630 }
5631
5632
5633
5634 for {
5635 if v_0.Op != OpConst64 {
5636 break
5637 }
5638 c := auxIntToInt64(v_0.AuxInt)
5639 if !(config.PtrSize == 4) {
5640 break
5641 }
5642 v.reset(OpConst32)
5643 v.AuxInt = int32ToAuxInt(int32(bits.Len64(uint64(c))))
5644 return true
5645 }
5646 return false
5647 }
5648 func rewriteValuegeneric_OpBitLen8(v *Value) bool {
5649 v_0 := v.Args[0]
5650 b := v.Block
5651 config := b.Func.Config
5652
5653
5654
5655 for {
5656 if v_0.Op != OpConst8 {
5657 break
5658 }
5659 c := auxIntToInt8(v_0.AuxInt)
5660 if !(config.PtrSize == 8) {
5661 break
5662 }
5663 v.reset(OpConst64)
5664 v.AuxInt = int64ToAuxInt(int64(bits.Len8(uint8(c))))
5665 return true
5666 }
5667
5668
5669
5670 for {
5671 if v_0.Op != OpConst8 {
5672 break
5673 }
5674 c := auxIntToInt8(v_0.AuxInt)
5675 if !(config.PtrSize == 4) {
5676 break
5677 }
5678 v.reset(OpConst32)
5679 v.AuxInt = int32ToAuxInt(int32(bits.Len8(uint8(c))))
5680 return true
5681 }
5682 return false
5683 }
5684 func rewriteValuegeneric_OpCeil(v *Value) bool {
5685 v_0 := v.Args[0]
5686
5687
5688 for {
5689 if v_0.Op != OpConst64F {
5690 break
5691 }
5692 c := auxIntToFloat64(v_0.AuxInt)
5693 v.reset(OpConst64F)
5694 v.AuxInt = float64ToAuxInt(math.Ceil(c))
5695 return true
5696 }
5697 return false
5698 }
5699 func rewriteValuegeneric_OpCom16(v *Value) bool {
5700 v_0 := v.Args[0]
5701
5702
5703 for {
5704 if v_0.Op != OpCom16 {
5705 break
5706 }
5707 x := v_0.Args[0]
5708 v.copyOf(x)
5709 return true
5710 }
5711
5712
5713 for {
5714 if v_0.Op != OpConst16 {
5715 break
5716 }
5717 c := auxIntToInt16(v_0.AuxInt)
5718 v.reset(OpConst16)
5719 v.AuxInt = int16ToAuxInt(^c)
5720 return true
5721 }
5722
5723
5724 for {
5725 if v_0.Op != OpAdd16 {
5726 break
5727 }
5728 _ = v_0.Args[1]
5729 v_0_0 := v_0.Args[0]
5730 v_0_1 := v_0.Args[1]
5731 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5732 if v_0_0.Op != OpConst16 || auxIntToInt16(v_0_0.AuxInt) != -1 {
5733 continue
5734 }
5735 x := v_0_1
5736 v.reset(OpNeg16)
5737 v.AddArg(x)
5738 return true
5739 }
5740 break
5741 }
5742 return false
5743 }
5744 func rewriteValuegeneric_OpCom32(v *Value) bool {
5745 v_0 := v.Args[0]
5746
5747
5748 for {
5749 if v_0.Op != OpCom32 {
5750 break
5751 }
5752 x := v_0.Args[0]
5753 v.copyOf(x)
5754 return true
5755 }
5756
5757
5758 for {
5759 if v_0.Op != OpConst32 {
5760 break
5761 }
5762 c := auxIntToInt32(v_0.AuxInt)
5763 v.reset(OpConst32)
5764 v.AuxInt = int32ToAuxInt(^c)
5765 return true
5766 }
5767
5768
5769 for {
5770 if v_0.Op != OpAdd32 {
5771 break
5772 }
5773 _ = v_0.Args[1]
5774 v_0_0 := v_0.Args[0]
5775 v_0_1 := v_0.Args[1]
5776 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5777 if v_0_0.Op != OpConst32 || auxIntToInt32(v_0_0.AuxInt) != -1 {
5778 continue
5779 }
5780 x := v_0_1
5781 v.reset(OpNeg32)
5782 v.AddArg(x)
5783 return true
5784 }
5785 break
5786 }
5787 return false
5788 }
5789 func rewriteValuegeneric_OpCom64(v *Value) bool {
5790 v_0 := v.Args[0]
5791
5792
5793 for {
5794 if v_0.Op != OpCom64 {
5795 break
5796 }
5797 x := v_0.Args[0]
5798 v.copyOf(x)
5799 return true
5800 }
5801
5802
5803 for {
5804 if v_0.Op != OpConst64 {
5805 break
5806 }
5807 c := auxIntToInt64(v_0.AuxInt)
5808 v.reset(OpConst64)
5809 v.AuxInt = int64ToAuxInt(^c)
5810 return true
5811 }
5812
5813
5814 for {
5815 if v_0.Op != OpAdd64 {
5816 break
5817 }
5818 _ = v_0.Args[1]
5819 v_0_0 := v_0.Args[0]
5820 v_0_1 := v_0.Args[1]
5821 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5822 if v_0_0.Op != OpConst64 || auxIntToInt64(v_0_0.AuxInt) != -1 {
5823 continue
5824 }
5825 x := v_0_1
5826 v.reset(OpNeg64)
5827 v.AddArg(x)
5828 return true
5829 }
5830 break
5831 }
5832 return false
5833 }
5834 func rewriteValuegeneric_OpCom8(v *Value) bool {
5835 v_0 := v.Args[0]
5836
5837
5838 for {
5839 if v_0.Op != OpCom8 {
5840 break
5841 }
5842 x := v_0.Args[0]
5843 v.copyOf(x)
5844 return true
5845 }
5846
5847
5848 for {
5849 if v_0.Op != OpConst8 {
5850 break
5851 }
5852 c := auxIntToInt8(v_0.AuxInt)
5853 v.reset(OpConst8)
5854 v.AuxInt = int8ToAuxInt(^c)
5855 return true
5856 }
5857
5858
5859 for {
5860 if v_0.Op != OpAdd8 {
5861 break
5862 }
5863 _ = v_0.Args[1]
5864 v_0_0 := v_0.Args[0]
5865 v_0_1 := v_0.Args[1]
5866 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5867 if v_0_0.Op != OpConst8 || auxIntToInt8(v_0_0.AuxInt) != -1 {
5868 continue
5869 }
5870 x := v_0_1
5871 v.reset(OpNeg8)
5872 v.AddArg(x)
5873 return true
5874 }
5875 break
5876 }
5877 return false
5878 }
5879 func rewriteValuegeneric_OpCondSelect(v *Value) bool {
5880 v_2 := v.Args[2]
5881 v_1 := v.Args[1]
5882 v_0 := v.Args[0]
5883 b := v.Block
5884 config := b.Func.Config
5885
5886
5887 for {
5888 x := v_0
5889 if v_2.Op != OpConstBool || auxIntToBool(v_2.AuxInt) != true {
5890 break
5891 }
5892 v.copyOf(x)
5893 return true
5894 }
5895
5896
5897 for {
5898 y := v_1
5899 if v_2.Op != OpConstBool || auxIntToBool(v_2.AuxInt) != false {
5900 break
5901 }
5902 v.copyOf(y)
5903 return true
5904 }
5905
5906
5907 for {
5908 x := v_0
5909 if x != v_1 {
5910 break
5911 }
5912 v.copyOf(x)
5913 return true
5914 }
5915
5916
5917
5918 for {
5919 if v_0.Op != OpAdd8 {
5920 break
5921 }
5922 t := v_0.Type
5923 _ = v_0.Args[1]
5924 v_0_0 := v_0.Args[0]
5925 v_0_1 := v_0.Args[1]
5926 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5927 x := v_0_0
5928 if v_0_1.Op != OpConst8 || auxIntToInt8(v_0_1.AuxInt) != 1 || x != v_1 {
5929 continue
5930 }
5931 bool := v_2
5932 if !(config.arch != "arm64") {
5933 continue
5934 }
5935 v.reset(OpAdd8)
5936 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
5937 v0.AddArg(bool)
5938 v.AddArg2(x, v0)
5939 return true
5940 }
5941 break
5942 }
5943
5944
5945
5946 for {
5947 if v_0.Op != OpAdd64 {
5948 break
5949 }
5950 t := v_0.Type
5951 _ = v_0.Args[1]
5952 v_0_0 := v_0.Args[0]
5953 v_0_1 := v_0.Args[1]
5954 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5955 x := v_0_0
5956 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
5957 continue
5958 }
5959 bool := v_2
5960 if !(config.arch != "arm64") {
5961 continue
5962 }
5963 v.reset(OpAdd64)
5964 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
5965 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
5966 v1.AddArg(bool)
5967 v0.AddArg(v1)
5968 v.AddArg2(x, v0)
5969 return true
5970 }
5971 break
5972 }
5973
5974
5975
5976 for {
5977 if v_0.Op != OpAdd32 {
5978 break
5979 }
5980 t := v_0.Type
5981 _ = v_0.Args[1]
5982 v_0_0 := v_0.Args[0]
5983 v_0_1 := v_0.Args[1]
5984 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5985 x := v_0_0
5986 if v_0_1.Op != OpConst32 || auxIntToInt32(v_0_1.AuxInt) != 1 || x != v_1 {
5987 continue
5988 }
5989 bool := v_2
5990 if !(config.arch != "arm64") {
5991 continue
5992 }
5993 v.reset(OpAdd32)
5994 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
5995 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
5996 v1.AddArg(bool)
5997 v0.AddArg(v1)
5998 v.AddArg2(x, v0)
5999 return true
6000 }
6001 break
6002 }
6003
6004
6005
6006 for {
6007 if v_0.Op != OpAdd16 {
6008 break
6009 }
6010 t := v_0.Type
6011 _ = v_0.Args[1]
6012 v_0_0 := v_0.Args[0]
6013 v_0_1 := v_0.Args[1]
6014 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6015 x := v_0_0
6016 if v_0_1.Op != OpConst16 || auxIntToInt16(v_0_1.AuxInt) != 1 || x != v_1 {
6017 continue
6018 }
6019 bool := v_2
6020 if !(config.arch != "arm64") {
6021 continue
6022 }
6023 v.reset(OpAdd16)
6024 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6025 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6026 v1.AddArg(bool)
6027 v0.AddArg(v1)
6028 v.AddArg2(x, v0)
6029 return true
6030 }
6031 break
6032 }
6033
6034
6035 for {
6036 if v_0.Op != OpAdd8 {
6037 break
6038 }
6039 t := v_0.Type
6040 _ = v_0.Args[1]
6041 v_0_0 := v_0.Args[0]
6042 v_0_1 := v_0.Args[1]
6043 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6044 x := v_0_0
6045 if v_0_1.Op != OpConst8 || auxIntToInt8(v_0_1.AuxInt) != -1 || x != v_1 {
6046 continue
6047 }
6048 bool := v_2
6049 v.reset(OpSub8)
6050 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
6051 v0.AddArg(bool)
6052 v.AddArg2(x, v0)
6053 return true
6054 }
6055 break
6056 }
6057
6058
6059 for {
6060 if v_0.Op != OpAdd64 {
6061 break
6062 }
6063 t := v_0.Type
6064 _ = v_0.Args[1]
6065 v_0_0 := v_0.Args[0]
6066 v_0_1 := v_0.Args[1]
6067 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6068 x := v_0_0
6069 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != -1 || x != v_1 {
6070 continue
6071 }
6072 bool := v_2
6073 v.reset(OpSub64)
6074 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
6075 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6076 v1.AddArg(bool)
6077 v0.AddArg(v1)
6078 v.AddArg2(x, v0)
6079 return true
6080 }
6081 break
6082 }
6083
6084
6085 for {
6086 if v_0.Op != OpAdd32 {
6087 break
6088 }
6089 t := v_0.Type
6090 _ = v_0.Args[1]
6091 v_0_0 := v_0.Args[0]
6092 v_0_1 := v_0.Args[1]
6093 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6094 x := v_0_0
6095 if v_0_1.Op != OpConst32 || auxIntToInt32(v_0_1.AuxInt) != -1 || x != v_1 {
6096 continue
6097 }
6098 bool := v_2
6099 v.reset(OpSub32)
6100 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
6101 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6102 v1.AddArg(bool)
6103 v0.AddArg(v1)
6104 v.AddArg2(x, v0)
6105 return true
6106 }
6107 break
6108 }
6109
6110
6111 for {
6112 if v_0.Op != OpAdd16 {
6113 break
6114 }
6115 t := v_0.Type
6116 _ = v_0.Args[1]
6117 v_0_0 := v_0.Args[0]
6118 v_0_1 := v_0.Args[1]
6119 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6120 x := v_0_0
6121 if v_0_1.Op != OpConst16 || auxIntToInt16(v_0_1.AuxInt) != -1 || x != v_1 {
6122 continue
6123 }
6124 bool := v_2
6125 v.reset(OpSub16)
6126 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6127 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6128 v1.AddArg(bool)
6129 v0.AddArg(v1)
6130 v.AddArg2(x, v0)
6131 return true
6132 }
6133 break
6134 }
6135
6136
6137 for {
6138 if v_0.Op != OpLsh64x64 {
6139 break
6140 }
6141 _ = v_0.Args[1]
6142 x := v_0.Args[0]
6143 v_0_1 := v_0.Args[1]
6144 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6145 break
6146 }
6147 bool := v_2
6148 v.reset(OpLsh64x8)
6149 v.AuxInt = boolToAuxInt(true)
6150 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6151 v0.AddArg(bool)
6152 v.AddArg2(x, v0)
6153 return true
6154 }
6155
6156
6157 for {
6158 if v_0.Op != OpLsh32x64 {
6159 break
6160 }
6161 _ = v_0.Args[1]
6162 x := v_0.Args[0]
6163 v_0_1 := v_0.Args[1]
6164 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6165 break
6166 }
6167 bool := v_2
6168 v.reset(OpLsh32x8)
6169 v.AuxInt = boolToAuxInt(true)
6170 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6171 v0.AddArg(bool)
6172 v.AddArg2(x, v0)
6173 return true
6174 }
6175
6176
6177 for {
6178 if v_0.Op != OpLsh16x64 {
6179 break
6180 }
6181 _ = v_0.Args[1]
6182 x := v_0.Args[0]
6183 v_0_1 := v_0.Args[1]
6184 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6185 break
6186 }
6187 bool := v_2
6188 v.reset(OpLsh16x8)
6189 v.AuxInt = boolToAuxInt(true)
6190 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6191 v0.AddArg(bool)
6192 v.AddArg2(x, v0)
6193 return true
6194 }
6195
6196
6197 for {
6198 if v_0.Op != OpLsh8x64 {
6199 break
6200 }
6201 _ = v_0.Args[1]
6202 x := v_0.Args[0]
6203 v_0_1 := v_0.Args[1]
6204 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6205 break
6206 }
6207 bool := v_2
6208 v.reset(OpLsh8x8)
6209 v.AuxInt = boolToAuxInt(true)
6210 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6211 v0.AddArg(bool)
6212 v.AddArg2(x, v0)
6213 return true
6214 }
6215
6216
6217 for {
6218 if v_0.Op != OpRsh64x64 {
6219 break
6220 }
6221 _ = v_0.Args[1]
6222 x := v_0.Args[0]
6223 v_0_1 := v_0.Args[1]
6224 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6225 break
6226 }
6227 bool := v_2
6228 v.reset(OpRsh64x8)
6229 v.AuxInt = boolToAuxInt(true)
6230 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6231 v0.AddArg(bool)
6232 v.AddArg2(x, v0)
6233 return true
6234 }
6235
6236
6237 for {
6238 if v_0.Op != OpRsh32x64 {
6239 break
6240 }
6241 _ = v_0.Args[1]
6242 x := v_0.Args[0]
6243 v_0_1 := v_0.Args[1]
6244 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6245 break
6246 }
6247 bool := v_2
6248 v.reset(OpRsh32x8)
6249 v.AuxInt = boolToAuxInt(true)
6250 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6251 v0.AddArg(bool)
6252 v.AddArg2(x, v0)
6253 return true
6254 }
6255
6256
6257 for {
6258 if v_0.Op != OpRsh16x64 {
6259 break
6260 }
6261 _ = v_0.Args[1]
6262 x := v_0.Args[0]
6263 v_0_1 := v_0.Args[1]
6264 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6265 break
6266 }
6267 bool := v_2
6268 v.reset(OpRsh16x8)
6269 v.AuxInt = boolToAuxInt(true)
6270 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6271 v0.AddArg(bool)
6272 v.AddArg2(x, v0)
6273 return true
6274 }
6275
6276
6277 for {
6278 if v_0.Op != OpRsh8x64 {
6279 break
6280 }
6281 _ = v_0.Args[1]
6282 x := v_0.Args[0]
6283 v_0_1 := v_0.Args[1]
6284 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6285 break
6286 }
6287 bool := v_2
6288 v.reset(OpRsh8x8)
6289 v.AuxInt = boolToAuxInt(true)
6290 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6291 v0.AddArg(bool)
6292 v.AddArg2(x, v0)
6293 return true
6294 }
6295
6296
6297 for {
6298 if v_0.Op != OpRsh64Ux64 {
6299 break
6300 }
6301 _ = v_0.Args[1]
6302 x := v_0.Args[0]
6303 v_0_1 := v_0.Args[1]
6304 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6305 break
6306 }
6307 bool := v_2
6308 v.reset(OpRsh64Ux8)
6309 v.AuxInt = boolToAuxInt(true)
6310 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6311 v0.AddArg(bool)
6312 v.AddArg2(x, v0)
6313 return true
6314 }
6315
6316
6317 for {
6318 if v_0.Op != OpRsh32Ux64 {
6319 break
6320 }
6321 _ = v_0.Args[1]
6322 x := v_0.Args[0]
6323 v_0_1 := v_0.Args[1]
6324 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6325 break
6326 }
6327 bool := v_2
6328 v.reset(OpRsh32Ux8)
6329 v.AuxInt = boolToAuxInt(true)
6330 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6331 v0.AddArg(bool)
6332 v.AddArg2(x, v0)
6333 return true
6334 }
6335
6336
6337 for {
6338 if v_0.Op != OpRsh16Ux64 {
6339 break
6340 }
6341 _ = v_0.Args[1]
6342 x := v_0.Args[0]
6343 v_0_1 := v_0.Args[1]
6344 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6345 break
6346 }
6347 bool := v_2
6348 v.reset(OpRsh16Ux8)
6349 v.AuxInt = boolToAuxInt(true)
6350 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6351 v0.AddArg(bool)
6352 v.AddArg2(x, v0)
6353 return true
6354 }
6355
6356
6357 for {
6358 if v_0.Op != OpRsh8Ux64 {
6359 break
6360 }
6361 _ = v_0.Args[1]
6362 x := v_0.Args[0]
6363 v_0_1 := v_0.Args[1]
6364 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6365 break
6366 }
6367 bool := v_2
6368 v.reset(OpRsh8Ux8)
6369 v.AuxInt = boolToAuxInt(true)
6370 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6371 v0.AddArg(bool)
6372 v.AddArg2(x, v0)
6373 return true
6374 }
6375
6376
6377 for {
6378 if v_0.Op != OpOr8 {
6379 break
6380 }
6381 t := v_0.Type
6382 _ = v_0.Args[1]
6383 v_0_0 := v_0.Args[0]
6384 v_0_1 := v_0.Args[1]
6385 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6386 x := v_0_0
6387 if v_0_1.Op != OpConst8 || auxIntToInt8(v_0_1.AuxInt) != 1 || x != v_1 {
6388 continue
6389 }
6390 bool := v_2
6391 v.reset(OpOr8)
6392 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
6393 v0.AddArg(bool)
6394 v.AddArg2(x, v0)
6395 return true
6396 }
6397 break
6398 }
6399
6400
6401 for {
6402 if v_0.Op != OpOr64 {
6403 break
6404 }
6405 t := v_0.Type
6406 _ = v_0.Args[1]
6407 v_0_0 := v_0.Args[0]
6408 v_0_1 := v_0.Args[1]
6409 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6410 x := v_0_0
6411 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6412 continue
6413 }
6414 bool := v_2
6415 v.reset(OpOr64)
6416 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
6417 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6418 v1.AddArg(bool)
6419 v0.AddArg(v1)
6420 v.AddArg2(x, v0)
6421 return true
6422 }
6423 break
6424 }
6425
6426
6427 for {
6428 if v_0.Op != OpOr32 {
6429 break
6430 }
6431 t := v_0.Type
6432 _ = v_0.Args[1]
6433 v_0_0 := v_0.Args[0]
6434 v_0_1 := v_0.Args[1]
6435 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6436 x := v_0_0
6437 if v_0_1.Op != OpConst32 || auxIntToInt32(v_0_1.AuxInt) != 1 || x != v_1 {
6438 continue
6439 }
6440 bool := v_2
6441 v.reset(OpOr32)
6442 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
6443 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6444 v1.AddArg(bool)
6445 v0.AddArg(v1)
6446 v.AddArg2(x, v0)
6447 return true
6448 }
6449 break
6450 }
6451
6452
6453 for {
6454 if v_0.Op != OpOr16 {
6455 break
6456 }
6457 t := v_0.Type
6458 _ = v_0.Args[1]
6459 v_0_0 := v_0.Args[0]
6460 v_0_1 := v_0.Args[1]
6461 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6462 x := v_0_0
6463 if v_0_1.Op != OpConst16 || auxIntToInt16(v_0_1.AuxInt) != 1 || x != v_1 {
6464 continue
6465 }
6466 bool := v_2
6467 v.reset(OpOr16)
6468 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6469 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6470 v1.AddArg(bool)
6471 v0.AddArg(v1)
6472 v.AddArg2(x, v0)
6473 return true
6474 }
6475 break
6476 }
6477
6478
6479 for {
6480 if v_0.Op != OpXor8 {
6481 break
6482 }
6483 t := v_0.Type
6484 _ = v_0.Args[1]
6485 v_0_0 := v_0.Args[0]
6486 v_0_1 := v_0.Args[1]
6487 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6488 x := v_0_0
6489 if v_0_1.Op != OpConst8 || auxIntToInt8(v_0_1.AuxInt) != 1 || x != v_1 {
6490 continue
6491 }
6492 bool := v_2
6493 v.reset(OpXor8)
6494 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
6495 v0.AddArg(bool)
6496 v.AddArg2(x, v0)
6497 return true
6498 }
6499 break
6500 }
6501
6502
6503 for {
6504 if v_0.Op != OpXor64 {
6505 break
6506 }
6507 t := v_0.Type
6508 _ = v_0.Args[1]
6509 v_0_0 := v_0.Args[0]
6510 v_0_1 := v_0.Args[1]
6511 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6512 x := v_0_0
6513 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6514 continue
6515 }
6516 bool := v_2
6517 v.reset(OpXor64)
6518 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
6519 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6520 v1.AddArg(bool)
6521 v0.AddArg(v1)
6522 v.AddArg2(x, v0)
6523 return true
6524 }
6525 break
6526 }
6527
6528
6529 for {
6530 if v_0.Op != OpXor32 {
6531 break
6532 }
6533 t := v_0.Type
6534 _ = v_0.Args[1]
6535 v_0_0 := v_0.Args[0]
6536 v_0_1 := v_0.Args[1]
6537 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6538 x := v_0_0
6539 if v_0_1.Op != OpConst32 || auxIntToInt32(v_0_1.AuxInt) != 1 || x != v_1 {
6540 continue
6541 }
6542 bool := v_2
6543 v.reset(OpXor32)
6544 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
6545 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6546 v1.AddArg(bool)
6547 v0.AddArg(v1)
6548 v.AddArg2(x, v0)
6549 return true
6550 }
6551 break
6552 }
6553
6554
6555 for {
6556 if v_0.Op != OpXor16 {
6557 break
6558 }
6559 t := v_0.Type
6560 _ = v_0.Args[1]
6561 v_0_0 := v_0.Args[0]
6562 v_0_1 := v_0.Args[1]
6563 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6564 x := v_0_0
6565 if v_0_1.Op != OpConst16 || auxIntToInt16(v_0_1.AuxInt) != 1 || x != v_1 {
6566 continue
6567 }
6568 bool := v_2
6569 v.reset(OpXor16)
6570 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6571 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6572 v1.AddArg(bool)
6573 v0.AddArg(v1)
6574 v.AddArg2(x, v0)
6575 return true
6576 }
6577 break
6578 }
6579 return false
6580 }
6581 func rewriteValuegeneric_OpConstInterface(v *Value) bool {
6582 b := v.Block
6583 typ := &b.Func.Config.Types
6584
6585
6586 for {
6587 v.reset(OpIMake)
6588 v0 := b.NewValue0(v.Pos, OpConstNil, typ.Uintptr)
6589 v1 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
6590 v.AddArg2(v0, v1)
6591 return true
6592 }
6593 }
6594 func rewriteValuegeneric_OpConstSlice(v *Value) bool {
6595 b := v.Block
6596 config := b.Func.Config
6597 typ := &b.Func.Config.Types
6598
6599
6600
6601 for {
6602 if !(config.PtrSize == 4) {
6603 break
6604 }
6605 v.reset(OpSliceMake)
6606 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo())
6607 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
6608 v1.AuxInt = int32ToAuxInt(0)
6609 v.AddArg3(v0, v1, v1)
6610 return true
6611 }
6612
6613
6614
6615 for {
6616 if !(config.PtrSize == 8) {
6617 break
6618 }
6619 v.reset(OpSliceMake)
6620 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo())
6621 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
6622 v1.AuxInt = int64ToAuxInt(0)
6623 v.AddArg3(v0, v1, v1)
6624 return true
6625 }
6626 return false
6627 }
6628 func rewriteValuegeneric_OpConstString(v *Value) bool {
6629 b := v.Block
6630 config := b.Func.Config
6631 fe := b.Func.fe
6632 typ := &b.Func.Config.Types
6633
6634
6635
6636 for {
6637 str := auxToString(v.Aux)
6638 if !(config.PtrSize == 4 && str == "") {
6639 break
6640 }
6641 v.reset(OpStringMake)
6642 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
6643 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
6644 v1.AuxInt = int32ToAuxInt(0)
6645 v.AddArg2(v0, v1)
6646 return true
6647 }
6648
6649
6650
6651 for {
6652 str := auxToString(v.Aux)
6653 if !(config.PtrSize == 8 && str == "") {
6654 break
6655 }
6656 v.reset(OpStringMake)
6657 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
6658 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
6659 v1.AuxInt = int64ToAuxInt(0)
6660 v.AddArg2(v0, v1)
6661 return true
6662 }
6663
6664
6665
6666 for {
6667 str := auxToString(v.Aux)
6668 if !(config.PtrSize == 4 && str != "") {
6669 break
6670 }
6671 v.reset(OpStringMake)
6672 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr)
6673 v0.Aux = symToAux(fe.StringData(str))
6674 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
6675 v0.AddArg(v1)
6676 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int)
6677 v2.AuxInt = int32ToAuxInt(int32(len(str)))
6678 v.AddArg2(v0, v2)
6679 return true
6680 }
6681
6682
6683
6684 for {
6685 str := auxToString(v.Aux)
6686 if !(config.PtrSize == 8 && str != "") {
6687 break
6688 }
6689 v.reset(OpStringMake)
6690 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr)
6691 v0.Aux = symToAux(fe.StringData(str))
6692 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
6693 v0.AddArg(v1)
6694 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int)
6695 v2.AuxInt = int64ToAuxInt(int64(len(str)))
6696 v.AddArg2(v0, v2)
6697 return true
6698 }
6699 return false
6700 }
6701 func rewriteValuegeneric_OpConvert(v *Value) bool {
6702 v_1 := v.Args[1]
6703 v_0 := v.Args[0]
6704 b := v.Block
6705
6706
6707 for {
6708 if v_0.Op != OpAdd64 {
6709 break
6710 }
6711 _ = v_0.Args[1]
6712 v_0_0 := v_0.Args[0]
6713 v_0_1 := v_0.Args[1]
6714 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6715 if v_0_0.Op != OpConvert {
6716 continue
6717 }
6718 mem := v_0_0.Args[1]
6719 ptr := v_0_0.Args[0]
6720 off := v_0_1
6721 if mem != v_1 {
6722 continue
6723 }
6724 v.reset(OpAddPtr)
6725 v.AddArg2(ptr, off)
6726 return true
6727 }
6728 break
6729 }
6730
6731
6732 for {
6733 if v_0.Op != OpAdd32 {
6734 break
6735 }
6736 _ = v_0.Args[1]
6737 v_0_0 := v_0.Args[0]
6738 v_0_1 := v_0.Args[1]
6739 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6740 if v_0_0.Op != OpConvert {
6741 continue
6742 }
6743 mem := v_0_0.Args[1]
6744 ptr := v_0_0.Args[0]
6745 off := v_0_1
6746 if mem != v_1 {
6747 continue
6748 }
6749 v.reset(OpAddPtr)
6750 v.AddArg2(ptr, off)
6751 return true
6752 }
6753 break
6754 }
6755
6756
6757 for {
6758 if v_0.Op != OpConvert {
6759 break
6760 }
6761 mem := v_0.Args[1]
6762 ptr := v_0.Args[0]
6763 if mem != v_1 {
6764 break
6765 }
6766 v.copyOf(ptr)
6767 return true
6768 }
6769
6770
6771 for {
6772 a := v_0
6773 if a.Op != OpAdd64 {
6774 break
6775 }
6776 _ = a.Args[1]
6777 a_0 := a.Args[0]
6778 a_1 := a.Args[1]
6779 for _i0 := 0; _i0 <= 1; _i0, a_0, a_1 = _i0+1, a_1, a_0 {
6780 if a_0.Op != OpAdd64 {
6781 continue
6782 }
6783 _ = a_0.Args[1]
6784 a_0_0 := a_0.Args[0]
6785 a_0_1 := a_0.Args[1]
6786 for _i1 := 0; _i1 <= 1; _i1, a_0_0, a_0_1 = _i1+1, a_0_1, a_0_0 {
6787 if a_0_0.Op != OpConvert {
6788 continue
6789 }
6790 mem := a_0_0.Args[1]
6791 ptr := a_0_0.Args[0]
6792 off1 := a_0_1
6793 off2 := a_1
6794 if mem != v_1 {
6795 continue
6796 }
6797 v.reset(OpAddPtr)
6798 v0 := b.NewValue0(v.Pos, OpAdd64, a.Type)
6799 v0.AddArg2(off1, off2)
6800 v.AddArg2(ptr, v0)
6801 return true
6802 }
6803 }
6804 break
6805 }
6806
6807
6808 for {
6809 a := v_0
6810 if a.Op != OpAdd32 {
6811 break
6812 }
6813 _ = a.Args[1]
6814 a_0 := a.Args[0]
6815 a_1 := a.Args[1]
6816 for _i0 := 0; _i0 <= 1; _i0, a_0, a_1 = _i0+1, a_1, a_0 {
6817 if a_0.Op != OpAdd32 {
6818 continue
6819 }
6820 _ = a_0.Args[1]
6821 a_0_0 := a_0.Args[0]
6822 a_0_1 := a_0.Args[1]
6823 for _i1 := 0; _i1 <= 1; _i1, a_0_0, a_0_1 = _i1+1, a_0_1, a_0_0 {
6824 if a_0_0.Op != OpConvert {
6825 continue
6826 }
6827 mem := a_0_0.Args[1]
6828 ptr := a_0_0.Args[0]
6829 off1 := a_0_1
6830 off2 := a_1
6831 if mem != v_1 {
6832 continue
6833 }
6834 v.reset(OpAddPtr)
6835 v0 := b.NewValue0(v.Pos, OpAdd32, a.Type)
6836 v0.AddArg2(off1, off2)
6837 v.AddArg2(ptr, v0)
6838 return true
6839 }
6840 }
6841 break
6842 }
6843 return false
6844 }
6845 func rewriteValuegeneric_OpCtz16(v *Value) bool {
6846 v_0 := v.Args[0]
6847 b := v.Block
6848 config := b.Func.Config
6849
6850
6851
6852 for {
6853 if v_0.Op != OpConst16 {
6854 break
6855 }
6856 c := auxIntToInt16(v_0.AuxInt)
6857 if !(config.PtrSize == 4) {
6858 break
6859 }
6860 v.reset(OpConst32)
6861 v.AuxInt = int32ToAuxInt(int32(ntz16(c)))
6862 return true
6863 }
6864
6865
6866
6867 for {
6868 if v_0.Op != OpConst16 {
6869 break
6870 }
6871 c := auxIntToInt16(v_0.AuxInt)
6872 if !(config.PtrSize == 8) {
6873 break
6874 }
6875 v.reset(OpConst64)
6876 v.AuxInt = int64ToAuxInt(int64(ntz16(c)))
6877 return true
6878 }
6879 return false
6880 }
6881 func rewriteValuegeneric_OpCtz32(v *Value) bool {
6882 v_0 := v.Args[0]
6883 b := v.Block
6884 config := b.Func.Config
6885
6886
6887
6888 for {
6889 if v_0.Op != OpConst32 {
6890 break
6891 }
6892 c := auxIntToInt32(v_0.AuxInt)
6893 if !(config.PtrSize == 4) {
6894 break
6895 }
6896 v.reset(OpConst32)
6897 v.AuxInt = int32ToAuxInt(int32(ntz32(c)))
6898 return true
6899 }
6900
6901
6902
6903 for {
6904 if v_0.Op != OpConst32 {
6905 break
6906 }
6907 c := auxIntToInt32(v_0.AuxInt)
6908 if !(config.PtrSize == 8) {
6909 break
6910 }
6911 v.reset(OpConst64)
6912 v.AuxInt = int64ToAuxInt(int64(ntz32(c)))
6913 return true
6914 }
6915 return false
6916 }
6917 func rewriteValuegeneric_OpCtz64(v *Value) bool {
6918 v_0 := v.Args[0]
6919 b := v.Block
6920 config := b.Func.Config
6921
6922
6923
6924 for {
6925 if v_0.Op != OpConst64 {
6926 break
6927 }
6928 c := auxIntToInt64(v_0.AuxInt)
6929 if !(config.PtrSize == 4) {
6930 break
6931 }
6932 v.reset(OpConst32)
6933 v.AuxInt = int32ToAuxInt(int32(ntz64(c)))
6934 return true
6935 }
6936
6937
6938
6939 for {
6940 if v_0.Op != OpConst64 {
6941 break
6942 }
6943 c := auxIntToInt64(v_0.AuxInt)
6944 if !(config.PtrSize == 8) {
6945 break
6946 }
6947 v.reset(OpConst64)
6948 v.AuxInt = int64ToAuxInt(int64(ntz64(c)))
6949 return true
6950 }
6951 return false
6952 }
6953 func rewriteValuegeneric_OpCtz8(v *Value) bool {
6954 v_0 := v.Args[0]
6955 b := v.Block
6956 config := b.Func.Config
6957
6958
6959
6960 for {
6961 if v_0.Op != OpConst8 {
6962 break
6963 }
6964 c := auxIntToInt8(v_0.AuxInt)
6965 if !(config.PtrSize == 4) {
6966 break
6967 }
6968 v.reset(OpConst32)
6969 v.AuxInt = int32ToAuxInt(int32(ntz8(c)))
6970 return true
6971 }
6972
6973
6974
6975 for {
6976 if v_0.Op != OpConst8 {
6977 break
6978 }
6979 c := auxIntToInt8(v_0.AuxInt)
6980 if !(config.PtrSize == 8) {
6981 break
6982 }
6983 v.reset(OpConst64)
6984 v.AuxInt = int64ToAuxInt(int64(ntz8(c)))
6985 return true
6986 }
6987 return false
6988 }
6989 func rewriteValuegeneric_OpCvt32Fto32(v *Value) bool {
6990 v_0 := v.Args[0]
6991
6992
6993
6994 for {
6995 if v_0.Op != OpConst32F {
6996 break
6997 }
6998 c := auxIntToFloat32(v_0.AuxInt)
6999 if !(c >= -1<<31 && c < 1<<31) {
7000 break
7001 }
7002 v.reset(OpConst32)
7003 v.AuxInt = int32ToAuxInt(int32(c))
7004 return true
7005 }
7006 return false
7007 }
7008 func rewriteValuegeneric_OpCvt32Fto64(v *Value) bool {
7009 v_0 := v.Args[0]
7010
7011
7012
7013 for {
7014 if v_0.Op != OpConst32F {
7015 break
7016 }
7017 c := auxIntToFloat32(v_0.AuxInt)
7018 if !(c >= -1<<63 && c < 1<<63) {
7019 break
7020 }
7021 v.reset(OpConst64)
7022 v.AuxInt = int64ToAuxInt(int64(c))
7023 return true
7024 }
7025 return false
7026 }
7027 func rewriteValuegeneric_OpCvt32Fto64F(v *Value) bool {
7028 v_0 := v.Args[0]
7029
7030
7031 for {
7032 if v_0.Op != OpConst32F {
7033 break
7034 }
7035 c := auxIntToFloat32(v_0.AuxInt)
7036 v.reset(OpConst64F)
7037 v.AuxInt = float64ToAuxInt(float64(c))
7038 return true
7039 }
7040 return false
7041 }
7042 func rewriteValuegeneric_OpCvt32to32F(v *Value) bool {
7043 v_0 := v.Args[0]
7044
7045
7046 for {
7047 if v_0.Op != OpConst32 {
7048 break
7049 }
7050 c := auxIntToInt32(v_0.AuxInt)
7051 v.reset(OpConst32F)
7052 v.AuxInt = float32ToAuxInt(float32(c))
7053 return true
7054 }
7055 return false
7056 }
7057 func rewriteValuegeneric_OpCvt32to64F(v *Value) bool {
7058 v_0 := v.Args[0]
7059
7060
7061 for {
7062 if v_0.Op != OpConst32 {
7063 break
7064 }
7065 c := auxIntToInt32(v_0.AuxInt)
7066 v.reset(OpConst64F)
7067 v.AuxInt = float64ToAuxInt(float64(c))
7068 return true
7069 }
7070 return false
7071 }
7072 func rewriteValuegeneric_OpCvt64Fto32(v *Value) bool {
7073 v_0 := v.Args[0]
7074
7075
7076
7077 for {
7078 if v_0.Op != OpConst64F {
7079 break
7080 }
7081 c := auxIntToFloat64(v_0.AuxInt)
7082 if !(c >= -1<<31 && c < 1<<31) {
7083 break
7084 }
7085 v.reset(OpConst32)
7086 v.AuxInt = int32ToAuxInt(int32(c))
7087 return true
7088 }
7089 return false
7090 }
7091 func rewriteValuegeneric_OpCvt64Fto32F(v *Value) bool {
7092 v_0 := v.Args[0]
7093
7094
7095 for {
7096 if v_0.Op != OpConst64F {
7097 break
7098 }
7099 c := auxIntToFloat64(v_0.AuxInt)
7100 v.reset(OpConst32F)
7101 v.AuxInt = float32ToAuxInt(float32(c))
7102 return true
7103 }
7104
7105
7106
7107 for {
7108 sqrt0 := v_0
7109 if sqrt0.Op != OpSqrt {
7110 break
7111 }
7112 sqrt0_0 := sqrt0.Args[0]
7113 if sqrt0_0.Op != OpCvt32Fto64F {
7114 break
7115 }
7116 x := sqrt0_0.Args[0]
7117 if !(sqrt0.Uses == 1) {
7118 break
7119 }
7120 v.reset(OpSqrt32)
7121 v.AddArg(x)
7122 return true
7123 }
7124 return false
7125 }
7126 func rewriteValuegeneric_OpCvt64Fto64(v *Value) bool {
7127 v_0 := v.Args[0]
7128
7129
7130
7131 for {
7132 if v_0.Op != OpConst64F {
7133 break
7134 }
7135 c := auxIntToFloat64(v_0.AuxInt)
7136 if !(c >= -1<<63 && c < 1<<63) {
7137 break
7138 }
7139 v.reset(OpConst64)
7140 v.AuxInt = int64ToAuxInt(int64(c))
7141 return true
7142 }
7143 return false
7144 }
7145 func rewriteValuegeneric_OpCvt64to32F(v *Value) bool {
7146 v_0 := v.Args[0]
7147
7148
7149 for {
7150 if v_0.Op != OpConst64 {
7151 break
7152 }
7153 c := auxIntToInt64(v_0.AuxInt)
7154 v.reset(OpConst32F)
7155 v.AuxInt = float32ToAuxInt(float32(c))
7156 return true
7157 }
7158 return false
7159 }
7160 func rewriteValuegeneric_OpCvt64to64F(v *Value) bool {
7161 v_0 := v.Args[0]
7162
7163
7164 for {
7165 if v_0.Op != OpConst64 {
7166 break
7167 }
7168 c := auxIntToInt64(v_0.AuxInt)
7169 v.reset(OpConst64F)
7170 v.AuxInt = float64ToAuxInt(float64(c))
7171 return true
7172 }
7173 return false
7174 }
7175 func rewriteValuegeneric_OpCvtBoolToUint8(v *Value) bool {
7176 v_0 := v.Args[0]
7177
7178
7179 for {
7180 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
7181 break
7182 }
7183 v.reset(OpConst8)
7184 v.AuxInt = int8ToAuxInt(0)
7185 return true
7186 }
7187
7188
7189 for {
7190 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
7191 break
7192 }
7193 v.reset(OpConst8)
7194 v.AuxInt = int8ToAuxInt(1)
7195 return true
7196 }
7197 return false
7198 }
7199 func rewriteValuegeneric_OpDiv128u(v *Value) bool {
7200 v_2 := v.Args[2]
7201 v_1 := v.Args[1]
7202 v_0 := v.Args[0]
7203 b := v.Block
7204
7205
7206 for {
7207 t := v.Type
7208 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
7209 break
7210 }
7211 lo := v_1
7212 y := v_2
7213 v.reset(OpMakeTuple)
7214 v0 := b.NewValue0(v.Pos, OpDiv64u, t.FieldType(0))
7215 v0.AddArg2(lo, y)
7216 v1 := b.NewValue0(v.Pos, OpMod64u, t.FieldType(1))
7217 v1.AddArg2(lo, y)
7218 v.AddArg2(v0, v1)
7219 return true
7220 }
7221 return false
7222 }
7223 func rewriteValuegeneric_OpDiv16(v *Value) bool {
7224 v_1 := v.Args[1]
7225 v_0 := v.Args[0]
7226 b := v.Block
7227 typ := &b.Func.Config.Types
7228
7229
7230
7231 for {
7232 if v_0.Op != OpConst16 {
7233 break
7234 }
7235 c := auxIntToInt16(v_0.AuxInt)
7236 if v_1.Op != OpConst16 {
7237 break
7238 }
7239 d := auxIntToInt16(v_1.AuxInt)
7240 if !(d != 0) {
7241 break
7242 }
7243 v.reset(OpConst16)
7244 v.AuxInt = int16ToAuxInt(c / d)
7245 return true
7246 }
7247
7248
7249
7250 for {
7251 t := v.Type
7252 n := v_0
7253 if v_1.Op != OpConst16 {
7254 break
7255 }
7256 c := auxIntToInt16(v_1.AuxInt)
7257 if !(c < 0 && c != -1<<15) {
7258 break
7259 }
7260 v.reset(OpNeg16)
7261 v0 := b.NewValue0(v.Pos, OpDiv16, t)
7262 v1 := b.NewValue0(v.Pos, OpConst16, t)
7263 v1.AuxInt = int16ToAuxInt(-c)
7264 v0.AddArg2(n, v1)
7265 v.AddArg(v0)
7266 return true
7267 }
7268
7269
7270 for {
7271 t := v.Type
7272 x := v_0
7273 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != -1<<15 {
7274 break
7275 }
7276 v.reset(OpRsh16Ux64)
7277 v0 := b.NewValue0(v.Pos, OpAnd16, t)
7278 v1 := b.NewValue0(v.Pos, OpNeg16, t)
7279 v1.AddArg(x)
7280 v0.AddArg2(x, v1)
7281 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7282 v2.AuxInt = int64ToAuxInt(15)
7283 v.AddArg2(v0, v2)
7284 return true
7285 }
7286 return false
7287 }
7288 func rewriteValuegeneric_OpDiv16u(v *Value) bool {
7289 v_1 := v.Args[1]
7290 v_0 := v.Args[0]
7291 b := v.Block
7292 typ := &b.Func.Config.Types
7293
7294
7295
7296 for {
7297 if v_0.Op != OpConst16 {
7298 break
7299 }
7300 c := auxIntToInt16(v_0.AuxInt)
7301 if v_1.Op != OpConst16 {
7302 break
7303 }
7304 d := auxIntToInt16(v_1.AuxInt)
7305 if !(d != 0) {
7306 break
7307 }
7308 v.reset(OpConst16)
7309 v.AuxInt = int16ToAuxInt(int16(uint16(c) / uint16(d)))
7310 return true
7311 }
7312
7313
7314
7315 for {
7316 n := v_0
7317 if v_1.Op != OpConst16 {
7318 break
7319 }
7320 c := auxIntToInt16(v_1.AuxInt)
7321 if !(isPowerOfTwo(uint16(c))) {
7322 break
7323 }
7324 v.reset(OpRsh16Ux64)
7325 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7326 v0.AuxInt = int64ToAuxInt(log16u(uint16(c)))
7327 v.AddArg2(n, v0)
7328 return true
7329 }
7330 return false
7331 }
7332 func rewriteValuegeneric_OpDiv32(v *Value) bool {
7333 v_1 := v.Args[1]
7334 v_0 := v.Args[0]
7335 b := v.Block
7336 typ := &b.Func.Config.Types
7337
7338
7339
7340 for {
7341 if v_0.Op != OpConst32 {
7342 break
7343 }
7344 c := auxIntToInt32(v_0.AuxInt)
7345 if v_1.Op != OpConst32 {
7346 break
7347 }
7348 d := auxIntToInt32(v_1.AuxInt)
7349 if !(d != 0) {
7350 break
7351 }
7352 v.reset(OpConst32)
7353 v.AuxInt = int32ToAuxInt(c / d)
7354 return true
7355 }
7356
7357
7358
7359 for {
7360 t := v.Type
7361 n := v_0
7362 if v_1.Op != OpConst32 {
7363 break
7364 }
7365 c := auxIntToInt32(v_1.AuxInt)
7366 if !(c < 0 && c != -1<<31) {
7367 break
7368 }
7369 v.reset(OpNeg32)
7370 v0 := b.NewValue0(v.Pos, OpDiv32, t)
7371 v1 := b.NewValue0(v.Pos, OpConst32, t)
7372 v1.AuxInt = int32ToAuxInt(-c)
7373 v0.AddArg2(n, v1)
7374 v.AddArg(v0)
7375 return true
7376 }
7377
7378
7379 for {
7380 t := v.Type
7381 x := v_0
7382 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != -1<<31 {
7383 break
7384 }
7385 v.reset(OpRsh32Ux64)
7386 v0 := b.NewValue0(v.Pos, OpAnd32, t)
7387 v1 := b.NewValue0(v.Pos, OpNeg32, t)
7388 v1.AddArg(x)
7389 v0.AddArg2(x, v1)
7390 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7391 v2.AuxInt = int64ToAuxInt(31)
7392 v.AddArg2(v0, v2)
7393 return true
7394 }
7395 return false
7396 }
7397 func rewriteValuegeneric_OpDiv32F(v *Value) bool {
7398 v_1 := v.Args[1]
7399 v_0 := v.Args[0]
7400 b := v.Block
7401
7402
7403
7404 for {
7405 if v_0.Op != OpConst32F {
7406 break
7407 }
7408 c := auxIntToFloat32(v_0.AuxInt)
7409 if v_1.Op != OpConst32F {
7410 break
7411 }
7412 d := auxIntToFloat32(v_1.AuxInt)
7413 if !(c/d == c/d) {
7414 break
7415 }
7416 v.reset(OpConst32F)
7417 v.AuxInt = float32ToAuxInt(c / d)
7418 return true
7419 }
7420
7421
7422
7423 for {
7424 x := v_0
7425 if v_1.Op != OpConst32F {
7426 break
7427 }
7428 t := v_1.Type
7429 c := auxIntToFloat32(v_1.AuxInt)
7430 if !(reciprocalExact32(c)) {
7431 break
7432 }
7433 v.reset(OpMul32F)
7434 v0 := b.NewValue0(v.Pos, OpConst32F, t)
7435 v0.AuxInt = float32ToAuxInt(1 / c)
7436 v.AddArg2(x, v0)
7437 return true
7438 }
7439 return false
7440 }
7441 func rewriteValuegeneric_OpDiv32u(v *Value) bool {
7442 v_1 := v.Args[1]
7443 v_0 := v.Args[0]
7444 b := v.Block
7445 typ := &b.Func.Config.Types
7446
7447
7448
7449 for {
7450 if v_0.Op != OpConst32 {
7451 break
7452 }
7453 c := auxIntToInt32(v_0.AuxInt)
7454 if v_1.Op != OpConst32 {
7455 break
7456 }
7457 d := auxIntToInt32(v_1.AuxInt)
7458 if !(d != 0) {
7459 break
7460 }
7461 v.reset(OpConst32)
7462 v.AuxInt = int32ToAuxInt(int32(uint32(c) / uint32(d)))
7463 return true
7464 }
7465
7466
7467
7468 for {
7469 n := v_0
7470 if v_1.Op != OpConst32 {
7471 break
7472 }
7473 c := auxIntToInt32(v_1.AuxInt)
7474 if !(isPowerOfTwo(uint32(c))) {
7475 break
7476 }
7477 v.reset(OpRsh32Ux64)
7478 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7479 v0.AuxInt = int64ToAuxInt(log32u(uint32(c)))
7480 v.AddArg2(n, v0)
7481 return true
7482 }
7483 return false
7484 }
7485 func rewriteValuegeneric_OpDiv64(v *Value) bool {
7486 v_1 := v.Args[1]
7487 v_0 := v.Args[0]
7488 b := v.Block
7489 typ := &b.Func.Config.Types
7490
7491
7492
7493 for {
7494 if v_0.Op != OpConst64 {
7495 break
7496 }
7497 c := auxIntToInt64(v_0.AuxInt)
7498 if v_1.Op != OpConst64 {
7499 break
7500 }
7501 d := auxIntToInt64(v_1.AuxInt)
7502 if !(d != 0) {
7503 break
7504 }
7505 v.reset(OpConst64)
7506 v.AuxInt = int64ToAuxInt(c / d)
7507 return true
7508 }
7509
7510
7511
7512 for {
7513 t := v.Type
7514 n := v_0
7515 if v_1.Op != OpConst64 {
7516 break
7517 }
7518 c := auxIntToInt64(v_1.AuxInt)
7519 if !(c < 0 && c != -1<<63) {
7520 break
7521 }
7522 v.reset(OpNeg64)
7523 v0 := b.NewValue0(v.Pos, OpDiv64, t)
7524 v1 := b.NewValue0(v.Pos, OpConst64, t)
7525 v1.AuxInt = int64ToAuxInt(-c)
7526 v0.AddArg2(n, v1)
7527 v.AddArg(v0)
7528 return true
7529 }
7530
7531
7532
7533 for {
7534 x := v_0
7535 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 || !(isNonNegative(x)) {
7536 break
7537 }
7538 v.reset(OpConst64)
7539 v.AuxInt = int64ToAuxInt(0)
7540 return true
7541 }
7542
7543
7544 for {
7545 t := v.Type
7546 x := v_0
7547 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 {
7548 break
7549 }
7550 v.reset(OpRsh64Ux64)
7551 v0 := b.NewValue0(v.Pos, OpAnd64, t)
7552 v1 := b.NewValue0(v.Pos, OpNeg64, t)
7553 v1.AddArg(x)
7554 v0.AddArg2(x, v1)
7555 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7556 v2.AuxInt = int64ToAuxInt(63)
7557 v.AddArg2(v0, v2)
7558 return true
7559 }
7560 return false
7561 }
7562 func rewriteValuegeneric_OpDiv64F(v *Value) bool {
7563 v_1 := v.Args[1]
7564 v_0 := v.Args[0]
7565 b := v.Block
7566
7567
7568
7569 for {
7570 if v_0.Op != OpConst64F {
7571 break
7572 }
7573 c := auxIntToFloat64(v_0.AuxInt)
7574 if v_1.Op != OpConst64F {
7575 break
7576 }
7577 d := auxIntToFloat64(v_1.AuxInt)
7578 if !(c/d == c/d) {
7579 break
7580 }
7581 v.reset(OpConst64F)
7582 v.AuxInt = float64ToAuxInt(c / d)
7583 return true
7584 }
7585
7586
7587
7588 for {
7589 x := v_0
7590 if v_1.Op != OpConst64F {
7591 break
7592 }
7593 t := v_1.Type
7594 c := auxIntToFloat64(v_1.AuxInt)
7595 if !(reciprocalExact64(c)) {
7596 break
7597 }
7598 v.reset(OpMul64F)
7599 v0 := b.NewValue0(v.Pos, OpConst64F, t)
7600 v0.AuxInt = float64ToAuxInt(1 / c)
7601 v.AddArg2(x, v0)
7602 return true
7603 }
7604 return false
7605 }
7606 func rewriteValuegeneric_OpDiv64u(v *Value) bool {
7607 v_1 := v.Args[1]
7608 v_0 := v.Args[0]
7609 b := v.Block
7610 typ := &b.Func.Config.Types
7611
7612
7613
7614 for {
7615 if v_0.Op != OpConst64 {
7616 break
7617 }
7618 c := auxIntToInt64(v_0.AuxInt)
7619 if v_1.Op != OpConst64 {
7620 break
7621 }
7622 d := auxIntToInt64(v_1.AuxInt)
7623 if !(d != 0) {
7624 break
7625 }
7626 v.reset(OpConst64)
7627 v.AuxInt = int64ToAuxInt(int64(uint64(c) / uint64(d)))
7628 return true
7629 }
7630
7631
7632
7633 for {
7634 n := v_0
7635 if v_1.Op != OpConst64 {
7636 break
7637 }
7638 c := auxIntToInt64(v_1.AuxInt)
7639 if !(isPowerOfTwo(uint64(c))) {
7640 break
7641 }
7642 v.reset(OpRsh64Ux64)
7643 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7644 v0.AuxInt = int64ToAuxInt(log64u(uint64(c)))
7645 v.AddArg2(n, v0)
7646 return true
7647 }
7648 return false
7649 }
7650 func rewriteValuegeneric_OpDiv8(v *Value) bool {
7651 v_1 := v.Args[1]
7652 v_0 := v.Args[0]
7653 b := v.Block
7654 typ := &b.Func.Config.Types
7655
7656
7657
7658 for {
7659 if v_0.Op != OpConst8 {
7660 break
7661 }
7662 c := auxIntToInt8(v_0.AuxInt)
7663 if v_1.Op != OpConst8 {
7664 break
7665 }
7666 d := auxIntToInt8(v_1.AuxInt)
7667 if !(d != 0) {
7668 break
7669 }
7670 v.reset(OpConst8)
7671 v.AuxInt = int8ToAuxInt(c / d)
7672 return true
7673 }
7674
7675
7676
7677 for {
7678 t := v.Type
7679 n := v_0
7680 if v_1.Op != OpConst8 {
7681 break
7682 }
7683 c := auxIntToInt8(v_1.AuxInt)
7684 if !(c < 0 && c != -1<<7) {
7685 break
7686 }
7687 v.reset(OpNeg8)
7688 v0 := b.NewValue0(v.Pos, OpDiv8, t)
7689 v1 := b.NewValue0(v.Pos, OpConst8, t)
7690 v1.AuxInt = int8ToAuxInt(-c)
7691 v0.AddArg2(n, v1)
7692 v.AddArg(v0)
7693 return true
7694 }
7695
7696
7697 for {
7698 t := v.Type
7699 x := v_0
7700 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != -1<<7 {
7701 break
7702 }
7703 v.reset(OpRsh8Ux64)
7704 v0 := b.NewValue0(v.Pos, OpAnd8, t)
7705 v1 := b.NewValue0(v.Pos, OpNeg8, t)
7706 v1.AddArg(x)
7707 v0.AddArg2(x, v1)
7708 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7709 v2.AuxInt = int64ToAuxInt(7)
7710 v.AddArg2(v0, v2)
7711 return true
7712 }
7713 return false
7714 }
7715 func rewriteValuegeneric_OpDiv8u(v *Value) bool {
7716 v_1 := v.Args[1]
7717 v_0 := v.Args[0]
7718 b := v.Block
7719 typ := &b.Func.Config.Types
7720
7721
7722
7723 for {
7724 if v_0.Op != OpConst8 {
7725 break
7726 }
7727 c := auxIntToInt8(v_0.AuxInt)
7728 if v_1.Op != OpConst8 {
7729 break
7730 }
7731 d := auxIntToInt8(v_1.AuxInt)
7732 if !(d != 0) {
7733 break
7734 }
7735 v.reset(OpConst8)
7736 v.AuxInt = int8ToAuxInt(int8(uint8(c) / uint8(d)))
7737 return true
7738 }
7739
7740
7741
7742 for {
7743 n := v_0
7744 if v_1.Op != OpConst8 {
7745 break
7746 }
7747 c := auxIntToInt8(v_1.AuxInt)
7748 if !(isPowerOfTwo(uint8(c))) {
7749 break
7750 }
7751 v.reset(OpRsh8Ux64)
7752 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7753 v0.AuxInt = int64ToAuxInt(log8u(uint8(c)))
7754 v.AddArg2(n, v0)
7755 return true
7756 }
7757 return false
7758 }
7759 func rewriteValuegeneric_OpEq16(v *Value) bool {
7760 v_1 := v.Args[1]
7761 v_0 := v.Args[0]
7762 b := v.Block
7763 config := b.Func.Config
7764 typ := &b.Func.Config.Types
7765
7766
7767 for {
7768 x := v_0
7769 if x != v_1 {
7770 break
7771 }
7772 v.reset(OpConstBool)
7773 v.AuxInt = boolToAuxInt(true)
7774 return true
7775 }
7776
7777
7778 for {
7779 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7780 if v_0.Op != OpConst16 {
7781 continue
7782 }
7783 t := v_0.Type
7784 c := auxIntToInt16(v_0.AuxInt)
7785 if v_1.Op != OpAdd16 {
7786 continue
7787 }
7788 _ = v_1.Args[1]
7789 v_1_0 := v_1.Args[0]
7790 v_1_1 := v_1.Args[1]
7791 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
7792 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
7793 continue
7794 }
7795 d := auxIntToInt16(v_1_0.AuxInt)
7796 x := v_1_1
7797 v.reset(OpEq16)
7798 v0 := b.NewValue0(v.Pos, OpConst16, t)
7799 v0.AuxInt = int16ToAuxInt(c - d)
7800 v.AddArg2(v0, x)
7801 return true
7802 }
7803 }
7804 break
7805 }
7806
7807
7808 for {
7809 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7810 if v_0.Op != OpConst16 {
7811 continue
7812 }
7813 c := auxIntToInt16(v_0.AuxInt)
7814 if v_1.Op != OpConst16 {
7815 continue
7816 }
7817 d := auxIntToInt16(v_1.AuxInt)
7818 v.reset(OpConstBool)
7819 v.AuxInt = boolToAuxInt(c == d)
7820 return true
7821 }
7822 break
7823 }
7824
7825
7826
7827 for {
7828 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7829 if v_0.Op != OpMod16u {
7830 continue
7831 }
7832 _ = v_0.Args[1]
7833 x := v_0.Args[0]
7834 v_0_1 := v_0.Args[1]
7835 if v_0_1.Op != OpConst16 {
7836 continue
7837 }
7838 c := auxIntToInt16(v_0_1.AuxInt)
7839 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(x.Op != OpConst16 && udivisibleOK16(c) && !hasSmallRotate(config)) {
7840 continue
7841 }
7842 v.reset(OpEq32)
7843 v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32)
7844 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
7845 v1.AddArg(x)
7846 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
7847 v2.AuxInt = int32ToAuxInt(int32(uint16(c)))
7848 v0.AddArg2(v1, v2)
7849 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
7850 v3.AuxInt = int32ToAuxInt(0)
7851 v.AddArg2(v0, v3)
7852 return true
7853 }
7854 break
7855 }
7856
7857
7858
7859 for {
7860 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7861 if v_0.Op != OpMod16 {
7862 continue
7863 }
7864 _ = v_0.Args[1]
7865 x := v_0.Args[0]
7866 v_0_1 := v_0.Args[1]
7867 if v_0_1.Op != OpConst16 {
7868 continue
7869 }
7870 c := auxIntToInt16(v_0_1.AuxInt)
7871 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(x.Op != OpConst16 && sdivisibleOK16(c) && !hasSmallRotate(config)) {
7872 continue
7873 }
7874 v.reset(OpEq32)
7875 v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32)
7876 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
7877 v1.AddArg(x)
7878 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
7879 v2.AuxInt = int32ToAuxInt(int32(c))
7880 v0.AddArg2(v1, v2)
7881 v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
7882 v3.AuxInt = int32ToAuxInt(0)
7883 v.AddArg2(v0, v3)
7884 return true
7885 }
7886 break
7887 }
7888
7889
7890
7891 for {
7892 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7893 s := v_0
7894 if s.Op != OpSub16 {
7895 continue
7896 }
7897 y := s.Args[1]
7898 x := s.Args[0]
7899 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(s.Uses == 1) {
7900 continue
7901 }
7902 v.reset(OpEq16)
7903 v.AddArg2(x, y)
7904 return true
7905 }
7906 break
7907 }
7908
7909
7910
7911 for {
7912 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7913 if v_0.Op != OpAnd16 {
7914 continue
7915 }
7916 t := v_0.Type
7917 _ = v_0.Args[1]
7918 v_0_0 := v_0.Args[0]
7919 v_0_1 := v_0.Args[1]
7920 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
7921 x := v_0_0
7922 if v_0_1.Op != OpConst16 || v_0_1.Type != t {
7923 continue
7924 }
7925 y := auxIntToInt16(v_0_1.AuxInt)
7926 if v_1.Op != OpConst16 || v_1.Type != t || auxIntToInt16(v_1.AuxInt) != y || !(oneBit(y)) {
7927 continue
7928 }
7929 v.reset(OpNeq16)
7930 v0 := b.NewValue0(v.Pos, OpAnd16, t)
7931 v1 := b.NewValue0(v.Pos, OpConst16, t)
7932 v1.AuxInt = int16ToAuxInt(y)
7933 v0.AddArg2(x, v1)
7934 v2 := b.NewValue0(v.Pos, OpConst16, t)
7935 v2.AuxInt = int16ToAuxInt(0)
7936 v.AddArg2(v0, v2)
7937 return true
7938 }
7939 }
7940 break
7941 }
7942
7943
7944 for {
7945 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7946 if v_0.Op != OpZeroExt8to16 {
7947 continue
7948 }
7949 v_0_0 := v_0.Args[0]
7950 if v_0_0.Op != OpCvtBoolToUint8 {
7951 continue
7952 }
7953 x := v_0_0.Args[0]
7954 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
7955 continue
7956 }
7957 v.copyOf(x)
7958 return true
7959 }
7960 break
7961 }
7962
7963
7964 for {
7965 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7966 if v_0.Op != OpZeroExt8to16 {
7967 continue
7968 }
7969 v_0_0 := v_0.Args[0]
7970 if v_0_0.Op != OpCvtBoolToUint8 {
7971 continue
7972 }
7973 x := v_0_0.Args[0]
7974 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
7975 continue
7976 }
7977 v.reset(OpNot)
7978 v.AddArg(x)
7979 return true
7980 }
7981 break
7982 }
7983
7984
7985 for {
7986 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7987 if v_0.Op != OpSignExt8to16 {
7988 continue
7989 }
7990 v_0_0 := v_0.Args[0]
7991 if v_0_0.Op != OpCvtBoolToUint8 {
7992 continue
7993 }
7994 x := v_0_0.Args[0]
7995 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
7996 continue
7997 }
7998 v.copyOf(x)
7999 return true
8000 }
8001 break
8002 }
8003
8004
8005 for {
8006 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8007 if v_0.Op != OpSignExt8to16 {
8008 continue
8009 }
8010 v_0_0 := v_0.Args[0]
8011 if v_0_0.Op != OpCvtBoolToUint8 {
8012 continue
8013 }
8014 x := v_0_0.Args[0]
8015 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
8016 continue
8017 }
8018 v.reset(OpNot)
8019 v.AddArg(x)
8020 return true
8021 }
8022 break
8023 }
8024 return false
8025 }
8026 func rewriteValuegeneric_OpEq32(v *Value) bool {
8027 v_1 := v.Args[1]
8028 v_0 := v.Args[0]
8029 b := v.Block
8030
8031
8032 for {
8033 x := v_0
8034 if x != v_1 {
8035 break
8036 }
8037 v.reset(OpConstBool)
8038 v.AuxInt = boolToAuxInt(true)
8039 return true
8040 }
8041
8042
8043 for {
8044 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8045 if v_0.Op != OpConst32 {
8046 continue
8047 }
8048 t := v_0.Type
8049 c := auxIntToInt32(v_0.AuxInt)
8050 if v_1.Op != OpAdd32 {
8051 continue
8052 }
8053 _ = v_1.Args[1]
8054 v_1_0 := v_1.Args[0]
8055 v_1_1 := v_1.Args[1]
8056 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8057 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
8058 continue
8059 }
8060 d := auxIntToInt32(v_1_0.AuxInt)
8061 x := v_1_1
8062 v.reset(OpEq32)
8063 v0 := b.NewValue0(v.Pos, OpConst32, t)
8064 v0.AuxInt = int32ToAuxInt(c - d)
8065 v.AddArg2(v0, x)
8066 return true
8067 }
8068 }
8069 break
8070 }
8071
8072
8073 for {
8074 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8075 if v_0.Op != OpConst32 {
8076 continue
8077 }
8078 c := auxIntToInt32(v_0.AuxInt)
8079 if v_1.Op != OpConst32 {
8080 continue
8081 }
8082 d := auxIntToInt32(v_1.AuxInt)
8083 v.reset(OpConstBool)
8084 v.AuxInt = boolToAuxInt(c == d)
8085 return true
8086 }
8087 break
8088 }
8089
8090
8091
8092 for {
8093 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8094 s := v_0
8095 if s.Op != OpSub32 {
8096 continue
8097 }
8098 y := s.Args[1]
8099 x := s.Args[0]
8100 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 || !(s.Uses == 1) {
8101 continue
8102 }
8103 v.reset(OpEq32)
8104 v.AddArg2(x, y)
8105 return true
8106 }
8107 break
8108 }
8109
8110
8111
8112 for {
8113 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8114 if v_0.Op != OpAnd32 {
8115 continue
8116 }
8117 t := v_0.Type
8118 _ = v_0.Args[1]
8119 v_0_0 := v_0.Args[0]
8120 v_0_1 := v_0.Args[1]
8121 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
8122 x := v_0_0
8123 if v_0_1.Op != OpConst32 || v_0_1.Type != t {
8124 continue
8125 }
8126 y := auxIntToInt32(v_0_1.AuxInt)
8127 if v_1.Op != OpConst32 || v_1.Type != t || auxIntToInt32(v_1.AuxInt) != y || !(oneBit(y)) {
8128 continue
8129 }
8130 v.reset(OpNeq32)
8131 v0 := b.NewValue0(v.Pos, OpAnd32, t)
8132 v1 := b.NewValue0(v.Pos, OpConst32, t)
8133 v1.AuxInt = int32ToAuxInt(y)
8134 v0.AddArg2(x, v1)
8135 v2 := b.NewValue0(v.Pos, OpConst32, t)
8136 v2.AuxInt = int32ToAuxInt(0)
8137 v.AddArg2(v0, v2)
8138 return true
8139 }
8140 }
8141 break
8142 }
8143
8144
8145 for {
8146 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8147 if v_0.Op != OpZeroExt8to32 {
8148 continue
8149 }
8150 v_0_0 := v_0.Args[0]
8151 if v_0_0.Op != OpCvtBoolToUint8 {
8152 continue
8153 }
8154 x := v_0_0.Args[0]
8155 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
8156 continue
8157 }
8158 v.copyOf(x)
8159 return true
8160 }
8161 break
8162 }
8163
8164
8165 for {
8166 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8167 if v_0.Op != OpZeroExt8to32 {
8168 continue
8169 }
8170 v_0_0 := v_0.Args[0]
8171 if v_0_0.Op != OpCvtBoolToUint8 {
8172 continue
8173 }
8174 x := v_0_0.Args[0]
8175 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
8176 continue
8177 }
8178 v.reset(OpNot)
8179 v.AddArg(x)
8180 return true
8181 }
8182 break
8183 }
8184
8185
8186 for {
8187 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8188 if v_0.Op != OpSignExt8to32 {
8189 continue
8190 }
8191 v_0_0 := v_0.Args[0]
8192 if v_0_0.Op != OpCvtBoolToUint8 {
8193 continue
8194 }
8195 x := v_0_0.Args[0]
8196 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
8197 continue
8198 }
8199 v.copyOf(x)
8200 return true
8201 }
8202 break
8203 }
8204
8205
8206 for {
8207 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8208 if v_0.Op != OpSignExt8to32 {
8209 continue
8210 }
8211 v_0_0 := v_0.Args[0]
8212 if v_0_0.Op != OpCvtBoolToUint8 {
8213 continue
8214 }
8215 x := v_0_0.Args[0]
8216 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
8217 continue
8218 }
8219 v.reset(OpNot)
8220 v.AddArg(x)
8221 return true
8222 }
8223 break
8224 }
8225 return false
8226 }
8227 func rewriteValuegeneric_OpEq32F(v *Value) bool {
8228 v_1 := v.Args[1]
8229 v_0 := v.Args[0]
8230
8231
8232 for {
8233 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8234 if v_0.Op != OpConst32F {
8235 continue
8236 }
8237 c := auxIntToFloat32(v_0.AuxInt)
8238 if v_1.Op != OpConst32F {
8239 continue
8240 }
8241 d := auxIntToFloat32(v_1.AuxInt)
8242 v.reset(OpConstBool)
8243 v.AuxInt = boolToAuxInt(c == d)
8244 return true
8245 }
8246 break
8247 }
8248 return false
8249 }
8250 func rewriteValuegeneric_OpEq64(v *Value) bool {
8251 v_1 := v.Args[1]
8252 v_0 := v.Args[0]
8253 b := v.Block
8254
8255
8256 for {
8257 x := v_0
8258 if x != v_1 {
8259 break
8260 }
8261 v.reset(OpConstBool)
8262 v.AuxInt = boolToAuxInt(true)
8263 return true
8264 }
8265
8266
8267 for {
8268 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8269 if v_0.Op != OpConst64 {
8270 continue
8271 }
8272 t := v_0.Type
8273 c := auxIntToInt64(v_0.AuxInt)
8274 if v_1.Op != OpAdd64 {
8275 continue
8276 }
8277 _ = v_1.Args[1]
8278 v_1_0 := v_1.Args[0]
8279 v_1_1 := v_1.Args[1]
8280 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8281 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
8282 continue
8283 }
8284 d := auxIntToInt64(v_1_0.AuxInt)
8285 x := v_1_1
8286 v.reset(OpEq64)
8287 v0 := b.NewValue0(v.Pos, OpConst64, t)
8288 v0.AuxInt = int64ToAuxInt(c - d)
8289 v.AddArg2(v0, x)
8290 return true
8291 }
8292 }
8293 break
8294 }
8295
8296
8297 for {
8298 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8299 if v_0.Op != OpConst64 {
8300 continue
8301 }
8302 c := auxIntToInt64(v_0.AuxInt)
8303 if v_1.Op != OpConst64 {
8304 continue
8305 }
8306 d := auxIntToInt64(v_1.AuxInt)
8307 v.reset(OpConstBool)
8308 v.AuxInt = boolToAuxInt(c == d)
8309 return true
8310 }
8311 break
8312 }
8313
8314
8315
8316 for {
8317 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8318 s := v_0
8319 if s.Op != OpSub64 {
8320 continue
8321 }
8322 y := s.Args[1]
8323 x := s.Args[0]
8324 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 || !(s.Uses == 1) {
8325 continue
8326 }
8327 v.reset(OpEq64)
8328 v.AddArg2(x, y)
8329 return true
8330 }
8331 break
8332 }
8333
8334
8335
8336 for {
8337 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8338 if v_0.Op != OpAnd64 {
8339 continue
8340 }
8341 t := v_0.Type
8342 _ = v_0.Args[1]
8343 v_0_0 := v_0.Args[0]
8344 v_0_1 := v_0.Args[1]
8345 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
8346 x := v_0_0
8347 if v_0_1.Op != OpConst64 || v_0_1.Type != t {
8348 continue
8349 }
8350 y := auxIntToInt64(v_0_1.AuxInt)
8351 if v_1.Op != OpConst64 || v_1.Type != t || auxIntToInt64(v_1.AuxInt) != y || !(oneBit(y)) {
8352 continue
8353 }
8354 v.reset(OpNeq64)
8355 v0 := b.NewValue0(v.Pos, OpAnd64, t)
8356 v1 := b.NewValue0(v.Pos, OpConst64, t)
8357 v1.AuxInt = int64ToAuxInt(y)
8358 v0.AddArg2(x, v1)
8359 v2 := b.NewValue0(v.Pos, OpConst64, t)
8360 v2.AuxInt = int64ToAuxInt(0)
8361 v.AddArg2(v0, v2)
8362 return true
8363 }
8364 }
8365 break
8366 }
8367
8368
8369 for {
8370 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8371 if v_0.Op != OpZeroExt8to64 {
8372 continue
8373 }
8374 v_0_0 := v_0.Args[0]
8375 if v_0_0.Op != OpCvtBoolToUint8 {
8376 continue
8377 }
8378 x := v_0_0.Args[0]
8379 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
8380 continue
8381 }
8382 v.copyOf(x)
8383 return true
8384 }
8385 break
8386 }
8387
8388
8389 for {
8390 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8391 if v_0.Op != OpZeroExt8to64 {
8392 continue
8393 }
8394 v_0_0 := v_0.Args[0]
8395 if v_0_0.Op != OpCvtBoolToUint8 {
8396 continue
8397 }
8398 x := v_0_0.Args[0]
8399 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
8400 continue
8401 }
8402 v.reset(OpNot)
8403 v.AddArg(x)
8404 return true
8405 }
8406 break
8407 }
8408
8409
8410 for {
8411 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8412 if v_0.Op != OpSignExt8to64 {
8413 continue
8414 }
8415 v_0_0 := v_0.Args[0]
8416 if v_0_0.Op != OpCvtBoolToUint8 {
8417 continue
8418 }
8419 x := v_0_0.Args[0]
8420 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
8421 continue
8422 }
8423 v.copyOf(x)
8424 return true
8425 }
8426 break
8427 }
8428
8429
8430 for {
8431 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8432 if v_0.Op != OpSignExt8to64 {
8433 continue
8434 }
8435 v_0_0 := v_0.Args[0]
8436 if v_0_0.Op != OpCvtBoolToUint8 {
8437 continue
8438 }
8439 x := v_0_0.Args[0]
8440 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
8441 continue
8442 }
8443 v.reset(OpNot)
8444 v.AddArg(x)
8445 return true
8446 }
8447 break
8448 }
8449 return false
8450 }
8451 func rewriteValuegeneric_OpEq64F(v *Value) bool {
8452 v_1 := v.Args[1]
8453 v_0 := v.Args[0]
8454
8455
8456 for {
8457 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8458 if v_0.Op != OpConst64F {
8459 continue
8460 }
8461 c := auxIntToFloat64(v_0.AuxInt)
8462 if v_1.Op != OpConst64F {
8463 continue
8464 }
8465 d := auxIntToFloat64(v_1.AuxInt)
8466 v.reset(OpConstBool)
8467 v.AuxInt = boolToAuxInt(c == d)
8468 return true
8469 }
8470 break
8471 }
8472 return false
8473 }
8474 func rewriteValuegeneric_OpEq8(v *Value) bool {
8475 v_1 := v.Args[1]
8476 v_0 := v.Args[0]
8477 b := v.Block
8478 config := b.Func.Config
8479 typ := &b.Func.Config.Types
8480
8481
8482 for {
8483 x := v_0
8484 if x != v_1 {
8485 break
8486 }
8487 v.reset(OpConstBool)
8488 v.AuxInt = boolToAuxInt(true)
8489 return true
8490 }
8491
8492
8493 for {
8494 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8495 if v_0.Op != OpConst8 {
8496 continue
8497 }
8498 t := v_0.Type
8499 c := auxIntToInt8(v_0.AuxInt)
8500 if v_1.Op != OpAdd8 {
8501 continue
8502 }
8503 _ = v_1.Args[1]
8504 v_1_0 := v_1.Args[0]
8505 v_1_1 := v_1.Args[1]
8506 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8507 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
8508 continue
8509 }
8510 d := auxIntToInt8(v_1_0.AuxInt)
8511 x := v_1_1
8512 v.reset(OpEq8)
8513 v0 := b.NewValue0(v.Pos, OpConst8, t)
8514 v0.AuxInt = int8ToAuxInt(c - d)
8515 v.AddArg2(v0, x)
8516 return true
8517 }
8518 }
8519 break
8520 }
8521
8522
8523 for {
8524 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8525 if v_0.Op != OpConst8 {
8526 continue
8527 }
8528 c := auxIntToInt8(v_0.AuxInt)
8529 if v_1.Op != OpConst8 {
8530 continue
8531 }
8532 d := auxIntToInt8(v_1.AuxInt)
8533 v.reset(OpConstBool)
8534 v.AuxInt = boolToAuxInt(c == d)
8535 return true
8536 }
8537 break
8538 }
8539
8540
8541
8542 for {
8543 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8544 if v_0.Op != OpMod8u {
8545 continue
8546 }
8547 _ = v_0.Args[1]
8548 x := v_0.Args[0]
8549 v_0_1 := v_0.Args[1]
8550 if v_0_1.Op != OpConst8 {
8551 continue
8552 }
8553 c := auxIntToInt8(v_0_1.AuxInt)
8554 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(x.Op != OpConst8 && udivisibleOK8(c) && !hasSmallRotate(config)) {
8555 continue
8556 }
8557 v.reset(OpEq32)
8558 v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32)
8559 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
8560 v1.AddArg(x)
8561 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8562 v2.AuxInt = int32ToAuxInt(int32(uint8(c)))
8563 v0.AddArg2(v1, v2)
8564 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8565 v3.AuxInt = int32ToAuxInt(0)
8566 v.AddArg2(v0, v3)
8567 return true
8568 }
8569 break
8570 }
8571
8572
8573
8574 for {
8575 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8576 if v_0.Op != OpMod8 {
8577 continue
8578 }
8579 _ = v_0.Args[1]
8580 x := v_0.Args[0]
8581 v_0_1 := v_0.Args[1]
8582 if v_0_1.Op != OpConst8 {
8583 continue
8584 }
8585 c := auxIntToInt8(v_0_1.AuxInt)
8586 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(x.Op != OpConst8 && sdivisibleOK8(c) && !hasSmallRotate(config)) {
8587 continue
8588 }
8589 v.reset(OpEq32)
8590 v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32)
8591 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
8592 v1.AddArg(x)
8593 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
8594 v2.AuxInt = int32ToAuxInt(int32(c))
8595 v0.AddArg2(v1, v2)
8596 v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
8597 v3.AuxInt = int32ToAuxInt(0)
8598 v.AddArg2(v0, v3)
8599 return true
8600 }
8601 break
8602 }
8603
8604
8605
8606 for {
8607 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8608 s := v_0
8609 if s.Op != OpSub8 {
8610 continue
8611 }
8612 y := s.Args[1]
8613 x := s.Args[0]
8614 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(s.Uses == 1) {
8615 continue
8616 }
8617 v.reset(OpEq8)
8618 v.AddArg2(x, y)
8619 return true
8620 }
8621 break
8622 }
8623
8624
8625
8626 for {
8627 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8628 if v_0.Op != OpAnd8 {
8629 continue
8630 }
8631 t := v_0.Type
8632 _ = v_0.Args[1]
8633 v_0_0 := v_0.Args[0]
8634 v_0_1 := v_0.Args[1]
8635 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
8636 x := v_0_0
8637 if v_0_1.Op != OpConst8 || v_0_1.Type != t {
8638 continue
8639 }
8640 y := auxIntToInt8(v_0_1.AuxInt)
8641 if v_1.Op != OpConst8 || v_1.Type != t || auxIntToInt8(v_1.AuxInt) != y || !(oneBit(y)) {
8642 continue
8643 }
8644 v.reset(OpNeq8)
8645 v0 := b.NewValue0(v.Pos, OpAnd8, t)
8646 v1 := b.NewValue0(v.Pos, OpConst8, t)
8647 v1.AuxInt = int8ToAuxInt(y)
8648 v0.AddArg2(x, v1)
8649 v2 := b.NewValue0(v.Pos, OpConst8, t)
8650 v2.AuxInt = int8ToAuxInt(0)
8651 v.AddArg2(v0, v2)
8652 return true
8653 }
8654 }
8655 break
8656 }
8657
8658
8659 for {
8660 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8661 if v_0.Op != OpCvtBoolToUint8 {
8662 continue
8663 }
8664 x := v_0.Args[0]
8665 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 1 {
8666 continue
8667 }
8668 v.copyOf(x)
8669 return true
8670 }
8671 break
8672 }
8673
8674
8675 for {
8676 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8677 if v_0.Op != OpCvtBoolToUint8 {
8678 continue
8679 }
8680 x := v_0.Args[0]
8681 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
8682 continue
8683 }
8684 v.reset(OpNot)
8685 v.AddArg(x)
8686 return true
8687 }
8688 break
8689 }
8690 return false
8691 }
8692 func rewriteValuegeneric_OpEqB(v *Value) bool {
8693 v_1 := v.Args[1]
8694 v_0 := v.Args[0]
8695
8696
8697 for {
8698 x := v_0
8699 if x != v_1 {
8700 break
8701 }
8702 v.reset(OpConstBool)
8703 v.AuxInt = boolToAuxInt(true)
8704 return true
8705 }
8706
8707
8708 for {
8709 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8710 if v_0.Op != OpConstBool {
8711 continue
8712 }
8713 c := auxIntToBool(v_0.AuxInt)
8714 if v_1.Op != OpConstBool {
8715 continue
8716 }
8717 d := auxIntToBool(v_1.AuxInt)
8718 v.reset(OpConstBool)
8719 v.AuxInt = boolToAuxInt(c == d)
8720 return true
8721 }
8722 break
8723 }
8724
8725
8726 for {
8727 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8728 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
8729 continue
8730 }
8731 x := v_1
8732 v.reset(OpNot)
8733 v.AddArg(x)
8734 return true
8735 }
8736 break
8737 }
8738
8739
8740 for {
8741 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8742 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
8743 continue
8744 }
8745 x := v_1
8746 v.copyOf(x)
8747 return true
8748 }
8749 break
8750 }
8751
8752
8753 for {
8754 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8755 if v_0.Op != OpNot {
8756 continue
8757 }
8758 x := v_0.Args[0]
8759 y := v_1
8760 v.reset(OpNeqB)
8761 v.AddArg2(x, y)
8762 return true
8763 }
8764 break
8765 }
8766 return false
8767 }
8768 func rewriteValuegeneric_OpEqInter(v *Value) bool {
8769 v_1 := v.Args[1]
8770 v_0 := v.Args[0]
8771 b := v.Block
8772 typ := &b.Func.Config.Types
8773
8774
8775 for {
8776 x := v_0
8777 y := v_1
8778 v.reset(OpEqPtr)
8779 v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
8780 v0.AddArg(x)
8781 v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
8782 v1.AddArg(y)
8783 v.AddArg2(v0, v1)
8784 return true
8785 }
8786 }
8787 func rewriteValuegeneric_OpEqPtr(v *Value) bool {
8788 v_1 := v.Args[1]
8789 v_0 := v.Args[0]
8790 b := v.Block
8791 typ := &b.Func.Config.Types
8792
8793
8794 for {
8795 x := v_0
8796 if x != v_1 {
8797 break
8798 }
8799 v.reset(OpConstBool)
8800 v.AuxInt = boolToAuxInt(true)
8801 return true
8802 }
8803
8804
8805 for {
8806 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8807 if v_0.Op != OpAddr {
8808 continue
8809 }
8810 x := auxToSym(v_0.Aux)
8811 if v_1.Op != OpAddr {
8812 continue
8813 }
8814 y := auxToSym(v_1.Aux)
8815 v.reset(OpConstBool)
8816 v.AuxInt = boolToAuxInt(x == y)
8817 return true
8818 }
8819 break
8820 }
8821
8822
8823 for {
8824 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8825 if v_0.Op != OpAddr {
8826 continue
8827 }
8828 x := auxToSym(v_0.Aux)
8829 if v_1.Op != OpOffPtr {
8830 continue
8831 }
8832 o := auxIntToInt64(v_1.AuxInt)
8833 v_1_0 := v_1.Args[0]
8834 if v_1_0.Op != OpAddr {
8835 continue
8836 }
8837 y := auxToSym(v_1_0.Aux)
8838 v.reset(OpConstBool)
8839 v.AuxInt = boolToAuxInt(x == y && o == 0)
8840 return true
8841 }
8842 break
8843 }
8844
8845
8846 for {
8847 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8848 if v_0.Op != OpOffPtr {
8849 continue
8850 }
8851 o1 := auxIntToInt64(v_0.AuxInt)
8852 v_0_0 := v_0.Args[0]
8853 if v_0_0.Op != OpAddr {
8854 continue
8855 }
8856 x := auxToSym(v_0_0.Aux)
8857 if v_1.Op != OpOffPtr {
8858 continue
8859 }
8860 o2 := auxIntToInt64(v_1.AuxInt)
8861 v_1_0 := v_1.Args[0]
8862 if v_1_0.Op != OpAddr {
8863 continue
8864 }
8865 y := auxToSym(v_1_0.Aux)
8866 v.reset(OpConstBool)
8867 v.AuxInt = boolToAuxInt(x == y && o1 == o2)
8868 return true
8869 }
8870 break
8871 }
8872
8873
8874 for {
8875 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8876 if v_0.Op != OpLocalAddr {
8877 continue
8878 }
8879 x := auxToSym(v_0.Aux)
8880 if v_1.Op != OpLocalAddr {
8881 continue
8882 }
8883 y := auxToSym(v_1.Aux)
8884 v.reset(OpConstBool)
8885 v.AuxInt = boolToAuxInt(x == y)
8886 return true
8887 }
8888 break
8889 }
8890
8891
8892 for {
8893 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8894 if v_0.Op != OpLocalAddr {
8895 continue
8896 }
8897 x := auxToSym(v_0.Aux)
8898 if v_1.Op != OpOffPtr {
8899 continue
8900 }
8901 o := auxIntToInt64(v_1.AuxInt)
8902 v_1_0 := v_1.Args[0]
8903 if v_1_0.Op != OpLocalAddr {
8904 continue
8905 }
8906 y := auxToSym(v_1_0.Aux)
8907 v.reset(OpConstBool)
8908 v.AuxInt = boolToAuxInt(x == y && o == 0)
8909 return true
8910 }
8911 break
8912 }
8913
8914
8915 for {
8916 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8917 if v_0.Op != OpOffPtr {
8918 continue
8919 }
8920 o1 := auxIntToInt64(v_0.AuxInt)
8921 v_0_0 := v_0.Args[0]
8922 if v_0_0.Op != OpLocalAddr {
8923 continue
8924 }
8925 x := auxToSym(v_0_0.Aux)
8926 if v_1.Op != OpOffPtr {
8927 continue
8928 }
8929 o2 := auxIntToInt64(v_1.AuxInt)
8930 v_1_0 := v_1.Args[0]
8931 if v_1_0.Op != OpLocalAddr {
8932 continue
8933 }
8934 y := auxToSym(v_1_0.Aux)
8935 v.reset(OpConstBool)
8936 v.AuxInt = boolToAuxInt(x == y && o1 == o2)
8937 return true
8938 }
8939 break
8940 }
8941
8942
8943
8944 for {
8945 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8946 if v_0.Op != OpOffPtr {
8947 continue
8948 }
8949 o1 := auxIntToInt64(v_0.AuxInt)
8950 p1 := v_0.Args[0]
8951 p2 := v_1
8952 if !(isSamePtr(p1, p2)) {
8953 continue
8954 }
8955 v.reset(OpConstBool)
8956 v.AuxInt = boolToAuxInt(o1 == 0)
8957 return true
8958 }
8959 break
8960 }
8961
8962
8963
8964 for {
8965 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8966 if v_0.Op != OpOffPtr {
8967 continue
8968 }
8969 o1 := auxIntToInt64(v_0.AuxInt)
8970 p1 := v_0.Args[0]
8971 if v_1.Op != OpOffPtr {
8972 continue
8973 }
8974 o2 := auxIntToInt64(v_1.AuxInt)
8975 p2 := v_1.Args[0]
8976 if !(isSamePtr(p1, p2)) {
8977 continue
8978 }
8979 v.reset(OpConstBool)
8980 v.AuxInt = boolToAuxInt(o1 == o2)
8981 return true
8982 }
8983 break
8984 }
8985
8986
8987 for {
8988 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8989 if v_0.Op != OpConst32 {
8990 continue
8991 }
8992 c := auxIntToInt32(v_0.AuxInt)
8993 if v_1.Op != OpConst32 {
8994 continue
8995 }
8996 d := auxIntToInt32(v_1.AuxInt)
8997 v.reset(OpConstBool)
8998 v.AuxInt = boolToAuxInt(c == d)
8999 return true
9000 }
9001 break
9002 }
9003
9004
9005 for {
9006 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9007 if v_0.Op != OpConst64 {
9008 continue
9009 }
9010 c := auxIntToInt64(v_0.AuxInt)
9011 if v_1.Op != OpConst64 {
9012 continue
9013 }
9014 d := auxIntToInt64(v_1.AuxInt)
9015 v.reset(OpConstBool)
9016 v.AuxInt = boolToAuxInt(c == d)
9017 return true
9018 }
9019 break
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 != OpConvert {
9026 continue
9027 }
9028 v_0_0 := v_0.Args[0]
9029 if v_0_0.Op != OpAddr {
9030 continue
9031 }
9032 x := auxToSym(v_0_0.Aux)
9033 if v_1.Op != OpAddr {
9034 continue
9035 }
9036 y := auxToSym(v_1.Aux)
9037 v.reset(OpConstBool)
9038 v.AuxInt = boolToAuxInt(x == y)
9039 return true
9040 }
9041 break
9042 }
9043
9044
9045 for {
9046 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9047 if v_0.Op != OpLocalAddr || v_1.Op != OpAddr {
9048 continue
9049 }
9050 v.reset(OpConstBool)
9051 v.AuxInt = boolToAuxInt(false)
9052 return true
9053 }
9054 break
9055 }
9056
9057
9058 for {
9059 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9060 if v_0.Op != OpOffPtr {
9061 continue
9062 }
9063 v_0_0 := v_0.Args[0]
9064 if v_0_0.Op != OpLocalAddr || v_1.Op != OpAddr {
9065 continue
9066 }
9067 v.reset(OpConstBool)
9068 v.AuxInt = boolToAuxInt(false)
9069 return true
9070 }
9071 break
9072 }
9073
9074
9075 for {
9076 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9077 if v_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
9078 continue
9079 }
9080 v_1_0 := v_1.Args[0]
9081 if v_1_0.Op != OpAddr {
9082 continue
9083 }
9084 v.reset(OpConstBool)
9085 v.AuxInt = boolToAuxInt(false)
9086 return true
9087 }
9088 break
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 != OpOffPtr {
9095 continue
9096 }
9097 v_0_0 := v_0.Args[0]
9098 if v_0_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
9099 continue
9100 }
9101 v_1_0 := v_1.Args[0]
9102 if v_1_0.Op != OpAddr {
9103 continue
9104 }
9105 v.reset(OpConstBool)
9106 v.AuxInt = boolToAuxInt(false)
9107 return true
9108 }
9109 break
9110 }
9111
9112
9113
9114 for {
9115 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9116 if v_0.Op != OpAddPtr {
9117 continue
9118 }
9119 o1 := v_0.Args[1]
9120 p1 := v_0.Args[0]
9121 p2 := v_1
9122 if !(isSamePtr(p1, p2)) {
9123 continue
9124 }
9125 v.reset(OpNot)
9126 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
9127 v0.AddArg(o1)
9128 v.AddArg(v0)
9129 return true
9130 }
9131 break
9132 }
9133
9134
9135 for {
9136 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9137 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
9138 continue
9139 }
9140 p := v_1
9141 v.reset(OpNot)
9142 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
9143 v0.AddArg(p)
9144 v.AddArg(v0)
9145 return true
9146 }
9147 break
9148 }
9149
9150
9151 for {
9152 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9153 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
9154 continue
9155 }
9156 p := v_1
9157 v.reset(OpNot)
9158 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
9159 v0.AddArg(p)
9160 v.AddArg(v0)
9161 return true
9162 }
9163 break
9164 }
9165
9166
9167 for {
9168 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9169 if v_0.Op != OpConstNil {
9170 continue
9171 }
9172 p := v_1
9173 v.reset(OpNot)
9174 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
9175 v0.AddArg(p)
9176 v.AddArg(v0)
9177 return true
9178 }
9179 break
9180 }
9181 return false
9182 }
9183 func rewriteValuegeneric_OpEqSlice(v *Value) bool {
9184 v_1 := v.Args[1]
9185 v_0 := v.Args[0]
9186 b := v.Block
9187 typ := &b.Func.Config.Types
9188
9189
9190 for {
9191 x := v_0
9192 y := v_1
9193 v.reset(OpEqPtr)
9194 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
9195 v0.AddArg(x)
9196 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
9197 v1.AddArg(y)
9198 v.AddArg2(v0, v1)
9199 return true
9200 }
9201 }
9202 func rewriteValuegeneric_OpFloor(v *Value) bool {
9203 v_0 := v.Args[0]
9204
9205
9206 for {
9207 if v_0.Op != OpConst64F {
9208 break
9209 }
9210 c := auxIntToFloat64(v_0.AuxInt)
9211 v.reset(OpConst64F)
9212 v.AuxInt = float64ToAuxInt(math.Floor(c))
9213 return true
9214 }
9215 return false
9216 }
9217 func rewriteValuegeneric_OpIMake(v *Value) bool {
9218 v_1 := v.Args[1]
9219 v_0 := v.Args[0]
9220
9221
9222 for {
9223 if v_1.Op != OpStructMake {
9224 break
9225 }
9226 v.copyOf(imakeOfStructMake(v))
9227 return true
9228 }
9229
9230
9231 for {
9232 _typ := v_0
9233 if v_1.Op != OpArrayMake1 {
9234 break
9235 }
9236 val := v_1.Args[0]
9237 v.reset(OpIMake)
9238 v.AddArg2(_typ, val)
9239 return true
9240 }
9241 return false
9242 }
9243 func rewriteValuegeneric_OpInterLECall(v *Value) bool {
9244
9245
9246 for {
9247 if len(v.Args) < 1 {
9248 break
9249 }
9250 v_0 := v.Args[0]
9251 if v_0.Op != OpAddr {
9252 break
9253 }
9254 fn := auxToSym(v_0.Aux)
9255 v_0_0 := v_0.Args[0]
9256 if v_0_0.Op != OpSB {
9257 break
9258 }
9259 v.copyOf(devirtLECall(v, fn.(*obj.LSym)))
9260 return true
9261 }
9262 return false
9263 }
9264 func rewriteValuegeneric_OpIsInBounds(v *Value) bool {
9265 v_1 := v.Args[1]
9266 v_0 := v.Args[0]
9267
9268
9269
9270 for {
9271 if v_0.Op != OpZeroExt8to32 || v_1.Op != OpConst32 {
9272 break
9273 }
9274 c := auxIntToInt32(v_1.AuxInt)
9275 if !((1 << 8) <= c) {
9276 break
9277 }
9278 v.reset(OpConstBool)
9279 v.AuxInt = boolToAuxInt(true)
9280 return true
9281 }
9282
9283
9284
9285 for {
9286 if v_0.Op != OpZeroExt8to64 || v_1.Op != OpConst64 {
9287 break
9288 }
9289 c := auxIntToInt64(v_1.AuxInt)
9290 if !((1 << 8) <= c) {
9291 break
9292 }
9293 v.reset(OpConstBool)
9294 v.AuxInt = boolToAuxInt(true)
9295 return true
9296 }
9297
9298
9299
9300 for {
9301 if v_0.Op != OpZeroExt16to32 || v_1.Op != OpConst32 {
9302 break
9303 }
9304 c := auxIntToInt32(v_1.AuxInt)
9305 if !((1 << 16) <= c) {
9306 break
9307 }
9308 v.reset(OpConstBool)
9309 v.AuxInt = boolToAuxInt(true)
9310 return true
9311 }
9312
9313
9314
9315 for {
9316 if v_0.Op != OpZeroExt16to64 || v_1.Op != OpConst64 {
9317 break
9318 }
9319 c := auxIntToInt64(v_1.AuxInt)
9320 if !((1 << 16) <= c) {
9321 break
9322 }
9323 v.reset(OpConstBool)
9324 v.AuxInt = boolToAuxInt(true)
9325 return true
9326 }
9327
9328
9329 for {
9330 x := v_0
9331 if x != v_1 {
9332 break
9333 }
9334 v.reset(OpConstBool)
9335 v.AuxInt = boolToAuxInt(false)
9336 return true
9337 }
9338
9339
9340
9341 for {
9342 if v_0.Op != OpAnd8 {
9343 break
9344 }
9345 v_0_0 := v_0.Args[0]
9346 v_0_1 := v_0.Args[1]
9347 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9348 if v_0_0.Op != OpConst8 {
9349 continue
9350 }
9351 c := auxIntToInt8(v_0_0.AuxInt)
9352 if v_1.Op != OpConst8 {
9353 continue
9354 }
9355 d := auxIntToInt8(v_1.AuxInt)
9356 if !(0 <= c && c < d) {
9357 continue
9358 }
9359 v.reset(OpConstBool)
9360 v.AuxInt = boolToAuxInt(true)
9361 return true
9362 }
9363 break
9364 }
9365
9366
9367
9368 for {
9369 if v_0.Op != OpZeroExt8to16 {
9370 break
9371 }
9372 v_0_0 := v_0.Args[0]
9373 if v_0_0.Op != OpAnd8 {
9374 break
9375 }
9376 v_0_0_0 := v_0_0.Args[0]
9377 v_0_0_1 := v_0_0.Args[1]
9378 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9379 if v_0_0_0.Op != OpConst8 {
9380 continue
9381 }
9382 c := auxIntToInt8(v_0_0_0.AuxInt)
9383 if v_1.Op != OpConst16 {
9384 continue
9385 }
9386 d := auxIntToInt16(v_1.AuxInt)
9387 if !(0 <= c && int16(c) < d) {
9388 continue
9389 }
9390 v.reset(OpConstBool)
9391 v.AuxInt = boolToAuxInt(true)
9392 return true
9393 }
9394 break
9395 }
9396
9397
9398
9399 for {
9400 if v_0.Op != OpZeroExt8to32 {
9401 break
9402 }
9403 v_0_0 := v_0.Args[0]
9404 if v_0_0.Op != OpAnd8 {
9405 break
9406 }
9407 v_0_0_0 := v_0_0.Args[0]
9408 v_0_0_1 := v_0_0.Args[1]
9409 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9410 if v_0_0_0.Op != OpConst8 {
9411 continue
9412 }
9413 c := auxIntToInt8(v_0_0_0.AuxInt)
9414 if v_1.Op != OpConst32 {
9415 continue
9416 }
9417 d := auxIntToInt32(v_1.AuxInt)
9418 if !(0 <= c && int32(c) < d) {
9419 continue
9420 }
9421 v.reset(OpConstBool)
9422 v.AuxInt = boolToAuxInt(true)
9423 return true
9424 }
9425 break
9426 }
9427
9428
9429
9430 for {
9431 if v_0.Op != OpZeroExt8to64 {
9432 break
9433 }
9434 v_0_0 := v_0.Args[0]
9435 if v_0_0.Op != OpAnd8 {
9436 break
9437 }
9438 v_0_0_0 := v_0_0.Args[0]
9439 v_0_0_1 := v_0_0.Args[1]
9440 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9441 if v_0_0_0.Op != OpConst8 {
9442 continue
9443 }
9444 c := auxIntToInt8(v_0_0_0.AuxInt)
9445 if v_1.Op != OpConst64 {
9446 continue
9447 }
9448 d := auxIntToInt64(v_1.AuxInt)
9449 if !(0 <= c && int64(c) < d) {
9450 continue
9451 }
9452 v.reset(OpConstBool)
9453 v.AuxInt = boolToAuxInt(true)
9454 return true
9455 }
9456 break
9457 }
9458
9459
9460
9461 for {
9462 if v_0.Op != OpAnd16 {
9463 break
9464 }
9465 v_0_0 := v_0.Args[0]
9466 v_0_1 := v_0.Args[1]
9467 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9468 if v_0_0.Op != OpConst16 {
9469 continue
9470 }
9471 c := auxIntToInt16(v_0_0.AuxInt)
9472 if v_1.Op != OpConst16 {
9473 continue
9474 }
9475 d := auxIntToInt16(v_1.AuxInt)
9476 if !(0 <= c && c < d) {
9477 continue
9478 }
9479 v.reset(OpConstBool)
9480 v.AuxInt = boolToAuxInt(true)
9481 return true
9482 }
9483 break
9484 }
9485
9486
9487
9488 for {
9489 if v_0.Op != OpZeroExt16to32 {
9490 break
9491 }
9492 v_0_0 := v_0.Args[0]
9493 if v_0_0.Op != OpAnd16 {
9494 break
9495 }
9496 v_0_0_0 := v_0_0.Args[0]
9497 v_0_0_1 := v_0_0.Args[1]
9498 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9499 if v_0_0_0.Op != OpConst16 {
9500 continue
9501 }
9502 c := auxIntToInt16(v_0_0_0.AuxInt)
9503 if v_1.Op != OpConst32 {
9504 continue
9505 }
9506 d := auxIntToInt32(v_1.AuxInt)
9507 if !(0 <= c && int32(c) < d) {
9508 continue
9509 }
9510 v.reset(OpConstBool)
9511 v.AuxInt = boolToAuxInt(true)
9512 return true
9513 }
9514 break
9515 }
9516
9517
9518
9519 for {
9520 if v_0.Op != OpZeroExt16to64 {
9521 break
9522 }
9523 v_0_0 := v_0.Args[0]
9524 if v_0_0.Op != OpAnd16 {
9525 break
9526 }
9527 v_0_0_0 := v_0_0.Args[0]
9528 v_0_0_1 := v_0_0.Args[1]
9529 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9530 if v_0_0_0.Op != OpConst16 {
9531 continue
9532 }
9533 c := auxIntToInt16(v_0_0_0.AuxInt)
9534 if v_1.Op != OpConst64 {
9535 continue
9536 }
9537 d := auxIntToInt64(v_1.AuxInt)
9538 if !(0 <= c && int64(c) < d) {
9539 continue
9540 }
9541 v.reset(OpConstBool)
9542 v.AuxInt = boolToAuxInt(true)
9543 return true
9544 }
9545 break
9546 }
9547
9548
9549
9550 for {
9551 if v_0.Op != OpAnd32 {
9552 break
9553 }
9554 v_0_0 := v_0.Args[0]
9555 v_0_1 := v_0.Args[1]
9556 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9557 if v_0_0.Op != OpConst32 {
9558 continue
9559 }
9560 c := auxIntToInt32(v_0_0.AuxInt)
9561 if v_1.Op != OpConst32 {
9562 continue
9563 }
9564 d := auxIntToInt32(v_1.AuxInt)
9565 if !(0 <= c && c < d) {
9566 continue
9567 }
9568 v.reset(OpConstBool)
9569 v.AuxInt = boolToAuxInt(true)
9570 return true
9571 }
9572 break
9573 }
9574
9575
9576
9577 for {
9578 if v_0.Op != OpZeroExt32to64 {
9579 break
9580 }
9581 v_0_0 := v_0.Args[0]
9582 if v_0_0.Op != OpAnd32 {
9583 break
9584 }
9585 v_0_0_0 := v_0_0.Args[0]
9586 v_0_0_1 := v_0_0.Args[1]
9587 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9588 if v_0_0_0.Op != OpConst32 {
9589 continue
9590 }
9591 c := auxIntToInt32(v_0_0_0.AuxInt)
9592 if v_1.Op != OpConst64 {
9593 continue
9594 }
9595 d := auxIntToInt64(v_1.AuxInt)
9596 if !(0 <= c && int64(c) < d) {
9597 continue
9598 }
9599 v.reset(OpConstBool)
9600 v.AuxInt = boolToAuxInt(true)
9601 return true
9602 }
9603 break
9604 }
9605
9606
9607
9608 for {
9609 if v_0.Op != OpAnd64 {
9610 break
9611 }
9612 v_0_0 := v_0.Args[0]
9613 v_0_1 := v_0.Args[1]
9614 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9615 if v_0_0.Op != OpConst64 {
9616 continue
9617 }
9618 c := auxIntToInt64(v_0_0.AuxInt)
9619 if v_1.Op != OpConst64 {
9620 continue
9621 }
9622 d := auxIntToInt64(v_1.AuxInt)
9623 if !(0 <= c && c < d) {
9624 continue
9625 }
9626 v.reset(OpConstBool)
9627 v.AuxInt = boolToAuxInt(true)
9628 return true
9629 }
9630 break
9631 }
9632
9633
9634 for {
9635 if v_0.Op != OpConst32 {
9636 break
9637 }
9638 c := auxIntToInt32(v_0.AuxInt)
9639 if v_1.Op != OpConst32 {
9640 break
9641 }
9642 d := auxIntToInt32(v_1.AuxInt)
9643 v.reset(OpConstBool)
9644 v.AuxInt = boolToAuxInt(0 <= c && c < d)
9645 return true
9646 }
9647
9648
9649 for {
9650 if v_0.Op != OpConst64 {
9651 break
9652 }
9653 c := auxIntToInt64(v_0.AuxInt)
9654 if v_1.Op != OpConst64 {
9655 break
9656 }
9657 d := auxIntToInt64(v_1.AuxInt)
9658 v.reset(OpConstBool)
9659 v.AuxInt = boolToAuxInt(0 <= c && c < d)
9660 return true
9661 }
9662
9663
9664 for {
9665 if v_0.Op != OpMod32u {
9666 break
9667 }
9668 y := v_0.Args[1]
9669 if y != v_1 {
9670 break
9671 }
9672 v.reset(OpConstBool)
9673 v.AuxInt = boolToAuxInt(true)
9674 return true
9675 }
9676
9677
9678 for {
9679 if v_0.Op != OpMod64u {
9680 break
9681 }
9682 y := v_0.Args[1]
9683 if y != v_1 {
9684 break
9685 }
9686 v.reset(OpConstBool)
9687 v.AuxInt = boolToAuxInt(true)
9688 return true
9689 }
9690
9691
9692
9693 for {
9694 if v_0.Op != OpZeroExt8to64 {
9695 break
9696 }
9697 v_0_0 := v_0.Args[0]
9698 if v_0_0.Op != OpRsh8Ux64 {
9699 break
9700 }
9701 _ = v_0_0.Args[1]
9702 v_0_0_1 := v_0_0.Args[1]
9703 if v_0_0_1.Op != OpConst64 {
9704 break
9705 }
9706 c := auxIntToInt64(v_0_0_1.AuxInt)
9707 if v_1.Op != OpConst64 {
9708 break
9709 }
9710 d := auxIntToInt64(v_1.AuxInt)
9711 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
9712 break
9713 }
9714 v.reset(OpConstBool)
9715 v.AuxInt = boolToAuxInt(true)
9716 return true
9717 }
9718
9719
9720
9721 for {
9722 if v_0.Op != OpZeroExt8to32 {
9723 break
9724 }
9725 v_0_0 := v_0.Args[0]
9726 if v_0_0.Op != OpRsh8Ux64 {
9727 break
9728 }
9729 _ = v_0_0.Args[1]
9730 v_0_0_1 := v_0_0.Args[1]
9731 if v_0_0_1.Op != OpConst64 {
9732 break
9733 }
9734 c := auxIntToInt64(v_0_0_1.AuxInt)
9735 if v_1.Op != OpConst32 {
9736 break
9737 }
9738 d := auxIntToInt32(v_1.AuxInt)
9739 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
9740 break
9741 }
9742 v.reset(OpConstBool)
9743 v.AuxInt = boolToAuxInt(true)
9744 return true
9745 }
9746
9747
9748
9749 for {
9750 if v_0.Op != OpZeroExt8to16 {
9751 break
9752 }
9753 v_0_0 := v_0.Args[0]
9754 if v_0_0.Op != OpRsh8Ux64 {
9755 break
9756 }
9757 _ = v_0_0.Args[1]
9758 v_0_0_1 := v_0_0.Args[1]
9759 if v_0_0_1.Op != OpConst64 {
9760 break
9761 }
9762 c := auxIntToInt64(v_0_0_1.AuxInt)
9763 if v_1.Op != OpConst16 {
9764 break
9765 }
9766 d := auxIntToInt16(v_1.AuxInt)
9767 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
9768 break
9769 }
9770 v.reset(OpConstBool)
9771 v.AuxInt = boolToAuxInt(true)
9772 return true
9773 }
9774
9775
9776
9777 for {
9778 if v_0.Op != OpRsh8Ux64 {
9779 break
9780 }
9781 _ = v_0.Args[1]
9782 v_0_1 := v_0.Args[1]
9783 if v_0_1.Op != OpConst64 {
9784 break
9785 }
9786 c := auxIntToInt64(v_0_1.AuxInt)
9787 if v_1.Op != OpConst64 {
9788 break
9789 }
9790 d := auxIntToInt64(v_1.AuxInt)
9791 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
9792 break
9793 }
9794 v.reset(OpConstBool)
9795 v.AuxInt = boolToAuxInt(true)
9796 return true
9797 }
9798
9799
9800
9801 for {
9802 if v_0.Op != OpZeroExt16to64 {
9803 break
9804 }
9805 v_0_0 := v_0.Args[0]
9806 if v_0_0.Op != OpRsh16Ux64 {
9807 break
9808 }
9809 _ = v_0_0.Args[1]
9810 v_0_0_1 := v_0_0.Args[1]
9811 if v_0_0_1.Op != OpConst64 {
9812 break
9813 }
9814 c := auxIntToInt64(v_0_0_1.AuxInt)
9815 if v_1.Op != OpConst64 {
9816 break
9817 }
9818 d := auxIntToInt64(v_1.AuxInt)
9819 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
9820 break
9821 }
9822 v.reset(OpConstBool)
9823 v.AuxInt = boolToAuxInt(true)
9824 return true
9825 }
9826
9827
9828
9829 for {
9830 if v_0.Op != OpZeroExt16to32 {
9831 break
9832 }
9833 v_0_0 := v_0.Args[0]
9834 if v_0_0.Op != OpRsh16Ux64 {
9835 break
9836 }
9837 _ = v_0_0.Args[1]
9838 v_0_0_1 := v_0_0.Args[1]
9839 if v_0_0_1.Op != OpConst64 {
9840 break
9841 }
9842 c := auxIntToInt64(v_0_0_1.AuxInt)
9843 if v_1.Op != OpConst64 {
9844 break
9845 }
9846 d := auxIntToInt64(v_1.AuxInt)
9847 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
9848 break
9849 }
9850 v.reset(OpConstBool)
9851 v.AuxInt = boolToAuxInt(true)
9852 return true
9853 }
9854
9855
9856
9857 for {
9858 if v_0.Op != OpRsh16Ux64 {
9859 break
9860 }
9861 _ = v_0.Args[1]
9862 v_0_1 := v_0.Args[1]
9863 if v_0_1.Op != OpConst64 {
9864 break
9865 }
9866 c := auxIntToInt64(v_0_1.AuxInt)
9867 if v_1.Op != OpConst64 {
9868 break
9869 }
9870 d := auxIntToInt64(v_1.AuxInt)
9871 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
9872 break
9873 }
9874 v.reset(OpConstBool)
9875 v.AuxInt = boolToAuxInt(true)
9876 return true
9877 }
9878
9879
9880
9881 for {
9882 if v_0.Op != OpZeroExt32to64 {
9883 break
9884 }
9885 v_0_0 := v_0.Args[0]
9886 if v_0_0.Op != OpRsh32Ux64 {
9887 break
9888 }
9889 _ = v_0_0.Args[1]
9890 v_0_0_1 := v_0_0.Args[1]
9891 if v_0_0_1.Op != OpConst64 {
9892 break
9893 }
9894 c := auxIntToInt64(v_0_0_1.AuxInt)
9895 if v_1.Op != OpConst64 {
9896 break
9897 }
9898 d := auxIntToInt64(v_1.AuxInt)
9899 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) {
9900 break
9901 }
9902 v.reset(OpConstBool)
9903 v.AuxInt = boolToAuxInt(true)
9904 return true
9905 }
9906
9907
9908
9909 for {
9910 if v_0.Op != OpRsh32Ux64 {
9911 break
9912 }
9913 _ = v_0.Args[1]
9914 v_0_1 := v_0.Args[1]
9915 if v_0_1.Op != OpConst64 {
9916 break
9917 }
9918 c := auxIntToInt64(v_0_1.AuxInt)
9919 if v_1.Op != OpConst64 {
9920 break
9921 }
9922 d := auxIntToInt64(v_1.AuxInt)
9923 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) {
9924 break
9925 }
9926 v.reset(OpConstBool)
9927 v.AuxInt = boolToAuxInt(true)
9928 return true
9929 }
9930
9931
9932
9933 for {
9934 if v_0.Op != OpRsh64Ux64 {
9935 break
9936 }
9937 _ = v_0.Args[1]
9938 v_0_1 := v_0.Args[1]
9939 if v_0_1.Op != OpConst64 {
9940 break
9941 }
9942 c := auxIntToInt64(v_0_1.AuxInt)
9943 if v_1.Op != OpConst64 {
9944 break
9945 }
9946 d := auxIntToInt64(v_1.AuxInt)
9947 if !(0 < c && c < 64 && 1<<uint(64-c)-1 < d) {
9948 break
9949 }
9950 v.reset(OpConstBool)
9951 v.AuxInt = boolToAuxInt(true)
9952 return true
9953 }
9954 return false
9955 }
9956 func rewriteValuegeneric_OpIsNonNil(v *Value) bool {
9957 v_0 := v.Args[0]
9958
9959
9960 for {
9961 if v_0.Op != OpConstNil {
9962 break
9963 }
9964 v.reset(OpConstBool)
9965 v.AuxInt = boolToAuxInt(false)
9966 return true
9967 }
9968
9969
9970 for {
9971 if v_0.Op != OpConst32 {
9972 break
9973 }
9974 c := auxIntToInt32(v_0.AuxInt)
9975 v.reset(OpConstBool)
9976 v.AuxInt = boolToAuxInt(c != 0)
9977 return true
9978 }
9979
9980
9981 for {
9982 if v_0.Op != OpConst64 {
9983 break
9984 }
9985 c := auxIntToInt64(v_0.AuxInt)
9986 v.reset(OpConstBool)
9987 v.AuxInt = boolToAuxInt(c != 0)
9988 return true
9989 }
9990
9991
9992 for {
9993 if v_0.Op != OpAddr {
9994 break
9995 }
9996 v.reset(OpConstBool)
9997 v.AuxInt = boolToAuxInt(true)
9998 return true
9999 }
10000
10001
10002 for {
10003 if v_0.Op != OpConvert {
10004 break
10005 }
10006 v_0_0 := v_0.Args[0]
10007 if v_0_0.Op != OpAddr {
10008 break
10009 }
10010 v.reset(OpConstBool)
10011 v.AuxInt = boolToAuxInt(true)
10012 return true
10013 }
10014
10015
10016 for {
10017 if v_0.Op != OpLocalAddr {
10018 break
10019 }
10020 v.reset(OpConstBool)
10021 v.AuxInt = boolToAuxInt(true)
10022 return true
10023 }
10024 return false
10025 }
10026 func rewriteValuegeneric_OpIsSliceInBounds(v *Value) bool {
10027 v_1 := v.Args[1]
10028 v_0 := v.Args[0]
10029
10030
10031 for {
10032 x := v_0
10033 if x != v_1 {
10034 break
10035 }
10036 v.reset(OpConstBool)
10037 v.AuxInt = boolToAuxInt(true)
10038 return true
10039 }
10040
10041
10042
10043 for {
10044 if v_0.Op != OpAnd32 {
10045 break
10046 }
10047 v_0_0 := v_0.Args[0]
10048 v_0_1 := v_0.Args[1]
10049 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
10050 if v_0_0.Op != OpConst32 {
10051 continue
10052 }
10053 c := auxIntToInt32(v_0_0.AuxInt)
10054 if v_1.Op != OpConst32 {
10055 continue
10056 }
10057 d := auxIntToInt32(v_1.AuxInt)
10058 if !(0 <= c && c <= d) {
10059 continue
10060 }
10061 v.reset(OpConstBool)
10062 v.AuxInt = boolToAuxInt(true)
10063 return true
10064 }
10065 break
10066 }
10067
10068
10069
10070 for {
10071 if v_0.Op != OpAnd64 {
10072 break
10073 }
10074 v_0_0 := v_0.Args[0]
10075 v_0_1 := v_0.Args[1]
10076 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
10077 if v_0_0.Op != OpConst64 {
10078 continue
10079 }
10080 c := auxIntToInt64(v_0_0.AuxInt)
10081 if v_1.Op != OpConst64 {
10082 continue
10083 }
10084 d := auxIntToInt64(v_1.AuxInt)
10085 if !(0 <= c && c <= d) {
10086 continue
10087 }
10088 v.reset(OpConstBool)
10089 v.AuxInt = boolToAuxInt(true)
10090 return true
10091 }
10092 break
10093 }
10094
10095
10096 for {
10097 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
10098 break
10099 }
10100 v.reset(OpConstBool)
10101 v.AuxInt = boolToAuxInt(true)
10102 return true
10103 }
10104
10105
10106 for {
10107 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
10108 break
10109 }
10110 v.reset(OpConstBool)
10111 v.AuxInt = boolToAuxInt(true)
10112 return true
10113 }
10114
10115
10116 for {
10117 if v_0.Op != OpConst32 {
10118 break
10119 }
10120 c := auxIntToInt32(v_0.AuxInt)
10121 if v_1.Op != OpConst32 {
10122 break
10123 }
10124 d := auxIntToInt32(v_1.AuxInt)
10125 v.reset(OpConstBool)
10126 v.AuxInt = boolToAuxInt(0 <= c && c <= d)
10127 return true
10128 }
10129
10130
10131 for {
10132 if v_0.Op != OpConst64 {
10133 break
10134 }
10135 c := auxIntToInt64(v_0.AuxInt)
10136 if v_1.Op != OpConst64 {
10137 break
10138 }
10139 d := auxIntToInt64(v_1.AuxInt)
10140 v.reset(OpConstBool)
10141 v.AuxInt = boolToAuxInt(0 <= c && c <= d)
10142 return true
10143 }
10144
10145
10146 for {
10147 if v_0.Op != OpSliceLen {
10148 break
10149 }
10150 x := v_0.Args[0]
10151 if v_1.Op != OpSliceCap || x != v_1.Args[0] {
10152 break
10153 }
10154 v.reset(OpConstBool)
10155 v.AuxInt = boolToAuxInt(true)
10156 return true
10157 }
10158 return false
10159 }
10160 func rewriteValuegeneric_OpLeq16(v *Value) bool {
10161 v_1 := v.Args[1]
10162 v_0 := v.Args[0]
10163 b := v.Block
10164
10165
10166 for {
10167 if v_0.Op != OpConst16 {
10168 break
10169 }
10170 c := auxIntToInt16(v_0.AuxInt)
10171 if v_1.Op != OpConst16 {
10172 break
10173 }
10174 d := auxIntToInt16(v_1.AuxInt)
10175 v.reset(OpConstBool)
10176 v.AuxInt = boolToAuxInt(c <= d)
10177 return true
10178 }
10179
10180
10181
10182 for {
10183 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 || v_1.Op != OpAnd16 {
10184 break
10185 }
10186 _ = v_1.Args[1]
10187 v_1_0 := v_1.Args[0]
10188 v_1_1 := v_1.Args[1]
10189 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
10190 if v_1_1.Op != OpConst16 {
10191 continue
10192 }
10193 c := auxIntToInt16(v_1_1.AuxInt)
10194 if !(c >= 0) {
10195 continue
10196 }
10197 v.reset(OpConstBool)
10198 v.AuxInt = boolToAuxInt(true)
10199 return true
10200 }
10201 break
10202 }
10203
10204
10205
10206 for {
10207 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 || v_1.Op != OpRsh16Ux64 {
10208 break
10209 }
10210 _ = v_1.Args[1]
10211 v_1_1 := v_1.Args[1]
10212 if v_1_1.Op != OpConst64 {
10213 break
10214 }
10215 c := auxIntToInt64(v_1_1.AuxInt)
10216 if !(c > 0) {
10217 break
10218 }
10219 v.reset(OpConstBool)
10220 v.AuxInt = boolToAuxInt(true)
10221 return true
10222 }
10223
10224
10225 for {
10226 x := v_0
10227 if v_1.Op != OpConst16 {
10228 break
10229 }
10230 t := v_1.Type
10231 if auxIntToInt16(v_1.AuxInt) != -1 {
10232 break
10233 }
10234 v.reset(OpLess16)
10235 v0 := b.NewValue0(v.Pos, OpConst16, t)
10236 v0.AuxInt = int16ToAuxInt(0)
10237 v.AddArg2(x, v0)
10238 return true
10239 }
10240
10241
10242 for {
10243 if v_0.Op != OpConst16 {
10244 break
10245 }
10246 t := v_0.Type
10247 if auxIntToInt16(v_0.AuxInt) != 1 {
10248 break
10249 }
10250 x := v_1
10251 v.reset(OpLess16)
10252 v0 := b.NewValue0(v.Pos, OpConst16, t)
10253 v0.AuxInt = int16ToAuxInt(0)
10254 v.AddArg2(v0, x)
10255 return true
10256 }
10257
10258
10259 for {
10260 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != math.MinInt16 {
10261 break
10262 }
10263 v.reset(OpConstBool)
10264 v.AuxInt = boolToAuxInt(true)
10265 return true
10266 }
10267
10268
10269 for {
10270 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != math.MaxInt16 {
10271 break
10272 }
10273 v.reset(OpConstBool)
10274 v.AuxInt = boolToAuxInt(true)
10275 return true
10276 }
10277
10278
10279 for {
10280 x := v_0
10281 c := v_1
10282 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != math.MinInt16 {
10283 break
10284 }
10285 v.reset(OpEq16)
10286 v.AddArg2(x, c)
10287 return true
10288 }
10289
10290
10291 for {
10292 c := v_0
10293 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != math.MaxInt16 {
10294 break
10295 }
10296 x := v_1
10297 v.reset(OpEq16)
10298 v.AddArg2(x, c)
10299 return true
10300 }
10301 return false
10302 }
10303 func rewriteValuegeneric_OpLeq16U(v *Value) bool {
10304 v_1 := v.Args[1]
10305 v_0 := v.Args[0]
10306 b := v.Block
10307
10308
10309 for {
10310 if v_0.Op != OpConst16 {
10311 break
10312 }
10313 c := auxIntToInt16(v_0.AuxInt)
10314 if v_1.Op != OpConst16 {
10315 break
10316 }
10317 d := auxIntToInt16(v_1.AuxInt)
10318 v.reset(OpConstBool)
10319 v.AuxInt = boolToAuxInt(uint16(c) <= uint16(d))
10320 return true
10321 }
10322
10323
10324 for {
10325 if v_0.Op != OpConst16 {
10326 break
10327 }
10328 t := v_0.Type
10329 if auxIntToInt16(v_0.AuxInt) != 1 {
10330 break
10331 }
10332 x := v_1
10333 v.reset(OpNeq16)
10334 v0 := b.NewValue0(v.Pos, OpConst16, t)
10335 v0.AuxInt = int16ToAuxInt(0)
10336 v.AddArg2(v0, x)
10337 return true
10338 }
10339
10340
10341 for {
10342 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
10343 break
10344 }
10345 v.reset(OpConstBool)
10346 v.AuxInt = boolToAuxInt(true)
10347 return true
10348 }
10349
10350
10351 for {
10352 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != -1 {
10353 break
10354 }
10355 v.reset(OpConstBool)
10356 v.AuxInt = boolToAuxInt(true)
10357 return true
10358 }
10359
10360
10361 for {
10362 x := v_0
10363 c := v_1
10364 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != 0 {
10365 break
10366 }
10367 v.reset(OpEq16)
10368 v.AddArg2(x, c)
10369 return true
10370 }
10371
10372
10373 for {
10374 c := v_0
10375 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != -1 {
10376 break
10377 }
10378 x := v_1
10379 v.reset(OpEq16)
10380 v.AddArg2(x, c)
10381 return true
10382 }
10383 return false
10384 }
10385 func rewriteValuegeneric_OpLeq32(v *Value) bool {
10386 v_1 := v.Args[1]
10387 v_0 := v.Args[0]
10388 b := v.Block
10389
10390
10391 for {
10392 if v_0.Op != OpConst32 {
10393 break
10394 }
10395 c := auxIntToInt32(v_0.AuxInt)
10396 if v_1.Op != OpConst32 {
10397 break
10398 }
10399 d := auxIntToInt32(v_1.AuxInt)
10400 v.reset(OpConstBool)
10401 v.AuxInt = boolToAuxInt(c <= d)
10402 return true
10403 }
10404
10405
10406
10407 for {
10408 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 || v_1.Op != OpAnd32 {
10409 break
10410 }
10411 _ = v_1.Args[1]
10412 v_1_0 := v_1.Args[0]
10413 v_1_1 := v_1.Args[1]
10414 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
10415 if v_1_1.Op != OpConst32 {
10416 continue
10417 }
10418 c := auxIntToInt32(v_1_1.AuxInt)
10419 if !(c >= 0) {
10420 continue
10421 }
10422 v.reset(OpConstBool)
10423 v.AuxInt = boolToAuxInt(true)
10424 return true
10425 }
10426 break
10427 }
10428
10429
10430
10431 for {
10432 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 || v_1.Op != OpRsh32Ux64 {
10433 break
10434 }
10435 _ = v_1.Args[1]
10436 v_1_1 := v_1.Args[1]
10437 if v_1_1.Op != OpConst64 {
10438 break
10439 }
10440 c := auxIntToInt64(v_1_1.AuxInt)
10441 if !(c > 0) {
10442 break
10443 }
10444 v.reset(OpConstBool)
10445 v.AuxInt = boolToAuxInt(true)
10446 return true
10447 }
10448
10449
10450 for {
10451 x := v_0
10452 if v_1.Op != OpConst32 {
10453 break
10454 }
10455 t := v_1.Type
10456 if auxIntToInt32(v_1.AuxInt) != -1 {
10457 break
10458 }
10459 v.reset(OpLess32)
10460 v0 := b.NewValue0(v.Pos, OpConst32, t)
10461 v0.AuxInt = int32ToAuxInt(0)
10462 v.AddArg2(x, v0)
10463 return true
10464 }
10465
10466
10467 for {
10468 if v_0.Op != OpConst32 {
10469 break
10470 }
10471 t := v_0.Type
10472 if auxIntToInt32(v_0.AuxInt) != 1 {
10473 break
10474 }
10475 x := v_1
10476 v.reset(OpLess32)
10477 v0 := b.NewValue0(v.Pos, OpConst32, t)
10478 v0.AuxInt = int32ToAuxInt(0)
10479 v.AddArg2(v0, x)
10480 return true
10481 }
10482
10483
10484 for {
10485 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != math.MinInt32 {
10486 break
10487 }
10488 v.reset(OpConstBool)
10489 v.AuxInt = boolToAuxInt(true)
10490 return true
10491 }
10492
10493
10494 for {
10495 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != math.MaxInt32 {
10496 break
10497 }
10498 v.reset(OpConstBool)
10499 v.AuxInt = boolToAuxInt(true)
10500 return true
10501 }
10502
10503
10504 for {
10505 x := v_0
10506 c := v_1
10507 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != math.MinInt32 {
10508 break
10509 }
10510 v.reset(OpEq32)
10511 v.AddArg2(x, c)
10512 return true
10513 }
10514
10515
10516 for {
10517 c := v_0
10518 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != math.MaxInt32 {
10519 break
10520 }
10521 x := v_1
10522 v.reset(OpEq32)
10523 v.AddArg2(x, c)
10524 return true
10525 }
10526 return false
10527 }
10528 func rewriteValuegeneric_OpLeq32F(v *Value) bool {
10529 v_1 := v.Args[1]
10530 v_0 := v.Args[0]
10531
10532
10533 for {
10534 if v_0.Op != OpConst32F {
10535 break
10536 }
10537 c := auxIntToFloat32(v_0.AuxInt)
10538 if v_1.Op != OpConst32F {
10539 break
10540 }
10541 d := auxIntToFloat32(v_1.AuxInt)
10542 v.reset(OpConstBool)
10543 v.AuxInt = boolToAuxInt(c <= d)
10544 return true
10545 }
10546 return false
10547 }
10548 func rewriteValuegeneric_OpLeq32U(v *Value) bool {
10549 v_1 := v.Args[1]
10550 v_0 := v.Args[0]
10551 b := v.Block
10552
10553
10554 for {
10555 if v_0.Op != OpConst32 {
10556 break
10557 }
10558 c := auxIntToInt32(v_0.AuxInt)
10559 if v_1.Op != OpConst32 {
10560 break
10561 }
10562 d := auxIntToInt32(v_1.AuxInt)
10563 v.reset(OpConstBool)
10564 v.AuxInt = boolToAuxInt(uint32(c) <= uint32(d))
10565 return true
10566 }
10567
10568
10569 for {
10570 if v_0.Op != OpConst32 {
10571 break
10572 }
10573 t := v_0.Type
10574 if auxIntToInt32(v_0.AuxInt) != 1 {
10575 break
10576 }
10577 x := v_1
10578 v.reset(OpNeq32)
10579 v0 := b.NewValue0(v.Pos, OpConst32, t)
10580 v0.AuxInt = int32ToAuxInt(0)
10581 v.AddArg2(v0, x)
10582 return true
10583 }
10584
10585
10586 for {
10587 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
10588 break
10589 }
10590 v.reset(OpConstBool)
10591 v.AuxInt = boolToAuxInt(true)
10592 return true
10593 }
10594
10595
10596 for {
10597 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != -1 {
10598 break
10599 }
10600 v.reset(OpConstBool)
10601 v.AuxInt = boolToAuxInt(true)
10602 return true
10603 }
10604
10605
10606 for {
10607 x := v_0
10608 c := v_1
10609 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != 0 {
10610 break
10611 }
10612 v.reset(OpEq32)
10613 v.AddArg2(x, c)
10614 return true
10615 }
10616
10617
10618 for {
10619 c := v_0
10620 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != -1 {
10621 break
10622 }
10623 x := v_1
10624 v.reset(OpEq32)
10625 v.AddArg2(x, c)
10626 return true
10627 }
10628 return false
10629 }
10630 func rewriteValuegeneric_OpLeq64(v *Value) bool {
10631 v_1 := v.Args[1]
10632 v_0 := v.Args[0]
10633 b := v.Block
10634
10635
10636 for {
10637 if v_0.Op != OpConst64 {
10638 break
10639 }
10640 c := auxIntToInt64(v_0.AuxInt)
10641 if v_1.Op != OpConst64 {
10642 break
10643 }
10644 d := auxIntToInt64(v_1.AuxInt)
10645 v.reset(OpConstBool)
10646 v.AuxInt = boolToAuxInt(c <= d)
10647 return true
10648 }
10649
10650
10651
10652 for {
10653 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 || v_1.Op != OpAnd64 {
10654 break
10655 }
10656 _ = v_1.Args[1]
10657 v_1_0 := v_1.Args[0]
10658 v_1_1 := v_1.Args[1]
10659 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
10660 if v_1_1.Op != OpConst64 {
10661 continue
10662 }
10663 c := auxIntToInt64(v_1_1.AuxInt)
10664 if !(c >= 0) {
10665 continue
10666 }
10667 v.reset(OpConstBool)
10668 v.AuxInt = boolToAuxInt(true)
10669 return true
10670 }
10671 break
10672 }
10673
10674
10675
10676 for {
10677 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 || v_1.Op != OpRsh64Ux64 {
10678 break
10679 }
10680 _ = v_1.Args[1]
10681 v_1_1 := v_1.Args[1]
10682 if v_1_1.Op != OpConst64 {
10683 break
10684 }
10685 c := auxIntToInt64(v_1_1.AuxInt)
10686 if !(c > 0) {
10687 break
10688 }
10689 v.reset(OpConstBool)
10690 v.AuxInt = boolToAuxInt(true)
10691 return true
10692 }
10693
10694
10695 for {
10696 x := v_0
10697 if v_1.Op != OpConst64 {
10698 break
10699 }
10700 t := v_1.Type
10701 if auxIntToInt64(v_1.AuxInt) != -1 {
10702 break
10703 }
10704 v.reset(OpLess64)
10705 v0 := b.NewValue0(v.Pos, OpConst64, t)
10706 v0.AuxInt = int64ToAuxInt(0)
10707 v.AddArg2(x, v0)
10708 return true
10709 }
10710
10711
10712 for {
10713 if v_0.Op != OpConst64 {
10714 break
10715 }
10716 t := v_0.Type
10717 if auxIntToInt64(v_0.AuxInt) != 1 {
10718 break
10719 }
10720 x := v_1
10721 v.reset(OpLess64)
10722 v0 := b.NewValue0(v.Pos, OpConst64, t)
10723 v0.AuxInt = int64ToAuxInt(0)
10724 v.AddArg2(v0, x)
10725 return true
10726 }
10727
10728
10729 for {
10730 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != math.MinInt64 {
10731 break
10732 }
10733 v.reset(OpConstBool)
10734 v.AuxInt = boolToAuxInt(true)
10735 return true
10736 }
10737
10738
10739 for {
10740 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != math.MaxInt64 {
10741 break
10742 }
10743 v.reset(OpConstBool)
10744 v.AuxInt = boolToAuxInt(true)
10745 return true
10746 }
10747
10748
10749 for {
10750 x := v_0
10751 c := v_1
10752 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != math.MinInt64 {
10753 break
10754 }
10755 v.reset(OpEq64)
10756 v.AddArg2(x, c)
10757 return true
10758 }
10759
10760
10761 for {
10762 c := v_0
10763 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != math.MaxInt64 {
10764 break
10765 }
10766 x := v_1
10767 v.reset(OpEq64)
10768 v.AddArg2(x, c)
10769 return true
10770 }
10771 return false
10772 }
10773 func rewriteValuegeneric_OpLeq64F(v *Value) bool {
10774 v_1 := v.Args[1]
10775 v_0 := v.Args[0]
10776
10777
10778 for {
10779 if v_0.Op != OpConst64F {
10780 break
10781 }
10782 c := auxIntToFloat64(v_0.AuxInt)
10783 if v_1.Op != OpConst64F {
10784 break
10785 }
10786 d := auxIntToFloat64(v_1.AuxInt)
10787 v.reset(OpConstBool)
10788 v.AuxInt = boolToAuxInt(c <= d)
10789 return true
10790 }
10791 return false
10792 }
10793 func rewriteValuegeneric_OpLeq64U(v *Value) bool {
10794 v_1 := v.Args[1]
10795 v_0 := v.Args[0]
10796 b := v.Block
10797
10798
10799 for {
10800 if v_0.Op != OpConst64 {
10801 break
10802 }
10803 c := auxIntToInt64(v_0.AuxInt)
10804 if v_1.Op != OpConst64 {
10805 break
10806 }
10807 d := auxIntToInt64(v_1.AuxInt)
10808 v.reset(OpConstBool)
10809 v.AuxInt = boolToAuxInt(uint64(c) <= uint64(d))
10810 return true
10811 }
10812
10813
10814 for {
10815 if v_0.Op != OpConst64 {
10816 break
10817 }
10818 t := v_0.Type
10819 if auxIntToInt64(v_0.AuxInt) != 1 {
10820 break
10821 }
10822 x := v_1
10823 v.reset(OpNeq64)
10824 v0 := b.NewValue0(v.Pos, OpConst64, t)
10825 v0.AuxInt = int64ToAuxInt(0)
10826 v.AddArg2(v0, x)
10827 return true
10828 }
10829
10830
10831 for {
10832 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
10833 break
10834 }
10835 v.reset(OpConstBool)
10836 v.AuxInt = boolToAuxInt(true)
10837 return true
10838 }
10839
10840
10841 for {
10842 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1 {
10843 break
10844 }
10845 v.reset(OpConstBool)
10846 v.AuxInt = boolToAuxInt(true)
10847 return true
10848 }
10849
10850
10851 for {
10852 x := v_0
10853 c := v_1
10854 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != 0 {
10855 break
10856 }
10857 v.reset(OpEq64)
10858 v.AddArg2(x, c)
10859 return true
10860 }
10861
10862
10863 for {
10864 c := v_0
10865 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != -1 {
10866 break
10867 }
10868 x := v_1
10869 v.reset(OpEq64)
10870 v.AddArg2(x, c)
10871 return true
10872 }
10873 return false
10874 }
10875 func rewriteValuegeneric_OpLeq8(v *Value) bool {
10876 v_1 := v.Args[1]
10877 v_0 := v.Args[0]
10878 b := v.Block
10879
10880
10881 for {
10882 if v_0.Op != OpConst8 {
10883 break
10884 }
10885 c := auxIntToInt8(v_0.AuxInt)
10886 if v_1.Op != OpConst8 {
10887 break
10888 }
10889 d := auxIntToInt8(v_1.AuxInt)
10890 v.reset(OpConstBool)
10891 v.AuxInt = boolToAuxInt(c <= d)
10892 return true
10893 }
10894
10895
10896
10897 for {
10898 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 || v_1.Op != OpAnd8 {
10899 break
10900 }
10901 _ = v_1.Args[1]
10902 v_1_0 := v_1.Args[0]
10903 v_1_1 := v_1.Args[1]
10904 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
10905 if v_1_1.Op != OpConst8 {
10906 continue
10907 }
10908 c := auxIntToInt8(v_1_1.AuxInt)
10909 if !(c >= 0) {
10910 continue
10911 }
10912 v.reset(OpConstBool)
10913 v.AuxInt = boolToAuxInt(true)
10914 return true
10915 }
10916 break
10917 }
10918
10919
10920
10921 for {
10922 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 || v_1.Op != OpRsh8Ux64 {
10923 break
10924 }
10925 _ = v_1.Args[1]
10926 v_1_1 := v_1.Args[1]
10927 if v_1_1.Op != OpConst64 {
10928 break
10929 }
10930 c := auxIntToInt64(v_1_1.AuxInt)
10931 if !(c > 0) {
10932 break
10933 }
10934 v.reset(OpConstBool)
10935 v.AuxInt = boolToAuxInt(true)
10936 return true
10937 }
10938
10939
10940 for {
10941 x := v_0
10942 if v_1.Op != OpConst8 {
10943 break
10944 }
10945 t := v_1.Type
10946 if auxIntToInt8(v_1.AuxInt) != -1 {
10947 break
10948 }
10949 v.reset(OpLess8)
10950 v0 := b.NewValue0(v.Pos, OpConst8, t)
10951 v0.AuxInt = int8ToAuxInt(0)
10952 v.AddArg2(x, v0)
10953 return true
10954 }
10955
10956
10957 for {
10958 if v_0.Op != OpConst8 {
10959 break
10960 }
10961 t := v_0.Type
10962 if auxIntToInt8(v_0.AuxInt) != 1 {
10963 break
10964 }
10965 x := v_1
10966 v.reset(OpLess8)
10967 v0 := b.NewValue0(v.Pos, OpConst8, t)
10968 v0.AuxInt = int8ToAuxInt(0)
10969 v.AddArg2(v0, x)
10970 return true
10971 }
10972
10973
10974 for {
10975 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != math.MinInt8 {
10976 break
10977 }
10978 v.reset(OpConstBool)
10979 v.AuxInt = boolToAuxInt(true)
10980 return true
10981 }
10982
10983
10984 for {
10985 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != math.MaxInt8 {
10986 break
10987 }
10988 v.reset(OpConstBool)
10989 v.AuxInt = boolToAuxInt(true)
10990 return true
10991 }
10992
10993
10994 for {
10995 x := v_0
10996 c := v_1
10997 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != math.MinInt8 {
10998 break
10999 }
11000 v.reset(OpEq8)
11001 v.AddArg2(x, c)
11002 return true
11003 }
11004
11005
11006 for {
11007 c := v_0
11008 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != math.MaxInt8 {
11009 break
11010 }
11011 x := v_1
11012 v.reset(OpEq8)
11013 v.AddArg2(x, c)
11014 return true
11015 }
11016 return false
11017 }
11018 func rewriteValuegeneric_OpLeq8U(v *Value) bool {
11019 v_1 := v.Args[1]
11020 v_0 := v.Args[0]
11021 b := v.Block
11022
11023
11024 for {
11025 if v_0.Op != OpConst8 {
11026 break
11027 }
11028 c := auxIntToInt8(v_0.AuxInt)
11029 if v_1.Op != OpConst8 {
11030 break
11031 }
11032 d := auxIntToInt8(v_1.AuxInt)
11033 v.reset(OpConstBool)
11034 v.AuxInt = boolToAuxInt(uint8(c) <= uint8(d))
11035 return true
11036 }
11037
11038
11039 for {
11040 if v_0.Op != OpConst8 {
11041 break
11042 }
11043 t := v_0.Type
11044 if auxIntToInt8(v_0.AuxInt) != 1 {
11045 break
11046 }
11047 x := v_1
11048 v.reset(OpNeq8)
11049 v0 := b.NewValue0(v.Pos, OpConst8, t)
11050 v0.AuxInt = int8ToAuxInt(0)
11051 v.AddArg2(v0, x)
11052 return true
11053 }
11054
11055
11056 for {
11057 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
11058 break
11059 }
11060 v.reset(OpConstBool)
11061 v.AuxInt = boolToAuxInt(true)
11062 return true
11063 }
11064
11065
11066 for {
11067 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != -1 {
11068 break
11069 }
11070 v.reset(OpConstBool)
11071 v.AuxInt = boolToAuxInt(true)
11072 return true
11073 }
11074
11075
11076 for {
11077 x := v_0
11078 c := v_1
11079 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != 0 {
11080 break
11081 }
11082 v.reset(OpEq8)
11083 v.AddArg2(x, c)
11084 return true
11085 }
11086
11087
11088 for {
11089 c := v_0
11090 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != -1 {
11091 break
11092 }
11093 x := v_1
11094 v.reset(OpEq8)
11095 v.AddArg2(x, c)
11096 return true
11097 }
11098 return false
11099 }
11100 func rewriteValuegeneric_OpLess16(v *Value) bool {
11101 v_1 := v.Args[1]
11102 v_0 := v.Args[0]
11103 b := v.Block
11104
11105
11106 for {
11107 if v_0.Op != OpConst16 {
11108 break
11109 }
11110 c := auxIntToInt16(v_0.AuxInt)
11111 if v_1.Op != OpConst16 {
11112 break
11113 }
11114 d := auxIntToInt16(v_1.AuxInt)
11115 v.reset(OpConstBool)
11116 v.AuxInt = boolToAuxInt(c < d)
11117 return true
11118 }
11119
11120
11121
11122 for {
11123 if v_0.Op != OpConst16 {
11124 break
11125 }
11126 t := v_0.Type
11127 if auxIntToInt16(v_0.AuxInt) != 0 {
11128 break
11129 }
11130 x := v_1
11131 if !(isNonNegative(x)) {
11132 break
11133 }
11134 v.reset(OpNeq16)
11135 v0 := b.NewValue0(v.Pos, OpConst16, t)
11136 v0.AuxInt = int16ToAuxInt(0)
11137 v.AddArg2(v0, x)
11138 return true
11139 }
11140
11141
11142
11143 for {
11144 x := v_0
11145 if v_1.Op != OpConst16 {
11146 break
11147 }
11148 t := v_1.Type
11149 if auxIntToInt16(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
11150 break
11151 }
11152 v.reset(OpEq16)
11153 v0 := b.NewValue0(v.Pos, OpConst16, t)
11154 v0.AuxInt = int16ToAuxInt(0)
11155 v.AddArg2(v0, x)
11156 return true
11157 }
11158
11159
11160 for {
11161 x := v_0
11162 if v_1.Op != OpConst16 {
11163 break
11164 }
11165 t := v_1.Type
11166 if auxIntToInt16(v_1.AuxInt) != 1 {
11167 break
11168 }
11169 v.reset(OpLeq16)
11170 v0 := b.NewValue0(v.Pos, OpConst16, t)
11171 v0.AuxInt = int16ToAuxInt(0)
11172 v.AddArg2(x, v0)
11173 return true
11174 }
11175
11176
11177 for {
11178 if v_0.Op != OpConst16 {
11179 break
11180 }
11181 t := v_0.Type
11182 if auxIntToInt16(v_0.AuxInt) != -1 {
11183 break
11184 }
11185 x := v_1
11186 v.reset(OpLeq16)
11187 v0 := b.NewValue0(v.Pos, OpConst16, t)
11188 v0.AuxInt = int16ToAuxInt(0)
11189 v.AddArg2(v0, x)
11190 return true
11191 }
11192
11193
11194 for {
11195 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != math.MinInt16 {
11196 break
11197 }
11198 v.reset(OpConstBool)
11199 v.AuxInt = boolToAuxInt(false)
11200 return true
11201 }
11202
11203
11204 for {
11205 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != math.MaxInt16 {
11206 break
11207 }
11208 v.reset(OpConstBool)
11209 v.AuxInt = boolToAuxInt(false)
11210 return true
11211 }
11212
11213
11214 for {
11215 x := v_0
11216 if v_1.Op != OpConst16 {
11217 break
11218 }
11219 t := v_1.Type
11220 if auxIntToInt16(v_1.AuxInt) != math.MinInt16+1 {
11221 break
11222 }
11223 v.reset(OpEq16)
11224 v0 := b.NewValue0(v.Pos, OpConst16, t)
11225 v0.AuxInt = int16ToAuxInt(math.MinInt16)
11226 v.AddArg2(x, v0)
11227 return true
11228 }
11229
11230
11231 for {
11232 if v_0.Op != OpConst16 {
11233 break
11234 }
11235 t := v_0.Type
11236 if auxIntToInt16(v_0.AuxInt) != math.MaxInt16-1 {
11237 break
11238 }
11239 x := v_1
11240 v.reset(OpEq16)
11241 v0 := b.NewValue0(v.Pos, OpConst16, t)
11242 v0.AuxInt = int16ToAuxInt(math.MaxInt16)
11243 v.AddArg2(x, v0)
11244 return true
11245 }
11246 return false
11247 }
11248 func rewriteValuegeneric_OpLess16U(v *Value) bool {
11249 v_1 := v.Args[1]
11250 v_0 := v.Args[0]
11251 b := v.Block
11252
11253
11254 for {
11255 if v_0.Op != OpConst16 {
11256 break
11257 }
11258 c := auxIntToInt16(v_0.AuxInt)
11259 if v_1.Op != OpConst16 {
11260 break
11261 }
11262 d := auxIntToInt16(v_1.AuxInt)
11263 v.reset(OpConstBool)
11264 v.AuxInt = boolToAuxInt(uint16(c) < uint16(d))
11265 return true
11266 }
11267
11268
11269 for {
11270 x := v_0
11271 if v_1.Op != OpConst16 {
11272 break
11273 }
11274 t := v_1.Type
11275 if auxIntToInt16(v_1.AuxInt) != 1 {
11276 break
11277 }
11278 v.reset(OpEq16)
11279 v0 := b.NewValue0(v.Pos, OpConst16, t)
11280 v0.AuxInt = int16ToAuxInt(0)
11281 v.AddArg2(v0, x)
11282 return true
11283 }
11284
11285
11286 for {
11287 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
11288 break
11289 }
11290 v.reset(OpConstBool)
11291 v.AuxInt = boolToAuxInt(false)
11292 return true
11293 }
11294
11295
11296 for {
11297 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
11298 break
11299 }
11300 v.reset(OpConstBool)
11301 v.AuxInt = boolToAuxInt(false)
11302 return true
11303 }
11304
11305
11306 for {
11307 x := v_0
11308 if v_1.Op != OpConst16 {
11309 break
11310 }
11311 t := v_1.Type
11312 if auxIntToInt16(v_1.AuxInt) != 1 {
11313 break
11314 }
11315 v.reset(OpEq16)
11316 v0 := b.NewValue0(v.Pos, OpConst16, t)
11317 v0.AuxInt = int16ToAuxInt(0)
11318 v.AddArg2(x, v0)
11319 return true
11320 }
11321
11322
11323 for {
11324 if v_0.Op != OpConst16 {
11325 break
11326 }
11327 t := v_0.Type
11328 if auxIntToInt16(v_0.AuxInt) != -2 {
11329 break
11330 }
11331 x := v_1
11332 v.reset(OpEq16)
11333 v0 := b.NewValue0(v.Pos, OpConst16, t)
11334 v0.AuxInt = int16ToAuxInt(-1)
11335 v.AddArg2(x, v0)
11336 return true
11337 }
11338 return false
11339 }
11340 func rewriteValuegeneric_OpLess32(v *Value) bool {
11341 v_1 := v.Args[1]
11342 v_0 := v.Args[0]
11343 b := v.Block
11344
11345
11346 for {
11347 if v_0.Op != OpConst32 {
11348 break
11349 }
11350 c := auxIntToInt32(v_0.AuxInt)
11351 if v_1.Op != OpConst32 {
11352 break
11353 }
11354 d := auxIntToInt32(v_1.AuxInt)
11355 v.reset(OpConstBool)
11356 v.AuxInt = boolToAuxInt(c < d)
11357 return true
11358 }
11359
11360
11361
11362 for {
11363 if v_0.Op != OpConst32 {
11364 break
11365 }
11366 t := v_0.Type
11367 if auxIntToInt32(v_0.AuxInt) != 0 {
11368 break
11369 }
11370 x := v_1
11371 if !(isNonNegative(x)) {
11372 break
11373 }
11374 v.reset(OpNeq32)
11375 v0 := b.NewValue0(v.Pos, OpConst32, t)
11376 v0.AuxInt = int32ToAuxInt(0)
11377 v.AddArg2(v0, x)
11378 return true
11379 }
11380
11381
11382
11383 for {
11384 x := v_0
11385 if v_1.Op != OpConst32 {
11386 break
11387 }
11388 t := v_1.Type
11389 if auxIntToInt32(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
11390 break
11391 }
11392 v.reset(OpEq32)
11393 v0 := b.NewValue0(v.Pos, OpConst32, t)
11394 v0.AuxInt = int32ToAuxInt(0)
11395 v.AddArg2(v0, x)
11396 return true
11397 }
11398
11399
11400 for {
11401 x := v_0
11402 if v_1.Op != OpConst32 {
11403 break
11404 }
11405 t := v_1.Type
11406 if auxIntToInt32(v_1.AuxInt) != 1 {
11407 break
11408 }
11409 v.reset(OpLeq32)
11410 v0 := b.NewValue0(v.Pos, OpConst32, t)
11411 v0.AuxInt = int32ToAuxInt(0)
11412 v.AddArg2(x, v0)
11413 return true
11414 }
11415
11416
11417 for {
11418 if v_0.Op != OpConst32 {
11419 break
11420 }
11421 t := v_0.Type
11422 if auxIntToInt32(v_0.AuxInt) != -1 {
11423 break
11424 }
11425 x := v_1
11426 v.reset(OpLeq32)
11427 v0 := b.NewValue0(v.Pos, OpConst32, t)
11428 v0.AuxInt = int32ToAuxInt(0)
11429 v.AddArg2(v0, x)
11430 return true
11431 }
11432
11433
11434 for {
11435 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != math.MinInt32 {
11436 break
11437 }
11438 v.reset(OpConstBool)
11439 v.AuxInt = boolToAuxInt(false)
11440 return true
11441 }
11442
11443
11444 for {
11445 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != math.MaxInt32 {
11446 break
11447 }
11448 v.reset(OpConstBool)
11449 v.AuxInt = boolToAuxInt(false)
11450 return true
11451 }
11452
11453
11454 for {
11455 x := v_0
11456 if v_1.Op != OpConst32 {
11457 break
11458 }
11459 t := v_1.Type
11460 if auxIntToInt32(v_1.AuxInt) != math.MinInt32+1 {
11461 break
11462 }
11463 v.reset(OpEq32)
11464 v0 := b.NewValue0(v.Pos, OpConst32, t)
11465 v0.AuxInt = int32ToAuxInt(math.MinInt32)
11466 v.AddArg2(x, v0)
11467 return true
11468 }
11469
11470
11471 for {
11472 if v_0.Op != OpConst32 {
11473 break
11474 }
11475 t := v_0.Type
11476 if auxIntToInt32(v_0.AuxInt) != math.MaxInt32-1 {
11477 break
11478 }
11479 x := v_1
11480 v.reset(OpEq32)
11481 v0 := b.NewValue0(v.Pos, OpConst32, t)
11482 v0.AuxInt = int32ToAuxInt(math.MaxInt32)
11483 v.AddArg2(x, v0)
11484 return true
11485 }
11486 return false
11487 }
11488 func rewriteValuegeneric_OpLess32F(v *Value) bool {
11489 v_1 := v.Args[1]
11490 v_0 := v.Args[0]
11491
11492
11493 for {
11494 if v_0.Op != OpConst32F {
11495 break
11496 }
11497 c := auxIntToFloat32(v_0.AuxInt)
11498 if v_1.Op != OpConst32F {
11499 break
11500 }
11501 d := auxIntToFloat32(v_1.AuxInt)
11502 v.reset(OpConstBool)
11503 v.AuxInt = boolToAuxInt(c < d)
11504 return true
11505 }
11506 return false
11507 }
11508 func rewriteValuegeneric_OpLess32U(v *Value) bool {
11509 v_1 := v.Args[1]
11510 v_0 := v.Args[0]
11511 b := v.Block
11512
11513
11514 for {
11515 if v_0.Op != OpConst32 {
11516 break
11517 }
11518 c := auxIntToInt32(v_0.AuxInt)
11519 if v_1.Op != OpConst32 {
11520 break
11521 }
11522 d := auxIntToInt32(v_1.AuxInt)
11523 v.reset(OpConstBool)
11524 v.AuxInt = boolToAuxInt(uint32(c) < uint32(d))
11525 return true
11526 }
11527
11528
11529 for {
11530 x := v_0
11531 if v_1.Op != OpConst32 {
11532 break
11533 }
11534 t := v_1.Type
11535 if auxIntToInt32(v_1.AuxInt) != 1 {
11536 break
11537 }
11538 v.reset(OpEq32)
11539 v0 := b.NewValue0(v.Pos, OpConst32, t)
11540 v0.AuxInt = int32ToAuxInt(0)
11541 v.AddArg2(v0, x)
11542 return true
11543 }
11544
11545
11546 for {
11547 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
11548 break
11549 }
11550 v.reset(OpConstBool)
11551 v.AuxInt = boolToAuxInt(false)
11552 return true
11553 }
11554
11555
11556 for {
11557 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
11558 break
11559 }
11560 v.reset(OpConstBool)
11561 v.AuxInt = boolToAuxInt(false)
11562 return true
11563 }
11564
11565
11566 for {
11567 x := v_0
11568 if v_1.Op != OpConst32 {
11569 break
11570 }
11571 t := v_1.Type
11572 if auxIntToInt32(v_1.AuxInt) != 1 {
11573 break
11574 }
11575 v.reset(OpEq32)
11576 v0 := b.NewValue0(v.Pos, OpConst32, t)
11577 v0.AuxInt = int32ToAuxInt(0)
11578 v.AddArg2(x, v0)
11579 return true
11580 }
11581
11582
11583 for {
11584 if v_0.Op != OpConst32 {
11585 break
11586 }
11587 t := v_0.Type
11588 if auxIntToInt32(v_0.AuxInt) != -2 {
11589 break
11590 }
11591 x := v_1
11592 v.reset(OpEq32)
11593 v0 := b.NewValue0(v.Pos, OpConst32, t)
11594 v0.AuxInt = int32ToAuxInt(-1)
11595 v.AddArg2(x, v0)
11596 return true
11597 }
11598 return false
11599 }
11600 func rewriteValuegeneric_OpLess64(v *Value) bool {
11601 v_1 := v.Args[1]
11602 v_0 := v.Args[0]
11603 b := v.Block
11604
11605
11606 for {
11607 if v_0.Op != OpConst64 {
11608 break
11609 }
11610 c := auxIntToInt64(v_0.AuxInt)
11611 if v_1.Op != OpConst64 {
11612 break
11613 }
11614 d := auxIntToInt64(v_1.AuxInt)
11615 v.reset(OpConstBool)
11616 v.AuxInt = boolToAuxInt(c < d)
11617 return true
11618 }
11619
11620
11621
11622 for {
11623 if v_0.Op != OpConst64 {
11624 break
11625 }
11626 t := v_0.Type
11627 if auxIntToInt64(v_0.AuxInt) != 0 {
11628 break
11629 }
11630 x := v_1
11631 if !(isNonNegative(x)) {
11632 break
11633 }
11634 v.reset(OpNeq64)
11635 v0 := b.NewValue0(v.Pos, OpConst64, t)
11636 v0.AuxInt = int64ToAuxInt(0)
11637 v.AddArg2(v0, x)
11638 return true
11639 }
11640
11641
11642
11643 for {
11644 x := v_0
11645 if v_1.Op != OpConst64 {
11646 break
11647 }
11648 t := v_1.Type
11649 if auxIntToInt64(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
11650 break
11651 }
11652 v.reset(OpEq64)
11653 v0 := b.NewValue0(v.Pos, OpConst64, t)
11654 v0.AuxInt = int64ToAuxInt(0)
11655 v.AddArg2(v0, x)
11656 return true
11657 }
11658
11659
11660 for {
11661 x := v_0
11662 if v_1.Op != OpConst64 {
11663 break
11664 }
11665 t := v_1.Type
11666 if auxIntToInt64(v_1.AuxInt) != 1 {
11667 break
11668 }
11669 v.reset(OpLeq64)
11670 v0 := b.NewValue0(v.Pos, OpConst64, t)
11671 v0.AuxInt = int64ToAuxInt(0)
11672 v.AddArg2(x, v0)
11673 return true
11674 }
11675
11676
11677 for {
11678 if v_0.Op != OpConst64 {
11679 break
11680 }
11681 t := v_0.Type
11682 if auxIntToInt64(v_0.AuxInt) != -1 {
11683 break
11684 }
11685 x := v_1
11686 v.reset(OpLeq64)
11687 v0 := b.NewValue0(v.Pos, OpConst64, t)
11688 v0.AuxInt = int64ToAuxInt(0)
11689 v.AddArg2(v0, x)
11690 return true
11691 }
11692
11693
11694 for {
11695 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != math.MinInt64 {
11696 break
11697 }
11698 v.reset(OpConstBool)
11699 v.AuxInt = boolToAuxInt(false)
11700 return true
11701 }
11702
11703
11704 for {
11705 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != math.MaxInt64 {
11706 break
11707 }
11708 v.reset(OpConstBool)
11709 v.AuxInt = boolToAuxInt(false)
11710 return true
11711 }
11712
11713
11714 for {
11715 x := v_0
11716 if v_1.Op != OpConst64 {
11717 break
11718 }
11719 t := v_1.Type
11720 if auxIntToInt64(v_1.AuxInt) != math.MinInt64+1 {
11721 break
11722 }
11723 v.reset(OpEq64)
11724 v0 := b.NewValue0(v.Pos, OpConst64, t)
11725 v0.AuxInt = int64ToAuxInt(math.MinInt64)
11726 v.AddArg2(x, v0)
11727 return true
11728 }
11729
11730
11731 for {
11732 if v_0.Op != OpConst64 {
11733 break
11734 }
11735 t := v_0.Type
11736 if auxIntToInt64(v_0.AuxInt) != math.MaxInt64-1 {
11737 break
11738 }
11739 x := v_1
11740 v.reset(OpEq64)
11741 v0 := b.NewValue0(v.Pos, OpConst64, t)
11742 v0.AuxInt = int64ToAuxInt(math.MaxInt64)
11743 v.AddArg2(x, v0)
11744 return true
11745 }
11746 return false
11747 }
11748 func rewriteValuegeneric_OpLess64F(v *Value) bool {
11749 v_1 := v.Args[1]
11750 v_0 := v.Args[0]
11751
11752
11753 for {
11754 if v_0.Op != OpConst64F {
11755 break
11756 }
11757 c := auxIntToFloat64(v_0.AuxInt)
11758 if v_1.Op != OpConst64F {
11759 break
11760 }
11761 d := auxIntToFloat64(v_1.AuxInt)
11762 v.reset(OpConstBool)
11763 v.AuxInt = boolToAuxInt(c < d)
11764 return true
11765 }
11766 return false
11767 }
11768 func rewriteValuegeneric_OpLess64U(v *Value) bool {
11769 v_1 := v.Args[1]
11770 v_0 := v.Args[0]
11771 b := v.Block
11772
11773
11774 for {
11775 if v_0.Op != OpConst64 {
11776 break
11777 }
11778 c := auxIntToInt64(v_0.AuxInt)
11779 if v_1.Op != OpConst64 {
11780 break
11781 }
11782 d := auxIntToInt64(v_1.AuxInt)
11783 v.reset(OpConstBool)
11784 v.AuxInt = boolToAuxInt(uint64(c) < uint64(d))
11785 return true
11786 }
11787
11788
11789 for {
11790 x := v_0
11791 if v_1.Op != OpConst64 {
11792 break
11793 }
11794 t := v_1.Type
11795 if auxIntToInt64(v_1.AuxInt) != 1 {
11796 break
11797 }
11798 v.reset(OpEq64)
11799 v0 := b.NewValue0(v.Pos, OpConst64, t)
11800 v0.AuxInt = int64ToAuxInt(0)
11801 v.AddArg2(v0, x)
11802 return true
11803 }
11804
11805
11806 for {
11807 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
11808 break
11809 }
11810 v.reset(OpConstBool)
11811 v.AuxInt = boolToAuxInt(false)
11812 return true
11813 }
11814
11815
11816 for {
11817 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
11818 break
11819 }
11820 v.reset(OpConstBool)
11821 v.AuxInt = boolToAuxInt(false)
11822 return true
11823 }
11824
11825
11826 for {
11827 x := v_0
11828 if v_1.Op != OpConst64 {
11829 break
11830 }
11831 t := v_1.Type
11832 if auxIntToInt64(v_1.AuxInt) != 1 {
11833 break
11834 }
11835 v.reset(OpEq64)
11836 v0 := b.NewValue0(v.Pos, OpConst64, t)
11837 v0.AuxInt = int64ToAuxInt(0)
11838 v.AddArg2(x, v0)
11839 return true
11840 }
11841
11842
11843 for {
11844 if v_0.Op != OpConst64 {
11845 break
11846 }
11847 t := v_0.Type
11848 if auxIntToInt64(v_0.AuxInt) != -2 {
11849 break
11850 }
11851 x := v_1
11852 v.reset(OpEq64)
11853 v0 := b.NewValue0(v.Pos, OpConst64, t)
11854 v0.AuxInt = int64ToAuxInt(-1)
11855 v.AddArg2(x, v0)
11856 return true
11857 }
11858 return false
11859 }
11860 func rewriteValuegeneric_OpLess8(v *Value) bool {
11861 v_1 := v.Args[1]
11862 v_0 := v.Args[0]
11863 b := v.Block
11864
11865
11866 for {
11867 if v_0.Op != OpConst8 {
11868 break
11869 }
11870 c := auxIntToInt8(v_0.AuxInt)
11871 if v_1.Op != OpConst8 {
11872 break
11873 }
11874 d := auxIntToInt8(v_1.AuxInt)
11875 v.reset(OpConstBool)
11876 v.AuxInt = boolToAuxInt(c < d)
11877 return true
11878 }
11879
11880
11881
11882 for {
11883 if v_0.Op != OpConst8 {
11884 break
11885 }
11886 t := v_0.Type
11887 if auxIntToInt8(v_0.AuxInt) != 0 {
11888 break
11889 }
11890 x := v_1
11891 if !(isNonNegative(x)) {
11892 break
11893 }
11894 v.reset(OpNeq8)
11895 v0 := b.NewValue0(v.Pos, OpConst8, t)
11896 v0.AuxInt = int8ToAuxInt(0)
11897 v.AddArg2(v0, x)
11898 return true
11899 }
11900
11901
11902
11903 for {
11904 x := v_0
11905 if v_1.Op != OpConst8 {
11906 break
11907 }
11908 t := v_1.Type
11909 if auxIntToInt8(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
11910 break
11911 }
11912 v.reset(OpEq8)
11913 v0 := b.NewValue0(v.Pos, OpConst8, t)
11914 v0.AuxInt = int8ToAuxInt(0)
11915 v.AddArg2(v0, x)
11916 return true
11917 }
11918
11919
11920 for {
11921 x := v_0
11922 if v_1.Op != OpConst8 {
11923 break
11924 }
11925 t := v_1.Type
11926 if auxIntToInt8(v_1.AuxInt) != 1 {
11927 break
11928 }
11929 v.reset(OpLeq8)
11930 v0 := b.NewValue0(v.Pos, OpConst8, t)
11931 v0.AuxInt = int8ToAuxInt(0)
11932 v.AddArg2(x, v0)
11933 return true
11934 }
11935
11936
11937 for {
11938 if v_0.Op != OpConst8 {
11939 break
11940 }
11941 t := v_0.Type
11942 if auxIntToInt8(v_0.AuxInt) != -1 {
11943 break
11944 }
11945 x := v_1
11946 v.reset(OpLeq8)
11947 v0 := b.NewValue0(v.Pos, OpConst8, t)
11948 v0.AuxInt = int8ToAuxInt(0)
11949 v.AddArg2(v0, x)
11950 return true
11951 }
11952
11953
11954 for {
11955 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != math.MinInt8 {
11956 break
11957 }
11958 v.reset(OpConstBool)
11959 v.AuxInt = boolToAuxInt(false)
11960 return true
11961 }
11962
11963
11964 for {
11965 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != math.MaxInt8 {
11966 break
11967 }
11968 v.reset(OpConstBool)
11969 v.AuxInt = boolToAuxInt(false)
11970 return true
11971 }
11972
11973
11974 for {
11975 x := v_0
11976 if v_1.Op != OpConst8 {
11977 break
11978 }
11979 t := v_1.Type
11980 if auxIntToInt8(v_1.AuxInt) != math.MinInt8+1 {
11981 break
11982 }
11983 v.reset(OpEq8)
11984 v0 := b.NewValue0(v.Pos, OpConst8, t)
11985 v0.AuxInt = int8ToAuxInt(math.MinInt8)
11986 v.AddArg2(x, v0)
11987 return true
11988 }
11989
11990
11991 for {
11992 if v_0.Op != OpConst8 {
11993 break
11994 }
11995 t := v_0.Type
11996 if auxIntToInt8(v_0.AuxInt) != math.MaxInt8-1 {
11997 break
11998 }
11999 x := v_1
12000 v.reset(OpEq8)
12001 v0 := b.NewValue0(v.Pos, OpConst8, t)
12002 v0.AuxInt = int8ToAuxInt(math.MaxInt8)
12003 v.AddArg2(x, v0)
12004 return true
12005 }
12006 return false
12007 }
12008 func rewriteValuegeneric_OpLess8U(v *Value) bool {
12009 v_1 := v.Args[1]
12010 v_0 := v.Args[0]
12011 b := v.Block
12012
12013
12014 for {
12015 if v_0.Op != OpConst8 {
12016 break
12017 }
12018 c := auxIntToInt8(v_0.AuxInt)
12019 if v_1.Op != OpConst8 {
12020 break
12021 }
12022 d := auxIntToInt8(v_1.AuxInt)
12023 v.reset(OpConstBool)
12024 v.AuxInt = boolToAuxInt(uint8(c) < uint8(d))
12025 return true
12026 }
12027
12028
12029 for {
12030 x := v_0
12031 if v_1.Op != OpConst8 {
12032 break
12033 }
12034 t := v_1.Type
12035 if auxIntToInt8(v_1.AuxInt) != 1 {
12036 break
12037 }
12038 v.reset(OpEq8)
12039 v0 := b.NewValue0(v.Pos, OpConst8, t)
12040 v0.AuxInt = int8ToAuxInt(0)
12041 v.AddArg2(v0, x)
12042 return true
12043 }
12044
12045
12046 for {
12047 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
12048 break
12049 }
12050 v.reset(OpConstBool)
12051 v.AuxInt = boolToAuxInt(false)
12052 return true
12053 }
12054
12055
12056 for {
12057 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
12058 break
12059 }
12060 v.reset(OpConstBool)
12061 v.AuxInt = boolToAuxInt(false)
12062 return true
12063 }
12064
12065
12066 for {
12067 x := v_0
12068 if v_1.Op != OpConst8 {
12069 break
12070 }
12071 t := v_1.Type
12072 if auxIntToInt8(v_1.AuxInt) != 1 {
12073 break
12074 }
12075 v.reset(OpEq8)
12076 v0 := b.NewValue0(v.Pos, OpConst8, t)
12077 v0.AuxInt = int8ToAuxInt(0)
12078 v.AddArg2(x, v0)
12079 return true
12080 }
12081
12082
12083 for {
12084 if v_0.Op != OpConst8 {
12085 break
12086 }
12087 t := v_0.Type
12088 if auxIntToInt8(v_0.AuxInt) != -2 {
12089 break
12090 }
12091 x := v_1
12092 v.reset(OpEq8)
12093 v0 := b.NewValue0(v.Pos, OpConst8, t)
12094 v0.AuxInt = int8ToAuxInt(-1)
12095 v.AddArg2(x, v0)
12096 return true
12097 }
12098 return false
12099 }
12100 func rewriteValuegeneric_OpLoad(v *Value) bool {
12101 v_1 := v.Args[1]
12102 v_0 := v.Args[0]
12103 b := v.Block
12104 config := b.Func.Config
12105 typ := &b.Func.Config.Types
12106
12107
12108
12109 for {
12110 t1 := v.Type
12111 p1 := v_0
12112 if v_1.Op != OpStore {
12113 break
12114 }
12115 t2 := auxToType(v_1.Aux)
12116 x := v_1.Args[1]
12117 p2 := v_1.Args[0]
12118 if !(isSamePtr(p1, p2) && copyCompatibleType(t1, x.Type) && t1.Size() == t2.Size()) {
12119 break
12120 }
12121 v.copyOf(x)
12122 return true
12123 }
12124
12125
12126
12127 for {
12128 t1 := v.Type
12129 p1 := v_0
12130 if v_1.Op != OpStore {
12131 break
12132 }
12133 t2 := auxToType(v_1.Aux)
12134 _ = v_1.Args[2]
12135 p2 := v_1.Args[0]
12136 v_1_2 := v_1.Args[2]
12137 if v_1_2.Op != OpStore {
12138 break
12139 }
12140 t3 := auxToType(v_1_2.Aux)
12141 x := v_1_2.Args[1]
12142 p3 := v_1_2.Args[0]
12143 if !(isSamePtr(p1, p3) && copyCompatibleType(t1, x.Type) && t1.Size() == t3.Size() && disjoint(p3, t3.Size(), p2, t2.Size())) {
12144 break
12145 }
12146 v.copyOf(x)
12147 return true
12148 }
12149
12150
12151
12152 for {
12153 t1 := v.Type
12154 p1 := v_0
12155 if v_1.Op != OpStore {
12156 break
12157 }
12158 t2 := auxToType(v_1.Aux)
12159 _ = v_1.Args[2]
12160 p2 := v_1.Args[0]
12161 v_1_2 := v_1.Args[2]
12162 if v_1_2.Op != OpStore {
12163 break
12164 }
12165 t3 := auxToType(v_1_2.Aux)
12166 _ = v_1_2.Args[2]
12167 p3 := v_1_2.Args[0]
12168 v_1_2_2 := v_1_2.Args[2]
12169 if v_1_2_2.Op != OpStore {
12170 break
12171 }
12172 t4 := auxToType(v_1_2_2.Aux)
12173 x := v_1_2_2.Args[1]
12174 p4 := v_1_2_2.Args[0]
12175 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())) {
12176 break
12177 }
12178 v.copyOf(x)
12179 return true
12180 }
12181
12182
12183
12184 for {
12185 t1 := v.Type
12186 p1 := v_0
12187 if v_1.Op != OpStore {
12188 break
12189 }
12190 t2 := auxToType(v_1.Aux)
12191 _ = v_1.Args[2]
12192 p2 := v_1.Args[0]
12193 v_1_2 := v_1.Args[2]
12194 if v_1_2.Op != OpStore {
12195 break
12196 }
12197 t3 := auxToType(v_1_2.Aux)
12198 _ = v_1_2.Args[2]
12199 p3 := v_1_2.Args[0]
12200 v_1_2_2 := v_1_2.Args[2]
12201 if v_1_2_2.Op != OpStore {
12202 break
12203 }
12204 t4 := auxToType(v_1_2_2.Aux)
12205 _ = v_1_2_2.Args[2]
12206 p4 := v_1_2_2.Args[0]
12207 v_1_2_2_2 := v_1_2_2.Args[2]
12208 if v_1_2_2_2.Op != OpStore {
12209 break
12210 }
12211 t5 := auxToType(v_1_2_2_2.Aux)
12212 x := v_1_2_2_2.Args[1]
12213 p5 := v_1_2_2_2.Args[0]
12214 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())) {
12215 break
12216 }
12217 v.copyOf(x)
12218 return true
12219 }
12220
12221
12222
12223 for {
12224 t1 := v.Type
12225 op := v_0
12226 if op.Op != OpOffPtr {
12227 break
12228 }
12229 o1 := auxIntToInt64(op.AuxInt)
12230 p1 := op.Args[0]
12231 move := v_1
12232 if move.Op != OpMove {
12233 break
12234 }
12235 n := auxIntToInt64(move.AuxInt)
12236 mem := move.Args[2]
12237 p2 := move.Args[0]
12238 src := move.Args[1]
12239 if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p2) && !isVolatile(src)) {
12240 break
12241 }
12242 b = move.Block
12243 v0 := b.NewValue0(v.Pos, OpLoad, t1)
12244 v.copyOf(v0)
12245 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
12246 v1.AuxInt = int64ToAuxInt(o1)
12247 v1.AddArg(src)
12248 v0.AddArg2(v1, mem)
12249 return true
12250 }
12251
12252
12253
12254 for {
12255 t1 := v.Type
12256 p1 := v_0
12257 if v_1.Op != OpStore {
12258 break
12259 }
12260 t2 := auxToType(v_1.Aux)
12261 _ = v_1.Args[1]
12262 p2 := v_1.Args[0]
12263 v_1_1 := v_1.Args[1]
12264 if v_1_1.Op != OpConst64 {
12265 break
12266 }
12267 x := auxIntToInt64(v_1_1.AuxInt)
12268 if !(isSamePtr(p1, p2) && t2.Size() == 8 && is64BitFloat(t1) && !math.IsNaN(math.Float64frombits(uint64(x)))) {
12269 break
12270 }
12271 v.reset(OpConst64F)
12272 v.AuxInt = float64ToAuxInt(math.Float64frombits(uint64(x)))
12273 return true
12274 }
12275
12276
12277
12278 for {
12279 t1 := v.Type
12280 p1 := v_0
12281 if v_1.Op != OpStore {
12282 break
12283 }
12284 t2 := auxToType(v_1.Aux)
12285 _ = v_1.Args[1]
12286 p2 := v_1.Args[0]
12287 v_1_1 := v_1.Args[1]
12288 if v_1_1.Op != OpConst32 {
12289 break
12290 }
12291 x := auxIntToInt32(v_1_1.AuxInt)
12292 if !(isSamePtr(p1, p2) && t2.Size() == 4 && is32BitFloat(t1) && !math.IsNaN(float64(math.Float32frombits(uint32(x))))) {
12293 break
12294 }
12295 v.reset(OpConst32F)
12296 v.AuxInt = float32ToAuxInt(math.Float32frombits(uint32(x)))
12297 return true
12298 }
12299
12300
12301
12302 for {
12303 t1 := v.Type
12304 p1 := v_0
12305 if v_1.Op != OpStore {
12306 break
12307 }
12308 t2 := auxToType(v_1.Aux)
12309 _ = v_1.Args[1]
12310 p2 := v_1.Args[0]
12311 v_1_1 := v_1.Args[1]
12312 if v_1_1.Op != OpConst64F {
12313 break
12314 }
12315 x := auxIntToFloat64(v_1_1.AuxInt)
12316 if !(isSamePtr(p1, p2) && t2.Size() == 8 && is64BitInt(t1)) {
12317 break
12318 }
12319 v.reset(OpConst64)
12320 v.AuxInt = int64ToAuxInt(int64(math.Float64bits(x)))
12321 return true
12322 }
12323
12324
12325
12326 for {
12327 t1 := v.Type
12328 p1 := v_0
12329 if v_1.Op != OpStore {
12330 break
12331 }
12332 t2 := auxToType(v_1.Aux)
12333 _ = v_1.Args[1]
12334 p2 := v_1.Args[0]
12335 v_1_1 := v_1.Args[1]
12336 if v_1_1.Op != OpConst32F {
12337 break
12338 }
12339 x := auxIntToFloat32(v_1_1.AuxInt)
12340 if !(isSamePtr(p1, p2) && t2.Size() == 4 && is32BitInt(t1)) {
12341 break
12342 }
12343 v.reset(OpConst32)
12344 v.AuxInt = int32ToAuxInt(int32(math.Float32bits(x)))
12345 return true
12346 }
12347
12348
12349
12350 for {
12351 t1 := v.Type
12352 op := v_0
12353 if op.Op != OpOffPtr {
12354 break
12355 }
12356 o1 := auxIntToInt64(op.AuxInt)
12357 p1 := op.Args[0]
12358 if v_1.Op != OpStore {
12359 break
12360 }
12361 t2 := auxToType(v_1.Aux)
12362 _ = v_1.Args[2]
12363 p2 := v_1.Args[0]
12364 mem := v_1.Args[2]
12365 if mem.Op != OpZero {
12366 break
12367 }
12368 n := auxIntToInt64(mem.AuxInt)
12369 p3 := mem.Args[0]
12370 if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p3) && CanSSA(t1) && disjoint(op, t1.Size(), p2, t2.Size())) {
12371 break
12372 }
12373 b = mem.Block
12374 v0 := b.NewValue0(v.Pos, OpLoad, t1)
12375 v.copyOf(v0)
12376 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
12377 v1.AuxInt = int64ToAuxInt(o1)
12378 v1.AddArg(p3)
12379 v0.AddArg2(v1, mem)
12380 return true
12381 }
12382
12383
12384
12385 for {
12386 t1 := v.Type
12387 op := v_0
12388 if op.Op != OpOffPtr {
12389 break
12390 }
12391 o1 := auxIntToInt64(op.AuxInt)
12392 p1 := op.Args[0]
12393 if v_1.Op != OpStore {
12394 break
12395 }
12396 t2 := auxToType(v_1.Aux)
12397 _ = v_1.Args[2]
12398 p2 := v_1.Args[0]
12399 v_1_2 := v_1.Args[2]
12400 if v_1_2.Op != OpStore {
12401 break
12402 }
12403 t3 := auxToType(v_1_2.Aux)
12404 _ = v_1_2.Args[2]
12405 p3 := v_1_2.Args[0]
12406 mem := v_1_2.Args[2]
12407 if mem.Op != OpZero {
12408 break
12409 }
12410 n := auxIntToInt64(mem.AuxInt)
12411 p4 := mem.Args[0]
12412 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())) {
12413 break
12414 }
12415 b = mem.Block
12416 v0 := b.NewValue0(v.Pos, OpLoad, t1)
12417 v.copyOf(v0)
12418 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
12419 v1.AuxInt = int64ToAuxInt(o1)
12420 v1.AddArg(p4)
12421 v0.AddArg2(v1, mem)
12422 return true
12423 }
12424
12425
12426
12427 for {
12428 t1 := v.Type
12429 op := v_0
12430 if op.Op != OpOffPtr {
12431 break
12432 }
12433 o1 := auxIntToInt64(op.AuxInt)
12434 p1 := op.Args[0]
12435 if v_1.Op != OpStore {
12436 break
12437 }
12438 t2 := auxToType(v_1.Aux)
12439 _ = v_1.Args[2]
12440 p2 := v_1.Args[0]
12441 v_1_2 := v_1.Args[2]
12442 if v_1_2.Op != OpStore {
12443 break
12444 }
12445 t3 := auxToType(v_1_2.Aux)
12446 _ = v_1_2.Args[2]
12447 p3 := v_1_2.Args[0]
12448 v_1_2_2 := v_1_2.Args[2]
12449 if v_1_2_2.Op != OpStore {
12450 break
12451 }
12452 t4 := auxToType(v_1_2_2.Aux)
12453 _ = v_1_2_2.Args[2]
12454 p4 := v_1_2_2.Args[0]
12455 mem := v_1_2_2.Args[2]
12456 if mem.Op != OpZero {
12457 break
12458 }
12459 n := auxIntToInt64(mem.AuxInt)
12460 p5 := mem.Args[0]
12461 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())) {
12462 break
12463 }
12464 b = mem.Block
12465 v0 := b.NewValue0(v.Pos, OpLoad, t1)
12466 v.copyOf(v0)
12467 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
12468 v1.AuxInt = int64ToAuxInt(o1)
12469 v1.AddArg(p5)
12470 v0.AddArg2(v1, mem)
12471 return true
12472 }
12473
12474
12475
12476 for {
12477 t1 := v.Type
12478 op := v_0
12479 if op.Op != OpOffPtr {
12480 break
12481 }
12482 o1 := auxIntToInt64(op.AuxInt)
12483 p1 := op.Args[0]
12484 if v_1.Op != OpStore {
12485 break
12486 }
12487 t2 := auxToType(v_1.Aux)
12488 _ = v_1.Args[2]
12489 p2 := v_1.Args[0]
12490 v_1_2 := v_1.Args[2]
12491 if v_1_2.Op != OpStore {
12492 break
12493 }
12494 t3 := auxToType(v_1_2.Aux)
12495 _ = v_1_2.Args[2]
12496 p3 := v_1_2.Args[0]
12497 v_1_2_2 := v_1_2.Args[2]
12498 if v_1_2_2.Op != OpStore {
12499 break
12500 }
12501 t4 := auxToType(v_1_2_2.Aux)
12502 _ = v_1_2_2.Args[2]
12503 p4 := v_1_2_2.Args[0]
12504 v_1_2_2_2 := v_1_2_2.Args[2]
12505 if v_1_2_2_2.Op != OpStore {
12506 break
12507 }
12508 t5 := auxToType(v_1_2_2_2.Aux)
12509 _ = v_1_2_2_2.Args[2]
12510 p5 := v_1_2_2_2.Args[0]
12511 mem := v_1_2_2_2.Args[2]
12512 if mem.Op != OpZero {
12513 break
12514 }
12515 n := auxIntToInt64(mem.AuxInt)
12516 p6 := mem.Args[0]
12517 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())) {
12518 break
12519 }
12520 b = mem.Block
12521 v0 := b.NewValue0(v.Pos, OpLoad, t1)
12522 v.copyOf(v0)
12523 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
12524 v1.AuxInt = int64ToAuxInt(o1)
12525 v1.AddArg(p6)
12526 v0.AddArg2(v1, mem)
12527 return true
12528 }
12529
12530
12531
12532 for {
12533 t1 := v.Type
12534 if v_0.Op != OpOffPtr {
12535 break
12536 }
12537 o := auxIntToInt64(v_0.AuxInt)
12538 p1 := v_0.Args[0]
12539 if v_1.Op != OpZero {
12540 break
12541 }
12542 n := auxIntToInt64(v_1.AuxInt)
12543 p2 := v_1.Args[0]
12544 if !(t1.IsBoolean() && isSamePtr(p1, p2) && n >= o+1) {
12545 break
12546 }
12547 v.reset(OpConstBool)
12548 v.AuxInt = boolToAuxInt(false)
12549 return true
12550 }
12551
12552
12553
12554 for {
12555 t1 := v.Type
12556 if v_0.Op != OpOffPtr {
12557 break
12558 }
12559 o := auxIntToInt64(v_0.AuxInt)
12560 p1 := v_0.Args[0]
12561 if v_1.Op != OpZero {
12562 break
12563 }
12564 n := auxIntToInt64(v_1.AuxInt)
12565 p2 := v_1.Args[0]
12566 if !(is8BitInt(t1) && isSamePtr(p1, p2) && n >= o+1) {
12567 break
12568 }
12569 v.reset(OpConst8)
12570 v.AuxInt = int8ToAuxInt(0)
12571 return true
12572 }
12573
12574
12575
12576 for {
12577 t1 := v.Type
12578 if v_0.Op != OpOffPtr {
12579 break
12580 }
12581 o := auxIntToInt64(v_0.AuxInt)
12582 p1 := v_0.Args[0]
12583 if v_1.Op != OpZero {
12584 break
12585 }
12586 n := auxIntToInt64(v_1.AuxInt)
12587 p2 := v_1.Args[0]
12588 if !(is16BitInt(t1) && isSamePtr(p1, p2) && n >= o+2) {
12589 break
12590 }
12591 v.reset(OpConst16)
12592 v.AuxInt = int16ToAuxInt(0)
12593 return true
12594 }
12595
12596
12597
12598 for {
12599 t1 := v.Type
12600 if v_0.Op != OpOffPtr {
12601 break
12602 }
12603 o := auxIntToInt64(v_0.AuxInt)
12604 p1 := v_0.Args[0]
12605 if v_1.Op != OpZero {
12606 break
12607 }
12608 n := auxIntToInt64(v_1.AuxInt)
12609 p2 := v_1.Args[0]
12610 if !(is32BitInt(t1) && isSamePtr(p1, p2) && n >= o+4) {
12611 break
12612 }
12613 v.reset(OpConst32)
12614 v.AuxInt = int32ToAuxInt(0)
12615 return true
12616 }
12617
12618
12619
12620 for {
12621 t1 := v.Type
12622 if v_0.Op != OpOffPtr {
12623 break
12624 }
12625 o := auxIntToInt64(v_0.AuxInt)
12626 p1 := v_0.Args[0]
12627 if v_1.Op != OpZero {
12628 break
12629 }
12630 n := auxIntToInt64(v_1.AuxInt)
12631 p2 := v_1.Args[0]
12632 if !(is64BitInt(t1) && isSamePtr(p1, p2) && n >= o+8) {
12633 break
12634 }
12635 v.reset(OpConst64)
12636 v.AuxInt = int64ToAuxInt(0)
12637 return true
12638 }
12639
12640
12641
12642 for {
12643 t1 := v.Type
12644 if v_0.Op != OpOffPtr {
12645 break
12646 }
12647 o := auxIntToInt64(v_0.AuxInt)
12648 p1 := v_0.Args[0]
12649 if v_1.Op != OpZero {
12650 break
12651 }
12652 n := auxIntToInt64(v_1.AuxInt)
12653 p2 := v_1.Args[0]
12654 if !(is32BitFloat(t1) && isSamePtr(p1, p2) && n >= o+4) {
12655 break
12656 }
12657 v.reset(OpConst32F)
12658 v.AuxInt = float32ToAuxInt(0)
12659 return true
12660 }
12661
12662
12663
12664 for {
12665 t1 := v.Type
12666 if v_0.Op != OpOffPtr {
12667 break
12668 }
12669 o := auxIntToInt64(v_0.AuxInt)
12670 p1 := v_0.Args[0]
12671 if v_1.Op != OpZero {
12672 break
12673 }
12674 n := auxIntToInt64(v_1.AuxInt)
12675 p2 := v_1.Args[0]
12676 if !(is64BitFloat(t1) && isSamePtr(p1, p2) && n >= o+8) {
12677 break
12678 }
12679 v.reset(OpConst64F)
12680 v.AuxInt = float64ToAuxInt(0)
12681 return true
12682 }
12683
12684
12685
12686 for {
12687 t := v.Type
12688 if !(t.IsStruct() && t.Size() > 0 && CanSSA(t) && !t.IsSIMD()) {
12689 break
12690 }
12691 v.copyOf(rewriteStructLoad(v))
12692 return true
12693 }
12694
12695
12696
12697 for {
12698 t := v.Type
12699 ptr := v_0
12700 mem := v_1
12701 if !(t.IsArray() && t.NumElem() == 1 && CanSSA(t)) {
12702 break
12703 }
12704 v.reset(OpArrayMake1)
12705 v0 := b.NewValue0(v.Pos, OpLoad, t.Elem())
12706 v0.AddArg2(ptr, mem)
12707 v.AddArg(v0)
12708 return true
12709 }
12710
12711
12712
12713 for {
12714 t := v.Type
12715 if !(t.Size() == 0) {
12716 break
12717 }
12718 v.reset(OpEmpty)
12719 return true
12720 }
12721
12722
12723
12724 for {
12725 if v.Type != typ.Int8 {
12726 break
12727 }
12728 sptr := v_0
12729 if sptr.Op != OpAddr {
12730 break
12731 }
12732 scon := auxToSym(sptr.Aux)
12733 sptr_0 := sptr.Args[0]
12734 if sptr_0.Op != OpSB {
12735 break
12736 }
12737 if !(symIsRO(scon)) {
12738 break
12739 }
12740 v.reset(OpConst8)
12741 v.Type = typ.Int8
12742 v.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
12743 return true
12744 }
12745
12746
12747
12748 for {
12749 if v.Type != typ.Int16 {
12750 break
12751 }
12752 sptr := v_0
12753 if sptr.Op != OpAddr {
12754 break
12755 }
12756 scon := auxToSym(sptr.Aux)
12757 sptr_0 := sptr.Args[0]
12758 if sptr_0.Op != OpSB {
12759 break
12760 }
12761 if !(symIsRO(scon)) {
12762 break
12763 }
12764 v.reset(OpConst16)
12765 v.Type = typ.Int16
12766 v.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
12767 return true
12768 }
12769
12770
12771
12772 for {
12773 if v.Type != typ.Int32 {
12774 break
12775 }
12776 sptr := v_0
12777 if sptr.Op != OpAddr {
12778 break
12779 }
12780 scon := auxToSym(sptr.Aux)
12781 sptr_0 := sptr.Args[0]
12782 if sptr_0.Op != OpSB {
12783 break
12784 }
12785 if !(symIsRO(scon)) {
12786 break
12787 }
12788 v.reset(OpConst32)
12789 v.Type = typ.Int32
12790 v.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
12791 return true
12792 }
12793
12794
12795
12796 for {
12797 if v.Type != typ.Int64 {
12798 break
12799 }
12800 sptr := v_0
12801 if sptr.Op != OpAddr {
12802 break
12803 }
12804 scon := auxToSym(sptr.Aux)
12805 sptr_0 := sptr.Args[0]
12806 if sptr_0.Op != OpSB {
12807 break
12808 }
12809 if !(symIsRO(scon)) {
12810 break
12811 }
12812 v.reset(OpConst64)
12813 v.Type = typ.Int64
12814 v.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
12815 return true
12816 }
12817
12818
12819
12820 for {
12821 if v_0.Op != OpAddr {
12822 break
12823 }
12824 s := auxToSym(v_0.Aux)
12825 sb := v_0.Args[0]
12826 if !(isFixedLoad(v, s, 0)) {
12827 break
12828 }
12829 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
12830 return true
12831 }
12832
12833
12834
12835 for {
12836 if v_0.Op != OpConvert {
12837 break
12838 }
12839 v_0_0 := v_0.Args[0]
12840 if v_0_0.Op != OpAddr {
12841 break
12842 }
12843 s := auxToSym(v_0_0.Aux)
12844 sb := v_0_0.Args[0]
12845 if !(isFixedLoad(v, s, 0)) {
12846 break
12847 }
12848 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
12849 return true
12850 }
12851
12852
12853
12854 for {
12855 if v_0.Op != OpITab {
12856 break
12857 }
12858 v_0_0 := v_0.Args[0]
12859 if v_0_0.Op != OpIMake {
12860 break
12861 }
12862 v_0_0_0 := v_0_0.Args[0]
12863 if v_0_0_0.Op != OpAddr {
12864 break
12865 }
12866 s := auxToSym(v_0_0_0.Aux)
12867 sb := v_0_0_0.Args[0]
12868 if !(isFixedLoad(v, s, 0)) {
12869 break
12870 }
12871 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
12872 return true
12873 }
12874
12875
12876
12877 for {
12878 if v_0.Op != OpITab {
12879 break
12880 }
12881 v_0_0 := v_0.Args[0]
12882 if v_0_0.Op != OpIMake {
12883 break
12884 }
12885 v_0_0_0 := v_0_0.Args[0]
12886 if v_0_0_0.Op != OpConvert {
12887 break
12888 }
12889 v_0_0_0_0 := v_0_0_0.Args[0]
12890 if v_0_0_0_0.Op != OpAddr {
12891 break
12892 }
12893 s := auxToSym(v_0_0_0_0.Aux)
12894 sb := v_0_0_0_0.Args[0]
12895 if !(isFixedLoad(v, s, 0)) {
12896 break
12897 }
12898 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
12899 return true
12900 }
12901
12902
12903
12904 for {
12905 if v_0.Op != OpOffPtr {
12906 break
12907 }
12908 off := auxIntToInt64(v_0.AuxInt)
12909 v_0_0 := v_0.Args[0]
12910 if v_0_0.Op != OpAddr {
12911 break
12912 }
12913 s := auxToSym(v_0_0.Aux)
12914 sb := v_0_0.Args[0]
12915 if !(isFixedLoad(v, s, off)) {
12916 break
12917 }
12918 v.copyOf(rewriteFixedLoad(v, s, sb, off))
12919 return true
12920 }
12921
12922
12923
12924 for {
12925 if v_0.Op != OpOffPtr {
12926 break
12927 }
12928 off := auxIntToInt64(v_0.AuxInt)
12929 v_0_0 := v_0.Args[0]
12930 if v_0_0.Op != OpConvert {
12931 break
12932 }
12933 v_0_0_0 := v_0_0.Args[0]
12934 if v_0_0_0.Op != OpAddr {
12935 break
12936 }
12937 s := auxToSym(v_0_0_0.Aux)
12938 sb := v_0_0_0.Args[0]
12939 if !(isFixedLoad(v, s, off)) {
12940 break
12941 }
12942 v.copyOf(rewriteFixedLoad(v, s, sb, off))
12943 return true
12944 }
12945
12946
12947
12948 for {
12949 if v_0.Op != OpOffPtr {
12950 break
12951 }
12952 off := auxIntToInt64(v_0.AuxInt)
12953 v_0_0 := v_0.Args[0]
12954 if v_0_0.Op != OpITab {
12955 break
12956 }
12957 v_0_0_0 := v_0_0.Args[0]
12958 if v_0_0_0.Op != OpIMake {
12959 break
12960 }
12961 v_0_0_0_0 := v_0_0_0.Args[0]
12962 if v_0_0_0_0.Op != OpAddr {
12963 break
12964 }
12965 s := auxToSym(v_0_0_0_0.Aux)
12966 sb := v_0_0_0_0.Args[0]
12967 if !(isFixedLoad(v, s, off)) {
12968 break
12969 }
12970 v.copyOf(rewriteFixedLoad(v, s, sb, off))
12971 return true
12972 }
12973
12974
12975
12976 for {
12977 if v_0.Op != OpOffPtr {
12978 break
12979 }
12980 off := auxIntToInt64(v_0.AuxInt)
12981 v_0_0 := v_0.Args[0]
12982 if v_0_0.Op != OpITab {
12983 break
12984 }
12985 v_0_0_0 := v_0_0.Args[0]
12986 if v_0_0_0.Op != OpIMake {
12987 break
12988 }
12989 v_0_0_0_0 := v_0_0_0.Args[0]
12990 if v_0_0_0_0.Op != OpConvert {
12991 break
12992 }
12993 v_0_0_0_0_0 := v_0_0_0_0.Args[0]
12994 if v_0_0_0_0_0.Op != OpAddr {
12995 break
12996 }
12997 s := auxToSym(v_0_0_0_0_0.Aux)
12998 sb := v_0_0_0_0_0.Args[0]
12999 if !(isFixedLoad(v, s, off)) {
13000 break
13001 }
13002 v.copyOf(rewriteFixedLoad(v, s, sb, off))
13003 return true
13004 }
13005 return false
13006 }
13007 func rewriteValuegeneric_OpLsh16x16(v *Value) bool {
13008 v_1 := v.Args[1]
13009 v_0 := v.Args[0]
13010 b := v.Block
13011
13012
13013 for {
13014 t := v.Type
13015 x := v_0
13016 if v_1.Op != OpConst16 {
13017 break
13018 }
13019 c := auxIntToInt16(v_1.AuxInt)
13020 v.reset(OpLsh16x64)
13021 v0 := b.NewValue0(v.Pos, OpConst64, t)
13022 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
13023 v.AddArg2(x, v0)
13024 return true
13025 }
13026
13027
13028 for {
13029 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
13030 break
13031 }
13032 v.reset(OpConst16)
13033 v.AuxInt = int16ToAuxInt(0)
13034 return true
13035 }
13036
13037
13038
13039 for {
13040 if auxIntToBool(v.AuxInt) != false {
13041 break
13042 }
13043 x := v_0
13044 con := v_1
13045 if con.Op != OpConst16 {
13046 break
13047 }
13048 c := auxIntToInt16(con.AuxInt)
13049 if !(0 < c && c < 16) {
13050 break
13051 }
13052 v.reset(OpLsh16x16)
13053 v.AuxInt = boolToAuxInt(true)
13054 v.AddArg2(x, con)
13055 return true
13056 }
13057 return false
13058 }
13059 func rewriteValuegeneric_OpLsh16x32(v *Value) bool {
13060 v_1 := v.Args[1]
13061 v_0 := v.Args[0]
13062 b := v.Block
13063
13064
13065 for {
13066 t := v.Type
13067 x := v_0
13068 if v_1.Op != OpConst32 {
13069 break
13070 }
13071 c := auxIntToInt32(v_1.AuxInt)
13072 v.reset(OpLsh16x64)
13073 v0 := b.NewValue0(v.Pos, OpConst64, t)
13074 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
13075 v.AddArg2(x, v0)
13076 return true
13077 }
13078
13079
13080 for {
13081 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
13082 break
13083 }
13084 v.reset(OpConst16)
13085 v.AuxInt = int16ToAuxInt(0)
13086 return true
13087 }
13088
13089
13090
13091 for {
13092 if auxIntToBool(v.AuxInt) != false {
13093 break
13094 }
13095 x := v_0
13096 con := v_1
13097 if con.Op != OpConst32 {
13098 break
13099 }
13100 c := auxIntToInt32(con.AuxInt)
13101 if !(0 < c && c < 16) {
13102 break
13103 }
13104 v.reset(OpLsh16x32)
13105 v.AuxInt = boolToAuxInt(true)
13106 v.AddArg2(x, con)
13107 return true
13108 }
13109 return false
13110 }
13111 func rewriteValuegeneric_OpLsh16x64(v *Value) bool {
13112 v_1 := v.Args[1]
13113 v_0 := v.Args[0]
13114 b := v.Block
13115 typ := &b.Func.Config.Types
13116
13117
13118 for {
13119 if v_0.Op != OpConst16 {
13120 break
13121 }
13122 c := auxIntToInt16(v_0.AuxInt)
13123 if v_1.Op != OpConst64 {
13124 break
13125 }
13126 d := auxIntToInt64(v_1.AuxInt)
13127 v.reset(OpConst16)
13128 v.AuxInt = int16ToAuxInt(c << uint64(d))
13129 return true
13130 }
13131
13132
13133 for {
13134 x := v_0
13135 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
13136 break
13137 }
13138 v.copyOf(x)
13139 return true
13140 }
13141
13142
13143 for {
13144 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
13145 break
13146 }
13147 v.reset(OpConst16)
13148 v.AuxInt = int16ToAuxInt(0)
13149 return true
13150 }
13151
13152
13153
13154 for {
13155 if v_1.Op != OpConst64 {
13156 break
13157 }
13158 c := auxIntToInt64(v_1.AuxInt)
13159 if !(uint64(c) >= 16) {
13160 break
13161 }
13162 v.reset(OpConst16)
13163 v.AuxInt = int16ToAuxInt(0)
13164 return true
13165 }
13166
13167
13168
13169 for {
13170 t := v.Type
13171 if v_0.Op != OpLsh16x64 {
13172 break
13173 }
13174 _ = v_0.Args[1]
13175 x := v_0.Args[0]
13176 v_0_1 := v_0.Args[1]
13177 if v_0_1.Op != OpConst64 {
13178 break
13179 }
13180 c := auxIntToInt64(v_0_1.AuxInt)
13181 if v_1.Op != OpConst64 {
13182 break
13183 }
13184 d := auxIntToInt64(v_1.AuxInt)
13185 if !(!uaddOvf(c, d)) {
13186 break
13187 }
13188 v.reset(OpLsh16x64)
13189 v0 := b.NewValue0(v.Pos, OpConst64, t)
13190 v0.AuxInt = int64ToAuxInt(c + d)
13191 v.AddArg2(x, v0)
13192 return true
13193 }
13194
13195
13196
13197 for {
13198 i := v_0
13199 if i.Op != OpRsh16x64 {
13200 break
13201 }
13202 _ = i.Args[1]
13203 x := i.Args[0]
13204 i_1 := i.Args[1]
13205 if i_1.Op != OpConst64 {
13206 break
13207 }
13208 c := auxIntToInt64(i_1.AuxInt)
13209 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
13210 break
13211 }
13212 v.reset(OpAnd16)
13213 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
13214 v0.AuxInt = int16ToAuxInt(int16(-1) << c)
13215 v.AddArg2(x, v0)
13216 return true
13217 }
13218
13219
13220
13221 for {
13222 i := v_0
13223 if i.Op != OpRsh16Ux64 {
13224 break
13225 }
13226 _ = i.Args[1]
13227 x := i.Args[0]
13228 i_1 := i.Args[1]
13229 if i_1.Op != OpConst64 {
13230 break
13231 }
13232 c := auxIntToInt64(i_1.AuxInt)
13233 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
13234 break
13235 }
13236 v.reset(OpAnd16)
13237 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
13238 v0.AuxInt = int16ToAuxInt(int16(-1) << c)
13239 v.AddArg2(x, v0)
13240 return true
13241 }
13242
13243
13244
13245 for {
13246 if v_0.Op != OpRsh16Ux64 {
13247 break
13248 }
13249 _ = v_0.Args[1]
13250 v_0_0 := v_0.Args[0]
13251 if v_0_0.Op != OpLsh16x64 {
13252 break
13253 }
13254 _ = v_0_0.Args[1]
13255 x := v_0_0.Args[0]
13256 v_0_0_1 := v_0_0.Args[1]
13257 if v_0_0_1.Op != OpConst64 {
13258 break
13259 }
13260 c1 := auxIntToInt64(v_0_0_1.AuxInt)
13261 v_0_1 := v_0.Args[1]
13262 if v_0_1.Op != OpConst64 {
13263 break
13264 }
13265 c2 := auxIntToInt64(v_0_1.AuxInt)
13266 if v_1.Op != OpConst64 {
13267 break
13268 }
13269 c3 := auxIntToInt64(v_1.AuxInt)
13270 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
13271 break
13272 }
13273 v.reset(OpLsh16x64)
13274 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
13275 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
13276 v.AddArg2(x, v0)
13277 return true
13278 }
13279
13280
13281
13282 for {
13283 if v_0.Op != OpAnd16 {
13284 break
13285 }
13286 _ = v_0.Args[1]
13287 v_0_0 := v_0.Args[0]
13288 v_0_1 := v_0.Args[1]
13289 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13290 if v_0_0.Op != OpRsh16x64 {
13291 continue
13292 }
13293 t := v_0_0.Type
13294 _ = v_0_0.Args[1]
13295 x := v_0_0.Args[0]
13296 v_0_0_1 := v_0_0.Args[1]
13297 if v_0_0_1.Op != OpConst64 {
13298 continue
13299 }
13300 t2 := v_0_0_1.Type
13301 c := auxIntToInt64(v_0_0_1.AuxInt)
13302 if v_0_1.Op != OpConst16 {
13303 continue
13304 }
13305 d := auxIntToInt16(v_0_1.AuxInt)
13306 if v_1.Op != OpConst64 {
13307 continue
13308 }
13309 e := auxIntToInt64(v_1.AuxInt)
13310 if !(c >= e) {
13311 continue
13312 }
13313 v.reset(OpAnd16)
13314 v0 := b.NewValue0(v.Pos, OpRsh16x64, t)
13315 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13316 v1.AuxInt = int64ToAuxInt(c - e)
13317 v0.AddArg2(x, v1)
13318 v2 := b.NewValue0(v.Pos, OpConst16, t)
13319 v2.AuxInt = int16ToAuxInt(d << e)
13320 v.AddArg2(v0, v2)
13321 return true
13322 }
13323 break
13324 }
13325
13326
13327
13328 for {
13329 if v_0.Op != OpAnd16 {
13330 break
13331 }
13332 _ = v_0.Args[1]
13333 v_0_0 := v_0.Args[0]
13334 v_0_1 := v_0.Args[1]
13335 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13336 if v_0_0.Op != OpRsh16Ux64 {
13337 continue
13338 }
13339 t := v_0_0.Type
13340 _ = v_0_0.Args[1]
13341 x := v_0_0.Args[0]
13342 v_0_0_1 := v_0_0.Args[1]
13343 if v_0_0_1.Op != OpConst64 {
13344 continue
13345 }
13346 t2 := v_0_0_1.Type
13347 c := auxIntToInt64(v_0_0_1.AuxInt)
13348 if v_0_1.Op != OpConst16 {
13349 continue
13350 }
13351 d := auxIntToInt16(v_0_1.AuxInt)
13352 if v_1.Op != OpConst64 {
13353 continue
13354 }
13355 e := auxIntToInt64(v_1.AuxInt)
13356 if !(c >= e) {
13357 continue
13358 }
13359 v.reset(OpAnd16)
13360 v0 := b.NewValue0(v.Pos, OpRsh16Ux64, t)
13361 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13362 v1.AuxInt = int64ToAuxInt(c - e)
13363 v0.AddArg2(x, v1)
13364 v2 := b.NewValue0(v.Pos, OpConst16, t)
13365 v2.AuxInt = int16ToAuxInt(d << e)
13366 v.AddArg2(v0, v2)
13367 return true
13368 }
13369 break
13370 }
13371
13372
13373
13374 for {
13375 if v_0.Op != OpAnd16 {
13376 break
13377 }
13378 _ = v_0.Args[1]
13379 v_0_0 := v_0.Args[0]
13380 v_0_1 := v_0.Args[1]
13381 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13382 if v_0_0.Op != OpRsh16x64 {
13383 continue
13384 }
13385 t := v_0_0.Type
13386 _ = v_0_0.Args[1]
13387 x := v_0_0.Args[0]
13388 v_0_0_1 := v_0_0.Args[1]
13389 if v_0_0_1.Op != OpConst64 {
13390 continue
13391 }
13392 t2 := v_0_0_1.Type
13393 c := auxIntToInt64(v_0_0_1.AuxInt)
13394 if v_0_1.Op != OpConst16 {
13395 continue
13396 }
13397 d := auxIntToInt16(v_0_1.AuxInt)
13398 if v_1.Op != OpConst64 {
13399 continue
13400 }
13401 e := auxIntToInt64(v_1.AuxInt)
13402 if !(c < e) {
13403 continue
13404 }
13405 v.reset(OpAnd16)
13406 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
13407 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13408 v1.AuxInt = int64ToAuxInt(e - c)
13409 v0.AddArg2(x, v1)
13410 v2 := b.NewValue0(v.Pos, OpConst16, t)
13411 v2.AuxInt = int16ToAuxInt(d << e)
13412 v.AddArg2(v0, v2)
13413 return true
13414 }
13415 break
13416 }
13417
13418
13419
13420 for {
13421 if v_0.Op != OpAnd16 {
13422 break
13423 }
13424 _ = v_0.Args[1]
13425 v_0_0 := v_0.Args[0]
13426 v_0_1 := v_0.Args[1]
13427 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13428 if v_0_0.Op != OpRsh16Ux64 {
13429 continue
13430 }
13431 t := v_0_0.Type
13432 _ = v_0_0.Args[1]
13433 x := v_0_0.Args[0]
13434 v_0_0_1 := v_0_0.Args[1]
13435 if v_0_0_1.Op != OpConst64 {
13436 continue
13437 }
13438 t2 := v_0_0_1.Type
13439 c := auxIntToInt64(v_0_0_1.AuxInt)
13440 if v_0_1.Op != OpConst16 {
13441 continue
13442 }
13443 d := auxIntToInt16(v_0_1.AuxInt)
13444 if v_1.Op != OpConst64 {
13445 continue
13446 }
13447 e := auxIntToInt64(v_1.AuxInt)
13448 if !(c < e) {
13449 continue
13450 }
13451 v.reset(OpAnd16)
13452 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
13453 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13454 v1.AuxInt = int64ToAuxInt(e - c)
13455 v0.AddArg2(x, v1)
13456 v2 := b.NewValue0(v.Pos, OpConst16, t)
13457 v2.AuxInt = int16ToAuxInt(d << e)
13458 v.AddArg2(v0, v2)
13459 return true
13460 }
13461 break
13462 }
13463
13464
13465
13466 for {
13467 if auxIntToBool(v.AuxInt) != false {
13468 break
13469 }
13470 x := v_0
13471 con := v_1
13472 if con.Op != OpConst64 {
13473 break
13474 }
13475 c := auxIntToInt64(con.AuxInt)
13476 if !(0 < c && c < 16) {
13477 break
13478 }
13479 v.reset(OpLsh16x64)
13480 v.AuxInt = boolToAuxInt(true)
13481 v.AddArg2(x, con)
13482 return true
13483 }
13484 return false
13485 }
13486 func rewriteValuegeneric_OpLsh16x8(v *Value) bool {
13487 v_1 := v.Args[1]
13488 v_0 := v.Args[0]
13489 b := v.Block
13490
13491
13492 for {
13493 t := v.Type
13494 x := v_0
13495 if v_1.Op != OpConst8 {
13496 break
13497 }
13498 c := auxIntToInt8(v_1.AuxInt)
13499 v.reset(OpLsh16x64)
13500 v0 := b.NewValue0(v.Pos, OpConst64, t)
13501 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
13502 v.AddArg2(x, v0)
13503 return true
13504 }
13505
13506
13507 for {
13508 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
13509 break
13510 }
13511 v.reset(OpConst16)
13512 v.AuxInt = int16ToAuxInt(0)
13513 return true
13514 }
13515
13516
13517
13518 for {
13519 if auxIntToBool(v.AuxInt) != false {
13520 break
13521 }
13522 x := v_0
13523 con := v_1
13524 if con.Op != OpConst8 {
13525 break
13526 }
13527 c := auxIntToInt8(con.AuxInt)
13528 if !(0 < c && c < 16) {
13529 break
13530 }
13531 v.reset(OpLsh16x8)
13532 v.AuxInt = boolToAuxInt(true)
13533 v.AddArg2(x, con)
13534 return true
13535 }
13536 return false
13537 }
13538 func rewriteValuegeneric_OpLsh32x16(v *Value) bool {
13539 v_1 := v.Args[1]
13540 v_0 := v.Args[0]
13541 b := v.Block
13542
13543
13544 for {
13545 t := v.Type
13546 x := v_0
13547 if v_1.Op != OpConst16 {
13548 break
13549 }
13550 c := auxIntToInt16(v_1.AuxInt)
13551 v.reset(OpLsh32x64)
13552 v0 := b.NewValue0(v.Pos, OpConst64, t)
13553 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
13554 v.AddArg2(x, v0)
13555 return true
13556 }
13557
13558
13559 for {
13560 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
13561 break
13562 }
13563 v.reset(OpConst32)
13564 v.AuxInt = int32ToAuxInt(0)
13565 return true
13566 }
13567
13568
13569
13570 for {
13571 if auxIntToBool(v.AuxInt) != false {
13572 break
13573 }
13574 x := v_0
13575 con := v_1
13576 if con.Op != OpConst16 {
13577 break
13578 }
13579 c := auxIntToInt16(con.AuxInt)
13580 if !(0 < c && c < 32) {
13581 break
13582 }
13583 v.reset(OpLsh32x16)
13584 v.AuxInt = boolToAuxInt(true)
13585 v.AddArg2(x, con)
13586 return true
13587 }
13588 return false
13589 }
13590 func rewriteValuegeneric_OpLsh32x32(v *Value) bool {
13591 v_1 := v.Args[1]
13592 v_0 := v.Args[0]
13593 b := v.Block
13594
13595
13596 for {
13597 t := v.Type
13598 x := v_0
13599 if v_1.Op != OpConst32 {
13600 break
13601 }
13602 c := auxIntToInt32(v_1.AuxInt)
13603 v.reset(OpLsh32x64)
13604 v0 := b.NewValue0(v.Pos, OpConst64, t)
13605 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
13606 v.AddArg2(x, v0)
13607 return true
13608 }
13609
13610
13611 for {
13612 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
13613 break
13614 }
13615 v.reset(OpConst32)
13616 v.AuxInt = int32ToAuxInt(0)
13617 return true
13618 }
13619
13620
13621
13622 for {
13623 if auxIntToBool(v.AuxInt) != false {
13624 break
13625 }
13626 x := v_0
13627 con := v_1
13628 if con.Op != OpConst32 {
13629 break
13630 }
13631 c := auxIntToInt32(con.AuxInt)
13632 if !(0 < c && c < 32) {
13633 break
13634 }
13635 v.reset(OpLsh32x32)
13636 v.AuxInt = boolToAuxInt(true)
13637 v.AddArg2(x, con)
13638 return true
13639 }
13640 return false
13641 }
13642 func rewriteValuegeneric_OpLsh32x64(v *Value) bool {
13643 v_1 := v.Args[1]
13644 v_0 := v.Args[0]
13645 b := v.Block
13646 typ := &b.Func.Config.Types
13647
13648
13649 for {
13650 if v_0.Op != OpConst32 {
13651 break
13652 }
13653 c := auxIntToInt32(v_0.AuxInt)
13654 if v_1.Op != OpConst64 {
13655 break
13656 }
13657 d := auxIntToInt64(v_1.AuxInt)
13658 v.reset(OpConst32)
13659 v.AuxInt = int32ToAuxInt(c << uint64(d))
13660 return true
13661 }
13662
13663
13664 for {
13665 x := v_0
13666 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
13667 break
13668 }
13669 v.copyOf(x)
13670 return true
13671 }
13672
13673
13674 for {
13675 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
13676 break
13677 }
13678 v.reset(OpConst32)
13679 v.AuxInt = int32ToAuxInt(0)
13680 return true
13681 }
13682
13683
13684
13685 for {
13686 if v_1.Op != OpConst64 {
13687 break
13688 }
13689 c := auxIntToInt64(v_1.AuxInt)
13690 if !(uint64(c) >= 32) {
13691 break
13692 }
13693 v.reset(OpConst32)
13694 v.AuxInt = int32ToAuxInt(0)
13695 return true
13696 }
13697
13698
13699
13700 for {
13701 t := v.Type
13702 if v_0.Op != OpLsh32x64 {
13703 break
13704 }
13705 _ = v_0.Args[1]
13706 x := v_0.Args[0]
13707 v_0_1 := v_0.Args[1]
13708 if v_0_1.Op != OpConst64 {
13709 break
13710 }
13711 c := auxIntToInt64(v_0_1.AuxInt)
13712 if v_1.Op != OpConst64 {
13713 break
13714 }
13715 d := auxIntToInt64(v_1.AuxInt)
13716 if !(!uaddOvf(c, d)) {
13717 break
13718 }
13719 v.reset(OpLsh32x64)
13720 v0 := b.NewValue0(v.Pos, OpConst64, t)
13721 v0.AuxInt = int64ToAuxInt(c + d)
13722 v.AddArg2(x, v0)
13723 return true
13724 }
13725
13726
13727
13728 for {
13729 i := v_0
13730 if i.Op != OpRsh32x64 {
13731 break
13732 }
13733 _ = i.Args[1]
13734 x := i.Args[0]
13735 i_1 := i.Args[1]
13736 if i_1.Op != OpConst64 {
13737 break
13738 }
13739 c := auxIntToInt64(i_1.AuxInt)
13740 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
13741 break
13742 }
13743 v.reset(OpAnd32)
13744 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
13745 v0.AuxInt = int32ToAuxInt(int32(-1) << c)
13746 v.AddArg2(x, v0)
13747 return true
13748 }
13749
13750
13751
13752 for {
13753 i := v_0
13754 if i.Op != OpRsh32Ux64 {
13755 break
13756 }
13757 _ = i.Args[1]
13758 x := i.Args[0]
13759 i_1 := i.Args[1]
13760 if i_1.Op != OpConst64 {
13761 break
13762 }
13763 c := auxIntToInt64(i_1.AuxInt)
13764 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
13765 break
13766 }
13767 v.reset(OpAnd32)
13768 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
13769 v0.AuxInt = int32ToAuxInt(int32(-1) << c)
13770 v.AddArg2(x, v0)
13771 return true
13772 }
13773
13774
13775
13776 for {
13777 if v_0.Op != OpRsh32Ux64 {
13778 break
13779 }
13780 _ = v_0.Args[1]
13781 v_0_0 := v_0.Args[0]
13782 if v_0_0.Op != OpLsh32x64 {
13783 break
13784 }
13785 _ = v_0_0.Args[1]
13786 x := v_0_0.Args[0]
13787 v_0_0_1 := v_0_0.Args[1]
13788 if v_0_0_1.Op != OpConst64 {
13789 break
13790 }
13791 c1 := auxIntToInt64(v_0_0_1.AuxInt)
13792 v_0_1 := v_0.Args[1]
13793 if v_0_1.Op != OpConst64 {
13794 break
13795 }
13796 c2 := auxIntToInt64(v_0_1.AuxInt)
13797 if v_1.Op != OpConst64 {
13798 break
13799 }
13800 c3 := auxIntToInt64(v_1.AuxInt)
13801 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
13802 break
13803 }
13804 v.reset(OpLsh32x64)
13805 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
13806 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
13807 v.AddArg2(x, v0)
13808 return true
13809 }
13810
13811
13812
13813 for {
13814 if v_0.Op != OpAnd32 {
13815 break
13816 }
13817 _ = v_0.Args[1]
13818 v_0_0 := v_0.Args[0]
13819 v_0_1 := v_0.Args[1]
13820 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13821 if v_0_0.Op != OpRsh32x64 {
13822 continue
13823 }
13824 t := v_0_0.Type
13825 _ = v_0_0.Args[1]
13826 x := v_0_0.Args[0]
13827 v_0_0_1 := v_0_0.Args[1]
13828 if v_0_0_1.Op != OpConst64 {
13829 continue
13830 }
13831 t2 := v_0_0_1.Type
13832 c := auxIntToInt64(v_0_0_1.AuxInt)
13833 if v_0_1.Op != OpConst32 {
13834 continue
13835 }
13836 d := auxIntToInt32(v_0_1.AuxInt)
13837 if v_1.Op != OpConst64 {
13838 continue
13839 }
13840 e := auxIntToInt64(v_1.AuxInt)
13841 if !(c >= e) {
13842 continue
13843 }
13844 v.reset(OpAnd32)
13845 v0 := b.NewValue0(v.Pos, OpRsh32x64, t)
13846 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13847 v1.AuxInt = int64ToAuxInt(c - e)
13848 v0.AddArg2(x, v1)
13849 v2 := b.NewValue0(v.Pos, OpConst32, t)
13850 v2.AuxInt = int32ToAuxInt(d << e)
13851 v.AddArg2(v0, v2)
13852 return true
13853 }
13854 break
13855 }
13856
13857
13858
13859 for {
13860 if v_0.Op != OpAnd32 {
13861 break
13862 }
13863 _ = v_0.Args[1]
13864 v_0_0 := v_0.Args[0]
13865 v_0_1 := v_0.Args[1]
13866 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13867 if v_0_0.Op != OpRsh32Ux64 {
13868 continue
13869 }
13870 t := v_0_0.Type
13871 _ = v_0_0.Args[1]
13872 x := v_0_0.Args[0]
13873 v_0_0_1 := v_0_0.Args[1]
13874 if v_0_0_1.Op != OpConst64 {
13875 continue
13876 }
13877 t2 := v_0_0_1.Type
13878 c := auxIntToInt64(v_0_0_1.AuxInt)
13879 if v_0_1.Op != OpConst32 {
13880 continue
13881 }
13882 d := auxIntToInt32(v_0_1.AuxInt)
13883 if v_1.Op != OpConst64 {
13884 continue
13885 }
13886 e := auxIntToInt64(v_1.AuxInt)
13887 if !(c >= e) {
13888 continue
13889 }
13890 v.reset(OpAnd32)
13891 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, t)
13892 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13893 v1.AuxInt = int64ToAuxInt(c - e)
13894 v0.AddArg2(x, v1)
13895 v2 := b.NewValue0(v.Pos, OpConst32, t)
13896 v2.AuxInt = int32ToAuxInt(d << e)
13897 v.AddArg2(v0, v2)
13898 return true
13899 }
13900 break
13901 }
13902
13903
13904
13905 for {
13906 if v_0.Op != OpAnd32 {
13907 break
13908 }
13909 _ = v_0.Args[1]
13910 v_0_0 := v_0.Args[0]
13911 v_0_1 := v_0.Args[1]
13912 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13913 if v_0_0.Op != OpRsh32x64 {
13914 continue
13915 }
13916 t := v_0_0.Type
13917 _ = v_0_0.Args[1]
13918 x := v_0_0.Args[0]
13919 v_0_0_1 := v_0_0.Args[1]
13920 if v_0_0_1.Op != OpConst64 {
13921 continue
13922 }
13923 t2 := v_0_0_1.Type
13924 c := auxIntToInt64(v_0_0_1.AuxInt)
13925 if v_0_1.Op != OpConst32 {
13926 continue
13927 }
13928 d := auxIntToInt32(v_0_1.AuxInt)
13929 if v_1.Op != OpConst64 {
13930 continue
13931 }
13932 e := auxIntToInt64(v_1.AuxInt)
13933 if !(c < e) {
13934 continue
13935 }
13936 v.reset(OpAnd32)
13937 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
13938 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13939 v1.AuxInt = int64ToAuxInt(e - c)
13940 v0.AddArg2(x, v1)
13941 v2 := b.NewValue0(v.Pos, OpConst32, t)
13942 v2.AuxInt = int32ToAuxInt(d << e)
13943 v.AddArg2(v0, v2)
13944 return true
13945 }
13946 break
13947 }
13948
13949
13950
13951 for {
13952 if v_0.Op != OpAnd32 {
13953 break
13954 }
13955 _ = v_0.Args[1]
13956 v_0_0 := v_0.Args[0]
13957 v_0_1 := v_0.Args[1]
13958 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13959 if v_0_0.Op != OpRsh32Ux64 {
13960 continue
13961 }
13962 t := v_0_0.Type
13963 _ = v_0_0.Args[1]
13964 x := v_0_0.Args[0]
13965 v_0_0_1 := v_0_0.Args[1]
13966 if v_0_0_1.Op != OpConst64 {
13967 continue
13968 }
13969 t2 := v_0_0_1.Type
13970 c := auxIntToInt64(v_0_0_1.AuxInt)
13971 if v_0_1.Op != OpConst32 {
13972 continue
13973 }
13974 d := auxIntToInt32(v_0_1.AuxInt)
13975 if v_1.Op != OpConst64 {
13976 continue
13977 }
13978 e := auxIntToInt64(v_1.AuxInt)
13979 if !(c < e) {
13980 continue
13981 }
13982 v.reset(OpAnd32)
13983 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
13984 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13985 v1.AuxInt = int64ToAuxInt(e - c)
13986 v0.AddArg2(x, v1)
13987 v2 := b.NewValue0(v.Pos, OpConst32, t)
13988 v2.AuxInt = int32ToAuxInt(d << e)
13989 v.AddArg2(v0, v2)
13990 return true
13991 }
13992 break
13993 }
13994
13995
13996
13997 for {
13998 if auxIntToBool(v.AuxInt) != false {
13999 break
14000 }
14001 x := v_0
14002 con := v_1
14003 if con.Op != OpConst64 {
14004 break
14005 }
14006 c := auxIntToInt64(con.AuxInt)
14007 if !(0 < c && c < 32) {
14008 break
14009 }
14010 v.reset(OpLsh32x64)
14011 v.AuxInt = boolToAuxInt(true)
14012 v.AddArg2(x, con)
14013 return true
14014 }
14015 return false
14016 }
14017 func rewriteValuegeneric_OpLsh32x8(v *Value) bool {
14018 v_1 := v.Args[1]
14019 v_0 := v.Args[0]
14020 b := v.Block
14021
14022
14023 for {
14024 t := v.Type
14025 x := v_0
14026 if v_1.Op != OpConst8 {
14027 break
14028 }
14029 c := auxIntToInt8(v_1.AuxInt)
14030 v.reset(OpLsh32x64)
14031 v0 := b.NewValue0(v.Pos, OpConst64, t)
14032 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
14033 v.AddArg2(x, v0)
14034 return true
14035 }
14036
14037
14038 for {
14039 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
14040 break
14041 }
14042 v.reset(OpConst32)
14043 v.AuxInt = int32ToAuxInt(0)
14044 return true
14045 }
14046
14047
14048
14049 for {
14050 if auxIntToBool(v.AuxInt) != false {
14051 break
14052 }
14053 x := v_0
14054 con := v_1
14055 if con.Op != OpConst8 {
14056 break
14057 }
14058 c := auxIntToInt8(con.AuxInt)
14059 if !(0 < c && c < 32) {
14060 break
14061 }
14062 v.reset(OpLsh32x8)
14063 v.AuxInt = boolToAuxInt(true)
14064 v.AddArg2(x, con)
14065 return true
14066 }
14067 return false
14068 }
14069 func rewriteValuegeneric_OpLsh64x16(v *Value) bool {
14070 v_1 := v.Args[1]
14071 v_0 := v.Args[0]
14072 b := v.Block
14073
14074
14075 for {
14076 t := v.Type
14077 x := v_0
14078 if v_1.Op != OpConst16 {
14079 break
14080 }
14081 c := auxIntToInt16(v_1.AuxInt)
14082 v.reset(OpLsh64x64)
14083 v0 := b.NewValue0(v.Pos, OpConst64, t)
14084 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
14085 v.AddArg2(x, v0)
14086 return true
14087 }
14088
14089
14090 for {
14091 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
14092 break
14093 }
14094 v.reset(OpConst64)
14095 v.AuxInt = int64ToAuxInt(0)
14096 return true
14097 }
14098
14099
14100
14101 for {
14102 if auxIntToBool(v.AuxInt) != false {
14103 break
14104 }
14105 x := v_0
14106 con := v_1
14107 if con.Op != OpConst16 {
14108 break
14109 }
14110 c := auxIntToInt16(con.AuxInt)
14111 if !(0 < c && c < 64) {
14112 break
14113 }
14114 v.reset(OpLsh64x16)
14115 v.AuxInt = boolToAuxInt(true)
14116 v.AddArg2(x, con)
14117 return true
14118 }
14119 return false
14120 }
14121 func rewriteValuegeneric_OpLsh64x32(v *Value) bool {
14122 v_1 := v.Args[1]
14123 v_0 := v.Args[0]
14124 b := v.Block
14125
14126
14127 for {
14128 t := v.Type
14129 x := v_0
14130 if v_1.Op != OpConst32 {
14131 break
14132 }
14133 c := auxIntToInt32(v_1.AuxInt)
14134 v.reset(OpLsh64x64)
14135 v0 := b.NewValue0(v.Pos, OpConst64, t)
14136 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
14137 v.AddArg2(x, v0)
14138 return true
14139 }
14140
14141
14142 for {
14143 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
14144 break
14145 }
14146 v.reset(OpConst64)
14147 v.AuxInt = int64ToAuxInt(0)
14148 return true
14149 }
14150
14151
14152
14153 for {
14154 if auxIntToBool(v.AuxInt) != false {
14155 break
14156 }
14157 x := v_0
14158 con := v_1
14159 if con.Op != OpConst32 {
14160 break
14161 }
14162 c := auxIntToInt32(con.AuxInt)
14163 if !(0 < c && c < 64) {
14164 break
14165 }
14166 v.reset(OpLsh64x32)
14167 v.AuxInt = boolToAuxInt(true)
14168 v.AddArg2(x, con)
14169 return true
14170 }
14171 return false
14172 }
14173 func rewriteValuegeneric_OpLsh64x64(v *Value) bool {
14174 v_1 := v.Args[1]
14175 v_0 := v.Args[0]
14176 b := v.Block
14177 typ := &b.Func.Config.Types
14178
14179
14180 for {
14181 if v_0.Op != OpConst64 {
14182 break
14183 }
14184 c := auxIntToInt64(v_0.AuxInt)
14185 if v_1.Op != OpConst64 {
14186 break
14187 }
14188 d := auxIntToInt64(v_1.AuxInt)
14189 v.reset(OpConst64)
14190 v.AuxInt = int64ToAuxInt(c << uint64(d))
14191 return true
14192 }
14193
14194
14195 for {
14196 x := v_0
14197 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
14198 break
14199 }
14200 v.copyOf(x)
14201 return true
14202 }
14203
14204
14205 for {
14206 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
14207 break
14208 }
14209 v.reset(OpConst64)
14210 v.AuxInt = int64ToAuxInt(0)
14211 return true
14212 }
14213
14214
14215
14216 for {
14217 if v_1.Op != OpConst64 {
14218 break
14219 }
14220 c := auxIntToInt64(v_1.AuxInt)
14221 if !(uint64(c) >= 64) {
14222 break
14223 }
14224 v.reset(OpConst64)
14225 v.AuxInt = int64ToAuxInt(0)
14226 return true
14227 }
14228
14229
14230
14231 for {
14232 t := v.Type
14233 if v_0.Op != OpLsh64x64 {
14234 break
14235 }
14236 _ = v_0.Args[1]
14237 x := v_0.Args[0]
14238 v_0_1 := v_0.Args[1]
14239 if v_0_1.Op != OpConst64 {
14240 break
14241 }
14242 c := auxIntToInt64(v_0_1.AuxInt)
14243 if v_1.Op != OpConst64 {
14244 break
14245 }
14246 d := auxIntToInt64(v_1.AuxInt)
14247 if !(!uaddOvf(c, d)) {
14248 break
14249 }
14250 v.reset(OpLsh64x64)
14251 v0 := b.NewValue0(v.Pos, OpConst64, t)
14252 v0.AuxInt = int64ToAuxInt(c + d)
14253 v.AddArg2(x, v0)
14254 return true
14255 }
14256
14257
14258
14259 for {
14260 i := v_0
14261 if i.Op != OpRsh64x64 {
14262 break
14263 }
14264 _ = i.Args[1]
14265 x := i.Args[0]
14266 i_1 := i.Args[1]
14267 if i_1.Op != OpConst64 {
14268 break
14269 }
14270 c := auxIntToInt64(i_1.AuxInt)
14271 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
14272 break
14273 }
14274 v.reset(OpAnd64)
14275 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
14276 v0.AuxInt = int64ToAuxInt(int64(-1) << c)
14277 v.AddArg2(x, v0)
14278 return true
14279 }
14280
14281
14282
14283 for {
14284 i := v_0
14285 if i.Op != OpRsh64Ux64 {
14286 break
14287 }
14288 _ = i.Args[1]
14289 x := i.Args[0]
14290 i_1 := i.Args[1]
14291 if i_1.Op != OpConst64 {
14292 break
14293 }
14294 c := auxIntToInt64(i_1.AuxInt)
14295 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
14296 break
14297 }
14298 v.reset(OpAnd64)
14299 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
14300 v0.AuxInt = int64ToAuxInt(int64(-1) << c)
14301 v.AddArg2(x, v0)
14302 return true
14303 }
14304
14305
14306
14307 for {
14308 if v_0.Op != OpRsh64Ux64 {
14309 break
14310 }
14311 _ = v_0.Args[1]
14312 v_0_0 := v_0.Args[0]
14313 if v_0_0.Op != OpLsh64x64 {
14314 break
14315 }
14316 _ = v_0_0.Args[1]
14317 x := v_0_0.Args[0]
14318 v_0_0_1 := v_0_0.Args[1]
14319 if v_0_0_1.Op != OpConst64 {
14320 break
14321 }
14322 c1 := auxIntToInt64(v_0_0_1.AuxInt)
14323 v_0_1 := v_0.Args[1]
14324 if v_0_1.Op != OpConst64 {
14325 break
14326 }
14327 c2 := auxIntToInt64(v_0_1.AuxInt)
14328 if v_1.Op != OpConst64 {
14329 break
14330 }
14331 c3 := auxIntToInt64(v_1.AuxInt)
14332 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
14333 break
14334 }
14335 v.reset(OpLsh64x64)
14336 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
14337 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
14338 v.AddArg2(x, v0)
14339 return true
14340 }
14341
14342
14343
14344 for {
14345 if v_0.Op != OpAnd64 {
14346 break
14347 }
14348 _ = v_0.Args[1]
14349 v_0_0 := v_0.Args[0]
14350 v_0_1 := v_0.Args[1]
14351 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14352 if v_0_0.Op != OpRsh64x64 {
14353 continue
14354 }
14355 t := v_0_0.Type
14356 _ = v_0_0.Args[1]
14357 x := v_0_0.Args[0]
14358 v_0_0_1 := v_0_0.Args[1]
14359 if v_0_0_1.Op != OpConst64 {
14360 continue
14361 }
14362 t2 := v_0_0_1.Type
14363 c := auxIntToInt64(v_0_0_1.AuxInt)
14364 if v_0_1.Op != OpConst64 {
14365 continue
14366 }
14367 d := auxIntToInt64(v_0_1.AuxInt)
14368 if v_1.Op != OpConst64 {
14369 continue
14370 }
14371 e := auxIntToInt64(v_1.AuxInt)
14372 if !(c >= e) {
14373 continue
14374 }
14375 v.reset(OpAnd64)
14376 v0 := b.NewValue0(v.Pos, OpRsh64x64, t)
14377 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14378 v1.AuxInt = int64ToAuxInt(c - e)
14379 v0.AddArg2(x, v1)
14380 v2 := b.NewValue0(v.Pos, OpConst64, t)
14381 v2.AuxInt = int64ToAuxInt(d << e)
14382 v.AddArg2(v0, v2)
14383 return true
14384 }
14385 break
14386 }
14387
14388
14389
14390 for {
14391 if v_0.Op != OpAnd64 {
14392 break
14393 }
14394 _ = v_0.Args[1]
14395 v_0_0 := v_0.Args[0]
14396 v_0_1 := v_0.Args[1]
14397 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14398 if v_0_0.Op != OpRsh64Ux64 {
14399 continue
14400 }
14401 t := v_0_0.Type
14402 _ = v_0_0.Args[1]
14403 x := v_0_0.Args[0]
14404 v_0_0_1 := v_0_0.Args[1]
14405 if v_0_0_1.Op != OpConst64 {
14406 continue
14407 }
14408 t2 := v_0_0_1.Type
14409 c := auxIntToInt64(v_0_0_1.AuxInt)
14410 if v_0_1.Op != OpConst64 {
14411 continue
14412 }
14413 d := auxIntToInt64(v_0_1.AuxInt)
14414 if v_1.Op != OpConst64 {
14415 continue
14416 }
14417 e := auxIntToInt64(v_1.AuxInt)
14418 if !(c >= e) {
14419 continue
14420 }
14421 v.reset(OpAnd64)
14422 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t)
14423 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14424 v1.AuxInt = int64ToAuxInt(c - e)
14425 v0.AddArg2(x, v1)
14426 v2 := b.NewValue0(v.Pos, OpConst64, t)
14427 v2.AuxInt = int64ToAuxInt(d << e)
14428 v.AddArg2(v0, v2)
14429 return true
14430 }
14431 break
14432 }
14433
14434
14435
14436 for {
14437 if v_0.Op != OpAnd64 {
14438 break
14439 }
14440 _ = v_0.Args[1]
14441 v_0_0 := v_0.Args[0]
14442 v_0_1 := v_0.Args[1]
14443 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14444 if v_0_0.Op != OpRsh64x64 {
14445 continue
14446 }
14447 t := v_0_0.Type
14448 _ = v_0_0.Args[1]
14449 x := v_0_0.Args[0]
14450 v_0_0_1 := v_0_0.Args[1]
14451 if v_0_0_1.Op != OpConst64 {
14452 continue
14453 }
14454 t2 := v_0_0_1.Type
14455 c := auxIntToInt64(v_0_0_1.AuxInt)
14456 if v_0_1.Op != OpConst64 {
14457 continue
14458 }
14459 d := auxIntToInt64(v_0_1.AuxInt)
14460 if v_1.Op != OpConst64 {
14461 continue
14462 }
14463 e := auxIntToInt64(v_1.AuxInt)
14464 if !(c < e) {
14465 continue
14466 }
14467 v.reset(OpAnd64)
14468 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
14469 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14470 v1.AuxInt = int64ToAuxInt(e - c)
14471 v0.AddArg2(x, v1)
14472 v2 := b.NewValue0(v.Pos, OpConst64, t)
14473 v2.AuxInt = int64ToAuxInt(d << e)
14474 v.AddArg2(v0, v2)
14475 return true
14476 }
14477 break
14478 }
14479
14480
14481
14482 for {
14483 if v_0.Op != OpAnd64 {
14484 break
14485 }
14486 _ = v_0.Args[1]
14487 v_0_0 := v_0.Args[0]
14488 v_0_1 := v_0.Args[1]
14489 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14490 if v_0_0.Op != OpRsh64Ux64 {
14491 continue
14492 }
14493 t := v_0_0.Type
14494 _ = v_0_0.Args[1]
14495 x := v_0_0.Args[0]
14496 v_0_0_1 := v_0_0.Args[1]
14497 if v_0_0_1.Op != OpConst64 {
14498 continue
14499 }
14500 t2 := v_0_0_1.Type
14501 c := auxIntToInt64(v_0_0_1.AuxInt)
14502 if v_0_1.Op != OpConst64 {
14503 continue
14504 }
14505 d := auxIntToInt64(v_0_1.AuxInt)
14506 if v_1.Op != OpConst64 {
14507 continue
14508 }
14509 e := auxIntToInt64(v_1.AuxInt)
14510 if !(c < e) {
14511 continue
14512 }
14513 v.reset(OpAnd64)
14514 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
14515 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14516 v1.AuxInt = int64ToAuxInt(e - c)
14517 v0.AddArg2(x, v1)
14518 v2 := b.NewValue0(v.Pos, OpConst64, t)
14519 v2.AuxInt = int64ToAuxInt(d << e)
14520 v.AddArg2(v0, v2)
14521 return true
14522 }
14523 break
14524 }
14525
14526
14527
14528 for {
14529 if auxIntToBool(v.AuxInt) != false {
14530 break
14531 }
14532 x := v_0
14533 con := v_1
14534 if con.Op != OpConst64 {
14535 break
14536 }
14537 c := auxIntToInt64(con.AuxInt)
14538 if !(0 < c && c < 64) {
14539 break
14540 }
14541 v.reset(OpLsh64x64)
14542 v.AuxInt = boolToAuxInt(true)
14543 v.AddArg2(x, con)
14544 return true
14545 }
14546 return false
14547 }
14548 func rewriteValuegeneric_OpLsh64x8(v *Value) bool {
14549 v_1 := v.Args[1]
14550 v_0 := v.Args[0]
14551 b := v.Block
14552
14553
14554 for {
14555 t := v.Type
14556 x := v_0
14557 if v_1.Op != OpConst8 {
14558 break
14559 }
14560 c := auxIntToInt8(v_1.AuxInt)
14561 v.reset(OpLsh64x64)
14562 v0 := b.NewValue0(v.Pos, OpConst64, t)
14563 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
14564 v.AddArg2(x, v0)
14565 return true
14566 }
14567
14568
14569 for {
14570 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
14571 break
14572 }
14573 v.reset(OpConst64)
14574 v.AuxInt = int64ToAuxInt(0)
14575 return true
14576 }
14577
14578
14579
14580 for {
14581 if auxIntToBool(v.AuxInt) != false {
14582 break
14583 }
14584 x := v_0
14585 con := v_1
14586 if con.Op != OpConst8 {
14587 break
14588 }
14589 c := auxIntToInt8(con.AuxInt)
14590 if !(0 < c && c < 64) {
14591 break
14592 }
14593 v.reset(OpLsh64x8)
14594 v.AuxInt = boolToAuxInt(true)
14595 v.AddArg2(x, con)
14596 return true
14597 }
14598 return false
14599 }
14600 func rewriteValuegeneric_OpLsh8x16(v *Value) bool {
14601 v_1 := v.Args[1]
14602 v_0 := v.Args[0]
14603 b := v.Block
14604
14605
14606 for {
14607 t := v.Type
14608 x := v_0
14609 if v_1.Op != OpConst16 {
14610 break
14611 }
14612 c := auxIntToInt16(v_1.AuxInt)
14613 v.reset(OpLsh8x64)
14614 v0 := b.NewValue0(v.Pos, OpConst64, t)
14615 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
14616 v.AddArg2(x, v0)
14617 return true
14618 }
14619
14620
14621 for {
14622 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
14623 break
14624 }
14625 v.reset(OpConst8)
14626 v.AuxInt = int8ToAuxInt(0)
14627 return true
14628 }
14629
14630
14631
14632 for {
14633 if auxIntToBool(v.AuxInt) != false {
14634 break
14635 }
14636 x := v_0
14637 con := v_1
14638 if con.Op != OpConst16 {
14639 break
14640 }
14641 c := auxIntToInt16(con.AuxInt)
14642 if !(0 < c && c < 8) {
14643 break
14644 }
14645 v.reset(OpLsh8x16)
14646 v.AuxInt = boolToAuxInt(true)
14647 v.AddArg2(x, con)
14648 return true
14649 }
14650 return false
14651 }
14652 func rewriteValuegeneric_OpLsh8x32(v *Value) bool {
14653 v_1 := v.Args[1]
14654 v_0 := v.Args[0]
14655 b := v.Block
14656
14657
14658 for {
14659 t := v.Type
14660 x := v_0
14661 if v_1.Op != OpConst32 {
14662 break
14663 }
14664 c := auxIntToInt32(v_1.AuxInt)
14665 v.reset(OpLsh8x64)
14666 v0 := b.NewValue0(v.Pos, OpConst64, t)
14667 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
14668 v.AddArg2(x, v0)
14669 return true
14670 }
14671
14672
14673 for {
14674 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
14675 break
14676 }
14677 v.reset(OpConst8)
14678 v.AuxInt = int8ToAuxInt(0)
14679 return true
14680 }
14681
14682
14683
14684 for {
14685 if auxIntToBool(v.AuxInt) != false {
14686 break
14687 }
14688 x := v_0
14689 con := v_1
14690 if con.Op != OpConst32 {
14691 break
14692 }
14693 c := auxIntToInt32(con.AuxInt)
14694 if !(0 < c && c < 8) {
14695 break
14696 }
14697 v.reset(OpLsh8x32)
14698 v.AuxInt = boolToAuxInt(true)
14699 v.AddArg2(x, con)
14700 return true
14701 }
14702 return false
14703 }
14704 func rewriteValuegeneric_OpLsh8x64(v *Value) bool {
14705 v_1 := v.Args[1]
14706 v_0 := v.Args[0]
14707 b := v.Block
14708 typ := &b.Func.Config.Types
14709
14710
14711 for {
14712 if v_0.Op != OpConst8 {
14713 break
14714 }
14715 c := auxIntToInt8(v_0.AuxInt)
14716 if v_1.Op != OpConst64 {
14717 break
14718 }
14719 d := auxIntToInt64(v_1.AuxInt)
14720 v.reset(OpConst8)
14721 v.AuxInt = int8ToAuxInt(c << uint64(d))
14722 return true
14723 }
14724
14725
14726 for {
14727 x := v_0
14728 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
14729 break
14730 }
14731 v.copyOf(x)
14732 return true
14733 }
14734
14735
14736 for {
14737 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
14738 break
14739 }
14740 v.reset(OpConst8)
14741 v.AuxInt = int8ToAuxInt(0)
14742 return true
14743 }
14744
14745
14746
14747 for {
14748 if v_1.Op != OpConst64 {
14749 break
14750 }
14751 c := auxIntToInt64(v_1.AuxInt)
14752 if !(uint64(c) >= 8) {
14753 break
14754 }
14755 v.reset(OpConst8)
14756 v.AuxInt = int8ToAuxInt(0)
14757 return true
14758 }
14759
14760
14761
14762 for {
14763 t := v.Type
14764 if v_0.Op != OpLsh8x64 {
14765 break
14766 }
14767 _ = v_0.Args[1]
14768 x := v_0.Args[0]
14769 v_0_1 := v_0.Args[1]
14770 if v_0_1.Op != OpConst64 {
14771 break
14772 }
14773 c := auxIntToInt64(v_0_1.AuxInt)
14774 if v_1.Op != OpConst64 {
14775 break
14776 }
14777 d := auxIntToInt64(v_1.AuxInt)
14778 if !(!uaddOvf(c, d)) {
14779 break
14780 }
14781 v.reset(OpLsh8x64)
14782 v0 := b.NewValue0(v.Pos, OpConst64, t)
14783 v0.AuxInt = int64ToAuxInt(c + d)
14784 v.AddArg2(x, v0)
14785 return true
14786 }
14787
14788
14789
14790 for {
14791 i := v_0
14792 if i.Op != OpRsh8x64 {
14793 break
14794 }
14795 _ = i.Args[1]
14796 x := i.Args[0]
14797 i_1 := i.Args[1]
14798 if i_1.Op != OpConst64 {
14799 break
14800 }
14801 c := auxIntToInt64(i_1.AuxInt)
14802 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
14803 break
14804 }
14805 v.reset(OpAnd8)
14806 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
14807 v0.AuxInt = int8ToAuxInt(int8(-1) << c)
14808 v.AddArg2(x, v0)
14809 return true
14810 }
14811
14812
14813
14814 for {
14815 i := v_0
14816 if i.Op != OpRsh8Ux64 {
14817 break
14818 }
14819 _ = i.Args[1]
14820 x := i.Args[0]
14821 i_1 := i.Args[1]
14822 if i_1.Op != OpConst64 {
14823 break
14824 }
14825 c := auxIntToInt64(i_1.AuxInt)
14826 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
14827 break
14828 }
14829 v.reset(OpAnd8)
14830 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
14831 v0.AuxInt = int8ToAuxInt(int8(-1) << c)
14832 v.AddArg2(x, v0)
14833 return true
14834 }
14835
14836
14837
14838 for {
14839 if v_0.Op != OpRsh8Ux64 {
14840 break
14841 }
14842 _ = v_0.Args[1]
14843 v_0_0 := v_0.Args[0]
14844 if v_0_0.Op != OpLsh8x64 {
14845 break
14846 }
14847 _ = v_0_0.Args[1]
14848 x := v_0_0.Args[0]
14849 v_0_0_1 := v_0_0.Args[1]
14850 if v_0_0_1.Op != OpConst64 {
14851 break
14852 }
14853 c1 := auxIntToInt64(v_0_0_1.AuxInt)
14854 v_0_1 := v_0.Args[1]
14855 if v_0_1.Op != OpConst64 {
14856 break
14857 }
14858 c2 := auxIntToInt64(v_0_1.AuxInt)
14859 if v_1.Op != OpConst64 {
14860 break
14861 }
14862 c3 := auxIntToInt64(v_1.AuxInt)
14863 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
14864 break
14865 }
14866 v.reset(OpLsh8x64)
14867 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
14868 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
14869 v.AddArg2(x, v0)
14870 return true
14871 }
14872
14873
14874
14875 for {
14876 if v_0.Op != OpAnd8 {
14877 break
14878 }
14879 _ = v_0.Args[1]
14880 v_0_0 := v_0.Args[0]
14881 v_0_1 := v_0.Args[1]
14882 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14883 if v_0_0.Op != OpRsh8x64 {
14884 continue
14885 }
14886 t := v_0_0.Type
14887 _ = v_0_0.Args[1]
14888 x := v_0_0.Args[0]
14889 v_0_0_1 := v_0_0.Args[1]
14890 if v_0_0_1.Op != OpConst64 {
14891 continue
14892 }
14893 t2 := v_0_0_1.Type
14894 c := auxIntToInt64(v_0_0_1.AuxInt)
14895 if v_0_1.Op != OpConst8 {
14896 continue
14897 }
14898 d := auxIntToInt8(v_0_1.AuxInt)
14899 if v_1.Op != OpConst64 {
14900 continue
14901 }
14902 e := auxIntToInt64(v_1.AuxInt)
14903 if !(c >= e) {
14904 continue
14905 }
14906 v.reset(OpAnd8)
14907 v0 := b.NewValue0(v.Pos, OpRsh8x64, t)
14908 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14909 v1.AuxInt = int64ToAuxInt(c - e)
14910 v0.AddArg2(x, v1)
14911 v2 := b.NewValue0(v.Pos, OpConst8, t)
14912 v2.AuxInt = int8ToAuxInt(d << e)
14913 v.AddArg2(v0, v2)
14914 return true
14915 }
14916 break
14917 }
14918
14919
14920
14921 for {
14922 if v_0.Op != OpAnd8 {
14923 break
14924 }
14925 _ = v_0.Args[1]
14926 v_0_0 := v_0.Args[0]
14927 v_0_1 := v_0.Args[1]
14928 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14929 if v_0_0.Op != OpRsh8Ux64 {
14930 continue
14931 }
14932 t := v_0_0.Type
14933 _ = v_0_0.Args[1]
14934 x := v_0_0.Args[0]
14935 v_0_0_1 := v_0_0.Args[1]
14936 if v_0_0_1.Op != OpConst64 {
14937 continue
14938 }
14939 t2 := v_0_0_1.Type
14940 c := auxIntToInt64(v_0_0_1.AuxInt)
14941 if v_0_1.Op != OpConst8 {
14942 continue
14943 }
14944 d := auxIntToInt8(v_0_1.AuxInt)
14945 if v_1.Op != OpConst64 {
14946 continue
14947 }
14948 e := auxIntToInt64(v_1.AuxInt)
14949 if !(c >= e) {
14950 continue
14951 }
14952 v.reset(OpAnd8)
14953 v0 := b.NewValue0(v.Pos, OpRsh8Ux64, t)
14954 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14955 v1.AuxInt = int64ToAuxInt(c - e)
14956 v0.AddArg2(x, v1)
14957 v2 := b.NewValue0(v.Pos, OpConst8, t)
14958 v2.AuxInt = int8ToAuxInt(d << e)
14959 v.AddArg2(v0, v2)
14960 return true
14961 }
14962 break
14963 }
14964
14965
14966
14967 for {
14968 if v_0.Op != OpAnd8 {
14969 break
14970 }
14971 _ = v_0.Args[1]
14972 v_0_0 := v_0.Args[0]
14973 v_0_1 := v_0.Args[1]
14974 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14975 if v_0_0.Op != OpRsh8x64 {
14976 continue
14977 }
14978 t := v_0_0.Type
14979 _ = v_0_0.Args[1]
14980 x := v_0_0.Args[0]
14981 v_0_0_1 := v_0_0.Args[1]
14982 if v_0_0_1.Op != OpConst64 {
14983 continue
14984 }
14985 t2 := v_0_0_1.Type
14986 c := auxIntToInt64(v_0_0_1.AuxInt)
14987 if v_0_1.Op != OpConst8 {
14988 continue
14989 }
14990 d := auxIntToInt8(v_0_1.AuxInt)
14991 if v_1.Op != OpConst64 {
14992 continue
14993 }
14994 e := auxIntToInt64(v_1.AuxInt)
14995 if !(c < e) {
14996 continue
14997 }
14998 v.reset(OpAnd8)
14999 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
15000 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15001 v1.AuxInt = int64ToAuxInt(e - c)
15002 v0.AddArg2(x, v1)
15003 v2 := b.NewValue0(v.Pos, OpConst8, t)
15004 v2.AuxInt = int8ToAuxInt(d << e)
15005 v.AddArg2(v0, v2)
15006 return true
15007 }
15008 break
15009 }
15010
15011
15012
15013 for {
15014 if v_0.Op != OpAnd8 {
15015 break
15016 }
15017 _ = v_0.Args[1]
15018 v_0_0 := v_0.Args[0]
15019 v_0_1 := v_0.Args[1]
15020 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15021 if v_0_0.Op != OpRsh8Ux64 {
15022 continue
15023 }
15024 t := v_0_0.Type
15025 _ = v_0_0.Args[1]
15026 x := v_0_0.Args[0]
15027 v_0_0_1 := v_0_0.Args[1]
15028 if v_0_0_1.Op != OpConst64 {
15029 continue
15030 }
15031 t2 := v_0_0_1.Type
15032 c := auxIntToInt64(v_0_0_1.AuxInt)
15033 if v_0_1.Op != OpConst8 {
15034 continue
15035 }
15036 d := auxIntToInt8(v_0_1.AuxInt)
15037 if v_1.Op != OpConst64 {
15038 continue
15039 }
15040 e := auxIntToInt64(v_1.AuxInt)
15041 if !(c < e) {
15042 continue
15043 }
15044 v.reset(OpAnd8)
15045 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
15046 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15047 v1.AuxInt = int64ToAuxInt(e - c)
15048 v0.AddArg2(x, v1)
15049 v2 := b.NewValue0(v.Pos, OpConst8, t)
15050 v2.AuxInt = int8ToAuxInt(d << e)
15051 v.AddArg2(v0, v2)
15052 return true
15053 }
15054 break
15055 }
15056
15057
15058
15059 for {
15060 if auxIntToBool(v.AuxInt) != false {
15061 break
15062 }
15063 x := v_0
15064 con := v_1
15065 if con.Op != OpConst64 {
15066 break
15067 }
15068 c := auxIntToInt64(con.AuxInt)
15069 if !(0 < c && c < 8) {
15070 break
15071 }
15072 v.reset(OpLsh8x64)
15073 v.AuxInt = boolToAuxInt(true)
15074 v.AddArg2(x, con)
15075 return true
15076 }
15077 return false
15078 }
15079 func rewriteValuegeneric_OpLsh8x8(v *Value) bool {
15080 v_1 := v.Args[1]
15081 v_0 := v.Args[0]
15082 b := v.Block
15083
15084
15085 for {
15086 t := v.Type
15087 x := v_0
15088 if v_1.Op != OpConst8 {
15089 break
15090 }
15091 c := auxIntToInt8(v_1.AuxInt)
15092 v.reset(OpLsh8x64)
15093 v0 := b.NewValue0(v.Pos, OpConst64, t)
15094 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
15095 v.AddArg2(x, v0)
15096 return true
15097 }
15098
15099
15100 for {
15101 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
15102 break
15103 }
15104 v.reset(OpConst8)
15105 v.AuxInt = int8ToAuxInt(0)
15106 return true
15107 }
15108
15109
15110
15111 for {
15112 if auxIntToBool(v.AuxInt) != false {
15113 break
15114 }
15115 x := v_0
15116 con := v_1
15117 if con.Op != OpConst8 {
15118 break
15119 }
15120 c := auxIntToInt8(con.AuxInt)
15121 if !(0 < c && c < 8) {
15122 break
15123 }
15124 v.reset(OpLsh8x8)
15125 v.AuxInt = boolToAuxInt(true)
15126 v.AddArg2(x, con)
15127 return true
15128 }
15129 return false
15130 }
15131 func rewriteValuegeneric_OpMemEq(v *Value) bool {
15132 v_3 := v.Args[3]
15133 v_2 := v.Args[2]
15134 v_1 := v.Args[1]
15135 v_0 := v.Args[0]
15136 b := v.Block
15137 config := b.Func.Config
15138 typ := &b.Func.Config.Types
15139
15140
15141 for {
15142 sptr := v_0
15143 tptr := v_1
15144 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 {
15145 break
15146 }
15147 mem := v_3
15148 v.reset(OpEq8)
15149 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
15150 v0.AddArg2(sptr, mem)
15151 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
15152 v1.AddArg2(tptr, mem)
15153 v.AddArg2(v0, v1)
15154 return true
15155 }
15156
15157
15158
15159 for {
15160 sptr := v_0
15161 tptr := v_1
15162 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 {
15163 break
15164 }
15165 mem := v_3
15166 if !(canLoadUnaligned(config)) {
15167 break
15168 }
15169 v.reset(OpEq16)
15170 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
15171 v0.AddArg2(sptr, mem)
15172 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
15173 v1.AddArg2(tptr, mem)
15174 v.AddArg2(v0, v1)
15175 return true
15176 }
15177
15178
15179
15180 for {
15181 sptr := v_0
15182 tptr := v_1
15183 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 {
15184 break
15185 }
15186 mem := v_3
15187 if !(canLoadUnaligned(config)) {
15188 break
15189 }
15190 v.reset(OpEq32)
15191 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
15192 v0.AddArg2(sptr, mem)
15193 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
15194 v1.AddArg2(tptr, mem)
15195 v.AddArg2(v0, v1)
15196 return true
15197 }
15198
15199
15200
15201 for {
15202 sptr := v_0
15203 tptr := v_1
15204 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 {
15205 break
15206 }
15207 mem := v_3
15208 if !(canLoadUnaligned(config) && config.PtrSize == 8) {
15209 break
15210 }
15211 v.reset(OpEq64)
15212 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
15213 v0.AddArg2(sptr, mem)
15214 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
15215 v1.AddArg2(tptr, mem)
15216 v.AddArg2(v0, v1)
15217 return true
15218 }
15219
15220
15221 for {
15222 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 {
15223 break
15224 }
15225 v.reset(OpConstBool)
15226 v.Type = typ.Bool
15227 v.AuxInt = boolToAuxInt(true)
15228 return true
15229 }
15230
15231
15232
15233 for {
15234 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
15235 p := v_0
15236 q := v_1
15237 if !(isSamePtr(p, q)) {
15238 continue
15239 }
15240 v.reset(OpConstBool)
15241 v.Type = typ.Bool
15242 v.AuxInt = boolToAuxInt(true)
15243 return true
15244 }
15245 break
15246 }
15247
15248
15249
15250 for {
15251 p := v_0
15252 q := v_1
15253 if v_2.Op != OpConst64 {
15254 break
15255 }
15256 c := auxIntToInt64(v_2.AuxInt)
15257 mem := v_3
15258 if !((c == 3 || c == 5 || c == 9 || c == 17) && canLoadUnaligned(config) && config.RegSize == 8) {
15259 break
15260 }
15261 v.reset(OpAndB)
15262 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
15263 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
15264 v1.AuxInt = int64ToAuxInt(c - 1)
15265 v0.AddArg4(p, q, v1, mem)
15266 v2 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
15267 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
15268 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
15269 v4.AuxInt = int64ToAuxInt(c - 1)
15270 v4.AddArg(p)
15271 v3.AddArg2(v4, mem)
15272 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
15273 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
15274 v6.AuxInt = int64ToAuxInt(c - 1)
15275 v6.AddArg(q)
15276 v5.AddArg2(v6, mem)
15277 v2.AddArg2(v3, v5)
15278 v.AddArg2(v0, v2)
15279 return true
15280 }
15281
15282
15283
15284 for {
15285 p := v_0
15286 q := v_1
15287 if v_2.Op != OpConst64 {
15288 break
15289 }
15290 c := auxIntToInt64(v_2.AuxInt)
15291 mem := v_3
15292 if !((c == 6 || c == 10 || c == 18) && canLoadUnaligned(config) && config.RegSize == 8) {
15293 break
15294 }
15295 v.reset(OpAndB)
15296 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
15297 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
15298 v1.AuxInt = int64ToAuxInt(c - 2)
15299 v0.AddArg4(p, q, v1, mem)
15300 v2 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
15301 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
15302 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
15303 v4.AuxInt = int64ToAuxInt(c - 2)
15304 v4.AddArg(p)
15305 v3.AddArg2(v4, mem)
15306 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
15307 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
15308 v6.AuxInt = int64ToAuxInt(c - 2)
15309 v6.AddArg(q)
15310 v5.AddArg2(v6, mem)
15311 v2.AddArg2(v3, v5)
15312 v.AddArg2(v0, v2)
15313 return true
15314 }
15315
15316
15317
15318 for {
15319 p := v_0
15320 q := v_1
15321 if v_2.Op != OpConst64 {
15322 break
15323 }
15324 c := auxIntToInt64(v_2.AuxInt)
15325 mem := v_3
15326 if !((c == 7 || c == 11 || c == 19 || c == 20) && canLoadUnaligned(config) && config.RegSize == 8) {
15327 break
15328 }
15329 v.reset(OpAndB)
15330 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
15331 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
15332 v1.AuxInt = int64ToAuxInt(min(c-3, 16))
15333 v0.AddArg4(p, q, v1, mem)
15334 v2 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
15335 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
15336 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
15337 v4.AuxInt = int64ToAuxInt(c - 4)
15338 v4.AddArg(p)
15339 v3.AddArg2(v4, mem)
15340 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
15341 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
15342 v6.AuxInt = int64ToAuxInt(c - 4)
15343 v6.AddArg(q)
15344 v5.AddArg2(v6, mem)
15345 v2.AddArg2(v3, v5)
15346 v.AddArg2(v0, v2)
15347 return true
15348 }
15349
15350
15351
15352 for {
15353 p := v_0
15354 q := v_1
15355 if v_2.Op != OpConst64 {
15356 break
15357 }
15358 c := auxIntToInt64(v_2.AuxInt)
15359 mem := v_3
15360 if !(((c >= 12 && c <= 16) || (c >= 21 && c <= 24)) && canLoadUnaligned(config) && config.RegSize == 8) {
15361 break
15362 }
15363 v.reset(OpAndB)
15364 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
15365 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
15366 v1.AuxInt = int64ToAuxInt(8 + int64(bool2int(c > 16))*8)
15367 v0.AddArg4(p, q, v1, mem)
15368 v2 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
15369 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
15370 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
15371 v4.AuxInt = int64ToAuxInt(c - 8)
15372 v4.AddArg(p)
15373 v3.AddArg2(v4, mem)
15374 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
15375 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
15376 v6.AuxInt = int64ToAuxInt(c - 8)
15377 v6.AddArg(q)
15378 v5.AddArg2(v6, mem)
15379 v2.AddArg2(v3, v5)
15380 v.AddArg2(v0, v2)
15381 return true
15382 }
15383
15384
15385
15386 for {
15387 p := v_0
15388 q := v_1
15389 if v_2.Op != OpConst64 {
15390 break
15391 }
15392 c := auxIntToInt64(v_2.AuxInt)
15393 mem := v_3
15394 if !(c >= 25 && c <= 32 && canLoadUnaligned(config) && config.RegSize == 8) {
15395 break
15396 }
15397 v.reset(OpAndB)
15398 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
15399 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
15400 v1.AuxInt = int64ToAuxInt(16)
15401 v0.AddArg4(p, q, v1, mem)
15402 v2 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
15403 v3 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
15404 v3.AuxInt = int64ToAuxInt(16)
15405 v3.AddArg(p)
15406 v4 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
15407 v4.AuxInt = int64ToAuxInt(16)
15408 v4.AddArg(q)
15409 v5 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
15410 v5.AuxInt = int64ToAuxInt(c - 16)
15411 v2.AddArg4(v3, v4, v5, mem)
15412 v.AddArg2(v0, v2)
15413 return true
15414 }
15415 return false
15416 }
15417 func rewriteValuegeneric_OpMod16(v *Value) bool {
15418 v_1 := v.Args[1]
15419 v_0 := v.Args[0]
15420 b := v.Block
15421
15422
15423
15424 for {
15425 if v_0.Op != OpConst16 {
15426 break
15427 }
15428 c := auxIntToInt16(v_0.AuxInt)
15429 if v_1.Op != OpConst16 {
15430 break
15431 }
15432 d := auxIntToInt16(v_1.AuxInt)
15433 if !(d != 0) {
15434 break
15435 }
15436 v.reset(OpConst16)
15437 v.AuxInt = int16ToAuxInt(c % d)
15438 return true
15439 }
15440
15441
15442
15443 for {
15444 t := v.Type
15445 n := v_0
15446 if v_1.Op != OpConst16 {
15447 break
15448 }
15449 c := auxIntToInt16(v_1.AuxInt)
15450 if !(isNonNegative(n) && isPowerOfTwo(c)) {
15451 break
15452 }
15453 v.reset(OpAnd16)
15454 v0 := b.NewValue0(v.Pos, OpConst16, t)
15455 v0.AuxInt = int16ToAuxInt(c - 1)
15456 v.AddArg2(n, v0)
15457 return true
15458 }
15459
15460
15461
15462 for {
15463 t := v.Type
15464 n := v_0
15465 if v_1.Op != OpConst16 {
15466 break
15467 }
15468 c := auxIntToInt16(v_1.AuxInt)
15469 if !(c < 0 && c != -1<<15) {
15470 break
15471 }
15472 v.reset(OpMod16)
15473 v.Type = t
15474 v0 := b.NewValue0(v.Pos, OpConst16, t)
15475 v0.AuxInt = int16ToAuxInt(-c)
15476 v.AddArg2(n, v0)
15477 return true
15478 }
15479
15480
15481
15482 for {
15483 t := v.Type
15484 x := v_0
15485 if v_1.Op != OpConst16 {
15486 break
15487 }
15488 c := auxIntToInt16(v_1.AuxInt)
15489 if !(x.Op != OpConst16 && (c > 0 || c == -1<<15)) {
15490 break
15491 }
15492 v.reset(OpSub16)
15493 v0 := b.NewValue0(v.Pos, OpMul16, t)
15494 v1 := b.NewValue0(v.Pos, OpDiv16, t)
15495 v2 := b.NewValue0(v.Pos, OpConst16, t)
15496 v2.AuxInt = int16ToAuxInt(c)
15497 v1.AddArg2(x, v2)
15498 v0.AddArg2(v1, v2)
15499 v.AddArg2(x, v0)
15500 return true
15501 }
15502 return false
15503 }
15504 func rewriteValuegeneric_OpMod16u(v *Value) bool {
15505 v_1 := v.Args[1]
15506 v_0 := v.Args[0]
15507 b := v.Block
15508
15509
15510
15511 for {
15512 if v_0.Op != OpConst16 {
15513 break
15514 }
15515 c := auxIntToInt16(v_0.AuxInt)
15516 if v_1.Op != OpConst16 {
15517 break
15518 }
15519 d := auxIntToInt16(v_1.AuxInt)
15520 if !(d != 0) {
15521 break
15522 }
15523 v.reset(OpConst16)
15524 v.AuxInt = int16ToAuxInt(int16(uint16(c) % uint16(d)))
15525 return true
15526 }
15527
15528
15529
15530 for {
15531 t := v.Type
15532 n := v_0
15533 if v_1.Op != OpConst16 {
15534 break
15535 }
15536 c := auxIntToInt16(v_1.AuxInt)
15537 if !(isPowerOfTwo(uint16(c))) {
15538 break
15539 }
15540 v.reset(OpAnd16)
15541 v0 := b.NewValue0(v.Pos, OpConst16, t)
15542 v0.AuxInt = int16ToAuxInt(c - 1)
15543 v.AddArg2(n, v0)
15544 return true
15545 }
15546
15547
15548
15549 for {
15550 t := v.Type
15551 x := v_0
15552 if v_1.Op != OpConst16 {
15553 break
15554 }
15555 c := auxIntToInt16(v_1.AuxInt)
15556 if !(x.Op != OpConst16 && c != 0) {
15557 break
15558 }
15559 v.reset(OpSub16)
15560 v0 := b.NewValue0(v.Pos, OpMul16, t)
15561 v1 := b.NewValue0(v.Pos, OpDiv16u, t)
15562 v2 := b.NewValue0(v.Pos, OpConst16, t)
15563 v2.AuxInt = int16ToAuxInt(c)
15564 v1.AddArg2(x, v2)
15565 v0.AddArg2(v1, v2)
15566 v.AddArg2(x, v0)
15567 return true
15568 }
15569 return false
15570 }
15571 func rewriteValuegeneric_OpMod32(v *Value) bool {
15572 v_1 := v.Args[1]
15573 v_0 := v.Args[0]
15574 b := v.Block
15575
15576
15577
15578 for {
15579 if v_0.Op != OpConst32 {
15580 break
15581 }
15582 c := auxIntToInt32(v_0.AuxInt)
15583 if v_1.Op != OpConst32 {
15584 break
15585 }
15586 d := auxIntToInt32(v_1.AuxInt)
15587 if !(d != 0) {
15588 break
15589 }
15590 v.reset(OpConst32)
15591 v.AuxInt = int32ToAuxInt(c % d)
15592 return true
15593 }
15594
15595
15596
15597 for {
15598 t := v.Type
15599 n := v_0
15600 if v_1.Op != OpConst32 {
15601 break
15602 }
15603 c := auxIntToInt32(v_1.AuxInt)
15604 if !(isNonNegative(n) && isPowerOfTwo(c)) {
15605 break
15606 }
15607 v.reset(OpAnd32)
15608 v0 := b.NewValue0(v.Pos, OpConst32, t)
15609 v0.AuxInt = int32ToAuxInt(c - 1)
15610 v.AddArg2(n, v0)
15611 return true
15612 }
15613
15614
15615
15616 for {
15617 t := v.Type
15618 n := v_0
15619 if v_1.Op != OpConst32 {
15620 break
15621 }
15622 c := auxIntToInt32(v_1.AuxInt)
15623 if !(c < 0 && c != -1<<31) {
15624 break
15625 }
15626 v.reset(OpMod32)
15627 v.Type = t
15628 v0 := b.NewValue0(v.Pos, OpConst32, t)
15629 v0.AuxInt = int32ToAuxInt(-c)
15630 v.AddArg2(n, v0)
15631 return true
15632 }
15633
15634
15635
15636 for {
15637 t := v.Type
15638 x := v_0
15639 if v_1.Op != OpConst32 {
15640 break
15641 }
15642 c := auxIntToInt32(v_1.AuxInt)
15643 if !(x.Op != OpConst32 && (c > 0 || c == -1<<31)) {
15644 break
15645 }
15646 v.reset(OpSub32)
15647 v0 := b.NewValue0(v.Pos, OpMul32, t)
15648 v1 := b.NewValue0(v.Pos, OpDiv32, t)
15649 v2 := b.NewValue0(v.Pos, OpConst32, t)
15650 v2.AuxInt = int32ToAuxInt(c)
15651 v1.AddArg2(x, v2)
15652 v0.AddArg2(v1, v2)
15653 v.AddArg2(x, v0)
15654 return true
15655 }
15656 return false
15657 }
15658 func rewriteValuegeneric_OpMod32u(v *Value) bool {
15659 v_1 := v.Args[1]
15660 v_0 := v.Args[0]
15661 b := v.Block
15662
15663
15664
15665 for {
15666 if v_0.Op != OpConst32 {
15667 break
15668 }
15669 c := auxIntToInt32(v_0.AuxInt)
15670 if v_1.Op != OpConst32 {
15671 break
15672 }
15673 d := auxIntToInt32(v_1.AuxInt)
15674 if !(d != 0) {
15675 break
15676 }
15677 v.reset(OpConst32)
15678 v.AuxInt = int32ToAuxInt(int32(uint32(c) % uint32(d)))
15679 return true
15680 }
15681
15682
15683
15684 for {
15685 t := v.Type
15686 n := v_0
15687 if v_1.Op != OpConst32 {
15688 break
15689 }
15690 c := auxIntToInt32(v_1.AuxInt)
15691 if !(isPowerOfTwo(uint32(c))) {
15692 break
15693 }
15694 v.reset(OpAnd32)
15695 v0 := b.NewValue0(v.Pos, OpConst32, t)
15696 v0.AuxInt = int32ToAuxInt(c - 1)
15697 v.AddArg2(n, v0)
15698 return true
15699 }
15700
15701
15702
15703 for {
15704 t := v.Type
15705 x := v_0
15706 if v_1.Op != OpConst32 {
15707 break
15708 }
15709 c := auxIntToInt32(v_1.AuxInt)
15710 if !(x.Op != OpConst32 && c != 0) {
15711 break
15712 }
15713 v.reset(OpSub32)
15714 v0 := b.NewValue0(v.Pos, OpMul32, t)
15715 v1 := b.NewValue0(v.Pos, OpDiv32u, t)
15716 v2 := b.NewValue0(v.Pos, OpConst32, t)
15717 v2.AuxInt = int32ToAuxInt(c)
15718 v1.AddArg2(x, v2)
15719 v0.AddArg2(v1, v2)
15720 v.AddArg2(x, v0)
15721 return true
15722 }
15723 return false
15724 }
15725 func rewriteValuegeneric_OpMod64(v *Value) bool {
15726 v_1 := v.Args[1]
15727 v_0 := v.Args[0]
15728 b := v.Block
15729
15730
15731
15732 for {
15733 if v_0.Op != OpConst64 {
15734 break
15735 }
15736 c := auxIntToInt64(v_0.AuxInt)
15737 if v_1.Op != OpConst64 {
15738 break
15739 }
15740 d := auxIntToInt64(v_1.AuxInt)
15741 if !(d != 0) {
15742 break
15743 }
15744 v.reset(OpConst64)
15745 v.AuxInt = int64ToAuxInt(c % d)
15746 return true
15747 }
15748
15749
15750
15751 for {
15752 t := v.Type
15753 n := v_0
15754 if v_1.Op != OpConst64 {
15755 break
15756 }
15757 c := auxIntToInt64(v_1.AuxInt)
15758 if !(isNonNegative(n) && isPowerOfTwo(c)) {
15759 break
15760 }
15761 v.reset(OpAnd64)
15762 v0 := b.NewValue0(v.Pos, OpConst64, t)
15763 v0.AuxInt = int64ToAuxInt(c - 1)
15764 v.AddArg2(n, v0)
15765 return true
15766 }
15767
15768
15769
15770 for {
15771 n := v_0
15772 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 || !(isNonNegative(n)) {
15773 break
15774 }
15775 v.copyOf(n)
15776 return true
15777 }
15778
15779
15780
15781 for {
15782 t := v.Type
15783 n := v_0
15784 if v_1.Op != OpConst64 {
15785 break
15786 }
15787 c := auxIntToInt64(v_1.AuxInt)
15788 if !(c < 0 && c != -1<<63) {
15789 break
15790 }
15791 v.reset(OpMod64)
15792 v.Type = t
15793 v0 := b.NewValue0(v.Pos, OpConst64, t)
15794 v0.AuxInt = int64ToAuxInt(-c)
15795 v.AddArg2(n, v0)
15796 return true
15797 }
15798
15799
15800
15801 for {
15802 t := v.Type
15803 x := v_0
15804 if v_1.Op != OpConst64 {
15805 break
15806 }
15807 c := auxIntToInt64(v_1.AuxInt)
15808 if !(x.Op != OpConst64 && (c > 0 || c == -1<<63)) {
15809 break
15810 }
15811 v.reset(OpSub64)
15812 v0 := b.NewValue0(v.Pos, OpMul64, t)
15813 v1 := b.NewValue0(v.Pos, OpDiv64, t)
15814 v2 := b.NewValue0(v.Pos, OpConst64, t)
15815 v2.AuxInt = int64ToAuxInt(c)
15816 v1.AddArg2(x, v2)
15817 v0.AddArg2(v1, v2)
15818 v.AddArg2(x, v0)
15819 return true
15820 }
15821 return false
15822 }
15823 func rewriteValuegeneric_OpMod64u(v *Value) bool {
15824 v_1 := v.Args[1]
15825 v_0 := v.Args[0]
15826 b := v.Block
15827
15828
15829
15830 for {
15831 if v_0.Op != OpConst64 {
15832 break
15833 }
15834 c := auxIntToInt64(v_0.AuxInt)
15835 if v_1.Op != OpConst64 {
15836 break
15837 }
15838 d := auxIntToInt64(v_1.AuxInt)
15839 if !(d != 0) {
15840 break
15841 }
15842 v.reset(OpConst64)
15843 v.AuxInt = int64ToAuxInt(int64(uint64(c) % uint64(d)))
15844 return true
15845 }
15846
15847
15848
15849 for {
15850 t := v.Type
15851 n := v_0
15852 if v_1.Op != OpConst64 {
15853 break
15854 }
15855 c := auxIntToInt64(v_1.AuxInt)
15856 if !(isPowerOfTwo(uint64(c))) {
15857 break
15858 }
15859 v.reset(OpAnd64)
15860 v0 := b.NewValue0(v.Pos, OpConst64, t)
15861 v0.AuxInt = int64ToAuxInt(c - 1)
15862 v.AddArg2(n, v0)
15863 return true
15864 }
15865
15866
15867
15868 for {
15869 t := v.Type
15870 x := v_0
15871 if v_1.Op != OpConst64 {
15872 break
15873 }
15874 c := auxIntToInt64(v_1.AuxInt)
15875 if !(x.Op != OpConst64 && c != 0) {
15876 break
15877 }
15878 v.reset(OpSub64)
15879 v0 := b.NewValue0(v.Pos, OpMul64, t)
15880 v1 := b.NewValue0(v.Pos, OpDiv64u, t)
15881 v2 := b.NewValue0(v.Pos, OpConst64, t)
15882 v2.AuxInt = int64ToAuxInt(c)
15883 v1.AddArg2(x, v2)
15884 v0.AddArg2(v1, v2)
15885 v.AddArg2(x, v0)
15886 return true
15887 }
15888 return false
15889 }
15890 func rewriteValuegeneric_OpMod8(v *Value) bool {
15891 v_1 := v.Args[1]
15892 v_0 := v.Args[0]
15893 b := v.Block
15894
15895
15896
15897 for {
15898 if v_0.Op != OpConst8 {
15899 break
15900 }
15901 c := auxIntToInt8(v_0.AuxInt)
15902 if v_1.Op != OpConst8 {
15903 break
15904 }
15905 d := auxIntToInt8(v_1.AuxInt)
15906 if !(d != 0) {
15907 break
15908 }
15909 v.reset(OpConst8)
15910 v.AuxInt = int8ToAuxInt(c % d)
15911 return true
15912 }
15913
15914
15915
15916 for {
15917 t := v.Type
15918 n := v_0
15919 if v_1.Op != OpConst8 {
15920 break
15921 }
15922 c := auxIntToInt8(v_1.AuxInt)
15923 if !(isNonNegative(n) && isPowerOfTwo(c)) {
15924 break
15925 }
15926 v.reset(OpAnd8)
15927 v0 := b.NewValue0(v.Pos, OpConst8, t)
15928 v0.AuxInt = int8ToAuxInt(c - 1)
15929 v.AddArg2(n, v0)
15930 return true
15931 }
15932
15933
15934
15935 for {
15936 t := v.Type
15937 n := v_0
15938 if v_1.Op != OpConst8 {
15939 break
15940 }
15941 c := auxIntToInt8(v_1.AuxInt)
15942 if !(c < 0 && c != -1<<7) {
15943 break
15944 }
15945 v.reset(OpMod8)
15946 v.Type = t
15947 v0 := b.NewValue0(v.Pos, OpConst8, t)
15948 v0.AuxInt = int8ToAuxInt(-c)
15949 v.AddArg2(n, v0)
15950 return true
15951 }
15952
15953
15954
15955 for {
15956 t := v.Type
15957 x := v_0
15958 if v_1.Op != OpConst8 {
15959 break
15960 }
15961 c := auxIntToInt8(v_1.AuxInt)
15962 if !(x.Op != OpConst8 && (c > 0 || c == -1<<7)) {
15963 break
15964 }
15965 v.reset(OpSub8)
15966 v0 := b.NewValue0(v.Pos, OpMul8, t)
15967 v1 := b.NewValue0(v.Pos, OpDiv8, t)
15968 v2 := b.NewValue0(v.Pos, OpConst8, t)
15969 v2.AuxInt = int8ToAuxInt(c)
15970 v1.AddArg2(x, v2)
15971 v0.AddArg2(v1, v2)
15972 v.AddArg2(x, v0)
15973 return true
15974 }
15975 return false
15976 }
15977 func rewriteValuegeneric_OpMod8u(v *Value) bool {
15978 v_1 := v.Args[1]
15979 v_0 := v.Args[0]
15980 b := v.Block
15981
15982
15983
15984 for {
15985 if v_0.Op != OpConst8 {
15986 break
15987 }
15988 c := auxIntToInt8(v_0.AuxInt)
15989 if v_1.Op != OpConst8 {
15990 break
15991 }
15992 d := auxIntToInt8(v_1.AuxInt)
15993 if !(d != 0) {
15994 break
15995 }
15996 v.reset(OpConst8)
15997 v.AuxInt = int8ToAuxInt(int8(uint8(c) % uint8(d)))
15998 return true
15999 }
16000
16001
16002
16003 for {
16004 t := v.Type
16005 n := v_0
16006 if v_1.Op != OpConst8 {
16007 break
16008 }
16009 c := auxIntToInt8(v_1.AuxInt)
16010 if !(isPowerOfTwo(uint8(c))) {
16011 break
16012 }
16013 v.reset(OpAnd8)
16014 v0 := b.NewValue0(v.Pos, OpConst8, t)
16015 v0.AuxInt = int8ToAuxInt(c - 1)
16016 v.AddArg2(n, v0)
16017 return true
16018 }
16019
16020
16021
16022 for {
16023 t := v.Type
16024 x := v_0
16025 if v_1.Op != OpConst8 {
16026 break
16027 }
16028 c := auxIntToInt8(v_1.AuxInt)
16029 if !(x.Op != OpConst8 && c != 0) {
16030 break
16031 }
16032 v.reset(OpSub8)
16033 v0 := b.NewValue0(v.Pos, OpMul8, t)
16034 v1 := b.NewValue0(v.Pos, OpDiv8u, t)
16035 v2 := b.NewValue0(v.Pos, OpConst8, t)
16036 v2.AuxInt = int8ToAuxInt(c)
16037 v1.AddArg2(x, v2)
16038 v0.AddArg2(v1, v2)
16039 v.AddArg2(x, v0)
16040 return true
16041 }
16042 return false
16043 }
16044 func rewriteValuegeneric_OpMove(v *Value) bool {
16045 v_2 := v.Args[2]
16046 v_1 := v.Args[1]
16047 v_0 := v.Args[0]
16048 b := v.Block
16049 config := b.Func.Config
16050
16051
16052
16053 for {
16054 n := auxIntToInt64(v.AuxInt)
16055 t := auxToType(v.Aux)
16056 dst1 := v_0
16057 src := v_1
16058 mem := v_2
16059 if mem.Op != OpZero || auxIntToInt64(mem.AuxInt) != n || auxToType(mem.Aux) != t {
16060 break
16061 }
16062 dst2 := mem.Args[0]
16063 if !(isSamePtr(src, dst2)) {
16064 break
16065 }
16066 v.reset(OpZero)
16067 v.AuxInt = int64ToAuxInt(n)
16068 v.Aux = typeToAux(t)
16069 v.AddArg2(dst1, mem)
16070 return true
16071 }
16072
16073
16074
16075 for {
16076 n := auxIntToInt64(v.AuxInt)
16077 t := auxToType(v.Aux)
16078 dst1 := v_0
16079 src := v_1
16080 mem := v_2
16081 if mem.Op != OpVarDef {
16082 break
16083 }
16084 mem_0 := mem.Args[0]
16085 if mem_0.Op != OpZero || auxIntToInt64(mem_0.AuxInt) != n || auxToType(mem_0.Aux) != t {
16086 break
16087 }
16088 dst0 := mem_0.Args[0]
16089 if !(isSamePtr(src, dst0)) {
16090 break
16091 }
16092 v.reset(OpZero)
16093 v.AuxInt = int64ToAuxInt(n)
16094 v.Aux = typeToAux(t)
16095 v.AddArg2(dst1, mem)
16096 return true
16097 }
16098
16099
16100
16101 for {
16102 n := auxIntToInt64(v.AuxInt)
16103 t := auxToType(v.Aux)
16104 dst := v_0
16105 if v_1.Op != OpAddr {
16106 break
16107 }
16108 sym := auxToSym(v_1.Aux)
16109 v_1_0 := v_1.Args[0]
16110 if v_1_0.Op != OpSB {
16111 break
16112 }
16113 mem := v_2
16114 if !(symIsROZero(sym)) {
16115 break
16116 }
16117 v.reset(OpZero)
16118 v.AuxInt = int64ToAuxInt(n)
16119 v.Aux = typeToAux(t)
16120 v.AddArg2(dst, mem)
16121 return true
16122 }
16123
16124
16125
16126 for {
16127 n := auxIntToInt64(v.AuxInt)
16128 t1 := auxToType(v.Aux)
16129 dst1 := v_0
16130 src1 := v_1
16131 store := v_2
16132 if store.Op != OpStore {
16133 break
16134 }
16135 t2 := auxToType(store.Aux)
16136 mem := store.Args[2]
16137 op := store.Args[0]
16138 if op.Op != OpOffPtr {
16139 break
16140 }
16141 o2 := auxIntToInt64(op.AuxInt)
16142 dst2 := op.Args[0]
16143 if !(isSamePtr(dst1, dst2) && store.Uses == 1 && n >= o2+t2.Size() && disjoint(src1, n, op, t2.Size()) && clobber(store)) {
16144 break
16145 }
16146 v.reset(OpMove)
16147 v.AuxInt = int64ToAuxInt(n)
16148 v.Aux = typeToAux(t1)
16149 v.AddArg3(dst1, src1, mem)
16150 return true
16151 }
16152
16153
16154
16155 for {
16156 n := auxIntToInt64(v.AuxInt)
16157 t := auxToType(v.Aux)
16158 dst1 := v_0
16159 src1 := v_1
16160 move := v_2
16161 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
16162 break
16163 }
16164 mem := move.Args[2]
16165 dst2 := move.Args[0]
16166 if !(move.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move)) {
16167 break
16168 }
16169 v.reset(OpMove)
16170 v.AuxInt = int64ToAuxInt(n)
16171 v.Aux = typeToAux(t)
16172 v.AddArg3(dst1, src1, mem)
16173 return true
16174 }
16175
16176
16177
16178 for {
16179 n := auxIntToInt64(v.AuxInt)
16180 t := auxToType(v.Aux)
16181 dst1 := v_0
16182 src1 := v_1
16183 vardef := v_2
16184 if vardef.Op != OpVarDef {
16185 break
16186 }
16187 x := auxToSym(vardef.Aux)
16188 move := vardef.Args[0]
16189 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
16190 break
16191 }
16192 mem := move.Args[2]
16193 dst2 := move.Args[0]
16194 if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move, vardef)) {
16195 break
16196 }
16197 v.reset(OpMove)
16198 v.AuxInt = int64ToAuxInt(n)
16199 v.Aux = typeToAux(t)
16200 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
16201 v0.Aux = symToAux(x)
16202 v0.AddArg(mem)
16203 v.AddArg3(dst1, src1, v0)
16204 return true
16205 }
16206
16207
16208
16209 for {
16210 n := auxIntToInt64(v.AuxInt)
16211 t := auxToType(v.Aux)
16212 dst1 := v_0
16213 src1 := v_1
16214 zero := v_2
16215 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != n || auxToType(zero.Aux) != t {
16216 break
16217 }
16218 mem := zero.Args[1]
16219 dst2 := zero.Args[0]
16220 if !(zero.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero)) {
16221 break
16222 }
16223 v.reset(OpMove)
16224 v.AuxInt = int64ToAuxInt(n)
16225 v.Aux = typeToAux(t)
16226 v.AddArg3(dst1, src1, mem)
16227 return true
16228 }
16229
16230
16231
16232 for {
16233 n := auxIntToInt64(v.AuxInt)
16234 t := auxToType(v.Aux)
16235 dst1 := v_0
16236 src1 := v_1
16237 vardef := v_2
16238 if vardef.Op != OpVarDef {
16239 break
16240 }
16241 x := auxToSym(vardef.Aux)
16242 zero := vardef.Args[0]
16243 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != n || auxToType(zero.Aux) != t {
16244 break
16245 }
16246 mem := zero.Args[1]
16247 dst2 := zero.Args[0]
16248 if !(zero.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero, vardef)) {
16249 break
16250 }
16251 v.reset(OpMove)
16252 v.AuxInt = int64ToAuxInt(n)
16253 v.Aux = typeToAux(t)
16254 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
16255 v0.Aux = symToAux(x)
16256 v0.AddArg(mem)
16257 v.AddArg3(dst1, src1, v0)
16258 return true
16259 }
16260
16261
16262
16263 for {
16264 n := auxIntToInt64(v.AuxInt)
16265 t1 := auxToType(v.Aux)
16266 dst := v_0
16267 p1 := v_1
16268 mem := v_2
16269 if mem.Op != OpStore {
16270 break
16271 }
16272 t2 := auxToType(mem.Aux)
16273 _ = mem.Args[2]
16274 op2 := mem.Args[0]
16275 if op2.Op != OpOffPtr {
16276 break
16277 }
16278 tt2 := op2.Type
16279 o2 := auxIntToInt64(op2.AuxInt)
16280 p2 := op2.Args[0]
16281 d1 := mem.Args[1]
16282 mem_2 := mem.Args[2]
16283 if mem_2.Op != OpStore {
16284 break
16285 }
16286 t3 := auxToType(mem_2.Aux)
16287 d2 := mem_2.Args[1]
16288 op3 := mem_2.Args[0]
16289 if op3.Op != OpOffPtr {
16290 break
16291 }
16292 tt3 := op3.Type
16293 if auxIntToInt64(op3.AuxInt) != 0 {
16294 break
16295 }
16296 p3 := op3.Args[0]
16297 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()) {
16298 break
16299 }
16300 v.reset(OpStore)
16301 v.Aux = typeToAux(t2)
16302 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16303 v0.AuxInt = int64ToAuxInt(o2)
16304 v0.AddArg(dst)
16305 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16306 v1.Aux = typeToAux(t3)
16307 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16308 v2.AuxInt = int64ToAuxInt(0)
16309 v2.AddArg(dst)
16310 v1.AddArg3(v2, d2, mem)
16311 v.AddArg3(v0, d1, v1)
16312 return true
16313 }
16314
16315
16316
16317 for {
16318 n := auxIntToInt64(v.AuxInt)
16319 t1 := auxToType(v.Aux)
16320 dst := v_0
16321 p1 := v_1
16322 mem := v_2
16323 if mem.Op != OpStore {
16324 break
16325 }
16326 t2 := auxToType(mem.Aux)
16327 _ = mem.Args[2]
16328 op2 := mem.Args[0]
16329 if op2.Op != OpOffPtr {
16330 break
16331 }
16332 tt2 := op2.Type
16333 o2 := auxIntToInt64(op2.AuxInt)
16334 p2 := op2.Args[0]
16335 d1 := mem.Args[1]
16336 mem_2 := mem.Args[2]
16337 if mem_2.Op != OpStore {
16338 break
16339 }
16340 t3 := auxToType(mem_2.Aux)
16341 _ = mem_2.Args[2]
16342 op3 := mem_2.Args[0]
16343 if op3.Op != OpOffPtr {
16344 break
16345 }
16346 tt3 := op3.Type
16347 o3 := auxIntToInt64(op3.AuxInt)
16348 p3 := op3.Args[0]
16349 d2 := mem_2.Args[1]
16350 mem_2_2 := mem_2.Args[2]
16351 if mem_2_2.Op != OpStore {
16352 break
16353 }
16354 t4 := auxToType(mem_2_2.Aux)
16355 d3 := mem_2_2.Args[1]
16356 op4 := mem_2_2.Args[0]
16357 if op4.Op != OpOffPtr {
16358 break
16359 }
16360 tt4 := op4.Type
16361 if auxIntToInt64(op4.AuxInt) != 0 {
16362 break
16363 }
16364 p4 := op4.Args[0]
16365 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()) {
16366 break
16367 }
16368 v.reset(OpStore)
16369 v.Aux = typeToAux(t2)
16370 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16371 v0.AuxInt = int64ToAuxInt(o2)
16372 v0.AddArg(dst)
16373 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16374 v1.Aux = typeToAux(t3)
16375 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16376 v2.AuxInt = int64ToAuxInt(o3)
16377 v2.AddArg(dst)
16378 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16379 v3.Aux = typeToAux(t4)
16380 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16381 v4.AuxInt = int64ToAuxInt(0)
16382 v4.AddArg(dst)
16383 v3.AddArg3(v4, d3, mem)
16384 v1.AddArg3(v2, d2, v3)
16385 v.AddArg3(v0, d1, v1)
16386 return true
16387 }
16388
16389
16390
16391 for {
16392 n := auxIntToInt64(v.AuxInt)
16393 t1 := auxToType(v.Aux)
16394 dst := v_0
16395 p1 := v_1
16396 mem := v_2
16397 if mem.Op != OpStore {
16398 break
16399 }
16400 t2 := auxToType(mem.Aux)
16401 _ = mem.Args[2]
16402 op2 := mem.Args[0]
16403 if op2.Op != OpOffPtr {
16404 break
16405 }
16406 tt2 := op2.Type
16407 o2 := auxIntToInt64(op2.AuxInt)
16408 p2 := op2.Args[0]
16409 d1 := mem.Args[1]
16410 mem_2 := mem.Args[2]
16411 if mem_2.Op != OpStore {
16412 break
16413 }
16414 t3 := auxToType(mem_2.Aux)
16415 _ = mem_2.Args[2]
16416 op3 := mem_2.Args[0]
16417 if op3.Op != OpOffPtr {
16418 break
16419 }
16420 tt3 := op3.Type
16421 o3 := auxIntToInt64(op3.AuxInt)
16422 p3 := op3.Args[0]
16423 d2 := mem_2.Args[1]
16424 mem_2_2 := mem_2.Args[2]
16425 if mem_2_2.Op != OpStore {
16426 break
16427 }
16428 t4 := auxToType(mem_2_2.Aux)
16429 _ = mem_2_2.Args[2]
16430 op4 := mem_2_2.Args[0]
16431 if op4.Op != OpOffPtr {
16432 break
16433 }
16434 tt4 := op4.Type
16435 o4 := auxIntToInt64(op4.AuxInt)
16436 p4 := op4.Args[0]
16437 d3 := mem_2_2.Args[1]
16438 mem_2_2_2 := mem_2_2.Args[2]
16439 if mem_2_2_2.Op != OpStore {
16440 break
16441 }
16442 t5 := auxToType(mem_2_2_2.Aux)
16443 d4 := mem_2_2_2.Args[1]
16444 op5 := mem_2_2_2.Args[0]
16445 if op5.Op != OpOffPtr {
16446 break
16447 }
16448 tt5 := op5.Type
16449 if auxIntToInt64(op5.AuxInt) != 0 {
16450 break
16451 }
16452 p5 := op5.Args[0]
16453 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()) {
16454 break
16455 }
16456 v.reset(OpStore)
16457 v.Aux = typeToAux(t2)
16458 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16459 v0.AuxInt = int64ToAuxInt(o2)
16460 v0.AddArg(dst)
16461 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16462 v1.Aux = typeToAux(t3)
16463 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16464 v2.AuxInt = int64ToAuxInt(o3)
16465 v2.AddArg(dst)
16466 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16467 v3.Aux = typeToAux(t4)
16468 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16469 v4.AuxInt = int64ToAuxInt(o4)
16470 v4.AddArg(dst)
16471 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16472 v5.Aux = typeToAux(t5)
16473 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
16474 v6.AuxInt = int64ToAuxInt(0)
16475 v6.AddArg(dst)
16476 v5.AddArg3(v6, d4, mem)
16477 v3.AddArg3(v4, d3, v5)
16478 v1.AddArg3(v2, d2, v3)
16479 v.AddArg3(v0, d1, v1)
16480 return true
16481 }
16482
16483
16484
16485 for {
16486 n := auxIntToInt64(v.AuxInt)
16487 t1 := auxToType(v.Aux)
16488 dst := v_0
16489 p1 := v_1
16490 mem := v_2
16491 if mem.Op != OpVarDef {
16492 break
16493 }
16494 mem_0 := mem.Args[0]
16495 if mem_0.Op != OpStore {
16496 break
16497 }
16498 t2 := auxToType(mem_0.Aux)
16499 _ = mem_0.Args[2]
16500 op2 := mem_0.Args[0]
16501 if op2.Op != OpOffPtr {
16502 break
16503 }
16504 tt2 := op2.Type
16505 o2 := auxIntToInt64(op2.AuxInt)
16506 p2 := op2.Args[0]
16507 d1 := mem_0.Args[1]
16508 mem_0_2 := mem_0.Args[2]
16509 if mem_0_2.Op != OpStore {
16510 break
16511 }
16512 t3 := auxToType(mem_0_2.Aux)
16513 d2 := mem_0_2.Args[1]
16514 op3 := mem_0_2.Args[0]
16515 if op3.Op != OpOffPtr {
16516 break
16517 }
16518 tt3 := op3.Type
16519 if auxIntToInt64(op3.AuxInt) != 0 {
16520 break
16521 }
16522 p3 := op3.Args[0]
16523 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()) {
16524 break
16525 }
16526 v.reset(OpStore)
16527 v.Aux = typeToAux(t2)
16528 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16529 v0.AuxInt = int64ToAuxInt(o2)
16530 v0.AddArg(dst)
16531 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16532 v1.Aux = typeToAux(t3)
16533 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16534 v2.AuxInt = int64ToAuxInt(0)
16535 v2.AddArg(dst)
16536 v1.AddArg3(v2, d2, mem)
16537 v.AddArg3(v0, d1, v1)
16538 return true
16539 }
16540
16541
16542
16543 for {
16544 n := auxIntToInt64(v.AuxInt)
16545 t1 := auxToType(v.Aux)
16546 dst := v_0
16547 p1 := v_1
16548 mem := v_2
16549 if mem.Op != OpVarDef {
16550 break
16551 }
16552 mem_0 := mem.Args[0]
16553 if mem_0.Op != OpStore {
16554 break
16555 }
16556 t2 := auxToType(mem_0.Aux)
16557 _ = mem_0.Args[2]
16558 op2 := mem_0.Args[0]
16559 if op2.Op != OpOffPtr {
16560 break
16561 }
16562 tt2 := op2.Type
16563 o2 := auxIntToInt64(op2.AuxInt)
16564 p2 := op2.Args[0]
16565 d1 := mem_0.Args[1]
16566 mem_0_2 := mem_0.Args[2]
16567 if mem_0_2.Op != OpStore {
16568 break
16569 }
16570 t3 := auxToType(mem_0_2.Aux)
16571 _ = mem_0_2.Args[2]
16572 op3 := mem_0_2.Args[0]
16573 if op3.Op != OpOffPtr {
16574 break
16575 }
16576 tt3 := op3.Type
16577 o3 := auxIntToInt64(op3.AuxInt)
16578 p3 := op3.Args[0]
16579 d2 := mem_0_2.Args[1]
16580 mem_0_2_2 := mem_0_2.Args[2]
16581 if mem_0_2_2.Op != OpStore {
16582 break
16583 }
16584 t4 := auxToType(mem_0_2_2.Aux)
16585 d3 := mem_0_2_2.Args[1]
16586 op4 := mem_0_2_2.Args[0]
16587 if op4.Op != OpOffPtr {
16588 break
16589 }
16590 tt4 := op4.Type
16591 if auxIntToInt64(op4.AuxInt) != 0 {
16592 break
16593 }
16594 p4 := op4.Args[0]
16595 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()) {
16596 break
16597 }
16598 v.reset(OpStore)
16599 v.Aux = typeToAux(t2)
16600 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16601 v0.AuxInt = int64ToAuxInt(o2)
16602 v0.AddArg(dst)
16603 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16604 v1.Aux = typeToAux(t3)
16605 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16606 v2.AuxInt = int64ToAuxInt(o3)
16607 v2.AddArg(dst)
16608 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16609 v3.Aux = typeToAux(t4)
16610 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16611 v4.AuxInt = int64ToAuxInt(0)
16612 v4.AddArg(dst)
16613 v3.AddArg3(v4, d3, mem)
16614 v1.AddArg3(v2, d2, v3)
16615 v.AddArg3(v0, d1, v1)
16616 return true
16617 }
16618
16619
16620
16621 for {
16622 n := auxIntToInt64(v.AuxInt)
16623 t1 := auxToType(v.Aux)
16624 dst := v_0
16625 p1 := v_1
16626 mem := v_2
16627 if mem.Op != OpVarDef {
16628 break
16629 }
16630 mem_0 := mem.Args[0]
16631 if mem_0.Op != OpStore {
16632 break
16633 }
16634 t2 := auxToType(mem_0.Aux)
16635 _ = mem_0.Args[2]
16636 op2 := mem_0.Args[0]
16637 if op2.Op != OpOffPtr {
16638 break
16639 }
16640 tt2 := op2.Type
16641 o2 := auxIntToInt64(op2.AuxInt)
16642 p2 := op2.Args[0]
16643 d1 := mem_0.Args[1]
16644 mem_0_2 := mem_0.Args[2]
16645 if mem_0_2.Op != OpStore {
16646 break
16647 }
16648 t3 := auxToType(mem_0_2.Aux)
16649 _ = mem_0_2.Args[2]
16650 op3 := mem_0_2.Args[0]
16651 if op3.Op != OpOffPtr {
16652 break
16653 }
16654 tt3 := op3.Type
16655 o3 := auxIntToInt64(op3.AuxInt)
16656 p3 := op3.Args[0]
16657 d2 := mem_0_2.Args[1]
16658 mem_0_2_2 := mem_0_2.Args[2]
16659 if mem_0_2_2.Op != OpStore {
16660 break
16661 }
16662 t4 := auxToType(mem_0_2_2.Aux)
16663 _ = mem_0_2_2.Args[2]
16664 op4 := mem_0_2_2.Args[0]
16665 if op4.Op != OpOffPtr {
16666 break
16667 }
16668 tt4 := op4.Type
16669 o4 := auxIntToInt64(op4.AuxInt)
16670 p4 := op4.Args[0]
16671 d3 := mem_0_2_2.Args[1]
16672 mem_0_2_2_2 := mem_0_2_2.Args[2]
16673 if mem_0_2_2_2.Op != OpStore {
16674 break
16675 }
16676 t5 := auxToType(mem_0_2_2_2.Aux)
16677 d4 := mem_0_2_2_2.Args[1]
16678 op5 := mem_0_2_2_2.Args[0]
16679 if op5.Op != OpOffPtr {
16680 break
16681 }
16682 tt5 := op5.Type
16683 if auxIntToInt64(op5.AuxInt) != 0 {
16684 break
16685 }
16686 p5 := op5.Args[0]
16687 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()) {
16688 break
16689 }
16690 v.reset(OpStore)
16691 v.Aux = typeToAux(t2)
16692 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16693 v0.AuxInt = int64ToAuxInt(o2)
16694 v0.AddArg(dst)
16695 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16696 v1.Aux = typeToAux(t3)
16697 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16698 v2.AuxInt = int64ToAuxInt(o3)
16699 v2.AddArg(dst)
16700 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16701 v3.Aux = typeToAux(t4)
16702 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16703 v4.AuxInt = int64ToAuxInt(o4)
16704 v4.AddArg(dst)
16705 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16706 v5.Aux = typeToAux(t5)
16707 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
16708 v6.AuxInt = int64ToAuxInt(0)
16709 v6.AddArg(dst)
16710 v5.AddArg3(v6, d4, mem)
16711 v3.AddArg3(v4, d3, v5)
16712 v1.AddArg3(v2, d2, v3)
16713 v.AddArg3(v0, d1, v1)
16714 return true
16715 }
16716
16717
16718
16719 for {
16720 n := auxIntToInt64(v.AuxInt)
16721 t1 := auxToType(v.Aux)
16722 dst := v_0
16723 p1 := v_1
16724 mem := v_2
16725 if mem.Op != OpStore {
16726 break
16727 }
16728 t2 := auxToType(mem.Aux)
16729 _ = mem.Args[2]
16730 op2 := mem.Args[0]
16731 if op2.Op != OpOffPtr {
16732 break
16733 }
16734 tt2 := op2.Type
16735 o2 := auxIntToInt64(op2.AuxInt)
16736 p2 := op2.Args[0]
16737 d1 := mem.Args[1]
16738 mem_2 := mem.Args[2]
16739 if mem_2.Op != OpZero || auxIntToInt64(mem_2.AuxInt) != n {
16740 break
16741 }
16742 t3 := auxToType(mem_2.Aux)
16743 p3 := mem_2.Args[0]
16744 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && registerizable(b, t2) && n >= o2+t2.Size()) {
16745 break
16746 }
16747 v.reset(OpStore)
16748 v.Aux = typeToAux(t2)
16749 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16750 v0.AuxInt = int64ToAuxInt(o2)
16751 v0.AddArg(dst)
16752 v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16753 v1.AuxInt = int64ToAuxInt(n)
16754 v1.Aux = typeToAux(t1)
16755 v1.AddArg2(dst, mem)
16756 v.AddArg3(v0, d1, v1)
16757 return true
16758 }
16759
16760
16761
16762 for {
16763 n := auxIntToInt64(v.AuxInt)
16764 t1 := auxToType(v.Aux)
16765 dst := v_0
16766 p1 := v_1
16767 mem := v_2
16768 if mem.Op != OpStore {
16769 break
16770 }
16771 t2 := auxToType(mem.Aux)
16772 _ = mem.Args[2]
16773 mem_0 := mem.Args[0]
16774 if mem_0.Op != OpOffPtr {
16775 break
16776 }
16777 tt2 := mem_0.Type
16778 o2 := auxIntToInt64(mem_0.AuxInt)
16779 p2 := mem_0.Args[0]
16780 d1 := mem.Args[1]
16781 mem_2 := mem.Args[2]
16782 if mem_2.Op != OpStore {
16783 break
16784 }
16785 t3 := auxToType(mem_2.Aux)
16786 _ = mem_2.Args[2]
16787 mem_2_0 := mem_2.Args[0]
16788 if mem_2_0.Op != OpOffPtr {
16789 break
16790 }
16791 tt3 := mem_2_0.Type
16792 o3 := auxIntToInt64(mem_2_0.AuxInt)
16793 p3 := mem_2_0.Args[0]
16794 d2 := mem_2.Args[1]
16795 mem_2_2 := mem_2.Args[2]
16796 if mem_2_2.Op != OpZero || auxIntToInt64(mem_2_2.AuxInt) != n {
16797 break
16798 }
16799 t4 := auxToType(mem_2_2.Aux)
16800 p4 := mem_2_2.Args[0]
16801 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()) {
16802 break
16803 }
16804 v.reset(OpStore)
16805 v.Aux = typeToAux(t2)
16806 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16807 v0.AuxInt = int64ToAuxInt(o2)
16808 v0.AddArg(dst)
16809 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16810 v1.Aux = typeToAux(t3)
16811 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16812 v2.AuxInt = int64ToAuxInt(o3)
16813 v2.AddArg(dst)
16814 v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16815 v3.AuxInt = int64ToAuxInt(n)
16816 v3.Aux = typeToAux(t1)
16817 v3.AddArg2(dst, mem)
16818 v1.AddArg3(v2, d2, v3)
16819 v.AddArg3(v0, d1, v1)
16820 return true
16821 }
16822
16823
16824
16825 for {
16826 n := auxIntToInt64(v.AuxInt)
16827 t1 := auxToType(v.Aux)
16828 dst := v_0
16829 p1 := v_1
16830 mem := v_2
16831 if mem.Op != OpStore {
16832 break
16833 }
16834 t2 := auxToType(mem.Aux)
16835 _ = mem.Args[2]
16836 mem_0 := mem.Args[0]
16837 if mem_0.Op != OpOffPtr {
16838 break
16839 }
16840 tt2 := mem_0.Type
16841 o2 := auxIntToInt64(mem_0.AuxInt)
16842 p2 := mem_0.Args[0]
16843 d1 := mem.Args[1]
16844 mem_2 := mem.Args[2]
16845 if mem_2.Op != OpStore {
16846 break
16847 }
16848 t3 := auxToType(mem_2.Aux)
16849 _ = mem_2.Args[2]
16850 mem_2_0 := mem_2.Args[0]
16851 if mem_2_0.Op != OpOffPtr {
16852 break
16853 }
16854 tt3 := mem_2_0.Type
16855 o3 := auxIntToInt64(mem_2_0.AuxInt)
16856 p3 := mem_2_0.Args[0]
16857 d2 := mem_2.Args[1]
16858 mem_2_2 := mem_2.Args[2]
16859 if mem_2_2.Op != OpStore {
16860 break
16861 }
16862 t4 := auxToType(mem_2_2.Aux)
16863 _ = mem_2_2.Args[2]
16864 mem_2_2_0 := mem_2_2.Args[0]
16865 if mem_2_2_0.Op != OpOffPtr {
16866 break
16867 }
16868 tt4 := mem_2_2_0.Type
16869 o4 := auxIntToInt64(mem_2_2_0.AuxInt)
16870 p4 := mem_2_2_0.Args[0]
16871 d3 := mem_2_2.Args[1]
16872 mem_2_2_2 := mem_2_2.Args[2]
16873 if mem_2_2_2.Op != OpZero || auxIntToInt64(mem_2_2_2.AuxInt) != n {
16874 break
16875 }
16876 t5 := auxToType(mem_2_2_2.Aux)
16877 p5 := mem_2_2_2.Args[0]
16878 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()) {
16879 break
16880 }
16881 v.reset(OpStore)
16882 v.Aux = typeToAux(t2)
16883 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16884 v0.AuxInt = int64ToAuxInt(o2)
16885 v0.AddArg(dst)
16886 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16887 v1.Aux = typeToAux(t3)
16888 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16889 v2.AuxInt = int64ToAuxInt(o3)
16890 v2.AddArg(dst)
16891 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16892 v3.Aux = typeToAux(t4)
16893 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16894 v4.AuxInt = int64ToAuxInt(o4)
16895 v4.AddArg(dst)
16896 v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16897 v5.AuxInt = int64ToAuxInt(n)
16898 v5.Aux = typeToAux(t1)
16899 v5.AddArg2(dst, mem)
16900 v3.AddArg3(v4, d3, v5)
16901 v1.AddArg3(v2, d2, v3)
16902 v.AddArg3(v0, d1, v1)
16903 return true
16904 }
16905
16906
16907
16908 for {
16909 n := auxIntToInt64(v.AuxInt)
16910 t1 := auxToType(v.Aux)
16911 dst := v_0
16912 p1 := v_1
16913 mem := v_2
16914 if mem.Op != OpStore {
16915 break
16916 }
16917 t2 := auxToType(mem.Aux)
16918 _ = mem.Args[2]
16919 mem_0 := mem.Args[0]
16920 if mem_0.Op != OpOffPtr {
16921 break
16922 }
16923 tt2 := mem_0.Type
16924 o2 := auxIntToInt64(mem_0.AuxInt)
16925 p2 := mem_0.Args[0]
16926 d1 := mem.Args[1]
16927 mem_2 := mem.Args[2]
16928 if mem_2.Op != OpStore {
16929 break
16930 }
16931 t3 := auxToType(mem_2.Aux)
16932 _ = mem_2.Args[2]
16933 mem_2_0 := mem_2.Args[0]
16934 if mem_2_0.Op != OpOffPtr {
16935 break
16936 }
16937 tt3 := mem_2_0.Type
16938 o3 := auxIntToInt64(mem_2_0.AuxInt)
16939 p3 := mem_2_0.Args[0]
16940 d2 := mem_2.Args[1]
16941 mem_2_2 := mem_2.Args[2]
16942 if mem_2_2.Op != OpStore {
16943 break
16944 }
16945 t4 := auxToType(mem_2_2.Aux)
16946 _ = mem_2_2.Args[2]
16947 mem_2_2_0 := mem_2_2.Args[0]
16948 if mem_2_2_0.Op != OpOffPtr {
16949 break
16950 }
16951 tt4 := mem_2_2_0.Type
16952 o4 := auxIntToInt64(mem_2_2_0.AuxInt)
16953 p4 := mem_2_2_0.Args[0]
16954 d3 := mem_2_2.Args[1]
16955 mem_2_2_2 := mem_2_2.Args[2]
16956 if mem_2_2_2.Op != OpStore {
16957 break
16958 }
16959 t5 := auxToType(mem_2_2_2.Aux)
16960 _ = mem_2_2_2.Args[2]
16961 mem_2_2_2_0 := mem_2_2_2.Args[0]
16962 if mem_2_2_2_0.Op != OpOffPtr {
16963 break
16964 }
16965 tt5 := mem_2_2_2_0.Type
16966 o5 := auxIntToInt64(mem_2_2_2_0.AuxInt)
16967 p5 := mem_2_2_2_0.Args[0]
16968 d4 := mem_2_2_2.Args[1]
16969 mem_2_2_2_2 := mem_2_2_2.Args[2]
16970 if mem_2_2_2_2.Op != OpZero || auxIntToInt64(mem_2_2_2_2.AuxInt) != n {
16971 break
16972 }
16973 t6 := auxToType(mem_2_2_2_2.Aux)
16974 p6 := mem_2_2_2_2.Args[0]
16975 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()) {
16976 break
16977 }
16978 v.reset(OpStore)
16979 v.Aux = typeToAux(t2)
16980 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16981 v0.AuxInt = int64ToAuxInt(o2)
16982 v0.AddArg(dst)
16983 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16984 v1.Aux = typeToAux(t3)
16985 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16986 v2.AuxInt = int64ToAuxInt(o3)
16987 v2.AddArg(dst)
16988 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16989 v3.Aux = typeToAux(t4)
16990 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16991 v4.AuxInt = int64ToAuxInt(o4)
16992 v4.AddArg(dst)
16993 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16994 v5.Aux = typeToAux(t5)
16995 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
16996 v6.AuxInt = int64ToAuxInt(o5)
16997 v6.AddArg(dst)
16998 v7 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16999 v7.AuxInt = int64ToAuxInt(n)
17000 v7.Aux = typeToAux(t1)
17001 v7.AddArg2(dst, mem)
17002 v5.AddArg3(v6, d4, v7)
17003 v3.AddArg3(v4, d3, v5)
17004 v1.AddArg3(v2, d2, v3)
17005 v.AddArg3(v0, d1, v1)
17006 return true
17007 }
17008
17009
17010
17011 for {
17012 n := auxIntToInt64(v.AuxInt)
17013 t1 := auxToType(v.Aux)
17014 dst := v_0
17015 p1 := v_1
17016 mem := v_2
17017 if mem.Op != OpVarDef {
17018 break
17019 }
17020 mem_0 := mem.Args[0]
17021 if mem_0.Op != OpStore {
17022 break
17023 }
17024 t2 := auxToType(mem_0.Aux)
17025 _ = mem_0.Args[2]
17026 op2 := mem_0.Args[0]
17027 if op2.Op != OpOffPtr {
17028 break
17029 }
17030 tt2 := op2.Type
17031 o2 := auxIntToInt64(op2.AuxInt)
17032 p2 := op2.Args[0]
17033 d1 := mem_0.Args[1]
17034 mem_0_2 := mem_0.Args[2]
17035 if mem_0_2.Op != OpZero || auxIntToInt64(mem_0_2.AuxInt) != n {
17036 break
17037 }
17038 t3 := auxToType(mem_0_2.Aux)
17039 p3 := mem_0_2.Args[0]
17040 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && registerizable(b, t2) && n >= o2+t2.Size()) {
17041 break
17042 }
17043 v.reset(OpStore)
17044 v.Aux = typeToAux(t2)
17045 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17046 v0.AuxInt = int64ToAuxInt(o2)
17047 v0.AddArg(dst)
17048 v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17049 v1.AuxInt = int64ToAuxInt(n)
17050 v1.Aux = typeToAux(t1)
17051 v1.AddArg2(dst, mem)
17052 v.AddArg3(v0, d1, v1)
17053 return true
17054 }
17055
17056
17057
17058 for {
17059 n := auxIntToInt64(v.AuxInt)
17060 t1 := auxToType(v.Aux)
17061 dst := v_0
17062 p1 := v_1
17063 mem := v_2
17064 if mem.Op != OpVarDef {
17065 break
17066 }
17067 mem_0 := mem.Args[0]
17068 if mem_0.Op != OpStore {
17069 break
17070 }
17071 t2 := auxToType(mem_0.Aux)
17072 _ = mem_0.Args[2]
17073 mem_0_0 := mem_0.Args[0]
17074 if mem_0_0.Op != OpOffPtr {
17075 break
17076 }
17077 tt2 := mem_0_0.Type
17078 o2 := auxIntToInt64(mem_0_0.AuxInt)
17079 p2 := mem_0_0.Args[0]
17080 d1 := mem_0.Args[1]
17081 mem_0_2 := mem_0.Args[2]
17082 if mem_0_2.Op != OpStore {
17083 break
17084 }
17085 t3 := auxToType(mem_0_2.Aux)
17086 _ = mem_0_2.Args[2]
17087 mem_0_2_0 := mem_0_2.Args[0]
17088 if mem_0_2_0.Op != OpOffPtr {
17089 break
17090 }
17091 tt3 := mem_0_2_0.Type
17092 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
17093 p3 := mem_0_2_0.Args[0]
17094 d2 := mem_0_2.Args[1]
17095 mem_0_2_2 := mem_0_2.Args[2]
17096 if mem_0_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2.AuxInt) != n {
17097 break
17098 }
17099 t4 := auxToType(mem_0_2_2.Aux)
17100 p4 := mem_0_2_2.Args[0]
17101 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()) {
17102 break
17103 }
17104 v.reset(OpStore)
17105 v.Aux = typeToAux(t2)
17106 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17107 v0.AuxInt = int64ToAuxInt(o2)
17108 v0.AddArg(dst)
17109 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17110 v1.Aux = typeToAux(t3)
17111 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17112 v2.AuxInt = int64ToAuxInt(o3)
17113 v2.AddArg(dst)
17114 v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17115 v3.AuxInt = int64ToAuxInt(n)
17116 v3.Aux = typeToAux(t1)
17117 v3.AddArg2(dst, mem)
17118 v1.AddArg3(v2, d2, v3)
17119 v.AddArg3(v0, d1, v1)
17120 return true
17121 }
17122
17123
17124
17125 for {
17126 n := auxIntToInt64(v.AuxInt)
17127 t1 := auxToType(v.Aux)
17128 dst := v_0
17129 p1 := v_1
17130 mem := v_2
17131 if mem.Op != OpVarDef {
17132 break
17133 }
17134 mem_0 := mem.Args[0]
17135 if mem_0.Op != OpStore {
17136 break
17137 }
17138 t2 := auxToType(mem_0.Aux)
17139 _ = mem_0.Args[2]
17140 mem_0_0 := mem_0.Args[0]
17141 if mem_0_0.Op != OpOffPtr {
17142 break
17143 }
17144 tt2 := mem_0_0.Type
17145 o2 := auxIntToInt64(mem_0_0.AuxInt)
17146 p2 := mem_0_0.Args[0]
17147 d1 := mem_0.Args[1]
17148 mem_0_2 := mem_0.Args[2]
17149 if mem_0_2.Op != OpStore {
17150 break
17151 }
17152 t3 := auxToType(mem_0_2.Aux)
17153 _ = mem_0_2.Args[2]
17154 mem_0_2_0 := mem_0_2.Args[0]
17155 if mem_0_2_0.Op != OpOffPtr {
17156 break
17157 }
17158 tt3 := mem_0_2_0.Type
17159 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
17160 p3 := mem_0_2_0.Args[0]
17161 d2 := mem_0_2.Args[1]
17162 mem_0_2_2 := mem_0_2.Args[2]
17163 if mem_0_2_2.Op != OpStore {
17164 break
17165 }
17166 t4 := auxToType(mem_0_2_2.Aux)
17167 _ = mem_0_2_2.Args[2]
17168 mem_0_2_2_0 := mem_0_2_2.Args[0]
17169 if mem_0_2_2_0.Op != OpOffPtr {
17170 break
17171 }
17172 tt4 := mem_0_2_2_0.Type
17173 o4 := auxIntToInt64(mem_0_2_2_0.AuxInt)
17174 p4 := mem_0_2_2_0.Args[0]
17175 d3 := mem_0_2_2.Args[1]
17176 mem_0_2_2_2 := mem_0_2_2.Args[2]
17177 if mem_0_2_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2_2.AuxInt) != n {
17178 break
17179 }
17180 t5 := auxToType(mem_0_2_2_2.Aux)
17181 p5 := mem_0_2_2_2.Args[0]
17182 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()) {
17183 break
17184 }
17185 v.reset(OpStore)
17186 v.Aux = typeToAux(t2)
17187 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17188 v0.AuxInt = int64ToAuxInt(o2)
17189 v0.AddArg(dst)
17190 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17191 v1.Aux = typeToAux(t3)
17192 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17193 v2.AuxInt = int64ToAuxInt(o3)
17194 v2.AddArg(dst)
17195 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17196 v3.Aux = typeToAux(t4)
17197 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17198 v4.AuxInt = int64ToAuxInt(o4)
17199 v4.AddArg(dst)
17200 v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17201 v5.AuxInt = int64ToAuxInt(n)
17202 v5.Aux = typeToAux(t1)
17203 v5.AddArg2(dst, mem)
17204 v3.AddArg3(v4, d3, v5)
17205 v1.AddArg3(v2, d2, v3)
17206 v.AddArg3(v0, d1, v1)
17207 return true
17208 }
17209
17210
17211
17212 for {
17213 n := auxIntToInt64(v.AuxInt)
17214 t1 := auxToType(v.Aux)
17215 dst := v_0
17216 p1 := v_1
17217 mem := v_2
17218 if mem.Op != OpVarDef {
17219 break
17220 }
17221 mem_0 := mem.Args[0]
17222 if mem_0.Op != OpStore {
17223 break
17224 }
17225 t2 := auxToType(mem_0.Aux)
17226 _ = mem_0.Args[2]
17227 mem_0_0 := mem_0.Args[0]
17228 if mem_0_0.Op != OpOffPtr {
17229 break
17230 }
17231 tt2 := mem_0_0.Type
17232 o2 := auxIntToInt64(mem_0_0.AuxInt)
17233 p2 := mem_0_0.Args[0]
17234 d1 := mem_0.Args[1]
17235 mem_0_2 := mem_0.Args[2]
17236 if mem_0_2.Op != OpStore {
17237 break
17238 }
17239 t3 := auxToType(mem_0_2.Aux)
17240 _ = mem_0_2.Args[2]
17241 mem_0_2_0 := mem_0_2.Args[0]
17242 if mem_0_2_0.Op != OpOffPtr {
17243 break
17244 }
17245 tt3 := mem_0_2_0.Type
17246 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
17247 p3 := mem_0_2_0.Args[0]
17248 d2 := mem_0_2.Args[1]
17249 mem_0_2_2 := mem_0_2.Args[2]
17250 if mem_0_2_2.Op != OpStore {
17251 break
17252 }
17253 t4 := auxToType(mem_0_2_2.Aux)
17254 _ = mem_0_2_2.Args[2]
17255 mem_0_2_2_0 := mem_0_2_2.Args[0]
17256 if mem_0_2_2_0.Op != OpOffPtr {
17257 break
17258 }
17259 tt4 := mem_0_2_2_0.Type
17260 o4 := auxIntToInt64(mem_0_2_2_0.AuxInt)
17261 p4 := mem_0_2_2_0.Args[0]
17262 d3 := mem_0_2_2.Args[1]
17263 mem_0_2_2_2 := mem_0_2_2.Args[2]
17264 if mem_0_2_2_2.Op != OpStore {
17265 break
17266 }
17267 t5 := auxToType(mem_0_2_2_2.Aux)
17268 _ = mem_0_2_2_2.Args[2]
17269 mem_0_2_2_2_0 := mem_0_2_2_2.Args[0]
17270 if mem_0_2_2_2_0.Op != OpOffPtr {
17271 break
17272 }
17273 tt5 := mem_0_2_2_2_0.Type
17274 o5 := auxIntToInt64(mem_0_2_2_2_0.AuxInt)
17275 p5 := mem_0_2_2_2_0.Args[0]
17276 d4 := mem_0_2_2_2.Args[1]
17277 mem_0_2_2_2_2 := mem_0_2_2_2.Args[2]
17278 if mem_0_2_2_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2_2_2.AuxInt) != n {
17279 break
17280 }
17281 t6 := auxToType(mem_0_2_2_2_2.Aux)
17282 p6 := mem_0_2_2_2_2.Args[0]
17283 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()) {
17284 break
17285 }
17286 v.reset(OpStore)
17287 v.Aux = typeToAux(t2)
17288 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
17289 v0.AuxInt = int64ToAuxInt(o2)
17290 v0.AddArg(dst)
17291 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17292 v1.Aux = typeToAux(t3)
17293 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
17294 v2.AuxInt = int64ToAuxInt(o3)
17295 v2.AddArg(dst)
17296 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17297 v3.Aux = typeToAux(t4)
17298 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
17299 v4.AuxInt = int64ToAuxInt(o4)
17300 v4.AddArg(dst)
17301 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
17302 v5.Aux = typeToAux(t5)
17303 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
17304 v6.AuxInt = int64ToAuxInt(o5)
17305 v6.AddArg(dst)
17306 v7 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
17307 v7.AuxInt = int64ToAuxInt(n)
17308 v7.Aux = typeToAux(t1)
17309 v7.AddArg2(dst, mem)
17310 v5.AddArg3(v6, d4, v7)
17311 v3.AddArg3(v4, d3, v5)
17312 v1.AddArg3(v2, d2, v3)
17313 v.AddArg3(v0, d1, v1)
17314 return true
17315 }
17316
17317
17318
17319 for {
17320 s := auxIntToInt64(v.AuxInt)
17321 t1 := auxToType(v.Aux)
17322 dst := v_0
17323 tmp1 := v_1
17324 midmem := v_2
17325 if midmem.Op != OpMove || auxIntToInt64(midmem.AuxInt) != s {
17326 break
17327 }
17328 t2 := auxToType(midmem.Aux)
17329 src := midmem.Args[1]
17330 tmp2 := midmem.Args[0]
17331 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))) {
17332 break
17333 }
17334 v.reset(OpMove)
17335 v.AuxInt = int64ToAuxInt(s)
17336 v.Aux = typeToAux(t1)
17337 v.AddArg3(dst, src, midmem)
17338 return true
17339 }
17340
17341
17342
17343 for {
17344 s := auxIntToInt64(v.AuxInt)
17345 t1 := auxToType(v.Aux)
17346 dst := v_0
17347 tmp1 := v_1
17348 midmem := v_2
17349 if midmem.Op != OpVarDef {
17350 break
17351 }
17352 midmem_0 := midmem.Args[0]
17353 if midmem_0.Op != OpMove || auxIntToInt64(midmem_0.AuxInt) != s {
17354 break
17355 }
17356 t2 := auxToType(midmem_0.Aux)
17357 src := midmem_0.Args[1]
17358 tmp2 := midmem_0.Args[0]
17359 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))) {
17360 break
17361 }
17362 v.reset(OpMove)
17363 v.AuxInt = int64ToAuxInt(s)
17364 v.Aux = typeToAux(t1)
17365 v.AddArg3(dst, src, midmem)
17366 return true
17367 }
17368
17369
17370
17371 for {
17372 dst := v_0
17373 src := v_1
17374 mem := v_2
17375 if !(isSamePtr(dst, src)) {
17376 break
17377 }
17378 v.copyOf(mem)
17379 return true
17380 }
17381 return false
17382 }
17383 func rewriteValuegeneric_OpMul16(v *Value) bool {
17384 v_1 := v.Args[1]
17385 v_0 := v.Args[0]
17386 b := v.Block
17387 typ := &b.Func.Config.Types
17388
17389
17390 for {
17391 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17392 if v_0.Op != OpConst16 {
17393 continue
17394 }
17395 c := auxIntToInt16(v_0.AuxInt)
17396 if v_1.Op != OpConst16 {
17397 continue
17398 }
17399 d := auxIntToInt16(v_1.AuxInt)
17400 v.reset(OpConst16)
17401 v.AuxInt = int16ToAuxInt(c * d)
17402 return true
17403 }
17404 break
17405 }
17406
17407
17408 for {
17409 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17410 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 1 {
17411 continue
17412 }
17413 x := v_1
17414 v.copyOf(x)
17415 return true
17416 }
17417 break
17418 }
17419
17420
17421 for {
17422 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17423 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
17424 continue
17425 }
17426 x := v_1
17427 v.reset(OpNeg16)
17428 v.AddArg(x)
17429 return true
17430 }
17431 break
17432 }
17433
17434
17435 for {
17436 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17437 if v_0.Op != OpConst16 {
17438 continue
17439 }
17440 t := v_0.Type
17441 c := auxIntToInt16(v_0.AuxInt)
17442 if v_1.Op != OpNeg16 {
17443 continue
17444 }
17445 x := v_1.Args[0]
17446 v.reset(OpMul16)
17447 v0 := b.NewValue0(v.Pos, OpConst16, t)
17448 v0.AuxInt = int16ToAuxInt(-c)
17449 v.AddArg2(x, v0)
17450 return true
17451 }
17452 break
17453 }
17454
17455
17456 for {
17457 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17458 if v_0.Op != OpNeg16 {
17459 continue
17460 }
17461 x := v_0.Args[0]
17462 if v_1.Op != OpNeg16 {
17463 continue
17464 }
17465 y := v_1.Args[0]
17466 v.reset(OpMul16)
17467 v.AddArg2(x, y)
17468 return true
17469 }
17470 break
17471 }
17472
17473
17474
17475 for {
17476 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17477 if v_0.Op != OpConst16 {
17478 continue
17479 }
17480 t := v_0.Type
17481 c := auxIntToInt16(v_0.AuxInt)
17482 if v_1.Op != OpAdd16 || v_1.Type != t {
17483 continue
17484 }
17485 _ = v_1.Args[1]
17486 v_1_0 := v_1.Args[0]
17487 v_1_1 := v_1.Args[1]
17488 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
17489 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
17490 continue
17491 }
17492 d := auxIntToInt16(v_1_0.AuxInt)
17493 x := v_1_1
17494 if !(!isPowerOfTwo(c)) {
17495 continue
17496 }
17497 v.reset(OpAdd16)
17498 v0 := b.NewValue0(v.Pos, OpConst16, t)
17499 v0.AuxInt = int16ToAuxInt(c * d)
17500 v1 := b.NewValue0(v.Pos, OpMul16, t)
17501 v2 := b.NewValue0(v.Pos, OpConst16, t)
17502 v2.AuxInt = int16ToAuxInt(c)
17503 v1.AddArg2(v2, x)
17504 v.AddArg2(v0, v1)
17505 return true
17506 }
17507 }
17508 break
17509 }
17510
17511
17512 for {
17513 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17514 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
17515 continue
17516 }
17517 v.reset(OpConst16)
17518 v.AuxInt = int16ToAuxInt(0)
17519 return true
17520 }
17521 break
17522 }
17523
17524
17525
17526 for {
17527 t := v.Type
17528 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17529 x := v_0
17530 if v_1.Op != OpConst16 {
17531 continue
17532 }
17533 c := auxIntToInt16(v_1.AuxInt)
17534 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
17535 continue
17536 }
17537 v.reset(OpLsh16x64)
17538 v.Type = t
17539 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17540 v0.AuxInt = int64ToAuxInt(log16(c))
17541 v.AddArg2(x, v0)
17542 return true
17543 }
17544 break
17545 }
17546
17547
17548
17549 for {
17550 t := v.Type
17551 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17552 x := v_0
17553 if v_1.Op != OpConst16 {
17554 continue
17555 }
17556 c := auxIntToInt16(v_1.AuxInt)
17557 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
17558 continue
17559 }
17560 v.reset(OpNeg16)
17561 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
17562 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17563 v1.AuxInt = int64ToAuxInt(log16(-c))
17564 v0.AddArg2(x, v1)
17565 v.AddArg(v0)
17566 return true
17567 }
17568 break
17569 }
17570
17571
17572
17573 for {
17574 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17575 if v_0.Op != OpMul16 {
17576 continue
17577 }
17578 _ = v_0.Args[1]
17579 v_0_0 := v_0.Args[0]
17580 v_0_1 := v_0.Args[1]
17581 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
17582 i := v_0_0
17583 if i.Op != OpConst16 {
17584 continue
17585 }
17586 t := i.Type
17587 z := v_0_1
17588 x := v_1
17589 if !(z.Op != OpConst16 && x.Op != OpConst16) {
17590 continue
17591 }
17592 v.reset(OpMul16)
17593 v0 := b.NewValue0(v.Pos, OpMul16, t)
17594 v0.AddArg2(x, z)
17595 v.AddArg2(i, v0)
17596 return true
17597 }
17598 }
17599 break
17600 }
17601
17602
17603 for {
17604 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17605 if v_0.Op != OpConst16 {
17606 continue
17607 }
17608 t := v_0.Type
17609 c := auxIntToInt16(v_0.AuxInt)
17610 if v_1.Op != OpMul16 {
17611 continue
17612 }
17613 _ = v_1.Args[1]
17614 v_1_0 := v_1.Args[0]
17615 v_1_1 := v_1.Args[1]
17616 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
17617 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
17618 continue
17619 }
17620 d := auxIntToInt16(v_1_0.AuxInt)
17621 x := v_1_1
17622 v.reset(OpMul16)
17623 v0 := b.NewValue0(v.Pos, OpConst16, t)
17624 v0.AuxInt = int16ToAuxInt(c * d)
17625 v.AddArg2(v0, x)
17626 return true
17627 }
17628 }
17629 break
17630 }
17631 return false
17632 }
17633 func rewriteValuegeneric_OpMul32(v *Value) bool {
17634 v_1 := v.Args[1]
17635 v_0 := v.Args[0]
17636 b := v.Block
17637 typ := &b.Func.Config.Types
17638
17639
17640 for {
17641 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17642 if v_0.Op != OpConst32 {
17643 continue
17644 }
17645 c := auxIntToInt32(v_0.AuxInt)
17646 if v_1.Op != OpConst32 {
17647 continue
17648 }
17649 d := auxIntToInt32(v_1.AuxInt)
17650 v.reset(OpConst32)
17651 v.AuxInt = int32ToAuxInt(c * d)
17652 return true
17653 }
17654 break
17655 }
17656
17657
17658 for {
17659 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17660 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 {
17661 continue
17662 }
17663 x := v_1
17664 v.copyOf(x)
17665 return true
17666 }
17667 break
17668 }
17669
17670
17671 for {
17672 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17673 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
17674 continue
17675 }
17676 x := v_1
17677 v.reset(OpNeg32)
17678 v.AddArg(x)
17679 return true
17680 }
17681 break
17682 }
17683
17684
17685 for {
17686 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17687 if v_0.Op != OpConst32 {
17688 continue
17689 }
17690 t := v_0.Type
17691 c := auxIntToInt32(v_0.AuxInt)
17692 if v_1.Op != OpNeg32 {
17693 continue
17694 }
17695 x := v_1.Args[0]
17696 v.reset(OpMul32)
17697 v0 := b.NewValue0(v.Pos, OpConst32, t)
17698 v0.AuxInt = int32ToAuxInt(-c)
17699 v.AddArg2(x, v0)
17700 return true
17701 }
17702 break
17703 }
17704
17705
17706 for {
17707 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17708 if v_0.Op != OpNeg32 {
17709 continue
17710 }
17711 x := v_0.Args[0]
17712 if v_1.Op != OpNeg32 {
17713 continue
17714 }
17715 y := v_1.Args[0]
17716 v.reset(OpMul32)
17717 v.AddArg2(x, y)
17718 return true
17719 }
17720 break
17721 }
17722
17723
17724
17725 for {
17726 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17727 if v_0.Op != OpConst32 {
17728 continue
17729 }
17730 t := v_0.Type
17731 c := auxIntToInt32(v_0.AuxInt)
17732 if v_1.Op != OpAdd32 || v_1.Type != t {
17733 continue
17734 }
17735 _ = v_1.Args[1]
17736 v_1_0 := v_1.Args[0]
17737 v_1_1 := v_1.Args[1]
17738 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
17739 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
17740 continue
17741 }
17742 d := auxIntToInt32(v_1_0.AuxInt)
17743 x := v_1_1
17744 if !(!isPowerOfTwo(c)) {
17745 continue
17746 }
17747 v.reset(OpAdd32)
17748 v0 := b.NewValue0(v.Pos, OpConst32, t)
17749 v0.AuxInt = int32ToAuxInt(c * d)
17750 v1 := b.NewValue0(v.Pos, OpMul32, t)
17751 v2 := b.NewValue0(v.Pos, OpConst32, t)
17752 v2.AuxInt = int32ToAuxInt(c)
17753 v1.AddArg2(v2, x)
17754 v.AddArg2(v0, v1)
17755 return true
17756 }
17757 }
17758 break
17759 }
17760
17761
17762 for {
17763 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17764 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
17765 continue
17766 }
17767 v.reset(OpConst32)
17768 v.AuxInt = int32ToAuxInt(0)
17769 return true
17770 }
17771 break
17772 }
17773
17774
17775
17776 for {
17777 t := v.Type
17778 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17779 x := v_0
17780 if v_1.Op != OpConst32 {
17781 continue
17782 }
17783 c := auxIntToInt32(v_1.AuxInt)
17784 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
17785 continue
17786 }
17787 v.reset(OpLsh32x64)
17788 v.Type = t
17789 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17790 v0.AuxInt = int64ToAuxInt(log32(c))
17791 v.AddArg2(x, v0)
17792 return true
17793 }
17794 break
17795 }
17796
17797
17798
17799 for {
17800 t := v.Type
17801 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17802 x := v_0
17803 if v_1.Op != OpConst32 {
17804 continue
17805 }
17806 c := auxIntToInt32(v_1.AuxInt)
17807 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
17808 continue
17809 }
17810 v.reset(OpNeg32)
17811 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
17812 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17813 v1.AuxInt = int64ToAuxInt(log32(-c))
17814 v0.AddArg2(x, v1)
17815 v.AddArg(v0)
17816 return true
17817 }
17818 break
17819 }
17820
17821
17822
17823 for {
17824 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17825 if v_0.Op != OpMul32 {
17826 continue
17827 }
17828 _ = v_0.Args[1]
17829 v_0_0 := v_0.Args[0]
17830 v_0_1 := v_0.Args[1]
17831 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
17832 i := v_0_0
17833 if i.Op != OpConst32 {
17834 continue
17835 }
17836 t := i.Type
17837 z := v_0_1
17838 x := v_1
17839 if !(z.Op != OpConst32 && x.Op != OpConst32) {
17840 continue
17841 }
17842 v.reset(OpMul32)
17843 v0 := b.NewValue0(v.Pos, OpMul32, t)
17844 v0.AddArg2(x, z)
17845 v.AddArg2(i, v0)
17846 return true
17847 }
17848 }
17849 break
17850 }
17851
17852
17853 for {
17854 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17855 if v_0.Op != OpConst32 {
17856 continue
17857 }
17858 t := v_0.Type
17859 c := auxIntToInt32(v_0.AuxInt)
17860 if v_1.Op != OpMul32 {
17861 continue
17862 }
17863 _ = v_1.Args[1]
17864 v_1_0 := v_1.Args[0]
17865 v_1_1 := v_1.Args[1]
17866 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
17867 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
17868 continue
17869 }
17870 d := auxIntToInt32(v_1_0.AuxInt)
17871 x := v_1_1
17872 v.reset(OpMul32)
17873 v0 := b.NewValue0(v.Pos, OpConst32, t)
17874 v0.AuxInt = int32ToAuxInt(c * d)
17875 v.AddArg2(v0, x)
17876 return true
17877 }
17878 }
17879 break
17880 }
17881 return false
17882 }
17883 func rewriteValuegeneric_OpMul32F(v *Value) bool {
17884 v_1 := v.Args[1]
17885 v_0 := v.Args[0]
17886
17887
17888
17889 for {
17890 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17891 if v_0.Op != OpConst32F {
17892 continue
17893 }
17894 c := auxIntToFloat32(v_0.AuxInt)
17895 if v_1.Op != OpConst32F {
17896 continue
17897 }
17898 d := auxIntToFloat32(v_1.AuxInt)
17899 if !(c*d == c*d) {
17900 continue
17901 }
17902 v.reset(OpConst32F)
17903 v.AuxInt = float32ToAuxInt(c * d)
17904 return true
17905 }
17906 break
17907 }
17908
17909
17910 for {
17911 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17912 x := v_0
17913 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != 1 {
17914 continue
17915 }
17916 v.copyOf(x)
17917 return true
17918 }
17919 break
17920 }
17921
17922
17923 for {
17924 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17925 x := v_0
17926 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != -1 {
17927 continue
17928 }
17929 v.reset(OpNeg32F)
17930 v.AddArg(x)
17931 return true
17932 }
17933 break
17934 }
17935
17936
17937 for {
17938 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17939 x := v_0
17940 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != 2 {
17941 continue
17942 }
17943 v.reset(OpAdd32F)
17944 v.AddArg2(x, x)
17945 return true
17946 }
17947 break
17948 }
17949 return false
17950 }
17951 func rewriteValuegeneric_OpMul32uhilo(v *Value) bool {
17952 v_1 := v.Args[1]
17953 v_0 := v.Args[0]
17954 b := v.Block
17955 typ := &b.Func.Config.Types
17956
17957
17958 for {
17959 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17960 if v_0.Op != OpConst32 {
17961 continue
17962 }
17963 c := auxIntToInt32(v_0.AuxInt)
17964 if v_1.Op != OpConst32 {
17965 continue
17966 }
17967 d := auxIntToInt32(v_1.AuxInt)
17968 v.reset(OpMakeTuple)
17969 v0 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
17970 v0.AuxInt = int32ToAuxInt(bitsMulU32(c, d).hi)
17971 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
17972 v1.AuxInt = int32ToAuxInt(bitsMulU32(c, d).lo)
17973 v.AddArg2(v0, v1)
17974 return true
17975 }
17976 break
17977 }
17978 return false
17979 }
17980 func rewriteValuegeneric_OpMul32uover(v *Value) bool {
17981 v_1 := v.Args[1]
17982 v_0 := v.Args[0]
17983 b := v.Block
17984 typ := &b.Func.Config.Types
17985
17986
17987 for {
17988 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17989 if v_0.Op != OpConst32 {
17990 continue
17991 }
17992 c := auxIntToInt32(v_0.AuxInt)
17993 if v_1.Op != OpConst32 {
17994 continue
17995 }
17996 d := auxIntToInt32(v_1.AuxInt)
17997 v.reset(OpMakeTuple)
17998 v0 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
17999 v0.AuxInt = int32ToAuxInt(bitsMulU32(c, d).lo)
18000 v1 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
18001 v1.AuxInt = boolToAuxInt(bitsMulU32(c, d).hi != 0)
18002 v.AddArg2(v0, v1)
18003 return true
18004 }
18005 break
18006 }
18007
18008
18009 for {
18010 t := v.Type
18011 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18012 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 {
18013 continue
18014 }
18015 x := v_1
18016 v.reset(OpMakeTuple)
18017 v0 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
18018 v0.AuxInt = boolToAuxInt(false)
18019 v.AddArg2(x, v0)
18020 return true
18021 }
18022 break
18023 }
18024
18025
18026 for {
18027 t := v.Type
18028 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18029 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
18030 continue
18031 }
18032 v.reset(OpMakeTuple)
18033 v0 := b.NewValue0(v.Pos, OpConst32, t.FieldType(0))
18034 v0.AuxInt = int32ToAuxInt(0)
18035 v1 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
18036 v1.AuxInt = boolToAuxInt(false)
18037 v.AddArg2(v0, v1)
18038 return true
18039 }
18040 break
18041 }
18042 return false
18043 }
18044 func rewriteValuegeneric_OpMul64(v *Value) bool {
18045 v_1 := v.Args[1]
18046 v_0 := v.Args[0]
18047 b := v.Block
18048 typ := &b.Func.Config.Types
18049
18050
18051 for {
18052 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18053 if v_0.Op != OpConst64 {
18054 continue
18055 }
18056 c := auxIntToInt64(v_0.AuxInt)
18057 if v_1.Op != OpConst64 {
18058 continue
18059 }
18060 d := auxIntToInt64(v_1.AuxInt)
18061 v.reset(OpConst64)
18062 v.AuxInt = int64ToAuxInt(c * d)
18063 return true
18064 }
18065 break
18066 }
18067
18068
18069 for {
18070 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18071 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 {
18072 continue
18073 }
18074 x := v_1
18075 v.copyOf(x)
18076 return true
18077 }
18078 break
18079 }
18080
18081
18082 for {
18083 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18084 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
18085 continue
18086 }
18087 x := v_1
18088 v.reset(OpNeg64)
18089 v.AddArg(x)
18090 return true
18091 }
18092 break
18093 }
18094
18095
18096 for {
18097 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18098 if v_0.Op != OpConst64 {
18099 continue
18100 }
18101 t := v_0.Type
18102 c := auxIntToInt64(v_0.AuxInt)
18103 if v_1.Op != OpNeg64 {
18104 continue
18105 }
18106 x := v_1.Args[0]
18107 v.reset(OpMul64)
18108 v0 := b.NewValue0(v.Pos, OpConst64, t)
18109 v0.AuxInt = int64ToAuxInt(-c)
18110 v.AddArg2(x, v0)
18111 return true
18112 }
18113 break
18114 }
18115
18116
18117 for {
18118 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18119 if v_0.Op != OpNeg64 {
18120 continue
18121 }
18122 x := v_0.Args[0]
18123 if v_1.Op != OpNeg64 {
18124 continue
18125 }
18126 y := v_1.Args[0]
18127 v.reset(OpMul64)
18128 v.AddArg2(x, y)
18129 return true
18130 }
18131 break
18132 }
18133
18134
18135
18136 for {
18137 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18138 if v_0.Op != OpConst64 {
18139 continue
18140 }
18141 t := v_0.Type
18142 c := auxIntToInt64(v_0.AuxInt)
18143 if v_1.Op != OpAdd64 || v_1.Type != t {
18144 continue
18145 }
18146 _ = v_1.Args[1]
18147 v_1_0 := v_1.Args[0]
18148 v_1_1 := v_1.Args[1]
18149 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18150 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
18151 continue
18152 }
18153 d := auxIntToInt64(v_1_0.AuxInt)
18154 x := v_1_1
18155 if !(!isPowerOfTwo(c)) {
18156 continue
18157 }
18158 v.reset(OpAdd64)
18159 v0 := b.NewValue0(v.Pos, OpConst64, t)
18160 v0.AuxInt = int64ToAuxInt(c * d)
18161 v1 := b.NewValue0(v.Pos, OpMul64, t)
18162 v2 := b.NewValue0(v.Pos, OpConst64, t)
18163 v2.AuxInt = int64ToAuxInt(c)
18164 v1.AddArg2(v2, x)
18165 v.AddArg2(v0, v1)
18166 return true
18167 }
18168 }
18169 break
18170 }
18171
18172
18173 for {
18174 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18175 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
18176 continue
18177 }
18178 v.reset(OpConst64)
18179 v.AuxInt = int64ToAuxInt(0)
18180 return true
18181 }
18182 break
18183 }
18184
18185
18186
18187 for {
18188 t := v.Type
18189 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18190 x := v_0
18191 if v_1.Op != OpConst64 {
18192 continue
18193 }
18194 c := auxIntToInt64(v_1.AuxInt)
18195 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
18196 continue
18197 }
18198 v.reset(OpLsh64x64)
18199 v.Type = t
18200 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18201 v0.AuxInt = int64ToAuxInt(log64(c))
18202 v.AddArg2(x, v0)
18203 return true
18204 }
18205 break
18206 }
18207
18208
18209
18210 for {
18211 t := v.Type
18212 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18213 x := v_0
18214 if v_1.Op != OpConst64 {
18215 continue
18216 }
18217 c := auxIntToInt64(v_1.AuxInt)
18218 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
18219 continue
18220 }
18221 v.reset(OpNeg64)
18222 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
18223 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18224 v1.AuxInt = int64ToAuxInt(log64(-c))
18225 v0.AddArg2(x, v1)
18226 v.AddArg(v0)
18227 return true
18228 }
18229 break
18230 }
18231
18232
18233
18234 for {
18235 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18236 if v_0.Op != OpMul64 {
18237 continue
18238 }
18239 _ = v_0.Args[1]
18240 v_0_0 := v_0.Args[0]
18241 v_0_1 := v_0.Args[1]
18242 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18243 i := v_0_0
18244 if i.Op != OpConst64 {
18245 continue
18246 }
18247 t := i.Type
18248 z := v_0_1
18249 x := v_1
18250 if !(z.Op != OpConst64 && x.Op != OpConst64) {
18251 continue
18252 }
18253 v.reset(OpMul64)
18254 v0 := b.NewValue0(v.Pos, OpMul64, t)
18255 v0.AddArg2(x, z)
18256 v.AddArg2(i, v0)
18257 return true
18258 }
18259 }
18260 break
18261 }
18262
18263
18264 for {
18265 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18266 if v_0.Op != OpConst64 {
18267 continue
18268 }
18269 t := v_0.Type
18270 c := auxIntToInt64(v_0.AuxInt)
18271 if v_1.Op != OpMul64 {
18272 continue
18273 }
18274 _ = v_1.Args[1]
18275 v_1_0 := v_1.Args[0]
18276 v_1_1 := v_1.Args[1]
18277 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18278 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
18279 continue
18280 }
18281 d := auxIntToInt64(v_1_0.AuxInt)
18282 x := v_1_1
18283 v.reset(OpMul64)
18284 v0 := b.NewValue0(v.Pos, OpConst64, t)
18285 v0.AuxInt = int64ToAuxInt(c * d)
18286 v.AddArg2(v0, x)
18287 return true
18288 }
18289 }
18290 break
18291 }
18292 return false
18293 }
18294 func rewriteValuegeneric_OpMul64F(v *Value) bool {
18295 v_1 := v.Args[1]
18296 v_0 := v.Args[0]
18297
18298
18299
18300 for {
18301 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18302 if v_0.Op != OpConst64F {
18303 continue
18304 }
18305 c := auxIntToFloat64(v_0.AuxInt)
18306 if v_1.Op != OpConst64F {
18307 continue
18308 }
18309 d := auxIntToFloat64(v_1.AuxInt)
18310 if !(c*d == c*d) {
18311 continue
18312 }
18313 v.reset(OpConst64F)
18314 v.AuxInt = float64ToAuxInt(c * d)
18315 return true
18316 }
18317 break
18318 }
18319
18320
18321 for {
18322 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18323 x := v_0
18324 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != 1 {
18325 continue
18326 }
18327 v.copyOf(x)
18328 return true
18329 }
18330 break
18331 }
18332
18333
18334 for {
18335 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18336 x := v_0
18337 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != -1 {
18338 continue
18339 }
18340 v.reset(OpNeg64F)
18341 v.AddArg(x)
18342 return true
18343 }
18344 break
18345 }
18346
18347
18348 for {
18349 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18350 x := v_0
18351 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != 2 {
18352 continue
18353 }
18354 v.reset(OpAdd64F)
18355 v.AddArg2(x, x)
18356 return true
18357 }
18358 break
18359 }
18360 return false
18361 }
18362 func rewriteValuegeneric_OpMul64uhilo(v *Value) bool {
18363 v_1 := v.Args[1]
18364 v_0 := v.Args[0]
18365 b := v.Block
18366 typ := &b.Func.Config.Types
18367
18368
18369 for {
18370 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18371 if v_0.Op != OpConst64 {
18372 continue
18373 }
18374 c := auxIntToInt64(v_0.AuxInt)
18375 if v_1.Op != OpConst64 {
18376 continue
18377 }
18378 d := auxIntToInt64(v_1.AuxInt)
18379 v.reset(OpMakeTuple)
18380 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18381 v0.AuxInt = int64ToAuxInt(bitsMulU64(c, d).hi)
18382 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18383 v1.AuxInt = int64ToAuxInt(bitsMulU64(c, d).lo)
18384 v.AddArg2(v0, v1)
18385 return true
18386 }
18387 break
18388 }
18389 return false
18390 }
18391 func rewriteValuegeneric_OpMul64uover(v *Value) bool {
18392 v_1 := v.Args[1]
18393 v_0 := v.Args[0]
18394 b := v.Block
18395 typ := &b.Func.Config.Types
18396
18397
18398 for {
18399 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18400 if v_0.Op != OpConst64 {
18401 continue
18402 }
18403 c := auxIntToInt64(v_0.AuxInt)
18404 if v_1.Op != OpConst64 {
18405 continue
18406 }
18407 d := auxIntToInt64(v_1.AuxInt)
18408 v.reset(OpMakeTuple)
18409 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18410 v0.AuxInt = int64ToAuxInt(bitsMulU64(c, d).lo)
18411 v1 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
18412 v1.AuxInt = boolToAuxInt(bitsMulU64(c, d).hi != 0)
18413 v.AddArg2(v0, v1)
18414 return true
18415 }
18416 break
18417 }
18418
18419
18420 for {
18421 t := v.Type
18422 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18423 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 {
18424 continue
18425 }
18426 x := v_1
18427 v.reset(OpMakeTuple)
18428 v0 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
18429 v0.AuxInt = boolToAuxInt(false)
18430 v.AddArg2(x, v0)
18431 return true
18432 }
18433 break
18434 }
18435
18436
18437 for {
18438 t := v.Type
18439 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18440 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
18441 continue
18442 }
18443 v.reset(OpMakeTuple)
18444 v0 := b.NewValue0(v.Pos, OpConst64, t.FieldType(0))
18445 v0.AuxInt = int64ToAuxInt(0)
18446 v1 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
18447 v1.AuxInt = boolToAuxInt(false)
18448 v.AddArg2(v0, v1)
18449 return true
18450 }
18451 break
18452 }
18453 return false
18454 }
18455 func rewriteValuegeneric_OpMul8(v *Value) bool {
18456 v_1 := v.Args[1]
18457 v_0 := v.Args[0]
18458 b := v.Block
18459 typ := &b.Func.Config.Types
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 != OpConst8 {
18465 continue
18466 }
18467 c := auxIntToInt8(v_0.AuxInt)
18468 if v_1.Op != OpConst8 {
18469 continue
18470 }
18471 d := auxIntToInt8(v_1.AuxInt)
18472 v.reset(OpConst8)
18473 v.AuxInt = int8ToAuxInt(c * d)
18474 return true
18475 }
18476 break
18477 }
18478
18479
18480 for {
18481 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18482 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 1 {
18483 continue
18484 }
18485 x := v_1
18486 v.copyOf(x)
18487 return true
18488 }
18489 break
18490 }
18491
18492
18493 for {
18494 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18495 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
18496 continue
18497 }
18498 x := v_1
18499 v.reset(OpNeg8)
18500 v.AddArg(x)
18501 return true
18502 }
18503 break
18504 }
18505
18506
18507 for {
18508 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18509 if v_0.Op != OpConst8 {
18510 continue
18511 }
18512 t := v_0.Type
18513 c := auxIntToInt8(v_0.AuxInt)
18514 if v_1.Op != OpNeg8 {
18515 continue
18516 }
18517 x := v_1.Args[0]
18518 v.reset(OpMul8)
18519 v0 := b.NewValue0(v.Pos, OpConst8, t)
18520 v0.AuxInt = int8ToAuxInt(-c)
18521 v.AddArg2(x, v0)
18522 return true
18523 }
18524 break
18525 }
18526
18527
18528 for {
18529 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18530 if v_0.Op != OpNeg8 {
18531 continue
18532 }
18533 x := v_0.Args[0]
18534 if v_1.Op != OpNeg8 {
18535 continue
18536 }
18537 y := v_1.Args[0]
18538 v.reset(OpMul8)
18539 v.AddArg2(x, y)
18540 return true
18541 }
18542 break
18543 }
18544
18545
18546
18547 for {
18548 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18549 if v_0.Op != OpConst8 {
18550 continue
18551 }
18552 t := v_0.Type
18553 c := auxIntToInt8(v_0.AuxInt)
18554 if v_1.Op != OpAdd8 || v_1.Type != t {
18555 continue
18556 }
18557 _ = v_1.Args[1]
18558 v_1_0 := v_1.Args[0]
18559 v_1_1 := v_1.Args[1]
18560 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18561 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
18562 continue
18563 }
18564 d := auxIntToInt8(v_1_0.AuxInt)
18565 x := v_1_1
18566 if !(!isPowerOfTwo(c)) {
18567 continue
18568 }
18569 v.reset(OpAdd8)
18570 v0 := b.NewValue0(v.Pos, OpConst8, t)
18571 v0.AuxInt = int8ToAuxInt(c * d)
18572 v1 := b.NewValue0(v.Pos, OpMul8, t)
18573 v2 := b.NewValue0(v.Pos, OpConst8, t)
18574 v2.AuxInt = int8ToAuxInt(c)
18575 v1.AddArg2(v2, x)
18576 v.AddArg2(v0, v1)
18577 return true
18578 }
18579 }
18580 break
18581 }
18582
18583
18584 for {
18585 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18586 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
18587 continue
18588 }
18589 v.reset(OpConst8)
18590 v.AuxInt = int8ToAuxInt(0)
18591 return true
18592 }
18593 break
18594 }
18595
18596
18597
18598 for {
18599 t := v.Type
18600 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18601 x := v_0
18602 if v_1.Op != OpConst8 {
18603 continue
18604 }
18605 c := auxIntToInt8(v_1.AuxInt)
18606 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
18607 continue
18608 }
18609 v.reset(OpLsh8x64)
18610 v.Type = t
18611 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18612 v0.AuxInt = int64ToAuxInt(log8(c))
18613 v.AddArg2(x, v0)
18614 return true
18615 }
18616 break
18617 }
18618
18619
18620
18621 for {
18622 t := v.Type
18623 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18624 x := v_0
18625 if v_1.Op != OpConst8 {
18626 continue
18627 }
18628 c := auxIntToInt8(v_1.AuxInt)
18629 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
18630 continue
18631 }
18632 v.reset(OpNeg8)
18633 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
18634 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18635 v1.AuxInt = int64ToAuxInt(log8(-c))
18636 v0.AddArg2(x, v1)
18637 v.AddArg(v0)
18638 return true
18639 }
18640 break
18641 }
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 != OpMul8 {
18648 continue
18649 }
18650 _ = v_0.Args[1]
18651 v_0_0 := v_0.Args[0]
18652 v_0_1 := v_0.Args[1]
18653 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18654 i := v_0_0
18655 if i.Op != OpConst8 {
18656 continue
18657 }
18658 t := i.Type
18659 z := v_0_1
18660 x := v_1
18661 if !(z.Op != OpConst8 && x.Op != OpConst8) {
18662 continue
18663 }
18664 v.reset(OpMul8)
18665 v0 := b.NewValue0(v.Pos, OpMul8, t)
18666 v0.AddArg2(x, z)
18667 v.AddArg2(i, v0)
18668 return true
18669 }
18670 }
18671 break
18672 }
18673
18674
18675 for {
18676 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18677 if v_0.Op != OpConst8 {
18678 continue
18679 }
18680 t := v_0.Type
18681 c := auxIntToInt8(v_0.AuxInt)
18682 if v_1.Op != OpMul8 {
18683 continue
18684 }
18685 _ = v_1.Args[1]
18686 v_1_0 := v_1.Args[0]
18687 v_1_1 := v_1.Args[1]
18688 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18689 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
18690 continue
18691 }
18692 d := auxIntToInt8(v_1_0.AuxInt)
18693 x := v_1_1
18694 v.reset(OpMul8)
18695 v0 := b.NewValue0(v.Pos, OpConst8, t)
18696 v0.AuxInt = int8ToAuxInt(c * d)
18697 v.AddArg2(v0, x)
18698 return true
18699 }
18700 }
18701 break
18702 }
18703 return false
18704 }
18705 func rewriteValuegeneric_OpNeg16(v *Value) bool {
18706 v_0 := v.Args[0]
18707 b := v.Block
18708
18709
18710 for {
18711 if v_0.Op != OpConst16 {
18712 break
18713 }
18714 c := auxIntToInt16(v_0.AuxInt)
18715 v.reset(OpConst16)
18716 v.AuxInt = int16ToAuxInt(-c)
18717 return true
18718 }
18719
18720
18721 for {
18722 if v_0.Op != OpMul16 {
18723 break
18724 }
18725 _ = v_0.Args[1]
18726 v_0_0 := v_0.Args[0]
18727 v_0_1 := v_0.Args[1]
18728 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18729 x := v_0_0
18730 if v_0_1.Op != OpConst16 {
18731 continue
18732 }
18733 t := v_0_1.Type
18734 c := auxIntToInt16(v_0_1.AuxInt)
18735 v.reset(OpMul16)
18736 v0 := b.NewValue0(v.Pos, OpConst16, t)
18737 v0.AuxInt = int16ToAuxInt(-c)
18738 v.AddArg2(x, v0)
18739 return true
18740 }
18741 break
18742 }
18743
18744
18745 for {
18746 if v_0.Op != OpMul16 {
18747 break
18748 }
18749 _ = v_0.Args[1]
18750 v_0_0 := v_0.Args[0]
18751 v_0_1 := v_0.Args[1]
18752 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18753 x := v_0_0
18754 if v_0_1.Op != OpNeg16 {
18755 continue
18756 }
18757 y := v_0_1.Args[0]
18758 v.reset(OpMul16)
18759 v.AddArg2(x, y)
18760 return true
18761 }
18762 break
18763 }
18764
18765
18766 for {
18767 if v_0.Op != OpSub16 {
18768 break
18769 }
18770 y := v_0.Args[1]
18771 x := v_0.Args[0]
18772 v.reset(OpSub16)
18773 v.AddArg2(y, x)
18774 return true
18775 }
18776
18777
18778 for {
18779 if v_0.Op != OpNeg16 {
18780 break
18781 }
18782 x := v_0.Args[0]
18783 v.copyOf(x)
18784 return true
18785 }
18786
18787
18788 for {
18789 t := v.Type
18790 if v_0.Op != OpCom16 {
18791 break
18792 }
18793 x := v_0.Args[0]
18794 v.reset(OpAdd16)
18795 v0 := b.NewValue0(v.Pos, OpConst16, t)
18796 v0.AuxInt = int16ToAuxInt(1)
18797 v.AddArg2(v0, x)
18798 return true
18799 }
18800 return false
18801 }
18802 func rewriteValuegeneric_OpNeg32(v *Value) bool {
18803 v_0 := v.Args[0]
18804 b := v.Block
18805
18806
18807 for {
18808 if v_0.Op != OpConst32 {
18809 break
18810 }
18811 c := auxIntToInt32(v_0.AuxInt)
18812 v.reset(OpConst32)
18813 v.AuxInt = int32ToAuxInt(-c)
18814 return true
18815 }
18816
18817
18818 for {
18819 if v_0.Op != OpMul32 {
18820 break
18821 }
18822 _ = v_0.Args[1]
18823 v_0_0 := v_0.Args[0]
18824 v_0_1 := v_0.Args[1]
18825 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18826 x := v_0_0
18827 if v_0_1.Op != OpConst32 {
18828 continue
18829 }
18830 t := v_0_1.Type
18831 c := auxIntToInt32(v_0_1.AuxInt)
18832 v.reset(OpMul32)
18833 v0 := b.NewValue0(v.Pos, OpConst32, t)
18834 v0.AuxInt = int32ToAuxInt(-c)
18835 v.AddArg2(x, v0)
18836 return true
18837 }
18838 break
18839 }
18840
18841
18842 for {
18843 if v_0.Op != OpMul32 {
18844 break
18845 }
18846 _ = v_0.Args[1]
18847 v_0_0 := v_0.Args[0]
18848 v_0_1 := v_0.Args[1]
18849 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18850 x := v_0_0
18851 if v_0_1.Op != OpNeg32 {
18852 continue
18853 }
18854 y := v_0_1.Args[0]
18855 v.reset(OpMul32)
18856 v.AddArg2(x, y)
18857 return true
18858 }
18859 break
18860 }
18861
18862
18863 for {
18864 if v_0.Op != OpSub32 {
18865 break
18866 }
18867 y := v_0.Args[1]
18868 x := v_0.Args[0]
18869 v.reset(OpSub32)
18870 v.AddArg2(y, x)
18871 return true
18872 }
18873
18874
18875 for {
18876 if v_0.Op != OpNeg32 {
18877 break
18878 }
18879 x := v_0.Args[0]
18880 v.copyOf(x)
18881 return true
18882 }
18883
18884
18885 for {
18886 t := v.Type
18887 if v_0.Op != OpCom32 {
18888 break
18889 }
18890 x := v_0.Args[0]
18891 v.reset(OpAdd32)
18892 v0 := b.NewValue0(v.Pos, OpConst32, t)
18893 v0.AuxInt = int32ToAuxInt(1)
18894 v.AddArg2(v0, x)
18895 return true
18896 }
18897 return false
18898 }
18899 func rewriteValuegeneric_OpNeg32F(v *Value) bool {
18900 v_0 := v.Args[0]
18901
18902
18903
18904 for {
18905 if v_0.Op != OpConst32F {
18906 break
18907 }
18908 c := auxIntToFloat32(v_0.AuxInt)
18909 if !(c != 0) {
18910 break
18911 }
18912 v.reset(OpConst32F)
18913 v.AuxInt = float32ToAuxInt(-c)
18914 return true
18915 }
18916 return false
18917 }
18918 func rewriteValuegeneric_OpNeg64(v *Value) bool {
18919 v_0 := v.Args[0]
18920 b := v.Block
18921
18922
18923 for {
18924 if v_0.Op != OpConst64 {
18925 break
18926 }
18927 c := auxIntToInt64(v_0.AuxInt)
18928 v.reset(OpConst64)
18929 v.AuxInt = int64ToAuxInt(-c)
18930 return true
18931 }
18932
18933
18934 for {
18935 if v_0.Op != OpMul64 {
18936 break
18937 }
18938 _ = v_0.Args[1]
18939 v_0_0 := v_0.Args[0]
18940 v_0_1 := v_0.Args[1]
18941 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18942 x := v_0_0
18943 if v_0_1.Op != OpConst64 {
18944 continue
18945 }
18946 t := v_0_1.Type
18947 c := auxIntToInt64(v_0_1.AuxInt)
18948 v.reset(OpMul64)
18949 v0 := b.NewValue0(v.Pos, OpConst64, t)
18950 v0.AuxInt = int64ToAuxInt(-c)
18951 v.AddArg2(x, v0)
18952 return true
18953 }
18954 break
18955 }
18956
18957
18958 for {
18959 if v_0.Op != OpMul64 {
18960 break
18961 }
18962 _ = v_0.Args[1]
18963 v_0_0 := v_0.Args[0]
18964 v_0_1 := v_0.Args[1]
18965 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18966 x := v_0_0
18967 if v_0_1.Op != OpNeg64 {
18968 continue
18969 }
18970 y := v_0_1.Args[0]
18971 v.reset(OpMul64)
18972 v.AddArg2(x, y)
18973 return true
18974 }
18975 break
18976 }
18977
18978
18979 for {
18980 if v_0.Op != OpSub64 {
18981 break
18982 }
18983 y := v_0.Args[1]
18984 x := v_0.Args[0]
18985 v.reset(OpSub64)
18986 v.AddArg2(y, x)
18987 return true
18988 }
18989
18990
18991 for {
18992 if v_0.Op != OpNeg64 {
18993 break
18994 }
18995 x := v_0.Args[0]
18996 v.copyOf(x)
18997 return true
18998 }
18999
19000
19001 for {
19002 t := v.Type
19003 if v_0.Op != OpCom64 {
19004 break
19005 }
19006 x := v_0.Args[0]
19007 v.reset(OpAdd64)
19008 v0 := b.NewValue0(v.Pos, OpConst64, t)
19009 v0.AuxInt = int64ToAuxInt(1)
19010 v.AddArg2(v0, x)
19011 return true
19012 }
19013 return false
19014 }
19015 func rewriteValuegeneric_OpNeg64F(v *Value) bool {
19016 v_0 := v.Args[0]
19017
19018
19019
19020 for {
19021 if v_0.Op != OpConst64F {
19022 break
19023 }
19024 c := auxIntToFloat64(v_0.AuxInt)
19025 if !(c != 0) {
19026 break
19027 }
19028 v.reset(OpConst64F)
19029 v.AuxInt = float64ToAuxInt(-c)
19030 return true
19031 }
19032 return false
19033 }
19034 func rewriteValuegeneric_OpNeg8(v *Value) bool {
19035 v_0 := v.Args[0]
19036 b := v.Block
19037
19038
19039 for {
19040 if v_0.Op != OpConst8 {
19041 break
19042 }
19043 c := auxIntToInt8(v_0.AuxInt)
19044 v.reset(OpConst8)
19045 v.AuxInt = int8ToAuxInt(-c)
19046 return true
19047 }
19048
19049
19050 for {
19051 if v_0.Op != OpMul8 {
19052 break
19053 }
19054 _ = v_0.Args[1]
19055 v_0_0 := v_0.Args[0]
19056 v_0_1 := v_0.Args[1]
19057 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
19058 x := v_0_0
19059 if v_0_1.Op != OpConst8 {
19060 continue
19061 }
19062 t := v_0_1.Type
19063 c := auxIntToInt8(v_0_1.AuxInt)
19064 v.reset(OpMul8)
19065 v0 := b.NewValue0(v.Pos, OpConst8, t)
19066 v0.AuxInt = int8ToAuxInt(-c)
19067 v.AddArg2(x, v0)
19068 return true
19069 }
19070 break
19071 }
19072
19073
19074 for {
19075 if v_0.Op != OpMul8 {
19076 break
19077 }
19078 _ = v_0.Args[1]
19079 v_0_0 := v_0.Args[0]
19080 v_0_1 := v_0.Args[1]
19081 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
19082 x := v_0_0
19083 if v_0_1.Op != OpNeg8 {
19084 continue
19085 }
19086 y := v_0_1.Args[0]
19087 v.reset(OpMul8)
19088 v.AddArg2(x, y)
19089 return true
19090 }
19091 break
19092 }
19093
19094
19095 for {
19096 if v_0.Op != OpSub8 {
19097 break
19098 }
19099 y := v_0.Args[1]
19100 x := v_0.Args[0]
19101 v.reset(OpSub8)
19102 v.AddArg2(y, x)
19103 return true
19104 }
19105
19106
19107 for {
19108 if v_0.Op != OpNeg8 {
19109 break
19110 }
19111 x := v_0.Args[0]
19112 v.copyOf(x)
19113 return true
19114 }
19115
19116
19117 for {
19118 t := v.Type
19119 if v_0.Op != OpCom8 {
19120 break
19121 }
19122 x := v_0.Args[0]
19123 v.reset(OpAdd8)
19124 v0 := b.NewValue0(v.Pos, OpConst8, t)
19125 v0.AuxInt = int8ToAuxInt(1)
19126 v.AddArg2(v0, x)
19127 return true
19128 }
19129 return false
19130 }
19131 func rewriteValuegeneric_OpNeq16(v *Value) bool {
19132 v_1 := v.Args[1]
19133 v_0 := v.Args[0]
19134 b := v.Block
19135
19136
19137 for {
19138 x := v_0
19139 if x != v_1 {
19140 break
19141 }
19142 v.reset(OpConstBool)
19143 v.AuxInt = boolToAuxInt(false)
19144 return true
19145 }
19146
19147
19148 for {
19149 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19150 if v_0.Op != OpConst16 {
19151 continue
19152 }
19153 t := v_0.Type
19154 c := auxIntToInt16(v_0.AuxInt)
19155 if v_1.Op != OpAdd16 {
19156 continue
19157 }
19158 _ = v_1.Args[1]
19159 v_1_0 := v_1.Args[0]
19160 v_1_1 := v_1.Args[1]
19161 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19162 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
19163 continue
19164 }
19165 d := auxIntToInt16(v_1_0.AuxInt)
19166 x := v_1_1
19167 v.reset(OpNeq16)
19168 v0 := b.NewValue0(v.Pos, OpConst16, t)
19169 v0.AuxInt = int16ToAuxInt(c - d)
19170 v.AddArg2(v0, x)
19171 return true
19172 }
19173 }
19174 break
19175 }
19176
19177
19178 for {
19179 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19180 if v_0.Op != OpConst16 {
19181 continue
19182 }
19183 c := auxIntToInt16(v_0.AuxInt)
19184 if v_1.Op != OpConst16 {
19185 continue
19186 }
19187 d := auxIntToInt16(v_1.AuxInt)
19188 v.reset(OpConstBool)
19189 v.AuxInt = boolToAuxInt(c != d)
19190 return true
19191 }
19192 break
19193 }
19194
19195
19196
19197 for {
19198 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19199 s := v_0
19200 if s.Op != OpSub16 {
19201 continue
19202 }
19203 y := s.Args[1]
19204 x := s.Args[0]
19205 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(s.Uses == 1) {
19206 continue
19207 }
19208 v.reset(OpNeq16)
19209 v.AddArg2(x, y)
19210 return true
19211 }
19212 break
19213 }
19214
19215
19216
19217 for {
19218 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19219 if v_0.Op != OpAnd16 {
19220 continue
19221 }
19222 t := v_0.Type
19223 _ = v_0.Args[1]
19224 v_0_0 := v_0.Args[0]
19225 v_0_1 := v_0.Args[1]
19226 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19227 x := v_0_0
19228 if v_0_1.Op != OpConst16 || v_0_1.Type != t {
19229 continue
19230 }
19231 y := auxIntToInt16(v_0_1.AuxInt)
19232 if v_1.Op != OpConst16 || v_1.Type != t || auxIntToInt16(v_1.AuxInt) != y || !(oneBit(y)) {
19233 continue
19234 }
19235 v.reset(OpEq16)
19236 v0 := b.NewValue0(v.Pos, OpAnd16, t)
19237 v1 := b.NewValue0(v.Pos, OpConst16, t)
19238 v1.AuxInt = int16ToAuxInt(y)
19239 v0.AddArg2(x, v1)
19240 v2 := b.NewValue0(v.Pos, OpConst16, t)
19241 v2.AuxInt = int16ToAuxInt(0)
19242 v.AddArg2(v0, v2)
19243 return true
19244 }
19245 }
19246 break
19247 }
19248
19249
19250 for {
19251 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19252 if v_0.Op != OpZeroExt8to16 {
19253 continue
19254 }
19255 v_0_0 := v_0.Args[0]
19256 if v_0_0.Op != OpCvtBoolToUint8 {
19257 continue
19258 }
19259 x := v_0_0.Args[0]
19260 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
19261 continue
19262 }
19263 v.copyOf(x)
19264 return true
19265 }
19266 break
19267 }
19268
19269
19270 for {
19271 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19272 if v_0.Op != OpZeroExt8to16 {
19273 continue
19274 }
19275 v_0_0 := v_0.Args[0]
19276 if v_0_0.Op != OpCvtBoolToUint8 {
19277 continue
19278 }
19279 x := v_0_0.Args[0]
19280 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
19281 continue
19282 }
19283 v.reset(OpNot)
19284 v.AddArg(x)
19285 return true
19286 }
19287 break
19288 }
19289
19290
19291 for {
19292 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19293 if v_0.Op != OpSignExt8to16 {
19294 continue
19295 }
19296 v_0_0 := v_0.Args[0]
19297 if v_0_0.Op != OpCvtBoolToUint8 {
19298 continue
19299 }
19300 x := v_0_0.Args[0]
19301 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
19302 continue
19303 }
19304 v.copyOf(x)
19305 return true
19306 }
19307 break
19308 }
19309
19310
19311 for {
19312 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19313 if v_0.Op != OpSignExt8to16 {
19314 continue
19315 }
19316 v_0_0 := v_0.Args[0]
19317 if v_0_0.Op != OpCvtBoolToUint8 {
19318 continue
19319 }
19320 x := v_0_0.Args[0]
19321 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
19322 continue
19323 }
19324 v.reset(OpNot)
19325 v.AddArg(x)
19326 return true
19327 }
19328 break
19329 }
19330 return false
19331 }
19332 func rewriteValuegeneric_OpNeq32(v *Value) bool {
19333 v_1 := v.Args[1]
19334 v_0 := v.Args[0]
19335 b := v.Block
19336
19337
19338 for {
19339 x := v_0
19340 if x != v_1 {
19341 break
19342 }
19343 v.reset(OpConstBool)
19344 v.AuxInt = boolToAuxInt(false)
19345 return true
19346 }
19347
19348
19349 for {
19350 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19351 if v_0.Op != OpConst32 {
19352 continue
19353 }
19354 t := v_0.Type
19355 c := auxIntToInt32(v_0.AuxInt)
19356 if v_1.Op != OpAdd32 {
19357 continue
19358 }
19359 _ = v_1.Args[1]
19360 v_1_0 := v_1.Args[0]
19361 v_1_1 := v_1.Args[1]
19362 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19363 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
19364 continue
19365 }
19366 d := auxIntToInt32(v_1_0.AuxInt)
19367 x := v_1_1
19368 v.reset(OpNeq32)
19369 v0 := b.NewValue0(v.Pos, OpConst32, t)
19370 v0.AuxInt = int32ToAuxInt(c - d)
19371 v.AddArg2(v0, x)
19372 return true
19373 }
19374 }
19375 break
19376 }
19377
19378
19379 for {
19380 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19381 if v_0.Op != OpConst32 {
19382 continue
19383 }
19384 c := auxIntToInt32(v_0.AuxInt)
19385 if v_1.Op != OpConst32 {
19386 continue
19387 }
19388 d := auxIntToInt32(v_1.AuxInt)
19389 v.reset(OpConstBool)
19390 v.AuxInt = boolToAuxInt(c != d)
19391 return true
19392 }
19393 break
19394 }
19395
19396
19397
19398 for {
19399 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19400 s := v_0
19401 if s.Op != OpSub32 {
19402 continue
19403 }
19404 y := s.Args[1]
19405 x := s.Args[0]
19406 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 || !(s.Uses == 1) {
19407 continue
19408 }
19409 v.reset(OpNeq32)
19410 v.AddArg2(x, y)
19411 return true
19412 }
19413 break
19414 }
19415
19416
19417
19418 for {
19419 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19420 if v_0.Op != OpAnd32 {
19421 continue
19422 }
19423 t := v_0.Type
19424 _ = v_0.Args[1]
19425 v_0_0 := v_0.Args[0]
19426 v_0_1 := v_0.Args[1]
19427 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19428 x := v_0_0
19429 if v_0_1.Op != OpConst32 || v_0_1.Type != t {
19430 continue
19431 }
19432 y := auxIntToInt32(v_0_1.AuxInt)
19433 if v_1.Op != OpConst32 || v_1.Type != t || auxIntToInt32(v_1.AuxInt) != y || !(oneBit(y)) {
19434 continue
19435 }
19436 v.reset(OpEq32)
19437 v0 := b.NewValue0(v.Pos, OpAnd32, t)
19438 v1 := b.NewValue0(v.Pos, OpConst32, t)
19439 v1.AuxInt = int32ToAuxInt(y)
19440 v0.AddArg2(x, v1)
19441 v2 := b.NewValue0(v.Pos, OpConst32, t)
19442 v2.AuxInt = int32ToAuxInt(0)
19443 v.AddArg2(v0, v2)
19444 return true
19445 }
19446 }
19447 break
19448 }
19449
19450
19451 for {
19452 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19453 if v_0.Op != OpZeroExt8to32 {
19454 continue
19455 }
19456 v_0_0 := v_0.Args[0]
19457 if v_0_0.Op != OpCvtBoolToUint8 {
19458 continue
19459 }
19460 x := v_0_0.Args[0]
19461 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
19462 continue
19463 }
19464 v.copyOf(x)
19465 return true
19466 }
19467 break
19468 }
19469
19470
19471 for {
19472 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19473 if v_0.Op != OpZeroExt8to32 {
19474 continue
19475 }
19476 v_0_0 := v_0.Args[0]
19477 if v_0_0.Op != OpCvtBoolToUint8 {
19478 continue
19479 }
19480 x := v_0_0.Args[0]
19481 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
19482 continue
19483 }
19484 v.reset(OpNot)
19485 v.AddArg(x)
19486 return true
19487 }
19488 break
19489 }
19490
19491
19492 for {
19493 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19494 if v_0.Op != OpSignExt8to32 {
19495 continue
19496 }
19497 v_0_0 := v_0.Args[0]
19498 if v_0_0.Op != OpCvtBoolToUint8 {
19499 continue
19500 }
19501 x := v_0_0.Args[0]
19502 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
19503 continue
19504 }
19505 v.copyOf(x)
19506 return true
19507 }
19508 break
19509 }
19510
19511
19512 for {
19513 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19514 if v_0.Op != OpSignExt8to32 {
19515 continue
19516 }
19517 v_0_0 := v_0.Args[0]
19518 if v_0_0.Op != OpCvtBoolToUint8 {
19519 continue
19520 }
19521 x := v_0_0.Args[0]
19522 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
19523 continue
19524 }
19525 v.reset(OpNot)
19526 v.AddArg(x)
19527 return true
19528 }
19529 break
19530 }
19531 return false
19532 }
19533 func rewriteValuegeneric_OpNeq32F(v *Value) bool {
19534 v_1 := v.Args[1]
19535 v_0 := v.Args[0]
19536
19537
19538 for {
19539 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19540 if v_0.Op != OpConst32F {
19541 continue
19542 }
19543 c := auxIntToFloat32(v_0.AuxInt)
19544 if v_1.Op != OpConst32F {
19545 continue
19546 }
19547 d := auxIntToFloat32(v_1.AuxInt)
19548 v.reset(OpConstBool)
19549 v.AuxInt = boolToAuxInt(c != d)
19550 return true
19551 }
19552 break
19553 }
19554 return false
19555 }
19556 func rewriteValuegeneric_OpNeq64(v *Value) bool {
19557 v_1 := v.Args[1]
19558 v_0 := v.Args[0]
19559 b := v.Block
19560
19561
19562 for {
19563 x := v_0
19564 if x != v_1 {
19565 break
19566 }
19567 v.reset(OpConstBool)
19568 v.AuxInt = boolToAuxInt(false)
19569 return true
19570 }
19571
19572
19573 for {
19574 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19575 if v_0.Op != OpConst64 {
19576 continue
19577 }
19578 t := v_0.Type
19579 c := auxIntToInt64(v_0.AuxInt)
19580 if v_1.Op != OpAdd64 {
19581 continue
19582 }
19583 _ = v_1.Args[1]
19584 v_1_0 := v_1.Args[0]
19585 v_1_1 := v_1.Args[1]
19586 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19587 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
19588 continue
19589 }
19590 d := auxIntToInt64(v_1_0.AuxInt)
19591 x := v_1_1
19592 v.reset(OpNeq64)
19593 v0 := b.NewValue0(v.Pos, OpConst64, t)
19594 v0.AuxInt = int64ToAuxInt(c - d)
19595 v.AddArg2(v0, x)
19596 return true
19597 }
19598 }
19599 break
19600 }
19601
19602
19603 for {
19604 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19605 if v_0.Op != OpConst64 {
19606 continue
19607 }
19608 c := auxIntToInt64(v_0.AuxInt)
19609 if v_1.Op != OpConst64 {
19610 continue
19611 }
19612 d := auxIntToInt64(v_1.AuxInt)
19613 v.reset(OpConstBool)
19614 v.AuxInt = boolToAuxInt(c != d)
19615 return true
19616 }
19617 break
19618 }
19619
19620
19621
19622 for {
19623 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19624 s := v_0
19625 if s.Op != OpSub64 {
19626 continue
19627 }
19628 y := s.Args[1]
19629 x := s.Args[0]
19630 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 || !(s.Uses == 1) {
19631 continue
19632 }
19633 v.reset(OpNeq64)
19634 v.AddArg2(x, y)
19635 return true
19636 }
19637 break
19638 }
19639
19640
19641
19642 for {
19643 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19644 if v_0.Op != OpAnd64 {
19645 continue
19646 }
19647 t := v_0.Type
19648 _ = v_0.Args[1]
19649 v_0_0 := v_0.Args[0]
19650 v_0_1 := v_0.Args[1]
19651 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19652 x := v_0_0
19653 if v_0_1.Op != OpConst64 || v_0_1.Type != t {
19654 continue
19655 }
19656 y := auxIntToInt64(v_0_1.AuxInt)
19657 if v_1.Op != OpConst64 || v_1.Type != t || auxIntToInt64(v_1.AuxInt) != y || !(oneBit(y)) {
19658 continue
19659 }
19660 v.reset(OpEq64)
19661 v0 := b.NewValue0(v.Pos, OpAnd64, t)
19662 v1 := b.NewValue0(v.Pos, OpConst64, t)
19663 v1.AuxInt = int64ToAuxInt(y)
19664 v0.AddArg2(x, v1)
19665 v2 := b.NewValue0(v.Pos, OpConst64, t)
19666 v2.AuxInt = int64ToAuxInt(0)
19667 v.AddArg2(v0, v2)
19668 return true
19669 }
19670 }
19671 break
19672 }
19673
19674
19675 for {
19676 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19677 if v_0.Op != OpZeroExt8to64 {
19678 continue
19679 }
19680 v_0_0 := v_0.Args[0]
19681 if v_0_0.Op != OpCvtBoolToUint8 {
19682 continue
19683 }
19684 x := v_0_0.Args[0]
19685 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
19686 continue
19687 }
19688 v.copyOf(x)
19689 return true
19690 }
19691 break
19692 }
19693
19694
19695 for {
19696 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19697 if v_0.Op != OpZeroExt8to64 {
19698 continue
19699 }
19700 v_0_0 := v_0.Args[0]
19701 if v_0_0.Op != OpCvtBoolToUint8 {
19702 continue
19703 }
19704 x := v_0_0.Args[0]
19705 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
19706 continue
19707 }
19708 v.reset(OpNot)
19709 v.AddArg(x)
19710 return true
19711 }
19712 break
19713 }
19714
19715
19716 for {
19717 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19718 if v_0.Op != OpSignExt8to64 {
19719 continue
19720 }
19721 v_0_0 := v_0.Args[0]
19722 if v_0_0.Op != OpCvtBoolToUint8 {
19723 continue
19724 }
19725 x := v_0_0.Args[0]
19726 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
19727 continue
19728 }
19729 v.copyOf(x)
19730 return true
19731 }
19732 break
19733 }
19734
19735
19736 for {
19737 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19738 if v_0.Op != OpSignExt8to64 {
19739 continue
19740 }
19741 v_0_0 := v_0.Args[0]
19742 if v_0_0.Op != OpCvtBoolToUint8 {
19743 continue
19744 }
19745 x := v_0_0.Args[0]
19746 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
19747 continue
19748 }
19749 v.reset(OpNot)
19750 v.AddArg(x)
19751 return true
19752 }
19753 break
19754 }
19755 return false
19756 }
19757 func rewriteValuegeneric_OpNeq64F(v *Value) bool {
19758 v_1 := v.Args[1]
19759 v_0 := v.Args[0]
19760
19761
19762 for {
19763 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19764 if v_0.Op != OpConst64F {
19765 continue
19766 }
19767 c := auxIntToFloat64(v_0.AuxInt)
19768 if v_1.Op != OpConst64F {
19769 continue
19770 }
19771 d := auxIntToFloat64(v_1.AuxInt)
19772 v.reset(OpConstBool)
19773 v.AuxInt = boolToAuxInt(c != d)
19774 return true
19775 }
19776 break
19777 }
19778 return false
19779 }
19780 func rewriteValuegeneric_OpNeq8(v *Value) bool {
19781 v_1 := v.Args[1]
19782 v_0 := v.Args[0]
19783 b := v.Block
19784
19785
19786 for {
19787 x := v_0
19788 if x != v_1 {
19789 break
19790 }
19791 v.reset(OpConstBool)
19792 v.AuxInt = boolToAuxInt(false)
19793 return true
19794 }
19795
19796
19797 for {
19798 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19799 if v_0.Op != OpConst8 {
19800 continue
19801 }
19802 t := v_0.Type
19803 c := auxIntToInt8(v_0.AuxInt)
19804 if v_1.Op != OpAdd8 {
19805 continue
19806 }
19807 _ = v_1.Args[1]
19808 v_1_0 := v_1.Args[0]
19809 v_1_1 := v_1.Args[1]
19810 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19811 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
19812 continue
19813 }
19814 d := auxIntToInt8(v_1_0.AuxInt)
19815 x := v_1_1
19816 v.reset(OpNeq8)
19817 v0 := b.NewValue0(v.Pos, OpConst8, t)
19818 v0.AuxInt = int8ToAuxInt(c - d)
19819 v.AddArg2(v0, x)
19820 return true
19821 }
19822 }
19823 break
19824 }
19825
19826
19827 for {
19828 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19829 if v_0.Op != OpConst8 {
19830 continue
19831 }
19832 c := auxIntToInt8(v_0.AuxInt)
19833 if v_1.Op != OpConst8 {
19834 continue
19835 }
19836 d := auxIntToInt8(v_1.AuxInt)
19837 v.reset(OpConstBool)
19838 v.AuxInt = boolToAuxInt(c != d)
19839 return true
19840 }
19841 break
19842 }
19843
19844
19845
19846 for {
19847 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19848 s := v_0
19849 if s.Op != OpSub8 {
19850 continue
19851 }
19852 y := s.Args[1]
19853 x := s.Args[0]
19854 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(s.Uses == 1) {
19855 continue
19856 }
19857 v.reset(OpNeq8)
19858 v.AddArg2(x, y)
19859 return true
19860 }
19861 break
19862 }
19863
19864
19865
19866 for {
19867 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19868 if v_0.Op != OpAnd8 {
19869 continue
19870 }
19871 t := v_0.Type
19872 _ = v_0.Args[1]
19873 v_0_0 := v_0.Args[0]
19874 v_0_1 := v_0.Args[1]
19875 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19876 x := v_0_0
19877 if v_0_1.Op != OpConst8 || v_0_1.Type != t {
19878 continue
19879 }
19880 y := auxIntToInt8(v_0_1.AuxInt)
19881 if v_1.Op != OpConst8 || v_1.Type != t || auxIntToInt8(v_1.AuxInt) != y || !(oneBit(y)) {
19882 continue
19883 }
19884 v.reset(OpEq8)
19885 v0 := b.NewValue0(v.Pos, OpAnd8, t)
19886 v1 := b.NewValue0(v.Pos, OpConst8, t)
19887 v1.AuxInt = int8ToAuxInt(y)
19888 v0.AddArg2(x, v1)
19889 v2 := b.NewValue0(v.Pos, OpConst8, t)
19890 v2.AuxInt = int8ToAuxInt(0)
19891 v.AddArg2(v0, v2)
19892 return true
19893 }
19894 }
19895 break
19896 }
19897
19898
19899 for {
19900 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19901 if v_0.Op != OpCvtBoolToUint8 {
19902 continue
19903 }
19904 x := v_0.Args[0]
19905 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
19906 continue
19907 }
19908 v.copyOf(x)
19909 return true
19910 }
19911 break
19912 }
19913
19914
19915 for {
19916 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19917 if v_0.Op != OpCvtBoolToUint8 {
19918 continue
19919 }
19920 x := v_0.Args[0]
19921 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 1 {
19922 continue
19923 }
19924 v.reset(OpNot)
19925 v.AddArg(x)
19926 return true
19927 }
19928 break
19929 }
19930 return false
19931 }
19932 func rewriteValuegeneric_OpNeqB(v *Value) bool {
19933 v_1 := v.Args[1]
19934 v_0 := v.Args[0]
19935
19936
19937 for {
19938 x := v_0
19939 if x != v_1 {
19940 break
19941 }
19942 v.reset(OpConstBool)
19943 v.AuxInt = boolToAuxInt(false)
19944 return true
19945 }
19946
19947
19948 for {
19949 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19950 if v_0.Op != OpConstBool {
19951 continue
19952 }
19953 c := auxIntToBool(v_0.AuxInt)
19954 if v_1.Op != OpConstBool {
19955 continue
19956 }
19957 d := auxIntToBool(v_1.AuxInt)
19958 v.reset(OpConstBool)
19959 v.AuxInt = boolToAuxInt(c != d)
19960 return true
19961 }
19962 break
19963 }
19964
19965
19966 for {
19967 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19968 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
19969 continue
19970 }
19971 x := v_1
19972 v.copyOf(x)
19973 return true
19974 }
19975 break
19976 }
19977
19978
19979 for {
19980 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19981 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
19982 continue
19983 }
19984 x := v_1
19985 v.reset(OpNot)
19986 v.AddArg(x)
19987 return true
19988 }
19989 break
19990 }
19991
19992
19993 for {
19994 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19995 if v_0.Op != OpNot {
19996 continue
19997 }
19998 x := v_0.Args[0]
19999 y := v_1
20000 v.reset(OpEqB)
20001 v.AddArg2(x, y)
20002 return true
20003 }
20004 break
20005 }
20006 return false
20007 }
20008 func rewriteValuegeneric_OpNeqInter(v *Value) bool {
20009 v_1 := v.Args[1]
20010 v_0 := v.Args[0]
20011 b := v.Block
20012 typ := &b.Func.Config.Types
20013
20014
20015 for {
20016 x := v_0
20017 y := v_1
20018 v.reset(OpNeqPtr)
20019 v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
20020 v0.AddArg(x)
20021 v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
20022 v1.AddArg(y)
20023 v.AddArg2(v0, v1)
20024 return true
20025 }
20026 }
20027 func rewriteValuegeneric_OpNeqPtr(v *Value) bool {
20028 v_1 := v.Args[1]
20029 v_0 := v.Args[0]
20030
20031
20032 for {
20033 x := v_0
20034 if x != v_1 {
20035 break
20036 }
20037 v.reset(OpConstBool)
20038 v.AuxInt = boolToAuxInt(false)
20039 return true
20040 }
20041
20042
20043 for {
20044 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20045 if v_0.Op != OpAddr {
20046 continue
20047 }
20048 x := auxToSym(v_0.Aux)
20049 if v_1.Op != OpAddr {
20050 continue
20051 }
20052 y := auxToSym(v_1.Aux)
20053 v.reset(OpConstBool)
20054 v.AuxInt = boolToAuxInt(x != y)
20055 return true
20056 }
20057 break
20058 }
20059
20060
20061 for {
20062 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20063 if v_0.Op != OpAddr {
20064 continue
20065 }
20066 x := auxToSym(v_0.Aux)
20067 if v_1.Op != OpOffPtr {
20068 continue
20069 }
20070 o := auxIntToInt64(v_1.AuxInt)
20071 v_1_0 := v_1.Args[0]
20072 if v_1_0.Op != OpAddr {
20073 continue
20074 }
20075 y := auxToSym(v_1_0.Aux)
20076 v.reset(OpConstBool)
20077 v.AuxInt = boolToAuxInt(x != y || o != 0)
20078 return true
20079 }
20080 break
20081 }
20082
20083
20084 for {
20085 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20086 if v_0.Op != OpOffPtr {
20087 continue
20088 }
20089 o1 := auxIntToInt64(v_0.AuxInt)
20090 v_0_0 := v_0.Args[0]
20091 if v_0_0.Op != OpAddr {
20092 continue
20093 }
20094 x := auxToSym(v_0_0.Aux)
20095 if v_1.Op != OpOffPtr {
20096 continue
20097 }
20098 o2 := auxIntToInt64(v_1.AuxInt)
20099 v_1_0 := v_1.Args[0]
20100 if v_1_0.Op != OpAddr {
20101 continue
20102 }
20103 y := auxToSym(v_1_0.Aux)
20104 v.reset(OpConstBool)
20105 v.AuxInt = boolToAuxInt(x != y || o1 != o2)
20106 return true
20107 }
20108 break
20109 }
20110
20111
20112 for {
20113 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20114 if v_0.Op != OpLocalAddr {
20115 continue
20116 }
20117 x := auxToSym(v_0.Aux)
20118 if v_1.Op != OpLocalAddr {
20119 continue
20120 }
20121 y := auxToSym(v_1.Aux)
20122 v.reset(OpConstBool)
20123 v.AuxInt = boolToAuxInt(x != y)
20124 return true
20125 }
20126 break
20127 }
20128
20129
20130 for {
20131 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20132 if v_0.Op != OpLocalAddr {
20133 continue
20134 }
20135 x := auxToSym(v_0.Aux)
20136 if v_1.Op != OpOffPtr {
20137 continue
20138 }
20139 o := auxIntToInt64(v_1.AuxInt)
20140 v_1_0 := v_1.Args[0]
20141 if v_1_0.Op != OpLocalAddr {
20142 continue
20143 }
20144 y := auxToSym(v_1_0.Aux)
20145 v.reset(OpConstBool)
20146 v.AuxInt = boolToAuxInt(x != y || o != 0)
20147 return true
20148 }
20149 break
20150 }
20151
20152
20153 for {
20154 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20155 if v_0.Op != OpOffPtr {
20156 continue
20157 }
20158 o1 := auxIntToInt64(v_0.AuxInt)
20159 v_0_0 := v_0.Args[0]
20160 if v_0_0.Op != OpLocalAddr {
20161 continue
20162 }
20163 x := auxToSym(v_0_0.Aux)
20164 if v_1.Op != OpOffPtr {
20165 continue
20166 }
20167 o2 := auxIntToInt64(v_1.AuxInt)
20168 v_1_0 := v_1.Args[0]
20169 if v_1_0.Op != OpLocalAddr {
20170 continue
20171 }
20172 y := auxToSym(v_1_0.Aux)
20173 v.reset(OpConstBool)
20174 v.AuxInt = boolToAuxInt(x != y || o1 != o2)
20175 return true
20176 }
20177 break
20178 }
20179
20180
20181
20182 for {
20183 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20184 if v_0.Op != OpOffPtr {
20185 continue
20186 }
20187 o1 := auxIntToInt64(v_0.AuxInt)
20188 p1 := v_0.Args[0]
20189 p2 := v_1
20190 if !(isSamePtr(p1, p2)) {
20191 continue
20192 }
20193 v.reset(OpConstBool)
20194 v.AuxInt = boolToAuxInt(o1 != 0)
20195 return true
20196 }
20197 break
20198 }
20199
20200
20201
20202 for {
20203 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20204 if v_0.Op != OpOffPtr {
20205 continue
20206 }
20207 o1 := auxIntToInt64(v_0.AuxInt)
20208 p1 := v_0.Args[0]
20209 if v_1.Op != OpOffPtr {
20210 continue
20211 }
20212 o2 := auxIntToInt64(v_1.AuxInt)
20213 p2 := v_1.Args[0]
20214 if !(isSamePtr(p1, p2)) {
20215 continue
20216 }
20217 v.reset(OpConstBool)
20218 v.AuxInt = boolToAuxInt(o1 != o2)
20219 return true
20220 }
20221 break
20222 }
20223
20224
20225 for {
20226 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20227 if v_0.Op != OpConst32 {
20228 continue
20229 }
20230 c := auxIntToInt32(v_0.AuxInt)
20231 if v_1.Op != OpConst32 {
20232 continue
20233 }
20234 d := auxIntToInt32(v_1.AuxInt)
20235 v.reset(OpConstBool)
20236 v.AuxInt = boolToAuxInt(c != d)
20237 return true
20238 }
20239 break
20240 }
20241
20242
20243 for {
20244 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20245 if v_0.Op != OpConst64 {
20246 continue
20247 }
20248 c := auxIntToInt64(v_0.AuxInt)
20249 if v_1.Op != OpConst64 {
20250 continue
20251 }
20252 d := auxIntToInt64(v_1.AuxInt)
20253 v.reset(OpConstBool)
20254 v.AuxInt = boolToAuxInt(c != d)
20255 return true
20256 }
20257 break
20258 }
20259
20260
20261 for {
20262 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20263 if v_0.Op != OpConvert {
20264 continue
20265 }
20266 v_0_0 := v_0.Args[0]
20267 if v_0_0.Op != OpAddr {
20268 continue
20269 }
20270 x := auxToSym(v_0_0.Aux)
20271 if v_1.Op != OpAddr {
20272 continue
20273 }
20274 y := auxToSym(v_1.Aux)
20275 v.reset(OpConstBool)
20276 v.AuxInt = boolToAuxInt(x != y)
20277 return true
20278 }
20279 break
20280 }
20281
20282
20283 for {
20284 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20285 if v_0.Op != OpLocalAddr || v_1.Op != OpAddr {
20286 continue
20287 }
20288 v.reset(OpConstBool)
20289 v.AuxInt = boolToAuxInt(true)
20290 return true
20291 }
20292 break
20293 }
20294
20295
20296 for {
20297 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20298 if v_0.Op != OpOffPtr {
20299 continue
20300 }
20301 v_0_0 := v_0.Args[0]
20302 if v_0_0.Op != OpLocalAddr || v_1.Op != OpAddr {
20303 continue
20304 }
20305 v.reset(OpConstBool)
20306 v.AuxInt = boolToAuxInt(true)
20307 return true
20308 }
20309 break
20310 }
20311
20312
20313 for {
20314 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20315 if v_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
20316 continue
20317 }
20318 v_1_0 := v_1.Args[0]
20319 if v_1_0.Op != OpAddr {
20320 continue
20321 }
20322 v.reset(OpConstBool)
20323 v.AuxInt = boolToAuxInt(true)
20324 return true
20325 }
20326 break
20327 }
20328
20329
20330 for {
20331 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20332 if v_0.Op != OpOffPtr {
20333 continue
20334 }
20335 v_0_0 := v_0.Args[0]
20336 if v_0_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
20337 continue
20338 }
20339 v_1_0 := v_1.Args[0]
20340 if v_1_0.Op != OpAddr {
20341 continue
20342 }
20343 v.reset(OpConstBool)
20344 v.AuxInt = boolToAuxInt(true)
20345 return true
20346 }
20347 break
20348 }
20349
20350
20351
20352 for {
20353 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20354 if v_0.Op != OpAddPtr {
20355 continue
20356 }
20357 o1 := v_0.Args[1]
20358 p1 := v_0.Args[0]
20359 p2 := v_1
20360 if !(isSamePtr(p1, p2)) {
20361 continue
20362 }
20363 v.reset(OpIsNonNil)
20364 v.AddArg(o1)
20365 return true
20366 }
20367 break
20368 }
20369
20370
20371 for {
20372 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20373 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
20374 continue
20375 }
20376 p := v_1
20377 v.reset(OpIsNonNil)
20378 v.AddArg(p)
20379 return true
20380 }
20381 break
20382 }
20383
20384
20385 for {
20386 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20387 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
20388 continue
20389 }
20390 p := v_1
20391 v.reset(OpIsNonNil)
20392 v.AddArg(p)
20393 return true
20394 }
20395 break
20396 }
20397
20398
20399 for {
20400 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20401 if v_0.Op != OpConstNil {
20402 continue
20403 }
20404 p := v_1
20405 v.reset(OpIsNonNil)
20406 v.AddArg(p)
20407 return true
20408 }
20409 break
20410 }
20411 return false
20412 }
20413 func rewriteValuegeneric_OpNeqSlice(v *Value) bool {
20414 v_1 := v.Args[1]
20415 v_0 := v.Args[0]
20416 b := v.Block
20417 typ := &b.Func.Config.Types
20418
20419
20420 for {
20421 x := v_0
20422 y := v_1
20423 v.reset(OpNeqPtr)
20424 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
20425 v0.AddArg(x)
20426 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
20427 v1.AddArg(y)
20428 v.AddArg2(v0, v1)
20429 return true
20430 }
20431 }
20432 func rewriteValuegeneric_OpNilCheck(v *Value) bool {
20433 v_1 := v.Args[1]
20434 v_0 := v.Args[0]
20435 b := v.Block
20436 fe := b.Func.fe
20437
20438
20439 for {
20440 ptr := v_0
20441 if ptr.Op != OpGetG {
20442 break
20443 }
20444 mem := ptr.Args[0]
20445 if mem != v_1 {
20446 break
20447 }
20448 v.copyOf(ptr)
20449 return true
20450 }
20451
20452
20453
20454 for {
20455 ptr := v_0
20456 if ptr.Op != OpSelectN || auxIntToInt64(ptr.AuxInt) != 0 {
20457 break
20458 }
20459 call := ptr.Args[0]
20460 if call.Op != OpStaticLECall {
20461 break
20462 }
20463 if !(isMalloc(call.Aux) && warnRule(fe.Debug_checknil(), v, "removed nil check")) {
20464 break
20465 }
20466 v.copyOf(ptr)
20467 return true
20468 }
20469
20470
20471
20472 for {
20473 ptr := v_0
20474 if ptr.Op != OpOffPtr {
20475 break
20476 }
20477 ptr_0 := ptr.Args[0]
20478 if ptr_0.Op != OpSelectN || auxIntToInt64(ptr_0.AuxInt) != 0 {
20479 break
20480 }
20481 call := ptr_0.Args[0]
20482 if call.Op != OpStaticLECall {
20483 break
20484 }
20485 if !(isMalloc(call.Aux) && warnRule(fe.Debug_checknil(), v, "removed nil check")) {
20486 break
20487 }
20488 v.copyOf(ptr)
20489 return true
20490 }
20491
20492
20493 for {
20494 ptr := v_0
20495 if ptr.Op != OpAddr {
20496 break
20497 }
20498 ptr_0 := ptr.Args[0]
20499 if ptr_0.Op != OpSB {
20500 break
20501 }
20502 v.copyOf(ptr)
20503 return true
20504 }
20505
20506
20507 for {
20508 ptr := v_0
20509 if ptr.Op != OpConvert {
20510 break
20511 }
20512 ptr_0 := ptr.Args[0]
20513 if ptr_0.Op != OpAddr {
20514 break
20515 }
20516 ptr_0_0 := ptr_0.Args[0]
20517 if ptr_0_0.Op != OpSB {
20518 break
20519 }
20520 v.copyOf(ptr)
20521 return true
20522 }
20523
20524
20525
20526 for {
20527 ptr := v_0
20528 if ptr.Op != OpLocalAddr || !(warnRule(fe.Debug_checknil(), v, "removed nil check")) {
20529 break
20530 }
20531 v.copyOf(ptr)
20532 return true
20533 }
20534
20535
20536
20537 for {
20538 ptr := v_0
20539 if ptr.Op != OpArg {
20540 break
20541 }
20542 sym := auxToSym(ptr.Aux)
20543 if !(isDictArgSym(sym)) {
20544 break
20545 }
20546 v.copyOf(ptr)
20547 return true
20548 }
20549
20550
20551 for {
20552 ptr := v_0
20553 if ptr.Op != OpNilCheck {
20554 break
20555 }
20556 v.copyOf(ptr)
20557 return true
20558 }
20559 return false
20560 }
20561 func rewriteValuegeneric_OpNot(v *Value) bool {
20562 v_0 := v.Args[0]
20563
20564
20565 for {
20566 if v_0.Op != OpConstBool {
20567 break
20568 }
20569 c := auxIntToBool(v_0.AuxInt)
20570 v.reset(OpConstBool)
20571 v.AuxInt = boolToAuxInt(!c)
20572 return true
20573 }
20574
20575
20576 for {
20577 if v_0.Op != OpEq64 {
20578 break
20579 }
20580 y := v_0.Args[1]
20581 x := v_0.Args[0]
20582 v.reset(OpNeq64)
20583 v.AddArg2(x, y)
20584 return true
20585 }
20586
20587
20588 for {
20589 if v_0.Op != OpEq32 {
20590 break
20591 }
20592 y := v_0.Args[1]
20593 x := v_0.Args[0]
20594 v.reset(OpNeq32)
20595 v.AddArg2(x, y)
20596 return true
20597 }
20598
20599
20600 for {
20601 if v_0.Op != OpEq16 {
20602 break
20603 }
20604 y := v_0.Args[1]
20605 x := v_0.Args[0]
20606 v.reset(OpNeq16)
20607 v.AddArg2(x, y)
20608 return true
20609 }
20610
20611
20612 for {
20613 if v_0.Op != OpEq8 {
20614 break
20615 }
20616 y := v_0.Args[1]
20617 x := v_0.Args[0]
20618 v.reset(OpNeq8)
20619 v.AddArg2(x, y)
20620 return true
20621 }
20622
20623
20624 for {
20625 if v_0.Op != OpEqB {
20626 break
20627 }
20628 y := v_0.Args[1]
20629 x := v_0.Args[0]
20630 v.reset(OpNeqB)
20631 v.AddArg2(x, y)
20632 return true
20633 }
20634
20635
20636 for {
20637 if v_0.Op != OpEqPtr {
20638 break
20639 }
20640 y := v_0.Args[1]
20641 x := v_0.Args[0]
20642 v.reset(OpNeqPtr)
20643 v.AddArg2(x, y)
20644 return true
20645 }
20646
20647
20648 for {
20649 if v_0.Op != OpEq64F {
20650 break
20651 }
20652 y := v_0.Args[1]
20653 x := v_0.Args[0]
20654 v.reset(OpNeq64F)
20655 v.AddArg2(x, y)
20656 return true
20657 }
20658
20659
20660 for {
20661 if v_0.Op != OpEq32F {
20662 break
20663 }
20664 y := v_0.Args[1]
20665 x := v_0.Args[0]
20666 v.reset(OpNeq32F)
20667 v.AddArg2(x, y)
20668 return true
20669 }
20670
20671
20672 for {
20673 if v_0.Op != OpNeq64 {
20674 break
20675 }
20676 y := v_0.Args[1]
20677 x := v_0.Args[0]
20678 v.reset(OpEq64)
20679 v.AddArg2(x, y)
20680 return true
20681 }
20682
20683
20684 for {
20685 if v_0.Op != OpNeq32 {
20686 break
20687 }
20688 y := v_0.Args[1]
20689 x := v_0.Args[0]
20690 v.reset(OpEq32)
20691 v.AddArg2(x, y)
20692 return true
20693 }
20694
20695
20696 for {
20697 if v_0.Op != OpNeq16 {
20698 break
20699 }
20700 y := v_0.Args[1]
20701 x := v_0.Args[0]
20702 v.reset(OpEq16)
20703 v.AddArg2(x, y)
20704 return true
20705 }
20706
20707
20708 for {
20709 if v_0.Op != OpNeq8 {
20710 break
20711 }
20712 y := v_0.Args[1]
20713 x := v_0.Args[0]
20714 v.reset(OpEq8)
20715 v.AddArg2(x, y)
20716 return true
20717 }
20718
20719
20720 for {
20721 if v_0.Op != OpNeqB {
20722 break
20723 }
20724 y := v_0.Args[1]
20725 x := v_0.Args[0]
20726 v.reset(OpEqB)
20727 v.AddArg2(x, y)
20728 return true
20729 }
20730
20731
20732 for {
20733 if v_0.Op != OpNeqPtr {
20734 break
20735 }
20736 y := v_0.Args[1]
20737 x := v_0.Args[0]
20738 v.reset(OpEqPtr)
20739 v.AddArg2(x, y)
20740 return true
20741 }
20742
20743
20744 for {
20745 if v_0.Op != OpNeq64F {
20746 break
20747 }
20748 y := v_0.Args[1]
20749 x := v_0.Args[0]
20750 v.reset(OpEq64F)
20751 v.AddArg2(x, y)
20752 return true
20753 }
20754
20755
20756 for {
20757 if v_0.Op != OpNeq32F {
20758 break
20759 }
20760 y := v_0.Args[1]
20761 x := v_0.Args[0]
20762 v.reset(OpEq32F)
20763 v.AddArg2(x, y)
20764 return true
20765 }
20766
20767
20768 for {
20769 if v_0.Op != OpLess64 {
20770 break
20771 }
20772 y := v_0.Args[1]
20773 x := v_0.Args[0]
20774 v.reset(OpLeq64)
20775 v.AddArg2(y, x)
20776 return true
20777 }
20778
20779
20780 for {
20781 if v_0.Op != OpLess32 {
20782 break
20783 }
20784 y := v_0.Args[1]
20785 x := v_0.Args[0]
20786 v.reset(OpLeq32)
20787 v.AddArg2(y, x)
20788 return true
20789 }
20790
20791
20792 for {
20793 if v_0.Op != OpLess16 {
20794 break
20795 }
20796 y := v_0.Args[1]
20797 x := v_0.Args[0]
20798 v.reset(OpLeq16)
20799 v.AddArg2(y, x)
20800 return true
20801 }
20802
20803
20804 for {
20805 if v_0.Op != OpLess8 {
20806 break
20807 }
20808 y := v_0.Args[1]
20809 x := v_0.Args[0]
20810 v.reset(OpLeq8)
20811 v.AddArg2(y, x)
20812 return true
20813 }
20814
20815
20816 for {
20817 if v_0.Op != OpLess64U {
20818 break
20819 }
20820 y := v_0.Args[1]
20821 x := v_0.Args[0]
20822 v.reset(OpLeq64U)
20823 v.AddArg2(y, x)
20824 return true
20825 }
20826
20827
20828 for {
20829 if v_0.Op != OpLess32U {
20830 break
20831 }
20832 y := v_0.Args[1]
20833 x := v_0.Args[0]
20834 v.reset(OpLeq32U)
20835 v.AddArg2(y, x)
20836 return true
20837 }
20838
20839
20840 for {
20841 if v_0.Op != OpLess16U {
20842 break
20843 }
20844 y := v_0.Args[1]
20845 x := v_0.Args[0]
20846 v.reset(OpLeq16U)
20847 v.AddArg2(y, x)
20848 return true
20849 }
20850
20851
20852 for {
20853 if v_0.Op != OpLess8U {
20854 break
20855 }
20856 y := v_0.Args[1]
20857 x := v_0.Args[0]
20858 v.reset(OpLeq8U)
20859 v.AddArg2(y, x)
20860 return true
20861 }
20862
20863
20864 for {
20865 if v_0.Op != OpLeq64 {
20866 break
20867 }
20868 y := v_0.Args[1]
20869 x := v_0.Args[0]
20870 v.reset(OpLess64)
20871 v.AddArg2(y, x)
20872 return true
20873 }
20874
20875
20876 for {
20877 if v_0.Op != OpLeq32 {
20878 break
20879 }
20880 y := v_0.Args[1]
20881 x := v_0.Args[0]
20882 v.reset(OpLess32)
20883 v.AddArg2(y, x)
20884 return true
20885 }
20886
20887
20888 for {
20889 if v_0.Op != OpLeq16 {
20890 break
20891 }
20892 y := v_0.Args[1]
20893 x := v_0.Args[0]
20894 v.reset(OpLess16)
20895 v.AddArg2(y, x)
20896 return true
20897 }
20898
20899
20900 for {
20901 if v_0.Op != OpLeq8 {
20902 break
20903 }
20904 y := v_0.Args[1]
20905 x := v_0.Args[0]
20906 v.reset(OpLess8)
20907 v.AddArg2(y, x)
20908 return true
20909 }
20910
20911
20912 for {
20913 if v_0.Op != OpLeq64U {
20914 break
20915 }
20916 y := v_0.Args[1]
20917 x := v_0.Args[0]
20918 v.reset(OpLess64U)
20919 v.AddArg2(y, x)
20920 return true
20921 }
20922
20923
20924 for {
20925 if v_0.Op != OpLeq32U {
20926 break
20927 }
20928 y := v_0.Args[1]
20929 x := v_0.Args[0]
20930 v.reset(OpLess32U)
20931 v.AddArg2(y, x)
20932 return true
20933 }
20934
20935
20936 for {
20937 if v_0.Op != OpLeq16U {
20938 break
20939 }
20940 y := v_0.Args[1]
20941 x := v_0.Args[0]
20942 v.reset(OpLess16U)
20943 v.AddArg2(y, x)
20944 return true
20945 }
20946
20947
20948 for {
20949 if v_0.Op != OpLeq8U {
20950 break
20951 }
20952 y := v_0.Args[1]
20953 x := v_0.Args[0]
20954 v.reset(OpLess8U)
20955 v.AddArg2(y, x)
20956 return true
20957 }
20958 return false
20959 }
20960 func rewriteValuegeneric_OpOffPtr(v *Value) bool {
20961 v_0 := v.Args[0]
20962
20963
20964 for {
20965 x := auxIntToInt64(v.AuxInt)
20966 if v_0.Op != OpOffPtr {
20967 break
20968 }
20969 y := auxIntToInt64(v_0.AuxInt)
20970 p := v_0.Args[0]
20971 v.reset(OpOffPtr)
20972 v.AuxInt = int64ToAuxInt(x + y)
20973 v.AddArg(p)
20974 return true
20975 }
20976
20977
20978
20979 for {
20980 if auxIntToInt64(v.AuxInt) != 0 {
20981 break
20982 }
20983 p := v_0
20984 if !(v.Type.Compare(p.Type) == types.CMPeq) {
20985 break
20986 }
20987 v.copyOf(p)
20988 return true
20989 }
20990 return false
20991 }
20992 func rewriteValuegeneric_OpOr16(v *Value) bool {
20993 v_1 := v.Args[1]
20994 v_0 := v.Args[0]
20995 b := v.Block
20996 config := b.Func.Config
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 != OpConst16 {
21002 continue
21003 }
21004 c := auxIntToInt16(v_0.AuxInt)
21005 if v_1.Op != OpConst16 {
21006 continue
21007 }
21008 d := auxIntToInt16(v_1.AuxInt)
21009 v.reset(OpConst16)
21010 v.AuxInt = int16ToAuxInt(c | d)
21011 return true
21012 }
21013 break
21014 }
21015
21016
21017 for {
21018 t := v.Type
21019 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21020 if v_0.Op != OpCom16 {
21021 continue
21022 }
21023 x := v_0.Args[0]
21024 if v_1.Op != OpCom16 {
21025 continue
21026 }
21027 y := v_1.Args[0]
21028 v.reset(OpCom16)
21029 v0 := b.NewValue0(v.Pos, OpAnd16, t)
21030 v0.AddArg2(x, y)
21031 v.AddArg(v0)
21032 return true
21033 }
21034 break
21035 }
21036
21037
21038 for {
21039 x := v_0
21040 if x != v_1 {
21041 break
21042 }
21043 v.copyOf(x)
21044 return true
21045 }
21046
21047
21048 for {
21049 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21050 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
21051 continue
21052 }
21053 x := v_1
21054 v.copyOf(x)
21055 return true
21056 }
21057 break
21058 }
21059
21060
21061 for {
21062 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21063 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
21064 continue
21065 }
21066 v.reset(OpConst16)
21067 v.AuxInt = int16ToAuxInt(-1)
21068 return true
21069 }
21070 break
21071 }
21072
21073
21074 for {
21075 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21076 if v_0.Op != OpCom16 {
21077 continue
21078 }
21079 x := v_0.Args[0]
21080 if x != v_1 {
21081 continue
21082 }
21083 v.reset(OpConst16)
21084 v.AuxInt = int16ToAuxInt(-1)
21085 return true
21086 }
21087 break
21088 }
21089
21090
21091 for {
21092 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21093 x := v_0
21094 if v_1.Op != OpOr16 {
21095 continue
21096 }
21097 _ = v_1.Args[1]
21098 v_1_0 := v_1.Args[0]
21099 v_1_1 := v_1.Args[1]
21100 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21101 if x != v_1_0 {
21102 continue
21103 }
21104 y := v_1_1
21105 v.reset(OpOr16)
21106 v.AddArg2(x, y)
21107 return true
21108 }
21109 }
21110 break
21111 }
21112
21113
21114
21115 for {
21116 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21117 if v_0.Op != OpAnd16 {
21118 continue
21119 }
21120 _ = v_0.Args[1]
21121 v_0_0 := v_0.Args[0]
21122 v_0_1 := v_0.Args[1]
21123 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21124 x := v_0_0
21125 if v_0_1.Op != OpConst16 {
21126 continue
21127 }
21128 c2 := auxIntToInt16(v_0_1.AuxInt)
21129 if v_1.Op != OpConst16 {
21130 continue
21131 }
21132 t := v_1.Type
21133 c1 := auxIntToInt16(v_1.AuxInt)
21134 if !(^(c1 | c2) == 0) {
21135 continue
21136 }
21137 v.reset(OpOr16)
21138 v0 := b.NewValue0(v.Pos, OpConst16, t)
21139 v0.AuxInt = int16ToAuxInt(c1)
21140 v.AddArg2(v0, x)
21141 return true
21142 }
21143 }
21144 break
21145 }
21146
21147
21148
21149 for {
21150 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21151 if v_0.Op != OpOr16 {
21152 continue
21153 }
21154 _ = v_0.Args[1]
21155 v_0_0 := v_0.Args[0]
21156 v_0_1 := v_0.Args[1]
21157 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21158 i := v_0_0
21159 if i.Op != OpConst16 {
21160 continue
21161 }
21162 t := i.Type
21163 z := v_0_1
21164 x := v_1
21165 if !(z.Op != OpConst16 && x.Op != OpConst16) {
21166 continue
21167 }
21168 v.reset(OpOr16)
21169 v0 := b.NewValue0(v.Pos, OpOr16, t)
21170 v0.AddArg2(z, x)
21171 v.AddArg2(i, v0)
21172 return true
21173 }
21174 }
21175 break
21176 }
21177
21178
21179 for {
21180 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21181 if v_0.Op != OpConst16 {
21182 continue
21183 }
21184 t := v_0.Type
21185 c := auxIntToInt16(v_0.AuxInt)
21186 if v_1.Op != OpOr16 {
21187 continue
21188 }
21189 _ = v_1.Args[1]
21190 v_1_0 := v_1.Args[0]
21191 v_1_1 := v_1.Args[1]
21192 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21193 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
21194 continue
21195 }
21196 d := auxIntToInt16(v_1_0.AuxInt)
21197 x := v_1_1
21198 v.reset(OpOr16)
21199 v0 := b.NewValue0(v.Pos, OpConst16, t)
21200 v0.AuxInt = int16ToAuxInt(c | d)
21201 v.AddArg2(v0, x)
21202 return true
21203 }
21204 }
21205 break
21206 }
21207
21208
21209
21210 for {
21211 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21212 if v_0.Op != OpLsh16x64 {
21213 continue
21214 }
21215 _ = v_0.Args[1]
21216 x := v_0.Args[0]
21217 z := v_0.Args[1]
21218 if z.Op != OpConst64 {
21219 continue
21220 }
21221 c := auxIntToInt64(z.AuxInt)
21222 if v_1.Op != OpRsh16Ux64 {
21223 continue
21224 }
21225 _ = v_1.Args[1]
21226 if x != v_1.Args[0] {
21227 continue
21228 }
21229 v_1_1 := v_1.Args[1]
21230 if v_1_1.Op != OpConst64 {
21231 continue
21232 }
21233 d := auxIntToInt64(v_1_1.AuxInt)
21234 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
21235 continue
21236 }
21237 v.reset(OpRotateLeft16)
21238 v.AddArg2(x, z)
21239 return true
21240 }
21241 break
21242 }
21243
21244
21245
21246 for {
21247 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21248 left := v_0
21249 if left.Op != OpLsh16x64 {
21250 continue
21251 }
21252 y := left.Args[1]
21253 x := left.Args[0]
21254 right := v_1
21255 if right.Op != OpRsh16Ux64 {
21256 continue
21257 }
21258 _ = right.Args[1]
21259 if x != right.Args[0] {
21260 continue
21261 }
21262 right_1 := right.Args[1]
21263 if right_1.Op != OpSub64 {
21264 continue
21265 }
21266 _ = right_1.Args[1]
21267 right_1_0 := right_1.Args[0]
21268 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21269 continue
21270 }
21271 v.reset(OpRotateLeft16)
21272 v.AddArg2(x, y)
21273 return true
21274 }
21275 break
21276 }
21277
21278
21279
21280 for {
21281 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21282 left := v_0
21283 if left.Op != OpLsh16x32 {
21284 continue
21285 }
21286 y := left.Args[1]
21287 x := left.Args[0]
21288 right := v_1
21289 if right.Op != OpRsh16Ux32 {
21290 continue
21291 }
21292 _ = right.Args[1]
21293 if x != right.Args[0] {
21294 continue
21295 }
21296 right_1 := right.Args[1]
21297 if right_1.Op != OpSub32 {
21298 continue
21299 }
21300 _ = right_1.Args[1]
21301 right_1_0 := right_1.Args[0]
21302 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21303 continue
21304 }
21305 v.reset(OpRotateLeft16)
21306 v.AddArg2(x, y)
21307 return true
21308 }
21309 break
21310 }
21311
21312
21313
21314 for {
21315 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21316 left := v_0
21317 if left.Op != OpLsh16x16 {
21318 continue
21319 }
21320 y := left.Args[1]
21321 x := left.Args[0]
21322 right := v_1
21323 if right.Op != OpRsh16Ux16 {
21324 continue
21325 }
21326 _ = right.Args[1]
21327 if x != right.Args[0] {
21328 continue
21329 }
21330 right_1 := right.Args[1]
21331 if right_1.Op != OpSub16 {
21332 continue
21333 }
21334 _ = right_1.Args[1]
21335 right_1_0 := right_1.Args[0]
21336 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21337 continue
21338 }
21339 v.reset(OpRotateLeft16)
21340 v.AddArg2(x, y)
21341 return true
21342 }
21343 break
21344 }
21345
21346
21347
21348 for {
21349 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21350 left := v_0
21351 if left.Op != OpLsh16x8 {
21352 continue
21353 }
21354 y := left.Args[1]
21355 x := left.Args[0]
21356 right := v_1
21357 if right.Op != OpRsh16Ux8 {
21358 continue
21359 }
21360 _ = right.Args[1]
21361 if x != right.Args[0] {
21362 continue
21363 }
21364 right_1 := right.Args[1]
21365 if right_1.Op != OpSub8 {
21366 continue
21367 }
21368 _ = right_1.Args[1]
21369 right_1_0 := right_1.Args[0]
21370 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21371 continue
21372 }
21373 v.reset(OpRotateLeft16)
21374 v.AddArg2(x, y)
21375 return true
21376 }
21377 break
21378 }
21379
21380
21381
21382 for {
21383 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21384 right := v_0
21385 if right.Op != OpRsh16Ux64 {
21386 continue
21387 }
21388 y := right.Args[1]
21389 x := right.Args[0]
21390 left := v_1
21391 if left.Op != OpLsh16x64 {
21392 continue
21393 }
21394 _ = left.Args[1]
21395 if x != left.Args[0] {
21396 continue
21397 }
21398 z := left.Args[1]
21399 if z.Op != OpSub64 {
21400 continue
21401 }
21402 _ = z.Args[1]
21403 z_0 := z.Args[0]
21404 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21405 continue
21406 }
21407 v.reset(OpRotateLeft16)
21408 v.AddArg2(x, z)
21409 return true
21410 }
21411 break
21412 }
21413
21414
21415
21416 for {
21417 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21418 right := v_0
21419 if right.Op != OpRsh16Ux32 {
21420 continue
21421 }
21422 y := right.Args[1]
21423 x := right.Args[0]
21424 left := v_1
21425 if left.Op != OpLsh16x32 {
21426 continue
21427 }
21428 _ = left.Args[1]
21429 if x != left.Args[0] {
21430 continue
21431 }
21432 z := left.Args[1]
21433 if z.Op != OpSub32 {
21434 continue
21435 }
21436 _ = z.Args[1]
21437 z_0 := z.Args[0]
21438 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21439 continue
21440 }
21441 v.reset(OpRotateLeft16)
21442 v.AddArg2(x, z)
21443 return true
21444 }
21445 break
21446 }
21447
21448
21449
21450 for {
21451 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21452 right := v_0
21453 if right.Op != OpRsh16Ux16 {
21454 continue
21455 }
21456 y := right.Args[1]
21457 x := right.Args[0]
21458 left := v_1
21459 if left.Op != OpLsh16x16 {
21460 continue
21461 }
21462 _ = left.Args[1]
21463 if x != left.Args[0] {
21464 continue
21465 }
21466 z := left.Args[1]
21467 if z.Op != OpSub16 {
21468 continue
21469 }
21470 _ = z.Args[1]
21471 z_0 := z.Args[0]
21472 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21473 continue
21474 }
21475 v.reset(OpRotateLeft16)
21476 v.AddArg2(x, z)
21477 return true
21478 }
21479 break
21480 }
21481
21482
21483
21484 for {
21485 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21486 right := v_0
21487 if right.Op != OpRsh16Ux8 {
21488 continue
21489 }
21490 y := right.Args[1]
21491 x := right.Args[0]
21492 left := v_1
21493 if left.Op != OpLsh16x8 {
21494 continue
21495 }
21496 _ = left.Args[1]
21497 if x != left.Args[0] {
21498 continue
21499 }
21500 z := left.Args[1]
21501 if z.Op != OpSub8 {
21502 continue
21503 }
21504 _ = z.Args[1]
21505 z_0 := z.Args[0]
21506 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21507 continue
21508 }
21509 v.reset(OpRotateLeft16)
21510 v.AddArg2(x, z)
21511 return true
21512 }
21513 break
21514 }
21515 return false
21516 }
21517 func rewriteValuegeneric_OpOr32(v *Value) bool {
21518 v_1 := v.Args[1]
21519 v_0 := v.Args[0]
21520 b := v.Block
21521 config := b.Func.Config
21522
21523
21524 for {
21525 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21526 if v_0.Op != OpConst32 {
21527 continue
21528 }
21529 c := auxIntToInt32(v_0.AuxInt)
21530 if v_1.Op != OpConst32 {
21531 continue
21532 }
21533 d := auxIntToInt32(v_1.AuxInt)
21534 v.reset(OpConst32)
21535 v.AuxInt = int32ToAuxInt(c | d)
21536 return true
21537 }
21538 break
21539 }
21540
21541
21542 for {
21543 t := v.Type
21544 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21545 if v_0.Op != OpCom32 {
21546 continue
21547 }
21548 x := v_0.Args[0]
21549 if v_1.Op != OpCom32 {
21550 continue
21551 }
21552 y := v_1.Args[0]
21553 v.reset(OpCom32)
21554 v0 := b.NewValue0(v.Pos, OpAnd32, t)
21555 v0.AddArg2(x, y)
21556 v.AddArg(v0)
21557 return true
21558 }
21559 break
21560 }
21561
21562
21563 for {
21564 x := v_0
21565 if x != v_1 {
21566 break
21567 }
21568 v.copyOf(x)
21569 return true
21570 }
21571
21572
21573 for {
21574 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21575 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
21576 continue
21577 }
21578 x := v_1
21579 v.copyOf(x)
21580 return true
21581 }
21582 break
21583 }
21584
21585
21586 for {
21587 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21588 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
21589 continue
21590 }
21591 v.reset(OpConst32)
21592 v.AuxInt = int32ToAuxInt(-1)
21593 return true
21594 }
21595 break
21596 }
21597
21598
21599 for {
21600 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21601 if v_0.Op != OpCom32 {
21602 continue
21603 }
21604 x := v_0.Args[0]
21605 if x != v_1 {
21606 continue
21607 }
21608 v.reset(OpConst32)
21609 v.AuxInt = int32ToAuxInt(-1)
21610 return true
21611 }
21612 break
21613 }
21614
21615
21616 for {
21617 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21618 x := v_0
21619 if v_1.Op != OpOr32 {
21620 continue
21621 }
21622 _ = v_1.Args[1]
21623 v_1_0 := v_1.Args[0]
21624 v_1_1 := v_1.Args[1]
21625 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21626 if x != v_1_0 {
21627 continue
21628 }
21629 y := v_1_1
21630 v.reset(OpOr32)
21631 v.AddArg2(x, y)
21632 return true
21633 }
21634 }
21635 break
21636 }
21637
21638
21639
21640 for {
21641 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21642 if v_0.Op != OpAnd32 {
21643 continue
21644 }
21645 _ = v_0.Args[1]
21646 v_0_0 := v_0.Args[0]
21647 v_0_1 := v_0.Args[1]
21648 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21649 x := v_0_0
21650 if v_0_1.Op != OpConst32 {
21651 continue
21652 }
21653 c2 := auxIntToInt32(v_0_1.AuxInt)
21654 if v_1.Op != OpConst32 {
21655 continue
21656 }
21657 t := v_1.Type
21658 c1 := auxIntToInt32(v_1.AuxInt)
21659 if !(^(c1 | c2) == 0) {
21660 continue
21661 }
21662 v.reset(OpOr32)
21663 v0 := b.NewValue0(v.Pos, OpConst32, t)
21664 v0.AuxInt = int32ToAuxInt(c1)
21665 v.AddArg2(v0, x)
21666 return true
21667 }
21668 }
21669 break
21670 }
21671
21672
21673
21674 for {
21675 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21676 if v_0.Op != OpOr32 {
21677 continue
21678 }
21679 _ = v_0.Args[1]
21680 v_0_0 := v_0.Args[0]
21681 v_0_1 := v_0.Args[1]
21682 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21683 i := v_0_0
21684 if i.Op != OpConst32 {
21685 continue
21686 }
21687 t := i.Type
21688 z := v_0_1
21689 x := v_1
21690 if !(z.Op != OpConst32 && x.Op != OpConst32) {
21691 continue
21692 }
21693 v.reset(OpOr32)
21694 v0 := b.NewValue0(v.Pos, OpOr32, t)
21695 v0.AddArg2(z, x)
21696 v.AddArg2(i, v0)
21697 return true
21698 }
21699 }
21700 break
21701 }
21702
21703
21704 for {
21705 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21706 if v_0.Op != OpConst32 {
21707 continue
21708 }
21709 t := v_0.Type
21710 c := auxIntToInt32(v_0.AuxInt)
21711 if v_1.Op != OpOr32 {
21712 continue
21713 }
21714 _ = v_1.Args[1]
21715 v_1_0 := v_1.Args[0]
21716 v_1_1 := v_1.Args[1]
21717 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21718 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
21719 continue
21720 }
21721 d := auxIntToInt32(v_1_0.AuxInt)
21722 x := v_1_1
21723 v.reset(OpOr32)
21724 v0 := b.NewValue0(v.Pos, OpConst32, t)
21725 v0.AuxInt = int32ToAuxInt(c | d)
21726 v.AddArg2(v0, x)
21727 return true
21728 }
21729 }
21730 break
21731 }
21732
21733
21734
21735 for {
21736 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21737 if v_0.Op != OpLsh32x64 {
21738 continue
21739 }
21740 _ = v_0.Args[1]
21741 x := v_0.Args[0]
21742 z := v_0.Args[1]
21743 if z.Op != OpConst64 {
21744 continue
21745 }
21746 c := auxIntToInt64(z.AuxInt)
21747 if v_1.Op != OpRsh32Ux64 {
21748 continue
21749 }
21750 _ = v_1.Args[1]
21751 if x != v_1.Args[0] {
21752 continue
21753 }
21754 v_1_1 := v_1.Args[1]
21755 if v_1_1.Op != OpConst64 {
21756 continue
21757 }
21758 d := auxIntToInt64(v_1_1.AuxInt)
21759 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
21760 continue
21761 }
21762 v.reset(OpRotateLeft32)
21763 v.AddArg2(x, z)
21764 return true
21765 }
21766 break
21767 }
21768
21769
21770
21771 for {
21772 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21773 left := v_0
21774 if left.Op != OpLsh32x64 {
21775 continue
21776 }
21777 y := left.Args[1]
21778 x := left.Args[0]
21779 right := v_1
21780 if right.Op != OpRsh32Ux64 {
21781 continue
21782 }
21783 _ = right.Args[1]
21784 if x != right.Args[0] {
21785 continue
21786 }
21787 right_1 := right.Args[1]
21788 if right_1.Op != OpSub64 {
21789 continue
21790 }
21791 _ = right_1.Args[1]
21792 right_1_0 := right_1.Args[0]
21793 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21794 continue
21795 }
21796 v.reset(OpRotateLeft32)
21797 v.AddArg2(x, y)
21798 return true
21799 }
21800 break
21801 }
21802
21803
21804
21805 for {
21806 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21807 left := v_0
21808 if left.Op != OpLsh32x32 {
21809 continue
21810 }
21811 y := left.Args[1]
21812 x := left.Args[0]
21813 right := v_1
21814 if right.Op != OpRsh32Ux32 {
21815 continue
21816 }
21817 _ = right.Args[1]
21818 if x != right.Args[0] {
21819 continue
21820 }
21821 right_1 := right.Args[1]
21822 if right_1.Op != OpSub32 {
21823 continue
21824 }
21825 _ = right_1.Args[1]
21826 right_1_0 := right_1.Args[0]
21827 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21828 continue
21829 }
21830 v.reset(OpRotateLeft32)
21831 v.AddArg2(x, y)
21832 return true
21833 }
21834 break
21835 }
21836
21837
21838
21839 for {
21840 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21841 left := v_0
21842 if left.Op != OpLsh32x16 {
21843 continue
21844 }
21845 y := left.Args[1]
21846 x := left.Args[0]
21847 right := v_1
21848 if right.Op != OpRsh32Ux16 {
21849 continue
21850 }
21851 _ = right.Args[1]
21852 if x != right.Args[0] {
21853 continue
21854 }
21855 right_1 := right.Args[1]
21856 if right_1.Op != OpSub16 {
21857 continue
21858 }
21859 _ = right_1.Args[1]
21860 right_1_0 := right_1.Args[0]
21861 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21862 continue
21863 }
21864 v.reset(OpRotateLeft32)
21865 v.AddArg2(x, y)
21866 return true
21867 }
21868 break
21869 }
21870
21871
21872
21873 for {
21874 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21875 left := v_0
21876 if left.Op != OpLsh32x8 {
21877 continue
21878 }
21879 y := left.Args[1]
21880 x := left.Args[0]
21881 right := v_1
21882 if right.Op != OpRsh32Ux8 {
21883 continue
21884 }
21885 _ = right.Args[1]
21886 if x != right.Args[0] {
21887 continue
21888 }
21889 right_1 := right.Args[1]
21890 if right_1.Op != OpSub8 {
21891 continue
21892 }
21893 _ = right_1.Args[1]
21894 right_1_0 := right_1.Args[0]
21895 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21896 continue
21897 }
21898 v.reset(OpRotateLeft32)
21899 v.AddArg2(x, y)
21900 return true
21901 }
21902 break
21903 }
21904
21905
21906
21907 for {
21908 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21909 right := v_0
21910 if right.Op != OpRsh32Ux64 {
21911 continue
21912 }
21913 y := right.Args[1]
21914 x := right.Args[0]
21915 left := v_1
21916 if left.Op != OpLsh32x64 {
21917 continue
21918 }
21919 _ = left.Args[1]
21920 if x != left.Args[0] {
21921 continue
21922 }
21923 z := left.Args[1]
21924 if z.Op != OpSub64 {
21925 continue
21926 }
21927 _ = z.Args[1]
21928 z_0 := z.Args[0]
21929 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21930 continue
21931 }
21932 v.reset(OpRotateLeft32)
21933 v.AddArg2(x, z)
21934 return true
21935 }
21936 break
21937 }
21938
21939
21940
21941 for {
21942 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21943 right := v_0
21944 if right.Op != OpRsh32Ux32 {
21945 continue
21946 }
21947 y := right.Args[1]
21948 x := right.Args[0]
21949 left := v_1
21950 if left.Op != OpLsh32x32 {
21951 continue
21952 }
21953 _ = left.Args[1]
21954 if x != left.Args[0] {
21955 continue
21956 }
21957 z := left.Args[1]
21958 if z.Op != OpSub32 {
21959 continue
21960 }
21961 _ = z.Args[1]
21962 z_0 := z.Args[0]
21963 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21964 continue
21965 }
21966 v.reset(OpRotateLeft32)
21967 v.AddArg2(x, z)
21968 return true
21969 }
21970 break
21971 }
21972
21973
21974
21975 for {
21976 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21977 right := v_0
21978 if right.Op != OpRsh32Ux16 {
21979 continue
21980 }
21981 y := right.Args[1]
21982 x := right.Args[0]
21983 left := v_1
21984 if left.Op != OpLsh32x16 {
21985 continue
21986 }
21987 _ = left.Args[1]
21988 if x != left.Args[0] {
21989 continue
21990 }
21991 z := left.Args[1]
21992 if z.Op != OpSub16 {
21993 continue
21994 }
21995 _ = z.Args[1]
21996 z_0 := z.Args[0]
21997 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21998 continue
21999 }
22000 v.reset(OpRotateLeft32)
22001 v.AddArg2(x, z)
22002 return true
22003 }
22004 break
22005 }
22006
22007
22008
22009 for {
22010 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22011 right := v_0
22012 if right.Op != OpRsh32Ux8 {
22013 continue
22014 }
22015 y := right.Args[1]
22016 x := right.Args[0]
22017 left := v_1
22018 if left.Op != OpLsh32x8 {
22019 continue
22020 }
22021 _ = left.Args[1]
22022 if x != left.Args[0] {
22023 continue
22024 }
22025 z := left.Args[1]
22026 if z.Op != OpSub8 {
22027 continue
22028 }
22029 _ = z.Args[1]
22030 z_0 := z.Args[0]
22031 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
22032 continue
22033 }
22034 v.reset(OpRotateLeft32)
22035 v.AddArg2(x, z)
22036 return true
22037 }
22038 break
22039 }
22040 return false
22041 }
22042 func rewriteValuegeneric_OpOr64(v *Value) bool {
22043 v_1 := v.Args[1]
22044 v_0 := v.Args[0]
22045 b := v.Block
22046 config := b.Func.Config
22047
22048
22049 for {
22050 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22051 if v_0.Op != OpConst64 {
22052 continue
22053 }
22054 c := auxIntToInt64(v_0.AuxInt)
22055 if v_1.Op != OpConst64 {
22056 continue
22057 }
22058 d := auxIntToInt64(v_1.AuxInt)
22059 v.reset(OpConst64)
22060 v.AuxInt = int64ToAuxInt(c | d)
22061 return true
22062 }
22063 break
22064 }
22065
22066
22067 for {
22068 t := v.Type
22069 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22070 if v_0.Op != OpCom64 {
22071 continue
22072 }
22073 x := v_0.Args[0]
22074 if v_1.Op != OpCom64 {
22075 continue
22076 }
22077 y := v_1.Args[0]
22078 v.reset(OpCom64)
22079 v0 := b.NewValue0(v.Pos, OpAnd64, t)
22080 v0.AddArg2(x, y)
22081 v.AddArg(v0)
22082 return true
22083 }
22084 break
22085 }
22086
22087
22088 for {
22089 x := v_0
22090 if x != v_1 {
22091 break
22092 }
22093 v.copyOf(x)
22094 return true
22095 }
22096
22097
22098 for {
22099 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22100 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
22101 continue
22102 }
22103 x := v_1
22104 v.copyOf(x)
22105 return true
22106 }
22107 break
22108 }
22109
22110
22111 for {
22112 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22113 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
22114 continue
22115 }
22116 v.reset(OpConst64)
22117 v.AuxInt = int64ToAuxInt(-1)
22118 return true
22119 }
22120 break
22121 }
22122
22123
22124 for {
22125 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22126 if v_0.Op != OpCom64 {
22127 continue
22128 }
22129 x := v_0.Args[0]
22130 if x != v_1 {
22131 continue
22132 }
22133 v.reset(OpConst64)
22134 v.AuxInt = int64ToAuxInt(-1)
22135 return true
22136 }
22137 break
22138 }
22139
22140
22141 for {
22142 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22143 x := v_0
22144 if v_1.Op != OpOr64 {
22145 continue
22146 }
22147 _ = v_1.Args[1]
22148 v_1_0 := v_1.Args[0]
22149 v_1_1 := v_1.Args[1]
22150 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22151 if x != v_1_0 {
22152 continue
22153 }
22154 y := v_1_1
22155 v.reset(OpOr64)
22156 v.AddArg2(x, y)
22157 return true
22158 }
22159 }
22160 break
22161 }
22162
22163
22164
22165 for {
22166 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22167 if v_0.Op != OpAnd64 {
22168 continue
22169 }
22170 _ = v_0.Args[1]
22171 v_0_0 := v_0.Args[0]
22172 v_0_1 := v_0.Args[1]
22173 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22174 x := v_0_0
22175 if v_0_1.Op != OpConst64 {
22176 continue
22177 }
22178 c2 := auxIntToInt64(v_0_1.AuxInt)
22179 if v_1.Op != OpConst64 {
22180 continue
22181 }
22182 t := v_1.Type
22183 c1 := auxIntToInt64(v_1.AuxInt)
22184 if !(^(c1 | c2) == 0) {
22185 continue
22186 }
22187 v.reset(OpOr64)
22188 v0 := b.NewValue0(v.Pos, OpConst64, t)
22189 v0.AuxInt = int64ToAuxInt(c1)
22190 v.AddArg2(v0, x)
22191 return true
22192 }
22193 }
22194 break
22195 }
22196
22197
22198
22199 for {
22200 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22201 if v_0.Op != OpOr64 {
22202 continue
22203 }
22204 _ = v_0.Args[1]
22205 v_0_0 := v_0.Args[0]
22206 v_0_1 := v_0.Args[1]
22207 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22208 i := v_0_0
22209 if i.Op != OpConst64 {
22210 continue
22211 }
22212 t := i.Type
22213 z := v_0_1
22214 x := v_1
22215 if !(z.Op != OpConst64 && x.Op != OpConst64) {
22216 continue
22217 }
22218 v.reset(OpOr64)
22219 v0 := b.NewValue0(v.Pos, OpOr64, t)
22220 v0.AddArg2(z, x)
22221 v.AddArg2(i, v0)
22222 return true
22223 }
22224 }
22225 break
22226 }
22227
22228
22229 for {
22230 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22231 if v_0.Op != OpConst64 {
22232 continue
22233 }
22234 t := v_0.Type
22235 c := auxIntToInt64(v_0.AuxInt)
22236 if v_1.Op != OpOr64 {
22237 continue
22238 }
22239 _ = v_1.Args[1]
22240 v_1_0 := v_1.Args[0]
22241 v_1_1 := v_1.Args[1]
22242 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22243 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
22244 continue
22245 }
22246 d := auxIntToInt64(v_1_0.AuxInt)
22247 x := v_1_1
22248 v.reset(OpOr64)
22249 v0 := b.NewValue0(v.Pos, OpConst64, t)
22250 v0.AuxInt = int64ToAuxInt(c | d)
22251 v.AddArg2(v0, x)
22252 return true
22253 }
22254 }
22255 break
22256 }
22257
22258
22259
22260 for {
22261 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22262 if v_0.Op != OpLsh64x64 {
22263 continue
22264 }
22265 _ = v_0.Args[1]
22266 x := v_0.Args[0]
22267 z := v_0.Args[1]
22268 if z.Op != OpConst64 {
22269 continue
22270 }
22271 c := auxIntToInt64(z.AuxInt)
22272 if v_1.Op != OpRsh64Ux64 {
22273 continue
22274 }
22275 _ = v_1.Args[1]
22276 if x != v_1.Args[0] {
22277 continue
22278 }
22279 v_1_1 := v_1.Args[1]
22280 if v_1_1.Op != OpConst64 {
22281 continue
22282 }
22283 d := auxIntToInt64(v_1_1.AuxInt)
22284 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
22285 continue
22286 }
22287 v.reset(OpRotateLeft64)
22288 v.AddArg2(x, z)
22289 return true
22290 }
22291 break
22292 }
22293
22294
22295
22296 for {
22297 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22298 left := v_0
22299 if left.Op != OpLsh64x64 {
22300 continue
22301 }
22302 y := left.Args[1]
22303 x := left.Args[0]
22304 right := v_1
22305 if right.Op != OpRsh64Ux64 {
22306 continue
22307 }
22308 _ = right.Args[1]
22309 if x != right.Args[0] {
22310 continue
22311 }
22312 right_1 := right.Args[1]
22313 if right_1.Op != OpSub64 {
22314 continue
22315 }
22316 _ = right_1.Args[1]
22317 right_1_0 := right_1.Args[0]
22318 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22319 continue
22320 }
22321 v.reset(OpRotateLeft64)
22322 v.AddArg2(x, y)
22323 return true
22324 }
22325 break
22326 }
22327
22328
22329
22330 for {
22331 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22332 left := v_0
22333 if left.Op != OpLsh64x32 {
22334 continue
22335 }
22336 y := left.Args[1]
22337 x := left.Args[0]
22338 right := v_1
22339 if right.Op != OpRsh64Ux32 {
22340 continue
22341 }
22342 _ = right.Args[1]
22343 if x != right.Args[0] {
22344 continue
22345 }
22346 right_1 := right.Args[1]
22347 if right_1.Op != OpSub32 {
22348 continue
22349 }
22350 _ = right_1.Args[1]
22351 right_1_0 := right_1.Args[0]
22352 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22353 continue
22354 }
22355 v.reset(OpRotateLeft64)
22356 v.AddArg2(x, y)
22357 return true
22358 }
22359 break
22360 }
22361
22362
22363
22364 for {
22365 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22366 left := v_0
22367 if left.Op != OpLsh64x16 {
22368 continue
22369 }
22370 y := left.Args[1]
22371 x := left.Args[0]
22372 right := v_1
22373 if right.Op != OpRsh64Ux16 {
22374 continue
22375 }
22376 _ = right.Args[1]
22377 if x != right.Args[0] {
22378 continue
22379 }
22380 right_1 := right.Args[1]
22381 if right_1.Op != OpSub16 {
22382 continue
22383 }
22384 _ = right_1.Args[1]
22385 right_1_0 := right_1.Args[0]
22386 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22387 continue
22388 }
22389 v.reset(OpRotateLeft64)
22390 v.AddArg2(x, y)
22391 return true
22392 }
22393 break
22394 }
22395
22396
22397
22398 for {
22399 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22400 left := v_0
22401 if left.Op != OpLsh64x8 {
22402 continue
22403 }
22404 y := left.Args[1]
22405 x := left.Args[0]
22406 right := v_1
22407 if right.Op != OpRsh64Ux8 {
22408 continue
22409 }
22410 _ = right.Args[1]
22411 if x != right.Args[0] {
22412 continue
22413 }
22414 right_1 := right.Args[1]
22415 if right_1.Op != OpSub8 {
22416 continue
22417 }
22418 _ = right_1.Args[1]
22419 right_1_0 := right_1.Args[0]
22420 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22421 continue
22422 }
22423 v.reset(OpRotateLeft64)
22424 v.AddArg2(x, y)
22425 return true
22426 }
22427 break
22428 }
22429
22430
22431
22432 for {
22433 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22434 right := v_0
22435 if right.Op != OpRsh64Ux64 {
22436 continue
22437 }
22438 y := right.Args[1]
22439 x := right.Args[0]
22440 left := v_1
22441 if left.Op != OpLsh64x64 {
22442 continue
22443 }
22444 _ = left.Args[1]
22445 if x != left.Args[0] {
22446 continue
22447 }
22448 z := left.Args[1]
22449 if z.Op != OpSub64 {
22450 continue
22451 }
22452 _ = z.Args[1]
22453 z_0 := z.Args[0]
22454 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22455 continue
22456 }
22457 v.reset(OpRotateLeft64)
22458 v.AddArg2(x, z)
22459 return true
22460 }
22461 break
22462 }
22463
22464
22465
22466 for {
22467 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22468 right := v_0
22469 if right.Op != OpRsh64Ux32 {
22470 continue
22471 }
22472 y := right.Args[1]
22473 x := right.Args[0]
22474 left := v_1
22475 if left.Op != OpLsh64x32 {
22476 continue
22477 }
22478 _ = left.Args[1]
22479 if x != left.Args[0] {
22480 continue
22481 }
22482 z := left.Args[1]
22483 if z.Op != OpSub32 {
22484 continue
22485 }
22486 _ = z.Args[1]
22487 z_0 := z.Args[0]
22488 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22489 continue
22490 }
22491 v.reset(OpRotateLeft64)
22492 v.AddArg2(x, z)
22493 return true
22494 }
22495 break
22496 }
22497
22498
22499
22500 for {
22501 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22502 right := v_0
22503 if right.Op != OpRsh64Ux16 {
22504 continue
22505 }
22506 y := right.Args[1]
22507 x := right.Args[0]
22508 left := v_1
22509 if left.Op != OpLsh64x16 {
22510 continue
22511 }
22512 _ = left.Args[1]
22513 if x != left.Args[0] {
22514 continue
22515 }
22516 z := left.Args[1]
22517 if z.Op != OpSub16 {
22518 continue
22519 }
22520 _ = z.Args[1]
22521 z_0 := z.Args[0]
22522 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22523 continue
22524 }
22525 v.reset(OpRotateLeft64)
22526 v.AddArg2(x, z)
22527 return true
22528 }
22529 break
22530 }
22531
22532
22533
22534 for {
22535 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22536 right := v_0
22537 if right.Op != OpRsh64Ux8 {
22538 continue
22539 }
22540 y := right.Args[1]
22541 x := right.Args[0]
22542 left := v_1
22543 if left.Op != OpLsh64x8 {
22544 continue
22545 }
22546 _ = left.Args[1]
22547 if x != left.Args[0] {
22548 continue
22549 }
22550 z := left.Args[1]
22551 if z.Op != OpSub8 {
22552 continue
22553 }
22554 _ = z.Args[1]
22555 z_0 := z.Args[0]
22556 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22557 continue
22558 }
22559 v.reset(OpRotateLeft64)
22560 v.AddArg2(x, z)
22561 return true
22562 }
22563 break
22564 }
22565 return false
22566 }
22567 func rewriteValuegeneric_OpOr8(v *Value) bool {
22568 v_1 := v.Args[1]
22569 v_0 := v.Args[0]
22570 b := v.Block
22571 config := b.Func.Config
22572
22573
22574 for {
22575 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22576 if v_0.Op != OpConst8 {
22577 continue
22578 }
22579 c := auxIntToInt8(v_0.AuxInt)
22580 if v_1.Op != OpConst8 {
22581 continue
22582 }
22583 d := auxIntToInt8(v_1.AuxInt)
22584 v.reset(OpConst8)
22585 v.AuxInt = int8ToAuxInt(c | d)
22586 return true
22587 }
22588 break
22589 }
22590
22591
22592 for {
22593 t := v.Type
22594 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22595 if v_0.Op != OpCom8 {
22596 continue
22597 }
22598 x := v_0.Args[0]
22599 if v_1.Op != OpCom8 {
22600 continue
22601 }
22602 y := v_1.Args[0]
22603 v.reset(OpCom8)
22604 v0 := b.NewValue0(v.Pos, OpAnd8, t)
22605 v0.AddArg2(x, y)
22606 v.AddArg(v0)
22607 return true
22608 }
22609 break
22610 }
22611
22612
22613 for {
22614 x := v_0
22615 if x != v_1 {
22616 break
22617 }
22618 v.copyOf(x)
22619 return true
22620 }
22621
22622
22623 for {
22624 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22625 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
22626 continue
22627 }
22628 x := v_1
22629 v.copyOf(x)
22630 return true
22631 }
22632 break
22633 }
22634
22635
22636 for {
22637 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22638 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
22639 continue
22640 }
22641 v.reset(OpConst8)
22642 v.AuxInt = int8ToAuxInt(-1)
22643 return true
22644 }
22645 break
22646 }
22647
22648
22649 for {
22650 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22651 if v_0.Op != OpCom8 {
22652 continue
22653 }
22654 x := v_0.Args[0]
22655 if x != v_1 {
22656 continue
22657 }
22658 v.reset(OpConst8)
22659 v.AuxInt = int8ToAuxInt(-1)
22660 return true
22661 }
22662 break
22663 }
22664
22665
22666 for {
22667 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22668 x := v_0
22669 if v_1.Op != OpOr8 {
22670 continue
22671 }
22672 _ = v_1.Args[1]
22673 v_1_0 := v_1.Args[0]
22674 v_1_1 := v_1.Args[1]
22675 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22676 if x != v_1_0 {
22677 continue
22678 }
22679 y := v_1_1
22680 v.reset(OpOr8)
22681 v.AddArg2(x, y)
22682 return true
22683 }
22684 }
22685 break
22686 }
22687
22688
22689
22690 for {
22691 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22692 if v_0.Op != OpAnd8 {
22693 continue
22694 }
22695 _ = v_0.Args[1]
22696 v_0_0 := v_0.Args[0]
22697 v_0_1 := v_0.Args[1]
22698 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22699 x := v_0_0
22700 if v_0_1.Op != OpConst8 {
22701 continue
22702 }
22703 c2 := auxIntToInt8(v_0_1.AuxInt)
22704 if v_1.Op != OpConst8 {
22705 continue
22706 }
22707 t := v_1.Type
22708 c1 := auxIntToInt8(v_1.AuxInt)
22709 if !(^(c1 | c2) == 0) {
22710 continue
22711 }
22712 v.reset(OpOr8)
22713 v0 := b.NewValue0(v.Pos, OpConst8, t)
22714 v0.AuxInt = int8ToAuxInt(c1)
22715 v.AddArg2(v0, x)
22716 return true
22717 }
22718 }
22719 break
22720 }
22721
22722
22723
22724 for {
22725 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22726 if v_0.Op != OpOr8 {
22727 continue
22728 }
22729 _ = v_0.Args[1]
22730 v_0_0 := v_0.Args[0]
22731 v_0_1 := v_0.Args[1]
22732 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22733 i := v_0_0
22734 if i.Op != OpConst8 {
22735 continue
22736 }
22737 t := i.Type
22738 z := v_0_1
22739 x := v_1
22740 if !(z.Op != OpConst8 && x.Op != OpConst8) {
22741 continue
22742 }
22743 v.reset(OpOr8)
22744 v0 := b.NewValue0(v.Pos, OpOr8, t)
22745 v0.AddArg2(z, x)
22746 v.AddArg2(i, v0)
22747 return true
22748 }
22749 }
22750 break
22751 }
22752
22753
22754 for {
22755 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22756 if v_0.Op != OpConst8 {
22757 continue
22758 }
22759 t := v_0.Type
22760 c := auxIntToInt8(v_0.AuxInt)
22761 if v_1.Op != OpOr8 {
22762 continue
22763 }
22764 _ = v_1.Args[1]
22765 v_1_0 := v_1.Args[0]
22766 v_1_1 := v_1.Args[1]
22767 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22768 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
22769 continue
22770 }
22771 d := auxIntToInt8(v_1_0.AuxInt)
22772 x := v_1_1
22773 v.reset(OpOr8)
22774 v0 := b.NewValue0(v.Pos, OpConst8, t)
22775 v0.AuxInt = int8ToAuxInt(c | d)
22776 v.AddArg2(v0, x)
22777 return true
22778 }
22779 }
22780 break
22781 }
22782
22783
22784
22785 for {
22786 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22787 if v_0.Op != OpLsh8x64 {
22788 continue
22789 }
22790 _ = v_0.Args[1]
22791 x := v_0.Args[0]
22792 z := v_0.Args[1]
22793 if z.Op != OpConst64 {
22794 continue
22795 }
22796 c := auxIntToInt64(z.AuxInt)
22797 if v_1.Op != OpRsh8Ux64 {
22798 continue
22799 }
22800 _ = v_1.Args[1]
22801 if x != v_1.Args[0] {
22802 continue
22803 }
22804 v_1_1 := v_1.Args[1]
22805 if v_1_1.Op != OpConst64 {
22806 continue
22807 }
22808 d := auxIntToInt64(v_1_1.AuxInt)
22809 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
22810 continue
22811 }
22812 v.reset(OpRotateLeft8)
22813 v.AddArg2(x, z)
22814 return true
22815 }
22816 break
22817 }
22818
22819
22820
22821 for {
22822 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22823 left := v_0
22824 if left.Op != OpLsh8x64 {
22825 continue
22826 }
22827 y := left.Args[1]
22828 x := left.Args[0]
22829 right := v_1
22830 if right.Op != OpRsh8Ux64 {
22831 continue
22832 }
22833 _ = right.Args[1]
22834 if x != right.Args[0] {
22835 continue
22836 }
22837 right_1 := right.Args[1]
22838 if right_1.Op != OpSub64 {
22839 continue
22840 }
22841 _ = right_1.Args[1]
22842 right_1_0 := right_1.Args[0]
22843 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22844 continue
22845 }
22846 v.reset(OpRotateLeft8)
22847 v.AddArg2(x, y)
22848 return true
22849 }
22850 break
22851 }
22852
22853
22854
22855 for {
22856 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22857 left := v_0
22858 if left.Op != OpLsh8x32 {
22859 continue
22860 }
22861 y := left.Args[1]
22862 x := left.Args[0]
22863 right := v_1
22864 if right.Op != OpRsh8Ux32 {
22865 continue
22866 }
22867 _ = right.Args[1]
22868 if x != right.Args[0] {
22869 continue
22870 }
22871 right_1 := right.Args[1]
22872 if right_1.Op != OpSub32 {
22873 continue
22874 }
22875 _ = right_1.Args[1]
22876 right_1_0 := right_1.Args[0]
22877 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22878 continue
22879 }
22880 v.reset(OpRotateLeft8)
22881 v.AddArg2(x, y)
22882 return true
22883 }
22884 break
22885 }
22886
22887
22888
22889 for {
22890 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22891 left := v_0
22892 if left.Op != OpLsh8x16 {
22893 continue
22894 }
22895 y := left.Args[1]
22896 x := left.Args[0]
22897 right := v_1
22898 if right.Op != OpRsh8Ux16 {
22899 continue
22900 }
22901 _ = right.Args[1]
22902 if x != right.Args[0] {
22903 continue
22904 }
22905 right_1 := right.Args[1]
22906 if right_1.Op != OpSub16 {
22907 continue
22908 }
22909 _ = right_1.Args[1]
22910 right_1_0 := right_1.Args[0]
22911 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22912 continue
22913 }
22914 v.reset(OpRotateLeft8)
22915 v.AddArg2(x, y)
22916 return true
22917 }
22918 break
22919 }
22920
22921
22922
22923 for {
22924 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22925 left := v_0
22926 if left.Op != OpLsh8x8 {
22927 continue
22928 }
22929 y := left.Args[1]
22930 x := left.Args[0]
22931 right := v_1
22932 if right.Op != OpRsh8Ux8 {
22933 continue
22934 }
22935 _ = right.Args[1]
22936 if x != right.Args[0] {
22937 continue
22938 }
22939 right_1 := right.Args[1]
22940 if right_1.Op != OpSub8 {
22941 continue
22942 }
22943 _ = right_1.Args[1]
22944 right_1_0 := right_1.Args[0]
22945 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22946 continue
22947 }
22948 v.reset(OpRotateLeft8)
22949 v.AddArg2(x, y)
22950 return true
22951 }
22952 break
22953 }
22954
22955
22956
22957 for {
22958 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22959 right := v_0
22960 if right.Op != OpRsh8Ux64 {
22961 continue
22962 }
22963 y := right.Args[1]
22964 x := right.Args[0]
22965 left := v_1
22966 if left.Op != OpLsh8x64 {
22967 continue
22968 }
22969 _ = left.Args[1]
22970 if x != left.Args[0] {
22971 continue
22972 }
22973 z := left.Args[1]
22974 if z.Op != OpSub64 {
22975 continue
22976 }
22977 _ = z.Args[1]
22978 z_0 := z.Args[0]
22979 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22980 continue
22981 }
22982 v.reset(OpRotateLeft8)
22983 v.AddArg2(x, z)
22984 return true
22985 }
22986 break
22987 }
22988
22989
22990
22991 for {
22992 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22993 right := v_0
22994 if right.Op != OpRsh8Ux32 {
22995 continue
22996 }
22997 y := right.Args[1]
22998 x := right.Args[0]
22999 left := v_1
23000 if left.Op != OpLsh8x32 {
23001 continue
23002 }
23003 _ = left.Args[1]
23004 if x != left.Args[0] {
23005 continue
23006 }
23007 z := left.Args[1]
23008 if z.Op != OpSub32 {
23009 continue
23010 }
23011 _ = z.Args[1]
23012 z_0 := z.Args[0]
23013 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23014 continue
23015 }
23016 v.reset(OpRotateLeft8)
23017 v.AddArg2(x, z)
23018 return true
23019 }
23020 break
23021 }
23022
23023
23024
23025 for {
23026 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23027 right := v_0
23028 if right.Op != OpRsh8Ux16 {
23029 continue
23030 }
23031 y := right.Args[1]
23032 x := right.Args[0]
23033 left := v_1
23034 if left.Op != OpLsh8x16 {
23035 continue
23036 }
23037 _ = left.Args[1]
23038 if x != left.Args[0] {
23039 continue
23040 }
23041 z := left.Args[1]
23042 if z.Op != OpSub16 {
23043 continue
23044 }
23045 _ = z.Args[1]
23046 z_0 := z.Args[0]
23047 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23048 continue
23049 }
23050 v.reset(OpRotateLeft8)
23051 v.AddArg2(x, z)
23052 return true
23053 }
23054 break
23055 }
23056
23057
23058
23059 for {
23060 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23061 right := v_0
23062 if right.Op != OpRsh8Ux8 {
23063 continue
23064 }
23065 y := right.Args[1]
23066 x := right.Args[0]
23067 left := v_1
23068 if left.Op != OpLsh8x8 {
23069 continue
23070 }
23071 _ = left.Args[1]
23072 if x != left.Args[0] {
23073 continue
23074 }
23075 z := left.Args[1]
23076 if z.Op != OpSub8 {
23077 continue
23078 }
23079 _ = z.Args[1]
23080 z_0 := z.Args[0]
23081 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
23082 continue
23083 }
23084 v.reset(OpRotateLeft8)
23085 v.AddArg2(x, z)
23086 return true
23087 }
23088 break
23089 }
23090 return false
23091 }
23092 func rewriteValuegeneric_OpOrB(v *Value) bool {
23093 v_1 := v.Args[1]
23094 v_0 := v.Args[0]
23095 b := v.Block
23096 typ := &b.Func.Config.Types
23097
23098
23099
23100 for {
23101 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23102 if v_0.Op != OpLess64 {
23103 continue
23104 }
23105 x := v_0.Args[1]
23106 v_0_0 := v_0.Args[0]
23107 if v_0_0.Op != OpConst64 {
23108 continue
23109 }
23110 c := auxIntToInt64(v_0_0.AuxInt)
23111 if v_1.Op != OpLess64 {
23112 continue
23113 }
23114 _ = v_1.Args[1]
23115 if x != v_1.Args[0] {
23116 continue
23117 }
23118 v_1_1 := v_1.Args[1]
23119 if v_1_1.Op != OpConst64 {
23120 continue
23121 }
23122 d := auxIntToInt64(v_1_1.AuxInt)
23123 if !(c >= d) {
23124 continue
23125 }
23126 v.reset(OpLess64U)
23127 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23128 v0.AuxInt = int64ToAuxInt(c - d)
23129 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23130 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23131 v2.AuxInt = int64ToAuxInt(d)
23132 v1.AddArg2(x, v2)
23133 v.AddArg2(v0, v1)
23134 return true
23135 }
23136 break
23137 }
23138
23139
23140
23141 for {
23142 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23143 if v_0.Op != OpLeq64 {
23144 continue
23145 }
23146 x := v_0.Args[1]
23147 v_0_0 := v_0.Args[0]
23148 if v_0_0.Op != OpConst64 {
23149 continue
23150 }
23151 c := auxIntToInt64(v_0_0.AuxInt)
23152 if v_1.Op != OpLess64 {
23153 continue
23154 }
23155 _ = v_1.Args[1]
23156 if x != v_1.Args[0] {
23157 continue
23158 }
23159 v_1_1 := v_1.Args[1]
23160 if v_1_1.Op != OpConst64 {
23161 continue
23162 }
23163 d := auxIntToInt64(v_1_1.AuxInt)
23164 if !(c >= d) {
23165 continue
23166 }
23167 v.reset(OpLeq64U)
23168 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23169 v0.AuxInt = int64ToAuxInt(c - d)
23170 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23171 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23172 v2.AuxInt = int64ToAuxInt(d)
23173 v1.AddArg2(x, v2)
23174 v.AddArg2(v0, v1)
23175 return true
23176 }
23177 break
23178 }
23179
23180
23181
23182 for {
23183 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23184 if v_0.Op != OpLess32 {
23185 continue
23186 }
23187 x := v_0.Args[1]
23188 v_0_0 := v_0.Args[0]
23189 if v_0_0.Op != OpConst32 {
23190 continue
23191 }
23192 c := auxIntToInt32(v_0_0.AuxInt)
23193 if v_1.Op != OpLess32 {
23194 continue
23195 }
23196 _ = v_1.Args[1]
23197 if x != v_1.Args[0] {
23198 continue
23199 }
23200 v_1_1 := v_1.Args[1]
23201 if v_1_1.Op != OpConst32 {
23202 continue
23203 }
23204 d := auxIntToInt32(v_1_1.AuxInt)
23205 if !(c >= d) {
23206 continue
23207 }
23208 v.reset(OpLess32U)
23209 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23210 v0.AuxInt = int32ToAuxInt(c - d)
23211 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23212 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23213 v2.AuxInt = int32ToAuxInt(d)
23214 v1.AddArg2(x, v2)
23215 v.AddArg2(v0, v1)
23216 return true
23217 }
23218 break
23219 }
23220
23221
23222
23223 for {
23224 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23225 if v_0.Op != OpLeq32 {
23226 continue
23227 }
23228 x := v_0.Args[1]
23229 v_0_0 := v_0.Args[0]
23230 if v_0_0.Op != OpConst32 {
23231 continue
23232 }
23233 c := auxIntToInt32(v_0_0.AuxInt)
23234 if v_1.Op != OpLess32 {
23235 continue
23236 }
23237 _ = v_1.Args[1]
23238 if x != v_1.Args[0] {
23239 continue
23240 }
23241 v_1_1 := v_1.Args[1]
23242 if v_1_1.Op != OpConst32 {
23243 continue
23244 }
23245 d := auxIntToInt32(v_1_1.AuxInt)
23246 if !(c >= d) {
23247 continue
23248 }
23249 v.reset(OpLeq32U)
23250 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23251 v0.AuxInt = int32ToAuxInt(c - d)
23252 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23253 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23254 v2.AuxInt = int32ToAuxInt(d)
23255 v1.AddArg2(x, v2)
23256 v.AddArg2(v0, v1)
23257 return true
23258 }
23259 break
23260 }
23261
23262
23263
23264 for {
23265 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23266 if v_0.Op != OpLess16 {
23267 continue
23268 }
23269 x := v_0.Args[1]
23270 v_0_0 := v_0.Args[0]
23271 if v_0_0.Op != OpConst16 {
23272 continue
23273 }
23274 c := auxIntToInt16(v_0_0.AuxInt)
23275 if v_1.Op != OpLess16 {
23276 continue
23277 }
23278 _ = v_1.Args[1]
23279 if x != v_1.Args[0] {
23280 continue
23281 }
23282 v_1_1 := v_1.Args[1]
23283 if v_1_1.Op != OpConst16 {
23284 continue
23285 }
23286 d := auxIntToInt16(v_1_1.AuxInt)
23287 if !(c >= d) {
23288 continue
23289 }
23290 v.reset(OpLess16U)
23291 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23292 v0.AuxInt = int16ToAuxInt(c - d)
23293 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23294 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23295 v2.AuxInt = int16ToAuxInt(d)
23296 v1.AddArg2(x, v2)
23297 v.AddArg2(v0, v1)
23298 return true
23299 }
23300 break
23301 }
23302
23303
23304
23305 for {
23306 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23307 if v_0.Op != OpLeq16 {
23308 continue
23309 }
23310 x := v_0.Args[1]
23311 v_0_0 := v_0.Args[0]
23312 if v_0_0.Op != OpConst16 {
23313 continue
23314 }
23315 c := auxIntToInt16(v_0_0.AuxInt)
23316 if v_1.Op != OpLess16 {
23317 continue
23318 }
23319 _ = v_1.Args[1]
23320 if x != v_1.Args[0] {
23321 continue
23322 }
23323 v_1_1 := v_1.Args[1]
23324 if v_1_1.Op != OpConst16 {
23325 continue
23326 }
23327 d := auxIntToInt16(v_1_1.AuxInt)
23328 if !(c >= d) {
23329 continue
23330 }
23331 v.reset(OpLeq16U)
23332 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23333 v0.AuxInt = int16ToAuxInt(c - d)
23334 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23335 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23336 v2.AuxInt = int16ToAuxInt(d)
23337 v1.AddArg2(x, v2)
23338 v.AddArg2(v0, v1)
23339 return true
23340 }
23341 break
23342 }
23343
23344
23345
23346 for {
23347 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23348 if v_0.Op != OpLess8 {
23349 continue
23350 }
23351 x := v_0.Args[1]
23352 v_0_0 := v_0.Args[0]
23353 if v_0_0.Op != OpConst8 {
23354 continue
23355 }
23356 c := auxIntToInt8(v_0_0.AuxInt)
23357 if v_1.Op != OpLess8 {
23358 continue
23359 }
23360 _ = v_1.Args[1]
23361 if x != v_1.Args[0] {
23362 continue
23363 }
23364 v_1_1 := v_1.Args[1]
23365 if v_1_1.Op != OpConst8 {
23366 continue
23367 }
23368 d := auxIntToInt8(v_1_1.AuxInt)
23369 if !(c >= d) {
23370 continue
23371 }
23372 v.reset(OpLess8U)
23373 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23374 v0.AuxInt = int8ToAuxInt(c - d)
23375 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23376 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23377 v2.AuxInt = int8ToAuxInt(d)
23378 v1.AddArg2(x, v2)
23379 v.AddArg2(v0, v1)
23380 return true
23381 }
23382 break
23383 }
23384
23385
23386
23387 for {
23388 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23389 if v_0.Op != OpLeq8 {
23390 continue
23391 }
23392 x := v_0.Args[1]
23393 v_0_0 := v_0.Args[0]
23394 if v_0_0.Op != OpConst8 {
23395 continue
23396 }
23397 c := auxIntToInt8(v_0_0.AuxInt)
23398 if v_1.Op != OpLess8 {
23399 continue
23400 }
23401 _ = v_1.Args[1]
23402 if x != v_1.Args[0] {
23403 continue
23404 }
23405 v_1_1 := v_1.Args[1]
23406 if v_1_1.Op != OpConst8 {
23407 continue
23408 }
23409 d := auxIntToInt8(v_1_1.AuxInt)
23410 if !(c >= d) {
23411 continue
23412 }
23413 v.reset(OpLeq8U)
23414 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23415 v0.AuxInt = int8ToAuxInt(c - d)
23416 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23417 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23418 v2.AuxInt = int8ToAuxInt(d)
23419 v1.AddArg2(x, v2)
23420 v.AddArg2(v0, v1)
23421 return true
23422 }
23423 break
23424 }
23425
23426
23427
23428 for {
23429 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23430 if v_0.Op != OpLess64 {
23431 continue
23432 }
23433 x := v_0.Args[1]
23434 v_0_0 := v_0.Args[0]
23435 if v_0_0.Op != OpConst64 {
23436 continue
23437 }
23438 c := auxIntToInt64(v_0_0.AuxInt)
23439 if v_1.Op != OpLeq64 {
23440 continue
23441 }
23442 _ = v_1.Args[1]
23443 if x != v_1.Args[0] {
23444 continue
23445 }
23446 v_1_1 := v_1.Args[1]
23447 if v_1_1.Op != OpConst64 {
23448 continue
23449 }
23450 d := auxIntToInt64(v_1_1.AuxInt)
23451 if !(c >= d+1 && d+1 > d) {
23452 continue
23453 }
23454 v.reset(OpLess64U)
23455 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23456 v0.AuxInt = int64ToAuxInt(c - d - 1)
23457 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23458 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23459 v2.AuxInt = int64ToAuxInt(d + 1)
23460 v1.AddArg2(x, v2)
23461 v.AddArg2(v0, v1)
23462 return true
23463 }
23464 break
23465 }
23466
23467
23468
23469 for {
23470 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23471 if v_0.Op != OpLeq64 {
23472 continue
23473 }
23474 x := v_0.Args[1]
23475 v_0_0 := v_0.Args[0]
23476 if v_0_0.Op != OpConst64 {
23477 continue
23478 }
23479 c := auxIntToInt64(v_0_0.AuxInt)
23480 if v_1.Op != OpLeq64 {
23481 continue
23482 }
23483 _ = v_1.Args[1]
23484 if x != v_1.Args[0] {
23485 continue
23486 }
23487 v_1_1 := v_1.Args[1]
23488 if v_1_1.Op != OpConst64 {
23489 continue
23490 }
23491 d := auxIntToInt64(v_1_1.AuxInt)
23492 if !(c >= d+1 && d+1 > d) {
23493 continue
23494 }
23495 v.reset(OpLeq64U)
23496 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23497 v0.AuxInt = int64ToAuxInt(c - d - 1)
23498 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23499 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23500 v2.AuxInt = int64ToAuxInt(d + 1)
23501 v1.AddArg2(x, v2)
23502 v.AddArg2(v0, v1)
23503 return true
23504 }
23505 break
23506 }
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 != OpLess32 {
23513 continue
23514 }
23515 x := v_0.Args[1]
23516 v_0_0 := v_0.Args[0]
23517 if v_0_0.Op != OpConst32 {
23518 continue
23519 }
23520 c := auxIntToInt32(v_0_0.AuxInt)
23521 if v_1.Op != OpLeq32 {
23522 continue
23523 }
23524 _ = v_1.Args[1]
23525 if x != v_1.Args[0] {
23526 continue
23527 }
23528 v_1_1 := v_1.Args[1]
23529 if v_1_1.Op != OpConst32 {
23530 continue
23531 }
23532 d := auxIntToInt32(v_1_1.AuxInt)
23533 if !(c >= d+1 && d+1 > d) {
23534 continue
23535 }
23536 v.reset(OpLess32U)
23537 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23538 v0.AuxInt = int32ToAuxInt(c - d - 1)
23539 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23540 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23541 v2.AuxInt = int32ToAuxInt(d + 1)
23542 v1.AddArg2(x, v2)
23543 v.AddArg2(v0, v1)
23544 return true
23545 }
23546 break
23547 }
23548
23549
23550
23551 for {
23552 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23553 if v_0.Op != OpLeq32 {
23554 continue
23555 }
23556 x := v_0.Args[1]
23557 v_0_0 := v_0.Args[0]
23558 if v_0_0.Op != OpConst32 {
23559 continue
23560 }
23561 c := auxIntToInt32(v_0_0.AuxInt)
23562 if v_1.Op != OpLeq32 {
23563 continue
23564 }
23565 _ = v_1.Args[1]
23566 if x != v_1.Args[0] {
23567 continue
23568 }
23569 v_1_1 := v_1.Args[1]
23570 if v_1_1.Op != OpConst32 {
23571 continue
23572 }
23573 d := auxIntToInt32(v_1_1.AuxInt)
23574 if !(c >= d+1 && d+1 > d) {
23575 continue
23576 }
23577 v.reset(OpLeq32U)
23578 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23579 v0.AuxInt = int32ToAuxInt(c - d - 1)
23580 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23581 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23582 v2.AuxInt = int32ToAuxInt(d + 1)
23583 v1.AddArg2(x, v2)
23584 v.AddArg2(v0, v1)
23585 return true
23586 }
23587 break
23588 }
23589
23590
23591
23592 for {
23593 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23594 if v_0.Op != OpLess16 {
23595 continue
23596 }
23597 x := v_0.Args[1]
23598 v_0_0 := v_0.Args[0]
23599 if v_0_0.Op != OpConst16 {
23600 continue
23601 }
23602 c := auxIntToInt16(v_0_0.AuxInt)
23603 if v_1.Op != OpLeq16 {
23604 continue
23605 }
23606 _ = v_1.Args[1]
23607 if x != v_1.Args[0] {
23608 continue
23609 }
23610 v_1_1 := v_1.Args[1]
23611 if v_1_1.Op != OpConst16 {
23612 continue
23613 }
23614 d := auxIntToInt16(v_1_1.AuxInt)
23615 if !(c >= d+1 && d+1 > d) {
23616 continue
23617 }
23618 v.reset(OpLess16U)
23619 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23620 v0.AuxInt = int16ToAuxInt(c - d - 1)
23621 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23622 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23623 v2.AuxInt = int16ToAuxInt(d + 1)
23624 v1.AddArg2(x, v2)
23625 v.AddArg2(v0, v1)
23626 return true
23627 }
23628 break
23629 }
23630
23631
23632
23633 for {
23634 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23635 if v_0.Op != OpLeq16 {
23636 continue
23637 }
23638 x := v_0.Args[1]
23639 v_0_0 := v_0.Args[0]
23640 if v_0_0.Op != OpConst16 {
23641 continue
23642 }
23643 c := auxIntToInt16(v_0_0.AuxInt)
23644 if v_1.Op != OpLeq16 {
23645 continue
23646 }
23647 _ = v_1.Args[1]
23648 if x != v_1.Args[0] {
23649 continue
23650 }
23651 v_1_1 := v_1.Args[1]
23652 if v_1_1.Op != OpConst16 {
23653 continue
23654 }
23655 d := auxIntToInt16(v_1_1.AuxInt)
23656 if !(c >= d+1 && d+1 > d) {
23657 continue
23658 }
23659 v.reset(OpLeq16U)
23660 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23661 v0.AuxInt = int16ToAuxInt(c - d - 1)
23662 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23663 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23664 v2.AuxInt = int16ToAuxInt(d + 1)
23665 v1.AddArg2(x, v2)
23666 v.AddArg2(v0, v1)
23667 return true
23668 }
23669 break
23670 }
23671
23672
23673
23674 for {
23675 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23676 if v_0.Op != OpLess8 {
23677 continue
23678 }
23679 x := v_0.Args[1]
23680 v_0_0 := v_0.Args[0]
23681 if v_0_0.Op != OpConst8 {
23682 continue
23683 }
23684 c := auxIntToInt8(v_0_0.AuxInt)
23685 if v_1.Op != OpLeq8 {
23686 continue
23687 }
23688 _ = v_1.Args[1]
23689 if x != v_1.Args[0] {
23690 continue
23691 }
23692 v_1_1 := v_1.Args[1]
23693 if v_1_1.Op != OpConst8 {
23694 continue
23695 }
23696 d := auxIntToInt8(v_1_1.AuxInt)
23697 if !(c >= d+1 && d+1 > d) {
23698 continue
23699 }
23700 v.reset(OpLess8U)
23701 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23702 v0.AuxInt = int8ToAuxInt(c - d - 1)
23703 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23704 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23705 v2.AuxInt = int8ToAuxInt(d + 1)
23706 v1.AddArg2(x, v2)
23707 v.AddArg2(v0, v1)
23708 return true
23709 }
23710 break
23711 }
23712
23713
23714
23715 for {
23716 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23717 if v_0.Op != OpLeq8 {
23718 continue
23719 }
23720 x := v_0.Args[1]
23721 v_0_0 := v_0.Args[0]
23722 if v_0_0.Op != OpConst8 {
23723 continue
23724 }
23725 c := auxIntToInt8(v_0_0.AuxInt)
23726 if v_1.Op != OpLeq8 {
23727 continue
23728 }
23729 _ = v_1.Args[1]
23730 if x != v_1.Args[0] {
23731 continue
23732 }
23733 v_1_1 := v_1.Args[1]
23734 if v_1_1.Op != OpConst8 {
23735 continue
23736 }
23737 d := auxIntToInt8(v_1_1.AuxInt)
23738 if !(c >= d+1 && d+1 > d) {
23739 continue
23740 }
23741 v.reset(OpLeq8U)
23742 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23743 v0.AuxInt = int8ToAuxInt(c - d - 1)
23744 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23745 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23746 v2.AuxInt = int8ToAuxInt(d + 1)
23747 v1.AddArg2(x, v2)
23748 v.AddArg2(v0, v1)
23749 return true
23750 }
23751 break
23752 }
23753
23754
23755
23756 for {
23757 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23758 if v_0.Op != OpLess64U {
23759 continue
23760 }
23761 x := v_0.Args[1]
23762 v_0_0 := v_0.Args[0]
23763 if v_0_0.Op != OpConst64 {
23764 continue
23765 }
23766 c := auxIntToInt64(v_0_0.AuxInt)
23767 if v_1.Op != OpLess64U {
23768 continue
23769 }
23770 _ = v_1.Args[1]
23771 if x != v_1.Args[0] {
23772 continue
23773 }
23774 v_1_1 := v_1.Args[1]
23775 if v_1_1.Op != OpConst64 {
23776 continue
23777 }
23778 d := auxIntToInt64(v_1_1.AuxInt)
23779 if !(uint64(c) >= uint64(d)) {
23780 continue
23781 }
23782 v.reset(OpLess64U)
23783 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23784 v0.AuxInt = int64ToAuxInt(c - d)
23785 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23786 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23787 v2.AuxInt = int64ToAuxInt(d)
23788 v1.AddArg2(x, v2)
23789 v.AddArg2(v0, v1)
23790 return true
23791 }
23792 break
23793 }
23794
23795
23796
23797 for {
23798 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23799 if v_0.Op != OpLeq64U {
23800 continue
23801 }
23802 x := v_0.Args[1]
23803 v_0_0 := v_0.Args[0]
23804 if v_0_0.Op != OpConst64 {
23805 continue
23806 }
23807 c := auxIntToInt64(v_0_0.AuxInt)
23808 if v_1.Op != OpLess64U {
23809 continue
23810 }
23811 _ = v_1.Args[1]
23812 if x != v_1.Args[0] {
23813 continue
23814 }
23815 v_1_1 := v_1.Args[1]
23816 if v_1_1.Op != OpConst64 {
23817 continue
23818 }
23819 d := auxIntToInt64(v_1_1.AuxInt)
23820 if !(uint64(c) >= uint64(d)) {
23821 continue
23822 }
23823 v.reset(OpLeq64U)
23824 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23825 v0.AuxInt = int64ToAuxInt(c - d)
23826 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23827 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23828 v2.AuxInt = int64ToAuxInt(d)
23829 v1.AddArg2(x, v2)
23830 v.AddArg2(v0, v1)
23831 return true
23832 }
23833 break
23834 }
23835
23836
23837
23838 for {
23839 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23840 if v_0.Op != OpLess32U {
23841 continue
23842 }
23843 x := v_0.Args[1]
23844 v_0_0 := v_0.Args[0]
23845 if v_0_0.Op != OpConst32 {
23846 continue
23847 }
23848 c := auxIntToInt32(v_0_0.AuxInt)
23849 if v_1.Op != OpLess32U {
23850 continue
23851 }
23852 _ = v_1.Args[1]
23853 if x != v_1.Args[0] {
23854 continue
23855 }
23856 v_1_1 := v_1.Args[1]
23857 if v_1_1.Op != OpConst32 {
23858 continue
23859 }
23860 d := auxIntToInt32(v_1_1.AuxInt)
23861 if !(uint32(c) >= uint32(d)) {
23862 continue
23863 }
23864 v.reset(OpLess32U)
23865 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23866 v0.AuxInt = int32ToAuxInt(c - d)
23867 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23868 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23869 v2.AuxInt = int32ToAuxInt(d)
23870 v1.AddArg2(x, v2)
23871 v.AddArg2(v0, v1)
23872 return true
23873 }
23874 break
23875 }
23876
23877
23878
23879 for {
23880 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23881 if v_0.Op != OpLeq32U {
23882 continue
23883 }
23884 x := v_0.Args[1]
23885 v_0_0 := v_0.Args[0]
23886 if v_0_0.Op != OpConst32 {
23887 continue
23888 }
23889 c := auxIntToInt32(v_0_0.AuxInt)
23890 if v_1.Op != OpLess32U {
23891 continue
23892 }
23893 _ = v_1.Args[1]
23894 if x != v_1.Args[0] {
23895 continue
23896 }
23897 v_1_1 := v_1.Args[1]
23898 if v_1_1.Op != OpConst32 {
23899 continue
23900 }
23901 d := auxIntToInt32(v_1_1.AuxInt)
23902 if !(uint32(c) >= uint32(d)) {
23903 continue
23904 }
23905 v.reset(OpLeq32U)
23906 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23907 v0.AuxInt = int32ToAuxInt(c - d)
23908 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23909 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23910 v2.AuxInt = int32ToAuxInt(d)
23911 v1.AddArg2(x, v2)
23912 v.AddArg2(v0, v1)
23913 return true
23914 }
23915 break
23916 }
23917
23918
23919
23920 for {
23921 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23922 if v_0.Op != OpLess16U {
23923 continue
23924 }
23925 x := v_0.Args[1]
23926 v_0_0 := v_0.Args[0]
23927 if v_0_0.Op != OpConst16 {
23928 continue
23929 }
23930 c := auxIntToInt16(v_0_0.AuxInt)
23931 if v_1.Op != OpLess16U {
23932 continue
23933 }
23934 _ = v_1.Args[1]
23935 if x != v_1.Args[0] {
23936 continue
23937 }
23938 v_1_1 := v_1.Args[1]
23939 if v_1_1.Op != OpConst16 {
23940 continue
23941 }
23942 d := auxIntToInt16(v_1_1.AuxInt)
23943 if !(uint16(c) >= uint16(d)) {
23944 continue
23945 }
23946 v.reset(OpLess16U)
23947 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23948 v0.AuxInt = int16ToAuxInt(c - d)
23949 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23950 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23951 v2.AuxInt = int16ToAuxInt(d)
23952 v1.AddArg2(x, v2)
23953 v.AddArg2(v0, v1)
23954 return true
23955 }
23956 break
23957 }
23958
23959
23960
23961 for {
23962 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23963 if v_0.Op != OpLeq16U {
23964 continue
23965 }
23966 x := v_0.Args[1]
23967 v_0_0 := v_0.Args[0]
23968 if v_0_0.Op != OpConst16 {
23969 continue
23970 }
23971 c := auxIntToInt16(v_0_0.AuxInt)
23972 if v_1.Op != OpLess16U {
23973 continue
23974 }
23975 _ = v_1.Args[1]
23976 if x != v_1.Args[0] {
23977 continue
23978 }
23979 v_1_1 := v_1.Args[1]
23980 if v_1_1.Op != OpConst16 {
23981 continue
23982 }
23983 d := auxIntToInt16(v_1_1.AuxInt)
23984 if !(uint16(c) >= uint16(d)) {
23985 continue
23986 }
23987 v.reset(OpLeq16U)
23988 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23989 v0.AuxInt = int16ToAuxInt(c - d)
23990 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23991 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23992 v2.AuxInt = int16ToAuxInt(d)
23993 v1.AddArg2(x, v2)
23994 v.AddArg2(v0, v1)
23995 return true
23996 }
23997 break
23998 }
23999
24000
24001
24002 for {
24003 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24004 if v_0.Op != OpLess8U {
24005 continue
24006 }
24007 x := v_0.Args[1]
24008 v_0_0 := v_0.Args[0]
24009 if v_0_0.Op != OpConst8 {
24010 continue
24011 }
24012 c := auxIntToInt8(v_0_0.AuxInt)
24013 if v_1.Op != OpLess8U {
24014 continue
24015 }
24016 _ = v_1.Args[1]
24017 if x != v_1.Args[0] {
24018 continue
24019 }
24020 v_1_1 := v_1.Args[1]
24021 if v_1_1.Op != OpConst8 {
24022 continue
24023 }
24024 d := auxIntToInt8(v_1_1.AuxInt)
24025 if !(uint8(c) >= uint8(d)) {
24026 continue
24027 }
24028 v.reset(OpLess8U)
24029 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24030 v0.AuxInt = int8ToAuxInt(c - d)
24031 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24032 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24033 v2.AuxInt = int8ToAuxInt(d)
24034 v1.AddArg2(x, v2)
24035 v.AddArg2(v0, v1)
24036 return true
24037 }
24038 break
24039 }
24040
24041
24042
24043 for {
24044 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24045 if v_0.Op != OpLeq8U {
24046 continue
24047 }
24048 x := v_0.Args[1]
24049 v_0_0 := v_0.Args[0]
24050 if v_0_0.Op != OpConst8 {
24051 continue
24052 }
24053 c := auxIntToInt8(v_0_0.AuxInt)
24054 if v_1.Op != OpLess8U {
24055 continue
24056 }
24057 _ = v_1.Args[1]
24058 if x != v_1.Args[0] {
24059 continue
24060 }
24061 v_1_1 := v_1.Args[1]
24062 if v_1_1.Op != OpConst8 {
24063 continue
24064 }
24065 d := auxIntToInt8(v_1_1.AuxInt)
24066 if !(uint8(c) >= uint8(d)) {
24067 continue
24068 }
24069 v.reset(OpLeq8U)
24070 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24071 v0.AuxInt = int8ToAuxInt(c - d)
24072 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24073 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24074 v2.AuxInt = int8ToAuxInt(d)
24075 v1.AddArg2(x, v2)
24076 v.AddArg2(v0, v1)
24077 return true
24078 }
24079 break
24080 }
24081
24082
24083
24084 for {
24085 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24086 if v_0.Op != OpLess64U {
24087 continue
24088 }
24089 x := v_0.Args[1]
24090 v_0_0 := v_0.Args[0]
24091 if v_0_0.Op != OpConst64 {
24092 continue
24093 }
24094 c := auxIntToInt64(v_0_0.AuxInt)
24095 if v_1.Op != OpLeq64U {
24096 continue
24097 }
24098 _ = v_1.Args[1]
24099 if x != v_1.Args[0] {
24100 continue
24101 }
24102 v_1_1 := v_1.Args[1]
24103 if v_1_1.Op != OpConst64 {
24104 continue
24105 }
24106 d := auxIntToInt64(v_1_1.AuxInt)
24107 if !(uint64(c) >= uint64(d+1) && uint64(d+1) > uint64(d)) {
24108 continue
24109 }
24110 v.reset(OpLess64U)
24111 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
24112 v0.AuxInt = int64ToAuxInt(c - d - 1)
24113 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
24114 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
24115 v2.AuxInt = int64ToAuxInt(d + 1)
24116 v1.AddArg2(x, v2)
24117 v.AddArg2(v0, v1)
24118 return true
24119 }
24120 break
24121 }
24122
24123
24124
24125 for {
24126 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24127 if v_0.Op != OpLeq64U {
24128 continue
24129 }
24130 x := v_0.Args[1]
24131 v_0_0 := v_0.Args[0]
24132 if v_0_0.Op != OpConst64 {
24133 continue
24134 }
24135 c := auxIntToInt64(v_0_0.AuxInt)
24136 if v_1.Op != OpLeq64U {
24137 continue
24138 }
24139 _ = v_1.Args[1]
24140 if x != v_1.Args[0] {
24141 continue
24142 }
24143 v_1_1 := v_1.Args[1]
24144 if v_1_1.Op != OpConst64 {
24145 continue
24146 }
24147 d := auxIntToInt64(v_1_1.AuxInt)
24148 if !(uint64(c) >= uint64(d+1) && uint64(d+1) > uint64(d)) {
24149 continue
24150 }
24151 v.reset(OpLeq64U)
24152 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
24153 v0.AuxInt = int64ToAuxInt(c - d - 1)
24154 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
24155 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
24156 v2.AuxInt = int64ToAuxInt(d + 1)
24157 v1.AddArg2(x, v2)
24158 v.AddArg2(v0, v1)
24159 return true
24160 }
24161 break
24162 }
24163
24164
24165
24166 for {
24167 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24168 if v_0.Op != OpLess32U {
24169 continue
24170 }
24171 x := v_0.Args[1]
24172 v_0_0 := v_0.Args[0]
24173 if v_0_0.Op != OpConst32 {
24174 continue
24175 }
24176 c := auxIntToInt32(v_0_0.AuxInt)
24177 if v_1.Op != OpLeq32U {
24178 continue
24179 }
24180 _ = v_1.Args[1]
24181 if x != v_1.Args[0] {
24182 continue
24183 }
24184 v_1_1 := v_1.Args[1]
24185 if v_1_1.Op != OpConst32 {
24186 continue
24187 }
24188 d := auxIntToInt32(v_1_1.AuxInt)
24189 if !(uint32(c) >= uint32(d+1) && uint32(d+1) > uint32(d)) {
24190 continue
24191 }
24192 v.reset(OpLess32U)
24193 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
24194 v0.AuxInt = int32ToAuxInt(c - d - 1)
24195 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
24196 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
24197 v2.AuxInt = int32ToAuxInt(d + 1)
24198 v1.AddArg2(x, v2)
24199 v.AddArg2(v0, v1)
24200 return true
24201 }
24202 break
24203 }
24204
24205
24206
24207 for {
24208 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24209 if v_0.Op != OpLeq32U {
24210 continue
24211 }
24212 x := v_0.Args[1]
24213 v_0_0 := v_0.Args[0]
24214 if v_0_0.Op != OpConst32 {
24215 continue
24216 }
24217 c := auxIntToInt32(v_0_0.AuxInt)
24218 if v_1.Op != OpLeq32U {
24219 continue
24220 }
24221 _ = v_1.Args[1]
24222 if x != v_1.Args[0] {
24223 continue
24224 }
24225 v_1_1 := v_1.Args[1]
24226 if v_1_1.Op != OpConst32 {
24227 continue
24228 }
24229 d := auxIntToInt32(v_1_1.AuxInt)
24230 if !(uint32(c) >= uint32(d+1) && uint32(d+1) > uint32(d)) {
24231 continue
24232 }
24233 v.reset(OpLeq32U)
24234 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
24235 v0.AuxInt = int32ToAuxInt(c - d - 1)
24236 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
24237 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
24238 v2.AuxInt = int32ToAuxInt(d + 1)
24239 v1.AddArg2(x, v2)
24240 v.AddArg2(v0, v1)
24241 return true
24242 }
24243 break
24244 }
24245
24246
24247
24248 for {
24249 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24250 if v_0.Op != OpLess16U {
24251 continue
24252 }
24253 x := v_0.Args[1]
24254 v_0_0 := v_0.Args[0]
24255 if v_0_0.Op != OpConst16 {
24256 continue
24257 }
24258 c := auxIntToInt16(v_0_0.AuxInt)
24259 if v_1.Op != OpLeq16U {
24260 continue
24261 }
24262 _ = v_1.Args[1]
24263 if x != v_1.Args[0] {
24264 continue
24265 }
24266 v_1_1 := v_1.Args[1]
24267 if v_1_1.Op != OpConst16 {
24268 continue
24269 }
24270 d := auxIntToInt16(v_1_1.AuxInt)
24271 if !(uint16(c) >= uint16(d+1) && uint16(d+1) > uint16(d)) {
24272 continue
24273 }
24274 v.reset(OpLess16U)
24275 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24276 v0.AuxInt = int16ToAuxInt(c - d - 1)
24277 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24278 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24279 v2.AuxInt = int16ToAuxInt(d + 1)
24280 v1.AddArg2(x, v2)
24281 v.AddArg2(v0, v1)
24282 return true
24283 }
24284 break
24285 }
24286
24287
24288
24289 for {
24290 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24291 if v_0.Op != OpLeq16U {
24292 continue
24293 }
24294 x := v_0.Args[1]
24295 v_0_0 := v_0.Args[0]
24296 if v_0_0.Op != OpConst16 {
24297 continue
24298 }
24299 c := auxIntToInt16(v_0_0.AuxInt)
24300 if v_1.Op != OpLeq16U {
24301 continue
24302 }
24303 _ = v_1.Args[1]
24304 if x != v_1.Args[0] {
24305 continue
24306 }
24307 v_1_1 := v_1.Args[1]
24308 if v_1_1.Op != OpConst16 {
24309 continue
24310 }
24311 d := auxIntToInt16(v_1_1.AuxInt)
24312 if !(uint16(c) >= uint16(d+1) && uint16(d+1) > uint16(d)) {
24313 continue
24314 }
24315 v.reset(OpLeq16U)
24316 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
24317 v0.AuxInt = int16ToAuxInt(c - d - 1)
24318 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
24319 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
24320 v2.AuxInt = int16ToAuxInt(d + 1)
24321 v1.AddArg2(x, v2)
24322 v.AddArg2(v0, v1)
24323 return true
24324 }
24325 break
24326 }
24327
24328
24329
24330 for {
24331 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24332 if v_0.Op != OpLess8U {
24333 continue
24334 }
24335 x := v_0.Args[1]
24336 v_0_0 := v_0.Args[0]
24337 if v_0_0.Op != OpConst8 {
24338 continue
24339 }
24340 c := auxIntToInt8(v_0_0.AuxInt)
24341 if v_1.Op != OpLeq8U {
24342 continue
24343 }
24344 _ = v_1.Args[1]
24345 if x != v_1.Args[0] {
24346 continue
24347 }
24348 v_1_1 := v_1.Args[1]
24349 if v_1_1.Op != OpConst8 {
24350 continue
24351 }
24352 d := auxIntToInt8(v_1_1.AuxInt)
24353 if !(uint8(c) >= uint8(d+1) && uint8(d+1) > uint8(d)) {
24354 continue
24355 }
24356 v.reset(OpLess8U)
24357 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24358 v0.AuxInt = int8ToAuxInt(c - d - 1)
24359 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24360 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24361 v2.AuxInt = int8ToAuxInt(d + 1)
24362 v1.AddArg2(x, v2)
24363 v.AddArg2(v0, v1)
24364 return true
24365 }
24366 break
24367 }
24368
24369
24370
24371 for {
24372 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24373 if v_0.Op != OpLeq8U {
24374 continue
24375 }
24376 x := v_0.Args[1]
24377 v_0_0 := v_0.Args[0]
24378 if v_0_0.Op != OpConst8 {
24379 continue
24380 }
24381 c := auxIntToInt8(v_0_0.AuxInt)
24382 if v_1.Op != OpLeq8U {
24383 continue
24384 }
24385 _ = v_1.Args[1]
24386 if x != v_1.Args[0] {
24387 continue
24388 }
24389 v_1_1 := v_1.Args[1]
24390 if v_1_1.Op != OpConst8 {
24391 continue
24392 }
24393 d := auxIntToInt8(v_1_1.AuxInt)
24394 if !(uint8(c) >= uint8(d+1) && uint8(d+1) > uint8(d)) {
24395 continue
24396 }
24397 v.reset(OpLeq8U)
24398 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
24399 v0.AuxInt = int8ToAuxInt(c - d - 1)
24400 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
24401 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
24402 v2.AuxInt = int8ToAuxInt(d + 1)
24403 v1.AddArg2(x, v2)
24404 v.AddArg2(v0, v1)
24405 return true
24406 }
24407 break
24408 }
24409
24410
24411
24412 for {
24413 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24414 if v_0.Op != OpEq64 {
24415 continue
24416 }
24417 _ = v_0.Args[1]
24418 v_0_0 := v_0.Args[0]
24419 v_0_1 := v_0.Args[1]
24420 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
24421 x := v_0_0
24422 cv := v_0_1
24423 if cv.Op != OpConst64 {
24424 continue
24425 }
24426 c := auxIntToInt64(cv.AuxInt)
24427 if v_1.Op != OpEq64 {
24428 continue
24429 }
24430 _ = v_1.Args[1]
24431 v_1_0 := v_1.Args[0]
24432 v_1_1 := v_1.Args[1]
24433 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
24434 if x != v_1_0 || v_1_1.Op != OpConst64 {
24435 continue
24436 }
24437 d := auxIntToInt64(v_1_1.AuxInt)
24438 if !(c|d == c && oneBit(c^d)) {
24439 continue
24440 }
24441 v.reset(OpEq64)
24442 v0 := b.NewValue0(v.Pos, OpOr64, x.Type)
24443 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
24444 v1.AuxInt = int64ToAuxInt(c ^ d)
24445 v0.AddArg2(x, v1)
24446 v.AddArg2(v0, cv)
24447 return true
24448 }
24449 }
24450 }
24451 break
24452 }
24453
24454
24455
24456 for {
24457 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24458 if v_0.Op != OpEq32 {
24459 continue
24460 }
24461 _ = v_0.Args[1]
24462 v_0_0 := v_0.Args[0]
24463 v_0_1 := v_0.Args[1]
24464 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
24465 x := v_0_0
24466 cv := v_0_1
24467 if cv.Op != OpConst32 {
24468 continue
24469 }
24470 c := auxIntToInt32(cv.AuxInt)
24471 if v_1.Op != OpEq32 {
24472 continue
24473 }
24474 _ = v_1.Args[1]
24475 v_1_0 := v_1.Args[0]
24476 v_1_1 := v_1.Args[1]
24477 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
24478 if x != v_1_0 || v_1_1.Op != OpConst32 {
24479 continue
24480 }
24481 d := auxIntToInt32(v_1_1.AuxInt)
24482 if !(c|d == c && oneBit(c^d)) {
24483 continue
24484 }
24485 v.reset(OpEq32)
24486 v0 := b.NewValue0(v.Pos, OpOr32, x.Type)
24487 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
24488 v1.AuxInt = int32ToAuxInt(c ^ d)
24489 v0.AddArg2(x, v1)
24490 v.AddArg2(v0, cv)
24491 return true
24492 }
24493 }
24494 }
24495 break
24496 }
24497
24498
24499
24500 for {
24501 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24502 if v_0.Op != OpEq16 {
24503 continue
24504 }
24505 _ = v_0.Args[1]
24506 v_0_0 := v_0.Args[0]
24507 v_0_1 := v_0.Args[1]
24508 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
24509 x := v_0_0
24510 cv := v_0_1
24511 if cv.Op != OpConst16 {
24512 continue
24513 }
24514 c := auxIntToInt16(cv.AuxInt)
24515 if v_1.Op != OpEq16 {
24516 continue
24517 }
24518 _ = v_1.Args[1]
24519 v_1_0 := v_1.Args[0]
24520 v_1_1 := v_1.Args[1]
24521 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
24522 if x != v_1_0 || v_1_1.Op != OpConst16 {
24523 continue
24524 }
24525 d := auxIntToInt16(v_1_1.AuxInt)
24526 if !(c|d == c && oneBit(c^d)) {
24527 continue
24528 }
24529 v.reset(OpEq16)
24530 v0 := b.NewValue0(v.Pos, OpOr16, x.Type)
24531 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
24532 v1.AuxInt = int16ToAuxInt(c ^ d)
24533 v0.AddArg2(x, v1)
24534 v.AddArg2(v0, cv)
24535 return true
24536 }
24537 }
24538 }
24539 break
24540 }
24541
24542
24543
24544 for {
24545 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24546 if v_0.Op != OpEq8 {
24547 continue
24548 }
24549 _ = v_0.Args[1]
24550 v_0_0 := v_0.Args[0]
24551 v_0_1 := v_0.Args[1]
24552 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
24553 x := v_0_0
24554 cv := v_0_1
24555 if cv.Op != OpConst8 {
24556 continue
24557 }
24558 c := auxIntToInt8(cv.AuxInt)
24559 if v_1.Op != OpEq8 {
24560 continue
24561 }
24562 _ = v_1.Args[1]
24563 v_1_0 := v_1.Args[0]
24564 v_1_1 := v_1.Args[1]
24565 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
24566 if x != v_1_0 || v_1_1.Op != OpConst8 {
24567 continue
24568 }
24569 d := auxIntToInt8(v_1_1.AuxInt)
24570 if !(c|d == c && oneBit(c^d)) {
24571 continue
24572 }
24573 v.reset(OpEq8)
24574 v0 := b.NewValue0(v.Pos, OpOr8, x.Type)
24575 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
24576 v1.AuxInt = int8ToAuxInt(c ^ d)
24577 v0.AddArg2(x, v1)
24578 v.AddArg2(v0, cv)
24579 return true
24580 }
24581 }
24582 }
24583 break
24584 }
24585
24586
24587 for {
24588 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24589 if v_0.Op != OpNeq64F {
24590 continue
24591 }
24592 x := v_0.Args[1]
24593 if x != v_0.Args[0] || v_1.Op != OpLess64F {
24594 continue
24595 }
24596 _ = v_1.Args[1]
24597 if x != v_1.Args[0] {
24598 continue
24599 }
24600 y := v_1.Args[1]
24601 if y.Op != OpConst64F {
24602 continue
24603 }
24604 v.reset(OpNot)
24605 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
24606 v0.AddArg2(y, x)
24607 v.AddArg(v0)
24608 return true
24609 }
24610 break
24611 }
24612
24613
24614 for {
24615 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24616 if v_0.Op != OpNeq64F {
24617 continue
24618 }
24619 x := v_0.Args[1]
24620 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
24621 continue
24622 }
24623 _ = v_1.Args[1]
24624 if x != v_1.Args[0] {
24625 continue
24626 }
24627 y := v_1.Args[1]
24628 if y.Op != OpConst64F {
24629 continue
24630 }
24631 v.reset(OpNot)
24632 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
24633 v0.AddArg2(y, x)
24634 v.AddArg(v0)
24635 return true
24636 }
24637 break
24638 }
24639
24640
24641 for {
24642 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24643 if v_0.Op != OpNeq64F {
24644 continue
24645 }
24646 x := v_0.Args[1]
24647 if x != v_0.Args[0] || v_1.Op != OpLess64F {
24648 continue
24649 }
24650 _ = v_1.Args[1]
24651 y := v_1.Args[0]
24652 if y.Op != OpConst64F {
24653 continue
24654 }
24655 if x != v_1.Args[1] {
24656 continue
24657 }
24658 v.reset(OpNot)
24659 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
24660 v0.AddArg2(x, y)
24661 v.AddArg(v0)
24662 return true
24663 }
24664 break
24665 }
24666
24667
24668 for {
24669 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24670 if v_0.Op != OpNeq64F {
24671 continue
24672 }
24673 x := v_0.Args[1]
24674 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
24675 continue
24676 }
24677 _ = v_1.Args[1]
24678 y := v_1.Args[0]
24679 if y.Op != OpConst64F {
24680 continue
24681 }
24682 if x != v_1.Args[1] {
24683 continue
24684 }
24685 v.reset(OpNot)
24686 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
24687 v0.AddArg2(x, y)
24688 v.AddArg(v0)
24689 return true
24690 }
24691 break
24692 }
24693
24694
24695 for {
24696 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24697 if v_0.Op != OpNeq32F {
24698 continue
24699 }
24700 x := v_0.Args[1]
24701 if x != v_0.Args[0] || v_1.Op != OpLess32F {
24702 continue
24703 }
24704 _ = v_1.Args[1]
24705 if x != v_1.Args[0] {
24706 continue
24707 }
24708 y := v_1.Args[1]
24709 if y.Op != OpConst32F {
24710 continue
24711 }
24712 v.reset(OpNot)
24713 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
24714 v0.AddArg2(y, x)
24715 v.AddArg(v0)
24716 return true
24717 }
24718 break
24719 }
24720
24721
24722 for {
24723 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24724 if v_0.Op != OpNeq32F {
24725 continue
24726 }
24727 x := v_0.Args[1]
24728 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
24729 continue
24730 }
24731 _ = v_1.Args[1]
24732 if x != v_1.Args[0] {
24733 continue
24734 }
24735 y := v_1.Args[1]
24736 if y.Op != OpConst32F {
24737 continue
24738 }
24739 v.reset(OpNot)
24740 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
24741 v0.AddArg2(y, x)
24742 v.AddArg(v0)
24743 return true
24744 }
24745 break
24746 }
24747
24748
24749 for {
24750 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24751 if v_0.Op != OpNeq32F {
24752 continue
24753 }
24754 x := v_0.Args[1]
24755 if x != v_0.Args[0] || v_1.Op != OpLess32F {
24756 continue
24757 }
24758 _ = v_1.Args[1]
24759 y := v_1.Args[0]
24760 if y.Op != OpConst32F {
24761 continue
24762 }
24763 if x != v_1.Args[1] {
24764 continue
24765 }
24766 v.reset(OpNot)
24767 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
24768 v0.AddArg2(x, y)
24769 v.AddArg(v0)
24770 return true
24771 }
24772 break
24773 }
24774
24775
24776 for {
24777 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24778 if v_0.Op != OpNeq32F {
24779 continue
24780 }
24781 x := v_0.Args[1]
24782 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
24783 continue
24784 }
24785 _ = v_1.Args[1]
24786 y := v_1.Args[0]
24787 if y.Op != OpConst32F {
24788 continue
24789 }
24790 if x != v_1.Args[1] {
24791 continue
24792 }
24793 v.reset(OpNot)
24794 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
24795 v0.AddArg2(x, y)
24796 v.AddArg(v0)
24797 return true
24798 }
24799 break
24800 }
24801
24802
24803 for {
24804 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24805 if v_0.Op != OpNeq64F {
24806 continue
24807 }
24808 x := v_0.Args[1]
24809 if x != v_0.Args[0] || v_1.Op != OpLess64F {
24810 continue
24811 }
24812 _ = v_1.Args[1]
24813 abs := v_1.Args[0]
24814 if abs.Op != OpAbs || x != abs.Args[0] {
24815 continue
24816 }
24817 y := v_1.Args[1]
24818 if y.Op != OpConst64F {
24819 continue
24820 }
24821 v.reset(OpNot)
24822 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
24823 v0.AddArg2(y, abs)
24824 v.AddArg(v0)
24825 return true
24826 }
24827 break
24828 }
24829
24830
24831 for {
24832 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24833 if v_0.Op != OpNeq64F {
24834 continue
24835 }
24836 x := v_0.Args[1]
24837 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
24838 continue
24839 }
24840 _ = v_1.Args[1]
24841 abs := v_1.Args[0]
24842 if abs.Op != OpAbs || x != abs.Args[0] {
24843 continue
24844 }
24845 y := v_1.Args[1]
24846 if y.Op != OpConst64F {
24847 continue
24848 }
24849 v.reset(OpNot)
24850 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
24851 v0.AddArg2(y, abs)
24852 v.AddArg(v0)
24853 return true
24854 }
24855 break
24856 }
24857
24858
24859 for {
24860 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24861 if v_0.Op != OpNeq64F {
24862 continue
24863 }
24864 x := v_0.Args[1]
24865 if x != v_0.Args[0] || v_1.Op != OpLess64F {
24866 continue
24867 }
24868 _ = v_1.Args[1]
24869 y := v_1.Args[0]
24870 if y.Op != OpConst64F {
24871 continue
24872 }
24873 abs := v_1.Args[1]
24874 if abs.Op != OpAbs || x != abs.Args[0] {
24875 continue
24876 }
24877 v.reset(OpNot)
24878 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
24879 v0.AddArg2(abs, y)
24880 v.AddArg(v0)
24881 return true
24882 }
24883 break
24884 }
24885
24886
24887 for {
24888 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24889 if v_0.Op != OpNeq64F {
24890 continue
24891 }
24892 x := v_0.Args[1]
24893 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
24894 continue
24895 }
24896 _ = v_1.Args[1]
24897 y := v_1.Args[0]
24898 if y.Op != OpConst64F {
24899 continue
24900 }
24901 abs := v_1.Args[1]
24902 if abs.Op != OpAbs || x != abs.Args[0] {
24903 continue
24904 }
24905 v.reset(OpNot)
24906 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
24907 v0.AddArg2(abs, y)
24908 v.AddArg(v0)
24909 return true
24910 }
24911 break
24912 }
24913
24914
24915 for {
24916 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24917 if v_0.Op != OpNeq64F {
24918 continue
24919 }
24920 x := v_0.Args[1]
24921 if x != v_0.Args[0] || v_1.Op != OpLess64F {
24922 continue
24923 }
24924 _ = v_1.Args[1]
24925 neg := v_1.Args[0]
24926 if neg.Op != OpNeg64F || x != neg.Args[0] {
24927 continue
24928 }
24929 y := v_1.Args[1]
24930 if y.Op != OpConst64F {
24931 continue
24932 }
24933 v.reset(OpNot)
24934 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
24935 v0.AddArg2(y, neg)
24936 v.AddArg(v0)
24937 return true
24938 }
24939 break
24940 }
24941
24942
24943 for {
24944 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24945 if v_0.Op != OpNeq64F {
24946 continue
24947 }
24948 x := v_0.Args[1]
24949 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
24950 continue
24951 }
24952 _ = v_1.Args[1]
24953 neg := v_1.Args[0]
24954 if neg.Op != OpNeg64F || x != neg.Args[0] {
24955 continue
24956 }
24957 y := v_1.Args[1]
24958 if y.Op != OpConst64F {
24959 continue
24960 }
24961 v.reset(OpNot)
24962 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
24963 v0.AddArg2(y, neg)
24964 v.AddArg(v0)
24965 return true
24966 }
24967 break
24968 }
24969
24970
24971 for {
24972 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24973 if v_0.Op != OpNeq64F {
24974 continue
24975 }
24976 x := v_0.Args[1]
24977 if x != v_0.Args[0] || v_1.Op != OpLess64F {
24978 continue
24979 }
24980 _ = v_1.Args[1]
24981 y := v_1.Args[0]
24982 if y.Op != OpConst64F {
24983 continue
24984 }
24985 neg := v_1.Args[1]
24986 if neg.Op != OpNeg64F || x != neg.Args[0] {
24987 continue
24988 }
24989 v.reset(OpNot)
24990 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
24991 v0.AddArg2(neg, y)
24992 v.AddArg(v0)
24993 return true
24994 }
24995 break
24996 }
24997
24998
24999 for {
25000 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25001 if v_0.Op != OpNeq64F {
25002 continue
25003 }
25004 x := v_0.Args[1]
25005 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
25006 continue
25007 }
25008 _ = v_1.Args[1]
25009 y := v_1.Args[0]
25010 if y.Op != OpConst64F {
25011 continue
25012 }
25013 neg := v_1.Args[1]
25014 if neg.Op != OpNeg64F || x != neg.Args[0] {
25015 continue
25016 }
25017 v.reset(OpNot)
25018 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
25019 v0.AddArg2(neg, y)
25020 v.AddArg(v0)
25021 return true
25022 }
25023 break
25024 }
25025
25026
25027 for {
25028 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25029 if v_0.Op != OpNeq32F {
25030 continue
25031 }
25032 x := v_0.Args[1]
25033 if x != v_0.Args[0] || v_1.Op != OpLess32F {
25034 continue
25035 }
25036 _ = v_1.Args[1]
25037 neg := v_1.Args[0]
25038 if neg.Op != OpNeg32F || x != neg.Args[0] {
25039 continue
25040 }
25041 y := v_1.Args[1]
25042 if y.Op != OpConst32F {
25043 continue
25044 }
25045 v.reset(OpNot)
25046 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
25047 v0.AddArg2(y, neg)
25048 v.AddArg(v0)
25049 return true
25050 }
25051 break
25052 }
25053
25054
25055 for {
25056 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25057 if v_0.Op != OpNeq32F {
25058 continue
25059 }
25060 x := v_0.Args[1]
25061 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
25062 continue
25063 }
25064 _ = v_1.Args[1]
25065 neg := v_1.Args[0]
25066 if neg.Op != OpNeg32F || x != neg.Args[0] {
25067 continue
25068 }
25069 y := v_1.Args[1]
25070 if y.Op != OpConst32F {
25071 continue
25072 }
25073 v.reset(OpNot)
25074 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
25075 v0.AddArg2(y, neg)
25076 v.AddArg(v0)
25077 return true
25078 }
25079 break
25080 }
25081
25082
25083 for {
25084 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25085 if v_0.Op != OpNeq32F {
25086 continue
25087 }
25088 x := v_0.Args[1]
25089 if x != v_0.Args[0] || v_1.Op != OpLess32F {
25090 continue
25091 }
25092 _ = v_1.Args[1]
25093 y := v_1.Args[0]
25094 if y.Op != OpConst32F {
25095 continue
25096 }
25097 neg := v_1.Args[1]
25098 if neg.Op != OpNeg32F || x != neg.Args[0] {
25099 continue
25100 }
25101 v.reset(OpNot)
25102 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
25103 v0.AddArg2(neg, y)
25104 v.AddArg(v0)
25105 return true
25106 }
25107 break
25108 }
25109
25110
25111 for {
25112 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25113 if v_0.Op != OpNeq32F {
25114 continue
25115 }
25116 x := v_0.Args[1]
25117 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
25118 continue
25119 }
25120 _ = v_1.Args[1]
25121 y := v_1.Args[0]
25122 if y.Op != OpConst32F {
25123 continue
25124 }
25125 neg := v_1.Args[1]
25126 if neg.Op != OpNeg32F || x != neg.Args[0] {
25127 continue
25128 }
25129 v.reset(OpNot)
25130 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
25131 v0.AddArg2(neg, y)
25132 v.AddArg(v0)
25133 return true
25134 }
25135 break
25136 }
25137 return false
25138 }
25139 func rewriteValuegeneric_OpPhi(v *Value) bool {
25140 b := v.Block
25141
25142
25143 for {
25144 if len(v.Args) != 2 {
25145 break
25146 }
25147 _ = v.Args[1]
25148 v_0 := v.Args[0]
25149 if v_0.Op != OpConst8 {
25150 break
25151 }
25152 c := auxIntToInt8(v_0.AuxInt)
25153 v_1 := v.Args[1]
25154 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != c {
25155 break
25156 }
25157 v.reset(OpConst8)
25158 v.AuxInt = int8ToAuxInt(c)
25159 return true
25160 }
25161
25162
25163 for {
25164 if len(v.Args) != 2 {
25165 break
25166 }
25167 _ = v.Args[1]
25168 v_0 := v.Args[0]
25169 if v_0.Op != OpConst16 {
25170 break
25171 }
25172 c := auxIntToInt16(v_0.AuxInt)
25173 v_1 := v.Args[1]
25174 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != c {
25175 break
25176 }
25177 v.reset(OpConst16)
25178 v.AuxInt = int16ToAuxInt(c)
25179 return true
25180 }
25181
25182
25183 for {
25184 if len(v.Args) != 2 {
25185 break
25186 }
25187 _ = v.Args[1]
25188 v_0 := v.Args[0]
25189 if v_0.Op != OpConst32 {
25190 break
25191 }
25192 c := auxIntToInt32(v_0.AuxInt)
25193 v_1 := v.Args[1]
25194 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != c {
25195 break
25196 }
25197 v.reset(OpConst32)
25198 v.AuxInt = int32ToAuxInt(c)
25199 return true
25200 }
25201
25202
25203 for {
25204 if len(v.Args) != 2 {
25205 break
25206 }
25207 _ = v.Args[1]
25208 v_0 := v.Args[0]
25209 if v_0.Op != OpConst64 {
25210 break
25211 }
25212 c := auxIntToInt64(v_0.AuxInt)
25213 v_1 := v.Args[1]
25214 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c {
25215 break
25216 }
25217 v.reset(OpConst64)
25218 v.AuxInt = int64ToAuxInt(c)
25219 return true
25220 }
25221
25222
25223
25224 for {
25225 if len(v.Args) != 2 {
25226 break
25227 }
25228 t := v.Type
25229 _ = v.Args[1]
25230 nx := v.Args[0]
25231 if nx.Op != OpNot {
25232 break
25233 }
25234 x := nx.Args[0]
25235 ny := v.Args[1]
25236 if ny.Op != OpNot {
25237 break
25238 }
25239 y := ny.Args[0]
25240 if !(nx.Uses == 1 && ny.Uses == 1) {
25241 break
25242 }
25243 v.reset(OpNot)
25244 v0 := b.NewValue0(v.Pos, OpPhi, t)
25245 v0.AddArg2(x, y)
25246 v.AddArg(v0)
25247 return true
25248 }
25249 return false
25250 }
25251 func rewriteValuegeneric_OpPopCount16(v *Value) bool {
25252 v_0 := v.Args[0]
25253 b := v.Block
25254 config := b.Func.Config
25255
25256
25257
25258 for {
25259 if v_0.Op != OpConst16 {
25260 break
25261 }
25262 c := auxIntToInt16(v_0.AuxInt)
25263 if !(config.PtrSize == 8) {
25264 break
25265 }
25266 v.reset(OpConst64)
25267 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount16(uint16(c))))
25268 return true
25269 }
25270
25271
25272
25273 for {
25274 if v_0.Op != OpConst16 {
25275 break
25276 }
25277 c := auxIntToInt16(v_0.AuxInt)
25278 if !(config.PtrSize == 4) {
25279 break
25280 }
25281 v.reset(OpConst32)
25282 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount16(uint16(c))))
25283 return true
25284 }
25285 return false
25286 }
25287 func rewriteValuegeneric_OpPopCount32(v *Value) bool {
25288 v_0 := v.Args[0]
25289 b := v.Block
25290 config := b.Func.Config
25291
25292
25293
25294 for {
25295 if v_0.Op != OpConst32 {
25296 break
25297 }
25298 c := auxIntToInt32(v_0.AuxInt)
25299 if !(config.PtrSize == 8) {
25300 break
25301 }
25302 v.reset(OpConst64)
25303 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount32(uint32(c))))
25304 return true
25305 }
25306
25307
25308
25309 for {
25310 if v_0.Op != OpConst32 {
25311 break
25312 }
25313 c := auxIntToInt32(v_0.AuxInt)
25314 if !(config.PtrSize == 4) {
25315 break
25316 }
25317 v.reset(OpConst32)
25318 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount32(uint32(c))))
25319 return true
25320 }
25321 return false
25322 }
25323 func rewriteValuegeneric_OpPopCount64(v *Value) bool {
25324 v_0 := v.Args[0]
25325 b := v.Block
25326 config := b.Func.Config
25327
25328
25329
25330 for {
25331 if v_0.Op != OpConst64 {
25332 break
25333 }
25334 c := auxIntToInt64(v_0.AuxInt)
25335 if !(config.PtrSize == 8) {
25336 break
25337 }
25338 v.reset(OpConst64)
25339 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount64(uint64(c))))
25340 return true
25341 }
25342
25343
25344
25345 for {
25346 if v_0.Op != OpConst64 {
25347 break
25348 }
25349 c := auxIntToInt64(v_0.AuxInt)
25350 if !(config.PtrSize == 4) {
25351 break
25352 }
25353 v.reset(OpConst32)
25354 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount64(uint64(c))))
25355 return true
25356 }
25357 return false
25358 }
25359 func rewriteValuegeneric_OpPopCount8(v *Value) bool {
25360 v_0 := v.Args[0]
25361 b := v.Block
25362 config := b.Func.Config
25363
25364
25365
25366 for {
25367 if v_0.Op != OpConst8 {
25368 break
25369 }
25370 c := auxIntToInt8(v_0.AuxInt)
25371 if !(config.PtrSize == 8) {
25372 break
25373 }
25374 v.reset(OpConst64)
25375 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount8(uint8(c))))
25376 return true
25377 }
25378
25379
25380
25381 for {
25382 if v_0.Op != OpConst8 {
25383 break
25384 }
25385 c := auxIntToInt8(v_0.AuxInt)
25386 if !(config.PtrSize == 4) {
25387 break
25388 }
25389 v.reset(OpConst32)
25390 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount8(uint8(c))))
25391 return true
25392 }
25393 return false
25394 }
25395 func rewriteValuegeneric_OpPtrIndex(v *Value) bool {
25396 v_1 := v.Args[1]
25397 v_0 := v.Args[0]
25398 b := v.Block
25399 config := b.Func.Config
25400 typ := &b.Func.Config.Types
25401
25402
25403
25404 for {
25405 t := v.Type
25406 ptr := v_0
25407 idx := v_1
25408 if !(config.PtrSize == 4 && is32Bit(t.Elem().Size())) {
25409 break
25410 }
25411 v.reset(OpAddPtr)
25412 v0 := b.NewValue0(v.Pos, OpMul32, typ.Int)
25413 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
25414 v1.AuxInt = int32ToAuxInt(int32(t.Elem().Size()))
25415 v0.AddArg2(idx, v1)
25416 v.AddArg2(ptr, v0)
25417 return true
25418 }
25419
25420
25421
25422 for {
25423 t := v.Type
25424 ptr := v_0
25425 idx := v_1
25426 if !(config.PtrSize == 8) {
25427 break
25428 }
25429 v.reset(OpAddPtr)
25430 v0 := b.NewValue0(v.Pos, OpMul64, typ.Int)
25431 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
25432 v1.AuxInt = int64ToAuxInt(t.Elem().Size())
25433 v0.AddArg2(idx, v1)
25434 v.AddArg2(ptr, v0)
25435 return true
25436 }
25437 return false
25438 }
25439 func rewriteValuegeneric_OpRotateLeft16(v *Value) bool {
25440 v_1 := v.Args[1]
25441 v_0 := v.Args[0]
25442 b := v.Block
25443 config := b.Func.Config
25444
25445
25446
25447 for {
25448 x := v_0
25449 if v_1.Op != OpConst16 {
25450 break
25451 }
25452 c := auxIntToInt16(v_1.AuxInt)
25453 if !(c%16 == 0) {
25454 break
25455 }
25456 v.copyOf(x)
25457 return true
25458 }
25459
25460
25461
25462 for {
25463 x := v_0
25464 if v_1.Op != OpAnd64 {
25465 break
25466 }
25467 _ = v_1.Args[1]
25468 v_1_0 := v_1.Args[0]
25469 v_1_1 := v_1.Args[1]
25470 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25471 y := v_1_0
25472 if v_1_1.Op != OpConst64 {
25473 continue
25474 }
25475 c := auxIntToInt64(v_1_1.AuxInt)
25476 if !(c&15 == 15) {
25477 continue
25478 }
25479 v.reset(OpRotateLeft16)
25480 v.AddArg2(x, y)
25481 return true
25482 }
25483 break
25484 }
25485
25486
25487
25488 for {
25489 x := v_0
25490 if v_1.Op != OpAnd32 {
25491 break
25492 }
25493 _ = v_1.Args[1]
25494 v_1_0 := v_1.Args[0]
25495 v_1_1 := v_1.Args[1]
25496 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25497 y := v_1_0
25498 if v_1_1.Op != OpConst32 {
25499 continue
25500 }
25501 c := auxIntToInt32(v_1_1.AuxInt)
25502 if !(c&15 == 15) {
25503 continue
25504 }
25505 v.reset(OpRotateLeft16)
25506 v.AddArg2(x, y)
25507 return true
25508 }
25509 break
25510 }
25511
25512
25513
25514 for {
25515 x := v_0
25516 if v_1.Op != OpAnd16 {
25517 break
25518 }
25519 _ = v_1.Args[1]
25520 v_1_0 := v_1.Args[0]
25521 v_1_1 := v_1.Args[1]
25522 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25523 y := v_1_0
25524 if v_1_1.Op != OpConst16 {
25525 continue
25526 }
25527 c := auxIntToInt16(v_1_1.AuxInt)
25528 if !(c&15 == 15) {
25529 continue
25530 }
25531 v.reset(OpRotateLeft16)
25532 v.AddArg2(x, y)
25533 return true
25534 }
25535 break
25536 }
25537
25538
25539
25540 for {
25541 x := v_0
25542 if v_1.Op != OpAnd8 {
25543 break
25544 }
25545 _ = v_1.Args[1]
25546 v_1_0 := v_1.Args[0]
25547 v_1_1 := v_1.Args[1]
25548 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25549 y := v_1_0
25550 if v_1_1.Op != OpConst8 {
25551 continue
25552 }
25553 c := auxIntToInt8(v_1_1.AuxInt)
25554 if !(c&15 == 15) {
25555 continue
25556 }
25557 v.reset(OpRotateLeft16)
25558 v.AddArg2(x, y)
25559 return true
25560 }
25561 break
25562 }
25563
25564
25565
25566 for {
25567 x := v_0
25568 if v_1.Op != OpNeg64 {
25569 break
25570 }
25571 v_1_0 := v_1.Args[0]
25572 if v_1_0.Op != OpAnd64 {
25573 break
25574 }
25575 _ = v_1_0.Args[1]
25576 v_1_0_0 := v_1_0.Args[0]
25577 v_1_0_1 := v_1_0.Args[1]
25578 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25579 y := v_1_0_0
25580 if v_1_0_1.Op != OpConst64 {
25581 continue
25582 }
25583 c := auxIntToInt64(v_1_0_1.AuxInt)
25584 if !(c&15 == 15) {
25585 continue
25586 }
25587 v.reset(OpRotateLeft16)
25588 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
25589 v0.AddArg(y)
25590 v.AddArg2(x, v0)
25591 return true
25592 }
25593 break
25594 }
25595
25596
25597
25598 for {
25599 x := v_0
25600 if v_1.Op != OpNeg32 {
25601 break
25602 }
25603 v_1_0 := v_1.Args[0]
25604 if v_1_0.Op != OpAnd32 {
25605 break
25606 }
25607 _ = v_1_0.Args[1]
25608 v_1_0_0 := v_1_0.Args[0]
25609 v_1_0_1 := v_1_0.Args[1]
25610 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25611 y := v_1_0_0
25612 if v_1_0_1.Op != OpConst32 {
25613 continue
25614 }
25615 c := auxIntToInt32(v_1_0_1.AuxInt)
25616 if !(c&15 == 15) {
25617 continue
25618 }
25619 v.reset(OpRotateLeft16)
25620 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
25621 v0.AddArg(y)
25622 v.AddArg2(x, v0)
25623 return true
25624 }
25625 break
25626 }
25627
25628
25629
25630 for {
25631 x := v_0
25632 if v_1.Op != OpNeg16 {
25633 break
25634 }
25635 v_1_0 := v_1.Args[0]
25636 if v_1_0.Op != OpAnd16 {
25637 break
25638 }
25639 _ = v_1_0.Args[1]
25640 v_1_0_0 := v_1_0.Args[0]
25641 v_1_0_1 := v_1_0.Args[1]
25642 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25643 y := v_1_0_0
25644 if v_1_0_1.Op != OpConst16 {
25645 continue
25646 }
25647 c := auxIntToInt16(v_1_0_1.AuxInt)
25648 if !(c&15 == 15) {
25649 continue
25650 }
25651 v.reset(OpRotateLeft16)
25652 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
25653 v0.AddArg(y)
25654 v.AddArg2(x, v0)
25655 return true
25656 }
25657 break
25658 }
25659
25660
25661
25662 for {
25663 x := v_0
25664 if v_1.Op != OpNeg8 {
25665 break
25666 }
25667 v_1_0 := v_1.Args[0]
25668 if v_1_0.Op != OpAnd8 {
25669 break
25670 }
25671 _ = v_1_0.Args[1]
25672 v_1_0_0 := v_1_0.Args[0]
25673 v_1_0_1 := v_1_0.Args[1]
25674 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25675 y := v_1_0_0
25676 if v_1_0_1.Op != OpConst8 {
25677 continue
25678 }
25679 c := auxIntToInt8(v_1_0_1.AuxInt)
25680 if !(c&15 == 15) {
25681 continue
25682 }
25683 v.reset(OpRotateLeft16)
25684 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
25685 v0.AddArg(y)
25686 v.AddArg2(x, v0)
25687 return true
25688 }
25689 break
25690 }
25691
25692
25693
25694 for {
25695 x := v_0
25696 if v_1.Op != OpAdd64 {
25697 break
25698 }
25699 _ = v_1.Args[1]
25700 v_1_0 := v_1.Args[0]
25701 v_1_1 := v_1.Args[1]
25702 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25703 y := v_1_0
25704 if v_1_1.Op != OpConst64 {
25705 continue
25706 }
25707 c := auxIntToInt64(v_1_1.AuxInt)
25708 if !(c&15 == 0) {
25709 continue
25710 }
25711 v.reset(OpRotateLeft16)
25712 v.AddArg2(x, y)
25713 return true
25714 }
25715 break
25716 }
25717
25718
25719
25720 for {
25721 x := v_0
25722 if v_1.Op != OpAdd32 {
25723 break
25724 }
25725 _ = v_1.Args[1]
25726 v_1_0 := v_1.Args[0]
25727 v_1_1 := v_1.Args[1]
25728 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25729 y := v_1_0
25730 if v_1_1.Op != OpConst32 {
25731 continue
25732 }
25733 c := auxIntToInt32(v_1_1.AuxInt)
25734 if !(c&15 == 0) {
25735 continue
25736 }
25737 v.reset(OpRotateLeft16)
25738 v.AddArg2(x, y)
25739 return true
25740 }
25741 break
25742 }
25743
25744
25745
25746 for {
25747 x := v_0
25748 if v_1.Op != OpAdd16 {
25749 break
25750 }
25751 _ = v_1.Args[1]
25752 v_1_0 := v_1.Args[0]
25753 v_1_1 := v_1.Args[1]
25754 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25755 y := v_1_0
25756 if v_1_1.Op != OpConst16 {
25757 continue
25758 }
25759 c := auxIntToInt16(v_1_1.AuxInt)
25760 if !(c&15 == 0) {
25761 continue
25762 }
25763 v.reset(OpRotateLeft16)
25764 v.AddArg2(x, y)
25765 return true
25766 }
25767 break
25768 }
25769
25770
25771
25772 for {
25773 x := v_0
25774 if v_1.Op != OpAdd8 {
25775 break
25776 }
25777 _ = v_1.Args[1]
25778 v_1_0 := v_1.Args[0]
25779 v_1_1 := v_1.Args[1]
25780 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25781 y := v_1_0
25782 if v_1_1.Op != OpConst8 {
25783 continue
25784 }
25785 c := auxIntToInt8(v_1_1.AuxInt)
25786 if !(c&15 == 0) {
25787 continue
25788 }
25789 v.reset(OpRotateLeft16)
25790 v.AddArg2(x, y)
25791 return true
25792 }
25793 break
25794 }
25795
25796
25797
25798 for {
25799 x := v_0
25800 if v_1.Op != OpSub64 {
25801 break
25802 }
25803 y := v_1.Args[1]
25804 v_1_0 := v_1.Args[0]
25805 if v_1_0.Op != OpConst64 {
25806 break
25807 }
25808 c := auxIntToInt64(v_1_0.AuxInt)
25809 if !(c&15 == 0) {
25810 break
25811 }
25812 v.reset(OpRotateLeft16)
25813 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
25814 v0.AddArg(y)
25815 v.AddArg2(x, v0)
25816 return true
25817 }
25818
25819
25820
25821 for {
25822 x := v_0
25823 if v_1.Op != OpSub32 {
25824 break
25825 }
25826 y := v_1.Args[1]
25827 v_1_0 := v_1.Args[0]
25828 if v_1_0.Op != OpConst32 {
25829 break
25830 }
25831 c := auxIntToInt32(v_1_0.AuxInt)
25832 if !(c&15 == 0) {
25833 break
25834 }
25835 v.reset(OpRotateLeft16)
25836 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
25837 v0.AddArg(y)
25838 v.AddArg2(x, v0)
25839 return true
25840 }
25841
25842
25843
25844 for {
25845 x := v_0
25846 if v_1.Op != OpSub16 {
25847 break
25848 }
25849 y := v_1.Args[1]
25850 v_1_0 := v_1.Args[0]
25851 if v_1_0.Op != OpConst16 {
25852 break
25853 }
25854 c := auxIntToInt16(v_1_0.AuxInt)
25855 if !(c&15 == 0) {
25856 break
25857 }
25858 v.reset(OpRotateLeft16)
25859 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
25860 v0.AddArg(y)
25861 v.AddArg2(x, v0)
25862 return true
25863 }
25864
25865
25866
25867 for {
25868 x := v_0
25869 if v_1.Op != OpSub8 {
25870 break
25871 }
25872 y := v_1.Args[1]
25873 v_1_0 := v_1.Args[0]
25874 if v_1_0.Op != OpConst8 {
25875 break
25876 }
25877 c := auxIntToInt8(v_1_0.AuxInt)
25878 if !(c&15 == 0) {
25879 break
25880 }
25881 v.reset(OpRotateLeft16)
25882 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
25883 v0.AddArg(y)
25884 v.AddArg2(x, v0)
25885 return true
25886 }
25887
25888
25889
25890 for {
25891 x := v_0
25892 if v_1.Op != OpConst64 {
25893 break
25894 }
25895 t := v_1.Type
25896 c := auxIntToInt64(v_1.AuxInt)
25897 if !(config.PtrSize == 4) {
25898 break
25899 }
25900 v.reset(OpRotateLeft16)
25901 v0 := b.NewValue0(v.Pos, OpConst32, t)
25902 v0.AuxInt = int32ToAuxInt(int32(c))
25903 v.AddArg2(x, v0)
25904 return true
25905 }
25906
25907
25908
25909 for {
25910 if v_0.Op != OpRotateLeft16 {
25911 break
25912 }
25913 c := v_0.Args[1]
25914 x := v_0.Args[0]
25915 d := v_1
25916 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
25917 break
25918 }
25919 v.reset(OpRotateLeft16)
25920 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
25921 v0.AddArg2(c, d)
25922 v.AddArg2(x, v0)
25923 return true
25924 }
25925
25926
25927
25928 for {
25929 if v_0.Op != OpRotateLeft16 {
25930 break
25931 }
25932 c := v_0.Args[1]
25933 x := v_0.Args[0]
25934 d := v_1
25935 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
25936 break
25937 }
25938 v.reset(OpRotateLeft16)
25939 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
25940 v0.AddArg2(c, d)
25941 v.AddArg2(x, v0)
25942 return true
25943 }
25944
25945
25946
25947 for {
25948 if v_0.Op != OpRotateLeft16 {
25949 break
25950 }
25951 c := v_0.Args[1]
25952 x := v_0.Args[0]
25953 d := v_1
25954 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
25955 break
25956 }
25957 v.reset(OpRotateLeft16)
25958 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
25959 v0.AddArg2(c, d)
25960 v.AddArg2(x, v0)
25961 return true
25962 }
25963
25964
25965
25966 for {
25967 if v_0.Op != OpRotateLeft16 {
25968 break
25969 }
25970 c := v_0.Args[1]
25971 x := v_0.Args[0]
25972 d := v_1
25973 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
25974 break
25975 }
25976 v.reset(OpRotateLeft16)
25977 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
25978 v0.AddArg2(c, d)
25979 v.AddArg2(x, v0)
25980 return true
25981 }
25982 return false
25983 }
25984 func rewriteValuegeneric_OpRotateLeft32(v *Value) bool {
25985 v_1 := v.Args[1]
25986 v_0 := v.Args[0]
25987 b := v.Block
25988 config := b.Func.Config
25989
25990
25991
25992 for {
25993 x := v_0
25994 if v_1.Op != OpConst32 {
25995 break
25996 }
25997 c := auxIntToInt32(v_1.AuxInt)
25998 if !(c%32 == 0) {
25999 break
26000 }
26001 v.copyOf(x)
26002 return true
26003 }
26004
26005
26006
26007 for {
26008 x := v_0
26009 if v_1.Op != OpAnd64 {
26010 break
26011 }
26012 _ = v_1.Args[1]
26013 v_1_0 := v_1.Args[0]
26014 v_1_1 := v_1.Args[1]
26015 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26016 y := v_1_0
26017 if v_1_1.Op != OpConst64 {
26018 continue
26019 }
26020 c := auxIntToInt64(v_1_1.AuxInt)
26021 if !(c&31 == 31) {
26022 continue
26023 }
26024 v.reset(OpRotateLeft32)
26025 v.AddArg2(x, y)
26026 return true
26027 }
26028 break
26029 }
26030
26031
26032
26033 for {
26034 x := v_0
26035 if v_1.Op != OpAnd32 {
26036 break
26037 }
26038 _ = v_1.Args[1]
26039 v_1_0 := v_1.Args[0]
26040 v_1_1 := v_1.Args[1]
26041 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26042 y := v_1_0
26043 if v_1_1.Op != OpConst32 {
26044 continue
26045 }
26046 c := auxIntToInt32(v_1_1.AuxInt)
26047 if !(c&31 == 31) {
26048 continue
26049 }
26050 v.reset(OpRotateLeft32)
26051 v.AddArg2(x, y)
26052 return true
26053 }
26054 break
26055 }
26056
26057
26058
26059 for {
26060 x := v_0
26061 if v_1.Op != OpAnd16 {
26062 break
26063 }
26064 _ = v_1.Args[1]
26065 v_1_0 := v_1.Args[0]
26066 v_1_1 := v_1.Args[1]
26067 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26068 y := v_1_0
26069 if v_1_1.Op != OpConst16 {
26070 continue
26071 }
26072 c := auxIntToInt16(v_1_1.AuxInt)
26073 if !(c&31 == 31) {
26074 continue
26075 }
26076 v.reset(OpRotateLeft32)
26077 v.AddArg2(x, y)
26078 return true
26079 }
26080 break
26081 }
26082
26083
26084
26085 for {
26086 x := v_0
26087 if v_1.Op != OpAnd8 {
26088 break
26089 }
26090 _ = v_1.Args[1]
26091 v_1_0 := v_1.Args[0]
26092 v_1_1 := v_1.Args[1]
26093 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26094 y := v_1_0
26095 if v_1_1.Op != OpConst8 {
26096 continue
26097 }
26098 c := auxIntToInt8(v_1_1.AuxInt)
26099 if !(c&31 == 31) {
26100 continue
26101 }
26102 v.reset(OpRotateLeft32)
26103 v.AddArg2(x, y)
26104 return true
26105 }
26106 break
26107 }
26108
26109
26110
26111 for {
26112 x := v_0
26113 if v_1.Op != OpNeg64 {
26114 break
26115 }
26116 v_1_0 := v_1.Args[0]
26117 if v_1_0.Op != OpAnd64 {
26118 break
26119 }
26120 _ = v_1_0.Args[1]
26121 v_1_0_0 := v_1_0.Args[0]
26122 v_1_0_1 := v_1_0.Args[1]
26123 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26124 y := v_1_0_0
26125 if v_1_0_1.Op != OpConst64 {
26126 continue
26127 }
26128 c := auxIntToInt64(v_1_0_1.AuxInt)
26129 if !(c&31 == 31) {
26130 continue
26131 }
26132 v.reset(OpRotateLeft32)
26133 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26134 v0.AddArg(y)
26135 v.AddArg2(x, v0)
26136 return true
26137 }
26138 break
26139 }
26140
26141
26142
26143 for {
26144 x := v_0
26145 if v_1.Op != OpNeg32 {
26146 break
26147 }
26148 v_1_0 := v_1.Args[0]
26149 if v_1_0.Op != OpAnd32 {
26150 break
26151 }
26152 _ = v_1_0.Args[1]
26153 v_1_0_0 := v_1_0.Args[0]
26154 v_1_0_1 := v_1_0.Args[1]
26155 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26156 y := v_1_0_0
26157 if v_1_0_1.Op != OpConst32 {
26158 continue
26159 }
26160 c := auxIntToInt32(v_1_0_1.AuxInt)
26161 if !(c&31 == 31) {
26162 continue
26163 }
26164 v.reset(OpRotateLeft32)
26165 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26166 v0.AddArg(y)
26167 v.AddArg2(x, v0)
26168 return true
26169 }
26170 break
26171 }
26172
26173
26174
26175 for {
26176 x := v_0
26177 if v_1.Op != OpNeg16 {
26178 break
26179 }
26180 v_1_0 := v_1.Args[0]
26181 if v_1_0.Op != OpAnd16 {
26182 break
26183 }
26184 _ = v_1_0.Args[1]
26185 v_1_0_0 := v_1_0.Args[0]
26186 v_1_0_1 := v_1_0.Args[1]
26187 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26188 y := v_1_0_0
26189 if v_1_0_1.Op != OpConst16 {
26190 continue
26191 }
26192 c := auxIntToInt16(v_1_0_1.AuxInt)
26193 if !(c&31 == 31) {
26194 continue
26195 }
26196 v.reset(OpRotateLeft32)
26197 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
26198 v0.AddArg(y)
26199 v.AddArg2(x, v0)
26200 return true
26201 }
26202 break
26203 }
26204
26205
26206
26207 for {
26208 x := v_0
26209 if v_1.Op != OpNeg8 {
26210 break
26211 }
26212 v_1_0 := v_1.Args[0]
26213 if v_1_0.Op != OpAnd8 {
26214 break
26215 }
26216 _ = v_1_0.Args[1]
26217 v_1_0_0 := v_1_0.Args[0]
26218 v_1_0_1 := v_1_0.Args[1]
26219 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26220 y := v_1_0_0
26221 if v_1_0_1.Op != OpConst8 {
26222 continue
26223 }
26224 c := auxIntToInt8(v_1_0_1.AuxInt)
26225 if !(c&31 == 31) {
26226 continue
26227 }
26228 v.reset(OpRotateLeft32)
26229 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
26230 v0.AddArg(y)
26231 v.AddArg2(x, v0)
26232 return true
26233 }
26234 break
26235 }
26236
26237
26238
26239 for {
26240 x := v_0
26241 if v_1.Op != OpAdd64 {
26242 break
26243 }
26244 _ = v_1.Args[1]
26245 v_1_0 := v_1.Args[0]
26246 v_1_1 := v_1.Args[1]
26247 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26248 y := v_1_0
26249 if v_1_1.Op != OpConst64 {
26250 continue
26251 }
26252 c := auxIntToInt64(v_1_1.AuxInt)
26253 if !(c&31 == 0) {
26254 continue
26255 }
26256 v.reset(OpRotateLeft32)
26257 v.AddArg2(x, y)
26258 return true
26259 }
26260 break
26261 }
26262
26263
26264
26265 for {
26266 x := v_0
26267 if v_1.Op != OpAdd32 {
26268 break
26269 }
26270 _ = v_1.Args[1]
26271 v_1_0 := v_1.Args[0]
26272 v_1_1 := v_1.Args[1]
26273 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26274 y := v_1_0
26275 if v_1_1.Op != OpConst32 {
26276 continue
26277 }
26278 c := auxIntToInt32(v_1_1.AuxInt)
26279 if !(c&31 == 0) {
26280 continue
26281 }
26282 v.reset(OpRotateLeft32)
26283 v.AddArg2(x, y)
26284 return true
26285 }
26286 break
26287 }
26288
26289
26290
26291 for {
26292 x := v_0
26293 if v_1.Op != OpAdd16 {
26294 break
26295 }
26296 _ = v_1.Args[1]
26297 v_1_0 := v_1.Args[0]
26298 v_1_1 := v_1.Args[1]
26299 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26300 y := v_1_0
26301 if v_1_1.Op != OpConst16 {
26302 continue
26303 }
26304 c := auxIntToInt16(v_1_1.AuxInt)
26305 if !(c&31 == 0) {
26306 continue
26307 }
26308 v.reset(OpRotateLeft32)
26309 v.AddArg2(x, y)
26310 return true
26311 }
26312 break
26313 }
26314
26315
26316
26317 for {
26318 x := v_0
26319 if v_1.Op != OpAdd8 {
26320 break
26321 }
26322 _ = v_1.Args[1]
26323 v_1_0 := v_1.Args[0]
26324 v_1_1 := v_1.Args[1]
26325 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26326 y := v_1_0
26327 if v_1_1.Op != OpConst8 {
26328 continue
26329 }
26330 c := auxIntToInt8(v_1_1.AuxInt)
26331 if !(c&31 == 0) {
26332 continue
26333 }
26334 v.reset(OpRotateLeft32)
26335 v.AddArg2(x, y)
26336 return true
26337 }
26338 break
26339 }
26340
26341
26342
26343 for {
26344 x := v_0
26345 if v_1.Op != OpSub64 {
26346 break
26347 }
26348 y := v_1.Args[1]
26349 v_1_0 := v_1.Args[0]
26350 if v_1_0.Op != OpConst64 {
26351 break
26352 }
26353 c := auxIntToInt64(v_1_0.AuxInt)
26354 if !(c&31 == 0) {
26355 break
26356 }
26357 v.reset(OpRotateLeft32)
26358 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26359 v0.AddArg(y)
26360 v.AddArg2(x, v0)
26361 return true
26362 }
26363
26364
26365
26366 for {
26367 x := v_0
26368 if v_1.Op != OpSub32 {
26369 break
26370 }
26371 y := v_1.Args[1]
26372 v_1_0 := v_1.Args[0]
26373 if v_1_0.Op != OpConst32 {
26374 break
26375 }
26376 c := auxIntToInt32(v_1_0.AuxInt)
26377 if !(c&31 == 0) {
26378 break
26379 }
26380 v.reset(OpRotateLeft32)
26381 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26382 v0.AddArg(y)
26383 v.AddArg2(x, v0)
26384 return true
26385 }
26386
26387
26388
26389 for {
26390 x := v_0
26391 if v_1.Op != OpSub16 {
26392 break
26393 }
26394 y := v_1.Args[1]
26395 v_1_0 := v_1.Args[0]
26396 if v_1_0.Op != OpConst16 {
26397 break
26398 }
26399 c := auxIntToInt16(v_1_0.AuxInt)
26400 if !(c&31 == 0) {
26401 break
26402 }
26403 v.reset(OpRotateLeft32)
26404 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
26405 v0.AddArg(y)
26406 v.AddArg2(x, v0)
26407 return true
26408 }
26409
26410
26411
26412 for {
26413 x := v_0
26414 if v_1.Op != OpSub8 {
26415 break
26416 }
26417 y := v_1.Args[1]
26418 v_1_0 := v_1.Args[0]
26419 if v_1_0.Op != OpConst8 {
26420 break
26421 }
26422 c := auxIntToInt8(v_1_0.AuxInt)
26423 if !(c&31 == 0) {
26424 break
26425 }
26426 v.reset(OpRotateLeft32)
26427 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
26428 v0.AddArg(y)
26429 v.AddArg2(x, v0)
26430 return true
26431 }
26432
26433
26434
26435 for {
26436 x := v_0
26437 if v_1.Op != OpConst64 {
26438 break
26439 }
26440 t := v_1.Type
26441 c := auxIntToInt64(v_1.AuxInt)
26442 if !(config.PtrSize == 4) {
26443 break
26444 }
26445 v.reset(OpRotateLeft32)
26446 v0 := b.NewValue0(v.Pos, OpConst32, t)
26447 v0.AuxInt = int32ToAuxInt(int32(c))
26448 v.AddArg2(x, v0)
26449 return true
26450 }
26451
26452
26453
26454 for {
26455 if v_0.Op != OpRotateLeft32 {
26456 break
26457 }
26458 c := v_0.Args[1]
26459 x := v_0.Args[0]
26460 d := v_1
26461 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
26462 break
26463 }
26464 v.reset(OpRotateLeft32)
26465 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
26466 v0.AddArg2(c, d)
26467 v.AddArg2(x, v0)
26468 return true
26469 }
26470
26471
26472
26473 for {
26474 if v_0.Op != OpRotateLeft32 {
26475 break
26476 }
26477 c := v_0.Args[1]
26478 x := v_0.Args[0]
26479 d := v_1
26480 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
26481 break
26482 }
26483 v.reset(OpRotateLeft32)
26484 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
26485 v0.AddArg2(c, d)
26486 v.AddArg2(x, v0)
26487 return true
26488 }
26489
26490
26491
26492 for {
26493 if v_0.Op != OpRotateLeft32 {
26494 break
26495 }
26496 c := v_0.Args[1]
26497 x := v_0.Args[0]
26498 d := v_1
26499 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
26500 break
26501 }
26502 v.reset(OpRotateLeft32)
26503 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
26504 v0.AddArg2(c, d)
26505 v.AddArg2(x, v0)
26506 return true
26507 }
26508
26509
26510
26511 for {
26512 if v_0.Op != OpRotateLeft32 {
26513 break
26514 }
26515 c := v_0.Args[1]
26516 x := v_0.Args[0]
26517 d := v_1
26518 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
26519 break
26520 }
26521 v.reset(OpRotateLeft32)
26522 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
26523 v0.AddArg2(c, d)
26524 v.AddArg2(x, v0)
26525 return true
26526 }
26527 return false
26528 }
26529 func rewriteValuegeneric_OpRotateLeft64(v *Value) bool {
26530 v_1 := v.Args[1]
26531 v_0 := v.Args[0]
26532 b := v.Block
26533 config := b.Func.Config
26534
26535
26536
26537 for {
26538 x := v_0
26539 if v_1.Op != OpConst64 {
26540 break
26541 }
26542 c := auxIntToInt64(v_1.AuxInt)
26543 if !(c%64 == 0) {
26544 break
26545 }
26546 v.copyOf(x)
26547 return true
26548 }
26549
26550
26551
26552 for {
26553 x := v_0
26554 if v_1.Op != OpAnd64 {
26555 break
26556 }
26557 _ = v_1.Args[1]
26558 v_1_0 := v_1.Args[0]
26559 v_1_1 := v_1.Args[1]
26560 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26561 y := v_1_0
26562 if v_1_1.Op != OpConst64 {
26563 continue
26564 }
26565 c := auxIntToInt64(v_1_1.AuxInt)
26566 if !(c&63 == 63) {
26567 continue
26568 }
26569 v.reset(OpRotateLeft64)
26570 v.AddArg2(x, y)
26571 return true
26572 }
26573 break
26574 }
26575
26576
26577
26578 for {
26579 x := v_0
26580 if v_1.Op != OpAnd32 {
26581 break
26582 }
26583 _ = v_1.Args[1]
26584 v_1_0 := v_1.Args[0]
26585 v_1_1 := v_1.Args[1]
26586 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26587 y := v_1_0
26588 if v_1_1.Op != OpConst32 {
26589 continue
26590 }
26591 c := auxIntToInt32(v_1_1.AuxInt)
26592 if !(c&63 == 63) {
26593 continue
26594 }
26595 v.reset(OpRotateLeft64)
26596 v.AddArg2(x, y)
26597 return true
26598 }
26599 break
26600 }
26601
26602
26603
26604 for {
26605 x := v_0
26606 if v_1.Op != OpAnd16 {
26607 break
26608 }
26609 _ = v_1.Args[1]
26610 v_1_0 := v_1.Args[0]
26611 v_1_1 := v_1.Args[1]
26612 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26613 y := v_1_0
26614 if v_1_1.Op != OpConst16 {
26615 continue
26616 }
26617 c := auxIntToInt16(v_1_1.AuxInt)
26618 if !(c&63 == 63) {
26619 continue
26620 }
26621 v.reset(OpRotateLeft64)
26622 v.AddArg2(x, y)
26623 return true
26624 }
26625 break
26626 }
26627
26628
26629
26630 for {
26631 x := v_0
26632 if v_1.Op != OpAnd8 {
26633 break
26634 }
26635 _ = v_1.Args[1]
26636 v_1_0 := v_1.Args[0]
26637 v_1_1 := v_1.Args[1]
26638 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26639 y := v_1_0
26640 if v_1_1.Op != OpConst8 {
26641 continue
26642 }
26643 c := auxIntToInt8(v_1_1.AuxInt)
26644 if !(c&63 == 63) {
26645 continue
26646 }
26647 v.reset(OpRotateLeft64)
26648 v.AddArg2(x, y)
26649 return true
26650 }
26651 break
26652 }
26653
26654
26655
26656 for {
26657 x := v_0
26658 if v_1.Op != OpNeg64 {
26659 break
26660 }
26661 v_1_0 := v_1.Args[0]
26662 if v_1_0.Op != OpAnd64 {
26663 break
26664 }
26665 _ = v_1_0.Args[1]
26666 v_1_0_0 := v_1_0.Args[0]
26667 v_1_0_1 := v_1_0.Args[1]
26668 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26669 y := v_1_0_0
26670 if v_1_0_1.Op != OpConst64 {
26671 continue
26672 }
26673 c := auxIntToInt64(v_1_0_1.AuxInt)
26674 if !(c&63 == 63) {
26675 continue
26676 }
26677 v.reset(OpRotateLeft64)
26678 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26679 v0.AddArg(y)
26680 v.AddArg2(x, v0)
26681 return true
26682 }
26683 break
26684 }
26685
26686
26687
26688 for {
26689 x := v_0
26690 if v_1.Op != OpNeg32 {
26691 break
26692 }
26693 v_1_0 := v_1.Args[0]
26694 if v_1_0.Op != OpAnd32 {
26695 break
26696 }
26697 _ = v_1_0.Args[1]
26698 v_1_0_0 := v_1_0.Args[0]
26699 v_1_0_1 := v_1_0.Args[1]
26700 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26701 y := v_1_0_0
26702 if v_1_0_1.Op != OpConst32 {
26703 continue
26704 }
26705 c := auxIntToInt32(v_1_0_1.AuxInt)
26706 if !(c&63 == 63) {
26707 continue
26708 }
26709 v.reset(OpRotateLeft64)
26710 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26711 v0.AddArg(y)
26712 v.AddArg2(x, v0)
26713 return true
26714 }
26715 break
26716 }
26717
26718
26719
26720 for {
26721 x := v_0
26722 if v_1.Op != OpNeg16 {
26723 break
26724 }
26725 v_1_0 := v_1.Args[0]
26726 if v_1_0.Op != OpAnd16 {
26727 break
26728 }
26729 _ = v_1_0.Args[1]
26730 v_1_0_0 := v_1_0.Args[0]
26731 v_1_0_1 := v_1_0.Args[1]
26732 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26733 y := v_1_0_0
26734 if v_1_0_1.Op != OpConst16 {
26735 continue
26736 }
26737 c := auxIntToInt16(v_1_0_1.AuxInt)
26738 if !(c&63 == 63) {
26739 continue
26740 }
26741 v.reset(OpRotateLeft64)
26742 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
26743 v0.AddArg(y)
26744 v.AddArg2(x, v0)
26745 return true
26746 }
26747 break
26748 }
26749
26750
26751
26752 for {
26753 x := v_0
26754 if v_1.Op != OpNeg8 {
26755 break
26756 }
26757 v_1_0 := v_1.Args[0]
26758 if v_1_0.Op != OpAnd8 {
26759 break
26760 }
26761 _ = v_1_0.Args[1]
26762 v_1_0_0 := v_1_0.Args[0]
26763 v_1_0_1 := v_1_0.Args[1]
26764 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26765 y := v_1_0_0
26766 if v_1_0_1.Op != OpConst8 {
26767 continue
26768 }
26769 c := auxIntToInt8(v_1_0_1.AuxInt)
26770 if !(c&63 == 63) {
26771 continue
26772 }
26773 v.reset(OpRotateLeft64)
26774 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
26775 v0.AddArg(y)
26776 v.AddArg2(x, v0)
26777 return true
26778 }
26779 break
26780 }
26781
26782
26783
26784 for {
26785 x := v_0
26786 if v_1.Op != OpAdd64 {
26787 break
26788 }
26789 _ = v_1.Args[1]
26790 v_1_0 := v_1.Args[0]
26791 v_1_1 := v_1.Args[1]
26792 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26793 y := v_1_0
26794 if v_1_1.Op != OpConst64 {
26795 continue
26796 }
26797 c := auxIntToInt64(v_1_1.AuxInt)
26798 if !(c&63 == 0) {
26799 continue
26800 }
26801 v.reset(OpRotateLeft64)
26802 v.AddArg2(x, y)
26803 return true
26804 }
26805 break
26806 }
26807
26808
26809
26810 for {
26811 x := v_0
26812 if v_1.Op != OpAdd32 {
26813 break
26814 }
26815 _ = v_1.Args[1]
26816 v_1_0 := v_1.Args[0]
26817 v_1_1 := v_1.Args[1]
26818 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26819 y := v_1_0
26820 if v_1_1.Op != OpConst32 {
26821 continue
26822 }
26823 c := auxIntToInt32(v_1_1.AuxInt)
26824 if !(c&63 == 0) {
26825 continue
26826 }
26827 v.reset(OpRotateLeft64)
26828 v.AddArg2(x, y)
26829 return true
26830 }
26831 break
26832 }
26833
26834
26835
26836 for {
26837 x := v_0
26838 if v_1.Op != OpAdd16 {
26839 break
26840 }
26841 _ = v_1.Args[1]
26842 v_1_0 := v_1.Args[0]
26843 v_1_1 := v_1.Args[1]
26844 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26845 y := v_1_0
26846 if v_1_1.Op != OpConst16 {
26847 continue
26848 }
26849 c := auxIntToInt16(v_1_1.AuxInt)
26850 if !(c&63 == 0) {
26851 continue
26852 }
26853 v.reset(OpRotateLeft64)
26854 v.AddArg2(x, y)
26855 return true
26856 }
26857 break
26858 }
26859
26860
26861
26862 for {
26863 x := v_0
26864 if v_1.Op != OpAdd8 {
26865 break
26866 }
26867 _ = v_1.Args[1]
26868 v_1_0 := v_1.Args[0]
26869 v_1_1 := v_1.Args[1]
26870 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26871 y := v_1_0
26872 if v_1_1.Op != OpConst8 {
26873 continue
26874 }
26875 c := auxIntToInt8(v_1_1.AuxInt)
26876 if !(c&63 == 0) {
26877 continue
26878 }
26879 v.reset(OpRotateLeft64)
26880 v.AddArg2(x, y)
26881 return true
26882 }
26883 break
26884 }
26885
26886
26887
26888 for {
26889 x := v_0
26890 if v_1.Op != OpSub64 {
26891 break
26892 }
26893 y := v_1.Args[1]
26894 v_1_0 := v_1.Args[0]
26895 if v_1_0.Op != OpConst64 {
26896 break
26897 }
26898 c := auxIntToInt64(v_1_0.AuxInt)
26899 if !(c&63 == 0) {
26900 break
26901 }
26902 v.reset(OpRotateLeft64)
26903 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26904 v0.AddArg(y)
26905 v.AddArg2(x, v0)
26906 return true
26907 }
26908
26909
26910
26911 for {
26912 x := v_0
26913 if v_1.Op != OpSub32 {
26914 break
26915 }
26916 y := v_1.Args[1]
26917 v_1_0 := v_1.Args[0]
26918 if v_1_0.Op != OpConst32 {
26919 break
26920 }
26921 c := auxIntToInt32(v_1_0.AuxInt)
26922 if !(c&63 == 0) {
26923 break
26924 }
26925 v.reset(OpRotateLeft64)
26926 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26927 v0.AddArg(y)
26928 v.AddArg2(x, v0)
26929 return true
26930 }
26931
26932
26933
26934 for {
26935 x := v_0
26936 if v_1.Op != OpSub16 {
26937 break
26938 }
26939 y := v_1.Args[1]
26940 v_1_0 := v_1.Args[0]
26941 if v_1_0.Op != OpConst16 {
26942 break
26943 }
26944 c := auxIntToInt16(v_1_0.AuxInt)
26945 if !(c&63 == 0) {
26946 break
26947 }
26948 v.reset(OpRotateLeft64)
26949 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
26950 v0.AddArg(y)
26951 v.AddArg2(x, v0)
26952 return true
26953 }
26954
26955
26956
26957 for {
26958 x := v_0
26959 if v_1.Op != OpSub8 {
26960 break
26961 }
26962 y := v_1.Args[1]
26963 v_1_0 := v_1.Args[0]
26964 if v_1_0.Op != OpConst8 {
26965 break
26966 }
26967 c := auxIntToInt8(v_1_0.AuxInt)
26968 if !(c&63 == 0) {
26969 break
26970 }
26971 v.reset(OpRotateLeft64)
26972 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
26973 v0.AddArg(y)
26974 v.AddArg2(x, v0)
26975 return true
26976 }
26977
26978
26979
26980 for {
26981 x := v_0
26982 if v_1.Op != OpConst64 {
26983 break
26984 }
26985 t := v_1.Type
26986 c := auxIntToInt64(v_1.AuxInt)
26987 if !(config.PtrSize == 4) {
26988 break
26989 }
26990 v.reset(OpRotateLeft64)
26991 v0 := b.NewValue0(v.Pos, OpConst32, t)
26992 v0.AuxInt = int32ToAuxInt(int32(c))
26993 v.AddArg2(x, v0)
26994 return true
26995 }
26996
26997
26998
26999 for {
27000 if v_0.Op != OpRotateLeft64 {
27001 break
27002 }
27003 c := v_0.Args[1]
27004 x := v_0.Args[0]
27005 d := v_1
27006 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
27007 break
27008 }
27009 v.reset(OpRotateLeft64)
27010 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
27011 v0.AddArg2(c, d)
27012 v.AddArg2(x, v0)
27013 return true
27014 }
27015
27016
27017
27018 for {
27019 if v_0.Op != OpRotateLeft64 {
27020 break
27021 }
27022 c := v_0.Args[1]
27023 x := v_0.Args[0]
27024 d := v_1
27025 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
27026 break
27027 }
27028 v.reset(OpRotateLeft64)
27029 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
27030 v0.AddArg2(c, d)
27031 v.AddArg2(x, v0)
27032 return true
27033 }
27034
27035
27036
27037 for {
27038 if v_0.Op != OpRotateLeft64 {
27039 break
27040 }
27041 c := v_0.Args[1]
27042 x := v_0.Args[0]
27043 d := v_1
27044 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
27045 break
27046 }
27047 v.reset(OpRotateLeft64)
27048 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
27049 v0.AddArg2(c, d)
27050 v.AddArg2(x, v0)
27051 return true
27052 }
27053
27054
27055
27056 for {
27057 if v_0.Op != OpRotateLeft64 {
27058 break
27059 }
27060 c := v_0.Args[1]
27061 x := v_0.Args[0]
27062 d := v_1
27063 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
27064 break
27065 }
27066 v.reset(OpRotateLeft64)
27067 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
27068 v0.AddArg2(c, d)
27069 v.AddArg2(x, v0)
27070 return true
27071 }
27072 return false
27073 }
27074 func rewriteValuegeneric_OpRotateLeft8(v *Value) bool {
27075 v_1 := v.Args[1]
27076 v_0 := v.Args[0]
27077 b := v.Block
27078 config := b.Func.Config
27079
27080
27081
27082 for {
27083 x := v_0
27084 if v_1.Op != OpConst8 {
27085 break
27086 }
27087 c := auxIntToInt8(v_1.AuxInt)
27088 if !(c%8 == 0) {
27089 break
27090 }
27091 v.copyOf(x)
27092 return true
27093 }
27094
27095
27096
27097 for {
27098 x := v_0
27099 if v_1.Op != OpAnd64 {
27100 break
27101 }
27102 _ = v_1.Args[1]
27103 v_1_0 := v_1.Args[0]
27104 v_1_1 := v_1.Args[1]
27105 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27106 y := v_1_0
27107 if v_1_1.Op != OpConst64 {
27108 continue
27109 }
27110 c := auxIntToInt64(v_1_1.AuxInt)
27111 if !(c&7 == 7) {
27112 continue
27113 }
27114 v.reset(OpRotateLeft8)
27115 v.AddArg2(x, y)
27116 return true
27117 }
27118 break
27119 }
27120
27121
27122
27123 for {
27124 x := v_0
27125 if v_1.Op != OpAnd32 {
27126 break
27127 }
27128 _ = v_1.Args[1]
27129 v_1_0 := v_1.Args[0]
27130 v_1_1 := v_1.Args[1]
27131 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27132 y := v_1_0
27133 if v_1_1.Op != OpConst32 {
27134 continue
27135 }
27136 c := auxIntToInt32(v_1_1.AuxInt)
27137 if !(c&7 == 7) {
27138 continue
27139 }
27140 v.reset(OpRotateLeft8)
27141 v.AddArg2(x, y)
27142 return true
27143 }
27144 break
27145 }
27146
27147
27148
27149 for {
27150 x := v_0
27151 if v_1.Op != OpAnd16 {
27152 break
27153 }
27154 _ = v_1.Args[1]
27155 v_1_0 := v_1.Args[0]
27156 v_1_1 := v_1.Args[1]
27157 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27158 y := v_1_0
27159 if v_1_1.Op != OpConst16 {
27160 continue
27161 }
27162 c := auxIntToInt16(v_1_1.AuxInt)
27163 if !(c&7 == 7) {
27164 continue
27165 }
27166 v.reset(OpRotateLeft8)
27167 v.AddArg2(x, y)
27168 return true
27169 }
27170 break
27171 }
27172
27173
27174
27175 for {
27176 x := v_0
27177 if v_1.Op != OpAnd8 {
27178 break
27179 }
27180 _ = v_1.Args[1]
27181 v_1_0 := v_1.Args[0]
27182 v_1_1 := v_1.Args[1]
27183 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27184 y := v_1_0
27185 if v_1_1.Op != OpConst8 {
27186 continue
27187 }
27188 c := auxIntToInt8(v_1_1.AuxInt)
27189 if !(c&7 == 7) {
27190 continue
27191 }
27192 v.reset(OpRotateLeft8)
27193 v.AddArg2(x, y)
27194 return true
27195 }
27196 break
27197 }
27198
27199
27200
27201 for {
27202 x := v_0
27203 if v_1.Op != OpNeg64 {
27204 break
27205 }
27206 v_1_0 := v_1.Args[0]
27207 if v_1_0.Op != OpAnd64 {
27208 break
27209 }
27210 _ = v_1_0.Args[1]
27211 v_1_0_0 := v_1_0.Args[0]
27212 v_1_0_1 := v_1_0.Args[1]
27213 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
27214 y := v_1_0_0
27215 if v_1_0_1.Op != OpConst64 {
27216 continue
27217 }
27218 c := auxIntToInt64(v_1_0_1.AuxInt)
27219 if !(c&7 == 7) {
27220 continue
27221 }
27222 v.reset(OpRotateLeft8)
27223 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
27224 v0.AddArg(y)
27225 v.AddArg2(x, v0)
27226 return true
27227 }
27228 break
27229 }
27230
27231
27232
27233 for {
27234 x := v_0
27235 if v_1.Op != OpNeg32 {
27236 break
27237 }
27238 v_1_0 := v_1.Args[0]
27239 if v_1_0.Op != OpAnd32 {
27240 break
27241 }
27242 _ = v_1_0.Args[1]
27243 v_1_0_0 := v_1_0.Args[0]
27244 v_1_0_1 := v_1_0.Args[1]
27245 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
27246 y := v_1_0_0
27247 if v_1_0_1.Op != OpConst32 {
27248 continue
27249 }
27250 c := auxIntToInt32(v_1_0_1.AuxInt)
27251 if !(c&7 == 7) {
27252 continue
27253 }
27254 v.reset(OpRotateLeft8)
27255 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
27256 v0.AddArg(y)
27257 v.AddArg2(x, v0)
27258 return true
27259 }
27260 break
27261 }
27262
27263
27264
27265 for {
27266 x := v_0
27267 if v_1.Op != OpNeg16 {
27268 break
27269 }
27270 v_1_0 := v_1.Args[0]
27271 if v_1_0.Op != OpAnd16 {
27272 break
27273 }
27274 _ = v_1_0.Args[1]
27275 v_1_0_0 := v_1_0.Args[0]
27276 v_1_0_1 := v_1_0.Args[1]
27277 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
27278 y := v_1_0_0
27279 if v_1_0_1.Op != OpConst16 {
27280 continue
27281 }
27282 c := auxIntToInt16(v_1_0_1.AuxInt)
27283 if !(c&7 == 7) {
27284 continue
27285 }
27286 v.reset(OpRotateLeft8)
27287 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
27288 v0.AddArg(y)
27289 v.AddArg2(x, v0)
27290 return true
27291 }
27292 break
27293 }
27294
27295
27296
27297 for {
27298 x := v_0
27299 if v_1.Op != OpNeg8 {
27300 break
27301 }
27302 v_1_0 := v_1.Args[0]
27303 if v_1_0.Op != OpAnd8 {
27304 break
27305 }
27306 _ = v_1_0.Args[1]
27307 v_1_0_0 := v_1_0.Args[0]
27308 v_1_0_1 := v_1_0.Args[1]
27309 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
27310 y := v_1_0_0
27311 if v_1_0_1.Op != OpConst8 {
27312 continue
27313 }
27314 c := auxIntToInt8(v_1_0_1.AuxInt)
27315 if !(c&7 == 7) {
27316 continue
27317 }
27318 v.reset(OpRotateLeft8)
27319 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
27320 v0.AddArg(y)
27321 v.AddArg2(x, v0)
27322 return true
27323 }
27324 break
27325 }
27326
27327
27328
27329 for {
27330 x := v_0
27331 if v_1.Op != OpAdd64 {
27332 break
27333 }
27334 _ = v_1.Args[1]
27335 v_1_0 := v_1.Args[0]
27336 v_1_1 := v_1.Args[1]
27337 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27338 y := v_1_0
27339 if v_1_1.Op != OpConst64 {
27340 continue
27341 }
27342 c := auxIntToInt64(v_1_1.AuxInt)
27343 if !(c&7 == 0) {
27344 continue
27345 }
27346 v.reset(OpRotateLeft8)
27347 v.AddArg2(x, y)
27348 return true
27349 }
27350 break
27351 }
27352
27353
27354
27355 for {
27356 x := v_0
27357 if v_1.Op != OpAdd32 {
27358 break
27359 }
27360 _ = v_1.Args[1]
27361 v_1_0 := v_1.Args[0]
27362 v_1_1 := v_1.Args[1]
27363 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27364 y := v_1_0
27365 if v_1_1.Op != OpConst32 {
27366 continue
27367 }
27368 c := auxIntToInt32(v_1_1.AuxInt)
27369 if !(c&7 == 0) {
27370 continue
27371 }
27372 v.reset(OpRotateLeft8)
27373 v.AddArg2(x, y)
27374 return true
27375 }
27376 break
27377 }
27378
27379
27380
27381 for {
27382 x := v_0
27383 if v_1.Op != OpAdd16 {
27384 break
27385 }
27386 _ = v_1.Args[1]
27387 v_1_0 := v_1.Args[0]
27388 v_1_1 := v_1.Args[1]
27389 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27390 y := v_1_0
27391 if v_1_1.Op != OpConst16 {
27392 continue
27393 }
27394 c := auxIntToInt16(v_1_1.AuxInt)
27395 if !(c&7 == 0) {
27396 continue
27397 }
27398 v.reset(OpRotateLeft8)
27399 v.AddArg2(x, y)
27400 return true
27401 }
27402 break
27403 }
27404
27405
27406
27407 for {
27408 x := v_0
27409 if v_1.Op != OpAdd8 {
27410 break
27411 }
27412 _ = v_1.Args[1]
27413 v_1_0 := v_1.Args[0]
27414 v_1_1 := v_1.Args[1]
27415 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
27416 y := v_1_0
27417 if v_1_1.Op != OpConst8 {
27418 continue
27419 }
27420 c := auxIntToInt8(v_1_1.AuxInt)
27421 if !(c&7 == 0) {
27422 continue
27423 }
27424 v.reset(OpRotateLeft8)
27425 v.AddArg2(x, y)
27426 return true
27427 }
27428 break
27429 }
27430
27431
27432
27433 for {
27434 x := v_0
27435 if v_1.Op != OpSub64 {
27436 break
27437 }
27438 y := v_1.Args[1]
27439 v_1_0 := v_1.Args[0]
27440 if v_1_0.Op != OpConst64 {
27441 break
27442 }
27443 c := auxIntToInt64(v_1_0.AuxInt)
27444 if !(c&7 == 0) {
27445 break
27446 }
27447 v.reset(OpRotateLeft8)
27448 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
27449 v0.AddArg(y)
27450 v.AddArg2(x, v0)
27451 return true
27452 }
27453
27454
27455
27456 for {
27457 x := v_0
27458 if v_1.Op != OpSub32 {
27459 break
27460 }
27461 y := v_1.Args[1]
27462 v_1_0 := v_1.Args[0]
27463 if v_1_0.Op != OpConst32 {
27464 break
27465 }
27466 c := auxIntToInt32(v_1_0.AuxInt)
27467 if !(c&7 == 0) {
27468 break
27469 }
27470 v.reset(OpRotateLeft8)
27471 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
27472 v0.AddArg(y)
27473 v.AddArg2(x, v0)
27474 return true
27475 }
27476
27477
27478
27479 for {
27480 x := v_0
27481 if v_1.Op != OpSub16 {
27482 break
27483 }
27484 y := v_1.Args[1]
27485 v_1_0 := v_1.Args[0]
27486 if v_1_0.Op != OpConst16 {
27487 break
27488 }
27489 c := auxIntToInt16(v_1_0.AuxInt)
27490 if !(c&7 == 0) {
27491 break
27492 }
27493 v.reset(OpRotateLeft8)
27494 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
27495 v0.AddArg(y)
27496 v.AddArg2(x, v0)
27497 return true
27498 }
27499
27500
27501
27502 for {
27503 x := v_0
27504 if v_1.Op != OpSub8 {
27505 break
27506 }
27507 y := v_1.Args[1]
27508 v_1_0 := v_1.Args[0]
27509 if v_1_0.Op != OpConst8 {
27510 break
27511 }
27512 c := auxIntToInt8(v_1_0.AuxInt)
27513 if !(c&7 == 0) {
27514 break
27515 }
27516 v.reset(OpRotateLeft8)
27517 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
27518 v0.AddArg(y)
27519 v.AddArg2(x, v0)
27520 return true
27521 }
27522
27523
27524
27525 for {
27526 x := v_0
27527 if v_1.Op != OpConst64 {
27528 break
27529 }
27530 t := v_1.Type
27531 c := auxIntToInt64(v_1.AuxInt)
27532 if !(config.PtrSize == 4) {
27533 break
27534 }
27535 v.reset(OpRotateLeft8)
27536 v0 := b.NewValue0(v.Pos, OpConst32, t)
27537 v0.AuxInt = int32ToAuxInt(int32(c))
27538 v.AddArg2(x, v0)
27539 return true
27540 }
27541
27542
27543
27544 for {
27545 if v_0.Op != OpRotateLeft8 {
27546 break
27547 }
27548 c := v_0.Args[1]
27549 x := v_0.Args[0]
27550 d := v_1
27551 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
27552 break
27553 }
27554 v.reset(OpRotateLeft8)
27555 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
27556 v0.AddArg2(c, d)
27557 v.AddArg2(x, v0)
27558 return true
27559 }
27560
27561
27562
27563 for {
27564 if v_0.Op != OpRotateLeft8 {
27565 break
27566 }
27567 c := v_0.Args[1]
27568 x := v_0.Args[0]
27569 d := v_1
27570 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
27571 break
27572 }
27573 v.reset(OpRotateLeft8)
27574 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
27575 v0.AddArg2(c, d)
27576 v.AddArg2(x, v0)
27577 return true
27578 }
27579
27580
27581
27582 for {
27583 if v_0.Op != OpRotateLeft8 {
27584 break
27585 }
27586 c := v_0.Args[1]
27587 x := v_0.Args[0]
27588 d := v_1
27589 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
27590 break
27591 }
27592 v.reset(OpRotateLeft8)
27593 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
27594 v0.AddArg2(c, d)
27595 v.AddArg2(x, v0)
27596 return true
27597 }
27598
27599
27600
27601 for {
27602 if v_0.Op != OpRotateLeft8 {
27603 break
27604 }
27605 c := v_0.Args[1]
27606 x := v_0.Args[0]
27607 d := v_1
27608 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
27609 break
27610 }
27611 v.reset(OpRotateLeft8)
27612 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
27613 v0.AddArg2(c, d)
27614 v.AddArg2(x, v0)
27615 return true
27616 }
27617 return false
27618 }
27619 func rewriteValuegeneric_OpRound32F(v *Value) bool {
27620 v_0 := v.Args[0]
27621
27622
27623 for {
27624 x := v_0
27625 if x.Op != OpConst32F {
27626 break
27627 }
27628 v.copyOf(x)
27629 return true
27630 }
27631 return false
27632 }
27633 func rewriteValuegeneric_OpRound64F(v *Value) bool {
27634 v_0 := v.Args[0]
27635
27636
27637 for {
27638 x := v_0
27639 if x.Op != OpConst64F {
27640 break
27641 }
27642 v.copyOf(x)
27643 return true
27644 }
27645 return false
27646 }
27647 func rewriteValuegeneric_OpRoundToEven(v *Value) bool {
27648 v_0 := v.Args[0]
27649
27650
27651 for {
27652 if v_0.Op != OpConst64F {
27653 break
27654 }
27655 c := auxIntToFloat64(v_0.AuxInt)
27656 v.reset(OpConst64F)
27657 v.AuxInt = float64ToAuxInt(math.RoundToEven(c))
27658 return true
27659 }
27660 return false
27661 }
27662 func rewriteValuegeneric_OpRsh16Ux16(v *Value) bool {
27663 v_1 := v.Args[1]
27664 v_0 := v.Args[0]
27665 b := v.Block
27666
27667
27668 for {
27669 t := v.Type
27670 x := v_0
27671 if v_1.Op != OpConst16 {
27672 break
27673 }
27674 c := auxIntToInt16(v_1.AuxInt)
27675 v.reset(OpRsh16Ux64)
27676 v0 := b.NewValue0(v.Pos, OpConst64, t)
27677 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
27678 v.AddArg2(x, v0)
27679 return true
27680 }
27681
27682
27683 for {
27684 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27685 break
27686 }
27687 v.reset(OpConst16)
27688 v.AuxInt = int16ToAuxInt(0)
27689 return true
27690 }
27691
27692
27693
27694 for {
27695 if auxIntToBool(v.AuxInt) != false {
27696 break
27697 }
27698 x := v_0
27699 con := v_1
27700 if con.Op != OpConst16 {
27701 break
27702 }
27703 c := auxIntToInt16(con.AuxInt)
27704 if !(0 < c && c < 16) {
27705 break
27706 }
27707 v.reset(OpRsh16Ux16)
27708 v.AuxInt = boolToAuxInt(true)
27709 v.AddArg2(x, con)
27710 return true
27711 }
27712 return false
27713 }
27714 func rewriteValuegeneric_OpRsh16Ux32(v *Value) bool {
27715 v_1 := v.Args[1]
27716 v_0 := v.Args[0]
27717 b := v.Block
27718
27719
27720 for {
27721 t := v.Type
27722 x := v_0
27723 if v_1.Op != OpConst32 {
27724 break
27725 }
27726 c := auxIntToInt32(v_1.AuxInt)
27727 v.reset(OpRsh16Ux64)
27728 v0 := b.NewValue0(v.Pos, OpConst64, t)
27729 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
27730 v.AddArg2(x, v0)
27731 return true
27732 }
27733
27734
27735 for {
27736 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27737 break
27738 }
27739 v.reset(OpConst16)
27740 v.AuxInt = int16ToAuxInt(0)
27741 return true
27742 }
27743
27744
27745
27746 for {
27747 if auxIntToBool(v.AuxInt) != false {
27748 break
27749 }
27750 x := v_0
27751 con := v_1
27752 if con.Op != OpConst32 {
27753 break
27754 }
27755 c := auxIntToInt32(con.AuxInt)
27756 if !(0 < c && c < 16) {
27757 break
27758 }
27759 v.reset(OpRsh16Ux32)
27760 v.AuxInt = boolToAuxInt(true)
27761 v.AddArg2(x, con)
27762 return true
27763 }
27764 return false
27765 }
27766 func rewriteValuegeneric_OpRsh16Ux64(v *Value) bool {
27767 v_1 := v.Args[1]
27768 v_0 := v.Args[0]
27769 b := v.Block
27770 typ := &b.Func.Config.Types
27771
27772
27773 for {
27774 if v_0.Op != OpConst16 {
27775 break
27776 }
27777 c := auxIntToInt16(v_0.AuxInt)
27778 if v_1.Op != OpConst64 {
27779 break
27780 }
27781 d := auxIntToInt64(v_1.AuxInt)
27782 v.reset(OpConst16)
27783 v.AuxInt = int16ToAuxInt(int16(uint16(c) >> uint64(d)))
27784 return true
27785 }
27786
27787
27788 for {
27789 x := v_0
27790 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
27791 break
27792 }
27793 v.copyOf(x)
27794 return true
27795 }
27796
27797
27798 for {
27799 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27800 break
27801 }
27802 v.reset(OpConst16)
27803 v.AuxInt = int16ToAuxInt(0)
27804 return true
27805 }
27806
27807
27808
27809 for {
27810 if v_1.Op != OpConst64 {
27811 break
27812 }
27813 c := auxIntToInt64(v_1.AuxInt)
27814 if !(uint64(c) >= 16) {
27815 break
27816 }
27817 v.reset(OpConst16)
27818 v.AuxInt = int16ToAuxInt(0)
27819 return true
27820 }
27821
27822
27823
27824 for {
27825 t := v.Type
27826 if v_0.Op != OpRsh16Ux64 {
27827 break
27828 }
27829 _ = v_0.Args[1]
27830 x := v_0.Args[0]
27831 v_0_1 := v_0.Args[1]
27832 if v_0_1.Op != OpConst64 {
27833 break
27834 }
27835 c := auxIntToInt64(v_0_1.AuxInt)
27836 if v_1.Op != OpConst64 {
27837 break
27838 }
27839 d := auxIntToInt64(v_1.AuxInt)
27840 if !(!uaddOvf(c, d)) {
27841 break
27842 }
27843 v.reset(OpRsh16Ux64)
27844 v0 := b.NewValue0(v.Pos, OpConst64, t)
27845 v0.AuxInt = int64ToAuxInt(c + d)
27846 v.AddArg2(x, v0)
27847 return true
27848 }
27849
27850
27851 for {
27852 if v_0.Op != OpRsh16x64 {
27853 break
27854 }
27855 x := v_0.Args[0]
27856 if v_1.Op != OpConst64 {
27857 break
27858 }
27859 t := v_1.Type
27860 if auxIntToInt64(v_1.AuxInt) != 15 {
27861 break
27862 }
27863 v.reset(OpRsh16Ux64)
27864 v0 := b.NewValue0(v.Pos, OpConst64, t)
27865 v0.AuxInt = int64ToAuxInt(15)
27866 v.AddArg2(x, v0)
27867 return true
27868 }
27869
27870
27871
27872 for {
27873 i := v_0
27874 if i.Op != OpLsh16x64 {
27875 break
27876 }
27877 _ = i.Args[1]
27878 x := i.Args[0]
27879 i_1 := i.Args[1]
27880 if i_1.Op != OpConst64 {
27881 break
27882 }
27883 c := auxIntToInt64(i_1.AuxInt)
27884 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
27885 break
27886 }
27887 v.reset(OpAnd16)
27888 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
27889 v0.AuxInt = int16ToAuxInt(int16(^uint16(0) >> c))
27890 v.AddArg2(x, v0)
27891 return true
27892 }
27893
27894
27895
27896 for {
27897 if v_0.Op != OpLsh16x64 {
27898 break
27899 }
27900 _ = v_0.Args[1]
27901 v_0_0 := v_0.Args[0]
27902 if v_0_0.Op != OpRsh16Ux64 {
27903 break
27904 }
27905 _ = v_0_0.Args[1]
27906 x := v_0_0.Args[0]
27907 v_0_0_1 := v_0_0.Args[1]
27908 if v_0_0_1.Op != OpConst64 {
27909 break
27910 }
27911 c1 := auxIntToInt64(v_0_0_1.AuxInt)
27912 v_0_1 := v_0.Args[1]
27913 if v_0_1.Op != OpConst64 {
27914 break
27915 }
27916 c2 := auxIntToInt64(v_0_1.AuxInt)
27917 if v_1.Op != OpConst64 {
27918 break
27919 }
27920 c3 := auxIntToInt64(v_1.AuxInt)
27921 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
27922 break
27923 }
27924 v.reset(OpRsh16Ux64)
27925 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
27926 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
27927 v.AddArg2(x, v0)
27928 return true
27929 }
27930
27931
27932 for {
27933 if v_0.Op != OpLsh16x64 {
27934 break
27935 }
27936 _ = v_0.Args[1]
27937 x := v_0.Args[0]
27938 v_0_1 := v_0.Args[1]
27939 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 8 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 8 {
27940 break
27941 }
27942 v.reset(OpZeroExt8to16)
27943 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.UInt8)
27944 v0.AddArg(x)
27945 v.AddArg(v0)
27946 return true
27947 }
27948
27949
27950
27951 for {
27952 if auxIntToBool(v.AuxInt) != false {
27953 break
27954 }
27955 x := v_0
27956 con := v_1
27957 if con.Op != OpConst64 {
27958 break
27959 }
27960 c := auxIntToInt64(con.AuxInt)
27961 if !(0 < c && c < 16) {
27962 break
27963 }
27964 v.reset(OpRsh16Ux64)
27965 v.AuxInt = boolToAuxInt(true)
27966 v.AddArg2(x, con)
27967 return true
27968 }
27969 return false
27970 }
27971 func rewriteValuegeneric_OpRsh16Ux8(v *Value) bool {
27972 v_1 := v.Args[1]
27973 v_0 := v.Args[0]
27974 b := v.Block
27975
27976
27977 for {
27978 t := v.Type
27979 x := v_0
27980 if v_1.Op != OpConst8 {
27981 break
27982 }
27983 c := auxIntToInt8(v_1.AuxInt)
27984 v.reset(OpRsh16Ux64)
27985 v0 := b.NewValue0(v.Pos, OpConst64, t)
27986 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
27987 v.AddArg2(x, v0)
27988 return true
27989 }
27990
27991
27992 for {
27993 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27994 break
27995 }
27996 v.reset(OpConst16)
27997 v.AuxInt = int16ToAuxInt(0)
27998 return true
27999 }
28000
28001
28002
28003 for {
28004 if auxIntToBool(v.AuxInt) != false {
28005 break
28006 }
28007 x := v_0
28008 con := v_1
28009 if con.Op != OpConst8 {
28010 break
28011 }
28012 c := auxIntToInt8(con.AuxInt)
28013 if !(0 < c && c < 16) {
28014 break
28015 }
28016 v.reset(OpRsh16Ux8)
28017 v.AuxInt = boolToAuxInt(true)
28018 v.AddArg2(x, con)
28019 return true
28020 }
28021 return false
28022 }
28023 func rewriteValuegeneric_OpRsh16x16(v *Value) bool {
28024 v_1 := v.Args[1]
28025 v_0 := v.Args[0]
28026 b := v.Block
28027
28028
28029 for {
28030 t := v.Type
28031 x := v_0
28032 if v_1.Op != OpConst16 {
28033 break
28034 }
28035 c := auxIntToInt16(v_1.AuxInt)
28036 v.reset(OpRsh16x64)
28037 v0 := b.NewValue0(v.Pos, OpConst64, t)
28038 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28039 v.AddArg2(x, v0)
28040 return true
28041 }
28042
28043
28044 for {
28045 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
28046 break
28047 }
28048 v.reset(OpConst16)
28049 v.AuxInt = int16ToAuxInt(0)
28050 return true
28051 }
28052
28053
28054
28055 for {
28056 if auxIntToBool(v.AuxInt) != false {
28057 break
28058 }
28059 x := v_0
28060 con := v_1
28061 if con.Op != OpConst16 {
28062 break
28063 }
28064 c := auxIntToInt16(con.AuxInt)
28065 if !(0 < c && c < 16) {
28066 break
28067 }
28068 v.reset(OpRsh16x16)
28069 v.AuxInt = boolToAuxInt(true)
28070 v.AddArg2(x, con)
28071 return true
28072 }
28073 return false
28074 }
28075 func rewriteValuegeneric_OpRsh16x32(v *Value) bool {
28076 v_1 := v.Args[1]
28077 v_0 := v.Args[0]
28078 b := v.Block
28079
28080
28081 for {
28082 t := v.Type
28083 x := v_0
28084 if v_1.Op != OpConst32 {
28085 break
28086 }
28087 c := auxIntToInt32(v_1.AuxInt)
28088 v.reset(OpRsh16x64)
28089 v0 := b.NewValue0(v.Pos, OpConst64, t)
28090 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
28091 v.AddArg2(x, v0)
28092 return true
28093 }
28094
28095
28096 for {
28097 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
28098 break
28099 }
28100 v.reset(OpConst16)
28101 v.AuxInt = int16ToAuxInt(0)
28102 return true
28103 }
28104
28105
28106
28107 for {
28108 if auxIntToBool(v.AuxInt) != false {
28109 break
28110 }
28111 x := v_0
28112 con := v_1
28113 if con.Op != OpConst32 {
28114 break
28115 }
28116 c := auxIntToInt32(con.AuxInt)
28117 if !(0 < c && c < 16) {
28118 break
28119 }
28120 v.reset(OpRsh16x32)
28121 v.AuxInt = boolToAuxInt(true)
28122 v.AddArg2(x, con)
28123 return true
28124 }
28125 return false
28126 }
28127 func rewriteValuegeneric_OpRsh16x64(v *Value) bool {
28128 v_1 := v.Args[1]
28129 v_0 := v.Args[0]
28130 b := v.Block
28131 typ := &b.Func.Config.Types
28132
28133
28134 for {
28135 if v_0.Op != OpConst16 {
28136 break
28137 }
28138 c := auxIntToInt16(v_0.AuxInt)
28139 if v_1.Op != OpConst64 {
28140 break
28141 }
28142 d := auxIntToInt64(v_1.AuxInt)
28143 v.reset(OpConst16)
28144 v.AuxInt = int16ToAuxInt(c >> uint64(d))
28145 return true
28146 }
28147
28148
28149 for {
28150 x := v_0
28151 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
28152 break
28153 }
28154 v.copyOf(x)
28155 return true
28156 }
28157
28158
28159 for {
28160 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
28161 break
28162 }
28163 v.reset(OpConst16)
28164 v.AuxInt = int16ToAuxInt(0)
28165 return true
28166 }
28167
28168
28169
28170 for {
28171 t := v.Type
28172 if v_0.Op != OpRsh16x64 {
28173 break
28174 }
28175 _ = v_0.Args[1]
28176 x := v_0.Args[0]
28177 v_0_1 := v_0.Args[1]
28178 if v_0_1.Op != OpConst64 {
28179 break
28180 }
28181 c := auxIntToInt64(v_0_1.AuxInt)
28182 if v_1.Op != OpConst64 {
28183 break
28184 }
28185 d := auxIntToInt64(v_1.AuxInt)
28186 if !(!uaddOvf(c, d)) {
28187 break
28188 }
28189 v.reset(OpRsh16x64)
28190 v0 := b.NewValue0(v.Pos, OpConst64, t)
28191 v0.AuxInt = int64ToAuxInt(c + d)
28192 v.AddArg2(x, v0)
28193 return true
28194 }
28195
28196
28197 for {
28198 if v_0.Op != OpLsh16x64 {
28199 break
28200 }
28201 _ = v_0.Args[1]
28202 x := v_0.Args[0]
28203 v_0_1 := v_0.Args[1]
28204 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 8 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 8 {
28205 break
28206 }
28207 v.reset(OpSignExt8to16)
28208 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.Int8)
28209 v0.AddArg(x)
28210 v.AddArg(v0)
28211 return true
28212 }
28213
28214
28215
28216 for {
28217 if auxIntToBool(v.AuxInt) != false {
28218 break
28219 }
28220 x := v_0
28221 con := v_1
28222 if con.Op != OpConst64 {
28223 break
28224 }
28225 c := auxIntToInt64(con.AuxInt)
28226 if !(0 < c && c < 16) {
28227 break
28228 }
28229 v.reset(OpRsh16x64)
28230 v.AuxInt = boolToAuxInt(true)
28231 v.AddArg2(x, con)
28232 return true
28233 }
28234 return false
28235 }
28236 func rewriteValuegeneric_OpRsh16x8(v *Value) bool {
28237 v_1 := v.Args[1]
28238 v_0 := v.Args[0]
28239 b := v.Block
28240
28241
28242 for {
28243 t := v.Type
28244 x := v_0
28245 if v_1.Op != OpConst8 {
28246 break
28247 }
28248 c := auxIntToInt8(v_1.AuxInt)
28249 v.reset(OpRsh16x64)
28250 v0 := b.NewValue0(v.Pos, OpConst64, t)
28251 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
28252 v.AddArg2(x, v0)
28253 return true
28254 }
28255
28256
28257 for {
28258 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
28259 break
28260 }
28261 v.reset(OpConst16)
28262 v.AuxInt = int16ToAuxInt(0)
28263 return true
28264 }
28265
28266
28267
28268 for {
28269 if auxIntToBool(v.AuxInt) != false {
28270 break
28271 }
28272 x := v_0
28273 con := v_1
28274 if con.Op != OpConst8 {
28275 break
28276 }
28277 c := auxIntToInt8(con.AuxInt)
28278 if !(0 < c && c < 16) {
28279 break
28280 }
28281 v.reset(OpRsh16x8)
28282 v.AuxInt = boolToAuxInt(true)
28283 v.AddArg2(x, con)
28284 return true
28285 }
28286 return false
28287 }
28288 func rewriteValuegeneric_OpRsh32Ux16(v *Value) bool {
28289 v_1 := v.Args[1]
28290 v_0 := v.Args[0]
28291 b := v.Block
28292
28293
28294 for {
28295 t := v.Type
28296 x := v_0
28297 if v_1.Op != OpConst16 {
28298 break
28299 }
28300 c := auxIntToInt16(v_1.AuxInt)
28301 v.reset(OpRsh32Ux64)
28302 v0 := b.NewValue0(v.Pos, OpConst64, t)
28303 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28304 v.AddArg2(x, v0)
28305 return true
28306 }
28307
28308
28309 for {
28310 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28311 break
28312 }
28313 v.reset(OpConst32)
28314 v.AuxInt = int32ToAuxInt(0)
28315 return true
28316 }
28317
28318
28319
28320 for {
28321 if auxIntToBool(v.AuxInt) != false {
28322 break
28323 }
28324 x := v_0
28325 con := v_1
28326 if con.Op != OpConst16 {
28327 break
28328 }
28329 c := auxIntToInt16(con.AuxInt)
28330 if !(0 < c && c < 32) {
28331 break
28332 }
28333 v.reset(OpRsh32Ux16)
28334 v.AuxInt = boolToAuxInt(true)
28335 v.AddArg2(x, con)
28336 return true
28337 }
28338 return false
28339 }
28340 func rewriteValuegeneric_OpRsh32Ux32(v *Value) bool {
28341 v_1 := v.Args[1]
28342 v_0 := v.Args[0]
28343 b := v.Block
28344
28345
28346 for {
28347 t := v.Type
28348 x := v_0
28349 if v_1.Op != OpConst32 {
28350 break
28351 }
28352 c := auxIntToInt32(v_1.AuxInt)
28353 v.reset(OpRsh32Ux64)
28354 v0 := b.NewValue0(v.Pos, OpConst64, t)
28355 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
28356 v.AddArg2(x, v0)
28357 return true
28358 }
28359
28360
28361 for {
28362 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28363 break
28364 }
28365 v.reset(OpConst32)
28366 v.AuxInt = int32ToAuxInt(0)
28367 return true
28368 }
28369
28370
28371
28372 for {
28373 if auxIntToBool(v.AuxInt) != false {
28374 break
28375 }
28376 x := v_0
28377 con := v_1
28378 if con.Op != OpConst32 {
28379 break
28380 }
28381 c := auxIntToInt32(con.AuxInt)
28382 if !(0 < c && c < 32) {
28383 break
28384 }
28385 v.reset(OpRsh32Ux32)
28386 v.AuxInt = boolToAuxInt(true)
28387 v.AddArg2(x, con)
28388 return true
28389 }
28390 return false
28391 }
28392 func rewriteValuegeneric_OpRsh32Ux64(v *Value) bool {
28393 v_1 := v.Args[1]
28394 v_0 := v.Args[0]
28395 b := v.Block
28396 typ := &b.Func.Config.Types
28397
28398
28399 for {
28400 if v_0.Op != OpConst32 {
28401 break
28402 }
28403 c := auxIntToInt32(v_0.AuxInt)
28404 if v_1.Op != OpConst64 {
28405 break
28406 }
28407 d := auxIntToInt64(v_1.AuxInt)
28408 v.reset(OpConst32)
28409 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
28410 return true
28411 }
28412
28413
28414 for {
28415 x := v_0
28416 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
28417 break
28418 }
28419 v.copyOf(x)
28420 return true
28421 }
28422
28423
28424 for {
28425 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28426 break
28427 }
28428 v.reset(OpConst32)
28429 v.AuxInt = int32ToAuxInt(0)
28430 return true
28431 }
28432
28433
28434
28435 for {
28436 if v_1.Op != OpConst64 {
28437 break
28438 }
28439 c := auxIntToInt64(v_1.AuxInt)
28440 if !(uint64(c) >= 32) {
28441 break
28442 }
28443 v.reset(OpConst32)
28444 v.AuxInt = int32ToAuxInt(0)
28445 return true
28446 }
28447
28448
28449
28450 for {
28451 t := v.Type
28452 if v_0.Op != OpRsh32Ux64 {
28453 break
28454 }
28455 _ = v_0.Args[1]
28456 x := v_0.Args[0]
28457 v_0_1 := v_0.Args[1]
28458 if v_0_1.Op != OpConst64 {
28459 break
28460 }
28461 c := auxIntToInt64(v_0_1.AuxInt)
28462 if v_1.Op != OpConst64 {
28463 break
28464 }
28465 d := auxIntToInt64(v_1.AuxInt)
28466 if !(!uaddOvf(c, d)) {
28467 break
28468 }
28469 v.reset(OpRsh32Ux64)
28470 v0 := b.NewValue0(v.Pos, OpConst64, t)
28471 v0.AuxInt = int64ToAuxInt(c + d)
28472 v.AddArg2(x, v0)
28473 return true
28474 }
28475
28476
28477 for {
28478 if v_0.Op != OpRsh32x64 {
28479 break
28480 }
28481 x := v_0.Args[0]
28482 if v_1.Op != OpConst64 {
28483 break
28484 }
28485 t := v_1.Type
28486 if auxIntToInt64(v_1.AuxInt) != 31 {
28487 break
28488 }
28489 v.reset(OpRsh32Ux64)
28490 v0 := b.NewValue0(v.Pos, OpConst64, t)
28491 v0.AuxInt = int64ToAuxInt(31)
28492 v.AddArg2(x, v0)
28493 return true
28494 }
28495
28496
28497
28498 for {
28499 i := v_0
28500 if i.Op != OpLsh32x64 {
28501 break
28502 }
28503 _ = i.Args[1]
28504 x := i.Args[0]
28505 i_1 := i.Args[1]
28506 if i_1.Op != OpConst64 {
28507 break
28508 }
28509 c := auxIntToInt64(i_1.AuxInt)
28510 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
28511 break
28512 }
28513 v.reset(OpAnd32)
28514 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
28515 v0.AuxInt = int32ToAuxInt(int32(^uint32(0) >> c))
28516 v.AddArg2(x, v0)
28517 return true
28518 }
28519
28520
28521
28522 for {
28523 if v_0.Op != OpLsh32x64 {
28524 break
28525 }
28526 _ = v_0.Args[1]
28527 v_0_0 := v_0.Args[0]
28528 if v_0_0.Op != OpRsh32Ux64 {
28529 break
28530 }
28531 _ = v_0_0.Args[1]
28532 x := v_0_0.Args[0]
28533 v_0_0_1 := v_0_0.Args[1]
28534 if v_0_0_1.Op != OpConst64 {
28535 break
28536 }
28537 c1 := auxIntToInt64(v_0_0_1.AuxInt)
28538 v_0_1 := v_0.Args[1]
28539 if v_0_1.Op != OpConst64 {
28540 break
28541 }
28542 c2 := auxIntToInt64(v_0_1.AuxInt)
28543 if v_1.Op != OpConst64 {
28544 break
28545 }
28546 c3 := auxIntToInt64(v_1.AuxInt)
28547 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
28548 break
28549 }
28550 v.reset(OpRsh32Ux64)
28551 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
28552 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
28553 v.AddArg2(x, v0)
28554 return true
28555 }
28556
28557
28558 for {
28559 if v_0.Op != OpLsh32x64 {
28560 break
28561 }
28562 _ = v_0.Args[1]
28563 x := v_0.Args[0]
28564 v_0_1 := v_0.Args[1]
28565 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 24 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 24 {
28566 break
28567 }
28568 v.reset(OpZeroExt8to32)
28569 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.UInt8)
28570 v0.AddArg(x)
28571 v.AddArg(v0)
28572 return true
28573 }
28574
28575
28576 for {
28577 if v_0.Op != OpLsh32x64 {
28578 break
28579 }
28580 _ = v_0.Args[1]
28581 x := v_0.Args[0]
28582 v_0_1 := v_0.Args[1]
28583 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 16 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 16 {
28584 break
28585 }
28586 v.reset(OpZeroExt16to32)
28587 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.UInt16)
28588 v0.AddArg(x)
28589 v.AddArg(v0)
28590 return true
28591 }
28592
28593
28594
28595 for {
28596 if auxIntToBool(v.AuxInt) != false {
28597 break
28598 }
28599 x := v_0
28600 con := v_1
28601 if con.Op != OpConst64 {
28602 break
28603 }
28604 c := auxIntToInt64(con.AuxInt)
28605 if !(0 < c && c < 32) {
28606 break
28607 }
28608 v.reset(OpRsh32Ux64)
28609 v.AuxInt = boolToAuxInt(true)
28610 v.AddArg2(x, con)
28611 return true
28612 }
28613 return false
28614 }
28615 func rewriteValuegeneric_OpRsh32Ux8(v *Value) bool {
28616 v_1 := v.Args[1]
28617 v_0 := v.Args[0]
28618 b := v.Block
28619
28620
28621 for {
28622 t := v.Type
28623 x := v_0
28624 if v_1.Op != OpConst8 {
28625 break
28626 }
28627 c := auxIntToInt8(v_1.AuxInt)
28628 v.reset(OpRsh32Ux64)
28629 v0 := b.NewValue0(v.Pos, OpConst64, t)
28630 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
28631 v.AddArg2(x, v0)
28632 return true
28633 }
28634
28635
28636 for {
28637 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28638 break
28639 }
28640 v.reset(OpConst32)
28641 v.AuxInt = int32ToAuxInt(0)
28642 return true
28643 }
28644
28645
28646
28647 for {
28648 if auxIntToBool(v.AuxInt) != false {
28649 break
28650 }
28651 x := v_0
28652 con := v_1
28653 if con.Op != OpConst8 {
28654 break
28655 }
28656 c := auxIntToInt8(con.AuxInt)
28657 if !(0 < c && c < 32) {
28658 break
28659 }
28660 v.reset(OpRsh32Ux8)
28661 v.AuxInt = boolToAuxInt(true)
28662 v.AddArg2(x, con)
28663 return true
28664 }
28665 return false
28666 }
28667 func rewriteValuegeneric_OpRsh32x16(v *Value) bool {
28668 v_1 := v.Args[1]
28669 v_0 := v.Args[0]
28670 b := v.Block
28671
28672
28673 for {
28674 t := v.Type
28675 x := v_0
28676 if v_1.Op != OpConst16 {
28677 break
28678 }
28679 c := auxIntToInt16(v_1.AuxInt)
28680 v.reset(OpRsh32x64)
28681 v0 := b.NewValue0(v.Pos, OpConst64, t)
28682 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28683 v.AddArg2(x, v0)
28684 return true
28685 }
28686
28687
28688 for {
28689 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28690 break
28691 }
28692 v.reset(OpConst32)
28693 v.AuxInt = int32ToAuxInt(0)
28694 return true
28695 }
28696
28697
28698
28699 for {
28700 if auxIntToBool(v.AuxInt) != false {
28701 break
28702 }
28703 x := v_0
28704 con := v_1
28705 if con.Op != OpConst16 {
28706 break
28707 }
28708 c := auxIntToInt16(con.AuxInt)
28709 if !(0 < c && c < 32) {
28710 break
28711 }
28712 v.reset(OpRsh32x16)
28713 v.AuxInt = boolToAuxInt(true)
28714 v.AddArg2(x, con)
28715 return true
28716 }
28717 return false
28718 }
28719 func rewriteValuegeneric_OpRsh32x32(v *Value) bool {
28720 v_1 := v.Args[1]
28721 v_0 := v.Args[0]
28722 b := v.Block
28723
28724
28725 for {
28726 t := v.Type
28727 x := v_0
28728 if v_1.Op != OpConst32 {
28729 break
28730 }
28731 c := auxIntToInt32(v_1.AuxInt)
28732 v.reset(OpRsh32x64)
28733 v0 := b.NewValue0(v.Pos, OpConst64, t)
28734 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
28735 v.AddArg2(x, v0)
28736 return true
28737 }
28738
28739
28740 for {
28741 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28742 break
28743 }
28744 v.reset(OpConst32)
28745 v.AuxInt = int32ToAuxInt(0)
28746 return true
28747 }
28748
28749
28750
28751 for {
28752 if auxIntToBool(v.AuxInt) != false {
28753 break
28754 }
28755 x := v_0
28756 con := v_1
28757 if con.Op != OpConst32 {
28758 break
28759 }
28760 c := auxIntToInt32(con.AuxInt)
28761 if !(0 < c && c < 32) {
28762 break
28763 }
28764 v.reset(OpRsh32x32)
28765 v.AuxInt = boolToAuxInt(true)
28766 v.AddArg2(x, con)
28767 return true
28768 }
28769 return false
28770 }
28771 func rewriteValuegeneric_OpRsh32x64(v *Value) bool {
28772 v_1 := v.Args[1]
28773 v_0 := v.Args[0]
28774 b := v.Block
28775 typ := &b.Func.Config.Types
28776
28777
28778 for {
28779 if v_0.Op != OpConst32 {
28780 break
28781 }
28782 c := auxIntToInt32(v_0.AuxInt)
28783 if v_1.Op != OpConst64 {
28784 break
28785 }
28786 d := auxIntToInt64(v_1.AuxInt)
28787 v.reset(OpConst32)
28788 v.AuxInt = int32ToAuxInt(c >> uint64(d))
28789 return true
28790 }
28791
28792
28793 for {
28794 x := v_0
28795 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
28796 break
28797 }
28798 v.copyOf(x)
28799 return true
28800 }
28801
28802
28803 for {
28804 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28805 break
28806 }
28807 v.reset(OpConst32)
28808 v.AuxInt = int32ToAuxInt(0)
28809 return true
28810 }
28811
28812
28813
28814 for {
28815 t := v.Type
28816 if v_0.Op != OpRsh32x64 {
28817 break
28818 }
28819 _ = v_0.Args[1]
28820 x := v_0.Args[0]
28821 v_0_1 := v_0.Args[1]
28822 if v_0_1.Op != OpConst64 {
28823 break
28824 }
28825 c := auxIntToInt64(v_0_1.AuxInt)
28826 if v_1.Op != OpConst64 {
28827 break
28828 }
28829 d := auxIntToInt64(v_1.AuxInt)
28830 if !(!uaddOvf(c, d)) {
28831 break
28832 }
28833 v.reset(OpRsh32x64)
28834 v0 := b.NewValue0(v.Pos, OpConst64, t)
28835 v0.AuxInt = int64ToAuxInt(c + d)
28836 v.AddArg2(x, v0)
28837 return true
28838 }
28839
28840
28841 for {
28842 if v_0.Op != OpLsh32x64 {
28843 break
28844 }
28845 _ = v_0.Args[1]
28846 x := v_0.Args[0]
28847 v_0_1 := v_0.Args[1]
28848 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 24 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 24 {
28849 break
28850 }
28851 v.reset(OpSignExt8to32)
28852 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.Int8)
28853 v0.AddArg(x)
28854 v.AddArg(v0)
28855 return true
28856 }
28857
28858
28859 for {
28860 if v_0.Op != OpLsh32x64 {
28861 break
28862 }
28863 _ = v_0.Args[1]
28864 x := v_0.Args[0]
28865 v_0_1 := v_0.Args[1]
28866 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 16 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 16 {
28867 break
28868 }
28869 v.reset(OpSignExt16to32)
28870 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.Int16)
28871 v0.AddArg(x)
28872 v.AddArg(v0)
28873 return true
28874 }
28875
28876
28877
28878 for {
28879 if auxIntToBool(v.AuxInt) != false {
28880 break
28881 }
28882 x := v_0
28883 con := v_1
28884 if con.Op != OpConst64 {
28885 break
28886 }
28887 c := auxIntToInt64(con.AuxInt)
28888 if !(0 < c && c < 32) {
28889 break
28890 }
28891 v.reset(OpRsh32x64)
28892 v.AuxInt = boolToAuxInt(true)
28893 v.AddArg2(x, con)
28894 return true
28895 }
28896 return false
28897 }
28898 func rewriteValuegeneric_OpRsh32x8(v *Value) bool {
28899 v_1 := v.Args[1]
28900 v_0 := v.Args[0]
28901 b := v.Block
28902
28903
28904 for {
28905 t := v.Type
28906 x := v_0
28907 if v_1.Op != OpConst8 {
28908 break
28909 }
28910 c := auxIntToInt8(v_1.AuxInt)
28911 v.reset(OpRsh32x64)
28912 v0 := b.NewValue0(v.Pos, OpConst64, t)
28913 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
28914 v.AddArg2(x, v0)
28915 return true
28916 }
28917
28918
28919 for {
28920 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28921 break
28922 }
28923 v.reset(OpConst32)
28924 v.AuxInt = int32ToAuxInt(0)
28925 return true
28926 }
28927
28928
28929
28930 for {
28931 if auxIntToBool(v.AuxInt) != false {
28932 break
28933 }
28934 x := v_0
28935 con := v_1
28936 if con.Op != OpConst8 {
28937 break
28938 }
28939 c := auxIntToInt8(con.AuxInt)
28940 if !(0 < c && c < 32) {
28941 break
28942 }
28943 v.reset(OpRsh32x8)
28944 v.AuxInt = boolToAuxInt(true)
28945 v.AddArg2(x, con)
28946 return true
28947 }
28948 return false
28949 }
28950 func rewriteValuegeneric_OpRsh64Ux16(v *Value) bool {
28951 v_1 := v.Args[1]
28952 v_0 := v.Args[0]
28953 b := v.Block
28954
28955
28956 for {
28957 t := v.Type
28958 x := v_0
28959 if v_1.Op != OpConst16 {
28960 break
28961 }
28962 c := auxIntToInt16(v_1.AuxInt)
28963 v.reset(OpRsh64Ux64)
28964 v0 := b.NewValue0(v.Pos, OpConst64, t)
28965 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28966 v.AddArg2(x, v0)
28967 return true
28968 }
28969
28970
28971 for {
28972 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
28973 break
28974 }
28975 v.reset(OpConst64)
28976 v.AuxInt = int64ToAuxInt(0)
28977 return true
28978 }
28979
28980
28981
28982 for {
28983 if auxIntToBool(v.AuxInt) != false {
28984 break
28985 }
28986 x := v_0
28987 con := v_1
28988 if con.Op != OpConst16 {
28989 break
28990 }
28991 c := auxIntToInt16(con.AuxInt)
28992 if !(0 < c && c < 64) {
28993 break
28994 }
28995 v.reset(OpRsh64Ux16)
28996 v.AuxInt = boolToAuxInt(true)
28997 v.AddArg2(x, con)
28998 return true
28999 }
29000 return false
29001 }
29002 func rewriteValuegeneric_OpRsh64Ux32(v *Value) bool {
29003 v_1 := v.Args[1]
29004 v_0 := v.Args[0]
29005 b := v.Block
29006
29007
29008 for {
29009 t := v.Type
29010 x := v_0
29011 if v_1.Op != OpConst32 {
29012 break
29013 }
29014 c := auxIntToInt32(v_1.AuxInt)
29015 v.reset(OpRsh64Ux64)
29016 v0 := b.NewValue0(v.Pos, OpConst64, t)
29017 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
29018 v.AddArg2(x, v0)
29019 return true
29020 }
29021
29022
29023 for {
29024 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29025 break
29026 }
29027 v.reset(OpConst64)
29028 v.AuxInt = int64ToAuxInt(0)
29029 return true
29030 }
29031
29032
29033
29034 for {
29035 if auxIntToBool(v.AuxInt) != false {
29036 break
29037 }
29038 x := v_0
29039 con := v_1
29040 if con.Op != OpConst32 {
29041 break
29042 }
29043 c := auxIntToInt32(con.AuxInt)
29044 if !(0 < c && c < 64) {
29045 break
29046 }
29047 v.reset(OpRsh64Ux32)
29048 v.AuxInt = boolToAuxInt(true)
29049 v.AddArg2(x, con)
29050 return true
29051 }
29052 return false
29053 }
29054 func rewriteValuegeneric_OpRsh64Ux64(v *Value) bool {
29055 v_1 := v.Args[1]
29056 v_0 := v.Args[0]
29057 b := v.Block
29058 typ := &b.Func.Config.Types
29059
29060
29061 for {
29062 if v_0.Op != OpConst64 {
29063 break
29064 }
29065 c := auxIntToInt64(v_0.AuxInt)
29066 if v_1.Op != OpConst64 {
29067 break
29068 }
29069 d := auxIntToInt64(v_1.AuxInt)
29070 v.reset(OpConst64)
29071 v.AuxInt = int64ToAuxInt(int64(uint64(c) >> uint64(d)))
29072 return true
29073 }
29074
29075
29076 for {
29077 x := v_0
29078 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
29079 break
29080 }
29081 v.copyOf(x)
29082 return true
29083 }
29084
29085
29086 for {
29087 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29088 break
29089 }
29090 v.reset(OpConst64)
29091 v.AuxInt = int64ToAuxInt(0)
29092 return true
29093 }
29094
29095
29096
29097 for {
29098 if v_1.Op != OpConst64 {
29099 break
29100 }
29101 c := auxIntToInt64(v_1.AuxInt)
29102 if !(uint64(c) >= 64) {
29103 break
29104 }
29105 v.reset(OpConst64)
29106 v.AuxInt = int64ToAuxInt(0)
29107 return true
29108 }
29109
29110
29111
29112 for {
29113 t := v.Type
29114 if v_0.Op != OpRsh64Ux64 {
29115 break
29116 }
29117 _ = v_0.Args[1]
29118 x := v_0.Args[0]
29119 v_0_1 := v_0.Args[1]
29120 if v_0_1.Op != OpConst64 {
29121 break
29122 }
29123 c := auxIntToInt64(v_0_1.AuxInt)
29124 if v_1.Op != OpConst64 {
29125 break
29126 }
29127 d := auxIntToInt64(v_1.AuxInt)
29128 if !(!uaddOvf(c, d)) {
29129 break
29130 }
29131 v.reset(OpRsh64Ux64)
29132 v0 := b.NewValue0(v.Pos, OpConst64, t)
29133 v0.AuxInt = int64ToAuxInt(c + d)
29134 v.AddArg2(x, v0)
29135 return true
29136 }
29137
29138
29139 for {
29140 if v_0.Op != OpRsh64x64 {
29141 break
29142 }
29143 x := v_0.Args[0]
29144 if v_1.Op != OpConst64 {
29145 break
29146 }
29147 t := v_1.Type
29148 if auxIntToInt64(v_1.AuxInt) != 63 {
29149 break
29150 }
29151 v.reset(OpRsh64Ux64)
29152 v0 := b.NewValue0(v.Pos, OpConst64, t)
29153 v0.AuxInt = int64ToAuxInt(63)
29154 v.AddArg2(x, v0)
29155 return true
29156 }
29157
29158
29159
29160 for {
29161 i := v_0
29162 if i.Op != OpLsh64x64 {
29163 break
29164 }
29165 _ = i.Args[1]
29166 x := i.Args[0]
29167 i_1 := i.Args[1]
29168 if i_1.Op != OpConst64 {
29169 break
29170 }
29171 c := auxIntToInt64(i_1.AuxInt)
29172 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
29173 break
29174 }
29175 v.reset(OpAnd64)
29176 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
29177 v0.AuxInt = int64ToAuxInt(int64(^uint64(0) >> c))
29178 v.AddArg2(x, v0)
29179 return true
29180 }
29181
29182
29183
29184 for {
29185 if v_0.Op != OpLsh64x64 {
29186 break
29187 }
29188 _ = v_0.Args[1]
29189 v_0_0 := v_0.Args[0]
29190 if v_0_0.Op != OpRsh64Ux64 {
29191 break
29192 }
29193 _ = v_0_0.Args[1]
29194 x := v_0_0.Args[0]
29195 v_0_0_1 := v_0_0.Args[1]
29196 if v_0_0_1.Op != OpConst64 {
29197 break
29198 }
29199 c1 := auxIntToInt64(v_0_0_1.AuxInt)
29200 v_0_1 := v_0.Args[1]
29201 if v_0_1.Op != OpConst64 {
29202 break
29203 }
29204 c2 := auxIntToInt64(v_0_1.AuxInt)
29205 if v_1.Op != OpConst64 {
29206 break
29207 }
29208 c3 := auxIntToInt64(v_1.AuxInt)
29209 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
29210 break
29211 }
29212 v.reset(OpRsh64Ux64)
29213 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
29214 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
29215 v.AddArg2(x, v0)
29216 return true
29217 }
29218
29219
29220 for {
29221 if v_0.Op != OpLsh64x64 {
29222 break
29223 }
29224 _ = v_0.Args[1]
29225 x := v_0.Args[0]
29226 v_0_1 := v_0.Args[1]
29227 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 56 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 56 {
29228 break
29229 }
29230 v.reset(OpZeroExt8to64)
29231 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.UInt8)
29232 v0.AddArg(x)
29233 v.AddArg(v0)
29234 return true
29235 }
29236
29237
29238 for {
29239 if v_0.Op != OpLsh64x64 {
29240 break
29241 }
29242 _ = v_0.Args[1]
29243 x := v_0.Args[0]
29244 v_0_1 := v_0.Args[1]
29245 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 48 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 48 {
29246 break
29247 }
29248 v.reset(OpZeroExt16to64)
29249 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.UInt16)
29250 v0.AddArg(x)
29251 v.AddArg(v0)
29252 return true
29253 }
29254
29255
29256 for {
29257 if v_0.Op != OpLsh64x64 {
29258 break
29259 }
29260 _ = v_0.Args[1]
29261 x := v_0.Args[0]
29262 v_0_1 := v_0.Args[1]
29263 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 32 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 32 {
29264 break
29265 }
29266 v.reset(OpZeroExt32to64)
29267 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.UInt32)
29268 v0.AddArg(x)
29269 v.AddArg(v0)
29270 return true
29271 }
29272
29273
29274
29275 for {
29276 if auxIntToBool(v.AuxInt) != false {
29277 break
29278 }
29279 x := v_0
29280 con := v_1
29281 if con.Op != OpConst64 {
29282 break
29283 }
29284 c := auxIntToInt64(con.AuxInt)
29285 if !(0 < c && c < 64) {
29286 break
29287 }
29288 v.reset(OpRsh64Ux64)
29289 v.AuxInt = boolToAuxInt(true)
29290 v.AddArg2(x, con)
29291 return true
29292 }
29293 return false
29294 }
29295 func rewriteValuegeneric_OpRsh64Ux8(v *Value) bool {
29296 v_1 := v.Args[1]
29297 v_0 := v.Args[0]
29298 b := v.Block
29299
29300
29301 for {
29302 t := v.Type
29303 x := v_0
29304 if v_1.Op != OpConst8 {
29305 break
29306 }
29307 c := auxIntToInt8(v_1.AuxInt)
29308 v.reset(OpRsh64Ux64)
29309 v0 := b.NewValue0(v.Pos, OpConst64, t)
29310 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
29311 v.AddArg2(x, v0)
29312 return true
29313 }
29314
29315
29316 for {
29317 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29318 break
29319 }
29320 v.reset(OpConst64)
29321 v.AuxInt = int64ToAuxInt(0)
29322 return true
29323 }
29324
29325
29326
29327 for {
29328 if auxIntToBool(v.AuxInt) != false {
29329 break
29330 }
29331 x := v_0
29332 con := v_1
29333 if con.Op != OpConst8 {
29334 break
29335 }
29336 c := auxIntToInt8(con.AuxInt)
29337 if !(0 < c && c < 64) {
29338 break
29339 }
29340 v.reset(OpRsh64Ux8)
29341 v.AuxInt = boolToAuxInt(true)
29342 v.AddArg2(x, con)
29343 return true
29344 }
29345 return false
29346 }
29347 func rewriteValuegeneric_OpRsh64x16(v *Value) bool {
29348 v_1 := v.Args[1]
29349 v_0 := v.Args[0]
29350 b := v.Block
29351
29352
29353 for {
29354 t := v.Type
29355 x := v_0
29356 if v_1.Op != OpConst16 {
29357 break
29358 }
29359 c := auxIntToInt16(v_1.AuxInt)
29360 v.reset(OpRsh64x64)
29361 v0 := b.NewValue0(v.Pos, OpConst64, t)
29362 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
29363 v.AddArg2(x, v0)
29364 return true
29365 }
29366
29367
29368 for {
29369 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29370 break
29371 }
29372 v.reset(OpConst64)
29373 v.AuxInt = int64ToAuxInt(0)
29374 return true
29375 }
29376
29377
29378
29379 for {
29380 if auxIntToBool(v.AuxInt) != false {
29381 break
29382 }
29383 x := v_0
29384 con := v_1
29385 if con.Op != OpConst16 {
29386 break
29387 }
29388 c := auxIntToInt16(con.AuxInt)
29389 if !(0 < c && c < 64) {
29390 break
29391 }
29392 v.reset(OpRsh64x16)
29393 v.AuxInt = boolToAuxInt(true)
29394 v.AddArg2(x, con)
29395 return true
29396 }
29397 return false
29398 }
29399 func rewriteValuegeneric_OpRsh64x32(v *Value) bool {
29400 v_1 := v.Args[1]
29401 v_0 := v.Args[0]
29402 b := v.Block
29403
29404
29405 for {
29406 t := v.Type
29407 x := v_0
29408 if v_1.Op != OpConst32 {
29409 break
29410 }
29411 c := auxIntToInt32(v_1.AuxInt)
29412 v.reset(OpRsh64x64)
29413 v0 := b.NewValue0(v.Pos, OpConst64, t)
29414 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
29415 v.AddArg2(x, v0)
29416 return true
29417 }
29418
29419
29420 for {
29421 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29422 break
29423 }
29424 v.reset(OpConst64)
29425 v.AuxInt = int64ToAuxInt(0)
29426 return true
29427 }
29428
29429
29430
29431 for {
29432 if auxIntToBool(v.AuxInt) != false {
29433 break
29434 }
29435 x := v_0
29436 con := v_1
29437 if con.Op != OpConst32 {
29438 break
29439 }
29440 c := auxIntToInt32(con.AuxInt)
29441 if !(0 < c && c < 64) {
29442 break
29443 }
29444 v.reset(OpRsh64x32)
29445 v.AuxInt = boolToAuxInt(true)
29446 v.AddArg2(x, con)
29447 return true
29448 }
29449 return false
29450 }
29451 func rewriteValuegeneric_OpRsh64x64(v *Value) bool {
29452 v_1 := v.Args[1]
29453 v_0 := v.Args[0]
29454 b := v.Block
29455 typ := &b.Func.Config.Types
29456
29457
29458 for {
29459 if v_0.Op != OpConst64 {
29460 break
29461 }
29462 c := auxIntToInt64(v_0.AuxInt)
29463 if v_1.Op != OpConst64 {
29464 break
29465 }
29466 d := auxIntToInt64(v_1.AuxInt)
29467 v.reset(OpConst64)
29468 v.AuxInt = int64ToAuxInt(c >> uint64(d))
29469 return true
29470 }
29471
29472
29473 for {
29474 x := v_0
29475 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
29476 break
29477 }
29478 v.copyOf(x)
29479 return true
29480 }
29481
29482
29483 for {
29484 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29485 break
29486 }
29487 v.reset(OpConst64)
29488 v.AuxInt = int64ToAuxInt(0)
29489 return true
29490 }
29491
29492
29493
29494 for {
29495 t := v.Type
29496 if v_0.Op != OpRsh64x64 {
29497 break
29498 }
29499 _ = v_0.Args[1]
29500 x := v_0.Args[0]
29501 v_0_1 := v_0.Args[1]
29502 if v_0_1.Op != OpConst64 {
29503 break
29504 }
29505 c := auxIntToInt64(v_0_1.AuxInt)
29506 if v_1.Op != OpConst64 {
29507 break
29508 }
29509 d := auxIntToInt64(v_1.AuxInt)
29510 if !(!uaddOvf(c, d)) {
29511 break
29512 }
29513 v.reset(OpRsh64x64)
29514 v0 := b.NewValue0(v.Pos, OpConst64, t)
29515 v0.AuxInt = int64ToAuxInt(c + d)
29516 v.AddArg2(x, v0)
29517 return true
29518 }
29519
29520
29521 for {
29522 if v_0.Op != OpLsh64x64 {
29523 break
29524 }
29525 _ = v_0.Args[1]
29526 x := v_0.Args[0]
29527 v_0_1 := v_0.Args[1]
29528 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 56 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 56 {
29529 break
29530 }
29531 v.reset(OpSignExt8to64)
29532 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.Int8)
29533 v0.AddArg(x)
29534 v.AddArg(v0)
29535 return true
29536 }
29537
29538
29539 for {
29540 if v_0.Op != OpLsh64x64 {
29541 break
29542 }
29543 _ = v_0.Args[1]
29544 x := v_0.Args[0]
29545 v_0_1 := v_0.Args[1]
29546 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 48 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 48 {
29547 break
29548 }
29549 v.reset(OpSignExt16to64)
29550 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.Int16)
29551 v0.AddArg(x)
29552 v.AddArg(v0)
29553 return true
29554 }
29555
29556
29557 for {
29558 if v_0.Op != OpLsh64x64 {
29559 break
29560 }
29561 _ = v_0.Args[1]
29562 x := v_0.Args[0]
29563 v_0_1 := v_0.Args[1]
29564 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 32 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 32 {
29565 break
29566 }
29567 v.reset(OpSignExt32to64)
29568 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.Int32)
29569 v0.AddArg(x)
29570 v.AddArg(v0)
29571 return true
29572 }
29573
29574
29575
29576 for {
29577 if auxIntToBool(v.AuxInt) != false {
29578 break
29579 }
29580 x := v_0
29581 con := v_1
29582 if con.Op != OpConst64 {
29583 break
29584 }
29585 c := auxIntToInt64(con.AuxInt)
29586 if !(0 < c && c < 64) {
29587 break
29588 }
29589 v.reset(OpRsh64x64)
29590 v.AuxInt = boolToAuxInt(true)
29591 v.AddArg2(x, con)
29592 return true
29593 }
29594 return false
29595 }
29596 func rewriteValuegeneric_OpRsh64x8(v *Value) bool {
29597 v_1 := v.Args[1]
29598 v_0 := v.Args[0]
29599 b := v.Block
29600
29601
29602 for {
29603 t := v.Type
29604 x := v_0
29605 if v_1.Op != OpConst8 {
29606 break
29607 }
29608 c := auxIntToInt8(v_1.AuxInt)
29609 v.reset(OpRsh64x64)
29610 v0 := b.NewValue0(v.Pos, OpConst64, t)
29611 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
29612 v.AddArg2(x, v0)
29613 return true
29614 }
29615
29616
29617 for {
29618 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29619 break
29620 }
29621 v.reset(OpConst64)
29622 v.AuxInt = int64ToAuxInt(0)
29623 return true
29624 }
29625
29626
29627
29628 for {
29629 if auxIntToBool(v.AuxInt) != false {
29630 break
29631 }
29632 x := v_0
29633 con := v_1
29634 if con.Op != OpConst8 {
29635 break
29636 }
29637 c := auxIntToInt8(con.AuxInt)
29638 if !(0 < c && c < 64) {
29639 break
29640 }
29641 v.reset(OpRsh64x8)
29642 v.AuxInt = boolToAuxInt(true)
29643 v.AddArg2(x, con)
29644 return true
29645 }
29646 return false
29647 }
29648 func rewriteValuegeneric_OpRsh8Ux16(v *Value) bool {
29649 v_1 := v.Args[1]
29650 v_0 := v.Args[0]
29651 b := v.Block
29652
29653
29654 for {
29655 t := v.Type
29656 x := v_0
29657 if v_1.Op != OpConst16 {
29658 break
29659 }
29660 c := auxIntToInt16(v_1.AuxInt)
29661 v.reset(OpRsh8Ux64)
29662 v0 := b.NewValue0(v.Pos, OpConst64, t)
29663 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
29664 v.AddArg2(x, v0)
29665 return true
29666 }
29667
29668
29669 for {
29670 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29671 break
29672 }
29673 v.reset(OpConst8)
29674 v.AuxInt = int8ToAuxInt(0)
29675 return true
29676 }
29677
29678
29679
29680 for {
29681 if auxIntToBool(v.AuxInt) != false {
29682 break
29683 }
29684 x := v_0
29685 con := v_1
29686 if con.Op != OpConst16 {
29687 break
29688 }
29689 c := auxIntToInt16(con.AuxInt)
29690 if !(0 < c && c < 8) {
29691 break
29692 }
29693 v.reset(OpRsh8Ux16)
29694 v.AuxInt = boolToAuxInt(true)
29695 v.AddArg2(x, con)
29696 return true
29697 }
29698 return false
29699 }
29700 func rewriteValuegeneric_OpRsh8Ux32(v *Value) bool {
29701 v_1 := v.Args[1]
29702 v_0 := v.Args[0]
29703 b := v.Block
29704
29705
29706 for {
29707 t := v.Type
29708 x := v_0
29709 if v_1.Op != OpConst32 {
29710 break
29711 }
29712 c := auxIntToInt32(v_1.AuxInt)
29713 v.reset(OpRsh8Ux64)
29714 v0 := b.NewValue0(v.Pos, OpConst64, t)
29715 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
29716 v.AddArg2(x, v0)
29717 return true
29718 }
29719
29720
29721 for {
29722 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29723 break
29724 }
29725 v.reset(OpConst8)
29726 v.AuxInt = int8ToAuxInt(0)
29727 return true
29728 }
29729
29730
29731
29732 for {
29733 if auxIntToBool(v.AuxInt) != false {
29734 break
29735 }
29736 x := v_0
29737 con := v_1
29738 if con.Op != OpConst32 {
29739 break
29740 }
29741 c := auxIntToInt32(con.AuxInt)
29742 if !(0 < c && c < 8) {
29743 break
29744 }
29745 v.reset(OpRsh8Ux32)
29746 v.AuxInt = boolToAuxInt(true)
29747 v.AddArg2(x, con)
29748 return true
29749 }
29750 return false
29751 }
29752 func rewriteValuegeneric_OpRsh8Ux64(v *Value) bool {
29753 v_1 := v.Args[1]
29754 v_0 := v.Args[0]
29755 b := v.Block
29756 typ := &b.Func.Config.Types
29757
29758
29759 for {
29760 if v_0.Op != OpConst8 {
29761 break
29762 }
29763 c := auxIntToInt8(v_0.AuxInt)
29764 if v_1.Op != OpConst64 {
29765 break
29766 }
29767 d := auxIntToInt64(v_1.AuxInt)
29768 v.reset(OpConst8)
29769 v.AuxInt = int8ToAuxInt(int8(uint8(c) >> uint64(d)))
29770 return true
29771 }
29772
29773
29774 for {
29775 x := v_0
29776 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
29777 break
29778 }
29779 v.copyOf(x)
29780 return true
29781 }
29782
29783
29784 for {
29785 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29786 break
29787 }
29788 v.reset(OpConst8)
29789 v.AuxInt = int8ToAuxInt(0)
29790 return true
29791 }
29792
29793
29794
29795 for {
29796 if v_1.Op != OpConst64 {
29797 break
29798 }
29799 c := auxIntToInt64(v_1.AuxInt)
29800 if !(uint64(c) >= 8) {
29801 break
29802 }
29803 v.reset(OpConst8)
29804 v.AuxInt = int8ToAuxInt(0)
29805 return true
29806 }
29807
29808
29809
29810 for {
29811 t := v.Type
29812 if v_0.Op != OpRsh8Ux64 {
29813 break
29814 }
29815 _ = v_0.Args[1]
29816 x := v_0.Args[0]
29817 v_0_1 := v_0.Args[1]
29818 if v_0_1.Op != OpConst64 {
29819 break
29820 }
29821 c := auxIntToInt64(v_0_1.AuxInt)
29822 if v_1.Op != OpConst64 {
29823 break
29824 }
29825 d := auxIntToInt64(v_1.AuxInt)
29826 if !(!uaddOvf(c, d)) {
29827 break
29828 }
29829 v.reset(OpRsh8Ux64)
29830 v0 := b.NewValue0(v.Pos, OpConst64, t)
29831 v0.AuxInt = int64ToAuxInt(c + d)
29832 v.AddArg2(x, v0)
29833 return true
29834 }
29835
29836
29837 for {
29838 if v_0.Op != OpRsh8x64 {
29839 break
29840 }
29841 x := v_0.Args[0]
29842 if v_1.Op != OpConst64 {
29843 break
29844 }
29845 t := v_1.Type
29846 if auxIntToInt64(v_1.AuxInt) != 7 {
29847 break
29848 }
29849 v.reset(OpRsh8Ux64)
29850 v0 := b.NewValue0(v.Pos, OpConst64, t)
29851 v0.AuxInt = int64ToAuxInt(7)
29852 v.AddArg2(x, v0)
29853 return true
29854 }
29855
29856
29857
29858 for {
29859 i := v_0
29860 if i.Op != OpLsh8x64 {
29861 break
29862 }
29863 _ = i.Args[1]
29864 x := i.Args[0]
29865 i_1 := i.Args[1]
29866 if i_1.Op != OpConst64 {
29867 break
29868 }
29869 c := auxIntToInt64(i_1.AuxInt)
29870 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
29871 break
29872 }
29873 v.reset(OpAnd8)
29874 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
29875 v0.AuxInt = int8ToAuxInt(int8(^uint8(0) >> c))
29876 v.AddArg2(x, v0)
29877 return true
29878 }
29879
29880
29881
29882 for {
29883 if v_0.Op != OpLsh8x64 {
29884 break
29885 }
29886 _ = v_0.Args[1]
29887 v_0_0 := v_0.Args[0]
29888 if v_0_0.Op != OpRsh8Ux64 {
29889 break
29890 }
29891 _ = v_0_0.Args[1]
29892 x := v_0_0.Args[0]
29893 v_0_0_1 := v_0_0.Args[1]
29894 if v_0_0_1.Op != OpConst64 {
29895 break
29896 }
29897 c1 := auxIntToInt64(v_0_0_1.AuxInt)
29898 v_0_1 := v_0.Args[1]
29899 if v_0_1.Op != OpConst64 {
29900 break
29901 }
29902 c2 := auxIntToInt64(v_0_1.AuxInt)
29903 if v_1.Op != OpConst64 {
29904 break
29905 }
29906 c3 := auxIntToInt64(v_1.AuxInt)
29907 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
29908 break
29909 }
29910 v.reset(OpRsh8Ux64)
29911 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
29912 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
29913 v.AddArg2(x, v0)
29914 return true
29915 }
29916
29917
29918
29919 for {
29920 if auxIntToBool(v.AuxInt) != false {
29921 break
29922 }
29923 x := v_0
29924 con := v_1
29925 if con.Op != OpConst64 {
29926 break
29927 }
29928 c := auxIntToInt64(con.AuxInt)
29929 if !(0 < c && c < 8) {
29930 break
29931 }
29932 v.reset(OpRsh8Ux64)
29933 v.AuxInt = boolToAuxInt(true)
29934 v.AddArg2(x, con)
29935 return true
29936 }
29937 return false
29938 }
29939 func rewriteValuegeneric_OpRsh8Ux8(v *Value) bool {
29940 v_1 := v.Args[1]
29941 v_0 := v.Args[0]
29942 b := v.Block
29943
29944
29945 for {
29946 t := v.Type
29947 x := v_0
29948 if v_1.Op != OpConst8 {
29949 break
29950 }
29951 c := auxIntToInt8(v_1.AuxInt)
29952 v.reset(OpRsh8Ux64)
29953 v0 := b.NewValue0(v.Pos, OpConst64, t)
29954 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
29955 v.AddArg2(x, v0)
29956 return true
29957 }
29958
29959
29960 for {
29961 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29962 break
29963 }
29964 v.reset(OpConst8)
29965 v.AuxInt = int8ToAuxInt(0)
29966 return true
29967 }
29968
29969
29970
29971 for {
29972 if auxIntToBool(v.AuxInt) != false {
29973 break
29974 }
29975 x := v_0
29976 con := v_1
29977 if con.Op != OpConst8 {
29978 break
29979 }
29980 c := auxIntToInt8(con.AuxInt)
29981 if !(0 < c && c < 8) {
29982 break
29983 }
29984 v.reset(OpRsh8Ux8)
29985 v.AuxInt = boolToAuxInt(true)
29986 v.AddArg2(x, con)
29987 return true
29988 }
29989 return false
29990 }
29991 func rewriteValuegeneric_OpRsh8x16(v *Value) bool {
29992 v_1 := v.Args[1]
29993 v_0 := v.Args[0]
29994 b := v.Block
29995
29996
29997 for {
29998 t := v.Type
29999 x := v_0
30000 if v_1.Op != OpConst16 {
30001 break
30002 }
30003 c := auxIntToInt16(v_1.AuxInt)
30004 v.reset(OpRsh8x64)
30005 v0 := b.NewValue0(v.Pos, OpConst64, t)
30006 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
30007 v.AddArg2(x, v0)
30008 return true
30009 }
30010
30011
30012 for {
30013 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
30014 break
30015 }
30016 v.reset(OpConst8)
30017 v.AuxInt = int8ToAuxInt(0)
30018 return true
30019 }
30020
30021
30022
30023 for {
30024 if auxIntToBool(v.AuxInt) != false {
30025 break
30026 }
30027 x := v_0
30028 con := v_1
30029 if con.Op != OpConst16 {
30030 break
30031 }
30032 c := auxIntToInt16(con.AuxInt)
30033 if !(0 < c && c < 8) {
30034 break
30035 }
30036 v.reset(OpRsh8x16)
30037 v.AuxInt = boolToAuxInt(true)
30038 v.AddArg2(x, con)
30039 return true
30040 }
30041 return false
30042 }
30043 func rewriteValuegeneric_OpRsh8x32(v *Value) bool {
30044 v_1 := v.Args[1]
30045 v_0 := v.Args[0]
30046 b := v.Block
30047
30048
30049 for {
30050 t := v.Type
30051 x := v_0
30052 if v_1.Op != OpConst32 {
30053 break
30054 }
30055 c := auxIntToInt32(v_1.AuxInt)
30056 v.reset(OpRsh8x64)
30057 v0 := b.NewValue0(v.Pos, OpConst64, t)
30058 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
30059 v.AddArg2(x, v0)
30060 return true
30061 }
30062
30063
30064 for {
30065 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
30066 break
30067 }
30068 v.reset(OpConst8)
30069 v.AuxInt = int8ToAuxInt(0)
30070 return true
30071 }
30072
30073
30074
30075 for {
30076 if auxIntToBool(v.AuxInt) != false {
30077 break
30078 }
30079 x := v_0
30080 con := v_1
30081 if con.Op != OpConst32 {
30082 break
30083 }
30084 c := auxIntToInt32(con.AuxInt)
30085 if !(0 < c && c < 8) {
30086 break
30087 }
30088 v.reset(OpRsh8x32)
30089 v.AuxInt = boolToAuxInt(true)
30090 v.AddArg2(x, con)
30091 return true
30092 }
30093 return false
30094 }
30095 func rewriteValuegeneric_OpRsh8x64(v *Value) bool {
30096 v_1 := v.Args[1]
30097 v_0 := v.Args[0]
30098 b := v.Block
30099
30100
30101 for {
30102 if v_0.Op != OpConst8 {
30103 break
30104 }
30105 c := auxIntToInt8(v_0.AuxInt)
30106 if v_1.Op != OpConst64 {
30107 break
30108 }
30109 d := auxIntToInt64(v_1.AuxInt)
30110 v.reset(OpConst8)
30111 v.AuxInt = int8ToAuxInt(c >> uint64(d))
30112 return true
30113 }
30114
30115
30116 for {
30117 x := v_0
30118 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
30119 break
30120 }
30121 v.copyOf(x)
30122 return true
30123 }
30124
30125
30126 for {
30127 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
30128 break
30129 }
30130 v.reset(OpConst8)
30131 v.AuxInt = int8ToAuxInt(0)
30132 return true
30133 }
30134
30135
30136
30137 for {
30138 t := v.Type
30139 if v_0.Op != OpRsh8x64 {
30140 break
30141 }
30142 _ = v_0.Args[1]
30143 x := v_0.Args[0]
30144 v_0_1 := v_0.Args[1]
30145 if v_0_1.Op != OpConst64 {
30146 break
30147 }
30148 c := auxIntToInt64(v_0_1.AuxInt)
30149 if v_1.Op != OpConst64 {
30150 break
30151 }
30152 d := auxIntToInt64(v_1.AuxInt)
30153 if !(!uaddOvf(c, d)) {
30154 break
30155 }
30156 v.reset(OpRsh8x64)
30157 v0 := b.NewValue0(v.Pos, OpConst64, t)
30158 v0.AuxInt = int64ToAuxInt(c + d)
30159 v.AddArg2(x, v0)
30160 return true
30161 }
30162
30163
30164
30165 for {
30166 if auxIntToBool(v.AuxInt) != false {
30167 break
30168 }
30169 x := v_0
30170 con := v_1
30171 if con.Op != OpConst64 {
30172 break
30173 }
30174 c := auxIntToInt64(con.AuxInt)
30175 if !(0 < c && c < 8) {
30176 break
30177 }
30178 v.reset(OpRsh8x64)
30179 v.AuxInt = boolToAuxInt(true)
30180 v.AddArg2(x, con)
30181 return true
30182 }
30183 return false
30184 }
30185 func rewriteValuegeneric_OpRsh8x8(v *Value) bool {
30186 v_1 := v.Args[1]
30187 v_0 := v.Args[0]
30188 b := v.Block
30189
30190
30191 for {
30192 t := v.Type
30193 x := v_0
30194 if v_1.Op != OpConst8 {
30195 break
30196 }
30197 c := auxIntToInt8(v_1.AuxInt)
30198 v.reset(OpRsh8x64)
30199 v0 := b.NewValue0(v.Pos, OpConst64, t)
30200 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
30201 v.AddArg2(x, v0)
30202 return true
30203 }
30204
30205
30206 for {
30207 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
30208 break
30209 }
30210 v.reset(OpConst8)
30211 v.AuxInt = int8ToAuxInt(0)
30212 return true
30213 }
30214
30215
30216
30217 for {
30218 if auxIntToBool(v.AuxInt) != false {
30219 break
30220 }
30221 x := v_0
30222 con := v_1
30223 if con.Op != OpConst8 {
30224 break
30225 }
30226 c := auxIntToInt8(con.AuxInt)
30227 if !(0 < c && c < 8) {
30228 break
30229 }
30230 v.reset(OpRsh8x8)
30231 v.AuxInt = boolToAuxInt(true)
30232 v.AddArg2(x, con)
30233 return true
30234 }
30235 return false
30236 }
30237 func rewriteValuegeneric_OpSelect0(v *Value) bool {
30238 v_0 := v.Args[0]
30239
30240
30241
30242 for {
30243 a := v_0
30244 if a.Op != OpAdd64carry {
30245 break
30246 }
30247 _ = a.Args[2]
30248 x := a.Args[0]
30249 y := a.Args[1]
30250 a_2 := a.Args[2]
30251 if a_2.Op != OpConst64 || auxIntToInt64(a_2.AuxInt) != 0 || !(a.Uses == 1) {
30252 break
30253 }
30254 v.reset(OpAdd64)
30255 v.AddArg2(x, y)
30256 return true
30257 }
30258
30259
30260 for {
30261 if v_0.Op != OpMakeTuple {
30262 break
30263 }
30264 x := v_0.Args[0]
30265 v.copyOf(x)
30266 return true
30267 }
30268 return false
30269 }
30270 func rewriteValuegeneric_OpSelect1(v *Value) bool {
30271 v_0 := v.Args[0]
30272
30273
30274 for {
30275 if v_0.Op != OpMakeTuple {
30276 break
30277 }
30278 y := v_0.Args[1]
30279 v.copyOf(y)
30280 return true
30281 }
30282 return false
30283 }
30284 func rewriteValuegeneric_OpSelectN(v *Value) bool {
30285 v_0 := v.Args[0]
30286 b := v.Block
30287 config := b.Func.Config
30288 typ := &b.Func.Config.Types
30289
30290
30291 for {
30292 n := auxIntToInt64(v.AuxInt)
30293 m := v_0
30294 if m.Op != OpMakeResult {
30295 break
30296 }
30297 v.copyOf(m.Args[n])
30298 return true
30299 }
30300
30301
30302
30303 for {
30304 if auxIntToInt64(v.AuxInt) != 0 {
30305 break
30306 }
30307 call := v_0
30308 if call.Op != OpStaticCall || len(call.Args) != 3 {
30309 break
30310 }
30311 sym := auxToCall(call.Aux)
30312 mem := call.Args[2]
30313 sptr := call.Args[0]
30314 call_1 := call.Args[1]
30315 if call_1.Op != OpConst64 {
30316 break
30317 }
30318 c := auxIntToInt64(call_1.AuxInt)
30319 if !(isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)) {
30320 break
30321 }
30322 v.reset(OpZero)
30323 v.AuxInt = int64ToAuxInt(int64(c))
30324 v.Aux = typeToAux(types.Types[types.TUINT8])
30325 v.AddArg2(sptr, mem)
30326 return true
30327 }
30328
30329
30330
30331 for {
30332 if auxIntToInt64(v.AuxInt) != 0 {
30333 break
30334 }
30335 call := v_0
30336 if call.Op != OpStaticCall || len(call.Args) != 3 {
30337 break
30338 }
30339 sym := auxToCall(call.Aux)
30340 mem := call.Args[2]
30341 sptr := call.Args[0]
30342 call_1 := call.Args[1]
30343 if call_1.Op != OpConst32 {
30344 break
30345 }
30346 c := auxIntToInt32(call_1.AuxInt)
30347 if !(isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)) {
30348 break
30349 }
30350 v.reset(OpZero)
30351 v.AuxInt = int64ToAuxInt(int64(c))
30352 v.Aux = typeToAux(types.Types[types.TUINT8])
30353 v.AddArg2(sptr, mem)
30354 return true
30355 }
30356
30357
30358
30359 for {
30360 if auxIntToInt64(v.AuxInt) != 0 {
30361 break
30362 }
30363 call := v_0
30364 if call.Op != OpStaticCall || len(call.Args) != 1 {
30365 break
30366 }
30367 sym := auxToCall(call.Aux)
30368 s1 := call.Args[0]
30369 if s1.Op != OpStore {
30370 break
30371 }
30372 _ = s1.Args[2]
30373 s1_1 := s1.Args[1]
30374 if s1_1.Op != OpConst64 {
30375 break
30376 }
30377 sz := auxIntToInt64(s1_1.AuxInt)
30378 s2 := s1.Args[2]
30379 if s2.Op != OpStore {
30380 break
30381 }
30382 _ = s2.Args[2]
30383 src := s2.Args[1]
30384 s3 := s2.Args[2]
30385 if s3.Op != OpStore {
30386 break
30387 }
30388 mem := s3.Args[2]
30389 dst := s3.Args[1]
30390 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)) {
30391 break
30392 }
30393 v.reset(OpMove)
30394 v.AuxInt = int64ToAuxInt(int64(sz))
30395 v.Aux = typeToAux(types.Types[types.TUINT8])
30396 v.AddArg3(dst, src, mem)
30397 return true
30398 }
30399
30400
30401
30402 for {
30403 if auxIntToInt64(v.AuxInt) != 0 {
30404 break
30405 }
30406 call := v_0
30407 if call.Op != OpStaticCall || len(call.Args) != 1 {
30408 break
30409 }
30410 sym := auxToCall(call.Aux)
30411 s1 := call.Args[0]
30412 if s1.Op != OpStore {
30413 break
30414 }
30415 _ = s1.Args[2]
30416 s1_1 := s1.Args[1]
30417 if s1_1.Op != OpConst32 {
30418 break
30419 }
30420 sz := auxIntToInt32(s1_1.AuxInt)
30421 s2 := s1.Args[2]
30422 if s2.Op != OpStore {
30423 break
30424 }
30425 _ = s2.Args[2]
30426 src := s2.Args[1]
30427 s3 := s2.Args[2]
30428 if s3.Op != OpStore {
30429 break
30430 }
30431 mem := s3.Args[2]
30432 dst := s3.Args[1]
30433 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)) {
30434 break
30435 }
30436 v.reset(OpMove)
30437 v.AuxInt = int64ToAuxInt(int64(sz))
30438 v.Aux = typeToAux(types.Types[types.TUINT8])
30439 v.AddArg3(dst, src, mem)
30440 return true
30441 }
30442
30443
30444
30445 for {
30446 if auxIntToInt64(v.AuxInt) != 0 {
30447 break
30448 }
30449 call := v_0
30450 if call.Op != OpStaticCall || len(call.Args) != 4 {
30451 break
30452 }
30453 sym := auxToCall(call.Aux)
30454 mem := call.Args[3]
30455 dst := call.Args[0]
30456 src := call.Args[1]
30457 call_2 := call.Args[2]
30458 if call_2.Op != OpConst64 {
30459 break
30460 }
30461 sz := auxIntToInt64(call_2.AuxInt)
30462 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
30463 break
30464 }
30465 v.reset(OpMove)
30466 v.AuxInt = int64ToAuxInt(int64(sz))
30467 v.Aux = typeToAux(types.Types[types.TUINT8])
30468 v.AddArg3(dst, src, mem)
30469 return true
30470 }
30471
30472
30473
30474 for {
30475 if auxIntToInt64(v.AuxInt) != 0 {
30476 break
30477 }
30478 call := v_0
30479 if call.Op != OpStaticCall || len(call.Args) != 4 {
30480 break
30481 }
30482 sym := auxToCall(call.Aux)
30483 mem := call.Args[3]
30484 dst := call.Args[0]
30485 src := call.Args[1]
30486 call_2 := call.Args[2]
30487 if call_2.Op != OpConst32 {
30488 break
30489 }
30490 sz := auxIntToInt32(call_2.AuxInt)
30491 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
30492 break
30493 }
30494 v.reset(OpMove)
30495 v.AuxInt = int64ToAuxInt(int64(sz))
30496 v.Aux = typeToAux(types.Types[types.TUINT8])
30497 v.AddArg3(dst, src, mem)
30498 return true
30499 }
30500
30501
30502
30503 for {
30504 if auxIntToInt64(v.AuxInt) != 0 {
30505 break
30506 }
30507 call := v_0
30508 if call.Op != OpStaticLECall || len(call.Args) != 4 {
30509 break
30510 }
30511 sym := auxToCall(call.Aux)
30512 mem := call.Args[3]
30513 dst := call.Args[0]
30514 src := call.Args[1]
30515 call_2 := call.Args[2]
30516 if call_2.Op != OpConst64 {
30517 break
30518 }
30519 sz := auxIntToInt64(call_2.AuxInt)
30520 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
30521 break
30522 }
30523 v.reset(OpMove)
30524 v.AuxInt = int64ToAuxInt(int64(sz))
30525 v.Aux = typeToAux(types.Types[types.TUINT8])
30526 v.AddArg3(dst, src, mem)
30527 return true
30528 }
30529
30530
30531
30532 for {
30533 if auxIntToInt64(v.AuxInt) != 0 {
30534 break
30535 }
30536 call := v_0
30537 if call.Op != OpStaticLECall || len(call.Args) != 4 {
30538 break
30539 }
30540 sym := auxToCall(call.Aux)
30541 mem := call.Args[3]
30542 dst := call.Args[0]
30543 src := call.Args[1]
30544 call_2 := call.Args[2]
30545 if call_2.Op != OpConst32 {
30546 break
30547 }
30548 sz := auxIntToInt32(call_2.AuxInt)
30549 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
30550 break
30551 }
30552 v.reset(OpMove)
30553 v.AuxInt = int64ToAuxInt(int64(sz))
30554 v.Aux = typeToAux(types.Types[types.TUINT8])
30555 v.AddArg3(dst, src, mem)
30556 return true
30557 }
30558
30559
30560
30561 for {
30562 if auxIntToInt64(v.AuxInt) != 0 {
30563 break
30564 }
30565 call := v_0
30566 if call.Op != OpStaticLECall || len(call.Args) != 2 {
30567 break
30568 }
30569 sym := auxToCall(call.Aux)
30570 x := call.Args[1]
30571 if !(needRaceCleanup(sym, call) && clobber(call)) {
30572 break
30573 }
30574 v.copyOf(x)
30575 return true
30576 }
30577
30578
30579
30580 for {
30581 if auxIntToInt64(v.AuxInt) != 0 {
30582 break
30583 }
30584 call := v_0
30585 if call.Op != OpStaticLECall || len(call.Args) != 1 {
30586 break
30587 }
30588 sym := auxToCall(call.Aux)
30589 x := call.Args[0]
30590 if !(needRaceCleanup(sym, call) && clobber(call)) {
30591 break
30592 }
30593 v.copyOf(x)
30594 return true
30595 }
30596
30597
30598
30599 for {
30600 if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpStaticCall || len(v_0.Args) != 6 {
30601 break
30602 }
30603 sym := auxToCall(v_0.Aux)
30604 _ = v_0.Args[1]
30605 newLen := v_0.Args[1]
30606 if newLen.Op != OpConst64 || !(v.Type.IsInteger() && (isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias"))) {
30607 break
30608 }
30609 v.copyOf(newLen)
30610 return true
30611 }
30612
30613
30614
30615 for {
30616 if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpStaticCall || len(v_0.Args) != 6 {
30617 break
30618 }
30619 sym := auxToCall(v_0.Aux)
30620 _ = v_0.Args[1]
30621 newLen := v_0.Args[1]
30622 if newLen.Op != OpConst32 || !(v.Type.IsInteger() && (isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias"))) {
30623 break
30624 }
30625 v.copyOf(newLen)
30626 return true
30627 }
30628
30629
30630
30631 for {
30632 if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpStaticLECall || len(v_0.Args) != 3 {
30633 break
30634 }
30635 f := auxToCall(v_0.Aux)
30636 _ = v_0.Args[2]
30637 x := v_0.Args[0]
30638 y := v_0.Args[1]
30639 v_0_2 := v_0.Args[2]
30640 if v_0_2.Op != OpSelectN || auxIntToInt64(v_0_2.AuxInt) != 1 {
30641 break
30642 }
30643 c := v_0_2.Args[0]
30644 if c.Op != OpStaticLECall || len(c.Args) != 3 {
30645 break
30646 }
30647 g := auxToCall(c.Aux)
30648 if x != c.Args[0] || y != c.Args[1] || !(isSameCall(f, "runtime.cmpstring") && isSameCall(g, "runtime.cmpstring")) {
30649 break
30650 }
30651 b = c.Block
30652 v0 := b.NewValue0(v.Pos, OpSelectN, typ.Int)
30653 v.copyOf(v0)
30654 v0.AuxInt = int64ToAuxInt(0)
30655 v0.AddArg(c)
30656 return true
30657 }
30658
30659
30660
30661 for {
30662 if auxIntToInt64(v.AuxInt) != 1 {
30663 break
30664 }
30665 c := v_0
30666 if c.Op != OpStaticLECall || len(c.Args) != 3 {
30667 break
30668 }
30669 f := auxToCall(c.Aux)
30670 mem := c.Args[2]
30671 if !(c.Uses == 1 && isSameCall(f, "runtime.cmpstring") && clobber(c)) {
30672 break
30673 }
30674 v.copyOf(mem)
30675 return true
30676 }
30677 return false
30678 }
30679 func rewriteValuegeneric_OpSignExt16to32(v *Value) bool {
30680 v_0 := v.Args[0]
30681
30682
30683 for {
30684 if v_0.Op != OpConst16 {
30685 break
30686 }
30687 c := auxIntToInt16(v_0.AuxInt)
30688 v.reset(OpConst32)
30689 v.AuxInt = int32ToAuxInt(int32(c))
30690 return true
30691 }
30692
30693
30694
30695 for {
30696 if v_0.Op != OpTrunc32to16 {
30697 break
30698 }
30699 x := v_0.Args[0]
30700 if x.Op != OpRsh32x64 {
30701 break
30702 }
30703 _ = x.Args[1]
30704 x_1 := x.Args[1]
30705 if x_1.Op != OpConst64 {
30706 break
30707 }
30708 s := auxIntToInt64(x_1.AuxInt)
30709 if !(s >= 16) {
30710 break
30711 }
30712 v.copyOf(x)
30713 return true
30714 }
30715 return false
30716 }
30717 func rewriteValuegeneric_OpSignExt16to64(v *Value) bool {
30718 v_0 := v.Args[0]
30719
30720
30721 for {
30722 if v_0.Op != OpConst16 {
30723 break
30724 }
30725 c := auxIntToInt16(v_0.AuxInt)
30726 v.reset(OpConst64)
30727 v.AuxInt = int64ToAuxInt(int64(c))
30728 return true
30729 }
30730
30731
30732
30733 for {
30734 if v_0.Op != OpTrunc64to16 {
30735 break
30736 }
30737 x := v_0.Args[0]
30738 if x.Op != OpRsh64x64 {
30739 break
30740 }
30741 _ = x.Args[1]
30742 x_1 := x.Args[1]
30743 if x_1.Op != OpConst64 {
30744 break
30745 }
30746 s := auxIntToInt64(x_1.AuxInt)
30747 if !(s >= 48) {
30748 break
30749 }
30750 v.copyOf(x)
30751 return true
30752 }
30753 return false
30754 }
30755 func rewriteValuegeneric_OpSignExt32to64(v *Value) bool {
30756 v_0 := v.Args[0]
30757
30758
30759 for {
30760 if v_0.Op != OpConst32 {
30761 break
30762 }
30763 c := auxIntToInt32(v_0.AuxInt)
30764 v.reset(OpConst64)
30765 v.AuxInt = int64ToAuxInt(int64(c))
30766 return true
30767 }
30768
30769
30770
30771 for {
30772 if v_0.Op != OpTrunc64to32 {
30773 break
30774 }
30775 x := v_0.Args[0]
30776 if x.Op != OpRsh64x64 {
30777 break
30778 }
30779 _ = x.Args[1]
30780 x_1 := x.Args[1]
30781 if x_1.Op != OpConst64 {
30782 break
30783 }
30784 s := auxIntToInt64(x_1.AuxInt)
30785 if !(s >= 32) {
30786 break
30787 }
30788 v.copyOf(x)
30789 return true
30790 }
30791 return false
30792 }
30793 func rewriteValuegeneric_OpSignExt8to16(v *Value) bool {
30794 v_0 := v.Args[0]
30795
30796
30797 for {
30798 if v_0.Op != OpConst8 {
30799 break
30800 }
30801 c := auxIntToInt8(v_0.AuxInt)
30802 v.reset(OpConst16)
30803 v.AuxInt = int16ToAuxInt(int16(c))
30804 return true
30805 }
30806
30807
30808
30809 for {
30810 if v_0.Op != OpTrunc16to8 {
30811 break
30812 }
30813 x := v_0.Args[0]
30814 if x.Op != OpRsh16x64 {
30815 break
30816 }
30817 _ = x.Args[1]
30818 x_1 := x.Args[1]
30819 if x_1.Op != OpConst64 {
30820 break
30821 }
30822 s := auxIntToInt64(x_1.AuxInt)
30823 if !(s >= 8) {
30824 break
30825 }
30826 v.copyOf(x)
30827 return true
30828 }
30829 return false
30830 }
30831 func rewriteValuegeneric_OpSignExt8to32(v *Value) bool {
30832 v_0 := v.Args[0]
30833
30834
30835 for {
30836 if v_0.Op != OpConst8 {
30837 break
30838 }
30839 c := auxIntToInt8(v_0.AuxInt)
30840 v.reset(OpConst32)
30841 v.AuxInt = int32ToAuxInt(int32(c))
30842 return true
30843 }
30844
30845
30846
30847 for {
30848 if v_0.Op != OpTrunc32to8 {
30849 break
30850 }
30851 x := v_0.Args[0]
30852 if x.Op != OpRsh32x64 {
30853 break
30854 }
30855 _ = x.Args[1]
30856 x_1 := x.Args[1]
30857 if x_1.Op != OpConst64 {
30858 break
30859 }
30860 s := auxIntToInt64(x_1.AuxInt)
30861 if !(s >= 24) {
30862 break
30863 }
30864 v.copyOf(x)
30865 return true
30866 }
30867 return false
30868 }
30869 func rewriteValuegeneric_OpSignExt8to64(v *Value) bool {
30870 v_0 := v.Args[0]
30871
30872
30873 for {
30874 if v_0.Op != OpConst8 {
30875 break
30876 }
30877 c := auxIntToInt8(v_0.AuxInt)
30878 v.reset(OpConst64)
30879 v.AuxInt = int64ToAuxInt(int64(c))
30880 return true
30881 }
30882
30883
30884
30885 for {
30886 if v_0.Op != OpTrunc64to8 {
30887 break
30888 }
30889 x := v_0.Args[0]
30890 if x.Op != OpRsh64x64 {
30891 break
30892 }
30893 _ = x.Args[1]
30894 x_1 := x.Args[1]
30895 if x_1.Op != OpConst64 {
30896 break
30897 }
30898 s := auxIntToInt64(x_1.AuxInt)
30899 if !(s >= 56) {
30900 break
30901 }
30902 v.copyOf(x)
30903 return true
30904 }
30905 return false
30906 }
30907 func rewriteValuegeneric_OpSliceCap(v *Value) bool {
30908 v_0 := v.Args[0]
30909
30910
30911 for {
30912 if v_0.Op != OpSliceMake {
30913 break
30914 }
30915 _ = v_0.Args[2]
30916 v_0_2 := v_0.Args[2]
30917 if v_0_2.Op != OpConst64 {
30918 break
30919 }
30920 t := v_0_2.Type
30921 c := auxIntToInt64(v_0_2.AuxInt)
30922 v.reset(OpConst64)
30923 v.Type = t
30924 v.AuxInt = int64ToAuxInt(c)
30925 return true
30926 }
30927
30928
30929 for {
30930 if v_0.Op != OpSliceMake {
30931 break
30932 }
30933 _ = v_0.Args[2]
30934 v_0_2 := v_0.Args[2]
30935 if v_0_2.Op != OpConst32 {
30936 break
30937 }
30938 t := v_0_2.Type
30939 c := auxIntToInt32(v_0_2.AuxInt)
30940 v.reset(OpConst32)
30941 v.Type = t
30942 v.AuxInt = int32ToAuxInt(c)
30943 return true
30944 }
30945
30946
30947 for {
30948 if v_0.Op != OpSliceMake {
30949 break
30950 }
30951 _ = v_0.Args[2]
30952 v_0_2 := v_0.Args[2]
30953 if v_0_2.Op != OpSliceCap {
30954 break
30955 }
30956 x := v_0_2.Args[0]
30957 v.reset(OpSliceCap)
30958 v.AddArg(x)
30959 return true
30960 }
30961
30962
30963 for {
30964 if v_0.Op != OpSliceMake {
30965 break
30966 }
30967 _ = v_0.Args[2]
30968 v_0_2 := v_0.Args[2]
30969 if v_0_2.Op != OpSliceLen {
30970 break
30971 }
30972 x := v_0_2.Args[0]
30973 v.reset(OpSliceLen)
30974 v.AddArg(x)
30975 return true
30976 }
30977
30978
30979 for {
30980 if v_0.Op != OpPhi || len(v_0.Args) != 2 {
30981 break
30982 }
30983 _ = v_0.Args[1]
30984 v_0_0 := v_0.Args[0]
30985 if v_0_0.Op != OpSliceMake {
30986 break
30987 }
30988 x := v_0_0.Args[2]
30989 v_0_1 := v_0.Args[1]
30990 if v_0_1.Op != OpSliceMake {
30991 break
30992 }
30993 _ = v_0_1.Args[2]
30994 if x != v_0_1.Args[2] {
30995 break
30996 }
30997 v.copyOf(x)
30998 return true
30999 }
31000 return false
31001 }
31002 func rewriteValuegeneric_OpSliceLen(v *Value) bool {
31003 v_0 := v.Args[0]
31004
31005
31006 for {
31007 if v_0.Op != OpSliceMake {
31008 break
31009 }
31010 _ = v_0.Args[1]
31011 v_0_1 := v_0.Args[1]
31012 if v_0_1.Op != OpConst64 {
31013 break
31014 }
31015 t := v_0_1.Type
31016 c := auxIntToInt64(v_0_1.AuxInt)
31017 v.reset(OpConst64)
31018 v.Type = t
31019 v.AuxInt = int64ToAuxInt(c)
31020 return true
31021 }
31022
31023
31024 for {
31025 if v_0.Op != OpSliceMake {
31026 break
31027 }
31028 _ = v_0.Args[1]
31029 v_0_1 := v_0.Args[1]
31030 if v_0_1.Op != OpConst32 {
31031 break
31032 }
31033 t := v_0_1.Type
31034 c := auxIntToInt32(v_0_1.AuxInt)
31035 v.reset(OpConst32)
31036 v.Type = t
31037 v.AuxInt = int32ToAuxInt(c)
31038 return true
31039 }
31040
31041
31042 for {
31043 if v_0.Op != OpSliceMake {
31044 break
31045 }
31046 _ = v_0.Args[1]
31047 v_0_1 := v_0.Args[1]
31048 if v_0_1.Op != OpSliceLen {
31049 break
31050 }
31051 x := v_0_1.Args[0]
31052 v.reset(OpSliceLen)
31053 v.AddArg(x)
31054 return true
31055 }
31056
31057
31058 for {
31059 if v_0.Op != OpPhi || len(v_0.Args) != 2 {
31060 break
31061 }
31062 _ = v_0.Args[1]
31063 v_0_0 := v_0.Args[0]
31064 if v_0_0.Op != OpSliceMake {
31065 break
31066 }
31067 x := v_0_0.Args[1]
31068 v_0_1 := v_0.Args[1]
31069 if v_0_1.Op != OpSliceMake {
31070 break
31071 }
31072 _ = v_0_1.Args[1]
31073 if x != v_0_1.Args[1] {
31074 break
31075 }
31076 v.copyOf(x)
31077 return true
31078 }
31079
31080
31081
31082 for {
31083 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
31084 break
31085 }
31086 v_0_0 := v_0.Args[0]
31087 if v_0_0.Op != OpStaticLECall || len(v_0_0.Args) != 6 {
31088 break
31089 }
31090 sym := auxToCall(v_0_0.Aux)
31091 _ = v_0_0.Args[1]
31092 newLen := v_0_0.Args[1]
31093 if newLen.Op != OpConst64 || !(isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias")) {
31094 break
31095 }
31096 v.copyOf(newLen)
31097 return true
31098 }
31099
31100
31101
31102 for {
31103 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
31104 break
31105 }
31106 v_0_0 := v_0.Args[0]
31107 if v_0_0.Op != OpStaticLECall || len(v_0_0.Args) != 6 {
31108 break
31109 }
31110 sym := auxToCall(v_0_0.Aux)
31111 _ = v_0_0.Args[1]
31112 newLen := v_0_0.Args[1]
31113 if newLen.Op != OpConst32 || !(isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias")) {
31114 break
31115 }
31116 v.copyOf(newLen)
31117 return true
31118 }
31119 return false
31120 }
31121 func rewriteValuegeneric_OpSliceMake(v *Value) bool {
31122 v_2 := v.Args[2]
31123 v_1 := v.Args[1]
31124 v_0 := v.Args[0]
31125 b := v.Block
31126
31127
31128
31129 for {
31130 if v_0.Op != OpAddPtr {
31131 break
31132 }
31133 t := v_0.Type
31134 _ = v_0.Args[1]
31135 x := v_0.Args[0]
31136 v_0_1 := v_0.Args[1]
31137 if v_0_1.Op != OpAnd64 {
31138 break
31139 }
31140 _ = v_0_1.Args[1]
31141 v_0_1_0 := v_0_1.Args[0]
31142 v_0_1_1 := v_0_1.Args[1]
31143 for _i0 := 0; _i0 <= 1; _i0, v_0_1_0, v_0_1_1 = _i0+1, v_0_1_1, v_0_1_0 {
31144 y := v_0_1_0
31145 if v_0_1_1.Op != OpSlicemask {
31146 continue
31147 }
31148 w := v_1
31149 if w.Op != OpConst64 {
31150 continue
31151 }
31152 c := auxIntToInt64(w.AuxInt)
31153 z := v_2
31154 if !(c > 0) {
31155 continue
31156 }
31157 v.reset(OpSliceMake)
31158 v0 := b.NewValue0(v.Pos, OpAddPtr, t)
31159 v0.AddArg2(x, y)
31160 v.AddArg3(v0, w, z)
31161 return true
31162 }
31163 break
31164 }
31165
31166
31167
31168 for {
31169 if v_0.Op != OpAddPtr {
31170 break
31171 }
31172 t := v_0.Type
31173 _ = v_0.Args[1]
31174 x := v_0.Args[0]
31175 v_0_1 := v_0.Args[1]
31176 if v_0_1.Op != OpAnd32 {
31177 break
31178 }
31179 _ = v_0_1.Args[1]
31180 v_0_1_0 := v_0_1.Args[0]
31181 v_0_1_1 := v_0_1.Args[1]
31182 for _i0 := 0; _i0 <= 1; _i0, v_0_1_0, v_0_1_1 = _i0+1, v_0_1_1, v_0_1_0 {
31183 y := v_0_1_0
31184 if v_0_1_1.Op != OpSlicemask {
31185 continue
31186 }
31187 w := v_1
31188 if w.Op != OpConst32 {
31189 continue
31190 }
31191 c := auxIntToInt32(w.AuxInt)
31192 z := v_2
31193 if !(c > 0) {
31194 continue
31195 }
31196 v.reset(OpSliceMake)
31197 v0 := b.NewValue0(v.Pos, OpAddPtr, t)
31198 v0.AddArg2(x, y)
31199 v.AddArg3(v0, w, z)
31200 return true
31201 }
31202 break
31203 }
31204 return false
31205 }
31206 func rewriteValuegeneric_OpSlicePtr(v *Value) bool {
31207 v_0 := v.Args[0]
31208
31209
31210 for {
31211 if v_0.Op != OpSliceMake {
31212 break
31213 }
31214 v_0_0 := v_0.Args[0]
31215 if v_0_0.Op != OpSlicePtr {
31216 break
31217 }
31218 x := v_0_0.Args[0]
31219 v.reset(OpSlicePtr)
31220 v.AddArg(x)
31221 return true
31222 }
31223 return false
31224 }
31225 func rewriteValuegeneric_OpSlicemask(v *Value) bool {
31226 v_0 := v.Args[0]
31227
31228
31229
31230 for {
31231 if v_0.Op != OpConst32 {
31232 break
31233 }
31234 x := auxIntToInt32(v_0.AuxInt)
31235 if !(x > 0) {
31236 break
31237 }
31238 v.reset(OpConst32)
31239 v.AuxInt = int32ToAuxInt(-1)
31240 return true
31241 }
31242
31243
31244 for {
31245 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
31246 break
31247 }
31248 v.reset(OpConst32)
31249 v.AuxInt = int32ToAuxInt(0)
31250 return true
31251 }
31252
31253
31254
31255 for {
31256 if v_0.Op != OpConst64 {
31257 break
31258 }
31259 x := auxIntToInt64(v_0.AuxInt)
31260 if !(x > 0) {
31261 break
31262 }
31263 v.reset(OpConst64)
31264 v.AuxInt = int64ToAuxInt(-1)
31265 return true
31266 }
31267
31268
31269 for {
31270 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
31271 break
31272 }
31273 v.reset(OpConst64)
31274 v.AuxInt = int64ToAuxInt(0)
31275 return true
31276 }
31277 return false
31278 }
31279 func rewriteValuegeneric_OpSqrt(v *Value) bool {
31280 v_0 := v.Args[0]
31281
31282
31283
31284 for {
31285 if v_0.Op != OpConst64F {
31286 break
31287 }
31288 c := auxIntToFloat64(v_0.AuxInt)
31289 if !(!math.IsNaN(math.Sqrt(c))) {
31290 break
31291 }
31292 v.reset(OpConst64F)
31293 v.AuxInt = float64ToAuxInt(math.Sqrt(c))
31294 return true
31295 }
31296 return false
31297 }
31298 func rewriteValuegeneric_OpStaticCall(v *Value) bool {
31299 b := v.Block
31300 typ := &b.Func.Config.Types
31301
31302
31303
31304 for {
31305 if len(v.Args) != 4 {
31306 break
31307 }
31308 callAux := auxToCall(v.Aux)
31309 mem := v.Args[3]
31310 p := v.Args[0]
31311 q := v.Args[1]
31312 if !(isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)) {
31313 break
31314 }
31315 v.reset(OpMakeResult)
31316 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
31317 v0.AuxInt = boolToAuxInt(true)
31318 v.AddArg2(v0, mem)
31319 return true
31320 }
31321 return false
31322 }
31323 func rewriteValuegeneric_OpStaticLECall(v *Value) bool {
31324 b := v.Block
31325 config := b.Func.Config
31326 typ := &b.Func.Config.Types
31327
31328
31329
31330 for {
31331 if len(v.Args) != 4 {
31332 break
31333 }
31334 callAux := auxToCall(v.Aux)
31335 mem := v.Args[3]
31336 sptr := v.Args[0]
31337 v_1 := v.Args[1]
31338 if v_1.Op != OpAddr {
31339 break
31340 }
31341 scon := auxToSym(v_1.Aux)
31342 v_1_0 := v_1.Args[0]
31343 if v_1_0.Op != OpSB {
31344 break
31345 }
31346 v_2 := v.Args[2]
31347 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon)) {
31348 break
31349 }
31350 v.reset(OpMakeResult)
31351 v0 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
31352 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
31353 v1.AddArg2(sptr, mem)
31354 v2 := b.NewValue0(v.Pos, OpConst8, typ.Int8)
31355 v2.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
31356 v0.AddArg2(v1, v2)
31357 v.AddArg2(v0, mem)
31358 return true
31359 }
31360
31361
31362
31363 for {
31364 if len(v.Args) != 4 {
31365 break
31366 }
31367 callAux := auxToCall(v.Aux)
31368 mem := v.Args[3]
31369 v_0 := v.Args[0]
31370 if v_0.Op != OpAddr {
31371 break
31372 }
31373 scon := auxToSym(v_0.Aux)
31374 v_0_0 := v_0.Args[0]
31375 if v_0_0.Op != OpSB {
31376 break
31377 }
31378 sptr := v.Args[1]
31379 v_2 := v.Args[2]
31380 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon)) {
31381 break
31382 }
31383 v.reset(OpMakeResult)
31384 v0 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
31385 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
31386 v1.AddArg2(sptr, mem)
31387 v2 := b.NewValue0(v.Pos, OpConst8, typ.Int8)
31388 v2.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
31389 v0.AddArg2(v1, v2)
31390 v.AddArg2(v0, mem)
31391 return true
31392 }
31393
31394
31395
31396 for {
31397 if len(v.Args) != 4 {
31398 break
31399 }
31400 callAux := auxToCall(v.Aux)
31401 mem := v.Args[3]
31402 sptr := v.Args[0]
31403 v_1 := v.Args[1]
31404 if v_1.Op != OpAddr {
31405 break
31406 }
31407 scon := auxToSym(v_1.Aux)
31408 v_1_0 := v_1.Args[0]
31409 if v_1_0.Op != OpSB {
31410 break
31411 }
31412 v_2 := v.Args[2]
31413 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
31414 break
31415 }
31416 v.reset(OpMakeResult)
31417 v0 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
31418 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
31419 v1.AddArg2(sptr, mem)
31420 v2 := b.NewValue0(v.Pos, OpConst16, typ.Int16)
31421 v2.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
31422 v0.AddArg2(v1, v2)
31423 v.AddArg2(v0, mem)
31424 return true
31425 }
31426
31427
31428
31429 for {
31430 if len(v.Args) != 4 {
31431 break
31432 }
31433 callAux := auxToCall(v.Aux)
31434 mem := v.Args[3]
31435 v_0 := v.Args[0]
31436 if v_0.Op != OpAddr {
31437 break
31438 }
31439 scon := auxToSym(v_0.Aux)
31440 v_0_0 := v_0.Args[0]
31441 if v_0_0.Op != OpSB {
31442 break
31443 }
31444 sptr := v.Args[1]
31445 v_2 := v.Args[2]
31446 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
31447 break
31448 }
31449 v.reset(OpMakeResult)
31450 v0 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
31451 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
31452 v1.AddArg2(sptr, mem)
31453 v2 := b.NewValue0(v.Pos, OpConst16, typ.Int16)
31454 v2.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
31455 v0.AddArg2(v1, v2)
31456 v.AddArg2(v0, mem)
31457 return true
31458 }
31459
31460
31461
31462 for {
31463 if len(v.Args) != 4 {
31464 break
31465 }
31466 callAux := auxToCall(v.Aux)
31467 mem := v.Args[3]
31468 sptr := v.Args[0]
31469 v_1 := v.Args[1]
31470 if v_1.Op != OpAddr {
31471 break
31472 }
31473 scon := auxToSym(v_1.Aux)
31474 v_1_0 := v_1.Args[0]
31475 if v_1_0.Op != OpSB {
31476 break
31477 }
31478 v_2 := v.Args[2]
31479 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
31480 break
31481 }
31482 v.reset(OpMakeResult)
31483 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
31484 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31485 v1.AddArg2(sptr, mem)
31486 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
31487 v2.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
31488 v0.AddArg2(v1, v2)
31489 v.AddArg2(v0, mem)
31490 return true
31491 }
31492
31493
31494
31495 for {
31496 if len(v.Args) != 4 {
31497 break
31498 }
31499 callAux := auxToCall(v.Aux)
31500 mem := v.Args[3]
31501 v_0 := v.Args[0]
31502 if v_0.Op != OpAddr {
31503 break
31504 }
31505 scon := auxToSym(v_0.Aux)
31506 v_0_0 := v_0.Args[0]
31507 if v_0_0.Op != OpSB {
31508 break
31509 }
31510 sptr := v.Args[1]
31511 v_2 := v.Args[2]
31512 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
31513 break
31514 }
31515 v.reset(OpMakeResult)
31516 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
31517 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31518 v1.AddArg2(sptr, mem)
31519 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
31520 v2.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
31521 v0.AddArg2(v1, v2)
31522 v.AddArg2(v0, mem)
31523 return true
31524 }
31525
31526
31527
31528 for {
31529 if len(v.Args) != 4 {
31530 break
31531 }
31532 callAux := auxToCall(v.Aux)
31533 mem := v.Args[3]
31534 sptr := v.Args[0]
31535 v_1 := v.Args[1]
31536 if v_1.Op != OpAddr {
31537 break
31538 }
31539 scon := auxToSym(v_1.Aux)
31540 v_1_0 := v_1.Args[0]
31541 if v_1_0.Op != OpSB {
31542 break
31543 }
31544 v_2 := v.Args[2]
31545 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31546 break
31547 }
31548 v.reset(OpMakeResult)
31549 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31550 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
31551 v1.AddArg2(sptr, mem)
31552 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31553 v2.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
31554 v0.AddArg2(v1, v2)
31555 v.AddArg2(v0, mem)
31556 return true
31557 }
31558
31559
31560
31561 for {
31562 if len(v.Args) != 4 {
31563 break
31564 }
31565 callAux := auxToCall(v.Aux)
31566 mem := v.Args[3]
31567 v_0 := v.Args[0]
31568 if v_0.Op != OpAddr {
31569 break
31570 }
31571 scon := auxToSym(v_0.Aux)
31572 v_0_0 := v_0.Args[0]
31573 if v_0_0.Op != OpSB {
31574 break
31575 }
31576 sptr := v.Args[1]
31577 v_2 := v.Args[2]
31578 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31579 break
31580 }
31581 v.reset(OpMakeResult)
31582 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31583 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
31584 v1.AddArg2(sptr, mem)
31585 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31586 v2.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
31587 v0.AddArg2(v1, v2)
31588 v.AddArg2(v0, mem)
31589 return true
31590 }
31591
31592
31593
31594 for {
31595 if len(v.Args) != 4 {
31596 break
31597 }
31598 callAux := auxToCall(v.Aux)
31599 mem := v.Args[3]
31600 sptr := v.Args[0]
31601 v_1 := v.Args[1]
31602 if v_1.Op != OpAddr {
31603 break
31604 }
31605 scon := auxToSym(v_1.Aux)
31606 v_1_0 := v_1.Args[0]
31607 if v_1_0.Op != OpSB {
31608 break
31609 }
31610 v_2 := v.Args[2]
31611 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 3 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
31612 break
31613 }
31614 v.reset(OpMakeResult)
31615 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
31616 v1 := b.NewValue0(v.Pos, OpOr32, typ.Int32)
31617 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.Int32)
31618 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
31619 v3.AddArg2(sptr, mem)
31620 v2.AddArg(v3)
31621 v4 := b.NewValue0(v.Pos, OpLsh32x32, typ.Int32)
31622 v5 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.Int32)
31623 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
31624 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31625 v7.AuxInt = int64ToAuxInt(2)
31626 v7.AddArg(sptr)
31627 v6.AddArg2(v7, mem)
31628 v5.AddArg(v6)
31629 v8 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
31630 v8.AuxInt = int32ToAuxInt(16)
31631 v4.AddArg2(v5, v8)
31632 v1.AddArg2(v2, v4)
31633 v9 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
31634 v9.AuxInt = int32ToAuxInt(int32(uint32(read16(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint32(read8(scon, 2)) << 16)))
31635 v0.AddArg2(v1, v9)
31636 v.AddArg2(v0, mem)
31637 return true
31638 }
31639
31640
31641
31642 for {
31643 if len(v.Args) != 4 {
31644 break
31645 }
31646 callAux := auxToCall(v.Aux)
31647 mem := v.Args[3]
31648 v_0 := v.Args[0]
31649 if v_0.Op != OpAddr {
31650 break
31651 }
31652 scon := auxToSym(v_0.Aux)
31653 v_0_0 := v_0.Args[0]
31654 if v_0_0.Op != OpSB {
31655 break
31656 }
31657 sptr := v.Args[1]
31658 v_2 := v.Args[2]
31659 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 3 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
31660 break
31661 }
31662 v.reset(OpMakeResult)
31663 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
31664 v1 := b.NewValue0(v.Pos, OpOr32, typ.Int32)
31665 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.Int32)
31666 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
31667 v3.AddArg2(sptr, mem)
31668 v2.AddArg(v3)
31669 v4 := b.NewValue0(v.Pos, OpLsh32x32, typ.Int32)
31670 v5 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.Int32)
31671 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
31672 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31673 v7.AuxInt = int64ToAuxInt(2)
31674 v7.AddArg(sptr)
31675 v6.AddArg2(v7, mem)
31676 v5.AddArg(v6)
31677 v8 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
31678 v8.AuxInt = int32ToAuxInt(16)
31679 v4.AddArg2(v5, v8)
31680 v1.AddArg2(v2, v4)
31681 v9 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
31682 v9.AuxInt = int32ToAuxInt(int32(uint32(read16(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint32(read8(scon, 2)) << 16)))
31683 v0.AddArg2(v1, v9)
31684 v.AddArg2(v0, mem)
31685 return true
31686 }
31687
31688
31689
31690 for {
31691 if len(v.Args) != 4 {
31692 break
31693 }
31694 callAux := auxToCall(v.Aux)
31695 mem := v.Args[3]
31696 sptr := v.Args[0]
31697 v_1 := v.Args[1]
31698 if v_1.Op != OpAddr {
31699 break
31700 }
31701 scon := auxToSym(v_1.Aux)
31702 v_1_0 := v_1.Args[0]
31703 if v_1_0.Op != OpSB {
31704 break
31705 }
31706 v_2 := v.Args[2]
31707 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 5 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31708 break
31709 }
31710 v.reset(OpMakeResult)
31711 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31712 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
31713 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31714 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31715 v3.AddArg2(sptr, mem)
31716 v2.AddArg(v3)
31717 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
31718 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.Int64)
31719 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
31720 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31721 v7.AuxInt = int64ToAuxInt(4)
31722 v7.AddArg(sptr)
31723 v6.AddArg2(v7, mem)
31724 v5.AddArg(v6)
31725 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31726 v8.AuxInt = int64ToAuxInt(32)
31727 v4.AddArg2(v5, v8)
31728 v1.AddArg2(v2, v4)
31729 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31730 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read8(scon, 4)) << 32)))
31731 v0.AddArg2(v1, v9)
31732 v.AddArg2(v0, mem)
31733 return true
31734 }
31735
31736
31737
31738 for {
31739 if len(v.Args) != 4 {
31740 break
31741 }
31742 callAux := auxToCall(v.Aux)
31743 mem := v.Args[3]
31744 v_0 := v.Args[0]
31745 if v_0.Op != OpAddr {
31746 break
31747 }
31748 scon := auxToSym(v_0.Aux)
31749 v_0_0 := v_0.Args[0]
31750 if v_0_0.Op != OpSB {
31751 break
31752 }
31753 sptr := v.Args[1]
31754 v_2 := v.Args[2]
31755 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 5 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31756 break
31757 }
31758 v.reset(OpMakeResult)
31759 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31760 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
31761 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31762 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31763 v3.AddArg2(sptr, mem)
31764 v2.AddArg(v3)
31765 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
31766 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.Int64)
31767 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
31768 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31769 v7.AuxInt = int64ToAuxInt(4)
31770 v7.AddArg(sptr)
31771 v6.AddArg2(v7, mem)
31772 v5.AddArg(v6)
31773 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31774 v8.AuxInt = int64ToAuxInt(32)
31775 v4.AddArg2(v5, v8)
31776 v1.AddArg2(v2, v4)
31777 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31778 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read8(scon, 4)) << 32)))
31779 v0.AddArg2(v1, v9)
31780 v.AddArg2(v0, mem)
31781 return true
31782 }
31783
31784
31785
31786 for {
31787 if len(v.Args) != 4 {
31788 break
31789 }
31790 callAux := auxToCall(v.Aux)
31791 mem := v.Args[3]
31792 sptr := v.Args[0]
31793 v_1 := v.Args[1]
31794 if v_1.Op != OpAddr {
31795 break
31796 }
31797 scon := auxToSym(v_1.Aux)
31798 v_1_0 := v_1.Args[0]
31799 if v_1_0.Op != OpSB {
31800 break
31801 }
31802 v_2 := v.Args[2]
31803 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 6 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31804 break
31805 }
31806 v.reset(OpMakeResult)
31807 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31808 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
31809 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31810 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31811 v3.AddArg2(sptr, mem)
31812 v2.AddArg(v3)
31813 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
31814 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.Int64)
31815 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
31816 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31817 v7.AuxInt = int64ToAuxInt(4)
31818 v7.AddArg(sptr)
31819 v6.AddArg2(v7, mem)
31820 v5.AddArg(v6)
31821 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31822 v8.AuxInt = int64ToAuxInt(32)
31823 v4.AddArg2(v5, v8)
31824 v1.AddArg2(v2, v4)
31825 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31826 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read16(scon, 4, config.ctxt.Arch.ByteOrder)) << 32)))
31827 v0.AddArg2(v1, v9)
31828 v.AddArg2(v0, mem)
31829 return true
31830 }
31831
31832
31833
31834 for {
31835 if len(v.Args) != 4 {
31836 break
31837 }
31838 callAux := auxToCall(v.Aux)
31839 mem := v.Args[3]
31840 v_0 := v.Args[0]
31841 if v_0.Op != OpAddr {
31842 break
31843 }
31844 scon := auxToSym(v_0.Aux)
31845 v_0_0 := v_0.Args[0]
31846 if v_0_0.Op != OpSB {
31847 break
31848 }
31849 sptr := v.Args[1]
31850 v_2 := v.Args[2]
31851 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 6 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31852 break
31853 }
31854 v.reset(OpMakeResult)
31855 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31856 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
31857 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31858 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31859 v3.AddArg2(sptr, mem)
31860 v2.AddArg(v3)
31861 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
31862 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.Int64)
31863 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
31864 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31865 v7.AuxInt = int64ToAuxInt(4)
31866 v7.AddArg(sptr)
31867 v6.AddArg2(v7, mem)
31868 v5.AddArg(v6)
31869 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31870 v8.AuxInt = int64ToAuxInt(32)
31871 v4.AddArg2(v5, v8)
31872 v1.AddArg2(v2, v4)
31873 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31874 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read16(scon, 4, config.ctxt.Arch.ByteOrder)) << 32)))
31875 v0.AddArg2(v1, v9)
31876 v.AddArg2(v0, mem)
31877 return true
31878 }
31879
31880
31881
31882 for {
31883 if len(v.Args) != 4 {
31884 break
31885 }
31886 callAux := auxToCall(v.Aux)
31887 mem := v.Args[3]
31888 sptr := v.Args[0]
31889 v_1 := v.Args[1]
31890 if v_1.Op != OpAddr {
31891 break
31892 }
31893 scon := auxToSym(v_1.Aux)
31894 v_1_0 := v_1.Args[0]
31895 if v_1_0.Op != OpSB {
31896 break
31897 }
31898 v_2 := v.Args[2]
31899 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 7 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31900 break
31901 }
31902 v.reset(OpMakeResult)
31903 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31904 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
31905 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31906 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31907 v3.AddArg2(sptr, mem)
31908 v2.AddArg(v3)
31909 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
31910 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31911 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31912 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31913 v7.AuxInt = int64ToAuxInt(3)
31914 v7.AddArg(sptr)
31915 v6.AddArg2(v7, mem)
31916 v5.AddArg(v6)
31917 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31918 v8.AuxInt = int64ToAuxInt(32)
31919 v4.AddArg2(v5, v8)
31920 v1.AddArg2(v2, v4)
31921 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31922 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read32(scon, 3, config.ctxt.Arch.ByteOrder)) << 32)))
31923 v0.AddArg2(v1, v9)
31924 v.AddArg2(v0, mem)
31925 return true
31926 }
31927
31928
31929
31930 for {
31931 if len(v.Args) != 4 {
31932 break
31933 }
31934 callAux := auxToCall(v.Aux)
31935 mem := v.Args[3]
31936 v_0 := v.Args[0]
31937 if v_0.Op != OpAddr {
31938 break
31939 }
31940 scon := auxToSym(v_0.Aux)
31941 v_0_0 := v_0.Args[0]
31942 if v_0_0.Op != OpSB {
31943 break
31944 }
31945 sptr := v.Args[1]
31946 v_2 := v.Args[2]
31947 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 7 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31948 break
31949 }
31950 v.reset(OpMakeResult)
31951 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31952 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
31953 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31954 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31955 v3.AddArg2(sptr, mem)
31956 v2.AddArg(v3)
31957 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
31958 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31959 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31960 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31961 v7.AuxInt = int64ToAuxInt(3)
31962 v7.AddArg(sptr)
31963 v6.AddArg2(v7, mem)
31964 v5.AddArg(v6)
31965 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31966 v8.AuxInt = int64ToAuxInt(32)
31967 v4.AddArg2(v5, v8)
31968 v1.AddArg2(v2, v4)
31969 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31970 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read32(scon, 3, config.ctxt.Arch.ByteOrder)) << 32)))
31971 v0.AddArg2(v1, v9)
31972 v.AddArg2(v0, mem)
31973 return true
31974 }
31975
31976
31977
31978 for {
31979 if len(v.Args) != 4 {
31980 break
31981 }
31982 callAux := auxToCall(v.Aux)
31983 mem := v.Args[3]
31984 v_2 := v.Args[2]
31985 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.memequal")) {
31986 break
31987 }
31988 v.reset(OpMakeResult)
31989 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
31990 v0.AuxInt = boolToAuxInt(true)
31991 v.AddArg2(v0, mem)
31992 return true
31993 }
31994
31995
31996
31997 for {
31998 if len(v.Args) != 4 {
31999 break
32000 }
32001 callAux := auxToCall(v.Aux)
32002 mem := v.Args[3]
32003 p := v.Args[0]
32004 q := v.Args[1]
32005 if !(isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)) {
32006 break
32007 }
32008 v.reset(OpMakeResult)
32009 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
32010 v0.AuxInt = boolToAuxInt(true)
32011 v.AddArg2(v0, mem)
32012 return true
32013 }
32014
32015
32016
32017 for {
32018 if len(v.Args) != 4 {
32019 break
32020 }
32021 callAux := auxToCall(v.Aux)
32022 mem := v.Args[3]
32023 v_1 := v.Args[1]
32024 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
32025 break
32026 }
32027 v_2 := v.Args[2]
32028 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.makeslice")) {
32029 break
32030 }
32031 v.reset(OpMakeResult)
32032 v0 := b.NewValue0(v.Pos, OpAddr, v.Type.FieldType(0))
32033 v0.Aux = symToAux(ir.Syms.Zerobase)
32034 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
32035 v0.AddArg(v1)
32036 v.AddArg2(v0, mem)
32037 return true
32038 }
32039
32040
32041
32042 for {
32043 if len(v.Args) != 4 {
32044 break
32045 }
32046 callAux := auxToCall(v.Aux)
32047 mem := v.Args[3]
32048 v_1 := v.Args[1]
32049 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
32050 break
32051 }
32052 v_2 := v.Args[2]
32053 if v_2.Op != OpConst32 || auxIntToInt32(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.makeslice")) {
32054 break
32055 }
32056 v.reset(OpMakeResult)
32057 v0 := b.NewValue0(v.Pos, OpAddr, v.Type.FieldType(0))
32058 v0.Aux = symToAux(ir.Syms.Zerobase)
32059 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
32060 v0.AddArg(v1)
32061 v.AddArg2(v0, mem)
32062 return true
32063 }
32064
32065
32066
32067 for {
32068 if len(v.Args) != 4 {
32069 break
32070 }
32071 f := auxToCall(v.Aux)
32072 mem := v.Args[3]
32073 typ_ := v.Args[0]
32074 x := v.Args[1]
32075 y := v.Args[2]
32076 if !(isSameCall(f, "runtime.efaceeq") && isDirectAndComparableType(typ_) && clobber(v)) {
32077 break
32078 }
32079 v.reset(OpMakeResult)
32080 v0 := b.NewValue0(v.Pos, OpEqPtr, typ.Bool)
32081 v0.AddArg2(x, y)
32082 v.AddArg2(v0, mem)
32083 return true
32084 }
32085
32086
32087
32088 for {
32089 if len(v.Args) != 4 {
32090 break
32091 }
32092 f := auxToCall(v.Aux)
32093 mem := v.Args[3]
32094 itab := v.Args[0]
32095 x := v.Args[1]
32096 y := v.Args[2]
32097 if !(isSameCall(f, "runtime.ifaceeq") && isDirectAndComparableIface(itab) && clobber(v)) {
32098 break
32099 }
32100 v.reset(OpMakeResult)
32101 v0 := b.NewValue0(v.Pos, OpEqPtr, typ.Bool)
32102 v0.AddArg2(x, y)
32103 v.AddArg2(v0, mem)
32104 return true
32105 }
32106
32107
32108
32109 for {
32110 if len(v.Args) != 4 {
32111 break
32112 }
32113 argsize := auxIntToInt32(v.AuxInt)
32114 f := auxToCall(v.Aux)
32115 _ = v.Args[3]
32116 typ_ := v.Args[0]
32117 map_ := v.Args[1]
32118 key := v.Args[2]
32119 if key.Op != OpSelectN || auxIntToInt64(key.AuxInt) != 0 {
32120 break
32121 }
32122 sbts := key.Args[0]
32123 if sbts.Op != OpStaticLECall || len(sbts.Args) != 4 {
32124 break
32125 }
32126 g := auxToCall(sbts.Aux)
32127 mem := sbts.Args[3]
32128 ptr := sbts.Args[1]
32129 len := sbts.Args[2]
32130 m := v.Args[3]
32131 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)) {
32132 break
32133 }
32134 v.reset(OpStaticLECall)
32135 v.AuxInt = int32ToAuxInt(argsize)
32136 v.Aux = callToAux(f)
32137 v0 := b.NewValue0(v.Pos, OpStringMake, typ.String)
32138 v0.AddArg2(ptr, len)
32139 v.AddArg4(typ_, map_, v0, mem)
32140 return true
32141 }
32142
32143
32144
32145 for {
32146 if len(v.Args) != 3 {
32147 break
32148 }
32149 argsize := auxIntToInt32(v.AuxInt)
32150 f := auxToCall(v.Aux)
32151 _ = v.Args[2]
32152 dict_ := v.Args[0]
32153 key := v.Args[1]
32154 if key.Op != OpSelectN || auxIntToInt64(key.AuxInt) != 0 {
32155 break
32156 }
32157 sbts := key.Args[0]
32158 if sbts.Op != OpStaticLECall || len(sbts.Args) != 4 {
32159 break
32160 }
32161 g := auxToCall(sbts.Aux)
32162 mem := sbts.Args[3]
32163 ptr := sbts.Args[1]
32164 len := sbts.Args[2]
32165 m := v.Args[2]
32166 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)) {
32167 break
32168 }
32169 v.reset(OpStaticLECall)
32170 v.AuxInt = int32ToAuxInt(argsize)
32171 v.Aux = callToAux(f)
32172 v0 := b.NewValue0(v.Pos, OpStringMake, typ.String)
32173 v0.AddArg2(ptr, len)
32174 v.AddArg3(dict_, v0, mem)
32175 return true
32176 }
32177 return false
32178 }
32179 func rewriteValuegeneric_OpStore(v *Value) bool {
32180 v_2 := v.Args[2]
32181 v_1 := v.Args[1]
32182 v_0 := v.Args[0]
32183 b := v.Block
32184
32185
32186
32187 for {
32188 t1 := auxToType(v.Aux)
32189 p1 := v_0
32190 if v_1.Op != OpLoad {
32191 break
32192 }
32193 t2 := v_1.Type
32194 mem := v_1.Args[1]
32195 p2 := v_1.Args[0]
32196 if mem != v_2 || !(isSamePtr(p1, p2) && t2.Size() == t1.Size()) {
32197 break
32198 }
32199 v.copyOf(mem)
32200 return true
32201 }
32202
32203
32204
32205 for {
32206 t1 := auxToType(v.Aux)
32207 p1 := v_0
32208 if v_1.Op != OpLoad {
32209 break
32210 }
32211 t2 := v_1.Type
32212 oldmem := v_1.Args[1]
32213 p2 := v_1.Args[0]
32214 mem := v_2
32215 if mem.Op != OpStore {
32216 break
32217 }
32218 t3 := auxToType(mem.Aux)
32219 _ = mem.Args[2]
32220 p3 := mem.Args[0]
32221 if oldmem != mem.Args[2] || !(isSamePtr(p1, p2) && t2.Size() == t1.Size() && disjoint(p1, t1.Size(), p3, t3.Size())) {
32222 break
32223 }
32224 v.copyOf(mem)
32225 return true
32226 }
32227
32228
32229
32230 for {
32231 t1 := auxToType(v.Aux)
32232 p1 := v_0
32233 if v_1.Op != OpLoad {
32234 break
32235 }
32236 t2 := v_1.Type
32237 oldmem := v_1.Args[1]
32238 p2 := v_1.Args[0]
32239 mem := v_2
32240 if mem.Op != OpStore {
32241 break
32242 }
32243 t3 := auxToType(mem.Aux)
32244 _ = mem.Args[2]
32245 p3 := mem.Args[0]
32246 mem_2 := mem.Args[2]
32247 if mem_2.Op != OpStore {
32248 break
32249 }
32250 t4 := auxToType(mem_2.Aux)
32251 _ = mem_2.Args[2]
32252 p4 := mem_2.Args[0]
32253 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())) {
32254 break
32255 }
32256 v.copyOf(mem)
32257 return true
32258 }
32259
32260
32261
32262 for {
32263 t1 := auxToType(v.Aux)
32264 p1 := v_0
32265 if v_1.Op != OpLoad {
32266 break
32267 }
32268 t2 := v_1.Type
32269 oldmem := v_1.Args[1]
32270 p2 := v_1.Args[0]
32271 mem := v_2
32272 if mem.Op != OpStore {
32273 break
32274 }
32275 t3 := auxToType(mem.Aux)
32276 _ = mem.Args[2]
32277 p3 := mem.Args[0]
32278 mem_2 := mem.Args[2]
32279 if mem_2.Op != OpStore {
32280 break
32281 }
32282 t4 := auxToType(mem_2.Aux)
32283 _ = mem_2.Args[2]
32284 p4 := mem_2.Args[0]
32285 mem_2_2 := mem_2.Args[2]
32286 if mem_2_2.Op != OpStore {
32287 break
32288 }
32289 t5 := auxToType(mem_2_2.Aux)
32290 _ = mem_2_2.Args[2]
32291 p5 := mem_2_2.Args[0]
32292 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())) {
32293 break
32294 }
32295 v.copyOf(mem)
32296 return true
32297 }
32298
32299
32300
32301 for {
32302 t := auxToType(v.Aux)
32303 if v_0.Op != OpOffPtr {
32304 break
32305 }
32306 o := auxIntToInt64(v_0.AuxInt)
32307 p1 := v_0.Args[0]
32308 x := v_1
32309 mem := v_2
32310 if mem.Op != OpZero {
32311 break
32312 }
32313 n := auxIntToInt64(mem.AuxInt)
32314 p2 := mem.Args[0]
32315 if !(isConstZero(x) && o >= 0 && t.Size()+o <= n && isSamePtr(p1, p2)) {
32316 break
32317 }
32318 v.copyOf(mem)
32319 return true
32320 }
32321
32322
32323
32324 for {
32325 t1 := auxToType(v.Aux)
32326 op := v_0
32327 if op.Op != OpOffPtr {
32328 break
32329 }
32330 o1 := auxIntToInt64(op.AuxInt)
32331 p1 := op.Args[0]
32332 x := v_1
32333 mem := v_2
32334 if mem.Op != OpStore {
32335 break
32336 }
32337 t2 := auxToType(mem.Aux)
32338 _ = mem.Args[2]
32339 p2 := mem.Args[0]
32340 mem_2 := mem.Args[2]
32341 if mem_2.Op != OpZero {
32342 break
32343 }
32344 n := auxIntToInt64(mem_2.AuxInt)
32345 p3 := mem_2.Args[0]
32346 if !(isConstZero(x) && o1 >= 0 && t1.Size()+o1 <= n && isSamePtr(p1, p3) && disjoint(op, t1.Size(), p2, t2.Size())) {
32347 break
32348 }
32349 v.copyOf(mem)
32350 return true
32351 }
32352
32353
32354
32355 for {
32356 t1 := auxToType(v.Aux)
32357 op := v_0
32358 if op.Op != OpOffPtr {
32359 break
32360 }
32361 o1 := auxIntToInt64(op.AuxInt)
32362 p1 := op.Args[0]
32363 x := v_1
32364 mem := v_2
32365 if mem.Op != OpStore {
32366 break
32367 }
32368 t2 := auxToType(mem.Aux)
32369 _ = mem.Args[2]
32370 p2 := mem.Args[0]
32371 mem_2 := mem.Args[2]
32372 if mem_2.Op != OpStore {
32373 break
32374 }
32375 t3 := auxToType(mem_2.Aux)
32376 _ = mem_2.Args[2]
32377 p3 := mem_2.Args[0]
32378 mem_2_2 := mem_2.Args[2]
32379 if mem_2_2.Op != OpZero {
32380 break
32381 }
32382 n := auxIntToInt64(mem_2_2.AuxInt)
32383 p4 := mem_2_2.Args[0]
32384 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())) {
32385 break
32386 }
32387 v.copyOf(mem)
32388 return true
32389 }
32390
32391
32392
32393 for {
32394 t1 := auxToType(v.Aux)
32395 op := v_0
32396 if op.Op != OpOffPtr {
32397 break
32398 }
32399 o1 := auxIntToInt64(op.AuxInt)
32400 p1 := op.Args[0]
32401 x := v_1
32402 mem := v_2
32403 if mem.Op != OpStore {
32404 break
32405 }
32406 t2 := auxToType(mem.Aux)
32407 _ = mem.Args[2]
32408 p2 := mem.Args[0]
32409 mem_2 := mem.Args[2]
32410 if mem_2.Op != OpStore {
32411 break
32412 }
32413 t3 := auxToType(mem_2.Aux)
32414 _ = mem_2.Args[2]
32415 p3 := mem_2.Args[0]
32416 mem_2_2 := mem_2.Args[2]
32417 if mem_2_2.Op != OpStore {
32418 break
32419 }
32420 t4 := auxToType(mem_2_2.Aux)
32421 _ = mem_2_2.Args[2]
32422 p4 := mem_2_2.Args[0]
32423 mem_2_2_2 := mem_2_2.Args[2]
32424 if mem_2_2_2.Op != OpZero {
32425 break
32426 }
32427 n := auxIntToInt64(mem_2_2_2.AuxInt)
32428 p5 := mem_2_2_2.Args[0]
32429 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())) {
32430 break
32431 }
32432 v.copyOf(mem)
32433 return true
32434 }
32435
32436
32437 for {
32438 if v_1.Op != OpStructMake {
32439 break
32440 }
32441 v.copyOf(rewriteStructStore(v))
32442 return true
32443 }
32444
32445
32446
32447 for {
32448 t := auxToType(v.Aux)
32449 dst := v_0
32450 if v_1.Op != OpLoad {
32451 break
32452 }
32453 mem := v_1.Args[1]
32454 src := v_1.Args[0]
32455 if mem != v_2 || !(!CanSSA(t)) {
32456 break
32457 }
32458 v.reset(OpMove)
32459 v.AuxInt = int64ToAuxInt(t.Size())
32460 v.Aux = typeToAux(t)
32461 v.AddArg3(dst, src, mem)
32462 return true
32463 }
32464
32465
32466
32467 for {
32468 t := auxToType(v.Aux)
32469 dst := v_0
32470 if v_1.Op != OpLoad {
32471 break
32472 }
32473 mem := v_1.Args[1]
32474 src := v_1.Args[0]
32475 if v_2.Op != OpVarDef {
32476 break
32477 }
32478 x := auxToSym(v_2.Aux)
32479 if mem != v_2.Args[0] || !(!CanSSA(t)) {
32480 break
32481 }
32482 v.reset(OpMove)
32483 v.AuxInt = int64ToAuxInt(t.Size())
32484 v.Aux = typeToAux(t)
32485 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
32486 v0.Aux = symToAux(x)
32487 v0.AddArg(mem)
32488 v.AddArg3(dst, src, v0)
32489 return true
32490 }
32491
32492
32493 for {
32494 dst := v_0
32495 if v_1.Op != OpArrayMake1 {
32496 break
32497 }
32498 e := v_1.Args[0]
32499 mem := v_2
32500 v.reset(OpStore)
32501 v.Aux = typeToAux(e.Type)
32502 v.AddArg3(dst, e, mem)
32503 return true
32504 }
32505
32506
32507 for {
32508 if v_1.Op != OpEmpty {
32509 break
32510 }
32511 mem := v_2
32512 v.copyOf(mem)
32513 return true
32514 }
32515
32516
32517
32518 for {
32519 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
32520 break
32521 }
32522 call := v_0.Args[0]
32523 if call.Op != OpStaticLECall {
32524 break
32525 }
32526 x := v_1
32527 mem := v_2
32528 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isConstZero(x) && isMalloc(call.Aux)) {
32529 break
32530 }
32531 v.copyOf(mem)
32532 return true
32533 }
32534
32535
32536
32537 for {
32538 if v_0.Op != OpOffPtr {
32539 break
32540 }
32541 v_0_0 := v_0.Args[0]
32542 if v_0_0.Op != OpSelectN || auxIntToInt64(v_0_0.AuxInt) != 0 {
32543 break
32544 }
32545 call := v_0_0.Args[0]
32546 if call.Op != OpStaticLECall {
32547 break
32548 }
32549 x := v_1
32550 mem := v_2
32551 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isConstZero(x) && isMalloc(call.Aux)) {
32552 break
32553 }
32554 v.copyOf(mem)
32555 return true
32556 }
32557
32558
32559
32560 for {
32561 t1 := auxToType(v.Aux)
32562 op1 := v_0
32563 if op1.Op != OpOffPtr {
32564 break
32565 }
32566 o1 := auxIntToInt64(op1.AuxInt)
32567 p1 := op1.Args[0]
32568 d1 := v_1
32569 m2 := v_2
32570 if m2.Op != OpStore {
32571 break
32572 }
32573 t2 := auxToType(m2.Aux)
32574 _ = m2.Args[2]
32575 op2 := m2.Args[0]
32576 if op2.Op != OpOffPtr || auxIntToInt64(op2.AuxInt) != 0 {
32577 break
32578 }
32579 p2 := op2.Args[0]
32580 d2 := m2.Args[1]
32581 m3 := m2.Args[2]
32582 if m3.Op != OpMove {
32583 break
32584 }
32585 n := auxIntToInt64(m3.AuxInt)
32586 mem := m3.Args[2]
32587 p3 := m3.Args[0]
32588 if !(m2.Uses == 1 && m3.Uses == 1 && o1 == t2.Size() && n == t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2, m3)) {
32589 break
32590 }
32591 v.reset(OpStore)
32592 v.Aux = typeToAux(t1)
32593 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32594 v0.Aux = typeToAux(t2)
32595 v0.AddArg3(op2, d2, mem)
32596 v.AddArg3(op1, d1, v0)
32597 return true
32598 }
32599
32600
32601
32602 for {
32603 t1 := auxToType(v.Aux)
32604 op1 := v_0
32605 if op1.Op != OpOffPtr {
32606 break
32607 }
32608 o1 := auxIntToInt64(op1.AuxInt)
32609 p1 := op1.Args[0]
32610 d1 := v_1
32611 m2 := v_2
32612 if m2.Op != OpStore {
32613 break
32614 }
32615 t2 := auxToType(m2.Aux)
32616 _ = m2.Args[2]
32617 op2 := m2.Args[0]
32618 if op2.Op != OpOffPtr {
32619 break
32620 }
32621 o2 := auxIntToInt64(op2.AuxInt)
32622 p2 := op2.Args[0]
32623 d2 := m2.Args[1]
32624 m3 := m2.Args[2]
32625 if m3.Op != OpStore {
32626 break
32627 }
32628 t3 := auxToType(m3.Aux)
32629 _ = m3.Args[2]
32630 op3 := m3.Args[0]
32631 if op3.Op != OpOffPtr || auxIntToInt64(op3.AuxInt) != 0 {
32632 break
32633 }
32634 p3 := op3.Args[0]
32635 d3 := m3.Args[1]
32636 m4 := m3.Args[2]
32637 if m4.Op != OpMove {
32638 break
32639 }
32640 n := auxIntToInt64(m4.AuxInt)
32641 mem := m4.Args[2]
32642 p4 := m4.Args[0]
32643 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)) {
32644 break
32645 }
32646 v.reset(OpStore)
32647 v.Aux = typeToAux(t1)
32648 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32649 v0.Aux = typeToAux(t2)
32650 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32651 v1.Aux = typeToAux(t3)
32652 v1.AddArg3(op3, d3, mem)
32653 v0.AddArg3(op2, d2, v1)
32654 v.AddArg3(op1, d1, v0)
32655 return true
32656 }
32657
32658
32659
32660 for {
32661 t1 := auxToType(v.Aux)
32662 op1 := v_0
32663 if op1.Op != OpOffPtr {
32664 break
32665 }
32666 o1 := auxIntToInt64(op1.AuxInt)
32667 p1 := op1.Args[0]
32668 d1 := v_1
32669 m2 := v_2
32670 if m2.Op != OpStore {
32671 break
32672 }
32673 t2 := auxToType(m2.Aux)
32674 _ = m2.Args[2]
32675 op2 := m2.Args[0]
32676 if op2.Op != OpOffPtr {
32677 break
32678 }
32679 o2 := auxIntToInt64(op2.AuxInt)
32680 p2 := op2.Args[0]
32681 d2 := m2.Args[1]
32682 m3 := m2.Args[2]
32683 if m3.Op != OpStore {
32684 break
32685 }
32686 t3 := auxToType(m3.Aux)
32687 _ = m3.Args[2]
32688 op3 := m3.Args[0]
32689 if op3.Op != OpOffPtr {
32690 break
32691 }
32692 o3 := auxIntToInt64(op3.AuxInt)
32693 p3 := op3.Args[0]
32694 d3 := m3.Args[1]
32695 m4 := m3.Args[2]
32696 if m4.Op != OpStore {
32697 break
32698 }
32699 t4 := auxToType(m4.Aux)
32700 _ = m4.Args[2]
32701 op4 := m4.Args[0]
32702 if op4.Op != OpOffPtr || auxIntToInt64(op4.AuxInt) != 0 {
32703 break
32704 }
32705 p4 := op4.Args[0]
32706 d4 := m4.Args[1]
32707 m5 := m4.Args[2]
32708 if m5.Op != OpMove {
32709 break
32710 }
32711 n := auxIntToInt64(m5.AuxInt)
32712 mem := m5.Args[2]
32713 p5 := m5.Args[0]
32714 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)) {
32715 break
32716 }
32717 v.reset(OpStore)
32718 v.Aux = typeToAux(t1)
32719 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32720 v0.Aux = typeToAux(t2)
32721 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32722 v1.Aux = typeToAux(t3)
32723 v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32724 v2.Aux = typeToAux(t4)
32725 v2.AddArg3(op4, d4, mem)
32726 v1.AddArg3(op3, d3, v2)
32727 v0.AddArg3(op2, d2, v1)
32728 v.AddArg3(op1, d1, v0)
32729 return true
32730 }
32731
32732
32733
32734 for {
32735 t1 := auxToType(v.Aux)
32736 op1 := v_0
32737 if op1.Op != OpOffPtr {
32738 break
32739 }
32740 o1 := auxIntToInt64(op1.AuxInt)
32741 p1 := op1.Args[0]
32742 d1 := v_1
32743 m2 := v_2
32744 if m2.Op != OpStore {
32745 break
32746 }
32747 t2 := auxToType(m2.Aux)
32748 _ = m2.Args[2]
32749 op2 := m2.Args[0]
32750 if op2.Op != OpOffPtr || auxIntToInt64(op2.AuxInt) != 0 {
32751 break
32752 }
32753 p2 := op2.Args[0]
32754 d2 := m2.Args[1]
32755 m3 := m2.Args[2]
32756 if m3.Op != OpZero {
32757 break
32758 }
32759 n := auxIntToInt64(m3.AuxInt)
32760 mem := m3.Args[1]
32761 p3 := m3.Args[0]
32762 if !(m2.Uses == 1 && m3.Uses == 1 && o1 == t2.Size() && n == t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2, m3)) {
32763 break
32764 }
32765 v.reset(OpStore)
32766 v.Aux = typeToAux(t1)
32767 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32768 v0.Aux = typeToAux(t2)
32769 v0.AddArg3(op2, d2, mem)
32770 v.AddArg3(op1, d1, v0)
32771 return true
32772 }
32773
32774
32775
32776 for {
32777 t1 := auxToType(v.Aux)
32778 op1 := v_0
32779 if op1.Op != OpOffPtr {
32780 break
32781 }
32782 o1 := auxIntToInt64(op1.AuxInt)
32783 p1 := op1.Args[0]
32784 d1 := v_1
32785 m2 := v_2
32786 if m2.Op != OpStore {
32787 break
32788 }
32789 t2 := auxToType(m2.Aux)
32790 _ = m2.Args[2]
32791 op2 := m2.Args[0]
32792 if op2.Op != OpOffPtr {
32793 break
32794 }
32795 o2 := auxIntToInt64(op2.AuxInt)
32796 p2 := op2.Args[0]
32797 d2 := m2.Args[1]
32798 m3 := m2.Args[2]
32799 if m3.Op != OpStore {
32800 break
32801 }
32802 t3 := auxToType(m3.Aux)
32803 _ = m3.Args[2]
32804 op3 := m3.Args[0]
32805 if op3.Op != OpOffPtr || auxIntToInt64(op3.AuxInt) != 0 {
32806 break
32807 }
32808 p3 := op3.Args[0]
32809 d3 := m3.Args[1]
32810 m4 := m3.Args[2]
32811 if m4.Op != OpZero {
32812 break
32813 }
32814 n := auxIntToInt64(m4.AuxInt)
32815 mem := m4.Args[1]
32816 p4 := m4.Args[0]
32817 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)) {
32818 break
32819 }
32820 v.reset(OpStore)
32821 v.Aux = typeToAux(t1)
32822 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32823 v0.Aux = typeToAux(t2)
32824 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32825 v1.Aux = typeToAux(t3)
32826 v1.AddArg3(op3, d3, mem)
32827 v0.AddArg3(op2, d2, v1)
32828 v.AddArg3(op1, d1, v0)
32829 return true
32830 }
32831
32832
32833
32834 for {
32835 t1 := auxToType(v.Aux)
32836 op1 := v_0
32837 if op1.Op != OpOffPtr {
32838 break
32839 }
32840 o1 := auxIntToInt64(op1.AuxInt)
32841 p1 := op1.Args[0]
32842 d1 := v_1
32843 m2 := v_2
32844 if m2.Op != OpStore {
32845 break
32846 }
32847 t2 := auxToType(m2.Aux)
32848 _ = m2.Args[2]
32849 op2 := m2.Args[0]
32850 if op2.Op != OpOffPtr {
32851 break
32852 }
32853 o2 := auxIntToInt64(op2.AuxInt)
32854 p2 := op2.Args[0]
32855 d2 := m2.Args[1]
32856 m3 := m2.Args[2]
32857 if m3.Op != OpStore {
32858 break
32859 }
32860 t3 := auxToType(m3.Aux)
32861 _ = m3.Args[2]
32862 op3 := m3.Args[0]
32863 if op3.Op != OpOffPtr {
32864 break
32865 }
32866 o3 := auxIntToInt64(op3.AuxInt)
32867 p3 := op3.Args[0]
32868 d3 := m3.Args[1]
32869 m4 := m3.Args[2]
32870 if m4.Op != OpStore {
32871 break
32872 }
32873 t4 := auxToType(m4.Aux)
32874 _ = m4.Args[2]
32875 op4 := m4.Args[0]
32876 if op4.Op != OpOffPtr || auxIntToInt64(op4.AuxInt) != 0 {
32877 break
32878 }
32879 p4 := op4.Args[0]
32880 d4 := m4.Args[1]
32881 m5 := m4.Args[2]
32882 if m5.Op != OpZero {
32883 break
32884 }
32885 n := auxIntToInt64(m5.AuxInt)
32886 mem := m5.Args[1]
32887 p5 := m5.Args[0]
32888 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)) {
32889 break
32890 }
32891 v.reset(OpStore)
32892 v.Aux = typeToAux(t1)
32893 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32894 v0.Aux = typeToAux(t2)
32895 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32896 v1.Aux = typeToAux(t3)
32897 v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32898 v2.Aux = typeToAux(t4)
32899 v2.AddArg3(op4, d4, mem)
32900 v1.AddArg3(op3, d3, v2)
32901 v0.AddArg3(op2, d2, v1)
32902 v.AddArg3(op1, d1, v0)
32903 return true
32904 }
32905 return false
32906 }
32907 func rewriteValuegeneric_OpStringLen(v *Value) bool {
32908 v_0 := v.Args[0]
32909
32910
32911 for {
32912 if v_0.Op != OpStringMake {
32913 break
32914 }
32915 _ = v_0.Args[1]
32916 v_0_1 := v_0.Args[1]
32917 if v_0_1.Op != OpConst64 {
32918 break
32919 }
32920 t := v_0_1.Type
32921 c := auxIntToInt64(v_0_1.AuxInt)
32922 v.reset(OpConst64)
32923 v.Type = t
32924 v.AuxInt = int64ToAuxInt(c)
32925 return true
32926 }
32927 return false
32928 }
32929 func rewriteValuegeneric_OpStringPtr(v *Value) bool {
32930 v_0 := v.Args[0]
32931
32932
32933 for {
32934 if v_0.Op != OpStringMake {
32935 break
32936 }
32937 v_0_0 := v_0.Args[0]
32938 if v_0_0.Op != OpAddr {
32939 break
32940 }
32941 t := v_0_0.Type
32942 s := auxToSym(v_0_0.Aux)
32943 base := v_0_0.Args[0]
32944 v.reset(OpAddr)
32945 v.Type = t
32946 v.Aux = symToAux(s)
32947 v.AddArg(base)
32948 return true
32949 }
32950 return false
32951 }
32952 func rewriteValuegeneric_OpStructSelect(v *Value) bool {
32953 v_0 := v.Args[0]
32954 b := v.Block
32955
32956
32957 for {
32958 i := auxIntToInt64(v.AuxInt)
32959 x := v_0
32960 if x.Op != OpStructMake {
32961 break
32962 }
32963 v.copyOf(x.Args[i])
32964 return true
32965 }
32966
32967
32968
32969 for {
32970 i := auxIntToInt64(v.AuxInt)
32971 x := v_0
32972 if x.Op != OpLoad {
32973 break
32974 }
32975 t := x.Type
32976 mem := x.Args[1]
32977 ptr := x.Args[0]
32978 if !(!CanSSA(t)) {
32979 break
32980 }
32981 b = x.Block
32982 v0 := b.NewValue0(v.Pos, OpLoad, v.Type)
32983 v.copyOf(v0)
32984 v1 := b.NewValue0(v.Pos, OpOffPtr, v.Type.PtrTo())
32985 v1.AuxInt = int64ToAuxInt(t.FieldOff(int(i)))
32986 v1.AddArg(ptr)
32987 v0.AddArg2(v1, mem)
32988 return true
32989 }
32990
32991
32992
32993 for {
32994 if v_0.Op != OpIData {
32995 break
32996 }
32997 x := v_0.Args[0]
32998 if !(v.Type.Size() > 0) {
32999 break
33000 }
33001 v.reset(OpIData)
33002 v.AddArg(x)
33003 return true
33004 }
33005
33006
33007
33008 for {
33009 if v_0.Op != OpIData {
33010 break
33011 }
33012 if !(v.Type.Size() == 0) {
33013 break
33014 }
33015 v.reset(OpEmpty)
33016 return true
33017 }
33018 return false
33019 }
33020 func rewriteValuegeneric_OpSub16(v *Value) bool {
33021 v_1 := v.Args[1]
33022 v_0 := v.Args[0]
33023 b := v.Block
33024
33025
33026 for {
33027 if v_0.Op != OpConst16 {
33028 break
33029 }
33030 c := auxIntToInt16(v_0.AuxInt)
33031 if v_1.Op != OpConst16 {
33032 break
33033 }
33034 d := auxIntToInt16(v_1.AuxInt)
33035 v.reset(OpConst16)
33036 v.AuxInt = int16ToAuxInt(c - d)
33037 return true
33038 }
33039
33040
33041
33042 for {
33043 x := v_0
33044 if v_1.Op != OpConst16 {
33045 break
33046 }
33047 t := v_1.Type
33048 c := auxIntToInt16(v_1.AuxInt)
33049 if !(x.Op != OpConst16) {
33050 break
33051 }
33052 v.reset(OpAdd16)
33053 v0 := b.NewValue0(v.Pos, OpConst16, t)
33054 v0.AuxInt = int16ToAuxInt(-c)
33055 v.AddArg2(v0, x)
33056 return true
33057 }
33058
33059
33060 for {
33061 t := v.Type
33062 if v_0.Op != OpMul16 {
33063 break
33064 }
33065 _ = v_0.Args[1]
33066 v_0_0 := v_0.Args[0]
33067 v_0_1 := v_0.Args[1]
33068 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33069 x := v_0_0
33070 y := v_0_1
33071 if v_1.Op != OpMul16 {
33072 continue
33073 }
33074 _ = v_1.Args[1]
33075 v_1_0 := v_1.Args[0]
33076 v_1_1 := v_1.Args[1]
33077 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33078 if x != v_1_0 {
33079 continue
33080 }
33081 z := v_1_1
33082 v.reset(OpMul16)
33083 v0 := b.NewValue0(v.Pos, OpSub16, t)
33084 v0.AddArg2(y, z)
33085 v.AddArg2(x, v0)
33086 return true
33087 }
33088 }
33089 break
33090 }
33091
33092
33093 for {
33094 x := v_0
33095 if x != v_1 {
33096 break
33097 }
33098 v.reset(OpConst16)
33099 v.AuxInt = int16ToAuxInt(0)
33100 return true
33101 }
33102
33103
33104 for {
33105 if v_0.Op != OpNeg16 {
33106 break
33107 }
33108 x := v_0.Args[0]
33109 if v_1.Op != OpCom16 || x != v_1.Args[0] {
33110 break
33111 }
33112 v.reset(OpConst16)
33113 v.AuxInt = int16ToAuxInt(1)
33114 return true
33115 }
33116
33117
33118 for {
33119 if v_0.Op != OpCom16 {
33120 break
33121 }
33122 x := v_0.Args[0]
33123 if v_1.Op != OpNeg16 || x != v_1.Args[0] {
33124 break
33125 }
33126 v.reset(OpConst16)
33127 v.AuxInt = int16ToAuxInt(-1)
33128 return true
33129 }
33130
33131
33132 for {
33133 if v_0.Op != OpAdd16 {
33134 break
33135 }
33136 _ = v_0.Args[1]
33137 v_0_0 := v_0.Args[0]
33138 v_0_1 := v_0.Args[1]
33139 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33140 t := v_0_0
33141 x := v_0_1
33142 if v_1.Op != OpAdd16 {
33143 continue
33144 }
33145 _ = v_1.Args[1]
33146 v_1_0 := v_1.Args[0]
33147 v_1_1 := v_1.Args[1]
33148 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33149 if t != v_1_0 {
33150 continue
33151 }
33152 y := v_1_1
33153 v.reset(OpSub16)
33154 v.AddArg2(x, y)
33155 return true
33156 }
33157 }
33158 break
33159 }
33160
33161
33162 for {
33163 if v_0.Op != OpAdd16 {
33164 break
33165 }
33166 _ = v_0.Args[1]
33167 v_0_0 := v_0.Args[0]
33168 v_0_1 := v_0.Args[1]
33169 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33170 x := v_0_0
33171 y := v_0_1
33172 if x != v_1 {
33173 continue
33174 }
33175 v.copyOf(y)
33176 return true
33177 }
33178 break
33179 }
33180
33181
33182 for {
33183 if v_0.Op != OpAdd16 {
33184 break
33185 }
33186 _ = v_0.Args[1]
33187 v_0_0 := v_0.Args[0]
33188 v_0_1 := v_0.Args[1]
33189 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33190 x := v_0_0
33191 y := v_0_1
33192 if y != v_1 {
33193 continue
33194 }
33195 v.copyOf(x)
33196 return true
33197 }
33198 break
33199 }
33200
33201
33202 for {
33203 if v_0.Op != OpSub16 {
33204 break
33205 }
33206 y := v_0.Args[1]
33207 x := v_0.Args[0]
33208 if x != v_1 {
33209 break
33210 }
33211 v.reset(OpNeg16)
33212 v.AddArg(y)
33213 return true
33214 }
33215
33216
33217 for {
33218 x := v_0
33219 if v_1.Op != OpAdd16 {
33220 break
33221 }
33222 _ = v_1.Args[1]
33223 v_1_0 := v_1.Args[0]
33224 v_1_1 := v_1.Args[1]
33225 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33226 if x != v_1_0 {
33227 continue
33228 }
33229 y := v_1_1
33230 v.reset(OpNeg16)
33231 v.AddArg(y)
33232 return true
33233 }
33234 break
33235 }
33236
33237
33238
33239 for {
33240 x := v_0
33241 if v_1.Op != OpSub16 {
33242 break
33243 }
33244 z := v_1.Args[1]
33245 i := v_1.Args[0]
33246 if i.Op != OpConst16 {
33247 break
33248 }
33249 t := i.Type
33250 if !(z.Op != OpConst16 && x.Op != OpConst16) {
33251 break
33252 }
33253 v.reset(OpSub16)
33254 v0 := b.NewValue0(v.Pos, OpAdd16, t)
33255 v0.AddArg2(x, z)
33256 v.AddArg2(v0, i)
33257 return true
33258 }
33259
33260
33261
33262 for {
33263 x := v_0
33264 if v_1.Op != OpAdd16 {
33265 break
33266 }
33267 _ = v_1.Args[1]
33268 v_1_0 := v_1.Args[0]
33269 v_1_1 := v_1.Args[1]
33270 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33271 z := v_1_0
33272 i := v_1_1
33273 if i.Op != OpConst16 {
33274 continue
33275 }
33276 t := i.Type
33277 if !(z.Op != OpConst16 && x.Op != OpConst16) {
33278 continue
33279 }
33280 v.reset(OpSub16)
33281 v0 := b.NewValue0(v.Pos, OpSub16, t)
33282 v0.AddArg2(x, z)
33283 v.AddArg2(v0, i)
33284 return true
33285 }
33286 break
33287 }
33288
33289
33290
33291 for {
33292 if v_0.Op != OpSub16 {
33293 break
33294 }
33295 z := v_0.Args[1]
33296 i := v_0.Args[0]
33297 if i.Op != OpConst16 {
33298 break
33299 }
33300 t := i.Type
33301 x := v_1
33302 if !(z.Op != OpConst16 && x.Op != OpConst16) {
33303 break
33304 }
33305 v.reset(OpSub16)
33306 v0 := b.NewValue0(v.Pos, OpAdd16, t)
33307 v0.AddArg2(z, x)
33308 v.AddArg2(i, v0)
33309 return true
33310 }
33311
33312
33313
33314 for {
33315 if v_0.Op != OpAdd16 {
33316 break
33317 }
33318 _ = v_0.Args[1]
33319 v_0_0 := v_0.Args[0]
33320 v_0_1 := v_0.Args[1]
33321 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33322 z := v_0_0
33323 i := v_0_1
33324 if i.Op != OpConst16 {
33325 continue
33326 }
33327 t := i.Type
33328 x := v_1
33329 if !(z.Op != OpConst16 && x.Op != OpConst16) {
33330 continue
33331 }
33332 v.reset(OpAdd16)
33333 v0 := b.NewValue0(v.Pos, OpSub16, t)
33334 v0.AddArg2(z, x)
33335 v.AddArg2(i, v0)
33336 return true
33337 }
33338 break
33339 }
33340
33341
33342 for {
33343 if v_0.Op != OpConst16 {
33344 break
33345 }
33346 t := v_0.Type
33347 c := auxIntToInt16(v_0.AuxInt)
33348 if v_1.Op != OpSub16 {
33349 break
33350 }
33351 x := v_1.Args[1]
33352 v_1_0 := v_1.Args[0]
33353 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
33354 break
33355 }
33356 d := auxIntToInt16(v_1_0.AuxInt)
33357 v.reset(OpAdd16)
33358 v0 := b.NewValue0(v.Pos, OpConst16, t)
33359 v0.AuxInt = int16ToAuxInt(c - d)
33360 v.AddArg2(v0, x)
33361 return true
33362 }
33363
33364
33365 for {
33366 if v_0.Op != OpConst16 {
33367 break
33368 }
33369 t := v_0.Type
33370 c := auxIntToInt16(v_0.AuxInt)
33371 if v_1.Op != OpAdd16 {
33372 break
33373 }
33374 _ = v_1.Args[1]
33375 v_1_0 := v_1.Args[0]
33376 v_1_1 := v_1.Args[1]
33377 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33378 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
33379 continue
33380 }
33381 d := auxIntToInt16(v_1_0.AuxInt)
33382 x := v_1_1
33383 v.reset(OpSub16)
33384 v0 := b.NewValue0(v.Pos, OpConst16, t)
33385 v0.AuxInt = int16ToAuxInt(c - d)
33386 v.AddArg2(v0, x)
33387 return true
33388 }
33389 break
33390 }
33391 return false
33392 }
33393 func rewriteValuegeneric_OpSub32(v *Value) bool {
33394 v_1 := v.Args[1]
33395 v_0 := v.Args[0]
33396 b := v.Block
33397
33398
33399 for {
33400 if v_0.Op != OpConst32 {
33401 break
33402 }
33403 c := auxIntToInt32(v_0.AuxInt)
33404 if v_1.Op != OpConst32 {
33405 break
33406 }
33407 d := auxIntToInt32(v_1.AuxInt)
33408 v.reset(OpConst32)
33409 v.AuxInt = int32ToAuxInt(c - d)
33410 return true
33411 }
33412
33413
33414
33415 for {
33416 x := v_0
33417 if v_1.Op != OpConst32 {
33418 break
33419 }
33420 t := v_1.Type
33421 c := auxIntToInt32(v_1.AuxInt)
33422 if !(x.Op != OpConst32) {
33423 break
33424 }
33425 v.reset(OpAdd32)
33426 v0 := b.NewValue0(v.Pos, OpConst32, t)
33427 v0.AuxInt = int32ToAuxInt(-c)
33428 v.AddArg2(v0, x)
33429 return true
33430 }
33431
33432
33433 for {
33434 t := v.Type
33435 if v_0.Op != OpMul32 {
33436 break
33437 }
33438 _ = v_0.Args[1]
33439 v_0_0 := v_0.Args[0]
33440 v_0_1 := v_0.Args[1]
33441 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33442 x := v_0_0
33443 y := v_0_1
33444 if v_1.Op != OpMul32 {
33445 continue
33446 }
33447 _ = v_1.Args[1]
33448 v_1_0 := v_1.Args[0]
33449 v_1_1 := v_1.Args[1]
33450 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33451 if x != v_1_0 {
33452 continue
33453 }
33454 z := v_1_1
33455 v.reset(OpMul32)
33456 v0 := b.NewValue0(v.Pos, OpSub32, t)
33457 v0.AddArg2(y, z)
33458 v.AddArg2(x, v0)
33459 return true
33460 }
33461 }
33462 break
33463 }
33464
33465
33466 for {
33467 x := v_0
33468 if x != v_1 {
33469 break
33470 }
33471 v.reset(OpConst32)
33472 v.AuxInt = int32ToAuxInt(0)
33473 return true
33474 }
33475
33476
33477 for {
33478 if v_0.Op != OpNeg32 {
33479 break
33480 }
33481 x := v_0.Args[0]
33482 if v_1.Op != OpCom32 || x != v_1.Args[0] {
33483 break
33484 }
33485 v.reset(OpConst32)
33486 v.AuxInt = int32ToAuxInt(1)
33487 return true
33488 }
33489
33490
33491 for {
33492 if v_0.Op != OpCom32 {
33493 break
33494 }
33495 x := v_0.Args[0]
33496 if v_1.Op != OpNeg32 || x != v_1.Args[0] {
33497 break
33498 }
33499 v.reset(OpConst32)
33500 v.AuxInt = int32ToAuxInt(-1)
33501 return true
33502 }
33503
33504
33505 for {
33506 if v_0.Op != OpAdd32 {
33507 break
33508 }
33509 _ = v_0.Args[1]
33510 v_0_0 := v_0.Args[0]
33511 v_0_1 := v_0.Args[1]
33512 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33513 t := v_0_0
33514 x := v_0_1
33515 if v_1.Op != OpAdd32 {
33516 continue
33517 }
33518 _ = v_1.Args[1]
33519 v_1_0 := v_1.Args[0]
33520 v_1_1 := v_1.Args[1]
33521 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33522 if t != v_1_0 {
33523 continue
33524 }
33525 y := v_1_1
33526 v.reset(OpSub32)
33527 v.AddArg2(x, y)
33528 return true
33529 }
33530 }
33531 break
33532 }
33533
33534
33535 for {
33536 if v_0.Op != OpAdd32 {
33537 break
33538 }
33539 _ = v_0.Args[1]
33540 v_0_0 := v_0.Args[0]
33541 v_0_1 := v_0.Args[1]
33542 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33543 x := v_0_0
33544 y := v_0_1
33545 if x != v_1 {
33546 continue
33547 }
33548 v.copyOf(y)
33549 return true
33550 }
33551 break
33552 }
33553
33554
33555 for {
33556 if v_0.Op != OpAdd32 {
33557 break
33558 }
33559 _ = v_0.Args[1]
33560 v_0_0 := v_0.Args[0]
33561 v_0_1 := v_0.Args[1]
33562 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33563 x := v_0_0
33564 y := v_0_1
33565 if y != v_1 {
33566 continue
33567 }
33568 v.copyOf(x)
33569 return true
33570 }
33571 break
33572 }
33573
33574
33575 for {
33576 if v_0.Op != OpSub32 {
33577 break
33578 }
33579 y := v_0.Args[1]
33580 x := v_0.Args[0]
33581 if x != v_1 {
33582 break
33583 }
33584 v.reset(OpNeg32)
33585 v.AddArg(y)
33586 return true
33587 }
33588
33589
33590 for {
33591 x := v_0
33592 if v_1.Op != OpAdd32 {
33593 break
33594 }
33595 _ = v_1.Args[1]
33596 v_1_0 := v_1.Args[0]
33597 v_1_1 := v_1.Args[1]
33598 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33599 if x != v_1_0 {
33600 continue
33601 }
33602 y := v_1_1
33603 v.reset(OpNeg32)
33604 v.AddArg(y)
33605 return true
33606 }
33607 break
33608 }
33609
33610
33611
33612 for {
33613 x := v_0
33614 if v_1.Op != OpSub32 {
33615 break
33616 }
33617 z := v_1.Args[1]
33618 i := v_1.Args[0]
33619 if i.Op != OpConst32 {
33620 break
33621 }
33622 t := i.Type
33623 if !(z.Op != OpConst32 && x.Op != OpConst32) {
33624 break
33625 }
33626 v.reset(OpSub32)
33627 v0 := b.NewValue0(v.Pos, OpAdd32, t)
33628 v0.AddArg2(x, z)
33629 v.AddArg2(v0, i)
33630 return true
33631 }
33632
33633
33634
33635 for {
33636 x := v_0
33637 if v_1.Op != OpAdd32 {
33638 break
33639 }
33640 _ = v_1.Args[1]
33641 v_1_0 := v_1.Args[0]
33642 v_1_1 := v_1.Args[1]
33643 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33644 z := v_1_0
33645 i := v_1_1
33646 if i.Op != OpConst32 {
33647 continue
33648 }
33649 t := i.Type
33650 if !(z.Op != OpConst32 && x.Op != OpConst32) {
33651 continue
33652 }
33653 v.reset(OpSub32)
33654 v0 := b.NewValue0(v.Pos, OpSub32, t)
33655 v0.AddArg2(x, z)
33656 v.AddArg2(v0, i)
33657 return true
33658 }
33659 break
33660 }
33661
33662
33663
33664 for {
33665 if v_0.Op != OpSub32 {
33666 break
33667 }
33668 z := v_0.Args[1]
33669 i := v_0.Args[0]
33670 if i.Op != OpConst32 {
33671 break
33672 }
33673 t := i.Type
33674 x := v_1
33675 if !(z.Op != OpConst32 && x.Op != OpConst32) {
33676 break
33677 }
33678 v.reset(OpSub32)
33679 v0 := b.NewValue0(v.Pos, OpAdd32, t)
33680 v0.AddArg2(z, x)
33681 v.AddArg2(i, v0)
33682 return true
33683 }
33684
33685
33686
33687 for {
33688 if v_0.Op != OpAdd32 {
33689 break
33690 }
33691 _ = v_0.Args[1]
33692 v_0_0 := v_0.Args[0]
33693 v_0_1 := v_0.Args[1]
33694 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33695 z := v_0_0
33696 i := v_0_1
33697 if i.Op != OpConst32 {
33698 continue
33699 }
33700 t := i.Type
33701 x := v_1
33702 if !(z.Op != OpConst32 && x.Op != OpConst32) {
33703 continue
33704 }
33705 v.reset(OpAdd32)
33706 v0 := b.NewValue0(v.Pos, OpSub32, t)
33707 v0.AddArg2(z, x)
33708 v.AddArg2(i, v0)
33709 return true
33710 }
33711 break
33712 }
33713
33714
33715 for {
33716 if v_0.Op != OpConst32 {
33717 break
33718 }
33719 t := v_0.Type
33720 c := auxIntToInt32(v_0.AuxInt)
33721 if v_1.Op != OpSub32 {
33722 break
33723 }
33724 x := v_1.Args[1]
33725 v_1_0 := v_1.Args[0]
33726 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
33727 break
33728 }
33729 d := auxIntToInt32(v_1_0.AuxInt)
33730 v.reset(OpAdd32)
33731 v0 := b.NewValue0(v.Pos, OpConst32, t)
33732 v0.AuxInt = int32ToAuxInt(c - d)
33733 v.AddArg2(v0, x)
33734 return true
33735 }
33736
33737
33738 for {
33739 if v_0.Op != OpConst32 {
33740 break
33741 }
33742 t := v_0.Type
33743 c := auxIntToInt32(v_0.AuxInt)
33744 if v_1.Op != OpAdd32 {
33745 break
33746 }
33747 _ = v_1.Args[1]
33748 v_1_0 := v_1.Args[0]
33749 v_1_1 := v_1.Args[1]
33750 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33751 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
33752 continue
33753 }
33754 d := auxIntToInt32(v_1_0.AuxInt)
33755 x := v_1_1
33756 v.reset(OpSub32)
33757 v0 := b.NewValue0(v.Pos, OpConst32, t)
33758 v0.AuxInt = int32ToAuxInt(c - d)
33759 v.AddArg2(v0, x)
33760 return true
33761 }
33762 break
33763 }
33764 return false
33765 }
33766 func rewriteValuegeneric_OpSub32F(v *Value) bool {
33767 v_1 := v.Args[1]
33768 v_0 := v.Args[0]
33769
33770
33771
33772 for {
33773 if v_0.Op != OpConst32F {
33774 break
33775 }
33776 c := auxIntToFloat32(v_0.AuxInt)
33777 if v_1.Op != OpConst32F {
33778 break
33779 }
33780 d := auxIntToFloat32(v_1.AuxInt)
33781 if !(c-d == c-d) {
33782 break
33783 }
33784 v.reset(OpConst32F)
33785 v.AuxInt = float32ToAuxInt(c - d)
33786 return true
33787 }
33788 return false
33789 }
33790 func rewriteValuegeneric_OpSub64(v *Value) bool {
33791 v_1 := v.Args[1]
33792 v_0 := v.Args[0]
33793 b := v.Block
33794
33795
33796 for {
33797 if v_0.Op != OpConst64 {
33798 break
33799 }
33800 c := auxIntToInt64(v_0.AuxInt)
33801 if v_1.Op != OpConst64 {
33802 break
33803 }
33804 d := auxIntToInt64(v_1.AuxInt)
33805 v.reset(OpConst64)
33806 v.AuxInt = int64ToAuxInt(c - d)
33807 return true
33808 }
33809
33810
33811
33812 for {
33813 x := v_0
33814 if v_1.Op != OpConst64 {
33815 break
33816 }
33817 t := v_1.Type
33818 c := auxIntToInt64(v_1.AuxInt)
33819 if !(x.Op != OpConst64) {
33820 break
33821 }
33822 v.reset(OpAdd64)
33823 v0 := b.NewValue0(v.Pos, OpConst64, t)
33824 v0.AuxInt = int64ToAuxInt(-c)
33825 v.AddArg2(v0, x)
33826 return true
33827 }
33828
33829
33830 for {
33831 t := v.Type
33832 if v_0.Op != OpMul64 {
33833 break
33834 }
33835 _ = v_0.Args[1]
33836 v_0_0 := v_0.Args[0]
33837 v_0_1 := v_0.Args[1]
33838 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33839 x := v_0_0
33840 y := v_0_1
33841 if v_1.Op != OpMul64 {
33842 continue
33843 }
33844 _ = v_1.Args[1]
33845 v_1_0 := v_1.Args[0]
33846 v_1_1 := v_1.Args[1]
33847 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33848 if x != v_1_0 {
33849 continue
33850 }
33851 z := v_1_1
33852 v.reset(OpMul64)
33853 v0 := b.NewValue0(v.Pos, OpSub64, t)
33854 v0.AddArg2(y, z)
33855 v.AddArg2(x, v0)
33856 return true
33857 }
33858 }
33859 break
33860 }
33861
33862
33863 for {
33864 x := v_0
33865 if x != v_1 {
33866 break
33867 }
33868 v.reset(OpConst64)
33869 v.AuxInt = int64ToAuxInt(0)
33870 return true
33871 }
33872
33873
33874 for {
33875 if v_0.Op != OpNeg64 {
33876 break
33877 }
33878 x := v_0.Args[0]
33879 if v_1.Op != OpCom64 || x != v_1.Args[0] {
33880 break
33881 }
33882 v.reset(OpConst64)
33883 v.AuxInt = int64ToAuxInt(1)
33884 return true
33885 }
33886
33887
33888 for {
33889 if v_0.Op != OpCom64 {
33890 break
33891 }
33892 x := v_0.Args[0]
33893 if v_1.Op != OpNeg64 || x != v_1.Args[0] {
33894 break
33895 }
33896 v.reset(OpConst64)
33897 v.AuxInt = int64ToAuxInt(-1)
33898 return true
33899 }
33900
33901
33902 for {
33903 if v_0.Op != OpAdd64 {
33904 break
33905 }
33906 _ = v_0.Args[1]
33907 v_0_0 := v_0.Args[0]
33908 v_0_1 := v_0.Args[1]
33909 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33910 t := v_0_0
33911 x := v_0_1
33912 if v_1.Op != OpAdd64 {
33913 continue
33914 }
33915 _ = v_1.Args[1]
33916 v_1_0 := v_1.Args[0]
33917 v_1_1 := v_1.Args[1]
33918 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33919 if t != v_1_0 {
33920 continue
33921 }
33922 y := v_1_1
33923 v.reset(OpSub64)
33924 v.AddArg2(x, y)
33925 return true
33926 }
33927 }
33928 break
33929 }
33930
33931
33932 for {
33933 if v_0.Op != OpAdd64 {
33934 break
33935 }
33936 _ = v_0.Args[1]
33937 v_0_0 := v_0.Args[0]
33938 v_0_1 := v_0.Args[1]
33939 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33940 x := v_0_0
33941 y := v_0_1
33942 if x != v_1 {
33943 continue
33944 }
33945 v.copyOf(y)
33946 return true
33947 }
33948 break
33949 }
33950
33951
33952 for {
33953 if v_0.Op != OpAdd64 {
33954 break
33955 }
33956 _ = v_0.Args[1]
33957 v_0_0 := v_0.Args[0]
33958 v_0_1 := v_0.Args[1]
33959 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33960 x := v_0_0
33961 y := v_0_1
33962 if y != v_1 {
33963 continue
33964 }
33965 v.copyOf(x)
33966 return true
33967 }
33968 break
33969 }
33970
33971
33972 for {
33973 if v_0.Op != OpSub64 {
33974 break
33975 }
33976 y := v_0.Args[1]
33977 x := v_0.Args[0]
33978 if x != v_1 {
33979 break
33980 }
33981 v.reset(OpNeg64)
33982 v.AddArg(y)
33983 return true
33984 }
33985
33986
33987 for {
33988 x := v_0
33989 if v_1.Op != OpAdd64 {
33990 break
33991 }
33992 _ = v_1.Args[1]
33993 v_1_0 := v_1.Args[0]
33994 v_1_1 := v_1.Args[1]
33995 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33996 if x != v_1_0 {
33997 continue
33998 }
33999 y := v_1_1
34000 v.reset(OpNeg64)
34001 v.AddArg(y)
34002 return true
34003 }
34004 break
34005 }
34006
34007
34008
34009 for {
34010 x := v_0
34011 if v_1.Op != OpSub64 {
34012 break
34013 }
34014 z := v_1.Args[1]
34015 i := v_1.Args[0]
34016 if i.Op != OpConst64 {
34017 break
34018 }
34019 t := i.Type
34020 if !(z.Op != OpConst64 && x.Op != OpConst64) {
34021 break
34022 }
34023 v.reset(OpSub64)
34024 v0 := b.NewValue0(v.Pos, OpAdd64, t)
34025 v0.AddArg2(x, z)
34026 v.AddArg2(v0, i)
34027 return true
34028 }
34029
34030
34031
34032 for {
34033 x := v_0
34034 if v_1.Op != OpAdd64 {
34035 break
34036 }
34037 _ = v_1.Args[1]
34038 v_1_0 := v_1.Args[0]
34039 v_1_1 := v_1.Args[1]
34040 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34041 z := v_1_0
34042 i := v_1_1
34043 if i.Op != OpConst64 {
34044 continue
34045 }
34046 t := i.Type
34047 if !(z.Op != OpConst64 && x.Op != OpConst64) {
34048 continue
34049 }
34050 v.reset(OpSub64)
34051 v0 := b.NewValue0(v.Pos, OpSub64, t)
34052 v0.AddArg2(x, z)
34053 v.AddArg2(v0, i)
34054 return true
34055 }
34056 break
34057 }
34058
34059
34060
34061 for {
34062 if v_0.Op != OpSub64 {
34063 break
34064 }
34065 z := v_0.Args[1]
34066 i := v_0.Args[0]
34067 if i.Op != OpConst64 {
34068 break
34069 }
34070 t := i.Type
34071 x := v_1
34072 if !(z.Op != OpConst64 && x.Op != OpConst64) {
34073 break
34074 }
34075 v.reset(OpSub64)
34076 v0 := b.NewValue0(v.Pos, OpAdd64, t)
34077 v0.AddArg2(z, x)
34078 v.AddArg2(i, v0)
34079 return true
34080 }
34081
34082
34083
34084 for {
34085 if v_0.Op != OpAdd64 {
34086 break
34087 }
34088 _ = v_0.Args[1]
34089 v_0_0 := v_0.Args[0]
34090 v_0_1 := v_0.Args[1]
34091 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34092 z := v_0_0
34093 i := v_0_1
34094 if i.Op != OpConst64 {
34095 continue
34096 }
34097 t := i.Type
34098 x := v_1
34099 if !(z.Op != OpConst64 && x.Op != OpConst64) {
34100 continue
34101 }
34102 v.reset(OpAdd64)
34103 v0 := b.NewValue0(v.Pos, OpSub64, t)
34104 v0.AddArg2(z, x)
34105 v.AddArg2(i, v0)
34106 return true
34107 }
34108 break
34109 }
34110
34111
34112 for {
34113 if v_0.Op != OpConst64 {
34114 break
34115 }
34116 t := v_0.Type
34117 c := auxIntToInt64(v_0.AuxInt)
34118 if v_1.Op != OpSub64 {
34119 break
34120 }
34121 x := v_1.Args[1]
34122 v_1_0 := v_1.Args[0]
34123 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
34124 break
34125 }
34126 d := auxIntToInt64(v_1_0.AuxInt)
34127 v.reset(OpAdd64)
34128 v0 := b.NewValue0(v.Pos, OpConst64, t)
34129 v0.AuxInt = int64ToAuxInt(c - d)
34130 v.AddArg2(v0, x)
34131 return true
34132 }
34133
34134
34135 for {
34136 if v_0.Op != OpConst64 {
34137 break
34138 }
34139 t := v_0.Type
34140 c := auxIntToInt64(v_0.AuxInt)
34141 if v_1.Op != OpAdd64 {
34142 break
34143 }
34144 _ = v_1.Args[1]
34145 v_1_0 := v_1.Args[0]
34146 v_1_1 := v_1.Args[1]
34147 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34148 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
34149 continue
34150 }
34151 d := auxIntToInt64(v_1_0.AuxInt)
34152 x := v_1_1
34153 v.reset(OpSub64)
34154 v0 := b.NewValue0(v.Pos, OpConst64, t)
34155 v0.AuxInt = int64ToAuxInt(c - d)
34156 v.AddArg2(v0, x)
34157 return true
34158 }
34159 break
34160 }
34161 return false
34162 }
34163 func rewriteValuegeneric_OpSub64F(v *Value) bool {
34164 v_1 := v.Args[1]
34165 v_0 := v.Args[0]
34166
34167
34168
34169 for {
34170 if v_0.Op != OpConst64F {
34171 break
34172 }
34173 c := auxIntToFloat64(v_0.AuxInt)
34174 if v_1.Op != OpConst64F {
34175 break
34176 }
34177 d := auxIntToFloat64(v_1.AuxInt)
34178 if !(c-d == c-d) {
34179 break
34180 }
34181 v.reset(OpConst64F)
34182 v.AuxInt = float64ToAuxInt(c - d)
34183 return true
34184 }
34185 return false
34186 }
34187 func rewriteValuegeneric_OpSub8(v *Value) bool {
34188 v_1 := v.Args[1]
34189 v_0 := v.Args[0]
34190 b := v.Block
34191
34192
34193 for {
34194 if v_0.Op != OpConst8 {
34195 break
34196 }
34197 c := auxIntToInt8(v_0.AuxInt)
34198 if v_1.Op != OpConst8 {
34199 break
34200 }
34201 d := auxIntToInt8(v_1.AuxInt)
34202 v.reset(OpConst8)
34203 v.AuxInt = int8ToAuxInt(c - d)
34204 return true
34205 }
34206
34207
34208
34209 for {
34210 x := v_0
34211 if v_1.Op != OpConst8 {
34212 break
34213 }
34214 t := v_1.Type
34215 c := auxIntToInt8(v_1.AuxInt)
34216 if !(x.Op != OpConst8) {
34217 break
34218 }
34219 v.reset(OpAdd8)
34220 v0 := b.NewValue0(v.Pos, OpConst8, t)
34221 v0.AuxInt = int8ToAuxInt(-c)
34222 v.AddArg2(v0, x)
34223 return true
34224 }
34225
34226
34227 for {
34228 t := v.Type
34229 if v_0.Op != OpMul8 {
34230 break
34231 }
34232 _ = v_0.Args[1]
34233 v_0_0 := v_0.Args[0]
34234 v_0_1 := v_0.Args[1]
34235 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34236 x := v_0_0
34237 y := v_0_1
34238 if v_1.Op != OpMul8 {
34239 continue
34240 }
34241 _ = v_1.Args[1]
34242 v_1_0 := v_1.Args[0]
34243 v_1_1 := v_1.Args[1]
34244 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34245 if x != v_1_0 {
34246 continue
34247 }
34248 z := v_1_1
34249 v.reset(OpMul8)
34250 v0 := b.NewValue0(v.Pos, OpSub8, t)
34251 v0.AddArg2(y, z)
34252 v.AddArg2(x, v0)
34253 return true
34254 }
34255 }
34256 break
34257 }
34258
34259
34260 for {
34261 x := v_0
34262 if x != v_1 {
34263 break
34264 }
34265 v.reset(OpConst8)
34266 v.AuxInt = int8ToAuxInt(0)
34267 return true
34268 }
34269
34270
34271 for {
34272 if v_0.Op != OpNeg8 {
34273 break
34274 }
34275 x := v_0.Args[0]
34276 if v_1.Op != OpCom8 || x != v_1.Args[0] {
34277 break
34278 }
34279 v.reset(OpConst8)
34280 v.AuxInt = int8ToAuxInt(1)
34281 return true
34282 }
34283
34284
34285 for {
34286 if v_0.Op != OpCom8 {
34287 break
34288 }
34289 x := v_0.Args[0]
34290 if v_1.Op != OpNeg8 || x != v_1.Args[0] {
34291 break
34292 }
34293 v.reset(OpConst8)
34294 v.AuxInt = int8ToAuxInt(-1)
34295 return true
34296 }
34297
34298
34299 for {
34300 if v_0.Op != OpAdd8 {
34301 break
34302 }
34303 _ = v_0.Args[1]
34304 v_0_0 := v_0.Args[0]
34305 v_0_1 := v_0.Args[1]
34306 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34307 t := v_0_0
34308 x := v_0_1
34309 if v_1.Op != OpAdd8 {
34310 continue
34311 }
34312 _ = v_1.Args[1]
34313 v_1_0 := v_1.Args[0]
34314 v_1_1 := v_1.Args[1]
34315 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34316 if t != v_1_0 {
34317 continue
34318 }
34319 y := v_1_1
34320 v.reset(OpSub8)
34321 v.AddArg2(x, y)
34322 return true
34323 }
34324 }
34325 break
34326 }
34327
34328
34329 for {
34330 if v_0.Op != OpAdd8 {
34331 break
34332 }
34333 _ = v_0.Args[1]
34334 v_0_0 := v_0.Args[0]
34335 v_0_1 := v_0.Args[1]
34336 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34337 x := v_0_0
34338 y := v_0_1
34339 if x != v_1 {
34340 continue
34341 }
34342 v.copyOf(y)
34343 return true
34344 }
34345 break
34346 }
34347
34348
34349 for {
34350 if v_0.Op != OpAdd8 {
34351 break
34352 }
34353 _ = v_0.Args[1]
34354 v_0_0 := v_0.Args[0]
34355 v_0_1 := v_0.Args[1]
34356 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34357 x := v_0_0
34358 y := v_0_1
34359 if y != v_1 {
34360 continue
34361 }
34362 v.copyOf(x)
34363 return true
34364 }
34365 break
34366 }
34367
34368
34369 for {
34370 if v_0.Op != OpSub8 {
34371 break
34372 }
34373 y := v_0.Args[1]
34374 x := v_0.Args[0]
34375 if x != v_1 {
34376 break
34377 }
34378 v.reset(OpNeg8)
34379 v.AddArg(y)
34380 return true
34381 }
34382
34383
34384 for {
34385 x := v_0
34386 if v_1.Op != OpAdd8 {
34387 break
34388 }
34389 _ = v_1.Args[1]
34390 v_1_0 := v_1.Args[0]
34391 v_1_1 := v_1.Args[1]
34392 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34393 if x != v_1_0 {
34394 continue
34395 }
34396 y := v_1_1
34397 v.reset(OpNeg8)
34398 v.AddArg(y)
34399 return true
34400 }
34401 break
34402 }
34403
34404
34405
34406 for {
34407 x := v_0
34408 if v_1.Op != OpSub8 {
34409 break
34410 }
34411 z := v_1.Args[1]
34412 i := v_1.Args[0]
34413 if i.Op != OpConst8 {
34414 break
34415 }
34416 t := i.Type
34417 if !(z.Op != OpConst8 && x.Op != OpConst8) {
34418 break
34419 }
34420 v.reset(OpSub8)
34421 v0 := b.NewValue0(v.Pos, OpAdd8, t)
34422 v0.AddArg2(x, z)
34423 v.AddArg2(v0, i)
34424 return true
34425 }
34426
34427
34428
34429 for {
34430 x := v_0
34431 if v_1.Op != OpAdd8 {
34432 break
34433 }
34434 _ = v_1.Args[1]
34435 v_1_0 := v_1.Args[0]
34436 v_1_1 := v_1.Args[1]
34437 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34438 z := v_1_0
34439 i := v_1_1
34440 if i.Op != OpConst8 {
34441 continue
34442 }
34443 t := i.Type
34444 if !(z.Op != OpConst8 && x.Op != OpConst8) {
34445 continue
34446 }
34447 v.reset(OpSub8)
34448 v0 := b.NewValue0(v.Pos, OpSub8, t)
34449 v0.AddArg2(x, z)
34450 v.AddArg2(v0, i)
34451 return true
34452 }
34453 break
34454 }
34455
34456
34457
34458 for {
34459 if v_0.Op != OpSub8 {
34460 break
34461 }
34462 z := v_0.Args[1]
34463 i := v_0.Args[0]
34464 if i.Op != OpConst8 {
34465 break
34466 }
34467 t := i.Type
34468 x := v_1
34469 if !(z.Op != OpConst8 && x.Op != OpConst8) {
34470 break
34471 }
34472 v.reset(OpSub8)
34473 v0 := b.NewValue0(v.Pos, OpAdd8, t)
34474 v0.AddArg2(z, x)
34475 v.AddArg2(i, v0)
34476 return true
34477 }
34478
34479
34480
34481 for {
34482 if v_0.Op != OpAdd8 {
34483 break
34484 }
34485 _ = v_0.Args[1]
34486 v_0_0 := v_0.Args[0]
34487 v_0_1 := v_0.Args[1]
34488 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34489 z := v_0_0
34490 i := v_0_1
34491 if i.Op != OpConst8 {
34492 continue
34493 }
34494 t := i.Type
34495 x := v_1
34496 if !(z.Op != OpConst8 && x.Op != OpConst8) {
34497 continue
34498 }
34499 v.reset(OpAdd8)
34500 v0 := b.NewValue0(v.Pos, OpSub8, t)
34501 v0.AddArg2(z, x)
34502 v.AddArg2(i, v0)
34503 return true
34504 }
34505 break
34506 }
34507
34508
34509 for {
34510 if v_0.Op != OpConst8 {
34511 break
34512 }
34513 t := v_0.Type
34514 c := auxIntToInt8(v_0.AuxInt)
34515 if v_1.Op != OpSub8 {
34516 break
34517 }
34518 x := v_1.Args[1]
34519 v_1_0 := v_1.Args[0]
34520 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
34521 break
34522 }
34523 d := auxIntToInt8(v_1_0.AuxInt)
34524 v.reset(OpAdd8)
34525 v0 := b.NewValue0(v.Pos, OpConst8, t)
34526 v0.AuxInt = int8ToAuxInt(c - d)
34527 v.AddArg2(v0, x)
34528 return true
34529 }
34530
34531
34532 for {
34533 if v_0.Op != OpConst8 {
34534 break
34535 }
34536 t := v_0.Type
34537 c := auxIntToInt8(v_0.AuxInt)
34538 if v_1.Op != OpAdd8 {
34539 break
34540 }
34541 _ = v_1.Args[1]
34542 v_1_0 := v_1.Args[0]
34543 v_1_1 := v_1.Args[1]
34544 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34545 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
34546 continue
34547 }
34548 d := auxIntToInt8(v_1_0.AuxInt)
34549 x := v_1_1
34550 v.reset(OpSub8)
34551 v0 := b.NewValue0(v.Pos, OpConst8, t)
34552 v0.AuxInt = int8ToAuxInt(c - d)
34553 v.AddArg2(v0, x)
34554 return true
34555 }
34556 break
34557 }
34558 return false
34559 }
34560 func rewriteValuegeneric_OpTrunc(v *Value) bool {
34561 v_0 := v.Args[0]
34562
34563
34564 for {
34565 if v_0.Op != OpConst64F {
34566 break
34567 }
34568 c := auxIntToFloat64(v_0.AuxInt)
34569 v.reset(OpConst64F)
34570 v.AuxInt = float64ToAuxInt(math.Trunc(c))
34571 return true
34572 }
34573 return false
34574 }
34575 func rewriteValuegeneric_OpTrunc16to8(v *Value) bool {
34576 v_0 := v.Args[0]
34577
34578
34579 for {
34580 if v_0.Op != OpConst16 {
34581 break
34582 }
34583 c := auxIntToInt16(v_0.AuxInt)
34584 v.reset(OpConst8)
34585 v.AuxInt = int8ToAuxInt(int8(c))
34586 return true
34587 }
34588
34589
34590 for {
34591 if v_0.Op != OpZeroExt8to16 {
34592 break
34593 }
34594 x := v_0.Args[0]
34595 v.copyOf(x)
34596 return true
34597 }
34598
34599
34600 for {
34601 if v_0.Op != OpSignExt8to16 {
34602 break
34603 }
34604 x := v_0.Args[0]
34605 v.copyOf(x)
34606 return true
34607 }
34608
34609
34610
34611 for {
34612 if v_0.Op != OpAnd16 {
34613 break
34614 }
34615 _ = v_0.Args[1]
34616 v_0_0 := v_0.Args[0]
34617 v_0_1 := v_0.Args[1]
34618 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34619 if v_0_0.Op != OpConst16 {
34620 continue
34621 }
34622 y := auxIntToInt16(v_0_0.AuxInt)
34623 x := v_0_1
34624 if !(y&0xFF == 0xFF) {
34625 continue
34626 }
34627 v.reset(OpTrunc16to8)
34628 v.AddArg(x)
34629 return true
34630 }
34631 break
34632 }
34633 return false
34634 }
34635 func rewriteValuegeneric_OpTrunc32to16(v *Value) bool {
34636 v_0 := v.Args[0]
34637
34638
34639 for {
34640 if v_0.Op != OpConst32 {
34641 break
34642 }
34643 c := auxIntToInt32(v_0.AuxInt)
34644 v.reset(OpConst16)
34645 v.AuxInt = int16ToAuxInt(int16(c))
34646 return true
34647 }
34648
34649
34650 for {
34651 if v_0.Op != OpZeroExt8to32 {
34652 break
34653 }
34654 x := v_0.Args[0]
34655 v.reset(OpZeroExt8to16)
34656 v.AddArg(x)
34657 return true
34658 }
34659
34660
34661 for {
34662 if v_0.Op != OpZeroExt16to32 {
34663 break
34664 }
34665 x := v_0.Args[0]
34666 v.copyOf(x)
34667 return true
34668 }
34669
34670
34671 for {
34672 if v_0.Op != OpSignExt8to32 {
34673 break
34674 }
34675 x := v_0.Args[0]
34676 v.reset(OpSignExt8to16)
34677 v.AddArg(x)
34678 return true
34679 }
34680
34681
34682 for {
34683 if v_0.Op != OpSignExt16to32 {
34684 break
34685 }
34686 x := v_0.Args[0]
34687 v.copyOf(x)
34688 return true
34689 }
34690
34691
34692
34693 for {
34694 if v_0.Op != OpAnd32 {
34695 break
34696 }
34697 _ = v_0.Args[1]
34698 v_0_0 := v_0.Args[0]
34699 v_0_1 := v_0.Args[1]
34700 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34701 if v_0_0.Op != OpConst32 {
34702 continue
34703 }
34704 y := auxIntToInt32(v_0_0.AuxInt)
34705 x := v_0_1
34706 if !(y&0xFFFF == 0xFFFF) {
34707 continue
34708 }
34709 v.reset(OpTrunc32to16)
34710 v.AddArg(x)
34711 return true
34712 }
34713 break
34714 }
34715 return false
34716 }
34717 func rewriteValuegeneric_OpTrunc32to8(v *Value) bool {
34718 v_0 := v.Args[0]
34719
34720
34721 for {
34722 if v_0.Op != OpConst32 {
34723 break
34724 }
34725 c := auxIntToInt32(v_0.AuxInt)
34726 v.reset(OpConst8)
34727 v.AuxInt = int8ToAuxInt(int8(c))
34728 return true
34729 }
34730
34731
34732 for {
34733 if v_0.Op != OpZeroExt8to32 {
34734 break
34735 }
34736 x := v_0.Args[0]
34737 v.copyOf(x)
34738 return true
34739 }
34740
34741
34742 for {
34743 if v_0.Op != OpSignExt8to32 {
34744 break
34745 }
34746 x := v_0.Args[0]
34747 v.copyOf(x)
34748 return true
34749 }
34750
34751
34752
34753 for {
34754 if v_0.Op != OpAnd32 {
34755 break
34756 }
34757 _ = v_0.Args[1]
34758 v_0_0 := v_0.Args[0]
34759 v_0_1 := v_0.Args[1]
34760 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34761 if v_0_0.Op != OpConst32 {
34762 continue
34763 }
34764 y := auxIntToInt32(v_0_0.AuxInt)
34765 x := v_0_1
34766 if !(y&0xFF == 0xFF) {
34767 continue
34768 }
34769 v.reset(OpTrunc32to8)
34770 v.AddArg(x)
34771 return true
34772 }
34773 break
34774 }
34775 return false
34776 }
34777 func rewriteValuegeneric_OpTrunc64to16(v *Value) bool {
34778 v_0 := v.Args[0]
34779
34780
34781 for {
34782 if v_0.Op != OpConst64 {
34783 break
34784 }
34785 c := auxIntToInt64(v_0.AuxInt)
34786 v.reset(OpConst16)
34787 v.AuxInt = int16ToAuxInt(int16(c))
34788 return true
34789 }
34790
34791
34792 for {
34793 if v_0.Op != OpZeroExt8to64 {
34794 break
34795 }
34796 x := v_0.Args[0]
34797 v.reset(OpZeroExt8to16)
34798 v.AddArg(x)
34799 return true
34800 }
34801
34802
34803 for {
34804 if v_0.Op != OpZeroExt16to64 {
34805 break
34806 }
34807 x := v_0.Args[0]
34808 v.copyOf(x)
34809 return true
34810 }
34811
34812
34813 for {
34814 if v_0.Op != OpSignExt8to64 {
34815 break
34816 }
34817 x := v_0.Args[0]
34818 v.reset(OpSignExt8to16)
34819 v.AddArg(x)
34820 return true
34821 }
34822
34823
34824 for {
34825 if v_0.Op != OpSignExt16to64 {
34826 break
34827 }
34828 x := v_0.Args[0]
34829 v.copyOf(x)
34830 return true
34831 }
34832
34833
34834
34835 for {
34836 if v_0.Op != OpAnd64 {
34837 break
34838 }
34839 _ = v_0.Args[1]
34840 v_0_0 := v_0.Args[0]
34841 v_0_1 := v_0.Args[1]
34842 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34843 if v_0_0.Op != OpConst64 {
34844 continue
34845 }
34846 y := auxIntToInt64(v_0_0.AuxInt)
34847 x := v_0_1
34848 if !(y&0xFFFF == 0xFFFF) {
34849 continue
34850 }
34851 v.reset(OpTrunc64to16)
34852 v.AddArg(x)
34853 return true
34854 }
34855 break
34856 }
34857 return false
34858 }
34859 func rewriteValuegeneric_OpTrunc64to32(v *Value) bool {
34860 v_0 := v.Args[0]
34861
34862
34863 for {
34864 if v_0.Op != OpConst64 {
34865 break
34866 }
34867 c := auxIntToInt64(v_0.AuxInt)
34868 v.reset(OpConst32)
34869 v.AuxInt = int32ToAuxInt(int32(c))
34870 return true
34871 }
34872
34873
34874 for {
34875 if v_0.Op != OpZeroExt8to64 {
34876 break
34877 }
34878 x := v_0.Args[0]
34879 v.reset(OpZeroExt8to32)
34880 v.AddArg(x)
34881 return true
34882 }
34883
34884
34885 for {
34886 if v_0.Op != OpZeroExt16to64 {
34887 break
34888 }
34889 x := v_0.Args[0]
34890 v.reset(OpZeroExt16to32)
34891 v.AddArg(x)
34892 return true
34893 }
34894
34895
34896 for {
34897 if v_0.Op != OpZeroExt32to64 {
34898 break
34899 }
34900 x := v_0.Args[0]
34901 v.copyOf(x)
34902 return true
34903 }
34904
34905
34906 for {
34907 if v_0.Op != OpSignExt8to64 {
34908 break
34909 }
34910 x := v_0.Args[0]
34911 v.reset(OpSignExt8to32)
34912 v.AddArg(x)
34913 return true
34914 }
34915
34916
34917 for {
34918 if v_0.Op != OpSignExt16to64 {
34919 break
34920 }
34921 x := v_0.Args[0]
34922 v.reset(OpSignExt16to32)
34923 v.AddArg(x)
34924 return true
34925 }
34926
34927
34928 for {
34929 if v_0.Op != OpSignExt32to64 {
34930 break
34931 }
34932 x := v_0.Args[0]
34933 v.copyOf(x)
34934 return true
34935 }
34936
34937
34938
34939 for {
34940 if v_0.Op != OpAnd64 {
34941 break
34942 }
34943 _ = v_0.Args[1]
34944 v_0_0 := v_0.Args[0]
34945 v_0_1 := v_0.Args[1]
34946 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34947 if v_0_0.Op != OpConst64 {
34948 continue
34949 }
34950 y := auxIntToInt64(v_0_0.AuxInt)
34951 x := v_0_1
34952 if !(y&0xFFFFFFFF == 0xFFFFFFFF) {
34953 continue
34954 }
34955 v.reset(OpTrunc64to32)
34956 v.AddArg(x)
34957 return true
34958 }
34959 break
34960 }
34961 return false
34962 }
34963 func rewriteValuegeneric_OpTrunc64to8(v *Value) bool {
34964 v_0 := v.Args[0]
34965
34966
34967 for {
34968 if v_0.Op != OpConst64 {
34969 break
34970 }
34971 c := auxIntToInt64(v_0.AuxInt)
34972 v.reset(OpConst8)
34973 v.AuxInt = int8ToAuxInt(int8(c))
34974 return true
34975 }
34976
34977
34978 for {
34979 if v_0.Op != OpZeroExt8to64 {
34980 break
34981 }
34982 x := v_0.Args[0]
34983 v.copyOf(x)
34984 return true
34985 }
34986
34987
34988 for {
34989 if v_0.Op != OpSignExt8to64 {
34990 break
34991 }
34992 x := v_0.Args[0]
34993 v.copyOf(x)
34994 return true
34995 }
34996
34997
34998
34999 for {
35000 if v_0.Op != OpAnd64 {
35001 break
35002 }
35003 _ = v_0.Args[1]
35004 v_0_0 := v_0.Args[0]
35005 v_0_1 := v_0.Args[1]
35006 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35007 if v_0_0.Op != OpConst64 {
35008 continue
35009 }
35010 y := auxIntToInt64(v_0_0.AuxInt)
35011 x := v_0_1
35012 if !(y&0xFF == 0xFF) {
35013 continue
35014 }
35015 v.reset(OpTrunc64to8)
35016 v.AddArg(x)
35017 return true
35018 }
35019 break
35020 }
35021 return false
35022 }
35023 func rewriteValuegeneric_OpXor16(v *Value) bool {
35024 v_1 := v.Args[1]
35025 v_0 := v.Args[0]
35026 b := v.Block
35027 config := b.Func.Config
35028
35029
35030 for {
35031 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35032 if v_0.Op != OpConst16 {
35033 continue
35034 }
35035 c := auxIntToInt16(v_0.AuxInt)
35036 if v_1.Op != OpConst16 {
35037 continue
35038 }
35039 d := auxIntToInt16(v_1.AuxInt)
35040 v.reset(OpConst16)
35041 v.AuxInt = int16ToAuxInt(c ^ d)
35042 return true
35043 }
35044 break
35045 }
35046
35047
35048 for {
35049 x := v_0
35050 if x != v_1 {
35051 break
35052 }
35053 v.reset(OpConst16)
35054 v.AuxInt = int16ToAuxInt(0)
35055 return true
35056 }
35057
35058
35059 for {
35060 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35061 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
35062 continue
35063 }
35064 x := v_1
35065 v.copyOf(x)
35066 return true
35067 }
35068 break
35069 }
35070
35071
35072 for {
35073 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35074 if v_0.Op != OpCom16 {
35075 continue
35076 }
35077 x := v_0.Args[0]
35078 if x != v_1 {
35079 continue
35080 }
35081 v.reset(OpConst16)
35082 v.AuxInt = int16ToAuxInt(-1)
35083 return true
35084 }
35085 break
35086 }
35087
35088
35089 for {
35090 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35091 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
35092 continue
35093 }
35094 x := v_1
35095 v.reset(OpCom16)
35096 v.AddArg(x)
35097 return true
35098 }
35099 break
35100 }
35101
35102
35103 for {
35104 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35105 x := v_0
35106 if v_1.Op != OpXor16 {
35107 continue
35108 }
35109 _ = v_1.Args[1]
35110 v_1_0 := v_1.Args[0]
35111 v_1_1 := v_1.Args[1]
35112 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35113 if x != v_1_0 {
35114 continue
35115 }
35116 y := v_1_1
35117 v.copyOf(y)
35118 return true
35119 }
35120 }
35121 break
35122 }
35123
35124
35125
35126 for {
35127 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35128 if v_0.Op != OpXor16 {
35129 continue
35130 }
35131 _ = v_0.Args[1]
35132 v_0_0 := v_0.Args[0]
35133 v_0_1 := v_0.Args[1]
35134 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
35135 i := v_0_0
35136 if i.Op != OpConst16 {
35137 continue
35138 }
35139 t := i.Type
35140 z := v_0_1
35141 x := v_1
35142 if !(z.Op != OpConst16 && x.Op != OpConst16) {
35143 continue
35144 }
35145 v.reset(OpXor16)
35146 v0 := b.NewValue0(v.Pos, OpXor16, t)
35147 v0.AddArg2(z, x)
35148 v.AddArg2(i, v0)
35149 return true
35150 }
35151 }
35152 break
35153 }
35154
35155
35156 for {
35157 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35158 if v_0.Op != OpConst16 {
35159 continue
35160 }
35161 t := v_0.Type
35162 c := auxIntToInt16(v_0.AuxInt)
35163 if v_1.Op != OpXor16 {
35164 continue
35165 }
35166 _ = v_1.Args[1]
35167 v_1_0 := v_1.Args[0]
35168 v_1_1 := v_1.Args[1]
35169 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35170 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
35171 continue
35172 }
35173 d := auxIntToInt16(v_1_0.AuxInt)
35174 x := v_1_1
35175 v.reset(OpXor16)
35176 v0 := b.NewValue0(v.Pos, OpConst16, t)
35177 v0.AuxInt = int16ToAuxInt(c ^ d)
35178 v.AddArg2(v0, x)
35179 return true
35180 }
35181 }
35182 break
35183 }
35184
35185
35186
35187 for {
35188 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35189 if v_0.Op != OpLsh16x64 {
35190 continue
35191 }
35192 _ = v_0.Args[1]
35193 x := v_0.Args[0]
35194 z := v_0.Args[1]
35195 if z.Op != OpConst64 {
35196 continue
35197 }
35198 c := auxIntToInt64(z.AuxInt)
35199 if v_1.Op != OpRsh16Ux64 {
35200 continue
35201 }
35202 _ = v_1.Args[1]
35203 if x != v_1.Args[0] {
35204 continue
35205 }
35206 v_1_1 := v_1.Args[1]
35207 if v_1_1.Op != OpConst64 {
35208 continue
35209 }
35210 d := auxIntToInt64(v_1_1.AuxInt)
35211 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
35212 continue
35213 }
35214 v.reset(OpRotateLeft16)
35215 v.AddArg2(x, z)
35216 return true
35217 }
35218 break
35219 }
35220
35221
35222
35223 for {
35224 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35225 left := v_0
35226 if left.Op != OpLsh16x64 {
35227 continue
35228 }
35229 y := left.Args[1]
35230 x := left.Args[0]
35231 right := v_1
35232 if right.Op != OpRsh16Ux64 {
35233 continue
35234 }
35235 _ = right.Args[1]
35236 if x != right.Args[0] {
35237 continue
35238 }
35239 right_1 := right.Args[1]
35240 if right_1.Op != OpSub64 {
35241 continue
35242 }
35243 _ = right_1.Args[1]
35244 right_1_0 := right_1.Args[0]
35245 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
35246 continue
35247 }
35248 v.reset(OpRotateLeft16)
35249 v.AddArg2(x, y)
35250 return true
35251 }
35252 break
35253 }
35254
35255
35256
35257 for {
35258 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35259 left := v_0
35260 if left.Op != OpLsh16x32 {
35261 continue
35262 }
35263 y := left.Args[1]
35264 x := left.Args[0]
35265 right := v_1
35266 if right.Op != OpRsh16Ux32 {
35267 continue
35268 }
35269 _ = right.Args[1]
35270 if x != right.Args[0] {
35271 continue
35272 }
35273 right_1 := right.Args[1]
35274 if right_1.Op != OpSub32 {
35275 continue
35276 }
35277 _ = right_1.Args[1]
35278 right_1_0 := right_1.Args[0]
35279 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
35280 continue
35281 }
35282 v.reset(OpRotateLeft16)
35283 v.AddArg2(x, y)
35284 return true
35285 }
35286 break
35287 }
35288
35289
35290
35291 for {
35292 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35293 left := v_0
35294 if left.Op != OpLsh16x16 {
35295 continue
35296 }
35297 y := left.Args[1]
35298 x := left.Args[0]
35299 right := v_1
35300 if right.Op != OpRsh16Ux16 {
35301 continue
35302 }
35303 _ = right.Args[1]
35304 if x != right.Args[0] {
35305 continue
35306 }
35307 right_1 := right.Args[1]
35308 if right_1.Op != OpSub16 {
35309 continue
35310 }
35311 _ = right_1.Args[1]
35312 right_1_0 := right_1.Args[0]
35313 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
35314 continue
35315 }
35316 v.reset(OpRotateLeft16)
35317 v.AddArg2(x, y)
35318 return true
35319 }
35320 break
35321 }
35322
35323
35324
35325 for {
35326 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35327 left := v_0
35328 if left.Op != OpLsh16x8 {
35329 continue
35330 }
35331 y := left.Args[1]
35332 x := left.Args[0]
35333 right := v_1
35334 if right.Op != OpRsh16Ux8 {
35335 continue
35336 }
35337 _ = right.Args[1]
35338 if x != right.Args[0] {
35339 continue
35340 }
35341 right_1 := right.Args[1]
35342 if right_1.Op != OpSub8 {
35343 continue
35344 }
35345 _ = right_1.Args[1]
35346 right_1_0 := right_1.Args[0]
35347 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
35348 continue
35349 }
35350 v.reset(OpRotateLeft16)
35351 v.AddArg2(x, y)
35352 return true
35353 }
35354 break
35355 }
35356
35357
35358
35359 for {
35360 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35361 right := v_0
35362 if right.Op != OpRsh16Ux64 {
35363 continue
35364 }
35365 y := right.Args[1]
35366 x := right.Args[0]
35367 left := v_1
35368 if left.Op != OpLsh16x64 {
35369 continue
35370 }
35371 _ = left.Args[1]
35372 if x != left.Args[0] {
35373 continue
35374 }
35375 z := left.Args[1]
35376 if z.Op != OpSub64 {
35377 continue
35378 }
35379 _ = z.Args[1]
35380 z_0 := z.Args[0]
35381 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
35382 continue
35383 }
35384 v.reset(OpRotateLeft16)
35385 v.AddArg2(x, z)
35386 return true
35387 }
35388 break
35389 }
35390
35391
35392
35393 for {
35394 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35395 right := v_0
35396 if right.Op != OpRsh16Ux32 {
35397 continue
35398 }
35399 y := right.Args[1]
35400 x := right.Args[0]
35401 left := v_1
35402 if left.Op != OpLsh16x32 {
35403 continue
35404 }
35405 _ = left.Args[1]
35406 if x != left.Args[0] {
35407 continue
35408 }
35409 z := left.Args[1]
35410 if z.Op != OpSub32 {
35411 continue
35412 }
35413 _ = z.Args[1]
35414 z_0 := z.Args[0]
35415 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
35416 continue
35417 }
35418 v.reset(OpRotateLeft16)
35419 v.AddArg2(x, z)
35420 return true
35421 }
35422 break
35423 }
35424
35425
35426
35427 for {
35428 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35429 right := v_0
35430 if right.Op != OpRsh16Ux16 {
35431 continue
35432 }
35433 y := right.Args[1]
35434 x := right.Args[0]
35435 left := v_1
35436 if left.Op != OpLsh16x16 {
35437 continue
35438 }
35439 _ = left.Args[1]
35440 if x != left.Args[0] {
35441 continue
35442 }
35443 z := left.Args[1]
35444 if z.Op != OpSub16 {
35445 continue
35446 }
35447 _ = z.Args[1]
35448 z_0 := z.Args[0]
35449 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
35450 continue
35451 }
35452 v.reset(OpRotateLeft16)
35453 v.AddArg2(x, z)
35454 return true
35455 }
35456 break
35457 }
35458
35459
35460
35461 for {
35462 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35463 right := v_0
35464 if right.Op != OpRsh16Ux8 {
35465 continue
35466 }
35467 y := right.Args[1]
35468 x := right.Args[0]
35469 left := v_1
35470 if left.Op != OpLsh16x8 {
35471 continue
35472 }
35473 _ = left.Args[1]
35474 if x != left.Args[0] {
35475 continue
35476 }
35477 z := left.Args[1]
35478 if z.Op != OpSub8 {
35479 continue
35480 }
35481 _ = z.Args[1]
35482 z_0 := z.Args[0]
35483 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
35484 continue
35485 }
35486 v.reset(OpRotateLeft16)
35487 v.AddArg2(x, z)
35488 return true
35489 }
35490 break
35491 }
35492 return false
35493 }
35494 func rewriteValuegeneric_OpXor32(v *Value) bool {
35495 v_1 := v.Args[1]
35496 v_0 := v.Args[0]
35497 b := v.Block
35498 config := b.Func.Config
35499
35500
35501 for {
35502 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35503 if v_0.Op != OpConst32 {
35504 continue
35505 }
35506 c := auxIntToInt32(v_0.AuxInt)
35507 if v_1.Op != OpConst32 {
35508 continue
35509 }
35510 d := auxIntToInt32(v_1.AuxInt)
35511 v.reset(OpConst32)
35512 v.AuxInt = int32ToAuxInt(c ^ d)
35513 return true
35514 }
35515 break
35516 }
35517
35518
35519 for {
35520 x := v_0
35521 if x != v_1 {
35522 break
35523 }
35524 v.reset(OpConst32)
35525 v.AuxInt = int32ToAuxInt(0)
35526 return true
35527 }
35528
35529
35530 for {
35531 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35532 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
35533 continue
35534 }
35535 x := v_1
35536 v.copyOf(x)
35537 return true
35538 }
35539 break
35540 }
35541
35542
35543 for {
35544 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35545 if v_0.Op != OpCom32 {
35546 continue
35547 }
35548 x := v_0.Args[0]
35549 if x != v_1 {
35550 continue
35551 }
35552 v.reset(OpConst32)
35553 v.AuxInt = int32ToAuxInt(-1)
35554 return true
35555 }
35556 break
35557 }
35558
35559
35560 for {
35561 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35562 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
35563 continue
35564 }
35565 x := v_1
35566 v.reset(OpCom32)
35567 v.AddArg(x)
35568 return true
35569 }
35570 break
35571 }
35572
35573
35574 for {
35575 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35576 x := v_0
35577 if v_1.Op != OpXor32 {
35578 continue
35579 }
35580 _ = v_1.Args[1]
35581 v_1_0 := v_1.Args[0]
35582 v_1_1 := v_1.Args[1]
35583 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35584 if x != v_1_0 {
35585 continue
35586 }
35587 y := v_1_1
35588 v.copyOf(y)
35589 return true
35590 }
35591 }
35592 break
35593 }
35594
35595
35596
35597 for {
35598 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35599 if v_0.Op != OpXor32 {
35600 continue
35601 }
35602 _ = v_0.Args[1]
35603 v_0_0 := v_0.Args[0]
35604 v_0_1 := v_0.Args[1]
35605 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
35606 i := v_0_0
35607 if i.Op != OpConst32 {
35608 continue
35609 }
35610 t := i.Type
35611 z := v_0_1
35612 x := v_1
35613 if !(z.Op != OpConst32 && x.Op != OpConst32) {
35614 continue
35615 }
35616 v.reset(OpXor32)
35617 v0 := b.NewValue0(v.Pos, OpXor32, t)
35618 v0.AddArg2(z, x)
35619 v.AddArg2(i, v0)
35620 return true
35621 }
35622 }
35623 break
35624 }
35625
35626
35627 for {
35628 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35629 if v_0.Op != OpConst32 {
35630 continue
35631 }
35632 t := v_0.Type
35633 c := auxIntToInt32(v_0.AuxInt)
35634 if v_1.Op != OpXor32 {
35635 continue
35636 }
35637 _ = v_1.Args[1]
35638 v_1_0 := v_1.Args[0]
35639 v_1_1 := v_1.Args[1]
35640 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35641 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
35642 continue
35643 }
35644 d := auxIntToInt32(v_1_0.AuxInt)
35645 x := v_1_1
35646 v.reset(OpXor32)
35647 v0 := b.NewValue0(v.Pos, OpConst32, t)
35648 v0.AuxInt = int32ToAuxInt(c ^ d)
35649 v.AddArg2(v0, x)
35650 return true
35651 }
35652 }
35653 break
35654 }
35655
35656
35657
35658 for {
35659 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35660 if v_0.Op != OpLsh32x64 {
35661 continue
35662 }
35663 _ = v_0.Args[1]
35664 x := v_0.Args[0]
35665 z := v_0.Args[1]
35666 if z.Op != OpConst64 {
35667 continue
35668 }
35669 c := auxIntToInt64(z.AuxInt)
35670 if v_1.Op != OpRsh32Ux64 {
35671 continue
35672 }
35673 _ = v_1.Args[1]
35674 if x != v_1.Args[0] {
35675 continue
35676 }
35677 v_1_1 := v_1.Args[1]
35678 if v_1_1.Op != OpConst64 {
35679 continue
35680 }
35681 d := auxIntToInt64(v_1_1.AuxInt)
35682 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
35683 continue
35684 }
35685 v.reset(OpRotateLeft32)
35686 v.AddArg2(x, z)
35687 return true
35688 }
35689 break
35690 }
35691
35692
35693
35694 for {
35695 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35696 left := v_0
35697 if left.Op != OpLsh32x64 {
35698 continue
35699 }
35700 y := left.Args[1]
35701 x := left.Args[0]
35702 right := v_1
35703 if right.Op != OpRsh32Ux64 {
35704 continue
35705 }
35706 _ = right.Args[1]
35707 if x != right.Args[0] {
35708 continue
35709 }
35710 right_1 := right.Args[1]
35711 if right_1.Op != OpSub64 {
35712 continue
35713 }
35714 _ = right_1.Args[1]
35715 right_1_0 := right_1.Args[0]
35716 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35717 continue
35718 }
35719 v.reset(OpRotateLeft32)
35720 v.AddArg2(x, y)
35721 return true
35722 }
35723 break
35724 }
35725
35726
35727
35728 for {
35729 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35730 left := v_0
35731 if left.Op != OpLsh32x32 {
35732 continue
35733 }
35734 y := left.Args[1]
35735 x := left.Args[0]
35736 right := v_1
35737 if right.Op != OpRsh32Ux32 {
35738 continue
35739 }
35740 _ = right.Args[1]
35741 if x != right.Args[0] {
35742 continue
35743 }
35744 right_1 := right.Args[1]
35745 if right_1.Op != OpSub32 {
35746 continue
35747 }
35748 _ = right_1.Args[1]
35749 right_1_0 := right_1.Args[0]
35750 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35751 continue
35752 }
35753 v.reset(OpRotateLeft32)
35754 v.AddArg2(x, y)
35755 return true
35756 }
35757 break
35758 }
35759
35760
35761
35762 for {
35763 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35764 left := v_0
35765 if left.Op != OpLsh32x16 {
35766 continue
35767 }
35768 y := left.Args[1]
35769 x := left.Args[0]
35770 right := v_1
35771 if right.Op != OpRsh32Ux16 {
35772 continue
35773 }
35774 _ = right.Args[1]
35775 if x != right.Args[0] {
35776 continue
35777 }
35778 right_1 := right.Args[1]
35779 if right_1.Op != OpSub16 {
35780 continue
35781 }
35782 _ = right_1.Args[1]
35783 right_1_0 := right_1.Args[0]
35784 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35785 continue
35786 }
35787 v.reset(OpRotateLeft32)
35788 v.AddArg2(x, y)
35789 return true
35790 }
35791 break
35792 }
35793
35794
35795
35796 for {
35797 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35798 left := v_0
35799 if left.Op != OpLsh32x8 {
35800 continue
35801 }
35802 y := left.Args[1]
35803 x := left.Args[0]
35804 right := v_1
35805 if right.Op != OpRsh32Ux8 {
35806 continue
35807 }
35808 _ = right.Args[1]
35809 if x != right.Args[0] {
35810 continue
35811 }
35812 right_1 := right.Args[1]
35813 if right_1.Op != OpSub8 {
35814 continue
35815 }
35816 _ = right_1.Args[1]
35817 right_1_0 := right_1.Args[0]
35818 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35819 continue
35820 }
35821 v.reset(OpRotateLeft32)
35822 v.AddArg2(x, y)
35823 return true
35824 }
35825 break
35826 }
35827
35828
35829
35830 for {
35831 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35832 right := v_0
35833 if right.Op != OpRsh32Ux64 {
35834 continue
35835 }
35836 y := right.Args[1]
35837 x := right.Args[0]
35838 left := v_1
35839 if left.Op != OpLsh32x64 {
35840 continue
35841 }
35842 _ = left.Args[1]
35843 if x != left.Args[0] {
35844 continue
35845 }
35846 z := left.Args[1]
35847 if z.Op != OpSub64 {
35848 continue
35849 }
35850 _ = z.Args[1]
35851 z_0 := z.Args[0]
35852 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35853 continue
35854 }
35855 v.reset(OpRotateLeft32)
35856 v.AddArg2(x, z)
35857 return true
35858 }
35859 break
35860 }
35861
35862
35863
35864 for {
35865 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35866 right := v_0
35867 if right.Op != OpRsh32Ux32 {
35868 continue
35869 }
35870 y := right.Args[1]
35871 x := right.Args[0]
35872 left := v_1
35873 if left.Op != OpLsh32x32 {
35874 continue
35875 }
35876 _ = left.Args[1]
35877 if x != left.Args[0] {
35878 continue
35879 }
35880 z := left.Args[1]
35881 if z.Op != OpSub32 {
35882 continue
35883 }
35884 _ = z.Args[1]
35885 z_0 := z.Args[0]
35886 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35887 continue
35888 }
35889 v.reset(OpRotateLeft32)
35890 v.AddArg2(x, z)
35891 return true
35892 }
35893 break
35894 }
35895
35896
35897
35898 for {
35899 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35900 right := v_0
35901 if right.Op != OpRsh32Ux16 {
35902 continue
35903 }
35904 y := right.Args[1]
35905 x := right.Args[0]
35906 left := v_1
35907 if left.Op != OpLsh32x16 {
35908 continue
35909 }
35910 _ = left.Args[1]
35911 if x != left.Args[0] {
35912 continue
35913 }
35914 z := left.Args[1]
35915 if z.Op != OpSub16 {
35916 continue
35917 }
35918 _ = z.Args[1]
35919 z_0 := z.Args[0]
35920 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35921 continue
35922 }
35923 v.reset(OpRotateLeft32)
35924 v.AddArg2(x, z)
35925 return true
35926 }
35927 break
35928 }
35929
35930
35931
35932 for {
35933 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35934 right := v_0
35935 if right.Op != OpRsh32Ux8 {
35936 continue
35937 }
35938 y := right.Args[1]
35939 x := right.Args[0]
35940 left := v_1
35941 if left.Op != OpLsh32x8 {
35942 continue
35943 }
35944 _ = left.Args[1]
35945 if x != left.Args[0] {
35946 continue
35947 }
35948 z := left.Args[1]
35949 if z.Op != OpSub8 {
35950 continue
35951 }
35952 _ = z.Args[1]
35953 z_0 := z.Args[0]
35954 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35955 continue
35956 }
35957 v.reset(OpRotateLeft32)
35958 v.AddArg2(x, z)
35959 return true
35960 }
35961 break
35962 }
35963 return false
35964 }
35965 func rewriteValuegeneric_OpXor64(v *Value) bool {
35966 v_1 := v.Args[1]
35967 v_0 := v.Args[0]
35968 b := v.Block
35969 config := b.Func.Config
35970
35971
35972 for {
35973 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35974 if v_0.Op != OpConst64 {
35975 continue
35976 }
35977 c := auxIntToInt64(v_0.AuxInt)
35978 if v_1.Op != OpConst64 {
35979 continue
35980 }
35981 d := auxIntToInt64(v_1.AuxInt)
35982 v.reset(OpConst64)
35983 v.AuxInt = int64ToAuxInt(c ^ d)
35984 return true
35985 }
35986 break
35987 }
35988
35989
35990 for {
35991 x := v_0
35992 if x != v_1 {
35993 break
35994 }
35995 v.reset(OpConst64)
35996 v.AuxInt = int64ToAuxInt(0)
35997 return true
35998 }
35999
36000
36001 for {
36002 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36003 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
36004 continue
36005 }
36006 x := v_1
36007 v.copyOf(x)
36008 return true
36009 }
36010 break
36011 }
36012
36013
36014 for {
36015 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36016 if v_0.Op != OpCom64 {
36017 continue
36018 }
36019 x := v_0.Args[0]
36020 if x != v_1 {
36021 continue
36022 }
36023 v.reset(OpConst64)
36024 v.AuxInt = int64ToAuxInt(-1)
36025 return true
36026 }
36027 break
36028 }
36029
36030
36031 for {
36032 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36033 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
36034 continue
36035 }
36036 x := v_1
36037 v.reset(OpCom64)
36038 v.AddArg(x)
36039 return true
36040 }
36041 break
36042 }
36043
36044
36045 for {
36046 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36047 x := v_0
36048 if v_1.Op != OpXor64 {
36049 continue
36050 }
36051 _ = v_1.Args[1]
36052 v_1_0 := v_1.Args[0]
36053 v_1_1 := v_1.Args[1]
36054 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36055 if x != v_1_0 {
36056 continue
36057 }
36058 y := v_1_1
36059 v.copyOf(y)
36060 return true
36061 }
36062 }
36063 break
36064 }
36065
36066
36067
36068 for {
36069 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36070 if v_0.Op != OpXor64 {
36071 continue
36072 }
36073 _ = v_0.Args[1]
36074 v_0_0 := v_0.Args[0]
36075 v_0_1 := v_0.Args[1]
36076 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
36077 i := v_0_0
36078 if i.Op != OpConst64 {
36079 continue
36080 }
36081 t := i.Type
36082 z := v_0_1
36083 x := v_1
36084 if !(z.Op != OpConst64 && x.Op != OpConst64) {
36085 continue
36086 }
36087 v.reset(OpXor64)
36088 v0 := b.NewValue0(v.Pos, OpXor64, t)
36089 v0.AddArg2(z, x)
36090 v.AddArg2(i, v0)
36091 return true
36092 }
36093 }
36094 break
36095 }
36096
36097
36098 for {
36099 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36100 if v_0.Op != OpConst64 {
36101 continue
36102 }
36103 t := v_0.Type
36104 c := auxIntToInt64(v_0.AuxInt)
36105 if v_1.Op != OpXor64 {
36106 continue
36107 }
36108 _ = v_1.Args[1]
36109 v_1_0 := v_1.Args[0]
36110 v_1_1 := v_1.Args[1]
36111 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36112 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
36113 continue
36114 }
36115 d := auxIntToInt64(v_1_0.AuxInt)
36116 x := v_1_1
36117 v.reset(OpXor64)
36118 v0 := b.NewValue0(v.Pos, OpConst64, t)
36119 v0.AuxInt = int64ToAuxInt(c ^ d)
36120 v.AddArg2(v0, x)
36121 return true
36122 }
36123 }
36124 break
36125 }
36126
36127
36128
36129 for {
36130 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36131 if v_0.Op != OpLsh64x64 {
36132 continue
36133 }
36134 _ = v_0.Args[1]
36135 x := v_0.Args[0]
36136 z := v_0.Args[1]
36137 if z.Op != OpConst64 {
36138 continue
36139 }
36140 c := auxIntToInt64(z.AuxInt)
36141 if v_1.Op != OpRsh64Ux64 {
36142 continue
36143 }
36144 _ = v_1.Args[1]
36145 if x != v_1.Args[0] {
36146 continue
36147 }
36148 v_1_1 := v_1.Args[1]
36149 if v_1_1.Op != OpConst64 {
36150 continue
36151 }
36152 d := auxIntToInt64(v_1_1.AuxInt)
36153 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
36154 continue
36155 }
36156 v.reset(OpRotateLeft64)
36157 v.AddArg2(x, z)
36158 return true
36159 }
36160 break
36161 }
36162
36163
36164
36165 for {
36166 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36167 left := v_0
36168 if left.Op != OpLsh64x64 {
36169 continue
36170 }
36171 y := left.Args[1]
36172 x := left.Args[0]
36173 right := v_1
36174 if right.Op != OpRsh64Ux64 {
36175 continue
36176 }
36177 _ = right.Args[1]
36178 if x != right.Args[0] {
36179 continue
36180 }
36181 right_1 := right.Args[1]
36182 if right_1.Op != OpSub64 {
36183 continue
36184 }
36185 _ = right_1.Args[1]
36186 right_1_0 := right_1.Args[0]
36187 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
36188 continue
36189 }
36190 v.reset(OpRotateLeft64)
36191 v.AddArg2(x, y)
36192 return true
36193 }
36194 break
36195 }
36196
36197
36198
36199 for {
36200 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36201 left := v_0
36202 if left.Op != OpLsh64x32 {
36203 continue
36204 }
36205 y := left.Args[1]
36206 x := left.Args[0]
36207 right := v_1
36208 if right.Op != OpRsh64Ux32 {
36209 continue
36210 }
36211 _ = right.Args[1]
36212 if x != right.Args[0] {
36213 continue
36214 }
36215 right_1 := right.Args[1]
36216 if right_1.Op != OpSub32 {
36217 continue
36218 }
36219 _ = right_1.Args[1]
36220 right_1_0 := right_1.Args[0]
36221 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
36222 continue
36223 }
36224 v.reset(OpRotateLeft64)
36225 v.AddArg2(x, y)
36226 return true
36227 }
36228 break
36229 }
36230
36231
36232
36233 for {
36234 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36235 left := v_0
36236 if left.Op != OpLsh64x16 {
36237 continue
36238 }
36239 y := left.Args[1]
36240 x := left.Args[0]
36241 right := v_1
36242 if right.Op != OpRsh64Ux16 {
36243 continue
36244 }
36245 _ = right.Args[1]
36246 if x != right.Args[0] {
36247 continue
36248 }
36249 right_1 := right.Args[1]
36250 if right_1.Op != OpSub16 {
36251 continue
36252 }
36253 _ = right_1.Args[1]
36254 right_1_0 := right_1.Args[0]
36255 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
36256 continue
36257 }
36258 v.reset(OpRotateLeft64)
36259 v.AddArg2(x, y)
36260 return true
36261 }
36262 break
36263 }
36264
36265
36266
36267 for {
36268 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36269 left := v_0
36270 if left.Op != OpLsh64x8 {
36271 continue
36272 }
36273 y := left.Args[1]
36274 x := left.Args[0]
36275 right := v_1
36276 if right.Op != OpRsh64Ux8 {
36277 continue
36278 }
36279 _ = right.Args[1]
36280 if x != right.Args[0] {
36281 continue
36282 }
36283 right_1 := right.Args[1]
36284 if right_1.Op != OpSub8 {
36285 continue
36286 }
36287 _ = right_1.Args[1]
36288 right_1_0 := right_1.Args[0]
36289 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
36290 continue
36291 }
36292 v.reset(OpRotateLeft64)
36293 v.AddArg2(x, y)
36294 return true
36295 }
36296 break
36297 }
36298
36299
36300
36301 for {
36302 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36303 right := v_0
36304 if right.Op != OpRsh64Ux64 {
36305 continue
36306 }
36307 y := right.Args[1]
36308 x := right.Args[0]
36309 left := v_1
36310 if left.Op != OpLsh64x64 {
36311 continue
36312 }
36313 _ = left.Args[1]
36314 if x != left.Args[0] {
36315 continue
36316 }
36317 z := left.Args[1]
36318 if z.Op != OpSub64 {
36319 continue
36320 }
36321 _ = z.Args[1]
36322 z_0 := z.Args[0]
36323 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
36324 continue
36325 }
36326 v.reset(OpRotateLeft64)
36327 v.AddArg2(x, z)
36328 return true
36329 }
36330 break
36331 }
36332
36333
36334
36335 for {
36336 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36337 right := v_0
36338 if right.Op != OpRsh64Ux32 {
36339 continue
36340 }
36341 y := right.Args[1]
36342 x := right.Args[0]
36343 left := v_1
36344 if left.Op != OpLsh64x32 {
36345 continue
36346 }
36347 _ = left.Args[1]
36348 if x != left.Args[0] {
36349 continue
36350 }
36351 z := left.Args[1]
36352 if z.Op != OpSub32 {
36353 continue
36354 }
36355 _ = z.Args[1]
36356 z_0 := z.Args[0]
36357 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
36358 continue
36359 }
36360 v.reset(OpRotateLeft64)
36361 v.AddArg2(x, z)
36362 return true
36363 }
36364 break
36365 }
36366
36367
36368
36369 for {
36370 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36371 right := v_0
36372 if right.Op != OpRsh64Ux16 {
36373 continue
36374 }
36375 y := right.Args[1]
36376 x := right.Args[0]
36377 left := v_1
36378 if left.Op != OpLsh64x16 {
36379 continue
36380 }
36381 _ = left.Args[1]
36382 if x != left.Args[0] {
36383 continue
36384 }
36385 z := left.Args[1]
36386 if z.Op != OpSub16 {
36387 continue
36388 }
36389 _ = z.Args[1]
36390 z_0 := z.Args[0]
36391 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
36392 continue
36393 }
36394 v.reset(OpRotateLeft64)
36395 v.AddArg2(x, z)
36396 return true
36397 }
36398 break
36399 }
36400
36401
36402
36403 for {
36404 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36405 right := v_0
36406 if right.Op != OpRsh64Ux8 {
36407 continue
36408 }
36409 y := right.Args[1]
36410 x := right.Args[0]
36411 left := v_1
36412 if left.Op != OpLsh64x8 {
36413 continue
36414 }
36415 _ = left.Args[1]
36416 if x != left.Args[0] {
36417 continue
36418 }
36419 z := left.Args[1]
36420 if z.Op != OpSub8 {
36421 continue
36422 }
36423 _ = z.Args[1]
36424 z_0 := z.Args[0]
36425 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
36426 continue
36427 }
36428 v.reset(OpRotateLeft64)
36429 v.AddArg2(x, z)
36430 return true
36431 }
36432 break
36433 }
36434 return false
36435 }
36436 func rewriteValuegeneric_OpXor8(v *Value) bool {
36437 v_1 := v.Args[1]
36438 v_0 := v.Args[0]
36439 b := v.Block
36440 config := b.Func.Config
36441
36442
36443 for {
36444 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36445 if v_0.Op != OpConst8 {
36446 continue
36447 }
36448 c := auxIntToInt8(v_0.AuxInt)
36449 if v_1.Op != OpConst8 {
36450 continue
36451 }
36452 d := auxIntToInt8(v_1.AuxInt)
36453 v.reset(OpConst8)
36454 v.AuxInt = int8ToAuxInt(c ^ d)
36455 return true
36456 }
36457 break
36458 }
36459
36460
36461 for {
36462 x := v_0
36463 if x != v_1 {
36464 break
36465 }
36466 v.reset(OpConst8)
36467 v.AuxInt = int8ToAuxInt(0)
36468 return true
36469 }
36470
36471
36472 for {
36473 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36474 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
36475 continue
36476 }
36477 x := v_1
36478 v.copyOf(x)
36479 return true
36480 }
36481 break
36482 }
36483
36484
36485 for {
36486 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36487 if v_0.Op != OpCom8 {
36488 continue
36489 }
36490 x := v_0.Args[0]
36491 if x != v_1 {
36492 continue
36493 }
36494 v.reset(OpConst8)
36495 v.AuxInt = int8ToAuxInt(-1)
36496 return true
36497 }
36498 break
36499 }
36500
36501
36502 for {
36503 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36504 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
36505 continue
36506 }
36507 x := v_1
36508 v.reset(OpCom8)
36509 v.AddArg(x)
36510 return true
36511 }
36512 break
36513 }
36514
36515
36516 for {
36517 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36518 x := v_0
36519 if v_1.Op != OpXor8 {
36520 continue
36521 }
36522 _ = v_1.Args[1]
36523 v_1_0 := v_1.Args[0]
36524 v_1_1 := v_1.Args[1]
36525 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36526 if x != v_1_0 {
36527 continue
36528 }
36529 y := v_1_1
36530 v.copyOf(y)
36531 return true
36532 }
36533 }
36534 break
36535 }
36536
36537
36538
36539 for {
36540 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36541 if v_0.Op != OpXor8 {
36542 continue
36543 }
36544 _ = v_0.Args[1]
36545 v_0_0 := v_0.Args[0]
36546 v_0_1 := v_0.Args[1]
36547 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
36548 i := v_0_0
36549 if i.Op != OpConst8 {
36550 continue
36551 }
36552 t := i.Type
36553 z := v_0_1
36554 x := v_1
36555 if !(z.Op != OpConst8 && x.Op != OpConst8) {
36556 continue
36557 }
36558 v.reset(OpXor8)
36559 v0 := b.NewValue0(v.Pos, OpXor8, t)
36560 v0.AddArg2(z, x)
36561 v.AddArg2(i, v0)
36562 return true
36563 }
36564 }
36565 break
36566 }
36567
36568
36569 for {
36570 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36571 if v_0.Op != OpConst8 {
36572 continue
36573 }
36574 t := v_0.Type
36575 c := auxIntToInt8(v_0.AuxInt)
36576 if v_1.Op != OpXor8 {
36577 continue
36578 }
36579 _ = v_1.Args[1]
36580 v_1_0 := v_1.Args[0]
36581 v_1_1 := v_1.Args[1]
36582 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36583 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
36584 continue
36585 }
36586 d := auxIntToInt8(v_1_0.AuxInt)
36587 x := v_1_1
36588 v.reset(OpXor8)
36589 v0 := b.NewValue0(v.Pos, OpConst8, t)
36590 v0.AuxInt = int8ToAuxInt(c ^ d)
36591 v.AddArg2(v0, x)
36592 return true
36593 }
36594 }
36595 break
36596 }
36597
36598
36599
36600 for {
36601 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36602 if v_0.Op != OpLsh8x64 {
36603 continue
36604 }
36605 _ = v_0.Args[1]
36606 x := v_0.Args[0]
36607 z := v_0.Args[1]
36608 if z.Op != OpConst64 {
36609 continue
36610 }
36611 c := auxIntToInt64(z.AuxInt)
36612 if v_1.Op != OpRsh8Ux64 {
36613 continue
36614 }
36615 _ = v_1.Args[1]
36616 if x != v_1.Args[0] {
36617 continue
36618 }
36619 v_1_1 := v_1.Args[1]
36620 if v_1_1.Op != OpConst64 {
36621 continue
36622 }
36623 d := auxIntToInt64(v_1_1.AuxInt)
36624 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
36625 continue
36626 }
36627 v.reset(OpRotateLeft8)
36628 v.AddArg2(x, z)
36629 return true
36630 }
36631 break
36632 }
36633
36634
36635
36636 for {
36637 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36638 left := v_0
36639 if left.Op != OpLsh8x64 {
36640 continue
36641 }
36642 y := left.Args[1]
36643 x := left.Args[0]
36644 right := v_1
36645 if right.Op != OpRsh8Ux64 {
36646 continue
36647 }
36648 _ = right.Args[1]
36649 if x != right.Args[0] {
36650 continue
36651 }
36652 right_1 := right.Args[1]
36653 if right_1.Op != OpSub64 {
36654 continue
36655 }
36656 _ = right_1.Args[1]
36657 right_1_0 := right_1.Args[0]
36658 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36659 continue
36660 }
36661 v.reset(OpRotateLeft8)
36662 v.AddArg2(x, y)
36663 return true
36664 }
36665 break
36666 }
36667
36668
36669
36670 for {
36671 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36672 left := v_0
36673 if left.Op != OpLsh8x32 {
36674 continue
36675 }
36676 y := left.Args[1]
36677 x := left.Args[0]
36678 right := v_1
36679 if right.Op != OpRsh8Ux32 {
36680 continue
36681 }
36682 _ = right.Args[1]
36683 if x != right.Args[0] {
36684 continue
36685 }
36686 right_1 := right.Args[1]
36687 if right_1.Op != OpSub32 {
36688 continue
36689 }
36690 _ = right_1.Args[1]
36691 right_1_0 := right_1.Args[0]
36692 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36693 continue
36694 }
36695 v.reset(OpRotateLeft8)
36696 v.AddArg2(x, y)
36697 return true
36698 }
36699 break
36700 }
36701
36702
36703
36704 for {
36705 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36706 left := v_0
36707 if left.Op != OpLsh8x16 {
36708 continue
36709 }
36710 y := left.Args[1]
36711 x := left.Args[0]
36712 right := v_1
36713 if right.Op != OpRsh8Ux16 {
36714 continue
36715 }
36716 _ = right.Args[1]
36717 if x != right.Args[0] {
36718 continue
36719 }
36720 right_1 := right.Args[1]
36721 if right_1.Op != OpSub16 {
36722 continue
36723 }
36724 _ = right_1.Args[1]
36725 right_1_0 := right_1.Args[0]
36726 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36727 continue
36728 }
36729 v.reset(OpRotateLeft8)
36730 v.AddArg2(x, y)
36731 return true
36732 }
36733 break
36734 }
36735
36736
36737
36738 for {
36739 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36740 left := v_0
36741 if left.Op != OpLsh8x8 {
36742 continue
36743 }
36744 y := left.Args[1]
36745 x := left.Args[0]
36746 right := v_1
36747 if right.Op != OpRsh8Ux8 {
36748 continue
36749 }
36750 _ = right.Args[1]
36751 if x != right.Args[0] {
36752 continue
36753 }
36754 right_1 := right.Args[1]
36755 if right_1.Op != OpSub8 {
36756 continue
36757 }
36758 _ = right_1.Args[1]
36759 right_1_0 := right_1.Args[0]
36760 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36761 continue
36762 }
36763 v.reset(OpRotateLeft8)
36764 v.AddArg2(x, y)
36765 return true
36766 }
36767 break
36768 }
36769
36770
36771
36772 for {
36773 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36774 right := v_0
36775 if right.Op != OpRsh8Ux64 {
36776 continue
36777 }
36778 y := right.Args[1]
36779 x := right.Args[0]
36780 left := v_1
36781 if left.Op != OpLsh8x64 {
36782 continue
36783 }
36784 _ = left.Args[1]
36785 if x != left.Args[0] {
36786 continue
36787 }
36788 z := left.Args[1]
36789 if z.Op != OpSub64 {
36790 continue
36791 }
36792 _ = z.Args[1]
36793 z_0 := z.Args[0]
36794 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36795 continue
36796 }
36797 v.reset(OpRotateLeft8)
36798 v.AddArg2(x, z)
36799 return true
36800 }
36801 break
36802 }
36803
36804
36805
36806 for {
36807 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36808 right := v_0
36809 if right.Op != OpRsh8Ux32 {
36810 continue
36811 }
36812 y := right.Args[1]
36813 x := right.Args[0]
36814 left := v_1
36815 if left.Op != OpLsh8x32 {
36816 continue
36817 }
36818 _ = left.Args[1]
36819 if x != left.Args[0] {
36820 continue
36821 }
36822 z := left.Args[1]
36823 if z.Op != OpSub32 {
36824 continue
36825 }
36826 _ = z.Args[1]
36827 z_0 := z.Args[0]
36828 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36829 continue
36830 }
36831 v.reset(OpRotateLeft8)
36832 v.AddArg2(x, z)
36833 return true
36834 }
36835 break
36836 }
36837
36838
36839
36840 for {
36841 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36842 right := v_0
36843 if right.Op != OpRsh8Ux16 {
36844 continue
36845 }
36846 y := right.Args[1]
36847 x := right.Args[0]
36848 left := v_1
36849 if left.Op != OpLsh8x16 {
36850 continue
36851 }
36852 _ = left.Args[1]
36853 if x != left.Args[0] {
36854 continue
36855 }
36856 z := left.Args[1]
36857 if z.Op != OpSub16 {
36858 continue
36859 }
36860 _ = z.Args[1]
36861 z_0 := z.Args[0]
36862 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36863 continue
36864 }
36865 v.reset(OpRotateLeft8)
36866 v.AddArg2(x, z)
36867 return true
36868 }
36869 break
36870 }
36871
36872
36873
36874 for {
36875 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36876 right := v_0
36877 if right.Op != OpRsh8Ux8 {
36878 continue
36879 }
36880 y := right.Args[1]
36881 x := right.Args[0]
36882 left := v_1
36883 if left.Op != OpLsh8x8 {
36884 continue
36885 }
36886 _ = left.Args[1]
36887 if x != left.Args[0] {
36888 continue
36889 }
36890 z := left.Args[1]
36891 if z.Op != OpSub8 {
36892 continue
36893 }
36894 _ = z.Args[1]
36895 z_0 := z.Args[0]
36896 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36897 continue
36898 }
36899 v.reset(OpRotateLeft8)
36900 v.AddArg2(x, z)
36901 return true
36902 }
36903 break
36904 }
36905 return false
36906 }
36907 func rewriteValuegeneric_OpZero(v *Value) bool {
36908 v_1 := v.Args[1]
36909 v_0 := v.Args[0]
36910 b := v.Block
36911
36912
36913
36914 for {
36915 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
36916 break
36917 }
36918 call := v_0.Args[0]
36919 if call.Op != OpStaticLECall {
36920 break
36921 }
36922 mem := v_1
36923 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isMalloc(call.Aux)) {
36924 break
36925 }
36926 v.copyOf(mem)
36927 return true
36928 }
36929
36930
36931
36932 for {
36933 n := auxIntToInt64(v.AuxInt)
36934 t1 := auxToType(v.Aux)
36935 p1 := v_0
36936 store := v_1
36937 if store.Op != OpStore {
36938 break
36939 }
36940 t2 := auxToType(store.Aux)
36941 mem := store.Args[2]
36942 store_0 := store.Args[0]
36943 if store_0.Op != OpOffPtr {
36944 break
36945 }
36946 o2 := auxIntToInt64(store_0.AuxInt)
36947 p2 := store_0.Args[0]
36948 if !(isSamePtr(p1, p2) && store.Uses == 1 && n >= o2+t2.Size() && clobber(store)) {
36949 break
36950 }
36951 v.reset(OpZero)
36952 v.AuxInt = int64ToAuxInt(n)
36953 v.Aux = typeToAux(t1)
36954 v.AddArg2(p1, mem)
36955 return true
36956 }
36957
36958
36959
36960 for {
36961 n := auxIntToInt64(v.AuxInt)
36962 t := auxToType(v.Aux)
36963 dst1 := v_0
36964 move := v_1
36965 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
36966 break
36967 }
36968 mem := move.Args[2]
36969 dst2 := move.Args[0]
36970 if !(move.Uses == 1 && isSamePtr(dst1, dst2) && clobber(move)) {
36971 break
36972 }
36973 v.reset(OpZero)
36974 v.AuxInt = int64ToAuxInt(n)
36975 v.Aux = typeToAux(t)
36976 v.AddArg2(dst1, mem)
36977 return true
36978 }
36979
36980
36981
36982 for {
36983 n := auxIntToInt64(v.AuxInt)
36984 t := auxToType(v.Aux)
36985 dst1 := v_0
36986 vardef := v_1
36987 if vardef.Op != OpVarDef {
36988 break
36989 }
36990 x := auxToSym(vardef.Aux)
36991 move := vardef.Args[0]
36992 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
36993 break
36994 }
36995 mem := move.Args[2]
36996 dst2 := move.Args[0]
36997 if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && clobber(move, vardef)) {
36998 break
36999 }
37000 v.reset(OpZero)
37001 v.AuxInt = int64ToAuxInt(n)
37002 v.Aux = typeToAux(t)
37003 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
37004 v0.Aux = symToAux(x)
37005 v0.AddArg(mem)
37006 v.AddArg2(dst1, v0)
37007 return true
37008 }
37009
37010
37011
37012 for {
37013 s := auxIntToInt64(v.AuxInt)
37014 t := auxToType(v.Aux)
37015 dst1 := v_0
37016 zero := v_1
37017 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != s || auxToType(zero.Aux) != t {
37018 break
37019 }
37020 dst2 := zero.Args[0]
37021 if !(isSamePtr(dst1, dst2)) {
37022 break
37023 }
37024 v.copyOf(zero)
37025 return true
37026 }
37027
37028
37029
37030 for {
37031 s := auxIntToInt64(v.AuxInt)
37032 t := auxToType(v.Aux)
37033 dst1 := v_0
37034 vardef := v_1
37035 if vardef.Op != OpVarDef {
37036 break
37037 }
37038 vardef_0 := vardef.Args[0]
37039 if vardef_0.Op != OpZero || auxIntToInt64(vardef_0.AuxInt) != s || auxToType(vardef_0.Aux) != t {
37040 break
37041 }
37042 dst2 := vardef_0.Args[0]
37043 if !(isSamePtr(dst1, dst2)) {
37044 break
37045 }
37046 v.copyOf(vardef)
37047 return true
37048 }
37049 return false
37050 }
37051 func rewriteValuegeneric_OpZeroExt16to32(v *Value) bool {
37052 v_0 := v.Args[0]
37053
37054
37055 for {
37056 if v_0.Op != OpConst16 {
37057 break
37058 }
37059 c := auxIntToInt16(v_0.AuxInt)
37060 v.reset(OpConst32)
37061 v.AuxInt = int32ToAuxInt(int32(uint16(c)))
37062 return true
37063 }
37064
37065
37066
37067 for {
37068 if v_0.Op != OpTrunc32to16 {
37069 break
37070 }
37071 x := v_0.Args[0]
37072 if x.Op != OpRsh32Ux64 {
37073 break
37074 }
37075 _ = x.Args[1]
37076 x_1 := x.Args[1]
37077 if x_1.Op != OpConst64 {
37078 break
37079 }
37080 s := auxIntToInt64(x_1.AuxInt)
37081 if !(s >= 16) {
37082 break
37083 }
37084 v.copyOf(x)
37085 return true
37086 }
37087 return false
37088 }
37089 func rewriteValuegeneric_OpZeroExt16to64(v *Value) bool {
37090 v_0 := v.Args[0]
37091
37092
37093 for {
37094 if v_0.Op != OpConst16 {
37095 break
37096 }
37097 c := auxIntToInt16(v_0.AuxInt)
37098 v.reset(OpConst64)
37099 v.AuxInt = int64ToAuxInt(int64(uint16(c)))
37100 return true
37101 }
37102
37103
37104
37105 for {
37106 if v_0.Op != OpTrunc64to16 {
37107 break
37108 }
37109 x := v_0.Args[0]
37110 if x.Op != OpRsh64Ux64 {
37111 break
37112 }
37113 _ = x.Args[1]
37114 x_1 := x.Args[1]
37115 if x_1.Op != OpConst64 {
37116 break
37117 }
37118 s := auxIntToInt64(x_1.AuxInt)
37119 if !(s >= 48) {
37120 break
37121 }
37122 v.copyOf(x)
37123 return true
37124 }
37125 return false
37126 }
37127 func rewriteValuegeneric_OpZeroExt32to64(v *Value) bool {
37128 v_0 := v.Args[0]
37129
37130
37131 for {
37132 if v_0.Op != OpConst32 {
37133 break
37134 }
37135 c := auxIntToInt32(v_0.AuxInt)
37136 v.reset(OpConst64)
37137 v.AuxInt = int64ToAuxInt(int64(uint32(c)))
37138 return true
37139 }
37140
37141
37142
37143 for {
37144 if v_0.Op != OpTrunc64to32 {
37145 break
37146 }
37147 x := v_0.Args[0]
37148 if x.Op != OpRsh64Ux64 {
37149 break
37150 }
37151 _ = x.Args[1]
37152 x_1 := x.Args[1]
37153 if x_1.Op != OpConst64 {
37154 break
37155 }
37156 s := auxIntToInt64(x_1.AuxInt)
37157 if !(s >= 32) {
37158 break
37159 }
37160 v.copyOf(x)
37161 return true
37162 }
37163 return false
37164 }
37165 func rewriteValuegeneric_OpZeroExt8to16(v *Value) bool {
37166 v_0 := v.Args[0]
37167
37168
37169 for {
37170 if v_0.Op != OpConst8 {
37171 break
37172 }
37173 c := auxIntToInt8(v_0.AuxInt)
37174 v.reset(OpConst16)
37175 v.AuxInt = int16ToAuxInt(int16(uint8(c)))
37176 return true
37177 }
37178
37179
37180
37181 for {
37182 if v_0.Op != OpTrunc16to8 {
37183 break
37184 }
37185 x := v_0.Args[0]
37186 if x.Op != OpRsh16Ux64 {
37187 break
37188 }
37189 _ = x.Args[1]
37190 x_1 := x.Args[1]
37191 if x_1.Op != OpConst64 {
37192 break
37193 }
37194 s := auxIntToInt64(x_1.AuxInt)
37195 if !(s >= 8) {
37196 break
37197 }
37198 v.copyOf(x)
37199 return true
37200 }
37201 return false
37202 }
37203 func rewriteValuegeneric_OpZeroExt8to32(v *Value) bool {
37204 v_0 := v.Args[0]
37205
37206
37207 for {
37208 if v_0.Op != OpConst8 {
37209 break
37210 }
37211 c := auxIntToInt8(v_0.AuxInt)
37212 v.reset(OpConst32)
37213 v.AuxInt = int32ToAuxInt(int32(uint8(c)))
37214 return true
37215 }
37216
37217
37218
37219 for {
37220 if v_0.Op != OpTrunc32to8 {
37221 break
37222 }
37223 x := v_0.Args[0]
37224 if x.Op != OpRsh32Ux64 {
37225 break
37226 }
37227 _ = x.Args[1]
37228 x_1 := x.Args[1]
37229 if x_1.Op != OpConst64 {
37230 break
37231 }
37232 s := auxIntToInt64(x_1.AuxInt)
37233 if !(s >= 24) {
37234 break
37235 }
37236 v.copyOf(x)
37237 return true
37238 }
37239 return false
37240 }
37241 func rewriteValuegeneric_OpZeroExt8to64(v *Value) bool {
37242 v_0 := v.Args[0]
37243
37244
37245 for {
37246 if v_0.Op != OpConst8 {
37247 break
37248 }
37249 c := auxIntToInt8(v_0.AuxInt)
37250 v.reset(OpConst64)
37251 v.AuxInt = int64ToAuxInt(int64(uint8(c)))
37252 return true
37253 }
37254
37255
37256
37257 for {
37258 if v_0.Op != OpTrunc64to8 {
37259 break
37260 }
37261 x := v_0.Args[0]
37262 if x.Op != OpRsh64Ux64 {
37263 break
37264 }
37265 _ = x.Args[1]
37266 x_1 := x.Args[1]
37267 if x_1.Op != OpConst64 {
37268 break
37269 }
37270 s := auxIntToInt64(x_1.AuxInt)
37271 if !(s >= 56) {
37272 break
37273 }
37274 v.copyOf(x)
37275 return true
37276 }
37277 return false
37278 }
37279 func rewriteBlockgeneric(b *Block) bool {
37280 switch b.Kind {
37281 case BlockIf:
37282
37283
37284 for b.Controls[0].Op == OpNot {
37285 v_0 := b.Controls[0]
37286 cond := v_0.Args[0]
37287 b.resetWithControl(BlockIf, cond)
37288 b.swapSuccessors()
37289 return true
37290 }
37291
37292
37293
37294 for b.Controls[0].Op == OpConstBool {
37295 v_0 := b.Controls[0]
37296 c := auxIntToBool(v_0.AuxInt)
37297 if !(c) {
37298 break
37299 }
37300 b.Reset(BlockFirst)
37301 return true
37302 }
37303
37304
37305
37306 for b.Controls[0].Op == OpConstBool {
37307 v_0 := b.Controls[0]
37308 c := auxIntToBool(v_0.AuxInt)
37309 if !(!c) {
37310 break
37311 }
37312 b.Reset(BlockFirst)
37313 b.swapSuccessors()
37314 return true
37315 }
37316 }
37317 return false
37318 }
37319
View as plain text