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 OpMod16:
228 return rewriteValuegeneric_OpMod16(v)
229 case OpMod16u:
230 return rewriteValuegeneric_OpMod16u(v)
231 case OpMod32:
232 return rewriteValuegeneric_OpMod32(v)
233 case OpMod32u:
234 return rewriteValuegeneric_OpMod32u(v)
235 case OpMod64:
236 return rewriteValuegeneric_OpMod64(v)
237 case OpMod64u:
238 return rewriteValuegeneric_OpMod64u(v)
239 case OpMod8:
240 return rewriteValuegeneric_OpMod8(v)
241 case OpMod8u:
242 return rewriteValuegeneric_OpMod8u(v)
243 case OpMove:
244 return rewriteValuegeneric_OpMove(v)
245 case OpMul16:
246 return rewriteValuegeneric_OpMul16(v)
247 case OpMul32:
248 return rewriteValuegeneric_OpMul32(v)
249 case OpMul32F:
250 return rewriteValuegeneric_OpMul32F(v)
251 case OpMul32uhilo:
252 return rewriteValuegeneric_OpMul32uhilo(v)
253 case OpMul32uover:
254 return rewriteValuegeneric_OpMul32uover(v)
255 case OpMul64:
256 return rewriteValuegeneric_OpMul64(v)
257 case OpMul64F:
258 return rewriteValuegeneric_OpMul64F(v)
259 case OpMul64uhilo:
260 return rewriteValuegeneric_OpMul64uhilo(v)
261 case OpMul64uover:
262 return rewriteValuegeneric_OpMul64uover(v)
263 case OpMul8:
264 return rewriteValuegeneric_OpMul8(v)
265 case OpNeg16:
266 return rewriteValuegeneric_OpNeg16(v)
267 case OpNeg32:
268 return rewriteValuegeneric_OpNeg32(v)
269 case OpNeg32F:
270 return rewriteValuegeneric_OpNeg32F(v)
271 case OpNeg64:
272 return rewriteValuegeneric_OpNeg64(v)
273 case OpNeg64F:
274 return rewriteValuegeneric_OpNeg64F(v)
275 case OpNeg8:
276 return rewriteValuegeneric_OpNeg8(v)
277 case OpNeq16:
278 return rewriteValuegeneric_OpNeq16(v)
279 case OpNeq32:
280 return rewriteValuegeneric_OpNeq32(v)
281 case OpNeq32F:
282 return rewriteValuegeneric_OpNeq32F(v)
283 case OpNeq64:
284 return rewriteValuegeneric_OpNeq64(v)
285 case OpNeq64F:
286 return rewriteValuegeneric_OpNeq64F(v)
287 case OpNeq8:
288 return rewriteValuegeneric_OpNeq8(v)
289 case OpNeqB:
290 return rewriteValuegeneric_OpNeqB(v)
291 case OpNeqInter:
292 return rewriteValuegeneric_OpNeqInter(v)
293 case OpNeqPtr:
294 return rewriteValuegeneric_OpNeqPtr(v)
295 case OpNeqSlice:
296 return rewriteValuegeneric_OpNeqSlice(v)
297 case OpNilCheck:
298 return rewriteValuegeneric_OpNilCheck(v)
299 case OpNot:
300 return rewriteValuegeneric_OpNot(v)
301 case OpOffPtr:
302 return rewriteValuegeneric_OpOffPtr(v)
303 case OpOr16:
304 return rewriteValuegeneric_OpOr16(v)
305 case OpOr32:
306 return rewriteValuegeneric_OpOr32(v)
307 case OpOr64:
308 return rewriteValuegeneric_OpOr64(v)
309 case OpOr8:
310 return rewriteValuegeneric_OpOr8(v)
311 case OpOrB:
312 return rewriteValuegeneric_OpOrB(v)
313 case OpPhi:
314 return rewriteValuegeneric_OpPhi(v)
315 case OpPopCount16:
316 return rewriteValuegeneric_OpPopCount16(v)
317 case OpPopCount32:
318 return rewriteValuegeneric_OpPopCount32(v)
319 case OpPopCount64:
320 return rewriteValuegeneric_OpPopCount64(v)
321 case OpPopCount8:
322 return rewriteValuegeneric_OpPopCount8(v)
323 case OpPtrIndex:
324 return rewriteValuegeneric_OpPtrIndex(v)
325 case OpRotateLeft16:
326 return rewriteValuegeneric_OpRotateLeft16(v)
327 case OpRotateLeft32:
328 return rewriteValuegeneric_OpRotateLeft32(v)
329 case OpRotateLeft64:
330 return rewriteValuegeneric_OpRotateLeft64(v)
331 case OpRotateLeft8:
332 return rewriteValuegeneric_OpRotateLeft8(v)
333 case OpRound32F:
334 return rewriteValuegeneric_OpRound32F(v)
335 case OpRound64F:
336 return rewriteValuegeneric_OpRound64F(v)
337 case OpRoundToEven:
338 return rewriteValuegeneric_OpRoundToEven(v)
339 case OpRsh16Ux16:
340 return rewriteValuegeneric_OpRsh16Ux16(v)
341 case OpRsh16Ux32:
342 return rewriteValuegeneric_OpRsh16Ux32(v)
343 case OpRsh16Ux64:
344 return rewriteValuegeneric_OpRsh16Ux64(v)
345 case OpRsh16Ux8:
346 return rewriteValuegeneric_OpRsh16Ux8(v)
347 case OpRsh16x16:
348 return rewriteValuegeneric_OpRsh16x16(v)
349 case OpRsh16x32:
350 return rewriteValuegeneric_OpRsh16x32(v)
351 case OpRsh16x64:
352 return rewriteValuegeneric_OpRsh16x64(v)
353 case OpRsh16x8:
354 return rewriteValuegeneric_OpRsh16x8(v)
355 case OpRsh32Ux16:
356 return rewriteValuegeneric_OpRsh32Ux16(v)
357 case OpRsh32Ux32:
358 return rewriteValuegeneric_OpRsh32Ux32(v)
359 case OpRsh32Ux64:
360 return rewriteValuegeneric_OpRsh32Ux64(v)
361 case OpRsh32Ux8:
362 return rewriteValuegeneric_OpRsh32Ux8(v)
363 case OpRsh32x16:
364 return rewriteValuegeneric_OpRsh32x16(v)
365 case OpRsh32x32:
366 return rewriteValuegeneric_OpRsh32x32(v)
367 case OpRsh32x64:
368 return rewriteValuegeneric_OpRsh32x64(v)
369 case OpRsh32x8:
370 return rewriteValuegeneric_OpRsh32x8(v)
371 case OpRsh64Ux16:
372 return rewriteValuegeneric_OpRsh64Ux16(v)
373 case OpRsh64Ux32:
374 return rewriteValuegeneric_OpRsh64Ux32(v)
375 case OpRsh64Ux64:
376 return rewriteValuegeneric_OpRsh64Ux64(v)
377 case OpRsh64Ux8:
378 return rewriteValuegeneric_OpRsh64Ux8(v)
379 case OpRsh64x16:
380 return rewriteValuegeneric_OpRsh64x16(v)
381 case OpRsh64x32:
382 return rewriteValuegeneric_OpRsh64x32(v)
383 case OpRsh64x64:
384 return rewriteValuegeneric_OpRsh64x64(v)
385 case OpRsh64x8:
386 return rewriteValuegeneric_OpRsh64x8(v)
387 case OpRsh8Ux16:
388 return rewriteValuegeneric_OpRsh8Ux16(v)
389 case OpRsh8Ux32:
390 return rewriteValuegeneric_OpRsh8Ux32(v)
391 case OpRsh8Ux64:
392 return rewriteValuegeneric_OpRsh8Ux64(v)
393 case OpRsh8Ux8:
394 return rewriteValuegeneric_OpRsh8Ux8(v)
395 case OpRsh8x16:
396 return rewriteValuegeneric_OpRsh8x16(v)
397 case OpRsh8x32:
398 return rewriteValuegeneric_OpRsh8x32(v)
399 case OpRsh8x64:
400 return rewriteValuegeneric_OpRsh8x64(v)
401 case OpRsh8x8:
402 return rewriteValuegeneric_OpRsh8x8(v)
403 case OpSelect0:
404 return rewriteValuegeneric_OpSelect0(v)
405 case OpSelect1:
406 return rewriteValuegeneric_OpSelect1(v)
407 case OpSelectN:
408 return rewriteValuegeneric_OpSelectN(v)
409 case OpSignExt16to32:
410 return rewriteValuegeneric_OpSignExt16to32(v)
411 case OpSignExt16to64:
412 return rewriteValuegeneric_OpSignExt16to64(v)
413 case OpSignExt32to64:
414 return rewriteValuegeneric_OpSignExt32to64(v)
415 case OpSignExt8to16:
416 return rewriteValuegeneric_OpSignExt8to16(v)
417 case OpSignExt8to32:
418 return rewriteValuegeneric_OpSignExt8to32(v)
419 case OpSignExt8to64:
420 return rewriteValuegeneric_OpSignExt8to64(v)
421 case OpSliceCap:
422 return rewriteValuegeneric_OpSliceCap(v)
423 case OpSliceLen:
424 return rewriteValuegeneric_OpSliceLen(v)
425 case OpSliceMake:
426 return rewriteValuegeneric_OpSliceMake(v)
427 case OpSlicePtr:
428 return rewriteValuegeneric_OpSlicePtr(v)
429 case OpSlicemask:
430 return rewriteValuegeneric_OpSlicemask(v)
431 case OpSqrt:
432 return rewriteValuegeneric_OpSqrt(v)
433 case OpStaticCall:
434 return rewriteValuegeneric_OpStaticCall(v)
435 case OpStaticLECall:
436 return rewriteValuegeneric_OpStaticLECall(v)
437 case OpStore:
438 return rewriteValuegeneric_OpStore(v)
439 case OpStringLen:
440 return rewriteValuegeneric_OpStringLen(v)
441 case OpStringPtr:
442 return rewriteValuegeneric_OpStringPtr(v)
443 case OpStructSelect:
444 return rewriteValuegeneric_OpStructSelect(v)
445 case OpSub16:
446 return rewriteValuegeneric_OpSub16(v)
447 case OpSub32:
448 return rewriteValuegeneric_OpSub32(v)
449 case OpSub32F:
450 return rewriteValuegeneric_OpSub32F(v)
451 case OpSub64:
452 return rewriteValuegeneric_OpSub64(v)
453 case OpSub64F:
454 return rewriteValuegeneric_OpSub64F(v)
455 case OpSub8:
456 return rewriteValuegeneric_OpSub8(v)
457 case OpTrunc:
458 return rewriteValuegeneric_OpTrunc(v)
459 case OpTrunc16to8:
460 return rewriteValuegeneric_OpTrunc16to8(v)
461 case OpTrunc32to16:
462 return rewriteValuegeneric_OpTrunc32to16(v)
463 case OpTrunc32to8:
464 return rewriteValuegeneric_OpTrunc32to8(v)
465 case OpTrunc64to16:
466 return rewriteValuegeneric_OpTrunc64to16(v)
467 case OpTrunc64to32:
468 return rewriteValuegeneric_OpTrunc64to32(v)
469 case OpTrunc64to8:
470 return rewriteValuegeneric_OpTrunc64to8(v)
471 case OpXor16:
472 return rewriteValuegeneric_OpXor16(v)
473 case OpXor32:
474 return rewriteValuegeneric_OpXor32(v)
475 case OpXor64:
476 return rewriteValuegeneric_OpXor64(v)
477 case OpXor8:
478 return rewriteValuegeneric_OpXor8(v)
479 case OpZero:
480 return rewriteValuegeneric_OpZero(v)
481 case OpZeroExt16to32:
482 return rewriteValuegeneric_OpZeroExt16to32(v)
483 case OpZeroExt16to64:
484 return rewriteValuegeneric_OpZeroExt16to64(v)
485 case OpZeroExt32to64:
486 return rewriteValuegeneric_OpZeroExt32to64(v)
487 case OpZeroExt8to16:
488 return rewriteValuegeneric_OpZeroExt8to16(v)
489 case OpZeroExt8to32:
490 return rewriteValuegeneric_OpZeroExt8to32(v)
491 case OpZeroExt8to64:
492 return rewriteValuegeneric_OpZeroExt8to64(v)
493 }
494 return false
495 }
496 func rewriteValuegeneric_OpAdd16(v *Value) bool {
497 v_1 := v.Args[1]
498 v_0 := v.Args[0]
499 b := v.Block
500 config := b.Func.Config
501
502
503 for {
504 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
505 if v_0.Op != OpConst16 {
506 continue
507 }
508 c := auxIntToInt16(v_0.AuxInt)
509 if v_1.Op != OpConst16 {
510 continue
511 }
512 d := auxIntToInt16(v_1.AuxInt)
513 v.reset(OpConst16)
514 v.AuxInt = int16ToAuxInt(c + d)
515 return true
516 }
517 break
518 }
519
520
521 for {
522 t := v.Type
523 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
524 if v_0.Op != OpMul16 {
525 continue
526 }
527 _ = v_0.Args[1]
528 v_0_0 := v_0.Args[0]
529 v_0_1 := v_0.Args[1]
530 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
531 x := v_0_0
532 y := v_0_1
533 if v_1.Op != OpMul16 {
534 continue
535 }
536 _ = v_1.Args[1]
537 v_1_0 := v_1.Args[0]
538 v_1_1 := v_1.Args[1]
539 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
540 if x != v_1_0 {
541 continue
542 }
543 z := v_1_1
544 v.reset(OpMul16)
545 v0 := b.NewValue0(v.Pos, OpAdd16, t)
546 v0.AddArg2(y, z)
547 v.AddArg2(x, v0)
548 return true
549 }
550 }
551 }
552 break
553 }
554
555
556 for {
557 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
558 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
559 continue
560 }
561 x := v_1
562 v.copyOf(x)
563 return true
564 }
565 break
566 }
567
568
569 for {
570 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
571 x := v_0
572 if v_1.Op != OpNeg16 {
573 continue
574 }
575 y := v_1.Args[0]
576 v.reset(OpSub16)
577 v.AddArg2(x, y)
578 return true
579 }
580 break
581 }
582
583
584 for {
585 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
586 if v_0.Op != OpCom16 {
587 continue
588 }
589 x := v_0.Args[0]
590 if x != v_1 {
591 continue
592 }
593 v.reset(OpConst16)
594 v.AuxInt = int16ToAuxInt(-1)
595 return true
596 }
597 break
598 }
599
600
601 for {
602 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
603 if v_0.Op != OpSub16 {
604 continue
605 }
606 t := v_0.Args[1]
607 x := v_0.Args[0]
608 if v_1.Op != OpAdd16 {
609 continue
610 }
611 _ = v_1.Args[1]
612 v_1_0 := v_1.Args[0]
613 v_1_1 := v_1.Args[1]
614 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
615 if t != v_1_0 {
616 continue
617 }
618 y := v_1_1
619 v.reset(OpAdd16)
620 v.AddArg2(x, y)
621 return true
622 }
623 }
624 break
625 }
626
627
628 for {
629 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
630 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 1 || v_1.Op != OpCom16 {
631 continue
632 }
633 x := v_1.Args[0]
634 v.reset(OpNeg16)
635 v.AddArg(x)
636 return true
637 }
638 break
639 }
640
641
642 for {
643 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
644 x := v_0
645 if v_1.Op != OpSub16 {
646 continue
647 }
648 _ = v_1.Args[1]
649 y := v_1.Args[0]
650 if x != v_1.Args[1] {
651 continue
652 }
653 v.copyOf(y)
654 return true
655 }
656 break
657 }
658
659
660 for {
661 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
662 x := v_0
663 if v_1.Op != OpAdd16 {
664 continue
665 }
666 _ = v_1.Args[1]
667 v_1_0 := v_1.Args[0]
668 v_1_1 := v_1.Args[1]
669 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
670 y := v_1_0
671 if v_1_1.Op != OpSub16 {
672 continue
673 }
674 _ = v_1_1.Args[1]
675 z := v_1_1.Args[0]
676 if x != v_1_1.Args[1] {
677 continue
678 }
679 v.reset(OpAdd16)
680 v.AddArg2(y, z)
681 return true
682 }
683 }
684 break
685 }
686
687
688
689 for {
690 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
691 if v_0.Op != OpAdd16 {
692 continue
693 }
694 _ = v_0.Args[1]
695 v_0_0 := v_0.Args[0]
696 v_0_1 := v_0.Args[1]
697 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
698 i := v_0_0
699 if i.Op != OpConst16 {
700 continue
701 }
702 t := i.Type
703 z := v_0_1
704 x := v_1
705 if !(z.Op != OpConst16 && x.Op != OpConst16) {
706 continue
707 }
708 v.reset(OpAdd16)
709 v0 := b.NewValue0(v.Pos, OpAdd16, t)
710 v0.AddArg2(z, x)
711 v.AddArg2(i, v0)
712 return true
713 }
714 }
715 break
716 }
717
718
719
720 for {
721 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
722 if v_0.Op != OpSub16 {
723 continue
724 }
725 z := v_0.Args[1]
726 i := v_0.Args[0]
727 if i.Op != OpConst16 {
728 continue
729 }
730 t := i.Type
731 x := v_1
732 if !(z.Op != OpConst16 && x.Op != OpConst16) {
733 continue
734 }
735 v.reset(OpAdd16)
736 v0 := b.NewValue0(v.Pos, OpSub16, t)
737 v0.AddArg2(x, z)
738 v.AddArg2(i, v0)
739 return true
740 }
741 break
742 }
743
744
745 for {
746 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
747 if v_0.Op != OpConst16 {
748 continue
749 }
750 t := v_0.Type
751 c := auxIntToInt16(v_0.AuxInt)
752 if v_1.Op != OpAdd16 {
753 continue
754 }
755 _ = v_1.Args[1]
756 v_1_0 := v_1.Args[0]
757 v_1_1 := v_1.Args[1]
758 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
759 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
760 continue
761 }
762 d := auxIntToInt16(v_1_0.AuxInt)
763 x := v_1_1
764 v.reset(OpAdd16)
765 v0 := b.NewValue0(v.Pos, OpConst16, t)
766 v0.AuxInt = int16ToAuxInt(c + d)
767 v.AddArg2(v0, x)
768 return true
769 }
770 }
771 break
772 }
773
774
775 for {
776 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
777 if v_0.Op != OpConst16 {
778 continue
779 }
780 t := v_0.Type
781 c := auxIntToInt16(v_0.AuxInt)
782 if v_1.Op != OpSub16 {
783 continue
784 }
785 x := v_1.Args[1]
786 v_1_0 := v_1.Args[0]
787 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
788 continue
789 }
790 d := auxIntToInt16(v_1_0.AuxInt)
791 v.reset(OpSub16)
792 v0 := b.NewValue0(v.Pos, OpConst16, t)
793 v0.AuxInt = int16ToAuxInt(c + d)
794 v.AddArg2(v0, x)
795 return true
796 }
797 break
798 }
799
800
801
802 for {
803 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
804 if v_0.Op != OpLsh16x64 {
805 continue
806 }
807 _ = v_0.Args[1]
808 x := v_0.Args[0]
809 z := v_0.Args[1]
810 if z.Op != OpConst64 {
811 continue
812 }
813 c := auxIntToInt64(z.AuxInt)
814 if v_1.Op != OpRsh16Ux64 {
815 continue
816 }
817 _ = v_1.Args[1]
818 if x != v_1.Args[0] {
819 continue
820 }
821 v_1_1 := v_1.Args[1]
822 if v_1_1.Op != OpConst64 {
823 continue
824 }
825 d := auxIntToInt64(v_1_1.AuxInt)
826 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
827 continue
828 }
829 v.reset(OpRotateLeft16)
830 v.AddArg2(x, z)
831 return true
832 }
833 break
834 }
835
836
837
838 for {
839 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
840 left := v_0
841 if left.Op != OpLsh16x64 {
842 continue
843 }
844 y := left.Args[1]
845 x := left.Args[0]
846 right := v_1
847 if right.Op != OpRsh16Ux64 {
848 continue
849 }
850 _ = right.Args[1]
851 if x != right.Args[0] {
852 continue
853 }
854 right_1 := right.Args[1]
855 if right_1.Op != OpSub64 {
856 continue
857 }
858 _ = right_1.Args[1]
859 right_1_0 := right_1.Args[0]
860 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
861 continue
862 }
863 v.reset(OpRotateLeft16)
864 v.AddArg2(x, y)
865 return true
866 }
867 break
868 }
869
870
871
872 for {
873 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
874 left := v_0
875 if left.Op != OpLsh16x32 {
876 continue
877 }
878 y := left.Args[1]
879 x := left.Args[0]
880 right := v_1
881 if right.Op != OpRsh16Ux32 {
882 continue
883 }
884 _ = right.Args[1]
885 if x != right.Args[0] {
886 continue
887 }
888 right_1 := right.Args[1]
889 if right_1.Op != OpSub32 {
890 continue
891 }
892 _ = right_1.Args[1]
893 right_1_0 := right_1.Args[0]
894 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
895 continue
896 }
897 v.reset(OpRotateLeft16)
898 v.AddArg2(x, y)
899 return true
900 }
901 break
902 }
903
904
905
906 for {
907 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
908 left := v_0
909 if left.Op != OpLsh16x16 {
910 continue
911 }
912 y := left.Args[1]
913 x := left.Args[0]
914 right := v_1
915 if right.Op != OpRsh16Ux16 {
916 continue
917 }
918 _ = right.Args[1]
919 if x != right.Args[0] {
920 continue
921 }
922 right_1 := right.Args[1]
923 if right_1.Op != OpSub16 {
924 continue
925 }
926 _ = right_1.Args[1]
927 right_1_0 := right_1.Args[0]
928 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
929 continue
930 }
931 v.reset(OpRotateLeft16)
932 v.AddArg2(x, y)
933 return true
934 }
935 break
936 }
937
938
939
940 for {
941 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
942 left := v_0
943 if left.Op != OpLsh16x8 {
944 continue
945 }
946 y := left.Args[1]
947 x := left.Args[0]
948 right := v_1
949 if right.Op != OpRsh16Ux8 {
950 continue
951 }
952 _ = right.Args[1]
953 if x != right.Args[0] {
954 continue
955 }
956 right_1 := right.Args[1]
957 if right_1.Op != OpSub8 {
958 continue
959 }
960 _ = right_1.Args[1]
961 right_1_0 := right_1.Args[0]
962 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
963 continue
964 }
965 v.reset(OpRotateLeft16)
966 v.AddArg2(x, y)
967 return true
968 }
969 break
970 }
971
972
973
974 for {
975 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
976 right := v_0
977 if right.Op != OpRsh16Ux64 {
978 continue
979 }
980 y := right.Args[1]
981 x := right.Args[0]
982 left := v_1
983 if left.Op != OpLsh16x64 {
984 continue
985 }
986 _ = left.Args[1]
987 if x != left.Args[0] {
988 continue
989 }
990 z := left.Args[1]
991 if z.Op != OpSub64 {
992 continue
993 }
994 _ = z.Args[1]
995 z_0 := z.Args[0]
996 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
997 continue
998 }
999 v.reset(OpRotateLeft16)
1000 v.AddArg2(x, z)
1001 return true
1002 }
1003 break
1004 }
1005
1006
1007
1008 for {
1009 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1010 right := v_0
1011 if right.Op != OpRsh16Ux32 {
1012 continue
1013 }
1014 y := right.Args[1]
1015 x := right.Args[0]
1016 left := v_1
1017 if left.Op != OpLsh16x32 {
1018 continue
1019 }
1020 _ = left.Args[1]
1021 if x != left.Args[0] {
1022 continue
1023 }
1024 z := left.Args[1]
1025 if z.Op != OpSub32 {
1026 continue
1027 }
1028 _ = z.Args[1]
1029 z_0 := z.Args[0]
1030 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1031 continue
1032 }
1033 v.reset(OpRotateLeft16)
1034 v.AddArg2(x, z)
1035 return true
1036 }
1037 break
1038 }
1039
1040
1041
1042 for {
1043 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1044 right := v_0
1045 if right.Op != OpRsh16Ux16 {
1046 continue
1047 }
1048 y := right.Args[1]
1049 x := right.Args[0]
1050 left := v_1
1051 if left.Op != OpLsh16x16 {
1052 continue
1053 }
1054 _ = left.Args[1]
1055 if x != left.Args[0] {
1056 continue
1057 }
1058 z := left.Args[1]
1059 if z.Op != OpSub16 {
1060 continue
1061 }
1062 _ = z.Args[1]
1063 z_0 := z.Args[0]
1064 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1065 continue
1066 }
1067 v.reset(OpRotateLeft16)
1068 v.AddArg2(x, z)
1069 return true
1070 }
1071 break
1072 }
1073
1074
1075
1076 for {
1077 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1078 right := v_0
1079 if right.Op != OpRsh16Ux8 {
1080 continue
1081 }
1082 y := right.Args[1]
1083 x := right.Args[0]
1084 left := v_1
1085 if left.Op != OpLsh16x8 {
1086 continue
1087 }
1088 _ = left.Args[1]
1089 if x != left.Args[0] {
1090 continue
1091 }
1092 z := left.Args[1]
1093 if z.Op != OpSub8 {
1094 continue
1095 }
1096 _ = z.Args[1]
1097 z_0 := z.Args[0]
1098 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1099 continue
1100 }
1101 v.reset(OpRotateLeft16)
1102 v.AddArg2(x, z)
1103 return true
1104 }
1105 break
1106 }
1107 return false
1108 }
1109 func rewriteValuegeneric_OpAdd32(v *Value) bool {
1110 v_1 := v.Args[1]
1111 v_0 := v.Args[0]
1112 b := v.Block
1113 config := b.Func.Config
1114
1115
1116 for {
1117 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1118 if v_0.Op != OpConst32 {
1119 continue
1120 }
1121 c := auxIntToInt32(v_0.AuxInt)
1122 if v_1.Op != OpConst32 {
1123 continue
1124 }
1125 d := auxIntToInt32(v_1.AuxInt)
1126 v.reset(OpConst32)
1127 v.AuxInt = int32ToAuxInt(c + d)
1128 return true
1129 }
1130 break
1131 }
1132
1133
1134 for {
1135 t := v.Type
1136 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1137 if v_0.Op != OpMul32 {
1138 continue
1139 }
1140 _ = v_0.Args[1]
1141 v_0_0 := v_0.Args[0]
1142 v_0_1 := v_0.Args[1]
1143 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1144 x := v_0_0
1145 y := v_0_1
1146 if v_1.Op != OpMul32 {
1147 continue
1148 }
1149 _ = v_1.Args[1]
1150 v_1_0 := v_1.Args[0]
1151 v_1_1 := v_1.Args[1]
1152 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
1153 if x != v_1_0 {
1154 continue
1155 }
1156 z := v_1_1
1157 v.reset(OpMul32)
1158 v0 := b.NewValue0(v.Pos, OpAdd32, t)
1159 v0.AddArg2(y, z)
1160 v.AddArg2(x, v0)
1161 return true
1162 }
1163 }
1164 }
1165 break
1166 }
1167
1168
1169 for {
1170 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1171 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
1172 continue
1173 }
1174 x := v_1
1175 v.copyOf(x)
1176 return true
1177 }
1178 break
1179 }
1180
1181
1182 for {
1183 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1184 x := v_0
1185 if v_1.Op != OpNeg32 {
1186 continue
1187 }
1188 y := v_1.Args[0]
1189 v.reset(OpSub32)
1190 v.AddArg2(x, y)
1191 return true
1192 }
1193 break
1194 }
1195
1196
1197 for {
1198 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1199 if v_0.Op != OpCom32 {
1200 continue
1201 }
1202 x := v_0.Args[0]
1203 if x != v_1 {
1204 continue
1205 }
1206 v.reset(OpConst32)
1207 v.AuxInt = int32ToAuxInt(-1)
1208 return true
1209 }
1210 break
1211 }
1212
1213
1214 for {
1215 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1216 if v_0.Op != OpSub32 {
1217 continue
1218 }
1219 t := v_0.Args[1]
1220 x := v_0.Args[0]
1221 if v_1.Op != OpAdd32 {
1222 continue
1223 }
1224 _ = v_1.Args[1]
1225 v_1_0 := v_1.Args[0]
1226 v_1_1 := v_1.Args[1]
1227 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1228 if t != v_1_0 {
1229 continue
1230 }
1231 y := v_1_1
1232 v.reset(OpAdd32)
1233 v.AddArg2(x, y)
1234 return true
1235 }
1236 }
1237 break
1238 }
1239
1240
1241 for {
1242 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1243 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 || v_1.Op != OpCom32 {
1244 continue
1245 }
1246 x := v_1.Args[0]
1247 v.reset(OpNeg32)
1248 v.AddArg(x)
1249 return true
1250 }
1251 break
1252 }
1253
1254
1255 for {
1256 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1257 x := v_0
1258 if v_1.Op != OpSub32 {
1259 continue
1260 }
1261 _ = v_1.Args[1]
1262 y := v_1.Args[0]
1263 if x != v_1.Args[1] {
1264 continue
1265 }
1266 v.copyOf(y)
1267 return true
1268 }
1269 break
1270 }
1271
1272
1273 for {
1274 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1275 x := v_0
1276 if v_1.Op != OpAdd32 {
1277 continue
1278 }
1279 _ = v_1.Args[1]
1280 v_1_0 := v_1.Args[0]
1281 v_1_1 := v_1.Args[1]
1282 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1283 y := v_1_0
1284 if v_1_1.Op != OpSub32 {
1285 continue
1286 }
1287 _ = v_1_1.Args[1]
1288 z := v_1_1.Args[0]
1289 if x != v_1_1.Args[1] {
1290 continue
1291 }
1292 v.reset(OpAdd32)
1293 v.AddArg2(y, z)
1294 return true
1295 }
1296 }
1297 break
1298 }
1299
1300
1301
1302 for {
1303 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1304 if v_0.Op != OpAdd32 {
1305 continue
1306 }
1307 _ = v_0.Args[1]
1308 v_0_0 := v_0.Args[0]
1309 v_0_1 := v_0.Args[1]
1310 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1311 i := v_0_0
1312 if i.Op != OpConst32 {
1313 continue
1314 }
1315 t := i.Type
1316 z := v_0_1
1317 x := v_1
1318 if !(z.Op != OpConst32 && x.Op != OpConst32) {
1319 continue
1320 }
1321 v.reset(OpAdd32)
1322 v0 := b.NewValue0(v.Pos, OpAdd32, t)
1323 v0.AddArg2(z, x)
1324 v.AddArg2(i, v0)
1325 return true
1326 }
1327 }
1328 break
1329 }
1330
1331
1332
1333 for {
1334 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1335 if v_0.Op != OpSub32 {
1336 continue
1337 }
1338 z := v_0.Args[1]
1339 i := v_0.Args[0]
1340 if i.Op != OpConst32 {
1341 continue
1342 }
1343 t := i.Type
1344 x := v_1
1345 if !(z.Op != OpConst32 && x.Op != OpConst32) {
1346 continue
1347 }
1348 v.reset(OpAdd32)
1349 v0 := b.NewValue0(v.Pos, OpSub32, t)
1350 v0.AddArg2(x, z)
1351 v.AddArg2(i, v0)
1352 return true
1353 }
1354 break
1355 }
1356
1357
1358 for {
1359 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1360 if v_0.Op != OpConst32 {
1361 continue
1362 }
1363 t := v_0.Type
1364 c := auxIntToInt32(v_0.AuxInt)
1365 if v_1.Op != OpAdd32 {
1366 continue
1367 }
1368 _ = v_1.Args[1]
1369 v_1_0 := v_1.Args[0]
1370 v_1_1 := v_1.Args[1]
1371 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1372 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
1373 continue
1374 }
1375 d := auxIntToInt32(v_1_0.AuxInt)
1376 x := v_1_1
1377 v.reset(OpAdd32)
1378 v0 := b.NewValue0(v.Pos, OpConst32, t)
1379 v0.AuxInt = int32ToAuxInt(c + d)
1380 v.AddArg2(v0, x)
1381 return true
1382 }
1383 }
1384 break
1385 }
1386
1387
1388 for {
1389 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1390 if v_0.Op != OpConst32 {
1391 continue
1392 }
1393 t := v_0.Type
1394 c := auxIntToInt32(v_0.AuxInt)
1395 if v_1.Op != OpSub32 {
1396 continue
1397 }
1398 x := v_1.Args[1]
1399 v_1_0 := v_1.Args[0]
1400 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
1401 continue
1402 }
1403 d := auxIntToInt32(v_1_0.AuxInt)
1404 v.reset(OpSub32)
1405 v0 := b.NewValue0(v.Pos, OpConst32, t)
1406 v0.AuxInt = int32ToAuxInt(c + d)
1407 v.AddArg2(v0, x)
1408 return true
1409 }
1410 break
1411 }
1412
1413
1414
1415 for {
1416 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1417 if v_0.Op != OpLsh32x64 {
1418 continue
1419 }
1420 _ = v_0.Args[1]
1421 x := v_0.Args[0]
1422 z := v_0.Args[1]
1423 if z.Op != OpConst64 {
1424 continue
1425 }
1426 c := auxIntToInt64(z.AuxInt)
1427 if v_1.Op != OpRsh32Ux64 {
1428 continue
1429 }
1430 _ = v_1.Args[1]
1431 if x != v_1.Args[0] {
1432 continue
1433 }
1434 v_1_1 := v_1.Args[1]
1435 if v_1_1.Op != OpConst64 {
1436 continue
1437 }
1438 d := auxIntToInt64(v_1_1.AuxInt)
1439 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
1440 continue
1441 }
1442 v.reset(OpRotateLeft32)
1443 v.AddArg2(x, z)
1444 return true
1445 }
1446 break
1447 }
1448
1449
1450
1451 for {
1452 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1453 left := v_0
1454 if left.Op != OpLsh32x64 {
1455 continue
1456 }
1457 y := left.Args[1]
1458 x := left.Args[0]
1459 right := v_1
1460 if right.Op != OpRsh32Ux64 {
1461 continue
1462 }
1463 _ = right.Args[1]
1464 if x != right.Args[0] {
1465 continue
1466 }
1467 right_1 := right.Args[1]
1468 if right_1.Op != OpSub64 {
1469 continue
1470 }
1471 _ = right_1.Args[1]
1472 right_1_0 := right_1.Args[0]
1473 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1474 continue
1475 }
1476 v.reset(OpRotateLeft32)
1477 v.AddArg2(x, y)
1478 return true
1479 }
1480 break
1481 }
1482
1483
1484
1485 for {
1486 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1487 left := v_0
1488 if left.Op != OpLsh32x32 {
1489 continue
1490 }
1491 y := left.Args[1]
1492 x := left.Args[0]
1493 right := v_1
1494 if right.Op != OpRsh32Ux32 {
1495 continue
1496 }
1497 _ = right.Args[1]
1498 if x != right.Args[0] {
1499 continue
1500 }
1501 right_1 := right.Args[1]
1502 if right_1.Op != OpSub32 {
1503 continue
1504 }
1505 _ = right_1.Args[1]
1506 right_1_0 := right_1.Args[0]
1507 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1508 continue
1509 }
1510 v.reset(OpRotateLeft32)
1511 v.AddArg2(x, y)
1512 return true
1513 }
1514 break
1515 }
1516
1517
1518
1519 for {
1520 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1521 left := v_0
1522 if left.Op != OpLsh32x16 {
1523 continue
1524 }
1525 y := left.Args[1]
1526 x := left.Args[0]
1527 right := v_1
1528 if right.Op != OpRsh32Ux16 {
1529 continue
1530 }
1531 _ = right.Args[1]
1532 if x != right.Args[0] {
1533 continue
1534 }
1535 right_1 := right.Args[1]
1536 if right_1.Op != OpSub16 {
1537 continue
1538 }
1539 _ = right_1.Args[1]
1540 right_1_0 := right_1.Args[0]
1541 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1542 continue
1543 }
1544 v.reset(OpRotateLeft32)
1545 v.AddArg2(x, y)
1546 return true
1547 }
1548 break
1549 }
1550
1551
1552
1553 for {
1554 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1555 left := v_0
1556 if left.Op != OpLsh32x8 {
1557 continue
1558 }
1559 y := left.Args[1]
1560 x := left.Args[0]
1561 right := v_1
1562 if right.Op != OpRsh32Ux8 {
1563 continue
1564 }
1565 _ = right.Args[1]
1566 if x != right.Args[0] {
1567 continue
1568 }
1569 right_1 := right.Args[1]
1570 if right_1.Op != OpSub8 {
1571 continue
1572 }
1573 _ = right_1.Args[1]
1574 right_1_0 := right_1.Args[0]
1575 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1576 continue
1577 }
1578 v.reset(OpRotateLeft32)
1579 v.AddArg2(x, y)
1580 return true
1581 }
1582 break
1583 }
1584
1585
1586
1587 for {
1588 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1589 right := v_0
1590 if right.Op != OpRsh32Ux64 {
1591 continue
1592 }
1593 y := right.Args[1]
1594 x := right.Args[0]
1595 left := v_1
1596 if left.Op != OpLsh32x64 {
1597 continue
1598 }
1599 _ = left.Args[1]
1600 if x != left.Args[0] {
1601 continue
1602 }
1603 z := left.Args[1]
1604 if z.Op != OpSub64 {
1605 continue
1606 }
1607 _ = z.Args[1]
1608 z_0 := z.Args[0]
1609 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1610 continue
1611 }
1612 v.reset(OpRotateLeft32)
1613 v.AddArg2(x, z)
1614 return true
1615 }
1616 break
1617 }
1618
1619
1620
1621 for {
1622 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1623 right := v_0
1624 if right.Op != OpRsh32Ux32 {
1625 continue
1626 }
1627 y := right.Args[1]
1628 x := right.Args[0]
1629 left := v_1
1630 if left.Op != OpLsh32x32 {
1631 continue
1632 }
1633 _ = left.Args[1]
1634 if x != left.Args[0] {
1635 continue
1636 }
1637 z := left.Args[1]
1638 if z.Op != OpSub32 {
1639 continue
1640 }
1641 _ = z.Args[1]
1642 z_0 := z.Args[0]
1643 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1644 continue
1645 }
1646 v.reset(OpRotateLeft32)
1647 v.AddArg2(x, z)
1648 return true
1649 }
1650 break
1651 }
1652
1653
1654
1655 for {
1656 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1657 right := v_0
1658 if right.Op != OpRsh32Ux16 {
1659 continue
1660 }
1661 y := right.Args[1]
1662 x := right.Args[0]
1663 left := v_1
1664 if left.Op != OpLsh32x16 {
1665 continue
1666 }
1667 _ = left.Args[1]
1668 if x != left.Args[0] {
1669 continue
1670 }
1671 z := left.Args[1]
1672 if z.Op != OpSub16 {
1673 continue
1674 }
1675 _ = z.Args[1]
1676 z_0 := z.Args[0]
1677 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1678 continue
1679 }
1680 v.reset(OpRotateLeft32)
1681 v.AddArg2(x, z)
1682 return true
1683 }
1684 break
1685 }
1686
1687
1688
1689 for {
1690 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1691 right := v_0
1692 if right.Op != OpRsh32Ux8 {
1693 continue
1694 }
1695 y := right.Args[1]
1696 x := right.Args[0]
1697 left := v_1
1698 if left.Op != OpLsh32x8 {
1699 continue
1700 }
1701 _ = left.Args[1]
1702 if x != left.Args[0] {
1703 continue
1704 }
1705 z := left.Args[1]
1706 if z.Op != OpSub8 {
1707 continue
1708 }
1709 _ = z.Args[1]
1710 z_0 := z.Args[0]
1711 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1712 continue
1713 }
1714 v.reset(OpRotateLeft32)
1715 v.AddArg2(x, z)
1716 return true
1717 }
1718 break
1719 }
1720 return false
1721 }
1722 func rewriteValuegeneric_OpAdd32F(v *Value) bool {
1723 v_1 := v.Args[1]
1724 v_0 := v.Args[0]
1725
1726
1727
1728 for {
1729 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1730 if v_0.Op != OpConst32F {
1731 continue
1732 }
1733 c := auxIntToFloat32(v_0.AuxInt)
1734 if v_1.Op != OpConst32F {
1735 continue
1736 }
1737 d := auxIntToFloat32(v_1.AuxInt)
1738 if !(c+d == c+d) {
1739 continue
1740 }
1741 v.reset(OpConst32F)
1742 v.AuxInt = float32ToAuxInt(c + d)
1743 return true
1744 }
1745 break
1746 }
1747 return false
1748 }
1749 func rewriteValuegeneric_OpAdd64(v *Value) bool {
1750 v_1 := v.Args[1]
1751 v_0 := v.Args[0]
1752 b := v.Block
1753 config := b.Func.Config
1754
1755
1756 for {
1757 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1758 if v_0.Op != OpConst64 {
1759 continue
1760 }
1761 c := auxIntToInt64(v_0.AuxInt)
1762 if v_1.Op != OpConst64 {
1763 continue
1764 }
1765 d := auxIntToInt64(v_1.AuxInt)
1766 v.reset(OpConst64)
1767 v.AuxInt = int64ToAuxInt(c + d)
1768 return true
1769 }
1770 break
1771 }
1772
1773
1774 for {
1775 t := v.Type
1776 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1777 if v_0.Op != OpMul64 {
1778 continue
1779 }
1780 _ = v_0.Args[1]
1781 v_0_0 := v_0.Args[0]
1782 v_0_1 := v_0.Args[1]
1783 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1784 x := v_0_0
1785 y := v_0_1
1786 if v_1.Op != OpMul64 {
1787 continue
1788 }
1789 _ = v_1.Args[1]
1790 v_1_0 := v_1.Args[0]
1791 v_1_1 := v_1.Args[1]
1792 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
1793 if x != v_1_0 {
1794 continue
1795 }
1796 z := v_1_1
1797 v.reset(OpMul64)
1798 v0 := b.NewValue0(v.Pos, OpAdd64, t)
1799 v0.AddArg2(y, z)
1800 v.AddArg2(x, v0)
1801 return true
1802 }
1803 }
1804 }
1805 break
1806 }
1807
1808
1809 for {
1810 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1811 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
1812 continue
1813 }
1814 x := v_1
1815 v.copyOf(x)
1816 return true
1817 }
1818 break
1819 }
1820
1821
1822 for {
1823 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1824 x := v_0
1825 if v_1.Op != OpNeg64 {
1826 continue
1827 }
1828 y := v_1.Args[0]
1829 v.reset(OpSub64)
1830 v.AddArg2(x, y)
1831 return true
1832 }
1833 break
1834 }
1835
1836
1837 for {
1838 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1839 if v_0.Op != OpCom64 {
1840 continue
1841 }
1842 x := v_0.Args[0]
1843 if x != v_1 {
1844 continue
1845 }
1846 v.reset(OpConst64)
1847 v.AuxInt = int64ToAuxInt(-1)
1848 return true
1849 }
1850 break
1851 }
1852
1853
1854 for {
1855 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1856 if v_0.Op != OpSub64 {
1857 continue
1858 }
1859 t := v_0.Args[1]
1860 x := v_0.Args[0]
1861 if v_1.Op != OpAdd64 {
1862 continue
1863 }
1864 _ = v_1.Args[1]
1865 v_1_0 := v_1.Args[0]
1866 v_1_1 := v_1.Args[1]
1867 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1868 if t != v_1_0 {
1869 continue
1870 }
1871 y := v_1_1
1872 v.reset(OpAdd64)
1873 v.AddArg2(x, y)
1874 return true
1875 }
1876 }
1877 break
1878 }
1879
1880
1881 for {
1882 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1883 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 || v_1.Op != OpCom64 {
1884 continue
1885 }
1886 x := v_1.Args[0]
1887 v.reset(OpNeg64)
1888 v.AddArg(x)
1889 return true
1890 }
1891 break
1892 }
1893
1894
1895 for {
1896 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1897 x := v_0
1898 if v_1.Op != OpSub64 {
1899 continue
1900 }
1901 _ = v_1.Args[1]
1902 y := v_1.Args[0]
1903 if x != v_1.Args[1] {
1904 continue
1905 }
1906 v.copyOf(y)
1907 return true
1908 }
1909 break
1910 }
1911
1912
1913 for {
1914 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1915 x := v_0
1916 if v_1.Op != OpAdd64 {
1917 continue
1918 }
1919 _ = v_1.Args[1]
1920 v_1_0 := v_1.Args[0]
1921 v_1_1 := v_1.Args[1]
1922 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1923 y := v_1_0
1924 if v_1_1.Op != OpSub64 {
1925 continue
1926 }
1927 _ = v_1_1.Args[1]
1928 z := v_1_1.Args[0]
1929 if x != v_1_1.Args[1] {
1930 continue
1931 }
1932 v.reset(OpAdd64)
1933 v.AddArg2(y, z)
1934 return true
1935 }
1936 }
1937 break
1938 }
1939
1940
1941
1942 for {
1943 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1944 if v_0.Op != OpAdd64 {
1945 continue
1946 }
1947 _ = v_0.Args[1]
1948 v_0_0 := v_0.Args[0]
1949 v_0_1 := v_0.Args[1]
1950 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1951 i := v_0_0
1952 if i.Op != OpConst64 {
1953 continue
1954 }
1955 t := i.Type
1956 z := v_0_1
1957 x := v_1
1958 if !(z.Op != OpConst64 && x.Op != OpConst64) {
1959 continue
1960 }
1961 v.reset(OpAdd64)
1962 v0 := b.NewValue0(v.Pos, OpAdd64, t)
1963 v0.AddArg2(z, x)
1964 v.AddArg2(i, v0)
1965 return true
1966 }
1967 }
1968 break
1969 }
1970
1971
1972
1973 for {
1974 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1975 if v_0.Op != OpSub64 {
1976 continue
1977 }
1978 z := v_0.Args[1]
1979 i := v_0.Args[0]
1980 if i.Op != OpConst64 {
1981 continue
1982 }
1983 t := i.Type
1984 x := v_1
1985 if !(z.Op != OpConst64 && x.Op != OpConst64) {
1986 continue
1987 }
1988 v.reset(OpAdd64)
1989 v0 := b.NewValue0(v.Pos, OpSub64, t)
1990 v0.AddArg2(x, z)
1991 v.AddArg2(i, v0)
1992 return true
1993 }
1994 break
1995 }
1996
1997
1998 for {
1999 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2000 if v_0.Op != OpConst64 {
2001 continue
2002 }
2003 t := v_0.Type
2004 c := auxIntToInt64(v_0.AuxInt)
2005 if v_1.Op != OpAdd64 {
2006 continue
2007 }
2008 _ = v_1.Args[1]
2009 v_1_0 := v_1.Args[0]
2010 v_1_1 := v_1.Args[1]
2011 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2012 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
2013 continue
2014 }
2015 d := auxIntToInt64(v_1_0.AuxInt)
2016 x := v_1_1
2017 v.reset(OpAdd64)
2018 v0 := b.NewValue0(v.Pos, OpConst64, t)
2019 v0.AuxInt = int64ToAuxInt(c + d)
2020 v.AddArg2(v0, x)
2021 return true
2022 }
2023 }
2024 break
2025 }
2026
2027
2028 for {
2029 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2030 if v_0.Op != OpConst64 {
2031 continue
2032 }
2033 t := v_0.Type
2034 c := auxIntToInt64(v_0.AuxInt)
2035 if v_1.Op != OpSub64 {
2036 continue
2037 }
2038 x := v_1.Args[1]
2039 v_1_0 := v_1.Args[0]
2040 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
2041 continue
2042 }
2043 d := auxIntToInt64(v_1_0.AuxInt)
2044 v.reset(OpSub64)
2045 v0 := b.NewValue0(v.Pos, OpConst64, t)
2046 v0.AuxInt = int64ToAuxInt(c + d)
2047 v.AddArg2(v0, x)
2048 return true
2049 }
2050 break
2051 }
2052
2053
2054
2055 for {
2056 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2057 if v_0.Op != OpLsh64x64 {
2058 continue
2059 }
2060 _ = v_0.Args[1]
2061 x := v_0.Args[0]
2062 z := v_0.Args[1]
2063 if z.Op != OpConst64 {
2064 continue
2065 }
2066 c := auxIntToInt64(z.AuxInt)
2067 if v_1.Op != OpRsh64Ux64 {
2068 continue
2069 }
2070 _ = v_1.Args[1]
2071 if x != v_1.Args[0] {
2072 continue
2073 }
2074 v_1_1 := v_1.Args[1]
2075 if v_1_1.Op != OpConst64 {
2076 continue
2077 }
2078 d := auxIntToInt64(v_1_1.AuxInt)
2079 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
2080 continue
2081 }
2082 v.reset(OpRotateLeft64)
2083 v.AddArg2(x, z)
2084 return true
2085 }
2086 break
2087 }
2088
2089
2090
2091 for {
2092 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2093 left := v_0
2094 if left.Op != OpLsh64x64 {
2095 continue
2096 }
2097 y := left.Args[1]
2098 x := left.Args[0]
2099 right := v_1
2100 if right.Op != OpRsh64Ux64 {
2101 continue
2102 }
2103 _ = right.Args[1]
2104 if x != right.Args[0] {
2105 continue
2106 }
2107 right_1 := right.Args[1]
2108 if right_1.Op != OpSub64 {
2109 continue
2110 }
2111 _ = right_1.Args[1]
2112 right_1_0 := right_1.Args[0]
2113 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2114 continue
2115 }
2116 v.reset(OpRotateLeft64)
2117 v.AddArg2(x, y)
2118 return true
2119 }
2120 break
2121 }
2122
2123
2124
2125 for {
2126 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2127 left := v_0
2128 if left.Op != OpLsh64x32 {
2129 continue
2130 }
2131 y := left.Args[1]
2132 x := left.Args[0]
2133 right := v_1
2134 if right.Op != OpRsh64Ux32 {
2135 continue
2136 }
2137 _ = right.Args[1]
2138 if x != right.Args[0] {
2139 continue
2140 }
2141 right_1 := right.Args[1]
2142 if right_1.Op != OpSub32 {
2143 continue
2144 }
2145 _ = right_1.Args[1]
2146 right_1_0 := right_1.Args[0]
2147 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2148 continue
2149 }
2150 v.reset(OpRotateLeft64)
2151 v.AddArg2(x, y)
2152 return true
2153 }
2154 break
2155 }
2156
2157
2158
2159 for {
2160 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2161 left := v_0
2162 if left.Op != OpLsh64x16 {
2163 continue
2164 }
2165 y := left.Args[1]
2166 x := left.Args[0]
2167 right := v_1
2168 if right.Op != OpRsh64Ux16 {
2169 continue
2170 }
2171 _ = right.Args[1]
2172 if x != right.Args[0] {
2173 continue
2174 }
2175 right_1 := right.Args[1]
2176 if right_1.Op != OpSub16 {
2177 continue
2178 }
2179 _ = right_1.Args[1]
2180 right_1_0 := right_1.Args[0]
2181 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2182 continue
2183 }
2184 v.reset(OpRotateLeft64)
2185 v.AddArg2(x, y)
2186 return true
2187 }
2188 break
2189 }
2190
2191
2192
2193 for {
2194 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2195 left := v_0
2196 if left.Op != OpLsh64x8 {
2197 continue
2198 }
2199 y := left.Args[1]
2200 x := left.Args[0]
2201 right := v_1
2202 if right.Op != OpRsh64Ux8 {
2203 continue
2204 }
2205 _ = right.Args[1]
2206 if x != right.Args[0] {
2207 continue
2208 }
2209 right_1 := right.Args[1]
2210 if right_1.Op != OpSub8 {
2211 continue
2212 }
2213 _ = right_1.Args[1]
2214 right_1_0 := right_1.Args[0]
2215 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2216 continue
2217 }
2218 v.reset(OpRotateLeft64)
2219 v.AddArg2(x, y)
2220 return true
2221 }
2222 break
2223 }
2224
2225
2226
2227 for {
2228 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2229 right := v_0
2230 if right.Op != OpRsh64Ux64 {
2231 continue
2232 }
2233 y := right.Args[1]
2234 x := right.Args[0]
2235 left := v_1
2236 if left.Op != OpLsh64x64 {
2237 continue
2238 }
2239 _ = left.Args[1]
2240 if x != left.Args[0] {
2241 continue
2242 }
2243 z := left.Args[1]
2244 if z.Op != OpSub64 {
2245 continue
2246 }
2247 _ = z.Args[1]
2248 z_0 := z.Args[0]
2249 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2250 continue
2251 }
2252 v.reset(OpRotateLeft64)
2253 v.AddArg2(x, z)
2254 return true
2255 }
2256 break
2257 }
2258
2259
2260
2261 for {
2262 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2263 right := v_0
2264 if right.Op != OpRsh64Ux32 {
2265 continue
2266 }
2267 y := right.Args[1]
2268 x := right.Args[0]
2269 left := v_1
2270 if left.Op != OpLsh64x32 {
2271 continue
2272 }
2273 _ = left.Args[1]
2274 if x != left.Args[0] {
2275 continue
2276 }
2277 z := left.Args[1]
2278 if z.Op != OpSub32 {
2279 continue
2280 }
2281 _ = z.Args[1]
2282 z_0 := z.Args[0]
2283 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2284 continue
2285 }
2286 v.reset(OpRotateLeft64)
2287 v.AddArg2(x, z)
2288 return true
2289 }
2290 break
2291 }
2292
2293
2294
2295 for {
2296 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2297 right := v_0
2298 if right.Op != OpRsh64Ux16 {
2299 continue
2300 }
2301 y := right.Args[1]
2302 x := right.Args[0]
2303 left := v_1
2304 if left.Op != OpLsh64x16 {
2305 continue
2306 }
2307 _ = left.Args[1]
2308 if x != left.Args[0] {
2309 continue
2310 }
2311 z := left.Args[1]
2312 if z.Op != OpSub16 {
2313 continue
2314 }
2315 _ = z.Args[1]
2316 z_0 := z.Args[0]
2317 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2318 continue
2319 }
2320 v.reset(OpRotateLeft64)
2321 v.AddArg2(x, z)
2322 return true
2323 }
2324 break
2325 }
2326
2327
2328
2329 for {
2330 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2331 right := v_0
2332 if right.Op != OpRsh64Ux8 {
2333 continue
2334 }
2335 y := right.Args[1]
2336 x := right.Args[0]
2337 left := v_1
2338 if left.Op != OpLsh64x8 {
2339 continue
2340 }
2341 _ = left.Args[1]
2342 if x != left.Args[0] {
2343 continue
2344 }
2345 z := left.Args[1]
2346 if z.Op != OpSub8 {
2347 continue
2348 }
2349 _ = z.Args[1]
2350 z_0 := z.Args[0]
2351 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2352 continue
2353 }
2354 v.reset(OpRotateLeft64)
2355 v.AddArg2(x, z)
2356 return true
2357 }
2358 break
2359 }
2360 return false
2361 }
2362 func rewriteValuegeneric_OpAdd64F(v *Value) bool {
2363 v_1 := v.Args[1]
2364 v_0 := v.Args[0]
2365
2366
2367
2368 for {
2369 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2370 if v_0.Op != OpConst64F {
2371 continue
2372 }
2373 c := auxIntToFloat64(v_0.AuxInt)
2374 if v_1.Op != OpConst64F {
2375 continue
2376 }
2377 d := auxIntToFloat64(v_1.AuxInt)
2378 if !(c+d == c+d) {
2379 continue
2380 }
2381 v.reset(OpConst64F)
2382 v.AuxInt = float64ToAuxInt(c + d)
2383 return true
2384 }
2385 break
2386 }
2387 return false
2388 }
2389 func rewriteValuegeneric_OpAdd64carry(v *Value) bool {
2390 v_2 := v.Args[2]
2391 v_1 := v.Args[1]
2392 v_0 := v.Args[0]
2393 b := v.Block
2394
2395
2396
2397 for {
2398 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2399 if v_0.Op != OpConst64 {
2400 continue
2401 }
2402 t := v_0.Type
2403 x := auxIntToInt64(v_0.AuxInt)
2404 if v_1.Op != OpConst64 {
2405 continue
2406 }
2407 y := auxIntToInt64(v_1.AuxInt)
2408 if v_2.Op != OpConst64 {
2409 continue
2410 }
2411 c := auxIntToInt64(v_2.AuxInt)
2412 if !(c >= 0 && c <= 1) {
2413 continue
2414 }
2415 v.reset(OpMakeTuple)
2416 v0 := b.NewValue0(v.Pos, OpConst64, t)
2417 v0.AuxInt = int64ToAuxInt(bitsAdd64(x, y, c).sum)
2418 v1 := b.NewValue0(v.Pos, OpConst64, t)
2419 v1.AuxInt = int64ToAuxInt(bitsAdd64(x, y, c).carry)
2420 v.AddArg2(v0, v1)
2421 return true
2422 }
2423 break
2424 }
2425 return false
2426 }
2427 func rewriteValuegeneric_OpAdd8(v *Value) bool {
2428 v_1 := v.Args[1]
2429 v_0 := v.Args[0]
2430 b := v.Block
2431 config := b.Func.Config
2432
2433
2434 for {
2435 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2436 if v_0.Op != OpConst8 {
2437 continue
2438 }
2439 c := auxIntToInt8(v_0.AuxInt)
2440 if v_1.Op != OpConst8 {
2441 continue
2442 }
2443 d := auxIntToInt8(v_1.AuxInt)
2444 v.reset(OpConst8)
2445 v.AuxInt = int8ToAuxInt(c + d)
2446 return true
2447 }
2448 break
2449 }
2450
2451
2452 for {
2453 t := v.Type
2454 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2455 if v_0.Op != OpMul8 {
2456 continue
2457 }
2458 _ = v_0.Args[1]
2459 v_0_0 := v_0.Args[0]
2460 v_0_1 := v_0.Args[1]
2461 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
2462 x := v_0_0
2463 y := v_0_1
2464 if v_1.Op != OpMul8 {
2465 continue
2466 }
2467 _ = v_1.Args[1]
2468 v_1_0 := v_1.Args[0]
2469 v_1_1 := v_1.Args[1]
2470 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
2471 if x != v_1_0 {
2472 continue
2473 }
2474 z := v_1_1
2475 v.reset(OpMul8)
2476 v0 := b.NewValue0(v.Pos, OpAdd8, t)
2477 v0.AddArg2(y, z)
2478 v.AddArg2(x, v0)
2479 return true
2480 }
2481 }
2482 }
2483 break
2484 }
2485
2486
2487 for {
2488 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2489 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
2490 continue
2491 }
2492 x := v_1
2493 v.copyOf(x)
2494 return true
2495 }
2496 break
2497 }
2498
2499
2500 for {
2501 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2502 x := v_0
2503 if v_1.Op != OpNeg8 {
2504 continue
2505 }
2506 y := v_1.Args[0]
2507 v.reset(OpSub8)
2508 v.AddArg2(x, y)
2509 return true
2510 }
2511 break
2512 }
2513
2514
2515 for {
2516 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2517 if v_0.Op != OpCom8 {
2518 continue
2519 }
2520 x := v_0.Args[0]
2521 if x != v_1 {
2522 continue
2523 }
2524 v.reset(OpConst8)
2525 v.AuxInt = int8ToAuxInt(-1)
2526 return true
2527 }
2528 break
2529 }
2530
2531
2532 for {
2533 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2534 if v_0.Op != OpSub8 {
2535 continue
2536 }
2537 t := v_0.Args[1]
2538 x := v_0.Args[0]
2539 if v_1.Op != OpAdd8 {
2540 continue
2541 }
2542 _ = v_1.Args[1]
2543 v_1_0 := v_1.Args[0]
2544 v_1_1 := v_1.Args[1]
2545 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2546 if t != v_1_0 {
2547 continue
2548 }
2549 y := v_1_1
2550 v.reset(OpAdd8)
2551 v.AddArg2(x, y)
2552 return true
2553 }
2554 }
2555 break
2556 }
2557
2558
2559 for {
2560 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2561 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 1 || v_1.Op != OpCom8 {
2562 continue
2563 }
2564 x := v_1.Args[0]
2565 v.reset(OpNeg8)
2566 v.AddArg(x)
2567 return true
2568 }
2569 break
2570 }
2571
2572
2573 for {
2574 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2575 x := v_0
2576 if v_1.Op != OpSub8 {
2577 continue
2578 }
2579 _ = v_1.Args[1]
2580 y := v_1.Args[0]
2581 if x != v_1.Args[1] {
2582 continue
2583 }
2584 v.copyOf(y)
2585 return true
2586 }
2587 break
2588 }
2589
2590
2591 for {
2592 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2593 x := v_0
2594 if v_1.Op != OpAdd8 {
2595 continue
2596 }
2597 _ = v_1.Args[1]
2598 v_1_0 := v_1.Args[0]
2599 v_1_1 := v_1.Args[1]
2600 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2601 y := v_1_0
2602 if v_1_1.Op != OpSub8 {
2603 continue
2604 }
2605 _ = v_1_1.Args[1]
2606 z := v_1_1.Args[0]
2607 if x != v_1_1.Args[1] {
2608 continue
2609 }
2610 v.reset(OpAdd8)
2611 v.AddArg2(y, z)
2612 return true
2613 }
2614 }
2615 break
2616 }
2617
2618
2619
2620 for {
2621 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2622 if v_0.Op != OpAdd8 {
2623 continue
2624 }
2625 _ = v_0.Args[1]
2626 v_0_0 := v_0.Args[0]
2627 v_0_1 := v_0.Args[1]
2628 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
2629 i := v_0_0
2630 if i.Op != OpConst8 {
2631 continue
2632 }
2633 t := i.Type
2634 z := v_0_1
2635 x := v_1
2636 if !(z.Op != OpConst8 && x.Op != OpConst8) {
2637 continue
2638 }
2639 v.reset(OpAdd8)
2640 v0 := b.NewValue0(v.Pos, OpAdd8, t)
2641 v0.AddArg2(z, x)
2642 v.AddArg2(i, v0)
2643 return true
2644 }
2645 }
2646 break
2647 }
2648
2649
2650
2651 for {
2652 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2653 if v_0.Op != OpSub8 {
2654 continue
2655 }
2656 z := v_0.Args[1]
2657 i := v_0.Args[0]
2658 if i.Op != OpConst8 {
2659 continue
2660 }
2661 t := i.Type
2662 x := v_1
2663 if !(z.Op != OpConst8 && x.Op != OpConst8) {
2664 continue
2665 }
2666 v.reset(OpAdd8)
2667 v0 := b.NewValue0(v.Pos, OpSub8, t)
2668 v0.AddArg2(x, z)
2669 v.AddArg2(i, v0)
2670 return true
2671 }
2672 break
2673 }
2674
2675
2676 for {
2677 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2678 if v_0.Op != OpConst8 {
2679 continue
2680 }
2681 t := v_0.Type
2682 c := auxIntToInt8(v_0.AuxInt)
2683 if v_1.Op != OpAdd8 {
2684 continue
2685 }
2686 _ = v_1.Args[1]
2687 v_1_0 := v_1.Args[0]
2688 v_1_1 := v_1.Args[1]
2689 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2690 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
2691 continue
2692 }
2693 d := auxIntToInt8(v_1_0.AuxInt)
2694 x := v_1_1
2695 v.reset(OpAdd8)
2696 v0 := b.NewValue0(v.Pos, OpConst8, t)
2697 v0.AuxInt = int8ToAuxInt(c + d)
2698 v.AddArg2(v0, x)
2699 return true
2700 }
2701 }
2702 break
2703 }
2704
2705
2706 for {
2707 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2708 if v_0.Op != OpConst8 {
2709 continue
2710 }
2711 t := v_0.Type
2712 c := auxIntToInt8(v_0.AuxInt)
2713 if v_1.Op != OpSub8 {
2714 continue
2715 }
2716 x := v_1.Args[1]
2717 v_1_0 := v_1.Args[0]
2718 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
2719 continue
2720 }
2721 d := auxIntToInt8(v_1_0.AuxInt)
2722 v.reset(OpSub8)
2723 v0 := b.NewValue0(v.Pos, OpConst8, t)
2724 v0.AuxInt = int8ToAuxInt(c + d)
2725 v.AddArg2(v0, x)
2726 return true
2727 }
2728 break
2729 }
2730
2731
2732
2733 for {
2734 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2735 if v_0.Op != OpLsh8x64 {
2736 continue
2737 }
2738 _ = v_0.Args[1]
2739 x := v_0.Args[0]
2740 z := v_0.Args[1]
2741 if z.Op != OpConst64 {
2742 continue
2743 }
2744 c := auxIntToInt64(z.AuxInt)
2745 if v_1.Op != OpRsh8Ux64 {
2746 continue
2747 }
2748 _ = v_1.Args[1]
2749 if x != v_1.Args[0] {
2750 continue
2751 }
2752 v_1_1 := v_1.Args[1]
2753 if v_1_1.Op != OpConst64 {
2754 continue
2755 }
2756 d := auxIntToInt64(v_1_1.AuxInt)
2757 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
2758 continue
2759 }
2760 v.reset(OpRotateLeft8)
2761 v.AddArg2(x, z)
2762 return true
2763 }
2764 break
2765 }
2766
2767
2768
2769 for {
2770 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2771 left := v_0
2772 if left.Op != OpLsh8x64 {
2773 continue
2774 }
2775 y := left.Args[1]
2776 x := left.Args[0]
2777 right := v_1
2778 if right.Op != OpRsh8Ux64 {
2779 continue
2780 }
2781 _ = right.Args[1]
2782 if x != right.Args[0] {
2783 continue
2784 }
2785 right_1 := right.Args[1]
2786 if right_1.Op != OpSub64 {
2787 continue
2788 }
2789 _ = right_1.Args[1]
2790 right_1_0 := right_1.Args[0]
2791 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2792 continue
2793 }
2794 v.reset(OpRotateLeft8)
2795 v.AddArg2(x, y)
2796 return true
2797 }
2798 break
2799 }
2800
2801
2802
2803 for {
2804 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2805 left := v_0
2806 if left.Op != OpLsh8x32 {
2807 continue
2808 }
2809 y := left.Args[1]
2810 x := left.Args[0]
2811 right := v_1
2812 if right.Op != OpRsh8Ux32 {
2813 continue
2814 }
2815 _ = right.Args[1]
2816 if x != right.Args[0] {
2817 continue
2818 }
2819 right_1 := right.Args[1]
2820 if right_1.Op != OpSub32 {
2821 continue
2822 }
2823 _ = right_1.Args[1]
2824 right_1_0 := right_1.Args[0]
2825 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2826 continue
2827 }
2828 v.reset(OpRotateLeft8)
2829 v.AddArg2(x, y)
2830 return true
2831 }
2832 break
2833 }
2834
2835
2836
2837 for {
2838 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2839 left := v_0
2840 if left.Op != OpLsh8x16 {
2841 continue
2842 }
2843 y := left.Args[1]
2844 x := left.Args[0]
2845 right := v_1
2846 if right.Op != OpRsh8Ux16 {
2847 continue
2848 }
2849 _ = right.Args[1]
2850 if x != right.Args[0] {
2851 continue
2852 }
2853 right_1 := right.Args[1]
2854 if right_1.Op != OpSub16 {
2855 continue
2856 }
2857 _ = right_1.Args[1]
2858 right_1_0 := right_1.Args[0]
2859 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2860 continue
2861 }
2862 v.reset(OpRotateLeft8)
2863 v.AddArg2(x, y)
2864 return true
2865 }
2866 break
2867 }
2868
2869
2870
2871 for {
2872 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2873 left := v_0
2874 if left.Op != OpLsh8x8 {
2875 continue
2876 }
2877 y := left.Args[1]
2878 x := left.Args[0]
2879 right := v_1
2880 if right.Op != OpRsh8Ux8 {
2881 continue
2882 }
2883 _ = right.Args[1]
2884 if x != right.Args[0] {
2885 continue
2886 }
2887 right_1 := right.Args[1]
2888 if right_1.Op != OpSub8 {
2889 continue
2890 }
2891 _ = right_1.Args[1]
2892 right_1_0 := right_1.Args[0]
2893 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2894 continue
2895 }
2896 v.reset(OpRotateLeft8)
2897 v.AddArg2(x, y)
2898 return true
2899 }
2900 break
2901 }
2902
2903
2904
2905 for {
2906 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2907 right := v_0
2908 if right.Op != OpRsh8Ux64 {
2909 continue
2910 }
2911 y := right.Args[1]
2912 x := right.Args[0]
2913 left := v_1
2914 if left.Op != OpLsh8x64 {
2915 continue
2916 }
2917 _ = left.Args[1]
2918 if x != left.Args[0] {
2919 continue
2920 }
2921 z := left.Args[1]
2922 if z.Op != OpSub64 {
2923 continue
2924 }
2925 _ = z.Args[1]
2926 z_0 := z.Args[0]
2927 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2928 continue
2929 }
2930 v.reset(OpRotateLeft8)
2931 v.AddArg2(x, z)
2932 return true
2933 }
2934 break
2935 }
2936
2937
2938
2939 for {
2940 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2941 right := v_0
2942 if right.Op != OpRsh8Ux32 {
2943 continue
2944 }
2945 y := right.Args[1]
2946 x := right.Args[0]
2947 left := v_1
2948 if left.Op != OpLsh8x32 {
2949 continue
2950 }
2951 _ = left.Args[1]
2952 if x != left.Args[0] {
2953 continue
2954 }
2955 z := left.Args[1]
2956 if z.Op != OpSub32 {
2957 continue
2958 }
2959 _ = z.Args[1]
2960 z_0 := z.Args[0]
2961 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2962 continue
2963 }
2964 v.reset(OpRotateLeft8)
2965 v.AddArg2(x, z)
2966 return true
2967 }
2968 break
2969 }
2970
2971
2972
2973 for {
2974 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2975 right := v_0
2976 if right.Op != OpRsh8Ux16 {
2977 continue
2978 }
2979 y := right.Args[1]
2980 x := right.Args[0]
2981 left := v_1
2982 if left.Op != OpLsh8x16 {
2983 continue
2984 }
2985 _ = left.Args[1]
2986 if x != left.Args[0] {
2987 continue
2988 }
2989 z := left.Args[1]
2990 if z.Op != OpSub16 {
2991 continue
2992 }
2993 _ = z.Args[1]
2994 z_0 := z.Args[0]
2995 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2996 continue
2997 }
2998 v.reset(OpRotateLeft8)
2999 v.AddArg2(x, z)
3000 return true
3001 }
3002 break
3003 }
3004
3005
3006
3007 for {
3008 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3009 right := v_0
3010 if right.Op != OpRsh8Ux8 {
3011 continue
3012 }
3013 y := right.Args[1]
3014 x := right.Args[0]
3015 left := v_1
3016 if left.Op != OpLsh8x8 {
3017 continue
3018 }
3019 _ = left.Args[1]
3020 if x != left.Args[0] {
3021 continue
3022 }
3023 z := left.Args[1]
3024 if z.Op != OpSub8 {
3025 continue
3026 }
3027 _ = z.Args[1]
3028 z_0 := z.Args[0]
3029 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
3030 continue
3031 }
3032 v.reset(OpRotateLeft8)
3033 v.AddArg2(x, z)
3034 return true
3035 }
3036 break
3037 }
3038 return false
3039 }
3040 func rewriteValuegeneric_OpAddPtr(v *Value) bool {
3041 v_1 := v.Args[1]
3042 v_0 := v.Args[0]
3043
3044
3045 for {
3046 t := v.Type
3047 x := v_0
3048 if v_1.Op != OpConst64 {
3049 break
3050 }
3051 c := auxIntToInt64(v_1.AuxInt)
3052 v.reset(OpOffPtr)
3053 v.Type = t
3054 v.AuxInt = int64ToAuxInt(c)
3055 v.AddArg(x)
3056 return true
3057 }
3058
3059
3060 for {
3061 t := v.Type
3062 x := v_0
3063 if v_1.Op != OpConst32 {
3064 break
3065 }
3066 c := auxIntToInt32(v_1.AuxInt)
3067 v.reset(OpOffPtr)
3068 v.Type = t
3069 v.AuxInt = int64ToAuxInt(int64(c))
3070 v.AddArg(x)
3071 return true
3072 }
3073 return false
3074 }
3075 func rewriteValuegeneric_OpAnd16(v *Value) bool {
3076 v_1 := v.Args[1]
3077 v_0 := v.Args[0]
3078 b := v.Block
3079
3080
3081 for {
3082 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3083 if v_0.Op != OpConst16 {
3084 continue
3085 }
3086 c := auxIntToInt16(v_0.AuxInt)
3087 if v_1.Op != OpConst16 {
3088 continue
3089 }
3090 d := auxIntToInt16(v_1.AuxInt)
3091 v.reset(OpConst16)
3092 v.AuxInt = int16ToAuxInt(c & d)
3093 return true
3094 }
3095 break
3096 }
3097
3098
3099 for {
3100 t := v.Type
3101 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3102 if v_0.Op != OpCom16 {
3103 continue
3104 }
3105 x := v_0.Args[0]
3106 if v_1.Op != OpCom16 {
3107 continue
3108 }
3109 y := v_1.Args[0]
3110 v.reset(OpCom16)
3111 v0 := b.NewValue0(v.Pos, OpOr16, t)
3112 v0.AddArg2(x, y)
3113 v.AddArg(v0)
3114 return true
3115 }
3116 break
3117 }
3118
3119
3120
3121 for {
3122 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3123 if v_0.Op != OpConst16 {
3124 continue
3125 }
3126 m := auxIntToInt16(v_0.AuxInt)
3127 if v_1.Op != OpRsh16Ux64 {
3128 continue
3129 }
3130 _ = v_1.Args[1]
3131 v_1_1 := v_1.Args[1]
3132 if v_1_1.Op != OpConst64 {
3133 continue
3134 }
3135 c := auxIntToInt64(v_1_1.AuxInt)
3136 if !(c >= int64(16-ntz16(m))) {
3137 continue
3138 }
3139 v.reset(OpConst16)
3140 v.AuxInt = int16ToAuxInt(0)
3141 return true
3142 }
3143 break
3144 }
3145
3146
3147
3148 for {
3149 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3150 if v_0.Op != OpConst16 {
3151 continue
3152 }
3153 m := auxIntToInt16(v_0.AuxInt)
3154 if v_1.Op != OpLsh16x64 {
3155 continue
3156 }
3157 _ = v_1.Args[1]
3158 v_1_1 := v_1.Args[1]
3159 if v_1_1.Op != OpConst64 {
3160 continue
3161 }
3162 c := auxIntToInt64(v_1_1.AuxInt)
3163 if !(c >= int64(16-nlz16(m))) {
3164 continue
3165 }
3166 v.reset(OpConst16)
3167 v.AuxInt = int16ToAuxInt(0)
3168 return true
3169 }
3170 break
3171 }
3172
3173
3174 for {
3175 x := v_0
3176 if x != v_1 {
3177 break
3178 }
3179 v.copyOf(x)
3180 return true
3181 }
3182
3183
3184 for {
3185 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3186 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
3187 continue
3188 }
3189 x := v_1
3190 v.copyOf(x)
3191 return true
3192 }
3193 break
3194 }
3195
3196
3197 for {
3198 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3199 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
3200 continue
3201 }
3202 v.reset(OpConst16)
3203 v.AuxInt = int16ToAuxInt(0)
3204 return true
3205 }
3206 break
3207 }
3208
3209
3210 for {
3211 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3212 if v_0.Op != OpCom16 {
3213 continue
3214 }
3215 x := v_0.Args[0]
3216 if x != v_1 {
3217 continue
3218 }
3219 v.reset(OpConst16)
3220 v.AuxInt = int16ToAuxInt(0)
3221 return true
3222 }
3223 break
3224 }
3225
3226
3227 for {
3228 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3229 x := v_0
3230 if v_1.Op != OpAnd16 {
3231 continue
3232 }
3233 _ = v_1.Args[1]
3234 v_1_0 := v_1.Args[0]
3235 v_1_1 := v_1.Args[1]
3236 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3237 if x != v_1_0 {
3238 continue
3239 }
3240 y := v_1_1
3241 v.reset(OpAnd16)
3242 v.AddArg2(x, y)
3243 return true
3244 }
3245 }
3246 break
3247 }
3248
3249
3250
3251 for {
3252 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3253 if v_0.Op != OpAnd16 {
3254 continue
3255 }
3256 _ = v_0.Args[1]
3257 v_0_0 := v_0.Args[0]
3258 v_0_1 := v_0.Args[1]
3259 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3260 i := v_0_0
3261 if i.Op != OpConst16 {
3262 continue
3263 }
3264 t := i.Type
3265 z := v_0_1
3266 x := v_1
3267 if !(z.Op != OpConst16 && x.Op != OpConst16) {
3268 continue
3269 }
3270 v.reset(OpAnd16)
3271 v0 := b.NewValue0(v.Pos, OpAnd16, t)
3272 v0.AddArg2(z, x)
3273 v.AddArg2(i, v0)
3274 return true
3275 }
3276 }
3277 break
3278 }
3279
3280
3281 for {
3282 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3283 if v_0.Op != OpConst16 {
3284 continue
3285 }
3286 t := v_0.Type
3287 c := auxIntToInt16(v_0.AuxInt)
3288 if v_1.Op != OpAnd16 {
3289 continue
3290 }
3291 _ = v_1.Args[1]
3292 v_1_0 := v_1.Args[0]
3293 v_1_1 := v_1.Args[1]
3294 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3295 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
3296 continue
3297 }
3298 d := auxIntToInt16(v_1_0.AuxInt)
3299 x := v_1_1
3300 v.reset(OpAnd16)
3301 v0 := b.NewValue0(v.Pos, OpConst16, t)
3302 v0.AuxInt = int16ToAuxInt(c & d)
3303 v.AddArg2(v0, x)
3304 return true
3305 }
3306 }
3307 break
3308 }
3309 return false
3310 }
3311 func rewriteValuegeneric_OpAnd32(v *Value) bool {
3312 v_1 := v.Args[1]
3313 v_0 := v.Args[0]
3314 b := v.Block
3315
3316
3317 for {
3318 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3319 if v_0.Op != OpConst32 {
3320 continue
3321 }
3322 c := auxIntToInt32(v_0.AuxInt)
3323 if v_1.Op != OpConst32 {
3324 continue
3325 }
3326 d := auxIntToInt32(v_1.AuxInt)
3327 v.reset(OpConst32)
3328 v.AuxInt = int32ToAuxInt(c & d)
3329 return true
3330 }
3331 break
3332 }
3333
3334
3335 for {
3336 t := v.Type
3337 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3338 if v_0.Op != OpCom32 {
3339 continue
3340 }
3341 x := v_0.Args[0]
3342 if v_1.Op != OpCom32 {
3343 continue
3344 }
3345 y := v_1.Args[0]
3346 v.reset(OpCom32)
3347 v0 := b.NewValue0(v.Pos, OpOr32, t)
3348 v0.AddArg2(x, y)
3349 v.AddArg(v0)
3350 return true
3351 }
3352 break
3353 }
3354
3355
3356
3357 for {
3358 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3359 if v_0.Op != OpConst32 {
3360 continue
3361 }
3362 m := auxIntToInt32(v_0.AuxInt)
3363 if v_1.Op != OpRsh32Ux64 {
3364 continue
3365 }
3366 _ = v_1.Args[1]
3367 v_1_1 := v_1.Args[1]
3368 if v_1_1.Op != OpConst64 {
3369 continue
3370 }
3371 c := auxIntToInt64(v_1_1.AuxInt)
3372 if !(c >= int64(32-ntz32(m))) {
3373 continue
3374 }
3375 v.reset(OpConst32)
3376 v.AuxInt = int32ToAuxInt(0)
3377 return true
3378 }
3379 break
3380 }
3381
3382
3383
3384 for {
3385 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3386 if v_0.Op != OpConst32 {
3387 continue
3388 }
3389 m := auxIntToInt32(v_0.AuxInt)
3390 if v_1.Op != OpLsh32x64 {
3391 continue
3392 }
3393 _ = v_1.Args[1]
3394 v_1_1 := v_1.Args[1]
3395 if v_1_1.Op != OpConst64 {
3396 continue
3397 }
3398 c := auxIntToInt64(v_1_1.AuxInt)
3399 if !(c >= int64(32-nlz32(m))) {
3400 continue
3401 }
3402 v.reset(OpConst32)
3403 v.AuxInt = int32ToAuxInt(0)
3404 return true
3405 }
3406 break
3407 }
3408
3409
3410 for {
3411 x := v_0
3412 if x != v_1 {
3413 break
3414 }
3415 v.copyOf(x)
3416 return true
3417 }
3418
3419
3420 for {
3421 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3422 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
3423 continue
3424 }
3425 x := v_1
3426 v.copyOf(x)
3427 return true
3428 }
3429 break
3430 }
3431
3432
3433 for {
3434 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3435 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
3436 continue
3437 }
3438 v.reset(OpConst32)
3439 v.AuxInt = int32ToAuxInt(0)
3440 return true
3441 }
3442 break
3443 }
3444
3445
3446 for {
3447 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3448 if v_0.Op != OpCom32 {
3449 continue
3450 }
3451 x := v_0.Args[0]
3452 if x != v_1 {
3453 continue
3454 }
3455 v.reset(OpConst32)
3456 v.AuxInt = int32ToAuxInt(0)
3457 return true
3458 }
3459 break
3460 }
3461
3462
3463 for {
3464 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3465 x := v_0
3466 if v_1.Op != OpAnd32 {
3467 continue
3468 }
3469 _ = v_1.Args[1]
3470 v_1_0 := v_1.Args[0]
3471 v_1_1 := v_1.Args[1]
3472 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3473 if x != v_1_0 {
3474 continue
3475 }
3476 y := v_1_1
3477 v.reset(OpAnd32)
3478 v.AddArg2(x, y)
3479 return true
3480 }
3481 }
3482 break
3483 }
3484
3485
3486
3487 for {
3488 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3489 if v_0.Op != OpAnd32 {
3490 continue
3491 }
3492 _ = v_0.Args[1]
3493 v_0_0 := v_0.Args[0]
3494 v_0_1 := v_0.Args[1]
3495 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3496 i := v_0_0
3497 if i.Op != OpConst32 {
3498 continue
3499 }
3500 t := i.Type
3501 z := v_0_1
3502 x := v_1
3503 if !(z.Op != OpConst32 && x.Op != OpConst32) {
3504 continue
3505 }
3506 v.reset(OpAnd32)
3507 v0 := b.NewValue0(v.Pos, OpAnd32, t)
3508 v0.AddArg2(z, x)
3509 v.AddArg2(i, v0)
3510 return true
3511 }
3512 }
3513 break
3514 }
3515
3516
3517 for {
3518 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3519 if v_0.Op != OpConst32 {
3520 continue
3521 }
3522 t := v_0.Type
3523 c := auxIntToInt32(v_0.AuxInt)
3524 if v_1.Op != OpAnd32 {
3525 continue
3526 }
3527 _ = v_1.Args[1]
3528 v_1_0 := v_1.Args[0]
3529 v_1_1 := v_1.Args[1]
3530 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3531 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
3532 continue
3533 }
3534 d := auxIntToInt32(v_1_0.AuxInt)
3535 x := v_1_1
3536 v.reset(OpAnd32)
3537 v0 := b.NewValue0(v.Pos, OpConst32, t)
3538 v0.AuxInt = int32ToAuxInt(c & d)
3539 v.AddArg2(v0, x)
3540 return true
3541 }
3542 }
3543 break
3544 }
3545 return false
3546 }
3547 func rewriteValuegeneric_OpAnd64(v *Value) bool {
3548 v_1 := v.Args[1]
3549 v_0 := v.Args[0]
3550 b := v.Block
3551
3552
3553 for {
3554 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3555 if v_0.Op != OpConst64 {
3556 continue
3557 }
3558 c := auxIntToInt64(v_0.AuxInt)
3559 if v_1.Op != OpConst64 {
3560 continue
3561 }
3562 d := auxIntToInt64(v_1.AuxInt)
3563 v.reset(OpConst64)
3564 v.AuxInt = int64ToAuxInt(c & d)
3565 return true
3566 }
3567 break
3568 }
3569
3570
3571 for {
3572 t := v.Type
3573 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3574 if v_0.Op != OpCom64 {
3575 continue
3576 }
3577 x := v_0.Args[0]
3578 if v_1.Op != OpCom64 {
3579 continue
3580 }
3581 y := v_1.Args[0]
3582 v.reset(OpCom64)
3583 v0 := b.NewValue0(v.Pos, OpOr64, t)
3584 v0.AddArg2(x, y)
3585 v.AddArg(v0)
3586 return true
3587 }
3588 break
3589 }
3590
3591
3592
3593 for {
3594 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3595 if v_0.Op != OpConst64 {
3596 continue
3597 }
3598 m := auxIntToInt64(v_0.AuxInt)
3599 if v_1.Op != OpRsh64Ux64 {
3600 continue
3601 }
3602 _ = v_1.Args[1]
3603 v_1_1 := v_1.Args[1]
3604 if v_1_1.Op != OpConst64 {
3605 continue
3606 }
3607 c := auxIntToInt64(v_1_1.AuxInt)
3608 if !(c >= int64(64-ntz64(m))) {
3609 continue
3610 }
3611 v.reset(OpConst64)
3612 v.AuxInt = int64ToAuxInt(0)
3613 return true
3614 }
3615 break
3616 }
3617
3618
3619
3620 for {
3621 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3622 if v_0.Op != OpConst64 {
3623 continue
3624 }
3625 m := auxIntToInt64(v_0.AuxInt)
3626 if v_1.Op != OpLsh64x64 {
3627 continue
3628 }
3629 _ = v_1.Args[1]
3630 v_1_1 := v_1.Args[1]
3631 if v_1_1.Op != OpConst64 {
3632 continue
3633 }
3634 c := auxIntToInt64(v_1_1.AuxInt)
3635 if !(c >= int64(64-nlz64(m))) {
3636 continue
3637 }
3638 v.reset(OpConst64)
3639 v.AuxInt = int64ToAuxInt(0)
3640 return true
3641 }
3642 break
3643 }
3644
3645
3646 for {
3647 x := v_0
3648 if x != v_1 {
3649 break
3650 }
3651 v.copyOf(x)
3652 return true
3653 }
3654
3655
3656 for {
3657 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3658 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
3659 continue
3660 }
3661 x := v_1
3662 v.copyOf(x)
3663 return true
3664 }
3665 break
3666 }
3667
3668
3669 for {
3670 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3671 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
3672 continue
3673 }
3674 v.reset(OpConst64)
3675 v.AuxInt = int64ToAuxInt(0)
3676 return true
3677 }
3678 break
3679 }
3680
3681
3682 for {
3683 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3684 if v_0.Op != OpCom64 {
3685 continue
3686 }
3687 x := v_0.Args[0]
3688 if x != v_1 {
3689 continue
3690 }
3691 v.reset(OpConst64)
3692 v.AuxInt = int64ToAuxInt(0)
3693 return true
3694 }
3695 break
3696 }
3697
3698
3699 for {
3700 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3701 x := v_0
3702 if v_1.Op != OpAnd64 {
3703 continue
3704 }
3705 _ = v_1.Args[1]
3706 v_1_0 := v_1.Args[0]
3707 v_1_1 := v_1.Args[1]
3708 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3709 if x != v_1_0 {
3710 continue
3711 }
3712 y := v_1_1
3713 v.reset(OpAnd64)
3714 v.AddArg2(x, y)
3715 return true
3716 }
3717 }
3718 break
3719 }
3720
3721
3722
3723 for {
3724 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3725 if v_0.Op != OpAnd64 {
3726 continue
3727 }
3728 _ = v_0.Args[1]
3729 v_0_0 := v_0.Args[0]
3730 v_0_1 := v_0.Args[1]
3731 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3732 i := v_0_0
3733 if i.Op != OpConst64 {
3734 continue
3735 }
3736 t := i.Type
3737 z := v_0_1
3738 x := v_1
3739 if !(z.Op != OpConst64 && x.Op != OpConst64) {
3740 continue
3741 }
3742 v.reset(OpAnd64)
3743 v0 := b.NewValue0(v.Pos, OpAnd64, t)
3744 v0.AddArg2(z, x)
3745 v.AddArg2(i, v0)
3746 return true
3747 }
3748 }
3749 break
3750 }
3751
3752
3753 for {
3754 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3755 if v_0.Op != OpConst64 {
3756 continue
3757 }
3758 t := v_0.Type
3759 c := auxIntToInt64(v_0.AuxInt)
3760 if v_1.Op != OpAnd64 {
3761 continue
3762 }
3763 _ = v_1.Args[1]
3764 v_1_0 := v_1.Args[0]
3765 v_1_1 := v_1.Args[1]
3766 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3767 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
3768 continue
3769 }
3770 d := auxIntToInt64(v_1_0.AuxInt)
3771 x := v_1_1
3772 v.reset(OpAnd64)
3773 v0 := b.NewValue0(v.Pos, OpConst64, t)
3774 v0.AuxInt = int64ToAuxInt(c & d)
3775 v.AddArg2(v0, x)
3776 return true
3777 }
3778 }
3779 break
3780 }
3781 return false
3782 }
3783 func rewriteValuegeneric_OpAnd8(v *Value) bool {
3784 v_1 := v.Args[1]
3785 v_0 := v.Args[0]
3786 b := v.Block
3787
3788
3789 for {
3790 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3791 if v_0.Op != OpConst8 {
3792 continue
3793 }
3794 c := auxIntToInt8(v_0.AuxInt)
3795 if v_1.Op != OpConst8 {
3796 continue
3797 }
3798 d := auxIntToInt8(v_1.AuxInt)
3799 v.reset(OpConst8)
3800 v.AuxInt = int8ToAuxInt(c & d)
3801 return true
3802 }
3803 break
3804 }
3805
3806
3807 for {
3808 t := v.Type
3809 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3810 if v_0.Op != OpCom8 {
3811 continue
3812 }
3813 x := v_0.Args[0]
3814 if v_1.Op != OpCom8 {
3815 continue
3816 }
3817 y := v_1.Args[0]
3818 v.reset(OpCom8)
3819 v0 := b.NewValue0(v.Pos, OpOr8, t)
3820 v0.AddArg2(x, y)
3821 v.AddArg(v0)
3822 return true
3823 }
3824 break
3825 }
3826
3827
3828
3829 for {
3830 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3831 if v_0.Op != OpConst8 {
3832 continue
3833 }
3834 m := auxIntToInt8(v_0.AuxInt)
3835 if v_1.Op != OpRsh8Ux64 {
3836 continue
3837 }
3838 _ = v_1.Args[1]
3839 v_1_1 := v_1.Args[1]
3840 if v_1_1.Op != OpConst64 {
3841 continue
3842 }
3843 c := auxIntToInt64(v_1_1.AuxInt)
3844 if !(c >= int64(8-ntz8(m))) {
3845 continue
3846 }
3847 v.reset(OpConst8)
3848 v.AuxInt = int8ToAuxInt(0)
3849 return true
3850 }
3851 break
3852 }
3853
3854
3855
3856 for {
3857 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3858 if v_0.Op != OpConst8 {
3859 continue
3860 }
3861 m := auxIntToInt8(v_0.AuxInt)
3862 if v_1.Op != OpLsh8x64 {
3863 continue
3864 }
3865 _ = v_1.Args[1]
3866 v_1_1 := v_1.Args[1]
3867 if v_1_1.Op != OpConst64 {
3868 continue
3869 }
3870 c := auxIntToInt64(v_1_1.AuxInt)
3871 if !(c >= int64(8-nlz8(m))) {
3872 continue
3873 }
3874 v.reset(OpConst8)
3875 v.AuxInt = int8ToAuxInt(0)
3876 return true
3877 }
3878 break
3879 }
3880
3881
3882 for {
3883 x := v_0
3884 if x != v_1 {
3885 break
3886 }
3887 v.copyOf(x)
3888 return true
3889 }
3890
3891
3892 for {
3893 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3894 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
3895 continue
3896 }
3897 x := v_1
3898 v.copyOf(x)
3899 return true
3900 }
3901 break
3902 }
3903
3904
3905 for {
3906 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3907 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
3908 continue
3909 }
3910 v.reset(OpConst8)
3911 v.AuxInt = int8ToAuxInt(0)
3912 return true
3913 }
3914 break
3915 }
3916
3917
3918 for {
3919 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3920 if v_0.Op != OpCom8 {
3921 continue
3922 }
3923 x := v_0.Args[0]
3924 if x != v_1 {
3925 continue
3926 }
3927 v.reset(OpConst8)
3928 v.AuxInt = int8ToAuxInt(0)
3929 return true
3930 }
3931 break
3932 }
3933
3934
3935 for {
3936 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3937 x := v_0
3938 if v_1.Op != OpAnd8 {
3939 continue
3940 }
3941 _ = v_1.Args[1]
3942 v_1_0 := v_1.Args[0]
3943 v_1_1 := v_1.Args[1]
3944 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3945 if x != v_1_0 {
3946 continue
3947 }
3948 y := v_1_1
3949 v.reset(OpAnd8)
3950 v.AddArg2(x, y)
3951 return true
3952 }
3953 }
3954 break
3955 }
3956
3957
3958
3959 for {
3960 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3961 if v_0.Op != OpAnd8 {
3962 continue
3963 }
3964 _ = v_0.Args[1]
3965 v_0_0 := v_0.Args[0]
3966 v_0_1 := v_0.Args[1]
3967 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3968 i := v_0_0
3969 if i.Op != OpConst8 {
3970 continue
3971 }
3972 t := i.Type
3973 z := v_0_1
3974 x := v_1
3975 if !(z.Op != OpConst8 && x.Op != OpConst8) {
3976 continue
3977 }
3978 v.reset(OpAnd8)
3979 v0 := b.NewValue0(v.Pos, OpAnd8, t)
3980 v0.AddArg2(z, x)
3981 v.AddArg2(i, v0)
3982 return true
3983 }
3984 }
3985 break
3986 }
3987
3988
3989 for {
3990 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3991 if v_0.Op != OpConst8 {
3992 continue
3993 }
3994 t := v_0.Type
3995 c := auxIntToInt8(v_0.AuxInt)
3996 if v_1.Op != OpAnd8 {
3997 continue
3998 }
3999 _ = v_1.Args[1]
4000 v_1_0 := v_1.Args[0]
4001 v_1_1 := v_1.Args[1]
4002 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
4003 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
4004 continue
4005 }
4006 d := auxIntToInt8(v_1_0.AuxInt)
4007 x := v_1_1
4008 v.reset(OpAnd8)
4009 v0 := b.NewValue0(v.Pos, OpConst8, t)
4010 v0.AuxInt = int8ToAuxInt(c & d)
4011 v.AddArg2(v0, x)
4012 return true
4013 }
4014 }
4015 break
4016 }
4017 return false
4018 }
4019 func rewriteValuegeneric_OpAndB(v *Value) bool {
4020 v_1 := v.Args[1]
4021 v_0 := v.Args[0]
4022 b := v.Block
4023
4024
4025
4026 for {
4027 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4028 if v_0.Op != OpLeq64 {
4029 continue
4030 }
4031 x := v_0.Args[1]
4032 v_0_0 := v_0.Args[0]
4033 if v_0_0.Op != OpConst64 {
4034 continue
4035 }
4036 c := auxIntToInt64(v_0_0.AuxInt)
4037 if v_1.Op != OpLess64 {
4038 continue
4039 }
4040 _ = v_1.Args[1]
4041 if x != v_1.Args[0] {
4042 continue
4043 }
4044 v_1_1 := v_1.Args[1]
4045 if v_1_1.Op != OpConst64 {
4046 continue
4047 }
4048 d := auxIntToInt64(v_1_1.AuxInt)
4049 if !(d >= c) {
4050 continue
4051 }
4052 v.reset(OpLess64U)
4053 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4054 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4055 v1.AuxInt = int64ToAuxInt(c)
4056 v0.AddArg2(x, v1)
4057 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4058 v2.AuxInt = int64ToAuxInt(d - c)
4059 v.AddArg2(v0, v2)
4060 return true
4061 }
4062 break
4063 }
4064
4065
4066
4067 for {
4068 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4069 if v_0.Op != OpLeq64 {
4070 continue
4071 }
4072 x := v_0.Args[1]
4073 v_0_0 := v_0.Args[0]
4074 if v_0_0.Op != OpConst64 {
4075 continue
4076 }
4077 c := auxIntToInt64(v_0_0.AuxInt)
4078 if v_1.Op != OpLeq64 {
4079 continue
4080 }
4081 _ = v_1.Args[1]
4082 if x != v_1.Args[0] {
4083 continue
4084 }
4085 v_1_1 := v_1.Args[1]
4086 if v_1_1.Op != OpConst64 {
4087 continue
4088 }
4089 d := auxIntToInt64(v_1_1.AuxInt)
4090 if !(d >= c) {
4091 continue
4092 }
4093 v.reset(OpLeq64U)
4094 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4095 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4096 v1.AuxInt = int64ToAuxInt(c)
4097 v0.AddArg2(x, v1)
4098 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4099 v2.AuxInt = int64ToAuxInt(d - c)
4100 v.AddArg2(v0, v2)
4101 return true
4102 }
4103 break
4104 }
4105
4106
4107
4108 for {
4109 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4110 if v_0.Op != OpLeq32 {
4111 continue
4112 }
4113 x := v_0.Args[1]
4114 v_0_0 := v_0.Args[0]
4115 if v_0_0.Op != OpConst32 {
4116 continue
4117 }
4118 c := auxIntToInt32(v_0_0.AuxInt)
4119 if v_1.Op != OpLess32 {
4120 continue
4121 }
4122 _ = v_1.Args[1]
4123 if x != v_1.Args[0] {
4124 continue
4125 }
4126 v_1_1 := v_1.Args[1]
4127 if v_1_1.Op != OpConst32 {
4128 continue
4129 }
4130 d := auxIntToInt32(v_1_1.AuxInt)
4131 if !(d >= c) {
4132 continue
4133 }
4134 v.reset(OpLess32U)
4135 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4136 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4137 v1.AuxInt = int32ToAuxInt(c)
4138 v0.AddArg2(x, v1)
4139 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4140 v2.AuxInt = int32ToAuxInt(d - c)
4141 v.AddArg2(v0, v2)
4142 return true
4143 }
4144 break
4145 }
4146
4147
4148
4149 for {
4150 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4151 if v_0.Op != OpLeq32 {
4152 continue
4153 }
4154 x := v_0.Args[1]
4155 v_0_0 := v_0.Args[0]
4156 if v_0_0.Op != OpConst32 {
4157 continue
4158 }
4159 c := auxIntToInt32(v_0_0.AuxInt)
4160 if v_1.Op != OpLeq32 {
4161 continue
4162 }
4163 _ = v_1.Args[1]
4164 if x != v_1.Args[0] {
4165 continue
4166 }
4167 v_1_1 := v_1.Args[1]
4168 if v_1_1.Op != OpConst32 {
4169 continue
4170 }
4171 d := auxIntToInt32(v_1_1.AuxInt)
4172 if !(d >= c) {
4173 continue
4174 }
4175 v.reset(OpLeq32U)
4176 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4177 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4178 v1.AuxInt = int32ToAuxInt(c)
4179 v0.AddArg2(x, v1)
4180 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4181 v2.AuxInt = int32ToAuxInt(d - c)
4182 v.AddArg2(v0, v2)
4183 return true
4184 }
4185 break
4186 }
4187
4188
4189
4190 for {
4191 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4192 if v_0.Op != OpLeq16 {
4193 continue
4194 }
4195 x := v_0.Args[1]
4196 v_0_0 := v_0.Args[0]
4197 if v_0_0.Op != OpConst16 {
4198 continue
4199 }
4200 c := auxIntToInt16(v_0_0.AuxInt)
4201 if v_1.Op != OpLess16 {
4202 continue
4203 }
4204 _ = v_1.Args[1]
4205 if x != v_1.Args[0] {
4206 continue
4207 }
4208 v_1_1 := v_1.Args[1]
4209 if v_1_1.Op != OpConst16 {
4210 continue
4211 }
4212 d := auxIntToInt16(v_1_1.AuxInt)
4213 if !(d >= c) {
4214 continue
4215 }
4216 v.reset(OpLess16U)
4217 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4218 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4219 v1.AuxInt = int16ToAuxInt(c)
4220 v0.AddArg2(x, v1)
4221 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4222 v2.AuxInt = int16ToAuxInt(d - c)
4223 v.AddArg2(v0, v2)
4224 return true
4225 }
4226 break
4227 }
4228
4229
4230
4231 for {
4232 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4233 if v_0.Op != OpLeq16 {
4234 continue
4235 }
4236 x := v_0.Args[1]
4237 v_0_0 := v_0.Args[0]
4238 if v_0_0.Op != OpConst16 {
4239 continue
4240 }
4241 c := auxIntToInt16(v_0_0.AuxInt)
4242 if v_1.Op != OpLeq16 {
4243 continue
4244 }
4245 _ = v_1.Args[1]
4246 if x != v_1.Args[0] {
4247 continue
4248 }
4249 v_1_1 := v_1.Args[1]
4250 if v_1_1.Op != OpConst16 {
4251 continue
4252 }
4253 d := auxIntToInt16(v_1_1.AuxInt)
4254 if !(d >= c) {
4255 continue
4256 }
4257 v.reset(OpLeq16U)
4258 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4259 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4260 v1.AuxInt = int16ToAuxInt(c)
4261 v0.AddArg2(x, v1)
4262 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4263 v2.AuxInt = int16ToAuxInt(d - c)
4264 v.AddArg2(v0, v2)
4265 return true
4266 }
4267 break
4268 }
4269
4270
4271
4272 for {
4273 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4274 if v_0.Op != OpLeq8 {
4275 continue
4276 }
4277 x := v_0.Args[1]
4278 v_0_0 := v_0.Args[0]
4279 if v_0_0.Op != OpConst8 {
4280 continue
4281 }
4282 c := auxIntToInt8(v_0_0.AuxInt)
4283 if v_1.Op != OpLess8 {
4284 continue
4285 }
4286 _ = v_1.Args[1]
4287 if x != v_1.Args[0] {
4288 continue
4289 }
4290 v_1_1 := v_1.Args[1]
4291 if v_1_1.Op != OpConst8 {
4292 continue
4293 }
4294 d := auxIntToInt8(v_1_1.AuxInt)
4295 if !(d >= c) {
4296 continue
4297 }
4298 v.reset(OpLess8U)
4299 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4300 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4301 v1.AuxInt = int8ToAuxInt(c)
4302 v0.AddArg2(x, v1)
4303 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4304 v2.AuxInt = int8ToAuxInt(d - c)
4305 v.AddArg2(v0, v2)
4306 return true
4307 }
4308 break
4309 }
4310
4311
4312
4313 for {
4314 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4315 if v_0.Op != OpLeq8 {
4316 continue
4317 }
4318 x := v_0.Args[1]
4319 v_0_0 := v_0.Args[0]
4320 if v_0_0.Op != OpConst8 {
4321 continue
4322 }
4323 c := auxIntToInt8(v_0_0.AuxInt)
4324 if v_1.Op != OpLeq8 {
4325 continue
4326 }
4327 _ = v_1.Args[1]
4328 if x != v_1.Args[0] {
4329 continue
4330 }
4331 v_1_1 := v_1.Args[1]
4332 if v_1_1.Op != OpConst8 {
4333 continue
4334 }
4335 d := auxIntToInt8(v_1_1.AuxInt)
4336 if !(d >= c) {
4337 continue
4338 }
4339 v.reset(OpLeq8U)
4340 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4341 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4342 v1.AuxInt = int8ToAuxInt(c)
4343 v0.AddArg2(x, v1)
4344 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4345 v2.AuxInt = int8ToAuxInt(d - c)
4346 v.AddArg2(v0, v2)
4347 return true
4348 }
4349 break
4350 }
4351
4352
4353
4354 for {
4355 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4356 if v_0.Op != OpLess64 {
4357 continue
4358 }
4359 x := v_0.Args[1]
4360 v_0_0 := v_0.Args[0]
4361 if v_0_0.Op != OpConst64 {
4362 continue
4363 }
4364 c := auxIntToInt64(v_0_0.AuxInt)
4365 if v_1.Op != OpLess64 {
4366 continue
4367 }
4368 _ = v_1.Args[1]
4369 if x != v_1.Args[0] {
4370 continue
4371 }
4372 v_1_1 := v_1.Args[1]
4373 if v_1_1.Op != OpConst64 {
4374 continue
4375 }
4376 d := auxIntToInt64(v_1_1.AuxInt)
4377 if !(d >= c+1 && c+1 > c) {
4378 continue
4379 }
4380 v.reset(OpLess64U)
4381 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4382 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4383 v1.AuxInt = int64ToAuxInt(c + 1)
4384 v0.AddArg2(x, v1)
4385 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4386 v2.AuxInt = int64ToAuxInt(d - c - 1)
4387 v.AddArg2(v0, v2)
4388 return true
4389 }
4390 break
4391 }
4392
4393
4394
4395 for {
4396 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4397 if v_0.Op != OpLess64 {
4398 continue
4399 }
4400 x := v_0.Args[1]
4401 v_0_0 := v_0.Args[0]
4402 if v_0_0.Op != OpConst64 {
4403 continue
4404 }
4405 c := auxIntToInt64(v_0_0.AuxInt)
4406 if v_1.Op != OpLeq64 {
4407 continue
4408 }
4409 _ = v_1.Args[1]
4410 if x != v_1.Args[0] {
4411 continue
4412 }
4413 v_1_1 := v_1.Args[1]
4414 if v_1_1.Op != OpConst64 {
4415 continue
4416 }
4417 d := auxIntToInt64(v_1_1.AuxInt)
4418 if !(d >= c+1 && c+1 > c) {
4419 continue
4420 }
4421 v.reset(OpLeq64U)
4422 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4423 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4424 v1.AuxInt = int64ToAuxInt(c + 1)
4425 v0.AddArg2(x, v1)
4426 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4427 v2.AuxInt = int64ToAuxInt(d - c - 1)
4428 v.AddArg2(v0, v2)
4429 return true
4430 }
4431 break
4432 }
4433
4434
4435
4436 for {
4437 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4438 if v_0.Op != OpLess32 {
4439 continue
4440 }
4441 x := v_0.Args[1]
4442 v_0_0 := v_0.Args[0]
4443 if v_0_0.Op != OpConst32 {
4444 continue
4445 }
4446 c := auxIntToInt32(v_0_0.AuxInt)
4447 if v_1.Op != OpLess32 {
4448 continue
4449 }
4450 _ = v_1.Args[1]
4451 if x != v_1.Args[0] {
4452 continue
4453 }
4454 v_1_1 := v_1.Args[1]
4455 if v_1_1.Op != OpConst32 {
4456 continue
4457 }
4458 d := auxIntToInt32(v_1_1.AuxInt)
4459 if !(d >= c+1 && c+1 > c) {
4460 continue
4461 }
4462 v.reset(OpLess32U)
4463 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4464 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4465 v1.AuxInt = int32ToAuxInt(c + 1)
4466 v0.AddArg2(x, v1)
4467 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4468 v2.AuxInt = int32ToAuxInt(d - c - 1)
4469 v.AddArg2(v0, v2)
4470 return true
4471 }
4472 break
4473 }
4474
4475
4476
4477 for {
4478 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4479 if v_0.Op != OpLess32 {
4480 continue
4481 }
4482 x := v_0.Args[1]
4483 v_0_0 := v_0.Args[0]
4484 if v_0_0.Op != OpConst32 {
4485 continue
4486 }
4487 c := auxIntToInt32(v_0_0.AuxInt)
4488 if v_1.Op != OpLeq32 {
4489 continue
4490 }
4491 _ = v_1.Args[1]
4492 if x != v_1.Args[0] {
4493 continue
4494 }
4495 v_1_1 := v_1.Args[1]
4496 if v_1_1.Op != OpConst32 {
4497 continue
4498 }
4499 d := auxIntToInt32(v_1_1.AuxInt)
4500 if !(d >= c+1 && c+1 > c) {
4501 continue
4502 }
4503 v.reset(OpLeq32U)
4504 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4505 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4506 v1.AuxInt = int32ToAuxInt(c + 1)
4507 v0.AddArg2(x, v1)
4508 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4509 v2.AuxInt = int32ToAuxInt(d - c - 1)
4510 v.AddArg2(v0, v2)
4511 return true
4512 }
4513 break
4514 }
4515
4516
4517
4518 for {
4519 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4520 if v_0.Op != OpLess16 {
4521 continue
4522 }
4523 x := v_0.Args[1]
4524 v_0_0 := v_0.Args[0]
4525 if v_0_0.Op != OpConst16 {
4526 continue
4527 }
4528 c := auxIntToInt16(v_0_0.AuxInt)
4529 if v_1.Op != OpLess16 {
4530 continue
4531 }
4532 _ = v_1.Args[1]
4533 if x != v_1.Args[0] {
4534 continue
4535 }
4536 v_1_1 := v_1.Args[1]
4537 if v_1_1.Op != OpConst16 {
4538 continue
4539 }
4540 d := auxIntToInt16(v_1_1.AuxInt)
4541 if !(d >= c+1 && c+1 > c) {
4542 continue
4543 }
4544 v.reset(OpLess16U)
4545 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4546 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4547 v1.AuxInt = int16ToAuxInt(c + 1)
4548 v0.AddArg2(x, v1)
4549 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4550 v2.AuxInt = int16ToAuxInt(d - c - 1)
4551 v.AddArg2(v0, v2)
4552 return true
4553 }
4554 break
4555 }
4556
4557
4558
4559 for {
4560 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4561 if v_0.Op != OpLess16 {
4562 continue
4563 }
4564 x := v_0.Args[1]
4565 v_0_0 := v_0.Args[0]
4566 if v_0_0.Op != OpConst16 {
4567 continue
4568 }
4569 c := auxIntToInt16(v_0_0.AuxInt)
4570 if v_1.Op != OpLeq16 {
4571 continue
4572 }
4573 _ = v_1.Args[1]
4574 if x != v_1.Args[0] {
4575 continue
4576 }
4577 v_1_1 := v_1.Args[1]
4578 if v_1_1.Op != OpConst16 {
4579 continue
4580 }
4581 d := auxIntToInt16(v_1_1.AuxInt)
4582 if !(d >= c+1 && c+1 > c) {
4583 continue
4584 }
4585 v.reset(OpLeq16U)
4586 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4587 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4588 v1.AuxInt = int16ToAuxInt(c + 1)
4589 v0.AddArg2(x, v1)
4590 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4591 v2.AuxInt = int16ToAuxInt(d - c - 1)
4592 v.AddArg2(v0, v2)
4593 return true
4594 }
4595 break
4596 }
4597
4598
4599
4600 for {
4601 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4602 if v_0.Op != OpLess8 {
4603 continue
4604 }
4605 x := v_0.Args[1]
4606 v_0_0 := v_0.Args[0]
4607 if v_0_0.Op != OpConst8 {
4608 continue
4609 }
4610 c := auxIntToInt8(v_0_0.AuxInt)
4611 if v_1.Op != OpLess8 {
4612 continue
4613 }
4614 _ = v_1.Args[1]
4615 if x != v_1.Args[0] {
4616 continue
4617 }
4618 v_1_1 := v_1.Args[1]
4619 if v_1_1.Op != OpConst8 {
4620 continue
4621 }
4622 d := auxIntToInt8(v_1_1.AuxInt)
4623 if !(d >= c+1 && c+1 > c) {
4624 continue
4625 }
4626 v.reset(OpLess8U)
4627 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4628 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4629 v1.AuxInt = int8ToAuxInt(c + 1)
4630 v0.AddArg2(x, v1)
4631 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4632 v2.AuxInt = int8ToAuxInt(d - c - 1)
4633 v.AddArg2(v0, v2)
4634 return true
4635 }
4636 break
4637 }
4638
4639
4640
4641 for {
4642 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4643 if v_0.Op != OpLess8 {
4644 continue
4645 }
4646 x := v_0.Args[1]
4647 v_0_0 := v_0.Args[0]
4648 if v_0_0.Op != OpConst8 {
4649 continue
4650 }
4651 c := auxIntToInt8(v_0_0.AuxInt)
4652 if v_1.Op != OpLeq8 {
4653 continue
4654 }
4655 _ = v_1.Args[1]
4656 if x != v_1.Args[0] {
4657 continue
4658 }
4659 v_1_1 := v_1.Args[1]
4660 if v_1_1.Op != OpConst8 {
4661 continue
4662 }
4663 d := auxIntToInt8(v_1_1.AuxInt)
4664 if !(d >= c+1 && c+1 > c) {
4665 continue
4666 }
4667 v.reset(OpLeq8U)
4668 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4669 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4670 v1.AuxInt = int8ToAuxInt(c + 1)
4671 v0.AddArg2(x, v1)
4672 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4673 v2.AuxInt = int8ToAuxInt(d - c - 1)
4674 v.AddArg2(v0, v2)
4675 return true
4676 }
4677 break
4678 }
4679
4680
4681
4682 for {
4683 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4684 if v_0.Op != OpLeq64U {
4685 continue
4686 }
4687 x := v_0.Args[1]
4688 v_0_0 := v_0.Args[0]
4689 if v_0_0.Op != OpConst64 {
4690 continue
4691 }
4692 c := auxIntToInt64(v_0_0.AuxInt)
4693 if v_1.Op != OpLess64U {
4694 continue
4695 }
4696 _ = v_1.Args[1]
4697 if x != v_1.Args[0] {
4698 continue
4699 }
4700 v_1_1 := v_1.Args[1]
4701 if v_1_1.Op != OpConst64 {
4702 continue
4703 }
4704 d := auxIntToInt64(v_1_1.AuxInt)
4705 if !(uint64(d) >= uint64(c)) {
4706 continue
4707 }
4708 v.reset(OpLess64U)
4709 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4710 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4711 v1.AuxInt = int64ToAuxInt(c)
4712 v0.AddArg2(x, v1)
4713 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4714 v2.AuxInt = int64ToAuxInt(d - c)
4715 v.AddArg2(v0, v2)
4716 return true
4717 }
4718 break
4719 }
4720
4721
4722
4723 for {
4724 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4725 if v_0.Op != OpLeq64U {
4726 continue
4727 }
4728 x := v_0.Args[1]
4729 v_0_0 := v_0.Args[0]
4730 if v_0_0.Op != OpConst64 {
4731 continue
4732 }
4733 c := auxIntToInt64(v_0_0.AuxInt)
4734 if v_1.Op != OpLeq64U {
4735 continue
4736 }
4737 _ = v_1.Args[1]
4738 if x != v_1.Args[0] {
4739 continue
4740 }
4741 v_1_1 := v_1.Args[1]
4742 if v_1_1.Op != OpConst64 {
4743 continue
4744 }
4745 d := auxIntToInt64(v_1_1.AuxInt)
4746 if !(uint64(d) >= uint64(c)) {
4747 continue
4748 }
4749 v.reset(OpLeq64U)
4750 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4751 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4752 v1.AuxInt = int64ToAuxInt(c)
4753 v0.AddArg2(x, v1)
4754 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4755 v2.AuxInt = int64ToAuxInt(d - c)
4756 v.AddArg2(v0, v2)
4757 return true
4758 }
4759 break
4760 }
4761
4762
4763
4764 for {
4765 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4766 if v_0.Op != OpLeq32U {
4767 continue
4768 }
4769 x := v_0.Args[1]
4770 v_0_0 := v_0.Args[0]
4771 if v_0_0.Op != OpConst32 {
4772 continue
4773 }
4774 c := auxIntToInt32(v_0_0.AuxInt)
4775 if v_1.Op != OpLess32U {
4776 continue
4777 }
4778 _ = v_1.Args[1]
4779 if x != v_1.Args[0] {
4780 continue
4781 }
4782 v_1_1 := v_1.Args[1]
4783 if v_1_1.Op != OpConst32 {
4784 continue
4785 }
4786 d := auxIntToInt32(v_1_1.AuxInt)
4787 if !(uint32(d) >= uint32(c)) {
4788 continue
4789 }
4790 v.reset(OpLess32U)
4791 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4792 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4793 v1.AuxInt = int32ToAuxInt(c)
4794 v0.AddArg2(x, v1)
4795 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4796 v2.AuxInt = int32ToAuxInt(d - c)
4797 v.AddArg2(v0, v2)
4798 return true
4799 }
4800 break
4801 }
4802
4803
4804
4805 for {
4806 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4807 if v_0.Op != OpLeq32U {
4808 continue
4809 }
4810 x := v_0.Args[1]
4811 v_0_0 := v_0.Args[0]
4812 if v_0_0.Op != OpConst32 {
4813 continue
4814 }
4815 c := auxIntToInt32(v_0_0.AuxInt)
4816 if v_1.Op != OpLeq32U {
4817 continue
4818 }
4819 _ = v_1.Args[1]
4820 if x != v_1.Args[0] {
4821 continue
4822 }
4823 v_1_1 := v_1.Args[1]
4824 if v_1_1.Op != OpConst32 {
4825 continue
4826 }
4827 d := auxIntToInt32(v_1_1.AuxInt)
4828 if !(uint32(d) >= uint32(c)) {
4829 continue
4830 }
4831 v.reset(OpLeq32U)
4832 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4833 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4834 v1.AuxInt = int32ToAuxInt(c)
4835 v0.AddArg2(x, v1)
4836 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4837 v2.AuxInt = int32ToAuxInt(d - c)
4838 v.AddArg2(v0, v2)
4839 return true
4840 }
4841 break
4842 }
4843
4844
4845
4846 for {
4847 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4848 if v_0.Op != OpLeq16U {
4849 continue
4850 }
4851 x := v_0.Args[1]
4852 v_0_0 := v_0.Args[0]
4853 if v_0_0.Op != OpConst16 {
4854 continue
4855 }
4856 c := auxIntToInt16(v_0_0.AuxInt)
4857 if v_1.Op != OpLess16U {
4858 continue
4859 }
4860 _ = v_1.Args[1]
4861 if x != v_1.Args[0] {
4862 continue
4863 }
4864 v_1_1 := v_1.Args[1]
4865 if v_1_1.Op != OpConst16 {
4866 continue
4867 }
4868 d := auxIntToInt16(v_1_1.AuxInt)
4869 if !(uint16(d) >= uint16(c)) {
4870 continue
4871 }
4872 v.reset(OpLess16U)
4873 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4874 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4875 v1.AuxInt = int16ToAuxInt(c)
4876 v0.AddArg2(x, v1)
4877 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4878 v2.AuxInt = int16ToAuxInt(d - c)
4879 v.AddArg2(v0, v2)
4880 return true
4881 }
4882 break
4883 }
4884
4885
4886
4887 for {
4888 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4889 if v_0.Op != OpLeq16U {
4890 continue
4891 }
4892 x := v_0.Args[1]
4893 v_0_0 := v_0.Args[0]
4894 if v_0_0.Op != OpConst16 {
4895 continue
4896 }
4897 c := auxIntToInt16(v_0_0.AuxInt)
4898 if v_1.Op != OpLeq16U {
4899 continue
4900 }
4901 _ = v_1.Args[1]
4902 if x != v_1.Args[0] {
4903 continue
4904 }
4905 v_1_1 := v_1.Args[1]
4906 if v_1_1.Op != OpConst16 {
4907 continue
4908 }
4909 d := auxIntToInt16(v_1_1.AuxInt)
4910 if !(uint16(d) >= uint16(c)) {
4911 continue
4912 }
4913 v.reset(OpLeq16U)
4914 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4915 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4916 v1.AuxInt = int16ToAuxInt(c)
4917 v0.AddArg2(x, v1)
4918 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4919 v2.AuxInt = int16ToAuxInt(d - c)
4920 v.AddArg2(v0, v2)
4921 return true
4922 }
4923 break
4924 }
4925
4926
4927
4928 for {
4929 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4930 if v_0.Op != OpLeq8U {
4931 continue
4932 }
4933 x := v_0.Args[1]
4934 v_0_0 := v_0.Args[0]
4935 if v_0_0.Op != OpConst8 {
4936 continue
4937 }
4938 c := auxIntToInt8(v_0_0.AuxInt)
4939 if v_1.Op != OpLess8U {
4940 continue
4941 }
4942 _ = v_1.Args[1]
4943 if x != v_1.Args[0] {
4944 continue
4945 }
4946 v_1_1 := v_1.Args[1]
4947 if v_1_1.Op != OpConst8 {
4948 continue
4949 }
4950 d := auxIntToInt8(v_1_1.AuxInt)
4951 if !(uint8(d) >= uint8(c)) {
4952 continue
4953 }
4954 v.reset(OpLess8U)
4955 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4956 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4957 v1.AuxInt = int8ToAuxInt(c)
4958 v0.AddArg2(x, v1)
4959 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4960 v2.AuxInt = int8ToAuxInt(d - c)
4961 v.AddArg2(v0, v2)
4962 return true
4963 }
4964 break
4965 }
4966
4967
4968
4969 for {
4970 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4971 if v_0.Op != OpLeq8U {
4972 continue
4973 }
4974 x := v_0.Args[1]
4975 v_0_0 := v_0.Args[0]
4976 if v_0_0.Op != OpConst8 {
4977 continue
4978 }
4979 c := auxIntToInt8(v_0_0.AuxInt)
4980 if v_1.Op != OpLeq8U {
4981 continue
4982 }
4983 _ = v_1.Args[1]
4984 if x != v_1.Args[0] {
4985 continue
4986 }
4987 v_1_1 := v_1.Args[1]
4988 if v_1_1.Op != OpConst8 {
4989 continue
4990 }
4991 d := auxIntToInt8(v_1_1.AuxInt)
4992 if !(uint8(d) >= uint8(c)) {
4993 continue
4994 }
4995 v.reset(OpLeq8U)
4996 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4997 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4998 v1.AuxInt = int8ToAuxInt(c)
4999 v0.AddArg2(x, v1)
5000 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5001 v2.AuxInt = int8ToAuxInt(d - c)
5002 v.AddArg2(v0, v2)
5003 return true
5004 }
5005 break
5006 }
5007
5008
5009
5010 for {
5011 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5012 if v_0.Op != OpLess64U {
5013 continue
5014 }
5015 x := v_0.Args[1]
5016 v_0_0 := v_0.Args[0]
5017 if v_0_0.Op != OpConst64 {
5018 continue
5019 }
5020 c := auxIntToInt64(v_0_0.AuxInt)
5021 if v_1.Op != OpLess64U {
5022 continue
5023 }
5024 _ = v_1.Args[1]
5025 if x != v_1.Args[0] {
5026 continue
5027 }
5028 v_1_1 := v_1.Args[1]
5029 if v_1_1.Op != OpConst64 {
5030 continue
5031 }
5032 d := auxIntToInt64(v_1_1.AuxInt)
5033 if !(uint64(d) >= uint64(c+1) && uint64(c+1) > uint64(c)) {
5034 continue
5035 }
5036 v.reset(OpLess64U)
5037 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
5038 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
5039 v1.AuxInt = int64ToAuxInt(c + 1)
5040 v0.AddArg2(x, v1)
5041 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
5042 v2.AuxInt = int64ToAuxInt(d - c - 1)
5043 v.AddArg2(v0, v2)
5044 return true
5045 }
5046 break
5047 }
5048
5049
5050
5051 for {
5052 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5053 if v_0.Op != OpLess64U {
5054 continue
5055 }
5056 x := v_0.Args[1]
5057 v_0_0 := v_0.Args[0]
5058 if v_0_0.Op != OpConst64 {
5059 continue
5060 }
5061 c := auxIntToInt64(v_0_0.AuxInt)
5062 if v_1.Op != OpLeq64U {
5063 continue
5064 }
5065 _ = v_1.Args[1]
5066 if x != v_1.Args[0] {
5067 continue
5068 }
5069 v_1_1 := v_1.Args[1]
5070 if v_1_1.Op != OpConst64 {
5071 continue
5072 }
5073 d := auxIntToInt64(v_1_1.AuxInt)
5074 if !(uint64(d) >= uint64(c+1) && uint64(c+1) > uint64(c)) {
5075 continue
5076 }
5077 v.reset(OpLeq64U)
5078 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
5079 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
5080 v1.AuxInt = int64ToAuxInt(c + 1)
5081 v0.AddArg2(x, v1)
5082 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
5083 v2.AuxInt = int64ToAuxInt(d - c - 1)
5084 v.AddArg2(v0, v2)
5085 return true
5086 }
5087 break
5088 }
5089
5090
5091
5092 for {
5093 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5094 if v_0.Op != OpLess32U {
5095 continue
5096 }
5097 x := v_0.Args[1]
5098 v_0_0 := v_0.Args[0]
5099 if v_0_0.Op != OpConst32 {
5100 continue
5101 }
5102 c := auxIntToInt32(v_0_0.AuxInt)
5103 if v_1.Op != OpLess32U {
5104 continue
5105 }
5106 _ = v_1.Args[1]
5107 if x != v_1.Args[0] {
5108 continue
5109 }
5110 v_1_1 := v_1.Args[1]
5111 if v_1_1.Op != OpConst32 {
5112 continue
5113 }
5114 d := auxIntToInt32(v_1_1.AuxInt)
5115 if !(uint32(d) >= uint32(c+1) && uint32(c+1) > uint32(c)) {
5116 continue
5117 }
5118 v.reset(OpLess32U)
5119 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
5120 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
5121 v1.AuxInt = int32ToAuxInt(c + 1)
5122 v0.AddArg2(x, v1)
5123 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
5124 v2.AuxInt = int32ToAuxInt(d - c - 1)
5125 v.AddArg2(v0, v2)
5126 return true
5127 }
5128 break
5129 }
5130
5131
5132
5133 for {
5134 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5135 if v_0.Op != OpLess32U {
5136 continue
5137 }
5138 x := v_0.Args[1]
5139 v_0_0 := v_0.Args[0]
5140 if v_0_0.Op != OpConst32 {
5141 continue
5142 }
5143 c := auxIntToInt32(v_0_0.AuxInt)
5144 if v_1.Op != OpLeq32U {
5145 continue
5146 }
5147 _ = v_1.Args[1]
5148 if x != v_1.Args[0] {
5149 continue
5150 }
5151 v_1_1 := v_1.Args[1]
5152 if v_1_1.Op != OpConst32 {
5153 continue
5154 }
5155 d := auxIntToInt32(v_1_1.AuxInt)
5156 if !(uint32(d) >= uint32(c+1) && uint32(c+1) > uint32(c)) {
5157 continue
5158 }
5159 v.reset(OpLeq32U)
5160 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
5161 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
5162 v1.AuxInt = int32ToAuxInt(c + 1)
5163 v0.AddArg2(x, v1)
5164 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
5165 v2.AuxInt = int32ToAuxInt(d - c - 1)
5166 v.AddArg2(v0, v2)
5167 return true
5168 }
5169 break
5170 }
5171
5172
5173
5174 for {
5175 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5176 if v_0.Op != OpLess16U {
5177 continue
5178 }
5179 x := v_0.Args[1]
5180 v_0_0 := v_0.Args[0]
5181 if v_0_0.Op != OpConst16 {
5182 continue
5183 }
5184 c := auxIntToInt16(v_0_0.AuxInt)
5185 if v_1.Op != OpLess16U {
5186 continue
5187 }
5188 _ = v_1.Args[1]
5189 if x != v_1.Args[0] {
5190 continue
5191 }
5192 v_1_1 := v_1.Args[1]
5193 if v_1_1.Op != OpConst16 {
5194 continue
5195 }
5196 d := auxIntToInt16(v_1_1.AuxInt)
5197 if !(uint16(d) >= uint16(c+1) && uint16(c+1) > uint16(c)) {
5198 continue
5199 }
5200 v.reset(OpLess16U)
5201 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
5202 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5203 v1.AuxInt = int16ToAuxInt(c + 1)
5204 v0.AddArg2(x, v1)
5205 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
5206 v2.AuxInt = int16ToAuxInt(d - c - 1)
5207 v.AddArg2(v0, v2)
5208 return true
5209 }
5210 break
5211 }
5212
5213
5214
5215 for {
5216 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5217 if v_0.Op != OpLess16U {
5218 continue
5219 }
5220 x := v_0.Args[1]
5221 v_0_0 := v_0.Args[0]
5222 if v_0_0.Op != OpConst16 {
5223 continue
5224 }
5225 c := auxIntToInt16(v_0_0.AuxInt)
5226 if v_1.Op != OpLeq16U {
5227 continue
5228 }
5229 _ = v_1.Args[1]
5230 if x != v_1.Args[0] {
5231 continue
5232 }
5233 v_1_1 := v_1.Args[1]
5234 if v_1_1.Op != OpConst16 {
5235 continue
5236 }
5237 d := auxIntToInt16(v_1_1.AuxInt)
5238 if !(uint16(d) >= uint16(c+1) && uint16(c+1) > uint16(c)) {
5239 continue
5240 }
5241 v.reset(OpLeq16U)
5242 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
5243 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5244 v1.AuxInt = int16ToAuxInt(c + 1)
5245 v0.AddArg2(x, v1)
5246 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
5247 v2.AuxInt = int16ToAuxInt(d - c - 1)
5248 v.AddArg2(v0, v2)
5249 return true
5250 }
5251 break
5252 }
5253
5254
5255
5256 for {
5257 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5258 if v_0.Op != OpLess8U {
5259 continue
5260 }
5261 x := v_0.Args[1]
5262 v_0_0 := v_0.Args[0]
5263 if v_0_0.Op != OpConst8 {
5264 continue
5265 }
5266 c := auxIntToInt8(v_0_0.AuxInt)
5267 if v_1.Op != OpLess8U {
5268 continue
5269 }
5270 _ = v_1.Args[1]
5271 if x != v_1.Args[0] {
5272 continue
5273 }
5274 v_1_1 := v_1.Args[1]
5275 if v_1_1.Op != OpConst8 {
5276 continue
5277 }
5278 d := auxIntToInt8(v_1_1.AuxInt)
5279 if !(uint8(d) >= uint8(c+1) && uint8(c+1) > uint8(c)) {
5280 continue
5281 }
5282 v.reset(OpLess8U)
5283 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
5284 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5285 v1.AuxInt = int8ToAuxInt(c + 1)
5286 v0.AddArg2(x, v1)
5287 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5288 v2.AuxInt = int8ToAuxInt(d - c - 1)
5289 v.AddArg2(v0, v2)
5290 return true
5291 }
5292 break
5293 }
5294
5295
5296
5297 for {
5298 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5299 if v_0.Op != OpLess8U {
5300 continue
5301 }
5302 x := v_0.Args[1]
5303 v_0_0 := v_0.Args[0]
5304 if v_0_0.Op != OpConst8 {
5305 continue
5306 }
5307 c := auxIntToInt8(v_0_0.AuxInt)
5308 if v_1.Op != OpLeq8U {
5309 continue
5310 }
5311 _ = v_1.Args[1]
5312 if x != v_1.Args[0] {
5313 continue
5314 }
5315 v_1_1 := v_1.Args[1]
5316 if v_1_1.Op != OpConst8 {
5317 continue
5318 }
5319 d := auxIntToInt8(v_1_1.AuxInt)
5320 if !(uint8(d) >= uint8(c+1) && uint8(c+1) > uint8(c)) {
5321 continue
5322 }
5323 v.reset(OpLeq8U)
5324 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
5325 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5326 v1.AuxInt = int8ToAuxInt(c + 1)
5327 v0.AddArg2(x, v1)
5328 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5329 v2.AuxInt = int8ToAuxInt(d - c - 1)
5330 v.AddArg2(v0, v2)
5331 return true
5332 }
5333 break
5334 }
5335 return false
5336 }
5337 func rewriteValuegeneric_OpArraySelect(v *Value) bool {
5338 v_0 := v.Args[0]
5339
5340
5341 for {
5342 if v_0.Op != OpArrayMake1 {
5343 break
5344 }
5345 x := v_0.Args[0]
5346 v.copyOf(x)
5347 return true
5348 }
5349
5350
5351 for {
5352 if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpIData {
5353 break
5354 }
5355 x := v_0.Args[0]
5356 v.reset(OpIData)
5357 v.AddArg(x)
5358 return true
5359 }
5360 return false
5361 }
5362 func rewriteValuegeneric_OpBitLen16(v *Value) bool {
5363 v_0 := v.Args[0]
5364 b := v.Block
5365 config := b.Func.Config
5366
5367
5368
5369 for {
5370 if v_0.Op != OpConst16 {
5371 break
5372 }
5373 c := auxIntToInt16(v_0.AuxInt)
5374 if !(config.PtrSize == 8) {
5375 break
5376 }
5377 v.reset(OpConst64)
5378 v.AuxInt = int64ToAuxInt(int64(bits.Len16(uint16(c))))
5379 return true
5380 }
5381
5382
5383
5384 for {
5385 if v_0.Op != OpConst16 {
5386 break
5387 }
5388 c := auxIntToInt16(v_0.AuxInt)
5389 if !(config.PtrSize == 4) {
5390 break
5391 }
5392 v.reset(OpConst32)
5393 v.AuxInt = int32ToAuxInt(int32(bits.Len16(uint16(c))))
5394 return true
5395 }
5396 return false
5397 }
5398 func rewriteValuegeneric_OpBitLen32(v *Value) bool {
5399 v_0 := v.Args[0]
5400 b := v.Block
5401 config := b.Func.Config
5402
5403
5404
5405 for {
5406 if v_0.Op != OpConst32 {
5407 break
5408 }
5409 c := auxIntToInt32(v_0.AuxInt)
5410 if !(config.PtrSize == 8) {
5411 break
5412 }
5413 v.reset(OpConst64)
5414 v.AuxInt = int64ToAuxInt(int64(bits.Len32(uint32(c))))
5415 return true
5416 }
5417
5418
5419
5420 for {
5421 if v_0.Op != OpConst32 {
5422 break
5423 }
5424 c := auxIntToInt32(v_0.AuxInt)
5425 if !(config.PtrSize == 4) {
5426 break
5427 }
5428 v.reset(OpConst32)
5429 v.AuxInt = int32ToAuxInt(int32(bits.Len32(uint32(c))))
5430 return true
5431 }
5432 return false
5433 }
5434 func rewriteValuegeneric_OpBitLen64(v *Value) bool {
5435 v_0 := v.Args[0]
5436 b := v.Block
5437 config := b.Func.Config
5438
5439
5440
5441 for {
5442 if v_0.Op != OpConst64 {
5443 break
5444 }
5445 c := auxIntToInt64(v_0.AuxInt)
5446 if !(config.PtrSize == 8) {
5447 break
5448 }
5449 v.reset(OpConst64)
5450 v.AuxInt = int64ToAuxInt(int64(bits.Len64(uint64(c))))
5451 return true
5452 }
5453
5454
5455
5456 for {
5457 if v_0.Op != OpConst64 {
5458 break
5459 }
5460 c := auxIntToInt64(v_0.AuxInt)
5461 if !(config.PtrSize == 4) {
5462 break
5463 }
5464 v.reset(OpConst32)
5465 v.AuxInt = int32ToAuxInt(int32(bits.Len64(uint64(c))))
5466 return true
5467 }
5468 return false
5469 }
5470 func rewriteValuegeneric_OpBitLen8(v *Value) bool {
5471 v_0 := v.Args[0]
5472 b := v.Block
5473 config := b.Func.Config
5474
5475
5476
5477 for {
5478 if v_0.Op != OpConst8 {
5479 break
5480 }
5481 c := auxIntToInt8(v_0.AuxInt)
5482 if !(config.PtrSize == 8) {
5483 break
5484 }
5485 v.reset(OpConst64)
5486 v.AuxInt = int64ToAuxInt(int64(bits.Len8(uint8(c))))
5487 return true
5488 }
5489
5490
5491
5492 for {
5493 if v_0.Op != OpConst8 {
5494 break
5495 }
5496 c := auxIntToInt8(v_0.AuxInt)
5497 if !(config.PtrSize == 4) {
5498 break
5499 }
5500 v.reset(OpConst32)
5501 v.AuxInt = int32ToAuxInt(int32(bits.Len8(uint8(c))))
5502 return true
5503 }
5504 return false
5505 }
5506 func rewriteValuegeneric_OpCeil(v *Value) bool {
5507 v_0 := v.Args[0]
5508
5509
5510 for {
5511 if v_0.Op != OpConst64F {
5512 break
5513 }
5514 c := auxIntToFloat64(v_0.AuxInt)
5515 v.reset(OpConst64F)
5516 v.AuxInt = float64ToAuxInt(math.Ceil(c))
5517 return true
5518 }
5519 return false
5520 }
5521 func rewriteValuegeneric_OpCom16(v *Value) bool {
5522 v_0 := v.Args[0]
5523
5524
5525 for {
5526 if v_0.Op != OpCom16 {
5527 break
5528 }
5529 x := v_0.Args[0]
5530 v.copyOf(x)
5531 return true
5532 }
5533
5534
5535 for {
5536 if v_0.Op != OpConst16 {
5537 break
5538 }
5539 c := auxIntToInt16(v_0.AuxInt)
5540 v.reset(OpConst16)
5541 v.AuxInt = int16ToAuxInt(^c)
5542 return true
5543 }
5544
5545
5546 for {
5547 if v_0.Op != OpAdd16 {
5548 break
5549 }
5550 _ = v_0.Args[1]
5551 v_0_0 := v_0.Args[0]
5552 v_0_1 := v_0.Args[1]
5553 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5554 if v_0_0.Op != OpConst16 || auxIntToInt16(v_0_0.AuxInt) != -1 {
5555 continue
5556 }
5557 x := v_0_1
5558 v.reset(OpNeg16)
5559 v.AddArg(x)
5560 return true
5561 }
5562 break
5563 }
5564 return false
5565 }
5566 func rewriteValuegeneric_OpCom32(v *Value) bool {
5567 v_0 := v.Args[0]
5568
5569
5570 for {
5571 if v_0.Op != OpCom32 {
5572 break
5573 }
5574 x := v_0.Args[0]
5575 v.copyOf(x)
5576 return true
5577 }
5578
5579
5580 for {
5581 if v_0.Op != OpConst32 {
5582 break
5583 }
5584 c := auxIntToInt32(v_0.AuxInt)
5585 v.reset(OpConst32)
5586 v.AuxInt = int32ToAuxInt(^c)
5587 return true
5588 }
5589
5590
5591 for {
5592 if v_0.Op != OpAdd32 {
5593 break
5594 }
5595 _ = v_0.Args[1]
5596 v_0_0 := v_0.Args[0]
5597 v_0_1 := v_0.Args[1]
5598 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5599 if v_0_0.Op != OpConst32 || auxIntToInt32(v_0_0.AuxInt) != -1 {
5600 continue
5601 }
5602 x := v_0_1
5603 v.reset(OpNeg32)
5604 v.AddArg(x)
5605 return true
5606 }
5607 break
5608 }
5609 return false
5610 }
5611 func rewriteValuegeneric_OpCom64(v *Value) bool {
5612 v_0 := v.Args[0]
5613
5614
5615 for {
5616 if v_0.Op != OpCom64 {
5617 break
5618 }
5619 x := v_0.Args[0]
5620 v.copyOf(x)
5621 return true
5622 }
5623
5624
5625 for {
5626 if v_0.Op != OpConst64 {
5627 break
5628 }
5629 c := auxIntToInt64(v_0.AuxInt)
5630 v.reset(OpConst64)
5631 v.AuxInt = int64ToAuxInt(^c)
5632 return true
5633 }
5634
5635
5636 for {
5637 if v_0.Op != OpAdd64 {
5638 break
5639 }
5640 _ = v_0.Args[1]
5641 v_0_0 := v_0.Args[0]
5642 v_0_1 := v_0.Args[1]
5643 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5644 if v_0_0.Op != OpConst64 || auxIntToInt64(v_0_0.AuxInt) != -1 {
5645 continue
5646 }
5647 x := v_0_1
5648 v.reset(OpNeg64)
5649 v.AddArg(x)
5650 return true
5651 }
5652 break
5653 }
5654 return false
5655 }
5656 func rewriteValuegeneric_OpCom8(v *Value) bool {
5657 v_0 := v.Args[0]
5658
5659
5660 for {
5661 if v_0.Op != OpCom8 {
5662 break
5663 }
5664 x := v_0.Args[0]
5665 v.copyOf(x)
5666 return true
5667 }
5668
5669
5670 for {
5671 if v_0.Op != OpConst8 {
5672 break
5673 }
5674 c := auxIntToInt8(v_0.AuxInt)
5675 v.reset(OpConst8)
5676 v.AuxInt = int8ToAuxInt(^c)
5677 return true
5678 }
5679
5680
5681 for {
5682 if v_0.Op != OpAdd8 {
5683 break
5684 }
5685 _ = v_0.Args[1]
5686 v_0_0 := v_0.Args[0]
5687 v_0_1 := v_0.Args[1]
5688 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5689 if v_0_0.Op != OpConst8 || auxIntToInt8(v_0_0.AuxInt) != -1 {
5690 continue
5691 }
5692 x := v_0_1
5693 v.reset(OpNeg8)
5694 v.AddArg(x)
5695 return true
5696 }
5697 break
5698 }
5699 return false
5700 }
5701 func rewriteValuegeneric_OpCondSelect(v *Value) bool {
5702 v_2 := v.Args[2]
5703 v_1 := v.Args[1]
5704 v_0 := v.Args[0]
5705 b := v.Block
5706 config := b.Func.Config
5707
5708
5709 for {
5710 x := v_0
5711 if v_2.Op != OpConstBool || auxIntToBool(v_2.AuxInt) != true {
5712 break
5713 }
5714 v.copyOf(x)
5715 return true
5716 }
5717
5718
5719 for {
5720 y := v_1
5721 if v_2.Op != OpConstBool || auxIntToBool(v_2.AuxInt) != false {
5722 break
5723 }
5724 v.copyOf(y)
5725 return true
5726 }
5727
5728
5729 for {
5730 x := v_0
5731 if x != v_1 {
5732 break
5733 }
5734 v.copyOf(x)
5735 return true
5736 }
5737
5738
5739
5740 for {
5741 if v_0.Op != OpAdd8 {
5742 break
5743 }
5744 t := v_0.Type
5745 _ = v_0.Args[1]
5746 v_0_0 := v_0.Args[0]
5747 v_0_1 := v_0.Args[1]
5748 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5749 x := v_0_0
5750 if v_0_1.Op != OpConst8 || auxIntToInt8(v_0_1.AuxInt) != 1 || x != v_1 {
5751 continue
5752 }
5753 bool := v_2
5754 if !(config.arch != "arm64") {
5755 continue
5756 }
5757 v.reset(OpAdd8)
5758 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
5759 v0.AddArg(bool)
5760 v.AddArg2(x, v0)
5761 return true
5762 }
5763 break
5764 }
5765
5766
5767
5768 for {
5769 if v_0.Op != OpAdd64 {
5770 break
5771 }
5772 t := v_0.Type
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 x := v_0_0
5778 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
5779 continue
5780 }
5781 bool := v_2
5782 if !(config.arch != "arm64") {
5783 continue
5784 }
5785 v.reset(OpAdd64)
5786 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
5787 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
5788 v1.AddArg(bool)
5789 v0.AddArg(v1)
5790 v.AddArg2(x, v0)
5791 return true
5792 }
5793 break
5794 }
5795
5796
5797
5798 for {
5799 if v_0.Op != OpAdd32 {
5800 break
5801 }
5802 t := v_0.Type
5803 _ = v_0.Args[1]
5804 v_0_0 := v_0.Args[0]
5805 v_0_1 := v_0.Args[1]
5806 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5807 x := v_0_0
5808 if v_0_1.Op != OpConst32 || auxIntToInt32(v_0_1.AuxInt) != 1 || x != v_1 {
5809 continue
5810 }
5811 bool := v_2
5812 if !(config.arch != "arm64") {
5813 continue
5814 }
5815 v.reset(OpAdd32)
5816 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
5817 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
5818 v1.AddArg(bool)
5819 v0.AddArg(v1)
5820 v.AddArg2(x, v0)
5821 return true
5822 }
5823 break
5824 }
5825
5826
5827
5828 for {
5829 if v_0.Op != OpAdd16 {
5830 break
5831 }
5832 t := v_0.Type
5833 _ = v_0.Args[1]
5834 v_0_0 := v_0.Args[0]
5835 v_0_1 := v_0.Args[1]
5836 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5837 x := v_0_0
5838 if v_0_1.Op != OpConst16 || auxIntToInt16(v_0_1.AuxInt) != 1 || x != v_1 {
5839 continue
5840 }
5841 bool := v_2
5842 if !(config.arch != "arm64") {
5843 continue
5844 }
5845 v.reset(OpAdd16)
5846 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
5847 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
5848 v1.AddArg(bool)
5849 v0.AddArg(v1)
5850 v.AddArg2(x, v0)
5851 return true
5852 }
5853 break
5854 }
5855
5856
5857 for {
5858 if v_0.Op != OpAdd8 {
5859 break
5860 }
5861 t := v_0.Type
5862 _ = v_0.Args[1]
5863 v_0_0 := v_0.Args[0]
5864 v_0_1 := v_0.Args[1]
5865 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5866 x := v_0_0
5867 if v_0_1.Op != OpConst8 || auxIntToInt8(v_0_1.AuxInt) != -1 || x != v_1 {
5868 continue
5869 }
5870 bool := v_2
5871 v.reset(OpSub8)
5872 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
5873 v0.AddArg(bool)
5874 v.AddArg2(x, v0)
5875 return true
5876 }
5877 break
5878 }
5879
5880
5881 for {
5882 if v_0.Op != OpAdd64 {
5883 break
5884 }
5885 t := v_0.Type
5886 _ = v_0.Args[1]
5887 v_0_0 := v_0.Args[0]
5888 v_0_1 := v_0.Args[1]
5889 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5890 x := v_0_0
5891 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != -1 || x != v_1 {
5892 continue
5893 }
5894 bool := v_2
5895 v.reset(OpSub64)
5896 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
5897 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
5898 v1.AddArg(bool)
5899 v0.AddArg(v1)
5900 v.AddArg2(x, v0)
5901 return true
5902 }
5903 break
5904 }
5905
5906
5907 for {
5908 if v_0.Op != OpAdd32 {
5909 break
5910 }
5911 t := v_0.Type
5912 _ = v_0.Args[1]
5913 v_0_0 := v_0.Args[0]
5914 v_0_1 := v_0.Args[1]
5915 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5916 x := v_0_0
5917 if v_0_1.Op != OpConst32 || auxIntToInt32(v_0_1.AuxInt) != -1 || x != v_1 {
5918 continue
5919 }
5920 bool := v_2
5921 v.reset(OpSub32)
5922 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
5923 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
5924 v1.AddArg(bool)
5925 v0.AddArg(v1)
5926 v.AddArg2(x, v0)
5927 return true
5928 }
5929 break
5930 }
5931
5932
5933 for {
5934 if v_0.Op != OpAdd16 {
5935 break
5936 }
5937 t := v_0.Type
5938 _ = v_0.Args[1]
5939 v_0_0 := v_0.Args[0]
5940 v_0_1 := v_0.Args[1]
5941 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5942 x := v_0_0
5943 if v_0_1.Op != OpConst16 || auxIntToInt16(v_0_1.AuxInt) != -1 || x != v_1 {
5944 continue
5945 }
5946 bool := v_2
5947 v.reset(OpSub16)
5948 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
5949 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
5950 v1.AddArg(bool)
5951 v0.AddArg(v1)
5952 v.AddArg2(x, v0)
5953 return true
5954 }
5955 break
5956 }
5957
5958
5959 for {
5960 if v_0.Op != OpLsh64x64 {
5961 break
5962 }
5963 _ = v_0.Args[1]
5964 x := v_0.Args[0]
5965 v_0_1 := v_0.Args[1]
5966 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
5967 break
5968 }
5969 bool := v_2
5970 v.reset(OpLsh64x8)
5971 v.AuxInt = boolToAuxInt(true)
5972 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
5973 v0.AddArg(bool)
5974 v.AddArg2(x, v0)
5975 return true
5976 }
5977
5978
5979 for {
5980 if v_0.Op != OpLsh32x64 {
5981 break
5982 }
5983 _ = v_0.Args[1]
5984 x := v_0.Args[0]
5985 v_0_1 := v_0.Args[1]
5986 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
5987 break
5988 }
5989 bool := v_2
5990 v.reset(OpLsh32x8)
5991 v.AuxInt = boolToAuxInt(true)
5992 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
5993 v0.AddArg(bool)
5994 v.AddArg2(x, v0)
5995 return true
5996 }
5997
5998
5999 for {
6000 if v_0.Op != OpLsh16x64 {
6001 break
6002 }
6003 _ = v_0.Args[1]
6004 x := v_0.Args[0]
6005 v_0_1 := v_0.Args[1]
6006 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6007 break
6008 }
6009 bool := v_2
6010 v.reset(OpLsh16x8)
6011 v.AuxInt = boolToAuxInt(true)
6012 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6013 v0.AddArg(bool)
6014 v.AddArg2(x, v0)
6015 return true
6016 }
6017
6018
6019 for {
6020 if v_0.Op != OpLsh8x64 {
6021 break
6022 }
6023 _ = v_0.Args[1]
6024 x := v_0.Args[0]
6025 v_0_1 := v_0.Args[1]
6026 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6027 break
6028 }
6029 bool := v_2
6030 v.reset(OpLsh8x8)
6031 v.AuxInt = boolToAuxInt(true)
6032 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6033 v0.AddArg(bool)
6034 v.AddArg2(x, v0)
6035 return true
6036 }
6037
6038
6039 for {
6040 if v_0.Op != OpRsh64x64 {
6041 break
6042 }
6043 _ = v_0.Args[1]
6044 x := v_0.Args[0]
6045 v_0_1 := v_0.Args[1]
6046 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6047 break
6048 }
6049 bool := v_2
6050 v.reset(OpRsh64x8)
6051 v.AuxInt = boolToAuxInt(true)
6052 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6053 v0.AddArg(bool)
6054 v.AddArg2(x, v0)
6055 return true
6056 }
6057
6058
6059 for {
6060 if v_0.Op != OpRsh32x64 {
6061 break
6062 }
6063 _ = v_0.Args[1]
6064 x := v_0.Args[0]
6065 v_0_1 := v_0.Args[1]
6066 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6067 break
6068 }
6069 bool := v_2
6070 v.reset(OpRsh32x8)
6071 v.AuxInt = boolToAuxInt(true)
6072 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6073 v0.AddArg(bool)
6074 v.AddArg2(x, v0)
6075 return true
6076 }
6077
6078
6079 for {
6080 if v_0.Op != OpRsh16x64 {
6081 break
6082 }
6083 _ = v_0.Args[1]
6084 x := v_0.Args[0]
6085 v_0_1 := v_0.Args[1]
6086 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6087 break
6088 }
6089 bool := v_2
6090 v.reset(OpRsh16x8)
6091 v.AuxInt = boolToAuxInt(true)
6092 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6093 v0.AddArg(bool)
6094 v.AddArg2(x, v0)
6095 return true
6096 }
6097
6098
6099 for {
6100 if v_0.Op != OpRsh8x64 {
6101 break
6102 }
6103 _ = v_0.Args[1]
6104 x := v_0.Args[0]
6105 v_0_1 := v_0.Args[1]
6106 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6107 break
6108 }
6109 bool := v_2
6110 v.reset(OpRsh8x8)
6111 v.AuxInt = boolToAuxInt(true)
6112 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6113 v0.AddArg(bool)
6114 v.AddArg2(x, v0)
6115 return true
6116 }
6117
6118
6119 for {
6120 if v_0.Op != OpRsh64Ux64 {
6121 break
6122 }
6123 _ = v_0.Args[1]
6124 x := v_0.Args[0]
6125 v_0_1 := v_0.Args[1]
6126 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6127 break
6128 }
6129 bool := v_2
6130 v.reset(OpRsh64Ux8)
6131 v.AuxInt = boolToAuxInt(true)
6132 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6133 v0.AddArg(bool)
6134 v.AddArg2(x, v0)
6135 return true
6136 }
6137
6138
6139 for {
6140 if v_0.Op != OpRsh32Ux64 {
6141 break
6142 }
6143 _ = v_0.Args[1]
6144 x := v_0.Args[0]
6145 v_0_1 := v_0.Args[1]
6146 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6147 break
6148 }
6149 bool := v_2
6150 v.reset(OpRsh32Ux8)
6151 v.AuxInt = boolToAuxInt(true)
6152 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6153 v0.AddArg(bool)
6154 v.AddArg2(x, v0)
6155 return true
6156 }
6157
6158
6159 for {
6160 if v_0.Op != OpRsh16Ux64 {
6161 break
6162 }
6163 _ = v_0.Args[1]
6164 x := v_0.Args[0]
6165 v_0_1 := v_0.Args[1]
6166 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6167 break
6168 }
6169 bool := v_2
6170 v.reset(OpRsh16Ux8)
6171 v.AuxInt = boolToAuxInt(true)
6172 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6173 v0.AddArg(bool)
6174 v.AddArg2(x, v0)
6175 return true
6176 }
6177
6178
6179 for {
6180 if v_0.Op != OpRsh8Ux64 {
6181 break
6182 }
6183 _ = v_0.Args[1]
6184 x := v_0.Args[0]
6185 v_0_1 := v_0.Args[1]
6186 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6187 break
6188 }
6189 bool := v_2
6190 v.reset(OpRsh8Ux8)
6191 v.AuxInt = boolToAuxInt(true)
6192 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6193 v0.AddArg(bool)
6194 v.AddArg2(x, v0)
6195 return true
6196 }
6197 return false
6198 }
6199 func rewriteValuegeneric_OpConstInterface(v *Value) bool {
6200 b := v.Block
6201 typ := &b.Func.Config.Types
6202
6203
6204 for {
6205 v.reset(OpIMake)
6206 v0 := b.NewValue0(v.Pos, OpConstNil, typ.Uintptr)
6207 v1 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
6208 v.AddArg2(v0, v1)
6209 return true
6210 }
6211 }
6212 func rewriteValuegeneric_OpConstSlice(v *Value) bool {
6213 b := v.Block
6214 config := b.Func.Config
6215 typ := &b.Func.Config.Types
6216
6217
6218
6219 for {
6220 if !(config.PtrSize == 4) {
6221 break
6222 }
6223 v.reset(OpSliceMake)
6224 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo())
6225 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
6226 v1.AuxInt = int32ToAuxInt(0)
6227 v.AddArg3(v0, v1, v1)
6228 return true
6229 }
6230
6231
6232
6233 for {
6234 if !(config.PtrSize == 8) {
6235 break
6236 }
6237 v.reset(OpSliceMake)
6238 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo())
6239 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
6240 v1.AuxInt = int64ToAuxInt(0)
6241 v.AddArg3(v0, v1, v1)
6242 return true
6243 }
6244 return false
6245 }
6246 func rewriteValuegeneric_OpConstString(v *Value) bool {
6247 b := v.Block
6248 config := b.Func.Config
6249 fe := b.Func.fe
6250 typ := &b.Func.Config.Types
6251
6252
6253
6254 for {
6255 str := auxToString(v.Aux)
6256 if !(config.PtrSize == 4 && str == "") {
6257 break
6258 }
6259 v.reset(OpStringMake)
6260 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
6261 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
6262 v1.AuxInt = int32ToAuxInt(0)
6263 v.AddArg2(v0, v1)
6264 return true
6265 }
6266
6267
6268
6269 for {
6270 str := auxToString(v.Aux)
6271 if !(config.PtrSize == 8 && str == "") {
6272 break
6273 }
6274 v.reset(OpStringMake)
6275 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
6276 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
6277 v1.AuxInt = int64ToAuxInt(0)
6278 v.AddArg2(v0, v1)
6279 return true
6280 }
6281
6282
6283
6284 for {
6285 str := auxToString(v.Aux)
6286 if !(config.PtrSize == 4 && str != "") {
6287 break
6288 }
6289 v.reset(OpStringMake)
6290 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr)
6291 v0.Aux = symToAux(fe.StringData(str))
6292 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
6293 v0.AddArg(v1)
6294 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int)
6295 v2.AuxInt = int32ToAuxInt(int32(len(str)))
6296 v.AddArg2(v0, v2)
6297 return true
6298 }
6299
6300
6301
6302 for {
6303 str := auxToString(v.Aux)
6304 if !(config.PtrSize == 8 && str != "") {
6305 break
6306 }
6307 v.reset(OpStringMake)
6308 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr)
6309 v0.Aux = symToAux(fe.StringData(str))
6310 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
6311 v0.AddArg(v1)
6312 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int)
6313 v2.AuxInt = int64ToAuxInt(int64(len(str)))
6314 v.AddArg2(v0, v2)
6315 return true
6316 }
6317 return false
6318 }
6319 func rewriteValuegeneric_OpConvert(v *Value) bool {
6320 v_1 := v.Args[1]
6321 v_0 := v.Args[0]
6322 b := v.Block
6323
6324
6325 for {
6326 if v_0.Op != OpAdd64 {
6327 break
6328 }
6329 _ = v_0.Args[1]
6330 v_0_0 := v_0.Args[0]
6331 v_0_1 := v_0.Args[1]
6332 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6333 if v_0_0.Op != OpConvert {
6334 continue
6335 }
6336 mem := v_0_0.Args[1]
6337 ptr := v_0_0.Args[0]
6338 off := v_0_1
6339 if mem != v_1 {
6340 continue
6341 }
6342 v.reset(OpAddPtr)
6343 v.AddArg2(ptr, off)
6344 return true
6345 }
6346 break
6347 }
6348
6349
6350 for {
6351 if v_0.Op != OpAdd32 {
6352 break
6353 }
6354 _ = v_0.Args[1]
6355 v_0_0 := v_0.Args[0]
6356 v_0_1 := v_0.Args[1]
6357 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6358 if v_0_0.Op != OpConvert {
6359 continue
6360 }
6361 mem := v_0_0.Args[1]
6362 ptr := v_0_0.Args[0]
6363 off := v_0_1
6364 if mem != v_1 {
6365 continue
6366 }
6367 v.reset(OpAddPtr)
6368 v.AddArg2(ptr, off)
6369 return true
6370 }
6371 break
6372 }
6373
6374
6375 for {
6376 if v_0.Op != OpConvert {
6377 break
6378 }
6379 mem := v_0.Args[1]
6380 ptr := v_0.Args[0]
6381 if mem != v_1 {
6382 break
6383 }
6384 v.copyOf(ptr)
6385 return true
6386 }
6387
6388
6389 for {
6390 a := v_0
6391 if a.Op != OpAdd64 {
6392 break
6393 }
6394 _ = a.Args[1]
6395 a_0 := a.Args[0]
6396 a_1 := a.Args[1]
6397 for _i0 := 0; _i0 <= 1; _i0, a_0, a_1 = _i0+1, a_1, a_0 {
6398 if a_0.Op != OpAdd64 {
6399 continue
6400 }
6401 _ = a_0.Args[1]
6402 a_0_0 := a_0.Args[0]
6403 a_0_1 := a_0.Args[1]
6404 for _i1 := 0; _i1 <= 1; _i1, a_0_0, a_0_1 = _i1+1, a_0_1, a_0_0 {
6405 if a_0_0.Op != OpConvert {
6406 continue
6407 }
6408 mem := a_0_0.Args[1]
6409 ptr := a_0_0.Args[0]
6410 off1 := a_0_1
6411 off2 := a_1
6412 if mem != v_1 {
6413 continue
6414 }
6415 v.reset(OpAddPtr)
6416 v0 := b.NewValue0(v.Pos, OpAdd64, a.Type)
6417 v0.AddArg2(off1, off2)
6418 v.AddArg2(ptr, v0)
6419 return true
6420 }
6421 }
6422 break
6423 }
6424
6425
6426 for {
6427 a := v_0
6428 if a.Op != OpAdd32 {
6429 break
6430 }
6431 _ = a.Args[1]
6432 a_0 := a.Args[0]
6433 a_1 := a.Args[1]
6434 for _i0 := 0; _i0 <= 1; _i0, a_0, a_1 = _i0+1, a_1, a_0 {
6435 if a_0.Op != OpAdd32 {
6436 continue
6437 }
6438 _ = a_0.Args[1]
6439 a_0_0 := a_0.Args[0]
6440 a_0_1 := a_0.Args[1]
6441 for _i1 := 0; _i1 <= 1; _i1, a_0_0, a_0_1 = _i1+1, a_0_1, a_0_0 {
6442 if a_0_0.Op != OpConvert {
6443 continue
6444 }
6445 mem := a_0_0.Args[1]
6446 ptr := a_0_0.Args[0]
6447 off1 := a_0_1
6448 off2 := a_1
6449 if mem != v_1 {
6450 continue
6451 }
6452 v.reset(OpAddPtr)
6453 v0 := b.NewValue0(v.Pos, OpAdd32, a.Type)
6454 v0.AddArg2(off1, off2)
6455 v.AddArg2(ptr, v0)
6456 return true
6457 }
6458 }
6459 break
6460 }
6461 return false
6462 }
6463 func rewriteValuegeneric_OpCtz16(v *Value) bool {
6464 v_0 := v.Args[0]
6465 b := v.Block
6466 config := b.Func.Config
6467
6468
6469
6470 for {
6471 if v_0.Op != OpConst16 {
6472 break
6473 }
6474 c := auxIntToInt16(v_0.AuxInt)
6475 if !(config.PtrSize == 4) {
6476 break
6477 }
6478 v.reset(OpConst32)
6479 v.AuxInt = int32ToAuxInt(int32(ntz16(c)))
6480 return true
6481 }
6482
6483
6484
6485 for {
6486 if v_0.Op != OpConst16 {
6487 break
6488 }
6489 c := auxIntToInt16(v_0.AuxInt)
6490 if !(config.PtrSize == 8) {
6491 break
6492 }
6493 v.reset(OpConst64)
6494 v.AuxInt = int64ToAuxInt(int64(ntz16(c)))
6495 return true
6496 }
6497 return false
6498 }
6499 func rewriteValuegeneric_OpCtz32(v *Value) bool {
6500 v_0 := v.Args[0]
6501 b := v.Block
6502 config := b.Func.Config
6503
6504
6505
6506 for {
6507 if v_0.Op != OpConst32 {
6508 break
6509 }
6510 c := auxIntToInt32(v_0.AuxInt)
6511 if !(config.PtrSize == 4) {
6512 break
6513 }
6514 v.reset(OpConst32)
6515 v.AuxInt = int32ToAuxInt(int32(ntz32(c)))
6516 return true
6517 }
6518
6519
6520
6521 for {
6522 if v_0.Op != OpConst32 {
6523 break
6524 }
6525 c := auxIntToInt32(v_0.AuxInt)
6526 if !(config.PtrSize == 8) {
6527 break
6528 }
6529 v.reset(OpConst64)
6530 v.AuxInt = int64ToAuxInt(int64(ntz32(c)))
6531 return true
6532 }
6533 return false
6534 }
6535 func rewriteValuegeneric_OpCtz64(v *Value) bool {
6536 v_0 := v.Args[0]
6537 b := v.Block
6538 config := b.Func.Config
6539
6540
6541
6542 for {
6543 if v_0.Op != OpConst64 {
6544 break
6545 }
6546 c := auxIntToInt64(v_0.AuxInt)
6547 if !(config.PtrSize == 4) {
6548 break
6549 }
6550 v.reset(OpConst32)
6551 v.AuxInt = int32ToAuxInt(int32(ntz64(c)))
6552 return true
6553 }
6554
6555
6556
6557 for {
6558 if v_0.Op != OpConst64 {
6559 break
6560 }
6561 c := auxIntToInt64(v_0.AuxInt)
6562 if !(config.PtrSize == 8) {
6563 break
6564 }
6565 v.reset(OpConst64)
6566 v.AuxInt = int64ToAuxInt(int64(ntz64(c)))
6567 return true
6568 }
6569 return false
6570 }
6571 func rewriteValuegeneric_OpCtz8(v *Value) bool {
6572 v_0 := v.Args[0]
6573 b := v.Block
6574 config := b.Func.Config
6575
6576
6577
6578 for {
6579 if v_0.Op != OpConst8 {
6580 break
6581 }
6582 c := auxIntToInt8(v_0.AuxInt)
6583 if !(config.PtrSize == 4) {
6584 break
6585 }
6586 v.reset(OpConst32)
6587 v.AuxInt = int32ToAuxInt(int32(ntz8(c)))
6588 return true
6589 }
6590
6591
6592
6593 for {
6594 if v_0.Op != OpConst8 {
6595 break
6596 }
6597 c := auxIntToInt8(v_0.AuxInt)
6598 if !(config.PtrSize == 8) {
6599 break
6600 }
6601 v.reset(OpConst64)
6602 v.AuxInt = int64ToAuxInt(int64(ntz8(c)))
6603 return true
6604 }
6605 return false
6606 }
6607 func rewriteValuegeneric_OpCvt32Fto32(v *Value) bool {
6608 v_0 := v.Args[0]
6609
6610
6611
6612 for {
6613 if v_0.Op != OpConst32F {
6614 break
6615 }
6616 c := auxIntToFloat32(v_0.AuxInt)
6617 if !(c >= -1<<31 && c < 1<<31) {
6618 break
6619 }
6620 v.reset(OpConst32)
6621 v.AuxInt = int32ToAuxInt(int32(c))
6622 return true
6623 }
6624 return false
6625 }
6626 func rewriteValuegeneric_OpCvt32Fto64(v *Value) bool {
6627 v_0 := v.Args[0]
6628
6629
6630
6631 for {
6632 if v_0.Op != OpConst32F {
6633 break
6634 }
6635 c := auxIntToFloat32(v_0.AuxInt)
6636 if !(c >= -1<<63 && c < 1<<63) {
6637 break
6638 }
6639 v.reset(OpConst64)
6640 v.AuxInt = int64ToAuxInt(int64(c))
6641 return true
6642 }
6643 return false
6644 }
6645 func rewriteValuegeneric_OpCvt32Fto64F(v *Value) bool {
6646 v_0 := v.Args[0]
6647
6648
6649 for {
6650 if v_0.Op != OpConst32F {
6651 break
6652 }
6653 c := auxIntToFloat32(v_0.AuxInt)
6654 v.reset(OpConst64F)
6655 v.AuxInt = float64ToAuxInt(float64(c))
6656 return true
6657 }
6658 return false
6659 }
6660 func rewriteValuegeneric_OpCvt32to32F(v *Value) bool {
6661 v_0 := v.Args[0]
6662
6663
6664 for {
6665 if v_0.Op != OpConst32 {
6666 break
6667 }
6668 c := auxIntToInt32(v_0.AuxInt)
6669 v.reset(OpConst32F)
6670 v.AuxInt = float32ToAuxInt(float32(c))
6671 return true
6672 }
6673 return false
6674 }
6675 func rewriteValuegeneric_OpCvt32to64F(v *Value) bool {
6676 v_0 := v.Args[0]
6677
6678
6679 for {
6680 if v_0.Op != OpConst32 {
6681 break
6682 }
6683 c := auxIntToInt32(v_0.AuxInt)
6684 v.reset(OpConst64F)
6685 v.AuxInt = float64ToAuxInt(float64(c))
6686 return true
6687 }
6688 return false
6689 }
6690 func rewriteValuegeneric_OpCvt64Fto32(v *Value) bool {
6691 v_0 := v.Args[0]
6692
6693
6694
6695 for {
6696 if v_0.Op != OpConst64F {
6697 break
6698 }
6699 c := auxIntToFloat64(v_0.AuxInt)
6700 if !(c >= -1<<31 && c < 1<<31) {
6701 break
6702 }
6703 v.reset(OpConst32)
6704 v.AuxInt = int32ToAuxInt(int32(c))
6705 return true
6706 }
6707 return false
6708 }
6709 func rewriteValuegeneric_OpCvt64Fto32F(v *Value) bool {
6710 v_0 := v.Args[0]
6711
6712
6713 for {
6714 if v_0.Op != OpConst64F {
6715 break
6716 }
6717 c := auxIntToFloat64(v_0.AuxInt)
6718 v.reset(OpConst32F)
6719 v.AuxInt = float32ToAuxInt(float32(c))
6720 return true
6721 }
6722
6723
6724
6725 for {
6726 sqrt0 := v_0
6727 if sqrt0.Op != OpSqrt {
6728 break
6729 }
6730 sqrt0_0 := sqrt0.Args[0]
6731 if sqrt0_0.Op != OpCvt32Fto64F {
6732 break
6733 }
6734 x := sqrt0_0.Args[0]
6735 if !(sqrt0.Uses == 1) {
6736 break
6737 }
6738 v.reset(OpSqrt32)
6739 v.AddArg(x)
6740 return true
6741 }
6742 return false
6743 }
6744 func rewriteValuegeneric_OpCvt64Fto64(v *Value) bool {
6745 v_0 := v.Args[0]
6746
6747
6748
6749 for {
6750 if v_0.Op != OpConst64F {
6751 break
6752 }
6753 c := auxIntToFloat64(v_0.AuxInt)
6754 if !(c >= -1<<63 && c < 1<<63) {
6755 break
6756 }
6757 v.reset(OpConst64)
6758 v.AuxInt = int64ToAuxInt(int64(c))
6759 return true
6760 }
6761 return false
6762 }
6763 func rewriteValuegeneric_OpCvt64to32F(v *Value) bool {
6764 v_0 := v.Args[0]
6765
6766
6767 for {
6768 if v_0.Op != OpConst64 {
6769 break
6770 }
6771 c := auxIntToInt64(v_0.AuxInt)
6772 v.reset(OpConst32F)
6773 v.AuxInt = float32ToAuxInt(float32(c))
6774 return true
6775 }
6776 return false
6777 }
6778 func rewriteValuegeneric_OpCvt64to64F(v *Value) bool {
6779 v_0 := v.Args[0]
6780
6781
6782 for {
6783 if v_0.Op != OpConst64 {
6784 break
6785 }
6786 c := auxIntToInt64(v_0.AuxInt)
6787 v.reset(OpConst64F)
6788 v.AuxInt = float64ToAuxInt(float64(c))
6789 return true
6790 }
6791 return false
6792 }
6793 func rewriteValuegeneric_OpCvtBoolToUint8(v *Value) bool {
6794 v_0 := v.Args[0]
6795
6796
6797 for {
6798 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
6799 break
6800 }
6801 v.reset(OpConst8)
6802 v.AuxInt = int8ToAuxInt(0)
6803 return true
6804 }
6805
6806
6807 for {
6808 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
6809 break
6810 }
6811 v.reset(OpConst8)
6812 v.AuxInt = int8ToAuxInt(1)
6813 return true
6814 }
6815 return false
6816 }
6817 func rewriteValuegeneric_OpDiv128u(v *Value) bool {
6818 v_2 := v.Args[2]
6819 v_1 := v.Args[1]
6820 v_0 := v.Args[0]
6821 b := v.Block
6822
6823
6824 for {
6825 t := v.Type
6826 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
6827 break
6828 }
6829 lo := v_1
6830 y := v_2
6831 v.reset(OpMakeTuple)
6832 v0 := b.NewValue0(v.Pos, OpDiv64u, t.FieldType(0))
6833 v0.AddArg2(lo, y)
6834 v1 := b.NewValue0(v.Pos, OpMod64u, t.FieldType(1))
6835 v1.AddArg2(lo, y)
6836 v.AddArg2(v0, v1)
6837 return true
6838 }
6839 return false
6840 }
6841 func rewriteValuegeneric_OpDiv16(v *Value) bool {
6842 v_1 := v.Args[1]
6843 v_0 := v.Args[0]
6844 b := v.Block
6845 typ := &b.Func.Config.Types
6846
6847
6848
6849 for {
6850 if v_0.Op != OpConst16 {
6851 break
6852 }
6853 c := auxIntToInt16(v_0.AuxInt)
6854 if v_1.Op != OpConst16 {
6855 break
6856 }
6857 d := auxIntToInt16(v_1.AuxInt)
6858 if !(d != 0) {
6859 break
6860 }
6861 v.reset(OpConst16)
6862 v.AuxInt = int16ToAuxInt(c / d)
6863 return true
6864 }
6865
6866
6867
6868 for {
6869 t := v.Type
6870 n := v_0
6871 if v_1.Op != OpConst16 {
6872 break
6873 }
6874 c := auxIntToInt16(v_1.AuxInt)
6875 if !(c < 0 && c != -1<<15) {
6876 break
6877 }
6878 v.reset(OpNeg16)
6879 v0 := b.NewValue0(v.Pos, OpDiv16, t)
6880 v1 := b.NewValue0(v.Pos, OpConst16, t)
6881 v1.AuxInt = int16ToAuxInt(-c)
6882 v0.AddArg2(n, v1)
6883 v.AddArg(v0)
6884 return true
6885 }
6886
6887
6888 for {
6889 t := v.Type
6890 x := v_0
6891 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != -1<<15 {
6892 break
6893 }
6894 v.reset(OpRsh16Ux64)
6895 v0 := b.NewValue0(v.Pos, OpAnd16, t)
6896 v1 := b.NewValue0(v.Pos, OpNeg16, t)
6897 v1.AddArg(x)
6898 v0.AddArg2(x, v1)
6899 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6900 v2.AuxInt = int64ToAuxInt(15)
6901 v.AddArg2(v0, v2)
6902 return true
6903 }
6904 return false
6905 }
6906 func rewriteValuegeneric_OpDiv16u(v *Value) bool {
6907 v_1 := v.Args[1]
6908 v_0 := v.Args[0]
6909 b := v.Block
6910 typ := &b.Func.Config.Types
6911
6912
6913
6914 for {
6915 if v_0.Op != OpConst16 {
6916 break
6917 }
6918 c := auxIntToInt16(v_0.AuxInt)
6919 if v_1.Op != OpConst16 {
6920 break
6921 }
6922 d := auxIntToInt16(v_1.AuxInt)
6923 if !(d != 0) {
6924 break
6925 }
6926 v.reset(OpConst16)
6927 v.AuxInt = int16ToAuxInt(int16(uint16(c) / uint16(d)))
6928 return true
6929 }
6930
6931
6932
6933 for {
6934 n := v_0
6935 if v_1.Op != OpConst16 {
6936 break
6937 }
6938 c := auxIntToInt16(v_1.AuxInt)
6939 if !(isUnsignedPowerOfTwo(uint16(c))) {
6940 break
6941 }
6942 v.reset(OpRsh16Ux64)
6943 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
6944 v0.AuxInt = int64ToAuxInt(log16u(uint16(c)))
6945 v.AddArg2(n, v0)
6946 return true
6947 }
6948 return false
6949 }
6950 func rewriteValuegeneric_OpDiv32(v *Value) bool {
6951 v_1 := v.Args[1]
6952 v_0 := v.Args[0]
6953 b := v.Block
6954 typ := &b.Func.Config.Types
6955
6956
6957
6958 for {
6959 if v_0.Op != OpConst32 {
6960 break
6961 }
6962 c := auxIntToInt32(v_0.AuxInt)
6963 if v_1.Op != OpConst32 {
6964 break
6965 }
6966 d := auxIntToInt32(v_1.AuxInt)
6967 if !(d != 0) {
6968 break
6969 }
6970 v.reset(OpConst32)
6971 v.AuxInt = int32ToAuxInt(c / d)
6972 return true
6973 }
6974
6975
6976
6977 for {
6978 t := v.Type
6979 n := v_0
6980 if v_1.Op != OpConst32 {
6981 break
6982 }
6983 c := auxIntToInt32(v_1.AuxInt)
6984 if !(c < 0 && c != -1<<31) {
6985 break
6986 }
6987 v.reset(OpNeg32)
6988 v0 := b.NewValue0(v.Pos, OpDiv32, t)
6989 v1 := b.NewValue0(v.Pos, OpConst32, t)
6990 v1.AuxInt = int32ToAuxInt(-c)
6991 v0.AddArg2(n, v1)
6992 v.AddArg(v0)
6993 return true
6994 }
6995
6996
6997 for {
6998 t := v.Type
6999 x := v_0
7000 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != -1<<31 {
7001 break
7002 }
7003 v.reset(OpRsh32Ux64)
7004 v0 := b.NewValue0(v.Pos, OpAnd32, t)
7005 v1 := b.NewValue0(v.Pos, OpNeg32, t)
7006 v1.AddArg(x)
7007 v0.AddArg2(x, v1)
7008 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7009 v2.AuxInt = int64ToAuxInt(31)
7010 v.AddArg2(v0, v2)
7011 return true
7012 }
7013 return false
7014 }
7015 func rewriteValuegeneric_OpDiv32F(v *Value) bool {
7016 v_1 := v.Args[1]
7017 v_0 := v.Args[0]
7018 b := v.Block
7019
7020
7021
7022 for {
7023 if v_0.Op != OpConst32F {
7024 break
7025 }
7026 c := auxIntToFloat32(v_0.AuxInt)
7027 if v_1.Op != OpConst32F {
7028 break
7029 }
7030 d := auxIntToFloat32(v_1.AuxInt)
7031 if !(c/d == c/d) {
7032 break
7033 }
7034 v.reset(OpConst32F)
7035 v.AuxInt = float32ToAuxInt(c / d)
7036 return true
7037 }
7038
7039
7040
7041 for {
7042 x := v_0
7043 if v_1.Op != OpConst32F {
7044 break
7045 }
7046 t := v_1.Type
7047 c := auxIntToFloat32(v_1.AuxInt)
7048 if !(reciprocalExact32(c)) {
7049 break
7050 }
7051 v.reset(OpMul32F)
7052 v0 := b.NewValue0(v.Pos, OpConst32F, t)
7053 v0.AuxInt = float32ToAuxInt(1 / c)
7054 v.AddArg2(x, v0)
7055 return true
7056 }
7057 return false
7058 }
7059 func rewriteValuegeneric_OpDiv32u(v *Value) bool {
7060 v_1 := v.Args[1]
7061 v_0 := v.Args[0]
7062 b := v.Block
7063 typ := &b.Func.Config.Types
7064
7065
7066
7067 for {
7068 if v_0.Op != OpConst32 {
7069 break
7070 }
7071 c := auxIntToInt32(v_0.AuxInt)
7072 if v_1.Op != OpConst32 {
7073 break
7074 }
7075 d := auxIntToInt32(v_1.AuxInt)
7076 if !(d != 0) {
7077 break
7078 }
7079 v.reset(OpConst32)
7080 v.AuxInt = int32ToAuxInt(int32(uint32(c) / uint32(d)))
7081 return true
7082 }
7083
7084
7085
7086 for {
7087 n := v_0
7088 if v_1.Op != OpConst32 {
7089 break
7090 }
7091 c := auxIntToInt32(v_1.AuxInt)
7092 if !(isUnsignedPowerOfTwo(uint32(c))) {
7093 break
7094 }
7095 v.reset(OpRsh32Ux64)
7096 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7097 v0.AuxInt = int64ToAuxInt(log32u(uint32(c)))
7098 v.AddArg2(n, v0)
7099 return true
7100 }
7101 return false
7102 }
7103 func rewriteValuegeneric_OpDiv64(v *Value) bool {
7104 v_1 := v.Args[1]
7105 v_0 := v.Args[0]
7106 b := v.Block
7107 typ := &b.Func.Config.Types
7108
7109
7110
7111 for {
7112 if v_0.Op != OpConst64 {
7113 break
7114 }
7115 c := auxIntToInt64(v_0.AuxInt)
7116 if v_1.Op != OpConst64 {
7117 break
7118 }
7119 d := auxIntToInt64(v_1.AuxInt)
7120 if !(d != 0) {
7121 break
7122 }
7123 v.reset(OpConst64)
7124 v.AuxInt = int64ToAuxInt(c / d)
7125 return true
7126 }
7127
7128
7129
7130 for {
7131 t := v.Type
7132 n := v_0
7133 if v_1.Op != OpConst64 {
7134 break
7135 }
7136 c := auxIntToInt64(v_1.AuxInt)
7137 if !(c < 0 && c != -1<<63) {
7138 break
7139 }
7140 v.reset(OpNeg64)
7141 v0 := b.NewValue0(v.Pos, OpDiv64, t)
7142 v1 := b.NewValue0(v.Pos, OpConst64, t)
7143 v1.AuxInt = int64ToAuxInt(-c)
7144 v0.AddArg2(n, v1)
7145 v.AddArg(v0)
7146 return true
7147 }
7148
7149
7150
7151 for {
7152 x := v_0
7153 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 || !(isNonNegative(x)) {
7154 break
7155 }
7156 v.reset(OpConst64)
7157 v.AuxInt = int64ToAuxInt(0)
7158 return true
7159 }
7160
7161
7162 for {
7163 t := v.Type
7164 x := v_0
7165 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 {
7166 break
7167 }
7168 v.reset(OpRsh64Ux64)
7169 v0 := b.NewValue0(v.Pos, OpAnd64, t)
7170 v1 := b.NewValue0(v.Pos, OpNeg64, t)
7171 v1.AddArg(x)
7172 v0.AddArg2(x, v1)
7173 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7174 v2.AuxInt = int64ToAuxInt(63)
7175 v.AddArg2(v0, v2)
7176 return true
7177 }
7178 return false
7179 }
7180 func rewriteValuegeneric_OpDiv64F(v *Value) bool {
7181 v_1 := v.Args[1]
7182 v_0 := v.Args[0]
7183 b := v.Block
7184
7185
7186
7187 for {
7188 if v_0.Op != OpConst64F {
7189 break
7190 }
7191 c := auxIntToFloat64(v_0.AuxInt)
7192 if v_1.Op != OpConst64F {
7193 break
7194 }
7195 d := auxIntToFloat64(v_1.AuxInt)
7196 if !(c/d == c/d) {
7197 break
7198 }
7199 v.reset(OpConst64F)
7200 v.AuxInt = float64ToAuxInt(c / d)
7201 return true
7202 }
7203
7204
7205
7206 for {
7207 x := v_0
7208 if v_1.Op != OpConst64F {
7209 break
7210 }
7211 t := v_1.Type
7212 c := auxIntToFloat64(v_1.AuxInt)
7213 if !(reciprocalExact64(c)) {
7214 break
7215 }
7216 v.reset(OpMul64F)
7217 v0 := b.NewValue0(v.Pos, OpConst64F, t)
7218 v0.AuxInt = float64ToAuxInt(1 / c)
7219 v.AddArg2(x, v0)
7220 return true
7221 }
7222 return false
7223 }
7224 func rewriteValuegeneric_OpDiv64u(v *Value) bool {
7225 v_1 := v.Args[1]
7226 v_0 := v.Args[0]
7227 b := v.Block
7228 typ := &b.Func.Config.Types
7229
7230
7231
7232 for {
7233 if v_0.Op != OpConst64 {
7234 break
7235 }
7236 c := auxIntToInt64(v_0.AuxInt)
7237 if v_1.Op != OpConst64 {
7238 break
7239 }
7240 d := auxIntToInt64(v_1.AuxInt)
7241 if !(d != 0) {
7242 break
7243 }
7244 v.reset(OpConst64)
7245 v.AuxInt = int64ToAuxInt(int64(uint64(c) / uint64(d)))
7246 return true
7247 }
7248
7249
7250
7251 for {
7252 n := v_0
7253 if v_1.Op != OpConst64 {
7254 break
7255 }
7256 c := auxIntToInt64(v_1.AuxInt)
7257 if !(isUnsignedPowerOfTwo(uint64(c))) {
7258 break
7259 }
7260 v.reset(OpRsh64Ux64)
7261 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7262 v0.AuxInt = int64ToAuxInt(log64u(uint64(c)))
7263 v.AddArg2(n, v0)
7264 return true
7265 }
7266 return false
7267 }
7268 func rewriteValuegeneric_OpDiv8(v *Value) bool {
7269 v_1 := v.Args[1]
7270 v_0 := v.Args[0]
7271 b := v.Block
7272 typ := &b.Func.Config.Types
7273
7274
7275
7276 for {
7277 if v_0.Op != OpConst8 {
7278 break
7279 }
7280 c := auxIntToInt8(v_0.AuxInt)
7281 if v_1.Op != OpConst8 {
7282 break
7283 }
7284 d := auxIntToInt8(v_1.AuxInt)
7285 if !(d != 0) {
7286 break
7287 }
7288 v.reset(OpConst8)
7289 v.AuxInt = int8ToAuxInt(c / d)
7290 return true
7291 }
7292
7293
7294
7295 for {
7296 t := v.Type
7297 n := v_0
7298 if v_1.Op != OpConst8 {
7299 break
7300 }
7301 c := auxIntToInt8(v_1.AuxInt)
7302 if !(c < 0 && c != -1<<7) {
7303 break
7304 }
7305 v.reset(OpNeg8)
7306 v0 := b.NewValue0(v.Pos, OpDiv8, t)
7307 v1 := b.NewValue0(v.Pos, OpConst8, t)
7308 v1.AuxInt = int8ToAuxInt(-c)
7309 v0.AddArg2(n, v1)
7310 v.AddArg(v0)
7311 return true
7312 }
7313
7314
7315 for {
7316 t := v.Type
7317 x := v_0
7318 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != -1<<7 {
7319 break
7320 }
7321 v.reset(OpRsh8Ux64)
7322 v0 := b.NewValue0(v.Pos, OpAnd8, t)
7323 v1 := b.NewValue0(v.Pos, OpNeg8, t)
7324 v1.AddArg(x)
7325 v0.AddArg2(x, v1)
7326 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7327 v2.AuxInt = int64ToAuxInt(7)
7328 v.AddArg2(v0, v2)
7329 return true
7330 }
7331 return false
7332 }
7333 func rewriteValuegeneric_OpDiv8u(v *Value) bool {
7334 v_1 := v.Args[1]
7335 v_0 := v.Args[0]
7336 b := v.Block
7337 typ := &b.Func.Config.Types
7338
7339
7340
7341 for {
7342 if v_0.Op != OpConst8 {
7343 break
7344 }
7345 c := auxIntToInt8(v_0.AuxInt)
7346 if v_1.Op != OpConst8 {
7347 break
7348 }
7349 d := auxIntToInt8(v_1.AuxInt)
7350 if !(d != 0) {
7351 break
7352 }
7353 v.reset(OpConst8)
7354 v.AuxInt = int8ToAuxInt(int8(uint8(c) / uint8(d)))
7355 return true
7356 }
7357
7358
7359
7360 for {
7361 n := v_0
7362 if v_1.Op != OpConst8 {
7363 break
7364 }
7365 c := auxIntToInt8(v_1.AuxInt)
7366 if !(isUnsignedPowerOfTwo(uint8(c))) {
7367 break
7368 }
7369 v.reset(OpRsh8Ux64)
7370 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7371 v0.AuxInt = int64ToAuxInt(log8u(uint8(c)))
7372 v.AddArg2(n, v0)
7373 return true
7374 }
7375 return false
7376 }
7377 func rewriteValuegeneric_OpEq16(v *Value) bool {
7378 v_1 := v.Args[1]
7379 v_0 := v.Args[0]
7380 b := v.Block
7381 config := b.Func.Config
7382 typ := &b.Func.Config.Types
7383
7384
7385 for {
7386 x := v_0
7387 if x != v_1 {
7388 break
7389 }
7390 v.reset(OpConstBool)
7391 v.AuxInt = boolToAuxInt(true)
7392 return true
7393 }
7394
7395
7396 for {
7397 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7398 if v_0.Op != OpConst16 {
7399 continue
7400 }
7401 t := v_0.Type
7402 c := auxIntToInt16(v_0.AuxInt)
7403 if v_1.Op != OpAdd16 {
7404 continue
7405 }
7406 _ = v_1.Args[1]
7407 v_1_0 := v_1.Args[0]
7408 v_1_1 := v_1.Args[1]
7409 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
7410 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
7411 continue
7412 }
7413 d := auxIntToInt16(v_1_0.AuxInt)
7414 x := v_1_1
7415 v.reset(OpEq16)
7416 v0 := b.NewValue0(v.Pos, OpConst16, t)
7417 v0.AuxInt = int16ToAuxInt(c - d)
7418 v.AddArg2(v0, x)
7419 return true
7420 }
7421 }
7422 break
7423 }
7424
7425
7426 for {
7427 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7428 if v_0.Op != OpConst16 {
7429 continue
7430 }
7431 c := auxIntToInt16(v_0.AuxInt)
7432 if v_1.Op != OpConst16 {
7433 continue
7434 }
7435 d := auxIntToInt16(v_1.AuxInt)
7436 v.reset(OpConstBool)
7437 v.AuxInt = boolToAuxInt(c == d)
7438 return true
7439 }
7440 break
7441 }
7442
7443
7444
7445 for {
7446 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7447 if v_0.Op != OpMod16u {
7448 continue
7449 }
7450 _ = v_0.Args[1]
7451 x := v_0.Args[0]
7452 v_0_1 := v_0.Args[1]
7453 if v_0_1.Op != OpConst16 {
7454 continue
7455 }
7456 c := auxIntToInt16(v_0_1.AuxInt)
7457 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(x.Op != OpConst16 && udivisibleOK16(c) && !hasSmallRotate(config)) {
7458 continue
7459 }
7460 v.reset(OpEq32)
7461 v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32)
7462 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
7463 v1.AddArg(x)
7464 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
7465 v2.AuxInt = int32ToAuxInt(int32(uint16(c)))
7466 v0.AddArg2(v1, v2)
7467 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
7468 v3.AuxInt = int32ToAuxInt(0)
7469 v.AddArg2(v0, v3)
7470 return true
7471 }
7472 break
7473 }
7474
7475
7476
7477 for {
7478 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7479 if v_0.Op != OpMod16 {
7480 continue
7481 }
7482 _ = v_0.Args[1]
7483 x := v_0.Args[0]
7484 v_0_1 := v_0.Args[1]
7485 if v_0_1.Op != OpConst16 {
7486 continue
7487 }
7488 c := auxIntToInt16(v_0_1.AuxInt)
7489 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(x.Op != OpConst16 && sdivisibleOK16(c) && !hasSmallRotate(config)) {
7490 continue
7491 }
7492 v.reset(OpEq32)
7493 v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32)
7494 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
7495 v1.AddArg(x)
7496 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
7497 v2.AuxInt = int32ToAuxInt(int32(c))
7498 v0.AddArg2(v1, v2)
7499 v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
7500 v3.AuxInt = int32ToAuxInt(0)
7501 v.AddArg2(v0, v3)
7502 return true
7503 }
7504 break
7505 }
7506
7507
7508
7509 for {
7510 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7511 s := v_0
7512 if s.Op != OpSub16 {
7513 continue
7514 }
7515 y := s.Args[1]
7516 x := s.Args[0]
7517 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(s.Uses == 1) {
7518 continue
7519 }
7520 v.reset(OpEq16)
7521 v.AddArg2(x, y)
7522 return true
7523 }
7524 break
7525 }
7526
7527
7528
7529 for {
7530 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7531 if v_0.Op != OpAnd16 {
7532 continue
7533 }
7534 t := v_0.Type
7535 _ = v_0.Args[1]
7536 v_0_0 := v_0.Args[0]
7537 v_0_1 := v_0.Args[1]
7538 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
7539 x := v_0_0
7540 if v_0_1.Op != OpConst16 || v_0_1.Type != t {
7541 continue
7542 }
7543 y := auxIntToInt16(v_0_1.AuxInt)
7544 if v_1.Op != OpConst16 || v_1.Type != t || auxIntToInt16(v_1.AuxInt) != y || !(oneBit(y)) {
7545 continue
7546 }
7547 v.reset(OpNeq16)
7548 v0 := b.NewValue0(v.Pos, OpAnd16, t)
7549 v1 := b.NewValue0(v.Pos, OpConst16, t)
7550 v1.AuxInt = int16ToAuxInt(y)
7551 v0.AddArg2(x, v1)
7552 v2 := b.NewValue0(v.Pos, OpConst16, t)
7553 v2.AuxInt = int16ToAuxInt(0)
7554 v.AddArg2(v0, v2)
7555 return true
7556 }
7557 }
7558 break
7559 }
7560
7561
7562 for {
7563 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7564 if v_0.Op != OpZeroExt8to16 {
7565 continue
7566 }
7567 v_0_0 := v_0.Args[0]
7568 if v_0_0.Op != OpCvtBoolToUint8 {
7569 continue
7570 }
7571 x := v_0_0.Args[0]
7572 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
7573 continue
7574 }
7575 v.copyOf(x)
7576 return true
7577 }
7578 break
7579 }
7580
7581
7582 for {
7583 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7584 if v_0.Op != OpZeroExt8to16 {
7585 continue
7586 }
7587 v_0_0 := v_0.Args[0]
7588 if v_0_0.Op != OpCvtBoolToUint8 {
7589 continue
7590 }
7591 x := v_0_0.Args[0]
7592 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
7593 continue
7594 }
7595 v.reset(OpNot)
7596 v.AddArg(x)
7597 return true
7598 }
7599 break
7600 }
7601
7602
7603 for {
7604 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7605 if v_0.Op != OpSignExt8to16 {
7606 continue
7607 }
7608 v_0_0 := v_0.Args[0]
7609 if v_0_0.Op != OpCvtBoolToUint8 {
7610 continue
7611 }
7612 x := v_0_0.Args[0]
7613 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
7614 continue
7615 }
7616 v.copyOf(x)
7617 return true
7618 }
7619 break
7620 }
7621
7622
7623 for {
7624 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7625 if v_0.Op != OpSignExt8to16 {
7626 continue
7627 }
7628 v_0_0 := v_0.Args[0]
7629 if v_0_0.Op != OpCvtBoolToUint8 {
7630 continue
7631 }
7632 x := v_0_0.Args[0]
7633 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
7634 continue
7635 }
7636 v.reset(OpNot)
7637 v.AddArg(x)
7638 return true
7639 }
7640 break
7641 }
7642 return false
7643 }
7644 func rewriteValuegeneric_OpEq32(v *Value) bool {
7645 v_1 := v.Args[1]
7646 v_0 := v.Args[0]
7647 b := v.Block
7648
7649
7650 for {
7651 x := v_0
7652 if x != v_1 {
7653 break
7654 }
7655 v.reset(OpConstBool)
7656 v.AuxInt = boolToAuxInt(true)
7657 return true
7658 }
7659
7660
7661 for {
7662 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7663 if v_0.Op != OpConst32 {
7664 continue
7665 }
7666 t := v_0.Type
7667 c := auxIntToInt32(v_0.AuxInt)
7668 if v_1.Op != OpAdd32 {
7669 continue
7670 }
7671 _ = v_1.Args[1]
7672 v_1_0 := v_1.Args[0]
7673 v_1_1 := v_1.Args[1]
7674 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
7675 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
7676 continue
7677 }
7678 d := auxIntToInt32(v_1_0.AuxInt)
7679 x := v_1_1
7680 v.reset(OpEq32)
7681 v0 := b.NewValue0(v.Pos, OpConst32, t)
7682 v0.AuxInt = int32ToAuxInt(c - d)
7683 v.AddArg2(v0, x)
7684 return true
7685 }
7686 }
7687 break
7688 }
7689
7690
7691 for {
7692 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7693 if v_0.Op != OpConst32 {
7694 continue
7695 }
7696 c := auxIntToInt32(v_0.AuxInt)
7697 if v_1.Op != OpConst32 {
7698 continue
7699 }
7700 d := auxIntToInt32(v_1.AuxInt)
7701 v.reset(OpConstBool)
7702 v.AuxInt = boolToAuxInt(c == d)
7703 return true
7704 }
7705 break
7706 }
7707
7708
7709
7710 for {
7711 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7712 s := v_0
7713 if s.Op != OpSub32 {
7714 continue
7715 }
7716 y := s.Args[1]
7717 x := s.Args[0]
7718 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 || !(s.Uses == 1) {
7719 continue
7720 }
7721 v.reset(OpEq32)
7722 v.AddArg2(x, y)
7723 return true
7724 }
7725 break
7726 }
7727
7728
7729
7730 for {
7731 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7732 if v_0.Op != OpAnd32 {
7733 continue
7734 }
7735 t := v_0.Type
7736 _ = v_0.Args[1]
7737 v_0_0 := v_0.Args[0]
7738 v_0_1 := v_0.Args[1]
7739 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
7740 x := v_0_0
7741 if v_0_1.Op != OpConst32 || v_0_1.Type != t {
7742 continue
7743 }
7744 y := auxIntToInt32(v_0_1.AuxInt)
7745 if v_1.Op != OpConst32 || v_1.Type != t || auxIntToInt32(v_1.AuxInt) != y || !(oneBit(y)) {
7746 continue
7747 }
7748 v.reset(OpNeq32)
7749 v0 := b.NewValue0(v.Pos, OpAnd32, t)
7750 v1 := b.NewValue0(v.Pos, OpConst32, t)
7751 v1.AuxInt = int32ToAuxInt(y)
7752 v0.AddArg2(x, v1)
7753 v2 := b.NewValue0(v.Pos, OpConst32, t)
7754 v2.AuxInt = int32ToAuxInt(0)
7755 v.AddArg2(v0, v2)
7756 return true
7757 }
7758 }
7759 break
7760 }
7761
7762
7763 for {
7764 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7765 if v_0.Op != OpZeroExt8to32 {
7766 continue
7767 }
7768 v_0_0 := v_0.Args[0]
7769 if v_0_0.Op != OpCvtBoolToUint8 {
7770 continue
7771 }
7772 x := v_0_0.Args[0]
7773 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
7774 continue
7775 }
7776 v.copyOf(x)
7777 return true
7778 }
7779 break
7780 }
7781
7782
7783 for {
7784 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7785 if v_0.Op != OpZeroExt8to32 {
7786 continue
7787 }
7788 v_0_0 := v_0.Args[0]
7789 if v_0_0.Op != OpCvtBoolToUint8 {
7790 continue
7791 }
7792 x := v_0_0.Args[0]
7793 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
7794 continue
7795 }
7796 v.reset(OpNot)
7797 v.AddArg(x)
7798 return true
7799 }
7800 break
7801 }
7802
7803
7804 for {
7805 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7806 if v_0.Op != OpSignExt8to32 {
7807 continue
7808 }
7809 v_0_0 := v_0.Args[0]
7810 if v_0_0.Op != OpCvtBoolToUint8 {
7811 continue
7812 }
7813 x := v_0_0.Args[0]
7814 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
7815 continue
7816 }
7817 v.copyOf(x)
7818 return true
7819 }
7820 break
7821 }
7822
7823
7824 for {
7825 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7826 if v_0.Op != OpSignExt8to32 {
7827 continue
7828 }
7829 v_0_0 := v_0.Args[0]
7830 if v_0_0.Op != OpCvtBoolToUint8 {
7831 continue
7832 }
7833 x := v_0_0.Args[0]
7834 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
7835 continue
7836 }
7837 v.reset(OpNot)
7838 v.AddArg(x)
7839 return true
7840 }
7841 break
7842 }
7843 return false
7844 }
7845 func rewriteValuegeneric_OpEq32F(v *Value) bool {
7846 v_1 := v.Args[1]
7847 v_0 := v.Args[0]
7848
7849
7850 for {
7851 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7852 if v_0.Op != OpConst32F {
7853 continue
7854 }
7855 c := auxIntToFloat32(v_0.AuxInt)
7856 if v_1.Op != OpConst32F {
7857 continue
7858 }
7859 d := auxIntToFloat32(v_1.AuxInt)
7860 v.reset(OpConstBool)
7861 v.AuxInt = boolToAuxInt(c == d)
7862 return true
7863 }
7864 break
7865 }
7866 return false
7867 }
7868 func rewriteValuegeneric_OpEq64(v *Value) bool {
7869 v_1 := v.Args[1]
7870 v_0 := v.Args[0]
7871 b := v.Block
7872
7873
7874 for {
7875 x := v_0
7876 if x != v_1 {
7877 break
7878 }
7879 v.reset(OpConstBool)
7880 v.AuxInt = boolToAuxInt(true)
7881 return true
7882 }
7883
7884
7885 for {
7886 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7887 if v_0.Op != OpConst64 {
7888 continue
7889 }
7890 t := v_0.Type
7891 c := auxIntToInt64(v_0.AuxInt)
7892 if v_1.Op != OpAdd64 {
7893 continue
7894 }
7895 _ = v_1.Args[1]
7896 v_1_0 := v_1.Args[0]
7897 v_1_1 := v_1.Args[1]
7898 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
7899 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
7900 continue
7901 }
7902 d := auxIntToInt64(v_1_0.AuxInt)
7903 x := v_1_1
7904 v.reset(OpEq64)
7905 v0 := b.NewValue0(v.Pos, OpConst64, t)
7906 v0.AuxInt = int64ToAuxInt(c - d)
7907 v.AddArg2(v0, x)
7908 return true
7909 }
7910 }
7911 break
7912 }
7913
7914
7915 for {
7916 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7917 if v_0.Op != OpConst64 {
7918 continue
7919 }
7920 c := auxIntToInt64(v_0.AuxInt)
7921 if v_1.Op != OpConst64 {
7922 continue
7923 }
7924 d := auxIntToInt64(v_1.AuxInt)
7925 v.reset(OpConstBool)
7926 v.AuxInt = boolToAuxInt(c == d)
7927 return true
7928 }
7929 break
7930 }
7931
7932
7933
7934 for {
7935 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7936 s := v_0
7937 if s.Op != OpSub64 {
7938 continue
7939 }
7940 y := s.Args[1]
7941 x := s.Args[0]
7942 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 || !(s.Uses == 1) {
7943 continue
7944 }
7945 v.reset(OpEq64)
7946 v.AddArg2(x, y)
7947 return true
7948 }
7949 break
7950 }
7951
7952
7953
7954 for {
7955 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7956 if v_0.Op != OpAnd64 {
7957 continue
7958 }
7959 t := v_0.Type
7960 _ = v_0.Args[1]
7961 v_0_0 := v_0.Args[0]
7962 v_0_1 := v_0.Args[1]
7963 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
7964 x := v_0_0
7965 if v_0_1.Op != OpConst64 || v_0_1.Type != t {
7966 continue
7967 }
7968 y := auxIntToInt64(v_0_1.AuxInt)
7969 if v_1.Op != OpConst64 || v_1.Type != t || auxIntToInt64(v_1.AuxInt) != y || !(oneBit(y)) {
7970 continue
7971 }
7972 v.reset(OpNeq64)
7973 v0 := b.NewValue0(v.Pos, OpAnd64, t)
7974 v1 := b.NewValue0(v.Pos, OpConst64, t)
7975 v1.AuxInt = int64ToAuxInt(y)
7976 v0.AddArg2(x, v1)
7977 v2 := b.NewValue0(v.Pos, OpConst64, t)
7978 v2.AuxInt = int64ToAuxInt(0)
7979 v.AddArg2(v0, v2)
7980 return true
7981 }
7982 }
7983 break
7984 }
7985
7986
7987 for {
7988 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7989 if v_0.Op != OpZeroExt8to64 {
7990 continue
7991 }
7992 v_0_0 := v_0.Args[0]
7993 if v_0_0.Op != OpCvtBoolToUint8 {
7994 continue
7995 }
7996 x := v_0_0.Args[0]
7997 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
7998 continue
7999 }
8000 v.copyOf(x)
8001 return true
8002 }
8003 break
8004 }
8005
8006
8007 for {
8008 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8009 if v_0.Op != OpZeroExt8to64 {
8010 continue
8011 }
8012 v_0_0 := v_0.Args[0]
8013 if v_0_0.Op != OpCvtBoolToUint8 {
8014 continue
8015 }
8016 x := v_0_0.Args[0]
8017 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
8018 continue
8019 }
8020 v.reset(OpNot)
8021 v.AddArg(x)
8022 return true
8023 }
8024 break
8025 }
8026
8027
8028 for {
8029 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8030 if v_0.Op != OpSignExt8to64 {
8031 continue
8032 }
8033 v_0_0 := v_0.Args[0]
8034 if v_0_0.Op != OpCvtBoolToUint8 {
8035 continue
8036 }
8037 x := v_0_0.Args[0]
8038 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
8039 continue
8040 }
8041 v.copyOf(x)
8042 return true
8043 }
8044 break
8045 }
8046
8047
8048 for {
8049 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8050 if v_0.Op != OpSignExt8to64 {
8051 continue
8052 }
8053 v_0_0 := v_0.Args[0]
8054 if v_0_0.Op != OpCvtBoolToUint8 {
8055 continue
8056 }
8057 x := v_0_0.Args[0]
8058 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
8059 continue
8060 }
8061 v.reset(OpNot)
8062 v.AddArg(x)
8063 return true
8064 }
8065 break
8066 }
8067 return false
8068 }
8069 func rewriteValuegeneric_OpEq64F(v *Value) bool {
8070 v_1 := v.Args[1]
8071 v_0 := v.Args[0]
8072
8073
8074 for {
8075 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8076 if v_0.Op != OpConst64F {
8077 continue
8078 }
8079 c := auxIntToFloat64(v_0.AuxInt)
8080 if v_1.Op != OpConst64F {
8081 continue
8082 }
8083 d := auxIntToFloat64(v_1.AuxInt)
8084 v.reset(OpConstBool)
8085 v.AuxInt = boolToAuxInt(c == d)
8086 return true
8087 }
8088 break
8089 }
8090 return false
8091 }
8092 func rewriteValuegeneric_OpEq8(v *Value) bool {
8093 v_1 := v.Args[1]
8094 v_0 := v.Args[0]
8095 b := v.Block
8096 config := b.Func.Config
8097 typ := &b.Func.Config.Types
8098
8099
8100 for {
8101 x := v_0
8102 if x != v_1 {
8103 break
8104 }
8105 v.reset(OpConstBool)
8106 v.AuxInt = boolToAuxInt(true)
8107 return true
8108 }
8109
8110
8111 for {
8112 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8113 if v_0.Op != OpConst8 {
8114 continue
8115 }
8116 t := v_0.Type
8117 c := auxIntToInt8(v_0.AuxInt)
8118 if v_1.Op != OpAdd8 {
8119 continue
8120 }
8121 _ = v_1.Args[1]
8122 v_1_0 := v_1.Args[0]
8123 v_1_1 := v_1.Args[1]
8124 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8125 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
8126 continue
8127 }
8128 d := auxIntToInt8(v_1_0.AuxInt)
8129 x := v_1_1
8130 v.reset(OpEq8)
8131 v0 := b.NewValue0(v.Pos, OpConst8, t)
8132 v0.AuxInt = int8ToAuxInt(c - d)
8133 v.AddArg2(v0, x)
8134 return true
8135 }
8136 }
8137 break
8138 }
8139
8140
8141 for {
8142 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8143 if v_0.Op != OpConst8 {
8144 continue
8145 }
8146 c := auxIntToInt8(v_0.AuxInt)
8147 if v_1.Op != OpConst8 {
8148 continue
8149 }
8150 d := auxIntToInt8(v_1.AuxInt)
8151 v.reset(OpConstBool)
8152 v.AuxInt = boolToAuxInt(c == d)
8153 return true
8154 }
8155 break
8156 }
8157
8158
8159
8160 for {
8161 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8162 if v_0.Op != OpMod8u {
8163 continue
8164 }
8165 _ = v_0.Args[1]
8166 x := v_0.Args[0]
8167 v_0_1 := v_0.Args[1]
8168 if v_0_1.Op != OpConst8 {
8169 continue
8170 }
8171 c := auxIntToInt8(v_0_1.AuxInt)
8172 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(x.Op != OpConst8 && udivisibleOK8(c) && !hasSmallRotate(config)) {
8173 continue
8174 }
8175 v.reset(OpEq32)
8176 v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32)
8177 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
8178 v1.AddArg(x)
8179 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8180 v2.AuxInt = int32ToAuxInt(int32(uint8(c)))
8181 v0.AddArg2(v1, v2)
8182 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8183 v3.AuxInt = int32ToAuxInt(0)
8184 v.AddArg2(v0, v3)
8185 return true
8186 }
8187 break
8188 }
8189
8190
8191
8192 for {
8193 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8194 if v_0.Op != OpMod8 {
8195 continue
8196 }
8197 _ = v_0.Args[1]
8198 x := v_0.Args[0]
8199 v_0_1 := v_0.Args[1]
8200 if v_0_1.Op != OpConst8 {
8201 continue
8202 }
8203 c := auxIntToInt8(v_0_1.AuxInt)
8204 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(x.Op != OpConst8 && sdivisibleOK8(c) && !hasSmallRotate(config)) {
8205 continue
8206 }
8207 v.reset(OpEq32)
8208 v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32)
8209 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
8210 v1.AddArg(x)
8211 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
8212 v2.AuxInt = int32ToAuxInt(int32(c))
8213 v0.AddArg2(v1, v2)
8214 v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
8215 v3.AuxInt = int32ToAuxInt(0)
8216 v.AddArg2(v0, v3)
8217 return true
8218 }
8219 break
8220 }
8221
8222
8223
8224 for {
8225 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8226 s := v_0
8227 if s.Op != OpSub8 {
8228 continue
8229 }
8230 y := s.Args[1]
8231 x := s.Args[0]
8232 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(s.Uses == 1) {
8233 continue
8234 }
8235 v.reset(OpEq8)
8236 v.AddArg2(x, y)
8237 return true
8238 }
8239 break
8240 }
8241
8242
8243
8244 for {
8245 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8246 if v_0.Op != OpAnd8 {
8247 continue
8248 }
8249 t := v_0.Type
8250 _ = v_0.Args[1]
8251 v_0_0 := v_0.Args[0]
8252 v_0_1 := v_0.Args[1]
8253 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
8254 x := v_0_0
8255 if v_0_1.Op != OpConst8 || v_0_1.Type != t {
8256 continue
8257 }
8258 y := auxIntToInt8(v_0_1.AuxInt)
8259 if v_1.Op != OpConst8 || v_1.Type != t || auxIntToInt8(v_1.AuxInt) != y || !(oneBit(y)) {
8260 continue
8261 }
8262 v.reset(OpNeq8)
8263 v0 := b.NewValue0(v.Pos, OpAnd8, t)
8264 v1 := b.NewValue0(v.Pos, OpConst8, t)
8265 v1.AuxInt = int8ToAuxInt(y)
8266 v0.AddArg2(x, v1)
8267 v2 := b.NewValue0(v.Pos, OpConst8, t)
8268 v2.AuxInt = int8ToAuxInt(0)
8269 v.AddArg2(v0, v2)
8270 return true
8271 }
8272 }
8273 break
8274 }
8275
8276
8277 for {
8278 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8279 if v_0.Op != OpCvtBoolToUint8 {
8280 continue
8281 }
8282 x := v_0.Args[0]
8283 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 1 {
8284 continue
8285 }
8286 v.copyOf(x)
8287 return true
8288 }
8289 break
8290 }
8291
8292
8293 for {
8294 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8295 if v_0.Op != OpCvtBoolToUint8 {
8296 continue
8297 }
8298 x := v_0.Args[0]
8299 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
8300 continue
8301 }
8302 v.reset(OpNot)
8303 v.AddArg(x)
8304 return true
8305 }
8306 break
8307 }
8308 return false
8309 }
8310 func rewriteValuegeneric_OpEqB(v *Value) bool {
8311 v_1 := v.Args[1]
8312 v_0 := v.Args[0]
8313
8314
8315 for {
8316 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8317 if v_0.Op != OpConstBool {
8318 continue
8319 }
8320 c := auxIntToBool(v_0.AuxInt)
8321 if v_1.Op != OpConstBool {
8322 continue
8323 }
8324 d := auxIntToBool(v_1.AuxInt)
8325 v.reset(OpConstBool)
8326 v.AuxInt = boolToAuxInt(c == d)
8327 return true
8328 }
8329 break
8330 }
8331
8332
8333 for {
8334 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8335 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
8336 continue
8337 }
8338 x := v_1
8339 v.reset(OpNot)
8340 v.AddArg(x)
8341 return true
8342 }
8343 break
8344 }
8345
8346
8347 for {
8348 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8349 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
8350 continue
8351 }
8352 x := v_1
8353 v.copyOf(x)
8354 return true
8355 }
8356 break
8357 }
8358 return false
8359 }
8360 func rewriteValuegeneric_OpEqInter(v *Value) bool {
8361 v_1 := v.Args[1]
8362 v_0 := v.Args[0]
8363 b := v.Block
8364 typ := &b.Func.Config.Types
8365
8366
8367 for {
8368 x := v_0
8369 y := v_1
8370 v.reset(OpEqPtr)
8371 v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
8372 v0.AddArg(x)
8373 v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
8374 v1.AddArg(y)
8375 v.AddArg2(v0, v1)
8376 return true
8377 }
8378 }
8379 func rewriteValuegeneric_OpEqPtr(v *Value) bool {
8380 v_1 := v.Args[1]
8381 v_0 := v.Args[0]
8382 b := v.Block
8383 typ := &b.Func.Config.Types
8384
8385
8386 for {
8387 x := v_0
8388 if x != v_1 {
8389 break
8390 }
8391 v.reset(OpConstBool)
8392 v.AuxInt = boolToAuxInt(true)
8393 return true
8394 }
8395
8396
8397 for {
8398 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8399 if v_0.Op != OpAddr {
8400 continue
8401 }
8402 x := auxToSym(v_0.Aux)
8403 if v_1.Op != OpAddr {
8404 continue
8405 }
8406 y := auxToSym(v_1.Aux)
8407 v.reset(OpConstBool)
8408 v.AuxInt = boolToAuxInt(x == y)
8409 return true
8410 }
8411 break
8412 }
8413
8414
8415 for {
8416 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8417 if v_0.Op != OpAddr {
8418 continue
8419 }
8420 x := auxToSym(v_0.Aux)
8421 if v_1.Op != OpOffPtr {
8422 continue
8423 }
8424 o := auxIntToInt64(v_1.AuxInt)
8425 v_1_0 := v_1.Args[0]
8426 if v_1_0.Op != OpAddr {
8427 continue
8428 }
8429 y := auxToSym(v_1_0.Aux)
8430 v.reset(OpConstBool)
8431 v.AuxInt = boolToAuxInt(x == y && o == 0)
8432 return true
8433 }
8434 break
8435 }
8436
8437
8438 for {
8439 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8440 if v_0.Op != OpOffPtr {
8441 continue
8442 }
8443 o1 := auxIntToInt64(v_0.AuxInt)
8444 v_0_0 := v_0.Args[0]
8445 if v_0_0.Op != OpAddr {
8446 continue
8447 }
8448 x := auxToSym(v_0_0.Aux)
8449 if v_1.Op != OpOffPtr {
8450 continue
8451 }
8452 o2 := auxIntToInt64(v_1.AuxInt)
8453 v_1_0 := v_1.Args[0]
8454 if v_1_0.Op != OpAddr {
8455 continue
8456 }
8457 y := auxToSym(v_1_0.Aux)
8458 v.reset(OpConstBool)
8459 v.AuxInt = boolToAuxInt(x == y && o1 == o2)
8460 return true
8461 }
8462 break
8463 }
8464
8465
8466 for {
8467 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8468 if v_0.Op != OpLocalAddr {
8469 continue
8470 }
8471 x := auxToSym(v_0.Aux)
8472 if v_1.Op != OpLocalAddr {
8473 continue
8474 }
8475 y := auxToSym(v_1.Aux)
8476 v.reset(OpConstBool)
8477 v.AuxInt = boolToAuxInt(x == y)
8478 return true
8479 }
8480 break
8481 }
8482
8483
8484 for {
8485 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8486 if v_0.Op != OpLocalAddr {
8487 continue
8488 }
8489 x := auxToSym(v_0.Aux)
8490 if v_1.Op != OpOffPtr {
8491 continue
8492 }
8493 o := auxIntToInt64(v_1.AuxInt)
8494 v_1_0 := v_1.Args[0]
8495 if v_1_0.Op != OpLocalAddr {
8496 continue
8497 }
8498 y := auxToSym(v_1_0.Aux)
8499 v.reset(OpConstBool)
8500 v.AuxInt = boolToAuxInt(x == y && o == 0)
8501 return true
8502 }
8503 break
8504 }
8505
8506
8507 for {
8508 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8509 if v_0.Op != OpOffPtr {
8510 continue
8511 }
8512 o1 := auxIntToInt64(v_0.AuxInt)
8513 v_0_0 := v_0.Args[0]
8514 if v_0_0.Op != OpLocalAddr {
8515 continue
8516 }
8517 x := auxToSym(v_0_0.Aux)
8518 if v_1.Op != OpOffPtr {
8519 continue
8520 }
8521 o2 := auxIntToInt64(v_1.AuxInt)
8522 v_1_0 := v_1.Args[0]
8523 if v_1_0.Op != OpLocalAddr {
8524 continue
8525 }
8526 y := auxToSym(v_1_0.Aux)
8527 v.reset(OpConstBool)
8528 v.AuxInt = boolToAuxInt(x == y && o1 == o2)
8529 return true
8530 }
8531 break
8532 }
8533
8534
8535
8536 for {
8537 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8538 if v_0.Op != OpOffPtr {
8539 continue
8540 }
8541 o1 := auxIntToInt64(v_0.AuxInt)
8542 p1 := v_0.Args[0]
8543 p2 := v_1
8544 if !(isSamePtr(p1, p2)) {
8545 continue
8546 }
8547 v.reset(OpConstBool)
8548 v.AuxInt = boolToAuxInt(o1 == 0)
8549 return true
8550 }
8551 break
8552 }
8553
8554
8555
8556 for {
8557 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8558 if v_0.Op != OpOffPtr {
8559 continue
8560 }
8561 o1 := auxIntToInt64(v_0.AuxInt)
8562 p1 := v_0.Args[0]
8563 if v_1.Op != OpOffPtr {
8564 continue
8565 }
8566 o2 := auxIntToInt64(v_1.AuxInt)
8567 p2 := v_1.Args[0]
8568 if !(isSamePtr(p1, p2)) {
8569 continue
8570 }
8571 v.reset(OpConstBool)
8572 v.AuxInt = boolToAuxInt(o1 == o2)
8573 return true
8574 }
8575 break
8576 }
8577
8578
8579 for {
8580 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8581 if v_0.Op != OpConst32 {
8582 continue
8583 }
8584 c := auxIntToInt32(v_0.AuxInt)
8585 if v_1.Op != OpConst32 {
8586 continue
8587 }
8588 d := auxIntToInt32(v_1.AuxInt)
8589 v.reset(OpConstBool)
8590 v.AuxInt = boolToAuxInt(c == d)
8591 return true
8592 }
8593 break
8594 }
8595
8596
8597 for {
8598 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8599 if v_0.Op != OpConst64 {
8600 continue
8601 }
8602 c := auxIntToInt64(v_0.AuxInt)
8603 if v_1.Op != OpConst64 {
8604 continue
8605 }
8606 d := auxIntToInt64(v_1.AuxInt)
8607 v.reset(OpConstBool)
8608 v.AuxInt = boolToAuxInt(c == d)
8609 return true
8610 }
8611 break
8612 }
8613
8614
8615 for {
8616 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8617 if v_0.Op != OpConvert {
8618 continue
8619 }
8620 v_0_0 := v_0.Args[0]
8621 if v_0_0.Op != OpAddr {
8622 continue
8623 }
8624 x := auxToSym(v_0_0.Aux)
8625 if v_1.Op != OpAddr {
8626 continue
8627 }
8628 y := auxToSym(v_1.Aux)
8629 v.reset(OpConstBool)
8630 v.AuxInt = boolToAuxInt(x == y)
8631 return true
8632 }
8633 break
8634 }
8635
8636
8637 for {
8638 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8639 if v_0.Op != OpLocalAddr || v_1.Op != OpAddr {
8640 continue
8641 }
8642 v.reset(OpConstBool)
8643 v.AuxInt = boolToAuxInt(false)
8644 return true
8645 }
8646 break
8647 }
8648
8649
8650 for {
8651 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8652 if v_0.Op != OpOffPtr {
8653 continue
8654 }
8655 v_0_0 := v_0.Args[0]
8656 if v_0_0.Op != OpLocalAddr || v_1.Op != OpAddr {
8657 continue
8658 }
8659 v.reset(OpConstBool)
8660 v.AuxInt = boolToAuxInt(false)
8661 return true
8662 }
8663 break
8664 }
8665
8666
8667 for {
8668 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8669 if v_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
8670 continue
8671 }
8672 v_1_0 := v_1.Args[0]
8673 if v_1_0.Op != OpAddr {
8674 continue
8675 }
8676 v.reset(OpConstBool)
8677 v.AuxInt = boolToAuxInt(false)
8678 return true
8679 }
8680 break
8681 }
8682
8683
8684 for {
8685 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8686 if v_0.Op != OpOffPtr {
8687 continue
8688 }
8689 v_0_0 := v_0.Args[0]
8690 if v_0_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
8691 continue
8692 }
8693 v_1_0 := v_1.Args[0]
8694 if v_1_0.Op != OpAddr {
8695 continue
8696 }
8697 v.reset(OpConstBool)
8698 v.AuxInt = boolToAuxInt(false)
8699 return true
8700 }
8701 break
8702 }
8703
8704
8705
8706 for {
8707 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8708 if v_0.Op != OpAddPtr {
8709 continue
8710 }
8711 o1 := v_0.Args[1]
8712 p1 := v_0.Args[0]
8713 p2 := v_1
8714 if !(isSamePtr(p1, p2)) {
8715 continue
8716 }
8717 v.reset(OpNot)
8718 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
8719 v0.AddArg(o1)
8720 v.AddArg(v0)
8721 return true
8722 }
8723 break
8724 }
8725
8726
8727 for {
8728 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8729 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
8730 continue
8731 }
8732 p := v_1
8733 v.reset(OpNot)
8734 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
8735 v0.AddArg(p)
8736 v.AddArg(v0)
8737 return true
8738 }
8739 break
8740 }
8741
8742
8743 for {
8744 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8745 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
8746 continue
8747 }
8748 p := v_1
8749 v.reset(OpNot)
8750 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
8751 v0.AddArg(p)
8752 v.AddArg(v0)
8753 return true
8754 }
8755 break
8756 }
8757
8758
8759 for {
8760 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8761 if v_0.Op != OpConstNil {
8762 continue
8763 }
8764 p := v_1
8765 v.reset(OpNot)
8766 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
8767 v0.AddArg(p)
8768 v.AddArg(v0)
8769 return true
8770 }
8771 break
8772 }
8773 return false
8774 }
8775 func rewriteValuegeneric_OpEqSlice(v *Value) bool {
8776 v_1 := v.Args[1]
8777 v_0 := v.Args[0]
8778 b := v.Block
8779 typ := &b.Func.Config.Types
8780
8781
8782 for {
8783 x := v_0
8784 y := v_1
8785 v.reset(OpEqPtr)
8786 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
8787 v0.AddArg(x)
8788 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
8789 v1.AddArg(y)
8790 v.AddArg2(v0, v1)
8791 return true
8792 }
8793 }
8794 func rewriteValuegeneric_OpFloor(v *Value) bool {
8795 v_0 := v.Args[0]
8796
8797
8798 for {
8799 if v_0.Op != OpConst64F {
8800 break
8801 }
8802 c := auxIntToFloat64(v_0.AuxInt)
8803 v.reset(OpConst64F)
8804 v.AuxInt = float64ToAuxInt(math.Floor(c))
8805 return true
8806 }
8807 return false
8808 }
8809 func rewriteValuegeneric_OpIMake(v *Value) bool {
8810 v_1 := v.Args[1]
8811 v_0 := v.Args[0]
8812
8813
8814 for {
8815 _typ := v_0
8816 if v_1.Op != OpStructMake || len(v_1.Args) != 1 {
8817 break
8818 }
8819 val := v_1.Args[0]
8820 v.reset(OpIMake)
8821 v.AddArg2(_typ, val)
8822 return true
8823 }
8824
8825
8826 for {
8827 _typ := v_0
8828 if v_1.Op != OpArrayMake1 {
8829 break
8830 }
8831 val := v_1.Args[0]
8832 v.reset(OpIMake)
8833 v.AddArg2(_typ, val)
8834 return true
8835 }
8836 return false
8837 }
8838 func rewriteValuegeneric_OpInterLECall(v *Value) bool {
8839
8840
8841 for {
8842 if len(v.Args) < 1 {
8843 break
8844 }
8845 v_0 := v.Args[0]
8846 if v_0.Op != OpAddr {
8847 break
8848 }
8849 fn := auxToSym(v_0.Aux)
8850 v_0_0 := v_0.Args[0]
8851 if v_0_0.Op != OpSB {
8852 break
8853 }
8854 v.copyOf(devirtLECall(v, fn.(*obj.LSym)))
8855 return true
8856 }
8857 return false
8858 }
8859 func rewriteValuegeneric_OpIsInBounds(v *Value) bool {
8860 v_1 := v.Args[1]
8861 v_0 := v.Args[0]
8862
8863
8864
8865 for {
8866 if v_0.Op != OpZeroExt8to32 || v_1.Op != OpConst32 {
8867 break
8868 }
8869 c := auxIntToInt32(v_1.AuxInt)
8870 if !((1 << 8) <= c) {
8871 break
8872 }
8873 v.reset(OpConstBool)
8874 v.AuxInt = boolToAuxInt(true)
8875 return true
8876 }
8877
8878
8879
8880 for {
8881 if v_0.Op != OpZeroExt8to64 || v_1.Op != OpConst64 {
8882 break
8883 }
8884 c := auxIntToInt64(v_1.AuxInt)
8885 if !((1 << 8) <= c) {
8886 break
8887 }
8888 v.reset(OpConstBool)
8889 v.AuxInt = boolToAuxInt(true)
8890 return true
8891 }
8892
8893
8894
8895 for {
8896 if v_0.Op != OpZeroExt16to32 || v_1.Op != OpConst32 {
8897 break
8898 }
8899 c := auxIntToInt32(v_1.AuxInt)
8900 if !((1 << 16) <= c) {
8901 break
8902 }
8903 v.reset(OpConstBool)
8904 v.AuxInt = boolToAuxInt(true)
8905 return true
8906 }
8907
8908
8909
8910 for {
8911 if v_0.Op != OpZeroExt16to64 || v_1.Op != OpConst64 {
8912 break
8913 }
8914 c := auxIntToInt64(v_1.AuxInt)
8915 if !((1 << 16) <= c) {
8916 break
8917 }
8918 v.reset(OpConstBool)
8919 v.AuxInt = boolToAuxInt(true)
8920 return true
8921 }
8922
8923
8924 for {
8925 x := v_0
8926 if x != v_1 {
8927 break
8928 }
8929 v.reset(OpConstBool)
8930 v.AuxInt = boolToAuxInt(false)
8931 return true
8932 }
8933
8934
8935
8936 for {
8937 if v_0.Op != OpAnd8 {
8938 break
8939 }
8940 v_0_0 := v_0.Args[0]
8941 v_0_1 := v_0.Args[1]
8942 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
8943 if v_0_0.Op != OpConst8 {
8944 continue
8945 }
8946 c := auxIntToInt8(v_0_0.AuxInt)
8947 if v_1.Op != OpConst8 {
8948 continue
8949 }
8950 d := auxIntToInt8(v_1.AuxInt)
8951 if !(0 <= c && c < d) {
8952 continue
8953 }
8954 v.reset(OpConstBool)
8955 v.AuxInt = boolToAuxInt(true)
8956 return true
8957 }
8958 break
8959 }
8960
8961
8962
8963 for {
8964 if v_0.Op != OpZeroExt8to16 {
8965 break
8966 }
8967 v_0_0 := v_0.Args[0]
8968 if v_0_0.Op != OpAnd8 {
8969 break
8970 }
8971 v_0_0_0 := v_0_0.Args[0]
8972 v_0_0_1 := v_0_0.Args[1]
8973 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
8974 if v_0_0_0.Op != OpConst8 {
8975 continue
8976 }
8977 c := auxIntToInt8(v_0_0_0.AuxInt)
8978 if v_1.Op != OpConst16 {
8979 continue
8980 }
8981 d := auxIntToInt16(v_1.AuxInt)
8982 if !(0 <= c && int16(c) < d) {
8983 continue
8984 }
8985 v.reset(OpConstBool)
8986 v.AuxInt = boolToAuxInt(true)
8987 return true
8988 }
8989 break
8990 }
8991
8992
8993
8994 for {
8995 if v_0.Op != OpZeroExt8to32 {
8996 break
8997 }
8998 v_0_0 := v_0.Args[0]
8999 if v_0_0.Op != OpAnd8 {
9000 break
9001 }
9002 v_0_0_0 := v_0_0.Args[0]
9003 v_0_0_1 := v_0_0.Args[1]
9004 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9005 if v_0_0_0.Op != OpConst8 {
9006 continue
9007 }
9008 c := auxIntToInt8(v_0_0_0.AuxInt)
9009 if v_1.Op != OpConst32 {
9010 continue
9011 }
9012 d := auxIntToInt32(v_1.AuxInt)
9013 if !(0 <= c && int32(c) < d) {
9014 continue
9015 }
9016 v.reset(OpConstBool)
9017 v.AuxInt = boolToAuxInt(true)
9018 return true
9019 }
9020 break
9021 }
9022
9023
9024
9025 for {
9026 if v_0.Op != OpZeroExt8to64 {
9027 break
9028 }
9029 v_0_0 := v_0.Args[0]
9030 if v_0_0.Op != OpAnd8 {
9031 break
9032 }
9033 v_0_0_0 := v_0_0.Args[0]
9034 v_0_0_1 := v_0_0.Args[1]
9035 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9036 if v_0_0_0.Op != OpConst8 {
9037 continue
9038 }
9039 c := auxIntToInt8(v_0_0_0.AuxInt)
9040 if v_1.Op != OpConst64 {
9041 continue
9042 }
9043 d := auxIntToInt64(v_1.AuxInt)
9044 if !(0 <= c && int64(c) < d) {
9045 continue
9046 }
9047 v.reset(OpConstBool)
9048 v.AuxInt = boolToAuxInt(true)
9049 return true
9050 }
9051 break
9052 }
9053
9054
9055
9056 for {
9057 if v_0.Op != OpAnd16 {
9058 break
9059 }
9060 v_0_0 := v_0.Args[0]
9061 v_0_1 := v_0.Args[1]
9062 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9063 if v_0_0.Op != OpConst16 {
9064 continue
9065 }
9066 c := auxIntToInt16(v_0_0.AuxInt)
9067 if v_1.Op != OpConst16 {
9068 continue
9069 }
9070 d := auxIntToInt16(v_1.AuxInt)
9071 if !(0 <= c && c < d) {
9072 continue
9073 }
9074 v.reset(OpConstBool)
9075 v.AuxInt = boolToAuxInt(true)
9076 return true
9077 }
9078 break
9079 }
9080
9081
9082
9083 for {
9084 if v_0.Op != OpZeroExt16to32 {
9085 break
9086 }
9087 v_0_0 := v_0.Args[0]
9088 if v_0_0.Op != OpAnd16 {
9089 break
9090 }
9091 v_0_0_0 := v_0_0.Args[0]
9092 v_0_0_1 := v_0_0.Args[1]
9093 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9094 if v_0_0_0.Op != OpConst16 {
9095 continue
9096 }
9097 c := auxIntToInt16(v_0_0_0.AuxInt)
9098 if v_1.Op != OpConst32 {
9099 continue
9100 }
9101 d := auxIntToInt32(v_1.AuxInt)
9102 if !(0 <= c && int32(c) < d) {
9103 continue
9104 }
9105 v.reset(OpConstBool)
9106 v.AuxInt = boolToAuxInt(true)
9107 return true
9108 }
9109 break
9110 }
9111
9112
9113
9114 for {
9115 if v_0.Op != OpZeroExt16to64 {
9116 break
9117 }
9118 v_0_0 := v_0.Args[0]
9119 if v_0_0.Op != OpAnd16 {
9120 break
9121 }
9122 v_0_0_0 := v_0_0.Args[0]
9123 v_0_0_1 := v_0_0.Args[1]
9124 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9125 if v_0_0_0.Op != OpConst16 {
9126 continue
9127 }
9128 c := auxIntToInt16(v_0_0_0.AuxInt)
9129 if v_1.Op != OpConst64 {
9130 continue
9131 }
9132 d := auxIntToInt64(v_1.AuxInt)
9133 if !(0 <= c && int64(c) < d) {
9134 continue
9135 }
9136 v.reset(OpConstBool)
9137 v.AuxInt = boolToAuxInt(true)
9138 return true
9139 }
9140 break
9141 }
9142
9143
9144
9145 for {
9146 if v_0.Op != OpAnd32 {
9147 break
9148 }
9149 v_0_0 := v_0.Args[0]
9150 v_0_1 := v_0.Args[1]
9151 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9152 if v_0_0.Op != OpConst32 {
9153 continue
9154 }
9155 c := auxIntToInt32(v_0_0.AuxInt)
9156 if v_1.Op != OpConst32 {
9157 continue
9158 }
9159 d := auxIntToInt32(v_1.AuxInt)
9160 if !(0 <= c && c < d) {
9161 continue
9162 }
9163 v.reset(OpConstBool)
9164 v.AuxInt = boolToAuxInt(true)
9165 return true
9166 }
9167 break
9168 }
9169
9170
9171
9172 for {
9173 if v_0.Op != OpZeroExt32to64 {
9174 break
9175 }
9176 v_0_0 := v_0.Args[0]
9177 if v_0_0.Op != OpAnd32 {
9178 break
9179 }
9180 v_0_0_0 := v_0_0.Args[0]
9181 v_0_0_1 := v_0_0.Args[1]
9182 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9183 if v_0_0_0.Op != OpConst32 {
9184 continue
9185 }
9186 c := auxIntToInt32(v_0_0_0.AuxInt)
9187 if v_1.Op != OpConst64 {
9188 continue
9189 }
9190 d := auxIntToInt64(v_1.AuxInt)
9191 if !(0 <= c && int64(c) < d) {
9192 continue
9193 }
9194 v.reset(OpConstBool)
9195 v.AuxInt = boolToAuxInt(true)
9196 return true
9197 }
9198 break
9199 }
9200
9201
9202
9203 for {
9204 if v_0.Op != OpAnd64 {
9205 break
9206 }
9207 v_0_0 := v_0.Args[0]
9208 v_0_1 := v_0.Args[1]
9209 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9210 if v_0_0.Op != OpConst64 {
9211 continue
9212 }
9213 c := auxIntToInt64(v_0_0.AuxInt)
9214 if v_1.Op != OpConst64 {
9215 continue
9216 }
9217 d := auxIntToInt64(v_1.AuxInt)
9218 if !(0 <= c && c < d) {
9219 continue
9220 }
9221 v.reset(OpConstBool)
9222 v.AuxInt = boolToAuxInt(true)
9223 return true
9224 }
9225 break
9226 }
9227
9228
9229 for {
9230 if v_0.Op != OpConst32 {
9231 break
9232 }
9233 c := auxIntToInt32(v_0.AuxInt)
9234 if v_1.Op != OpConst32 {
9235 break
9236 }
9237 d := auxIntToInt32(v_1.AuxInt)
9238 v.reset(OpConstBool)
9239 v.AuxInt = boolToAuxInt(0 <= c && c < d)
9240 return true
9241 }
9242
9243
9244 for {
9245 if v_0.Op != OpConst64 {
9246 break
9247 }
9248 c := auxIntToInt64(v_0.AuxInt)
9249 if v_1.Op != OpConst64 {
9250 break
9251 }
9252 d := auxIntToInt64(v_1.AuxInt)
9253 v.reset(OpConstBool)
9254 v.AuxInt = boolToAuxInt(0 <= c && c < d)
9255 return true
9256 }
9257
9258
9259 for {
9260 if v_0.Op != OpMod32u {
9261 break
9262 }
9263 y := v_0.Args[1]
9264 if y != v_1 {
9265 break
9266 }
9267 v.reset(OpConstBool)
9268 v.AuxInt = boolToAuxInt(true)
9269 return true
9270 }
9271
9272
9273 for {
9274 if v_0.Op != OpMod64u {
9275 break
9276 }
9277 y := v_0.Args[1]
9278 if y != v_1 {
9279 break
9280 }
9281 v.reset(OpConstBool)
9282 v.AuxInt = boolToAuxInt(true)
9283 return true
9284 }
9285
9286
9287
9288 for {
9289 if v_0.Op != OpZeroExt8to64 {
9290 break
9291 }
9292 v_0_0 := v_0.Args[0]
9293 if v_0_0.Op != OpRsh8Ux64 {
9294 break
9295 }
9296 _ = v_0_0.Args[1]
9297 v_0_0_1 := v_0_0.Args[1]
9298 if v_0_0_1.Op != OpConst64 {
9299 break
9300 }
9301 c := auxIntToInt64(v_0_0_1.AuxInt)
9302 if v_1.Op != OpConst64 {
9303 break
9304 }
9305 d := auxIntToInt64(v_1.AuxInt)
9306 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
9307 break
9308 }
9309 v.reset(OpConstBool)
9310 v.AuxInt = boolToAuxInt(true)
9311 return true
9312 }
9313
9314
9315
9316 for {
9317 if v_0.Op != OpZeroExt8to32 {
9318 break
9319 }
9320 v_0_0 := v_0.Args[0]
9321 if v_0_0.Op != OpRsh8Ux64 {
9322 break
9323 }
9324 _ = v_0_0.Args[1]
9325 v_0_0_1 := v_0_0.Args[1]
9326 if v_0_0_1.Op != OpConst64 {
9327 break
9328 }
9329 c := auxIntToInt64(v_0_0_1.AuxInt)
9330 if v_1.Op != OpConst32 {
9331 break
9332 }
9333 d := auxIntToInt32(v_1.AuxInt)
9334 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
9335 break
9336 }
9337 v.reset(OpConstBool)
9338 v.AuxInt = boolToAuxInt(true)
9339 return true
9340 }
9341
9342
9343
9344 for {
9345 if v_0.Op != OpZeroExt8to16 {
9346 break
9347 }
9348 v_0_0 := v_0.Args[0]
9349 if v_0_0.Op != OpRsh8Ux64 {
9350 break
9351 }
9352 _ = v_0_0.Args[1]
9353 v_0_0_1 := v_0_0.Args[1]
9354 if v_0_0_1.Op != OpConst64 {
9355 break
9356 }
9357 c := auxIntToInt64(v_0_0_1.AuxInt)
9358 if v_1.Op != OpConst16 {
9359 break
9360 }
9361 d := auxIntToInt16(v_1.AuxInt)
9362 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
9363 break
9364 }
9365 v.reset(OpConstBool)
9366 v.AuxInt = boolToAuxInt(true)
9367 return true
9368 }
9369
9370
9371
9372 for {
9373 if v_0.Op != OpRsh8Ux64 {
9374 break
9375 }
9376 _ = v_0.Args[1]
9377 v_0_1 := v_0.Args[1]
9378 if v_0_1.Op != OpConst64 {
9379 break
9380 }
9381 c := auxIntToInt64(v_0_1.AuxInt)
9382 if v_1.Op != OpConst64 {
9383 break
9384 }
9385 d := auxIntToInt64(v_1.AuxInt)
9386 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
9387 break
9388 }
9389 v.reset(OpConstBool)
9390 v.AuxInt = boolToAuxInt(true)
9391 return true
9392 }
9393
9394
9395
9396 for {
9397 if v_0.Op != OpZeroExt16to64 {
9398 break
9399 }
9400 v_0_0 := v_0.Args[0]
9401 if v_0_0.Op != OpRsh16Ux64 {
9402 break
9403 }
9404 _ = v_0_0.Args[1]
9405 v_0_0_1 := v_0_0.Args[1]
9406 if v_0_0_1.Op != OpConst64 {
9407 break
9408 }
9409 c := auxIntToInt64(v_0_0_1.AuxInt)
9410 if v_1.Op != OpConst64 {
9411 break
9412 }
9413 d := auxIntToInt64(v_1.AuxInt)
9414 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
9415 break
9416 }
9417 v.reset(OpConstBool)
9418 v.AuxInt = boolToAuxInt(true)
9419 return true
9420 }
9421
9422
9423
9424 for {
9425 if v_0.Op != OpZeroExt16to32 {
9426 break
9427 }
9428 v_0_0 := v_0.Args[0]
9429 if v_0_0.Op != OpRsh16Ux64 {
9430 break
9431 }
9432 _ = v_0_0.Args[1]
9433 v_0_0_1 := v_0_0.Args[1]
9434 if v_0_0_1.Op != OpConst64 {
9435 break
9436 }
9437 c := auxIntToInt64(v_0_0_1.AuxInt)
9438 if v_1.Op != OpConst64 {
9439 break
9440 }
9441 d := auxIntToInt64(v_1.AuxInt)
9442 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
9443 break
9444 }
9445 v.reset(OpConstBool)
9446 v.AuxInt = boolToAuxInt(true)
9447 return true
9448 }
9449
9450
9451
9452 for {
9453 if v_0.Op != OpRsh16Ux64 {
9454 break
9455 }
9456 _ = v_0.Args[1]
9457 v_0_1 := v_0.Args[1]
9458 if v_0_1.Op != OpConst64 {
9459 break
9460 }
9461 c := auxIntToInt64(v_0_1.AuxInt)
9462 if v_1.Op != OpConst64 {
9463 break
9464 }
9465 d := auxIntToInt64(v_1.AuxInt)
9466 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
9467 break
9468 }
9469 v.reset(OpConstBool)
9470 v.AuxInt = boolToAuxInt(true)
9471 return true
9472 }
9473
9474
9475
9476 for {
9477 if v_0.Op != OpZeroExt32to64 {
9478 break
9479 }
9480 v_0_0 := v_0.Args[0]
9481 if v_0_0.Op != OpRsh32Ux64 {
9482 break
9483 }
9484 _ = v_0_0.Args[1]
9485 v_0_0_1 := v_0_0.Args[1]
9486 if v_0_0_1.Op != OpConst64 {
9487 break
9488 }
9489 c := auxIntToInt64(v_0_0_1.AuxInt)
9490 if v_1.Op != OpConst64 {
9491 break
9492 }
9493 d := auxIntToInt64(v_1.AuxInt)
9494 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) {
9495 break
9496 }
9497 v.reset(OpConstBool)
9498 v.AuxInt = boolToAuxInt(true)
9499 return true
9500 }
9501
9502
9503
9504 for {
9505 if v_0.Op != OpRsh32Ux64 {
9506 break
9507 }
9508 _ = v_0.Args[1]
9509 v_0_1 := v_0.Args[1]
9510 if v_0_1.Op != OpConst64 {
9511 break
9512 }
9513 c := auxIntToInt64(v_0_1.AuxInt)
9514 if v_1.Op != OpConst64 {
9515 break
9516 }
9517 d := auxIntToInt64(v_1.AuxInt)
9518 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) {
9519 break
9520 }
9521 v.reset(OpConstBool)
9522 v.AuxInt = boolToAuxInt(true)
9523 return true
9524 }
9525
9526
9527
9528 for {
9529 if v_0.Op != OpRsh64Ux64 {
9530 break
9531 }
9532 _ = v_0.Args[1]
9533 v_0_1 := v_0.Args[1]
9534 if v_0_1.Op != OpConst64 {
9535 break
9536 }
9537 c := auxIntToInt64(v_0_1.AuxInt)
9538 if v_1.Op != OpConst64 {
9539 break
9540 }
9541 d := auxIntToInt64(v_1.AuxInt)
9542 if !(0 < c && c < 64 && 1<<uint(64-c)-1 < d) {
9543 break
9544 }
9545 v.reset(OpConstBool)
9546 v.AuxInt = boolToAuxInt(true)
9547 return true
9548 }
9549 return false
9550 }
9551 func rewriteValuegeneric_OpIsNonNil(v *Value) bool {
9552 v_0 := v.Args[0]
9553
9554
9555 for {
9556 if v_0.Op != OpConstNil {
9557 break
9558 }
9559 v.reset(OpConstBool)
9560 v.AuxInt = boolToAuxInt(false)
9561 return true
9562 }
9563
9564
9565 for {
9566 if v_0.Op != OpConst32 {
9567 break
9568 }
9569 c := auxIntToInt32(v_0.AuxInt)
9570 v.reset(OpConstBool)
9571 v.AuxInt = boolToAuxInt(c != 0)
9572 return true
9573 }
9574
9575
9576 for {
9577 if v_0.Op != OpConst64 {
9578 break
9579 }
9580 c := auxIntToInt64(v_0.AuxInt)
9581 v.reset(OpConstBool)
9582 v.AuxInt = boolToAuxInt(c != 0)
9583 return true
9584 }
9585
9586
9587 for {
9588 if v_0.Op != OpAddr {
9589 break
9590 }
9591 v.reset(OpConstBool)
9592 v.AuxInt = boolToAuxInt(true)
9593 return true
9594 }
9595
9596
9597 for {
9598 if v_0.Op != OpConvert {
9599 break
9600 }
9601 v_0_0 := v_0.Args[0]
9602 if v_0_0.Op != OpAddr {
9603 break
9604 }
9605 v.reset(OpConstBool)
9606 v.AuxInt = boolToAuxInt(true)
9607 return true
9608 }
9609
9610
9611 for {
9612 if v_0.Op != OpLocalAddr {
9613 break
9614 }
9615 v.reset(OpConstBool)
9616 v.AuxInt = boolToAuxInt(true)
9617 return true
9618 }
9619 return false
9620 }
9621 func rewriteValuegeneric_OpIsSliceInBounds(v *Value) bool {
9622 v_1 := v.Args[1]
9623 v_0 := v.Args[0]
9624
9625
9626 for {
9627 x := v_0
9628 if x != v_1 {
9629 break
9630 }
9631 v.reset(OpConstBool)
9632 v.AuxInt = boolToAuxInt(true)
9633 return true
9634 }
9635
9636
9637
9638 for {
9639 if v_0.Op != OpAnd32 {
9640 break
9641 }
9642 v_0_0 := v_0.Args[0]
9643 v_0_1 := v_0.Args[1]
9644 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9645 if v_0_0.Op != OpConst32 {
9646 continue
9647 }
9648 c := auxIntToInt32(v_0_0.AuxInt)
9649 if v_1.Op != OpConst32 {
9650 continue
9651 }
9652 d := auxIntToInt32(v_1.AuxInt)
9653 if !(0 <= c && c <= d) {
9654 continue
9655 }
9656 v.reset(OpConstBool)
9657 v.AuxInt = boolToAuxInt(true)
9658 return true
9659 }
9660 break
9661 }
9662
9663
9664
9665 for {
9666 if v_0.Op != OpAnd64 {
9667 break
9668 }
9669 v_0_0 := v_0.Args[0]
9670 v_0_1 := v_0.Args[1]
9671 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9672 if v_0_0.Op != OpConst64 {
9673 continue
9674 }
9675 c := auxIntToInt64(v_0_0.AuxInt)
9676 if v_1.Op != OpConst64 {
9677 continue
9678 }
9679 d := auxIntToInt64(v_1.AuxInt)
9680 if !(0 <= c && c <= d) {
9681 continue
9682 }
9683 v.reset(OpConstBool)
9684 v.AuxInt = boolToAuxInt(true)
9685 return true
9686 }
9687 break
9688 }
9689
9690
9691 for {
9692 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
9693 break
9694 }
9695 v.reset(OpConstBool)
9696 v.AuxInt = boolToAuxInt(true)
9697 return true
9698 }
9699
9700
9701 for {
9702 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
9703 break
9704 }
9705 v.reset(OpConstBool)
9706 v.AuxInt = boolToAuxInt(true)
9707 return true
9708 }
9709
9710
9711 for {
9712 if v_0.Op != OpConst32 {
9713 break
9714 }
9715 c := auxIntToInt32(v_0.AuxInt)
9716 if v_1.Op != OpConst32 {
9717 break
9718 }
9719 d := auxIntToInt32(v_1.AuxInt)
9720 v.reset(OpConstBool)
9721 v.AuxInt = boolToAuxInt(0 <= c && c <= d)
9722 return true
9723 }
9724
9725
9726 for {
9727 if v_0.Op != OpConst64 {
9728 break
9729 }
9730 c := auxIntToInt64(v_0.AuxInt)
9731 if v_1.Op != OpConst64 {
9732 break
9733 }
9734 d := auxIntToInt64(v_1.AuxInt)
9735 v.reset(OpConstBool)
9736 v.AuxInt = boolToAuxInt(0 <= c && c <= d)
9737 return true
9738 }
9739
9740
9741 for {
9742 if v_0.Op != OpSliceLen {
9743 break
9744 }
9745 x := v_0.Args[0]
9746 if v_1.Op != OpSliceCap || x != v_1.Args[0] {
9747 break
9748 }
9749 v.reset(OpConstBool)
9750 v.AuxInt = boolToAuxInt(true)
9751 return true
9752 }
9753 return false
9754 }
9755 func rewriteValuegeneric_OpLeq16(v *Value) bool {
9756 v_1 := v.Args[1]
9757 v_0 := v.Args[0]
9758 b := v.Block
9759
9760
9761 for {
9762 if v_0.Op != OpConst16 {
9763 break
9764 }
9765 c := auxIntToInt16(v_0.AuxInt)
9766 if v_1.Op != OpConst16 {
9767 break
9768 }
9769 d := auxIntToInt16(v_1.AuxInt)
9770 v.reset(OpConstBool)
9771 v.AuxInt = boolToAuxInt(c <= d)
9772 return true
9773 }
9774
9775
9776
9777 for {
9778 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 || v_1.Op != OpAnd16 {
9779 break
9780 }
9781 _ = v_1.Args[1]
9782 v_1_0 := v_1.Args[0]
9783 v_1_1 := v_1.Args[1]
9784 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
9785 if v_1_1.Op != OpConst16 {
9786 continue
9787 }
9788 c := auxIntToInt16(v_1_1.AuxInt)
9789 if !(c >= 0) {
9790 continue
9791 }
9792 v.reset(OpConstBool)
9793 v.AuxInt = boolToAuxInt(true)
9794 return true
9795 }
9796 break
9797 }
9798
9799
9800
9801 for {
9802 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 || v_1.Op != OpRsh16Ux64 {
9803 break
9804 }
9805 _ = v_1.Args[1]
9806 v_1_1 := v_1.Args[1]
9807 if v_1_1.Op != OpConst64 {
9808 break
9809 }
9810 c := auxIntToInt64(v_1_1.AuxInt)
9811 if !(c > 0) {
9812 break
9813 }
9814 v.reset(OpConstBool)
9815 v.AuxInt = boolToAuxInt(true)
9816 return true
9817 }
9818
9819
9820 for {
9821 x := v_0
9822 if v_1.Op != OpConst16 {
9823 break
9824 }
9825 t := v_1.Type
9826 if auxIntToInt16(v_1.AuxInt) != -1 {
9827 break
9828 }
9829 v.reset(OpLess16)
9830 v0 := b.NewValue0(v.Pos, OpConst16, t)
9831 v0.AuxInt = int16ToAuxInt(0)
9832 v.AddArg2(x, v0)
9833 return true
9834 }
9835
9836
9837 for {
9838 if v_0.Op != OpConst16 {
9839 break
9840 }
9841 t := v_0.Type
9842 if auxIntToInt16(v_0.AuxInt) != 1 {
9843 break
9844 }
9845 x := v_1
9846 v.reset(OpLess16)
9847 v0 := b.NewValue0(v.Pos, OpConst16, t)
9848 v0.AuxInt = int16ToAuxInt(0)
9849 v.AddArg2(v0, x)
9850 return true
9851 }
9852
9853
9854 for {
9855 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != math.MinInt16 {
9856 break
9857 }
9858 v.reset(OpConstBool)
9859 v.AuxInt = boolToAuxInt(true)
9860 return true
9861 }
9862
9863
9864 for {
9865 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != math.MaxInt16 {
9866 break
9867 }
9868 v.reset(OpConstBool)
9869 v.AuxInt = boolToAuxInt(true)
9870 return true
9871 }
9872
9873
9874 for {
9875 x := v_0
9876 c := v_1
9877 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != math.MinInt16 {
9878 break
9879 }
9880 v.reset(OpEq16)
9881 v.AddArg2(x, c)
9882 return true
9883 }
9884
9885
9886 for {
9887 c := v_0
9888 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != math.MaxInt16 {
9889 break
9890 }
9891 x := v_1
9892 v.reset(OpEq16)
9893 v.AddArg2(x, c)
9894 return true
9895 }
9896 return false
9897 }
9898 func rewriteValuegeneric_OpLeq16U(v *Value) bool {
9899 v_1 := v.Args[1]
9900 v_0 := v.Args[0]
9901 b := v.Block
9902
9903
9904 for {
9905 if v_0.Op != OpConst16 {
9906 break
9907 }
9908 c := auxIntToInt16(v_0.AuxInt)
9909 if v_1.Op != OpConst16 {
9910 break
9911 }
9912 d := auxIntToInt16(v_1.AuxInt)
9913 v.reset(OpConstBool)
9914 v.AuxInt = boolToAuxInt(uint16(c) <= uint16(d))
9915 return true
9916 }
9917
9918
9919 for {
9920 if v_0.Op != OpConst16 {
9921 break
9922 }
9923 t := v_0.Type
9924 if auxIntToInt16(v_0.AuxInt) != 1 {
9925 break
9926 }
9927 x := v_1
9928 v.reset(OpNeq16)
9929 v0 := b.NewValue0(v.Pos, OpConst16, t)
9930 v0.AuxInt = int16ToAuxInt(0)
9931 v.AddArg2(v0, x)
9932 return true
9933 }
9934
9935
9936 for {
9937 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
9938 break
9939 }
9940 v.reset(OpConstBool)
9941 v.AuxInt = boolToAuxInt(true)
9942 return true
9943 }
9944
9945
9946 for {
9947 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != -1 {
9948 break
9949 }
9950 v.reset(OpConstBool)
9951 v.AuxInt = boolToAuxInt(true)
9952 return true
9953 }
9954
9955
9956 for {
9957 x := v_0
9958 c := v_1
9959 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != 0 {
9960 break
9961 }
9962 v.reset(OpEq16)
9963 v.AddArg2(x, c)
9964 return true
9965 }
9966
9967
9968 for {
9969 c := v_0
9970 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != -1 {
9971 break
9972 }
9973 x := v_1
9974 v.reset(OpEq16)
9975 v.AddArg2(x, c)
9976 return true
9977 }
9978 return false
9979 }
9980 func rewriteValuegeneric_OpLeq32(v *Value) bool {
9981 v_1 := v.Args[1]
9982 v_0 := v.Args[0]
9983 b := v.Block
9984
9985
9986 for {
9987 if v_0.Op != OpConst32 {
9988 break
9989 }
9990 c := auxIntToInt32(v_0.AuxInt)
9991 if v_1.Op != OpConst32 {
9992 break
9993 }
9994 d := auxIntToInt32(v_1.AuxInt)
9995 v.reset(OpConstBool)
9996 v.AuxInt = boolToAuxInt(c <= d)
9997 return true
9998 }
9999
10000
10001
10002 for {
10003 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 || v_1.Op != OpAnd32 {
10004 break
10005 }
10006 _ = v_1.Args[1]
10007 v_1_0 := v_1.Args[0]
10008 v_1_1 := v_1.Args[1]
10009 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
10010 if v_1_1.Op != OpConst32 {
10011 continue
10012 }
10013 c := auxIntToInt32(v_1_1.AuxInt)
10014 if !(c >= 0) {
10015 continue
10016 }
10017 v.reset(OpConstBool)
10018 v.AuxInt = boolToAuxInt(true)
10019 return true
10020 }
10021 break
10022 }
10023
10024
10025
10026 for {
10027 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 || v_1.Op != OpRsh32Ux64 {
10028 break
10029 }
10030 _ = v_1.Args[1]
10031 v_1_1 := v_1.Args[1]
10032 if v_1_1.Op != OpConst64 {
10033 break
10034 }
10035 c := auxIntToInt64(v_1_1.AuxInt)
10036 if !(c > 0) {
10037 break
10038 }
10039 v.reset(OpConstBool)
10040 v.AuxInt = boolToAuxInt(true)
10041 return true
10042 }
10043
10044
10045 for {
10046 x := v_0
10047 if v_1.Op != OpConst32 {
10048 break
10049 }
10050 t := v_1.Type
10051 if auxIntToInt32(v_1.AuxInt) != -1 {
10052 break
10053 }
10054 v.reset(OpLess32)
10055 v0 := b.NewValue0(v.Pos, OpConst32, t)
10056 v0.AuxInt = int32ToAuxInt(0)
10057 v.AddArg2(x, v0)
10058 return true
10059 }
10060
10061
10062 for {
10063 if v_0.Op != OpConst32 {
10064 break
10065 }
10066 t := v_0.Type
10067 if auxIntToInt32(v_0.AuxInt) != 1 {
10068 break
10069 }
10070 x := v_1
10071 v.reset(OpLess32)
10072 v0 := b.NewValue0(v.Pos, OpConst32, t)
10073 v0.AuxInt = int32ToAuxInt(0)
10074 v.AddArg2(v0, x)
10075 return true
10076 }
10077
10078
10079 for {
10080 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != math.MinInt32 {
10081 break
10082 }
10083 v.reset(OpConstBool)
10084 v.AuxInt = boolToAuxInt(true)
10085 return true
10086 }
10087
10088
10089 for {
10090 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != math.MaxInt32 {
10091 break
10092 }
10093 v.reset(OpConstBool)
10094 v.AuxInt = boolToAuxInt(true)
10095 return true
10096 }
10097
10098
10099 for {
10100 x := v_0
10101 c := v_1
10102 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != math.MinInt32 {
10103 break
10104 }
10105 v.reset(OpEq32)
10106 v.AddArg2(x, c)
10107 return true
10108 }
10109
10110
10111 for {
10112 c := v_0
10113 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != math.MaxInt32 {
10114 break
10115 }
10116 x := v_1
10117 v.reset(OpEq32)
10118 v.AddArg2(x, c)
10119 return true
10120 }
10121 return false
10122 }
10123 func rewriteValuegeneric_OpLeq32F(v *Value) bool {
10124 v_1 := v.Args[1]
10125 v_0 := v.Args[0]
10126
10127
10128 for {
10129 if v_0.Op != OpConst32F {
10130 break
10131 }
10132 c := auxIntToFloat32(v_0.AuxInt)
10133 if v_1.Op != OpConst32F {
10134 break
10135 }
10136 d := auxIntToFloat32(v_1.AuxInt)
10137 v.reset(OpConstBool)
10138 v.AuxInt = boolToAuxInt(c <= d)
10139 return true
10140 }
10141 return false
10142 }
10143 func rewriteValuegeneric_OpLeq32U(v *Value) bool {
10144 v_1 := v.Args[1]
10145 v_0 := v.Args[0]
10146 b := v.Block
10147
10148
10149 for {
10150 if v_0.Op != OpConst32 {
10151 break
10152 }
10153 c := auxIntToInt32(v_0.AuxInt)
10154 if v_1.Op != OpConst32 {
10155 break
10156 }
10157 d := auxIntToInt32(v_1.AuxInt)
10158 v.reset(OpConstBool)
10159 v.AuxInt = boolToAuxInt(uint32(c) <= uint32(d))
10160 return true
10161 }
10162
10163
10164 for {
10165 if v_0.Op != OpConst32 {
10166 break
10167 }
10168 t := v_0.Type
10169 if auxIntToInt32(v_0.AuxInt) != 1 {
10170 break
10171 }
10172 x := v_1
10173 v.reset(OpNeq32)
10174 v0 := b.NewValue0(v.Pos, OpConst32, t)
10175 v0.AuxInt = int32ToAuxInt(0)
10176 v.AddArg2(v0, x)
10177 return true
10178 }
10179
10180
10181 for {
10182 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
10183 break
10184 }
10185 v.reset(OpConstBool)
10186 v.AuxInt = boolToAuxInt(true)
10187 return true
10188 }
10189
10190
10191 for {
10192 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != -1 {
10193 break
10194 }
10195 v.reset(OpConstBool)
10196 v.AuxInt = boolToAuxInt(true)
10197 return true
10198 }
10199
10200
10201 for {
10202 x := v_0
10203 c := v_1
10204 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != 0 {
10205 break
10206 }
10207 v.reset(OpEq32)
10208 v.AddArg2(x, c)
10209 return true
10210 }
10211
10212
10213 for {
10214 c := v_0
10215 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != -1 {
10216 break
10217 }
10218 x := v_1
10219 v.reset(OpEq32)
10220 v.AddArg2(x, c)
10221 return true
10222 }
10223 return false
10224 }
10225 func rewriteValuegeneric_OpLeq64(v *Value) bool {
10226 v_1 := v.Args[1]
10227 v_0 := v.Args[0]
10228 b := v.Block
10229
10230
10231 for {
10232 if v_0.Op != OpConst64 {
10233 break
10234 }
10235 c := auxIntToInt64(v_0.AuxInt)
10236 if v_1.Op != OpConst64 {
10237 break
10238 }
10239 d := auxIntToInt64(v_1.AuxInt)
10240 v.reset(OpConstBool)
10241 v.AuxInt = boolToAuxInt(c <= d)
10242 return true
10243 }
10244
10245
10246
10247 for {
10248 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 || v_1.Op != OpAnd64 {
10249 break
10250 }
10251 _ = v_1.Args[1]
10252 v_1_0 := v_1.Args[0]
10253 v_1_1 := v_1.Args[1]
10254 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
10255 if v_1_1.Op != OpConst64 {
10256 continue
10257 }
10258 c := auxIntToInt64(v_1_1.AuxInt)
10259 if !(c >= 0) {
10260 continue
10261 }
10262 v.reset(OpConstBool)
10263 v.AuxInt = boolToAuxInt(true)
10264 return true
10265 }
10266 break
10267 }
10268
10269
10270
10271 for {
10272 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 || v_1.Op != OpRsh64Ux64 {
10273 break
10274 }
10275 _ = v_1.Args[1]
10276 v_1_1 := v_1.Args[1]
10277 if v_1_1.Op != OpConst64 {
10278 break
10279 }
10280 c := auxIntToInt64(v_1_1.AuxInt)
10281 if !(c > 0) {
10282 break
10283 }
10284 v.reset(OpConstBool)
10285 v.AuxInt = boolToAuxInt(true)
10286 return true
10287 }
10288
10289
10290 for {
10291 x := v_0
10292 if v_1.Op != OpConst64 {
10293 break
10294 }
10295 t := v_1.Type
10296 if auxIntToInt64(v_1.AuxInt) != -1 {
10297 break
10298 }
10299 v.reset(OpLess64)
10300 v0 := b.NewValue0(v.Pos, OpConst64, t)
10301 v0.AuxInt = int64ToAuxInt(0)
10302 v.AddArg2(x, v0)
10303 return true
10304 }
10305
10306
10307 for {
10308 if v_0.Op != OpConst64 {
10309 break
10310 }
10311 t := v_0.Type
10312 if auxIntToInt64(v_0.AuxInt) != 1 {
10313 break
10314 }
10315 x := v_1
10316 v.reset(OpLess64)
10317 v0 := b.NewValue0(v.Pos, OpConst64, t)
10318 v0.AuxInt = int64ToAuxInt(0)
10319 v.AddArg2(v0, x)
10320 return true
10321 }
10322
10323
10324 for {
10325 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != math.MinInt64 {
10326 break
10327 }
10328 v.reset(OpConstBool)
10329 v.AuxInt = boolToAuxInt(true)
10330 return true
10331 }
10332
10333
10334 for {
10335 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != math.MaxInt64 {
10336 break
10337 }
10338 v.reset(OpConstBool)
10339 v.AuxInt = boolToAuxInt(true)
10340 return true
10341 }
10342
10343
10344 for {
10345 x := v_0
10346 c := v_1
10347 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != math.MinInt64 {
10348 break
10349 }
10350 v.reset(OpEq64)
10351 v.AddArg2(x, c)
10352 return true
10353 }
10354
10355
10356 for {
10357 c := v_0
10358 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != math.MaxInt64 {
10359 break
10360 }
10361 x := v_1
10362 v.reset(OpEq64)
10363 v.AddArg2(x, c)
10364 return true
10365 }
10366 return false
10367 }
10368 func rewriteValuegeneric_OpLeq64F(v *Value) bool {
10369 v_1 := v.Args[1]
10370 v_0 := v.Args[0]
10371
10372
10373 for {
10374 if v_0.Op != OpConst64F {
10375 break
10376 }
10377 c := auxIntToFloat64(v_0.AuxInt)
10378 if v_1.Op != OpConst64F {
10379 break
10380 }
10381 d := auxIntToFloat64(v_1.AuxInt)
10382 v.reset(OpConstBool)
10383 v.AuxInt = boolToAuxInt(c <= d)
10384 return true
10385 }
10386 return false
10387 }
10388 func rewriteValuegeneric_OpLeq64U(v *Value) bool {
10389 v_1 := v.Args[1]
10390 v_0 := v.Args[0]
10391 b := v.Block
10392
10393
10394 for {
10395 if v_0.Op != OpConst64 {
10396 break
10397 }
10398 c := auxIntToInt64(v_0.AuxInt)
10399 if v_1.Op != OpConst64 {
10400 break
10401 }
10402 d := auxIntToInt64(v_1.AuxInt)
10403 v.reset(OpConstBool)
10404 v.AuxInt = boolToAuxInt(uint64(c) <= uint64(d))
10405 return true
10406 }
10407
10408
10409 for {
10410 if v_0.Op != OpConst64 {
10411 break
10412 }
10413 t := v_0.Type
10414 if auxIntToInt64(v_0.AuxInt) != 1 {
10415 break
10416 }
10417 x := v_1
10418 v.reset(OpNeq64)
10419 v0 := b.NewValue0(v.Pos, OpConst64, t)
10420 v0.AuxInt = int64ToAuxInt(0)
10421 v.AddArg2(v0, x)
10422 return true
10423 }
10424
10425
10426 for {
10427 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
10428 break
10429 }
10430 v.reset(OpConstBool)
10431 v.AuxInt = boolToAuxInt(true)
10432 return true
10433 }
10434
10435
10436 for {
10437 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1 {
10438 break
10439 }
10440 v.reset(OpConstBool)
10441 v.AuxInt = boolToAuxInt(true)
10442 return true
10443 }
10444
10445
10446 for {
10447 x := v_0
10448 c := v_1
10449 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != 0 {
10450 break
10451 }
10452 v.reset(OpEq64)
10453 v.AddArg2(x, c)
10454 return true
10455 }
10456
10457
10458 for {
10459 c := v_0
10460 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != -1 {
10461 break
10462 }
10463 x := v_1
10464 v.reset(OpEq64)
10465 v.AddArg2(x, c)
10466 return true
10467 }
10468 return false
10469 }
10470 func rewriteValuegeneric_OpLeq8(v *Value) bool {
10471 v_1 := v.Args[1]
10472 v_0 := v.Args[0]
10473 b := v.Block
10474
10475
10476 for {
10477 if v_0.Op != OpConst8 {
10478 break
10479 }
10480 c := auxIntToInt8(v_0.AuxInt)
10481 if v_1.Op != OpConst8 {
10482 break
10483 }
10484 d := auxIntToInt8(v_1.AuxInt)
10485 v.reset(OpConstBool)
10486 v.AuxInt = boolToAuxInt(c <= d)
10487 return true
10488 }
10489
10490
10491
10492 for {
10493 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 || v_1.Op != OpAnd8 {
10494 break
10495 }
10496 _ = v_1.Args[1]
10497 v_1_0 := v_1.Args[0]
10498 v_1_1 := v_1.Args[1]
10499 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
10500 if v_1_1.Op != OpConst8 {
10501 continue
10502 }
10503 c := auxIntToInt8(v_1_1.AuxInt)
10504 if !(c >= 0) {
10505 continue
10506 }
10507 v.reset(OpConstBool)
10508 v.AuxInt = boolToAuxInt(true)
10509 return true
10510 }
10511 break
10512 }
10513
10514
10515
10516 for {
10517 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 || v_1.Op != OpRsh8Ux64 {
10518 break
10519 }
10520 _ = v_1.Args[1]
10521 v_1_1 := v_1.Args[1]
10522 if v_1_1.Op != OpConst64 {
10523 break
10524 }
10525 c := auxIntToInt64(v_1_1.AuxInt)
10526 if !(c > 0) {
10527 break
10528 }
10529 v.reset(OpConstBool)
10530 v.AuxInt = boolToAuxInt(true)
10531 return true
10532 }
10533
10534
10535 for {
10536 x := v_0
10537 if v_1.Op != OpConst8 {
10538 break
10539 }
10540 t := v_1.Type
10541 if auxIntToInt8(v_1.AuxInt) != -1 {
10542 break
10543 }
10544 v.reset(OpLess8)
10545 v0 := b.NewValue0(v.Pos, OpConst8, t)
10546 v0.AuxInt = int8ToAuxInt(0)
10547 v.AddArg2(x, v0)
10548 return true
10549 }
10550
10551
10552 for {
10553 if v_0.Op != OpConst8 {
10554 break
10555 }
10556 t := v_0.Type
10557 if auxIntToInt8(v_0.AuxInt) != 1 {
10558 break
10559 }
10560 x := v_1
10561 v.reset(OpLess8)
10562 v0 := b.NewValue0(v.Pos, OpConst8, t)
10563 v0.AuxInt = int8ToAuxInt(0)
10564 v.AddArg2(v0, x)
10565 return true
10566 }
10567
10568
10569 for {
10570 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != math.MinInt8 {
10571 break
10572 }
10573 v.reset(OpConstBool)
10574 v.AuxInt = boolToAuxInt(true)
10575 return true
10576 }
10577
10578
10579 for {
10580 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != math.MaxInt8 {
10581 break
10582 }
10583 v.reset(OpConstBool)
10584 v.AuxInt = boolToAuxInt(true)
10585 return true
10586 }
10587
10588
10589 for {
10590 x := v_0
10591 c := v_1
10592 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != math.MinInt8 {
10593 break
10594 }
10595 v.reset(OpEq8)
10596 v.AddArg2(x, c)
10597 return true
10598 }
10599
10600
10601 for {
10602 c := v_0
10603 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != math.MaxInt8 {
10604 break
10605 }
10606 x := v_1
10607 v.reset(OpEq8)
10608 v.AddArg2(x, c)
10609 return true
10610 }
10611 return false
10612 }
10613 func rewriteValuegeneric_OpLeq8U(v *Value) bool {
10614 v_1 := v.Args[1]
10615 v_0 := v.Args[0]
10616 b := v.Block
10617
10618
10619 for {
10620 if v_0.Op != OpConst8 {
10621 break
10622 }
10623 c := auxIntToInt8(v_0.AuxInt)
10624 if v_1.Op != OpConst8 {
10625 break
10626 }
10627 d := auxIntToInt8(v_1.AuxInt)
10628 v.reset(OpConstBool)
10629 v.AuxInt = boolToAuxInt(uint8(c) <= uint8(d))
10630 return true
10631 }
10632
10633
10634 for {
10635 if v_0.Op != OpConst8 {
10636 break
10637 }
10638 t := v_0.Type
10639 if auxIntToInt8(v_0.AuxInt) != 1 {
10640 break
10641 }
10642 x := v_1
10643 v.reset(OpNeq8)
10644 v0 := b.NewValue0(v.Pos, OpConst8, t)
10645 v0.AuxInt = int8ToAuxInt(0)
10646 v.AddArg2(v0, x)
10647 return true
10648 }
10649
10650
10651 for {
10652 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
10653 break
10654 }
10655 v.reset(OpConstBool)
10656 v.AuxInt = boolToAuxInt(true)
10657 return true
10658 }
10659
10660
10661 for {
10662 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != -1 {
10663 break
10664 }
10665 v.reset(OpConstBool)
10666 v.AuxInt = boolToAuxInt(true)
10667 return true
10668 }
10669
10670
10671 for {
10672 x := v_0
10673 c := v_1
10674 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != 0 {
10675 break
10676 }
10677 v.reset(OpEq8)
10678 v.AddArg2(x, c)
10679 return true
10680 }
10681
10682
10683 for {
10684 c := v_0
10685 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != -1 {
10686 break
10687 }
10688 x := v_1
10689 v.reset(OpEq8)
10690 v.AddArg2(x, c)
10691 return true
10692 }
10693 return false
10694 }
10695 func rewriteValuegeneric_OpLess16(v *Value) bool {
10696 v_1 := v.Args[1]
10697 v_0 := v.Args[0]
10698 b := v.Block
10699
10700
10701 for {
10702 if v_0.Op != OpConst16 {
10703 break
10704 }
10705 c := auxIntToInt16(v_0.AuxInt)
10706 if v_1.Op != OpConst16 {
10707 break
10708 }
10709 d := auxIntToInt16(v_1.AuxInt)
10710 v.reset(OpConstBool)
10711 v.AuxInt = boolToAuxInt(c < d)
10712 return true
10713 }
10714
10715
10716
10717 for {
10718 if v_0.Op != OpConst16 {
10719 break
10720 }
10721 t := v_0.Type
10722 if auxIntToInt16(v_0.AuxInt) != 0 {
10723 break
10724 }
10725 x := v_1
10726 if !(isNonNegative(x)) {
10727 break
10728 }
10729 v.reset(OpNeq16)
10730 v0 := b.NewValue0(v.Pos, OpConst16, t)
10731 v0.AuxInt = int16ToAuxInt(0)
10732 v.AddArg2(v0, x)
10733 return true
10734 }
10735
10736
10737
10738 for {
10739 x := v_0
10740 if v_1.Op != OpConst16 {
10741 break
10742 }
10743 t := v_1.Type
10744 if auxIntToInt16(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
10745 break
10746 }
10747 v.reset(OpEq16)
10748 v0 := b.NewValue0(v.Pos, OpConst16, t)
10749 v0.AuxInt = int16ToAuxInt(0)
10750 v.AddArg2(v0, x)
10751 return true
10752 }
10753
10754
10755 for {
10756 x := v_0
10757 if v_1.Op != OpConst16 {
10758 break
10759 }
10760 t := v_1.Type
10761 if auxIntToInt16(v_1.AuxInt) != 1 {
10762 break
10763 }
10764 v.reset(OpLeq16)
10765 v0 := b.NewValue0(v.Pos, OpConst16, t)
10766 v0.AuxInt = int16ToAuxInt(0)
10767 v.AddArg2(x, v0)
10768 return true
10769 }
10770
10771
10772 for {
10773 if v_0.Op != OpConst16 {
10774 break
10775 }
10776 t := v_0.Type
10777 if auxIntToInt16(v_0.AuxInt) != -1 {
10778 break
10779 }
10780 x := v_1
10781 v.reset(OpLeq16)
10782 v0 := b.NewValue0(v.Pos, OpConst16, t)
10783 v0.AuxInt = int16ToAuxInt(0)
10784 v.AddArg2(v0, x)
10785 return true
10786 }
10787
10788
10789 for {
10790 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != math.MinInt16 {
10791 break
10792 }
10793 v.reset(OpConstBool)
10794 v.AuxInt = boolToAuxInt(false)
10795 return true
10796 }
10797
10798
10799 for {
10800 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != math.MaxInt16 {
10801 break
10802 }
10803 v.reset(OpConstBool)
10804 v.AuxInt = boolToAuxInt(false)
10805 return true
10806 }
10807
10808
10809 for {
10810 x := v_0
10811 if v_1.Op != OpConst16 {
10812 break
10813 }
10814 t := v_1.Type
10815 if auxIntToInt16(v_1.AuxInt) != math.MinInt16+1 {
10816 break
10817 }
10818 v.reset(OpEq16)
10819 v0 := b.NewValue0(v.Pos, OpConst16, t)
10820 v0.AuxInt = int16ToAuxInt(math.MinInt16)
10821 v.AddArg2(x, v0)
10822 return true
10823 }
10824
10825
10826 for {
10827 if v_0.Op != OpConst16 {
10828 break
10829 }
10830 t := v_0.Type
10831 if auxIntToInt16(v_0.AuxInt) != math.MaxInt16-1 {
10832 break
10833 }
10834 x := v_1
10835 v.reset(OpEq16)
10836 v0 := b.NewValue0(v.Pos, OpConst16, t)
10837 v0.AuxInt = int16ToAuxInt(math.MaxInt16)
10838 v.AddArg2(x, v0)
10839 return true
10840 }
10841 return false
10842 }
10843 func rewriteValuegeneric_OpLess16U(v *Value) bool {
10844 v_1 := v.Args[1]
10845 v_0 := v.Args[0]
10846 b := v.Block
10847
10848
10849 for {
10850 if v_0.Op != OpConst16 {
10851 break
10852 }
10853 c := auxIntToInt16(v_0.AuxInt)
10854 if v_1.Op != OpConst16 {
10855 break
10856 }
10857 d := auxIntToInt16(v_1.AuxInt)
10858 v.reset(OpConstBool)
10859 v.AuxInt = boolToAuxInt(uint16(c) < uint16(d))
10860 return true
10861 }
10862
10863
10864 for {
10865 x := v_0
10866 if v_1.Op != OpConst16 {
10867 break
10868 }
10869 t := v_1.Type
10870 if auxIntToInt16(v_1.AuxInt) != 1 {
10871 break
10872 }
10873 v.reset(OpEq16)
10874 v0 := b.NewValue0(v.Pos, OpConst16, t)
10875 v0.AuxInt = int16ToAuxInt(0)
10876 v.AddArg2(v0, x)
10877 return true
10878 }
10879
10880
10881 for {
10882 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
10883 break
10884 }
10885 v.reset(OpConstBool)
10886 v.AuxInt = boolToAuxInt(false)
10887 return true
10888 }
10889
10890
10891 for {
10892 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
10893 break
10894 }
10895 v.reset(OpConstBool)
10896 v.AuxInt = boolToAuxInt(false)
10897 return true
10898 }
10899
10900
10901 for {
10902 x := v_0
10903 if v_1.Op != OpConst16 {
10904 break
10905 }
10906 t := v_1.Type
10907 if auxIntToInt16(v_1.AuxInt) != 1 {
10908 break
10909 }
10910 v.reset(OpEq16)
10911 v0 := b.NewValue0(v.Pos, OpConst16, t)
10912 v0.AuxInt = int16ToAuxInt(0)
10913 v.AddArg2(x, v0)
10914 return true
10915 }
10916
10917
10918 for {
10919 if v_0.Op != OpConst16 {
10920 break
10921 }
10922 t := v_0.Type
10923 if auxIntToInt16(v_0.AuxInt) != -2 {
10924 break
10925 }
10926 x := v_1
10927 v.reset(OpEq16)
10928 v0 := b.NewValue0(v.Pos, OpConst16, t)
10929 v0.AuxInt = int16ToAuxInt(-1)
10930 v.AddArg2(x, v0)
10931 return true
10932 }
10933 return false
10934 }
10935 func rewriteValuegeneric_OpLess32(v *Value) bool {
10936 v_1 := v.Args[1]
10937 v_0 := v.Args[0]
10938 b := v.Block
10939
10940
10941 for {
10942 if v_0.Op != OpConst32 {
10943 break
10944 }
10945 c := auxIntToInt32(v_0.AuxInt)
10946 if v_1.Op != OpConst32 {
10947 break
10948 }
10949 d := auxIntToInt32(v_1.AuxInt)
10950 v.reset(OpConstBool)
10951 v.AuxInt = boolToAuxInt(c < d)
10952 return true
10953 }
10954
10955
10956
10957 for {
10958 if v_0.Op != OpConst32 {
10959 break
10960 }
10961 t := v_0.Type
10962 if auxIntToInt32(v_0.AuxInt) != 0 {
10963 break
10964 }
10965 x := v_1
10966 if !(isNonNegative(x)) {
10967 break
10968 }
10969 v.reset(OpNeq32)
10970 v0 := b.NewValue0(v.Pos, OpConst32, t)
10971 v0.AuxInt = int32ToAuxInt(0)
10972 v.AddArg2(v0, x)
10973 return true
10974 }
10975
10976
10977
10978 for {
10979 x := v_0
10980 if v_1.Op != OpConst32 {
10981 break
10982 }
10983 t := v_1.Type
10984 if auxIntToInt32(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
10985 break
10986 }
10987 v.reset(OpEq32)
10988 v0 := b.NewValue0(v.Pos, OpConst32, t)
10989 v0.AuxInt = int32ToAuxInt(0)
10990 v.AddArg2(v0, x)
10991 return true
10992 }
10993
10994
10995 for {
10996 x := v_0
10997 if v_1.Op != OpConst32 {
10998 break
10999 }
11000 t := v_1.Type
11001 if auxIntToInt32(v_1.AuxInt) != 1 {
11002 break
11003 }
11004 v.reset(OpLeq32)
11005 v0 := b.NewValue0(v.Pos, OpConst32, t)
11006 v0.AuxInt = int32ToAuxInt(0)
11007 v.AddArg2(x, v0)
11008 return true
11009 }
11010
11011
11012 for {
11013 if v_0.Op != OpConst32 {
11014 break
11015 }
11016 t := v_0.Type
11017 if auxIntToInt32(v_0.AuxInt) != -1 {
11018 break
11019 }
11020 x := v_1
11021 v.reset(OpLeq32)
11022 v0 := b.NewValue0(v.Pos, OpConst32, t)
11023 v0.AuxInt = int32ToAuxInt(0)
11024 v.AddArg2(v0, x)
11025 return true
11026 }
11027
11028
11029 for {
11030 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != math.MinInt32 {
11031 break
11032 }
11033 v.reset(OpConstBool)
11034 v.AuxInt = boolToAuxInt(false)
11035 return true
11036 }
11037
11038
11039 for {
11040 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != math.MaxInt32 {
11041 break
11042 }
11043 v.reset(OpConstBool)
11044 v.AuxInt = boolToAuxInt(false)
11045 return true
11046 }
11047
11048
11049 for {
11050 x := v_0
11051 if v_1.Op != OpConst32 {
11052 break
11053 }
11054 t := v_1.Type
11055 if auxIntToInt32(v_1.AuxInt) != math.MinInt32+1 {
11056 break
11057 }
11058 v.reset(OpEq32)
11059 v0 := b.NewValue0(v.Pos, OpConst32, t)
11060 v0.AuxInt = int32ToAuxInt(math.MinInt32)
11061 v.AddArg2(x, v0)
11062 return true
11063 }
11064
11065
11066 for {
11067 if v_0.Op != OpConst32 {
11068 break
11069 }
11070 t := v_0.Type
11071 if auxIntToInt32(v_0.AuxInt) != math.MaxInt32-1 {
11072 break
11073 }
11074 x := v_1
11075 v.reset(OpEq32)
11076 v0 := b.NewValue0(v.Pos, OpConst32, t)
11077 v0.AuxInt = int32ToAuxInt(math.MaxInt32)
11078 v.AddArg2(x, v0)
11079 return true
11080 }
11081 return false
11082 }
11083 func rewriteValuegeneric_OpLess32F(v *Value) bool {
11084 v_1 := v.Args[1]
11085 v_0 := v.Args[0]
11086
11087
11088 for {
11089 if v_0.Op != OpConst32F {
11090 break
11091 }
11092 c := auxIntToFloat32(v_0.AuxInt)
11093 if v_1.Op != OpConst32F {
11094 break
11095 }
11096 d := auxIntToFloat32(v_1.AuxInt)
11097 v.reset(OpConstBool)
11098 v.AuxInt = boolToAuxInt(c < d)
11099 return true
11100 }
11101 return false
11102 }
11103 func rewriteValuegeneric_OpLess32U(v *Value) bool {
11104 v_1 := v.Args[1]
11105 v_0 := v.Args[0]
11106 b := v.Block
11107
11108
11109 for {
11110 if v_0.Op != OpConst32 {
11111 break
11112 }
11113 c := auxIntToInt32(v_0.AuxInt)
11114 if v_1.Op != OpConst32 {
11115 break
11116 }
11117 d := auxIntToInt32(v_1.AuxInt)
11118 v.reset(OpConstBool)
11119 v.AuxInt = boolToAuxInt(uint32(c) < uint32(d))
11120 return true
11121 }
11122
11123
11124 for {
11125 x := v_0
11126 if v_1.Op != OpConst32 {
11127 break
11128 }
11129 t := v_1.Type
11130 if auxIntToInt32(v_1.AuxInt) != 1 {
11131 break
11132 }
11133 v.reset(OpEq32)
11134 v0 := b.NewValue0(v.Pos, OpConst32, t)
11135 v0.AuxInt = int32ToAuxInt(0)
11136 v.AddArg2(v0, x)
11137 return true
11138 }
11139
11140
11141 for {
11142 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
11143 break
11144 }
11145 v.reset(OpConstBool)
11146 v.AuxInt = boolToAuxInt(false)
11147 return true
11148 }
11149
11150
11151 for {
11152 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
11153 break
11154 }
11155 v.reset(OpConstBool)
11156 v.AuxInt = boolToAuxInt(false)
11157 return true
11158 }
11159
11160
11161 for {
11162 x := v_0
11163 if v_1.Op != OpConst32 {
11164 break
11165 }
11166 t := v_1.Type
11167 if auxIntToInt32(v_1.AuxInt) != 1 {
11168 break
11169 }
11170 v.reset(OpEq32)
11171 v0 := b.NewValue0(v.Pos, OpConst32, t)
11172 v0.AuxInt = int32ToAuxInt(0)
11173 v.AddArg2(x, v0)
11174 return true
11175 }
11176
11177
11178 for {
11179 if v_0.Op != OpConst32 {
11180 break
11181 }
11182 t := v_0.Type
11183 if auxIntToInt32(v_0.AuxInt) != -2 {
11184 break
11185 }
11186 x := v_1
11187 v.reset(OpEq32)
11188 v0 := b.NewValue0(v.Pos, OpConst32, t)
11189 v0.AuxInt = int32ToAuxInt(-1)
11190 v.AddArg2(x, v0)
11191 return true
11192 }
11193 return false
11194 }
11195 func rewriteValuegeneric_OpLess64(v *Value) bool {
11196 v_1 := v.Args[1]
11197 v_0 := v.Args[0]
11198 b := v.Block
11199
11200
11201 for {
11202 if v_0.Op != OpConst64 {
11203 break
11204 }
11205 c := auxIntToInt64(v_0.AuxInt)
11206 if v_1.Op != OpConst64 {
11207 break
11208 }
11209 d := auxIntToInt64(v_1.AuxInt)
11210 v.reset(OpConstBool)
11211 v.AuxInt = boolToAuxInt(c < d)
11212 return true
11213 }
11214
11215
11216
11217 for {
11218 if v_0.Op != OpConst64 {
11219 break
11220 }
11221 t := v_0.Type
11222 if auxIntToInt64(v_0.AuxInt) != 0 {
11223 break
11224 }
11225 x := v_1
11226 if !(isNonNegative(x)) {
11227 break
11228 }
11229 v.reset(OpNeq64)
11230 v0 := b.NewValue0(v.Pos, OpConst64, t)
11231 v0.AuxInt = int64ToAuxInt(0)
11232 v.AddArg2(v0, x)
11233 return true
11234 }
11235
11236
11237
11238 for {
11239 x := v_0
11240 if v_1.Op != OpConst64 {
11241 break
11242 }
11243 t := v_1.Type
11244 if auxIntToInt64(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
11245 break
11246 }
11247 v.reset(OpEq64)
11248 v0 := b.NewValue0(v.Pos, OpConst64, t)
11249 v0.AuxInt = int64ToAuxInt(0)
11250 v.AddArg2(v0, x)
11251 return true
11252 }
11253
11254
11255 for {
11256 x := v_0
11257 if v_1.Op != OpConst64 {
11258 break
11259 }
11260 t := v_1.Type
11261 if auxIntToInt64(v_1.AuxInt) != 1 {
11262 break
11263 }
11264 v.reset(OpLeq64)
11265 v0 := b.NewValue0(v.Pos, OpConst64, t)
11266 v0.AuxInt = int64ToAuxInt(0)
11267 v.AddArg2(x, v0)
11268 return true
11269 }
11270
11271
11272 for {
11273 if v_0.Op != OpConst64 {
11274 break
11275 }
11276 t := v_0.Type
11277 if auxIntToInt64(v_0.AuxInt) != -1 {
11278 break
11279 }
11280 x := v_1
11281 v.reset(OpLeq64)
11282 v0 := b.NewValue0(v.Pos, OpConst64, t)
11283 v0.AuxInt = int64ToAuxInt(0)
11284 v.AddArg2(v0, x)
11285 return true
11286 }
11287
11288
11289 for {
11290 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != math.MinInt64 {
11291 break
11292 }
11293 v.reset(OpConstBool)
11294 v.AuxInt = boolToAuxInt(false)
11295 return true
11296 }
11297
11298
11299 for {
11300 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != math.MaxInt64 {
11301 break
11302 }
11303 v.reset(OpConstBool)
11304 v.AuxInt = boolToAuxInt(false)
11305 return true
11306 }
11307
11308
11309 for {
11310 x := v_0
11311 if v_1.Op != OpConst64 {
11312 break
11313 }
11314 t := v_1.Type
11315 if auxIntToInt64(v_1.AuxInt) != math.MinInt64+1 {
11316 break
11317 }
11318 v.reset(OpEq64)
11319 v0 := b.NewValue0(v.Pos, OpConst64, t)
11320 v0.AuxInt = int64ToAuxInt(math.MinInt64)
11321 v.AddArg2(x, v0)
11322 return true
11323 }
11324
11325
11326 for {
11327 if v_0.Op != OpConst64 {
11328 break
11329 }
11330 t := v_0.Type
11331 if auxIntToInt64(v_0.AuxInt) != math.MaxInt64-1 {
11332 break
11333 }
11334 x := v_1
11335 v.reset(OpEq64)
11336 v0 := b.NewValue0(v.Pos, OpConst64, t)
11337 v0.AuxInt = int64ToAuxInt(math.MaxInt64)
11338 v.AddArg2(x, v0)
11339 return true
11340 }
11341 return false
11342 }
11343 func rewriteValuegeneric_OpLess64F(v *Value) bool {
11344 v_1 := v.Args[1]
11345 v_0 := v.Args[0]
11346
11347
11348 for {
11349 if v_0.Op != OpConst64F {
11350 break
11351 }
11352 c := auxIntToFloat64(v_0.AuxInt)
11353 if v_1.Op != OpConst64F {
11354 break
11355 }
11356 d := auxIntToFloat64(v_1.AuxInt)
11357 v.reset(OpConstBool)
11358 v.AuxInt = boolToAuxInt(c < d)
11359 return true
11360 }
11361 return false
11362 }
11363 func rewriteValuegeneric_OpLess64U(v *Value) bool {
11364 v_1 := v.Args[1]
11365 v_0 := v.Args[0]
11366 b := v.Block
11367
11368
11369 for {
11370 if v_0.Op != OpConst64 {
11371 break
11372 }
11373 c := auxIntToInt64(v_0.AuxInt)
11374 if v_1.Op != OpConst64 {
11375 break
11376 }
11377 d := auxIntToInt64(v_1.AuxInt)
11378 v.reset(OpConstBool)
11379 v.AuxInt = boolToAuxInt(uint64(c) < uint64(d))
11380 return true
11381 }
11382
11383
11384 for {
11385 x := v_0
11386 if v_1.Op != OpConst64 {
11387 break
11388 }
11389 t := v_1.Type
11390 if auxIntToInt64(v_1.AuxInt) != 1 {
11391 break
11392 }
11393 v.reset(OpEq64)
11394 v0 := b.NewValue0(v.Pos, OpConst64, t)
11395 v0.AuxInt = int64ToAuxInt(0)
11396 v.AddArg2(v0, x)
11397 return true
11398 }
11399
11400
11401 for {
11402 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
11403 break
11404 }
11405 v.reset(OpConstBool)
11406 v.AuxInt = boolToAuxInt(false)
11407 return true
11408 }
11409
11410
11411 for {
11412 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
11413 break
11414 }
11415 v.reset(OpConstBool)
11416 v.AuxInt = boolToAuxInt(false)
11417 return true
11418 }
11419
11420
11421 for {
11422 x := v_0
11423 if v_1.Op != OpConst64 {
11424 break
11425 }
11426 t := v_1.Type
11427 if auxIntToInt64(v_1.AuxInt) != 1 {
11428 break
11429 }
11430 v.reset(OpEq64)
11431 v0 := b.NewValue0(v.Pos, OpConst64, t)
11432 v0.AuxInt = int64ToAuxInt(0)
11433 v.AddArg2(x, v0)
11434 return true
11435 }
11436
11437
11438 for {
11439 if v_0.Op != OpConst64 {
11440 break
11441 }
11442 t := v_0.Type
11443 if auxIntToInt64(v_0.AuxInt) != -2 {
11444 break
11445 }
11446 x := v_1
11447 v.reset(OpEq64)
11448 v0 := b.NewValue0(v.Pos, OpConst64, t)
11449 v0.AuxInt = int64ToAuxInt(-1)
11450 v.AddArg2(x, v0)
11451 return true
11452 }
11453 return false
11454 }
11455 func rewriteValuegeneric_OpLess8(v *Value) bool {
11456 v_1 := v.Args[1]
11457 v_0 := v.Args[0]
11458 b := v.Block
11459
11460
11461 for {
11462 if v_0.Op != OpConst8 {
11463 break
11464 }
11465 c := auxIntToInt8(v_0.AuxInt)
11466 if v_1.Op != OpConst8 {
11467 break
11468 }
11469 d := auxIntToInt8(v_1.AuxInt)
11470 v.reset(OpConstBool)
11471 v.AuxInt = boolToAuxInt(c < d)
11472 return true
11473 }
11474
11475
11476
11477 for {
11478 if v_0.Op != OpConst8 {
11479 break
11480 }
11481 t := v_0.Type
11482 if auxIntToInt8(v_0.AuxInt) != 0 {
11483 break
11484 }
11485 x := v_1
11486 if !(isNonNegative(x)) {
11487 break
11488 }
11489 v.reset(OpNeq8)
11490 v0 := b.NewValue0(v.Pos, OpConst8, t)
11491 v0.AuxInt = int8ToAuxInt(0)
11492 v.AddArg2(v0, x)
11493 return true
11494 }
11495
11496
11497
11498 for {
11499 x := v_0
11500 if v_1.Op != OpConst8 {
11501 break
11502 }
11503 t := v_1.Type
11504 if auxIntToInt8(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
11505 break
11506 }
11507 v.reset(OpEq8)
11508 v0 := b.NewValue0(v.Pos, OpConst8, t)
11509 v0.AuxInt = int8ToAuxInt(0)
11510 v.AddArg2(v0, x)
11511 return true
11512 }
11513
11514
11515 for {
11516 x := v_0
11517 if v_1.Op != OpConst8 {
11518 break
11519 }
11520 t := v_1.Type
11521 if auxIntToInt8(v_1.AuxInt) != 1 {
11522 break
11523 }
11524 v.reset(OpLeq8)
11525 v0 := b.NewValue0(v.Pos, OpConst8, t)
11526 v0.AuxInt = int8ToAuxInt(0)
11527 v.AddArg2(x, v0)
11528 return true
11529 }
11530
11531
11532 for {
11533 if v_0.Op != OpConst8 {
11534 break
11535 }
11536 t := v_0.Type
11537 if auxIntToInt8(v_0.AuxInt) != -1 {
11538 break
11539 }
11540 x := v_1
11541 v.reset(OpLeq8)
11542 v0 := b.NewValue0(v.Pos, OpConst8, t)
11543 v0.AuxInt = int8ToAuxInt(0)
11544 v.AddArg2(v0, x)
11545 return true
11546 }
11547
11548
11549 for {
11550 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != math.MinInt8 {
11551 break
11552 }
11553 v.reset(OpConstBool)
11554 v.AuxInt = boolToAuxInt(false)
11555 return true
11556 }
11557
11558
11559 for {
11560 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != math.MaxInt8 {
11561 break
11562 }
11563 v.reset(OpConstBool)
11564 v.AuxInt = boolToAuxInt(false)
11565 return true
11566 }
11567
11568
11569 for {
11570 x := v_0
11571 if v_1.Op != OpConst8 {
11572 break
11573 }
11574 t := v_1.Type
11575 if auxIntToInt8(v_1.AuxInt) != math.MinInt8+1 {
11576 break
11577 }
11578 v.reset(OpEq8)
11579 v0 := b.NewValue0(v.Pos, OpConst8, t)
11580 v0.AuxInt = int8ToAuxInt(math.MinInt8)
11581 v.AddArg2(x, v0)
11582 return true
11583 }
11584
11585
11586 for {
11587 if v_0.Op != OpConst8 {
11588 break
11589 }
11590 t := v_0.Type
11591 if auxIntToInt8(v_0.AuxInt) != math.MaxInt8-1 {
11592 break
11593 }
11594 x := v_1
11595 v.reset(OpEq8)
11596 v0 := b.NewValue0(v.Pos, OpConst8, t)
11597 v0.AuxInt = int8ToAuxInt(math.MaxInt8)
11598 v.AddArg2(x, v0)
11599 return true
11600 }
11601 return false
11602 }
11603 func rewriteValuegeneric_OpLess8U(v *Value) bool {
11604 v_1 := v.Args[1]
11605 v_0 := v.Args[0]
11606 b := v.Block
11607
11608
11609 for {
11610 if v_0.Op != OpConst8 {
11611 break
11612 }
11613 c := auxIntToInt8(v_0.AuxInt)
11614 if v_1.Op != OpConst8 {
11615 break
11616 }
11617 d := auxIntToInt8(v_1.AuxInt)
11618 v.reset(OpConstBool)
11619 v.AuxInt = boolToAuxInt(uint8(c) < uint8(d))
11620 return true
11621 }
11622
11623
11624 for {
11625 x := v_0
11626 if v_1.Op != OpConst8 {
11627 break
11628 }
11629 t := v_1.Type
11630 if auxIntToInt8(v_1.AuxInt) != 1 {
11631 break
11632 }
11633 v.reset(OpEq8)
11634 v0 := b.NewValue0(v.Pos, OpConst8, t)
11635 v0.AuxInt = int8ToAuxInt(0)
11636 v.AddArg2(v0, x)
11637 return true
11638 }
11639
11640
11641 for {
11642 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
11643 break
11644 }
11645 v.reset(OpConstBool)
11646 v.AuxInt = boolToAuxInt(false)
11647 return true
11648 }
11649
11650
11651 for {
11652 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
11653 break
11654 }
11655 v.reset(OpConstBool)
11656 v.AuxInt = boolToAuxInt(false)
11657 return true
11658 }
11659
11660
11661 for {
11662 x := v_0
11663 if v_1.Op != OpConst8 {
11664 break
11665 }
11666 t := v_1.Type
11667 if auxIntToInt8(v_1.AuxInt) != 1 {
11668 break
11669 }
11670 v.reset(OpEq8)
11671 v0 := b.NewValue0(v.Pos, OpConst8, t)
11672 v0.AuxInt = int8ToAuxInt(0)
11673 v.AddArg2(x, v0)
11674 return true
11675 }
11676
11677
11678 for {
11679 if v_0.Op != OpConst8 {
11680 break
11681 }
11682 t := v_0.Type
11683 if auxIntToInt8(v_0.AuxInt) != -2 {
11684 break
11685 }
11686 x := v_1
11687 v.reset(OpEq8)
11688 v0 := b.NewValue0(v.Pos, OpConst8, t)
11689 v0.AuxInt = int8ToAuxInt(-1)
11690 v.AddArg2(x, v0)
11691 return true
11692 }
11693 return false
11694 }
11695 func rewriteValuegeneric_OpLoad(v *Value) bool {
11696 v_1 := v.Args[1]
11697 v_0 := v.Args[0]
11698 b := v.Block
11699
11700
11701
11702 for {
11703 t1 := v.Type
11704 p1 := v_0
11705 if v_1.Op != OpStore {
11706 break
11707 }
11708 t2 := auxToType(v_1.Aux)
11709 x := v_1.Args[1]
11710 p2 := v_1.Args[0]
11711 if !(isSamePtr(p1, p2) && copyCompatibleType(t1, x.Type) && t1.Size() == t2.Size()) {
11712 break
11713 }
11714 v.copyOf(x)
11715 return true
11716 }
11717
11718
11719
11720 for {
11721 t1 := v.Type
11722 p1 := v_0
11723 if v_1.Op != OpStore {
11724 break
11725 }
11726 t2 := auxToType(v_1.Aux)
11727 _ = v_1.Args[2]
11728 p2 := v_1.Args[0]
11729 v_1_2 := v_1.Args[2]
11730 if v_1_2.Op != OpStore {
11731 break
11732 }
11733 t3 := auxToType(v_1_2.Aux)
11734 x := v_1_2.Args[1]
11735 p3 := v_1_2.Args[0]
11736 if !(isSamePtr(p1, p3) && copyCompatibleType(t1, x.Type) && t1.Size() == t3.Size() && disjoint(p3, t3.Size(), p2, t2.Size())) {
11737 break
11738 }
11739 v.copyOf(x)
11740 return true
11741 }
11742
11743
11744
11745 for {
11746 t1 := v.Type
11747 p1 := v_0
11748 if v_1.Op != OpStore {
11749 break
11750 }
11751 t2 := auxToType(v_1.Aux)
11752 _ = v_1.Args[2]
11753 p2 := v_1.Args[0]
11754 v_1_2 := v_1.Args[2]
11755 if v_1_2.Op != OpStore {
11756 break
11757 }
11758 t3 := auxToType(v_1_2.Aux)
11759 _ = v_1_2.Args[2]
11760 p3 := v_1_2.Args[0]
11761 v_1_2_2 := v_1_2.Args[2]
11762 if v_1_2_2.Op != OpStore {
11763 break
11764 }
11765 t4 := auxToType(v_1_2_2.Aux)
11766 x := v_1_2_2.Args[1]
11767 p4 := v_1_2_2.Args[0]
11768 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())) {
11769 break
11770 }
11771 v.copyOf(x)
11772 return true
11773 }
11774
11775
11776
11777 for {
11778 t1 := v.Type
11779 p1 := v_0
11780 if v_1.Op != OpStore {
11781 break
11782 }
11783 t2 := auxToType(v_1.Aux)
11784 _ = v_1.Args[2]
11785 p2 := v_1.Args[0]
11786 v_1_2 := v_1.Args[2]
11787 if v_1_2.Op != OpStore {
11788 break
11789 }
11790 t3 := auxToType(v_1_2.Aux)
11791 _ = v_1_2.Args[2]
11792 p3 := v_1_2.Args[0]
11793 v_1_2_2 := v_1_2.Args[2]
11794 if v_1_2_2.Op != OpStore {
11795 break
11796 }
11797 t4 := auxToType(v_1_2_2.Aux)
11798 _ = v_1_2_2.Args[2]
11799 p4 := v_1_2_2.Args[0]
11800 v_1_2_2_2 := v_1_2_2.Args[2]
11801 if v_1_2_2_2.Op != OpStore {
11802 break
11803 }
11804 t5 := auxToType(v_1_2_2_2.Aux)
11805 x := v_1_2_2_2.Args[1]
11806 p5 := v_1_2_2_2.Args[0]
11807 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())) {
11808 break
11809 }
11810 v.copyOf(x)
11811 return true
11812 }
11813
11814
11815
11816 for {
11817 t1 := v.Type
11818 p1 := v_0
11819 if v_1.Op != OpStore {
11820 break
11821 }
11822 t2 := auxToType(v_1.Aux)
11823 _ = v_1.Args[1]
11824 p2 := v_1.Args[0]
11825 v_1_1 := v_1.Args[1]
11826 if v_1_1.Op != OpConst64 {
11827 break
11828 }
11829 x := auxIntToInt64(v_1_1.AuxInt)
11830 if !(isSamePtr(p1, p2) && t2.Size() == 8 && is64BitFloat(t1) && !math.IsNaN(math.Float64frombits(uint64(x)))) {
11831 break
11832 }
11833 v.reset(OpConst64F)
11834 v.AuxInt = float64ToAuxInt(math.Float64frombits(uint64(x)))
11835 return true
11836 }
11837
11838
11839
11840 for {
11841 t1 := v.Type
11842 p1 := v_0
11843 if v_1.Op != OpStore {
11844 break
11845 }
11846 t2 := auxToType(v_1.Aux)
11847 _ = v_1.Args[1]
11848 p2 := v_1.Args[0]
11849 v_1_1 := v_1.Args[1]
11850 if v_1_1.Op != OpConst32 {
11851 break
11852 }
11853 x := auxIntToInt32(v_1_1.AuxInt)
11854 if !(isSamePtr(p1, p2) && t2.Size() == 4 && is32BitFloat(t1) && !math.IsNaN(float64(math.Float32frombits(uint32(x))))) {
11855 break
11856 }
11857 v.reset(OpConst32F)
11858 v.AuxInt = float32ToAuxInt(math.Float32frombits(uint32(x)))
11859 return true
11860 }
11861
11862
11863
11864 for {
11865 t1 := v.Type
11866 p1 := v_0
11867 if v_1.Op != OpStore {
11868 break
11869 }
11870 t2 := auxToType(v_1.Aux)
11871 _ = v_1.Args[1]
11872 p2 := v_1.Args[0]
11873 v_1_1 := v_1.Args[1]
11874 if v_1_1.Op != OpConst64F {
11875 break
11876 }
11877 x := auxIntToFloat64(v_1_1.AuxInt)
11878 if !(isSamePtr(p1, p2) && t2.Size() == 8 && is64BitInt(t1)) {
11879 break
11880 }
11881 v.reset(OpConst64)
11882 v.AuxInt = int64ToAuxInt(int64(math.Float64bits(x)))
11883 return true
11884 }
11885
11886
11887
11888 for {
11889 t1 := v.Type
11890 p1 := v_0
11891 if v_1.Op != OpStore {
11892 break
11893 }
11894 t2 := auxToType(v_1.Aux)
11895 _ = v_1.Args[1]
11896 p2 := v_1.Args[0]
11897 v_1_1 := v_1.Args[1]
11898 if v_1_1.Op != OpConst32F {
11899 break
11900 }
11901 x := auxIntToFloat32(v_1_1.AuxInt)
11902 if !(isSamePtr(p1, p2) && t2.Size() == 4 && is32BitInt(t1)) {
11903 break
11904 }
11905 v.reset(OpConst32)
11906 v.AuxInt = int32ToAuxInt(int32(math.Float32bits(x)))
11907 return true
11908 }
11909
11910
11911
11912 for {
11913 t1 := v.Type
11914 op := v_0
11915 if op.Op != OpOffPtr {
11916 break
11917 }
11918 o1 := auxIntToInt64(op.AuxInt)
11919 p1 := op.Args[0]
11920 if v_1.Op != OpStore {
11921 break
11922 }
11923 t2 := auxToType(v_1.Aux)
11924 _ = v_1.Args[2]
11925 p2 := v_1.Args[0]
11926 mem := v_1.Args[2]
11927 if mem.Op != OpZero {
11928 break
11929 }
11930 n := auxIntToInt64(mem.AuxInt)
11931 p3 := mem.Args[0]
11932 if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p3) && CanSSA(t1) && disjoint(op, t1.Size(), p2, t2.Size())) {
11933 break
11934 }
11935 b = mem.Block
11936 v0 := b.NewValue0(v.Pos, OpLoad, t1)
11937 v.copyOf(v0)
11938 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
11939 v1.AuxInt = int64ToAuxInt(o1)
11940 v1.AddArg(p3)
11941 v0.AddArg2(v1, mem)
11942 return true
11943 }
11944
11945
11946
11947 for {
11948 t1 := v.Type
11949 op := v_0
11950 if op.Op != OpOffPtr {
11951 break
11952 }
11953 o1 := auxIntToInt64(op.AuxInt)
11954 p1 := op.Args[0]
11955 if v_1.Op != OpStore {
11956 break
11957 }
11958 t2 := auxToType(v_1.Aux)
11959 _ = v_1.Args[2]
11960 p2 := v_1.Args[0]
11961 v_1_2 := v_1.Args[2]
11962 if v_1_2.Op != OpStore {
11963 break
11964 }
11965 t3 := auxToType(v_1_2.Aux)
11966 _ = v_1_2.Args[2]
11967 p3 := v_1_2.Args[0]
11968 mem := v_1_2.Args[2]
11969 if mem.Op != OpZero {
11970 break
11971 }
11972 n := auxIntToInt64(mem.AuxInt)
11973 p4 := mem.Args[0]
11974 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())) {
11975 break
11976 }
11977 b = mem.Block
11978 v0 := b.NewValue0(v.Pos, OpLoad, t1)
11979 v.copyOf(v0)
11980 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
11981 v1.AuxInt = int64ToAuxInt(o1)
11982 v1.AddArg(p4)
11983 v0.AddArg2(v1, mem)
11984 return true
11985 }
11986
11987
11988
11989 for {
11990 t1 := v.Type
11991 op := v_0
11992 if op.Op != OpOffPtr {
11993 break
11994 }
11995 o1 := auxIntToInt64(op.AuxInt)
11996 p1 := op.Args[0]
11997 if v_1.Op != OpStore {
11998 break
11999 }
12000 t2 := auxToType(v_1.Aux)
12001 _ = v_1.Args[2]
12002 p2 := v_1.Args[0]
12003 v_1_2 := v_1.Args[2]
12004 if v_1_2.Op != OpStore {
12005 break
12006 }
12007 t3 := auxToType(v_1_2.Aux)
12008 _ = v_1_2.Args[2]
12009 p3 := v_1_2.Args[0]
12010 v_1_2_2 := v_1_2.Args[2]
12011 if v_1_2_2.Op != OpStore {
12012 break
12013 }
12014 t4 := auxToType(v_1_2_2.Aux)
12015 _ = v_1_2_2.Args[2]
12016 p4 := v_1_2_2.Args[0]
12017 mem := v_1_2_2.Args[2]
12018 if mem.Op != OpZero {
12019 break
12020 }
12021 n := auxIntToInt64(mem.AuxInt)
12022 p5 := mem.Args[0]
12023 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())) {
12024 break
12025 }
12026 b = mem.Block
12027 v0 := b.NewValue0(v.Pos, OpLoad, t1)
12028 v.copyOf(v0)
12029 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
12030 v1.AuxInt = int64ToAuxInt(o1)
12031 v1.AddArg(p5)
12032 v0.AddArg2(v1, mem)
12033 return true
12034 }
12035
12036
12037
12038 for {
12039 t1 := v.Type
12040 op := v_0
12041 if op.Op != OpOffPtr {
12042 break
12043 }
12044 o1 := auxIntToInt64(op.AuxInt)
12045 p1 := op.Args[0]
12046 if v_1.Op != OpStore {
12047 break
12048 }
12049 t2 := auxToType(v_1.Aux)
12050 _ = v_1.Args[2]
12051 p2 := v_1.Args[0]
12052 v_1_2 := v_1.Args[2]
12053 if v_1_2.Op != OpStore {
12054 break
12055 }
12056 t3 := auxToType(v_1_2.Aux)
12057 _ = v_1_2.Args[2]
12058 p3 := v_1_2.Args[0]
12059 v_1_2_2 := v_1_2.Args[2]
12060 if v_1_2_2.Op != OpStore {
12061 break
12062 }
12063 t4 := auxToType(v_1_2_2.Aux)
12064 _ = v_1_2_2.Args[2]
12065 p4 := v_1_2_2.Args[0]
12066 v_1_2_2_2 := v_1_2_2.Args[2]
12067 if v_1_2_2_2.Op != OpStore {
12068 break
12069 }
12070 t5 := auxToType(v_1_2_2_2.Aux)
12071 _ = v_1_2_2_2.Args[2]
12072 p5 := v_1_2_2_2.Args[0]
12073 mem := v_1_2_2_2.Args[2]
12074 if mem.Op != OpZero {
12075 break
12076 }
12077 n := auxIntToInt64(mem.AuxInt)
12078 p6 := mem.Args[0]
12079 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())) {
12080 break
12081 }
12082 b = mem.Block
12083 v0 := b.NewValue0(v.Pos, OpLoad, t1)
12084 v.copyOf(v0)
12085 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
12086 v1.AuxInt = int64ToAuxInt(o1)
12087 v1.AddArg(p6)
12088 v0.AddArg2(v1, mem)
12089 return true
12090 }
12091
12092
12093
12094 for {
12095 t1 := v.Type
12096 if v_0.Op != OpOffPtr {
12097 break
12098 }
12099 o := auxIntToInt64(v_0.AuxInt)
12100 p1 := v_0.Args[0]
12101 if v_1.Op != OpZero {
12102 break
12103 }
12104 n := auxIntToInt64(v_1.AuxInt)
12105 p2 := v_1.Args[0]
12106 if !(t1.IsBoolean() && isSamePtr(p1, p2) && n >= o+1) {
12107 break
12108 }
12109 v.reset(OpConstBool)
12110 v.AuxInt = boolToAuxInt(false)
12111 return true
12112 }
12113
12114
12115
12116 for {
12117 t1 := v.Type
12118 if v_0.Op != OpOffPtr {
12119 break
12120 }
12121 o := auxIntToInt64(v_0.AuxInt)
12122 p1 := v_0.Args[0]
12123 if v_1.Op != OpZero {
12124 break
12125 }
12126 n := auxIntToInt64(v_1.AuxInt)
12127 p2 := v_1.Args[0]
12128 if !(is8BitInt(t1) && isSamePtr(p1, p2) && n >= o+1) {
12129 break
12130 }
12131 v.reset(OpConst8)
12132 v.AuxInt = int8ToAuxInt(0)
12133 return true
12134 }
12135
12136
12137
12138 for {
12139 t1 := v.Type
12140 if v_0.Op != OpOffPtr {
12141 break
12142 }
12143 o := auxIntToInt64(v_0.AuxInt)
12144 p1 := v_0.Args[0]
12145 if v_1.Op != OpZero {
12146 break
12147 }
12148 n := auxIntToInt64(v_1.AuxInt)
12149 p2 := v_1.Args[0]
12150 if !(is16BitInt(t1) && isSamePtr(p1, p2) && n >= o+2) {
12151 break
12152 }
12153 v.reset(OpConst16)
12154 v.AuxInt = int16ToAuxInt(0)
12155 return true
12156 }
12157
12158
12159
12160 for {
12161 t1 := v.Type
12162 if v_0.Op != OpOffPtr {
12163 break
12164 }
12165 o := auxIntToInt64(v_0.AuxInt)
12166 p1 := v_0.Args[0]
12167 if v_1.Op != OpZero {
12168 break
12169 }
12170 n := auxIntToInt64(v_1.AuxInt)
12171 p2 := v_1.Args[0]
12172 if !(is32BitInt(t1) && isSamePtr(p1, p2) && n >= o+4) {
12173 break
12174 }
12175 v.reset(OpConst32)
12176 v.AuxInt = int32ToAuxInt(0)
12177 return true
12178 }
12179
12180
12181
12182 for {
12183 t1 := v.Type
12184 if v_0.Op != OpOffPtr {
12185 break
12186 }
12187 o := auxIntToInt64(v_0.AuxInt)
12188 p1 := v_0.Args[0]
12189 if v_1.Op != OpZero {
12190 break
12191 }
12192 n := auxIntToInt64(v_1.AuxInt)
12193 p2 := v_1.Args[0]
12194 if !(is64BitInt(t1) && isSamePtr(p1, p2) && n >= o+8) {
12195 break
12196 }
12197 v.reset(OpConst64)
12198 v.AuxInt = int64ToAuxInt(0)
12199 return true
12200 }
12201
12202
12203
12204 for {
12205 t1 := v.Type
12206 if v_0.Op != OpOffPtr {
12207 break
12208 }
12209 o := auxIntToInt64(v_0.AuxInt)
12210 p1 := v_0.Args[0]
12211 if v_1.Op != OpZero {
12212 break
12213 }
12214 n := auxIntToInt64(v_1.AuxInt)
12215 p2 := v_1.Args[0]
12216 if !(is32BitFloat(t1) && isSamePtr(p1, p2) && n >= o+4) {
12217 break
12218 }
12219 v.reset(OpConst32F)
12220 v.AuxInt = float32ToAuxInt(0)
12221 return true
12222 }
12223
12224
12225
12226 for {
12227 t1 := v.Type
12228 if v_0.Op != OpOffPtr {
12229 break
12230 }
12231 o := auxIntToInt64(v_0.AuxInt)
12232 p1 := v_0.Args[0]
12233 if v_1.Op != OpZero {
12234 break
12235 }
12236 n := auxIntToInt64(v_1.AuxInt)
12237 p2 := v_1.Args[0]
12238 if !(is64BitFloat(t1) && isSamePtr(p1, p2) && n >= o+8) {
12239 break
12240 }
12241 v.reset(OpConst64F)
12242 v.AuxInt = float64ToAuxInt(0)
12243 return true
12244 }
12245
12246
12247
12248 for {
12249 t := v.Type
12250 if !(t.IsStruct() && CanSSA(t)) {
12251 break
12252 }
12253 v.copyOf(rewriteStructLoad(v))
12254 return true
12255 }
12256
12257
12258
12259 for {
12260 t := v.Type
12261 if !(t.IsArray() && t.NumElem() == 0) {
12262 break
12263 }
12264 v.reset(OpArrayMake0)
12265 return true
12266 }
12267
12268
12269
12270 for {
12271 t := v.Type
12272 ptr := v_0
12273 mem := v_1
12274 if !(t.IsArray() && t.NumElem() == 1 && CanSSA(t)) {
12275 break
12276 }
12277 v.reset(OpArrayMake1)
12278 v0 := b.NewValue0(v.Pos, OpLoad, t.Elem())
12279 v0.AddArg2(ptr, mem)
12280 v.AddArg(v0)
12281 return true
12282 }
12283
12284
12285
12286 for {
12287 if v_0.Op != OpAddr {
12288 break
12289 }
12290 s := auxToSym(v_0.Aux)
12291 sb := v_0.Args[0]
12292 if !(isFixedLoad(v, s, 0)) {
12293 break
12294 }
12295 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
12296 return true
12297 }
12298
12299
12300
12301 for {
12302 if v_0.Op != OpConvert {
12303 break
12304 }
12305 v_0_0 := v_0.Args[0]
12306 if v_0_0.Op != OpAddr {
12307 break
12308 }
12309 s := auxToSym(v_0_0.Aux)
12310 sb := v_0_0.Args[0]
12311 if !(isFixedLoad(v, s, 0)) {
12312 break
12313 }
12314 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
12315 return true
12316 }
12317
12318
12319
12320 for {
12321 if v_0.Op != OpITab {
12322 break
12323 }
12324 v_0_0 := v_0.Args[0]
12325 if v_0_0.Op != OpIMake {
12326 break
12327 }
12328 v_0_0_0 := v_0_0.Args[0]
12329 if v_0_0_0.Op != OpAddr {
12330 break
12331 }
12332 s := auxToSym(v_0_0_0.Aux)
12333 sb := v_0_0_0.Args[0]
12334 if !(isFixedLoad(v, s, 0)) {
12335 break
12336 }
12337 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
12338 return true
12339 }
12340
12341
12342
12343 for {
12344 if v_0.Op != OpITab {
12345 break
12346 }
12347 v_0_0 := v_0.Args[0]
12348 if v_0_0.Op != OpIMake {
12349 break
12350 }
12351 v_0_0_0 := v_0_0.Args[0]
12352 if v_0_0_0.Op != OpConvert {
12353 break
12354 }
12355 v_0_0_0_0 := v_0_0_0.Args[0]
12356 if v_0_0_0_0.Op != OpAddr {
12357 break
12358 }
12359 s := auxToSym(v_0_0_0_0.Aux)
12360 sb := v_0_0_0_0.Args[0]
12361 if !(isFixedLoad(v, s, 0)) {
12362 break
12363 }
12364 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
12365 return true
12366 }
12367
12368
12369
12370 for {
12371 if v_0.Op != OpOffPtr {
12372 break
12373 }
12374 off := auxIntToInt64(v_0.AuxInt)
12375 v_0_0 := v_0.Args[0]
12376 if v_0_0.Op != OpAddr {
12377 break
12378 }
12379 s := auxToSym(v_0_0.Aux)
12380 sb := v_0_0.Args[0]
12381 if !(isFixedLoad(v, s, off)) {
12382 break
12383 }
12384 v.copyOf(rewriteFixedLoad(v, s, sb, off))
12385 return true
12386 }
12387
12388
12389
12390 for {
12391 if v_0.Op != OpOffPtr {
12392 break
12393 }
12394 off := auxIntToInt64(v_0.AuxInt)
12395 v_0_0 := v_0.Args[0]
12396 if v_0_0.Op != OpConvert {
12397 break
12398 }
12399 v_0_0_0 := v_0_0.Args[0]
12400 if v_0_0_0.Op != OpAddr {
12401 break
12402 }
12403 s := auxToSym(v_0_0_0.Aux)
12404 sb := v_0_0_0.Args[0]
12405 if !(isFixedLoad(v, s, off)) {
12406 break
12407 }
12408 v.copyOf(rewriteFixedLoad(v, s, sb, off))
12409 return true
12410 }
12411
12412
12413
12414 for {
12415 if v_0.Op != OpOffPtr {
12416 break
12417 }
12418 off := auxIntToInt64(v_0.AuxInt)
12419 v_0_0 := v_0.Args[0]
12420 if v_0_0.Op != OpITab {
12421 break
12422 }
12423 v_0_0_0 := v_0_0.Args[0]
12424 if v_0_0_0.Op != OpIMake {
12425 break
12426 }
12427 v_0_0_0_0 := v_0_0_0.Args[0]
12428 if v_0_0_0_0.Op != OpAddr {
12429 break
12430 }
12431 s := auxToSym(v_0_0_0_0.Aux)
12432 sb := v_0_0_0_0.Args[0]
12433 if !(isFixedLoad(v, s, off)) {
12434 break
12435 }
12436 v.copyOf(rewriteFixedLoad(v, s, sb, off))
12437 return true
12438 }
12439
12440
12441
12442 for {
12443 if v_0.Op != OpOffPtr {
12444 break
12445 }
12446 off := auxIntToInt64(v_0.AuxInt)
12447 v_0_0 := v_0.Args[0]
12448 if v_0_0.Op != OpITab {
12449 break
12450 }
12451 v_0_0_0 := v_0_0.Args[0]
12452 if v_0_0_0.Op != OpIMake {
12453 break
12454 }
12455 v_0_0_0_0 := v_0_0_0.Args[0]
12456 if v_0_0_0_0.Op != OpConvert {
12457 break
12458 }
12459 v_0_0_0_0_0 := v_0_0_0_0.Args[0]
12460 if v_0_0_0_0_0.Op != OpAddr {
12461 break
12462 }
12463 s := auxToSym(v_0_0_0_0_0.Aux)
12464 sb := v_0_0_0_0_0.Args[0]
12465 if !(isFixedLoad(v, s, off)) {
12466 break
12467 }
12468 v.copyOf(rewriteFixedLoad(v, s, sb, off))
12469 return true
12470 }
12471 return false
12472 }
12473 func rewriteValuegeneric_OpLsh16x16(v *Value) bool {
12474 v_1 := v.Args[1]
12475 v_0 := v.Args[0]
12476 b := v.Block
12477
12478
12479 for {
12480 t := v.Type
12481 x := v_0
12482 if v_1.Op != OpConst16 {
12483 break
12484 }
12485 c := auxIntToInt16(v_1.AuxInt)
12486 v.reset(OpLsh16x64)
12487 v0 := b.NewValue0(v.Pos, OpConst64, t)
12488 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
12489 v.AddArg2(x, v0)
12490 return true
12491 }
12492
12493
12494 for {
12495 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
12496 break
12497 }
12498 v.reset(OpConst16)
12499 v.AuxInt = int16ToAuxInt(0)
12500 return true
12501 }
12502
12503
12504
12505 for {
12506 if auxIntToBool(v.AuxInt) != false {
12507 break
12508 }
12509 x := v_0
12510 con := v_1
12511 if con.Op != OpConst16 {
12512 break
12513 }
12514 c := auxIntToInt16(con.AuxInt)
12515 if !(0 < c && c < 16) {
12516 break
12517 }
12518 v.reset(OpLsh16x16)
12519 v.AuxInt = boolToAuxInt(true)
12520 v.AddArg2(x, con)
12521 return true
12522 }
12523 return false
12524 }
12525 func rewriteValuegeneric_OpLsh16x32(v *Value) bool {
12526 v_1 := v.Args[1]
12527 v_0 := v.Args[0]
12528 b := v.Block
12529
12530
12531 for {
12532 t := v.Type
12533 x := v_0
12534 if v_1.Op != OpConst32 {
12535 break
12536 }
12537 c := auxIntToInt32(v_1.AuxInt)
12538 v.reset(OpLsh16x64)
12539 v0 := b.NewValue0(v.Pos, OpConst64, t)
12540 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
12541 v.AddArg2(x, v0)
12542 return true
12543 }
12544
12545
12546 for {
12547 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
12548 break
12549 }
12550 v.reset(OpConst16)
12551 v.AuxInt = int16ToAuxInt(0)
12552 return true
12553 }
12554
12555
12556
12557 for {
12558 if auxIntToBool(v.AuxInt) != false {
12559 break
12560 }
12561 x := v_0
12562 con := v_1
12563 if con.Op != OpConst32 {
12564 break
12565 }
12566 c := auxIntToInt32(con.AuxInt)
12567 if !(0 < c && c < 16) {
12568 break
12569 }
12570 v.reset(OpLsh16x32)
12571 v.AuxInt = boolToAuxInt(true)
12572 v.AddArg2(x, con)
12573 return true
12574 }
12575 return false
12576 }
12577 func rewriteValuegeneric_OpLsh16x64(v *Value) bool {
12578 v_1 := v.Args[1]
12579 v_0 := v.Args[0]
12580 b := v.Block
12581 typ := &b.Func.Config.Types
12582
12583
12584 for {
12585 if v_0.Op != OpConst16 {
12586 break
12587 }
12588 c := auxIntToInt16(v_0.AuxInt)
12589 if v_1.Op != OpConst64 {
12590 break
12591 }
12592 d := auxIntToInt64(v_1.AuxInt)
12593 v.reset(OpConst16)
12594 v.AuxInt = int16ToAuxInt(c << uint64(d))
12595 return true
12596 }
12597
12598
12599 for {
12600 x := v_0
12601 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
12602 break
12603 }
12604 v.copyOf(x)
12605 return true
12606 }
12607
12608
12609 for {
12610 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
12611 break
12612 }
12613 v.reset(OpConst16)
12614 v.AuxInt = int16ToAuxInt(0)
12615 return true
12616 }
12617
12618
12619
12620 for {
12621 if v_1.Op != OpConst64 {
12622 break
12623 }
12624 c := auxIntToInt64(v_1.AuxInt)
12625 if !(uint64(c) >= 16) {
12626 break
12627 }
12628 v.reset(OpConst16)
12629 v.AuxInt = int16ToAuxInt(0)
12630 return true
12631 }
12632
12633
12634
12635 for {
12636 t := v.Type
12637 if v_0.Op != OpLsh16x64 {
12638 break
12639 }
12640 _ = v_0.Args[1]
12641 x := v_0.Args[0]
12642 v_0_1 := v_0.Args[1]
12643 if v_0_1.Op != OpConst64 {
12644 break
12645 }
12646 c := auxIntToInt64(v_0_1.AuxInt)
12647 if v_1.Op != OpConst64 {
12648 break
12649 }
12650 d := auxIntToInt64(v_1.AuxInt)
12651 if !(!uaddOvf(c, d)) {
12652 break
12653 }
12654 v.reset(OpLsh16x64)
12655 v0 := b.NewValue0(v.Pos, OpConst64, t)
12656 v0.AuxInt = int64ToAuxInt(c + d)
12657 v.AddArg2(x, v0)
12658 return true
12659 }
12660
12661
12662
12663 for {
12664 i := v_0
12665 if i.Op != OpRsh16x64 {
12666 break
12667 }
12668 _ = i.Args[1]
12669 x := i.Args[0]
12670 i_1 := i.Args[1]
12671 if i_1.Op != OpConst64 {
12672 break
12673 }
12674 c := auxIntToInt64(i_1.AuxInt)
12675 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
12676 break
12677 }
12678 v.reset(OpAnd16)
12679 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
12680 v0.AuxInt = int16ToAuxInt(int16(-1) << c)
12681 v.AddArg2(x, v0)
12682 return true
12683 }
12684
12685
12686
12687 for {
12688 i := v_0
12689 if i.Op != OpRsh16Ux64 {
12690 break
12691 }
12692 _ = i.Args[1]
12693 x := i.Args[0]
12694 i_1 := i.Args[1]
12695 if i_1.Op != OpConst64 {
12696 break
12697 }
12698 c := auxIntToInt64(i_1.AuxInt)
12699 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
12700 break
12701 }
12702 v.reset(OpAnd16)
12703 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
12704 v0.AuxInt = int16ToAuxInt(int16(-1) << c)
12705 v.AddArg2(x, v0)
12706 return true
12707 }
12708
12709
12710
12711 for {
12712 if v_0.Op != OpRsh16Ux64 {
12713 break
12714 }
12715 _ = v_0.Args[1]
12716 v_0_0 := v_0.Args[0]
12717 if v_0_0.Op != OpLsh16x64 {
12718 break
12719 }
12720 _ = v_0_0.Args[1]
12721 x := v_0_0.Args[0]
12722 v_0_0_1 := v_0_0.Args[1]
12723 if v_0_0_1.Op != OpConst64 {
12724 break
12725 }
12726 c1 := auxIntToInt64(v_0_0_1.AuxInt)
12727 v_0_1 := v_0.Args[1]
12728 if v_0_1.Op != OpConst64 {
12729 break
12730 }
12731 c2 := auxIntToInt64(v_0_1.AuxInt)
12732 if v_1.Op != OpConst64 {
12733 break
12734 }
12735 c3 := auxIntToInt64(v_1.AuxInt)
12736 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
12737 break
12738 }
12739 v.reset(OpLsh16x64)
12740 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
12741 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
12742 v.AddArg2(x, v0)
12743 return true
12744 }
12745
12746
12747
12748 for {
12749 if v_0.Op != OpAnd16 {
12750 break
12751 }
12752 _ = v_0.Args[1]
12753 v_0_0 := v_0.Args[0]
12754 v_0_1 := v_0.Args[1]
12755 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
12756 if v_0_0.Op != OpRsh16x64 {
12757 continue
12758 }
12759 t := v_0_0.Type
12760 _ = v_0_0.Args[1]
12761 x := v_0_0.Args[0]
12762 v_0_0_1 := v_0_0.Args[1]
12763 if v_0_0_1.Op != OpConst64 {
12764 continue
12765 }
12766 t2 := v_0_0_1.Type
12767 c := auxIntToInt64(v_0_0_1.AuxInt)
12768 if v_0_1.Op != OpConst16 {
12769 continue
12770 }
12771 d := auxIntToInt16(v_0_1.AuxInt)
12772 if v_1.Op != OpConst64 {
12773 continue
12774 }
12775 e := auxIntToInt64(v_1.AuxInt)
12776 if !(c >= e) {
12777 continue
12778 }
12779 v.reset(OpAnd16)
12780 v0 := b.NewValue0(v.Pos, OpRsh16x64, t)
12781 v1 := b.NewValue0(v.Pos, OpConst64, t2)
12782 v1.AuxInt = int64ToAuxInt(c - e)
12783 v0.AddArg2(x, v1)
12784 v2 := b.NewValue0(v.Pos, OpConst16, t)
12785 v2.AuxInt = int16ToAuxInt(d << e)
12786 v.AddArg2(v0, v2)
12787 return true
12788 }
12789 break
12790 }
12791
12792
12793
12794 for {
12795 if v_0.Op != OpAnd16 {
12796 break
12797 }
12798 _ = v_0.Args[1]
12799 v_0_0 := v_0.Args[0]
12800 v_0_1 := v_0.Args[1]
12801 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
12802 if v_0_0.Op != OpRsh16Ux64 {
12803 continue
12804 }
12805 t := v_0_0.Type
12806 _ = v_0_0.Args[1]
12807 x := v_0_0.Args[0]
12808 v_0_0_1 := v_0_0.Args[1]
12809 if v_0_0_1.Op != OpConst64 {
12810 continue
12811 }
12812 t2 := v_0_0_1.Type
12813 c := auxIntToInt64(v_0_0_1.AuxInt)
12814 if v_0_1.Op != OpConst16 {
12815 continue
12816 }
12817 d := auxIntToInt16(v_0_1.AuxInt)
12818 if v_1.Op != OpConst64 {
12819 continue
12820 }
12821 e := auxIntToInt64(v_1.AuxInt)
12822 if !(c >= e) {
12823 continue
12824 }
12825 v.reset(OpAnd16)
12826 v0 := b.NewValue0(v.Pos, OpRsh16Ux64, t)
12827 v1 := b.NewValue0(v.Pos, OpConst64, t2)
12828 v1.AuxInt = int64ToAuxInt(c - e)
12829 v0.AddArg2(x, v1)
12830 v2 := b.NewValue0(v.Pos, OpConst16, t)
12831 v2.AuxInt = int16ToAuxInt(d << e)
12832 v.AddArg2(v0, v2)
12833 return true
12834 }
12835 break
12836 }
12837
12838
12839
12840 for {
12841 if v_0.Op != OpAnd16 {
12842 break
12843 }
12844 _ = v_0.Args[1]
12845 v_0_0 := v_0.Args[0]
12846 v_0_1 := v_0.Args[1]
12847 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
12848 if v_0_0.Op != OpRsh16x64 {
12849 continue
12850 }
12851 t := v_0_0.Type
12852 _ = v_0_0.Args[1]
12853 x := v_0_0.Args[0]
12854 v_0_0_1 := v_0_0.Args[1]
12855 if v_0_0_1.Op != OpConst64 {
12856 continue
12857 }
12858 t2 := v_0_0_1.Type
12859 c := auxIntToInt64(v_0_0_1.AuxInt)
12860 if v_0_1.Op != OpConst16 {
12861 continue
12862 }
12863 d := auxIntToInt16(v_0_1.AuxInt)
12864 if v_1.Op != OpConst64 {
12865 continue
12866 }
12867 e := auxIntToInt64(v_1.AuxInt)
12868 if !(c < e) {
12869 continue
12870 }
12871 v.reset(OpAnd16)
12872 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
12873 v1 := b.NewValue0(v.Pos, OpConst64, t2)
12874 v1.AuxInt = int64ToAuxInt(e - c)
12875 v0.AddArg2(x, v1)
12876 v2 := b.NewValue0(v.Pos, OpConst16, t)
12877 v2.AuxInt = int16ToAuxInt(d << e)
12878 v.AddArg2(v0, v2)
12879 return true
12880 }
12881 break
12882 }
12883
12884
12885
12886 for {
12887 if v_0.Op != OpAnd16 {
12888 break
12889 }
12890 _ = v_0.Args[1]
12891 v_0_0 := v_0.Args[0]
12892 v_0_1 := v_0.Args[1]
12893 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
12894 if v_0_0.Op != OpRsh16Ux64 {
12895 continue
12896 }
12897 t := v_0_0.Type
12898 _ = v_0_0.Args[1]
12899 x := v_0_0.Args[0]
12900 v_0_0_1 := v_0_0.Args[1]
12901 if v_0_0_1.Op != OpConst64 {
12902 continue
12903 }
12904 t2 := v_0_0_1.Type
12905 c := auxIntToInt64(v_0_0_1.AuxInt)
12906 if v_0_1.Op != OpConst16 {
12907 continue
12908 }
12909 d := auxIntToInt16(v_0_1.AuxInt)
12910 if v_1.Op != OpConst64 {
12911 continue
12912 }
12913 e := auxIntToInt64(v_1.AuxInt)
12914 if !(c < e) {
12915 continue
12916 }
12917 v.reset(OpAnd16)
12918 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
12919 v1 := b.NewValue0(v.Pos, OpConst64, t2)
12920 v1.AuxInt = int64ToAuxInt(e - c)
12921 v0.AddArg2(x, v1)
12922 v2 := b.NewValue0(v.Pos, OpConst16, t)
12923 v2.AuxInt = int16ToAuxInt(d << e)
12924 v.AddArg2(v0, v2)
12925 return true
12926 }
12927 break
12928 }
12929
12930
12931
12932 for {
12933 if auxIntToBool(v.AuxInt) != false {
12934 break
12935 }
12936 x := v_0
12937 con := v_1
12938 if con.Op != OpConst64 {
12939 break
12940 }
12941 c := auxIntToInt64(con.AuxInt)
12942 if !(0 < c && c < 16) {
12943 break
12944 }
12945 v.reset(OpLsh16x64)
12946 v.AuxInt = boolToAuxInt(true)
12947 v.AddArg2(x, con)
12948 return true
12949 }
12950 return false
12951 }
12952 func rewriteValuegeneric_OpLsh16x8(v *Value) bool {
12953 v_1 := v.Args[1]
12954 v_0 := v.Args[0]
12955 b := v.Block
12956
12957
12958 for {
12959 t := v.Type
12960 x := v_0
12961 if v_1.Op != OpConst8 {
12962 break
12963 }
12964 c := auxIntToInt8(v_1.AuxInt)
12965 v.reset(OpLsh16x64)
12966 v0 := b.NewValue0(v.Pos, OpConst64, t)
12967 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
12968 v.AddArg2(x, v0)
12969 return true
12970 }
12971
12972
12973 for {
12974 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
12975 break
12976 }
12977 v.reset(OpConst16)
12978 v.AuxInt = int16ToAuxInt(0)
12979 return true
12980 }
12981
12982
12983
12984 for {
12985 if auxIntToBool(v.AuxInt) != false {
12986 break
12987 }
12988 x := v_0
12989 con := v_1
12990 if con.Op != OpConst8 {
12991 break
12992 }
12993 c := auxIntToInt8(con.AuxInt)
12994 if !(0 < c && c < 16) {
12995 break
12996 }
12997 v.reset(OpLsh16x8)
12998 v.AuxInt = boolToAuxInt(true)
12999 v.AddArg2(x, con)
13000 return true
13001 }
13002 return false
13003 }
13004 func rewriteValuegeneric_OpLsh32x16(v *Value) bool {
13005 v_1 := v.Args[1]
13006 v_0 := v.Args[0]
13007 b := v.Block
13008
13009
13010 for {
13011 t := v.Type
13012 x := v_0
13013 if v_1.Op != OpConst16 {
13014 break
13015 }
13016 c := auxIntToInt16(v_1.AuxInt)
13017 v.reset(OpLsh32x64)
13018 v0 := b.NewValue0(v.Pos, OpConst64, t)
13019 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
13020 v.AddArg2(x, v0)
13021 return true
13022 }
13023
13024
13025 for {
13026 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
13027 break
13028 }
13029 v.reset(OpConst32)
13030 v.AuxInt = int32ToAuxInt(0)
13031 return true
13032 }
13033
13034
13035
13036 for {
13037 if auxIntToBool(v.AuxInt) != false {
13038 break
13039 }
13040 x := v_0
13041 con := v_1
13042 if con.Op != OpConst16 {
13043 break
13044 }
13045 c := auxIntToInt16(con.AuxInt)
13046 if !(0 < c && c < 32) {
13047 break
13048 }
13049 v.reset(OpLsh32x16)
13050 v.AuxInt = boolToAuxInt(true)
13051 v.AddArg2(x, con)
13052 return true
13053 }
13054 return false
13055 }
13056 func rewriteValuegeneric_OpLsh32x32(v *Value) bool {
13057 v_1 := v.Args[1]
13058 v_0 := v.Args[0]
13059 b := v.Block
13060
13061
13062 for {
13063 t := v.Type
13064 x := v_0
13065 if v_1.Op != OpConst32 {
13066 break
13067 }
13068 c := auxIntToInt32(v_1.AuxInt)
13069 v.reset(OpLsh32x64)
13070 v0 := b.NewValue0(v.Pos, OpConst64, t)
13071 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
13072 v.AddArg2(x, v0)
13073 return true
13074 }
13075
13076
13077 for {
13078 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
13079 break
13080 }
13081 v.reset(OpConst32)
13082 v.AuxInt = int32ToAuxInt(0)
13083 return true
13084 }
13085
13086
13087
13088 for {
13089 if auxIntToBool(v.AuxInt) != false {
13090 break
13091 }
13092 x := v_0
13093 con := v_1
13094 if con.Op != OpConst32 {
13095 break
13096 }
13097 c := auxIntToInt32(con.AuxInt)
13098 if !(0 < c && c < 32) {
13099 break
13100 }
13101 v.reset(OpLsh32x32)
13102 v.AuxInt = boolToAuxInt(true)
13103 v.AddArg2(x, con)
13104 return true
13105 }
13106 return false
13107 }
13108 func rewriteValuegeneric_OpLsh32x64(v *Value) bool {
13109 v_1 := v.Args[1]
13110 v_0 := v.Args[0]
13111 b := v.Block
13112 typ := &b.Func.Config.Types
13113
13114
13115 for {
13116 if v_0.Op != OpConst32 {
13117 break
13118 }
13119 c := auxIntToInt32(v_0.AuxInt)
13120 if v_1.Op != OpConst64 {
13121 break
13122 }
13123 d := auxIntToInt64(v_1.AuxInt)
13124 v.reset(OpConst32)
13125 v.AuxInt = int32ToAuxInt(c << uint64(d))
13126 return true
13127 }
13128
13129
13130 for {
13131 x := v_0
13132 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
13133 break
13134 }
13135 v.copyOf(x)
13136 return true
13137 }
13138
13139
13140 for {
13141 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
13142 break
13143 }
13144 v.reset(OpConst32)
13145 v.AuxInt = int32ToAuxInt(0)
13146 return true
13147 }
13148
13149
13150
13151 for {
13152 if v_1.Op != OpConst64 {
13153 break
13154 }
13155 c := auxIntToInt64(v_1.AuxInt)
13156 if !(uint64(c) >= 32) {
13157 break
13158 }
13159 v.reset(OpConst32)
13160 v.AuxInt = int32ToAuxInt(0)
13161 return true
13162 }
13163
13164
13165
13166 for {
13167 t := v.Type
13168 if v_0.Op != OpLsh32x64 {
13169 break
13170 }
13171 _ = v_0.Args[1]
13172 x := v_0.Args[0]
13173 v_0_1 := v_0.Args[1]
13174 if v_0_1.Op != OpConst64 {
13175 break
13176 }
13177 c := auxIntToInt64(v_0_1.AuxInt)
13178 if v_1.Op != OpConst64 {
13179 break
13180 }
13181 d := auxIntToInt64(v_1.AuxInt)
13182 if !(!uaddOvf(c, d)) {
13183 break
13184 }
13185 v.reset(OpLsh32x64)
13186 v0 := b.NewValue0(v.Pos, OpConst64, t)
13187 v0.AuxInt = int64ToAuxInt(c + d)
13188 v.AddArg2(x, v0)
13189 return true
13190 }
13191
13192
13193
13194 for {
13195 i := v_0
13196 if i.Op != OpRsh32x64 {
13197 break
13198 }
13199 _ = i.Args[1]
13200 x := i.Args[0]
13201 i_1 := i.Args[1]
13202 if i_1.Op != OpConst64 {
13203 break
13204 }
13205 c := auxIntToInt64(i_1.AuxInt)
13206 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
13207 break
13208 }
13209 v.reset(OpAnd32)
13210 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
13211 v0.AuxInt = int32ToAuxInt(int32(-1) << c)
13212 v.AddArg2(x, v0)
13213 return true
13214 }
13215
13216
13217
13218 for {
13219 i := v_0
13220 if i.Op != OpRsh32Ux64 {
13221 break
13222 }
13223 _ = i.Args[1]
13224 x := i.Args[0]
13225 i_1 := i.Args[1]
13226 if i_1.Op != OpConst64 {
13227 break
13228 }
13229 c := auxIntToInt64(i_1.AuxInt)
13230 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
13231 break
13232 }
13233 v.reset(OpAnd32)
13234 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
13235 v0.AuxInt = int32ToAuxInt(int32(-1) << c)
13236 v.AddArg2(x, v0)
13237 return true
13238 }
13239
13240
13241
13242 for {
13243 if v_0.Op != OpRsh32Ux64 {
13244 break
13245 }
13246 _ = v_0.Args[1]
13247 v_0_0 := v_0.Args[0]
13248 if v_0_0.Op != OpLsh32x64 {
13249 break
13250 }
13251 _ = v_0_0.Args[1]
13252 x := v_0_0.Args[0]
13253 v_0_0_1 := v_0_0.Args[1]
13254 if v_0_0_1.Op != OpConst64 {
13255 break
13256 }
13257 c1 := auxIntToInt64(v_0_0_1.AuxInt)
13258 v_0_1 := v_0.Args[1]
13259 if v_0_1.Op != OpConst64 {
13260 break
13261 }
13262 c2 := auxIntToInt64(v_0_1.AuxInt)
13263 if v_1.Op != OpConst64 {
13264 break
13265 }
13266 c3 := auxIntToInt64(v_1.AuxInt)
13267 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
13268 break
13269 }
13270 v.reset(OpLsh32x64)
13271 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
13272 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
13273 v.AddArg2(x, v0)
13274 return true
13275 }
13276
13277
13278
13279 for {
13280 if v_0.Op != OpAnd32 {
13281 break
13282 }
13283 _ = v_0.Args[1]
13284 v_0_0 := v_0.Args[0]
13285 v_0_1 := v_0.Args[1]
13286 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13287 if v_0_0.Op != OpRsh32x64 {
13288 continue
13289 }
13290 t := v_0_0.Type
13291 _ = v_0_0.Args[1]
13292 x := v_0_0.Args[0]
13293 v_0_0_1 := v_0_0.Args[1]
13294 if v_0_0_1.Op != OpConst64 {
13295 continue
13296 }
13297 t2 := v_0_0_1.Type
13298 c := auxIntToInt64(v_0_0_1.AuxInt)
13299 if v_0_1.Op != OpConst32 {
13300 continue
13301 }
13302 d := auxIntToInt32(v_0_1.AuxInt)
13303 if v_1.Op != OpConst64 {
13304 continue
13305 }
13306 e := auxIntToInt64(v_1.AuxInt)
13307 if !(c >= e) {
13308 continue
13309 }
13310 v.reset(OpAnd32)
13311 v0 := b.NewValue0(v.Pos, OpRsh32x64, t)
13312 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13313 v1.AuxInt = int64ToAuxInt(c - e)
13314 v0.AddArg2(x, v1)
13315 v2 := b.NewValue0(v.Pos, OpConst32, t)
13316 v2.AuxInt = int32ToAuxInt(d << e)
13317 v.AddArg2(v0, v2)
13318 return true
13319 }
13320 break
13321 }
13322
13323
13324
13325 for {
13326 if v_0.Op != OpAnd32 {
13327 break
13328 }
13329 _ = v_0.Args[1]
13330 v_0_0 := v_0.Args[0]
13331 v_0_1 := v_0.Args[1]
13332 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13333 if v_0_0.Op != OpRsh32Ux64 {
13334 continue
13335 }
13336 t := v_0_0.Type
13337 _ = v_0_0.Args[1]
13338 x := v_0_0.Args[0]
13339 v_0_0_1 := v_0_0.Args[1]
13340 if v_0_0_1.Op != OpConst64 {
13341 continue
13342 }
13343 t2 := v_0_0_1.Type
13344 c := auxIntToInt64(v_0_0_1.AuxInt)
13345 if v_0_1.Op != OpConst32 {
13346 continue
13347 }
13348 d := auxIntToInt32(v_0_1.AuxInt)
13349 if v_1.Op != OpConst64 {
13350 continue
13351 }
13352 e := auxIntToInt64(v_1.AuxInt)
13353 if !(c >= e) {
13354 continue
13355 }
13356 v.reset(OpAnd32)
13357 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, t)
13358 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13359 v1.AuxInt = int64ToAuxInt(c - e)
13360 v0.AddArg2(x, v1)
13361 v2 := b.NewValue0(v.Pos, OpConst32, t)
13362 v2.AuxInt = int32ToAuxInt(d << e)
13363 v.AddArg2(v0, v2)
13364 return true
13365 }
13366 break
13367 }
13368
13369
13370
13371 for {
13372 if v_0.Op != OpAnd32 {
13373 break
13374 }
13375 _ = v_0.Args[1]
13376 v_0_0 := v_0.Args[0]
13377 v_0_1 := v_0.Args[1]
13378 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13379 if v_0_0.Op != OpRsh32x64 {
13380 continue
13381 }
13382 t := v_0_0.Type
13383 _ = v_0_0.Args[1]
13384 x := v_0_0.Args[0]
13385 v_0_0_1 := v_0_0.Args[1]
13386 if v_0_0_1.Op != OpConst64 {
13387 continue
13388 }
13389 t2 := v_0_0_1.Type
13390 c := auxIntToInt64(v_0_0_1.AuxInt)
13391 if v_0_1.Op != OpConst32 {
13392 continue
13393 }
13394 d := auxIntToInt32(v_0_1.AuxInt)
13395 if v_1.Op != OpConst64 {
13396 continue
13397 }
13398 e := auxIntToInt64(v_1.AuxInt)
13399 if !(c < e) {
13400 continue
13401 }
13402 v.reset(OpAnd32)
13403 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
13404 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13405 v1.AuxInt = int64ToAuxInt(e - c)
13406 v0.AddArg2(x, v1)
13407 v2 := b.NewValue0(v.Pos, OpConst32, t)
13408 v2.AuxInt = int32ToAuxInt(d << e)
13409 v.AddArg2(v0, v2)
13410 return true
13411 }
13412 break
13413 }
13414
13415
13416
13417 for {
13418 if v_0.Op != OpAnd32 {
13419 break
13420 }
13421 _ = v_0.Args[1]
13422 v_0_0 := v_0.Args[0]
13423 v_0_1 := v_0.Args[1]
13424 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13425 if v_0_0.Op != OpRsh32Ux64 {
13426 continue
13427 }
13428 t := v_0_0.Type
13429 _ = v_0_0.Args[1]
13430 x := v_0_0.Args[0]
13431 v_0_0_1 := v_0_0.Args[1]
13432 if v_0_0_1.Op != OpConst64 {
13433 continue
13434 }
13435 t2 := v_0_0_1.Type
13436 c := auxIntToInt64(v_0_0_1.AuxInt)
13437 if v_0_1.Op != OpConst32 {
13438 continue
13439 }
13440 d := auxIntToInt32(v_0_1.AuxInt)
13441 if v_1.Op != OpConst64 {
13442 continue
13443 }
13444 e := auxIntToInt64(v_1.AuxInt)
13445 if !(c < e) {
13446 continue
13447 }
13448 v.reset(OpAnd32)
13449 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
13450 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13451 v1.AuxInt = int64ToAuxInt(e - c)
13452 v0.AddArg2(x, v1)
13453 v2 := b.NewValue0(v.Pos, OpConst32, t)
13454 v2.AuxInt = int32ToAuxInt(d << e)
13455 v.AddArg2(v0, v2)
13456 return true
13457 }
13458 break
13459 }
13460
13461
13462
13463 for {
13464 if auxIntToBool(v.AuxInt) != false {
13465 break
13466 }
13467 x := v_0
13468 con := v_1
13469 if con.Op != OpConst64 {
13470 break
13471 }
13472 c := auxIntToInt64(con.AuxInt)
13473 if !(0 < c && c < 32) {
13474 break
13475 }
13476 v.reset(OpLsh32x64)
13477 v.AuxInt = boolToAuxInt(true)
13478 v.AddArg2(x, con)
13479 return true
13480 }
13481 return false
13482 }
13483 func rewriteValuegeneric_OpLsh32x8(v *Value) bool {
13484 v_1 := v.Args[1]
13485 v_0 := v.Args[0]
13486 b := v.Block
13487
13488
13489 for {
13490 t := v.Type
13491 x := v_0
13492 if v_1.Op != OpConst8 {
13493 break
13494 }
13495 c := auxIntToInt8(v_1.AuxInt)
13496 v.reset(OpLsh32x64)
13497 v0 := b.NewValue0(v.Pos, OpConst64, t)
13498 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
13499 v.AddArg2(x, v0)
13500 return true
13501 }
13502
13503
13504 for {
13505 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
13506 break
13507 }
13508 v.reset(OpConst32)
13509 v.AuxInt = int32ToAuxInt(0)
13510 return true
13511 }
13512
13513
13514
13515 for {
13516 if auxIntToBool(v.AuxInt) != false {
13517 break
13518 }
13519 x := v_0
13520 con := v_1
13521 if con.Op != OpConst8 {
13522 break
13523 }
13524 c := auxIntToInt8(con.AuxInt)
13525 if !(0 < c && c < 32) {
13526 break
13527 }
13528 v.reset(OpLsh32x8)
13529 v.AuxInt = boolToAuxInt(true)
13530 v.AddArg2(x, con)
13531 return true
13532 }
13533 return false
13534 }
13535 func rewriteValuegeneric_OpLsh64x16(v *Value) bool {
13536 v_1 := v.Args[1]
13537 v_0 := v.Args[0]
13538 b := v.Block
13539
13540
13541 for {
13542 t := v.Type
13543 x := v_0
13544 if v_1.Op != OpConst16 {
13545 break
13546 }
13547 c := auxIntToInt16(v_1.AuxInt)
13548 v.reset(OpLsh64x64)
13549 v0 := b.NewValue0(v.Pos, OpConst64, t)
13550 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
13551 v.AddArg2(x, v0)
13552 return true
13553 }
13554
13555
13556 for {
13557 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
13558 break
13559 }
13560 v.reset(OpConst64)
13561 v.AuxInt = int64ToAuxInt(0)
13562 return true
13563 }
13564
13565
13566
13567 for {
13568 if auxIntToBool(v.AuxInt) != false {
13569 break
13570 }
13571 x := v_0
13572 con := v_1
13573 if con.Op != OpConst16 {
13574 break
13575 }
13576 c := auxIntToInt16(con.AuxInt)
13577 if !(0 < c && c < 64) {
13578 break
13579 }
13580 v.reset(OpLsh64x16)
13581 v.AuxInt = boolToAuxInt(true)
13582 v.AddArg2(x, con)
13583 return true
13584 }
13585 return false
13586 }
13587 func rewriteValuegeneric_OpLsh64x32(v *Value) bool {
13588 v_1 := v.Args[1]
13589 v_0 := v.Args[0]
13590 b := v.Block
13591
13592
13593 for {
13594 t := v.Type
13595 x := v_0
13596 if v_1.Op != OpConst32 {
13597 break
13598 }
13599 c := auxIntToInt32(v_1.AuxInt)
13600 v.reset(OpLsh64x64)
13601 v0 := b.NewValue0(v.Pos, OpConst64, t)
13602 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
13603 v.AddArg2(x, v0)
13604 return true
13605 }
13606
13607
13608 for {
13609 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
13610 break
13611 }
13612 v.reset(OpConst64)
13613 v.AuxInt = int64ToAuxInt(0)
13614 return true
13615 }
13616
13617
13618
13619 for {
13620 if auxIntToBool(v.AuxInt) != false {
13621 break
13622 }
13623 x := v_0
13624 con := v_1
13625 if con.Op != OpConst32 {
13626 break
13627 }
13628 c := auxIntToInt32(con.AuxInt)
13629 if !(0 < c && c < 64) {
13630 break
13631 }
13632 v.reset(OpLsh64x32)
13633 v.AuxInt = boolToAuxInt(true)
13634 v.AddArg2(x, con)
13635 return true
13636 }
13637 return false
13638 }
13639 func rewriteValuegeneric_OpLsh64x64(v *Value) bool {
13640 v_1 := v.Args[1]
13641 v_0 := v.Args[0]
13642 b := v.Block
13643 typ := &b.Func.Config.Types
13644
13645
13646 for {
13647 if v_0.Op != OpConst64 {
13648 break
13649 }
13650 c := auxIntToInt64(v_0.AuxInt)
13651 if v_1.Op != OpConst64 {
13652 break
13653 }
13654 d := auxIntToInt64(v_1.AuxInt)
13655 v.reset(OpConst64)
13656 v.AuxInt = int64ToAuxInt(c << uint64(d))
13657 return true
13658 }
13659
13660
13661 for {
13662 x := v_0
13663 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
13664 break
13665 }
13666 v.copyOf(x)
13667 return true
13668 }
13669
13670
13671 for {
13672 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
13673 break
13674 }
13675 v.reset(OpConst64)
13676 v.AuxInt = int64ToAuxInt(0)
13677 return true
13678 }
13679
13680
13681
13682 for {
13683 if v_1.Op != OpConst64 {
13684 break
13685 }
13686 c := auxIntToInt64(v_1.AuxInt)
13687 if !(uint64(c) >= 64) {
13688 break
13689 }
13690 v.reset(OpConst64)
13691 v.AuxInt = int64ToAuxInt(0)
13692 return true
13693 }
13694
13695
13696
13697 for {
13698 t := v.Type
13699 if v_0.Op != OpLsh64x64 {
13700 break
13701 }
13702 _ = v_0.Args[1]
13703 x := v_0.Args[0]
13704 v_0_1 := v_0.Args[1]
13705 if v_0_1.Op != OpConst64 {
13706 break
13707 }
13708 c := auxIntToInt64(v_0_1.AuxInt)
13709 if v_1.Op != OpConst64 {
13710 break
13711 }
13712 d := auxIntToInt64(v_1.AuxInt)
13713 if !(!uaddOvf(c, d)) {
13714 break
13715 }
13716 v.reset(OpLsh64x64)
13717 v0 := b.NewValue0(v.Pos, OpConst64, t)
13718 v0.AuxInt = int64ToAuxInt(c + d)
13719 v.AddArg2(x, v0)
13720 return true
13721 }
13722
13723
13724
13725 for {
13726 i := v_0
13727 if i.Op != OpRsh64x64 {
13728 break
13729 }
13730 _ = i.Args[1]
13731 x := i.Args[0]
13732 i_1 := i.Args[1]
13733 if i_1.Op != OpConst64 {
13734 break
13735 }
13736 c := auxIntToInt64(i_1.AuxInt)
13737 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
13738 break
13739 }
13740 v.reset(OpAnd64)
13741 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
13742 v0.AuxInt = int64ToAuxInt(int64(-1) << c)
13743 v.AddArg2(x, v0)
13744 return true
13745 }
13746
13747
13748
13749 for {
13750 i := v_0
13751 if i.Op != OpRsh64Ux64 {
13752 break
13753 }
13754 _ = i.Args[1]
13755 x := i.Args[0]
13756 i_1 := i.Args[1]
13757 if i_1.Op != OpConst64 {
13758 break
13759 }
13760 c := auxIntToInt64(i_1.AuxInt)
13761 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
13762 break
13763 }
13764 v.reset(OpAnd64)
13765 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
13766 v0.AuxInt = int64ToAuxInt(int64(-1) << c)
13767 v.AddArg2(x, v0)
13768 return true
13769 }
13770
13771
13772
13773 for {
13774 if v_0.Op != OpRsh64Ux64 {
13775 break
13776 }
13777 _ = v_0.Args[1]
13778 v_0_0 := v_0.Args[0]
13779 if v_0_0.Op != OpLsh64x64 {
13780 break
13781 }
13782 _ = v_0_0.Args[1]
13783 x := v_0_0.Args[0]
13784 v_0_0_1 := v_0_0.Args[1]
13785 if v_0_0_1.Op != OpConst64 {
13786 break
13787 }
13788 c1 := auxIntToInt64(v_0_0_1.AuxInt)
13789 v_0_1 := v_0.Args[1]
13790 if v_0_1.Op != OpConst64 {
13791 break
13792 }
13793 c2 := auxIntToInt64(v_0_1.AuxInt)
13794 if v_1.Op != OpConst64 {
13795 break
13796 }
13797 c3 := auxIntToInt64(v_1.AuxInt)
13798 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
13799 break
13800 }
13801 v.reset(OpLsh64x64)
13802 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
13803 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
13804 v.AddArg2(x, v0)
13805 return true
13806 }
13807
13808
13809
13810 for {
13811 if v_0.Op != OpAnd64 {
13812 break
13813 }
13814 _ = v_0.Args[1]
13815 v_0_0 := v_0.Args[0]
13816 v_0_1 := v_0.Args[1]
13817 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13818 if v_0_0.Op != OpRsh64x64 {
13819 continue
13820 }
13821 t := v_0_0.Type
13822 _ = v_0_0.Args[1]
13823 x := v_0_0.Args[0]
13824 v_0_0_1 := v_0_0.Args[1]
13825 if v_0_0_1.Op != OpConst64 {
13826 continue
13827 }
13828 t2 := v_0_0_1.Type
13829 c := auxIntToInt64(v_0_0_1.AuxInt)
13830 if v_0_1.Op != OpConst64 {
13831 continue
13832 }
13833 d := auxIntToInt64(v_0_1.AuxInt)
13834 if v_1.Op != OpConst64 {
13835 continue
13836 }
13837 e := auxIntToInt64(v_1.AuxInt)
13838 if !(c >= e) {
13839 continue
13840 }
13841 v.reset(OpAnd64)
13842 v0 := b.NewValue0(v.Pos, OpRsh64x64, t)
13843 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13844 v1.AuxInt = int64ToAuxInt(c - e)
13845 v0.AddArg2(x, v1)
13846 v2 := b.NewValue0(v.Pos, OpConst64, t)
13847 v2.AuxInt = int64ToAuxInt(d << e)
13848 v.AddArg2(v0, v2)
13849 return true
13850 }
13851 break
13852 }
13853
13854
13855
13856 for {
13857 if v_0.Op != OpAnd64 {
13858 break
13859 }
13860 _ = v_0.Args[1]
13861 v_0_0 := v_0.Args[0]
13862 v_0_1 := v_0.Args[1]
13863 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13864 if v_0_0.Op != OpRsh64Ux64 {
13865 continue
13866 }
13867 t := v_0_0.Type
13868 _ = v_0_0.Args[1]
13869 x := v_0_0.Args[0]
13870 v_0_0_1 := v_0_0.Args[1]
13871 if v_0_0_1.Op != OpConst64 {
13872 continue
13873 }
13874 t2 := v_0_0_1.Type
13875 c := auxIntToInt64(v_0_0_1.AuxInt)
13876 if v_0_1.Op != OpConst64 {
13877 continue
13878 }
13879 d := auxIntToInt64(v_0_1.AuxInt)
13880 if v_1.Op != OpConst64 {
13881 continue
13882 }
13883 e := auxIntToInt64(v_1.AuxInt)
13884 if !(c >= e) {
13885 continue
13886 }
13887 v.reset(OpAnd64)
13888 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t)
13889 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13890 v1.AuxInt = int64ToAuxInt(c - e)
13891 v0.AddArg2(x, v1)
13892 v2 := b.NewValue0(v.Pos, OpConst64, t)
13893 v2.AuxInt = int64ToAuxInt(d << e)
13894 v.AddArg2(v0, v2)
13895 return true
13896 }
13897 break
13898 }
13899
13900
13901
13902 for {
13903 if v_0.Op != OpAnd64 {
13904 break
13905 }
13906 _ = v_0.Args[1]
13907 v_0_0 := v_0.Args[0]
13908 v_0_1 := v_0.Args[1]
13909 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13910 if v_0_0.Op != OpRsh64x64 {
13911 continue
13912 }
13913 t := v_0_0.Type
13914 _ = v_0_0.Args[1]
13915 x := v_0_0.Args[0]
13916 v_0_0_1 := v_0_0.Args[1]
13917 if v_0_0_1.Op != OpConst64 {
13918 continue
13919 }
13920 t2 := v_0_0_1.Type
13921 c := auxIntToInt64(v_0_0_1.AuxInt)
13922 if v_0_1.Op != OpConst64 {
13923 continue
13924 }
13925 d := auxIntToInt64(v_0_1.AuxInt)
13926 if v_1.Op != OpConst64 {
13927 continue
13928 }
13929 e := auxIntToInt64(v_1.AuxInt)
13930 if !(c < e) {
13931 continue
13932 }
13933 v.reset(OpAnd64)
13934 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
13935 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13936 v1.AuxInt = int64ToAuxInt(e - c)
13937 v0.AddArg2(x, v1)
13938 v2 := b.NewValue0(v.Pos, OpConst64, t)
13939 v2.AuxInt = int64ToAuxInt(d << e)
13940 v.AddArg2(v0, v2)
13941 return true
13942 }
13943 break
13944 }
13945
13946
13947
13948 for {
13949 if v_0.Op != OpAnd64 {
13950 break
13951 }
13952 _ = v_0.Args[1]
13953 v_0_0 := v_0.Args[0]
13954 v_0_1 := v_0.Args[1]
13955 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13956 if v_0_0.Op != OpRsh64Ux64 {
13957 continue
13958 }
13959 t := v_0_0.Type
13960 _ = v_0_0.Args[1]
13961 x := v_0_0.Args[0]
13962 v_0_0_1 := v_0_0.Args[1]
13963 if v_0_0_1.Op != OpConst64 {
13964 continue
13965 }
13966 t2 := v_0_0_1.Type
13967 c := auxIntToInt64(v_0_0_1.AuxInt)
13968 if v_0_1.Op != OpConst64 {
13969 continue
13970 }
13971 d := auxIntToInt64(v_0_1.AuxInt)
13972 if v_1.Op != OpConst64 {
13973 continue
13974 }
13975 e := auxIntToInt64(v_1.AuxInt)
13976 if !(c < e) {
13977 continue
13978 }
13979 v.reset(OpAnd64)
13980 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
13981 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13982 v1.AuxInt = int64ToAuxInt(e - c)
13983 v0.AddArg2(x, v1)
13984 v2 := b.NewValue0(v.Pos, OpConst64, t)
13985 v2.AuxInt = int64ToAuxInt(d << e)
13986 v.AddArg2(v0, v2)
13987 return true
13988 }
13989 break
13990 }
13991
13992
13993
13994 for {
13995 if auxIntToBool(v.AuxInt) != false {
13996 break
13997 }
13998 x := v_0
13999 con := v_1
14000 if con.Op != OpConst64 {
14001 break
14002 }
14003 c := auxIntToInt64(con.AuxInt)
14004 if !(0 < c && c < 64) {
14005 break
14006 }
14007 v.reset(OpLsh64x64)
14008 v.AuxInt = boolToAuxInt(true)
14009 v.AddArg2(x, con)
14010 return true
14011 }
14012 return false
14013 }
14014 func rewriteValuegeneric_OpLsh64x8(v *Value) bool {
14015 v_1 := v.Args[1]
14016 v_0 := v.Args[0]
14017 b := v.Block
14018
14019
14020 for {
14021 t := v.Type
14022 x := v_0
14023 if v_1.Op != OpConst8 {
14024 break
14025 }
14026 c := auxIntToInt8(v_1.AuxInt)
14027 v.reset(OpLsh64x64)
14028 v0 := b.NewValue0(v.Pos, OpConst64, t)
14029 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
14030 v.AddArg2(x, v0)
14031 return true
14032 }
14033
14034
14035 for {
14036 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
14037 break
14038 }
14039 v.reset(OpConst64)
14040 v.AuxInt = int64ToAuxInt(0)
14041 return true
14042 }
14043
14044
14045
14046 for {
14047 if auxIntToBool(v.AuxInt) != false {
14048 break
14049 }
14050 x := v_0
14051 con := v_1
14052 if con.Op != OpConst8 {
14053 break
14054 }
14055 c := auxIntToInt8(con.AuxInt)
14056 if !(0 < c && c < 64) {
14057 break
14058 }
14059 v.reset(OpLsh64x8)
14060 v.AuxInt = boolToAuxInt(true)
14061 v.AddArg2(x, con)
14062 return true
14063 }
14064 return false
14065 }
14066 func rewriteValuegeneric_OpLsh8x16(v *Value) bool {
14067 v_1 := v.Args[1]
14068 v_0 := v.Args[0]
14069 b := v.Block
14070
14071
14072 for {
14073 t := v.Type
14074 x := v_0
14075 if v_1.Op != OpConst16 {
14076 break
14077 }
14078 c := auxIntToInt16(v_1.AuxInt)
14079 v.reset(OpLsh8x64)
14080 v0 := b.NewValue0(v.Pos, OpConst64, t)
14081 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
14082 v.AddArg2(x, v0)
14083 return true
14084 }
14085
14086
14087 for {
14088 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
14089 break
14090 }
14091 v.reset(OpConst8)
14092 v.AuxInt = int8ToAuxInt(0)
14093 return true
14094 }
14095
14096
14097
14098 for {
14099 if auxIntToBool(v.AuxInt) != false {
14100 break
14101 }
14102 x := v_0
14103 con := v_1
14104 if con.Op != OpConst16 {
14105 break
14106 }
14107 c := auxIntToInt16(con.AuxInt)
14108 if !(0 < c && c < 8) {
14109 break
14110 }
14111 v.reset(OpLsh8x16)
14112 v.AuxInt = boolToAuxInt(true)
14113 v.AddArg2(x, con)
14114 return true
14115 }
14116 return false
14117 }
14118 func rewriteValuegeneric_OpLsh8x32(v *Value) bool {
14119 v_1 := v.Args[1]
14120 v_0 := v.Args[0]
14121 b := v.Block
14122
14123
14124 for {
14125 t := v.Type
14126 x := v_0
14127 if v_1.Op != OpConst32 {
14128 break
14129 }
14130 c := auxIntToInt32(v_1.AuxInt)
14131 v.reset(OpLsh8x64)
14132 v0 := b.NewValue0(v.Pos, OpConst64, t)
14133 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
14134 v.AddArg2(x, v0)
14135 return true
14136 }
14137
14138
14139 for {
14140 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
14141 break
14142 }
14143 v.reset(OpConst8)
14144 v.AuxInt = int8ToAuxInt(0)
14145 return true
14146 }
14147
14148
14149
14150 for {
14151 if auxIntToBool(v.AuxInt) != false {
14152 break
14153 }
14154 x := v_0
14155 con := v_1
14156 if con.Op != OpConst32 {
14157 break
14158 }
14159 c := auxIntToInt32(con.AuxInt)
14160 if !(0 < c && c < 8) {
14161 break
14162 }
14163 v.reset(OpLsh8x32)
14164 v.AuxInt = boolToAuxInt(true)
14165 v.AddArg2(x, con)
14166 return true
14167 }
14168 return false
14169 }
14170 func rewriteValuegeneric_OpLsh8x64(v *Value) bool {
14171 v_1 := v.Args[1]
14172 v_0 := v.Args[0]
14173 b := v.Block
14174 typ := &b.Func.Config.Types
14175
14176
14177 for {
14178 if v_0.Op != OpConst8 {
14179 break
14180 }
14181 c := auxIntToInt8(v_0.AuxInt)
14182 if v_1.Op != OpConst64 {
14183 break
14184 }
14185 d := auxIntToInt64(v_1.AuxInt)
14186 v.reset(OpConst8)
14187 v.AuxInt = int8ToAuxInt(c << uint64(d))
14188 return true
14189 }
14190
14191
14192 for {
14193 x := v_0
14194 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
14195 break
14196 }
14197 v.copyOf(x)
14198 return true
14199 }
14200
14201
14202 for {
14203 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
14204 break
14205 }
14206 v.reset(OpConst8)
14207 v.AuxInt = int8ToAuxInt(0)
14208 return true
14209 }
14210
14211
14212
14213 for {
14214 if v_1.Op != OpConst64 {
14215 break
14216 }
14217 c := auxIntToInt64(v_1.AuxInt)
14218 if !(uint64(c) >= 8) {
14219 break
14220 }
14221 v.reset(OpConst8)
14222 v.AuxInt = int8ToAuxInt(0)
14223 return true
14224 }
14225
14226
14227
14228 for {
14229 t := v.Type
14230 if v_0.Op != OpLsh8x64 {
14231 break
14232 }
14233 _ = v_0.Args[1]
14234 x := v_0.Args[0]
14235 v_0_1 := v_0.Args[1]
14236 if v_0_1.Op != OpConst64 {
14237 break
14238 }
14239 c := auxIntToInt64(v_0_1.AuxInt)
14240 if v_1.Op != OpConst64 {
14241 break
14242 }
14243 d := auxIntToInt64(v_1.AuxInt)
14244 if !(!uaddOvf(c, d)) {
14245 break
14246 }
14247 v.reset(OpLsh8x64)
14248 v0 := b.NewValue0(v.Pos, OpConst64, t)
14249 v0.AuxInt = int64ToAuxInt(c + d)
14250 v.AddArg2(x, v0)
14251 return true
14252 }
14253
14254
14255
14256 for {
14257 i := v_0
14258 if i.Op != OpRsh8x64 {
14259 break
14260 }
14261 _ = i.Args[1]
14262 x := i.Args[0]
14263 i_1 := i.Args[1]
14264 if i_1.Op != OpConst64 {
14265 break
14266 }
14267 c := auxIntToInt64(i_1.AuxInt)
14268 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
14269 break
14270 }
14271 v.reset(OpAnd8)
14272 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
14273 v0.AuxInt = int8ToAuxInt(int8(-1) << c)
14274 v.AddArg2(x, v0)
14275 return true
14276 }
14277
14278
14279
14280 for {
14281 i := v_0
14282 if i.Op != OpRsh8Ux64 {
14283 break
14284 }
14285 _ = i.Args[1]
14286 x := i.Args[0]
14287 i_1 := i.Args[1]
14288 if i_1.Op != OpConst64 {
14289 break
14290 }
14291 c := auxIntToInt64(i_1.AuxInt)
14292 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
14293 break
14294 }
14295 v.reset(OpAnd8)
14296 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
14297 v0.AuxInt = int8ToAuxInt(int8(-1) << c)
14298 v.AddArg2(x, v0)
14299 return true
14300 }
14301
14302
14303
14304 for {
14305 if v_0.Op != OpRsh8Ux64 {
14306 break
14307 }
14308 _ = v_0.Args[1]
14309 v_0_0 := v_0.Args[0]
14310 if v_0_0.Op != OpLsh8x64 {
14311 break
14312 }
14313 _ = v_0_0.Args[1]
14314 x := v_0_0.Args[0]
14315 v_0_0_1 := v_0_0.Args[1]
14316 if v_0_0_1.Op != OpConst64 {
14317 break
14318 }
14319 c1 := auxIntToInt64(v_0_0_1.AuxInt)
14320 v_0_1 := v_0.Args[1]
14321 if v_0_1.Op != OpConst64 {
14322 break
14323 }
14324 c2 := auxIntToInt64(v_0_1.AuxInt)
14325 if v_1.Op != OpConst64 {
14326 break
14327 }
14328 c3 := auxIntToInt64(v_1.AuxInt)
14329 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
14330 break
14331 }
14332 v.reset(OpLsh8x64)
14333 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
14334 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
14335 v.AddArg2(x, v0)
14336 return true
14337 }
14338
14339
14340
14341 for {
14342 if v_0.Op != OpAnd8 {
14343 break
14344 }
14345 _ = v_0.Args[1]
14346 v_0_0 := v_0.Args[0]
14347 v_0_1 := v_0.Args[1]
14348 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14349 if v_0_0.Op != OpRsh8x64 {
14350 continue
14351 }
14352 t := v_0_0.Type
14353 _ = v_0_0.Args[1]
14354 x := v_0_0.Args[0]
14355 v_0_0_1 := v_0_0.Args[1]
14356 if v_0_0_1.Op != OpConst64 {
14357 continue
14358 }
14359 t2 := v_0_0_1.Type
14360 c := auxIntToInt64(v_0_0_1.AuxInt)
14361 if v_0_1.Op != OpConst8 {
14362 continue
14363 }
14364 d := auxIntToInt8(v_0_1.AuxInt)
14365 if v_1.Op != OpConst64 {
14366 continue
14367 }
14368 e := auxIntToInt64(v_1.AuxInt)
14369 if !(c >= e) {
14370 continue
14371 }
14372 v.reset(OpAnd8)
14373 v0 := b.NewValue0(v.Pos, OpRsh8x64, t)
14374 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14375 v1.AuxInt = int64ToAuxInt(c - e)
14376 v0.AddArg2(x, v1)
14377 v2 := b.NewValue0(v.Pos, OpConst8, t)
14378 v2.AuxInt = int8ToAuxInt(d << e)
14379 v.AddArg2(v0, v2)
14380 return true
14381 }
14382 break
14383 }
14384
14385
14386
14387 for {
14388 if v_0.Op != OpAnd8 {
14389 break
14390 }
14391 _ = v_0.Args[1]
14392 v_0_0 := v_0.Args[0]
14393 v_0_1 := v_0.Args[1]
14394 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14395 if v_0_0.Op != OpRsh8Ux64 {
14396 continue
14397 }
14398 t := v_0_0.Type
14399 _ = v_0_0.Args[1]
14400 x := v_0_0.Args[0]
14401 v_0_0_1 := v_0_0.Args[1]
14402 if v_0_0_1.Op != OpConst64 {
14403 continue
14404 }
14405 t2 := v_0_0_1.Type
14406 c := auxIntToInt64(v_0_0_1.AuxInt)
14407 if v_0_1.Op != OpConst8 {
14408 continue
14409 }
14410 d := auxIntToInt8(v_0_1.AuxInt)
14411 if v_1.Op != OpConst64 {
14412 continue
14413 }
14414 e := auxIntToInt64(v_1.AuxInt)
14415 if !(c >= e) {
14416 continue
14417 }
14418 v.reset(OpAnd8)
14419 v0 := b.NewValue0(v.Pos, OpRsh8Ux64, t)
14420 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14421 v1.AuxInt = int64ToAuxInt(c - e)
14422 v0.AddArg2(x, v1)
14423 v2 := b.NewValue0(v.Pos, OpConst8, t)
14424 v2.AuxInt = int8ToAuxInt(d << e)
14425 v.AddArg2(v0, v2)
14426 return true
14427 }
14428 break
14429 }
14430
14431
14432
14433 for {
14434 if v_0.Op != OpAnd8 {
14435 break
14436 }
14437 _ = v_0.Args[1]
14438 v_0_0 := v_0.Args[0]
14439 v_0_1 := v_0.Args[1]
14440 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14441 if v_0_0.Op != OpRsh8x64 {
14442 continue
14443 }
14444 t := v_0_0.Type
14445 _ = v_0_0.Args[1]
14446 x := v_0_0.Args[0]
14447 v_0_0_1 := v_0_0.Args[1]
14448 if v_0_0_1.Op != OpConst64 {
14449 continue
14450 }
14451 t2 := v_0_0_1.Type
14452 c := auxIntToInt64(v_0_0_1.AuxInt)
14453 if v_0_1.Op != OpConst8 {
14454 continue
14455 }
14456 d := auxIntToInt8(v_0_1.AuxInt)
14457 if v_1.Op != OpConst64 {
14458 continue
14459 }
14460 e := auxIntToInt64(v_1.AuxInt)
14461 if !(c < e) {
14462 continue
14463 }
14464 v.reset(OpAnd8)
14465 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
14466 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14467 v1.AuxInt = int64ToAuxInt(e - c)
14468 v0.AddArg2(x, v1)
14469 v2 := b.NewValue0(v.Pos, OpConst8, t)
14470 v2.AuxInt = int8ToAuxInt(d << e)
14471 v.AddArg2(v0, v2)
14472 return true
14473 }
14474 break
14475 }
14476
14477
14478
14479 for {
14480 if v_0.Op != OpAnd8 {
14481 break
14482 }
14483 _ = v_0.Args[1]
14484 v_0_0 := v_0.Args[0]
14485 v_0_1 := v_0.Args[1]
14486 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14487 if v_0_0.Op != OpRsh8Ux64 {
14488 continue
14489 }
14490 t := v_0_0.Type
14491 _ = v_0_0.Args[1]
14492 x := v_0_0.Args[0]
14493 v_0_0_1 := v_0_0.Args[1]
14494 if v_0_0_1.Op != OpConst64 {
14495 continue
14496 }
14497 t2 := v_0_0_1.Type
14498 c := auxIntToInt64(v_0_0_1.AuxInt)
14499 if v_0_1.Op != OpConst8 {
14500 continue
14501 }
14502 d := auxIntToInt8(v_0_1.AuxInt)
14503 if v_1.Op != OpConst64 {
14504 continue
14505 }
14506 e := auxIntToInt64(v_1.AuxInt)
14507 if !(c < e) {
14508 continue
14509 }
14510 v.reset(OpAnd8)
14511 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
14512 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14513 v1.AuxInt = int64ToAuxInt(e - c)
14514 v0.AddArg2(x, v1)
14515 v2 := b.NewValue0(v.Pos, OpConst8, t)
14516 v2.AuxInt = int8ToAuxInt(d << e)
14517 v.AddArg2(v0, v2)
14518 return true
14519 }
14520 break
14521 }
14522
14523
14524
14525 for {
14526 if auxIntToBool(v.AuxInt) != false {
14527 break
14528 }
14529 x := v_0
14530 con := v_1
14531 if con.Op != OpConst64 {
14532 break
14533 }
14534 c := auxIntToInt64(con.AuxInt)
14535 if !(0 < c && c < 8) {
14536 break
14537 }
14538 v.reset(OpLsh8x64)
14539 v.AuxInt = boolToAuxInt(true)
14540 v.AddArg2(x, con)
14541 return true
14542 }
14543 return false
14544 }
14545 func rewriteValuegeneric_OpLsh8x8(v *Value) bool {
14546 v_1 := v.Args[1]
14547 v_0 := v.Args[0]
14548 b := v.Block
14549
14550
14551 for {
14552 t := v.Type
14553 x := v_0
14554 if v_1.Op != OpConst8 {
14555 break
14556 }
14557 c := auxIntToInt8(v_1.AuxInt)
14558 v.reset(OpLsh8x64)
14559 v0 := b.NewValue0(v.Pos, OpConst64, t)
14560 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
14561 v.AddArg2(x, v0)
14562 return true
14563 }
14564
14565
14566 for {
14567 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
14568 break
14569 }
14570 v.reset(OpConst8)
14571 v.AuxInt = int8ToAuxInt(0)
14572 return true
14573 }
14574
14575
14576
14577 for {
14578 if auxIntToBool(v.AuxInt) != false {
14579 break
14580 }
14581 x := v_0
14582 con := v_1
14583 if con.Op != OpConst8 {
14584 break
14585 }
14586 c := auxIntToInt8(con.AuxInt)
14587 if !(0 < c && c < 8) {
14588 break
14589 }
14590 v.reset(OpLsh8x8)
14591 v.AuxInt = boolToAuxInt(true)
14592 v.AddArg2(x, con)
14593 return true
14594 }
14595 return false
14596 }
14597 func rewriteValuegeneric_OpMod16(v *Value) bool {
14598 v_1 := v.Args[1]
14599 v_0 := v.Args[0]
14600 b := v.Block
14601
14602
14603
14604 for {
14605 if v_0.Op != OpConst16 {
14606 break
14607 }
14608 c := auxIntToInt16(v_0.AuxInt)
14609 if v_1.Op != OpConst16 {
14610 break
14611 }
14612 d := auxIntToInt16(v_1.AuxInt)
14613 if !(d != 0) {
14614 break
14615 }
14616 v.reset(OpConst16)
14617 v.AuxInt = int16ToAuxInt(c % d)
14618 return true
14619 }
14620
14621
14622
14623 for {
14624 t := v.Type
14625 n := v_0
14626 if v_1.Op != OpConst16 {
14627 break
14628 }
14629 c := auxIntToInt16(v_1.AuxInt)
14630 if !(isNonNegative(n) && isPowerOfTwo(c)) {
14631 break
14632 }
14633 v.reset(OpAnd16)
14634 v0 := b.NewValue0(v.Pos, OpConst16, t)
14635 v0.AuxInt = int16ToAuxInt(c - 1)
14636 v.AddArg2(n, v0)
14637 return true
14638 }
14639
14640
14641
14642 for {
14643 t := v.Type
14644 n := v_0
14645 if v_1.Op != OpConst16 {
14646 break
14647 }
14648 c := auxIntToInt16(v_1.AuxInt)
14649 if !(c < 0 && c != -1<<15) {
14650 break
14651 }
14652 v.reset(OpMod16)
14653 v.Type = t
14654 v0 := b.NewValue0(v.Pos, OpConst16, t)
14655 v0.AuxInt = int16ToAuxInt(-c)
14656 v.AddArg2(n, v0)
14657 return true
14658 }
14659
14660
14661
14662 for {
14663 t := v.Type
14664 x := v_0
14665 if v_1.Op != OpConst16 {
14666 break
14667 }
14668 c := auxIntToInt16(v_1.AuxInt)
14669 if !(x.Op != OpConst16 && (c > 0 || c == -1<<15)) {
14670 break
14671 }
14672 v.reset(OpSub16)
14673 v0 := b.NewValue0(v.Pos, OpMul16, t)
14674 v1 := b.NewValue0(v.Pos, OpDiv16, t)
14675 v2 := b.NewValue0(v.Pos, OpConst16, t)
14676 v2.AuxInt = int16ToAuxInt(c)
14677 v1.AddArg2(x, v2)
14678 v0.AddArg2(v1, v2)
14679 v.AddArg2(x, v0)
14680 return true
14681 }
14682 return false
14683 }
14684 func rewriteValuegeneric_OpMod16u(v *Value) bool {
14685 v_1 := v.Args[1]
14686 v_0 := v.Args[0]
14687 b := v.Block
14688
14689
14690
14691 for {
14692 if v_0.Op != OpConst16 {
14693 break
14694 }
14695 c := auxIntToInt16(v_0.AuxInt)
14696 if v_1.Op != OpConst16 {
14697 break
14698 }
14699 d := auxIntToInt16(v_1.AuxInt)
14700 if !(d != 0) {
14701 break
14702 }
14703 v.reset(OpConst16)
14704 v.AuxInt = int16ToAuxInt(int16(uint16(c) % uint16(d)))
14705 return true
14706 }
14707
14708
14709
14710 for {
14711 t := v.Type
14712 n := v_0
14713 if v_1.Op != OpConst16 {
14714 break
14715 }
14716 c := auxIntToInt16(v_1.AuxInt)
14717 if !(isUnsignedPowerOfTwo(uint16(c))) {
14718 break
14719 }
14720 v.reset(OpAnd16)
14721 v0 := b.NewValue0(v.Pos, OpConst16, t)
14722 v0.AuxInt = int16ToAuxInt(c - 1)
14723 v.AddArg2(n, v0)
14724 return true
14725 }
14726
14727
14728
14729 for {
14730 t := v.Type
14731 x := v_0
14732 if v_1.Op != OpConst16 {
14733 break
14734 }
14735 c := auxIntToInt16(v_1.AuxInt)
14736 if !(x.Op != OpConst16 && c != 0) {
14737 break
14738 }
14739 v.reset(OpSub16)
14740 v0 := b.NewValue0(v.Pos, OpMul16, t)
14741 v1 := b.NewValue0(v.Pos, OpDiv16u, t)
14742 v2 := b.NewValue0(v.Pos, OpConst16, t)
14743 v2.AuxInt = int16ToAuxInt(c)
14744 v1.AddArg2(x, v2)
14745 v0.AddArg2(v1, v2)
14746 v.AddArg2(x, v0)
14747 return true
14748 }
14749 return false
14750 }
14751 func rewriteValuegeneric_OpMod32(v *Value) bool {
14752 v_1 := v.Args[1]
14753 v_0 := v.Args[0]
14754 b := v.Block
14755
14756
14757
14758 for {
14759 if v_0.Op != OpConst32 {
14760 break
14761 }
14762 c := auxIntToInt32(v_0.AuxInt)
14763 if v_1.Op != OpConst32 {
14764 break
14765 }
14766 d := auxIntToInt32(v_1.AuxInt)
14767 if !(d != 0) {
14768 break
14769 }
14770 v.reset(OpConst32)
14771 v.AuxInt = int32ToAuxInt(c % d)
14772 return true
14773 }
14774
14775
14776
14777 for {
14778 t := v.Type
14779 n := v_0
14780 if v_1.Op != OpConst32 {
14781 break
14782 }
14783 c := auxIntToInt32(v_1.AuxInt)
14784 if !(isNonNegative(n) && isPowerOfTwo(c)) {
14785 break
14786 }
14787 v.reset(OpAnd32)
14788 v0 := b.NewValue0(v.Pos, OpConst32, t)
14789 v0.AuxInt = int32ToAuxInt(c - 1)
14790 v.AddArg2(n, v0)
14791 return true
14792 }
14793
14794
14795
14796 for {
14797 t := v.Type
14798 n := v_0
14799 if v_1.Op != OpConst32 {
14800 break
14801 }
14802 c := auxIntToInt32(v_1.AuxInt)
14803 if !(c < 0 && c != -1<<31) {
14804 break
14805 }
14806 v.reset(OpMod32)
14807 v.Type = t
14808 v0 := b.NewValue0(v.Pos, OpConst32, t)
14809 v0.AuxInt = int32ToAuxInt(-c)
14810 v.AddArg2(n, v0)
14811 return true
14812 }
14813
14814
14815
14816 for {
14817 t := v.Type
14818 x := v_0
14819 if v_1.Op != OpConst32 {
14820 break
14821 }
14822 c := auxIntToInt32(v_1.AuxInt)
14823 if !(x.Op != OpConst32 && (c > 0 || c == -1<<31)) {
14824 break
14825 }
14826 v.reset(OpSub32)
14827 v0 := b.NewValue0(v.Pos, OpMul32, t)
14828 v1 := b.NewValue0(v.Pos, OpDiv32, t)
14829 v2 := b.NewValue0(v.Pos, OpConst32, t)
14830 v2.AuxInt = int32ToAuxInt(c)
14831 v1.AddArg2(x, v2)
14832 v0.AddArg2(v1, v2)
14833 v.AddArg2(x, v0)
14834 return true
14835 }
14836 return false
14837 }
14838 func rewriteValuegeneric_OpMod32u(v *Value) bool {
14839 v_1 := v.Args[1]
14840 v_0 := v.Args[0]
14841 b := v.Block
14842
14843
14844
14845 for {
14846 if v_0.Op != OpConst32 {
14847 break
14848 }
14849 c := auxIntToInt32(v_0.AuxInt)
14850 if v_1.Op != OpConst32 {
14851 break
14852 }
14853 d := auxIntToInt32(v_1.AuxInt)
14854 if !(d != 0) {
14855 break
14856 }
14857 v.reset(OpConst32)
14858 v.AuxInt = int32ToAuxInt(int32(uint32(c) % uint32(d)))
14859 return true
14860 }
14861
14862
14863
14864 for {
14865 t := v.Type
14866 n := v_0
14867 if v_1.Op != OpConst32 {
14868 break
14869 }
14870 c := auxIntToInt32(v_1.AuxInt)
14871 if !(isUnsignedPowerOfTwo(uint32(c))) {
14872 break
14873 }
14874 v.reset(OpAnd32)
14875 v0 := b.NewValue0(v.Pos, OpConst32, t)
14876 v0.AuxInt = int32ToAuxInt(c - 1)
14877 v.AddArg2(n, v0)
14878 return true
14879 }
14880
14881
14882
14883 for {
14884 t := v.Type
14885 x := v_0
14886 if v_1.Op != OpConst32 {
14887 break
14888 }
14889 c := auxIntToInt32(v_1.AuxInt)
14890 if !(x.Op != OpConst32 && c != 0) {
14891 break
14892 }
14893 v.reset(OpSub32)
14894 v0 := b.NewValue0(v.Pos, OpMul32, t)
14895 v1 := b.NewValue0(v.Pos, OpDiv32u, t)
14896 v2 := b.NewValue0(v.Pos, OpConst32, t)
14897 v2.AuxInt = int32ToAuxInt(c)
14898 v1.AddArg2(x, v2)
14899 v0.AddArg2(v1, v2)
14900 v.AddArg2(x, v0)
14901 return true
14902 }
14903 return false
14904 }
14905 func rewriteValuegeneric_OpMod64(v *Value) bool {
14906 v_1 := v.Args[1]
14907 v_0 := v.Args[0]
14908 b := v.Block
14909
14910
14911
14912 for {
14913 if v_0.Op != OpConst64 {
14914 break
14915 }
14916 c := auxIntToInt64(v_0.AuxInt)
14917 if v_1.Op != OpConst64 {
14918 break
14919 }
14920 d := auxIntToInt64(v_1.AuxInt)
14921 if !(d != 0) {
14922 break
14923 }
14924 v.reset(OpConst64)
14925 v.AuxInt = int64ToAuxInt(c % d)
14926 return true
14927 }
14928
14929
14930
14931 for {
14932 t := v.Type
14933 n := v_0
14934 if v_1.Op != OpConst64 {
14935 break
14936 }
14937 c := auxIntToInt64(v_1.AuxInt)
14938 if !(isNonNegative(n) && isPowerOfTwo(c)) {
14939 break
14940 }
14941 v.reset(OpAnd64)
14942 v0 := b.NewValue0(v.Pos, OpConst64, t)
14943 v0.AuxInt = int64ToAuxInt(c - 1)
14944 v.AddArg2(n, v0)
14945 return true
14946 }
14947
14948
14949
14950 for {
14951 n := v_0
14952 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 || !(isNonNegative(n)) {
14953 break
14954 }
14955 v.copyOf(n)
14956 return true
14957 }
14958
14959
14960
14961 for {
14962 t := v.Type
14963 n := v_0
14964 if v_1.Op != OpConst64 {
14965 break
14966 }
14967 c := auxIntToInt64(v_1.AuxInt)
14968 if !(c < 0 && c != -1<<63) {
14969 break
14970 }
14971 v.reset(OpMod64)
14972 v.Type = t
14973 v0 := b.NewValue0(v.Pos, OpConst64, t)
14974 v0.AuxInt = int64ToAuxInt(-c)
14975 v.AddArg2(n, v0)
14976 return true
14977 }
14978
14979
14980
14981 for {
14982 t := v.Type
14983 x := v_0
14984 if v_1.Op != OpConst64 {
14985 break
14986 }
14987 c := auxIntToInt64(v_1.AuxInt)
14988 if !(x.Op != OpConst64 && (c > 0 || c == -1<<63)) {
14989 break
14990 }
14991 v.reset(OpSub64)
14992 v0 := b.NewValue0(v.Pos, OpMul64, t)
14993 v1 := b.NewValue0(v.Pos, OpDiv64, t)
14994 v2 := b.NewValue0(v.Pos, OpConst64, t)
14995 v2.AuxInt = int64ToAuxInt(c)
14996 v1.AddArg2(x, v2)
14997 v0.AddArg2(v1, v2)
14998 v.AddArg2(x, v0)
14999 return true
15000 }
15001 return false
15002 }
15003 func rewriteValuegeneric_OpMod64u(v *Value) bool {
15004 v_1 := v.Args[1]
15005 v_0 := v.Args[0]
15006 b := v.Block
15007
15008
15009
15010 for {
15011 if v_0.Op != OpConst64 {
15012 break
15013 }
15014 c := auxIntToInt64(v_0.AuxInt)
15015 if v_1.Op != OpConst64 {
15016 break
15017 }
15018 d := auxIntToInt64(v_1.AuxInt)
15019 if !(d != 0) {
15020 break
15021 }
15022 v.reset(OpConst64)
15023 v.AuxInt = int64ToAuxInt(int64(uint64(c) % uint64(d)))
15024 return true
15025 }
15026
15027
15028
15029 for {
15030 t := v.Type
15031 n := v_0
15032 if v_1.Op != OpConst64 {
15033 break
15034 }
15035 c := auxIntToInt64(v_1.AuxInt)
15036 if !(isUnsignedPowerOfTwo(uint64(c))) {
15037 break
15038 }
15039 v.reset(OpAnd64)
15040 v0 := b.NewValue0(v.Pos, OpConst64, t)
15041 v0.AuxInt = int64ToAuxInt(c - 1)
15042 v.AddArg2(n, v0)
15043 return true
15044 }
15045
15046
15047
15048 for {
15049 t := v.Type
15050 x := v_0
15051 if v_1.Op != OpConst64 {
15052 break
15053 }
15054 c := auxIntToInt64(v_1.AuxInt)
15055 if !(x.Op != OpConst64 && c != 0) {
15056 break
15057 }
15058 v.reset(OpSub64)
15059 v0 := b.NewValue0(v.Pos, OpMul64, t)
15060 v1 := b.NewValue0(v.Pos, OpDiv64u, t)
15061 v2 := b.NewValue0(v.Pos, OpConst64, t)
15062 v2.AuxInt = int64ToAuxInt(c)
15063 v1.AddArg2(x, v2)
15064 v0.AddArg2(v1, v2)
15065 v.AddArg2(x, v0)
15066 return true
15067 }
15068 return false
15069 }
15070 func rewriteValuegeneric_OpMod8(v *Value) bool {
15071 v_1 := v.Args[1]
15072 v_0 := v.Args[0]
15073 b := v.Block
15074
15075
15076
15077 for {
15078 if v_0.Op != OpConst8 {
15079 break
15080 }
15081 c := auxIntToInt8(v_0.AuxInt)
15082 if v_1.Op != OpConst8 {
15083 break
15084 }
15085 d := auxIntToInt8(v_1.AuxInt)
15086 if !(d != 0) {
15087 break
15088 }
15089 v.reset(OpConst8)
15090 v.AuxInt = int8ToAuxInt(c % d)
15091 return true
15092 }
15093
15094
15095
15096 for {
15097 t := v.Type
15098 n := v_0
15099 if v_1.Op != OpConst8 {
15100 break
15101 }
15102 c := auxIntToInt8(v_1.AuxInt)
15103 if !(isNonNegative(n) && isPowerOfTwo(c)) {
15104 break
15105 }
15106 v.reset(OpAnd8)
15107 v0 := b.NewValue0(v.Pos, OpConst8, t)
15108 v0.AuxInt = int8ToAuxInt(c - 1)
15109 v.AddArg2(n, v0)
15110 return true
15111 }
15112
15113
15114
15115 for {
15116 t := v.Type
15117 n := v_0
15118 if v_1.Op != OpConst8 {
15119 break
15120 }
15121 c := auxIntToInt8(v_1.AuxInt)
15122 if !(c < 0 && c != -1<<7) {
15123 break
15124 }
15125 v.reset(OpMod8)
15126 v.Type = t
15127 v0 := b.NewValue0(v.Pos, OpConst8, t)
15128 v0.AuxInt = int8ToAuxInt(-c)
15129 v.AddArg2(n, v0)
15130 return true
15131 }
15132
15133
15134
15135 for {
15136 t := v.Type
15137 x := v_0
15138 if v_1.Op != OpConst8 {
15139 break
15140 }
15141 c := auxIntToInt8(v_1.AuxInt)
15142 if !(x.Op != OpConst8 && (c > 0 || c == -1<<7)) {
15143 break
15144 }
15145 v.reset(OpSub8)
15146 v0 := b.NewValue0(v.Pos, OpMul8, t)
15147 v1 := b.NewValue0(v.Pos, OpDiv8, t)
15148 v2 := b.NewValue0(v.Pos, OpConst8, t)
15149 v2.AuxInt = int8ToAuxInt(c)
15150 v1.AddArg2(x, v2)
15151 v0.AddArg2(v1, v2)
15152 v.AddArg2(x, v0)
15153 return true
15154 }
15155 return false
15156 }
15157 func rewriteValuegeneric_OpMod8u(v *Value) bool {
15158 v_1 := v.Args[1]
15159 v_0 := v.Args[0]
15160 b := v.Block
15161
15162
15163
15164 for {
15165 if v_0.Op != OpConst8 {
15166 break
15167 }
15168 c := auxIntToInt8(v_0.AuxInt)
15169 if v_1.Op != OpConst8 {
15170 break
15171 }
15172 d := auxIntToInt8(v_1.AuxInt)
15173 if !(d != 0) {
15174 break
15175 }
15176 v.reset(OpConst8)
15177 v.AuxInt = int8ToAuxInt(int8(uint8(c) % uint8(d)))
15178 return true
15179 }
15180
15181
15182
15183 for {
15184 t := v.Type
15185 n := v_0
15186 if v_1.Op != OpConst8 {
15187 break
15188 }
15189 c := auxIntToInt8(v_1.AuxInt)
15190 if !(isUnsignedPowerOfTwo(uint8(c))) {
15191 break
15192 }
15193 v.reset(OpAnd8)
15194 v0 := b.NewValue0(v.Pos, OpConst8, t)
15195 v0.AuxInt = int8ToAuxInt(c - 1)
15196 v.AddArg2(n, v0)
15197 return true
15198 }
15199
15200
15201
15202 for {
15203 t := v.Type
15204 x := v_0
15205 if v_1.Op != OpConst8 {
15206 break
15207 }
15208 c := auxIntToInt8(v_1.AuxInt)
15209 if !(x.Op != OpConst8 && c != 0) {
15210 break
15211 }
15212 v.reset(OpSub8)
15213 v0 := b.NewValue0(v.Pos, OpMul8, t)
15214 v1 := b.NewValue0(v.Pos, OpDiv8u, t)
15215 v2 := b.NewValue0(v.Pos, OpConst8, t)
15216 v2.AuxInt = int8ToAuxInt(c)
15217 v1.AddArg2(x, v2)
15218 v0.AddArg2(v1, v2)
15219 v.AddArg2(x, v0)
15220 return true
15221 }
15222 return false
15223 }
15224 func rewriteValuegeneric_OpMove(v *Value) bool {
15225 v_2 := v.Args[2]
15226 v_1 := v.Args[1]
15227 v_0 := v.Args[0]
15228 b := v.Block
15229 config := b.Func.Config
15230
15231
15232
15233 for {
15234 n := auxIntToInt64(v.AuxInt)
15235 t := auxToType(v.Aux)
15236 dst1 := v_0
15237 src := v_1
15238 mem := v_2
15239 if mem.Op != OpZero || auxIntToInt64(mem.AuxInt) != n || auxToType(mem.Aux) != t {
15240 break
15241 }
15242 dst2 := mem.Args[0]
15243 if !(isSamePtr(src, dst2)) {
15244 break
15245 }
15246 v.reset(OpZero)
15247 v.AuxInt = int64ToAuxInt(n)
15248 v.Aux = typeToAux(t)
15249 v.AddArg2(dst1, mem)
15250 return true
15251 }
15252
15253
15254
15255 for {
15256 n := auxIntToInt64(v.AuxInt)
15257 t := auxToType(v.Aux)
15258 dst1 := v_0
15259 src := v_1
15260 mem := v_2
15261 if mem.Op != OpVarDef {
15262 break
15263 }
15264 mem_0 := mem.Args[0]
15265 if mem_0.Op != OpZero || auxIntToInt64(mem_0.AuxInt) != n || auxToType(mem_0.Aux) != t {
15266 break
15267 }
15268 dst0 := mem_0.Args[0]
15269 if !(isSamePtr(src, dst0)) {
15270 break
15271 }
15272 v.reset(OpZero)
15273 v.AuxInt = int64ToAuxInt(n)
15274 v.Aux = typeToAux(t)
15275 v.AddArg2(dst1, mem)
15276 return true
15277 }
15278
15279
15280
15281 for {
15282 n := auxIntToInt64(v.AuxInt)
15283 t := auxToType(v.Aux)
15284 dst := v_0
15285 if v_1.Op != OpAddr {
15286 break
15287 }
15288 sym := auxToSym(v_1.Aux)
15289 v_1_0 := v_1.Args[0]
15290 if v_1_0.Op != OpSB {
15291 break
15292 }
15293 mem := v_2
15294 if !(symIsROZero(sym)) {
15295 break
15296 }
15297 v.reset(OpZero)
15298 v.AuxInt = int64ToAuxInt(n)
15299 v.Aux = typeToAux(t)
15300 v.AddArg2(dst, mem)
15301 return true
15302 }
15303
15304
15305
15306 for {
15307 n := auxIntToInt64(v.AuxInt)
15308 t1 := auxToType(v.Aux)
15309 dst1 := v_0
15310 src1 := v_1
15311 store := v_2
15312 if store.Op != OpStore {
15313 break
15314 }
15315 t2 := auxToType(store.Aux)
15316 mem := store.Args[2]
15317 op := store.Args[0]
15318 if op.Op != OpOffPtr {
15319 break
15320 }
15321 o2 := auxIntToInt64(op.AuxInt)
15322 dst2 := op.Args[0]
15323 if !(isSamePtr(dst1, dst2) && store.Uses == 1 && n >= o2+t2.Size() && disjoint(src1, n, op, t2.Size()) && clobber(store)) {
15324 break
15325 }
15326 v.reset(OpMove)
15327 v.AuxInt = int64ToAuxInt(n)
15328 v.Aux = typeToAux(t1)
15329 v.AddArg3(dst1, src1, mem)
15330 return true
15331 }
15332
15333
15334
15335 for {
15336 n := auxIntToInt64(v.AuxInt)
15337 t := auxToType(v.Aux)
15338 dst1 := v_0
15339 src1 := v_1
15340 move := v_2
15341 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
15342 break
15343 }
15344 mem := move.Args[2]
15345 dst2 := move.Args[0]
15346 if !(move.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move)) {
15347 break
15348 }
15349 v.reset(OpMove)
15350 v.AuxInt = int64ToAuxInt(n)
15351 v.Aux = typeToAux(t)
15352 v.AddArg3(dst1, src1, mem)
15353 return true
15354 }
15355
15356
15357
15358 for {
15359 n := auxIntToInt64(v.AuxInt)
15360 t := auxToType(v.Aux)
15361 dst1 := v_0
15362 src1 := v_1
15363 vardef := v_2
15364 if vardef.Op != OpVarDef {
15365 break
15366 }
15367 x := auxToSym(vardef.Aux)
15368 move := vardef.Args[0]
15369 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
15370 break
15371 }
15372 mem := move.Args[2]
15373 dst2 := move.Args[0]
15374 if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move, vardef)) {
15375 break
15376 }
15377 v.reset(OpMove)
15378 v.AuxInt = int64ToAuxInt(n)
15379 v.Aux = typeToAux(t)
15380 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
15381 v0.Aux = symToAux(x)
15382 v0.AddArg(mem)
15383 v.AddArg3(dst1, src1, v0)
15384 return true
15385 }
15386
15387
15388
15389 for {
15390 n := auxIntToInt64(v.AuxInt)
15391 t := auxToType(v.Aux)
15392 dst1 := v_0
15393 src1 := v_1
15394 zero := v_2
15395 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != n || auxToType(zero.Aux) != t {
15396 break
15397 }
15398 mem := zero.Args[1]
15399 dst2 := zero.Args[0]
15400 if !(zero.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero)) {
15401 break
15402 }
15403 v.reset(OpMove)
15404 v.AuxInt = int64ToAuxInt(n)
15405 v.Aux = typeToAux(t)
15406 v.AddArg3(dst1, src1, mem)
15407 return true
15408 }
15409
15410
15411
15412 for {
15413 n := auxIntToInt64(v.AuxInt)
15414 t := auxToType(v.Aux)
15415 dst1 := v_0
15416 src1 := v_1
15417 vardef := v_2
15418 if vardef.Op != OpVarDef {
15419 break
15420 }
15421 x := auxToSym(vardef.Aux)
15422 zero := vardef.Args[0]
15423 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != n || auxToType(zero.Aux) != t {
15424 break
15425 }
15426 mem := zero.Args[1]
15427 dst2 := zero.Args[0]
15428 if !(zero.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero, vardef)) {
15429 break
15430 }
15431 v.reset(OpMove)
15432 v.AuxInt = int64ToAuxInt(n)
15433 v.Aux = typeToAux(t)
15434 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
15435 v0.Aux = symToAux(x)
15436 v0.AddArg(mem)
15437 v.AddArg3(dst1, src1, v0)
15438 return true
15439 }
15440
15441
15442
15443 for {
15444 n := auxIntToInt64(v.AuxInt)
15445 t1 := auxToType(v.Aux)
15446 dst := v_0
15447 p1 := v_1
15448 mem := v_2
15449 if mem.Op != OpStore {
15450 break
15451 }
15452 t2 := auxToType(mem.Aux)
15453 _ = mem.Args[2]
15454 op2 := mem.Args[0]
15455 if op2.Op != OpOffPtr {
15456 break
15457 }
15458 tt2 := op2.Type
15459 o2 := auxIntToInt64(op2.AuxInt)
15460 p2 := op2.Args[0]
15461 d1 := mem.Args[1]
15462 mem_2 := mem.Args[2]
15463 if mem_2.Op != OpStore {
15464 break
15465 }
15466 t3 := auxToType(mem_2.Aux)
15467 d2 := mem_2.Args[1]
15468 op3 := mem_2.Args[0]
15469 if op3.Op != OpOffPtr {
15470 break
15471 }
15472 tt3 := op3.Type
15473 if auxIntToInt64(op3.AuxInt) != 0 {
15474 break
15475 }
15476 p3 := op3.Args[0]
15477 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()) {
15478 break
15479 }
15480 v.reset(OpStore)
15481 v.Aux = typeToAux(t2)
15482 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
15483 v0.AuxInt = int64ToAuxInt(o2)
15484 v0.AddArg(dst)
15485 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
15486 v1.Aux = typeToAux(t3)
15487 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
15488 v2.AuxInt = int64ToAuxInt(0)
15489 v2.AddArg(dst)
15490 v1.AddArg3(v2, d2, mem)
15491 v.AddArg3(v0, d1, v1)
15492 return true
15493 }
15494
15495
15496
15497 for {
15498 n := auxIntToInt64(v.AuxInt)
15499 t1 := auxToType(v.Aux)
15500 dst := v_0
15501 p1 := v_1
15502 mem := v_2
15503 if mem.Op != OpStore {
15504 break
15505 }
15506 t2 := auxToType(mem.Aux)
15507 _ = mem.Args[2]
15508 op2 := mem.Args[0]
15509 if op2.Op != OpOffPtr {
15510 break
15511 }
15512 tt2 := op2.Type
15513 o2 := auxIntToInt64(op2.AuxInt)
15514 p2 := op2.Args[0]
15515 d1 := mem.Args[1]
15516 mem_2 := mem.Args[2]
15517 if mem_2.Op != OpStore {
15518 break
15519 }
15520 t3 := auxToType(mem_2.Aux)
15521 _ = mem_2.Args[2]
15522 op3 := mem_2.Args[0]
15523 if op3.Op != OpOffPtr {
15524 break
15525 }
15526 tt3 := op3.Type
15527 o3 := auxIntToInt64(op3.AuxInt)
15528 p3 := op3.Args[0]
15529 d2 := mem_2.Args[1]
15530 mem_2_2 := mem_2.Args[2]
15531 if mem_2_2.Op != OpStore {
15532 break
15533 }
15534 t4 := auxToType(mem_2_2.Aux)
15535 d3 := mem_2_2.Args[1]
15536 op4 := mem_2_2.Args[0]
15537 if op4.Op != OpOffPtr {
15538 break
15539 }
15540 tt4 := op4.Type
15541 if auxIntToInt64(op4.AuxInt) != 0 {
15542 break
15543 }
15544 p4 := op4.Args[0]
15545 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()) {
15546 break
15547 }
15548 v.reset(OpStore)
15549 v.Aux = typeToAux(t2)
15550 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
15551 v0.AuxInt = int64ToAuxInt(o2)
15552 v0.AddArg(dst)
15553 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
15554 v1.Aux = typeToAux(t3)
15555 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
15556 v2.AuxInt = int64ToAuxInt(o3)
15557 v2.AddArg(dst)
15558 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
15559 v3.Aux = typeToAux(t4)
15560 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
15561 v4.AuxInt = int64ToAuxInt(0)
15562 v4.AddArg(dst)
15563 v3.AddArg3(v4, d3, mem)
15564 v1.AddArg3(v2, d2, v3)
15565 v.AddArg3(v0, d1, v1)
15566 return true
15567 }
15568
15569
15570
15571 for {
15572 n := auxIntToInt64(v.AuxInt)
15573 t1 := auxToType(v.Aux)
15574 dst := v_0
15575 p1 := v_1
15576 mem := v_2
15577 if mem.Op != OpStore {
15578 break
15579 }
15580 t2 := auxToType(mem.Aux)
15581 _ = mem.Args[2]
15582 op2 := mem.Args[0]
15583 if op2.Op != OpOffPtr {
15584 break
15585 }
15586 tt2 := op2.Type
15587 o2 := auxIntToInt64(op2.AuxInt)
15588 p2 := op2.Args[0]
15589 d1 := mem.Args[1]
15590 mem_2 := mem.Args[2]
15591 if mem_2.Op != OpStore {
15592 break
15593 }
15594 t3 := auxToType(mem_2.Aux)
15595 _ = mem_2.Args[2]
15596 op3 := mem_2.Args[0]
15597 if op3.Op != OpOffPtr {
15598 break
15599 }
15600 tt3 := op3.Type
15601 o3 := auxIntToInt64(op3.AuxInt)
15602 p3 := op3.Args[0]
15603 d2 := mem_2.Args[1]
15604 mem_2_2 := mem_2.Args[2]
15605 if mem_2_2.Op != OpStore {
15606 break
15607 }
15608 t4 := auxToType(mem_2_2.Aux)
15609 _ = mem_2_2.Args[2]
15610 op4 := mem_2_2.Args[0]
15611 if op4.Op != OpOffPtr {
15612 break
15613 }
15614 tt4 := op4.Type
15615 o4 := auxIntToInt64(op4.AuxInt)
15616 p4 := op4.Args[0]
15617 d3 := mem_2_2.Args[1]
15618 mem_2_2_2 := mem_2_2.Args[2]
15619 if mem_2_2_2.Op != OpStore {
15620 break
15621 }
15622 t5 := auxToType(mem_2_2_2.Aux)
15623 d4 := mem_2_2_2.Args[1]
15624 op5 := mem_2_2_2.Args[0]
15625 if op5.Op != OpOffPtr {
15626 break
15627 }
15628 tt5 := op5.Type
15629 if auxIntToInt64(op5.AuxInt) != 0 {
15630 break
15631 }
15632 p5 := op5.Args[0]
15633 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()) {
15634 break
15635 }
15636 v.reset(OpStore)
15637 v.Aux = typeToAux(t2)
15638 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
15639 v0.AuxInt = int64ToAuxInt(o2)
15640 v0.AddArg(dst)
15641 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
15642 v1.Aux = typeToAux(t3)
15643 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
15644 v2.AuxInt = int64ToAuxInt(o3)
15645 v2.AddArg(dst)
15646 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
15647 v3.Aux = typeToAux(t4)
15648 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
15649 v4.AuxInt = int64ToAuxInt(o4)
15650 v4.AddArg(dst)
15651 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
15652 v5.Aux = typeToAux(t5)
15653 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
15654 v6.AuxInt = int64ToAuxInt(0)
15655 v6.AddArg(dst)
15656 v5.AddArg3(v6, d4, mem)
15657 v3.AddArg3(v4, d3, v5)
15658 v1.AddArg3(v2, d2, v3)
15659 v.AddArg3(v0, d1, v1)
15660 return true
15661 }
15662
15663
15664
15665 for {
15666 n := auxIntToInt64(v.AuxInt)
15667 t1 := auxToType(v.Aux)
15668 dst := v_0
15669 p1 := v_1
15670 mem := v_2
15671 if mem.Op != OpVarDef {
15672 break
15673 }
15674 mem_0 := mem.Args[0]
15675 if mem_0.Op != OpStore {
15676 break
15677 }
15678 t2 := auxToType(mem_0.Aux)
15679 _ = mem_0.Args[2]
15680 op2 := mem_0.Args[0]
15681 if op2.Op != OpOffPtr {
15682 break
15683 }
15684 tt2 := op2.Type
15685 o2 := auxIntToInt64(op2.AuxInt)
15686 p2 := op2.Args[0]
15687 d1 := mem_0.Args[1]
15688 mem_0_2 := mem_0.Args[2]
15689 if mem_0_2.Op != OpStore {
15690 break
15691 }
15692 t3 := auxToType(mem_0_2.Aux)
15693 d2 := mem_0_2.Args[1]
15694 op3 := mem_0_2.Args[0]
15695 if op3.Op != OpOffPtr {
15696 break
15697 }
15698 tt3 := op3.Type
15699 if auxIntToInt64(op3.AuxInt) != 0 {
15700 break
15701 }
15702 p3 := op3.Args[0]
15703 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()) {
15704 break
15705 }
15706 v.reset(OpStore)
15707 v.Aux = typeToAux(t2)
15708 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
15709 v0.AuxInt = int64ToAuxInt(o2)
15710 v0.AddArg(dst)
15711 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
15712 v1.Aux = typeToAux(t3)
15713 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
15714 v2.AuxInt = int64ToAuxInt(0)
15715 v2.AddArg(dst)
15716 v1.AddArg3(v2, d2, mem)
15717 v.AddArg3(v0, d1, v1)
15718 return true
15719 }
15720
15721
15722
15723 for {
15724 n := auxIntToInt64(v.AuxInt)
15725 t1 := auxToType(v.Aux)
15726 dst := v_0
15727 p1 := v_1
15728 mem := v_2
15729 if mem.Op != OpVarDef {
15730 break
15731 }
15732 mem_0 := mem.Args[0]
15733 if mem_0.Op != OpStore {
15734 break
15735 }
15736 t2 := auxToType(mem_0.Aux)
15737 _ = mem_0.Args[2]
15738 op2 := mem_0.Args[0]
15739 if op2.Op != OpOffPtr {
15740 break
15741 }
15742 tt2 := op2.Type
15743 o2 := auxIntToInt64(op2.AuxInt)
15744 p2 := op2.Args[0]
15745 d1 := mem_0.Args[1]
15746 mem_0_2 := mem_0.Args[2]
15747 if mem_0_2.Op != OpStore {
15748 break
15749 }
15750 t3 := auxToType(mem_0_2.Aux)
15751 _ = mem_0_2.Args[2]
15752 op3 := mem_0_2.Args[0]
15753 if op3.Op != OpOffPtr {
15754 break
15755 }
15756 tt3 := op3.Type
15757 o3 := auxIntToInt64(op3.AuxInt)
15758 p3 := op3.Args[0]
15759 d2 := mem_0_2.Args[1]
15760 mem_0_2_2 := mem_0_2.Args[2]
15761 if mem_0_2_2.Op != OpStore {
15762 break
15763 }
15764 t4 := auxToType(mem_0_2_2.Aux)
15765 d3 := mem_0_2_2.Args[1]
15766 op4 := mem_0_2_2.Args[0]
15767 if op4.Op != OpOffPtr {
15768 break
15769 }
15770 tt4 := op4.Type
15771 if auxIntToInt64(op4.AuxInt) != 0 {
15772 break
15773 }
15774 p4 := op4.Args[0]
15775 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()) {
15776 break
15777 }
15778 v.reset(OpStore)
15779 v.Aux = typeToAux(t2)
15780 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
15781 v0.AuxInt = int64ToAuxInt(o2)
15782 v0.AddArg(dst)
15783 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
15784 v1.Aux = typeToAux(t3)
15785 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
15786 v2.AuxInt = int64ToAuxInt(o3)
15787 v2.AddArg(dst)
15788 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
15789 v3.Aux = typeToAux(t4)
15790 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
15791 v4.AuxInt = int64ToAuxInt(0)
15792 v4.AddArg(dst)
15793 v3.AddArg3(v4, d3, mem)
15794 v1.AddArg3(v2, d2, v3)
15795 v.AddArg3(v0, d1, v1)
15796 return true
15797 }
15798
15799
15800
15801 for {
15802 n := auxIntToInt64(v.AuxInt)
15803 t1 := auxToType(v.Aux)
15804 dst := v_0
15805 p1 := v_1
15806 mem := v_2
15807 if mem.Op != OpVarDef {
15808 break
15809 }
15810 mem_0 := mem.Args[0]
15811 if mem_0.Op != OpStore {
15812 break
15813 }
15814 t2 := auxToType(mem_0.Aux)
15815 _ = mem_0.Args[2]
15816 op2 := mem_0.Args[0]
15817 if op2.Op != OpOffPtr {
15818 break
15819 }
15820 tt2 := op2.Type
15821 o2 := auxIntToInt64(op2.AuxInt)
15822 p2 := op2.Args[0]
15823 d1 := mem_0.Args[1]
15824 mem_0_2 := mem_0.Args[2]
15825 if mem_0_2.Op != OpStore {
15826 break
15827 }
15828 t3 := auxToType(mem_0_2.Aux)
15829 _ = mem_0_2.Args[2]
15830 op3 := mem_0_2.Args[0]
15831 if op3.Op != OpOffPtr {
15832 break
15833 }
15834 tt3 := op3.Type
15835 o3 := auxIntToInt64(op3.AuxInt)
15836 p3 := op3.Args[0]
15837 d2 := mem_0_2.Args[1]
15838 mem_0_2_2 := mem_0_2.Args[2]
15839 if mem_0_2_2.Op != OpStore {
15840 break
15841 }
15842 t4 := auxToType(mem_0_2_2.Aux)
15843 _ = mem_0_2_2.Args[2]
15844 op4 := mem_0_2_2.Args[0]
15845 if op4.Op != OpOffPtr {
15846 break
15847 }
15848 tt4 := op4.Type
15849 o4 := auxIntToInt64(op4.AuxInt)
15850 p4 := op4.Args[0]
15851 d3 := mem_0_2_2.Args[1]
15852 mem_0_2_2_2 := mem_0_2_2.Args[2]
15853 if mem_0_2_2_2.Op != OpStore {
15854 break
15855 }
15856 t5 := auxToType(mem_0_2_2_2.Aux)
15857 d4 := mem_0_2_2_2.Args[1]
15858 op5 := mem_0_2_2_2.Args[0]
15859 if op5.Op != OpOffPtr {
15860 break
15861 }
15862 tt5 := op5.Type
15863 if auxIntToInt64(op5.AuxInt) != 0 {
15864 break
15865 }
15866 p5 := op5.Args[0]
15867 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()) {
15868 break
15869 }
15870 v.reset(OpStore)
15871 v.Aux = typeToAux(t2)
15872 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
15873 v0.AuxInt = int64ToAuxInt(o2)
15874 v0.AddArg(dst)
15875 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
15876 v1.Aux = typeToAux(t3)
15877 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
15878 v2.AuxInt = int64ToAuxInt(o3)
15879 v2.AddArg(dst)
15880 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
15881 v3.Aux = typeToAux(t4)
15882 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
15883 v4.AuxInt = int64ToAuxInt(o4)
15884 v4.AddArg(dst)
15885 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
15886 v5.Aux = typeToAux(t5)
15887 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
15888 v6.AuxInt = int64ToAuxInt(0)
15889 v6.AddArg(dst)
15890 v5.AddArg3(v6, d4, mem)
15891 v3.AddArg3(v4, d3, v5)
15892 v1.AddArg3(v2, d2, v3)
15893 v.AddArg3(v0, d1, v1)
15894 return true
15895 }
15896
15897
15898
15899 for {
15900 n := auxIntToInt64(v.AuxInt)
15901 t1 := auxToType(v.Aux)
15902 dst := v_0
15903 p1 := v_1
15904 mem := v_2
15905 if mem.Op != OpStore {
15906 break
15907 }
15908 t2 := auxToType(mem.Aux)
15909 _ = mem.Args[2]
15910 op2 := mem.Args[0]
15911 if op2.Op != OpOffPtr {
15912 break
15913 }
15914 tt2 := op2.Type
15915 o2 := auxIntToInt64(op2.AuxInt)
15916 p2 := op2.Args[0]
15917 d1 := mem.Args[1]
15918 mem_2 := mem.Args[2]
15919 if mem_2.Op != OpZero || auxIntToInt64(mem_2.AuxInt) != n {
15920 break
15921 }
15922 t3 := auxToType(mem_2.Aux)
15923 p3 := mem_2.Args[0]
15924 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && registerizable(b, t2) && n >= o2+t2.Size()) {
15925 break
15926 }
15927 v.reset(OpStore)
15928 v.Aux = typeToAux(t2)
15929 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
15930 v0.AuxInt = int64ToAuxInt(o2)
15931 v0.AddArg(dst)
15932 v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
15933 v1.AuxInt = int64ToAuxInt(n)
15934 v1.Aux = typeToAux(t1)
15935 v1.AddArg2(dst, mem)
15936 v.AddArg3(v0, d1, v1)
15937 return true
15938 }
15939
15940
15941
15942 for {
15943 n := auxIntToInt64(v.AuxInt)
15944 t1 := auxToType(v.Aux)
15945 dst := v_0
15946 p1 := v_1
15947 mem := v_2
15948 if mem.Op != OpStore {
15949 break
15950 }
15951 t2 := auxToType(mem.Aux)
15952 _ = mem.Args[2]
15953 mem_0 := mem.Args[0]
15954 if mem_0.Op != OpOffPtr {
15955 break
15956 }
15957 tt2 := mem_0.Type
15958 o2 := auxIntToInt64(mem_0.AuxInt)
15959 p2 := mem_0.Args[0]
15960 d1 := mem.Args[1]
15961 mem_2 := mem.Args[2]
15962 if mem_2.Op != OpStore {
15963 break
15964 }
15965 t3 := auxToType(mem_2.Aux)
15966 _ = mem_2.Args[2]
15967 mem_2_0 := mem_2.Args[0]
15968 if mem_2_0.Op != OpOffPtr {
15969 break
15970 }
15971 tt3 := mem_2_0.Type
15972 o3 := auxIntToInt64(mem_2_0.AuxInt)
15973 p3 := mem_2_0.Args[0]
15974 d2 := mem_2.Args[1]
15975 mem_2_2 := mem_2.Args[2]
15976 if mem_2_2.Op != OpZero || auxIntToInt64(mem_2_2.AuxInt) != n {
15977 break
15978 }
15979 t4 := auxToType(mem_2_2.Aux)
15980 p4 := mem_2_2.Args[0]
15981 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()) {
15982 break
15983 }
15984 v.reset(OpStore)
15985 v.Aux = typeToAux(t2)
15986 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
15987 v0.AuxInt = int64ToAuxInt(o2)
15988 v0.AddArg(dst)
15989 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
15990 v1.Aux = typeToAux(t3)
15991 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
15992 v2.AuxInt = int64ToAuxInt(o3)
15993 v2.AddArg(dst)
15994 v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
15995 v3.AuxInt = int64ToAuxInt(n)
15996 v3.Aux = typeToAux(t1)
15997 v3.AddArg2(dst, mem)
15998 v1.AddArg3(v2, d2, v3)
15999 v.AddArg3(v0, d1, v1)
16000 return true
16001 }
16002
16003
16004
16005 for {
16006 n := auxIntToInt64(v.AuxInt)
16007 t1 := auxToType(v.Aux)
16008 dst := v_0
16009 p1 := v_1
16010 mem := v_2
16011 if mem.Op != OpStore {
16012 break
16013 }
16014 t2 := auxToType(mem.Aux)
16015 _ = mem.Args[2]
16016 mem_0 := mem.Args[0]
16017 if mem_0.Op != OpOffPtr {
16018 break
16019 }
16020 tt2 := mem_0.Type
16021 o2 := auxIntToInt64(mem_0.AuxInt)
16022 p2 := mem_0.Args[0]
16023 d1 := mem.Args[1]
16024 mem_2 := mem.Args[2]
16025 if mem_2.Op != OpStore {
16026 break
16027 }
16028 t3 := auxToType(mem_2.Aux)
16029 _ = mem_2.Args[2]
16030 mem_2_0 := mem_2.Args[0]
16031 if mem_2_0.Op != OpOffPtr {
16032 break
16033 }
16034 tt3 := mem_2_0.Type
16035 o3 := auxIntToInt64(mem_2_0.AuxInt)
16036 p3 := mem_2_0.Args[0]
16037 d2 := mem_2.Args[1]
16038 mem_2_2 := mem_2.Args[2]
16039 if mem_2_2.Op != OpStore {
16040 break
16041 }
16042 t4 := auxToType(mem_2_2.Aux)
16043 _ = mem_2_2.Args[2]
16044 mem_2_2_0 := mem_2_2.Args[0]
16045 if mem_2_2_0.Op != OpOffPtr {
16046 break
16047 }
16048 tt4 := mem_2_2_0.Type
16049 o4 := auxIntToInt64(mem_2_2_0.AuxInt)
16050 p4 := mem_2_2_0.Args[0]
16051 d3 := mem_2_2.Args[1]
16052 mem_2_2_2 := mem_2_2.Args[2]
16053 if mem_2_2_2.Op != OpZero || auxIntToInt64(mem_2_2_2.AuxInt) != n {
16054 break
16055 }
16056 t5 := auxToType(mem_2_2_2.Aux)
16057 p5 := mem_2_2_2.Args[0]
16058 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()) {
16059 break
16060 }
16061 v.reset(OpStore)
16062 v.Aux = typeToAux(t2)
16063 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16064 v0.AuxInt = int64ToAuxInt(o2)
16065 v0.AddArg(dst)
16066 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16067 v1.Aux = typeToAux(t3)
16068 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16069 v2.AuxInt = int64ToAuxInt(o3)
16070 v2.AddArg(dst)
16071 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16072 v3.Aux = typeToAux(t4)
16073 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16074 v4.AuxInt = int64ToAuxInt(o4)
16075 v4.AddArg(dst)
16076 v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16077 v5.AuxInt = int64ToAuxInt(n)
16078 v5.Aux = typeToAux(t1)
16079 v5.AddArg2(dst, mem)
16080 v3.AddArg3(v4, d3, v5)
16081 v1.AddArg3(v2, d2, v3)
16082 v.AddArg3(v0, d1, v1)
16083 return true
16084 }
16085
16086
16087
16088 for {
16089 n := auxIntToInt64(v.AuxInt)
16090 t1 := auxToType(v.Aux)
16091 dst := v_0
16092 p1 := v_1
16093 mem := v_2
16094 if mem.Op != OpStore {
16095 break
16096 }
16097 t2 := auxToType(mem.Aux)
16098 _ = mem.Args[2]
16099 mem_0 := mem.Args[0]
16100 if mem_0.Op != OpOffPtr {
16101 break
16102 }
16103 tt2 := mem_0.Type
16104 o2 := auxIntToInt64(mem_0.AuxInt)
16105 p2 := mem_0.Args[0]
16106 d1 := mem.Args[1]
16107 mem_2 := mem.Args[2]
16108 if mem_2.Op != OpStore {
16109 break
16110 }
16111 t3 := auxToType(mem_2.Aux)
16112 _ = mem_2.Args[2]
16113 mem_2_0 := mem_2.Args[0]
16114 if mem_2_0.Op != OpOffPtr {
16115 break
16116 }
16117 tt3 := mem_2_0.Type
16118 o3 := auxIntToInt64(mem_2_0.AuxInt)
16119 p3 := mem_2_0.Args[0]
16120 d2 := mem_2.Args[1]
16121 mem_2_2 := mem_2.Args[2]
16122 if mem_2_2.Op != OpStore {
16123 break
16124 }
16125 t4 := auxToType(mem_2_2.Aux)
16126 _ = mem_2_2.Args[2]
16127 mem_2_2_0 := mem_2_2.Args[0]
16128 if mem_2_2_0.Op != OpOffPtr {
16129 break
16130 }
16131 tt4 := mem_2_2_0.Type
16132 o4 := auxIntToInt64(mem_2_2_0.AuxInt)
16133 p4 := mem_2_2_0.Args[0]
16134 d3 := mem_2_2.Args[1]
16135 mem_2_2_2 := mem_2_2.Args[2]
16136 if mem_2_2_2.Op != OpStore {
16137 break
16138 }
16139 t5 := auxToType(mem_2_2_2.Aux)
16140 _ = mem_2_2_2.Args[2]
16141 mem_2_2_2_0 := mem_2_2_2.Args[0]
16142 if mem_2_2_2_0.Op != OpOffPtr {
16143 break
16144 }
16145 tt5 := mem_2_2_2_0.Type
16146 o5 := auxIntToInt64(mem_2_2_2_0.AuxInt)
16147 p5 := mem_2_2_2_0.Args[0]
16148 d4 := mem_2_2_2.Args[1]
16149 mem_2_2_2_2 := mem_2_2_2.Args[2]
16150 if mem_2_2_2_2.Op != OpZero || auxIntToInt64(mem_2_2_2_2.AuxInt) != n {
16151 break
16152 }
16153 t6 := auxToType(mem_2_2_2_2.Aux)
16154 p6 := mem_2_2_2_2.Args[0]
16155 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()) {
16156 break
16157 }
16158 v.reset(OpStore)
16159 v.Aux = typeToAux(t2)
16160 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16161 v0.AuxInt = int64ToAuxInt(o2)
16162 v0.AddArg(dst)
16163 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16164 v1.Aux = typeToAux(t3)
16165 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16166 v2.AuxInt = int64ToAuxInt(o3)
16167 v2.AddArg(dst)
16168 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16169 v3.Aux = typeToAux(t4)
16170 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16171 v4.AuxInt = int64ToAuxInt(o4)
16172 v4.AddArg(dst)
16173 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16174 v5.Aux = typeToAux(t5)
16175 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
16176 v6.AuxInt = int64ToAuxInt(o5)
16177 v6.AddArg(dst)
16178 v7 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16179 v7.AuxInt = int64ToAuxInt(n)
16180 v7.Aux = typeToAux(t1)
16181 v7.AddArg2(dst, mem)
16182 v5.AddArg3(v6, d4, v7)
16183 v3.AddArg3(v4, d3, v5)
16184 v1.AddArg3(v2, d2, v3)
16185 v.AddArg3(v0, d1, v1)
16186 return true
16187 }
16188
16189
16190
16191 for {
16192 n := auxIntToInt64(v.AuxInt)
16193 t1 := auxToType(v.Aux)
16194 dst := v_0
16195 p1 := v_1
16196 mem := v_2
16197 if mem.Op != OpVarDef {
16198 break
16199 }
16200 mem_0 := mem.Args[0]
16201 if mem_0.Op != OpStore {
16202 break
16203 }
16204 t2 := auxToType(mem_0.Aux)
16205 _ = mem_0.Args[2]
16206 op2 := mem_0.Args[0]
16207 if op2.Op != OpOffPtr {
16208 break
16209 }
16210 tt2 := op2.Type
16211 o2 := auxIntToInt64(op2.AuxInt)
16212 p2 := op2.Args[0]
16213 d1 := mem_0.Args[1]
16214 mem_0_2 := mem_0.Args[2]
16215 if mem_0_2.Op != OpZero || auxIntToInt64(mem_0_2.AuxInt) != n {
16216 break
16217 }
16218 t3 := auxToType(mem_0_2.Aux)
16219 p3 := mem_0_2.Args[0]
16220 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && registerizable(b, t2) && n >= o2+t2.Size()) {
16221 break
16222 }
16223 v.reset(OpStore)
16224 v.Aux = typeToAux(t2)
16225 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16226 v0.AuxInt = int64ToAuxInt(o2)
16227 v0.AddArg(dst)
16228 v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16229 v1.AuxInt = int64ToAuxInt(n)
16230 v1.Aux = typeToAux(t1)
16231 v1.AddArg2(dst, mem)
16232 v.AddArg3(v0, d1, v1)
16233 return true
16234 }
16235
16236
16237
16238 for {
16239 n := auxIntToInt64(v.AuxInt)
16240 t1 := auxToType(v.Aux)
16241 dst := v_0
16242 p1 := v_1
16243 mem := v_2
16244 if mem.Op != OpVarDef {
16245 break
16246 }
16247 mem_0 := mem.Args[0]
16248 if mem_0.Op != OpStore {
16249 break
16250 }
16251 t2 := auxToType(mem_0.Aux)
16252 _ = mem_0.Args[2]
16253 mem_0_0 := mem_0.Args[0]
16254 if mem_0_0.Op != OpOffPtr {
16255 break
16256 }
16257 tt2 := mem_0_0.Type
16258 o2 := auxIntToInt64(mem_0_0.AuxInt)
16259 p2 := mem_0_0.Args[0]
16260 d1 := mem_0.Args[1]
16261 mem_0_2 := mem_0.Args[2]
16262 if mem_0_2.Op != OpStore {
16263 break
16264 }
16265 t3 := auxToType(mem_0_2.Aux)
16266 _ = mem_0_2.Args[2]
16267 mem_0_2_0 := mem_0_2.Args[0]
16268 if mem_0_2_0.Op != OpOffPtr {
16269 break
16270 }
16271 tt3 := mem_0_2_0.Type
16272 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
16273 p3 := mem_0_2_0.Args[0]
16274 d2 := mem_0_2.Args[1]
16275 mem_0_2_2 := mem_0_2.Args[2]
16276 if mem_0_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2.AuxInt) != n {
16277 break
16278 }
16279 t4 := auxToType(mem_0_2_2.Aux)
16280 p4 := mem_0_2_2.Args[0]
16281 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()) {
16282 break
16283 }
16284 v.reset(OpStore)
16285 v.Aux = typeToAux(t2)
16286 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16287 v0.AuxInt = int64ToAuxInt(o2)
16288 v0.AddArg(dst)
16289 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16290 v1.Aux = typeToAux(t3)
16291 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16292 v2.AuxInt = int64ToAuxInt(o3)
16293 v2.AddArg(dst)
16294 v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16295 v3.AuxInt = int64ToAuxInt(n)
16296 v3.Aux = typeToAux(t1)
16297 v3.AddArg2(dst, mem)
16298 v1.AddArg3(v2, d2, v3)
16299 v.AddArg3(v0, d1, v1)
16300 return true
16301 }
16302
16303
16304
16305 for {
16306 n := auxIntToInt64(v.AuxInt)
16307 t1 := auxToType(v.Aux)
16308 dst := v_0
16309 p1 := v_1
16310 mem := v_2
16311 if mem.Op != OpVarDef {
16312 break
16313 }
16314 mem_0 := mem.Args[0]
16315 if mem_0.Op != OpStore {
16316 break
16317 }
16318 t2 := auxToType(mem_0.Aux)
16319 _ = mem_0.Args[2]
16320 mem_0_0 := mem_0.Args[0]
16321 if mem_0_0.Op != OpOffPtr {
16322 break
16323 }
16324 tt2 := mem_0_0.Type
16325 o2 := auxIntToInt64(mem_0_0.AuxInt)
16326 p2 := mem_0_0.Args[0]
16327 d1 := mem_0.Args[1]
16328 mem_0_2 := mem_0.Args[2]
16329 if mem_0_2.Op != OpStore {
16330 break
16331 }
16332 t3 := auxToType(mem_0_2.Aux)
16333 _ = mem_0_2.Args[2]
16334 mem_0_2_0 := mem_0_2.Args[0]
16335 if mem_0_2_0.Op != OpOffPtr {
16336 break
16337 }
16338 tt3 := mem_0_2_0.Type
16339 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
16340 p3 := mem_0_2_0.Args[0]
16341 d2 := mem_0_2.Args[1]
16342 mem_0_2_2 := mem_0_2.Args[2]
16343 if mem_0_2_2.Op != OpStore {
16344 break
16345 }
16346 t4 := auxToType(mem_0_2_2.Aux)
16347 _ = mem_0_2_2.Args[2]
16348 mem_0_2_2_0 := mem_0_2_2.Args[0]
16349 if mem_0_2_2_0.Op != OpOffPtr {
16350 break
16351 }
16352 tt4 := mem_0_2_2_0.Type
16353 o4 := auxIntToInt64(mem_0_2_2_0.AuxInt)
16354 p4 := mem_0_2_2_0.Args[0]
16355 d3 := mem_0_2_2.Args[1]
16356 mem_0_2_2_2 := mem_0_2_2.Args[2]
16357 if mem_0_2_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2_2.AuxInt) != n {
16358 break
16359 }
16360 t5 := auxToType(mem_0_2_2_2.Aux)
16361 p5 := mem_0_2_2_2.Args[0]
16362 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()) {
16363 break
16364 }
16365 v.reset(OpStore)
16366 v.Aux = typeToAux(t2)
16367 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16368 v0.AuxInt = int64ToAuxInt(o2)
16369 v0.AddArg(dst)
16370 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16371 v1.Aux = typeToAux(t3)
16372 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16373 v2.AuxInt = int64ToAuxInt(o3)
16374 v2.AddArg(dst)
16375 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16376 v3.Aux = typeToAux(t4)
16377 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16378 v4.AuxInt = int64ToAuxInt(o4)
16379 v4.AddArg(dst)
16380 v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16381 v5.AuxInt = int64ToAuxInt(n)
16382 v5.Aux = typeToAux(t1)
16383 v5.AddArg2(dst, mem)
16384 v3.AddArg3(v4, d3, v5)
16385 v1.AddArg3(v2, d2, v3)
16386 v.AddArg3(v0, d1, v1)
16387 return true
16388 }
16389
16390
16391
16392 for {
16393 n := auxIntToInt64(v.AuxInt)
16394 t1 := auxToType(v.Aux)
16395 dst := v_0
16396 p1 := v_1
16397 mem := v_2
16398 if mem.Op != OpVarDef {
16399 break
16400 }
16401 mem_0 := mem.Args[0]
16402 if mem_0.Op != OpStore {
16403 break
16404 }
16405 t2 := auxToType(mem_0.Aux)
16406 _ = mem_0.Args[2]
16407 mem_0_0 := mem_0.Args[0]
16408 if mem_0_0.Op != OpOffPtr {
16409 break
16410 }
16411 tt2 := mem_0_0.Type
16412 o2 := auxIntToInt64(mem_0_0.AuxInt)
16413 p2 := mem_0_0.Args[0]
16414 d1 := mem_0.Args[1]
16415 mem_0_2 := mem_0.Args[2]
16416 if mem_0_2.Op != OpStore {
16417 break
16418 }
16419 t3 := auxToType(mem_0_2.Aux)
16420 _ = mem_0_2.Args[2]
16421 mem_0_2_0 := mem_0_2.Args[0]
16422 if mem_0_2_0.Op != OpOffPtr {
16423 break
16424 }
16425 tt3 := mem_0_2_0.Type
16426 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
16427 p3 := mem_0_2_0.Args[0]
16428 d2 := mem_0_2.Args[1]
16429 mem_0_2_2 := mem_0_2.Args[2]
16430 if mem_0_2_2.Op != OpStore {
16431 break
16432 }
16433 t4 := auxToType(mem_0_2_2.Aux)
16434 _ = mem_0_2_2.Args[2]
16435 mem_0_2_2_0 := mem_0_2_2.Args[0]
16436 if mem_0_2_2_0.Op != OpOffPtr {
16437 break
16438 }
16439 tt4 := mem_0_2_2_0.Type
16440 o4 := auxIntToInt64(mem_0_2_2_0.AuxInt)
16441 p4 := mem_0_2_2_0.Args[0]
16442 d3 := mem_0_2_2.Args[1]
16443 mem_0_2_2_2 := mem_0_2_2.Args[2]
16444 if mem_0_2_2_2.Op != OpStore {
16445 break
16446 }
16447 t5 := auxToType(mem_0_2_2_2.Aux)
16448 _ = mem_0_2_2_2.Args[2]
16449 mem_0_2_2_2_0 := mem_0_2_2_2.Args[0]
16450 if mem_0_2_2_2_0.Op != OpOffPtr {
16451 break
16452 }
16453 tt5 := mem_0_2_2_2_0.Type
16454 o5 := auxIntToInt64(mem_0_2_2_2_0.AuxInt)
16455 p5 := mem_0_2_2_2_0.Args[0]
16456 d4 := mem_0_2_2_2.Args[1]
16457 mem_0_2_2_2_2 := mem_0_2_2_2.Args[2]
16458 if mem_0_2_2_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2_2_2.AuxInt) != n {
16459 break
16460 }
16461 t6 := auxToType(mem_0_2_2_2_2.Aux)
16462 p6 := mem_0_2_2_2_2.Args[0]
16463 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()) {
16464 break
16465 }
16466 v.reset(OpStore)
16467 v.Aux = typeToAux(t2)
16468 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16469 v0.AuxInt = int64ToAuxInt(o2)
16470 v0.AddArg(dst)
16471 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16472 v1.Aux = typeToAux(t3)
16473 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16474 v2.AuxInt = int64ToAuxInt(o3)
16475 v2.AddArg(dst)
16476 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16477 v3.Aux = typeToAux(t4)
16478 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16479 v4.AuxInt = int64ToAuxInt(o4)
16480 v4.AddArg(dst)
16481 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16482 v5.Aux = typeToAux(t5)
16483 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
16484 v6.AuxInt = int64ToAuxInt(o5)
16485 v6.AddArg(dst)
16486 v7 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16487 v7.AuxInt = int64ToAuxInt(n)
16488 v7.Aux = typeToAux(t1)
16489 v7.AddArg2(dst, mem)
16490 v5.AddArg3(v6, d4, v7)
16491 v3.AddArg3(v4, d3, v5)
16492 v1.AddArg3(v2, d2, v3)
16493 v.AddArg3(v0, d1, v1)
16494 return true
16495 }
16496
16497
16498
16499 for {
16500 s := auxIntToInt64(v.AuxInt)
16501 t1 := auxToType(v.Aux)
16502 dst := v_0
16503 tmp1 := v_1
16504 midmem := v_2
16505 if midmem.Op != OpMove || auxIntToInt64(midmem.AuxInt) != s {
16506 break
16507 }
16508 t2 := auxToType(midmem.Aux)
16509 src := midmem.Args[1]
16510 tmp2 := midmem.Args[0]
16511 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))) {
16512 break
16513 }
16514 v.reset(OpMove)
16515 v.AuxInt = int64ToAuxInt(s)
16516 v.Aux = typeToAux(t1)
16517 v.AddArg3(dst, src, midmem)
16518 return true
16519 }
16520
16521
16522
16523 for {
16524 s := auxIntToInt64(v.AuxInt)
16525 t1 := auxToType(v.Aux)
16526 dst := v_0
16527 tmp1 := v_1
16528 midmem := v_2
16529 if midmem.Op != OpVarDef {
16530 break
16531 }
16532 midmem_0 := midmem.Args[0]
16533 if midmem_0.Op != OpMove || auxIntToInt64(midmem_0.AuxInt) != s {
16534 break
16535 }
16536 t2 := auxToType(midmem_0.Aux)
16537 src := midmem_0.Args[1]
16538 tmp2 := midmem_0.Args[0]
16539 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))) {
16540 break
16541 }
16542 v.reset(OpMove)
16543 v.AuxInt = int64ToAuxInt(s)
16544 v.Aux = typeToAux(t1)
16545 v.AddArg3(dst, src, midmem)
16546 return true
16547 }
16548
16549
16550
16551 for {
16552 dst := v_0
16553 src := v_1
16554 mem := v_2
16555 if !(isSamePtr(dst, src)) {
16556 break
16557 }
16558 v.copyOf(mem)
16559 return true
16560 }
16561 return false
16562 }
16563 func rewriteValuegeneric_OpMul16(v *Value) bool {
16564 v_1 := v.Args[1]
16565 v_0 := v.Args[0]
16566 b := v.Block
16567 typ := &b.Func.Config.Types
16568
16569
16570 for {
16571 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16572 if v_0.Op != OpConst16 {
16573 continue
16574 }
16575 c := auxIntToInt16(v_0.AuxInt)
16576 if v_1.Op != OpConst16 {
16577 continue
16578 }
16579 d := auxIntToInt16(v_1.AuxInt)
16580 v.reset(OpConst16)
16581 v.AuxInt = int16ToAuxInt(c * d)
16582 return true
16583 }
16584 break
16585 }
16586
16587
16588 for {
16589 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16590 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 1 {
16591 continue
16592 }
16593 x := v_1
16594 v.copyOf(x)
16595 return true
16596 }
16597 break
16598 }
16599
16600
16601 for {
16602 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16603 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
16604 continue
16605 }
16606 x := v_1
16607 v.reset(OpNeg16)
16608 v.AddArg(x)
16609 return true
16610 }
16611 break
16612 }
16613
16614
16615
16616 for {
16617 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16618 if v_0.Op != OpConst16 {
16619 continue
16620 }
16621 t := v_0.Type
16622 c := auxIntToInt16(v_0.AuxInt)
16623 if v_1.Op != OpAdd16 || v_1.Type != t {
16624 continue
16625 }
16626 _ = v_1.Args[1]
16627 v_1_0 := v_1.Args[0]
16628 v_1_1 := v_1.Args[1]
16629 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
16630 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
16631 continue
16632 }
16633 d := auxIntToInt16(v_1_0.AuxInt)
16634 x := v_1_1
16635 if !(!isPowerOfTwo(c)) {
16636 continue
16637 }
16638 v.reset(OpAdd16)
16639 v0 := b.NewValue0(v.Pos, OpConst16, t)
16640 v0.AuxInt = int16ToAuxInt(c * d)
16641 v1 := b.NewValue0(v.Pos, OpMul16, t)
16642 v2 := b.NewValue0(v.Pos, OpConst16, t)
16643 v2.AuxInt = int16ToAuxInt(c)
16644 v1.AddArg2(v2, x)
16645 v.AddArg2(v0, v1)
16646 return true
16647 }
16648 }
16649 break
16650 }
16651
16652
16653 for {
16654 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16655 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
16656 continue
16657 }
16658 v.reset(OpConst16)
16659 v.AuxInt = int16ToAuxInt(0)
16660 return true
16661 }
16662 break
16663 }
16664
16665
16666
16667 for {
16668 t := v.Type
16669 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16670 x := v_0
16671 if v_1.Op != OpConst16 {
16672 continue
16673 }
16674 c := auxIntToInt16(v_1.AuxInt)
16675 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
16676 continue
16677 }
16678 v.reset(OpLsh16x64)
16679 v.Type = t
16680 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
16681 v0.AuxInt = int64ToAuxInt(log16(c))
16682 v.AddArg2(x, v0)
16683 return true
16684 }
16685 break
16686 }
16687
16688
16689
16690 for {
16691 t := v.Type
16692 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16693 x := v_0
16694 if v_1.Op != OpConst16 {
16695 continue
16696 }
16697 c := auxIntToInt16(v_1.AuxInt)
16698 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
16699 continue
16700 }
16701 v.reset(OpNeg16)
16702 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
16703 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
16704 v1.AuxInt = int64ToAuxInt(log16(-c))
16705 v0.AddArg2(x, v1)
16706 v.AddArg(v0)
16707 return true
16708 }
16709 break
16710 }
16711
16712
16713
16714 for {
16715 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16716 if v_0.Op != OpMul16 {
16717 continue
16718 }
16719 _ = v_0.Args[1]
16720 v_0_0 := v_0.Args[0]
16721 v_0_1 := v_0.Args[1]
16722 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
16723 i := v_0_0
16724 if i.Op != OpConst16 {
16725 continue
16726 }
16727 t := i.Type
16728 z := v_0_1
16729 x := v_1
16730 if !(z.Op != OpConst16 && x.Op != OpConst16) {
16731 continue
16732 }
16733 v.reset(OpMul16)
16734 v0 := b.NewValue0(v.Pos, OpMul16, t)
16735 v0.AddArg2(x, z)
16736 v.AddArg2(i, v0)
16737 return true
16738 }
16739 }
16740 break
16741 }
16742
16743
16744 for {
16745 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16746 if v_0.Op != OpConst16 {
16747 continue
16748 }
16749 t := v_0.Type
16750 c := auxIntToInt16(v_0.AuxInt)
16751 if v_1.Op != OpMul16 {
16752 continue
16753 }
16754 _ = v_1.Args[1]
16755 v_1_0 := v_1.Args[0]
16756 v_1_1 := v_1.Args[1]
16757 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
16758 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
16759 continue
16760 }
16761 d := auxIntToInt16(v_1_0.AuxInt)
16762 x := v_1_1
16763 v.reset(OpMul16)
16764 v0 := b.NewValue0(v.Pos, OpConst16, t)
16765 v0.AuxInt = int16ToAuxInt(c * d)
16766 v.AddArg2(v0, x)
16767 return true
16768 }
16769 }
16770 break
16771 }
16772 return false
16773 }
16774 func rewriteValuegeneric_OpMul32(v *Value) bool {
16775 v_1 := v.Args[1]
16776 v_0 := v.Args[0]
16777 b := v.Block
16778 typ := &b.Func.Config.Types
16779
16780
16781 for {
16782 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16783 if v_0.Op != OpConst32 {
16784 continue
16785 }
16786 c := auxIntToInt32(v_0.AuxInt)
16787 if v_1.Op != OpConst32 {
16788 continue
16789 }
16790 d := auxIntToInt32(v_1.AuxInt)
16791 v.reset(OpConst32)
16792 v.AuxInt = int32ToAuxInt(c * d)
16793 return true
16794 }
16795 break
16796 }
16797
16798
16799 for {
16800 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16801 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 {
16802 continue
16803 }
16804 x := v_1
16805 v.copyOf(x)
16806 return true
16807 }
16808 break
16809 }
16810
16811
16812 for {
16813 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16814 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
16815 continue
16816 }
16817 x := v_1
16818 v.reset(OpNeg32)
16819 v.AddArg(x)
16820 return true
16821 }
16822 break
16823 }
16824
16825
16826
16827 for {
16828 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16829 if v_0.Op != OpConst32 {
16830 continue
16831 }
16832 t := v_0.Type
16833 c := auxIntToInt32(v_0.AuxInt)
16834 if v_1.Op != OpAdd32 || v_1.Type != t {
16835 continue
16836 }
16837 _ = v_1.Args[1]
16838 v_1_0 := v_1.Args[0]
16839 v_1_1 := v_1.Args[1]
16840 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
16841 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
16842 continue
16843 }
16844 d := auxIntToInt32(v_1_0.AuxInt)
16845 x := v_1_1
16846 if !(!isPowerOfTwo(c)) {
16847 continue
16848 }
16849 v.reset(OpAdd32)
16850 v0 := b.NewValue0(v.Pos, OpConst32, t)
16851 v0.AuxInt = int32ToAuxInt(c * d)
16852 v1 := b.NewValue0(v.Pos, OpMul32, t)
16853 v2 := b.NewValue0(v.Pos, OpConst32, t)
16854 v2.AuxInt = int32ToAuxInt(c)
16855 v1.AddArg2(v2, x)
16856 v.AddArg2(v0, v1)
16857 return true
16858 }
16859 }
16860 break
16861 }
16862
16863
16864 for {
16865 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16866 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
16867 continue
16868 }
16869 v.reset(OpConst32)
16870 v.AuxInt = int32ToAuxInt(0)
16871 return true
16872 }
16873 break
16874 }
16875
16876
16877
16878 for {
16879 t := v.Type
16880 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16881 x := v_0
16882 if v_1.Op != OpConst32 {
16883 continue
16884 }
16885 c := auxIntToInt32(v_1.AuxInt)
16886 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
16887 continue
16888 }
16889 v.reset(OpLsh32x64)
16890 v.Type = t
16891 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
16892 v0.AuxInt = int64ToAuxInt(log32(c))
16893 v.AddArg2(x, v0)
16894 return true
16895 }
16896 break
16897 }
16898
16899
16900
16901 for {
16902 t := v.Type
16903 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16904 x := v_0
16905 if v_1.Op != OpConst32 {
16906 continue
16907 }
16908 c := auxIntToInt32(v_1.AuxInt)
16909 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
16910 continue
16911 }
16912 v.reset(OpNeg32)
16913 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
16914 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
16915 v1.AuxInt = int64ToAuxInt(log32(-c))
16916 v0.AddArg2(x, v1)
16917 v.AddArg(v0)
16918 return true
16919 }
16920 break
16921 }
16922
16923
16924
16925 for {
16926 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16927 if v_0.Op != OpMul32 {
16928 continue
16929 }
16930 _ = v_0.Args[1]
16931 v_0_0 := v_0.Args[0]
16932 v_0_1 := v_0.Args[1]
16933 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
16934 i := v_0_0
16935 if i.Op != OpConst32 {
16936 continue
16937 }
16938 t := i.Type
16939 z := v_0_1
16940 x := v_1
16941 if !(z.Op != OpConst32 && x.Op != OpConst32) {
16942 continue
16943 }
16944 v.reset(OpMul32)
16945 v0 := b.NewValue0(v.Pos, OpMul32, t)
16946 v0.AddArg2(x, z)
16947 v.AddArg2(i, v0)
16948 return true
16949 }
16950 }
16951 break
16952 }
16953
16954
16955 for {
16956 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16957 if v_0.Op != OpConst32 {
16958 continue
16959 }
16960 t := v_0.Type
16961 c := auxIntToInt32(v_0.AuxInt)
16962 if v_1.Op != OpMul32 {
16963 continue
16964 }
16965 _ = v_1.Args[1]
16966 v_1_0 := v_1.Args[0]
16967 v_1_1 := v_1.Args[1]
16968 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
16969 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
16970 continue
16971 }
16972 d := auxIntToInt32(v_1_0.AuxInt)
16973 x := v_1_1
16974 v.reset(OpMul32)
16975 v0 := b.NewValue0(v.Pos, OpConst32, t)
16976 v0.AuxInt = int32ToAuxInt(c * d)
16977 v.AddArg2(v0, x)
16978 return true
16979 }
16980 }
16981 break
16982 }
16983 return false
16984 }
16985 func rewriteValuegeneric_OpMul32F(v *Value) bool {
16986 v_1 := v.Args[1]
16987 v_0 := v.Args[0]
16988
16989
16990
16991 for {
16992 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16993 if v_0.Op != OpConst32F {
16994 continue
16995 }
16996 c := auxIntToFloat32(v_0.AuxInt)
16997 if v_1.Op != OpConst32F {
16998 continue
16999 }
17000 d := auxIntToFloat32(v_1.AuxInt)
17001 if !(c*d == c*d) {
17002 continue
17003 }
17004 v.reset(OpConst32F)
17005 v.AuxInt = float32ToAuxInt(c * d)
17006 return true
17007 }
17008 break
17009 }
17010
17011
17012 for {
17013 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17014 x := v_0
17015 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != 1 {
17016 continue
17017 }
17018 v.copyOf(x)
17019 return true
17020 }
17021 break
17022 }
17023
17024
17025 for {
17026 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17027 x := v_0
17028 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != -1 {
17029 continue
17030 }
17031 v.reset(OpNeg32F)
17032 v.AddArg(x)
17033 return true
17034 }
17035 break
17036 }
17037
17038
17039 for {
17040 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17041 x := v_0
17042 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != 2 {
17043 continue
17044 }
17045 v.reset(OpAdd32F)
17046 v.AddArg2(x, x)
17047 return true
17048 }
17049 break
17050 }
17051 return false
17052 }
17053 func rewriteValuegeneric_OpMul32uhilo(v *Value) bool {
17054 v_1 := v.Args[1]
17055 v_0 := v.Args[0]
17056 b := v.Block
17057 typ := &b.Func.Config.Types
17058
17059
17060 for {
17061 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17062 if v_0.Op != OpConst32 {
17063 continue
17064 }
17065 c := auxIntToInt32(v_0.AuxInt)
17066 if v_1.Op != OpConst32 {
17067 continue
17068 }
17069 d := auxIntToInt32(v_1.AuxInt)
17070 v.reset(OpMakeTuple)
17071 v0 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
17072 v0.AuxInt = int32ToAuxInt(bitsMulU32(c, d).hi)
17073 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
17074 v1.AuxInt = int32ToAuxInt(bitsMulU32(c, d).lo)
17075 v.AddArg2(v0, v1)
17076 return true
17077 }
17078 break
17079 }
17080 return false
17081 }
17082 func rewriteValuegeneric_OpMul32uover(v *Value) bool {
17083 v_1 := v.Args[1]
17084 v_0 := v.Args[0]
17085 b := v.Block
17086 typ := &b.Func.Config.Types
17087
17088
17089 for {
17090 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17091 if v_0.Op != OpConst32 {
17092 continue
17093 }
17094 c := auxIntToInt32(v_0.AuxInt)
17095 if v_1.Op != OpConst32 {
17096 continue
17097 }
17098 d := auxIntToInt32(v_1.AuxInt)
17099 v.reset(OpMakeTuple)
17100 v0 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
17101 v0.AuxInt = int32ToAuxInt(bitsMulU32(c, d).lo)
17102 v1 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
17103 v1.AuxInt = boolToAuxInt(bitsMulU32(c, d).hi != 0)
17104 v.AddArg2(v0, v1)
17105 return true
17106 }
17107 break
17108 }
17109
17110
17111 for {
17112 t := v.Type
17113 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17114 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 {
17115 continue
17116 }
17117 x := v_1
17118 v.reset(OpMakeTuple)
17119 v0 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
17120 v0.AuxInt = boolToAuxInt(false)
17121 v.AddArg2(x, v0)
17122 return true
17123 }
17124 break
17125 }
17126
17127
17128 for {
17129 t := v.Type
17130 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17131 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
17132 continue
17133 }
17134 v.reset(OpMakeTuple)
17135 v0 := b.NewValue0(v.Pos, OpConst32, t.FieldType(0))
17136 v0.AuxInt = int32ToAuxInt(0)
17137 v1 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
17138 v1.AuxInt = boolToAuxInt(false)
17139 v.AddArg2(v0, v1)
17140 return true
17141 }
17142 break
17143 }
17144 return false
17145 }
17146 func rewriteValuegeneric_OpMul64(v *Value) bool {
17147 v_1 := v.Args[1]
17148 v_0 := v.Args[0]
17149 b := v.Block
17150 typ := &b.Func.Config.Types
17151
17152
17153 for {
17154 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17155 if v_0.Op != OpConst64 {
17156 continue
17157 }
17158 c := auxIntToInt64(v_0.AuxInt)
17159 if v_1.Op != OpConst64 {
17160 continue
17161 }
17162 d := auxIntToInt64(v_1.AuxInt)
17163 v.reset(OpConst64)
17164 v.AuxInt = int64ToAuxInt(c * d)
17165 return true
17166 }
17167 break
17168 }
17169
17170
17171 for {
17172 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17173 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 {
17174 continue
17175 }
17176 x := v_1
17177 v.copyOf(x)
17178 return true
17179 }
17180 break
17181 }
17182
17183
17184 for {
17185 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17186 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
17187 continue
17188 }
17189 x := v_1
17190 v.reset(OpNeg64)
17191 v.AddArg(x)
17192 return true
17193 }
17194 break
17195 }
17196
17197
17198
17199 for {
17200 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17201 if v_0.Op != OpConst64 {
17202 continue
17203 }
17204 t := v_0.Type
17205 c := auxIntToInt64(v_0.AuxInt)
17206 if v_1.Op != OpAdd64 || v_1.Type != t {
17207 continue
17208 }
17209 _ = v_1.Args[1]
17210 v_1_0 := v_1.Args[0]
17211 v_1_1 := v_1.Args[1]
17212 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
17213 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
17214 continue
17215 }
17216 d := auxIntToInt64(v_1_0.AuxInt)
17217 x := v_1_1
17218 if !(!isPowerOfTwo(c)) {
17219 continue
17220 }
17221 v.reset(OpAdd64)
17222 v0 := b.NewValue0(v.Pos, OpConst64, t)
17223 v0.AuxInt = int64ToAuxInt(c * d)
17224 v1 := b.NewValue0(v.Pos, OpMul64, t)
17225 v2 := b.NewValue0(v.Pos, OpConst64, t)
17226 v2.AuxInt = int64ToAuxInt(c)
17227 v1.AddArg2(v2, x)
17228 v.AddArg2(v0, v1)
17229 return true
17230 }
17231 }
17232 break
17233 }
17234
17235
17236 for {
17237 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17238 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
17239 continue
17240 }
17241 v.reset(OpConst64)
17242 v.AuxInt = int64ToAuxInt(0)
17243 return true
17244 }
17245 break
17246 }
17247
17248
17249
17250 for {
17251 t := v.Type
17252 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17253 x := v_0
17254 if v_1.Op != OpConst64 {
17255 continue
17256 }
17257 c := auxIntToInt64(v_1.AuxInt)
17258 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
17259 continue
17260 }
17261 v.reset(OpLsh64x64)
17262 v.Type = t
17263 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17264 v0.AuxInt = int64ToAuxInt(log64(c))
17265 v.AddArg2(x, v0)
17266 return true
17267 }
17268 break
17269 }
17270
17271
17272
17273 for {
17274 t := v.Type
17275 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17276 x := v_0
17277 if v_1.Op != OpConst64 {
17278 continue
17279 }
17280 c := auxIntToInt64(v_1.AuxInt)
17281 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
17282 continue
17283 }
17284 v.reset(OpNeg64)
17285 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
17286 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17287 v1.AuxInt = int64ToAuxInt(log64(-c))
17288 v0.AddArg2(x, v1)
17289 v.AddArg(v0)
17290 return true
17291 }
17292 break
17293 }
17294
17295
17296
17297 for {
17298 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17299 if v_0.Op != OpMul64 {
17300 continue
17301 }
17302 _ = v_0.Args[1]
17303 v_0_0 := v_0.Args[0]
17304 v_0_1 := v_0.Args[1]
17305 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
17306 i := v_0_0
17307 if i.Op != OpConst64 {
17308 continue
17309 }
17310 t := i.Type
17311 z := v_0_1
17312 x := v_1
17313 if !(z.Op != OpConst64 && x.Op != OpConst64) {
17314 continue
17315 }
17316 v.reset(OpMul64)
17317 v0 := b.NewValue0(v.Pos, OpMul64, t)
17318 v0.AddArg2(x, z)
17319 v.AddArg2(i, v0)
17320 return true
17321 }
17322 }
17323 break
17324 }
17325
17326
17327 for {
17328 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17329 if v_0.Op != OpConst64 {
17330 continue
17331 }
17332 t := v_0.Type
17333 c := auxIntToInt64(v_0.AuxInt)
17334 if v_1.Op != OpMul64 {
17335 continue
17336 }
17337 _ = v_1.Args[1]
17338 v_1_0 := v_1.Args[0]
17339 v_1_1 := v_1.Args[1]
17340 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
17341 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
17342 continue
17343 }
17344 d := auxIntToInt64(v_1_0.AuxInt)
17345 x := v_1_1
17346 v.reset(OpMul64)
17347 v0 := b.NewValue0(v.Pos, OpConst64, t)
17348 v0.AuxInt = int64ToAuxInt(c * d)
17349 v.AddArg2(v0, x)
17350 return true
17351 }
17352 }
17353 break
17354 }
17355 return false
17356 }
17357 func rewriteValuegeneric_OpMul64F(v *Value) bool {
17358 v_1 := v.Args[1]
17359 v_0 := v.Args[0]
17360
17361
17362
17363 for {
17364 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17365 if v_0.Op != OpConst64F {
17366 continue
17367 }
17368 c := auxIntToFloat64(v_0.AuxInt)
17369 if v_1.Op != OpConst64F {
17370 continue
17371 }
17372 d := auxIntToFloat64(v_1.AuxInt)
17373 if !(c*d == c*d) {
17374 continue
17375 }
17376 v.reset(OpConst64F)
17377 v.AuxInt = float64ToAuxInt(c * d)
17378 return true
17379 }
17380 break
17381 }
17382
17383
17384 for {
17385 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17386 x := v_0
17387 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != 1 {
17388 continue
17389 }
17390 v.copyOf(x)
17391 return true
17392 }
17393 break
17394 }
17395
17396
17397 for {
17398 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17399 x := v_0
17400 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != -1 {
17401 continue
17402 }
17403 v.reset(OpNeg64F)
17404 v.AddArg(x)
17405 return true
17406 }
17407 break
17408 }
17409
17410
17411 for {
17412 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17413 x := v_0
17414 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != 2 {
17415 continue
17416 }
17417 v.reset(OpAdd64F)
17418 v.AddArg2(x, x)
17419 return true
17420 }
17421 break
17422 }
17423 return false
17424 }
17425 func rewriteValuegeneric_OpMul64uhilo(v *Value) bool {
17426 v_1 := v.Args[1]
17427 v_0 := v.Args[0]
17428 b := v.Block
17429 typ := &b.Func.Config.Types
17430
17431
17432 for {
17433 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17434 if v_0.Op != OpConst64 {
17435 continue
17436 }
17437 c := auxIntToInt64(v_0.AuxInt)
17438 if v_1.Op != OpConst64 {
17439 continue
17440 }
17441 d := auxIntToInt64(v_1.AuxInt)
17442 v.reset(OpMakeTuple)
17443 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17444 v0.AuxInt = int64ToAuxInt(bitsMulU64(c, d).hi)
17445 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17446 v1.AuxInt = int64ToAuxInt(bitsMulU64(c, d).lo)
17447 v.AddArg2(v0, v1)
17448 return true
17449 }
17450 break
17451 }
17452 return false
17453 }
17454 func rewriteValuegeneric_OpMul64uover(v *Value) bool {
17455 v_1 := v.Args[1]
17456 v_0 := v.Args[0]
17457 b := v.Block
17458 typ := &b.Func.Config.Types
17459
17460
17461 for {
17462 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17463 if v_0.Op != OpConst64 {
17464 continue
17465 }
17466 c := auxIntToInt64(v_0.AuxInt)
17467 if v_1.Op != OpConst64 {
17468 continue
17469 }
17470 d := auxIntToInt64(v_1.AuxInt)
17471 v.reset(OpMakeTuple)
17472 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17473 v0.AuxInt = int64ToAuxInt(bitsMulU64(c, d).lo)
17474 v1 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
17475 v1.AuxInt = boolToAuxInt(bitsMulU64(c, d).hi != 0)
17476 v.AddArg2(v0, v1)
17477 return true
17478 }
17479 break
17480 }
17481
17482
17483 for {
17484 t := v.Type
17485 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17486 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 {
17487 continue
17488 }
17489 x := v_1
17490 v.reset(OpMakeTuple)
17491 v0 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
17492 v0.AuxInt = boolToAuxInt(false)
17493 v.AddArg2(x, v0)
17494 return true
17495 }
17496 break
17497 }
17498
17499
17500 for {
17501 t := v.Type
17502 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17503 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
17504 continue
17505 }
17506 v.reset(OpMakeTuple)
17507 v0 := b.NewValue0(v.Pos, OpConst64, t.FieldType(0))
17508 v0.AuxInt = int64ToAuxInt(0)
17509 v1 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
17510 v1.AuxInt = boolToAuxInt(false)
17511 v.AddArg2(v0, v1)
17512 return true
17513 }
17514 break
17515 }
17516 return false
17517 }
17518 func rewriteValuegeneric_OpMul8(v *Value) bool {
17519 v_1 := v.Args[1]
17520 v_0 := v.Args[0]
17521 b := v.Block
17522 typ := &b.Func.Config.Types
17523
17524
17525 for {
17526 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17527 if v_0.Op != OpConst8 {
17528 continue
17529 }
17530 c := auxIntToInt8(v_0.AuxInt)
17531 if v_1.Op != OpConst8 {
17532 continue
17533 }
17534 d := auxIntToInt8(v_1.AuxInt)
17535 v.reset(OpConst8)
17536 v.AuxInt = int8ToAuxInt(c * d)
17537 return true
17538 }
17539 break
17540 }
17541
17542
17543 for {
17544 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17545 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 1 {
17546 continue
17547 }
17548 x := v_1
17549 v.copyOf(x)
17550 return true
17551 }
17552 break
17553 }
17554
17555
17556 for {
17557 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17558 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
17559 continue
17560 }
17561 x := v_1
17562 v.reset(OpNeg8)
17563 v.AddArg(x)
17564 return true
17565 }
17566 break
17567 }
17568
17569
17570
17571 for {
17572 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17573 if v_0.Op != OpConst8 {
17574 continue
17575 }
17576 t := v_0.Type
17577 c := auxIntToInt8(v_0.AuxInt)
17578 if v_1.Op != OpAdd8 || v_1.Type != t {
17579 continue
17580 }
17581 _ = v_1.Args[1]
17582 v_1_0 := v_1.Args[0]
17583 v_1_1 := v_1.Args[1]
17584 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
17585 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
17586 continue
17587 }
17588 d := auxIntToInt8(v_1_0.AuxInt)
17589 x := v_1_1
17590 if !(!isPowerOfTwo(c)) {
17591 continue
17592 }
17593 v.reset(OpAdd8)
17594 v0 := b.NewValue0(v.Pos, OpConst8, t)
17595 v0.AuxInt = int8ToAuxInt(c * d)
17596 v1 := b.NewValue0(v.Pos, OpMul8, t)
17597 v2 := b.NewValue0(v.Pos, OpConst8, t)
17598 v2.AuxInt = int8ToAuxInt(c)
17599 v1.AddArg2(v2, x)
17600 v.AddArg2(v0, v1)
17601 return true
17602 }
17603 }
17604 break
17605 }
17606
17607
17608 for {
17609 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17610 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
17611 continue
17612 }
17613 v.reset(OpConst8)
17614 v.AuxInt = int8ToAuxInt(0)
17615 return true
17616 }
17617 break
17618 }
17619
17620
17621
17622 for {
17623 t := v.Type
17624 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17625 x := v_0
17626 if v_1.Op != OpConst8 {
17627 continue
17628 }
17629 c := auxIntToInt8(v_1.AuxInt)
17630 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
17631 continue
17632 }
17633 v.reset(OpLsh8x64)
17634 v.Type = t
17635 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17636 v0.AuxInt = int64ToAuxInt(log8(c))
17637 v.AddArg2(x, v0)
17638 return true
17639 }
17640 break
17641 }
17642
17643
17644
17645 for {
17646 t := v.Type
17647 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17648 x := v_0
17649 if v_1.Op != OpConst8 {
17650 continue
17651 }
17652 c := auxIntToInt8(v_1.AuxInt)
17653 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
17654 continue
17655 }
17656 v.reset(OpNeg8)
17657 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
17658 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17659 v1.AuxInt = int64ToAuxInt(log8(-c))
17660 v0.AddArg2(x, v1)
17661 v.AddArg(v0)
17662 return true
17663 }
17664 break
17665 }
17666
17667
17668
17669 for {
17670 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17671 if v_0.Op != OpMul8 {
17672 continue
17673 }
17674 _ = v_0.Args[1]
17675 v_0_0 := v_0.Args[0]
17676 v_0_1 := v_0.Args[1]
17677 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
17678 i := v_0_0
17679 if i.Op != OpConst8 {
17680 continue
17681 }
17682 t := i.Type
17683 z := v_0_1
17684 x := v_1
17685 if !(z.Op != OpConst8 && x.Op != OpConst8) {
17686 continue
17687 }
17688 v.reset(OpMul8)
17689 v0 := b.NewValue0(v.Pos, OpMul8, t)
17690 v0.AddArg2(x, z)
17691 v.AddArg2(i, v0)
17692 return true
17693 }
17694 }
17695 break
17696 }
17697
17698
17699 for {
17700 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17701 if v_0.Op != OpConst8 {
17702 continue
17703 }
17704 t := v_0.Type
17705 c := auxIntToInt8(v_0.AuxInt)
17706 if v_1.Op != OpMul8 {
17707 continue
17708 }
17709 _ = v_1.Args[1]
17710 v_1_0 := v_1.Args[0]
17711 v_1_1 := v_1.Args[1]
17712 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
17713 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
17714 continue
17715 }
17716 d := auxIntToInt8(v_1_0.AuxInt)
17717 x := v_1_1
17718 v.reset(OpMul8)
17719 v0 := b.NewValue0(v.Pos, OpConst8, t)
17720 v0.AuxInt = int8ToAuxInt(c * d)
17721 v.AddArg2(v0, x)
17722 return true
17723 }
17724 }
17725 break
17726 }
17727 return false
17728 }
17729 func rewriteValuegeneric_OpNeg16(v *Value) bool {
17730 v_0 := v.Args[0]
17731 b := v.Block
17732
17733
17734 for {
17735 if v_0.Op != OpConst16 {
17736 break
17737 }
17738 c := auxIntToInt16(v_0.AuxInt)
17739 v.reset(OpConst16)
17740 v.AuxInt = int16ToAuxInt(-c)
17741 return true
17742 }
17743
17744
17745 for {
17746 if v_0.Op != OpSub16 {
17747 break
17748 }
17749 y := v_0.Args[1]
17750 x := v_0.Args[0]
17751 v.reset(OpSub16)
17752 v.AddArg2(y, x)
17753 return true
17754 }
17755
17756
17757 for {
17758 if v_0.Op != OpNeg16 {
17759 break
17760 }
17761 x := v_0.Args[0]
17762 v.copyOf(x)
17763 return true
17764 }
17765
17766
17767 for {
17768 t := v.Type
17769 if v_0.Op != OpCom16 {
17770 break
17771 }
17772 x := v_0.Args[0]
17773 v.reset(OpAdd16)
17774 v0 := b.NewValue0(v.Pos, OpConst16, t)
17775 v0.AuxInt = int16ToAuxInt(1)
17776 v.AddArg2(v0, x)
17777 return true
17778 }
17779 return false
17780 }
17781 func rewriteValuegeneric_OpNeg32(v *Value) bool {
17782 v_0 := v.Args[0]
17783 b := v.Block
17784
17785
17786 for {
17787 if v_0.Op != OpConst32 {
17788 break
17789 }
17790 c := auxIntToInt32(v_0.AuxInt)
17791 v.reset(OpConst32)
17792 v.AuxInt = int32ToAuxInt(-c)
17793 return true
17794 }
17795
17796
17797 for {
17798 if v_0.Op != OpSub32 {
17799 break
17800 }
17801 y := v_0.Args[1]
17802 x := v_0.Args[0]
17803 v.reset(OpSub32)
17804 v.AddArg2(y, x)
17805 return true
17806 }
17807
17808
17809 for {
17810 if v_0.Op != OpNeg32 {
17811 break
17812 }
17813 x := v_0.Args[0]
17814 v.copyOf(x)
17815 return true
17816 }
17817
17818
17819 for {
17820 t := v.Type
17821 if v_0.Op != OpCom32 {
17822 break
17823 }
17824 x := v_0.Args[0]
17825 v.reset(OpAdd32)
17826 v0 := b.NewValue0(v.Pos, OpConst32, t)
17827 v0.AuxInt = int32ToAuxInt(1)
17828 v.AddArg2(v0, x)
17829 return true
17830 }
17831 return false
17832 }
17833 func rewriteValuegeneric_OpNeg32F(v *Value) bool {
17834 v_0 := v.Args[0]
17835
17836
17837
17838 for {
17839 if v_0.Op != OpConst32F {
17840 break
17841 }
17842 c := auxIntToFloat32(v_0.AuxInt)
17843 if !(c != 0) {
17844 break
17845 }
17846 v.reset(OpConst32F)
17847 v.AuxInt = float32ToAuxInt(-c)
17848 return true
17849 }
17850 return false
17851 }
17852 func rewriteValuegeneric_OpNeg64(v *Value) bool {
17853 v_0 := v.Args[0]
17854 b := v.Block
17855
17856
17857 for {
17858 if v_0.Op != OpConst64 {
17859 break
17860 }
17861 c := auxIntToInt64(v_0.AuxInt)
17862 v.reset(OpConst64)
17863 v.AuxInt = int64ToAuxInt(-c)
17864 return true
17865 }
17866
17867
17868 for {
17869 if v_0.Op != OpSub64 {
17870 break
17871 }
17872 y := v_0.Args[1]
17873 x := v_0.Args[0]
17874 v.reset(OpSub64)
17875 v.AddArg2(y, x)
17876 return true
17877 }
17878
17879
17880 for {
17881 if v_0.Op != OpNeg64 {
17882 break
17883 }
17884 x := v_0.Args[0]
17885 v.copyOf(x)
17886 return true
17887 }
17888
17889
17890 for {
17891 t := v.Type
17892 if v_0.Op != OpCom64 {
17893 break
17894 }
17895 x := v_0.Args[0]
17896 v.reset(OpAdd64)
17897 v0 := b.NewValue0(v.Pos, OpConst64, t)
17898 v0.AuxInt = int64ToAuxInt(1)
17899 v.AddArg2(v0, x)
17900 return true
17901 }
17902 return false
17903 }
17904 func rewriteValuegeneric_OpNeg64F(v *Value) bool {
17905 v_0 := v.Args[0]
17906
17907
17908
17909 for {
17910 if v_0.Op != OpConst64F {
17911 break
17912 }
17913 c := auxIntToFloat64(v_0.AuxInt)
17914 if !(c != 0) {
17915 break
17916 }
17917 v.reset(OpConst64F)
17918 v.AuxInt = float64ToAuxInt(-c)
17919 return true
17920 }
17921 return false
17922 }
17923 func rewriteValuegeneric_OpNeg8(v *Value) bool {
17924 v_0 := v.Args[0]
17925 b := v.Block
17926
17927
17928 for {
17929 if v_0.Op != OpConst8 {
17930 break
17931 }
17932 c := auxIntToInt8(v_0.AuxInt)
17933 v.reset(OpConst8)
17934 v.AuxInt = int8ToAuxInt(-c)
17935 return true
17936 }
17937
17938
17939 for {
17940 if v_0.Op != OpSub8 {
17941 break
17942 }
17943 y := v_0.Args[1]
17944 x := v_0.Args[0]
17945 v.reset(OpSub8)
17946 v.AddArg2(y, x)
17947 return true
17948 }
17949
17950
17951 for {
17952 if v_0.Op != OpNeg8 {
17953 break
17954 }
17955 x := v_0.Args[0]
17956 v.copyOf(x)
17957 return true
17958 }
17959
17960
17961 for {
17962 t := v.Type
17963 if v_0.Op != OpCom8 {
17964 break
17965 }
17966 x := v_0.Args[0]
17967 v.reset(OpAdd8)
17968 v0 := b.NewValue0(v.Pos, OpConst8, t)
17969 v0.AuxInt = int8ToAuxInt(1)
17970 v.AddArg2(v0, x)
17971 return true
17972 }
17973 return false
17974 }
17975 func rewriteValuegeneric_OpNeq16(v *Value) bool {
17976 v_1 := v.Args[1]
17977 v_0 := v.Args[0]
17978 b := v.Block
17979
17980
17981 for {
17982 x := v_0
17983 if x != v_1 {
17984 break
17985 }
17986 v.reset(OpConstBool)
17987 v.AuxInt = boolToAuxInt(false)
17988 return true
17989 }
17990
17991
17992 for {
17993 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17994 if v_0.Op != OpConst16 {
17995 continue
17996 }
17997 t := v_0.Type
17998 c := auxIntToInt16(v_0.AuxInt)
17999 if v_1.Op != OpAdd16 {
18000 continue
18001 }
18002 _ = v_1.Args[1]
18003 v_1_0 := v_1.Args[0]
18004 v_1_1 := v_1.Args[1]
18005 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18006 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
18007 continue
18008 }
18009 d := auxIntToInt16(v_1_0.AuxInt)
18010 x := v_1_1
18011 v.reset(OpNeq16)
18012 v0 := b.NewValue0(v.Pos, OpConst16, t)
18013 v0.AuxInt = int16ToAuxInt(c - d)
18014 v.AddArg2(v0, x)
18015 return true
18016 }
18017 }
18018 break
18019 }
18020
18021
18022 for {
18023 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18024 if v_0.Op != OpConst16 {
18025 continue
18026 }
18027 c := auxIntToInt16(v_0.AuxInt)
18028 if v_1.Op != OpConst16 {
18029 continue
18030 }
18031 d := auxIntToInt16(v_1.AuxInt)
18032 v.reset(OpConstBool)
18033 v.AuxInt = boolToAuxInt(c != d)
18034 return true
18035 }
18036 break
18037 }
18038
18039
18040
18041 for {
18042 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18043 s := v_0
18044 if s.Op != OpSub16 {
18045 continue
18046 }
18047 y := s.Args[1]
18048 x := s.Args[0]
18049 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(s.Uses == 1) {
18050 continue
18051 }
18052 v.reset(OpNeq16)
18053 v.AddArg2(x, y)
18054 return true
18055 }
18056 break
18057 }
18058
18059
18060
18061 for {
18062 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18063 if v_0.Op != OpAnd16 {
18064 continue
18065 }
18066 t := v_0.Type
18067 _ = v_0.Args[1]
18068 v_0_0 := v_0.Args[0]
18069 v_0_1 := v_0.Args[1]
18070 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18071 x := v_0_0
18072 if v_0_1.Op != OpConst16 || v_0_1.Type != t {
18073 continue
18074 }
18075 y := auxIntToInt16(v_0_1.AuxInt)
18076 if v_1.Op != OpConst16 || v_1.Type != t || auxIntToInt16(v_1.AuxInt) != y || !(oneBit(y)) {
18077 continue
18078 }
18079 v.reset(OpEq16)
18080 v0 := b.NewValue0(v.Pos, OpAnd16, t)
18081 v1 := b.NewValue0(v.Pos, OpConst16, t)
18082 v1.AuxInt = int16ToAuxInt(y)
18083 v0.AddArg2(x, v1)
18084 v2 := b.NewValue0(v.Pos, OpConst16, t)
18085 v2.AuxInt = int16ToAuxInt(0)
18086 v.AddArg2(v0, v2)
18087 return true
18088 }
18089 }
18090 break
18091 }
18092
18093
18094 for {
18095 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18096 if v_0.Op != OpZeroExt8to16 {
18097 continue
18098 }
18099 v_0_0 := v_0.Args[0]
18100 if v_0_0.Op != OpCvtBoolToUint8 {
18101 continue
18102 }
18103 x := v_0_0.Args[0]
18104 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
18105 continue
18106 }
18107 v.copyOf(x)
18108 return true
18109 }
18110 break
18111 }
18112
18113
18114 for {
18115 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18116 if v_0.Op != OpZeroExt8to16 {
18117 continue
18118 }
18119 v_0_0 := v_0.Args[0]
18120 if v_0_0.Op != OpCvtBoolToUint8 {
18121 continue
18122 }
18123 x := v_0_0.Args[0]
18124 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
18125 continue
18126 }
18127 v.reset(OpNot)
18128 v.AddArg(x)
18129 return true
18130 }
18131 break
18132 }
18133
18134
18135 for {
18136 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18137 if v_0.Op != OpSignExt8to16 {
18138 continue
18139 }
18140 v_0_0 := v_0.Args[0]
18141 if v_0_0.Op != OpCvtBoolToUint8 {
18142 continue
18143 }
18144 x := v_0_0.Args[0]
18145 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
18146 continue
18147 }
18148 v.copyOf(x)
18149 return true
18150 }
18151 break
18152 }
18153
18154
18155 for {
18156 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18157 if v_0.Op != OpSignExt8to16 {
18158 continue
18159 }
18160 v_0_0 := v_0.Args[0]
18161 if v_0_0.Op != OpCvtBoolToUint8 {
18162 continue
18163 }
18164 x := v_0_0.Args[0]
18165 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
18166 continue
18167 }
18168 v.reset(OpNot)
18169 v.AddArg(x)
18170 return true
18171 }
18172 break
18173 }
18174 return false
18175 }
18176 func rewriteValuegeneric_OpNeq32(v *Value) bool {
18177 v_1 := v.Args[1]
18178 v_0 := v.Args[0]
18179 b := v.Block
18180
18181
18182 for {
18183 x := v_0
18184 if x != v_1 {
18185 break
18186 }
18187 v.reset(OpConstBool)
18188 v.AuxInt = boolToAuxInt(false)
18189 return true
18190 }
18191
18192
18193 for {
18194 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18195 if v_0.Op != OpConst32 {
18196 continue
18197 }
18198 t := v_0.Type
18199 c := auxIntToInt32(v_0.AuxInt)
18200 if v_1.Op != OpAdd32 {
18201 continue
18202 }
18203 _ = v_1.Args[1]
18204 v_1_0 := v_1.Args[0]
18205 v_1_1 := v_1.Args[1]
18206 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18207 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
18208 continue
18209 }
18210 d := auxIntToInt32(v_1_0.AuxInt)
18211 x := v_1_1
18212 v.reset(OpNeq32)
18213 v0 := b.NewValue0(v.Pos, OpConst32, t)
18214 v0.AuxInt = int32ToAuxInt(c - d)
18215 v.AddArg2(v0, x)
18216 return true
18217 }
18218 }
18219 break
18220 }
18221
18222
18223 for {
18224 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18225 if v_0.Op != OpConst32 {
18226 continue
18227 }
18228 c := auxIntToInt32(v_0.AuxInt)
18229 if v_1.Op != OpConst32 {
18230 continue
18231 }
18232 d := auxIntToInt32(v_1.AuxInt)
18233 v.reset(OpConstBool)
18234 v.AuxInt = boolToAuxInt(c != d)
18235 return true
18236 }
18237 break
18238 }
18239
18240
18241
18242 for {
18243 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18244 s := v_0
18245 if s.Op != OpSub32 {
18246 continue
18247 }
18248 y := s.Args[1]
18249 x := s.Args[0]
18250 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 || !(s.Uses == 1) {
18251 continue
18252 }
18253 v.reset(OpNeq32)
18254 v.AddArg2(x, y)
18255 return true
18256 }
18257 break
18258 }
18259
18260
18261
18262 for {
18263 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18264 if v_0.Op != OpAnd32 {
18265 continue
18266 }
18267 t := v_0.Type
18268 _ = v_0.Args[1]
18269 v_0_0 := v_0.Args[0]
18270 v_0_1 := v_0.Args[1]
18271 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18272 x := v_0_0
18273 if v_0_1.Op != OpConst32 || v_0_1.Type != t {
18274 continue
18275 }
18276 y := auxIntToInt32(v_0_1.AuxInt)
18277 if v_1.Op != OpConst32 || v_1.Type != t || auxIntToInt32(v_1.AuxInt) != y || !(oneBit(y)) {
18278 continue
18279 }
18280 v.reset(OpEq32)
18281 v0 := b.NewValue0(v.Pos, OpAnd32, t)
18282 v1 := b.NewValue0(v.Pos, OpConst32, t)
18283 v1.AuxInt = int32ToAuxInt(y)
18284 v0.AddArg2(x, v1)
18285 v2 := b.NewValue0(v.Pos, OpConst32, t)
18286 v2.AuxInt = int32ToAuxInt(0)
18287 v.AddArg2(v0, v2)
18288 return true
18289 }
18290 }
18291 break
18292 }
18293
18294
18295 for {
18296 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18297 if v_0.Op != OpZeroExt8to32 {
18298 continue
18299 }
18300 v_0_0 := v_0.Args[0]
18301 if v_0_0.Op != OpCvtBoolToUint8 {
18302 continue
18303 }
18304 x := v_0_0.Args[0]
18305 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
18306 continue
18307 }
18308 v.copyOf(x)
18309 return true
18310 }
18311 break
18312 }
18313
18314
18315 for {
18316 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18317 if v_0.Op != OpZeroExt8to32 {
18318 continue
18319 }
18320 v_0_0 := v_0.Args[0]
18321 if v_0_0.Op != OpCvtBoolToUint8 {
18322 continue
18323 }
18324 x := v_0_0.Args[0]
18325 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
18326 continue
18327 }
18328 v.reset(OpNot)
18329 v.AddArg(x)
18330 return true
18331 }
18332 break
18333 }
18334
18335
18336 for {
18337 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18338 if v_0.Op != OpSignExt8to32 {
18339 continue
18340 }
18341 v_0_0 := v_0.Args[0]
18342 if v_0_0.Op != OpCvtBoolToUint8 {
18343 continue
18344 }
18345 x := v_0_0.Args[0]
18346 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
18347 continue
18348 }
18349 v.copyOf(x)
18350 return true
18351 }
18352 break
18353 }
18354
18355
18356 for {
18357 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18358 if v_0.Op != OpSignExt8to32 {
18359 continue
18360 }
18361 v_0_0 := v_0.Args[0]
18362 if v_0_0.Op != OpCvtBoolToUint8 {
18363 continue
18364 }
18365 x := v_0_0.Args[0]
18366 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
18367 continue
18368 }
18369 v.reset(OpNot)
18370 v.AddArg(x)
18371 return true
18372 }
18373 break
18374 }
18375 return false
18376 }
18377 func rewriteValuegeneric_OpNeq32F(v *Value) bool {
18378 v_1 := v.Args[1]
18379 v_0 := v.Args[0]
18380
18381
18382 for {
18383 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18384 if v_0.Op != OpConst32F {
18385 continue
18386 }
18387 c := auxIntToFloat32(v_0.AuxInt)
18388 if v_1.Op != OpConst32F {
18389 continue
18390 }
18391 d := auxIntToFloat32(v_1.AuxInt)
18392 v.reset(OpConstBool)
18393 v.AuxInt = boolToAuxInt(c != d)
18394 return true
18395 }
18396 break
18397 }
18398 return false
18399 }
18400 func rewriteValuegeneric_OpNeq64(v *Value) bool {
18401 v_1 := v.Args[1]
18402 v_0 := v.Args[0]
18403 b := v.Block
18404
18405
18406 for {
18407 x := v_0
18408 if x != v_1 {
18409 break
18410 }
18411 v.reset(OpConstBool)
18412 v.AuxInt = boolToAuxInt(false)
18413 return true
18414 }
18415
18416
18417 for {
18418 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18419 if v_0.Op != OpConst64 {
18420 continue
18421 }
18422 t := v_0.Type
18423 c := auxIntToInt64(v_0.AuxInt)
18424 if v_1.Op != OpAdd64 {
18425 continue
18426 }
18427 _ = v_1.Args[1]
18428 v_1_0 := v_1.Args[0]
18429 v_1_1 := v_1.Args[1]
18430 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18431 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
18432 continue
18433 }
18434 d := auxIntToInt64(v_1_0.AuxInt)
18435 x := v_1_1
18436 v.reset(OpNeq64)
18437 v0 := b.NewValue0(v.Pos, OpConst64, t)
18438 v0.AuxInt = int64ToAuxInt(c - d)
18439 v.AddArg2(v0, x)
18440 return true
18441 }
18442 }
18443 break
18444 }
18445
18446
18447 for {
18448 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18449 if v_0.Op != OpConst64 {
18450 continue
18451 }
18452 c := auxIntToInt64(v_0.AuxInt)
18453 if v_1.Op != OpConst64 {
18454 continue
18455 }
18456 d := auxIntToInt64(v_1.AuxInt)
18457 v.reset(OpConstBool)
18458 v.AuxInt = boolToAuxInt(c != d)
18459 return true
18460 }
18461 break
18462 }
18463
18464
18465
18466 for {
18467 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18468 s := v_0
18469 if s.Op != OpSub64 {
18470 continue
18471 }
18472 y := s.Args[1]
18473 x := s.Args[0]
18474 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 || !(s.Uses == 1) {
18475 continue
18476 }
18477 v.reset(OpNeq64)
18478 v.AddArg2(x, y)
18479 return true
18480 }
18481 break
18482 }
18483
18484
18485
18486 for {
18487 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18488 if v_0.Op != OpAnd64 {
18489 continue
18490 }
18491 t := v_0.Type
18492 _ = v_0.Args[1]
18493 v_0_0 := v_0.Args[0]
18494 v_0_1 := v_0.Args[1]
18495 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18496 x := v_0_0
18497 if v_0_1.Op != OpConst64 || v_0_1.Type != t {
18498 continue
18499 }
18500 y := auxIntToInt64(v_0_1.AuxInt)
18501 if v_1.Op != OpConst64 || v_1.Type != t || auxIntToInt64(v_1.AuxInt) != y || !(oneBit(y)) {
18502 continue
18503 }
18504 v.reset(OpEq64)
18505 v0 := b.NewValue0(v.Pos, OpAnd64, t)
18506 v1 := b.NewValue0(v.Pos, OpConst64, t)
18507 v1.AuxInt = int64ToAuxInt(y)
18508 v0.AddArg2(x, v1)
18509 v2 := b.NewValue0(v.Pos, OpConst64, t)
18510 v2.AuxInt = int64ToAuxInt(0)
18511 v.AddArg2(v0, v2)
18512 return true
18513 }
18514 }
18515 break
18516 }
18517
18518
18519 for {
18520 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18521 if v_0.Op != OpZeroExt8to64 {
18522 continue
18523 }
18524 v_0_0 := v_0.Args[0]
18525 if v_0_0.Op != OpCvtBoolToUint8 {
18526 continue
18527 }
18528 x := v_0_0.Args[0]
18529 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
18530 continue
18531 }
18532 v.copyOf(x)
18533 return true
18534 }
18535 break
18536 }
18537
18538
18539 for {
18540 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18541 if v_0.Op != OpZeroExt8to64 {
18542 continue
18543 }
18544 v_0_0 := v_0.Args[0]
18545 if v_0_0.Op != OpCvtBoolToUint8 {
18546 continue
18547 }
18548 x := v_0_0.Args[0]
18549 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
18550 continue
18551 }
18552 v.reset(OpNot)
18553 v.AddArg(x)
18554 return true
18555 }
18556 break
18557 }
18558
18559
18560 for {
18561 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18562 if v_0.Op != OpSignExt8to64 {
18563 continue
18564 }
18565 v_0_0 := v_0.Args[0]
18566 if v_0_0.Op != OpCvtBoolToUint8 {
18567 continue
18568 }
18569 x := v_0_0.Args[0]
18570 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
18571 continue
18572 }
18573 v.copyOf(x)
18574 return true
18575 }
18576 break
18577 }
18578
18579
18580 for {
18581 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18582 if v_0.Op != OpSignExt8to64 {
18583 continue
18584 }
18585 v_0_0 := v_0.Args[0]
18586 if v_0_0.Op != OpCvtBoolToUint8 {
18587 continue
18588 }
18589 x := v_0_0.Args[0]
18590 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
18591 continue
18592 }
18593 v.reset(OpNot)
18594 v.AddArg(x)
18595 return true
18596 }
18597 break
18598 }
18599 return false
18600 }
18601 func rewriteValuegeneric_OpNeq64F(v *Value) bool {
18602 v_1 := v.Args[1]
18603 v_0 := v.Args[0]
18604
18605
18606 for {
18607 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18608 if v_0.Op != OpConst64F {
18609 continue
18610 }
18611 c := auxIntToFloat64(v_0.AuxInt)
18612 if v_1.Op != OpConst64F {
18613 continue
18614 }
18615 d := auxIntToFloat64(v_1.AuxInt)
18616 v.reset(OpConstBool)
18617 v.AuxInt = boolToAuxInt(c != d)
18618 return true
18619 }
18620 break
18621 }
18622 return false
18623 }
18624 func rewriteValuegeneric_OpNeq8(v *Value) bool {
18625 v_1 := v.Args[1]
18626 v_0 := v.Args[0]
18627 b := v.Block
18628
18629
18630 for {
18631 x := v_0
18632 if x != v_1 {
18633 break
18634 }
18635 v.reset(OpConstBool)
18636 v.AuxInt = boolToAuxInt(false)
18637 return true
18638 }
18639
18640
18641 for {
18642 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18643 if v_0.Op != OpConst8 {
18644 continue
18645 }
18646 t := v_0.Type
18647 c := auxIntToInt8(v_0.AuxInt)
18648 if v_1.Op != OpAdd8 {
18649 continue
18650 }
18651 _ = v_1.Args[1]
18652 v_1_0 := v_1.Args[0]
18653 v_1_1 := v_1.Args[1]
18654 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18655 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
18656 continue
18657 }
18658 d := auxIntToInt8(v_1_0.AuxInt)
18659 x := v_1_1
18660 v.reset(OpNeq8)
18661 v0 := b.NewValue0(v.Pos, OpConst8, t)
18662 v0.AuxInt = int8ToAuxInt(c - d)
18663 v.AddArg2(v0, x)
18664 return true
18665 }
18666 }
18667 break
18668 }
18669
18670
18671 for {
18672 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18673 if v_0.Op != OpConst8 {
18674 continue
18675 }
18676 c := auxIntToInt8(v_0.AuxInt)
18677 if v_1.Op != OpConst8 {
18678 continue
18679 }
18680 d := auxIntToInt8(v_1.AuxInt)
18681 v.reset(OpConstBool)
18682 v.AuxInt = boolToAuxInt(c != d)
18683 return true
18684 }
18685 break
18686 }
18687
18688
18689
18690 for {
18691 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18692 s := v_0
18693 if s.Op != OpSub8 {
18694 continue
18695 }
18696 y := s.Args[1]
18697 x := s.Args[0]
18698 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(s.Uses == 1) {
18699 continue
18700 }
18701 v.reset(OpNeq8)
18702 v.AddArg2(x, y)
18703 return true
18704 }
18705 break
18706 }
18707
18708
18709
18710 for {
18711 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18712 if v_0.Op != OpAnd8 {
18713 continue
18714 }
18715 t := v_0.Type
18716 _ = v_0.Args[1]
18717 v_0_0 := v_0.Args[0]
18718 v_0_1 := v_0.Args[1]
18719 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18720 x := v_0_0
18721 if v_0_1.Op != OpConst8 || v_0_1.Type != t {
18722 continue
18723 }
18724 y := auxIntToInt8(v_0_1.AuxInt)
18725 if v_1.Op != OpConst8 || v_1.Type != t || auxIntToInt8(v_1.AuxInt) != y || !(oneBit(y)) {
18726 continue
18727 }
18728 v.reset(OpEq8)
18729 v0 := b.NewValue0(v.Pos, OpAnd8, t)
18730 v1 := b.NewValue0(v.Pos, OpConst8, t)
18731 v1.AuxInt = int8ToAuxInt(y)
18732 v0.AddArg2(x, v1)
18733 v2 := b.NewValue0(v.Pos, OpConst8, t)
18734 v2.AuxInt = int8ToAuxInt(0)
18735 v.AddArg2(v0, v2)
18736 return true
18737 }
18738 }
18739 break
18740 }
18741
18742
18743 for {
18744 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18745 if v_0.Op != OpCvtBoolToUint8 {
18746 continue
18747 }
18748 x := v_0.Args[0]
18749 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
18750 continue
18751 }
18752 v.copyOf(x)
18753 return true
18754 }
18755 break
18756 }
18757
18758
18759 for {
18760 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18761 if v_0.Op != OpCvtBoolToUint8 {
18762 continue
18763 }
18764 x := v_0.Args[0]
18765 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 1 {
18766 continue
18767 }
18768 v.reset(OpNot)
18769 v.AddArg(x)
18770 return true
18771 }
18772 break
18773 }
18774 return false
18775 }
18776 func rewriteValuegeneric_OpNeqB(v *Value) bool {
18777 v_1 := v.Args[1]
18778 v_0 := v.Args[0]
18779
18780
18781 for {
18782 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18783 if v_0.Op != OpConstBool {
18784 continue
18785 }
18786 c := auxIntToBool(v_0.AuxInt)
18787 if v_1.Op != OpConstBool {
18788 continue
18789 }
18790 d := auxIntToBool(v_1.AuxInt)
18791 v.reset(OpConstBool)
18792 v.AuxInt = boolToAuxInt(c != d)
18793 return true
18794 }
18795 break
18796 }
18797
18798
18799 for {
18800 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18801 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
18802 continue
18803 }
18804 x := v_1
18805 v.copyOf(x)
18806 return true
18807 }
18808 break
18809 }
18810
18811
18812 for {
18813 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18814 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
18815 continue
18816 }
18817 x := v_1
18818 v.reset(OpNot)
18819 v.AddArg(x)
18820 return true
18821 }
18822 break
18823 }
18824
18825
18826 for {
18827 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18828 if v_0.Op != OpNot {
18829 continue
18830 }
18831 x := v_0.Args[0]
18832 if v_1.Op != OpNot {
18833 continue
18834 }
18835 y := v_1.Args[0]
18836 v.reset(OpNeqB)
18837 v.AddArg2(x, y)
18838 return true
18839 }
18840 break
18841 }
18842 return false
18843 }
18844 func rewriteValuegeneric_OpNeqInter(v *Value) bool {
18845 v_1 := v.Args[1]
18846 v_0 := v.Args[0]
18847 b := v.Block
18848 typ := &b.Func.Config.Types
18849
18850
18851 for {
18852 x := v_0
18853 y := v_1
18854 v.reset(OpNeqPtr)
18855 v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
18856 v0.AddArg(x)
18857 v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
18858 v1.AddArg(y)
18859 v.AddArg2(v0, v1)
18860 return true
18861 }
18862 }
18863 func rewriteValuegeneric_OpNeqPtr(v *Value) bool {
18864 v_1 := v.Args[1]
18865 v_0 := v.Args[0]
18866
18867
18868 for {
18869 x := v_0
18870 if x != v_1 {
18871 break
18872 }
18873 v.reset(OpConstBool)
18874 v.AuxInt = boolToAuxInt(false)
18875 return true
18876 }
18877
18878
18879 for {
18880 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18881 if v_0.Op != OpAddr {
18882 continue
18883 }
18884 x := auxToSym(v_0.Aux)
18885 if v_1.Op != OpAddr {
18886 continue
18887 }
18888 y := auxToSym(v_1.Aux)
18889 v.reset(OpConstBool)
18890 v.AuxInt = boolToAuxInt(x != y)
18891 return true
18892 }
18893 break
18894 }
18895
18896
18897 for {
18898 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18899 if v_0.Op != OpAddr {
18900 continue
18901 }
18902 x := auxToSym(v_0.Aux)
18903 if v_1.Op != OpOffPtr {
18904 continue
18905 }
18906 o := auxIntToInt64(v_1.AuxInt)
18907 v_1_0 := v_1.Args[0]
18908 if v_1_0.Op != OpAddr {
18909 continue
18910 }
18911 y := auxToSym(v_1_0.Aux)
18912 v.reset(OpConstBool)
18913 v.AuxInt = boolToAuxInt(x != y || o != 0)
18914 return true
18915 }
18916 break
18917 }
18918
18919
18920 for {
18921 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18922 if v_0.Op != OpOffPtr {
18923 continue
18924 }
18925 o1 := auxIntToInt64(v_0.AuxInt)
18926 v_0_0 := v_0.Args[0]
18927 if v_0_0.Op != OpAddr {
18928 continue
18929 }
18930 x := auxToSym(v_0_0.Aux)
18931 if v_1.Op != OpOffPtr {
18932 continue
18933 }
18934 o2 := auxIntToInt64(v_1.AuxInt)
18935 v_1_0 := v_1.Args[0]
18936 if v_1_0.Op != OpAddr {
18937 continue
18938 }
18939 y := auxToSym(v_1_0.Aux)
18940 v.reset(OpConstBool)
18941 v.AuxInt = boolToAuxInt(x != y || o1 != o2)
18942 return true
18943 }
18944 break
18945 }
18946
18947
18948 for {
18949 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18950 if v_0.Op != OpLocalAddr {
18951 continue
18952 }
18953 x := auxToSym(v_0.Aux)
18954 if v_1.Op != OpLocalAddr {
18955 continue
18956 }
18957 y := auxToSym(v_1.Aux)
18958 v.reset(OpConstBool)
18959 v.AuxInt = boolToAuxInt(x != y)
18960 return true
18961 }
18962 break
18963 }
18964
18965
18966 for {
18967 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18968 if v_0.Op != OpLocalAddr {
18969 continue
18970 }
18971 x := auxToSym(v_0.Aux)
18972 if v_1.Op != OpOffPtr {
18973 continue
18974 }
18975 o := auxIntToInt64(v_1.AuxInt)
18976 v_1_0 := v_1.Args[0]
18977 if v_1_0.Op != OpLocalAddr {
18978 continue
18979 }
18980 y := auxToSym(v_1_0.Aux)
18981 v.reset(OpConstBool)
18982 v.AuxInt = boolToAuxInt(x != y || o != 0)
18983 return true
18984 }
18985 break
18986 }
18987
18988
18989 for {
18990 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18991 if v_0.Op != OpOffPtr {
18992 continue
18993 }
18994 o1 := auxIntToInt64(v_0.AuxInt)
18995 v_0_0 := v_0.Args[0]
18996 if v_0_0.Op != OpLocalAddr {
18997 continue
18998 }
18999 x := auxToSym(v_0_0.Aux)
19000 if v_1.Op != OpOffPtr {
19001 continue
19002 }
19003 o2 := auxIntToInt64(v_1.AuxInt)
19004 v_1_0 := v_1.Args[0]
19005 if v_1_0.Op != OpLocalAddr {
19006 continue
19007 }
19008 y := auxToSym(v_1_0.Aux)
19009 v.reset(OpConstBool)
19010 v.AuxInt = boolToAuxInt(x != y || o1 != o2)
19011 return true
19012 }
19013 break
19014 }
19015
19016
19017
19018 for {
19019 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19020 if v_0.Op != OpOffPtr {
19021 continue
19022 }
19023 o1 := auxIntToInt64(v_0.AuxInt)
19024 p1 := v_0.Args[0]
19025 p2 := v_1
19026 if !(isSamePtr(p1, p2)) {
19027 continue
19028 }
19029 v.reset(OpConstBool)
19030 v.AuxInt = boolToAuxInt(o1 != 0)
19031 return true
19032 }
19033 break
19034 }
19035
19036
19037
19038 for {
19039 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19040 if v_0.Op != OpOffPtr {
19041 continue
19042 }
19043 o1 := auxIntToInt64(v_0.AuxInt)
19044 p1 := v_0.Args[0]
19045 if v_1.Op != OpOffPtr {
19046 continue
19047 }
19048 o2 := auxIntToInt64(v_1.AuxInt)
19049 p2 := v_1.Args[0]
19050 if !(isSamePtr(p1, p2)) {
19051 continue
19052 }
19053 v.reset(OpConstBool)
19054 v.AuxInt = boolToAuxInt(o1 != o2)
19055 return true
19056 }
19057 break
19058 }
19059
19060
19061 for {
19062 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19063 if v_0.Op != OpConst32 {
19064 continue
19065 }
19066 c := auxIntToInt32(v_0.AuxInt)
19067 if v_1.Op != OpConst32 {
19068 continue
19069 }
19070 d := auxIntToInt32(v_1.AuxInt)
19071 v.reset(OpConstBool)
19072 v.AuxInt = boolToAuxInt(c != d)
19073 return true
19074 }
19075 break
19076 }
19077
19078
19079 for {
19080 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19081 if v_0.Op != OpConst64 {
19082 continue
19083 }
19084 c := auxIntToInt64(v_0.AuxInt)
19085 if v_1.Op != OpConst64 {
19086 continue
19087 }
19088 d := auxIntToInt64(v_1.AuxInt)
19089 v.reset(OpConstBool)
19090 v.AuxInt = boolToAuxInt(c != d)
19091 return true
19092 }
19093 break
19094 }
19095
19096
19097 for {
19098 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19099 if v_0.Op != OpConvert {
19100 continue
19101 }
19102 v_0_0 := v_0.Args[0]
19103 if v_0_0.Op != OpAddr {
19104 continue
19105 }
19106 x := auxToSym(v_0_0.Aux)
19107 if v_1.Op != OpAddr {
19108 continue
19109 }
19110 y := auxToSym(v_1.Aux)
19111 v.reset(OpConstBool)
19112 v.AuxInt = boolToAuxInt(x != y)
19113 return true
19114 }
19115 break
19116 }
19117
19118
19119 for {
19120 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19121 if v_0.Op != OpLocalAddr || v_1.Op != OpAddr {
19122 continue
19123 }
19124 v.reset(OpConstBool)
19125 v.AuxInt = boolToAuxInt(true)
19126 return true
19127 }
19128 break
19129 }
19130
19131
19132 for {
19133 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19134 if v_0.Op != OpOffPtr {
19135 continue
19136 }
19137 v_0_0 := v_0.Args[0]
19138 if v_0_0.Op != OpLocalAddr || v_1.Op != OpAddr {
19139 continue
19140 }
19141 v.reset(OpConstBool)
19142 v.AuxInt = boolToAuxInt(true)
19143 return true
19144 }
19145 break
19146 }
19147
19148
19149 for {
19150 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19151 if v_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
19152 continue
19153 }
19154 v_1_0 := v_1.Args[0]
19155 if v_1_0.Op != OpAddr {
19156 continue
19157 }
19158 v.reset(OpConstBool)
19159 v.AuxInt = boolToAuxInt(true)
19160 return true
19161 }
19162 break
19163 }
19164
19165
19166 for {
19167 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19168 if v_0.Op != OpOffPtr {
19169 continue
19170 }
19171 v_0_0 := v_0.Args[0]
19172 if v_0_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
19173 continue
19174 }
19175 v_1_0 := v_1.Args[0]
19176 if v_1_0.Op != OpAddr {
19177 continue
19178 }
19179 v.reset(OpConstBool)
19180 v.AuxInt = boolToAuxInt(true)
19181 return true
19182 }
19183 break
19184 }
19185
19186
19187
19188 for {
19189 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19190 if v_0.Op != OpAddPtr {
19191 continue
19192 }
19193 o1 := v_0.Args[1]
19194 p1 := v_0.Args[0]
19195 p2 := v_1
19196 if !(isSamePtr(p1, p2)) {
19197 continue
19198 }
19199 v.reset(OpIsNonNil)
19200 v.AddArg(o1)
19201 return true
19202 }
19203 break
19204 }
19205
19206
19207 for {
19208 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19209 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
19210 continue
19211 }
19212 p := v_1
19213 v.reset(OpIsNonNil)
19214 v.AddArg(p)
19215 return true
19216 }
19217 break
19218 }
19219
19220
19221 for {
19222 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19223 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
19224 continue
19225 }
19226 p := v_1
19227 v.reset(OpIsNonNil)
19228 v.AddArg(p)
19229 return true
19230 }
19231 break
19232 }
19233
19234
19235 for {
19236 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19237 if v_0.Op != OpConstNil {
19238 continue
19239 }
19240 p := v_1
19241 v.reset(OpIsNonNil)
19242 v.AddArg(p)
19243 return true
19244 }
19245 break
19246 }
19247 return false
19248 }
19249 func rewriteValuegeneric_OpNeqSlice(v *Value) bool {
19250 v_1 := v.Args[1]
19251 v_0 := v.Args[0]
19252 b := v.Block
19253 typ := &b.Func.Config.Types
19254
19255
19256 for {
19257 x := v_0
19258 y := v_1
19259 v.reset(OpNeqPtr)
19260 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
19261 v0.AddArg(x)
19262 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
19263 v1.AddArg(y)
19264 v.AddArg2(v0, v1)
19265 return true
19266 }
19267 }
19268 func rewriteValuegeneric_OpNilCheck(v *Value) bool {
19269 v_1 := v.Args[1]
19270 v_0 := v.Args[0]
19271 b := v.Block
19272 fe := b.Func.fe
19273
19274
19275 for {
19276 ptr := v_0
19277 if ptr.Op != OpGetG {
19278 break
19279 }
19280 mem := ptr.Args[0]
19281 if mem != v_1 {
19282 break
19283 }
19284 v.copyOf(ptr)
19285 return true
19286 }
19287
19288
19289
19290 for {
19291 ptr := v_0
19292 if ptr.Op != OpSelectN || auxIntToInt64(ptr.AuxInt) != 0 {
19293 break
19294 }
19295 call := ptr.Args[0]
19296 if call.Op != OpStaticLECall {
19297 break
19298 }
19299 if !(isMalloc(call.Aux) && warnRule(fe.Debug_checknil(), v, "removed nil check")) {
19300 break
19301 }
19302 v.copyOf(ptr)
19303 return true
19304 }
19305
19306
19307
19308 for {
19309 ptr := v_0
19310 if ptr.Op != OpOffPtr {
19311 break
19312 }
19313 ptr_0 := ptr.Args[0]
19314 if ptr_0.Op != OpSelectN || auxIntToInt64(ptr_0.AuxInt) != 0 {
19315 break
19316 }
19317 call := ptr_0.Args[0]
19318 if call.Op != OpStaticLECall {
19319 break
19320 }
19321 if !(isMalloc(call.Aux) && warnRule(fe.Debug_checknil(), v, "removed nil check")) {
19322 break
19323 }
19324 v.copyOf(ptr)
19325 return true
19326 }
19327
19328
19329 for {
19330 ptr := v_0
19331 if ptr.Op != OpAddr {
19332 break
19333 }
19334 ptr_0 := ptr.Args[0]
19335 if ptr_0.Op != OpSB {
19336 break
19337 }
19338 v.copyOf(ptr)
19339 return true
19340 }
19341
19342
19343 for {
19344 ptr := v_0
19345 if ptr.Op != OpConvert {
19346 break
19347 }
19348 ptr_0 := ptr.Args[0]
19349 if ptr_0.Op != OpAddr {
19350 break
19351 }
19352 ptr_0_0 := ptr_0.Args[0]
19353 if ptr_0_0.Op != OpSB {
19354 break
19355 }
19356 v.copyOf(ptr)
19357 return true
19358 }
19359
19360
19361
19362 for {
19363 ptr := v_0
19364 if ptr.Op != OpLocalAddr || !(warnRule(fe.Debug_checknil(), v, "removed nil check")) {
19365 break
19366 }
19367 v.copyOf(ptr)
19368 return true
19369 }
19370
19371
19372
19373 for {
19374 ptr := v_0
19375 if ptr.Op != OpArg {
19376 break
19377 }
19378 sym := auxToSym(ptr.Aux)
19379 if !(isDictArgSym(sym)) {
19380 break
19381 }
19382 v.copyOf(ptr)
19383 return true
19384 }
19385
19386
19387 for {
19388 ptr := v_0
19389 if ptr.Op != OpNilCheck {
19390 break
19391 }
19392 v.copyOf(ptr)
19393 return true
19394 }
19395 return false
19396 }
19397 func rewriteValuegeneric_OpNot(v *Value) bool {
19398 v_0 := v.Args[0]
19399
19400
19401 for {
19402 if v_0.Op != OpConstBool {
19403 break
19404 }
19405 c := auxIntToBool(v_0.AuxInt)
19406 v.reset(OpConstBool)
19407 v.AuxInt = boolToAuxInt(!c)
19408 return true
19409 }
19410
19411
19412 for {
19413 if v_0.Op != OpEq64 {
19414 break
19415 }
19416 y := v_0.Args[1]
19417 x := v_0.Args[0]
19418 v.reset(OpNeq64)
19419 v.AddArg2(x, y)
19420 return true
19421 }
19422
19423
19424 for {
19425 if v_0.Op != OpEq32 {
19426 break
19427 }
19428 y := v_0.Args[1]
19429 x := v_0.Args[0]
19430 v.reset(OpNeq32)
19431 v.AddArg2(x, y)
19432 return true
19433 }
19434
19435
19436 for {
19437 if v_0.Op != OpEq16 {
19438 break
19439 }
19440 y := v_0.Args[1]
19441 x := v_0.Args[0]
19442 v.reset(OpNeq16)
19443 v.AddArg2(x, y)
19444 return true
19445 }
19446
19447
19448 for {
19449 if v_0.Op != OpEq8 {
19450 break
19451 }
19452 y := v_0.Args[1]
19453 x := v_0.Args[0]
19454 v.reset(OpNeq8)
19455 v.AddArg2(x, y)
19456 return true
19457 }
19458
19459
19460 for {
19461 if v_0.Op != OpEqB {
19462 break
19463 }
19464 y := v_0.Args[1]
19465 x := v_0.Args[0]
19466 v.reset(OpNeqB)
19467 v.AddArg2(x, y)
19468 return true
19469 }
19470
19471
19472 for {
19473 if v_0.Op != OpEqPtr {
19474 break
19475 }
19476 y := v_0.Args[1]
19477 x := v_0.Args[0]
19478 v.reset(OpNeqPtr)
19479 v.AddArg2(x, y)
19480 return true
19481 }
19482
19483
19484 for {
19485 if v_0.Op != OpEq64F {
19486 break
19487 }
19488 y := v_0.Args[1]
19489 x := v_0.Args[0]
19490 v.reset(OpNeq64F)
19491 v.AddArg2(x, y)
19492 return true
19493 }
19494
19495
19496 for {
19497 if v_0.Op != OpEq32F {
19498 break
19499 }
19500 y := v_0.Args[1]
19501 x := v_0.Args[0]
19502 v.reset(OpNeq32F)
19503 v.AddArg2(x, y)
19504 return true
19505 }
19506
19507
19508 for {
19509 if v_0.Op != OpNeq64 {
19510 break
19511 }
19512 y := v_0.Args[1]
19513 x := v_0.Args[0]
19514 v.reset(OpEq64)
19515 v.AddArg2(x, y)
19516 return true
19517 }
19518
19519
19520 for {
19521 if v_0.Op != OpNeq32 {
19522 break
19523 }
19524 y := v_0.Args[1]
19525 x := v_0.Args[0]
19526 v.reset(OpEq32)
19527 v.AddArg2(x, y)
19528 return true
19529 }
19530
19531
19532 for {
19533 if v_0.Op != OpNeq16 {
19534 break
19535 }
19536 y := v_0.Args[1]
19537 x := v_0.Args[0]
19538 v.reset(OpEq16)
19539 v.AddArg2(x, y)
19540 return true
19541 }
19542
19543
19544 for {
19545 if v_0.Op != OpNeq8 {
19546 break
19547 }
19548 y := v_0.Args[1]
19549 x := v_0.Args[0]
19550 v.reset(OpEq8)
19551 v.AddArg2(x, y)
19552 return true
19553 }
19554
19555
19556 for {
19557 if v_0.Op != OpNeqB {
19558 break
19559 }
19560 y := v_0.Args[1]
19561 x := v_0.Args[0]
19562 v.reset(OpEqB)
19563 v.AddArg2(x, y)
19564 return true
19565 }
19566
19567
19568 for {
19569 if v_0.Op != OpNeqPtr {
19570 break
19571 }
19572 y := v_0.Args[1]
19573 x := v_0.Args[0]
19574 v.reset(OpEqPtr)
19575 v.AddArg2(x, y)
19576 return true
19577 }
19578
19579
19580 for {
19581 if v_0.Op != OpNeq64F {
19582 break
19583 }
19584 y := v_0.Args[1]
19585 x := v_0.Args[0]
19586 v.reset(OpEq64F)
19587 v.AddArg2(x, y)
19588 return true
19589 }
19590
19591
19592 for {
19593 if v_0.Op != OpNeq32F {
19594 break
19595 }
19596 y := v_0.Args[1]
19597 x := v_0.Args[0]
19598 v.reset(OpEq32F)
19599 v.AddArg2(x, y)
19600 return true
19601 }
19602
19603
19604 for {
19605 if v_0.Op != OpLess64 {
19606 break
19607 }
19608 y := v_0.Args[1]
19609 x := v_0.Args[0]
19610 v.reset(OpLeq64)
19611 v.AddArg2(y, x)
19612 return true
19613 }
19614
19615
19616 for {
19617 if v_0.Op != OpLess32 {
19618 break
19619 }
19620 y := v_0.Args[1]
19621 x := v_0.Args[0]
19622 v.reset(OpLeq32)
19623 v.AddArg2(y, x)
19624 return true
19625 }
19626
19627
19628 for {
19629 if v_0.Op != OpLess16 {
19630 break
19631 }
19632 y := v_0.Args[1]
19633 x := v_0.Args[0]
19634 v.reset(OpLeq16)
19635 v.AddArg2(y, x)
19636 return true
19637 }
19638
19639
19640 for {
19641 if v_0.Op != OpLess8 {
19642 break
19643 }
19644 y := v_0.Args[1]
19645 x := v_0.Args[0]
19646 v.reset(OpLeq8)
19647 v.AddArg2(y, x)
19648 return true
19649 }
19650
19651
19652 for {
19653 if v_0.Op != OpLess64U {
19654 break
19655 }
19656 y := v_0.Args[1]
19657 x := v_0.Args[0]
19658 v.reset(OpLeq64U)
19659 v.AddArg2(y, x)
19660 return true
19661 }
19662
19663
19664 for {
19665 if v_0.Op != OpLess32U {
19666 break
19667 }
19668 y := v_0.Args[1]
19669 x := v_0.Args[0]
19670 v.reset(OpLeq32U)
19671 v.AddArg2(y, x)
19672 return true
19673 }
19674
19675
19676 for {
19677 if v_0.Op != OpLess16U {
19678 break
19679 }
19680 y := v_0.Args[1]
19681 x := v_0.Args[0]
19682 v.reset(OpLeq16U)
19683 v.AddArg2(y, x)
19684 return true
19685 }
19686
19687
19688 for {
19689 if v_0.Op != OpLess8U {
19690 break
19691 }
19692 y := v_0.Args[1]
19693 x := v_0.Args[0]
19694 v.reset(OpLeq8U)
19695 v.AddArg2(y, x)
19696 return true
19697 }
19698
19699
19700 for {
19701 if v_0.Op != OpLeq64 {
19702 break
19703 }
19704 y := v_0.Args[1]
19705 x := v_0.Args[0]
19706 v.reset(OpLess64)
19707 v.AddArg2(y, x)
19708 return true
19709 }
19710
19711
19712 for {
19713 if v_0.Op != OpLeq32 {
19714 break
19715 }
19716 y := v_0.Args[1]
19717 x := v_0.Args[0]
19718 v.reset(OpLess32)
19719 v.AddArg2(y, x)
19720 return true
19721 }
19722
19723
19724 for {
19725 if v_0.Op != OpLeq16 {
19726 break
19727 }
19728 y := v_0.Args[1]
19729 x := v_0.Args[0]
19730 v.reset(OpLess16)
19731 v.AddArg2(y, x)
19732 return true
19733 }
19734
19735
19736 for {
19737 if v_0.Op != OpLeq8 {
19738 break
19739 }
19740 y := v_0.Args[1]
19741 x := v_0.Args[0]
19742 v.reset(OpLess8)
19743 v.AddArg2(y, x)
19744 return true
19745 }
19746
19747
19748 for {
19749 if v_0.Op != OpLeq64U {
19750 break
19751 }
19752 y := v_0.Args[1]
19753 x := v_0.Args[0]
19754 v.reset(OpLess64U)
19755 v.AddArg2(y, x)
19756 return true
19757 }
19758
19759
19760 for {
19761 if v_0.Op != OpLeq32U {
19762 break
19763 }
19764 y := v_0.Args[1]
19765 x := v_0.Args[0]
19766 v.reset(OpLess32U)
19767 v.AddArg2(y, x)
19768 return true
19769 }
19770
19771
19772 for {
19773 if v_0.Op != OpLeq16U {
19774 break
19775 }
19776 y := v_0.Args[1]
19777 x := v_0.Args[0]
19778 v.reset(OpLess16U)
19779 v.AddArg2(y, x)
19780 return true
19781 }
19782
19783
19784 for {
19785 if v_0.Op != OpLeq8U {
19786 break
19787 }
19788 y := v_0.Args[1]
19789 x := v_0.Args[0]
19790 v.reset(OpLess8U)
19791 v.AddArg2(y, x)
19792 return true
19793 }
19794 return false
19795 }
19796 func rewriteValuegeneric_OpOffPtr(v *Value) bool {
19797 v_0 := v.Args[0]
19798
19799
19800 for {
19801 x := auxIntToInt64(v.AuxInt)
19802 if v_0.Op != OpOffPtr {
19803 break
19804 }
19805 y := auxIntToInt64(v_0.AuxInt)
19806 p := v_0.Args[0]
19807 v.reset(OpOffPtr)
19808 v.AuxInt = int64ToAuxInt(x + y)
19809 v.AddArg(p)
19810 return true
19811 }
19812
19813
19814
19815 for {
19816 if auxIntToInt64(v.AuxInt) != 0 {
19817 break
19818 }
19819 p := v_0
19820 if !(v.Type.Compare(p.Type) == types.CMPeq) {
19821 break
19822 }
19823 v.copyOf(p)
19824 return true
19825 }
19826 return false
19827 }
19828 func rewriteValuegeneric_OpOr16(v *Value) bool {
19829 v_1 := v.Args[1]
19830 v_0 := v.Args[0]
19831 b := v.Block
19832 config := b.Func.Config
19833
19834
19835 for {
19836 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19837 if v_0.Op != OpConst16 {
19838 continue
19839 }
19840 c := auxIntToInt16(v_0.AuxInt)
19841 if v_1.Op != OpConst16 {
19842 continue
19843 }
19844 d := auxIntToInt16(v_1.AuxInt)
19845 v.reset(OpConst16)
19846 v.AuxInt = int16ToAuxInt(c | d)
19847 return true
19848 }
19849 break
19850 }
19851
19852
19853 for {
19854 t := v.Type
19855 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19856 if v_0.Op != OpCom16 {
19857 continue
19858 }
19859 x := v_0.Args[0]
19860 if v_1.Op != OpCom16 {
19861 continue
19862 }
19863 y := v_1.Args[0]
19864 v.reset(OpCom16)
19865 v0 := b.NewValue0(v.Pos, OpAnd16, t)
19866 v0.AddArg2(x, y)
19867 v.AddArg(v0)
19868 return true
19869 }
19870 break
19871 }
19872
19873
19874 for {
19875 x := v_0
19876 if x != v_1 {
19877 break
19878 }
19879 v.copyOf(x)
19880 return true
19881 }
19882
19883
19884 for {
19885 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19886 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
19887 continue
19888 }
19889 x := v_1
19890 v.copyOf(x)
19891 return true
19892 }
19893 break
19894 }
19895
19896
19897 for {
19898 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19899 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
19900 continue
19901 }
19902 v.reset(OpConst16)
19903 v.AuxInt = int16ToAuxInt(-1)
19904 return true
19905 }
19906 break
19907 }
19908
19909
19910 for {
19911 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19912 if v_0.Op != OpCom16 {
19913 continue
19914 }
19915 x := v_0.Args[0]
19916 if x != v_1 {
19917 continue
19918 }
19919 v.reset(OpConst16)
19920 v.AuxInt = int16ToAuxInt(-1)
19921 return true
19922 }
19923 break
19924 }
19925
19926
19927 for {
19928 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19929 x := v_0
19930 if v_1.Op != OpOr16 {
19931 continue
19932 }
19933 _ = v_1.Args[1]
19934 v_1_0 := v_1.Args[0]
19935 v_1_1 := v_1.Args[1]
19936 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19937 if x != v_1_0 {
19938 continue
19939 }
19940 y := v_1_1
19941 v.reset(OpOr16)
19942 v.AddArg2(x, y)
19943 return true
19944 }
19945 }
19946 break
19947 }
19948
19949
19950
19951 for {
19952 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19953 if v_0.Op != OpAnd16 {
19954 continue
19955 }
19956 _ = v_0.Args[1]
19957 v_0_0 := v_0.Args[0]
19958 v_0_1 := v_0.Args[1]
19959 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19960 x := v_0_0
19961 if v_0_1.Op != OpConst16 {
19962 continue
19963 }
19964 c2 := auxIntToInt16(v_0_1.AuxInt)
19965 if v_1.Op != OpConst16 {
19966 continue
19967 }
19968 t := v_1.Type
19969 c1 := auxIntToInt16(v_1.AuxInt)
19970 if !(^(c1 | c2) == 0) {
19971 continue
19972 }
19973 v.reset(OpOr16)
19974 v0 := b.NewValue0(v.Pos, OpConst16, t)
19975 v0.AuxInt = int16ToAuxInt(c1)
19976 v.AddArg2(v0, x)
19977 return true
19978 }
19979 }
19980 break
19981 }
19982
19983
19984
19985 for {
19986 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19987 if v_0.Op != OpOr16 {
19988 continue
19989 }
19990 _ = v_0.Args[1]
19991 v_0_0 := v_0.Args[0]
19992 v_0_1 := v_0.Args[1]
19993 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19994 i := v_0_0
19995 if i.Op != OpConst16 {
19996 continue
19997 }
19998 t := i.Type
19999 z := v_0_1
20000 x := v_1
20001 if !(z.Op != OpConst16 && x.Op != OpConst16) {
20002 continue
20003 }
20004 v.reset(OpOr16)
20005 v0 := b.NewValue0(v.Pos, OpOr16, t)
20006 v0.AddArg2(z, x)
20007 v.AddArg2(i, v0)
20008 return true
20009 }
20010 }
20011 break
20012 }
20013
20014
20015 for {
20016 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20017 if v_0.Op != OpConst16 {
20018 continue
20019 }
20020 t := v_0.Type
20021 c := auxIntToInt16(v_0.AuxInt)
20022 if v_1.Op != OpOr16 {
20023 continue
20024 }
20025 _ = v_1.Args[1]
20026 v_1_0 := v_1.Args[0]
20027 v_1_1 := v_1.Args[1]
20028 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
20029 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
20030 continue
20031 }
20032 d := auxIntToInt16(v_1_0.AuxInt)
20033 x := v_1_1
20034 v.reset(OpOr16)
20035 v0 := b.NewValue0(v.Pos, OpConst16, t)
20036 v0.AuxInt = int16ToAuxInt(c | d)
20037 v.AddArg2(v0, x)
20038 return true
20039 }
20040 }
20041 break
20042 }
20043
20044
20045
20046 for {
20047 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20048 if v_0.Op != OpLsh16x64 {
20049 continue
20050 }
20051 _ = v_0.Args[1]
20052 x := v_0.Args[0]
20053 z := v_0.Args[1]
20054 if z.Op != OpConst64 {
20055 continue
20056 }
20057 c := auxIntToInt64(z.AuxInt)
20058 if v_1.Op != OpRsh16Ux64 {
20059 continue
20060 }
20061 _ = v_1.Args[1]
20062 if x != v_1.Args[0] {
20063 continue
20064 }
20065 v_1_1 := v_1.Args[1]
20066 if v_1_1.Op != OpConst64 {
20067 continue
20068 }
20069 d := auxIntToInt64(v_1_1.AuxInt)
20070 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
20071 continue
20072 }
20073 v.reset(OpRotateLeft16)
20074 v.AddArg2(x, z)
20075 return true
20076 }
20077 break
20078 }
20079
20080
20081
20082 for {
20083 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20084 left := v_0
20085 if left.Op != OpLsh16x64 {
20086 continue
20087 }
20088 y := left.Args[1]
20089 x := left.Args[0]
20090 right := v_1
20091 if right.Op != OpRsh16Ux64 {
20092 continue
20093 }
20094 _ = right.Args[1]
20095 if x != right.Args[0] {
20096 continue
20097 }
20098 right_1 := right.Args[1]
20099 if right_1.Op != OpSub64 {
20100 continue
20101 }
20102 _ = right_1.Args[1]
20103 right_1_0 := right_1.Args[0]
20104 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
20105 continue
20106 }
20107 v.reset(OpRotateLeft16)
20108 v.AddArg2(x, y)
20109 return true
20110 }
20111 break
20112 }
20113
20114
20115
20116 for {
20117 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20118 left := v_0
20119 if left.Op != OpLsh16x32 {
20120 continue
20121 }
20122 y := left.Args[1]
20123 x := left.Args[0]
20124 right := v_1
20125 if right.Op != OpRsh16Ux32 {
20126 continue
20127 }
20128 _ = right.Args[1]
20129 if x != right.Args[0] {
20130 continue
20131 }
20132 right_1 := right.Args[1]
20133 if right_1.Op != OpSub32 {
20134 continue
20135 }
20136 _ = right_1.Args[1]
20137 right_1_0 := right_1.Args[0]
20138 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
20139 continue
20140 }
20141 v.reset(OpRotateLeft16)
20142 v.AddArg2(x, y)
20143 return true
20144 }
20145 break
20146 }
20147
20148
20149
20150 for {
20151 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20152 left := v_0
20153 if left.Op != OpLsh16x16 {
20154 continue
20155 }
20156 y := left.Args[1]
20157 x := left.Args[0]
20158 right := v_1
20159 if right.Op != OpRsh16Ux16 {
20160 continue
20161 }
20162 _ = right.Args[1]
20163 if x != right.Args[0] {
20164 continue
20165 }
20166 right_1 := right.Args[1]
20167 if right_1.Op != OpSub16 {
20168 continue
20169 }
20170 _ = right_1.Args[1]
20171 right_1_0 := right_1.Args[0]
20172 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
20173 continue
20174 }
20175 v.reset(OpRotateLeft16)
20176 v.AddArg2(x, y)
20177 return true
20178 }
20179 break
20180 }
20181
20182
20183
20184 for {
20185 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20186 left := v_0
20187 if left.Op != OpLsh16x8 {
20188 continue
20189 }
20190 y := left.Args[1]
20191 x := left.Args[0]
20192 right := v_1
20193 if right.Op != OpRsh16Ux8 {
20194 continue
20195 }
20196 _ = right.Args[1]
20197 if x != right.Args[0] {
20198 continue
20199 }
20200 right_1 := right.Args[1]
20201 if right_1.Op != OpSub8 {
20202 continue
20203 }
20204 _ = right_1.Args[1]
20205 right_1_0 := right_1.Args[0]
20206 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
20207 continue
20208 }
20209 v.reset(OpRotateLeft16)
20210 v.AddArg2(x, y)
20211 return true
20212 }
20213 break
20214 }
20215
20216
20217
20218 for {
20219 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20220 right := v_0
20221 if right.Op != OpRsh16Ux64 {
20222 continue
20223 }
20224 y := right.Args[1]
20225 x := right.Args[0]
20226 left := v_1
20227 if left.Op != OpLsh16x64 {
20228 continue
20229 }
20230 _ = left.Args[1]
20231 if x != left.Args[0] {
20232 continue
20233 }
20234 z := left.Args[1]
20235 if z.Op != OpSub64 {
20236 continue
20237 }
20238 _ = z.Args[1]
20239 z_0 := z.Args[0]
20240 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
20241 continue
20242 }
20243 v.reset(OpRotateLeft16)
20244 v.AddArg2(x, z)
20245 return true
20246 }
20247 break
20248 }
20249
20250
20251
20252 for {
20253 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20254 right := v_0
20255 if right.Op != OpRsh16Ux32 {
20256 continue
20257 }
20258 y := right.Args[1]
20259 x := right.Args[0]
20260 left := v_1
20261 if left.Op != OpLsh16x32 {
20262 continue
20263 }
20264 _ = left.Args[1]
20265 if x != left.Args[0] {
20266 continue
20267 }
20268 z := left.Args[1]
20269 if z.Op != OpSub32 {
20270 continue
20271 }
20272 _ = z.Args[1]
20273 z_0 := z.Args[0]
20274 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
20275 continue
20276 }
20277 v.reset(OpRotateLeft16)
20278 v.AddArg2(x, z)
20279 return true
20280 }
20281 break
20282 }
20283
20284
20285
20286 for {
20287 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20288 right := v_0
20289 if right.Op != OpRsh16Ux16 {
20290 continue
20291 }
20292 y := right.Args[1]
20293 x := right.Args[0]
20294 left := v_1
20295 if left.Op != OpLsh16x16 {
20296 continue
20297 }
20298 _ = left.Args[1]
20299 if x != left.Args[0] {
20300 continue
20301 }
20302 z := left.Args[1]
20303 if z.Op != OpSub16 {
20304 continue
20305 }
20306 _ = z.Args[1]
20307 z_0 := z.Args[0]
20308 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
20309 continue
20310 }
20311 v.reset(OpRotateLeft16)
20312 v.AddArg2(x, z)
20313 return true
20314 }
20315 break
20316 }
20317
20318
20319
20320 for {
20321 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20322 right := v_0
20323 if right.Op != OpRsh16Ux8 {
20324 continue
20325 }
20326 y := right.Args[1]
20327 x := right.Args[0]
20328 left := v_1
20329 if left.Op != OpLsh16x8 {
20330 continue
20331 }
20332 _ = left.Args[1]
20333 if x != left.Args[0] {
20334 continue
20335 }
20336 z := left.Args[1]
20337 if z.Op != OpSub8 {
20338 continue
20339 }
20340 _ = z.Args[1]
20341 z_0 := z.Args[0]
20342 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
20343 continue
20344 }
20345 v.reset(OpRotateLeft16)
20346 v.AddArg2(x, z)
20347 return true
20348 }
20349 break
20350 }
20351 return false
20352 }
20353 func rewriteValuegeneric_OpOr32(v *Value) bool {
20354 v_1 := v.Args[1]
20355 v_0 := v.Args[0]
20356 b := v.Block
20357 config := b.Func.Config
20358
20359
20360 for {
20361 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20362 if v_0.Op != OpConst32 {
20363 continue
20364 }
20365 c := auxIntToInt32(v_0.AuxInt)
20366 if v_1.Op != OpConst32 {
20367 continue
20368 }
20369 d := auxIntToInt32(v_1.AuxInt)
20370 v.reset(OpConst32)
20371 v.AuxInt = int32ToAuxInt(c | d)
20372 return true
20373 }
20374 break
20375 }
20376
20377
20378 for {
20379 t := v.Type
20380 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20381 if v_0.Op != OpCom32 {
20382 continue
20383 }
20384 x := v_0.Args[0]
20385 if v_1.Op != OpCom32 {
20386 continue
20387 }
20388 y := v_1.Args[0]
20389 v.reset(OpCom32)
20390 v0 := b.NewValue0(v.Pos, OpAnd32, t)
20391 v0.AddArg2(x, y)
20392 v.AddArg(v0)
20393 return true
20394 }
20395 break
20396 }
20397
20398
20399 for {
20400 x := v_0
20401 if x != v_1 {
20402 break
20403 }
20404 v.copyOf(x)
20405 return true
20406 }
20407
20408
20409 for {
20410 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20411 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
20412 continue
20413 }
20414 x := v_1
20415 v.copyOf(x)
20416 return true
20417 }
20418 break
20419 }
20420
20421
20422 for {
20423 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20424 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
20425 continue
20426 }
20427 v.reset(OpConst32)
20428 v.AuxInt = int32ToAuxInt(-1)
20429 return true
20430 }
20431 break
20432 }
20433
20434
20435 for {
20436 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20437 if v_0.Op != OpCom32 {
20438 continue
20439 }
20440 x := v_0.Args[0]
20441 if x != v_1 {
20442 continue
20443 }
20444 v.reset(OpConst32)
20445 v.AuxInt = int32ToAuxInt(-1)
20446 return true
20447 }
20448 break
20449 }
20450
20451
20452 for {
20453 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20454 x := v_0
20455 if v_1.Op != OpOr32 {
20456 continue
20457 }
20458 _ = v_1.Args[1]
20459 v_1_0 := v_1.Args[0]
20460 v_1_1 := v_1.Args[1]
20461 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
20462 if x != v_1_0 {
20463 continue
20464 }
20465 y := v_1_1
20466 v.reset(OpOr32)
20467 v.AddArg2(x, y)
20468 return true
20469 }
20470 }
20471 break
20472 }
20473
20474
20475
20476 for {
20477 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20478 if v_0.Op != OpAnd32 {
20479 continue
20480 }
20481 _ = v_0.Args[1]
20482 v_0_0 := v_0.Args[0]
20483 v_0_1 := v_0.Args[1]
20484 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
20485 x := v_0_0
20486 if v_0_1.Op != OpConst32 {
20487 continue
20488 }
20489 c2 := auxIntToInt32(v_0_1.AuxInt)
20490 if v_1.Op != OpConst32 {
20491 continue
20492 }
20493 t := v_1.Type
20494 c1 := auxIntToInt32(v_1.AuxInt)
20495 if !(^(c1 | c2) == 0) {
20496 continue
20497 }
20498 v.reset(OpOr32)
20499 v0 := b.NewValue0(v.Pos, OpConst32, t)
20500 v0.AuxInt = int32ToAuxInt(c1)
20501 v.AddArg2(v0, x)
20502 return true
20503 }
20504 }
20505 break
20506 }
20507
20508
20509
20510 for {
20511 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20512 if v_0.Op != OpOr32 {
20513 continue
20514 }
20515 _ = v_0.Args[1]
20516 v_0_0 := v_0.Args[0]
20517 v_0_1 := v_0.Args[1]
20518 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
20519 i := v_0_0
20520 if i.Op != OpConst32 {
20521 continue
20522 }
20523 t := i.Type
20524 z := v_0_1
20525 x := v_1
20526 if !(z.Op != OpConst32 && x.Op != OpConst32) {
20527 continue
20528 }
20529 v.reset(OpOr32)
20530 v0 := b.NewValue0(v.Pos, OpOr32, t)
20531 v0.AddArg2(z, x)
20532 v.AddArg2(i, v0)
20533 return true
20534 }
20535 }
20536 break
20537 }
20538
20539
20540 for {
20541 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20542 if v_0.Op != OpConst32 {
20543 continue
20544 }
20545 t := v_0.Type
20546 c := auxIntToInt32(v_0.AuxInt)
20547 if v_1.Op != OpOr32 {
20548 continue
20549 }
20550 _ = v_1.Args[1]
20551 v_1_0 := v_1.Args[0]
20552 v_1_1 := v_1.Args[1]
20553 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
20554 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
20555 continue
20556 }
20557 d := auxIntToInt32(v_1_0.AuxInt)
20558 x := v_1_1
20559 v.reset(OpOr32)
20560 v0 := b.NewValue0(v.Pos, OpConst32, t)
20561 v0.AuxInt = int32ToAuxInt(c | d)
20562 v.AddArg2(v0, x)
20563 return true
20564 }
20565 }
20566 break
20567 }
20568
20569
20570
20571 for {
20572 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20573 if v_0.Op != OpLsh32x64 {
20574 continue
20575 }
20576 _ = v_0.Args[1]
20577 x := v_0.Args[0]
20578 z := v_0.Args[1]
20579 if z.Op != OpConst64 {
20580 continue
20581 }
20582 c := auxIntToInt64(z.AuxInt)
20583 if v_1.Op != OpRsh32Ux64 {
20584 continue
20585 }
20586 _ = v_1.Args[1]
20587 if x != v_1.Args[0] {
20588 continue
20589 }
20590 v_1_1 := v_1.Args[1]
20591 if v_1_1.Op != OpConst64 {
20592 continue
20593 }
20594 d := auxIntToInt64(v_1_1.AuxInt)
20595 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
20596 continue
20597 }
20598 v.reset(OpRotateLeft32)
20599 v.AddArg2(x, z)
20600 return true
20601 }
20602 break
20603 }
20604
20605
20606
20607 for {
20608 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20609 left := v_0
20610 if left.Op != OpLsh32x64 {
20611 continue
20612 }
20613 y := left.Args[1]
20614 x := left.Args[0]
20615 right := v_1
20616 if right.Op != OpRsh32Ux64 {
20617 continue
20618 }
20619 _ = right.Args[1]
20620 if x != right.Args[0] {
20621 continue
20622 }
20623 right_1 := right.Args[1]
20624 if right_1.Op != OpSub64 {
20625 continue
20626 }
20627 _ = right_1.Args[1]
20628 right_1_0 := right_1.Args[0]
20629 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
20630 continue
20631 }
20632 v.reset(OpRotateLeft32)
20633 v.AddArg2(x, y)
20634 return true
20635 }
20636 break
20637 }
20638
20639
20640
20641 for {
20642 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20643 left := v_0
20644 if left.Op != OpLsh32x32 {
20645 continue
20646 }
20647 y := left.Args[1]
20648 x := left.Args[0]
20649 right := v_1
20650 if right.Op != OpRsh32Ux32 {
20651 continue
20652 }
20653 _ = right.Args[1]
20654 if x != right.Args[0] {
20655 continue
20656 }
20657 right_1 := right.Args[1]
20658 if right_1.Op != OpSub32 {
20659 continue
20660 }
20661 _ = right_1.Args[1]
20662 right_1_0 := right_1.Args[0]
20663 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
20664 continue
20665 }
20666 v.reset(OpRotateLeft32)
20667 v.AddArg2(x, y)
20668 return true
20669 }
20670 break
20671 }
20672
20673
20674
20675 for {
20676 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20677 left := v_0
20678 if left.Op != OpLsh32x16 {
20679 continue
20680 }
20681 y := left.Args[1]
20682 x := left.Args[0]
20683 right := v_1
20684 if right.Op != OpRsh32Ux16 {
20685 continue
20686 }
20687 _ = right.Args[1]
20688 if x != right.Args[0] {
20689 continue
20690 }
20691 right_1 := right.Args[1]
20692 if right_1.Op != OpSub16 {
20693 continue
20694 }
20695 _ = right_1.Args[1]
20696 right_1_0 := right_1.Args[0]
20697 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
20698 continue
20699 }
20700 v.reset(OpRotateLeft32)
20701 v.AddArg2(x, y)
20702 return true
20703 }
20704 break
20705 }
20706
20707
20708
20709 for {
20710 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20711 left := v_0
20712 if left.Op != OpLsh32x8 {
20713 continue
20714 }
20715 y := left.Args[1]
20716 x := left.Args[0]
20717 right := v_1
20718 if right.Op != OpRsh32Ux8 {
20719 continue
20720 }
20721 _ = right.Args[1]
20722 if x != right.Args[0] {
20723 continue
20724 }
20725 right_1 := right.Args[1]
20726 if right_1.Op != OpSub8 {
20727 continue
20728 }
20729 _ = right_1.Args[1]
20730 right_1_0 := right_1.Args[0]
20731 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
20732 continue
20733 }
20734 v.reset(OpRotateLeft32)
20735 v.AddArg2(x, y)
20736 return true
20737 }
20738 break
20739 }
20740
20741
20742
20743 for {
20744 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20745 right := v_0
20746 if right.Op != OpRsh32Ux64 {
20747 continue
20748 }
20749 y := right.Args[1]
20750 x := right.Args[0]
20751 left := v_1
20752 if left.Op != OpLsh32x64 {
20753 continue
20754 }
20755 _ = left.Args[1]
20756 if x != left.Args[0] {
20757 continue
20758 }
20759 z := left.Args[1]
20760 if z.Op != OpSub64 {
20761 continue
20762 }
20763 _ = z.Args[1]
20764 z_0 := z.Args[0]
20765 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
20766 continue
20767 }
20768 v.reset(OpRotateLeft32)
20769 v.AddArg2(x, z)
20770 return true
20771 }
20772 break
20773 }
20774
20775
20776
20777 for {
20778 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20779 right := v_0
20780 if right.Op != OpRsh32Ux32 {
20781 continue
20782 }
20783 y := right.Args[1]
20784 x := right.Args[0]
20785 left := v_1
20786 if left.Op != OpLsh32x32 {
20787 continue
20788 }
20789 _ = left.Args[1]
20790 if x != left.Args[0] {
20791 continue
20792 }
20793 z := left.Args[1]
20794 if z.Op != OpSub32 {
20795 continue
20796 }
20797 _ = z.Args[1]
20798 z_0 := z.Args[0]
20799 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
20800 continue
20801 }
20802 v.reset(OpRotateLeft32)
20803 v.AddArg2(x, z)
20804 return true
20805 }
20806 break
20807 }
20808
20809
20810
20811 for {
20812 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20813 right := v_0
20814 if right.Op != OpRsh32Ux16 {
20815 continue
20816 }
20817 y := right.Args[1]
20818 x := right.Args[0]
20819 left := v_1
20820 if left.Op != OpLsh32x16 {
20821 continue
20822 }
20823 _ = left.Args[1]
20824 if x != left.Args[0] {
20825 continue
20826 }
20827 z := left.Args[1]
20828 if z.Op != OpSub16 {
20829 continue
20830 }
20831 _ = z.Args[1]
20832 z_0 := z.Args[0]
20833 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
20834 continue
20835 }
20836 v.reset(OpRotateLeft32)
20837 v.AddArg2(x, z)
20838 return true
20839 }
20840 break
20841 }
20842
20843
20844
20845 for {
20846 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20847 right := v_0
20848 if right.Op != OpRsh32Ux8 {
20849 continue
20850 }
20851 y := right.Args[1]
20852 x := right.Args[0]
20853 left := v_1
20854 if left.Op != OpLsh32x8 {
20855 continue
20856 }
20857 _ = left.Args[1]
20858 if x != left.Args[0] {
20859 continue
20860 }
20861 z := left.Args[1]
20862 if z.Op != OpSub8 {
20863 continue
20864 }
20865 _ = z.Args[1]
20866 z_0 := z.Args[0]
20867 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
20868 continue
20869 }
20870 v.reset(OpRotateLeft32)
20871 v.AddArg2(x, z)
20872 return true
20873 }
20874 break
20875 }
20876 return false
20877 }
20878 func rewriteValuegeneric_OpOr64(v *Value) bool {
20879 v_1 := v.Args[1]
20880 v_0 := v.Args[0]
20881 b := v.Block
20882 config := b.Func.Config
20883
20884
20885 for {
20886 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20887 if v_0.Op != OpConst64 {
20888 continue
20889 }
20890 c := auxIntToInt64(v_0.AuxInt)
20891 if v_1.Op != OpConst64 {
20892 continue
20893 }
20894 d := auxIntToInt64(v_1.AuxInt)
20895 v.reset(OpConst64)
20896 v.AuxInt = int64ToAuxInt(c | d)
20897 return true
20898 }
20899 break
20900 }
20901
20902
20903 for {
20904 t := v.Type
20905 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20906 if v_0.Op != OpCom64 {
20907 continue
20908 }
20909 x := v_0.Args[0]
20910 if v_1.Op != OpCom64 {
20911 continue
20912 }
20913 y := v_1.Args[0]
20914 v.reset(OpCom64)
20915 v0 := b.NewValue0(v.Pos, OpAnd64, t)
20916 v0.AddArg2(x, y)
20917 v.AddArg(v0)
20918 return true
20919 }
20920 break
20921 }
20922
20923
20924 for {
20925 x := v_0
20926 if x != v_1 {
20927 break
20928 }
20929 v.copyOf(x)
20930 return true
20931 }
20932
20933
20934 for {
20935 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20936 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
20937 continue
20938 }
20939 x := v_1
20940 v.copyOf(x)
20941 return true
20942 }
20943 break
20944 }
20945
20946
20947 for {
20948 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20949 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
20950 continue
20951 }
20952 v.reset(OpConst64)
20953 v.AuxInt = int64ToAuxInt(-1)
20954 return true
20955 }
20956 break
20957 }
20958
20959
20960 for {
20961 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20962 if v_0.Op != OpCom64 {
20963 continue
20964 }
20965 x := v_0.Args[0]
20966 if x != v_1 {
20967 continue
20968 }
20969 v.reset(OpConst64)
20970 v.AuxInt = int64ToAuxInt(-1)
20971 return true
20972 }
20973 break
20974 }
20975
20976
20977 for {
20978 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20979 x := v_0
20980 if v_1.Op != OpOr64 {
20981 continue
20982 }
20983 _ = v_1.Args[1]
20984 v_1_0 := v_1.Args[0]
20985 v_1_1 := v_1.Args[1]
20986 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
20987 if x != v_1_0 {
20988 continue
20989 }
20990 y := v_1_1
20991 v.reset(OpOr64)
20992 v.AddArg2(x, y)
20993 return true
20994 }
20995 }
20996 break
20997 }
20998
20999
21000
21001 for {
21002 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21003 if v_0.Op != OpAnd64 {
21004 continue
21005 }
21006 _ = v_0.Args[1]
21007 v_0_0 := v_0.Args[0]
21008 v_0_1 := v_0.Args[1]
21009 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21010 x := v_0_0
21011 if v_0_1.Op != OpConst64 {
21012 continue
21013 }
21014 c2 := auxIntToInt64(v_0_1.AuxInt)
21015 if v_1.Op != OpConst64 {
21016 continue
21017 }
21018 t := v_1.Type
21019 c1 := auxIntToInt64(v_1.AuxInt)
21020 if !(^(c1 | c2) == 0) {
21021 continue
21022 }
21023 v.reset(OpOr64)
21024 v0 := b.NewValue0(v.Pos, OpConst64, t)
21025 v0.AuxInt = int64ToAuxInt(c1)
21026 v.AddArg2(v0, x)
21027 return true
21028 }
21029 }
21030 break
21031 }
21032
21033
21034
21035 for {
21036 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21037 if v_0.Op != OpOr64 {
21038 continue
21039 }
21040 _ = v_0.Args[1]
21041 v_0_0 := v_0.Args[0]
21042 v_0_1 := v_0.Args[1]
21043 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21044 i := v_0_0
21045 if i.Op != OpConst64 {
21046 continue
21047 }
21048 t := i.Type
21049 z := v_0_1
21050 x := v_1
21051 if !(z.Op != OpConst64 && x.Op != OpConst64) {
21052 continue
21053 }
21054 v.reset(OpOr64)
21055 v0 := b.NewValue0(v.Pos, OpOr64, t)
21056 v0.AddArg2(z, x)
21057 v.AddArg2(i, v0)
21058 return true
21059 }
21060 }
21061 break
21062 }
21063
21064
21065 for {
21066 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21067 if v_0.Op != OpConst64 {
21068 continue
21069 }
21070 t := v_0.Type
21071 c := auxIntToInt64(v_0.AuxInt)
21072 if v_1.Op != OpOr64 {
21073 continue
21074 }
21075 _ = v_1.Args[1]
21076 v_1_0 := v_1.Args[0]
21077 v_1_1 := v_1.Args[1]
21078 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21079 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
21080 continue
21081 }
21082 d := auxIntToInt64(v_1_0.AuxInt)
21083 x := v_1_1
21084 v.reset(OpOr64)
21085 v0 := b.NewValue0(v.Pos, OpConst64, t)
21086 v0.AuxInt = int64ToAuxInt(c | d)
21087 v.AddArg2(v0, x)
21088 return true
21089 }
21090 }
21091 break
21092 }
21093
21094
21095
21096 for {
21097 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21098 if v_0.Op != OpLsh64x64 {
21099 continue
21100 }
21101 _ = v_0.Args[1]
21102 x := v_0.Args[0]
21103 z := v_0.Args[1]
21104 if z.Op != OpConst64 {
21105 continue
21106 }
21107 c := auxIntToInt64(z.AuxInt)
21108 if v_1.Op != OpRsh64Ux64 {
21109 continue
21110 }
21111 _ = v_1.Args[1]
21112 if x != v_1.Args[0] {
21113 continue
21114 }
21115 v_1_1 := v_1.Args[1]
21116 if v_1_1.Op != OpConst64 {
21117 continue
21118 }
21119 d := auxIntToInt64(v_1_1.AuxInt)
21120 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
21121 continue
21122 }
21123 v.reset(OpRotateLeft64)
21124 v.AddArg2(x, z)
21125 return true
21126 }
21127 break
21128 }
21129
21130
21131
21132 for {
21133 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21134 left := v_0
21135 if left.Op != OpLsh64x64 {
21136 continue
21137 }
21138 y := left.Args[1]
21139 x := left.Args[0]
21140 right := v_1
21141 if right.Op != OpRsh64Ux64 {
21142 continue
21143 }
21144 _ = right.Args[1]
21145 if x != right.Args[0] {
21146 continue
21147 }
21148 right_1 := right.Args[1]
21149 if right_1.Op != OpSub64 {
21150 continue
21151 }
21152 _ = right_1.Args[1]
21153 right_1_0 := right_1.Args[0]
21154 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
21155 continue
21156 }
21157 v.reset(OpRotateLeft64)
21158 v.AddArg2(x, y)
21159 return true
21160 }
21161 break
21162 }
21163
21164
21165
21166 for {
21167 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21168 left := v_0
21169 if left.Op != OpLsh64x32 {
21170 continue
21171 }
21172 y := left.Args[1]
21173 x := left.Args[0]
21174 right := v_1
21175 if right.Op != OpRsh64Ux32 {
21176 continue
21177 }
21178 _ = right.Args[1]
21179 if x != right.Args[0] {
21180 continue
21181 }
21182 right_1 := right.Args[1]
21183 if right_1.Op != OpSub32 {
21184 continue
21185 }
21186 _ = right_1.Args[1]
21187 right_1_0 := right_1.Args[0]
21188 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
21189 continue
21190 }
21191 v.reset(OpRotateLeft64)
21192 v.AddArg2(x, y)
21193 return true
21194 }
21195 break
21196 }
21197
21198
21199
21200 for {
21201 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21202 left := v_0
21203 if left.Op != OpLsh64x16 {
21204 continue
21205 }
21206 y := left.Args[1]
21207 x := left.Args[0]
21208 right := v_1
21209 if right.Op != OpRsh64Ux16 {
21210 continue
21211 }
21212 _ = right.Args[1]
21213 if x != right.Args[0] {
21214 continue
21215 }
21216 right_1 := right.Args[1]
21217 if right_1.Op != OpSub16 {
21218 continue
21219 }
21220 _ = right_1.Args[1]
21221 right_1_0 := right_1.Args[0]
21222 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
21223 continue
21224 }
21225 v.reset(OpRotateLeft64)
21226 v.AddArg2(x, y)
21227 return true
21228 }
21229 break
21230 }
21231
21232
21233
21234 for {
21235 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21236 left := v_0
21237 if left.Op != OpLsh64x8 {
21238 continue
21239 }
21240 y := left.Args[1]
21241 x := left.Args[0]
21242 right := v_1
21243 if right.Op != OpRsh64Ux8 {
21244 continue
21245 }
21246 _ = right.Args[1]
21247 if x != right.Args[0] {
21248 continue
21249 }
21250 right_1 := right.Args[1]
21251 if right_1.Op != OpSub8 {
21252 continue
21253 }
21254 _ = right_1.Args[1]
21255 right_1_0 := right_1.Args[0]
21256 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
21257 continue
21258 }
21259 v.reset(OpRotateLeft64)
21260 v.AddArg2(x, y)
21261 return true
21262 }
21263 break
21264 }
21265
21266
21267
21268 for {
21269 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21270 right := v_0
21271 if right.Op != OpRsh64Ux64 {
21272 continue
21273 }
21274 y := right.Args[1]
21275 x := right.Args[0]
21276 left := v_1
21277 if left.Op != OpLsh64x64 {
21278 continue
21279 }
21280 _ = left.Args[1]
21281 if x != left.Args[0] {
21282 continue
21283 }
21284 z := left.Args[1]
21285 if z.Op != OpSub64 {
21286 continue
21287 }
21288 _ = z.Args[1]
21289 z_0 := z.Args[0]
21290 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
21291 continue
21292 }
21293 v.reset(OpRotateLeft64)
21294 v.AddArg2(x, z)
21295 return true
21296 }
21297 break
21298 }
21299
21300
21301
21302 for {
21303 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21304 right := v_0
21305 if right.Op != OpRsh64Ux32 {
21306 continue
21307 }
21308 y := right.Args[1]
21309 x := right.Args[0]
21310 left := v_1
21311 if left.Op != OpLsh64x32 {
21312 continue
21313 }
21314 _ = left.Args[1]
21315 if x != left.Args[0] {
21316 continue
21317 }
21318 z := left.Args[1]
21319 if z.Op != OpSub32 {
21320 continue
21321 }
21322 _ = z.Args[1]
21323 z_0 := z.Args[0]
21324 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
21325 continue
21326 }
21327 v.reset(OpRotateLeft64)
21328 v.AddArg2(x, z)
21329 return true
21330 }
21331 break
21332 }
21333
21334
21335
21336 for {
21337 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21338 right := v_0
21339 if right.Op != OpRsh64Ux16 {
21340 continue
21341 }
21342 y := right.Args[1]
21343 x := right.Args[0]
21344 left := v_1
21345 if left.Op != OpLsh64x16 {
21346 continue
21347 }
21348 _ = left.Args[1]
21349 if x != left.Args[0] {
21350 continue
21351 }
21352 z := left.Args[1]
21353 if z.Op != OpSub16 {
21354 continue
21355 }
21356 _ = z.Args[1]
21357 z_0 := z.Args[0]
21358 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
21359 continue
21360 }
21361 v.reset(OpRotateLeft64)
21362 v.AddArg2(x, z)
21363 return true
21364 }
21365 break
21366 }
21367
21368
21369
21370 for {
21371 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21372 right := v_0
21373 if right.Op != OpRsh64Ux8 {
21374 continue
21375 }
21376 y := right.Args[1]
21377 x := right.Args[0]
21378 left := v_1
21379 if left.Op != OpLsh64x8 {
21380 continue
21381 }
21382 _ = left.Args[1]
21383 if x != left.Args[0] {
21384 continue
21385 }
21386 z := left.Args[1]
21387 if z.Op != OpSub8 {
21388 continue
21389 }
21390 _ = z.Args[1]
21391 z_0 := z.Args[0]
21392 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
21393 continue
21394 }
21395 v.reset(OpRotateLeft64)
21396 v.AddArg2(x, z)
21397 return true
21398 }
21399 break
21400 }
21401 return false
21402 }
21403 func rewriteValuegeneric_OpOr8(v *Value) bool {
21404 v_1 := v.Args[1]
21405 v_0 := v.Args[0]
21406 b := v.Block
21407 config := b.Func.Config
21408
21409
21410 for {
21411 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21412 if v_0.Op != OpConst8 {
21413 continue
21414 }
21415 c := auxIntToInt8(v_0.AuxInt)
21416 if v_1.Op != OpConst8 {
21417 continue
21418 }
21419 d := auxIntToInt8(v_1.AuxInt)
21420 v.reset(OpConst8)
21421 v.AuxInt = int8ToAuxInt(c | d)
21422 return true
21423 }
21424 break
21425 }
21426
21427
21428 for {
21429 t := v.Type
21430 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21431 if v_0.Op != OpCom8 {
21432 continue
21433 }
21434 x := v_0.Args[0]
21435 if v_1.Op != OpCom8 {
21436 continue
21437 }
21438 y := v_1.Args[0]
21439 v.reset(OpCom8)
21440 v0 := b.NewValue0(v.Pos, OpAnd8, t)
21441 v0.AddArg2(x, y)
21442 v.AddArg(v0)
21443 return true
21444 }
21445 break
21446 }
21447
21448
21449 for {
21450 x := v_0
21451 if x != v_1 {
21452 break
21453 }
21454 v.copyOf(x)
21455 return true
21456 }
21457
21458
21459 for {
21460 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21461 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
21462 continue
21463 }
21464 x := v_1
21465 v.copyOf(x)
21466 return true
21467 }
21468 break
21469 }
21470
21471
21472 for {
21473 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21474 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
21475 continue
21476 }
21477 v.reset(OpConst8)
21478 v.AuxInt = int8ToAuxInt(-1)
21479 return true
21480 }
21481 break
21482 }
21483
21484
21485 for {
21486 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21487 if v_0.Op != OpCom8 {
21488 continue
21489 }
21490 x := v_0.Args[0]
21491 if x != v_1 {
21492 continue
21493 }
21494 v.reset(OpConst8)
21495 v.AuxInt = int8ToAuxInt(-1)
21496 return true
21497 }
21498 break
21499 }
21500
21501
21502 for {
21503 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21504 x := v_0
21505 if v_1.Op != OpOr8 {
21506 continue
21507 }
21508 _ = v_1.Args[1]
21509 v_1_0 := v_1.Args[0]
21510 v_1_1 := v_1.Args[1]
21511 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21512 if x != v_1_0 {
21513 continue
21514 }
21515 y := v_1_1
21516 v.reset(OpOr8)
21517 v.AddArg2(x, y)
21518 return true
21519 }
21520 }
21521 break
21522 }
21523
21524
21525
21526 for {
21527 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21528 if v_0.Op != OpAnd8 {
21529 continue
21530 }
21531 _ = v_0.Args[1]
21532 v_0_0 := v_0.Args[0]
21533 v_0_1 := v_0.Args[1]
21534 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21535 x := v_0_0
21536 if v_0_1.Op != OpConst8 {
21537 continue
21538 }
21539 c2 := auxIntToInt8(v_0_1.AuxInt)
21540 if v_1.Op != OpConst8 {
21541 continue
21542 }
21543 t := v_1.Type
21544 c1 := auxIntToInt8(v_1.AuxInt)
21545 if !(^(c1 | c2) == 0) {
21546 continue
21547 }
21548 v.reset(OpOr8)
21549 v0 := b.NewValue0(v.Pos, OpConst8, t)
21550 v0.AuxInt = int8ToAuxInt(c1)
21551 v.AddArg2(v0, x)
21552 return true
21553 }
21554 }
21555 break
21556 }
21557
21558
21559
21560 for {
21561 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21562 if v_0.Op != OpOr8 {
21563 continue
21564 }
21565 _ = v_0.Args[1]
21566 v_0_0 := v_0.Args[0]
21567 v_0_1 := v_0.Args[1]
21568 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21569 i := v_0_0
21570 if i.Op != OpConst8 {
21571 continue
21572 }
21573 t := i.Type
21574 z := v_0_1
21575 x := v_1
21576 if !(z.Op != OpConst8 && x.Op != OpConst8) {
21577 continue
21578 }
21579 v.reset(OpOr8)
21580 v0 := b.NewValue0(v.Pos, OpOr8, t)
21581 v0.AddArg2(z, x)
21582 v.AddArg2(i, v0)
21583 return true
21584 }
21585 }
21586 break
21587 }
21588
21589
21590 for {
21591 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21592 if v_0.Op != OpConst8 {
21593 continue
21594 }
21595 t := v_0.Type
21596 c := auxIntToInt8(v_0.AuxInt)
21597 if v_1.Op != OpOr8 {
21598 continue
21599 }
21600 _ = v_1.Args[1]
21601 v_1_0 := v_1.Args[0]
21602 v_1_1 := v_1.Args[1]
21603 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21604 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
21605 continue
21606 }
21607 d := auxIntToInt8(v_1_0.AuxInt)
21608 x := v_1_1
21609 v.reset(OpOr8)
21610 v0 := b.NewValue0(v.Pos, OpConst8, t)
21611 v0.AuxInt = int8ToAuxInt(c | d)
21612 v.AddArg2(v0, x)
21613 return true
21614 }
21615 }
21616 break
21617 }
21618
21619
21620
21621 for {
21622 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21623 if v_0.Op != OpLsh8x64 {
21624 continue
21625 }
21626 _ = v_0.Args[1]
21627 x := v_0.Args[0]
21628 z := v_0.Args[1]
21629 if z.Op != OpConst64 {
21630 continue
21631 }
21632 c := auxIntToInt64(z.AuxInt)
21633 if v_1.Op != OpRsh8Ux64 {
21634 continue
21635 }
21636 _ = v_1.Args[1]
21637 if x != v_1.Args[0] {
21638 continue
21639 }
21640 v_1_1 := v_1.Args[1]
21641 if v_1_1.Op != OpConst64 {
21642 continue
21643 }
21644 d := auxIntToInt64(v_1_1.AuxInt)
21645 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
21646 continue
21647 }
21648 v.reset(OpRotateLeft8)
21649 v.AddArg2(x, z)
21650 return true
21651 }
21652 break
21653 }
21654
21655
21656
21657 for {
21658 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21659 left := v_0
21660 if left.Op != OpLsh8x64 {
21661 continue
21662 }
21663 y := left.Args[1]
21664 x := left.Args[0]
21665 right := v_1
21666 if right.Op != OpRsh8Ux64 {
21667 continue
21668 }
21669 _ = right.Args[1]
21670 if x != right.Args[0] {
21671 continue
21672 }
21673 right_1 := right.Args[1]
21674 if right_1.Op != OpSub64 {
21675 continue
21676 }
21677 _ = right_1.Args[1]
21678 right_1_0 := right_1.Args[0]
21679 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
21680 continue
21681 }
21682 v.reset(OpRotateLeft8)
21683 v.AddArg2(x, y)
21684 return true
21685 }
21686 break
21687 }
21688
21689
21690
21691 for {
21692 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21693 left := v_0
21694 if left.Op != OpLsh8x32 {
21695 continue
21696 }
21697 y := left.Args[1]
21698 x := left.Args[0]
21699 right := v_1
21700 if right.Op != OpRsh8Ux32 {
21701 continue
21702 }
21703 _ = right.Args[1]
21704 if x != right.Args[0] {
21705 continue
21706 }
21707 right_1 := right.Args[1]
21708 if right_1.Op != OpSub32 {
21709 continue
21710 }
21711 _ = right_1.Args[1]
21712 right_1_0 := right_1.Args[0]
21713 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
21714 continue
21715 }
21716 v.reset(OpRotateLeft8)
21717 v.AddArg2(x, y)
21718 return true
21719 }
21720 break
21721 }
21722
21723
21724
21725 for {
21726 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21727 left := v_0
21728 if left.Op != OpLsh8x16 {
21729 continue
21730 }
21731 y := left.Args[1]
21732 x := left.Args[0]
21733 right := v_1
21734 if right.Op != OpRsh8Ux16 {
21735 continue
21736 }
21737 _ = right.Args[1]
21738 if x != right.Args[0] {
21739 continue
21740 }
21741 right_1 := right.Args[1]
21742 if right_1.Op != OpSub16 {
21743 continue
21744 }
21745 _ = right_1.Args[1]
21746 right_1_0 := right_1.Args[0]
21747 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
21748 continue
21749 }
21750 v.reset(OpRotateLeft8)
21751 v.AddArg2(x, y)
21752 return true
21753 }
21754 break
21755 }
21756
21757
21758
21759 for {
21760 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21761 left := v_0
21762 if left.Op != OpLsh8x8 {
21763 continue
21764 }
21765 y := left.Args[1]
21766 x := left.Args[0]
21767 right := v_1
21768 if right.Op != OpRsh8Ux8 {
21769 continue
21770 }
21771 _ = right.Args[1]
21772 if x != right.Args[0] {
21773 continue
21774 }
21775 right_1 := right.Args[1]
21776 if right_1.Op != OpSub8 {
21777 continue
21778 }
21779 _ = right_1.Args[1]
21780 right_1_0 := right_1.Args[0]
21781 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
21782 continue
21783 }
21784 v.reset(OpRotateLeft8)
21785 v.AddArg2(x, y)
21786 return true
21787 }
21788 break
21789 }
21790
21791
21792
21793 for {
21794 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21795 right := v_0
21796 if right.Op != OpRsh8Ux64 {
21797 continue
21798 }
21799 y := right.Args[1]
21800 x := right.Args[0]
21801 left := v_1
21802 if left.Op != OpLsh8x64 {
21803 continue
21804 }
21805 _ = left.Args[1]
21806 if x != left.Args[0] {
21807 continue
21808 }
21809 z := left.Args[1]
21810 if z.Op != OpSub64 {
21811 continue
21812 }
21813 _ = z.Args[1]
21814 z_0 := z.Args[0]
21815 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
21816 continue
21817 }
21818 v.reset(OpRotateLeft8)
21819 v.AddArg2(x, z)
21820 return true
21821 }
21822 break
21823 }
21824
21825
21826
21827 for {
21828 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21829 right := v_0
21830 if right.Op != OpRsh8Ux32 {
21831 continue
21832 }
21833 y := right.Args[1]
21834 x := right.Args[0]
21835 left := v_1
21836 if left.Op != OpLsh8x32 {
21837 continue
21838 }
21839 _ = left.Args[1]
21840 if x != left.Args[0] {
21841 continue
21842 }
21843 z := left.Args[1]
21844 if z.Op != OpSub32 {
21845 continue
21846 }
21847 _ = z.Args[1]
21848 z_0 := z.Args[0]
21849 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
21850 continue
21851 }
21852 v.reset(OpRotateLeft8)
21853 v.AddArg2(x, z)
21854 return true
21855 }
21856 break
21857 }
21858
21859
21860
21861 for {
21862 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21863 right := v_0
21864 if right.Op != OpRsh8Ux16 {
21865 continue
21866 }
21867 y := right.Args[1]
21868 x := right.Args[0]
21869 left := v_1
21870 if left.Op != OpLsh8x16 {
21871 continue
21872 }
21873 _ = left.Args[1]
21874 if x != left.Args[0] {
21875 continue
21876 }
21877 z := left.Args[1]
21878 if z.Op != OpSub16 {
21879 continue
21880 }
21881 _ = z.Args[1]
21882 z_0 := z.Args[0]
21883 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
21884 continue
21885 }
21886 v.reset(OpRotateLeft8)
21887 v.AddArg2(x, z)
21888 return true
21889 }
21890 break
21891 }
21892
21893
21894
21895 for {
21896 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21897 right := v_0
21898 if right.Op != OpRsh8Ux8 {
21899 continue
21900 }
21901 y := right.Args[1]
21902 x := right.Args[0]
21903 left := v_1
21904 if left.Op != OpLsh8x8 {
21905 continue
21906 }
21907 _ = left.Args[1]
21908 if x != left.Args[0] {
21909 continue
21910 }
21911 z := left.Args[1]
21912 if z.Op != OpSub8 {
21913 continue
21914 }
21915 _ = z.Args[1]
21916 z_0 := z.Args[0]
21917 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
21918 continue
21919 }
21920 v.reset(OpRotateLeft8)
21921 v.AddArg2(x, z)
21922 return true
21923 }
21924 break
21925 }
21926 return false
21927 }
21928 func rewriteValuegeneric_OpOrB(v *Value) bool {
21929 v_1 := v.Args[1]
21930 v_0 := v.Args[0]
21931 b := v.Block
21932 typ := &b.Func.Config.Types
21933
21934
21935
21936 for {
21937 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21938 if v_0.Op != OpLess64 {
21939 continue
21940 }
21941 x := v_0.Args[1]
21942 v_0_0 := v_0.Args[0]
21943 if v_0_0.Op != OpConst64 {
21944 continue
21945 }
21946 c := auxIntToInt64(v_0_0.AuxInt)
21947 if v_1.Op != OpLess64 {
21948 continue
21949 }
21950 _ = v_1.Args[1]
21951 if x != v_1.Args[0] {
21952 continue
21953 }
21954 v_1_1 := v_1.Args[1]
21955 if v_1_1.Op != OpConst64 {
21956 continue
21957 }
21958 d := auxIntToInt64(v_1_1.AuxInt)
21959 if !(c >= d) {
21960 continue
21961 }
21962 v.reset(OpLess64U)
21963 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
21964 v0.AuxInt = int64ToAuxInt(c - d)
21965 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
21966 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
21967 v2.AuxInt = int64ToAuxInt(d)
21968 v1.AddArg2(x, v2)
21969 v.AddArg2(v0, v1)
21970 return true
21971 }
21972 break
21973 }
21974
21975
21976
21977 for {
21978 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21979 if v_0.Op != OpLeq64 {
21980 continue
21981 }
21982 x := v_0.Args[1]
21983 v_0_0 := v_0.Args[0]
21984 if v_0_0.Op != OpConst64 {
21985 continue
21986 }
21987 c := auxIntToInt64(v_0_0.AuxInt)
21988 if v_1.Op != OpLess64 {
21989 continue
21990 }
21991 _ = v_1.Args[1]
21992 if x != v_1.Args[0] {
21993 continue
21994 }
21995 v_1_1 := v_1.Args[1]
21996 if v_1_1.Op != OpConst64 {
21997 continue
21998 }
21999 d := auxIntToInt64(v_1_1.AuxInt)
22000 if !(c >= d) {
22001 continue
22002 }
22003 v.reset(OpLeq64U)
22004 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
22005 v0.AuxInt = int64ToAuxInt(c - d)
22006 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
22007 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
22008 v2.AuxInt = int64ToAuxInt(d)
22009 v1.AddArg2(x, v2)
22010 v.AddArg2(v0, v1)
22011 return true
22012 }
22013 break
22014 }
22015
22016
22017
22018 for {
22019 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22020 if v_0.Op != OpLess32 {
22021 continue
22022 }
22023 x := v_0.Args[1]
22024 v_0_0 := v_0.Args[0]
22025 if v_0_0.Op != OpConst32 {
22026 continue
22027 }
22028 c := auxIntToInt32(v_0_0.AuxInt)
22029 if v_1.Op != OpLess32 {
22030 continue
22031 }
22032 _ = v_1.Args[1]
22033 if x != v_1.Args[0] {
22034 continue
22035 }
22036 v_1_1 := v_1.Args[1]
22037 if v_1_1.Op != OpConst32 {
22038 continue
22039 }
22040 d := auxIntToInt32(v_1_1.AuxInt)
22041 if !(c >= d) {
22042 continue
22043 }
22044 v.reset(OpLess32U)
22045 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
22046 v0.AuxInt = int32ToAuxInt(c - d)
22047 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
22048 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
22049 v2.AuxInt = int32ToAuxInt(d)
22050 v1.AddArg2(x, v2)
22051 v.AddArg2(v0, v1)
22052 return true
22053 }
22054 break
22055 }
22056
22057
22058
22059 for {
22060 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22061 if v_0.Op != OpLeq32 {
22062 continue
22063 }
22064 x := v_0.Args[1]
22065 v_0_0 := v_0.Args[0]
22066 if v_0_0.Op != OpConst32 {
22067 continue
22068 }
22069 c := auxIntToInt32(v_0_0.AuxInt)
22070 if v_1.Op != OpLess32 {
22071 continue
22072 }
22073 _ = v_1.Args[1]
22074 if x != v_1.Args[0] {
22075 continue
22076 }
22077 v_1_1 := v_1.Args[1]
22078 if v_1_1.Op != OpConst32 {
22079 continue
22080 }
22081 d := auxIntToInt32(v_1_1.AuxInt)
22082 if !(c >= d) {
22083 continue
22084 }
22085 v.reset(OpLeq32U)
22086 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
22087 v0.AuxInt = int32ToAuxInt(c - d)
22088 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
22089 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
22090 v2.AuxInt = int32ToAuxInt(d)
22091 v1.AddArg2(x, v2)
22092 v.AddArg2(v0, v1)
22093 return true
22094 }
22095 break
22096 }
22097
22098
22099
22100 for {
22101 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22102 if v_0.Op != OpLess16 {
22103 continue
22104 }
22105 x := v_0.Args[1]
22106 v_0_0 := v_0.Args[0]
22107 if v_0_0.Op != OpConst16 {
22108 continue
22109 }
22110 c := auxIntToInt16(v_0_0.AuxInt)
22111 if v_1.Op != OpLess16 {
22112 continue
22113 }
22114 _ = v_1.Args[1]
22115 if x != v_1.Args[0] {
22116 continue
22117 }
22118 v_1_1 := v_1.Args[1]
22119 if v_1_1.Op != OpConst16 {
22120 continue
22121 }
22122 d := auxIntToInt16(v_1_1.AuxInt)
22123 if !(c >= d) {
22124 continue
22125 }
22126 v.reset(OpLess16U)
22127 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
22128 v0.AuxInt = int16ToAuxInt(c - d)
22129 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
22130 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
22131 v2.AuxInt = int16ToAuxInt(d)
22132 v1.AddArg2(x, v2)
22133 v.AddArg2(v0, v1)
22134 return true
22135 }
22136 break
22137 }
22138
22139
22140
22141 for {
22142 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22143 if v_0.Op != OpLeq16 {
22144 continue
22145 }
22146 x := v_0.Args[1]
22147 v_0_0 := v_0.Args[0]
22148 if v_0_0.Op != OpConst16 {
22149 continue
22150 }
22151 c := auxIntToInt16(v_0_0.AuxInt)
22152 if v_1.Op != OpLess16 {
22153 continue
22154 }
22155 _ = v_1.Args[1]
22156 if x != v_1.Args[0] {
22157 continue
22158 }
22159 v_1_1 := v_1.Args[1]
22160 if v_1_1.Op != OpConst16 {
22161 continue
22162 }
22163 d := auxIntToInt16(v_1_1.AuxInt)
22164 if !(c >= d) {
22165 continue
22166 }
22167 v.reset(OpLeq16U)
22168 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
22169 v0.AuxInt = int16ToAuxInt(c - d)
22170 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
22171 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
22172 v2.AuxInt = int16ToAuxInt(d)
22173 v1.AddArg2(x, v2)
22174 v.AddArg2(v0, v1)
22175 return true
22176 }
22177 break
22178 }
22179
22180
22181
22182 for {
22183 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22184 if v_0.Op != OpLess8 {
22185 continue
22186 }
22187 x := v_0.Args[1]
22188 v_0_0 := v_0.Args[0]
22189 if v_0_0.Op != OpConst8 {
22190 continue
22191 }
22192 c := auxIntToInt8(v_0_0.AuxInt)
22193 if v_1.Op != OpLess8 {
22194 continue
22195 }
22196 _ = v_1.Args[1]
22197 if x != v_1.Args[0] {
22198 continue
22199 }
22200 v_1_1 := v_1.Args[1]
22201 if v_1_1.Op != OpConst8 {
22202 continue
22203 }
22204 d := auxIntToInt8(v_1_1.AuxInt)
22205 if !(c >= d) {
22206 continue
22207 }
22208 v.reset(OpLess8U)
22209 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
22210 v0.AuxInt = int8ToAuxInt(c - d)
22211 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
22212 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
22213 v2.AuxInt = int8ToAuxInt(d)
22214 v1.AddArg2(x, v2)
22215 v.AddArg2(v0, v1)
22216 return true
22217 }
22218 break
22219 }
22220
22221
22222
22223 for {
22224 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22225 if v_0.Op != OpLeq8 {
22226 continue
22227 }
22228 x := v_0.Args[1]
22229 v_0_0 := v_0.Args[0]
22230 if v_0_0.Op != OpConst8 {
22231 continue
22232 }
22233 c := auxIntToInt8(v_0_0.AuxInt)
22234 if v_1.Op != OpLess8 {
22235 continue
22236 }
22237 _ = v_1.Args[1]
22238 if x != v_1.Args[0] {
22239 continue
22240 }
22241 v_1_1 := v_1.Args[1]
22242 if v_1_1.Op != OpConst8 {
22243 continue
22244 }
22245 d := auxIntToInt8(v_1_1.AuxInt)
22246 if !(c >= d) {
22247 continue
22248 }
22249 v.reset(OpLeq8U)
22250 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
22251 v0.AuxInt = int8ToAuxInt(c - d)
22252 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
22253 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
22254 v2.AuxInt = int8ToAuxInt(d)
22255 v1.AddArg2(x, v2)
22256 v.AddArg2(v0, v1)
22257 return true
22258 }
22259 break
22260 }
22261
22262
22263
22264 for {
22265 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22266 if v_0.Op != OpLess64 {
22267 continue
22268 }
22269 x := v_0.Args[1]
22270 v_0_0 := v_0.Args[0]
22271 if v_0_0.Op != OpConst64 {
22272 continue
22273 }
22274 c := auxIntToInt64(v_0_0.AuxInt)
22275 if v_1.Op != OpLeq64 {
22276 continue
22277 }
22278 _ = v_1.Args[1]
22279 if x != v_1.Args[0] {
22280 continue
22281 }
22282 v_1_1 := v_1.Args[1]
22283 if v_1_1.Op != OpConst64 {
22284 continue
22285 }
22286 d := auxIntToInt64(v_1_1.AuxInt)
22287 if !(c >= d+1 && d+1 > d) {
22288 continue
22289 }
22290 v.reset(OpLess64U)
22291 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
22292 v0.AuxInt = int64ToAuxInt(c - d - 1)
22293 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
22294 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
22295 v2.AuxInt = int64ToAuxInt(d + 1)
22296 v1.AddArg2(x, v2)
22297 v.AddArg2(v0, v1)
22298 return true
22299 }
22300 break
22301 }
22302
22303
22304
22305 for {
22306 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22307 if v_0.Op != OpLeq64 {
22308 continue
22309 }
22310 x := v_0.Args[1]
22311 v_0_0 := v_0.Args[0]
22312 if v_0_0.Op != OpConst64 {
22313 continue
22314 }
22315 c := auxIntToInt64(v_0_0.AuxInt)
22316 if v_1.Op != OpLeq64 {
22317 continue
22318 }
22319 _ = v_1.Args[1]
22320 if x != v_1.Args[0] {
22321 continue
22322 }
22323 v_1_1 := v_1.Args[1]
22324 if v_1_1.Op != OpConst64 {
22325 continue
22326 }
22327 d := auxIntToInt64(v_1_1.AuxInt)
22328 if !(c >= d+1 && d+1 > d) {
22329 continue
22330 }
22331 v.reset(OpLeq64U)
22332 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
22333 v0.AuxInt = int64ToAuxInt(c - d - 1)
22334 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
22335 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
22336 v2.AuxInt = int64ToAuxInt(d + 1)
22337 v1.AddArg2(x, v2)
22338 v.AddArg2(v0, v1)
22339 return true
22340 }
22341 break
22342 }
22343
22344
22345
22346 for {
22347 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22348 if v_0.Op != OpLess32 {
22349 continue
22350 }
22351 x := v_0.Args[1]
22352 v_0_0 := v_0.Args[0]
22353 if v_0_0.Op != OpConst32 {
22354 continue
22355 }
22356 c := auxIntToInt32(v_0_0.AuxInt)
22357 if v_1.Op != OpLeq32 {
22358 continue
22359 }
22360 _ = v_1.Args[1]
22361 if x != v_1.Args[0] {
22362 continue
22363 }
22364 v_1_1 := v_1.Args[1]
22365 if v_1_1.Op != OpConst32 {
22366 continue
22367 }
22368 d := auxIntToInt32(v_1_1.AuxInt)
22369 if !(c >= d+1 && d+1 > d) {
22370 continue
22371 }
22372 v.reset(OpLess32U)
22373 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
22374 v0.AuxInt = int32ToAuxInt(c - d - 1)
22375 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
22376 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
22377 v2.AuxInt = int32ToAuxInt(d + 1)
22378 v1.AddArg2(x, v2)
22379 v.AddArg2(v0, v1)
22380 return true
22381 }
22382 break
22383 }
22384
22385
22386
22387 for {
22388 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22389 if v_0.Op != OpLeq32 {
22390 continue
22391 }
22392 x := v_0.Args[1]
22393 v_0_0 := v_0.Args[0]
22394 if v_0_0.Op != OpConst32 {
22395 continue
22396 }
22397 c := auxIntToInt32(v_0_0.AuxInt)
22398 if v_1.Op != OpLeq32 {
22399 continue
22400 }
22401 _ = v_1.Args[1]
22402 if x != v_1.Args[0] {
22403 continue
22404 }
22405 v_1_1 := v_1.Args[1]
22406 if v_1_1.Op != OpConst32 {
22407 continue
22408 }
22409 d := auxIntToInt32(v_1_1.AuxInt)
22410 if !(c >= d+1 && d+1 > d) {
22411 continue
22412 }
22413 v.reset(OpLeq32U)
22414 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
22415 v0.AuxInt = int32ToAuxInt(c - d - 1)
22416 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
22417 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
22418 v2.AuxInt = int32ToAuxInt(d + 1)
22419 v1.AddArg2(x, v2)
22420 v.AddArg2(v0, v1)
22421 return true
22422 }
22423 break
22424 }
22425
22426
22427
22428 for {
22429 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22430 if v_0.Op != OpLess16 {
22431 continue
22432 }
22433 x := v_0.Args[1]
22434 v_0_0 := v_0.Args[0]
22435 if v_0_0.Op != OpConst16 {
22436 continue
22437 }
22438 c := auxIntToInt16(v_0_0.AuxInt)
22439 if v_1.Op != OpLeq16 {
22440 continue
22441 }
22442 _ = v_1.Args[1]
22443 if x != v_1.Args[0] {
22444 continue
22445 }
22446 v_1_1 := v_1.Args[1]
22447 if v_1_1.Op != OpConst16 {
22448 continue
22449 }
22450 d := auxIntToInt16(v_1_1.AuxInt)
22451 if !(c >= d+1 && d+1 > d) {
22452 continue
22453 }
22454 v.reset(OpLess16U)
22455 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
22456 v0.AuxInt = int16ToAuxInt(c - d - 1)
22457 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
22458 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
22459 v2.AuxInt = int16ToAuxInt(d + 1)
22460 v1.AddArg2(x, v2)
22461 v.AddArg2(v0, v1)
22462 return true
22463 }
22464 break
22465 }
22466
22467
22468
22469 for {
22470 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22471 if v_0.Op != OpLeq16 {
22472 continue
22473 }
22474 x := v_0.Args[1]
22475 v_0_0 := v_0.Args[0]
22476 if v_0_0.Op != OpConst16 {
22477 continue
22478 }
22479 c := auxIntToInt16(v_0_0.AuxInt)
22480 if v_1.Op != OpLeq16 {
22481 continue
22482 }
22483 _ = v_1.Args[1]
22484 if x != v_1.Args[0] {
22485 continue
22486 }
22487 v_1_1 := v_1.Args[1]
22488 if v_1_1.Op != OpConst16 {
22489 continue
22490 }
22491 d := auxIntToInt16(v_1_1.AuxInt)
22492 if !(c >= d+1 && d+1 > d) {
22493 continue
22494 }
22495 v.reset(OpLeq16U)
22496 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
22497 v0.AuxInt = int16ToAuxInt(c - d - 1)
22498 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
22499 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
22500 v2.AuxInt = int16ToAuxInt(d + 1)
22501 v1.AddArg2(x, v2)
22502 v.AddArg2(v0, v1)
22503 return true
22504 }
22505 break
22506 }
22507
22508
22509
22510 for {
22511 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22512 if v_0.Op != OpLess8 {
22513 continue
22514 }
22515 x := v_0.Args[1]
22516 v_0_0 := v_0.Args[0]
22517 if v_0_0.Op != OpConst8 {
22518 continue
22519 }
22520 c := auxIntToInt8(v_0_0.AuxInt)
22521 if v_1.Op != OpLeq8 {
22522 continue
22523 }
22524 _ = v_1.Args[1]
22525 if x != v_1.Args[0] {
22526 continue
22527 }
22528 v_1_1 := v_1.Args[1]
22529 if v_1_1.Op != OpConst8 {
22530 continue
22531 }
22532 d := auxIntToInt8(v_1_1.AuxInt)
22533 if !(c >= d+1 && d+1 > d) {
22534 continue
22535 }
22536 v.reset(OpLess8U)
22537 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
22538 v0.AuxInt = int8ToAuxInt(c - d - 1)
22539 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
22540 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
22541 v2.AuxInt = int8ToAuxInt(d + 1)
22542 v1.AddArg2(x, v2)
22543 v.AddArg2(v0, v1)
22544 return true
22545 }
22546 break
22547 }
22548
22549
22550
22551 for {
22552 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22553 if v_0.Op != OpLeq8 {
22554 continue
22555 }
22556 x := v_0.Args[1]
22557 v_0_0 := v_0.Args[0]
22558 if v_0_0.Op != OpConst8 {
22559 continue
22560 }
22561 c := auxIntToInt8(v_0_0.AuxInt)
22562 if v_1.Op != OpLeq8 {
22563 continue
22564 }
22565 _ = v_1.Args[1]
22566 if x != v_1.Args[0] {
22567 continue
22568 }
22569 v_1_1 := v_1.Args[1]
22570 if v_1_1.Op != OpConst8 {
22571 continue
22572 }
22573 d := auxIntToInt8(v_1_1.AuxInt)
22574 if !(c >= d+1 && d+1 > d) {
22575 continue
22576 }
22577 v.reset(OpLeq8U)
22578 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
22579 v0.AuxInt = int8ToAuxInt(c - d - 1)
22580 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
22581 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
22582 v2.AuxInt = int8ToAuxInt(d + 1)
22583 v1.AddArg2(x, v2)
22584 v.AddArg2(v0, v1)
22585 return true
22586 }
22587 break
22588 }
22589
22590
22591
22592 for {
22593 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22594 if v_0.Op != OpLess64U {
22595 continue
22596 }
22597 x := v_0.Args[1]
22598 v_0_0 := v_0.Args[0]
22599 if v_0_0.Op != OpConst64 {
22600 continue
22601 }
22602 c := auxIntToInt64(v_0_0.AuxInt)
22603 if v_1.Op != OpLess64U {
22604 continue
22605 }
22606 _ = v_1.Args[1]
22607 if x != v_1.Args[0] {
22608 continue
22609 }
22610 v_1_1 := v_1.Args[1]
22611 if v_1_1.Op != OpConst64 {
22612 continue
22613 }
22614 d := auxIntToInt64(v_1_1.AuxInt)
22615 if !(uint64(c) >= uint64(d)) {
22616 continue
22617 }
22618 v.reset(OpLess64U)
22619 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
22620 v0.AuxInt = int64ToAuxInt(c - d)
22621 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
22622 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
22623 v2.AuxInt = int64ToAuxInt(d)
22624 v1.AddArg2(x, v2)
22625 v.AddArg2(v0, v1)
22626 return true
22627 }
22628 break
22629 }
22630
22631
22632
22633 for {
22634 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22635 if v_0.Op != OpLeq64U {
22636 continue
22637 }
22638 x := v_0.Args[1]
22639 v_0_0 := v_0.Args[0]
22640 if v_0_0.Op != OpConst64 {
22641 continue
22642 }
22643 c := auxIntToInt64(v_0_0.AuxInt)
22644 if v_1.Op != OpLess64U {
22645 continue
22646 }
22647 _ = v_1.Args[1]
22648 if x != v_1.Args[0] {
22649 continue
22650 }
22651 v_1_1 := v_1.Args[1]
22652 if v_1_1.Op != OpConst64 {
22653 continue
22654 }
22655 d := auxIntToInt64(v_1_1.AuxInt)
22656 if !(uint64(c) >= uint64(d)) {
22657 continue
22658 }
22659 v.reset(OpLeq64U)
22660 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
22661 v0.AuxInt = int64ToAuxInt(c - d)
22662 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
22663 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
22664 v2.AuxInt = int64ToAuxInt(d)
22665 v1.AddArg2(x, v2)
22666 v.AddArg2(v0, v1)
22667 return true
22668 }
22669 break
22670 }
22671
22672
22673
22674 for {
22675 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22676 if v_0.Op != OpLess32U {
22677 continue
22678 }
22679 x := v_0.Args[1]
22680 v_0_0 := v_0.Args[0]
22681 if v_0_0.Op != OpConst32 {
22682 continue
22683 }
22684 c := auxIntToInt32(v_0_0.AuxInt)
22685 if v_1.Op != OpLess32U {
22686 continue
22687 }
22688 _ = v_1.Args[1]
22689 if x != v_1.Args[0] {
22690 continue
22691 }
22692 v_1_1 := v_1.Args[1]
22693 if v_1_1.Op != OpConst32 {
22694 continue
22695 }
22696 d := auxIntToInt32(v_1_1.AuxInt)
22697 if !(uint32(c) >= uint32(d)) {
22698 continue
22699 }
22700 v.reset(OpLess32U)
22701 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
22702 v0.AuxInt = int32ToAuxInt(c - d)
22703 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
22704 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
22705 v2.AuxInt = int32ToAuxInt(d)
22706 v1.AddArg2(x, v2)
22707 v.AddArg2(v0, v1)
22708 return true
22709 }
22710 break
22711 }
22712
22713
22714
22715 for {
22716 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22717 if v_0.Op != OpLeq32U {
22718 continue
22719 }
22720 x := v_0.Args[1]
22721 v_0_0 := v_0.Args[0]
22722 if v_0_0.Op != OpConst32 {
22723 continue
22724 }
22725 c := auxIntToInt32(v_0_0.AuxInt)
22726 if v_1.Op != OpLess32U {
22727 continue
22728 }
22729 _ = v_1.Args[1]
22730 if x != v_1.Args[0] {
22731 continue
22732 }
22733 v_1_1 := v_1.Args[1]
22734 if v_1_1.Op != OpConst32 {
22735 continue
22736 }
22737 d := auxIntToInt32(v_1_1.AuxInt)
22738 if !(uint32(c) >= uint32(d)) {
22739 continue
22740 }
22741 v.reset(OpLeq32U)
22742 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
22743 v0.AuxInt = int32ToAuxInt(c - d)
22744 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
22745 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
22746 v2.AuxInt = int32ToAuxInt(d)
22747 v1.AddArg2(x, v2)
22748 v.AddArg2(v0, v1)
22749 return true
22750 }
22751 break
22752 }
22753
22754
22755
22756 for {
22757 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22758 if v_0.Op != OpLess16U {
22759 continue
22760 }
22761 x := v_0.Args[1]
22762 v_0_0 := v_0.Args[0]
22763 if v_0_0.Op != OpConst16 {
22764 continue
22765 }
22766 c := auxIntToInt16(v_0_0.AuxInt)
22767 if v_1.Op != OpLess16U {
22768 continue
22769 }
22770 _ = v_1.Args[1]
22771 if x != v_1.Args[0] {
22772 continue
22773 }
22774 v_1_1 := v_1.Args[1]
22775 if v_1_1.Op != OpConst16 {
22776 continue
22777 }
22778 d := auxIntToInt16(v_1_1.AuxInt)
22779 if !(uint16(c) >= uint16(d)) {
22780 continue
22781 }
22782 v.reset(OpLess16U)
22783 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
22784 v0.AuxInt = int16ToAuxInt(c - d)
22785 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
22786 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
22787 v2.AuxInt = int16ToAuxInt(d)
22788 v1.AddArg2(x, v2)
22789 v.AddArg2(v0, v1)
22790 return true
22791 }
22792 break
22793 }
22794
22795
22796
22797 for {
22798 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22799 if v_0.Op != OpLeq16U {
22800 continue
22801 }
22802 x := v_0.Args[1]
22803 v_0_0 := v_0.Args[0]
22804 if v_0_0.Op != OpConst16 {
22805 continue
22806 }
22807 c := auxIntToInt16(v_0_0.AuxInt)
22808 if v_1.Op != OpLess16U {
22809 continue
22810 }
22811 _ = v_1.Args[1]
22812 if x != v_1.Args[0] {
22813 continue
22814 }
22815 v_1_1 := v_1.Args[1]
22816 if v_1_1.Op != OpConst16 {
22817 continue
22818 }
22819 d := auxIntToInt16(v_1_1.AuxInt)
22820 if !(uint16(c) >= uint16(d)) {
22821 continue
22822 }
22823 v.reset(OpLeq16U)
22824 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
22825 v0.AuxInt = int16ToAuxInt(c - d)
22826 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
22827 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
22828 v2.AuxInt = int16ToAuxInt(d)
22829 v1.AddArg2(x, v2)
22830 v.AddArg2(v0, v1)
22831 return true
22832 }
22833 break
22834 }
22835
22836
22837
22838 for {
22839 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22840 if v_0.Op != OpLess8U {
22841 continue
22842 }
22843 x := v_0.Args[1]
22844 v_0_0 := v_0.Args[0]
22845 if v_0_0.Op != OpConst8 {
22846 continue
22847 }
22848 c := auxIntToInt8(v_0_0.AuxInt)
22849 if v_1.Op != OpLess8U {
22850 continue
22851 }
22852 _ = v_1.Args[1]
22853 if x != v_1.Args[0] {
22854 continue
22855 }
22856 v_1_1 := v_1.Args[1]
22857 if v_1_1.Op != OpConst8 {
22858 continue
22859 }
22860 d := auxIntToInt8(v_1_1.AuxInt)
22861 if !(uint8(c) >= uint8(d)) {
22862 continue
22863 }
22864 v.reset(OpLess8U)
22865 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
22866 v0.AuxInt = int8ToAuxInt(c - d)
22867 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
22868 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
22869 v2.AuxInt = int8ToAuxInt(d)
22870 v1.AddArg2(x, v2)
22871 v.AddArg2(v0, v1)
22872 return true
22873 }
22874 break
22875 }
22876
22877
22878
22879 for {
22880 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22881 if v_0.Op != OpLeq8U {
22882 continue
22883 }
22884 x := v_0.Args[1]
22885 v_0_0 := v_0.Args[0]
22886 if v_0_0.Op != OpConst8 {
22887 continue
22888 }
22889 c := auxIntToInt8(v_0_0.AuxInt)
22890 if v_1.Op != OpLess8U {
22891 continue
22892 }
22893 _ = v_1.Args[1]
22894 if x != v_1.Args[0] {
22895 continue
22896 }
22897 v_1_1 := v_1.Args[1]
22898 if v_1_1.Op != OpConst8 {
22899 continue
22900 }
22901 d := auxIntToInt8(v_1_1.AuxInt)
22902 if !(uint8(c) >= uint8(d)) {
22903 continue
22904 }
22905 v.reset(OpLeq8U)
22906 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
22907 v0.AuxInt = int8ToAuxInt(c - d)
22908 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
22909 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
22910 v2.AuxInt = int8ToAuxInt(d)
22911 v1.AddArg2(x, v2)
22912 v.AddArg2(v0, v1)
22913 return true
22914 }
22915 break
22916 }
22917
22918
22919
22920 for {
22921 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22922 if v_0.Op != OpLess64U {
22923 continue
22924 }
22925 x := v_0.Args[1]
22926 v_0_0 := v_0.Args[0]
22927 if v_0_0.Op != OpConst64 {
22928 continue
22929 }
22930 c := auxIntToInt64(v_0_0.AuxInt)
22931 if v_1.Op != OpLeq64U {
22932 continue
22933 }
22934 _ = v_1.Args[1]
22935 if x != v_1.Args[0] {
22936 continue
22937 }
22938 v_1_1 := v_1.Args[1]
22939 if v_1_1.Op != OpConst64 {
22940 continue
22941 }
22942 d := auxIntToInt64(v_1_1.AuxInt)
22943 if !(uint64(c) >= uint64(d+1) && uint64(d+1) > uint64(d)) {
22944 continue
22945 }
22946 v.reset(OpLess64U)
22947 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
22948 v0.AuxInt = int64ToAuxInt(c - d - 1)
22949 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
22950 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
22951 v2.AuxInt = int64ToAuxInt(d + 1)
22952 v1.AddArg2(x, v2)
22953 v.AddArg2(v0, v1)
22954 return true
22955 }
22956 break
22957 }
22958
22959
22960
22961 for {
22962 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22963 if v_0.Op != OpLeq64U {
22964 continue
22965 }
22966 x := v_0.Args[1]
22967 v_0_0 := v_0.Args[0]
22968 if v_0_0.Op != OpConst64 {
22969 continue
22970 }
22971 c := auxIntToInt64(v_0_0.AuxInt)
22972 if v_1.Op != OpLeq64U {
22973 continue
22974 }
22975 _ = v_1.Args[1]
22976 if x != v_1.Args[0] {
22977 continue
22978 }
22979 v_1_1 := v_1.Args[1]
22980 if v_1_1.Op != OpConst64 {
22981 continue
22982 }
22983 d := auxIntToInt64(v_1_1.AuxInt)
22984 if !(uint64(c) >= uint64(d+1) && uint64(d+1) > uint64(d)) {
22985 continue
22986 }
22987 v.reset(OpLeq64U)
22988 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
22989 v0.AuxInt = int64ToAuxInt(c - d - 1)
22990 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
22991 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
22992 v2.AuxInt = int64ToAuxInt(d + 1)
22993 v1.AddArg2(x, v2)
22994 v.AddArg2(v0, v1)
22995 return true
22996 }
22997 break
22998 }
22999
23000
23001
23002 for {
23003 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23004 if v_0.Op != OpLess32U {
23005 continue
23006 }
23007 x := v_0.Args[1]
23008 v_0_0 := v_0.Args[0]
23009 if v_0_0.Op != OpConst32 {
23010 continue
23011 }
23012 c := auxIntToInt32(v_0_0.AuxInt)
23013 if v_1.Op != OpLeq32U {
23014 continue
23015 }
23016 _ = v_1.Args[1]
23017 if x != v_1.Args[0] {
23018 continue
23019 }
23020 v_1_1 := v_1.Args[1]
23021 if v_1_1.Op != OpConst32 {
23022 continue
23023 }
23024 d := auxIntToInt32(v_1_1.AuxInt)
23025 if !(uint32(c) >= uint32(d+1) && uint32(d+1) > uint32(d)) {
23026 continue
23027 }
23028 v.reset(OpLess32U)
23029 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23030 v0.AuxInt = int32ToAuxInt(c - d - 1)
23031 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23032 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23033 v2.AuxInt = int32ToAuxInt(d + 1)
23034 v1.AddArg2(x, v2)
23035 v.AddArg2(v0, v1)
23036 return true
23037 }
23038 break
23039 }
23040
23041
23042
23043 for {
23044 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23045 if v_0.Op != OpLeq32U {
23046 continue
23047 }
23048 x := v_0.Args[1]
23049 v_0_0 := v_0.Args[0]
23050 if v_0_0.Op != OpConst32 {
23051 continue
23052 }
23053 c := auxIntToInt32(v_0_0.AuxInt)
23054 if v_1.Op != OpLeq32U {
23055 continue
23056 }
23057 _ = v_1.Args[1]
23058 if x != v_1.Args[0] {
23059 continue
23060 }
23061 v_1_1 := v_1.Args[1]
23062 if v_1_1.Op != OpConst32 {
23063 continue
23064 }
23065 d := auxIntToInt32(v_1_1.AuxInt)
23066 if !(uint32(c) >= uint32(d+1) && uint32(d+1) > uint32(d)) {
23067 continue
23068 }
23069 v.reset(OpLeq32U)
23070 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23071 v0.AuxInt = int32ToAuxInt(c - d - 1)
23072 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23073 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23074 v2.AuxInt = int32ToAuxInt(d + 1)
23075 v1.AddArg2(x, v2)
23076 v.AddArg2(v0, v1)
23077 return true
23078 }
23079 break
23080 }
23081
23082
23083
23084 for {
23085 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23086 if v_0.Op != OpLess16U {
23087 continue
23088 }
23089 x := v_0.Args[1]
23090 v_0_0 := v_0.Args[0]
23091 if v_0_0.Op != OpConst16 {
23092 continue
23093 }
23094 c := auxIntToInt16(v_0_0.AuxInt)
23095 if v_1.Op != OpLeq16U {
23096 continue
23097 }
23098 _ = v_1.Args[1]
23099 if x != v_1.Args[0] {
23100 continue
23101 }
23102 v_1_1 := v_1.Args[1]
23103 if v_1_1.Op != OpConst16 {
23104 continue
23105 }
23106 d := auxIntToInt16(v_1_1.AuxInt)
23107 if !(uint16(c) >= uint16(d+1) && uint16(d+1) > uint16(d)) {
23108 continue
23109 }
23110 v.reset(OpLess16U)
23111 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23112 v0.AuxInt = int16ToAuxInt(c - d - 1)
23113 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23114 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23115 v2.AuxInt = int16ToAuxInt(d + 1)
23116 v1.AddArg2(x, v2)
23117 v.AddArg2(v0, v1)
23118 return true
23119 }
23120 break
23121 }
23122
23123
23124
23125 for {
23126 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23127 if v_0.Op != OpLeq16U {
23128 continue
23129 }
23130 x := v_0.Args[1]
23131 v_0_0 := v_0.Args[0]
23132 if v_0_0.Op != OpConst16 {
23133 continue
23134 }
23135 c := auxIntToInt16(v_0_0.AuxInt)
23136 if v_1.Op != OpLeq16U {
23137 continue
23138 }
23139 _ = v_1.Args[1]
23140 if x != v_1.Args[0] {
23141 continue
23142 }
23143 v_1_1 := v_1.Args[1]
23144 if v_1_1.Op != OpConst16 {
23145 continue
23146 }
23147 d := auxIntToInt16(v_1_1.AuxInt)
23148 if !(uint16(c) >= uint16(d+1) && uint16(d+1) > uint16(d)) {
23149 continue
23150 }
23151 v.reset(OpLeq16U)
23152 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23153 v0.AuxInt = int16ToAuxInt(c - d - 1)
23154 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23155 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23156 v2.AuxInt = int16ToAuxInt(d + 1)
23157 v1.AddArg2(x, v2)
23158 v.AddArg2(v0, v1)
23159 return true
23160 }
23161 break
23162 }
23163
23164
23165
23166 for {
23167 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23168 if v_0.Op != OpLess8U {
23169 continue
23170 }
23171 x := v_0.Args[1]
23172 v_0_0 := v_0.Args[0]
23173 if v_0_0.Op != OpConst8 {
23174 continue
23175 }
23176 c := auxIntToInt8(v_0_0.AuxInt)
23177 if v_1.Op != OpLeq8U {
23178 continue
23179 }
23180 _ = v_1.Args[1]
23181 if x != v_1.Args[0] {
23182 continue
23183 }
23184 v_1_1 := v_1.Args[1]
23185 if v_1_1.Op != OpConst8 {
23186 continue
23187 }
23188 d := auxIntToInt8(v_1_1.AuxInt)
23189 if !(uint8(c) >= uint8(d+1) && uint8(d+1) > uint8(d)) {
23190 continue
23191 }
23192 v.reset(OpLess8U)
23193 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23194 v0.AuxInt = int8ToAuxInt(c - d - 1)
23195 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23196 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23197 v2.AuxInt = int8ToAuxInt(d + 1)
23198 v1.AddArg2(x, v2)
23199 v.AddArg2(v0, v1)
23200 return true
23201 }
23202 break
23203 }
23204
23205
23206
23207 for {
23208 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23209 if v_0.Op != OpLeq8U {
23210 continue
23211 }
23212 x := v_0.Args[1]
23213 v_0_0 := v_0.Args[0]
23214 if v_0_0.Op != OpConst8 {
23215 continue
23216 }
23217 c := auxIntToInt8(v_0_0.AuxInt)
23218 if v_1.Op != OpLeq8U {
23219 continue
23220 }
23221 _ = v_1.Args[1]
23222 if x != v_1.Args[0] {
23223 continue
23224 }
23225 v_1_1 := v_1.Args[1]
23226 if v_1_1.Op != OpConst8 {
23227 continue
23228 }
23229 d := auxIntToInt8(v_1_1.AuxInt)
23230 if !(uint8(c) >= uint8(d+1) && uint8(d+1) > uint8(d)) {
23231 continue
23232 }
23233 v.reset(OpLeq8U)
23234 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23235 v0.AuxInt = int8ToAuxInt(c - d - 1)
23236 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23237 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23238 v2.AuxInt = int8ToAuxInt(d + 1)
23239 v1.AddArg2(x, v2)
23240 v.AddArg2(v0, v1)
23241 return true
23242 }
23243 break
23244 }
23245
23246
23247 for {
23248 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23249 if v_0.Op != OpNeq64F {
23250 continue
23251 }
23252 x := v_0.Args[1]
23253 if x != v_0.Args[0] || v_1.Op != OpLess64F {
23254 continue
23255 }
23256 _ = v_1.Args[1]
23257 if x != v_1.Args[0] {
23258 continue
23259 }
23260 y := v_1.Args[1]
23261 if y.Op != OpConst64F {
23262 continue
23263 }
23264 v.reset(OpNot)
23265 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
23266 v0.AddArg2(y, x)
23267 v.AddArg(v0)
23268 return true
23269 }
23270 break
23271 }
23272
23273
23274 for {
23275 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23276 if v_0.Op != OpNeq64F {
23277 continue
23278 }
23279 x := v_0.Args[1]
23280 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
23281 continue
23282 }
23283 _ = v_1.Args[1]
23284 if x != v_1.Args[0] {
23285 continue
23286 }
23287 y := v_1.Args[1]
23288 if y.Op != OpConst64F {
23289 continue
23290 }
23291 v.reset(OpNot)
23292 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
23293 v0.AddArg2(y, x)
23294 v.AddArg(v0)
23295 return true
23296 }
23297 break
23298 }
23299
23300
23301 for {
23302 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23303 if v_0.Op != OpNeq64F {
23304 continue
23305 }
23306 x := v_0.Args[1]
23307 if x != v_0.Args[0] || v_1.Op != OpLess64F {
23308 continue
23309 }
23310 _ = v_1.Args[1]
23311 y := v_1.Args[0]
23312 if y.Op != OpConst64F {
23313 continue
23314 }
23315 if x != v_1.Args[1] {
23316 continue
23317 }
23318 v.reset(OpNot)
23319 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
23320 v0.AddArg2(x, y)
23321 v.AddArg(v0)
23322 return true
23323 }
23324 break
23325 }
23326
23327
23328 for {
23329 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23330 if v_0.Op != OpNeq64F {
23331 continue
23332 }
23333 x := v_0.Args[1]
23334 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
23335 continue
23336 }
23337 _ = v_1.Args[1]
23338 y := v_1.Args[0]
23339 if y.Op != OpConst64F {
23340 continue
23341 }
23342 if x != v_1.Args[1] {
23343 continue
23344 }
23345 v.reset(OpNot)
23346 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
23347 v0.AddArg2(x, y)
23348 v.AddArg(v0)
23349 return true
23350 }
23351 break
23352 }
23353
23354
23355 for {
23356 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23357 if v_0.Op != OpNeq32F {
23358 continue
23359 }
23360 x := v_0.Args[1]
23361 if x != v_0.Args[0] || v_1.Op != OpLess32F {
23362 continue
23363 }
23364 _ = v_1.Args[1]
23365 if x != v_1.Args[0] {
23366 continue
23367 }
23368 y := v_1.Args[1]
23369 if y.Op != OpConst32F {
23370 continue
23371 }
23372 v.reset(OpNot)
23373 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
23374 v0.AddArg2(y, x)
23375 v.AddArg(v0)
23376 return true
23377 }
23378 break
23379 }
23380
23381
23382 for {
23383 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23384 if v_0.Op != OpNeq32F {
23385 continue
23386 }
23387 x := v_0.Args[1]
23388 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
23389 continue
23390 }
23391 _ = v_1.Args[1]
23392 if x != v_1.Args[0] {
23393 continue
23394 }
23395 y := v_1.Args[1]
23396 if y.Op != OpConst32F {
23397 continue
23398 }
23399 v.reset(OpNot)
23400 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
23401 v0.AddArg2(y, x)
23402 v.AddArg(v0)
23403 return true
23404 }
23405 break
23406 }
23407
23408
23409 for {
23410 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23411 if v_0.Op != OpNeq32F {
23412 continue
23413 }
23414 x := v_0.Args[1]
23415 if x != v_0.Args[0] || v_1.Op != OpLess32F {
23416 continue
23417 }
23418 _ = v_1.Args[1]
23419 y := v_1.Args[0]
23420 if y.Op != OpConst32F {
23421 continue
23422 }
23423 if x != v_1.Args[1] {
23424 continue
23425 }
23426 v.reset(OpNot)
23427 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
23428 v0.AddArg2(x, y)
23429 v.AddArg(v0)
23430 return true
23431 }
23432 break
23433 }
23434
23435
23436 for {
23437 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23438 if v_0.Op != OpNeq32F {
23439 continue
23440 }
23441 x := v_0.Args[1]
23442 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
23443 continue
23444 }
23445 _ = v_1.Args[1]
23446 y := v_1.Args[0]
23447 if y.Op != OpConst32F {
23448 continue
23449 }
23450 if x != v_1.Args[1] {
23451 continue
23452 }
23453 v.reset(OpNot)
23454 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
23455 v0.AddArg2(x, y)
23456 v.AddArg(v0)
23457 return true
23458 }
23459 break
23460 }
23461
23462
23463 for {
23464 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23465 if v_0.Op != OpNeq64F {
23466 continue
23467 }
23468 x := v_0.Args[1]
23469 if x != v_0.Args[0] || v_1.Op != OpLess64F {
23470 continue
23471 }
23472 _ = v_1.Args[1]
23473 abs := v_1.Args[0]
23474 if abs.Op != OpAbs || x != abs.Args[0] {
23475 continue
23476 }
23477 y := v_1.Args[1]
23478 if y.Op != OpConst64F {
23479 continue
23480 }
23481 v.reset(OpNot)
23482 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
23483 v0.AddArg2(y, abs)
23484 v.AddArg(v0)
23485 return true
23486 }
23487 break
23488 }
23489
23490
23491 for {
23492 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23493 if v_0.Op != OpNeq64F {
23494 continue
23495 }
23496 x := v_0.Args[1]
23497 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
23498 continue
23499 }
23500 _ = v_1.Args[1]
23501 abs := v_1.Args[0]
23502 if abs.Op != OpAbs || x != abs.Args[0] {
23503 continue
23504 }
23505 y := v_1.Args[1]
23506 if y.Op != OpConst64F {
23507 continue
23508 }
23509 v.reset(OpNot)
23510 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
23511 v0.AddArg2(y, abs)
23512 v.AddArg(v0)
23513 return true
23514 }
23515 break
23516 }
23517
23518
23519 for {
23520 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23521 if v_0.Op != OpNeq64F {
23522 continue
23523 }
23524 x := v_0.Args[1]
23525 if x != v_0.Args[0] || v_1.Op != OpLess64F {
23526 continue
23527 }
23528 _ = v_1.Args[1]
23529 y := v_1.Args[0]
23530 if y.Op != OpConst64F {
23531 continue
23532 }
23533 abs := v_1.Args[1]
23534 if abs.Op != OpAbs || x != abs.Args[0] {
23535 continue
23536 }
23537 v.reset(OpNot)
23538 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
23539 v0.AddArg2(abs, y)
23540 v.AddArg(v0)
23541 return true
23542 }
23543 break
23544 }
23545
23546
23547 for {
23548 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23549 if v_0.Op != OpNeq64F {
23550 continue
23551 }
23552 x := v_0.Args[1]
23553 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
23554 continue
23555 }
23556 _ = v_1.Args[1]
23557 y := v_1.Args[0]
23558 if y.Op != OpConst64F {
23559 continue
23560 }
23561 abs := v_1.Args[1]
23562 if abs.Op != OpAbs || x != abs.Args[0] {
23563 continue
23564 }
23565 v.reset(OpNot)
23566 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
23567 v0.AddArg2(abs, y)
23568 v.AddArg(v0)
23569 return true
23570 }
23571 break
23572 }
23573
23574
23575 for {
23576 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23577 if v_0.Op != OpNeq64F {
23578 continue
23579 }
23580 x := v_0.Args[1]
23581 if x != v_0.Args[0] || v_1.Op != OpLess64F {
23582 continue
23583 }
23584 _ = v_1.Args[1]
23585 neg := v_1.Args[0]
23586 if neg.Op != OpNeg64F || x != neg.Args[0] {
23587 continue
23588 }
23589 y := v_1.Args[1]
23590 if y.Op != OpConst64F {
23591 continue
23592 }
23593 v.reset(OpNot)
23594 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
23595 v0.AddArg2(y, neg)
23596 v.AddArg(v0)
23597 return true
23598 }
23599 break
23600 }
23601
23602
23603 for {
23604 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23605 if v_0.Op != OpNeq64F {
23606 continue
23607 }
23608 x := v_0.Args[1]
23609 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
23610 continue
23611 }
23612 _ = v_1.Args[1]
23613 neg := v_1.Args[0]
23614 if neg.Op != OpNeg64F || x != neg.Args[0] {
23615 continue
23616 }
23617 y := v_1.Args[1]
23618 if y.Op != OpConst64F {
23619 continue
23620 }
23621 v.reset(OpNot)
23622 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
23623 v0.AddArg2(y, neg)
23624 v.AddArg(v0)
23625 return true
23626 }
23627 break
23628 }
23629
23630
23631 for {
23632 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23633 if v_0.Op != OpNeq64F {
23634 continue
23635 }
23636 x := v_0.Args[1]
23637 if x != v_0.Args[0] || v_1.Op != OpLess64F {
23638 continue
23639 }
23640 _ = v_1.Args[1]
23641 y := v_1.Args[0]
23642 if y.Op != OpConst64F {
23643 continue
23644 }
23645 neg := v_1.Args[1]
23646 if neg.Op != OpNeg64F || x != neg.Args[0] {
23647 continue
23648 }
23649 v.reset(OpNot)
23650 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
23651 v0.AddArg2(neg, y)
23652 v.AddArg(v0)
23653 return true
23654 }
23655 break
23656 }
23657
23658
23659 for {
23660 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23661 if v_0.Op != OpNeq64F {
23662 continue
23663 }
23664 x := v_0.Args[1]
23665 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
23666 continue
23667 }
23668 _ = v_1.Args[1]
23669 y := v_1.Args[0]
23670 if y.Op != OpConst64F {
23671 continue
23672 }
23673 neg := v_1.Args[1]
23674 if neg.Op != OpNeg64F || x != neg.Args[0] {
23675 continue
23676 }
23677 v.reset(OpNot)
23678 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
23679 v0.AddArg2(neg, y)
23680 v.AddArg(v0)
23681 return true
23682 }
23683 break
23684 }
23685
23686
23687 for {
23688 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23689 if v_0.Op != OpNeq32F {
23690 continue
23691 }
23692 x := v_0.Args[1]
23693 if x != v_0.Args[0] || v_1.Op != OpLess32F {
23694 continue
23695 }
23696 _ = v_1.Args[1]
23697 neg := v_1.Args[0]
23698 if neg.Op != OpNeg32F || x != neg.Args[0] {
23699 continue
23700 }
23701 y := v_1.Args[1]
23702 if y.Op != OpConst32F {
23703 continue
23704 }
23705 v.reset(OpNot)
23706 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
23707 v0.AddArg2(y, neg)
23708 v.AddArg(v0)
23709 return true
23710 }
23711 break
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 != OpNeq32F {
23718 continue
23719 }
23720 x := v_0.Args[1]
23721 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
23722 continue
23723 }
23724 _ = v_1.Args[1]
23725 neg := v_1.Args[0]
23726 if neg.Op != OpNeg32F || x != neg.Args[0] {
23727 continue
23728 }
23729 y := v_1.Args[1]
23730 if y.Op != OpConst32F {
23731 continue
23732 }
23733 v.reset(OpNot)
23734 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
23735 v0.AddArg2(y, neg)
23736 v.AddArg(v0)
23737 return true
23738 }
23739 break
23740 }
23741
23742
23743 for {
23744 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23745 if v_0.Op != OpNeq32F {
23746 continue
23747 }
23748 x := v_0.Args[1]
23749 if x != v_0.Args[0] || v_1.Op != OpLess32F {
23750 continue
23751 }
23752 _ = v_1.Args[1]
23753 y := v_1.Args[0]
23754 if y.Op != OpConst32F {
23755 continue
23756 }
23757 neg := v_1.Args[1]
23758 if neg.Op != OpNeg32F || x != neg.Args[0] {
23759 continue
23760 }
23761 v.reset(OpNot)
23762 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
23763 v0.AddArg2(neg, y)
23764 v.AddArg(v0)
23765 return true
23766 }
23767 break
23768 }
23769
23770
23771 for {
23772 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23773 if v_0.Op != OpNeq32F {
23774 continue
23775 }
23776 x := v_0.Args[1]
23777 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
23778 continue
23779 }
23780 _ = v_1.Args[1]
23781 y := v_1.Args[0]
23782 if y.Op != OpConst32F {
23783 continue
23784 }
23785 neg := v_1.Args[1]
23786 if neg.Op != OpNeg32F || x != neg.Args[0] {
23787 continue
23788 }
23789 v.reset(OpNot)
23790 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
23791 v0.AddArg2(neg, y)
23792 v.AddArg(v0)
23793 return true
23794 }
23795 break
23796 }
23797 return false
23798 }
23799 func rewriteValuegeneric_OpPhi(v *Value) bool {
23800 b := v.Block
23801
23802
23803 for {
23804 if len(v.Args) != 2 {
23805 break
23806 }
23807 _ = v.Args[1]
23808 v_0 := v.Args[0]
23809 if v_0.Op != OpConst8 {
23810 break
23811 }
23812 c := auxIntToInt8(v_0.AuxInt)
23813 v_1 := v.Args[1]
23814 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != c {
23815 break
23816 }
23817 v.reset(OpConst8)
23818 v.AuxInt = int8ToAuxInt(c)
23819 return true
23820 }
23821
23822
23823 for {
23824 if len(v.Args) != 2 {
23825 break
23826 }
23827 _ = v.Args[1]
23828 v_0 := v.Args[0]
23829 if v_0.Op != OpConst16 {
23830 break
23831 }
23832 c := auxIntToInt16(v_0.AuxInt)
23833 v_1 := v.Args[1]
23834 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != c {
23835 break
23836 }
23837 v.reset(OpConst16)
23838 v.AuxInt = int16ToAuxInt(c)
23839 return true
23840 }
23841
23842
23843 for {
23844 if len(v.Args) != 2 {
23845 break
23846 }
23847 _ = v.Args[1]
23848 v_0 := v.Args[0]
23849 if v_0.Op != OpConst32 {
23850 break
23851 }
23852 c := auxIntToInt32(v_0.AuxInt)
23853 v_1 := v.Args[1]
23854 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != c {
23855 break
23856 }
23857 v.reset(OpConst32)
23858 v.AuxInt = int32ToAuxInt(c)
23859 return true
23860 }
23861
23862
23863 for {
23864 if len(v.Args) != 2 {
23865 break
23866 }
23867 _ = v.Args[1]
23868 v_0 := v.Args[0]
23869 if v_0.Op != OpConst64 {
23870 break
23871 }
23872 c := auxIntToInt64(v_0.AuxInt)
23873 v_1 := v.Args[1]
23874 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c {
23875 break
23876 }
23877 v.reset(OpConst64)
23878 v.AuxInt = int64ToAuxInt(c)
23879 return true
23880 }
23881
23882
23883
23884 for {
23885 if len(v.Args) != 2 {
23886 break
23887 }
23888 t := v.Type
23889 _ = v.Args[1]
23890 nx := v.Args[0]
23891 if nx.Op != OpNot {
23892 break
23893 }
23894 x := nx.Args[0]
23895 ny := v.Args[1]
23896 if ny.Op != OpNot {
23897 break
23898 }
23899 y := ny.Args[0]
23900 if !(nx.Uses == 1 && ny.Uses == 1) {
23901 break
23902 }
23903 v.reset(OpNot)
23904 v0 := b.NewValue0(v.Pos, OpPhi, t)
23905 v0.AddArg2(x, y)
23906 v.AddArg(v0)
23907 return true
23908 }
23909 return false
23910 }
23911 func rewriteValuegeneric_OpPopCount16(v *Value) bool {
23912 v_0 := v.Args[0]
23913 b := v.Block
23914 config := b.Func.Config
23915
23916
23917
23918 for {
23919 if v_0.Op != OpConst16 {
23920 break
23921 }
23922 c := auxIntToInt16(v_0.AuxInt)
23923 if !(config.PtrSize == 8) {
23924 break
23925 }
23926 v.reset(OpConst64)
23927 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount16(uint16(c))))
23928 return true
23929 }
23930
23931
23932
23933 for {
23934 if v_0.Op != OpConst16 {
23935 break
23936 }
23937 c := auxIntToInt16(v_0.AuxInt)
23938 if !(config.PtrSize == 4) {
23939 break
23940 }
23941 v.reset(OpConst32)
23942 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount16(uint16(c))))
23943 return true
23944 }
23945 return false
23946 }
23947 func rewriteValuegeneric_OpPopCount32(v *Value) bool {
23948 v_0 := v.Args[0]
23949 b := v.Block
23950 config := b.Func.Config
23951
23952
23953
23954 for {
23955 if v_0.Op != OpConst32 {
23956 break
23957 }
23958 c := auxIntToInt32(v_0.AuxInt)
23959 if !(config.PtrSize == 8) {
23960 break
23961 }
23962 v.reset(OpConst64)
23963 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount32(uint32(c))))
23964 return true
23965 }
23966
23967
23968
23969 for {
23970 if v_0.Op != OpConst32 {
23971 break
23972 }
23973 c := auxIntToInt32(v_0.AuxInt)
23974 if !(config.PtrSize == 4) {
23975 break
23976 }
23977 v.reset(OpConst32)
23978 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount32(uint32(c))))
23979 return true
23980 }
23981 return false
23982 }
23983 func rewriteValuegeneric_OpPopCount64(v *Value) bool {
23984 v_0 := v.Args[0]
23985 b := v.Block
23986 config := b.Func.Config
23987
23988
23989
23990 for {
23991 if v_0.Op != OpConst64 {
23992 break
23993 }
23994 c := auxIntToInt64(v_0.AuxInt)
23995 if !(config.PtrSize == 8) {
23996 break
23997 }
23998 v.reset(OpConst64)
23999 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount64(uint64(c))))
24000 return true
24001 }
24002
24003
24004
24005 for {
24006 if v_0.Op != OpConst64 {
24007 break
24008 }
24009 c := auxIntToInt64(v_0.AuxInt)
24010 if !(config.PtrSize == 4) {
24011 break
24012 }
24013 v.reset(OpConst32)
24014 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount64(uint64(c))))
24015 return true
24016 }
24017 return false
24018 }
24019 func rewriteValuegeneric_OpPopCount8(v *Value) bool {
24020 v_0 := v.Args[0]
24021 b := v.Block
24022 config := b.Func.Config
24023
24024
24025
24026 for {
24027 if v_0.Op != OpConst8 {
24028 break
24029 }
24030 c := auxIntToInt8(v_0.AuxInt)
24031 if !(config.PtrSize == 8) {
24032 break
24033 }
24034 v.reset(OpConst64)
24035 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount8(uint8(c))))
24036 return true
24037 }
24038
24039
24040
24041 for {
24042 if v_0.Op != OpConst8 {
24043 break
24044 }
24045 c := auxIntToInt8(v_0.AuxInt)
24046 if !(config.PtrSize == 4) {
24047 break
24048 }
24049 v.reset(OpConst32)
24050 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount8(uint8(c))))
24051 return true
24052 }
24053 return false
24054 }
24055 func rewriteValuegeneric_OpPtrIndex(v *Value) bool {
24056 v_1 := v.Args[1]
24057 v_0 := v.Args[0]
24058 b := v.Block
24059 config := b.Func.Config
24060 typ := &b.Func.Config.Types
24061
24062
24063
24064 for {
24065 t := v.Type
24066 ptr := v_0
24067 idx := v_1
24068 if !(config.PtrSize == 4 && is32Bit(t.Elem().Size())) {
24069 break
24070 }
24071 v.reset(OpAddPtr)
24072 v0 := b.NewValue0(v.Pos, OpMul32, typ.Int)
24073 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
24074 v1.AuxInt = int32ToAuxInt(int32(t.Elem().Size()))
24075 v0.AddArg2(idx, v1)
24076 v.AddArg2(ptr, v0)
24077 return true
24078 }
24079
24080
24081
24082 for {
24083 t := v.Type
24084 ptr := v_0
24085 idx := v_1
24086 if !(config.PtrSize == 8) {
24087 break
24088 }
24089 v.reset(OpAddPtr)
24090 v0 := b.NewValue0(v.Pos, OpMul64, typ.Int)
24091 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
24092 v1.AuxInt = int64ToAuxInt(t.Elem().Size())
24093 v0.AddArg2(idx, v1)
24094 v.AddArg2(ptr, v0)
24095 return true
24096 }
24097 return false
24098 }
24099 func rewriteValuegeneric_OpRotateLeft16(v *Value) bool {
24100 v_1 := v.Args[1]
24101 v_0 := v.Args[0]
24102 b := v.Block
24103 config := b.Func.Config
24104
24105
24106
24107 for {
24108 x := v_0
24109 if v_1.Op != OpConst16 {
24110 break
24111 }
24112 c := auxIntToInt16(v_1.AuxInt)
24113 if !(c%16 == 0) {
24114 break
24115 }
24116 v.copyOf(x)
24117 return true
24118 }
24119
24120
24121
24122 for {
24123 x := v_0
24124 if v_1.Op != OpAnd64 {
24125 break
24126 }
24127 _ = v_1.Args[1]
24128 v_1_0 := v_1.Args[0]
24129 v_1_1 := v_1.Args[1]
24130 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24131 y := v_1_0
24132 if v_1_1.Op != OpConst64 {
24133 continue
24134 }
24135 c := auxIntToInt64(v_1_1.AuxInt)
24136 if !(c&15 == 15) {
24137 continue
24138 }
24139 v.reset(OpRotateLeft16)
24140 v.AddArg2(x, y)
24141 return true
24142 }
24143 break
24144 }
24145
24146
24147
24148 for {
24149 x := v_0
24150 if v_1.Op != OpAnd32 {
24151 break
24152 }
24153 _ = v_1.Args[1]
24154 v_1_0 := v_1.Args[0]
24155 v_1_1 := v_1.Args[1]
24156 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24157 y := v_1_0
24158 if v_1_1.Op != OpConst32 {
24159 continue
24160 }
24161 c := auxIntToInt32(v_1_1.AuxInt)
24162 if !(c&15 == 15) {
24163 continue
24164 }
24165 v.reset(OpRotateLeft16)
24166 v.AddArg2(x, y)
24167 return true
24168 }
24169 break
24170 }
24171
24172
24173
24174 for {
24175 x := v_0
24176 if v_1.Op != OpAnd16 {
24177 break
24178 }
24179 _ = v_1.Args[1]
24180 v_1_0 := v_1.Args[0]
24181 v_1_1 := v_1.Args[1]
24182 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24183 y := v_1_0
24184 if v_1_1.Op != OpConst16 {
24185 continue
24186 }
24187 c := auxIntToInt16(v_1_1.AuxInt)
24188 if !(c&15 == 15) {
24189 continue
24190 }
24191 v.reset(OpRotateLeft16)
24192 v.AddArg2(x, y)
24193 return true
24194 }
24195 break
24196 }
24197
24198
24199
24200 for {
24201 x := v_0
24202 if v_1.Op != OpAnd8 {
24203 break
24204 }
24205 _ = v_1.Args[1]
24206 v_1_0 := v_1.Args[0]
24207 v_1_1 := v_1.Args[1]
24208 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24209 y := v_1_0
24210 if v_1_1.Op != OpConst8 {
24211 continue
24212 }
24213 c := auxIntToInt8(v_1_1.AuxInt)
24214 if !(c&15 == 15) {
24215 continue
24216 }
24217 v.reset(OpRotateLeft16)
24218 v.AddArg2(x, y)
24219 return true
24220 }
24221 break
24222 }
24223
24224
24225
24226 for {
24227 x := v_0
24228 if v_1.Op != OpNeg64 {
24229 break
24230 }
24231 v_1_0 := v_1.Args[0]
24232 if v_1_0.Op != OpAnd64 {
24233 break
24234 }
24235 _ = v_1_0.Args[1]
24236 v_1_0_0 := v_1_0.Args[0]
24237 v_1_0_1 := v_1_0.Args[1]
24238 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
24239 y := v_1_0_0
24240 if v_1_0_1.Op != OpConst64 {
24241 continue
24242 }
24243 c := auxIntToInt64(v_1_0_1.AuxInt)
24244 if !(c&15 == 15) {
24245 continue
24246 }
24247 v.reset(OpRotateLeft16)
24248 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
24249 v0.AddArg(y)
24250 v.AddArg2(x, v0)
24251 return true
24252 }
24253 break
24254 }
24255
24256
24257
24258 for {
24259 x := v_0
24260 if v_1.Op != OpNeg32 {
24261 break
24262 }
24263 v_1_0 := v_1.Args[0]
24264 if v_1_0.Op != OpAnd32 {
24265 break
24266 }
24267 _ = v_1_0.Args[1]
24268 v_1_0_0 := v_1_0.Args[0]
24269 v_1_0_1 := v_1_0.Args[1]
24270 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
24271 y := v_1_0_0
24272 if v_1_0_1.Op != OpConst32 {
24273 continue
24274 }
24275 c := auxIntToInt32(v_1_0_1.AuxInt)
24276 if !(c&15 == 15) {
24277 continue
24278 }
24279 v.reset(OpRotateLeft16)
24280 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
24281 v0.AddArg(y)
24282 v.AddArg2(x, v0)
24283 return true
24284 }
24285 break
24286 }
24287
24288
24289
24290 for {
24291 x := v_0
24292 if v_1.Op != OpNeg16 {
24293 break
24294 }
24295 v_1_0 := v_1.Args[0]
24296 if v_1_0.Op != OpAnd16 {
24297 break
24298 }
24299 _ = v_1_0.Args[1]
24300 v_1_0_0 := v_1_0.Args[0]
24301 v_1_0_1 := v_1_0.Args[1]
24302 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
24303 y := v_1_0_0
24304 if v_1_0_1.Op != OpConst16 {
24305 continue
24306 }
24307 c := auxIntToInt16(v_1_0_1.AuxInt)
24308 if !(c&15 == 15) {
24309 continue
24310 }
24311 v.reset(OpRotateLeft16)
24312 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
24313 v0.AddArg(y)
24314 v.AddArg2(x, v0)
24315 return true
24316 }
24317 break
24318 }
24319
24320
24321
24322 for {
24323 x := v_0
24324 if v_1.Op != OpNeg8 {
24325 break
24326 }
24327 v_1_0 := v_1.Args[0]
24328 if v_1_0.Op != OpAnd8 {
24329 break
24330 }
24331 _ = v_1_0.Args[1]
24332 v_1_0_0 := v_1_0.Args[0]
24333 v_1_0_1 := v_1_0.Args[1]
24334 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
24335 y := v_1_0_0
24336 if v_1_0_1.Op != OpConst8 {
24337 continue
24338 }
24339 c := auxIntToInt8(v_1_0_1.AuxInt)
24340 if !(c&15 == 15) {
24341 continue
24342 }
24343 v.reset(OpRotateLeft16)
24344 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
24345 v0.AddArg(y)
24346 v.AddArg2(x, v0)
24347 return true
24348 }
24349 break
24350 }
24351
24352
24353
24354 for {
24355 x := v_0
24356 if v_1.Op != OpAdd64 {
24357 break
24358 }
24359 _ = v_1.Args[1]
24360 v_1_0 := v_1.Args[0]
24361 v_1_1 := v_1.Args[1]
24362 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24363 y := v_1_0
24364 if v_1_1.Op != OpConst64 {
24365 continue
24366 }
24367 c := auxIntToInt64(v_1_1.AuxInt)
24368 if !(c&15 == 0) {
24369 continue
24370 }
24371 v.reset(OpRotateLeft16)
24372 v.AddArg2(x, y)
24373 return true
24374 }
24375 break
24376 }
24377
24378
24379
24380 for {
24381 x := v_0
24382 if v_1.Op != OpAdd32 {
24383 break
24384 }
24385 _ = v_1.Args[1]
24386 v_1_0 := v_1.Args[0]
24387 v_1_1 := v_1.Args[1]
24388 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24389 y := v_1_0
24390 if v_1_1.Op != OpConst32 {
24391 continue
24392 }
24393 c := auxIntToInt32(v_1_1.AuxInt)
24394 if !(c&15 == 0) {
24395 continue
24396 }
24397 v.reset(OpRotateLeft16)
24398 v.AddArg2(x, y)
24399 return true
24400 }
24401 break
24402 }
24403
24404
24405
24406 for {
24407 x := v_0
24408 if v_1.Op != OpAdd16 {
24409 break
24410 }
24411 _ = v_1.Args[1]
24412 v_1_0 := v_1.Args[0]
24413 v_1_1 := v_1.Args[1]
24414 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24415 y := v_1_0
24416 if v_1_1.Op != OpConst16 {
24417 continue
24418 }
24419 c := auxIntToInt16(v_1_1.AuxInt)
24420 if !(c&15 == 0) {
24421 continue
24422 }
24423 v.reset(OpRotateLeft16)
24424 v.AddArg2(x, y)
24425 return true
24426 }
24427 break
24428 }
24429
24430
24431
24432 for {
24433 x := v_0
24434 if v_1.Op != OpAdd8 {
24435 break
24436 }
24437 _ = v_1.Args[1]
24438 v_1_0 := v_1.Args[0]
24439 v_1_1 := v_1.Args[1]
24440 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24441 y := v_1_0
24442 if v_1_1.Op != OpConst8 {
24443 continue
24444 }
24445 c := auxIntToInt8(v_1_1.AuxInt)
24446 if !(c&15 == 0) {
24447 continue
24448 }
24449 v.reset(OpRotateLeft16)
24450 v.AddArg2(x, y)
24451 return true
24452 }
24453 break
24454 }
24455
24456
24457
24458 for {
24459 x := v_0
24460 if v_1.Op != OpSub64 {
24461 break
24462 }
24463 y := v_1.Args[1]
24464 v_1_0 := v_1.Args[0]
24465 if v_1_0.Op != OpConst64 {
24466 break
24467 }
24468 c := auxIntToInt64(v_1_0.AuxInt)
24469 if !(c&15 == 0) {
24470 break
24471 }
24472 v.reset(OpRotateLeft16)
24473 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
24474 v0.AddArg(y)
24475 v.AddArg2(x, v0)
24476 return true
24477 }
24478
24479
24480
24481 for {
24482 x := v_0
24483 if v_1.Op != OpSub32 {
24484 break
24485 }
24486 y := v_1.Args[1]
24487 v_1_0 := v_1.Args[0]
24488 if v_1_0.Op != OpConst32 {
24489 break
24490 }
24491 c := auxIntToInt32(v_1_0.AuxInt)
24492 if !(c&15 == 0) {
24493 break
24494 }
24495 v.reset(OpRotateLeft16)
24496 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
24497 v0.AddArg(y)
24498 v.AddArg2(x, v0)
24499 return true
24500 }
24501
24502
24503
24504 for {
24505 x := v_0
24506 if v_1.Op != OpSub16 {
24507 break
24508 }
24509 y := v_1.Args[1]
24510 v_1_0 := v_1.Args[0]
24511 if v_1_0.Op != OpConst16 {
24512 break
24513 }
24514 c := auxIntToInt16(v_1_0.AuxInt)
24515 if !(c&15 == 0) {
24516 break
24517 }
24518 v.reset(OpRotateLeft16)
24519 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
24520 v0.AddArg(y)
24521 v.AddArg2(x, v0)
24522 return true
24523 }
24524
24525
24526
24527 for {
24528 x := v_0
24529 if v_1.Op != OpSub8 {
24530 break
24531 }
24532 y := v_1.Args[1]
24533 v_1_0 := v_1.Args[0]
24534 if v_1_0.Op != OpConst8 {
24535 break
24536 }
24537 c := auxIntToInt8(v_1_0.AuxInt)
24538 if !(c&15 == 0) {
24539 break
24540 }
24541 v.reset(OpRotateLeft16)
24542 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
24543 v0.AddArg(y)
24544 v.AddArg2(x, v0)
24545 return true
24546 }
24547
24548
24549
24550 for {
24551 x := v_0
24552 if v_1.Op != OpConst64 {
24553 break
24554 }
24555 t := v_1.Type
24556 c := auxIntToInt64(v_1.AuxInt)
24557 if !(config.PtrSize == 4) {
24558 break
24559 }
24560 v.reset(OpRotateLeft16)
24561 v0 := b.NewValue0(v.Pos, OpConst32, t)
24562 v0.AuxInt = int32ToAuxInt(int32(c))
24563 v.AddArg2(x, v0)
24564 return true
24565 }
24566
24567
24568
24569 for {
24570 if v_0.Op != OpRotateLeft16 {
24571 break
24572 }
24573 c := v_0.Args[1]
24574 x := v_0.Args[0]
24575 d := v_1
24576 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
24577 break
24578 }
24579 v.reset(OpRotateLeft16)
24580 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
24581 v0.AddArg2(c, d)
24582 v.AddArg2(x, v0)
24583 return true
24584 }
24585
24586
24587
24588 for {
24589 if v_0.Op != OpRotateLeft16 {
24590 break
24591 }
24592 c := v_0.Args[1]
24593 x := v_0.Args[0]
24594 d := v_1
24595 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
24596 break
24597 }
24598 v.reset(OpRotateLeft16)
24599 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
24600 v0.AddArg2(c, d)
24601 v.AddArg2(x, v0)
24602 return true
24603 }
24604
24605
24606
24607 for {
24608 if v_0.Op != OpRotateLeft16 {
24609 break
24610 }
24611 c := v_0.Args[1]
24612 x := v_0.Args[0]
24613 d := v_1
24614 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
24615 break
24616 }
24617 v.reset(OpRotateLeft16)
24618 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
24619 v0.AddArg2(c, d)
24620 v.AddArg2(x, v0)
24621 return true
24622 }
24623
24624
24625
24626 for {
24627 if v_0.Op != OpRotateLeft16 {
24628 break
24629 }
24630 c := v_0.Args[1]
24631 x := v_0.Args[0]
24632 d := v_1
24633 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
24634 break
24635 }
24636 v.reset(OpRotateLeft16)
24637 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
24638 v0.AddArg2(c, d)
24639 v.AddArg2(x, v0)
24640 return true
24641 }
24642 return false
24643 }
24644 func rewriteValuegeneric_OpRotateLeft32(v *Value) bool {
24645 v_1 := v.Args[1]
24646 v_0 := v.Args[0]
24647 b := v.Block
24648 config := b.Func.Config
24649
24650
24651
24652 for {
24653 x := v_0
24654 if v_1.Op != OpConst32 {
24655 break
24656 }
24657 c := auxIntToInt32(v_1.AuxInt)
24658 if !(c%32 == 0) {
24659 break
24660 }
24661 v.copyOf(x)
24662 return true
24663 }
24664
24665
24666
24667 for {
24668 x := v_0
24669 if v_1.Op != OpAnd64 {
24670 break
24671 }
24672 _ = v_1.Args[1]
24673 v_1_0 := v_1.Args[0]
24674 v_1_1 := v_1.Args[1]
24675 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24676 y := v_1_0
24677 if v_1_1.Op != OpConst64 {
24678 continue
24679 }
24680 c := auxIntToInt64(v_1_1.AuxInt)
24681 if !(c&31 == 31) {
24682 continue
24683 }
24684 v.reset(OpRotateLeft32)
24685 v.AddArg2(x, y)
24686 return true
24687 }
24688 break
24689 }
24690
24691
24692
24693 for {
24694 x := v_0
24695 if v_1.Op != OpAnd32 {
24696 break
24697 }
24698 _ = v_1.Args[1]
24699 v_1_0 := v_1.Args[0]
24700 v_1_1 := v_1.Args[1]
24701 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24702 y := v_1_0
24703 if v_1_1.Op != OpConst32 {
24704 continue
24705 }
24706 c := auxIntToInt32(v_1_1.AuxInt)
24707 if !(c&31 == 31) {
24708 continue
24709 }
24710 v.reset(OpRotateLeft32)
24711 v.AddArg2(x, y)
24712 return true
24713 }
24714 break
24715 }
24716
24717
24718
24719 for {
24720 x := v_0
24721 if v_1.Op != OpAnd16 {
24722 break
24723 }
24724 _ = v_1.Args[1]
24725 v_1_0 := v_1.Args[0]
24726 v_1_1 := v_1.Args[1]
24727 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24728 y := v_1_0
24729 if v_1_1.Op != OpConst16 {
24730 continue
24731 }
24732 c := auxIntToInt16(v_1_1.AuxInt)
24733 if !(c&31 == 31) {
24734 continue
24735 }
24736 v.reset(OpRotateLeft32)
24737 v.AddArg2(x, y)
24738 return true
24739 }
24740 break
24741 }
24742
24743
24744
24745 for {
24746 x := v_0
24747 if v_1.Op != OpAnd8 {
24748 break
24749 }
24750 _ = v_1.Args[1]
24751 v_1_0 := v_1.Args[0]
24752 v_1_1 := v_1.Args[1]
24753 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24754 y := v_1_0
24755 if v_1_1.Op != OpConst8 {
24756 continue
24757 }
24758 c := auxIntToInt8(v_1_1.AuxInt)
24759 if !(c&31 == 31) {
24760 continue
24761 }
24762 v.reset(OpRotateLeft32)
24763 v.AddArg2(x, y)
24764 return true
24765 }
24766 break
24767 }
24768
24769
24770
24771 for {
24772 x := v_0
24773 if v_1.Op != OpNeg64 {
24774 break
24775 }
24776 v_1_0 := v_1.Args[0]
24777 if v_1_0.Op != OpAnd64 {
24778 break
24779 }
24780 _ = v_1_0.Args[1]
24781 v_1_0_0 := v_1_0.Args[0]
24782 v_1_0_1 := v_1_0.Args[1]
24783 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
24784 y := v_1_0_0
24785 if v_1_0_1.Op != OpConst64 {
24786 continue
24787 }
24788 c := auxIntToInt64(v_1_0_1.AuxInt)
24789 if !(c&31 == 31) {
24790 continue
24791 }
24792 v.reset(OpRotateLeft32)
24793 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
24794 v0.AddArg(y)
24795 v.AddArg2(x, v0)
24796 return true
24797 }
24798 break
24799 }
24800
24801
24802
24803 for {
24804 x := v_0
24805 if v_1.Op != OpNeg32 {
24806 break
24807 }
24808 v_1_0 := v_1.Args[0]
24809 if v_1_0.Op != OpAnd32 {
24810 break
24811 }
24812 _ = v_1_0.Args[1]
24813 v_1_0_0 := v_1_0.Args[0]
24814 v_1_0_1 := v_1_0.Args[1]
24815 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
24816 y := v_1_0_0
24817 if v_1_0_1.Op != OpConst32 {
24818 continue
24819 }
24820 c := auxIntToInt32(v_1_0_1.AuxInt)
24821 if !(c&31 == 31) {
24822 continue
24823 }
24824 v.reset(OpRotateLeft32)
24825 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
24826 v0.AddArg(y)
24827 v.AddArg2(x, v0)
24828 return true
24829 }
24830 break
24831 }
24832
24833
24834
24835 for {
24836 x := v_0
24837 if v_1.Op != OpNeg16 {
24838 break
24839 }
24840 v_1_0 := v_1.Args[0]
24841 if v_1_0.Op != OpAnd16 {
24842 break
24843 }
24844 _ = v_1_0.Args[1]
24845 v_1_0_0 := v_1_0.Args[0]
24846 v_1_0_1 := v_1_0.Args[1]
24847 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
24848 y := v_1_0_0
24849 if v_1_0_1.Op != OpConst16 {
24850 continue
24851 }
24852 c := auxIntToInt16(v_1_0_1.AuxInt)
24853 if !(c&31 == 31) {
24854 continue
24855 }
24856 v.reset(OpRotateLeft32)
24857 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
24858 v0.AddArg(y)
24859 v.AddArg2(x, v0)
24860 return true
24861 }
24862 break
24863 }
24864
24865
24866
24867 for {
24868 x := v_0
24869 if v_1.Op != OpNeg8 {
24870 break
24871 }
24872 v_1_0 := v_1.Args[0]
24873 if v_1_0.Op != OpAnd8 {
24874 break
24875 }
24876 _ = v_1_0.Args[1]
24877 v_1_0_0 := v_1_0.Args[0]
24878 v_1_0_1 := v_1_0.Args[1]
24879 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
24880 y := v_1_0_0
24881 if v_1_0_1.Op != OpConst8 {
24882 continue
24883 }
24884 c := auxIntToInt8(v_1_0_1.AuxInt)
24885 if !(c&31 == 31) {
24886 continue
24887 }
24888 v.reset(OpRotateLeft32)
24889 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
24890 v0.AddArg(y)
24891 v.AddArg2(x, v0)
24892 return true
24893 }
24894 break
24895 }
24896
24897
24898
24899 for {
24900 x := v_0
24901 if v_1.Op != OpAdd64 {
24902 break
24903 }
24904 _ = v_1.Args[1]
24905 v_1_0 := v_1.Args[0]
24906 v_1_1 := v_1.Args[1]
24907 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24908 y := v_1_0
24909 if v_1_1.Op != OpConst64 {
24910 continue
24911 }
24912 c := auxIntToInt64(v_1_1.AuxInt)
24913 if !(c&31 == 0) {
24914 continue
24915 }
24916 v.reset(OpRotateLeft32)
24917 v.AddArg2(x, y)
24918 return true
24919 }
24920 break
24921 }
24922
24923
24924
24925 for {
24926 x := v_0
24927 if v_1.Op != OpAdd32 {
24928 break
24929 }
24930 _ = v_1.Args[1]
24931 v_1_0 := v_1.Args[0]
24932 v_1_1 := v_1.Args[1]
24933 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24934 y := v_1_0
24935 if v_1_1.Op != OpConst32 {
24936 continue
24937 }
24938 c := auxIntToInt32(v_1_1.AuxInt)
24939 if !(c&31 == 0) {
24940 continue
24941 }
24942 v.reset(OpRotateLeft32)
24943 v.AddArg2(x, y)
24944 return true
24945 }
24946 break
24947 }
24948
24949
24950
24951 for {
24952 x := v_0
24953 if v_1.Op != OpAdd16 {
24954 break
24955 }
24956 _ = v_1.Args[1]
24957 v_1_0 := v_1.Args[0]
24958 v_1_1 := v_1.Args[1]
24959 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24960 y := v_1_0
24961 if v_1_1.Op != OpConst16 {
24962 continue
24963 }
24964 c := auxIntToInt16(v_1_1.AuxInt)
24965 if !(c&31 == 0) {
24966 continue
24967 }
24968 v.reset(OpRotateLeft32)
24969 v.AddArg2(x, y)
24970 return true
24971 }
24972 break
24973 }
24974
24975
24976
24977 for {
24978 x := v_0
24979 if v_1.Op != OpAdd8 {
24980 break
24981 }
24982 _ = v_1.Args[1]
24983 v_1_0 := v_1.Args[0]
24984 v_1_1 := v_1.Args[1]
24985 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
24986 y := v_1_0
24987 if v_1_1.Op != OpConst8 {
24988 continue
24989 }
24990 c := auxIntToInt8(v_1_1.AuxInt)
24991 if !(c&31 == 0) {
24992 continue
24993 }
24994 v.reset(OpRotateLeft32)
24995 v.AddArg2(x, y)
24996 return true
24997 }
24998 break
24999 }
25000
25001
25002
25003 for {
25004 x := v_0
25005 if v_1.Op != OpSub64 {
25006 break
25007 }
25008 y := v_1.Args[1]
25009 v_1_0 := v_1.Args[0]
25010 if v_1_0.Op != OpConst64 {
25011 break
25012 }
25013 c := auxIntToInt64(v_1_0.AuxInt)
25014 if !(c&31 == 0) {
25015 break
25016 }
25017 v.reset(OpRotateLeft32)
25018 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
25019 v0.AddArg(y)
25020 v.AddArg2(x, v0)
25021 return true
25022 }
25023
25024
25025
25026 for {
25027 x := v_0
25028 if v_1.Op != OpSub32 {
25029 break
25030 }
25031 y := v_1.Args[1]
25032 v_1_0 := v_1.Args[0]
25033 if v_1_0.Op != OpConst32 {
25034 break
25035 }
25036 c := auxIntToInt32(v_1_0.AuxInt)
25037 if !(c&31 == 0) {
25038 break
25039 }
25040 v.reset(OpRotateLeft32)
25041 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
25042 v0.AddArg(y)
25043 v.AddArg2(x, v0)
25044 return true
25045 }
25046
25047
25048
25049 for {
25050 x := v_0
25051 if v_1.Op != OpSub16 {
25052 break
25053 }
25054 y := v_1.Args[1]
25055 v_1_0 := v_1.Args[0]
25056 if v_1_0.Op != OpConst16 {
25057 break
25058 }
25059 c := auxIntToInt16(v_1_0.AuxInt)
25060 if !(c&31 == 0) {
25061 break
25062 }
25063 v.reset(OpRotateLeft32)
25064 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
25065 v0.AddArg(y)
25066 v.AddArg2(x, v0)
25067 return true
25068 }
25069
25070
25071
25072 for {
25073 x := v_0
25074 if v_1.Op != OpSub8 {
25075 break
25076 }
25077 y := v_1.Args[1]
25078 v_1_0 := v_1.Args[0]
25079 if v_1_0.Op != OpConst8 {
25080 break
25081 }
25082 c := auxIntToInt8(v_1_0.AuxInt)
25083 if !(c&31 == 0) {
25084 break
25085 }
25086 v.reset(OpRotateLeft32)
25087 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
25088 v0.AddArg(y)
25089 v.AddArg2(x, v0)
25090 return true
25091 }
25092
25093
25094
25095 for {
25096 x := v_0
25097 if v_1.Op != OpConst64 {
25098 break
25099 }
25100 t := v_1.Type
25101 c := auxIntToInt64(v_1.AuxInt)
25102 if !(config.PtrSize == 4) {
25103 break
25104 }
25105 v.reset(OpRotateLeft32)
25106 v0 := b.NewValue0(v.Pos, OpConst32, t)
25107 v0.AuxInt = int32ToAuxInt(int32(c))
25108 v.AddArg2(x, v0)
25109 return true
25110 }
25111
25112
25113
25114 for {
25115 if v_0.Op != OpRotateLeft32 {
25116 break
25117 }
25118 c := v_0.Args[1]
25119 x := v_0.Args[0]
25120 d := v_1
25121 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
25122 break
25123 }
25124 v.reset(OpRotateLeft32)
25125 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
25126 v0.AddArg2(c, d)
25127 v.AddArg2(x, v0)
25128 return true
25129 }
25130
25131
25132
25133 for {
25134 if v_0.Op != OpRotateLeft32 {
25135 break
25136 }
25137 c := v_0.Args[1]
25138 x := v_0.Args[0]
25139 d := v_1
25140 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
25141 break
25142 }
25143 v.reset(OpRotateLeft32)
25144 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
25145 v0.AddArg2(c, d)
25146 v.AddArg2(x, v0)
25147 return true
25148 }
25149
25150
25151
25152 for {
25153 if v_0.Op != OpRotateLeft32 {
25154 break
25155 }
25156 c := v_0.Args[1]
25157 x := v_0.Args[0]
25158 d := v_1
25159 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
25160 break
25161 }
25162 v.reset(OpRotateLeft32)
25163 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
25164 v0.AddArg2(c, d)
25165 v.AddArg2(x, v0)
25166 return true
25167 }
25168
25169
25170
25171 for {
25172 if v_0.Op != OpRotateLeft32 {
25173 break
25174 }
25175 c := v_0.Args[1]
25176 x := v_0.Args[0]
25177 d := v_1
25178 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
25179 break
25180 }
25181 v.reset(OpRotateLeft32)
25182 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
25183 v0.AddArg2(c, d)
25184 v.AddArg2(x, v0)
25185 return true
25186 }
25187 return false
25188 }
25189 func rewriteValuegeneric_OpRotateLeft64(v *Value) bool {
25190 v_1 := v.Args[1]
25191 v_0 := v.Args[0]
25192 b := v.Block
25193 config := b.Func.Config
25194
25195
25196
25197 for {
25198 x := v_0
25199 if v_1.Op != OpConst64 {
25200 break
25201 }
25202 c := auxIntToInt64(v_1.AuxInt)
25203 if !(c%64 == 0) {
25204 break
25205 }
25206 v.copyOf(x)
25207 return true
25208 }
25209
25210
25211
25212 for {
25213 x := v_0
25214 if v_1.Op != OpAnd64 {
25215 break
25216 }
25217 _ = v_1.Args[1]
25218 v_1_0 := v_1.Args[0]
25219 v_1_1 := v_1.Args[1]
25220 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25221 y := v_1_0
25222 if v_1_1.Op != OpConst64 {
25223 continue
25224 }
25225 c := auxIntToInt64(v_1_1.AuxInt)
25226 if !(c&63 == 63) {
25227 continue
25228 }
25229 v.reset(OpRotateLeft64)
25230 v.AddArg2(x, y)
25231 return true
25232 }
25233 break
25234 }
25235
25236
25237
25238 for {
25239 x := v_0
25240 if v_1.Op != OpAnd32 {
25241 break
25242 }
25243 _ = v_1.Args[1]
25244 v_1_0 := v_1.Args[0]
25245 v_1_1 := v_1.Args[1]
25246 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25247 y := v_1_0
25248 if v_1_1.Op != OpConst32 {
25249 continue
25250 }
25251 c := auxIntToInt32(v_1_1.AuxInt)
25252 if !(c&63 == 63) {
25253 continue
25254 }
25255 v.reset(OpRotateLeft64)
25256 v.AddArg2(x, y)
25257 return true
25258 }
25259 break
25260 }
25261
25262
25263
25264 for {
25265 x := v_0
25266 if v_1.Op != OpAnd16 {
25267 break
25268 }
25269 _ = v_1.Args[1]
25270 v_1_0 := v_1.Args[0]
25271 v_1_1 := v_1.Args[1]
25272 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25273 y := v_1_0
25274 if v_1_1.Op != OpConst16 {
25275 continue
25276 }
25277 c := auxIntToInt16(v_1_1.AuxInt)
25278 if !(c&63 == 63) {
25279 continue
25280 }
25281 v.reset(OpRotateLeft64)
25282 v.AddArg2(x, y)
25283 return true
25284 }
25285 break
25286 }
25287
25288
25289
25290 for {
25291 x := v_0
25292 if v_1.Op != OpAnd8 {
25293 break
25294 }
25295 _ = v_1.Args[1]
25296 v_1_0 := v_1.Args[0]
25297 v_1_1 := v_1.Args[1]
25298 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25299 y := v_1_0
25300 if v_1_1.Op != OpConst8 {
25301 continue
25302 }
25303 c := auxIntToInt8(v_1_1.AuxInt)
25304 if !(c&63 == 63) {
25305 continue
25306 }
25307 v.reset(OpRotateLeft64)
25308 v.AddArg2(x, y)
25309 return true
25310 }
25311 break
25312 }
25313
25314
25315
25316 for {
25317 x := v_0
25318 if v_1.Op != OpNeg64 {
25319 break
25320 }
25321 v_1_0 := v_1.Args[0]
25322 if v_1_0.Op != OpAnd64 {
25323 break
25324 }
25325 _ = v_1_0.Args[1]
25326 v_1_0_0 := v_1_0.Args[0]
25327 v_1_0_1 := v_1_0.Args[1]
25328 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25329 y := v_1_0_0
25330 if v_1_0_1.Op != OpConst64 {
25331 continue
25332 }
25333 c := auxIntToInt64(v_1_0_1.AuxInt)
25334 if !(c&63 == 63) {
25335 continue
25336 }
25337 v.reset(OpRotateLeft64)
25338 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
25339 v0.AddArg(y)
25340 v.AddArg2(x, v0)
25341 return true
25342 }
25343 break
25344 }
25345
25346
25347
25348 for {
25349 x := v_0
25350 if v_1.Op != OpNeg32 {
25351 break
25352 }
25353 v_1_0 := v_1.Args[0]
25354 if v_1_0.Op != OpAnd32 {
25355 break
25356 }
25357 _ = v_1_0.Args[1]
25358 v_1_0_0 := v_1_0.Args[0]
25359 v_1_0_1 := v_1_0.Args[1]
25360 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25361 y := v_1_0_0
25362 if v_1_0_1.Op != OpConst32 {
25363 continue
25364 }
25365 c := auxIntToInt32(v_1_0_1.AuxInt)
25366 if !(c&63 == 63) {
25367 continue
25368 }
25369 v.reset(OpRotateLeft64)
25370 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
25371 v0.AddArg(y)
25372 v.AddArg2(x, v0)
25373 return true
25374 }
25375 break
25376 }
25377
25378
25379
25380 for {
25381 x := v_0
25382 if v_1.Op != OpNeg16 {
25383 break
25384 }
25385 v_1_0 := v_1.Args[0]
25386 if v_1_0.Op != OpAnd16 {
25387 break
25388 }
25389 _ = v_1_0.Args[1]
25390 v_1_0_0 := v_1_0.Args[0]
25391 v_1_0_1 := v_1_0.Args[1]
25392 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25393 y := v_1_0_0
25394 if v_1_0_1.Op != OpConst16 {
25395 continue
25396 }
25397 c := auxIntToInt16(v_1_0_1.AuxInt)
25398 if !(c&63 == 63) {
25399 continue
25400 }
25401 v.reset(OpRotateLeft64)
25402 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
25403 v0.AddArg(y)
25404 v.AddArg2(x, v0)
25405 return true
25406 }
25407 break
25408 }
25409
25410
25411
25412 for {
25413 x := v_0
25414 if v_1.Op != OpNeg8 {
25415 break
25416 }
25417 v_1_0 := v_1.Args[0]
25418 if v_1_0.Op != OpAnd8 {
25419 break
25420 }
25421 _ = v_1_0.Args[1]
25422 v_1_0_0 := v_1_0.Args[0]
25423 v_1_0_1 := v_1_0.Args[1]
25424 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25425 y := v_1_0_0
25426 if v_1_0_1.Op != OpConst8 {
25427 continue
25428 }
25429 c := auxIntToInt8(v_1_0_1.AuxInt)
25430 if !(c&63 == 63) {
25431 continue
25432 }
25433 v.reset(OpRotateLeft64)
25434 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
25435 v0.AddArg(y)
25436 v.AddArg2(x, v0)
25437 return true
25438 }
25439 break
25440 }
25441
25442
25443
25444 for {
25445 x := v_0
25446 if v_1.Op != OpAdd64 {
25447 break
25448 }
25449 _ = v_1.Args[1]
25450 v_1_0 := v_1.Args[0]
25451 v_1_1 := v_1.Args[1]
25452 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25453 y := v_1_0
25454 if v_1_1.Op != OpConst64 {
25455 continue
25456 }
25457 c := auxIntToInt64(v_1_1.AuxInt)
25458 if !(c&63 == 0) {
25459 continue
25460 }
25461 v.reset(OpRotateLeft64)
25462 v.AddArg2(x, y)
25463 return true
25464 }
25465 break
25466 }
25467
25468
25469
25470 for {
25471 x := v_0
25472 if v_1.Op != OpAdd32 {
25473 break
25474 }
25475 _ = v_1.Args[1]
25476 v_1_0 := v_1.Args[0]
25477 v_1_1 := v_1.Args[1]
25478 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25479 y := v_1_0
25480 if v_1_1.Op != OpConst32 {
25481 continue
25482 }
25483 c := auxIntToInt32(v_1_1.AuxInt)
25484 if !(c&63 == 0) {
25485 continue
25486 }
25487 v.reset(OpRotateLeft64)
25488 v.AddArg2(x, y)
25489 return true
25490 }
25491 break
25492 }
25493
25494
25495
25496 for {
25497 x := v_0
25498 if v_1.Op != OpAdd16 {
25499 break
25500 }
25501 _ = v_1.Args[1]
25502 v_1_0 := v_1.Args[0]
25503 v_1_1 := v_1.Args[1]
25504 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25505 y := v_1_0
25506 if v_1_1.Op != OpConst16 {
25507 continue
25508 }
25509 c := auxIntToInt16(v_1_1.AuxInt)
25510 if !(c&63 == 0) {
25511 continue
25512 }
25513 v.reset(OpRotateLeft64)
25514 v.AddArg2(x, y)
25515 return true
25516 }
25517 break
25518 }
25519
25520
25521
25522 for {
25523 x := v_0
25524 if v_1.Op != OpAdd8 {
25525 break
25526 }
25527 _ = v_1.Args[1]
25528 v_1_0 := v_1.Args[0]
25529 v_1_1 := v_1.Args[1]
25530 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25531 y := v_1_0
25532 if v_1_1.Op != OpConst8 {
25533 continue
25534 }
25535 c := auxIntToInt8(v_1_1.AuxInt)
25536 if !(c&63 == 0) {
25537 continue
25538 }
25539 v.reset(OpRotateLeft64)
25540 v.AddArg2(x, y)
25541 return true
25542 }
25543 break
25544 }
25545
25546
25547
25548 for {
25549 x := v_0
25550 if v_1.Op != OpSub64 {
25551 break
25552 }
25553 y := v_1.Args[1]
25554 v_1_0 := v_1.Args[0]
25555 if v_1_0.Op != OpConst64 {
25556 break
25557 }
25558 c := auxIntToInt64(v_1_0.AuxInt)
25559 if !(c&63 == 0) {
25560 break
25561 }
25562 v.reset(OpRotateLeft64)
25563 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
25564 v0.AddArg(y)
25565 v.AddArg2(x, v0)
25566 return true
25567 }
25568
25569
25570
25571 for {
25572 x := v_0
25573 if v_1.Op != OpSub32 {
25574 break
25575 }
25576 y := v_1.Args[1]
25577 v_1_0 := v_1.Args[0]
25578 if v_1_0.Op != OpConst32 {
25579 break
25580 }
25581 c := auxIntToInt32(v_1_0.AuxInt)
25582 if !(c&63 == 0) {
25583 break
25584 }
25585 v.reset(OpRotateLeft64)
25586 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
25587 v0.AddArg(y)
25588 v.AddArg2(x, v0)
25589 return true
25590 }
25591
25592
25593
25594 for {
25595 x := v_0
25596 if v_1.Op != OpSub16 {
25597 break
25598 }
25599 y := v_1.Args[1]
25600 v_1_0 := v_1.Args[0]
25601 if v_1_0.Op != OpConst16 {
25602 break
25603 }
25604 c := auxIntToInt16(v_1_0.AuxInt)
25605 if !(c&63 == 0) {
25606 break
25607 }
25608 v.reset(OpRotateLeft64)
25609 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
25610 v0.AddArg(y)
25611 v.AddArg2(x, v0)
25612 return true
25613 }
25614
25615
25616
25617 for {
25618 x := v_0
25619 if v_1.Op != OpSub8 {
25620 break
25621 }
25622 y := v_1.Args[1]
25623 v_1_0 := v_1.Args[0]
25624 if v_1_0.Op != OpConst8 {
25625 break
25626 }
25627 c := auxIntToInt8(v_1_0.AuxInt)
25628 if !(c&63 == 0) {
25629 break
25630 }
25631 v.reset(OpRotateLeft64)
25632 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
25633 v0.AddArg(y)
25634 v.AddArg2(x, v0)
25635 return true
25636 }
25637
25638
25639
25640 for {
25641 x := v_0
25642 if v_1.Op != OpConst64 {
25643 break
25644 }
25645 t := v_1.Type
25646 c := auxIntToInt64(v_1.AuxInt)
25647 if !(config.PtrSize == 4) {
25648 break
25649 }
25650 v.reset(OpRotateLeft64)
25651 v0 := b.NewValue0(v.Pos, OpConst32, t)
25652 v0.AuxInt = int32ToAuxInt(int32(c))
25653 v.AddArg2(x, v0)
25654 return true
25655 }
25656
25657
25658
25659 for {
25660 if v_0.Op != OpRotateLeft64 {
25661 break
25662 }
25663 c := v_0.Args[1]
25664 x := v_0.Args[0]
25665 d := v_1
25666 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
25667 break
25668 }
25669 v.reset(OpRotateLeft64)
25670 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
25671 v0.AddArg2(c, d)
25672 v.AddArg2(x, v0)
25673 return true
25674 }
25675
25676
25677
25678 for {
25679 if v_0.Op != OpRotateLeft64 {
25680 break
25681 }
25682 c := v_0.Args[1]
25683 x := v_0.Args[0]
25684 d := v_1
25685 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
25686 break
25687 }
25688 v.reset(OpRotateLeft64)
25689 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
25690 v0.AddArg2(c, d)
25691 v.AddArg2(x, v0)
25692 return true
25693 }
25694
25695
25696
25697 for {
25698 if v_0.Op != OpRotateLeft64 {
25699 break
25700 }
25701 c := v_0.Args[1]
25702 x := v_0.Args[0]
25703 d := v_1
25704 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
25705 break
25706 }
25707 v.reset(OpRotateLeft64)
25708 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
25709 v0.AddArg2(c, d)
25710 v.AddArg2(x, v0)
25711 return true
25712 }
25713
25714
25715
25716 for {
25717 if v_0.Op != OpRotateLeft64 {
25718 break
25719 }
25720 c := v_0.Args[1]
25721 x := v_0.Args[0]
25722 d := v_1
25723 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
25724 break
25725 }
25726 v.reset(OpRotateLeft64)
25727 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
25728 v0.AddArg2(c, d)
25729 v.AddArg2(x, v0)
25730 return true
25731 }
25732 return false
25733 }
25734 func rewriteValuegeneric_OpRotateLeft8(v *Value) bool {
25735 v_1 := v.Args[1]
25736 v_0 := v.Args[0]
25737 b := v.Block
25738 config := b.Func.Config
25739
25740
25741
25742 for {
25743 x := v_0
25744 if v_1.Op != OpConst8 {
25745 break
25746 }
25747 c := auxIntToInt8(v_1.AuxInt)
25748 if !(c%8 == 0) {
25749 break
25750 }
25751 v.copyOf(x)
25752 return true
25753 }
25754
25755
25756
25757 for {
25758 x := v_0
25759 if v_1.Op != OpAnd64 {
25760 break
25761 }
25762 _ = v_1.Args[1]
25763 v_1_0 := v_1.Args[0]
25764 v_1_1 := v_1.Args[1]
25765 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25766 y := v_1_0
25767 if v_1_1.Op != OpConst64 {
25768 continue
25769 }
25770 c := auxIntToInt64(v_1_1.AuxInt)
25771 if !(c&7 == 7) {
25772 continue
25773 }
25774 v.reset(OpRotateLeft8)
25775 v.AddArg2(x, y)
25776 return true
25777 }
25778 break
25779 }
25780
25781
25782
25783 for {
25784 x := v_0
25785 if v_1.Op != OpAnd32 {
25786 break
25787 }
25788 _ = v_1.Args[1]
25789 v_1_0 := v_1.Args[0]
25790 v_1_1 := v_1.Args[1]
25791 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25792 y := v_1_0
25793 if v_1_1.Op != OpConst32 {
25794 continue
25795 }
25796 c := auxIntToInt32(v_1_1.AuxInt)
25797 if !(c&7 == 7) {
25798 continue
25799 }
25800 v.reset(OpRotateLeft8)
25801 v.AddArg2(x, y)
25802 return true
25803 }
25804 break
25805 }
25806
25807
25808
25809 for {
25810 x := v_0
25811 if v_1.Op != OpAnd16 {
25812 break
25813 }
25814 _ = v_1.Args[1]
25815 v_1_0 := v_1.Args[0]
25816 v_1_1 := v_1.Args[1]
25817 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25818 y := v_1_0
25819 if v_1_1.Op != OpConst16 {
25820 continue
25821 }
25822 c := auxIntToInt16(v_1_1.AuxInt)
25823 if !(c&7 == 7) {
25824 continue
25825 }
25826 v.reset(OpRotateLeft8)
25827 v.AddArg2(x, y)
25828 return true
25829 }
25830 break
25831 }
25832
25833
25834
25835 for {
25836 x := v_0
25837 if v_1.Op != OpAnd8 {
25838 break
25839 }
25840 _ = v_1.Args[1]
25841 v_1_0 := v_1.Args[0]
25842 v_1_1 := v_1.Args[1]
25843 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25844 y := v_1_0
25845 if v_1_1.Op != OpConst8 {
25846 continue
25847 }
25848 c := auxIntToInt8(v_1_1.AuxInt)
25849 if !(c&7 == 7) {
25850 continue
25851 }
25852 v.reset(OpRotateLeft8)
25853 v.AddArg2(x, y)
25854 return true
25855 }
25856 break
25857 }
25858
25859
25860
25861 for {
25862 x := v_0
25863 if v_1.Op != OpNeg64 {
25864 break
25865 }
25866 v_1_0 := v_1.Args[0]
25867 if v_1_0.Op != OpAnd64 {
25868 break
25869 }
25870 _ = v_1_0.Args[1]
25871 v_1_0_0 := v_1_0.Args[0]
25872 v_1_0_1 := v_1_0.Args[1]
25873 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25874 y := v_1_0_0
25875 if v_1_0_1.Op != OpConst64 {
25876 continue
25877 }
25878 c := auxIntToInt64(v_1_0_1.AuxInt)
25879 if !(c&7 == 7) {
25880 continue
25881 }
25882 v.reset(OpRotateLeft8)
25883 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
25884 v0.AddArg(y)
25885 v.AddArg2(x, v0)
25886 return true
25887 }
25888 break
25889 }
25890
25891
25892
25893 for {
25894 x := v_0
25895 if v_1.Op != OpNeg32 {
25896 break
25897 }
25898 v_1_0 := v_1.Args[0]
25899 if v_1_0.Op != OpAnd32 {
25900 break
25901 }
25902 _ = v_1_0.Args[1]
25903 v_1_0_0 := v_1_0.Args[0]
25904 v_1_0_1 := v_1_0.Args[1]
25905 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25906 y := v_1_0_0
25907 if v_1_0_1.Op != OpConst32 {
25908 continue
25909 }
25910 c := auxIntToInt32(v_1_0_1.AuxInt)
25911 if !(c&7 == 7) {
25912 continue
25913 }
25914 v.reset(OpRotateLeft8)
25915 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
25916 v0.AddArg(y)
25917 v.AddArg2(x, v0)
25918 return true
25919 }
25920 break
25921 }
25922
25923
25924
25925 for {
25926 x := v_0
25927 if v_1.Op != OpNeg16 {
25928 break
25929 }
25930 v_1_0 := v_1.Args[0]
25931 if v_1_0.Op != OpAnd16 {
25932 break
25933 }
25934 _ = v_1_0.Args[1]
25935 v_1_0_0 := v_1_0.Args[0]
25936 v_1_0_1 := v_1_0.Args[1]
25937 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25938 y := v_1_0_0
25939 if v_1_0_1.Op != OpConst16 {
25940 continue
25941 }
25942 c := auxIntToInt16(v_1_0_1.AuxInt)
25943 if !(c&7 == 7) {
25944 continue
25945 }
25946 v.reset(OpRotateLeft8)
25947 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
25948 v0.AddArg(y)
25949 v.AddArg2(x, v0)
25950 return true
25951 }
25952 break
25953 }
25954
25955
25956
25957 for {
25958 x := v_0
25959 if v_1.Op != OpNeg8 {
25960 break
25961 }
25962 v_1_0 := v_1.Args[0]
25963 if v_1_0.Op != OpAnd8 {
25964 break
25965 }
25966 _ = v_1_0.Args[1]
25967 v_1_0_0 := v_1_0.Args[0]
25968 v_1_0_1 := v_1_0.Args[1]
25969 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25970 y := v_1_0_0
25971 if v_1_0_1.Op != OpConst8 {
25972 continue
25973 }
25974 c := auxIntToInt8(v_1_0_1.AuxInt)
25975 if !(c&7 == 7) {
25976 continue
25977 }
25978 v.reset(OpRotateLeft8)
25979 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
25980 v0.AddArg(y)
25981 v.AddArg2(x, v0)
25982 return true
25983 }
25984 break
25985 }
25986
25987
25988
25989 for {
25990 x := v_0
25991 if v_1.Op != OpAdd64 {
25992 break
25993 }
25994 _ = v_1.Args[1]
25995 v_1_0 := v_1.Args[0]
25996 v_1_1 := v_1.Args[1]
25997 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25998 y := v_1_0
25999 if v_1_1.Op != OpConst64 {
26000 continue
26001 }
26002 c := auxIntToInt64(v_1_1.AuxInt)
26003 if !(c&7 == 0) {
26004 continue
26005 }
26006 v.reset(OpRotateLeft8)
26007 v.AddArg2(x, y)
26008 return true
26009 }
26010 break
26011 }
26012
26013
26014
26015 for {
26016 x := v_0
26017 if v_1.Op != OpAdd32 {
26018 break
26019 }
26020 _ = v_1.Args[1]
26021 v_1_0 := v_1.Args[0]
26022 v_1_1 := v_1.Args[1]
26023 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26024 y := v_1_0
26025 if v_1_1.Op != OpConst32 {
26026 continue
26027 }
26028 c := auxIntToInt32(v_1_1.AuxInt)
26029 if !(c&7 == 0) {
26030 continue
26031 }
26032 v.reset(OpRotateLeft8)
26033 v.AddArg2(x, y)
26034 return true
26035 }
26036 break
26037 }
26038
26039
26040
26041 for {
26042 x := v_0
26043 if v_1.Op != OpAdd16 {
26044 break
26045 }
26046 _ = v_1.Args[1]
26047 v_1_0 := v_1.Args[0]
26048 v_1_1 := v_1.Args[1]
26049 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26050 y := v_1_0
26051 if v_1_1.Op != OpConst16 {
26052 continue
26053 }
26054 c := auxIntToInt16(v_1_1.AuxInt)
26055 if !(c&7 == 0) {
26056 continue
26057 }
26058 v.reset(OpRotateLeft8)
26059 v.AddArg2(x, y)
26060 return true
26061 }
26062 break
26063 }
26064
26065
26066
26067 for {
26068 x := v_0
26069 if v_1.Op != OpAdd8 {
26070 break
26071 }
26072 _ = v_1.Args[1]
26073 v_1_0 := v_1.Args[0]
26074 v_1_1 := v_1.Args[1]
26075 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26076 y := v_1_0
26077 if v_1_1.Op != OpConst8 {
26078 continue
26079 }
26080 c := auxIntToInt8(v_1_1.AuxInt)
26081 if !(c&7 == 0) {
26082 continue
26083 }
26084 v.reset(OpRotateLeft8)
26085 v.AddArg2(x, y)
26086 return true
26087 }
26088 break
26089 }
26090
26091
26092
26093 for {
26094 x := v_0
26095 if v_1.Op != OpSub64 {
26096 break
26097 }
26098 y := v_1.Args[1]
26099 v_1_0 := v_1.Args[0]
26100 if v_1_0.Op != OpConst64 {
26101 break
26102 }
26103 c := auxIntToInt64(v_1_0.AuxInt)
26104 if !(c&7 == 0) {
26105 break
26106 }
26107 v.reset(OpRotateLeft8)
26108 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26109 v0.AddArg(y)
26110 v.AddArg2(x, v0)
26111 return true
26112 }
26113
26114
26115
26116 for {
26117 x := v_0
26118 if v_1.Op != OpSub32 {
26119 break
26120 }
26121 y := v_1.Args[1]
26122 v_1_0 := v_1.Args[0]
26123 if v_1_0.Op != OpConst32 {
26124 break
26125 }
26126 c := auxIntToInt32(v_1_0.AuxInt)
26127 if !(c&7 == 0) {
26128 break
26129 }
26130 v.reset(OpRotateLeft8)
26131 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26132 v0.AddArg(y)
26133 v.AddArg2(x, v0)
26134 return true
26135 }
26136
26137
26138
26139 for {
26140 x := v_0
26141 if v_1.Op != OpSub16 {
26142 break
26143 }
26144 y := v_1.Args[1]
26145 v_1_0 := v_1.Args[0]
26146 if v_1_0.Op != OpConst16 {
26147 break
26148 }
26149 c := auxIntToInt16(v_1_0.AuxInt)
26150 if !(c&7 == 0) {
26151 break
26152 }
26153 v.reset(OpRotateLeft8)
26154 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
26155 v0.AddArg(y)
26156 v.AddArg2(x, v0)
26157 return true
26158 }
26159
26160
26161
26162 for {
26163 x := v_0
26164 if v_1.Op != OpSub8 {
26165 break
26166 }
26167 y := v_1.Args[1]
26168 v_1_0 := v_1.Args[0]
26169 if v_1_0.Op != OpConst8 {
26170 break
26171 }
26172 c := auxIntToInt8(v_1_0.AuxInt)
26173 if !(c&7 == 0) {
26174 break
26175 }
26176 v.reset(OpRotateLeft8)
26177 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
26178 v0.AddArg(y)
26179 v.AddArg2(x, v0)
26180 return true
26181 }
26182
26183
26184
26185 for {
26186 x := v_0
26187 if v_1.Op != OpConst64 {
26188 break
26189 }
26190 t := v_1.Type
26191 c := auxIntToInt64(v_1.AuxInt)
26192 if !(config.PtrSize == 4) {
26193 break
26194 }
26195 v.reset(OpRotateLeft8)
26196 v0 := b.NewValue0(v.Pos, OpConst32, t)
26197 v0.AuxInt = int32ToAuxInt(int32(c))
26198 v.AddArg2(x, v0)
26199 return true
26200 }
26201
26202
26203
26204 for {
26205 if v_0.Op != OpRotateLeft8 {
26206 break
26207 }
26208 c := v_0.Args[1]
26209 x := v_0.Args[0]
26210 d := v_1
26211 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
26212 break
26213 }
26214 v.reset(OpRotateLeft8)
26215 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
26216 v0.AddArg2(c, d)
26217 v.AddArg2(x, v0)
26218 return true
26219 }
26220
26221
26222
26223 for {
26224 if v_0.Op != OpRotateLeft8 {
26225 break
26226 }
26227 c := v_0.Args[1]
26228 x := v_0.Args[0]
26229 d := v_1
26230 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
26231 break
26232 }
26233 v.reset(OpRotateLeft8)
26234 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
26235 v0.AddArg2(c, d)
26236 v.AddArg2(x, v0)
26237 return true
26238 }
26239
26240
26241
26242 for {
26243 if v_0.Op != OpRotateLeft8 {
26244 break
26245 }
26246 c := v_0.Args[1]
26247 x := v_0.Args[0]
26248 d := v_1
26249 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
26250 break
26251 }
26252 v.reset(OpRotateLeft8)
26253 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
26254 v0.AddArg2(c, d)
26255 v.AddArg2(x, v0)
26256 return true
26257 }
26258
26259
26260
26261 for {
26262 if v_0.Op != OpRotateLeft8 {
26263 break
26264 }
26265 c := v_0.Args[1]
26266 x := v_0.Args[0]
26267 d := v_1
26268 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
26269 break
26270 }
26271 v.reset(OpRotateLeft8)
26272 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
26273 v0.AddArg2(c, d)
26274 v.AddArg2(x, v0)
26275 return true
26276 }
26277 return false
26278 }
26279 func rewriteValuegeneric_OpRound32F(v *Value) bool {
26280 v_0 := v.Args[0]
26281
26282
26283 for {
26284 x := v_0
26285 if x.Op != OpConst32F {
26286 break
26287 }
26288 v.copyOf(x)
26289 return true
26290 }
26291 return false
26292 }
26293 func rewriteValuegeneric_OpRound64F(v *Value) bool {
26294 v_0 := v.Args[0]
26295
26296
26297 for {
26298 x := v_0
26299 if x.Op != OpConst64F {
26300 break
26301 }
26302 v.copyOf(x)
26303 return true
26304 }
26305 return false
26306 }
26307 func rewriteValuegeneric_OpRoundToEven(v *Value) bool {
26308 v_0 := v.Args[0]
26309
26310
26311 for {
26312 if v_0.Op != OpConst64F {
26313 break
26314 }
26315 c := auxIntToFloat64(v_0.AuxInt)
26316 v.reset(OpConst64F)
26317 v.AuxInt = float64ToAuxInt(math.RoundToEven(c))
26318 return true
26319 }
26320 return false
26321 }
26322 func rewriteValuegeneric_OpRsh16Ux16(v *Value) bool {
26323 v_1 := v.Args[1]
26324 v_0 := v.Args[0]
26325 b := v.Block
26326
26327
26328 for {
26329 t := v.Type
26330 x := v_0
26331 if v_1.Op != OpConst16 {
26332 break
26333 }
26334 c := auxIntToInt16(v_1.AuxInt)
26335 v.reset(OpRsh16Ux64)
26336 v0 := b.NewValue0(v.Pos, OpConst64, t)
26337 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
26338 v.AddArg2(x, v0)
26339 return true
26340 }
26341
26342
26343 for {
26344 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
26345 break
26346 }
26347 v.reset(OpConst16)
26348 v.AuxInt = int16ToAuxInt(0)
26349 return true
26350 }
26351
26352
26353
26354 for {
26355 if auxIntToBool(v.AuxInt) != false {
26356 break
26357 }
26358 x := v_0
26359 con := v_1
26360 if con.Op != OpConst16 {
26361 break
26362 }
26363 c := auxIntToInt16(con.AuxInt)
26364 if !(0 < c && c < 16) {
26365 break
26366 }
26367 v.reset(OpRsh16Ux16)
26368 v.AuxInt = boolToAuxInt(true)
26369 v.AddArg2(x, con)
26370 return true
26371 }
26372 return false
26373 }
26374 func rewriteValuegeneric_OpRsh16Ux32(v *Value) bool {
26375 v_1 := v.Args[1]
26376 v_0 := v.Args[0]
26377 b := v.Block
26378
26379
26380 for {
26381 t := v.Type
26382 x := v_0
26383 if v_1.Op != OpConst32 {
26384 break
26385 }
26386 c := auxIntToInt32(v_1.AuxInt)
26387 v.reset(OpRsh16Ux64)
26388 v0 := b.NewValue0(v.Pos, OpConst64, t)
26389 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
26390 v.AddArg2(x, v0)
26391 return true
26392 }
26393
26394
26395 for {
26396 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
26397 break
26398 }
26399 v.reset(OpConst16)
26400 v.AuxInt = int16ToAuxInt(0)
26401 return true
26402 }
26403
26404
26405
26406 for {
26407 if auxIntToBool(v.AuxInt) != false {
26408 break
26409 }
26410 x := v_0
26411 con := v_1
26412 if con.Op != OpConst32 {
26413 break
26414 }
26415 c := auxIntToInt32(con.AuxInt)
26416 if !(0 < c && c < 16) {
26417 break
26418 }
26419 v.reset(OpRsh16Ux32)
26420 v.AuxInt = boolToAuxInt(true)
26421 v.AddArg2(x, con)
26422 return true
26423 }
26424 return false
26425 }
26426 func rewriteValuegeneric_OpRsh16Ux64(v *Value) bool {
26427 v_1 := v.Args[1]
26428 v_0 := v.Args[0]
26429 b := v.Block
26430 typ := &b.Func.Config.Types
26431
26432
26433 for {
26434 if v_0.Op != OpConst16 {
26435 break
26436 }
26437 c := auxIntToInt16(v_0.AuxInt)
26438 if v_1.Op != OpConst64 {
26439 break
26440 }
26441 d := auxIntToInt64(v_1.AuxInt)
26442 v.reset(OpConst16)
26443 v.AuxInt = int16ToAuxInt(int16(uint16(c) >> uint64(d)))
26444 return true
26445 }
26446
26447
26448 for {
26449 x := v_0
26450 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
26451 break
26452 }
26453 v.copyOf(x)
26454 return true
26455 }
26456
26457
26458 for {
26459 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
26460 break
26461 }
26462 v.reset(OpConst16)
26463 v.AuxInt = int16ToAuxInt(0)
26464 return true
26465 }
26466
26467
26468
26469 for {
26470 if v_1.Op != OpConst64 {
26471 break
26472 }
26473 c := auxIntToInt64(v_1.AuxInt)
26474 if !(uint64(c) >= 16) {
26475 break
26476 }
26477 v.reset(OpConst16)
26478 v.AuxInt = int16ToAuxInt(0)
26479 return true
26480 }
26481
26482
26483
26484 for {
26485 t := v.Type
26486 if v_0.Op != OpRsh16Ux64 {
26487 break
26488 }
26489 _ = v_0.Args[1]
26490 x := v_0.Args[0]
26491 v_0_1 := v_0.Args[1]
26492 if v_0_1.Op != OpConst64 {
26493 break
26494 }
26495 c := auxIntToInt64(v_0_1.AuxInt)
26496 if v_1.Op != OpConst64 {
26497 break
26498 }
26499 d := auxIntToInt64(v_1.AuxInt)
26500 if !(!uaddOvf(c, d)) {
26501 break
26502 }
26503 v.reset(OpRsh16Ux64)
26504 v0 := b.NewValue0(v.Pos, OpConst64, t)
26505 v0.AuxInt = int64ToAuxInt(c + d)
26506 v.AddArg2(x, v0)
26507 return true
26508 }
26509
26510
26511 for {
26512 if v_0.Op != OpRsh16x64 {
26513 break
26514 }
26515 x := v_0.Args[0]
26516 if v_1.Op != OpConst64 {
26517 break
26518 }
26519 t := v_1.Type
26520 if auxIntToInt64(v_1.AuxInt) != 15 {
26521 break
26522 }
26523 v.reset(OpRsh16Ux64)
26524 v0 := b.NewValue0(v.Pos, OpConst64, t)
26525 v0.AuxInt = int64ToAuxInt(15)
26526 v.AddArg2(x, v0)
26527 return true
26528 }
26529
26530
26531
26532 for {
26533 i := v_0
26534 if i.Op != OpLsh16x64 {
26535 break
26536 }
26537 _ = i.Args[1]
26538 x := i.Args[0]
26539 i_1 := i.Args[1]
26540 if i_1.Op != OpConst64 {
26541 break
26542 }
26543 c := auxIntToInt64(i_1.AuxInt)
26544 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
26545 break
26546 }
26547 v.reset(OpAnd16)
26548 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
26549 v0.AuxInt = int16ToAuxInt(int16(^uint16(0) >> c))
26550 v.AddArg2(x, v0)
26551 return true
26552 }
26553
26554
26555
26556 for {
26557 if v_0.Op != OpLsh16x64 {
26558 break
26559 }
26560 _ = v_0.Args[1]
26561 v_0_0 := v_0.Args[0]
26562 if v_0_0.Op != OpRsh16Ux64 {
26563 break
26564 }
26565 _ = v_0_0.Args[1]
26566 x := v_0_0.Args[0]
26567 v_0_0_1 := v_0_0.Args[1]
26568 if v_0_0_1.Op != OpConst64 {
26569 break
26570 }
26571 c1 := auxIntToInt64(v_0_0_1.AuxInt)
26572 v_0_1 := v_0.Args[1]
26573 if v_0_1.Op != OpConst64 {
26574 break
26575 }
26576 c2 := auxIntToInt64(v_0_1.AuxInt)
26577 if v_1.Op != OpConst64 {
26578 break
26579 }
26580 c3 := auxIntToInt64(v_1.AuxInt)
26581 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
26582 break
26583 }
26584 v.reset(OpRsh16Ux64)
26585 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
26586 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
26587 v.AddArg2(x, v0)
26588 return true
26589 }
26590
26591
26592 for {
26593 if v_0.Op != OpLsh16x64 {
26594 break
26595 }
26596 _ = v_0.Args[1]
26597 x := v_0.Args[0]
26598 v_0_1 := v_0.Args[1]
26599 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 8 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 8 {
26600 break
26601 }
26602 v.reset(OpZeroExt8to16)
26603 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.UInt8)
26604 v0.AddArg(x)
26605 v.AddArg(v0)
26606 return true
26607 }
26608
26609
26610
26611 for {
26612 if auxIntToBool(v.AuxInt) != false {
26613 break
26614 }
26615 x := v_0
26616 con := v_1
26617 if con.Op != OpConst64 {
26618 break
26619 }
26620 c := auxIntToInt64(con.AuxInt)
26621 if !(0 < c && c < 16) {
26622 break
26623 }
26624 v.reset(OpRsh16Ux64)
26625 v.AuxInt = boolToAuxInt(true)
26626 v.AddArg2(x, con)
26627 return true
26628 }
26629 return false
26630 }
26631 func rewriteValuegeneric_OpRsh16Ux8(v *Value) bool {
26632 v_1 := v.Args[1]
26633 v_0 := v.Args[0]
26634 b := v.Block
26635
26636
26637 for {
26638 t := v.Type
26639 x := v_0
26640 if v_1.Op != OpConst8 {
26641 break
26642 }
26643 c := auxIntToInt8(v_1.AuxInt)
26644 v.reset(OpRsh16Ux64)
26645 v0 := b.NewValue0(v.Pos, OpConst64, t)
26646 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
26647 v.AddArg2(x, v0)
26648 return true
26649 }
26650
26651
26652 for {
26653 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
26654 break
26655 }
26656 v.reset(OpConst16)
26657 v.AuxInt = int16ToAuxInt(0)
26658 return true
26659 }
26660
26661
26662
26663 for {
26664 if auxIntToBool(v.AuxInt) != false {
26665 break
26666 }
26667 x := v_0
26668 con := v_1
26669 if con.Op != OpConst8 {
26670 break
26671 }
26672 c := auxIntToInt8(con.AuxInt)
26673 if !(0 < c && c < 16) {
26674 break
26675 }
26676 v.reset(OpRsh16Ux8)
26677 v.AuxInt = boolToAuxInt(true)
26678 v.AddArg2(x, con)
26679 return true
26680 }
26681 return false
26682 }
26683 func rewriteValuegeneric_OpRsh16x16(v *Value) bool {
26684 v_1 := v.Args[1]
26685 v_0 := v.Args[0]
26686 b := v.Block
26687
26688
26689 for {
26690 t := v.Type
26691 x := v_0
26692 if v_1.Op != OpConst16 {
26693 break
26694 }
26695 c := auxIntToInt16(v_1.AuxInt)
26696 v.reset(OpRsh16x64)
26697 v0 := b.NewValue0(v.Pos, OpConst64, t)
26698 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
26699 v.AddArg2(x, v0)
26700 return true
26701 }
26702
26703
26704 for {
26705 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
26706 break
26707 }
26708 v.reset(OpConst16)
26709 v.AuxInt = int16ToAuxInt(0)
26710 return true
26711 }
26712
26713
26714
26715 for {
26716 if auxIntToBool(v.AuxInt) != false {
26717 break
26718 }
26719 x := v_0
26720 con := v_1
26721 if con.Op != OpConst16 {
26722 break
26723 }
26724 c := auxIntToInt16(con.AuxInt)
26725 if !(0 < c && c < 16) {
26726 break
26727 }
26728 v.reset(OpRsh16x16)
26729 v.AuxInt = boolToAuxInt(true)
26730 v.AddArg2(x, con)
26731 return true
26732 }
26733 return false
26734 }
26735 func rewriteValuegeneric_OpRsh16x32(v *Value) bool {
26736 v_1 := v.Args[1]
26737 v_0 := v.Args[0]
26738 b := v.Block
26739
26740
26741 for {
26742 t := v.Type
26743 x := v_0
26744 if v_1.Op != OpConst32 {
26745 break
26746 }
26747 c := auxIntToInt32(v_1.AuxInt)
26748 v.reset(OpRsh16x64)
26749 v0 := b.NewValue0(v.Pos, OpConst64, t)
26750 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
26751 v.AddArg2(x, v0)
26752 return true
26753 }
26754
26755
26756 for {
26757 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
26758 break
26759 }
26760 v.reset(OpConst16)
26761 v.AuxInt = int16ToAuxInt(0)
26762 return true
26763 }
26764
26765
26766
26767 for {
26768 if auxIntToBool(v.AuxInt) != false {
26769 break
26770 }
26771 x := v_0
26772 con := v_1
26773 if con.Op != OpConst32 {
26774 break
26775 }
26776 c := auxIntToInt32(con.AuxInt)
26777 if !(0 < c && c < 16) {
26778 break
26779 }
26780 v.reset(OpRsh16x32)
26781 v.AuxInt = boolToAuxInt(true)
26782 v.AddArg2(x, con)
26783 return true
26784 }
26785 return false
26786 }
26787 func rewriteValuegeneric_OpRsh16x64(v *Value) bool {
26788 v_1 := v.Args[1]
26789 v_0 := v.Args[0]
26790 b := v.Block
26791 typ := &b.Func.Config.Types
26792
26793
26794 for {
26795 if v_0.Op != OpConst16 {
26796 break
26797 }
26798 c := auxIntToInt16(v_0.AuxInt)
26799 if v_1.Op != OpConst64 {
26800 break
26801 }
26802 d := auxIntToInt64(v_1.AuxInt)
26803 v.reset(OpConst16)
26804 v.AuxInt = int16ToAuxInt(c >> uint64(d))
26805 return true
26806 }
26807
26808
26809 for {
26810 x := v_0
26811 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
26812 break
26813 }
26814 v.copyOf(x)
26815 return true
26816 }
26817
26818
26819 for {
26820 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
26821 break
26822 }
26823 v.reset(OpConst16)
26824 v.AuxInt = int16ToAuxInt(0)
26825 return true
26826 }
26827
26828
26829
26830 for {
26831 t := v.Type
26832 if v_0.Op != OpRsh16x64 {
26833 break
26834 }
26835 _ = v_0.Args[1]
26836 x := v_0.Args[0]
26837 v_0_1 := v_0.Args[1]
26838 if v_0_1.Op != OpConst64 {
26839 break
26840 }
26841 c := auxIntToInt64(v_0_1.AuxInt)
26842 if v_1.Op != OpConst64 {
26843 break
26844 }
26845 d := auxIntToInt64(v_1.AuxInt)
26846 if !(!uaddOvf(c, d)) {
26847 break
26848 }
26849 v.reset(OpRsh16x64)
26850 v0 := b.NewValue0(v.Pos, OpConst64, t)
26851 v0.AuxInt = int64ToAuxInt(c + d)
26852 v.AddArg2(x, v0)
26853 return true
26854 }
26855
26856
26857 for {
26858 if v_0.Op != OpLsh16x64 {
26859 break
26860 }
26861 _ = v_0.Args[1]
26862 x := v_0.Args[0]
26863 v_0_1 := v_0.Args[1]
26864 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 8 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 8 {
26865 break
26866 }
26867 v.reset(OpSignExt8to16)
26868 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.Int8)
26869 v0.AddArg(x)
26870 v.AddArg(v0)
26871 return true
26872 }
26873
26874
26875
26876 for {
26877 if auxIntToBool(v.AuxInt) != false {
26878 break
26879 }
26880 x := v_0
26881 con := v_1
26882 if con.Op != OpConst64 {
26883 break
26884 }
26885 c := auxIntToInt64(con.AuxInt)
26886 if !(0 < c && c < 16) {
26887 break
26888 }
26889 v.reset(OpRsh16x64)
26890 v.AuxInt = boolToAuxInt(true)
26891 v.AddArg2(x, con)
26892 return true
26893 }
26894 return false
26895 }
26896 func rewriteValuegeneric_OpRsh16x8(v *Value) bool {
26897 v_1 := v.Args[1]
26898 v_0 := v.Args[0]
26899 b := v.Block
26900
26901
26902 for {
26903 t := v.Type
26904 x := v_0
26905 if v_1.Op != OpConst8 {
26906 break
26907 }
26908 c := auxIntToInt8(v_1.AuxInt)
26909 v.reset(OpRsh16x64)
26910 v0 := b.NewValue0(v.Pos, OpConst64, t)
26911 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
26912 v.AddArg2(x, v0)
26913 return true
26914 }
26915
26916
26917 for {
26918 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
26919 break
26920 }
26921 v.reset(OpConst16)
26922 v.AuxInt = int16ToAuxInt(0)
26923 return true
26924 }
26925
26926
26927
26928 for {
26929 if auxIntToBool(v.AuxInt) != false {
26930 break
26931 }
26932 x := v_0
26933 con := v_1
26934 if con.Op != OpConst8 {
26935 break
26936 }
26937 c := auxIntToInt8(con.AuxInt)
26938 if !(0 < c && c < 16) {
26939 break
26940 }
26941 v.reset(OpRsh16x8)
26942 v.AuxInt = boolToAuxInt(true)
26943 v.AddArg2(x, con)
26944 return true
26945 }
26946 return false
26947 }
26948 func rewriteValuegeneric_OpRsh32Ux16(v *Value) bool {
26949 v_1 := v.Args[1]
26950 v_0 := v.Args[0]
26951 b := v.Block
26952
26953
26954 for {
26955 t := v.Type
26956 x := v_0
26957 if v_1.Op != OpConst16 {
26958 break
26959 }
26960 c := auxIntToInt16(v_1.AuxInt)
26961 v.reset(OpRsh32Ux64)
26962 v0 := b.NewValue0(v.Pos, OpConst64, t)
26963 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
26964 v.AddArg2(x, v0)
26965 return true
26966 }
26967
26968
26969 for {
26970 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
26971 break
26972 }
26973 v.reset(OpConst32)
26974 v.AuxInt = int32ToAuxInt(0)
26975 return true
26976 }
26977
26978
26979
26980 for {
26981 if auxIntToBool(v.AuxInt) != false {
26982 break
26983 }
26984 x := v_0
26985 con := v_1
26986 if con.Op != OpConst16 {
26987 break
26988 }
26989 c := auxIntToInt16(con.AuxInt)
26990 if !(0 < c && c < 32) {
26991 break
26992 }
26993 v.reset(OpRsh32Ux16)
26994 v.AuxInt = boolToAuxInt(true)
26995 v.AddArg2(x, con)
26996 return true
26997 }
26998 return false
26999 }
27000 func rewriteValuegeneric_OpRsh32Ux32(v *Value) bool {
27001 v_1 := v.Args[1]
27002 v_0 := v.Args[0]
27003 b := v.Block
27004
27005
27006 for {
27007 t := v.Type
27008 x := v_0
27009 if v_1.Op != OpConst32 {
27010 break
27011 }
27012 c := auxIntToInt32(v_1.AuxInt)
27013 v.reset(OpRsh32Ux64)
27014 v0 := b.NewValue0(v.Pos, OpConst64, t)
27015 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
27016 v.AddArg2(x, v0)
27017 return true
27018 }
27019
27020
27021 for {
27022 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
27023 break
27024 }
27025 v.reset(OpConst32)
27026 v.AuxInt = int32ToAuxInt(0)
27027 return true
27028 }
27029
27030
27031
27032 for {
27033 if auxIntToBool(v.AuxInt) != false {
27034 break
27035 }
27036 x := v_0
27037 con := v_1
27038 if con.Op != OpConst32 {
27039 break
27040 }
27041 c := auxIntToInt32(con.AuxInt)
27042 if !(0 < c && c < 32) {
27043 break
27044 }
27045 v.reset(OpRsh32Ux32)
27046 v.AuxInt = boolToAuxInt(true)
27047 v.AddArg2(x, con)
27048 return true
27049 }
27050 return false
27051 }
27052 func rewriteValuegeneric_OpRsh32Ux64(v *Value) bool {
27053 v_1 := v.Args[1]
27054 v_0 := v.Args[0]
27055 b := v.Block
27056 typ := &b.Func.Config.Types
27057
27058
27059 for {
27060 if v_0.Op != OpConst32 {
27061 break
27062 }
27063 c := auxIntToInt32(v_0.AuxInt)
27064 if v_1.Op != OpConst64 {
27065 break
27066 }
27067 d := auxIntToInt64(v_1.AuxInt)
27068 v.reset(OpConst32)
27069 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
27070 return true
27071 }
27072
27073
27074 for {
27075 x := v_0
27076 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
27077 break
27078 }
27079 v.copyOf(x)
27080 return true
27081 }
27082
27083
27084 for {
27085 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
27086 break
27087 }
27088 v.reset(OpConst32)
27089 v.AuxInt = int32ToAuxInt(0)
27090 return true
27091 }
27092
27093
27094
27095 for {
27096 if v_1.Op != OpConst64 {
27097 break
27098 }
27099 c := auxIntToInt64(v_1.AuxInt)
27100 if !(uint64(c) >= 32) {
27101 break
27102 }
27103 v.reset(OpConst32)
27104 v.AuxInt = int32ToAuxInt(0)
27105 return true
27106 }
27107
27108
27109
27110 for {
27111 t := v.Type
27112 if v_0.Op != OpRsh32Ux64 {
27113 break
27114 }
27115 _ = v_0.Args[1]
27116 x := v_0.Args[0]
27117 v_0_1 := v_0.Args[1]
27118 if v_0_1.Op != OpConst64 {
27119 break
27120 }
27121 c := auxIntToInt64(v_0_1.AuxInt)
27122 if v_1.Op != OpConst64 {
27123 break
27124 }
27125 d := auxIntToInt64(v_1.AuxInt)
27126 if !(!uaddOvf(c, d)) {
27127 break
27128 }
27129 v.reset(OpRsh32Ux64)
27130 v0 := b.NewValue0(v.Pos, OpConst64, t)
27131 v0.AuxInt = int64ToAuxInt(c + d)
27132 v.AddArg2(x, v0)
27133 return true
27134 }
27135
27136
27137 for {
27138 if v_0.Op != OpRsh32x64 {
27139 break
27140 }
27141 x := v_0.Args[0]
27142 if v_1.Op != OpConst64 {
27143 break
27144 }
27145 t := v_1.Type
27146 if auxIntToInt64(v_1.AuxInt) != 31 {
27147 break
27148 }
27149 v.reset(OpRsh32Ux64)
27150 v0 := b.NewValue0(v.Pos, OpConst64, t)
27151 v0.AuxInt = int64ToAuxInt(31)
27152 v.AddArg2(x, v0)
27153 return true
27154 }
27155
27156
27157
27158 for {
27159 i := v_0
27160 if i.Op != OpLsh32x64 {
27161 break
27162 }
27163 _ = i.Args[1]
27164 x := i.Args[0]
27165 i_1 := i.Args[1]
27166 if i_1.Op != OpConst64 {
27167 break
27168 }
27169 c := auxIntToInt64(i_1.AuxInt)
27170 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
27171 break
27172 }
27173 v.reset(OpAnd32)
27174 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
27175 v0.AuxInt = int32ToAuxInt(int32(^uint32(0) >> c))
27176 v.AddArg2(x, v0)
27177 return true
27178 }
27179
27180
27181
27182 for {
27183 if v_0.Op != OpLsh32x64 {
27184 break
27185 }
27186 _ = v_0.Args[1]
27187 v_0_0 := v_0.Args[0]
27188 if v_0_0.Op != OpRsh32Ux64 {
27189 break
27190 }
27191 _ = v_0_0.Args[1]
27192 x := v_0_0.Args[0]
27193 v_0_0_1 := v_0_0.Args[1]
27194 if v_0_0_1.Op != OpConst64 {
27195 break
27196 }
27197 c1 := auxIntToInt64(v_0_0_1.AuxInt)
27198 v_0_1 := v_0.Args[1]
27199 if v_0_1.Op != OpConst64 {
27200 break
27201 }
27202 c2 := auxIntToInt64(v_0_1.AuxInt)
27203 if v_1.Op != OpConst64 {
27204 break
27205 }
27206 c3 := auxIntToInt64(v_1.AuxInt)
27207 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
27208 break
27209 }
27210 v.reset(OpRsh32Ux64)
27211 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
27212 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
27213 v.AddArg2(x, v0)
27214 return true
27215 }
27216
27217
27218 for {
27219 if v_0.Op != OpLsh32x64 {
27220 break
27221 }
27222 _ = v_0.Args[1]
27223 x := v_0.Args[0]
27224 v_0_1 := v_0.Args[1]
27225 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 24 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 24 {
27226 break
27227 }
27228 v.reset(OpZeroExt8to32)
27229 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.UInt8)
27230 v0.AddArg(x)
27231 v.AddArg(v0)
27232 return true
27233 }
27234
27235
27236 for {
27237 if v_0.Op != OpLsh32x64 {
27238 break
27239 }
27240 _ = v_0.Args[1]
27241 x := v_0.Args[0]
27242 v_0_1 := v_0.Args[1]
27243 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 16 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 16 {
27244 break
27245 }
27246 v.reset(OpZeroExt16to32)
27247 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.UInt16)
27248 v0.AddArg(x)
27249 v.AddArg(v0)
27250 return true
27251 }
27252
27253
27254
27255 for {
27256 if auxIntToBool(v.AuxInt) != false {
27257 break
27258 }
27259 x := v_0
27260 con := v_1
27261 if con.Op != OpConst64 {
27262 break
27263 }
27264 c := auxIntToInt64(con.AuxInt)
27265 if !(0 < c && c < 32) {
27266 break
27267 }
27268 v.reset(OpRsh32Ux64)
27269 v.AuxInt = boolToAuxInt(true)
27270 v.AddArg2(x, con)
27271 return true
27272 }
27273 return false
27274 }
27275 func rewriteValuegeneric_OpRsh32Ux8(v *Value) bool {
27276 v_1 := v.Args[1]
27277 v_0 := v.Args[0]
27278 b := v.Block
27279
27280
27281 for {
27282 t := v.Type
27283 x := v_0
27284 if v_1.Op != OpConst8 {
27285 break
27286 }
27287 c := auxIntToInt8(v_1.AuxInt)
27288 v.reset(OpRsh32Ux64)
27289 v0 := b.NewValue0(v.Pos, OpConst64, t)
27290 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
27291 v.AddArg2(x, v0)
27292 return true
27293 }
27294
27295
27296 for {
27297 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
27298 break
27299 }
27300 v.reset(OpConst32)
27301 v.AuxInt = int32ToAuxInt(0)
27302 return true
27303 }
27304
27305
27306
27307 for {
27308 if auxIntToBool(v.AuxInt) != false {
27309 break
27310 }
27311 x := v_0
27312 con := v_1
27313 if con.Op != OpConst8 {
27314 break
27315 }
27316 c := auxIntToInt8(con.AuxInt)
27317 if !(0 < c && c < 32) {
27318 break
27319 }
27320 v.reset(OpRsh32Ux8)
27321 v.AuxInt = boolToAuxInt(true)
27322 v.AddArg2(x, con)
27323 return true
27324 }
27325 return false
27326 }
27327 func rewriteValuegeneric_OpRsh32x16(v *Value) bool {
27328 v_1 := v.Args[1]
27329 v_0 := v.Args[0]
27330 b := v.Block
27331
27332
27333 for {
27334 t := v.Type
27335 x := v_0
27336 if v_1.Op != OpConst16 {
27337 break
27338 }
27339 c := auxIntToInt16(v_1.AuxInt)
27340 v.reset(OpRsh32x64)
27341 v0 := b.NewValue0(v.Pos, OpConst64, t)
27342 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
27343 v.AddArg2(x, v0)
27344 return true
27345 }
27346
27347
27348 for {
27349 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
27350 break
27351 }
27352 v.reset(OpConst32)
27353 v.AuxInt = int32ToAuxInt(0)
27354 return true
27355 }
27356
27357
27358
27359 for {
27360 if auxIntToBool(v.AuxInt) != false {
27361 break
27362 }
27363 x := v_0
27364 con := v_1
27365 if con.Op != OpConst16 {
27366 break
27367 }
27368 c := auxIntToInt16(con.AuxInt)
27369 if !(0 < c && c < 32) {
27370 break
27371 }
27372 v.reset(OpRsh32x16)
27373 v.AuxInt = boolToAuxInt(true)
27374 v.AddArg2(x, con)
27375 return true
27376 }
27377 return false
27378 }
27379 func rewriteValuegeneric_OpRsh32x32(v *Value) bool {
27380 v_1 := v.Args[1]
27381 v_0 := v.Args[0]
27382 b := v.Block
27383
27384
27385 for {
27386 t := v.Type
27387 x := v_0
27388 if v_1.Op != OpConst32 {
27389 break
27390 }
27391 c := auxIntToInt32(v_1.AuxInt)
27392 v.reset(OpRsh32x64)
27393 v0 := b.NewValue0(v.Pos, OpConst64, t)
27394 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
27395 v.AddArg2(x, v0)
27396 return true
27397 }
27398
27399
27400 for {
27401 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
27402 break
27403 }
27404 v.reset(OpConst32)
27405 v.AuxInt = int32ToAuxInt(0)
27406 return true
27407 }
27408
27409
27410
27411 for {
27412 if auxIntToBool(v.AuxInt) != false {
27413 break
27414 }
27415 x := v_0
27416 con := v_1
27417 if con.Op != OpConst32 {
27418 break
27419 }
27420 c := auxIntToInt32(con.AuxInt)
27421 if !(0 < c && c < 32) {
27422 break
27423 }
27424 v.reset(OpRsh32x32)
27425 v.AuxInt = boolToAuxInt(true)
27426 v.AddArg2(x, con)
27427 return true
27428 }
27429 return false
27430 }
27431 func rewriteValuegeneric_OpRsh32x64(v *Value) bool {
27432 v_1 := v.Args[1]
27433 v_0 := v.Args[0]
27434 b := v.Block
27435 typ := &b.Func.Config.Types
27436
27437
27438 for {
27439 if v_0.Op != OpConst32 {
27440 break
27441 }
27442 c := auxIntToInt32(v_0.AuxInt)
27443 if v_1.Op != OpConst64 {
27444 break
27445 }
27446 d := auxIntToInt64(v_1.AuxInt)
27447 v.reset(OpConst32)
27448 v.AuxInt = int32ToAuxInt(c >> uint64(d))
27449 return true
27450 }
27451
27452
27453 for {
27454 x := v_0
27455 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
27456 break
27457 }
27458 v.copyOf(x)
27459 return true
27460 }
27461
27462
27463 for {
27464 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
27465 break
27466 }
27467 v.reset(OpConst32)
27468 v.AuxInt = int32ToAuxInt(0)
27469 return true
27470 }
27471
27472
27473
27474 for {
27475 t := v.Type
27476 if v_0.Op != OpRsh32x64 {
27477 break
27478 }
27479 _ = v_0.Args[1]
27480 x := v_0.Args[0]
27481 v_0_1 := v_0.Args[1]
27482 if v_0_1.Op != OpConst64 {
27483 break
27484 }
27485 c := auxIntToInt64(v_0_1.AuxInt)
27486 if v_1.Op != OpConst64 {
27487 break
27488 }
27489 d := auxIntToInt64(v_1.AuxInt)
27490 if !(!uaddOvf(c, d)) {
27491 break
27492 }
27493 v.reset(OpRsh32x64)
27494 v0 := b.NewValue0(v.Pos, OpConst64, t)
27495 v0.AuxInt = int64ToAuxInt(c + d)
27496 v.AddArg2(x, v0)
27497 return true
27498 }
27499
27500
27501 for {
27502 if v_0.Op != OpLsh32x64 {
27503 break
27504 }
27505 _ = v_0.Args[1]
27506 x := v_0.Args[0]
27507 v_0_1 := v_0.Args[1]
27508 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 24 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 24 {
27509 break
27510 }
27511 v.reset(OpSignExt8to32)
27512 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.Int8)
27513 v0.AddArg(x)
27514 v.AddArg(v0)
27515 return true
27516 }
27517
27518
27519 for {
27520 if v_0.Op != OpLsh32x64 {
27521 break
27522 }
27523 _ = v_0.Args[1]
27524 x := v_0.Args[0]
27525 v_0_1 := v_0.Args[1]
27526 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 16 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 16 {
27527 break
27528 }
27529 v.reset(OpSignExt16to32)
27530 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.Int16)
27531 v0.AddArg(x)
27532 v.AddArg(v0)
27533 return true
27534 }
27535
27536
27537
27538 for {
27539 if auxIntToBool(v.AuxInt) != false {
27540 break
27541 }
27542 x := v_0
27543 con := v_1
27544 if con.Op != OpConst64 {
27545 break
27546 }
27547 c := auxIntToInt64(con.AuxInt)
27548 if !(0 < c && c < 32) {
27549 break
27550 }
27551 v.reset(OpRsh32x64)
27552 v.AuxInt = boolToAuxInt(true)
27553 v.AddArg2(x, con)
27554 return true
27555 }
27556 return false
27557 }
27558 func rewriteValuegeneric_OpRsh32x8(v *Value) bool {
27559 v_1 := v.Args[1]
27560 v_0 := v.Args[0]
27561 b := v.Block
27562
27563
27564 for {
27565 t := v.Type
27566 x := v_0
27567 if v_1.Op != OpConst8 {
27568 break
27569 }
27570 c := auxIntToInt8(v_1.AuxInt)
27571 v.reset(OpRsh32x64)
27572 v0 := b.NewValue0(v.Pos, OpConst64, t)
27573 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
27574 v.AddArg2(x, v0)
27575 return true
27576 }
27577
27578
27579 for {
27580 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
27581 break
27582 }
27583 v.reset(OpConst32)
27584 v.AuxInt = int32ToAuxInt(0)
27585 return true
27586 }
27587
27588
27589
27590 for {
27591 if auxIntToBool(v.AuxInt) != false {
27592 break
27593 }
27594 x := v_0
27595 con := v_1
27596 if con.Op != OpConst8 {
27597 break
27598 }
27599 c := auxIntToInt8(con.AuxInt)
27600 if !(0 < c && c < 32) {
27601 break
27602 }
27603 v.reset(OpRsh32x8)
27604 v.AuxInt = boolToAuxInt(true)
27605 v.AddArg2(x, con)
27606 return true
27607 }
27608 return false
27609 }
27610 func rewriteValuegeneric_OpRsh64Ux16(v *Value) bool {
27611 v_1 := v.Args[1]
27612 v_0 := v.Args[0]
27613 b := v.Block
27614
27615
27616 for {
27617 t := v.Type
27618 x := v_0
27619 if v_1.Op != OpConst16 {
27620 break
27621 }
27622 c := auxIntToInt16(v_1.AuxInt)
27623 v.reset(OpRsh64Ux64)
27624 v0 := b.NewValue0(v.Pos, OpConst64, t)
27625 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
27626 v.AddArg2(x, v0)
27627 return true
27628 }
27629
27630
27631 for {
27632 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
27633 break
27634 }
27635 v.reset(OpConst64)
27636 v.AuxInt = int64ToAuxInt(0)
27637 return true
27638 }
27639
27640
27641
27642 for {
27643 if auxIntToBool(v.AuxInt) != false {
27644 break
27645 }
27646 x := v_0
27647 con := v_1
27648 if con.Op != OpConst16 {
27649 break
27650 }
27651 c := auxIntToInt16(con.AuxInt)
27652 if !(0 < c && c < 64) {
27653 break
27654 }
27655 v.reset(OpRsh64Ux16)
27656 v.AuxInt = boolToAuxInt(true)
27657 v.AddArg2(x, con)
27658 return true
27659 }
27660 return false
27661 }
27662 func rewriteValuegeneric_OpRsh64Ux32(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 != OpConst32 {
27672 break
27673 }
27674 c := auxIntToInt32(v_1.AuxInt)
27675 v.reset(OpRsh64Ux64)
27676 v0 := b.NewValue0(v.Pos, OpConst64, t)
27677 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
27678 v.AddArg2(x, v0)
27679 return true
27680 }
27681
27682
27683 for {
27684 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
27685 break
27686 }
27687 v.reset(OpConst64)
27688 v.AuxInt = int64ToAuxInt(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 != OpConst32 {
27701 break
27702 }
27703 c := auxIntToInt32(con.AuxInt)
27704 if !(0 < c && c < 64) {
27705 break
27706 }
27707 v.reset(OpRsh64Ux32)
27708 v.AuxInt = boolToAuxInt(true)
27709 v.AddArg2(x, con)
27710 return true
27711 }
27712 return false
27713 }
27714 func rewriteValuegeneric_OpRsh64Ux64(v *Value) bool {
27715 v_1 := v.Args[1]
27716 v_0 := v.Args[0]
27717 b := v.Block
27718 typ := &b.Func.Config.Types
27719
27720
27721 for {
27722 if v_0.Op != OpConst64 {
27723 break
27724 }
27725 c := auxIntToInt64(v_0.AuxInt)
27726 if v_1.Op != OpConst64 {
27727 break
27728 }
27729 d := auxIntToInt64(v_1.AuxInt)
27730 v.reset(OpConst64)
27731 v.AuxInt = int64ToAuxInt(int64(uint64(c) >> uint64(d)))
27732 return true
27733 }
27734
27735
27736 for {
27737 x := v_0
27738 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
27739 break
27740 }
27741 v.copyOf(x)
27742 return true
27743 }
27744
27745
27746 for {
27747 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
27748 break
27749 }
27750 v.reset(OpConst64)
27751 v.AuxInt = int64ToAuxInt(0)
27752 return true
27753 }
27754
27755
27756
27757 for {
27758 if v_1.Op != OpConst64 {
27759 break
27760 }
27761 c := auxIntToInt64(v_1.AuxInt)
27762 if !(uint64(c) >= 64) {
27763 break
27764 }
27765 v.reset(OpConst64)
27766 v.AuxInt = int64ToAuxInt(0)
27767 return true
27768 }
27769
27770
27771
27772 for {
27773 t := v.Type
27774 if v_0.Op != OpRsh64Ux64 {
27775 break
27776 }
27777 _ = v_0.Args[1]
27778 x := v_0.Args[0]
27779 v_0_1 := v_0.Args[1]
27780 if v_0_1.Op != OpConst64 {
27781 break
27782 }
27783 c := auxIntToInt64(v_0_1.AuxInt)
27784 if v_1.Op != OpConst64 {
27785 break
27786 }
27787 d := auxIntToInt64(v_1.AuxInt)
27788 if !(!uaddOvf(c, d)) {
27789 break
27790 }
27791 v.reset(OpRsh64Ux64)
27792 v0 := b.NewValue0(v.Pos, OpConst64, t)
27793 v0.AuxInt = int64ToAuxInt(c + d)
27794 v.AddArg2(x, v0)
27795 return true
27796 }
27797
27798
27799 for {
27800 if v_0.Op != OpRsh64x64 {
27801 break
27802 }
27803 x := v_0.Args[0]
27804 if v_1.Op != OpConst64 {
27805 break
27806 }
27807 t := v_1.Type
27808 if auxIntToInt64(v_1.AuxInt) != 63 {
27809 break
27810 }
27811 v.reset(OpRsh64Ux64)
27812 v0 := b.NewValue0(v.Pos, OpConst64, t)
27813 v0.AuxInt = int64ToAuxInt(63)
27814 v.AddArg2(x, v0)
27815 return true
27816 }
27817
27818
27819
27820 for {
27821 i := v_0
27822 if i.Op != OpLsh64x64 {
27823 break
27824 }
27825 _ = i.Args[1]
27826 x := i.Args[0]
27827 i_1 := i.Args[1]
27828 if i_1.Op != OpConst64 {
27829 break
27830 }
27831 c := auxIntToInt64(i_1.AuxInt)
27832 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
27833 break
27834 }
27835 v.reset(OpAnd64)
27836 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
27837 v0.AuxInt = int64ToAuxInt(int64(^uint64(0) >> c))
27838 v.AddArg2(x, v0)
27839 return true
27840 }
27841
27842
27843
27844 for {
27845 if v_0.Op != OpLsh64x64 {
27846 break
27847 }
27848 _ = v_0.Args[1]
27849 v_0_0 := v_0.Args[0]
27850 if v_0_0.Op != OpRsh64Ux64 {
27851 break
27852 }
27853 _ = v_0_0.Args[1]
27854 x := v_0_0.Args[0]
27855 v_0_0_1 := v_0_0.Args[1]
27856 if v_0_0_1.Op != OpConst64 {
27857 break
27858 }
27859 c1 := auxIntToInt64(v_0_0_1.AuxInt)
27860 v_0_1 := v_0.Args[1]
27861 if v_0_1.Op != OpConst64 {
27862 break
27863 }
27864 c2 := auxIntToInt64(v_0_1.AuxInt)
27865 if v_1.Op != OpConst64 {
27866 break
27867 }
27868 c3 := auxIntToInt64(v_1.AuxInt)
27869 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
27870 break
27871 }
27872 v.reset(OpRsh64Ux64)
27873 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
27874 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
27875 v.AddArg2(x, v0)
27876 return true
27877 }
27878
27879
27880 for {
27881 if v_0.Op != OpLsh64x64 {
27882 break
27883 }
27884 _ = v_0.Args[1]
27885 x := v_0.Args[0]
27886 v_0_1 := v_0.Args[1]
27887 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 56 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 56 {
27888 break
27889 }
27890 v.reset(OpZeroExt8to64)
27891 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.UInt8)
27892 v0.AddArg(x)
27893 v.AddArg(v0)
27894 return true
27895 }
27896
27897
27898 for {
27899 if v_0.Op != OpLsh64x64 {
27900 break
27901 }
27902 _ = v_0.Args[1]
27903 x := v_0.Args[0]
27904 v_0_1 := v_0.Args[1]
27905 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 48 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 48 {
27906 break
27907 }
27908 v.reset(OpZeroExt16to64)
27909 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.UInt16)
27910 v0.AddArg(x)
27911 v.AddArg(v0)
27912 return true
27913 }
27914
27915
27916 for {
27917 if v_0.Op != OpLsh64x64 {
27918 break
27919 }
27920 _ = v_0.Args[1]
27921 x := v_0.Args[0]
27922 v_0_1 := v_0.Args[1]
27923 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 32 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 32 {
27924 break
27925 }
27926 v.reset(OpZeroExt32to64)
27927 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.UInt32)
27928 v0.AddArg(x)
27929 v.AddArg(v0)
27930 return true
27931 }
27932
27933
27934
27935 for {
27936 if auxIntToBool(v.AuxInt) != false {
27937 break
27938 }
27939 x := v_0
27940 con := v_1
27941 if con.Op != OpConst64 {
27942 break
27943 }
27944 c := auxIntToInt64(con.AuxInt)
27945 if !(0 < c && c < 64) {
27946 break
27947 }
27948 v.reset(OpRsh64Ux64)
27949 v.AuxInt = boolToAuxInt(true)
27950 v.AddArg2(x, con)
27951 return true
27952 }
27953 return false
27954 }
27955 func rewriteValuegeneric_OpRsh64Ux8(v *Value) bool {
27956 v_1 := v.Args[1]
27957 v_0 := v.Args[0]
27958 b := v.Block
27959
27960
27961 for {
27962 t := v.Type
27963 x := v_0
27964 if v_1.Op != OpConst8 {
27965 break
27966 }
27967 c := auxIntToInt8(v_1.AuxInt)
27968 v.reset(OpRsh64Ux64)
27969 v0 := b.NewValue0(v.Pos, OpConst64, t)
27970 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
27971 v.AddArg2(x, v0)
27972 return true
27973 }
27974
27975
27976 for {
27977 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
27978 break
27979 }
27980 v.reset(OpConst64)
27981 v.AuxInt = int64ToAuxInt(0)
27982 return true
27983 }
27984
27985
27986
27987 for {
27988 if auxIntToBool(v.AuxInt) != false {
27989 break
27990 }
27991 x := v_0
27992 con := v_1
27993 if con.Op != OpConst8 {
27994 break
27995 }
27996 c := auxIntToInt8(con.AuxInt)
27997 if !(0 < c && c < 64) {
27998 break
27999 }
28000 v.reset(OpRsh64Ux8)
28001 v.AuxInt = boolToAuxInt(true)
28002 v.AddArg2(x, con)
28003 return true
28004 }
28005 return false
28006 }
28007 func rewriteValuegeneric_OpRsh64x16(v *Value) bool {
28008 v_1 := v.Args[1]
28009 v_0 := v.Args[0]
28010 b := v.Block
28011
28012
28013 for {
28014 t := v.Type
28015 x := v_0
28016 if v_1.Op != OpConst16 {
28017 break
28018 }
28019 c := auxIntToInt16(v_1.AuxInt)
28020 v.reset(OpRsh64x64)
28021 v0 := b.NewValue0(v.Pos, OpConst64, t)
28022 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28023 v.AddArg2(x, v0)
28024 return true
28025 }
28026
28027
28028 for {
28029 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
28030 break
28031 }
28032 v.reset(OpConst64)
28033 v.AuxInt = int64ToAuxInt(0)
28034 return true
28035 }
28036
28037
28038
28039 for {
28040 if auxIntToBool(v.AuxInt) != false {
28041 break
28042 }
28043 x := v_0
28044 con := v_1
28045 if con.Op != OpConst16 {
28046 break
28047 }
28048 c := auxIntToInt16(con.AuxInt)
28049 if !(0 < c && c < 64) {
28050 break
28051 }
28052 v.reset(OpRsh64x16)
28053 v.AuxInt = boolToAuxInt(true)
28054 v.AddArg2(x, con)
28055 return true
28056 }
28057 return false
28058 }
28059 func rewriteValuegeneric_OpRsh64x32(v *Value) bool {
28060 v_1 := v.Args[1]
28061 v_0 := v.Args[0]
28062 b := v.Block
28063
28064
28065 for {
28066 t := v.Type
28067 x := v_0
28068 if v_1.Op != OpConst32 {
28069 break
28070 }
28071 c := auxIntToInt32(v_1.AuxInt)
28072 v.reset(OpRsh64x64)
28073 v0 := b.NewValue0(v.Pos, OpConst64, t)
28074 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
28075 v.AddArg2(x, v0)
28076 return true
28077 }
28078
28079
28080 for {
28081 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
28082 break
28083 }
28084 v.reset(OpConst64)
28085 v.AuxInt = int64ToAuxInt(0)
28086 return true
28087 }
28088
28089
28090
28091 for {
28092 if auxIntToBool(v.AuxInt) != false {
28093 break
28094 }
28095 x := v_0
28096 con := v_1
28097 if con.Op != OpConst32 {
28098 break
28099 }
28100 c := auxIntToInt32(con.AuxInt)
28101 if !(0 < c && c < 64) {
28102 break
28103 }
28104 v.reset(OpRsh64x32)
28105 v.AuxInt = boolToAuxInt(true)
28106 v.AddArg2(x, con)
28107 return true
28108 }
28109 return false
28110 }
28111 func rewriteValuegeneric_OpRsh64x64(v *Value) bool {
28112 v_1 := v.Args[1]
28113 v_0 := v.Args[0]
28114 b := v.Block
28115 typ := &b.Func.Config.Types
28116
28117
28118 for {
28119 if v_0.Op != OpConst64 {
28120 break
28121 }
28122 c := auxIntToInt64(v_0.AuxInt)
28123 if v_1.Op != OpConst64 {
28124 break
28125 }
28126 d := auxIntToInt64(v_1.AuxInt)
28127 v.reset(OpConst64)
28128 v.AuxInt = int64ToAuxInt(c >> uint64(d))
28129 return true
28130 }
28131
28132
28133 for {
28134 x := v_0
28135 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
28136 break
28137 }
28138 v.copyOf(x)
28139 return true
28140 }
28141
28142
28143 for {
28144 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
28145 break
28146 }
28147 v.reset(OpConst64)
28148 v.AuxInt = int64ToAuxInt(0)
28149 return true
28150 }
28151
28152
28153
28154 for {
28155 t := v.Type
28156 if v_0.Op != OpRsh64x64 {
28157 break
28158 }
28159 _ = v_0.Args[1]
28160 x := v_0.Args[0]
28161 v_0_1 := v_0.Args[1]
28162 if v_0_1.Op != OpConst64 {
28163 break
28164 }
28165 c := auxIntToInt64(v_0_1.AuxInt)
28166 if v_1.Op != OpConst64 {
28167 break
28168 }
28169 d := auxIntToInt64(v_1.AuxInt)
28170 if !(!uaddOvf(c, d)) {
28171 break
28172 }
28173 v.reset(OpRsh64x64)
28174 v0 := b.NewValue0(v.Pos, OpConst64, t)
28175 v0.AuxInt = int64ToAuxInt(c + d)
28176 v.AddArg2(x, v0)
28177 return true
28178 }
28179
28180
28181 for {
28182 if v_0.Op != OpLsh64x64 {
28183 break
28184 }
28185 _ = v_0.Args[1]
28186 x := v_0.Args[0]
28187 v_0_1 := v_0.Args[1]
28188 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 56 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 56 {
28189 break
28190 }
28191 v.reset(OpSignExt8to64)
28192 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.Int8)
28193 v0.AddArg(x)
28194 v.AddArg(v0)
28195 return true
28196 }
28197
28198
28199 for {
28200 if v_0.Op != OpLsh64x64 {
28201 break
28202 }
28203 _ = v_0.Args[1]
28204 x := v_0.Args[0]
28205 v_0_1 := v_0.Args[1]
28206 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 48 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 48 {
28207 break
28208 }
28209 v.reset(OpSignExt16to64)
28210 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.Int16)
28211 v0.AddArg(x)
28212 v.AddArg(v0)
28213 return true
28214 }
28215
28216
28217 for {
28218 if v_0.Op != OpLsh64x64 {
28219 break
28220 }
28221 _ = v_0.Args[1]
28222 x := v_0.Args[0]
28223 v_0_1 := v_0.Args[1]
28224 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 32 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 32 {
28225 break
28226 }
28227 v.reset(OpSignExt32to64)
28228 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.Int32)
28229 v0.AddArg(x)
28230 v.AddArg(v0)
28231 return true
28232 }
28233
28234
28235
28236 for {
28237 if auxIntToBool(v.AuxInt) != false {
28238 break
28239 }
28240 x := v_0
28241 con := v_1
28242 if con.Op != OpConst64 {
28243 break
28244 }
28245 c := auxIntToInt64(con.AuxInt)
28246 if !(0 < c && c < 64) {
28247 break
28248 }
28249 v.reset(OpRsh64x64)
28250 v.AuxInt = boolToAuxInt(true)
28251 v.AddArg2(x, con)
28252 return true
28253 }
28254 return false
28255 }
28256 func rewriteValuegeneric_OpRsh64x8(v *Value) bool {
28257 v_1 := v.Args[1]
28258 v_0 := v.Args[0]
28259 b := v.Block
28260
28261
28262 for {
28263 t := v.Type
28264 x := v_0
28265 if v_1.Op != OpConst8 {
28266 break
28267 }
28268 c := auxIntToInt8(v_1.AuxInt)
28269 v.reset(OpRsh64x64)
28270 v0 := b.NewValue0(v.Pos, OpConst64, t)
28271 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
28272 v.AddArg2(x, v0)
28273 return true
28274 }
28275
28276
28277 for {
28278 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
28279 break
28280 }
28281 v.reset(OpConst64)
28282 v.AuxInt = int64ToAuxInt(0)
28283 return true
28284 }
28285
28286
28287
28288 for {
28289 if auxIntToBool(v.AuxInt) != false {
28290 break
28291 }
28292 x := v_0
28293 con := v_1
28294 if con.Op != OpConst8 {
28295 break
28296 }
28297 c := auxIntToInt8(con.AuxInt)
28298 if !(0 < c && c < 64) {
28299 break
28300 }
28301 v.reset(OpRsh64x8)
28302 v.AuxInt = boolToAuxInt(true)
28303 v.AddArg2(x, con)
28304 return true
28305 }
28306 return false
28307 }
28308 func rewriteValuegeneric_OpRsh8Ux16(v *Value) bool {
28309 v_1 := v.Args[1]
28310 v_0 := v.Args[0]
28311 b := v.Block
28312
28313
28314 for {
28315 t := v.Type
28316 x := v_0
28317 if v_1.Op != OpConst16 {
28318 break
28319 }
28320 c := auxIntToInt16(v_1.AuxInt)
28321 v.reset(OpRsh8Ux64)
28322 v0 := b.NewValue0(v.Pos, OpConst64, t)
28323 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28324 v.AddArg2(x, v0)
28325 return true
28326 }
28327
28328
28329 for {
28330 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
28331 break
28332 }
28333 v.reset(OpConst8)
28334 v.AuxInt = int8ToAuxInt(0)
28335 return true
28336 }
28337
28338
28339
28340 for {
28341 if auxIntToBool(v.AuxInt) != false {
28342 break
28343 }
28344 x := v_0
28345 con := v_1
28346 if con.Op != OpConst16 {
28347 break
28348 }
28349 c := auxIntToInt16(con.AuxInt)
28350 if !(0 < c && c < 8) {
28351 break
28352 }
28353 v.reset(OpRsh8Ux16)
28354 v.AuxInt = boolToAuxInt(true)
28355 v.AddArg2(x, con)
28356 return true
28357 }
28358 return false
28359 }
28360 func rewriteValuegeneric_OpRsh8Ux32(v *Value) bool {
28361 v_1 := v.Args[1]
28362 v_0 := v.Args[0]
28363 b := v.Block
28364
28365
28366 for {
28367 t := v.Type
28368 x := v_0
28369 if v_1.Op != OpConst32 {
28370 break
28371 }
28372 c := auxIntToInt32(v_1.AuxInt)
28373 v.reset(OpRsh8Ux64)
28374 v0 := b.NewValue0(v.Pos, OpConst64, t)
28375 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
28376 v.AddArg2(x, v0)
28377 return true
28378 }
28379
28380
28381 for {
28382 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
28383 break
28384 }
28385 v.reset(OpConst8)
28386 v.AuxInt = int8ToAuxInt(0)
28387 return true
28388 }
28389
28390
28391
28392 for {
28393 if auxIntToBool(v.AuxInt) != false {
28394 break
28395 }
28396 x := v_0
28397 con := v_1
28398 if con.Op != OpConst32 {
28399 break
28400 }
28401 c := auxIntToInt32(con.AuxInt)
28402 if !(0 < c && c < 8) {
28403 break
28404 }
28405 v.reset(OpRsh8Ux32)
28406 v.AuxInt = boolToAuxInt(true)
28407 v.AddArg2(x, con)
28408 return true
28409 }
28410 return false
28411 }
28412 func rewriteValuegeneric_OpRsh8Ux64(v *Value) bool {
28413 v_1 := v.Args[1]
28414 v_0 := v.Args[0]
28415 b := v.Block
28416 typ := &b.Func.Config.Types
28417
28418
28419 for {
28420 if v_0.Op != OpConst8 {
28421 break
28422 }
28423 c := auxIntToInt8(v_0.AuxInt)
28424 if v_1.Op != OpConst64 {
28425 break
28426 }
28427 d := auxIntToInt64(v_1.AuxInt)
28428 v.reset(OpConst8)
28429 v.AuxInt = int8ToAuxInt(int8(uint8(c) >> uint64(d)))
28430 return true
28431 }
28432
28433
28434 for {
28435 x := v_0
28436 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
28437 break
28438 }
28439 v.copyOf(x)
28440 return true
28441 }
28442
28443
28444 for {
28445 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
28446 break
28447 }
28448 v.reset(OpConst8)
28449 v.AuxInt = int8ToAuxInt(0)
28450 return true
28451 }
28452
28453
28454
28455 for {
28456 if v_1.Op != OpConst64 {
28457 break
28458 }
28459 c := auxIntToInt64(v_1.AuxInt)
28460 if !(uint64(c) >= 8) {
28461 break
28462 }
28463 v.reset(OpConst8)
28464 v.AuxInt = int8ToAuxInt(0)
28465 return true
28466 }
28467
28468
28469
28470 for {
28471 t := v.Type
28472 if v_0.Op != OpRsh8Ux64 {
28473 break
28474 }
28475 _ = v_0.Args[1]
28476 x := v_0.Args[0]
28477 v_0_1 := v_0.Args[1]
28478 if v_0_1.Op != OpConst64 {
28479 break
28480 }
28481 c := auxIntToInt64(v_0_1.AuxInt)
28482 if v_1.Op != OpConst64 {
28483 break
28484 }
28485 d := auxIntToInt64(v_1.AuxInt)
28486 if !(!uaddOvf(c, d)) {
28487 break
28488 }
28489 v.reset(OpRsh8Ux64)
28490 v0 := b.NewValue0(v.Pos, OpConst64, t)
28491 v0.AuxInt = int64ToAuxInt(c + d)
28492 v.AddArg2(x, v0)
28493 return true
28494 }
28495
28496
28497 for {
28498 if v_0.Op != OpRsh8x64 {
28499 break
28500 }
28501 x := v_0.Args[0]
28502 if v_1.Op != OpConst64 {
28503 break
28504 }
28505 t := v_1.Type
28506 if auxIntToInt64(v_1.AuxInt) != 7 {
28507 break
28508 }
28509 v.reset(OpRsh8Ux64)
28510 v0 := b.NewValue0(v.Pos, OpConst64, t)
28511 v0.AuxInt = int64ToAuxInt(7)
28512 v.AddArg2(x, v0)
28513 return true
28514 }
28515
28516
28517
28518 for {
28519 i := v_0
28520 if i.Op != OpLsh8x64 {
28521 break
28522 }
28523 _ = i.Args[1]
28524 x := i.Args[0]
28525 i_1 := i.Args[1]
28526 if i_1.Op != OpConst64 {
28527 break
28528 }
28529 c := auxIntToInt64(i_1.AuxInt)
28530 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
28531 break
28532 }
28533 v.reset(OpAnd8)
28534 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
28535 v0.AuxInt = int8ToAuxInt(int8(^uint8(0) >> c))
28536 v.AddArg2(x, v0)
28537 return true
28538 }
28539
28540
28541
28542 for {
28543 if v_0.Op != OpLsh8x64 {
28544 break
28545 }
28546 _ = v_0.Args[1]
28547 v_0_0 := v_0.Args[0]
28548 if v_0_0.Op != OpRsh8Ux64 {
28549 break
28550 }
28551 _ = v_0_0.Args[1]
28552 x := v_0_0.Args[0]
28553 v_0_0_1 := v_0_0.Args[1]
28554 if v_0_0_1.Op != OpConst64 {
28555 break
28556 }
28557 c1 := auxIntToInt64(v_0_0_1.AuxInt)
28558 v_0_1 := v_0.Args[1]
28559 if v_0_1.Op != OpConst64 {
28560 break
28561 }
28562 c2 := auxIntToInt64(v_0_1.AuxInt)
28563 if v_1.Op != OpConst64 {
28564 break
28565 }
28566 c3 := auxIntToInt64(v_1.AuxInt)
28567 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
28568 break
28569 }
28570 v.reset(OpRsh8Ux64)
28571 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
28572 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
28573 v.AddArg2(x, v0)
28574 return true
28575 }
28576
28577
28578
28579 for {
28580 if auxIntToBool(v.AuxInt) != false {
28581 break
28582 }
28583 x := v_0
28584 con := v_1
28585 if con.Op != OpConst64 {
28586 break
28587 }
28588 c := auxIntToInt64(con.AuxInt)
28589 if !(0 < c && c < 8) {
28590 break
28591 }
28592 v.reset(OpRsh8Ux64)
28593 v.AuxInt = boolToAuxInt(true)
28594 v.AddArg2(x, con)
28595 return true
28596 }
28597 return false
28598 }
28599 func rewriteValuegeneric_OpRsh8Ux8(v *Value) bool {
28600 v_1 := v.Args[1]
28601 v_0 := v.Args[0]
28602 b := v.Block
28603
28604
28605 for {
28606 t := v.Type
28607 x := v_0
28608 if v_1.Op != OpConst8 {
28609 break
28610 }
28611 c := auxIntToInt8(v_1.AuxInt)
28612 v.reset(OpRsh8Ux64)
28613 v0 := b.NewValue0(v.Pos, OpConst64, t)
28614 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
28615 v.AddArg2(x, v0)
28616 return true
28617 }
28618
28619
28620 for {
28621 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
28622 break
28623 }
28624 v.reset(OpConst8)
28625 v.AuxInt = int8ToAuxInt(0)
28626 return true
28627 }
28628
28629
28630
28631 for {
28632 if auxIntToBool(v.AuxInt) != false {
28633 break
28634 }
28635 x := v_0
28636 con := v_1
28637 if con.Op != OpConst8 {
28638 break
28639 }
28640 c := auxIntToInt8(con.AuxInt)
28641 if !(0 < c && c < 8) {
28642 break
28643 }
28644 v.reset(OpRsh8Ux8)
28645 v.AuxInt = boolToAuxInt(true)
28646 v.AddArg2(x, con)
28647 return true
28648 }
28649 return false
28650 }
28651 func rewriteValuegeneric_OpRsh8x16(v *Value) bool {
28652 v_1 := v.Args[1]
28653 v_0 := v.Args[0]
28654 b := v.Block
28655
28656
28657 for {
28658 t := v.Type
28659 x := v_0
28660 if v_1.Op != OpConst16 {
28661 break
28662 }
28663 c := auxIntToInt16(v_1.AuxInt)
28664 v.reset(OpRsh8x64)
28665 v0 := b.NewValue0(v.Pos, OpConst64, t)
28666 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28667 v.AddArg2(x, v0)
28668 return true
28669 }
28670
28671
28672 for {
28673 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
28674 break
28675 }
28676 v.reset(OpConst8)
28677 v.AuxInt = int8ToAuxInt(0)
28678 return true
28679 }
28680
28681
28682
28683 for {
28684 if auxIntToBool(v.AuxInt) != false {
28685 break
28686 }
28687 x := v_0
28688 con := v_1
28689 if con.Op != OpConst16 {
28690 break
28691 }
28692 c := auxIntToInt16(con.AuxInt)
28693 if !(0 < c && c < 8) {
28694 break
28695 }
28696 v.reset(OpRsh8x16)
28697 v.AuxInt = boolToAuxInt(true)
28698 v.AddArg2(x, con)
28699 return true
28700 }
28701 return false
28702 }
28703 func rewriteValuegeneric_OpRsh8x32(v *Value) bool {
28704 v_1 := v.Args[1]
28705 v_0 := v.Args[0]
28706 b := v.Block
28707
28708
28709 for {
28710 t := v.Type
28711 x := v_0
28712 if v_1.Op != OpConst32 {
28713 break
28714 }
28715 c := auxIntToInt32(v_1.AuxInt)
28716 v.reset(OpRsh8x64)
28717 v0 := b.NewValue0(v.Pos, OpConst64, t)
28718 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
28719 v.AddArg2(x, v0)
28720 return true
28721 }
28722
28723
28724 for {
28725 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
28726 break
28727 }
28728 v.reset(OpConst8)
28729 v.AuxInt = int8ToAuxInt(0)
28730 return true
28731 }
28732
28733
28734
28735 for {
28736 if auxIntToBool(v.AuxInt) != false {
28737 break
28738 }
28739 x := v_0
28740 con := v_1
28741 if con.Op != OpConst32 {
28742 break
28743 }
28744 c := auxIntToInt32(con.AuxInt)
28745 if !(0 < c && c < 8) {
28746 break
28747 }
28748 v.reset(OpRsh8x32)
28749 v.AuxInt = boolToAuxInt(true)
28750 v.AddArg2(x, con)
28751 return true
28752 }
28753 return false
28754 }
28755 func rewriteValuegeneric_OpRsh8x64(v *Value) bool {
28756 v_1 := v.Args[1]
28757 v_0 := v.Args[0]
28758 b := v.Block
28759
28760
28761 for {
28762 if v_0.Op != OpConst8 {
28763 break
28764 }
28765 c := auxIntToInt8(v_0.AuxInt)
28766 if v_1.Op != OpConst64 {
28767 break
28768 }
28769 d := auxIntToInt64(v_1.AuxInt)
28770 v.reset(OpConst8)
28771 v.AuxInt = int8ToAuxInt(c >> uint64(d))
28772 return true
28773 }
28774
28775
28776 for {
28777 x := v_0
28778 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
28779 break
28780 }
28781 v.copyOf(x)
28782 return true
28783 }
28784
28785
28786 for {
28787 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
28788 break
28789 }
28790 v.reset(OpConst8)
28791 v.AuxInt = int8ToAuxInt(0)
28792 return true
28793 }
28794
28795
28796
28797 for {
28798 t := v.Type
28799 if v_0.Op != OpRsh8x64 {
28800 break
28801 }
28802 _ = v_0.Args[1]
28803 x := v_0.Args[0]
28804 v_0_1 := v_0.Args[1]
28805 if v_0_1.Op != OpConst64 {
28806 break
28807 }
28808 c := auxIntToInt64(v_0_1.AuxInt)
28809 if v_1.Op != OpConst64 {
28810 break
28811 }
28812 d := auxIntToInt64(v_1.AuxInt)
28813 if !(!uaddOvf(c, d)) {
28814 break
28815 }
28816 v.reset(OpRsh8x64)
28817 v0 := b.NewValue0(v.Pos, OpConst64, t)
28818 v0.AuxInt = int64ToAuxInt(c + d)
28819 v.AddArg2(x, v0)
28820 return true
28821 }
28822
28823
28824
28825 for {
28826 if auxIntToBool(v.AuxInt) != false {
28827 break
28828 }
28829 x := v_0
28830 con := v_1
28831 if con.Op != OpConst64 {
28832 break
28833 }
28834 c := auxIntToInt64(con.AuxInt)
28835 if !(0 < c && c < 8) {
28836 break
28837 }
28838 v.reset(OpRsh8x64)
28839 v.AuxInt = boolToAuxInt(true)
28840 v.AddArg2(x, con)
28841 return true
28842 }
28843 return false
28844 }
28845 func rewriteValuegeneric_OpRsh8x8(v *Value) bool {
28846 v_1 := v.Args[1]
28847 v_0 := v.Args[0]
28848 b := v.Block
28849
28850
28851 for {
28852 t := v.Type
28853 x := v_0
28854 if v_1.Op != OpConst8 {
28855 break
28856 }
28857 c := auxIntToInt8(v_1.AuxInt)
28858 v.reset(OpRsh8x64)
28859 v0 := b.NewValue0(v.Pos, OpConst64, t)
28860 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
28861 v.AddArg2(x, v0)
28862 return true
28863 }
28864
28865
28866 for {
28867 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
28868 break
28869 }
28870 v.reset(OpConst8)
28871 v.AuxInt = int8ToAuxInt(0)
28872 return true
28873 }
28874
28875
28876
28877 for {
28878 if auxIntToBool(v.AuxInt) != false {
28879 break
28880 }
28881 x := v_0
28882 con := v_1
28883 if con.Op != OpConst8 {
28884 break
28885 }
28886 c := auxIntToInt8(con.AuxInt)
28887 if !(0 < c && c < 8) {
28888 break
28889 }
28890 v.reset(OpRsh8x8)
28891 v.AuxInt = boolToAuxInt(true)
28892 v.AddArg2(x, con)
28893 return true
28894 }
28895 return false
28896 }
28897 func rewriteValuegeneric_OpSelect0(v *Value) bool {
28898 v_0 := v.Args[0]
28899
28900
28901
28902 for {
28903 a := v_0
28904 if a.Op != OpAdd64carry {
28905 break
28906 }
28907 _ = a.Args[2]
28908 x := a.Args[0]
28909 y := a.Args[1]
28910 a_2 := a.Args[2]
28911 if a_2.Op != OpConst64 || auxIntToInt64(a_2.AuxInt) != 0 || !(a.Uses == 1) {
28912 break
28913 }
28914 v.reset(OpAdd64)
28915 v.AddArg2(x, y)
28916 return true
28917 }
28918
28919
28920 for {
28921 if v_0.Op != OpMakeTuple {
28922 break
28923 }
28924 x := v_0.Args[0]
28925 v.copyOf(x)
28926 return true
28927 }
28928 return false
28929 }
28930 func rewriteValuegeneric_OpSelect1(v *Value) bool {
28931 v_0 := v.Args[0]
28932
28933
28934 for {
28935 if v_0.Op != OpMakeTuple {
28936 break
28937 }
28938 y := v_0.Args[1]
28939 v.copyOf(y)
28940 return true
28941 }
28942 return false
28943 }
28944 func rewriteValuegeneric_OpSelectN(v *Value) bool {
28945 v_0 := v.Args[0]
28946 b := v.Block
28947 config := b.Func.Config
28948 typ := &b.Func.Config.Types
28949
28950
28951 for {
28952 n := auxIntToInt64(v.AuxInt)
28953 m := v_0
28954 if m.Op != OpMakeResult {
28955 break
28956 }
28957 v.copyOf(m.Args[n])
28958 return true
28959 }
28960
28961
28962
28963 for {
28964 if auxIntToInt64(v.AuxInt) != 0 {
28965 break
28966 }
28967 call := v_0
28968 if call.Op != OpStaticCall || len(call.Args) != 3 {
28969 break
28970 }
28971 sym := auxToCall(call.Aux)
28972 mem := call.Args[2]
28973 sptr := call.Args[0]
28974 call_1 := call.Args[1]
28975 if call_1.Op != OpConst64 {
28976 break
28977 }
28978 c := auxIntToInt64(call_1.AuxInt)
28979 if !(isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)) {
28980 break
28981 }
28982 v.reset(OpZero)
28983 v.AuxInt = int64ToAuxInt(int64(c))
28984 v.Aux = typeToAux(types.Types[types.TUINT8])
28985 v.AddArg2(sptr, mem)
28986 return true
28987 }
28988
28989
28990
28991 for {
28992 if auxIntToInt64(v.AuxInt) != 0 {
28993 break
28994 }
28995 call := v_0
28996 if call.Op != OpStaticCall || len(call.Args) != 3 {
28997 break
28998 }
28999 sym := auxToCall(call.Aux)
29000 mem := call.Args[2]
29001 sptr := call.Args[0]
29002 call_1 := call.Args[1]
29003 if call_1.Op != OpConst32 {
29004 break
29005 }
29006 c := auxIntToInt32(call_1.AuxInt)
29007 if !(isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)) {
29008 break
29009 }
29010 v.reset(OpZero)
29011 v.AuxInt = int64ToAuxInt(int64(c))
29012 v.Aux = typeToAux(types.Types[types.TUINT8])
29013 v.AddArg2(sptr, mem)
29014 return true
29015 }
29016
29017
29018
29019 for {
29020 if auxIntToInt64(v.AuxInt) != 0 {
29021 break
29022 }
29023 call := v_0
29024 if call.Op != OpStaticCall || len(call.Args) != 1 {
29025 break
29026 }
29027 sym := auxToCall(call.Aux)
29028 s1 := call.Args[0]
29029 if s1.Op != OpStore {
29030 break
29031 }
29032 _ = s1.Args[2]
29033 s1_1 := s1.Args[1]
29034 if s1_1.Op != OpConst64 {
29035 break
29036 }
29037 sz := auxIntToInt64(s1_1.AuxInt)
29038 s2 := s1.Args[2]
29039 if s2.Op != OpStore {
29040 break
29041 }
29042 _ = s2.Args[2]
29043 src := s2.Args[1]
29044 s3 := s2.Args[2]
29045 if s3.Op != OpStore {
29046 break
29047 }
29048 mem := s3.Args[2]
29049 dst := s3.Args[1]
29050 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)) {
29051 break
29052 }
29053 v.reset(OpMove)
29054 v.AuxInt = int64ToAuxInt(int64(sz))
29055 v.Aux = typeToAux(types.Types[types.TUINT8])
29056 v.AddArg3(dst, src, mem)
29057 return true
29058 }
29059
29060
29061
29062 for {
29063 if auxIntToInt64(v.AuxInt) != 0 {
29064 break
29065 }
29066 call := v_0
29067 if call.Op != OpStaticCall || len(call.Args) != 1 {
29068 break
29069 }
29070 sym := auxToCall(call.Aux)
29071 s1 := call.Args[0]
29072 if s1.Op != OpStore {
29073 break
29074 }
29075 _ = s1.Args[2]
29076 s1_1 := s1.Args[1]
29077 if s1_1.Op != OpConst32 {
29078 break
29079 }
29080 sz := auxIntToInt32(s1_1.AuxInt)
29081 s2 := s1.Args[2]
29082 if s2.Op != OpStore {
29083 break
29084 }
29085 _ = s2.Args[2]
29086 src := s2.Args[1]
29087 s3 := s2.Args[2]
29088 if s3.Op != OpStore {
29089 break
29090 }
29091 mem := s3.Args[2]
29092 dst := s3.Args[1]
29093 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)) {
29094 break
29095 }
29096 v.reset(OpMove)
29097 v.AuxInt = int64ToAuxInt(int64(sz))
29098 v.Aux = typeToAux(types.Types[types.TUINT8])
29099 v.AddArg3(dst, src, mem)
29100 return true
29101 }
29102
29103
29104
29105 for {
29106 if auxIntToInt64(v.AuxInt) != 0 {
29107 break
29108 }
29109 call := v_0
29110 if call.Op != OpStaticCall || len(call.Args) != 4 {
29111 break
29112 }
29113 sym := auxToCall(call.Aux)
29114 mem := call.Args[3]
29115 dst := call.Args[0]
29116 src := call.Args[1]
29117 call_2 := call.Args[2]
29118 if call_2.Op != OpConst64 {
29119 break
29120 }
29121 sz := auxIntToInt64(call_2.AuxInt)
29122 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
29123 break
29124 }
29125 v.reset(OpMove)
29126 v.AuxInt = int64ToAuxInt(int64(sz))
29127 v.Aux = typeToAux(types.Types[types.TUINT8])
29128 v.AddArg3(dst, src, mem)
29129 return true
29130 }
29131
29132
29133
29134 for {
29135 if auxIntToInt64(v.AuxInt) != 0 {
29136 break
29137 }
29138 call := v_0
29139 if call.Op != OpStaticCall || len(call.Args) != 4 {
29140 break
29141 }
29142 sym := auxToCall(call.Aux)
29143 mem := call.Args[3]
29144 dst := call.Args[0]
29145 src := call.Args[1]
29146 call_2 := call.Args[2]
29147 if call_2.Op != OpConst32 {
29148 break
29149 }
29150 sz := auxIntToInt32(call_2.AuxInt)
29151 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
29152 break
29153 }
29154 v.reset(OpMove)
29155 v.AuxInt = int64ToAuxInt(int64(sz))
29156 v.Aux = typeToAux(types.Types[types.TUINT8])
29157 v.AddArg3(dst, src, mem)
29158 return true
29159 }
29160
29161
29162
29163 for {
29164 if auxIntToInt64(v.AuxInt) != 0 {
29165 break
29166 }
29167 call := v_0
29168 if call.Op != OpStaticLECall || len(call.Args) != 4 {
29169 break
29170 }
29171 sym := auxToCall(call.Aux)
29172 mem := call.Args[3]
29173 dst := call.Args[0]
29174 src := call.Args[1]
29175 call_2 := call.Args[2]
29176 if call_2.Op != OpConst64 {
29177 break
29178 }
29179 sz := auxIntToInt64(call_2.AuxInt)
29180 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
29181 break
29182 }
29183 v.reset(OpMove)
29184 v.AuxInt = int64ToAuxInt(int64(sz))
29185 v.Aux = typeToAux(types.Types[types.TUINT8])
29186 v.AddArg3(dst, src, mem)
29187 return true
29188 }
29189
29190
29191
29192 for {
29193 if auxIntToInt64(v.AuxInt) != 0 {
29194 break
29195 }
29196 call := v_0
29197 if call.Op != OpStaticLECall || len(call.Args) != 4 {
29198 break
29199 }
29200 sym := auxToCall(call.Aux)
29201 mem := call.Args[3]
29202 dst := call.Args[0]
29203 src := call.Args[1]
29204 call_2 := call.Args[2]
29205 if call_2.Op != OpConst32 {
29206 break
29207 }
29208 sz := auxIntToInt32(call_2.AuxInt)
29209 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
29210 break
29211 }
29212 v.reset(OpMove)
29213 v.AuxInt = int64ToAuxInt(int64(sz))
29214 v.Aux = typeToAux(types.Types[types.TUINT8])
29215 v.AddArg3(dst, src, mem)
29216 return true
29217 }
29218
29219
29220
29221 for {
29222 if auxIntToInt64(v.AuxInt) != 0 {
29223 break
29224 }
29225 call := v_0
29226 if call.Op != OpStaticLECall || len(call.Args) != 2 {
29227 break
29228 }
29229 sym := auxToCall(call.Aux)
29230 x := call.Args[1]
29231 if !(needRaceCleanup(sym, call) && clobber(call)) {
29232 break
29233 }
29234 v.copyOf(x)
29235 return true
29236 }
29237
29238
29239
29240 for {
29241 if auxIntToInt64(v.AuxInt) != 0 {
29242 break
29243 }
29244 call := v_0
29245 if call.Op != OpStaticLECall || len(call.Args) != 1 {
29246 break
29247 }
29248 sym := auxToCall(call.Aux)
29249 x := call.Args[0]
29250 if !(needRaceCleanup(sym, call) && clobber(call)) {
29251 break
29252 }
29253 v.copyOf(x)
29254 return true
29255 }
29256
29257
29258
29259 for {
29260 if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpStaticCall || len(v_0.Args) != 6 {
29261 break
29262 }
29263 sym := auxToCall(v_0.Aux)
29264 _ = v_0.Args[1]
29265 newLen := v_0.Args[1]
29266 if newLen.Op != OpConst64 || !(v.Type.IsInteger() && isSameCall(sym, "runtime.growslice")) {
29267 break
29268 }
29269 v.copyOf(newLen)
29270 return true
29271 }
29272
29273
29274
29275 for {
29276 if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpStaticCall || len(v_0.Args) != 6 {
29277 break
29278 }
29279 sym := auxToCall(v_0.Aux)
29280 _ = v_0.Args[1]
29281 newLen := v_0.Args[1]
29282 if newLen.Op != OpConst32 || !(v.Type.IsInteger() && isSameCall(sym, "runtime.growslice")) {
29283 break
29284 }
29285 v.copyOf(newLen)
29286 return true
29287 }
29288
29289
29290
29291 for {
29292 if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpStaticLECall || len(v_0.Args) != 3 {
29293 break
29294 }
29295 f := auxToCall(v_0.Aux)
29296 _ = v_0.Args[2]
29297 x := v_0.Args[0]
29298 y := v_0.Args[1]
29299 v_0_2 := v_0.Args[2]
29300 if v_0_2.Op != OpSelectN || auxIntToInt64(v_0_2.AuxInt) != 1 {
29301 break
29302 }
29303 c := v_0_2.Args[0]
29304 if c.Op != OpStaticLECall || len(c.Args) != 3 {
29305 break
29306 }
29307 g := auxToCall(c.Aux)
29308 if x != c.Args[0] || y != c.Args[1] || !(isSameCall(f, "runtime.cmpstring") && isSameCall(g, "runtime.cmpstring")) {
29309 break
29310 }
29311 b = c.Block
29312 v0 := b.NewValue0(v.Pos, OpSelectN, typ.Int)
29313 v.copyOf(v0)
29314 v0.AuxInt = int64ToAuxInt(0)
29315 v0.AddArg(c)
29316 return true
29317 }
29318
29319
29320
29321 for {
29322 if auxIntToInt64(v.AuxInt) != 1 {
29323 break
29324 }
29325 c := v_0
29326 if c.Op != OpStaticLECall || len(c.Args) != 3 {
29327 break
29328 }
29329 f := auxToCall(c.Aux)
29330 mem := c.Args[2]
29331 if !(c.Uses == 1 && isSameCall(f, "runtime.cmpstring") && clobber(c)) {
29332 break
29333 }
29334 v.copyOf(mem)
29335 return true
29336 }
29337 return false
29338 }
29339 func rewriteValuegeneric_OpSignExt16to32(v *Value) bool {
29340 v_0 := v.Args[0]
29341
29342
29343 for {
29344 if v_0.Op != OpConst16 {
29345 break
29346 }
29347 c := auxIntToInt16(v_0.AuxInt)
29348 v.reset(OpConst32)
29349 v.AuxInt = int32ToAuxInt(int32(c))
29350 return true
29351 }
29352
29353
29354
29355 for {
29356 if v_0.Op != OpTrunc32to16 {
29357 break
29358 }
29359 x := v_0.Args[0]
29360 if x.Op != OpRsh32x64 {
29361 break
29362 }
29363 _ = x.Args[1]
29364 x_1 := x.Args[1]
29365 if x_1.Op != OpConst64 {
29366 break
29367 }
29368 s := auxIntToInt64(x_1.AuxInt)
29369 if !(s >= 16) {
29370 break
29371 }
29372 v.copyOf(x)
29373 return true
29374 }
29375 return false
29376 }
29377 func rewriteValuegeneric_OpSignExt16to64(v *Value) bool {
29378 v_0 := v.Args[0]
29379
29380
29381 for {
29382 if v_0.Op != OpConst16 {
29383 break
29384 }
29385 c := auxIntToInt16(v_0.AuxInt)
29386 v.reset(OpConst64)
29387 v.AuxInt = int64ToAuxInt(int64(c))
29388 return true
29389 }
29390
29391
29392
29393 for {
29394 if v_0.Op != OpTrunc64to16 {
29395 break
29396 }
29397 x := v_0.Args[0]
29398 if x.Op != OpRsh64x64 {
29399 break
29400 }
29401 _ = x.Args[1]
29402 x_1 := x.Args[1]
29403 if x_1.Op != OpConst64 {
29404 break
29405 }
29406 s := auxIntToInt64(x_1.AuxInt)
29407 if !(s >= 48) {
29408 break
29409 }
29410 v.copyOf(x)
29411 return true
29412 }
29413 return false
29414 }
29415 func rewriteValuegeneric_OpSignExt32to64(v *Value) bool {
29416 v_0 := v.Args[0]
29417
29418
29419 for {
29420 if v_0.Op != OpConst32 {
29421 break
29422 }
29423 c := auxIntToInt32(v_0.AuxInt)
29424 v.reset(OpConst64)
29425 v.AuxInt = int64ToAuxInt(int64(c))
29426 return true
29427 }
29428
29429
29430
29431 for {
29432 if v_0.Op != OpTrunc64to32 {
29433 break
29434 }
29435 x := v_0.Args[0]
29436 if x.Op != OpRsh64x64 {
29437 break
29438 }
29439 _ = x.Args[1]
29440 x_1 := x.Args[1]
29441 if x_1.Op != OpConst64 {
29442 break
29443 }
29444 s := auxIntToInt64(x_1.AuxInt)
29445 if !(s >= 32) {
29446 break
29447 }
29448 v.copyOf(x)
29449 return true
29450 }
29451 return false
29452 }
29453 func rewriteValuegeneric_OpSignExt8to16(v *Value) bool {
29454 v_0 := v.Args[0]
29455
29456
29457 for {
29458 if v_0.Op != OpConst8 {
29459 break
29460 }
29461 c := auxIntToInt8(v_0.AuxInt)
29462 v.reset(OpConst16)
29463 v.AuxInt = int16ToAuxInt(int16(c))
29464 return true
29465 }
29466
29467
29468
29469 for {
29470 if v_0.Op != OpTrunc16to8 {
29471 break
29472 }
29473 x := v_0.Args[0]
29474 if x.Op != OpRsh16x64 {
29475 break
29476 }
29477 _ = x.Args[1]
29478 x_1 := x.Args[1]
29479 if x_1.Op != OpConst64 {
29480 break
29481 }
29482 s := auxIntToInt64(x_1.AuxInt)
29483 if !(s >= 8) {
29484 break
29485 }
29486 v.copyOf(x)
29487 return true
29488 }
29489 return false
29490 }
29491 func rewriteValuegeneric_OpSignExt8to32(v *Value) bool {
29492 v_0 := v.Args[0]
29493
29494
29495 for {
29496 if v_0.Op != OpConst8 {
29497 break
29498 }
29499 c := auxIntToInt8(v_0.AuxInt)
29500 v.reset(OpConst32)
29501 v.AuxInt = int32ToAuxInt(int32(c))
29502 return true
29503 }
29504
29505
29506
29507 for {
29508 if v_0.Op != OpTrunc32to8 {
29509 break
29510 }
29511 x := v_0.Args[0]
29512 if x.Op != OpRsh32x64 {
29513 break
29514 }
29515 _ = x.Args[1]
29516 x_1 := x.Args[1]
29517 if x_1.Op != OpConst64 {
29518 break
29519 }
29520 s := auxIntToInt64(x_1.AuxInt)
29521 if !(s >= 24) {
29522 break
29523 }
29524 v.copyOf(x)
29525 return true
29526 }
29527 return false
29528 }
29529 func rewriteValuegeneric_OpSignExt8to64(v *Value) bool {
29530 v_0 := v.Args[0]
29531
29532
29533 for {
29534 if v_0.Op != OpConst8 {
29535 break
29536 }
29537 c := auxIntToInt8(v_0.AuxInt)
29538 v.reset(OpConst64)
29539 v.AuxInt = int64ToAuxInt(int64(c))
29540 return true
29541 }
29542
29543
29544
29545 for {
29546 if v_0.Op != OpTrunc64to8 {
29547 break
29548 }
29549 x := v_0.Args[0]
29550 if x.Op != OpRsh64x64 {
29551 break
29552 }
29553 _ = x.Args[1]
29554 x_1 := x.Args[1]
29555 if x_1.Op != OpConst64 {
29556 break
29557 }
29558 s := auxIntToInt64(x_1.AuxInt)
29559 if !(s >= 56) {
29560 break
29561 }
29562 v.copyOf(x)
29563 return true
29564 }
29565 return false
29566 }
29567 func rewriteValuegeneric_OpSliceCap(v *Value) bool {
29568 v_0 := v.Args[0]
29569
29570
29571 for {
29572 if v_0.Op != OpSliceMake {
29573 break
29574 }
29575 _ = v_0.Args[2]
29576 v_0_2 := v_0.Args[2]
29577 if v_0_2.Op != OpConst64 {
29578 break
29579 }
29580 t := v_0_2.Type
29581 c := auxIntToInt64(v_0_2.AuxInt)
29582 v.reset(OpConst64)
29583 v.Type = t
29584 v.AuxInt = int64ToAuxInt(c)
29585 return true
29586 }
29587
29588
29589 for {
29590 if v_0.Op != OpSliceMake {
29591 break
29592 }
29593 _ = v_0.Args[2]
29594 v_0_2 := v_0.Args[2]
29595 if v_0_2.Op != OpConst32 {
29596 break
29597 }
29598 t := v_0_2.Type
29599 c := auxIntToInt32(v_0_2.AuxInt)
29600 v.reset(OpConst32)
29601 v.Type = t
29602 v.AuxInt = int32ToAuxInt(c)
29603 return true
29604 }
29605
29606
29607 for {
29608 if v_0.Op != OpSliceMake {
29609 break
29610 }
29611 _ = v_0.Args[2]
29612 v_0_2 := v_0.Args[2]
29613 if v_0_2.Op != OpSliceCap {
29614 break
29615 }
29616 x := v_0_2.Args[0]
29617 v.reset(OpSliceCap)
29618 v.AddArg(x)
29619 return true
29620 }
29621
29622
29623 for {
29624 if v_0.Op != OpSliceMake {
29625 break
29626 }
29627 _ = v_0.Args[2]
29628 v_0_2 := v_0.Args[2]
29629 if v_0_2.Op != OpSliceLen {
29630 break
29631 }
29632 x := v_0_2.Args[0]
29633 v.reset(OpSliceLen)
29634 v.AddArg(x)
29635 return true
29636 }
29637 return false
29638 }
29639 func rewriteValuegeneric_OpSliceLen(v *Value) bool {
29640 v_0 := v.Args[0]
29641
29642
29643 for {
29644 if v_0.Op != OpSliceMake {
29645 break
29646 }
29647 _ = v_0.Args[1]
29648 v_0_1 := v_0.Args[1]
29649 if v_0_1.Op != OpConst64 {
29650 break
29651 }
29652 t := v_0_1.Type
29653 c := auxIntToInt64(v_0_1.AuxInt)
29654 v.reset(OpConst64)
29655 v.Type = t
29656 v.AuxInt = int64ToAuxInt(c)
29657 return true
29658 }
29659
29660
29661 for {
29662 if v_0.Op != OpSliceMake {
29663 break
29664 }
29665 _ = v_0.Args[1]
29666 v_0_1 := v_0.Args[1]
29667 if v_0_1.Op != OpConst32 {
29668 break
29669 }
29670 t := v_0_1.Type
29671 c := auxIntToInt32(v_0_1.AuxInt)
29672 v.reset(OpConst32)
29673 v.Type = t
29674 v.AuxInt = int32ToAuxInt(c)
29675 return true
29676 }
29677
29678
29679 for {
29680 if v_0.Op != OpSliceMake {
29681 break
29682 }
29683 _ = v_0.Args[1]
29684 v_0_1 := v_0.Args[1]
29685 if v_0_1.Op != OpSliceLen {
29686 break
29687 }
29688 x := v_0_1.Args[0]
29689 v.reset(OpSliceLen)
29690 v.AddArg(x)
29691 return true
29692 }
29693
29694
29695
29696 for {
29697 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
29698 break
29699 }
29700 v_0_0 := v_0.Args[0]
29701 if v_0_0.Op != OpStaticLECall || len(v_0_0.Args) != 6 {
29702 break
29703 }
29704 sym := auxToCall(v_0_0.Aux)
29705 _ = v_0_0.Args[1]
29706 newLen := v_0_0.Args[1]
29707 if newLen.Op != OpConst64 || !(isSameCall(sym, "runtime.growslice")) {
29708 break
29709 }
29710 v.copyOf(newLen)
29711 return true
29712 }
29713
29714
29715
29716 for {
29717 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
29718 break
29719 }
29720 v_0_0 := v_0.Args[0]
29721 if v_0_0.Op != OpStaticLECall || len(v_0_0.Args) != 6 {
29722 break
29723 }
29724 sym := auxToCall(v_0_0.Aux)
29725 _ = v_0_0.Args[1]
29726 newLen := v_0_0.Args[1]
29727 if newLen.Op != OpConst32 || !(isSameCall(sym, "runtime.growslice")) {
29728 break
29729 }
29730 v.copyOf(newLen)
29731 return true
29732 }
29733 return false
29734 }
29735 func rewriteValuegeneric_OpSliceMake(v *Value) bool {
29736 v_2 := v.Args[2]
29737 v_1 := v.Args[1]
29738 v_0 := v.Args[0]
29739 b := v.Block
29740
29741
29742
29743 for {
29744 if v_0.Op != OpAddPtr {
29745 break
29746 }
29747 t := v_0.Type
29748 _ = v_0.Args[1]
29749 x := v_0.Args[0]
29750 v_0_1 := v_0.Args[1]
29751 if v_0_1.Op != OpAnd64 {
29752 break
29753 }
29754 _ = v_0_1.Args[1]
29755 v_0_1_0 := v_0_1.Args[0]
29756 v_0_1_1 := v_0_1.Args[1]
29757 for _i0 := 0; _i0 <= 1; _i0, v_0_1_0, v_0_1_1 = _i0+1, v_0_1_1, v_0_1_0 {
29758 y := v_0_1_0
29759 if v_0_1_1.Op != OpSlicemask {
29760 continue
29761 }
29762 w := v_1
29763 if w.Op != OpConst64 {
29764 continue
29765 }
29766 c := auxIntToInt64(w.AuxInt)
29767 z := v_2
29768 if !(c > 0) {
29769 continue
29770 }
29771 v.reset(OpSliceMake)
29772 v0 := b.NewValue0(v.Pos, OpAddPtr, t)
29773 v0.AddArg2(x, y)
29774 v.AddArg3(v0, w, z)
29775 return true
29776 }
29777 break
29778 }
29779
29780
29781
29782 for {
29783 if v_0.Op != OpAddPtr {
29784 break
29785 }
29786 t := v_0.Type
29787 _ = v_0.Args[1]
29788 x := v_0.Args[0]
29789 v_0_1 := v_0.Args[1]
29790 if v_0_1.Op != OpAnd32 {
29791 break
29792 }
29793 _ = v_0_1.Args[1]
29794 v_0_1_0 := v_0_1.Args[0]
29795 v_0_1_1 := v_0_1.Args[1]
29796 for _i0 := 0; _i0 <= 1; _i0, v_0_1_0, v_0_1_1 = _i0+1, v_0_1_1, v_0_1_0 {
29797 y := v_0_1_0
29798 if v_0_1_1.Op != OpSlicemask {
29799 continue
29800 }
29801 w := v_1
29802 if w.Op != OpConst32 {
29803 continue
29804 }
29805 c := auxIntToInt32(w.AuxInt)
29806 z := v_2
29807 if !(c > 0) {
29808 continue
29809 }
29810 v.reset(OpSliceMake)
29811 v0 := b.NewValue0(v.Pos, OpAddPtr, t)
29812 v0.AddArg2(x, y)
29813 v.AddArg3(v0, w, z)
29814 return true
29815 }
29816 break
29817 }
29818 return false
29819 }
29820 func rewriteValuegeneric_OpSlicePtr(v *Value) bool {
29821 v_0 := v.Args[0]
29822
29823
29824 for {
29825 if v_0.Op != OpSliceMake {
29826 break
29827 }
29828 v_0_0 := v_0.Args[0]
29829 if v_0_0.Op != OpSlicePtr {
29830 break
29831 }
29832 x := v_0_0.Args[0]
29833 v.reset(OpSlicePtr)
29834 v.AddArg(x)
29835 return true
29836 }
29837 return false
29838 }
29839 func rewriteValuegeneric_OpSlicemask(v *Value) bool {
29840 v_0 := v.Args[0]
29841
29842
29843
29844 for {
29845 if v_0.Op != OpConst32 {
29846 break
29847 }
29848 x := auxIntToInt32(v_0.AuxInt)
29849 if !(x > 0) {
29850 break
29851 }
29852 v.reset(OpConst32)
29853 v.AuxInt = int32ToAuxInt(-1)
29854 return true
29855 }
29856
29857
29858 for {
29859 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
29860 break
29861 }
29862 v.reset(OpConst32)
29863 v.AuxInt = int32ToAuxInt(0)
29864 return true
29865 }
29866
29867
29868
29869 for {
29870 if v_0.Op != OpConst64 {
29871 break
29872 }
29873 x := auxIntToInt64(v_0.AuxInt)
29874 if !(x > 0) {
29875 break
29876 }
29877 v.reset(OpConst64)
29878 v.AuxInt = int64ToAuxInt(-1)
29879 return true
29880 }
29881
29882
29883 for {
29884 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29885 break
29886 }
29887 v.reset(OpConst64)
29888 v.AuxInt = int64ToAuxInt(0)
29889 return true
29890 }
29891 return false
29892 }
29893 func rewriteValuegeneric_OpSqrt(v *Value) bool {
29894 v_0 := v.Args[0]
29895
29896
29897
29898 for {
29899 if v_0.Op != OpConst64F {
29900 break
29901 }
29902 c := auxIntToFloat64(v_0.AuxInt)
29903 if !(!math.IsNaN(math.Sqrt(c))) {
29904 break
29905 }
29906 v.reset(OpConst64F)
29907 v.AuxInt = float64ToAuxInt(math.Sqrt(c))
29908 return true
29909 }
29910 return false
29911 }
29912 func rewriteValuegeneric_OpStaticCall(v *Value) bool {
29913 b := v.Block
29914 typ := &b.Func.Config.Types
29915
29916
29917
29918 for {
29919 if len(v.Args) != 4 {
29920 break
29921 }
29922 callAux := auxToCall(v.Aux)
29923 mem := v.Args[3]
29924 p := v.Args[0]
29925 q := v.Args[1]
29926 if !(isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)) {
29927 break
29928 }
29929 v.reset(OpMakeResult)
29930 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
29931 v0.AuxInt = boolToAuxInt(true)
29932 v.AddArg2(v0, mem)
29933 return true
29934 }
29935 return false
29936 }
29937 func rewriteValuegeneric_OpStaticLECall(v *Value) bool {
29938 b := v.Block
29939 config := b.Func.Config
29940 typ := &b.Func.Config.Types
29941
29942
29943
29944 for {
29945 if len(v.Args) != 4 {
29946 break
29947 }
29948 callAux := auxToCall(v.Aux)
29949 mem := v.Args[3]
29950 sptr := v.Args[0]
29951 v_1 := v.Args[1]
29952 if v_1.Op != OpAddr {
29953 break
29954 }
29955 scon := auxToSym(v_1.Aux)
29956 v_1_0 := v_1.Args[0]
29957 if v_1_0.Op != OpSB {
29958 break
29959 }
29960 v_2 := v.Args[2]
29961 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon)) {
29962 break
29963 }
29964 v.reset(OpMakeResult)
29965 v0 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
29966 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
29967 v1.AddArg2(sptr, mem)
29968 v2 := b.NewValue0(v.Pos, OpConst8, typ.Int8)
29969 v2.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
29970 v0.AddArg2(v1, v2)
29971 v.AddArg2(v0, mem)
29972 return true
29973 }
29974
29975
29976
29977 for {
29978 if len(v.Args) != 4 {
29979 break
29980 }
29981 callAux := auxToCall(v.Aux)
29982 mem := v.Args[3]
29983 v_0 := v.Args[0]
29984 if v_0.Op != OpAddr {
29985 break
29986 }
29987 scon := auxToSym(v_0.Aux)
29988 v_0_0 := v_0.Args[0]
29989 if v_0_0.Op != OpSB {
29990 break
29991 }
29992 sptr := v.Args[1]
29993 v_2 := v.Args[2]
29994 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon)) {
29995 break
29996 }
29997 v.reset(OpMakeResult)
29998 v0 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
29999 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
30000 v1.AddArg2(sptr, mem)
30001 v2 := b.NewValue0(v.Pos, OpConst8, typ.Int8)
30002 v2.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
30003 v0.AddArg2(v1, v2)
30004 v.AddArg2(v0, mem)
30005 return true
30006 }
30007
30008
30009
30010 for {
30011 if len(v.Args) != 4 {
30012 break
30013 }
30014 callAux := auxToCall(v.Aux)
30015 mem := v.Args[3]
30016 sptr := v.Args[0]
30017 v_1 := v.Args[1]
30018 if v_1.Op != OpAddr {
30019 break
30020 }
30021 scon := auxToSym(v_1.Aux)
30022 v_1_0 := v_1.Args[0]
30023 if v_1_0.Op != OpSB {
30024 break
30025 }
30026 v_2 := v.Args[2]
30027 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
30028 break
30029 }
30030 v.reset(OpMakeResult)
30031 v0 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
30032 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
30033 v1.AddArg2(sptr, mem)
30034 v2 := b.NewValue0(v.Pos, OpConst16, typ.Int16)
30035 v2.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
30036 v0.AddArg2(v1, v2)
30037 v.AddArg2(v0, mem)
30038 return true
30039 }
30040
30041
30042
30043 for {
30044 if len(v.Args) != 4 {
30045 break
30046 }
30047 callAux := auxToCall(v.Aux)
30048 mem := v.Args[3]
30049 v_0 := v.Args[0]
30050 if v_0.Op != OpAddr {
30051 break
30052 }
30053 scon := auxToSym(v_0.Aux)
30054 v_0_0 := v_0.Args[0]
30055 if v_0_0.Op != OpSB {
30056 break
30057 }
30058 sptr := v.Args[1]
30059 v_2 := v.Args[2]
30060 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
30061 break
30062 }
30063 v.reset(OpMakeResult)
30064 v0 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
30065 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
30066 v1.AddArg2(sptr, mem)
30067 v2 := b.NewValue0(v.Pos, OpConst16, typ.Int16)
30068 v2.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
30069 v0.AddArg2(v1, v2)
30070 v.AddArg2(v0, mem)
30071 return true
30072 }
30073
30074
30075
30076 for {
30077 if len(v.Args) != 4 {
30078 break
30079 }
30080 callAux := auxToCall(v.Aux)
30081 mem := v.Args[3]
30082 sptr := v.Args[0]
30083 v_1 := v.Args[1]
30084 if v_1.Op != OpAddr {
30085 break
30086 }
30087 scon := auxToSym(v_1.Aux)
30088 v_1_0 := v_1.Args[0]
30089 if v_1_0.Op != OpSB {
30090 break
30091 }
30092 v_2 := v.Args[2]
30093 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
30094 break
30095 }
30096 v.reset(OpMakeResult)
30097 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
30098 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
30099 v1.AddArg2(sptr, mem)
30100 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
30101 v2.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
30102 v0.AddArg2(v1, v2)
30103 v.AddArg2(v0, mem)
30104 return true
30105 }
30106
30107
30108
30109 for {
30110 if len(v.Args) != 4 {
30111 break
30112 }
30113 callAux := auxToCall(v.Aux)
30114 mem := v.Args[3]
30115 v_0 := v.Args[0]
30116 if v_0.Op != OpAddr {
30117 break
30118 }
30119 scon := auxToSym(v_0.Aux)
30120 v_0_0 := v_0.Args[0]
30121 if v_0_0.Op != OpSB {
30122 break
30123 }
30124 sptr := v.Args[1]
30125 v_2 := v.Args[2]
30126 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
30127 break
30128 }
30129 v.reset(OpMakeResult)
30130 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
30131 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
30132 v1.AddArg2(sptr, mem)
30133 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
30134 v2.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
30135 v0.AddArg2(v1, v2)
30136 v.AddArg2(v0, mem)
30137 return true
30138 }
30139
30140
30141
30142 for {
30143 if len(v.Args) != 4 {
30144 break
30145 }
30146 callAux := auxToCall(v.Aux)
30147 mem := v.Args[3]
30148 sptr := v.Args[0]
30149 v_1 := v.Args[1]
30150 if v_1.Op != OpAddr {
30151 break
30152 }
30153 scon := auxToSym(v_1.Aux)
30154 v_1_0 := v_1.Args[0]
30155 if v_1_0.Op != OpSB {
30156 break
30157 }
30158 v_2 := v.Args[2]
30159 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
30160 break
30161 }
30162 v.reset(OpMakeResult)
30163 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
30164 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
30165 v1.AddArg2(sptr, mem)
30166 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
30167 v2.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
30168 v0.AddArg2(v1, v2)
30169 v.AddArg2(v0, mem)
30170 return true
30171 }
30172
30173
30174
30175 for {
30176 if len(v.Args) != 4 {
30177 break
30178 }
30179 callAux := auxToCall(v.Aux)
30180 mem := v.Args[3]
30181 v_0 := v.Args[0]
30182 if v_0.Op != OpAddr {
30183 break
30184 }
30185 scon := auxToSym(v_0.Aux)
30186 v_0_0 := v_0.Args[0]
30187 if v_0_0.Op != OpSB {
30188 break
30189 }
30190 sptr := v.Args[1]
30191 v_2 := v.Args[2]
30192 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
30193 break
30194 }
30195 v.reset(OpMakeResult)
30196 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
30197 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
30198 v1.AddArg2(sptr, mem)
30199 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
30200 v2.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
30201 v0.AddArg2(v1, v2)
30202 v.AddArg2(v0, mem)
30203 return true
30204 }
30205
30206
30207
30208 for {
30209 if len(v.Args) != 4 {
30210 break
30211 }
30212 callAux := auxToCall(v.Aux)
30213 mem := v.Args[3]
30214 sptr := v.Args[0]
30215 v_1 := v.Args[1]
30216 if v_1.Op != OpAddr {
30217 break
30218 }
30219 scon := auxToSym(v_1.Aux)
30220 v_1_0 := v_1.Args[0]
30221 if v_1_0.Op != OpSB {
30222 break
30223 }
30224 v_2 := v.Args[2]
30225 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 3 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
30226 break
30227 }
30228 v.reset(OpMakeResult)
30229 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
30230 v1 := b.NewValue0(v.Pos, OpOr32, typ.Int32)
30231 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.Int32)
30232 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
30233 v3.AddArg2(sptr, mem)
30234 v2.AddArg(v3)
30235 v4 := b.NewValue0(v.Pos, OpLsh32x32, typ.Int32)
30236 v5 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.Int32)
30237 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
30238 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
30239 v7.AuxInt = int64ToAuxInt(2)
30240 v7.AddArg(sptr)
30241 v6.AddArg2(v7, mem)
30242 v5.AddArg(v6)
30243 v8 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
30244 v8.AuxInt = int32ToAuxInt(16)
30245 v4.AddArg2(v5, v8)
30246 v1.AddArg2(v2, v4)
30247 v9 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
30248 v9.AuxInt = int32ToAuxInt(int32(uint32(read16(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint32(read8(scon, 2)) << 16)))
30249 v0.AddArg2(v1, v9)
30250 v.AddArg2(v0, mem)
30251 return true
30252 }
30253
30254
30255
30256 for {
30257 if len(v.Args) != 4 {
30258 break
30259 }
30260 callAux := auxToCall(v.Aux)
30261 mem := v.Args[3]
30262 v_0 := v.Args[0]
30263 if v_0.Op != OpAddr {
30264 break
30265 }
30266 scon := auxToSym(v_0.Aux)
30267 v_0_0 := v_0.Args[0]
30268 if v_0_0.Op != OpSB {
30269 break
30270 }
30271 sptr := v.Args[1]
30272 v_2 := v.Args[2]
30273 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 3 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
30274 break
30275 }
30276 v.reset(OpMakeResult)
30277 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
30278 v1 := b.NewValue0(v.Pos, OpOr32, typ.Int32)
30279 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.Int32)
30280 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
30281 v3.AddArg2(sptr, mem)
30282 v2.AddArg(v3)
30283 v4 := b.NewValue0(v.Pos, OpLsh32x32, typ.Int32)
30284 v5 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.Int32)
30285 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
30286 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
30287 v7.AuxInt = int64ToAuxInt(2)
30288 v7.AddArg(sptr)
30289 v6.AddArg2(v7, mem)
30290 v5.AddArg(v6)
30291 v8 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
30292 v8.AuxInt = int32ToAuxInt(16)
30293 v4.AddArg2(v5, v8)
30294 v1.AddArg2(v2, v4)
30295 v9 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
30296 v9.AuxInt = int32ToAuxInt(int32(uint32(read16(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint32(read8(scon, 2)) << 16)))
30297 v0.AddArg2(v1, v9)
30298 v.AddArg2(v0, mem)
30299 return true
30300 }
30301
30302
30303
30304 for {
30305 if len(v.Args) != 4 {
30306 break
30307 }
30308 callAux := auxToCall(v.Aux)
30309 mem := v.Args[3]
30310 sptr := v.Args[0]
30311 v_1 := v.Args[1]
30312 if v_1.Op != OpAddr {
30313 break
30314 }
30315 scon := auxToSym(v_1.Aux)
30316 v_1_0 := v_1.Args[0]
30317 if v_1_0.Op != OpSB {
30318 break
30319 }
30320 v_2 := v.Args[2]
30321 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 5 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
30322 break
30323 }
30324 v.reset(OpMakeResult)
30325 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
30326 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
30327 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
30328 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
30329 v3.AddArg2(sptr, mem)
30330 v2.AddArg(v3)
30331 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
30332 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.Int64)
30333 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
30334 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
30335 v7.AuxInt = int64ToAuxInt(4)
30336 v7.AddArg(sptr)
30337 v6.AddArg2(v7, mem)
30338 v5.AddArg(v6)
30339 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
30340 v8.AuxInt = int64ToAuxInt(32)
30341 v4.AddArg2(v5, v8)
30342 v1.AddArg2(v2, v4)
30343 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
30344 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read8(scon, 4)) << 32)))
30345 v0.AddArg2(v1, v9)
30346 v.AddArg2(v0, mem)
30347 return true
30348 }
30349
30350
30351
30352 for {
30353 if len(v.Args) != 4 {
30354 break
30355 }
30356 callAux := auxToCall(v.Aux)
30357 mem := v.Args[3]
30358 v_0 := v.Args[0]
30359 if v_0.Op != OpAddr {
30360 break
30361 }
30362 scon := auxToSym(v_0.Aux)
30363 v_0_0 := v_0.Args[0]
30364 if v_0_0.Op != OpSB {
30365 break
30366 }
30367 sptr := v.Args[1]
30368 v_2 := v.Args[2]
30369 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 5 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
30370 break
30371 }
30372 v.reset(OpMakeResult)
30373 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
30374 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
30375 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
30376 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
30377 v3.AddArg2(sptr, mem)
30378 v2.AddArg(v3)
30379 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
30380 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.Int64)
30381 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
30382 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
30383 v7.AuxInt = int64ToAuxInt(4)
30384 v7.AddArg(sptr)
30385 v6.AddArg2(v7, mem)
30386 v5.AddArg(v6)
30387 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
30388 v8.AuxInt = int64ToAuxInt(32)
30389 v4.AddArg2(v5, v8)
30390 v1.AddArg2(v2, v4)
30391 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
30392 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read8(scon, 4)) << 32)))
30393 v0.AddArg2(v1, v9)
30394 v.AddArg2(v0, mem)
30395 return true
30396 }
30397
30398
30399
30400 for {
30401 if len(v.Args) != 4 {
30402 break
30403 }
30404 callAux := auxToCall(v.Aux)
30405 mem := v.Args[3]
30406 sptr := v.Args[0]
30407 v_1 := v.Args[1]
30408 if v_1.Op != OpAddr {
30409 break
30410 }
30411 scon := auxToSym(v_1.Aux)
30412 v_1_0 := v_1.Args[0]
30413 if v_1_0.Op != OpSB {
30414 break
30415 }
30416 v_2 := v.Args[2]
30417 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 6 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
30418 break
30419 }
30420 v.reset(OpMakeResult)
30421 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
30422 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
30423 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
30424 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
30425 v3.AddArg2(sptr, mem)
30426 v2.AddArg(v3)
30427 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
30428 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.Int64)
30429 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
30430 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
30431 v7.AuxInt = int64ToAuxInt(4)
30432 v7.AddArg(sptr)
30433 v6.AddArg2(v7, mem)
30434 v5.AddArg(v6)
30435 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
30436 v8.AuxInt = int64ToAuxInt(32)
30437 v4.AddArg2(v5, v8)
30438 v1.AddArg2(v2, v4)
30439 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
30440 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read16(scon, 4, config.ctxt.Arch.ByteOrder)) << 32)))
30441 v0.AddArg2(v1, v9)
30442 v.AddArg2(v0, mem)
30443 return true
30444 }
30445
30446
30447
30448 for {
30449 if len(v.Args) != 4 {
30450 break
30451 }
30452 callAux := auxToCall(v.Aux)
30453 mem := v.Args[3]
30454 v_0 := v.Args[0]
30455 if v_0.Op != OpAddr {
30456 break
30457 }
30458 scon := auxToSym(v_0.Aux)
30459 v_0_0 := v_0.Args[0]
30460 if v_0_0.Op != OpSB {
30461 break
30462 }
30463 sptr := v.Args[1]
30464 v_2 := v.Args[2]
30465 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 6 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
30466 break
30467 }
30468 v.reset(OpMakeResult)
30469 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
30470 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
30471 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
30472 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
30473 v3.AddArg2(sptr, mem)
30474 v2.AddArg(v3)
30475 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
30476 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.Int64)
30477 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
30478 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
30479 v7.AuxInt = int64ToAuxInt(4)
30480 v7.AddArg(sptr)
30481 v6.AddArg2(v7, mem)
30482 v5.AddArg(v6)
30483 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
30484 v8.AuxInt = int64ToAuxInt(32)
30485 v4.AddArg2(v5, v8)
30486 v1.AddArg2(v2, v4)
30487 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
30488 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read16(scon, 4, config.ctxt.Arch.ByteOrder)) << 32)))
30489 v0.AddArg2(v1, v9)
30490 v.AddArg2(v0, mem)
30491 return true
30492 }
30493
30494
30495
30496 for {
30497 if len(v.Args) != 4 {
30498 break
30499 }
30500 callAux := auxToCall(v.Aux)
30501 mem := v.Args[3]
30502 sptr := v.Args[0]
30503 v_1 := v.Args[1]
30504 if v_1.Op != OpAddr {
30505 break
30506 }
30507 scon := auxToSym(v_1.Aux)
30508 v_1_0 := v_1.Args[0]
30509 if v_1_0.Op != OpSB {
30510 break
30511 }
30512 v_2 := v.Args[2]
30513 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 7 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
30514 break
30515 }
30516 v.reset(OpMakeResult)
30517 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
30518 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
30519 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
30520 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
30521 v3.AddArg2(sptr, mem)
30522 v2.AddArg(v3)
30523 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
30524 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
30525 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
30526 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
30527 v7.AuxInt = int64ToAuxInt(3)
30528 v7.AddArg(sptr)
30529 v6.AddArg2(v7, mem)
30530 v5.AddArg(v6)
30531 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
30532 v8.AuxInt = int64ToAuxInt(32)
30533 v4.AddArg2(v5, v8)
30534 v1.AddArg2(v2, v4)
30535 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
30536 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read32(scon, 3, config.ctxt.Arch.ByteOrder)) << 32)))
30537 v0.AddArg2(v1, v9)
30538 v.AddArg2(v0, mem)
30539 return true
30540 }
30541
30542
30543
30544 for {
30545 if len(v.Args) != 4 {
30546 break
30547 }
30548 callAux := auxToCall(v.Aux)
30549 mem := v.Args[3]
30550 v_0 := v.Args[0]
30551 if v_0.Op != OpAddr {
30552 break
30553 }
30554 scon := auxToSym(v_0.Aux)
30555 v_0_0 := v_0.Args[0]
30556 if v_0_0.Op != OpSB {
30557 break
30558 }
30559 sptr := v.Args[1]
30560 v_2 := v.Args[2]
30561 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 7 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
30562 break
30563 }
30564 v.reset(OpMakeResult)
30565 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
30566 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
30567 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
30568 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
30569 v3.AddArg2(sptr, mem)
30570 v2.AddArg(v3)
30571 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
30572 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
30573 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
30574 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
30575 v7.AuxInt = int64ToAuxInt(3)
30576 v7.AddArg(sptr)
30577 v6.AddArg2(v7, mem)
30578 v5.AddArg(v6)
30579 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
30580 v8.AuxInt = int64ToAuxInt(32)
30581 v4.AddArg2(v5, v8)
30582 v1.AddArg2(v2, v4)
30583 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
30584 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read32(scon, 3, config.ctxt.Arch.ByteOrder)) << 32)))
30585 v0.AddArg2(v1, v9)
30586 v.AddArg2(v0, mem)
30587 return true
30588 }
30589
30590
30591
30592 for {
30593 if len(v.Args) != 4 {
30594 break
30595 }
30596 callAux := auxToCall(v.Aux)
30597 mem := v.Args[3]
30598 v_2 := v.Args[2]
30599 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.memequal")) {
30600 break
30601 }
30602 v.reset(OpMakeResult)
30603 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
30604 v0.AuxInt = boolToAuxInt(true)
30605 v.AddArg2(v0, mem)
30606 return true
30607 }
30608
30609
30610
30611 for {
30612 if len(v.Args) != 4 {
30613 break
30614 }
30615 callAux := auxToCall(v.Aux)
30616 mem := v.Args[3]
30617 p := v.Args[0]
30618 q := v.Args[1]
30619 if !(isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)) {
30620 break
30621 }
30622 v.reset(OpMakeResult)
30623 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
30624 v0.AuxInt = boolToAuxInt(true)
30625 v.AddArg2(v0, mem)
30626 return true
30627 }
30628
30629
30630
30631 for {
30632 if len(v.Args) != 4 {
30633 break
30634 }
30635 callAux := auxToCall(v.Aux)
30636 mem := v.Args[3]
30637 v_1 := v.Args[1]
30638 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
30639 break
30640 }
30641 v_2 := v.Args[2]
30642 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.makeslice")) {
30643 break
30644 }
30645 v.reset(OpMakeResult)
30646 v0 := b.NewValue0(v.Pos, OpAddr, v.Type.FieldType(0))
30647 v0.Aux = symToAux(ir.Syms.Zerobase)
30648 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
30649 v0.AddArg(v1)
30650 v.AddArg2(v0, mem)
30651 return true
30652 }
30653
30654
30655
30656 for {
30657 if len(v.Args) != 4 {
30658 break
30659 }
30660 callAux := auxToCall(v.Aux)
30661 mem := v.Args[3]
30662 v_1 := v.Args[1]
30663 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
30664 break
30665 }
30666 v_2 := v.Args[2]
30667 if v_2.Op != OpConst32 || auxIntToInt32(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.makeslice")) {
30668 break
30669 }
30670 v.reset(OpMakeResult)
30671 v0 := b.NewValue0(v.Pos, OpAddr, v.Type.FieldType(0))
30672 v0.Aux = symToAux(ir.Syms.Zerobase)
30673 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
30674 v0.AddArg(v1)
30675 v.AddArg2(v0, mem)
30676 return true
30677 }
30678
30679
30680
30681 for {
30682 if len(v.Args) != 4 {
30683 break
30684 }
30685 f := auxToCall(v.Aux)
30686 mem := v.Args[3]
30687 typ_ := v.Args[0]
30688 x := v.Args[1]
30689 y := v.Args[2]
30690 if !(isSameCall(f, "runtime.efaceeq") && isDirectAndComparableType(typ_) && clobber(v)) {
30691 break
30692 }
30693 v.reset(OpMakeResult)
30694 v0 := b.NewValue0(v.Pos, OpEqPtr, typ.Bool)
30695 v0.AddArg2(x, y)
30696 v.AddArg2(v0, mem)
30697 return true
30698 }
30699
30700
30701
30702 for {
30703 if len(v.Args) != 4 {
30704 break
30705 }
30706 f := auxToCall(v.Aux)
30707 mem := v.Args[3]
30708 itab := v.Args[0]
30709 x := v.Args[1]
30710 y := v.Args[2]
30711 if !(isSameCall(f, "runtime.ifaceeq") && isDirectAndComparableIface(itab) && clobber(v)) {
30712 break
30713 }
30714 v.reset(OpMakeResult)
30715 v0 := b.NewValue0(v.Pos, OpEqPtr, typ.Bool)
30716 v0.AddArg2(x, y)
30717 v.AddArg2(v0, mem)
30718 return true
30719 }
30720
30721
30722
30723 for {
30724 if len(v.Args) != 4 {
30725 break
30726 }
30727 argsize := auxIntToInt32(v.AuxInt)
30728 f := auxToCall(v.Aux)
30729 _ = v.Args[3]
30730 typ_ := v.Args[0]
30731 map_ := v.Args[1]
30732 key := v.Args[2]
30733 if key.Op != OpSelectN || auxIntToInt64(key.AuxInt) != 0 {
30734 break
30735 }
30736 sbts := key.Args[0]
30737 if sbts.Op != OpStaticLECall || len(sbts.Args) != 4 {
30738 break
30739 }
30740 g := auxToCall(sbts.Aux)
30741 mem := sbts.Args[3]
30742 ptr := sbts.Args[1]
30743 len := sbts.Args[2]
30744 m := v.Args[3]
30745 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)) {
30746 break
30747 }
30748 v.reset(OpStaticLECall)
30749 v.AuxInt = int32ToAuxInt(argsize)
30750 v.Aux = callToAux(f)
30751 v0 := b.NewValue0(v.Pos, OpStringMake, typ.String)
30752 v0.AddArg2(ptr, len)
30753 v.AddArg4(typ_, map_, v0, mem)
30754 return true
30755 }
30756
30757
30758
30759 for {
30760 if len(v.Args) != 3 {
30761 break
30762 }
30763 argsize := auxIntToInt32(v.AuxInt)
30764 f := auxToCall(v.Aux)
30765 _ = v.Args[2]
30766 dict_ := v.Args[0]
30767 key := v.Args[1]
30768 if key.Op != OpSelectN || auxIntToInt64(key.AuxInt) != 0 {
30769 break
30770 }
30771 sbts := key.Args[0]
30772 if sbts.Op != OpStaticLECall || len(sbts.Args) != 4 {
30773 break
30774 }
30775 g := auxToCall(sbts.Aux)
30776 mem := sbts.Args[3]
30777 ptr := sbts.Args[1]
30778 len := sbts.Args[2]
30779 m := v.Args[2]
30780 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)) {
30781 break
30782 }
30783 v.reset(OpStaticLECall)
30784 v.AuxInt = int32ToAuxInt(argsize)
30785 v.Aux = callToAux(f)
30786 v0 := b.NewValue0(v.Pos, OpStringMake, typ.String)
30787 v0.AddArg2(ptr, len)
30788 v.AddArg3(dict_, v0, mem)
30789 return true
30790 }
30791 return false
30792 }
30793 func rewriteValuegeneric_OpStore(v *Value) bool {
30794 v_2 := v.Args[2]
30795 v_1 := v.Args[1]
30796 v_0 := v.Args[0]
30797 b := v.Block
30798
30799
30800
30801 for {
30802 t1 := auxToType(v.Aux)
30803 p1 := v_0
30804 if v_1.Op != OpLoad {
30805 break
30806 }
30807 t2 := v_1.Type
30808 mem := v_1.Args[1]
30809 p2 := v_1.Args[0]
30810 if mem != v_2 || !(isSamePtr(p1, p2) && t2.Size() == t1.Size()) {
30811 break
30812 }
30813 v.copyOf(mem)
30814 return true
30815 }
30816
30817
30818
30819 for {
30820 t1 := auxToType(v.Aux)
30821 p1 := v_0
30822 if v_1.Op != OpLoad {
30823 break
30824 }
30825 t2 := v_1.Type
30826 oldmem := v_1.Args[1]
30827 p2 := v_1.Args[0]
30828 mem := v_2
30829 if mem.Op != OpStore {
30830 break
30831 }
30832 t3 := auxToType(mem.Aux)
30833 _ = mem.Args[2]
30834 p3 := mem.Args[0]
30835 if oldmem != mem.Args[2] || !(isSamePtr(p1, p2) && t2.Size() == t1.Size() && disjoint(p1, t1.Size(), p3, t3.Size())) {
30836 break
30837 }
30838 v.copyOf(mem)
30839 return true
30840 }
30841
30842
30843
30844 for {
30845 t1 := auxToType(v.Aux)
30846 p1 := v_0
30847 if v_1.Op != OpLoad {
30848 break
30849 }
30850 t2 := v_1.Type
30851 oldmem := v_1.Args[1]
30852 p2 := v_1.Args[0]
30853 mem := v_2
30854 if mem.Op != OpStore {
30855 break
30856 }
30857 t3 := auxToType(mem.Aux)
30858 _ = mem.Args[2]
30859 p3 := mem.Args[0]
30860 mem_2 := mem.Args[2]
30861 if mem_2.Op != OpStore {
30862 break
30863 }
30864 t4 := auxToType(mem_2.Aux)
30865 _ = mem_2.Args[2]
30866 p4 := mem_2.Args[0]
30867 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())) {
30868 break
30869 }
30870 v.copyOf(mem)
30871 return true
30872 }
30873
30874
30875
30876 for {
30877 t1 := auxToType(v.Aux)
30878 p1 := v_0
30879 if v_1.Op != OpLoad {
30880 break
30881 }
30882 t2 := v_1.Type
30883 oldmem := v_1.Args[1]
30884 p2 := v_1.Args[0]
30885 mem := v_2
30886 if mem.Op != OpStore {
30887 break
30888 }
30889 t3 := auxToType(mem.Aux)
30890 _ = mem.Args[2]
30891 p3 := mem.Args[0]
30892 mem_2 := mem.Args[2]
30893 if mem_2.Op != OpStore {
30894 break
30895 }
30896 t4 := auxToType(mem_2.Aux)
30897 _ = mem_2.Args[2]
30898 p4 := mem_2.Args[0]
30899 mem_2_2 := mem_2.Args[2]
30900 if mem_2_2.Op != OpStore {
30901 break
30902 }
30903 t5 := auxToType(mem_2_2.Aux)
30904 _ = mem_2_2.Args[2]
30905 p5 := mem_2_2.Args[0]
30906 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())) {
30907 break
30908 }
30909 v.copyOf(mem)
30910 return true
30911 }
30912
30913
30914
30915 for {
30916 t := auxToType(v.Aux)
30917 if v_0.Op != OpOffPtr {
30918 break
30919 }
30920 o := auxIntToInt64(v_0.AuxInt)
30921 p1 := v_0.Args[0]
30922 x := v_1
30923 mem := v_2
30924 if mem.Op != OpZero {
30925 break
30926 }
30927 n := auxIntToInt64(mem.AuxInt)
30928 p2 := mem.Args[0]
30929 if !(isConstZero(x) && o >= 0 && t.Size()+o <= n && isSamePtr(p1, p2)) {
30930 break
30931 }
30932 v.copyOf(mem)
30933 return true
30934 }
30935
30936
30937
30938 for {
30939 t1 := auxToType(v.Aux)
30940 op := v_0
30941 if op.Op != OpOffPtr {
30942 break
30943 }
30944 o1 := auxIntToInt64(op.AuxInt)
30945 p1 := op.Args[0]
30946 x := v_1
30947 mem := v_2
30948 if mem.Op != OpStore {
30949 break
30950 }
30951 t2 := auxToType(mem.Aux)
30952 _ = mem.Args[2]
30953 p2 := mem.Args[0]
30954 mem_2 := mem.Args[2]
30955 if mem_2.Op != OpZero {
30956 break
30957 }
30958 n := auxIntToInt64(mem_2.AuxInt)
30959 p3 := mem_2.Args[0]
30960 if !(isConstZero(x) && o1 >= 0 && t1.Size()+o1 <= n && isSamePtr(p1, p3) && disjoint(op, t1.Size(), p2, t2.Size())) {
30961 break
30962 }
30963 v.copyOf(mem)
30964 return true
30965 }
30966
30967
30968
30969 for {
30970 t1 := auxToType(v.Aux)
30971 op := v_0
30972 if op.Op != OpOffPtr {
30973 break
30974 }
30975 o1 := auxIntToInt64(op.AuxInt)
30976 p1 := op.Args[0]
30977 x := v_1
30978 mem := v_2
30979 if mem.Op != OpStore {
30980 break
30981 }
30982 t2 := auxToType(mem.Aux)
30983 _ = mem.Args[2]
30984 p2 := mem.Args[0]
30985 mem_2 := mem.Args[2]
30986 if mem_2.Op != OpStore {
30987 break
30988 }
30989 t3 := auxToType(mem_2.Aux)
30990 _ = mem_2.Args[2]
30991 p3 := mem_2.Args[0]
30992 mem_2_2 := mem_2.Args[2]
30993 if mem_2_2.Op != OpZero {
30994 break
30995 }
30996 n := auxIntToInt64(mem_2_2.AuxInt)
30997 p4 := mem_2_2.Args[0]
30998 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())) {
30999 break
31000 }
31001 v.copyOf(mem)
31002 return true
31003 }
31004
31005
31006
31007 for {
31008 t1 := auxToType(v.Aux)
31009 op := v_0
31010 if op.Op != OpOffPtr {
31011 break
31012 }
31013 o1 := auxIntToInt64(op.AuxInt)
31014 p1 := op.Args[0]
31015 x := v_1
31016 mem := v_2
31017 if mem.Op != OpStore {
31018 break
31019 }
31020 t2 := auxToType(mem.Aux)
31021 _ = mem.Args[2]
31022 p2 := mem.Args[0]
31023 mem_2 := mem.Args[2]
31024 if mem_2.Op != OpStore {
31025 break
31026 }
31027 t3 := auxToType(mem_2.Aux)
31028 _ = mem_2.Args[2]
31029 p3 := mem_2.Args[0]
31030 mem_2_2 := mem_2.Args[2]
31031 if mem_2_2.Op != OpStore {
31032 break
31033 }
31034 t4 := auxToType(mem_2_2.Aux)
31035 _ = mem_2_2.Args[2]
31036 p4 := mem_2_2.Args[0]
31037 mem_2_2_2 := mem_2_2.Args[2]
31038 if mem_2_2_2.Op != OpZero {
31039 break
31040 }
31041 n := auxIntToInt64(mem_2_2_2.AuxInt)
31042 p5 := mem_2_2_2.Args[0]
31043 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())) {
31044 break
31045 }
31046 v.copyOf(mem)
31047 return true
31048 }
31049
31050
31051 for {
31052 if v_1.Op != OpStructMake {
31053 break
31054 }
31055 v.copyOf(rewriteStructStore(v))
31056 return true
31057 }
31058
31059
31060
31061 for {
31062 t := auxToType(v.Aux)
31063 dst := v_0
31064 if v_1.Op != OpLoad {
31065 break
31066 }
31067 mem := v_1.Args[1]
31068 src := v_1.Args[0]
31069 if mem != v_2 || !(!CanSSA(t)) {
31070 break
31071 }
31072 v.reset(OpMove)
31073 v.AuxInt = int64ToAuxInt(t.Size())
31074 v.Aux = typeToAux(t)
31075 v.AddArg3(dst, src, mem)
31076 return true
31077 }
31078
31079
31080
31081 for {
31082 t := auxToType(v.Aux)
31083 dst := v_0
31084 if v_1.Op != OpLoad {
31085 break
31086 }
31087 mem := v_1.Args[1]
31088 src := v_1.Args[0]
31089 if v_2.Op != OpVarDef {
31090 break
31091 }
31092 x := auxToSym(v_2.Aux)
31093 if mem != v_2.Args[0] || !(!CanSSA(t)) {
31094 break
31095 }
31096 v.reset(OpMove)
31097 v.AuxInt = int64ToAuxInt(t.Size())
31098 v.Aux = typeToAux(t)
31099 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
31100 v0.Aux = symToAux(x)
31101 v0.AddArg(mem)
31102 v.AddArg3(dst, src, v0)
31103 return true
31104 }
31105
31106
31107 for {
31108 if v_1.Op != OpArrayMake0 {
31109 break
31110 }
31111 mem := v_2
31112 v.copyOf(mem)
31113 return true
31114 }
31115
31116
31117 for {
31118 dst := v_0
31119 if v_1.Op != OpArrayMake1 {
31120 break
31121 }
31122 e := v_1.Args[0]
31123 mem := v_2
31124 v.reset(OpStore)
31125 v.Aux = typeToAux(e.Type)
31126 v.AddArg3(dst, e, mem)
31127 return true
31128 }
31129
31130
31131
31132 for {
31133 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
31134 break
31135 }
31136 call := v_0.Args[0]
31137 if call.Op != OpStaticLECall {
31138 break
31139 }
31140 x := v_1
31141 mem := v_2
31142 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isConstZero(x) && isMalloc(call.Aux)) {
31143 break
31144 }
31145 v.copyOf(mem)
31146 return true
31147 }
31148
31149
31150
31151 for {
31152 if v_0.Op != OpOffPtr {
31153 break
31154 }
31155 v_0_0 := v_0.Args[0]
31156 if v_0_0.Op != OpSelectN || auxIntToInt64(v_0_0.AuxInt) != 0 {
31157 break
31158 }
31159 call := v_0_0.Args[0]
31160 if call.Op != OpStaticLECall {
31161 break
31162 }
31163 x := v_1
31164 mem := v_2
31165 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isConstZero(x) && isMalloc(call.Aux)) {
31166 break
31167 }
31168 v.copyOf(mem)
31169 return true
31170 }
31171
31172
31173
31174 for {
31175 t1 := auxToType(v.Aux)
31176 op1 := v_0
31177 if op1.Op != OpOffPtr {
31178 break
31179 }
31180 o1 := auxIntToInt64(op1.AuxInt)
31181 p1 := op1.Args[0]
31182 d1 := v_1
31183 m2 := v_2
31184 if m2.Op != OpStore {
31185 break
31186 }
31187 t2 := auxToType(m2.Aux)
31188 _ = m2.Args[2]
31189 op2 := m2.Args[0]
31190 if op2.Op != OpOffPtr || auxIntToInt64(op2.AuxInt) != 0 {
31191 break
31192 }
31193 p2 := op2.Args[0]
31194 d2 := m2.Args[1]
31195 m3 := m2.Args[2]
31196 if m3.Op != OpMove {
31197 break
31198 }
31199 n := auxIntToInt64(m3.AuxInt)
31200 mem := m3.Args[2]
31201 p3 := m3.Args[0]
31202 if !(m2.Uses == 1 && m3.Uses == 1 && o1 == t2.Size() && n == t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2, m3)) {
31203 break
31204 }
31205 v.reset(OpStore)
31206 v.Aux = typeToAux(t1)
31207 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
31208 v0.Aux = typeToAux(t2)
31209 v0.AddArg3(op2, d2, mem)
31210 v.AddArg3(op1, d1, v0)
31211 return true
31212 }
31213
31214
31215
31216 for {
31217 t1 := auxToType(v.Aux)
31218 op1 := v_0
31219 if op1.Op != OpOffPtr {
31220 break
31221 }
31222 o1 := auxIntToInt64(op1.AuxInt)
31223 p1 := op1.Args[0]
31224 d1 := v_1
31225 m2 := v_2
31226 if m2.Op != OpStore {
31227 break
31228 }
31229 t2 := auxToType(m2.Aux)
31230 _ = m2.Args[2]
31231 op2 := m2.Args[0]
31232 if op2.Op != OpOffPtr {
31233 break
31234 }
31235 o2 := auxIntToInt64(op2.AuxInt)
31236 p2 := op2.Args[0]
31237 d2 := m2.Args[1]
31238 m3 := m2.Args[2]
31239 if m3.Op != OpStore {
31240 break
31241 }
31242 t3 := auxToType(m3.Aux)
31243 _ = m3.Args[2]
31244 op3 := m3.Args[0]
31245 if op3.Op != OpOffPtr || auxIntToInt64(op3.AuxInt) != 0 {
31246 break
31247 }
31248 p3 := op3.Args[0]
31249 d3 := m3.Args[1]
31250 m4 := m3.Args[2]
31251 if m4.Op != OpMove {
31252 break
31253 }
31254 n := auxIntToInt64(m4.AuxInt)
31255 mem := m4.Args[2]
31256 p4 := m4.Args[0]
31257 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)) {
31258 break
31259 }
31260 v.reset(OpStore)
31261 v.Aux = typeToAux(t1)
31262 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
31263 v0.Aux = typeToAux(t2)
31264 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
31265 v1.Aux = typeToAux(t3)
31266 v1.AddArg3(op3, d3, mem)
31267 v0.AddArg3(op2, d2, v1)
31268 v.AddArg3(op1, d1, v0)
31269 return true
31270 }
31271
31272
31273
31274 for {
31275 t1 := auxToType(v.Aux)
31276 op1 := v_0
31277 if op1.Op != OpOffPtr {
31278 break
31279 }
31280 o1 := auxIntToInt64(op1.AuxInt)
31281 p1 := op1.Args[0]
31282 d1 := v_1
31283 m2 := v_2
31284 if m2.Op != OpStore {
31285 break
31286 }
31287 t2 := auxToType(m2.Aux)
31288 _ = m2.Args[2]
31289 op2 := m2.Args[0]
31290 if op2.Op != OpOffPtr {
31291 break
31292 }
31293 o2 := auxIntToInt64(op2.AuxInt)
31294 p2 := op2.Args[0]
31295 d2 := m2.Args[1]
31296 m3 := m2.Args[2]
31297 if m3.Op != OpStore {
31298 break
31299 }
31300 t3 := auxToType(m3.Aux)
31301 _ = m3.Args[2]
31302 op3 := m3.Args[0]
31303 if op3.Op != OpOffPtr {
31304 break
31305 }
31306 o3 := auxIntToInt64(op3.AuxInt)
31307 p3 := op3.Args[0]
31308 d3 := m3.Args[1]
31309 m4 := m3.Args[2]
31310 if m4.Op != OpStore {
31311 break
31312 }
31313 t4 := auxToType(m4.Aux)
31314 _ = m4.Args[2]
31315 op4 := m4.Args[0]
31316 if op4.Op != OpOffPtr || auxIntToInt64(op4.AuxInt) != 0 {
31317 break
31318 }
31319 p4 := op4.Args[0]
31320 d4 := m4.Args[1]
31321 m5 := m4.Args[2]
31322 if m5.Op != OpMove {
31323 break
31324 }
31325 n := auxIntToInt64(m5.AuxInt)
31326 mem := m5.Args[2]
31327 p5 := m5.Args[0]
31328 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)) {
31329 break
31330 }
31331 v.reset(OpStore)
31332 v.Aux = typeToAux(t1)
31333 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
31334 v0.Aux = typeToAux(t2)
31335 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
31336 v1.Aux = typeToAux(t3)
31337 v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
31338 v2.Aux = typeToAux(t4)
31339 v2.AddArg3(op4, d4, mem)
31340 v1.AddArg3(op3, d3, v2)
31341 v0.AddArg3(op2, d2, v1)
31342 v.AddArg3(op1, d1, v0)
31343 return true
31344 }
31345
31346
31347
31348 for {
31349 t1 := auxToType(v.Aux)
31350 op1 := v_0
31351 if op1.Op != OpOffPtr {
31352 break
31353 }
31354 o1 := auxIntToInt64(op1.AuxInt)
31355 p1 := op1.Args[0]
31356 d1 := v_1
31357 m2 := v_2
31358 if m2.Op != OpStore {
31359 break
31360 }
31361 t2 := auxToType(m2.Aux)
31362 _ = m2.Args[2]
31363 op2 := m2.Args[0]
31364 if op2.Op != OpOffPtr || auxIntToInt64(op2.AuxInt) != 0 {
31365 break
31366 }
31367 p2 := op2.Args[0]
31368 d2 := m2.Args[1]
31369 m3 := m2.Args[2]
31370 if m3.Op != OpZero {
31371 break
31372 }
31373 n := auxIntToInt64(m3.AuxInt)
31374 mem := m3.Args[1]
31375 p3 := m3.Args[0]
31376 if !(m2.Uses == 1 && m3.Uses == 1 && o1 == t2.Size() && n == t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2, m3)) {
31377 break
31378 }
31379 v.reset(OpStore)
31380 v.Aux = typeToAux(t1)
31381 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
31382 v0.Aux = typeToAux(t2)
31383 v0.AddArg3(op2, d2, mem)
31384 v.AddArg3(op1, d1, v0)
31385 return true
31386 }
31387
31388
31389
31390 for {
31391 t1 := auxToType(v.Aux)
31392 op1 := v_0
31393 if op1.Op != OpOffPtr {
31394 break
31395 }
31396 o1 := auxIntToInt64(op1.AuxInt)
31397 p1 := op1.Args[0]
31398 d1 := v_1
31399 m2 := v_2
31400 if m2.Op != OpStore {
31401 break
31402 }
31403 t2 := auxToType(m2.Aux)
31404 _ = m2.Args[2]
31405 op2 := m2.Args[0]
31406 if op2.Op != OpOffPtr {
31407 break
31408 }
31409 o2 := auxIntToInt64(op2.AuxInt)
31410 p2 := op2.Args[0]
31411 d2 := m2.Args[1]
31412 m3 := m2.Args[2]
31413 if m3.Op != OpStore {
31414 break
31415 }
31416 t3 := auxToType(m3.Aux)
31417 _ = m3.Args[2]
31418 op3 := m3.Args[0]
31419 if op3.Op != OpOffPtr || auxIntToInt64(op3.AuxInt) != 0 {
31420 break
31421 }
31422 p3 := op3.Args[0]
31423 d3 := m3.Args[1]
31424 m4 := m3.Args[2]
31425 if m4.Op != OpZero {
31426 break
31427 }
31428 n := auxIntToInt64(m4.AuxInt)
31429 mem := m4.Args[1]
31430 p4 := m4.Args[0]
31431 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)) {
31432 break
31433 }
31434 v.reset(OpStore)
31435 v.Aux = typeToAux(t1)
31436 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
31437 v0.Aux = typeToAux(t2)
31438 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
31439 v1.Aux = typeToAux(t3)
31440 v1.AddArg3(op3, d3, mem)
31441 v0.AddArg3(op2, d2, v1)
31442 v.AddArg3(op1, d1, v0)
31443 return true
31444 }
31445
31446
31447
31448 for {
31449 t1 := auxToType(v.Aux)
31450 op1 := v_0
31451 if op1.Op != OpOffPtr {
31452 break
31453 }
31454 o1 := auxIntToInt64(op1.AuxInt)
31455 p1 := op1.Args[0]
31456 d1 := v_1
31457 m2 := v_2
31458 if m2.Op != OpStore {
31459 break
31460 }
31461 t2 := auxToType(m2.Aux)
31462 _ = m2.Args[2]
31463 op2 := m2.Args[0]
31464 if op2.Op != OpOffPtr {
31465 break
31466 }
31467 o2 := auxIntToInt64(op2.AuxInt)
31468 p2 := op2.Args[0]
31469 d2 := m2.Args[1]
31470 m3 := m2.Args[2]
31471 if m3.Op != OpStore {
31472 break
31473 }
31474 t3 := auxToType(m3.Aux)
31475 _ = m3.Args[2]
31476 op3 := m3.Args[0]
31477 if op3.Op != OpOffPtr {
31478 break
31479 }
31480 o3 := auxIntToInt64(op3.AuxInt)
31481 p3 := op3.Args[0]
31482 d3 := m3.Args[1]
31483 m4 := m3.Args[2]
31484 if m4.Op != OpStore {
31485 break
31486 }
31487 t4 := auxToType(m4.Aux)
31488 _ = m4.Args[2]
31489 op4 := m4.Args[0]
31490 if op4.Op != OpOffPtr || auxIntToInt64(op4.AuxInt) != 0 {
31491 break
31492 }
31493 p4 := op4.Args[0]
31494 d4 := m4.Args[1]
31495 m5 := m4.Args[2]
31496 if m5.Op != OpZero {
31497 break
31498 }
31499 n := auxIntToInt64(m5.AuxInt)
31500 mem := m5.Args[1]
31501 p5 := m5.Args[0]
31502 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)) {
31503 break
31504 }
31505 v.reset(OpStore)
31506 v.Aux = typeToAux(t1)
31507 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
31508 v0.Aux = typeToAux(t2)
31509 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
31510 v1.Aux = typeToAux(t3)
31511 v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
31512 v2.Aux = typeToAux(t4)
31513 v2.AddArg3(op4, d4, mem)
31514 v1.AddArg3(op3, d3, v2)
31515 v0.AddArg3(op2, d2, v1)
31516 v.AddArg3(op1, d1, v0)
31517 return true
31518 }
31519 return false
31520 }
31521 func rewriteValuegeneric_OpStringLen(v *Value) bool {
31522 v_0 := v.Args[0]
31523
31524
31525 for {
31526 if v_0.Op != OpStringMake {
31527 break
31528 }
31529 _ = v_0.Args[1]
31530 v_0_1 := v_0.Args[1]
31531 if v_0_1.Op != OpConst64 {
31532 break
31533 }
31534 t := v_0_1.Type
31535 c := auxIntToInt64(v_0_1.AuxInt)
31536 v.reset(OpConst64)
31537 v.Type = t
31538 v.AuxInt = int64ToAuxInt(c)
31539 return true
31540 }
31541 return false
31542 }
31543 func rewriteValuegeneric_OpStringPtr(v *Value) bool {
31544 v_0 := v.Args[0]
31545
31546
31547 for {
31548 if v_0.Op != OpStringMake {
31549 break
31550 }
31551 v_0_0 := v_0.Args[0]
31552 if v_0_0.Op != OpAddr {
31553 break
31554 }
31555 t := v_0_0.Type
31556 s := auxToSym(v_0_0.Aux)
31557 base := v_0_0.Args[0]
31558 v.reset(OpAddr)
31559 v.Type = t
31560 v.Aux = symToAux(s)
31561 v.AddArg(base)
31562 return true
31563 }
31564 return false
31565 }
31566 func rewriteValuegeneric_OpStructSelect(v *Value) bool {
31567 v_0 := v.Args[0]
31568 b := v.Block
31569
31570
31571 for {
31572 i := auxIntToInt64(v.AuxInt)
31573 x := v_0
31574 if x.Op != OpStructMake {
31575 break
31576 }
31577 v.copyOf(x.Args[i])
31578 return true
31579 }
31580
31581
31582
31583 for {
31584 i := auxIntToInt64(v.AuxInt)
31585 x := v_0
31586 if x.Op != OpLoad {
31587 break
31588 }
31589 t := x.Type
31590 mem := x.Args[1]
31591 ptr := x.Args[0]
31592 if !(!CanSSA(t)) {
31593 break
31594 }
31595 b = x.Block
31596 v0 := b.NewValue0(v.Pos, OpLoad, v.Type)
31597 v.copyOf(v0)
31598 v1 := b.NewValue0(v.Pos, OpOffPtr, v.Type.PtrTo())
31599 v1.AuxInt = int64ToAuxInt(t.FieldOff(int(i)))
31600 v1.AddArg(ptr)
31601 v0.AddArg2(v1, mem)
31602 return true
31603 }
31604
31605
31606 for {
31607 if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpIData {
31608 break
31609 }
31610 x := v_0.Args[0]
31611 v.reset(OpIData)
31612 v.AddArg(x)
31613 return true
31614 }
31615 return false
31616 }
31617 func rewriteValuegeneric_OpSub16(v *Value) bool {
31618 v_1 := v.Args[1]
31619 v_0 := v.Args[0]
31620 b := v.Block
31621
31622
31623 for {
31624 if v_0.Op != OpConst16 {
31625 break
31626 }
31627 c := auxIntToInt16(v_0.AuxInt)
31628 if v_1.Op != OpConst16 {
31629 break
31630 }
31631 d := auxIntToInt16(v_1.AuxInt)
31632 v.reset(OpConst16)
31633 v.AuxInt = int16ToAuxInt(c - d)
31634 return true
31635 }
31636
31637
31638
31639 for {
31640 x := v_0
31641 if v_1.Op != OpConst16 {
31642 break
31643 }
31644 t := v_1.Type
31645 c := auxIntToInt16(v_1.AuxInt)
31646 if !(x.Op != OpConst16) {
31647 break
31648 }
31649 v.reset(OpAdd16)
31650 v0 := b.NewValue0(v.Pos, OpConst16, t)
31651 v0.AuxInt = int16ToAuxInt(-c)
31652 v.AddArg2(v0, x)
31653 return true
31654 }
31655
31656
31657 for {
31658 t := v.Type
31659 if v_0.Op != OpMul16 {
31660 break
31661 }
31662 _ = v_0.Args[1]
31663 v_0_0 := v_0.Args[0]
31664 v_0_1 := v_0.Args[1]
31665 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
31666 x := v_0_0
31667 y := v_0_1
31668 if v_1.Op != OpMul16 {
31669 continue
31670 }
31671 _ = v_1.Args[1]
31672 v_1_0 := v_1.Args[0]
31673 v_1_1 := v_1.Args[1]
31674 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
31675 if x != v_1_0 {
31676 continue
31677 }
31678 z := v_1_1
31679 v.reset(OpMul16)
31680 v0 := b.NewValue0(v.Pos, OpSub16, t)
31681 v0.AddArg2(y, z)
31682 v.AddArg2(x, v0)
31683 return true
31684 }
31685 }
31686 break
31687 }
31688
31689
31690 for {
31691 x := v_0
31692 if x != v_1 {
31693 break
31694 }
31695 v.reset(OpConst16)
31696 v.AuxInt = int16ToAuxInt(0)
31697 return true
31698 }
31699
31700
31701 for {
31702 if v_0.Op != OpNeg16 {
31703 break
31704 }
31705 x := v_0.Args[0]
31706 if v_1.Op != OpCom16 || x != v_1.Args[0] {
31707 break
31708 }
31709 v.reset(OpConst16)
31710 v.AuxInt = int16ToAuxInt(1)
31711 return true
31712 }
31713
31714
31715 for {
31716 if v_0.Op != OpCom16 {
31717 break
31718 }
31719 x := v_0.Args[0]
31720 if v_1.Op != OpNeg16 || x != v_1.Args[0] {
31721 break
31722 }
31723 v.reset(OpConst16)
31724 v.AuxInt = int16ToAuxInt(-1)
31725 return true
31726 }
31727
31728
31729 for {
31730 if v_0.Op != OpAdd16 {
31731 break
31732 }
31733 _ = v_0.Args[1]
31734 v_0_0 := v_0.Args[0]
31735 v_0_1 := v_0.Args[1]
31736 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
31737 t := v_0_0
31738 x := v_0_1
31739 if v_1.Op != OpAdd16 {
31740 continue
31741 }
31742 _ = v_1.Args[1]
31743 v_1_0 := v_1.Args[0]
31744 v_1_1 := v_1.Args[1]
31745 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
31746 if t != v_1_0 {
31747 continue
31748 }
31749 y := v_1_1
31750 v.reset(OpSub16)
31751 v.AddArg2(x, y)
31752 return true
31753 }
31754 }
31755 break
31756 }
31757
31758
31759 for {
31760 if v_0.Op != OpAdd16 {
31761 break
31762 }
31763 _ = v_0.Args[1]
31764 v_0_0 := v_0.Args[0]
31765 v_0_1 := v_0.Args[1]
31766 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
31767 x := v_0_0
31768 y := v_0_1
31769 if x != v_1 {
31770 continue
31771 }
31772 v.copyOf(y)
31773 return true
31774 }
31775 break
31776 }
31777
31778
31779 for {
31780 if v_0.Op != OpAdd16 {
31781 break
31782 }
31783 _ = v_0.Args[1]
31784 v_0_0 := v_0.Args[0]
31785 v_0_1 := v_0.Args[1]
31786 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
31787 x := v_0_0
31788 y := v_0_1
31789 if y != v_1 {
31790 continue
31791 }
31792 v.copyOf(x)
31793 return true
31794 }
31795 break
31796 }
31797
31798
31799 for {
31800 if v_0.Op != OpSub16 {
31801 break
31802 }
31803 y := v_0.Args[1]
31804 x := v_0.Args[0]
31805 if x != v_1 {
31806 break
31807 }
31808 v.reset(OpNeg16)
31809 v.AddArg(y)
31810 return true
31811 }
31812
31813
31814 for {
31815 x := v_0
31816 if v_1.Op != OpAdd16 {
31817 break
31818 }
31819 _ = v_1.Args[1]
31820 v_1_0 := v_1.Args[0]
31821 v_1_1 := v_1.Args[1]
31822 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
31823 if x != v_1_0 {
31824 continue
31825 }
31826 y := v_1_1
31827 v.reset(OpNeg16)
31828 v.AddArg(y)
31829 return true
31830 }
31831 break
31832 }
31833
31834
31835
31836 for {
31837 x := v_0
31838 if v_1.Op != OpSub16 {
31839 break
31840 }
31841 z := v_1.Args[1]
31842 i := v_1.Args[0]
31843 if i.Op != OpConst16 {
31844 break
31845 }
31846 t := i.Type
31847 if !(z.Op != OpConst16 && x.Op != OpConst16) {
31848 break
31849 }
31850 v.reset(OpSub16)
31851 v0 := b.NewValue0(v.Pos, OpAdd16, t)
31852 v0.AddArg2(x, z)
31853 v.AddArg2(v0, i)
31854 return true
31855 }
31856
31857
31858
31859 for {
31860 x := v_0
31861 if v_1.Op != OpAdd16 {
31862 break
31863 }
31864 _ = v_1.Args[1]
31865 v_1_0 := v_1.Args[0]
31866 v_1_1 := v_1.Args[1]
31867 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
31868 z := v_1_0
31869 i := v_1_1
31870 if i.Op != OpConst16 {
31871 continue
31872 }
31873 t := i.Type
31874 if !(z.Op != OpConst16 && x.Op != OpConst16) {
31875 continue
31876 }
31877 v.reset(OpSub16)
31878 v0 := b.NewValue0(v.Pos, OpSub16, t)
31879 v0.AddArg2(x, z)
31880 v.AddArg2(v0, i)
31881 return true
31882 }
31883 break
31884 }
31885
31886
31887
31888 for {
31889 if v_0.Op != OpSub16 {
31890 break
31891 }
31892 z := v_0.Args[1]
31893 i := v_0.Args[0]
31894 if i.Op != OpConst16 {
31895 break
31896 }
31897 t := i.Type
31898 x := v_1
31899 if !(z.Op != OpConst16 && x.Op != OpConst16) {
31900 break
31901 }
31902 v.reset(OpSub16)
31903 v0 := b.NewValue0(v.Pos, OpAdd16, t)
31904 v0.AddArg2(z, x)
31905 v.AddArg2(i, v0)
31906 return true
31907 }
31908
31909
31910
31911 for {
31912 if v_0.Op != OpAdd16 {
31913 break
31914 }
31915 _ = v_0.Args[1]
31916 v_0_0 := v_0.Args[0]
31917 v_0_1 := v_0.Args[1]
31918 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
31919 z := v_0_0
31920 i := v_0_1
31921 if i.Op != OpConst16 {
31922 continue
31923 }
31924 t := i.Type
31925 x := v_1
31926 if !(z.Op != OpConst16 && x.Op != OpConst16) {
31927 continue
31928 }
31929 v.reset(OpAdd16)
31930 v0 := b.NewValue0(v.Pos, OpSub16, t)
31931 v0.AddArg2(z, x)
31932 v.AddArg2(i, v0)
31933 return true
31934 }
31935 break
31936 }
31937
31938
31939 for {
31940 if v_0.Op != OpConst16 {
31941 break
31942 }
31943 t := v_0.Type
31944 c := auxIntToInt16(v_0.AuxInt)
31945 if v_1.Op != OpSub16 {
31946 break
31947 }
31948 x := v_1.Args[1]
31949 v_1_0 := v_1.Args[0]
31950 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
31951 break
31952 }
31953 d := auxIntToInt16(v_1_0.AuxInt)
31954 v.reset(OpAdd16)
31955 v0 := b.NewValue0(v.Pos, OpConst16, t)
31956 v0.AuxInt = int16ToAuxInt(c - d)
31957 v.AddArg2(v0, x)
31958 return true
31959 }
31960
31961
31962 for {
31963 if v_0.Op != OpConst16 {
31964 break
31965 }
31966 t := v_0.Type
31967 c := auxIntToInt16(v_0.AuxInt)
31968 if v_1.Op != OpAdd16 {
31969 break
31970 }
31971 _ = v_1.Args[1]
31972 v_1_0 := v_1.Args[0]
31973 v_1_1 := v_1.Args[1]
31974 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
31975 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
31976 continue
31977 }
31978 d := auxIntToInt16(v_1_0.AuxInt)
31979 x := v_1_1
31980 v.reset(OpSub16)
31981 v0 := b.NewValue0(v.Pos, OpConst16, t)
31982 v0.AuxInt = int16ToAuxInt(c - d)
31983 v.AddArg2(v0, x)
31984 return true
31985 }
31986 break
31987 }
31988 return false
31989 }
31990 func rewriteValuegeneric_OpSub32(v *Value) bool {
31991 v_1 := v.Args[1]
31992 v_0 := v.Args[0]
31993 b := v.Block
31994
31995
31996 for {
31997 if v_0.Op != OpConst32 {
31998 break
31999 }
32000 c := auxIntToInt32(v_0.AuxInt)
32001 if v_1.Op != OpConst32 {
32002 break
32003 }
32004 d := auxIntToInt32(v_1.AuxInt)
32005 v.reset(OpConst32)
32006 v.AuxInt = int32ToAuxInt(c - d)
32007 return true
32008 }
32009
32010
32011
32012 for {
32013 x := v_0
32014 if v_1.Op != OpConst32 {
32015 break
32016 }
32017 t := v_1.Type
32018 c := auxIntToInt32(v_1.AuxInt)
32019 if !(x.Op != OpConst32) {
32020 break
32021 }
32022 v.reset(OpAdd32)
32023 v0 := b.NewValue0(v.Pos, OpConst32, t)
32024 v0.AuxInt = int32ToAuxInt(-c)
32025 v.AddArg2(v0, x)
32026 return true
32027 }
32028
32029
32030 for {
32031 t := v.Type
32032 if v_0.Op != OpMul32 {
32033 break
32034 }
32035 _ = v_0.Args[1]
32036 v_0_0 := v_0.Args[0]
32037 v_0_1 := v_0.Args[1]
32038 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32039 x := v_0_0
32040 y := v_0_1
32041 if v_1.Op != OpMul32 {
32042 continue
32043 }
32044 _ = v_1.Args[1]
32045 v_1_0 := v_1.Args[0]
32046 v_1_1 := v_1.Args[1]
32047 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
32048 if x != v_1_0 {
32049 continue
32050 }
32051 z := v_1_1
32052 v.reset(OpMul32)
32053 v0 := b.NewValue0(v.Pos, OpSub32, t)
32054 v0.AddArg2(y, z)
32055 v.AddArg2(x, v0)
32056 return true
32057 }
32058 }
32059 break
32060 }
32061
32062
32063 for {
32064 x := v_0
32065 if x != v_1 {
32066 break
32067 }
32068 v.reset(OpConst32)
32069 v.AuxInt = int32ToAuxInt(0)
32070 return true
32071 }
32072
32073
32074 for {
32075 if v_0.Op != OpNeg32 {
32076 break
32077 }
32078 x := v_0.Args[0]
32079 if v_1.Op != OpCom32 || x != v_1.Args[0] {
32080 break
32081 }
32082 v.reset(OpConst32)
32083 v.AuxInt = int32ToAuxInt(1)
32084 return true
32085 }
32086
32087
32088 for {
32089 if v_0.Op != OpCom32 {
32090 break
32091 }
32092 x := v_0.Args[0]
32093 if v_1.Op != OpNeg32 || x != v_1.Args[0] {
32094 break
32095 }
32096 v.reset(OpConst32)
32097 v.AuxInt = int32ToAuxInt(-1)
32098 return true
32099 }
32100
32101
32102 for {
32103 if v_0.Op != OpAdd32 {
32104 break
32105 }
32106 _ = v_0.Args[1]
32107 v_0_0 := v_0.Args[0]
32108 v_0_1 := v_0.Args[1]
32109 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32110 t := v_0_0
32111 x := v_0_1
32112 if v_1.Op != OpAdd32 {
32113 continue
32114 }
32115 _ = v_1.Args[1]
32116 v_1_0 := v_1.Args[0]
32117 v_1_1 := v_1.Args[1]
32118 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
32119 if t != v_1_0 {
32120 continue
32121 }
32122 y := v_1_1
32123 v.reset(OpSub32)
32124 v.AddArg2(x, y)
32125 return true
32126 }
32127 }
32128 break
32129 }
32130
32131
32132 for {
32133 if v_0.Op != OpAdd32 {
32134 break
32135 }
32136 _ = v_0.Args[1]
32137 v_0_0 := v_0.Args[0]
32138 v_0_1 := v_0.Args[1]
32139 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32140 x := v_0_0
32141 y := v_0_1
32142 if x != v_1 {
32143 continue
32144 }
32145 v.copyOf(y)
32146 return true
32147 }
32148 break
32149 }
32150
32151
32152 for {
32153 if v_0.Op != OpAdd32 {
32154 break
32155 }
32156 _ = v_0.Args[1]
32157 v_0_0 := v_0.Args[0]
32158 v_0_1 := v_0.Args[1]
32159 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32160 x := v_0_0
32161 y := v_0_1
32162 if y != v_1 {
32163 continue
32164 }
32165 v.copyOf(x)
32166 return true
32167 }
32168 break
32169 }
32170
32171
32172 for {
32173 if v_0.Op != OpSub32 {
32174 break
32175 }
32176 y := v_0.Args[1]
32177 x := v_0.Args[0]
32178 if x != v_1 {
32179 break
32180 }
32181 v.reset(OpNeg32)
32182 v.AddArg(y)
32183 return true
32184 }
32185
32186
32187 for {
32188 x := v_0
32189 if v_1.Op != OpAdd32 {
32190 break
32191 }
32192 _ = v_1.Args[1]
32193 v_1_0 := v_1.Args[0]
32194 v_1_1 := v_1.Args[1]
32195 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
32196 if x != v_1_0 {
32197 continue
32198 }
32199 y := v_1_1
32200 v.reset(OpNeg32)
32201 v.AddArg(y)
32202 return true
32203 }
32204 break
32205 }
32206
32207
32208
32209 for {
32210 x := v_0
32211 if v_1.Op != OpSub32 {
32212 break
32213 }
32214 z := v_1.Args[1]
32215 i := v_1.Args[0]
32216 if i.Op != OpConst32 {
32217 break
32218 }
32219 t := i.Type
32220 if !(z.Op != OpConst32 && x.Op != OpConst32) {
32221 break
32222 }
32223 v.reset(OpSub32)
32224 v0 := b.NewValue0(v.Pos, OpAdd32, t)
32225 v0.AddArg2(x, z)
32226 v.AddArg2(v0, i)
32227 return true
32228 }
32229
32230
32231
32232 for {
32233 x := v_0
32234 if v_1.Op != OpAdd32 {
32235 break
32236 }
32237 _ = v_1.Args[1]
32238 v_1_0 := v_1.Args[0]
32239 v_1_1 := v_1.Args[1]
32240 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
32241 z := v_1_0
32242 i := v_1_1
32243 if i.Op != OpConst32 {
32244 continue
32245 }
32246 t := i.Type
32247 if !(z.Op != OpConst32 && x.Op != OpConst32) {
32248 continue
32249 }
32250 v.reset(OpSub32)
32251 v0 := b.NewValue0(v.Pos, OpSub32, t)
32252 v0.AddArg2(x, z)
32253 v.AddArg2(v0, i)
32254 return true
32255 }
32256 break
32257 }
32258
32259
32260
32261 for {
32262 if v_0.Op != OpSub32 {
32263 break
32264 }
32265 z := v_0.Args[1]
32266 i := v_0.Args[0]
32267 if i.Op != OpConst32 {
32268 break
32269 }
32270 t := i.Type
32271 x := v_1
32272 if !(z.Op != OpConst32 && x.Op != OpConst32) {
32273 break
32274 }
32275 v.reset(OpSub32)
32276 v0 := b.NewValue0(v.Pos, OpAdd32, t)
32277 v0.AddArg2(z, x)
32278 v.AddArg2(i, v0)
32279 return true
32280 }
32281
32282
32283
32284 for {
32285 if v_0.Op != OpAdd32 {
32286 break
32287 }
32288 _ = v_0.Args[1]
32289 v_0_0 := v_0.Args[0]
32290 v_0_1 := v_0.Args[1]
32291 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32292 z := v_0_0
32293 i := v_0_1
32294 if i.Op != OpConst32 {
32295 continue
32296 }
32297 t := i.Type
32298 x := v_1
32299 if !(z.Op != OpConst32 && x.Op != OpConst32) {
32300 continue
32301 }
32302 v.reset(OpAdd32)
32303 v0 := b.NewValue0(v.Pos, OpSub32, t)
32304 v0.AddArg2(z, x)
32305 v.AddArg2(i, v0)
32306 return true
32307 }
32308 break
32309 }
32310
32311
32312 for {
32313 if v_0.Op != OpConst32 {
32314 break
32315 }
32316 t := v_0.Type
32317 c := auxIntToInt32(v_0.AuxInt)
32318 if v_1.Op != OpSub32 {
32319 break
32320 }
32321 x := v_1.Args[1]
32322 v_1_0 := v_1.Args[0]
32323 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
32324 break
32325 }
32326 d := auxIntToInt32(v_1_0.AuxInt)
32327 v.reset(OpAdd32)
32328 v0 := b.NewValue0(v.Pos, OpConst32, t)
32329 v0.AuxInt = int32ToAuxInt(c - d)
32330 v.AddArg2(v0, x)
32331 return true
32332 }
32333
32334
32335 for {
32336 if v_0.Op != OpConst32 {
32337 break
32338 }
32339 t := v_0.Type
32340 c := auxIntToInt32(v_0.AuxInt)
32341 if v_1.Op != OpAdd32 {
32342 break
32343 }
32344 _ = v_1.Args[1]
32345 v_1_0 := v_1.Args[0]
32346 v_1_1 := v_1.Args[1]
32347 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
32348 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
32349 continue
32350 }
32351 d := auxIntToInt32(v_1_0.AuxInt)
32352 x := v_1_1
32353 v.reset(OpSub32)
32354 v0 := b.NewValue0(v.Pos, OpConst32, t)
32355 v0.AuxInt = int32ToAuxInt(c - d)
32356 v.AddArg2(v0, x)
32357 return true
32358 }
32359 break
32360 }
32361 return false
32362 }
32363 func rewriteValuegeneric_OpSub32F(v *Value) bool {
32364 v_1 := v.Args[1]
32365 v_0 := v.Args[0]
32366
32367
32368
32369 for {
32370 if v_0.Op != OpConst32F {
32371 break
32372 }
32373 c := auxIntToFloat32(v_0.AuxInt)
32374 if v_1.Op != OpConst32F {
32375 break
32376 }
32377 d := auxIntToFloat32(v_1.AuxInt)
32378 if !(c-d == c-d) {
32379 break
32380 }
32381 v.reset(OpConst32F)
32382 v.AuxInt = float32ToAuxInt(c - d)
32383 return true
32384 }
32385 return false
32386 }
32387 func rewriteValuegeneric_OpSub64(v *Value) bool {
32388 v_1 := v.Args[1]
32389 v_0 := v.Args[0]
32390 b := v.Block
32391
32392
32393 for {
32394 if v_0.Op != OpConst64 {
32395 break
32396 }
32397 c := auxIntToInt64(v_0.AuxInt)
32398 if v_1.Op != OpConst64 {
32399 break
32400 }
32401 d := auxIntToInt64(v_1.AuxInt)
32402 v.reset(OpConst64)
32403 v.AuxInt = int64ToAuxInt(c - d)
32404 return true
32405 }
32406
32407
32408
32409 for {
32410 x := v_0
32411 if v_1.Op != OpConst64 {
32412 break
32413 }
32414 t := v_1.Type
32415 c := auxIntToInt64(v_1.AuxInt)
32416 if !(x.Op != OpConst64) {
32417 break
32418 }
32419 v.reset(OpAdd64)
32420 v0 := b.NewValue0(v.Pos, OpConst64, t)
32421 v0.AuxInt = int64ToAuxInt(-c)
32422 v.AddArg2(v0, x)
32423 return true
32424 }
32425
32426
32427 for {
32428 t := v.Type
32429 if v_0.Op != OpMul64 {
32430 break
32431 }
32432 _ = v_0.Args[1]
32433 v_0_0 := v_0.Args[0]
32434 v_0_1 := v_0.Args[1]
32435 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32436 x := v_0_0
32437 y := v_0_1
32438 if v_1.Op != OpMul64 {
32439 continue
32440 }
32441 _ = v_1.Args[1]
32442 v_1_0 := v_1.Args[0]
32443 v_1_1 := v_1.Args[1]
32444 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
32445 if x != v_1_0 {
32446 continue
32447 }
32448 z := v_1_1
32449 v.reset(OpMul64)
32450 v0 := b.NewValue0(v.Pos, OpSub64, t)
32451 v0.AddArg2(y, z)
32452 v.AddArg2(x, v0)
32453 return true
32454 }
32455 }
32456 break
32457 }
32458
32459
32460 for {
32461 x := v_0
32462 if x != v_1 {
32463 break
32464 }
32465 v.reset(OpConst64)
32466 v.AuxInt = int64ToAuxInt(0)
32467 return true
32468 }
32469
32470
32471 for {
32472 if v_0.Op != OpNeg64 {
32473 break
32474 }
32475 x := v_0.Args[0]
32476 if v_1.Op != OpCom64 || x != v_1.Args[0] {
32477 break
32478 }
32479 v.reset(OpConst64)
32480 v.AuxInt = int64ToAuxInt(1)
32481 return true
32482 }
32483
32484
32485 for {
32486 if v_0.Op != OpCom64 {
32487 break
32488 }
32489 x := v_0.Args[0]
32490 if v_1.Op != OpNeg64 || x != v_1.Args[0] {
32491 break
32492 }
32493 v.reset(OpConst64)
32494 v.AuxInt = int64ToAuxInt(-1)
32495 return true
32496 }
32497
32498
32499 for {
32500 if v_0.Op != OpAdd64 {
32501 break
32502 }
32503 _ = v_0.Args[1]
32504 v_0_0 := v_0.Args[0]
32505 v_0_1 := v_0.Args[1]
32506 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32507 t := v_0_0
32508 x := v_0_1
32509 if v_1.Op != OpAdd64 {
32510 continue
32511 }
32512 _ = v_1.Args[1]
32513 v_1_0 := v_1.Args[0]
32514 v_1_1 := v_1.Args[1]
32515 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
32516 if t != v_1_0 {
32517 continue
32518 }
32519 y := v_1_1
32520 v.reset(OpSub64)
32521 v.AddArg2(x, y)
32522 return true
32523 }
32524 }
32525 break
32526 }
32527
32528
32529 for {
32530 if v_0.Op != OpAdd64 {
32531 break
32532 }
32533 _ = v_0.Args[1]
32534 v_0_0 := v_0.Args[0]
32535 v_0_1 := v_0.Args[1]
32536 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32537 x := v_0_0
32538 y := v_0_1
32539 if x != v_1 {
32540 continue
32541 }
32542 v.copyOf(y)
32543 return true
32544 }
32545 break
32546 }
32547
32548
32549 for {
32550 if v_0.Op != OpAdd64 {
32551 break
32552 }
32553 _ = v_0.Args[1]
32554 v_0_0 := v_0.Args[0]
32555 v_0_1 := v_0.Args[1]
32556 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32557 x := v_0_0
32558 y := v_0_1
32559 if y != v_1 {
32560 continue
32561 }
32562 v.copyOf(x)
32563 return true
32564 }
32565 break
32566 }
32567
32568
32569 for {
32570 if v_0.Op != OpSub64 {
32571 break
32572 }
32573 y := v_0.Args[1]
32574 x := v_0.Args[0]
32575 if x != v_1 {
32576 break
32577 }
32578 v.reset(OpNeg64)
32579 v.AddArg(y)
32580 return true
32581 }
32582
32583
32584 for {
32585 x := v_0
32586 if v_1.Op != OpAdd64 {
32587 break
32588 }
32589 _ = v_1.Args[1]
32590 v_1_0 := v_1.Args[0]
32591 v_1_1 := v_1.Args[1]
32592 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
32593 if x != v_1_0 {
32594 continue
32595 }
32596 y := v_1_1
32597 v.reset(OpNeg64)
32598 v.AddArg(y)
32599 return true
32600 }
32601 break
32602 }
32603
32604
32605
32606 for {
32607 x := v_0
32608 if v_1.Op != OpSub64 {
32609 break
32610 }
32611 z := v_1.Args[1]
32612 i := v_1.Args[0]
32613 if i.Op != OpConst64 {
32614 break
32615 }
32616 t := i.Type
32617 if !(z.Op != OpConst64 && x.Op != OpConst64) {
32618 break
32619 }
32620 v.reset(OpSub64)
32621 v0 := b.NewValue0(v.Pos, OpAdd64, t)
32622 v0.AddArg2(x, z)
32623 v.AddArg2(v0, i)
32624 return true
32625 }
32626
32627
32628
32629 for {
32630 x := v_0
32631 if v_1.Op != OpAdd64 {
32632 break
32633 }
32634 _ = v_1.Args[1]
32635 v_1_0 := v_1.Args[0]
32636 v_1_1 := v_1.Args[1]
32637 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
32638 z := v_1_0
32639 i := v_1_1
32640 if i.Op != OpConst64 {
32641 continue
32642 }
32643 t := i.Type
32644 if !(z.Op != OpConst64 && x.Op != OpConst64) {
32645 continue
32646 }
32647 v.reset(OpSub64)
32648 v0 := b.NewValue0(v.Pos, OpSub64, t)
32649 v0.AddArg2(x, z)
32650 v.AddArg2(v0, i)
32651 return true
32652 }
32653 break
32654 }
32655
32656
32657
32658 for {
32659 if v_0.Op != OpSub64 {
32660 break
32661 }
32662 z := v_0.Args[1]
32663 i := v_0.Args[0]
32664 if i.Op != OpConst64 {
32665 break
32666 }
32667 t := i.Type
32668 x := v_1
32669 if !(z.Op != OpConst64 && x.Op != OpConst64) {
32670 break
32671 }
32672 v.reset(OpSub64)
32673 v0 := b.NewValue0(v.Pos, OpAdd64, t)
32674 v0.AddArg2(z, x)
32675 v.AddArg2(i, v0)
32676 return true
32677 }
32678
32679
32680
32681 for {
32682 if v_0.Op != OpAdd64 {
32683 break
32684 }
32685 _ = v_0.Args[1]
32686 v_0_0 := v_0.Args[0]
32687 v_0_1 := v_0.Args[1]
32688 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32689 z := v_0_0
32690 i := v_0_1
32691 if i.Op != OpConst64 {
32692 continue
32693 }
32694 t := i.Type
32695 x := v_1
32696 if !(z.Op != OpConst64 && x.Op != OpConst64) {
32697 continue
32698 }
32699 v.reset(OpAdd64)
32700 v0 := b.NewValue0(v.Pos, OpSub64, t)
32701 v0.AddArg2(z, x)
32702 v.AddArg2(i, v0)
32703 return true
32704 }
32705 break
32706 }
32707
32708
32709 for {
32710 if v_0.Op != OpConst64 {
32711 break
32712 }
32713 t := v_0.Type
32714 c := auxIntToInt64(v_0.AuxInt)
32715 if v_1.Op != OpSub64 {
32716 break
32717 }
32718 x := v_1.Args[1]
32719 v_1_0 := v_1.Args[0]
32720 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
32721 break
32722 }
32723 d := auxIntToInt64(v_1_0.AuxInt)
32724 v.reset(OpAdd64)
32725 v0 := b.NewValue0(v.Pos, OpConst64, t)
32726 v0.AuxInt = int64ToAuxInt(c - d)
32727 v.AddArg2(v0, x)
32728 return true
32729 }
32730
32731
32732 for {
32733 if v_0.Op != OpConst64 {
32734 break
32735 }
32736 t := v_0.Type
32737 c := auxIntToInt64(v_0.AuxInt)
32738 if v_1.Op != OpAdd64 {
32739 break
32740 }
32741 _ = v_1.Args[1]
32742 v_1_0 := v_1.Args[0]
32743 v_1_1 := v_1.Args[1]
32744 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
32745 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
32746 continue
32747 }
32748 d := auxIntToInt64(v_1_0.AuxInt)
32749 x := v_1_1
32750 v.reset(OpSub64)
32751 v0 := b.NewValue0(v.Pos, OpConst64, t)
32752 v0.AuxInt = int64ToAuxInt(c - d)
32753 v.AddArg2(v0, x)
32754 return true
32755 }
32756 break
32757 }
32758 return false
32759 }
32760 func rewriteValuegeneric_OpSub64F(v *Value) bool {
32761 v_1 := v.Args[1]
32762 v_0 := v.Args[0]
32763
32764
32765
32766 for {
32767 if v_0.Op != OpConst64F {
32768 break
32769 }
32770 c := auxIntToFloat64(v_0.AuxInt)
32771 if v_1.Op != OpConst64F {
32772 break
32773 }
32774 d := auxIntToFloat64(v_1.AuxInt)
32775 if !(c-d == c-d) {
32776 break
32777 }
32778 v.reset(OpConst64F)
32779 v.AuxInt = float64ToAuxInt(c - d)
32780 return true
32781 }
32782 return false
32783 }
32784 func rewriteValuegeneric_OpSub8(v *Value) bool {
32785 v_1 := v.Args[1]
32786 v_0 := v.Args[0]
32787 b := v.Block
32788
32789
32790 for {
32791 if v_0.Op != OpConst8 {
32792 break
32793 }
32794 c := auxIntToInt8(v_0.AuxInt)
32795 if v_1.Op != OpConst8 {
32796 break
32797 }
32798 d := auxIntToInt8(v_1.AuxInt)
32799 v.reset(OpConst8)
32800 v.AuxInt = int8ToAuxInt(c - d)
32801 return true
32802 }
32803
32804
32805
32806 for {
32807 x := v_0
32808 if v_1.Op != OpConst8 {
32809 break
32810 }
32811 t := v_1.Type
32812 c := auxIntToInt8(v_1.AuxInt)
32813 if !(x.Op != OpConst8) {
32814 break
32815 }
32816 v.reset(OpAdd8)
32817 v0 := b.NewValue0(v.Pos, OpConst8, t)
32818 v0.AuxInt = int8ToAuxInt(-c)
32819 v.AddArg2(v0, x)
32820 return true
32821 }
32822
32823
32824 for {
32825 t := v.Type
32826 if v_0.Op != OpMul8 {
32827 break
32828 }
32829 _ = v_0.Args[1]
32830 v_0_0 := v_0.Args[0]
32831 v_0_1 := v_0.Args[1]
32832 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32833 x := v_0_0
32834 y := v_0_1
32835 if v_1.Op != OpMul8 {
32836 continue
32837 }
32838 _ = v_1.Args[1]
32839 v_1_0 := v_1.Args[0]
32840 v_1_1 := v_1.Args[1]
32841 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
32842 if x != v_1_0 {
32843 continue
32844 }
32845 z := v_1_1
32846 v.reset(OpMul8)
32847 v0 := b.NewValue0(v.Pos, OpSub8, t)
32848 v0.AddArg2(y, z)
32849 v.AddArg2(x, v0)
32850 return true
32851 }
32852 }
32853 break
32854 }
32855
32856
32857 for {
32858 x := v_0
32859 if x != v_1 {
32860 break
32861 }
32862 v.reset(OpConst8)
32863 v.AuxInt = int8ToAuxInt(0)
32864 return true
32865 }
32866
32867
32868 for {
32869 if v_0.Op != OpNeg8 {
32870 break
32871 }
32872 x := v_0.Args[0]
32873 if v_1.Op != OpCom8 || x != v_1.Args[0] {
32874 break
32875 }
32876 v.reset(OpConst8)
32877 v.AuxInt = int8ToAuxInt(1)
32878 return true
32879 }
32880
32881
32882 for {
32883 if v_0.Op != OpCom8 {
32884 break
32885 }
32886 x := v_0.Args[0]
32887 if v_1.Op != OpNeg8 || x != v_1.Args[0] {
32888 break
32889 }
32890 v.reset(OpConst8)
32891 v.AuxInt = int8ToAuxInt(-1)
32892 return true
32893 }
32894
32895
32896 for {
32897 if v_0.Op != OpAdd8 {
32898 break
32899 }
32900 _ = v_0.Args[1]
32901 v_0_0 := v_0.Args[0]
32902 v_0_1 := v_0.Args[1]
32903 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32904 t := v_0_0
32905 x := v_0_1
32906 if v_1.Op != OpAdd8 {
32907 continue
32908 }
32909 _ = v_1.Args[1]
32910 v_1_0 := v_1.Args[0]
32911 v_1_1 := v_1.Args[1]
32912 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
32913 if t != v_1_0 {
32914 continue
32915 }
32916 y := v_1_1
32917 v.reset(OpSub8)
32918 v.AddArg2(x, y)
32919 return true
32920 }
32921 }
32922 break
32923 }
32924
32925
32926 for {
32927 if v_0.Op != OpAdd8 {
32928 break
32929 }
32930 _ = v_0.Args[1]
32931 v_0_0 := v_0.Args[0]
32932 v_0_1 := v_0.Args[1]
32933 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32934 x := v_0_0
32935 y := v_0_1
32936 if x != v_1 {
32937 continue
32938 }
32939 v.copyOf(y)
32940 return true
32941 }
32942 break
32943 }
32944
32945
32946 for {
32947 if v_0.Op != OpAdd8 {
32948 break
32949 }
32950 _ = v_0.Args[1]
32951 v_0_0 := v_0.Args[0]
32952 v_0_1 := v_0.Args[1]
32953 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32954 x := v_0_0
32955 y := v_0_1
32956 if y != v_1 {
32957 continue
32958 }
32959 v.copyOf(x)
32960 return true
32961 }
32962 break
32963 }
32964
32965
32966 for {
32967 if v_0.Op != OpSub8 {
32968 break
32969 }
32970 y := v_0.Args[1]
32971 x := v_0.Args[0]
32972 if x != v_1 {
32973 break
32974 }
32975 v.reset(OpNeg8)
32976 v.AddArg(y)
32977 return true
32978 }
32979
32980
32981 for {
32982 x := v_0
32983 if v_1.Op != OpAdd8 {
32984 break
32985 }
32986 _ = v_1.Args[1]
32987 v_1_0 := v_1.Args[0]
32988 v_1_1 := v_1.Args[1]
32989 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
32990 if x != v_1_0 {
32991 continue
32992 }
32993 y := v_1_1
32994 v.reset(OpNeg8)
32995 v.AddArg(y)
32996 return true
32997 }
32998 break
32999 }
33000
33001
33002
33003 for {
33004 x := v_0
33005 if v_1.Op != OpSub8 {
33006 break
33007 }
33008 z := v_1.Args[1]
33009 i := v_1.Args[0]
33010 if i.Op != OpConst8 {
33011 break
33012 }
33013 t := i.Type
33014 if !(z.Op != OpConst8 && x.Op != OpConst8) {
33015 break
33016 }
33017 v.reset(OpSub8)
33018 v0 := b.NewValue0(v.Pos, OpAdd8, t)
33019 v0.AddArg2(x, z)
33020 v.AddArg2(v0, i)
33021 return true
33022 }
33023
33024
33025
33026 for {
33027 x := v_0
33028 if v_1.Op != OpAdd8 {
33029 break
33030 }
33031 _ = v_1.Args[1]
33032 v_1_0 := v_1.Args[0]
33033 v_1_1 := v_1.Args[1]
33034 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33035 z := v_1_0
33036 i := v_1_1
33037 if i.Op != OpConst8 {
33038 continue
33039 }
33040 t := i.Type
33041 if !(z.Op != OpConst8 && x.Op != OpConst8) {
33042 continue
33043 }
33044 v.reset(OpSub8)
33045 v0 := b.NewValue0(v.Pos, OpSub8, t)
33046 v0.AddArg2(x, z)
33047 v.AddArg2(v0, i)
33048 return true
33049 }
33050 break
33051 }
33052
33053
33054
33055 for {
33056 if v_0.Op != OpSub8 {
33057 break
33058 }
33059 z := v_0.Args[1]
33060 i := v_0.Args[0]
33061 if i.Op != OpConst8 {
33062 break
33063 }
33064 t := i.Type
33065 x := v_1
33066 if !(z.Op != OpConst8 && x.Op != OpConst8) {
33067 break
33068 }
33069 v.reset(OpSub8)
33070 v0 := b.NewValue0(v.Pos, OpAdd8, t)
33071 v0.AddArg2(z, x)
33072 v.AddArg2(i, v0)
33073 return true
33074 }
33075
33076
33077
33078 for {
33079 if v_0.Op != OpAdd8 {
33080 break
33081 }
33082 _ = v_0.Args[1]
33083 v_0_0 := v_0.Args[0]
33084 v_0_1 := v_0.Args[1]
33085 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33086 z := v_0_0
33087 i := v_0_1
33088 if i.Op != OpConst8 {
33089 continue
33090 }
33091 t := i.Type
33092 x := v_1
33093 if !(z.Op != OpConst8 && x.Op != OpConst8) {
33094 continue
33095 }
33096 v.reset(OpAdd8)
33097 v0 := b.NewValue0(v.Pos, OpSub8, t)
33098 v0.AddArg2(z, x)
33099 v.AddArg2(i, v0)
33100 return true
33101 }
33102 break
33103 }
33104
33105
33106 for {
33107 if v_0.Op != OpConst8 {
33108 break
33109 }
33110 t := v_0.Type
33111 c := auxIntToInt8(v_0.AuxInt)
33112 if v_1.Op != OpSub8 {
33113 break
33114 }
33115 x := v_1.Args[1]
33116 v_1_0 := v_1.Args[0]
33117 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
33118 break
33119 }
33120 d := auxIntToInt8(v_1_0.AuxInt)
33121 v.reset(OpAdd8)
33122 v0 := b.NewValue0(v.Pos, OpConst8, t)
33123 v0.AuxInt = int8ToAuxInt(c - d)
33124 v.AddArg2(v0, x)
33125 return true
33126 }
33127
33128
33129 for {
33130 if v_0.Op != OpConst8 {
33131 break
33132 }
33133 t := v_0.Type
33134 c := auxIntToInt8(v_0.AuxInt)
33135 if v_1.Op != OpAdd8 {
33136 break
33137 }
33138 _ = v_1.Args[1]
33139 v_1_0 := v_1.Args[0]
33140 v_1_1 := v_1.Args[1]
33141 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33142 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
33143 continue
33144 }
33145 d := auxIntToInt8(v_1_0.AuxInt)
33146 x := v_1_1
33147 v.reset(OpSub8)
33148 v0 := b.NewValue0(v.Pos, OpConst8, t)
33149 v0.AuxInt = int8ToAuxInt(c - d)
33150 v.AddArg2(v0, x)
33151 return true
33152 }
33153 break
33154 }
33155 return false
33156 }
33157 func rewriteValuegeneric_OpTrunc(v *Value) bool {
33158 v_0 := v.Args[0]
33159
33160
33161 for {
33162 if v_0.Op != OpConst64F {
33163 break
33164 }
33165 c := auxIntToFloat64(v_0.AuxInt)
33166 v.reset(OpConst64F)
33167 v.AuxInt = float64ToAuxInt(math.Trunc(c))
33168 return true
33169 }
33170 return false
33171 }
33172 func rewriteValuegeneric_OpTrunc16to8(v *Value) bool {
33173 v_0 := v.Args[0]
33174
33175
33176 for {
33177 if v_0.Op != OpConst16 {
33178 break
33179 }
33180 c := auxIntToInt16(v_0.AuxInt)
33181 v.reset(OpConst8)
33182 v.AuxInt = int8ToAuxInt(int8(c))
33183 return true
33184 }
33185
33186
33187 for {
33188 if v_0.Op != OpZeroExt8to16 {
33189 break
33190 }
33191 x := v_0.Args[0]
33192 v.copyOf(x)
33193 return true
33194 }
33195
33196
33197 for {
33198 if v_0.Op != OpSignExt8to16 {
33199 break
33200 }
33201 x := v_0.Args[0]
33202 v.copyOf(x)
33203 return true
33204 }
33205
33206
33207
33208 for {
33209 if v_0.Op != OpAnd16 {
33210 break
33211 }
33212 _ = v_0.Args[1]
33213 v_0_0 := v_0.Args[0]
33214 v_0_1 := v_0.Args[1]
33215 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33216 if v_0_0.Op != OpConst16 {
33217 continue
33218 }
33219 y := auxIntToInt16(v_0_0.AuxInt)
33220 x := v_0_1
33221 if !(y&0xFF == 0xFF) {
33222 continue
33223 }
33224 v.reset(OpTrunc16to8)
33225 v.AddArg(x)
33226 return true
33227 }
33228 break
33229 }
33230 return false
33231 }
33232 func rewriteValuegeneric_OpTrunc32to16(v *Value) bool {
33233 v_0 := v.Args[0]
33234
33235
33236 for {
33237 if v_0.Op != OpConst32 {
33238 break
33239 }
33240 c := auxIntToInt32(v_0.AuxInt)
33241 v.reset(OpConst16)
33242 v.AuxInt = int16ToAuxInt(int16(c))
33243 return true
33244 }
33245
33246
33247 for {
33248 if v_0.Op != OpZeroExt8to32 {
33249 break
33250 }
33251 x := v_0.Args[0]
33252 v.reset(OpZeroExt8to16)
33253 v.AddArg(x)
33254 return true
33255 }
33256
33257
33258 for {
33259 if v_0.Op != OpZeroExt16to32 {
33260 break
33261 }
33262 x := v_0.Args[0]
33263 v.copyOf(x)
33264 return true
33265 }
33266
33267
33268 for {
33269 if v_0.Op != OpSignExt8to32 {
33270 break
33271 }
33272 x := v_0.Args[0]
33273 v.reset(OpSignExt8to16)
33274 v.AddArg(x)
33275 return true
33276 }
33277
33278
33279 for {
33280 if v_0.Op != OpSignExt16to32 {
33281 break
33282 }
33283 x := v_0.Args[0]
33284 v.copyOf(x)
33285 return true
33286 }
33287
33288
33289
33290 for {
33291 if v_0.Op != OpAnd32 {
33292 break
33293 }
33294 _ = v_0.Args[1]
33295 v_0_0 := v_0.Args[0]
33296 v_0_1 := v_0.Args[1]
33297 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33298 if v_0_0.Op != OpConst32 {
33299 continue
33300 }
33301 y := auxIntToInt32(v_0_0.AuxInt)
33302 x := v_0_1
33303 if !(y&0xFFFF == 0xFFFF) {
33304 continue
33305 }
33306 v.reset(OpTrunc32to16)
33307 v.AddArg(x)
33308 return true
33309 }
33310 break
33311 }
33312 return false
33313 }
33314 func rewriteValuegeneric_OpTrunc32to8(v *Value) bool {
33315 v_0 := v.Args[0]
33316
33317
33318 for {
33319 if v_0.Op != OpConst32 {
33320 break
33321 }
33322 c := auxIntToInt32(v_0.AuxInt)
33323 v.reset(OpConst8)
33324 v.AuxInt = int8ToAuxInt(int8(c))
33325 return true
33326 }
33327
33328
33329 for {
33330 if v_0.Op != OpZeroExt8to32 {
33331 break
33332 }
33333 x := v_0.Args[0]
33334 v.copyOf(x)
33335 return true
33336 }
33337
33338
33339 for {
33340 if v_0.Op != OpSignExt8to32 {
33341 break
33342 }
33343 x := v_0.Args[0]
33344 v.copyOf(x)
33345 return true
33346 }
33347
33348
33349
33350 for {
33351 if v_0.Op != OpAnd32 {
33352 break
33353 }
33354 _ = v_0.Args[1]
33355 v_0_0 := v_0.Args[0]
33356 v_0_1 := v_0.Args[1]
33357 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33358 if v_0_0.Op != OpConst32 {
33359 continue
33360 }
33361 y := auxIntToInt32(v_0_0.AuxInt)
33362 x := v_0_1
33363 if !(y&0xFF == 0xFF) {
33364 continue
33365 }
33366 v.reset(OpTrunc32to8)
33367 v.AddArg(x)
33368 return true
33369 }
33370 break
33371 }
33372 return false
33373 }
33374 func rewriteValuegeneric_OpTrunc64to16(v *Value) bool {
33375 v_0 := v.Args[0]
33376
33377
33378 for {
33379 if v_0.Op != OpConst64 {
33380 break
33381 }
33382 c := auxIntToInt64(v_0.AuxInt)
33383 v.reset(OpConst16)
33384 v.AuxInt = int16ToAuxInt(int16(c))
33385 return true
33386 }
33387
33388
33389 for {
33390 if v_0.Op != OpZeroExt8to64 {
33391 break
33392 }
33393 x := v_0.Args[0]
33394 v.reset(OpZeroExt8to16)
33395 v.AddArg(x)
33396 return true
33397 }
33398
33399
33400 for {
33401 if v_0.Op != OpZeroExt16to64 {
33402 break
33403 }
33404 x := v_0.Args[0]
33405 v.copyOf(x)
33406 return true
33407 }
33408
33409
33410 for {
33411 if v_0.Op != OpSignExt8to64 {
33412 break
33413 }
33414 x := v_0.Args[0]
33415 v.reset(OpSignExt8to16)
33416 v.AddArg(x)
33417 return true
33418 }
33419
33420
33421 for {
33422 if v_0.Op != OpSignExt16to64 {
33423 break
33424 }
33425 x := v_0.Args[0]
33426 v.copyOf(x)
33427 return true
33428 }
33429
33430
33431
33432 for {
33433 if v_0.Op != OpAnd64 {
33434 break
33435 }
33436 _ = v_0.Args[1]
33437 v_0_0 := v_0.Args[0]
33438 v_0_1 := v_0.Args[1]
33439 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33440 if v_0_0.Op != OpConst64 {
33441 continue
33442 }
33443 y := auxIntToInt64(v_0_0.AuxInt)
33444 x := v_0_1
33445 if !(y&0xFFFF == 0xFFFF) {
33446 continue
33447 }
33448 v.reset(OpTrunc64to16)
33449 v.AddArg(x)
33450 return true
33451 }
33452 break
33453 }
33454 return false
33455 }
33456 func rewriteValuegeneric_OpTrunc64to32(v *Value) bool {
33457 v_0 := v.Args[0]
33458
33459
33460 for {
33461 if v_0.Op != OpConst64 {
33462 break
33463 }
33464 c := auxIntToInt64(v_0.AuxInt)
33465 v.reset(OpConst32)
33466 v.AuxInt = int32ToAuxInt(int32(c))
33467 return true
33468 }
33469
33470
33471 for {
33472 if v_0.Op != OpZeroExt8to64 {
33473 break
33474 }
33475 x := v_0.Args[0]
33476 v.reset(OpZeroExt8to32)
33477 v.AddArg(x)
33478 return true
33479 }
33480
33481
33482 for {
33483 if v_0.Op != OpZeroExt16to64 {
33484 break
33485 }
33486 x := v_0.Args[0]
33487 v.reset(OpZeroExt16to32)
33488 v.AddArg(x)
33489 return true
33490 }
33491
33492
33493 for {
33494 if v_0.Op != OpZeroExt32to64 {
33495 break
33496 }
33497 x := v_0.Args[0]
33498 v.copyOf(x)
33499 return true
33500 }
33501
33502
33503 for {
33504 if v_0.Op != OpSignExt8to64 {
33505 break
33506 }
33507 x := v_0.Args[0]
33508 v.reset(OpSignExt8to32)
33509 v.AddArg(x)
33510 return true
33511 }
33512
33513
33514 for {
33515 if v_0.Op != OpSignExt16to64 {
33516 break
33517 }
33518 x := v_0.Args[0]
33519 v.reset(OpSignExt16to32)
33520 v.AddArg(x)
33521 return true
33522 }
33523
33524
33525 for {
33526 if v_0.Op != OpSignExt32to64 {
33527 break
33528 }
33529 x := v_0.Args[0]
33530 v.copyOf(x)
33531 return true
33532 }
33533
33534
33535
33536 for {
33537 if v_0.Op != OpAnd64 {
33538 break
33539 }
33540 _ = v_0.Args[1]
33541 v_0_0 := v_0.Args[0]
33542 v_0_1 := v_0.Args[1]
33543 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33544 if v_0_0.Op != OpConst64 {
33545 continue
33546 }
33547 y := auxIntToInt64(v_0_0.AuxInt)
33548 x := v_0_1
33549 if !(y&0xFFFFFFFF == 0xFFFFFFFF) {
33550 continue
33551 }
33552 v.reset(OpTrunc64to32)
33553 v.AddArg(x)
33554 return true
33555 }
33556 break
33557 }
33558 return false
33559 }
33560 func rewriteValuegeneric_OpTrunc64to8(v *Value) bool {
33561 v_0 := v.Args[0]
33562
33563
33564 for {
33565 if v_0.Op != OpConst64 {
33566 break
33567 }
33568 c := auxIntToInt64(v_0.AuxInt)
33569 v.reset(OpConst8)
33570 v.AuxInt = int8ToAuxInt(int8(c))
33571 return true
33572 }
33573
33574
33575 for {
33576 if v_0.Op != OpZeroExt8to64 {
33577 break
33578 }
33579 x := v_0.Args[0]
33580 v.copyOf(x)
33581 return true
33582 }
33583
33584
33585 for {
33586 if v_0.Op != OpSignExt8to64 {
33587 break
33588 }
33589 x := v_0.Args[0]
33590 v.copyOf(x)
33591 return true
33592 }
33593
33594
33595
33596 for {
33597 if v_0.Op != OpAnd64 {
33598 break
33599 }
33600 _ = v_0.Args[1]
33601 v_0_0 := v_0.Args[0]
33602 v_0_1 := v_0.Args[1]
33603 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33604 if v_0_0.Op != OpConst64 {
33605 continue
33606 }
33607 y := auxIntToInt64(v_0_0.AuxInt)
33608 x := v_0_1
33609 if !(y&0xFF == 0xFF) {
33610 continue
33611 }
33612 v.reset(OpTrunc64to8)
33613 v.AddArg(x)
33614 return true
33615 }
33616 break
33617 }
33618 return false
33619 }
33620 func rewriteValuegeneric_OpXor16(v *Value) bool {
33621 v_1 := v.Args[1]
33622 v_0 := v.Args[0]
33623 b := v.Block
33624 config := b.Func.Config
33625
33626
33627 for {
33628 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33629 if v_0.Op != OpConst16 {
33630 continue
33631 }
33632 c := auxIntToInt16(v_0.AuxInt)
33633 if v_1.Op != OpConst16 {
33634 continue
33635 }
33636 d := auxIntToInt16(v_1.AuxInt)
33637 v.reset(OpConst16)
33638 v.AuxInt = int16ToAuxInt(c ^ d)
33639 return true
33640 }
33641 break
33642 }
33643
33644
33645 for {
33646 x := v_0
33647 if x != v_1 {
33648 break
33649 }
33650 v.reset(OpConst16)
33651 v.AuxInt = int16ToAuxInt(0)
33652 return true
33653 }
33654
33655
33656 for {
33657 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33658 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
33659 continue
33660 }
33661 x := v_1
33662 v.copyOf(x)
33663 return true
33664 }
33665 break
33666 }
33667
33668
33669 for {
33670 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33671 if v_0.Op != OpCom16 {
33672 continue
33673 }
33674 x := v_0.Args[0]
33675 if x != v_1 {
33676 continue
33677 }
33678 v.reset(OpConst16)
33679 v.AuxInt = int16ToAuxInt(-1)
33680 return true
33681 }
33682 break
33683 }
33684
33685
33686 for {
33687 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33688 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
33689 continue
33690 }
33691 x := v_1
33692 v.reset(OpCom16)
33693 v.AddArg(x)
33694 return true
33695 }
33696 break
33697 }
33698
33699
33700 for {
33701 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33702 x := v_0
33703 if v_1.Op != OpXor16 {
33704 continue
33705 }
33706 _ = v_1.Args[1]
33707 v_1_0 := v_1.Args[0]
33708 v_1_1 := v_1.Args[1]
33709 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33710 if x != v_1_0 {
33711 continue
33712 }
33713 y := v_1_1
33714 v.copyOf(y)
33715 return true
33716 }
33717 }
33718 break
33719 }
33720
33721
33722
33723 for {
33724 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33725 if v_0.Op != OpXor16 {
33726 continue
33727 }
33728 _ = v_0.Args[1]
33729 v_0_0 := v_0.Args[0]
33730 v_0_1 := v_0.Args[1]
33731 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
33732 i := v_0_0
33733 if i.Op != OpConst16 {
33734 continue
33735 }
33736 t := i.Type
33737 z := v_0_1
33738 x := v_1
33739 if !(z.Op != OpConst16 && x.Op != OpConst16) {
33740 continue
33741 }
33742 v.reset(OpXor16)
33743 v0 := b.NewValue0(v.Pos, OpXor16, t)
33744 v0.AddArg2(z, x)
33745 v.AddArg2(i, v0)
33746 return true
33747 }
33748 }
33749 break
33750 }
33751
33752
33753 for {
33754 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33755 if v_0.Op != OpConst16 {
33756 continue
33757 }
33758 t := v_0.Type
33759 c := auxIntToInt16(v_0.AuxInt)
33760 if v_1.Op != OpXor16 {
33761 continue
33762 }
33763 _ = v_1.Args[1]
33764 v_1_0 := v_1.Args[0]
33765 v_1_1 := v_1.Args[1]
33766 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33767 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
33768 continue
33769 }
33770 d := auxIntToInt16(v_1_0.AuxInt)
33771 x := v_1_1
33772 v.reset(OpXor16)
33773 v0 := b.NewValue0(v.Pos, OpConst16, t)
33774 v0.AuxInt = int16ToAuxInt(c ^ d)
33775 v.AddArg2(v0, x)
33776 return true
33777 }
33778 }
33779 break
33780 }
33781
33782
33783
33784 for {
33785 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33786 if v_0.Op != OpLsh16x64 {
33787 continue
33788 }
33789 _ = v_0.Args[1]
33790 x := v_0.Args[0]
33791 z := v_0.Args[1]
33792 if z.Op != OpConst64 {
33793 continue
33794 }
33795 c := auxIntToInt64(z.AuxInt)
33796 if v_1.Op != OpRsh16Ux64 {
33797 continue
33798 }
33799 _ = v_1.Args[1]
33800 if x != v_1.Args[0] {
33801 continue
33802 }
33803 v_1_1 := v_1.Args[1]
33804 if v_1_1.Op != OpConst64 {
33805 continue
33806 }
33807 d := auxIntToInt64(v_1_1.AuxInt)
33808 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
33809 continue
33810 }
33811 v.reset(OpRotateLeft16)
33812 v.AddArg2(x, z)
33813 return true
33814 }
33815 break
33816 }
33817
33818
33819
33820 for {
33821 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33822 left := v_0
33823 if left.Op != OpLsh16x64 {
33824 continue
33825 }
33826 y := left.Args[1]
33827 x := left.Args[0]
33828 right := v_1
33829 if right.Op != OpRsh16Ux64 {
33830 continue
33831 }
33832 _ = right.Args[1]
33833 if x != right.Args[0] {
33834 continue
33835 }
33836 right_1 := right.Args[1]
33837 if right_1.Op != OpSub64 {
33838 continue
33839 }
33840 _ = right_1.Args[1]
33841 right_1_0 := right_1.Args[0]
33842 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
33843 continue
33844 }
33845 v.reset(OpRotateLeft16)
33846 v.AddArg2(x, y)
33847 return true
33848 }
33849 break
33850 }
33851
33852
33853
33854 for {
33855 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33856 left := v_0
33857 if left.Op != OpLsh16x32 {
33858 continue
33859 }
33860 y := left.Args[1]
33861 x := left.Args[0]
33862 right := v_1
33863 if right.Op != OpRsh16Ux32 {
33864 continue
33865 }
33866 _ = right.Args[1]
33867 if x != right.Args[0] {
33868 continue
33869 }
33870 right_1 := right.Args[1]
33871 if right_1.Op != OpSub32 {
33872 continue
33873 }
33874 _ = right_1.Args[1]
33875 right_1_0 := right_1.Args[0]
33876 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
33877 continue
33878 }
33879 v.reset(OpRotateLeft16)
33880 v.AddArg2(x, y)
33881 return true
33882 }
33883 break
33884 }
33885
33886
33887
33888 for {
33889 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33890 left := v_0
33891 if left.Op != OpLsh16x16 {
33892 continue
33893 }
33894 y := left.Args[1]
33895 x := left.Args[0]
33896 right := v_1
33897 if right.Op != OpRsh16Ux16 {
33898 continue
33899 }
33900 _ = right.Args[1]
33901 if x != right.Args[0] {
33902 continue
33903 }
33904 right_1 := right.Args[1]
33905 if right_1.Op != OpSub16 {
33906 continue
33907 }
33908 _ = right_1.Args[1]
33909 right_1_0 := right_1.Args[0]
33910 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
33911 continue
33912 }
33913 v.reset(OpRotateLeft16)
33914 v.AddArg2(x, y)
33915 return true
33916 }
33917 break
33918 }
33919
33920
33921
33922 for {
33923 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33924 left := v_0
33925 if left.Op != OpLsh16x8 {
33926 continue
33927 }
33928 y := left.Args[1]
33929 x := left.Args[0]
33930 right := v_1
33931 if right.Op != OpRsh16Ux8 {
33932 continue
33933 }
33934 _ = right.Args[1]
33935 if x != right.Args[0] {
33936 continue
33937 }
33938 right_1 := right.Args[1]
33939 if right_1.Op != OpSub8 {
33940 continue
33941 }
33942 _ = right_1.Args[1]
33943 right_1_0 := right_1.Args[0]
33944 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
33945 continue
33946 }
33947 v.reset(OpRotateLeft16)
33948 v.AddArg2(x, y)
33949 return true
33950 }
33951 break
33952 }
33953
33954
33955
33956 for {
33957 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33958 right := v_0
33959 if right.Op != OpRsh16Ux64 {
33960 continue
33961 }
33962 y := right.Args[1]
33963 x := right.Args[0]
33964 left := v_1
33965 if left.Op != OpLsh16x64 {
33966 continue
33967 }
33968 _ = left.Args[1]
33969 if x != left.Args[0] {
33970 continue
33971 }
33972 z := left.Args[1]
33973 if z.Op != OpSub64 {
33974 continue
33975 }
33976 _ = z.Args[1]
33977 z_0 := z.Args[0]
33978 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
33979 continue
33980 }
33981 v.reset(OpRotateLeft16)
33982 v.AddArg2(x, z)
33983 return true
33984 }
33985 break
33986 }
33987
33988
33989
33990 for {
33991 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
33992 right := v_0
33993 if right.Op != OpRsh16Ux32 {
33994 continue
33995 }
33996 y := right.Args[1]
33997 x := right.Args[0]
33998 left := v_1
33999 if left.Op != OpLsh16x32 {
34000 continue
34001 }
34002 _ = left.Args[1]
34003 if x != left.Args[0] {
34004 continue
34005 }
34006 z := left.Args[1]
34007 if z.Op != OpSub32 {
34008 continue
34009 }
34010 _ = z.Args[1]
34011 z_0 := z.Args[0]
34012 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
34013 continue
34014 }
34015 v.reset(OpRotateLeft16)
34016 v.AddArg2(x, z)
34017 return true
34018 }
34019 break
34020 }
34021
34022
34023
34024 for {
34025 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34026 right := v_0
34027 if right.Op != OpRsh16Ux16 {
34028 continue
34029 }
34030 y := right.Args[1]
34031 x := right.Args[0]
34032 left := v_1
34033 if left.Op != OpLsh16x16 {
34034 continue
34035 }
34036 _ = left.Args[1]
34037 if x != left.Args[0] {
34038 continue
34039 }
34040 z := left.Args[1]
34041 if z.Op != OpSub16 {
34042 continue
34043 }
34044 _ = z.Args[1]
34045 z_0 := z.Args[0]
34046 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
34047 continue
34048 }
34049 v.reset(OpRotateLeft16)
34050 v.AddArg2(x, z)
34051 return true
34052 }
34053 break
34054 }
34055
34056
34057
34058 for {
34059 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34060 right := v_0
34061 if right.Op != OpRsh16Ux8 {
34062 continue
34063 }
34064 y := right.Args[1]
34065 x := right.Args[0]
34066 left := v_1
34067 if left.Op != OpLsh16x8 {
34068 continue
34069 }
34070 _ = left.Args[1]
34071 if x != left.Args[0] {
34072 continue
34073 }
34074 z := left.Args[1]
34075 if z.Op != OpSub8 {
34076 continue
34077 }
34078 _ = z.Args[1]
34079 z_0 := z.Args[0]
34080 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
34081 continue
34082 }
34083 v.reset(OpRotateLeft16)
34084 v.AddArg2(x, z)
34085 return true
34086 }
34087 break
34088 }
34089 return false
34090 }
34091 func rewriteValuegeneric_OpXor32(v *Value) bool {
34092 v_1 := v.Args[1]
34093 v_0 := v.Args[0]
34094 b := v.Block
34095 config := b.Func.Config
34096
34097
34098 for {
34099 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34100 if v_0.Op != OpConst32 {
34101 continue
34102 }
34103 c := auxIntToInt32(v_0.AuxInt)
34104 if v_1.Op != OpConst32 {
34105 continue
34106 }
34107 d := auxIntToInt32(v_1.AuxInt)
34108 v.reset(OpConst32)
34109 v.AuxInt = int32ToAuxInt(c ^ d)
34110 return true
34111 }
34112 break
34113 }
34114
34115
34116 for {
34117 x := v_0
34118 if x != v_1 {
34119 break
34120 }
34121 v.reset(OpConst32)
34122 v.AuxInt = int32ToAuxInt(0)
34123 return true
34124 }
34125
34126
34127 for {
34128 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34129 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
34130 continue
34131 }
34132 x := v_1
34133 v.copyOf(x)
34134 return true
34135 }
34136 break
34137 }
34138
34139
34140 for {
34141 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34142 if v_0.Op != OpCom32 {
34143 continue
34144 }
34145 x := v_0.Args[0]
34146 if x != v_1 {
34147 continue
34148 }
34149 v.reset(OpConst32)
34150 v.AuxInt = int32ToAuxInt(-1)
34151 return true
34152 }
34153 break
34154 }
34155
34156
34157 for {
34158 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34159 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
34160 continue
34161 }
34162 x := v_1
34163 v.reset(OpCom32)
34164 v.AddArg(x)
34165 return true
34166 }
34167 break
34168 }
34169
34170
34171 for {
34172 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34173 x := v_0
34174 if v_1.Op != OpXor32 {
34175 continue
34176 }
34177 _ = v_1.Args[1]
34178 v_1_0 := v_1.Args[0]
34179 v_1_1 := v_1.Args[1]
34180 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34181 if x != v_1_0 {
34182 continue
34183 }
34184 y := v_1_1
34185 v.copyOf(y)
34186 return true
34187 }
34188 }
34189 break
34190 }
34191
34192
34193
34194 for {
34195 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34196 if v_0.Op != OpXor32 {
34197 continue
34198 }
34199 _ = v_0.Args[1]
34200 v_0_0 := v_0.Args[0]
34201 v_0_1 := v_0.Args[1]
34202 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
34203 i := v_0_0
34204 if i.Op != OpConst32 {
34205 continue
34206 }
34207 t := i.Type
34208 z := v_0_1
34209 x := v_1
34210 if !(z.Op != OpConst32 && x.Op != OpConst32) {
34211 continue
34212 }
34213 v.reset(OpXor32)
34214 v0 := b.NewValue0(v.Pos, OpXor32, t)
34215 v0.AddArg2(z, x)
34216 v.AddArg2(i, v0)
34217 return true
34218 }
34219 }
34220 break
34221 }
34222
34223
34224 for {
34225 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34226 if v_0.Op != OpConst32 {
34227 continue
34228 }
34229 t := v_0.Type
34230 c := auxIntToInt32(v_0.AuxInt)
34231 if v_1.Op != OpXor32 {
34232 continue
34233 }
34234 _ = v_1.Args[1]
34235 v_1_0 := v_1.Args[0]
34236 v_1_1 := v_1.Args[1]
34237 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34238 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
34239 continue
34240 }
34241 d := auxIntToInt32(v_1_0.AuxInt)
34242 x := v_1_1
34243 v.reset(OpXor32)
34244 v0 := b.NewValue0(v.Pos, OpConst32, t)
34245 v0.AuxInt = int32ToAuxInt(c ^ d)
34246 v.AddArg2(v0, x)
34247 return true
34248 }
34249 }
34250 break
34251 }
34252
34253
34254
34255 for {
34256 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34257 if v_0.Op != OpLsh32x64 {
34258 continue
34259 }
34260 _ = v_0.Args[1]
34261 x := v_0.Args[0]
34262 z := v_0.Args[1]
34263 if z.Op != OpConst64 {
34264 continue
34265 }
34266 c := auxIntToInt64(z.AuxInt)
34267 if v_1.Op != OpRsh32Ux64 {
34268 continue
34269 }
34270 _ = v_1.Args[1]
34271 if x != v_1.Args[0] {
34272 continue
34273 }
34274 v_1_1 := v_1.Args[1]
34275 if v_1_1.Op != OpConst64 {
34276 continue
34277 }
34278 d := auxIntToInt64(v_1_1.AuxInt)
34279 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
34280 continue
34281 }
34282 v.reset(OpRotateLeft32)
34283 v.AddArg2(x, z)
34284 return true
34285 }
34286 break
34287 }
34288
34289
34290
34291 for {
34292 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34293 left := v_0
34294 if left.Op != OpLsh32x64 {
34295 continue
34296 }
34297 y := left.Args[1]
34298 x := left.Args[0]
34299 right := v_1
34300 if right.Op != OpRsh32Ux64 {
34301 continue
34302 }
34303 _ = right.Args[1]
34304 if x != right.Args[0] {
34305 continue
34306 }
34307 right_1 := right.Args[1]
34308 if right_1.Op != OpSub64 {
34309 continue
34310 }
34311 _ = right_1.Args[1]
34312 right_1_0 := right_1.Args[0]
34313 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
34314 continue
34315 }
34316 v.reset(OpRotateLeft32)
34317 v.AddArg2(x, y)
34318 return true
34319 }
34320 break
34321 }
34322
34323
34324
34325 for {
34326 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34327 left := v_0
34328 if left.Op != OpLsh32x32 {
34329 continue
34330 }
34331 y := left.Args[1]
34332 x := left.Args[0]
34333 right := v_1
34334 if right.Op != OpRsh32Ux32 {
34335 continue
34336 }
34337 _ = right.Args[1]
34338 if x != right.Args[0] {
34339 continue
34340 }
34341 right_1 := right.Args[1]
34342 if right_1.Op != OpSub32 {
34343 continue
34344 }
34345 _ = right_1.Args[1]
34346 right_1_0 := right_1.Args[0]
34347 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
34348 continue
34349 }
34350 v.reset(OpRotateLeft32)
34351 v.AddArg2(x, y)
34352 return true
34353 }
34354 break
34355 }
34356
34357
34358
34359 for {
34360 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34361 left := v_0
34362 if left.Op != OpLsh32x16 {
34363 continue
34364 }
34365 y := left.Args[1]
34366 x := left.Args[0]
34367 right := v_1
34368 if right.Op != OpRsh32Ux16 {
34369 continue
34370 }
34371 _ = right.Args[1]
34372 if x != right.Args[0] {
34373 continue
34374 }
34375 right_1 := right.Args[1]
34376 if right_1.Op != OpSub16 {
34377 continue
34378 }
34379 _ = right_1.Args[1]
34380 right_1_0 := right_1.Args[0]
34381 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
34382 continue
34383 }
34384 v.reset(OpRotateLeft32)
34385 v.AddArg2(x, y)
34386 return true
34387 }
34388 break
34389 }
34390
34391
34392
34393 for {
34394 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34395 left := v_0
34396 if left.Op != OpLsh32x8 {
34397 continue
34398 }
34399 y := left.Args[1]
34400 x := left.Args[0]
34401 right := v_1
34402 if right.Op != OpRsh32Ux8 {
34403 continue
34404 }
34405 _ = right.Args[1]
34406 if x != right.Args[0] {
34407 continue
34408 }
34409 right_1 := right.Args[1]
34410 if right_1.Op != OpSub8 {
34411 continue
34412 }
34413 _ = right_1.Args[1]
34414 right_1_0 := right_1.Args[0]
34415 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
34416 continue
34417 }
34418 v.reset(OpRotateLeft32)
34419 v.AddArg2(x, y)
34420 return true
34421 }
34422 break
34423 }
34424
34425
34426
34427 for {
34428 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34429 right := v_0
34430 if right.Op != OpRsh32Ux64 {
34431 continue
34432 }
34433 y := right.Args[1]
34434 x := right.Args[0]
34435 left := v_1
34436 if left.Op != OpLsh32x64 {
34437 continue
34438 }
34439 _ = left.Args[1]
34440 if x != left.Args[0] {
34441 continue
34442 }
34443 z := left.Args[1]
34444 if z.Op != OpSub64 {
34445 continue
34446 }
34447 _ = z.Args[1]
34448 z_0 := z.Args[0]
34449 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
34450 continue
34451 }
34452 v.reset(OpRotateLeft32)
34453 v.AddArg2(x, z)
34454 return true
34455 }
34456 break
34457 }
34458
34459
34460
34461 for {
34462 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34463 right := v_0
34464 if right.Op != OpRsh32Ux32 {
34465 continue
34466 }
34467 y := right.Args[1]
34468 x := right.Args[0]
34469 left := v_1
34470 if left.Op != OpLsh32x32 {
34471 continue
34472 }
34473 _ = left.Args[1]
34474 if x != left.Args[0] {
34475 continue
34476 }
34477 z := left.Args[1]
34478 if z.Op != OpSub32 {
34479 continue
34480 }
34481 _ = z.Args[1]
34482 z_0 := z.Args[0]
34483 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
34484 continue
34485 }
34486 v.reset(OpRotateLeft32)
34487 v.AddArg2(x, z)
34488 return true
34489 }
34490 break
34491 }
34492
34493
34494
34495 for {
34496 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34497 right := v_0
34498 if right.Op != OpRsh32Ux16 {
34499 continue
34500 }
34501 y := right.Args[1]
34502 x := right.Args[0]
34503 left := v_1
34504 if left.Op != OpLsh32x16 {
34505 continue
34506 }
34507 _ = left.Args[1]
34508 if x != left.Args[0] {
34509 continue
34510 }
34511 z := left.Args[1]
34512 if z.Op != OpSub16 {
34513 continue
34514 }
34515 _ = z.Args[1]
34516 z_0 := z.Args[0]
34517 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
34518 continue
34519 }
34520 v.reset(OpRotateLeft32)
34521 v.AddArg2(x, z)
34522 return true
34523 }
34524 break
34525 }
34526
34527
34528
34529 for {
34530 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34531 right := v_0
34532 if right.Op != OpRsh32Ux8 {
34533 continue
34534 }
34535 y := right.Args[1]
34536 x := right.Args[0]
34537 left := v_1
34538 if left.Op != OpLsh32x8 {
34539 continue
34540 }
34541 _ = left.Args[1]
34542 if x != left.Args[0] {
34543 continue
34544 }
34545 z := left.Args[1]
34546 if z.Op != OpSub8 {
34547 continue
34548 }
34549 _ = z.Args[1]
34550 z_0 := z.Args[0]
34551 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
34552 continue
34553 }
34554 v.reset(OpRotateLeft32)
34555 v.AddArg2(x, z)
34556 return true
34557 }
34558 break
34559 }
34560 return false
34561 }
34562 func rewriteValuegeneric_OpXor64(v *Value) bool {
34563 v_1 := v.Args[1]
34564 v_0 := v.Args[0]
34565 b := v.Block
34566 config := b.Func.Config
34567
34568
34569 for {
34570 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34571 if v_0.Op != OpConst64 {
34572 continue
34573 }
34574 c := auxIntToInt64(v_0.AuxInt)
34575 if v_1.Op != OpConst64 {
34576 continue
34577 }
34578 d := auxIntToInt64(v_1.AuxInt)
34579 v.reset(OpConst64)
34580 v.AuxInt = int64ToAuxInt(c ^ d)
34581 return true
34582 }
34583 break
34584 }
34585
34586
34587 for {
34588 x := v_0
34589 if x != v_1 {
34590 break
34591 }
34592 v.reset(OpConst64)
34593 v.AuxInt = int64ToAuxInt(0)
34594 return true
34595 }
34596
34597
34598 for {
34599 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34600 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
34601 continue
34602 }
34603 x := v_1
34604 v.copyOf(x)
34605 return true
34606 }
34607 break
34608 }
34609
34610
34611 for {
34612 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34613 if v_0.Op != OpCom64 {
34614 continue
34615 }
34616 x := v_0.Args[0]
34617 if x != v_1 {
34618 continue
34619 }
34620 v.reset(OpConst64)
34621 v.AuxInt = int64ToAuxInt(-1)
34622 return true
34623 }
34624 break
34625 }
34626
34627
34628 for {
34629 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34630 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
34631 continue
34632 }
34633 x := v_1
34634 v.reset(OpCom64)
34635 v.AddArg(x)
34636 return true
34637 }
34638 break
34639 }
34640
34641
34642 for {
34643 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34644 x := v_0
34645 if v_1.Op != OpXor64 {
34646 continue
34647 }
34648 _ = v_1.Args[1]
34649 v_1_0 := v_1.Args[0]
34650 v_1_1 := v_1.Args[1]
34651 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34652 if x != v_1_0 {
34653 continue
34654 }
34655 y := v_1_1
34656 v.copyOf(y)
34657 return true
34658 }
34659 }
34660 break
34661 }
34662
34663
34664
34665 for {
34666 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34667 if v_0.Op != OpXor64 {
34668 continue
34669 }
34670 _ = v_0.Args[1]
34671 v_0_0 := v_0.Args[0]
34672 v_0_1 := v_0.Args[1]
34673 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
34674 i := v_0_0
34675 if i.Op != OpConst64 {
34676 continue
34677 }
34678 t := i.Type
34679 z := v_0_1
34680 x := v_1
34681 if !(z.Op != OpConst64 && x.Op != OpConst64) {
34682 continue
34683 }
34684 v.reset(OpXor64)
34685 v0 := b.NewValue0(v.Pos, OpXor64, t)
34686 v0.AddArg2(z, x)
34687 v.AddArg2(i, v0)
34688 return true
34689 }
34690 }
34691 break
34692 }
34693
34694
34695 for {
34696 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34697 if v_0.Op != OpConst64 {
34698 continue
34699 }
34700 t := v_0.Type
34701 c := auxIntToInt64(v_0.AuxInt)
34702 if v_1.Op != OpXor64 {
34703 continue
34704 }
34705 _ = v_1.Args[1]
34706 v_1_0 := v_1.Args[0]
34707 v_1_1 := v_1.Args[1]
34708 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34709 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
34710 continue
34711 }
34712 d := auxIntToInt64(v_1_0.AuxInt)
34713 x := v_1_1
34714 v.reset(OpXor64)
34715 v0 := b.NewValue0(v.Pos, OpConst64, t)
34716 v0.AuxInt = int64ToAuxInt(c ^ d)
34717 v.AddArg2(v0, x)
34718 return true
34719 }
34720 }
34721 break
34722 }
34723
34724
34725
34726 for {
34727 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34728 if v_0.Op != OpLsh64x64 {
34729 continue
34730 }
34731 _ = v_0.Args[1]
34732 x := v_0.Args[0]
34733 z := v_0.Args[1]
34734 if z.Op != OpConst64 {
34735 continue
34736 }
34737 c := auxIntToInt64(z.AuxInt)
34738 if v_1.Op != OpRsh64Ux64 {
34739 continue
34740 }
34741 _ = v_1.Args[1]
34742 if x != v_1.Args[0] {
34743 continue
34744 }
34745 v_1_1 := v_1.Args[1]
34746 if v_1_1.Op != OpConst64 {
34747 continue
34748 }
34749 d := auxIntToInt64(v_1_1.AuxInt)
34750 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
34751 continue
34752 }
34753 v.reset(OpRotateLeft64)
34754 v.AddArg2(x, z)
34755 return true
34756 }
34757 break
34758 }
34759
34760
34761
34762 for {
34763 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34764 left := v_0
34765 if left.Op != OpLsh64x64 {
34766 continue
34767 }
34768 y := left.Args[1]
34769 x := left.Args[0]
34770 right := v_1
34771 if right.Op != OpRsh64Ux64 {
34772 continue
34773 }
34774 _ = right.Args[1]
34775 if x != right.Args[0] {
34776 continue
34777 }
34778 right_1 := right.Args[1]
34779 if right_1.Op != OpSub64 {
34780 continue
34781 }
34782 _ = right_1.Args[1]
34783 right_1_0 := right_1.Args[0]
34784 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
34785 continue
34786 }
34787 v.reset(OpRotateLeft64)
34788 v.AddArg2(x, y)
34789 return true
34790 }
34791 break
34792 }
34793
34794
34795
34796 for {
34797 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34798 left := v_0
34799 if left.Op != OpLsh64x32 {
34800 continue
34801 }
34802 y := left.Args[1]
34803 x := left.Args[0]
34804 right := v_1
34805 if right.Op != OpRsh64Ux32 {
34806 continue
34807 }
34808 _ = right.Args[1]
34809 if x != right.Args[0] {
34810 continue
34811 }
34812 right_1 := right.Args[1]
34813 if right_1.Op != OpSub32 {
34814 continue
34815 }
34816 _ = right_1.Args[1]
34817 right_1_0 := right_1.Args[0]
34818 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
34819 continue
34820 }
34821 v.reset(OpRotateLeft64)
34822 v.AddArg2(x, y)
34823 return true
34824 }
34825 break
34826 }
34827
34828
34829
34830 for {
34831 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34832 left := v_0
34833 if left.Op != OpLsh64x16 {
34834 continue
34835 }
34836 y := left.Args[1]
34837 x := left.Args[0]
34838 right := v_1
34839 if right.Op != OpRsh64Ux16 {
34840 continue
34841 }
34842 _ = right.Args[1]
34843 if x != right.Args[0] {
34844 continue
34845 }
34846 right_1 := right.Args[1]
34847 if right_1.Op != OpSub16 {
34848 continue
34849 }
34850 _ = right_1.Args[1]
34851 right_1_0 := right_1.Args[0]
34852 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
34853 continue
34854 }
34855 v.reset(OpRotateLeft64)
34856 v.AddArg2(x, y)
34857 return true
34858 }
34859 break
34860 }
34861
34862
34863
34864 for {
34865 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34866 left := v_0
34867 if left.Op != OpLsh64x8 {
34868 continue
34869 }
34870 y := left.Args[1]
34871 x := left.Args[0]
34872 right := v_1
34873 if right.Op != OpRsh64Ux8 {
34874 continue
34875 }
34876 _ = right.Args[1]
34877 if x != right.Args[0] {
34878 continue
34879 }
34880 right_1 := right.Args[1]
34881 if right_1.Op != OpSub8 {
34882 continue
34883 }
34884 _ = right_1.Args[1]
34885 right_1_0 := right_1.Args[0]
34886 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
34887 continue
34888 }
34889 v.reset(OpRotateLeft64)
34890 v.AddArg2(x, y)
34891 return true
34892 }
34893 break
34894 }
34895
34896
34897
34898 for {
34899 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34900 right := v_0
34901 if right.Op != OpRsh64Ux64 {
34902 continue
34903 }
34904 y := right.Args[1]
34905 x := right.Args[0]
34906 left := v_1
34907 if left.Op != OpLsh64x64 {
34908 continue
34909 }
34910 _ = left.Args[1]
34911 if x != left.Args[0] {
34912 continue
34913 }
34914 z := left.Args[1]
34915 if z.Op != OpSub64 {
34916 continue
34917 }
34918 _ = z.Args[1]
34919 z_0 := z.Args[0]
34920 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
34921 continue
34922 }
34923 v.reset(OpRotateLeft64)
34924 v.AddArg2(x, z)
34925 return true
34926 }
34927 break
34928 }
34929
34930
34931
34932 for {
34933 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34934 right := v_0
34935 if right.Op != OpRsh64Ux32 {
34936 continue
34937 }
34938 y := right.Args[1]
34939 x := right.Args[0]
34940 left := v_1
34941 if left.Op != OpLsh64x32 {
34942 continue
34943 }
34944 _ = left.Args[1]
34945 if x != left.Args[0] {
34946 continue
34947 }
34948 z := left.Args[1]
34949 if z.Op != OpSub32 {
34950 continue
34951 }
34952 _ = z.Args[1]
34953 z_0 := z.Args[0]
34954 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
34955 continue
34956 }
34957 v.reset(OpRotateLeft64)
34958 v.AddArg2(x, z)
34959 return true
34960 }
34961 break
34962 }
34963
34964
34965
34966 for {
34967 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34968 right := v_0
34969 if right.Op != OpRsh64Ux16 {
34970 continue
34971 }
34972 y := right.Args[1]
34973 x := right.Args[0]
34974 left := v_1
34975 if left.Op != OpLsh64x16 {
34976 continue
34977 }
34978 _ = left.Args[1]
34979 if x != left.Args[0] {
34980 continue
34981 }
34982 z := left.Args[1]
34983 if z.Op != OpSub16 {
34984 continue
34985 }
34986 _ = z.Args[1]
34987 z_0 := z.Args[0]
34988 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
34989 continue
34990 }
34991 v.reset(OpRotateLeft64)
34992 v.AddArg2(x, z)
34993 return true
34994 }
34995 break
34996 }
34997
34998
34999
35000 for {
35001 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35002 right := v_0
35003 if right.Op != OpRsh64Ux8 {
35004 continue
35005 }
35006 y := right.Args[1]
35007 x := right.Args[0]
35008 left := v_1
35009 if left.Op != OpLsh64x8 {
35010 continue
35011 }
35012 _ = left.Args[1]
35013 if x != left.Args[0] {
35014 continue
35015 }
35016 z := left.Args[1]
35017 if z.Op != OpSub8 {
35018 continue
35019 }
35020 _ = z.Args[1]
35021 z_0 := z.Args[0]
35022 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
35023 continue
35024 }
35025 v.reset(OpRotateLeft64)
35026 v.AddArg2(x, z)
35027 return true
35028 }
35029 break
35030 }
35031 return false
35032 }
35033 func rewriteValuegeneric_OpXor8(v *Value) bool {
35034 v_1 := v.Args[1]
35035 v_0 := v.Args[0]
35036 b := v.Block
35037 config := b.Func.Config
35038
35039
35040 for {
35041 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35042 if v_0.Op != OpConst8 {
35043 continue
35044 }
35045 c := auxIntToInt8(v_0.AuxInt)
35046 if v_1.Op != OpConst8 {
35047 continue
35048 }
35049 d := auxIntToInt8(v_1.AuxInt)
35050 v.reset(OpConst8)
35051 v.AuxInt = int8ToAuxInt(c ^ d)
35052 return true
35053 }
35054 break
35055 }
35056
35057
35058 for {
35059 x := v_0
35060 if x != v_1 {
35061 break
35062 }
35063 v.reset(OpConst8)
35064 v.AuxInt = int8ToAuxInt(0)
35065 return true
35066 }
35067
35068
35069 for {
35070 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35071 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
35072 continue
35073 }
35074 x := v_1
35075 v.copyOf(x)
35076 return true
35077 }
35078 break
35079 }
35080
35081
35082 for {
35083 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35084 if v_0.Op != OpCom8 {
35085 continue
35086 }
35087 x := v_0.Args[0]
35088 if x != v_1 {
35089 continue
35090 }
35091 v.reset(OpConst8)
35092 v.AuxInt = int8ToAuxInt(-1)
35093 return true
35094 }
35095 break
35096 }
35097
35098
35099 for {
35100 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35101 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
35102 continue
35103 }
35104 x := v_1
35105 v.reset(OpCom8)
35106 v.AddArg(x)
35107 return true
35108 }
35109 break
35110 }
35111
35112
35113 for {
35114 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35115 x := v_0
35116 if v_1.Op != OpXor8 {
35117 continue
35118 }
35119 _ = v_1.Args[1]
35120 v_1_0 := v_1.Args[0]
35121 v_1_1 := v_1.Args[1]
35122 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35123 if x != v_1_0 {
35124 continue
35125 }
35126 y := v_1_1
35127 v.copyOf(y)
35128 return true
35129 }
35130 }
35131 break
35132 }
35133
35134
35135
35136 for {
35137 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35138 if v_0.Op != OpXor8 {
35139 continue
35140 }
35141 _ = v_0.Args[1]
35142 v_0_0 := v_0.Args[0]
35143 v_0_1 := v_0.Args[1]
35144 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
35145 i := v_0_0
35146 if i.Op != OpConst8 {
35147 continue
35148 }
35149 t := i.Type
35150 z := v_0_1
35151 x := v_1
35152 if !(z.Op != OpConst8 && x.Op != OpConst8) {
35153 continue
35154 }
35155 v.reset(OpXor8)
35156 v0 := b.NewValue0(v.Pos, OpXor8, t)
35157 v0.AddArg2(z, x)
35158 v.AddArg2(i, v0)
35159 return true
35160 }
35161 }
35162 break
35163 }
35164
35165
35166 for {
35167 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35168 if v_0.Op != OpConst8 {
35169 continue
35170 }
35171 t := v_0.Type
35172 c := auxIntToInt8(v_0.AuxInt)
35173 if v_1.Op != OpXor8 {
35174 continue
35175 }
35176 _ = v_1.Args[1]
35177 v_1_0 := v_1.Args[0]
35178 v_1_1 := v_1.Args[1]
35179 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35180 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
35181 continue
35182 }
35183 d := auxIntToInt8(v_1_0.AuxInt)
35184 x := v_1_1
35185 v.reset(OpXor8)
35186 v0 := b.NewValue0(v.Pos, OpConst8, t)
35187 v0.AuxInt = int8ToAuxInt(c ^ d)
35188 v.AddArg2(v0, x)
35189 return true
35190 }
35191 }
35192 break
35193 }
35194
35195
35196
35197 for {
35198 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35199 if v_0.Op != OpLsh8x64 {
35200 continue
35201 }
35202 _ = v_0.Args[1]
35203 x := v_0.Args[0]
35204 z := v_0.Args[1]
35205 if z.Op != OpConst64 {
35206 continue
35207 }
35208 c := auxIntToInt64(z.AuxInt)
35209 if v_1.Op != OpRsh8Ux64 {
35210 continue
35211 }
35212 _ = v_1.Args[1]
35213 if x != v_1.Args[0] {
35214 continue
35215 }
35216 v_1_1 := v_1.Args[1]
35217 if v_1_1.Op != OpConst64 {
35218 continue
35219 }
35220 d := auxIntToInt64(v_1_1.AuxInt)
35221 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
35222 continue
35223 }
35224 v.reset(OpRotateLeft8)
35225 v.AddArg2(x, z)
35226 return true
35227 }
35228 break
35229 }
35230
35231
35232
35233 for {
35234 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35235 left := v_0
35236 if left.Op != OpLsh8x64 {
35237 continue
35238 }
35239 y := left.Args[1]
35240 x := left.Args[0]
35241 right := v_1
35242 if right.Op != OpRsh8Ux64 {
35243 continue
35244 }
35245 _ = right.Args[1]
35246 if x != right.Args[0] {
35247 continue
35248 }
35249 right_1 := right.Args[1]
35250 if right_1.Op != OpSub64 {
35251 continue
35252 }
35253 _ = right_1.Args[1]
35254 right_1_0 := right_1.Args[0]
35255 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
35256 continue
35257 }
35258 v.reset(OpRotateLeft8)
35259 v.AddArg2(x, y)
35260 return true
35261 }
35262 break
35263 }
35264
35265
35266
35267 for {
35268 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35269 left := v_0
35270 if left.Op != OpLsh8x32 {
35271 continue
35272 }
35273 y := left.Args[1]
35274 x := left.Args[0]
35275 right := v_1
35276 if right.Op != OpRsh8Ux32 {
35277 continue
35278 }
35279 _ = right.Args[1]
35280 if x != right.Args[0] {
35281 continue
35282 }
35283 right_1 := right.Args[1]
35284 if right_1.Op != OpSub32 {
35285 continue
35286 }
35287 _ = right_1.Args[1]
35288 right_1_0 := right_1.Args[0]
35289 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
35290 continue
35291 }
35292 v.reset(OpRotateLeft8)
35293 v.AddArg2(x, y)
35294 return true
35295 }
35296 break
35297 }
35298
35299
35300
35301 for {
35302 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35303 left := v_0
35304 if left.Op != OpLsh8x16 {
35305 continue
35306 }
35307 y := left.Args[1]
35308 x := left.Args[0]
35309 right := v_1
35310 if right.Op != OpRsh8Ux16 {
35311 continue
35312 }
35313 _ = right.Args[1]
35314 if x != right.Args[0] {
35315 continue
35316 }
35317 right_1 := right.Args[1]
35318 if right_1.Op != OpSub16 {
35319 continue
35320 }
35321 _ = right_1.Args[1]
35322 right_1_0 := right_1.Args[0]
35323 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
35324 continue
35325 }
35326 v.reset(OpRotateLeft8)
35327 v.AddArg2(x, y)
35328 return true
35329 }
35330 break
35331 }
35332
35333
35334
35335 for {
35336 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35337 left := v_0
35338 if left.Op != OpLsh8x8 {
35339 continue
35340 }
35341 y := left.Args[1]
35342 x := left.Args[0]
35343 right := v_1
35344 if right.Op != OpRsh8Ux8 {
35345 continue
35346 }
35347 _ = right.Args[1]
35348 if x != right.Args[0] {
35349 continue
35350 }
35351 right_1 := right.Args[1]
35352 if right_1.Op != OpSub8 {
35353 continue
35354 }
35355 _ = right_1.Args[1]
35356 right_1_0 := right_1.Args[0]
35357 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
35358 continue
35359 }
35360 v.reset(OpRotateLeft8)
35361 v.AddArg2(x, y)
35362 return true
35363 }
35364 break
35365 }
35366
35367
35368
35369 for {
35370 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35371 right := v_0
35372 if right.Op != OpRsh8Ux64 {
35373 continue
35374 }
35375 y := right.Args[1]
35376 x := right.Args[0]
35377 left := v_1
35378 if left.Op != OpLsh8x64 {
35379 continue
35380 }
35381 _ = left.Args[1]
35382 if x != left.Args[0] {
35383 continue
35384 }
35385 z := left.Args[1]
35386 if z.Op != OpSub64 {
35387 continue
35388 }
35389 _ = z.Args[1]
35390 z_0 := z.Args[0]
35391 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
35392 continue
35393 }
35394 v.reset(OpRotateLeft8)
35395 v.AddArg2(x, z)
35396 return true
35397 }
35398 break
35399 }
35400
35401
35402
35403 for {
35404 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35405 right := v_0
35406 if right.Op != OpRsh8Ux32 {
35407 continue
35408 }
35409 y := right.Args[1]
35410 x := right.Args[0]
35411 left := v_1
35412 if left.Op != OpLsh8x32 {
35413 continue
35414 }
35415 _ = left.Args[1]
35416 if x != left.Args[0] {
35417 continue
35418 }
35419 z := left.Args[1]
35420 if z.Op != OpSub32 {
35421 continue
35422 }
35423 _ = z.Args[1]
35424 z_0 := z.Args[0]
35425 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
35426 continue
35427 }
35428 v.reset(OpRotateLeft8)
35429 v.AddArg2(x, z)
35430 return true
35431 }
35432 break
35433 }
35434
35435
35436
35437 for {
35438 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35439 right := v_0
35440 if right.Op != OpRsh8Ux16 {
35441 continue
35442 }
35443 y := right.Args[1]
35444 x := right.Args[0]
35445 left := v_1
35446 if left.Op != OpLsh8x16 {
35447 continue
35448 }
35449 _ = left.Args[1]
35450 if x != left.Args[0] {
35451 continue
35452 }
35453 z := left.Args[1]
35454 if z.Op != OpSub16 {
35455 continue
35456 }
35457 _ = z.Args[1]
35458 z_0 := z.Args[0]
35459 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
35460 continue
35461 }
35462 v.reset(OpRotateLeft8)
35463 v.AddArg2(x, z)
35464 return true
35465 }
35466 break
35467 }
35468
35469
35470
35471 for {
35472 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35473 right := v_0
35474 if right.Op != OpRsh8Ux8 {
35475 continue
35476 }
35477 y := right.Args[1]
35478 x := right.Args[0]
35479 left := v_1
35480 if left.Op != OpLsh8x8 {
35481 continue
35482 }
35483 _ = left.Args[1]
35484 if x != left.Args[0] {
35485 continue
35486 }
35487 z := left.Args[1]
35488 if z.Op != OpSub8 {
35489 continue
35490 }
35491 _ = z.Args[1]
35492 z_0 := z.Args[0]
35493 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
35494 continue
35495 }
35496 v.reset(OpRotateLeft8)
35497 v.AddArg2(x, z)
35498 return true
35499 }
35500 break
35501 }
35502 return false
35503 }
35504 func rewriteValuegeneric_OpZero(v *Value) bool {
35505 v_1 := v.Args[1]
35506 v_0 := v.Args[0]
35507 b := v.Block
35508
35509
35510
35511 for {
35512 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
35513 break
35514 }
35515 call := v_0.Args[0]
35516 if call.Op != OpStaticLECall {
35517 break
35518 }
35519 mem := v_1
35520 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isMalloc(call.Aux)) {
35521 break
35522 }
35523 v.copyOf(mem)
35524 return true
35525 }
35526
35527
35528
35529 for {
35530 n := auxIntToInt64(v.AuxInt)
35531 t1 := auxToType(v.Aux)
35532 p1 := v_0
35533 store := v_1
35534 if store.Op != OpStore {
35535 break
35536 }
35537 t2 := auxToType(store.Aux)
35538 mem := store.Args[2]
35539 store_0 := store.Args[0]
35540 if store_0.Op != OpOffPtr {
35541 break
35542 }
35543 o2 := auxIntToInt64(store_0.AuxInt)
35544 p2 := store_0.Args[0]
35545 if !(isSamePtr(p1, p2) && store.Uses == 1 && n >= o2+t2.Size() && clobber(store)) {
35546 break
35547 }
35548 v.reset(OpZero)
35549 v.AuxInt = int64ToAuxInt(n)
35550 v.Aux = typeToAux(t1)
35551 v.AddArg2(p1, mem)
35552 return true
35553 }
35554
35555
35556
35557 for {
35558 n := auxIntToInt64(v.AuxInt)
35559 t := auxToType(v.Aux)
35560 dst1 := v_0
35561 move := v_1
35562 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
35563 break
35564 }
35565 mem := move.Args[2]
35566 dst2 := move.Args[0]
35567 if !(move.Uses == 1 && isSamePtr(dst1, dst2) && clobber(move)) {
35568 break
35569 }
35570 v.reset(OpZero)
35571 v.AuxInt = int64ToAuxInt(n)
35572 v.Aux = typeToAux(t)
35573 v.AddArg2(dst1, mem)
35574 return true
35575 }
35576
35577
35578
35579 for {
35580 n := auxIntToInt64(v.AuxInt)
35581 t := auxToType(v.Aux)
35582 dst1 := v_0
35583 vardef := v_1
35584 if vardef.Op != OpVarDef {
35585 break
35586 }
35587 x := auxToSym(vardef.Aux)
35588 move := vardef.Args[0]
35589 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
35590 break
35591 }
35592 mem := move.Args[2]
35593 dst2 := move.Args[0]
35594 if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && clobber(move, vardef)) {
35595 break
35596 }
35597 v.reset(OpZero)
35598 v.AuxInt = int64ToAuxInt(n)
35599 v.Aux = typeToAux(t)
35600 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
35601 v0.Aux = symToAux(x)
35602 v0.AddArg(mem)
35603 v.AddArg2(dst1, v0)
35604 return true
35605 }
35606
35607
35608
35609 for {
35610 s := auxIntToInt64(v.AuxInt)
35611 t := auxToType(v.Aux)
35612 dst1 := v_0
35613 zero := v_1
35614 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != s || auxToType(zero.Aux) != t {
35615 break
35616 }
35617 dst2 := zero.Args[0]
35618 if !(isSamePtr(dst1, dst2)) {
35619 break
35620 }
35621 v.copyOf(zero)
35622 return true
35623 }
35624
35625
35626
35627 for {
35628 s := auxIntToInt64(v.AuxInt)
35629 t := auxToType(v.Aux)
35630 dst1 := v_0
35631 vardef := v_1
35632 if vardef.Op != OpVarDef {
35633 break
35634 }
35635 vardef_0 := vardef.Args[0]
35636 if vardef_0.Op != OpZero || auxIntToInt64(vardef_0.AuxInt) != s || auxToType(vardef_0.Aux) != t {
35637 break
35638 }
35639 dst2 := vardef_0.Args[0]
35640 if !(isSamePtr(dst1, dst2)) {
35641 break
35642 }
35643 v.copyOf(vardef)
35644 return true
35645 }
35646 return false
35647 }
35648 func rewriteValuegeneric_OpZeroExt16to32(v *Value) bool {
35649 v_0 := v.Args[0]
35650
35651
35652 for {
35653 if v_0.Op != OpConst16 {
35654 break
35655 }
35656 c := auxIntToInt16(v_0.AuxInt)
35657 v.reset(OpConst32)
35658 v.AuxInt = int32ToAuxInt(int32(uint16(c)))
35659 return true
35660 }
35661
35662
35663
35664 for {
35665 if v_0.Op != OpTrunc32to16 {
35666 break
35667 }
35668 x := v_0.Args[0]
35669 if x.Op != OpRsh32Ux64 {
35670 break
35671 }
35672 _ = x.Args[1]
35673 x_1 := x.Args[1]
35674 if x_1.Op != OpConst64 {
35675 break
35676 }
35677 s := auxIntToInt64(x_1.AuxInt)
35678 if !(s >= 16) {
35679 break
35680 }
35681 v.copyOf(x)
35682 return true
35683 }
35684 return false
35685 }
35686 func rewriteValuegeneric_OpZeroExt16to64(v *Value) bool {
35687 v_0 := v.Args[0]
35688
35689
35690 for {
35691 if v_0.Op != OpConst16 {
35692 break
35693 }
35694 c := auxIntToInt16(v_0.AuxInt)
35695 v.reset(OpConst64)
35696 v.AuxInt = int64ToAuxInt(int64(uint16(c)))
35697 return true
35698 }
35699
35700
35701
35702 for {
35703 if v_0.Op != OpTrunc64to16 {
35704 break
35705 }
35706 x := v_0.Args[0]
35707 if x.Op != OpRsh64Ux64 {
35708 break
35709 }
35710 _ = x.Args[1]
35711 x_1 := x.Args[1]
35712 if x_1.Op != OpConst64 {
35713 break
35714 }
35715 s := auxIntToInt64(x_1.AuxInt)
35716 if !(s >= 48) {
35717 break
35718 }
35719 v.copyOf(x)
35720 return true
35721 }
35722 return false
35723 }
35724 func rewriteValuegeneric_OpZeroExt32to64(v *Value) bool {
35725 v_0 := v.Args[0]
35726
35727
35728 for {
35729 if v_0.Op != OpConst32 {
35730 break
35731 }
35732 c := auxIntToInt32(v_0.AuxInt)
35733 v.reset(OpConst64)
35734 v.AuxInt = int64ToAuxInt(int64(uint32(c)))
35735 return true
35736 }
35737
35738
35739
35740 for {
35741 if v_0.Op != OpTrunc64to32 {
35742 break
35743 }
35744 x := v_0.Args[0]
35745 if x.Op != OpRsh64Ux64 {
35746 break
35747 }
35748 _ = x.Args[1]
35749 x_1 := x.Args[1]
35750 if x_1.Op != OpConst64 {
35751 break
35752 }
35753 s := auxIntToInt64(x_1.AuxInt)
35754 if !(s >= 32) {
35755 break
35756 }
35757 v.copyOf(x)
35758 return true
35759 }
35760 return false
35761 }
35762 func rewriteValuegeneric_OpZeroExt8to16(v *Value) bool {
35763 v_0 := v.Args[0]
35764
35765
35766 for {
35767 if v_0.Op != OpConst8 {
35768 break
35769 }
35770 c := auxIntToInt8(v_0.AuxInt)
35771 v.reset(OpConst16)
35772 v.AuxInt = int16ToAuxInt(int16(uint8(c)))
35773 return true
35774 }
35775
35776
35777
35778 for {
35779 if v_0.Op != OpTrunc16to8 {
35780 break
35781 }
35782 x := v_0.Args[0]
35783 if x.Op != OpRsh16Ux64 {
35784 break
35785 }
35786 _ = x.Args[1]
35787 x_1 := x.Args[1]
35788 if x_1.Op != OpConst64 {
35789 break
35790 }
35791 s := auxIntToInt64(x_1.AuxInt)
35792 if !(s >= 8) {
35793 break
35794 }
35795 v.copyOf(x)
35796 return true
35797 }
35798 return false
35799 }
35800 func rewriteValuegeneric_OpZeroExt8to32(v *Value) bool {
35801 v_0 := v.Args[0]
35802
35803
35804 for {
35805 if v_0.Op != OpConst8 {
35806 break
35807 }
35808 c := auxIntToInt8(v_0.AuxInt)
35809 v.reset(OpConst32)
35810 v.AuxInt = int32ToAuxInt(int32(uint8(c)))
35811 return true
35812 }
35813
35814
35815
35816 for {
35817 if v_0.Op != OpTrunc32to8 {
35818 break
35819 }
35820 x := v_0.Args[0]
35821 if x.Op != OpRsh32Ux64 {
35822 break
35823 }
35824 _ = x.Args[1]
35825 x_1 := x.Args[1]
35826 if x_1.Op != OpConst64 {
35827 break
35828 }
35829 s := auxIntToInt64(x_1.AuxInt)
35830 if !(s >= 24) {
35831 break
35832 }
35833 v.copyOf(x)
35834 return true
35835 }
35836 return false
35837 }
35838 func rewriteValuegeneric_OpZeroExt8to64(v *Value) bool {
35839 v_0 := v.Args[0]
35840
35841
35842 for {
35843 if v_0.Op != OpConst8 {
35844 break
35845 }
35846 c := auxIntToInt8(v_0.AuxInt)
35847 v.reset(OpConst64)
35848 v.AuxInt = int64ToAuxInt(int64(uint8(c)))
35849 return true
35850 }
35851
35852
35853
35854 for {
35855 if v_0.Op != OpTrunc64to8 {
35856 break
35857 }
35858 x := v_0.Args[0]
35859 if x.Op != OpRsh64Ux64 {
35860 break
35861 }
35862 _ = x.Args[1]
35863 x_1 := x.Args[1]
35864 if x_1.Op != OpConst64 {
35865 break
35866 }
35867 s := auxIntToInt64(x_1.AuxInt)
35868 if !(s >= 56) {
35869 break
35870 }
35871 v.copyOf(x)
35872 return true
35873 }
35874 return false
35875 }
35876 func rewriteBlockgeneric(b *Block) bool {
35877 switch b.Kind {
35878 case BlockIf:
35879
35880
35881 for b.Controls[0].Op == OpNot {
35882 v_0 := b.Controls[0]
35883 cond := v_0.Args[0]
35884 b.resetWithControl(BlockIf, cond)
35885 b.swapSuccessors()
35886 return true
35887 }
35888
35889
35890
35891 for b.Controls[0].Op == OpConstBool {
35892 v_0 := b.Controls[0]
35893 c := auxIntToBool(v_0.AuxInt)
35894 if !(c) {
35895 break
35896 }
35897 b.Reset(BlockFirst)
35898 return true
35899 }
35900
35901
35902
35903 for b.Controls[0].Op == OpConstBool {
35904 v_0 := b.Controls[0]
35905 c := auxIntToBool(v_0.AuxInt)
35906 if !(!c) {
35907 break
35908 }
35909 b.Reset(BlockFirst)
35910 b.swapSuccessors()
35911 return true
35912 }
35913 }
35914 return false
35915 }
35916
View as plain text