1
2
3 package ssa
4
5 import "math"
6 import "math/bits"
7 import "cmd/internal/obj"
8 import "cmd/compile/internal/types"
9 import "cmd/compile/internal/ir"
10
11 func rewriteValuegeneric(v *Value) bool {
12 switch v.Op {
13 case OpAdd16:
14 return rewriteValuegeneric_OpAdd16(v)
15 case OpAdd32:
16 return rewriteValuegeneric_OpAdd32(v)
17 case OpAdd32F:
18 return rewriteValuegeneric_OpAdd32F(v)
19 case OpAdd64:
20 return rewriteValuegeneric_OpAdd64(v)
21 case OpAdd64F:
22 return rewriteValuegeneric_OpAdd64F(v)
23 case OpAdd64carry:
24 return rewriteValuegeneric_OpAdd64carry(v)
25 case OpAdd8:
26 return rewriteValuegeneric_OpAdd8(v)
27 case OpAddPtr:
28 return rewriteValuegeneric_OpAddPtr(v)
29 case OpAnd16:
30 return rewriteValuegeneric_OpAnd16(v)
31 case OpAnd32:
32 return rewriteValuegeneric_OpAnd32(v)
33 case OpAnd64:
34 return rewriteValuegeneric_OpAnd64(v)
35 case OpAnd8:
36 return rewriteValuegeneric_OpAnd8(v)
37 case OpAndB:
38 return rewriteValuegeneric_OpAndB(v)
39 case OpArraySelect:
40 return rewriteValuegeneric_OpArraySelect(v)
41 case OpBitLen16:
42 return rewriteValuegeneric_OpBitLen16(v)
43 case OpBitLen32:
44 return rewriteValuegeneric_OpBitLen32(v)
45 case OpBitLen64:
46 return rewriteValuegeneric_OpBitLen64(v)
47 case OpBitLen8:
48 return rewriteValuegeneric_OpBitLen8(v)
49 case OpCeil:
50 return rewriteValuegeneric_OpCeil(v)
51 case OpCom16:
52 return rewriteValuegeneric_OpCom16(v)
53 case OpCom32:
54 return rewriteValuegeneric_OpCom32(v)
55 case OpCom64:
56 return rewriteValuegeneric_OpCom64(v)
57 case OpCom8:
58 return rewriteValuegeneric_OpCom8(v)
59 case OpCondSelect:
60 return rewriteValuegeneric_OpCondSelect(v)
61 case OpConstInterface:
62 return rewriteValuegeneric_OpConstInterface(v)
63 case OpConstSlice:
64 return rewriteValuegeneric_OpConstSlice(v)
65 case OpConstString:
66 return rewriteValuegeneric_OpConstString(v)
67 case OpConvert:
68 return rewriteValuegeneric_OpConvert(v)
69 case OpCtz16:
70 return rewriteValuegeneric_OpCtz16(v)
71 case OpCtz32:
72 return rewriteValuegeneric_OpCtz32(v)
73 case OpCtz64:
74 return rewriteValuegeneric_OpCtz64(v)
75 case OpCtz8:
76 return rewriteValuegeneric_OpCtz8(v)
77 case OpCvt32Fto32:
78 return rewriteValuegeneric_OpCvt32Fto32(v)
79 case OpCvt32Fto64:
80 return rewriteValuegeneric_OpCvt32Fto64(v)
81 case OpCvt32Fto64F:
82 return rewriteValuegeneric_OpCvt32Fto64F(v)
83 case OpCvt32to32F:
84 return rewriteValuegeneric_OpCvt32to32F(v)
85 case OpCvt32to64F:
86 return rewriteValuegeneric_OpCvt32to64F(v)
87 case OpCvt64Fto32:
88 return rewriteValuegeneric_OpCvt64Fto32(v)
89 case OpCvt64Fto32F:
90 return rewriteValuegeneric_OpCvt64Fto32F(v)
91 case OpCvt64Fto64:
92 return rewriteValuegeneric_OpCvt64Fto64(v)
93 case OpCvt64to32F:
94 return rewriteValuegeneric_OpCvt64to32F(v)
95 case OpCvt64to64F:
96 return rewriteValuegeneric_OpCvt64to64F(v)
97 case OpCvtBoolToUint8:
98 return rewriteValuegeneric_OpCvtBoolToUint8(v)
99 case OpDiv128u:
100 return rewriteValuegeneric_OpDiv128u(v)
101 case OpDiv16:
102 return rewriteValuegeneric_OpDiv16(v)
103 case OpDiv16u:
104 return rewriteValuegeneric_OpDiv16u(v)
105 case OpDiv32:
106 return rewriteValuegeneric_OpDiv32(v)
107 case OpDiv32F:
108 return rewriteValuegeneric_OpDiv32F(v)
109 case OpDiv32u:
110 return rewriteValuegeneric_OpDiv32u(v)
111 case OpDiv64:
112 return rewriteValuegeneric_OpDiv64(v)
113 case OpDiv64F:
114 return rewriteValuegeneric_OpDiv64F(v)
115 case OpDiv64u:
116 return rewriteValuegeneric_OpDiv64u(v)
117 case OpDiv8:
118 return rewriteValuegeneric_OpDiv8(v)
119 case OpDiv8u:
120 return rewriteValuegeneric_OpDiv8u(v)
121 case OpEq16:
122 return rewriteValuegeneric_OpEq16(v)
123 case OpEq32:
124 return rewriteValuegeneric_OpEq32(v)
125 case OpEq32F:
126 return rewriteValuegeneric_OpEq32F(v)
127 case OpEq64:
128 return rewriteValuegeneric_OpEq64(v)
129 case OpEq64F:
130 return rewriteValuegeneric_OpEq64F(v)
131 case OpEq8:
132 return rewriteValuegeneric_OpEq8(v)
133 case OpEqB:
134 return rewriteValuegeneric_OpEqB(v)
135 case OpEqInter:
136 return rewriteValuegeneric_OpEqInter(v)
137 case OpEqPtr:
138 return rewriteValuegeneric_OpEqPtr(v)
139 case OpEqSlice:
140 return rewriteValuegeneric_OpEqSlice(v)
141 case OpFloor:
142 return rewriteValuegeneric_OpFloor(v)
143 case OpIMake:
144 return rewriteValuegeneric_OpIMake(v)
145 case OpInterLECall:
146 return rewriteValuegeneric_OpInterLECall(v)
147 case OpIsInBounds:
148 return rewriteValuegeneric_OpIsInBounds(v)
149 case OpIsNonNil:
150 return rewriteValuegeneric_OpIsNonNil(v)
151 case OpIsSliceInBounds:
152 return rewriteValuegeneric_OpIsSliceInBounds(v)
153 case OpLeq16:
154 return rewriteValuegeneric_OpLeq16(v)
155 case OpLeq16U:
156 return rewriteValuegeneric_OpLeq16U(v)
157 case OpLeq32:
158 return rewriteValuegeneric_OpLeq32(v)
159 case OpLeq32F:
160 return rewriteValuegeneric_OpLeq32F(v)
161 case OpLeq32U:
162 return rewriteValuegeneric_OpLeq32U(v)
163 case OpLeq64:
164 return rewriteValuegeneric_OpLeq64(v)
165 case OpLeq64F:
166 return rewriteValuegeneric_OpLeq64F(v)
167 case OpLeq64U:
168 return rewriteValuegeneric_OpLeq64U(v)
169 case OpLeq8:
170 return rewriteValuegeneric_OpLeq8(v)
171 case OpLeq8U:
172 return rewriteValuegeneric_OpLeq8U(v)
173 case OpLess16:
174 return rewriteValuegeneric_OpLess16(v)
175 case OpLess16U:
176 return rewriteValuegeneric_OpLess16U(v)
177 case OpLess32:
178 return rewriteValuegeneric_OpLess32(v)
179 case OpLess32F:
180 return rewriteValuegeneric_OpLess32F(v)
181 case OpLess32U:
182 return rewriteValuegeneric_OpLess32U(v)
183 case OpLess64:
184 return rewriteValuegeneric_OpLess64(v)
185 case OpLess64F:
186 return rewriteValuegeneric_OpLess64F(v)
187 case OpLess64U:
188 return rewriteValuegeneric_OpLess64U(v)
189 case OpLess8:
190 return rewriteValuegeneric_OpLess8(v)
191 case OpLess8U:
192 return rewriteValuegeneric_OpLess8U(v)
193 case OpLoad:
194 return rewriteValuegeneric_OpLoad(v)
195 case OpLsh16x16:
196 return rewriteValuegeneric_OpLsh16x16(v)
197 case OpLsh16x32:
198 return rewriteValuegeneric_OpLsh16x32(v)
199 case OpLsh16x64:
200 return rewriteValuegeneric_OpLsh16x64(v)
201 case OpLsh16x8:
202 return rewriteValuegeneric_OpLsh16x8(v)
203 case OpLsh32x16:
204 return rewriteValuegeneric_OpLsh32x16(v)
205 case OpLsh32x32:
206 return rewriteValuegeneric_OpLsh32x32(v)
207 case OpLsh32x64:
208 return rewriteValuegeneric_OpLsh32x64(v)
209 case OpLsh32x8:
210 return rewriteValuegeneric_OpLsh32x8(v)
211 case OpLsh64x16:
212 return rewriteValuegeneric_OpLsh64x16(v)
213 case OpLsh64x32:
214 return rewriteValuegeneric_OpLsh64x32(v)
215 case OpLsh64x64:
216 return rewriteValuegeneric_OpLsh64x64(v)
217 case OpLsh64x8:
218 return rewriteValuegeneric_OpLsh64x8(v)
219 case OpLsh8x16:
220 return rewriteValuegeneric_OpLsh8x16(v)
221 case OpLsh8x32:
222 return rewriteValuegeneric_OpLsh8x32(v)
223 case OpLsh8x64:
224 return rewriteValuegeneric_OpLsh8x64(v)
225 case OpLsh8x8:
226 return rewriteValuegeneric_OpLsh8x8(v)
227 case OpMemEq:
228 return rewriteValuegeneric_OpMemEq(v)
229 case OpMod16:
230 return rewriteValuegeneric_OpMod16(v)
231 case OpMod16u:
232 return rewriteValuegeneric_OpMod16u(v)
233 case OpMod32:
234 return rewriteValuegeneric_OpMod32(v)
235 case OpMod32u:
236 return rewriteValuegeneric_OpMod32u(v)
237 case OpMod64:
238 return rewriteValuegeneric_OpMod64(v)
239 case OpMod64u:
240 return rewriteValuegeneric_OpMod64u(v)
241 case OpMod8:
242 return rewriteValuegeneric_OpMod8(v)
243 case OpMod8u:
244 return rewriteValuegeneric_OpMod8u(v)
245 case OpMove:
246 return rewriteValuegeneric_OpMove(v)
247 case OpMul16:
248 return rewriteValuegeneric_OpMul16(v)
249 case OpMul32:
250 return rewriteValuegeneric_OpMul32(v)
251 case OpMul32F:
252 return rewriteValuegeneric_OpMul32F(v)
253 case OpMul32uhilo:
254 return rewriteValuegeneric_OpMul32uhilo(v)
255 case OpMul32uover:
256 return rewriteValuegeneric_OpMul32uover(v)
257 case OpMul64:
258 return rewriteValuegeneric_OpMul64(v)
259 case OpMul64F:
260 return rewriteValuegeneric_OpMul64F(v)
261 case OpMul64uhilo:
262 return rewriteValuegeneric_OpMul64uhilo(v)
263 case OpMul64uover:
264 return rewriteValuegeneric_OpMul64uover(v)
265 case OpMul8:
266 return rewriteValuegeneric_OpMul8(v)
267 case OpNeg16:
268 return rewriteValuegeneric_OpNeg16(v)
269 case OpNeg32:
270 return rewriteValuegeneric_OpNeg32(v)
271 case OpNeg32F:
272 return rewriteValuegeneric_OpNeg32F(v)
273 case OpNeg64:
274 return rewriteValuegeneric_OpNeg64(v)
275 case OpNeg64F:
276 return rewriteValuegeneric_OpNeg64F(v)
277 case OpNeg8:
278 return rewriteValuegeneric_OpNeg8(v)
279 case OpNeq16:
280 return rewriteValuegeneric_OpNeq16(v)
281 case OpNeq32:
282 return rewriteValuegeneric_OpNeq32(v)
283 case OpNeq32F:
284 return rewriteValuegeneric_OpNeq32F(v)
285 case OpNeq64:
286 return rewriteValuegeneric_OpNeq64(v)
287 case OpNeq64F:
288 return rewriteValuegeneric_OpNeq64F(v)
289 case OpNeq8:
290 return rewriteValuegeneric_OpNeq8(v)
291 case OpNeqB:
292 return rewriteValuegeneric_OpNeqB(v)
293 case OpNeqInter:
294 return rewriteValuegeneric_OpNeqInter(v)
295 case OpNeqPtr:
296 return rewriteValuegeneric_OpNeqPtr(v)
297 case OpNeqSlice:
298 return rewriteValuegeneric_OpNeqSlice(v)
299 case OpNilCheck:
300 return rewriteValuegeneric_OpNilCheck(v)
301 case OpNot:
302 return rewriteValuegeneric_OpNot(v)
303 case OpOffPtr:
304 return rewriteValuegeneric_OpOffPtr(v)
305 case OpOr16:
306 return rewriteValuegeneric_OpOr16(v)
307 case OpOr32:
308 return rewriteValuegeneric_OpOr32(v)
309 case OpOr64:
310 return rewriteValuegeneric_OpOr64(v)
311 case OpOr8:
312 return rewriteValuegeneric_OpOr8(v)
313 case OpOrB:
314 return rewriteValuegeneric_OpOrB(v)
315 case OpPhi:
316 return rewriteValuegeneric_OpPhi(v)
317 case OpPopCount16:
318 return rewriteValuegeneric_OpPopCount16(v)
319 case OpPopCount32:
320 return rewriteValuegeneric_OpPopCount32(v)
321 case OpPopCount64:
322 return rewriteValuegeneric_OpPopCount64(v)
323 case OpPopCount8:
324 return rewriteValuegeneric_OpPopCount8(v)
325 case OpPtrIndex:
326 return rewriteValuegeneric_OpPtrIndex(v)
327 case OpRotateLeft16:
328 return rewriteValuegeneric_OpRotateLeft16(v)
329 case OpRotateLeft32:
330 return rewriteValuegeneric_OpRotateLeft32(v)
331 case OpRotateLeft64:
332 return rewriteValuegeneric_OpRotateLeft64(v)
333 case OpRotateLeft8:
334 return rewriteValuegeneric_OpRotateLeft8(v)
335 case OpRound32F:
336 return rewriteValuegeneric_OpRound32F(v)
337 case OpRound64F:
338 return rewriteValuegeneric_OpRound64F(v)
339 case OpRoundToEven:
340 return rewriteValuegeneric_OpRoundToEven(v)
341 case OpRsh16Ux16:
342 return rewriteValuegeneric_OpRsh16Ux16(v)
343 case OpRsh16Ux32:
344 return rewriteValuegeneric_OpRsh16Ux32(v)
345 case OpRsh16Ux64:
346 return rewriteValuegeneric_OpRsh16Ux64(v)
347 case OpRsh16Ux8:
348 return rewriteValuegeneric_OpRsh16Ux8(v)
349 case OpRsh16x16:
350 return rewriteValuegeneric_OpRsh16x16(v)
351 case OpRsh16x32:
352 return rewriteValuegeneric_OpRsh16x32(v)
353 case OpRsh16x64:
354 return rewriteValuegeneric_OpRsh16x64(v)
355 case OpRsh16x8:
356 return rewriteValuegeneric_OpRsh16x8(v)
357 case OpRsh32Ux16:
358 return rewriteValuegeneric_OpRsh32Ux16(v)
359 case OpRsh32Ux32:
360 return rewriteValuegeneric_OpRsh32Ux32(v)
361 case OpRsh32Ux64:
362 return rewriteValuegeneric_OpRsh32Ux64(v)
363 case OpRsh32Ux8:
364 return rewriteValuegeneric_OpRsh32Ux8(v)
365 case OpRsh32x16:
366 return rewriteValuegeneric_OpRsh32x16(v)
367 case OpRsh32x32:
368 return rewriteValuegeneric_OpRsh32x32(v)
369 case OpRsh32x64:
370 return rewriteValuegeneric_OpRsh32x64(v)
371 case OpRsh32x8:
372 return rewriteValuegeneric_OpRsh32x8(v)
373 case OpRsh64Ux16:
374 return rewriteValuegeneric_OpRsh64Ux16(v)
375 case OpRsh64Ux32:
376 return rewriteValuegeneric_OpRsh64Ux32(v)
377 case OpRsh64Ux64:
378 return rewriteValuegeneric_OpRsh64Ux64(v)
379 case OpRsh64Ux8:
380 return rewriteValuegeneric_OpRsh64Ux8(v)
381 case OpRsh64x16:
382 return rewriteValuegeneric_OpRsh64x16(v)
383 case OpRsh64x32:
384 return rewriteValuegeneric_OpRsh64x32(v)
385 case OpRsh64x64:
386 return rewriteValuegeneric_OpRsh64x64(v)
387 case OpRsh64x8:
388 return rewriteValuegeneric_OpRsh64x8(v)
389 case OpRsh8Ux16:
390 return rewriteValuegeneric_OpRsh8Ux16(v)
391 case OpRsh8Ux32:
392 return rewriteValuegeneric_OpRsh8Ux32(v)
393 case OpRsh8Ux64:
394 return rewriteValuegeneric_OpRsh8Ux64(v)
395 case OpRsh8Ux8:
396 return rewriteValuegeneric_OpRsh8Ux8(v)
397 case OpRsh8x16:
398 return rewriteValuegeneric_OpRsh8x16(v)
399 case OpRsh8x32:
400 return rewriteValuegeneric_OpRsh8x32(v)
401 case OpRsh8x64:
402 return rewriteValuegeneric_OpRsh8x64(v)
403 case OpRsh8x8:
404 return rewriteValuegeneric_OpRsh8x8(v)
405 case OpSelect0:
406 return rewriteValuegeneric_OpSelect0(v)
407 case OpSelect1:
408 return rewriteValuegeneric_OpSelect1(v)
409 case OpSelectN:
410 return rewriteValuegeneric_OpSelectN(v)
411 case OpSignExt16to32:
412 return rewriteValuegeneric_OpSignExt16to32(v)
413 case OpSignExt16to64:
414 return rewriteValuegeneric_OpSignExt16to64(v)
415 case OpSignExt32to64:
416 return rewriteValuegeneric_OpSignExt32to64(v)
417 case OpSignExt8to16:
418 return rewriteValuegeneric_OpSignExt8to16(v)
419 case OpSignExt8to32:
420 return rewriteValuegeneric_OpSignExt8to32(v)
421 case OpSignExt8to64:
422 return rewriteValuegeneric_OpSignExt8to64(v)
423 case OpSliceCap:
424 return rewriteValuegeneric_OpSliceCap(v)
425 case OpSliceLen:
426 return rewriteValuegeneric_OpSliceLen(v)
427 case OpSliceMake:
428 return rewriteValuegeneric_OpSliceMake(v)
429 case OpSlicePtr:
430 return rewriteValuegeneric_OpSlicePtr(v)
431 case OpSlicemask:
432 return rewriteValuegeneric_OpSlicemask(v)
433 case OpSqrt:
434 return rewriteValuegeneric_OpSqrt(v)
435 case OpStaticCall:
436 return rewriteValuegeneric_OpStaticCall(v)
437 case OpStaticLECall:
438 return rewriteValuegeneric_OpStaticLECall(v)
439 case OpStore:
440 return rewriteValuegeneric_OpStore(v)
441 case OpStringLen:
442 return rewriteValuegeneric_OpStringLen(v)
443 case OpStringPtr:
444 return rewriteValuegeneric_OpStringPtr(v)
445 case OpStructSelect:
446 return rewriteValuegeneric_OpStructSelect(v)
447 case OpSub16:
448 return rewriteValuegeneric_OpSub16(v)
449 case OpSub32:
450 return rewriteValuegeneric_OpSub32(v)
451 case OpSub32F:
452 return rewriteValuegeneric_OpSub32F(v)
453 case OpSub64:
454 return rewriteValuegeneric_OpSub64(v)
455 case OpSub64F:
456 return rewriteValuegeneric_OpSub64F(v)
457 case OpSub8:
458 return rewriteValuegeneric_OpSub8(v)
459 case OpTrunc:
460 return rewriteValuegeneric_OpTrunc(v)
461 case OpTrunc16to8:
462 return rewriteValuegeneric_OpTrunc16to8(v)
463 case OpTrunc32to16:
464 return rewriteValuegeneric_OpTrunc32to16(v)
465 case OpTrunc32to8:
466 return rewriteValuegeneric_OpTrunc32to8(v)
467 case OpTrunc64to16:
468 return rewriteValuegeneric_OpTrunc64to16(v)
469 case OpTrunc64to32:
470 return rewriteValuegeneric_OpTrunc64to32(v)
471 case OpTrunc64to8:
472 return rewriteValuegeneric_OpTrunc64to8(v)
473 case OpXor16:
474 return rewriteValuegeneric_OpXor16(v)
475 case OpXor32:
476 return rewriteValuegeneric_OpXor32(v)
477 case OpXor64:
478 return rewriteValuegeneric_OpXor64(v)
479 case OpXor8:
480 return rewriteValuegeneric_OpXor8(v)
481 case OpZero:
482 return rewriteValuegeneric_OpZero(v)
483 case OpZeroExt16to32:
484 return rewriteValuegeneric_OpZeroExt16to32(v)
485 case OpZeroExt16to64:
486 return rewriteValuegeneric_OpZeroExt16to64(v)
487 case OpZeroExt32to64:
488 return rewriteValuegeneric_OpZeroExt32to64(v)
489 case OpZeroExt8to16:
490 return rewriteValuegeneric_OpZeroExt8to16(v)
491 case OpZeroExt8to32:
492 return rewriteValuegeneric_OpZeroExt8to32(v)
493 case OpZeroExt8to64:
494 return rewriteValuegeneric_OpZeroExt8to64(v)
495 }
496 return false
497 }
498 func rewriteValuegeneric_OpAdd16(v *Value) bool {
499 v_1 := v.Args[1]
500 v_0 := v.Args[0]
501 b := v.Block
502 config := b.Func.Config
503
504
505 for {
506 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
507 if v_0.Op != OpConst16 {
508 continue
509 }
510 c := auxIntToInt16(v_0.AuxInt)
511 if v_1.Op != OpConst16 {
512 continue
513 }
514 d := auxIntToInt16(v_1.AuxInt)
515 v.reset(OpConst16)
516 v.AuxInt = int16ToAuxInt(c + d)
517 return true
518 }
519 break
520 }
521
522
523 for {
524 t := v.Type
525 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
526 if v_0.Op != OpMul16 {
527 continue
528 }
529 _ = v_0.Args[1]
530 v_0_0 := v_0.Args[0]
531 v_0_1 := v_0.Args[1]
532 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
533 x := v_0_0
534 y := v_0_1
535 if v_1.Op != OpMul16 {
536 continue
537 }
538 _ = v_1.Args[1]
539 v_1_0 := v_1.Args[0]
540 v_1_1 := v_1.Args[1]
541 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
542 if x != v_1_0 {
543 continue
544 }
545 z := v_1_1
546 v.reset(OpMul16)
547 v0 := b.NewValue0(v.Pos, OpAdd16, t)
548 v0.AddArg2(y, z)
549 v.AddArg2(x, v0)
550 return true
551 }
552 }
553 }
554 break
555 }
556
557
558 for {
559 x := v_0
560 if x != v_1 {
561 break
562 }
563 v.reset(OpLsh16x64)
564 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
565 v0.AuxInt = int64ToAuxInt(1)
566 v.AddArg2(x, v0)
567 return true
568 }
569
570
571 for {
572 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
573 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
574 continue
575 }
576 x := v_1
577 v.copyOf(x)
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 x := v_0
587 if v_1.Op != OpNeg16 {
588 continue
589 }
590 y := v_1.Args[0]
591 v.reset(OpSub16)
592 v.AddArg2(x, y)
593 return true
594 }
595 break
596 }
597
598
599 for {
600 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
601 if v_0.Op != OpCom16 {
602 continue
603 }
604 x := v_0.Args[0]
605 if x != v_1 {
606 continue
607 }
608 v.reset(OpConst16)
609 v.AuxInt = int16ToAuxInt(-1)
610 return true
611 }
612 break
613 }
614
615
616 for {
617 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
618 if v_0.Op != OpSub16 {
619 continue
620 }
621 t := v_0.Args[1]
622 x := v_0.Args[0]
623 if v_1.Op != OpAdd16 {
624 continue
625 }
626 _ = v_1.Args[1]
627 v_1_0 := v_1.Args[0]
628 v_1_1 := v_1.Args[1]
629 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
630 if t != v_1_0 {
631 continue
632 }
633 y := v_1_1
634 v.reset(OpAdd16)
635 v.AddArg2(x, y)
636 return true
637 }
638 }
639 break
640 }
641
642
643 for {
644 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
645 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 1 || v_1.Op != OpCom16 {
646 continue
647 }
648 x := v_1.Args[0]
649 v.reset(OpNeg16)
650 v.AddArg(x)
651 return true
652 }
653 break
654 }
655
656
657 for {
658 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
659 x := v_0
660 if v_1.Op != OpSub16 {
661 continue
662 }
663 _ = v_1.Args[1]
664 y := v_1.Args[0]
665 if x != v_1.Args[1] {
666 continue
667 }
668 v.copyOf(y)
669 return true
670 }
671 break
672 }
673
674
675 for {
676 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
677 x := v_0
678 if v_1.Op != OpAdd16 {
679 continue
680 }
681 _ = v_1.Args[1]
682 v_1_0 := v_1.Args[0]
683 v_1_1 := v_1.Args[1]
684 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
685 y := v_1_0
686 if v_1_1.Op != OpSub16 {
687 continue
688 }
689 _ = v_1_1.Args[1]
690 z := v_1_1.Args[0]
691 if x != v_1_1.Args[1] {
692 continue
693 }
694 v.reset(OpAdd16)
695 v.AddArg2(y, z)
696 return true
697 }
698 }
699 break
700 }
701
702
703
704 for {
705 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
706 if v_0.Op != OpAdd16 {
707 continue
708 }
709 _ = v_0.Args[1]
710 v_0_0 := v_0.Args[0]
711 v_0_1 := v_0.Args[1]
712 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
713 i := v_0_0
714 if i.Op != OpConst16 {
715 continue
716 }
717 t := i.Type
718 z := v_0_1
719 x := v_1
720 if !(z.Op != OpConst16 && x.Op != OpConst16) {
721 continue
722 }
723 v.reset(OpAdd16)
724 v0 := b.NewValue0(v.Pos, OpAdd16, t)
725 v0.AddArg2(z, x)
726 v.AddArg2(i, v0)
727 return true
728 }
729 }
730 break
731 }
732
733
734
735 for {
736 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
737 if v_0.Op != OpSub16 {
738 continue
739 }
740 z := v_0.Args[1]
741 i := v_0.Args[0]
742 if i.Op != OpConst16 {
743 continue
744 }
745 t := i.Type
746 x := v_1
747 if !(z.Op != OpConst16 && x.Op != OpConst16) {
748 continue
749 }
750 v.reset(OpAdd16)
751 v0 := b.NewValue0(v.Pos, OpSub16, t)
752 v0.AddArg2(x, z)
753 v.AddArg2(i, v0)
754 return true
755 }
756 break
757 }
758
759
760 for {
761 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
762 if v_0.Op != OpConst16 {
763 continue
764 }
765 t := v_0.Type
766 c := auxIntToInt16(v_0.AuxInt)
767 if v_1.Op != OpAdd16 {
768 continue
769 }
770 _ = v_1.Args[1]
771 v_1_0 := v_1.Args[0]
772 v_1_1 := v_1.Args[1]
773 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
774 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
775 continue
776 }
777 d := auxIntToInt16(v_1_0.AuxInt)
778 x := v_1_1
779 v.reset(OpAdd16)
780 v0 := b.NewValue0(v.Pos, OpConst16, t)
781 v0.AuxInt = int16ToAuxInt(c + d)
782 v.AddArg2(v0, x)
783 return true
784 }
785 }
786 break
787 }
788
789
790 for {
791 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
792 if v_0.Op != OpConst16 {
793 continue
794 }
795 t := v_0.Type
796 c := auxIntToInt16(v_0.AuxInt)
797 if v_1.Op != OpSub16 {
798 continue
799 }
800 x := v_1.Args[1]
801 v_1_0 := v_1.Args[0]
802 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
803 continue
804 }
805 d := auxIntToInt16(v_1_0.AuxInt)
806 v.reset(OpSub16)
807 v0 := b.NewValue0(v.Pos, OpConst16, t)
808 v0.AuxInt = int16ToAuxInt(c + d)
809 v.AddArg2(v0, x)
810 return true
811 }
812 break
813 }
814
815
816
817 for {
818 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
819 if v_0.Op != OpLsh16x64 {
820 continue
821 }
822 _ = v_0.Args[1]
823 x := v_0.Args[0]
824 z := v_0.Args[1]
825 if z.Op != OpConst64 {
826 continue
827 }
828 c := auxIntToInt64(z.AuxInt)
829 if v_1.Op != OpRsh16Ux64 {
830 continue
831 }
832 _ = v_1.Args[1]
833 if x != v_1.Args[0] {
834 continue
835 }
836 v_1_1 := v_1.Args[1]
837 if v_1_1.Op != OpConst64 {
838 continue
839 }
840 d := auxIntToInt64(v_1_1.AuxInt)
841 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
842 continue
843 }
844 v.reset(OpRotateLeft16)
845 v.AddArg2(x, z)
846 return true
847 }
848 break
849 }
850
851
852
853 for {
854 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
855 left := v_0
856 if left.Op != OpLsh16x64 {
857 continue
858 }
859 y := left.Args[1]
860 x := left.Args[0]
861 right := v_1
862 if right.Op != OpRsh16Ux64 {
863 continue
864 }
865 _ = right.Args[1]
866 if x != right.Args[0] {
867 continue
868 }
869 right_1 := right.Args[1]
870 if right_1.Op != OpSub64 {
871 continue
872 }
873 _ = right_1.Args[1]
874 right_1_0 := right_1.Args[0]
875 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
876 continue
877 }
878 v.reset(OpRotateLeft16)
879 v.AddArg2(x, y)
880 return true
881 }
882 break
883 }
884
885
886
887 for {
888 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
889 left := v_0
890 if left.Op != OpLsh16x32 {
891 continue
892 }
893 y := left.Args[1]
894 x := left.Args[0]
895 right := v_1
896 if right.Op != OpRsh16Ux32 {
897 continue
898 }
899 _ = right.Args[1]
900 if x != right.Args[0] {
901 continue
902 }
903 right_1 := right.Args[1]
904 if right_1.Op != OpSub32 {
905 continue
906 }
907 _ = right_1.Args[1]
908 right_1_0 := right_1.Args[0]
909 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
910 continue
911 }
912 v.reset(OpRotateLeft16)
913 v.AddArg2(x, y)
914 return true
915 }
916 break
917 }
918
919
920
921 for {
922 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
923 left := v_0
924 if left.Op != OpLsh16x16 {
925 continue
926 }
927 y := left.Args[1]
928 x := left.Args[0]
929 right := v_1
930 if right.Op != OpRsh16Ux16 {
931 continue
932 }
933 _ = right.Args[1]
934 if x != right.Args[0] {
935 continue
936 }
937 right_1 := right.Args[1]
938 if right_1.Op != OpSub16 {
939 continue
940 }
941 _ = right_1.Args[1]
942 right_1_0 := right_1.Args[0]
943 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
944 continue
945 }
946 v.reset(OpRotateLeft16)
947 v.AddArg2(x, y)
948 return true
949 }
950 break
951 }
952
953
954
955 for {
956 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
957 left := v_0
958 if left.Op != OpLsh16x8 {
959 continue
960 }
961 y := left.Args[1]
962 x := left.Args[0]
963 right := v_1
964 if right.Op != OpRsh16Ux8 {
965 continue
966 }
967 _ = right.Args[1]
968 if x != right.Args[0] {
969 continue
970 }
971 right_1 := right.Args[1]
972 if right_1.Op != OpSub8 {
973 continue
974 }
975 _ = right_1.Args[1]
976 right_1_0 := right_1.Args[0]
977 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
978 continue
979 }
980 v.reset(OpRotateLeft16)
981 v.AddArg2(x, y)
982 return true
983 }
984 break
985 }
986
987
988
989 for {
990 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
991 right := v_0
992 if right.Op != OpRsh16Ux64 {
993 continue
994 }
995 y := right.Args[1]
996 x := right.Args[0]
997 left := v_1
998 if left.Op != OpLsh16x64 {
999 continue
1000 }
1001 _ = left.Args[1]
1002 if x != left.Args[0] {
1003 continue
1004 }
1005 z := left.Args[1]
1006 if z.Op != OpSub64 {
1007 continue
1008 }
1009 _ = z.Args[1]
1010 z_0 := z.Args[0]
1011 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1012 continue
1013 }
1014 v.reset(OpRotateLeft16)
1015 v.AddArg2(x, z)
1016 return true
1017 }
1018 break
1019 }
1020
1021
1022
1023 for {
1024 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1025 right := v_0
1026 if right.Op != OpRsh16Ux32 {
1027 continue
1028 }
1029 y := right.Args[1]
1030 x := right.Args[0]
1031 left := v_1
1032 if left.Op != OpLsh16x32 {
1033 continue
1034 }
1035 _ = left.Args[1]
1036 if x != left.Args[0] {
1037 continue
1038 }
1039 z := left.Args[1]
1040 if z.Op != OpSub32 {
1041 continue
1042 }
1043 _ = z.Args[1]
1044 z_0 := z.Args[0]
1045 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1046 continue
1047 }
1048 v.reset(OpRotateLeft16)
1049 v.AddArg2(x, z)
1050 return true
1051 }
1052 break
1053 }
1054
1055
1056
1057 for {
1058 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1059 right := v_0
1060 if right.Op != OpRsh16Ux16 {
1061 continue
1062 }
1063 y := right.Args[1]
1064 x := right.Args[0]
1065 left := v_1
1066 if left.Op != OpLsh16x16 {
1067 continue
1068 }
1069 _ = left.Args[1]
1070 if x != left.Args[0] {
1071 continue
1072 }
1073 z := left.Args[1]
1074 if z.Op != OpSub16 {
1075 continue
1076 }
1077 _ = z.Args[1]
1078 z_0 := z.Args[0]
1079 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1080 continue
1081 }
1082 v.reset(OpRotateLeft16)
1083 v.AddArg2(x, z)
1084 return true
1085 }
1086 break
1087 }
1088
1089
1090
1091 for {
1092 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1093 right := v_0
1094 if right.Op != OpRsh16Ux8 {
1095 continue
1096 }
1097 y := right.Args[1]
1098 x := right.Args[0]
1099 left := v_1
1100 if left.Op != OpLsh16x8 {
1101 continue
1102 }
1103 _ = left.Args[1]
1104 if x != left.Args[0] {
1105 continue
1106 }
1107 z := left.Args[1]
1108 if z.Op != OpSub8 {
1109 continue
1110 }
1111 _ = z.Args[1]
1112 z_0 := z.Args[0]
1113 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1114 continue
1115 }
1116 v.reset(OpRotateLeft16)
1117 v.AddArg2(x, z)
1118 return true
1119 }
1120 break
1121 }
1122 return false
1123 }
1124 func rewriteValuegeneric_OpAdd32(v *Value) bool {
1125 v_1 := v.Args[1]
1126 v_0 := v.Args[0]
1127 b := v.Block
1128 config := b.Func.Config
1129
1130
1131 for {
1132 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1133 if v_0.Op != OpConst32 {
1134 continue
1135 }
1136 c := auxIntToInt32(v_0.AuxInt)
1137 if v_1.Op != OpConst32 {
1138 continue
1139 }
1140 d := auxIntToInt32(v_1.AuxInt)
1141 v.reset(OpConst32)
1142 v.AuxInt = int32ToAuxInt(c + d)
1143 return true
1144 }
1145 break
1146 }
1147
1148
1149 for {
1150 t := v.Type
1151 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1152 if v_0.Op != OpMul32 {
1153 continue
1154 }
1155 _ = v_0.Args[1]
1156 v_0_0 := v_0.Args[0]
1157 v_0_1 := v_0.Args[1]
1158 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1159 x := v_0_0
1160 y := v_0_1
1161 if v_1.Op != OpMul32 {
1162 continue
1163 }
1164 _ = v_1.Args[1]
1165 v_1_0 := v_1.Args[0]
1166 v_1_1 := v_1.Args[1]
1167 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
1168 if x != v_1_0 {
1169 continue
1170 }
1171 z := v_1_1
1172 v.reset(OpMul32)
1173 v0 := b.NewValue0(v.Pos, OpAdd32, t)
1174 v0.AddArg2(y, z)
1175 v.AddArg2(x, v0)
1176 return true
1177 }
1178 }
1179 }
1180 break
1181 }
1182
1183
1184 for {
1185 x := v_0
1186 if x != v_1 {
1187 break
1188 }
1189 v.reset(OpLsh32x64)
1190 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
1191 v0.AuxInt = int64ToAuxInt(1)
1192 v.AddArg2(x, v0)
1193 return true
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 != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
1200 continue
1201 }
1202 x := v_1
1203 v.copyOf(x)
1204 return true
1205 }
1206 break
1207 }
1208
1209
1210 for {
1211 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1212 x := v_0
1213 if v_1.Op != OpNeg32 {
1214 continue
1215 }
1216 y := v_1.Args[0]
1217 v.reset(OpSub32)
1218 v.AddArg2(x, y)
1219 return true
1220 }
1221 break
1222 }
1223
1224
1225 for {
1226 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1227 if v_0.Op != OpCom32 {
1228 continue
1229 }
1230 x := v_0.Args[0]
1231 if x != v_1 {
1232 continue
1233 }
1234 v.reset(OpConst32)
1235 v.AuxInt = int32ToAuxInt(-1)
1236 return true
1237 }
1238 break
1239 }
1240
1241
1242 for {
1243 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1244 if v_0.Op != OpSub32 {
1245 continue
1246 }
1247 t := v_0.Args[1]
1248 x := v_0.Args[0]
1249 if v_1.Op != OpAdd32 {
1250 continue
1251 }
1252 _ = v_1.Args[1]
1253 v_1_0 := v_1.Args[0]
1254 v_1_1 := v_1.Args[1]
1255 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1256 if t != v_1_0 {
1257 continue
1258 }
1259 y := v_1_1
1260 v.reset(OpAdd32)
1261 v.AddArg2(x, y)
1262 return true
1263 }
1264 }
1265 break
1266 }
1267
1268
1269 for {
1270 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1271 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 || v_1.Op != OpCom32 {
1272 continue
1273 }
1274 x := v_1.Args[0]
1275 v.reset(OpNeg32)
1276 v.AddArg(x)
1277 return true
1278 }
1279 break
1280 }
1281
1282
1283 for {
1284 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1285 x := v_0
1286 if v_1.Op != OpSub32 {
1287 continue
1288 }
1289 _ = v_1.Args[1]
1290 y := v_1.Args[0]
1291 if x != v_1.Args[1] {
1292 continue
1293 }
1294 v.copyOf(y)
1295 return true
1296 }
1297 break
1298 }
1299
1300
1301 for {
1302 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1303 x := v_0
1304 if v_1.Op != OpAdd32 {
1305 continue
1306 }
1307 _ = v_1.Args[1]
1308 v_1_0 := v_1.Args[0]
1309 v_1_1 := v_1.Args[1]
1310 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1311 y := v_1_0
1312 if v_1_1.Op != OpSub32 {
1313 continue
1314 }
1315 _ = v_1_1.Args[1]
1316 z := v_1_1.Args[0]
1317 if x != v_1_1.Args[1] {
1318 continue
1319 }
1320 v.reset(OpAdd32)
1321 v.AddArg2(y, z)
1322 return true
1323 }
1324 }
1325 break
1326 }
1327
1328
1329
1330 for {
1331 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1332 if v_0.Op != OpAdd32 {
1333 continue
1334 }
1335 _ = v_0.Args[1]
1336 v_0_0 := v_0.Args[0]
1337 v_0_1 := v_0.Args[1]
1338 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1339 i := v_0_0
1340 if i.Op != OpConst32 {
1341 continue
1342 }
1343 t := i.Type
1344 z := v_0_1
1345 x := v_1
1346 if !(z.Op != OpConst32 && x.Op != OpConst32) {
1347 continue
1348 }
1349 v.reset(OpAdd32)
1350 v0 := b.NewValue0(v.Pos, OpAdd32, t)
1351 v0.AddArg2(z, x)
1352 v.AddArg2(i, v0)
1353 return true
1354 }
1355 }
1356 break
1357 }
1358
1359
1360
1361 for {
1362 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1363 if v_0.Op != OpSub32 {
1364 continue
1365 }
1366 z := v_0.Args[1]
1367 i := v_0.Args[0]
1368 if i.Op != OpConst32 {
1369 continue
1370 }
1371 t := i.Type
1372 x := v_1
1373 if !(z.Op != OpConst32 && x.Op != OpConst32) {
1374 continue
1375 }
1376 v.reset(OpAdd32)
1377 v0 := b.NewValue0(v.Pos, OpSub32, t)
1378 v0.AddArg2(x, z)
1379 v.AddArg2(i, v0)
1380 return true
1381 }
1382 break
1383 }
1384
1385
1386 for {
1387 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1388 if v_0.Op != OpConst32 {
1389 continue
1390 }
1391 t := v_0.Type
1392 c := auxIntToInt32(v_0.AuxInt)
1393 if v_1.Op != OpAdd32 {
1394 continue
1395 }
1396 _ = v_1.Args[1]
1397 v_1_0 := v_1.Args[0]
1398 v_1_1 := v_1.Args[1]
1399 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1400 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
1401 continue
1402 }
1403 d := auxIntToInt32(v_1_0.AuxInt)
1404 x := v_1_1
1405 v.reset(OpAdd32)
1406 v0 := b.NewValue0(v.Pos, OpConst32, t)
1407 v0.AuxInt = int32ToAuxInt(c + d)
1408 v.AddArg2(v0, x)
1409 return true
1410 }
1411 }
1412 break
1413 }
1414
1415
1416 for {
1417 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1418 if v_0.Op != OpConst32 {
1419 continue
1420 }
1421 t := v_0.Type
1422 c := auxIntToInt32(v_0.AuxInt)
1423 if v_1.Op != OpSub32 {
1424 continue
1425 }
1426 x := v_1.Args[1]
1427 v_1_0 := v_1.Args[0]
1428 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
1429 continue
1430 }
1431 d := auxIntToInt32(v_1_0.AuxInt)
1432 v.reset(OpSub32)
1433 v0 := b.NewValue0(v.Pos, OpConst32, t)
1434 v0.AuxInt = int32ToAuxInt(c + d)
1435 v.AddArg2(v0, x)
1436 return true
1437 }
1438 break
1439 }
1440
1441
1442
1443 for {
1444 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1445 if v_0.Op != OpLsh32x64 {
1446 continue
1447 }
1448 _ = v_0.Args[1]
1449 x := v_0.Args[0]
1450 z := v_0.Args[1]
1451 if z.Op != OpConst64 {
1452 continue
1453 }
1454 c := auxIntToInt64(z.AuxInt)
1455 if v_1.Op != OpRsh32Ux64 {
1456 continue
1457 }
1458 _ = v_1.Args[1]
1459 if x != v_1.Args[0] {
1460 continue
1461 }
1462 v_1_1 := v_1.Args[1]
1463 if v_1_1.Op != OpConst64 {
1464 continue
1465 }
1466 d := auxIntToInt64(v_1_1.AuxInt)
1467 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
1468 continue
1469 }
1470 v.reset(OpRotateLeft32)
1471 v.AddArg2(x, z)
1472 return true
1473 }
1474 break
1475 }
1476
1477
1478
1479 for {
1480 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1481 left := v_0
1482 if left.Op != OpLsh32x64 {
1483 continue
1484 }
1485 y := left.Args[1]
1486 x := left.Args[0]
1487 right := v_1
1488 if right.Op != OpRsh32Ux64 {
1489 continue
1490 }
1491 _ = right.Args[1]
1492 if x != right.Args[0] {
1493 continue
1494 }
1495 right_1 := right.Args[1]
1496 if right_1.Op != OpSub64 {
1497 continue
1498 }
1499 _ = right_1.Args[1]
1500 right_1_0 := right_1.Args[0]
1501 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1502 continue
1503 }
1504 v.reset(OpRotateLeft32)
1505 v.AddArg2(x, y)
1506 return true
1507 }
1508 break
1509 }
1510
1511
1512
1513 for {
1514 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1515 left := v_0
1516 if left.Op != OpLsh32x32 {
1517 continue
1518 }
1519 y := left.Args[1]
1520 x := left.Args[0]
1521 right := v_1
1522 if right.Op != OpRsh32Ux32 {
1523 continue
1524 }
1525 _ = right.Args[1]
1526 if x != right.Args[0] {
1527 continue
1528 }
1529 right_1 := right.Args[1]
1530 if right_1.Op != OpSub32 {
1531 continue
1532 }
1533 _ = right_1.Args[1]
1534 right_1_0 := right_1.Args[0]
1535 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1536 continue
1537 }
1538 v.reset(OpRotateLeft32)
1539 v.AddArg2(x, y)
1540 return true
1541 }
1542 break
1543 }
1544
1545
1546
1547 for {
1548 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1549 left := v_0
1550 if left.Op != OpLsh32x16 {
1551 continue
1552 }
1553 y := left.Args[1]
1554 x := left.Args[0]
1555 right := v_1
1556 if right.Op != OpRsh32Ux16 {
1557 continue
1558 }
1559 _ = right.Args[1]
1560 if x != right.Args[0] {
1561 continue
1562 }
1563 right_1 := right.Args[1]
1564 if right_1.Op != OpSub16 {
1565 continue
1566 }
1567 _ = right_1.Args[1]
1568 right_1_0 := right_1.Args[0]
1569 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1570 continue
1571 }
1572 v.reset(OpRotateLeft32)
1573 v.AddArg2(x, y)
1574 return true
1575 }
1576 break
1577 }
1578
1579
1580
1581 for {
1582 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1583 left := v_0
1584 if left.Op != OpLsh32x8 {
1585 continue
1586 }
1587 y := left.Args[1]
1588 x := left.Args[0]
1589 right := v_1
1590 if right.Op != OpRsh32Ux8 {
1591 continue
1592 }
1593 _ = right.Args[1]
1594 if x != right.Args[0] {
1595 continue
1596 }
1597 right_1 := right.Args[1]
1598 if right_1.Op != OpSub8 {
1599 continue
1600 }
1601 _ = right_1.Args[1]
1602 right_1_0 := right_1.Args[0]
1603 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1604 continue
1605 }
1606 v.reset(OpRotateLeft32)
1607 v.AddArg2(x, y)
1608 return true
1609 }
1610 break
1611 }
1612
1613
1614
1615 for {
1616 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1617 right := v_0
1618 if right.Op != OpRsh32Ux64 {
1619 continue
1620 }
1621 y := right.Args[1]
1622 x := right.Args[0]
1623 left := v_1
1624 if left.Op != OpLsh32x64 {
1625 continue
1626 }
1627 _ = left.Args[1]
1628 if x != left.Args[0] {
1629 continue
1630 }
1631 z := left.Args[1]
1632 if z.Op != OpSub64 {
1633 continue
1634 }
1635 _ = z.Args[1]
1636 z_0 := z.Args[0]
1637 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1638 continue
1639 }
1640 v.reset(OpRotateLeft32)
1641 v.AddArg2(x, z)
1642 return true
1643 }
1644 break
1645 }
1646
1647
1648
1649 for {
1650 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1651 right := v_0
1652 if right.Op != OpRsh32Ux32 {
1653 continue
1654 }
1655 y := right.Args[1]
1656 x := right.Args[0]
1657 left := v_1
1658 if left.Op != OpLsh32x32 {
1659 continue
1660 }
1661 _ = left.Args[1]
1662 if x != left.Args[0] {
1663 continue
1664 }
1665 z := left.Args[1]
1666 if z.Op != OpSub32 {
1667 continue
1668 }
1669 _ = z.Args[1]
1670 z_0 := z.Args[0]
1671 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1672 continue
1673 }
1674 v.reset(OpRotateLeft32)
1675 v.AddArg2(x, z)
1676 return true
1677 }
1678 break
1679 }
1680
1681
1682
1683 for {
1684 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1685 right := v_0
1686 if right.Op != OpRsh32Ux16 {
1687 continue
1688 }
1689 y := right.Args[1]
1690 x := right.Args[0]
1691 left := v_1
1692 if left.Op != OpLsh32x16 {
1693 continue
1694 }
1695 _ = left.Args[1]
1696 if x != left.Args[0] {
1697 continue
1698 }
1699 z := left.Args[1]
1700 if z.Op != OpSub16 {
1701 continue
1702 }
1703 _ = z.Args[1]
1704 z_0 := z.Args[0]
1705 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1706 continue
1707 }
1708 v.reset(OpRotateLeft32)
1709 v.AddArg2(x, z)
1710 return true
1711 }
1712 break
1713 }
1714
1715
1716
1717 for {
1718 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1719 right := v_0
1720 if right.Op != OpRsh32Ux8 {
1721 continue
1722 }
1723 y := right.Args[1]
1724 x := right.Args[0]
1725 left := v_1
1726 if left.Op != OpLsh32x8 {
1727 continue
1728 }
1729 _ = left.Args[1]
1730 if x != left.Args[0] {
1731 continue
1732 }
1733 z := left.Args[1]
1734 if z.Op != OpSub8 {
1735 continue
1736 }
1737 _ = z.Args[1]
1738 z_0 := z.Args[0]
1739 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1740 continue
1741 }
1742 v.reset(OpRotateLeft32)
1743 v.AddArg2(x, z)
1744 return true
1745 }
1746 break
1747 }
1748 return false
1749 }
1750 func rewriteValuegeneric_OpAdd32F(v *Value) bool {
1751 v_1 := v.Args[1]
1752 v_0 := v.Args[0]
1753
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 != OpConst32F {
1759 continue
1760 }
1761 c := auxIntToFloat32(v_0.AuxInt)
1762 if v_1.Op != OpConst32F {
1763 continue
1764 }
1765 d := auxIntToFloat32(v_1.AuxInt)
1766 if !(c+d == c+d) {
1767 continue
1768 }
1769 v.reset(OpConst32F)
1770 v.AuxInt = float32ToAuxInt(c + d)
1771 return true
1772 }
1773 break
1774 }
1775 return false
1776 }
1777 func rewriteValuegeneric_OpAdd64(v *Value) bool {
1778 v_1 := v.Args[1]
1779 v_0 := v.Args[0]
1780 b := v.Block
1781 config := b.Func.Config
1782
1783
1784 for {
1785 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1786 if v_0.Op != OpConst64 {
1787 continue
1788 }
1789 c := auxIntToInt64(v_0.AuxInt)
1790 if v_1.Op != OpConst64 {
1791 continue
1792 }
1793 d := auxIntToInt64(v_1.AuxInt)
1794 v.reset(OpConst64)
1795 v.AuxInt = int64ToAuxInt(c + d)
1796 return true
1797 }
1798 break
1799 }
1800
1801
1802 for {
1803 t := v.Type
1804 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1805 if v_0.Op != OpMul64 {
1806 continue
1807 }
1808 _ = v_0.Args[1]
1809 v_0_0 := v_0.Args[0]
1810 v_0_1 := v_0.Args[1]
1811 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1812 x := v_0_0
1813 y := v_0_1
1814 if v_1.Op != OpMul64 {
1815 continue
1816 }
1817 _ = v_1.Args[1]
1818 v_1_0 := v_1.Args[0]
1819 v_1_1 := v_1.Args[1]
1820 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
1821 if x != v_1_0 {
1822 continue
1823 }
1824 z := v_1_1
1825 v.reset(OpMul64)
1826 v0 := b.NewValue0(v.Pos, OpAdd64, t)
1827 v0.AddArg2(y, z)
1828 v.AddArg2(x, v0)
1829 return true
1830 }
1831 }
1832 }
1833 break
1834 }
1835
1836
1837 for {
1838 x := v_0
1839 if x != v_1 {
1840 break
1841 }
1842 v.reset(OpLsh64x64)
1843 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
1844 v0.AuxInt = int64ToAuxInt(1)
1845 v.AddArg2(x, v0)
1846 return true
1847 }
1848
1849
1850 for {
1851 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1852 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
1853 continue
1854 }
1855 x := v_1
1856 v.copyOf(x)
1857 return true
1858 }
1859 break
1860 }
1861
1862
1863 for {
1864 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1865 x := v_0
1866 if v_1.Op != OpNeg64 {
1867 continue
1868 }
1869 y := v_1.Args[0]
1870 v.reset(OpSub64)
1871 v.AddArg2(x, y)
1872 return true
1873 }
1874 break
1875 }
1876
1877
1878 for {
1879 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1880 if v_0.Op != OpCom64 {
1881 continue
1882 }
1883 x := v_0.Args[0]
1884 if x != v_1 {
1885 continue
1886 }
1887 v.reset(OpConst64)
1888 v.AuxInt = int64ToAuxInt(-1)
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 if v_0.Op != OpSub64 {
1898 continue
1899 }
1900 t := v_0.Args[1]
1901 x := v_0.Args[0]
1902 if v_1.Op != OpAdd64 {
1903 continue
1904 }
1905 _ = v_1.Args[1]
1906 v_1_0 := v_1.Args[0]
1907 v_1_1 := v_1.Args[1]
1908 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1909 if t != v_1_0 {
1910 continue
1911 }
1912 y := v_1_1
1913 v.reset(OpAdd64)
1914 v.AddArg2(x, y)
1915 return true
1916 }
1917 }
1918 break
1919 }
1920
1921
1922 for {
1923 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1924 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 || v_1.Op != OpCom64 {
1925 continue
1926 }
1927 x := v_1.Args[0]
1928 v.reset(OpNeg64)
1929 v.AddArg(x)
1930 return true
1931 }
1932 break
1933 }
1934
1935
1936 for {
1937 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1938 x := v_0
1939 if v_1.Op != OpSub64 {
1940 continue
1941 }
1942 _ = v_1.Args[1]
1943 y := v_1.Args[0]
1944 if x != v_1.Args[1] {
1945 continue
1946 }
1947 v.copyOf(y)
1948 return true
1949 }
1950 break
1951 }
1952
1953
1954 for {
1955 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1956 x := v_0
1957 if v_1.Op != OpAdd64 {
1958 continue
1959 }
1960 _ = v_1.Args[1]
1961 v_1_0 := v_1.Args[0]
1962 v_1_1 := v_1.Args[1]
1963 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1964 y := v_1_0
1965 if v_1_1.Op != OpSub64 {
1966 continue
1967 }
1968 _ = v_1_1.Args[1]
1969 z := v_1_1.Args[0]
1970 if x != v_1_1.Args[1] {
1971 continue
1972 }
1973 v.reset(OpAdd64)
1974 v.AddArg2(y, z)
1975 return true
1976 }
1977 }
1978 break
1979 }
1980
1981
1982
1983 for {
1984 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1985 if v_0.Op != OpAdd64 {
1986 continue
1987 }
1988 _ = v_0.Args[1]
1989 v_0_0 := v_0.Args[0]
1990 v_0_1 := v_0.Args[1]
1991 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1992 i := v_0_0
1993 if i.Op != OpConst64 {
1994 continue
1995 }
1996 t := i.Type
1997 z := v_0_1
1998 x := v_1
1999 if !(z.Op != OpConst64 && x.Op != OpConst64) {
2000 continue
2001 }
2002 v.reset(OpAdd64)
2003 v0 := b.NewValue0(v.Pos, OpAdd64, t)
2004 v0.AddArg2(z, x)
2005 v.AddArg2(i, v0)
2006 return true
2007 }
2008 }
2009 break
2010 }
2011
2012
2013
2014 for {
2015 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2016 if v_0.Op != OpSub64 {
2017 continue
2018 }
2019 z := v_0.Args[1]
2020 i := v_0.Args[0]
2021 if i.Op != OpConst64 {
2022 continue
2023 }
2024 t := i.Type
2025 x := v_1
2026 if !(z.Op != OpConst64 && x.Op != OpConst64) {
2027 continue
2028 }
2029 v.reset(OpAdd64)
2030 v0 := b.NewValue0(v.Pos, OpSub64, t)
2031 v0.AddArg2(x, z)
2032 v.AddArg2(i, v0)
2033 return true
2034 }
2035 break
2036 }
2037
2038
2039 for {
2040 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2041 if v_0.Op != OpConst64 {
2042 continue
2043 }
2044 t := v_0.Type
2045 c := auxIntToInt64(v_0.AuxInt)
2046 if v_1.Op != OpAdd64 {
2047 continue
2048 }
2049 _ = v_1.Args[1]
2050 v_1_0 := v_1.Args[0]
2051 v_1_1 := v_1.Args[1]
2052 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2053 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
2054 continue
2055 }
2056 d := auxIntToInt64(v_1_0.AuxInt)
2057 x := v_1_1
2058 v.reset(OpAdd64)
2059 v0 := b.NewValue0(v.Pos, OpConst64, t)
2060 v0.AuxInt = int64ToAuxInt(c + d)
2061 v.AddArg2(v0, x)
2062 return true
2063 }
2064 }
2065 break
2066 }
2067
2068
2069 for {
2070 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2071 if v_0.Op != OpConst64 {
2072 continue
2073 }
2074 t := v_0.Type
2075 c := auxIntToInt64(v_0.AuxInt)
2076 if v_1.Op != OpSub64 {
2077 continue
2078 }
2079 x := v_1.Args[1]
2080 v_1_0 := v_1.Args[0]
2081 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
2082 continue
2083 }
2084 d := auxIntToInt64(v_1_0.AuxInt)
2085 v.reset(OpSub64)
2086 v0 := b.NewValue0(v.Pos, OpConst64, t)
2087 v0.AuxInt = int64ToAuxInt(c + d)
2088 v.AddArg2(v0, x)
2089 return true
2090 }
2091 break
2092 }
2093
2094
2095
2096 for {
2097 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2098 if v_0.Op != OpLsh64x64 {
2099 continue
2100 }
2101 _ = v_0.Args[1]
2102 x := v_0.Args[0]
2103 z := v_0.Args[1]
2104 if z.Op != OpConst64 {
2105 continue
2106 }
2107 c := auxIntToInt64(z.AuxInt)
2108 if v_1.Op != OpRsh64Ux64 {
2109 continue
2110 }
2111 _ = v_1.Args[1]
2112 if x != v_1.Args[0] {
2113 continue
2114 }
2115 v_1_1 := v_1.Args[1]
2116 if v_1_1.Op != OpConst64 {
2117 continue
2118 }
2119 d := auxIntToInt64(v_1_1.AuxInt)
2120 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
2121 continue
2122 }
2123 v.reset(OpRotateLeft64)
2124 v.AddArg2(x, z)
2125 return true
2126 }
2127 break
2128 }
2129
2130
2131
2132 for {
2133 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2134 left := v_0
2135 if left.Op != OpLsh64x64 {
2136 continue
2137 }
2138 y := left.Args[1]
2139 x := left.Args[0]
2140 right := v_1
2141 if right.Op != OpRsh64Ux64 {
2142 continue
2143 }
2144 _ = right.Args[1]
2145 if x != right.Args[0] {
2146 continue
2147 }
2148 right_1 := right.Args[1]
2149 if right_1.Op != OpSub64 {
2150 continue
2151 }
2152 _ = right_1.Args[1]
2153 right_1_0 := right_1.Args[0]
2154 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2155 continue
2156 }
2157 v.reset(OpRotateLeft64)
2158 v.AddArg2(x, y)
2159 return true
2160 }
2161 break
2162 }
2163
2164
2165
2166 for {
2167 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2168 left := v_0
2169 if left.Op != OpLsh64x32 {
2170 continue
2171 }
2172 y := left.Args[1]
2173 x := left.Args[0]
2174 right := v_1
2175 if right.Op != OpRsh64Ux32 {
2176 continue
2177 }
2178 _ = right.Args[1]
2179 if x != right.Args[0] {
2180 continue
2181 }
2182 right_1 := right.Args[1]
2183 if right_1.Op != OpSub32 {
2184 continue
2185 }
2186 _ = right_1.Args[1]
2187 right_1_0 := right_1.Args[0]
2188 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2189 continue
2190 }
2191 v.reset(OpRotateLeft64)
2192 v.AddArg2(x, y)
2193 return true
2194 }
2195 break
2196 }
2197
2198
2199
2200 for {
2201 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2202 left := v_0
2203 if left.Op != OpLsh64x16 {
2204 continue
2205 }
2206 y := left.Args[1]
2207 x := left.Args[0]
2208 right := v_1
2209 if right.Op != OpRsh64Ux16 {
2210 continue
2211 }
2212 _ = right.Args[1]
2213 if x != right.Args[0] {
2214 continue
2215 }
2216 right_1 := right.Args[1]
2217 if right_1.Op != OpSub16 {
2218 continue
2219 }
2220 _ = right_1.Args[1]
2221 right_1_0 := right_1.Args[0]
2222 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2223 continue
2224 }
2225 v.reset(OpRotateLeft64)
2226 v.AddArg2(x, y)
2227 return true
2228 }
2229 break
2230 }
2231
2232
2233
2234 for {
2235 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2236 left := v_0
2237 if left.Op != OpLsh64x8 {
2238 continue
2239 }
2240 y := left.Args[1]
2241 x := left.Args[0]
2242 right := v_1
2243 if right.Op != OpRsh64Ux8 {
2244 continue
2245 }
2246 _ = right.Args[1]
2247 if x != right.Args[0] {
2248 continue
2249 }
2250 right_1 := right.Args[1]
2251 if right_1.Op != OpSub8 {
2252 continue
2253 }
2254 _ = right_1.Args[1]
2255 right_1_0 := right_1.Args[0]
2256 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2257 continue
2258 }
2259 v.reset(OpRotateLeft64)
2260 v.AddArg2(x, y)
2261 return true
2262 }
2263 break
2264 }
2265
2266
2267
2268 for {
2269 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2270 right := v_0
2271 if right.Op != OpRsh64Ux64 {
2272 continue
2273 }
2274 y := right.Args[1]
2275 x := right.Args[0]
2276 left := v_1
2277 if left.Op != OpLsh64x64 {
2278 continue
2279 }
2280 _ = left.Args[1]
2281 if x != left.Args[0] {
2282 continue
2283 }
2284 z := left.Args[1]
2285 if z.Op != OpSub64 {
2286 continue
2287 }
2288 _ = z.Args[1]
2289 z_0 := z.Args[0]
2290 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2291 continue
2292 }
2293 v.reset(OpRotateLeft64)
2294 v.AddArg2(x, z)
2295 return true
2296 }
2297 break
2298 }
2299
2300
2301
2302 for {
2303 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2304 right := v_0
2305 if right.Op != OpRsh64Ux32 {
2306 continue
2307 }
2308 y := right.Args[1]
2309 x := right.Args[0]
2310 left := v_1
2311 if left.Op != OpLsh64x32 {
2312 continue
2313 }
2314 _ = left.Args[1]
2315 if x != left.Args[0] {
2316 continue
2317 }
2318 z := left.Args[1]
2319 if z.Op != OpSub32 {
2320 continue
2321 }
2322 _ = z.Args[1]
2323 z_0 := z.Args[0]
2324 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2325 continue
2326 }
2327 v.reset(OpRotateLeft64)
2328 v.AddArg2(x, z)
2329 return true
2330 }
2331 break
2332 }
2333
2334
2335
2336 for {
2337 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2338 right := v_0
2339 if right.Op != OpRsh64Ux16 {
2340 continue
2341 }
2342 y := right.Args[1]
2343 x := right.Args[0]
2344 left := v_1
2345 if left.Op != OpLsh64x16 {
2346 continue
2347 }
2348 _ = left.Args[1]
2349 if x != left.Args[0] {
2350 continue
2351 }
2352 z := left.Args[1]
2353 if z.Op != OpSub16 {
2354 continue
2355 }
2356 _ = z.Args[1]
2357 z_0 := z.Args[0]
2358 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2359 continue
2360 }
2361 v.reset(OpRotateLeft64)
2362 v.AddArg2(x, z)
2363 return true
2364 }
2365 break
2366 }
2367
2368
2369
2370 for {
2371 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2372 right := v_0
2373 if right.Op != OpRsh64Ux8 {
2374 continue
2375 }
2376 y := right.Args[1]
2377 x := right.Args[0]
2378 left := v_1
2379 if left.Op != OpLsh64x8 {
2380 continue
2381 }
2382 _ = left.Args[1]
2383 if x != left.Args[0] {
2384 continue
2385 }
2386 z := left.Args[1]
2387 if z.Op != OpSub8 {
2388 continue
2389 }
2390 _ = z.Args[1]
2391 z_0 := z.Args[0]
2392 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2393 continue
2394 }
2395 v.reset(OpRotateLeft64)
2396 v.AddArg2(x, z)
2397 return true
2398 }
2399 break
2400 }
2401 return false
2402 }
2403 func rewriteValuegeneric_OpAdd64F(v *Value) bool {
2404 v_1 := v.Args[1]
2405 v_0 := v.Args[0]
2406
2407
2408
2409 for {
2410 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2411 if v_0.Op != OpConst64F {
2412 continue
2413 }
2414 c := auxIntToFloat64(v_0.AuxInt)
2415 if v_1.Op != OpConst64F {
2416 continue
2417 }
2418 d := auxIntToFloat64(v_1.AuxInt)
2419 if !(c+d == c+d) {
2420 continue
2421 }
2422 v.reset(OpConst64F)
2423 v.AuxInt = float64ToAuxInt(c + d)
2424 return true
2425 }
2426 break
2427 }
2428 return false
2429 }
2430 func rewriteValuegeneric_OpAdd64carry(v *Value) bool {
2431 v_2 := v.Args[2]
2432 v_1 := v.Args[1]
2433 v_0 := v.Args[0]
2434 b := v.Block
2435
2436
2437
2438 for {
2439 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2440 if v_0.Op != OpConst64 {
2441 continue
2442 }
2443 t := v_0.Type
2444 x := auxIntToInt64(v_0.AuxInt)
2445 if v_1.Op != OpConst64 {
2446 continue
2447 }
2448 y := auxIntToInt64(v_1.AuxInt)
2449 if v_2.Op != OpConst64 {
2450 continue
2451 }
2452 c := auxIntToInt64(v_2.AuxInt)
2453 if !(c >= 0 && c <= 1) {
2454 continue
2455 }
2456 v.reset(OpMakeTuple)
2457 v0 := b.NewValue0(v.Pos, OpConst64, t)
2458 v0.AuxInt = int64ToAuxInt(bitsAdd64(x, y, c).sum)
2459 v1 := b.NewValue0(v.Pos, OpConst64, t)
2460 v1.AuxInt = int64ToAuxInt(bitsAdd64(x, y, c).carry)
2461 v.AddArg2(v0, v1)
2462 return true
2463 }
2464 break
2465 }
2466 return false
2467 }
2468 func rewriteValuegeneric_OpAdd8(v *Value) bool {
2469 v_1 := v.Args[1]
2470 v_0 := v.Args[0]
2471 b := v.Block
2472 config := b.Func.Config
2473
2474
2475 for {
2476 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2477 if v_0.Op != OpConst8 {
2478 continue
2479 }
2480 c := auxIntToInt8(v_0.AuxInt)
2481 if v_1.Op != OpConst8 {
2482 continue
2483 }
2484 d := auxIntToInt8(v_1.AuxInt)
2485 v.reset(OpConst8)
2486 v.AuxInt = int8ToAuxInt(c + d)
2487 return true
2488 }
2489 break
2490 }
2491
2492
2493 for {
2494 t := v.Type
2495 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2496 if v_0.Op != OpMul8 {
2497 continue
2498 }
2499 _ = v_0.Args[1]
2500 v_0_0 := v_0.Args[0]
2501 v_0_1 := v_0.Args[1]
2502 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
2503 x := v_0_0
2504 y := v_0_1
2505 if v_1.Op != OpMul8 {
2506 continue
2507 }
2508 _ = v_1.Args[1]
2509 v_1_0 := v_1.Args[0]
2510 v_1_1 := v_1.Args[1]
2511 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
2512 if x != v_1_0 {
2513 continue
2514 }
2515 z := v_1_1
2516 v.reset(OpMul8)
2517 v0 := b.NewValue0(v.Pos, OpAdd8, t)
2518 v0.AddArg2(y, z)
2519 v.AddArg2(x, v0)
2520 return true
2521 }
2522 }
2523 }
2524 break
2525 }
2526
2527
2528 for {
2529 x := v_0
2530 if x != v_1 {
2531 break
2532 }
2533 v.reset(OpLsh8x64)
2534 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
2535 v0.AuxInt = int64ToAuxInt(1)
2536 v.AddArg2(x, v0)
2537 return true
2538 }
2539
2540
2541 for {
2542 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2543 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
2544 continue
2545 }
2546 x := v_1
2547 v.copyOf(x)
2548 return true
2549 }
2550 break
2551 }
2552
2553
2554 for {
2555 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2556 x := v_0
2557 if v_1.Op != OpNeg8 {
2558 continue
2559 }
2560 y := v_1.Args[0]
2561 v.reset(OpSub8)
2562 v.AddArg2(x, y)
2563 return true
2564 }
2565 break
2566 }
2567
2568
2569 for {
2570 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2571 if v_0.Op != OpCom8 {
2572 continue
2573 }
2574 x := v_0.Args[0]
2575 if x != v_1 {
2576 continue
2577 }
2578 v.reset(OpConst8)
2579 v.AuxInt = int8ToAuxInt(-1)
2580 return true
2581 }
2582 break
2583 }
2584
2585
2586 for {
2587 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2588 if v_0.Op != OpSub8 {
2589 continue
2590 }
2591 t := v_0.Args[1]
2592 x := v_0.Args[0]
2593 if v_1.Op != OpAdd8 {
2594 continue
2595 }
2596 _ = v_1.Args[1]
2597 v_1_0 := v_1.Args[0]
2598 v_1_1 := v_1.Args[1]
2599 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2600 if t != v_1_0 {
2601 continue
2602 }
2603 y := v_1_1
2604 v.reset(OpAdd8)
2605 v.AddArg2(x, y)
2606 return true
2607 }
2608 }
2609 break
2610 }
2611
2612
2613 for {
2614 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2615 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 1 || v_1.Op != OpCom8 {
2616 continue
2617 }
2618 x := v_1.Args[0]
2619 v.reset(OpNeg8)
2620 v.AddArg(x)
2621 return true
2622 }
2623 break
2624 }
2625
2626
2627 for {
2628 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2629 x := v_0
2630 if v_1.Op != OpSub8 {
2631 continue
2632 }
2633 _ = v_1.Args[1]
2634 y := v_1.Args[0]
2635 if x != v_1.Args[1] {
2636 continue
2637 }
2638 v.copyOf(y)
2639 return true
2640 }
2641 break
2642 }
2643
2644
2645 for {
2646 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2647 x := v_0
2648 if v_1.Op != OpAdd8 {
2649 continue
2650 }
2651 _ = v_1.Args[1]
2652 v_1_0 := v_1.Args[0]
2653 v_1_1 := v_1.Args[1]
2654 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2655 y := v_1_0
2656 if v_1_1.Op != OpSub8 {
2657 continue
2658 }
2659 _ = v_1_1.Args[1]
2660 z := v_1_1.Args[0]
2661 if x != v_1_1.Args[1] {
2662 continue
2663 }
2664 v.reset(OpAdd8)
2665 v.AddArg2(y, z)
2666 return true
2667 }
2668 }
2669 break
2670 }
2671
2672
2673
2674 for {
2675 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2676 if v_0.Op != OpAdd8 {
2677 continue
2678 }
2679 _ = v_0.Args[1]
2680 v_0_0 := v_0.Args[0]
2681 v_0_1 := v_0.Args[1]
2682 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
2683 i := v_0_0
2684 if i.Op != OpConst8 {
2685 continue
2686 }
2687 t := i.Type
2688 z := v_0_1
2689 x := v_1
2690 if !(z.Op != OpConst8 && x.Op != OpConst8) {
2691 continue
2692 }
2693 v.reset(OpAdd8)
2694 v0 := b.NewValue0(v.Pos, OpAdd8, t)
2695 v0.AddArg2(z, x)
2696 v.AddArg2(i, v0)
2697 return true
2698 }
2699 }
2700 break
2701 }
2702
2703
2704
2705 for {
2706 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2707 if v_0.Op != OpSub8 {
2708 continue
2709 }
2710 z := v_0.Args[1]
2711 i := v_0.Args[0]
2712 if i.Op != OpConst8 {
2713 continue
2714 }
2715 t := i.Type
2716 x := v_1
2717 if !(z.Op != OpConst8 && x.Op != OpConst8) {
2718 continue
2719 }
2720 v.reset(OpAdd8)
2721 v0 := b.NewValue0(v.Pos, OpSub8, t)
2722 v0.AddArg2(x, z)
2723 v.AddArg2(i, v0)
2724 return true
2725 }
2726 break
2727 }
2728
2729
2730 for {
2731 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2732 if v_0.Op != OpConst8 {
2733 continue
2734 }
2735 t := v_0.Type
2736 c := auxIntToInt8(v_0.AuxInt)
2737 if v_1.Op != OpAdd8 {
2738 continue
2739 }
2740 _ = v_1.Args[1]
2741 v_1_0 := v_1.Args[0]
2742 v_1_1 := v_1.Args[1]
2743 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2744 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
2745 continue
2746 }
2747 d := auxIntToInt8(v_1_0.AuxInt)
2748 x := v_1_1
2749 v.reset(OpAdd8)
2750 v0 := b.NewValue0(v.Pos, OpConst8, t)
2751 v0.AuxInt = int8ToAuxInt(c + d)
2752 v.AddArg2(v0, x)
2753 return true
2754 }
2755 }
2756 break
2757 }
2758
2759
2760 for {
2761 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2762 if v_0.Op != OpConst8 {
2763 continue
2764 }
2765 t := v_0.Type
2766 c := auxIntToInt8(v_0.AuxInt)
2767 if v_1.Op != OpSub8 {
2768 continue
2769 }
2770 x := v_1.Args[1]
2771 v_1_0 := v_1.Args[0]
2772 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
2773 continue
2774 }
2775 d := auxIntToInt8(v_1_0.AuxInt)
2776 v.reset(OpSub8)
2777 v0 := b.NewValue0(v.Pos, OpConst8, t)
2778 v0.AuxInt = int8ToAuxInt(c + d)
2779 v.AddArg2(v0, x)
2780 return true
2781 }
2782 break
2783 }
2784
2785
2786
2787 for {
2788 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2789 if v_0.Op != OpLsh8x64 {
2790 continue
2791 }
2792 _ = v_0.Args[1]
2793 x := v_0.Args[0]
2794 z := v_0.Args[1]
2795 if z.Op != OpConst64 {
2796 continue
2797 }
2798 c := auxIntToInt64(z.AuxInt)
2799 if v_1.Op != OpRsh8Ux64 {
2800 continue
2801 }
2802 _ = v_1.Args[1]
2803 if x != v_1.Args[0] {
2804 continue
2805 }
2806 v_1_1 := v_1.Args[1]
2807 if v_1_1.Op != OpConst64 {
2808 continue
2809 }
2810 d := auxIntToInt64(v_1_1.AuxInt)
2811 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
2812 continue
2813 }
2814 v.reset(OpRotateLeft8)
2815 v.AddArg2(x, z)
2816 return true
2817 }
2818 break
2819 }
2820
2821
2822
2823 for {
2824 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2825 left := v_0
2826 if left.Op != OpLsh8x64 {
2827 continue
2828 }
2829 y := left.Args[1]
2830 x := left.Args[0]
2831 right := v_1
2832 if right.Op != OpRsh8Ux64 {
2833 continue
2834 }
2835 _ = right.Args[1]
2836 if x != right.Args[0] {
2837 continue
2838 }
2839 right_1 := right.Args[1]
2840 if right_1.Op != OpSub64 {
2841 continue
2842 }
2843 _ = right_1.Args[1]
2844 right_1_0 := right_1.Args[0]
2845 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2846 continue
2847 }
2848 v.reset(OpRotateLeft8)
2849 v.AddArg2(x, y)
2850 return true
2851 }
2852 break
2853 }
2854
2855
2856
2857 for {
2858 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2859 left := v_0
2860 if left.Op != OpLsh8x32 {
2861 continue
2862 }
2863 y := left.Args[1]
2864 x := left.Args[0]
2865 right := v_1
2866 if right.Op != OpRsh8Ux32 {
2867 continue
2868 }
2869 _ = right.Args[1]
2870 if x != right.Args[0] {
2871 continue
2872 }
2873 right_1 := right.Args[1]
2874 if right_1.Op != OpSub32 {
2875 continue
2876 }
2877 _ = right_1.Args[1]
2878 right_1_0 := right_1.Args[0]
2879 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2880 continue
2881 }
2882 v.reset(OpRotateLeft8)
2883 v.AddArg2(x, y)
2884 return true
2885 }
2886 break
2887 }
2888
2889
2890
2891 for {
2892 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2893 left := v_0
2894 if left.Op != OpLsh8x16 {
2895 continue
2896 }
2897 y := left.Args[1]
2898 x := left.Args[0]
2899 right := v_1
2900 if right.Op != OpRsh8Ux16 {
2901 continue
2902 }
2903 _ = right.Args[1]
2904 if x != right.Args[0] {
2905 continue
2906 }
2907 right_1 := right.Args[1]
2908 if right_1.Op != OpSub16 {
2909 continue
2910 }
2911 _ = right_1.Args[1]
2912 right_1_0 := right_1.Args[0]
2913 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2914 continue
2915 }
2916 v.reset(OpRotateLeft8)
2917 v.AddArg2(x, y)
2918 return true
2919 }
2920 break
2921 }
2922
2923
2924
2925 for {
2926 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2927 left := v_0
2928 if left.Op != OpLsh8x8 {
2929 continue
2930 }
2931 y := left.Args[1]
2932 x := left.Args[0]
2933 right := v_1
2934 if right.Op != OpRsh8Ux8 {
2935 continue
2936 }
2937 _ = right.Args[1]
2938 if x != right.Args[0] {
2939 continue
2940 }
2941 right_1 := right.Args[1]
2942 if right_1.Op != OpSub8 {
2943 continue
2944 }
2945 _ = right_1.Args[1]
2946 right_1_0 := right_1.Args[0]
2947 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2948 continue
2949 }
2950 v.reset(OpRotateLeft8)
2951 v.AddArg2(x, y)
2952 return true
2953 }
2954 break
2955 }
2956
2957
2958
2959 for {
2960 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2961 right := v_0
2962 if right.Op != OpRsh8Ux64 {
2963 continue
2964 }
2965 y := right.Args[1]
2966 x := right.Args[0]
2967 left := v_1
2968 if left.Op != OpLsh8x64 {
2969 continue
2970 }
2971 _ = left.Args[1]
2972 if x != left.Args[0] {
2973 continue
2974 }
2975 z := left.Args[1]
2976 if z.Op != OpSub64 {
2977 continue
2978 }
2979 _ = z.Args[1]
2980 z_0 := z.Args[0]
2981 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2982 continue
2983 }
2984 v.reset(OpRotateLeft8)
2985 v.AddArg2(x, z)
2986 return true
2987 }
2988 break
2989 }
2990
2991
2992
2993 for {
2994 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2995 right := v_0
2996 if right.Op != OpRsh8Ux32 {
2997 continue
2998 }
2999 y := right.Args[1]
3000 x := right.Args[0]
3001 left := v_1
3002 if left.Op != OpLsh8x32 {
3003 continue
3004 }
3005 _ = left.Args[1]
3006 if x != left.Args[0] {
3007 continue
3008 }
3009 z := left.Args[1]
3010 if z.Op != OpSub32 {
3011 continue
3012 }
3013 _ = z.Args[1]
3014 z_0 := z.Args[0]
3015 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
3016 continue
3017 }
3018 v.reset(OpRotateLeft8)
3019 v.AddArg2(x, z)
3020 return true
3021 }
3022 break
3023 }
3024
3025
3026
3027 for {
3028 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3029 right := v_0
3030 if right.Op != OpRsh8Ux16 {
3031 continue
3032 }
3033 y := right.Args[1]
3034 x := right.Args[0]
3035 left := v_1
3036 if left.Op != OpLsh8x16 {
3037 continue
3038 }
3039 _ = left.Args[1]
3040 if x != left.Args[0] {
3041 continue
3042 }
3043 z := left.Args[1]
3044 if z.Op != OpSub16 {
3045 continue
3046 }
3047 _ = z.Args[1]
3048 z_0 := z.Args[0]
3049 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
3050 continue
3051 }
3052 v.reset(OpRotateLeft8)
3053 v.AddArg2(x, z)
3054 return true
3055 }
3056 break
3057 }
3058
3059
3060
3061 for {
3062 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3063 right := v_0
3064 if right.Op != OpRsh8Ux8 {
3065 continue
3066 }
3067 y := right.Args[1]
3068 x := right.Args[0]
3069 left := v_1
3070 if left.Op != OpLsh8x8 {
3071 continue
3072 }
3073 _ = left.Args[1]
3074 if x != left.Args[0] {
3075 continue
3076 }
3077 z := left.Args[1]
3078 if z.Op != OpSub8 {
3079 continue
3080 }
3081 _ = z.Args[1]
3082 z_0 := z.Args[0]
3083 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
3084 continue
3085 }
3086 v.reset(OpRotateLeft8)
3087 v.AddArg2(x, z)
3088 return true
3089 }
3090 break
3091 }
3092 return false
3093 }
3094 func rewriteValuegeneric_OpAddPtr(v *Value) bool {
3095 v_1 := v.Args[1]
3096 v_0 := v.Args[0]
3097
3098
3099 for {
3100 t := v.Type
3101 x := v_0
3102 if v_1.Op != OpConst64 {
3103 break
3104 }
3105 c := auxIntToInt64(v_1.AuxInt)
3106 v.reset(OpOffPtr)
3107 v.Type = t
3108 v.AuxInt = int64ToAuxInt(c)
3109 v.AddArg(x)
3110 return true
3111 }
3112
3113
3114 for {
3115 t := v.Type
3116 x := v_0
3117 if v_1.Op != OpConst32 {
3118 break
3119 }
3120 c := auxIntToInt32(v_1.AuxInt)
3121 v.reset(OpOffPtr)
3122 v.Type = t
3123 v.AuxInt = int64ToAuxInt(int64(c))
3124 v.AddArg(x)
3125 return true
3126 }
3127 return false
3128 }
3129 func rewriteValuegeneric_OpAnd16(v *Value) bool {
3130 v_1 := v.Args[1]
3131 v_0 := v.Args[0]
3132 b := v.Block
3133
3134
3135 for {
3136 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3137 if v_0.Op != OpConst16 {
3138 continue
3139 }
3140 c := auxIntToInt16(v_0.AuxInt)
3141 if v_1.Op != OpConst16 {
3142 continue
3143 }
3144 d := auxIntToInt16(v_1.AuxInt)
3145 v.reset(OpConst16)
3146 v.AuxInt = int16ToAuxInt(c & d)
3147 return true
3148 }
3149 break
3150 }
3151
3152
3153 for {
3154 t := v.Type
3155 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3156 if v_0.Op != OpCom16 {
3157 continue
3158 }
3159 x := v_0.Args[0]
3160 if v_1.Op != OpCom16 {
3161 continue
3162 }
3163 y := v_1.Args[0]
3164 v.reset(OpCom16)
3165 v0 := b.NewValue0(v.Pos, OpOr16, t)
3166 v0.AddArg2(x, y)
3167 v.AddArg(v0)
3168 return true
3169 }
3170 break
3171 }
3172
3173
3174 for {
3175 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3176 x := v_0
3177 if v_1.Op != OpOr16 {
3178 continue
3179 }
3180 _ = v_1.Args[1]
3181 v_1_0 := v_1.Args[0]
3182 v_1_1 := v_1.Args[1]
3183 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3184 if x != v_1_0 {
3185 continue
3186 }
3187 v.copyOf(x)
3188 return true
3189 }
3190 }
3191 break
3192 }
3193
3194
3195
3196 for {
3197 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3198 if v_0.Op != OpConst16 {
3199 continue
3200 }
3201 m := auxIntToInt16(v_0.AuxInt)
3202 if v_1.Op != OpRsh16Ux64 {
3203 continue
3204 }
3205 _ = v_1.Args[1]
3206 v_1_1 := v_1.Args[1]
3207 if v_1_1.Op != OpConst64 {
3208 continue
3209 }
3210 c := auxIntToInt64(v_1_1.AuxInt)
3211 if !(c >= int64(16-ntz16(m))) {
3212 continue
3213 }
3214 v.reset(OpConst16)
3215 v.AuxInt = int16ToAuxInt(0)
3216 return true
3217 }
3218 break
3219 }
3220
3221
3222
3223 for {
3224 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3225 if v_0.Op != OpConst16 {
3226 continue
3227 }
3228 m := auxIntToInt16(v_0.AuxInt)
3229 if v_1.Op != OpLsh16x64 {
3230 continue
3231 }
3232 _ = v_1.Args[1]
3233 v_1_1 := v_1.Args[1]
3234 if v_1_1.Op != OpConst64 {
3235 continue
3236 }
3237 c := auxIntToInt64(v_1_1.AuxInt)
3238 if !(c >= int64(16-nlz16(m))) {
3239 continue
3240 }
3241 v.reset(OpConst16)
3242 v.AuxInt = int16ToAuxInt(0)
3243 return true
3244 }
3245 break
3246 }
3247
3248
3249 for {
3250 x := v_0
3251 if x != v_1 {
3252 break
3253 }
3254 v.copyOf(x)
3255 return true
3256 }
3257
3258
3259 for {
3260 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3261 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
3262 continue
3263 }
3264 x := v_1
3265 v.copyOf(x)
3266 return true
3267 }
3268 break
3269 }
3270
3271
3272 for {
3273 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3274 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
3275 continue
3276 }
3277 v.reset(OpConst16)
3278 v.AuxInt = int16ToAuxInt(0)
3279 return true
3280 }
3281 break
3282 }
3283
3284
3285 for {
3286 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3287 if v_0.Op != OpCom16 {
3288 continue
3289 }
3290 x := v_0.Args[0]
3291 if x != v_1 {
3292 continue
3293 }
3294 v.reset(OpConst16)
3295 v.AuxInt = int16ToAuxInt(0)
3296 return true
3297 }
3298 break
3299 }
3300
3301
3302 for {
3303 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3304 x := v_0
3305 if v_1.Op != OpAnd16 {
3306 continue
3307 }
3308 _ = v_1.Args[1]
3309 v_1_0 := v_1.Args[0]
3310 v_1_1 := v_1.Args[1]
3311 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3312 if x != v_1_0 {
3313 continue
3314 }
3315 y := v_1_1
3316 v.reset(OpAnd16)
3317 v.AddArg2(x, y)
3318 return true
3319 }
3320 }
3321 break
3322 }
3323
3324
3325
3326 for {
3327 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3328 if v_0.Op != OpAnd16 {
3329 continue
3330 }
3331 _ = v_0.Args[1]
3332 v_0_0 := v_0.Args[0]
3333 v_0_1 := v_0.Args[1]
3334 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3335 i := v_0_0
3336 if i.Op != OpConst16 {
3337 continue
3338 }
3339 t := i.Type
3340 z := v_0_1
3341 x := v_1
3342 if !(z.Op != OpConst16 && x.Op != OpConst16) {
3343 continue
3344 }
3345 v.reset(OpAnd16)
3346 v0 := b.NewValue0(v.Pos, OpAnd16, t)
3347 v0.AddArg2(z, x)
3348 v.AddArg2(i, v0)
3349 return true
3350 }
3351 }
3352 break
3353 }
3354
3355
3356 for {
3357 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3358 if v_0.Op != OpConst16 {
3359 continue
3360 }
3361 t := v_0.Type
3362 c := auxIntToInt16(v_0.AuxInt)
3363 if v_1.Op != OpAnd16 {
3364 continue
3365 }
3366 _ = v_1.Args[1]
3367 v_1_0 := v_1.Args[0]
3368 v_1_1 := v_1.Args[1]
3369 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3370 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
3371 continue
3372 }
3373 d := auxIntToInt16(v_1_0.AuxInt)
3374 x := v_1_1
3375 v.reset(OpAnd16)
3376 v0 := b.NewValue0(v.Pos, OpConst16, t)
3377 v0.AuxInt = int16ToAuxInt(c & d)
3378 v.AddArg2(v0, x)
3379 return true
3380 }
3381 }
3382 break
3383 }
3384 return false
3385 }
3386 func rewriteValuegeneric_OpAnd32(v *Value) bool {
3387 v_1 := v.Args[1]
3388 v_0 := v.Args[0]
3389 b := v.Block
3390
3391
3392 for {
3393 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3394 if v_0.Op != OpConst32 {
3395 continue
3396 }
3397 c := auxIntToInt32(v_0.AuxInt)
3398 if v_1.Op != OpConst32 {
3399 continue
3400 }
3401 d := auxIntToInt32(v_1.AuxInt)
3402 v.reset(OpConst32)
3403 v.AuxInt = int32ToAuxInt(c & d)
3404 return true
3405 }
3406 break
3407 }
3408
3409
3410 for {
3411 t := v.Type
3412 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3413 if v_0.Op != OpCom32 {
3414 continue
3415 }
3416 x := v_0.Args[0]
3417 if v_1.Op != OpCom32 {
3418 continue
3419 }
3420 y := v_1.Args[0]
3421 v.reset(OpCom32)
3422 v0 := b.NewValue0(v.Pos, OpOr32, t)
3423 v0.AddArg2(x, y)
3424 v.AddArg(v0)
3425 return true
3426 }
3427 break
3428 }
3429
3430
3431 for {
3432 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3433 x := v_0
3434 if v_1.Op != OpOr32 {
3435 continue
3436 }
3437 _ = v_1.Args[1]
3438 v_1_0 := v_1.Args[0]
3439 v_1_1 := v_1.Args[1]
3440 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3441 if x != v_1_0 {
3442 continue
3443 }
3444 v.copyOf(x)
3445 return true
3446 }
3447 }
3448 break
3449 }
3450
3451
3452
3453 for {
3454 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3455 if v_0.Op != OpConst32 {
3456 continue
3457 }
3458 m := auxIntToInt32(v_0.AuxInt)
3459 if v_1.Op != OpRsh32Ux64 {
3460 continue
3461 }
3462 _ = v_1.Args[1]
3463 v_1_1 := v_1.Args[1]
3464 if v_1_1.Op != OpConst64 {
3465 continue
3466 }
3467 c := auxIntToInt64(v_1_1.AuxInt)
3468 if !(c >= int64(32-ntz32(m))) {
3469 continue
3470 }
3471 v.reset(OpConst32)
3472 v.AuxInt = int32ToAuxInt(0)
3473 return true
3474 }
3475 break
3476 }
3477
3478
3479
3480 for {
3481 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3482 if v_0.Op != OpConst32 {
3483 continue
3484 }
3485 m := auxIntToInt32(v_0.AuxInt)
3486 if v_1.Op != OpLsh32x64 {
3487 continue
3488 }
3489 _ = v_1.Args[1]
3490 v_1_1 := v_1.Args[1]
3491 if v_1_1.Op != OpConst64 {
3492 continue
3493 }
3494 c := auxIntToInt64(v_1_1.AuxInt)
3495 if !(c >= int64(32-nlz32(m))) {
3496 continue
3497 }
3498 v.reset(OpConst32)
3499 v.AuxInt = int32ToAuxInt(0)
3500 return true
3501 }
3502 break
3503 }
3504
3505
3506 for {
3507 x := v_0
3508 if x != v_1 {
3509 break
3510 }
3511 v.copyOf(x)
3512 return true
3513 }
3514
3515
3516 for {
3517 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3518 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
3519 continue
3520 }
3521 x := v_1
3522 v.copyOf(x)
3523 return true
3524 }
3525 break
3526 }
3527
3528
3529 for {
3530 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3531 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
3532 continue
3533 }
3534 v.reset(OpConst32)
3535 v.AuxInt = int32ToAuxInt(0)
3536 return true
3537 }
3538 break
3539 }
3540
3541
3542 for {
3543 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3544 if v_0.Op != OpCom32 {
3545 continue
3546 }
3547 x := v_0.Args[0]
3548 if x != v_1 {
3549 continue
3550 }
3551 v.reset(OpConst32)
3552 v.AuxInt = int32ToAuxInt(0)
3553 return true
3554 }
3555 break
3556 }
3557
3558
3559 for {
3560 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3561 x := v_0
3562 if v_1.Op != OpAnd32 {
3563 continue
3564 }
3565 _ = v_1.Args[1]
3566 v_1_0 := v_1.Args[0]
3567 v_1_1 := v_1.Args[1]
3568 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3569 if x != v_1_0 {
3570 continue
3571 }
3572 y := v_1_1
3573 v.reset(OpAnd32)
3574 v.AddArg2(x, y)
3575 return true
3576 }
3577 }
3578 break
3579 }
3580
3581
3582
3583 for {
3584 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3585 if v_0.Op != OpAnd32 {
3586 continue
3587 }
3588 _ = v_0.Args[1]
3589 v_0_0 := v_0.Args[0]
3590 v_0_1 := v_0.Args[1]
3591 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3592 i := v_0_0
3593 if i.Op != OpConst32 {
3594 continue
3595 }
3596 t := i.Type
3597 z := v_0_1
3598 x := v_1
3599 if !(z.Op != OpConst32 && x.Op != OpConst32) {
3600 continue
3601 }
3602 v.reset(OpAnd32)
3603 v0 := b.NewValue0(v.Pos, OpAnd32, t)
3604 v0.AddArg2(z, x)
3605 v.AddArg2(i, v0)
3606 return true
3607 }
3608 }
3609 break
3610 }
3611
3612
3613 for {
3614 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3615 if v_0.Op != OpConst32 {
3616 continue
3617 }
3618 t := v_0.Type
3619 c := auxIntToInt32(v_0.AuxInt)
3620 if v_1.Op != OpAnd32 {
3621 continue
3622 }
3623 _ = v_1.Args[1]
3624 v_1_0 := v_1.Args[0]
3625 v_1_1 := v_1.Args[1]
3626 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3627 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
3628 continue
3629 }
3630 d := auxIntToInt32(v_1_0.AuxInt)
3631 x := v_1_1
3632 v.reset(OpAnd32)
3633 v0 := b.NewValue0(v.Pos, OpConst32, t)
3634 v0.AuxInt = int32ToAuxInt(c & d)
3635 v.AddArg2(v0, x)
3636 return true
3637 }
3638 }
3639 break
3640 }
3641 return false
3642 }
3643 func rewriteValuegeneric_OpAnd64(v *Value) bool {
3644 v_1 := v.Args[1]
3645 v_0 := v.Args[0]
3646 b := v.Block
3647
3648
3649 for {
3650 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3651 if v_0.Op != OpConst64 {
3652 continue
3653 }
3654 c := auxIntToInt64(v_0.AuxInt)
3655 if v_1.Op != OpConst64 {
3656 continue
3657 }
3658 d := auxIntToInt64(v_1.AuxInt)
3659 v.reset(OpConst64)
3660 v.AuxInt = int64ToAuxInt(c & d)
3661 return true
3662 }
3663 break
3664 }
3665
3666
3667 for {
3668 t := v.Type
3669 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3670 if v_0.Op != OpCom64 {
3671 continue
3672 }
3673 x := v_0.Args[0]
3674 if v_1.Op != OpCom64 {
3675 continue
3676 }
3677 y := v_1.Args[0]
3678 v.reset(OpCom64)
3679 v0 := b.NewValue0(v.Pos, OpOr64, t)
3680 v0.AddArg2(x, y)
3681 v.AddArg(v0)
3682 return true
3683 }
3684 break
3685 }
3686
3687
3688 for {
3689 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3690 x := v_0
3691 if v_1.Op != OpOr64 {
3692 continue
3693 }
3694 _ = v_1.Args[1]
3695 v_1_0 := v_1.Args[0]
3696 v_1_1 := v_1.Args[1]
3697 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3698 if x != v_1_0 {
3699 continue
3700 }
3701 v.copyOf(x)
3702 return true
3703 }
3704 }
3705 break
3706 }
3707
3708
3709
3710 for {
3711 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3712 if v_0.Op != OpConst64 {
3713 continue
3714 }
3715 m := auxIntToInt64(v_0.AuxInt)
3716 if v_1.Op != OpRsh64Ux64 {
3717 continue
3718 }
3719 _ = v_1.Args[1]
3720 v_1_1 := v_1.Args[1]
3721 if v_1_1.Op != OpConst64 {
3722 continue
3723 }
3724 c := auxIntToInt64(v_1_1.AuxInt)
3725 if !(c >= int64(64-ntz64(m))) {
3726 continue
3727 }
3728 v.reset(OpConst64)
3729 v.AuxInt = int64ToAuxInt(0)
3730 return true
3731 }
3732 break
3733 }
3734
3735
3736
3737 for {
3738 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3739 if v_0.Op != OpConst64 {
3740 continue
3741 }
3742 m := auxIntToInt64(v_0.AuxInt)
3743 if v_1.Op != OpLsh64x64 {
3744 continue
3745 }
3746 _ = v_1.Args[1]
3747 v_1_1 := v_1.Args[1]
3748 if v_1_1.Op != OpConst64 {
3749 continue
3750 }
3751 c := auxIntToInt64(v_1_1.AuxInt)
3752 if !(c >= int64(64-nlz64(m))) {
3753 continue
3754 }
3755 v.reset(OpConst64)
3756 v.AuxInt = int64ToAuxInt(0)
3757 return true
3758 }
3759 break
3760 }
3761
3762
3763 for {
3764 x := v_0
3765 if x != v_1 {
3766 break
3767 }
3768 v.copyOf(x)
3769 return true
3770 }
3771
3772
3773 for {
3774 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3775 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
3776 continue
3777 }
3778 x := v_1
3779 v.copyOf(x)
3780 return true
3781 }
3782 break
3783 }
3784
3785
3786 for {
3787 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3788 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
3789 continue
3790 }
3791 v.reset(OpConst64)
3792 v.AuxInt = int64ToAuxInt(0)
3793 return true
3794 }
3795 break
3796 }
3797
3798
3799 for {
3800 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3801 if v_0.Op != OpCom64 {
3802 continue
3803 }
3804 x := v_0.Args[0]
3805 if x != v_1 {
3806 continue
3807 }
3808 v.reset(OpConst64)
3809 v.AuxInt = int64ToAuxInt(0)
3810 return true
3811 }
3812 break
3813 }
3814
3815
3816 for {
3817 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3818 x := v_0
3819 if v_1.Op != OpAnd64 {
3820 continue
3821 }
3822 _ = v_1.Args[1]
3823 v_1_0 := v_1.Args[0]
3824 v_1_1 := v_1.Args[1]
3825 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3826 if x != v_1_0 {
3827 continue
3828 }
3829 y := v_1_1
3830 v.reset(OpAnd64)
3831 v.AddArg2(x, y)
3832 return true
3833 }
3834 }
3835 break
3836 }
3837
3838
3839
3840 for {
3841 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3842 if v_0.Op != OpAnd64 {
3843 continue
3844 }
3845 _ = v_0.Args[1]
3846 v_0_0 := v_0.Args[0]
3847 v_0_1 := v_0.Args[1]
3848 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3849 i := v_0_0
3850 if i.Op != OpConst64 {
3851 continue
3852 }
3853 t := i.Type
3854 z := v_0_1
3855 x := v_1
3856 if !(z.Op != OpConst64 && x.Op != OpConst64) {
3857 continue
3858 }
3859 v.reset(OpAnd64)
3860 v0 := b.NewValue0(v.Pos, OpAnd64, t)
3861 v0.AddArg2(z, x)
3862 v.AddArg2(i, v0)
3863 return true
3864 }
3865 }
3866 break
3867 }
3868
3869
3870 for {
3871 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3872 if v_0.Op != OpConst64 {
3873 continue
3874 }
3875 t := v_0.Type
3876 c := auxIntToInt64(v_0.AuxInt)
3877 if v_1.Op != OpAnd64 {
3878 continue
3879 }
3880 _ = v_1.Args[1]
3881 v_1_0 := v_1.Args[0]
3882 v_1_1 := v_1.Args[1]
3883 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3884 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
3885 continue
3886 }
3887 d := auxIntToInt64(v_1_0.AuxInt)
3888 x := v_1_1
3889 v.reset(OpAnd64)
3890 v0 := b.NewValue0(v.Pos, OpConst64, t)
3891 v0.AuxInt = int64ToAuxInt(c & d)
3892 v.AddArg2(v0, x)
3893 return true
3894 }
3895 }
3896 break
3897 }
3898 return false
3899 }
3900 func rewriteValuegeneric_OpAnd8(v *Value) bool {
3901 v_1 := v.Args[1]
3902 v_0 := v.Args[0]
3903 b := v.Block
3904
3905
3906 for {
3907 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3908 if v_0.Op != OpConst8 {
3909 continue
3910 }
3911 c := auxIntToInt8(v_0.AuxInt)
3912 if v_1.Op != OpConst8 {
3913 continue
3914 }
3915 d := auxIntToInt8(v_1.AuxInt)
3916 v.reset(OpConst8)
3917 v.AuxInt = int8ToAuxInt(c & d)
3918 return true
3919 }
3920 break
3921 }
3922
3923
3924 for {
3925 t := v.Type
3926 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3927 if v_0.Op != OpCom8 {
3928 continue
3929 }
3930 x := v_0.Args[0]
3931 if v_1.Op != OpCom8 {
3932 continue
3933 }
3934 y := v_1.Args[0]
3935 v.reset(OpCom8)
3936 v0 := b.NewValue0(v.Pos, OpOr8, t)
3937 v0.AddArg2(x, y)
3938 v.AddArg(v0)
3939 return true
3940 }
3941 break
3942 }
3943
3944
3945 for {
3946 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3947 x := v_0
3948 if v_1.Op != OpOr8 {
3949 continue
3950 }
3951 _ = v_1.Args[1]
3952 v_1_0 := v_1.Args[0]
3953 v_1_1 := v_1.Args[1]
3954 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3955 if x != v_1_0 {
3956 continue
3957 }
3958 v.copyOf(x)
3959 return true
3960 }
3961 }
3962 break
3963 }
3964
3965
3966
3967 for {
3968 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3969 if v_0.Op != OpConst8 {
3970 continue
3971 }
3972 m := auxIntToInt8(v_0.AuxInt)
3973 if v_1.Op != OpRsh8Ux64 {
3974 continue
3975 }
3976 _ = v_1.Args[1]
3977 v_1_1 := v_1.Args[1]
3978 if v_1_1.Op != OpConst64 {
3979 continue
3980 }
3981 c := auxIntToInt64(v_1_1.AuxInt)
3982 if !(c >= int64(8-ntz8(m))) {
3983 continue
3984 }
3985 v.reset(OpConst8)
3986 v.AuxInt = int8ToAuxInt(0)
3987 return true
3988 }
3989 break
3990 }
3991
3992
3993
3994 for {
3995 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3996 if v_0.Op != OpConst8 {
3997 continue
3998 }
3999 m := auxIntToInt8(v_0.AuxInt)
4000 if v_1.Op != OpLsh8x64 {
4001 continue
4002 }
4003 _ = v_1.Args[1]
4004 v_1_1 := v_1.Args[1]
4005 if v_1_1.Op != OpConst64 {
4006 continue
4007 }
4008 c := auxIntToInt64(v_1_1.AuxInt)
4009 if !(c >= int64(8-nlz8(m))) {
4010 continue
4011 }
4012 v.reset(OpConst8)
4013 v.AuxInt = int8ToAuxInt(0)
4014 return true
4015 }
4016 break
4017 }
4018
4019
4020 for {
4021 x := v_0
4022 if x != v_1 {
4023 break
4024 }
4025 v.copyOf(x)
4026 return true
4027 }
4028
4029
4030 for {
4031 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4032 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
4033 continue
4034 }
4035 x := v_1
4036 v.copyOf(x)
4037 return true
4038 }
4039 break
4040 }
4041
4042
4043 for {
4044 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4045 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
4046 continue
4047 }
4048 v.reset(OpConst8)
4049 v.AuxInt = int8ToAuxInt(0)
4050 return true
4051 }
4052 break
4053 }
4054
4055
4056 for {
4057 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4058 if v_0.Op != OpCom8 {
4059 continue
4060 }
4061 x := v_0.Args[0]
4062 if x != v_1 {
4063 continue
4064 }
4065 v.reset(OpConst8)
4066 v.AuxInt = int8ToAuxInt(0)
4067 return true
4068 }
4069 break
4070 }
4071
4072
4073 for {
4074 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4075 x := v_0
4076 if v_1.Op != OpAnd8 {
4077 continue
4078 }
4079 _ = v_1.Args[1]
4080 v_1_0 := v_1.Args[0]
4081 v_1_1 := v_1.Args[1]
4082 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
4083 if x != v_1_0 {
4084 continue
4085 }
4086 y := v_1_1
4087 v.reset(OpAnd8)
4088 v.AddArg2(x, y)
4089 return true
4090 }
4091 }
4092 break
4093 }
4094
4095
4096
4097 for {
4098 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4099 if v_0.Op != OpAnd8 {
4100 continue
4101 }
4102 _ = v_0.Args[1]
4103 v_0_0 := v_0.Args[0]
4104 v_0_1 := v_0.Args[1]
4105 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
4106 i := v_0_0
4107 if i.Op != OpConst8 {
4108 continue
4109 }
4110 t := i.Type
4111 z := v_0_1
4112 x := v_1
4113 if !(z.Op != OpConst8 && x.Op != OpConst8) {
4114 continue
4115 }
4116 v.reset(OpAnd8)
4117 v0 := b.NewValue0(v.Pos, OpAnd8, t)
4118 v0.AddArg2(z, x)
4119 v.AddArg2(i, v0)
4120 return true
4121 }
4122 }
4123 break
4124 }
4125
4126
4127 for {
4128 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4129 if v_0.Op != OpConst8 {
4130 continue
4131 }
4132 t := v_0.Type
4133 c := auxIntToInt8(v_0.AuxInt)
4134 if v_1.Op != OpAnd8 {
4135 continue
4136 }
4137 _ = v_1.Args[1]
4138 v_1_0 := v_1.Args[0]
4139 v_1_1 := v_1.Args[1]
4140 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
4141 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
4142 continue
4143 }
4144 d := auxIntToInt8(v_1_0.AuxInt)
4145 x := v_1_1
4146 v.reset(OpAnd8)
4147 v0 := b.NewValue0(v.Pos, OpConst8, t)
4148 v0.AuxInt = int8ToAuxInt(c & d)
4149 v.AddArg2(v0, x)
4150 return true
4151 }
4152 }
4153 break
4154 }
4155 return false
4156 }
4157 func rewriteValuegeneric_OpAndB(v *Value) bool {
4158 v_1 := v.Args[1]
4159 v_0 := v.Args[0]
4160 b := v.Block
4161
4162
4163
4164 for {
4165 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4166 if v_0.Op != OpLeq64 {
4167 continue
4168 }
4169 x := v_0.Args[1]
4170 v_0_0 := v_0.Args[0]
4171 if v_0_0.Op != OpConst64 {
4172 continue
4173 }
4174 c := auxIntToInt64(v_0_0.AuxInt)
4175 if v_1.Op != OpLess64 {
4176 continue
4177 }
4178 _ = v_1.Args[1]
4179 if x != v_1.Args[0] {
4180 continue
4181 }
4182 v_1_1 := v_1.Args[1]
4183 if v_1_1.Op != OpConst64 {
4184 continue
4185 }
4186 d := auxIntToInt64(v_1_1.AuxInt)
4187 if !(d >= c) {
4188 continue
4189 }
4190 v.reset(OpLess64U)
4191 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4192 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4193 v1.AuxInt = int64ToAuxInt(c)
4194 v0.AddArg2(x, v1)
4195 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4196 v2.AuxInt = int64ToAuxInt(d - c)
4197 v.AddArg2(v0, v2)
4198 return true
4199 }
4200 break
4201 }
4202
4203
4204
4205 for {
4206 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4207 if v_0.Op != OpLeq64 {
4208 continue
4209 }
4210 x := v_0.Args[1]
4211 v_0_0 := v_0.Args[0]
4212 if v_0_0.Op != OpConst64 {
4213 continue
4214 }
4215 c := auxIntToInt64(v_0_0.AuxInt)
4216 if v_1.Op != OpLeq64 {
4217 continue
4218 }
4219 _ = v_1.Args[1]
4220 if x != v_1.Args[0] {
4221 continue
4222 }
4223 v_1_1 := v_1.Args[1]
4224 if v_1_1.Op != OpConst64 {
4225 continue
4226 }
4227 d := auxIntToInt64(v_1_1.AuxInt)
4228 if !(d >= c) {
4229 continue
4230 }
4231 v.reset(OpLeq64U)
4232 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4233 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4234 v1.AuxInt = int64ToAuxInt(c)
4235 v0.AddArg2(x, v1)
4236 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4237 v2.AuxInt = int64ToAuxInt(d - c)
4238 v.AddArg2(v0, v2)
4239 return true
4240 }
4241 break
4242 }
4243
4244
4245
4246 for {
4247 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4248 if v_0.Op != OpLeq32 {
4249 continue
4250 }
4251 x := v_0.Args[1]
4252 v_0_0 := v_0.Args[0]
4253 if v_0_0.Op != OpConst32 {
4254 continue
4255 }
4256 c := auxIntToInt32(v_0_0.AuxInt)
4257 if v_1.Op != OpLess32 {
4258 continue
4259 }
4260 _ = v_1.Args[1]
4261 if x != v_1.Args[0] {
4262 continue
4263 }
4264 v_1_1 := v_1.Args[1]
4265 if v_1_1.Op != OpConst32 {
4266 continue
4267 }
4268 d := auxIntToInt32(v_1_1.AuxInt)
4269 if !(d >= c) {
4270 continue
4271 }
4272 v.reset(OpLess32U)
4273 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4274 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4275 v1.AuxInt = int32ToAuxInt(c)
4276 v0.AddArg2(x, v1)
4277 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4278 v2.AuxInt = int32ToAuxInt(d - c)
4279 v.AddArg2(v0, v2)
4280 return true
4281 }
4282 break
4283 }
4284
4285
4286
4287 for {
4288 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4289 if v_0.Op != OpLeq32 {
4290 continue
4291 }
4292 x := v_0.Args[1]
4293 v_0_0 := v_0.Args[0]
4294 if v_0_0.Op != OpConst32 {
4295 continue
4296 }
4297 c := auxIntToInt32(v_0_0.AuxInt)
4298 if v_1.Op != OpLeq32 {
4299 continue
4300 }
4301 _ = v_1.Args[1]
4302 if x != v_1.Args[0] {
4303 continue
4304 }
4305 v_1_1 := v_1.Args[1]
4306 if v_1_1.Op != OpConst32 {
4307 continue
4308 }
4309 d := auxIntToInt32(v_1_1.AuxInt)
4310 if !(d >= c) {
4311 continue
4312 }
4313 v.reset(OpLeq32U)
4314 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4315 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4316 v1.AuxInt = int32ToAuxInt(c)
4317 v0.AddArg2(x, v1)
4318 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4319 v2.AuxInt = int32ToAuxInt(d - c)
4320 v.AddArg2(v0, v2)
4321 return true
4322 }
4323 break
4324 }
4325
4326
4327
4328 for {
4329 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4330 if v_0.Op != OpLeq16 {
4331 continue
4332 }
4333 x := v_0.Args[1]
4334 v_0_0 := v_0.Args[0]
4335 if v_0_0.Op != OpConst16 {
4336 continue
4337 }
4338 c := auxIntToInt16(v_0_0.AuxInt)
4339 if v_1.Op != OpLess16 {
4340 continue
4341 }
4342 _ = v_1.Args[1]
4343 if x != v_1.Args[0] {
4344 continue
4345 }
4346 v_1_1 := v_1.Args[1]
4347 if v_1_1.Op != OpConst16 {
4348 continue
4349 }
4350 d := auxIntToInt16(v_1_1.AuxInt)
4351 if !(d >= c) {
4352 continue
4353 }
4354 v.reset(OpLess16U)
4355 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4356 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4357 v1.AuxInt = int16ToAuxInt(c)
4358 v0.AddArg2(x, v1)
4359 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4360 v2.AuxInt = int16ToAuxInt(d - c)
4361 v.AddArg2(v0, v2)
4362 return true
4363 }
4364 break
4365 }
4366
4367
4368
4369 for {
4370 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4371 if v_0.Op != OpLeq16 {
4372 continue
4373 }
4374 x := v_0.Args[1]
4375 v_0_0 := v_0.Args[0]
4376 if v_0_0.Op != OpConst16 {
4377 continue
4378 }
4379 c := auxIntToInt16(v_0_0.AuxInt)
4380 if v_1.Op != OpLeq16 {
4381 continue
4382 }
4383 _ = v_1.Args[1]
4384 if x != v_1.Args[0] {
4385 continue
4386 }
4387 v_1_1 := v_1.Args[1]
4388 if v_1_1.Op != OpConst16 {
4389 continue
4390 }
4391 d := auxIntToInt16(v_1_1.AuxInt)
4392 if !(d >= c) {
4393 continue
4394 }
4395 v.reset(OpLeq16U)
4396 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4397 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4398 v1.AuxInt = int16ToAuxInt(c)
4399 v0.AddArg2(x, v1)
4400 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4401 v2.AuxInt = int16ToAuxInt(d - c)
4402 v.AddArg2(v0, v2)
4403 return true
4404 }
4405 break
4406 }
4407
4408
4409
4410 for {
4411 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4412 if v_0.Op != OpLeq8 {
4413 continue
4414 }
4415 x := v_0.Args[1]
4416 v_0_0 := v_0.Args[0]
4417 if v_0_0.Op != OpConst8 {
4418 continue
4419 }
4420 c := auxIntToInt8(v_0_0.AuxInt)
4421 if v_1.Op != OpLess8 {
4422 continue
4423 }
4424 _ = v_1.Args[1]
4425 if x != v_1.Args[0] {
4426 continue
4427 }
4428 v_1_1 := v_1.Args[1]
4429 if v_1_1.Op != OpConst8 {
4430 continue
4431 }
4432 d := auxIntToInt8(v_1_1.AuxInt)
4433 if !(d >= c) {
4434 continue
4435 }
4436 v.reset(OpLess8U)
4437 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4438 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4439 v1.AuxInt = int8ToAuxInt(c)
4440 v0.AddArg2(x, v1)
4441 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4442 v2.AuxInt = int8ToAuxInt(d - c)
4443 v.AddArg2(v0, v2)
4444 return true
4445 }
4446 break
4447 }
4448
4449
4450
4451 for {
4452 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4453 if v_0.Op != OpLeq8 {
4454 continue
4455 }
4456 x := v_0.Args[1]
4457 v_0_0 := v_0.Args[0]
4458 if v_0_0.Op != OpConst8 {
4459 continue
4460 }
4461 c := auxIntToInt8(v_0_0.AuxInt)
4462 if v_1.Op != OpLeq8 {
4463 continue
4464 }
4465 _ = v_1.Args[1]
4466 if x != v_1.Args[0] {
4467 continue
4468 }
4469 v_1_1 := v_1.Args[1]
4470 if v_1_1.Op != OpConst8 {
4471 continue
4472 }
4473 d := auxIntToInt8(v_1_1.AuxInt)
4474 if !(d >= c) {
4475 continue
4476 }
4477 v.reset(OpLeq8U)
4478 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4479 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4480 v1.AuxInt = int8ToAuxInt(c)
4481 v0.AddArg2(x, v1)
4482 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4483 v2.AuxInt = int8ToAuxInt(d - c)
4484 v.AddArg2(v0, v2)
4485 return true
4486 }
4487 break
4488 }
4489
4490
4491
4492 for {
4493 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4494 if v_0.Op != OpLess64 {
4495 continue
4496 }
4497 x := v_0.Args[1]
4498 v_0_0 := v_0.Args[0]
4499 if v_0_0.Op != OpConst64 {
4500 continue
4501 }
4502 c := auxIntToInt64(v_0_0.AuxInt)
4503 if v_1.Op != OpLess64 {
4504 continue
4505 }
4506 _ = v_1.Args[1]
4507 if x != v_1.Args[0] {
4508 continue
4509 }
4510 v_1_1 := v_1.Args[1]
4511 if v_1_1.Op != OpConst64 {
4512 continue
4513 }
4514 d := auxIntToInt64(v_1_1.AuxInt)
4515 if !(d >= c+1 && c+1 > c) {
4516 continue
4517 }
4518 v.reset(OpLess64U)
4519 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4520 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4521 v1.AuxInt = int64ToAuxInt(c + 1)
4522 v0.AddArg2(x, v1)
4523 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4524 v2.AuxInt = int64ToAuxInt(d - c - 1)
4525 v.AddArg2(v0, v2)
4526 return true
4527 }
4528 break
4529 }
4530
4531
4532
4533 for {
4534 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4535 if v_0.Op != OpLess64 {
4536 continue
4537 }
4538 x := v_0.Args[1]
4539 v_0_0 := v_0.Args[0]
4540 if v_0_0.Op != OpConst64 {
4541 continue
4542 }
4543 c := auxIntToInt64(v_0_0.AuxInt)
4544 if v_1.Op != OpLeq64 {
4545 continue
4546 }
4547 _ = v_1.Args[1]
4548 if x != v_1.Args[0] {
4549 continue
4550 }
4551 v_1_1 := v_1.Args[1]
4552 if v_1_1.Op != OpConst64 {
4553 continue
4554 }
4555 d := auxIntToInt64(v_1_1.AuxInt)
4556 if !(d >= c+1 && c+1 > c) {
4557 continue
4558 }
4559 v.reset(OpLeq64U)
4560 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4561 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4562 v1.AuxInt = int64ToAuxInt(c + 1)
4563 v0.AddArg2(x, v1)
4564 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4565 v2.AuxInt = int64ToAuxInt(d - c - 1)
4566 v.AddArg2(v0, v2)
4567 return true
4568 }
4569 break
4570 }
4571
4572
4573
4574 for {
4575 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4576 if v_0.Op != OpLess32 {
4577 continue
4578 }
4579 x := v_0.Args[1]
4580 v_0_0 := v_0.Args[0]
4581 if v_0_0.Op != OpConst32 {
4582 continue
4583 }
4584 c := auxIntToInt32(v_0_0.AuxInt)
4585 if v_1.Op != OpLess32 {
4586 continue
4587 }
4588 _ = v_1.Args[1]
4589 if x != v_1.Args[0] {
4590 continue
4591 }
4592 v_1_1 := v_1.Args[1]
4593 if v_1_1.Op != OpConst32 {
4594 continue
4595 }
4596 d := auxIntToInt32(v_1_1.AuxInt)
4597 if !(d >= c+1 && c+1 > c) {
4598 continue
4599 }
4600 v.reset(OpLess32U)
4601 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4602 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4603 v1.AuxInt = int32ToAuxInt(c + 1)
4604 v0.AddArg2(x, v1)
4605 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4606 v2.AuxInt = int32ToAuxInt(d - c - 1)
4607 v.AddArg2(v0, v2)
4608 return true
4609 }
4610 break
4611 }
4612
4613
4614
4615 for {
4616 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4617 if v_0.Op != OpLess32 {
4618 continue
4619 }
4620 x := v_0.Args[1]
4621 v_0_0 := v_0.Args[0]
4622 if v_0_0.Op != OpConst32 {
4623 continue
4624 }
4625 c := auxIntToInt32(v_0_0.AuxInt)
4626 if v_1.Op != OpLeq32 {
4627 continue
4628 }
4629 _ = v_1.Args[1]
4630 if x != v_1.Args[0] {
4631 continue
4632 }
4633 v_1_1 := v_1.Args[1]
4634 if v_1_1.Op != OpConst32 {
4635 continue
4636 }
4637 d := auxIntToInt32(v_1_1.AuxInt)
4638 if !(d >= c+1 && c+1 > c) {
4639 continue
4640 }
4641 v.reset(OpLeq32U)
4642 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4643 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4644 v1.AuxInt = int32ToAuxInt(c + 1)
4645 v0.AddArg2(x, v1)
4646 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4647 v2.AuxInt = int32ToAuxInt(d - c - 1)
4648 v.AddArg2(v0, v2)
4649 return true
4650 }
4651 break
4652 }
4653
4654
4655
4656 for {
4657 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4658 if v_0.Op != OpLess16 {
4659 continue
4660 }
4661 x := v_0.Args[1]
4662 v_0_0 := v_0.Args[0]
4663 if v_0_0.Op != OpConst16 {
4664 continue
4665 }
4666 c := auxIntToInt16(v_0_0.AuxInt)
4667 if v_1.Op != OpLess16 {
4668 continue
4669 }
4670 _ = v_1.Args[1]
4671 if x != v_1.Args[0] {
4672 continue
4673 }
4674 v_1_1 := v_1.Args[1]
4675 if v_1_1.Op != OpConst16 {
4676 continue
4677 }
4678 d := auxIntToInt16(v_1_1.AuxInt)
4679 if !(d >= c+1 && c+1 > c) {
4680 continue
4681 }
4682 v.reset(OpLess16U)
4683 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4684 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4685 v1.AuxInt = int16ToAuxInt(c + 1)
4686 v0.AddArg2(x, v1)
4687 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4688 v2.AuxInt = int16ToAuxInt(d - c - 1)
4689 v.AddArg2(v0, v2)
4690 return true
4691 }
4692 break
4693 }
4694
4695
4696
4697 for {
4698 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4699 if v_0.Op != OpLess16 {
4700 continue
4701 }
4702 x := v_0.Args[1]
4703 v_0_0 := v_0.Args[0]
4704 if v_0_0.Op != OpConst16 {
4705 continue
4706 }
4707 c := auxIntToInt16(v_0_0.AuxInt)
4708 if v_1.Op != OpLeq16 {
4709 continue
4710 }
4711 _ = v_1.Args[1]
4712 if x != v_1.Args[0] {
4713 continue
4714 }
4715 v_1_1 := v_1.Args[1]
4716 if v_1_1.Op != OpConst16 {
4717 continue
4718 }
4719 d := auxIntToInt16(v_1_1.AuxInt)
4720 if !(d >= c+1 && c+1 > c) {
4721 continue
4722 }
4723 v.reset(OpLeq16U)
4724 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4725 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4726 v1.AuxInt = int16ToAuxInt(c + 1)
4727 v0.AddArg2(x, v1)
4728 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4729 v2.AuxInt = int16ToAuxInt(d - c - 1)
4730 v.AddArg2(v0, v2)
4731 return true
4732 }
4733 break
4734 }
4735
4736
4737
4738 for {
4739 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4740 if v_0.Op != OpLess8 {
4741 continue
4742 }
4743 x := v_0.Args[1]
4744 v_0_0 := v_0.Args[0]
4745 if v_0_0.Op != OpConst8 {
4746 continue
4747 }
4748 c := auxIntToInt8(v_0_0.AuxInt)
4749 if v_1.Op != OpLess8 {
4750 continue
4751 }
4752 _ = v_1.Args[1]
4753 if x != v_1.Args[0] {
4754 continue
4755 }
4756 v_1_1 := v_1.Args[1]
4757 if v_1_1.Op != OpConst8 {
4758 continue
4759 }
4760 d := auxIntToInt8(v_1_1.AuxInt)
4761 if !(d >= c+1 && c+1 > c) {
4762 continue
4763 }
4764 v.reset(OpLess8U)
4765 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4766 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4767 v1.AuxInt = int8ToAuxInt(c + 1)
4768 v0.AddArg2(x, v1)
4769 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4770 v2.AuxInt = int8ToAuxInt(d - c - 1)
4771 v.AddArg2(v0, v2)
4772 return true
4773 }
4774 break
4775 }
4776
4777
4778
4779 for {
4780 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4781 if v_0.Op != OpLess8 {
4782 continue
4783 }
4784 x := v_0.Args[1]
4785 v_0_0 := v_0.Args[0]
4786 if v_0_0.Op != OpConst8 {
4787 continue
4788 }
4789 c := auxIntToInt8(v_0_0.AuxInt)
4790 if v_1.Op != OpLeq8 {
4791 continue
4792 }
4793 _ = v_1.Args[1]
4794 if x != v_1.Args[0] {
4795 continue
4796 }
4797 v_1_1 := v_1.Args[1]
4798 if v_1_1.Op != OpConst8 {
4799 continue
4800 }
4801 d := auxIntToInt8(v_1_1.AuxInt)
4802 if !(d >= c+1 && c+1 > c) {
4803 continue
4804 }
4805 v.reset(OpLeq8U)
4806 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4807 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4808 v1.AuxInt = int8ToAuxInt(c + 1)
4809 v0.AddArg2(x, v1)
4810 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4811 v2.AuxInt = int8ToAuxInt(d - c - 1)
4812 v.AddArg2(v0, v2)
4813 return true
4814 }
4815 break
4816 }
4817
4818
4819
4820 for {
4821 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4822 if v_0.Op != OpLeq64U {
4823 continue
4824 }
4825 x := v_0.Args[1]
4826 v_0_0 := v_0.Args[0]
4827 if v_0_0.Op != OpConst64 {
4828 continue
4829 }
4830 c := auxIntToInt64(v_0_0.AuxInt)
4831 if v_1.Op != OpLess64U {
4832 continue
4833 }
4834 _ = v_1.Args[1]
4835 if x != v_1.Args[0] {
4836 continue
4837 }
4838 v_1_1 := v_1.Args[1]
4839 if v_1_1.Op != OpConst64 {
4840 continue
4841 }
4842 d := auxIntToInt64(v_1_1.AuxInt)
4843 if !(uint64(d) >= uint64(c)) {
4844 continue
4845 }
4846 v.reset(OpLess64U)
4847 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4848 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4849 v1.AuxInt = int64ToAuxInt(c)
4850 v0.AddArg2(x, v1)
4851 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4852 v2.AuxInt = int64ToAuxInt(d - c)
4853 v.AddArg2(v0, v2)
4854 return true
4855 }
4856 break
4857 }
4858
4859
4860
4861 for {
4862 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4863 if v_0.Op != OpLeq64U {
4864 continue
4865 }
4866 x := v_0.Args[1]
4867 v_0_0 := v_0.Args[0]
4868 if v_0_0.Op != OpConst64 {
4869 continue
4870 }
4871 c := auxIntToInt64(v_0_0.AuxInt)
4872 if v_1.Op != OpLeq64U {
4873 continue
4874 }
4875 _ = v_1.Args[1]
4876 if x != v_1.Args[0] {
4877 continue
4878 }
4879 v_1_1 := v_1.Args[1]
4880 if v_1_1.Op != OpConst64 {
4881 continue
4882 }
4883 d := auxIntToInt64(v_1_1.AuxInt)
4884 if !(uint64(d) >= uint64(c)) {
4885 continue
4886 }
4887 v.reset(OpLeq64U)
4888 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4889 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4890 v1.AuxInt = int64ToAuxInt(c)
4891 v0.AddArg2(x, v1)
4892 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4893 v2.AuxInt = int64ToAuxInt(d - c)
4894 v.AddArg2(v0, v2)
4895 return true
4896 }
4897 break
4898 }
4899
4900
4901
4902 for {
4903 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4904 if v_0.Op != OpLeq32U {
4905 continue
4906 }
4907 x := v_0.Args[1]
4908 v_0_0 := v_0.Args[0]
4909 if v_0_0.Op != OpConst32 {
4910 continue
4911 }
4912 c := auxIntToInt32(v_0_0.AuxInt)
4913 if v_1.Op != OpLess32U {
4914 continue
4915 }
4916 _ = v_1.Args[1]
4917 if x != v_1.Args[0] {
4918 continue
4919 }
4920 v_1_1 := v_1.Args[1]
4921 if v_1_1.Op != OpConst32 {
4922 continue
4923 }
4924 d := auxIntToInt32(v_1_1.AuxInt)
4925 if !(uint32(d) >= uint32(c)) {
4926 continue
4927 }
4928 v.reset(OpLess32U)
4929 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4930 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4931 v1.AuxInt = int32ToAuxInt(c)
4932 v0.AddArg2(x, v1)
4933 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4934 v2.AuxInt = int32ToAuxInt(d - c)
4935 v.AddArg2(v0, v2)
4936 return true
4937 }
4938 break
4939 }
4940
4941
4942
4943 for {
4944 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4945 if v_0.Op != OpLeq32U {
4946 continue
4947 }
4948 x := v_0.Args[1]
4949 v_0_0 := v_0.Args[0]
4950 if v_0_0.Op != OpConst32 {
4951 continue
4952 }
4953 c := auxIntToInt32(v_0_0.AuxInt)
4954 if v_1.Op != OpLeq32U {
4955 continue
4956 }
4957 _ = v_1.Args[1]
4958 if x != v_1.Args[0] {
4959 continue
4960 }
4961 v_1_1 := v_1.Args[1]
4962 if v_1_1.Op != OpConst32 {
4963 continue
4964 }
4965 d := auxIntToInt32(v_1_1.AuxInt)
4966 if !(uint32(d) >= uint32(c)) {
4967 continue
4968 }
4969 v.reset(OpLeq32U)
4970 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4971 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4972 v1.AuxInt = int32ToAuxInt(c)
4973 v0.AddArg2(x, v1)
4974 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4975 v2.AuxInt = int32ToAuxInt(d - c)
4976 v.AddArg2(v0, v2)
4977 return true
4978 }
4979 break
4980 }
4981
4982
4983
4984 for {
4985 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4986 if v_0.Op != OpLeq16U {
4987 continue
4988 }
4989 x := v_0.Args[1]
4990 v_0_0 := v_0.Args[0]
4991 if v_0_0.Op != OpConst16 {
4992 continue
4993 }
4994 c := auxIntToInt16(v_0_0.AuxInt)
4995 if v_1.Op != OpLess16U {
4996 continue
4997 }
4998 _ = v_1.Args[1]
4999 if x != v_1.Args[0] {
5000 continue
5001 }
5002 v_1_1 := v_1.Args[1]
5003 if v_1_1.Op != OpConst16 {
5004 continue
5005 }
5006 d := auxIntToInt16(v_1_1.AuxInt)
5007 if !(uint16(d) >= uint16(c)) {
5008 continue
5009 }
5010 v.reset(OpLess16U)
5011 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
5012 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5013 v1.AuxInt = int16ToAuxInt(c)
5014 v0.AddArg2(x, v1)
5015 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
5016 v2.AuxInt = int16ToAuxInt(d - c)
5017 v.AddArg2(v0, v2)
5018 return true
5019 }
5020 break
5021 }
5022
5023
5024
5025 for {
5026 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5027 if v_0.Op != OpLeq16U {
5028 continue
5029 }
5030 x := v_0.Args[1]
5031 v_0_0 := v_0.Args[0]
5032 if v_0_0.Op != OpConst16 {
5033 continue
5034 }
5035 c := auxIntToInt16(v_0_0.AuxInt)
5036 if v_1.Op != OpLeq16U {
5037 continue
5038 }
5039 _ = v_1.Args[1]
5040 if x != v_1.Args[0] {
5041 continue
5042 }
5043 v_1_1 := v_1.Args[1]
5044 if v_1_1.Op != OpConst16 {
5045 continue
5046 }
5047 d := auxIntToInt16(v_1_1.AuxInt)
5048 if !(uint16(d) >= uint16(c)) {
5049 continue
5050 }
5051 v.reset(OpLeq16U)
5052 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
5053 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5054 v1.AuxInt = int16ToAuxInt(c)
5055 v0.AddArg2(x, v1)
5056 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
5057 v2.AuxInt = int16ToAuxInt(d - c)
5058 v.AddArg2(v0, v2)
5059 return true
5060 }
5061 break
5062 }
5063
5064
5065
5066 for {
5067 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5068 if v_0.Op != OpLeq8U {
5069 continue
5070 }
5071 x := v_0.Args[1]
5072 v_0_0 := v_0.Args[0]
5073 if v_0_0.Op != OpConst8 {
5074 continue
5075 }
5076 c := auxIntToInt8(v_0_0.AuxInt)
5077 if v_1.Op != OpLess8U {
5078 continue
5079 }
5080 _ = v_1.Args[1]
5081 if x != v_1.Args[0] {
5082 continue
5083 }
5084 v_1_1 := v_1.Args[1]
5085 if v_1_1.Op != OpConst8 {
5086 continue
5087 }
5088 d := auxIntToInt8(v_1_1.AuxInt)
5089 if !(uint8(d) >= uint8(c)) {
5090 continue
5091 }
5092 v.reset(OpLess8U)
5093 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
5094 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5095 v1.AuxInt = int8ToAuxInt(c)
5096 v0.AddArg2(x, v1)
5097 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5098 v2.AuxInt = int8ToAuxInt(d - c)
5099 v.AddArg2(v0, v2)
5100 return true
5101 }
5102 break
5103 }
5104
5105
5106
5107 for {
5108 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5109 if v_0.Op != OpLeq8U {
5110 continue
5111 }
5112 x := v_0.Args[1]
5113 v_0_0 := v_0.Args[0]
5114 if v_0_0.Op != OpConst8 {
5115 continue
5116 }
5117 c := auxIntToInt8(v_0_0.AuxInt)
5118 if v_1.Op != OpLeq8U {
5119 continue
5120 }
5121 _ = v_1.Args[1]
5122 if x != v_1.Args[0] {
5123 continue
5124 }
5125 v_1_1 := v_1.Args[1]
5126 if v_1_1.Op != OpConst8 {
5127 continue
5128 }
5129 d := auxIntToInt8(v_1_1.AuxInt)
5130 if !(uint8(d) >= uint8(c)) {
5131 continue
5132 }
5133 v.reset(OpLeq8U)
5134 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
5135 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5136 v1.AuxInt = int8ToAuxInt(c)
5137 v0.AddArg2(x, v1)
5138 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5139 v2.AuxInt = int8ToAuxInt(d - c)
5140 v.AddArg2(v0, v2)
5141 return true
5142 }
5143 break
5144 }
5145
5146
5147
5148 for {
5149 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5150 if v_0.Op != OpLess64U {
5151 continue
5152 }
5153 x := v_0.Args[1]
5154 v_0_0 := v_0.Args[0]
5155 if v_0_0.Op != OpConst64 {
5156 continue
5157 }
5158 c := auxIntToInt64(v_0_0.AuxInt)
5159 if v_1.Op != OpLess64U {
5160 continue
5161 }
5162 _ = v_1.Args[1]
5163 if x != v_1.Args[0] {
5164 continue
5165 }
5166 v_1_1 := v_1.Args[1]
5167 if v_1_1.Op != OpConst64 {
5168 continue
5169 }
5170 d := auxIntToInt64(v_1_1.AuxInt)
5171 if !(uint64(d) >= uint64(c+1) && uint64(c+1) > uint64(c)) {
5172 continue
5173 }
5174 v.reset(OpLess64U)
5175 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
5176 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
5177 v1.AuxInt = int64ToAuxInt(c + 1)
5178 v0.AddArg2(x, v1)
5179 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
5180 v2.AuxInt = int64ToAuxInt(d - c - 1)
5181 v.AddArg2(v0, v2)
5182 return true
5183 }
5184 break
5185 }
5186
5187
5188
5189 for {
5190 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5191 if v_0.Op != OpLess64U {
5192 continue
5193 }
5194 x := v_0.Args[1]
5195 v_0_0 := v_0.Args[0]
5196 if v_0_0.Op != OpConst64 {
5197 continue
5198 }
5199 c := auxIntToInt64(v_0_0.AuxInt)
5200 if v_1.Op != OpLeq64U {
5201 continue
5202 }
5203 _ = v_1.Args[1]
5204 if x != v_1.Args[0] {
5205 continue
5206 }
5207 v_1_1 := v_1.Args[1]
5208 if v_1_1.Op != OpConst64 {
5209 continue
5210 }
5211 d := auxIntToInt64(v_1_1.AuxInt)
5212 if !(uint64(d) >= uint64(c+1) && uint64(c+1) > uint64(c)) {
5213 continue
5214 }
5215 v.reset(OpLeq64U)
5216 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
5217 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
5218 v1.AuxInt = int64ToAuxInt(c + 1)
5219 v0.AddArg2(x, v1)
5220 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
5221 v2.AuxInt = int64ToAuxInt(d - c - 1)
5222 v.AddArg2(v0, v2)
5223 return true
5224 }
5225 break
5226 }
5227
5228
5229
5230 for {
5231 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5232 if v_0.Op != OpLess32U {
5233 continue
5234 }
5235 x := v_0.Args[1]
5236 v_0_0 := v_0.Args[0]
5237 if v_0_0.Op != OpConst32 {
5238 continue
5239 }
5240 c := auxIntToInt32(v_0_0.AuxInt)
5241 if v_1.Op != OpLess32U {
5242 continue
5243 }
5244 _ = v_1.Args[1]
5245 if x != v_1.Args[0] {
5246 continue
5247 }
5248 v_1_1 := v_1.Args[1]
5249 if v_1_1.Op != OpConst32 {
5250 continue
5251 }
5252 d := auxIntToInt32(v_1_1.AuxInt)
5253 if !(uint32(d) >= uint32(c+1) && uint32(c+1) > uint32(c)) {
5254 continue
5255 }
5256 v.reset(OpLess32U)
5257 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
5258 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
5259 v1.AuxInt = int32ToAuxInt(c + 1)
5260 v0.AddArg2(x, v1)
5261 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
5262 v2.AuxInt = int32ToAuxInt(d - c - 1)
5263 v.AddArg2(v0, v2)
5264 return true
5265 }
5266 break
5267 }
5268
5269
5270
5271 for {
5272 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5273 if v_0.Op != OpLess32U {
5274 continue
5275 }
5276 x := v_0.Args[1]
5277 v_0_0 := v_0.Args[0]
5278 if v_0_0.Op != OpConst32 {
5279 continue
5280 }
5281 c := auxIntToInt32(v_0_0.AuxInt)
5282 if v_1.Op != OpLeq32U {
5283 continue
5284 }
5285 _ = v_1.Args[1]
5286 if x != v_1.Args[0] {
5287 continue
5288 }
5289 v_1_1 := v_1.Args[1]
5290 if v_1_1.Op != OpConst32 {
5291 continue
5292 }
5293 d := auxIntToInt32(v_1_1.AuxInt)
5294 if !(uint32(d) >= uint32(c+1) && uint32(c+1) > uint32(c)) {
5295 continue
5296 }
5297 v.reset(OpLeq32U)
5298 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
5299 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
5300 v1.AuxInt = int32ToAuxInt(c + 1)
5301 v0.AddArg2(x, v1)
5302 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
5303 v2.AuxInt = int32ToAuxInt(d - c - 1)
5304 v.AddArg2(v0, v2)
5305 return true
5306 }
5307 break
5308 }
5309
5310
5311
5312 for {
5313 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5314 if v_0.Op != OpLess16U {
5315 continue
5316 }
5317 x := v_0.Args[1]
5318 v_0_0 := v_0.Args[0]
5319 if v_0_0.Op != OpConst16 {
5320 continue
5321 }
5322 c := auxIntToInt16(v_0_0.AuxInt)
5323 if v_1.Op != OpLess16U {
5324 continue
5325 }
5326 _ = v_1.Args[1]
5327 if x != v_1.Args[0] {
5328 continue
5329 }
5330 v_1_1 := v_1.Args[1]
5331 if v_1_1.Op != OpConst16 {
5332 continue
5333 }
5334 d := auxIntToInt16(v_1_1.AuxInt)
5335 if !(uint16(d) >= uint16(c+1) && uint16(c+1) > uint16(c)) {
5336 continue
5337 }
5338 v.reset(OpLess16U)
5339 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
5340 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5341 v1.AuxInt = int16ToAuxInt(c + 1)
5342 v0.AddArg2(x, v1)
5343 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
5344 v2.AuxInt = int16ToAuxInt(d - c - 1)
5345 v.AddArg2(v0, v2)
5346 return true
5347 }
5348 break
5349 }
5350
5351
5352
5353 for {
5354 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5355 if v_0.Op != OpLess16U {
5356 continue
5357 }
5358 x := v_0.Args[1]
5359 v_0_0 := v_0.Args[0]
5360 if v_0_0.Op != OpConst16 {
5361 continue
5362 }
5363 c := auxIntToInt16(v_0_0.AuxInt)
5364 if v_1.Op != OpLeq16U {
5365 continue
5366 }
5367 _ = v_1.Args[1]
5368 if x != v_1.Args[0] {
5369 continue
5370 }
5371 v_1_1 := v_1.Args[1]
5372 if v_1_1.Op != OpConst16 {
5373 continue
5374 }
5375 d := auxIntToInt16(v_1_1.AuxInt)
5376 if !(uint16(d) >= uint16(c+1) && uint16(c+1) > uint16(c)) {
5377 continue
5378 }
5379 v.reset(OpLeq16U)
5380 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
5381 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5382 v1.AuxInt = int16ToAuxInt(c + 1)
5383 v0.AddArg2(x, v1)
5384 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
5385 v2.AuxInt = int16ToAuxInt(d - c - 1)
5386 v.AddArg2(v0, v2)
5387 return true
5388 }
5389 break
5390 }
5391
5392
5393
5394 for {
5395 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5396 if v_0.Op != OpLess8U {
5397 continue
5398 }
5399 x := v_0.Args[1]
5400 v_0_0 := v_0.Args[0]
5401 if v_0_0.Op != OpConst8 {
5402 continue
5403 }
5404 c := auxIntToInt8(v_0_0.AuxInt)
5405 if v_1.Op != OpLess8U {
5406 continue
5407 }
5408 _ = v_1.Args[1]
5409 if x != v_1.Args[0] {
5410 continue
5411 }
5412 v_1_1 := v_1.Args[1]
5413 if v_1_1.Op != OpConst8 {
5414 continue
5415 }
5416 d := auxIntToInt8(v_1_1.AuxInt)
5417 if !(uint8(d) >= uint8(c+1) && uint8(c+1) > uint8(c)) {
5418 continue
5419 }
5420 v.reset(OpLess8U)
5421 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
5422 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5423 v1.AuxInt = int8ToAuxInt(c + 1)
5424 v0.AddArg2(x, v1)
5425 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5426 v2.AuxInt = int8ToAuxInt(d - c - 1)
5427 v.AddArg2(v0, v2)
5428 return true
5429 }
5430 break
5431 }
5432
5433
5434
5435 for {
5436 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5437 if v_0.Op != OpLess8U {
5438 continue
5439 }
5440 x := v_0.Args[1]
5441 v_0_0 := v_0.Args[0]
5442 if v_0_0.Op != OpConst8 {
5443 continue
5444 }
5445 c := auxIntToInt8(v_0_0.AuxInt)
5446 if v_1.Op != OpLeq8U {
5447 continue
5448 }
5449 _ = v_1.Args[1]
5450 if x != v_1.Args[0] {
5451 continue
5452 }
5453 v_1_1 := v_1.Args[1]
5454 if v_1_1.Op != OpConst8 {
5455 continue
5456 }
5457 d := auxIntToInt8(v_1_1.AuxInt)
5458 if !(uint8(d) >= uint8(c+1) && uint8(c+1) > uint8(c)) {
5459 continue
5460 }
5461 v.reset(OpLeq8U)
5462 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
5463 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5464 v1.AuxInt = int8ToAuxInt(c + 1)
5465 v0.AddArg2(x, v1)
5466 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5467 v2.AuxInt = int8ToAuxInt(d - c - 1)
5468 v.AddArg2(v0, v2)
5469 return true
5470 }
5471 break
5472 }
5473
5474
5475
5476 for {
5477 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5478 if v_0.Op != OpNeq64 {
5479 continue
5480 }
5481 _ = v_0.Args[1]
5482 v_0_0 := v_0.Args[0]
5483 v_0_1 := v_0.Args[1]
5484 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5485 x := v_0_0
5486 cv := v_0_1
5487 if cv.Op != OpConst64 {
5488 continue
5489 }
5490 c := auxIntToInt64(cv.AuxInt)
5491 if v_1.Op != OpNeq64 {
5492 continue
5493 }
5494 _ = v_1.Args[1]
5495 v_1_0 := v_1.Args[0]
5496 v_1_1 := v_1.Args[1]
5497 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5498 if x != v_1_0 || v_1_1.Op != OpConst64 {
5499 continue
5500 }
5501 d := auxIntToInt64(v_1_1.AuxInt)
5502 if !(c|d == c && oneBit(c^d)) {
5503 continue
5504 }
5505 v.reset(OpNeq64)
5506 v0 := b.NewValue0(v.Pos, OpOr64, x.Type)
5507 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
5508 v1.AuxInt = int64ToAuxInt(c ^ d)
5509 v0.AddArg2(x, v1)
5510 v.AddArg2(v0, cv)
5511 return true
5512 }
5513 }
5514 }
5515 break
5516 }
5517
5518
5519
5520 for {
5521 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5522 if v_0.Op != OpNeq32 {
5523 continue
5524 }
5525 _ = v_0.Args[1]
5526 v_0_0 := v_0.Args[0]
5527 v_0_1 := v_0.Args[1]
5528 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5529 x := v_0_0
5530 cv := v_0_1
5531 if cv.Op != OpConst32 {
5532 continue
5533 }
5534 c := auxIntToInt32(cv.AuxInt)
5535 if v_1.Op != OpNeq32 {
5536 continue
5537 }
5538 _ = v_1.Args[1]
5539 v_1_0 := v_1.Args[0]
5540 v_1_1 := v_1.Args[1]
5541 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5542 if x != v_1_0 || v_1_1.Op != OpConst32 {
5543 continue
5544 }
5545 d := auxIntToInt32(v_1_1.AuxInt)
5546 if !(c|d == c && oneBit(c^d)) {
5547 continue
5548 }
5549 v.reset(OpNeq32)
5550 v0 := b.NewValue0(v.Pos, OpOr32, x.Type)
5551 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
5552 v1.AuxInt = int32ToAuxInt(c ^ d)
5553 v0.AddArg2(x, v1)
5554 v.AddArg2(v0, cv)
5555 return true
5556 }
5557 }
5558 }
5559 break
5560 }
5561
5562
5563
5564 for {
5565 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5566 if v_0.Op != OpNeq16 {
5567 continue
5568 }
5569 _ = v_0.Args[1]
5570 v_0_0 := v_0.Args[0]
5571 v_0_1 := v_0.Args[1]
5572 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5573 x := v_0_0
5574 cv := v_0_1
5575 if cv.Op != OpConst16 {
5576 continue
5577 }
5578 c := auxIntToInt16(cv.AuxInt)
5579 if v_1.Op != OpNeq16 {
5580 continue
5581 }
5582 _ = v_1.Args[1]
5583 v_1_0 := v_1.Args[0]
5584 v_1_1 := v_1.Args[1]
5585 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5586 if x != v_1_0 || v_1_1.Op != OpConst16 {
5587 continue
5588 }
5589 d := auxIntToInt16(v_1_1.AuxInt)
5590 if !(c|d == c && oneBit(c^d)) {
5591 continue
5592 }
5593 v.reset(OpNeq16)
5594 v0 := b.NewValue0(v.Pos, OpOr16, x.Type)
5595 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5596 v1.AuxInt = int16ToAuxInt(c ^ d)
5597 v0.AddArg2(x, v1)
5598 v.AddArg2(v0, cv)
5599 return true
5600 }
5601 }
5602 }
5603 break
5604 }
5605
5606
5607
5608 for {
5609 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5610 if v_0.Op != OpNeq8 {
5611 continue
5612 }
5613 _ = v_0.Args[1]
5614 v_0_0 := v_0.Args[0]
5615 v_0_1 := v_0.Args[1]
5616 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5617 x := v_0_0
5618 cv := v_0_1
5619 if cv.Op != OpConst8 {
5620 continue
5621 }
5622 c := auxIntToInt8(cv.AuxInt)
5623 if v_1.Op != OpNeq8 {
5624 continue
5625 }
5626 _ = v_1.Args[1]
5627 v_1_0 := v_1.Args[0]
5628 v_1_1 := v_1.Args[1]
5629 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5630 if x != v_1_0 || v_1_1.Op != OpConst8 {
5631 continue
5632 }
5633 d := auxIntToInt8(v_1_1.AuxInt)
5634 if !(c|d == c && oneBit(c^d)) {
5635 continue
5636 }
5637 v.reset(OpNeq8)
5638 v0 := b.NewValue0(v.Pos, OpOr8, x.Type)
5639 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5640 v1.AuxInt = int8ToAuxInt(c ^ d)
5641 v0.AddArg2(x, v1)
5642 v.AddArg2(v0, cv)
5643 return true
5644 }
5645 }
5646 }
5647 break
5648 }
5649 return false
5650 }
5651 func rewriteValuegeneric_OpArraySelect(v *Value) bool {
5652 v_0 := v.Args[0]
5653
5654
5655 for {
5656 if v_0.Op != OpArrayMake1 {
5657 break
5658 }
5659 x := v_0.Args[0]
5660 v.copyOf(x)
5661 return true
5662 }
5663
5664
5665 for {
5666 if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpIData {
5667 break
5668 }
5669 x := v_0.Args[0]
5670 v.reset(OpIData)
5671 v.AddArg(x)
5672 return true
5673 }
5674 return false
5675 }
5676 func rewriteValuegeneric_OpBitLen16(v *Value) bool {
5677 v_0 := v.Args[0]
5678 b := v.Block
5679 config := b.Func.Config
5680
5681
5682
5683 for {
5684 if v_0.Op != OpConst16 {
5685 break
5686 }
5687 c := auxIntToInt16(v_0.AuxInt)
5688 if !(config.PtrSize == 8) {
5689 break
5690 }
5691 v.reset(OpConst64)
5692 v.AuxInt = int64ToAuxInt(int64(bits.Len16(uint16(c))))
5693 return true
5694 }
5695
5696
5697
5698 for {
5699 if v_0.Op != OpConst16 {
5700 break
5701 }
5702 c := auxIntToInt16(v_0.AuxInt)
5703 if !(config.PtrSize == 4) {
5704 break
5705 }
5706 v.reset(OpConst32)
5707 v.AuxInt = int32ToAuxInt(int32(bits.Len16(uint16(c))))
5708 return true
5709 }
5710 return false
5711 }
5712 func rewriteValuegeneric_OpBitLen32(v *Value) bool {
5713 v_0 := v.Args[0]
5714 b := v.Block
5715 config := b.Func.Config
5716
5717
5718
5719 for {
5720 if v_0.Op != OpConst32 {
5721 break
5722 }
5723 c := auxIntToInt32(v_0.AuxInt)
5724 if !(config.PtrSize == 8) {
5725 break
5726 }
5727 v.reset(OpConst64)
5728 v.AuxInt = int64ToAuxInt(int64(bits.Len32(uint32(c))))
5729 return true
5730 }
5731
5732
5733
5734 for {
5735 if v_0.Op != OpConst32 {
5736 break
5737 }
5738 c := auxIntToInt32(v_0.AuxInt)
5739 if !(config.PtrSize == 4) {
5740 break
5741 }
5742 v.reset(OpConst32)
5743 v.AuxInt = int32ToAuxInt(int32(bits.Len32(uint32(c))))
5744 return true
5745 }
5746 return false
5747 }
5748 func rewriteValuegeneric_OpBitLen64(v *Value) bool {
5749 v_0 := v.Args[0]
5750 b := v.Block
5751 config := b.Func.Config
5752
5753
5754
5755 for {
5756 if v_0.Op != OpConst64 {
5757 break
5758 }
5759 c := auxIntToInt64(v_0.AuxInt)
5760 if !(config.PtrSize == 8) {
5761 break
5762 }
5763 v.reset(OpConst64)
5764 v.AuxInt = int64ToAuxInt(int64(bits.Len64(uint64(c))))
5765 return true
5766 }
5767
5768
5769
5770 for {
5771 if v_0.Op != OpConst64 {
5772 break
5773 }
5774 c := auxIntToInt64(v_0.AuxInt)
5775 if !(config.PtrSize == 4) {
5776 break
5777 }
5778 v.reset(OpConst32)
5779 v.AuxInt = int32ToAuxInt(int32(bits.Len64(uint64(c))))
5780 return true
5781 }
5782 return false
5783 }
5784 func rewriteValuegeneric_OpBitLen8(v *Value) bool {
5785 v_0 := v.Args[0]
5786 b := v.Block
5787 config := b.Func.Config
5788
5789
5790
5791 for {
5792 if v_0.Op != OpConst8 {
5793 break
5794 }
5795 c := auxIntToInt8(v_0.AuxInt)
5796 if !(config.PtrSize == 8) {
5797 break
5798 }
5799 v.reset(OpConst64)
5800 v.AuxInt = int64ToAuxInt(int64(bits.Len8(uint8(c))))
5801 return true
5802 }
5803
5804
5805
5806 for {
5807 if v_0.Op != OpConst8 {
5808 break
5809 }
5810 c := auxIntToInt8(v_0.AuxInt)
5811 if !(config.PtrSize == 4) {
5812 break
5813 }
5814 v.reset(OpConst32)
5815 v.AuxInt = int32ToAuxInt(int32(bits.Len8(uint8(c))))
5816 return true
5817 }
5818 return false
5819 }
5820 func rewriteValuegeneric_OpCeil(v *Value) bool {
5821 v_0 := v.Args[0]
5822
5823
5824 for {
5825 if v_0.Op != OpConst64F {
5826 break
5827 }
5828 c := auxIntToFloat64(v_0.AuxInt)
5829 v.reset(OpConst64F)
5830 v.AuxInt = float64ToAuxInt(math.Ceil(c))
5831 return true
5832 }
5833 return false
5834 }
5835 func rewriteValuegeneric_OpCom16(v *Value) bool {
5836 v_0 := v.Args[0]
5837
5838
5839 for {
5840 if v_0.Op != OpCom16 {
5841 break
5842 }
5843 x := v_0.Args[0]
5844 v.copyOf(x)
5845 return true
5846 }
5847
5848
5849 for {
5850 if v_0.Op != OpConst16 {
5851 break
5852 }
5853 c := auxIntToInt16(v_0.AuxInt)
5854 v.reset(OpConst16)
5855 v.AuxInt = int16ToAuxInt(^c)
5856 return true
5857 }
5858
5859
5860 for {
5861 if v_0.Op != OpAdd16 {
5862 break
5863 }
5864 _ = v_0.Args[1]
5865 v_0_0 := v_0.Args[0]
5866 v_0_1 := v_0.Args[1]
5867 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5868 if v_0_0.Op != OpConst16 || auxIntToInt16(v_0_0.AuxInt) != -1 {
5869 continue
5870 }
5871 x := v_0_1
5872 v.reset(OpNeg16)
5873 v.AddArg(x)
5874 return true
5875 }
5876 break
5877 }
5878 return false
5879 }
5880 func rewriteValuegeneric_OpCom32(v *Value) bool {
5881 v_0 := v.Args[0]
5882
5883
5884 for {
5885 if v_0.Op != OpCom32 {
5886 break
5887 }
5888 x := v_0.Args[0]
5889 v.copyOf(x)
5890 return true
5891 }
5892
5893
5894 for {
5895 if v_0.Op != OpConst32 {
5896 break
5897 }
5898 c := auxIntToInt32(v_0.AuxInt)
5899 v.reset(OpConst32)
5900 v.AuxInt = int32ToAuxInt(^c)
5901 return true
5902 }
5903
5904
5905 for {
5906 if v_0.Op != OpAdd32 {
5907 break
5908 }
5909 _ = v_0.Args[1]
5910 v_0_0 := v_0.Args[0]
5911 v_0_1 := v_0.Args[1]
5912 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5913 if v_0_0.Op != OpConst32 || auxIntToInt32(v_0_0.AuxInt) != -1 {
5914 continue
5915 }
5916 x := v_0_1
5917 v.reset(OpNeg32)
5918 v.AddArg(x)
5919 return true
5920 }
5921 break
5922 }
5923 return false
5924 }
5925 func rewriteValuegeneric_OpCom64(v *Value) bool {
5926 v_0 := v.Args[0]
5927
5928
5929 for {
5930 if v_0.Op != OpCom64 {
5931 break
5932 }
5933 x := v_0.Args[0]
5934 v.copyOf(x)
5935 return true
5936 }
5937
5938
5939 for {
5940 if v_0.Op != OpConst64 {
5941 break
5942 }
5943 c := auxIntToInt64(v_0.AuxInt)
5944 v.reset(OpConst64)
5945 v.AuxInt = int64ToAuxInt(^c)
5946 return true
5947 }
5948
5949
5950 for {
5951 if v_0.Op != OpAdd64 {
5952 break
5953 }
5954 _ = v_0.Args[1]
5955 v_0_0 := v_0.Args[0]
5956 v_0_1 := v_0.Args[1]
5957 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5958 if v_0_0.Op != OpConst64 || auxIntToInt64(v_0_0.AuxInt) != -1 {
5959 continue
5960 }
5961 x := v_0_1
5962 v.reset(OpNeg64)
5963 v.AddArg(x)
5964 return true
5965 }
5966 break
5967 }
5968 return false
5969 }
5970 func rewriteValuegeneric_OpCom8(v *Value) bool {
5971 v_0 := v.Args[0]
5972
5973
5974 for {
5975 if v_0.Op != OpCom8 {
5976 break
5977 }
5978 x := v_0.Args[0]
5979 v.copyOf(x)
5980 return true
5981 }
5982
5983
5984 for {
5985 if v_0.Op != OpConst8 {
5986 break
5987 }
5988 c := auxIntToInt8(v_0.AuxInt)
5989 v.reset(OpConst8)
5990 v.AuxInt = int8ToAuxInt(^c)
5991 return true
5992 }
5993
5994
5995 for {
5996 if v_0.Op != OpAdd8 {
5997 break
5998 }
5999 _ = v_0.Args[1]
6000 v_0_0 := v_0.Args[0]
6001 v_0_1 := v_0.Args[1]
6002 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6003 if v_0_0.Op != OpConst8 || auxIntToInt8(v_0_0.AuxInt) != -1 {
6004 continue
6005 }
6006 x := v_0_1
6007 v.reset(OpNeg8)
6008 v.AddArg(x)
6009 return true
6010 }
6011 break
6012 }
6013 return false
6014 }
6015 func rewriteValuegeneric_OpCondSelect(v *Value) bool {
6016 v_2 := v.Args[2]
6017 v_1 := v.Args[1]
6018 v_0 := v.Args[0]
6019 b := v.Block
6020 config := b.Func.Config
6021
6022
6023 for {
6024 x := v_0
6025 if v_2.Op != OpConstBool || auxIntToBool(v_2.AuxInt) != true {
6026 break
6027 }
6028 v.copyOf(x)
6029 return true
6030 }
6031
6032
6033 for {
6034 y := v_1
6035 if v_2.Op != OpConstBool || auxIntToBool(v_2.AuxInt) != false {
6036 break
6037 }
6038 v.copyOf(y)
6039 return true
6040 }
6041
6042
6043 for {
6044 x := v_0
6045 if x != v_1 {
6046 break
6047 }
6048 v.copyOf(x)
6049 return true
6050 }
6051
6052
6053
6054 for {
6055 op := v_0
6056 if op.Op != OpAdd8 {
6057 break
6058 }
6059 t := op.Type
6060 _ = op.Args[1]
6061 op_0 := op.Args[0]
6062 op_1 := op.Args[1]
6063 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6064 x := op_0
6065 c := op_1
6066 if c.Op != OpConst8 || x != v_1 {
6067 continue
6068 }
6069 bool := v_2
6070 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
6071 continue
6072 }
6073 v.reset(OpAdd8)
6074 v0 := b.NewValue0(v.Pos, OpMul8, t)
6075 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
6076 v1.AddArg(bool)
6077 v0.AddArg2(c, v1)
6078 v.AddArg2(x, v0)
6079 return true
6080 }
6081 break
6082 }
6083
6084
6085
6086 for {
6087 op := v_0
6088 if op.Op != OpAdd64 {
6089 break
6090 }
6091 t := op.Type
6092 _ = op.Args[1]
6093 op_0 := op.Args[0]
6094 op_1 := op.Args[1]
6095 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6096 x := op_0
6097 c := op_1
6098 if c.Op != OpConst64 || x != v_1 {
6099 continue
6100 }
6101 bool := v_2
6102 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
6103 continue
6104 }
6105 v.reset(OpAdd64)
6106 v0 := b.NewValue0(v.Pos, OpMul64, t)
6107 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
6108 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6109 v2.AddArg(bool)
6110 v1.AddArg(v2)
6111 v0.AddArg2(c, v1)
6112 v.AddArg2(x, v0)
6113 return true
6114 }
6115 break
6116 }
6117
6118
6119
6120 for {
6121 op := v_0
6122 if op.Op != OpAdd32 {
6123 break
6124 }
6125 t := op.Type
6126 _ = op.Args[1]
6127 op_0 := op.Args[0]
6128 op_1 := op.Args[1]
6129 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6130 x := op_0
6131 c := op_1
6132 if c.Op != OpConst32 || x != v_1 {
6133 continue
6134 }
6135 bool := v_2
6136 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
6137 continue
6138 }
6139 v.reset(OpAdd32)
6140 v0 := b.NewValue0(v.Pos, OpMul32, t)
6141 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
6142 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6143 v2.AddArg(bool)
6144 v1.AddArg(v2)
6145 v0.AddArg2(c, v1)
6146 v.AddArg2(x, v0)
6147 return true
6148 }
6149 break
6150 }
6151
6152
6153
6154 for {
6155 op := v_0
6156 if op.Op != OpAdd16 {
6157 break
6158 }
6159 t := op.Type
6160 _ = op.Args[1]
6161 op_0 := op.Args[0]
6162 op_1 := op.Args[1]
6163 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6164 x := op_0
6165 c := op_1
6166 if c.Op != OpConst16 || x != v_1 {
6167 continue
6168 }
6169 bool := v_2
6170 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
6171 continue
6172 }
6173 v.reset(OpAdd16)
6174 v0 := b.NewValue0(v.Pos, OpMul16, t)
6175 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6176 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6177 v2.AddArg(bool)
6178 v1.AddArg(v2)
6179 v0.AddArg2(c, v1)
6180 v.AddArg2(x, v0)
6181 return true
6182 }
6183 break
6184 }
6185
6186
6187
6188 for {
6189 x := v_0
6190 op := v_1
6191 if op.Op != OpAdd8 {
6192 break
6193 }
6194 t := op.Type
6195 _ = op.Args[1]
6196 op_0 := op.Args[0]
6197 op_1 := op.Args[1]
6198 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6199 if x != op_0 {
6200 continue
6201 }
6202 c := op_1
6203 if c.Op != OpConst8 {
6204 continue
6205 }
6206 bool := v_2
6207 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
6208 continue
6209 }
6210 v.reset(OpAdd8)
6211 v0 := b.NewValue0(v.Pos, OpMul8, t)
6212 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
6213 v2 := b.NewValue0(v.Pos, OpNot, bool.Type)
6214 v2.AddArg(bool)
6215 v1.AddArg(v2)
6216 v0.AddArg2(c, v1)
6217 v.AddArg2(x, v0)
6218 return true
6219 }
6220 break
6221 }
6222
6223
6224
6225 for {
6226 x := v_0
6227 op := v_1
6228 if op.Op != OpAdd64 {
6229 break
6230 }
6231 t := op.Type
6232 _ = op.Args[1]
6233 op_0 := op.Args[0]
6234 op_1 := op.Args[1]
6235 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6236 if x != op_0 {
6237 continue
6238 }
6239 c := op_1
6240 if c.Op != OpConst64 {
6241 continue
6242 }
6243 bool := v_2
6244 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
6245 continue
6246 }
6247 v.reset(OpAdd64)
6248 v0 := b.NewValue0(v.Pos, OpMul64, t)
6249 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
6250 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6251 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
6252 v3.AddArg(bool)
6253 v2.AddArg(v3)
6254 v1.AddArg(v2)
6255 v0.AddArg2(c, v1)
6256 v.AddArg2(x, v0)
6257 return true
6258 }
6259 break
6260 }
6261
6262
6263
6264 for {
6265 x := v_0
6266 op := v_1
6267 if op.Op != OpAdd32 {
6268 break
6269 }
6270 t := op.Type
6271 _ = op.Args[1]
6272 op_0 := op.Args[0]
6273 op_1 := op.Args[1]
6274 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6275 if x != op_0 {
6276 continue
6277 }
6278 c := op_1
6279 if c.Op != OpConst32 {
6280 continue
6281 }
6282 bool := v_2
6283 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
6284 continue
6285 }
6286 v.reset(OpAdd32)
6287 v0 := b.NewValue0(v.Pos, OpMul32, t)
6288 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
6289 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6290 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
6291 v3.AddArg(bool)
6292 v2.AddArg(v3)
6293 v1.AddArg(v2)
6294 v0.AddArg2(c, v1)
6295 v.AddArg2(x, v0)
6296 return true
6297 }
6298 break
6299 }
6300
6301
6302
6303 for {
6304 x := v_0
6305 op := v_1
6306 if op.Op != OpAdd16 {
6307 break
6308 }
6309 t := op.Type
6310 _ = op.Args[1]
6311 op_0 := op.Args[0]
6312 op_1 := op.Args[1]
6313 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6314 if x != op_0 {
6315 continue
6316 }
6317 c := op_1
6318 if c.Op != OpConst16 {
6319 continue
6320 }
6321 bool := v_2
6322 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
6323 continue
6324 }
6325 v.reset(OpAdd16)
6326 v0 := b.NewValue0(v.Pos, OpMul16, t)
6327 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6328 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6329 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
6330 v3.AddArg(bool)
6331 v2.AddArg(v3)
6332 v1.AddArg(v2)
6333 v0.AddArg2(c, v1)
6334 v.AddArg2(x, v0)
6335 return true
6336 }
6337 break
6338 }
6339
6340
6341
6342 for {
6343 op := v_0
6344 if op.Op != OpAdd8 {
6345 break
6346 }
6347 t := op.Type
6348 _ = op.Args[1]
6349 op_0 := op.Args[0]
6350 op_1 := op.Args[1]
6351 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6352 x := op_0
6353 c := op_1
6354 if c.Op != OpConst8 {
6355 continue
6356 }
6357 consT := auxIntToInt8(c.AuxInt)
6358 if x != v_1 {
6359 continue
6360 }
6361 bool := v_2
6362 if !(!rewriteCondSelectIntoMath(config, op.Op, c.AuxInt) && rewriteCondSelectIntoMath(config, addToSub(op.Op), -c.AuxInt)) {
6363 continue
6364 }
6365 v.reset(OpSub8)
6366 v0 := b.NewValue0(v.Pos, OpMul8, t)
6367 v1 := b.NewValue0(v.Pos, OpConst8, t)
6368 v1.AuxInt = int8ToAuxInt(-consT)
6369 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
6370 v2.AddArg(bool)
6371 v0.AddArg2(v1, v2)
6372 v.AddArg2(x, v0)
6373 return true
6374 }
6375 break
6376 }
6377
6378
6379
6380 for {
6381 op := v_0
6382 if op.Op != OpAdd64 {
6383 break
6384 }
6385 t := op.Type
6386 _ = op.Args[1]
6387 op_0 := op.Args[0]
6388 op_1 := op.Args[1]
6389 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6390 x := op_0
6391 c := op_1
6392 if c.Op != OpConst64 {
6393 continue
6394 }
6395 consT := auxIntToInt64(c.AuxInt)
6396 if x != v_1 {
6397 continue
6398 }
6399 bool := v_2
6400 if !(!rewriteCondSelectIntoMath(config, op.Op, c.AuxInt) && rewriteCondSelectIntoMath(config, addToSub(op.Op), -c.AuxInt)) {
6401 continue
6402 }
6403 v.reset(OpSub64)
6404 v0 := b.NewValue0(v.Pos, OpMul64, t)
6405 v1 := b.NewValue0(v.Pos, OpConst64, t)
6406 v1.AuxInt = int64ToAuxInt(-consT)
6407 v2 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
6408 v3 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6409 v3.AddArg(bool)
6410 v2.AddArg(v3)
6411 v0.AddArg2(v1, v2)
6412 v.AddArg2(x, v0)
6413 return true
6414 }
6415 break
6416 }
6417
6418
6419
6420 for {
6421 op := v_0
6422 if op.Op != OpAdd32 {
6423 break
6424 }
6425 t := op.Type
6426 _ = op.Args[1]
6427 op_0 := op.Args[0]
6428 op_1 := op.Args[1]
6429 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6430 x := op_0
6431 c := op_1
6432 if c.Op != OpConst32 {
6433 continue
6434 }
6435 consT := auxIntToInt32(c.AuxInt)
6436 if x != v_1 {
6437 continue
6438 }
6439 bool := v_2
6440 if !(!rewriteCondSelectIntoMath(config, op.Op, c.AuxInt) && rewriteCondSelectIntoMath(config, addToSub(op.Op), -c.AuxInt)) {
6441 continue
6442 }
6443 v.reset(OpSub32)
6444 v0 := b.NewValue0(v.Pos, OpMul32, t)
6445 v1 := b.NewValue0(v.Pos, OpConst32, t)
6446 v1.AuxInt = int32ToAuxInt(-consT)
6447 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
6448 v3 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6449 v3.AddArg(bool)
6450 v2.AddArg(v3)
6451 v0.AddArg2(v1, v2)
6452 v.AddArg2(x, v0)
6453 return true
6454 }
6455 break
6456 }
6457
6458
6459
6460 for {
6461 op := v_0
6462 if op.Op != OpAdd16 {
6463 break
6464 }
6465 t := op.Type
6466 _ = op.Args[1]
6467 op_0 := op.Args[0]
6468 op_1 := op.Args[1]
6469 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6470 x := op_0
6471 c := op_1
6472 if c.Op != OpConst16 {
6473 continue
6474 }
6475 consT := auxIntToInt16(c.AuxInt)
6476 if x != v_1 {
6477 continue
6478 }
6479 bool := v_2
6480 if !(!rewriteCondSelectIntoMath(config, op.Op, c.AuxInt) && rewriteCondSelectIntoMath(config, addToSub(op.Op), -c.AuxInt)) {
6481 continue
6482 }
6483 v.reset(OpSub16)
6484 v0 := b.NewValue0(v.Pos, OpMul16, t)
6485 v1 := b.NewValue0(v.Pos, OpConst16, t)
6486 v1.AuxInt = int16ToAuxInt(-consT)
6487 v2 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6488 v3 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6489 v3.AddArg(bool)
6490 v2.AddArg(v3)
6491 v0.AddArg2(v1, v2)
6492 v.AddArg2(x, v0)
6493 return true
6494 }
6495 break
6496 }
6497
6498
6499
6500 for {
6501 x := v_0
6502 op := v_1
6503 if op.Op != OpAdd8 {
6504 break
6505 }
6506 t := op.Type
6507 _ = op.Args[1]
6508 op_0 := op.Args[0]
6509 op_1 := op.Args[1]
6510 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6511 if x != op_0 {
6512 continue
6513 }
6514 c := op_1
6515 if c.Op != OpConst8 {
6516 continue
6517 }
6518 consT := auxIntToInt8(c.AuxInt)
6519 bool := v_2
6520 if !(!rewriteCondSelectIntoMath(config, op.Op, c.AuxInt) && rewriteCondSelectIntoMath(config, addToSub(op.Op), -c.AuxInt)) {
6521 continue
6522 }
6523 v.reset(OpSub8)
6524 v0 := b.NewValue0(v.Pos, OpMul8, t)
6525 v1 := b.NewValue0(v.Pos, OpConst8, t)
6526 v1.AuxInt = int8ToAuxInt(-consT)
6527 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
6528 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
6529 v3.AddArg(bool)
6530 v2.AddArg(v3)
6531 v0.AddArg2(v1, v2)
6532 v.AddArg2(x, v0)
6533 return true
6534 }
6535 break
6536 }
6537
6538
6539
6540 for {
6541 x := v_0
6542 op := v_1
6543 if op.Op != OpAdd64 {
6544 break
6545 }
6546 t := op.Type
6547 _ = op.Args[1]
6548 op_0 := op.Args[0]
6549 op_1 := op.Args[1]
6550 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6551 if x != op_0 {
6552 continue
6553 }
6554 c := op_1
6555 if c.Op != OpConst64 {
6556 continue
6557 }
6558 consT := auxIntToInt64(c.AuxInt)
6559 bool := v_2
6560 if !(!rewriteCondSelectIntoMath(config, op.Op, c.AuxInt) && rewriteCondSelectIntoMath(config, addToSub(op.Op), -c.AuxInt)) {
6561 continue
6562 }
6563 v.reset(OpSub64)
6564 v0 := b.NewValue0(v.Pos, OpMul64, t)
6565 v1 := b.NewValue0(v.Pos, OpConst64, t)
6566 v1.AuxInt = int64ToAuxInt(-consT)
6567 v2 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
6568 v3 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6569 v4 := b.NewValue0(v.Pos, OpNot, bool.Type)
6570 v4.AddArg(bool)
6571 v3.AddArg(v4)
6572 v2.AddArg(v3)
6573 v0.AddArg2(v1, v2)
6574 v.AddArg2(x, v0)
6575 return true
6576 }
6577 break
6578 }
6579
6580
6581
6582 for {
6583 x := v_0
6584 op := v_1
6585 if op.Op != OpAdd32 {
6586 break
6587 }
6588 t := op.Type
6589 _ = op.Args[1]
6590 op_0 := op.Args[0]
6591 op_1 := op.Args[1]
6592 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6593 if x != op_0 {
6594 continue
6595 }
6596 c := op_1
6597 if c.Op != OpConst32 {
6598 continue
6599 }
6600 consT := auxIntToInt32(c.AuxInt)
6601 bool := v_2
6602 if !(!rewriteCondSelectIntoMath(config, op.Op, c.AuxInt) && rewriteCondSelectIntoMath(config, addToSub(op.Op), -c.AuxInt)) {
6603 continue
6604 }
6605 v.reset(OpSub32)
6606 v0 := b.NewValue0(v.Pos, OpMul32, t)
6607 v1 := b.NewValue0(v.Pos, OpConst32, t)
6608 v1.AuxInt = int32ToAuxInt(-consT)
6609 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
6610 v3 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6611 v4 := b.NewValue0(v.Pos, OpNot, bool.Type)
6612 v4.AddArg(bool)
6613 v3.AddArg(v4)
6614 v2.AddArg(v3)
6615 v0.AddArg2(v1, v2)
6616 v.AddArg2(x, v0)
6617 return true
6618 }
6619 break
6620 }
6621
6622
6623
6624 for {
6625 x := v_0
6626 op := v_1
6627 if op.Op != OpAdd16 {
6628 break
6629 }
6630 t := op.Type
6631 _ = op.Args[1]
6632 op_0 := op.Args[0]
6633 op_1 := op.Args[1]
6634 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
6635 if x != op_0 {
6636 continue
6637 }
6638 c := op_1
6639 if c.Op != OpConst16 {
6640 continue
6641 }
6642 consT := auxIntToInt16(c.AuxInt)
6643 bool := v_2
6644 if !(!rewriteCondSelectIntoMath(config, op.Op, c.AuxInt) && rewriteCondSelectIntoMath(config, addToSub(op.Op), -c.AuxInt)) {
6645 continue
6646 }
6647 v.reset(OpSub16)
6648 v0 := b.NewValue0(v.Pos, OpMul16, t)
6649 v1 := b.NewValue0(v.Pos, OpConst16, t)
6650 v1.AuxInt = int16ToAuxInt(-consT)
6651 v2 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6652 v3 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6653 v4 := b.NewValue0(v.Pos, OpNot, bool.Type)
6654 v4.AddArg(bool)
6655 v3.AddArg(v4)
6656 v2.AddArg(v3)
6657 v0.AddArg2(v1, v2)
6658 v.AddArg2(x, v0)
6659 return true
6660 }
6661 break
6662 }
6663
6664
6665 for {
6666 if v_0.Op != OpLsh64x64 {
6667 break
6668 }
6669 _ = v_0.Args[1]
6670 x := v_0.Args[0]
6671 v_0_1 := v_0.Args[1]
6672 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6673 break
6674 }
6675 bool := v_2
6676 v.reset(OpLsh64x8)
6677 v.AuxInt = boolToAuxInt(true)
6678 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6679 v0.AddArg(bool)
6680 v.AddArg2(x, v0)
6681 return true
6682 }
6683
6684
6685 for {
6686 if v_0.Op != OpLsh32x64 {
6687 break
6688 }
6689 _ = v_0.Args[1]
6690 x := v_0.Args[0]
6691 v_0_1 := v_0.Args[1]
6692 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6693 break
6694 }
6695 bool := v_2
6696 v.reset(OpLsh32x8)
6697 v.AuxInt = boolToAuxInt(true)
6698 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6699 v0.AddArg(bool)
6700 v.AddArg2(x, v0)
6701 return true
6702 }
6703
6704
6705 for {
6706 if v_0.Op != OpLsh16x64 {
6707 break
6708 }
6709 _ = v_0.Args[1]
6710 x := v_0.Args[0]
6711 v_0_1 := v_0.Args[1]
6712 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6713 break
6714 }
6715 bool := v_2
6716 v.reset(OpLsh16x8)
6717 v.AuxInt = boolToAuxInt(true)
6718 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6719 v0.AddArg(bool)
6720 v.AddArg2(x, v0)
6721 return true
6722 }
6723
6724
6725 for {
6726 if v_0.Op != OpLsh8x64 {
6727 break
6728 }
6729 _ = v_0.Args[1]
6730 x := v_0.Args[0]
6731 v_0_1 := v_0.Args[1]
6732 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6733 break
6734 }
6735 bool := v_2
6736 v.reset(OpLsh8x8)
6737 v.AuxInt = boolToAuxInt(true)
6738 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6739 v0.AddArg(bool)
6740 v.AddArg2(x, v0)
6741 return true
6742 }
6743
6744
6745 for {
6746 x := v_0
6747 if v_1.Op != OpLsh64x64 {
6748 break
6749 }
6750 _ = v_1.Args[1]
6751 if x != v_1.Args[0] {
6752 break
6753 }
6754 v_1_1 := v_1.Args[1]
6755 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6756 break
6757 }
6758 bool := v_2
6759 v.reset(OpLsh64x8)
6760 v.AuxInt = boolToAuxInt(true)
6761 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6762 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6763 v1.AddArg(bool)
6764 v0.AddArg(v1)
6765 v.AddArg2(x, v0)
6766 return true
6767 }
6768
6769
6770 for {
6771 x := v_0
6772 if v_1.Op != OpLsh32x64 {
6773 break
6774 }
6775 _ = v_1.Args[1]
6776 if x != v_1.Args[0] {
6777 break
6778 }
6779 v_1_1 := v_1.Args[1]
6780 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6781 break
6782 }
6783 bool := v_2
6784 v.reset(OpLsh32x8)
6785 v.AuxInt = boolToAuxInt(true)
6786 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6787 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6788 v1.AddArg(bool)
6789 v0.AddArg(v1)
6790 v.AddArg2(x, v0)
6791 return true
6792 }
6793
6794
6795 for {
6796 x := v_0
6797 if v_1.Op != OpLsh16x64 {
6798 break
6799 }
6800 _ = v_1.Args[1]
6801 if x != v_1.Args[0] {
6802 break
6803 }
6804 v_1_1 := v_1.Args[1]
6805 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6806 break
6807 }
6808 bool := v_2
6809 v.reset(OpLsh16x8)
6810 v.AuxInt = boolToAuxInt(true)
6811 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6812 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6813 v1.AddArg(bool)
6814 v0.AddArg(v1)
6815 v.AddArg2(x, v0)
6816 return true
6817 }
6818
6819
6820 for {
6821 x := v_0
6822 if v_1.Op != OpLsh8x64 {
6823 break
6824 }
6825 _ = v_1.Args[1]
6826 if x != v_1.Args[0] {
6827 break
6828 }
6829 v_1_1 := v_1.Args[1]
6830 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
6831 break
6832 }
6833 bool := v_2
6834 v.reset(OpLsh8x8)
6835 v.AuxInt = boolToAuxInt(true)
6836 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6837 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
6838 v1.AddArg(bool)
6839 v0.AddArg(v1)
6840 v.AddArg2(x, v0)
6841 return true
6842 }
6843
6844
6845 for {
6846 if v_0.Op != OpRsh64x64 {
6847 break
6848 }
6849 _ = v_0.Args[1]
6850 x := v_0.Args[0]
6851 v_0_1 := v_0.Args[1]
6852 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6853 break
6854 }
6855 bool := v_2
6856 v.reset(OpRsh64x8)
6857 v.AuxInt = boolToAuxInt(true)
6858 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6859 v0.AddArg(bool)
6860 v.AddArg2(x, v0)
6861 return true
6862 }
6863
6864
6865 for {
6866 if v_0.Op != OpRsh32x64 {
6867 break
6868 }
6869 _ = v_0.Args[1]
6870 x := v_0.Args[0]
6871 v_0_1 := v_0.Args[1]
6872 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6873 break
6874 }
6875 bool := v_2
6876 v.reset(OpRsh32x8)
6877 v.AuxInt = boolToAuxInt(true)
6878 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6879 v0.AddArg(bool)
6880 v.AddArg2(x, v0)
6881 return true
6882 }
6883
6884
6885 for {
6886 if v_0.Op != OpRsh16x64 {
6887 break
6888 }
6889 _ = v_0.Args[1]
6890 x := v_0.Args[0]
6891 v_0_1 := v_0.Args[1]
6892 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6893 break
6894 }
6895 bool := v_2
6896 v.reset(OpRsh16x8)
6897 v.AuxInt = boolToAuxInt(true)
6898 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6899 v0.AddArg(bool)
6900 v.AddArg2(x, v0)
6901 return true
6902 }
6903
6904
6905 for {
6906 if v_0.Op != OpRsh8x64 {
6907 break
6908 }
6909 _ = v_0.Args[1]
6910 x := v_0.Args[0]
6911 v_0_1 := v_0.Args[1]
6912 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6913 break
6914 }
6915 bool := v_2
6916 v.reset(OpRsh8x8)
6917 v.AuxInt = boolToAuxInt(true)
6918 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6919 v0.AddArg(bool)
6920 v.AddArg2(x, v0)
6921 return true
6922 }
6923
6924
6925 for {
6926 if v_0.Op != OpRsh64Ux64 {
6927 break
6928 }
6929 _ = v_0.Args[1]
6930 x := v_0.Args[0]
6931 v_0_1 := v_0.Args[1]
6932 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6933 break
6934 }
6935 bool := v_2
6936 v.reset(OpRsh64Ux8)
6937 v.AuxInt = boolToAuxInt(true)
6938 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6939 v0.AddArg(bool)
6940 v.AddArg2(x, v0)
6941 return true
6942 }
6943
6944
6945 for {
6946 if v_0.Op != OpRsh32Ux64 {
6947 break
6948 }
6949 _ = v_0.Args[1]
6950 x := v_0.Args[0]
6951 v_0_1 := v_0.Args[1]
6952 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6953 break
6954 }
6955 bool := v_2
6956 v.reset(OpRsh32Ux8)
6957 v.AuxInt = boolToAuxInt(true)
6958 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6959 v0.AddArg(bool)
6960 v.AddArg2(x, v0)
6961 return true
6962 }
6963
6964
6965 for {
6966 if v_0.Op != OpRsh16Ux64 {
6967 break
6968 }
6969 _ = v_0.Args[1]
6970 x := v_0.Args[0]
6971 v_0_1 := v_0.Args[1]
6972 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6973 break
6974 }
6975 bool := v_2
6976 v.reset(OpRsh16Ux8)
6977 v.AuxInt = boolToAuxInt(true)
6978 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6979 v0.AddArg(bool)
6980 v.AddArg2(x, v0)
6981 return true
6982 }
6983
6984
6985 for {
6986 if v_0.Op != OpRsh8Ux64 {
6987 break
6988 }
6989 _ = v_0.Args[1]
6990 x := v_0.Args[0]
6991 v_0_1 := v_0.Args[1]
6992 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6993 break
6994 }
6995 bool := v_2
6996 v.reset(OpRsh8Ux8)
6997 v.AuxInt = boolToAuxInt(true)
6998 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6999 v0.AddArg(bool)
7000 v.AddArg2(x, v0)
7001 return true
7002 }
7003
7004
7005 for {
7006 x := v_0
7007 if v_1.Op != OpRsh64x64 {
7008 break
7009 }
7010 _ = v_1.Args[1]
7011 if x != v_1.Args[0] {
7012 break
7013 }
7014 v_1_1 := v_1.Args[1]
7015 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
7016 break
7017 }
7018 bool := v_2
7019 v.reset(OpRsh64x8)
7020 v.AuxInt = boolToAuxInt(true)
7021 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7022 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
7023 v1.AddArg(bool)
7024 v0.AddArg(v1)
7025 v.AddArg2(x, v0)
7026 return true
7027 }
7028
7029
7030 for {
7031 x := v_0
7032 if v_1.Op != OpRsh32x64 {
7033 break
7034 }
7035 _ = v_1.Args[1]
7036 if x != v_1.Args[0] {
7037 break
7038 }
7039 v_1_1 := v_1.Args[1]
7040 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
7041 break
7042 }
7043 bool := v_2
7044 v.reset(OpRsh32x8)
7045 v.AuxInt = boolToAuxInt(true)
7046 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7047 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
7048 v1.AddArg(bool)
7049 v0.AddArg(v1)
7050 v.AddArg2(x, v0)
7051 return true
7052 }
7053
7054
7055 for {
7056 x := v_0
7057 if v_1.Op != OpRsh16x64 {
7058 break
7059 }
7060 _ = v_1.Args[1]
7061 if x != v_1.Args[0] {
7062 break
7063 }
7064 v_1_1 := v_1.Args[1]
7065 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
7066 break
7067 }
7068 bool := v_2
7069 v.reset(OpRsh16x8)
7070 v.AuxInt = boolToAuxInt(true)
7071 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7072 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
7073 v1.AddArg(bool)
7074 v0.AddArg(v1)
7075 v.AddArg2(x, v0)
7076 return true
7077 }
7078
7079
7080 for {
7081 x := v_0
7082 if v_1.Op != OpRsh8x64 {
7083 break
7084 }
7085 _ = v_1.Args[1]
7086 if x != v_1.Args[0] {
7087 break
7088 }
7089 v_1_1 := v_1.Args[1]
7090 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
7091 break
7092 }
7093 bool := v_2
7094 v.reset(OpRsh8x8)
7095 v.AuxInt = boolToAuxInt(true)
7096 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7097 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
7098 v1.AddArg(bool)
7099 v0.AddArg(v1)
7100 v.AddArg2(x, v0)
7101 return true
7102 }
7103
7104
7105 for {
7106 x := v_0
7107 if v_1.Op != OpRsh64Ux64 {
7108 break
7109 }
7110 _ = v_1.Args[1]
7111 if x != v_1.Args[0] {
7112 break
7113 }
7114 v_1_1 := v_1.Args[1]
7115 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
7116 break
7117 }
7118 bool := v_2
7119 v.reset(OpRsh64Ux8)
7120 v.AuxInt = boolToAuxInt(true)
7121 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7122 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
7123 v1.AddArg(bool)
7124 v0.AddArg(v1)
7125 v.AddArg2(x, v0)
7126 return true
7127 }
7128
7129
7130 for {
7131 x := v_0
7132 if v_1.Op != OpRsh32Ux64 {
7133 break
7134 }
7135 _ = v_1.Args[1]
7136 if x != v_1.Args[0] {
7137 break
7138 }
7139 v_1_1 := v_1.Args[1]
7140 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
7141 break
7142 }
7143 bool := v_2
7144 v.reset(OpRsh32Ux8)
7145 v.AuxInt = boolToAuxInt(true)
7146 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7147 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
7148 v1.AddArg(bool)
7149 v0.AddArg(v1)
7150 v.AddArg2(x, v0)
7151 return true
7152 }
7153
7154
7155 for {
7156 x := v_0
7157 if v_1.Op != OpRsh16Ux64 {
7158 break
7159 }
7160 _ = v_1.Args[1]
7161 if x != v_1.Args[0] {
7162 break
7163 }
7164 v_1_1 := v_1.Args[1]
7165 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
7166 break
7167 }
7168 bool := v_2
7169 v.reset(OpRsh16Ux8)
7170 v.AuxInt = boolToAuxInt(true)
7171 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7172 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
7173 v1.AddArg(bool)
7174 v0.AddArg(v1)
7175 v.AddArg2(x, v0)
7176 return true
7177 }
7178
7179
7180 for {
7181 x := v_0
7182 if v_1.Op != OpRsh8Ux64 {
7183 break
7184 }
7185 _ = v_1.Args[1]
7186 if x != v_1.Args[0] {
7187 break
7188 }
7189 v_1_1 := v_1.Args[1]
7190 if v_1_1.Op != OpConst64 || auxIntToInt64(v_1_1.AuxInt) != 1 {
7191 break
7192 }
7193 bool := v_2
7194 v.reset(OpRsh8Ux8)
7195 v.AuxInt = boolToAuxInt(true)
7196 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7197 v1 := b.NewValue0(v.Pos, OpNot, bool.Type)
7198 v1.AddArg(bool)
7199 v0.AddArg(v1)
7200 v.AddArg2(x, v0)
7201 return true
7202 }
7203
7204
7205
7206 for {
7207 op := v_0
7208 if op.Op != OpOr8 {
7209 break
7210 }
7211 t := op.Type
7212 _ = op.Args[1]
7213 op_0 := op.Args[0]
7214 op_1 := op.Args[1]
7215 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7216 x := op_0
7217 c := op_1
7218 if c.Op != OpConst8 || x != v_1 {
7219 continue
7220 }
7221 bool := v_2
7222 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7223 continue
7224 }
7225 v.reset(OpOr8)
7226 v0 := b.NewValue0(v.Pos, OpMul8, t)
7227 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
7228 v1.AddArg(bool)
7229 v0.AddArg2(c, v1)
7230 v.AddArg2(x, v0)
7231 return true
7232 }
7233 break
7234 }
7235
7236
7237
7238 for {
7239 op := v_0
7240 if op.Op != OpOr64 {
7241 break
7242 }
7243 t := op.Type
7244 _ = op.Args[1]
7245 op_0 := op.Args[0]
7246 op_1 := op.Args[1]
7247 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7248 x := op_0
7249 c := op_1
7250 if c.Op != OpConst64 || x != v_1 {
7251 continue
7252 }
7253 bool := v_2
7254 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7255 continue
7256 }
7257 v.reset(OpOr64)
7258 v0 := b.NewValue0(v.Pos, OpMul64, t)
7259 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
7260 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7261 v2.AddArg(bool)
7262 v1.AddArg(v2)
7263 v0.AddArg2(c, v1)
7264 v.AddArg2(x, v0)
7265 return true
7266 }
7267 break
7268 }
7269
7270
7271
7272 for {
7273 op := v_0
7274 if op.Op != OpOr32 {
7275 break
7276 }
7277 t := op.Type
7278 _ = op.Args[1]
7279 op_0 := op.Args[0]
7280 op_1 := op.Args[1]
7281 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7282 x := op_0
7283 c := op_1
7284 if c.Op != OpConst32 || x != v_1 {
7285 continue
7286 }
7287 bool := v_2
7288 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7289 continue
7290 }
7291 v.reset(OpOr32)
7292 v0 := b.NewValue0(v.Pos, OpMul32, t)
7293 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
7294 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7295 v2.AddArg(bool)
7296 v1.AddArg(v2)
7297 v0.AddArg2(c, v1)
7298 v.AddArg2(x, v0)
7299 return true
7300 }
7301 break
7302 }
7303
7304
7305
7306 for {
7307 op := v_0
7308 if op.Op != OpOr16 {
7309 break
7310 }
7311 t := op.Type
7312 _ = op.Args[1]
7313 op_0 := op.Args[0]
7314 op_1 := op.Args[1]
7315 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7316 x := op_0
7317 c := op_1
7318 if c.Op != OpConst16 || x != v_1 {
7319 continue
7320 }
7321 bool := v_2
7322 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7323 continue
7324 }
7325 v.reset(OpOr16)
7326 v0 := b.NewValue0(v.Pos, OpMul16, t)
7327 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
7328 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7329 v2.AddArg(bool)
7330 v1.AddArg(v2)
7331 v0.AddArg2(c, v1)
7332 v.AddArg2(x, v0)
7333 return true
7334 }
7335 break
7336 }
7337
7338
7339
7340 for {
7341 x := v_0
7342 op := v_1
7343 if op.Op != OpOr8 {
7344 break
7345 }
7346 t := op.Type
7347 _ = op.Args[1]
7348 op_0 := op.Args[0]
7349 op_1 := op.Args[1]
7350 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7351 if x != op_0 {
7352 continue
7353 }
7354 c := op_1
7355 if c.Op != OpConst8 {
7356 continue
7357 }
7358 bool := v_2
7359 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7360 continue
7361 }
7362 v.reset(OpOr8)
7363 v0 := b.NewValue0(v.Pos, OpMul8, t)
7364 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
7365 v2 := b.NewValue0(v.Pos, OpNot, bool.Type)
7366 v2.AddArg(bool)
7367 v1.AddArg(v2)
7368 v0.AddArg2(c, v1)
7369 v.AddArg2(x, v0)
7370 return true
7371 }
7372 break
7373 }
7374
7375
7376
7377 for {
7378 x := v_0
7379 op := v_1
7380 if op.Op != OpOr64 {
7381 break
7382 }
7383 t := op.Type
7384 _ = op.Args[1]
7385 op_0 := op.Args[0]
7386 op_1 := op.Args[1]
7387 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7388 if x != op_0 {
7389 continue
7390 }
7391 c := op_1
7392 if c.Op != OpConst64 {
7393 continue
7394 }
7395 bool := v_2
7396 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7397 continue
7398 }
7399 v.reset(OpOr64)
7400 v0 := b.NewValue0(v.Pos, OpMul64, t)
7401 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
7402 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7403 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
7404 v3.AddArg(bool)
7405 v2.AddArg(v3)
7406 v1.AddArg(v2)
7407 v0.AddArg2(c, v1)
7408 v.AddArg2(x, v0)
7409 return true
7410 }
7411 break
7412 }
7413
7414
7415
7416 for {
7417 x := v_0
7418 op := v_1
7419 if op.Op != OpOr32 {
7420 break
7421 }
7422 t := op.Type
7423 _ = op.Args[1]
7424 op_0 := op.Args[0]
7425 op_1 := op.Args[1]
7426 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7427 if x != op_0 {
7428 continue
7429 }
7430 c := op_1
7431 if c.Op != OpConst32 {
7432 continue
7433 }
7434 bool := v_2
7435 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7436 continue
7437 }
7438 v.reset(OpOr32)
7439 v0 := b.NewValue0(v.Pos, OpMul32, t)
7440 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
7441 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7442 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
7443 v3.AddArg(bool)
7444 v2.AddArg(v3)
7445 v1.AddArg(v2)
7446 v0.AddArg2(c, v1)
7447 v.AddArg2(x, v0)
7448 return true
7449 }
7450 break
7451 }
7452
7453
7454
7455 for {
7456 x := v_0
7457 op := v_1
7458 if op.Op != OpOr16 {
7459 break
7460 }
7461 t := op.Type
7462 _ = op.Args[1]
7463 op_0 := op.Args[0]
7464 op_1 := op.Args[1]
7465 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7466 if x != op_0 {
7467 continue
7468 }
7469 c := op_1
7470 if c.Op != OpConst16 {
7471 continue
7472 }
7473 bool := v_2
7474 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7475 continue
7476 }
7477 v.reset(OpOr16)
7478 v0 := b.NewValue0(v.Pos, OpMul16, t)
7479 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
7480 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7481 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
7482 v3.AddArg(bool)
7483 v2.AddArg(v3)
7484 v1.AddArg(v2)
7485 v0.AddArg2(c, v1)
7486 v.AddArg2(x, v0)
7487 return true
7488 }
7489 break
7490 }
7491
7492
7493
7494 for {
7495 op := v_0
7496 if op.Op != OpXor8 {
7497 break
7498 }
7499 t := op.Type
7500 _ = op.Args[1]
7501 op_0 := op.Args[0]
7502 op_1 := op.Args[1]
7503 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7504 x := op_0
7505 c := op_1
7506 if c.Op != OpConst8 || x != v_1 {
7507 continue
7508 }
7509 bool := v_2
7510 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7511 continue
7512 }
7513 v.reset(OpXor8)
7514 v0 := b.NewValue0(v.Pos, OpMul8, t)
7515 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
7516 v1.AddArg(bool)
7517 v0.AddArg2(c, v1)
7518 v.AddArg2(x, v0)
7519 return true
7520 }
7521 break
7522 }
7523
7524
7525
7526 for {
7527 op := v_0
7528 if op.Op != OpXor64 {
7529 break
7530 }
7531 t := op.Type
7532 _ = op.Args[1]
7533 op_0 := op.Args[0]
7534 op_1 := op.Args[1]
7535 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7536 x := op_0
7537 c := op_1
7538 if c.Op != OpConst64 || x != v_1 {
7539 continue
7540 }
7541 bool := v_2
7542 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7543 continue
7544 }
7545 v.reset(OpXor64)
7546 v0 := b.NewValue0(v.Pos, OpMul64, t)
7547 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
7548 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7549 v2.AddArg(bool)
7550 v1.AddArg(v2)
7551 v0.AddArg2(c, v1)
7552 v.AddArg2(x, v0)
7553 return true
7554 }
7555 break
7556 }
7557
7558
7559
7560 for {
7561 op := v_0
7562 if op.Op != OpXor32 {
7563 break
7564 }
7565 t := op.Type
7566 _ = op.Args[1]
7567 op_0 := op.Args[0]
7568 op_1 := op.Args[1]
7569 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7570 x := op_0
7571 c := op_1
7572 if c.Op != OpConst32 || x != v_1 {
7573 continue
7574 }
7575 bool := v_2
7576 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7577 continue
7578 }
7579 v.reset(OpXor32)
7580 v0 := b.NewValue0(v.Pos, OpMul32, t)
7581 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
7582 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7583 v2.AddArg(bool)
7584 v1.AddArg(v2)
7585 v0.AddArg2(c, v1)
7586 v.AddArg2(x, v0)
7587 return true
7588 }
7589 break
7590 }
7591
7592
7593
7594 for {
7595 op := v_0
7596 if op.Op != OpXor16 {
7597 break
7598 }
7599 t := op.Type
7600 _ = op.Args[1]
7601 op_0 := op.Args[0]
7602 op_1 := op.Args[1]
7603 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7604 x := op_0
7605 c := op_1
7606 if c.Op != OpConst16 || x != v_1 {
7607 continue
7608 }
7609 bool := v_2
7610 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7611 continue
7612 }
7613 v.reset(OpXor16)
7614 v0 := b.NewValue0(v.Pos, OpMul16, t)
7615 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
7616 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7617 v2.AddArg(bool)
7618 v1.AddArg(v2)
7619 v0.AddArg2(c, v1)
7620 v.AddArg2(x, v0)
7621 return true
7622 }
7623 break
7624 }
7625
7626
7627
7628 for {
7629 x := v_0
7630 op := v_1
7631 if op.Op != OpXor8 {
7632 break
7633 }
7634 t := op.Type
7635 _ = op.Args[1]
7636 op_0 := op.Args[0]
7637 op_1 := op.Args[1]
7638 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7639 if x != op_0 {
7640 continue
7641 }
7642 c := op_1
7643 if c.Op != OpConst8 {
7644 continue
7645 }
7646 bool := v_2
7647 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7648 continue
7649 }
7650 v.reset(OpXor8)
7651 v0 := b.NewValue0(v.Pos, OpMul8, t)
7652 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
7653 v2 := b.NewValue0(v.Pos, OpNot, bool.Type)
7654 v2.AddArg(bool)
7655 v1.AddArg(v2)
7656 v0.AddArg2(c, v1)
7657 v.AddArg2(x, v0)
7658 return true
7659 }
7660 break
7661 }
7662
7663
7664
7665 for {
7666 x := v_0
7667 op := v_1
7668 if op.Op != OpXor64 {
7669 break
7670 }
7671 t := op.Type
7672 _ = op.Args[1]
7673 op_0 := op.Args[0]
7674 op_1 := op.Args[1]
7675 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7676 if x != op_0 {
7677 continue
7678 }
7679 c := op_1
7680 if c.Op != OpConst64 {
7681 continue
7682 }
7683 bool := v_2
7684 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7685 continue
7686 }
7687 v.reset(OpXor64)
7688 v0 := b.NewValue0(v.Pos, OpMul64, t)
7689 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
7690 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7691 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
7692 v3.AddArg(bool)
7693 v2.AddArg(v3)
7694 v1.AddArg(v2)
7695 v0.AddArg2(c, v1)
7696 v.AddArg2(x, v0)
7697 return true
7698 }
7699 break
7700 }
7701
7702
7703
7704 for {
7705 x := v_0
7706 op := v_1
7707 if op.Op != OpXor32 {
7708 break
7709 }
7710 t := op.Type
7711 _ = op.Args[1]
7712 op_0 := op.Args[0]
7713 op_1 := op.Args[1]
7714 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7715 if x != op_0 {
7716 continue
7717 }
7718 c := op_1
7719 if c.Op != OpConst32 {
7720 continue
7721 }
7722 bool := v_2
7723 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7724 continue
7725 }
7726 v.reset(OpXor32)
7727 v0 := b.NewValue0(v.Pos, OpMul32, t)
7728 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
7729 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7730 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
7731 v3.AddArg(bool)
7732 v2.AddArg(v3)
7733 v1.AddArg(v2)
7734 v0.AddArg2(c, v1)
7735 v.AddArg2(x, v0)
7736 return true
7737 }
7738 break
7739 }
7740
7741
7742
7743 for {
7744 x := v_0
7745 op := v_1
7746 if op.Op != OpXor16 {
7747 break
7748 }
7749 t := op.Type
7750 _ = op.Args[1]
7751 op_0 := op.Args[0]
7752 op_1 := op.Args[1]
7753 for _i0 := 0; _i0 <= 1; _i0, op_0, op_1 = _i0+1, op_1, op_0 {
7754 if x != op_0 {
7755 continue
7756 }
7757 c := op_1
7758 if c.Op != OpConst16 {
7759 continue
7760 }
7761 bool := v_2
7762 if !(rewriteCondSelectIntoMath(config, op.Op, c.AuxInt)) {
7763 continue
7764 }
7765 v.reset(OpXor16)
7766 v0 := b.NewValue0(v.Pos, OpMul16, t)
7767 v1 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
7768 v2 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
7769 v3 := b.NewValue0(v.Pos, OpNot, bool.Type)
7770 v3.AddArg(bool)
7771 v2.AddArg(v3)
7772 v1.AddArg(v2)
7773 v0.AddArg2(c, v1)
7774 v.AddArg2(x, v0)
7775 return true
7776 }
7777 break
7778 }
7779 return false
7780 }
7781 func rewriteValuegeneric_OpConstInterface(v *Value) bool {
7782 b := v.Block
7783 typ := &b.Func.Config.Types
7784
7785
7786 for {
7787 v.reset(OpIMake)
7788 v0 := b.NewValue0(v.Pos, OpConstNil, typ.Uintptr)
7789 v1 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
7790 v.AddArg2(v0, v1)
7791 return true
7792 }
7793 }
7794 func rewriteValuegeneric_OpConstSlice(v *Value) bool {
7795 b := v.Block
7796 config := b.Func.Config
7797 typ := &b.Func.Config.Types
7798
7799
7800
7801 for {
7802 if !(config.PtrSize == 4) {
7803 break
7804 }
7805 v.reset(OpSliceMake)
7806 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo())
7807 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
7808 v1.AuxInt = int32ToAuxInt(0)
7809 v.AddArg3(v0, v1, v1)
7810 return true
7811 }
7812
7813
7814
7815 for {
7816 if !(config.PtrSize == 8) {
7817 break
7818 }
7819 v.reset(OpSliceMake)
7820 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo())
7821 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
7822 v1.AuxInt = int64ToAuxInt(0)
7823 v.AddArg3(v0, v1, v1)
7824 return true
7825 }
7826 return false
7827 }
7828 func rewriteValuegeneric_OpConstString(v *Value) bool {
7829 b := v.Block
7830 config := b.Func.Config
7831 fe := b.Func.fe
7832 typ := &b.Func.Config.Types
7833
7834
7835
7836 for {
7837 str := auxToString(v.Aux)
7838 if !(config.PtrSize == 4 && str == "") {
7839 break
7840 }
7841 v.reset(OpStringMake)
7842 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
7843 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
7844 v1.AuxInt = int32ToAuxInt(0)
7845 v.AddArg2(v0, v1)
7846 return true
7847 }
7848
7849
7850
7851 for {
7852 str := auxToString(v.Aux)
7853 if !(config.PtrSize == 8 && str == "") {
7854 break
7855 }
7856 v.reset(OpStringMake)
7857 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
7858 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
7859 v1.AuxInt = int64ToAuxInt(0)
7860 v.AddArg2(v0, v1)
7861 return true
7862 }
7863
7864
7865
7866 for {
7867 str := auxToString(v.Aux)
7868 if !(config.PtrSize == 4 && str != "") {
7869 break
7870 }
7871 v.reset(OpStringMake)
7872 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr)
7873 v0.Aux = symToAux(fe.StringData(str))
7874 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
7875 v0.AddArg(v1)
7876 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int)
7877 v2.AuxInt = int32ToAuxInt(int32(len(str)))
7878 v.AddArg2(v0, v2)
7879 return true
7880 }
7881
7882
7883
7884 for {
7885 str := auxToString(v.Aux)
7886 if !(config.PtrSize == 8 && str != "") {
7887 break
7888 }
7889 v.reset(OpStringMake)
7890 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr)
7891 v0.Aux = symToAux(fe.StringData(str))
7892 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
7893 v0.AddArg(v1)
7894 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int)
7895 v2.AuxInt = int64ToAuxInt(int64(len(str)))
7896 v.AddArg2(v0, v2)
7897 return true
7898 }
7899 return false
7900 }
7901 func rewriteValuegeneric_OpConvert(v *Value) bool {
7902 v_1 := v.Args[1]
7903 v_0 := v.Args[0]
7904 b := v.Block
7905
7906
7907 for {
7908 if v_0.Op != OpAdd64 {
7909 break
7910 }
7911 _ = v_0.Args[1]
7912 v_0_0 := v_0.Args[0]
7913 v_0_1 := v_0.Args[1]
7914 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
7915 if v_0_0.Op != OpConvert {
7916 continue
7917 }
7918 mem := v_0_0.Args[1]
7919 ptr := v_0_0.Args[0]
7920 off := v_0_1
7921 if mem != v_1 {
7922 continue
7923 }
7924 v.reset(OpAddPtr)
7925 v.AddArg2(ptr, off)
7926 return true
7927 }
7928 break
7929 }
7930
7931
7932 for {
7933 if v_0.Op != OpAdd32 {
7934 break
7935 }
7936 _ = v_0.Args[1]
7937 v_0_0 := v_0.Args[0]
7938 v_0_1 := v_0.Args[1]
7939 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
7940 if v_0_0.Op != OpConvert {
7941 continue
7942 }
7943 mem := v_0_0.Args[1]
7944 ptr := v_0_0.Args[0]
7945 off := v_0_1
7946 if mem != v_1 {
7947 continue
7948 }
7949 v.reset(OpAddPtr)
7950 v.AddArg2(ptr, off)
7951 return true
7952 }
7953 break
7954 }
7955
7956
7957 for {
7958 if v_0.Op != OpConvert {
7959 break
7960 }
7961 mem := v_0.Args[1]
7962 ptr := v_0.Args[0]
7963 if mem != v_1 {
7964 break
7965 }
7966 v.copyOf(ptr)
7967 return true
7968 }
7969
7970
7971 for {
7972 a := v_0
7973 if a.Op != OpAdd64 {
7974 break
7975 }
7976 _ = a.Args[1]
7977 a_0 := a.Args[0]
7978 a_1 := a.Args[1]
7979 for _i0 := 0; _i0 <= 1; _i0, a_0, a_1 = _i0+1, a_1, a_0 {
7980 if a_0.Op != OpAdd64 {
7981 continue
7982 }
7983 _ = a_0.Args[1]
7984 a_0_0 := a_0.Args[0]
7985 a_0_1 := a_0.Args[1]
7986 for _i1 := 0; _i1 <= 1; _i1, a_0_0, a_0_1 = _i1+1, a_0_1, a_0_0 {
7987 if a_0_0.Op != OpConvert {
7988 continue
7989 }
7990 mem := a_0_0.Args[1]
7991 ptr := a_0_0.Args[0]
7992 off1 := a_0_1
7993 off2 := a_1
7994 if mem != v_1 {
7995 continue
7996 }
7997 v.reset(OpAddPtr)
7998 v0 := b.NewValue0(v.Pos, OpAdd64, a.Type)
7999 v0.AddArg2(off1, off2)
8000 v.AddArg2(ptr, v0)
8001 return true
8002 }
8003 }
8004 break
8005 }
8006
8007
8008 for {
8009 a := v_0
8010 if a.Op != OpAdd32 {
8011 break
8012 }
8013 _ = a.Args[1]
8014 a_0 := a.Args[0]
8015 a_1 := a.Args[1]
8016 for _i0 := 0; _i0 <= 1; _i0, a_0, a_1 = _i0+1, a_1, a_0 {
8017 if a_0.Op != OpAdd32 {
8018 continue
8019 }
8020 _ = a_0.Args[1]
8021 a_0_0 := a_0.Args[0]
8022 a_0_1 := a_0.Args[1]
8023 for _i1 := 0; _i1 <= 1; _i1, a_0_0, a_0_1 = _i1+1, a_0_1, a_0_0 {
8024 if a_0_0.Op != OpConvert {
8025 continue
8026 }
8027 mem := a_0_0.Args[1]
8028 ptr := a_0_0.Args[0]
8029 off1 := a_0_1
8030 off2 := a_1
8031 if mem != v_1 {
8032 continue
8033 }
8034 v.reset(OpAddPtr)
8035 v0 := b.NewValue0(v.Pos, OpAdd32, a.Type)
8036 v0.AddArg2(off1, off2)
8037 v.AddArg2(ptr, v0)
8038 return true
8039 }
8040 }
8041 break
8042 }
8043 return false
8044 }
8045 func rewriteValuegeneric_OpCtz16(v *Value) bool {
8046 v_0 := v.Args[0]
8047 b := v.Block
8048 config := b.Func.Config
8049
8050
8051
8052 for {
8053 if v_0.Op != OpConst16 {
8054 break
8055 }
8056 c := auxIntToInt16(v_0.AuxInt)
8057 if !(config.PtrSize == 4) {
8058 break
8059 }
8060 v.reset(OpConst32)
8061 v.AuxInt = int32ToAuxInt(int32(ntz16(c)))
8062 return true
8063 }
8064
8065
8066
8067 for {
8068 if v_0.Op != OpConst16 {
8069 break
8070 }
8071 c := auxIntToInt16(v_0.AuxInt)
8072 if !(config.PtrSize == 8) {
8073 break
8074 }
8075 v.reset(OpConst64)
8076 v.AuxInt = int64ToAuxInt(int64(ntz16(c)))
8077 return true
8078 }
8079 return false
8080 }
8081 func rewriteValuegeneric_OpCtz32(v *Value) bool {
8082 v_0 := v.Args[0]
8083 b := v.Block
8084 config := b.Func.Config
8085
8086
8087
8088 for {
8089 if v_0.Op != OpConst32 {
8090 break
8091 }
8092 c := auxIntToInt32(v_0.AuxInt)
8093 if !(config.PtrSize == 4) {
8094 break
8095 }
8096 v.reset(OpConst32)
8097 v.AuxInt = int32ToAuxInt(int32(ntz32(c)))
8098 return true
8099 }
8100
8101
8102
8103 for {
8104 if v_0.Op != OpConst32 {
8105 break
8106 }
8107 c := auxIntToInt32(v_0.AuxInt)
8108 if !(config.PtrSize == 8) {
8109 break
8110 }
8111 v.reset(OpConst64)
8112 v.AuxInt = int64ToAuxInt(int64(ntz32(c)))
8113 return true
8114 }
8115 return false
8116 }
8117 func rewriteValuegeneric_OpCtz64(v *Value) bool {
8118 v_0 := v.Args[0]
8119 b := v.Block
8120 config := b.Func.Config
8121
8122
8123
8124 for {
8125 if v_0.Op != OpConst64 {
8126 break
8127 }
8128 c := auxIntToInt64(v_0.AuxInt)
8129 if !(config.PtrSize == 4) {
8130 break
8131 }
8132 v.reset(OpConst32)
8133 v.AuxInt = int32ToAuxInt(int32(ntz64(c)))
8134 return true
8135 }
8136
8137
8138
8139 for {
8140 if v_0.Op != OpConst64 {
8141 break
8142 }
8143 c := auxIntToInt64(v_0.AuxInt)
8144 if !(config.PtrSize == 8) {
8145 break
8146 }
8147 v.reset(OpConst64)
8148 v.AuxInt = int64ToAuxInt(int64(ntz64(c)))
8149 return true
8150 }
8151 return false
8152 }
8153 func rewriteValuegeneric_OpCtz8(v *Value) bool {
8154 v_0 := v.Args[0]
8155 b := v.Block
8156 config := b.Func.Config
8157
8158
8159
8160 for {
8161 if v_0.Op != OpConst8 {
8162 break
8163 }
8164 c := auxIntToInt8(v_0.AuxInt)
8165 if !(config.PtrSize == 4) {
8166 break
8167 }
8168 v.reset(OpConst32)
8169 v.AuxInt = int32ToAuxInt(int32(ntz8(c)))
8170 return true
8171 }
8172
8173
8174
8175 for {
8176 if v_0.Op != OpConst8 {
8177 break
8178 }
8179 c := auxIntToInt8(v_0.AuxInt)
8180 if !(config.PtrSize == 8) {
8181 break
8182 }
8183 v.reset(OpConst64)
8184 v.AuxInt = int64ToAuxInt(int64(ntz8(c)))
8185 return true
8186 }
8187 return false
8188 }
8189 func rewriteValuegeneric_OpCvt32Fto32(v *Value) bool {
8190 v_0 := v.Args[0]
8191
8192
8193
8194 for {
8195 if v_0.Op != OpConst32F {
8196 break
8197 }
8198 c := auxIntToFloat32(v_0.AuxInt)
8199 if !(c >= -1<<31 && c < 1<<31) {
8200 break
8201 }
8202 v.reset(OpConst32)
8203 v.AuxInt = int32ToAuxInt(int32(c))
8204 return true
8205 }
8206 return false
8207 }
8208 func rewriteValuegeneric_OpCvt32Fto64(v *Value) bool {
8209 v_0 := v.Args[0]
8210
8211
8212
8213 for {
8214 if v_0.Op != OpConst32F {
8215 break
8216 }
8217 c := auxIntToFloat32(v_0.AuxInt)
8218 if !(c >= -1<<63 && c < 1<<63) {
8219 break
8220 }
8221 v.reset(OpConst64)
8222 v.AuxInt = int64ToAuxInt(int64(c))
8223 return true
8224 }
8225 return false
8226 }
8227 func rewriteValuegeneric_OpCvt32Fto64F(v *Value) bool {
8228 v_0 := v.Args[0]
8229
8230
8231 for {
8232 if v_0.Op != OpConst32F {
8233 break
8234 }
8235 c := auxIntToFloat32(v_0.AuxInt)
8236 v.reset(OpConst64F)
8237 v.AuxInt = float64ToAuxInt(float64(c))
8238 return true
8239 }
8240 return false
8241 }
8242 func rewriteValuegeneric_OpCvt32to32F(v *Value) bool {
8243 v_0 := v.Args[0]
8244
8245
8246 for {
8247 if v_0.Op != OpConst32 {
8248 break
8249 }
8250 c := auxIntToInt32(v_0.AuxInt)
8251 v.reset(OpConst32F)
8252 v.AuxInt = float32ToAuxInt(float32(c))
8253 return true
8254 }
8255 return false
8256 }
8257 func rewriteValuegeneric_OpCvt32to64F(v *Value) bool {
8258 v_0 := v.Args[0]
8259
8260
8261 for {
8262 if v_0.Op != OpConst32 {
8263 break
8264 }
8265 c := auxIntToInt32(v_0.AuxInt)
8266 v.reset(OpConst64F)
8267 v.AuxInt = float64ToAuxInt(float64(c))
8268 return true
8269 }
8270 return false
8271 }
8272 func rewriteValuegeneric_OpCvt64Fto32(v *Value) bool {
8273 v_0 := v.Args[0]
8274
8275
8276
8277 for {
8278 if v_0.Op != OpConst64F {
8279 break
8280 }
8281 c := auxIntToFloat64(v_0.AuxInt)
8282 if !(c >= -1<<31 && c < 1<<31) {
8283 break
8284 }
8285 v.reset(OpConst32)
8286 v.AuxInt = int32ToAuxInt(int32(c))
8287 return true
8288 }
8289 return false
8290 }
8291 func rewriteValuegeneric_OpCvt64Fto32F(v *Value) bool {
8292 v_0 := v.Args[0]
8293
8294
8295 for {
8296 if v_0.Op != OpConst64F {
8297 break
8298 }
8299 c := auxIntToFloat64(v_0.AuxInt)
8300 v.reset(OpConst32F)
8301 v.AuxInt = float32ToAuxInt(float32(c))
8302 return true
8303 }
8304
8305
8306
8307 for {
8308 sqrt0 := v_0
8309 if sqrt0.Op != OpSqrt {
8310 break
8311 }
8312 sqrt0_0 := sqrt0.Args[0]
8313 if sqrt0_0.Op != OpCvt32Fto64F {
8314 break
8315 }
8316 x := sqrt0_0.Args[0]
8317 if !(sqrt0.Uses == 1) {
8318 break
8319 }
8320 v.reset(OpSqrt32)
8321 v.AddArg(x)
8322 return true
8323 }
8324 return false
8325 }
8326 func rewriteValuegeneric_OpCvt64Fto64(v *Value) bool {
8327 v_0 := v.Args[0]
8328
8329
8330
8331 for {
8332 if v_0.Op != OpConst64F {
8333 break
8334 }
8335 c := auxIntToFloat64(v_0.AuxInt)
8336 if !(c >= -1<<63 && c < 1<<63) {
8337 break
8338 }
8339 v.reset(OpConst64)
8340 v.AuxInt = int64ToAuxInt(int64(c))
8341 return true
8342 }
8343 return false
8344 }
8345 func rewriteValuegeneric_OpCvt64to32F(v *Value) bool {
8346 v_0 := v.Args[0]
8347
8348
8349 for {
8350 if v_0.Op != OpConst64 {
8351 break
8352 }
8353 c := auxIntToInt64(v_0.AuxInt)
8354 v.reset(OpConst32F)
8355 v.AuxInt = float32ToAuxInt(float32(c))
8356 return true
8357 }
8358 return false
8359 }
8360 func rewriteValuegeneric_OpCvt64to64F(v *Value) bool {
8361 v_0 := v.Args[0]
8362
8363
8364 for {
8365 if v_0.Op != OpConst64 {
8366 break
8367 }
8368 c := auxIntToInt64(v_0.AuxInt)
8369 v.reset(OpConst64F)
8370 v.AuxInt = float64ToAuxInt(float64(c))
8371 return true
8372 }
8373 return false
8374 }
8375 func rewriteValuegeneric_OpCvtBoolToUint8(v *Value) bool {
8376 v_0 := v.Args[0]
8377
8378
8379 for {
8380 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
8381 break
8382 }
8383 v.reset(OpConst8)
8384 v.AuxInt = int8ToAuxInt(0)
8385 return true
8386 }
8387
8388
8389 for {
8390 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
8391 break
8392 }
8393 v.reset(OpConst8)
8394 v.AuxInt = int8ToAuxInt(1)
8395 return true
8396 }
8397 return false
8398 }
8399 func rewriteValuegeneric_OpDiv128u(v *Value) bool {
8400 v_2 := v.Args[2]
8401 v_1 := v.Args[1]
8402 v_0 := v.Args[0]
8403 b := v.Block
8404
8405
8406 for {
8407 t := v.Type
8408 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
8409 break
8410 }
8411 lo := v_1
8412 y := v_2
8413 v.reset(OpMakeTuple)
8414 v0 := b.NewValue0(v.Pos, OpDiv64u, t.FieldType(0))
8415 v0.AddArg2(lo, y)
8416 v1 := b.NewValue0(v.Pos, OpMod64u, t.FieldType(1))
8417 v1.AddArg2(lo, y)
8418 v.AddArg2(v0, v1)
8419 return true
8420 }
8421 return false
8422 }
8423 func rewriteValuegeneric_OpDiv16(v *Value) bool {
8424 v_1 := v.Args[1]
8425 v_0 := v.Args[0]
8426 b := v.Block
8427 typ := &b.Func.Config.Types
8428
8429
8430
8431 for {
8432 if v_0.Op != OpConst16 {
8433 break
8434 }
8435 c := auxIntToInt16(v_0.AuxInt)
8436 if v_1.Op != OpConst16 {
8437 break
8438 }
8439 d := auxIntToInt16(v_1.AuxInt)
8440 if !(d != 0) {
8441 break
8442 }
8443 v.reset(OpConst16)
8444 v.AuxInt = int16ToAuxInt(c / d)
8445 return true
8446 }
8447
8448
8449
8450 for {
8451 t := v.Type
8452 n := v_0
8453 if v_1.Op != OpConst16 {
8454 break
8455 }
8456 c := auxIntToInt16(v_1.AuxInt)
8457 if !(c < 0 && c != -1<<15) {
8458 break
8459 }
8460 v.reset(OpNeg16)
8461 v0 := b.NewValue0(v.Pos, OpDiv16, t)
8462 v1 := b.NewValue0(v.Pos, OpConst16, t)
8463 v1.AuxInt = int16ToAuxInt(-c)
8464 v0.AddArg2(n, v1)
8465 v.AddArg(v0)
8466 return true
8467 }
8468
8469
8470 for {
8471 t := v.Type
8472 x := v_0
8473 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != -1<<15 {
8474 break
8475 }
8476 v.reset(OpRsh16Ux64)
8477 v0 := b.NewValue0(v.Pos, OpAnd16, t)
8478 v1 := b.NewValue0(v.Pos, OpNeg16, t)
8479 v1.AddArg(x)
8480 v0.AddArg2(x, v1)
8481 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8482 v2.AuxInt = int64ToAuxInt(15)
8483 v.AddArg2(v0, v2)
8484 return true
8485 }
8486 return false
8487 }
8488 func rewriteValuegeneric_OpDiv16u(v *Value) bool {
8489 v_1 := v.Args[1]
8490 v_0 := v.Args[0]
8491 b := v.Block
8492 typ := &b.Func.Config.Types
8493
8494
8495
8496 for {
8497 if v_0.Op != OpConst16 {
8498 break
8499 }
8500 c := auxIntToInt16(v_0.AuxInt)
8501 if v_1.Op != OpConst16 {
8502 break
8503 }
8504 d := auxIntToInt16(v_1.AuxInt)
8505 if !(d != 0) {
8506 break
8507 }
8508 v.reset(OpConst16)
8509 v.AuxInt = int16ToAuxInt(int16(uint16(c) / uint16(d)))
8510 return true
8511 }
8512
8513
8514
8515 for {
8516 n := v_0
8517 if v_1.Op != OpConst16 {
8518 break
8519 }
8520 c := auxIntToInt16(v_1.AuxInt)
8521 if !(isPowerOfTwo(uint16(c))) {
8522 break
8523 }
8524 v.reset(OpRsh16Ux64)
8525 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8526 v0.AuxInt = int64ToAuxInt(log16u(uint16(c)))
8527 v.AddArg2(n, v0)
8528 return true
8529 }
8530 return false
8531 }
8532 func rewriteValuegeneric_OpDiv32(v *Value) bool {
8533 v_1 := v.Args[1]
8534 v_0 := v.Args[0]
8535 b := v.Block
8536 typ := &b.Func.Config.Types
8537
8538
8539
8540 for {
8541 if v_0.Op != OpConst32 {
8542 break
8543 }
8544 c := auxIntToInt32(v_0.AuxInt)
8545 if v_1.Op != OpConst32 {
8546 break
8547 }
8548 d := auxIntToInt32(v_1.AuxInt)
8549 if !(d != 0) {
8550 break
8551 }
8552 v.reset(OpConst32)
8553 v.AuxInt = int32ToAuxInt(c / d)
8554 return true
8555 }
8556
8557
8558
8559 for {
8560 t := v.Type
8561 n := v_0
8562 if v_1.Op != OpConst32 {
8563 break
8564 }
8565 c := auxIntToInt32(v_1.AuxInt)
8566 if !(c < 0 && c != -1<<31) {
8567 break
8568 }
8569 v.reset(OpNeg32)
8570 v0 := b.NewValue0(v.Pos, OpDiv32, t)
8571 v1 := b.NewValue0(v.Pos, OpConst32, t)
8572 v1.AuxInt = int32ToAuxInt(-c)
8573 v0.AddArg2(n, v1)
8574 v.AddArg(v0)
8575 return true
8576 }
8577
8578
8579 for {
8580 t := v.Type
8581 x := v_0
8582 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != -1<<31 {
8583 break
8584 }
8585 v.reset(OpRsh32Ux64)
8586 v0 := b.NewValue0(v.Pos, OpAnd32, t)
8587 v1 := b.NewValue0(v.Pos, OpNeg32, t)
8588 v1.AddArg(x)
8589 v0.AddArg2(x, v1)
8590 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8591 v2.AuxInt = int64ToAuxInt(31)
8592 v.AddArg2(v0, v2)
8593 return true
8594 }
8595 return false
8596 }
8597 func rewriteValuegeneric_OpDiv32F(v *Value) bool {
8598 v_1 := v.Args[1]
8599 v_0 := v.Args[0]
8600 b := v.Block
8601
8602
8603
8604 for {
8605 if v_0.Op != OpConst32F {
8606 break
8607 }
8608 c := auxIntToFloat32(v_0.AuxInt)
8609 if v_1.Op != OpConst32F {
8610 break
8611 }
8612 d := auxIntToFloat32(v_1.AuxInt)
8613 if !(c/d == c/d) {
8614 break
8615 }
8616 v.reset(OpConst32F)
8617 v.AuxInt = float32ToAuxInt(c / d)
8618 return true
8619 }
8620
8621
8622
8623 for {
8624 x := v_0
8625 if v_1.Op != OpConst32F {
8626 break
8627 }
8628 t := v_1.Type
8629 c := auxIntToFloat32(v_1.AuxInt)
8630 if !(reciprocalExact32(c)) {
8631 break
8632 }
8633 v.reset(OpMul32F)
8634 v0 := b.NewValue0(v.Pos, OpConst32F, t)
8635 v0.AuxInt = float32ToAuxInt(1 / c)
8636 v.AddArg2(x, v0)
8637 return true
8638 }
8639 return false
8640 }
8641 func rewriteValuegeneric_OpDiv32u(v *Value) bool {
8642 v_1 := v.Args[1]
8643 v_0 := v.Args[0]
8644 b := v.Block
8645 typ := &b.Func.Config.Types
8646
8647
8648
8649 for {
8650 if v_0.Op != OpConst32 {
8651 break
8652 }
8653 c := auxIntToInt32(v_0.AuxInt)
8654 if v_1.Op != OpConst32 {
8655 break
8656 }
8657 d := auxIntToInt32(v_1.AuxInt)
8658 if !(d != 0) {
8659 break
8660 }
8661 v.reset(OpConst32)
8662 v.AuxInt = int32ToAuxInt(int32(uint32(c) / uint32(d)))
8663 return true
8664 }
8665
8666
8667
8668 for {
8669 n := v_0
8670 if v_1.Op != OpConst32 {
8671 break
8672 }
8673 c := auxIntToInt32(v_1.AuxInt)
8674 if !(isPowerOfTwo(uint32(c))) {
8675 break
8676 }
8677 v.reset(OpRsh32Ux64)
8678 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8679 v0.AuxInt = int64ToAuxInt(log32u(uint32(c)))
8680 v.AddArg2(n, v0)
8681 return true
8682 }
8683 return false
8684 }
8685 func rewriteValuegeneric_OpDiv64(v *Value) bool {
8686 v_1 := v.Args[1]
8687 v_0 := v.Args[0]
8688 b := v.Block
8689 typ := &b.Func.Config.Types
8690
8691
8692
8693 for {
8694 if v_0.Op != OpConst64 {
8695 break
8696 }
8697 c := auxIntToInt64(v_0.AuxInt)
8698 if v_1.Op != OpConst64 {
8699 break
8700 }
8701 d := auxIntToInt64(v_1.AuxInt)
8702 if !(d != 0) {
8703 break
8704 }
8705 v.reset(OpConst64)
8706 v.AuxInt = int64ToAuxInt(c / d)
8707 return true
8708 }
8709
8710
8711
8712 for {
8713 t := v.Type
8714 n := v_0
8715 if v_1.Op != OpConst64 {
8716 break
8717 }
8718 c := auxIntToInt64(v_1.AuxInt)
8719 if !(c < 0 && c != -1<<63) {
8720 break
8721 }
8722 v.reset(OpNeg64)
8723 v0 := b.NewValue0(v.Pos, OpDiv64, t)
8724 v1 := b.NewValue0(v.Pos, OpConst64, t)
8725 v1.AuxInt = int64ToAuxInt(-c)
8726 v0.AddArg2(n, v1)
8727 v.AddArg(v0)
8728 return true
8729 }
8730
8731
8732
8733 for {
8734 x := v_0
8735 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 || !(isNonNegative(x)) {
8736 break
8737 }
8738 v.reset(OpConst64)
8739 v.AuxInt = int64ToAuxInt(0)
8740 return true
8741 }
8742
8743
8744 for {
8745 t := v.Type
8746 x := v_0
8747 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 {
8748 break
8749 }
8750 v.reset(OpRsh64Ux64)
8751 v0 := b.NewValue0(v.Pos, OpAnd64, t)
8752 v1 := b.NewValue0(v.Pos, OpNeg64, t)
8753 v1.AddArg(x)
8754 v0.AddArg2(x, v1)
8755 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8756 v2.AuxInt = int64ToAuxInt(63)
8757 v.AddArg2(v0, v2)
8758 return true
8759 }
8760 return false
8761 }
8762 func rewriteValuegeneric_OpDiv64F(v *Value) bool {
8763 v_1 := v.Args[1]
8764 v_0 := v.Args[0]
8765 b := v.Block
8766
8767
8768
8769 for {
8770 if v_0.Op != OpConst64F {
8771 break
8772 }
8773 c := auxIntToFloat64(v_0.AuxInt)
8774 if v_1.Op != OpConst64F {
8775 break
8776 }
8777 d := auxIntToFloat64(v_1.AuxInt)
8778 if !(c/d == c/d) {
8779 break
8780 }
8781 v.reset(OpConst64F)
8782 v.AuxInt = float64ToAuxInt(c / d)
8783 return true
8784 }
8785
8786
8787
8788 for {
8789 x := v_0
8790 if v_1.Op != OpConst64F {
8791 break
8792 }
8793 t := v_1.Type
8794 c := auxIntToFloat64(v_1.AuxInt)
8795 if !(reciprocalExact64(c)) {
8796 break
8797 }
8798 v.reset(OpMul64F)
8799 v0 := b.NewValue0(v.Pos, OpConst64F, t)
8800 v0.AuxInt = float64ToAuxInt(1 / c)
8801 v.AddArg2(x, v0)
8802 return true
8803 }
8804 return false
8805 }
8806 func rewriteValuegeneric_OpDiv64u(v *Value) bool {
8807 v_1 := v.Args[1]
8808 v_0 := v.Args[0]
8809 b := v.Block
8810 typ := &b.Func.Config.Types
8811
8812
8813
8814 for {
8815 if v_0.Op != OpConst64 {
8816 break
8817 }
8818 c := auxIntToInt64(v_0.AuxInt)
8819 if v_1.Op != OpConst64 {
8820 break
8821 }
8822 d := auxIntToInt64(v_1.AuxInt)
8823 if !(d != 0) {
8824 break
8825 }
8826 v.reset(OpConst64)
8827 v.AuxInt = int64ToAuxInt(int64(uint64(c) / uint64(d)))
8828 return true
8829 }
8830
8831
8832
8833 for {
8834 n := v_0
8835 if v_1.Op != OpConst64 {
8836 break
8837 }
8838 c := auxIntToInt64(v_1.AuxInt)
8839 if !(isPowerOfTwo(uint64(c))) {
8840 break
8841 }
8842 v.reset(OpRsh64Ux64)
8843 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8844 v0.AuxInt = int64ToAuxInt(log64u(uint64(c)))
8845 v.AddArg2(n, v0)
8846 return true
8847 }
8848 return false
8849 }
8850 func rewriteValuegeneric_OpDiv8(v *Value) bool {
8851 v_1 := v.Args[1]
8852 v_0 := v.Args[0]
8853 b := v.Block
8854 typ := &b.Func.Config.Types
8855
8856
8857
8858 for {
8859 if v_0.Op != OpConst8 {
8860 break
8861 }
8862 c := auxIntToInt8(v_0.AuxInt)
8863 if v_1.Op != OpConst8 {
8864 break
8865 }
8866 d := auxIntToInt8(v_1.AuxInt)
8867 if !(d != 0) {
8868 break
8869 }
8870 v.reset(OpConst8)
8871 v.AuxInt = int8ToAuxInt(c / d)
8872 return true
8873 }
8874
8875
8876
8877 for {
8878 t := v.Type
8879 n := v_0
8880 if v_1.Op != OpConst8 {
8881 break
8882 }
8883 c := auxIntToInt8(v_1.AuxInt)
8884 if !(c < 0 && c != -1<<7) {
8885 break
8886 }
8887 v.reset(OpNeg8)
8888 v0 := b.NewValue0(v.Pos, OpDiv8, t)
8889 v1 := b.NewValue0(v.Pos, OpConst8, t)
8890 v1.AuxInt = int8ToAuxInt(-c)
8891 v0.AddArg2(n, v1)
8892 v.AddArg(v0)
8893 return true
8894 }
8895
8896
8897 for {
8898 t := v.Type
8899 x := v_0
8900 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != -1<<7 {
8901 break
8902 }
8903 v.reset(OpRsh8Ux64)
8904 v0 := b.NewValue0(v.Pos, OpAnd8, t)
8905 v1 := b.NewValue0(v.Pos, OpNeg8, t)
8906 v1.AddArg(x)
8907 v0.AddArg2(x, v1)
8908 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8909 v2.AuxInt = int64ToAuxInt(7)
8910 v.AddArg2(v0, v2)
8911 return true
8912 }
8913 return false
8914 }
8915 func rewriteValuegeneric_OpDiv8u(v *Value) bool {
8916 v_1 := v.Args[1]
8917 v_0 := v.Args[0]
8918 b := v.Block
8919 typ := &b.Func.Config.Types
8920
8921
8922
8923 for {
8924 if v_0.Op != OpConst8 {
8925 break
8926 }
8927 c := auxIntToInt8(v_0.AuxInt)
8928 if v_1.Op != OpConst8 {
8929 break
8930 }
8931 d := auxIntToInt8(v_1.AuxInt)
8932 if !(d != 0) {
8933 break
8934 }
8935 v.reset(OpConst8)
8936 v.AuxInt = int8ToAuxInt(int8(uint8(c) / uint8(d)))
8937 return true
8938 }
8939
8940
8941
8942 for {
8943 n := v_0
8944 if v_1.Op != OpConst8 {
8945 break
8946 }
8947 c := auxIntToInt8(v_1.AuxInt)
8948 if !(isPowerOfTwo(uint8(c))) {
8949 break
8950 }
8951 v.reset(OpRsh8Ux64)
8952 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
8953 v0.AuxInt = int64ToAuxInt(log8u(uint8(c)))
8954 v.AddArg2(n, v0)
8955 return true
8956 }
8957 return false
8958 }
8959 func rewriteValuegeneric_OpEq16(v *Value) bool {
8960 v_1 := v.Args[1]
8961 v_0 := v.Args[0]
8962 b := v.Block
8963 config := b.Func.Config
8964 typ := &b.Func.Config.Types
8965
8966
8967 for {
8968 x := v_0
8969 if x != v_1 {
8970 break
8971 }
8972 v.reset(OpConstBool)
8973 v.AuxInt = boolToAuxInt(true)
8974 return true
8975 }
8976
8977
8978
8979 for {
8980 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8981 if v_0.Op != OpConst16 {
8982 continue
8983 }
8984 t := v_0.Type
8985 c := auxIntToInt16(v_0.AuxInt)
8986 o := v_1
8987 if o.Op != OpAdd16 {
8988 continue
8989 }
8990 _ = o.Args[1]
8991 o_0 := o.Args[0]
8992 o_1 := o.Args[1]
8993 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
8994 if o_0.Op != OpConst16 {
8995 continue
8996 }
8997 d := auxIntToInt16(o_0.AuxInt)
8998 x := o_1
8999 if !(o.Uses == 1) {
9000 continue
9001 }
9002 v.reset(OpEq16)
9003 v0 := b.NewValue0(v.Pos, OpConst16, t)
9004 v0.AuxInt = int16ToAuxInt(c - d)
9005 v.AddArg2(v0, x)
9006 return true
9007 }
9008 }
9009 break
9010 }
9011
9012
9013
9014 for {
9015 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9016 if v_0.Op != OpConst16 {
9017 continue
9018 }
9019 t := v_0.Type
9020 c := auxIntToInt16(v_0.AuxInt)
9021 o := v_1
9022 if o.Op != OpSub16 {
9023 continue
9024 }
9025 _ = o.Args[1]
9026 x := o.Args[0]
9027 o_1 := o.Args[1]
9028 if o_1.Op != OpConst16 {
9029 continue
9030 }
9031 d := auxIntToInt16(o_1.AuxInt)
9032 if !(o.Uses == 1) {
9033 continue
9034 }
9035 v.reset(OpEq16)
9036 v0 := b.NewValue0(v.Pos, OpConst16, t)
9037 v0.AuxInt = int16ToAuxInt(c + d)
9038 v.AddArg2(v0, x)
9039 return true
9040 }
9041 break
9042 }
9043
9044
9045
9046 for {
9047 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9048 if v_0.Op != OpConst16 {
9049 continue
9050 }
9051 t := v_0.Type
9052 c := auxIntToInt16(v_0.AuxInt)
9053 o := v_1
9054 if o.Op != OpSub16 {
9055 continue
9056 }
9057 x := o.Args[1]
9058 o_0 := o.Args[0]
9059 if o_0.Op != OpConst16 {
9060 continue
9061 }
9062 d := auxIntToInt16(o_0.AuxInt)
9063 if !(o.Uses == 1) {
9064 continue
9065 }
9066 v.reset(OpEq16)
9067 v0 := b.NewValue0(v.Pos, OpConst16, t)
9068 v0.AuxInt = int16ToAuxInt(d - c)
9069 v.AddArg2(v0, x)
9070 return true
9071 }
9072 break
9073 }
9074
9075
9076
9077 for {
9078 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9079 if v_0.Op != OpConst16 {
9080 continue
9081 }
9082 t := v_0.Type
9083 c := auxIntToInt16(v_0.AuxInt)
9084 o := v_1
9085 if o.Op != OpXor16 {
9086 continue
9087 }
9088 _ = o.Args[1]
9089 o_0 := o.Args[0]
9090 o_1 := o.Args[1]
9091 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
9092 if o_0.Op != OpConst16 {
9093 continue
9094 }
9095 d := auxIntToInt16(o_0.AuxInt)
9096 x := o_1
9097 if !(o.Uses == 1) {
9098 continue
9099 }
9100 v.reset(OpEq16)
9101 v0 := b.NewValue0(v.Pos, OpConst16, t)
9102 v0.AuxInt = int16ToAuxInt(d ^ c)
9103 v.AddArg2(v0, x)
9104 return true
9105 }
9106 }
9107 break
9108 }
9109
9110
9111
9112 for {
9113 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9114 if v_0.Op != OpConst16 {
9115 continue
9116 }
9117 t := v_0.Type
9118 c := auxIntToInt16(v_0.AuxInt)
9119 o := v_1
9120 if o.Op != OpCom16 {
9121 continue
9122 }
9123 x := o.Args[0]
9124 if !(o.Uses == 1) {
9125 continue
9126 }
9127 v.reset(OpEq16)
9128 v0 := b.NewValue0(v.Pos, OpConst16, t)
9129 v0.AuxInt = int16ToAuxInt(^c)
9130 v.AddArg2(v0, x)
9131 return true
9132 }
9133 break
9134 }
9135
9136
9137
9138 for {
9139 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9140 if v_0.Op != OpConst16 {
9141 continue
9142 }
9143 t := v_0.Type
9144 c := auxIntToInt16(v_0.AuxInt)
9145 o := v_1
9146 if o.Op != OpNeg16 {
9147 continue
9148 }
9149 x := o.Args[0]
9150 if !(o.Uses == 1) {
9151 continue
9152 }
9153 v.reset(OpEq16)
9154 v0 := b.NewValue0(v.Pos, OpConst16, t)
9155 v0.AuxInt = int16ToAuxInt(-c)
9156 v.AddArg2(v0, x)
9157 return true
9158 }
9159 break
9160 }
9161
9162
9163
9164 for {
9165 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9166 if v_0.Op != OpConst16 {
9167 continue
9168 }
9169 t := v_0.Type
9170 c := auxIntToInt16(v_0.AuxInt)
9171 o := v_1
9172 if o.Op != OpMul16 {
9173 continue
9174 }
9175 _ = o.Args[1]
9176 o_0 := o.Args[0]
9177 o_1 := o.Args[1]
9178 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
9179 if o_0.Op != OpConst16 {
9180 continue
9181 }
9182 d := auxIntToInt16(o_0.AuxInt)
9183 x := o_1
9184 if !(uint16(d)%2 == 1 && o.Uses == 1) {
9185 continue
9186 }
9187 v.reset(OpEq16)
9188 v0 := b.NewValue0(v.Pos, OpConst16, t)
9189 v0.AuxInt = int16ToAuxInt(int16(uint16(c) * uint16(modularMultiplicativeInverse(uint64(d)))))
9190 v.AddArg2(v0, x)
9191 return true
9192 }
9193 }
9194 break
9195 }
9196
9197
9198 for {
9199 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9200 if v_0.Op != OpConst16 {
9201 continue
9202 }
9203 c := auxIntToInt16(v_0.AuxInt)
9204 if v_1.Op != OpConst16 {
9205 continue
9206 }
9207 d := auxIntToInt16(v_1.AuxInt)
9208 v.reset(OpConstBool)
9209 v.AuxInt = boolToAuxInt(c == d)
9210 return true
9211 }
9212 break
9213 }
9214
9215
9216
9217 for {
9218 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9219 if v_0.Op != OpMod16u {
9220 continue
9221 }
9222 _ = v_0.Args[1]
9223 x := v_0.Args[0]
9224 v_0_1 := v_0.Args[1]
9225 if v_0_1.Op != OpConst16 {
9226 continue
9227 }
9228 c := auxIntToInt16(v_0_1.AuxInt)
9229 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(x.Op != OpConst16 && udivisibleOK16(c) && !hasSmallRotate(config)) {
9230 continue
9231 }
9232 v.reset(OpEq32)
9233 v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32)
9234 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
9235 v1.AddArg(x)
9236 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
9237 v2.AuxInt = int32ToAuxInt(int32(uint16(c)))
9238 v0.AddArg2(v1, v2)
9239 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
9240 v3.AuxInt = int32ToAuxInt(0)
9241 v.AddArg2(v0, v3)
9242 return true
9243 }
9244 break
9245 }
9246
9247
9248
9249 for {
9250 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9251 if v_0.Op != OpMod16 {
9252 continue
9253 }
9254 _ = v_0.Args[1]
9255 x := v_0.Args[0]
9256 v_0_1 := v_0.Args[1]
9257 if v_0_1.Op != OpConst16 {
9258 continue
9259 }
9260 c := auxIntToInt16(v_0_1.AuxInt)
9261 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(x.Op != OpConst16 && sdivisibleOK16(c) && !hasSmallRotate(config)) {
9262 continue
9263 }
9264 v.reset(OpEq32)
9265 v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32)
9266 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
9267 v1.AddArg(x)
9268 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
9269 v2.AuxInt = int32ToAuxInt(int32(c))
9270 v0.AddArg2(v1, v2)
9271 v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
9272 v3.AuxInt = int32ToAuxInt(0)
9273 v.AddArg2(v0, v3)
9274 return true
9275 }
9276 break
9277 }
9278
9279
9280
9281 for {
9282 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9283 s := v_0
9284 if s.Op != OpSub16 {
9285 continue
9286 }
9287 y := s.Args[1]
9288 x := s.Args[0]
9289 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(s.Uses == 1) {
9290 continue
9291 }
9292 v.reset(OpEq16)
9293 v.AddArg2(x, y)
9294 return true
9295 }
9296 break
9297 }
9298
9299
9300
9301 for {
9302 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9303 if v_0.Op != OpAnd16 {
9304 continue
9305 }
9306 t := v_0.Type
9307 _ = v_0.Args[1]
9308 v_0_0 := v_0.Args[0]
9309 v_0_1 := v_0.Args[1]
9310 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
9311 x := v_0_0
9312 if v_0_1.Op != OpConst16 || v_0_1.Type != t {
9313 continue
9314 }
9315 y := auxIntToInt16(v_0_1.AuxInt)
9316 if v_1.Op != OpConst16 || v_1.Type != t || auxIntToInt16(v_1.AuxInt) != y || !(oneBit(y)) {
9317 continue
9318 }
9319 v.reset(OpNeq16)
9320 v0 := b.NewValue0(v.Pos, OpAnd16, t)
9321 v1 := b.NewValue0(v.Pos, OpConst16, t)
9322 v1.AuxInt = int16ToAuxInt(y)
9323 v0.AddArg2(x, v1)
9324 v2 := b.NewValue0(v.Pos, OpConst16, t)
9325 v2.AuxInt = int16ToAuxInt(0)
9326 v.AddArg2(v0, v2)
9327 return true
9328 }
9329 }
9330 break
9331 }
9332
9333
9334 for {
9335 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9336 if v_0.Op != OpZeroExt8to16 {
9337 continue
9338 }
9339 v_0_0 := v_0.Args[0]
9340 if v_0_0.Op != OpCvtBoolToUint8 {
9341 continue
9342 }
9343 x := v_0_0.Args[0]
9344 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
9345 continue
9346 }
9347 v.copyOf(x)
9348 return true
9349 }
9350 break
9351 }
9352
9353
9354 for {
9355 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9356 if v_0.Op != OpZeroExt8to16 {
9357 continue
9358 }
9359 v_0_0 := v_0.Args[0]
9360 if v_0_0.Op != OpCvtBoolToUint8 {
9361 continue
9362 }
9363 x := v_0_0.Args[0]
9364 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
9365 continue
9366 }
9367 v.reset(OpNot)
9368 v.AddArg(x)
9369 return true
9370 }
9371 break
9372 }
9373 return false
9374 }
9375 func rewriteValuegeneric_OpEq32(v *Value) bool {
9376 v_1 := v.Args[1]
9377 v_0 := v.Args[0]
9378 b := v.Block
9379
9380
9381 for {
9382 x := v_0
9383 if x != v_1 {
9384 break
9385 }
9386 v.reset(OpConstBool)
9387 v.AuxInt = boolToAuxInt(true)
9388 return true
9389 }
9390
9391
9392
9393 for {
9394 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9395 if v_0.Op != OpConst32 {
9396 continue
9397 }
9398 t := v_0.Type
9399 c := auxIntToInt32(v_0.AuxInt)
9400 o := v_1
9401 if o.Op != OpAdd32 {
9402 continue
9403 }
9404 _ = o.Args[1]
9405 o_0 := o.Args[0]
9406 o_1 := o.Args[1]
9407 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
9408 if o_0.Op != OpConst32 {
9409 continue
9410 }
9411 d := auxIntToInt32(o_0.AuxInt)
9412 x := o_1
9413 if !(o.Uses == 1) {
9414 continue
9415 }
9416 v.reset(OpEq32)
9417 v0 := b.NewValue0(v.Pos, OpConst32, t)
9418 v0.AuxInt = int32ToAuxInt(c - d)
9419 v.AddArg2(v0, x)
9420 return true
9421 }
9422 }
9423 break
9424 }
9425
9426
9427
9428 for {
9429 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9430 if v_0.Op != OpConst32 {
9431 continue
9432 }
9433 t := v_0.Type
9434 c := auxIntToInt32(v_0.AuxInt)
9435 o := v_1
9436 if o.Op != OpSub32 {
9437 continue
9438 }
9439 _ = o.Args[1]
9440 x := o.Args[0]
9441 o_1 := o.Args[1]
9442 if o_1.Op != OpConst32 {
9443 continue
9444 }
9445 d := auxIntToInt32(o_1.AuxInt)
9446 if !(o.Uses == 1) {
9447 continue
9448 }
9449 v.reset(OpEq32)
9450 v0 := b.NewValue0(v.Pos, OpConst32, t)
9451 v0.AuxInt = int32ToAuxInt(c + d)
9452 v.AddArg2(v0, x)
9453 return true
9454 }
9455 break
9456 }
9457
9458
9459
9460 for {
9461 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9462 if v_0.Op != OpConst32 {
9463 continue
9464 }
9465 t := v_0.Type
9466 c := auxIntToInt32(v_0.AuxInt)
9467 o := v_1
9468 if o.Op != OpSub32 {
9469 continue
9470 }
9471 x := o.Args[1]
9472 o_0 := o.Args[0]
9473 if o_0.Op != OpConst32 {
9474 continue
9475 }
9476 d := auxIntToInt32(o_0.AuxInt)
9477 if !(o.Uses == 1) {
9478 continue
9479 }
9480 v.reset(OpEq32)
9481 v0 := b.NewValue0(v.Pos, OpConst32, t)
9482 v0.AuxInt = int32ToAuxInt(d - c)
9483 v.AddArg2(v0, x)
9484 return true
9485 }
9486 break
9487 }
9488
9489
9490
9491 for {
9492 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9493 if v_0.Op != OpConst32 {
9494 continue
9495 }
9496 t := v_0.Type
9497 c := auxIntToInt32(v_0.AuxInt)
9498 o := v_1
9499 if o.Op != OpXor32 {
9500 continue
9501 }
9502 _ = o.Args[1]
9503 o_0 := o.Args[0]
9504 o_1 := o.Args[1]
9505 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
9506 if o_0.Op != OpConst32 {
9507 continue
9508 }
9509 d := auxIntToInt32(o_0.AuxInt)
9510 x := o_1
9511 if !(o.Uses == 1) {
9512 continue
9513 }
9514 v.reset(OpEq32)
9515 v0 := b.NewValue0(v.Pos, OpConst32, t)
9516 v0.AuxInt = int32ToAuxInt(d ^ c)
9517 v.AddArg2(v0, x)
9518 return true
9519 }
9520 }
9521 break
9522 }
9523
9524
9525
9526 for {
9527 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9528 if v_0.Op != OpConst32 {
9529 continue
9530 }
9531 t := v_0.Type
9532 c := auxIntToInt32(v_0.AuxInt)
9533 o := v_1
9534 if o.Op != OpCom32 {
9535 continue
9536 }
9537 x := o.Args[0]
9538 if !(o.Uses == 1) {
9539 continue
9540 }
9541 v.reset(OpEq32)
9542 v0 := b.NewValue0(v.Pos, OpConst32, t)
9543 v0.AuxInt = int32ToAuxInt(^c)
9544 v.AddArg2(v0, x)
9545 return true
9546 }
9547 break
9548 }
9549
9550
9551
9552 for {
9553 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9554 if v_0.Op != OpConst32 {
9555 continue
9556 }
9557 t := v_0.Type
9558 c := auxIntToInt32(v_0.AuxInt)
9559 o := v_1
9560 if o.Op != OpNeg32 {
9561 continue
9562 }
9563 x := o.Args[0]
9564 if !(o.Uses == 1) {
9565 continue
9566 }
9567 v.reset(OpEq32)
9568 v0 := b.NewValue0(v.Pos, OpConst32, t)
9569 v0.AuxInt = int32ToAuxInt(-c)
9570 v.AddArg2(v0, x)
9571 return true
9572 }
9573 break
9574 }
9575
9576
9577
9578 for {
9579 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9580 if v_0.Op != OpConst32 {
9581 continue
9582 }
9583 t := v_0.Type
9584 c := auxIntToInt32(v_0.AuxInt)
9585 o := v_1
9586 if o.Op != OpMul32 {
9587 continue
9588 }
9589 _ = o.Args[1]
9590 o_0 := o.Args[0]
9591 o_1 := o.Args[1]
9592 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
9593 if o_0.Op != OpConst32 {
9594 continue
9595 }
9596 d := auxIntToInt32(o_0.AuxInt)
9597 x := o_1
9598 if !(uint32(d)%2 == 1 && o.Uses == 1) {
9599 continue
9600 }
9601 v.reset(OpEq32)
9602 v0 := b.NewValue0(v.Pos, OpConst32, t)
9603 v0.AuxInt = int32ToAuxInt(int32(uint32(c) * uint32(modularMultiplicativeInverse(uint64(d)))))
9604 v.AddArg2(v0, x)
9605 return true
9606 }
9607 }
9608 break
9609 }
9610
9611
9612 for {
9613 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9614 if v_0.Op != OpConst32 {
9615 continue
9616 }
9617 c := auxIntToInt32(v_0.AuxInt)
9618 if v_1.Op != OpConst32 {
9619 continue
9620 }
9621 d := auxIntToInt32(v_1.AuxInt)
9622 v.reset(OpConstBool)
9623 v.AuxInt = boolToAuxInt(c == d)
9624 return true
9625 }
9626 break
9627 }
9628
9629
9630
9631 for {
9632 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9633 s := v_0
9634 if s.Op != OpSub32 {
9635 continue
9636 }
9637 y := s.Args[1]
9638 x := s.Args[0]
9639 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 || !(s.Uses == 1) {
9640 continue
9641 }
9642 v.reset(OpEq32)
9643 v.AddArg2(x, y)
9644 return true
9645 }
9646 break
9647 }
9648
9649
9650
9651 for {
9652 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9653 if v_0.Op != OpAnd32 {
9654 continue
9655 }
9656 t := v_0.Type
9657 _ = v_0.Args[1]
9658 v_0_0 := v_0.Args[0]
9659 v_0_1 := v_0.Args[1]
9660 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
9661 x := v_0_0
9662 if v_0_1.Op != OpConst32 || v_0_1.Type != t {
9663 continue
9664 }
9665 y := auxIntToInt32(v_0_1.AuxInt)
9666 if v_1.Op != OpConst32 || v_1.Type != t || auxIntToInt32(v_1.AuxInt) != y || !(oneBit(y)) {
9667 continue
9668 }
9669 v.reset(OpNeq32)
9670 v0 := b.NewValue0(v.Pos, OpAnd32, t)
9671 v1 := b.NewValue0(v.Pos, OpConst32, t)
9672 v1.AuxInt = int32ToAuxInt(y)
9673 v0.AddArg2(x, v1)
9674 v2 := b.NewValue0(v.Pos, OpConst32, t)
9675 v2.AuxInt = int32ToAuxInt(0)
9676 v.AddArg2(v0, v2)
9677 return true
9678 }
9679 }
9680 break
9681 }
9682
9683
9684 for {
9685 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9686 if v_0.Op != OpZeroExt8to32 {
9687 continue
9688 }
9689 v_0_0 := v_0.Args[0]
9690 if v_0_0.Op != OpCvtBoolToUint8 {
9691 continue
9692 }
9693 x := v_0_0.Args[0]
9694 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
9695 continue
9696 }
9697 v.copyOf(x)
9698 return true
9699 }
9700 break
9701 }
9702
9703
9704 for {
9705 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9706 if v_0.Op != OpZeroExt8to32 {
9707 continue
9708 }
9709 v_0_0 := v_0.Args[0]
9710 if v_0_0.Op != OpCvtBoolToUint8 {
9711 continue
9712 }
9713 x := v_0_0.Args[0]
9714 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
9715 continue
9716 }
9717 v.reset(OpNot)
9718 v.AddArg(x)
9719 return true
9720 }
9721 break
9722 }
9723 return false
9724 }
9725 func rewriteValuegeneric_OpEq32F(v *Value) bool {
9726 v_1 := v.Args[1]
9727 v_0 := v.Args[0]
9728
9729
9730 for {
9731 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9732 if v_0.Op != OpConst32F {
9733 continue
9734 }
9735 c := auxIntToFloat32(v_0.AuxInt)
9736 if v_1.Op != OpConst32F {
9737 continue
9738 }
9739 d := auxIntToFloat32(v_1.AuxInt)
9740 v.reset(OpConstBool)
9741 v.AuxInt = boolToAuxInt(c == d)
9742 return true
9743 }
9744 break
9745 }
9746 return false
9747 }
9748 func rewriteValuegeneric_OpEq64(v *Value) bool {
9749 v_1 := v.Args[1]
9750 v_0 := v.Args[0]
9751 b := v.Block
9752
9753
9754 for {
9755 x := v_0
9756 if x != v_1 {
9757 break
9758 }
9759 v.reset(OpConstBool)
9760 v.AuxInt = boolToAuxInt(true)
9761 return true
9762 }
9763
9764
9765
9766 for {
9767 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9768 if v_0.Op != OpConst64 {
9769 continue
9770 }
9771 t := v_0.Type
9772 c := auxIntToInt64(v_0.AuxInt)
9773 o := v_1
9774 if o.Op != OpAdd64 {
9775 continue
9776 }
9777 _ = o.Args[1]
9778 o_0 := o.Args[0]
9779 o_1 := o.Args[1]
9780 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
9781 if o_0.Op != OpConst64 {
9782 continue
9783 }
9784 d := auxIntToInt64(o_0.AuxInt)
9785 x := o_1
9786 if !(o.Uses == 1) {
9787 continue
9788 }
9789 v.reset(OpEq64)
9790 v0 := b.NewValue0(v.Pos, OpConst64, t)
9791 v0.AuxInt = int64ToAuxInt(c - d)
9792 v.AddArg2(v0, x)
9793 return true
9794 }
9795 }
9796 break
9797 }
9798
9799
9800
9801 for {
9802 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9803 if v_0.Op != OpConst64 {
9804 continue
9805 }
9806 t := v_0.Type
9807 c := auxIntToInt64(v_0.AuxInt)
9808 o := v_1
9809 if o.Op != OpSub64 {
9810 continue
9811 }
9812 _ = o.Args[1]
9813 x := o.Args[0]
9814 o_1 := o.Args[1]
9815 if o_1.Op != OpConst64 {
9816 continue
9817 }
9818 d := auxIntToInt64(o_1.AuxInt)
9819 if !(o.Uses == 1) {
9820 continue
9821 }
9822 v.reset(OpEq64)
9823 v0 := b.NewValue0(v.Pos, OpConst64, t)
9824 v0.AuxInt = int64ToAuxInt(c + d)
9825 v.AddArg2(v0, x)
9826 return true
9827 }
9828 break
9829 }
9830
9831
9832
9833 for {
9834 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9835 if v_0.Op != OpConst64 {
9836 continue
9837 }
9838 t := v_0.Type
9839 c := auxIntToInt64(v_0.AuxInt)
9840 o := v_1
9841 if o.Op != OpSub64 {
9842 continue
9843 }
9844 x := o.Args[1]
9845 o_0 := o.Args[0]
9846 if o_0.Op != OpConst64 {
9847 continue
9848 }
9849 d := auxIntToInt64(o_0.AuxInt)
9850 if !(o.Uses == 1) {
9851 continue
9852 }
9853 v.reset(OpEq64)
9854 v0 := b.NewValue0(v.Pos, OpConst64, t)
9855 v0.AuxInt = int64ToAuxInt(d - c)
9856 v.AddArg2(v0, x)
9857 return true
9858 }
9859 break
9860 }
9861
9862
9863
9864 for {
9865 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9866 if v_0.Op != OpConst64 {
9867 continue
9868 }
9869 t := v_0.Type
9870 c := auxIntToInt64(v_0.AuxInt)
9871 o := v_1
9872 if o.Op != OpXor64 {
9873 continue
9874 }
9875 _ = o.Args[1]
9876 o_0 := o.Args[0]
9877 o_1 := o.Args[1]
9878 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
9879 if o_0.Op != OpConst64 {
9880 continue
9881 }
9882 d := auxIntToInt64(o_0.AuxInt)
9883 x := o_1
9884 if !(o.Uses == 1) {
9885 continue
9886 }
9887 v.reset(OpEq64)
9888 v0 := b.NewValue0(v.Pos, OpConst64, t)
9889 v0.AuxInt = int64ToAuxInt(d ^ c)
9890 v.AddArg2(v0, x)
9891 return true
9892 }
9893 }
9894 break
9895 }
9896
9897
9898
9899 for {
9900 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9901 if v_0.Op != OpConst64 {
9902 continue
9903 }
9904 t := v_0.Type
9905 c := auxIntToInt64(v_0.AuxInt)
9906 o := v_1
9907 if o.Op != OpCom64 {
9908 continue
9909 }
9910 x := o.Args[0]
9911 if !(o.Uses == 1) {
9912 continue
9913 }
9914 v.reset(OpEq64)
9915 v0 := b.NewValue0(v.Pos, OpConst64, t)
9916 v0.AuxInt = int64ToAuxInt(^c)
9917 v.AddArg2(v0, x)
9918 return true
9919 }
9920 break
9921 }
9922
9923
9924
9925 for {
9926 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9927 if v_0.Op != OpConst64 {
9928 continue
9929 }
9930 t := v_0.Type
9931 c := auxIntToInt64(v_0.AuxInt)
9932 o := v_1
9933 if o.Op != OpNeg64 {
9934 continue
9935 }
9936 x := o.Args[0]
9937 if !(o.Uses == 1) {
9938 continue
9939 }
9940 v.reset(OpEq64)
9941 v0 := b.NewValue0(v.Pos, OpConst64, t)
9942 v0.AuxInt = int64ToAuxInt(-c)
9943 v.AddArg2(v0, x)
9944 return true
9945 }
9946 break
9947 }
9948
9949
9950
9951 for {
9952 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9953 if v_0.Op != OpConst64 {
9954 continue
9955 }
9956 t := v_0.Type
9957 c := auxIntToInt64(v_0.AuxInt)
9958 o := v_1
9959 if o.Op != OpMul64 {
9960 continue
9961 }
9962 _ = o.Args[1]
9963 o_0 := o.Args[0]
9964 o_1 := o.Args[1]
9965 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
9966 if o_0.Op != OpConst64 {
9967 continue
9968 }
9969 d := auxIntToInt64(o_0.AuxInt)
9970 x := o_1
9971 if !(uint64(d)%2 == 1 && o.Uses == 1) {
9972 continue
9973 }
9974 v.reset(OpEq64)
9975 v0 := b.NewValue0(v.Pos, OpConst64, t)
9976 v0.AuxInt = int64ToAuxInt(int64(uint64(c) * modularMultiplicativeInverse(uint64(d))))
9977 v.AddArg2(v0, x)
9978 return true
9979 }
9980 }
9981 break
9982 }
9983
9984
9985 for {
9986 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
9987 if v_0.Op != OpConst64 {
9988 continue
9989 }
9990 c := auxIntToInt64(v_0.AuxInt)
9991 if v_1.Op != OpConst64 {
9992 continue
9993 }
9994 d := auxIntToInt64(v_1.AuxInt)
9995 v.reset(OpConstBool)
9996 v.AuxInt = boolToAuxInt(c == d)
9997 return true
9998 }
9999 break
10000 }
10001
10002
10003
10004 for {
10005 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10006 s := v_0
10007 if s.Op != OpSub64 {
10008 continue
10009 }
10010 y := s.Args[1]
10011 x := s.Args[0]
10012 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 || !(s.Uses == 1) {
10013 continue
10014 }
10015 v.reset(OpEq64)
10016 v.AddArg2(x, y)
10017 return true
10018 }
10019 break
10020 }
10021
10022
10023
10024 for {
10025 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10026 if v_0.Op != OpAnd64 {
10027 continue
10028 }
10029 t := v_0.Type
10030 _ = v_0.Args[1]
10031 v_0_0 := v_0.Args[0]
10032 v_0_1 := v_0.Args[1]
10033 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
10034 x := v_0_0
10035 if v_0_1.Op != OpConst64 || v_0_1.Type != t {
10036 continue
10037 }
10038 y := auxIntToInt64(v_0_1.AuxInt)
10039 if v_1.Op != OpConst64 || v_1.Type != t || auxIntToInt64(v_1.AuxInt) != y || !(oneBit(y)) {
10040 continue
10041 }
10042 v.reset(OpNeq64)
10043 v0 := b.NewValue0(v.Pos, OpAnd64, t)
10044 v1 := b.NewValue0(v.Pos, OpConst64, t)
10045 v1.AuxInt = int64ToAuxInt(y)
10046 v0.AddArg2(x, v1)
10047 v2 := b.NewValue0(v.Pos, OpConst64, t)
10048 v2.AuxInt = int64ToAuxInt(0)
10049 v.AddArg2(v0, v2)
10050 return true
10051 }
10052 }
10053 break
10054 }
10055
10056
10057 for {
10058 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10059 if v_0.Op != OpZeroExt8to64 {
10060 continue
10061 }
10062 v_0_0 := v_0.Args[0]
10063 if v_0_0.Op != OpCvtBoolToUint8 {
10064 continue
10065 }
10066 x := v_0_0.Args[0]
10067 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
10068 continue
10069 }
10070 v.copyOf(x)
10071 return true
10072 }
10073 break
10074 }
10075
10076
10077 for {
10078 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10079 if v_0.Op != OpZeroExt8to64 {
10080 continue
10081 }
10082 v_0_0 := v_0.Args[0]
10083 if v_0_0.Op != OpCvtBoolToUint8 {
10084 continue
10085 }
10086 x := v_0_0.Args[0]
10087 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
10088 continue
10089 }
10090 v.reset(OpNot)
10091 v.AddArg(x)
10092 return true
10093 }
10094 break
10095 }
10096 return false
10097 }
10098 func rewriteValuegeneric_OpEq64F(v *Value) bool {
10099 v_1 := v.Args[1]
10100 v_0 := v.Args[0]
10101
10102
10103 for {
10104 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10105 if v_0.Op != OpConst64F {
10106 continue
10107 }
10108 c := auxIntToFloat64(v_0.AuxInt)
10109 if v_1.Op != OpConst64F {
10110 continue
10111 }
10112 d := auxIntToFloat64(v_1.AuxInt)
10113 v.reset(OpConstBool)
10114 v.AuxInt = boolToAuxInt(c == d)
10115 return true
10116 }
10117 break
10118 }
10119 return false
10120 }
10121 func rewriteValuegeneric_OpEq8(v *Value) bool {
10122 v_1 := v.Args[1]
10123 v_0 := v.Args[0]
10124 b := v.Block
10125 config := b.Func.Config
10126 typ := &b.Func.Config.Types
10127
10128
10129 for {
10130 x := v_0
10131 if x != v_1 {
10132 break
10133 }
10134 v.reset(OpConstBool)
10135 v.AuxInt = boolToAuxInt(true)
10136 return true
10137 }
10138
10139
10140
10141 for {
10142 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10143 if v_0.Op != OpConst8 {
10144 continue
10145 }
10146 t := v_0.Type
10147 c := auxIntToInt8(v_0.AuxInt)
10148 o := v_1
10149 if o.Op != OpAdd8 {
10150 continue
10151 }
10152 _ = o.Args[1]
10153 o_0 := o.Args[0]
10154 o_1 := o.Args[1]
10155 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
10156 if o_0.Op != OpConst8 {
10157 continue
10158 }
10159 d := auxIntToInt8(o_0.AuxInt)
10160 x := o_1
10161 if !(o.Uses == 1) {
10162 continue
10163 }
10164 v.reset(OpEq8)
10165 v0 := b.NewValue0(v.Pos, OpConst8, t)
10166 v0.AuxInt = int8ToAuxInt(c - d)
10167 v.AddArg2(v0, x)
10168 return true
10169 }
10170 }
10171 break
10172 }
10173
10174
10175
10176 for {
10177 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10178 if v_0.Op != OpConst8 {
10179 continue
10180 }
10181 t := v_0.Type
10182 c := auxIntToInt8(v_0.AuxInt)
10183 o := v_1
10184 if o.Op != OpSub8 {
10185 continue
10186 }
10187 _ = o.Args[1]
10188 x := o.Args[0]
10189 o_1 := o.Args[1]
10190 if o_1.Op != OpConst8 {
10191 continue
10192 }
10193 d := auxIntToInt8(o_1.AuxInt)
10194 if !(o.Uses == 1) {
10195 continue
10196 }
10197 v.reset(OpEq8)
10198 v0 := b.NewValue0(v.Pos, OpConst8, t)
10199 v0.AuxInt = int8ToAuxInt(c + d)
10200 v.AddArg2(v0, x)
10201 return true
10202 }
10203 break
10204 }
10205
10206
10207
10208 for {
10209 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10210 if v_0.Op != OpConst8 {
10211 continue
10212 }
10213 t := v_0.Type
10214 c := auxIntToInt8(v_0.AuxInt)
10215 o := v_1
10216 if o.Op != OpSub8 {
10217 continue
10218 }
10219 x := o.Args[1]
10220 o_0 := o.Args[0]
10221 if o_0.Op != OpConst8 {
10222 continue
10223 }
10224 d := auxIntToInt8(o_0.AuxInt)
10225 if !(o.Uses == 1) {
10226 continue
10227 }
10228 v.reset(OpEq8)
10229 v0 := b.NewValue0(v.Pos, OpConst8, t)
10230 v0.AuxInt = int8ToAuxInt(d - c)
10231 v.AddArg2(v0, x)
10232 return true
10233 }
10234 break
10235 }
10236
10237
10238
10239 for {
10240 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10241 if v_0.Op != OpConst8 {
10242 continue
10243 }
10244 t := v_0.Type
10245 c := auxIntToInt8(v_0.AuxInt)
10246 o := v_1
10247 if o.Op != OpXor8 {
10248 continue
10249 }
10250 _ = o.Args[1]
10251 o_0 := o.Args[0]
10252 o_1 := o.Args[1]
10253 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
10254 if o_0.Op != OpConst8 {
10255 continue
10256 }
10257 d := auxIntToInt8(o_0.AuxInt)
10258 x := o_1
10259 if !(o.Uses == 1) {
10260 continue
10261 }
10262 v.reset(OpEq8)
10263 v0 := b.NewValue0(v.Pos, OpConst8, t)
10264 v0.AuxInt = int8ToAuxInt(d ^ c)
10265 v.AddArg2(v0, x)
10266 return true
10267 }
10268 }
10269 break
10270 }
10271
10272
10273
10274 for {
10275 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10276 if v_0.Op != OpConst8 {
10277 continue
10278 }
10279 t := v_0.Type
10280 c := auxIntToInt8(v_0.AuxInt)
10281 o := v_1
10282 if o.Op != OpCom8 {
10283 continue
10284 }
10285 x := o.Args[0]
10286 if !(o.Uses == 1) {
10287 continue
10288 }
10289 v.reset(OpEq8)
10290 v0 := b.NewValue0(v.Pos, OpConst8, t)
10291 v0.AuxInt = int8ToAuxInt(^c)
10292 v.AddArg2(v0, x)
10293 return true
10294 }
10295 break
10296 }
10297
10298
10299
10300 for {
10301 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10302 if v_0.Op != OpConst8 {
10303 continue
10304 }
10305 t := v_0.Type
10306 c := auxIntToInt8(v_0.AuxInt)
10307 o := v_1
10308 if o.Op != OpNeg8 {
10309 continue
10310 }
10311 x := o.Args[0]
10312 if !(o.Uses == 1) {
10313 continue
10314 }
10315 v.reset(OpEq8)
10316 v0 := b.NewValue0(v.Pos, OpConst8, t)
10317 v0.AuxInt = int8ToAuxInt(-c)
10318 v.AddArg2(v0, x)
10319 return true
10320 }
10321 break
10322 }
10323
10324
10325
10326 for {
10327 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10328 if v_0.Op != OpConst8 {
10329 continue
10330 }
10331 t := v_0.Type
10332 c := auxIntToInt8(v_0.AuxInt)
10333 o := v_1
10334 if o.Op != OpMul8 {
10335 continue
10336 }
10337 _ = o.Args[1]
10338 o_0 := o.Args[0]
10339 o_1 := o.Args[1]
10340 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
10341 if o_0.Op != OpConst8 {
10342 continue
10343 }
10344 d := auxIntToInt8(o_0.AuxInt)
10345 x := o_1
10346 if !(uint8(d)%2 == 1 && o.Uses == 1) {
10347 continue
10348 }
10349 v.reset(OpEq8)
10350 v0 := b.NewValue0(v.Pos, OpConst8, t)
10351 v0.AuxInt = int8ToAuxInt(int8(uint8(c) * uint8(modularMultiplicativeInverse(uint64(d)))))
10352 v.AddArg2(v0, x)
10353 return true
10354 }
10355 }
10356 break
10357 }
10358
10359
10360 for {
10361 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10362 if v_0.Op != OpConst8 {
10363 continue
10364 }
10365 c := auxIntToInt8(v_0.AuxInt)
10366 if v_1.Op != OpConst8 {
10367 continue
10368 }
10369 d := auxIntToInt8(v_1.AuxInt)
10370 v.reset(OpConstBool)
10371 v.AuxInt = boolToAuxInt(c == d)
10372 return true
10373 }
10374 break
10375 }
10376
10377
10378
10379 for {
10380 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10381 if v_0.Op != OpMod8u {
10382 continue
10383 }
10384 _ = v_0.Args[1]
10385 x := v_0.Args[0]
10386 v_0_1 := v_0.Args[1]
10387 if v_0_1.Op != OpConst8 {
10388 continue
10389 }
10390 c := auxIntToInt8(v_0_1.AuxInt)
10391 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(x.Op != OpConst8 && udivisibleOK8(c) && !hasSmallRotate(config)) {
10392 continue
10393 }
10394 v.reset(OpEq32)
10395 v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32)
10396 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
10397 v1.AddArg(x)
10398 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
10399 v2.AuxInt = int32ToAuxInt(int32(uint8(c)))
10400 v0.AddArg2(v1, v2)
10401 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
10402 v3.AuxInt = int32ToAuxInt(0)
10403 v.AddArg2(v0, v3)
10404 return true
10405 }
10406 break
10407 }
10408
10409
10410
10411 for {
10412 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10413 if v_0.Op != OpMod8 {
10414 continue
10415 }
10416 _ = v_0.Args[1]
10417 x := v_0.Args[0]
10418 v_0_1 := v_0.Args[1]
10419 if v_0_1.Op != OpConst8 {
10420 continue
10421 }
10422 c := auxIntToInt8(v_0_1.AuxInt)
10423 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(x.Op != OpConst8 && sdivisibleOK8(c) && !hasSmallRotate(config)) {
10424 continue
10425 }
10426 v.reset(OpEq32)
10427 v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32)
10428 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
10429 v1.AddArg(x)
10430 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
10431 v2.AuxInt = int32ToAuxInt(int32(c))
10432 v0.AddArg2(v1, v2)
10433 v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
10434 v3.AuxInt = int32ToAuxInt(0)
10435 v.AddArg2(v0, v3)
10436 return true
10437 }
10438 break
10439 }
10440
10441
10442
10443 for {
10444 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10445 s := v_0
10446 if s.Op != OpSub8 {
10447 continue
10448 }
10449 y := s.Args[1]
10450 x := s.Args[0]
10451 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(s.Uses == 1) {
10452 continue
10453 }
10454 v.reset(OpEq8)
10455 v.AddArg2(x, y)
10456 return true
10457 }
10458 break
10459 }
10460
10461
10462
10463 for {
10464 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10465 if v_0.Op != OpAnd8 {
10466 continue
10467 }
10468 t := v_0.Type
10469 _ = v_0.Args[1]
10470 v_0_0 := v_0.Args[0]
10471 v_0_1 := v_0.Args[1]
10472 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
10473 x := v_0_0
10474 if v_0_1.Op != OpConst8 || v_0_1.Type != t {
10475 continue
10476 }
10477 y := auxIntToInt8(v_0_1.AuxInt)
10478 if v_1.Op != OpConst8 || v_1.Type != t || auxIntToInt8(v_1.AuxInt) != y || !(oneBit(y)) {
10479 continue
10480 }
10481 v.reset(OpNeq8)
10482 v0 := b.NewValue0(v.Pos, OpAnd8, t)
10483 v1 := b.NewValue0(v.Pos, OpConst8, t)
10484 v1.AuxInt = int8ToAuxInt(y)
10485 v0.AddArg2(x, v1)
10486 v2 := b.NewValue0(v.Pos, OpConst8, t)
10487 v2.AuxInt = int8ToAuxInt(0)
10488 v.AddArg2(v0, v2)
10489 return true
10490 }
10491 }
10492 break
10493 }
10494
10495
10496 for {
10497 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10498 if v_0.Op != OpCvtBoolToUint8 {
10499 continue
10500 }
10501 x := v_0.Args[0]
10502 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 1 {
10503 continue
10504 }
10505 v.copyOf(x)
10506 return true
10507 }
10508 break
10509 }
10510
10511
10512 for {
10513 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10514 if v_0.Op != OpCvtBoolToUint8 {
10515 continue
10516 }
10517 x := v_0.Args[0]
10518 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
10519 continue
10520 }
10521 v.reset(OpNot)
10522 v.AddArg(x)
10523 return true
10524 }
10525 break
10526 }
10527 return false
10528 }
10529 func rewriteValuegeneric_OpEqB(v *Value) bool {
10530 v_1 := v.Args[1]
10531 v_0 := v.Args[0]
10532
10533
10534 for {
10535 x := v_0
10536 if x != v_1 {
10537 break
10538 }
10539 v.reset(OpConstBool)
10540 v.AuxInt = boolToAuxInt(true)
10541 return true
10542 }
10543
10544
10545 for {
10546 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10547 if v_0.Op != OpConstBool {
10548 continue
10549 }
10550 c := auxIntToBool(v_0.AuxInt)
10551 if v_1.Op != OpConstBool {
10552 continue
10553 }
10554 d := auxIntToBool(v_1.AuxInt)
10555 v.reset(OpConstBool)
10556 v.AuxInt = boolToAuxInt(c == d)
10557 return true
10558 }
10559 break
10560 }
10561
10562
10563 for {
10564 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10565 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
10566 continue
10567 }
10568 x := v_1
10569 v.reset(OpNot)
10570 v.AddArg(x)
10571 return true
10572 }
10573 break
10574 }
10575
10576
10577 for {
10578 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10579 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
10580 continue
10581 }
10582 x := v_1
10583 v.copyOf(x)
10584 return true
10585 }
10586 break
10587 }
10588
10589
10590 for {
10591 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10592 if v_0.Op != OpNot {
10593 continue
10594 }
10595 x := v_0.Args[0]
10596 y := v_1
10597 v.reset(OpNeqB)
10598 v.AddArg2(x, y)
10599 return true
10600 }
10601 break
10602 }
10603 return false
10604 }
10605 func rewriteValuegeneric_OpEqInter(v *Value) bool {
10606 v_1 := v.Args[1]
10607 v_0 := v.Args[0]
10608 b := v.Block
10609 typ := &b.Func.Config.Types
10610
10611
10612 for {
10613 x := v_0
10614 y := v_1
10615 v.reset(OpEqPtr)
10616 v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
10617 v0.AddArg(x)
10618 v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
10619 v1.AddArg(y)
10620 v.AddArg2(v0, v1)
10621 return true
10622 }
10623 }
10624 func rewriteValuegeneric_OpEqPtr(v *Value) bool {
10625 v_1 := v.Args[1]
10626 v_0 := v.Args[0]
10627 b := v.Block
10628 typ := &b.Func.Config.Types
10629
10630
10631 for {
10632 x := v_0
10633 if x != v_1 {
10634 break
10635 }
10636 v.reset(OpConstBool)
10637 v.AuxInt = boolToAuxInt(true)
10638 return true
10639 }
10640
10641
10642 for {
10643 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10644 if v_0.Op != OpAddr {
10645 continue
10646 }
10647 x := auxToSym(v_0.Aux)
10648 if v_1.Op != OpAddr {
10649 continue
10650 }
10651 y := auxToSym(v_1.Aux)
10652 v.reset(OpConstBool)
10653 v.AuxInt = boolToAuxInt(x == y)
10654 return true
10655 }
10656 break
10657 }
10658
10659
10660 for {
10661 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10662 if v_0.Op != OpAddr {
10663 continue
10664 }
10665 x := auxToSym(v_0.Aux)
10666 if v_1.Op != OpOffPtr {
10667 continue
10668 }
10669 o := auxIntToInt64(v_1.AuxInt)
10670 v_1_0 := v_1.Args[0]
10671 if v_1_0.Op != OpAddr {
10672 continue
10673 }
10674 y := auxToSym(v_1_0.Aux)
10675 v.reset(OpConstBool)
10676 v.AuxInt = boolToAuxInt(x == y && o == 0)
10677 return true
10678 }
10679 break
10680 }
10681
10682
10683 for {
10684 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10685 if v_0.Op != OpOffPtr {
10686 continue
10687 }
10688 o1 := auxIntToInt64(v_0.AuxInt)
10689 v_0_0 := v_0.Args[0]
10690 if v_0_0.Op != OpAddr {
10691 continue
10692 }
10693 x := auxToSym(v_0_0.Aux)
10694 if v_1.Op != OpOffPtr {
10695 continue
10696 }
10697 o2 := auxIntToInt64(v_1.AuxInt)
10698 v_1_0 := v_1.Args[0]
10699 if v_1_0.Op != OpAddr {
10700 continue
10701 }
10702 y := auxToSym(v_1_0.Aux)
10703 v.reset(OpConstBool)
10704 v.AuxInt = boolToAuxInt(x == y && o1 == o2)
10705 return true
10706 }
10707 break
10708 }
10709
10710
10711 for {
10712 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10713 if v_0.Op != OpLocalAddr {
10714 continue
10715 }
10716 x := auxToSym(v_0.Aux)
10717 if v_1.Op != OpLocalAddr {
10718 continue
10719 }
10720 y := auxToSym(v_1.Aux)
10721 v.reset(OpConstBool)
10722 v.AuxInt = boolToAuxInt(x == y)
10723 return true
10724 }
10725 break
10726 }
10727
10728
10729 for {
10730 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10731 if v_0.Op != OpLocalAddr {
10732 continue
10733 }
10734 x := auxToSym(v_0.Aux)
10735 if v_1.Op != OpOffPtr {
10736 continue
10737 }
10738 o := auxIntToInt64(v_1.AuxInt)
10739 v_1_0 := v_1.Args[0]
10740 if v_1_0.Op != OpLocalAddr {
10741 continue
10742 }
10743 y := auxToSym(v_1_0.Aux)
10744 v.reset(OpConstBool)
10745 v.AuxInt = boolToAuxInt(x == y && o == 0)
10746 return true
10747 }
10748 break
10749 }
10750
10751
10752 for {
10753 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10754 if v_0.Op != OpOffPtr {
10755 continue
10756 }
10757 o1 := auxIntToInt64(v_0.AuxInt)
10758 v_0_0 := v_0.Args[0]
10759 if v_0_0.Op != OpLocalAddr {
10760 continue
10761 }
10762 x := auxToSym(v_0_0.Aux)
10763 if v_1.Op != OpOffPtr {
10764 continue
10765 }
10766 o2 := auxIntToInt64(v_1.AuxInt)
10767 v_1_0 := v_1.Args[0]
10768 if v_1_0.Op != OpLocalAddr {
10769 continue
10770 }
10771 y := auxToSym(v_1_0.Aux)
10772 v.reset(OpConstBool)
10773 v.AuxInt = boolToAuxInt(x == y && o1 == o2)
10774 return true
10775 }
10776 break
10777 }
10778
10779
10780
10781 for {
10782 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10783 if v_0.Op != OpOffPtr {
10784 continue
10785 }
10786 o1 := auxIntToInt64(v_0.AuxInt)
10787 p1 := v_0.Args[0]
10788 p2 := v_1
10789 if !(isSamePtr(p1, p2)) {
10790 continue
10791 }
10792 v.reset(OpConstBool)
10793 v.AuxInt = boolToAuxInt(o1 == 0)
10794 return true
10795 }
10796 break
10797 }
10798
10799
10800
10801 for {
10802 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10803 if v_0.Op != OpOffPtr {
10804 continue
10805 }
10806 o1 := auxIntToInt64(v_0.AuxInt)
10807 p1 := v_0.Args[0]
10808 if v_1.Op != OpOffPtr {
10809 continue
10810 }
10811 o2 := auxIntToInt64(v_1.AuxInt)
10812 p2 := v_1.Args[0]
10813 if !(isSamePtr(p1, p2)) {
10814 continue
10815 }
10816 v.reset(OpConstBool)
10817 v.AuxInt = boolToAuxInt(o1 == o2)
10818 return true
10819 }
10820 break
10821 }
10822
10823
10824 for {
10825 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10826 if v_0.Op != OpConst32 {
10827 continue
10828 }
10829 c := auxIntToInt32(v_0.AuxInt)
10830 if v_1.Op != OpConst32 {
10831 continue
10832 }
10833 d := auxIntToInt32(v_1.AuxInt)
10834 v.reset(OpConstBool)
10835 v.AuxInt = boolToAuxInt(c == d)
10836 return true
10837 }
10838 break
10839 }
10840
10841
10842 for {
10843 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10844 if v_0.Op != OpConst64 {
10845 continue
10846 }
10847 c := auxIntToInt64(v_0.AuxInt)
10848 if v_1.Op != OpConst64 {
10849 continue
10850 }
10851 d := auxIntToInt64(v_1.AuxInt)
10852 v.reset(OpConstBool)
10853 v.AuxInt = boolToAuxInt(c == d)
10854 return true
10855 }
10856 break
10857 }
10858
10859
10860 for {
10861 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10862 if v_0.Op != OpConvert {
10863 continue
10864 }
10865 v_0_0 := v_0.Args[0]
10866 if v_0_0.Op != OpAddr {
10867 continue
10868 }
10869 x := auxToSym(v_0_0.Aux)
10870 if v_1.Op != OpAddr {
10871 continue
10872 }
10873 y := auxToSym(v_1.Aux)
10874 v.reset(OpConstBool)
10875 v.AuxInt = boolToAuxInt(x == y)
10876 return true
10877 }
10878 break
10879 }
10880
10881
10882 for {
10883 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10884 if v_0.Op != OpLocalAddr || v_1.Op != OpAddr {
10885 continue
10886 }
10887 v.reset(OpConstBool)
10888 v.AuxInt = boolToAuxInt(false)
10889 return true
10890 }
10891 break
10892 }
10893
10894
10895 for {
10896 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10897 if v_0.Op != OpOffPtr {
10898 continue
10899 }
10900 v_0_0 := v_0.Args[0]
10901 if v_0_0.Op != OpLocalAddr || v_1.Op != OpAddr {
10902 continue
10903 }
10904 v.reset(OpConstBool)
10905 v.AuxInt = boolToAuxInt(false)
10906 return true
10907 }
10908 break
10909 }
10910
10911
10912 for {
10913 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10914 if v_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
10915 continue
10916 }
10917 v_1_0 := v_1.Args[0]
10918 if v_1_0.Op != OpAddr {
10919 continue
10920 }
10921 v.reset(OpConstBool)
10922 v.AuxInt = boolToAuxInt(false)
10923 return true
10924 }
10925 break
10926 }
10927
10928
10929 for {
10930 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10931 if v_0.Op != OpOffPtr {
10932 continue
10933 }
10934 v_0_0 := v_0.Args[0]
10935 if v_0_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
10936 continue
10937 }
10938 v_1_0 := v_1.Args[0]
10939 if v_1_0.Op != OpAddr {
10940 continue
10941 }
10942 v.reset(OpConstBool)
10943 v.AuxInt = boolToAuxInt(false)
10944 return true
10945 }
10946 break
10947 }
10948
10949
10950
10951 for {
10952 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10953 if v_0.Op != OpAddPtr {
10954 continue
10955 }
10956 o1 := v_0.Args[1]
10957 p1 := v_0.Args[0]
10958 p2 := v_1
10959 if !(isSamePtr(p1, p2)) {
10960 continue
10961 }
10962 v.reset(OpNot)
10963 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
10964 v0.AddArg(o1)
10965 v.AddArg(v0)
10966 return true
10967 }
10968 break
10969 }
10970
10971
10972 for {
10973 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10974 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
10975 continue
10976 }
10977 p := v_1
10978 v.reset(OpNot)
10979 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
10980 v0.AddArg(p)
10981 v.AddArg(v0)
10982 return true
10983 }
10984 break
10985 }
10986
10987
10988 for {
10989 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
10990 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
10991 continue
10992 }
10993 p := v_1
10994 v.reset(OpNot)
10995 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
10996 v0.AddArg(p)
10997 v.AddArg(v0)
10998 return true
10999 }
11000 break
11001 }
11002
11003
11004 for {
11005 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11006 if v_0.Op != OpConstNil {
11007 continue
11008 }
11009 p := v_1
11010 v.reset(OpNot)
11011 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
11012 v0.AddArg(p)
11013 v.AddArg(v0)
11014 return true
11015 }
11016 break
11017 }
11018 return false
11019 }
11020 func rewriteValuegeneric_OpEqSlice(v *Value) bool {
11021 v_1 := v.Args[1]
11022 v_0 := v.Args[0]
11023 b := v.Block
11024 typ := &b.Func.Config.Types
11025
11026
11027 for {
11028 x := v_0
11029 y := v_1
11030 v.reset(OpEqPtr)
11031 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
11032 v0.AddArg(x)
11033 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
11034 v1.AddArg(y)
11035 v.AddArg2(v0, v1)
11036 return true
11037 }
11038 }
11039 func rewriteValuegeneric_OpFloor(v *Value) bool {
11040 v_0 := v.Args[0]
11041
11042
11043 for {
11044 if v_0.Op != OpConst64F {
11045 break
11046 }
11047 c := auxIntToFloat64(v_0.AuxInt)
11048 v.reset(OpConst64F)
11049 v.AuxInt = float64ToAuxInt(math.Floor(c))
11050 return true
11051 }
11052 return false
11053 }
11054 func rewriteValuegeneric_OpIMake(v *Value) bool {
11055 v_1 := v.Args[1]
11056 v_0 := v.Args[0]
11057
11058
11059 for {
11060 if v_1.Op != OpStructMake {
11061 break
11062 }
11063 v.copyOf(imakeOfStructMake(v))
11064 return true
11065 }
11066
11067
11068 for {
11069 _typ := v_0
11070 if v_1.Op != OpArrayMake1 {
11071 break
11072 }
11073 val := v_1.Args[0]
11074 v.reset(OpIMake)
11075 v.AddArg2(_typ, val)
11076 return true
11077 }
11078 return false
11079 }
11080 func rewriteValuegeneric_OpInterLECall(v *Value) bool {
11081
11082
11083 for {
11084 if len(v.Args) < 1 {
11085 break
11086 }
11087 v_0 := v.Args[0]
11088 if v_0.Op != OpAddr {
11089 break
11090 }
11091 fn := auxToSym(v_0.Aux)
11092 v_0_0 := v_0.Args[0]
11093 if v_0_0.Op != OpSB {
11094 break
11095 }
11096 v.copyOf(devirtLECall(v, fn.(*obj.LSym)))
11097 return true
11098 }
11099 return false
11100 }
11101 func rewriteValuegeneric_OpIsInBounds(v *Value) bool {
11102 v_1 := v.Args[1]
11103 v_0 := v.Args[0]
11104
11105
11106
11107 for {
11108 if v_0.Op != OpZeroExt8to32 || v_1.Op != OpConst32 {
11109 break
11110 }
11111 c := auxIntToInt32(v_1.AuxInt)
11112 if !((1 << 8) <= c) {
11113 break
11114 }
11115 v.reset(OpConstBool)
11116 v.AuxInt = boolToAuxInt(true)
11117 return true
11118 }
11119
11120
11121
11122 for {
11123 if v_0.Op != OpZeroExt8to64 || v_1.Op != OpConst64 {
11124 break
11125 }
11126 c := auxIntToInt64(v_1.AuxInt)
11127 if !((1 << 8) <= c) {
11128 break
11129 }
11130 v.reset(OpConstBool)
11131 v.AuxInt = boolToAuxInt(true)
11132 return true
11133 }
11134
11135
11136
11137 for {
11138 if v_0.Op != OpZeroExt16to32 || v_1.Op != OpConst32 {
11139 break
11140 }
11141 c := auxIntToInt32(v_1.AuxInt)
11142 if !((1 << 16) <= c) {
11143 break
11144 }
11145 v.reset(OpConstBool)
11146 v.AuxInt = boolToAuxInt(true)
11147 return true
11148 }
11149
11150
11151
11152 for {
11153 if v_0.Op != OpZeroExt16to64 || v_1.Op != OpConst64 {
11154 break
11155 }
11156 c := auxIntToInt64(v_1.AuxInt)
11157 if !((1 << 16) <= c) {
11158 break
11159 }
11160 v.reset(OpConstBool)
11161 v.AuxInt = boolToAuxInt(true)
11162 return true
11163 }
11164
11165
11166 for {
11167 x := v_0
11168 if x != v_1 {
11169 break
11170 }
11171 v.reset(OpConstBool)
11172 v.AuxInt = boolToAuxInt(false)
11173 return true
11174 }
11175
11176
11177
11178 for {
11179 if v_0.Op != OpAnd8 {
11180 break
11181 }
11182 v_0_0 := v_0.Args[0]
11183 v_0_1 := v_0.Args[1]
11184 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
11185 if v_0_0.Op != OpConst8 {
11186 continue
11187 }
11188 c := auxIntToInt8(v_0_0.AuxInt)
11189 if v_1.Op != OpConst8 {
11190 continue
11191 }
11192 d := auxIntToInt8(v_1.AuxInt)
11193 if !(0 <= c && c < d) {
11194 continue
11195 }
11196 v.reset(OpConstBool)
11197 v.AuxInt = boolToAuxInt(true)
11198 return true
11199 }
11200 break
11201 }
11202
11203
11204
11205 for {
11206 if v_0.Op != OpZeroExt8to16 {
11207 break
11208 }
11209 v_0_0 := v_0.Args[0]
11210 if v_0_0.Op != OpAnd8 {
11211 break
11212 }
11213 v_0_0_0 := v_0_0.Args[0]
11214 v_0_0_1 := v_0_0.Args[1]
11215 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
11216 if v_0_0_0.Op != OpConst8 {
11217 continue
11218 }
11219 c := auxIntToInt8(v_0_0_0.AuxInt)
11220 if v_1.Op != OpConst16 {
11221 continue
11222 }
11223 d := auxIntToInt16(v_1.AuxInt)
11224 if !(0 <= c && int16(c) < d) {
11225 continue
11226 }
11227 v.reset(OpConstBool)
11228 v.AuxInt = boolToAuxInt(true)
11229 return true
11230 }
11231 break
11232 }
11233
11234
11235
11236 for {
11237 if v_0.Op != OpZeroExt8to32 {
11238 break
11239 }
11240 v_0_0 := v_0.Args[0]
11241 if v_0_0.Op != OpAnd8 {
11242 break
11243 }
11244 v_0_0_0 := v_0_0.Args[0]
11245 v_0_0_1 := v_0_0.Args[1]
11246 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
11247 if v_0_0_0.Op != OpConst8 {
11248 continue
11249 }
11250 c := auxIntToInt8(v_0_0_0.AuxInt)
11251 if v_1.Op != OpConst32 {
11252 continue
11253 }
11254 d := auxIntToInt32(v_1.AuxInt)
11255 if !(0 <= c && int32(c) < d) {
11256 continue
11257 }
11258 v.reset(OpConstBool)
11259 v.AuxInt = boolToAuxInt(true)
11260 return true
11261 }
11262 break
11263 }
11264
11265
11266
11267 for {
11268 if v_0.Op != OpZeroExt8to64 {
11269 break
11270 }
11271 v_0_0 := v_0.Args[0]
11272 if v_0_0.Op != OpAnd8 {
11273 break
11274 }
11275 v_0_0_0 := v_0_0.Args[0]
11276 v_0_0_1 := v_0_0.Args[1]
11277 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
11278 if v_0_0_0.Op != OpConst8 {
11279 continue
11280 }
11281 c := auxIntToInt8(v_0_0_0.AuxInt)
11282 if v_1.Op != OpConst64 {
11283 continue
11284 }
11285 d := auxIntToInt64(v_1.AuxInt)
11286 if !(0 <= c && int64(c) < d) {
11287 continue
11288 }
11289 v.reset(OpConstBool)
11290 v.AuxInt = boolToAuxInt(true)
11291 return true
11292 }
11293 break
11294 }
11295
11296
11297
11298 for {
11299 if v_0.Op != OpAnd16 {
11300 break
11301 }
11302 v_0_0 := v_0.Args[0]
11303 v_0_1 := v_0.Args[1]
11304 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
11305 if v_0_0.Op != OpConst16 {
11306 continue
11307 }
11308 c := auxIntToInt16(v_0_0.AuxInt)
11309 if v_1.Op != OpConst16 {
11310 continue
11311 }
11312 d := auxIntToInt16(v_1.AuxInt)
11313 if !(0 <= c && c < d) {
11314 continue
11315 }
11316 v.reset(OpConstBool)
11317 v.AuxInt = boolToAuxInt(true)
11318 return true
11319 }
11320 break
11321 }
11322
11323
11324
11325 for {
11326 if v_0.Op != OpZeroExt16to32 {
11327 break
11328 }
11329 v_0_0 := v_0.Args[0]
11330 if v_0_0.Op != OpAnd16 {
11331 break
11332 }
11333 v_0_0_0 := v_0_0.Args[0]
11334 v_0_0_1 := v_0_0.Args[1]
11335 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
11336 if v_0_0_0.Op != OpConst16 {
11337 continue
11338 }
11339 c := auxIntToInt16(v_0_0_0.AuxInt)
11340 if v_1.Op != OpConst32 {
11341 continue
11342 }
11343 d := auxIntToInt32(v_1.AuxInt)
11344 if !(0 <= c && int32(c) < d) {
11345 continue
11346 }
11347 v.reset(OpConstBool)
11348 v.AuxInt = boolToAuxInt(true)
11349 return true
11350 }
11351 break
11352 }
11353
11354
11355
11356 for {
11357 if v_0.Op != OpZeroExt16to64 {
11358 break
11359 }
11360 v_0_0 := v_0.Args[0]
11361 if v_0_0.Op != OpAnd16 {
11362 break
11363 }
11364 v_0_0_0 := v_0_0.Args[0]
11365 v_0_0_1 := v_0_0.Args[1]
11366 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
11367 if v_0_0_0.Op != OpConst16 {
11368 continue
11369 }
11370 c := auxIntToInt16(v_0_0_0.AuxInt)
11371 if v_1.Op != OpConst64 {
11372 continue
11373 }
11374 d := auxIntToInt64(v_1.AuxInt)
11375 if !(0 <= c && int64(c) < d) {
11376 continue
11377 }
11378 v.reset(OpConstBool)
11379 v.AuxInt = boolToAuxInt(true)
11380 return true
11381 }
11382 break
11383 }
11384
11385
11386
11387 for {
11388 if v_0.Op != OpAnd32 {
11389 break
11390 }
11391 v_0_0 := v_0.Args[0]
11392 v_0_1 := v_0.Args[1]
11393 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
11394 if v_0_0.Op != OpConst32 {
11395 continue
11396 }
11397 c := auxIntToInt32(v_0_0.AuxInt)
11398 if v_1.Op != OpConst32 {
11399 continue
11400 }
11401 d := auxIntToInt32(v_1.AuxInt)
11402 if !(0 <= c && c < d) {
11403 continue
11404 }
11405 v.reset(OpConstBool)
11406 v.AuxInt = boolToAuxInt(true)
11407 return true
11408 }
11409 break
11410 }
11411
11412
11413
11414 for {
11415 if v_0.Op != OpZeroExt32to64 {
11416 break
11417 }
11418 v_0_0 := v_0.Args[0]
11419 if v_0_0.Op != OpAnd32 {
11420 break
11421 }
11422 v_0_0_0 := v_0_0.Args[0]
11423 v_0_0_1 := v_0_0.Args[1]
11424 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
11425 if v_0_0_0.Op != OpConst32 {
11426 continue
11427 }
11428 c := auxIntToInt32(v_0_0_0.AuxInt)
11429 if v_1.Op != OpConst64 {
11430 continue
11431 }
11432 d := auxIntToInt64(v_1.AuxInt)
11433 if !(0 <= c && int64(c) < d) {
11434 continue
11435 }
11436 v.reset(OpConstBool)
11437 v.AuxInt = boolToAuxInt(true)
11438 return true
11439 }
11440 break
11441 }
11442
11443
11444
11445 for {
11446 if v_0.Op != OpAnd64 {
11447 break
11448 }
11449 v_0_0 := v_0.Args[0]
11450 v_0_1 := v_0.Args[1]
11451 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
11452 if v_0_0.Op != OpConst64 {
11453 continue
11454 }
11455 c := auxIntToInt64(v_0_0.AuxInt)
11456 if v_1.Op != OpConst64 {
11457 continue
11458 }
11459 d := auxIntToInt64(v_1.AuxInt)
11460 if !(0 <= c && c < d) {
11461 continue
11462 }
11463 v.reset(OpConstBool)
11464 v.AuxInt = boolToAuxInt(true)
11465 return true
11466 }
11467 break
11468 }
11469
11470
11471 for {
11472 if v_0.Op != OpConst32 {
11473 break
11474 }
11475 c := auxIntToInt32(v_0.AuxInt)
11476 if v_1.Op != OpConst32 {
11477 break
11478 }
11479 d := auxIntToInt32(v_1.AuxInt)
11480 v.reset(OpConstBool)
11481 v.AuxInt = boolToAuxInt(0 <= c && c < d)
11482 return true
11483 }
11484
11485
11486 for {
11487 if v_0.Op != OpConst64 {
11488 break
11489 }
11490 c := auxIntToInt64(v_0.AuxInt)
11491 if v_1.Op != OpConst64 {
11492 break
11493 }
11494 d := auxIntToInt64(v_1.AuxInt)
11495 v.reset(OpConstBool)
11496 v.AuxInt = boolToAuxInt(0 <= c && c < d)
11497 return true
11498 }
11499
11500
11501 for {
11502 if v_0.Op != OpMod32u {
11503 break
11504 }
11505 y := v_0.Args[1]
11506 if y != v_1 {
11507 break
11508 }
11509 v.reset(OpConstBool)
11510 v.AuxInt = boolToAuxInt(true)
11511 return true
11512 }
11513
11514
11515 for {
11516 if v_0.Op != OpMod64u {
11517 break
11518 }
11519 y := v_0.Args[1]
11520 if y != v_1 {
11521 break
11522 }
11523 v.reset(OpConstBool)
11524 v.AuxInt = boolToAuxInt(true)
11525 return true
11526 }
11527
11528
11529
11530 for {
11531 if v_0.Op != OpZeroExt8to64 {
11532 break
11533 }
11534 v_0_0 := v_0.Args[0]
11535 if v_0_0.Op != OpRsh8Ux64 {
11536 break
11537 }
11538 _ = v_0_0.Args[1]
11539 v_0_0_1 := v_0_0.Args[1]
11540 if v_0_0_1.Op != OpConst64 {
11541 break
11542 }
11543 c := auxIntToInt64(v_0_0_1.AuxInt)
11544 if v_1.Op != OpConst64 {
11545 break
11546 }
11547 d := auxIntToInt64(v_1.AuxInt)
11548 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
11549 break
11550 }
11551 v.reset(OpConstBool)
11552 v.AuxInt = boolToAuxInt(true)
11553 return true
11554 }
11555
11556
11557
11558 for {
11559 if v_0.Op != OpZeroExt8to32 {
11560 break
11561 }
11562 v_0_0 := v_0.Args[0]
11563 if v_0_0.Op != OpRsh8Ux64 {
11564 break
11565 }
11566 _ = v_0_0.Args[1]
11567 v_0_0_1 := v_0_0.Args[1]
11568 if v_0_0_1.Op != OpConst64 {
11569 break
11570 }
11571 c := auxIntToInt64(v_0_0_1.AuxInt)
11572 if v_1.Op != OpConst32 {
11573 break
11574 }
11575 d := auxIntToInt32(v_1.AuxInt)
11576 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
11577 break
11578 }
11579 v.reset(OpConstBool)
11580 v.AuxInt = boolToAuxInt(true)
11581 return true
11582 }
11583
11584
11585
11586 for {
11587 if v_0.Op != OpZeroExt8to16 {
11588 break
11589 }
11590 v_0_0 := v_0.Args[0]
11591 if v_0_0.Op != OpRsh8Ux64 {
11592 break
11593 }
11594 _ = v_0_0.Args[1]
11595 v_0_0_1 := v_0_0.Args[1]
11596 if v_0_0_1.Op != OpConst64 {
11597 break
11598 }
11599 c := auxIntToInt64(v_0_0_1.AuxInt)
11600 if v_1.Op != OpConst16 {
11601 break
11602 }
11603 d := auxIntToInt16(v_1.AuxInt)
11604 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
11605 break
11606 }
11607 v.reset(OpConstBool)
11608 v.AuxInt = boolToAuxInt(true)
11609 return true
11610 }
11611
11612
11613
11614 for {
11615 if v_0.Op != OpRsh8Ux64 {
11616 break
11617 }
11618 _ = v_0.Args[1]
11619 v_0_1 := v_0.Args[1]
11620 if v_0_1.Op != OpConst64 {
11621 break
11622 }
11623 c := auxIntToInt64(v_0_1.AuxInt)
11624 if v_1.Op != OpConst64 {
11625 break
11626 }
11627 d := auxIntToInt64(v_1.AuxInt)
11628 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
11629 break
11630 }
11631 v.reset(OpConstBool)
11632 v.AuxInt = boolToAuxInt(true)
11633 return true
11634 }
11635
11636
11637
11638 for {
11639 if v_0.Op != OpZeroExt16to64 {
11640 break
11641 }
11642 v_0_0 := v_0.Args[0]
11643 if v_0_0.Op != OpRsh16Ux64 {
11644 break
11645 }
11646 _ = v_0_0.Args[1]
11647 v_0_0_1 := v_0_0.Args[1]
11648 if v_0_0_1.Op != OpConst64 {
11649 break
11650 }
11651 c := auxIntToInt64(v_0_0_1.AuxInt)
11652 if v_1.Op != OpConst64 {
11653 break
11654 }
11655 d := auxIntToInt64(v_1.AuxInt)
11656 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
11657 break
11658 }
11659 v.reset(OpConstBool)
11660 v.AuxInt = boolToAuxInt(true)
11661 return true
11662 }
11663
11664
11665
11666 for {
11667 if v_0.Op != OpZeroExt16to32 {
11668 break
11669 }
11670 v_0_0 := v_0.Args[0]
11671 if v_0_0.Op != OpRsh16Ux64 {
11672 break
11673 }
11674 _ = v_0_0.Args[1]
11675 v_0_0_1 := v_0_0.Args[1]
11676 if v_0_0_1.Op != OpConst64 {
11677 break
11678 }
11679 c := auxIntToInt64(v_0_0_1.AuxInt)
11680 if v_1.Op != OpConst64 {
11681 break
11682 }
11683 d := auxIntToInt64(v_1.AuxInt)
11684 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
11685 break
11686 }
11687 v.reset(OpConstBool)
11688 v.AuxInt = boolToAuxInt(true)
11689 return true
11690 }
11691
11692
11693
11694 for {
11695 if v_0.Op != OpRsh16Ux64 {
11696 break
11697 }
11698 _ = v_0.Args[1]
11699 v_0_1 := v_0.Args[1]
11700 if v_0_1.Op != OpConst64 {
11701 break
11702 }
11703 c := auxIntToInt64(v_0_1.AuxInt)
11704 if v_1.Op != OpConst64 {
11705 break
11706 }
11707 d := auxIntToInt64(v_1.AuxInt)
11708 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
11709 break
11710 }
11711 v.reset(OpConstBool)
11712 v.AuxInt = boolToAuxInt(true)
11713 return true
11714 }
11715
11716
11717
11718 for {
11719 if v_0.Op != OpZeroExt32to64 {
11720 break
11721 }
11722 v_0_0 := v_0.Args[0]
11723 if v_0_0.Op != OpRsh32Ux64 {
11724 break
11725 }
11726 _ = v_0_0.Args[1]
11727 v_0_0_1 := v_0_0.Args[1]
11728 if v_0_0_1.Op != OpConst64 {
11729 break
11730 }
11731 c := auxIntToInt64(v_0_0_1.AuxInt)
11732 if v_1.Op != OpConst64 {
11733 break
11734 }
11735 d := auxIntToInt64(v_1.AuxInt)
11736 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) {
11737 break
11738 }
11739 v.reset(OpConstBool)
11740 v.AuxInt = boolToAuxInt(true)
11741 return true
11742 }
11743
11744
11745
11746 for {
11747 if v_0.Op != OpRsh32Ux64 {
11748 break
11749 }
11750 _ = v_0.Args[1]
11751 v_0_1 := v_0.Args[1]
11752 if v_0_1.Op != OpConst64 {
11753 break
11754 }
11755 c := auxIntToInt64(v_0_1.AuxInt)
11756 if v_1.Op != OpConst64 {
11757 break
11758 }
11759 d := auxIntToInt64(v_1.AuxInt)
11760 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) {
11761 break
11762 }
11763 v.reset(OpConstBool)
11764 v.AuxInt = boolToAuxInt(true)
11765 return true
11766 }
11767
11768
11769
11770 for {
11771 if v_0.Op != OpRsh64Ux64 {
11772 break
11773 }
11774 _ = v_0.Args[1]
11775 v_0_1 := v_0.Args[1]
11776 if v_0_1.Op != OpConst64 {
11777 break
11778 }
11779 c := auxIntToInt64(v_0_1.AuxInt)
11780 if v_1.Op != OpConst64 {
11781 break
11782 }
11783 d := auxIntToInt64(v_1.AuxInt)
11784 if !(0 < c && c < 64 && 1<<uint(64-c)-1 < d) {
11785 break
11786 }
11787 v.reset(OpConstBool)
11788 v.AuxInt = boolToAuxInt(true)
11789 return true
11790 }
11791 return false
11792 }
11793 func rewriteValuegeneric_OpIsNonNil(v *Value) bool {
11794 v_0 := v.Args[0]
11795
11796
11797 for {
11798 if v_0.Op != OpConstNil {
11799 break
11800 }
11801 v.reset(OpConstBool)
11802 v.AuxInt = boolToAuxInt(false)
11803 return true
11804 }
11805
11806
11807 for {
11808 if v_0.Op != OpConst32 {
11809 break
11810 }
11811 c := auxIntToInt32(v_0.AuxInt)
11812 v.reset(OpConstBool)
11813 v.AuxInt = boolToAuxInt(c != 0)
11814 return true
11815 }
11816
11817
11818 for {
11819 if v_0.Op != OpConst64 {
11820 break
11821 }
11822 c := auxIntToInt64(v_0.AuxInt)
11823 v.reset(OpConstBool)
11824 v.AuxInt = boolToAuxInt(c != 0)
11825 return true
11826 }
11827
11828
11829 for {
11830 if v_0.Op != OpAddr {
11831 break
11832 }
11833 v.reset(OpConstBool)
11834 v.AuxInt = boolToAuxInt(true)
11835 return true
11836 }
11837
11838
11839 for {
11840 if v_0.Op != OpConvert {
11841 break
11842 }
11843 v_0_0 := v_0.Args[0]
11844 if v_0_0.Op != OpAddr {
11845 break
11846 }
11847 v.reset(OpConstBool)
11848 v.AuxInt = boolToAuxInt(true)
11849 return true
11850 }
11851
11852
11853 for {
11854 if v_0.Op != OpLocalAddr {
11855 break
11856 }
11857 v.reset(OpConstBool)
11858 v.AuxInt = boolToAuxInt(true)
11859 return true
11860 }
11861 return false
11862 }
11863 func rewriteValuegeneric_OpIsSliceInBounds(v *Value) bool {
11864 v_1 := v.Args[1]
11865 v_0 := v.Args[0]
11866
11867
11868 for {
11869 x := v_0
11870 if x != v_1 {
11871 break
11872 }
11873 v.reset(OpConstBool)
11874 v.AuxInt = boolToAuxInt(true)
11875 return true
11876 }
11877
11878
11879
11880 for {
11881 if v_0.Op != OpAnd32 {
11882 break
11883 }
11884 v_0_0 := v_0.Args[0]
11885 v_0_1 := v_0.Args[1]
11886 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
11887 if v_0_0.Op != OpConst32 {
11888 continue
11889 }
11890 c := auxIntToInt32(v_0_0.AuxInt)
11891 if v_1.Op != OpConst32 {
11892 continue
11893 }
11894 d := auxIntToInt32(v_1.AuxInt)
11895 if !(0 <= c && c <= d) {
11896 continue
11897 }
11898 v.reset(OpConstBool)
11899 v.AuxInt = boolToAuxInt(true)
11900 return true
11901 }
11902 break
11903 }
11904
11905
11906
11907 for {
11908 if v_0.Op != OpAnd64 {
11909 break
11910 }
11911 v_0_0 := v_0.Args[0]
11912 v_0_1 := v_0.Args[1]
11913 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
11914 if v_0_0.Op != OpConst64 {
11915 continue
11916 }
11917 c := auxIntToInt64(v_0_0.AuxInt)
11918 if v_1.Op != OpConst64 {
11919 continue
11920 }
11921 d := auxIntToInt64(v_1.AuxInt)
11922 if !(0 <= c && c <= d) {
11923 continue
11924 }
11925 v.reset(OpConstBool)
11926 v.AuxInt = boolToAuxInt(true)
11927 return true
11928 }
11929 break
11930 }
11931
11932
11933 for {
11934 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
11935 break
11936 }
11937 v.reset(OpConstBool)
11938 v.AuxInt = boolToAuxInt(true)
11939 return true
11940 }
11941
11942
11943 for {
11944 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
11945 break
11946 }
11947 v.reset(OpConstBool)
11948 v.AuxInt = boolToAuxInt(true)
11949 return true
11950 }
11951
11952
11953 for {
11954 if v_0.Op != OpConst32 {
11955 break
11956 }
11957 c := auxIntToInt32(v_0.AuxInt)
11958 if v_1.Op != OpConst32 {
11959 break
11960 }
11961 d := auxIntToInt32(v_1.AuxInt)
11962 v.reset(OpConstBool)
11963 v.AuxInt = boolToAuxInt(0 <= c && c <= d)
11964 return true
11965 }
11966
11967
11968 for {
11969 if v_0.Op != OpConst64 {
11970 break
11971 }
11972 c := auxIntToInt64(v_0.AuxInt)
11973 if v_1.Op != OpConst64 {
11974 break
11975 }
11976 d := auxIntToInt64(v_1.AuxInt)
11977 v.reset(OpConstBool)
11978 v.AuxInt = boolToAuxInt(0 <= c && c <= d)
11979 return true
11980 }
11981
11982
11983 for {
11984 if v_0.Op != OpSliceLen {
11985 break
11986 }
11987 x := v_0.Args[0]
11988 if v_1.Op != OpSliceCap || x != v_1.Args[0] {
11989 break
11990 }
11991 v.reset(OpConstBool)
11992 v.AuxInt = boolToAuxInt(true)
11993 return true
11994 }
11995 return false
11996 }
11997 func rewriteValuegeneric_OpLeq16(v *Value) bool {
11998 v_1 := v.Args[1]
11999 v_0 := v.Args[0]
12000 b := v.Block
12001
12002
12003 for {
12004 if v_0.Op != OpConst16 {
12005 break
12006 }
12007 c := auxIntToInt16(v_0.AuxInt)
12008 if v_1.Op != OpConst16 {
12009 break
12010 }
12011 d := auxIntToInt16(v_1.AuxInt)
12012 v.reset(OpConstBool)
12013 v.AuxInt = boolToAuxInt(c <= d)
12014 return true
12015 }
12016
12017
12018
12019 for {
12020 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 || v_1.Op != OpAnd16 {
12021 break
12022 }
12023 _ = v_1.Args[1]
12024 v_1_0 := v_1.Args[0]
12025 v_1_1 := v_1.Args[1]
12026 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
12027 if v_1_1.Op != OpConst16 {
12028 continue
12029 }
12030 c := auxIntToInt16(v_1_1.AuxInt)
12031 if !(c >= 0) {
12032 continue
12033 }
12034 v.reset(OpConstBool)
12035 v.AuxInt = boolToAuxInt(true)
12036 return true
12037 }
12038 break
12039 }
12040
12041
12042
12043 for {
12044 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 || v_1.Op != OpRsh16Ux64 {
12045 break
12046 }
12047 _ = v_1.Args[1]
12048 v_1_1 := v_1.Args[1]
12049 if v_1_1.Op != OpConst64 {
12050 break
12051 }
12052 c := auxIntToInt64(v_1_1.AuxInt)
12053 if !(c > 0) {
12054 break
12055 }
12056 v.reset(OpConstBool)
12057 v.AuxInt = boolToAuxInt(true)
12058 return true
12059 }
12060
12061
12062 for {
12063 x := v_0
12064 if v_1.Op != OpConst16 {
12065 break
12066 }
12067 t := v_1.Type
12068 if auxIntToInt16(v_1.AuxInt) != -1 {
12069 break
12070 }
12071 v.reset(OpLess16)
12072 v0 := b.NewValue0(v.Pos, OpConst16, t)
12073 v0.AuxInt = int16ToAuxInt(0)
12074 v.AddArg2(x, v0)
12075 return true
12076 }
12077
12078
12079 for {
12080 if v_0.Op != OpConst16 {
12081 break
12082 }
12083 t := v_0.Type
12084 if auxIntToInt16(v_0.AuxInt) != 1 {
12085 break
12086 }
12087 x := v_1
12088 v.reset(OpLess16)
12089 v0 := b.NewValue0(v.Pos, OpConst16, t)
12090 v0.AuxInt = int16ToAuxInt(0)
12091 v.AddArg2(v0, x)
12092 return true
12093 }
12094
12095
12096 for {
12097 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != math.MinInt16 {
12098 break
12099 }
12100 v.reset(OpConstBool)
12101 v.AuxInt = boolToAuxInt(true)
12102 return true
12103 }
12104
12105
12106 for {
12107 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != math.MaxInt16 {
12108 break
12109 }
12110 v.reset(OpConstBool)
12111 v.AuxInt = boolToAuxInt(true)
12112 return true
12113 }
12114
12115
12116 for {
12117 x := v_0
12118 c := v_1
12119 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != math.MinInt16 {
12120 break
12121 }
12122 v.reset(OpEq16)
12123 v.AddArg2(x, c)
12124 return true
12125 }
12126
12127
12128 for {
12129 c := v_0
12130 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != math.MaxInt16 {
12131 break
12132 }
12133 x := v_1
12134 v.reset(OpEq16)
12135 v.AddArg2(x, c)
12136 return true
12137 }
12138 return false
12139 }
12140 func rewriteValuegeneric_OpLeq16U(v *Value) bool {
12141 v_1 := v.Args[1]
12142 v_0 := v.Args[0]
12143 b := v.Block
12144
12145
12146 for {
12147 if v_0.Op != OpConst16 {
12148 break
12149 }
12150 c := auxIntToInt16(v_0.AuxInt)
12151 if v_1.Op != OpConst16 {
12152 break
12153 }
12154 d := auxIntToInt16(v_1.AuxInt)
12155 v.reset(OpConstBool)
12156 v.AuxInt = boolToAuxInt(uint16(c) <= uint16(d))
12157 return true
12158 }
12159
12160
12161 for {
12162 if v_0.Op != OpConst16 {
12163 break
12164 }
12165 t := v_0.Type
12166 if auxIntToInt16(v_0.AuxInt) != 1 {
12167 break
12168 }
12169 x := v_1
12170 v.reset(OpNeq16)
12171 v0 := b.NewValue0(v.Pos, OpConst16, t)
12172 v0.AuxInt = int16ToAuxInt(0)
12173 v.AddArg2(v0, x)
12174 return true
12175 }
12176
12177
12178 for {
12179 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
12180 break
12181 }
12182 v.reset(OpConstBool)
12183 v.AuxInt = boolToAuxInt(true)
12184 return true
12185 }
12186
12187
12188 for {
12189 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != -1 {
12190 break
12191 }
12192 v.reset(OpConstBool)
12193 v.AuxInt = boolToAuxInt(true)
12194 return true
12195 }
12196
12197
12198 for {
12199 x := v_0
12200 c := v_1
12201 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != 0 {
12202 break
12203 }
12204 v.reset(OpEq16)
12205 v.AddArg2(x, c)
12206 return true
12207 }
12208
12209
12210 for {
12211 c := v_0
12212 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != -1 {
12213 break
12214 }
12215 x := v_1
12216 v.reset(OpEq16)
12217 v.AddArg2(x, c)
12218 return true
12219 }
12220 return false
12221 }
12222 func rewriteValuegeneric_OpLeq32(v *Value) bool {
12223 v_1 := v.Args[1]
12224 v_0 := v.Args[0]
12225 b := v.Block
12226
12227
12228 for {
12229 if v_0.Op != OpConst32 {
12230 break
12231 }
12232 c := auxIntToInt32(v_0.AuxInt)
12233 if v_1.Op != OpConst32 {
12234 break
12235 }
12236 d := auxIntToInt32(v_1.AuxInt)
12237 v.reset(OpConstBool)
12238 v.AuxInt = boolToAuxInt(c <= d)
12239 return true
12240 }
12241
12242
12243
12244 for {
12245 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 || v_1.Op != OpAnd32 {
12246 break
12247 }
12248 _ = v_1.Args[1]
12249 v_1_0 := v_1.Args[0]
12250 v_1_1 := v_1.Args[1]
12251 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
12252 if v_1_1.Op != OpConst32 {
12253 continue
12254 }
12255 c := auxIntToInt32(v_1_1.AuxInt)
12256 if !(c >= 0) {
12257 continue
12258 }
12259 v.reset(OpConstBool)
12260 v.AuxInt = boolToAuxInt(true)
12261 return true
12262 }
12263 break
12264 }
12265
12266
12267
12268 for {
12269 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 || v_1.Op != OpRsh32Ux64 {
12270 break
12271 }
12272 _ = v_1.Args[1]
12273 v_1_1 := v_1.Args[1]
12274 if v_1_1.Op != OpConst64 {
12275 break
12276 }
12277 c := auxIntToInt64(v_1_1.AuxInt)
12278 if !(c > 0) {
12279 break
12280 }
12281 v.reset(OpConstBool)
12282 v.AuxInt = boolToAuxInt(true)
12283 return true
12284 }
12285
12286
12287 for {
12288 x := v_0
12289 if v_1.Op != OpConst32 {
12290 break
12291 }
12292 t := v_1.Type
12293 if auxIntToInt32(v_1.AuxInt) != -1 {
12294 break
12295 }
12296 v.reset(OpLess32)
12297 v0 := b.NewValue0(v.Pos, OpConst32, t)
12298 v0.AuxInt = int32ToAuxInt(0)
12299 v.AddArg2(x, v0)
12300 return true
12301 }
12302
12303
12304 for {
12305 if v_0.Op != OpConst32 {
12306 break
12307 }
12308 t := v_0.Type
12309 if auxIntToInt32(v_0.AuxInt) != 1 {
12310 break
12311 }
12312 x := v_1
12313 v.reset(OpLess32)
12314 v0 := b.NewValue0(v.Pos, OpConst32, t)
12315 v0.AuxInt = int32ToAuxInt(0)
12316 v.AddArg2(v0, x)
12317 return true
12318 }
12319
12320
12321 for {
12322 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != math.MinInt32 {
12323 break
12324 }
12325 v.reset(OpConstBool)
12326 v.AuxInt = boolToAuxInt(true)
12327 return true
12328 }
12329
12330
12331 for {
12332 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != math.MaxInt32 {
12333 break
12334 }
12335 v.reset(OpConstBool)
12336 v.AuxInt = boolToAuxInt(true)
12337 return true
12338 }
12339
12340
12341 for {
12342 x := v_0
12343 c := v_1
12344 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != math.MinInt32 {
12345 break
12346 }
12347 v.reset(OpEq32)
12348 v.AddArg2(x, c)
12349 return true
12350 }
12351
12352
12353 for {
12354 c := v_0
12355 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != math.MaxInt32 {
12356 break
12357 }
12358 x := v_1
12359 v.reset(OpEq32)
12360 v.AddArg2(x, c)
12361 return true
12362 }
12363 return false
12364 }
12365 func rewriteValuegeneric_OpLeq32F(v *Value) bool {
12366 v_1 := v.Args[1]
12367 v_0 := v.Args[0]
12368
12369
12370 for {
12371 if v_0.Op != OpConst32F {
12372 break
12373 }
12374 c := auxIntToFloat32(v_0.AuxInt)
12375 if v_1.Op != OpConst32F {
12376 break
12377 }
12378 d := auxIntToFloat32(v_1.AuxInt)
12379 v.reset(OpConstBool)
12380 v.AuxInt = boolToAuxInt(c <= d)
12381 return true
12382 }
12383 return false
12384 }
12385 func rewriteValuegeneric_OpLeq32U(v *Value) bool {
12386 v_1 := v.Args[1]
12387 v_0 := v.Args[0]
12388 b := v.Block
12389
12390
12391 for {
12392 if v_0.Op != OpConst32 {
12393 break
12394 }
12395 c := auxIntToInt32(v_0.AuxInt)
12396 if v_1.Op != OpConst32 {
12397 break
12398 }
12399 d := auxIntToInt32(v_1.AuxInt)
12400 v.reset(OpConstBool)
12401 v.AuxInt = boolToAuxInt(uint32(c) <= uint32(d))
12402 return true
12403 }
12404
12405
12406 for {
12407 if v_0.Op != OpConst32 {
12408 break
12409 }
12410 t := v_0.Type
12411 if auxIntToInt32(v_0.AuxInt) != 1 {
12412 break
12413 }
12414 x := v_1
12415 v.reset(OpNeq32)
12416 v0 := b.NewValue0(v.Pos, OpConst32, t)
12417 v0.AuxInt = int32ToAuxInt(0)
12418 v.AddArg2(v0, x)
12419 return true
12420 }
12421
12422
12423 for {
12424 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
12425 break
12426 }
12427 v.reset(OpConstBool)
12428 v.AuxInt = boolToAuxInt(true)
12429 return true
12430 }
12431
12432
12433 for {
12434 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != -1 {
12435 break
12436 }
12437 v.reset(OpConstBool)
12438 v.AuxInt = boolToAuxInt(true)
12439 return true
12440 }
12441
12442
12443 for {
12444 x := v_0
12445 c := v_1
12446 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != 0 {
12447 break
12448 }
12449 v.reset(OpEq32)
12450 v.AddArg2(x, c)
12451 return true
12452 }
12453
12454
12455 for {
12456 c := v_0
12457 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != -1 {
12458 break
12459 }
12460 x := v_1
12461 v.reset(OpEq32)
12462 v.AddArg2(x, c)
12463 return true
12464 }
12465 return false
12466 }
12467 func rewriteValuegeneric_OpLeq64(v *Value) bool {
12468 v_1 := v.Args[1]
12469 v_0 := v.Args[0]
12470 b := v.Block
12471
12472
12473 for {
12474 if v_0.Op != OpConst64 {
12475 break
12476 }
12477 c := auxIntToInt64(v_0.AuxInt)
12478 if v_1.Op != OpConst64 {
12479 break
12480 }
12481 d := auxIntToInt64(v_1.AuxInt)
12482 v.reset(OpConstBool)
12483 v.AuxInt = boolToAuxInt(c <= d)
12484 return true
12485 }
12486
12487
12488
12489 for {
12490 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 || v_1.Op != OpAnd64 {
12491 break
12492 }
12493 _ = v_1.Args[1]
12494 v_1_0 := v_1.Args[0]
12495 v_1_1 := v_1.Args[1]
12496 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
12497 if v_1_1.Op != OpConst64 {
12498 continue
12499 }
12500 c := auxIntToInt64(v_1_1.AuxInt)
12501 if !(c >= 0) {
12502 continue
12503 }
12504 v.reset(OpConstBool)
12505 v.AuxInt = boolToAuxInt(true)
12506 return true
12507 }
12508 break
12509 }
12510
12511
12512
12513 for {
12514 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 || v_1.Op != OpRsh64Ux64 {
12515 break
12516 }
12517 _ = v_1.Args[1]
12518 v_1_1 := v_1.Args[1]
12519 if v_1_1.Op != OpConst64 {
12520 break
12521 }
12522 c := auxIntToInt64(v_1_1.AuxInt)
12523 if !(c > 0) {
12524 break
12525 }
12526 v.reset(OpConstBool)
12527 v.AuxInt = boolToAuxInt(true)
12528 return true
12529 }
12530
12531
12532 for {
12533 x := v_0
12534 if v_1.Op != OpConst64 {
12535 break
12536 }
12537 t := v_1.Type
12538 if auxIntToInt64(v_1.AuxInt) != -1 {
12539 break
12540 }
12541 v.reset(OpLess64)
12542 v0 := b.NewValue0(v.Pos, OpConst64, t)
12543 v0.AuxInt = int64ToAuxInt(0)
12544 v.AddArg2(x, v0)
12545 return true
12546 }
12547
12548
12549 for {
12550 if v_0.Op != OpConst64 {
12551 break
12552 }
12553 t := v_0.Type
12554 if auxIntToInt64(v_0.AuxInt) != 1 {
12555 break
12556 }
12557 x := v_1
12558 v.reset(OpLess64)
12559 v0 := b.NewValue0(v.Pos, OpConst64, t)
12560 v0.AuxInt = int64ToAuxInt(0)
12561 v.AddArg2(v0, x)
12562 return true
12563 }
12564
12565
12566 for {
12567 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != math.MinInt64 {
12568 break
12569 }
12570 v.reset(OpConstBool)
12571 v.AuxInt = boolToAuxInt(true)
12572 return true
12573 }
12574
12575
12576 for {
12577 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != math.MaxInt64 {
12578 break
12579 }
12580 v.reset(OpConstBool)
12581 v.AuxInt = boolToAuxInt(true)
12582 return true
12583 }
12584
12585
12586 for {
12587 x := v_0
12588 c := v_1
12589 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != math.MinInt64 {
12590 break
12591 }
12592 v.reset(OpEq64)
12593 v.AddArg2(x, c)
12594 return true
12595 }
12596
12597
12598 for {
12599 c := v_0
12600 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != math.MaxInt64 {
12601 break
12602 }
12603 x := v_1
12604 v.reset(OpEq64)
12605 v.AddArg2(x, c)
12606 return true
12607 }
12608 return false
12609 }
12610 func rewriteValuegeneric_OpLeq64F(v *Value) bool {
12611 v_1 := v.Args[1]
12612 v_0 := v.Args[0]
12613
12614
12615 for {
12616 if v_0.Op != OpConst64F {
12617 break
12618 }
12619 c := auxIntToFloat64(v_0.AuxInt)
12620 if v_1.Op != OpConst64F {
12621 break
12622 }
12623 d := auxIntToFloat64(v_1.AuxInt)
12624 v.reset(OpConstBool)
12625 v.AuxInt = boolToAuxInt(c <= d)
12626 return true
12627 }
12628 return false
12629 }
12630 func rewriteValuegeneric_OpLeq64U(v *Value) bool {
12631 v_1 := v.Args[1]
12632 v_0 := v.Args[0]
12633 b := v.Block
12634
12635
12636 for {
12637 if v_0.Op != OpConst64 {
12638 break
12639 }
12640 c := auxIntToInt64(v_0.AuxInt)
12641 if v_1.Op != OpConst64 {
12642 break
12643 }
12644 d := auxIntToInt64(v_1.AuxInt)
12645 v.reset(OpConstBool)
12646 v.AuxInt = boolToAuxInt(uint64(c) <= uint64(d))
12647 return true
12648 }
12649
12650
12651 for {
12652 if v_0.Op != OpConst64 {
12653 break
12654 }
12655 t := v_0.Type
12656 if auxIntToInt64(v_0.AuxInt) != 1 {
12657 break
12658 }
12659 x := v_1
12660 v.reset(OpNeq64)
12661 v0 := b.NewValue0(v.Pos, OpConst64, t)
12662 v0.AuxInt = int64ToAuxInt(0)
12663 v.AddArg2(v0, x)
12664 return true
12665 }
12666
12667
12668 for {
12669 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
12670 break
12671 }
12672 v.reset(OpConstBool)
12673 v.AuxInt = boolToAuxInt(true)
12674 return true
12675 }
12676
12677
12678 for {
12679 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1 {
12680 break
12681 }
12682 v.reset(OpConstBool)
12683 v.AuxInt = boolToAuxInt(true)
12684 return true
12685 }
12686
12687
12688 for {
12689 x := v_0
12690 c := v_1
12691 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != 0 {
12692 break
12693 }
12694 v.reset(OpEq64)
12695 v.AddArg2(x, c)
12696 return true
12697 }
12698
12699
12700 for {
12701 c := v_0
12702 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != -1 {
12703 break
12704 }
12705 x := v_1
12706 v.reset(OpEq64)
12707 v.AddArg2(x, c)
12708 return true
12709 }
12710 return false
12711 }
12712 func rewriteValuegeneric_OpLeq8(v *Value) bool {
12713 v_1 := v.Args[1]
12714 v_0 := v.Args[0]
12715 b := v.Block
12716
12717
12718 for {
12719 if v_0.Op != OpConst8 {
12720 break
12721 }
12722 c := auxIntToInt8(v_0.AuxInt)
12723 if v_1.Op != OpConst8 {
12724 break
12725 }
12726 d := auxIntToInt8(v_1.AuxInt)
12727 v.reset(OpConstBool)
12728 v.AuxInt = boolToAuxInt(c <= d)
12729 return true
12730 }
12731
12732
12733
12734 for {
12735 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 || v_1.Op != OpAnd8 {
12736 break
12737 }
12738 _ = v_1.Args[1]
12739 v_1_0 := v_1.Args[0]
12740 v_1_1 := v_1.Args[1]
12741 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
12742 if v_1_1.Op != OpConst8 {
12743 continue
12744 }
12745 c := auxIntToInt8(v_1_1.AuxInt)
12746 if !(c >= 0) {
12747 continue
12748 }
12749 v.reset(OpConstBool)
12750 v.AuxInt = boolToAuxInt(true)
12751 return true
12752 }
12753 break
12754 }
12755
12756
12757
12758 for {
12759 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 || v_1.Op != OpRsh8Ux64 {
12760 break
12761 }
12762 _ = v_1.Args[1]
12763 v_1_1 := v_1.Args[1]
12764 if v_1_1.Op != OpConst64 {
12765 break
12766 }
12767 c := auxIntToInt64(v_1_1.AuxInt)
12768 if !(c > 0) {
12769 break
12770 }
12771 v.reset(OpConstBool)
12772 v.AuxInt = boolToAuxInt(true)
12773 return true
12774 }
12775
12776
12777 for {
12778 x := v_0
12779 if v_1.Op != OpConst8 {
12780 break
12781 }
12782 t := v_1.Type
12783 if auxIntToInt8(v_1.AuxInt) != -1 {
12784 break
12785 }
12786 v.reset(OpLess8)
12787 v0 := b.NewValue0(v.Pos, OpConst8, t)
12788 v0.AuxInt = int8ToAuxInt(0)
12789 v.AddArg2(x, v0)
12790 return true
12791 }
12792
12793
12794 for {
12795 if v_0.Op != OpConst8 {
12796 break
12797 }
12798 t := v_0.Type
12799 if auxIntToInt8(v_0.AuxInt) != 1 {
12800 break
12801 }
12802 x := v_1
12803 v.reset(OpLess8)
12804 v0 := b.NewValue0(v.Pos, OpConst8, t)
12805 v0.AuxInt = int8ToAuxInt(0)
12806 v.AddArg2(v0, x)
12807 return true
12808 }
12809
12810
12811 for {
12812 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != math.MinInt8 {
12813 break
12814 }
12815 v.reset(OpConstBool)
12816 v.AuxInt = boolToAuxInt(true)
12817 return true
12818 }
12819
12820
12821 for {
12822 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != math.MaxInt8 {
12823 break
12824 }
12825 v.reset(OpConstBool)
12826 v.AuxInt = boolToAuxInt(true)
12827 return true
12828 }
12829
12830
12831 for {
12832 x := v_0
12833 c := v_1
12834 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != math.MinInt8 {
12835 break
12836 }
12837 v.reset(OpEq8)
12838 v.AddArg2(x, c)
12839 return true
12840 }
12841
12842
12843 for {
12844 c := v_0
12845 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != math.MaxInt8 {
12846 break
12847 }
12848 x := v_1
12849 v.reset(OpEq8)
12850 v.AddArg2(x, c)
12851 return true
12852 }
12853 return false
12854 }
12855 func rewriteValuegeneric_OpLeq8U(v *Value) bool {
12856 v_1 := v.Args[1]
12857 v_0 := v.Args[0]
12858 b := v.Block
12859
12860
12861 for {
12862 if v_0.Op != OpConst8 {
12863 break
12864 }
12865 c := auxIntToInt8(v_0.AuxInt)
12866 if v_1.Op != OpConst8 {
12867 break
12868 }
12869 d := auxIntToInt8(v_1.AuxInt)
12870 v.reset(OpConstBool)
12871 v.AuxInt = boolToAuxInt(uint8(c) <= uint8(d))
12872 return true
12873 }
12874
12875
12876 for {
12877 if v_0.Op != OpConst8 {
12878 break
12879 }
12880 t := v_0.Type
12881 if auxIntToInt8(v_0.AuxInt) != 1 {
12882 break
12883 }
12884 x := v_1
12885 v.reset(OpNeq8)
12886 v0 := b.NewValue0(v.Pos, OpConst8, t)
12887 v0.AuxInt = int8ToAuxInt(0)
12888 v.AddArg2(v0, x)
12889 return true
12890 }
12891
12892
12893 for {
12894 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
12895 break
12896 }
12897 v.reset(OpConstBool)
12898 v.AuxInt = boolToAuxInt(true)
12899 return true
12900 }
12901
12902
12903 for {
12904 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != -1 {
12905 break
12906 }
12907 v.reset(OpConstBool)
12908 v.AuxInt = boolToAuxInt(true)
12909 return true
12910 }
12911
12912
12913 for {
12914 x := v_0
12915 c := v_1
12916 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != 0 {
12917 break
12918 }
12919 v.reset(OpEq8)
12920 v.AddArg2(x, c)
12921 return true
12922 }
12923
12924
12925 for {
12926 c := v_0
12927 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != -1 {
12928 break
12929 }
12930 x := v_1
12931 v.reset(OpEq8)
12932 v.AddArg2(x, c)
12933 return true
12934 }
12935 return false
12936 }
12937 func rewriteValuegeneric_OpLess16(v *Value) bool {
12938 v_1 := v.Args[1]
12939 v_0 := v.Args[0]
12940 b := v.Block
12941
12942
12943 for {
12944 if v_0.Op != OpConst16 {
12945 break
12946 }
12947 c := auxIntToInt16(v_0.AuxInt)
12948 if v_1.Op != OpConst16 {
12949 break
12950 }
12951 d := auxIntToInt16(v_1.AuxInt)
12952 v.reset(OpConstBool)
12953 v.AuxInt = boolToAuxInt(c < d)
12954 return true
12955 }
12956
12957
12958
12959 for {
12960 if v_0.Op != OpConst16 {
12961 break
12962 }
12963 t := v_0.Type
12964 if auxIntToInt16(v_0.AuxInt) != 0 {
12965 break
12966 }
12967 x := v_1
12968 if !(isNonNegative(x)) {
12969 break
12970 }
12971 v.reset(OpNeq16)
12972 v0 := b.NewValue0(v.Pos, OpConst16, t)
12973 v0.AuxInt = int16ToAuxInt(0)
12974 v.AddArg2(v0, x)
12975 return true
12976 }
12977
12978
12979
12980 for {
12981 x := v_0
12982 if v_1.Op != OpConst16 {
12983 break
12984 }
12985 t := v_1.Type
12986 if auxIntToInt16(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
12987 break
12988 }
12989 v.reset(OpEq16)
12990 v0 := b.NewValue0(v.Pos, OpConst16, t)
12991 v0.AuxInt = int16ToAuxInt(0)
12992 v.AddArg2(v0, x)
12993 return true
12994 }
12995
12996
12997 for {
12998 x := v_0
12999 if v_1.Op != OpConst16 {
13000 break
13001 }
13002 t := v_1.Type
13003 if auxIntToInt16(v_1.AuxInt) != 1 {
13004 break
13005 }
13006 v.reset(OpLeq16)
13007 v0 := b.NewValue0(v.Pos, OpConst16, t)
13008 v0.AuxInt = int16ToAuxInt(0)
13009 v.AddArg2(x, v0)
13010 return true
13011 }
13012
13013
13014 for {
13015 if v_0.Op != OpConst16 {
13016 break
13017 }
13018 t := v_0.Type
13019 if auxIntToInt16(v_0.AuxInt) != -1 {
13020 break
13021 }
13022 x := v_1
13023 v.reset(OpLeq16)
13024 v0 := b.NewValue0(v.Pos, OpConst16, t)
13025 v0.AuxInt = int16ToAuxInt(0)
13026 v.AddArg2(v0, x)
13027 return true
13028 }
13029
13030
13031 for {
13032 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != math.MinInt16 {
13033 break
13034 }
13035 v.reset(OpConstBool)
13036 v.AuxInt = boolToAuxInt(false)
13037 return true
13038 }
13039
13040
13041 for {
13042 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != math.MaxInt16 {
13043 break
13044 }
13045 v.reset(OpConstBool)
13046 v.AuxInt = boolToAuxInt(false)
13047 return true
13048 }
13049
13050
13051 for {
13052 x := v_0
13053 if v_1.Op != OpConst16 {
13054 break
13055 }
13056 t := v_1.Type
13057 if auxIntToInt16(v_1.AuxInt) != math.MinInt16+1 {
13058 break
13059 }
13060 v.reset(OpEq16)
13061 v0 := b.NewValue0(v.Pos, OpConst16, t)
13062 v0.AuxInt = int16ToAuxInt(math.MinInt16)
13063 v.AddArg2(x, v0)
13064 return true
13065 }
13066
13067
13068 for {
13069 if v_0.Op != OpConst16 {
13070 break
13071 }
13072 t := v_0.Type
13073 if auxIntToInt16(v_0.AuxInt) != math.MaxInt16-1 {
13074 break
13075 }
13076 x := v_1
13077 v.reset(OpEq16)
13078 v0 := b.NewValue0(v.Pos, OpConst16, t)
13079 v0.AuxInt = int16ToAuxInt(math.MaxInt16)
13080 v.AddArg2(x, v0)
13081 return true
13082 }
13083 return false
13084 }
13085 func rewriteValuegeneric_OpLess16U(v *Value) bool {
13086 v_1 := v.Args[1]
13087 v_0 := v.Args[0]
13088 b := v.Block
13089
13090
13091 for {
13092 if v_0.Op != OpConst16 {
13093 break
13094 }
13095 c := auxIntToInt16(v_0.AuxInt)
13096 if v_1.Op != OpConst16 {
13097 break
13098 }
13099 d := auxIntToInt16(v_1.AuxInt)
13100 v.reset(OpConstBool)
13101 v.AuxInt = boolToAuxInt(uint16(c) < uint16(d))
13102 return true
13103 }
13104
13105
13106 for {
13107 x := v_0
13108 if v_1.Op != OpConst16 {
13109 break
13110 }
13111 t := v_1.Type
13112 if auxIntToInt16(v_1.AuxInt) != 1 {
13113 break
13114 }
13115 v.reset(OpEq16)
13116 v0 := b.NewValue0(v.Pos, OpConst16, t)
13117 v0.AuxInt = int16ToAuxInt(0)
13118 v.AddArg2(v0, x)
13119 return true
13120 }
13121
13122
13123 for {
13124 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
13125 break
13126 }
13127 v.reset(OpConstBool)
13128 v.AuxInt = boolToAuxInt(false)
13129 return true
13130 }
13131
13132
13133 for {
13134 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
13135 break
13136 }
13137 v.reset(OpConstBool)
13138 v.AuxInt = boolToAuxInt(false)
13139 return true
13140 }
13141
13142
13143 for {
13144 x := v_0
13145 if v_1.Op != OpConst16 {
13146 break
13147 }
13148 t := v_1.Type
13149 if auxIntToInt16(v_1.AuxInt) != 1 {
13150 break
13151 }
13152 v.reset(OpEq16)
13153 v0 := b.NewValue0(v.Pos, OpConst16, t)
13154 v0.AuxInt = int16ToAuxInt(0)
13155 v.AddArg2(x, v0)
13156 return true
13157 }
13158
13159
13160 for {
13161 if v_0.Op != OpConst16 {
13162 break
13163 }
13164 t := v_0.Type
13165 if auxIntToInt16(v_0.AuxInt) != -2 {
13166 break
13167 }
13168 x := v_1
13169 v.reset(OpEq16)
13170 v0 := b.NewValue0(v.Pos, OpConst16, t)
13171 v0.AuxInt = int16ToAuxInt(-1)
13172 v.AddArg2(x, v0)
13173 return true
13174 }
13175 return false
13176 }
13177 func rewriteValuegeneric_OpLess32(v *Value) bool {
13178 v_1 := v.Args[1]
13179 v_0 := v.Args[0]
13180 b := v.Block
13181
13182
13183 for {
13184 if v_0.Op != OpConst32 {
13185 break
13186 }
13187 c := auxIntToInt32(v_0.AuxInt)
13188 if v_1.Op != OpConst32 {
13189 break
13190 }
13191 d := auxIntToInt32(v_1.AuxInt)
13192 v.reset(OpConstBool)
13193 v.AuxInt = boolToAuxInt(c < d)
13194 return true
13195 }
13196
13197
13198
13199 for {
13200 if v_0.Op != OpConst32 {
13201 break
13202 }
13203 t := v_0.Type
13204 if auxIntToInt32(v_0.AuxInt) != 0 {
13205 break
13206 }
13207 x := v_1
13208 if !(isNonNegative(x)) {
13209 break
13210 }
13211 v.reset(OpNeq32)
13212 v0 := b.NewValue0(v.Pos, OpConst32, t)
13213 v0.AuxInt = int32ToAuxInt(0)
13214 v.AddArg2(v0, x)
13215 return true
13216 }
13217
13218
13219
13220 for {
13221 x := v_0
13222 if v_1.Op != OpConst32 {
13223 break
13224 }
13225 t := v_1.Type
13226 if auxIntToInt32(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
13227 break
13228 }
13229 v.reset(OpEq32)
13230 v0 := b.NewValue0(v.Pos, OpConst32, t)
13231 v0.AuxInt = int32ToAuxInt(0)
13232 v.AddArg2(v0, x)
13233 return true
13234 }
13235
13236
13237 for {
13238 x := v_0
13239 if v_1.Op != OpConst32 {
13240 break
13241 }
13242 t := v_1.Type
13243 if auxIntToInt32(v_1.AuxInt) != 1 {
13244 break
13245 }
13246 v.reset(OpLeq32)
13247 v0 := b.NewValue0(v.Pos, OpConst32, t)
13248 v0.AuxInt = int32ToAuxInt(0)
13249 v.AddArg2(x, v0)
13250 return true
13251 }
13252
13253
13254 for {
13255 if v_0.Op != OpConst32 {
13256 break
13257 }
13258 t := v_0.Type
13259 if auxIntToInt32(v_0.AuxInt) != -1 {
13260 break
13261 }
13262 x := v_1
13263 v.reset(OpLeq32)
13264 v0 := b.NewValue0(v.Pos, OpConst32, t)
13265 v0.AuxInt = int32ToAuxInt(0)
13266 v.AddArg2(v0, x)
13267 return true
13268 }
13269
13270
13271 for {
13272 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != math.MinInt32 {
13273 break
13274 }
13275 v.reset(OpConstBool)
13276 v.AuxInt = boolToAuxInt(false)
13277 return true
13278 }
13279
13280
13281 for {
13282 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != math.MaxInt32 {
13283 break
13284 }
13285 v.reset(OpConstBool)
13286 v.AuxInt = boolToAuxInt(false)
13287 return true
13288 }
13289
13290
13291 for {
13292 x := v_0
13293 if v_1.Op != OpConst32 {
13294 break
13295 }
13296 t := v_1.Type
13297 if auxIntToInt32(v_1.AuxInt) != math.MinInt32+1 {
13298 break
13299 }
13300 v.reset(OpEq32)
13301 v0 := b.NewValue0(v.Pos, OpConst32, t)
13302 v0.AuxInt = int32ToAuxInt(math.MinInt32)
13303 v.AddArg2(x, v0)
13304 return true
13305 }
13306
13307
13308 for {
13309 if v_0.Op != OpConst32 {
13310 break
13311 }
13312 t := v_0.Type
13313 if auxIntToInt32(v_0.AuxInt) != math.MaxInt32-1 {
13314 break
13315 }
13316 x := v_1
13317 v.reset(OpEq32)
13318 v0 := b.NewValue0(v.Pos, OpConst32, t)
13319 v0.AuxInt = int32ToAuxInt(math.MaxInt32)
13320 v.AddArg2(x, v0)
13321 return true
13322 }
13323 return false
13324 }
13325 func rewriteValuegeneric_OpLess32F(v *Value) bool {
13326 v_1 := v.Args[1]
13327 v_0 := v.Args[0]
13328
13329
13330 for {
13331 if v_0.Op != OpConst32F {
13332 break
13333 }
13334 c := auxIntToFloat32(v_0.AuxInt)
13335 if v_1.Op != OpConst32F {
13336 break
13337 }
13338 d := auxIntToFloat32(v_1.AuxInt)
13339 v.reset(OpConstBool)
13340 v.AuxInt = boolToAuxInt(c < d)
13341 return true
13342 }
13343 return false
13344 }
13345 func rewriteValuegeneric_OpLess32U(v *Value) bool {
13346 v_1 := v.Args[1]
13347 v_0 := v.Args[0]
13348 b := v.Block
13349
13350
13351 for {
13352 if v_0.Op != OpConst32 {
13353 break
13354 }
13355 c := auxIntToInt32(v_0.AuxInt)
13356 if v_1.Op != OpConst32 {
13357 break
13358 }
13359 d := auxIntToInt32(v_1.AuxInt)
13360 v.reset(OpConstBool)
13361 v.AuxInt = boolToAuxInt(uint32(c) < uint32(d))
13362 return true
13363 }
13364
13365
13366 for {
13367 x := v_0
13368 if v_1.Op != OpConst32 {
13369 break
13370 }
13371 t := v_1.Type
13372 if auxIntToInt32(v_1.AuxInt) != 1 {
13373 break
13374 }
13375 v.reset(OpEq32)
13376 v0 := b.NewValue0(v.Pos, OpConst32, t)
13377 v0.AuxInt = int32ToAuxInt(0)
13378 v.AddArg2(v0, x)
13379 return true
13380 }
13381
13382
13383 for {
13384 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
13385 break
13386 }
13387 v.reset(OpConstBool)
13388 v.AuxInt = boolToAuxInt(false)
13389 return true
13390 }
13391
13392
13393 for {
13394 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
13395 break
13396 }
13397 v.reset(OpConstBool)
13398 v.AuxInt = boolToAuxInt(false)
13399 return true
13400 }
13401
13402
13403 for {
13404 x := v_0
13405 if v_1.Op != OpConst32 {
13406 break
13407 }
13408 t := v_1.Type
13409 if auxIntToInt32(v_1.AuxInt) != 1 {
13410 break
13411 }
13412 v.reset(OpEq32)
13413 v0 := b.NewValue0(v.Pos, OpConst32, t)
13414 v0.AuxInt = int32ToAuxInt(0)
13415 v.AddArg2(x, v0)
13416 return true
13417 }
13418
13419
13420 for {
13421 if v_0.Op != OpConst32 {
13422 break
13423 }
13424 t := v_0.Type
13425 if auxIntToInt32(v_0.AuxInt) != -2 {
13426 break
13427 }
13428 x := v_1
13429 v.reset(OpEq32)
13430 v0 := b.NewValue0(v.Pos, OpConst32, t)
13431 v0.AuxInt = int32ToAuxInt(-1)
13432 v.AddArg2(x, v0)
13433 return true
13434 }
13435 return false
13436 }
13437 func rewriteValuegeneric_OpLess64(v *Value) bool {
13438 v_1 := v.Args[1]
13439 v_0 := v.Args[0]
13440 b := v.Block
13441
13442
13443 for {
13444 if v_0.Op != OpConst64 {
13445 break
13446 }
13447 c := auxIntToInt64(v_0.AuxInt)
13448 if v_1.Op != OpConst64 {
13449 break
13450 }
13451 d := auxIntToInt64(v_1.AuxInt)
13452 v.reset(OpConstBool)
13453 v.AuxInt = boolToAuxInt(c < d)
13454 return true
13455 }
13456
13457
13458
13459 for {
13460 if v_0.Op != OpConst64 {
13461 break
13462 }
13463 t := v_0.Type
13464 if auxIntToInt64(v_0.AuxInt) != 0 {
13465 break
13466 }
13467 x := v_1
13468 if !(isNonNegative(x)) {
13469 break
13470 }
13471 v.reset(OpNeq64)
13472 v0 := b.NewValue0(v.Pos, OpConst64, t)
13473 v0.AuxInt = int64ToAuxInt(0)
13474 v.AddArg2(v0, x)
13475 return true
13476 }
13477
13478
13479
13480 for {
13481 x := v_0
13482 if v_1.Op != OpConst64 {
13483 break
13484 }
13485 t := v_1.Type
13486 if auxIntToInt64(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
13487 break
13488 }
13489 v.reset(OpEq64)
13490 v0 := b.NewValue0(v.Pos, OpConst64, t)
13491 v0.AuxInt = int64ToAuxInt(0)
13492 v.AddArg2(v0, x)
13493 return true
13494 }
13495
13496
13497 for {
13498 x := v_0
13499 if v_1.Op != OpConst64 {
13500 break
13501 }
13502 t := v_1.Type
13503 if auxIntToInt64(v_1.AuxInt) != 1 {
13504 break
13505 }
13506 v.reset(OpLeq64)
13507 v0 := b.NewValue0(v.Pos, OpConst64, t)
13508 v0.AuxInt = int64ToAuxInt(0)
13509 v.AddArg2(x, v0)
13510 return true
13511 }
13512
13513
13514 for {
13515 if v_0.Op != OpConst64 {
13516 break
13517 }
13518 t := v_0.Type
13519 if auxIntToInt64(v_0.AuxInt) != -1 {
13520 break
13521 }
13522 x := v_1
13523 v.reset(OpLeq64)
13524 v0 := b.NewValue0(v.Pos, OpConst64, t)
13525 v0.AuxInt = int64ToAuxInt(0)
13526 v.AddArg2(v0, x)
13527 return true
13528 }
13529
13530
13531 for {
13532 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != math.MinInt64 {
13533 break
13534 }
13535 v.reset(OpConstBool)
13536 v.AuxInt = boolToAuxInt(false)
13537 return true
13538 }
13539
13540
13541 for {
13542 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != math.MaxInt64 {
13543 break
13544 }
13545 v.reset(OpConstBool)
13546 v.AuxInt = boolToAuxInt(false)
13547 return true
13548 }
13549
13550
13551 for {
13552 x := v_0
13553 if v_1.Op != OpConst64 {
13554 break
13555 }
13556 t := v_1.Type
13557 if auxIntToInt64(v_1.AuxInt) != math.MinInt64+1 {
13558 break
13559 }
13560 v.reset(OpEq64)
13561 v0 := b.NewValue0(v.Pos, OpConst64, t)
13562 v0.AuxInt = int64ToAuxInt(math.MinInt64)
13563 v.AddArg2(x, v0)
13564 return true
13565 }
13566
13567
13568 for {
13569 if v_0.Op != OpConst64 {
13570 break
13571 }
13572 t := v_0.Type
13573 if auxIntToInt64(v_0.AuxInt) != math.MaxInt64-1 {
13574 break
13575 }
13576 x := v_1
13577 v.reset(OpEq64)
13578 v0 := b.NewValue0(v.Pos, OpConst64, t)
13579 v0.AuxInt = int64ToAuxInt(math.MaxInt64)
13580 v.AddArg2(x, v0)
13581 return true
13582 }
13583 return false
13584 }
13585 func rewriteValuegeneric_OpLess64F(v *Value) bool {
13586 v_1 := v.Args[1]
13587 v_0 := v.Args[0]
13588
13589
13590 for {
13591 if v_0.Op != OpConst64F {
13592 break
13593 }
13594 c := auxIntToFloat64(v_0.AuxInt)
13595 if v_1.Op != OpConst64F {
13596 break
13597 }
13598 d := auxIntToFloat64(v_1.AuxInt)
13599 v.reset(OpConstBool)
13600 v.AuxInt = boolToAuxInt(c < d)
13601 return true
13602 }
13603 return false
13604 }
13605 func rewriteValuegeneric_OpLess64U(v *Value) bool {
13606 v_1 := v.Args[1]
13607 v_0 := v.Args[0]
13608 b := v.Block
13609
13610
13611 for {
13612 if v_0.Op != OpConst64 {
13613 break
13614 }
13615 c := auxIntToInt64(v_0.AuxInt)
13616 if v_1.Op != OpConst64 {
13617 break
13618 }
13619 d := auxIntToInt64(v_1.AuxInt)
13620 v.reset(OpConstBool)
13621 v.AuxInt = boolToAuxInt(uint64(c) < uint64(d))
13622 return true
13623 }
13624
13625
13626 for {
13627 x := v_0
13628 if v_1.Op != OpConst64 {
13629 break
13630 }
13631 t := v_1.Type
13632 if auxIntToInt64(v_1.AuxInt) != 1 {
13633 break
13634 }
13635 v.reset(OpEq64)
13636 v0 := b.NewValue0(v.Pos, OpConst64, t)
13637 v0.AuxInt = int64ToAuxInt(0)
13638 v.AddArg2(v0, x)
13639 return true
13640 }
13641
13642
13643 for {
13644 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
13645 break
13646 }
13647 v.reset(OpConstBool)
13648 v.AuxInt = boolToAuxInt(false)
13649 return true
13650 }
13651
13652
13653 for {
13654 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
13655 break
13656 }
13657 v.reset(OpConstBool)
13658 v.AuxInt = boolToAuxInt(false)
13659 return true
13660 }
13661
13662
13663 for {
13664 x := v_0
13665 if v_1.Op != OpConst64 {
13666 break
13667 }
13668 t := v_1.Type
13669 if auxIntToInt64(v_1.AuxInt) != 1 {
13670 break
13671 }
13672 v.reset(OpEq64)
13673 v0 := b.NewValue0(v.Pos, OpConst64, t)
13674 v0.AuxInt = int64ToAuxInt(0)
13675 v.AddArg2(x, v0)
13676 return true
13677 }
13678
13679
13680 for {
13681 if v_0.Op != OpConst64 {
13682 break
13683 }
13684 t := v_0.Type
13685 if auxIntToInt64(v_0.AuxInt) != -2 {
13686 break
13687 }
13688 x := v_1
13689 v.reset(OpEq64)
13690 v0 := b.NewValue0(v.Pos, OpConst64, t)
13691 v0.AuxInt = int64ToAuxInt(-1)
13692 v.AddArg2(x, v0)
13693 return true
13694 }
13695 return false
13696 }
13697 func rewriteValuegeneric_OpLess8(v *Value) bool {
13698 v_1 := v.Args[1]
13699 v_0 := v.Args[0]
13700 b := v.Block
13701
13702
13703 for {
13704 if v_0.Op != OpConst8 {
13705 break
13706 }
13707 c := auxIntToInt8(v_0.AuxInt)
13708 if v_1.Op != OpConst8 {
13709 break
13710 }
13711 d := auxIntToInt8(v_1.AuxInt)
13712 v.reset(OpConstBool)
13713 v.AuxInt = boolToAuxInt(c < d)
13714 return true
13715 }
13716
13717
13718
13719 for {
13720 if v_0.Op != OpConst8 {
13721 break
13722 }
13723 t := v_0.Type
13724 if auxIntToInt8(v_0.AuxInt) != 0 {
13725 break
13726 }
13727 x := v_1
13728 if !(isNonNegative(x)) {
13729 break
13730 }
13731 v.reset(OpNeq8)
13732 v0 := b.NewValue0(v.Pos, OpConst8, t)
13733 v0.AuxInt = int8ToAuxInt(0)
13734 v.AddArg2(v0, x)
13735 return true
13736 }
13737
13738
13739
13740 for {
13741 x := v_0
13742 if v_1.Op != OpConst8 {
13743 break
13744 }
13745 t := v_1.Type
13746 if auxIntToInt8(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
13747 break
13748 }
13749 v.reset(OpEq8)
13750 v0 := b.NewValue0(v.Pos, OpConst8, t)
13751 v0.AuxInt = int8ToAuxInt(0)
13752 v.AddArg2(v0, x)
13753 return true
13754 }
13755
13756
13757 for {
13758 x := v_0
13759 if v_1.Op != OpConst8 {
13760 break
13761 }
13762 t := v_1.Type
13763 if auxIntToInt8(v_1.AuxInt) != 1 {
13764 break
13765 }
13766 v.reset(OpLeq8)
13767 v0 := b.NewValue0(v.Pos, OpConst8, t)
13768 v0.AuxInt = int8ToAuxInt(0)
13769 v.AddArg2(x, v0)
13770 return true
13771 }
13772
13773
13774 for {
13775 if v_0.Op != OpConst8 {
13776 break
13777 }
13778 t := v_0.Type
13779 if auxIntToInt8(v_0.AuxInt) != -1 {
13780 break
13781 }
13782 x := v_1
13783 v.reset(OpLeq8)
13784 v0 := b.NewValue0(v.Pos, OpConst8, t)
13785 v0.AuxInt = int8ToAuxInt(0)
13786 v.AddArg2(v0, x)
13787 return true
13788 }
13789
13790
13791 for {
13792 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != math.MinInt8 {
13793 break
13794 }
13795 v.reset(OpConstBool)
13796 v.AuxInt = boolToAuxInt(false)
13797 return true
13798 }
13799
13800
13801 for {
13802 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != math.MaxInt8 {
13803 break
13804 }
13805 v.reset(OpConstBool)
13806 v.AuxInt = boolToAuxInt(false)
13807 return true
13808 }
13809
13810
13811 for {
13812 x := v_0
13813 if v_1.Op != OpConst8 {
13814 break
13815 }
13816 t := v_1.Type
13817 if auxIntToInt8(v_1.AuxInt) != math.MinInt8+1 {
13818 break
13819 }
13820 v.reset(OpEq8)
13821 v0 := b.NewValue0(v.Pos, OpConst8, t)
13822 v0.AuxInt = int8ToAuxInt(math.MinInt8)
13823 v.AddArg2(x, v0)
13824 return true
13825 }
13826
13827
13828 for {
13829 if v_0.Op != OpConst8 {
13830 break
13831 }
13832 t := v_0.Type
13833 if auxIntToInt8(v_0.AuxInt) != math.MaxInt8-1 {
13834 break
13835 }
13836 x := v_1
13837 v.reset(OpEq8)
13838 v0 := b.NewValue0(v.Pos, OpConst8, t)
13839 v0.AuxInt = int8ToAuxInt(math.MaxInt8)
13840 v.AddArg2(x, v0)
13841 return true
13842 }
13843 return false
13844 }
13845 func rewriteValuegeneric_OpLess8U(v *Value) bool {
13846 v_1 := v.Args[1]
13847 v_0 := v.Args[0]
13848 b := v.Block
13849
13850
13851 for {
13852 if v_0.Op != OpConst8 {
13853 break
13854 }
13855 c := auxIntToInt8(v_0.AuxInt)
13856 if v_1.Op != OpConst8 {
13857 break
13858 }
13859 d := auxIntToInt8(v_1.AuxInt)
13860 v.reset(OpConstBool)
13861 v.AuxInt = boolToAuxInt(uint8(c) < uint8(d))
13862 return true
13863 }
13864
13865
13866 for {
13867 x := v_0
13868 if v_1.Op != OpConst8 {
13869 break
13870 }
13871 t := v_1.Type
13872 if auxIntToInt8(v_1.AuxInt) != 1 {
13873 break
13874 }
13875 v.reset(OpEq8)
13876 v0 := b.NewValue0(v.Pos, OpConst8, t)
13877 v0.AuxInt = int8ToAuxInt(0)
13878 v.AddArg2(v0, x)
13879 return true
13880 }
13881
13882
13883 for {
13884 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
13885 break
13886 }
13887 v.reset(OpConstBool)
13888 v.AuxInt = boolToAuxInt(false)
13889 return true
13890 }
13891
13892
13893 for {
13894 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
13895 break
13896 }
13897 v.reset(OpConstBool)
13898 v.AuxInt = boolToAuxInt(false)
13899 return true
13900 }
13901
13902
13903 for {
13904 x := v_0
13905 if v_1.Op != OpConst8 {
13906 break
13907 }
13908 t := v_1.Type
13909 if auxIntToInt8(v_1.AuxInt) != 1 {
13910 break
13911 }
13912 v.reset(OpEq8)
13913 v0 := b.NewValue0(v.Pos, OpConst8, t)
13914 v0.AuxInt = int8ToAuxInt(0)
13915 v.AddArg2(x, v0)
13916 return true
13917 }
13918
13919
13920 for {
13921 if v_0.Op != OpConst8 {
13922 break
13923 }
13924 t := v_0.Type
13925 if auxIntToInt8(v_0.AuxInt) != -2 {
13926 break
13927 }
13928 x := v_1
13929 v.reset(OpEq8)
13930 v0 := b.NewValue0(v.Pos, OpConst8, t)
13931 v0.AuxInt = int8ToAuxInt(-1)
13932 v.AddArg2(x, v0)
13933 return true
13934 }
13935 return false
13936 }
13937 func rewriteValuegeneric_OpLoad(v *Value) bool {
13938 v_1 := v.Args[1]
13939 v_0 := v.Args[0]
13940 b := v.Block
13941 config := b.Func.Config
13942 typ := &b.Func.Config.Types
13943
13944
13945
13946 for {
13947 t1 := v.Type
13948 p1 := v_0
13949 if v_1.Op != OpStore {
13950 break
13951 }
13952 t2 := auxToType(v_1.Aux)
13953 x := v_1.Args[1]
13954 p2 := v_1.Args[0]
13955 if !(isSamePtr(p1, p2) && copyCompatibleType(t1, x.Type) && t1.Size() == t2.Size()) {
13956 break
13957 }
13958 v.copyOf(x)
13959 return true
13960 }
13961
13962
13963
13964 for {
13965 t1 := v.Type
13966 p1 := v_0
13967 if v_1.Op != OpStore {
13968 break
13969 }
13970 t2 := auxToType(v_1.Aux)
13971 _ = v_1.Args[2]
13972 p2 := v_1.Args[0]
13973 v_1_2 := v_1.Args[2]
13974 if v_1_2.Op != OpStore {
13975 break
13976 }
13977 t3 := auxToType(v_1_2.Aux)
13978 x := v_1_2.Args[1]
13979 p3 := v_1_2.Args[0]
13980 if !(isSamePtr(p1, p3) && copyCompatibleType(t1, x.Type) && t1.Size() == t3.Size() && disjoint(p3, t3.Size(), p2, t2.Size())) {
13981 break
13982 }
13983 v.copyOf(x)
13984 return true
13985 }
13986
13987
13988
13989 for {
13990 t1 := v.Type
13991 p1 := v_0
13992 if v_1.Op != OpStore {
13993 break
13994 }
13995 t2 := auxToType(v_1.Aux)
13996 _ = v_1.Args[2]
13997 p2 := v_1.Args[0]
13998 v_1_2 := v_1.Args[2]
13999 if v_1_2.Op != OpStore {
14000 break
14001 }
14002 t3 := auxToType(v_1_2.Aux)
14003 _ = v_1_2.Args[2]
14004 p3 := v_1_2.Args[0]
14005 v_1_2_2 := v_1_2.Args[2]
14006 if v_1_2_2.Op != OpStore {
14007 break
14008 }
14009 t4 := auxToType(v_1_2_2.Aux)
14010 x := v_1_2_2.Args[1]
14011 p4 := v_1_2_2.Args[0]
14012 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())) {
14013 break
14014 }
14015 v.copyOf(x)
14016 return true
14017 }
14018
14019
14020
14021 for {
14022 t1 := v.Type
14023 p1 := v_0
14024 if v_1.Op != OpStore {
14025 break
14026 }
14027 t2 := auxToType(v_1.Aux)
14028 _ = v_1.Args[2]
14029 p2 := v_1.Args[0]
14030 v_1_2 := v_1.Args[2]
14031 if v_1_2.Op != OpStore {
14032 break
14033 }
14034 t3 := auxToType(v_1_2.Aux)
14035 _ = v_1_2.Args[2]
14036 p3 := v_1_2.Args[0]
14037 v_1_2_2 := v_1_2.Args[2]
14038 if v_1_2_2.Op != OpStore {
14039 break
14040 }
14041 t4 := auxToType(v_1_2_2.Aux)
14042 _ = v_1_2_2.Args[2]
14043 p4 := v_1_2_2.Args[0]
14044 v_1_2_2_2 := v_1_2_2.Args[2]
14045 if v_1_2_2_2.Op != OpStore {
14046 break
14047 }
14048 t5 := auxToType(v_1_2_2_2.Aux)
14049 x := v_1_2_2_2.Args[1]
14050 p5 := v_1_2_2_2.Args[0]
14051 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())) {
14052 break
14053 }
14054 v.copyOf(x)
14055 return true
14056 }
14057
14058
14059
14060 for {
14061 t1 := v.Type
14062 op := v_0
14063 if op.Op != OpOffPtr {
14064 break
14065 }
14066 o1 := auxIntToInt64(op.AuxInt)
14067 p1 := op.Args[0]
14068 move := v_1
14069 if move.Op != OpMove {
14070 break
14071 }
14072 n := auxIntToInt64(move.AuxInt)
14073 mem := move.Args[2]
14074 p2 := move.Args[0]
14075 src := move.Args[1]
14076 if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p2) && !isVolatile(src)) {
14077 break
14078 }
14079 b = move.Block
14080 v0 := b.NewValue0(v.Pos, OpLoad, t1)
14081 v.copyOf(v0)
14082 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
14083 v1.AuxInt = int64ToAuxInt(o1)
14084 v1.AddArg(src)
14085 v0.AddArg2(v1, mem)
14086 return true
14087 }
14088
14089
14090
14091 for {
14092 t1 := v.Type
14093 p1 := v_0
14094 if v_1.Op != OpStore {
14095 break
14096 }
14097 t2 := auxToType(v_1.Aux)
14098 _ = v_1.Args[1]
14099 p2 := v_1.Args[0]
14100 v_1_1 := v_1.Args[1]
14101 if v_1_1.Op != OpConst64 {
14102 break
14103 }
14104 x := auxIntToInt64(v_1_1.AuxInt)
14105 if !(isSamePtr(p1, p2) && t2.Size() == 8 && is64BitFloat(t1) && !math.IsNaN(math.Float64frombits(uint64(x)))) {
14106 break
14107 }
14108 v.reset(OpConst64F)
14109 v.AuxInt = float64ToAuxInt(math.Float64frombits(uint64(x)))
14110 return true
14111 }
14112
14113
14114
14115 for {
14116 t1 := v.Type
14117 p1 := v_0
14118 if v_1.Op != OpStore {
14119 break
14120 }
14121 t2 := auxToType(v_1.Aux)
14122 _ = v_1.Args[1]
14123 p2 := v_1.Args[0]
14124 v_1_1 := v_1.Args[1]
14125 if v_1_1.Op != OpConst32 {
14126 break
14127 }
14128 x := auxIntToInt32(v_1_1.AuxInt)
14129 if !(isSamePtr(p1, p2) && t2.Size() == 4 && is32BitFloat(t1) && !math.IsNaN(float64(math.Float32frombits(uint32(x))))) {
14130 break
14131 }
14132 v.reset(OpConst32F)
14133 v.AuxInt = float32ToAuxInt(math.Float32frombits(uint32(x)))
14134 return true
14135 }
14136
14137
14138
14139 for {
14140 t1 := v.Type
14141 p1 := v_0
14142 if v_1.Op != OpStore {
14143 break
14144 }
14145 t2 := auxToType(v_1.Aux)
14146 _ = v_1.Args[1]
14147 p2 := v_1.Args[0]
14148 v_1_1 := v_1.Args[1]
14149 if v_1_1.Op != OpConst64F {
14150 break
14151 }
14152 x := auxIntToFloat64(v_1_1.AuxInt)
14153 if !(isSamePtr(p1, p2) && t2.Size() == 8 && is64BitInt(t1)) {
14154 break
14155 }
14156 v.reset(OpConst64)
14157 v.AuxInt = int64ToAuxInt(int64(math.Float64bits(x)))
14158 return true
14159 }
14160
14161
14162
14163 for {
14164 t1 := v.Type
14165 p1 := v_0
14166 if v_1.Op != OpStore {
14167 break
14168 }
14169 t2 := auxToType(v_1.Aux)
14170 _ = v_1.Args[1]
14171 p2 := v_1.Args[0]
14172 v_1_1 := v_1.Args[1]
14173 if v_1_1.Op != OpConst32F {
14174 break
14175 }
14176 x := auxIntToFloat32(v_1_1.AuxInt)
14177 if !(isSamePtr(p1, p2) && t2.Size() == 4 && is32BitInt(t1)) {
14178 break
14179 }
14180 v.reset(OpConst32)
14181 v.AuxInt = int32ToAuxInt(int32(math.Float32bits(x)))
14182 return true
14183 }
14184
14185
14186
14187 for {
14188 t1 := v.Type
14189 op := v_0
14190 if op.Op != OpOffPtr {
14191 break
14192 }
14193 o1 := auxIntToInt64(op.AuxInt)
14194 p1 := op.Args[0]
14195 if v_1.Op != OpStore {
14196 break
14197 }
14198 t2 := auxToType(v_1.Aux)
14199 _ = v_1.Args[2]
14200 p2 := v_1.Args[0]
14201 mem := v_1.Args[2]
14202 if mem.Op != OpZero {
14203 break
14204 }
14205 n := auxIntToInt64(mem.AuxInt)
14206 p3 := mem.Args[0]
14207 if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p3) && CanSSA(t1) && disjoint(op, t1.Size(), p2, t2.Size())) {
14208 break
14209 }
14210 b = mem.Block
14211 v0 := b.NewValue0(v.Pos, OpLoad, t1)
14212 v.copyOf(v0)
14213 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
14214 v1.AuxInt = int64ToAuxInt(o1)
14215 v1.AddArg(p3)
14216 v0.AddArg2(v1, mem)
14217 return true
14218 }
14219
14220
14221
14222 for {
14223 t1 := v.Type
14224 op := v_0
14225 if op.Op != OpOffPtr {
14226 break
14227 }
14228 o1 := auxIntToInt64(op.AuxInt)
14229 p1 := op.Args[0]
14230 if v_1.Op != OpStore {
14231 break
14232 }
14233 t2 := auxToType(v_1.Aux)
14234 _ = v_1.Args[2]
14235 p2 := v_1.Args[0]
14236 v_1_2 := v_1.Args[2]
14237 if v_1_2.Op != OpStore {
14238 break
14239 }
14240 t3 := auxToType(v_1_2.Aux)
14241 _ = v_1_2.Args[2]
14242 p3 := v_1_2.Args[0]
14243 mem := v_1_2.Args[2]
14244 if mem.Op != OpZero {
14245 break
14246 }
14247 n := auxIntToInt64(mem.AuxInt)
14248 p4 := mem.Args[0]
14249 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())) {
14250 break
14251 }
14252 b = mem.Block
14253 v0 := b.NewValue0(v.Pos, OpLoad, t1)
14254 v.copyOf(v0)
14255 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
14256 v1.AuxInt = int64ToAuxInt(o1)
14257 v1.AddArg(p4)
14258 v0.AddArg2(v1, mem)
14259 return true
14260 }
14261
14262
14263
14264 for {
14265 t1 := v.Type
14266 op := v_0
14267 if op.Op != OpOffPtr {
14268 break
14269 }
14270 o1 := auxIntToInt64(op.AuxInt)
14271 p1 := op.Args[0]
14272 if v_1.Op != OpStore {
14273 break
14274 }
14275 t2 := auxToType(v_1.Aux)
14276 _ = v_1.Args[2]
14277 p2 := v_1.Args[0]
14278 v_1_2 := v_1.Args[2]
14279 if v_1_2.Op != OpStore {
14280 break
14281 }
14282 t3 := auxToType(v_1_2.Aux)
14283 _ = v_1_2.Args[2]
14284 p3 := v_1_2.Args[0]
14285 v_1_2_2 := v_1_2.Args[2]
14286 if v_1_2_2.Op != OpStore {
14287 break
14288 }
14289 t4 := auxToType(v_1_2_2.Aux)
14290 _ = v_1_2_2.Args[2]
14291 p4 := v_1_2_2.Args[0]
14292 mem := v_1_2_2.Args[2]
14293 if mem.Op != OpZero {
14294 break
14295 }
14296 n := auxIntToInt64(mem.AuxInt)
14297 p5 := mem.Args[0]
14298 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())) {
14299 break
14300 }
14301 b = mem.Block
14302 v0 := b.NewValue0(v.Pos, OpLoad, t1)
14303 v.copyOf(v0)
14304 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
14305 v1.AuxInt = int64ToAuxInt(o1)
14306 v1.AddArg(p5)
14307 v0.AddArg2(v1, mem)
14308 return true
14309 }
14310
14311
14312
14313 for {
14314 t1 := v.Type
14315 op := v_0
14316 if op.Op != OpOffPtr {
14317 break
14318 }
14319 o1 := auxIntToInt64(op.AuxInt)
14320 p1 := op.Args[0]
14321 if v_1.Op != OpStore {
14322 break
14323 }
14324 t2 := auxToType(v_1.Aux)
14325 _ = v_1.Args[2]
14326 p2 := v_1.Args[0]
14327 v_1_2 := v_1.Args[2]
14328 if v_1_2.Op != OpStore {
14329 break
14330 }
14331 t3 := auxToType(v_1_2.Aux)
14332 _ = v_1_2.Args[2]
14333 p3 := v_1_2.Args[0]
14334 v_1_2_2 := v_1_2.Args[2]
14335 if v_1_2_2.Op != OpStore {
14336 break
14337 }
14338 t4 := auxToType(v_1_2_2.Aux)
14339 _ = v_1_2_2.Args[2]
14340 p4 := v_1_2_2.Args[0]
14341 v_1_2_2_2 := v_1_2_2.Args[2]
14342 if v_1_2_2_2.Op != OpStore {
14343 break
14344 }
14345 t5 := auxToType(v_1_2_2_2.Aux)
14346 _ = v_1_2_2_2.Args[2]
14347 p5 := v_1_2_2_2.Args[0]
14348 mem := v_1_2_2_2.Args[2]
14349 if mem.Op != OpZero {
14350 break
14351 }
14352 n := auxIntToInt64(mem.AuxInt)
14353 p6 := mem.Args[0]
14354 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())) {
14355 break
14356 }
14357 b = mem.Block
14358 v0 := b.NewValue0(v.Pos, OpLoad, t1)
14359 v.copyOf(v0)
14360 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
14361 v1.AuxInt = int64ToAuxInt(o1)
14362 v1.AddArg(p6)
14363 v0.AddArg2(v1, mem)
14364 return true
14365 }
14366
14367
14368
14369 for {
14370 t1 := v.Type
14371 if v_0.Op != OpOffPtr {
14372 break
14373 }
14374 o := auxIntToInt64(v_0.AuxInt)
14375 p1 := v_0.Args[0]
14376 if v_1.Op != OpZero {
14377 break
14378 }
14379 n := auxIntToInt64(v_1.AuxInt)
14380 p2 := v_1.Args[0]
14381 if !(t1.IsBoolean() && isSamePtr(p1, p2) && n >= o+1) {
14382 break
14383 }
14384 v.reset(OpConstBool)
14385 v.AuxInt = boolToAuxInt(false)
14386 return true
14387 }
14388
14389
14390
14391 for {
14392 t1 := v.Type
14393 if v_0.Op != OpOffPtr {
14394 break
14395 }
14396 o := auxIntToInt64(v_0.AuxInt)
14397 p1 := v_0.Args[0]
14398 if v_1.Op != OpZero {
14399 break
14400 }
14401 n := auxIntToInt64(v_1.AuxInt)
14402 p2 := v_1.Args[0]
14403 if !(is8BitInt(t1) && isSamePtr(p1, p2) && n >= o+1) {
14404 break
14405 }
14406 v.reset(OpConst8)
14407 v.AuxInt = int8ToAuxInt(0)
14408 return true
14409 }
14410
14411
14412
14413 for {
14414 t1 := v.Type
14415 if v_0.Op != OpOffPtr {
14416 break
14417 }
14418 o := auxIntToInt64(v_0.AuxInt)
14419 p1 := v_0.Args[0]
14420 if v_1.Op != OpZero {
14421 break
14422 }
14423 n := auxIntToInt64(v_1.AuxInt)
14424 p2 := v_1.Args[0]
14425 if !(is16BitInt(t1) && isSamePtr(p1, p2) && n >= o+2) {
14426 break
14427 }
14428 v.reset(OpConst16)
14429 v.AuxInt = int16ToAuxInt(0)
14430 return true
14431 }
14432
14433
14434
14435 for {
14436 t1 := v.Type
14437 if v_0.Op != OpOffPtr {
14438 break
14439 }
14440 o := auxIntToInt64(v_0.AuxInt)
14441 p1 := v_0.Args[0]
14442 if v_1.Op != OpZero {
14443 break
14444 }
14445 n := auxIntToInt64(v_1.AuxInt)
14446 p2 := v_1.Args[0]
14447 if !(is32BitInt(t1) && isSamePtr(p1, p2) && n >= o+4) {
14448 break
14449 }
14450 v.reset(OpConst32)
14451 v.AuxInt = int32ToAuxInt(0)
14452 return true
14453 }
14454
14455
14456
14457 for {
14458 t1 := v.Type
14459 if v_0.Op != OpOffPtr {
14460 break
14461 }
14462 o := auxIntToInt64(v_0.AuxInt)
14463 p1 := v_0.Args[0]
14464 if v_1.Op != OpZero {
14465 break
14466 }
14467 n := auxIntToInt64(v_1.AuxInt)
14468 p2 := v_1.Args[0]
14469 if !(is64BitInt(t1) && isSamePtr(p1, p2) && n >= o+8) {
14470 break
14471 }
14472 v.reset(OpConst64)
14473 v.AuxInt = int64ToAuxInt(0)
14474 return true
14475 }
14476
14477
14478
14479 for {
14480 t1 := v.Type
14481 if v_0.Op != OpOffPtr {
14482 break
14483 }
14484 o := auxIntToInt64(v_0.AuxInt)
14485 p1 := v_0.Args[0]
14486 if v_1.Op != OpZero {
14487 break
14488 }
14489 n := auxIntToInt64(v_1.AuxInt)
14490 p2 := v_1.Args[0]
14491 if !(is32BitFloat(t1) && isSamePtr(p1, p2) && n >= o+4) {
14492 break
14493 }
14494 v.reset(OpConst32F)
14495 v.AuxInt = float32ToAuxInt(0)
14496 return true
14497 }
14498
14499
14500
14501 for {
14502 t1 := v.Type
14503 if v_0.Op != OpOffPtr {
14504 break
14505 }
14506 o := auxIntToInt64(v_0.AuxInt)
14507 p1 := v_0.Args[0]
14508 if v_1.Op != OpZero {
14509 break
14510 }
14511 n := auxIntToInt64(v_1.AuxInt)
14512 p2 := v_1.Args[0]
14513 if !(is64BitFloat(t1) && isSamePtr(p1, p2) && n >= o+8) {
14514 break
14515 }
14516 v.reset(OpConst64F)
14517 v.AuxInt = float64ToAuxInt(0)
14518 return true
14519 }
14520
14521
14522
14523 for {
14524 t := v.Type
14525 if !(t.IsStruct() && t.Size() > 0 && CanSSA(t) && !t.IsSIMD()) {
14526 break
14527 }
14528 v.copyOf(rewriteStructLoad(v))
14529 return true
14530 }
14531
14532
14533
14534 for {
14535 t := v.Type
14536 ptr := v_0
14537 mem := v_1
14538 if !(t.IsArray() && t.NumElem() == 1 && CanSSA(t)) {
14539 break
14540 }
14541 v.reset(OpArrayMake1)
14542 v0 := b.NewValue0(v.Pos, OpLoad, t.Elem())
14543 v0.AddArg2(ptr, mem)
14544 v.AddArg(v0)
14545 return true
14546 }
14547
14548
14549
14550 for {
14551 t := v.Type
14552 if !(t.Size() == 0) {
14553 break
14554 }
14555 v.reset(OpEmpty)
14556 return true
14557 }
14558
14559
14560
14561 for {
14562 if v.Type != typ.Int8 {
14563 break
14564 }
14565 sptr := v_0
14566 if sptr.Op != OpAddr {
14567 break
14568 }
14569 scon := auxToSym(sptr.Aux)
14570 sptr_0 := sptr.Args[0]
14571 if sptr_0.Op != OpSB {
14572 break
14573 }
14574 if !(symIsRO(scon)) {
14575 break
14576 }
14577 v.reset(OpConst8)
14578 v.Type = typ.Int8
14579 v.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
14580 return true
14581 }
14582
14583
14584
14585 for {
14586 if v.Type != typ.Int16 {
14587 break
14588 }
14589 sptr := v_0
14590 if sptr.Op != OpAddr {
14591 break
14592 }
14593 scon := auxToSym(sptr.Aux)
14594 sptr_0 := sptr.Args[0]
14595 if sptr_0.Op != OpSB {
14596 break
14597 }
14598 if !(symIsRO(scon)) {
14599 break
14600 }
14601 v.reset(OpConst16)
14602 v.Type = typ.Int16
14603 v.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
14604 return true
14605 }
14606
14607
14608
14609 for {
14610 if v.Type != typ.Int32 {
14611 break
14612 }
14613 sptr := v_0
14614 if sptr.Op != OpAddr {
14615 break
14616 }
14617 scon := auxToSym(sptr.Aux)
14618 sptr_0 := sptr.Args[0]
14619 if sptr_0.Op != OpSB {
14620 break
14621 }
14622 if !(symIsRO(scon)) {
14623 break
14624 }
14625 v.reset(OpConst32)
14626 v.Type = typ.Int32
14627 v.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
14628 return true
14629 }
14630
14631
14632
14633 for {
14634 if v.Type != typ.Int64 {
14635 break
14636 }
14637 sptr := v_0
14638 if sptr.Op != OpAddr {
14639 break
14640 }
14641 scon := auxToSym(sptr.Aux)
14642 sptr_0 := sptr.Args[0]
14643 if sptr_0.Op != OpSB {
14644 break
14645 }
14646 if !(symIsRO(scon)) {
14647 break
14648 }
14649 v.reset(OpConst64)
14650 v.Type = typ.Int64
14651 v.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
14652 return true
14653 }
14654
14655
14656
14657 for {
14658 if v_0.Op != OpAddr {
14659 break
14660 }
14661 s := auxToSym(v_0.Aux)
14662 sb := v_0.Args[0]
14663 if !(isFixedLoad(v, s, 0)) {
14664 break
14665 }
14666 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
14667 return true
14668 }
14669
14670
14671
14672 for {
14673 if v_0.Op != OpConvert {
14674 break
14675 }
14676 v_0_0 := v_0.Args[0]
14677 if v_0_0.Op != OpAddr {
14678 break
14679 }
14680 s := auxToSym(v_0_0.Aux)
14681 sb := v_0_0.Args[0]
14682 if !(isFixedLoad(v, s, 0)) {
14683 break
14684 }
14685 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
14686 return true
14687 }
14688
14689
14690
14691 for {
14692 if v_0.Op != OpITab {
14693 break
14694 }
14695 v_0_0 := v_0.Args[0]
14696 if v_0_0.Op != OpIMake {
14697 break
14698 }
14699 v_0_0_0 := v_0_0.Args[0]
14700 if v_0_0_0.Op != OpAddr {
14701 break
14702 }
14703 s := auxToSym(v_0_0_0.Aux)
14704 sb := v_0_0_0.Args[0]
14705 if !(isFixedLoad(v, s, 0)) {
14706 break
14707 }
14708 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
14709 return true
14710 }
14711
14712
14713
14714 for {
14715 if v_0.Op != OpITab {
14716 break
14717 }
14718 v_0_0 := v_0.Args[0]
14719 if v_0_0.Op != OpIMake {
14720 break
14721 }
14722 v_0_0_0 := v_0_0.Args[0]
14723 if v_0_0_0.Op != OpConvert {
14724 break
14725 }
14726 v_0_0_0_0 := v_0_0_0.Args[0]
14727 if v_0_0_0_0.Op != OpAddr {
14728 break
14729 }
14730 s := auxToSym(v_0_0_0_0.Aux)
14731 sb := v_0_0_0_0.Args[0]
14732 if !(isFixedLoad(v, s, 0)) {
14733 break
14734 }
14735 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
14736 return true
14737 }
14738
14739
14740
14741 for {
14742 if v_0.Op != OpOffPtr {
14743 break
14744 }
14745 off := auxIntToInt64(v_0.AuxInt)
14746 v_0_0 := v_0.Args[0]
14747 if v_0_0.Op != OpAddr {
14748 break
14749 }
14750 s := auxToSym(v_0_0.Aux)
14751 sb := v_0_0.Args[0]
14752 if !(isFixedLoad(v, s, off)) {
14753 break
14754 }
14755 v.copyOf(rewriteFixedLoad(v, s, sb, off))
14756 return true
14757 }
14758
14759
14760
14761 for {
14762 if v_0.Op != OpOffPtr {
14763 break
14764 }
14765 off := auxIntToInt64(v_0.AuxInt)
14766 v_0_0 := v_0.Args[0]
14767 if v_0_0.Op != OpConvert {
14768 break
14769 }
14770 v_0_0_0 := v_0_0.Args[0]
14771 if v_0_0_0.Op != OpAddr {
14772 break
14773 }
14774 s := auxToSym(v_0_0_0.Aux)
14775 sb := v_0_0_0.Args[0]
14776 if !(isFixedLoad(v, s, off)) {
14777 break
14778 }
14779 v.copyOf(rewriteFixedLoad(v, s, sb, off))
14780 return true
14781 }
14782
14783
14784
14785 for {
14786 if v_0.Op != OpOffPtr {
14787 break
14788 }
14789 off := auxIntToInt64(v_0.AuxInt)
14790 v_0_0 := v_0.Args[0]
14791 if v_0_0.Op != OpITab {
14792 break
14793 }
14794 v_0_0_0 := v_0_0.Args[0]
14795 if v_0_0_0.Op != OpIMake {
14796 break
14797 }
14798 v_0_0_0_0 := v_0_0_0.Args[0]
14799 if v_0_0_0_0.Op != OpAddr {
14800 break
14801 }
14802 s := auxToSym(v_0_0_0_0.Aux)
14803 sb := v_0_0_0_0.Args[0]
14804 if !(isFixedLoad(v, s, off)) {
14805 break
14806 }
14807 v.copyOf(rewriteFixedLoad(v, s, sb, off))
14808 return true
14809 }
14810
14811
14812
14813 for {
14814 if v_0.Op != OpOffPtr {
14815 break
14816 }
14817 off := auxIntToInt64(v_0.AuxInt)
14818 v_0_0 := v_0.Args[0]
14819 if v_0_0.Op != OpITab {
14820 break
14821 }
14822 v_0_0_0 := v_0_0.Args[0]
14823 if v_0_0_0.Op != OpIMake {
14824 break
14825 }
14826 v_0_0_0_0 := v_0_0_0.Args[0]
14827 if v_0_0_0_0.Op != OpConvert {
14828 break
14829 }
14830 v_0_0_0_0_0 := v_0_0_0_0.Args[0]
14831 if v_0_0_0_0_0.Op != OpAddr {
14832 break
14833 }
14834 s := auxToSym(v_0_0_0_0_0.Aux)
14835 sb := v_0_0_0_0_0.Args[0]
14836 if !(isFixedLoad(v, s, off)) {
14837 break
14838 }
14839 v.copyOf(rewriteFixedLoad(v, s, sb, off))
14840 return true
14841 }
14842 return false
14843 }
14844 func rewriteValuegeneric_OpLsh16x16(v *Value) bool {
14845 v_1 := v.Args[1]
14846 v_0 := v.Args[0]
14847 b := v.Block
14848
14849
14850 for {
14851 x := v_0
14852 if v_1.Op != OpConst16 {
14853 break
14854 }
14855 c := auxIntToInt16(v_1.AuxInt)
14856 v.reset(OpLsh16x64)
14857 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
14858 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
14859 v.AddArg2(x, v0)
14860 return true
14861 }
14862
14863
14864 for {
14865 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
14866 break
14867 }
14868 v.reset(OpConst16)
14869 v.AuxInt = int16ToAuxInt(0)
14870 return true
14871 }
14872
14873
14874
14875 for {
14876 if auxIntToBool(v.AuxInt) != false {
14877 break
14878 }
14879 x := v_0
14880 con := v_1
14881 if con.Op != OpConst16 {
14882 break
14883 }
14884 c := auxIntToInt16(con.AuxInt)
14885 if !(0 < c && c < 16) {
14886 break
14887 }
14888 v.reset(OpLsh16x16)
14889 v.AuxInt = boolToAuxInt(true)
14890 v.AddArg2(x, con)
14891 return true
14892 }
14893 return false
14894 }
14895 func rewriteValuegeneric_OpLsh16x32(v *Value) bool {
14896 v_1 := v.Args[1]
14897 v_0 := v.Args[0]
14898 b := v.Block
14899
14900
14901 for {
14902 x := v_0
14903 if v_1.Op != OpConst32 {
14904 break
14905 }
14906 c := auxIntToInt32(v_1.AuxInt)
14907 v.reset(OpLsh16x64)
14908 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
14909 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
14910 v.AddArg2(x, v0)
14911 return true
14912 }
14913
14914
14915 for {
14916 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
14917 break
14918 }
14919 v.reset(OpConst16)
14920 v.AuxInt = int16ToAuxInt(0)
14921 return true
14922 }
14923
14924
14925
14926 for {
14927 if auxIntToBool(v.AuxInt) != false {
14928 break
14929 }
14930 x := v_0
14931 con := v_1
14932 if con.Op != OpConst32 {
14933 break
14934 }
14935 c := auxIntToInt32(con.AuxInt)
14936 if !(0 < c && c < 16) {
14937 break
14938 }
14939 v.reset(OpLsh16x32)
14940 v.AuxInt = boolToAuxInt(true)
14941 v.AddArg2(x, con)
14942 return true
14943 }
14944 return false
14945 }
14946 func rewriteValuegeneric_OpLsh16x64(v *Value) bool {
14947 v_1 := v.Args[1]
14948 v_0 := v.Args[0]
14949 b := v.Block
14950 typ := &b.Func.Config.Types
14951
14952
14953 for {
14954 if v_0.Op != OpConst16 {
14955 break
14956 }
14957 c := auxIntToInt16(v_0.AuxInt)
14958 if v_1.Op != OpConst64 {
14959 break
14960 }
14961 d := auxIntToInt64(v_1.AuxInt)
14962 v.reset(OpConst16)
14963 v.AuxInt = int16ToAuxInt(c << uint64(d))
14964 return true
14965 }
14966
14967
14968 for {
14969 x := v_0
14970 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
14971 break
14972 }
14973 v.copyOf(x)
14974 return true
14975 }
14976
14977
14978 for {
14979 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
14980 break
14981 }
14982 v.reset(OpConst16)
14983 v.AuxInt = int16ToAuxInt(0)
14984 return true
14985 }
14986
14987
14988
14989 for {
14990 if v_1.Op != OpConst64 {
14991 break
14992 }
14993 c := auxIntToInt64(v_1.AuxInt)
14994 if !(uint64(c) >= 16) {
14995 break
14996 }
14997 v.reset(OpConst16)
14998 v.AuxInt = int16ToAuxInt(0)
14999 return true
15000 }
15001
15002
15003
15004 for {
15005 t := v.Type
15006 if v_0.Op != OpLsh16x64 {
15007 break
15008 }
15009 _ = v_0.Args[1]
15010 x := v_0.Args[0]
15011 v_0_1 := v_0.Args[1]
15012 if v_0_1.Op != OpConst64 {
15013 break
15014 }
15015 c := auxIntToInt64(v_0_1.AuxInt)
15016 if v_1.Op != OpConst64 {
15017 break
15018 }
15019 d := auxIntToInt64(v_1.AuxInt)
15020 if !(!uaddOvf(c, d)) {
15021 break
15022 }
15023 v.reset(OpLsh16x64)
15024 v0 := b.NewValue0(v.Pos, OpConst64, t)
15025 v0.AuxInt = int64ToAuxInt(c + d)
15026 v.AddArg2(x, v0)
15027 return true
15028 }
15029
15030
15031
15032 for {
15033 i := v_0
15034 if i.Op != OpRsh16x64 {
15035 break
15036 }
15037 _ = i.Args[1]
15038 x := i.Args[0]
15039 i_1 := i.Args[1]
15040 if i_1.Op != OpConst64 {
15041 break
15042 }
15043 c := auxIntToInt64(i_1.AuxInt)
15044 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
15045 break
15046 }
15047 v.reset(OpAnd16)
15048 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
15049 v0.AuxInt = int16ToAuxInt(int16(-1) << c)
15050 v.AddArg2(x, v0)
15051 return true
15052 }
15053
15054
15055
15056 for {
15057 i := v_0
15058 if i.Op != OpRsh16Ux64 {
15059 break
15060 }
15061 _ = i.Args[1]
15062 x := i.Args[0]
15063 i_1 := i.Args[1]
15064 if i_1.Op != OpConst64 {
15065 break
15066 }
15067 c := auxIntToInt64(i_1.AuxInt)
15068 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
15069 break
15070 }
15071 v.reset(OpAnd16)
15072 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
15073 v0.AuxInt = int16ToAuxInt(int16(-1) << c)
15074 v.AddArg2(x, v0)
15075 return true
15076 }
15077
15078
15079
15080 for {
15081 if v_0.Op != OpRsh16Ux64 {
15082 break
15083 }
15084 _ = v_0.Args[1]
15085 v_0_0 := v_0.Args[0]
15086 if v_0_0.Op != OpLsh16x64 {
15087 break
15088 }
15089 _ = v_0_0.Args[1]
15090 x := v_0_0.Args[0]
15091 v_0_0_1 := v_0_0.Args[1]
15092 if v_0_0_1.Op != OpConst64 {
15093 break
15094 }
15095 c1 := auxIntToInt64(v_0_0_1.AuxInt)
15096 v_0_1 := v_0.Args[1]
15097 if v_0_1.Op != OpConst64 {
15098 break
15099 }
15100 c2 := auxIntToInt64(v_0_1.AuxInt)
15101 if v_1.Op != OpConst64 {
15102 break
15103 }
15104 c3 := auxIntToInt64(v_1.AuxInt)
15105 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
15106 break
15107 }
15108 v.reset(OpLsh16x64)
15109 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
15110 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
15111 v.AddArg2(x, v0)
15112 return true
15113 }
15114
15115
15116
15117 for {
15118 if v_0.Op != OpAnd16 {
15119 break
15120 }
15121 _ = v_0.Args[1]
15122 v_0_0 := v_0.Args[0]
15123 v_0_1 := v_0.Args[1]
15124 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15125 if v_0_0.Op != OpRsh16x64 {
15126 continue
15127 }
15128 t := v_0_0.Type
15129 _ = v_0_0.Args[1]
15130 x := v_0_0.Args[0]
15131 v_0_0_1 := v_0_0.Args[1]
15132 if v_0_0_1.Op != OpConst64 {
15133 continue
15134 }
15135 t2 := v_0_0_1.Type
15136 c := auxIntToInt64(v_0_0_1.AuxInt)
15137 if v_0_1.Op != OpConst16 {
15138 continue
15139 }
15140 d := auxIntToInt16(v_0_1.AuxInt)
15141 if v_1.Op != OpConst64 {
15142 continue
15143 }
15144 e := auxIntToInt64(v_1.AuxInt)
15145 if !(c >= e) {
15146 continue
15147 }
15148 v.reset(OpAnd16)
15149 v0 := b.NewValue0(v.Pos, OpRsh16x64, t)
15150 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15151 v1.AuxInt = int64ToAuxInt(c - e)
15152 v0.AddArg2(x, v1)
15153 v2 := b.NewValue0(v.Pos, OpConst16, t)
15154 v2.AuxInt = int16ToAuxInt(d << e)
15155 v.AddArg2(v0, v2)
15156 return true
15157 }
15158 break
15159 }
15160
15161
15162
15163 for {
15164 if v_0.Op != OpAnd16 {
15165 break
15166 }
15167 _ = v_0.Args[1]
15168 v_0_0 := v_0.Args[0]
15169 v_0_1 := v_0.Args[1]
15170 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15171 if v_0_0.Op != OpRsh16Ux64 {
15172 continue
15173 }
15174 t := v_0_0.Type
15175 _ = v_0_0.Args[1]
15176 x := v_0_0.Args[0]
15177 v_0_0_1 := v_0_0.Args[1]
15178 if v_0_0_1.Op != OpConst64 {
15179 continue
15180 }
15181 t2 := v_0_0_1.Type
15182 c := auxIntToInt64(v_0_0_1.AuxInt)
15183 if v_0_1.Op != OpConst16 {
15184 continue
15185 }
15186 d := auxIntToInt16(v_0_1.AuxInt)
15187 if v_1.Op != OpConst64 {
15188 continue
15189 }
15190 e := auxIntToInt64(v_1.AuxInt)
15191 if !(c >= e) {
15192 continue
15193 }
15194 v.reset(OpAnd16)
15195 v0 := b.NewValue0(v.Pos, OpRsh16Ux64, t)
15196 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15197 v1.AuxInt = int64ToAuxInt(c - e)
15198 v0.AddArg2(x, v1)
15199 v2 := b.NewValue0(v.Pos, OpConst16, t)
15200 v2.AuxInt = int16ToAuxInt(d << e)
15201 v.AddArg2(v0, v2)
15202 return true
15203 }
15204 break
15205 }
15206
15207
15208
15209 for {
15210 if v_0.Op != OpAnd16 {
15211 break
15212 }
15213 _ = v_0.Args[1]
15214 v_0_0 := v_0.Args[0]
15215 v_0_1 := v_0.Args[1]
15216 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15217 if v_0_0.Op != OpRsh16x64 {
15218 continue
15219 }
15220 t := v_0_0.Type
15221 _ = v_0_0.Args[1]
15222 x := v_0_0.Args[0]
15223 v_0_0_1 := v_0_0.Args[1]
15224 if v_0_0_1.Op != OpConst64 {
15225 continue
15226 }
15227 t2 := v_0_0_1.Type
15228 c := auxIntToInt64(v_0_0_1.AuxInt)
15229 if v_0_1.Op != OpConst16 {
15230 continue
15231 }
15232 d := auxIntToInt16(v_0_1.AuxInt)
15233 if v_1.Op != OpConst64 {
15234 continue
15235 }
15236 e := auxIntToInt64(v_1.AuxInt)
15237 if !(c < e) {
15238 continue
15239 }
15240 v.reset(OpAnd16)
15241 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
15242 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15243 v1.AuxInt = int64ToAuxInt(e - c)
15244 v0.AddArg2(x, v1)
15245 v2 := b.NewValue0(v.Pos, OpConst16, t)
15246 v2.AuxInt = int16ToAuxInt(d << e)
15247 v.AddArg2(v0, v2)
15248 return true
15249 }
15250 break
15251 }
15252
15253
15254
15255 for {
15256 if v_0.Op != OpAnd16 {
15257 break
15258 }
15259 _ = v_0.Args[1]
15260 v_0_0 := v_0.Args[0]
15261 v_0_1 := v_0.Args[1]
15262 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15263 if v_0_0.Op != OpRsh16Ux64 {
15264 continue
15265 }
15266 t := v_0_0.Type
15267 _ = v_0_0.Args[1]
15268 x := v_0_0.Args[0]
15269 v_0_0_1 := v_0_0.Args[1]
15270 if v_0_0_1.Op != OpConst64 {
15271 continue
15272 }
15273 t2 := v_0_0_1.Type
15274 c := auxIntToInt64(v_0_0_1.AuxInt)
15275 if v_0_1.Op != OpConst16 {
15276 continue
15277 }
15278 d := auxIntToInt16(v_0_1.AuxInt)
15279 if v_1.Op != OpConst64 {
15280 continue
15281 }
15282 e := auxIntToInt64(v_1.AuxInt)
15283 if !(c < e) {
15284 continue
15285 }
15286 v.reset(OpAnd16)
15287 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
15288 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15289 v1.AuxInt = int64ToAuxInt(e - c)
15290 v0.AddArg2(x, v1)
15291 v2 := b.NewValue0(v.Pos, OpConst16, t)
15292 v2.AuxInt = int16ToAuxInt(d << e)
15293 v.AddArg2(v0, v2)
15294 return true
15295 }
15296 break
15297 }
15298
15299
15300
15301 for {
15302 if auxIntToBool(v.AuxInt) != false {
15303 break
15304 }
15305 x := v_0
15306 con := v_1
15307 if con.Op != OpConst64 {
15308 break
15309 }
15310 c := auxIntToInt64(con.AuxInt)
15311 if !(0 < c && c < 16) {
15312 break
15313 }
15314 v.reset(OpLsh16x64)
15315 v.AuxInt = boolToAuxInt(true)
15316 v.AddArg2(x, con)
15317 return true
15318 }
15319 return false
15320 }
15321 func rewriteValuegeneric_OpLsh16x8(v *Value) bool {
15322 v_1 := v.Args[1]
15323 v_0 := v.Args[0]
15324 b := v.Block
15325
15326
15327 for {
15328 x := v_0
15329 if v_1.Op != OpConst8 {
15330 break
15331 }
15332 c := auxIntToInt8(v_1.AuxInt)
15333 v.reset(OpLsh16x64)
15334 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
15335 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
15336 v.AddArg2(x, v0)
15337 return true
15338 }
15339
15340
15341 for {
15342 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
15343 break
15344 }
15345 v.reset(OpConst16)
15346 v.AuxInt = int16ToAuxInt(0)
15347 return true
15348 }
15349
15350
15351
15352 for {
15353 if auxIntToBool(v.AuxInt) != false {
15354 break
15355 }
15356 x := v_0
15357 con := v_1
15358 if con.Op != OpConst8 {
15359 break
15360 }
15361 c := auxIntToInt8(con.AuxInt)
15362 if !(0 < c && c < 16) {
15363 break
15364 }
15365 v.reset(OpLsh16x8)
15366 v.AuxInt = boolToAuxInt(true)
15367 v.AddArg2(x, con)
15368 return true
15369 }
15370 return false
15371 }
15372 func rewriteValuegeneric_OpLsh32x16(v *Value) bool {
15373 v_1 := v.Args[1]
15374 v_0 := v.Args[0]
15375 b := v.Block
15376
15377
15378 for {
15379 x := v_0
15380 if v_1.Op != OpConst16 {
15381 break
15382 }
15383 c := auxIntToInt16(v_1.AuxInt)
15384 v.reset(OpLsh32x64)
15385 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
15386 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
15387 v.AddArg2(x, v0)
15388 return true
15389 }
15390
15391
15392 for {
15393 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
15394 break
15395 }
15396 v.reset(OpConst32)
15397 v.AuxInt = int32ToAuxInt(0)
15398 return true
15399 }
15400
15401
15402
15403 for {
15404 if auxIntToBool(v.AuxInt) != false {
15405 break
15406 }
15407 x := v_0
15408 con := v_1
15409 if con.Op != OpConst16 {
15410 break
15411 }
15412 c := auxIntToInt16(con.AuxInt)
15413 if !(0 < c && c < 32) {
15414 break
15415 }
15416 v.reset(OpLsh32x16)
15417 v.AuxInt = boolToAuxInt(true)
15418 v.AddArg2(x, con)
15419 return true
15420 }
15421 return false
15422 }
15423 func rewriteValuegeneric_OpLsh32x32(v *Value) bool {
15424 v_1 := v.Args[1]
15425 v_0 := v.Args[0]
15426 b := v.Block
15427
15428
15429 for {
15430 x := v_0
15431 if v_1.Op != OpConst32 {
15432 break
15433 }
15434 c := auxIntToInt32(v_1.AuxInt)
15435 v.reset(OpLsh32x64)
15436 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
15437 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
15438 v.AddArg2(x, v0)
15439 return true
15440 }
15441
15442
15443 for {
15444 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
15445 break
15446 }
15447 v.reset(OpConst32)
15448 v.AuxInt = int32ToAuxInt(0)
15449 return true
15450 }
15451
15452
15453
15454 for {
15455 if auxIntToBool(v.AuxInt) != false {
15456 break
15457 }
15458 x := v_0
15459 con := v_1
15460 if con.Op != OpConst32 {
15461 break
15462 }
15463 c := auxIntToInt32(con.AuxInt)
15464 if !(0 < c && c < 32) {
15465 break
15466 }
15467 v.reset(OpLsh32x32)
15468 v.AuxInt = boolToAuxInt(true)
15469 v.AddArg2(x, con)
15470 return true
15471 }
15472 return false
15473 }
15474 func rewriteValuegeneric_OpLsh32x64(v *Value) bool {
15475 v_1 := v.Args[1]
15476 v_0 := v.Args[0]
15477 b := v.Block
15478 typ := &b.Func.Config.Types
15479
15480
15481 for {
15482 if v_0.Op != OpConst32 {
15483 break
15484 }
15485 c := auxIntToInt32(v_0.AuxInt)
15486 if v_1.Op != OpConst64 {
15487 break
15488 }
15489 d := auxIntToInt64(v_1.AuxInt)
15490 v.reset(OpConst32)
15491 v.AuxInt = int32ToAuxInt(c << uint64(d))
15492 return true
15493 }
15494
15495
15496 for {
15497 x := v_0
15498 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
15499 break
15500 }
15501 v.copyOf(x)
15502 return true
15503 }
15504
15505
15506 for {
15507 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
15508 break
15509 }
15510 v.reset(OpConst32)
15511 v.AuxInt = int32ToAuxInt(0)
15512 return true
15513 }
15514
15515
15516
15517 for {
15518 if v_1.Op != OpConst64 {
15519 break
15520 }
15521 c := auxIntToInt64(v_1.AuxInt)
15522 if !(uint64(c) >= 32) {
15523 break
15524 }
15525 v.reset(OpConst32)
15526 v.AuxInt = int32ToAuxInt(0)
15527 return true
15528 }
15529
15530
15531
15532 for {
15533 t := v.Type
15534 if v_0.Op != OpLsh32x64 {
15535 break
15536 }
15537 _ = v_0.Args[1]
15538 x := v_0.Args[0]
15539 v_0_1 := v_0.Args[1]
15540 if v_0_1.Op != OpConst64 {
15541 break
15542 }
15543 c := auxIntToInt64(v_0_1.AuxInt)
15544 if v_1.Op != OpConst64 {
15545 break
15546 }
15547 d := auxIntToInt64(v_1.AuxInt)
15548 if !(!uaddOvf(c, d)) {
15549 break
15550 }
15551 v.reset(OpLsh32x64)
15552 v0 := b.NewValue0(v.Pos, OpConst64, t)
15553 v0.AuxInt = int64ToAuxInt(c + d)
15554 v.AddArg2(x, v0)
15555 return true
15556 }
15557
15558
15559
15560 for {
15561 i := v_0
15562 if i.Op != OpRsh32x64 {
15563 break
15564 }
15565 _ = i.Args[1]
15566 x := i.Args[0]
15567 i_1 := i.Args[1]
15568 if i_1.Op != OpConst64 {
15569 break
15570 }
15571 c := auxIntToInt64(i_1.AuxInt)
15572 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
15573 break
15574 }
15575 v.reset(OpAnd32)
15576 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
15577 v0.AuxInt = int32ToAuxInt(int32(-1) << c)
15578 v.AddArg2(x, v0)
15579 return true
15580 }
15581
15582
15583
15584 for {
15585 i := v_0
15586 if i.Op != OpRsh32Ux64 {
15587 break
15588 }
15589 _ = i.Args[1]
15590 x := i.Args[0]
15591 i_1 := i.Args[1]
15592 if i_1.Op != OpConst64 {
15593 break
15594 }
15595 c := auxIntToInt64(i_1.AuxInt)
15596 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
15597 break
15598 }
15599 v.reset(OpAnd32)
15600 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
15601 v0.AuxInt = int32ToAuxInt(int32(-1) << c)
15602 v.AddArg2(x, v0)
15603 return true
15604 }
15605
15606
15607
15608 for {
15609 if v_0.Op != OpRsh32Ux64 {
15610 break
15611 }
15612 _ = v_0.Args[1]
15613 v_0_0 := v_0.Args[0]
15614 if v_0_0.Op != OpLsh32x64 {
15615 break
15616 }
15617 _ = v_0_0.Args[1]
15618 x := v_0_0.Args[0]
15619 v_0_0_1 := v_0_0.Args[1]
15620 if v_0_0_1.Op != OpConst64 {
15621 break
15622 }
15623 c1 := auxIntToInt64(v_0_0_1.AuxInt)
15624 v_0_1 := v_0.Args[1]
15625 if v_0_1.Op != OpConst64 {
15626 break
15627 }
15628 c2 := auxIntToInt64(v_0_1.AuxInt)
15629 if v_1.Op != OpConst64 {
15630 break
15631 }
15632 c3 := auxIntToInt64(v_1.AuxInt)
15633 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
15634 break
15635 }
15636 v.reset(OpLsh32x64)
15637 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
15638 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
15639 v.AddArg2(x, v0)
15640 return true
15641 }
15642
15643
15644
15645 for {
15646 if v_0.Op != OpAnd32 {
15647 break
15648 }
15649 _ = v_0.Args[1]
15650 v_0_0 := v_0.Args[0]
15651 v_0_1 := v_0.Args[1]
15652 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15653 if v_0_0.Op != OpRsh32x64 {
15654 continue
15655 }
15656 t := v_0_0.Type
15657 _ = v_0_0.Args[1]
15658 x := v_0_0.Args[0]
15659 v_0_0_1 := v_0_0.Args[1]
15660 if v_0_0_1.Op != OpConst64 {
15661 continue
15662 }
15663 t2 := v_0_0_1.Type
15664 c := auxIntToInt64(v_0_0_1.AuxInt)
15665 if v_0_1.Op != OpConst32 {
15666 continue
15667 }
15668 d := auxIntToInt32(v_0_1.AuxInt)
15669 if v_1.Op != OpConst64 {
15670 continue
15671 }
15672 e := auxIntToInt64(v_1.AuxInt)
15673 if !(c >= e) {
15674 continue
15675 }
15676 v.reset(OpAnd32)
15677 v0 := b.NewValue0(v.Pos, OpRsh32x64, t)
15678 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15679 v1.AuxInt = int64ToAuxInt(c - e)
15680 v0.AddArg2(x, v1)
15681 v2 := b.NewValue0(v.Pos, OpConst32, t)
15682 v2.AuxInt = int32ToAuxInt(d << e)
15683 v.AddArg2(v0, v2)
15684 return true
15685 }
15686 break
15687 }
15688
15689
15690
15691 for {
15692 if v_0.Op != OpAnd32 {
15693 break
15694 }
15695 _ = v_0.Args[1]
15696 v_0_0 := v_0.Args[0]
15697 v_0_1 := v_0.Args[1]
15698 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15699 if v_0_0.Op != OpRsh32Ux64 {
15700 continue
15701 }
15702 t := v_0_0.Type
15703 _ = v_0_0.Args[1]
15704 x := v_0_0.Args[0]
15705 v_0_0_1 := v_0_0.Args[1]
15706 if v_0_0_1.Op != OpConst64 {
15707 continue
15708 }
15709 t2 := v_0_0_1.Type
15710 c := auxIntToInt64(v_0_0_1.AuxInt)
15711 if v_0_1.Op != OpConst32 {
15712 continue
15713 }
15714 d := auxIntToInt32(v_0_1.AuxInt)
15715 if v_1.Op != OpConst64 {
15716 continue
15717 }
15718 e := auxIntToInt64(v_1.AuxInt)
15719 if !(c >= e) {
15720 continue
15721 }
15722 v.reset(OpAnd32)
15723 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, t)
15724 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15725 v1.AuxInt = int64ToAuxInt(c - e)
15726 v0.AddArg2(x, v1)
15727 v2 := b.NewValue0(v.Pos, OpConst32, t)
15728 v2.AuxInt = int32ToAuxInt(d << e)
15729 v.AddArg2(v0, v2)
15730 return true
15731 }
15732 break
15733 }
15734
15735
15736
15737 for {
15738 if v_0.Op != OpAnd32 {
15739 break
15740 }
15741 _ = v_0.Args[1]
15742 v_0_0 := v_0.Args[0]
15743 v_0_1 := v_0.Args[1]
15744 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15745 if v_0_0.Op != OpRsh32x64 {
15746 continue
15747 }
15748 t := v_0_0.Type
15749 _ = v_0_0.Args[1]
15750 x := v_0_0.Args[0]
15751 v_0_0_1 := v_0_0.Args[1]
15752 if v_0_0_1.Op != OpConst64 {
15753 continue
15754 }
15755 t2 := v_0_0_1.Type
15756 c := auxIntToInt64(v_0_0_1.AuxInt)
15757 if v_0_1.Op != OpConst32 {
15758 continue
15759 }
15760 d := auxIntToInt32(v_0_1.AuxInt)
15761 if v_1.Op != OpConst64 {
15762 continue
15763 }
15764 e := auxIntToInt64(v_1.AuxInt)
15765 if !(c < e) {
15766 continue
15767 }
15768 v.reset(OpAnd32)
15769 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
15770 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15771 v1.AuxInt = int64ToAuxInt(e - c)
15772 v0.AddArg2(x, v1)
15773 v2 := b.NewValue0(v.Pos, OpConst32, t)
15774 v2.AuxInt = int32ToAuxInt(d << e)
15775 v.AddArg2(v0, v2)
15776 return true
15777 }
15778 break
15779 }
15780
15781
15782
15783 for {
15784 if v_0.Op != OpAnd32 {
15785 break
15786 }
15787 _ = v_0.Args[1]
15788 v_0_0 := v_0.Args[0]
15789 v_0_1 := v_0.Args[1]
15790 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
15791 if v_0_0.Op != OpRsh32Ux64 {
15792 continue
15793 }
15794 t := v_0_0.Type
15795 _ = v_0_0.Args[1]
15796 x := v_0_0.Args[0]
15797 v_0_0_1 := v_0_0.Args[1]
15798 if v_0_0_1.Op != OpConst64 {
15799 continue
15800 }
15801 t2 := v_0_0_1.Type
15802 c := auxIntToInt64(v_0_0_1.AuxInt)
15803 if v_0_1.Op != OpConst32 {
15804 continue
15805 }
15806 d := auxIntToInt32(v_0_1.AuxInt)
15807 if v_1.Op != OpConst64 {
15808 continue
15809 }
15810 e := auxIntToInt64(v_1.AuxInt)
15811 if !(c < e) {
15812 continue
15813 }
15814 v.reset(OpAnd32)
15815 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
15816 v1 := b.NewValue0(v.Pos, OpConst64, t2)
15817 v1.AuxInt = int64ToAuxInt(e - c)
15818 v0.AddArg2(x, v1)
15819 v2 := b.NewValue0(v.Pos, OpConst32, t)
15820 v2.AuxInt = int32ToAuxInt(d << e)
15821 v.AddArg2(v0, v2)
15822 return true
15823 }
15824 break
15825 }
15826
15827
15828
15829 for {
15830 if auxIntToBool(v.AuxInt) != false {
15831 break
15832 }
15833 x := v_0
15834 con := v_1
15835 if con.Op != OpConst64 {
15836 break
15837 }
15838 c := auxIntToInt64(con.AuxInt)
15839 if !(0 < c && c < 32) {
15840 break
15841 }
15842 v.reset(OpLsh32x64)
15843 v.AuxInt = boolToAuxInt(true)
15844 v.AddArg2(x, con)
15845 return true
15846 }
15847 return false
15848 }
15849 func rewriteValuegeneric_OpLsh32x8(v *Value) bool {
15850 v_1 := v.Args[1]
15851 v_0 := v.Args[0]
15852 b := v.Block
15853
15854
15855 for {
15856 x := v_0
15857 if v_1.Op != OpConst8 {
15858 break
15859 }
15860 c := auxIntToInt8(v_1.AuxInt)
15861 v.reset(OpLsh32x64)
15862 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
15863 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
15864 v.AddArg2(x, v0)
15865 return true
15866 }
15867
15868
15869 for {
15870 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
15871 break
15872 }
15873 v.reset(OpConst32)
15874 v.AuxInt = int32ToAuxInt(0)
15875 return true
15876 }
15877
15878
15879
15880 for {
15881 if auxIntToBool(v.AuxInt) != false {
15882 break
15883 }
15884 x := v_0
15885 con := v_1
15886 if con.Op != OpConst8 {
15887 break
15888 }
15889 c := auxIntToInt8(con.AuxInt)
15890 if !(0 < c && c < 32) {
15891 break
15892 }
15893 v.reset(OpLsh32x8)
15894 v.AuxInt = boolToAuxInt(true)
15895 v.AddArg2(x, con)
15896 return true
15897 }
15898 return false
15899 }
15900 func rewriteValuegeneric_OpLsh64x16(v *Value) bool {
15901 v_1 := v.Args[1]
15902 v_0 := v.Args[0]
15903 b := v.Block
15904
15905
15906 for {
15907 x := v_0
15908 if v_1.Op != OpConst16 {
15909 break
15910 }
15911 c := auxIntToInt16(v_1.AuxInt)
15912 v.reset(OpLsh64x64)
15913 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
15914 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
15915 v.AddArg2(x, v0)
15916 return true
15917 }
15918
15919
15920 for {
15921 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
15922 break
15923 }
15924 v.reset(OpConst64)
15925 v.AuxInt = int64ToAuxInt(0)
15926 return true
15927 }
15928
15929
15930
15931 for {
15932 if auxIntToBool(v.AuxInt) != false {
15933 break
15934 }
15935 x := v_0
15936 con := v_1
15937 if con.Op != OpConst16 {
15938 break
15939 }
15940 c := auxIntToInt16(con.AuxInt)
15941 if !(0 < c && c < 64) {
15942 break
15943 }
15944 v.reset(OpLsh64x16)
15945 v.AuxInt = boolToAuxInt(true)
15946 v.AddArg2(x, con)
15947 return true
15948 }
15949 return false
15950 }
15951 func rewriteValuegeneric_OpLsh64x32(v *Value) bool {
15952 v_1 := v.Args[1]
15953 v_0 := v.Args[0]
15954 b := v.Block
15955
15956
15957 for {
15958 x := v_0
15959 if v_1.Op != OpConst32 {
15960 break
15961 }
15962 c := auxIntToInt32(v_1.AuxInt)
15963 v.reset(OpLsh64x64)
15964 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
15965 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
15966 v.AddArg2(x, v0)
15967 return true
15968 }
15969
15970
15971 for {
15972 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
15973 break
15974 }
15975 v.reset(OpConst64)
15976 v.AuxInt = int64ToAuxInt(0)
15977 return true
15978 }
15979
15980
15981
15982 for {
15983 if auxIntToBool(v.AuxInt) != false {
15984 break
15985 }
15986 x := v_0
15987 con := v_1
15988 if con.Op != OpConst32 {
15989 break
15990 }
15991 c := auxIntToInt32(con.AuxInt)
15992 if !(0 < c && c < 64) {
15993 break
15994 }
15995 v.reset(OpLsh64x32)
15996 v.AuxInt = boolToAuxInt(true)
15997 v.AddArg2(x, con)
15998 return true
15999 }
16000 return false
16001 }
16002 func rewriteValuegeneric_OpLsh64x64(v *Value) bool {
16003 v_1 := v.Args[1]
16004 v_0 := v.Args[0]
16005 b := v.Block
16006 typ := &b.Func.Config.Types
16007
16008
16009 for {
16010 if v_0.Op != OpConst64 {
16011 break
16012 }
16013 c := auxIntToInt64(v_0.AuxInt)
16014 if v_1.Op != OpConst64 {
16015 break
16016 }
16017 d := auxIntToInt64(v_1.AuxInt)
16018 v.reset(OpConst64)
16019 v.AuxInt = int64ToAuxInt(c << uint64(d))
16020 return true
16021 }
16022
16023
16024 for {
16025 x := v_0
16026 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
16027 break
16028 }
16029 v.copyOf(x)
16030 return true
16031 }
16032
16033
16034 for {
16035 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
16036 break
16037 }
16038 v.reset(OpConst64)
16039 v.AuxInt = int64ToAuxInt(0)
16040 return true
16041 }
16042
16043
16044
16045 for {
16046 if v_1.Op != OpConst64 {
16047 break
16048 }
16049 c := auxIntToInt64(v_1.AuxInt)
16050 if !(uint64(c) >= 64) {
16051 break
16052 }
16053 v.reset(OpConst64)
16054 v.AuxInt = int64ToAuxInt(0)
16055 return true
16056 }
16057
16058
16059
16060 for {
16061 t := v.Type
16062 if v_0.Op != OpLsh64x64 {
16063 break
16064 }
16065 _ = v_0.Args[1]
16066 x := v_0.Args[0]
16067 v_0_1 := v_0.Args[1]
16068 if v_0_1.Op != OpConst64 {
16069 break
16070 }
16071 c := auxIntToInt64(v_0_1.AuxInt)
16072 if v_1.Op != OpConst64 {
16073 break
16074 }
16075 d := auxIntToInt64(v_1.AuxInt)
16076 if !(!uaddOvf(c, d)) {
16077 break
16078 }
16079 v.reset(OpLsh64x64)
16080 v0 := b.NewValue0(v.Pos, OpConst64, t)
16081 v0.AuxInt = int64ToAuxInt(c + d)
16082 v.AddArg2(x, v0)
16083 return true
16084 }
16085
16086
16087
16088 for {
16089 i := v_0
16090 if i.Op != OpRsh64x64 {
16091 break
16092 }
16093 _ = i.Args[1]
16094 x := i.Args[0]
16095 i_1 := i.Args[1]
16096 if i_1.Op != OpConst64 {
16097 break
16098 }
16099 c := auxIntToInt64(i_1.AuxInt)
16100 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
16101 break
16102 }
16103 v.reset(OpAnd64)
16104 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
16105 v0.AuxInt = int64ToAuxInt(int64(-1) << c)
16106 v.AddArg2(x, v0)
16107 return true
16108 }
16109
16110
16111
16112 for {
16113 i := v_0
16114 if i.Op != OpRsh64Ux64 {
16115 break
16116 }
16117 _ = i.Args[1]
16118 x := i.Args[0]
16119 i_1 := i.Args[1]
16120 if i_1.Op != OpConst64 {
16121 break
16122 }
16123 c := auxIntToInt64(i_1.AuxInt)
16124 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
16125 break
16126 }
16127 v.reset(OpAnd64)
16128 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
16129 v0.AuxInt = int64ToAuxInt(int64(-1) << c)
16130 v.AddArg2(x, v0)
16131 return true
16132 }
16133
16134
16135
16136 for {
16137 if v_0.Op != OpRsh64Ux64 {
16138 break
16139 }
16140 _ = v_0.Args[1]
16141 v_0_0 := v_0.Args[0]
16142 if v_0_0.Op != OpLsh64x64 {
16143 break
16144 }
16145 _ = v_0_0.Args[1]
16146 x := v_0_0.Args[0]
16147 v_0_0_1 := v_0_0.Args[1]
16148 if v_0_0_1.Op != OpConst64 {
16149 break
16150 }
16151 c1 := auxIntToInt64(v_0_0_1.AuxInt)
16152 v_0_1 := v_0.Args[1]
16153 if v_0_1.Op != OpConst64 {
16154 break
16155 }
16156 c2 := auxIntToInt64(v_0_1.AuxInt)
16157 if v_1.Op != OpConst64 {
16158 break
16159 }
16160 c3 := auxIntToInt64(v_1.AuxInt)
16161 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
16162 break
16163 }
16164 v.reset(OpLsh64x64)
16165 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
16166 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
16167 v.AddArg2(x, v0)
16168 return true
16169 }
16170
16171
16172
16173 for {
16174 if v_0.Op != OpAnd64 {
16175 break
16176 }
16177 _ = v_0.Args[1]
16178 v_0_0 := v_0.Args[0]
16179 v_0_1 := v_0.Args[1]
16180 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
16181 if v_0_0.Op != OpRsh64x64 {
16182 continue
16183 }
16184 t := v_0_0.Type
16185 _ = v_0_0.Args[1]
16186 x := v_0_0.Args[0]
16187 v_0_0_1 := v_0_0.Args[1]
16188 if v_0_0_1.Op != OpConst64 {
16189 continue
16190 }
16191 t2 := v_0_0_1.Type
16192 c := auxIntToInt64(v_0_0_1.AuxInt)
16193 if v_0_1.Op != OpConst64 {
16194 continue
16195 }
16196 d := auxIntToInt64(v_0_1.AuxInt)
16197 if v_1.Op != OpConst64 {
16198 continue
16199 }
16200 e := auxIntToInt64(v_1.AuxInt)
16201 if !(c >= e) {
16202 continue
16203 }
16204 v.reset(OpAnd64)
16205 v0 := b.NewValue0(v.Pos, OpRsh64x64, t)
16206 v1 := b.NewValue0(v.Pos, OpConst64, t2)
16207 v1.AuxInt = int64ToAuxInt(c - e)
16208 v0.AddArg2(x, v1)
16209 v2 := b.NewValue0(v.Pos, OpConst64, t)
16210 v2.AuxInt = int64ToAuxInt(d << e)
16211 v.AddArg2(v0, v2)
16212 return true
16213 }
16214 break
16215 }
16216
16217
16218
16219 for {
16220 if v_0.Op != OpAnd64 {
16221 break
16222 }
16223 _ = v_0.Args[1]
16224 v_0_0 := v_0.Args[0]
16225 v_0_1 := v_0.Args[1]
16226 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
16227 if v_0_0.Op != OpRsh64Ux64 {
16228 continue
16229 }
16230 t := v_0_0.Type
16231 _ = v_0_0.Args[1]
16232 x := v_0_0.Args[0]
16233 v_0_0_1 := v_0_0.Args[1]
16234 if v_0_0_1.Op != OpConst64 {
16235 continue
16236 }
16237 t2 := v_0_0_1.Type
16238 c := auxIntToInt64(v_0_0_1.AuxInt)
16239 if v_0_1.Op != OpConst64 {
16240 continue
16241 }
16242 d := auxIntToInt64(v_0_1.AuxInt)
16243 if v_1.Op != OpConst64 {
16244 continue
16245 }
16246 e := auxIntToInt64(v_1.AuxInt)
16247 if !(c >= e) {
16248 continue
16249 }
16250 v.reset(OpAnd64)
16251 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t)
16252 v1 := b.NewValue0(v.Pos, OpConst64, t2)
16253 v1.AuxInt = int64ToAuxInt(c - e)
16254 v0.AddArg2(x, v1)
16255 v2 := b.NewValue0(v.Pos, OpConst64, t)
16256 v2.AuxInt = int64ToAuxInt(d << e)
16257 v.AddArg2(v0, v2)
16258 return true
16259 }
16260 break
16261 }
16262
16263
16264
16265 for {
16266 if v_0.Op != OpAnd64 {
16267 break
16268 }
16269 _ = v_0.Args[1]
16270 v_0_0 := v_0.Args[0]
16271 v_0_1 := v_0.Args[1]
16272 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
16273 if v_0_0.Op != OpRsh64x64 {
16274 continue
16275 }
16276 t := v_0_0.Type
16277 _ = v_0_0.Args[1]
16278 x := v_0_0.Args[0]
16279 v_0_0_1 := v_0_0.Args[1]
16280 if v_0_0_1.Op != OpConst64 {
16281 continue
16282 }
16283 t2 := v_0_0_1.Type
16284 c := auxIntToInt64(v_0_0_1.AuxInt)
16285 if v_0_1.Op != OpConst64 {
16286 continue
16287 }
16288 d := auxIntToInt64(v_0_1.AuxInt)
16289 if v_1.Op != OpConst64 {
16290 continue
16291 }
16292 e := auxIntToInt64(v_1.AuxInt)
16293 if !(c < e) {
16294 continue
16295 }
16296 v.reset(OpAnd64)
16297 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
16298 v1 := b.NewValue0(v.Pos, OpConst64, t2)
16299 v1.AuxInt = int64ToAuxInt(e - c)
16300 v0.AddArg2(x, v1)
16301 v2 := b.NewValue0(v.Pos, OpConst64, t)
16302 v2.AuxInt = int64ToAuxInt(d << e)
16303 v.AddArg2(v0, v2)
16304 return true
16305 }
16306 break
16307 }
16308
16309
16310
16311 for {
16312 if v_0.Op != OpAnd64 {
16313 break
16314 }
16315 _ = v_0.Args[1]
16316 v_0_0 := v_0.Args[0]
16317 v_0_1 := v_0.Args[1]
16318 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
16319 if v_0_0.Op != OpRsh64Ux64 {
16320 continue
16321 }
16322 t := v_0_0.Type
16323 _ = v_0_0.Args[1]
16324 x := v_0_0.Args[0]
16325 v_0_0_1 := v_0_0.Args[1]
16326 if v_0_0_1.Op != OpConst64 {
16327 continue
16328 }
16329 t2 := v_0_0_1.Type
16330 c := auxIntToInt64(v_0_0_1.AuxInt)
16331 if v_0_1.Op != OpConst64 {
16332 continue
16333 }
16334 d := auxIntToInt64(v_0_1.AuxInt)
16335 if v_1.Op != OpConst64 {
16336 continue
16337 }
16338 e := auxIntToInt64(v_1.AuxInt)
16339 if !(c < e) {
16340 continue
16341 }
16342 v.reset(OpAnd64)
16343 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
16344 v1 := b.NewValue0(v.Pos, OpConst64, t2)
16345 v1.AuxInt = int64ToAuxInt(e - c)
16346 v0.AddArg2(x, v1)
16347 v2 := b.NewValue0(v.Pos, OpConst64, t)
16348 v2.AuxInt = int64ToAuxInt(d << e)
16349 v.AddArg2(v0, v2)
16350 return true
16351 }
16352 break
16353 }
16354
16355
16356
16357 for {
16358 if auxIntToBool(v.AuxInt) != false {
16359 break
16360 }
16361 x := v_0
16362 con := v_1
16363 if con.Op != OpConst64 {
16364 break
16365 }
16366 c := auxIntToInt64(con.AuxInt)
16367 if !(0 < c && c < 64) {
16368 break
16369 }
16370 v.reset(OpLsh64x64)
16371 v.AuxInt = boolToAuxInt(true)
16372 v.AddArg2(x, con)
16373 return true
16374 }
16375 return false
16376 }
16377 func rewriteValuegeneric_OpLsh64x8(v *Value) bool {
16378 v_1 := v.Args[1]
16379 v_0 := v.Args[0]
16380 b := v.Block
16381
16382
16383 for {
16384 x := v_0
16385 if v_1.Op != OpConst8 {
16386 break
16387 }
16388 c := auxIntToInt8(v_1.AuxInt)
16389 v.reset(OpLsh64x64)
16390 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
16391 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
16392 v.AddArg2(x, v0)
16393 return true
16394 }
16395
16396
16397 for {
16398 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
16399 break
16400 }
16401 v.reset(OpConst64)
16402 v.AuxInt = int64ToAuxInt(0)
16403 return true
16404 }
16405
16406
16407
16408 for {
16409 if auxIntToBool(v.AuxInt) != false {
16410 break
16411 }
16412 x := v_0
16413 con := v_1
16414 if con.Op != OpConst8 {
16415 break
16416 }
16417 c := auxIntToInt8(con.AuxInt)
16418 if !(0 < c && c < 64) {
16419 break
16420 }
16421 v.reset(OpLsh64x8)
16422 v.AuxInt = boolToAuxInt(true)
16423 v.AddArg2(x, con)
16424 return true
16425 }
16426 return false
16427 }
16428 func rewriteValuegeneric_OpLsh8x16(v *Value) bool {
16429 v_1 := v.Args[1]
16430 v_0 := v.Args[0]
16431 b := v.Block
16432
16433
16434 for {
16435 x := v_0
16436 if v_1.Op != OpConst16 {
16437 break
16438 }
16439 c := auxIntToInt16(v_1.AuxInt)
16440 v.reset(OpLsh8x64)
16441 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
16442 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
16443 v.AddArg2(x, v0)
16444 return true
16445 }
16446
16447
16448 for {
16449 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
16450 break
16451 }
16452 v.reset(OpConst8)
16453 v.AuxInt = int8ToAuxInt(0)
16454 return true
16455 }
16456
16457
16458
16459 for {
16460 if auxIntToBool(v.AuxInt) != false {
16461 break
16462 }
16463 x := v_0
16464 con := v_1
16465 if con.Op != OpConst16 {
16466 break
16467 }
16468 c := auxIntToInt16(con.AuxInt)
16469 if !(0 < c && c < 8) {
16470 break
16471 }
16472 v.reset(OpLsh8x16)
16473 v.AuxInt = boolToAuxInt(true)
16474 v.AddArg2(x, con)
16475 return true
16476 }
16477 return false
16478 }
16479 func rewriteValuegeneric_OpLsh8x32(v *Value) bool {
16480 v_1 := v.Args[1]
16481 v_0 := v.Args[0]
16482 b := v.Block
16483
16484
16485 for {
16486 x := v_0
16487 if v_1.Op != OpConst32 {
16488 break
16489 }
16490 c := auxIntToInt32(v_1.AuxInt)
16491 v.reset(OpLsh8x64)
16492 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
16493 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
16494 v.AddArg2(x, v0)
16495 return true
16496 }
16497
16498
16499 for {
16500 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
16501 break
16502 }
16503 v.reset(OpConst8)
16504 v.AuxInt = int8ToAuxInt(0)
16505 return true
16506 }
16507
16508
16509
16510 for {
16511 if auxIntToBool(v.AuxInt) != false {
16512 break
16513 }
16514 x := v_0
16515 con := v_1
16516 if con.Op != OpConst32 {
16517 break
16518 }
16519 c := auxIntToInt32(con.AuxInt)
16520 if !(0 < c && c < 8) {
16521 break
16522 }
16523 v.reset(OpLsh8x32)
16524 v.AuxInt = boolToAuxInt(true)
16525 v.AddArg2(x, con)
16526 return true
16527 }
16528 return false
16529 }
16530 func rewriteValuegeneric_OpLsh8x64(v *Value) bool {
16531 v_1 := v.Args[1]
16532 v_0 := v.Args[0]
16533 b := v.Block
16534 typ := &b.Func.Config.Types
16535
16536
16537 for {
16538 if v_0.Op != OpConst8 {
16539 break
16540 }
16541 c := auxIntToInt8(v_0.AuxInt)
16542 if v_1.Op != OpConst64 {
16543 break
16544 }
16545 d := auxIntToInt64(v_1.AuxInt)
16546 v.reset(OpConst8)
16547 v.AuxInt = int8ToAuxInt(c << uint64(d))
16548 return true
16549 }
16550
16551
16552 for {
16553 x := v_0
16554 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
16555 break
16556 }
16557 v.copyOf(x)
16558 return true
16559 }
16560
16561
16562 for {
16563 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
16564 break
16565 }
16566 v.reset(OpConst8)
16567 v.AuxInt = int8ToAuxInt(0)
16568 return true
16569 }
16570
16571
16572
16573 for {
16574 if v_1.Op != OpConst64 {
16575 break
16576 }
16577 c := auxIntToInt64(v_1.AuxInt)
16578 if !(uint64(c) >= 8) {
16579 break
16580 }
16581 v.reset(OpConst8)
16582 v.AuxInt = int8ToAuxInt(0)
16583 return true
16584 }
16585
16586
16587
16588 for {
16589 t := v.Type
16590 if v_0.Op != OpLsh8x64 {
16591 break
16592 }
16593 _ = v_0.Args[1]
16594 x := v_0.Args[0]
16595 v_0_1 := v_0.Args[1]
16596 if v_0_1.Op != OpConst64 {
16597 break
16598 }
16599 c := auxIntToInt64(v_0_1.AuxInt)
16600 if v_1.Op != OpConst64 {
16601 break
16602 }
16603 d := auxIntToInt64(v_1.AuxInt)
16604 if !(!uaddOvf(c, d)) {
16605 break
16606 }
16607 v.reset(OpLsh8x64)
16608 v0 := b.NewValue0(v.Pos, OpConst64, t)
16609 v0.AuxInt = int64ToAuxInt(c + d)
16610 v.AddArg2(x, v0)
16611 return true
16612 }
16613
16614
16615
16616 for {
16617 i := v_0
16618 if i.Op != OpRsh8x64 {
16619 break
16620 }
16621 _ = i.Args[1]
16622 x := i.Args[0]
16623 i_1 := i.Args[1]
16624 if i_1.Op != OpConst64 {
16625 break
16626 }
16627 c := auxIntToInt64(i_1.AuxInt)
16628 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
16629 break
16630 }
16631 v.reset(OpAnd8)
16632 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
16633 v0.AuxInt = int8ToAuxInt(int8(-1) << c)
16634 v.AddArg2(x, v0)
16635 return true
16636 }
16637
16638
16639
16640 for {
16641 i := v_0
16642 if i.Op != OpRsh8Ux64 {
16643 break
16644 }
16645 _ = i.Args[1]
16646 x := i.Args[0]
16647 i_1 := i.Args[1]
16648 if i_1.Op != OpConst64 {
16649 break
16650 }
16651 c := auxIntToInt64(i_1.AuxInt)
16652 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
16653 break
16654 }
16655 v.reset(OpAnd8)
16656 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
16657 v0.AuxInt = int8ToAuxInt(int8(-1) << c)
16658 v.AddArg2(x, v0)
16659 return true
16660 }
16661
16662
16663
16664 for {
16665 if v_0.Op != OpRsh8Ux64 {
16666 break
16667 }
16668 _ = v_0.Args[1]
16669 v_0_0 := v_0.Args[0]
16670 if v_0_0.Op != OpLsh8x64 {
16671 break
16672 }
16673 _ = v_0_0.Args[1]
16674 x := v_0_0.Args[0]
16675 v_0_0_1 := v_0_0.Args[1]
16676 if v_0_0_1.Op != OpConst64 {
16677 break
16678 }
16679 c1 := auxIntToInt64(v_0_0_1.AuxInt)
16680 v_0_1 := v_0.Args[1]
16681 if v_0_1.Op != OpConst64 {
16682 break
16683 }
16684 c2 := auxIntToInt64(v_0_1.AuxInt)
16685 if v_1.Op != OpConst64 {
16686 break
16687 }
16688 c3 := auxIntToInt64(v_1.AuxInt)
16689 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
16690 break
16691 }
16692 v.reset(OpLsh8x64)
16693 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
16694 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
16695 v.AddArg2(x, v0)
16696 return true
16697 }
16698
16699
16700
16701 for {
16702 if v_0.Op != OpAnd8 {
16703 break
16704 }
16705 _ = v_0.Args[1]
16706 v_0_0 := v_0.Args[0]
16707 v_0_1 := v_0.Args[1]
16708 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
16709 if v_0_0.Op != OpRsh8x64 {
16710 continue
16711 }
16712 t := v_0_0.Type
16713 _ = v_0_0.Args[1]
16714 x := v_0_0.Args[0]
16715 v_0_0_1 := v_0_0.Args[1]
16716 if v_0_0_1.Op != OpConst64 {
16717 continue
16718 }
16719 t2 := v_0_0_1.Type
16720 c := auxIntToInt64(v_0_0_1.AuxInt)
16721 if v_0_1.Op != OpConst8 {
16722 continue
16723 }
16724 d := auxIntToInt8(v_0_1.AuxInt)
16725 if v_1.Op != OpConst64 {
16726 continue
16727 }
16728 e := auxIntToInt64(v_1.AuxInt)
16729 if !(c >= e) {
16730 continue
16731 }
16732 v.reset(OpAnd8)
16733 v0 := b.NewValue0(v.Pos, OpRsh8x64, t)
16734 v1 := b.NewValue0(v.Pos, OpConst64, t2)
16735 v1.AuxInt = int64ToAuxInt(c - e)
16736 v0.AddArg2(x, v1)
16737 v2 := b.NewValue0(v.Pos, OpConst8, t)
16738 v2.AuxInt = int8ToAuxInt(d << e)
16739 v.AddArg2(v0, v2)
16740 return true
16741 }
16742 break
16743 }
16744
16745
16746
16747 for {
16748 if v_0.Op != OpAnd8 {
16749 break
16750 }
16751 _ = v_0.Args[1]
16752 v_0_0 := v_0.Args[0]
16753 v_0_1 := v_0.Args[1]
16754 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
16755 if v_0_0.Op != OpRsh8Ux64 {
16756 continue
16757 }
16758 t := v_0_0.Type
16759 _ = v_0_0.Args[1]
16760 x := v_0_0.Args[0]
16761 v_0_0_1 := v_0_0.Args[1]
16762 if v_0_0_1.Op != OpConst64 {
16763 continue
16764 }
16765 t2 := v_0_0_1.Type
16766 c := auxIntToInt64(v_0_0_1.AuxInt)
16767 if v_0_1.Op != OpConst8 {
16768 continue
16769 }
16770 d := auxIntToInt8(v_0_1.AuxInt)
16771 if v_1.Op != OpConst64 {
16772 continue
16773 }
16774 e := auxIntToInt64(v_1.AuxInt)
16775 if !(c >= e) {
16776 continue
16777 }
16778 v.reset(OpAnd8)
16779 v0 := b.NewValue0(v.Pos, OpRsh8Ux64, t)
16780 v1 := b.NewValue0(v.Pos, OpConst64, t2)
16781 v1.AuxInt = int64ToAuxInt(c - e)
16782 v0.AddArg2(x, v1)
16783 v2 := b.NewValue0(v.Pos, OpConst8, t)
16784 v2.AuxInt = int8ToAuxInt(d << e)
16785 v.AddArg2(v0, v2)
16786 return true
16787 }
16788 break
16789 }
16790
16791
16792
16793 for {
16794 if v_0.Op != OpAnd8 {
16795 break
16796 }
16797 _ = v_0.Args[1]
16798 v_0_0 := v_0.Args[0]
16799 v_0_1 := v_0.Args[1]
16800 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
16801 if v_0_0.Op != OpRsh8x64 {
16802 continue
16803 }
16804 t := v_0_0.Type
16805 _ = v_0_0.Args[1]
16806 x := v_0_0.Args[0]
16807 v_0_0_1 := v_0_0.Args[1]
16808 if v_0_0_1.Op != OpConst64 {
16809 continue
16810 }
16811 t2 := v_0_0_1.Type
16812 c := auxIntToInt64(v_0_0_1.AuxInt)
16813 if v_0_1.Op != OpConst8 {
16814 continue
16815 }
16816 d := auxIntToInt8(v_0_1.AuxInt)
16817 if v_1.Op != OpConst64 {
16818 continue
16819 }
16820 e := auxIntToInt64(v_1.AuxInt)
16821 if !(c < e) {
16822 continue
16823 }
16824 v.reset(OpAnd8)
16825 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
16826 v1 := b.NewValue0(v.Pos, OpConst64, t2)
16827 v1.AuxInt = int64ToAuxInt(e - c)
16828 v0.AddArg2(x, v1)
16829 v2 := b.NewValue0(v.Pos, OpConst8, t)
16830 v2.AuxInt = int8ToAuxInt(d << e)
16831 v.AddArg2(v0, v2)
16832 return true
16833 }
16834 break
16835 }
16836
16837
16838
16839 for {
16840 if v_0.Op != OpAnd8 {
16841 break
16842 }
16843 _ = v_0.Args[1]
16844 v_0_0 := v_0.Args[0]
16845 v_0_1 := v_0.Args[1]
16846 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
16847 if v_0_0.Op != OpRsh8Ux64 {
16848 continue
16849 }
16850 t := v_0_0.Type
16851 _ = v_0_0.Args[1]
16852 x := v_0_0.Args[0]
16853 v_0_0_1 := v_0_0.Args[1]
16854 if v_0_0_1.Op != OpConst64 {
16855 continue
16856 }
16857 t2 := v_0_0_1.Type
16858 c := auxIntToInt64(v_0_0_1.AuxInt)
16859 if v_0_1.Op != OpConst8 {
16860 continue
16861 }
16862 d := auxIntToInt8(v_0_1.AuxInt)
16863 if v_1.Op != OpConst64 {
16864 continue
16865 }
16866 e := auxIntToInt64(v_1.AuxInt)
16867 if !(c < e) {
16868 continue
16869 }
16870 v.reset(OpAnd8)
16871 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
16872 v1 := b.NewValue0(v.Pos, OpConst64, t2)
16873 v1.AuxInt = int64ToAuxInt(e - c)
16874 v0.AddArg2(x, v1)
16875 v2 := b.NewValue0(v.Pos, OpConst8, t)
16876 v2.AuxInt = int8ToAuxInt(d << e)
16877 v.AddArg2(v0, v2)
16878 return true
16879 }
16880 break
16881 }
16882
16883
16884
16885 for {
16886 if auxIntToBool(v.AuxInt) != false {
16887 break
16888 }
16889 x := v_0
16890 con := v_1
16891 if con.Op != OpConst64 {
16892 break
16893 }
16894 c := auxIntToInt64(con.AuxInt)
16895 if !(0 < c && c < 8) {
16896 break
16897 }
16898 v.reset(OpLsh8x64)
16899 v.AuxInt = boolToAuxInt(true)
16900 v.AddArg2(x, con)
16901 return true
16902 }
16903 return false
16904 }
16905 func rewriteValuegeneric_OpLsh8x8(v *Value) bool {
16906 v_1 := v.Args[1]
16907 v_0 := v.Args[0]
16908 b := v.Block
16909
16910
16911 for {
16912 x := v_0
16913 if v_1.Op != OpConst8 {
16914 break
16915 }
16916 c := auxIntToInt8(v_1.AuxInt)
16917 v.reset(OpLsh8x64)
16918 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
16919 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
16920 v.AddArg2(x, v0)
16921 return true
16922 }
16923
16924
16925 for {
16926 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
16927 break
16928 }
16929 v.reset(OpConst8)
16930 v.AuxInt = int8ToAuxInt(0)
16931 return true
16932 }
16933
16934
16935
16936 for {
16937 if auxIntToBool(v.AuxInt) != false {
16938 break
16939 }
16940 x := v_0
16941 con := v_1
16942 if con.Op != OpConst8 {
16943 break
16944 }
16945 c := auxIntToInt8(con.AuxInt)
16946 if !(0 < c && c < 8) {
16947 break
16948 }
16949 v.reset(OpLsh8x8)
16950 v.AuxInt = boolToAuxInt(true)
16951 v.AddArg2(x, con)
16952 return true
16953 }
16954 return false
16955 }
16956 func rewriteValuegeneric_OpMemEq(v *Value) bool {
16957 v_3 := v.Args[3]
16958 v_2 := v.Args[2]
16959 v_1 := v.Args[1]
16960 v_0 := v.Args[0]
16961 b := v.Block
16962 config := b.Func.Config
16963 typ := &b.Func.Config.Types
16964
16965
16966 for {
16967 sptr := v_0
16968 tptr := v_1
16969 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 {
16970 break
16971 }
16972 mem := v_3
16973 v.reset(OpEq8)
16974 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
16975 v0.AddArg2(sptr, mem)
16976 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
16977 v1.AddArg2(tptr, mem)
16978 v.AddArg2(v0, v1)
16979 return true
16980 }
16981
16982
16983
16984 for {
16985 sptr := v_0
16986 tptr := v_1
16987 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 {
16988 break
16989 }
16990 mem := v_3
16991 if !(canLoadUnaligned(config)) {
16992 break
16993 }
16994 v.reset(OpEq16)
16995 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
16996 v0.AddArg2(sptr, mem)
16997 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
16998 v1.AddArg2(tptr, mem)
16999 v.AddArg2(v0, v1)
17000 return true
17001 }
17002
17003
17004
17005 for {
17006 sptr := v_0
17007 tptr := v_1
17008 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 {
17009 break
17010 }
17011 mem := v_3
17012 if !(canLoadUnaligned(config)) {
17013 break
17014 }
17015 v.reset(OpEq32)
17016 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
17017 v0.AddArg2(sptr, mem)
17018 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
17019 v1.AddArg2(tptr, mem)
17020 v.AddArg2(v0, v1)
17021 return true
17022 }
17023
17024
17025
17026 for {
17027 sptr := v_0
17028 tptr := v_1
17029 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 {
17030 break
17031 }
17032 mem := v_3
17033 if !(canLoadUnaligned(config) && config.PtrSize == 8) {
17034 break
17035 }
17036 v.reset(OpEq64)
17037 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
17038 v0.AddArg2(sptr, mem)
17039 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
17040 v1.AddArg2(tptr, mem)
17041 v.AddArg2(v0, v1)
17042 return true
17043 }
17044
17045
17046 for {
17047 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 {
17048 break
17049 }
17050 v.reset(OpConstBool)
17051 v.Type = typ.Bool
17052 v.AuxInt = boolToAuxInt(true)
17053 return true
17054 }
17055
17056
17057
17058 for {
17059 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17060 p := v_0
17061 q := v_1
17062 if !(isSamePtr(p, q)) {
17063 continue
17064 }
17065 v.reset(OpConstBool)
17066 v.Type = typ.Bool
17067 v.AuxInt = boolToAuxInt(true)
17068 return true
17069 }
17070 break
17071 }
17072
17073
17074
17075 for {
17076 p := v_0
17077 q := v_1
17078 if v_2.Op != OpConst64 {
17079 break
17080 }
17081 c := auxIntToInt64(v_2.AuxInt)
17082 mem := v_3
17083 if !((c == 3 || c == 5 || c == 9 || c == 17) && canLoadUnaligned(config) && config.RegSize == 8) {
17084 break
17085 }
17086 v.reset(OpAndB)
17087 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
17088 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
17089 v1.AuxInt = int64ToAuxInt(c - 1)
17090 v0.AddArg4(p, q, v1, mem)
17091 v2 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
17092 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
17093 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
17094 v4.AuxInt = int64ToAuxInt(c - 1)
17095 v4.AddArg(p)
17096 v3.AddArg2(v4, mem)
17097 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
17098 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
17099 v6.AuxInt = int64ToAuxInt(c - 1)
17100 v6.AddArg(q)
17101 v5.AddArg2(v6, mem)
17102 v2.AddArg2(v3, v5)
17103 v.AddArg2(v0, v2)
17104 return true
17105 }
17106
17107
17108
17109 for {
17110 p := v_0
17111 q := v_1
17112 if v_2.Op != OpConst64 {
17113 break
17114 }
17115 c := auxIntToInt64(v_2.AuxInt)
17116 mem := v_3
17117 if !((c == 6 || c == 10 || c == 18) && canLoadUnaligned(config) && config.RegSize == 8) {
17118 break
17119 }
17120 v.reset(OpAndB)
17121 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
17122 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
17123 v1.AuxInt = int64ToAuxInt(c - 2)
17124 v0.AddArg4(p, q, v1, mem)
17125 v2 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
17126 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
17127 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
17128 v4.AuxInt = int64ToAuxInt(c - 2)
17129 v4.AddArg(p)
17130 v3.AddArg2(v4, mem)
17131 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
17132 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
17133 v6.AuxInt = int64ToAuxInt(c - 2)
17134 v6.AddArg(q)
17135 v5.AddArg2(v6, mem)
17136 v2.AddArg2(v3, v5)
17137 v.AddArg2(v0, v2)
17138 return true
17139 }
17140
17141
17142
17143 for {
17144 p := v_0
17145 q := v_1
17146 if v_2.Op != OpConst64 {
17147 break
17148 }
17149 c := auxIntToInt64(v_2.AuxInt)
17150 mem := v_3
17151 if !((c == 7 || c == 11 || c == 19 || c == 20) && canLoadUnaligned(config) && config.RegSize == 8) {
17152 break
17153 }
17154 v.reset(OpAndB)
17155 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
17156 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
17157 v1.AuxInt = int64ToAuxInt(min(c-3, 16))
17158 v0.AddArg4(p, q, v1, mem)
17159 v2 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
17160 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
17161 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
17162 v4.AuxInt = int64ToAuxInt(c - 4)
17163 v4.AddArg(p)
17164 v3.AddArg2(v4, mem)
17165 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
17166 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
17167 v6.AuxInt = int64ToAuxInt(c - 4)
17168 v6.AddArg(q)
17169 v5.AddArg2(v6, mem)
17170 v2.AddArg2(v3, v5)
17171 v.AddArg2(v0, v2)
17172 return true
17173 }
17174
17175
17176
17177 for {
17178 p := v_0
17179 q := v_1
17180 if v_2.Op != OpConst64 {
17181 break
17182 }
17183 c := auxIntToInt64(v_2.AuxInt)
17184 mem := v_3
17185 if !(((c >= 12 && c <= 16) || (c >= 21 && c <= 24)) && canLoadUnaligned(config) && config.RegSize == 8) {
17186 break
17187 }
17188 v.reset(OpAndB)
17189 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
17190 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
17191 v1.AuxInt = int64ToAuxInt(8 + int64(bool2int(c > 16))*8)
17192 v0.AddArg4(p, q, v1, mem)
17193 v2 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
17194 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
17195 v4 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
17196 v4.AuxInt = int64ToAuxInt(c - 8)
17197 v4.AddArg(p)
17198 v3.AddArg2(v4, mem)
17199 v5 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
17200 v6 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
17201 v6.AuxInt = int64ToAuxInt(c - 8)
17202 v6.AddArg(q)
17203 v5.AddArg2(v6, mem)
17204 v2.AddArg2(v3, v5)
17205 v.AddArg2(v0, v2)
17206 return true
17207 }
17208
17209
17210
17211 for {
17212 p := v_0
17213 q := v_1
17214 if v_2.Op != OpConst64 {
17215 break
17216 }
17217 c := auxIntToInt64(v_2.AuxInt)
17218 mem := v_3
17219 if !(c >= 25 && c <= 32 && canLoadUnaligned(config) && config.RegSize == 8) {
17220 break
17221 }
17222 v.reset(OpAndB)
17223 v0 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
17224 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
17225 v1.AuxInt = int64ToAuxInt(16)
17226 v0.AddArg4(p, q, v1, mem)
17227 v2 := b.NewValue0(v.Pos, OpMemEq, typ.Bool)
17228 v3 := b.NewValue0(v.Pos, OpOffPtr, p.Type)
17229 v3.AuxInt = int64ToAuxInt(16)
17230 v3.AddArg(p)
17231 v4 := b.NewValue0(v.Pos, OpOffPtr, q.Type)
17232 v4.AuxInt = int64ToAuxInt(16)
17233 v4.AddArg(q)
17234 v5 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
17235 v5.AuxInt = int64ToAuxInt(c - 16)
17236 v2.AddArg4(v3, v4, v5, mem)
17237 v.AddArg2(v0, v2)
17238 return true
17239 }
17240 return false
17241 }
17242 func rewriteValuegeneric_OpMod16(v *Value) bool {
17243 v_1 := v.Args[1]
17244 v_0 := v.Args[0]
17245 b := v.Block
17246
17247
17248
17249 for {
17250 if v_0.Op != OpConst16 {
17251 break
17252 }
17253 c := auxIntToInt16(v_0.AuxInt)
17254 if v_1.Op != OpConst16 {
17255 break
17256 }
17257 d := auxIntToInt16(v_1.AuxInt)
17258 if !(d != 0) {
17259 break
17260 }
17261 v.reset(OpConst16)
17262 v.AuxInt = int16ToAuxInt(c % d)
17263 return true
17264 }
17265
17266
17267
17268 for {
17269 t := v.Type
17270 n := v_0
17271 if v_1.Op != OpConst16 {
17272 break
17273 }
17274 c := auxIntToInt16(v_1.AuxInt)
17275 if !(isNonNegative(n) && isPowerOfTwo(c)) {
17276 break
17277 }
17278 v.reset(OpAnd16)
17279 v0 := b.NewValue0(v.Pos, OpConst16, t)
17280 v0.AuxInt = int16ToAuxInt(c - 1)
17281 v.AddArg2(n, v0)
17282 return true
17283 }
17284
17285
17286
17287 for {
17288 t := v.Type
17289 n := v_0
17290 if v_1.Op != OpConst16 {
17291 break
17292 }
17293 c := auxIntToInt16(v_1.AuxInt)
17294 if !(c < 0 && c != -1<<15) {
17295 break
17296 }
17297 v.reset(OpMod16)
17298 v.Type = t
17299 v0 := b.NewValue0(v.Pos, OpConst16, t)
17300 v0.AuxInt = int16ToAuxInt(-c)
17301 v.AddArg2(n, v0)
17302 return true
17303 }
17304
17305
17306
17307 for {
17308 t := v.Type
17309 x := v_0
17310 if v_1.Op != OpConst16 {
17311 break
17312 }
17313 c := auxIntToInt16(v_1.AuxInt)
17314 if !(x.Op != OpConst16 && (c > 0 || c == -1<<15)) {
17315 break
17316 }
17317 v.reset(OpSub16)
17318 v0 := b.NewValue0(v.Pos, OpMul16, t)
17319 v1 := b.NewValue0(v.Pos, OpDiv16, t)
17320 v2 := b.NewValue0(v.Pos, OpConst16, t)
17321 v2.AuxInt = int16ToAuxInt(c)
17322 v1.AddArg2(x, v2)
17323 v0.AddArg2(v1, v2)
17324 v.AddArg2(x, v0)
17325 return true
17326 }
17327 return false
17328 }
17329 func rewriteValuegeneric_OpMod16u(v *Value) bool {
17330 v_1 := v.Args[1]
17331 v_0 := v.Args[0]
17332 b := v.Block
17333
17334
17335
17336 for {
17337 if v_0.Op != OpConst16 {
17338 break
17339 }
17340 c := auxIntToInt16(v_0.AuxInt)
17341 if v_1.Op != OpConst16 {
17342 break
17343 }
17344 d := auxIntToInt16(v_1.AuxInt)
17345 if !(d != 0) {
17346 break
17347 }
17348 v.reset(OpConst16)
17349 v.AuxInt = int16ToAuxInt(int16(uint16(c) % uint16(d)))
17350 return true
17351 }
17352
17353
17354
17355 for {
17356 t := v.Type
17357 n := v_0
17358 if v_1.Op != OpConst16 {
17359 break
17360 }
17361 c := auxIntToInt16(v_1.AuxInt)
17362 if !(isPowerOfTwo(uint16(c))) {
17363 break
17364 }
17365 v.reset(OpAnd16)
17366 v0 := b.NewValue0(v.Pos, OpConst16, t)
17367 v0.AuxInt = int16ToAuxInt(c - 1)
17368 v.AddArg2(n, v0)
17369 return true
17370 }
17371
17372
17373
17374 for {
17375 t := v.Type
17376 x := v_0
17377 if v_1.Op != OpConst16 {
17378 break
17379 }
17380 c := auxIntToInt16(v_1.AuxInt)
17381 if !(x.Op != OpConst16 && c != 0) {
17382 break
17383 }
17384 v.reset(OpSub16)
17385 v0 := b.NewValue0(v.Pos, OpMul16, t)
17386 v1 := b.NewValue0(v.Pos, OpDiv16u, t)
17387 v2 := b.NewValue0(v.Pos, OpConst16, t)
17388 v2.AuxInt = int16ToAuxInt(c)
17389 v1.AddArg2(x, v2)
17390 v0.AddArg2(v1, v2)
17391 v.AddArg2(x, v0)
17392 return true
17393 }
17394 return false
17395 }
17396 func rewriteValuegeneric_OpMod32(v *Value) bool {
17397 v_1 := v.Args[1]
17398 v_0 := v.Args[0]
17399 b := v.Block
17400
17401
17402
17403 for {
17404 if v_0.Op != OpConst32 {
17405 break
17406 }
17407 c := auxIntToInt32(v_0.AuxInt)
17408 if v_1.Op != OpConst32 {
17409 break
17410 }
17411 d := auxIntToInt32(v_1.AuxInt)
17412 if !(d != 0) {
17413 break
17414 }
17415 v.reset(OpConst32)
17416 v.AuxInt = int32ToAuxInt(c % d)
17417 return true
17418 }
17419
17420
17421
17422 for {
17423 t := v.Type
17424 n := v_0
17425 if v_1.Op != OpConst32 {
17426 break
17427 }
17428 c := auxIntToInt32(v_1.AuxInt)
17429 if !(isNonNegative(n) && isPowerOfTwo(c)) {
17430 break
17431 }
17432 v.reset(OpAnd32)
17433 v0 := b.NewValue0(v.Pos, OpConst32, t)
17434 v0.AuxInt = int32ToAuxInt(c - 1)
17435 v.AddArg2(n, v0)
17436 return true
17437 }
17438
17439
17440
17441 for {
17442 t := v.Type
17443 n := v_0
17444 if v_1.Op != OpConst32 {
17445 break
17446 }
17447 c := auxIntToInt32(v_1.AuxInt)
17448 if !(c < 0 && c != -1<<31) {
17449 break
17450 }
17451 v.reset(OpMod32)
17452 v.Type = t
17453 v0 := b.NewValue0(v.Pos, OpConst32, t)
17454 v0.AuxInt = int32ToAuxInt(-c)
17455 v.AddArg2(n, v0)
17456 return true
17457 }
17458
17459
17460
17461 for {
17462 t := v.Type
17463 x := v_0
17464 if v_1.Op != OpConst32 {
17465 break
17466 }
17467 c := auxIntToInt32(v_1.AuxInt)
17468 if !(x.Op != OpConst32 && (c > 0 || c == -1<<31)) {
17469 break
17470 }
17471 v.reset(OpSub32)
17472 v0 := b.NewValue0(v.Pos, OpMul32, t)
17473 v1 := b.NewValue0(v.Pos, OpDiv32, t)
17474 v2 := b.NewValue0(v.Pos, OpConst32, t)
17475 v2.AuxInt = int32ToAuxInt(c)
17476 v1.AddArg2(x, v2)
17477 v0.AddArg2(v1, v2)
17478 v.AddArg2(x, v0)
17479 return true
17480 }
17481 return false
17482 }
17483 func rewriteValuegeneric_OpMod32u(v *Value) bool {
17484 v_1 := v.Args[1]
17485 v_0 := v.Args[0]
17486 b := v.Block
17487
17488
17489
17490 for {
17491 if v_0.Op != OpConst32 {
17492 break
17493 }
17494 c := auxIntToInt32(v_0.AuxInt)
17495 if v_1.Op != OpConst32 {
17496 break
17497 }
17498 d := auxIntToInt32(v_1.AuxInt)
17499 if !(d != 0) {
17500 break
17501 }
17502 v.reset(OpConst32)
17503 v.AuxInt = int32ToAuxInt(int32(uint32(c) % uint32(d)))
17504 return true
17505 }
17506
17507
17508
17509 for {
17510 t := v.Type
17511 n := v_0
17512 if v_1.Op != OpConst32 {
17513 break
17514 }
17515 c := auxIntToInt32(v_1.AuxInt)
17516 if !(isPowerOfTwo(uint32(c))) {
17517 break
17518 }
17519 v.reset(OpAnd32)
17520 v0 := b.NewValue0(v.Pos, OpConst32, t)
17521 v0.AuxInt = int32ToAuxInt(c - 1)
17522 v.AddArg2(n, v0)
17523 return true
17524 }
17525
17526
17527
17528 for {
17529 t := v.Type
17530 x := v_0
17531 if v_1.Op != OpConst32 {
17532 break
17533 }
17534 c := auxIntToInt32(v_1.AuxInt)
17535 if !(x.Op != OpConst32 && c != 0) {
17536 break
17537 }
17538 v.reset(OpSub32)
17539 v0 := b.NewValue0(v.Pos, OpMul32, t)
17540 v1 := b.NewValue0(v.Pos, OpDiv32u, t)
17541 v2 := b.NewValue0(v.Pos, OpConst32, t)
17542 v2.AuxInt = int32ToAuxInt(c)
17543 v1.AddArg2(x, v2)
17544 v0.AddArg2(v1, v2)
17545 v.AddArg2(x, v0)
17546 return true
17547 }
17548 return false
17549 }
17550 func rewriteValuegeneric_OpMod64(v *Value) bool {
17551 v_1 := v.Args[1]
17552 v_0 := v.Args[0]
17553 b := v.Block
17554
17555
17556
17557 for {
17558 if v_0.Op != OpConst64 {
17559 break
17560 }
17561 c := auxIntToInt64(v_0.AuxInt)
17562 if v_1.Op != OpConst64 {
17563 break
17564 }
17565 d := auxIntToInt64(v_1.AuxInt)
17566 if !(d != 0) {
17567 break
17568 }
17569 v.reset(OpConst64)
17570 v.AuxInt = int64ToAuxInt(c % d)
17571 return true
17572 }
17573
17574
17575
17576 for {
17577 t := v.Type
17578 n := v_0
17579 if v_1.Op != OpConst64 {
17580 break
17581 }
17582 c := auxIntToInt64(v_1.AuxInt)
17583 if !(isNonNegative(n) && isPowerOfTwo(c)) {
17584 break
17585 }
17586 v.reset(OpAnd64)
17587 v0 := b.NewValue0(v.Pos, OpConst64, t)
17588 v0.AuxInt = int64ToAuxInt(c - 1)
17589 v.AddArg2(n, v0)
17590 return true
17591 }
17592
17593
17594
17595 for {
17596 n := v_0
17597 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 || !(isNonNegative(n)) {
17598 break
17599 }
17600 v.copyOf(n)
17601 return true
17602 }
17603
17604
17605
17606 for {
17607 t := v.Type
17608 n := v_0
17609 if v_1.Op != OpConst64 {
17610 break
17611 }
17612 c := auxIntToInt64(v_1.AuxInt)
17613 if !(c < 0 && c != -1<<63) {
17614 break
17615 }
17616 v.reset(OpMod64)
17617 v.Type = t
17618 v0 := b.NewValue0(v.Pos, OpConst64, t)
17619 v0.AuxInt = int64ToAuxInt(-c)
17620 v.AddArg2(n, v0)
17621 return true
17622 }
17623
17624
17625
17626 for {
17627 t := v.Type
17628 x := v_0
17629 if v_1.Op != OpConst64 {
17630 break
17631 }
17632 c := auxIntToInt64(v_1.AuxInt)
17633 if !(x.Op != OpConst64 && (c > 0 || c == -1<<63)) {
17634 break
17635 }
17636 v.reset(OpSub64)
17637 v0 := b.NewValue0(v.Pos, OpMul64, t)
17638 v1 := b.NewValue0(v.Pos, OpDiv64, t)
17639 v2 := b.NewValue0(v.Pos, OpConst64, t)
17640 v2.AuxInt = int64ToAuxInt(c)
17641 v1.AddArg2(x, v2)
17642 v0.AddArg2(v1, v2)
17643 v.AddArg2(x, v0)
17644 return true
17645 }
17646 return false
17647 }
17648 func rewriteValuegeneric_OpMod64u(v *Value) bool {
17649 v_1 := v.Args[1]
17650 v_0 := v.Args[0]
17651 b := v.Block
17652
17653
17654
17655 for {
17656 if v_0.Op != OpConst64 {
17657 break
17658 }
17659 c := auxIntToInt64(v_0.AuxInt)
17660 if v_1.Op != OpConst64 {
17661 break
17662 }
17663 d := auxIntToInt64(v_1.AuxInt)
17664 if !(d != 0) {
17665 break
17666 }
17667 v.reset(OpConst64)
17668 v.AuxInt = int64ToAuxInt(int64(uint64(c) % uint64(d)))
17669 return true
17670 }
17671
17672
17673
17674 for {
17675 t := v.Type
17676 n := v_0
17677 if v_1.Op != OpConst64 {
17678 break
17679 }
17680 c := auxIntToInt64(v_1.AuxInt)
17681 if !(isPowerOfTwo(uint64(c))) {
17682 break
17683 }
17684 v.reset(OpAnd64)
17685 v0 := b.NewValue0(v.Pos, OpConst64, t)
17686 v0.AuxInt = int64ToAuxInt(c - 1)
17687 v.AddArg2(n, v0)
17688 return true
17689 }
17690
17691
17692
17693 for {
17694 t := v.Type
17695 x := v_0
17696 if v_1.Op != OpConst64 {
17697 break
17698 }
17699 c := auxIntToInt64(v_1.AuxInt)
17700 if !(x.Op != OpConst64 && c != 0) {
17701 break
17702 }
17703 v.reset(OpSub64)
17704 v0 := b.NewValue0(v.Pos, OpMul64, t)
17705 v1 := b.NewValue0(v.Pos, OpDiv64u, t)
17706 v2 := b.NewValue0(v.Pos, OpConst64, t)
17707 v2.AuxInt = int64ToAuxInt(c)
17708 v1.AddArg2(x, v2)
17709 v0.AddArg2(v1, v2)
17710 v.AddArg2(x, v0)
17711 return true
17712 }
17713 return false
17714 }
17715 func rewriteValuegeneric_OpMod8(v *Value) bool {
17716 v_1 := v.Args[1]
17717 v_0 := v.Args[0]
17718 b := v.Block
17719
17720
17721
17722 for {
17723 if v_0.Op != OpConst8 {
17724 break
17725 }
17726 c := auxIntToInt8(v_0.AuxInt)
17727 if v_1.Op != OpConst8 {
17728 break
17729 }
17730 d := auxIntToInt8(v_1.AuxInt)
17731 if !(d != 0) {
17732 break
17733 }
17734 v.reset(OpConst8)
17735 v.AuxInt = int8ToAuxInt(c % d)
17736 return true
17737 }
17738
17739
17740
17741 for {
17742 t := v.Type
17743 n := v_0
17744 if v_1.Op != OpConst8 {
17745 break
17746 }
17747 c := auxIntToInt8(v_1.AuxInt)
17748 if !(isNonNegative(n) && isPowerOfTwo(c)) {
17749 break
17750 }
17751 v.reset(OpAnd8)
17752 v0 := b.NewValue0(v.Pos, OpConst8, t)
17753 v0.AuxInt = int8ToAuxInt(c - 1)
17754 v.AddArg2(n, v0)
17755 return true
17756 }
17757
17758
17759
17760 for {
17761 t := v.Type
17762 n := v_0
17763 if v_1.Op != OpConst8 {
17764 break
17765 }
17766 c := auxIntToInt8(v_1.AuxInt)
17767 if !(c < 0 && c != -1<<7) {
17768 break
17769 }
17770 v.reset(OpMod8)
17771 v.Type = t
17772 v0 := b.NewValue0(v.Pos, OpConst8, t)
17773 v0.AuxInt = int8ToAuxInt(-c)
17774 v.AddArg2(n, v0)
17775 return true
17776 }
17777
17778
17779
17780 for {
17781 t := v.Type
17782 x := v_0
17783 if v_1.Op != OpConst8 {
17784 break
17785 }
17786 c := auxIntToInt8(v_1.AuxInt)
17787 if !(x.Op != OpConst8 && (c > 0 || c == -1<<7)) {
17788 break
17789 }
17790 v.reset(OpSub8)
17791 v0 := b.NewValue0(v.Pos, OpMul8, t)
17792 v1 := b.NewValue0(v.Pos, OpDiv8, t)
17793 v2 := b.NewValue0(v.Pos, OpConst8, t)
17794 v2.AuxInt = int8ToAuxInt(c)
17795 v1.AddArg2(x, v2)
17796 v0.AddArg2(v1, v2)
17797 v.AddArg2(x, v0)
17798 return true
17799 }
17800 return false
17801 }
17802 func rewriteValuegeneric_OpMod8u(v *Value) bool {
17803 v_1 := v.Args[1]
17804 v_0 := v.Args[0]
17805 b := v.Block
17806
17807
17808
17809 for {
17810 if v_0.Op != OpConst8 {
17811 break
17812 }
17813 c := auxIntToInt8(v_0.AuxInt)
17814 if v_1.Op != OpConst8 {
17815 break
17816 }
17817 d := auxIntToInt8(v_1.AuxInt)
17818 if !(d != 0) {
17819 break
17820 }
17821 v.reset(OpConst8)
17822 v.AuxInt = int8ToAuxInt(int8(uint8(c) % uint8(d)))
17823 return true
17824 }
17825
17826
17827
17828 for {
17829 t := v.Type
17830 n := v_0
17831 if v_1.Op != OpConst8 {
17832 break
17833 }
17834 c := auxIntToInt8(v_1.AuxInt)
17835 if !(isPowerOfTwo(uint8(c))) {
17836 break
17837 }
17838 v.reset(OpAnd8)
17839 v0 := b.NewValue0(v.Pos, OpConst8, t)
17840 v0.AuxInt = int8ToAuxInt(c - 1)
17841 v.AddArg2(n, v0)
17842 return true
17843 }
17844
17845
17846
17847 for {
17848 t := v.Type
17849 x := v_0
17850 if v_1.Op != OpConst8 {
17851 break
17852 }
17853 c := auxIntToInt8(v_1.AuxInt)
17854 if !(x.Op != OpConst8 && c != 0) {
17855 break
17856 }
17857 v.reset(OpSub8)
17858 v0 := b.NewValue0(v.Pos, OpMul8, t)
17859 v1 := b.NewValue0(v.Pos, OpDiv8u, t)
17860 v2 := b.NewValue0(v.Pos, OpConst8, t)
17861 v2.AuxInt = int8ToAuxInt(c)
17862 v1.AddArg2(x, v2)
17863 v0.AddArg2(v1, v2)
17864 v.AddArg2(x, v0)
17865 return true
17866 }
17867 return false
17868 }
17869 func rewriteValuegeneric_OpMove(v *Value) bool {
17870 v_2 := v.Args[2]
17871 v_1 := v.Args[1]
17872 v_0 := v.Args[0]
17873 b := v.Block
17874 config := b.Func.Config
17875
17876
17877
17878 for {
17879 n := auxIntToInt64(v.AuxInt)
17880 t := auxToType(v.Aux)
17881 dst1 := v_0
17882 src := v_1
17883 mem := v_2
17884 if mem.Op != OpZero || auxIntToInt64(mem.AuxInt) != n || auxToType(mem.Aux) != t {
17885 break
17886 }
17887 dst2 := mem.Args[0]
17888 if !(isSamePtr(src, dst2)) {
17889 break
17890 }
17891 v.reset(OpZero)
17892 v.AuxInt = int64ToAuxInt(n)
17893 v.Aux = typeToAux(t)
17894 v.AddArg2(dst1, mem)
17895 return true
17896 }
17897
17898
17899
17900 for {
17901 n := auxIntToInt64(v.AuxInt)
17902 t := auxToType(v.Aux)
17903 dst1 := v_0
17904 src := v_1
17905 mem := v_2
17906 if mem.Op != OpVarDef {
17907 break
17908 }
17909 mem_0 := mem.Args[0]
17910 if mem_0.Op != OpZero || auxIntToInt64(mem_0.AuxInt) != n || auxToType(mem_0.Aux) != t {
17911 break
17912 }
17913 dst0 := mem_0.Args[0]
17914 if !(isSamePtr(src, dst0)) {
17915 break
17916 }
17917 v.reset(OpZero)
17918 v.AuxInt = int64ToAuxInt(n)
17919 v.Aux = typeToAux(t)
17920 v.AddArg2(dst1, mem)
17921 return true
17922 }
17923
17924
17925
17926 for {
17927 n := auxIntToInt64(v.AuxInt)
17928 t := auxToType(v.Aux)
17929 dst := v_0
17930 if v_1.Op != OpAddr {
17931 break
17932 }
17933 sym := auxToSym(v_1.Aux)
17934 v_1_0 := v_1.Args[0]
17935 if v_1_0.Op != OpSB {
17936 break
17937 }
17938 mem := v_2
17939 if !(symIsROZero(sym)) {
17940 break
17941 }
17942 v.reset(OpZero)
17943 v.AuxInt = int64ToAuxInt(n)
17944 v.Aux = typeToAux(t)
17945 v.AddArg2(dst, mem)
17946 return true
17947 }
17948
17949
17950
17951 for {
17952 n := auxIntToInt64(v.AuxInt)
17953 t1 := auxToType(v.Aux)
17954 dst1 := v_0
17955 src1 := v_1
17956 store := v_2
17957 if store.Op != OpStore {
17958 break
17959 }
17960 t2 := auxToType(store.Aux)
17961 mem := store.Args[2]
17962 op := store.Args[0]
17963 if op.Op != OpOffPtr {
17964 break
17965 }
17966 o2 := auxIntToInt64(op.AuxInt)
17967 dst2 := op.Args[0]
17968 if !(isSamePtr(dst1, dst2) && store.Uses == 1 && n >= o2+t2.Size() && disjoint(src1, n, op, t2.Size()) && clobber(store)) {
17969 break
17970 }
17971 v.reset(OpMove)
17972 v.AuxInt = int64ToAuxInt(n)
17973 v.Aux = typeToAux(t1)
17974 v.AddArg3(dst1, src1, mem)
17975 return true
17976 }
17977
17978
17979
17980 for {
17981 n := auxIntToInt64(v.AuxInt)
17982 t := auxToType(v.Aux)
17983 dst1 := v_0
17984 src1 := v_1
17985 move := v_2
17986 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
17987 break
17988 }
17989 mem := move.Args[2]
17990 dst2 := move.Args[0]
17991 if !(move.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move)) {
17992 break
17993 }
17994 v.reset(OpMove)
17995 v.AuxInt = int64ToAuxInt(n)
17996 v.Aux = typeToAux(t)
17997 v.AddArg3(dst1, src1, mem)
17998 return true
17999 }
18000
18001
18002
18003 for {
18004 n := auxIntToInt64(v.AuxInt)
18005 t := auxToType(v.Aux)
18006 dst1 := v_0
18007 src1 := v_1
18008 vardef := v_2
18009 if vardef.Op != OpVarDef {
18010 break
18011 }
18012 x := auxToSym(vardef.Aux)
18013 move := vardef.Args[0]
18014 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
18015 break
18016 }
18017 mem := move.Args[2]
18018 dst2 := move.Args[0]
18019 if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move, vardef)) {
18020 break
18021 }
18022 v.reset(OpMove)
18023 v.AuxInt = int64ToAuxInt(n)
18024 v.Aux = typeToAux(t)
18025 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
18026 v0.Aux = symToAux(x)
18027 v0.AddArg(mem)
18028 v.AddArg3(dst1, src1, v0)
18029 return true
18030 }
18031
18032
18033
18034 for {
18035 n := auxIntToInt64(v.AuxInt)
18036 t := auxToType(v.Aux)
18037 dst1 := v_0
18038 src1 := v_1
18039 zero := v_2
18040 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != n || auxToType(zero.Aux) != t {
18041 break
18042 }
18043 mem := zero.Args[1]
18044 dst2 := zero.Args[0]
18045 if !(zero.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero)) {
18046 break
18047 }
18048 v.reset(OpMove)
18049 v.AuxInt = int64ToAuxInt(n)
18050 v.Aux = typeToAux(t)
18051 v.AddArg3(dst1, src1, mem)
18052 return true
18053 }
18054
18055
18056
18057 for {
18058 n := auxIntToInt64(v.AuxInt)
18059 t := auxToType(v.Aux)
18060 dst1 := v_0
18061 src1 := v_1
18062 vardef := v_2
18063 if vardef.Op != OpVarDef {
18064 break
18065 }
18066 x := auxToSym(vardef.Aux)
18067 zero := vardef.Args[0]
18068 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != n || auxToType(zero.Aux) != t {
18069 break
18070 }
18071 mem := zero.Args[1]
18072 dst2 := zero.Args[0]
18073 if !(zero.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero, vardef)) {
18074 break
18075 }
18076 v.reset(OpMove)
18077 v.AuxInt = int64ToAuxInt(n)
18078 v.Aux = typeToAux(t)
18079 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
18080 v0.Aux = symToAux(x)
18081 v0.AddArg(mem)
18082 v.AddArg3(dst1, src1, v0)
18083 return true
18084 }
18085
18086
18087
18088 for {
18089 n := auxIntToInt64(v.AuxInt)
18090 t1 := auxToType(v.Aux)
18091 dst := v_0
18092 p1 := v_1
18093 mem := v_2
18094 if mem.Op != OpStore {
18095 break
18096 }
18097 t2 := auxToType(mem.Aux)
18098 _ = mem.Args[2]
18099 op2 := mem.Args[0]
18100 if op2.Op != OpOffPtr {
18101 break
18102 }
18103 tt2 := op2.Type
18104 o2 := auxIntToInt64(op2.AuxInt)
18105 p2 := op2.Args[0]
18106 d1 := mem.Args[1]
18107 mem_2 := mem.Args[2]
18108 if mem_2.Op != OpStore {
18109 break
18110 }
18111 t3 := auxToType(mem_2.Aux)
18112 d2 := mem_2.Args[1]
18113 op3 := mem_2.Args[0]
18114 if op3.Op != OpOffPtr {
18115 break
18116 }
18117 tt3 := op3.Type
18118 if auxIntToInt64(op3.AuxInt) != 0 {
18119 break
18120 }
18121 p3 := op3.Args[0]
18122 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()) {
18123 break
18124 }
18125 v.reset(OpStore)
18126 v.Aux = typeToAux(t2)
18127 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
18128 v0.AuxInt = int64ToAuxInt(o2)
18129 v0.AddArg(dst)
18130 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18131 v1.Aux = typeToAux(t3)
18132 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
18133 v2.AuxInt = int64ToAuxInt(0)
18134 v2.AddArg(dst)
18135 v1.AddArg3(v2, d2, mem)
18136 v.AddArg3(v0, d1, v1)
18137 return true
18138 }
18139
18140
18141
18142 for {
18143 n := auxIntToInt64(v.AuxInt)
18144 t1 := auxToType(v.Aux)
18145 dst := v_0
18146 p1 := v_1
18147 mem := v_2
18148 if mem.Op != OpStore {
18149 break
18150 }
18151 t2 := auxToType(mem.Aux)
18152 _ = mem.Args[2]
18153 op2 := mem.Args[0]
18154 if op2.Op != OpOffPtr {
18155 break
18156 }
18157 tt2 := op2.Type
18158 o2 := auxIntToInt64(op2.AuxInt)
18159 p2 := op2.Args[0]
18160 d1 := mem.Args[1]
18161 mem_2 := mem.Args[2]
18162 if mem_2.Op != OpStore {
18163 break
18164 }
18165 t3 := auxToType(mem_2.Aux)
18166 _ = mem_2.Args[2]
18167 op3 := mem_2.Args[0]
18168 if op3.Op != OpOffPtr {
18169 break
18170 }
18171 tt3 := op3.Type
18172 o3 := auxIntToInt64(op3.AuxInt)
18173 p3 := op3.Args[0]
18174 d2 := mem_2.Args[1]
18175 mem_2_2 := mem_2.Args[2]
18176 if mem_2_2.Op != OpStore {
18177 break
18178 }
18179 t4 := auxToType(mem_2_2.Aux)
18180 d3 := mem_2_2.Args[1]
18181 op4 := mem_2_2.Args[0]
18182 if op4.Op != OpOffPtr {
18183 break
18184 }
18185 tt4 := op4.Type
18186 if auxIntToInt64(op4.AuxInt) != 0 {
18187 break
18188 }
18189 p4 := op4.Args[0]
18190 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()) {
18191 break
18192 }
18193 v.reset(OpStore)
18194 v.Aux = typeToAux(t2)
18195 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
18196 v0.AuxInt = int64ToAuxInt(o2)
18197 v0.AddArg(dst)
18198 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18199 v1.Aux = typeToAux(t3)
18200 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
18201 v2.AuxInt = int64ToAuxInt(o3)
18202 v2.AddArg(dst)
18203 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18204 v3.Aux = typeToAux(t4)
18205 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
18206 v4.AuxInt = int64ToAuxInt(0)
18207 v4.AddArg(dst)
18208 v3.AddArg3(v4, d3, mem)
18209 v1.AddArg3(v2, d2, v3)
18210 v.AddArg3(v0, d1, v1)
18211 return true
18212 }
18213
18214
18215
18216 for {
18217 n := auxIntToInt64(v.AuxInt)
18218 t1 := auxToType(v.Aux)
18219 dst := v_0
18220 p1 := v_1
18221 mem := v_2
18222 if mem.Op != OpStore {
18223 break
18224 }
18225 t2 := auxToType(mem.Aux)
18226 _ = mem.Args[2]
18227 op2 := mem.Args[0]
18228 if op2.Op != OpOffPtr {
18229 break
18230 }
18231 tt2 := op2.Type
18232 o2 := auxIntToInt64(op2.AuxInt)
18233 p2 := op2.Args[0]
18234 d1 := mem.Args[1]
18235 mem_2 := mem.Args[2]
18236 if mem_2.Op != OpStore {
18237 break
18238 }
18239 t3 := auxToType(mem_2.Aux)
18240 _ = mem_2.Args[2]
18241 op3 := mem_2.Args[0]
18242 if op3.Op != OpOffPtr {
18243 break
18244 }
18245 tt3 := op3.Type
18246 o3 := auxIntToInt64(op3.AuxInt)
18247 p3 := op3.Args[0]
18248 d2 := mem_2.Args[1]
18249 mem_2_2 := mem_2.Args[2]
18250 if mem_2_2.Op != OpStore {
18251 break
18252 }
18253 t4 := auxToType(mem_2_2.Aux)
18254 _ = mem_2_2.Args[2]
18255 op4 := mem_2_2.Args[0]
18256 if op4.Op != OpOffPtr {
18257 break
18258 }
18259 tt4 := op4.Type
18260 o4 := auxIntToInt64(op4.AuxInt)
18261 p4 := op4.Args[0]
18262 d3 := mem_2_2.Args[1]
18263 mem_2_2_2 := mem_2_2.Args[2]
18264 if mem_2_2_2.Op != OpStore {
18265 break
18266 }
18267 t5 := auxToType(mem_2_2_2.Aux)
18268 d4 := mem_2_2_2.Args[1]
18269 op5 := mem_2_2_2.Args[0]
18270 if op5.Op != OpOffPtr {
18271 break
18272 }
18273 tt5 := op5.Type
18274 if auxIntToInt64(op5.AuxInt) != 0 {
18275 break
18276 }
18277 p5 := op5.Args[0]
18278 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()) {
18279 break
18280 }
18281 v.reset(OpStore)
18282 v.Aux = typeToAux(t2)
18283 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
18284 v0.AuxInt = int64ToAuxInt(o2)
18285 v0.AddArg(dst)
18286 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18287 v1.Aux = typeToAux(t3)
18288 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
18289 v2.AuxInt = int64ToAuxInt(o3)
18290 v2.AddArg(dst)
18291 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18292 v3.Aux = typeToAux(t4)
18293 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
18294 v4.AuxInt = int64ToAuxInt(o4)
18295 v4.AddArg(dst)
18296 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18297 v5.Aux = typeToAux(t5)
18298 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
18299 v6.AuxInt = int64ToAuxInt(0)
18300 v6.AddArg(dst)
18301 v5.AddArg3(v6, d4, mem)
18302 v3.AddArg3(v4, d3, v5)
18303 v1.AddArg3(v2, d2, v3)
18304 v.AddArg3(v0, d1, v1)
18305 return true
18306 }
18307
18308
18309
18310 for {
18311 n := auxIntToInt64(v.AuxInt)
18312 t1 := auxToType(v.Aux)
18313 dst := v_0
18314 p1 := v_1
18315 mem := v_2
18316 if mem.Op != OpVarDef {
18317 break
18318 }
18319 mem_0 := mem.Args[0]
18320 if mem_0.Op != OpStore {
18321 break
18322 }
18323 t2 := auxToType(mem_0.Aux)
18324 _ = mem_0.Args[2]
18325 op2 := mem_0.Args[0]
18326 if op2.Op != OpOffPtr {
18327 break
18328 }
18329 tt2 := op2.Type
18330 o2 := auxIntToInt64(op2.AuxInt)
18331 p2 := op2.Args[0]
18332 d1 := mem_0.Args[1]
18333 mem_0_2 := mem_0.Args[2]
18334 if mem_0_2.Op != OpStore {
18335 break
18336 }
18337 t3 := auxToType(mem_0_2.Aux)
18338 d2 := mem_0_2.Args[1]
18339 op3 := mem_0_2.Args[0]
18340 if op3.Op != OpOffPtr {
18341 break
18342 }
18343 tt3 := op3.Type
18344 if auxIntToInt64(op3.AuxInt) != 0 {
18345 break
18346 }
18347 p3 := op3.Args[0]
18348 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()) {
18349 break
18350 }
18351 v.reset(OpStore)
18352 v.Aux = typeToAux(t2)
18353 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
18354 v0.AuxInt = int64ToAuxInt(o2)
18355 v0.AddArg(dst)
18356 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18357 v1.Aux = typeToAux(t3)
18358 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
18359 v2.AuxInt = int64ToAuxInt(0)
18360 v2.AddArg(dst)
18361 v1.AddArg3(v2, d2, mem)
18362 v.AddArg3(v0, d1, v1)
18363 return true
18364 }
18365
18366
18367
18368 for {
18369 n := auxIntToInt64(v.AuxInt)
18370 t1 := auxToType(v.Aux)
18371 dst := v_0
18372 p1 := v_1
18373 mem := v_2
18374 if mem.Op != OpVarDef {
18375 break
18376 }
18377 mem_0 := mem.Args[0]
18378 if mem_0.Op != OpStore {
18379 break
18380 }
18381 t2 := auxToType(mem_0.Aux)
18382 _ = mem_0.Args[2]
18383 op2 := mem_0.Args[0]
18384 if op2.Op != OpOffPtr {
18385 break
18386 }
18387 tt2 := op2.Type
18388 o2 := auxIntToInt64(op2.AuxInt)
18389 p2 := op2.Args[0]
18390 d1 := mem_0.Args[1]
18391 mem_0_2 := mem_0.Args[2]
18392 if mem_0_2.Op != OpStore {
18393 break
18394 }
18395 t3 := auxToType(mem_0_2.Aux)
18396 _ = mem_0_2.Args[2]
18397 op3 := mem_0_2.Args[0]
18398 if op3.Op != OpOffPtr {
18399 break
18400 }
18401 tt3 := op3.Type
18402 o3 := auxIntToInt64(op3.AuxInt)
18403 p3 := op3.Args[0]
18404 d2 := mem_0_2.Args[1]
18405 mem_0_2_2 := mem_0_2.Args[2]
18406 if mem_0_2_2.Op != OpStore {
18407 break
18408 }
18409 t4 := auxToType(mem_0_2_2.Aux)
18410 d3 := mem_0_2_2.Args[1]
18411 op4 := mem_0_2_2.Args[0]
18412 if op4.Op != OpOffPtr {
18413 break
18414 }
18415 tt4 := op4.Type
18416 if auxIntToInt64(op4.AuxInt) != 0 {
18417 break
18418 }
18419 p4 := op4.Args[0]
18420 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()) {
18421 break
18422 }
18423 v.reset(OpStore)
18424 v.Aux = typeToAux(t2)
18425 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
18426 v0.AuxInt = int64ToAuxInt(o2)
18427 v0.AddArg(dst)
18428 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18429 v1.Aux = typeToAux(t3)
18430 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
18431 v2.AuxInt = int64ToAuxInt(o3)
18432 v2.AddArg(dst)
18433 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18434 v3.Aux = typeToAux(t4)
18435 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
18436 v4.AuxInt = int64ToAuxInt(0)
18437 v4.AddArg(dst)
18438 v3.AddArg3(v4, d3, mem)
18439 v1.AddArg3(v2, d2, v3)
18440 v.AddArg3(v0, d1, v1)
18441 return true
18442 }
18443
18444
18445
18446 for {
18447 n := auxIntToInt64(v.AuxInt)
18448 t1 := auxToType(v.Aux)
18449 dst := v_0
18450 p1 := v_1
18451 mem := v_2
18452 if mem.Op != OpVarDef {
18453 break
18454 }
18455 mem_0 := mem.Args[0]
18456 if mem_0.Op != OpStore {
18457 break
18458 }
18459 t2 := auxToType(mem_0.Aux)
18460 _ = mem_0.Args[2]
18461 op2 := mem_0.Args[0]
18462 if op2.Op != OpOffPtr {
18463 break
18464 }
18465 tt2 := op2.Type
18466 o2 := auxIntToInt64(op2.AuxInt)
18467 p2 := op2.Args[0]
18468 d1 := mem_0.Args[1]
18469 mem_0_2 := mem_0.Args[2]
18470 if mem_0_2.Op != OpStore {
18471 break
18472 }
18473 t3 := auxToType(mem_0_2.Aux)
18474 _ = mem_0_2.Args[2]
18475 op3 := mem_0_2.Args[0]
18476 if op3.Op != OpOffPtr {
18477 break
18478 }
18479 tt3 := op3.Type
18480 o3 := auxIntToInt64(op3.AuxInt)
18481 p3 := op3.Args[0]
18482 d2 := mem_0_2.Args[1]
18483 mem_0_2_2 := mem_0_2.Args[2]
18484 if mem_0_2_2.Op != OpStore {
18485 break
18486 }
18487 t4 := auxToType(mem_0_2_2.Aux)
18488 _ = mem_0_2_2.Args[2]
18489 op4 := mem_0_2_2.Args[0]
18490 if op4.Op != OpOffPtr {
18491 break
18492 }
18493 tt4 := op4.Type
18494 o4 := auxIntToInt64(op4.AuxInt)
18495 p4 := op4.Args[0]
18496 d3 := mem_0_2_2.Args[1]
18497 mem_0_2_2_2 := mem_0_2_2.Args[2]
18498 if mem_0_2_2_2.Op != OpStore {
18499 break
18500 }
18501 t5 := auxToType(mem_0_2_2_2.Aux)
18502 d4 := mem_0_2_2_2.Args[1]
18503 op5 := mem_0_2_2_2.Args[0]
18504 if op5.Op != OpOffPtr {
18505 break
18506 }
18507 tt5 := op5.Type
18508 if auxIntToInt64(op5.AuxInt) != 0 {
18509 break
18510 }
18511 p5 := op5.Args[0]
18512 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()) {
18513 break
18514 }
18515 v.reset(OpStore)
18516 v.Aux = typeToAux(t2)
18517 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
18518 v0.AuxInt = int64ToAuxInt(o2)
18519 v0.AddArg(dst)
18520 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18521 v1.Aux = typeToAux(t3)
18522 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
18523 v2.AuxInt = int64ToAuxInt(o3)
18524 v2.AddArg(dst)
18525 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18526 v3.Aux = typeToAux(t4)
18527 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
18528 v4.AuxInt = int64ToAuxInt(o4)
18529 v4.AddArg(dst)
18530 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18531 v5.Aux = typeToAux(t5)
18532 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
18533 v6.AuxInt = int64ToAuxInt(0)
18534 v6.AddArg(dst)
18535 v5.AddArg3(v6, d4, mem)
18536 v3.AddArg3(v4, d3, v5)
18537 v1.AddArg3(v2, d2, v3)
18538 v.AddArg3(v0, d1, v1)
18539 return true
18540 }
18541
18542
18543
18544 for {
18545 n := auxIntToInt64(v.AuxInt)
18546 t1 := auxToType(v.Aux)
18547 dst := v_0
18548 p1 := v_1
18549 mem := v_2
18550 if mem.Op != OpStore {
18551 break
18552 }
18553 t2 := auxToType(mem.Aux)
18554 _ = mem.Args[2]
18555 op2 := mem.Args[0]
18556 if op2.Op != OpOffPtr {
18557 break
18558 }
18559 tt2 := op2.Type
18560 o2 := auxIntToInt64(op2.AuxInt)
18561 p2 := op2.Args[0]
18562 d1 := mem.Args[1]
18563 mem_2 := mem.Args[2]
18564 if mem_2.Op != OpZero || auxIntToInt64(mem_2.AuxInt) != n {
18565 break
18566 }
18567 t3 := auxToType(mem_2.Aux)
18568 p3 := mem_2.Args[0]
18569 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && registerizable(b, t2) && n >= o2+t2.Size()) {
18570 break
18571 }
18572 v.reset(OpStore)
18573 v.Aux = typeToAux(t2)
18574 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
18575 v0.AuxInt = int64ToAuxInt(o2)
18576 v0.AddArg(dst)
18577 v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
18578 v1.AuxInt = int64ToAuxInt(n)
18579 v1.Aux = typeToAux(t1)
18580 v1.AddArg2(dst, mem)
18581 v.AddArg3(v0, d1, v1)
18582 return true
18583 }
18584
18585
18586
18587 for {
18588 n := auxIntToInt64(v.AuxInt)
18589 t1 := auxToType(v.Aux)
18590 dst := v_0
18591 p1 := v_1
18592 mem := v_2
18593 if mem.Op != OpStore {
18594 break
18595 }
18596 t2 := auxToType(mem.Aux)
18597 _ = mem.Args[2]
18598 mem_0 := mem.Args[0]
18599 if mem_0.Op != OpOffPtr {
18600 break
18601 }
18602 tt2 := mem_0.Type
18603 o2 := auxIntToInt64(mem_0.AuxInt)
18604 p2 := mem_0.Args[0]
18605 d1 := mem.Args[1]
18606 mem_2 := mem.Args[2]
18607 if mem_2.Op != OpStore {
18608 break
18609 }
18610 t3 := auxToType(mem_2.Aux)
18611 _ = mem_2.Args[2]
18612 mem_2_0 := mem_2.Args[0]
18613 if mem_2_0.Op != OpOffPtr {
18614 break
18615 }
18616 tt3 := mem_2_0.Type
18617 o3 := auxIntToInt64(mem_2_0.AuxInt)
18618 p3 := mem_2_0.Args[0]
18619 d2 := mem_2.Args[1]
18620 mem_2_2 := mem_2.Args[2]
18621 if mem_2_2.Op != OpZero || auxIntToInt64(mem_2_2.AuxInt) != n {
18622 break
18623 }
18624 t4 := auxToType(mem_2_2.Aux)
18625 p4 := mem_2_2.Args[0]
18626 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()) {
18627 break
18628 }
18629 v.reset(OpStore)
18630 v.Aux = typeToAux(t2)
18631 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
18632 v0.AuxInt = int64ToAuxInt(o2)
18633 v0.AddArg(dst)
18634 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18635 v1.Aux = typeToAux(t3)
18636 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
18637 v2.AuxInt = int64ToAuxInt(o3)
18638 v2.AddArg(dst)
18639 v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
18640 v3.AuxInt = int64ToAuxInt(n)
18641 v3.Aux = typeToAux(t1)
18642 v3.AddArg2(dst, mem)
18643 v1.AddArg3(v2, d2, v3)
18644 v.AddArg3(v0, d1, v1)
18645 return true
18646 }
18647
18648
18649
18650 for {
18651 n := auxIntToInt64(v.AuxInt)
18652 t1 := auxToType(v.Aux)
18653 dst := v_0
18654 p1 := v_1
18655 mem := v_2
18656 if mem.Op != OpStore {
18657 break
18658 }
18659 t2 := auxToType(mem.Aux)
18660 _ = mem.Args[2]
18661 mem_0 := mem.Args[0]
18662 if mem_0.Op != OpOffPtr {
18663 break
18664 }
18665 tt2 := mem_0.Type
18666 o2 := auxIntToInt64(mem_0.AuxInt)
18667 p2 := mem_0.Args[0]
18668 d1 := mem.Args[1]
18669 mem_2 := mem.Args[2]
18670 if mem_2.Op != OpStore {
18671 break
18672 }
18673 t3 := auxToType(mem_2.Aux)
18674 _ = mem_2.Args[2]
18675 mem_2_0 := mem_2.Args[0]
18676 if mem_2_0.Op != OpOffPtr {
18677 break
18678 }
18679 tt3 := mem_2_0.Type
18680 o3 := auxIntToInt64(mem_2_0.AuxInt)
18681 p3 := mem_2_0.Args[0]
18682 d2 := mem_2.Args[1]
18683 mem_2_2 := mem_2.Args[2]
18684 if mem_2_2.Op != OpStore {
18685 break
18686 }
18687 t4 := auxToType(mem_2_2.Aux)
18688 _ = mem_2_2.Args[2]
18689 mem_2_2_0 := mem_2_2.Args[0]
18690 if mem_2_2_0.Op != OpOffPtr {
18691 break
18692 }
18693 tt4 := mem_2_2_0.Type
18694 o4 := auxIntToInt64(mem_2_2_0.AuxInt)
18695 p4 := mem_2_2_0.Args[0]
18696 d3 := mem_2_2.Args[1]
18697 mem_2_2_2 := mem_2_2.Args[2]
18698 if mem_2_2_2.Op != OpZero || auxIntToInt64(mem_2_2_2.AuxInt) != n {
18699 break
18700 }
18701 t5 := auxToType(mem_2_2_2.Aux)
18702 p5 := mem_2_2_2.Args[0]
18703 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()) {
18704 break
18705 }
18706 v.reset(OpStore)
18707 v.Aux = typeToAux(t2)
18708 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
18709 v0.AuxInt = int64ToAuxInt(o2)
18710 v0.AddArg(dst)
18711 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18712 v1.Aux = typeToAux(t3)
18713 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
18714 v2.AuxInt = int64ToAuxInt(o3)
18715 v2.AddArg(dst)
18716 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18717 v3.Aux = typeToAux(t4)
18718 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
18719 v4.AuxInt = int64ToAuxInt(o4)
18720 v4.AddArg(dst)
18721 v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
18722 v5.AuxInt = int64ToAuxInt(n)
18723 v5.Aux = typeToAux(t1)
18724 v5.AddArg2(dst, mem)
18725 v3.AddArg3(v4, d3, v5)
18726 v1.AddArg3(v2, d2, v3)
18727 v.AddArg3(v0, d1, v1)
18728 return true
18729 }
18730
18731
18732
18733 for {
18734 n := auxIntToInt64(v.AuxInt)
18735 t1 := auxToType(v.Aux)
18736 dst := v_0
18737 p1 := v_1
18738 mem := v_2
18739 if mem.Op != OpStore {
18740 break
18741 }
18742 t2 := auxToType(mem.Aux)
18743 _ = mem.Args[2]
18744 mem_0 := mem.Args[0]
18745 if mem_0.Op != OpOffPtr {
18746 break
18747 }
18748 tt2 := mem_0.Type
18749 o2 := auxIntToInt64(mem_0.AuxInt)
18750 p2 := mem_0.Args[0]
18751 d1 := mem.Args[1]
18752 mem_2 := mem.Args[2]
18753 if mem_2.Op != OpStore {
18754 break
18755 }
18756 t3 := auxToType(mem_2.Aux)
18757 _ = mem_2.Args[2]
18758 mem_2_0 := mem_2.Args[0]
18759 if mem_2_0.Op != OpOffPtr {
18760 break
18761 }
18762 tt3 := mem_2_0.Type
18763 o3 := auxIntToInt64(mem_2_0.AuxInt)
18764 p3 := mem_2_0.Args[0]
18765 d2 := mem_2.Args[1]
18766 mem_2_2 := mem_2.Args[2]
18767 if mem_2_2.Op != OpStore {
18768 break
18769 }
18770 t4 := auxToType(mem_2_2.Aux)
18771 _ = mem_2_2.Args[2]
18772 mem_2_2_0 := mem_2_2.Args[0]
18773 if mem_2_2_0.Op != OpOffPtr {
18774 break
18775 }
18776 tt4 := mem_2_2_0.Type
18777 o4 := auxIntToInt64(mem_2_2_0.AuxInt)
18778 p4 := mem_2_2_0.Args[0]
18779 d3 := mem_2_2.Args[1]
18780 mem_2_2_2 := mem_2_2.Args[2]
18781 if mem_2_2_2.Op != OpStore {
18782 break
18783 }
18784 t5 := auxToType(mem_2_2_2.Aux)
18785 _ = mem_2_2_2.Args[2]
18786 mem_2_2_2_0 := mem_2_2_2.Args[0]
18787 if mem_2_2_2_0.Op != OpOffPtr {
18788 break
18789 }
18790 tt5 := mem_2_2_2_0.Type
18791 o5 := auxIntToInt64(mem_2_2_2_0.AuxInt)
18792 p5 := mem_2_2_2_0.Args[0]
18793 d4 := mem_2_2_2.Args[1]
18794 mem_2_2_2_2 := mem_2_2_2.Args[2]
18795 if mem_2_2_2_2.Op != OpZero || auxIntToInt64(mem_2_2_2_2.AuxInt) != n {
18796 break
18797 }
18798 t6 := auxToType(mem_2_2_2_2.Aux)
18799 p6 := mem_2_2_2_2.Args[0]
18800 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()) {
18801 break
18802 }
18803 v.reset(OpStore)
18804 v.Aux = typeToAux(t2)
18805 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
18806 v0.AuxInt = int64ToAuxInt(o2)
18807 v0.AddArg(dst)
18808 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18809 v1.Aux = typeToAux(t3)
18810 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
18811 v2.AuxInt = int64ToAuxInt(o3)
18812 v2.AddArg(dst)
18813 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18814 v3.Aux = typeToAux(t4)
18815 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
18816 v4.AuxInt = int64ToAuxInt(o4)
18817 v4.AddArg(dst)
18818 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18819 v5.Aux = typeToAux(t5)
18820 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
18821 v6.AuxInt = int64ToAuxInt(o5)
18822 v6.AddArg(dst)
18823 v7 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
18824 v7.AuxInt = int64ToAuxInt(n)
18825 v7.Aux = typeToAux(t1)
18826 v7.AddArg2(dst, mem)
18827 v5.AddArg3(v6, d4, v7)
18828 v3.AddArg3(v4, d3, v5)
18829 v1.AddArg3(v2, d2, v3)
18830 v.AddArg3(v0, d1, v1)
18831 return true
18832 }
18833
18834
18835
18836 for {
18837 n := auxIntToInt64(v.AuxInt)
18838 t1 := auxToType(v.Aux)
18839 dst := v_0
18840 p1 := v_1
18841 mem := v_2
18842 if mem.Op != OpVarDef {
18843 break
18844 }
18845 mem_0 := mem.Args[0]
18846 if mem_0.Op != OpStore {
18847 break
18848 }
18849 t2 := auxToType(mem_0.Aux)
18850 _ = mem_0.Args[2]
18851 op2 := mem_0.Args[0]
18852 if op2.Op != OpOffPtr {
18853 break
18854 }
18855 tt2 := op2.Type
18856 o2 := auxIntToInt64(op2.AuxInt)
18857 p2 := op2.Args[0]
18858 d1 := mem_0.Args[1]
18859 mem_0_2 := mem_0.Args[2]
18860 if mem_0_2.Op != OpZero || auxIntToInt64(mem_0_2.AuxInt) != n {
18861 break
18862 }
18863 t3 := auxToType(mem_0_2.Aux)
18864 p3 := mem_0_2.Args[0]
18865 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && registerizable(b, t2) && n >= o2+t2.Size()) {
18866 break
18867 }
18868 v.reset(OpStore)
18869 v.Aux = typeToAux(t2)
18870 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
18871 v0.AuxInt = int64ToAuxInt(o2)
18872 v0.AddArg(dst)
18873 v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
18874 v1.AuxInt = int64ToAuxInt(n)
18875 v1.Aux = typeToAux(t1)
18876 v1.AddArg2(dst, mem)
18877 v.AddArg3(v0, d1, v1)
18878 return true
18879 }
18880
18881
18882
18883 for {
18884 n := auxIntToInt64(v.AuxInt)
18885 t1 := auxToType(v.Aux)
18886 dst := v_0
18887 p1 := v_1
18888 mem := v_2
18889 if mem.Op != OpVarDef {
18890 break
18891 }
18892 mem_0 := mem.Args[0]
18893 if mem_0.Op != OpStore {
18894 break
18895 }
18896 t2 := auxToType(mem_0.Aux)
18897 _ = mem_0.Args[2]
18898 mem_0_0 := mem_0.Args[0]
18899 if mem_0_0.Op != OpOffPtr {
18900 break
18901 }
18902 tt2 := mem_0_0.Type
18903 o2 := auxIntToInt64(mem_0_0.AuxInt)
18904 p2 := mem_0_0.Args[0]
18905 d1 := mem_0.Args[1]
18906 mem_0_2 := mem_0.Args[2]
18907 if mem_0_2.Op != OpStore {
18908 break
18909 }
18910 t3 := auxToType(mem_0_2.Aux)
18911 _ = mem_0_2.Args[2]
18912 mem_0_2_0 := mem_0_2.Args[0]
18913 if mem_0_2_0.Op != OpOffPtr {
18914 break
18915 }
18916 tt3 := mem_0_2_0.Type
18917 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
18918 p3 := mem_0_2_0.Args[0]
18919 d2 := mem_0_2.Args[1]
18920 mem_0_2_2 := mem_0_2.Args[2]
18921 if mem_0_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2.AuxInt) != n {
18922 break
18923 }
18924 t4 := auxToType(mem_0_2_2.Aux)
18925 p4 := mem_0_2_2.Args[0]
18926 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()) {
18927 break
18928 }
18929 v.reset(OpStore)
18930 v.Aux = typeToAux(t2)
18931 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
18932 v0.AuxInt = int64ToAuxInt(o2)
18933 v0.AddArg(dst)
18934 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
18935 v1.Aux = typeToAux(t3)
18936 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
18937 v2.AuxInt = int64ToAuxInt(o3)
18938 v2.AddArg(dst)
18939 v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
18940 v3.AuxInt = int64ToAuxInt(n)
18941 v3.Aux = typeToAux(t1)
18942 v3.AddArg2(dst, mem)
18943 v1.AddArg3(v2, d2, v3)
18944 v.AddArg3(v0, d1, v1)
18945 return true
18946 }
18947
18948
18949
18950 for {
18951 n := auxIntToInt64(v.AuxInt)
18952 t1 := auxToType(v.Aux)
18953 dst := v_0
18954 p1 := v_1
18955 mem := v_2
18956 if mem.Op != OpVarDef {
18957 break
18958 }
18959 mem_0 := mem.Args[0]
18960 if mem_0.Op != OpStore {
18961 break
18962 }
18963 t2 := auxToType(mem_0.Aux)
18964 _ = mem_0.Args[2]
18965 mem_0_0 := mem_0.Args[0]
18966 if mem_0_0.Op != OpOffPtr {
18967 break
18968 }
18969 tt2 := mem_0_0.Type
18970 o2 := auxIntToInt64(mem_0_0.AuxInt)
18971 p2 := mem_0_0.Args[0]
18972 d1 := mem_0.Args[1]
18973 mem_0_2 := mem_0.Args[2]
18974 if mem_0_2.Op != OpStore {
18975 break
18976 }
18977 t3 := auxToType(mem_0_2.Aux)
18978 _ = mem_0_2.Args[2]
18979 mem_0_2_0 := mem_0_2.Args[0]
18980 if mem_0_2_0.Op != OpOffPtr {
18981 break
18982 }
18983 tt3 := mem_0_2_0.Type
18984 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
18985 p3 := mem_0_2_0.Args[0]
18986 d2 := mem_0_2.Args[1]
18987 mem_0_2_2 := mem_0_2.Args[2]
18988 if mem_0_2_2.Op != OpStore {
18989 break
18990 }
18991 t4 := auxToType(mem_0_2_2.Aux)
18992 _ = mem_0_2_2.Args[2]
18993 mem_0_2_2_0 := mem_0_2_2.Args[0]
18994 if mem_0_2_2_0.Op != OpOffPtr {
18995 break
18996 }
18997 tt4 := mem_0_2_2_0.Type
18998 o4 := auxIntToInt64(mem_0_2_2_0.AuxInt)
18999 p4 := mem_0_2_2_0.Args[0]
19000 d3 := mem_0_2_2.Args[1]
19001 mem_0_2_2_2 := mem_0_2_2.Args[2]
19002 if mem_0_2_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2_2.AuxInt) != n {
19003 break
19004 }
19005 t5 := auxToType(mem_0_2_2_2.Aux)
19006 p5 := mem_0_2_2_2.Args[0]
19007 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()) {
19008 break
19009 }
19010 v.reset(OpStore)
19011 v.Aux = typeToAux(t2)
19012 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
19013 v0.AuxInt = int64ToAuxInt(o2)
19014 v0.AddArg(dst)
19015 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
19016 v1.Aux = typeToAux(t3)
19017 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
19018 v2.AuxInt = int64ToAuxInt(o3)
19019 v2.AddArg(dst)
19020 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
19021 v3.Aux = typeToAux(t4)
19022 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
19023 v4.AuxInt = int64ToAuxInt(o4)
19024 v4.AddArg(dst)
19025 v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
19026 v5.AuxInt = int64ToAuxInt(n)
19027 v5.Aux = typeToAux(t1)
19028 v5.AddArg2(dst, mem)
19029 v3.AddArg3(v4, d3, v5)
19030 v1.AddArg3(v2, d2, v3)
19031 v.AddArg3(v0, d1, v1)
19032 return true
19033 }
19034
19035
19036
19037 for {
19038 n := auxIntToInt64(v.AuxInt)
19039 t1 := auxToType(v.Aux)
19040 dst := v_0
19041 p1 := v_1
19042 mem := v_2
19043 if mem.Op != OpVarDef {
19044 break
19045 }
19046 mem_0 := mem.Args[0]
19047 if mem_0.Op != OpStore {
19048 break
19049 }
19050 t2 := auxToType(mem_0.Aux)
19051 _ = mem_0.Args[2]
19052 mem_0_0 := mem_0.Args[0]
19053 if mem_0_0.Op != OpOffPtr {
19054 break
19055 }
19056 tt2 := mem_0_0.Type
19057 o2 := auxIntToInt64(mem_0_0.AuxInt)
19058 p2 := mem_0_0.Args[0]
19059 d1 := mem_0.Args[1]
19060 mem_0_2 := mem_0.Args[2]
19061 if mem_0_2.Op != OpStore {
19062 break
19063 }
19064 t3 := auxToType(mem_0_2.Aux)
19065 _ = mem_0_2.Args[2]
19066 mem_0_2_0 := mem_0_2.Args[0]
19067 if mem_0_2_0.Op != OpOffPtr {
19068 break
19069 }
19070 tt3 := mem_0_2_0.Type
19071 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
19072 p3 := mem_0_2_0.Args[0]
19073 d2 := mem_0_2.Args[1]
19074 mem_0_2_2 := mem_0_2.Args[2]
19075 if mem_0_2_2.Op != OpStore {
19076 break
19077 }
19078 t4 := auxToType(mem_0_2_2.Aux)
19079 _ = mem_0_2_2.Args[2]
19080 mem_0_2_2_0 := mem_0_2_2.Args[0]
19081 if mem_0_2_2_0.Op != OpOffPtr {
19082 break
19083 }
19084 tt4 := mem_0_2_2_0.Type
19085 o4 := auxIntToInt64(mem_0_2_2_0.AuxInt)
19086 p4 := mem_0_2_2_0.Args[0]
19087 d3 := mem_0_2_2.Args[1]
19088 mem_0_2_2_2 := mem_0_2_2.Args[2]
19089 if mem_0_2_2_2.Op != OpStore {
19090 break
19091 }
19092 t5 := auxToType(mem_0_2_2_2.Aux)
19093 _ = mem_0_2_2_2.Args[2]
19094 mem_0_2_2_2_0 := mem_0_2_2_2.Args[0]
19095 if mem_0_2_2_2_0.Op != OpOffPtr {
19096 break
19097 }
19098 tt5 := mem_0_2_2_2_0.Type
19099 o5 := auxIntToInt64(mem_0_2_2_2_0.AuxInt)
19100 p5 := mem_0_2_2_2_0.Args[0]
19101 d4 := mem_0_2_2_2.Args[1]
19102 mem_0_2_2_2_2 := mem_0_2_2_2.Args[2]
19103 if mem_0_2_2_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2_2_2.AuxInt) != n {
19104 break
19105 }
19106 t6 := auxToType(mem_0_2_2_2_2.Aux)
19107 p6 := mem_0_2_2_2_2.Args[0]
19108 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()) {
19109 break
19110 }
19111 v.reset(OpStore)
19112 v.Aux = typeToAux(t2)
19113 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
19114 v0.AuxInt = int64ToAuxInt(o2)
19115 v0.AddArg(dst)
19116 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
19117 v1.Aux = typeToAux(t3)
19118 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
19119 v2.AuxInt = int64ToAuxInt(o3)
19120 v2.AddArg(dst)
19121 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
19122 v3.Aux = typeToAux(t4)
19123 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
19124 v4.AuxInt = int64ToAuxInt(o4)
19125 v4.AddArg(dst)
19126 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
19127 v5.Aux = typeToAux(t5)
19128 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
19129 v6.AuxInt = int64ToAuxInt(o5)
19130 v6.AddArg(dst)
19131 v7 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
19132 v7.AuxInt = int64ToAuxInt(n)
19133 v7.Aux = typeToAux(t1)
19134 v7.AddArg2(dst, mem)
19135 v5.AddArg3(v6, d4, v7)
19136 v3.AddArg3(v4, d3, v5)
19137 v1.AddArg3(v2, d2, v3)
19138 v.AddArg3(v0, d1, v1)
19139 return true
19140 }
19141
19142
19143
19144 for {
19145 s := auxIntToInt64(v.AuxInt)
19146 t1 := auxToType(v.Aux)
19147 dst := v_0
19148 tmp1 := v_1
19149 midmem := v_2
19150 if midmem.Op != OpMove || auxIntToInt64(midmem.AuxInt) != s {
19151 break
19152 }
19153 t2 := auxToType(midmem.Aux)
19154 src := midmem.Args[1]
19155 tmp2 := midmem.Args[0]
19156 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))) {
19157 break
19158 }
19159 v.reset(OpMove)
19160 v.AuxInt = int64ToAuxInt(s)
19161 v.Aux = typeToAux(t1)
19162 v.AddArg3(dst, src, midmem)
19163 return true
19164 }
19165
19166
19167
19168 for {
19169 s := auxIntToInt64(v.AuxInt)
19170 t1 := auxToType(v.Aux)
19171 dst := v_0
19172 tmp1 := v_1
19173 midmem := v_2
19174 if midmem.Op != OpVarDef {
19175 break
19176 }
19177 midmem_0 := midmem.Args[0]
19178 if midmem_0.Op != OpMove || auxIntToInt64(midmem_0.AuxInt) != s {
19179 break
19180 }
19181 t2 := auxToType(midmem_0.Aux)
19182 src := midmem_0.Args[1]
19183 tmp2 := midmem_0.Args[0]
19184 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))) {
19185 break
19186 }
19187 v.reset(OpMove)
19188 v.AuxInt = int64ToAuxInt(s)
19189 v.Aux = typeToAux(t1)
19190 v.AddArg3(dst, src, midmem)
19191 return true
19192 }
19193
19194
19195
19196 for {
19197 dst := v_0
19198 src := v_1
19199 mem := v_2
19200 if !(isSamePtr(dst, src)) {
19201 break
19202 }
19203 v.copyOf(mem)
19204 return true
19205 }
19206 return false
19207 }
19208 func rewriteValuegeneric_OpMul16(v *Value) bool {
19209 v_1 := v.Args[1]
19210 v_0 := v.Args[0]
19211 b := v.Block
19212 typ := &b.Func.Config.Types
19213
19214
19215 for {
19216 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19217 if v_0.Op != OpConst16 {
19218 continue
19219 }
19220 c := auxIntToInt16(v_0.AuxInt)
19221 if v_1.Op != OpConst16 {
19222 continue
19223 }
19224 d := auxIntToInt16(v_1.AuxInt)
19225 v.reset(OpConst16)
19226 v.AuxInt = int16ToAuxInt(c * d)
19227 return true
19228 }
19229 break
19230 }
19231
19232
19233 for {
19234 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19235 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 1 {
19236 continue
19237 }
19238 x := v_1
19239 v.copyOf(x)
19240 return true
19241 }
19242 break
19243 }
19244
19245
19246 for {
19247 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19248 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
19249 continue
19250 }
19251 x := v_1
19252 v.reset(OpNeg16)
19253 v.AddArg(x)
19254 return true
19255 }
19256 break
19257 }
19258
19259
19260 for {
19261 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19262 if v_0.Op != OpConst16 {
19263 continue
19264 }
19265 t := v_0.Type
19266 c := auxIntToInt16(v_0.AuxInt)
19267 if v_1.Op != OpNeg16 {
19268 continue
19269 }
19270 x := v_1.Args[0]
19271 v.reset(OpMul16)
19272 v0 := b.NewValue0(v.Pos, OpConst16, t)
19273 v0.AuxInt = int16ToAuxInt(-c)
19274 v.AddArg2(x, v0)
19275 return true
19276 }
19277 break
19278 }
19279
19280
19281 for {
19282 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19283 if v_0.Op != OpNeg16 {
19284 continue
19285 }
19286 x := v_0.Args[0]
19287 if v_1.Op != OpNeg16 {
19288 continue
19289 }
19290 y := v_1.Args[0]
19291 v.reset(OpMul16)
19292 v.AddArg2(x, y)
19293 return true
19294 }
19295 break
19296 }
19297
19298
19299
19300 for {
19301 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19302 if v_0.Op != OpConst16 {
19303 continue
19304 }
19305 t := v_0.Type
19306 c := auxIntToInt16(v_0.AuxInt)
19307 if v_1.Op != OpAdd16 || v_1.Type != t {
19308 continue
19309 }
19310 _ = v_1.Args[1]
19311 v_1_0 := v_1.Args[0]
19312 v_1_1 := v_1.Args[1]
19313 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19314 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
19315 continue
19316 }
19317 d := auxIntToInt16(v_1_0.AuxInt)
19318 x := v_1_1
19319 if !(!isPowerOfTwo(c)) {
19320 continue
19321 }
19322 v.reset(OpAdd16)
19323 v0 := b.NewValue0(v.Pos, OpConst16, t)
19324 v0.AuxInt = int16ToAuxInt(c * d)
19325 v1 := b.NewValue0(v.Pos, OpMul16, t)
19326 v2 := b.NewValue0(v.Pos, OpConst16, t)
19327 v2.AuxInt = int16ToAuxInt(c)
19328 v1.AddArg2(v2, x)
19329 v.AddArg2(v0, v1)
19330 return true
19331 }
19332 }
19333 break
19334 }
19335
19336
19337 for {
19338 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19339 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
19340 continue
19341 }
19342 v.reset(OpConst16)
19343 v.AuxInt = int16ToAuxInt(0)
19344 return true
19345 }
19346 break
19347 }
19348
19349
19350
19351 for {
19352 t := v.Type
19353 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19354 x := v_0
19355 if v_1.Op != OpConst16 {
19356 continue
19357 }
19358 c := auxIntToInt16(v_1.AuxInt)
19359 if !(isPowerOfTwo(uint16(c)) && v.Block.Func.pass.name != "opt") {
19360 continue
19361 }
19362 v.reset(OpLsh16x64)
19363 v.Type = t
19364 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
19365 v0.AuxInt = int64ToAuxInt(log16u(uint16(c)))
19366 v.AddArg2(x, v0)
19367 return true
19368 }
19369 break
19370 }
19371
19372
19373
19374 for {
19375 t := v.Type
19376 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19377 x := v_0
19378 if v_1.Op != OpConst16 {
19379 continue
19380 }
19381 c := auxIntToInt16(v_1.AuxInt)
19382 if !(isPowerOfTwo(uint16(-c)) && v.Block.Func.pass.name != "opt") {
19383 continue
19384 }
19385 v.reset(OpNeg16)
19386 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
19387 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
19388 v1.AuxInt = int64ToAuxInt(log16u(uint16(-c)))
19389 v0.AddArg2(x, v1)
19390 v.AddArg(v0)
19391 return true
19392 }
19393 break
19394 }
19395
19396
19397
19398 for {
19399 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19400 if v_0.Op != OpMul16 {
19401 continue
19402 }
19403 _ = v_0.Args[1]
19404 v_0_0 := v_0.Args[0]
19405 v_0_1 := v_0.Args[1]
19406 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19407 i := v_0_0
19408 if i.Op != OpConst16 {
19409 continue
19410 }
19411 t := i.Type
19412 z := v_0_1
19413 x := v_1
19414 if !(z.Op != OpConst16 && x.Op != OpConst16) {
19415 continue
19416 }
19417 v.reset(OpMul16)
19418 v0 := b.NewValue0(v.Pos, OpMul16, t)
19419 v0.AddArg2(x, z)
19420 v.AddArg2(i, v0)
19421 return true
19422 }
19423 }
19424 break
19425 }
19426
19427
19428 for {
19429 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19430 if v_0.Op != OpConst16 {
19431 continue
19432 }
19433 t := v_0.Type
19434 c := auxIntToInt16(v_0.AuxInt)
19435 if v_1.Op != OpMul16 {
19436 continue
19437 }
19438 _ = v_1.Args[1]
19439 v_1_0 := v_1.Args[0]
19440 v_1_1 := v_1.Args[1]
19441 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19442 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
19443 continue
19444 }
19445 d := auxIntToInt16(v_1_0.AuxInt)
19446 x := v_1_1
19447 v.reset(OpMul16)
19448 v0 := b.NewValue0(v.Pos, OpConst16, t)
19449 v0.AuxInt = int16ToAuxInt(c * d)
19450 v.AddArg2(v0, x)
19451 return true
19452 }
19453 }
19454 break
19455 }
19456 return false
19457 }
19458 func rewriteValuegeneric_OpMul32(v *Value) bool {
19459 v_1 := v.Args[1]
19460 v_0 := v.Args[0]
19461 b := v.Block
19462 typ := &b.Func.Config.Types
19463
19464
19465 for {
19466 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19467 if v_0.Op != OpConst32 {
19468 continue
19469 }
19470 c := auxIntToInt32(v_0.AuxInt)
19471 if v_1.Op != OpConst32 {
19472 continue
19473 }
19474 d := auxIntToInt32(v_1.AuxInt)
19475 v.reset(OpConst32)
19476 v.AuxInt = int32ToAuxInt(c * d)
19477 return true
19478 }
19479 break
19480 }
19481
19482
19483 for {
19484 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19485 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 {
19486 continue
19487 }
19488 x := v_1
19489 v.copyOf(x)
19490 return true
19491 }
19492 break
19493 }
19494
19495
19496 for {
19497 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19498 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
19499 continue
19500 }
19501 x := v_1
19502 v.reset(OpNeg32)
19503 v.AddArg(x)
19504 return true
19505 }
19506 break
19507 }
19508
19509
19510 for {
19511 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19512 if v_0.Op != OpConst32 {
19513 continue
19514 }
19515 t := v_0.Type
19516 c := auxIntToInt32(v_0.AuxInt)
19517 if v_1.Op != OpNeg32 {
19518 continue
19519 }
19520 x := v_1.Args[0]
19521 v.reset(OpMul32)
19522 v0 := b.NewValue0(v.Pos, OpConst32, t)
19523 v0.AuxInt = int32ToAuxInt(-c)
19524 v.AddArg2(x, v0)
19525 return true
19526 }
19527 break
19528 }
19529
19530
19531 for {
19532 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19533 if v_0.Op != OpNeg32 {
19534 continue
19535 }
19536 x := v_0.Args[0]
19537 if v_1.Op != OpNeg32 {
19538 continue
19539 }
19540 y := v_1.Args[0]
19541 v.reset(OpMul32)
19542 v.AddArg2(x, y)
19543 return true
19544 }
19545 break
19546 }
19547
19548
19549
19550 for {
19551 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19552 if v_0.Op != OpConst32 {
19553 continue
19554 }
19555 t := v_0.Type
19556 c := auxIntToInt32(v_0.AuxInt)
19557 if v_1.Op != OpAdd32 || v_1.Type != t {
19558 continue
19559 }
19560 _ = v_1.Args[1]
19561 v_1_0 := v_1.Args[0]
19562 v_1_1 := v_1.Args[1]
19563 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19564 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
19565 continue
19566 }
19567 d := auxIntToInt32(v_1_0.AuxInt)
19568 x := v_1_1
19569 if !(!isPowerOfTwo(c)) {
19570 continue
19571 }
19572 v.reset(OpAdd32)
19573 v0 := b.NewValue0(v.Pos, OpConst32, t)
19574 v0.AuxInt = int32ToAuxInt(c * d)
19575 v1 := b.NewValue0(v.Pos, OpMul32, t)
19576 v2 := b.NewValue0(v.Pos, OpConst32, t)
19577 v2.AuxInt = int32ToAuxInt(c)
19578 v1.AddArg2(v2, x)
19579 v.AddArg2(v0, v1)
19580 return true
19581 }
19582 }
19583 break
19584 }
19585
19586
19587 for {
19588 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19589 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
19590 continue
19591 }
19592 v.reset(OpConst32)
19593 v.AuxInt = int32ToAuxInt(0)
19594 return true
19595 }
19596 break
19597 }
19598
19599
19600
19601 for {
19602 t := v.Type
19603 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19604 x := v_0
19605 if v_1.Op != OpConst32 {
19606 continue
19607 }
19608 c := auxIntToInt32(v_1.AuxInt)
19609 if !(isPowerOfTwo(uint32(c)) && v.Block.Func.pass.name != "opt") {
19610 continue
19611 }
19612 v.reset(OpLsh32x64)
19613 v.Type = t
19614 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
19615 v0.AuxInt = int64ToAuxInt(log32u(uint32(c)))
19616 v.AddArg2(x, v0)
19617 return true
19618 }
19619 break
19620 }
19621
19622
19623
19624 for {
19625 t := v.Type
19626 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19627 x := v_0
19628 if v_1.Op != OpConst32 {
19629 continue
19630 }
19631 c := auxIntToInt32(v_1.AuxInt)
19632 if !(isPowerOfTwo(uint32(-c)) && v.Block.Func.pass.name != "opt") {
19633 continue
19634 }
19635 v.reset(OpNeg32)
19636 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
19637 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
19638 v1.AuxInt = int64ToAuxInt(log32u(uint32(-c)))
19639 v0.AddArg2(x, v1)
19640 v.AddArg(v0)
19641 return true
19642 }
19643 break
19644 }
19645
19646
19647
19648 for {
19649 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19650 if v_0.Op != OpMul32 {
19651 continue
19652 }
19653 _ = v_0.Args[1]
19654 v_0_0 := v_0.Args[0]
19655 v_0_1 := v_0.Args[1]
19656 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19657 i := v_0_0
19658 if i.Op != OpConst32 {
19659 continue
19660 }
19661 t := i.Type
19662 z := v_0_1
19663 x := v_1
19664 if !(z.Op != OpConst32 && x.Op != OpConst32) {
19665 continue
19666 }
19667 v.reset(OpMul32)
19668 v0 := b.NewValue0(v.Pos, OpMul32, t)
19669 v0.AddArg2(x, z)
19670 v.AddArg2(i, v0)
19671 return true
19672 }
19673 }
19674 break
19675 }
19676
19677
19678 for {
19679 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19680 if v_0.Op != OpConst32 {
19681 continue
19682 }
19683 t := v_0.Type
19684 c := auxIntToInt32(v_0.AuxInt)
19685 if v_1.Op != OpMul32 {
19686 continue
19687 }
19688 _ = v_1.Args[1]
19689 v_1_0 := v_1.Args[0]
19690 v_1_1 := v_1.Args[1]
19691 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19692 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
19693 continue
19694 }
19695 d := auxIntToInt32(v_1_0.AuxInt)
19696 x := v_1_1
19697 v.reset(OpMul32)
19698 v0 := b.NewValue0(v.Pos, OpConst32, t)
19699 v0.AuxInt = int32ToAuxInt(c * d)
19700 v.AddArg2(v0, x)
19701 return true
19702 }
19703 }
19704 break
19705 }
19706 return false
19707 }
19708 func rewriteValuegeneric_OpMul32F(v *Value) bool {
19709 v_1 := v.Args[1]
19710 v_0 := v.Args[0]
19711
19712
19713
19714 for {
19715 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19716 if v_0.Op != OpConst32F {
19717 continue
19718 }
19719 c := auxIntToFloat32(v_0.AuxInt)
19720 if v_1.Op != OpConst32F {
19721 continue
19722 }
19723 d := auxIntToFloat32(v_1.AuxInt)
19724 if !(c*d == c*d) {
19725 continue
19726 }
19727 v.reset(OpConst32F)
19728 v.AuxInt = float32ToAuxInt(c * d)
19729 return true
19730 }
19731 break
19732 }
19733
19734
19735 for {
19736 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19737 x := v_0
19738 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != 1 {
19739 continue
19740 }
19741 v.copyOf(x)
19742 return true
19743 }
19744 break
19745 }
19746
19747
19748 for {
19749 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19750 x := v_0
19751 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != -1 {
19752 continue
19753 }
19754 v.reset(OpNeg32F)
19755 v.AddArg(x)
19756 return true
19757 }
19758 break
19759 }
19760
19761
19762 for {
19763 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19764 x := v_0
19765 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != 2 {
19766 continue
19767 }
19768 v.reset(OpAdd32F)
19769 v.AddArg2(x, x)
19770 return true
19771 }
19772 break
19773 }
19774 return false
19775 }
19776 func rewriteValuegeneric_OpMul32uhilo(v *Value) bool {
19777 v_1 := v.Args[1]
19778 v_0 := v.Args[0]
19779 b := v.Block
19780 typ := &b.Func.Config.Types
19781
19782
19783 for {
19784 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19785 if v_0.Op != OpConst32 {
19786 continue
19787 }
19788 c := auxIntToInt32(v_0.AuxInt)
19789 if v_1.Op != OpConst32 {
19790 continue
19791 }
19792 d := auxIntToInt32(v_1.AuxInt)
19793 v.reset(OpMakeTuple)
19794 v0 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
19795 v0.AuxInt = int32ToAuxInt(bitsMulU32(c, d).hi)
19796 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
19797 v1.AuxInt = int32ToAuxInt(bitsMulU32(c, d).lo)
19798 v.AddArg2(v0, v1)
19799 return true
19800 }
19801 break
19802 }
19803 return false
19804 }
19805 func rewriteValuegeneric_OpMul32uover(v *Value) bool {
19806 v_1 := v.Args[1]
19807 v_0 := v.Args[0]
19808 b := v.Block
19809 typ := &b.Func.Config.Types
19810
19811
19812 for {
19813 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19814 if v_0.Op != OpConst32 {
19815 continue
19816 }
19817 c := auxIntToInt32(v_0.AuxInt)
19818 if v_1.Op != OpConst32 {
19819 continue
19820 }
19821 d := auxIntToInt32(v_1.AuxInt)
19822 v.reset(OpMakeTuple)
19823 v0 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
19824 v0.AuxInt = int32ToAuxInt(bitsMulU32(c, d).lo)
19825 v1 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
19826 v1.AuxInt = boolToAuxInt(bitsMulU32(c, d).hi != 0)
19827 v.AddArg2(v0, v1)
19828 return true
19829 }
19830 break
19831 }
19832
19833
19834 for {
19835 t := v.Type
19836 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19837 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 {
19838 continue
19839 }
19840 x := v_1
19841 v.reset(OpMakeTuple)
19842 v0 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
19843 v0.AuxInt = boolToAuxInt(false)
19844 v.AddArg2(x, v0)
19845 return true
19846 }
19847 break
19848 }
19849
19850
19851 for {
19852 t := v.Type
19853 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19854 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
19855 continue
19856 }
19857 v.reset(OpMakeTuple)
19858 v0 := b.NewValue0(v.Pos, OpConst32, t.FieldType(0))
19859 v0.AuxInt = int32ToAuxInt(0)
19860 v1 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
19861 v1.AuxInt = boolToAuxInt(false)
19862 v.AddArg2(v0, v1)
19863 return true
19864 }
19865 break
19866 }
19867 return false
19868 }
19869 func rewriteValuegeneric_OpMul64(v *Value) bool {
19870 v_1 := v.Args[1]
19871 v_0 := v.Args[0]
19872 b := v.Block
19873 typ := &b.Func.Config.Types
19874
19875
19876 for {
19877 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19878 if v_0.Op != OpConst64 {
19879 continue
19880 }
19881 c := auxIntToInt64(v_0.AuxInt)
19882 if v_1.Op != OpConst64 {
19883 continue
19884 }
19885 d := auxIntToInt64(v_1.AuxInt)
19886 v.reset(OpConst64)
19887 v.AuxInt = int64ToAuxInt(c * d)
19888 return true
19889 }
19890 break
19891 }
19892
19893
19894 for {
19895 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19896 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 {
19897 continue
19898 }
19899 x := v_1
19900 v.copyOf(x)
19901 return true
19902 }
19903 break
19904 }
19905
19906
19907 for {
19908 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19909 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
19910 continue
19911 }
19912 x := v_1
19913 v.reset(OpNeg64)
19914 v.AddArg(x)
19915 return true
19916 }
19917 break
19918 }
19919
19920
19921 for {
19922 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19923 if v_0.Op != OpConst64 {
19924 continue
19925 }
19926 t := v_0.Type
19927 c := auxIntToInt64(v_0.AuxInt)
19928 if v_1.Op != OpNeg64 {
19929 continue
19930 }
19931 x := v_1.Args[0]
19932 v.reset(OpMul64)
19933 v0 := b.NewValue0(v.Pos, OpConst64, t)
19934 v0.AuxInt = int64ToAuxInt(-c)
19935 v.AddArg2(x, v0)
19936 return true
19937 }
19938 break
19939 }
19940
19941
19942 for {
19943 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19944 if v_0.Op != OpNeg64 {
19945 continue
19946 }
19947 x := v_0.Args[0]
19948 if v_1.Op != OpNeg64 {
19949 continue
19950 }
19951 y := v_1.Args[0]
19952 v.reset(OpMul64)
19953 v.AddArg2(x, y)
19954 return true
19955 }
19956 break
19957 }
19958
19959
19960
19961 for {
19962 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19963 if v_0.Op != OpConst64 {
19964 continue
19965 }
19966 t := v_0.Type
19967 c := auxIntToInt64(v_0.AuxInt)
19968 if v_1.Op != OpAdd64 || v_1.Type != t {
19969 continue
19970 }
19971 _ = v_1.Args[1]
19972 v_1_0 := v_1.Args[0]
19973 v_1_1 := v_1.Args[1]
19974 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19975 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
19976 continue
19977 }
19978 d := auxIntToInt64(v_1_0.AuxInt)
19979 x := v_1_1
19980 if !(!isPowerOfTwo(c)) {
19981 continue
19982 }
19983 v.reset(OpAdd64)
19984 v0 := b.NewValue0(v.Pos, OpConst64, t)
19985 v0.AuxInt = int64ToAuxInt(c * d)
19986 v1 := b.NewValue0(v.Pos, OpMul64, t)
19987 v2 := b.NewValue0(v.Pos, OpConst64, t)
19988 v2.AuxInt = int64ToAuxInt(c)
19989 v1.AddArg2(v2, x)
19990 v.AddArg2(v0, v1)
19991 return true
19992 }
19993 }
19994 break
19995 }
19996
19997
19998 for {
19999 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20000 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
20001 continue
20002 }
20003 v.reset(OpConst64)
20004 v.AuxInt = int64ToAuxInt(0)
20005 return true
20006 }
20007 break
20008 }
20009
20010
20011
20012 for {
20013 t := v.Type
20014 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20015 x := v_0
20016 if v_1.Op != OpConst64 {
20017 continue
20018 }
20019 c := auxIntToInt64(v_1.AuxInt)
20020 if !(isPowerOfTwo(uint64(c)) && v.Block.Func.pass.name != "opt") {
20021 continue
20022 }
20023 v.reset(OpLsh64x64)
20024 v.Type = t
20025 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
20026 v0.AuxInt = int64ToAuxInt(log64u(uint64(c)))
20027 v.AddArg2(x, v0)
20028 return true
20029 }
20030 break
20031 }
20032
20033
20034
20035 for {
20036 t := v.Type
20037 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20038 x := v_0
20039 if v_1.Op != OpConst64 {
20040 continue
20041 }
20042 c := auxIntToInt64(v_1.AuxInt)
20043 if !(isPowerOfTwo(uint64(-c)) && v.Block.Func.pass.name != "opt") {
20044 continue
20045 }
20046 v.reset(OpNeg64)
20047 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
20048 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
20049 v1.AuxInt = int64ToAuxInt(log64u(uint64(-c)))
20050 v0.AddArg2(x, v1)
20051 v.AddArg(v0)
20052 return true
20053 }
20054 break
20055 }
20056
20057
20058
20059 for {
20060 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20061 if v_0.Op != OpMul64 {
20062 continue
20063 }
20064 _ = v_0.Args[1]
20065 v_0_0 := v_0.Args[0]
20066 v_0_1 := v_0.Args[1]
20067 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
20068 i := v_0_0
20069 if i.Op != OpConst64 {
20070 continue
20071 }
20072 t := i.Type
20073 z := v_0_1
20074 x := v_1
20075 if !(z.Op != OpConst64 && x.Op != OpConst64) {
20076 continue
20077 }
20078 v.reset(OpMul64)
20079 v0 := b.NewValue0(v.Pos, OpMul64, t)
20080 v0.AddArg2(x, z)
20081 v.AddArg2(i, v0)
20082 return true
20083 }
20084 }
20085 break
20086 }
20087
20088
20089 for {
20090 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20091 if v_0.Op != OpConst64 {
20092 continue
20093 }
20094 t := v_0.Type
20095 c := auxIntToInt64(v_0.AuxInt)
20096 if v_1.Op != OpMul64 {
20097 continue
20098 }
20099 _ = v_1.Args[1]
20100 v_1_0 := v_1.Args[0]
20101 v_1_1 := v_1.Args[1]
20102 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
20103 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
20104 continue
20105 }
20106 d := auxIntToInt64(v_1_0.AuxInt)
20107 x := v_1_1
20108 v.reset(OpMul64)
20109 v0 := b.NewValue0(v.Pos, OpConst64, t)
20110 v0.AuxInt = int64ToAuxInt(c * d)
20111 v.AddArg2(v0, x)
20112 return true
20113 }
20114 }
20115 break
20116 }
20117 return false
20118 }
20119 func rewriteValuegeneric_OpMul64F(v *Value) bool {
20120 v_1 := v.Args[1]
20121 v_0 := v.Args[0]
20122
20123
20124
20125 for {
20126 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20127 if v_0.Op != OpConst64F {
20128 continue
20129 }
20130 c := auxIntToFloat64(v_0.AuxInt)
20131 if v_1.Op != OpConst64F {
20132 continue
20133 }
20134 d := auxIntToFloat64(v_1.AuxInt)
20135 if !(c*d == c*d) {
20136 continue
20137 }
20138 v.reset(OpConst64F)
20139 v.AuxInt = float64ToAuxInt(c * d)
20140 return true
20141 }
20142 break
20143 }
20144
20145
20146 for {
20147 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20148 x := v_0
20149 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != 1 {
20150 continue
20151 }
20152 v.copyOf(x)
20153 return true
20154 }
20155 break
20156 }
20157
20158
20159 for {
20160 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20161 x := v_0
20162 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != -1 {
20163 continue
20164 }
20165 v.reset(OpNeg64F)
20166 v.AddArg(x)
20167 return true
20168 }
20169 break
20170 }
20171
20172
20173 for {
20174 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20175 x := v_0
20176 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != 2 {
20177 continue
20178 }
20179 v.reset(OpAdd64F)
20180 v.AddArg2(x, x)
20181 return true
20182 }
20183 break
20184 }
20185 return false
20186 }
20187 func rewriteValuegeneric_OpMul64uhilo(v *Value) bool {
20188 v_1 := v.Args[1]
20189 v_0 := v.Args[0]
20190 b := v.Block
20191 typ := &b.Func.Config.Types
20192
20193
20194 for {
20195 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20196 if v_0.Op != OpConst64 {
20197 continue
20198 }
20199 c := auxIntToInt64(v_0.AuxInt)
20200 if v_1.Op != OpConst64 {
20201 continue
20202 }
20203 d := auxIntToInt64(v_1.AuxInt)
20204 v.reset(OpMakeTuple)
20205 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
20206 v0.AuxInt = int64ToAuxInt(bitsMulU64(c, d).hi)
20207 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
20208 v1.AuxInt = int64ToAuxInt(bitsMulU64(c, d).lo)
20209 v.AddArg2(v0, v1)
20210 return true
20211 }
20212 break
20213 }
20214 return false
20215 }
20216 func rewriteValuegeneric_OpMul64uover(v *Value) bool {
20217 v_1 := v.Args[1]
20218 v_0 := v.Args[0]
20219 b := v.Block
20220 typ := &b.Func.Config.Types
20221
20222
20223 for {
20224 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20225 if v_0.Op != OpConst64 {
20226 continue
20227 }
20228 c := auxIntToInt64(v_0.AuxInt)
20229 if v_1.Op != OpConst64 {
20230 continue
20231 }
20232 d := auxIntToInt64(v_1.AuxInt)
20233 v.reset(OpMakeTuple)
20234 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
20235 v0.AuxInt = int64ToAuxInt(bitsMulU64(c, d).lo)
20236 v1 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
20237 v1.AuxInt = boolToAuxInt(bitsMulU64(c, d).hi != 0)
20238 v.AddArg2(v0, v1)
20239 return true
20240 }
20241 break
20242 }
20243
20244
20245 for {
20246 t := v.Type
20247 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20248 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 {
20249 continue
20250 }
20251 x := v_1
20252 v.reset(OpMakeTuple)
20253 v0 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
20254 v0.AuxInt = boolToAuxInt(false)
20255 v.AddArg2(x, v0)
20256 return true
20257 }
20258 break
20259 }
20260
20261
20262 for {
20263 t := v.Type
20264 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20265 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
20266 continue
20267 }
20268 v.reset(OpMakeTuple)
20269 v0 := b.NewValue0(v.Pos, OpConst64, t.FieldType(0))
20270 v0.AuxInt = int64ToAuxInt(0)
20271 v1 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
20272 v1.AuxInt = boolToAuxInt(false)
20273 v.AddArg2(v0, v1)
20274 return true
20275 }
20276 break
20277 }
20278 return false
20279 }
20280 func rewriteValuegeneric_OpMul8(v *Value) bool {
20281 v_1 := v.Args[1]
20282 v_0 := v.Args[0]
20283 b := v.Block
20284 typ := &b.Func.Config.Types
20285
20286
20287 for {
20288 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20289 if v_0.Op != OpConst8 {
20290 continue
20291 }
20292 c := auxIntToInt8(v_0.AuxInt)
20293 if v_1.Op != OpConst8 {
20294 continue
20295 }
20296 d := auxIntToInt8(v_1.AuxInt)
20297 v.reset(OpConst8)
20298 v.AuxInt = int8ToAuxInt(c * d)
20299 return true
20300 }
20301 break
20302 }
20303
20304
20305 for {
20306 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20307 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 1 {
20308 continue
20309 }
20310 x := v_1
20311 v.copyOf(x)
20312 return true
20313 }
20314 break
20315 }
20316
20317
20318 for {
20319 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20320 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
20321 continue
20322 }
20323 x := v_1
20324 v.reset(OpNeg8)
20325 v.AddArg(x)
20326 return true
20327 }
20328 break
20329 }
20330
20331
20332 for {
20333 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20334 if v_0.Op != OpConst8 {
20335 continue
20336 }
20337 t := v_0.Type
20338 c := auxIntToInt8(v_0.AuxInt)
20339 if v_1.Op != OpNeg8 {
20340 continue
20341 }
20342 x := v_1.Args[0]
20343 v.reset(OpMul8)
20344 v0 := b.NewValue0(v.Pos, OpConst8, t)
20345 v0.AuxInt = int8ToAuxInt(-c)
20346 v.AddArg2(x, v0)
20347 return true
20348 }
20349 break
20350 }
20351
20352
20353 for {
20354 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20355 if v_0.Op != OpNeg8 {
20356 continue
20357 }
20358 x := v_0.Args[0]
20359 if v_1.Op != OpNeg8 {
20360 continue
20361 }
20362 y := v_1.Args[0]
20363 v.reset(OpMul8)
20364 v.AddArg2(x, y)
20365 return true
20366 }
20367 break
20368 }
20369
20370
20371
20372 for {
20373 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20374 if v_0.Op != OpConst8 {
20375 continue
20376 }
20377 t := v_0.Type
20378 c := auxIntToInt8(v_0.AuxInt)
20379 if v_1.Op != OpAdd8 || v_1.Type != t {
20380 continue
20381 }
20382 _ = v_1.Args[1]
20383 v_1_0 := v_1.Args[0]
20384 v_1_1 := v_1.Args[1]
20385 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
20386 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
20387 continue
20388 }
20389 d := auxIntToInt8(v_1_0.AuxInt)
20390 x := v_1_1
20391 if !(!isPowerOfTwo(c)) {
20392 continue
20393 }
20394 v.reset(OpAdd8)
20395 v0 := b.NewValue0(v.Pos, OpConst8, t)
20396 v0.AuxInt = int8ToAuxInt(c * d)
20397 v1 := b.NewValue0(v.Pos, OpMul8, t)
20398 v2 := b.NewValue0(v.Pos, OpConst8, t)
20399 v2.AuxInt = int8ToAuxInt(c)
20400 v1.AddArg2(v2, x)
20401 v.AddArg2(v0, v1)
20402 return true
20403 }
20404 }
20405 break
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 != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
20412 continue
20413 }
20414 v.reset(OpConst8)
20415 v.AuxInt = int8ToAuxInt(0)
20416 return true
20417 }
20418 break
20419 }
20420
20421
20422
20423 for {
20424 t := v.Type
20425 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20426 x := v_0
20427 if v_1.Op != OpConst8 {
20428 continue
20429 }
20430 c := auxIntToInt8(v_1.AuxInt)
20431 if !(isPowerOfTwo(uint8(c)) && v.Block.Func.pass.name != "opt") {
20432 continue
20433 }
20434 v.reset(OpLsh8x64)
20435 v.Type = t
20436 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
20437 v0.AuxInt = int64ToAuxInt(log8u(uint8(c)))
20438 v.AddArg2(x, v0)
20439 return true
20440 }
20441 break
20442 }
20443
20444
20445
20446 for {
20447 t := v.Type
20448 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20449 x := v_0
20450 if v_1.Op != OpConst8 {
20451 continue
20452 }
20453 c := auxIntToInt8(v_1.AuxInt)
20454 if !(isPowerOfTwo(uint8(-c)) && v.Block.Func.pass.name != "opt") {
20455 continue
20456 }
20457 v.reset(OpNeg8)
20458 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
20459 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
20460 v1.AuxInt = int64ToAuxInt(log8u(uint8(-c)))
20461 v0.AddArg2(x, v1)
20462 v.AddArg(v0)
20463 return true
20464 }
20465 break
20466 }
20467
20468
20469
20470 for {
20471 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20472 if v_0.Op != OpMul8 {
20473 continue
20474 }
20475 _ = v_0.Args[1]
20476 v_0_0 := v_0.Args[0]
20477 v_0_1 := v_0.Args[1]
20478 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
20479 i := v_0_0
20480 if i.Op != OpConst8 {
20481 continue
20482 }
20483 t := i.Type
20484 z := v_0_1
20485 x := v_1
20486 if !(z.Op != OpConst8 && x.Op != OpConst8) {
20487 continue
20488 }
20489 v.reset(OpMul8)
20490 v0 := b.NewValue0(v.Pos, OpMul8, t)
20491 v0.AddArg2(x, z)
20492 v.AddArg2(i, v0)
20493 return true
20494 }
20495 }
20496 break
20497 }
20498
20499
20500 for {
20501 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20502 if v_0.Op != OpConst8 {
20503 continue
20504 }
20505 t := v_0.Type
20506 c := auxIntToInt8(v_0.AuxInt)
20507 if v_1.Op != OpMul8 {
20508 continue
20509 }
20510 _ = v_1.Args[1]
20511 v_1_0 := v_1.Args[0]
20512 v_1_1 := v_1.Args[1]
20513 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
20514 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
20515 continue
20516 }
20517 d := auxIntToInt8(v_1_0.AuxInt)
20518 x := v_1_1
20519 v.reset(OpMul8)
20520 v0 := b.NewValue0(v.Pos, OpConst8, t)
20521 v0.AuxInt = int8ToAuxInt(c * d)
20522 v.AddArg2(v0, x)
20523 return true
20524 }
20525 }
20526 break
20527 }
20528 return false
20529 }
20530 func rewriteValuegeneric_OpNeg16(v *Value) bool {
20531 v_0 := v.Args[0]
20532 b := v.Block
20533
20534
20535 for {
20536 if v_0.Op != OpConst16 {
20537 break
20538 }
20539 c := auxIntToInt16(v_0.AuxInt)
20540 v.reset(OpConst16)
20541 v.AuxInt = int16ToAuxInt(-c)
20542 return true
20543 }
20544
20545
20546 for {
20547 if v_0.Op != OpMul16 {
20548 break
20549 }
20550 _ = v_0.Args[1]
20551 v_0_0 := v_0.Args[0]
20552 v_0_1 := v_0.Args[1]
20553 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
20554 x := v_0_0
20555 if v_0_1.Op != OpConst16 {
20556 continue
20557 }
20558 t := v_0_1.Type
20559 c := auxIntToInt16(v_0_1.AuxInt)
20560 v.reset(OpMul16)
20561 v0 := b.NewValue0(v.Pos, OpConst16, t)
20562 v0.AuxInt = int16ToAuxInt(-c)
20563 v.AddArg2(x, v0)
20564 return true
20565 }
20566 break
20567 }
20568
20569
20570 for {
20571 if v_0.Op != OpMul16 {
20572 break
20573 }
20574 _ = v_0.Args[1]
20575 v_0_0 := v_0.Args[0]
20576 v_0_1 := v_0.Args[1]
20577 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
20578 x := v_0_0
20579 if v_0_1.Op != OpNeg16 {
20580 continue
20581 }
20582 y := v_0_1.Args[0]
20583 v.reset(OpMul16)
20584 v.AddArg2(x, y)
20585 return true
20586 }
20587 break
20588 }
20589
20590
20591 for {
20592 if v_0.Op != OpSub16 {
20593 break
20594 }
20595 y := v_0.Args[1]
20596 x := v_0.Args[0]
20597 v.reset(OpSub16)
20598 v.AddArg2(y, x)
20599 return true
20600 }
20601
20602
20603 for {
20604 if v_0.Op != OpNeg16 {
20605 break
20606 }
20607 x := v_0.Args[0]
20608 v.copyOf(x)
20609 return true
20610 }
20611
20612
20613 for {
20614 t := v.Type
20615 if v_0.Op != OpCom16 {
20616 break
20617 }
20618 x := v_0.Args[0]
20619 v.reset(OpAdd16)
20620 v0 := b.NewValue0(v.Pos, OpConst16, t)
20621 v0.AuxInt = int16ToAuxInt(1)
20622 v.AddArg2(v0, x)
20623 return true
20624 }
20625 return false
20626 }
20627 func rewriteValuegeneric_OpNeg32(v *Value) bool {
20628 v_0 := v.Args[0]
20629 b := v.Block
20630
20631
20632 for {
20633 if v_0.Op != OpConst32 {
20634 break
20635 }
20636 c := auxIntToInt32(v_0.AuxInt)
20637 v.reset(OpConst32)
20638 v.AuxInt = int32ToAuxInt(-c)
20639 return true
20640 }
20641
20642
20643 for {
20644 if v_0.Op != OpMul32 {
20645 break
20646 }
20647 _ = v_0.Args[1]
20648 v_0_0 := v_0.Args[0]
20649 v_0_1 := v_0.Args[1]
20650 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
20651 x := v_0_0
20652 if v_0_1.Op != OpConst32 {
20653 continue
20654 }
20655 t := v_0_1.Type
20656 c := auxIntToInt32(v_0_1.AuxInt)
20657 v.reset(OpMul32)
20658 v0 := b.NewValue0(v.Pos, OpConst32, t)
20659 v0.AuxInt = int32ToAuxInt(-c)
20660 v.AddArg2(x, v0)
20661 return true
20662 }
20663 break
20664 }
20665
20666
20667 for {
20668 if v_0.Op != OpMul32 {
20669 break
20670 }
20671 _ = v_0.Args[1]
20672 v_0_0 := v_0.Args[0]
20673 v_0_1 := v_0.Args[1]
20674 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
20675 x := v_0_0
20676 if v_0_1.Op != OpNeg32 {
20677 continue
20678 }
20679 y := v_0_1.Args[0]
20680 v.reset(OpMul32)
20681 v.AddArg2(x, y)
20682 return true
20683 }
20684 break
20685 }
20686
20687
20688 for {
20689 if v_0.Op != OpSub32 {
20690 break
20691 }
20692 y := v_0.Args[1]
20693 x := v_0.Args[0]
20694 v.reset(OpSub32)
20695 v.AddArg2(y, x)
20696 return true
20697 }
20698
20699
20700 for {
20701 if v_0.Op != OpNeg32 {
20702 break
20703 }
20704 x := v_0.Args[0]
20705 v.copyOf(x)
20706 return true
20707 }
20708
20709
20710 for {
20711 t := v.Type
20712 if v_0.Op != OpCom32 {
20713 break
20714 }
20715 x := v_0.Args[0]
20716 v.reset(OpAdd32)
20717 v0 := b.NewValue0(v.Pos, OpConst32, t)
20718 v0.AuxInt = int32ToAuxInt(1)
20719 v.AddArg2(v0, x)
20720 return true
20721 }
20722 return false
20723 }
20724 func rewriteValuegeneric_OpNeg32F(v *Value) bool {
20725 v_0 := v.Args[0]
20726
20727
20728
20729 for {
20730 if v_0.Op != OpConst32F {
20731 break
20732 }
20733 c := auxIntToFloat32(v_0.AuxInt)
20734 if !(c != 0) {
20735 break
20736 }
20737 v.reset(OpConst32F)
20738 v.AuxInt = float32ToAuxInt(-c)
20739 return true
20740 }
20741 return false
20742 }
20743 func rewriteValuegeneric_OpNeg64(v *Value) bool {
20744 v_0 := v.Args[0]
20745 b := v.Block
20746
20747
20748 for {
20749 if v_0.Op != OpConst64 {
20750 break
20751 }
20752 c := auxIntToInt64(v_0.AuxInt)
20753 v.reset(OpConst64)
20754 v.AuxInt = int64ToAuxInt(-c)
20755 return true
20756 }
20757
20758
20759 for {
20760 if v_0.Op != OpMul64 {
20761 break
20762 }
20763 _ = v_0.Args[1]
20764 v_0_0 := v_0.Args[0]
20765 v_0_1 := v_0.Args[1]
20766 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
20767 x := v_0_0
20768 if v_0_1.Op != OpConst64 {
20769 continue
20770 }
20771 t := v_0_1.Type
20772 c := auxIntToInt64(v_0_1.AuxInt)
20773 v.reset(OpMul64)
20774 v0 := b.NewValue0(v.Pos, OpConst64, t)
20775 v0.AuxInt = int64ToAuxInt(-c)
20776 v.AddArg2(x, v0)
20777 return true
20778 }
20779 break
20780 }
20781
20782
20783 for {
20784 if v_0.Op != OpMul64 {
20785 break
20786 }
20787 _ = v_0.Args[1]
20788 v_0_0 := v_0.Args[0]
20789 v_0_1 := v_0.Args[1]
20790 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
20791 x := v_0_0
20792 if v_0_1.Op != OpNeg64 {
20793 continue
20794 }
20795 y := v_0_1.Args[0]
20796 v.reset(OpMul64)
20797 v.AddArg2(x, y)
20798 return true
20799 }
20800 break
20801 }
20802
20803
20804 for {
20805 if v_0.Op != OpSub64 {
20806 break
20807 }
20808 y := v_0.Args[1]
20809 x := v_0.Args[0]
20810 v.reset(OpSub64)
20811 v.AddArg2(y, x)
20812 return true
20813 }
20814
20815
20816 for {
20817 if v_0.Op != OpNeg64 {
20818 break
20819 }
20820 x := v_0.Args[0]
20821 v.copyOf(x)
20822 return true
20823 }
20824
20825
20826 for {
20827 t := v.Type
20828 if v_0.Op != OpCom64 {
20829 break
20830 }
20831 x := v_0.Args[0]
20832 v.reset(OpAdd64)
20833 v0 := b.NewValue0(v.Pos, OpConst64, t)
20834 v0.AuxInt = int64ToAuxInt(1)
20835 v.AddArg2(v0, x)
20836 return true
20837 }
20838 return false
20839 }
20840 func rewriteValuegeneric_OpNeg64F(v *Value) bool {
20841 v_0 := v.Args[0]
20842
20843
20844
20845 for {
20846 if v_0.Op != OpConst64F {
20847 break
20848 }
20849 c := auxIntToFloat64(v_0.AuxInt)
20850 if !(c != 0) {
20851 break
20852 }
20853 v.reset(OpConst64F)
20854 v.AuxInt = float64ToAuxInt(-c)
20855 return true
20856 }
20857 return false
20858 }
20859 func rewriteValuegeneric_OpNeg8(v *Value) bool {
20860 v_0 := v.Args[0]
20861 b := v.Block
20862
20863
20864 for {
20865 if v_0.Op != OpConst8 {
20866 break
20867 }
20868 c := auxIntToInt8(v_0.AuxInt)
20869 v.reset(OpConst8)
20870 v.AuxInt = int8ToAuxInt(-c)
20871 return true
20872 }
20873
20874
20875 for {
20876 if v_0.Op != OpMul8 {
20877 break
20878 }
20879 _ = v_0.Args[1]
20880 v_0_0 := v_0.Args[0]
20881 v_0_1 := v_0.Args[1]
20882 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
20883 x := v_0_0
20884 if v_0_1.Op != OpConst8 {
20885 continue
20886 }
20887 t := v_0_1.Type
20888 c := auxIntToInt8(v_0_1.AuxInt)
20889 v.reset(OpMul8)
20890 v0 := b.NewValue0(v.Pos, OpConst8, t)
20891 v0.AuxInt = int8ToAuxInt(-c)
20892 v.AddArg2(x, v0)
20893 return true
20894 }
20895 break
20896 }
20897
20898
20899 for {
20900 if v_0.Op != OpMul8 {
20901 break
20902 }
20903 _ = v_0.Args[1]
20904 v_0_0 := v_0.Args[0]
20905 v_0_1 := v_0.Args[1]
20906 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
20907 x := v_0_0
20908 if v_0_1.Op != OpNeg8 {
20909 continue
20910 }
20911 y := v_0_1.Args[0]
20912 v.reset(OpMul8)
20913 v.AddArg2(x, y)
20914 return true
20915 }
20916 break
20917 }
20918
20919
20920 for {
20921 if v_0.Op != OpSub8 {
20922 break
20923 }
20924 y := v_0.Args[1]
20925 x := v_0.Args[0]
20926 v.reset(OpSub8)
20927 v.AddArg2(y, x)
20928 return true
20929 }
20930
20931
20932 for {
20933 if v_0.Op != OpNeg8 {
20934 break
20935 }
20936 x := v_0.Args[0]
20937 v.copyOf(x)
20938 return true
20939 }
20940
20941
20942 for {
20943 t := v.Type
20944 if v_0.Op != OpCom8 {
20945 break
20946 }
20947 x := v_0.Args[0]
20948 v.reset(OpAdd8)
20949 v0 := b.NewValue0(v.Pos, OpConst8, t)
20950 v0.AuxInt = int8ToAuxInt(1)
20951 v.AddArg2(v0, x)
20952 return true
20953 }
20954 return false
20955 }
20956 func rewriteValuegeneric_OpNeq16(v *Value) bool {
20957 v_1 := v.Args[1]
20958 v_0 := v.Args[0]
20959 b := v.Block
20960
20961
20962 for {
20963 x := v_0
20964 if x != v_1 {
20965 break
20966 }
20967 v.reset(OpConstBool)
20968 v.AuxInt = boolToAuxInt(false)
20969 return true
20970 }
20971
20972
20973
20974 for {
20975 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20976 if v_0.Op != OpConst16 {
20977 continue
20978 }
20979 t := v_0.Type
20980 c := auxIntToInt16(v_0.AuxInt)
20981 o := v_1
20982 if o.Op != OpAdd16 {
20983 continue
20984 }
20985 _ = o.Args[1]
20986 o_0 := o.Args[0]
20987 o_1 := o.Args[1]
20988 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
20989 if o_0.Op != OpConst16 {
20990 continue
20991 }
20992 d := auxIntToInt16(o_0.AuxInt)
20993 x := o_1
20994 if !(o.Uses == 1) {
20995 continue
20996 }
20997 v.reset(OpNeq16)
20998 v0 := b.NewValue0(v.Pos, OpConst16, t)
20999 v0.AuxInt = int16ToAuxInt(c - d)
21000 v.AddArg2(v0, x)
21001 return true
21002 }
21003 }
21004 break
21005 }
21006
21007
21008
21009 for {
21010 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21011 if v_0.Op != OpConst16 {
21012 continue
21013 }
21014 t := v_0.Type
21015 c := auxIntToInt16(v_0.AuxInt)
21016 o := v_1
21017 if o.Op != OpSub16 {
21018 continue
21019 }
21020 _ = o.Args[1]
21021 x := o.Args[0]
21022 o_1 := o.Args[1]
21023 if o_1.Op != OpConst16 {
21024 continue
21025 }
21026 d := auxIntToInt16(o_1.AuxInt)
21027 if !(o.Uses == 1) {
21028 continue
21029 }
21030 v.reset(OpNeq16)
21031 v0 := b.NewValue0(v.Pos, OpConst16, t)
21032 v0.AuxInt = int16ToAuxInt(c + d)
21033 v.AddArg2(v0, x)
21034 return true
21035 }
21036 break
21037 }
21038
21039
21040
21041 for {
21042 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21043 if v_0.Op != OpConst16 {
21044 continue
21045 }
21046 t := v_0.Type
21047 c := auxIntToInt16(v_0.AuxInt)
21048 o := v_1
21049 if o.Op != OpSub16 {
21050 continue
21051 }
21052 x := o.Args[1]
21053 o_0 := o.Args[0]
21054 if o_0.Op != OpConst16 {
21055 continue
21056 }
21057 d := auxIntToInt16(o_0.AuxInt)
21058 if !(o.Uses == 1) {
21059 continue
21060 }
21061 v.reset(OpNeq16)
21062 v0 := b.NewValue0(v.Pos, OpConst16, t)
21063 v0.AuxInt = int16ToAuxInt(d - c)
21064 v.AddArg2(v0, x)
21065 return true
21066 }
21067 break
21068 }
21069
21070
21071
21072 for {
21073 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21074 if v_0.Op != OpConst16 {
21075 continue
21076 }
21077 t := v_0.Type
21078 c := auxIntToInt16(v_0.AuxInt)
21079 o := v_1
21080 if o.Op != OpXor16 {
21081 continue
21082 }
21083 _ = o.Args[1]
21084 o_0 := o.Args[0]
21085 o_1 := o.Args[1]
21086 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
21087 if o_0.Op != OpConst16 {
21088 continue
21089 }
21090 d := auxIntToInt16(o_0.AuxInt)
21091 x := o_1
21092 if !(o.Uses == 1) {
21093 continue
21094 }
21095 v.reset(OpNeq16)
21096 v0 := b.NewValue0(v.Pos, OpConst16, t)
21097 v0.AuxInt = int16ToAuxInt(d ^ c)
21098 v.AddArg2(v0, x)
21099 return true
21100 }
21101 }
21102 break
21103 }
21104
21105
21106
21107 for {
21108 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21109 if v_0.Op != OpConst16 {
21110 continue
21111 }
21112 t := v_0.Type
21113 c := auxIntToInt16(v_0.AuxInt)
21114 o := v_1
21115 if o.Op != OpCom16 {
21116 continue
21117 }
21118 x := o.Args[0]
21119 if !(o.Uses == 1) {
21120 continue
21121 }
21122 v.reset(OpNeq16)
21123 v0 := b.NewValue0(v.Pos, OpConst16, t)
21124 v0.AuxInt = int16ToAuxInt(^c)
21125 v.AddArg2(v0, x)
21126 return true
21127 }
21128 break
21129 }
21130
21131
21132
21133 for {
21134 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21135 if v_0.Op != OpConst16 {
21136 continue
21137 }
21138 t := v_0.Type
21139 c := auxIntToInt16(v_0.AuxInt)
21140 o := v_1
21141 if o.Op != OpNeg16 {
21142 continue
21143 }
21144 x := o.Args[0]
21145 if !(o.Uses == 1) {
21146 continue
21147 }
21148 v.reset(OpNeq16)
21149 v0 := b.NewValue0(v.Pos, OpConst16, t)
21150 v0.AuxInt = int16ToAuxInt(-c)
21151 v.AddArg2(v0, x)
21152 return true
21153 }
21154 break
21155 }
21156
21157
21158
21159 for {
21160 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21161 if v_0.Op != OpConst16 {
21162 continue
21163 }
21164 t := v_0.Type
21165 c := auxIntToInt16(v_0.AuxInt)
21166 o := v_1
21167 if o.Op != OpMul16 {
21168 continue
21169 }
21170 _ = o.Args[1]
21171 o_0 := o.Args[0]
21172 o_1 := o.Args[1]
21173 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
21174 if o_0.Op != OpConst16 {
21175 continue
21176 }
21177 d := auxIntToInt16(o_0.AuxInt)
21178 x := o_1
21179 if !(uint16(d)%2 == 1 && o.Uses == 1) {
21180 continue
21181 }
21182 v.reset(OpNeq16)
21183 v0 := b.NewValue0(v.Pos, OpConst16, t)
21184 v0.AuxInt = int16ToAuxInt(int16(uint16(c) * uint16(modularMultiplicativeInverse(uint64(d)))))
21185 v.AddArg2(v0, x)
21186 return true
21187 }
21188 }
21189 break
21190 }
21191
21192
21193 for {
21194 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21195 if v_0.Op != OpConst16 {
21196 continue
21197 }
21198 c := auxIntToInt16(v_0.AuxInt)
21199 if v_1.Op != OpConst16 {
21200 continue
21201 }
21202 d := auxIntToInt16(v_1.AuxInt)
21203 v.reset(OpConstBool)
21204 v.AuxInt = boolToAuxInt(c != d)
21205 return true
21206 }
21207 break
21208 }
21209
21210
21211
21212 for {
21213 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21214 s := v_0
21215 if s.Op != OpSub16 {
21216 continue
21217 }
21218 y := s.Args[1]
21219 x := s.Args[0]
21220 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(s.Uses == 1) {
21221 continue
21222 }
21223 v.reset(OpNeq16)
21224 v.AddArg2(x, y)
21225 return true
21226 }
21227 break
21228 }
21229
21230
21231
21232 for {
21233 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21234 if v_0.Op != OpAnd16 {
21235 continue
21236 }
21237 t := v_0.Type
21238 _ = v_0.Args[1]
21239 v_0_0 := v_0.Args[0]
21240 v_0_1 := v_0.Args[1]
21241 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21242 x := v_0_0
21243 if v_0_1.Op != OpConst16 || v_0_1.Type != t {
21244 continue
21245 }
21246 y := auxIntToInt16(v_0_1.AuxInt)
21247 if v_1.Op != OpConst16 || v_1.Type != t || auxIntToInt16(v_1.AuxInt) != y || !(oneBit(y)) {
21248 continue
21249 }
21250 v.reset(OpEq16)
21251 v0 := b.NewValue0(v.Pos, OpAnd16, t)
21252 v1 := b.NewValue0(v.Pos, OpConst16, t)
21253 v1.AuxInt = int16ToAuxInt(y)
21254 v0.AddArg2(x, v1)
21255 v2 := b.NewValue0(v.Pos, OpConst16, t)
21256 v2.AuxInt = int16ToAuxInt(0)
21257 v.AddArg2(v0, v2)
21258 return true
21259 }
21260 }
21261 break
21262 }
21263
21264
21265 for {
21266 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21267 if v_0.Op != OpZeroExt8to16 {
21268 continue
21269 }
21270 v_0_0 := v_0.Args[0]
21271 if v_0_0.Op != OpCvtBoolToUint8 {
21272 continue
21273 }
21274 x := v_0_0.Args[0]
21275 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
21276 continue
21277 }
21278 v.copyOf(x)
21279 return true
21280 }
21281 break
21282 }
21283
21284
21285 for {
21286 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21287 if v_0.Op != OpZeroExt8to16 {
21288 continue
21289 }
21290 v_0_0 := v_0.Args[0]
21291 if v_0_0.Op != OpCvtBoolToUint8 {
21292 continue
21293 }
21294 x := v_0_0.Args[0]
21295 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
21296 continue
21297 }
21298 v.reset(OpNot)
21299 v.AddArg(x)
21300 return true
21301 }
21302 break
21303 }
21304 return false
21305 }
21306 func rewriteValuegeneric_OpNeq32(v *Value) bool {
21307 v_1 := v.Args[1]
21308 v_0 := v.Args[0]
21309 b := v.Block
21310
21311
21312 for {
21313 x := v_0
21314 if x != v_1 {
21315 break
21316 }
21317 v.reset(OpConstBool)
21318 v.AuxInt = boolToAuxInt(false)
21319 return true
21320 }
21321
21322
21323
21324 for {
21325 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21326 if v_0.Op != OpConst32 {
21327 continue
21328 }
21329 t := v_0.Type
21330 c := auxIntToInt32(v_0.AuxInt)
21331 o := v_1
21332 if o.Op != OpAdd32 {
21333 continue
21334 }
21335 _ = o.Args[1]
21336 o_0 := o.Args[0]
21337 o_1 := o.Args[1]
21338 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
21339 if o_0.Op != OpConst32 {
21340 continue
21341 }
21342 d := auxIntToInt32(o_0.AuxInt)
21343 x := o_1
21344 if !(o.Uses == 1) {
21345 continue
21346 }
21347 v.reset(OpNeq32)
21348 v0 := b.NewValue0(v.Pos, OpConst32, t)
21349 v0.AuxInt = int32ToAuxInt(c - d)
21350 v.AddArg2(v0, x)
21351 return true
21352 }
21353 }
21354 break
21355 }
21356
21357
21358
21359 for {
21360 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21361 if v_0.Op != OpConst32 {
21362 continue
21363 }
21364 t := v_0.Type
21365 c := auxIntToInt32(v_0.AuxInt)
21366 o := v_1
21367 if o.Op != OpSub32 {
21368 continue
21369 }
21370 _ = o.Args[1]
21371 x := o.Args[0]
21372 o_1 := o.Args[1]
21373 if o_1.Op != OpConst32 {
21374 continue
21375 }
21376 d := auxIntToInt32(o_1.AuxInt)
21377 if !(o.Uses == 1) {
21378 continue
21379 }
21380 v.reset(OpNeq32)
21381 v0 := b.NewValue0(v.Pos, OpConst32, t)
21382 v0.AuxInt = int32ToAuxInt(c + d)
21383 v.AddArg2(v0, x)
21384 return true
21385 }
21386 break
21387 }
21388
21389
21390
21391 for {
21392 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21393 if v_0.Op != OpConst32 {
21394 continue
21395 }
21396 t := v_0.Type
21397 c := auxIntToInt32(v_0.AuxInt)
21398 o := v_1
21399 if o.Op != OpSub32 {
21400 continue
21401 }
21402 x := o.Args[1]
21403 o_0 := o.Args[0]
21404 if o_0.Op != OpConst32 {
21405 continue
21406 }
21407 d := auxIntToInt32(o_0.AuxInt)
21408 if !(o.Uses == 1) {
21409 continue
21410 }
21411 v.reset(OpNeq32)
21412 v0 := b.NewValue0(v.Pos, OpConst32, t)
21413 v0.AuxInt = int32ToAuxInt(d - c)
21414 v.AddArg2(v0, x)
21415 return true
21416 }
21417 break
21418 }
21419
21420
21421
21422 for {
21423 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21424 if v_0.Op != OpConst32 {
21425 continue
21426 }
21427 t := v_0.Type
21428 c := auxIntToInt32(v_0.AuxInt)
21429 o := v_1
21430 if o.Op != OpXor32 {
21431 continue
21432 }
21433 _ = o.Args[1]
21434 o_0 := o.Args[0]
21435 o_1 := o.Args[1]
21436 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
21437 if o_0.Op != OpConst32 {
21438 continue
21439 }
21440 d := auxIntToInt32(o_0.AuxInt)
21441 x := o_1
21442 if !(o.Uses == 1) {
21443 continue
21444 }
21445 v.reset(OpNeq32)
21446 v0 := b.NewValue0(v.Pos, OpConst32, t)
21447 v0.AuxInt = int32ToAuxInt(d ^ c)
21448 v.AddArg2(v0, x)
21449 return true
21450 }
21451 }
21452 break
21453 }
21454
21455
21456
21457 for {
21458 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21459 if v_0.Op != OpConst32 {
21460 continue
21461 }
21462 t := v_0.Type
21463 c := auxIntToInt32(v_0.AuxInt)
21464 o := v_1
21465 if o.Op != OpCom32 {
21466 continue
21467 }
21468 x := o.Args[0]
21469 if !(o.Uses == 1) {
21470 continue
21471 }
21472 v.reset(OpNeq32)
21473 v0 := b.NewValue0(v.Pos, OpConst32, t)
21474 v0.AuxInt = int32ToAuxInt(^c)
21475 v.AddArg2(v0, x)
21476 return true
21477 }
21478 break
21479 }
21480
21481
21482
21483 for {
21484 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21485 if v_0.Op != OpConst32 {
21486 continue
21487 }
21488 t := v_0.Type
21489 c := auxIntToInt32(v_0.AuxInt)
21490 o := v_1
21491 if o.Op != OpNeg32 {
21492 continue
21493 }
21494 x := o.Args[0]
21495 if !(o.Uses == 1) {
21496 continue
21497 }
21498 v.reset(OpNeq32)
21499 v0 := b.NewValue0(v.Pos, OpConst32, t)
21500 v0.AuxInt = int32ToAuxInt(-c)
21501 v.AddArg2(v0, x)
21502 return true
21503 }
21504 break
21505 }
21506
21507
21508
21509 for {
21510 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21511 if v_0.Op != OpConst32 {
21512 continue
21513 }
21514 t := v_0.Type
21515 c := auxIntToInt32(v_0.AuxInt)
21516 o := v_1
21517 if o.Op != OpMul32 {
21518 continue
21519 }
21520 _ = o.Args[1]
21521 o_0 := o.Args[0]
21522 o_1 := o.Args[1]
21523 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
21524 if o_0.Op != OpConst32 {
21525 continue
21526 }
21527 d := auxIntToInt32(o_0.AuxInt)
21528 x := o_1
21529 if !(uint32(d)%2 == 1 && o.Uses == 1) {
21530 continue
21531 }
21532 v.reset(OpNeq32)
21533 v0 := b.NewValue0(v.Pos, OpConst32, t)
21534 v0.AuxInt = int32ToAuxInt(int32(uint32(c) * uint32(modularMultiplicativeInverse(uint64(d)))))
21535 v.AddArg2(v0, x)
21536 return true
21537 }
21538 }
21539 break
21540 }
21541
21542
21543 for {
21544 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21545 if v_0.Op != OpConst32 {
21546 continue
21547 }
21548 c := auxIntToInt32(v_0.AuxInt)
21549 if v_1.Op != OpConst32 {
21550 continue
21551 }
21552 d := auxIntToInt32(v_1.AuxInt)
21553 v.reset(OpConstBool)
21554 v.AuxInt = boolToAuxInt(c != d)
21555 return true
21556 }
21557 break
21558 }
21559
21560
21561
21562 for {
21563 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21564 s := v_0
21565 if s.Op != OpSub32 {
21566 continue
21567 }
21568 y := s.Args[1]
21569 x := s.Args[0]
21570 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 || !(s.Uses == 1) {
21571 continue
21572 }
21573 v.reset(OpNeq32)
21574 v.AddArg2(x, y)
21575 return true
21576 }
21577 break
21578 }
21579
21580
21581
21582 for {
21583 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21584 if v_0.Op != OpAnd32 {
21585 continue
21586 }
21587 t := v_0.Type
21588 _ = v_0.Args[1]
21589 v_0_0 := v_0.Args[0]
21590 v_0_1 := v_0.Args[1]
21591 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21592 x := v_0_0
21593 if v_0_1.Op != OpConst32 || v_0_1.Type != t {
21594 continue
21595 }
21596 y := auxIntToInt32(v_0_1.AuxInt)
21597 if v_1.Op != OpConst32 || v_1.Type != t || auxIntToInt32(v_1.AuxInt) != y || !(oneBit(y)) {
21598 continue
21599 }
21600 v.reset(OpEq32)
21601 v0 := b.NewValue0(v.Pos, OpAnd32, t)
21602 v1 := b.NewValue0(v.Pos, OpConst32, t)
21603 v1.AuxInt = int32ToAuxInt(y)
21604 v0.AddArg2(x, v1)
21605 v2 := b.NewValue0(v.Pos, OpConst32, t)
21606 v2.AuxInt = int32ToAuxInt(0)
21607 v.AddArg2(v0, v2)
21608 return true
21609 }
21610 }
21611 break
21612 }
21613
21614
21615 for {
21616 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21617 if v_0.Op != OpZeroExt8to32 {
21618 continue
21619 }
21620 v_0_0 := v_0.Args[0]
21621 if v_0_0.Op != OpCvtBoolToUint8 {
21622 continue
21623 }
21624 x := v_0_0.Args[0]
21625 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
21626 continue
21627 }
21628 v.copyOf(x)
21629 return true
21630 }
21631 break
21632 }
21633
21634
21635 for {
21636 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21637 if v_0.Op != OpZeroExt8to32 {
21638 continue
21639 }
21640 v_0_0 := v_0.Args[0]
21641 if v_0_0.Op != OpCvtBoolToUint8 {
21642 continue
21643 }
21644 x := v_0_0.Args[0]
21645 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
21646 continue
21647 }
21648 v.reset(OpNot)
21649 v.AddArg(x)
21650 return true
21651 }
21652 break
21653 }
21654 return false
21655 }
21656 func rewriteValuegeneric_OpNeq32F(v *Value) bool {
21657 v_1 := v.Args[1]
21658 v_0 := v.Args[0]
21659
21660
21661 for {
21662 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21663 if v_0.Op != OpConst32F {
21664 continue
21665 }
21666 c := auxIntToFloat32(v_0.AuxInt)
21667 if v_1.Op != OpConst32F {
21668 continue
21669 }
21670 d := auxIntToFloat32(v_1.AuxInt)
21671 v.reset(OpConstBool)
21672 v.AuxInt = boolToAuxInt(c != d)
21673 return true
21674 }
21675 break
21676 }
21677 return false
21678 }
21679 func rewriteValuegeneric_OpNeq64(v *Value) bool {
21680 v_1 := v.Args[1]
21681 v_0 := v.Args[0]
21682 b := v.Block
21683
21684
21685 for {
21686 x := v_0
21687 if x != v_1 {
21688 break
21689 }
21690 v.reset(OpConstBool)
21691 v.AuxInt = boolToAuxInt(false)
21692 return true
21693 }
21694
21695
21696
21697 for {
21698 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21699 if v_0.Op != OpConst64 {
21700 continue
21701 }
21702 t := v_0.Type
21703 c := auxIntToInt64(v_0.AuxInt)
21704 o := v_1
21705 if o.Op != OpAdd64 {
21706 continue
21707 }
21708 _ = o.Args[1]
21709 o_0 := o.Args[0]
21710 o_1 := o.Args[1]
21711 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
21712 if o_0.Op != OpConst64 {
21713 continue
21714 }
21715 d := auxIntToInt64(o_0.AuxInt)
21716 x := o_1
21717 if !(o.Uses == 1) {
21718 continue
21719 }
21720 v.reset(OpNeq64)
21721 v0 := b.NewValue0(v.Pos, OpConst64, t)
21722 v0.AuxInt = int64ToAuxInt(c - d)
21723 v.AddArg2(v0, x)
21724 return true
21725 }
21726 }
21727 break
21728 }
21729
21730
21731
21732 for {
21733 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21734 if v_0.Op != OpConst64 {
21735 continue
21736 }
21737 t := v_0.Type
21738 c := auxIntToInt64(v_0.AuxInt)
21739 o := v_1
21740 if o.Op != OpSub64 {
21741 continue
21742 }
21743 _ = o.Args[1]
21744 x := o.Args[0]
21745 o_1 := o.Args[1]
21746 if o_1.Op != OpConst64 {
21747 continue
21748 }
21749 d := auxIntToInt64(o_1.AuxInt)
21750 if !(o.Uses == 1) {
21751 continue
21752 }
21753 v.reset(OpNeq64)
21754 v0 := b.NewValue0(v.Pos, OpConst64, t)
21755 v0.AuxInt = int64ToAuxInt(c + d)
21756 v.AddArg2(v0, x)
21757 return true
21758 }
21759 break
21760 }
21761
21762
21763
21764 for {
21765 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21766 if v_0.Op != OpConst64 {
21767 continue
21768 }
21769 t := v_0.Type
21770 c := auxIntToInt64(v_0.AuxInt)
21771 o := v_1
21772 if o.Op != OpSub64 {
21773 continue
21774 }
21775 x := o.Args[1]
21776 o_0 := o.Args[0]
21777 if o_0.Op != OpConst64 {
21778 continue
21779 }
21780 d := auxIntToInt64(o_0.AuxInt)
21781 if !(o.Uses == 1) {
21782 continue
21783 }
21784 v.reset(OpNeq64)
21785 v0 := b.NewValue0(v.Pos, OpConst64, t)
21786 v0.AuxInt = int64ToAuxInt(d - c)
21787 v.AddArg2(v0, x)
21788 return true
21789 }
21790 break
21791 }
21792
21793
21794
21795 for {
21796 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21797 if v_0.Op != OpConst64 {
21798 continue
21799 }
21800 t := v_0.Type
21801 c := auxIntToInt64(v_0.AuxInt)
21802 o := v_1
21803 if o.Op != OpXor64 {
21804 continue
21805 }
21806 _ = o.Args[1]
21807 o_0 := o.Args[0]
21808 o_1 := o.Args[1]
21809 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
21810 if o_0.Op != OpConst64 {
21811 continue
21812 }
21813 d := auxIntToInt64(o_0.AuxInt)
21814 x := o_1
21815 if !(o.Uses == 1) {
21816 continue
21817 }
21818 v.reset(OpNeq64)
21819 v0 := b.NewValue0(v.Pos, OpConst64, t)
21820 v0.AuxInt = int64ToAuxInt(d ^ c)
21821 v.AddArg2(v0, x)
21822 return true
21823 }
21824 }
21825 break
21826 }
21827
21828
21829
21830 for {
21831 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21832 if v_0.Op != OpConst64 {
21833 continue
21834 }
21835 t := v_0.Type
21836 c := auxIntToInt64(v_0.AuxInt)
21837 o := v_1
21838 if o.Op != OpCom64 {
21839 continue
21840 }
21841 x := o.Args[0]
21842 if !(o.Uses == 1) {
21843 continue
21844 }
21845 v.reset(OpNeq64)
21846 v0 := b.NewValue0(v.Pos, OpConst64, t)
21847 v0.AuxInt = int64ToAuxInt(^c)
21848 v.AddArg2(v0, x)
21849 return true
21850 }
21851 break
21852 }
21853
21854
21855
21856 for {
21857 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21858 if v_0.Op != OpConst64 {
21859 continue
21860 }
21861 t := v_0.Type
21862 c := auxIntToInt64(v_0.AuxInt)
21863 o := v_1
21864 if o.Op != OpNeg64 {
21865 continue
21866 }
21867 x := o.Args[0]
21868 if !(o.Uses == 1) {
21869 continue
21870 }
21871 v.reset(OpNeq64)
21872 v0 := b.NewValue0(v.Pos, OpConst64, t)
21873 v0.AuxInt = int64ToAuxInt(-c)
21874 v.AddArg2(v0, x)
21875 return true
21876 }
21877 break
21878 }
21879
21880
21881
21882 for {
21883 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21884 if v_0.Op != OpConst64 {
21885 continue
21886 }
21887 t := v_0.Type
21888 c := auxIntToInt64(v_0.AuxInt)
21889 o := v_1
21890 if o.Op != OpMul64 {
21891 continue
21892 }
21893 _ = o.Args[1]
21894 o_0 := o.Args[0]
21895 o_1 := o.Args[1]
21896 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
21897 if o_0.Op != OpConst64 {
21898 continue
21899 }
21900 d := auxIntToInt64(o_0.AuxInt)
21901 x := o_1
21902 if !(uint64(d)%2 == 1 && o.Uses == 1) {
21903 continue
21904 }
21905 v.reset(OpNeq64)
21906 v0 := b.NewValue0(v.Pos, OpConst64, t)
21907 v0.AuxInt = int64ToAuxInt(int64(uint64(c) * modularMultiplicativeInverse(uint64(d))))
21908 v.AddArg2(v0, x)
21909 return true
21910 }
21911 }
21912 break
21913 }
21914
21915
21916 for {
21917 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21918 if v_0.Op != OpConst64 {
21919 continue
21920 }
21921 c := auxIntToInt64(v_0.AuxInt)
21922 if v_1.Op != OpConst64 {
21923 continue
21924 }
21925 d := auxIntToInt64(v_1.AuxInt)
21926 v.reset(OpConstBool)
21927 v.AuxInt = boolToAuxInt(c != d)
21928 return true
21929 }
21930 break
21931 }
21932
21933
21934
21935 for {
21936 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21937 s := v_0
21938 if s.Op != OpSub64 {
21939 continue
21940 }
21941 y := s.Args[1]
21942 x := s.Args[0]
21943 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 || !(s.Uses == 1) {
21944 continue
21945 }
21946 v.reset(OpNeq64)
21947 v.AddArg2(x, y)
21948 return true
21949 }
21950 break
21951 }
21952
21953
21954
21955 for {
21956 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21957 if v_0.Op != OpAnd64 {
21958 continue
21959 }
21960 t := v_0.Type
21961 _ = v_0.Args[1]
21962 v_0_0 := v_0.Args[0]
21963 v_0_1 := v_0.Args[1]
21964 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21965 x := v_0_0
21966 if v_0_1.Op != OpConst64 || v_0_1.Type != t {
21967 continue
21968 }
21969 y := auxIntToInt64(v_0_1.AuxInt)
21970 if v_1.Op != OpConst64 || v_1.Type != t || auxIntToInt64(v_1.AuxInt) != y || !(oneBit(y)) {
21971 continue
21972 }
21973 v.reset(OpEq64)
21974 v0 := b.NewValue0(v.Pos, OpAnd64, t)
21975 v1 := b.NewValue0(v.Pos, OpConst64, t)
21976 v1.AuxInt = int64ToAuxInt(y)
21977 v0.AddArg2(x, v1)
21978 v2 := b.NewValue0(v.Pos, OpConst64, t)
21979 v2.AuxInt = int64ToAuxInt(0)
21980 v.AddArg2(v0, v2)
21981 return true
21982 }
21983 }
21984 break
21985 }
21986
21987
21988 for {
21989 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21990 if v_0.Op != OpZeroExt8to64 {
21991 continue
21992 }
21993 v_0_0 := v_0.Args[0]
21994 if v_0_0.Op != OpCvtBoolToUint8 {
21995 continue
21996 }
21997 x := v_0_0.Args[0]
21998 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
21999 continue
22000 }
22001 v.copyOf(x)
22002 return true
22003 }
22004 break
22005 }
22006
22007
22008 for {
22009 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22010 if v_0.Op != OpZeroExt8to64 {
22011 continue
22012 }
22013 v_0_0 := v_0.Args[0]
22014 if v_0_0.Op != OpCvtBoolToUint8 {
22015 continue
22016 }
22017 x := v_0_0.Args[0]
22018 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
22019 continue
22020 }
22021 v.reset(OpNot)
22022 v.AddArg(x)
22023 return true
22024 }
22025 break
22026 }
22027 return false
22028 }
22029 func rewriteValuegeneric_OpNeq64F(v *Value) bool {
22030 v_1 := v.Args[1]
22031 v_0 := v.Args[0]
22032
22033
22034 for {
22035 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22036 if v_0.Op != OpConst64F {
22037 continue
22038 }
22039 c := auxIntToFloat64(v_0.AuxInt)
22040 if v_1.Op != OpConst64F {
22041 continue
22042 }
22043 d := auxIntToFloat64(v_1.AuxInt)
22044 v.reset(OpConstBool)
22045 v.AuxInt = boolToAuxInt(c != d)
22046 return true
22047 }
22048 break
22049 }
22050 return false
22051 }
22052 func rewriteValuegeneric_OpNeq8(v *Value) bool {
22053 v_1 := v.Args[1]
22054 v_0 := v.Args[0]
22055 b := v.Block
22056
22057
22058 for {
22059 x := v_0
22060 if x != v_1 {
22061 break
22062 }
22063 v.reset(OpConstBool)
22064 v.AuxInt = boolToAuxInt(false)
22065 return true
22066 }
22067
22068
22069
22070 for {
22071 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22072 if v_0.Op != OpConst8 {
22073 continue
22074 }
22075 t := v_0.Type
22076 c := auxIntToInt8(v_0.AuxInt)
22077 o := v_1
22078 if o.Op != OpAdd8 {
22079 continue
22080 }
22081 _ = o.Args[1]
22082 o_0 := o.Args[0]
22083 o_1 := o.Args[1]
22084 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
22085 if o_0.Op != OpConst8 {
22086 continue
22087 }
22088 d := auxIntToInt8(o_0.AuxInt)
22089 x := o_1
22090 if !(o.Uses == 1) {
22091 continue
22092 }
22093 v.reset(OpNeq8)
22094 v0 := b.NewValue0(v.Pos, OpConst8, t)
22095 v0.AuxInt = int8ToAuxInt(c - d)
22096 v.AddArg2(v0, x)
22097 return true
22098 }
22099 }
22100 break
22101 }
22102
22103
22104
22105 for {
22106 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22107 if v_0.Op != OpConst8 {
22108 continue
22109 }
22110 t := v_0.Type
22111 c := auxIntToInt8(v_0.AuxInt)
22112 o := v_1
22113 if o.Op != OpSub8 {
22114 continue
22115 }
22116 _ = o.Args[1]
22117 x := o.Args[0]
22118 o_1 := o.Args[1]
22119 if o_1.Op != OpConst8 {
22120 continue
22121 }
22122 d := auxIntToInt8(o_1.AuxInt)
22123 if !(o.Uses == 1) {
22124 continue
22125 }
22126 v.reset(OpNeq8)
22127 v0 := b.NewValue0(v.Pos, OpConst8, t)
22128 v0.AuxInt = int8ToAuxInt(c + d)
22129 v.AddArg2(v0, x)
22130 return true
22131 }
22132 break
22133 }
22134
22135
22136
22137 for {
22138 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22139 if v_0.Op != OpConst8 {
22140 continue
22141 }
22142 t := v_0.Type
22143 c := auxIntToInt8(v_0.AuxInt)
22144 o := v_1
22145 if o.Op != OpSub8 {
22146 continue
22147 }
22148 x := o.Args[1]
22149 o_0 := o.Args[0]
22150 if o_0.Op != OpConst8 {
22151 continue
22152 }
22153 d := auxIntToInt8(o_0.AuxInt)
22154 if !(o.Uses == 1) {
22155 continue
22156 }
22157 v.reset(OpNeq8)
22158 v0 := b.NewValue0(v.Pos, OpConst8, t)
22159 v0.AuxInt = int8ToAuxInt(d - c)
22160 v.AddArg2(v0, x)
22161 return true
22162 }
22163 break
22164 }
22165
22166
22167
22168 for {
22169 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22170 if v_0.Op != OpConst8 {
22171 continue
22172 }
22173 t := v_0.Type
22174 c := auxIntToInt8(v_0.AuxInt)
22175 o := v_1
22176 if o.Op != OpXor8 {
22177 continue
22178 }
22179 _ = o.Args[1]
22180 o_0 := o.Args[0]
22181 o_1 := o.Args[1]
22182 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
22183 if o_0.Op != OpConst8 {
22184 continue
22185 }
22186 d := auxIntToInt8(o_0.AuxInt)
22187 x := o_1
22188 if !(o.Uses == 1) {
22189 continue
22190 }
22191 v.reset(OpNeq8)
22192 v0 := b.NewValue0(v.Pos, OpConst8, t)
22193 v0.AuxInt = int8ToAuxInt(d ^ c)
22194 v.AddArg2(v0, x)
22195 return true
22196 }
22197 }
22198 break
22199 }
22200
22201
22202
22203 for {
22204 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22205 if v_0.Op != OpConst8 {
22206 continue
22207 }
22208 t := v_0.Type
22209 c := auxIntToInt8(v_0.AuxInt)
22210 o := v_1
22211 if o.Op != OpCom8 {
22212 continue
22213 }
22214 x := o.Args[0]
22215 if !(o.Uses == 1) {
22216 continue
22217 }
22218 v.reset(OpNeq8)
22219 v0 := b.NewValue0(v.Pos, OpConst8, t)
22220 v0.AuxInt = int8ToAuxInt(^c)
22221 v.AddArg2(v0, x)
22222 return true
22223 }
22224 break
22225 }
22226
22227
22228
22229 for {
22230 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22231 if v_0.Op != OpConst8 {
22232 continue
22233 }
22234 t := v_0.Type
22235 c := auxIntToInt8(v_0.AuxInt)
22236 o := v_1
22237 if o.Op != OpNeg8 {
22238 continue
22239 }
22240 x := o.Args[0]
22241 if !(o.Uses == 1) {
22242 continue
22243 }
22244 v.reset(OpNeq8)
22245 v0 := b.NewValue0(v.Pos, OpConst8, t)
22246 v0.AuxInt = int8ToAuxInt(-c)
22247 v.AddArg2(v0, x)
22248 return true
22249 }
22250 break
22251 }
22252
22253
22254
22255 for {
22256 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22257 if v_0.Op != OpConst8 {
22258 continue
22259 }
22260 t := v_0.Type
22261 c := auxIntToInt8(v_0.AuxInt)
22262 o := v_1
22263 if o.Op != OpMul8 {
22264 continue
22265 }
22266 _ = o.Args[1]
22267 o_0 := o.Args[0]
22268 o_1 := o.Args[1]
22269 for _i1 := 0; _i1 <= 1; _i1, o_0, o_1 = _i1+1, o_1, o_0 {
22270 if o_0.Op != OpConst8 {
22271 continue
22272 }
22273 d := auxIntToInt8(o_0.AuxInt)
22274 x := o_1
22275 if !(uint8(d)%2 == 1 && o.Uses == 1) {
22276 continue
22277 }
22278 v.reset(OpNeq8)
22279 v0 := b.NewValue0(v.Pos, OpConst8, t)
22280 v0.AuxInt = int8ToAuxInt(int8(uint8(c) * uint8(modularMultiplicativeInverse(uint64(d)))))
22281 v.AddArg2(v0, x)
22282 return true
22283 }
22284 }
22285 break
22286 }
22287
22288
22289 for {
22290 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22291 if v_0.Op != OpConst8 {
22292 continue
22293 }
22294 c := auxIntToInt8(v_0.AuxInt)
22295 if v_1.Op != OpConst8 {
22296 continue
22297 }
22298 d := auxIntToInt8(v_1.AuxInt)
22299 v.reset(OpConstBool)
22300 v.AuxInt = boolToAuxInt(c != d)
22301 return true
22302 }
22303 break
22304 }
22305
22306
22307
22308 for {
22309 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22310 s := v_0
22311 if s.Op != OpSub8 {
22312 continue
22313 }
22314 y := s.Args[1]
22315 x := s.Args[0]
22316 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(s.Uses == 1) {
22317 continue
22318 }
22319 v.reset(OpNeq8)
22320 v.AddArg2(x, y)
22321 return true
22322 }
22323 break
22324 }
22325
22326
22327
22328 for {
22329 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22330 if v_0.Op != OpAnd8 {
22331 continue
22332 }
22333 t := v_0.Type
22334 _ = v_0.Args[1]
22335 v_0_0 := v_0.Args[0]
22336 v_0_1 := v_0.Args[1]
22337 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22338 x := v_0_0
22339 if v_0_1.Op != OpConst8 || v_0_1.Type != t {
22340 continue
22341 }
22342 y := auxIntToInt8(v_0_1.AuxInt)
22343 if v_1.Op != OpConst8 || v_1.Type != t || auxIntToInt8(v_1.AuxInt) != y || !(oneBit(y)) {
22344 continue
22345 }
22346 v.reset(OpEq8)
22347 v0 := b.NewValue0(v.Pos, OpAnd8, t)
22348 v1 := b.NewValue0(v.Pos, OpConst8, t)
22349 v1.AuxInt = int8ToAuxInt(y)
22350 v0.AddArg2(x, v1)
22351 v2 := b.NewValue0(v.Pos, OpConst8, t)
22352 v2.AuxInt = int8ToAuxInt(0)
22353 v.AddArg2(v0, v2)
22354 return true
22355 }
22356 }
22357 break
22358 }
22359
22360
22361 for {
22362 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22363 if v_0.Op != OpCvtBoolToUint8 {
22364 continue
22365 }
22366 x := v_0.Args[0]
22367 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
22368 continue
22369 }
22370 v.copyOf(x)
22371 return true
22372 }
22373 break
22374 }
22375
22376
22377 for {
22378 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22379 if v_0.Op != OpCvtBoolToUint8 {
22380 continue
22381 }
22382 x := v_0.Args[0]
22383 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 1 {
22384 continue
22385 }
22386 v.reset(OpNot)
22387 v.AddArg(x)
22388 return true
22389 }
22390 break
22391 }
22392 return false
22393 }
22394 func rewriteValuegeneric_OpNeqB(v *Value) bool {
22395 v_1 := v.Args[1]
22396 v_0 := v.Args[0]
22397
22398
22399 for {
22400 x := v_0
22401 if x != v_1 {
22402 break
22403 }
22404 v.reset(OpConstBool)
22405 v.AuxInt = boolToAuxInt(false)
22406 return true
22407 }
22408
22409
22410 for {
22411 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22412 if v_0.Op != OpConstBool {
22413 continue
22414 }
22415 c := auxIntToBool(v_0.AuxInt)
22416 if v_1.Op != OpConstBool {
22417 continue
22418 }
22419 d := auxIntToBool(v_1.AuxInt)
22420 v.reset(OpConstBool)
22421 v.AuxInt = boolToAuxInt(c != d)
22422 return true
22423 }
22424 break
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 != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
22431 continue
22432 }
22433 x := v_1
22434 v.copyOf(x)
22435 return true
22436 }
22437 break
22438 }
22439
22440
22441 for {
22442 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22443 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
22444 continue
22445 }
22446 x := v_1
22447 v.reset(OpNot)
22448 v.AddArg(x)
22449 return true
22450 }
22451 break
22452 }
22453
22454
22455 for {
22456 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22457 if v_0.Op != OpNot {
22458 continue
22459 }
22460 x := v_0.Args[0]
22461 y := v_1
22462 v.reset(OpEqB)
22463 v.AddArg2(x, y)
22464 return true
22465 }
22466 break
22467 }
22468 return false
22469 }
22470 func rewriteValuegeneric_OpNeqInter(v *Value) bool {
22471 v_1 := v.Args[1]
22472 v_0 := v.Args[0]
22473 b := v.Block
22474 typ := &b.Func.Config.Types
22475
22476
22477 for {
22478 x := v_0
22479 y := v_1
22480 v.reset(OpNeqPtr)
22481 v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
22482 v0.AddArg(x)
22483 v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
22484 v1.AddArg(y)
22485 v.AddArg2(v0, v1)
22486 return true
22487 }
22488 }
22489 func rewriteValuegeneric_OpNeqPtr(v *Value) bool {
22490 v_1 := v.Args[1]
22491 v_0 := v.Args[0]
22492
22493
22494 for {
22495 x := v_0
22496 if x != v_1 {
22497 break
22498 }
22499 v.reset(OpConstBool)
22500 v.AuxInt = boolToAuxInt(false)
22501 return true
22502 }
22503
22504
22505 for {
22506 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22507 if v_0.Op != OpAddr {
22508 continue
22509 }
22510 x := auxToSym(v_0.Aux)
22511 if v_1.Op != OpAddr {
22512 continue
22513 }
22514 y := auxToSym(v_1.Aux)
22515 v.reset(OpConstBool)
22516 v.AuxInt = boolToAuxInt(x != y)
22517 return true
22518 }
22519 break
22520 }
22521
22522
22523 for {
22524 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22525 if v_0.Op != OpAddr {
22526 continue
22527 }
22528 x := auxToSym(v_0.Aux)
22529 if v_1.Op != OpOffPtr {
22530 continue
22531 }
22532 o := auxIntToInt64(v_1.AuxInt)
22533 v_1_0 := v_1.Args[0]
22534 if v_1_0.Op != OpAddr {
22535 continue
22536 }
22537 y := auxToSym(v_1_0.Aux)
22538 v.reset(OpConstBool)
22539 v.AuxInt = boolToAuxInt(x != y || o != 0)
22540 return true
22541 }
22542 break
22543 }
22544
22545
22546 for {
22547 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22548 if v_0.Op != OpOffPtr {
22549 continue
22550 }
22551 o1 := auxIntToInt64(v_0.AuxInt)
22552 v_0_0 := v_0.Args[0]
22553 if v_0_0.Op != OpAddr {
22554 continue
22555 }
22556 x := auxToSym(v_0_0.Aux)
22557 if v_1.Op != OpOffPtr {
22558 continue
22559 }
22560 o2 := auxIntToInt64(v_1.AuxInt)
22561 v_1_0 := v_1.Args[0]
22562 if v_1_0.Op != OpAddr {
22563 continue
22564 }
22565 y := auxToSym(v_1_0.Aux)
22566 v.reset(OpConstBool)
22567 v.AuxInt = boolToAuxInt(x != y || o1 != o2)
22568 return true
22569 }
22570 break
22571 }
22572
22573
22574 for {
22575 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22576 if v_0.Op != OpLocalAddr {
22577 continue
22578 }
22579 x := auxToSym(v_0.Aux)
22580 if v_1.Op != OpLocalAddr {
22581 continue
22582 }
22583 y := auxToSym(v_1.Aux)
22584 v.reset(OpConstBool)
22585 v.AuxInt = boolToAuxInt(x != y)
22586 return true
22587 }
22588 break
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 != OpLocalAddr {
22595 continue
22596 }
22597 x := auxToSym(v_0.Aux)
22598 if v_1.Op != OpOffPtr {
22599 continue
22600 }
22601 o := auxIntToInt64(v_1.AuxInt)
22602 v_1_0 := v_1.Args[0]
22603 if v_1_0.Op != OpLocalAddr {
22604 continue
22605 }
22606 y := auxToSym(v_1_0.Aux)
22607 v.reset(OpConstBool)
22608 v.AuxInt = boolToAuxInt(x != y || o != 0)
22609 return true
22610 }
22611 break
22612 }
22613
22614
22615 for {
22616 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22617 if v_0.Op != OpOffPtr {
22618 continue
22619 }
22620 o1 := auxIntToInt64(v_0.AuxInt)
22621 v_0_0 := v_0.Args[0]
22622 if v_0_0.Op != OpLocalAddr {
22623 continue
22624 }
22625 x := auxToSym(v_0_0.Aux)
22626 if v_1.Op != OpOffPtr {
22627 continue
22628 }
22629 o2 := auxIntToInt64(v_1.AuxInt)
22630 v_1_0 := v_1.Args[0]
22631 if v_1_0.Op != OpLocalAddr {
22632 continue
22633 }
22634 y := auxToSym(v_1_0.Aux)
22635 v.reset(OpConstBool)
22636 v.AuxInt = boolToAuxInt(x != y || o1 != o2)
22637 return true
22638 }
22639 break
22640 }
22641
22642
22643
22644 for {
22645 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22646 if v_0.Op != OpOffPtr {
22647 continue
22648 }
22649 o1 := auxIntToInt64(v_0.AuxInt)
22650 p1 := v_0.Args[0]
22651 p2 := v_1
22652 if !(isSamePtr(p1, p2)) {
22653 continue
22654 }
22655 v.reset(OpConstBool)
22656 v.AuxInt = boolToAuxInt(o1 != 0)
22657 return true
22658 }
22659 break
22660 }
22661
22662
22663
22664 for {
22665 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22666 if v_0.Op != OpOffPtr {
22667 continue
22668 }
22669 o1 := auxIntToInt64(v_0.AuxInt)
22670 p1 := v_0.Args[0]
22671 if v_1.Op != OpOffPtr {
22672 continue
22673 }
22674 o2 := auxIntToInt64(v_1.AuxInt)
22675 p2 := v_1.Args[0]
22676 if !(isSamePtr(p1, p2)) {
22677 continue
22678 }
22679 v.reset(OpConstBool)
22680 v.AuxInt = boolToAuxInt(o1 != o2)
22681 return true
22682 }
22683 break
22684 }
22685
22686
22687 for {
22688 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22689 if v_0.Op != OpConst32 {
22690 continue
22691 }
22692 c := auxIntToInt32(v_0.AuxInt)
22693 if v_1.Op != OpConst32 {
22694 continue
22695 }
22696 d := auxIntToInt32(v_1.AuxInt)
22697 v.reset(OpConstBool)
22698 v.AuxInt = boolToAuxInt(c != d)
22699 return true
22700 }
22701 break
22702 }
22703
22704
22705 for {
22706 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22707 if v_0.Op != OpConst64 {
22708 continue
22709 }
22710 c := auxIntToInt64(v_0.AuxInt)
22711 if v_1.Op != OpConst64 {
22712 continue
22713 }
22714 d := auxIntToInt64(v_1.AuxInt)
22715 v.reset(OpConstBool)
22716 v.AuxInt = boolToAuxInt(c != d)
22717 return true
22718 }
22719 break
22720 }
22721
22722
22723 for {
22724 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22725 if v_0.Op != OpConvert {
22726 continue
22727 }
22728 v_0_0 := v_0.Args[0]
22729 if v_0_0.Op != OpAddr {
22730 continue
22731 }
22732 x := auxToSym(v_0_0.Aux)
22733 if v_1.Op != OpAddr {
22734 continue
22735 }
22736 y := auxToSym(v_1.Aux)
22737 v.reset(OpConstBool)
22738 v.AuxInt = boolToAuxInt(x != y)
22739 return true
22740 }
22741 break
22742 }
22743
22744
22745 for {
22746 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22747 if v_0.Op != OpLocalAddr || v_1.Op != OpAddr {
22748 continue
22749 }
22750 v.reset(OpConstBool)
22751 v.AuxInt = boolToAuxInt(true)
22752 return true
22753 }
22754 break
22755 }
22756
22757
22758 for {
22759 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22760 if v_0.Op != OpOffPtr {
22761 continue
22762 }
22763 v_0_0 := v_0.Args[0]
22764 if v_0_0.Op != OpLocalAddr || v_1.Op != OpAddr {
22765 continue
22766 }
22767 v.reset(OpConstBool)
22768 v.AuxInt = boolToAuxInt(true)
22769 return true
22770 }
22771 break
22772 }
22773
22774
22775 for {
22776 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22777 if v_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
22778 continue
22779 }
22780 v_1_0 := v_1.Args[0]
22781 if v_1_0.Op != OpAddr {
22782 continue
22783 }
22784 v.reset(OpConstBool)
22785 v.AuxInt = boolToAuxInt(true)
22786 return true
22787 }
22788 break
22789 }
22790
22791
22792 for {
22793 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22794 if v_0.Op != OpOffPtr {
22795 continue
22796 }
22797 v_0_0 := v_0.Args[0]
22798 if v_0_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
22799 continue
22800 }
22801 v_1_0 := v_1.Args[0]
22802 if v_1_0.Op != OpAddr {
22803 continue
22804 }
22805 v.reset(OpConstBool)
22806 v.AuxInt = boolToAuxInt(true)
22807 return true
22808 }
22809 break
22810 }
22811
22812
22813
22814 for {
22815 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22816 if v_0.Op != OpAddPtr {
22817 continue
22818 }
22819 o1 := v_0.Args[1]
22820 p1 := v_0.Args[0]
22821 p2 := v_1
22822 if !(isSamePtr(p1, p2)) {
22823 continue
22824 }
22825 v.reset(OpIsNonNil)
22826 v.AddArg(o1)
22827 return true
22828 }
22829 break
22830 }
22831
22832
22833 for {
22834 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22835 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
22836 continue
22837 }
22838 p := v_1
22839 v.reset(OpIsNonNil)
22840 v.AddArg(p)
22841 return true
22842 }
22843 break
22844 }
22845
22846
22847 for {
22848 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22849 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
22850 continue
22851 }
22852 p := v_1
22853 v.reset(OpIsNonNil)
22854 v.AddArg(p)
22855 return true
22856 }
22857 break
22858 }
22859
22860
22861 for {
22862 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22863 if v_0.Op != OpConstNil {
22864 continue
22865 }
22866 p := v_1
22867 v.reset(OpIsNonNil)
22868 v.AddArg(p)
22869 return true
22870 }
22871 break
22872 }
22873 return false
22874 }
22875 func rewriteValuegeneric_OpNeqSlice(v *Value) bool {
22876 v_1 := v.Args[1]
22877 v_0 := v.Args[0]
22878 b := v.Block
22879 typ := &b.Func.Config.Types
22880
22881
22882 for {
22883 x := v_0
22884 y := v_1
22885 v.reset(OpNeqPtr)
22886 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
22887 v0.AddArg(x)
22888 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
22889 v1.AddArg(y)
22890 v.AddArg2(v0, v1)
22891 return true
22892 }
22893 }
22894 func rewriteValuegeneric_OpNilCheck(v *Value) bool {
22895 v_1 := v.Args[1]
22896 v_0 := v.Args[0]
22897 b := v.Block
22898 fe := b.Func.fe
22899
22900
22901 for {
22902 ptr := v_0
22903 if ptr.Op != OpGetG {
22904 break
22905 }
22906 mem := ptr.Args[0]
22907 if mem != v_1 {
22908 break
22909 }
22910 v.copyOf(ptr)
22911 return true
22912 }
22913
22914
22915
22916 for {
22917 ptr := v_0
22918 if ptr.Op != OpSelectN || auxIntToInt64(ptr.AuxInt) != 0 {
22919 break
22920 }
22921 call := ptr.Args[0]
22922 if call.Op != OpStaticLECall {
22923 break
22924 }
22925 if !(isMalloc(call.Aux) && warnRule(fe.Debug_checknil(), v, "removed nil check")) {
22926 break
22927 }
22928 v.copyOf(ptr)
22929 return true
22930 }
22931
22932
22933
22934 for {
22935 ptr := v_0
22936 if ptr.Op != OpOffPtr {
22937 break
22938 }
22939 ptr_0 := ptr.Args[0]
22940 if ptr_0.Op != OpSelectN || auxIntToInt64(ptr_0.AuxInt) != 0 {
22941 break
22942 }
22943 call := ptr_0.Args[0]
22944 if call.Op != OpStaticLECall {
22945 break
22946 }
22947 if !(isMalloc(call.Aux) && warnRule(fe.Debug_checknil(), v, "removed nil check")) {
22948 break
22949 }
22950 v.copyOf(ptr)
22951 return true
22952 }
22953
22954
22955 for {
22956 ptr := v_0
22957 if ptr.Op != OpAddr {
22958 break
22959 }
22960 ptr_0 := ptr.Args[0]
22961 if ptr_0.Op != OpSB {
22962 break
22963 }
22964 v.copyOf(ptr)
22965 return true
22966 }
22967
22968
22969 for {
22970 ptr := v_0
22971 if ptr.Op != OpConvert {
22972 break
22973 }
22974 ptr_0 := ptr.Args[0]
22975 if ptr_0.Op != OpAddr {
22976 break
22977 }
22978 ptr_0_0 := ptr_0.Args[0]
22979 if ptr_0_0.Op != OpSB {
22980 break
22981 }
22982 v.copyOf(ptr)
22983 return true
22984 }
22985
22986
22987
22988 for {
22989 ptr := v_0
22990 if ptr.Op != OpLocalAddr || !(warnRule(fe.Debug_checknil(), v, "removed nil check")) {
22991 break
22992 }
22993 v.copyOf(ptr)
22994 return true
22995 }
22996
22997
22998
22999 for {
23000 ptr := v_0
23001 if ptr.Op != OpArg {
23002 break
23003 }
23004 sym := auxToSym(ptr.Aux)
23005 if !(isDictArgSym(sym)) {
23006 break
23007 }
23008 v.copyOf(ptr)
23009 return true
23010 }
23011
23012
23013 for {
23014 ptr := v_0
23015 if ptr.Op != OpNilCheck {
23016 break
23017 }
23018 v.copyOf(ptr)
23019 return true
23020 }
23021 return false
23022 }
23023 func rewriteValuegeneric_OpNot(v *Value) bool {
23024 v_0 := v.Args[0]
23025
23026
23027 for {
23028 if v_0.Op != OpConstBool {
23029 break
23030 }
23031 c := auxIntToBool(v_0.AuxInt)
23032 v.reset(OpConstBool)
23033 v.AuxInt = boolToAuxInt(!c)
23034 return true
23035 }
23036
23037
23038 for {
23039 if v_0.Op != OpEq64 {
23040 break
23041 }
23042 y := v_0.Args[1]
23043 x := v_0.Args[0]
23044 v.reset(OpNeq64)
23045 v.AddArg2(x, y)
23046 return true
23047 }
23048
23049
23050 for {
23051 if v_0.Op != OpEq32 {
23052 break
23053 }
23054 y := v_0.Args[1]
23055 x := v_0.Args[0]
23056 v.reset(OpNeq32)
23057 v.AddArg2(x, y)
23058 return true
23059 }
23060
23061
23062 for {
23063 if v_0.Op != OpEq16 {
23064 break
23065 }
23066 y := v_0.Args[1]
23067 x := v_0.Args[0]
23068 v.reset(OpNeq16)
23069 v.AddArg2(x, y)
23070 return true
23071 }
23072
23073
23074 for {
23075 if v_0.Op != OpEq8 {
23076 break
23077 }
23078 y := v_0.Args[1]
23079 x := v_0.Args[0]
23080 v.reset(OpNeq8)
23081 v.AddArg2(x, y)
23082 return true
23083 }
23084
23085
23086 for {
23087 if v_0.Op != OpEqB {
23088 break
23089 }
23090 y := v_0.Args[1]
23091 x := v_0.Args[0]
23092 v.reset(OpNeqB)
23093 v.AddArg2(x, y)
23094 return true
23095 }
23096
23097
23098 for {
23099 if v_0.Op != OpEqPtr {
23100 break
23101 }
23102 y := v_0.Args[1]
23103 x := v_0.Args[0]
23104 v.reset(OpNeqPtr)
23105 v.AddArg2(x, y)
23106 return true
23107 }
23108
23109
23110 for {
23111 if v_0.Op != OpEq64F {
23112 break
23113 }
23114 y := v_0.Args[1]
23115 x := v_0.Args[0]
23116 v.reset(OpNeq64F)
23117 v.AddArg2(x, y)
23118 return true
23119 }
23120
23121
23122 for {
23123 if v_0.Op != OpEq32F {
23124 break
23125 }
23126 y := v_0.Args[1]
23127 x := v_0.Args[0]
23128 v.reset(OpNeq32F)
23129 v.AddArg2(x, y)
23130 return true
23131 }
23132
23133
23134 for {
23135 if v_0.Op != OpNeq64 {
23136 break
23137 }
23138 y := v_0.Args[1]
23139 x := v_0.Args[0]
23140 v.reset(OpEq64)
23141 v.AddArg2(x, y)
23142 return true
23143 }
23144
23145
23146 for {
23147 if v_0.Op != OpNeq32 {
23148 break
23149 }
23150 y := v_0.Args[1]
23151 x := v_0.Args[0]
23152 v.reset(OpEq32)
23153 v.AddArg2(x, y)
23154 return true
23155 }
23156
23157
23158 for {
23159 if v_0.Op != OpNeq16 {
23160 break
23161 }
23162 y := v_0.Args[1]
23163 x := v_0.Args[0]
23164 v.reset(OpEq16)
23165 v.AddArg2(x, y)
23166 return true
23167 }
23168
23169
23170 for {
23171 if v_0.Op != OpNeq8 {
23172 break
23173 }
23174 y := v_0.Args[1]
23175 x := v_0.Args[0]
23176 v.reset(OpEq8)
23177 v.AddArg2(x, y)
23178 return true
23179 }
23180
23181
23182 for {
23183 if v_0.Op != OpNeqB {
23184 break
23185 }
23186 y := v_0.Args[1]
23187 x := v_0.Args[0]
23188 v.reset(OpEqB)
23189 v.AddArg2(x, y)
23190 return true
23191 }
23192
23193
23194 for {
23195 if v_0.Op != OpNeqPtr {
23196 break
23197 }
23198 y := v_0.Args[1]
23199 x := v_0.Args[0]
23200 v.reset(OpEqPtr)
23201 v.AddArg2(x, y)
23202 return true
23203 }
23204
23205
23206 for {
23207 if v_0.Op != OpNeq64F {
23208 break
23209 }
23210 y := v_0.Args[1]
23211 x := v_0.Args[0]
23212 v.reset(OpEq64F)
23213 v.AddArg2(x, y)
23214 return true
23215 }
23216
23217
23218 for {
23219 if v_0.Op != OpNeq32F {
23220 break
23221 }
23222 y := v_0.Args[1]
23223 x := v_0.Args[0]
23224 v.reset(OpEq32F)
23225 v.AddArg2(x, y)
23226 return true
23227 }
23228
23229
23230 for {
23231 if v_0.Op != OpLess64 {
23232 break
23233 }
23234 y := v_0.Args[1]
23235 x := v_0.Args[0]
23236 v.reset(OpLeq64)
23237 v.AddArg2(y, x)
23238 return true
23239 }
23240
23241
23242 for {
23243 if v_0.Op != OpLess32 {
23244 break
23245 }
23246 y := v_0.Args[1]
23247 x := v_0.Args[0]
23248 v.reset(OpLeq32)
23249 v.AddArg2(y, x)
23250 return true
23251 }
23252
23253
23254 for {
23255 if v_0.Op != OpLess16 {
23256 break
23257 }
23258 y := v_0.Args[1]
23259 x := v_0.Args[0]
23260 v.reset(OpLeq16)
23261 v.AddArg2(y, x)
23262 return true
23263 }
23264
23265
23266 for {
23267 if v_0.Op != OpLess8 {
23268 break
23269 }
23270 y := v_0.Args[1]
23271 x := v_0.Args[0]
23272 v.reset(OpLeq8)
23273 v.AddArg2(y, x)
23274 return true
23275 }
23276
23277
23278 for {
23279 if v_0.Op != OpLess64U {
23280 break
23281 }
23282 y := v_0.Args[1]
23283 x := v_0.Args[0]
23284 v.reset(OpLeq64U)
23285 v.AddArg2(y, x)
23286 return true
23287 }
23288
23289
23290 for {
23291 if v_0.Op != OpLess32U {
23292 break
23293 }
23294 y := v_0.Args[1]
23295 x := v_0.Args[0]
23296 v.reset(OpLeq32U)
23297 v.AddArg2(y, x)
23298 return true
23299 }
23300
23301
23302 for {
23303 if v_0.Op != OpLess16U {
23304 break
23305 }
23306 y := v_0.Args[1]
23307 x := v_0.Args[0]
23308 v.reset(OpLeq16U)
23309 v.AddArg2(y, x)
23310 return true
23311 }
23312
23313
23314 for {
23315 if v_0.Op != OpLess8U {
23316 break
23317 }
23318 y := v_0.Args[1]
23319 x := v_0.Args[0]
23320 v.reset(OpLeq8U)
23321 v.AddArg2(y, x)
23322 return true
23323 }
23324
23325
23326 for {
23327 if v_0.Op != OpLeq64 {
23328 break
23329 }
23330 y := v_0.Args[1]
23331 x := v_0.Args[0]
23332 v.reset(OpLess64)
23333 v.AddArg2(y, x)
23334 return true
23335 }
23336
23337
23338 for {
23339 if v_0.Op != OpLeq32 {
23340 break
23341 }
23342 y := v_0.Args[1]
23343 x := v_0.Args[0]
23344 v.reset(OpLess32)
23345 v.AddArg2(y, x)
23346 return true
23347 }
23348
23349
23350 for {
23351 if v_0.Op != OpLeq16 {
23352 break
23353 }
23354 y := v_0.Args[1]
23355 x := v_0.Args[0]
23356 v.reset(OpLess16)
23357 v.AddArg2(y, x)
23358 return true
23359 }
23360
23361
23362 for {
23363 if v_0.Op != OpLeq8 {
23364 break
23365 }
23366 y := v_0.Args[1]
23367 x := v_0.Args[0]
23368 v.reset(OpLess8)
23369 v.AddArg2(y, x)
23370 return true
23371 }
23372
23373
23374 for {
23375 if v_0.Op != OpLeq64U {
23376 break
23377 }
23378 y := v_0.Args[1]
23379 x := v_0.Args[0]
23380 v.reset(OpLess64U)
23381 v.AddArg2(y, x)
23382 return true
23383 }
23384
23385
23386 for {
23387 if v_0.Op != OpLeq32U {
23388 break
23389 }
23390 y := v_0.Args[1]
23391 x := v_0.Args[0]
23392 v.reset(OpLess32U)
23393 v.AddArg2(y, x)
23394 return true
23395 }
23396
23397
23398 for {
23399 if v_0.Op != OpLeq16U {
23400 break
23401 }
23402 y := v_0.Args[1]
23403 x := v_0.Args[0]
23404 v.reset(OpLess16U)
23405 v.AddArg2(y, x)
23406 return true
23407 }
23408
23409
23410 for {
23411 if v_0.Op != OpLeq8U {
23412 break
23413 }
23414 y := v_0.Args[1]
23415 x := v_0.Args[0]
23416 v.reset(OpLess8U)
23417 v.AddArg2(y, x)
23418 return true
23419 }
23420 return false
23421 }
23422 func rewriteValuegeneric_OpOffPtr(v *Value) bool {
23423 v_0 := v.Args[0]
23424
23425
23426 for {
23427 x := auxIntToInt64(v.AuxInt)
23428 if v_0.Op != OpOffPtr {
23429 break
23430 }
23431 y := auxIntToInt64(v_0.AuxInt)
23432 p := v_0.Args[0]
23433 v.reset(OpOffPtr)
23434 v.AuxInt = int64ToAuxInt(x + y)
23435 v.AddArg(p)
23436 return true
23437 }
23438
23439
23440
23441 for {
23442 if auxIntToInt64(v.AuxInt) != 0 {
23443 break
23444 }
23445 p := v_0
23446 if !(v.Type.Compare(p.Type) == types.CMPeq) {
23447 break
23448 }
23449 v.copyOf(p)
23450 return true
23451 }
23452 return false
23453 }
23454 func rewriteValuegeneric_OpOr16(v *Value) bool {
23455 v_1 := v.Args[1]
23456 v_0 := v.Args[0]
23457 b := v.Block
23458 config := b.Func.Config
23459
23460
23461 for {
23462 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23463 if v_0.Op != OpConst16 {
23464 continue
23465 }
23466 c := auxIntToInt16(v_0.AuxInt)
23467 if v_1.Op != OpConst16 {
23468 continue
23469 }
23470 d := auxIntToInt16(v_1.AuxInt)
23471 v.reset(OpConst16)
23472 v.AuxInt = int16ToAuxInt(c | d)
23473 return true
23474 }
23475 break
23476 }
23477
23478
23479 for {
23480 t := v.Type
23481 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23482 if v_0.Op != OpCom16 {
23483 continue
23484 }
23485 x := v_0.Args[0]
23486 if v_1.Op != OpCom16 {
23487 continue
23488 }
23489 y := v_1.Args[0]
23490 v.reset(OpCom16)
23491 v0 := b.NewValue0(v.Pos, OpAnd16, t)
23492 v0.AddArg2(x, y)
23493 v.AddArg(v0)
23494 return true
23495 }
23496 break
23497 }
23498
23499
23500 for {
23501 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23502 x := v_0
23503 if v_1.Op != OpAnd16 {
23504 continue
23505 }
23506 _ = v_1.Args[1]
23507 v_1_0 := v_1.Args[0]
23508 v_1_1 := v_1.Args[1]
23509 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
23510 if x != v_1_0 {
23511 continue
23512 }
23513 v.copyOf(x)
23514 return true
23515 }
23516 }
23517 break
23518 }
23519
23520
23521 for {
23522 x := v_0
23523 if x != v_1 {
23524 break
23525 }
23526 v.copyOf(x)
23527 return true
23528 }
23529
23530
23531 for {
23532 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23533 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
23534 continue
23535 }
23536 x := v_1
23537 v.copyOf(x)
23538 return true
23539 }
23540 break
23541 }
23542
23543
23544 for {
23545 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23546 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
23547 continue
23548 }
23549 v.reset(OpConst16)
23550 v.AuxInt = int16ToAuxInt(-1)
23551 return true
23552 }
23553 break
23554 }
23555
23556
23557 for {
23558 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23559 if v_0.Op != OpCom16 {
23560 continue
23561 }
23562 x := v_0.Args[0]
23563 if x != v_1 {
23564 continue
23565 }
23566 v.reset(OpConst16)
23567 v.AuxInt = int16ToAuxInt(-1)
23568 return true
23569 }
23570 break
23571 }
23572
23573
23574 for {
23575 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23576 x := v_0
23577 if v_1.Op != OpOr16 {
23578 continue
23579 }
23580 _ = v_1.Args[1]
23581 v_1_0 := v_1.Args[0]
23582 v_1_1 := v_1.Args[1]
23583 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
23584 if x != v_1_0 {
23585 continue
23586 }
23587 y := v_1_1
23588 v.reset(OpOr16)
23589 v.AddArg2(x, y)
23590 return true
23591 }
23592 }
23593 break
23594 }
23595
23596
23597
23598 for {
23599 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23600 if v_0.Op != OpAnd16 {
23601 continue
23602 }
23603 _ = v_0.Args[1]
23604 v_0_0 := v_0.Args[0]
23605 v_0_1 := v_0.Args[1]
23606 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
23607 x := v_0_0
23608 if v_0_1.Op != OpConst16 {
23609 continue
23610 }
23611 c2 := auxIntToInt16(v_0_1.AuxInt)
23612 if v_1.Op != OpConst16 {
23613 continue
23614 }
23615 t := v_1.Type
23616 c1 := auxIntToInt16(v_1.AuxInt)
23617 if !(^(c1 | c2) == 0) {
23618 continue
23619 }
23620 v.reset(OpOr16)
23621 v0 := b.NewValue0(v.Pos, OpConst16, t)
23622 v0.AuxInt = int16ToAuxInt(c1)
23623 v.AddArg2(v0, x)
23624 return true
23625 }
23626 }
23627 break
23628 }
23629
23630
23631
23632 for {
23633 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23634 if v_0.Op != OpOr16 {
23635 continue
23636 }
23637 _ = v_0.Args[1]
23638 v_0_0 := v_0.Args[0]
23639 v_0_1 := v_0.Args[1]
23640 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
23641 i := v_0_0
23642 if i.Op != OpConst16 {
23643 continue
23644 }
23645 t := i.Type
23646 z := v_0_1
23647 x := v_1
23648 if !(z.Op != OpConst16 && x.Op != OpConst16) {
23649 continue
23650 }
23651 v.reset(OpOr16)
23652 v0 := b.NewValue0(v.Pos, OpOr16, t)
23653 v0.AddArg2(z, x)
23654 v.AddArg2(i, v0)
23655 return true
23656 }
23657 }
23658 break
23659 }
23660
23661
23662 for {
23663 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23664 if v_0.Op != OpConst16 {
23665 continue
23666 }
23667 t := v_0.Type
23668 c := auxIntToInt16(v_0.AuxInt)
23669 if v_1.Op != OpOr16 {
23670 continue
23671 }
23672 _ = v_1.Args[1]
23673 v_1_0 := v_1.Args[0]
23674 v_1_1 := v_1.Args[1]
23675 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
23676 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
23677 continue
23678 }
23679 d := auxIntToInt16(v_1_0.AuxInt)
23680 x := v_1_1
23681 v.reset(OpOr16)
23682 v0 := b.NewValue0(v.Pos, OpConst16, t)
23683 v0.AuxInt = int16ToAuxInt(c | d)
23684 v.AddArg2(v0, x)
23685 return true
23686 }
23687 }
23688 break
23689 }
23690
23691
23692
23693 for {
23694 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23695 if v_0.Op != OpLsh16x64 {
23696 continue
23697 }
23698 _ = v_0.Args[1]
23699 x := v_0.Args[0]
23700 z := v_0.Args[1]
23701 if z.Op != OpConst64 {
23702 continue
23703 }
23704 c := auxIntToInt64(z.AuxInt)
23705 if v_1.Op != OpRsh16Ux64 {
23706 continue
23707 }
23708 _ = v_1.Args[1]
23709 if x != v_1.Args[0] {
23710 continue
23711 }
23712 v_1_1 := v_1.Args[1]
23713 if v_1_1.Op != OpConst64 {
23714 continue
23715 }
23716 d := auxIntToInt64(v_1_1.AuxInt)
23717 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
23718 continue
23719 }
23720 v.reset(OpRotateLeft16)
23721 v.AddArg2(x, z)
23722 return true
23723 }
23724 break
23725 }
23726
23727
23728
23729 for {
23730 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23731 left := v_0
23732 if left.Op != OpLsh16x64 {
23733 continue
23734 }
23735 y := left.Args[1]
23736 x := left.Args[0]
23737 right := v_1
23738 if right.Op != OpRsh16Ux64 {
23739 continue
23740 }
23741 _ = right.Args[1]
23742 if x != right.Args[0] {
23743 continue
23744 }
23745 right_1 := right.Args[1]
23746 if right_1.Op != OpSub64 {
23747 continue
23748 }
23749 _ = right_1.Args[1]
23750 right_1_0 := right_1.Args[0]
23751 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
23752 continue
23753 }
23754 v.reset(OpRotateLeft16)
23755 v.AddArg2(x, y)
23756 return true
23757 }
23758 break
23759 }
23760
23761
23762
23763 for {
23764 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23765 left := v_0
23766 if left.Op != OpLsh16x32 {
23767 continue
23768 }
23769 y := left.Args[1]
23770 x := left.Args[0]
23771 right := v_1
23772 if right.Op != OpRsh16Ux32 {
23773 continue
23774 }
23775 _ = right.Args[1]
23776 if x != right.Args[0] {
23777 continue
23778 }
23779 right_1 := right.Args[1]
23780 if right_1.Op != OpSub32 {
23781 continue
23782 }
23783 _ = right_1.Args[1]
23784 right_1_0 := right_1.Args[0]
23785 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
23786 continue
23787 }
23788 v.reset(OpRotateLeft16)
23789 v.AddArg2(x, y)
23790 return true
23791 }
23792 break
23793 }
23794
23795
23796
23797 for {
23798 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23799 left := v_0
23800 if left.Op != OpLsh16x16 {
23801 continue
23802 }
23803 y := left.Args[1]
23804 x := left.Args[0]
23805 right := v_1
23806 if right.Op != OpRsh16Ux16 {
23807 continue
23808 }
23809 _ = right.Args[1]
23810 if x != right.Args[0] {
23811 continue
23812 }
23813 right_1 := right.Args[1]
23814 if right_1.Op != OpSub16 {
23815 continue
23816 }
23817 _ = right_1.Args[1]
23818 right_1_0 := right_1.Args[0]
23819 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
23820 continue
23821 }
23822 v.reset(OpRotateLeft16)
23823 v.AddArg2(x, y)
23824 return true
23825 }
23826 break
23827 }
23828
23829
23830
23831 for {
23832 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23833 left := v_0
23834 if left.Op != OpLsh16x8 {
23835 continue
23836 }
23837 y := left.Args[1]
23838 x := left.Args[0]
23839 right := v_1
23840 if right.Op != OpRsh16Ux8 {
23841 continue
23842 }
23843 _ = right.Args[1]
23844 if x != right.Args[0] {
23845 continue
23846 }
23847 right_1 := right.Args[1]
23848 if right_1.Op != OpSub8 {
23849 continue
23850 }
23851 _ = right_1.Args[1]
23852 right_1_0 := right_1.Args[0]
23853 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
23854 continue
23855 }
23856 v.reset(OpRotateLeft16)
23857 v.AddArg2(x, y)
23858 return true
23859 }
23860 break
23861 }
23862
23863
23864
23865 for {
23866 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23867 right := v_0
23868 if right.Op != OpRsh16Ux64 {
23869 continue
23870 }
23871 y := right.Args[1]
23872 x := right.Args[0]
23873 left := v_1
23874 if left.Op != OpLsh16x64 {
23875 continue
23876 }
23877 _ = left.Args[1]
23878 if x != left.Args[0] {
23879 continue
23880 }
23881 z := left.Args[1]
23882 if z.Op != OpSub64 {
23883 continue
23884 }
23885 _ = z.Args[1]
23886 z_0 := z.Args[0]
23887 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
23888 continue
23889 }
23890 v.reset(OpRotateLeft16)
23891 v.AddArg2(x, z)
23892 return true
23893 }
23894 break
23895 }
23896
23897
23898
23899 for {
23900 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23901 right := v_0
23902 if right.Op != OpRsh16Ux32 {
23903 continue
23904 }
23905 y := right.Args[1]
23906 x := right.Args[0]
23907 left := v_1
23908 if left.Op != OpLsh16x32 {
23909 continue
23910 }
23911 _ = left.Args[1]
23912 if x != left.Args[0] {
23913 continue
23914 }
23915 z := left.Args[1]
23916 if z.Op != OpSub32 {
23917 continue
23918 }
23919 _ = z.Args[1]
23920 z_0 := z.Args[0]
23921 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
23922 continue
23923 }
23924 v.reset(OpRotateLeft16)
23925 v.AddArg2(x, z)
23926 return true
23927 }
23928 break
23929 }
23930
23931
23932
23933 for {
23934 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23935 right := v_0
23936 if right.Op != OpRsh16Ux16 {
23937 continue
23938 }
23939 y := right.Args[1]
23940 x := right.Args[0]
23941 left := v_1
23942 if left.Op != OpLsh16x16 {
23943 continue
23944 }
23945 _ = left.Args[1]
23946 if x != left.Args[0] {
23947 continue
23948 }
23949 z := left.Args[1]
23950 if z.Op != OpSub16 {
23951 continue
23952 }
23953 _ = z.Args[1]
23954 z_0 := z.Args[0]
23955 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
23956 continue
23957 }
23958 v.reset(OpRotateLeft16)
23959 v.AddArg2(x, z)
23960 return true
23961 }
23962 break
23963 }
23964
23965
23966
23967 for {
23968 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23969 right := v_0
23970 if right.Op != OpRsh16Ux8 {
23971 continue
23972 }
23973 y := right.Args[1]
23974 x := right.Args[0]
23975 left := v_1
23976 if left.Op != OpLsh16x8 {
23977 continue
23978 }
23979 _ = left.Args[1]
23980 if x != left.Args[0] {
23981 continue
23982 }
23983 z := left.Args[1]
23984 if z.Op != OpSub8 {
23985 continue
23986 }
23987 _ = z.Args[1]
23988 z_0 := z.Args[0]
23989 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
23990 continue
23991 }
23992 v.reset(OpRotateLeft16)
23993 v.AddArg2(x, z)
23994 return true
23995 }
23996 break
23997 }
23998 return false
23999 }
24000 func rewriteValuegeneric_OpOr32(v *Value) bool {
24001 v_1 := v.Args[1]
24002 v_0 := v.Args[0]
24003 b := v.Block
24004 config := b.Func.Config
24005
24006
24007 for {
24008 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24009 if v_0.Op != OpConst32 {
24010 continue
24011 }
24012 c := auxIntToInt32(v_0.AuxInt)
24013 if v_1.Op != OpConst32 {
24014 continue
24015 }
24016 d := auxIntToInt32(v_1.AuxInt)
24017 v.reset(OpConst32)
24018 v.AuxInt = int32ToAuxInt(c | d)
24019 return true
24020 }
24021 break
24022 }
24023
24024
24025 for {
24026 t := v.Type
24027 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24028 if v_0.Op != OpCom32 {
24029 continue
24030 }
24031 x := v_0.Args[0]
24032 if v_1.Op != OpCom32 {
24033 continue
24034 }
24035 y := v_1.Args[0]
24036 v.reset(OpCom32)
24037 v0 := b.NewValue0(v.Pos, OpAnd32, t)
24038 v0.AddArg2(x, y)
24039 v.AddArg(v0)
24040 return true
24041 }
24042 break
24043 }
24044
24045
24046 for {
24047 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24048 x := v_0
24049 if v_1.Op != OpAnd32 {
24050 continue
24051 }
24052 _ = v_1.Args[1]
24053 v_1_0 := v_1.Args[0]
24054 v_1_1 := v_1.Args[1]
24055 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
24056 if x != v_1_0 {
24057 continue
24058 }
24059 v.copyOf(x)
24060 return true
24061 }
24062 }
24063 break
24064 }
24065
24066
24067 for {
24068 x := v_0
24069 if x != v_1 {
24070 break
24071 }
24072 v.copyOf(x)
24073 return true
24074 }
24075
24076
24077 for {
24078 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24079 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
24080 continue
24081 }
24082 x := v_1
24083 v.copyOf(x)
24084 return true
24085 }
24086 break
24087 }
24088
24089
24090 for {
24091 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24092 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
24093 continue
24094 }
24095 v.reset(OpConst32)
24096 v.AuxInt = int32ToAuxInt(-1)
24097 return true
24098 }
24099 break
24100 }
24101
24102
24103 for {
24104 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24105 if v_0.Op != OpCom32 {
24106 continue
24107 }
24108 x := v_0.Args[0]
24109 if x != v_1 {
24110 continue
24111 }
24112 v.reset(OpConst32)
24113 v.AuxInt = int32ToAuxInt(-1)
24114 return true
24115 }
24116 break
24117 }
24118
24119
24120 for {
24121 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24122 x := v_0
24123 if v_1.Op != OpOr32 {
24124 continue
24125 }
24126 _ = v_1.Args[1]
24127 v_1_0 := v_1.Args[0]
24128 v_1_1 := v_1.Args[1]
24129 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
24130 if x != v_1_0 {
24131 continue
24132 }
24133 y := v_1_1
24134 v.reset(OpOr32)
24135 v.AddArg2(x, y)
24136 return true
24137 }
24138 }
24139 break
24140 }
24141
24142
24143
24144 for {
24145 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24146 if v_0.Op != OpAnd32 {
24147 continue
24148 }
24149 _ = v_0.Args[1]
24150 v_0_0 := v_0.Args[0]
24151 v_0_1 := v_0.Args[1]
24152 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
24153 x := v_0_0
24154 if v_0_1.Op != OpConst32 {
24155 continue
24156 }
24157 c2 := auxIntToInt32(v_0_1.AuxInt)
24158 if v_1.Op != OpConst32 {
24159 continue
24160 }
24161 t := v_1.Type
24162 c1 := auxIntToInt32(v_1.AuxInt)
24163 if !(^(c1 | c2) == 0) {
24164 continue
24165 }
24166 v.reset(OpOr32)
24167 v0 := b.NewValue0(v.Pos, OpConst32, t)
24168 v0.AuxInt = int32ToAuxInt(c1)
24169 v.AddArg2(v0, x)
24170 return true
24171 }
24172 }
24173 break
24174 }
24175
24176
24177
24178 for {
24179 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24180 if v_0.Op != OpOr32 {
24181 continue
24182 }
24183 _ = v_0.Args[1]
24184 v_0_0 := v_0.Args[0]
24185 v_0_1 := v_0.Args[1]
24186 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
24187 i := v_0_0
24188 if i.Op != OpConst32 {
24189 continue
24190 }
24191 t := i.Type
24192 z := v_0_1
24193 x := v_1
24194 if !(z.Op != OpConst32 && x.Op != OpConst32) {
24195 continue
24196 }
24197 v.reset(OpOr32)
24198 v0 := b.NewValue0(v.Pos, OpOr32, t)
24199 v0.AddArg2(z, x)
24200 v.AddArg2(i, v0)
24201 return true
24202 }
24203 }
24204 break
24205 }
24206
24207
24208 for {
24209 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24210 if v_0.Op != OpConst32 {
24211 continue
24212 }
24213 t := v_0.Type
24214 c := auxIntToInt32(v_0.AuxInt)
24215 if v_1.Op != OpOr32 {
24216 continue
24217 }
24218 _ = v_1.Args[1]
24219 v_1_0 := v_1.Args[0]
24220 v_1_1 := v_1.Args[1]
24221 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
24222 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
24223 continue
24224 }
24225 d := auxIntToInt32(v_1_0.AuxInt)
24226 x := v_1_1
24227 v.reset(OpOr32)
24228 v0 := b.NewValue0(v.Pos, OpConst32, t)
24229 v0.AuxInt = int32ToAuxInt(c | d)
24230 v.AddArg2(v0, x)
24231 return true
24232 }
24233 }
24234 break
24235 }
24236
24237
24238
24239 for {
24240 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24241 if v_0.Op != OpLsh32x64 {
24242 continue
24243 }
24244 _ = v_0.Args[1]
24245 x := v_0.Args[0]
24246 z := v_0.Args[1]
24247 if z.Op != OpConst64 {
24248 continue
24249 }
24250 c := auxIntToInt64(z.AuxInt)
24251 if v_1.Op != OpRsh32Ux64 {
24252 continue
24253 }
24254 _ = v_1.Args[1]
24255 if x != v_1.Args[0] {
24256 continue
24257 }
24258 v_1_1 := v_1.Args[1]
24259 if v_1_1.Op != OpConst64 {
24260 continue
24261 }
24262 d := auxIntToInt64(v_1_1.AuxInt)
24263 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
24264 continue
24265 }
24266 v.reset(OpRotateLeft32)
24267 v.AddArg2(x, z)
24268 return true
24269 }
24270 break
24271 }
24272
24273
24274
24275 for {
24276 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24277 left := v_0
24278 if left.Op != OpLsh32x64 {
24279 continue
24280 }
24281 y := left.Args[1]
24282 x := left.Args[0]
24283 right := v_1
24284 if right.Op != OpRsh32Ux64 {
24285 continue
24286 }
24287 _ = right.Args[1]
24288 if x != right.Args[0] {
24289 continue
24290 }
24291 right_1 := right.Args[1]
24292 if right_1.Op != OpSub64 {
24293 continue
24294 }
24295 _ = right_1.Args[1]
24296 right_1_0 := right_1.Args[0]
24297 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
24298 continue
24299 }
24300 v.reset(OpRotateLeft32)
24301 v.AddArg2(x, y)
24302 return true
24303 }
24304 break
24305 }
24306
24307
24308
24309 for {
24310 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24311 left := v_0
24312 if left.Op != OpLsh32x32 {
24313 continue
24314 }
24315 y := left.Args[1]
24316 x := left.Args[0]
24317 right := v_1
24318 if right.Op != OpRsh32Ux32 {
24319 continue
24320 }
24321 _ = right.Args[1]
24322 if x != right.Args[0] {
24323 continue
24324 }
24325 right_1 := right.Args[1]
24326 if right_1.Op != OpSub32 {
24327 continue
24328 }
24329 _ = right_1.Args[1]
24330 right_1_0 := right_1.Args[0]
24331 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
24332 continue
24333 }
24334 v.reset(OpRotateLeft32)
24335 v.AddArg2(x, y)
24336 return true
24337 }
24338 break
24339 }
24340
24341
24342
24343 for {
24344 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24345 left := v_0
24346 if left.Op != OpLsh32x16 {
24347 continue
24348 }
24349 y := left.Args[1]
24350 x := left.Args[0]
24351 right := v_1
24352 if right.Op != OpRsh32Ux16 {
24353 continue
24354 }
24355 _ = right.Args[1]
24356 if x != right.Args[0] {
24357 continue
24358 }
24359 right_1 := right.Args[1]
24360 if right_1.Op != OpSub16 {
24361 continue
24362 }
24363 _ = right_1.Args[1]
24364 right_1_0 := right_1.Args[0]
24365 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
24366 continue
24367 }
24368 v.reset(OpRotateLeft32)
24369 v.AddArg2(x, y)
24370 return true
24371 }
24372 break
24373 }
24374
24375
24376
24377 for {
24378 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24379 left := v_0
24380 if left.Op != OpLsh32x8 {
24381 continue
24382 }
24383 y := left.Args[1]
24384 x := left.Args[0]
24385 right := v_1
24386 if right.Op != OpRsh32Ux8 {
24387 continue
24388 }
24389 _ = right.Args[1]
24390 if x != right.Args[0] {
24391 continue
24392 }
24393 right_1 := right.Args[1]
24394 if right_1.Op != OpSub8 {
24395 continue
24396 }
24397 _ = right_1.Args[1]
24398 right_1_0 := right_1.Args[0]
24399 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
24400 continue
24401 }
24402 v.reset(OpRotateLeft32)
24403 v.AddArg2(x, y)
24404 return true
24405 }
24406 break
24407 }
24408
24409
24410
24411 for {
24412 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24413 right := v_0
24414 if right.Op != OpRsh32Ux64 {
24415 continue
24416 }
24417 y := right.Args[1]
24418 x := right.Args[0]
24419 left := v_1
24420 if left.Op != OpLsh32x64 {
24421 continue
24422 }
24423 _ = left.Args[1]
24424 if x != left.Args[0] {
24425 continue
24426 }
24427 z := left.Args[1]
24428 if z.Op != OpSub64 {
24429 continue
24430 }
24431 _ = z.Args[1]
24432 z_0 := z.Args[0]
24433 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
24434 continue
24435 }
24436 v.reset(OpRotateLeft32)
24437 v.AddArg2(x, z)
24438 return true
24439 }
24440 break
24441 }
24442
24443
24444
24445 for {
24446 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24447 right := v_0
24448 if right.Op != OpRsh32Ux32 {
24449 continue
24450 }
24451 y := right.Args[1]
24452 x := right.Args[0]
24453 left := v_1
24454 if left.Op != OpLsh32x32 {
24455 continue
24456 }
24457 _ = left.Args[1]
24458 if x != left.Args[0] {
24459 continue
24460 }
24461 z := left.Args[1]
24462 if z.Op != OpSub32 {
24463 continue
24464 }
24465 _ = z.Args[1]
24466 z_0 := z.Args[0]
24467 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
24468 continue
24469 }
24470 v.reset(OpRotateLeft32)
24471 v.AddArg2(x, z)
24472 return true
24473 }
24474 break
24475 }
24476
24477
24478
24479 for {
24480 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24481 right := v_0
24482 if right.Op != OpRsh32Ux16 {
24483 continue
24484 }
24485 y := right.Args[1]
24486 x := right.Args[0]
24487 left := v_1
24488 if left.Op != OpLsh32x16 {
24489 continue
24490 }
24491 _ = left.Args[1]
24492 if x != left.Args[0] {
24493 continue
24494 }
24495 z := left.Args[1]
24496 if z.Op != OpSub16 {
24497 continue
24498 }
24499 _ = z.Args[1]
24500 z_0 := z.Args[0]
24501 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
24502 continue
24503 }
24504 v.reset(OpRotateLeft32)
24505 v.AddArg2(x, z)
24506 return true
24507 }
24508 break
24509 }
24510
24511
24512
24513 for {
24514 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24515 right := v_0
24516 if right.Op != OpRsh32Ux8 {
24517 continue
24518 }
24519 y := right.Args[1]
24520 x := right.Args[0]
24521 left := v_1
24522 if left.Op != OpLsh32x8 {
24523 continue
24524 }
24525 _ = left.Args[1]
24526 if x != left.Args[0] {
24527 continue
24528 }
24529 z := left.Args[1]
24530 if z.Op != OpSub8 {
24531 continue
24532 }
24533 _ = z.Args[1]
24534 z_0 := z.Args[0]
24535 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
24536 continue
24537 }
24538 v.reset(OpRotateLeft32)
24539 v.AddArg2(x, z)
24540 return true
24541 }
24542 break
24543 }
24544 return false
24545 }
24546 func rewriteValuegeneric_OpOr64(v *Value) bool {
24547 v_1 := v.Args[1]
24548 v_0 := v.Args[0]
24549 b := v.Block
24550 config := b.Func.Config
24551
24552
24553 for {
24554 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24555 if v_0.Op != OpConst64 {
24556 continue
24557 }
24558 c := auxIntToInt64(v_0.AuxInt)
24559 if v_1.Op != OpConst64 {
24560 continue
24561 }
24562 d := auxIntToInt64(v_1.AuxInt)
24563 v.reset(OpConst64)
24564 v.AuxInt = int64ToAuxInt(c | d)
24565 return true
24566 }
24567 break
24568 }
24569
24570
24571 for {
24572 t := v.Type
24573 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24574 if v_0.Op != OpCom64 {
24575 continue
24576 }
24577 x := v_0.Args[0]
24578 if v_1.Op != OpCom64 {
24579 continue
24580 }
24581 y := v_1.Args[0]
24582 v.reset(OpCom64)
24583 v0 := b.NewValue0(v.Pos, OpAnd64, t)
24584 v0.AddArg2(x, y)
24585 v.AddArg(v0)
24586 return true
24587 }
24588 break
24589 }
24590
24591
24592 for {
24593 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24594 x := v_0
24595 if v_1.Op != OpAnd64 {
24596 continue
24597 }
24598 _ = v_1.Args[1]
24599 v_1_0 := v_1.Args[0]
24600 v_1_1 := v_1.Args[1]
24601 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
24602 if x != v_1_0 {
24603 continue
24604 }
24605 v.copyOf(x)
24606 return true
24607 }
24608 }
24609 break
24610 }
24611
24612
24613 for {
24614 x := v_0
24615 if x != v_1 {
24616 break
24617 }
24618 v.copyOf(x)
24619 return true
24620 }
24621
24622
24623 for {
24624 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24625 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
24626 continue
24627 }
24628 x := v_1
24629 v.copyOf(x)
24630 return true
24631 }
24632 break
24633 }
24634
24635
24636 for {
24637 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24638 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
24639 continue
24640 }
24641 v.reset(OpConst64)
24642 v.AuxInt = int64ToAuxInt(-1)
24643 return true
24644 }
24645 break
24646 }
24647
24648
24649 for {
24650 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24651 if v_0.Op != OpCom64 {
24652 continue
24653 }
24654 x := v_0.Args[0]
24655 if x != v_1 {
24656 continue
24657 }
24658 v.reset(OpConst64)
24659 v.AuxInt = int64ToAuxInt(-1)
24660 return true
24661 }
24662 break
24663 }
24664
24665
24666 for {
24667 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24668 x := v_0
24669 if v_1.Op != OpOr64 {
24670 continue
24671 }
24672 _ = v_1.Args[1]
24673 v_1_0 := v_1.Args[0]
24674 v_1_1 := v_1.Args[1]
24675 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
24676 if x != v_1_0 {
24677 continue
24678 }
24679 y := v_1_1
24680 v.reset(OpOr64)
24681 v.AddArg2(x, y)
24682 return true
24683 }
24684 }
24685 break
24686 }
24687
24688
24689
24690 for {
24691 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24692 if v_0.Op != OpAnd64 {
24693 continue
24694 }
24695 _ = v_0.Args[1]
24696 v_0_0 := v_0.Args[0]
24697 v_0_1 := v_0.Args[1]
24698 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
24699 x := v_0_0
24700 if v_0_1.Op != OpConst64 {
24701 continue
24702 }
24703 c2 := auxIntToInt64(v_0_1.AuxInt)
24704 if v_1.Op != OpConst64 {
24705 continue
24706 }
24707 t := v_1.Type
24708 c1 := auxIntToInt64(v_1.AuxInt)
24709 if !(^(c1 | c2) == 0) {
24710 continue
24711 }
24712 v.reset(OpOr64)
24713 v0 := b.NewValue0(v.Pos, OpConst64, t)
24714 v0.AuxInt = int64ToAuxInt(c1)
24715 v.AddArg2(v0, x)
24716 return true
24717 }
24718 }
24719 break
24720 }
24721
24722
24723
24724 for {
24725 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24726 if v_0.Op != OpOr64 {
24727 continue
24728 }
24729 _ = v_0.Args[1]
24730 v_0_0 := v_0.Args[0]
24731 v_0_1 := v_0.Args[1]
24732 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
24733 i := v_0_0
24734 if i.Op != OpConst64 {
24735 continue
24736 }
24737 t := i.Type
24738 z := v_0_1
24739 x := v_1
24740 if !(z.Op != OpConst64 && x.Op != OpConst64) {
24741 continue
24742 }
24743 v.reset(OpOr64)
24744 v0 := b.NewValue0(v.Pos, OpOr64, t)
24745 v0.AddArg2(z, x)
24746 v.AddArg2(i, v0)
24747 return true
24748 }
24749 }
24750 break
24751 }
24752
24753
24754 for {
24755 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24756 if v_0.Op != OpConst64 {
24757 continue
24758 }
24759 t := v_0.Type
24760 c := auxIntToInt64(v_0.AuxInt)
24761 if v_1.Op != OpOr64 {
24762 continue
24763 }
24764 _ = v_1.Args[1]
24765 v_1_0 := v_1.Args[0]
24766 v_1_1 := v_1.Args[1]
24767 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
24768 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
24769 continue
24770 }
24771 d := auxIntToInt64(v_1_0.AuxInt)
24772 x := v_1_1
24773 v.reset(OpOr64)
24774 v0 := b.NewValue0(v.Pos, OpConst64, t)
24775 v0.AuxInt = int64ToAuxInt(c | d)
24776 v.AddArg2(v0, x)
24777 return true
24778 }
24779 }
24780 break
24781 }
24782
24783
24784
24785 for {
24786 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24787 if v_0.Op != OpLsh64x64 {
24788 continue
24789 }
24790 _ = v_0.Args[1]
24791 x := v_0.Args[0]
24792 z := v_0.Args[1]
24793 if z.Op != OpConst64 {
24794 continue
24795 }
24796 c := auxIntToInt64(z.AuxInt)
24797 if v_1.Op != OpRsh64Ux64 {
24798 continue
24799 }
24800 _ = v_1.Args[1]
24801 if x != v_1.Args[0] {
24802 continue
24803 }
24804 v_1_1 := v_1.Args[1]
24805 if v_1_1.Op != OpConst64 {
24806 continue
24807 }
24808 d := auxIntToInt64(v_1_1.AuxInt)
24809 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
24810 continue
24811 }
24812 v.reset(OpRotateLeft64)
24813 v.AddArg2(x, z)
24814 return true
24815 }
24816 break
24817 }
24818
24819
24820
24821 for {
24822 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24823 left := v_0
24824 if left.Op != OpLsh64x64 {
24825 continue
24826 }
24827 y := left.Args[1]
24828 x := left.Args[0]
24829 right := v_1
24830 if right.Op != OpRsh64Ux64 {
24831 continue
24832 }
24833 _ = right.Args[1]
24834 if x != right.Args[0] {
24835 continue
24836 }
24837 right_1 := right.Args[1]
24838 if right_1.Op != OpSub64 {
24839 continue
24840 }
24841 _ = right_1.Args[1]
24842 right_1_0 := right_1.Args[0]
24843 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
24844 continue
24845 }
24846 v.reset(OpRotateLeft64)
24847 v.AddArg2(x, y)
24848 return true
24849 }
24850 break
24851 }
24852
24853
24854
24855 for {
24856 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24857 left := v_0
24858 if left.Op != OpLsh64x32 {
24859 continue
24860 }
24861 y := left.Args[1]
24862 x := left.Args[0]
24863 right := v_1
24864 if right.Op != OpRsh64Ux32 {
24865 continue
24866 }
24867 _ = right.Args[1]
24868 if x != right.Args[0] {
24869 continue
24870 }
24871 right_1 := right.Args[1]
24872 if right_1.Op != OpSub32 {
24873 continue
24874 }
24875 _ = right_1.Args[1]
24876 right_1_0 := right_1.Args[0]
24877 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
24878 continue
24879 }
24880 v.reset(OpRotateLeft64)
24881 v.AddArg2(x, y)
24882 return true
24883 }
24884 break
24885 }
24886
24887
24888
24889 for {
24890 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24891 left := v_0
24892 if left.Op != OpLsh64x16 {
24893 continue
24894 }
24895 y := left.Args[1]
24896 x := left.Args[0]
24897 right := v_1
24898 if right.Op != OpRsh64Ux16 {
24899 continue
24900 }
24901 _ = right.Args[1]
24902 if x != right.Args[0] {
24903 continue
24904 }
24905 right_1 := right.Args[1]
24906 if right_1.Op != OpSub16 {
24907 continue
24908 }
24909 _ = right_1.Args[1]
24910 right_1_0 := right_1.Args[0]
24911 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
24912 continue
24913 }
24914 v.reset(OpRotateLeft64)
24915 v.AddArg2(x, y)
24916 return true
24917 }
24918 break
24919 }
24920
24921
24922
24923 for {
24924 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24925 left := v_0
24926 if left.Op != OpLsh64x8 {
24927 continue
24928 }
24929 y := left.Args[1]
24930 x := left.Args[0]
24931 right := v_1
24932 if right.Op != OpRsh64Ux8 {
24933 continue
24934 }
24935 _ = right.Args[1]
24936 if x != right.Args[0] {
24937 continue
24938 }
24939 right_1 := right.Args[1]
24940 if right_1.Op != OpSub8 {
24941 continue
24942 }
24943 _ = right_1.Args[1]
24944 right_1_0 := right_1.Args[0]
24945 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
24946 continue
24947 }
24948 v.reset(OpRotateLeft64)
24949 v.AddArg2(x, y)
24950 return true
24951 }
24952 break
24953 }
24954
24955
24956
24957 for {
24958 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24959 right := v_0
24960 if right.Op != OpRsh64Ux64 {
24961 continue
24962 }
24963 y := right.Args[1]
24964 x := right.Args[0]
24965 left := v_1
24966 if left.Op != OpLsh64x64 {
24967 continue
24968 }
24969 _ = left.Args[1]
24970 if x != left.Args[0] {
24971 continue
24972 }
24973 z := left.Args[1]
24974 if z.Op != OpSub64 {
24975 continue
24976 }
24977 _ = z.Args[1]
24978 z_0 := z.Args[0]
24979 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
24980 continue
24981 }
24982 v.reset(OpRotateLeft64)
24983 v.AddArg2(x, z)
24984 return true
24985 }
24986 break
24987 }
24988
24989
24990
24991 for {
24992 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24993 right := v_0
24994 if right.Op != OpRsh64Ux32 {
24995 continue
24996 }
24997 y := right.Args[1]
24998 x := right.Args[0]
24999 left := v_1
25000 if left.Op != OpLsh64x32 {
25001 continue
25002 }
25003 _ = left.Args[1]
25004 if x != left.Args[0] {
25005 continue
25006 }
25007 z := left.Args[1]
25008 if z.Op != OpSub32 {
25009 continue
25010 }
25011 _ = z.Args[1]
25012 z_0 := z.Args[0]
25013 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
25014 continue
25015 }
25016 v.reset(OpRotateLeft64)
25017 v.AddArg2(x, z)
25018 return true
25019 }
25020 break
25021 }
25022
25023
25024
25025 for {
25026 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25027 right := v_0
25028 if right.Op != OpRsh64Ux16 {
25029 continue
25030 }
25031 y := right.Args[1]
25032 x := right.Args[0]
25033 left := v_1
25034 if left.Op != OpLsh64x16 {
25035 continue
25036 }
25037 _ = left.Args[1]
25038 if x != left.Args[0] {
25039 continue
25040 }
25041 z := left.Args[1]
25042 if z.Op != OpSub16 {
25043 continue
25044 }
25045 _ = z.Args[1]
25046 z_0 := z.Args[0]
25047 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
25048 continue
25049 }
25050 v.reset(OpRotateLeft64)
25051 v.AddArg2(x, z)
25052 return true
25053 }
25054 break
25055 }
25056
25057
25058
25059 for {
25060 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25061 right := v_0
25062 if right.Op != OpRsh64Ux8 {
25063 continue
25064 }
25065 y := right.Args[1]
25066 x := right.Args[0]
25067 left := v_1
25068 if left.Op != OpLsh64x8 {
25069 continue
25070 }
25071 _ = left.Args[1]
25072 if x != left.Args[0] {
25073 continue
25074 }
25075 z := left.Args[1]
25076 if z.Op != OpSub8 {
25077 continue
25078 }
25079 _ = z.Args[1]
25080 z_0 := z.Args[0]
25081 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
25082 continue
25083 }
25084 v.reset(OpRotateLeft64)
25085 v.AddArg2(x, z)
25086 return true
25087 }
25088 break
25089 }
25090 return false
25091 }
25092 func rewriteValuegeneric_OpOr8(v *Value) bool {
25093 v_1 := v.Args[1]
25094 v_0 := v.Args[0]
25095 b := v.Block
25096 config := b.Func.Config
25097
25098
25099 for {
25100 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25101 if v_0.Op != OpConst8 {
25102 continue
25103 }
25104 c := auxIntToInt8(v_0.AuxInt)
25105 if v_1.Op != OpConst8 {
25106 continue
25107 }
25108 d := auxIntToInt8(v_1.AuxInt)
25109 v.reset(OpConst8)
25110 v.AuxInt = int8ToAuxInt(c | d)
25111 return true
25112 }
25113 break
25114 }
25115
25116
25117 for {
25118 t := v.Type
25119 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25120 if v_0.Op != OpCom8 {
25121 continue
25122 }
25123 x := v_0.Args[0]
25124 if v_1.Op != OpCom8 {
25125 continue
25126 }
25127 y := v_1.Args[0]
25128 v.reset(OpCom8)
25129 v0 := b.NewValue0(v.Pos, OpAnd8, t)
25130 v0.AddArg2(x, y)
25131 v.AddArg(v0)
25132 return true
25133 }
25134 break
25135 }
25136
25137
25138 for {
25139 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25140 x := v_0
25141 if v_1.Op != OpAnd8 {
25142 continue
25143 }
25144 _ = v_1.Args[1]
25145 v_1_0 := v_1.Args[0]
25146 v_1_1 := v_1.Args[1]
25147 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
25148 if x != v_1_0 {
25149 continue
25150 }
25151 v.copyOf(x)
25152 return true
25153 }
25154 }
25155 break
25156 }
25157
25158
25159 for {
25160 x := v_0
25161 if x != v_1 {
25162 break
25163 }
25164 v.copyOf(x)
25165 return true
25166 }
25167
25168
25169 for {
25170 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25171 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
25172 continue
25173 }
25174 x := v_1
25175 v.copyOf(x)
25176 return true
25177 }
25178 break
25179 }
25180
25181
25182 for {
25183 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25184 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
25185 continue
25186 }
25187 v.reset(OpConst8)
25188 v.AuxInt = int8ToAuxInt(-1)
25189 return true
25190 }
25191 break
25192 }
25193
25194
25195 for {
25196 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25197 if v_0.Op != OpCom8 {
25198 continue
25199 }
25200 x := v_0.Args[0]
25201 if x != v_1 {
25202 continue
25203 }
25204 v.reset(OpConst8)
25205 v.AuxInt = int8ToAuxInt(-1)
25206 return true
25207 }
25208 break
25209 }
25210
25211
25212 for {
25213 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25214 x := v_0
25215 if v_1.Op != OpOr8 {
25216 continue
25217 }
25218 _ = v_1.Args[1]
25219 v_1_0 := v_1.Args[0]
25220 v_1_1 := v_1.Args[1]
25221 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
25222 if x != v_1_0 {
25223 continue
25224 }
25225 y := v_1_1
25226 v.reset(OpOr8)
25227 v.AddArg2(x, y)
25228 return true
25229 }
25230 }
25231 break
25232 }
25233
25234
25235
25236 for {
25237 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25238 if v_0.Op != OpAnd8 {
25239 continue
25240 }
25241 _ = v_0.Args[1]
25242 v_0_0 := v_0.Args[0]
25243 v_0_1 := v_0.Args[1]
25244 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
25245 x := v_0_0
25246 if v_0_1.Op != OpConst8 {
25247 continue
25248 }
25249 c2 := auxIntToInt8(v_0_1.AuxInt)
25250 if v_1.Op != OpConst8 {
25251 continue
25252 }
25253 t := v_1.Type
25254 c1 := auxIntToInt8(v_1.AuxInt)
25255 if !(^(c1 | c2) == 0) {
25256 continue
25257 }
25258 v.reset(OpOr8)
25259 v0 := b.NewValue0(v.Pos, OpConst8, t)
25260 v0.AuxInt = int8ToAuxInt(c1)
25261 v.AddArg2(v0, x)
25262 return true
25263 }
25264 }
25265 break
25266 }
25267
25268
25269
25270 for {
25271 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25272 if v_0.Op != OpOr8 {
25273 continue
25274 }
25275 _ = v_0.Args[1]
25276 v_0_0 := v_0.Args[0]
25277 v_0_1 := v_0.Args[1]
25278 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
25279 i := v_0_0
25280 if i.Op != OpConst8 {
25281 continue
25282 }
25283 t := i.Type
25284 z := v_0_1
25285 x := v_1
25286 if !(z.Op != OpConst8 && x.Op != OpConst8) {
25287 continue
25288 }
25289 v.reset(OpOr8)
25290 v0 := b.NewValue0(v.Pos, OpOr8, t)
25291 v0.AddArg2(z, x)
25292 v.AddArg2(i, v0)
25293 return true
25294 }
25295 }
25296 break
25297 }
25298
25299
25300 for {
25301 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25302 if v_0.Op != OpConst8 {
25303 continue
25304 }
25305 t := v_0.Type
25306 c := auxIntToInt8(v_0.AuxInt)
25307 if v_1.Op != OpOr8 {
25308 continue
25309 }
25310 _ = v_1.Args[1]
25311 v_1_0 := v_1.Args[0]
25312 v_1_1 := v_1.Args[1]
25313 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
25314 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
25315 continue
25316 }
25317 d := auxIntToInt8(v_1_0.AuxInt)
25318 x := v_1_1
25319 v.reset(OpOr8)
25320 v0 := b.NewValue0(v.Pos, OpConst8, t)
25321 v0.AuxInt = int8ToAuxInt(c | d)
25322 v.AddArg2(v0, x)
25323 return true
25324 }
25325 }
25326 break
25327 }
25328
25329
25330
25331 for {
25332 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25333 if v_0.Op != OpLsh8x64 {
25334 continue
25335 }
25336 _ = v_0.Args[1]
25337 x := v_0.Args[0]
25338 z := v_0.Args[1]
25339 if z.Op != OpConst64 {
25340 continue
25341 }
25342 c := auxIntToInt64(z.AuxInt)
25343 if v_1.Op != OpRsh8Ux64 {
25344 continue
25345 }
25346 _ = v_1.Args[1]
25347 if x != v_1.Args[0] {
25348 continue
25349 }
25350 v_1_1 := v_1.Args[1]
25351 if v_1_1.Op != OpConst64 {
25352 continue
25353 }
25354 d := auxIntToInt64(v_1_1.AuxInt)
25355 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
25356 continue
25357 }
25358 v.reset(OpRotateLeft8)
25359 v.AddArg2(x, z)
25360 return true
25361 }
25362 break
25363 }
25364
25365
25366
25367 for {
25368 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25369 left := v_0
25370 if left.Op != OpLsh8x64 {
25371 continue
25372 }
25373 y := left.Args[1]
25374 x := left.Args[0]
25375 right := v_1
25376 if right.Op != OpRsh8Ux64 {
25377 continue
25378 }
25379 _ = right.Args[1]
25380 if x != right.Args[0] {
25381 continue
25382 }
25383 right_1 := right.Args[1]
25384 if right_1.Op != OpSub64 {
25385 continue
25386 }
25387 _ = right_1.Args[1]
25388 right_1_0 := right_1.Args[0]
25389 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
25390 continue
25391 }
25392 v.reset(OpRotateLeft8)
25393 v.AddArg2(x, y)
25394 return true
25395 }
25396 break
25397 }
25398
25399
25400
25401 for {
25402 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25403 left := v_0
25404 if left.Op != OpLsh8x32 {
25405 continue
25406 }
25407 y := left.Args[1]
25408 x := left.Args[0]
25409 right := v_1
25410 if right.Op != OpRsh8Ux32 {
25411 continue
25412 }
25413 _ = right.Args[1]
25414 if x != right.Args[0] {
25415 continue
25416 }
25417 right_1 := right.Args[1]
25418 if right_1.Op != OpSub32 {
25419 continue
25420 }
25421 _ = right_1.Args[1]
25422 right_1_0 := right_1.Args[0]
25423 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
25424 continue
25425 }
25426 v.reset(OpRotateLeft8)
25427 v.AddArg2(x, y)
25428 return true
25429 }
25430 break
25431 }
25432
25433
25434
25435 for {
25436 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25437 left := v_0
25438 if left.Op != OpLsh8x16 {
25439 continue
25440 }
25441 y := left.Args[1]
25442 x := left.Args[0]
25443 right := v_1
25444 if right.Op != OpRsh8Ux16 {
25445 continue
25446 }
25447 _ = right.Args[1]
25448 if x != right.Args[0] {
25449 continue
25450 }
25451 right_1 := right.Args[1]
25452 if right_1.Op != OpSub16 {
25453 continue
25454 }
25455 _ = right_1.Args[1]
25456 right_1_0 := right_1.Args[0]
25457 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
25458 continue
25459 }
25460 v.reset(OpRotateLeft8)
25461 v.AddArg2(x, y)
25462 return true
25463 }
25464 break
25465 }
25466
25467
25468
25469 for {
25470 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25471 left := v_0
25472 if left.Op != OpLsh8x8 {
25473 continue
25474 }
25475 y := left.Args[1]
25476 x := left.Args[0]
25477 right := v_1
25478 if right.Op != OpRsh8Ux8 {
25479 continue
25480 }
25481 _ = right.Args[1]
25482 if x != right.Args[0] {
25483 continue
25484 }
25485 right_1 := right.Args[1]
25486 if right_1.Op != OpSub8 {
25487 continue
25488 }
25489 _ = right_1.Args[1]
25490 right_1_0 := right_1.Args[0]
25491 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
25492 continue
25493 }
25494 v.reset(OpRotateLeft8)
25495 v.AddArg2(x, y)
25496 return true
25497 }
25498 break
25499 }
25500
25501
25502
25503 for {
25504 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25505 right := v_0
25506 if right.Op != OpRsh8Ux64 {
25507 continue
25508 }
25509 y := right.Args[1]
25510 x := right.Args[0]
25511 left := v_1
25512 if left.Op != OpLsh8x64 {
25513 continue
25514 }
25515 _ = left.Args[1]
25516 if x != left.Args[0] {
25517 continue
25518 }
25519 z := left.Args[1]
25520 if z.Op != OpSub64 {
25521 continue
25522 }
25523 _ = z.Args[1]
25524 z_0 := z.Args[0]
25525 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
25526 continue
25527 }
25528 v.reset(OpRotateLeft8)
25529 v.AddArg2(x, z)
25530 return true
25531 }
25532 break
25533 }
25534
25535
25536
25537 for {
25538 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25539 right := v_0
25540 if right.Op != OpRsh8Ux32 {
25541 continue
25542 }
25543 y := right.Args[1]
25544 x := right.Args[0]
25545 left := v_1
25546 if left.Op != OpLsh8x32 {
25547 continue
25548 }
25549 _ = left.Args[1]
25550 if x != left.Args[0] {
25551 continue
25552 }
25553 z := left.Args[1]
25554 if z.Op != OpSub32 {
25555 continue
25556 }
25557 _ = z.Args[1]
25558 z_0 := z.Args[0]
25559 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
25560 continue
25561 }
25562 v.reset(OpRotateLeft8)
25563 v.AddArg2(x, z)
25564 return true
25565 }
25566 break
25567 }
25568
25569
25570
25571 for {
25572 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25573 right := v_0
25574 if right.Op != OpRsh8Ux16 {
25575 continue
25576 }
25577 y := right.Args[1]
25578 x := right.Args[0]
25579 left := v_1
25580 if left.Op != OpLsh8x16 {
25581 continue
25582 }
25583 _ = left.Args[1]
25584 if x != left.Args[0] {
25585 continue
25586 }
25587 z := left.Args[1]
25588 if z.Op != OpSub16 {
25589 continue
25590 }
25591 _ = z.Args[1]
25592 z_0 := z.Args[0]
25593 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
25594 continue
25595 }
25596 v.reset(OpRotateLeft8)
25597 v.AddArg2(x, z)
25598 return true
25599 }
25600 break
25601 }
25602
25603
25604
25605 for {
25606 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25607 right := v_0
25608 if right.Op != OpRsh8Ux8 {
25609 continue
25610 }
25611 y := right.Args[1]
25612 x := right.Args[0]
25613 left := v_1
25614 if left.Op != OpLsh8x8 {
25615 continue
25616 }
25617 _ = left.Args[1]
25618 if x != left.Args[0] {
25619 continue
25620 }
25621 z := left.Args[1]
25622 if z.Op != OpSub8 {
25623 continue
25624 }
25625 _ = z.Args[1]
25626 z_0 := z.Args[0]
25627 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
25628 continue
25629 }
25630 v.reset(OpRotateLeft8)
25631 v.AddArg2(x, z)
25632 return true
25633 }
25634 break
25635 }
25636 return false
25637 }
25638 func rewriteValuegeneric_OpOrB(v *Value) bool {
25639 v_1 := v.Args[1]
25640 v_0 := v.Args[0]
25641 b := v.Block
25642 typ := &b.Func.Config.Types
25643
25644
25645
25646 for {
25647 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25648 if v_0.Op != OpLess64 {
25649 continue
25650 }
25651 x := v_0.Args[1]
25652 v_0_0 := v_0.Args[0]
25653 if v_0_0.Op != OpConst64 {
25654 continue
25655 }
25656 c := auxIntToInt64(v_0_0.AuxInt)
25657 if v_1.Op != OpLess64 {
25658 continue
25659 }
25660 _ = v_1.Args[1]
25661 if x != v_1.Args[0] {
25662 continue
25663 }
25664 v_1_1 := v_1.Args[1]
25665 if v_1_1.Op != OpConst64 {
25666 continue
25667 }
25668 d := auxIntToInt64(v_1_1.AuxInt)
25669 if !(c >= d) {
25670 continue
25671 }
25672 v.reset(OpLess64U)
25673 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
25674 v0.AuxInt = int64ToAuxInt(c - d)
25675 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
25676 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
25677 v2.AuxInt = int64ToAuxInt(d)
25678 v1.AddArg2(x, v2)
25679 v.AddArg2(v0, v1)
25680 return true
25681 }
25682 break
25683 }
25684
25685
25686
25687 for {
25688 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25689 if v_0.Op != OpLeq64 {
25690 continue
25691 }
25692 x := v_0.Args[1]
25693 v_0_0 := v_0.Args[0]
25694 if v_0_0.Op != OpConst64 {
25695 continue
25696 }
25697 c := auxIntToInt64(v_0_0.AuxInt)
25698 if v_1.Op != OpLess64 {
25699 continue
25700 }
25701 _ = v_1.Args[1]
25702 if x != v_1.Args[0] {
25703 continue
25704 }
25705 v_1_1 := v_1.Args[1]
25706 if v_1_1.Op != OpConst64 {
25707 continue
25708 }
25709 d := auxIntToInt64(v_1_1.AuxInt)
25710 if !(c >= d) {
25711 continue
25712 }
25713 v.reset(OpLeq64U)
25714 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
25715 v0.AuxInt = int64ToAuxInt(c - d)
25716 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
25717 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
25718 v2.AuxInt = int64ToAuxInt(d)
25719 v1.AddArg2(x, v2)
25720 v.AddArg2(v0, v1)
25721 return true
25722 }
25723 break
25724 }
25725
25726
25727
25728 for {
25729 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25730 if v_0.Op != OpLess32 {
25731 continue
25732 }
25733 x := v_0.Args[1]
25734 v_0_0 := v_0.Args[0]
25735 if v_0_0.Op != OpConst32 {
25736 continue
25737 }
25738 c := auxIntToInt32(v_0_0.AuxInt)
25739 if v_1.Op != OpLess32 {
25740 continue
25741 }
25742 _ = v_1.Args[1]
25743 if x != v_1.Args[0] {
25744 continue
25745 }
25746 v_1_1 := v_1.Args[1]
25747 if v_1_1.Op != OpConst32 {
25748 continue
25749 }
25750 d := auxIntToInt32(v_1_1.AuxInt)
25751 if !(c >= d) {
25752 continue
25753 }
25754 v.reset(OpLess32U)
25755 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
25756 v0.AuxInt = int32ToAuxInt(c - d)
25757 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
25758 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
25759 v2.AuxInt = int32ToAuxInt(d)
25760 v1.AddArg2(x, v2)
25761 v.AddArg2(v0, v1)
25762 return true
25763 }
25764 break
25765 }
25766
25767
25768
25769 for {
25770 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25771 if v_0.Op != OpLeq32 {
25772 continue
25773 }
25774 x := v_0.Args[1]
25775 v_0_0 := v_0.Args[0]
25776 if v_0_0.Op != OpConst32 {
25777 continue
25778 }
25779 c := auxIntToInt32(v_0_0.AuxInt)
25780 if v_1.Op != OpLess32 {
25781 continue
25782 }
25783 _ = v_1.Args[1]
25784 if x != v_1.Args[0] {
25785 continue
25786 }
25787 v_1_1 := v_1.Args[1]
25788 if v_1_1.Op != OpConst32 {
25789 continue
25790 }
25791 d := auxIntToInt32(v_1_1.AuxInt)
25792 if !(c >= d) {
25793 continue
25794 }
25795 v.reset(OpLeq32U)
25796 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
25797 v0.AuxInt = int32ToAuxInt(c - d)
25798 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
25799 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
25800 v2.AuxInt = int32ToAuxInt(d)
25801 v1.AddArg2(x, v2)
25802 v.AddArg2(v0, v1)
25803 return true
25804 }
25805 break
25806 }
25807
25808
25809
25810 for {
25811 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25812 if v_0.Op != OpLess16 {
25813 continue
25814 }
25815 x := v_0.Args[1]
25816 v_0_0 := v_0.Args[0]
25817 if v_0_0.Op != OpConst16 {
25818 continue
25819 }
25820 c := auxIntToInt16(v_0_0.AuxInt)
25821 if v_1.Op != OpLess16 {
25822 continue
25823 }
25824 _ = v_1.Args[1]
25825 if x != v_1.Args[0] {
25826 continue
25827 }
25828 v_1_1 := v_1.Args[1]
25829 if v_1_1.Op != OpConst16 {
25830 continue
25831 }
25832 d := auxIntToInt16(v_1_1.AuxInt)
25833 if !(c >= d) {
25834 continue
25835 }
25836 v.reset(OpLess16U)
25837 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
25838 v0.AuxInt = int16ToAuxInt(c - d)
25839 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
25840 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
25841 v2.AuxInt = int16ToAuxInt(d)
25842 v1.AddArg2(x, v2)
25843 v.AddArg2(v0, v1)
25844 return true
25845 }
25846 break
25847 }
25848
25849
25850
25851 for {
25852 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25853 if v_0.Op != OpLeq16 {
25854 continue
25855 }
25856 x := v_0.Args[1]
25857 v_0_0 := v_0.Args[0]
25858 if v_0_0.Op != OpConst16 {
25859 continue
25860 }
25861 c := auxIntToInt16(v_0_0.AuxInt)
25862 if v_1.Op != OpLess16 {
25863 continue
25864 }
25865 _ = v_1.Args[1]
25866 if x != v_1.Args[0] {
25867 continue
25868 }
25869 v_1_1 := v_1.Args[1]
25870 if v_1_1.Op != OpConst16 {
25871 continue
25872 }
25873 d := auxIntToInt16(v_1_1.AuxInt)
25874 if !(c >= d) {
25875 continue
25876 }
25877 v.reset(OpLeq16U)
25878 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
25879 v0.AuxInt = int16ToAuxInt(c - d)
25880 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
25881 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
25882 v2.AuxInt = int16ToAuxInt(d)
25883 v1.AddArg2(x, v2)
25884 v.AddArg2(v0, v1)
25885 return true
25886 }
25887 break
25888 }
25889
25890
25891
25892 for {
25893 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25894 if v_0.Op != OpLess8 {
25895 continue
25896 }
25897 x := v_0.Args[1]
25898 v_0_0 := v_0.Args[0]
25899 if v_0_0.Op != OpConst8 {
25900 continue
25901 }
25902 c := auxIntToInt8(v_0_0.AuxInt)
25903 if v_1.Op != OpLess8 {
25904 continue
25905 }
25906 _ = v_1.Args[1]
25907 if x != v_1.Args[0] {
25908 continue
25909 }
25910 v_1_1 := v_1.Args[1]
25911 if v_1_1.Op != OpConst8 {
25912 continue
25913 }
25914 d := auxIntToInt8(v_1_1.AuxInt)
25915 if !(c >= d) {
25916 continue
25917 }
25918 v.reset(OpLess8U)
25919 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
25920 v0.AuxInt = int8ToAuxInt(c - d)
25921 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
25922 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
25923 v2.AuxInt = int8ToAuxInt(d)
25924 v1.AddArg2(x, v2)
25925 v.AddArg2(v0, v1)
25926 return true
25927 }
25928 break
25929 }
25930
25931
25932
25933 for {
25934 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25935 if v_0.Op != OpLeq8 {
25936 continue
25937 }
25938 x := v_0.Args[1]
25939 v_0_0 := v_0.Args[0]
25940 if v_0_0.Op != OpConst8 {
25941 continue
25942 }
25943 c := auxIntToInt8(v_0_0.AuxInt)
25944 if v_1.Op != OpLess8 {
25945 continue
25946 }
25947 _ = v_1.Args[1]
25948 if x != v_1.Args[0] {
25949 continue
25950 }
25951 v_1_1 := v_1.Args[1]
25952 if v_1_1.Op != OpConst8 {
25953 continue
25954 }
25955 d := auxIntToInt8(v_1_1.AuxInt)
25956 if !(c >= d) {
25957 continue
25958 }
25959 v.reset(OpLeq8U)
25960 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
25961 v0.AuxInt = int8ToAuxInt(c - d)
25962 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
25963 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
25964 v2.AuxInt = int8ToAuxInt(d)
25965 v1.AddArg2(x, v2)
25966 v.AddArg2(v0, v1)
25967 return true
25968 }
25969 break
25970 }
25971
25972
25973
25974 for {
25975 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
25976 if v_0.Op != OpLess64 {
25977 continue
25978 }
25979 x := v_0.Args[1]
25980 v_0_0 := v_0.Args[0]
25981 if v_0_0.Op != OpConst64 {
25982 continue
25983 }
25984 c := auxIntToInt64(v_0_0.AuxInt)
25985 if v_1.Op != OpLeq64 {
25986 continue
25987 }
25988 _ = v_1.Args[1]
25989 if x != v_1.Args[0] {
25990 continue
25991 }
25992 v_1_1 := v_1.Args[1]
25993 if v_1_1.Op != OpConst64 {
25994 continue
25995 }
25996 d := auxIntToInt64(v_1_1.AuxInt)
25997 if !(c >= d+1 && d+1 > d) {
25998 continue
25999 }
26000 v.reset(OpLess64U)
26001 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
26002 v0.AuxInt = int64ToAuxInt(c - d - 1)
26003 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
26004 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
26005 v2.AuxInt = int64ToAuxInt(d + 1)
26006 v1.AddArg2(x, v2)
26007 v.AddArg2(v0, v1)
26008 return true
26009 }
26010 break
26011 }
26012
26013
26014
26015 for {
26016 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26017 if v_0.Op != OpLeq64 {
26018 continue
26019 }
26020 x := v_0.Args[1]
26021 v_0_0 := v_0.Args[0]
26022 if v_0_0.Op != OpConst64 {
26023 continue
26024 }
26025 c := auxIntToInt64(v_0_0.AuxInt)
26026 if v_1.Op != OpLeq64 {
26027 continue
26028 }
26029 _ = v_1.Args[1]
26030 if x != v_1.Args[0] {
26031 continue
26032 }
26033 v_1_1 := v_1.Args[1]
26034 if v_1_1.Op != OpConst64 {
26035 continue
26036 }
26037 d := auxIntToInt64(v_1_1.AuxInt)
26038 if !(c >= d+1 && d+1 > d) {
26039 continue
26040 }
26041 v.reset(OpLeq64U)
26042 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
26043 v0.AuxInt = int64ToAuxInt(c - d - 1)
26044 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
26045 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
26046 v2.AuxInt = int64ToAuxInt(d + 1)
26047 v1.AddArg2(x, v2)
26048 v.AddArg2(v0, v1)
26049 return true
26050 }
26051 break
26052 }
26053
26054
26055
26056 for {
26057 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26058 if v_0.Op != OpLess32 {
26059 continue
26060 }
26061 x := v_0.Args[1]
26062 v_0_0 := v_0.Args[0]
26063 if v_0_0.Op != OpConst32 {
26064 continue
26065 }
26066 c := auxIntToInt32(v_0_0.AuxInt)
26067 if v_1.Op != OpLeq32 {
26068 continue
26069 }
26070 _ = v_1.Args[1]
26071 if x != v_1.Args[0] {
26072 continue
26073 }
26074 v_1_1 := v_1.Args[1]
26075 if v_1_1.Op != OpConst32 {
26076 continue
26077 }
26078 d := auxIntToInt32(v_1_1.AuxInt)
26079 if !(c >= d+1 && d+1 > d) {
26080 continue
26081 }
26082 v.reset(OpLess32U)
26083 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
26084 v0.AuxInt = int32ToAuxInt(c - d - 1)
26085 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
26086 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
26087 v2.AuxInt = int32ToAuxInt(d + 1)
26088 v1.AddArg2(x, v2)
26089 v.AddArg2(v0, v1)
26090 return true
26091 }
26092 break
26093 }
26094
26095
26096
26097 for {
26098 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26099 if v_0.Op != OpLeq32 {
26100 continue
26101 }
26102 x := v_0.Args[1]
26103 v_0_0 := v_0.Args[0]
26104 if v_0_0.Op != OpConst32 {
26105 continue
26106 }
26107 c := auxIntToInt32(v_0_0.AuxInt)
26108 if v_1.Op != OpLeq32 {
26109 continue
26110 }
26111 _ = v_1.Args[1]
26112 if x != v_1.Args[0] {
26113 continue
26114 }
26115 v_1_1 := v_1.Args[1]
26116 if v_1_1.Op != OpConst32 {
26117 continue
26118 }
26119 d := auxIntToInt32(v_1_1.AuxInt)
26120 if !(c >= d+1 && d+1 > d) {
26121 continue
26122 }
26123 v.reset(OpLeq32U)
26124 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
26125 v0.AuxInt = int32ToAuxInt(c - d - 1)
26126 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
26127 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
26128 v2.AuxInt = int32ToAuxInt(d + 1)
26129 v1.AddArg2(x, v2)
26130 v.AddArg2(v0, v1)
26131 return true
26132 }
26133 break
26134 }
26135
26136
26137
26138 for {
26139 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26140 if v_0.Op != OpLess16 {
26141 continue
26142 }
26143 x := v_0.Args[1]
26144 v_0_0 := v_0.Args[0]
26145 if v_0_0.Op != OpConst16 {
26146 continue
26147 }
26148 c := auxIntToInt16(v_0_0.AuxInt)
26149 if v_1.Op != OpLeq16 {
26150 continue
26151 }
26152 _ = v_1.Args[1]
26153 if x != v_1.Args[0] {
26154 continue
26155 }
26156 v_1_1 := v_1.Args[1]
26157 if v_1_1.Op != OpConst16 {
26158 continue
26159 }
26160 d := auxIntToInt16(v_1_1.AuxInt)
26161 if !(c >= d+1 && d+1 > d) {
26162 continue
26163 }
26164 v.reset(OpLess16U)
26165 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
26166 v0.AuxInt = int16ToAuxInt(c - d - 1)
26167 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
26168 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
26169 v2.AuxInt = int16ToAuxInt(d + 1)
26170 v1.AddArg2(x, v2)
26171 v.AddArg2(v0, v1)
26172 return true
26173 }
26174 break
26175 }
26176
26177
26178
26179 for {
26180 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26181 if v_0.Op != OpLeq16 {
26182 continue
26183 }
26184 x := v_0.Args[1]
26185 v_0_0 := v_0.Args[0]
26186 if v_0_0.Op != OpConst16 {
26187 continue
26188 }
26189 c := auxIntToInt16(v_0_0.AuxInt)
26190 if v_1.Op != OpLeq16 {
26191 continue
26192 }
26193 _ = v_1.Args[1]
26194 if x != v_1.Args[0] {
26195 continue
26196 }
26197 v_1_1 := v_1.Args[1]
26198 if v_1_1.Op != OpConst16 {
26199 continue
26200 }
26201 d := auxIntToInt16(v_1_1.AuxInt)
26202 if !(c >= d+1 && d+1 > d) {
26203 continue
26204 }
26205 v.reset(OpLeq16U)
26206 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
26207 v0.AuxInt = int16ToAuxInt(c - d - 1)
26208 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
26209 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
26210 v2.AuxInt = int16ToAuxInt(d + 1)
26211 v1.AddArg2(x, v2)
26212 v.AddArg2(v0, v1)
26213 return true
26214 }
26215 break
26216 }
26217
26218
26219
26220 for {
26221 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26222 if v_0.Op != OpLess8 {
26223 continue
26224 }
26225 x := v_0.Args[1]
26226 v_0_0 := v_0.Args[0]
26227 if v_0_0.Op != OpConst8 {
26228 continue
26229 }
26230 c := auxIntToInt8(v_0_0.AuxInt)
26231 if v_1.Op != OpLeq8 {
26232 continue
26233 }
26234 _ = v_1.Args[1]
26235 if x != v_1.Args[0] {
26236 continue
26237 }
26238 v_1_1 := v_1.Args[1]
26239 if v_1_1.Op != OpConst8 {
26240 continue
26241 }
26242 d := auxIntToInt8(v_1_1.AuxInt)
26243 if !(c >= d+1 && d+1 > d) {
26244 continue
26245 }
26246 v.reset(OpLess8U)
26247 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
26248 v0.AuxInt = int8ToAuxInt(c - d - 1)
26249 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
26250 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
26251 v2.AuxInt = int8ToAuxInt(d + 1)
26252 v1.AddArg2(x, v2)
26253 v.AddArg2(v0, v1)
26254 return true
26255 }
26256 break
26257 }
26258
26259
26260
26261 for {
26262 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26263 if v_0.Op != OpLeq8 {
26264 continue
26265 }
26266 x := v_0.Args[1]
26267 v_0_0 := v_0.Args[0]
26268 if v_0_0.Op != OpConst8 {
26269 continue
26270 }
26271 c := auxIntToInt8(v_0_0.AuxInt)
26272 if v_1.Op != OpLeq8 {
26273 continue
26274 }
26275 _ = v_1.Args[1]
26276 if x != v_1.Args[0] {
26277 continue
26278 }
26279 v_1_1 := v_1.Args[1]
26280 if v_1_1.Op != OpConst8 {
26281 continue
26282 }
26283 d := auxIntToInt8(v_1_1.AuxInt)
26284 if !(c >= d+1 && d+1 > d) {
26285 continue
26286 }
26287 v.reset(OpLeq8U)
26288 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
26289 v0.AuxInt = int8ToAuxInt(c - d - 1)
26290 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
26291 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
26292 v2.AuxInt = int8ToAuxInt(d + 1)
26293 v1.AddArg2(x, v2)
26294 v.AddArg2(v0, v1)
26295 return true
26296 }
26297 break
26298 }
26299
26300
26301
26302 for {
26303 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26304 if v_0.Op != OpLess64U {
26305 continue
26306 }
26307 x := v_0.Args[1]
26308 v_0_0 := v_0.Args[0]
26309 if v_0_0.Op != OpConst64 {
26310 continue
26311 }
26312 c := auxIntToInt64(v_0_0.AuxInt)
26313 if v_1.Op != OpLess64U {
26314 continue
26315 }
26316 _ = v_1.Args[1]
26317 if x != v_1.Args[0] {
26318 continue
26319 }
26320 v_1_1 := v_1.Args[1]
26321 if v_1_1.Op != OpConst64 {
26322 continue
26323 }
26324 d := auxIntToInt64(v_1_1.AuxInt)
26325 if !(uint64(c) >= uint64(d)) {
26326 continue
26327 }
26328 v.reset(OpLess64U)
26329 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
26330 v0.AuxInt = int64ToAuxInt(c - d)
26331 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
26332 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
26333 v2.AuxInt = int64ToAuxInt(d)
26334 v1.AddArg2(x, v2)
26335 v.AddArg2(v0, v1)
26336 return true
26337 }
26338 break
26339 }
26340
26341
26342
26343 for {
26344 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26345 if v_0.Op != OpLeq64U {
26346 continue
26347 }
26348 x := v_0.Args[1]
26349 v_0_0 := v_0.Args[0]
26350 if v_0_0.Op != OpConst64 {
26351 continue
26352 }
26353 c := auxIntToInt64(v_0_0.AuxInt)
26354 if v_1.Op != OpLess64U {
26355 continue
26356 }
26357 _ = v_1.Args[1]
26358 if x != v_1.Args[0] {
26359 continue
26360 }
26361 v_1_1 := v_1.Args[1]
26362 if v_1_1.Op != OpConst64 {
26363 continue
26364 }
26365 d := auxIntToInt64(v_1_1.AuxInt)
26366 if !(uint64(c) >= uint64(d)) {
26367 continue
26368 }
26369 v.reset(OpLeq64U)
26370 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
26371 v0.AuxInt = int64ToAuxInt(c - d)
26372 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
26373 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
26374 v2.AuxInt = int64ToAuxInt(d)
26375 v1.AddArg2(x, v2)
26376 v.AddArg2(v0, v1)
26377 return true
26378 }
26379 break
26380 }
26381
26382
26383
26384 for {
26385 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26386 if v_0.Op != OpLess32U {
26387 continue
26388 }
26389 x := v_0.Args[1]
26390 v_0_0 := v_0.Args[0]
26391 if v_0_0.Op != OpConst32 {
26392 continue
26393 }
26394 c := auxIntToInt32(v_0_0.AuxInt)
26395 if v_1.Op != OpLess32U {
26396 continue
26397 }
26398 _ = v_1.Args[1]
26399 if x != v_1.Args[0] {
26400 continue
26401 }
26402 v_1_1 := v_1.Args[1]
26403 if v_1_1.Op != OpConst32 {
26404 continue
26405 }
26406 d := auxIntToInt32(v_1_1.AuxInt)
26407 if !(uint32(c) >= uint32(d)) {
26408 continue
26409 }
26410 v.reset(OpLess32U)
26411 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
26412 v0.AuxInt = int32ToAuxInt(c - d)
26413 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
26414 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
26415 v2.AuxInt = int32ToAuxInt(d)
26416 v1.AddArg2(x, v2)
26417 v.AddArg2(v0, v1)
26418 return true
26419 }
26420 break
26421 }
26422
26423
26424
26425 for {
26426 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26427 if v_0.Op != OpLeq32U {
26428 continue
26429 }
26430 x := v_0.Args[1]
26431 v_0_0 := v_0.Args[0]
26432 if v_0_0.Op != OpConst32 {
26433 continue
26434 }
26435 c := auxIntToInt32(v_0_0.AuxInt)
26436 if v_1.Op != OpLess32U {
26437 continue
26438 }
26439 _ = v_1.Args[1]
26440 if x != v_1.Args[0] {
26441 continue
26442 }
26443 v_1_1 := v_1.Args[1]
26444 if v_1_1.Op != OpConst32 {
26445 continue
26446 }
26447 d := auxIntToInt32(v_1_1.AuxInt)
26448 if !(uint32(c) >= uint32(d)) {
26449 continue
26450 }
26451 v.reset(OpLeq32U)
26452 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
26453 v0.AuxInt = int32ToAuxInt(c - d)
26454 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
26455 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
26456 v2.AuxInt = int32ToAuxInt(d)
26457 v1.AddArg2(x, v2)
26458 v.AddArg2(v0, v1)
26459 return true
26460 }
26461 break
26462 }
26463
26464
26465
26466 for {
26467 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26468 if v_0.Op != OpLess16U {
26469 continue
26470 }
26471 x := v_0.Args[1]
26472 v_0_0 := v_0.Args[0]
26473 if v_0_0.Op != OpConst16 {
26474 continue
26475 }
26476 c := auxIntToInt16(v_0_0.AuxInt)
26477 if v_1.Op != OpLess16U {
26478 continue
26479 }
26480 _ = v_1.Args[1]
26481 if x != v_1.Args[0] {
26482 continue
26483 }
26484 v_1_1 := v_1.Args[1]
26485 if v_1_1.Op != OpConst16 {
26486 continue
26487 }
26488 d := auxIntToInt16(v_1_1.AuxInt)
26489 if !(uint16(c) >= uint16(d)) {
26490 continue
26491 }
26492 v.reset(OpLess16U)
26493 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
26494 v0.AuxInt = int16ToAuxInt(c - d)
26495 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
26496 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
26497 v2.AuxInt = int16ToAuxInt(d)
26498 v1.AddArg2(x, v2)
26499 v.AddArg2(v0, v1)
26500 return true
26501 }
26502 break
26503 }
26504
26505
26506
26507 for {
26508 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26509 if v_0.Op != OpLeq16U {
26510 continue
26511 }
26512 x := v_0.Args[1]
26513 v_0_0 := v_0.Args[0]
26514 if v_0_0.Op != OpConst16 {
26515 continue
26516 }
26517 c := auxIntToInt16(v_0_0.AuxInt)
26518 if v_1.Op != OpLess16U {
26519 continue
26520 }
26521 _ = v_1.Args[1]
26522 if x != v_1.Args[0] {
26523 continue
26524 }
26525 v_1_1 := v_1.Args[1]
26526 if v_1_1.Op != OpConst16 {
26527 continue
26528 }
26529 d := auxIntToInt16(v_1_1.AuxInt)
26530 if !(uint16(c) >= uint16(d)) {
26531 continue
26532 }
26533 v.reset(OpLeq16U)
26534 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
26535 v0.AuxInt = int16ToAuxInt(c - d)
26536 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
26537 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
26538 v2.AuxInt = int16ToAuxInt(d)
26539 v1.AddArg2(x, v2)
26540 v.AddArg2(v0, v1)
26541 return true
26542 }
26543 break
26544 }
26545
26546
26547
26548 for {
26549 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26550 if v_0.Op != OpLess8U {
26551 continue
26552 }
26553 x := v_0.Args[1]
26554 v_0_0 := v_0.Args[0]
26555 if v_0_0.Op != OpConst8 {
26556 continue
26557 }
26558 c := auxIntToInt8(v_0_0.AuxInt)
26559 if v_1.Op != OpLess8U {
26560 continue
26561 }
26562 _ = v_1.Args[1]
26563 if x != v_1.Args[0] {
26564 continue
26565 }
26566 v_1_1 := v_1.Args[1]
26567 if v_1_1.Op != OpConst8 {
26568 continue
26569 }
26570 d := auxIntToInt8(v_1_1.AuxInt)
26571 if !(uint8(c) >= uint8(d)) {
26572 continue
26573 }
26574 v.reset(OpLess8U)
26575 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
26576 v0.AuxInt = int8ToAuxInt(c - d)
26577 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
26578 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
26579 v2.AuxInt = int8ToAuxInt(d)
26580 v1.AddArg2(x, v2)
26581 v.AddArg2(v0, v1)
26582 return true
26583 }
26584 break
26585 }
26586
26587
26588
26589 for {
26590 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26591 if v_0.Op != OpLeq8U {
26592 continue
26593 }
26594 x := v_0.Args[1]
26595 v_0_0 := v_0.Args[0]
26596 if v_0_0.Op != OpConst8 {
26597 continue
26598 }
26599 c := auxIntToInt8(v_0_0.AuxInt)
26600 if v_1.Op != OpLess8U {
26601 continue
26602 }
26603 _ = v_1.Args[1]
26604 if x != v_1.Args[0] {
26605 continue
26606 }
26607 v_1_1 := v_1.Args[1]
26608 if v_1_1.Op != OpConst8 {
26609 continue
26610 }
26611 d := auxIntToInt8(v_1_1.AuxInt)
26612 if !(uint8(c) >= uint8(d)) {
26613 continue
26614 }
26615 v.reset(OpLeq8U)
26616 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
26617 v0.AuxInt = int8ToAuxInt(c - d)
26618 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
26619 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
26620 v2.AuxInt = int8ToAuxInt(d)
26621 v1.AddArg2(x, v2)
26622 v.AddArg2(v0, v1)
26623 return true
26624 }
26625 break
26626 }
26627
26628
26629
26630 for {
26631 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26632 if v_0.Op != OpLess64U {
26633 continue
26634 }
26635 x := v_0.Args[1]
26636 v_0_0 := v_0.Args[0]
26637 if v_0_0.Op != OpConst64 {
26638 continue
26639 }
26640 c := auxIntToInt64(v_0_0.AuxInt)
26641 if v_1.Op != OpLeq64U {
26642 continue
26643 }
26644 _ = v_1.Args[1]
26645 if x != v_1.Args[0] {
26646 continue
26647 }
26648 v_1_1 := v_1.Args[1]
26649 if v_1_1.Op != OpConst64 {
26650 continue
26651 }
26652 d := auxIntToInt64(v_1_1.AuxInt)
26653 if !(uint64(c) >= uint64(d+1) && uint64(d+1) > uint64(d)) {
26654 continue
26655 }
26656 v.reset(OpLess64U)
26657 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
26658 v0.AuxInt = int64ToAuxInt(c - d - 1)
26659 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
26660 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
26661 v2.AuxInt = int64ToAuxInt(d + 1)
26662 v1.AddArg2(x, v2)
26663 v.AddArg2(v0, v1)
26664 return true
26665 }
26666 break
26667 }
26668
26669
26670
26671 for {
26672 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26673 if v_0.Op != OpLeq64U {
26674 continue
26675 }
26676 x := v_0.Args[1]
26677 v_0_0 := v_0.Args[0]
26678 if v_0_0.Op != OpConst64 {
26679 continue
26680 }
26681 c := auxIntToInt64(v_0_0.AuxInt)
26682 if v_1.Op != OpLeq64U {
26683 continue
26684 }
26685 _ = v_1.Args[1]
26686 if x != v_1.Args[0] {
26687 continue
26688 }
26689 v_1_1 := v_1.Args[1]
26690 if v_1_1.Op != OpConst64 {
26691 continue
26692 }
26693 d := auxIntToInt64(v_1_1.AuxInt)
26694 if !(uint64(c) >= uint64(d+1) && uint64(d+1) > uint64(d)) {
26695 continue
26696 }
26697 v.reset(OpLeq64U)
26698 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
26699 v0.AuxInt = int64ToAuxInt(c - d - 1)
26700 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
26701 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
26702 v2.AuxInt = int64ToAuxInt(d + 1)
26703 v1.AddArg2(x, v2)
26704 v.AddArg2(v0, v1)
26705 return true
26706 }
26707 break
26708 }
26709
26710
26711
26712 for {
26713 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26714 if v_0.Op != OpLess32U {
26715 continue
26716 }
26717 x := v_0.Args[1]
26718 v_0_0 := v_0.Args[0]
26719 if v_0_0.Op != OpConst32 {
26720 continue
26721 }
26722 c := auxIntToInt32(v_0_0.AuxInt)
26723 if v_1.Op != OpLeq32U {
26724 continue
26725 }
26726 _ = v_1.Args[1]
26727 if x != v_1.Args[0] {
26728 continue
26729 }
26730 v_1_1 := v_1.Args[1]
26731 if v_1_1.Op != OpConst32 {
26732 continue
26733 }
26734 d := auxIntToInt32(v_1_1.AuxInt)
26735 if !(uint32(c) >= uint32(d+1) && uint32(d+1) > uint32(d)) {
26736 continue
26737 }
26738 v.reset(OpLess32U)
26739 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
26740 v0.AuxInt = int32ToAuxInt(c - d - 1)
26741 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
26742 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
26743 v2.AuxInt = int32ToAuxInt(d + 1)
26744 v1.AddArg2(x, v2)
26745 v.AddArg2(v0, v1)
26746 return true
26747 }
26748 break
26749 }
26750
26751
26752
26753 for {
26754 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26755 if v_0.Op != OpLeq32U {
26756 continue
26757 }
26758 x := v_0.Args[1]
26759 v_0_0 := v_0.Args[0]
26760 if v_0_0.Op != OpConst32 {
26761 continue
26762 }
26763 c := auxIntToInt32(v_0_0.AuxInt)
26764 if v_1.Op != OpLeq32U {
26765 continue
26766 }
26767 _ = v_1.Args[1]
26768 if x != v_1.Args[0] {
26769 continue
26770 }
26771 v_1_1 := v_1.Args[1]
26772 if v_1_1.Op != OpConst32 {
26773 continue
26774 }
26775 d := auxIntToInt32(v_1_1.AuxInt)
26776 if !(uint32(c) >= uint32(d+1) && uint32(d+1) > uint32(d)) {
26777 continue
26778 }
26779 v.reset(OpLeq32U)
26780 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
26781 v0.AuxInt = int32ToAuxInt(c - d - 1)
26782 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
26783 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
26784 v2.AuxInt = int32ToAuxInt(d + 1)
26785 v1.AddArg2(x, v2)
26786 v.AddArg2(v0, v1)
26787 return true
26788 }
26789 break
26790 }
26791
26792
26793
26794 for {
26795 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26796 if v_0.Op != OpLess16U {
26797 continue
26798 }
26799 x := v_0.Args[1]
26800 v_0_0 := v_0.Args[0]
26801 if v_0_0.Op != OpConst16 {
26802 continue
26803 }
26804 c := auxIntToInt16(v_0_0.AuxInt)
26805 if v_1.Op != OpLeq16U {
26806 continue
26807 }
26808 _ = v_1.Args[1]
26809 if x != v_1.Args[0] {
26810 continue
26811 }
26812 v_1_1 := v_1.Args[1]
26813 if v_1_1.Op != OpConst16 {
26814 continue
26815 }
26816 d := auxIntToInt16(v_1_1.AuxInt)
26817 if !(uint16(c) >= uint16(d+1) && uint16(d+1) > uint16(d)) {
26818 continue
26819 }
26820 v.reset(OpLess16U)
26821 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
26822 v0.AuxInt = int16ToAuxInt(c - d - 1)
26823 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
26824 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
26825 v2.AuxInt = int16ToAuxInt(d + 1)
26826 v1.AddArg2(x, v2)
26827 v.AddArg2(v0, v1)
26828 return true
26829 }
26830 break
26831 }
26832
26833
26834
26835 for {
26836 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26837 if v_0.Op != OpLeq16U {
26838 continue
26839 }
26840 x := v_0.Args[1]
26841 v_0_0 := v_0.Args[0]
26842 if v_0_0.Op != OpConst16 {
26843 continue
26844 }
26845 c := auxIntToInt16(v_0_0.AuxInt)
26846 if v_1.Op != OpLeq16U {
26847 continue
26848 }
26849 _ = v_1.Args[1]
26850 if x != v_1.Args[0] {
26851 continue
26852 }
26853 v_1_1 := v_1.Args[1]
26854 if v_1_1.Op != OpConst16 {
26855 continue
26856 }
26857 d := auxIntToInt16(v_1_1.AuxInt)
26858 if !(uint16(c) >= uint16(d+1) && uint16(d+1) > uint16(d)) {
26859 continue
26860 }
26861 v.reset(OpLeq16U)
26862 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
26863 v0.AuxInt = int16ToAuxInt(c - d - 1)
26864 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
26865 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
26866 v2.AuxInt = int16ToAuxInt(d + 1)
26867 v1.AddArg2(x, v2)
26868 v.AddArg2(v0, v1)
26869 return true
26870 }
26871 break
26872 }
26873
26874
26875
26876 for {
26877 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26878 if v_0.Op != OpLess8U {
26879 continue
26880 }
26881 x := v_0.Args[1]
26882 v_0_0 := v_0.Args[0]
26883 if v_0_0.Op != OpConst8 {
26884 continue
26885 }
26886 c := auxIntToInt8(v_0_0.AuxInt)
26887 if v_1.Op != OpLeq8U {
26888 continue
26889 }
26890 _ = v_1.Args[1]
26891 if x != v_1.Args[0] {
26892 continue
26893 }
26894 v_1_1 := v_1.Args[1]
26895 if v_1_1.Op != OpConst8 {
26896 continue
26897 }
26898 d := auxIntToInt8(v_1_1.AuxInt)
26899 if !(uint8(c) >= uint8(d+1) && uint8(d+1) > uint8(d)) {
26900 continue
26901 }
26902 v.reset(OpLess8U)
26903 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
26904 v0.AuxInt = int8ToAuxInt(c - d - 1)
26905 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
26906 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
26907 v2.AuxInt = int8ToAuxInt(d + 1)
26908 v1.AddArg2(x, v2)
26909 v.AddArg2(v0, v1)
26910 return true
26911 }
26912 break
26913 }
26914
26915
26916
26917 for {
26918 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26919 if v_0.Op != OpLeq8U {
26920 continue
26921 }
26922 x := v_0.Args[1]
26923 v_0_0 := v_0.Args[0]
26924 if v_0_0.Op != OpConst8 {
26925 continue
26926 }
26927 c := auxIntToInt8(v_0_0.AuxInt)
26928 if v_1.Op != OpLeq8U {
26929 continue
26930 }
26931 _ = v_1.Args[1]
26932 if x != v_1.Args[0] {
26933 continue
26934 }
26935 v_1_1 := v_1.Args[1]
26936 if v_1_1.Op != OpConst8 {
26937 continue
26938 }
26939 d := auxIntToInt8(v_1_1.AuxInt)
26940 if !(uint8(c) >= uint8(d+1) && uint8(d+1) > uint8(d)) {
26941 continue
26942 }
26943 v.reset(OpLeq8U)
26944 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
26945 v0.AuxInt = int8ToAuxInt(c - d - 1)
26946 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
26947 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
26948 v2.AuxInt = int8ToAuxInt(d + 1)
26949 v1.AddArg2(x, v2)
26950 v.AddArg2(v0, v1)
26951 return true
26952 }
26953 break
26954 }
26955
26956
26957
26958 for {
26959 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
26960 if v_0.Op != OpEq64 {
26961 continue
26962 }
26963 _ = v_0.Args[1]
26964 v_0_0 := v_0.Args[0]
26965 v_0_1 := v_0.Args[1]
26966 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
26967 x := v_0_0
26968 cv := v_0_1
26969 if cv.Op != OpConst64 {
26970 continue
26971 }
26972 c := auxIntToInt64(cv.AuxInt)
26973 if v_1.Op != OpEq64 {
26974 continue
26975 }
26976 _ = v_1.Args[1]
26977 v_1_0 := v_1.Args[0]
26978 v_1_1 := v_1.Args[1]
26979 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
26980 if x != v_1_0 || v_1_1.Op != OpConst64 {
26981 continue
26982 }
26983 d := auxIntToInt64(v_1_1.AuxInt)
26984 if !(c|d == c && oneBit(c^d)) {
26985 continue
26986 }
26987 v.reset(OpEq64)
26988 v0 := b.NewValue0(v.Pos, OpOr64, x.Type)
26989 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
26990 v1.AuxInt = int64ToAuxInt(c ^ d)
26991 v0.AddArg2(x, v1)
26992 v.AddArg2(v0, cv)
26993 return true
26994 }
26995 }
26996 }
26997 break
26998 }
26999
27000
27001
27002 for {
27003 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27004 if v_0.Op != OpEq32 {
27005 continue
27006 }
27007 _ = v_0.Args[1]
27008 v_0_0 := v_0.Args[0]
27009 v_0_1 := v_0.Args[1]
27010 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
27011 x := v_0_0
27012 cv := v_0_1
27013 if cv.Op != OpConst32 {
27014 continue
27015 }
27016 c := auxIntToInt32(cv.AuxInt)
27017 if v_1.Op != OpEq32 {
27018 continue
27019 }
27020 _ = v_1.Args[1]
27021 v_1_0 := v_1.Args[0]
27022 v_1_1 := v_1.Args[1]
27023 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
27024 if x != v_1_0 || v_1_1.Op != OpConst32 {
27025 continue
27026 }
27027 d := auxIntToInt32(v_1_1.AuxInt)
27028 if !(c|d == c && oneBit(c^d)) {
27029 continue
27030 }
27031 v.reset(OpEq32)
27032 v0 := b.NewValue0(v.Pos, OpOr32, x.Type)
27033 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
27034 v1.AuxInt = int32ToAuxInt(c ^ d)
27035 v0.AddArg2(x, v1)
27036 v.AddArg2(v0, cv)
27037 return true
27038 }
27039 }
27040 }
27041 break
27042 }
27043
27044
27045
27046 for {
27047 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27048 if v_0.Op != OpEq16 {
27049 continue
27050 }
27051 _ = v_0.Args[1]
27052 v_0_0 := v_0.Args[0]
27053 v_0_1 := v_0.Args[1]
27054 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
27055 x := v_0_0
27056 cv := v_0_1
27057 if cv.Op != OpConst16 {
27058 continue
27059 }
27060 c := auxIntToInt16(cv.AuxInt)
27061 if v_1.Op != OpEq16 {
27062 continue
27063 }
27064 _ = v_1.Args[1]
27065 v_1_0 := v_1.Args[0]
27066 v_1_1 := v_1.Args[1]
27067 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
27068 if x != v_1_0 || v_1_1.Op != OpConst16 {
27069 continue
27070 }
27071 d := auxIntToInt16(v_1_1.AuxInt)
27072 if !(c|d == c && oneBit(c^d)) {
27073 continue
27074 }
27075 v.reset(OpEq16)
27076 v0 := b.NewValue0(v.Pos, OpOr16, x.Type)
27077 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
27078 v1.AuxInt = int16ToAuxInt(c ^ d)
27079 v0.AddArg2(x, v1)
27080 v.AddArg2(v0, cv)
27081 return true
27082 }
27083 }
27084 }
27085 break
27086 }
27087
27088
27089
27090 for {
27091 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27092 if v_0.Op != OpEq8 {
27093 continue
27094 }
27095 _ = v_0.Args[1]
27096 v_0_0 := v_0.Args[0]
27097 v_0_1 := v_0.Args[1]
27098 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
27099 x := v_0_0
27100 cv := v_0_1
27101 if cv.Op != OpConst8 {
27102 continue
27103 }
27104 c := auxIntToInt8(cv.AuxInt)
27105 if v_1.Op != OpEq8 {
27106 continue
27107 }
27108 _ = v_1.Args[1]
27109 v_1_0 := v_1.Args[0]
27110 v_1_1 := v_1.Args[1]
27111 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
27112 if x != v_1_0 || v_1_1.Op != OpConst8 {
27113 continue
27114 }
27115 d := auxIntToInt8(v_1_1.AuxInt)
27116 if !(c|d == c && oneBit(c^d)) {
27117 continue
27118 }
27119 v.reset(OpEq8)
27120 v0 := b.NewValue0(v.Pos, OpOr8, x.Type)
27121 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
27122 v1.AuxInt = int8ToAuxInt(c ^ d)
27123 v0.AddArg2(x, v1)
27124 v.AddArg2(v0, cv)
27125 return true
27126 }
27127 }
27128 }
27129 break
27130 }
27131
27132
27133 for {
27134 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27135 if v_0.Op != OpNeq64F {
27136 continue
27137 }
27138 x := v_0.Args[1]
27139 if x != v_0.Args[0] || v_1.Op != OpLess64F {
27140 continue
27141 }
27142 _ = v_1.Args[1]
27143 if x != v_1.Args[0] {
27144 continue
27145 }
27146 y := v_1.Args[1]
27147 if y.Op != OpConst64F {
27148 continue
27149 }
27150 v.reset(OpNot)
27151 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
27152 v0.AddArg2(y, x)
27153 v.AddArg(v0)
27154 return true
27155 }
27156 break
27157 }
27158
27159
27160 for {
27161 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27162 if v_0.Op != OpNeq64F {
27163 continue
27164 }
27165 x := v_0.Args[1]
27166 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
27167 continue
27168 }
27169 _ = v_1.Args[1]
27170 if x != v_1.Args[0] {
27171 continue
27172 }
27173 y := v_1.Args[1]
27174 if y.Op != OpConst64F {
27175 continue
27176 }
27177 v.reset(OpNot)
27178 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
27179 v0.AddArg2(y, x)
27180 v.AddArg(v0)
27181 return true
27182 }
27183 break
27184 }
27185
27186
27187 for {
27188 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27189 if v_0.Op != OpNeq64F {
27190 continue
27191 }
27192 x := v_0.Args[1]
27193 if x != v_0.Args[0] || v_1.Op != OpLess64F {
27194 continue
27195 }
27196 _ = v_1.Args[1]
27197 y := v_1.Args[0]
27198 if y.Op != OpConst64F {
27199 continue
27200 }
27201 if x != v_1.Args[1] {
27202 continue
27203 }
27204 v.reset(OpNot)
27205 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
27206 v0.AddArg2(x, y)
27207 v.AddArg(v0)
27208 return true
27209 }
27210 break
27211 }
27212
27213
27214 for {
27215 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27216 if v_0.Op != OpNeq64F {
27217 continue
27218 }
27219 x := v_0.Args[1]
27220 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
27221 continue
27222 }
27223 _ = v_1.Args[1]
27224 y := v_1.Args[0]
27225 if y.Op != OpConst64F {
27226 continue
27227 }
27228 if x != v_1.Args[1] {
27229 continue
27230 }
27231 v.reset(OpNot)
27232 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
27233 v0.AddArg2(x, y)
27234 v.AddArg(v0)
27235 return true
27236 }
27237 break
27238 }
27239
27240
27241 for {
27242 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27243 if v_0.Op != OpNeq32F {
27244 continue
27245 }
27246 x := v_0.Args[1]
27247 if x != v_0.Args[0] || v_1.Op != OpLess32F {
27248 continue
27249 }
27250 _ = v_1.Args[1]
27251 if x != v_1.Args[0] {
27252 continue
27253 }
27254 y := v_1.Args[1]
27255 if y.Op != OpConst32F {
27256 continue
27257 }
27258 v.reset(OpNot)
27259 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
27260 v0.AddArg2(y, x)
27261 v.AddArg(v0)
27262 return true
27263 }
27264 break
27265 }
27266
27267
27268 for {
27269 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27270 if v_0.Op != OpNeq32F {
27271 continue
27272 }
27273 x := v_0.Args[1]
27274 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
27275 continue
27276 }
27277 _ = v_1.Args[1]
27278 if x != v_1.Args[0] {
27279 continue
27280 }
27281 y := v_1.Args[1]
27282 if y.Op != OpConst32F {
27283 continue
27284 }
27285 v.reset(OpNot)
27286 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
27287 v0.AddArg2(y, x)
27288 v.AddArg(v0)
27289 return true
27290 }
27291 break
27292 }
27293
27294
27295 for {
27296 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27297 if v_0.Op != OpNeq32F {
27298 continue
27299 }
27300 x := v_0.Args[1]
27301 if x != v_0.Args[0] || v_1.Op != OpLess32F {
27302 continue
27303 }
27304 _ = v_1.Args[1]
27305 y := v_1.Args[0]
27306 if y.Op != OpConst32F {
27307 continue
27308 }
27309 if x != v_1.Args[1] {
27310 continue
27311 }
27312 v.reset(OpNot)
27313 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
27314 v0.AddArg2(x, y)
27315 v.AddArg(v0)
27316 return true
27317 }
27318 break
27319 }
27320
27321
27322 for {
27323 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27324 if v_0.Op != OpNeq32F {
27325 continue
27326 }
27327 x := v_0.Args[1]
27328 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
27329 continue
27330 }
27331 _ = v_1.Args[1]
27332 y := v_1.Args[0]
27333 if y.Op != OpConst32F {
27334 continue
27335 }
27336 if x != v_1.Args[1] {
27337 continue
27338 }
27339 v.reset(OpNot)
27340 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
27341 v0.AddArg2(x, y)
27342 v.AddArg(v0)
27343 return true
27344 }
27345 break
27346 }
27347
27348
27349 for {
27350 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27351 if v_0.Op != OpNeq64F {
27352 continue
27353 }
27354 x := v_0.Args[1]
27355 if x != v_0.Args[0] || v_1.Op != OpLess64F {
27356 continue
27357 }
27358 _ = v_1.Args[1]
27359 abs := v_1.Args[0]
27360 if abs.Op != OpAbs || x != abs.Args[0] {
27361 continue
27362 }
27363 y := v_1.Args[1]
27364 if y.Op != OpConst64F {
27365 continue
27366 }
27367 v.reset(OpNot)
27368 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
27369 v0.AddArg2(y, abs)
27370 v.AddArg(v0)
27371 return true
27372 }
27373 break
27374 }
27375
27376
27377 for {
27378 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27379 if v_0.Op != OpNeq64F {
27380 continue
27381 }
27382 x := v_0.Args[1]
27383 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
27384 continue
27385 }
27386 _ = v_1.Args[1]
27387 abs := v_1.Args[0]
27388 if abs.Op != OpAbs || x != abs.Args[0] {
27389 continue
27390 }
27391 y := v_1.Args[1]
27392 if y.Op != OpConst64F {
27393 continue
27394 }
27395 v.reset(OpNot)
27396 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
27397 v0.AddArg2(y, abs)
27398 v.AddArg(v0)
27399 return true
27400 }
27401 break
27402 }
27403
27404
27405 for {
27406 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27407 if v_0.Op != OpNeq64F {
27408 continue
27409 }
27410 x := v_0.Args[1]
27411 if x != v_0.Args[0] || v_1.Op != OpLess64F {
27412 continue
27413 }
27414 _ = v_1.Args[1]
27415 y := v_1.Args[0]
27416 if y.Op != OpConst64F {
27417 continue
27418 }
27419 abs := v_1.Args[1]
27420 if abs.Op != OpAbs || x != abs.Args[0] {
27421 continue
27422 }
27423 v.reset(OpNot)
27424 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
27425 v0.AddArg2(abs, y)
27426 v.AddArg(v0)
27427 return true
27428 }
27429 break
27430 }
27431
27432
27433 for {
27434 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27435 if v_0.Op != OpNeq64F {
27436 continue
27437 }
27438 x := v_0.Args[1]
27439 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
27440 continue
27441 }
27442 _ = v_1.Args[1]
27443 y := v_1.Args[0]
27444 if y.Op != OpConst64F {
27445 continue
27446 }
27447 abs := v_1.Args[1]
27448 if abs.Op != OpAbs || x != abs.Args[0] {
27449 continue
27450 }
27451 v.reset(OpNot)
27452 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
27453 v0.AddArg2(abs, y)
27454 v.AddArg(v0)
27455 return true
27456 }
27457 break
27458 }
27459
27460
27461 for {
27462 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27463 if v_0.Op != OpNeq64F {
27464 continue
27465 }
27466 x := v_0.Args[1]
27467 if x != v_0.Args[0] || v_1.Op != OpLess64F {
27468 continue
27469 }
27470 _ = v_1.Args[1]
27471 neg := v_1.Args[0]
27472 if neg.Op != OpNeg64F || x != neg.Args[0] {
27473 continue
27474 }
27475 y := v_1.Args[1]
27476 if y.Op != OpConst64F {
27477 continue
27478 }
27479 v.reset(OpNot)
27480 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
27481 v0.AddArg2(y, neg)
27482 v.AddArg(v0)
27483 return true
27484 }
27485 break
27486 }
27487
27488
27489 for {
27490 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27491 if v_0.Op != OpNeq64F {
27492 continue
27493 }
27494 x := v_0.Args[1]
27495 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
27496 continue
27497 }
27498 _ = v_1.Args[1]
27499 neg := v_1.Args[0]
27500 if neg.Op != OpNeg64F || x != neg.Args[0] {
27501 continue
27502 }
27503 y := v_1.Args[1]
27504 if y.Op != OpConst64F {
27505 continue
27506 }
27507 v.reset(OpNot)
27508 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
27509 v0.AddArg2(y, neg)
27510 v.AddArg(v0)
27511 return true
27512 }
27513 break
27514 }
27515
27516
27517 for {
27518 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27519 if v_0.Op != OpNeq64F {
27520 continue
27521 }
27522 x := v_0.Args[1]
27523 if x != v_0.Args[0] || v_1.Op != OpLess64F {
27524 continue
27525 }
27526 _ = v_1.Args[1]
27527 y := v_1.Args[0]
27528 if y.Op != OpConst64F {
27529 continue
27530 }
27531 neg := v_1.Args[1]
27532 if neg.Op != OpNeg64F || x != neg.Args[0] {
27533 continue
27534 }
27535 v.reset(OpNot)
27536 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
27537 v0.AddArg2(neg, y)
27538 v.AddArg(v0)
27539 return true
27540 }
27541 break
27542 }
27543
27544
27545 for {
27546 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27547 if v_0.Op != OpNeq64F {
27548 continue
27549 }
27550 x := v_0.Args[1]
27551 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
27552 continue
27553 }
27554 _ = v_1.Args[1]
27555 y := v_1.Args[0]
27556 if y.Op != OpConst64F {
27557 continue
27558 }
27559 neg := v_1.Args[1]
27560 if neg.Op != OpNeg64F || x != neg.Args[0] {
27561 continue
27562 }
27563 v.reset(OpNot)
27564 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
27565 v0.AddArg2(neg, y)
27566 v.AddArg(v0)
27567 return true
27568 }
27569 break
27570 }
27571
27572
27573 for {
27574 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27575 if v_0.Op != OpNeq32F {
27576 continue
27577 }
27578 x := v_0.Args[1]
27579 if x != v_0.Args[0] || v_1.Op != OpLess32F {
27580 continue
27581 }
27582 _ = v_1.Args[1]
27583 neg := v_1.Args[0]
27584 if neg.Op != OpNeg32F || x != neg.Args[0] {
27585 continue
27586 }
27587 y := v_1.Args[1]
27588 if y.Op != OpConst32F {
27589 continue
27590 }
27591 v.reset(OpNot)
27592 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
27593 v0.AddArg2(y, neg)
27594 v.AddArg(v0)
27595 return true
27596 }
27597 break
27598 }
27599
27600
27601 for {
27602 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27603 if v_0.Op != OpNeq32F {
27604 continue
27605 }
27606 x := v_0.Args[1]
27607 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
27608 continue
27609 }
27610 _ = v_1.Args[1]
27611 neg := v_1.Args[0]
27612 if neg.Op != OpNeg32F || x != neg.Args[0] {
27613 continue
27614 }
27615 y := v_1.Args[1]
27616 if y.Op != OpConst32F {
27617 continue
27618 }
27619 v.reset(OpNot)
27620 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
27621 v0.AddArg2(y, neg)
27622 v.AddArg(v0)
27623 return true
27624 }
27625 break
27626 }
27627
27628
27629 for {
27630 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27631 if v_0.Op != OpNeq32F {
27632 continue
27633 }
27634 x := v_0.Args[1]
27635 if x != v_0.Args[0] || v_1.Op != OpLess32F {
27636 continue
27637 }
27638 _ = v_1.Args[1]
27639 y := v_1.Args[0]
27640 if y.Op != OpConst32F {
27641 continue
27642 }
27643 neg := v_1.Args[1]
27644 if neg.Op != OpNeg32F || x != neg.Args[0] {
27645 continue
27646 }
27647 v.reset(OpNot)
27648 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
27649 v0.AddArg2(neg, y)
27650 v.AddArg(v0)
27651 return true
27652 }
27653 break
27654 }
27655
27656
27657 for {
27658 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
27659 if v_0.Op != OpNeq32F {
27660 continue
27661 }
27662 x := v_0.Args[1]
27663 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
27664 continue
27665 }
27666 _ = v_1.Args[1]
27667 y := v_1.Args[0]
27668 if y.Op != OpConst32F {
27669 continue
27670 }
27671 neg := v_1.Args[1]
27672 if neg.Op != OpNeg32F || x != neg.Args[0] {
27673 continue
27674 }
27675 v.reset(OpNot)
27676 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
27677 v0.AddArg2(neg, y)
27678 v.AddArg(v0)
27679 return true
27680 }
27681 break
27682 }
27683 return false
27684 }
27685 func rewriteValuegeneric_OpPhi(v *Value) bool {
27686 b := v.Block
27687
27688
27689 for {
27690 if len(v.Args) != 2 {
27691 break
27692 }
27693 _ = v.Args[1]
27694 v_0 := v.Args[0]
27695 if v_0.Op != OpConst8 {
27696 break
27697 }
27698 c := auxIntToInt8(v_0.AuxInt)
27699 v_1 := v.Args[1]
27700 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != c {
27701 break
27702 }
27703 v.reset(OpConst8)
27704 v.AuxInt = int8ToAuxInt(c)
27705 return true
27706 }
27707
27708
27709 for {
27710 if len(v.Args) != 2 {
27711 break
27712 }
27713 _ = v.Args[1]
27714 v_0 := v.Args[0]
27715 if v_0.Op != OpConst16 {
27716 break
27717 }
27718 c := auxIntToInt16(v_0.AuxInt)
27719 v_1 := v.Args[1]
27720 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != c {
27721 break
27722 }
27723 v.reset(OpConst16)
27724 v.AuxInt = int16ToAuxInt(c)
27725 return true
27726 }
27727
27728
27729 for {
27730 if len(v.Args) != 2 {
27731 break
27732 }
27733 _ = v.Args[1]
27734 v_0 := v.Args[0]
27735 if v_0.Op != OpConst32 {
27736 break
27737 }
27738 c := auxIntToInt32(v_0.AuxInt)
27739 v_1 := v.Args[1]
27740 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != c {
27741 break
27742 }
27743 v.reset(OpConst32)
27744 v.AuxInt = int32ToAuxInt(c)
27745 return true
27746 }
27747
27748
27749 for {
27750 if len(v.Args) != 2 {
27751 break
27752 }
27753 _ = v.Args[1]
27754 v_0 := v.Args[0]
27755 if v_0.Op != OpConst64 {
27756 break
27757 }
27758 c := auxIntToInt64(v_0.AuxInt)
27759 v_1 := v.Args[1]
27760 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c {
27761 break
27762 }
27763 v.reset(OpConst64)
27764 v.AuxInt = int64ToAuxInt(c)
27765 return true
27766 }
27767
27768
27769
27770 for {
27771 if len(v.Args) != 2 {
27772 break
27773 }
27774 t := v.Type
27775 _ = v.Args[1]
27776 nx := v.Args[0]
27777 if nx.Op != OpNot {
27778 break
27779 }
27780 x := nx.Args[0]
27781 ny := v.Args[1]
27782 if ny.Op != OpNot {
27783 break
27784 }
27785 y := ny.Args[0]
27786 if !(nx.Uses == 1 && ny.Uses == 1) {
27787 break
27788 }
27789 v.reset(OpNot)
27790 v0 := b.NewValue0(v.Pos, OpPhi, t)
27791 v0.AddArg2(x, y)
27792 v.AddArg(v0)
27793 return true
27794 }
27795 return false
27796 }
27797 func rewriteValuegeneric_OpPopCount16(v *Value) bool {
27798 v_0 := v.Args[0]
27799 b := v.Block
27800 config := b.Func.Config
27801
27802
27803
27804 for {
27805 if v_0.Op != OpConst16 {
27806 break
27807 }
27808 c := auxIntToInt16(v_0.AuxInt)
27809 if !(config.PtrSize == 8) {
27810 break
27811 }
27812 v.reset(OpConst64)
27813 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount16(uint16(c))))
27814 return true
27815 }
27816
27817
27818
27819 for {
27820 if v_0.Op != OpConst16 {
27821 break
27822 }
27823 c := auxIntToInt16(v_0.AuxInt)
27824 if !(config.PtrSize == 4) {
27825 break
27826 }
27827 v.reset(OpConst32)
27828 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount16(uint16(c))))
27829 return true
27830 }
27831 return false
27832 }
27833 func rewriteValuegeneric_OpPopCount32(v *Value) bool {
27834 v_0 := v.Args[0]
27835 b := v.Block
27836 config := b.Func.Config
27837
27838
27839
27840 for {
27841 if v_0.Op != OpConst32 {
27842 break
27843 }
27844 c := auxIntToInt32(v_0.AuxInt)
27845 if !(config.PtrSize == 8) {
27846 break
27847 }
27848 v.reset(OpConst64)
27849 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount32(uint32(c))))
27850 return true
27851 }
27852
27853
27854
27855 for {
27856 if v_0.Op != OpConst32 {
27857 break
27858 }
27859 c := auxIntToInt32(v_0.AuxInt)
27860 if !(config.PtrSize == 4) {
27861 break
27862 }
27863 v.reset(OpConst32)
27864 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount32(uint32(c))))
27865 return true
27866 }
27867 return false
27868 }
27869 func rewriteValuegeneric_OpPopCount64(v *Value) bool {
27870 v_0 := v.Args[0]
27871 b := v.Block
27872 config := b.Func.Config
27873
27874
27875
27876 for {
27877 if v_0.Op != OpConst64 {
27878 break
27879 }
27880 c := auxIntToInt64(v_0.AuxInt)
27881 if !(config.PtrSize == 8) {
27882 break
27883 }
27884 v.reset(OpConst64)
27885 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount64(uint64(c))))
27886 return true
27887 }
27888
27889
27890
27891 for {
27892 if v_0.Op != OpConst64 {
27893 break
27894 }
27895 c := auxIntToInt64(v_0.AuxInt)
27896 if !(config.PtrSize == 4) {
27897 break
27898 }
27899 v.reset(OpConst32)
27900 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount64(uint64(c))))
27901 return true
27902 }
27903 return false
27904 }
27905 func rewriteValuegeneric_OpPopCount8(v *Value) bool {
27906 v_0 := v.Args[0]
27907 b := v.Block
27908 config := b.Func.Config
27909
27910
27911
27912 for {
27913 if v_0.Op != OpConst8 {
27914 break
27915 }
27916 c := auxIntToInt8(v_0.AuxInt)
27917 if !(config.PtrSize == 8) {
27918 break
27919 }
27920 v.reset(OpConst64)
27921 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount8(uint8(c))))
27922 return true
27923 }
27924
27925
27926
27927 for {
27928 if v_0.Op != OpConst8 {
27929 break
27930 }
27931 c := auxIntToInt8(v_0.AuxInt)
27932 if !(config.PtrSize == 4) {
27933 break
27934 }
27935 v.reset(OpConst32)
27936 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount8(uint8(c))))
27937 return true
27938 }
27939 return false
27940 }
27941 func rewriteValuegeneric_OpPtrIndex(v *Value) bool {
27942 v_1 := v.Args[1]
27943 v_0 := v.Args[0]
27944 b := v.Block
27945 config := b.Func.Config
27946 typ := &b.Func.Config.Types
27947
27948
27949
27950 for {
27951 t := v.Type
27952 ptr := v_0
27953 idx := v_1
27954 if !(config.PtrSize == 4 && is32Bit(t.Elem().Size())) {
27955 break
27956 }
27957 v.reset(OpAddPtr)
27958 v0 := b.NewValue0(v.Pos, OpMul32, typ.Int)
27959 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
27960 v1.AuxInt = int32ToAuxInt(int32(t.Elem().Size()))
27961 v0.AddArg2(idx, v1)
27962 v.AddArg2(ptr, v0)
27963 return true
27964 }
27965
27966
27967
27968 for {
27969 t := v.Type
27970 ptr := v_0
27971 idx := v_1
27972 if !(config.PtrSize == 8) {
27973 break
27974 }
27975 v.reset(OpAddPtr)
27976 v0 := b.NewValue0(v.Pos, OpMul64, typ.Int)
27977 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
27978 v1.AuxInt = int64ToAuxInt(t.Elem().Size())
27979 v0.AddArg2(idx, v1)
27980 v.AddArg2(ptr, v0)
27981 return true
27982 }
27983 return false
27984 }
27985 func rewriteValuegeneric_OpRotateLeft16(v *Value) bool {
27986 v_1 := v.Args[1]
27987 v_0 := v.Args[0]
27988 b := v.Block
27989 config := b.Func.Config
27990
27991
27992
27993 for {
27994 x := v_0
27995 if v_1.Op != OpConst16 {
27996 break
27997 }
27998 c := auxIntToInt16(v_1.AuxInt)
27999 if !(c%16 == 0) {
28000 break
28001 }
28002 v.copyOf(x)
28003 return true
28004 }
28005
28006
28007
28008 for {
28009 x := v_0
28010 if v_1.Op != OpAnd64 {
28011 break
28012 }
28013 _ = v_1.Args[1]
28014 v_1_0 := v_1.Args[0]
28015 v_1_1 := v_1.Args[1]
28016 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28017 y := v_1_0
28018 if v_1_1.Op != OpConst64 {
28019 continue
28020 }
28021 c := auxIntToInt64(v_1_1.AuxInt)
28022 if !(c&15 == 15) {
28023 continue
28024 }
28025 v.reset(OpRotateLeft16)
28026 v.AddArg2(x, y)
28027 return true
28028 }
28029 break
28030 }
28031
28032
28033
28034 for {
28035 x := v_0
28036 if v_1.Op != OpAnd32 {
28037 break
28038 }
28039 _ = v_1.Args[1]
28040 v_1_0 := v_1.Args[0]
28041 v_1_1 := v_1.Args[1]
28042 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28043 y := v_1_0
28044 if v_1_1.Op != OpConst32 {
28045 continue
28046 }
28047 c := auxIntToInt32(v_1_1.AuxInt)
28048 if !(c&15 == 15) {
28049 continue
28050 }
28051 v.reset(OpRotateLeft16)
28052 v.AddArg2(x, y)
28053 return true
28054 }
28055 break
28056 }
28057
28058
28059
28060 for {
28061 x := v_0
28062 if v_1.Op != OpAnd16 {
28063 break
28064 }
28065 _ = v_1.Args[1]
28066 v_1_0 := v_1.Args[0]
28067 v_1_1 := v_1.Args[1]
28068 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28069 y := v_1_0
28070 if v_1_1.Op != OpConst16 {
28071 continue
28072 }
28073 c := auxIntToInt16(v_1_1.AuxInt)
28074 if !(c&15 == 15) {
28075 continue
28076 }
28077 v.reset(OpRotateLeft16)
28078 v.AddArg2(x, y)
28079 return true
28080 }
28081 break
28082 }
28083
28084
28085
28086 for {
28087 x := v_0
28088 if v_1.Op != OpAnd8 {
28089 break
28090 }
28091 _ = v_1.Args[1]
28092 v_1_0 := v_1.Args[0]
28093 v_1_1 := v_1.Args[1]
28094 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28095 y := v_1_0
28096 if v_1_1.Op != OpConst8 {
28097 continue
28098 }
28099 c := auxIntToInt8(v_1_1.AuxInt)
28100 if !(c&15 == 15) {
28101 continue
28102 }
28103 v.reset(OpRotateLeft16)
28104 v.AddArg2(x, y)
28105 return true
28106 }
28107 break
28108 }
28109
28110
28111
28112 for {
28113 x := v_0
28114 if v_1.Op != OpNeg64 {
28115 break
28116 }
28117 v_1_0 := v_1.Args[0]
28118 if v_1_0.Op != OpAnd64 {
28119 break
28120 }
28121 _ = v_1_0.Args[1]
28122 v_1_0_0 := v_1_0.Args[0]
28123 v_1_0_1 := v_1_0.Args[1]
28124 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
28125 y := v_1_0_0
28126 if v_1_0_1.Op != OpConst64 {
28127 continue
28128 }
28129 c := auxIntToInt64(v_1_0_1.AuxInt)
28130 if !(c&15 == 15) {
28131 continue
28132 }
28133 v.reset(OpRotateLeft16)
28134 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
28135 v0.AddArg(y)
28136 v.AddArg2(x, v0)
28137 return true
28138 }
28139 break
28140 }
28141
28142
28143
28144 for {
28145 x := v_0
28146 if v_1.Op != OpNeg32 {
28147 break
28148 }
28149 v_1_0 := v_1.Args[0]
28150 if v_1_0.Op != OpAnd32 {
28151 break
28152 }
28153 _ = v_1_0.Args[1]
28154 v_1_0_0 := v_1_0.Args[0]
28155 v_1_0_1 := v_1_0.Args[1]
28156 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
28157 y := v_1_0_0
28158 if v_1_0_1.Op != OpConst32 {
28159 continue
28160 }
28161 c := auxIntToInt32(v_1_0_1.AuxInt)
28162 if !(c&15 == 15) {
28163 continue
28164 }
28165 v.reset(OpRotateLeft16)
28166 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
28167 v0.AddArg(y)
28168 v.AddArg2(x, v0)
28169 return true
28170 }
28171 break
28172 }
28173
28174
28175
28176 for {
28177 x := v_0
28178 if v_1.Op != OpNeg16 {
28179 break
28180 }
28181 v_1_0 := v_1.Args[0]
28182 if v_1_0.Op != OpAnd16 {
28183 break
28184 }
28185 _ = v_1_0.Args[1]
28186 v_1_0_0 := v_1_0.Args[0]
28187 v_1_0_1 := v_1_0.Args[1]
28188 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
28189 y := v_1_0_0
28190 if v_1_0_1.Op != OpConst16 {
28191 continue
28192 }
28193 c := auxIntToInt16(v_1_0_1.AuxInt)
28194 if !(c&15 == 15) {
28195 continue
28196 }
28197 v.reset(OpRotateLeft16)
28198 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
28199 v0.AddArg(y)
28200 v.AddArg2(x, v0)
28201 return true
28202 }
28203 break
28204 }
28205
28206
28207
28208 for {
28209 x := v_0
28210 if v_1.Op != OpNeg8 {
28211 break
28212 }
28213 v_1_0 := v_1.Args[0]
28214 if v_1_0.Op != OpAnd8 {
28215 break
28216 }
28217 _ = v_1_0.Args[1]
28218 v_1_0_0 := v_1_0.Args[0]
28219 v_1_0_1 := v_1_0.Args[1]
28220 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
28221 y := v_1_0_0
28222 if v_1_0_1.Op != OpConst8 {
28223 continue
28224 }
28225 c := auxIntToInt8(v_1_0_1.AuxInt)
28226 if !(c&15 == 15) {
28227 continue
28228 }
28229 v.reset(OpRotateLeft16)
28230 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
28231 v0.AddArg(y)
28232 v.AddArg2(x, v0)
28233 return true
28234 }
28235 break
28236 }
28237
28238
28239
28240 for {
28241 x := v_0
28242 if v_1.Op != OpAdd64 {
28243 break
28244 }
28245 _ = v_1.Args[1]
28246 v_1_0 := v_1.Args[0]
28247 v_1_1 := v_1.Args[1]
28248 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28249 y := v_1_0
28250 if v_1_1.Op != OpConst64 {
28251 continue
28252 }
28253 c := auxIntToInt64(v_1_1.AuxInt)
28254 if !(c&15 == 0) {
28255 continue
28256 }
28257 v.reset(OpRotateLeft16)
28258 v.AddArg2(x, y)
28259 return true
28260 }
28261 break
28262 }
28263
28264
28265
28266 for {
28267 x := v_0
28268 if v_1.Op != OpAdd32 {
28269 break
28270 }
28271 _ = v_1.Args[1]
28272 v_1_0 := v_1.Args[0]
28273 v_1_1 := v_1.Args[1]
28274 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28275 y := v_1_0
28276 if v_1_1.Op != OpConst32 {
28277 continue
28278 }
28279 c := auxIntToInt32(v_1_1.AuxInt)
28280 if !(c&15 == 0) {
28281 continue
28282 }
28283 v.reset(OpRotateLeft16)
28284 v.AddArg2(x, y)
28285 return true
28286 }
28287 break
28288 }
28289
28290
28291
28292 for {
28293 x := v_0
28294 if v_1.Op != OpAdd16 {
28295 break
28296 }
28297 _ = v_1.Args[1]
28298 v_1_0 := v_1.Args[0]
28299 v_1_1 := v_1.Args[1]
28300 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28301 y := v_1_0
28302 if v_1_1.Op != OpConst16 {
28303 continue
28304 }
28305 c := auxIntToInt16(v_1_1.AuxInt)
28306 if !(c&15 == 0) {
28307 continue
28308 }
28309 v.reset(OpRotateLeft16)
28310 v.AddArg2(x, y)
28311 return true
28312 }
28313 break
28314 }
28315
28316
28317
28318 for {
28319 x := v_0
28320 if v_1.Op != OpAdd8 {
28321 break
28322 }
28323 _ = v_1.Args[1]
28324 v_1_0 := v_1.Args[0]
28325 v_1_1 := v_1.Args[1]
28326 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28327 y := v_1_0
28328 if v_1_1.Op != OpConst8 {
28329 continue
28330 }
28331 c := auxIntToInt8(v_1_1.AuxInt)
28332 if !(c&15 == 0) {
28333 continue
28334 }
28335 v.reset(OpRotateLeft16)
28336 v.AddArg2(x, y)
28337 return true
28338 }
28339 break
28340 }
28341
28342
28343
28344 for {
28345 x := v_0
28346 if v_1.Op != OpSub64 {
28347 break
28348 }
28349 y := v_1.Args[1]
28350 v_1_0 := v_1.Args[0]
28351 if v_1_0.Op != OpConst64 {
28352 break
28353 }
28354 c := auxIntToInt64(v_1_0.AuxInt)
28355 if !(c&15 == 0) {
28356 break
28357 }
28358 v.reset(OpRotateLeft16)
28359 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
28360 v0.AddArg(y)
28361 v.AddArg2(x, v0)
28362 return true
28363 }
28364
28365
28366
28367 for {
28368 x := v_0
28369 if v_1.Op != OpSub32 {
28370 break
28371 }
28372 y := v_1.Args[1]
28373 v_1_0 := v_1.Args[0]
28374 if v_1_0.Op != OpConst32 {
28375 break
28376 }
28377 c := auxIntToInt32(v_1_0.AuxInt)
28378 if !(c&15 == 0) {
28379 break
28380 }
28381 v.reset(OpRotateLeft16)
28382 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
28383 v0.AddArg(y)
28384 v.AddArg2(x, v0)
28385 return true
28386 }
28387
28388
28389
28390 for {
28391 x := v_0
28392 if v_1.Op != OpSub16 {
28393 break
28394 }
28395 y := v_1.Args[1]
28396 v_1_0 := v_1.Args[0]
28397 if v_1_0.Op != OpConst16 {
28398 break
28399 }
28400 c := auxIntToInt16(v_1_0.AuxInt)
28401 if !(c&15 == 0) {
28402 break
28403 }
28404 v.reset(OpRotateLeft16)
28405 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
28406 v0.AddArg(y)
28407 v.AddArg2(x, v0)
28408 return true
28409 }
28410
28411
28412
28413 for {
28414 x := v_0
28415 if v_1.Op != OpSub8 {
28416 break
28417 }
28418 y := v_1.Args[1]
28419 v_1_0 := v_1.Args[0]
28420 if v_1_0.Op != OpConst8 {
28421 break
28422 }
28423 c := auxIntToInt8(v_1_0.AuxInt)
28424 if !(c&15 == 0) {
28425 break
28426 }
28427 v.reset(OpRotateLeft16)
28428 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
28429 v0.AddArg(y)
28430 v.AddArg2(x, v0)
28431 return true
28432 }
28433
28434
28435
28436 for {
28437 x := v_0
28438 if v_1.Op != OpConst64 {
28439 break
28440 }
28441 t := v_1.Type
28442 c := auxIntToInt64(v_1.AuxInt)
28443 if !(config.PtrSize == 4) {
28444 break
28445 }
28446 v.reset(OpRotateLeft16)
28447 v0 := b.NewValue0(v.Pos, OpConst32, t)
28448 v0.AuxInt = int32ToAuxInt(int32(c))
28449 v.AddArg2(x, v0)
28450 return true
28451 }
28452
28453
28454
28455 for {
28456 if v_0.Op != OpRotateLeft16 {
28457 break
28458 }
28459 c := v_0.Args[1]
28460 x := v_0.Args[0]
28461 d := v_1
28462 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
28463 break
28464 }
28465 v.reset(OpRotateLeft16)
28466 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
28467 v0.AddArg2(c, d)
28468 v.AddArg2(x, v0)
28469 return true
28470 }
28471
28472
28473
28474 for {
28475 if v_0.Op != OpRotateLeft16 {
28476 break
28477 }
28478 c := v_0.Args[1]
28479 x := v_0.Args[0]
28480 d := v_1
28481 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
28482 break
28483 }
28484 v.reset(OpRotateLeft16)
28485 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
28486 v0.AddArg2(c, d)
28487 v.AddArg2(x, v0)
28488 return true
28489 }
28490
28491
28492
28493 for {
28494 if v_0.Op != OpRotateLeft16 {
28495 break
28496 }
28497 c := v_0.Args[1]
28498 x := v_0.Args[0]
28499 d := v_1
28500 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
28501 break
28502 }
28503 v.reset(OpRotateLeft16)
28504 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
28505 v0.AddArg2(c, d)
28506 v.AddArg2(x, v0)
28507 return true
28508 }
28509
28510
28511
28512 for {
28513 if v_0.Op != OpRotateLeft16 {
28514 break
28515 }
28516 c := v_0.Args[1]
28517 x := v_0.Args[0]
28518 d := v_1
28519 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
28520 break
28521 }
28522 v.reset(OpRotateLeft16)
28523 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
28524 v0.AddArg2(c, d)
28525 v.AddArg2(x, v0)
28526 return true
28527 }
28528 return false
28529 }
28530 func rewriteValuegeneric_OpRotateLeft32(v *Value) bool {
28531 v_1 := v.Args[1]
28532 v_0 := v.Args[0]
28533 b := v.Block
28534 config := b.Func.Config
28535
28536
28537
28538 for {
28539 x := v_0
28540 if v_1.Op != OpConst32 {
28541 break
28542 }
28543 c := auxIntToInt32(v_1.AuxInt)
28544 if !(c%32 == 0) {
28545 break
28546 }
28547 v.copyOf(x)
28548 return true
28549 }
28550
28551
28552
28553 for {
28554 x := v_0
28555 if v_1.Op != OpAnd64 {
28556 break
28557 }
28558 _ = v_1.Args[1]
28559 v_1_0 := v_1.Args[0]
28560 v_1_1 := v_1.Args[1]
28561 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28562 y := v_1_0
28563 if v_1_1.Op != OpConst64 {
28564 continue
28565 }
28566 c := auxIntToInt64(v_1_1.AuxInt)
28567 if !(c&31 == 31) {
28568 continue
28569 }
28570 v.reset(OpRotateLeft32)
28571 v.AddArg2(x, y)
28572 return true
28573 }
28574 break
28575 }
28576
28577
28578
28579 for {
28580 x := v_0
28581 if v_1.Op != OpAnd32 {
28582 break
28583 }
28584 _ = v_1.Args[1]
28585 v_1_0 := v_1.Args[0]
28586 v_1_1 := v_1.Args[1]
28587 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28588 y := v_1_0
28589 if v_1_1.Op != OpConst32 {
28590 continue
28591 }
28592 c := auxIntToInt32(v_1_1.AuxInt)
28593 if !(c&31 == 31) {
28594 continue
28595 }
28596 v.reset(OpRotateLeft32)
28597 v.AddArg2(x, y)
28598 return true
28599 }
28600 break
28601 }
28602
28603
28604
28605 for {
28606 x := v_0
28607 if v_1.Op != OpAnd16 {
28608 break
28609 }
28610 _ = v_1.Args[1]
28611 v_1_0 := v_1.Args[0]
28612 v_1_1 := v_1.Args[1]
28613 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28614 y := v_1_0
28615 if v_1_1.Op != OpConst16 {
28616 continue
28617 }
28618 c := auxIntToInt16(v_1_1.AuxInt)
28619 if !(c&31 == 31) {
28620 continue
28621 }
28622 v.reset(OpRotateLeft32)
28623 v.AddArg2(x, y)
28624 return true
28625 }
28626 break
28627 }
28628
28629
28630
28631 for {
28632 x := v_0
28633 if v_1.Op != OpAnd8 {
28634 break
28635 }
28636 _ = v_1.Args[1]
28637 v_1_0 := v_1.Args[0]
28638 v_1_1 := v_1.Args[1]
28639 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28640 y := v_1_0
28641 if v_1_1.Op != OpConst8 {
28642 continue
28643 }
28644 c := auxIntToInt8(v_1_1.AuxInt)
28645 if !(c&31 == 31) {
28646 continue
28647 }
28648 v.reset(OpRotateLeft32)
28649 v.AddArg2(x, y)
28650 return true
28651 }
28652 break
28653 }
28654
28655
28656
28657 for {
28658 x := v_0
28659 if v_1.Op != OpNeg64 {
28660 break
28661 }
28662 v_1_0 := v_1.Args[0]
28663 if v_1_0.Op != OpAnd64 {
28664 break
28665 }
28666 _ = v_1_0.Args[1]
28667 v_1_0_0 := v_1_0.Args[0]
28668 v_1_0_1 := v_1_0.Args[1]
28669 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
28670 y := v_1_0_0
28671 if v_1_0_1.Op != OpConst64 {
28672 continue
28673 }
28674 c := auxIntToInt64(v_1_0_1.AuxInt)
28675 if !(c&31 == 31) {
28676 continue
28677 }
28678 v.reset(OpRotateLeft32)
28679 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
28680 v0.AddArg(y)
28681 v.AddArg2(x, v0)
28682 return true
28683 }
28684 break
28685 }
28686
28687
28688
28689 for {
28690 x := v_0
28691 if v_1.Op != OpNeg32 {
28692 break
28693 }
28694 v_1_0 := v_1.Args[0]
28695 if v_1_0.Op != OpAnd32 {
28696 break
28697 }
28698 _ = v_1_0.Args[1]
28699 v_1_0_0 := v_1_0.Args[0]
28700 v_1_0_1 := v_1_0.Args[1]
28701 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
28702 y := v_1_0_0
28703 if v_1_0_1.Op != OpConst32 {
28704 continue
28705 }
28706 c := auxIntToInt32(v_1_0_1.AuxInt)
28707 if !(c&31 == 31) {
28708 continue
28709 }
28710 v.reset(OpRotateLeft32)
28711 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
28712 v0.AddArg(y)
28713 v.AddArg2(x, v0)
28714 return true
28715 }
28716 break
28717 }
28718
28719
28720
28721 for {
28722 x := v_0
28723 if v_1.Op != OpNeg16 {
28724 break
28725 }
28726 v_1_0 := v_1.Args[0]
28727 if v_1_0.Op != OpAnd16 {
28728 break
28729 }
28730 _ = v_1_0.Args[1]
28731 v_1_0_0 := v_1_0.Args[0]
28732 v_1_0_1 := v_1_0.Args[1]
28733 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
28734 y := v_1_0_0
28735 if v_1_0_1.Op != OpConst16 {
28736 continue
28737 }
28738 c := auxIntToInt16(v_1_0_1.AuxInt)
28739 if !(c&31 == 31) {
28740 continue
28741 }
28742 v.reset(OpRotateLeft32)
28743 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
28744 v0.AddArg(y)
28745 v.AddArg2(x, v0)
28746 return true
28747 }
28748 break
28749 }
28750
28751
28752
28753 for {
28754 x := v_0
28755 if v_1.Op != OpNeg8 {
28756 break
28757 }
28758 v_1_0 := v_1.Args[0]
28759 if v_1_0.Op != OpAnd8 {
28760 break
28761 }
28762 _ = v_1_0.Args[1]
28763 v_1_0_0 := v_1_0.Args[0]
28764 v_1_0_1 := v_1_0.Args[1]
28765 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
28766 y := v_1_0_0
28767 if v_1_0_1.Op != OpConst8 {
28768 continue
28769 }
28770 c := auxIntToInt8(v_1_0_1.AuxInt)
28771 if !(c&31 == 31) {
28772 continue
28773 }
28774 v.reset(OpRotateLeft32)
28775 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
28776 v0.AddArg(y)
28777 v.AddArg2(x, v0)
28778 return true
28779 }
28780 break
28781 }
28782
28783
28784
28785 for {
28786 x := v_0
28787 if v_1.Op != OpAdd64 {
28788 break
28789 }
28790 _ = v_1.Args[1]
28791 v_1_0 := v_1.Args[0]
28792 v_1_1 := v_1.Args[1]
28793 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28794 y := v_1_0
28795 if v_1_1.Op != OpConst64 {
28796 continue
28797 }
28798 c := auxIntToInt64(v_1_1.AuxInt)
28799 if !(c&31 == 0) {
28800 continue
28801 }
28802 v.reset(OpRotateLeft32)
28803 v.AddArg2(x, y)
28804 return true
28805 }
28806 break
28807 }
28808
28809
28810
28811 for {
28812 x := v_0
28813 if v_1.Op != OpAdd32 {
28814 break
28815 }
28816 _ = v_1.Args[1]
28817 v_1_0 := v_1.Args[0]
28818 v_1_1 := v_1.Args[1]
28819 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28820 y := v_1_0
28821 if v_1_1.Op != OpConst32 {
28822 continue
28823 }
28824 c := auxIntToInt32(v_1_1.AuxInt)
28825 if !(c&31 == 0) {
28826 continue
28827 }
28828 v.reset(OpRotateLeft32)
28829 v.AddArg2(x, y)
28830 return true
28831 }
28832 break
28833 }
28834
28835
28836
28837 for {
28838 x := v_0
28839 if v_1.Op != OpAdd16 {
28840 break
28841 }
28842 _ = v_1.Args[1]
28843 v_1_0 := v_1.Args[0]
28844 v_1_1 := v_1.Args[1]
28845 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28846 y := v_1_0
28847 if v_1_1.Op != OpConst16 {
28848 continue
28849 }
28850 c := auxIntToInt16(v_1_1.AuxInt)
28851 if !(c&31 == 0) {
28852 continue
28853 }
28854 v.reset(OpRotateLeft32)
28855 v.AddArg2(x, y)
28856 return true
28857 }
28858 break
28859 }
28860
28861
28862
28863 for {
28864 x := v_0
28865 if v_1.Op != OpAdd8 {
28866 break
28867 }
28868 _ = v_1.Args[1]
28869 v_1_0 := v_1.Args[0]
28870 v_1_1 := v_1.Args[1]
28871 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
28872 y := v_1_0
28873 if v_1_1.Op != OpConst8 {
28874 continue
28875 }
28876 c := auxIntToInt8(v_1_1.AuxInt)
28877 if !(c&31 == 0) {
28878 continue
28879 }
28880 v.reset(OpRotateLeft32)
28881 v.AddArg2(x, y)
28882 return true
28883 }
28884 break
28885 }
28886
28887
28888
28889 for {
28890 x := v_0
28891 if v_1.Op != OpSub64 {
28892 break
28893 }
28894 y := v_1.Args[1]
28895 v_1_0 := v_1.Args[0]
28896 if v_1_0.Op != OpConst64 {
28897 break
28898 }
28899 c := auxIntToInt64(v_1_0.AuxInt)
28900 if !(c&31 == 0) {
28901 break
28902 }
28903 v.reset(OpRotateLeft32)
28904 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
28905 v0.AddArg(y)
28906 v.AddArg2(x, v0)
28907 return true
28908 }
28909
28910
28911
28912 for {
28913 x := v_0
28914 if v_1.Op != OpSub32 {
28915 break
28916 }
28917 y := v_1.Args[1]
28918 v_1_0 := v_1.Args[0]
28919 if v_1_0.Op != OpConst32 {
28920 break
28921 }
28922 c := auxIntToInt32(v_1_0.AuxInt)
28923 if !(c&31 == 0) {
28924 break
28925 }
28926 v.reset(OpRotateLeft32)
28927 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
28928 v0.AddArg(y)
28929 v.AddArg2(x, v0)
28930 return true
28931 }
28932
28933
28934
28935 for {
28936 x := v_0
28937 if v_1.Op != OpSub16 {
28938 break
28939 }
28940 y := v_1.Args[1]
28941 v_1_0 := v_1.Args[0]
28942 if v_1_0.Op != OpConst16 {
28943 break
28944 }
28945 c := auxIntToInt16(v_1_0.AuxInt)
28946 if !(c&31 == 0) {
28947 break
28948 }
28949 v.reset(OpRotateLeft32)
28950 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
28951 v0.AddArg(y)
28952 v.AddArg2(x, v0)
28953 return true
28954 }
28955
28956
28957
28958 for {
28959 x := v_0
28960 if v_1.Op != OpSub8 {
28961 break
28962 }
28963 y := v_1.Args[1]
28964 v_1_0 := v_1.Args[0]
28965 if v_1_0.Op != OpConst8 {
28966 break
28967 }
28968 c := auxIntToInt8(v_1_0.AuxInt)
28969 if !(c&31 == 0) {
28970 break
28971 }
28972 v.reset(OpRotateLeft32)
28973 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
28974 v0.AddArg(y)
28975 v.AddArg2(x, v0)
28976 return true
28977 }
28978
28979
28980
28981 for {
28982 x := v_0
28983 if v_1.Op != OpConst64 {
28984 break
28985 }
28986 t := v_1.Type
28987 c := auxIntToInt64(v_1.AuxInt)
28988 if !(config.PtrSize == 4) {
28989 break
28990 }
28991 v.reset(OpRotateLeft32)
28992 v0 := b.NewValue0(v.Pos, OpConst32, t)
28993 v0.AuxInt = int32ToAuxInt(int32(c))
28994 v.AddArg2(x, v0)
28995 return true
28996 }
28997
28998
28999
29000 for {
29001 if v_0.Op != OpRotateLeft32 {
29002 break
29003 }
29004 c := v_0.Args[1]
29005 x := v_0.Args[0]
29006 d := v_1
29007 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
29008 break
29009 }
29010 v.reset(OpRotateLeft32)
29011 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
29012 v0.AddArg2(c, d)
29013 v.AddArg2(x, v0)
29014 return true
29015 }
29016
29017
29018
29019 for {
29020 if v_0.Op != OpRotateLeft32 {
29021 break
29022 }
29023 c := v_0.Args[1]
29024 x := v_0.Args[0]
29025 d := v_1
29026 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
29027 break
29028 }
29029 v.reset(OpRotateLeft32)
29030 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
29031 v0.AddArg2(c, d)
29032 v.AddArg2(x, v0)
29033 return true
29034 }
29035
29036
29037
29038 for {
29039 if v_0.Op != OpRotateLeft32 {
29040 break
29041 }
29042 c := v_0.Args[1]
29043 x := v_0.Args[0]
29044 d := v_1
29045 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
29046 break
29047 }
29048 v.reset(OpRotateLeft32)
29049 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
29050 v0.AddArg2(c, d)
29051 v.AddArg2(x, v0)
29052 return true
29053 }
29054
29055
29056
29057 for {
29058 if v_0.Op != OpRotateLeft32 {
29059 break
29060 }
29061 c := v_0.Args[1]
29062 x := v_0.Args[0]
29063 d := v_1
29064 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
29065 break
29066 }
29067 v.reset(OpRotateLeft32)
29068 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
29069 v0.AddArg2(c, d)
29070 v.AddArg2(x, v0)
29071 return true
29072 }
29073 return false
29074 }
29075 func rewriteValuegeneric_OpRotateLeft64(v *Value) bool {
29076 v_1 := v.Args[1]
29077 v_0 := v.Args[0]
29078 b := v.Block
29079 config := b.Func.Config
29080
29081
29082
29083 for {
29084 x := v_0
29085 if v_1.Op != OpConst64 {
29086 break
29087 }
29088 c := auxIntToInt64(v_1.AuxInt)
29089 if !(c%64 == 0) {
29090 break
29091 }
29092 v.copyOf(x)
29093 return true
29094 }
29095
29096
29097
29098 for {
29099 x := v_0
29100 if v_1.Op != OpAnd64 {
29101 break
29102 }
29103 _ = v_1.Args[1]
29104 v_1_0 := v_1.Args[0]
29105 v_1_1 := v_1.Args[1]
29106 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
29107 y := v_1_0
29108 if v_1_1.Op != OpConst64 {
29109 continue
29110 }
29111 c := auxIntToInt64(v_1_1.AuxInt)
29112 if !(c&63 == 63) {
29113 continue
29114 }
29115 v.reset(OpRotateLeft64)
29116 v.AddArg2(x, y)
29117 return true
29118 }
29119 break
29120 }
29121
29122
29123
29124 for {
29125 x := v_0
29126 if v_1.Op != OpAnd32 {
29127 break
29128 }
29129 _ = v_1.Args[1]
29130 v_1_0 := v_1.Args[0]
29131 v_1_1 := v_1.Args[1]
29132 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
29133 y := v_1_0
29134 if v_1_1.Op != OpConst32 {
29135 continue
29136 }
29137 c := auxIntToInt32(v_1_1.AuxInt)
29138 if !(c&63 == 63) {
29139 continue
29140 }
29141 v.reset(OpRotateLeft64)
29142 v.AddArg2(x, y)
29143 return true
29144 }
29145 break
29146 }
29147
29148
29149
29150 for {
29151 x := v_0
29152 if v_1.Op != OpAnd16 {
29153 break
29154 }
29155 _ = v_1.Args[1]
29156 v_1_0 := v_1.Args[0]
29157 v_1_1 := v_1.Args[1]
29158 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
29159 y := v_1_0
29160 if v_1_1.Op != OpConst16 {
29161 continue
29162 }
29163 c := auxIntToInt16(v_1_1.AuxInt)
29164 if !(c&63 == 63) {
29165 continue
29166 }
29167 v.reset(OpRotateLeft64)
29168 v.AddArg2(x, y)
29169 return true
29170 }
29171 break
29172 }
29173
29174
29175
29176 for {
29177 x := v_0
29178 if v_1.Op != OpAnd8 {
29179 break
29180 }
29181 _ = v_1.Args[1]
29182 v_1_0 := v_1.Args[0]
29183 v_1_1 := v_1.Args[1]
29184 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
29185 y := v_1_0
29186 if v_1_1.Op != OpConst8 {
29187 continue
29188 }
29189 c := auxIntToInt8(v_1_1.AuxInt)
29190 if !(c&63 == 63) {
29191 continue
29192 }
29193 v.reset(OpRotateLeft64)
29194 v.AddArg2(x, y)
29195 return true
29196 }
29197 break
29198 }
29199
29200
29201
29202 for {
29203 x := v_0
29204 if v_1.Op != OpNeg64 {
29205 break
29206 }
29207 v_1_0 := v_1.Args[0]
29208 if v_1_0.Op != OpAnd64 {
29209 break
29210 }
29211 _ = v_1_0.Args[1]
29212 v_1_0_0 := v_1_0.Args[0]
29213 v_1_0_1 := v_1_0.Args[1]
29214 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
29215 y := v_1_0_0
29216 if v_1_0_1.Op != OpConst64 {
29217 continue
29218 }
29219 c := auxIntToInt64(v_1_0_1.AuxInt)
29220 if !(c&63 == 63) {
29221 continue
29222 }
29223 v.reset(OpRotateLeft64)
29224 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
29225 v0.AddArg(y)
29226 v.AddArg2(x, v0)
29227 return true
29228 }
29229 break
29230 }
29231
29232
29233
29234 for {
29235 x := v_0
29236 if v_1.Op != OpNeg32 {
29237 break
29238 }
29239 v_1_0 := v_1.Args[0]
29240 if v_1_0.Op != OpAnd32 {
29241 break
29242 }
29243 _ = v_1_0.Args[1]
29244 v_1_0_0 := v_1_0.Args[0]
29245 v_1_0_1 := v_1_0.Args[1]
29246 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
29247 y := v_1_0_0
29248 if v_1_0_1.Op != OpConst32 {
29249 continue
29250 }
29251 c := auxIntToInt32(v_1_0_1.AuxInt)
29252 if !(c&63 == 63) {
29253 continue
29254 }
29255 v.reset(OpRotateLeft64)
29256 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
29257 v0.AddArg(y)
29258 v.AddArg2(x, v0)
29259 return true
29260 }
29261 break
29262 }
29263
29264
29265
29266 for {
29267 x := v_0
29268 if v_1.Op != OpNeg16 {
29269 break
29270 }
29271 v_1_0 := v_1.Args[0]
29272 if v_1_0.Op != OpAnd16 {
29273 break
29274 }
29275 _ = v_1_0.Args[1]
29276 v_1_0_0 := v_1_0.Args[0]
29277 v_1_0_1 := v_1_0.Args[1]
29278 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
29279 y := v_1_0_0
29280 if v_1_0_1.Op != OpConst16 {
29281 continue
29282 }
29283 c := auxIntToInt16(v_1_0_1.AuxInt)
29284 if !(c&63 == 63) {
29285 continue
29286 }
29287 v.reset(OpRotateLeft64)
29288 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
29289 v0.AddArg(y)
29290 v.AddArg2(x, v0)
29291 return true
29292 }
29293 break
29294 }
29295
29296
29297
29298 for {
29299 x := v_0
29300 if v_1.Op != OpNeg8 {
29301 break
29302 }
29303 v_1_0 := v_1.Args[0]
29304 if v_1_0.Op != OpAnd8 {
29305 break
29306 }
29307 _ = v_1_0.Args[1]
29308 v_1_0_0 := v_1_0.Args[0]
29309 v_1_0_1 := v_1_0.Args[1]
29310 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
29311 y := v_1_0_0
29312 if v_1_0_1.Op != OpConst8 {
29313 continue
29314 }
29315 c := auxIntToInt8(v_1_0_1.AuxInt)
29316 if !(c&63 == 63) {
29317 continue
29318 }
29319 v.reset(OpRotateLeft64)
29320 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
29321 v0.AddArg(y)
29322 v.AddArg2(x, v0)
29323 return true
29324 }
29325 break
29326 }
29327
29328
29329
29330 for {
29331 x := v_0
29332 if v_1.Op != OpAdd64 {
29333 break
29334 }
29335 _ = v_1.Args[1]
29336 v_1_0 := v_1.Args[0]
29337 v_1_1 := v_1.Args[1]
29338 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
29339 y := v_1_0
29340 if v_1_1.Op != OpConst64 {
29341 continue
29342 }
29343 c := auxIntToInt64(v_1_1.AuxInt)
29344 if !(c&63 == 0) {
29345 continue
29346 }
29347 v.reset(OpRotateLeft64)
29348 v.AddArg2(x, y)
29349 return true
29350 }
29351 break
29352 }
29353
29354
29355
29356 for {
29357 x := v_0
29358 if v_1.Op != OpAdd32 {
29359 break
29360 }
29361 _ = v_1.Args[1]
29362 v_1_0 := v_1.Args[0]
29363 v_1_1 := v_1.Args[1]
29364 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
29365 y := v_1_0
29366 if v_1_1.Op != OpConst32 {
29367 continue
29368 }
29369 c := auxIntToInt32(v_1_1.AuxInt)
29370 if !(c&63 == 0) {
29371 continue
29372 }
29373 v.reset(OpRotateLeft64)
29374 v.AddArg2(x, y)
29375 return true
29376 }
29377 break
29378 }
29379
29380
29381
29382 for {
29383 x := v_0
29384 if v_1.Op != OpAdd16 {
29385 break
29386 }
29387 _ = v_1.Args[1]
29388 v_1_0 := v_1.Args[0]
29389 v_1_1 := v_1.Args[1]
29390 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
29391 y := v_1_0
29392 if v_1_1.Op != OpConst16 {
29393 continue
29394 }
29395 c := auxIntToInt16(v_1_1.AuxInt)
29396 if !(c&63 == 0) {
29397 continue
29398 }
29399 v.reset(OpRotateLeft64)
29400 v.AddArg2(x, y)
29401 return true
29402 }
29403 break
29404 }
29405
29406
29407
29408 for {
29409 x := v_0
29410 if v_1.Op != OpAdd8 {
29411 break
29412 }
29413 _ = v_1.Args[1]
29414 v_1_0 := v_1.Args[0]
29415 v_1_1 := v_1.Args[1]
29416 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
29417 y := v_1_0
29418 if v_1_1.Op != OpConst8 {
29419 continue
29420 }
29421 c := auxIntToInt8(v_1_1.AuxInt)
29422 if !(c&63 == 0) {
29423 continue
29424 }
29425 v.reset(OpRotateLeft64)
29426 v.AddArg2(x, y)
29427 return true
29428 }
29429 break
29430 }
29431
29432
29433
29434 for {
29435 x := v_0
29436 if v_1.Op != OpSub64 {
29437 break
29438 }
29439 y := v_1.Args[1]
29440 v_1_0 := v_1.Args[0]
29441 if v_1_0.Op != OpConst64 {
29442 break
29443 }
29444 c := auxIntToInt64(v_1_0.AuxInt)
29445 if !(c&63 == 0) {
29446 break
29447 }
29448 v.reset(OpRotateLeft64)
29449 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
29450 v0.AddArg(y)
29451 v.AddArg2(x, v0)
29452 return true
29453 }
29454
29455
29456
29457 for {
29458 x := v_0
29459 if v_1.Op != OpSub32 {
29460 break
29461 }
29462 y := v_1.Args[1]
29463 v_1_0 := v_1.Args[0]
29464 if v_1_0.Op != OpConst32 {
29465 break
29466 }
29467 c := auxIntToInt32(v_1_0.AuxInt)
29468 if !(c&63 == 0) {
29469 break
29470 }
29471 v.reset(OpRotateLeft64)
29472 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
29473 v0.AddArg(y)
29474 v.AddArg2(x, v0)
29475 return true
29476 }
29477
29478
29479
29480 for {
29481 x := v_0
29482 if v_1.Op != OpSub16 {
29483 break
29484 }
29485 y := v_1.Args[1]
29486 v_1_0 := v_1.Args[0]
29487 if v_1_0.Op != OpConst16 {
29488 break
29489 }
29490 c := auxIntToInt16(v_1_0.AuxInt)
29491 if !(c&63 == 0) {
29492 break
29493 }
29494 v.reset(OpRotateLeft64)
29495 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
29496 v0.AddArg(y)
29497 v.AddArg2(x, v0)
29498 return true
29499 }
29500
29501
29502
29503 for {
29504 x := v_0
29505 if v_1.Op != OpSub8 {
29506 break
29507 }
29508 y := v_1.Args[1]
29509 v_1_0 := v_1.Args[0]
29510 if v_1_0.Op != OpConst8 {
29511 break
29512 }
29513 c := auxIntToInt8(v_1_0.AuxInt)
29514 if !(c&63 == 0) {
29515 break
29516 }
29517 v.reset(OpRotateLeft64)
29518 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
29519 v0.AddArg(y)
29520 v.AddArg2(x, v0)
29521 return true
29522 }
29523
29524
29525
29526 for {
29527 x := v_0
29528 if v_1.Op != OpConst64 {
29529 break
29530 }
29531 t := v_1.Type
29532 c := auxIntToInt64(v_1.AuxInt)
29533 if !(config.PtrSize == 4) {
29534 break
29535 }
29536 v.reset(OpRotateLeft64)
29537 v0 := b.NewValue0(v.Pos, OpConst32, t)
29538 v0.AuxInt = int32ToAuxInt(int32(c))
29539 v.AddArg2(x, v0)
29540 return true
29541 }
29542
29543
29544
29545 for {
29546 if v_0.Op != OpRotateLeft64 {
29547 break
29548 }
29549 c := v_0.Args[1]
29550 x := v_0.Args[0]
29551 d := v_1
29552 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
29553 break
29554 }
29555 v.reset(OpRotateLeft64)
29556 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
29557 v0.AddArg2(c, d)
29558 v.AddArg2(x, v0)
29559 return true
29560 }
29561
29562
29563
29564 for {
29565 if v_0.Op != OpRotateLeft64 {
29566 break
29567 }
29568 c := v_0.Args[1]
29569 x := v_0.Args[0]
29570 d := v_1
29571 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
29572 break
29573 }
29574 v.reset(OpRotateLeft64)
29575 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
29576 v0.AddArg2(c, d)
29577 v.AddArg2(x, v0)
29578 return true
29579 }
29580
29581
29582
29583 for {
29584 if v_0.Op != OpRotateLeft64 {
29585 break
29586 }
29587 c := v_0.Args[1]
29588 x := v_0.Args[0]
29589 d := v_1
29590 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
29591 break
29592 }
29593 v.reset(OpRotateLeft64)
29594 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
29595 v0.AddArg2(c, d)
29596 v.AddArg2(x, v0)
29597 return true
29598 }
29599
29600
29601
29602 for {
29603 if v_0.Op != OpRotateLeft64 {
29604 break
29605 }
29606 c := v_0.Args[1]
29607 x := v_0.Args[0]
29608 d := v_1
29609 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
29610 break
29611 }
29612 v.reset(OpRotateLeft64)
29613 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
29614 v0.AddArg2(c, d)
29615 v.AddArg2(x, v0)
29616 return true
29617 }
29618 return false
29619 }
29620 func rewriteValuegeneric_OpRotateLeft8(v *Value) bool {
29621 v_1 := v.Args[1]
29622 v_0 := v.Args[0]
29623 b := v.Block
29624 config := b.Func.Config
29625
29626
29627
29628 for {
29629 x := v_0
29630 if v_1.Op != OpConst8 {
29631 break
29632 }
29633 c := auxIntToInt8(v_1.AuxInt)
29634 if !(c%8 == 0) {
29635 break
29636 }
29637 v.copyOf(x)
29638 return true
29639 }
29640
29641
29642
29643 for {
29644 x := v_0
29645 if v_1.Op != OpAnd64 {
29646 break
29647 }
29648 _ = v_1.Args[1]
29649 v_1_0 := v_1.Args[0]
29650 v_1_1 := v_1.Args[1]
29651 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
29652 y := v_1_0
29653 if v_1_1.Op != OpConst64 {
29654 continue
29655 }
29656 c := auxIntToInt64(v_1_1.AuxInt)
29657 if !(c&7 == 7) {
29658 continue
29659 }
29660 v.reset(OpRotateLeft8)
29661 v.AddArg2(x, y)
29662 return true
29663 }
29664 break
29665 }
29666
29667
29668
29669 for {
29670 x := v_0
29671 if v_1.Op != OpAnd32 {
29672 break
29673 }
29674 _ = v_1.Args[1]
29675 v_1_0 := v_1.Args[0]
29676 v_1_1 := v_1.Args[1]
29677 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
29678 y := v_1_0
29679 if v_1_1.Op != OpConst32 {
29680 continue
29681 }
29682 c := auxIntToInt32(v_1_1.AuxInt)
29683 if !(c&7 == 7) {
29684 continue
29685 }
29686 v.reset(OpRotateLeft8)
29687 v.AddArg2(x, y)
29688 return true
29689 }
29690 break
29691 }
29692
29693
29694
29695 for {
29696 x := v_0
29697 if v_1.Op != OpAnd16 {
29698 break
29699 }
29700 _ = v_1.Args[1]
29701 v_1_0 := v_1.Args[0]
29702 v_1_1 := v_1.Args[1]
29703 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
29704 y := v_1_0
29705 if v_1_1.Op != OpConst16 {
29706 continue
29707 }
29708 c := auxIntToInt16(v_1_1.AuxInt)
29709 if !(c&7 == 7) {
29710 continue
29711 }
29712 v.reset(OpRotateLeft8)
29713 v.AddArg2(x, y)
29714 return true
29715 }
29716 break
29717 }
29718
29719
29720
29721 for {
29722 x := v_0
29723 if v_1.Op != OpAnd8 {
29724 break
29725 }
29726 _ = v_1.Args[1]
29727 v_1_0 := v_1.Args[0]
29728 v_1_1 := v_1.Args[1]
29729 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
29730 y := v_1_0
29731 if v_1_1.Op != OpConst8 {
29732 continue
29733 }
29734 c := auxIntToInt8(v_1_1.AuxInt)
29735 if !(c&7 == 7) {
29736 continue
29737 }
29738 v.reset(OpRotateLeft8)
29739 v.AddArg2(x, y)
29740 return true
29741 }
29742 break
29743 }
29744
29745
29746
29747 for {
29748 x := v_0
29749 if v_1.Op != OpNeg64 {
29750 break
29751 }
29752 v_1_0 := v_1.Args[0]
29753 if v_1_0.Op != OpAnd64 {
29754 break
29755 }
29756 _ = v_1_0.Args[1]
29757 v_1_0_0 := v_1_0.Args[0]
29758 v_1_0_1 := v_1_0.Args[1]
29759 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
29760 y := v_1_0_0
29761 if v_1_0_1.Op != OpConst64 {
29762 continue
29763 }
29764 c := auxIntToInt64(v_1_0_1.AuxInt)
29765 if !(c&7 == 7) {
29766 continue
29767 }
29768 v.reset(OpRotateLeft8)
29769 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
29770 v0.AddArg(y)
29771 v.AddArg2(x, v0)
29772 return true
29773 }
29774 break
29775 }
29776
29777
29778
29779 for {
29780 x := v_0
29781 if v_1.Op != OpNeg32 {
29782 break
29783 }
29784 v_1_0 := v_1.Args[0]
29785 if v_1_0.Op != OpAnd32 {
29786 break
29787 }
29788 _ = v_1_0.Args[1]
29789 v_1_0_0 := v_1_0.Args[0]
29790 v_1_0_1 := v_1_0.Args[1]
29791 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
29792 y := v_1_0_0
29793 if v_1_0_1.Op != OpConst32 {
29794 continue
29795 }
29796 c := auxIntToInt32(v_1_0_1.AuxInt)
29797 if !(c&7 == 7) {
29798 continue
29799 }
29800 v.reset(OpRotateLeft8)
29801 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
29802 v0.AddArg(y)
29803 v.AddArg2(x, v0)
29804 return true
29805 }
29806 break
29807 }
29808
29809
29810
29811 for {
29812 x := v_0
29813 if v_1.Op != OpNeg16 {
29814 break
29815 }
29816 v_1_0 := v_1.Args[0]
29817 if v_1_0.Op != OpAnd16 {
29818 break
29819 }
29820 _ = v_1_0.Args[1]
29821 v_1_0_0 := v_1_0.Args[0]
29822 v_1_0_1 := v_1_0.Args[1]
29823 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
29824 y := v_1_0_0
29825 if v_1_0_1.Op != OpConst16 {
29826 continue
29827 }
29828 c := auxIntToInt16(v_1_0_1.AuxInt)
29829 if !(c&7 == 7) {
29830 continue
29831 }
29832 v.reset(OpRotateLeft8)
29833 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
29834 v0.AddArg(y)
29835 v.AddArg2(x, v0)
29836 return true
29837 }
29838 break
29839 }
29840
29841
29842
29843 for {
29844 x := v_0
29845 if v_1.Op != OpNeg8 {
29846 break
29847 }
29848 v_1_0 := v_1.Args[0]
29849 if v_1_0.Op != OpAnd8 {
29850 break
29851 }
29852 _ = v_1_0.Args[1]
29853 v_1_0_0 := v_1_0.Args[0]
29854 v_1_0_1 := v_1_0.Args[1]
29855 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
29856 y := v_1_0_0
29857 if v_1_0_1.Op != OpConst8 {
29858 continue
29859 }
29860 c := auxIntToInt8(v_1_0_1.AuxInt)
29861 if !(c&7 == 7) {
29862 continue
29863 }
29864 v.reset(OpRotateLeft8)
29865 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
29866 v0.AddArg(y)
29867 v.AddArg2(x, v0)
29868 return true
29869 }
29870 break
29871 }
29872
29873
29874
29875 for {
29876 x := v_0
29877 if v_1.Op != OpAdd64 {
29878 break
29879 }
29880 _ = v_1.Args[1]
29881 v_1_0 := v_1.Args[0]
29882 v_1_1 := v_1.Args[1]
29883 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
29884 y := v_1_0
29885 if v_1_1.Op != OpConst64 {
29886 continue
29887 }
29888 c := auxIntToInt64(v_1_1.AuxInt)
29889 if !(c&7 == 0) {
29890 continue
29891 }
29892 v.reset(OpRotateLeft8)
29893 v.AddArg2(x, y)
29894 return true
29895 }
29896 break
29897 }
29898
29899
29900
29901 for {
29902 x := v_0
29903 if v_1.Op != OpAdd32 {
29904 break
29905 }
29906 _ = v_1.Args[1]
29907 v_1_0 := v_1.Args[0]
29908 v_1_1 := v_1.Args[1]
29909 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
29910 y := v_1_0
29911 if v_1_1.Op != OpConst32 {
29912 continue
29913 }
29914 c := auxIntToInt32(v_1_1.AuxInt)
29915 if !(c&7 == 0) {
29916 continue
29917 }
29918 v.reset(OpRotateLeft8)
29919 v.AddArg2(x, y)
29920 return true
29921 }
29922 break
29923 }
29924
29925
29926
29927 for {
29928 x := v_0
29929 if v_1.Op != OpAdd16 {
29930 break
29931 }
29932 _ = v_1.Args[1]
29933 v_1_0 := v_1.Args[0]
29934 v_1_1 := v_1.Args[1]
29935 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
29936 y := v_1_0
29937 if v_1_1.Op != OpConst16 {
29938 continue
29939 }
29940 c := auxIntToInt16(v_1_1.AuxInt)
29941 if !(c&7 == 0) {
29942 continue
29943 }
29944 v.reset(OpRotateLeft8)
29945 v.AddArg2(x, y)
29946 return true
29947 }
29948 break
29949 }
29950
29951
29952
29953 for {
29954 x := v_0
29955 if v_1.Op != OpAdd8 {
29956 break
29957 }
29958 _ = v_1.Args[1]
29959 v_1_0 := v_1.Args[0]
29960 v_1_1 := v_1.Args[1]
29961 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
29962 y := v_1_0
29963 if v_1_1.Op != OpConst8 {
29964 continue
29965 }
29966 c := auxIntToInt8(v_1_1.AuxInt)
29967 if !(c&7 == 0) {
29968 continue
29969 }
29970 v.reset(OpRotateLeft8)
29971 v.AddArg2(x, y)
29972 return true
29973 }
29974 break
29975 }
29976
29977
29978
29979 for {
29980 x := v_0
29981 if v_1.Op != OpSub64 {
29982 break
29983 }
29984 y := v_1.Args[1]
29985 v_1_0 := v_1.Args[0]
29986 if v_1_0.Op != OpConst64 {
29987 break
29988 }
29989 c := auxIntToInt64(v_1_0.AuxInt)
29990 if !(c&7 == 0) {
29991 break
29992 }
29993 v.reset(OpRotateLeft8)
29994 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
29995 v0.AddArg(y)
29996 v.AddArg2(x, v0)
29997 return true
29998 }
29999
30000
30001
30002 for {
30003 x := v_0
30004 if v_1.Op != OpSub32 {
30005 break
30006 }
30007 y := v_1.Args[1]
30008 v_1_0 := v_1.Args[0]
30009 if v_1_0.Op != OpConst32 {
30010 break
30011 }
30012 c := auxIntToInt32(v_1_0.AuxInt)
30013 if !(c&7 == 0) {
30014 break
30015 }
30016 v.reset(OpRotateLeft8)
30017 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
30018 v0.AddArg(y)
30019 v.AddArg2(x, v0)
30020 return true
30021 }
30022
30023
30024
30025 for {
30026 x := v_0
30027 if v_1.Op != OpSub16 {
30028 break
30029 }
30030 y := v_1.Args[1]
30031 v_1_0 := v_1.Args[0]
30032 if v_1_0.Op != OpConst16 {
30033 break
30034 }
30035 c := auxIntToInt16(v_1_0.AuxInt)
30036 if !(c&7 == 0) {
30037 break
30038 }
30039 v.reset(OpRotateLeft8)
30040 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
30041 v0.AddArg(y)
30042 v.AddArg2(x, v0)
30043 return true
30044 }
30045
30046
30047
30048 for {
30049 x := v_0
30050 if v_1.Op != OpSub8 {
30051 break
30052 }
30053 y := v_1.Args[1]
30054 v_1_0 := v_1.Args[0]
30055 if v_1_0.Op != OpConst8 {
30056 break
30057 }
30058 c := auxIntToInt8(v_1_0.AuxInt)
30059 if !(c&7 == 0) {
30060 break
30061 }
30062 v.reset(OpRotateLeft8)
30063 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
30064 v0.AddArg(y)
30065 v.AddArg2(x, v0)
30066 return true
30067 }
30068
30069
30070
30071 for {
30072 x := v_0
30073 if v_1.Op != OpConst64 {
30074 break
30075 }
30076 t := v_1.Type
30077 c := auxIntToInt64(v_1.AuxInt)
30078 if !(config.PtrSize == 4) {
30079 break
30080 }
30081 v.reset(OpRotateLeft8)
30082 v0 := b.NewValue0(v.Pos, OpConst32, t)
30083 v0.AuxInt = int32ToAuxInt(int32(c))
30084 v.AddArg2(x, v0)
30085 return true
30086 }
30087
30088
30089
30090 for {
30091 if v_0.Op != OpRotateLeft8 {
30092 break
30093 }
30094 c := v_0.Args[1]
30095 x := v_0.Args[0]
30096 d := v_1
30097 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
30098 break
30099 }
30100 v.reset(OpRotateLeft8)
30101 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
30102 v0.AddArg2(c, d)
30103 v.AddArg2(x, v0)
30104 return true
30105 }
30106
30107
30108
30109 for {
30110 if v_0.Op != OpRotateLeft8 {
30111 break
30112 }
30113 c := v_0.Args[1]
30114 x := v_0.Args[0]
30115 d := v_1
30116 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
30117 break
30118 }
30119 v.reset(OpRotateLeft8)
30120 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
30121 v0.AddArg2(c, d)
30122 v.AddArg2(x, v0)
30123 return true
30124 }
30125
30126
30127
30128 for {
30129 if v_0.Op != OpRotateLeft8 {
30130 break
30131 }
30132 c := v_0.Args[1]
30133 x := v_0.Args[0]
30134 d := v_1
30135 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
30136 break
30137 }
30138 v.reset(OpRotateLeft8)
30139 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
30140 v0.AddArg2(c, d)
30141 v.AddArg2(x, v0)
30142 return true
30143 }
30144
30145
30146
30147 for {
30148 if v_0.Op != OpRotateLeft8 {
30149 break
30150 }
30151 c := v_0.Args[1]
30152 x := v_0.Args[0]
30153 d := v_1
30154 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
30155 break
30156 }
30157 v.reset(OpRotateLeft8)
30158 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
30159 v0.AddArg2(c, d)
30160 v.AddArg2(x, v0)
30161 return true
30162 }
30163 return false
30164 }
30165 func rewriteValuegeneric_OpRound32F(v *Value) bool {
30166 v_0 := v.Args[0]
30167
30168
30169 for {
30170 x := v_0
30171 if x.Op != OpConst32F {
30172 break
30173 }
30174 v.copyOf(x)
30175 return true
30176 }
30177 return false
30178 }
30179 func rewriteValuegeneric_OpRound64F(v *Value) bool {
30180 v_0 := v.Args[0]
30181
30182
30183 for {
30184 x := v_0
30185 if x.Op != OpConst64F {
30186 break
30187 }
30188 v.copyOf(x)
30189 return true
30190 }
30191 return false
30192 }
30193 func rewriteValuegeneric_OpRoundToEven(v *Value) bool {
30194 v_0 := v.Args[0]
30195
30196
30197 for {
30198 if v_0.Op != OpConst64F {
30199 break
30200 }
30201 c := auxIntToFloat64(v_0.AuxInt)
30202 v.reset(OpConst64F)
30203 v.AuxInt = float64ToAuxInt(math.RoundToEven(c))
30204 return true
30205 }
30206 return false
30207 }
30208 func rewriteValuegeneric_OpRsh16Ux16(v *Value) bool {
30209 v_1 := v.Args[1]
30210 v_0 := v.Args[0]
30211 b := v.Block
30212
30213
30214 for {
30215 x := v_0
30216 if v_1.Op != OpConst16 {
30217 break
30218 }
30219 c := auxIntToInt16(v_1.AuxInt)
30220 v.reset(OpRsh16Ux64)
30221 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
30222 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
30223 v.AddArg2(x, v0)
30224 return true
30225 }
30226
30227
30228 for {
30229 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
30230 break
30231 }
30232 v.reset(OpConst16)
30233 v.AuxInt = int16ToAuxInt(0)
30234 return true
30235 }
30236
30237
30238
30239 for {
30240 if auxIntToBool(v.AuxInt) != false {
30241 break
30242 }
30243 x := v_0
30244 con := v_1
30245 if con.Op != OpConst16 {
30246 break
30247 }
30248 c := auxIntToInt16(con.AuxInt)
30249 if !(0 < c && c < 16) {
30250 break
30251 }
30252 v.reset(OpRsh16Ux16)
30253 v.AuxInt = boolToAuxInt(true)
30254 v.AddArg2(x, con)
30255 return true
30256 }
30257 return false
30258 }
30259 func rewriteValuegeneric_OpRsh16Ux32(v *Value) bool {
30260 v_1 := v.Args[1]
30261 v_0 := v.Args[0]
30262 b := v.Block
30263
30264
30265 for {
30266 x := v_0
30267 if v_1.Op != OpConst32 {
30268 break
30269 }
30270 c := auxIntToInt32(v_1.AuxInt)
30271 v.reset(OpRsh16Ux64)
30272 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
30273 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
30274 v.AddArg2(x, v0)
30275 return true
30276 }
30277
30278
30279 for {
30280 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
30281 break
30282 }
30283 v.reset(OpConst16)
30284 v.AuxInt = int16ToAuxInt(0)
30285 return true
30286 }
30287
30288
30289
30290 for {
30291 if auxIntToBool(v.AuxInt) != false {
30292 break
30293 }
30294 x := v_0
30295 con := v_1
30296 if con.Op != OpConst32 {
30297 break
30298 }
30299 c := auxIntToInt32(con.AuxInt)
30300 if !(0 < c && c < 16) {
30301 break
30302 }
30303 v.reset(OpRsh16Ux32)
30304 v.AuxInt = boolToAuxInt(true)
30305 v.AddArg2(x, con)
30306 return true
30307 }
30308 return false
30309 }
30310 func rewriteValuegeneric_OpRsh16Ux64(v *Value) bool {
30311 v_1 := v.Args[1]
30312 v_0 := v.Args[0]
30313 b := v.Block
30314 typ := &b.Func.Config.Types
30315
30316
30317 for {
30318 if v_0.Op != OpConst16 {
30319 break
30320 }
30321 c := auxIntToInt16(v_0.AuxInt)
30322 if v_1.Op != OpConst64 {
30323 break
30324 }
30325 d := auxIntToInt64(v_1.AuxInt)
30326 v.reset(OpConst16)
30327 v.AuxInt = int16ToAuxInt(int16(uint16(c) >> uint64(d)))
30328 return true
30329 }
30330
30331
30332 for {
30333 x := v_0
30334 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
30335 break
30336 }
30337 v.copyOf(x)
30338 return true
30339 }
30340
30341
30342 for {
30343 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
30344 break
30345 }
30346 v.reset(OpConst16)
30347 v.AuxInt = int16ToAuxInt(0)
30348 return true
30349 }
30350
30351
30352
30353 for {
30354 if v_1.Op != OpConst64 {
30355 break
30356 }
30357 c := auxIntToInt64(v_1.AuxInt)
30358 if !(uint64(c) >= 16) {
30359 break
30360 }
30361 v.reset(OpConst16)
30362 v.AuxInt = int16ToAuxInt(0)
30363 return true
30364 }
30365
30366
30367
30368 for {
30369 t := v.Type
30370 if v_0.Op != OpRsh16Ux64 {
30371 break
30372 }
30373 _ = v_0.Args[1]
30374 x := v_0.Args[0]
30375 v_0_1 := v_0.Args[1]
30376 if v_0_1.Op != OpConst64 {
30377 break
30378 }
30379 c := auxIntToInt64(v_0_1.AuxInt)
30380 if v_1.Op != OpConst64 {
30381 break
30382 }
30383 d := auxIntToInt64(v_1.AuxInt)
30384 if !(!uaddOvf(c, d)) {
30385 break
30386 }
30387 v.reset(OpRsh16Ux64)
30388 v0 := b.NewValue0(v.Pos, OpConst64, t)
30389 v0.AuxInt = int64ToAuxInt(c + d)
30390 v.AddArg2(x, v0)
30391 return true
30392 }
30393
30394
30395 for {
30396 if v_0.Op != OpRsh16x64 {
30397 break
30398 }
30399 x := v_0.Args[0]
30400 if v_1.Op != OpConst64 {
30401 break
30402 }
30403 t := v_1.Type
30404 if auxIntToInt64(v_1.AuxInt) != 15 {
30405 break
30406 }
30407 v.reset(OpRsh16Ux64)
30408 v0 := b.NewValue0(v.Pos, OpConst64, t)
30409 v0.AuxInt = int64ToAuxInt(15)
30410 v.AddArg2(x, v0)
30411 return true
30412 }
30413
30414
30415
30416 for {
30417 i := v_0
30418 if i.Op != OpLsh16x64 {
30419 break
30420 }
30421 _ = i.Args[1]
30422 x := i.Args[0]
30423 i_1 := i.Args[1]
30424 if i_1.Op != OpConst64 {
30425 break
30426 }
30427 c := auxIntToInt64(i_1.AuxInt)
30428 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
30429 break
30430 }
30431 v.reset(OpAnd16)
30432 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
30433 v0.AuxInt = int16ToAuxInt(int16(^uint16(0) >> c))
30434 v.AddArg2(x, v0)
30435 return true
30436 }
30437
30438
30439
30440 for {
30441 if v_0.Op != OpLsh16x64 {
30442 break
30443 }
30444 _ = v_0.Args[1]
30445 v_0_0 := v_0.Args[0]
30446 if v_0_0.Op != OpRsh16Ux64 {
30447 break
30448 }
30449 _ = v_0_0.Args[1]
30450 x := v_0_0.Args[0]
30451 v_0_0_1 := v_0_0.Args[1]
30452 if v_0_0_1.Op != OpConst64 {
30453 break
30454 }
30455 c1 := auxIntToInt64(v_0_0_1.AuxInt)
30456 v_0_1 := v_0.Args[1]
30457 if v_0_1.Op != OpConst64 {
30458 break
30459 }
30460 c2 := auxIntToInt64(v_0_1.AuxInt)
30461 if v_1.Op != OpConst64 {
30462 break
30463 }
30464 c3 := auxIntToInt64(v_1.AuxInt)
30465 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
30466 break
30467 }
30468 v.reset(OpRsh16Ux64)
30469 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
30470 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
30471 v.AddArg2(x, v0)
30472 return true
30473 }
30474
30475
30476 for {
30477 if v_0.Op != OpLsh16x64 {
30478 break
30479 }
30480 _ = v_0.Args[1]
30481 x := v_0.Args[0]
30482 v_0_1 := v_0.Args[1]
30483 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 8 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 8 {
30484 break
30485 }
30486 v.reset(OpZeroExt8to16)
30487 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.UInt8)
30488 v0.AddArg(x)
30489 v.AddArg(v0)
30490 return true
30491 }
30492
30493
30494
30495 for {
30496 if auxIntToBool(v.AuxInt) != false {
30497 break
30498 }
30499 x := v_0
30500 con := v_1
30501 if con.Op != OpConst64 {
30502 break
30503 }
30504 c := auxIntToInt64(con.AuxInt)
30505 if !(0 < c && c < 16) {
30506 break
30507 }
30508 v.reset(OpRsh16Ux64)
30509 v.AuxInt = boolToAuxInt(true)
30510 v.AddArg2(x, con)
30511 return true
30512 }
30513 return false
30514 }
30515 func rewriteValuegeneric_OpRsh16Ux8(v *Value) bool {
30516 v_1 := v.Args[1]
30517 v_0 := v.Args[0]
30518 b := v.Block
30519
30520
30521 for {
30522 x := v_0
30523 if v_1.Op != OpConst8 {
30524 break
30525 }
30526 c := auxIntToInt8(v_1.AuxInt)
30527 v.reset(OpRsh16Ux64)
30528 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
30529 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
30530 v.AddArg2(x, v0)
30531 return true
30532 }
30533
30534
30535 for {
30536 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
30537 break
30538 }
30539 v.reset(OpConst16)
30540 v.AuxInt = int16ToAuxInt(0)
30541 return true
30542 }
30543
30544
30545
30546 for {
30547 if auxIntToBool(v.AuxInt) != false {
30548 break
30549 }
30550 x := v_0
30551 con := v_1
30552 if con.Op != OpConst8 {
30553 break
30554 }
30555 c := auxIntToInt8(con.AuxInt)
30556 if !(0 < c && c < 16) {
30557 break
30558 }
30559 v.reset(OpRsh16Ux8)
30560 v.AuxInt = boolToAuxInt(true)
30561 v.AddArg2(x, con)
30562 return true
30563 }
30564 return false
30565 }
30566 func rewriteValuegeneric_OpRsh16x16(v *Value) bool {
30567 v_1 := v.Args[1]
30568 v_0 := v.Args[0]
30569 b := v.Block
30570
30571
30572 for {
30573 x := v_0
30574 if v_1.Op != OpConst16 {
30575 break
30576 }
30577 c := auxIntToInt16(v_1.AuxInt)
30578 v.reset(OpRsh16x64)
30579 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
30580 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
30581 v.AddArg2(x, v0)
30582 return true
30583 }
30584
30585
30586 for {
30587 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
30588 break
30589 }
30590 v.reset(OpConst16)
30591 v.AuxInt = int16ToAuxInt(0)
30592 return true
30593 }
30594
30595
30596
30597 for {
30598 if auxIntToBool(v.AuxInt) != false {
30599 break
30600 }
30601 x := v_0
30602 con := v_1
30603 if con.Op != OpConst16 {
30604 break
30605 }
30606 c := auxIntToInt16(con.AuxInt)
30607 if !(0 < c && c < 16) {
30608 break
30609 }
30610 v.reset(OpRsh16x16)
30611 v.AuxInt = boolToAuxInt(true)
30612 v.AddArg2(x, con)
30613 return true
30614 }
30615 return false
30616 }
30617 func rewriteValuegeneric_OpRsh16x32(v *Value) bool {
30618 v_1 := v.Args[1]
30619 v_0 := v.Args[0]
30620 b := v.Block
30621
30622
30623 for {
30624 x := v_0
30625 if v_1.Op != OpConst32 {
30626 break
30627 }
30628 c := auxIntToInt32(v_1.AuxInt)
30629 v.reset(OpRsh16x64)
30630 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
30631 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
30632 v.AddArg2(x, v0)
30633 return true
30634 }
30635
30636
30637 for {
30638 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
30639 break
30640 }
30641 v.reset(OpConst16)
30642 v.AuxInt = int16ToAuxInt(0)
30643 return true
30644 }
30645
30646
30647
30648 for {
30649 if auxIntToBool(v.AuxInt) != false {
30650 break
30651 }
30652 x := v_0
30653 con := v_1
30654 if con.Op != OpConst32 {
30655 break
30656 }
30657 c := auxIntToInt32(con.AuxInt)
30658 if !(0 < c && c < 16) {
30659 break
30660 }
30661 v.reset(OpRsh16x32)
30662 v.AuxInt = boolToAuxInt(true)
30663 v.AddArg2(x, con)
30664 return true
30665 }
30666 return false
30667 }
30668 func rewriteValuegeneric_OpRsh16x64(v *Value) bool {
30669 v_1 := v.Args[1]
30670 v_0 := v.Args[0]
30671 b := v.Block
30672 typ := &b.Func.Config.Types
30673
30674
30675 for {
30676 if v_0.Op != OpConst16 {
30677 break
30678 }
30679 c := auxIntToInt16(v_0.AuxInt)
30680 if v_1.Op != OpConst64 {
30681 break
30682 }
30683 d := auxIntToInt64(v_1.AuxInt)
30684 v.reset(OpConst16)
30685 v.AuxInt = int16ToAuxInt(c >> uint64(d))
30686 return true
30687 }
30688
30689
30690 for {
30691 x := v_0
30692 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
30693 break
30694 }
30695 v.copyOf(x)
30696 return true
30697 }
30698
30699
30700 for {
30701 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
30702 break
30703 }
30704 v.reset(OpConst16)
30705 v.AuxInt = int16ToAuxInt(0)
30706 return true
30707 }
30708
30709
30710
30711 for {
30712 t := v.Type
30713 if v_0.Op != OpRsh16x64 {
30714 break
30715 }
30716 _ = v_0.Args[1]
30717 x := v_0.Args[0]
30718 v_0_1 := v_0.Args[1]
30719 if v_0_1.Op != OpConst64 {
30720 break
30721 }
30722 c := auxIntToInt64(v_0_1.AuxInt)
30723 if v_1.Op != OpConst64 {
30724 break
30725 }
30726 d := auxIntToInt64(v_1.AuxInt)
30727 if !(!uaddOvf(c, d)) {
30728 break
30729 }
30730 v.reset(OpRsh16x64)
30731 v0 := b.NewValue0(v.Pos, OpConst64, t)
30732 v0.AuxInt = int64ToAuxInt(c + d)
30733 v.AddArg2(x, v0)
30734 return true
30735 }
30736
30737
30738 for {
30739 if v_0.Op != OpLsh16x64 {
30740 break
30741 }
30742 _ = v_0.Args[1]
30743 x := v_0.Args[0]
30744 v_0_1 := v_0.Args[1]
30745 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 8 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 8 {
30746 break
30747 }
30748 v.reset(OpSignExt8to16)
30749 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.Int8)
30750 v0.AddArg(x)
30751 v.AddArg(v0)
30752 return true
30753 }
30754
30755
30756
30757 for {
30758 if auxIntToBool(v.AuxInt) != false {
30759 break
30760 }
30761 x := v_0
30762 con := v_1
30763 if con.Op != OpConst64 {
30764 break
30765 }
30766 c := auxIntToInt64(con.AuxInt)
30767 if !(0 < c && c < 16) {
30768 break
30769 }
30770 v.reset(OpRsh16x64)
30771 v.AuxInt = boolToAuxInt(true)
30772 v.AddArg2(x, con)
30773 return true
30774 }
30775 return false
30776 }
30777 func rewriteValuegeneric_OpRsh16x8(v *Value) bool {
30778 v_1 := v.Args[1]
30779 v_0 := v.Args[0]
30780 b := v.Block
30781
30782
30783 for {
30784 x := v_0
30785 if v_1.Op != OpConst8 {
30786 break
30787 }
30788 c := auxIntToInt8(v_1.AuxInt)
30789 v.reset(OpRsh16x64)
30790 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
30791 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
30792 v.AddArg2(x, v0)
30793 return true
30794 }
30795
30796
30797 for {
30798 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
30799 break
30800 }
30801 v.reset(OpConst16)
30802 v.AuxInt = int16ToAuxInt(0)
30803 return true
30804 }
30805
30806
30807
30808 for {
30809 if auxIntToBool(v.AuxInt) != false {
30810 break
30811 }
30812 x := v_0
30813 con := v_1
30814 if con.Op != OpConst8 {
30815 break
30816 }
30817 c := auxIntToInt8(con.AuxInt)
30818 if !(0 < c && c < 16) {
30819 break
30820 }
30821 v.reset(OpRsh16x8)
30822 v.AuxInt = boolToAuxInt(true)
30823 v.AddArg2(x, con)
30824 return true
30825 }
30826 return false
30827 }
30828 func rewriteValuegeneric_OpRsh32Ux16(v *Value) bool {
30829 v_1 := v.Args[1]
30830 v_0 := v.Args[0]
30831 b := v.Block
30832
30833
30834 for {
30835 x := v_0
30836 if v_1.Op != OpConst16 {
30837 break
30838 }
30839 c := auxIntToInt16(v_1.AuxInt)
30840 v.reset(OpRsh32Ux64)
30841 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
30842 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
30843 v.AddArg2(x, v0)
30844 return true
30845 }
30846
30847
30848 for {
30849 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
30850 break
30851 }
30852 v.reset(OpConst32)
30853 v.AuxInt = int32ToAuxInt(0)
30854 return true
30855 }
30856
30857
30858
30859 for {
30860 if auxIntToBool(v.AuxInt) != false {
30861 break
30862 }
30863 x := v_0
30864 con := v_1
30865 if con.Op != OpConst16 {
30866 break
30867 }
30868 c := auxIntToInt16(con.AuxInt)
30869 if !(0 < c && c < 32) {
30870 break
30871 }
30872 v.reset(OpRsh32Ux16)
30873 v.AuxInt = boolToAuxInt(true)
30874 v.AddArg2(x, con)
30875 return true
30876 }
30877 return false
30878 }
30879 func rewriteValuegeneric_OpRsh32Ux32(v *Value) bool {
30880 v_1 := v.Args[1]
30881 v_0 := v.Args[0]
30882 b := v.Block
30883
30884
30885 for {
30886 x := v_0
30887 if v_1.Op != OpConst32 {
30888 break
30889 }
30890 c := auxIntToInt32(v_1.AuxInt)
30891 v.reset(OpRsh32Ux64)
30892 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
30893 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
30894 v.AddArg2(x, v0)
30895 return true
30896 }
30897
30898
30899 for {
30900 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
30901 break
30902 }
30903 v.reset(OpConst32)
30904 v.AuxInt = int32ToAuxInt(0)
30905 return true
30906 }
30907
30908
30909
30910 for {
30911 if auxIntToBool(v.AuxInt) != false {
30912 break
30913 }
30914 x := v_0
30915 con := v_1
30916 if con.Op != OpConst32 {
30917 break
30918 }
30919 c := auxIntToInt32(con.AuxInt)
30920 if !(0 < c && c < 32) {
30921 break
30922 }
30923 v.reset(OpRsh32Ux32)
30924 v.AuxInt = boolToAuxInt(true)
30925 v.AddArg2(x, con)
30926 return true
30927 }
30928 return false
30929 }
30930 func rewriteValuegeneric_OpRsh32Ux64(v *Value) bool {
30931 v_1 := v.Args[1]
30932 v_0 := v.Args[0]
30933 b := v.Block
30934 typ := &b.Func.Config.Types
30935
30936
30937 for {
30938 if v_0.Op != OpConst32 {
30939 break
30940 }
30941 c := auxIntToInt32(v_0.AuxInt)
30942 if v_1.Op != OpConst64 {
30943 break
30944 }
30945 d := auxIntToInt64(v_1.AuxInt)
30946 v.reset(OpConst32)
30947 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
30948 return true
30949 }
30950
30951
30952 for {
30953 x := v_0
30954 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
30955 break
30956 }
30957 v.copyOf(x)
30958 return true
30959 }
30960
30961
30962 for {
30963 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
30964 break
30965 }
30966 v.reset(OpConst32)
30967 v.AuxInt = int32ToAuxInt(0)
30968 return true
30969 }
30970
30971
30972
30973 for {
30974 if v_1.Op != OpConst64 {
30975 break
30976 }
30977 c := auxIntToInt64(v_1.AuxInt)
30978 if !(uint64(c) >= 32) {
30979 break
30980 }
30981 v.reset(OpConst32)
30982 v.AuxInt = int32ToAuxInt(0)
30983 return true
30984 }
30985
30986
30987
30988 for {
30989 t := v.Type
30990 if v_0.Op != OpRsh32Ux64 {
30991 break
30992 }
30993 _ = v_0.Args[1]
30994 x := v_0.Args[0]
30995 v_0_1 := v_0.Args[1]
30996 if v_0_1.Op != OpConst64 {
30997 break
30998 }
30999 c := auxIntToInt64(v_0_1.AuxInt)
31000 if v_1.Op != OpConst64 {
31001 break
31002 }
31003 d := auxIntToInt64(v_1.AuxInt)
31004 if !(!uaddOvf(c, d)) {
31005 break
31006 }
31007 v.reset(OpRsh32Ux64)
31008 v0 := b.NewValue0(v.Pos, OpConst64, t)
31009 v0.AuxInt = int64ToAuxInt(c + d)
31010 v.AddArg2(x, v0)
31011 return true
31012 }
31013
31014
31015 for {
31016 if v_0.Op != OpRsh32x64 {
31017 break
31018 }
31019 x := v_0.Args[0]
31020 if v_1.Op != OpConst64 {
31021 break
31022 }
31023 t := v_1.Type
31024 if auxIntToInt64(v_1.AuxInt) != 31 {
31025 break
31026 }
31027 v.reset(OpRsh32Ux64)
31028 v0 := b.NewValue0(v.Pos, OpConst64, t)
31029 v0.AuxInt = int64ToAuxInt(31)
31030 v.AddArg2(x, v0)
31031 return true
31032 }
31033
31034
31035
31036 for {
31037 i := v_0
31038 if i.Op != OpLsh32x64 {
31039 break
31040 }
31041 _ = i.Args[1]
31042 x := i.Args[0]
31043 i_1 := i.Args[1]
31044 if i_1.Op != OpConst64 {
31045 break
31046 }
31047 c := auxIntToInt64(i_1.AuxInt)
31048 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
31049 break
31050 }
31051 v.reset(OpAnd32)
31052 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
31053 v0.AuxInt = int32ToAuxInt(int32(^uint32(0) >> c))
31054 v.AddArg2(x, v0)
31055 return true
31056 }
31057
31058
31059
31060 for {
31061 if v_0.Op != OpLsh32x64 {
31062 break
31063 }
31064 _ = v_0.Args[1]
31065 v_0_0 := v_0.Args[0]
31066 if v_0_0.Op != OpRsh32Ux64 {
31067 break
31068 }
31069 _ = v_0_0.Args[1]
31070 x := v_0_0.Args[0]
31071 v_0_0_1 := v_0_0.Args[1]
31072 if v_0_0_1.Op != OpConst64 {
31073 break
31074 }
31075 c1 := auxIntToInt64(v_0_0_1.AuxInt)
31076 v_0_1 := v_0.Args[1]
31077 if v_0_1.Op != OpConst64 {
31078 break
31079 }
31080 c2 := auxIntToInt64(v_0_1.AuxInt)
31081 if v_1.Op != OpConst64 {
31082 break
31083 }
31084 c3 := auxIntToInt64(v_1.AuxInt)
31085 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
31086 break
31087 }
31088 v.reset(OpRsh32Ux64)
31089 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
31090 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
31091 v.AddArg2(x, v0)
31092 return true
31093 }
31094
31095
31096 for {
31097 if v_0.Op != OpLsh32x64 {
31098 break
31099 }
31100 _ = v_0.Args[1]
31101 x := v_0.Args[0]
31102 v_0_1 := v_0.Args[1]
31103 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 24 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 24 {
31104 break
31105 }
31106 v.reset(OpZeroExt8to32)
31107 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.UInt8)
31108 v0.AddArg(x)
31109 v.AddArg(v0)
31110 return true
31111 }
31112
31113
31114 for {
31115 if v_0.Op != OpLsh32x64 {
31116 break
31117 }
31118 _ = v_0.Args[1]
31119 x := v_0.Args[0]
31120 v_0_1 := v_0.Args[1]
31121 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 16 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 16 {
31122 break
31123 }
31124 v.reset(OpZeroExt16to32)
31125 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.UInt16)
31126 v0.AddArg(x)
31127 v.AddArg(v0)
31128 return true
31129 }
31130
31131
31132
31133 for {
31134 if auxIntToBool(v.AuxInt) != false {
31135 break
31136 }
31137 x := v_0
31138 con := v_1
31139 if con.Op != OpConst64 {
31140 break
31141 }
31142 c := auxIntToInt64(con.AuxInt)
31143 if !(0 < c && c < 32) {
31144 break
31145 }
31146 v.reset(OpRsh32Ux64)
31147 v.AuxInt = boolToAuxInt(true)
31148 v.AddArg2(x, con)
31149 return true
31150 }
31151 return false
31152 }
31153 func rewriteValuegeneric_OpRsh32Ux8(v *Value) bool {
31154 v_1 := v.Args[1]
31155 v_0 := v.Args[0]
31156 b := v.Block
31157
31158
31159 for {
31160 x := v_0
31161 if v_1.Op != OpConst8 {
31162 break
31163 }
31164 c := auxIntToInt8(v_1.AuxInt)
31165 v.reset(OpRsh32Ux64)
31166 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
31167 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
31168 v.AddArg2(x, v0)
31169 return true
31170 }
31171
31172
31173 for {
31174 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
31175 break
31176 }
31177 v.reset(OpConst32)
31178 v.AuxInt = int32ToAuxInt(0)
31179 return true
31180 }
31181
31182
31183
31184 for {
31185 if auxIntToBool(v.AuxInt) != false {
31186 break
31187 }
31188 x := v_0
31189 con := v_1
31190 if con.Op != OpConst8 {
31191 break
31192 }
31193 c := auxIntToInt8(con.AuxInt)
31194 if !(0 < c && c < 32) {
31195 break
31196 }
31197 v.reset(OpRsh32Ux8)
31198 v.AuxInt = boolToAuxInt(true)
31199 v.AddArg2(x, con)
31200 return true
31201 }
31202 return false
31203 }
31204 func rewriteValuegeneric_OpRsh32x16(v *Value) bool {
31205 v_1 := v.Args[1]
31206 v_0 := v.Args[0]
31207 b := v.Block
31208
31209
31210 for {
31211 x := v_0
31212 if v_1.Op != OpConst16 {
31213 break
31214 }
31215 c := auxIntToInt16(v_1.AuxInt)
31216 v.reset(OpRsh32x64)
31217 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
31218 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
31219 v.AddArg2(x, v0)
31220 return true
31221 }
31222
31223
31224 for {
31225 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
31226 break
31227 }
31228 v.reset(OpConst32)
31229 v.AuxInt = int32ToAuxInt(0)
31230 return true
31231 }
31232
31233
31234
31235 for {
31236 if auxIntToBool(v.AuxInt) != false {
31237 break
31238 }
31239 x := v_0
31240 con := v_1
31241 if con.Op != OpConst16 {
31242 break
31243 }
31244 c := auxIntToInt16(con.AuxInt)
31245 if !(0 < c && c < 32) {
31246 break
31247 }
31248 v.reset(OpRsh32x16)
31249 v.AuxInt = boolToAuxInt(true)
31250 v.AddArg2(x, con)
31251 return true
31252 }
31253 return false
31254 }
31255 func rewriteValuegeneric_OpRsh32x32(v *Value) bool {
31256 v_1 := v.Args[1]
31257 v_0 := v.Args[0]
31258 b := v.Block
31259
31260
31261 for {
31262 x := v_0
31263 if v_1.Op != OpConst32 {
31264 break
31265 }
31266 c := auxIntToInt32(v_1.AuxInt)
31267 v.reset(OpRsh32x64)
31268 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
31269 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
31270 v.AddArg2(x, v0)
31271 return true
31272 }
31273
31274
31275 for {
31276 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
31277 break
31278 }
31279 v.reset(OpConst32)
31280 v.AuxInt = int32ToAuxInt(0)
31281 return true
31282 }
31283
31284
31285
31286 for {
31287 if auxIntToBool(v.AuxInt) != false {
31288 break
31289 }
31290 x := v_0
31291 con := v_1
31292 if con.Op != OpConst32 {
31293 break
31294 }
31295 c := auxIntToInt32(con.AuxInt)
31296 if !(0 < c && c < 32) {
31297 break
31298 }
31299 v.reset(OpRsh32x32)
31300 v.AuxInt = boolToAuxInt(true)
31301 v.AddArg2(x, con)
31302 return true
31303 }
31304 return false
31305 }
31306 func rewriteValuegeneric_OpRsh32x64(v *Value) bool {
31307 v_1 := v.Args[1]
31308 v_0 := v.Args[0]
31309 b := v.Block
31310 typ := &b.Func.Config.Types
31311
31312
31313 for {
31314 if v_0.Op != OpConst32 {
31315 break
31316 }
31317 c := auxIntToInt32(v_0.AuxInt)
31318 if v_1.Op != OpConst64 {
31319 break
31320 }
31321 d := auxIntToInt64(v_1.AuxInt)
31322 v.reset(OpConst32)
31323 v.AuxInt = int32ToAuxInt(c >> uint64(d))
31324 return true
31325 }
31326
31327
31328 for {
31329 x := v_0
31330 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
31331 break
31332 }
31333 v.copyOf(x)
31334 return true
31335 }
31336
31337
31338 for {
31339 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
31340 break
31341 }
31342 v.reset(OpConst32)
31343 v.AuxInt = int32ToAuxInt(0)
31344 return true
31345 }
31346
31347
31348
31349 for {
31350 t := v.Type
31351 if v_0.Op != OpRsh32x64 {
31352 break
31353 }
31354 _ = v_0.Args[1]
31355 x := v_0.Args[0]
31356 v_0_1 := v_0.Args[1]
31357 if v_0_1.Op != OpConst64 {
31358 break
31359 }
31360 c := auxIntToInt64(v_0_1.AuxInt)
31361 if v_1.Op != OpConst64 {
31362 break
31363 }
31364 d := auxIntToInt64(v_1.AuxInt)
31365 if !(!uaddOvf(c, d)) {
31366 break
31367 }
31368 v.reset(OpRsh32x64)
31369 v0 := b.NewValue0(v.Pos, OpConst64, t)
31370 v0.AuxInt = int64ToAuxInt(c + d)
31371 v.AddArg2(x, v0)
31372 return true
31373 }
31374
31375
31376 for {
31377 if v_0.Op != OpLsh32x64 {
31378 break
31379 }
31380 _ = v_0.Args[1]
31381 x := v_0.Args[0]
31382 v_0_1 := v_0.Args[1]
31383 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 24 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 24 {
31384 break
31385 }
31386 v.reset(OpSignExt8to32)
31387 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.Int8)
31388 v0.AddArg(x)
31389 v.AddArg(v0)
31390 return true
31391 }
31392
31393
31394 for {
31395 if v_0.Op != OpLsh32x64 {
31396 break
31397 }
31398 _ = v_0.Args[1]
31399 x := v_0.Args[0]
31400 v_0_1 := v_0.Args[1]
31401 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 16 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 16 {
31402 break
31403 }
31404 v.reset(OpSignExt16to32)
31405 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.Int16)
31406 v0.AddArg(x)
31407 v.AddArg(v0)
31408 return true
31409 }
31410
31411
31412
31413 for {
31414 if auxIntToBool(v.AuxInt) != false {
31415 break
31416 }
31417 x := v_0
31418 con := v_1
31419 if con.Op != OpConst64 {
31420 break
31421 }
31422 c := auxIntToInt64(con.AuxInt)
31423 if !(0 < c && c < 32) {
31424 break
31425 }
31426 v.reset(OpRsh32x64)
31427 v.AuxInt = boolToAuxInt(true)
31428 v.AddArg2(x, con)
31429 return true
31430 }
31431 return false
31432 }
31433 func rewriteValuegeneric_OpRsh32x8(v *Value) bool {
31434 v_1 := v.Args[1]
31435 v_0 := v.Args[0]
31436 b := v.Block
31437
31438
31439 for {
31440 x := v_0
31441 if v_1.Op != OpConst8 {
31442 break
31443 }
31444 c := auxIntToInt8(v_1.AuxInt)
31445 v.reset(OpRsh32x64)
31446 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
31447 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
31448 v.AddArg2(x, v0)
31449 return true
31450 }
31451
31452
31453 for {
31454 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
31455 break
31456 }
31457 v.reset(OpConst32)
31458 v.AuxInt = int32ToAuxInt(0)
31459 return true
31460 }
31461
31462
31463
31464 for {
31465 if auxIntToBool(v.AuxInt) != false {
31466 break
31467 }
31468 x := v_0
31469 con := v_1
31470 if con.Op != OpConst8 {
31471 break
31472 }
31473 c := auxIntToInt8(con.AuxInt)
31474 if !(0 < c && c < 32) {
31475 break
31476 }
31477 v.reset(OpRsh32x8)
31478 v.AuxInt = boolToAuxInt(true)
31479 v.AddArg2(x, con)
31480 return true
31481 }
31482 return false
31483 }
31484 func rewriteValuegeneric_OpRsh64Ux16(v *Value) bool {
31485 v_1 := v.Args[1]
31486 v_0 := v.Args[0]
31487 b := v.Block
31488
31489
31490 for {
31491 x := v_0
31492 if v_1.Op != OpConst16 {
31493 break
31494 }
31495 c := auxIntToInt16(v_1.AuxInt)
31496 v.reset(OpRsh64Ux64)
31497 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
31498 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
31499 v.AddArg2(x, v0)
31500 return true
31501 }
31502
31503
31504 for {
31505 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
31506 break
31507 }
31508 v.reset(OpConst64)
31509 v.AuxInt = int64ToAuxInt(0)
31510 return true
31511 }
31512
31513
31514
31515 for {
31516 if auxIntToBool(v.AuxInt) != false {
31517 break
31518 }
31519 x := v_0
31520 con := v_1
31521 if con.Op != OpConst16 {
31522 break
31523 }
31524 c := auxIntToInt16(con.AuxInt)
31525 if !(0 < c && c < 64) {
31526 break
31527 }
31528 v.reset(OpRsh64Ux16)
31529 v.AuxInt = boolToAuxInt(true)
31530 v.AddArg2(x, con)
31531 return true
31532 }
31533 return false
31534 }
31535 func rewriteValuegeneric_OpRsh64Ux32(v *Value) bool {
31536 v_1 := v.Args[1]
31537 v_0 := v.Args[0]
31538 b := v.Block
31539
31540
31541 for {
31542 x := v_0
31543 if v_1.Op != OpConst32 {
31544 break
31545 }
31546 c := auxIntToInt32(v_1.AuxInt)
31547 v.reset(OpRsh64Ux64)
31548 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
31549 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
31550 v.AddArg2(x, v0)
31551 return true
31552 }
31553
31554
31555 for {
31556 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
31557 break
31558 }
31559 v.reset(OpConst64)
31560 v.AuxInt = int64ToAuxInt(0)
31561 return true
31562 }
31563
31564
31565
31566 for {
31567 if auxIntToBool(v.AuxInt) != false {
31568 break
31569 }
31570 x := v_0
31571 con := v_1
31572 if con.Op != OpConst32 {
31573 break
31574 }
31575 c := auxIntToInt32(con.AuxInt)
31576 if !(0 < c && c < 64) {
31577 break
31578 }
31579 v.reset(OpRsh64Ux32)
31580 v.AuxInt = boolToAuxInt(true)
31581 v.AddArg2(x, con)
31582 return true
31583 }
31584 return false
31585 }
31586 func rewriteValuegeneric_OpRsh64Ux64(v *Value) bool {
31587 v_1 := v.Args[1]
31588 v_0 := v.Args[0]
31589 b := v.Block
31590 typ := &b.Func.Config.Types
31591
31592
31593 for {
31594 if v_0.Op != OpConst64 {
31595 break
31596 }
31597 c := auxIntToInt64(v_0.AuxInt)
31598 if v_1.Op != OpConst64 {
31599 break
31600 }
31601 d := auxIntToInt64(v_1.AuxInt)
31602 v.reset(OpConst64)
31603 v.AuxInt = int64ToAuxInt(int64(uint64(c) >> uint64(d)))
31604 return true
31605 }
31606
31607
31608 for {
31609 x := v_0
31610 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
31611 break
31612 }
31613 v.copyOf(x)
31614 return true
31615 }
31616
31617
31618 for {
31619 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
31620 break
31621 }
31622 v.reset(OpConst64)
31623 v.AuxInt = int64ToAuxInt(0)
31624 return true
31625 }
31626
31627
31628
31629 for {
31630 if v_1.Op != OpConst64 {
31631 break
31632 }
31633 c := auxIntToInt64(v_1.AuxInt)
31634 if !(uint64(c) >= 64) {
31635 break
31636 }
31637 v.reset(OpConst64)
31638 v.AuxInt = int64ToAuxInt(0)
31639 return true
31640 }
31641
31642
31643
31644 for {
31645 t := v.Type
31646 if v_0.Op != OpRsh64Ux64 {
31647 break
31648 }
31649 _ = v_0.Args[1]
31650 x := v_0.Args[0]
31651 v_0_1 := v_0.Args[1]
31652 if v_0_1.Op != OpConst64 {
31653 break
31654 }
31655 c := auxIntToInt64(v_0_1.AuxInt)
31656 if v_1.Op != OpConst64 {
31657 break
31658 }
31659 d := auxIntToInt64(v_1.AuxInt)
31660 if !(!uaddOvf(c, d)) {
31661 break
31662 }
31663 v.reset(OpRsh64Ux64)
31664 v0 := b.NewValue0(v.Pos, OpConst64, t)
31665 v0.AuxInt = int64ToAuxInt(c + d)
31666 v.AddArg2(x, v0)
31667 return true
31668 }
31669
31670
31671 for {
31672 if v_0.Op != OpRsh64x64 {
31673 break
31674 }
31675 x := v_0.Args[0]
31676 if v_1.Op != OpConst64 {
31677 break
31678 }
31679 t := v_1.Type
31680 if auxIntToInt64(v_1.AuxInt) != 63 {
31681 break
31682 }
31683 v.reset(OpRsh64Ux64)
31684 v0 := b.NewValue0(v.Pos, OpConst64, t)
31685 v0.AuxInt = int64ToAuxInt(63)
31686 v.AddArg2(x, v0)
31687 return true
31688 }
31689
31690
31691
31692 for {
31693 i := v_0
31694 if i.Op != OpLsh64x64 {
31695 break
31696 }
31697 _ = i.Args[1]
31698 x := i.Args[0]
31699 i_1 := i.Args[1]
31700 if i_1.Op != OpConst64 {
31701 break
31702 }
31703 c := auxIntToInt64(i_1.AuxInt)
31704 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
31705 break
31706 }
31707 v.reset(OpAnd64)
31708 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
31709 v0.AuxInt = int64ToAuxInt(int64(^uint64(0) >> c))
31710 v.AddArg2(x, v0)
31711 return true
31712 }
31713
31714
31715
31716 for {
31717 if v_0.Op != OpLsh64x64 {
31718 break
31719 }
31720 _ = v_0.Args[1]
31721 v_0_0 := v_0.Args[0]
31722 if v_0_0.Op != OpRsh64Ux64 {
31723 break
31724 }
31725 _ = v_0_0.Args[1]
31726 x := v_0_0.Args[0]
31727 v_0_0_1 := v_0_0.Args[1]
31728 if v_0_0_1.Op != OpConst64 {
31729 break
31730 }
31731 c1 := auxIntToInt64(v_0_0_1.AuxInt)
31732 v_0_1 := v_0.Args[1]
31733 if v_0_1.Op != OpConst64 {
31734 break
31735 }
31736 c2 := auxIntToInt64(v_0_1.AuxInt)
31737 if v_1.Op != OpConst64 {
31738 break
31739 }
31740 c3 := auxIntToInt64(v_1.AuxInt)
31741 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
31742 break
31743 }
31744 v.reset(OpRsh64Ux64)
31745 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
31746 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
31747 v.AddArg2(x, v0)
31748 return true
31749 }
31750
31751
31752 for {
31753 if v_0.Op != OpLsh64x64 {
31754 break
31755 }
31756 _ = v_0.Args[1]
31757 x := v_0.Args[0]
31758 v_0_1 := v_0.Args[1]
31759 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 56 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 56 {
31760 break
31761 }
31762 v.reset(OpZeroExt8to64)
31763 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.UInt8)
31764 v0.AddArg(x)
31765 v.AddArg(v0)
31766 return true
31767 }
31768
31769
31770 for {
31771 if v_0.Op != OpLsh64x64 {
31772 break
31773 }
31774 _ = v_0.Args[1]
31775 x := v_0.Args[0]
31776 v_0_1 := v_0.Args[1]
31777 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 48 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 48 {
31778 break
31779 }
31780 v.reset(OpZeroExt16to64)
31781 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.UInt16)
31782 v0.AddArg(x)
31783 v.AddArg(v0)
31784 return true
31785 }
31786
31787
31788 for {
31789 if v_0.Op != OpLsh64x64 {
31790 break
31791 }
31792 _ = v_0.Args[1]
31793 x := v_0.Args[0]
31794 v_0_1 := v_0.Args[1]
31795 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 32 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 32 {
31796 break
31797 }
31798 v.reset(OpZeroExt32to64)
31799 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.UInt32)
31800 v0.AddArg(x)
31801 v.AddArg(v0)
31802 return true
31803 }
31804
31805
31806
31807 for {
31808 if auxIntToBool(v.AuxInt) != false {
31809 break
31810 }
31811 x := v_0
31812 con := v_1
31813 if con.Op != OpConst64 {
31814 break
31815 }
31816 c := auxIntToInt64(con.AuxInt)
31817 if !(0 < c && c < 64) {
31818 break
31819 }
31820 v.reset(OpRsh64Ux64)
31821 v.AuxInt = boolToAuxInt(true)
31822 v.AddArg2(x, con)
31823 return true
31824 }
31825 return false
31826 }
31827 func rewriteValuegeneric_OpRsh64Ux8(v *Value) bool {
31828 v_1 := v.Args[1]
31829 v_0 := v.Args[0]
31830 b := v.Block
31831
31832
31833 for {
31834 x := v_0
31835 if v_1.Op != OpConst8 {
31836 break
31837 }
31838 c := auxIntToInt8(v_1.AuxInt)
31839 v.reset(OpRsh64Ux64)
31840 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
31841 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
31842 v.AddArg2(x, v0)
31843 return true
31844 }
31845
31846
31847 for {
31848 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
31849 break
31850 }
31851 v.reset(OpConst64)
31852 v.AuxInt = int64ToAuxInt(0)
31853 return true
31854 }
31855
31856
31857
31858 for {
31859 if auxIntToBool(v.AuxInt) != false {
31860 break
31861 }
31862 x := v_0
31863 con := v_1
31864 if con.Op != OpConst8 {
31865 break
31866 }
31867 c := auxIntToInt8(con.AuxInt)
31868 if !(0 < c && c < 64) {
31869 break
31870 }
31871 v.reset(OpRsh64Ux8)
31872 v.AuxInt = boolToAuxInt(true)
31873 v.AddArg2(x, con)
31874 return true
31875 }
31876 return false
31877 }
31878 func rewriteValuegeneric_OpRsh64x16(v *Value) bool {
31879 v_1 := v.Args[1]
31880 v_0 := v.Args[0]
31881 b := v.Block
31882
31883
31884 for {
31885 x := v_0
31886 if v_1.Op != OpConst16 {
31887 break
31888 }
31889 c := auxIntToInt16(v_1.AuxInt)
31890 v.reset(OpRsh64x64)
31891 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
31892 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
31893 v.AddArg2(x, v0)
31894 return true
31895 }
31896
31897
31898 for {
31899 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
31900 break
31901 }
31902 v.reset(OpConst64)
31903 v.AuxInt = int64ToAuxInt(0)
31904 return true
31905 }
31906
31907
31908
31909 for {
31910 if auxIntToBool(v.AuxInt) != false {
31911 break
31912 }
31913 x := v_0
31914 con := v_1
31915 if con.Op != OpConst16 {
31916 break
31917 }
31918 c := auxIntToInt16(con.AuxInt)
31919 if !(0 < c && c < 64) {
31920 break
31921 }
31922 v.reset(OpRsh64x16)
31923 v.AuxInt = boolToAuxInt(true)
31924 v.AddArg2(x, con)
31925 return true
31926 }
31927 return false
31928 }
31929 func rewriteValuegeneric_OpRsh64x32(v *Value) bool {
31930 v_1 := v.Args[1]
31931 v_0 := v.Args[0]
31932 b := v.Block
31933
31934
31935 for {
31936 x := v_0
31937 if v_1.Op != OpConst32 {
31938 break
31939 }
31940 c := auxIntToInt32(v_1.AuxInt)
31941 v.reset(OpRsh64x64)
31942 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
31943 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
31944 v.AddArg2(x, v0)
31945 return true
31946 }
31947
31948
31949 for {
31950 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
31951 break
31952 }
31953 v.reset(OpConst64)
31954 v.AuxInt = int64ToAuxInt(0)
31955 return true
31956 }
31957
31958
31959
31960 for {
31961 if auxIntToBool(v.AuxInt) != false {
31962 break
31963 }
31964 x := v_0
31965 con := v_1
31966 if con.Op != OpConst32 {
31967 break
31968 }
31969 c := auxIntToInt32(con.AuxInt)
31970 if !(0 < c && c < 64) {
31971 break
31972 }
31973 v.reset(OpRsh64x32)
31974 v.AuxInt = boolToAuxInt(true)
31975 v.AddArg2(x, con)
31976 return true
31977 }
31978 return false
31979 }
31980 func rewriteValuegeneric_OpRsh64x64(v *Value) bool {
31981 v_1 := v.Args[1]
31982 v_0 := v.Args[0]
31983 b := v.Block
31984 typ := &b.Func.Config.Types
31985
31986
31987 for {
31988 if v_0.Op != OpConst64 {
31989 break
31990 }
31991 c := auxIntToInt64(v_0.AuxInt)
31992 if v_1.Op != OpConst64 {
31993 break
31994 }
31995 d := auxIntToInt64(v_1.AuxInt)
31996 v.reset(OpConst64)
31997 v.AuxInt = int64ToAuxInt(c >> uint64(d))
31998 return true
31999 }
32000
32001
32002 for {
32003 x := v_0
32004 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
32005 break
32006 }
32007 v.copyOf(x)
32008 return true
32009 }
32010
32011
32012 for {
32013 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
32014 break
32015 }
32016 v.reset(OpConst64)
32017 v.AuxInt = int64ToAuxInt(0)
32018 return true
32019 }
32020
32021
32022
32023 for {
32024 t := v.Type
32025 if v_0.Op != OpRsh64x64 {
32026 break
32027 }
32028 _ = v_0.Args[1]
32029 x := v_0.Args[0]
32030 v_0_1 := v_0.Args[1]
32031 if v_0_1.Op != OpConst64 {
32032 break
32033 }
32034 c := auxIntToInt64(v_0_1.AuxInt)
32035 if v_1.Op != OpConst64 {
32036 break
32037 }
32038 d := auxIntToInt64(v_1.AuxInt)
32039 if !(!uaddOvf(c, d)) {
32040 break
32041 }
32042 v.reset(OpRsh64x64)
32043 v0 := b.NewValue0(v.Pos, OpConst64, t)
32044 v0.AuxInt = int64ToAuxInt(c + d)
32045 v.AddArg2(x, v0)
32046 return true
32047 }
32048
32049
32050 for {
32051 if v_0.Op != OpLsh64x64 {
32052 break
32053 }
32054 _ = v_0.Args[1]
32055 x := v_0.Args[0]
32056 v_0_1 := v_0.Args[1]
32057 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 56 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 56 {
32058 break
32059 }
32060 v.reset(OpSignExt8to64)
32061 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.Int8)
32062 v0.AddArg(x)
32063 v.AddArg(v0)
32064 return true
32065 }
32066
32067
32068 for {
32069 if v_0.Op != OpLsh64x64 {
32070 break
32071 }
32072 _ = v_0.Args[1]
32073 x := v_0.Args[0]
32074 v_0_1 := v_0.Args[1]
32075 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 48 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 48 {
32076 break
32077 }
32078 v.reset(OpSignExt16to64)
32079 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.Int16)
32080 v0.AddArg(x)
32081 v.AddArg(v0)
32082 return true
32083 }
32084
32085
32086 for {
32087 if v_0.Op != OpLsh64x64 {
32088 break
32089 }
32090 _ = v_0.Args[1]
32091 x := v_0.Args[0]
32092 v_0_1 := v_0.Args[1]
32093 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 32 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 32 {
32094 break
32095 }
32096 v.reset(OpSignExt32to64)
32097 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.Int32)
32098 v0.AddArg(x)
32099 v.AddArg(v0)
32100 return true
32101 }
32102
32103
32104
32105 for {
32106 if auxIntToBool(v.AuxInt) != false {
32107 break
32108 }
32109 x := v_0
32110 con := v_1
32111 if con.Op != OpConst64 {
32112 break
32113 }
32114 c := auxIntToInt64(con.AuxInt)
32115 if !(0 < c && c < 64) {
32116 break
32117 }
32118 v.reset(OpRsh64x64)
32119 v.AuxInt = boolToAuxInt(true)
32120 v.AddArg2(x, con)
32121 return true
32122 }
32123 return false
32124 }
32125 func rewriteValuegeneric_OpRsh64x8(v *Value) bool {
32126 v_1 := v.Args[1]
32127 v_0 := v.Args[0]
32128 b := v.Block
32129
32130
32131 for {
32132 x := v_0
32133 if v_1.Op != OpConst8 {
32134 break
32135 }
32136 c := auxIntToInt8(v_1.AuxInt)
32137 v.reset(OpRsh64x64)
32138 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
32139 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
32140 v.AddArg2(x, v0)
32141 return true
32142 }
32143
32144
32145 for {
32146 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
32147 break
32148 }
32149 v.reset(OpConst64)
32150 v.AuxInt = int64ToAuxInt(0)
32151 return true
32152 }
32153
32154
32155
32156 for {
32157 if auxIntToBool(v.AuxInt) != false {
32158 break
32159 }
32160 x := v_0
32161 con := v_1
32162 if con.Op != OpConst8 {
32163 break
32164 }
32165 c := auxIntToInt8(con.AuxInt)
32166 if !(0 < c && c < 64) {
32167 break
32168 }
32169 v.reset(OpRsh64x8)
32170 v.AuxInt = boolToAuxInt(true)
32171 v.AddArg2(x, con)
32172 return true
32173 }
32174 return false
32175 }
32176 func rewriteValuegeneric_OpRsh8Ux16(v *Value) bool {
32177 v_1 := v.Args[1]
32178 v_0 := v.Args[0]
32179 b := v.Block
32180
32181
32182 for {
32183 x := v_0
32184 if v_1.Op != OpConst16 {
32185 break
32186 }
32187 c := auxIntToInt16(v_1.AuxInt)
32188 v.reset(OpRsh8Ux64)
32189 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
32190 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
32191 v.AddArg2(x, v0)
32192 return true
32193 }
32194
32195
32196 for {
32197 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
32198 break
32199 }
32200 v.reset(OpConst8)
32201 v.AuxInt = int8ToAuxInt(0)
32202 return true
32203 }
32204
32205
32206
32207 for {
32208 if auxIntToBool(v.AuxInt) != false {
32209 break
32210 }
32211 x := v_0
32212 con := v_1
32213 if con.Op != OpConst16 {
32214 break
32215 }
32216 c := auxIntToInt16(con.AuxInt)
32217 if !(0 < c && c < 8) {
32218 break
32219 }
32220 v.reset(OpRsh8Ux16)
32221 v.AuxInt = boolToAuxInt(true)
32222 v.AddArg2(x, con)
32223 return true
32224 }
32225 return false
32226 }
32227 func rewriteValuegeneric_OpRsh8Ux32(v *Value) bool {
32228 v_1 := v.Args[1]
32229 v_0 := v.Args[0]
32230 b := v.Block
32231
32232
32233 for {
32234 x := v_0
32235 if v_1.Op != OpConst32 {
32236 break
32237 }
32238 c := auxIntToInt32(v_1.AuxInt)
32239 v.reset(OpRsh8Ux64)
32240 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
32241 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
32242 v.AddArg2(x, v0)
32243 return true
32244 }
32245
32246
32247 for {
32248 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
32249 break
32250 }
32251 v.reset(OpConst8)
32252 v.AuxInt = int8ToAuxInt(0)
32253 return true
32254 }
32255
32256
32257
32258 for {
32259 if auxIntToBool(v.AuxInt) != false {
32260 break
32261 }
32262 x := v_0
32263 con := v_1
32264 if con.Op != OpConst32 {
32265 break
32266 }
32267 c := auxIntToInt32(con.AuxInt)
32268 if !(0 < c && c < 8) {
32269 break
32270 }
32271 v.reset(OpRsh8Ux32)
32272 v.AuxInt = boolToAuxInt(true)
32273 v.AddArg2(x, con)
32274 return true
32275 }
32276 return false
32277 }
32278 func rewriteValuegeneric_OpRsh8Ux64(v *Value) bool {
32279 v_1 := v.Args[1]
32280 v_0 := v.Args[0]
32281 b := v.Block
32282 typ := &b.Func.Config.Types
32283
32284
32285 for {
32286 if v_0.Op != OpConst8 {
32287 break
32288 }
32289 c := auxIntToInt8(v_0.AuxInt)
32290 if v_1.Op != OpConst64 {
32291 break
32292 }
32293 d := auxIntToInt64(v_1.AuxInt)
32294 v.reset(OpConst8)
32295 v.AuxInt = int8ToAuxInt(int8(uint8(c) >> uint64(d)))
32296 return true
32297 }
32298
32299
32300 for {
32301 x := v_0
32302 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
32303 break
32304 }
32305 v.copyOf(x)
32306 return true
32307 }
32308
32309
32310 for {
32311 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
32312 break
32313 }
32314 v.reset(OpConst8)
32315 v.AuxInt = int8ToAuxInt(0)
32316 return true
32317 }
32318
32319
32320
32321 for {
32322 if v_1.Op != OpConst64 {
32323 break
32324 }
32325 c := auxIntToInt64(v_1.AuxInt)
32326 if !(uint64(c) >= 8) {
32327 break
32328 }
32329 v.reset(OpConst8)
32330 v.AuxInt = int8ToAuxInt(0)
32331 return true
32332 }
32333
32334
32335
32336 for {
32337 t := v.Type
32338 if v_0.Op != OpRsh8Ux64 {
32339 break
32340 }
32341 _ = v_0.Args[1]
32342 x := v_0.Args[0]
32343 v_0_1 := v_0.Args[1]
32344 if v_0_1.Op != OpConst64 {
32345 break
32346 }
32347 c := auxIntToInt64(v_0_1.AuxInt)
32348 if v_1.Op != OpConst64 {
32349 break
32350 }
32351 d := auxIntToInt64(v_1.AuxInt)
32352 if !(!uaddOvf(c, d)) {
32353 break
32354 }
32355 v.reset(OpRsh8Ux64)
32356 v0 := b.NewValue0(v.Pos, OpConst64, t)
32357 v0.AuxInt = int64ToAuxInt(c + d)
32358 v.AddArg2(x, v0)
32359 return true
32360 }
32361
32362
32363 for {
32364 if v_0.Op != OpRsh8x64 {
32365 break
32366 }
32367 x := v_0.Args[0]
32368 if v_1.Op != OpConst64 {
32369 break
32370 }
32371 t := v_1.Type
32372 if auxIntToInt64(v_1.AuxInt) != 7 {
32373 break
32374 }
32375 v.reset(OpRsh8Ux64)
32376 v0 := b.NewValue0(v.Pos, OpConst64, t)
32377 v0.AuxInt = int64ToAuxInt(7)
32378 v.AddArg2(x, v0)
32379 return true
32380 }
32381
32382
32383
32384 for {
32385 i := v_0
32386 if i.Op != OpLsh8x64 {
32387 break
32388 }
32389 _ = i.Args[1]
32390 x := i.Args[0]
32391 i_1 := i.Args[1]
32392 if i_1.Op != OpConst64 {
32393 break
32394 }
32395 c := auxIntToInt64(i_1.AuxInt)
32396 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
32397 break
32398 }
32399 v.reset(OpAnd8)
32400 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
32401 v0.AuxInt = int8ToAuxInt(int8(^uint8(0) >> c))
32402 v.AddArg2(x, v0)
32403 return true
32404 }
32405
32406
32407
32408 for {
32409 if v_0.Op != OpLsh8x64 {
32410 break
32411 }
32412 _ = v_0.Args[1]
32413 v_0_0 := v_0.Args[0]
32414 if v_0_0.Op != OpRsh8Ux64 {
32415 break
32416 }
32417 _ = v_0_0.Args[1]
32418 x := v_0_0.Args[0]
32419 v_0_0_1 := v_0_0.Args[1]
32420 if v_0_0_1.Op != OpConst64 {
32421 break
32422 }
32423 c1 := auxIntToInt64(v_0_0_1.AuxInt)
32424 v_0_1 := v_0.Args[1]
32425 if v_0_1.Op != OpConst64 {
32426 break
32427 }
32428 c2 := auxIntToInt64(v_0_1.AuxInt)
32429 if v_1.Op != OpConst64 {
32430 break
32431 }
32432 c3 := auxIntToInt64(v_1.AuxInt)
32433 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
32434 break
32435 }
32436 v.reset(OpRsh8Ux64)
32437 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
32438 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
32439 v.AddArg2(x, v0)
32440 return true
32441 }
32442
32443
32444
32445 for {
32446 if auxIntToBool(v.AuxInt) != false {
32447 break
32448 }
32449 x := v_0
32450 con := v_1
32451 if con.Op != OpConst64 {
32452 break
32453 }
32454 c := auxIntToInt64(con.AuxInt)
32455 if !(0 < c && c < 8) {
32456 break
32457 }
32458 v.reset(OpRsh8Ux64)
32459 v.AuxInt = boolToAuxInt(true)
32460 v.AddArg2(x, con)
32461 return true
32462 }
32463 return false
32464 }
32465 func rewriteValuegeneric_OpRsh8Ux8(v *Value) bool {
32466 v_1 := v.Args[1]
32467 v_0 := v.Args[0]
32468 b := v.Block
32469
32470
32471 for {
32472 x := v_0
32473 if v_1.Op != OpConst8 {
32474 break
32475 }
32476 c := auxIntToInt8(v_1.AuxInt)
32477 v.reset(OpRsh8Ux64)
32478 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
32479 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
32480 v.AddArg2(x, v0)
32481 return true
32482 }
32483
32484
32485 for {
32486 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
32487 break
32488 }
32489 v.reset(OpConst8)
32490 v.AuxInt = int8ToAuxInt(0)
32491 return true
32492 }
32493
32494
32495
32496 for {
32497 if auxIntToBool(v.AuxInt) != false {
32498 break
32499 }
32500 x := v_0
32501 con := v_1
32502 if con.Op != OpConst8 {
32503 break
32504 }
32505 c := auxIntToInt8(con.AuxInt)
32506 if !(0 < c && c < 8) {
32507 break
32508 }
32509 v.reset(OpRsh8Ux8)
32510 v.AuxInt = boolToAuxInt(true)
32511 v.AddArg2(x, con)
32512 return true
32513 }
32514 return false
32515 }
32516 func rewriteValuegeneric_OpRsh8x16(v *Value) bool {
32517 v_1 := v.Args[1]
32518 v_0 := v.Args[0]
32519 b := v.Block
32520
32521
32522 for {
32523 x := v_0
32524 if v_1.Op != OpConst16 {
32525 break
32526 }
32527 c := auxIntToInt16(v_1.AuxInt)
32528 v.reset(OpRsh8x64)
32529 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
32530 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
32531 v.AddArg2(x, v0)
32532 return true
32533 }
32534
32535
32536 for {
32537 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
32538 break
32539 }
32540 v.reset(OpConst8)
32541 v.AuxInt = int8ToAuxInt(0)
32542 return true
32543 }
32544
32545
32546
32547 for {
32548 if auxIntToBool(v.AuxInt) != false {
32549 break
32550 }
32551 x := v_0
32552 con := v_1
32553 if con.Op != OpConst16 {
32554 break
32555 }
32556 c := auxIntToInt16(con.AuxInt)
32557 if !(0 < c && c < 8) {
32558 break
32559 }
32560 v.reset(OpRsh8x16)
32561 v.AuxInt = boolToAuxInt(true)
32562 v.AddArg2(x, con)
32563 return true
32564 }
32565 return false
32566 }
32567 func rewriteValuegeneric_OpRsh8x32(v *Value) bool {
32568 v_1 := v.Args[1]
32569 v_0 := v.Args[0]
32570 b := v.Block
32571
32572
32573 for {
32574 x := v_0
32575 if v_1.Op != OpConst32 {
32576 break
32577 }
32578 c := auxIntToInt32(v_1.AuxInt)
32579 v.reset(OpRsh8x64)
32580 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
32581 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
32582 v.AddArg2(x, v0)
32583 return true
32584 }
32585
32586
32587 for {
32588 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
32589 break
32590 }
32591 v.reset(OpConst8)
32592 v.AuxInt = int8ToAuxInt(0)
32593 return true
32594 }
32595
32596
32597
32598 for {
32599 if auxIntToBool(v.AuxInt) != false {
32600 break
32601 }
32602 x := v_0
32603 con := v_1
32604 if con.Op != OpConst32 {
32605 break
32606 }
32607 c := auxIntToInt32(con.AuxInt)
32608 if !(0 < c && c < 8) {
32609 break
32610 }
32611 v.reset(OpRsh8x32)
32612 v.AuxInt = boolToAuxInt(true)
32613 v.AddArg2(x, con)
32614 return true
32615 }
32616 return false
32617 }
32618 func rewriteValuegeneric_OpRsh8x64(v *Value) bool {
32619 v_1 := v.Args[1]
32620 v_0 := v.Args[0]
32621 b := v.Block
32622
32623
32624 for {
32625 if v_0.Op != OpConst8 {
32626 break
32627 }
32628 c := auxIntToInt8(v_0.AuxInt)
32629 if v_1.Op != OpConst64 {
32630 break
32631 }
32632 d := auxIntToInt64(v_1.AuxInt)
32633 v.reset(OpConst8)
32634 v.AuxInt = int8ToAuxInt(c >> uint64(d))
32635 return true
32636 }
32637
32638
32639 for {
32640 x := v_0
32641 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
32642 break
32643 }
32644 v.copyOf(x)
32645 return true
32646 }
32647
32648
32649 for {
32650 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
32651 break
32652 }
32653 v.reset(OpConst8)
32654 v.AuxInt = int8ToAuxInt(0)
32655 return true
32656 }
32657
32658
32659
32660 for {
32661 t := v.Type
32662 if v_0.Op != OpRsh8x64 {
32663 break
32664 }
32665 _ = v_0.Args[1]
32666 x := v_0.Args[0]
32667 v_0_1 := v_0.Args[1]
32668 if v_0_1.Op != OpConst64 {
32669 break
32670 }
32671 c := auxIntToInt64(v_0_1.AuxInt)
32672 if v_1.Op != OpConst64 {
32673 break
32674 }
32675 d := auxIntToInt64(v_1.AuxInt)
32676 if !(!uaddOvf(c, d)) {
32677 break
32678 }
32679 v.reset(OpRsh8x64)
32680 v0 := b.NewValue0(v.Pos, OpConst64, t)
32681 v0.AuxInt = int64ToAuxInt(c + d)
32682 v.AddArg2(x, v0)
32683 return true
32684 }
32685
32686
32687
32688 for {
32689 if auxIntToBool(v.AuxInt) != false {
32690 break
32691 }
32692 x := v_0
32693 con := v_1
32694 if con.Op != OpConst64 {
32695 break
32696 }
32697 c := auxIntToInt64(con.AuxInt)
32698 if !(0 < c && c < 8) {
32699 break
32700 }
32701 v.reset(OpRsh8x64)
32702 v.AuxInt = boolToAuxInt(true)
32703 v.AddArg2(x, con)
32704 return true
32705 }
32706 return false
32707 }
32708 func rewriteValuegeneric_OpRsh8x8(v *Value) bool {
32709 v_1 := v.Args[1]
32710 v_0 := v.Args[0]
32711 b := v.Block
32712
32713
32714 for {
32715 x := v_0
32716 if v_1.Op != OpConst8 {
32717 break
32718 }
32719 c := auxIntToInt8(v_1.AuxInt)
32720 v.reset(OpRsh8x64)
32721 v0 := b.NewValue0(v.Pos, OpConst64, types.Types[types.TUINT64])
32722 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
32723 v.AddArg2(x, v0)
32724 return true
32725 }
32726
32727
32728 for {
32729 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
32730 break
32731 }
32732 v.reset(OpConst8)
32733 v.AuxInt = int8ToAuxInt(0)
32734 return true
32735 }
32736
32737
32738
32739 for {
32740 if auxIntToBool(v.AuxInt) != false {
32741 break
32742 }
32743 x := v_0
32744 con := v_1
32745 if con.Op != OpConst8 {
32746 break
32747 }
32748 c := auxIntToInt8(con.AuxInt)
32749 if !(0 < c && c < 8) {
32750 break
32751 }
32752 v.reset(OpRsh8x8)
32753 v.AuxInt = boolToAuxInt(true)
32754 v.AddArg2(x, con)
32755 return true
32756 }
32757 return false
32758 }
32759 func rewriteValuegeneric_OpSelect0(v *Value) bool {
32760 v_0 := v.Args[0]
32761
32762
32763
32764 for {
32765 a := v_0
32766 if a.Op != OpAdd64carry {
32767 break
32768 }
32769 _ = a.Args[2]
32770 x := a.Args[0]
32771 y := a.Args[1]
32772 a_2 := a.Args[2]
32773 if a_2.Op != OpConst64 || auxIntToInt64(a_2.AuxInt) != 0 || !(a.Uses == 1) {
32774 break
32775 }
32776 v.reset(OpAdd64)
32777 v.AddArg2(x, y)
32778 return true
32779 }
32780
32781
32782 for {
32783 if v_0.Op != OpMakeTuple {
32784 break
32785 }
32786 x := v_0.Args[0]
32787 v.copyOf(x)
32788 return true
32789 }
32790 return false
32791 }
32792 func rewriteValuegeneric_OpSelect1(v *Value) bool {
32793 v_0 := v.Args[0]
32794
32795
32796 for {
32797 if v_0.Op != OpMakeTuple {
32798 break
32799 }
32800 y := v_0.Args[1]
32801 v.copyOf(y)
32802 return true
32803 }
32804 return false
32805 }
32806 func rewriteValuegeneric_OpSelectN(v *Value) bool {
32807 v_0 := v.Args[0]
32808 b := v.Block
32809 config := b.Func.Config
32810 typ := &b.Func.Config.Types
32811
32812
32813 for {
32814 n := auxIntToInt64(v.AuxInt)
32815 m := v_0
32816 if m.Op != OpMakeResult {
32817 break
32818 }
32819 v.copyOf(m.Args[n])
32820 return true
32821 }
32822
32823
32824
32825 for {
32826 if auxIntToInt64(v.AuxInt) != 0 {
32827 break
32828 }
32829 call := v_0
32830 if call.Op != OpStaticCall || len(call.Args) != 3 {
32831 break
32832 }
32833 sym := auxToCall(call.Aux)
32834 mem := call.Args[2]
32835 sptr := call.Args[0]
32836 call_1 := call.Args[1]
32837 if call_1.Op != OpConst64 {
32838 break
32839 }
32840 c := auxIntToInt64(call_1.AuxInt)
32841 if !(isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)) {
32842 break
32843 }
32844 v.reset(OpZero)
32845 v.AuxInt = int64ToAuxInt(int64(c))
32846 v.Aux = typeToAux(types.Types[types.TUINT8])
32847 v.AddArg2(sptr, mem)
32848 return true
32849 }
32850
32851
32852
32853 for {
32854 if auxIntToInt64(v.AuxInt) != 0 {
32855 break
32856 }
32857 call := v_0
32858 if call.Op != OpStaticCall || len(call.Args) != 3 {
32859 break
32860 }
32861 sym := auxToCall(call.Aux)
32862 mem := call.Args[2]
32863 sptr := call.Args[0]
32864 call_1 := call.Args[1]
32865 if call_1.Op != OpConst32 {
32866 break
32867 }
32868 c := auxIntToInt32(call_1.AuxInt)
32869 if !(isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)) {
32870 break
32871 }
32872 v.reset(OpZero)
32873 v.AuxInt = int64ToAuxInt(int64(c))
32874 v.Aux = typeToAux(types.Types[types.TUINT8])
32875 v.AddArg2(sptr, mem)
32876 return true
32877 }
32878
32879
32880
32881 for {
32882 if auxIntToInt64(v.AuxInt) != 0 {
32883 break
32884 }
32885 call := v_0
32886 if call.Op != OpStaticCall || len(call.Args) != 1 {
32887 break
32888 }
32889 sym := auxToCall(call.Aux)
32890 s1 := call.Args[0]
32891 if s1.Op != OpStore {
32892 break
32893 }
32894 _ = s1.Args[2]
32895 s1_1 := s1.Args[1]
32896 if s1_1.Op != OpConst64 {
32897 break
32898 }
32899 sz := auxIntToInt64(s1_1.AuxInt)
32900 s2 := s1.Args[2]
32901 if s2.Op != OpStore {
32902 break
32903 }
32904 _ = s2.Args[2]
32905 src := s2.Args[1]
32906 s3 := s2.Args[2]
32907 if s3.Op != OpStore {
32908 break
32909 }
32910 mem := s3.Args[2]
32911 dst := s3.Args[1]
32912 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)) {
32913 break
32914 }
32915 v.reset(OpMove)
32916 v.AuxInt = int64ToAuxInt(int64(sz))
32917 v.Aux = typeToAux(types.Types[types.TUINT8])
32918 v.AddArg3(dst, src, mem)
32919 return true
32920 }
32921
32922
32923
32924 for {
32925 if auxIntToInt64(v.AuxInt) != 0 {
32926 break
32927 }
32928 call := v_0
32929 if call.Op != OpStaticCall || len(call.Args) != 1 {
32930 break
32931 }
32932 sym := auxToCall(call.Aux)
32933 s1 := call.Args[0]
32934 if s1.Op != OpStore {
32935 break
32936 }
32937 _ = s1.Args[2]
32938 s1_1 := s1.Args[1]
32939 if s1_1.Op != OpConst32 {
32940 break
32941 }
32942 sz := auxIntToInt32(s1_1.AuxInt)
32943 s2 := s1.Args[2]
32944 if s2.Op != OpStore {
32945 break
32946 }
32947 _ = s2.Args[2]
32948 src := s2.Args[1]
32949 s3 := s2.Args[2]
32950 if s3.Op != OpStore {
32951 break
32952 }
32953 mem := s3.Args[2]
32954 dst := s3.Args[1]
32955 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)) {
32956 break
32957 }
32958 v.reset(OpMove)
32959 v.AuxInt = int64ToAuxInt(int64(sz))
32960 v.Aux = typeToAux(types.Types[types.TUINT8])
32961 v.AddArg3(dst, src, mem)
32962 return true
32963 }
32964
32965
32966
32967 for {
32968 if auxIntToInt64(v.AuxInt) != 0 {
32969 break
32970 }
32971 call := v_0
32972 if call.Op != OpStaticCall || len(call.Args) != 4 {
32973 break
32974 }
32975 sym := auxToCall(call.Aux)
32976 mem := call.Args[3]
32977 dst := call.Args[0]
32978 src := call.Args[1]
32979 call_2 := call.Args[2]
32980 if call_2.Op != OpConst64 {
32981 break
32982 }
32983 sz := auxIntToInt64(call_2.AuxInt)
32984 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
32985 break
32986 }
32987 v.reset(OpMove)
32988 v.AuxInt = int64ToAuxInt(int64(sz))
32989 v.Aux = typeToAux(types.Types[types.TUINT8])
32990 v.AddArg3(dst, src, mem)
32991 return true
32992 }
32993
32994
32995
32996 for {
32997 if auxIntToInt64(v.AuxInt) != 0 {
32998 break
32999 }
33000 call := v_0
33001 if call.Op != OpStaticCall || len(call.Args) != 4 {
33002 break
33003 }
33004 sym := auxToCall(call.Aux)
33005 mem := call.Args[3]
33006 dst := call.Args[0]
33007 src := call.Args[1]
33008 call_2 := call.Args[2]
33009 if call_2.Op != OpConst32 {
33010 break
33011 }
33012 sz := auxIntToInt32(call_2.AuxInt)
33013 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
33014 break
33015 }
33016 v.reset(OpMove)
33017 v.AuxInt = int64ToAuxInt(int64(sz))
33018 v.Aux = typeToAux(types.Types[types.TUINT8])
33019 v.AddArg3(dst, src, mem)
33020 return true
33021 }
33022
33023
33024
33025 for {
33026 if auxIntToInt64(v.AuxInt) != 0 {
33027 break
33028 }
33029 call := v_0
33030 if call.Op != OpStaticLECall || len(call.Args) != 4 {
33031 break
33032 }
33033 sym := auxToCall(call.Aux)
33034 mem := call.Args[3]
33035 dst := call.Args[0]
33036 src := call.Args[1]
33037 call_2 := call.Args[2]
33038 if call_2.Op != OpConst64 {
33039 break
33040 }
33041 sz := auxIntToInt64(call_2.AuxInt)
33042 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
33043 break
33044 }
33045 v.reset(OpMove)
33046 v.AuxInt = int64ToAuxInt(int64(sz))
33047 v.Aux = typeToAux(types.Types[types.TUINT8])
33048 v.AddArg3(dst, src, mem)
33049 return true
33050 }
33051
33052
33053
33054 for {
33055 if auxIntToInt64(v.AuxInt) != 0 {
33056 break
33057 }
33058 call := v_0
33059 if call.Op != OpStaticLECall || len(call.Args) != 4 {
33060 break
33061 }
33062 sym := auxToCall(call.Aux)
33063 mem := call.Args[3]
33064 dst := call.Args[0]
33065 src := call.Args[1]
33066 call_2 := call.Args[2]
33067 if call_2.Op != OpConst32 {
33068 break
33069 }
33070 sz := auxIntToInt32(call_2.AuxInt)
33071 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
33072 break
33073 }
33074 v.reset(OpMove)
33075 v.AuxInt = int64ToAuxInt(int64(sz))
33076 v.Aux = typeToAux(types.Types[types.TUINT8])
33077 v.AddArg3(dst, src, mem)
33078 return true
33079 }
33080
33081
33082
33083 for {
33084 if auxIntToInt64(v.AuxInt) != 0 {
33085 break
33086 }
33087 call := v_0
33088 if call.Op != OpStaticLECall || len(call.Args) != 2 {
33089 break
33090 }
33091 sym := auxToCall(call.Aux)
33092 x := call.Args[1]
33093 if !(needRaceCleanup(sym, call) && clobber(call)) {
33094 break
33095 }
33096 v.copyOf(x)
33097 return true
33098 }
33099
33100
33101
33102 for {
33103 if auxIntToInt64(v.AuxInt) != 0 {
33104 break
33105 }
33106 call := v_0
33107 if call.Op != OpStaticLECall || len(call.Args) != 1 {
33108 break
33109 }
33110 sym := auxToCall(call.Aux)
33111 x := call.Args[0]
33112 if !(needRaceCleanup(sym, call) && clobber(call)) {
33113 break
33114 }
33115 v.copyOf(x)
33116 return true
33117 }
33118
33119
33120
33121 for {
33122 if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpStaticCall || len(v_0.Args) != 6 {
33123 break
33124 }
33125 sym := auxToCall(v_0.Aux)
33126 _ = v_0.Args[1]
33127 newLen := v_0.Args[1]
33128 if newLen.Op != OpConst64 || !(v.Type.IsInteger() && (isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias"))) {
33129 break
33130 }
33131 v.copyOf(newLen)
33132 return true
33133 }
33134
33135
33136
33137 for {
33138 if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpStaticCall || len(v_0.Args) != 6 {
33139 break
33140 }
33141 sym := auxToCall(v_0.Aux)
33142 _ = v_0.Args[1]
33143 newLen := v_0.Args[1]
33144 if newLen.Op != OpConst32 || !(v.Type.IsInteger() && (isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias"))) {
33145 break
33146 }
33147 v.copyOf(newLen)
33148 return true
33149 }
33150
33151
33152
33153 for {
33154 if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpStaticLECall || len(v_0.Args) != 3 {
33155 break
33156 }
33157 f := auxToCall(v_0.Aux)
33158 _ = v_0.Args[2]
33159 x := v_0.Args[0]
33160 y := v_0.Args[1]
33161 v_0_2 := v_0.Args[2]
33162 if v_0_2.Op != OpSelectN || auxIntToInt64(v_0_2.AuxInt) != 1 {
33163 break
33164 }
33165 c := v_0_2.Args[0]
33166 if c.Op != OpStaticLECall || len(c.Args) != 3 {
33167 break
33168 }
33169 g := auxToCall(c.Aux)
33170 if x != c.Args[0] || y != c.Args[1] || !(isSameCall(f, "runtime.cmpstring") && isSameCall(g, "runtime.cmpstring")) {
33171 break
33172 }
33173 b = c.Block
33174 v0 := b.NewValue0(v.Pos, OpSelectN, typ.Int)
33175 v.copyOf(v0)
33176 v0.AuxInt = int64ToAuxInt(0)
33177 v0.AddArg(c)
33178 return true
33179 }
33180
33181
33182
33183 for {
33184 if auxIntToInt64(v.AuxInt) != 1 {
33185 break
33186 }
33187 c := v_0
33188 if c.Op != OpStaticLECall || len(c.Args) != 3 {
33189 break
33190 }
33191 f := auxToCall(c.Aux)
33192 mem := c.Args[2]
33193 if !(c.Uses == 1 && isSameCall(f, "runtime.cmpstring") && clobber(c)) {
33194 break
33195 }
33196 v.copyOf(mem)
33197 return true
33198 }
33199 return false
33200 }
33201 func rewriteValuegeneric_OpSignExt16to32(v *Value) bool {
33202 v_0 := v.Args[0]
33203
33204
33205 for {
33206 if v_0.Op != OpConst16 {
33207 break
33208 }
33209 c := auxIntToInt16(v_0.AuxInt)
33210 v.reset(OpConst32)
33211 v.AuxInt = int32ToAuxInt(int32(c))
33212 return true
33213 }
33214
33215
33216
33217 for {
33218 if v_0.Op != OpTrunc32to16 {
33219 break
33220 }
33221 x := v_0.Args[0]
33222 if x.Op != OpRsh32x64 {
33223 break
33224 }
33225 _ = x.Args[1]
33226 x_1 := x.Args[1]
33227 if x_1.Op != OpConst64 {
33228 break
33229 }
33230 s := auxIntToInt64(x_1.AuxInt)
33231 if !(s >= 16) {
33232 break
33233 }
33234 v.copyOf(x)
33235 return true
33236 }
33237 return false
33238 }
33239 func rewriteValuegeneric_OpSignExt16to64(v *Value) bool {
33240 v_0 := v.Args[0]
33241
33242
33243 for {
33244 if v_0.Op != OpConst16 {
33245 break
33246 }
33247 c := auxIntToInt16(v_0.AuxInt)
33248 v.reset(OpConst64)
33249 v.AuxInt = int64ToAuxInt(int64(c))
33250 return true
33251 }
33252
33253
33254
33255 for {
33256 if v_0.Op != OpTrunc64to16 {
33257 break
33258 }
33259 x := v_0.Args[0]
33260 if x.Op != OpRsh64x64 {
33261 break
33262 }
33263 _ = x.Args[1]
33264 x_1 := x.Args[1]
33265 if x_1.Op != OpConst64 {
33266 break
33267 }
33268 s := auxIntToInt64(x_1.AuxInt)
33269 if !(s >= 48) {
33270 break
33271 }
33272 v.copyOf(x)
33273 return true
33274 }
33275 return false
33276 }
33277 func rewriteValuegeneric_OpSignExt32to64(v *Value) bool {
33278 v_0 := v.Args[0]
33279
33280
33281 for {
33282 if v_0.Op != OpConst32 {
33283 break
33284 }
33285 c := auxIntToInt32(v_0.AuxInt)
33286 v.reset(OpConst64)
33287 v.AuxInt = int64ToAuxInt(int64(c))
33288 return true
33289 }
33290
33291
33292
33293 for {
33294 if v_0.Op != OpTrunc64to32 {
33295 break
33296 }
33297 x := v_0.Args[0]
33298 if x.Op != OpRsh64x64 {
33299 break
33300 }
33301 _ = x.Args[1]
33302 x_1 := x.Args[1]
33303 if x_1.Op != OpConst64 {
33304 break
33305 }
33306 s := auxIntToInt64(x_1.AuxInt)
33307 if !(s >= 32) {
33308 break
33309 }
33310 v.copyOf(x)
33311 return true
33312 }
33313 return false
33314 }
33315 func rewriteValuegeneric_OpSignExt8to16(v *Value) bool {
33316 v_0 := v.Args[0]
33317
33318
33319 for {
33320 if v_0.Op != OpConst8 {
33321 break
33322 }
33323 c := auxIntToInt8(v_0.AuxInt)
33324 v.reset(OpConst16)
33325 v.AuxInt = int16ToAuxInt(int16(c))
33326 return true
33327 }
33328
33329
33330
33331 for {
33332 if v_0.Op != OpTrunc16to8 {
33333 break
33334 }
33335 x := v_0.Args[0]
33336 if x.Op != OpRsh16x64 {
33337 break
33338 }
33339 _ = x.Args[1]
33340 x_1 := x.Args[1]
33341 if x_1.Op != OpConst64 {
33342 break
33343 }
33344 s := auxIntToInt64(x_1.AuxInt)
33345 if !(s >= 8) {
33346 break
33347 }
33348 v.copyOf(x)
33349 return true
33350 }
33351
33352
33353 for {
33354 cvt := v_0
33355 if cvt.Op != OpCvtBoolToUint8 {
33356 break
33357 }
33358 v.reset(OpZeroExt8to16)
33359 v.AddArg(cvt)
33360 return true
33361 }
33362 return false
33363 }
33364 func rewriteValuegeneric_OpSignExt8to32(v *Value) bool {
33365 v_0 := v.Args[0]
33366
33367
33368 for {
33369 if v_0.Op != OpConst8 {
33370 break
33371 }
33372 c := auxIntToInt8(v_0.AuxInt)
33373 v.reset(OpConst32)
33374 v.AuxInt = int32ToAuxInt(int32(c))
33375 return true
33376 }
33377
33378
33379
33380 for {
33381 if v_0.Op != OpTrunc32to8 {
33382 break
33383 }
33384 x := v_0.Args[0]
33385 if x.Op != OpRsh32x64 {
33386 break
33387 }
33388 _ = x.Args[1]
33389 x_1 := x.Args[1]
33390 if x_1.Op != OpConst64 {
33391 break
33392 }
33393 s := auxIntToInt64(x_1.AuxInt)
33394 if !(s >= 24) {
33395 break
33396 }
33397 v.copyOf(x)
33398 return true
33399 }
33400
33401
33402 for {
33403 cvt := v_0
33404 if cvt.Op != OpCvtBoolToUint8 {
33405 break
33406 }
33407 v.reset(OpZeroExt8to32)
33408 v.AddArg(cvt)
33409 return true
33410 }
33411 return false
33412 }
33413 func rewriteValuegeneric_OpSignExt8to64(v *Value) bool {
33414 v_0 := v.Args[0]
33415
33416
33417 for {
33418 if v_0.Op != OpConst8 {
33419 break
33420 }
33421 c := auxIntToInt8(v_0.AuxInt)
33422 v.reset(OpConst64)
33423 v.AuxInt = int64ToAuxInt(int64(c))
33424 return true
33425 }
33426
33427
33428
33429 for {
33430 if v_0.Op != OpTrunc64to8 {
33431 break
33432 }
33433 x := v_0.Args[0]
33434 if x.Op != OpRsh64x64 {
33435 break
33436 }
33437 _ = x.Args[1]
33438 x_1 := x.Args[1]
33439 if x_1.Op != OpConst64 {
33440 break
33441 }
33442 s := auxIntToInt64(x_1.AuxInt)
33443 if !(s >= 56) {
33444 break
33445 }
33446 v.copyOf(x)
33447 return true
33448 }
33449
33450
33451 for {
33452 cvt := v_0
33453 if cvt.Op != OpCvtBoolToUint8 {
33454 break
33455 }
33456 v.reset(OpZeroExt8to64)
33457 v.AddArg(cvt)
33458 return true
33459 }
33460 return false
33461 }
33462 func rewriteValuegeneric_OpSliceCap(v *Value) bool {
33463 v_0 := v.Args[0]
33464
33465
33466 for {
33467 if v_0.Op != OpSliceMake {
33468 break
33469 }
33470 _ = v_0.Args[2]
33471 v_0_2 := v_0.Args[2]
33472 if v_0_2.Op != OpConst64 {
33473 break
33474 }
33475 t := v_0_2.Type
33476 c := auxIntToInt64(v_0_2.AuxInt)
33477 v.reset(OpConst64)
33478 v.Type = t
33479 v.AuxInt = int64ToAuxInt(c)
33480 return true
33481 }
33482
33483
33484 for {
33485 if v_0.Op != OpSliceMake {
33486 break
33487 }
33488 _ = v_0.Args[2]
33489 v_0_2 := v_0.Args[2]
33490 if v_0_2.Op != OpConst32 {
33491 break
33492 }
33493 t := v_0_2.Type
33494 c := auxIntToInt32(v_0_2.AuxInt)
33495 v.reset(OpConst32)
33496 v.Type = t
33497 v.AuxInt = int32ToAuxInt(c)
33498 return true
33499 }
33500
33501
33502 for {
33503 if v_0.Op != OpSliceMake {
33504 break
33505 }
33506 _ = v_0.Args[2]
33507 v_0_2 := v_0.Args[2]
33508 if v_0_2.Op != OpSliceCap {
33509 break
33510 }
33511 x := v_0_2.Args[0]
33512 v.reset(OpSliceCap)
33513 v.AddArg(x)
33514 return true
33515 }
33516
33517
33518 for {
33519 if v_0.Op != OpSliceMake {
33520 break
33521 }
33522 _ = v_0.Args[2]
33523 v_0_2 := v_0.Args[2]
33524 if v_0_2.Op != OpSliceLen {
33525 break
33526 }
33527 x := v_0_2.Args[0]
33528 v.reset(OpSliceLen)
33529 v.AddArg(x)
33530 return true
33531 }
33532
33533
33534 for {
33535 if v_0.Op != OpPhi || len(v_0.Args) != 2 {
33536 break
33537 }
33538 _ = v_0.Args[1]
33539 v_0_0 := v_0.Args[0]
33540 if v_0_0.Op != OpSliceMake {
33541 break
33542 }
33543 x := v_0_0.Args[2]
33544 v_0_1 := v_0.Args[1]
33545 if v_0_1.Op != OpSliceMake {
33546 break
33547 }
33548 _ = v_0_1.Args[2]
33549 if x != v_0_1.Args[2] {
33550 break
33551 }
33552 v.copyOf(x)
33553 return true
33554 }
33555 return false
33556 }
33557 func rewriteValuegeneric_OpSliceLen(v *Value) bool {
33558 v_0 := v.Args[0]
33559
33560
33561 for {
33562 if v_0.Op != OpSliceMake {
33563 break
33564 }
33565 _ = v_0.Args[1]
33566 v_0_1 := v_0.Args[1]
33567 if v_0_1.Op != OpConst64 {
33568 break
33569 }
33570 t := v_0_1.Type
33571 c := auxIntToInt64(v_0_1.AuxInt)
33572 v.reset(OpConst64)
33573 v.Type = t
33574 v.AuxInt = int64ToAuxInt(c)
33575 return true
33576 }
33577
33578
33579 for {
33580 if v_0.Op != OpSliceMake {
33581 break
33582 }
33583 _ = v_0.Args[1]
33584 v_0_1 := v_0.Args[1]
33585 if v_0_1.Op != OpConst32 {
33586 break
33587 }
33588 t := v_0_1.Type
33589 c := auxIntToInt32(v_0_1.AuxInt)
33590 v.reset(OpConst32)
33591 v.Type = t
33592 v.AuxInt = int32ToAuxInt(c)
33593 return true
33594 }
33595
33596
33597 for {
33598 if v_0.Op != OpSliceMake {
33599 break
33600 }
33601 _ = v_0.Args[1]
33602 v_0_1 := v_0.Args[1]
33603 if v_0_1.Op != OpSliceLen {
33604 break
33605 }
33606 x := v_0_1.Args[0]
33607 v.reset(OpSliceLen)
33608 v.AddArg(x)
33609 return true
33610 }
33611
33612
33613 for {
33614 if v_0.Op != OpPhi || len(v_0.Args) != 2 {
33615 break
33616 }
33617 _ = v_0.Args[1]
33618 v_0_0 := v_0.Args[0]
33619 if v_0_0.Op != OpSliceMake {
33620 break
33621 }
33622 x := v_0_0.Args[1]
33623 v_0_1 := v_0.Args[1]
33624 if v_0_1.Op != OpSliceMake {
33625 break
33626 }
33627 _ = v_0_1.Args[1]
33628 if x != v_0_1.Args[1] {
33629 break
33630 }
33631 v.copyOf(x)
33632 return true
33633 }
33634
33635
33636
33637 for {
33638 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
33639 break
33640 }
33641 v_0_0 := v_0.Args[0]
33642 if v_0_0.Op != OpStaticLECall || len(v_0_0.Args) != 6 {
33643 break
33644 }
33645 sym := auxToCall(v_0_0.Aux)
33646 _ = v_0_0.Args[1]
33647 newLen := v_0_0.Args[1]
33648 if newLen.Op != OpConst64 || !(isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias")) {
33649 break
33650 }
33651 v.copyOf(newLen)
33652 return true
33653 }
33654
33655
33656
33657 for {
33658 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
33659 break
33660 }
33661 v_0_0 := v_0.Args[0]
33662 if v_0_0.Op != OpStaticLECall || len(v_0_0.Args) != 6 {
33663 break
33664 }
33665 sym := auxToCall(v_0_0.Aux)
33666 _ = v_0_0.Args[1]
33667 newLen := v_0_0.Args[1]
33668 if newLen.Op != OpConst32 || !(isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias")) {
33669 break
33670 }
33671 v.copyOf(newLen)
33672 return true
33673 }
33674 return false
33675 }
33676 func rewriteValuegeneric_OpSliceMake(v *Value) bool {
33677 v_2 := v.Args[2]
33678 v_1 := v.Args[1]
33679 v_0 := v.Args[0]
33680 b := v.Block
33681
33682
33683
33684 for {
33685 if v_0.Op != OpAddPtr {
33686 break
33687 }
33688 t := v_0.Type
33689 _ = v_0.Args[1]
33690 x := v_0.Args[0]
33691 v_0_1 := v_0.Args[1]
33692 if v_0_1.Op != OpAnd64 {
33693 break
33694 }
33695 _ = v_0_1.Args[1]
33696 v_0_1_0 := v_0_1.Args[0]
33697 v_0_1_1 := v_0_1.Args[1]
33698 for _i0 := 0; _i0 <= 1; _i0, v_0_1_0, v_0_1_1 = _i0+1, v_0_1_1, v_0_1_0 {
33699 y := v_0_1_0
33700 if v_0_1_1.Op != OpSlicemask {
33701 continue
33702 }
33703 w := v_1
33704 if w.Op != OpConst64 {
33705 continue
33706 }
33707 c := auxIntToInt64(w.AuxInt)
33708 z := v_2
33709 if !(c > 0) {
33710 continue
33711 }
33712 v.reset(OpSliceMake)
33713 v0 := b.NewValue0(v.Pos, OpAddPtr, t)
33714 v0.AddArg2(x, y)
33715 v.AddArg3(v0, w, z)
33716 return true
33717 }
33718 break
33719 }
33720
33721
33722
33723 for {
33724 if v_0.Op != OpAddPtr {
33725 break
33726 }
33727 t := v_0.Type
33728 _ = v_0.Args[1]
33729 x := v_0.Args[0]
33730 v_0_1 := v_0.Args[1]
33731 if v_0_1.Op != OpAnd32 {
33732 break
33733 }
33734 _ = v_0_1.Args[1]
33735 v_0_1_0 := v_0_1.Args[0]
33736 v_0_1_1 := v_0_1.Args[1]
33737 for _i0 := 0; _i0 <= 1; _i0, v_0_1_0, v_0_1_1 = _i0+1, v_0_1_1, v_0_1_0 {
33738 y := v_0_1_0
33739 if v_0_1_1.Op != OpSlicemask {
33740 continue
33741 }
33742 w := v_1
33743 if w.Op != OpConst32 {
33744 continue
33745 }
33746 c := auxIntToInt32(w.AuxInt)
33747 z := v_2
33748 if !(c > 0) {
33749 continue
33750 }
33751 v.reset(OpSliceMake)
33752 v0 := b.NewValue0(v.Pos, OpAddPtr, t)
33753 v0.AddArg2(x, y)
33754 v.AddArg3(v0, w, z)
33755 return true
33756 }
33757 break
33758 }
33759 return false
33760 }
33761 func rewriteValuegeneric_OpSlicePtr(v *Value) bool {
33762 v_0 := v.Args[0]
33763
33764
33765 for {
33766 if v_0.Op != OpSliceMake {
33767 break
33768 }
33769 v_0_0 := v_0.Args[0]
33770 if v_0_0.Op != OpSlicePtr {
33771 break
33772 }
33773 x := v_0_0.Args[0]
33774 v.reset(OpSlicePtr)
33775 v.AddArg(x)
33776 return true
33777 }
33778 return false
33779 }
33780 func rewriteValuegeneric_OpSlicemask(v *Value) bool {
33781 v_0 := v.Args[0]
33782
33783
33784
33785 for {
33786 if v_0.Op != OpConst32 {
33787 break
33788 }
33789 x := auxIntToInt32(v_0.AuxInt)
33790 if !(x > 0) {
33791 break
33792 }
33793 v.reset(OpConst32)
33794 v.AuxInt = int32ToAuxInt(-1)
33795 return true
33796 }
33797
33798
33799 for {
33800 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
33801 break
33802 }
33803 v.reset(OpConst32)
33804 v.AuxInt = int32ToAuxInt(0)
33805 return true
33806 }
33807
33808
33809
33810 for {
33811 if v_0.Op != OpConst64 {
33812 break
33813 }
33814 x := auxIntToInt64(v_0.AuxInt)
33815 if !(x > 0) {
33816 break
33817 }
33818 v.reset(OpConst64)
33819 v.AuxInt = int64ToAuxInt(-1)
33820 return true
33821 }
33822
33823
33824 for {
33825 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
33826 break
33827 }
33828 v.reset(OpConst64)
33829 v.AuxInt = int64ToAuxInt(0)
33830 return true
33831 }
33832 return false
33833 }
33834 func rewriteValuegeneric_OpSqrt(v *Value) bool {
33835 v_0 := v.Args[0]
33836
33837
33838
33839 for {
33840 if v_0.Op != OpConst64F {
33841 break
33842 }
33843 c := auxIntToFloat64(v_0.AuxInt)
33844 if !(!math.IsNaN(math.Sqrt(c))) {
33845 break
33846 }
33847 v.reset(OpConst64F)
33848 v.AuxInt = float64ToAuxInt(math.Sqrt(c))
33849 return true
33850 }
33851 return false
33852 }
33853 func rewriteValuegeneric_OpStaticCall(v *Value) bool {
33854 b := v.Block
33855 typ := &b.Func.Config.Types
33856
33857
33858
33859 for {
33860 if len(v.Args) != 4 {
33861 break
33862 }
33863 callAux := auxToCall(v.Aux)
33864 mem := v.Args[3]
33865 p := v.Args[0]
33866 q := v.Args[1]
33867 if !(isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)) {
33868 break
33869 }
33870 v.reset(OpMakeResult)
33871 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
33872 v0.AuxInt = boolToAuxInt(true)
33873 v.AddArg2(v0, mem)
33874 return true
33875 }
33876 return false
33877 }
33878 func rewriteValuegeneric_OpStaticLECall(v *Value) bool {
33879 b := v.Block
33880 config := b.Func.Config
33881 typ := &b.Func.Config.Types
33882
33883
33884
33885 for {
33886 if len(v.Args) != 4 {
33887 break
33888 }
33889 callAux := auxToCall(v.Aux)
33890 mem := v.Args[3]
33891 sptr := v.Args[0]
33892 v_1 := v.Args[1]
33893 if v_1.Op != OpAddr {
33894 break
33895 }
33896 scon := auxToSym(v_1.Aux)
33897 v_1_0 := v_1.Args[0]
33898 if v_1_0.Op != OpSB {
33899 break
33900 }
33901 v_2 := v.Args[2]
33902 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon)) {
33903 break
33904 }
33905 v.reset(OpMakeResult)
33906 v0 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
33907 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
33908 v1.AddArg2(sptr, mem)
33909 v2 := b.NewValue0(v.Pos, OpConst8, typ.Int8)
33910 v2.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
33911 v0.AddArg2(v1, v2)
33912 v.AddArg2(v0, mem)
33913 return true
33914 }
33915
33916
33917
33918 for {
33919 if len(v.Args) != 4 {
33920 break
33921 }
33922 callAux := auxToCall(v.Aux)
33923 mem := v.Args[3]
33924 v_0 := v.Args[0]
33925 if v_0.Op != OpAddr {
33926 break
33927 }
33928 scon := auxToSym(v_0.Aux)
33929 v_0_0 := v_0.Args[0]
33930 if v_0_0.Op != OpSB {
33931 break
33932 }
33933 sptr := v.Args[1]
33934 v_2 := v.Args[2]
33935 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon)) {
33936 break
33937 }
33938 v.reset(OpMakeResult)
33939 v0 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
33940 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
33941 v1.AddArg2(sptr, mem)
33942 v2 := b.NewValue0(v.Pos, OpConst8, typ.Int8)
33943 v2.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
33944 v0.AddArg2(v1, v2)
33945 v.AddArg2(v0, mem)
33946 return true
33947 }
33948
33949
33950
33951 for {
33952 if len(v.Args) != 4 {
33953 break
33954 }
33955 callAux := auxToCall(v.Aux)
33956 mem := v.Args[3]
33957 sptr := v.Args[0]
33958 v_1 := v.Args[1]
33959 if v_1.Op != OpAddr {
33960 break
33961 }
33962 scon := auxToSym(v_1.Aux)
33963 v_1_0 := v_1.Args[0]
33964 if v_1_0.Op != OpSB {
33965 break
33966 }
33967 v_2 := v.Args[2]
33968 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
33969 break
33970 }
33971 v.reset(OpMakeResult)
33972 v0 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
33973 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
33974 v1.AddArg2(sptr, mem)
33975 v2 := b.NewValue0(v.Pos, OpConst16, typ.Int16)
33976 v2.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
33977 v0.AddArg2(v1, v2)
33978 v.AddArg2(v0, mem)
33979 return true
33980 }
33981
33982
33983
33984 for {
33985 if len(v.Args) != 4 {
33986 break
33987 }
33988 callAux := auxToCall(v.Aux)
33989 mem := v.Args[3]
33990 v_0 := v.Args[0]
33991 if v_0.Op != OpAddr {
33992 break
33993 }
33994 scon := auxToSym(v_0.Aux)
33995 v_0_0 := v_0.Args[0]
33996 if v_0_0.Op != OpSB {
33997 break
33998 }
33999 sptr := v.Args[1]
34000 v_2 := v.Args[2]
34001 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
34002 break
34003 }
34004 v.reset(OpMakeResult)
34005 v0 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
34006 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
34007 v1.AddArg2(sptr, mem)
34008 v2 := b.NewValue0(v.Pos, OpConst16, typ.Int16)
34009 v2.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
34010 v0.AddArg2(v1, v2)
34011 v.AddArg2(v0, mem)
34012 return true
34013 }
34014
34015
34016
34017 for {
34018 if len(v.Args) != 4 {
34019 break
34020 }
34021 callAux := auxToCall(v.Aux)
34022 mem := v.Args[3]
34023 sptr := v.Args[0]
34024 v_1 := v.Args[1]
34025 if v_1.Op != OpAddr {
34026 break
34027 }
34028 scon := auxToSym(v_1.Aux)
34029 v_1_0 := v_1.Args[0]
34030 if v_1_0.Op != OpSB {
34031 break
34032 }
34033 v_2 := v.Args[2]
34034 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
34035 break
34036 }
34037 v.reset(OpMakeResult)
34038 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
34039 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
34040 v1.AddArg2(sptr, mem)
34041 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
34042 v2.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
34043 v0.AddArg2(v1, v2)
34044 v.AddArg2(v0, mem)
34045 return true
34046 }
34047
34048
34049
34050 for {
34051 if len(v.Args) != 4 {
34052 break
34053 }
34054 callAux := auxToCall(v.Aux)
34055 mem := v.Args[3]
34056 v_0 := v.Args[0]
34057 if v_0.Op != OpAddr {
34058 break
34059 }
34060 scon := auxToSym(v_0.Aux)
34061 v_0_0 := v_0.Args[0]
34062 if v_0_0.Op != OpSB {
34063 break
34064 }
34065 sptr := v.Args[1]
34066 v_2 := v.Args[2]
34067 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
34068 break
34069 }
34070 v.reset(OpMakeResult)
34071 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
34072 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
34073 v1.AddArg2(sptr, mem)
34074 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
34075 v2.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
34076 v0.AddArg2(v1, v2)
34077 v.AddArg2(v0, mem)
34078 return true
34079 }
34080
34081
34082
34083 for {
34084 if len(v.Args) != 4 {
34085 break
34086 }
34087 callAux := auxToCall(v.Aux)
34088 mem := v.Args[3]
34089 sptr := v.Args[0]
34090 v_1 := v.Args[1]
34091 if v_1.Op != OpAddr {
34092 break
34093 }
34094 scon := auxToSym(v_1.Aux)
34095 v_1_0 := v_1.Args[0]
34096 if v_1_0.Op != OpSB {
34097 break
34098 }
34099 v_2 := v.Args[2]
34100 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
34101 break
34102 }
34103 v.reset(OpMakeResult)
34104 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
34105 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
34106 v1.AddArg2(sptr, mem)
34107 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
34108 v2.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
34109 v0.AddArg2(v1, v2)
34110 v.AddArg2(v0, mem)
34111 return true
34112 }
34113
34114
34115
34116 for {
34117 if len(v.Args) != 4 {
34118 break
34119 }
34120 callAux := auxToCall(v.Aux)
34121 mem := v.Args[3]
34122 v_0 := v.Args[0]
34123 if v_0.Op != OpAddr {
34124 break
34125 }
34126 scon := auxToSym(v_0.Aux)
34127 v_0_0 := v_0.Args[0]
34128 if v_0_0.Op != OpSB {
34129 break
34130 }
34131 sptr := v.Args[1]
34132 v_2 := v.Args[2]
34133 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
34134 break
34135 }
34136 v.reset(OpMakeResult)
34137 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
34138 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
34139 v1.AddArg2(sptr, mem)
34140 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
34141 v2.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
34142 v0.AddArg2(v1, v2)
34143 v.AddArg2(v0, mem)
34144 return true
34145 }
34146
34147
34148
34149 for {
34150 if len(v.Args) != 4 {
34151 break
34152 }
34153 callAux := auxToCall(v.Aux)
34154 mem := v.Args[3]
34155 sptr := v.Args[0]
34156 v_1 := v.Args[1]
34157 if v_1.Op != OpAddr {
34158 break
34159 }
34160 scon := auxToSym(v_1.Aux)
34161 v_1_0 := v_1.Args[0]
34162 if v_1_0.Op != OpSB {
34163 break
34164 }
34165 v_2 := v.Args[2]
34166 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 3 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
34167 break
34168 }
34169 v.reset(OpMakeResult)
34170 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
34171 v1 := b.NewValue0(v.Pos, OpOr32, typ.Int32)
34172 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.Int32)
34173 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
34174 v3.AddArg2(sptr, mem)
34175 v2.AddArg(v3)
34176 v4 := b.NewValue0(v.Pos, OpLsh32x32, typ.Int32)
34177 v5 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.Int32)
34178 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
34179 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
34180 v7.AuxInt = int64ToAuxInt(2)
34181 v7.AddArg(sptr)
34182 v6.AddArg2(v7, mem)
34183 v5.AddArg(v6)
34184 v8 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
34185 v8.AuxInt = int32ToAuxInt(16)
34186 v4.AddArg2(v5, v8)
34187 v1.AddArg2(v2, v4)
34188 v9 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
34189 v9.AuxInt = int32ToAuxInt(int32(uint32(read16(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint32(read8(scon, 2)) << 16)))
34190 v0.AddArg2(v1, v9)
34191 v.AddArg2(v0, mem)
34192 return true
34193 }
34194
34195
34196
34197 for {
34198 if len(v.Args) != 4 {
34199 break
34200 }
34201 callAux := auxToCall(v.Aux)
34202 mem := v.Args[3]
34203 v_0 := v.Args[0]
34204 if v_0.Op != OpAddr {
34205 break
34206 }
34207 scon := auxToSym(v_0.Aux)
34208 v_0_0 := v_0.Args[0]
34209 if v_0_0.Op != OpSB {
34210 break
34211 }
34212 sptr := v.Args[1]
34213 v_2 := v.Args[2]
34214 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 3 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
34215 break
34216 }
34217 v.reset(OpMakeResult)
34218 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
34219 v1 := b.NewValue0(v.Pos, OpOr32, typ.Int32)
34220 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.Int32)
34221 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
34222 v3.AddArg2(sptr, mem)
34223 v2.AddArg(v3)
34224 v4 := b.NewValue0(v.Pos, OpLsh32x32, typ.Int32)
34225 v5 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.Int32)
34226 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
34227 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
34228 v7.AuxInt = int64ToAuxInt(2)
34229 v7.AddArg(sptr)
34230 v6.AddArg2(v7, mem)
34231 v5.AddArg(v6)
34232 v8 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
34233 v8.AuxInt = int32ToAuxInt(16)
34234 v4.AddArg2(v5, v8)
34235 v1.AddArg2(v2, v4)
34236 v9 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
34237 v9.AuxInt = int32ToAuxInt(int32(uint32(read16(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint32(read8(scon, 2)) << 16)))
34238 v0.AddArg2(v1, v9)
34239 v.AddArg2(v0, mem)
34240 return true
34241 }
34242
34243
34244
34245 for {
34246 if len(v.Args) != 4 {
34247 break
34248 }
34249 callAux := auxToCall(v.Aux)
34250 mem := v.Args[3]
34251 sptr := v.Args[0]
34252 v_1 := v.Args[1]
34253 if v_1.Op != OpAddr {
34254 break
34255 }
34256 scon := auxToSym(v_1.Aux)
34257 v_1_0 := v_1.Args[0]
34258 if v_1_0.Op != OpSB {
34259 break
34260 }
34261 v_2 := v.Args[2]
34262 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 5 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
34263 break
34264 }
34265 v.reset(OpMakeResult)
34266 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
34267 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
34268 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
34269 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
34270 v3.AddArg2(sptr, mem)
34271 v2.AddArg(v3)
34272 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
34273 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.Int64)
34274 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
34275 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
34276 v7.AuxInt = int64ToAuxInt(4)
34277 v7.AddArg(sptr)
34278 v6.AddArg2(v7, mem)
34279 v5.AddArg(v6)
34280 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
34281 v8.AuxInt = int64ToAuxInt(32)
34282 v4.AddArg2(v5, v8)
34283 v1.AddArg2(v2, v4)
34284 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
34285 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read8(scon, 4)) << 32)))
34286 v0.AddArg2(v1, v9)
34287 v.AddArg2(v0, mem)
34288 return true
34289 }
34290
34291
34292
34293 for {
34294 if len(v.Args) != 4 {
34295 break
34296 }
34297 callAux := auxToCall(v.Aux)
34298 mem := v.Args[3]
34299 v_0 := v.Args[0]
34300 if v_0.Op != OpAddr {
34301 break
34302 }
34303 scon := auxToSym(v_0.Aux)
34304 v_0_0 := v_0.Args[0]
34305 if v_0_0.Op != OpSB {
34306 break
34307 }
34308 sptr := v.Args[1]
34309 v_2 := v.Args[2]
34310 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 5 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
34311 break
34312 }
34313 v.reset(OpMakeResult)
34314 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
34315 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
34316 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
34317 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
34318 v3.AddArg2(sptr, mem)
34319 v2.AddArg(v3)
34320 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
34321 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.Int64)
34322 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
34323 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
34324 v7.AuxInt = int64ToAuxInt(4)
34325 v7.AddArg(sptr)
34326 v6.AddArg2(v7, mem)
34327 v5.AddArg(v6)
34328 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
34329 v8.AuxInt = int64ToAuxInt(32)
34330 v4.AddArg2(v5, v8)
34331 v1.AddArg2(v2, v4)
34332 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
34333 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read8(scon, 4)) << 32)))
34334 v0.AddArg2(v1, v9)
34335 v.AddArg2(v0, mem)
34336 return true
34337 }
34338
34339
34340
34341 for {
34342 if len(v.Args) != 4 {
34343 break
34344 }
34345 callAux := auxToCall(v.Aux)
34346 mem := v.Args[3]
34347 sptr := v.Args[0]
34348 v_1 := v.Args[1]
34349 if v_1.Op != OpAddr {
34350 break
34351 }
34352 scon := auxToSym(v_1.Aux)
34353 v_1_0 := v_1.Args[0]
34354 if v_1_0.Op != OpSB {
34355 break
34356 }
34357 v_2 := v.Args[2]
34358 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 6 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
34359 break
34360 }
34361 v.reset(OpMakeResult)
34362 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
34363 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
34364 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
34365 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
34366 v3.AddArg2(sptr, mem)
34367 v2.AddArg(v3)
34368 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
34369 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.Int64)
34370 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
34371 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
34372 v7.AuxInt = int64ToAuxInt(4)
34373 v7.AddArg(sptr)
34374 v6.AddArg2(v7, mem)
34375 v5.AddArg(v6)
34376 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
34377 v8.AuxInt = int64ToAuxInt(32)
34378 v4.AddArg2(v5, v8)
34379 v1.AddArg2(v2, v4)
34380 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
34381 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read16(scon, 4, config.ctxt.Arch.ByteOrder)) << 32)))
34382 v0.AddArg2(v1, v9)
34383 v.AddArg2(v0, mem)
34384 return true
34385 }
34386
34387
34388
34389 for {
34390 if len(v.Args) != 4 {
34391 break
34392 }
34393 callAux := auxToCall(v.Aux)
34394 mem := v.Args[3]
34395 v_0 := v.Args[0]
34396 if v_0.Op != OpAddr {
34397 break
34398 }
34399 scon := auxToSym(v_0.Aux)
34400 v_0_0 := v_0.Args[0]
34401 if v_0_0.Op != OpSB {
34402 break
34403 }
34404 sptr := v.Args[1]
34405 v_2 := v.Args[2]
34406 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 6 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
34407 break
34408 }
34409 v.reset(OpMakeResult)
34410 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
34411 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
34412 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
34413 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
34414 v3.AddArg2(sptr, mem)
34415 v2.AddArg(v3)
34416 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
34417 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.Int64)
34418 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
34419 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
34420 v7.AuxInt = int64ToAuxInt(4)
34421 v7.AddArg(sptr)
34422 v6.AddArg2(v7, mem)
34423 v5.AddArg(v6)
34424 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
34425 v8.AuxInt = int64ToAuxInt(32)
34426 v4.AddArg2(v5, v8)
34427 v1.AddArg2(v2, v4)
34428 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
34429 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read16(scon, 4, config.ctxt.Arch.ByteOrder)) << 32)))
34430 v0.AddArg2(v1, v9)
34431 v.AddArg2(v0, mem)
34432 return true
34433 }
34434
34435
34436
34437 for {
34438 if len(v.Args) != 4 {
34439 break
34440 }
34441 callAux := auxToCall(v.Aux)
34442 mem := v.Args[3]
34443 sptr := v.Args[0]
34444 v_1 := v.Args[1]
34445 if v_1.Op != OpAddr {
34446 break
34447 }
34448 scon := auxToSym(v_1.Aux)
34449 v_1_0 := v_1.Args[0]
34450 if v_1_0.Op != OpSB {
34451 break
34452 }
34453 v_2 := v.Args[2]
34454 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 7 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
34455 break
34456 }
34457 v.reset(OpMakeResult)
34458 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
34459 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
34460 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
34461 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
34462 v3.AddArg2(sptr, mem)
34463 v2.AddArg(v3)
34464 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
34465 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
34466 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
34467 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
34468 v7.AuxInt = int64ToAuxInt(3)
34469 v7.AddArg(sptr)
34470 v6.AddArg2(v7, mem)
34471 v5.AddArg(v6)
34472 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
34473 v8.AuxInt = int64ToAuxInt(32)
34474 v4.AddArg2(v5, v8)
34475 v1.AddArg2(v2, v4)
34476 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
34477 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read32(scon, 3, config.ctxt.Arch.ByteOrder)) << 32)))
34478 v0.AddArg2(v1, v9)
34479 v.AddArg2(v0, mem)
34480 return true
34481 }
34482
34483
34484
34485 for {
34486 if len(v.Args) != 4 {
34487 break
34488 }
34489 callAux := auxToCall(v.Aux)
34490 mem := v.Args[3]
34491 v_0 := v.Args[0]
34492 if v_0.Op != OpAddr {
34493 break
34494 }
34495 scon := auxToSym(v_0.Aux)
34496 v_0_0 := v_0.Args[0]
34497 if v_0_0.Op != OpSB {
34498 break
34499 }
34500 sptr := v.Args[1]
34501 v_2 := v.Args[2]
34502 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 7 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
34503 break
34504 }
34505 v.reset(OpMakeResult)
34506 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
34507 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
34508 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
34509 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
34510 v3.AddArg2(sptr, mem)
34511 v2.AddArg(v3)
34512 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
34513 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
34514 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
34515 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
34516 v7.AuxInt = int64ToAuxInt(3)
34517 v7.AddArg(sptr)
34518 v6.AddArg2(v7, mem)
34519 v5.AddArg(v6)
34520 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
34521 v8.AuxInt = int64ToAuxInt(32)
34522 v4.AddArg2(v5, v8)
34523 v1.AddArg2(v2, v4)
34524 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
34525 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read32(scon, 3, config.ctxt.Arch.ByteOrder)) << 32)))
34526 v0.AddArg2(v1, v9)
34527 v.AddArg2(v0, mem)
34528 return true
34529 }
34530
34531
34532
34533 for {
34534 if len(v.Args) != 4 {
34535 break
34536 }
34537 callAux := auxToCall(v.Aux)
34538 mem := v.Args[3]
34539 v_2 := v.Args[2]
34540 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.memequal")) {
34541 break
34542 }
34543 v.reset(OpMakeResult)
34544 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
34545 v0.AuxInt = boolToAuxInt(true)
34546 v.AddArg2(v0, mem)
34547 return true
34548 }
34549
34550
34551
34552 for {
34553 if len(v.Args) != 4 {
34554 break
34555 }
34556 callAux := auxToCall(v.Aux)
34557 mem := v.Args[3]
34558 p := v.Args[0]
34559 q := v.Args[1]
34560 if !(isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)) {
34561 break
34562 }
34563 v.reset(OpMakeResult)
34564 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
34565 v0.AuxInt = boolToAuxInt(true)
34566 v.AddArg2(v0, mem)
34567 return true
34568 }
34569
34570
34571
34572 for {
34573 if len(v.Args) != 4 {
34574 break
34575 }
34576 callAux := auxToCall(v.Aux)
34577 mem := v.Args[3]
34578 v_1 := v.Args[1]
34579 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
34580 break
34581 }
34582 v_2 := v.Args[2]
34583 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.makeslice")) {
34584 break
34585 }
34586 v.reset(OpMakeResult)
34587 v0 := b.NewValue0(v.Pos, OpAddr, v.Type.FieldType(0))
34588 v0.Aux = symToAux(ir.Syms.Zerobase)
34589 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
34590 v0.AddArg(v1)
34591 v.AddArg2(v0, mem)
34592 return true
34593 }
34594
34595
34596
34597 for {
34598 if len(v.Args) != 4 {
34599 break
34600 }
34601 callAux := auxToCall(v.Aux)
34602 mem := v.Args[3]
34603 v_1 := v.Args[1]
34604 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
34605 break
34606 }
34607 v_2 := v.Args[2]
34608 if v_2.Op != OpConst32 || auxIntToInt32(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.makeslice")) {
34609 break
34610 }
34611 v.reset(OpMakeResult)
34612 v0 := b.NewValue0(v.Pos, OpAddr, v.Type.FieldType(0))
34613 v0.Aux = symToAux(ir.Syms.Zerobase)
34614 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
34615 v0.AddArg(v1)
34616 v.AddArg2(v0, mem)
34617 return true
34618 }
34619
34620
34621
34622 for {
34623 if len(v.Args) != 4 {
34624 break
34625 }
34626 f := auxToCall(v.Aux)
34627 mem := v.Args[3]
34628 typ_ := v.Args[0]
34629 x := v.Args[1]
34630 y := v.Args[2]
34631 if !(isSameCall(f, "runtime.efaceeq") && isDirectAndComparableType(typ_) && clobber(v)) {
34632 break
34633 }
34634 v.reset(OpMakeResult)
34635 v0 := b.NewValue0(v.Pos, OpEqPtr, typ.Bool)
34636 v0.AddArg2(x, y)
34637 v.AddArg2(v0, mem)
34638 return true
34639 }
34640
34641
34642
34643 for {
34644 if len(v.Args) != 4 {
34645 break
34646 }
34647 f := auxToCall(v.Aux)
34648 mem := v.Args[3]
34649 itab := v.Args[0]
34650 x := v.Args[1]
34651 y := v.Args[2]
34652 if !(isSameCall(f, "runtime.ifaceeq") && isDirectAndComparableIface(itab) && clobber(v)) {
34653 break
34654 }
34655 v.reset(OpMakeResult)
34656 v0 := b.NewValue0(v.Pos, OpEqPtr, typ.Bool)
34657 v0.AddArg2(x, y)
34658 v.AddArg2(v0, mem)
34659 return true
34660 }
34661
34662
34663
34664 for {
34665 if len(v.Args) != 4 {
34666 break
34667 }
34668 argsize := auxIntToInt32(v.AuxInt)
34669 f := auxToCall(v.Aux)
34670 _ = v.Args[3]
34671 typ_ := v.Args[0]
34672 map_ := v.Args[1]
34673 key := v.Args[2]
34674 if key.Op != OpSelectN || auxIntToInt64(key.AuxInt) != 0 {
34675 break
34676 }
34677 sbts := key.Args[0]
34678 if sbts.Op != OpStaticLECall || len(sbts.Args) != 4 {
34679 break
34680 }
34681 g := auxToCall(sbts.Aux)
34682 mem := sbts.Args[3]
34683 ptr := sbts.Args[1]
34684 len := sbts.Args[2]
34685 m := v.Args[3]
34686 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)) {
34687 break
34688 }
34689 v.reset(OpStaticLECall)
34690 v.AuxInt = int32ToAuxInt(argsize)
34691 v.Aux = callToAux(f)
34692 v0 := b.NewValue0(v.Pos, OpStringMake, typ.String)
34693 v0.AddArg2(ptr, len)
34694 v.AddArg4(typ_, map_, v0, mem)
34695 return true
34696 }
34697
34698
34699
34700 for {
34701 if len(v.Args) != 3 {
34702 break
34703 }
34704 argsize := auxIntToInt32(v.AuxInt)
34705 f := auxToCall(v.Aux)
34706 _ = v.Args[2]
34707 dict_ := v.Args[0]
34708 key := v.Args[1]
34709 if key.Op != OpSelectN || auxIntToInt64(key.AuxInt) != 0 {
34710 break
34711 }
34712 sbts := key.Args[0]
34713 if sbts.Op != OpStaticLECall || len(sbts.Args) != 4 {
34714 break
34715 }
34716 g := auxToCall(sbts.Aux)
34717 mem := sbts.Args[3]
34718 ptr := sbts.Args[1]
34719 len := sbts.Args[2]
34720 m := v.Args[2]
34721 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)) {
34722 break
34723 }
34724 v.reset(OpStaticLECall)
34725 v.AuxInt = int32ToAuxInt(argsize)
34726 v.Aux = callToAux(f)
34727 v0 := b.NewValue0(v.Pos, OpStringMake, typ.String)
34728 v0.AddArg2(ptr, len)
34729 v.AddArg3(dict_, v0, mem)
34730 return true
34731 }
34732 return false
34733 }
34734 func rewriteValuegeneric_OpStore(v *Value) bool {
34735 v_2 := v.Args[2]
34736 v_1 := v.Args[1]
34737 v_0 := v.Args[0]
34738 b := v.Block
34739
34740
34741
34742 for {
34743 t1 := auxToType(v.Aux)
34744 p1 := v_0
34745 if v_1.Op != OpLoad {
34746 break
34747 }
34748 t2 := v_1.Type
34749 mem := v_1.Args[1]
34750 p2 := v_1.Args[0]
34751 if mem != v_2 || !(isSamePtr(p1, p2) && t2.Size() == t1.Size()) {
34752 break
34753 }
34754 v.copyOf(mem)
34755 return true
34756 }
34757
34758
34759
34760 for {
34761 t1 := auxToType(v.Aux)
34762 p1 := v_0
34763 if v_1.Op != OpLoad {
34764 break
34765 }
34766 t2 := v_1.Type
34767 oldmem := v_1.Args[1]
34768 p2 := v_1.Args[0]
34769 mem := v_2
34770 if mem.Op != OpStore {
34771 break
34772 }
34773 t3 := auxToType(mem.Aux)
34774 _ = mem.Args[2]
34775 p3 := mem.Args[0]
34776 if oldmem != mem.Args[2] || !(isSamePtr(p1, p2) && t2.Size() == t1.Size() && disjoint(p1, t1.Size(), p3, t3.Size())) {
34777 break
34778 }
34779 v.copyOf(mem)
34780 return true
34781 }
34782
34783
34784
34785 for {
34786 t1 := auxToType(v.Aux)
34787 p1 := v_0
34788 if v_1.Op != OpLoad {
34789 break
34790 }
34791 t2 := v_1.Type
34792 oldmem := v_1.Args[1]
34793 p2 := v_1.Args[0]
34794 mem := v_2
34795 if mem.Op != OpStore {
34796 break
34797 }
34798 t3 := auxToType(mem.Aux)
34799 _ = mem.Args[2]
34800 p3 := mem.Args[0]
34801 mem_2 := mem.Args[2]
34802 if mem_2.Op != OpStore {
34803 break
34804 }
34805 t4 := auxToType(mem_2.Aux)
34806 _ = mem_2.Args[2]
34807 p4 := mem_2.Args[0]
34808 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())) {
34809 break
34810 }
34811 v.copyOf(mem)
34812 return true
34813 }
34814
34815
34816
34817 for {
34818 t1 := auxToType(v.Aux)
34819 p1 := v_0
34820 if v_1.Op != OpLoad {
34821 break
34822 }
34823 t2 := v_1.Type
34824 oldmem := v_1.Args[1]
34825 p2 := v_1.Args[0]
34826 mem := v_2
34827 if mem.Op != OpStore {
34828 break
34829 }
34830 t3 := auxToType(mem.Aux)
34831 _ = mem.Args[2]
34832 p3 := mem.Args[0]
34833 mem_2 := mem.Args[2]
34834 if mem_2.Op != OpStore {
34835 break
34836 }
34837 t4 := auxToType(mem_2.Aux)
34838 _ = mem_2.Args[2]
34839 p4 := mem_2.Args[0]
34840 mem_2_2 := mem_2.Args[2]
34841 if mem_2_2.Op != OpStore {
34842 break
34843 }
34844 t5 := auxToType(mem_2_2.Aux)
34845 _ = mem_2_2.Args[2]
34846 p5 := mem_2_2.Args[0]
34847 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())) {
34848 break
34849 }
34850 v.copyOf(mem)
34851 return true
34852 }
34853
34854
34855
34856 for {
34857 t := auxToType(v.Aux)
34858 if v_0.Op != OpOffPtr {
34859 break
34860 }
34861 o := auxIntToInt64(v_0.AuxInt)
34862 p1 := v_0.Args[0]
34863 x := v_1
34864 mem := v_2
34865 if mem.Op != OpZero {
34866 break
34867 }
34868 n := auxIntToInt64(mem.AuxInt)
34869 p2 := mem.Args[0]
34870 if !(isConstZero(x) && o >= 0 && t.Size()+o <= n && isSamePtr(p1, p2)) {
34871 break
34872 }
34873 v.copyOf(mem)
34874 return true
34875 }
34876
34877
34878
34879 for {
34880 t1 := auxToType(v.Aux)
34881 op := v_0
34882 if op.Op != OpOffPtr {
34883 break
34884 }
34885 o1 := auxIntToInt64(op.AuxInt)
34886 p1 := op.Args[0]
34887 x := v_1
34888 mem := v_2
34889 if mem.Op != OpStore {
34890 break
34891 }
34892 t2 := auxToType(mem.Aux)
34893 _ = mem.Args[2]
34894 p2 := mem.Args[0]
34895 mem_2 := mem.Args[2]
34896 if mem_2.Op != OpZero {
34897 break
34898 }
34899 n := auxIntToInt64(mem_2.AuxInt)
34900 p3 := mem_2.Args[0]
34901 if !(isConstZero(x) && o1 >= 0 && t1.Size()+o1 <= n && isSamePtr(p1, p3) && disjoint(op, t1.Size(), p2, t2.Size())) {
34902 break
34903 }
34904 v.copyOf(mem)
34905 return true
34906 }
34907
34908
34909
34910 for {
34911 t1 := auxToType(v.Aux)
34912 op := v_0
34913 if op.Op != OpOffPtr {
34914 break
34915 }
34916 o1 := auxIntToInt64(op.AuxInt)
34917 p1 := op.Args[0]
34918 x := v_1
34919 mem := v_2
34920 if mem.Op != OpStore {
34921 break
34922 }
34923 t2 := auxToType(mem.Aux)
34924 _ = mem.Args[2]
34925 p2 := mem.Args[0]
34926 mem_2 := mem.Args[2]
34927 if mem_2.Op != OpStore {
34928 break
34929 }
34930 t3 := auxToType(mem_2.Aux)
34931 _ = mem_2.Args[2]
34932 p3 := mem_2.Args[0]
34933 mem_2_2 := mem_2.Args[2]
34934 if mem_2_2.Op != OpZero {
34935 break
34936 }
34937 n := auxIntToInt64(mem_2_2.AuxInt)
34938 p4 := mem_2_2.Args[0]
34939 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())) {
34940 break
34941 }
34942 v.copyOf(mem)
34943 return true
34944 }
34945
34946
34947
34948 for {
34949 t1 := auxToType(v.Aux)
34950 op := v_0
34951 if op.Op != OpOffPtr {
34952 break
34953 }
34954 o1 := auxIntToInt64(op.AuxInt)
34955 p1 := op.Args[0]
34956 x := v_1
34957 mem := v_2
34958 if mem.Op != OpStore {
34959 break
34960 }
34961 t2 := auxToType(mem.Aux)
34962 _ = mem.Args[2]
34963 p2 := mem.Args[0]
34964 mem_2 := mem.Args[2]
34965 if mem_2.Op != OpStore {
34966 break
34967 }
34968 t3 := auxToType(mem_2.Aux)
34969 _ = mem_2.Args[2]
34970 p3 := mem_2.Args[0]
34971 mem_2_2 := mem_2.Args[2]
34972 if mem_2_2.Op != OpStore {
34973 break
34974 }
34975 t4 := auxToType(mem_2_2.Aux)
34976 _ = mem_2_2.Args[2]
34977 p4 := mem_2_2.Args[0]
34978 mem_2_2_2 := mem_2_2.Args[2]
34979 if mem_2_2_2.Op != OpZero {
34980 break
34981 }
34982 n := auxIntToInt64(mem_2_2_2.AuxInt)
34983 p5 := mem_2_2_2.Args[0]
34984 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())) {
34985 break
34986 }
34987 v.copyOf(mem)
34988 return true
34989 }
34990
34991
34992 for {
34993 if v_1.Op != OpStructMake {
34994 break
34995 }
34996 v.copyOf(rewriteStructStore(v))
34997 return true
34998 }
34999
35000
35001
35002 for {
35003 t := auxToType(v.Aux)
35004 dst := v_0
35005 if v_1.Op != OpLoad {
35006 break
35007 }
35008 mem := v_1.Args[1]
35009 src := v_1.Args[0]
35010 if mem != v_2 || !(!CanSSA(t)) {
35011 break
35012 }
35013 v.reset(OpMove)
35014 v.AuxInt = int64ToAuxInt(t.Size())
35015 v.Aux = typeToAux(t)
35016 v.AddArg3(dst, src, mem)
35017 return true
35018 }
35019
35020
35021
35022 for {
35023 t := auxToType(v.Aux)
35024 dst := v_0
35025 if v_1.Op != OpLoad {
35026 break
35027 }
35028 mem := v_1.Args[1]
35029 src := v_1.Args[0]
35030 if v_2.Op != OpVarDef {
35031 break
35032 }
35033 x := auxToSym(v_2.Aux)
35034 if mem != v_2.Args[0] || !(!CanSSA(t)) {
35035 break
35036 }
35037 v.reset(OpMove)
35038 v.AuxInt = int64ToAuxInt(t.Size())
35039 v.Aux = typeToAux(t)
35040 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
35041 v0.Aux = symToAux(x)
35042 v0.AddArg(mem)
35043 v.AddArg3(dst, src, v0)
35044 return true
35045 }
35046
35047
35048 for {
35049 dst := v_0
35050 if v_1.Op != OpArrayMake1 {
35051 break
35052 }
35053 e := v_1.Args[0]
35054 mem := v_2
35055 v.reset(OpStore)
35056 v.Aux = typeToAux(e.Type)
35057 v.AddArg3(dst, e, mem)
35058 return true
35059 }
35060
35061
35062 for {
35063 if v_1.Op != OpEmpty {
35064 break
35065 }
35066 mem := v_2
35067 v.copyOf(mem)
35068 return true
35069 }
35070
35071
35072
35073 for {
35074 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
35075 break
35076 }
35077 call := v_0.Args[0]
35078 if call.Op != OpStaticLECall {
35079 break
35080 }
35081 x := v_1
35082 mem := v_2
35083 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isConstZero(x) && isMalloc(call.Aux)) {
35084 break
35085 }
35086 v.copyOf(mem)
35087 return true
35088 }
35089
35090
35091
35092 for {
35093 if v_0.Op != OpOffPtr {
35094 break
35095 }
35096 v_0_0 := v_0.Args[0]
35097 if v_0_0.Op != OpSelectN || auxIntToInt64(v_0_0.AuxInt) != 0 {
35098 break
35099 }
35100 call := v_0_0.Args[0]
35101 if call.Op != OpStaticLECall {
35102 break
35103 }
35104 x := v_1
35105 mem := v_2
35106 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isConstZero(x) && isMalloc(call.Aux)) {
35107 break
35108 }
35109 v.copyOf(mem)
35110 return true
35111 }
35112
35113
35114
35115 for {
35116 t1 := auxToType(v.Aux)
35117 op1 := v_0
35118 if op1.Op != OpOffPtr {
35119 break
35120 }
35121 o1 := auxIntToInt64(op1.AuxInt)
35122 p1 := op1.Args[0]
35123 d1 := v_1
35124 m2 := v_2
35125 if m2.Op != OpStore {
35126 break
35127 }
35128 t2 := auxToType(m2.Aux)
35129 _ = m2.Args[2]
35130 op2 := m2.Args[0]
35131 if op2.Op != OpOffPtr || auxIntToInt64(op2.AuxInt) != 0 {
35132 break
35133 }
35134 p2 := op2.Args[0]
35135 d2 := m2.Args[1]
35136 m3 := m2.Args[2]
35137 if m3.Op != OpMove {
35138 break
35139 }
35140 n := auxIntToInt64(m3.AuxInt)
35141 mem := m3.Args[2]
35142 p3 := m3.Args[0]
35143 if !(m2.Uses == 1 && m3.Uses == 1 && o1 == t2.Size() && n == t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2, m3)) {
35144 break
35145 }
35146 v.reset(OpStore)
35147 v.Aux = typeToAux(t1)
35148 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
35149 v0.Aux = typeToAux(t2)
35150 v0.AddArg3(op2, d2, mem)
35151 v.AddArg3(op1, d1, v0)
35152 return true
35153 }
35154
35155
35156
35157 for {
35158 t1 := auxToType(v.Aux)
35159 op1 := v_0
35160 if op1.Op != OpOffPtr {
35161 break
35162 }
35163 o1 := auxIntToInt64(op1.AuxInt)
35164 p1 := op1.Args[0]
35165 d1 := v_1
35166 m2 := v_2
35167 if m2.Op != OpStore {
35168 break
35169 }
35170 t2 := auxToType(m2.Aux)
35171 _ = m2.Args[2]
35172 op2 := m2.Args[0]
35173 if op2.Op != OpOffPtr {
35174 break
35175 }
35176 o2 := auxIntToInt64(op2.AuxInt)
35177 p2 := op2.Args[0]
35178 d2 := m2.Args[1]
35179 m3 := m2.Args[2]
35180 if m3.Op != OpStore {
35181 break
35182 }
35183 t3 := auxToType(m3.Aux)
35184 _ = m3.Args[2]
35185 op3 := m3.Args[0]
35186 if op3.Op != OpOffPtr || auxIntToInt64(op3.AuxInt) != 0 {
35187 break
35188 }
35189 p3 := op3.Args[0]
35190 d3 := m3.Args[1]
35191 m4 := m3.Args[2]
35192 if m4.Op != OpMove {
35193 break
35194 }
35195 n := auxIntToInt64(m4.AuxInt)
35196 mem := m4.Args[2]
35197 p4 := m4.Args[0]
35198 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)) {
35199 break
35200 }
35201 v.reset(OpStore)
35202 v.Aux = typeToAux(t1)
35203 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
35204 v0.Aux = typeToAux(t2)
35205 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
35206 v1.Aux = typeToAux(t3)
35207 v1.AddArg3(op3, d3, mem)
35208 v0.AddArg3(op2, d2, v1)
35209 v.AddArg3(op1, d1, v0)
35210 return true
35211 }
35212
35213
35214
35215 for {
35216 t1 := auxToType(v.Aux)
35217 op1 := v_0
35218 if op1.Op != OpOffPtr {
35219 break
35220 }
35221 o1 := auxIntToInt64(op1.AuxInt)
35222 p1 := op1.Args[0]
35223 d1 := v_1
35224 m2 := v_2
35225 if m2.Op != OpStore {
35226 break
35227 }
35228 t2 := auxToType(m2.Aux)
35229 _ = m2.Args[2]
35230 op2 := m2.Args[0]
35231 if op2.Op != OpOffPtr {
35232 break
35233 }
35234 o2 := auxIntToInt64(op2.AuxInt)
35235 p2 := op2.Args[0]
35236 d2 := m2.Args[1]
35237 m3 := m2.Args[2]
35238 if m3.Op != OpStore {
35239 break
35240 }
35241 t3 := auxToType(m3.Aux)
35242 _ = m3.Args[2]
35243 op3 := m3.Args[0]
35244 if op3.Op != OpOffPtr {
35245 break
35246 }
35247 o3 := auxIntToInt64(op3.AuxInt)
35248 p3 := op3.Args[0]
35249 d3 := m3.Args[1]
35250 m4 := m3.Args[2]
35251 if m4.Op != OpStore {
35252 break
35253 }
35254 t4 := auxToType(m4.Aux)
35255 _ = m4.Args[2]
35256 op4 := m4.Args[0]
35257 if op4.Op != OpOffPtr || auxIntToInt64(op4.AuxInt) != 0 {
35258 break
35259 }
35260 p4 := op4.Args[0]
35261 d4 := m4.Args[1]
35262 m5 := m4.Args[2]
35263 if m5.Op != OpMove {
35264 break
35265 }
35266 n := auxIntToInt64(m5.AuxInt)
35267 mem := m5.Args[2]
35268 p5 := m5.Args[0]
35269 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)) {
35270 break
35271 }
35272 v.reset(OpStore)
35273 v.Aux = typeToAux(t1)
35274 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
35275 v0.Aux = typeToAux(t2)
35276 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
35277 v1.Aux = typeToAux(t3)
35278 v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
35279 v2.Aux = typeToAux(t4)
35280 v2.AddArg3(op4, d4, mem)
35281 v1.AddArg3(op3, d3, v2)
35282 v0.AddArg3(op2, d2, v1)
35283 v.AddArg3(op1, d1, v0)
35284 return true
35285 }
35286
35287
35288
35289 for {
35290 t1 := auxToType(v.Aux)
35291 op1 := v_0
35292 if op1.Op != OpOffPtr {
35293 break
35294 }
35295 o1 := auxIntToInt64(op1.AuxInt)
35296 p1 := op1.Args[0]
35297 d1 := v_1
35298 m2 := v_2
35299 if m2.Op != OpStore {
35300 break
35301 }
35302 t2 := auxToType(m2.Aux)
35303 _ = m2.Args[2]
35304 op2 := m2.Args[0]
35305 if op2.Op != OpOffPtr || auxIntToInt64(op2.AuxInt) != 0 {
35306 break
35307 }
35308 p2 := op2.Args[0]
35309 d2 := m2.Args[1]
35310 m3 := m2.Args[2]
35311 if m3.Op != OpZero {
35312 break
35313 }
35314 n := auxIntToInt64(m3.AuxInt)
35315 mem := m3.Args[1]
35316 p3 := m3.Args[0]
35317 if !(m2.Uses == 1 && m3.Uses == 1 && o1 == t2.Size() && n == t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2, m3)) {
35318 break
35319 }
35320 v.reset(OpStore)
35321 v.Aux = typeToAux(t1)
35322 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
35323 v0.Aux = typeToAux(t2)
35324 v0.AddArg3(op2, d2, mem)
35325 v.AddArg3(op1, d1, v0)
35326 return true
35327 }
35328
35329
35330
35331 for {
35332 t1 := auxToType(v.Aux)
35333 op1 := v_0
35334 if op1.Op != OpOffPtr {
35335 break
35336 }
35337 o1 := auxIntToInt64(op1.AuxInt)
35338 p1 := op1.Args[0]
35339 d1 := v_1
35340 m2 := v_2
35341 if m2.Op != OpStore {
35342 break
35343 }
35344 t2 := auxToType(m2.Aux)
35345 _ = m2.Args[2]
35346 op2 := m2.Args[0]
35347 if op2.Op != OpOffPtr {
35348 break
35349 }
35350 o2 := auxIntToInt64(op2.AuxInt)
35351 p2 := op2.Args[0]
35352 d2 := m2.Args[1]
35353 m3 := m2.Args[2]
35354 if m3.Op != OpStore {
35355 break
35356 }
35357 t3 := auxToType(m3.Aux)
35358 _ = m3.Args[2]
35359 op3 := m3.Args[0]
35360 if op3.Op != OpOffPtr || auxIntToInt64(op3.AuxInt) != 0 {
35361 break
35362 }
35363 p3 := op3.Args[0]
35364 d3 := m3.Args[1]
35365 m4 := m3.Args[2]
35366 if m4.Op != OpZero {
35367 break
35368 }
35369 n := auxIntToInt64(m4.AuxInt)
35370 mem := m4.Args[1]
35371 p4 := m4.Args[0]
35372 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)) {
35373 break
35374 }
35375 v.reset(OpStore)
35376 v.Aux = typeToAux(t1)
35377 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
35378 v0.Aux = typeToAux(t2)
35379 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
35380 v1.Aux = typeToAux(t3)
35381 v1.AddArg3(op3, d3, mem)
35382 v0.AddArg3(op2, d2, v1)
35383 v.AddArg3(op1, d1, v0)
35384 return true
35385 }
35386
35387
35388
35389 for {
35390 t1 := auxToType(v.Aux)
35391 op1 := v_0
35392 if op1.Op != OpOffPtr {
35393 break
35394 }
35395 o1 := auxIntToInt64(op1.AuxInt)
35396 p1 := op1.Args[0]
35397 d1 := v_1
35398 m2 := v_2
35399 if m2.Op != OpStore {
35400 break
35401 }
35402 t2 := auxToType(m2.Aux)
35403 _ = m2.Args[2]
35404 op2 := m2.Args[0]
35405 if op2.Op != OpOffPtr {
35406 break
35407 }
35408 o2 := auxIntToInt64(op2.AuxInt)
35409 p2 := op2.Args[0]
35410 d2 := m2.Args[1]
35411 m3 := m2.Args[2]
35412 if m3.Op != OpStore {
35413 break
35414 }
35415 t3 := auxToType(m3.Aux)
35416 _ = m3.Args[2]
35417 op3 := m3.Args[0]
35418 if op3.Op != OpOffPtr {
35419 break
35420 }
35421 o3 := auxIntToInt64(op3.AuxInt)
35422 p3 := op3.Args[0]
35423 d3 := m3.Args[1]
35424 m4 := m3.Args[2]
35425 if m4.Op != OpStore {
35426 break
35427 }
35428 t4 := auxToType(m4.Aux)
35429 _ = m4.Args[2]
35430 op4 := m4.Args[0]
35431 if op4.Op != OpOffPtr || auxIntToInt64(op4.AuxInt) != 0 {
35432 break
35433 }
35434 p4 := op4.Args[0]
35435 d4 := m4.Args[1]
35436 m5 := m4.Args[2]
35437 if m5.Op != OpZero {
35438 break
35439 }
35440 n := auxIntToInt64(m5.AuxInt)
35441 mem := m5.Args[1]
35442 p5 := m5.Args[0]
35443 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)) {
35444 break
35445 }
35446 v.reset(OpStore)
35447 v.Aux = typeToAux(t1)
35448 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
35449 v0.Aux = typeToAux(t2)
35450 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
35451 v1.Aux = typeToAux(t3)
35452 v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
35453 v2.Aux = typeToAux(t4)
35454 v2.AddArg3(op4, d4, mem)
35455 v1.AddArg3(op3, d3, v2)
35456 v0.AddArg3(op2, d2, v1)
35457 v.AddArg3(op1, d1, v0)
35458 return true
35459 }
35460 return false
35461 }
35462 func rewriteValuegeneric_OpStringLen(v *Value) bool {
35463 v_0 := v.Args[0]
35464
35465
35466 for {
35467 if v_0.Op != OpStringMake {
35468 break
35469 }
35470 _ = v_0.Args[1]
35471 v_0_1 := v_0.Args[1]
35472 if v_0_1.Op != OpConst64 {
35473 break
35474 }
35475 t := v_0_1.Type
35476 c := auxIntToInt64(v_0_1.AuxInt)
35477 v.reset(OpConst64)
35478 v.Type = t
35479 v.AuxInt = int64ToAuxInt(c)
35480 return true
35481 }
35482 return false
35483 }
35484 func rewriteValuegeneric_OpStringPtr(v *Value) bool {
35485 v_0 := v.Args[0]
35486
35487
35488 for {
35489 if v_0.Op != OpStringMake {
35490 break
35491 }
35492 v_0_0 := v_0.Args[0]
35493 if v_0_0.Op != OpAddr {
35494 break
35495 }
35496 t := v_0_0.Type
35497 s := auxToSym(v_0_0.Aux)
35498 base := v_0_0.Args[0]
35499 v.reset(OpAddr)
35500 v.Type = t
35501 v.Aux = symToAux(s)
35502 v.AddArg(base)
35503 return true
35504 }
35505 return false
35506 }
35507 func rewriteValuegeneric_OpStructSelect(v *Value) bool {
35508 v_0 := v.Args[0]
35509 b := v.Block
35510
35511
35512 for {
35513 i := auxIntToInt64(v.AuxInt)
35514 x := v_0
35515 if x.Op != OpStructMake {
35516 break
35517 }
35518 v.copyOf(x.Args[i])
35519 return true
35520 }
35521
35522
35523
35524 for {
35525 i := auxIntToInt64(v.AuxInt)
35526 x := v_0
35527 if x.Op != OpLoad {
35528 break
35529 }
35530 t := x.Type
35531 mem := x.Args[1]
35532 ptr := x.Args[0]
35533 if !(!CanSSA(t)) {
35534 break
35535 }
35536 b = x.Block
35537 v0 := b.NewValue0(v.Pos, OpLoad, v.Type)
35538 v.copyOf(v0)
35539 v1 := b.NewValue0(v.Pos, OpOffPtr, v.Type.PtrTo())
35540 v1.AuxInt = int64ToAuxInt(t.FieldOff(int(i)))
35541 v1.AddArg(ptr)
35542 v0.AddArg2(v1, mem)
35543 return true
35544 }
35545
35546
35547
35548 for {
35549 if v_0.Op != OpIData {
35550 break
35551 }
35552 x := v_0.Args[0]
35553 if !(v.Type.Size() > 0) {
35554 break
35555 }
35556 v.reset(OpIData)
35557 v.AddArg(x)
35558 return true
35559 }
35560
35561
35562
35563 for {
35564 if v_0.Op != OpIData {
35565 break
35566 }
35567 if !(v.Type.Size() == 0) {
35568 break
35569 }
35570 v.reset(OpEmpty)
35571 return true
35572 }
35573 return false
35574 }
35575 func rewriteValuegeneric_OpSub16(v *Value) bool {
35576 v_1 := v.Args[1]
35577 v_0 := v.Args[0]
35578 b := v.Block
35579
35580
35581 for {
35582 if v_0.Op != OpConst16 {
35583 break
35584 }
35585 c := auxIntToInt16(v_0.AuxInt)
35586 if v_1.Op != OpConst16 {
35587 break
35588 }
35589 d := auxIntToInt16(v_1.AuxInt)
35590 v.reset(OpConst16)
35591 v.AuxInt = int16ToAuxInt(c - d)
35592 return true
35593 }
35594
35595
35596
35597 for {
35598 x := v_0
35599 if v_1.Op != OpConst16 {
35600 break
35601 }
35602 t := v_1.Type
35603 c := auxIntToInt16(v_1.AuxInt)
35604 if !(x.Op != OpConst16) {
35605 break
35606 }
35607 v.reset(OpAdd16)
35608 v0 := b.NewValue0(v.Pos, OpConst16, t)
35609 v0.AuxInt = int16ToAuxInt(-c)
35610 v.AddArg2(v0, x)
35611 return true
35612 }
35613
35614
35615 for {
35616 t := v.Type
35617 if v_0.Op != OpMul16 {
35618 break
35619 }
35620 _ = v_0.Args[1]
35621 v_0_0 := v_0.Args[0]
35622 v_0_1 := v_0.Args[1]
35623 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35624 x := v_0_0
35625 y := v_0_1
35626 if v_1.Op != OpMul16 {
35627 continue
35628 }
35629 _ = v_1.Args[1]
35630 v_1_0 := v_1.Args[0]
35631 v_1_1 := v_1.Args[1]
35632 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35633 if x != v_1_0 {
35634 continue
35635 }
35636 z := v_1_1
35637 v.reset(OpMul16)
35638 v0 := b.NewValue0(v.Pos, OpSub16, t)
35639 v0.AddArg2(y, z)
35640 v.AddArg2(x, v0)
35641 return true
35642 }
35643 }
35644 break
35645 }
35646
35647
35648 for {
35649 x := v_0
35650 if x != v_1 {
35651 break
35652 }
35653 v.reset(OpConst16)
35654 v.AuxInt = int16ToAuxInt(0)
35655 return true
35656 }
35657
35658
35659 for {
35660 if v_0.Op != OpNeg16 {
35661 break
35662 }
35663 x := v_0.Args[0]
35664 if v_1.Op != OpCom16 || x != v_1.Args[0] {
35665 break
35666 }
35667 v.reset(OpConst16)
35668 v.AuxInt = int16ToAuxInt(1)
35669 return true
35670 }
35671
35672
35673 for {
35674 if v_0.Op != OpCom16 {
35675 break
35676 }
35677 x := v_0.Args[0]
35678 if v_1.Op != OpNeg16 || x != v_1.Args[0] {
35679 break
35680 }
35681 v.reset(OpConst16)
35682 v.AuxInt = int16ToAuxInt(-1)
35683 return true
35684 }
35685
35686
35687 for {
35688 if v_0.Op != OpAdd16 {
35689 break
35690 }
35691 _ = v_0.Args[1]
35692 v_0_0 := v_0.Args[0]
35693 v_0_1 := v_0.Args[1]
35694 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35695 t := v_0_0
35696 x := v_0_1
35697 if v_1.Op != OpAdd16 {
35698 continue
35699 }
35700 _ = v_1.Args[1]
35701 v_1_0 := v_1.Args[0]
35702 v_1_1 := v_1.Args[1]
35703 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35704 if t != v_1_0 {
35705 continue
35706 }
35707 y := v_1_1
35708 v.reset(OpSub16)
35709 v.AddArg2(x, y)
35710 return true
35711 }
35712 }
35713 break
35714 }
35715
35716
35717 for {
35718 if v_0.Op != OpAdd16 {
35719 break
35720 }
35721 _ = v_0.Args[1]
35722 v_0_0 := v_0.Args[0]
35723 v_0_1 := v_0.Args[1]
35724 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35725 x := v_0_0
35726 y := v_0_1
35727 if x != v_1 {
35728 continue
35729 }
35730 v.copyOf(y)
35731 return true
35732 }
35733 break
35734 }
35735
35736
35737 for {
35738 if v_0.Op != OpAdd16 {
35739 break
35740 }
35741 _ = v_0.Args[1]
35742 v_0_0 := v_0.Args[0]
35743 v_0_1 := v_0.Args[1]
35744 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35745 x := v_0_0
35746 y := v_0_1
35747 if y != v_1 {
35748 continue
35749 }
35750 v.copyOf(x)
35751 return true
35752 }
35753 break
35754 }
35755
35756
35757 for {
35758 if v_0.Op != OpSub16 {
35759 break
35760 }
35761 y := v_0.Args[1]
35762 x := v_0.Args[0]
35763 if x != v_1 {
35764 break
35765 }
35766 v.reset(OpNeg16)
35767 v.AddArg(y)
35768 return true
35769 }
35770
35771
35772 for {
35773 x := v_0
35774 if v_1.Op != OpAdd16 {
35775 break
35776 }
35777 _ = v_1.Args[1]
35778 v_1_0 := v_1.Args[0]
35779 v_1_1 := v_1.Args[1]
35780 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
35781 if x != v_1_0 {
35782 continue
35783 }
35784 y := v_1_1
35785 v.reset(OpNeg16)
35786 v.AddArg(y)
35787 return true
35788 }
35789 break
35790 }
35791
35792
35793
35794 for {
35795 x := v_0
35796 if v_1.Op != OpSub16 {
35797 break
35798 }
35799 z := v_1.Args[1]
35800 i := v_1.Args[0]
35801 if i.Op != OpConst16 {
35802 break
35803 }
35804 t := i.Type
35805 if !(z.Op != OpConst16 && x.Op != OpConst16) {
35806 break
35807 }
35808 v.reset(OpSub16)
35809 v0 := b.NewValue0(v.Pos, OpAdd16, t)
35810 v0.AddArg2(x, z)
35811 v.AddArg2(v0, i)
35812 return true
35813 }
35814
35815
35816
35817 for {
35818 x := v_0
35819 if v_1.Op != OpAdd16 {
35820 break
35821 }
35822 _ = v_1.Args[1]
35823 v_1_0 := v_1.Args[0]
35824 v_1_1 := v_1.Args[1]
35825 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
35826 z := v_1_0
35827 i := v_1_1
35828 if i.Op != OpConst16 {
35829 continue
35830 }
35831 t := i.Type
35832 if !(z.Op != OpConst16 && x.Op != OpConst16) {
35833 continue
35834 }
35835 v.reset(OpSub16)
35836 v0 := b.NewValue0(v.Pos, OpSub16, t)
35837 v0.AddArg2(x, z)
35838 v.AddArg2(v0, i)
35839 return true
35840 }
35841 break
35842 }
35843
35844
35845
35846 for {
35847 if v_0.Op != OpSub16 {
35848 break
35849 }
35850 z := v_0.Args[1]
35851 i := v_0.Args[0]
35852 if i.Op != OpConst16 {
35853 break
35854 }
35855 t := i.Type
35856 x := v_1
35857 if !(z.Op != OpConst16 && x.Op != OpConst16) {
35858 break
35859 }
35860 v.reset(OpSub16)
35861 v0 := b.NewValue0(v.Pos, OpAdd16, t)
35862 v0.AddArg2(z, x)
35863 v.AddArg2(i, v0)
35864 return true
35865 }
35866
35867
35868
35869 for {
35870 if v_0.Op != OpAdd16 {
35871 break
35872 }
35873 _ = v_0.Args[1]
35874 v_0_0 := v_0.Args[0]
35875 v_0_1 := v_0.Args[1]
35876 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35877 z := v_0_0
35878 i := v_0_1
35879 if i.Op != OpConst16 {
35880 continue
35881 }
35882 t := i.Type
35883 x := v_1
35884 if !(z.Op != OpConst16 && x.Op != OpConst16) {
35885 continue
35886 }
35887 v.reset(OpAdd16)
35888 v0 := b.NewValue0(v.Pos, OpSub16, t)
35889 v0.AddArg2(z, x)
35890 v.AddArg2(i, v0)
35891 return true
35892 }
35893 break
35894 }
35895
35896
35897 for {
35898 if v_0.Op != OpConst16 {
35899 break
35900 }
35901 t := v_0.Type
35902 c := auxIntToInt16(v_0.AuxInt)
35903 if v_1.Op != OpSub16 {
35904 break
35905 }
35906 x := v_1.Args[1]
35907 v_1_0 := v_1.Args[0]
35908 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
35909 break
35910 }
35911 d := auxIntToInt16(v_1_0.AuxInt)
35912 v.reset(OpAdd16)
35913 v0 := b.NewValue0(v.Pos, OpConst16, t)
35914 v0.AuxInt = int16ToAuxInt(c - d)
35915 v.AddArg2(v0, x)
35916 return true
35917 }
35918
35919
35920 for {
35921 if v_0.Op != OpConst16 {
35922 break
35923 }
35924 t := v_0.Type
35925 c := auxIntToInt16(v_0.AuxInt)
35926 if v_1.Op != OpAdd16 {
35927 break
35928 }
35929 _ = v_1.Args[1]
35930 v_1_0 := v_1.Args[0]
35931 v_1_1 := v_1.Args[1]
35932 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
35933 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
35934 continue
35935 }
35936 d := auxIntToInt16(v_1_0.AuxInt)
35937 x := v_1_1
35938 v.reset(OpSub16)
35939 v0 := b.NewValue0(v.Pos, OpConst16, t)
35940 v0.AuxInt = int16ToAuxInt(c - d)
35941 v.AddArg2(v0, x)
35942 return true
35943 }
35944 break
35945 }
35946 return false
35947 }
35948 func rewriteValuegeneric_OpSub32(v *Value) bool {
35949 v_1 := v.Args[1]
35950 v_0 := v.Args[0]
35951 b := v.Block
35952
35953
35954 for {
35955 if v_0.Op != OpConst32 {
35956 break
35957 }
35958 c := auxIntToInt32(v_0.AuxInt)
35959 if v_1.Op != OpConst32 {
35960 break
35961 }
35962 d := auxIntToInt32(v_1.AuxInt)
35963 v.reset(OpConst32)
35964 v.AuxInt = int32ToAuxInt(c - d)
35965 return true
35966 }
35967
35968
35969
35970 for {
35971 x := v_0
35972 if v_1.Op != OpConst32 {
35973 break
35974 }
35975 t := v_1.Type
35976 c := auxIntToInt32(v_1.AuxInt)
35977 if !(x.Op != OpConst32) {
35978 break
35979 }
35980 v.reset(OpAdd32)
35981 v0 := b.NewValue0(v.Pos, OpConst32, t)
35982 v0.AuxInt = int32ToAuxInt(-c)
35983 v.AddArg2(v0, x)
35984 return true
35985 }
35986
35987
35988 for {
35989 t := v.Type
35990 if v_0.Op != OpMul32 {
35991 break
35992 }
35993 _ = v_0.Args[1]
35994 v_0_0 := v_0.Args[0]
35995 v_0_1 := v_0.Args[1]
35996 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
35997 x := v_0_0
35998 y := v_0_1
35999 if v_1.Op != OpMul32 {
36000 continue
36001 }
36002 _ = v_1.Args[1]
36003 v_1_0 := v_1.Args[0]
36004 v_1_1 := v_1.Args[1]
36005 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36006 if x != v_1_0 {
36007 continue
36008 }
36009 z := v_1_1
36010 v.reset(OpMul32)
36011 v0 := b.NewValue0(v.Pos, OpSub32, t)
36012 v0.AddArg2(y, z)
36013 v.AddArg2(x, v0)
36014 return true
36015 }
36016 }
36017 break
36018 }
36019
36020
36021 for {
36022 x := v_0
36023 if x != v_1 {
36024 break
36025 }
36026 v.reset(OpConst32)
36027 v.AuxInt = int32ToAuxInt(0)
36028 return true
36029 }
36030
36031
36032 for {
36033 if v_0.Op != OpNeg32 {
36034 break
36035 }
36036 x := v_0.Args[0]
36037 if v_1.Op != OpCom32 || x != v_1.Args[0] {
36038 break
36039 }
36040 v.reset(OpConst32)
36041 v.AuxInt = int32ToAuxInt(1)
36042 return true
36043 }
36044
36045
36046 for {
36047 if v_0.Op != OpCom32 {
36048 break
36049 }
36050 x := v_0.Args[0]
36051 if v_1.Op != OpNeg32 || x != v_1.Args[0] {
36052 break
36053 }
36054 v.reset(OpConst32)
36055 v.AuxInt = int32ToAuxInt(-1)
36056 return true
36057 }
36058
36059
36060 for {
36061 if v_0.Op != OpAdd32 {
36062 break
36063 }
36064 _ = v_0.Args[1]
36065 v_0_0 := v_0.Args[0]
36066 v_0_1 := v_0.Args[1]
36067 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
36068 t := v_0_0
36069 x := v_0_1
36070 if v_1.Op != OpAdd32 {
36071 continue
36072 }
36073 _ = v_1.Args[1]
36074 v_1_0 := v_1.Args[0]
36075 v_1_1 := v_1.Args[1]
36076 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36077 if t != v_1_0 {
36078 continue
36079 }
36080 y := v_1_1
36081 v.reset(OpSub32)
36082 v.AddArg2(x, y)
36083 return true
36084 }
36085 }
36086 break
36087 }
36088
36089
36090 for {
36091 if v_0.Op != OpAdd32 {
36092 break
36093 }
36094 _ = v_0.Args[1]
36095 v_0_0 := v_0.Args[0]
36096 v_0_1 := v_0.Args[1]
36097 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
36098 x := v_0_0
36099 y := v_0_1
36100 if x != v_1 {
36101 continue
36102 }
36103 v.copyOf(y)
36104 return true
36105 }
36106 break
36107 }
36108
36109
36110 for {
36111 if v_0.Op != OpAdd32 {
36112 break
36113 }
36114 _ = v_0.Args[1]
36115 v_0_0 := v_0.Args[0]
36116 v_0_1 := v_0.Args[1]
36117 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
36118 x := v_0_0
36119 y := v_0_1
36120 if y != v_1 {
36121 continue
36122 }
36123 v.copyOf(x)
36124 return true
36125 }
36126 break
36127 }
36128
36129
36130 for {
36131 if v_0.Op != OpSub32 {
36132 break
36133 }
36134 y := v_0.Args[1]
36135 x := v_0.Args[0]
36136 if x != v_1 {
36137 break
36138 }
36139 v.reset(OpNeg32)
36140 v.AddArg(y)
36141 return true
36142 }
36143
36144
36145 for {
36146 x := v_0
36147 if v_1.Op != OpAdd32 {
36148 break
36149 }
36150 _ = v_1.Args[1]
36151 v_1_0 := v_1.Args[0]
36152 v_1_1 := v_1.Args[1]
36153 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
36154 if x != v_1_0 {
36155 continue
36156 }
36157 y := v_1_1
36158 v.reset(OpNeg32)
36159 v.AddArg(y)
36160 return true
36161 }
36162 break
36163 }
36164
36165
36166
36167 for {
36168 x := v_0
36169 if v_1.Op != OpSub32 {
36170 break
36171 }
36172 z := v_1.Args[1]
36173 i := v_1.Args[0]
36174 if i.Op != OpConst32 {
36175 break
36176 }
36177 t := i.Type
36178 if !(z.Op != OpConst32 && x.Op != OpConst32) {
36179 break
36180 }
36181 v.reset(OpSub32)
36182 v0 := b.NewValue0(v.Pos, OpAdd32, t)
36183 v0.AddArg2(x, z)
36184 v.AddArg2(v0, i)
36185 return true
36186 }
36187
36188
36189
36190 for {
36191 x := v_0
36192 if v_1.Op != OpAdd32 {
36193 break
36194 }
36195 _ = v_1.Args[1]
36196 v_1_0 := v_1.Args[0]
36197 v_1_1 := v_1.Args[1]
36198 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
36199 z := v_1_0
36200 i := v_1_1
36201 if i.Op != OpConst32 {
36202 continue
36203 }
36204 t := i.Type
36205 if !(z.Op != OpConst32 && x.Op != OpConst32) {
36206 continue
36207 }
36208 v.reset(OpSub32)
36209 v0 := b.NewValue0(v.Pos, OpSub32, t)
36210 v0.AddArg2(x, z)
36211 v.AddArg2(v0, i)
36212 return true
36213 }
36214 break
36215 }
36216
36217
36218
36219 for {
36220 if v_0.Op != OpSub32 {
36221 break
36222 }
36223 z := v_0.Args[1]
36224 i := v_0.Args[0]
36225 if i.Op != OpConst32 {
36226 break
36227 }
36228 t := i.Type
36229 x := v_1
36230 if !(z.Op != OpConst32 && x.Op != OpConst32) {
36231 break
36232 }
36233 v.reset(OpSub32)
36234 v0 := b.NewValue0(v.Pos, OpAdd32, t)
36235 v0.AddArg2(z, x)
36236 v.AddArg2(i, v0)
36237 return true
36238 }
36239
36240
36241
36242 for {
36243 if v_0.Op != OpAdd32 {
36244 break
36245 }
36246 _ = v_0.Args[1]
36247 v_0_0 := v_0.Args[0]
36248 v_0_1 := v_0.Args[1]
36249 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
36250 z := v_0_0
36251 i := v_0_1
36252 if i.Op != OpConst32 {
36253 continue
36254 }
36255 t := i.Type
36256 x := v_1
36257 if !(z.Op != OpConst32 && x.Op != OpConst32) {
36258 continue
36259 }
36260 v.reset(OpAdd32)
36261 v0 := b.NewValue0(v.Pos, OpSub32, t)
36262 v0.AddArg2(z, x)
36263 v.AddArg2(i, v0)
36264 return true
36265 }
36266 break
36267 }
36268
36269
36270 for {
36271 if v_0.Op != OpConst32 {
36272 break
36273 }
36274 t := v_0.Type
36275 c := auxIntToInt32(v_0.AuxInt)
36276 if v_1.Op != OpSub32 {
36277 break
36278 }
36279 x := v_1.Args[1]
36280 v_1_0 := v_1.Args[0]
36281 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
36282 break
36283 }
36284 d := auxIntToInt32(v_1_0.AuxInt)
36285 v.reset(OpAdd32)
36286 v0 := b.NewValue0(v.Pos, OpConst32, t)
36287 v0.AuxInt = int32ToAuxInt(c - d)
36288 v.AddArg2(v0, x)
36289 return true
36290 }
36291
36292
36293 for {
36294 if v_0.Op != OpConst32 {
36295 break
36296 }
36297 t := v_0.Type
36298 c := auxIntToInt32(v_0.AuxInt)
36299 if v_1.Op != OpAdd32 {
36300 break
36301 }
36302 _ = v_1.Args[1]
36303 v_1_0 := v_1.Args[0]
36304 v_1_1 := v_1.Args[1]
36305 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
36306 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
36307 continue
36308 }
36309 d := auxIntToInt32(v_1_0.AuxInt)
36310 x := v_1_1
36311 v.reset(OpSub32)
36312 v0 := b.NewValue0(v.Pos, OpConst32, t)
36313 v0.AuxInt = int32ToAuxInt(c - d)
36314 v.AddArg2(v0, x)
36315 return true
36316 }
36317 break
36318 }
36319 return false
36320 }
36321 func rewriteValuegeneric_OpSub32F(v *Value) bool {
36322 v_1 := v.Args[1]
36323 v_0 := v.Args[0]
36324
36325
36326
36327 for {
36328 if v_0.Op != OpConst32F {
36329 break
36330 }
36331 c := auxIntToFloat32(v_0.AuxInt)
36332 if v_1.Op != OpConst32F {
36333 break
36334 }
36335 d := auxIntToFloat32(v_1.AuxInt)
36336 if !(c-d == c-d) {
36337 break
36338 }
36339 v.reset(OpConst32F)
36340 v.AuxInt = float32ToAuxInt(c - d)
36341 return true
36342 }
36343 return false
36344 }
36345 func rewriteValuegeneric_OpSub64(v *Value) bool {
36346 v_1 := v.Args[1]
36347 v_0 := v.Args[0]
36348 b := v.Block
36349
36350
36351 for {
36352 if v_0.Op != OpConst64 {
36353 break
36354 }
36355 c := auxIntToInt64(v_0.AuxInt)
36356 if v_1.Op != OpConst64 {
36357 break
36358 }
36359 d := auxIntToInt64(v_1.AuxInt)
36360 v.reset(OpConst64)
36361 v.AuxInt = int64ToAuxInt(c - d)
36362 return true
36363 }
36364
36365
36366
36367 for {
36368 x := v_0
36369 if v_1.Op != OpConst64 {
36370 break
36371 }
36372 t := v_1.Type
36373 c := auxIntToInt64(v_1.AuxInt)
36374 if !(x.Op != OpConst64) {
36375 break
36376 }
36377 v.reset(OpAdd64)
36378 v0 := b.NewValue0(v.Pos, OpConst64, t)
36379 v0.AuxInt = int64ToAuxInt(-c)
36380 v.AddArg2(v0, x)
36381 return true
36382 }
36383
36384
36385 for {
36386 t := v.Type
36387 if v_0.Op != OpMul64 {
36388 break
36389 }
36390 _ = v_0.Args[1]
36391 v_0_0 := v_0.Args[0]
36392 v_0_1 := v_0.Args[1]
36393 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
36394 x := v_0_0
36395 y := v_0_1
36396 if v_1.Op != OpMul64 {
36397 continue
36398 }
36399 _ = v_1.Args[1]
36400 v_1_0 := v_1.Args[0]
36401 v_1_1 := v_1.Args[1]
36402 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36403 if x != v_1_0 {
36404 continue
36405 }
36406 z := v_1_1
36407 v.reset(OpMul64)
36408 v0 := b.NewValue0(v.Pos, OpSub64, t)
36409 v0.AddArg2(y, z)
36410 v.AddArg2(x, v0)
36411 return true
36412 }
36413 }
36414 break
36415 }
36416
36417
36418 for {
36419 x := v_0
36420 if x != v_1 {
36421 break
36422 }
36423 v.reset(OpConst64)
36424 v.AuxInt = int64ToAuxInt(0)
36425 return true
36426 }
36427
36428
36429 for {
36430 if v_0.Op != OpNeg64 {
36431 break
36432 }
36433 x := v_0.Args[0]
36434 if v_1.Op != OpCom64 || x != v_1.Args[0] {
36435 break
36436 }
36437 v.reset(OpConst64)
36438 v.AuxInt = int64ToAuxInt(1)
36439 return true
36440 }
36441
36442
36443 for {
36444 if v_0.Op != OpCom64 {
36445 break
36446 }
36447 x := v_0.Args[0]
36448 if v_1.Op != OpNeg64 || x != v_1.Args[0] {
36449 break
36450 }
36451 v.reset(OpConst64)
36452 v.AuxInt = int64ToAuxInt(-1)
36453 return true
36454 }
36455
36456
36457 for {
36458 if v_0.Op != OpAdd64 {
36459 break
36460 }
36461 _ = v_0.Args[1]
36462 v_0_0 := v_0.Args[0]
36463 v_0_1 := v_0.Args[1]
36464 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
36465 t := v_0_0
36466 x := v_0_1
36467 if v_1.Op != OpAdd64 {
36468 continue
36469 }
36470 _ = v_1.Args[1]
36471 v_1_0 := v_1.Args[0]
36472 v_1_1 := v_1.Args[1]
36473 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36474 if t != v_1_0 {
36475 continue
36476 }
36477 y := v_1_1
36478 v.reset(OpSub64)
36479 v.AddArg2(x, y)
36480 return true
36481 }
36482 }
36483 break
36484 }
36485
36486
36487 for {
36488 if v_0.Op != OpAdd64 {
36489 break
36490 }
36491 _ = v_0.Args[1]
36492 v_0_0 := v_0.Args[0]
36493 v_0_1 := v_0.Args[1]
36494 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
36495 x := v_0_0
36496 y := v_0_1
36497 if x != v_1 {
36498 continue
36499 }
36500 v.copyOf(y)
36501 return true
36502 }
36503 break
36504 }
36505
36506
36507 for {
36508 if v_0.Op != OpAdd64 {
36509 break
36510 }
36511 _ = v_0.Args[1]
36512 v_0_0 := v_0.Args[0]
36513 v_0_1 := v_0.Args[1]
36514 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
36515 x := v_0_0
36516 y := v_0_1
36517 if y != v_1 {
36518 continue
36519 }
36520 v.copyOf(x)
36521 return true
36522 }
36523 break
36524 }
36525
36526
36527 for {
36528 if v_0.Op != OpSub64 {
36529 break
36530 }
36531 y := v_0.Args[1]
36532 x := v_0.Args[0]
36533 if x != v_1 {
36534 break
36535 }
36536 v.reset(OpNeg64)
36537 v.AddArg(y)
36538 return true
36539 }
36540
36541
36542 for {
36543 x := v_0
36544 if v_1.Op != OpAdd64 {
36545 break
36546 }
36547 _ = v_1.Args[1]
36548 v_1_0 := v_1.Args[0]
36549 v_1_1 := v_1.Args[1]
36550 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
36551 if x != v_1_0 {
36552 continue
36553 }
36554 y := v_1_1
36555 v.reset(OpNeg64)
36556 v.AddArg(y)
36557 return true
36558 }
36559 break
36560 }
36561
36562
36563
36564 for {
36565 x := v_0
36566 if v_1.Op != OpSub64 {
36567 break
36568 }
36569 z := v_1.Args[1]
36570 i := v_1.Args[0]
36571 if i.Op != OpConst64 {
36572 break
36573 }
36574 t := i.Type
36575 if !(z.Op != OpConst64 && x.Op != OpConst64) {
36576 break
36577 }
36578 v.reset(OpSub64)
36579 v0 := b.NewValue0(v.Pos, OpAdd64, t)
36580 v0.AddArg2(x, z)
36581 v.AddArg2(v0, i)
36582 return true
36583 }
36584
36585
36586
36587 for {
36588 x := v_0
36589 if v_1.Op != OpAdd64 {
36590 break
36591 }
36592 _ = v_1.Args[1]
36593 v_1_0 := v_1.Args[0]
36594 v_1_1 := v_1.Args[1]
36595 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
36596 z := v_1_0
36597 i := v_1_1
36598 if i.Op != OpConst64 {
36599 continue
36600 }
36601 t := i.Type
36602 if !(z.Op != OpConst64 && x.Op != OpConst64) {
36603 continue
36604 }
36605 v.reset(OpSub64)
36606 v0 := b.NewValue0(v.Pos, OpSub64, t)
36607 v0.AddArg2(x, z)
36608 v.AddArg2(v0, i)
36609 return true
36610 }
36611 break
36612 }
36613
36614
36615
36616 for {
36617 if v_0.Op != OpSub64 {
36618 break
36619 }
36620 z := v_0.Args[1]
36621 i := v_0.Args[0]
36622 if i.Op != OpConst64 {
36623 break
36624 }
36625 t := i.Type
36626 x := v_1
36627 if !(z.Op != OpConst64 && x.Op != OpConst64) {
36628 break
36629 }
36630 v.reset(OpSub64)
36631 v0 := b.NewValue0(v.Pos, OpAdd64, t)
36632 v0.AddArg2(z, x)
36633 v.AddArg2(i, v0)
36634 return true
36635 }
36636
36637
36638
36639 for {
36640 if v_0.Op != OpAdd64 {
36641 break
36642 }
36643 _ = v_0.Args[1]
36644 v_0_0 := v_0.Args[0]
36645 v_0_1 := v_0.Args[1]
36646 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
36647 z := v_0_0
36648 i := v_0_1
36649 if i.Op != OpConst64 {
36650 continue
36651 }
36652 t := i.Type
36653 x := v_1
36654 if !(z.Op != OpConst64 && x.Op != OpConst64) {
36655 continue
36656 }
36657 v.reset(OpAdd64)
36658 v0 := b.NewValue0(v.Pos, OpSub64, t)
36659 v0.AddArg2(z, x)
36660 v.AddArg2(i, v0)
36661 return true
36662 }
36663 break
36664 }
36665
36666
36667 for {
36668 if v_0.Op != OpConst64 {
36669 break
36670 }
36671 t := v_0.Type
36672 c := auxIntToInt64(v_0.AuxInt)
36673 if v_1.Op != OpSub64 {
36674 break
36675 }
36676 x := v_1.Args[1]
36677 v_1_0 := v_1.Args[0]
36678 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
36679 break
36680 }
36681 d := auxIntToInt64(v_1_0.AuxInt)
36682 v.reset(OpAdd64)
36683 v0 := b.NewValue0(v.Pos, OpConst64, t)
36684 v0.AuxInt = int64ToAuxInt(c - d)
36685 v.AddArg2(v0, x)
36686 return true
36687 }
36688
36689
36690 for {
36691 if v_0.Op != OpConst64 {
36692 break
36693 }
36694 t := v_0.Type
36695 c := auxIntToInt64(v_0.AuxInt)
36696 if v_1.Op != OpAdd64 {
36697 break
36698 }
36699 _ = v_1.Args[1]
36700 v_1_0 := v_1.Args[0]
36701 v_1_1 := v_1.Args[1]
36702 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
36703 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
36704 continue
36705 }
36706 d := auxIntToInt64(v_1_0.AuxInt)
36707 x := v_1_1
36708 v.reset(OpSub64)
36709 v0 := b.NewValue0(v.Pos, OpConst64, t)
36710 v0.AuxInt = int64ToAuxInt(c - d)
36711 v.AddArg2(v0, x)
36712 return true
36713 }
36714 break
36715 }
36716 return false
36717 }
36718 func rewriteValuegeneric_OpSub64F(v *Value) bool {
36719 v_1 := v.Args[1]
36720 v_0 := v.Args[0]
36721
36722
36723
36724 for {
36725 if v_0.Op != OpConst64F {
36726 break
36727 }
36728 c := auxIntToFloat64(v_0.AuxInt)
36729 if v_1.Op != OpConst64F {
36730 break
36731 }
36732 d := auxIntToFloat64(v_1.AuxInt)
36733 if !(c-d == c-d) {
36734 break
36735 }
36736 v.reset(OpConst64F)
36737 v.AuxInt = float64ToAuxInt(c - d)
36738 return true
36739 }
36740 return false
36741 }
36742 func rewriteValuegeneric_OpSub8(v *Value) bool {
36743 v_1 := v.Args[1]
36744 v_0 := v.Args[0]
36745 b := v.Block
36746
36747
36748 for {
36749 if v_0.Op != OpConst8 {
36750 break
36751 }
36752 c := auxIntToInt8(v_0.AuxInt)
36753 if v_1.Op != OpConst8 {
36754 break
36755 }
36756 d := auxIntToInt8(v_1.AuxInt)
36757 v.reset(OpConst8)
36758 v.AuxInt = int8ToAuxInt(c - d)
36759 return true
36760 }
36761
36762
36763
36764 for {
36765 x := v_0
36766 if v_1.Op != OpConst8 {
36767 break
36768 }
36769 t := v_1.Type
36770 c := auxIntToInt8(v_1.AuxInt)
36771 if !(x.Op != OpConst8) {
36772 break
36773 }
36774 v.reset(OpAdd8)
36775 v0 := b.NewValue0(v.Pos, OpConst8, t)
36776 v0.AuxInt = int8ToAuxInt(-c)
36777 v.AddArg2(v0, x)
36778 return true
36779 }
36780
36781
36782 for {
36783 t := v.Type
36784 if v_0.Op != OpMul8 {
36785 break
36786 }
36787 _ = v_0.Args[1]
36788 v_0_0 := v_0.Args[0]
36789 v_0_1 := v_0.Args[1]
36790 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
36791 x := v_0_0
36792 y := v_0_1
36793 if v_1.Op != OpMul8 {
36794 continue
36795 }
36796 _ = v_1.Args[1]
36797 v_1_0 := v_1.Args[0]
36798 v_1_1 := v_1.Args[1]
36799 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36800 if x != v_1_0 {
36801 continue
36802 }
36803 z := v_1_1
36804 v.reset(OpMul8)
36805 v0 := b.NewValue0(v.Pos, OpSub8, t)
36806 v0.AddArg2(y, z)
36807 v.AddArg2(x, v0)
36808 return true
36809 }
36810 }
36811 break
36812 }
36813
36814
36815 for {
36816 x := v_0
36817 if x != v_1 {
36818 break
36819 }
36820 v.reset(OpConst8)
36821 v.AuxInt = int8ToAuxInt(0)
36822 return true
36823 }
36824
36825
36826 for {
36827 if v_0.Op != OpNeg8 {
36828 break
36829 }
36830 x := v_0.Args[0]
36831 if v_1.Op != OpCom8 || x != v_1.Args[0] {
36832 break
36833 }
36834 v.reset(OpConst8)
36835 v.AuxInt = int8ToAuxInt(1)
36836 return true
36837 }
36838
36839
36840 for {
36841 if v_0.Op != OpCom8 {
36842 break
36843 }
36844 x := v_0.Args[0]
36845 if v_1.Op != OpNeg8 || x != v_1.Args[0] {
36846 break
36847 }
36848 v.reset(OpConst8)
36849 v.AuxInt = int8ToAuxInt(-1)
36850 return true
36851 }
36852
36853
36854 for {
36855 if v_0.Op != OpAdd8 {
36856 break
36857 }
36858 _ = v_0.Args[1]
36859 v_0_0 := v_0.Args[0]
36860 v_0_1 := v_0.Args[1]
36861 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
36862 t := v_0_0
36863 x := v_0_1
36864 if v_1.Op != OpAdd8 {
36865 continue
36866 }
36867 _ = v_1.Args[1]
36868 v_1_0 := v_1.Args[0]
36869 v_1_1 := v_1.Args[1]
36870 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36871 if t != v_1_0 {
36872 continue
36873 }
36874 y := v_1_1
36875 v.reset(OpSub8)
36876 v.AddArg2(x, y)
36877 return true
36878 }
36879 }
36880 break
36881 }
36882
36883
36884 for {
36885 if v_0.Op != OpAdd8 {
36886 break
36887 }
36888 _ = v_0.Args[1]
36889 v_0_0 := v_0.Args[0]
36890 v_0_1 := v_0.Args[1]
36891 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
36892 x := v_0_0
36893 y := v_0_1
36894 if x != v_1 {
36895 continue
36896 }
36897 v.copyOf(y)
36898 return true
36899 }
36900 break
36901 }
36902
36903
36904 for {
36905 if v_0.Op != OpAdd8 {
36906 break
36907 }
36908 _ = v_0.Args[1]
36909 v_0_0 := v_0.Args[0]
36910 v_0_1 := v_0.Args[1]
36911 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
36912 x := v_0_0
36913 y := v_0_1
36914 if y != v_1 {
36915 continue
36916 }
36917 v.copyOf(x)
36918 return true
36919 }
36920 break
36921 }
36922
36923
36924 for {
36925 if v_0.Op != OpSub8 {
36926 break
36927 }
36928 y := v_0.Args[1]
36929 x := v_0.Args[0]
36930 if x != v_1 {
36931 break
36932 }
36933 v.reset(OpNeg8)
36934 v.AddArg(y)
36935 return true
36936 }
36937
36938
36939 for {
36940 x := v_0
36941 if v_1.Op != OpAdd8 {
36942 break
36943 }
36944 _ = v_1.Args[1]
36945 v_1_0 := v_1.Args[0]
36946 v_1_1 := v_1.Args[1]
36947 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
36948 if x != v_1_0 {
36949 continue
36950 }
36951 y := v_1_1
36952 v.reset(OpNeg8)
36953 v.AddArg(y)
36954 return true
36955 }
36956 break
36957 }
36958
36959
36960
36961 for {
36962 x := v_0
36963 if v_1.Op != OpSub8 {
36964 break
36965 }
36966 z := v_1.Args[1]
36967 i := v_1.Args[0]
36968 if i.Op != OpConst8 {
36969 break
36970 }
36971 t := i.Type
36972 if !(z.Op != OpConst8 && x.Op != OpConst8) {
36973 break
36974 }
36975 v.reset(OpSub8)
36976 v0 := b.NewValue0(v.Pos, OpAdd8, t)
36977 v0.AddArg2(x, z)
36978 v.AddArg2(v0, i)
36979 return true
36980 }
36981
36982
36983
36984 for {
36985 x := v_0
36986 if v_1.Op != OpAdd8 {
36987 break
36988 }
36989 _ = v_1.Args[1]
36990 v_1_0 := v_1.Args[0]
36991 v_1_1 := v_1.Args[1]
36992 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
36993 z := v_1_0
36994 i := v_1_1
36995 if i.Op != OpConst8 {
36996 continue
36997 }
36998 t := i.Type
36999 if !(z.Op != OpConst8 && x.Op != OpConst8) {
37000 continue
37001 }
37002 v.reset(OpSub8)
37003 v0 := b.NewValue0(v.Pos, OpSub8, t)
37004 v0.AddArg2(x, z)
37005 v.AddArg2(v0, i)
37006 return true
37007 }
37008 break
37009 }
37010
37011
37012
37013 for {
37014 if v_0.Op != OpSub8 {
37015 break
37016 }
37017 z := v_0.Args[1]
37018 i := v_0.Args[0]
37019 if i.Op != OpConst8 {
37020 break
37021 }
37022 t := i.Type
37023 x := v_1
37024 if !(z.Op != OpConst8 && x.Op != OpConst8) {
37025 break
37026 }
37027 v.reset(OpSub8)
37028 v0 := b.NewValue0(v.Pos, OpAdd8, t)
37029 v0.AddArg2(z, x)
37030 v.AddArg2(i, v0)
37031 return true
37032 }
37033
37034
37035
37036 for {
37037 if v_0.Op != OpAdd8 {
37038 break
37039 }
37040 _ = v_0.Args[1]
37041 v_0_0 := v_0.Args[0]
37042 v_0_1 := v_0.Args[1]
37043 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
37044 z := v_0_0
37045 i := v_0_1
37046 if i.Op != OpConst8 {
37047 continue
37048 }
37049 t := i.Type
37050 x := v_1
37051 if !(z.Op != OpConst8 && x.Op != OpConst8) {
37052 continue
37053 }
37054 v.reset(OpAdd8)
37055 v0 := b.NewValue0(v.Pos, OpSub8, t)
37056 v0.AddArg2(z, x)
37057 v.AddArg2(i, v0)
37058 return true
37059 }
37060 break
37061 }
37062
37063
37064 for {
37065 if v_0.Op != OpConst8 {
37066 break
37067 }
37068 t := v_0.Type
37069 c := auxIntToInt8(v_0.AuxInt)
37070 if v_1.Op != OpSub8 {
37071 break
37072 }
37073 x := v_1.Args[1]
37074 v_1_0 := v_1.Args[0]
37075 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
37076 break
37077 }
37078 d := auxIntToInt8(v_1_0.AuxInt)
37079 v.reset(OpAdd8)
37080 v0 := b.NewValue0(v.Pos, OpConst8, t)
37081 v0.AuxInt = int8ToAuxInt(c - d)
37082 v.AddArg2(v0, x)
37083 return true
37084 }
37085
37086
37087 for {
37088 if v_0.Op != OpConst8 {
37089 break
37090 }
37091 t := v_0.Type
37092 c := auxIntToInt8(v_0.AuxInt)
37093 if v_1.Op != OpAdd8 {
37094 break
37095 }
37096 _ = v_1.Args[1]
37097 v_1_0 := v_1.Args[0]
37098 v_1_1 := v_1.Args[1]
37099 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
37100 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
37101 continue
37102 }
37103 d := auxIntToInt8(v_1_0.AuxInt)
37104 x := v_1_1
37105 v.reset(OpSub8)
37106 v0 := b.NewValue0(v.Pos, OpConst8, t)
37107 v0.AuxInt = int8ToAuxInt(c - d)
37108 v.AddArg2(v0, x)
37109 return true
37110 }
37111 break
37112 }
37113 return false
37114 }
37115 func rewriteValuegeneric_OpTrunc(v *Value) bool {
37116 v_0 := v.Args[0]
37117
37118
37119 for {
37120 if v_0.Op != OpConst64F {
37121 break
37122 }
37123 c := auxIntToFloat64(v_0.AuxInt)
37124 v.reset(OpConst64F)
37125 v.AuxInt = float64ToAuxInt(math.Trunc(c))
37126 return true
37127 }
37128 return false
37129 }
37130 func rewriteValuegeneric_OpTrunc16to8(v *Value) bool {
37131 v_0 := v.Args[0]
37132
37133
37134 for {
37135 if v_0.Op != OpConst16 {
37136 break
37137 }
37138 c := auxIntToInt16(v_0.AuxInt)
37139 v.reset(OpConst8)
37140 v.AuxInt = int8ToAuxInt(int8(c))
37141 return true
37142 }
37143
37144
37145 for {
37146 if v_0.Op != OpZeroExt8to16 {
37147 break
37148 }
37149 x := v_0.Args[0]
37150 v.copyOf(x)
37151 return true
37152 }
37153
37154
37155 for {
37156 if v_0.Op != OpSignExt8to16 {
37157 break
37158 }
37159 x := v_0.Args[0]
37160 v.copyOf(x)
37161 return true
37162 }
37163
37164
37165
37166 for {
37167 if v_0.Op != OpAnd16 {
37168 break
37169 }
37170 _ = v_0.Args[1]
37171 v_0_0 := v_0.Args[0]
37172 v_0_1 := v_0.Args[1]
37173 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
37174 if v_0_0.Op != OpConst16 {
37175 continue
37176 }
37177 y := auxIntToInt16(v_0_0.AuxInt)
37178 x := v_0_1
37179 if !(y&0xFF == 0xFF) {
37180 continue
37181 }
37182 v.reset(OpTrunc16to8)
37183 v.AddArg(x)
37184 return true
37185 }
37186 break
37187 }
37188 return false
37189 }
37190 func rewriteValuegeneric_OpTrunc32to16(v *Value) bool {
37191 v_0 := v.Args[0]
37192
37193
37194 for {
37195 if v_0.Op != OpConst32 {
37196 break
37197 }
37198 c := auxIntToInt32(v_0.AuxInt)
37199 v.reset(OpConst16)
37200 v.AuxInt = int16ToAuxInt(int16(c))
37201 return true
37202 }
37203
37204
37205 for {
37206 if v_0.Op != OpZeroExt8to32 {
37207 break
37208 }
37209 x := v_0.Args[0]
37210 v.reset(OpZeroExt8to16)
37211 v.AddArg(x)
37212 return true
37213 }
37214
37215
37216 for {
37217 if v_0.Op != OpZeroExt16to32 {
37218 break
37219 }
37220 x := v_0.Args[0]
37221 v.copyOf(x)
37222 return true
37223 }
37224
37225
37226 for {
37227 if v_0.Op != OpSignExt8to32 {
37228 break
37229 }
37230 x := v_0.Args[0]
37231 v.reset(OpSignExt8to16)
37232 v.AddArg(x)
37233 return true
37234 }
37235
37236
37237 for {
37238 if v_0.Op != OpSignExt16to32 {
37239 break
37240 }
37241 x := v_0.Args[0]
37242 v.copyOf(x)
37243 return true
37244 }
37245
37246
37247
37248 for {
37249 if v_0.Op != OpAnd32 {
37250 break
37251 }
37252 _ = v_0.Args[1]
37253 v_0_0 := v_0.Args[0]
37254 v_0_1 := v_0.Args[1]
37255 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
37256 if v_0_0.Op != OpConst32 {
37257 continue
37258 }
37259 y := auxIntToInt32(v_0_0.AuxInt)
37260 x := v_0_1
37261 if !(y&0xFFFF == 0xFFFF) {
37262 continue
37263 }
37264 v.reset(OpTrunc32to16)
37265 v.AddArg(x)
37266 return true
37267 }
37268 break
37269 }
37270 return false
37271 }
37272 func rewriteValuegeneric_OpTrunc32to8(v *Value) bool {
37273 v_0 := v.Args[0]
37274
37275
37276 for {
37277 if v_0.Op != OpConst32 {
37278 break
37279 }
37280 c := auxIntToInt32(v_0.AuxInt)
37281 v.reset(OpConst8)
37282 v.AuxInt = int8ToAuxInt(int8(c))
37283 return true
37284 }
37285
37286
37287 for {
37288 if v_0.Op != OpZeroExt8to32 {
37289 break
37290 }
37291 x := v_0.Args[0]
37292 v.copyOf(x)
37293 return true
37294 }
37295
37296
37297 for {
37298 if v_0.Op != OpSignExt8to32 {
37299 break
37300 }
37301 x := v_0.Args[0]
37302 v.copyOf(x)
37303 return true
37304 }
37305
37306
37307
37308 for {
37309 if v_0.Op != OpAnd32 {
37310 break
37311 }
37312 _ = v_0.Args[1]
37313 v_0_0 := v_0.Args[0]
37314 v_0_1 := v_0.Args[1]
37315 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
37316 if v_0_0.Op != OpConst32 {
37317 continue
37318 }
37319 y := auxIntToInt32(v_0_0.AuxInt)
37320 x := v_0_1
37321 if !(y&0xFF == 0xFF) {
37322 continue
37323 }
37324 v.reset(OpTrunc32to8)
37325 v.AddArg(x)
37326 return true
37327 }
37328 break
37329 }
37330 return false
37331 }
37332 func rewriteValuegeneric_OpTrunc64to16(v *Value) bool {
37333 v_0 := v.Args[0]
37334
37335
37336 for {
37337 if v_0.Op != OpConst64 {
37338 break
37339 }
37340 c := auxIntToInt64(v_0.AuxInt)
37341 v.reset(OpConst16)
37342 v.AuxInt = int16ToAuxInt(int16(c))
37343 return true
37344 }
37345
37346
37347 for {
37348 if v_0.Op != OpZeroExt8to64 {
37349 break
37350 }
37351 x := v_0.Args[0]
37352 v.reset(OpZeroExt8to16)
37353 v.AddArg(x)
37354 return true
37355 }
37356
37357
37358 for {
37359 if v_0.Op != OpZeroExt16to64 {
37360 break
37361 }
37362 x := v_0.Args[0]
37363 v.copyOf(x)
37364 return true
37365 }
37366
37367
37368 for {
37369 if v_0.Op != OpSignExt8to64 {
37370 break
37371 }
37372 x := v_0.Args[0]
37373 v.reset(OpSignExt8to16)
37374 v.AddArg(x)
37375 return true
37376 }
37377
37378
37379 for {
37380 if v_0.Op != OpSignExt16to64 {
37381 break
37382 }
37383 x := v_0.Args[0]
37384 v.copyOf(x)
37385 return true
37386 }
37387
37388
37389
37390 for {
37391 if v_0.Op != OpAnd64 {
37392 break
37393 }
37394 _ = v_0.Args[1]
37395 v_0_0 := v_0.Args[0]
37396 v_0_1 := v_0.Args[1]
37397 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
37398 if v_0_0.Op != OpConst64 {
37399 continue
37400 }
37401 y := auxIntToInt64(v_0_0.AuxInt)
37402 x := v_0_1
37403 if !(y&0xFFFF == 0xFFFF) {
37404 continue
37405 }
37406 v.reset(OpTrunc64to16)
37407 v.AddArg(x)
37408 return true
37409 }
37410 break
37411 }
37412 return false
37413 }
37414 func rewriteValuegeneric_OpTrunc64to32(v *Value) bool {
37415 v_0 := v.Args[0]
37416
37417
37418 for {
37419 if v_0.Op != OpConst64 {
37420 break
37421 }
37422 c := auxIntToInt64(v_0.AuxInt)
37423 v.reset(OpConst32)
37424 v.AuxInt = int32ToAuxInt(int32(c))
37425 return true
37426 }
37427
37428
37429 for {
37430 if v_0.Op != OpZeroExt8to64 {
37431 break
37432 }
37433 x := v_0.Args[0]
37434 v.reset(OpZeroExt8to32)
37435 v.AddArg(x)
37436 return true
37437 }
37438
37439
37440 for {
37441 if v_0.Op != OpZeroExt16to64 {
37442 break
37443 }
37444 x := v_0.Args[0]
37445 v.reset(OpZeroExt16to32)
37446 v.AddArg(x)
37447 return true
37448 }
37449
37450
37451 for {
37452 if v_0.Op != OpZeroExt32to64 {
37453 break
37454 }
37455 x := v_0.Args[0]
37456 v.copyOf(x)
37457 return true
37458 }
37459
37460
37461 for {
37462 if v_0.Op != OpSignExt8to64 {
37463 break
37464 }
37465 x := v_0.Args[0]
37466 v.reset(OpSignExt8to32)
37467 v.AddArg(x)
37468 return true
37469 }
37470
37471
37472 for {
37473 if v_0.Op != OpSignExt16to64 {
37474 break
37475 }
37476 x := v_0.Args[0]
37477 v.reset(OpSignExt16to32)
37478 v.AddArg(x)
37479 return true
37480 }
37481
37482
37483 for {
37484 if v_0.Op != OpSignExt32to64 {
37485 break
37486 }
37487 x := v_0.Args[0]
37488 v.copyOf(x)
37489 return true
37490 }
37491
37492
37493
37494 for {
37495 if v_0.Op != OpAnd64 {
37496 break
37497 }
37498 _ = v_0.Args[1]
37499 v_0_0 := v_0.Args[0]
37500 v_0_1 := v_0.Args[1]
37501 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
37502 if v_0_0.Op != OpConst64 {
37503 continue
37504 }
37505 y := auxIntToInt64(v_0_0.AuxInt)
37506 x := v_0_1
37507 if !(y&0xFFFFFFFF == 0xFFFFFFFF) {
37508 continue
37509 }
37510 v.reset(OpTrunc64to32)
37511 v.AddArg(x)
37512 return true
37513 }
37514 break
37515 }
37516 return false
37517 }
37518 func rewriteValuegeneric_OpTrunc64to8(v *Value) bool {
37519 v_0 := v.Args[0]
37520
37521
37522 for {
37523 if v_0.Op != OpConst64 {
37524 break
37525 }
37526 c := auxIntToInt64(v_0.AuxInt)
37527 v.reset(OpConst8)
37528 v.AuxInt = int8ToAuxInt(int8(c))
37529 return true
37530 }
37531
37532
37533 for {
37534 if v_0.Op != OpZeroExt8to64 {
37535 break
37536 }
37537 x := v_0.Args[0]
37538 v.copyOf(x)
37539 return true
37540 }
37541
37542
37543 for {
37544 if v_0.Op != OpSignExt8to64 {
37545 break
37546 }
37547 x := v_0.Args[0]
37548 v.copyOf(x)
37549 return true
37550 }
37551
37552
37553
37554 for {
37555 if v_0.Op != OpAnd64 {
37556 break
37557 }
37558 _ = v_0.Args[1]
37559 v_0_0 := v_0.Args[0]
37560 v_0_1 := v_0.Args[1]
37561 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
37562 if v_0_0.Op != OpConst64 {
37563 continue
37564 }
37565 y := auxIntToInt64(v_0_0.AuxInt)
37566 x := v_0_1
37567 if !(y&0xFF == 0xFF) {
37568 continue
37569 }
37570 v.reset(OpTrunc64to8)
37571 v.AddArg(x)
37572 return true
37573 }
37574 break
37575 }
37576 return false
37577 }
37578 func rewriteValuegeneric_OpXor16(v *Value) bool {
37579 v_1 := v.Args[1]
37580 v_0 := v.Args[0]
37581 b := v.Block
37582 config := b.Func.Config
37583
37584
37585 for {
37586 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37587 if v_0.Op != OpConst16 {
37588 continue
37589 }
37590 c := auxIntToInt16(v_0.AuxInt)
37591 if v_1.Op != OpConst16 {
37592 continue
37593 }
37594 d := auxIntToInt16(v_1.AuxInt)
37595 v.reset(OpConst16)
37596 v.AuxInt = int16ToAuxInt(c ^ d)
37597 return true
37598 }
37599 break
37600 }
37601
37602
37603 for {
37604 x := v_0
37605 if x != v_1 {
37606 break
37607 }
37608 v.reset(OpConst16)
37609 v.AuxInt = int16ToAuxInt(0)
37610 return true
37611 }
37612
37613
37614 for {
37615 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37616 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
37617 continue
37618 }
37619 x := v_1
37620 v.copyOf(x)
37621 return true
37622 }
37623 break
37624 }
37625
37626
37627 for {
37628 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37629 if v_0.Op != OpCom16 {
37630 continue
37631 }
37632 x := v_0.Args[0]
37633 if x != v_1 {
37634 continue
37635 }
37636 v.reset(OpConst16)
37637 v.AuxInt = int16ToAuxInt(-1)
37638 return true
37639 }
37640 break
37641 }
37642
37643
37644 for {
37645 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37646 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
37647 continue
37648 }
37649 x := v_1
37650 v.reset(OpCom16)
37651 v.AddArg(x)
37652 return true
37653 }
37654 break
37655 }
37656
37657
37658 for {
37659 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37660 x := v_0
37661 if v_1.Op != OpXor16 {
37662 continue
37663 }
37664 _ = v_1.Args[1]
37665 v_1_0 := v_1.Args[0]
37666 v_1_1 := v_1.Args[1]
37667 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
37668 if x != v_1_0 {
37669 continue
37670 }
37671 y := v_1_1
37672 v.copyOf(y)
37673 return true
37674 }
37675 }
37676 break
37677 }
37678
37679
37680
37681 for {
37682 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37683 if v_0.Op != OpXor16 {
37684 continue
37685 }
37686 _ = v_0.Args[1]
37687 v_0_0 := v_0.Args[0]
37688 v_0_1 := v_0.Args[1]
37689 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
37690 i := v_0_0
37691 if i.Op != OpConst16 {
37692 continue
37693 }
37694 t := i.Type
37695 z := v_0_1
37696 x := v_1
37697 if !(z.Op != OpConst16 && x.Op != OpConst16) {
37698 continue
37699 }
37700 v.reset(OpXor16)
37701 v0 := b.NewValue0(v.Pos, OpXor16, t)
37702 v0.AddArg2(z, x)
37703 v.AddArg2(i, v0)
37704 return true
37705 }
37706 }
37707 break
37708 }
37709
37710
37711 for {
37712 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37713 if v_0.Op != OpConst16 {
37714 continue
37715 }
37716 t := v_0.Type
37717 c := auxIntToInt16(v_0.AuxInt)
37718 if v_1.Op != OpXor16 {
37719 continue
37720 }
37721 _ = v_1.Args[1]
37722 v_1_0 := v_1.Args[0]
37723 v_1_1 := v_1.Args[1]
37724 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
37725 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
37726 continue
37727 }
37728 d := auxIntToInt16(v_1_0.AuxInt)
37729 x := v_1_1
37730 v.reset(OpXor16)
37731 v0 := b.NewValue0(v.Pos, OpConst16, t)
37732 v0.AuxInt = int16ToAuxInt(c ^ d)
37733 v.AddArg2(v0, x)
37734 return true
37735 }
37736 }
37737 break
37738 }
37739
37740
37741
37742 for {
37743 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37744 if v_0.Op != OpLsh16x64 {
37745 continue
37746 }
37747 _ = v_0.Args[1]
37748 x := v_0.Args[0]
37749 z := v_0.Args[1]
37750 if z.Op != OpConst64 {
37751 continue
37752 }
37753 c := auxIntToInt64(z.AuxInt)
37754 if v_1.Op != OpRsh16Ux64 {
37755 continue
37756 }
37757 _ = v_1.Args[1]
37758 if x != v_1.Args[0] {
37759 continue
37760 }
37761 v_1_1 := v_1.Args[1]
37762 if v_1_1.Op != OpConst64 {
37763 continue
37764 }
37765 d := auxIntToInt64(v_1_1.AuxInt)
37766 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
37767 continue
37768 }
37769 v.reset(OpRotateLeft16)
37770 v.AddArg2(x, z)
37771 return true
37772 }
37773 break
37774 }
37775
37776
37777
37778 for {
37779 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37780 left := v_0
37781 if left.Op != OpLsh16x64 {
37782 continue
37783 }
37784 y := left.Args[1]
37785 x := left.Args[0]
37786 right := v_1
37787 if right.Op != OpRsh16Ux64 {
37788 continue
37789 }
37790 _ = right.Args[1]
37791 if x != right.Args[0] {
37792 continue
37793 }
37794 right_1 := right.Args[1]
37795 if right_1.Op != OpSub64 {
37796 continue
37797 }
37798 _ = right_1.Args[1]
37799 right_1_0 := right_1.Args[0]
37800 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
37801 continue
37802 }
37803 v.reset(OpRotateLeft16)
37804 v.AddArg2(x, y)
37805 return true
37806 }
37807 break
37808 }
37809
37810
37811
37812 for {
37813 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37814 left := v_0
37815 if left.Op != OpLsh16x32 {
37816 continue
37817 }
37818 y := left.Args[1]
37819 x := left.Args[0]
37820 right := v_1
37821 if right.Op != OpRsh16Ux32 {
37822 continue
37823 }
37824 _ = right.Args[1]
37825 if x != right.Args[0] {
37826 continue
37827 }
37828 right_1 := right.Args[1]
37829 if right_1.Op != OpSub32 {
37830 continue
37831 }
37832 _ = right_1.Args[1]
37833 right_1_0 := right_1.Args[0]
37834 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
37835 continue
37836 }
37837 v.reset(OpRotateLeft16)
37838 v.AddArg2(x, y)
37839 return true
37840 }
37841 break
37842 }
37843
37844
37845
37846 for {
37847 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37848 left := v_0
37849 if left.Op != OpLsh16x16 {
37850 continue
37851 }
37852 y := left.Args[1]
37853 x := left.Args[0]
37854 right := v_1
37855 if right.Op != OpRsh16Ux16 {
37856 continue
37857 }
37858 _ = right.Args[1]
37859 if x != right.Args[0] {
37860 continue
37861 }
37862 right_1 := right.Args[1]
37863 if right_1.Op != OpSub16 {
37864 continue
37865 }
37866 _ = right_1.Args[1]
37867 right_1_0 := right_1.Args[0]
37868 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
37869 continue
37870 }
37871 v.reset(OpRotateLeft16)
37872 v.AddArg2(x, y)
37873 return true
37874 }
37875 break
37876 }
37877
37878
37879
37880 for {
37881 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37882 left := v_0
37883 if left.Op != OpLsh16x8 {
37884 continue
37885 }
37886 y := left.Args[1]
37887 x := left.Args[0]
37888 right := v_1
37889 if right.Op != OpRsh16Ux8 {
37890 continue
37891 }
37892 _ = right.Args[1]
37893 if x != right.Args[0] {
37894 continue
37895 }
37896 right_1 := right.Args[1]
37897 if right_1.Op != OpSub8 {
37898 continue
37899 }
37900 _ = right_1.Args[1]
37901 right_1_0 := right_1.Args[0]
37902 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
37903 continue
37904 }
37905 v.reset(OpRotateLeft16)
37906 v.AddArg2(x, y)
37907 return true
37908 }
37909 break
37910 }
37911
37912
37913
37914 for {
37915 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37916 right := v_0
37917 if right.Op != OpRsh16Ux64 {
37918 continue
37919 }
37920 y := right.Args[1]
37921 x := right.Args[0]
37922 left := v_1
37923 if left.Op != OpLsh16x64 {
37924 continue
37925 }
37926 _ = left.Args[1]
37927 if x != left.Args[0] {
37928 continue
37929 }
37930 z := left.Args[1]
37931 if z.Op != OpSub64 {
37932 continue
37933 }
37934 _ = z.Args[1]
37935 z_0 := z.Args[0]
37936 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
37937 continue
37938 }
37939 v.reset(OpRotateLeft16)
37940 v.AddArg2(x, z)
37941 return true
37942 }
37943 break
37944 }
37945
37946
37947
37948 for {
37949 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37950 right := v_0
37951 if right.Op != OpRsh16Ux32 {
37952 continue
37953 }
37954 y := right.Args[1]
37955 x := right.Args[0]
37956 left := v_1
37957 if left.Op != OpLsh16x32 {
37958 continue
37959 }
37960 _ = left.Args[1]
37961 if x != left.Args[0] {
37962 continue
37963 }
37964 z := left.Args[1]
37965 if z.Op != OpSub32 {
37966 continue
37967 }
37968 _ = z.Args[1]
37969 z_0 := z.Args[0]
37970 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
37971 continue
37972 }
37973 v.reset(OpRotateLeft16)
37974 v.AddArg2(x, z)
37975 return true
37976 }
37977 break
37978 }
37979
37980
37981
37982 for {
37983 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
37984 right := v_0
37985 if right.Op != OpRsh16Ux16 {
37986 continue
37987 }
37988 y := right.Args[1]
37989 x := right.Args[0]
37990 left := v_1
37991 if left.Op != OpLsh16x16 {
37992 continue
37993 }
37994 _ = left.Args[1]
37995 if x != left.Args[0] {
37996 continue
37997 }
37998 z := left.Args[1]
37999 if z.Op != OpSub16 {
38000 continue
38001 }
38002 _ = z.Args[1]
38003 z_0 := z.Args[0]
38004 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
38005 continue
38006 }
38007 v.reset(OpRotateLeft16)
38008 v.AddArg2(x, z)
38009 return true
38010 }
38011 break
38012 }
38013
38014
38015
38016 for {
38017 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38018 right := v_0
38019 if right.Op != OpRsh16Ux8 {
38020 continue
38021 }
38022 y := right.Args[1]
38023 x := right.Args[0]
38024 left := v_1
38025 if left.Op != OpLsh16x8 {
38026 continue
38027 }
38028 _ = left.Args[1]
38029 if x != left.Args[0] {
38030 continue
38031 }
38032 z := left.Args[1]
38033 if z.Op != OpSub8 {
38034 continue
38035 }
38036 _ = z.Args[1]
38037 z_0 := z.Args[0]
38038 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
38039 continue
38040 }
38041 v.reset(OpRotateLeft16)
38042 v.AddArg2(x, z)
38043 return true
38044 }
38045 break
38046 }
38047 return false
38048 }
38049 func rewriteValuegeneric_OpXor32(v *Value) bool {
38050 v_1 := v.Args[1]
38051 v_0 := v.Args[0]
38052 b := v.Block
38053 config := b.Func.Config
38054
38055
38056 for {
38057 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38058 if v_0.Op != OpConst32 {
38059 continue
38060 }
38061 c := auxIntToInt32(v_0.AuxInt)
38062 if v_1.Op != OpConst32 {
38063 continue
38064 }
38065 d := auxIntToInt32(v_1.AuxInt)
38066 v.reset(OpConst32)
38067 v.AuxInt = int32ToAuxInt(c ^ d)
38068 return true
38069 }
38070 break
38071 }
38072
38073
38074 for {
38075 x := v_0
38076 if x != v_1 {
38077 break
38078 }
38079 v.reset(OpConst32)
38080 v.AuxInt = int32ToAuxInt(0)
38081 return true
38082 }
38083
38084
38085 for {
38086 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38087 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
38088 continue
38089 }
38090 x := v_1
38091 v.copyOf(x)
38092 return true
38093 }
38094 break
38095 }
38096
38097
38098 for {
38099 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38100 if v_0.Op != OpCom32 {
38101 continue
38102 }
38103 x := v_0.Args[0]
38104 if x != v_1 {
38105 continue
38106 }
38107 v.reset(OpConst32)
38108 v.AuxInt = int32ToAuxInt(-1)
38109 return true
38110 }
38111 break
38112 }
38113
38114
38115 for {
38116 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38117 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
38118 continue
38119 }
38120 x := v_1
38121 v.reset(OpCom32)
38122 v.AddArg(x)
38123 return true
38124 }
38125 break
38126 }
38127
38128
38129 for {
38130 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38131 x := v_0
38132 if v_1.Op != OpXor32 {
38133 continue
38134 }
38135 _ = v_1.Args[1]
38136 v_1_0 := v_1.Args[0]
38137 v_1_1 := v_1.Args[1]
38138 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
38139 if x != v_1_0 {
38140 continue
38141 }
38142 y := v_1_1
38143 v.copyOf(y)
38144 return true
38145 }
38146 }
38147 break
38148 }
38149
38150
38151
38152 for {
38153 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38154 if v_0.Op != OpXor32 {
38155 continue
38156 }
38157 _ = v_0.Args[1]
38158 v_0_0 := v_0.Args[0]
38159 v_0_1 := v_0.Args[1]
38160 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
38161 i := v_0_0
38162 if i.Op != OpConst32 {
38163 continue
38164 }
38165 t := i.Type
38166 z := v_0_1
38167 x := v_1
38168 if !(z.Op != OpConst32 && x.Op != OpConst32) {
38169 continue
38170 }
38171 v.reset(OpXor32)
38172 v0 := b.NewValue0(v.Pos, OpXor32, t)
38173 v0.AddArg2(z, x)
38174 v.AddArg2(i, v0)
38175 return true
38176 }
38177 }
38178 break
38179 }
38180
38181
38182 for {
38183 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38184 if v_0.Op != OpConst32 {
38185 continue
38186 }
38187 t := v_0.Type
38188 c := auxIntToInt32(v_0.AuxInt)
38189 if v_1.Op != OpXor32 {
38190 continue
38191 }
38192 _ = v_1.Args[1]
38193 v_1_0 := v_1.Args[0]
38194 v_1_1 := v_1.Args[1]
38195 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
38196 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
38197 continue
38198 }
38199 d := auxIntToInt32(v_1_0.AuxInt)
38200 x := v_1_1
38201 v.reset(OpXor32)
38202 v0 := b.NewValue0(v.Pos, OpConst32, t)
38203 v0.AuxInt = int32ToAuxInt(c ^ d)
38204 v.AddArg2(v0, x)
38205 return true
38206 }
38207 }
38208 break
38209 }
38210
38211
38212
38213 for {
38214 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38215 if v_0.Op != OpLsh32x64 {
38216 continue
38217 }
38218 _ = v_0.Args[1]
38219 x := v_0.Args[0]
38220 z := v_0.Args[1]
38221 if z.Op != OpConst64 {
38222 continue
38223 }
38224 c := auxIntToInt64(z.AuxInt)
38225 if v_1.Op != OpRsh32Ux64 {
38226 continue
38227 }
38228 _ = v_1.Args[1]
38229 if x != v_1.Args[0] {
38230 continue
38231 }
38232 v_1_1 := v_1.Args[1]
38233 if v_1_1.Op != OpConst64 {
38234 continue
38235 }
38236 d := auxIntToInt64(v_1_1.AuxInt)
38237 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
38238 continue
38239 }
38240 v.reset(OpRotateLeft32)
38241 v.AddArg2(x, z)
38242 return true
38243 }
38244 break
38245 }
38246
38247
38248
38249 for {
38250 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38251 left := v_0
38252 if left.Op != OpLsh32x64 {
38253 continue
38254 }
38255 y := left.Args[1]
38256 x := left.Args[0]
38257 right := v_1
38258 if right.Op != OpRsh32Ux64 {
38259 continue
38260 }
38261 _ = right.Args[1]
38262 if x != right.Args[0] {
38263 continue
38264 }
38265 right_1 := right.Args[1]
38266 if right_1.Op != OpSub64 {
38267 continue
38268 }
38269 _ = right_1.Args[1]
38270 right_1_0 := right_1.Args[0]
38271 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
38272 continue
38273 }
38274 v.reset(OpRotateLeft32)
38275 v.AddArg2(x, y)
38276 return true
38277 }
38278 break
38279 }
38280
38281
38282
38283 for {
38284 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38285 left := v_0
38286 if left.Op != OpLsh32x32 {
38287 continue
38288 }
38289 y := left.Args[1]
38290 x := left.Args[0]
38291 right := v_1
38292 if right.Op != OpRsh32Ux32 {
38293 continue
38294 }
38295 _ = right.Args[1]
38296 if x != right.Args[0] {
38297 continue
38298 }
38299 right_1 := right.Args[1]
38300 if right_1.Op != OpSub32 {
38301 continue
38302 }
38303 _ = right_1.Args[1]
38304 right_1_0 := right_1.Args[0]
38305 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
38306 continue
38307 }
38308 v.reset(OpRotateLeft32)
38309 v.AddArg2(x, y)
38310 return true
38311 }
38312 break
38313 }
38314
38315
38316
38317 for {
38318 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38319 left := v_0
38320 if left.Op != OpLsh32x16 {
38321 continue
38322 }
38323 y := left.Args[1]
38324 x := left.Args[0]
38325 right := v_1
38326 if right.Op != OpRsh32Ux16 {
38327 continue
38328 }
38329 _ = right.Args[1]
38330 if x != right.Args[0] {
38331 continue
38332 }
38333 right_1 := right.Args[1]
38334 if right_1.Op != OpSub16 {
38335 continue
38336 }
38337 _ = right_1.Args[1]
38338 right_1_0 := right_1.Args[0]
38339 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
38340 continue
38341 }
38342 v.reset(OpRotateLeft32)
38343 v.AddArg2(x, y)
38344 return true
38345 }
38346 break
38347 }
38348
38349
38350
38351 for {
38352 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38353 left := v_0
38354 if left.Op != OpLsh32x8 {
38355 continue
38356 }
38357 y := left.Args[1]
38358 x := left.Args[0]
38359 right := v_1
38360 if right.Op != OpRsh32Ux8 {
38361 continue
38362 }
38363 _ = right.Args[1]
38364 if x != right.Args[0] {
38365 continue
38366 }
38367 right_1 := right.Args[1]
38368 if right_1.Op != OpSub8 {
38369 continue
38370 }
38371 _ = right_1.Args[1]
38372 right_1_0 := right_1.Args[0]
38373 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
38374 continue
38375 }
38376 v.reset(OpRotateLeft32)
38377 v.AddArg2(x, y)
38378 return true
38379 }
38380 break
38381 }
38382
38383
38384
38385 for {
38386 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38387 right := v_0
38388 if right.Op != OpRsh32Ux64 {
38389 continue
38390 }
38391 y := right.Args[1]
38392 x := right.Args[0]
38393 left := v_1
38394 if left.Op != OpLsh32x64 {
38395 continue
38396 }
38397 _ = left.Args[1]
38398 if x != left.Args[0] {
38399 continue
38400 }
38401 z := left.Args[1]
38402 if z.Op != OpSub64 {
38403 continue
38404 }
38405 _ = z.Args[1]
38406 z_0 := z.Args[0]
38407 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
38408 continue
38409 }
38410 v.reset(OpRotateLeft32)
38411 v.AddArg2(x, z)
38412 return true
38413 }
38414 break
38415 }
38416
38417
38418
38419 for {
38420 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38421 right := v_0
38422 if right.Op != OpRsh32Ux32 {
38423 continue
38424 }
38425 y := right.Args[1]
38426 x := right.Args[0]
38427 left := v_1
38428 if left.Op != OpLsh32x32 {
38429 continue
38430 }
38431 _ = left.Args[1]
38432 if x != left.Args[0] {
38433 continue
38434 }
38435 z := left.Args[1]
38436 if z.Op != OpSub32 {
38437 continue
38438 }
38439 _ = z.Args[1]
38440 z_0 := z.Args[0]
38441 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
38442 continue
38443 }
38444 v.reset(OpRotateLeft32)
38445 v.AddArg2(x, z)
38446 return true
38447 }
38448 break
38449 }
38450
38451
38452
38453 for {
38454 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38455 right := v_0
38456 if right.Op != OpRsh32Ux16 {
38457 continue
38458 }
38459 y := right.Args[1]
38460 x := right.Args[0]
38461 left := v_1
38462 if left.Op != OpLsh32x16 {
38463 continue
38464 }
38465 _ = left.Args[1]
38466 if x != left.Args[0] {
38467 continue
38468 }
38469 z := left.Args[1]
38470 if z.Op != OpSub16 {
38471 continue
38472 }
38473 _ = z.Args[1]
38474 z_0 := z.Args[0]
38475 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
38476 continue
38477 }
38478 v.reset(OpRotateLeft32)
38479 v.AddArg2(x, z)
38480 return true
38481 }
38482 break
38483 }
38484
38485
38486
38487 for {
38488 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38489 right := v_0
38490 if right.Op != OpRsh32Ux8 {
38491 continue
38492 }
38493 y := right.Args[1]
38494 x := right.Args[0]
38495 left := v_1
38496 if left.Op != OpLsh32x8 {
38497 continue
38498 }
38499 _ = left.Args[1]
38500 if x != left.Args[0] {
38501 continue
38502 }
38503 z := left.Args[1]
38504 if z.Op != OpSub8 {
38505 continue
38506 }
38507 _ = z.Args[1]
38508 z_0 := z.Args[0]
38509 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
38510 continue
38511 }
38512 v.reset(OpRotateLeft32)
38513 v.AddArg2(x, z)
38514 return true
38515 }
38516 break
38517 }
38518 return false
38519 }
38520 func rewriteValuegeneric_OpXor64(v *Value) bool {
38521 v_1 := v.Args[1]
38522 v_0 := v.Args[0]
38523 b := v.Block
38524 config := b.Func.Config
38525
38526
38527 for {
38528 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38529 if v_0.Op != OpConst64 {
38530 continue
38531 }
38532 c := auxIntToInt64(v_0.AuxInt)
38533 if v_1.Op != OpConst64 {
38534 continue
38535 }
38536 d := auxIntToInt64(v_1.AuxInt)
38537 v.reset(OpConst64)
38538 v.AuxInt = int64ToAuxInt(c ^ d)
38539 return true
38540 }
38541 break
38542 }
38543
38544
38545 for {
38546 x := v_0
38547 if x != v_1 {
38548 break
38549 }
38550 v.reset(OpConst64)
38551 v.AuxInt = int64ToAuxInt(0)
38552 return true
38553 }
38554
38555
38556 for {
38557 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38558 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
38559 continue
38560 }
38561 x := v_1
38562 v.copyOf(x)
38563 return true
38564 }
38565 break
38566 }
38567
38568
38569 for {
38570 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38571 if v_0.Op != OpCom64 {
38572 continue
38573 }
38574 x := v_0.Args[0]
38575 if x != v_1 {
38576 continue
38577 }
38578 v.reset(OpConst64)
38579 v.AuxInt = int64ToAuxInt(-1)
38580 return true
38581 }
38582 break
38583 }
38584
38585
38586 for {
38587 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38588 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
38589 continue
38590 }
38591 x := v_1
38592 v.reset(OpCom64)
38593 v.AddArg(x)
38594 return true
38595 }
38596 break
38597 }
38598
38599
38600 for {
38601 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38602 x := v_0
38603 if v_1.Op != OpXor64 {
38604 continue
38605 }
38606 _ = v_1.Args[1]
38607 v_1_0 := v_1.Args[0]
38608 v_1_1 := v_1.Args[1]
38609 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
38610 if x != v_1_0 {
38611 continue
38612 }
38613 y := v_1_1
38614 v.copyOf(y)
38615 return true
38616 }
38617 }
38618 break
38619 }
38620
38621
38622
38623 for {
38624 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38625 if v_0.Op != OpXor64 {
38626 continue
38627 }
38628 _ = v_0.Args[1]
38629 v_0_0 := v_0.Args[0]
38630 v_0_1 := v_0.Args[1]
38631 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
38632 i := v_0_0
38633 if i.Op != OpConst64 {
38634 continue
38635 }
38636 t := i.Type
38637 z := v_0_1
38638 x := v_1
38639 if !(z.Op != OpConst64 && x.Op != OpConst64) {
38640 continue
38641 }
38642 v.reset(OpXor64)
38643 v0 := b.NewValue0(v.Pos, OpXor64, t)
38644 v0.AddArg2(z, x)
38645 v.AddArg2(i, v0)
38646 return true
38647 }
38648 }
38649 break
38650 }
38651
38652
38653 for {
38654 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38655 if v_0.Op != OpConst64 {
38656 continue
38657 }
38658 t := v_0.Type
38659 c := auxIntToInt64(v_0.AuxInt)
38660 if v_1.Op != OpXor64 {
38661 continue
38662 }
38663 _ = v_1.Args[1]
38664 v_1_0 := v_1.Args[0]
38665 v_1_1 := v_1.Args[1]
38666 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
38667 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
38668 continue
38669 }
38670 d := auxIntToInt64(v_1_0.AuxInt)
38671 x := v_1_1
38672 v.reset(OpXor64)
38673 v0 := b.NewValue0(v.Pos, OpConst64, t)
38674 v0.AuxInt = int64ToAuxInt(c ^ d)
38675 v.AddArg2(v0, x)
38676 return true
38677 }
38678 }
38679 break
38680 }
38681
38682
38683
38684 for {
38685 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38686 if v_0.Op != OpLsh64x64 {
38687 continue
38688 }
38689 _ = v_0.Args[1]
38690 x := v_0.Args[0]
38691 z := v_0.Args[1]
38692 if z.Op != OpConst64 {
38693 continue
38694 }
38695 c := auxIntToInt64(z.AuxInt)
38696 if v_1.Op != OpRsh64Ux64 {
38697 continue
38698 }
38699 _ = v_1.Args[1]
38700 if x != v_1.Args[0] {
38701 continue
38702 }
38703 v_1_1 := v_1.Args[1]
38704 if v_1_1.Op != OpConst64 {
38705 continue
38706 }
38707 d := auxIntToInt64(v_1_1.AuxInt)
38708 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
38709 continue
38710 }
38711 v.reset(OpRotateLeft64)
38712 v.AddArg2(x, z)
38713 return true
38714 }
38715 break
38716 }
38717
38718
38719
38720 for {
38721 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38722 left := v_0
38723 if left.Op != OpLsh64x64 {
38724 continue
38725 }
38726 y := left.Args[1]
38727 x := left.Args[0]
38728 right := v_1
38729 if right.Op != OpRsh64Ux64 {
38730 continue
38731 }
38732 _ = right.Args[1]
38733 if x != right.Args[0] {
38734 continue
38735 }
38736 right_1 := right.Args[1]
38737 if right_1.Op != OpSub64 {
38738 continue
38739 }
38740 _ = right_1.Args[1]
38741 right_1_0 := right_1.Args[0]
38742 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
38743 continue
38744 }
38745 v.reset(OpRotateLeft64)
38746 v.AddArg2(x, y)
38747 return true
38748 }
38749 break
38750 }
38751
38752
38753
38754 for {
38755 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38756 left := v_0
38757 if left.Op != OpLsh64x32 {
38758 continue
38759 }
38760 y := left.Args[1]
38761 x := left.Args[0]
38762 right := v_1
38763 if right.Op != OpRsh64Ux32 {
38764 continue
38765 }
38766 _ = right.Args[1]
38767 if x != right.Args[0] {
38768 continue
38769 }
38770 right_1 := right.Args[1]
38771 if right_1.Op != OpSub32 {
38772 continue
38773 }
38774 _ = right_1.Args[1]
38775 right_1_0 := right_1.Args[0]
38776 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
38777 continue
38778 }
38779 v.reset(OpRotateLeft64)
38780 v.AddArg2(x, y)
38781 return true
38782 }
38783 break
38784 }
38785
38786
38787
38788 for {
38789 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38790 left := v_0
38791 if left.Op != OpLsh64x16 {
38792 continue
38793 }
38794 y := left.Args[1]
38795 x := left.Args[0]
38796 right := v_1
38797 if right.Op != OpRsh64Ux16 {
38798 continue
38799 }
38800 _ = right.Args[1]
38801 if x != right.Args[0] {
38802 continue
38803 }
38804 right_1 := right.Args[1]
38805 if right_1.Op != OpSub16 {
38806 continue
38807 }
38808 _ = right_1.Args[1]
38809 right_1_0 := right_1.Args[0]
38810 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
38811 continue
38812 }
38813 v.reset(OpRotateLeft64)
38814 v.AddArg2(x, y)
38815 return true
38816 }
38817 break
38818 }
38819
38820
38821
38822 for {
38823 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38824 left := v_0
38825 if left.Op != OpLsh64x8 {
38826 continue
38827 }
38828 y := left.Args[1]
38829 x := left.Args[0]
38830 right := v_1
38831 if right.Op != OpRsh64Ux8 {
38832 continue
38833 }
38834 _ = right.Args[1]
38835 if x != right.Args[0] {
38836 continue
38837 }
38838 right_1 := right.Args[1]
38839 if right_1.Op != OpSub8 {
38840 continue
38841 }
38842 _ = right_1.Args[1]
38843 right_1_0 := right_1.Args[0]
38844 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
38845 continue
38846 }
38847 v.reset(OpRotateLeft64)
38848 v.AddArg2(x, y)
38849 return true
38850 }
38851 break
38852 }
38853
38854
38855
38856 for {
38857 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38858 right := v_0
38859 if right.Op != OpRsh64Ux64 {
38860 continue
38861 }
38862 y := right.Args[1]
38863 x := right.Args[0]
38864 left := v_1
38865 if left.Op != OpLsh64x64 {
38866 continue
38867 }
38868 _ = left.Args[1]
38869 if x != left.Args[0] {
38870 continue
38871 }
38872 z := left.Args[1]
38873 if z.Op != OpSub64 {
38874 continue
38875 }
38876 _ = z.Args[1]
38877 z_0 := z.Args[0]
38878 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
38879 continue
38880 }
38881 v.reset(OpRotateLeft64)
38882 v.AddArg2(x, z)
38883 return true
38884 }
38885 break
38886 }
38887
38888
38889
38890 for {
38891 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38892 right := v_0
38893 if right.Op != OpRsh64Ux32 {
38894 continue
38895 }
38896 y := right.Args[1]
38897 x := right.Args[0]
38898 left := v_1
38899 if left.Op != OpLsh64x32 {
38900 continue
38901 }
38902 _ = left.Args[1]
38903 if x != left.Args[0] {
38904 continue
38905 }
38906 z := left.Args[1]
38907 if z.Op != OpSub32 {
38908 continue
38909 }
38910 _ = z.Args[1]
38911 z_0 := z.Args[0]
38912 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
38913 continue
38914 }
38915 v.reset(OpRotateLeft64)
38916 v.AddArg2(x, z)
38917 return true
38918 }
38919 break
38920 }
38921
38922
38923
38924 for {
38925 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38926 right := v_0
38927 if right.Op != OpRsh64Ux16 {
38928 continue
38929 }
38930 y := right.Args[1]
38931 x := right.Args[0]
38932 left := v_1
38933 if left.Op != OpLsh64x16 {
38934 continue
38935 }
38936 _ = left.Args[1]
38937 if x != left.Args[0] {
38938 continue
38939 }
38940 z := left.Args[1]
38941 if z.Op != OpSub16 {
38942 continue
38943 }
38944 _ = z.Args[1]
38945 z_0 := z.Args[0]
38946 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
38947 continue
38948 }
38949 v.reset(OpRotateLeft64)
38950 v.AddArg2(x, z)
38951 return true
38952 }
38953 break
38954 }
38955
38956
38957
38958 for {
38959 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
38960 right := v_0
38961 if right.Op != OpRsh64Ux8 {
38962 continue
38963 }
38964 y := right.Args[1]
38965 x := right.Args[0]
38966 left := v_1
38967 if left.Op != OpLsh64x8 {
38968 continue
38969 }
38970 _ = left.Args[1]
38971 if x != left.Args[0] {
38972 continue
38973 }
38974 z := left.Args[1]
38975 if z.Op != OpSub8 {
38976 continue
38977 }
38978 _ = z.Args[1]
38979 z_0 := z.Args[0]
38980 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
38981 continue
38982 }
38983 v.reset(OpRotateLeft64)
38984 v.AddArg2(x, z)
38985 return true
38986 }
38987 break
38988 }
38989 return false
38990 }
38991 func rewriteValuegeneric_OpXor8(v *Value) bool {
38992 v_1 := v.Args[1]
38993 v_0 := v.Args[0]
38994 b := v.Block
38995 config := b.Func.Config
38996
38997
38998 for {
38999 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
39000 if v_0.Op != OpConst8 {
39001 continue
39002 }
39003 c := auxIntToInt8(v_0.AuxInt)
39004 if v_1.Op != OpConst8 {
39005 continue
39006 }
39007 d := auxIntToInt8(v_1.AuxInt)
39008 v.reset(OpConst8)
39009 v.AuxInt = int8ToAuxInt(c ^ d)
39010 return true
39011 }
39012 break
39013 }
39014
39015
39016 for {
39017 x := v_0
39018 if x != v_1 {
39019 break
39020 }
39021 v.reset(OpConst8)
39022 v.AuxInt = int8ToAuxInt(0)
39023 return true
39024 }
39025
39026
39027 for {
39028 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
39029 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
39030 continue
39031 }
39032 x := v_1
39033 v.copyOf(x)
39034 return true
39035 }
39036 break
39037 }
39038
39039
39040 for {
39041 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
39042 if v_0.Op != OpCom8 {
39043 continue
39044 }
39045 x := v_0.Args[0]
39046 if x != v_1 {
39047 continue
39048 }
39049 v.reset(OpConst8)
39050 v.AuxInt = int8ToAuxInt(-1)
39051 return true
39052 }
39053 break
39054 }
39055
39056
39057 for {
39058 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
39059 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
39060 continue
39061 }
39062 x := v_1
39063 v.reset(OpCom8)
39064 v.AddArg(x)
39065 return true
39066 }
39067 break
39068 }
39069
39070
39071 for {
39072 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
39073 x := v_0
39074 if v_1.Op != OpXor8 {
39075 continue
39076 }
39077 _ = v_1.Args[1]
39078 v_1_0 := v_1.Args[0]
39079 v_1_1 := v_1.Args[1]
39080 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
39081 if x != v_1_0 {
39082 continue
39083 }
39084 y := v_1_1
39085 v.copyOf(y)
39086 return true
39087 }
39088 }
39089 break
39090 }
39091
39092
39093
39094 for {
39095 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
39096 if v_0.Op != OpXor8 {
39097 continue
39098 }
39099 _ = v_0.Args[1]
39100 v_0_0 := v_0.Args[0]
39101 v_0_1 := v_0.Args[1]
39102 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
39103 i := v_0_0
39104 if i.Op != OpConst8 {
39105 continue
39106 }
39107 t := i.Type
39108 z := v_0_1
39109 x := v_1
39110 if !(z.Op != OpConst8 && x.Op != OpConst8) {
39111 continue
39112 }
39113 v.reset(OpXor8)
39114 v0 := b.NewValue0(v.Pos, OpXor8, t)
39115 v0.AddArg2(z, x)
39116 v.AddArg2(i, v0)
39117 return true
39118 }
39119 }
39120 break
39121 }
39122
39123
39124 for {
39125 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
39126 if v_0.Op != OpConst8 {
39127 continue
39128 }
39129 t := v_0.Type
39130 c := auxIntToInt8(v_0.AuxInt)
39131 if v_1.Op != OpXor8 {
39132 continue
39133 }
39134 _ = v_1.Args[1]
39135 v_1_0 := v_1.Args[0]
39136 v_1_1 := v_1.Args[1]
39137 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
39138 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
39139 continue
39140 }
39141 d := auxIntToInt8(v_1_0.AuxInt)
39142 x := v_1_1
39143 v.reset(OpXor8)
39144 v0 := b.NewValue0(v.Pos, OpConst8, t)
39145 v0.AuxInt = int8ToAuxInt(c ^ d)
39146 v.AddArg2(v0, x)
39147 return true
39148 }
39149 }
39150 break
39151 }
39152
39153
39154
39155 for {
39156 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
39157 if v_0.Op != OpLsh8x64 {
39158 continue
39159 }
39160 _ = v_0.Args[1]
39161 x := v_0.Args[0]
39162 z := v_0.Args[1]
39163 if z.Op != OpConst64 {
39164 continue
39165 }
39166 c := auxIntToInt64(z.AuxInt)
39167 if v_1.Op != OpRsh8Ux64 {
39168 continue
39169 }
39170 _ = v_1.Args[1]
39171 if x != v_1.Args[0] {
39172 continue
39173 }
39174 v_1_1 := v_1.Args[1]
39175 if v_1_1.Op != OpConst64 {
39176 continue
39177 }
39178 d := auxIntToInt64(v_1_1.AuxInt)
39179 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
39180 continue
39181 }
39182 v.reset(OpRotateLeft8)
39183 v.AddArg2(x, z)
39184 return true
39185 }
39186 break
39187 }
39188
39189
39190
39191 for {
39192 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
39193 left := v_0
39194 if left.Op != OpLsh8x64 {
39195 continue
39196 }
39197 y := left.Args[1]
39198 x := left.Args[0]
39199 right := v_1
39200 if right.Op != OpRsh8Ux64 {
39201 continue
39202 }
39203 _ = right.Args[1]
39204 if x != right.Args[0] {
39205 continue
39206 }
39207 right_1 := right.Args[1]
39208 if right_1.Op != OpSub64 {
39209 continue
39210 }
39211 _ = right_1.Args[1]
39212 right_1_0 := right_1.Args[0]
39213 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
39214 continue
39215 }
39216 v.reset(OpRotateLeft8)
39217 v.AddArg2(x, y)
39218 return true
39219 }
39220 break
39221 }
39222
39223
39224
39225 for {
39226 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
39227 left := v_0
39228 if left.Op != OpLsh8x32 {
39229 continue
39230 }
39231 y := left.Args[1]
39232 x := left.Args[0]
39233 right := v_1
39234 if right.Op != OpRsh8Ux32 {
39235 continue
39236 }
39237 _ = right.Args[1]
39238 if x != right.Args[0] {
39239 continue
39240 }
39241 right_1 := right.Args[1]
39242 if right_1.Op != OpSub32 {
39243 continue
39244 }
39245 _ = right_1.Args[1]
39246 right_1_0 := right_1.Args[0]
39247 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
39248 continue
39249 }
39250 v.reset(OpRotateLeft8)
39251 v.AddArg2(x, y)
39252 return true
39253 }
39254 break
39255 }
39256
39257
39258
39259 for {
39260 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
39261 left := v_0
39262 if left.Op != OpLsh8x16 {
39263 continue
39264 }
39265 y := left.Args[1]
39266 x := left.Args[0]
39267 right := v_1
39268 if right.Op != OpRsh8Ux16 {
39269 continue
39270 }
39271 _ = right.Args[1]
39272 if x != right.Args[0] {
39273 continue
39274 }
39275 right_1 := right.Args[1]
39276 if right_1.Op != OpSub16 {
39277 continue
39278 }
39279 _ = right_1.Args[1]
39280 right_1_0 := right_1.Args[0]
39281 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
39282 continue
39283 }
39284 v.reset(OpRotateLeft8)
39285 v.AddArg2(x, y)
39286 return true
39287 }
39288 break
39289 }
39290
39291
39292
39293 for {
39294 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
39295 left := v_0
39296 if left.Op != OpLsh8x8 {
39297 continue
39298 }
39299 y := left.Args[1]
39300 x := left.Args[0]
39301 right := v_1
39302 if right.Op != OpRsh8Ux8 {
39303 continue
39304 }
39305 _ = right.Args[1]
39306 if x != right.Args[0] {
39307 continue
39308 }
39309 right_1 := right.Args[1]
39310 if right_1.Op != OpSub8 {
39311 continue
39312 }
39313 _ = right_1.Args[1]
39314 right_1_0 := right_1.Args[0]
39315 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
39316 continue
39317 }
39318 v.reset(OpRotateLeft8)
39319 v.AddArg2(x, y)
39320 return true
39321 }
39322 break
39323 }
39324
39325
39326
39327 for {
39328 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
39329 right := v_0
39330 if right.Op != OpRsh8Ux64 {
39331 continue
39332 }
39333 y := right.Args[1]
39334 x := right.Args[0]
39335 left := v_1
39336 if left.Op != OpLsh8x64 {
39337 continue
39338 }
39339 _ = left.Args[1]
39340 if x != left.Args[0] {
39341 continue
39342 }
39343 z := left.Args[1]
39344 if z.Op != OpSub64 {
39345 continue
39346 }
39347 _ = z.Args[1]
39348 z_0 := z.Args[0]
39349 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
39350 continue
39351 }
39352 v.reset(OpRotateLeft8)
39353 v.AddArg2(x, z)
39354 return true
39355 }
39356 break
39357 }
39358
39359
39360
39361 for {
39362 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
39363 right := v_0
39364 if right.Op != OpRsh8Ux32 {
39365 continue
39366 }
39367 y := right.Args[1]
39368 x := right.Args[0]
39369 left := v_1
39370 if left.Op != OpLsh8x32 {
39371 continue
39372 }
39373 _ = left.Args[1]
39374 if x != left.Args[0] {
39375 continue
39376 }
39377 z := left.Args[1]
39378 if z.Op != OpSub32 {
39379 continue
39380 }
39381 _ = z.Args[1]
39382 z_0 := z.Args[0]
39383 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
39384 continue
39385 }
39386 v.reset(OpRotateLeft8)
39387 v.AddArg2(x, z)
39388 return true
39389 }
39390 break
39391 }
39392
39393
39394
39395 for {
39396 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
39397 right := v_0
39398 if right.Op != OpRsh8Ux16 {
39399 continue
39400 }
39401 y := right.Args[1]
39402 x := right.Args[0]
39403 left := v_1
39404 if left.Op != OpLsh8x16 {
39405 continue
39406 }
39407 _ = left.Args[1]
39408 if x != left.Args[0] {
39409 continue
39410 }
39411 z := left.Args[1]
39412 if z.Op != OpSub16 {
39413 continue
39414 }
39415 _ = z.Args[1]
39416 z_0 := z.Args[0]
39417 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
39418 continue
39419 }
39420 v.reset(OpRotateLeft8)
39421 v.AddArg2(x, z)
39422 return true
39423 }
39424 break
39425 }
39426
39427
39428
39429 for {
39430 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
39431 right := v_0
39432 if right.Op != OpRsh8Ux8 {
39433 continue
39434 }
39435 y := right.Args[1]
39436 x := right.Args[0]
39437 left := v_1
39438 if left.Op != OpLsh8x8 {
39439 continue
39440 }
39441 _ = left.Args[1]
39442 if x != left.Args[0] {
39443 continue
39444 }
39445 z := left.Args[1]
39446 if z.Op != OpSub8 {
39447 continue
39448 }
39449 _ = z.Args[1]
39450 z_0 := z.Args[0]
39451 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
39452 continue
39453 }
39454 v.reset(OpRotateLeft8)
39455 v.AddArg2(x, z)
39456 return true
39457 }
39458 break
39459 }
39460 return false
39461 }
39462 func rewriteValuegeneric_OpZero(v *Value) bool {
39463 v_1 := v.Args[1]
39464 v_0 := v.Args[0]
39465 b := v.Block
39466
39467
39468
39469 for {
39470 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
39471 break
39472 }
39473 call := v_0.Args[0]
39474 if call.Op != OpStaticLECall {
39475 break
39476 }
39477 mem := v_1
39478 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isMalloc(call.Aux)) {
39479 break
39480 }
39481 v.copyOf(mem)
39482 return true
39483 }
39484
39485
39486
39487 for {
39488 n := auxIntToInt64(v.AuxInt)
39489 t1 := auxToType(v.Aux)
39490 p1 := v_0
39491 store := v_1
39492 if store.Op != OpStore {
39493 break
39494 }
39495 t2 := auxToType(store.Aux)
39496 mem := store.Args[2]
39497 store_0 := store.Args[0]
39498 if store_0.Op != OpOffPtr {
39499 break
39500 }
39501 o2 := auxIntToInt64(store_0.AuxInt)
39502 p2 := store_0.Args[0]
39503 if !(isSamePtr(p1, p2) && store.Uses == 1 && n >= o2+t2.Size() && clobber(store)) {
39504 break
39505 }
39506 v.reset(OpZero)
39507 v.AuxInt = int64ToAuxInt(n)
39508 v.Aux = typeToAux(t1)
39509 v.AddArg2(p1, mem)
39510 return true
39511 }
39512
39513
39514
39515 for {
39516 n := auxIntToInt64(v.AuxInt)
39517 t := auxToType(v.Aux)
39518 dst1 := v_0
39519 move := v_1
39520 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
39521 break
39522 }
39523 mem := move.Args[2]
39524 dst2 := move.Args[0]
39525 if !(move.Uses == 1 && isSamePtr(dst1, dst2) && clobber(move)) {
39526 break
39527 }
39528 v.reset(OpZero)
39529 v.AuxInt = int64ToAuxInt(n)
39530 v.Aux = typeToAux(t)
39531 v.AddArg2(dst1, mem)
39532 return true
39533 }
39534
39535
39536
39537 for {
39538 n := auxIntToInt64(v.AuxInt)
39539 t := auxToType(v.Aux)
39540 dst1 := v_0
39541 vardef := v_1
39542 if vardef.Op != OpVarDef {
39543 break
39544 }
39545 x := auxToSym(vardef.Aux)
39546 move := vardef.Args[0]
39547 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
39548 break
39549 }
39550 mem := move.Args[2]
39551 dst2 := move.Args[0]
39552 if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && clobber(move, vardef)) {
39553 break
39554 }
39555 v.reset(OpZero)
39556 v.AuxInt = int64ToAuxInt(n)
39557 v.Aux = typeToAux(t)
39558 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
39559 v0.Aux = symToAux(x)
39560 v0.AddArg(mem)
39561 v.AddArg2(dst1, v0)
39562 return true
39563 }
39564
39565
39566
39567 for {
39568 s := auxIntToInt64(v.AuxInt)
39569 t := auxToType(v.Aux)
39570 dst1 := v_0
39571 zero := v_1
39572 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != s || auxToType(zero.Aux) != t {
39573 break
39574 }
39575 dst2 := zero.Args[0]
39576 if !(isSamePtr(dst1, dst2)) {
39577 break
39578 }
39579 v.copyOf(zero)
39580 return true
39581 }
39582
39583
39584
39585 for {
39586 s := auxIntToInt64(v.AuxInt)
39587 t := auxToType(v.Aux)
39588 dst1 := v_0
39589 vardef := v_1
39590 if vardef.Op != OpVarDef {
39591 break
39592 }
39593 vardef_0 := vardef.Args[0]
39594 if vardef_0.Op != OpZero || auxIntToInt64(vardef_0.AuxInt) != s || auxToType(vardef_0.Aux) != t {
39595 break
39596 }
39597 dst2 := vardef_0.Args[0]
39598 if !(isSamePtr(dst1, dst2)) {
39599 break
39600 }
39601 v.copyOf(vardef)
39602 return true
39603 }
39604 return false
39605 }
39606 func rewriteValuegeneric_OpZeroExt16to32(v *Value) bool {
39607 v_0 := v.Args[0]
39608
39609
39610 for {
39611 if v_0.Op != OpConst16 {
39612 break
39613 }
39614 c := auxIntToInt16(v_0.AuxInt)
39615 v.reset(OpConst32)
39616 v.AuxInt = int32ToAuxInt(int32(uint16(c)))
39617 return true
39618 }
39619
39620
39621
39622 for {
39623 if v_0.Op != OpTrunc32to16 {
39624 break
39625 }
39626 x := v_0.Args[0]
39627 if x.Op != OpRsh32Ux64 {
39628 break
39629 }
39630 _ = x.Args[1]
39631 x_1 := x.Args[1]
39632 if x_1.Op != OpConst64 {
39633 break
39634 }
39635 s := auxIntToInt64(x_1.AuxInt)
39636 if !(s >= 16) {
39637 break
39638 }
39639 v.copyOf(x)
39640 return true
39641 }
39642 return false
39643 }
39644 func rewriteValuegeneric_OpZeroExt16to64(v *Value) bool {
39645 v_0 := v.Args[0]
39646
39647
39648 for {
39649 if v_0.Op != OpConst16 {
39650 break
39651 }
39652 c := auxIntToInt16(v_0.AuxInt)
39653 v.reset(OpConst64)
39654 v.AuxInt = int64ToAuxInt(int64(uint16(c)))
39655 return true
39656 }
39657
39658
39659
39660 for {
39661 if v_0.Op != OpTrunc64to16 {
39662 break
39663 }
39664 x := v_0.Args[0]
39665 if x.Op != OpRsh64Ux64 {
39666 break
39667 }
39668 _ = x.Args[1]
39669 x_1 := x.Args[1]
39670 if x_1.Op != OpConst64 {
39671 break
39672 }
39673 s := auxIntToInt64(x_1.AuxInt)
39674 if !(s >= 48) {
39675 break
39676 }
39677 v.copyOf(x)
39678 return true
39679 }
39680 return false
39681 }
39682 func rewriteValuegeneric_OpZeroExt32to64(v *Value) bool {
39683 v_0 := v.Args[0]
39684
39685
39686 for {
39687 if v_0.Op != OpConst32 {
39688 break
39689 }
39690 c := auxIntToInt32(v_0.AuxInt)
39691 v.reset(OpConst64)
39692 v.AuxInt = int64ToAuxInt(int64(uint32(c)))
39693 return true
39694 }
39695
39696
39697
39698 for {
39699 if v_0.Op != OpTrunc64to32 {
39700 break
39701 }
39702 x := v_0.Args[0]
39703 if x.Op != OpRsh64Ux64 {
39704 break
39705 }
39706 _ = x.Args[1]
39707 x_1 := x.Args[1]
39708 if x_1.Op != OpConst64 {
39709 break
39710 }
39711 s := auxIntToInt64(x_1.AuxInt)
39712 if !(s >= 32) {
39713 break
39714 }
39715 v.copyOf(x)
39716 return true
39717 }
39718 return false
39719 }
39720 func rewriteValuegeneric_OpZeroExt8to16(v *Value) bool {
39721 v_0 := v.Args[0]
39722
39723
39724 for {
39725 if v_0.Op != OpConst8 {
39726 break
39727 }
39728 c := auxIntToInt8(v_0.AuxInt)
39729 v.reset(OpConst16)
39730 v.AuxInt = int16ToAuxInt(int16(uint8(c)))
39731 return true
39732 }
39733
39734
39735
39736 for {
39737 if v_0.Op != OpTrunc16to8 {
39738 break
39739 }
39740 x := v_0.Args[0]
39741 if x.Op != OpRsh16Ux64 {
39742 break
39743 }
39744 _ = x.Args[1]
39745 x_1 := x.Args[1]
39746 if x_1.Op != OpConst64 {
39747 break
39748 }
39749 s := auxIntToInt64(x_1.AuxInt)
39750 if !(s >= 8) {
39751 break
39752 }
39753 v.copyOf(x)
39754 return true
39755 }
39756 return false
39757 }
39758 func rewriteValuegeneric_OpZeroExt8to32(v *Value) bool {
39759 v_0 := v.Args[0]
39760
39761
39762 for {
39763 if v_0.Op != OpConst8 {
39764 break
39765 }
39766 c := auxIntToInt8(v_0.AuxInt)
39767 v.reset(OpConst32)
39768 v.AuxInt = int32ToAuxInt(int32(uint8(c)))
39769 return true
39770 }
39771
39772
39773
39774 for {
39775 if v_0.Op != OpTrunc32to8 {
39776 break
39777 }
39778 x := v_0.Args[0]
39779 if x.Op != OpRsh32Ux64 {
39780 break
39781 }
39782 _ = x.Args[1]
39783 x_1 := x.Args[1]
39784 if x_1.Op != OpConst64 {
39785 break
39786 }
39787 s := auxIntToInt64(x_1.AuxInt)
39788 if !(s >= 24) {
39789 break
39790 }
39791 v.copyOf(x)
39792 return true
39793 }
39794 return false
39795 }
39796 func rewriteValuegeneric_OpZeroExt8to64(v *Value) bool {
39797 v_0 := v.Args[0]
39798
39799
39800 for {
39801 if v_0.Op != OpConst8 {
39802 break
39803 }
39804 c := auxIntToInt8(v_0.AuxInt)
39805 v.reset(OpConst64)
39806 v.AuxInt = int64ToAuxInt(int64(uint8(c)))
39807 return true
39808 }
39809
39810
39811
39812 for {
39813 if v_0.Op != OpTrunc64to8 {
39814 break
39815 }
39816 x := v_0.Args[0]
39817 if x.Op != OpRsh64Ux64 {
39818 break
39819 }
39820 _ = x.Args[1]
39821 x_1 := x.Args[1]
39822 if x_1.Op != OpConst64 {
39823 break
39824 }
39825 s := auxIntToInt64(x_1.AuxInt)
39826 if !(s >= 56) {
39827 break
39828 }
39829 v.copyOf(x)
39830 return true
39831 }
39832 return false
39833 }
39834 func rewriteBlockgeneric(b *Block) bool {
39835 switch b.Kind {
39836 case BlockIf:
39837
39838
39839 for b.Controls[0].Op == OpNot {
39840 v_0 := b.Controls[0]
39841 cond := v_0.Args[0]
39842 b.resetWithControl(BlockIf, cond)
39843 b.swapSuccessors()
39844 return true
39845 }
39846
39847
39848
39849 for b.Controls[0].Op == OpConstBool {
39850 v_0 := b.Controls[0]
39851 c := auxIntToBool(v_0.AuxInt)
39852 if !(c) {
39853 break
39854 }
39855 b.Reset(BlockFirst)
39856 return true
39857 }
39858
39859
39860
39861 for b.Controls[0].Op == OpConstBool {
39862 v_0 := b.Controls[0]
39863 c := auxIntToBool(v_0.AuxInt)
39864 if !(!c) {
39865 break
39866 }
39867 b.Reset(BlockFirst)
39868 b.swapSuccessors()
39869 return true
39870 }
39871 }
39872 return false
39873 }
39874
View as plain text