1
2
3 package ssa
4
5 import "math"
6 import "math/bits"
7 import "cmd/internal/obj"
8 import "cmd/compile/internal/types"
9 import "cmd/compile/internal/ir"
10
11 func rewriteValuegeneric(v *Value) bool {
12 switch v.Op {
13 case OpAdd16:
14 return rewriteValuegeneric_OpAdd16(v)
15 case OpAdd32:
16 return rewriteValuegeneric_OpAdd32(v)
17 case OpAdd32F:
18 return rewriteValuegeneric_OpAdd32F(v)
19 case OpAdd64:
20 return rewriteValuegeneric_OpAdd64(v)
21 case OpAdd64F:
22 return rewriteValuegeneric_OpAdd64F(v)
23 case OpAdd64carry:
24 return rewriteValuegeneric_OpAdd64carry(v)
25 case OpAdd8:
26 return rewriteValuegeneric_OpAdd8(v)
27 case OpAddPtr:
28 return rewriteValuegeneric_OpAddPtr(v)
29 case OpAnd16:
30 return rewriteValuegeneric_OpAnd16(v)
31 case OpAnd32:
32 return rewriteValuegeneric_OpAnd32(v)
33 case OpAnd64:
34 return rewriteValuegeneric_OpAnd64(v)
35 case OpAnd8:
36 return rewriteValuegeneric_OpAnd8(v)
37 case OpAndB:
38 return rewriteValuegeneric_OpAndB(v)
39 case OpArraySelect:
40 return rewriteValuegeneric_OpArraySelect(v)
41 case OpBitLen16:
42 return rewriteValuegeneric_OpBitLen16(v)
43 case OpBitLen32:
44 return rewriteValuegeneric_OpBitLen32(v)
45 case OpBitLen64:
46 return rewriteValuegeneric_OpBitLen64(v)
47 case OpBitLen8:
48 return rewriteValuegeneric_OpBitLen8(v)
49 case OpCeil:
50 return rewriteValuegeneric_OpCeil(v)
51 case OpCom16:
52 return rewriteValuegeneric_OpCom16(v)
53 case OpCom32:
54 return rewriteValuegeneric_OpCom32(v)
55 case OpCom64:
56 return rewriteValuegeneric_OpCom64(v)
57 case OpCom8:
58 return rewriteValuegeneric_OpCom8(v)
59 case OpCondSelect:
60 return rewriteValuegeneric_OpCondSelect(v)
61 case OpConstInterface:
62 return rewriteValuegeneric_OpConstInterface(v)
63 case OpConstSlice:
64 return rewriteValuegeneric_OpConstSlice(v)
65 case OpConstString:
66 return rewriteValuegeneric_OpConstString(v)
67 case OpConvert:
68 return rewriteValuegeneric_OpConvert(v)
69 case OpCtz16:
70 return rewriteValuegeneric_OpCtz16(v)
71 case OpCtz32:
72 return rewriteValuegeneric_OpCtz32(v)
73 case OpCtz64:
74 return rewriteValuegeneric_OpCtz64(v)
75 case OpCtz8:
76 return rewriteValuegeneric_OpCtz8(v)
77 case OpCvt32Fto32:
78 return rewriteValuegeneric_OpCvt32Fto32(v)
79 case OpCvt32Fto64:
80 return rewriteValuegeneric_OpCvt32Fto64(v)
81 case OpCvt32Fto64F:
82 return rewriteValuegeneric_OpCvt32Fto64F(v)
83 case OpCvt32to32F:
84 return rewriteValuegeneric_OpCvt32to32F(v)
85 case OpCvt32to64F:
86 return rewriteValuegeneric_OpCvt32to64F(v)
87 case OpCvt64Fto32:
88 return rewriteValuegeneric_OpCvt64Fto32(v)
89 case OpCvt64Fto32F:
90 return rewriteValuegeneric_OpCvt64Fto32F(v)
91 case OpCvt64Fto64:
92 return rewriteValuegeneric_OpCvt64Fto64(v)
93 case OpCvt64to32F:
94 return rewriteValuegeneric_OpCvt64to32F(v)
95 case OpCvt64to64F:
96 return rewriteValuegeneric_OpCvt64to64F(v)
97 case OpCvtBoolToUint8:
98 return rewriteValuegeneric_OpCvtBoolToUint8(v)
99 case OpDiv128u:
100 return rewriteValuegeneric_OpDiv128u(v)
101 case OpDiv16:
102 return rewriteValuegeneric_OpDiv16(v)
103 case OpDiv16u:
104 return rewriteValuegeneric_OpDiv16u(v)
105 case OpDiv32:
106 return rewriteValuegeneric_OpDiv32(v)
107 case OpDiv32F:
108 return rewriteValuegeneric_OpDiv32F(v)
109 case OpDiv32u:
110 return rewriteValuegeneric_OpDiv32u(v)
111 case OpDiv64:
112 return rewriteValuegeneric_OpDiv64(v)
113 case OpDiv64F:
114 return rewriteValuegeneric_OpDiv64F(v)
115 case OpDiv64u:
116 return rewriteValuegeneric_OpDiv64u(v)
117 case OpDiv8:
118 return rewriteValuegeneric_OpDiv8(v)
119 case OpDiv8u:
120 return rewriteValuegeneric_OpDiv8u(v)
121 case OpEq16:
122 return rewriteValuegeneric_OpEq16(v)
123 case OpEq32:
124 return rewriteValuegeneric_OpEq32(v)
125 case OpEq32F:
126 return rewriteValuegeneric_OpEq32F(v)
127 case OpEq64:
128 return rewriteValuegeneric_OpEq64(v)
129 case OpEq64F:
130 return rewriteValuegeneric_OpEq64F(v)
131 case OpEq8:
132 return rewriteValuegeneric_OpEq8(v)
133 case OpEqB:
134 return rewriteValuegeneric_OpEqB(v)
135 case OpEqInter:
136 return rewriteValuegeneric_OpEqInter(v)
137 case OpEqPtr:
138 return rewriteValuegeneric_OpEqPtr(v)
139 case OpEqSlice:
140 return rewriteValuegeneric_OpEqSlice(v)
141 case OpFloor:
142 return rewriteValuegeneric_OpFloor(v)
143 case OpIMake:
144 return rewriteValuegeneric_OpIMake(v)
145 case OpInterLECall:
146 return rewriteValuegeneric_OpInterLECall(v)
147 case OpIsInBounds:
148 return rewriteValuegeneric_OpIsInBounds(v)
149 case OpIsNonNil:
150 return rewriteValuegeneric_OpIsNonNil(v)
151 case OpIsSliceInBounds:
152 return rewriteValuegeneric_OpIsSliceInBounds(v)
153 case OpLeq16:
154 return rewriteValuegeneric_OpLeq16(v)
155 case OpLeq16U:
156 return rewriteValuegeneric_OpLeq16U(v)
157 case OpLeq32:
158 return rewriteValuegeneric_OpLeq32(v)
159 case OpLeq32F:
160 return rewriteValuegeneric_OpLeq32F(v)
161 case OpLeq32U:
162 return rewriteValuegeneric_OpLeq32U(v)
163 case OpLeq64:
164 return rewriteValuegeneric_OpLeq64(v)
165 case OpLeq64F:
166 return rewriteValuegeneric_OpLeq64F(v)
167 case OpLeq64U:
168 return rewriteValuegeneric_OpLeq64U(v)
169 case OpLeq8:
170 return rewriteValuegeneric_OpLeq8(v)
171 case OpLeq8U:
172 return rewriteValuegeneric_OpLeq8U(v)
173 case OpLess16:
174 return rewriteValuegeneric_OpLess16(v)
175 case OpLess16U:
176 return rewriteValuegeneric_OpLess16U(v)
177 case OpLess32:
178 return rewriteValuegeneric_OpLess32(v)
179 case OpLess32F:
180 return rewriteValuegeneric_OpLess32F(v)
181 case OpLess32U:
182 return rewriteValuegeneric_OpLess32U(v)
183 case OpLess64:
184 return rewriteValuegeneric_OpLess64(v)
185 case OpLess64F:
186 return rewriteValuegeneric_OpLess64F(v)
187 case OpLess64U:
188 return rewriteValuegeneric_OpLess64U(v)
189 case OpLess8:
190 return rewriteValuegeneric_OpLess8(v)
191 case OpLess8U:
192 return rewriteValuegeneric_OpLess8U(v)
193 case OpLoad:
194 return rewriteValuegeneric_OpLoad(v)
195 case OpLsh16x16:
196 return rewriteValuegeneric_OpLsh16x16(v)
197 case OpLsh16x32:
198 return rewriteValuegeneric_OpLsh16x32(v)
199 case OpLsh16x64:
200 return rewriteValuegeneric_OpLsh16x64(v)
201 case OpLsh16x8:
202 return rewriteValuegeneric_OpLsh16x8(v)
203 case OpLsh32x16:
204 return rewriteValuegeneric_OpLsh32x16(v)
205 case OpLsh32x32:
206 return rewriteValuegeneric_OpLsh32x32(v)
207 case OpLsh32x64:
208 return rewriteValuegeneric_OpLsh32x64(v)
209 case OpLsh32x8:
210 return rewriteValuegeneric_OpLsh32x8(v)
211 case OpLsh64x16:
212 return rewriteValuegeneric_OpLsh64x16(v)
213 case OpLsh64x32:
214 return rewriteValuegeneric_OpLsh64x32(v)
215 case OpLsh64x64:
216 return rewriteValuegeneric_OpLsh64x64(v)
217 case OpLsh64x8:
218 return rewriteValuegeneric_OpLsh64x8(v)
219 case OpLsh8x16:
220 return rewriteValuegeneric_OpLsh8x16(v)
221 case OpLsh8x32:
222 return rewriteValuegeneric_OpLsh8x32(v)
223 case OpLsh8x64:
224 return rewriteValuegeneric_OpLsh8x64(v)
225 case OpLsh8x8:
226 return rewriteValuegeneric_OpLsh8x8(v)
227 case OpMemEq:
228 return rewriteValuegeneric_OpMemEq(v)
229 case OpMod16:
230 return rewriteValuegeneric_OpMod16(v)
231 case OpMod16u:
232 return rewriteValuegeneric_OpMod16u(v)
233 case OpMod32:
234 return rewriteValuegeneric_OpMod32(v)
235 case OpMod32u:
236 return rewriteValuegeneric_OpMod32u(v)
237 case OpMod64:
238 return rewriteValuegeneric_OpMod64(v)
239 case OpMod64u:
240 return rewriteValuegeneric_OpMod64u(v)
241 case OpMod8:
242 return rewriteValuegeneric_OpMod8(v)
243 case OpMod8u:
244 return rewriteValuegeneric_OpMod8u(v)
245 case OpMove:
246 return rewriteValuegeneric_OpMove(v)
247 case OpMul16:
248 return rewriteValuegeneric_OpMul16(v)
249 case OpMul32:
250 return rewriteValuegeneric_OpMul32(v)
251 case OpMul32F:
252 return rewriteValuegeneric_OpMul32F(v)
253 case OpMul32uhilo:
254 return rewriteValuegeneric_OpMul32uhilo(v)
255 case OpMul32uover:
256 return rewriteValuegeneric_OpMul32uover(v)
257 case OpMul64:
258 return rewriteValuegeneric_OpMul64(v)
259 case OpMul64F:
260 return rewriteValuegeneric_OpMul64F(v)
261 case OpMul64uhilo:
262 return rewriteValuegeneric_OpMul64uhilo(v)
263 case OpMul64uover:
264 return rewriteValuegeneric_OpMul64uover(v)
265 case OpMul8:
266 return rewriteValuegeneric_OpMul8(v)
267 case OpNeg16:
268 return rewriteValuegeneric_OpNeg16(v)
269 case OpNeg32:
270 return rewriteValuegeneric_OpNeg32(v)
271 case OpNeg32F:
272 return rewriteValuegeneric_OpNeg32F(v)
273 case OpNeg64:
274 return rewriteValuegeneric_OpNeg64(v)
275 case OpNeg64F:
276 return rewriteValuegeneric_OpNeg64F(v)
277 case OpNeg8:
278 return rewriteValuegeneric_OpNeg8(v)
279 case OpNeq16:
280 return rewriteValuegeneric_OpNeq16(v)
281 case OpNeq32:
282 return rewriteValuegeneric_OpNeq32(v)
283 case OpNeq32F:
284 return rewriteValuegeneric_OpNeq32F(v)
285 case OpNeq64:
286 return rewriteValuegeneric_OpNeq64(v)
287 case OpNeq64F:
288 return rewriteValuegeneric_OpNeq64F(v)
289 case OpNeq8:
290 return rewriteValuegeneric_OpNeq8(v)
291 case OpNeqB:
292 return rewriteValuegeneric_OpNeqB(v)
293 case OpNeqInter:
294 return rewriteValuegeneric_OpNeqInter(v)
295 case OpNeqPtr:
296 return rewriteValuegeneric_OpNeqPtr(v)
297 case OpNeqSlice:
298 return rewriteValuegeneric_OpNeqSlice(v)
299 case OpNilCheck:
300 return rewriteValuegeneric_OpNilCheck(v)
301 case OpNot:
302 return rewriteValuegeneric_OpNot(v)
303 case OpOffPtr:
304 return rewriteValuegeneric_OpOffPtr(v)
305 case OpOr16:
306 return rewriteValuegeneric_OpOr16(v)
307 case OpOr32:
308 return rewriteValuegeneric_OpOr32(v)
309 case OpOr64:
310 return rewriteValuegeneric_OpOr64(v)
311 case OpOr8:
312 return rewriteValuegeneric_OpOr8(v)
313 case OpOrB:
314 return rewriteValuegeneric_OpOrB(v)
315 case OpPhi:
316 return rewriteValuegeneric_OpPhi(v)
317 case OpPopCount16:
318 return rewriteValuegeneric_OpPopCount16(v)
319 case OpPopCount32:
320 return rewriteValuegeneric_OpPopCount32(v)
321 case OpPopCount64:
322 return rewriteValuegeneric_OpPopCount64(v)
323 case OpPopCount8:
324 return rewriteValuegeneric_OpPopCount8(v)
325 case OpPtrIndex:
326 return rewriteValuegeneric_OpPtrIndex(v)
327 case OpRotateLeft16:
328 return rewriteValuegeneric_OpRotateLeft16(v)
329 case OpRotateLeft32:
330 return rewriteValuegeneric_OpRotateLeft32(v)
331 case OpRotateLeft64:
332 return rewriteValuegeneric_OpRotateLeft64(v)
333 case OpRotateLeft8:
334 return rewriteValuegeneric_OpRotateLeft8(v)
335 case OpRound32F:
336 return rewriteValuegeneric_OpRound32F(v)
337 case OpRound64F:
338 return rewriteValuegeneric_OpRound64F(v)
339 case OpRoundToEven:
340 return rewriteValuegeneric_OpRoundToEven(v)
341 case OpRsh16Ux16:
342 return rewriteValuegeneric_OpRsh16Ux16(v)
343 case OpRsh16Ux32:
344 return rewriteValuegeneric_OpRsh16Ux32(v)
345 case OpRsh16Ux64:
346 return rewriteValuegeneric_OpRsh16Ux64(v)
347 case OpRsh16Ux8:
348 return rewriteValuegeneric_OpRsh16Ux8(v)
349 case OpRsh16x16:
350 return rewriteValuegeneric_OpRsh16x16(v)
351 case OpRsh16x32:
352 return rewriteValuegeneric_OpRsh16x32(v)
353 case OpRsh16x64:
354 return rewriteValuegeneric_OpRsh16x64(v)
355 case OpRsh16x8:
356 return rewriteValuegeneric_OpRsh16x8(v)
357 case OpRsh32Ux16:
358 return rewriteValuegeneric_OpRsh32Ux16(v)
359 case OpRsh32Ux32:
360 return rewriteValuegeneric_OpRsh32Ux32(v)
361 case OpRsh32Ux64:
362 return rewriteValuegeneric_OpRsh32Ux64(v)
363 case OpRsh32Ux8:
364 return rewriteValuegeneric_OpRsh32Ux8(v)
365 case OpRsh32x16:
366 return rewriteValuegeneric_OpRsh32x16(v)
367 case OpRsh32x32:
368 return rewriteValuegeneric_OpRsh32x32(v)
369 case OpRsh32x64:
370 return rewriteValuegeneric_OpRsh32x64(v)
371 case OpRsh32x8:
372 return rewriteValuegeneric_OpRsh32x8(v)
373 case OpRsh64Ux16:
374 return rewriteValuegeneric_OpRsh64Ux16(v)
375 case OpRsh64Ux32:
376 return rewriteValuegeneric_OpRsh64Ux32(v)
377 case OpRsh64Ux64:
378 return rewriteValuegeneric_OpRsh64Ux64(v)
379 case OpRsh64Ux8:
380 return rewriteValuegeneric_OpRsh64Ux8(v)
381 case OpRsh64x16:
382 return rewriteValuegeneric_OpRsh64x16(v)
383 case OpRsh64x32:
384 return rewriteValuegeneric_OpRsh64x32(v)
385 case OpRsh64x64:
386 return rewriteValuegeneric_OpRsh64x64(v)
387 case OpRsh64x8:
388 return rewriteValuegeneric_OpRsh64x8(v)
389 case OpRsh8Ux16:
390 return rewriteValuegeneric_OpRsh8Ux16(v)
391 case OpRsh8Ux32:
392 return rewriteValuegeneric_OpRsh8Ux32(v)
393 case OpRsh8Ux64:
394 return rewriteValuegeneric_OpRsh8Ux64(v)
395 case OpRsh8Ux8:
396 return rewriteValuegeneric_OpRsh8Ux8(v)
397 case OpRsh8x16:
398 return rewriteValuegeneric_OpRsh8x16(v)
399 case OpRsh8x32:
400 return rewriteValuegeneric_OpRsh8x32(v)
401 case OpRsh8x64:
402 return rewriteValuegeneric_OpRsh8x64(v)
403 case OpRsh8x8:
404 return rewriteValuegeneric_OpRsh8x8(v)
405 case OpSelect0:
406 return rewriteValuegeneric_OpSelect0(v)
407 case OpSelect1:
408 return rewriteValuegeneric_OpSelect1(v)
409 case OpSelectN:
410 return rewriteValuegeneric_OpSelectN(v)
411 case OpSignExt16to32:
412 return rewriteValuegeneric_OpSignExt16to32(v)
413 case OpSignExt16to64:
414 return rewriteValuegeneric_OpSignExt16to64(v)
415 case OpSignExt32to64:
416 return rewriteValuegeneric_OpSignExt32to64(v)
417 case OpSignExt8to16:
418 return rewriteValuegeneric_OpSignExt8to16(v)
419 case OpSignExt8to32:
420 return rewriteValuegeneric_OpSignExt8to32(v)
421 case OpSignExt8to64:
422 return rewriteValuegeneric_OpSignExt8to64(v)
423 case OpSliceCap:
424 return rewriteValuegeneric_OpSliceCap(v)
425 case OpSliceLen:
426 return rewriteValuegeneric_OpSliceLen(v)
427 case OpSliceMake:
428 return rewriteValuegeneric_OpSliceMake(v)
429 case OpSlicePtr:
430 return rewriteValuegeneric_OpSlicePtr(v)
431 case OpSlicemask:
432 return rewriteValuegeneric_OpSlicemask(v)
433 case OpSqrt:
434 return rewriteValuegeneric_OpSqrt(v)
435 case OpStaticCall:
436 return rewriteValuegeneric_OpStaticCall(v)
437 case OpStaticLECall:
438 return rewriteValuegeneric_OpStaticLECall(v)
439 case OpStore:
440 return rewriteValuegeneric_OpStore(v)
441 case OpStringLen:
442 return rewriteValuegeneric_OpStringLen(v)
443 case OpStringPtr:
444 return rewriteValuegeneric_OpStringPtr(v)
445 case OpStructSelect:
446 return rewriteValuegeneric_OpStructSelect(v)
447 case OpSub16:
448 return rewriteValuegeneric_OpSub16(v)
449 case OpSub32:
450 return rewriteValuegeneric_OpSub32(v)
451 case OpSub32F:
452 return rewriteValuegeneric_OpSub32F(v)
453 case OpSub64:
454 return rewriteValuegeneric_OpSub64(v)
455 case OpSub64F:
456 return rewriteValuegeneric_OpSub64F(v)
457 case OpSub8:
458 return rewriteValuegeneric_OpSub8(v)
459 case OpTrunc:
460 return rewriteValuegeneric_OpTrunc(v)
461 case OpTrunc16to8:
462 return rewriteValuegeneric_OpTrunc16to8(v)
463 case OpTrunc32to16:
464 return rewriteValuegeneric_OpTrunc32to16(v)
465 case OpTrunc32to8:
466 return rewriteValuegeneric_OpTrunc32to8(v)
467 case OpTrunc64to16:
468 return rewriteValuegeneric_OpTrunc64to16(v)
469 case OpTrunc64to32:
470 return rewriteValuegeneric_OpTrunc64to32(v)
471 case OpTrunc64to8:
472 return rewriteValuegeneric_OpTrunc64to8(v)
473 case OpXor16:
474 return rewriteValuegeneric_OpXor16(v)
475 case OpXor32:
476 return rewriteValuegeneric_OpXor32(v)
477 case OpXor64:
478 return rewriteValuegeneric_OpXor64(v)
479 case OpXor8:
480 return rewriteValuegeneric_OpXor8(v)
481 case OpZero:
482 return rewriteValuegeneric_OpZero(v)
483 case OpZeroExt16to32:
484 return rewriteValuegeneric_OpZeroExt16to32(v)
485 case OpZeroExt16to64:
486 return rewriteValuegeneric_OpZeroExt16to64(v)
487 case OpZeroExt32to64:
488 return rewriteValuegeneric_OpZeroExt32to64(v)
489 case OpZeroExt8to16:
490 return rewriteValuegeneric_OpZeroExt8to16(v)
491 case OpZeroExt8to32:
492 return rewriteValuegeneric_OpZeroExt8to32(v)
493 case OpZeroExt8to64:
494 return rewriteValuegeneric_OpZeroExt8to64(v)
495 }
496 return false
497 }
498 func rewriteValuegeneric_OpAdd16(v *Value) bool {
499 v_1 := v.Args[1]
500 v_0 := v.Args[0]
501 b := v.Block
502 config := b.Func.Config
503
504
505 for {
506 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
507 if v_0.Op != OpConst16 {
508 continue
509 }
510 c := auxIntToInt16(v_0.AuxInt)
511 if v_1.Op != OpConst16 {
512 continue
513 }
514 d := auxIntToInt16(v_1.AuxInt)
515 v.reset(OpConst16)
516 v.AuxInt = int16ToAuxInt(c + d)
517 return true
518 }
519 break
520 }
521
522
523 for {
524 t := v.Type
525 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
526 if v_0.Op != OpMul16 {
527 continue
528 }
529 _ = v_0.Args[1]
530 v_0_0 := v_0.Args[0]
531 v_0_1 := v_0.Args[1]
532 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
533 x := v_0_0
534 y := v_0_1
535 if v_1.Op != OpMul16 {
536 continue
537 }
538 _ = v_1.Args[1]
539 v_1_0 := v_1.Args[0]
540 v_1_1 := v_1.Args[1]
541 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
542 if x != v_1_0 {
543 continue
544 }
545 z := v_1_1
546 v.reset(OpMul16)
547 v0 := b.NewValue0(v.Pos, OpAdd16, t)
548 v0.AddArg2(y, z)
549 v.AddArg2(x, v0)
550 return true
551 }
552 }
553 }
554 break
555 }
556
557
558 for {
559 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
560 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
561 continue
562 }
563 x := v_1
564 v.copyOf(x)
565 return true
566 }
567 break
568 }
569
570
571 for {
572 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
573 x := v_0
574 if v_1.Op != OpNeg16 {
575 continue
576 }
577 y := v_1.Args[0]
578 v.reset(OpSub16)
579 v.AddArg2(x, y)
580 return true
581 }
582 break
583 }
584
585
586 for {
587 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
588 if v_0.Op != OpCom16 {
589 continue
590 }
591 x := v_0.Args[0]
592 if x != v_1 {
593 continue
594 }
595 v.reset(OpConst16)
596 v.AuxInt = int16ToAuxInt(-1)
597 return true
598 }
599 break
600 }
601
602
603 for {
604 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
605 if v_0.Op != OpSub16 {
606 continue
607 }
608 t := v_0.Args[1]
609 x := v_0.Args[0]
610 if v_1.Op != OpAdd16 {
611 continue
612 }
613 _ = v_1.Args[1]
614 v_1_0 := v_1.Args[0]
615 v_1_1 := v_1.Args[1]
616 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
617 if t != v_1_0 {
618 continue
619 }
620 y := v_1_1
621 v.reset(OpAdd16)
622 v.AddArg2(x, y)
623 return true
624 }
625 }
626 break
627 }
628
629
630 for {
631 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
632 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 1 || v_1.Op != OpCom16 {
633 continue
634 }
635 x := v_1.Args[0]
636 v.reset(OpNeg16)
637 v.AddArg(x)
638 return true
639 }
640 break
641 }
642
643
644 for {
645 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
646 x := v_0
647 if v_1.Op != OpSub16 {
648 continue
649 }
650 _ = v_1.Args[1]
651 y := v_1.Args[0]
652 if x != v_1.Args[1] {
653 continue
654 }
655 v.copyOf(y)
656 return true
657 }
658 break
659 }
660
661
662 for {
663 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
664 x := v_0
665 if v_1.Op != OpAdd16 {
666 continue
667 }
668 _ = v_1.Args[1]
669 v_1_0 := v_1.Args[0]
670 v_1_1 := v_1.Args[1]
671 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
672 y := v_1_0
673 if v_1_1.Op != OpSub16 {
674 continue
675 }
676 _ = v_1_1.Args[1]
677 z := v_1_1.Args[0]
678 if x != v_1_1.Args[1] {
679 continue
680 }
681 v.reset(OpAdd16)
682 v.AddArg2(y, z)
683 return true
684 }
685 }
686 break
687 }
688
689
690
691 for {
692 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
693 if v_0.Op != OpAdd16 {
694 continue
695 }
696 _ = v_0.Args[1]
697 v_0_0 := v_0.Args[0]
698 v_0_1 := v_0.Args[1]
699 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
700 i := v_0_0
701 if i.Op != OpConst16 {
702 continue
703 }
704 t := i.Type
705 z := v_0_1
706 x := v_1
707 if !(z.Op != OpConst16 && x.Op != OpConst16) {
708 continue
709 }
710 v.reset(OpAdd16)
711 v0 := b.NewValue0(v.Pos, OpAdd16, t)
712 v0.AddArg2(z, x)
713 v.AddArg2(i, v0)
714 return true
715 }
716 }
717 break
718 }
719
720
721
722 for {
723 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
724 if v_0.Op != OpSub16 {
725 continue
726 }
727 z := v_0.Args[1]
728 i := v_0.Args[0]
729 if i.Op != OpConst16 {
730 continue
731 }
732 t := i.Type
733 x := v_1
734 if !(z.Op != OpConst16 && x.Op != OpConst16) {
735 continue
736 }
737 v.reset(OpAdd16)
738 v0 := b.NewValue0(v.Pos, OpSub16, t)
739 v0.AddArg2(x, z)
740 v.AddArg2(i, v0)
741 return true
742 }
743 break
744 }
745
746
747 for {
748 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
749 if v_0.Op != OpConst16 {
750 continue
751 }
752 t := v_0.Type
753 c := auxIntToInt16(v_0.AuxInt)
754 if v_1.Op != OpAdd16 {
755 continue
756 }
757 _ = v_1.Args[1]
758 v_1_0 := v_1.Args[0]
759 v_1_1 := v_1.Args[1]
760 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
761 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
762 continue
763 }
764 d := auxIntToInt16(v_1_0.AuxInt)
765 x := v_1_1
766 v.reset(OpAdd16)
767 v0 := b.NewValue0(v.Pos, OpConst16, t)
768 v0.AuxInt = int16ToAuxInt(c + d)
769 v.AddArg2(v0, x)
770 return true
771 }
772 }
773 break
774 }
775
776
777 for {
778 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
779 if v_0.Op != OpConst16 {
780 continue
781 }
782 t := v_0.Type
783 c := auxIntToInt16(v_0.AuxInt)
784 if v_1.Op != OpSub16 {
785 continue
786 }
787 x := v_1.Args[1]
788 v_1_0 := v_1.Args[0]
789 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
790 continue
791 }
792 d := auxIntToInt16(v_1_0.AuxInt)
793 v.reset(OpSub16)
794 v0 := b.NewValue0(v.Pos, OpConst16, t)
795 v0.AuxInt = int16ToAuxInt(c + d)
796 v.AddArg2(v0, x)
797 return true
798 }
799 break
800 }
801
802
803
804 for {
805 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
806 if v_0.Op != OpLsh16x64 {
807 continue
808 }
809 _ = v_0.Args[1]
810 x := v_0.Args[0]
811 z := v_0.Args[1]
812 if z.Op != OpConst64 {
813 continue
814 }
815 c := auxIntToInt64(z.AuxInt)
816 if v_1.Op != OpRsh16Ux64 {
817 continue
818 }
819 _ = v_1.Args[1]
820 if x != v_1.Args[0] {
821 continue
822 }
823 v_1_1 := v_1.Args[1]
824 if v_1_1.Op != OpConst64 {
825 continue
826 }
827 d := auxIntToInt64(v_1_1.AuxInt)
828 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
829 continue
830 }
831 v.reset(OpRotateLeft16)
832 v.AddArg2(x, z)
833 return true
834 }
835 break
836 }
837
838
839
840 for {
841 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
842 left := v_0
843 if left.Op != OpLsh16x64 {
844 continue
845 }
846 y := left.Args[1]
847 x := left.Args[0]
848 right := v_1
849 if right.Op != OpRsh16Ux64 {
850 continue
851 }
852 _ = right.Args[1]
853 if x != right.Args[0] {
854 continue
855 }
856 right_1 := right.Args[1]
857 if right_1.Op != OpSub64 {
858 continue
859 }
860 _ = right_1.Args[1]
861 right_1_0 := right_1.Args[0]
862 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
863 continue
864 }
865 v.reset(OpRotateLeft16)
866 v.AddArg2(x, y)
867 return true
868 }
869 break
870 }
871
872
873
874 for {
875 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
876 left := v_0
877 if left.Op != OpLsh16x32 {
878 continue
879 }
880 y := left.Args[1]
881 x := left.Args[0]
882 right := v_1
883 if right.Op != OpRsh16Ux32 {
884 continue
885 }
886 _ = right.Args[1]
887 if x != right.Args[0] {
888 continue
889 }
890 right_1 := right.Args[1]
891 if right_1.Op != OpSub32 {
892 continue
893 }
894 _ = right_1.Args[1]
895 right_1_0 := right_1.Args[0]
896 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
897 continue
898 }
899 v.reset(OpRotateLeft16)
900 v.AddArg2(x, y)
901 return true
902 }
903 break
904 }
905
906
907
908 for {
909 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
910 left := v_0
911 if left.Op != OpLsh16x16 {
912 continue
913 }
914 y := left.Args[1]
915 x := left.Args[0]
916 right := v_1
917 if right.Op != OpRsh16Ux16 {
918 continue
919 }
920 _ = right.Args[1]
921 if x != right.Args[0] {
922 continue
923 }
924 right_1 := right.Args[1]
925 if right_1.Op != OpSub16 {
926 continue
927 }
928 _ = right_1.Args[1]
929 right_1_0 := right_1.Args[0]
930 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
931 continue
932 }
933 v.reset(OpRotateLeft16)
934 v.AddArg2(x, y)
935 return true
936 }
937 break
938 }
939
940
941
942 for {
943 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
944 left := v_0
945 if left.Op != OpLsh16x8 {
946 continue
947 }
948 y := left.Args[1]
949 x := left.Args[0]
950 right := v_1
951 if right.Op != OpRsh16Ux8 {
952 continue
953 }
954 _ = right.Args[1]
955 if x != right.Args[0] {
956 continue
957 }
958 right_1 := right.Args[1]
959 if right_1.Op != OpSub8 {
960 continue
961 }
962 _ = right_1.Args[1]
963 right_1_0 := right_1.Args[0]
964 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
965 continue
966 }
967 v.reset(OpRotateLeft16)
968 v.AddArg2(x, y)
969 return true
970 }
971 break
972 }
973
974
975
976 for {
977 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
978 right := v_0
979 if right.Op != OpRsh16Ux64 {
980 continue
981 }
982 y := right.Args[1]
983 x := right.Args[0]
984 left := v_1
985 if left.Op != OpLsh16x64 {
986 continue
987 }
988 _ = left.Args[1]
989 if x != left.Args[0] {
990 continue
991 }
992 z := left.Args[1]
993 if z.Op != OpSub64 {
994 continue
995 }
996 _ = z.Args[1]
997 z_0 := z.Args[0]
998 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
999 continue
1000 }
1001 v.reset(OpRotateLeft16)
1002 v.AddArg2(x, z)
1003 return true
1004 }
1005 break
1006 }
1007
1008
1009
1010 for {
1011 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1012 right := v_0
1013 if right.Op != OpRsh16Ux32 {
1014 continue
1015 }
1016 y := right.Args[1]
1017 x := right.Args[0]
1018 left := v_1
1019 if left.Op != OpLsh16x32 {
1020 continue
1021 }
1022 _ = left.Args[1]
1023 if x != left.Args[0] {
1024 continue
1025 }
1026 z := left.Args[1]
1027 if z.Op != OpSub32 {
1028 continue
1029 }
1030 _ = z.Args[1]
1031 z_0 := z.Args[0]
1032 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1033 continue
1034 }
1035 v.reset(OpRotateLeft16)
1036 v.AddArg2(x, z)
1037 return true
1038 }
1039 break
1040 }
1041
1042
1043
1044 for {
1045 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1046 right := v_0
1047 if right.Op != OpRsh16Ux16 {
1048 continue
1049 }
1050 y := right.Args[1]
1051 x := right.Args[0]
1052 left := v_1
1053 if left.Op != OpLsh16x16 {
1054 continue
1055 }
1056 _ = left.Args[1]
1057 if x != left.Args[0] {
1058 continue
1059 }
1060 z := left.Args[1]
1061 if z.Op != OpSub16 {
1062 continue
1063 }
1064 _ = z.Args[1]
1065 z_0 := z.Args[0]
1066 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1067 continue
1068 }
1069 v.reset(OpRotateLeft16)
1070 v.AddArg2(x, z)
1071 return true
1072 }
1073 break
1074 }
1075
1076
1077
1078 for {
1079 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1080 right := v_0
1081 if right.Op != OpRsh16Ux8 {
1082 continue
1083 }
1084 y := right.Args[1]
1085 x := right.Args[0]
1086 left := v_1
1087 if left.Op != OpLsh16x8 {
1088 continue
1089 }
1090 _ = left.Args[1]
1091 if x != left.Args[0] {
1092 continue
1093 }
1094 z := left.Args[1]
1095 if z.Op != OpSub8 {
1096 continue
1097 }
1098 _ = z.Args[1]
1099 z_0 := z.Args[0]
1100 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
1101 continue
1102 }
1103 v.reset(OpRotateLeft16)
1104 v.AddArg2(x, z)
1105 return true
1106 }
1107 break
1108 }
1109 return false
1110 }
1111 func rewriteValuegeneric_OpAdd32(v *Value) bool {
1112 v_1 := v.Args[1]
1113 v_0 := v.Args[0]
1114 b := v.Block
1115 config := b.Func.Config
1116
1117
1118 for {
1119 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1120 if v_0.Op != OpConst32 {
1121 continue
1122 }
1123 c := auxIntToInt32(v_0.AuxInt)
1124 if v_1.Op != OpConst32 {
1125 continue
1126 }
1127 d := auxIntToInt32(v_1.AuxInt)
1128 v.reset(OpConst32)
1129 v.AuxInt = int32ToAuxInt(c + d)
1130 return true
1131 }
1132 break
1133 }
1134
1135
1136 for {
1137 t := v.Type
1138 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1139 if v_0.Op != OpMul32 {
1140 continue
1141 }
1142 _ = v_0.Args[1]
1143 v_0_0 := v_0.Args[0]
1144 v_0_1 := v_0.Args[1]
1145 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1146 x := v_0_0
1147 y := v_0_1
1148 if v_1.Op != OpMul32 {
1149 continue
1150 }
1151 _ = v_1.Args[1]
1152 v_1_0 := v_1.Args[0]
1153 v_1_1 := v_1.Args[1]
1154 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
1155 if x != v_1_0 {
1156 continue
1157 }
1158 z := v_1_1
1159 v.reset(OpMul32)
1160 v0 := b.NewValue0(v.Pos, OpAdd32, t)
1161 v0.AddArg2(y, z)
1162 v.AddArg2(x, v0)
1163 return true
1164 }
1165 }
1166 }
1167 break
1168 }
1169
1170
1171 for {
1172 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1173 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
1174 continue
1175 }
1176 x := v_1
1177 v.copyOf(x)
1178 return true
1179 }
1180 break
1181 }
1182
1183
1184 for {
1185 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1186 x := v_0
1187 if v_1.Op != OpNeg32 {
1188 continue
1189 }
1190 y := v_1.Args[0]
1191 v.reset(OpSub32)
1192 v.AddArg2(x, y)
1193 return true
1194 }
1195 break
1196 }
1197
1198
1199 for {
1200 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1201 if v_0.Op != OpCom32 {
1202 continue
1203 }
1204 x := v_0.Args[0]
1205 if x != v_1 {
1206 continue
1207 }
1208 v.reset(OpConst32)
1209 v.AuxInt = int32ToAuxInt(-1)
1210 return true
1211 }
1212 break
1213 }
1214
1215
1216 for {
1217 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1218 if v_0.Op != OpSub32 {
1219 continue
1220 }
1221 t := v_0.Args[1]
1222 x := v_0.Args[0]
1223 if v_1.Op != OpAdd32 {
1224 continue
1225 }
1226 _ = v_1.Args[1]
1227 v_1_0 := v_1.Args[0]
1228 v_1_1 := v_1.Args[1]
1229 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1230 if t != v_1_0 {
1231 continue
1232 }
1233 y := v_1_1
1234 v.reset(OpAdd32)
1235 v.AddArg2(x, y)
1236 return true
1237 }
1238 }
1239 break
1240 }
1241
1242
1243 for {
1244 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1245 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 || v_1.Op != OpCom32 {
1246 continue
1247 }
1248 x := v_1.Args[0]
1249 v.reset(OpNeg32)
1250 v.AddArg(x)
1251 return true
1252 }
1253 break
1254 }
1255
1256
1257 for {
1258 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1259 x := v_0
1260 if v_1.Op != OpSub32 {
1261 continue
1262 }
1263 _ = v_1.Args[1]
1264 y := v_1.Args[0]
1265 if x != v_1.Args[1] {
1266 continue
1267 }
1268 v.copyOf(y)
1269 return true
1270 }
1271 break
1272 }
1273
1274
1275 for {
1276 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1277 x := v_0
1278 if v_1.Op != OpAdd32 {
1279 continue
1280 }
1281 _ = v_1.Args[1]
1282 v_1_0 := v_1.Args[0]
1283 v_1_1 := v_1.Args[1]
1284 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1285 y := v_1_0
1286 if v_1_1.Op != OpSub32 {
1287 continue
1288 }
1289 _ = v_1_1.Args[1]
1290 z := v_1_1.Args[0]
1291 if x != v_1_1.Args[1] {
1292 continue
1293 }
1294 v.reset(OpAdd32)
1295 v.AddArg2(y, z)
1296 return true
1297 }
1298 }
1299 break
1300 }
1301
1302
1303
1304 for {
1305 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1306 if v_0.Op != OpAdd32 {
1307 continue
1308 }
1309 _ = v_0.Args[1]
1310 v_0_0 := v_0.Args[0]
1311 v_0_1 := v_0.Args[1]
1312 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1313 i := v_0_0
1314 if i.Op != OpConst32 {
1315 continue
1316 }
1317 t := i.Type
1318 z := v_0_1
1319 x := v_1
1320 if !(z.Op != OpConst32 && x.Op != OpConst32) {
1321 continue
1322 }
1323 v.reset(OpAdd32)
1324 v0 := b.NewValue0(v.Pos, OpAdd32, t)
1325 v0.AddArg2(z, x)
1326 v.AddArg2(i, v0)
1327 return true
1328 }
1329 }
1330 break
1331 }
1332
1333
1334
1335 for {
1336 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1337 if v_0.Op != OpSub32 {
1338 continue
1339 }
1340 z := v_0.Args[1]
1341 i := v_0.Args[0]
1342 if i.Op != OpConst32 {
1343 continue
1344 }
1345 t := i.Type
1346 x := v_1
1347 if !(z.Op != OpConst32 && x.Op != OpConst32) {
1348 continue
1349 }
1350 v.reset(OpAdd32)
1351 v0 := b.NewValue0(v.Pos, OpSub32, t)
1352 v0.AddArg2(x, z)
1353 v.AddArg2(i, v0)
1354 return true
1355 }
1356 break
1357 }
1358
1359
1360 for {
1361 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1362 if v_0.Op != OpConst32 {
1363 continue
1364 }
1365 t := v_0.Type
1366 c := auxIntToInt32(v_0.AuxInt)
1367 if v_1.Op != OpAdd32 {
1368 continue
1369 }
1370 _ = v_1.Args[1]
1371 v_1_0 := v_1.Args[0]
1372 v_1_1 := v_1.Args[1]
1373 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1374 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
1375 continue
1376 }
1377 d := auxIntToInt32(v_1_0.AuxInt)
1378 x := v_1_1
1379 v.reset(OpAdd32)
1380 v0 := b.NewValue0(v.Pos, OpConst32, t)
1381 v0.AuxInt = int32ToAuxInt(c + d)
1382 v.AddArg2(v0, x)
1383 return true
1384 }
1385 }
1386 break
1387 }
1388
1389
1390 for {
1391 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1392 if v_0.Op != OpConst32 {
1393 continue
1394 }
1395 t := v_0.Type
1396 c := auxIntToInt32(v_0.AuxInt)
1397 if v_1.Op != OpSub32 {
1398 continue
1399 }
1400 x := v_1.Args[1]
1401 v_1_0 := v_1.Args[0]
1402 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
1403 continue
1404 }
1405 d := auxIntToInt32(v_1_0.AuxInt)
1406 v.reset(OpSub32)
1407 v0 := b.NewValue0(v.Pos, OpConst32, t)
1408 v0.AuxInt = int32ToAuxInt(c + d)
1409 v.AddArg2(v0, x)
1410 return true
1411 }
1412 break
1413 }
1414
1415
1416
1417 for {
1418 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1419 if v_0.Op != OpLsh32x64 {
1420 continue
1421 }
1422 _ = v_0.Args[1]
1423 x := v_0.Args[0]
1424 z := v_0.Args[1]
1425 if z.Op != OpConst64 {
1426 continue
1427 }
1428 c := auxIntToInt64(z.AuxInt)
1429 if v_1.Op != OpRsh32Ux64 {
1430 continue
1431 }
1432 _ = v_1.Args[1]
1433 if x != v_1.Args[0] {
1434 continue
1435 }
1436 v_1_1 := v_1.Args[1]
1437 if v_1_1.Op != OpConst64 {
1438 continue
1439 }
1440 d := auxIntToInt64(v_1_1.AuxInt)
1441 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
1442 continue
1443 }
1444 v.reset(OpRotateLeft32)
1445 v.AddArg2(x, z)
1446 return true
1447 }
1448 break
1449 }
1450
1451
1452
1453 for {
1454 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1455 left := v_0
1456 if left.Op != OpLsh32x64 {
1457 continue
1458 }
1459 y := left.Args[1]
1460 x := left.Args[0]
1461 right := v_1
1462 if right.Op != OpRsh32Ux64 {
1463 continue
1464 }
1465 _ = right.Args[1]
1466 if x != right.Args[0] {
1467 continue
1468 }
1469 right_1 := right.Args[1]
1470 if right_1.Op != OpSub64 {
1471 continue
1472 }
1473 _ = right_1.Args[1]
1474 right_1_0 := right_1.Args[0]
1475 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1476 continue
1477 }
1478 v.reset(OpRotateLeft32)
1479 v.AddArg2(x, y)
1480 return true
1481 }
1482 break
1483 }
1484
1485
1486
1487 for {
1488 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1489 left := v_0
1490 if left.Op != OpLsh32x32 {
1491 continue
1492 }
1493 y := left.Args[1]
1494 x := left.Args[0]
1495 right := v_1
1496 if right.Op != OpRsh32Ux32 {
1497 continue
1498 }
1499 _ = right.Args[1]
1500 if x != right.Args[0] {
1501 continue
1502 }
1503 right_1 := right.Args[1]
1504 if right_1.Op != OpSub32 {
1505 continue
1506 }
1507 _ = right_1.Args[1]
1508 right_1_0 := right_1.Args[0]
1509 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1510 continue
1511 }
1512 v.reset(OpRotateLeft32)
1513 v.AddArg2(x, y)
1514 return true
1515 }
1516 break
1517 }
1518
1519
1520
1521 for {
1522 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1523 left := v_0
1524 if left.Op != OpLsh32x16 {
1525 continue
1526 }
1527 y := left.Args[1]
1528 x := left.Args[0]
1529 right := v_1
1530 if right.Op != OpRsh32Ux16 {
1531 continue
1532 }
1533 _ = right.Args[1]
1534 if x != right.Args[0] {
1535 continue
1536 }
1537 right_1 := right.Args[1]
1538 if right_1.Op != OpSub16 {
1539 continue
1540 }
1541 _ = right_1.Args[1]
1542 right_1_0 := right_1.Args[0]
1543 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1544 continue
1545 }
1546 v.reset(OpRotateLeft32)
1547 v.AddArg2(x, y)
1548 return true
1549 }
1550 break
1551 }
1552
1553
1554
1555 for {
1556 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1557 left := v_0
1558 if left.Op != OpLsh32x8 {
1559 continue
1560 }
1561 y := left.Args[1]
1562 x := left.Args[0]
1563 right := v_1
1564 if right.Op != OpRsh32Ux8 {
1565 continue
1566 }
1567 _ = right.Args[1]
1568 if x != right.Args[0] {
1569 continue
1570 }
1571 right_1 := right.Args[1]
1572 if right_1.Op != OpSub8 {
1573 continue
1574 }
1575 _ = right_1.Args[1]
1576 right_1_0 := right_1.Args[0]
1577 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1578 continue
1579 }
1580 v.reset(OpRotateLeft32)
1581 v.AddArg2(x, y)
1582 return true
1583 }
1584 break
1585 }
1586
1587
1588
1589 for {
1590 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1591 right := v_0
1592 if right.Op != OpRsh32Ux64 {
1593 continue
1594 }
1595 y := right.Args[1]
1596 x := right.Args[0]
1597 left := v_1
1598 if left.Op != OpLsh32x64 {
1599 continue
1600 }
1601 _ = left.Args[1]
1602 if x != left.Args[0] {
1603 continue
1604 }
1605 z := left.Args[1]
1606 if z.Op != OpSub64 {
1607 continue
1608 }
1609 _ = z.Args[1]
1610 z_0 := z.Args[0]
1611 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1612 continue
1613 }
1614 v.reset(OpRotateLeft32)
1615 v.AddArg2(x, z)
1616 return true
1617 }
1618 break
1619 }
1620
1621
1622
1623 for {
1624 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1625 right := v_0
1626 if right.Op != OpRsh32Ux32 {
1627 continue
1628 }
1629 y := right.Args[1]
1630 x := right.Args[0]
1631 left := v_1
1632 if left.Op != OpLsh32x32 {
1633 continue
1634 }
1635 _ = left.Args[1]
1636 if x != left.Args[0] {
1637 continue
1638 }
1639 z := left.Args[1]
1640 if z.Op != OpSub32 {
1641 continue
1642 }
1643 _ = z.Args[1]
1644 z_0 := z.Args[0]
1645 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1646 continue
1647 }
1648 v.reset(OpRotateLeft32)
1649 v.AddArg2(x, z)
1650 return true
1651 }
1652 break
1653 }
1654
1655
1656
1657 for {
1658 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1659 right := v_0
1660 if right.Op != OpRsh32Ux16 {
1661 continue
1662 }
1663 y := right.Args[1]
1664 x := right.Args[0]
1665 left := v_1
1666 if left.Op != OpLsh32x16 {
1667 continue
1668 }
1669 _ = left.Args[1]
1670 if x != left.Args[0] {
1671 continue
1672 }
1673 z := left.Args[1]
1674 if z.Op != OpSub16 {
1675 continue
1676 }
1677 _ = z.Args[1]
1678 z_0 := z.Args[0]
1679 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1680 continue
1681 }
1682 v.reset(OpRotateLeft32)
1683 v.AddArg2(x, z)
1684 return true
1685 }
1686 break
1687 }
1688
1689
1690
1691 for {
1692 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1693 right := v_0
1694 if right.Op != OpRsh32Ux8 {
1695 continue
1696 }
1697 y := right.Args[1]
1698 x := right.Args[0]
1699 left := v_1
1700 if left.Op != OpLsh32x8 {
1701 continue
1702 }
1703 _ = left.Args[1]
1704 if x != left.Args[0] {
1705 continue
1706 }
1707 z := left.Args[1]
1708 if z.Op != OpSub8 {
1709 continue
1710 }
1711 _ = z.Args[1]
1712 z_0 := z.Args[0]
1713 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
1714 continue
1715 }
1716 v.reset(OpRotateLeft32)
1717 v.AddArg2(x, z)
1718 return true
1719 }
1720 break
1721 }
1722 return false
1723 }
1724 func rewriteValuegeneric_OpAdd32F(v *Value) bool {
1725 v_1 := v.Args[1]
1726 v_0 := v.Args[0]
1727
1728
1729
1730 for {
1731 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1732 if v_0.Op != OpConst32F {
1733 continue
1734 }
1735 c := auxIntToFloat32(v_0.AuxInt)
1736 if v_1.Op != OpConst32F {
1737 continue
1738 }
1739 d := auxIntToFloat32(v_1.AuxInt)
1740 if !(c+d == c+d) {
1741 continue
1742 }
1743 v.reset(OpConst32F)
1744 v.AuxInt = float32ToAuxInt(c + d)
1745 return true
1746 }
1747 break
1748 }
1749 return false
1750 }
1751 func rewriteValuegeneric_OpAdd64(v *Value) bool {
1752 v_1 := v.Args[1]
1753 v_0 := v.Args[0]
1754 b := v.Block
1755 config := b.Func.Config
1756
1757
1758 for {
1759 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1760 if v_0.Op != OpConst64 {
1761 continue
1762 }
1763 c := auxIntToInt64(v_0.AuxInt)
1764 if v_1.Op != OpConst64 {
1765 continue
1766 }
1767 d := auxIntToInt64(v_1.AuxInt)
1768 v.reset(OpConst64)
1769 v.AuxInt = int64ToAuxInt(c + d)
1770 return true
1771 }
1772 break
1773 }
1774
1775
1776 for {
1777 t := v.Type
1778 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1779 if v_0.Op != OpMul64 {
1780 continue
1781 }
1782 _ = v_0.Args[1]
1783 v_0_0 := v_0.Args[0]
1784 v_0_1 := v_0.Args[1]
1785 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1786 x := v_0_0
1787 y := v_0_1
1788 if v_1.Op != OpMul64 {
1789 continue
1790 }
1791 _ = v_1.Args[1]
1792 v_1_0 := v_1.Args[0]
1793 v_1_1 := v_1.Args[1]
1794 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
1795 if x != v_1_0 {
1796 continue
1797 }
1798 z := v_1_1
1799 v.reset(OpMul64)
1800 v0 := b.NewValue0(v.Pos, OpAdd64, t)
1801 v0.AddArg2(y, z)
1802 v.AddArg2(x, v0)
1803 return true
1804 }
1805 }
1806 }
1807 break
1808 }
1809
1810
1811 for {
1812 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1813 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
1814 continue
1815 }
1816 x := v_1
1817 v.copyOf(x)
1818 return true
1819 }
1820 break
1821 }
1822
1823
1824 for {
1825 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1826 x := v_0
1827 if v_1.Op != OpNeg64 {
1828 continue
1829 }
1830 y := v_1.Args[0]
1831 v.reset(OpSub64)
1832 v.AddArg2(x, y)
1833 return true
1834 }
1835 break
1836 }
1837
1838
1839 for {
1840 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1841 if v_0.Op != OpCom64 {
1842 continue
1843 }
1844 x := v_0.Args[0]
1845 if x != v_1 {
1846 continue
1847 }
1848 v.reset(OpConst64)
1849 v.AuxInt = int64ToAuxInt(-1)
1850 return true
1851 }
1852 break
1853 }
1854
1855
1856 for {
1857 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1858 if v_0.Op != OpSub64 {
1859 continue
1860 }
1861 t := v_0.Args[1]
1862 x := v_0.Args[0]
1863 if v_1.Op != OpAdd64 {
1864 continue
1865 }
1866 _ = v_1.Args[1]
1867 v_1_0 := v_1.Args[0]
1868 v_1_1 := v_1.Args[1]
1869 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1870 if t != v_1_0 {
1871 continue
1872 }
1873 y := v_1_1
1874 v.reset(OpAdd64)
1875 v.AddArg2(x, y)
1876 return true
1877 }
1878 }
1879 break
1880 }
1881
1882
1883 for {
1884 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1885 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 || v_1.Op != OpCom64 {
1886 continue
1887 }
1888 x := v_1.Args[0]
1889 v.reset(OpNeg64)
1890 v.AddArg(x)
1891 return true
1892 }
1893 break
1894 }
1895
1896
1897 for {
1898 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1899 x := v_0
1900 if v_1.Op != OpSub64 {
1901 continue
1902 }
1903 _ = v_1.Args[1]
1904 y := v_1.Args[0]
1905 if x != v_1.Args[1] {
1906 continue
1907 }
1908 v.copyOf(y)
1909 return true
1910 }
1911 break
1912 }
1913
1914
1915 for {
1916 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1917 x := v_0
1918 if v_1.Op != OpAdd64 {
1919 continue
1920 }
1921 _ = v_1.Args[1]
1922 v_1_0 := v_1.Args[0]
1923 v_1_1 := v_1.Args[1]
1924 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
1925 y := v_1_0
1926 if v_1_1.Op != OpSub64 {
1927 continue
1928 }
1929 _ = v_1_1.Args[1]
1930 z := v_1_1.Args[0]
1931 if x != v_1_1.Args[1] {
1932 continue
1933 }
1934 v.reset(OpAdd64)
1935 v.AddArg2(y, z)
1936 return true
1937 }
1938 }
1939 break
1940 }
1941
1942
1943
1944 for {
1945 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1946 if v_0.Op != OpAdd64 {
1947 continue
1948 }
1949 _ = v_0.Args[1]
1950 v_0_0 := v_0.Args[0]
1951 v_0_1 := v_0.Args[1]
1952 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
1953 i := v_0_0
1954 if i.Op != OpConst64 {
1955 continue
1956 }
1957 t := i.Type
1958 z := v_0_1
1959 x := v_1
1960 if !(z.Op != OpConst64 && x.Op != OpConst64) {
1961 continue
1962 }
1963 v.reset(OpAdd64)
1964 v0 := b.NewValue0(v.Pos, OpAdd64, t)
1965 v0.AddArg2(z, x)
1966 v.AddArg2(i, v0)
1967 return true
1968 }
1969 }
1970 break
1971 }
1972
1973
1974
1975 for {
1976 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1977 if v_0.Op != OpSub64 {
1978 continue
1979 }
1980 z := v_0.Args[1]
1981 i := v_0.Args[0]
1982 if i.Op != OpConst64 {
1983 continue
1984 }
1985 t := i.Type
1986 x := v_1
1987 if !(z.Op != OpConst64 && x.Op != OpConst64) {
1988 continue
1989 }
1990 v.reset(OpAdd64)
1991 v0 := b.NewValue0(v.Pos, OpSub64, t)
1992 v0.AddArg2(x, z)
1993 v.AddArg2(i, v0)
1994 return true
1995 }
1996 break
1997 }
1998
1999
2000 for {
2001 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2002 if v_0.Op != OpConst64 {
2003 continue
2004 }
2005 t := v_0.Type
2006 c := auxIntToInt64(v_0.AuxInt)
2007 if v_1.Op != OpAdd64 {
2008 continue
2009 }
2010 _ = v_1.Args[1]
2011 v_1_0 := v_1.Args[0]
2012 v_1_1 := v_1.Args[1]
2013 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2014 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
2015 continue
2016 }
2017 d := auxIntToInt64(v_1_0.AuxInt)
2018 x := v_1_1
2019 v.reset(OpAdd64)
2020 v0 := b.NewValue0(v.Pos, OpConst64, t)
2021 v0.AuxInt = int64ToAuxInt(c + d)
2022 v.AddArg2(v0, x)
2023 return true
2024 }
2025 }
2026 break
2027 }
2028
2029
2030 for {
2031 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2032 if v_0.Op != OpConst64 {
2033 continue
2034 }
2035 t := v_0.Type
2036 c := auxIntToInt64(v_0.AuxInt)
2037 if v_1.Op != OpSub64 {
2038 continue
2039 }
2040 x := v_1.Args[1]
2041 v_1_0 := v_1.Args[0]
2042 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
2043 continue
2044 }
2045 d := auxIntToInt64(v_1_0.AuxInt)
2046 v.reset(OpSub64)
2047 v0 := b.NewValue0(v.Pos, OpConst64, t)
2048 v0.AuxInt = int64ToAuxInt(c + d)
2049 v.AddArg2(v0, x)
2050 return true
2051 }
2052 break
2053 }
2054
2055
2056
2057 for {
2058 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2059 if v_0.Op != OpLsh64x64 {
2060 continue
2061 }
2062 _ = v_0.Args[1]
2063 x := v_0.Args[0]
2064 z := v_0.Args[1]
2065 if z.Op != OpConst64 {
2066 continue
2067 }
2068 c := auxIntToInt64(z.AuxInt)
2069 if v_1.Op != OpRsh64Ux64 {
2070 continue
2071 }
2072 _ = v_1.Args[1]
2073 if x != v_1.Args[0] {
2074 continue
2075 }
2076 v_1_1 := v_1.Args[1]
2077 if v_1_1.Op != OpConst64 {
2078 continue
2079 }
2080 d := auxIntToInt64(v_1_1.AuxInt)
2081 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
2082 continue
2083 }
2084 v.reset(OpRotateLeft64)
2085 v.AddArg2(x, z)
2086 return true
2087 }
2088 break
2089 }
2090
2091
2092
2093 for {
2094 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2095 left := v_0
2096 if left.Op != OpLsh64x64 {
2097 continue
2098 }
2099 y := left.Args[1]
2100 x := left.Args[0]
2101 right := v_1
2102 if right.Op != OpRsh64Ux64 {
2103 continue
2104 }
2105 _ = right.Args[1]
2106 if x != right.Args[0] {
2107 continue
2108 }
2109 right_1 := right.Args[1]
2110 if right_1.Op != OpSub64 {
2111 continue
2112 }
2113 _ = right_1.Args[1]
2114 right_1_0 := right_1.Args[0]
2115 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2116 continue
2117 }
2118 v.reset(OpRotateLeft64)
2119 v.AddArg2(x, y)
2120 return true
2121 }
2122 break
2123 }
2124
2125
2126
2127 for {
2128 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2129 left := v_0
2130 if left.Op != OpLsh64x32 {
2131 continue
2132 }
2133 y := left.Args[1]
2134 x := left.Args[0]
2135 right := v_1
2136 if right.Op != OpRsh64Ux32 {
2137 continue
2138 }
2139 _ = right.Args[1]
2140 if x != right.Args[0] {
2141 continue
2142 }
2143 right_1 := right.Args[1]
2144 if right_1.Op != OpSub32 {
2145 continue
2146 }
2147 _ = right_1.Args[1]
2148 right_1_0 := right_1.Args[0]
2149 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2150 continue
2151 }
2152 v.reset(OpRotateLeft64)
2153 v.AddArg2(x, y)
2154 return true
2155 }
2156 break
2157 }
2158
2159
2160
2161 for {
2162 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2163 left := v_0
2164 if left.Op != OpLsh64x16 {
2165 continue
2166 }
2167 y := left.Args[1]
2168 x := left.Args[0]
2169 right := v_1
2170 if right.Op != OpRsh64Ux16 {
2171 continue
2172 }
2173 _ = right.Args[1]
2174 if x != right.Args[0] {
2175 continue
2176 }
2177 right_1 := right.Args[1]
2178 if right_1.Op != OpSub16 {
2179 continue
2180 }
2181 _ = right_1.Args[1]
2182 right_1_0 := right_1.Args[0]
2183 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2184 continue
2185 }
2186 v.reset(OpRotateLeft64)
2187 v.AddArg2(x, y)
2188 return true
2189 }
2190 break
2191 }
2192
2193
2194
2195 for {
2196 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2197 left := v_0
2198 if left.Op != OpLsh64x8 {
2199 continue
2200 }
2201 y := left.Args[1]
2202 x := left.Args[0]
2203 right := v_1
2204 if right.Op != OpRsh64Ux8 {
2205 continue
2206 }
2207 _ = right.Args[1]
2208 if x != right.Args[0] {
2209 continue
2210 }
2211 right_1 := right.Args[1]
2212 if right_1.Op != OpSub8 {
2213 continue
2214 }
2215 _ = right_1.Args[1]
2216 right_1_0 := right_1.Args[0]
2217 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2218 continue
2219 }
2220 v.reset(OpRotateLeft64)
2221 v.AddArg2(x, y)
2222 return true
2223 }
2224 break
2225 }
2226
2227
2228
2229 for {
2230 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2231 right := v_0
2232 if right.Op != OpRsh64Ux64 {
2233 continue
2234 }
2235 y := right.Args[1]
2236 x := right.Args[0]
2237 left := v_1
2238 if left.Op != OpLsh64x64 {
2239 continue
2240 }
2241 _ = left.Args[1]
2242 if x != left.Args[0] {
2243 continue
2244 }
2245 z := left.Args[1]
2246 if z.Op != OpSub64 {
2247 continue
2248 }
2249 _ = z.Args[1]
2250 z_0 := z.Args[0]
2251 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2252 continue
2253 }
2254 v.reset(OpRotateLeft64)
2255 v.AddArg2(x, z)
2256 return true
2257 }
2258 break
2259 }
2260
2261
2262
2263 for {
2264 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2265 right := v_0
2266 if right.Op != OpRsh64Ux32 {
2267 continue
2268 }
2269 y := right.Args[1]
2270 x := right.Args[0]
2271 left := v_1
2272 if left.Op != OpLsh64x32 {
2273 continue
2274 }
2275 _ = left.Args[1]
2276 if x != left.Args[0] {
2277 continue
2278 }
2279 z := left.Args[1]
2280 if z.Op != OpSub32 {
2281 continue
2282 }
2283 _ = z.Args[1]
2284 z_0 := z.Args[0]
2285 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2286 continue
2287 }
2288 v.reset(OpRotateLeft64)
2289 v.AddArg2(x, z)
2290 return true
2291 }
2292 break
2293 }
2294
2295
2296
2297 for {
2298 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2299 right := v_0
2300 if right.Op != OpRsh64Ux16 {
2301 continue
2302 }
2303 y := right.Args[1]
2304 x := right.Args[0]
2305 left := v_1
2306 if left.Op != OpLsh64x16 {
2307 continue
2308 }
2309 _ = left.Args[1]
2310 if x != left.Args[0] {
2311 continue
2312 }
2313 z := left.Args[1]
2314 if z.Op != OpSub16 {
2315 continue
2316 }
2317 _ = z.Args[1]
2318 z_0 := z.Args[0]
2319 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2320 continue
2321 }
2322 v.reset(OpRotateLeft64)
2323 v.AddArg2(x, z)
2324 return true
2325 }
2326 break
2327 }
2328
2329
2330
2331 for {
2332 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2333 right := v_0
2334 if right.Op != OpRsh64Ux8 {
2335 continue
2336 }
2337 y := right.Args[1]
2338 x := right.Args[0]
2339 left := v_1
2340 if left.Op != OpLsh64x8 {
2341 continue
2342 }
2343 _ = left.Args[1]
2344 if x != left.Args[0] {
2345 continue
2346 }
2347 z := left.Args[1]
2348 if z.Op != OpSub8 {
2349 continue
2350 }
2351 _ = z.Args[1]
2352 z_0 := z.Args[0]
2353 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
2354 continue
2355 }
2356 v.reset(OpRotateLeft64)
2357 v.AddArg2(x, z)
2358 return true
2359 }
2360 break
2361 }
2362 return false
2363 }
2364 func rewriteValuegeneric_OpAdd64F(v *Value) bool {
2365 v_1 := v.Args[1]
2366 v_0 := v.Args[0]
2367
2368
2369
2370 for {
2371 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2372 if v_0.Op != OpConst64F {
2373 continue
2374 }
2375 c := auxIntToFloat64(v_0.AuxInt)
2376 if v_1.Op != OpConst64F {
2377 continue
2378 }
2379 d := auxIntToFloat64(v_1.AuxInt)
2380 if !(c+d == c+d) {
2381 continue
2382 }
2383 v.reset(OpConst64F)
2384 v.AuxInt = float64ToAuxInt(c + d)
2385 return true
2386 }
2387 break
2388 }
2389 return false
2390 }
2391 func rewriteValuegeneric_OpAdd64carry(v *Value) bool {
2392 v_2 := v.Args[2]
2393 v_1 := v.Args[1]
2394 v_0 := v.Args[0]
2395 b := v.Block
2396
2397
2398
2399 for {
2400 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2401 if v_0.Op != OpConst64 {
2402 continue
2403 }
2404 t := v_0.Type
2405 x := auxIntToInt64(v_0.AuxInt)
2406 if v_1.Op != OpConst64 {
2407 continue
2408 }
2409 y := auxIntToInt64(v_1.AuxInt)
2410 if v_2.Op != OpConst64 {
2411 continue
2412 }
2413 c := auxIntToInt64(v_2.AuxInt)
2414 if !(c >= 0 && c <= 1) {
2415 continue
2416 }
2417 v.reset(OpMakeTuple)
2418 v0 := b.NewValue0(v.Pos, OpConst64, t)
2419 v0.AuxInt = int64ToAuxInt(bitsAdd64(x, y, c).sum)
2420 v1 := b.NewValue0(v.Pos, OpConst64, t)
2421 v1.AuxInt = int64ToAuxInt(bitsAdd64(x, y, c).carry)
2422 v.AddArg2(v0, v1)
2423 return true
2424 }
2425 break
2426 }
2427 return false
2428 }
2429 func rewriteValuegeneric_OpAdd8(v *Value) bool {
2430 v_1 := v.Args[1]
2431 v_0 := v.Args[0]
2432 b := v.Block
2433 config := b.Func.Config
2434
2435
2436 for {
2437 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2438 if v_0.Op != OpConst8 {
2439 continue
2440 }
2441 c := auxIntToInt8(v_0.AuxInt)
2442 if v_1.Op != OpConst8 {
2443 continue
2444 }
2445 d := auxIntToInt8(v_1.AuxInt)
2446 v.reset(OpConst8)
2447 v.AuxInt = int8ToAuxInt(c + d)
2448 return true
2449 }
2450 break
2451 }
2452
2453
2454 for {
2455 t := v.Type
2456 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2457 if v_0.Op != OpMul8 {
2458 continue
2459 }
2460 _ = v_0.Args[1]
2461 v_0_0 := v_0.Args[0]
2462 v_0_1 := v_0.Args[1]
2463 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
2464 x := v_0_0
2465 y := v_0_1
2466 if v_1.Op != OpMul8 {
2467 continue
2468 }
2469 _ = v_1.Args[1]
2470 v_1_0 := v_1.Args[0]
2471 v_1_1 := v_1.Args[1]
2472 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
2473 if x != v_1_0 {
2474 continue
2475 }
2476 z := v_1_1
2477 v.reset(OpMul8)
2478 v0 := b.NewValue0(v.Pos, OpAdd8, t)
2479 v0.AddArg2(y, z)
2480 v.AddArg2(x, v0)
2481 return true
2482 }
2483 }
2484 }
2485 break
2486 }
2487
2488
2489 for {
2490 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2491 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
2492 continue
2493 }
2494 x := v_1
2495 v.copyOf(x)
2496 return true
2497 }
2498 break
2499 }
2500
2501
2502 for {
2503 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2504 x := v_0
2505 if v_1.Op != OpNeg8 {
2506 continue
2507 }
2508 y := v_1.Args[0]
2509 v.reset(OpSub8)
2510 v.AddArg2(x, y)
2511 return true
2512 }
2513 break
2514 }
2515
2516
2517 for {
2518 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2519 if v_0.Op != OpCom8 {
2520 continue
2521 }
2522 x := v_0.Args[0]
2523 if x != v_1 {
2524 continue
2525 }
2526 v.reset(OpConst8)
2527 v.AuxInt = int8ToAuxInt(-1)
2528 return true
2529 }
2530 break
2531 }
2532
2533
2534 for {
2535 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2536 if v_0.Op != OpSub8 {
2537 continue
2538 }
2539 t := v_0.Args[1]
2540 x := v_0.Args[0]
2541 if v_1.Op != OpAdd8 {
2542 continue
2543 }
2544 _ = v_1.Args[1]
2545 v_1_0 := v_1.Args[0]
2546 v_1_1 := v_1.Args[1]
2547 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2548 if t != v_1_0 {
2549 continue
2550 }
2551 y := v_1_1
2552 v.reset(OpAdd8)
2553 v.AddArg2(x, y)
2554 return true
2555 }
2556 }
2557 break
2558 }
2559
2560
2561 for {
2562 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2563 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 1 || v_1.Op != OpCom8 {
2564 continue
2565 }
2566 x := v_1.Args[0]
2567 v.reset(OpNeg8)
2568 v.AddArg(x)
2569 return true
2570 }
2571 break
2572 }
2573
2574
2575 for {
2576 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2577 x := v_0
2578 if v_1.Op != OpSub8 {
2579 continue
2580 }
2581 _ = v_1.Args[1]
2582 y := v_1.Args[0]
2583 if x != v_1.Args[1] {
2584 continue
2585 }
2586 v.copyOf(y)
2587 return true
2588 }
2589 break
2590 }
2591
2592
2593 for {
2594 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2595 x := v_0
2596 if v_1.Op != OpAdd8 {
2597 continue
2598 }
2599 _ = v_1.Args[1]
2600 v_1_0 := v_1.Args[0]
2601 v_1_1 := v_1.Args[1]
2602 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2603 y := v_1_0
2604 if v_1_1.Op != OpSub8 {
2605 continue
2606 }
2607 _ = v_1_1.Args[1]
2608 z := v_1_1.Args[0]
2609 if x != v_1_1.Args[1] {
2610 continue
2611 }
2612 v.reset(OpAdd8)
2613 v.AddArg2(y, z)
2614 return true
2615 }
2616 }
2617 break
2618 }
2619
2620
2621
2622 for {
2623 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2624 if v_0.Op != OpAdd8 {
2625 continue
2626 }
2627 _ = v_0.Args[1]
2628 v_0_0 := v_0.Args[0]
2629 v_0_1 := v_0.Args[1]
2630 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
2631 i := v_0_0
2632 if i.Op != OpConst8 {
2633 continue
2634 }
2635 t := i.Type
2636 z := v_0_1
2637 x := v_1
2638 if !(z.Op != OpConst8 && x.Op != OpConst8) {
2639 continue
2640 }
2641 v.reset(OpAdd8)
2642 v0 := b.NewValue0(v.Pos, OpAdd8, t)
2643 v0.AddArg2(z, x)
2644 v.AddArg2(i, v0)
2645 return true
2646 }
2647 }
2648 break
2649 }
2650
2651
2652
2653 for {
2654 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2655 if v_0.Op != OpSub8 {
2656 continue
2657 }
2658 z := v_0.Args[1]
2659 i := v_0.Args[0]
2660 if i.Op != OpConst8 {
2661 continue
2662 }
2663 t := i.Type
2664 x := v_1
2665 if !(z.Op != OpConst8 && x.Op != OpConst8) {
2666 continue
2667 }
2668 v.reset(OpAdd8)
2669 v0 := b.NewValue0(v.Pos, OpSub8, t)
2670 v0.AddArg2(x, z)
2671 v.AddArg2(i, v0)
2672 return true
2673 }
2674 break
2675 }
2676
2677
2678 for {
2679 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2680 if v_0.Op != OpConst8 {
2681 continue
2682 }
2683 t := v_0.Type
2684 c := auxIntToInt8(v_0.AuxInt)
2685 if v_1.Op != OpAdd8 {
2686 continue
2687 }
2688 _ = v_1.Args[1]
2689 v_1_0 := v_1.Args[0]
2690 v_1_1 := v_1.Args[1]
2691 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
2692 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
2693 continue
2694 }
2695 d := auxIntToInt8(v_1_0.AuxInt)
2696 x := v_1_1
2697 v.reset(OpAdd8)
2698 v0 := b.NewValue0(v.Pos, OpConst8, t)
2699 v0.AuxInt = int8ToAuxInt(c + d)
2700 v.AddArg2(v0, x)
2701 return true
2702 }
2703 }
2704 break
2705 }
2706
2707
2708 for {
2709 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2710 if v_0.Op != OpConst8 {
2711 continue
2712 }
2713 t := v_0.Type
2714 c := auxIntToInt8(v_0.AuxInt)
2715 if v_1.Op != OpSub8 {
2716 continue
2717 }
2718 x := v_1.Args[1]
2719 v_1_0 := v_1.Args[0]
2720 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
2721 continue
2722 }
2723 d := auxIntToInt8(v_1_0.AuxInt)
2724 v.reset(OpSub8)
2725 v0 := b.NewValue0(v.Pos, OpConst8, t)
2726 v0.AuxInt = int8ToAuxInt(c + d)
2727 v.AddArg2(v0, x)
2728 return true
2729 }
2730 break
2731 }
2732
2733
2734
2735 for {
2736 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2737 if v_0.Op != OpLsh8x64 {
2738 continue
2739 }
2740 _ = v_0.Args[1]
2741 x := v_0.Args[0]
2742 z := v_0.Args[1]
2743 if z.Op != OpConst64 {
2744 continue
2745 }
2746 c := auxIntToInt64(z.AuxInt)
2747 if v_1.Op != OpRsh8Ux64 {
2748 continue
2749 }
2750 _ = v_1.Args[1]
2751 if x != v_1.Args[0] {
2752 continue
2753 }
2754 v_1_1 := v_1.Args[1]
2755 if v_1_1.Op != OpConst64 {
2756 continue
2757 }
2758 d := auxIntToInt64(v_1_1.AuxInt)
2759 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
2760 continue
2761 }
2762 v.reset(OpRotateLeft8)
2763 v.AddArg2(x, z)
2764 return true
2765 }
2766 break
2767 }
2768
2769
2770
2771 for {
2772 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2773 left := v_0
2774 if left.Op != OpLsh8x64 {
2775 continue
2776 }
2777 y := left.Args[1]
2778 x := left.Args[0]
2779 right := v_1
2780 if right.Op != OpRsh8Ux64 {
2781 continue
2782 }
2783 _ = right.Args[1]
2784 if x != right.Args[0] {
2785 continue
2786 }
2787 right_1 := right.Args[1]
2788 if right_1.Op != OpSub64 {
2789 continue
2790 }
2791 _ = right_1.Args[1]
2792 right_1_0 := right_1.Args[0]
2793 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2794 continue
2795 }
2796 v.reset(OpRotateLeft8)
2797 v.AddArg2(x, y)
2798 return true
2799 }
2800 break
2801 }
2802
2803
2804
2805 for {
2806 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2807 left := v_0
2808 if left.Op != OpLsh8x32 {
2809 continue
2810 }
2811 y := left.Args[1]
2812 x := left.Args[0]
2813 right := v_1
2814 if right.Op != OpRsh8Ux32 {
2815 continue
2816 }
2817 _ = right.Args[1]
2818 if x != right.Args[0] {
2819 continue
2820 }
2821 right_1 := right.Args[1]
2822 if right_1.Op != OpSub32 {
2823 continue
2824 }
2825 _ = right_1.Args[1]
2826 right_1_0 := right_1.Args[0]
2827 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2828 continue
2829 }
2830 v.reset(OpRotateLeft8)
2831 v.AddArg2(x, y)
2832 return true
2833 }
2834 break
2835 }
2836
2837
2838
2839 for {
2840 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2841 left := v_0
2842 if left.Op != OpLsh8x16 {
2843 continue
2844 }
2845 y := left.Args[1]
2846 x := left.Args[0]
2847 right := v_1
2848 if right.Op != OpRsh8Ux16 {
2849 continue
2850 }
2851 _ = right.Args[1]
2852 if x != right.Args[0] {
2853 continue
2854 }
2855 right_1 := right.Args[1]
2856 if right_1.Op != OpSub16 {
2857 continue
2858 }
2859 _ = right_1.Args[1]
2860 right_1_0 := right_1.Args[0]
2861 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2862 continue
2863 }
2864 v.reset(OpRotateLeft8)
2865 v.AddArg2(x, y)
2866 return true
2867 }
2868 break
2869 }
2870
2871
2872
2873 for {
2874 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2875 left := v_0
2876 if left.Op != OpLsh8x8 {
2877 continue
2878 }
2879 y := left.Args[1]
2880 x := left.Args[0]
2881 right := v_1
2882 if right.Op != OpRsh8Ux8 {
2883 continue
2884 }
2885 _ = right.Args[1]
2886 if x != right.Args[0] {
2887 continue
2888 }
2889 right_1 := right.Args[1]
2890 if right_1.Op != OpSub8 {
2891 continue
2892 }
2893 _ = right_1.Args[1]
2894 right_1_0 := right_1.Args[0]
2895 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2896 continue
2897 }
2898 v.reset(OpRotateLeft8)
2899 v.AddArg2(x, y)
2900 return true
2901 }
2902 break
2903 }
2904
2905
2906
2907 for {
2908 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2909 right := v_0
2910 if right.Op != OpRsh8Ux64 {
2911 continue
2912 }
2913 y := right.Args[1]
2914 x := right.Args[0]
2915 left := v_1
2916 if left.Op != OpLsh8x64 {
2917 continue
2918 }
2919 _ = left.Args[1]
2920 if x != left.Args[0] {
2921 continue
2922 }
2923 z := left.Args[1]
2924 if z.Op != OpSub64 {
2925 continue
2926 }
2927 _ = z.Args[1]
2928 z_0 := z.Args[0]
2929 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2930 continue
2931 }
2932 v.reset(OpRotateLeft8)
2933 v.AddArg2(x, z)
2934 return true
2935 }
2936 break
2937 }
2938
2939
2940
2941 for {
2942 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2943 right := v_0
2944 if right.Op != OpRsh8Ux32 {
2945 continue
2946 }
2947 y := right.Args[1]
2948 x := right.Args[0]
2949 left := v_1
2950 if left.Op != OpLsh8x32 {
2951 continue
2952 }
2953 _ = left.Args[1]
2954 if x != left.Args[0] {
2955 continue
2956 }
2957 z := left.Args[1]
2958 if z.Op != OpSub32 {
2959 continue
2960 }
2961 _ = z.Args[1]
2962 z_0 := z.Args[0]
2963 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2964 continue
2965 }
2966 v.reset(OpRotateLeft8)
2967 v.AddArg2(x, z)
2968 return true
2969 }
2970 break
2971 }
2972
2973
2974
2975 for {
2976 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2977 right := v_0
2978 if right.Op != OpRsh8Ux16 {
2979 continue
2980 }
2981 y := right.Args[1]
2982 x := right.Args[0]
2983 left := v_1
2984 if left.Op != OpLsh8x16 {
2985 continue
2986 }
2987 _ = left.Args[1]
2988 if x != left.Args[0] {
2989 continue
2990 }
2991 z := left.Args[1]
2992 if z.Op != OpSub16 {
2993 continue
2994 }
2995 _ = z.Args[1]
2996 z_0 := z.Args[0]
2997 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
2998 continue
2999 }
3000 v.reset(OpRotateLeft8)
3001 v.AddArg2(x, z)
3002 return true
3003 }
3004 break
3005 }
3006
3007
3008
3009 for {
3010 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3011 right := v_0
3012 if right.Op != OpRsh8Ux8 {
3013 continue
3014 }
3015 y := right.Args[1]
3016 x := right.Args[0]
3017 left := v_1
3018 if left.Op != OpLsh8x8 {
3019 continue
3020 }
3021 _ = left.Args[1]
3022 if x != left.Args[0] {
3023 continue
3024 }
3025 z := left.Args[1]
3026 if z.Op != OpSub8 {
3027 continue
3028 }
3029 _ = z.Args[1]
3030 z_0 := z.Args[0]
3031 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
3032 continue
3033 }
3034 v.reset(OpRotateLeft8)
3035 v.AddArg2(x, z)
3036 return true
3037 }
3038 break
3039 }
3040 return false
3041 }
3042 func rewriteValuegeneric_OpAddPtr(v *Value) bool {
3043 v_1 := v.Args[1]
3044 v_0 := v.Args[0]
3045
3046
3047 for {
3048 t := v.Type
3049 x := v_0
3050 if v_1.Op != OpConst64 {
3051 break
3052 }
3053 c := auxIntToInt64(v_1.AuxInt)
3054 v.reset(OpOffPtr)
3055 v.Type = t
3056 v.AuxInt = int64ToAuxInt(c)
3057 v.AddArg(x)
3058 return true
3059 }
3060
3061
3062 for {
3063 t := v.Type
3064 x := v_0
3065 if v_1.Op != OpConst32 {
3066 break
3067 }
3068 c := auxIntToInt32(v_1.AuxInt)
3069 v.reset(OpOffPtr)
3070 v.Type = t
3071 v.AuxInt = int64ToAuxInt(int64(c))
3072 v.AddArg(x)
3073 return true
3074 }
3075 return false
3076 }
3077 func rewriteValuegeneric_OpAnd16(v *Value) bool {
3078 v_1 := v.Args[1]
3079 v_0 := v.Args[0]
3080 b := v.Block
3081
3082
3083 for {
3084 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3085 if v_0.Op != OpConst16 {
3086 continue
3087 }
3088 c := auxIntToInt16(v_0.AuxInt)
3089 if v_1.Op != OpConst16 {
3090 continue
3091 }
3092 d := auxIntToInt16(v_1.AuxInt)
3093 v.reset(OpConst16)
3094 v.AuxInt = int16ToAuxInt(c & d)
3095 return true
3096 }
3097 break
3098 }
3099
3100
3101 for {
3102 t := v.Type
3103 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3104 if v_0.Op != OpCom16 {
3105 continue
3106 }
3107 x := v_0.Args[0]
3108 if v_1.Op != OpCom16 {
3109 continue
3110 }
3111 y := v_1.Args[0]
3112 v.reset(OpCom16)
3113 v0 := b.NewValue0(v.Pos, OpOr16, t)
3114 v0.AddArg2(x, y)
3115 v.AddArg(v0)
3116 return true
3117 }
3118 break
3119 }
3120
3121
3122
3123 for {
3124 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3125 if v_0.Op != OpConst16 {
3126 continue
3127 }
3128 m := auxIntToInt16(v_0.AuxInt)
3129 if v_1.Op != OpRsh16Ux64 {
3130 continue
3131 }
3132 _ = v_1.Args[1]
3133 v_1_1 := v_1.Args[1]
3134 if v_1_1.Op != OpConst64 {
3135 continue
3136 }
3137 c := auxIntToInt64(v_1_1.AuxInt)
3138 if !(c >= int64(16-ntz16(m))) {
3139 continue
3140 }
3141 v.reset(OpConst16)
3142 v.AuxInt = int16ToAuxInt(0)
3143 return true
3144 }
3145 break
3146 }
3147
3148
3149
3150 for {
3151 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3152 if v_0.Op != OpConst16 {
3153 continue
3154 }
3155 m := auxIntToInt16(v_0.AuxInt)
3156 if v_1.Op != OpLsh16x64 {
3157 continue
3158 }
3159 _ = v_1.Args[1]
3160 v_1_1 := v_1.Args[1]
3161 if v_1_1.Op != OpConst64 {
3162 continue
3163 }
3164 c := auxIntToInt64(v_1_1.AuxInt)
3165 if !(c >= int64(16-nlz16(m))) {
3166 continue
3167 }
3168 v.reset(OpConst16)
3169 v.AuxInt = int16ToAuxInt(0)
3170 return true
3171 }
3172 break
3173 }
3174
3175
3176 for {
3177 x := v_0
3178 if x != v_1 {
3179 break
3180 }
3181 v.copyOf(x)
3182 return true
3183 }
3184
3185
3186 for {
3187 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3188 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
3189 continue
3190 }
3191 x := v_1
3192 v.copyOf(x)
3193 return true
3194 }
3195 break
3196 }
3197
3198
3199 for {
3200 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3201 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
3202 continue
3203 }
3204 v.reset(OpConst16)
3205 v.AuxInt = int16ToAuxInt(0)
3206 return true
3207 }
3208 break
3209 }
3210
3211
3212 for {
3213 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3214 if v_0.Op != OpCom16 {
3215 continue
3216 }
3217 x := v_0.Args[0]
3218 if x != v_1 {
3219 continue
3220 }
3221 v.reset(OpConst16)
3222 v.AuxInt = int16ToAuxInt(0)
3223 return true
3224 }
3225 break
3226 }
3227
3228
3229 for {
3230 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3231 x := v_0
3232 if v_1.Op != OpAnd16 {
3233 continue
3234 }
3235 _ = v_1.Args[1]
3236 v_1_0 := v_1.Args[0]
3237 v_1_1 := v_1.Args[1]
3238 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3239 if x != v_1_0 {
3240 continue
3241 }
3242 y := v_1_1
3243 v.reset(OpAnd16)
3244 v.AddArg2(x, y)
3245 return true
3246 }
3247 }
3248 break
3249 }
3250
3251
3252
3253 for {
3254 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3255 if v_0.Op != OpAnd16 {
3256 continue
3257 }
3258 _ = v_0.Args[1]
3259 v_0_0 := v_0.Args[0]
3260 v_0_1 := v_0.Args[1]
3261 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3262 i := v_0_0
3263 if i.Op != OpConst16 {
3264 continue
3265 }
3266 t := i.Type
3267 z := v_0_1
3268 x := v_1
3269 if !(z.Op != OpConst16 && x.Op != OpConst16) {
3270 continue
3271 }
3272 v.reset(OpAnd16)
3273 v0 := b.NewValue0(v.Pos, OpAnd16, t)
3274 v0.AddArg2(z, x)
3275 v.AddArg2(i, v0)
3276 return true
3277 }
3278 }
3279 break
3280 }
3281
3282
3283 for {
3284 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3285 if v_0.Op != OpConst16 {
3286 continue
3287 }
3288 t := v_0.Type
3289 c := auxIntToInt16(v_0.AuxInt)
3290 if v_1.Op != OpAnd16 {
3291 continue
3292 }
3293 _ = v_1.Args[1]
3294 v_1_0 := v_1.Args[0]
3295 v_1_1 := v_1.Args[1]
3296 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3297 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
3298 continue
3299 }
3300 d := auxIntToInt16(v_1_0.AuxInt)
3301 x := v_1_1
3302 v.reset(OpAnd16)
3303 v0 := b.NewValue0(v.Pos, OpConst16, t)
3304 v0.AuxInt = int16ToAuxInt(c & d)
3305 v.AddArg2(v0, x)
3306 return true
3307 }
3308 }
3309 break
3310 }
3311 return false
3312 }
3313 func rewriteValuegeneric_OpAnd32(v *Value) bool {
3314 v_1 := v.Args[1]
3315 v_0 := v.Args[0]
3316 b := v.Block
3317
3318
3319 for {
3320 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3321 if v_0.Op != OpConst32 {
3322 continue
3323 }
3324 c := auxIntToInt32(v_0.AuxInt)
3325 if v_1.Op != OpConst32 {
3326 continue
3327 }
3328 d := auxIntToInt32(v_1.AuxInt)
3329 v.reset(OpConst32)
3330 v.AuxInt = int32ToAuxInt(c & d)
3331 return true
3332 }
3333 break
3334 }
3335
3336
3337 for {
3338 t := v.Type
3339 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3340 if v_0.Op != OpCom32 {
3341 continue
3342 }
3343 x := v_0.Args[0]
3344 if v_1.Op != OpCom32 {
3345 continue
3346 }
3347 y := v_1.Args[0]
3348 v.reset(OpCom32)
3349 v0 := b.NewValue0(v.Pos, OpOr32, t)
3350 v0.AddArg2(x, y)
3351 v.AddArg(v0)
3352 return true
3353 }
3354 break
3355 }
3356
3357
3358
3359 for {
3360 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3361 if v_0.Op != OpConst32 {
3362 continue
3363 }
3364 m := auxIntToInt32(v_0.AuxInt)
3365 if v_1.Op != OpRsh32Ux64 {
3366 continue
3367 }
3368 _ = v_1.Args[1]
3369 v_1_1 := v_1.Args[1]
3370 if v_1_1.Op != OpConst64 {
3371 continue
3372 }
3373 c := auxIntToInt64(v_1_1.AuxInt)
3374 if !(c >= int64(32-ntz32(m))) {
3375 continue
3376 }
3377 v.reset(OpConst32)
3378 v.AuxInt = int32ToAuxInt(0)
3379 return true
3380 }
3381 break
3382 }
3383
3384
3385
3386 for {
3387 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3388 if v_0.Op != OpConst32 {
3389 continue
3390 }
3391 m := auxIntToInt32(v_0.AuxInt)
3392 if v_1.Op != OpLsh32x64 {
3393 continue
3394 }
3395 _ = v_1.Args[1]
3396 v_1_1 := v_1.Args[1]
3397 if v_1_1.Op != OpConst64 {
3398 continue
3399 }
3400 c := auxIntToInt64(v_1_1.AuxInt)
3401 if !(c >= int64(32-nlz32(m))) {
3402 continue
3403 }
3404 v.reset(OpConst32)
3405 v.AuxInt = int32ToAuxInt(0)
3406 return true
3407 }
3408 break
3409 }
3410
3411
3412 for {
3413 x := v_0
3414 if x != v_1 {
3415 break
3416 }
3417 v.copyOf(x)
3418 return true
3419 }
3420
3421
3422 for {
3423 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3424 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
3425 continue
3426 }
3427 x := v_1
3428 v.copyOf(x)
3429 return true
3430 }
3431 break
3432 }
3433
3434
3435 for {
3436 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3437 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
3438 continue
3439 }
3440 v.reset(OpConst32)
3441 v.AuxInt = int32ToAuxInt(0)
3442 return true
3443 }
3444 break
3445 }
3446
3447
3448 for {
3449 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3450 if v_0.Op != OpCom32 {
3451 continue
3452 }
3453 x := v_0.Args[0]
3454 if x != v_1 {
3455 continue
3456 }
3457 v.reset(OpConst32)
3458 v.AuxInt = int32ToAuxInt(0)
3459 return true
3460 }
3461 break
3462 }
3463
3464
3465 for {
3466 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3467 x := v_0
3468 if v_1.Op != OpAnd32 {
3469 continue
3470 }
3471 _ = v_1.Args[1]
3472 v_1_0 := v_1.Args[0]
3473 v_1_1 := v_1.Args[1]
3474 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3475 if x != v_1_0 {
3476 continue
3477 }
3478 y := v_1_1
3479 v.reset(OpAnd32)
3480 v.AddArg2(x, y)
3481 return true
3482 }
3483 }
3484 break
3485 }
3486
3487
3488
3489 for {
3490 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3491 if v_0.Op != OpAnd32 {
3492 continue
3493 }
3494 _ = v_0.Args[1]
3495 v_0_0 := v_0.Args[0]
3496 v_0_1 := v_0.Args[1]
3497 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3498 i := v_0_0
3499 if i.Op != OpConst32 {
3500 continue
3501 }
3502 t := i.Type
3503 z := v_0_1
3504 x := v_1
3505 if !(z.Op != OpConst32 && x.Op != OpConst32) {
3506 continue
3507 }
3508 v.reset(OpAnd32)
3509 v0 := b.NewValue0(v.Pos, OpAnd32, t)
3510 v0.AddArg2(z, x)
3511 v.AddArg2(i, v0)
3512 return true
3513 }
3514 }
3515 break
3516 }
3517
3518
3519 for {
3520 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3521 if v_0.Op != OpConst32 {
3522 continue
3523 }
3524 t := v_0.Type
3525 c := auxIntToInt32(v_0.AuxInt)
3526 if v_1.Op != OpAnd32 {
3527 continue
3528 }
3529 _ = v_1.Args[1]
3530 v_1_0 := v_1.Args[0]
3531 v_1_1 := v_1.Args[1]
3532 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3533 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
3534 continue
3535 }
3536 d := auxIntToInt32(v_1_0.AuxInt)
3537 x := v_1_1
3538 v.reset(OpAnd32)
3539 v0 := b.NewValue0(v.Pos, OpConst32, t)
3540 v0.AuxInt = int32ToAuxInt(c & d)
3541 v.AddArg2(v0, x)
3542 return true
3543 }
3544 }
3545 break
3546 }
3547 return false
3548 }
3549 func rewriteValuegeneric_OpAnd64(v *Value) bool {
3550 v_1 := v.Args[1]
3551 v_0 := v.Args[0]
3552 b := v.Block
3553
3554
3555 for {
3556 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3557 if v_0.Op != OpConst64 {
3558 continue
3559 }
3560 c := auxIntToInt64(v_0.AuxInt)
3561 if v_1.Op != OpConst64 {
3562 continue
3563 }
3564 d := auxIntToInt64(v_1.AuxInt)
3565 v.reset(OpConst64)
3566 v.AuxInt = int64ToAuxInt(c & d)
3567 return true
3568 }
3569 break
3570 }
3571
3572
3573 for {
3574 t := v.Type
3575 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3576 if v_0.Op != OpCom64 {
3577 continue
3578 }
3579 x := v_0.Args[0]
3580 if v_1.Op != OpCom64 {
3581 continue
3582 }
3583 y := v_1.Args[0]
3584 v.reset(OpCom64)
3585 v0 := b.NewValue0(v.Pos, OpOr64, t)
3586 v0.AddArg2(x, y)
3587 v.AddArg(v0)
3588 return true
3589 }
3590 break
3591 }
3592
3593
3594
3595 for {
3596 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3597 if v_0.Op != OpConst64 {
3598 continue
3599 }
3600 m := auxIntToInt64(v_0.AuxInt)
3601 if v_1.Op != OpRsh64Ux64 {
3602 continue
3603 }
3604 _ = v_1.Args[1]
3605 v_1_1 := v_1.Args[1]
3606 if v_1_1.Op != OpConst64 {
3607 continue
3608 }
3609 c := auxIntToInt64(v_1_1.AuxInt)
3610 if !(c >= int64(64-ntz64(m))) {
3611 continue
3612 }
3613 v.reset(OpConst64)
3614 v.AuxInt = int64ToAuxInt(0)
3615 return true
3616 }
3617 break
3618 }
3619
3620
3621
3622 for {
3623 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3624 if v_0.Op != OpConst64 {
3625 continue
3626 }
3627 m := auxIntToInt64(v_0.AuxInt)
3628 if v_1.Op != OpLsh64x64 {
3629 continue
3630 }
3631 _ = v_1.Args[1]
3632 v_1_1 := v_1.Args[1]
3633 if v_1_1.Op != OpConst64 {
3634 continue
3635 }
3636 c := auxIntToInt64(v_1_1.AuxInt)
3637 if !(c >= int64(64-nlz64(m))) {
3638 continue
3639 }
3640 v.reset(OpConst64)
3641 v.AuxInt = int64ToAuxInt(0)
3642 return true
3643 }
3644 break
3645 }
3646
3647
3648 for {
3649 x := v_0
3650 if x != v_1 {
3651 break
3652 }
3653 v.copyOf(x)
3654 return true
3655 }
3656
3657
3658 for {
3659 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3660 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
3661 continue
3662 }
3663 x := v_1
3664 v.copyOf(x)
3665 return true
3666 }
3667 break
3668 }
3669
3670
3671 for {
3672 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3673 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
3674 continue
3675 }
3676 v.reset(OpConst64)
3677 v.AuxInt = int64ToAuxInt(0)
3678 return true
3679 }
3680 break
3681 }
3682
3683
3684 for {
3685 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3686 if v_0.Op != OpCom64 {
3687 continue
3688 }
3689 x := v_0.Args[0]
3690 if x != v_1 {
3691 continue
3692 }
3693 v.reset(OpConst64)
3694 v.AuxInt = int64ToAuxInt(0)
3695 return true
3696 }
3697 break
3698 }
3699
3700
3701 for {
3702 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3703 x := v_0
3704 if v_1.Op != OpAnd64 {
3705 continue
3706 }
3707 _ = v_1.Args[1]
3708 v_1_0 := v_1.Args[0]
3709 v_1_1 := v_1.Args[1]
3710 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3711 if x != v_1_0 {
3712 continue
3713 }
3714 y := v_1_1
3715 v.reset(OpAnd64)
3716 v.AddArg2(x, y)
3717 return true
3718 }
3719 }
3720 break
3721 }
3722
3723
3724
3725 for {
3726 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3727 if v_0.Op != OpAnd64 {
3728 continue
3729 }
3730 _ = v_0.Args[1]
3731 v_0_0 := v_0.Args[0]
3732 v_0_1 := v_0.Args[1]
3733 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3734 i := v_0_0
3735 if i.Op != OpConst64 {
3736 continue
3737 }
3738 t := i.Type
3739 z := v_0_1
3740 x := v_1
3741 if !(z.Op != OpConst64 && x.Op != OpConst64) {
3742 continue
3743 }
3744 v.reset(OpAnd64)
3745 v0 := b.NewValue0(v.Pos, OpAnd64, t)
3746 v0.AddArg2(z, x)
3747 v.AddArg2(i, v0)
3748 return true
3749 }
3750 }
3751 break
3752 }
3753
3754
3755 for {
3756 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3757 if v_0.Op != OpConst64 {
3758 continue
3759 }
3760 t := v_0.Type
3761 c := auxIntToInt64(v_0.AuxInt)
3762 if v_1.Op != OpAnd64 {
3763 continue
3764 }
3765 _ = v_1.Args[1]
3766 v_1_0 := v_1.Args[0]
3767 v_1_1 := v_1.Args[1]
3768 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3769 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
3770 continue
3771 }
3772 d := auxIntToInt64(v_1_0.AuxInt)
3773 x := v_1_1
3774 v.reset(OpAnd64)
3775 v0 := b.NewValue0(v.Pos, OpConst64, t)
3776 v0.AuxInt = int64ToAuxInt(c & d)
3777 v.AddArg2(v0, x)
3778 return true
3779 }
3780 }
3781 break
3782 }
3783 return false
3784 }
3785 func rewriteValuegeneric_OpAnd8(v *Value) bool {
3786 v_1 := v.Args[1]
3787 v_0 := v.Args[0]
3788 b := v.Block
3789
3790
3791 for {
3792 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3793 if v_0.Op != OpConst8 {
3794 continue
3795 }
3796 c := auxIntToInt8(v_0.AuxInt)
3797 if v_1.Op != OpConst8 {
3798 continue
3799 }
3800 d := auxIntToInt8(v_1.AuxInt)
3801 v.reset(OpConst8)
3802 v.AuxInt = int8ToAuxInt(c & d)
3803 return true
3804 }
3805 break
3806 }
3807
3808
3809 for {
3810 t := v.Type
3811 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3812 if v_0.Op != OpCom8 {
3813 continue
3814 }
3815 x := v_0.Args[0]
3816 if v_1.Op != OpCom8 {
3817 continue
3818 }
3819 y := v_1.Args[0]
3820 v.reset(OpCom8)
3821 v0 := b.NewValue0(v.Pos, OpOr8, t)
3822 v0.AddArg2(x, y)
3823 v.AddArg(v0)
3824 return true
3825 }
3826 break
3827 }
3828
3829
3830
3831 for {
3832 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3833 if v_0.Op != OpConst8 {
3834 continue
3835 }
3836 m := auxIntToInt8(v_0.AuxInt)
3837 if v_1.Op != OpRsh8Ux64 {
3838 continue
3839 }
3840 _ = v_1.Args[1]
3841 v_1_1 := v_1.Args[1]
3842 if v_1_1.Op != OpConst64 {
3843 continue
3844 }
3845 c := auxIntToInt64(v_1_1.AuxInt)
3846 if !(c >= int64(8-ntz8(m))) {
3847 continue
3848 }
3849 v.reset(OpConst8)
3850 v.AuxInt = int8ToAuxInt(0)
3851 return true
3852 }
3853 break
3854 }
3855
3856
3857
3858 for {
3859 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3860 if v_0.Op != OpConst8 {
3861 continue
3862 }
3863 m := auxIntToInt8(v_0.AuxInt)
3864 if v_1.Op != OpLsh8x64 {
3865 continue
3866 }
3867 _ = v_1.Args[1]
3868 v_1_1 := v_1.Args[1]
3869 if v_1_1.Op != OpConst64 {
3870 continue
3871 }
3872 c := auxIntToInt64(v_1_1.AuxInt)
3873 if !(c >= int64(8-nlz8(m))) {
3874 continue
3875 }
3876 v.reset(OpConst8)
3877 v.AuxInt = int8ToAuxInt(0)
3878 return true
3879 }
3880 break
3881 }
3882
3883
3884 for {
3885 x := v_0
3886 if x != v_1 {
3887 break
3888 }
3889 v.copyOf(x)
3890 return true
3891 }
3892
3893
3894 for {
3895 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3896 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
3897 continue
3898 }
3899 x := v_1
3900 v.copyOf(x)
3901 return true
3902 }
3903 break
3904 }
3905
3906
3907 for {
3908 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3909 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
3910 continue
3911 }
3912 v.reset(OpConst8)
3913 v.AuxInt = int8ToAuxInt(0)
3914 return true
3915 }
3916 break
3917 }
3918
3919
3920 for {
3921 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3922 if v_0.Op != OpCom8 {
3923 continue
3924 }
3925 x := v_0.Args[0]
3926 if x != v_1 {
3927 continue
3928 }
3929 v.reset(OpConst8)
3930 v.AuxInt = int8ToAuxInt(0)
3931 return true
3932 }
3933 break
3934 }
3935
3936
3937 for {
3938 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3939 x := v_0
3940 if v_1.Op != OpAnd8 {
3941 continue
3942 }
3943 _ = v_1.Args[1]
3944 v_1_0 := v_1.Args[0]
3945 v_1_1 := v_1.Args[1]
3946 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
3947 if x != v_1_0 {
3948 continue
3949 }
3950 y := v_1_1
3951 v.reset(OpAnd8)
3952 v.AddArg2(x, y)
3953 return true
3954 }
3955 }
3956 break
3957 }
3958
3959
3960
3961 for {
3962 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3963 if v_0.Op != OpAnd8 {
3964 continue
3965 }
3966 _ = v_0.Args[1]
3967 v_0_0 := v_0.Args[0]
3968 v_0_1 := v_0.Args[1]
3969 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
3970 i := v_0_0
3971 if i.Op != OpConst8 {
3972 continue
3973 }
3974 t := i.Type
3975 z := v_0_1
3976 x := v_1
3977 if !(z.Op != OpConst8 && x.Op != OpConst8) {
3978 continue
3979 }
3980 v.reset(OpAnd8)
3981 v0 := b.NewValue0(v.Pos, OpAnd8, t)
3982 v0.AddArg2(z, x)
3983 v.AddArg2(i, v0)
3984 return true
3985 }
3986 }
3987 break
3988 }
3989
3990
3991 for {
3992 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3993 if v_0.Op != OpConst8 {
3994 continue
3995 }
3996 t := v_0.Type
3997 c := auxIntToInt8(v_0.AuxInt)
3998 if v_1.Op != OpAnd8 {
3999 continue
4000 }
4001 _ = v_1.Args[1]
4002 v_1_0 := v_1.Args[0]
4003 v_1_1 := v_1.Args[1]
4004 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
4005 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
4006 continue
4007 }
4008 d := auxIntToInt8(v_1_0.AuxInt)
4009 x := v_1_1
4010 v.reset(OpAnd8)
4011 v0 := b.NewValue0(v.Pos, OpConst8, t)
4012 v0.AuxInt = int8ToAuxInt(c & d)
4013 v.AddArg2(v0, x)
4014 return true
4015 }
4016 }
4017 break
4018 }
4019 return false
4020 }
4021 func rewriteValuegeneric_OpAndB(v *Value) bool {
4022 v_1 := v.Args[1]
4023 v_0 := v.Args[0]
4024 b := v.Block
4025
4026
4027
4028 for {
4029 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4030 if v_0.Op != OpLeq64 {
4031 continue
4032 }
4033 x := v_0.Args[1]
4034 v_0_0 := v_0.Args[0]
4035 if v_0_0.Op != OpConst64 {
4036 continue
4037 }
4038 c := auxIntToInt64(v_0_0.AuxInt)
4039 if v_1.Op != OpLess64 {
4040 continue
4041 }
4042 _ = v_1.Args[1]
4043 if x != v_1.Args[0] {
4044 continue
4045 }
4046 v_1_1 := v_1.Args[1]
4047 if v_1_1.Op != OpConst64 {
4048 continue
4049 }
4050 d := auxIntToInt64(v_1_1.AuxInt)
4051 if !(d >= c) {
4052 continue
4053 }
4054 v.reset(OpLess64U)
4055 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4056 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4057 v1.AuxInt = int64ToAuxInt(c)
4058 v0.AddArg2(x, v1)
4059 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4060 v2.AuxInt = int64ToAuxInt(d - c)
4061 v.AddArg2(v0, v2)
4062 return true
4063 }
4064 break
4065 }
4066
4067
4068
4069 for {
4070 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4071 if v_0.Op != OpLeq64 {
4072 continue
4073 }
4074 x := v_0.Args[1]
4075 v_0_0 := v_0.Args[0]
4076 if v_0_0.Op != OpConst64 {
4077 continue
4078 }
4079 c := auxIntToInt64(v_0_0.AuxInt)
4080 if v_1.Op != OpLeq64 {
4081 continue
4082 }
4083 _ = v_1.Args[1]
4084 if x != v_1.Args[0] {
4085 continue
4086 }
4087 v_1_1 := v_1.Args[1]
4088 if v_1_1.Op != OpConst64 {
4089 continue
4090 }
4091 d := auxIntToInt64(v_1_1.AuxInt)
4092 if !(d >= c) {
4093 continue
4094 }
4095 v.reset(OpLeq64U)
4096 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4097 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4098 v1.AuxInt = int64ToAuxInt(c)
4099 v0.AddArg2(x, v1)
4100 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4101 v2.AuxInt = int64ToAuxInt(d - c)
4102 v.AddArg2(v0, v2)
4103 return true
4104 }
4105 break
4106 }
4107
4108
4109
4110 for {
4111 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4112 if v_0.Op != OpLeq32 {
4113 continue
4114 }
4115 x := v_0.Args[1]
4116 v_0_0 := v_0.Args[0]
4117 if v_0_0.Op != OpConst32 {
4118 continue
4119 }
4120 c := auxIntToInt32(v_0_0.AuxInt)
4121 if v_1.Op != OpLess32 {
4122 continue
4123 }
4124 _ = v_1.Args[1]
4125 if x != v_1.Args[0] {
4126 continue
4127 }
4128 v_1_1 := v_1.Args[1]
4129 if v_1_1.Op != OpConst32 {
4130 continue
4131 }
4132 d := auxIntToInt32(v_1_1.AuxInt)
4133 if !(d >= c) {
4134 continue
4135 }
4136 v.reset(OpLess32U)
4137 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4138 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4139 v1.AuxInt = int32ToAuxInt(c)
4140 v0.AddArg2(x, v1)
4141 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4142 v2.AuxInt = int32ToAuxInt(d - c)
4143 v.AddArg2(v0, v2)
4144 return true
4145 }
4146 break
4147 }
4148
4149
4150
4151 for {
4152 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4153 if v_0.Op != OpLeq32 {
4154 continue
4155 }
4156 x := v_0.Args[1]
4157 v_0_0 := v_0.Args[0]
4158 if v_0_0.Op != OpConst32 {
4159 continue
4160 }
4161 c := auxIntToInt32(v_0_0.AuxInt)
4162 if v_1.Op != OpLeq32 {
4163 continue
4164 }
4165 _ = v_1.Args[1]
4166 if x != v_1.Args[0] {
4167 continue
4168 }
4169 v_1_1 := v_1.Args[1]
4170 if v_1_1.Op != OpConst32 {
4171 continue
4172 }
4173 d := auxIntToInt32(v_1_1.AuxInt)
4174 if !(d >= c) {
4175 continue
4176 }
4177 v.reset(OpLeq32U)
4178 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4179 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4180 v1.AuxInt = int32ToAuxInt(c)
4181 v0.AddArg2(x, v1)
4182 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4183 v2.AuxInt = int32ToAuxInt(d - c)
4184 v.AddArg2(v0, v2)
4185 return true
4186 }
4187 break
4188 }
4189
4190
4191
4192 for {
4193 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4194 if v_0.Op != OpLeq16 {
4195 continue
4196 }
4197 x := v_0.Args[1]
4198 v_0_0 := v_0.Args[0]
4199 if v_0_0.Op != OpConst16 {
4200 continue
4201 }
4202 c := auxIntToInt16(v_0_0.AuxInt)
4203 if v_1.Op != OpLess16 {
4204 continue
4205 }
4206 _ = v_1.Args[1]
4207 if x != v_1.Args[0] {
4208 continue
4209 }
4210 v_1_1 := v_1.Args[1]
4211 if v_1_1.Op != OpConst16 {
4212 continue
4213 }
4214 d := auxIntToInt16(v_1_1.AuxInt)
4215 if !(d >= c) {
4216 continue
4217 }
4218 v.reset(OpLess16U)
4219 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4220 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4221 v1.AuxInt = int16ToAuxInt(c)
4222 v0.AddArg2(x, v1)
4223 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4224 v2.AuxInt = int16ToAuxInt(d - c)
4225 v.AddArg2(v0, v2)
4226 return true
4227 }
4228 break
4229 }
4230
4231
4232
4233 for {
4234 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4235 if v_0.Op != OpLeq16 {
4236 continue
4237 }
4238 x := v_0.Args[1]
4239 v_0_0 := v_0.Args[0]
4240 if v_0_0.Op != OpConst16 {
4241 continue
4242 }
4243 c := auxIntToInt16(v_0_0.AuxInt)
4244 if v_1.Op != OpLeq16 {
4245 continue
4246 }
4247 _ = v_1.Args[1]
4248 if x != v_1.Args[0] {
4249 continue
4250 }
4251 v_1_1 := v_1.Args[1]
4252 if v_1_1.Op != OpConst16 {
4253 continue
4254 }
4255 d := auxIntToInt16(v_1_1.AuxInt)
4256 if !(d >= c) {
4257 continue
4258 }
4259 v.reset(OpLeq16U)
4260 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4261 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4262 v1.AuxInt = int16ToAuxInt(c)
4263 v0.AddArg2(x, v1)
4264 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4265 v2.AuxInt = int16ToAuxInt(d - c)
4266 v.AddArg2(v0, v2)
4267 return true
4268 }
4269 break
4270 }
4271
4272
4273
4274 for {
4275 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4276 if v_0.Op != OpLeq8 {
4277 continue
4278 }
4279 x := v_0.Args[1]
4280 v_0_0 := v_0.Args[0]
4281 if v_0_0.Op != OpConst8 {
4282 continue
4283 }
4284 c := auxIntToInt8(v_0_0.AuxInt)
4285 if v_1.Op != OpLess8 {
4286 continue
4287 }
4288 _ = v_1.Args[1]
4289 if x != v_1.Args[0] {
4290 continue
4291 }
4292 v_1_1 := v_1.Args[1]
4293 if v_1_1.Op != OpConst8 {
4294 continue
4295 }
4296 d := auxIntToInt8(v_1_1.AuxInt)
4297 if !(d >= c) {
4298 continue
4299 }
4300 v.reset(OpLess8U)
4301 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4302 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4303 v1.AuxInt = int8ToAuxInt(c)
4304 v0.AddArg2(x, v1)
4305 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4306 v2.AuxInt = int8ToAuxInt(d - c)
4307 v.AddArg2(v0, v2)
4308 return true
4309 }
4310 break
4311 }
4312
4313
4314
4315 for {
4316 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4317 if v_0.Op != OpLeq8 {
4318 continue
4319 }
4320 x := v_0.Args[1]
4321 v_0_0 := v_0.Args[0]
4322 if v_0_0.Op != OpConst8 {
4323 continue
4324 }
4325 c := auxIntToInt8(v_0_0.AuxInt)
4326 if v_1.Op != OpLeq8 {
4327 continue
4328 }
4329 _ = v_1.Args[1]
4330 if x != v_1.Args[0] {
4331 continue
4332 }
4333 v_1_1 := v_1.Args[1]
4334 if v_1_1.Op != OpConst8 {
4335 continue
4336 }
4337 d := auxIntToInt8(v_1_1.AuxInt)
4338 if !(d >= c) {
4339 continue
4340 }
4341 v.reset(OpLeq8U)
4342 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4343 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4344 v1.AuxInt = int8ToAuxInt(c)
4345 v0.AddArg2(x, v1)
4346 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4347 v2.AuxInt = int8ToAuxInt(d - c)
4348 v.AddArg2(v0, v2)
4349 return true
4350 }
4351 break
4352 }
4353
4354
4355
4356 for {
4357 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4358 if v_0.Op != OpLess64 {
4359 continue
4360 }
4361 x := v_0.Args[1]
4362 v_0_0 := v_0.Args[0]
4363 if v_0_0.Op != OpConst64 {
4364 continue
4365 }
4366 c := auxIntToInt64(v_0_0.AuxInt)
4367 if v_1.Op != OpLess64 {
4368 continue
4369 }
4370 _ = v_1.Args[1]
4371 if x != v_1.Args[0] {
4372 continue
4373 }
4374 v_1_1 := v_1.Args[1]
4375 if v_1_1.Op != OpConst64 {
4376 continue
4377 }
4378 d := auxIntToInt64(v_1_1.AuxInt)
4379 if !(d >= c+1 && c+1 > c) {
4380 continue
4381 }
4382 v.reset(OpLess64U)
4383 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4384 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4385 v1.AuxInt = int64ToAuxInt(c + 1)
4386 v0.AddArg2(x, v1)
4387 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4388 v2.AuxInt = int64ToAuxInt(d - c - 1)
4389 v.AddArg2(v0, v2)
4390 return true
4391 }
4392 break
4393 }
4394
4395
4396
4397 for {
4398 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4399 if v_0.Op != OpLess64 {
4400 continue
4401 }
4402 x := v_0.Args[1]
4403 v_0_0 := v_0.Args[0]
4404 if v_0_0.Op != OpConst64 {
4405 continue
4406 }
4407 c := auxIntToInt64(v_0_0.AuxInt)
4408 if v_1.Op != OpLeq64 {
4409 continue
4410 }
4411 _ = v_1.Args[1]
4412 if x != v_1.Args[0] {
4413 continue
4414 }
4415 v_1_1 := v_1.Args[1]
4416 if v_1_1.Op != OpConst64 {
4417 continue
4418 }
4419 d := auxIntToInt64(v_1_1.AuxInt)
4420 if !(d >= c+1 && c+1 > c) {
4421 continue
4422 }
4423 v.reset(OpLeq64U)
4424 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4425 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4426 v1.AuxInt = int64ToAuxInt(c + 1)
4427 v0.AddArg2(x, v1)
4428 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4429 v2.AuxInt = int64ToAuxInt(d - c - 1)
4430 v.AddArg2(v0, v2)
4431 return true
4432 }
4433 break
4434 }
4435
4436
4437
4438 for {
4439 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4440 if v_0.Op != OpLess32 {
4441 continue
4442 }
4443 x := v_0.Args[1]
4444 v_0_0 := v_0.Args[0]
4445 if v_0_0.Op != OpConst32 {
4446 continue
4447 }
4448 c := auxIntToInt32(v_0_0.AuxInt)
4449 if v_1.Op != OpLess32 {
4450 continue
4451 }
4452 _ = v_1.Args[1]
4453 if x != v_1.Args[0] {
4454 continue
4455 }
4456 v_1_1 := v_1.Args[1]
4457 if v_1_1.Op != OpConst32 {
4458 continue
4459 }
4460 d := auxIntToInt32(v_1_1.AuxInt)
4461 if !(d >= c+1 && c+1 > c) {
4462 continue
4463 }
4464 v.reset(OpLess32U)
4465 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4466 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4467 v1.AuxInt = int32ToAuxInt(c + 1)
4468 v0.AddArg2(x, v1)
4469 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4470 v2.AuxInt = int32ToAuxInt(d - c - 1)
4471 v.AddArg2(v0, v2)
4472 return true
4473 }
4474 break
4475 }
4476
4477
4478
4479 for {
4480 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4481 if v_0.Op != OpLess32 {
4482 continue
4483 }
4484 x := v_0.Args[1]
4485 v_0_0 := v_0.Args[0]
4486 if v_0_0.Op != OpConst32 {
4487 continue
4488 }
4489 c := auxIntToInt32(v_0_0.AuxInt)
4490 if v_1.Op != OpLeq32 {
4491 continue
4492 }
4493 _ = v_1.Args[1]
4494 if x != v_1.Args[0] {
4495 continue
4496 }
4497 v_1_1 := v_1.Args[1]
4498 if v_1_1.Op != OpConst32 {
4499 continue
4500 }
4501 d := auxIntToInt32(v_1_1.AuxInt)
4502 if !(d >= c+1 && c+1 > c) {
4503 continue
4504 }
4505 v.reset(OpLeq32U)
4506 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4507 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4508 v1.AuxInt = int32ToAuxInt(c + 1)
4509 v0.AddArg2(x, v1)
4510 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4511 v2.AuxInt = int32ToAuxInt(d - c - 1)
4512 v.AddArg2(v0, v2)
4513 return true
4514 }
4515 break
4516 }
4517
4518
4519
4520 for {
4521 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4522 if v_0.Op != OpLess16 {
4523 continue
4524 }
4525 x := v_0.Args[1]
4526 v_0_0 := v_0.Args[0]
4527 if v_0_0.Op != OpConst16 {
4528 continue
4529 }
4530 c := auxIntToInt16(v_0_0.AuxInt)
4531 if v_1.Op != OpLess16 {
4532 continue
4533 }
4534 _ = v_1.Args[1]
4535 if x != v_1.Args[0] {
4536 continue
4537 }
4538 v_1_1 := v_1.Args[1]
4539 if v_1_1.Op != OpConst16 {
4540 continue
4541 }
4542 d := auxIntToInt16(v_1_1.AuxInt)
4543 if !(d >= c+1 && c+1 > c) {
4544 continue
4545 }
4546 v.reset(OpLess16U)
4547 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4548 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4549 v1.AuxInt = int16ToAuxInt(c + 1)
4550 v0.AddArg2(x, v1)
4551 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4552 v2.AuxInt = int16ToAuxInt(d - c - 1)
4553 v.AddArg2(v0, v2)
4554 return true
4555 }
4556 break
4557 }
4558
4559
4560
4561 for {
4562 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4563 if v_0.Op != OpLess16 {
4564 continue
4565 }
4566 x := v_0.Args[1]
4567 v_0_0 := v_0.Args[0]
4568 if v_0_0.Op != OpConst16 {
4569 continue
4570 }
4571 c := auxIntToInt16(v_0_0.AuxInt)
4572 if v_1.Op != OpLeq16 {
4573 continue
4574 }
4575 _ = v_1.Args[1]
4576 if x != v_1.Args[0] {
4577 continue
4578 }
4579 v_1_1 := v_1.Args[1]
4580 if v_1_1.Op != OpConst16 {
4581 continue
4582 }
4583 d := auxIntToInt16(v_1_1.AuxInt)
4584 if !(d >= c+1 && c+1 > c) {
4585 continue
4586 }
4587 v.reset(OpLeq16U)
4588 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4589 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4590 v1.AuxInt = int16ToAuxInt(c + 1)
4591 v0.AddArg2(x, v1)
4592 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4593 v2.AuxInt = int16ToAuxInt(d - c - 1)
4594 v.AddArg2(v0, v2)
4595 return true
4596 }
4597 break
4598 }
4599
4600
4601
4602 for {
4603 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4604 if v_0.Op != OpLess8 {
4605 continue
4606 }
4607 x := v_0.Args[1]
4608 v_0_0 := v_0.Args[0]
4609 if v_0_0.Op != OpConst8 {
4610 continue
4611 }
4612 c := auxIntToInt8(v_0_0.AuxInt)
4613 if v_1.Op != OpLess8 {
4614 continue
4615 }
4616 _ = v_1.Args[1]
4617 if x != v_1.Args[0] {
4618 continue
4619 }
4620 v_1_1 := v_1.Args[1]
4621 if v_1_1.Op != OpConst8 {
4622 continue
4623 }
4624 d := auxIntToInt8(v_1_1.AuxInt)
4625 if !(d >= c+1 && c+1 > c) {
4626 continue
4627 }
4628 v.reset(OpLess8U)
4629 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4630 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4631 v1.AuxInt = int8ToAuxInt(c + 1)
4632 v0.AddArg2(x, v1)
4633 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4634 v2.AuxInt = int8ToAuxInt(d - c - 1)
4635 v.AddArg2(v0, v2)
4636 return true
4637 }
4638 break
4639 }
4640
4641
4642
4643 for {
4644 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4645 if v_0.Op != OpLess8 {
4646 continue
4647 }
4648 x := v_0.Args[1]
4649 v_0_0 := v_0.Args[0]
4650 if v_0_0.Op != OpConst8 {
4651 continue
4652 }
4653 c := auxIntToInt8(v_0_0.AuxInt)
4654 if v_1.Op != OpLeq8 {
4655 continue
4656 }
4657 _ = v_1.Args[1]
4658 if x != v_1.Args[0] {
4659 continue
4660 }
4661 v_1_1 := v_1.Args[1]
4662 if v_1_1.Op != OpConst8 {
4663 continue
4664 }
4665 d := auxIntToInt8(v_1_1.AuxInt)
4666 if !(d >= c+1 && c+1 > c) {
4667 continue
4668 }
4669 v.reset(OpLeq8U)
4670 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4671 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4672 v1.AuxInt = int8ToAuxInt(c + 1)
4673 v0.AddArg2(x, v1)
4674 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4675 v2.AuxInt = int8ToAuxInt(d - c - 1)
4676 v.AddArg2(v0, v2)
4677 return true
4678 }
4679 break
4680 }
4681
4682
4683
4684 for {
4685 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4686 if v_0.Op != OpLeq64U {
4687 continue
4688 }
4689 x := v_0.Args[1]
4690 v_0_0 := v_0.Args[0]
4691 if v_0_0.Op != OpConst64 {
4692 continue
4693 }
4694 c := auxIntToInt64(v_0_0.AuxInt)
4695 if v_1.Op != OpLess64U {
4696 continue
4697 }
4698 _ = v_1.Args[1]
4699 if x != v_1.Args[0] {
4700 continue
4701 }
4702 v_1_1 := v_1.Args[1]
4703 if v_1_1.Op != OpConst64 {
4704 continue
4705 }
4706 d := auxIntToInt64(v_1_1.AuxInt)
4707 if !(uint64(d) >= uint64(c)) {
4708 continue
4709 }
4710 v.reset(OpLess64U)
4711 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4712 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4713 v1.AuxInt = int64ToAuxInt(c)
4714 v0.AddArg2(x, v1)
4715 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4716 v2.AuxInt = int64ToAuxInt(d - c)
4717 v.AddArg2(v0, v2)
4718 return true
4719 }
4720 break
4721 }
4722
4723
4724
4725 for {
4726 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4727 if v_0.Op != OpLeq64U {
4728 continue
4729 }
4730 x := v_0.Args[1]
4731 v_0_0 := v_0.Args[0]
4732 if v_0_0.Op != OpConst64 {
4733 continue
4734 }
4735 c := auxIntToInt64(v_0_0.AuxInt)
4736 if v_1.Op != OpLeq64U {
4737 continue
4738 }
4739 _ = v_1.Args[1]
4740 if x != v_1.Args[0] {
4741 continue
4742 }
4743 v_1_1 := v_1.Args[1]
4744 if v_1_1.Op != OpConst64 {
4745 continue
4746 }
4747 d := auxIntToInt64(v_1_1.AuxInt)
4748 if !(uint64(d) >= uint64(c)) {
4749 continue
4750 }
4751 v.reset(OpLeq64U)
4752 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
4753 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
4754 v1.AuxInt = int64ToAuxInt(c)
4755 v0.AddArg2(x, v1)
4756 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
4757 v2.AuxInt = int64ToAuxInt(d - c)
4758 v.AddArg2(v0, v2)
4759 return true
4760 }
4761 break
4762 }
4763
4764
4765
4766 for {
4767 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4768 if v_0.Op != OpLeq32U {
4769 continue
4770 }
4771 x := v_0.Args[1]
4772 v_0_0 := v_0.Args[0]
4773 if v_0_0.Op != OpConst32 {
4774 continue
4775 }
4776 c := auxIntToInt32(v_0_0.AuxInt)
4777 if v_1.Op != OpLess32U {
4778 continue
4779 }
4780 _ = v_1.Args[1]
4781 if x != v_1.Args[0] {
4782 continue
4783 }
4784 v_1_1 := v_1.Args[1]
4785 if v_1_1.Op != OpConst32 {
4786 continue
4787 }
4788 d := auxIntToInt32(v_1_1.AuxInt)
4789 if !(uint32(d) >= uint32(c)) {
4790 continue
4791 }
4792 v.reset(OpLess32U)
4793 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4794 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4795 v1.AuxInt = int32ToAuxInt(c)
4796 v0.AddArg2(x, v1)
4797 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4798 v2.AuxInt = int32ToAuxInt(d - c)
4799 v.AddArg2(v0, v2)
4800 return true
4801 }
4802 break
4803 }
4804
4805
4806
4807 for {
4808 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4809 if v_0.Op != OpLeq32U {
4810 continue
4811 }
4812 x := v_0.Args[1]
4813 v_0_0 := v_0.Args[0]
4814 if v_0_0.Op != OpConst32 {
4815 continue
4816 }
4817 c := auxIntToInt32(v_0_0.AuxInt)
4818 if v_1.Op != OpLeq32U {
4819 continue
4820 }
4821 _ = v_1.Args[1]
4822 if x != v_1.Args[0] {
4823 continue
4824 }
4825 v_1_1 := v_1.Args[1]
4826 if v_1_1.Op != OpConst32 {
4827 continue
4828 }
4829 d := auxIntToInt32(v_1_1.AuxInt)
4830 if !(uint32(d) >= uint32(c)) {
4831 continue
4832 }
4833 v.reset(OpLeq32U)
4834 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
4835 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
4836 v1.AuxInt = int32ToAuxInt(c)
4837 v0.AddArg2(x, v1)
4838 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
4839 v2.AuxInt = int32ToAuxInt(d - c)
4840 v.AddArg2(v0, v2)
4841 return true
4842 }
4843 break
4844 }
4845
4846
4847
4848 for {
4849 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4850 if v_0.Op != OpLeq16U {
4851 continue
4852 }
4853 x := v_0.Args[1]
4854 v_0_0 := v_0.Args[0]
4855 if v_0_0.Op != OpConst16 {
4856 continue
4857 }
4858 c := auxIntToInt16(v_0_0.AuxInt)
4859 if v_1.Op != OpLess16U {
4860 continue
4861 }
4862 _ = v_1.Args[1]
4863 if x != v_1.Args[0] {
4864 continue
4865 }
4866 v_1_1 := v_1.Args[1]
4867 if v_1_1.Op != OpConst16 {
4868 continue
4869 }
4870 d := auxIntToInt16(v_1_1.AuxInt)
4871 if !(uint16(d) >= uint16(c)) {
4872 continue
4873 }
4874 v.reset(OpLess16U)
4875 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4876 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4877 v1.AuxInt = int16ToAuxInt(c)
4878 v0.AddArg2(x, v1)
4879 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4880 v2.AuxInt = int16ToAuxInt(d - c)
4881 v.AddArg2(v0, v2)
4882 return true
4883 }
4884 break
4885 }
4886
4887
4888
4889 for {
4890 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4891 if v_0.Op != OpLeq16U {
4892 continue
4893 }
4894 x := v_0.Args[1]
4895 v_0_0 := v_0.Args[0]
4896 if v_0_0.Op != OpConst16 {
4897 continue
4898 }
4899 c := auxIntToInt16(v_0_0.AuxInt)
4900 if v_1.Op != OpLeq16U {
4901 continue
4902 }
4903 _ = v_1.Args[1]
4904 if x != v_1.Args[0] {
4905 continue
4906 }
4907 v_1_1 := v_1.Args[1]
4908 if v_1_1.Op != OpConst16 {
4909 continue
4910 }
4911 d := auxIntToInt16(v_1_1.AuxInt)
4912 if !(uint16(d) >= uint16(c)) {
4913 continue
4914 }
4915 v.reset(OpLeq16U)
4916 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
4917 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
4918 v1.AuxInt = int16ToAuxInt(c)
4919 v0.AddArg2(x, v1)
4920 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
4921 v2.AuxInt = int16ToAuxInt(d - c)
4922 v.AddArg2(v0, v2)
4923 return true
4924 }
4925 break
4926 }
4927
4928
4929
4930 for {
4931 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4932 if v_0.Op != OpLeq8U {
4933 continue
4934 }
4935 x := v_0.Args[1]
4936 v_0_0 := v_0.Args[0]
4937 if v_0_0.Op != OpConst8 {
4938 continue
4939 }
4940 c := auxIntToInt8(v_0_0.AuxInt)
4941 if v_1.Op != OpLess8U {
4942 continue
4943 }
4944 _ = v_1.Args[1]
4945 if x != v_1.Args[0] {
4946 continue
4947 }
4948 v_1_1 := v_1.Args[1]
4949 if v_1_1.Op != OpConst8 {
4950 continue
4951 }
4952 d := auxIntToInt8(v_1_1.AuxInt)
4953 if !(uint8(d) >= uint8(c)) {
4954 continue
4955 }
4956 v.reset(OpLess8U)
4957 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4958 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
4959 v1.AuxInt = int8ToAuxInt(c)
4960 v0.AddArg2(x, v1)
4961 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
4962 v2.AuxInt = int8ToAuxInt(d - c)
4963 v.AddArg2(v0, v2)
4964 return true
4965 }
4966 break
4967 }
4968
4969
4970
4971 for {
4972 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4973 if v_0.Op != OpLeq8U {
4974 continue
4975 }
4976 x := v_0.Args[1]
4977 v_0_0 := v_0.Args[0]
4978 if v_0_0.Op != OpConst8 {
4979 continue
4980 }
4981 c := auxIntToInt8(v_0_0.AuxInt)
4982 if v_1.Op != OpLeq8U {
4983 continue
4984 }
4985 _ = v_1.Args[1]
4986 if x != v_1.Args[0] {
4987 continue
4988 }
4989 v_1_1 := v_1.Args[1]
4990 if v_1_1.Op != OpConst8 {
4991 continue
4992 }
4993 d := auxIntToInt8(v_1_1.AuxInt)
4994 if !(uint8(d) >= uint8(c)) {
4995 continue
4996 }
4997 v.reset(OpLeq8U)
4998 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
4999 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5000 v1.AuxInt = int8ToAuxInt(c)
5001 v0.AddArg2(x, v1)
5002 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5003 v2.AuxInt = int8ToAuxInt(d - c)
5004 v.AddArg2(v0, v2)
5005 return true
5006 }
5007 break
5008 }
5009
5010
5011
5012 for {
5013 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5014 if v_0.Op != OpLess64U {
5015 continue
5016 }
5017 x := v_0.Args[1]
5018 v_0_0 := v_0.Args[0]
5019 if v_0_0.Op != OpConst64 {
5020 continue
5021 }
5022 c := auxIntToInt64(v_0_0.AuxInt)
5023 if v_1.Op != OpLess64U {
5024 continue
5025 }
5026 _ = v_1.Args[1]
5027 if x != v_1.Args[0] {
5028 continue
5029 }
5030 v_1_1 := v_1.Args[1]
5031 if v_1_1.Op != OpConst64 {
5032 continue
5033 }
5034 d := auxIntToInt64(v_1_1.AuxInt)
5035 if !(uint64(d) >= uint64(c+1) && uint64(c+1) > uint64(c)) {
5036 continue
5037 }
5038 v.reset(OpLess64U)
5039 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
5040 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
5041 v1.AuxInt = int64ToAuxInt(c + 1)
5042 v0.AddArg2(x, v1)
5043 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
5044 v2.AuxInt = int64ToAuxInt(d - c - 1)
5045 v.AddArg2(v0, v2)
5046 return true
5047 }
5048 break
5049 }
5050
5051
5052
5053 for {
5054 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5055 if v_0.Op != OpLess64U {
5056 continue
5057 }
5058 x := v_0.Args[1]
5059 v_0_0 := v_0.Args[0]
5060 if v_0_0.Op != OpConst64 {
5061 continue
5062 }
5063 c := auxIntToInt64(v_0_0.AuxInt)
5064 if v_1.Op != OpLeq64U {
5065 continue
5066 }
5067 _ = v_1.Args[1]
5068 if x != v_1.Args[0] {
5069 continue
5070 }
5071 v_1_1 := v_1.Args[1]
5072 if v_1_1.Op != OpConst64 {
5073 continue
5074 }
5075 d := auxIntToInt64(v_1_1.AuxInt)
5076 if !(uint64(d) >= uint64(c+1) && uint64(c+1) > uint64(c)) {
5077 continue
5078 }
5079 v.reset(OpLeq64U)
5080 v0 := b.NewValue0(v.Pos, OpSub64, x.Type)
5081 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
5082 v1.AuxInt = int64ToAuxInt(c + 1)
5083 v0.AddArg2(x, v1)
5084 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
5085 v2.AuxInt = int64ToAuxInt(d - c - 1)
5086 v.AddArg2(v0, v2)
5087 return true
5088 }
5089 break
5090 }
5091
5092
5093
5094 for {
5095 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5096 if v_0.Op != OpLess32U {
5097 continue
5098 }
5099 x := v_0.Args[1]
5100 v_0_0 := v_0.Args[0]
5101 if v_0_0.Op != OpConst32 {
5102 continue
5103 }
5104 c := auxIntToInt32(v_0_0.AuxInt)
5105 if v_1.Op != OpLess32U {
5106 continue
5107 }
5108 _ = v_1.Args[1]
5109 if x != v_1.Args[0] {
5110 continue
5111 }
5112 v_1_1 := v_1.Args[1]
5113 if v_1_1.Op != OpConst32 {
5114 continue
5115 }
5116 d := auxIntToInt32(v_1_1.AuxInt)
5117 if !(uint32(d) >= uint32(c+1) && uint32(c+1) > uint32(c)) {
5118 continue
5119 }
5120 v.reset(OpLess32U)
5121 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
5122 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
5123 v1.AuxInt = int32ToAuxInt(c + 1)
5124 v0.AddArg2(x, v1)
5125 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
5126 v2.AuxInt = int32ToAuxInt(d - c - 1)
5127 v.AddArg2(v0, v2)
5128 return true
5129 }
5130 break
5131 }
5132
5133
5134
5135 for {
5136 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5137 if v_0.Op != OpLess32U {
5138 continue
5139 }
5140 x := v_0.Args[1]
5141 v_0_0 := v_0.Args[0]
5142 if v_0_0.Op != OpConst32 {
5143 continue
5144 }
5145 c := auxIntToInt32(v_0_0.AuxInt)
5146 if v_1.Op != OpLeq32U {
5147 continue
5148 }
5149 _ = v_1.Args[1]
5150 if x != v_1.Args[0] {
5151 continue
5152 }
5153 v_1_1 := v_1.Args[1]
5154 if v_1_1.Op != OpConst32 {
5155 continue
5156 }
5157 d := auxIntToInt32(v_1_1.AuxInt)
5158 if !(uint32(d) >= uint32(c+1) && uint32(c+1) > uint32(c)) {
5159 continue
5160 }
5161 v.reset(OpLeq32U)
5162 v0 := b.NewValue0(v.Pos, OpSub32, x.Type)
5163 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
5164 v1.AuxInt = int32ToAuxInt(c + 1)
5165 v0.AddArg2(x, v1)
5166 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
5167 v2.AuxInt = int32ToAuxInt(d - c - 1)
5168 v.AddArg2(v0, v2)
5169 return true
5170 }
5171 break
5172 }
5173
5174
5175
5176 for {
5177 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5178 if v_0.Op != OpLess16U {
5179 continue
5180 }
5181 x := v_0.Args[1]
5182 v_0_0 := v_0.Args[0]
5183 if v_0_0.Op != OpConst16 {
5184 continue
5185 }
5186 c := auxIntToInt16(v_0_0.AuxInt)
5187 if v_1.Op != OpLess16U {
5188 continue
5189 }
5190 _ = v_1.Args[1]
5191 if x != v_1.Args[0] {
5192 continue
5193 }
5194 v_1_1 := v_1.Args[1]
5195 if v_1_1.Op != OpConst16 {
5196 continue
5197 }
5198 d := auxIntToInt16(v_1_1.AuxInt)
5199 if !(uint16(d) >= uint16(c+1) && uint16(c+1) > uint16(c)) {
5200 continue
5201 }
5202 v.reset(OpLess16U)
5203 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
5204 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5205 v1.AuxInt = int16ToAuxInt(c + 1)
5206 v0.AddArg2(x, v1)
5207 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
5208 v2.AuxInt = int16ToAuxInt(d - c - 1)
5209 v.AddArg2(v0, v2)
5210 return true
5211 }
5212 break
5213 }
5214
5215
5216
5217 for {
5218 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5219 if v_0.Op != OpLess16U {
5220 continue
5221 }
5222 x := v_0.Args[1]
5223 v_0_0 := v_0.Args[0]
5224 if v_0_0.Op != OpConst16 {
5225 continue
5226 }
5227 c := auxIntToInt16(v_0_0.AuxInt)
5228 if v_1.Op != OpLeq16U {
5229 continue
5230 }
5231 _ = v_1.Args[1]
5232 if x != v_1.Args[0] {
5233 continue
5234 }
5235 v_1_1 := v_1.Args[1]
5236 if v_1_1.Op != OpConst16 {
5237 continue
5238 }
5239 d := auxIntToInt16(v_1_1.AuxInt)
5240 if !(uint16(d) >= uint16(c+1) && uint16(c+1) > uint16(c)) {
5241 continue
5242 }
5243 v.reset(OpLeq16U)
5244 v0 := b.NewValue0(v.Pos, OpSub16, x.Type)
5245 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5246 v1.AuxInt = int16ToAuxInt(c + 1)
5247 v0.AddArg2(x, v1)
5248 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
5249 v2.AuxInt = int16ToAuxInt(d - c - 1)
5250 v.AddArg2(v0, v2)
5251 return true
5252 }
5253 break
5254 }
5255
5256
5257
5258 for {
5259 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5260 if v_0.Op != OpLess8U {
5261 continue
5262 }
5263 x := v_0.Args[1]
5264 v_0_0 := v_0.Args[0]
5265 if v_0_0.Op != OpConst8 {
5266 continue
5267 }
5268 c := auxIntToInt8(v_0_0.AuxInt)
5269 if v_1.Op != OpLess8U {
5270 continue
5271 }
5272 _ = v_1.Args[1]
5273 if x != v_1.Args[0] {
5274 continue
5275 }
5276 v_1_1 := v_1.Args[1]
5277 if v_1_1.Op != OpConst8 {
5278 continue
5279 }
5280 d := auxIntToInt8(v_1_1.AuxInt)
5281 if !(uint8(d) >= uint8(c+1) && uint8(c+1) > uint8(c)) {
5282 continue
5283 }
5284 v.reset(OpLess8U)
5285 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
5286 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5287 v1.AuxInt = int8ToAuxInt(c + 1)
5288 v0.AddArg2(x, v1)
5289 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5290 v2.AuxInt = int8ToAuxInt(d - c - 1)
5291 v.AddArg2(v0, v2)
5292 return true
5293 }
5294 break
5295 }
5296
5297
5298
5299 for {
5300 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5301 if v_0.Op != OpLess8U {
5302 continue
5303 }
5304 x := v_0.Args[1]
5305 v_0_0 := v_0.Args[0]
5306 if v_0_0.Op != OpConst8 {
5307 continue
5308 }
5309 c := auxIntToInt8(v_0_0.AuxInt)
5310 if v_1.Op != OpLeq8U {
5311 continue
5312 }
5313 _ = v_1.Args[1]
5314 if x != v_1.Args[0] {
5315 continue
5316 }
5317 v_1_1 := v_1.Args[1]
5318 if v_1_1.Op != OpConst8 {
5319 continue
5320 }
5321 d := auxIntToInt8(v_1_1.AuxInt)
5322 if !(uint8(d) >= uint8(c+1) && uint8(c+1) > uint8(c)) {
5323 continue
5324 }
5325 v.reset(OpLeq8U)
5326 v0 := b.NewValue0(v.Pos, OpSub8, x.Type)
5327 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5328 v1.AuxInt = int8ToAuxInt(c + 1)
5329 v0.AddArg2(x, v1)
5330 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
5331 v2.AuxInt = int8ToAuxInt(d - c - 1)
5332 v.AddArg2(v0, v2)
5333 return true
5334 }
5335 break
5336 }
5337
5338
5339
5340 for {
5341 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5342 if v_0.Op != OpNeq64 {
5343 continue
5344 }
5345 _ = v_0.Args[1]
5346 v_0_0 := v_0.Args[0]
5347 v_0_1 := v_0.Args[1]
5348 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5349 x := v_0_0
5350 cv := v_0_1
5351 if cv.Op != OpConst64 {
5352 continue
5353 }
5354 c := auxIntToInt64(cv.AuxInt)
5355 if v_1.Op != OpNeq64 {
5356 continue
5357 }
5358 _ = v_1.Args[1]
5359 v_1_0 := v_1.Args[0]
5360 v_1_1 := v_1.Args[1]
5361 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5362 if x != v_1_0 || v_1_1.Op != OpConst64 {
5363 continue
5364 }
5365 d := auxIntToInt64(v_1_1.AuxInt)
5366 if !(c|d == c && oneBit(c^d)) {
5367 continue
5368 }
5369 v.reset(OpNeq64)
5370 v0 := b.NewValue0(v.Pos, OpOr64, x.Type)
5371 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
5372 v1.AuxInt = int64ToAuxInt(c ^ d)
5373 v0.AddArg2(x, v1)
5374 v.AddArg2(v0, cv)
5375 return true
5376 }
5377 }
5378 }
5379 break
5380 }
5381
5382
5383
5384 for {
5385 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5386 if v_0.Op != OpNeq32 {
5387 continue
5388 }
5389 _ = v_0.Args[1]
5390 v_0_0 := v_0.Args[0]
5391 v_0_1 := v_0.Args[1]
5392 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5393 x := v_0_0
5394 cv := v_0_1
5395 if cv.Op != OpConst32 {
5396 continue
5397 }
5398 c := auxIntToInt32(cv.AuxInt)
5399 if v_1.Op != OpNeq32 {
5400 continue
5401 }
5402 _ = v_1.Args[1]
5403 v_1_0 := v_1.Args[0]
5404 v_1_1 := v_1.Args[1]
5405 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5406 if x != v_1_0 || v_1_1.Op != OpConst32 {
5407 continue
5408 }
5409 d := auxIntToInt32(v_1_1.AuxInt)
5410 if !(c|d == c && oneBit(c^d)) {
5411 continue
5412 }
5413 v.reset(OpNeq32)
5414 v0 := b.NewValue0(v.Pos, OpOr32, x.Type)
5415 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
5416 v1.AuxInt = int32ToAuxInt(c ^ d)
5417 v0.AddArg2(x, v1)
5418 v.AddArg2(v0, cv)
5419 return true
5420 }
5421 }
5422 }
5423 break
5424 }
5425
5426
5427
5428 for {
5429 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5430 if v_0.Op != OpNeq16 {
5431 continue
5432 }
5433 _ = v_0.Args[1]
5434 v_0_0 := v_0.Args[0]
5435 v_0_1 := v_0.Args[1]
5436 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5437 x := v_0_0
5438 cv := v_0_1
5439 if cv.Op != OpConst16 {
5440 continue
5441 }
5442 c := auxIntToInt16(cv.AuxInt)
5443 if v_1.Op != OpNeq16 {
5444 continue
5445 }
5446 _ = v_1.Args[1]
5447 v_1_0 := v_1.Args[0]
5448 v_1_1 := v_1.Args[1]
5449 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5450 if x != v_1_0 || v_1_1.Op != OpConst16 {
5451 continue
5452 }
5453 d := auxIntToInt16(v_1_1.AuxInt)
5454 if !(c|d == c && oneBit(c^d)) {
5455 continue
5456 }
5457 v.reset(OpNeq16)
5458 v0 := b.NewValue0(v.Pos, OpOr16, x.Type)
5459 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
5460 v1.AuxInt = int16ToAuxInt(c ^ d)
5461 v0.AddArg2(x, v1)
5462 v.AddArg2(v0, cv)
5463 return true
5464 }
5465 }
5466 }
5467 break
5468 }
5469
5470
5471
5472 for {
5473 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
5474 if v_0.Op != OpNeq8 {
5475 continue
5476 }
5477 _ = v_0.Args[1]
5478 v_0_0 := v_0.Args[0]
5479 v_0_1 := v_0.Args[1]
5480 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
5481 x := v_0_0
5482 cv := v_0_1
5483 if cv.Op != OpConst8 {
5484 continue
5485 }
5486 c := auxIntToInt8(cv.AuxInt)
5487 if v_1.Op != OpNeq8 {
5488 continue
5489 }
5490 _ = v_1.Args[1]
5491 v_1_0 := v_1.Args[0]
5492 v_1_1 := v_1.Args[1]
5493 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
5494 if x != v_1_0 || v_1_1.Op != OpConst8 {
5495 continue
5496 }
5497 d := auxIntToInt8(v_1_1.AuxInt)
5498 if !(c|d == c && oneBit(c^d)) {
5499 continue
5500 }
5501 v.reset(OpNeq8)
5502 v0 := b.NewValue0(v.Pos, OpOr8, x.Type)
5503 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
5504 v1.AuxInt = int8ToAuxInt(c ^ d)
5505 v0.AddArg2(x, v1)
5506 v.AddArg2(v0, cv)
5507 return true
5508 }
5509 }
5510 }
5511 break
5512 }
5513 return false
5514 }
5515 func rewriteValuegeneric_OpArraySelect(v *Value) bool {
5516 v_0 := v.Args[0]
5517
5518
5519 for {
5520 if v_0.Op != OpArrayMake1 {
5521 break
5522 }
5523 x := v_0.Args[0]
5524 v.copyOf(x)
5525 return true
5526 }
5527
5528
5529 for {
5530 if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpIData {
5531 break
5532 }
5533 x := v_0.Args[0]
5534 v.reset(OpIData)
5535 v.AddArg(x)
5536 return true
5537 }
5538 return false
5539 }
5540 func rewriteValuegeneric_OpBitLen16(v *Value) bool {
5541 v_0 := v.Args[0]
5542 b := v.Block
5543 config := b.Func.Config
5544
5545
5546
5547 for {
5548 if v_0.Op != OpConst16 {
5549 break
5550 }
5551 c := auxIntToInt16(v_0.AuxInt)
5552 if !(config.PtrSize == 8) {
5553 break
5554 }
5555 v.reset(OpConst64)
5556 v.AuxInt = int64ToAuxInt(int64(bits.Len16(uint16(c))))
5557 return true
5558 }
5559
5560
5561
5562 for {
5563 if v_0.Op != OpConst16 {
5564 break
5565 }
5566 c := auxIntToInt16(v_0.AuxInt)
5567 if !(config.PtrSize == 4) {
5568 break
5569 }
5570 v.reset(OpConst32)
5571 v.AuxInt = int32ToAuxInt(int32(bits.Len16(uint16(c))))
5572 return true
5573 }
5574 return false
5575 }
5576 func rewriteValuegeneric_OpBitLen32(v *Value) bool {
5577 v_0 := v.Args[0]
5578 b := v.Block
5579 config := b.Func.Config
5580
5581
5582
5583 for {
5584 if v_0.Op != OpConst32 {
5585 break
5586 }
5587 c := auxIntToInt32(v_0.AuxInt)
5588 if !(config.PtrSize == 8) {
5589 break
5590 }
5591 v.reset(OpConst64)
5592 v.AuxInt = int64ToAuxInt(int64(bits.Len32(uint32(c))))
5593 return true
5594 }
5595
5596
5597
5598 for {
5599 if v_0.Op != OpConst32 {
5600 break
5601 }
5602 c := auxIntToInt32(v_0.AuxInt)
5603 if !(config.PtrSize == 4) {
5604 break
5605 }
5606 v.reset(OpConst32)
5607 v.AuxInt = int32ToAuxInt(int32(bits.Len32(uint32(c))))
5608 return true
5609 }
5610 return false
5611 }
5612 func rewriteValuegeneric_OpBitLen64(v *Value) bool {
5613 v_0 := v.Args[0]
5614 b := v.Block
5615 config := b.Func.Config
5616
5617
5618
5619 for {
5620 if v_0.Op != OpConst64 {
5621 break
5622 }
5623 c := auxIntToInt64(v_0.AuxInt)
5624 if !(config.PtrSize == 8) {
5625 break
5626 }
5627 v.reset(OpConst64)
5628 v.AuxInt = int64ToAuxInt(int64(bits.Len64(uint64(c))))
5629 return true
5630 }
5631
5632
5633
5634 for {
5635 if v_0.Op != OpConst64 {
5636 break
5637 }
5638 c := auxIntToInt64(v_0.AuxInt)
5639 if !(config.PtrSize == 4) {
5640 break
5641 }
5642 v.reset(OpConst32)
5643 v.AuxInt = int32ToAuxInt(int32(bits.Len64(uint64(c))))
5644 return true
5645 }
5646 return false
5647 }
5648 func rewriteValuegeneric_OpBitLen8(v *Value) bool {
5649 v_0 := v.Args[0]
5650 b := v.Block
5651 config := b.Func.Config
5652
5653
5654
5655 for {
5656 if v_0.Op != OpConst8 {
5657 break
5658 }
5659 c := auxIntToInt8(v_0.AuxInt)
5660 if !(config.PtrSize == 8) {
5661 break
5662 }
5663 v.reset(OpConst64)
5664 v.AuxInt = int64ToAuxInt(int64(bits.Len8(uint8(c))))
5665 return true
5666 }
5667
5668
5669
5670 for {
5671 if v_0.Op != OpConst8 {
5672 break
5673 }
5674 c := auxIntToInt8(v_0.AuxInt)
5675 if !(config.PtrSize == 4) {
5676 break
5677 }
5678 v.reset(OpConst32)
5679 v.AuxInt = int32ToAuxInt(int32(bits.Len8(uint8(c))))
5680 return true
5681 }
5682 return false
5683 }
5684 func rewriteValuegeneric_OpCeil(v *Value) bool {
5685 v_0 := v.Args[0]
5686
5687
5688 for {
5689 if v_0.Op != OpConst64F {
5690 break
5691 }
5692 c := auxIntToFloat64(v_0.AuxInt)
5693 v.reset(OpConst64F)
5694 v.AuxInt = float64ToAuxInt(math.Ceil(c))
5695 return true
5696 }
5697 return false
5698 }
5699 func rewriteValuegeneric_OpCom16(v *Value) bool {
5700 v_0 := v.Args[0]
5701
5702
5703 for {
5704 if v_0.Op != OpCom16 {
5705 break
5706 }
5707 x := v_0.Args[0]
5708 v.copyOf(x)
5709 return true
5710 }
5711
5712
5713 for {
5714 if v_0.Op != OpConst16 {
5715 break
5716 }
5717 c := auxIntToInt16(v_0.AuxInt)
5718 v.reset(OpConst16)
5719 v.AuxInt = int16ToAuxInt(^c)
5720 return true
5721 }
5722
5723
5724 for {
5725 if v_0.Op != OpAdd16 {
5726 break
5727 }
5728 _ = v_0.Args[1]
5729 v_0_0 := v_0.Args[0]
5730 v_0_1 := v_0.Args[1]
5731 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5732 if v_0_0.Op != OpConst16 || auxIntToInt16(v_0_0.AuxInt) != -1 {
5733 continue
5734 }
5735 x := v_0_1
5736 v.reset(OpNeg16)
5737 v.AddArg(x)
5738 return true
5739 }
5740 break
5741 }
5742 return false
5743 }
5744 func rewriteValuegeneric_OpCom32(v *Value) bool {
5745 v_0 := v.Args[0]
5746
5747
5748 for {
5749 if v_0.Op != OpCom32 {
5750 break
5751 }
5752 x := v_0.Args[0]
5753 v.copyOf(x)
5754 return true
5755 }
5756
5757
5758 for {
5759 if v_0.Op != OpConst32 {
5760 break
5761 }
5762 c := auxIntToInt32(v_0.AuxInt)
5763 v.reset(OpConst32)
5764 v.AuxInt = int32ToAuxInt(^c)
5765 return true
5766 }
5767
5768
5769 for {
5770 if v_0.Op != OpAdd32 {
5771 break
5772 }
5773 _ = v_0.Args[1]
5774 v_0_0 := v_0.Args[0]
5775 v_0_1 := v_0.Args[1]
5776 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5777 if v_0_0.Op != OpConst32 || auxIntToInt32(v_0_0.AuxInt) != -1 {
5778 continue
5779 }
5780 x := v_0_1
5781 v.reset(OpNeg32)
5782 v.AddArg(x)
5783 return true
5784 }
5785 break
5786 }
5787 return false
5788 }
5789 func rewriteValuegeneric_OpCom64(v *Value) bool {
5790 v_0 := v.Args[0]
5791
5792
5793 for {
5794 if v_0.Op != OpCom64 {
5795 break
5796 }
5797 x := v_0.Args[0]
5798 v.copyOf(x)
5799 return true
5800 }
5801
5802
5803 for {
5804 if v_0.Op != OpConst64 {
5805 break
5806 }
5807 c := auxIntToInt64(v_0.AuxInt)
5808 v.reset(OpConst64)
5809 v.AuxInt = int64ToAuxInt(^c)
5810 return true
5811 }
5812
5813
5814 for {
5815 if v_0.Op != OpAdd64 {
5816 break
5817 }
5818 _ = v_0.Args[1]
5819 v_0_0 := v_0.Args[0]
5820 v_0_1 := v_0.Args[1]
5821 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5822 if v_0_0.Op != OpConst64 || auxIntToInt64(v_0_0.AuxInt) != -1 {
5823 continue
5824 }
5825 x := v_0_1
5826 v.reset(OpNeg64)
5827 v.AddArg(x)
5828 return true
5829 }
5830 break
5831 }
5832 return false
5833 }
5834 func rewriteValuegeneric_OpCom8(v *Value) bool {
5835 v_0 := v.Args[0]
5836
5837
5838 for {
5839 if v_0.Op != OpCom8 {
5840 break
5841 }
5842 x := v_0.Args[0]
5843 v.copyOf(x)
5844 return true
5845 }
5846
5847
5848 for {
5849 if v_0.Op != OpConst8 {
5850 break
5851 }
5852 c := auxIntToInt8(v_0.AuxInt)
5853 v.reset(OpConst8)
5854 v.AuxInt = int8ToAuxInt(^c)
5855 return true
5856 }
5857
5858
5859 for {
5860 if v_0.Op != OpAdd8 {
5861 break
5862 }
5863 _ = v_0.Args[1]
5864 v_0_0 := v_0.Args[0]
5865 v_0_1 := v_0.Args[1]
5866 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5867 if v_0_0.Op != OpConst8 || auxIntToInt8(v_0_0.AuxInt) != -1 {
5868 continue
5869 }
5870 x := v_0_1
5871 v.reset(OpNeg8)
5872 v.AddArg(x)
5873 return true
5874 }
5875 break
5876 }
5877 return false
5878 }
5879 func rewriteValuegeneric_OpCondSelect(v *Value) bool {
5880 v_2 := v.Args[2]
5881 v_1 := v.Args[1]
5882 v_0 := v.Args[0]
5883 b := v.Block
5884 config := b.Func.Config
5885
5886
5887 for {
5888 x := v_0
5889 if v_2.Op != OpConstBool || auxIntToBool(v_2.AuxInt) != true {
5890 break
5891 }
5892 v.copyOf(x)
5893 return true
5894 }
5895
5896
5897 for {
5898 y := v_1
5899 if v_2.Op != OpConstBool || auxIntToBool(v_2.AuxInt) != false {
5900 break
5901 }
5902 v.copyOf(y)
5903 return true
5904 }
5905
5906
5907 for {
5908 x := v_0
5909 if x != v_1 {
5910 break
5911 }
5912 v.copyOf(x)
5913 return true
5914 }
5915
5916
5917
5918 for {
5919 if v_0.Op != OpAdd8 {
5920 break
5921 }
5922 t := v_0.Type
5923 _ = v_0.Args[1]
5924 v_0_0 := v_0.Args[0]
5925 v_0_1 := v_0.Args[1]
5926 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5927 x := v_0_0
5928 if v_0_1.Op != OpConst8 || auxIntToInt8(v_0_1.AuxInt) != 1 || x != v_1 {
5929 continue
5930 }
5931 bool := v_2
5932 if !(config.arch != "arm64") {
5933 continue
5934 }
5935 v.reset(OpAdd8)
5936 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
5937 v0.AddArg(bool)
5938 v.AddArg2(x, v0)
5939 return true
5940 }
5941 break
5942 }
5943
5944
5945
5946 for {
5947 if v_0.Op != OpAdd64 {
5948 break
5949 }
5950 t := v_0.Type
5951 _ = v_0.Args[1]
5952 v_0_0 := v_0.Args[0]
5953 v_0_1 := v_0.Args[1]
5954 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5955 x := v_0_0
5956 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
5957 continue
5958 }
5959 bool := v_2
5960 if !(config.arch != "arm64") {
5961 continue
5962 }
5963 v.reset(OpAdd64)
5964 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
5965 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
5966 v1.AddArg(bool)
5967 v0.AddArg(v1)
5968 v.AddArg2(x, v0)
5969 return true
5970 }
5971 break
5972 }
5973
5974
5975
5976 for {
5977 if v_0.Op != OpAdd32 {
5978 break
5979 }
5980 t := v_0.Type
5981 _ = v_0.Args[1]
5982 v_0_0 := v_0.Args[0]
5983 v_0_1 := v_0.Args[1]
5984 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
5985 x := v_0_0
5986 if v_0_1.Op != OpConst32 || auxIntToInt32(v_0_1.AuxInt) != 1 || x != v_1 {
5987 continue
5988 }
5989 bool := v_2
5990 if !(config.arch != "arm64") {
5991 continue
5992 }
5993 v.reset(OpAdd32)
5994 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
5995 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
5996 v1.AddArg(bool)
5997 v0.AddArg(v1)
5998 v.AddArg2(x, v0)
5999 return true
6000 }
6001 break
6002 }
6003
6004
6005
6006 for {
6007 if v_0.Op != OpAdd16 {
6008 break
6009 }
6010 t := v_0.Type
6011 _ = v_0.Args[1]
6012 v_0_0 := v_0.Args[0]
6013 v_0_1 := v_0.Args[1]
6014 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6015 x := v_0_0
6016 if v_0_1.Op != OpConst16 || auxIntToInt16(v_0_1.AuxInt) != 1 || x != v_1 {
6017 continue
6018 }
6019 bool := v_2
6020 if !(config.arch != "arm64") {
6021 continue
6022 }
6023 v.reset(OpAdd16)
6024 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6025 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6026 v1.AddArg(bool)
6027 v0.AddArg(v1)
6028 v.AddArg2(x, v0)
6029 return true
6030 }
6031 break
6032 }
6033
6034
6035 for {
6036 if v_0.Op != OpAdd8 {
6037 break
6038 }
6039 t := v_0.Type
6040 _ = v_0.Args[1]
6041 v_0_0 := v_0.Args[0]
6042 v_0_1 := v_0.Args[1]
6043 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6044 x := v_0_0
6045 if v_0_1.Op != OpConst8 || auxIntToInt8(v_0_1.AuxInt) != -1 || x != v_1 {
6046 continue
6047 }
6048 bool := v_2
6049 v.reset(OpSub8)
6050 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, t)
6051 v0.AddArg(bool)
6052 v.AddArg2(x, v0)
6053 return true
6054 }
6055 break
6056 }
6057
6058
6059 for {
6060 if v_0.Op != OpAdd64 {
6061 break
6062 }
6063 t := v_0.Type
6064 _ = v_0.Args[1]
6065 v_0_0 := v_0.Args[0]
6066 v_0_1 := v_0.Args[1]
6067 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6068 x := v_0_0
6069 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != -1 || x != v_1 {
6070 continue
6071 }
6072 bool := v_2
6073 v.reset(OpSub64)
6074 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, t)
6075 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6076 v1.AddArg(bool)
6077 v0.AddArg(v1)
6078 v.AddArg2(x, v0)
6079 return true
6080 }
6081 break
6082 }
6083
6084
6085 for {
6086 if v_0.Op != OpAdd32 {
6087 break
6088 }
6089 t := v_0.Type
6090 _ = v_0.Args[1]
6091 v_0_0 := v_0.Args[0]
6092 v_0_1 := v_0.Args[1]
6093 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6094 x := v_0_0
6095 if v_0_1.Op != OpConst32 || auxIntToInt32(v_0_1.AuxInt) != -1 || x != v_1 {
6096 continue
6097 }
6098 bool := v_2
6099 v.reset(OpSub32)
6100 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, t)
6101 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6102 v1.AddArg(bool)
6103 v0.AddArg(v1)
6104 v.AddArg2(x, v0)
6105 return true
6106 }
6107 break
6108 }
6109
6110
6111 for {
6112 if v_0.Op != OpAdd16 {
6113 break
6114 }
6115 t := v_0.Type
6116 _ = v_0.Args[1]
6117 v_0_0 := v_0.Args[0]
6118 v_0_1 := v_0.Args[1]
6119 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6120 x := v_0_0
6121 if v_0_1.Op != OpConst16 || auxIntToInt16(v_0_1.AuxInt) != -1 || x != v_1 {
6122 continue
6123 }
6124 bool := v_2
6125 v.reset(OpSub16)
6126 v0 := b.NewValue0(v.Pos, OpZeroExt8to16, t)
6127 v1 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6128 v1.AddArg(bool)
6129 v0.AddArg(v1)
6130 v.AddArg2(x, v0)
6131 return true
6132 }
6133 break
6134 }
6135
6136
6137 for {
6138 if v_0.Op != OpLsh64x64 {
6139 break
6140 }
6141 _ = v_0.Args[1]
6142 x := v_0.Args[0]
6143 v_0_1 := v_0.Args[1]
6144 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6145 break
6146 }
6147 bool := v_2
6148 v.reset(OpLsh64x8)
6149 v.AuxInt = boolToAuxInt(true)
6150 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6151 v0.AddArg(bool)
6152 v.AddArg2(x, v0)
6153 return true
6154 }
6155
6156
6157 for {
6158 if v_0.Op != OpLsh32x64 {
6159 break
6160 }
6161 _ = v_0.Args[1]
6162 x := v_0.Args[0]
6163 v_0_1 := v_0.Args[1]
6164 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6165 break
6166 }
6167 bool := v_2
6168 v.reset(OpLsh32x8)
6169 v.AuxInt = boolToAuxInt(true)
6170 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6171 v0.AddArg(bool)
6172 v.AddArg2(x, v0)
6173 return true
6174 }
6175
6176
6177 for {
6178 if v_0.Op != OpLsh16x64 {
6179 break
6180 }
6181 _ = v_0.Args[1]
6182 x := v_0.Args[0]
6183 v_0_1 := v_0.Args[1]
6184 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6185 break
6186 }
6187 bool := v_2
6188 v.reset(OpLsh16x8)
6189 v.AuxInt = boolToAuxInt(true)
6190 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6191 v0.AddArg(bool)
6192 v.AddArg2(x, v0)
6193 return true
6194 }
6195
6196
6197 for {
6198 if v_0.Op != OpLsh8x64 {
6199 break
6200 }
6201 _ = v_0.Args[1]
6202 x := v_0.Args[0]
6203 v_0_1 := v_0.Args[1]
6204 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6205 break
6206 }
6207 bool := v_2
6208 v.reset(OpLsh8x8)
6209 v.AuxInt = boolToAuxInt(true)
6210 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6211 v0.AddArg(bool)
6212 v.AddArg2(x, v0)
6213 return true
6214 }
6215
6216
6217 for {
6218 if v_0.Op != OpRsh64x64 {
6219 break
6220 }
6221 _ = v_0.Args[1]
6222 x := v_0.Args[0]
6223 v_0_1 := v_0.Args[1]
6224 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6225 break
6226 }
6227 bool := v_2
6228 v.reset(OpRsh64x8)
6229 v.AuxInt = boolToAuxInt(true)
6230 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6231 v0.AddArg(bool)
6232 v.AddArg2(x, v0)
6233 return true
6234 }
6235
6236
6237 for {
6238 if v_0.Op != OpRsh32x64 {
6239 break
6240 }
6241 _ = v_0.Args[1]
6242 x := v_0.Args[0]
6243 v_0_1 := v_0.Args[1]
6244 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6245 break
6246 }
6247 bool := v_2
6248 v.reset(OpRsh32x8)
6249 v.AuxInt = boolToAuxInt(true)
6250 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6251 v0.AddArg(bool)
6252 v.AddArg2(x, v0)
6253 return true
6254 }
6255
6256
6257 for {
6258 if v_0.Op != OpRsh16x64 {
6259 break
6260 }
6261 _ = v_0.Args[1]
6262 x := v_0.Args[0]
6263 v_0_1 := v_0.Args[1]
6264 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6265 break
6266 }
6267 bool := v_2
6268 v.reset(OpRsh16x8)
6269 v.AuxInt = boolToAuxInt(true)
6270 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6271 v0.AddArg(bool)
6272 v.AddArg2(x, v0)
6273 return true
6274 }
6275
6276
6277 for {
6278 if v_0.Op != OpRsh8x64 {
6279 break
6280 }
6281 _ = v_0.Args[1]
6282 x := v_0.Args[0]
6283 v_0_1 := v_0.Args[1]
6284 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6285 break
6286 }
6287 bool := v_2
6288 v.reset(OpRsh8x8)
6289 v.AuxInt = boolToAuxInt(true)
6290 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6291 v0.AddArg(bool)
6292 v.AddArg2(x, v0)
6293 return true
6294 }
6295
6296
6297 for {
6298 if v_0.Op != OpRsh64Ux64 {
6299 break
6300 }
6301 _ = v_0.Args[1]
6302 x := v_0.Args[0]
6303 v_0_1 := v_0.Args[1]
6304 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6305 break
6306 }
6307 bool := v_2
6308 v.reset(OpRsh64Ux8)
6309 v.AuxInt = boolToAuxInt(true)
6310 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6311 v0.AddArg(bool)
6312 v.AddArg2(x, v0)
6313 return true
6314 }
6315
6316
6317 for {
6318 if v_0.Op != OpRsh32Ux64 {
6319 break
6320 }
6321 _ = v_0.Args[1]
6322 x := v_0.Args[0]
6323 v_0_1 := v_0.Args[1]
6324 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6325 break
6326 }
6327 bool := v_2
6328 v.reset(OpRsh32Ux8)
6329 v.AuxInt = boolToAuxInt(true)
6330 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6331 v0.AddArg(bool)
6332 v.AddArg2(x, v0)
6333 return true
6334 }
6335
6336
6337 for {
6338 if v_0.Op != OpRsh16Ux64 {
6339 break
6340 }
6341 _ = v_0.Args[1]
6342 x := v_0.Args[0]
6343 v_0_1 := v_0.Args[1]
6344 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6345 break
6346 }
6347 bool := v_2
6348 v.reset(OpRsh16Ux8)
6349 v.AuxInt = boolToAuxInt(true)
6350 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6351 v0.AddArg(bool)
6352 v.AddArg2(x, v0)
6353 return true
6354 }
6355
6356
6357 for {
6358 if v_0.Op != OpRsh8Ux64 {
6359 break
6360 }
6361 _ = v_0.Args[1]
6362 x := v_0.Args[0]
6363 v_0_1 := v_0.Args[1]
6364 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 1 || x != v_1 {
6365 break
6366 }
6367 bool := v_2
6368 v.reset(OpRsh8Ux8)
6369 v.AuxInt = boolToAuxInt(true)
6370 v0 := b.NewValue0(v.Pos, OpCvtBoolToUint8, types.Types[types.TUINT8])
6371 v0.AddArg(bool)
6372 v.AddArg2(x, v0)
6373 return true
6374 }
6375 return false
6376 }
6377 func rewriteValuegeneric_OpConstInterface(v *Value) bool {
6378 b := v.Block
6379 typ := &b.Func.Config.Types
6380
6381
6382 for {
6383 v.reset(OpIMake)
6384 v0 := b.NewValue0(v.Pos, OpConstNil, typ.Uintptr)
6385 v1 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
6386 v.AddArg2(v0, v1)
6387 return true
6388 }
6389 }
6390 func rewriteValuegeneric_OpConstSlice(v *Value) bool {
6391 b := v.Block
6392 config := b.Func.Config
6393 typ := &b.Func.Config.Types
6394
6395
6396
6397 for {
6398 if !(config.PtrSize == 4) {
6399 break
6400 }
6401 v.reset(OpSliceMake)
6402 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo())
6403 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
6404 v1.AuxInt = int32ToAuxInt(0)
6405 v.AddArg3(v0, v1, v1)
6406 return true
6407 }
6408
6409
6410
6411 for {
6412 if !(config.PtrSize == 8) {
6413 break
6414 }
6415 v.reset(OpSliceMake)
6416 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo())
6417 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
6418 v1.AuxInt = int64ToAuxInt(0)
6419 v.AddArg3(v0, v1, v1)
6420 return true
6421 }
6422 return false
6423 }
6424 func rewriteValuegeneric_OpConstString(v *Value) bool {
6425 b := v.Block
6426 config := b.Func.Config
6427 fe := b.Func.fe
6428 typ := &b.Func.Config.Types
6429
6430
6431
6432 for {
6433 str := auxToString(v.Aux)
6434 if !(config.PtrSize == 4 && str == "") {
6435 break
6436 }
6437 v.reset(OpStringMake)
6438 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
6439 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
6440 v1.AuxInt = int32ToAuxInt(0)
6441 v.AddArg2(v0, v1)
6442 return true
6443 }
6444
6445
6446
6447 for {
6448 str := auxToString(v.Aux)
6449 if !(config.PtrSize == 8 && str == "") {
6450 break
6451 }
6452 v.reset(OpStringMake)
6453 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr)
6454 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
6455 v1.AuxInt = int64ToAuxInt(0)
6456 v.AddArg2(v0, v1)
6457 return true
6458 }
6459
6460
6461
6462 for {
6463 str := auxToString(v.Aux)
6464 if !(config.PtrSize == 4 && str != "") {
6465 break
6466 }
6467 v.reset(OpStringMake)
6468 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr)
6469 v0.Aux = symToAux(fe.StringData(str))
6470 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
6471 v0.AddArg(v1)
6472 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int)
6473 v2.AuxInt = int32ToAuxInt(int32(len(str)))
6474 v.AddArg2(v0, v2)
6475 return true
6476 }
6477
6478
6479
6480 for {
6481 str := auxToString(v.Aux)
6482 if !(config.PtrSize == 8 && str != "") {
6483 break
6484 }
6485 v.reset(OpStringMake)
6486 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr)
6487 v0.Aux = symToAux(fe.StringData(str))
6488 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
6489 v0.AddArg(v1)
6490 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int)
6491 v2.AuxInt = int64ToAuxInt(int64(len(str)))
6492 v.AddArg2(v0, v2)
6493 return true
6494 }
6495 return false
6496 }
6497 func rewriteValuegeneric_OpConvert(v *Value) bool {
6498 v_1 := v.Args[1]
6499 v_0 := v.Args[0]
6500 b := v.Block
6501
6502
6503 for {
6504 if v_0.Op != OpAdd64 {
6505 break
6506 }
6507 _ = v_0.Args[1]
6508 v_0_0 := v_0.Args[0]
6509 v_0_1 := v_0.Args[1]
6510 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6511 if v_0_0.Op != OpConvert {
6512 continue
6513 }
6514 mem := v_0_0.Args[1]
6515 ptr := v_0_0.Args[0]
6516 off := v_0_1
6517 if mem != v_1 {
6518 continue
6519 }
6520 v.reset(OpAddPtr)
6521 v.AddArg2(ptr, off)
6522 return true
6523 }
6524 break
6525 }
6526
6527
6528 for {
6529 if v_0.Op != OpAdd32 {
6530 break
6531 }
6532 _ = v_0.Args[1]
6533 v_0_0 := v_0.Args[0]
6534 v_0_1 := v_0.Args[1]
6535 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
6536 if v_0_0.Op != OpConvert {
6537 continue
6538 }
6539 mem := v_0_0.Args[1]
6540 ptr := v_0_0.Args[0]
6541 off := v_0_1
6542 if mem != v_1 {
6543 continue
6544 }
6545 v.reset(OpAddPtr)
6546 v.AddArg2(ptr, off)
6547 return true
6548 }
6549 break
6550 }
6551
6552
6553 for {
6554 if v_0.Op != OpConvert {
6555 break
6556 }
6557 mem := v_0.Args[1]
6558 ptr := v_0.Args[0]
6559 if mem != v_1 {
6560 break
6561 }
6562 v.copyOf(ptr)
6563 return true
6564 }
6565
6566
6567 for {
6568 a := v_0
6569 if a.Op != OpAdd64 {
6570 break
6571 }
6572 _ = a.Args[1]
6573 a_0 := a.Args[0]
6574 a_1 := a.Args[1]
6575 for _i0 := 0; _i0 <= 1; _i0, a_0, a_1 = _i0+1, a_1, a_0 {
6576 if a_0.Op != OpAdd64 {
6577 continue
6578 }
6579 _ = a_0.Args[1]
6580 a_0_0 := a_0.Args[0]
6581 a_0_1 := a_0.Args[1]
6582 for _i1 := 0; _i1 <= 1; _i1, a_0_0, a_0_1 = _i1+1, a_0_1, a_0_0 {
6583 if a_0_0.Op != OpConvert {
6584 continue
6585 }
6586 mem := a_0_0.Args[1]
6587 ptr := a_0_0.Args[0]
6588 off1 := a_0_1
6589 off2 := a_1
6590 if mem != v_1 {
6591 continue
6592 }
6593 v.reset(OpAddPtr)
6594 v0 := b.NewValue0(v.Pos, OpAdd64, a.Type)
6595 v0.AddArg2(off1, off2)
6596 v.AddArg2(ptr, v0)
6597 return true
6598 }
6599 }
6600 break
6601 }
6602
6603
6604 for {
6605 a := v_0
6606 if a.Op != OpAdd32 {
6607 break
6608 }
6609 _ = a.Args[1]
6610 a_0 := a.Args[0]
6611 a_1 := a.Args[1]
6612 for _i0 := 0; _i0 <= 1; _i0, a_0, a_1 = _i0+1, a_1, a_0 {
6613 if a_0.Op != OpAdd32 {
6614 continue
6615 }
6616 _ = a_0.Args[1]
6617 a_0_0 := a_0.Args[0]
6618 a_0_1 := a_0.Args[1]
6619 for _i1 := 0; _i1 <= 1; _i1, a_0_0, a_0_1 = _i1+1, a_0_1, a_0_0 {
6620 if a_0_0.Op != OpConvert {
6621 continue
6622 }
6623 mem := a_0_0.Args[1]
6624 ptr := a_0_0.Args[0]
6625 off1 := a_0_1
6626 off2 := a_1
6627 if mem != v_1 {
6628 continue
6629 }
6630 v.reset(OpAddPtr)
6631 v0 := b.NewValue0(v.Pos, OpAdd32, a.Type)
6632 v0.AddArg2(off1, off2)
6633 v.AddArg2(ptr, v0)
6634 return true
6635 }
6636 }
6637 break
6638 }
6639 return false
6640 }
6641 func rewriteValuegeneric_OpCtz16(v *Value) bool {
6642 v_0 := v.Args[0]
6643 b := v.Block
6644 config := b.Func.Config
6645
6646
6647
6648 for {
6649 if v_0.Op != OpConst16 {
6650 break
6651 }
6652 c := auxIntToInt16(v_0.AuxInt)
6653 if !(config.PtrSize == 4) {
6654 break
6655 }
6656 v.reset(OpConst32)
6657 v.AuxInt = int32ToAuxInt(int32(ntz16(c)))
6658 return true
6659 }
6660
6661
6662
6663 for {
6664 if v_0.Op != OpConst16 {
6665 break
6666 }
6667 c := auxIntToInt16(v_0.AuxInt)
6668 if !(config.PtrSize == 8) {
6669 break
6670 }
6671 v.reset(OpConst64)
6672 v.AuxInt = int64ToAuxInt(int64(ntz16(c)))
6673 return true
6674 }
6675 return false
6676 }
6677 func rewriteValuegeneric_OpCtz32(v *Value) bool {
6678 v_0 := v.Args[0]
6679 b := v.Block
6680 config := b.Func.Config
6681
6682
6683
6684 for {
6685 if v_0.Op != OpConst32 {
6686 break
6687 }
6688 c := auxIntToInt32(v_0.AuxInt)
6689 if !(config.PtrSize == 4) {
6690 break
6691 }
6692 v.reset(OpConst32)
6693 v.AuxInt = int32ToAuxInt(int32(ntz32(c)))
6694 return true
6695 }
6696
6697
6698
6699 for {
6700 if v_0.Op != OpConst32 {
6701 break
6702 }
6703 c := auxIntToInt32(v_0.AuxInt)
6704 if !(config.PtrSize == 8) {
6705 break
6706 }
6707 v.reset(OpConst64)
6708 v.AuxInt = int64ToAuxInt(int64(ntz32(c)))
6709 return true
6710 }
6711 return false
6712 }
6713 func rewriteValuegeneric_OpCtz64(v *Value) bool {
6714 v_0 := v.Args[0]
6715 b := v.Block
6716 config := b.Func.Config
6717
6718
6719
6720 for {
6721 if v_0.Op != OpConst64 {
6722 break
6723 }
6724 c := auxIntToInt64(v_0.AuxInt)
6725 if !(config.PtrSize == 4) {
6726 break
6727 }
6728 v.reset(OpConst32)
6729 v.AuxInt = int32ToAuxInt(int32(ntz64(c)))
6730 return true
6731 }
6732
6733
6734
6735 for {
6736 if v_0.Op != OpConst64 {
6737 break
6738 }
6739 c := auxIntToInt64(v_0.AuxInt)
6740 if !(config.PtrSize == 8) {
6741 break
6742 }
6743 v.reset(OpConst64)
6744 v.AuxInt = int64ToAuxInt(int64(ntz64(c)))
6745 return true
6746 }
6747 return false
6748 }
6749 func rewriteValuegeneric_OpCtz8(v *Value) bool {
6750 v_0 := v.Args[0]
6751 b := v.Block
6752 config := b.Func.Config
6753
6754
6755
6756 for {
6757 if v_0.Op != OpConst8 {
6758 break
6759 }
6760 c := auxIntToInt8(v_0.AuxInt)
6761 if !(config.PtrSize == 4) {
6762 break
6763 }
6764 v.reset(OpConst32)
6765 v.AuxInt = int32ToAuxInt(int32(ntz8(c)))
6766 return true
6767 }
6768
6769
6770
6771 for {
6772 if v_0.Op != OpConst8 {
6773 break
6774 }
6775 c := auxIntToInt8(v_0.AuxInt)
6776 if !(config.PtrSize == 8) {
6777 break
6778 }
6779 v.reset(OpConst64)
6780 v.AuxInt = int64ToAuxInt(int64(ntz8(c)))
6781 return true
6782 }
6783 return false
6784 }
6785 func rewriteValuegeneric_OpCvt32Fto32(v *Value) bool {
6786 v_0 := v.Args[0]
6787
6788
6789
6790 for {
6791 if v_0.Op != OpConst32F {
6792 break
6793 }
6794 c := auxIntToFloat32(v_0.AuxInt)
6795 if !(c >= -1<<31 && c < 1<<31) {
6796 break
6797 }
6798 v.reset(OpConst32)
6799 v.AuxInt = int32ToAuxInt(int32(c))
6800 return true
6801 }
6802 return false
6803 }
6804 func rewriteValuegeneric_OpCvt32Fto64(v *Value) bool {
6805 v_0 := v.Args[0]
6806
6807
6808
6809 for {
6810 if v_0.Op != OpConst32F {
6811 break
6812 }
6813 c := auxIntToFloat32(v_0.AuxInt)
6814 if !(c >= -1<<63 && c < 1<<63) {
6815 break
6816 }
6817 v.reset(OpConst64)
6818 v.AuxInt = int64ToAuxInt(int64(c))
6819 return true
6820 }
6821 return false
6822 }
6823 func rewriteValuegeneric_OpCvt32Fto64F(v *Value) bool {
6824 v_0 := v.Args[0]
6825
6826
6827 for {
6828 if v_0.Op != OpConst32F {
6829 break
6830 }
6831 c := auxIntToFloat32(v_0.AuxInt)
6832 v.reset(OpConst64F)
6833 v.AuxInt = float64ToAuxInt(float64(c))
6834 return true
6835 }
6836 return false
6837 }
6838 func rewriteValuegeneric_OpCvt32to32F(v *Value) bool {
6839 v_0 := v.Args[0]
6840
6841
6842 for {
6843 if v_0.Op != OpConst32 {
6844 break
6845 }
6846 c := auxIntToInt32(v_0.AuxInt)
6847 v.reset(OpConst32F)
6848 v.AuxInt = float32ToAuxInt(float32(c))
6849 return true
6850 }
6851 return false
6852 }
6853 func rewriteValuegeneric_OpCvt32to64F(v *Value) bool {
6854 v_0 := v.Args[0]
6855
6856
6857 for {
6858 if v_0.Op != OpConst32 {
6859 break
6860 }
6861 c := auxIntToInt32(v_0.AuxInt)
6862 v.reset(OpConst64F)
6863 v.AuxInt = float64ToAuxInt(float64(c))
6864 return true
6865 }
6866 return false
6867 }
6868 func rewriteValuegeneric_OpCvt64Fto32(v *Value) bool {
6869 v_0 := v.Args[0]
6870
6871
6872
6873 for {
6874 if v_0.Op != OpConst64F {
6875 break
6876 }
6877 c := auxIntToFloat64(v_0.AuxInt)
6878 if !(c >= -1<<31 && c < 1<<31) {
6879 break
6880 }
6881 v.reset(OpConst32)
6882 v.AuxInt = int32ToAuxInt(int32(c))
6883 return true
6884 }
6885 return false
6886 }
6887 func rewriteValuegeneric_OpCvt64Fto32F(v *Value) bool {
6888 v_0 := v.Args[0]
6889
6890
6891 for {
6892 if v_0.Op != OpConst64F {
6893 break
6894 }
6895 c := auxIntToFloat64(v_0.AuxInt)
6896 v.reset(OpConst32F)
6897 v.AuxInt = float32ToAuxInt(float32(c))
6898 return true
6899 }
6900
6901
6902
6903 for {
6904 sqrt0 := v_0
6905 if sqrt0.Op != OpSqrt {
6906 break
6907 }
6908 sqrt0_0 := sqrt0.Args[0]
6909 if sqrt0_0.Op != OpCvt32Fto64F {
6910 break
6911 }
6912 x := sqrt0_0.Args[0]
6913 if !(sqrt0.Uses == 1) {
6914 break
6915 }
6916 v.reset(OpSqrt32)
6917 v.AddArg(x)
6918 return true
6919 }
6920 return false
6921 }
6922 func rewriteValuegeneric_OpCvt64Fto64(v *Value) bool {
6923 v_0 := v.Args[0]
6924
6925
6926
6927 for {
6928 if v_0.Op != OpConst64F {
6929 break
6930 }
6931 c := auxIntToFloat64(v_0.AuxInt)
6932 if !(c >= -1<<63 && c < 1<<63) {
6933 break
6934 }
6935 v.reset(OpConst64)
6936 v.AuxInt = int64ToAuxInt(int64(c))
6937 return true
6938 }
6939 return false
6940 }
6941 func rewriteValuegeneric_OpCvt64to32F(v *Value) bool {
6942 v_0 := v.Args[0]
6943
6944
6945 for {
6946 if v_0.Op != OpConst64 {
6947 break
6948 }
6949 c := auxIntToInt64(v_0.AuxInt)
6950 v.reset(OpConst32F)
6951 v.AuxInt = float32ToAuxInt(float32(c))
6952 return true
6953 }
6954 return false
6955 }
6956 func rewriteValuegeneric_OpCvt64to64F(v *Value) bool {
6957 v_0 := v.Args[0]
6958
6959
6960 for {
6961 if v_0.Op != OpConst64 {
6962 break
6963 }
6964 c := auxIntToInt64(v_0.AuxInt)
6965 v.reset(OpConst64F)
6966 v.AuxInt = float64ToAuxInt(float64(c))
6967 return true
6968 }
6969 return false
6970 }
6971 func rewriteValuegeneric_OpCvtBoolToUint8(v *Value) bool {
6972 v_0 := v.Args[0]
6973
6974
6975 for {
6976 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
6977 break
6978 }
6979 v.reset(OpConst8)
6980 v.AuxInt = int8ToAuxInt(0)
6981 return true
6982 }
6983
6984
6985 for {
6986 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
6987 break
6988 }
6989 v.reset(OpConst8)
6990 v.AuxInt = int8ToAuxInt(1)
6991 return true
6992 }
6993 return false
6994 }
6995 func rewriteValuegeneric_OpDiv128u(v *Value) bool {
6996 v_2 := v.Args[2]
6997 v_1 := v.Args[1]
6998 v_0 := v.Args[0]
6999 b := v.Block
7000
7001
7002 for {
7003 t := v.Type
7004 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
7005 break
7006 }
7007 lo := v_1
7008 y := v_2
7009 v.reset(OpMakeTuple)
7010 v0 := b.NewValue0(v.Pos, OpDiv64u, t.FieldType(0))
7011 v0.AddArg2(lo, y)
7012 v1 := b.NewValue0(v.Pos, OpMod64u, t.FieldType(1))
7013 v1.AddArg2(lo, y)
7014 v.AddArg2(v0, v1)
7015 return true
7016 }
7017 return false
7018 }
7019 func rewriteValuegeneric_OpDiv16(v *Value) bool {
7020 v_1 := v.Args[1]
7021 v_0 := v.Args[0]
7022 b := v.Block
7023 typ := &b.Func.Config.Types
7024
7025
7026
7027 for {
7028 if v_0.Op != OpConst16 {
7029 break
7030 }
7031 c := auxIntToInt16(v_0.AuxInt)
7032 if v_1.Op != OpConst16 {
7033 break
7034 }
7035 d := auxIntToInt16(v_1.AuxInt)
7036 if !(d != 0) {
7037 break
7038 }
7039 v.reset(OpConst16)
7040 v.AuxInt = int16ToAuxInt(c / d)
7041 return true
7042 }
7043
7044
7045
7046 for {
7047 t := v.Type
7048 n := v_0
7049 if v_1.Op != OpConst16 {
7050 break
7051 }
7052 c := auxIntToInt16(v_1.AuxInt)
7053 if !(c < 0 && c != -1<<15) {
7054 break
7055 }
7056 v.reset(OpNeg16)
7057 v0 := b.NewValue0(v.Pos, OpDiv16, t)
7058 v1 := b.NewValue0(v.Pos, OpConst16, t)
7059 v1.AuxInt = int16ToAuxInt(-c)
7060 v0.AddArg2(n, v1)
7061 v.AddArg(v0)
7062 return true
7063 }
7064
7065
7066 for {
7067 t := v.Type
7068 x := v_0
7069 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != -1<<15 {
7070 break
7071 }
7072 v.reset(OpRsh16Ux64)
7073 v0 := b.NewValue0(v.Pos, OpAnd16, t)
7074 v1 := b.NewValue0(v.Pos, OpNeg16, t)
7075 v1.AddArg(x)
7076 v0.AddArg2(x, v1)
7077 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7078 v2.AuxInt = int64ToAuxInt(15)
7079 v.AddArg2(v0, v2)
7080 return true
7081 }
7082 return false
7083 }
7084 func rewriteValuegeneric_OpDiv16u(v *Value) bool {
7085 v_1 := v.Args[1]
7086 v_0 := v.Args[0]
7087 b := v.Block
7088 typ := &b.Func.Config.Types
7089
7090
7091
7092 for {
7093 if v_0.Op != OpConst16 {
7094 break
7095 }
7096 c := auxIntToInt16(v_0.AuxInt)
7097 if v_1.Op != OpConst16 {
7098 break
7099 }
7100 d := auxIntToInt16(v_1.AuxInt)
7101 if !(d != 0) {
7102 break
7103 }
7104 v.reset(OpConst16)
7105 v.AuxInt = int16ToAuxInt(int16(uint16(c) / uint16(d)))
7106 return true
7107 }
7108
7109
7110
7111 for {
7112 n := v_0
7113 if v_1.Op != OpConst16 {
7114 break
7115 }
7116 c := auxIntToInt16(v_1.AuxInt)
7117 if !(isUnsignedPowerOfTwo(uint16(c))) {
7118 break
7119 }
7120 v.reset(OpRsh16Ux64)
7121 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7122 v0.AuxInt = int64ToAuxInt(log16u(uint16(c)))
7123 v.AddArg2(n, v0)
7124 return true
7125 }
7126 return false
7127 }
7128 func rewriteValuegeneric_OpDiv32(v *Value) bool {
7129 v_1 := v.Args[1]
7130 v_0 := v.Args[0]
7131 b := v.Block
7132 typ := &b.Func.Config.Types
7133
7134
7135
7136 for {
7137 if v_0.Op != OpConst32 {
7138 break
7139 }
7140 c := auxIntToInt32(v_0.AuxInt)
7141 if v_1.Op != OpConst32 {
7142 break
7143 }
7144 d := auxIntToInt32(v_1.AuxInt)
7145 if !(d != 0) {
7146 break
7147 }
7148 v.reset(OpConst32)
7149 v.AuxInt = int32ToAuxInt(c / d)
7150 return true
7151 }
7152
7153
7154
7155 for {
7156 t := v.Type
7157 n := v_0
7158 if v_1.Op != OpConst32 {
7159 break
7160 }
7161 c := auxIntToInt32(v_1.AuxInt)
7162 if !(c < 0 && c != -1<<31) {
7163 break
7164 }
7165 v.reset(OpNeg32)
7166 v0 := b.NewValue0(v.Pos, OpDiv32, t)
7167 v1 := b.NewValue0(v.Pos, OpConst32, t)
7168 v1.AuxInt = int32ToAuxInt(-c)
7169 v0.AddArg2(n, v1)
7170 v.AddArg(v0)
7171 return true
7172 }
7173
7174
7175 for {
7176 t := v.Type
7177 x := v_0
7178 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != -1<<31 {
7179 break
7180 }
7181 v.reset(OpRsh32Ux64)
7182 v0 := b.NewValue0(v.Pos, OpAnd32, t)
7183 v1 := b.NewValue0(v.Pos, OpNeg32, t)
7184 v1.AddArg(x)
7185 v0.AddArg2(x, v1)
7186 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7187 v2.AuxInt = int64ToAuxInt(31)
7188 v.AddArg2(v0, v2)
7189 return true
7190 }
7191 return false
7192 }
7193 func rewriteValuegeneric_OpDiv32F(v *Value) bool {
7194 v_1 := v.Args[1]
7195 v_0 := v.Args[0]
7196 b := v.Block
7197
7198
7199
7200 for {
7201 if v_0.Op != OpConst32F {
7202 break
7203 }
7204 c := auxIntToFloat32(v_0.AuxInt)
7205 if v_1.Op != OpConst32F {
7206 break
7207 }
7208 d := auxIntToFloat32(v_1.AuxInt)
7209 if !(c/d == c/d) {
7210 break
7211 }
7212 v.reset(OpConst32F)
7213 v.AuxInt = float32ToAuxInt(c / d)
7214 return true
7215 }
7216
7217
7218
7219 for {
7220 x := v_0
7221 if v_1.Op != OpConst32F {
7222 break
7223 }
7224 t := v_1.Type
7225 c := auxIntToFloat32(v_1.AuxInt)
7226 if !(reciprocalExact32(c)) {
7227 break
7228 }
7229 v.reset(OpMul32F)
7230 v0 := b.NewValue0(v.Pos, OpConst32F, t)
7231 v0.AuxInt = float32ToAuxInt(1 / c)
7232 v.AddArg2(x, v0)
7233 return true
7234 }
7235 return false
7236 }
7237 func rewriteValuegeneric_OpDiv32u(v *Value) bool {
7238 v_1 := v.Args[1]
7239 v_0 := v.Args[0]
7240 b := v.Block
7241 typ := &b.Func.Config.Types
7242
7243
7244
7245 for {
7246 if v_0.Op != OpConst32 {
7247 break
7248 }
7249 c := auxIntToInt32(v_0.AuxInt)
7250 if v_1.Op != OpConst32 {
7251 break
7252 }
7253 d := auxIntToInt32(v_1.AuxInt)
7254 if !(d != 0) {
7255 break
7256 }
7257 v.reset(OpConst32)
7258 v.AuxInt = int32ToAuxInt(int32(uint32(c) / uint32(d)))
7259 return true
7260 }
7261
7262
7263
7264 for {
7265 n := v_0
7266 if v_1.Op != OpConst32 {
7267 break
7268 }
7269 c := auxIntToInt32(v_1.AuxInt)
7270 if !(isUnsignedPowerOfTwo(uint32(c))) {
7271 break
7272 }
7273 v.reset(OpRsh32Ux64)
7274 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7275 v0.AuxInt = int64ToAuxInt(log32u(uint32(c)))
7276 v.AddArg2(n, v0)
7277 return true
7278 }
7279 return false
7280 }
7281 func rewriteValuegeneric_OpDiv64(v *Value) bool {
7282 v_1 := v.Args[1]
7283 v_0 := v.Args[0]
7284 b := v.Block
7285 typ := &b.Func.Config.Types
7286
7287
7288
7289 for {
7290 if v_0.Op != OpConst64 {
7291 break
7292 }
7293 c := auxIntToInt64(v_0.AuxInt)
7294 if v_1.Op != OpConst64 {
7295 break
7296 }
7297 d := auxIntToInt64(v_1.AuxInt)
7298 if !(d != 0) {
7299 break
7300 }
7301 v.reset(OpConst64)
7302 v.AuxInt = int64ToAuxInt(c / d)
7303 return true
7304 }
7305
7306
7307
7308 for {
7309 t := v.Type
7310 n := v_0
7311 if v_1.Op != OpConst64 {
7312 break
7313 }
7314 c := auxIntToInt64(v_1.AuxInt)
7315 if !(c < 0 && c != -1<<63) {
7316 break
7317 }
7318 v.reset(OpNeg64)
7319 v0 := b.NewValue0(v.Pos, OpDiv64, t)
7320 v1 := b.NewValue0(v.Pos, OpConst64, t)
7321 v1.AuxInt = int64ToAuxInt(-c)
7322 v0.AddArg2(n, v1)
7323 v.AddArg(v0)
7324 return true
7325 }
7326
7327
7328
7329 for {
7330 x := v_0
7331 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 || !(isNonNegative(x)) {
7332 break
7333 }
7334 v.reset(OpConst64)
7335 v.AuxInt = int64ToAuxInt(0)
7336 return true
7337 }
7338
7339
7340 for {
7341 t := v.Type
7342 x := v_0
7343 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 {
7344 break
7345 }
7346 v.reset(OpRsh64Ux64)
7347 v0 := b.NewValue0(v.Pos, OpAnd64, t)
7348 v1 := b.NewValue0(v.Pos, OpNeg64, t)
7349 v1.AddArg(x)
7350 v0.AddArg2(x, v1)
7351 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7352 v2.AuxInt = int64ToAuxInt(63)
7353 v.AddArg2(v0, v2)
7354 return true
7355 }
7356 return false
7357 }
7358 func rewriteValuegeneric_OpDiv64F(v *Value) bool {
7359 v_1 := v.Args[1]
7360 v_0 := v.Args[0]
7361 b := v.Block
7362
7363
7364
7365 for {
7366 if v_0.Op != OpConst64F {
7367 break
7368 }
7369 c := auxIntToFloat64(v_0.AuxInt)
7370 if v_1.Op != OpConst64F {
7371 break
7372 }
7373 d := auxIntToFloat64(v_1.AuxInt)
7374 if !(c/d == c/d) {
7375 break
7376 }
7377 v.reset(OpConst64F)
7378 v.AuxInt = float64ToAuxInt(c / d)
7379 return true
7380 }
7381
7382
7383
7384 for {
7385 x := v_0
7386 if v_1.Op != OpConst64F {
7387 break
7388 }
7389 t := v_1.Type
7390 c := auxIntToFloat64(v_1.AuxInt)
7391 if !(reciprocalExact64(c)) {
7392 break
7393 }
7394 v.reset(OpMul64F)
7395 v0 := b.NewValue0(v.Pos, OpConst64F, t)
7396 v0.AuxInt = float64ToAuxInt(1 / c)
7397 v.AddArg2(x, v0)
7398 return true
7399 }
7400 return false
7401 }
7402 func rewriteValuegeneric_OpDiv64u(v *Value) bool {
7403 v_1 := v.Args[1]
7404 v_0 := v.Args[0]
7405 b := v.Block
7406 typ := &b.Func.Config.Types
7407
7408
7409
7410 for {
7411 if v_0.Op != OpConst64 {
7412 break
7413 }
7414 c := auxIntToInt64(v_0.AuxInt)
7415 if v_1.Op != OpConst64 {
7416 break
7417 }
7418 d := auxIntToInt64(v_1.AuxInt)
7419 if !(d != 0) {
7420 break
7421 }
7422 v.reset(OpConst64)
7423 v.AuxInt = int64ToAuxInt(int64(uint64(c) / uint64(d)))
7424 return true
7425 }
7426
7427
7428
7429 for {
7430 n := v_0
7431 if v_1.Op != OpConst64 {
7432 break
7433 }
7434 c := auxIntToInt64(v_1.AuxInt)
7435 if !(isUnsignedPowerOfTwo(uint64(c))) {
7436 break
7437 }
7438 v.reset(OpRsh64Ux64)
7439 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7440 v0.AuxInt = int64ToAuxInt(log64u(uint64(c)))
7441 v.AddArg2(n, v0)
7442 return true
7443 }
7444 return false
7445 }
7446 func rewriteValuegeneric_OpDiv8(v *Value) bool {
7447 v_1 := v.Args[1]
7448 v_0 := v.Args[0]
7449 b := v.Block
7450 typ := &b.Func.Config.Types
7451
7452
7453
7454 for {
7455 if v_0.Op != OpConst8 {
7456 break
7457 }
7458 c := auxIntToInt8(v_0.AuxInt)
7459 if v_1.Op != OpConst8 {
7460 break
7461 }
7462 d := auxIntToInt8(v_1.AuxInt)
7463 if !(d != 0) {
7464 break
7465 }
7466 v.reset(OpConst8)
7467 v.AuxInt = int8ToAuxInt(c / d)
7468 return true
7469 }
7470
7471
7472
7473 for {
7474 t := v.Type
7475 n := v_0
7476 if v_1.Op != OpConst8 {
7477 break
7478 }
7479 c := auxIntToInt8(v_1.AuxInt)
7480 if !(c < 0 && c != -1<<7) {
7481 break
7482 }
7483 v.reset(OpNeg8)
7484 v0 := b.NewValue0(v.Pos, OpDiv8, t)
7485 v1 := b.NewValue0(v.Pos, OpConst8, t)
7486 v1.AuxInt = int8ToAuxInt(-c)
7487 v0.AddArg2(n, v1)
7488 v.AddArg(v0)
7489 return true
7490 }
7491
7492
7493 for {
7494 t := v.Type
7495 x := v_0
7496 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != -1<<7 {
7497 break
7498 }
7499 v.reset(OpRsh8Ux64)
7500 v0 := b.NewValue0(v.Pos, OpAnd8, t)
7501 v1 := b.NewValue0(v.Pos, OpNeg8, t)
7502 v1.AddArg(x)
7503 v0.AddArg2(x, v1)
7504 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7505 v2.AuxInt = int64ToAuxInt(7)
7506 v.AddArg2(v0, v2)
7507 return true
7508 }
7509 return false
7510 }
7511 func rewriteValuegeneric_OpDiv8u(v *Value) bool {
7512 v_1 := v.Args[1]
7513 v_0 := v.Args[0]
7514 b := v.Block
7515 typ := &b.Func.Config.Types
7516
7517
7518
7519 for {
7520 if v_0.Op != OpConst8 {
7521 break
7522 }
7523 c := auxIntToInt8(v_0.AuxInt)
7524 if v_1.Op != OpConst8 {
7525 break
7526 }
7527 d := auxIntToInt8(v_1.AuxInt)
7528 if !(d != 0) {
7529 break
7530 }
7531 v.reset(OpConst8)
7532 v.AuxInt = int8ToAuxInt(int8(uint8(c) / uint8(d)))
7533 return true
7534 }
7535
7536
7537
7538 for {
7539 n := v_0
7540 if v_1.Op != OpConst8 {
7541 break
7542 }
7543 c := auxIntToInt8(v_1.AuxInt)
7544 if !(isUnsignedPowerOfTwo(uint8(c))) {
7545 break
7546 }
7547 v.reset(OpRsh8Ux64)
7548 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
7549 v0.AuxInt = int64ToAuxInt(log8u(uint8(c)))
7550 v.AddArg2(n, v0)
7551 return true
7552 }
7553 return false
7554 }
7555 func rewriteValuegeneric_OpEq16(v *Value) bool {
7556 v_1 := v.Args[1]
7557 v_0 := v.Args[0]
7558 b := v.Block
7559 config := b.Func.Config
7560 typ := &b.Func.Config.Types
7561
7562
7563 for {
7564 x := v_0
7565 if x != v_1 {
7566 break
7567 }
7568 v.reset(OpConstBool)
7569 v.AuxInt = boolToAuxInt(true)
7570 return true
7571 }
7572
7573
7574 for {
7575 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7576 if v_0.Op != OpConst16 {
7577 continue
7578 }
7579 t := v_0.Type
7580 c := auxIntToInt16(v_0.AuxInt)
7581 if v_1.Op != OpAdd16 {
7582 continue
7583 }
7584 _ = v_1.Args[1]
7585 v_1_0 := v_1.Args[0]
7586 v_1_1 := v_1.Args[1]
7587 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
7588 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
7589 continue
7590 }
7591 d := auxIntToInt16(v_1_0.AuxInt)
7592 x := v_1_1
7593 v.reset(OpEq16)
7594 v0 := b.NewValue0(v.Pos, OpConst16, t)
7595 v0.AuxInt = int16ToAuxInt(c - d)
7596 v.AddArg2(v0, x)
7597 return true
7598 }
7599 }
7600 break
7601 }
7602
7603
7604 for {
7605 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7606 if v_0.Op != OpConst16 {
7607 continue
7608 }
7609 c := auxIntToInt16(v_0.AuxInt)
7610 if v_1.Op != OpConst16 {
7611 continue
7612 }
7613 d := auxIntToInt16(v_1.AuxInt)
7614 v.reset(OpConstBool)
7615 v.AuxInt = boolToAuxInt(c == d)
7616 return true
7617 }
7618 break
7619 }
7620
7621
7622
7623 for {
7624 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7625 if v_0.Op != OpMod16u {
7626 continue
7627 }
7628 _ = v_0.Args[1]
7629 x := v_0.Args[0]
7630 v_0_1 := v_0.Args[1]
7631 if v_0_1.Op != OpConst16 {
7632 continue
7633 }
7634 c := auxIntToInt16(v_0_1.AuxInt)
7635 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(x.Op != OpConst16 && udivisibleOK16(c) && !hasSmallRotate(config)) {
7636 continue
7637 }
7638 v.reset(OpEq32)
7639 v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32)
7640 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
7641 v1.AddArg(x)
7642 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
7643 v2.AuxInt = int32ToAuxInt(int32(uint16(c)))
7644 v0.AddArg2(v1, v2)
7645 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
7646 v3.AuxInt = int32ToAuxInt(0)
7647 v.AddArg2(v0, v3)
7648 return true
7649 }
7650 break
7651 }
7652
7653
7654
7655 for {
7656 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7657 if v_0.Op != OpMod16 {
7658 continue
7659 }
7660 _ = v_0.Args[1]
7661 x := v_0.Args[0]
7662 v_0_1 := v_0.Args[1]
7663 if v_0_1.Op != OpConst16 {
7664 continue
7665 }
7666 c := auxIntToInt16(v_0_1.AuxInt)
7667 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(x.Op != OpConst16 && sdivisibleOK16(c) && !hasSmallRotate(config)) {
7668 continue
7669 }
7670 v.reset(OpEq32)
7671 v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32)
7672 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
7673 v1.AddArg(x)
7674 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
7675 v2.AuxInt = int32ToAuxInt(int32(c))
7676 v0.AddArg2(v1, v2)
7677 v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
7678 v3.AuxInt = int32ToAuxInt(0)
7679 v.AddArg2(v0, v3)
7680 return true
7681 }
7682 break
7683 }
7684
7685
7686
7687 for {
7688 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7689 s := v_0
7690 if s.Op != OpSub16 {
7691 continue
7692 }
7693 y := s.Args[1]
7694 x := s.Args[0]
7695 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(s.Uses == 1) {
7696 continue
7697 }
7698 v.reset(OpEq16)
7699 v.AddArg2(x, y)
7700 return true
7701 }
7702 break
7703 }
7704
7705
7706
7707 for {
7708 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7709 if v_0.Op != OpAnd16 {
7710 continue
7711 }
7712 t := v_0.Type
7713 _ = v_0.Args[1]
7714 v_0_0 := v_0.Args[0]
7715 v_0_1 := v_0.Args[1]
7716 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
7717 x := v_0_0
7718 if v_0_1.Op != OpConst16 || v_0_1.Type != t {
7719 continue
7720 }
7721 y := auxIntToInt16(v_0_1.AuxInt)
7722 if v_1.Op != OpConst16 || v_1.Type != t || auxIntToInt16(v_1.AuxInt) != y || !(oneBit(y)) {
7723 continue
7724 }
7725 v.reset(OpNeq16)
7726 v0 := b.NewValue0(v.Pos, OpAnd16, t)
7727 v1 := b.NewValue0(v.Pos, OpConst16, t)
7728 v1.AuxInt = int16ToAuxInt(y)
7729 v0.AddArg2(x, v1)
7730 v2 := b.NewValue0(v.Pos, OpConst16, t)
7731 v2.AuxInt = int16ToAuxInt(0)
7732 v.AddArg2(v0, v2)
7733 return true
7734 }
7735 }
7736 break
7737 }
7738
7739
7740 for {
7741 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7742 if v_0.Op != OpZeroExt8to16 {
7743 continue
7744 }
7745 v_0_0 := v_0.Args[0]
7746 if v_0_0.Op != OpCvtBoolToUint8 {
7747 continue
7748 }
7749 x := v_0_0.Args[0]
7750 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
7751 continue
7752 }
7753 v.copyOf(x)
7754 return true
7755 }
7756 break
7757 }
7758
7759
7760 for {
7761 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7762 if v_0.Op != OpZeroExt8to16 {
7763 continue
7764 }
7765 v_0_0 := v_0.Args[0]
7766 if v_0_0.Op != OpCvtBoolToUint8 {
7767 continue
7768 }
7769 x := v_0_0.Args[0]
7770 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
7771 continue
7772 }
7773 v.reset(OpNot)
7774 v.AddArg(x)
7775 return true
7776 }
7777 break
7778 }
7779
7780
7781 for {
7782 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7783 if v_0.Op != OpSignExt8to16 {
7784 continue
7785 }
7786 v_0_0 := v_0.Args[0]
7787 if v_0_0.Op != OpCvtBoolToUint8 {
7788 continue
7789 }
7790 x := v_0_0.Args[0]
7791 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
7792 continue
7793 }
7794 v.copyOf(x)
7795 return true
7796 }
7797 break
7798 }
7799
7800
7801 for {
7802 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7803 if v_0.Op != OpSignExt8to16 {
7804 continue
7805 }
7806 v_0_0 := v_0.Args[0]
7807 if v_0_0.Op != OpCvtBoolToUint8 {
7808 continue
7809 }
7810 x := v_0_0.Args[0]
7811 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
7812 continue
7813 }
7814 v.reset(OpNot)
7815 v.AddArg(x)
7816 return true
7817 }
7818 break
7819 }
7820 return false
7821 }
7822 func rewriteValuegeneric_OpEq32(v *Value) bool {
7823 v_1 := v.Args[1]
7824 v_0 := v.Args[0]
7825 b := v.Block
7826
7827
7828 for {
7829 x := v_0
7830 if x != v_1 {
7831 break
7832 }
7833 v.reset(OpConstBool)
7834 v.AuxInt = boolToAuxInt(true)
7835 return true
7836 }
7837
7838
7839 for {
7840 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7841 if v_0.Op != OpConst32 {
7842 continue
7843 }
7844 t := v_0.Type
7845 c := auxIntToInt32(v_0.AuxInt)
7846 if v_1.Op != OpAdd32 {
7847 continue
7848 }
7849 _ = v_1.Args[1]
7850 v_1_0 := v_1.Args[0]
7851 v_1_1 := v_1.Args[1]
7852 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
7853 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
7854 continue
7855 }
7856 d := auxIntToInt32(v_1_0.AuxInt)
7857 x := v_1_1
7858 v.reset(OpEq32)
7859 v0 := b.NewValue0(v.Pos, OpConst32, t)
7860 v0.AuxInt = int32ToAuxInt(c - d)
7861 v.AddArg2(v0, x)
7862 return true
7863 }
7864 }
7865 break
7866 }
7867
7868
7869 for {
7870 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7871 if v_0.Op != OpConst32 {
7872 continue
7873 }
7874 c := auxIntToInt32(v_0.AuxInt)
7875 if v_1.Op != OpConst32 {
7876 continue
7877 }
7878 d := auxIntToInt32(v_1.AuxInt)
7879 v.reset(OpConstBool)
7880 v.AuxInt = boolToAuxInt(c == d)
7881 return true
7882 }
7883 break
7884 }
7885
7886
7887
7888 for {
7889 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7890 s := v_0
7891 if s.Op != OpSub32 {
7892 continue
7893 }
7894 y := s.Args[1]
7895 x := s.Args[0]
7896 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 || !(s.Uses == 1) {
7897 continue
7898 }
7899 v.reset(OpEq32)
7900 v.AddArg2(x, y)
7901 return true
7902 }
7903 break
7904 }
7905
7906
7907
7908 for {
7909 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7910 if v_0.Op != OpAnd32 {
7911 continue
7912 }
7913 t := v_0.Type
7914 _ = v_0.Args[1]
7915 v_0_0 := v_0.Args[0]
7916 v_0_1 := v_0.Args[1]
7917 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
7918 x := v_0_0
7919 if v_0_1.Op != OpConst32 || v_0_1.Type != t {
7920 continue
7921 }
7922 y := auxIntToInt32(v_0_1.AuxInt)
7923 if v_1.Op != OpConst32 || v_1.Type != t || auxIntToInt32(v_1.AuxInt) != y || !(oneBit(y)) {
7924 continue
7925 }
7926 v.reset(OpNeq32)
7927 v0 := b.NewValue0(v.Pos, OpAnd32, t)
7928 v1 := b.NewValue0(v.Pos, OpConst32, t)
7929 v1.AuxInt = int32ToAuxInt(y)
7930 v0.AddArg2(x, v1)
7931 v2 := b.NewValue0(v.Pos, OpConst32, t)
7932 v2.AuxInt = int32ToAuxInt(0)
7933 v.AddArg2(v0, v2)
7934 return true
7935 }
7936 }
7937 break
7938 }
7939
7940
7941 for {
7942 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7943 if v_0.Op != OpZeroExt8to32 {
7944 continue
7945 }
7946 v_0_0 := v_0.Args[0]
7947 if v_0_0.Op != OpCvtBoolToUint8 {
7948 continue
7949 }
7950 x := v_0_0.Args[0]
7951 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
7952 continue
7953 }
7954 v.copyOf(x)
7955 return true
7956 }
7957 break
7958 }
7959
7960
7961 for {
7962 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7963 if v_0.Op != OpZeroExt8to32 {
7964 continue
7965 }
7966 v_0_0 := v_0.Args[0]
7967 if v_0_0.Op != OpCvtBoolToUint8 {
7968 continue
7969 }
7970 x := v_0_0.Args[0]
7971 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
7972 continue
7973 }
7974 v.reset(OpNot)
7975 v.AddArg(x)
7976 return true
7977 }
7978 break
7979 }
7980
7981
7982 for {
7983 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7984 if v_0.Op != OpSignExt8to32 {
7985 continue
7986 }
7987 v_0_0 := v_0.Args[0]
7988 if v_0_0.Op != OpCvtBoolToUint8 {
7989 continue
7990 }
7991 x := v_0_0.Args[0]
7992 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
7993 continue
7994 }
7995 v.copyOf(x)
7996 return true
7997 }
7998 break
7999 }
8000
8001
8002 for {
8003 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8004 if v_0.Op != OpSignExt8to32 {
8005 continue
8006 }
8007 v_0_0 := v_0.Args[0]
8008 if v_0_0.Op != OpCvtBoolToUint8 {
8009 continue
8010 }
8011 x := v_0_0.Args[0]
8012 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
8013 continue
8014 }
8015 v.reset(OpNot)
8016 v.AddArg(x)
8017 return true
8018 }
8019 break
8020 }
8021 return false
8022 }
8023 func rewriteValuegeneric_OpEq32F(v *Value) bool {
8024 v_1 := v.Args[1]
8025 v_0 := v.Args[0]
8026
8027
8028 for {
8029 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8030 if v_0.Op != OpConst32F {
8031 continue
8032 }
8033 c := auxIntToFloat32(v_0.AuxInt)
8034 if v_1.Op != OpConst32F {
8035 continue
8036 }
8037 d := auxIntToFloat32(v_1.AuxInt)
8038 v.reset(OpConstBool)
8039 v.AuxInt = boolToAuxInt(c == d)
8040 return true
8041 }
8042 break
8043 }
8044 return false
8045 }
8046 func rewriteValuegeneric_OpEq64(v *Value) bool {
8047 v_1 := v.Args[1]
8048 v_0 := v.Args[0]
8049 b := v.Block
8050
8051
8052 for {
8053 x := v_0
8054 if x != v_1 {
8055 break
8056 }
8057 v.reset(OpConstBool)
8058 v.AuxInt = boolToAuxInt(true)
8059 return true
8060 }
8061
8062
8063 for {
8064 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8065 if v_0.Op != OpConst64 {
8066 continue
8067 }
8068 t := v_0.Type
8069 c := auxIntToInt64(v_0.AuxInt)
8070 if v_1.Op != OpAdd64 {
8071 continue
8072 }
8073 _ = v_1.Args[1]
8074 v_1_0 := v_1.Args[0]
8075 v_1_1 := v_1.Args[1]
8076 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8077 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
8078 continue
8079 }
8080 d := auxIntToInt64(v_1_0.AuxInt)
8081 x := v_1_1
8082 v.reset(OpEq64)
8083 v0 := b.NewValue0(v.Pos, OpConst64, t)
8084 v0.AuxInt = int64ToAuxInt(c - d)
8085 v.AddArg2(v0, x)
8086 return true
8087 }
8088 }
8089 break
8090 }
8091
8092
8093 for {
8094 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8095 if v_0.Op != OpConst64 {
8096 continue
8097 }
8098 c := auxIntToInt64(v_0.AuxInt)
8099 if v_1.Op != OpConst64 {
8100 continue
8101 }
8102 d := auxIntToInt64(v_1.AuxInt)
8103 v.reset(OpConstBool)
8104 v.AuxInt = boolToAuxInt(c == d)
8105 return true
8106 }
8107 break
8108 }
8109
8110
8111
8112 for {
8113 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8114 s := v_0
8115 if s.Op != OpSub64 {
8116 continue
8117 }
8118 y := s.Args[1]
8119 x := s.Args[0]
8120 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 || !(s.Uses == 1) {
8121 continue
8122 }
8123 v.reset(OpEq64)
8124 v.AddArg2(x, y)
8125 return true
8126 }
8127 break
8128 }
8129
8130
8131
8132 for {
8133 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8134 if v_0.Op != OpAnd64 {
8135 continue
8136 }
8137 t := v_0.Type
8138 _ = v_0.Args[1]
8139 v_0_0 := v_0.Args[0]
8140 v_0_1 := v_0.Args[1]
8141 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
8142 x := v_0_0
8143 if v_0_1.Op != OpConst64 || v_0_1.Type != t {
8144 continue
8145 }
8146 y := auxIntToInt64(v_0_1.AuxInt)
8147 if v_1.Op != OpConst64 || v_1.Type != t || auxIntToInt64(v_1.AuxInt) != y || !(oneBit(y)) {
8148 continue
8149 }
8150 v.reset(OpNeq64)
8151 v0 := b.NewValue0(v.Pos, OpAnd64, t)
8152 v1 := b.NewValue0(v.Pos, OpConst64, t)
8153 v1.AuxInt = int64ToAuxInt(y)
8154 v0.AddArg2(x, v1)
8155 v2 := b.NewValue0(v.Pos, OpConst64, t)
8156 v2.AuxInt = int64ToAuxInt(0)
8157 v.AddArg2(v0, v2)
8158 return true
8159 }
8160 }
8161 break
8162 }
8163
8164
8165 for {
8166 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8167 if v_0.Op != OpZeroExt8to64 {
8168 continue
8169 }
8170 v_0_0 := v_0.Args[0]
8171 if v_0_0.Op != OpCvtBoolToUint8 {
8172 continue
8173 }
8174 x := v_0_0.Args[0]
8175 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
8176 continue
8177 }
8178 v.copyOf(x)
8179 return true
8180 }
8181 break
8182 }
8183
8184
8185 for {
8186 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8187 if v_0.Op != OpZeroExt8to64 {
8188 continue
8189 }
8190 v_0_0 := v_0.Args[0]
8191 if v_0_0.Op != OpCvtBoolToUint8 {
8192 continue
8193 }
8194 x := v_0_0.Args[0]
8195 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
8196 continue
8197 }
8198 v.reset(OpNot)
8199 v.AddArg(x)
8200 return true
8201 }
8202 break
8203 }
8204
8205
8206 for {
8207 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8208 if v_0.Op != OpSignExt8to64 {
8209 continue
8210 }
8211 v_0_0 := v_0.Args[0]
8212 if v_0_0.Op != OpCvtBoolToUint8 {
8213 continue
8214 }
8215 x := v_0_0.Args[0]
8216 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
8217 continue
8218 }
8219 v.copyOf(x)
8220 return true
8221 }
8222 break
8223 }
8224
8225
8226 for {
8227 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8228 if v_0.Op != OpSignExt8to64 {
8229 continue
8230 }
8231 v_0_0 := v_0.Args[0]
8232 if v_0_0.Op != OpCvtBoolToUint8 {
8233 continue
8234 }
8235 x := v_0_0.Args[0]
8236 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
8237 continue
8238 }
8239 v.reset(OpNot)
8240 v.AddArg(x)
8241 return true
8242 }
8243 break
8244 }
8245 return false
8246 }
8247 func rewriteValuegeneric_OpEq64F(v *Value) bool {
8248 v_1 := v.Args[1]
8249 v_0 := v.Args[0]
8250
8251
8252 for {
8253 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8254 if v_0.Op != OpConst64F {
8255 continue
8256 }
8257 c := auxIntToFloat64(v_0.AuxInt)
8258 if v_1.Op != OpConst64F {
8259 continue
8260 }
8261 d := auxIntToFloat64(v_1.AuxInt)
8262 v.reset(OpConstBool)
8263 v.AuxInt = boolToAuxInt(c == d)
8264 return true
8265 }
8266 break
8267 }
8268 return false
8269 }
8270 func rewriteValuegeneric_OpEq8(v *Value) bool {
8271 v_1 := v.Args[1]
8272 v_0 := v.Args[0]
8273 b := v.Block
8274 config := b.Func.Config
8275 typ := &b.Func.Config.Types
8276
8277
8278 for {
8279 x := v_0
8280 if x != v_1 {
8281 break
8282 }
8283 v.reset(OpConstBool)
8284 v.AuxInt = boolToAuxInt(true)
8285 return true
8286 }
8287
8288
8289 for {
8290 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8291 if v_0.Op != OpConst8 {
8292 continue
8293 }
8294 t := v_0.Type
8295 c := auxIntToInt8(v_0.AuxInt)
8296 if v_1.Op != OpAdd8 {
8297 continue
8298 }
8299 _ = v_1.Args[1]
8300 v_1_0 := v_1.Args[0]
8301 v_1_1 := v_1.Args[1]
8302 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
8303 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
8304 continue
8305 }
8306 d := auxIntToInt8(v_1_0.AuxInt)
8307 x := v_1_1
8308 v.reset(OpEq8)
8309 v0 := b.NewValue0(v.Pos, OpConst8, t)
8310 v0.AuxInt = int8ToAuxInt(c - d)
8311 v.AddArg2(v0, x)
8312 return true
8313 }
8314 }
8315 break
8316 }
8317
8318
8319 for {
8320 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8321 if v_0.Op != OpConst8 {
8322 continue
8323 }
8324 c := auxIntToInt8(v_0.AuxInt)
8325 if v_1.Op != OpConst8 {
8326 continue
8327 }
8328 d := auxIntToInt8(v_1.AuxInt)
8329 v.reset(OpConstBool)
8330 v.AuxInt = boolToAuxInt(c == d)
8331 return true
8332 }
8333 break
8334 }
8335
8336
8337
8338 for {
8339 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8340 if v_0.Op != OpMod8u {
8341 continue
8342 }
8343 _ = v_0.Args[1]
8344 x := v_0.Args[0]
8345 v_0_1 := v_0.Args[1]
8346 if v_0_1.Op != OpConst8 {
8347 continue
8348 }
8349 c := auxIntToInt8(v_0_1.AuxInt)
8350 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(x.Op != OpConst8 && udivisibleOK8(c) && !hasSmallRotate(config)) {
8351 continue
8352 }
8353 v.reset(OpEq32)
8354 v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32)
8355 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
8356 v1.AddArg(x)
8357 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8358 v2.AuxInt = int32ToAuxInt(int32(uint8(c)))
8359 v0.AddArg2(v1, v2)
8360 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
8361 v3.AuxInt = int32ToAuxInt(0)
8362 v.AddArg2(v0, v3)
8363 return true
8364 }
8365 break
8366 }
8367
8368
8369
8370 for {
8371 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8372 if v_0.Op != OpMod8 {
8373 continue
8374 }
8375 _ = v_0.Args[1]
8376 x := v_0.Args[0]
8377 v_0_1 := v_0.Args[1]
8378 if v_0_1.Op != OpConst8 {
8379 continue
8380 }
8381 c := auxIntToInt8(v_0_1.AuxInt)
8382 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(x.Op != OpConst8 && sdivisibleOK8(c) && !hasSmallRotate(config)) {
8383 continue
8384 }
8385 v.reset(OpEq32)
8386 v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32)
8387 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
8388 v1.AddArg(x)
8389 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
8390 v2.AuxInt = int32ToAuxInt(int32(c))
8391 v0.AddArg2(v1, v2)
8392 v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
8393 v3.AuxInt = int32ToAuxInt(0)
8394 v.AddArg2(v0, v3)
8395 return true
8396 }
8397 break
8398 }
8399
8400
8401
8402 for {
8403 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8404 s := v_0
8405 if s.Op != OpSub8 {
8406 continue
8407 }
8408 y := s.Args[1]
8409 x := s.Args[0]
8410 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(s.Uses == 1) {
8411 continue
8412 }
8413 v.reset(OpEq8)
8414 v.AddArg2(x, y)
8415 return true
8416 }
8417 break
8418 }
8419
8420
8421
8422 for {
8423 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8424 if v_0.Op != OpAnd8 {
8425 continue
8426 }
8427 t := v_0.Type
8428 _ = v_0.Args[1]
8429 v_0_0 := v_0.Args[0]
8430 v_0_1 := v_0.Args[1]
8431 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
8432 x := v_0_0
8433 if v_0_1.Op != OpConst8 || v_0_1.Type != t {
8434 continue
8435 }
8436 y := auxIntToInt8(v_0_1.AuxInt)
8437 if v_1.Op != OpConst8 || v_1.Type != t || auxIntToInt8(v_1.AuxInt) != y || !(oneBit(y)) {
8438 continue
8439 }
8440 v.reset(OpNeq8)
8441 v0 := b.NewValue0(v.Pos, OpAnd8, t)
8442 v1 := b.NewValue0(v.Pos, OpConst8, t)
8443 v1.AuxInt = int8ToAuxInt(y)
8444 v0.AddArg2(x, v1)
8445 v2 := b.NewValue0(v.Pos, OpConst8, t)
8446 v2.AuxInt = int8ToAuxInt(0)
8447 v.AddArg2(v0, v2)
8448 return true
8449 }
8450 }
8451 break
8452 }
8453
8454
8455 for {
8456 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8457 if v_0.Op != OpCvtBoolToUint8 {
8458 continue
8459 }
8460 x := v_0.Args[0]
8461 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 1 {
8462 continue
8463 }
8464 v.copyOf(x)
8465 return true
8466 }
8467 break
8468 }
8469
8470
8471 for {
8472 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8473 if v_0.Op != OpCvtBoolToUint8 {
8474 continue
8475 }
8476 x := v_0.Args[0]
8477 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
8478 continue
8479 }
8480 v.reset(OpNot)
8481 v.AddArg(x)
8482 return true
8483 }
8484 break
8485 }
8486 return false
8487 }
8488 func rewriteValuegeneric_OpEqB(v *Value) bool {
8489 v_1 := v.Args[1]
8490 v_0 := v.Args[0]
8491
8492
8493 for {
8494 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8495 if v_0.Op != OpConstBool {
8496 continue
8497 }
8498 c := auxIntToBool(v_0.AuxInt)
8499 if v_1.Op != OpConstBool {
8500 continue
8501 }
8502 d := auxIntToBool(v_1.AuxInt)
8503 v.reset(OpConstBool)
8504 v.AuxInt = boolToAuxInt(c == d)
8505 return true
8506 }
8507 break
8508 }
8509
8510
8511 for {
8512 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8513 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
8514 continue
8515 }
8516 x := v_1
8517 v.reset(OpNot)
8518 v.AddArg(x)
8519 return true
8520 }
8521 break
8522 }
8523
8524
8525 for {
8526 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8527 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
8528 continue
8529 }
8530 x := v_1
8531 v.copyOf(x)
8532 return true
8533 }
8534 break
8535 }
8536 return false
8537 }
8538 func rewriteValuegeneric_OpEqInter(v *Value) bool {
8539 v_1 := v.Args[1]
8540 v_0 := v.Args[0]
8541 b := v.Block
8542 typ := &b.Func.Config.Types
8543
8544
8545 for {
8546 x := v_0
8547 y := v_1
8548 v.reset(OpEqPtr)
8549 v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
8550 v0.AddArg(x)
8551 v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
8552 v1.AddArg(y)
8553 v.AddArg2(v0, v1)
8554 return true
8555 }
8556 }
8557 func rewriteValuegeneric_OpEqPtr(v *Value) bool {
8558 v_1 := v.Args[1]
8559 v_0 := v.Args[0]
8560 b := v.Block
8561 typ := &b.Func.Config.Types
8562
8563
8564 for {
8565 x := v_0
8566 if x != v_1 {
8567 break
8568 }
8569 v.reset(OpConstBool)
8570 v.AuxInt = boolToAuxInt(true)
8571 return true
8572 }
8573
8574
8575 for {
8576 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8577 if v_0.Op != OpAddr {
8578 continue
8579 }
8580 x := auxToSym(v_0.Aux)
8581 if v_1.Op != OpAddr {
8582 continue
8583 }
8584 y := auxToSym(v_1.Aux)
8585 v.reset(OpConstBool)
8586 v.AuxInt = boolToAuxInt(x == y)
8587 return true
8588 }
8589 break
8590 }
8591
8592
8593 for {
8594 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8595 if v_0.Op != OpAddr {
8596 continue
8597 }
8598 x := auxToSym(v_0.Aux)
8599 if v_1.Op != OpOffPtr {
8600 continue
8601 }
8602 o := auxIntToInt64(v_1.AuxInt)
8603 v_1_0 := v_1.Args[0]
8604 if v_1_0.Op != OpAddr {
8605 continue
8606 }
8607 y := auxToSym(v_1_0.Aux)
8608 v.reset(OpConstBool)
8609 v.AuxInt = boolToAuxInt(x == y && o == 0)
8610 return true
8611 }
8612 break
8613 }
8614
8615
8616 for {
8617 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8618 if v_0.Op != OpOffPtr {
8619 continue
8620 }
8621 o1 := auxIntToInt64(v_0.AuxInt)
8622 v_0_0 := v_0.Args[0]
8623 if v_0_0.Op != OpAddr {
8624 continue
8625 }
8626 x := auxToSym(v_0_0.Aux)
8627 if v_1.Op != OpOffPtr {
8628 continue
8629 }
8630 o2 := auxIntToInt64(v_1.AuxInt)
8631 v_1_0 := v_1.Args[0]
8632 if v_1_0.Op != OpAddr {
8633 continue
8634 }
8635 y := auxToSym(v_1_0.Aux)
8636 v.reset(OpConstBool)
8637 v.AuxInt = boolToAuxInt(x == y && o1 == o2)
8638 return true
8639 }
8640 break
8641 }
8642
8643
8644 for {
8645 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8646 if v_0.Op != OpLocalAddr {
8647 continue
8648 }
8649 x := auxToSym(v_0.Aux)
8650 if v_1.Op != OpLocalAddr {
8651 continue
8652 }
8653 y := auxToSym(v_1.Aux)
8654 v.reset(OpConstBool)
8655 v.AuxInt = boolToAuxInt(x == y)
8656 return true
8657 }
8658 break
8659 }
8660
8661
8662 for {
8663 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8664 if v_0.Op != OpLocalAddr {
8665 continue
8666 }
8667 x := auxToSym(v_0.Aux)
8668 if v_1.Op != OpOffPtr {
8669 continue
8670 }
8671 o := auxIntToInt64(v_1.AuxInt)
8672 v_1_0 := v_1.Args[0]
8673 if v_1_0.Op != OpLocalAddr {
8674 continue
8675 }
8676 y := auxToSym(v_1_0.Aux)
8677 v.reset(OpConstBool)
8678 v.AuxInt = boolToAuxInt(x == y && o == 0)
8679 return true
8680 }
8681 break
8682 }
8683
8684
8685 for {
8686 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8687 if v_0.Op != OpOffPtr {
8688 continue
8689 }
8690 o1 := auxIntToInt64(v_0.AuxInt)
8691 v_0_0 := v_0.Args[0]
8692 if v_0_0.Op != OpLocalAddr {
8693 continue
8694 }
8695 x := auxToSym(v_0_0.Aux)
8696 if v_1.Op != OpOffPtr {
8697 continue
8698 }
8699 o2 := auxIntToInt64(v_1.AuxInt)
8700 v_1_0 := v_1.Args[0]
8701 if v_1_0.Op != OpLocalAddr {
8702 continue
8703 }
8704 y := auxToSym(v_1_0.Aux)
8705 v.reset(OpConstBool)
8706 v.AuxInt = boolToAuxInt(x == y && o1 == o2)
8707 return true
8708 }
8709 break
8710 }
8711
8712
8713
8714 for {
8715 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8716 if v_0.Op != OpOffPtr {
8717 continue
8718 }
8719 o1 := auxIntToInt64(v_0.AuxInt)
8720 p1 := v_0.Args[0]
8721 p2 := v_1
8722 if !(isSamePtr(p1, p2)) {
8723 continue
8724 }
8725 v.reset(OpConstBool)
8726 v.AuxInt = boolToAuxInt(o1 == 0)
8727 return true
8728 }
8729 break
8730 }
8731
8732
8733
8734 for {
8735 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8736 if v_0.Op != OpOffPtr {
8737 continue
8738 }
8739 o1 := auxIntToInt64(v_0.AuxInt)
8740 p1 := v_0.Args[0]
8741 if v_1.Op != OpOffPtr {
8742 continue
8743 }
8744 o2 := auxIntToInt64(v_1.AuxInt)
8745 p2 := v_1.Args[0]
8746 if !(isSamePtr(p1, p2)) {
8747 continue
8748 }
8749 v.reset(OpConstBool)
8750 v.AuxInt = boolToAuxInt(o1 == o2)
8751 return true
8752 }
8753 break
8754 }
8755
8756
8757 for {
8758 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8759 if v_0.Op != OpConst32 {
8760 continue
8761 }
8762 c := auxIntToInt32(v_0.AuxInt)
8763 if v_1.Op != OpConst32 {
8764 continue
8765 }
8766 d := auxIntToInt32(v_1.AuxInt)
8767 v.reset(OpConstBool)
8768 v.AuxInt = boolToAuxInt(c == d)
8769 return true
8770 }
8771 break
8772 }
8773
8774
8775 for {
8776 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8777 if v_0.Op != OpConst64 {
8778 continue
8779 }
8780 c := auxIntToInt64(v_0.AuxInt)
8781 if v_1.Op != OpConst64 {
8782 continue
8783 }
8784 d := auxIntToInt64(v_1.AuxInt)
8785 v.reset(OpConstBool)
8786 v.AuxInt = boolToAuxInt(c == d)
8787 return true
8788 }
8789 break
8790 }
8791
8792
8793 for {
8794 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8795 if v_0.Op != OpConvert {
8796 continue
8797 }
8798 v_0_0 := v_0.Args[0]
8799 if v_0_0.Op != OpAddr {
8800 continue
8801 }
8802 x := auxToSym(v_0_0.Aux)
8803 if v_1.Op != OpAddr {
8804 continue
8805 }
8806 y := auxToSym(v_1.Aux)
8807 v.reset(OpConstBool)
8808 v.AuxInt = boolToAuxInt(x == y)
8809 return true
8810 }
8811 break
8812 }
8813
8814
8815 for {
8816 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8817 if v_0.Op != OpLocalAddr || v_1.Op != OpAddr {
8818 continue
8819 }
8820 v.reset(OpConstBool)
8821 v.AuxInt = boolToAuxInt(false)
8822 return true
8823 }
8824 break
8825 }
8826
8827
8828 for {
8829 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8830 if v_0.Op != OpOffPtr {
8831 continue
8832 }
8833 v_0_0 := v_0.Args[0]
8834 if v_0_0.Op != OpLocalAddr || v_1.Op != OpAddr {
8835 continue
8836 }
8837 v.reset(OpConstBool)
8838 v.AuxInt = boolToAuxInt(false)
8839 return true
8840 }
8841 break
8842 }
8843
8844
8845 for {
8846 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8847 if v_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
8848 continue
8849 }
8850 v_1_0 := v_1.Args[0]
8851 if v_1_0.Op != OpAddr {
8852 continue
8853 }
8854 v.reset(OpConstBool)
8855 v.AuxInt = boolToAuxInt(false)
8856 return true
8857 }
8858 break
8859 }
8860
8861
8862 for {
8863 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8864 if v_0.Op != OpOffPtr {
8865 continue
8866 }
8867 v_0_0 := v_0.Args[0]
8868 if v_0_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
8869 continue
8870 }
8871 v_1_0 := v_1.Args[0]
8872 if v_1_0.Op != OpAddr {
8873 continue
8874 }
8875 v.reset(OpConstBool)
8876 v.AuxInt = boolToAuxInt(false)
8877 return true
8878 }
8879 break
8880 }
8881
8882
8883
8884 for {
8885 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8886 if v_0.Op != OpAddPtr {
8887 continue
8888 }
8889 o1 := v_0.Args[1]
8890 p1 := v_0.Args[0]
8891 p2 := v_1
8892 if !(isSamePtr(p1, p2)) {
8893 continue
8894 }
8895 v.reset(OpNot)
8896 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
8897 v0.AddArg(o1)
8898 v.AddArg(v0)
8899 return true
8900 }
8901 break
8902 }
8903
8904
8905 for {
8906 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8907 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
8908 continue
8909 }
8910 p := v_1
8911 v.reset(OpNot)
8912 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
8913 v0.AddArg(p)
8914 v.AddArg(v0)
8915 return true
8916 }
8917 break
8918 }
8919
8920
8921 for {
8922 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8923 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
8924 continue
8925 }
8926 p := v_1
8927 v.reset(OpNot)
8928 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
8929 v0.AddArg(p)
8930 v.AddArg(v0)
8931 return true
8932 }
8933 break
8934 }
8935
8936
8937 for {
8938 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8939 if v_0.Op != OpConstNil {
8940 continue
8941 }
8942 p := v_1
8943 v.reset(OpNot)
8944 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool)
8945 v0.AddArg(p)
8946 v.AddArg(v0)
8947 return true
8948 }
8949 break
8950 }
8951 return false
8952 }
8953 func rewriteValuegeneric_OpEqSlice(v *Value) bool {
8954 v_1 := v.Args[1]
8955 v_0 := v.Args[0]
8956 b := v.Block
8957 typ := &b.Func.Config.Types
8958
8959
8960 for {
8961 x := v_0
8962 y := v_1
8963 v.reset(OpEqPtr)
8964 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
8965 v0.AddArg(x)
8966 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
8967 v1.AddArg(y)
8968 v.AddArg2(v0, v1)
8969 return true
8970 }
8971 }
8972 func rewriteValuegeneric_OpFloor(v *Value) bool {
8973 v_0 := v.Args[0]
8974
8975
8976 for {
8977 if v_0.Op != OpConst64F {
8978 break
8979 }
8980 c := auxIntToFloat64(v_0.AuxInt)
8981 v.reset(OpConst64F)
8982 v.AuxInt = float64ToAuxInt(math.Floor(c))
8983 return true
8984 }
8985 return false
8986 }
8987 func rewriteValuegeneric_OpIMake(v *Value) bool {
8988 v_1 := v.Args[1]
8989 v_0 := v.Args[0]
8990
8991
8992 for {
8993 if v_1.Op != OpStructMake {
8994 break
8995 }
8996 v.copyOf(imakeOfStructMake(v))
8997 return true
8998 }
8999
9000
9001 for {
9002 _typ := v_0
9003 if v_1.Op != OpArrayMake1 {
9004 break
9005 }
9006 val := v_1.Args[0]
9007 v.reset(OpIMake)
9008 v.AddArg2(_typ, val)
9009 return true
9010 }
9011 return false
9012 }
9013 func rewriteValuegeneric_OpInterLECall(v *Value) bool {
9014
9015
9016 for {
9017 if len(v.Args) < 1 {
9018 break
9019 }
9020 v_0 := v.Args[0]
9021 if v_0.Op != OpAddr {
9022 break
9023 }
9024 fn := auxToSym(v_0.Aux)
9025 v_0_0 := v_0.Args[0]
9026 if v_0_0.Op != OpSB {
9027 break
9028 }
9029 v.copyOf(devirtLECall(v, fn.(*obj.LSym)))
9030 return true
9031 }
9032 return false
9033 }
9034 func rewriteValuegeneric_OpIsInBounds(v *Value) bool {
9035 v_1 := v.Args[1]
9036 v_0 := v.Args[0]
9037
9038
9039
9040 for {
9041 if v_0.Op != OpZeroExt8to32 || v_1.Op != OpConst32 {
9042 break
9043 }
9044 c := auxIntToInt32(v_1.AuxInt)
9045 if !((1 << 8) <= c) {
9046 break
9047 }
9048 v.reset(OpConstBool)
9049 v.AuxInt = boolToAuxInt(true)
9050 return true
9051 }
9052
9053
9054
9055 for {
9056 if v_0.Op != OpZeroExt8to64 || v_1.Op != OpConst64 {
9057 break
9058 }
9059 c := auxIntToInt64(v_1.AuxInt)
9060 if !((1 << 8) <= c) {
9061 break
9062 }
9063 v.reset(OpConstBool)
9064 v.AuxInt = boolToAuxInt(true)
9065 return true
9066 }
9067
9068
9069
9070 for {
9071 if v_0.Op != OpZeroExt16to32 || v_1.Op != OpConst32 {
9072 break
9073 }
9074 c := auxIntToInt32(v_1.AuxInt)
9075 if !((1 << 16) <= c) {
9076 break
9077 }
9078 v.reset(OpConstBool)
9079 v.AuxInt = boolToAuxInt(true)
9080 return true
9081 }
9082
9083
9084
9085 for {
9086 if v_0.Op != OpZeroExt16to64 || v_1.Op != OpConst64 {
9087 break
9088 }
9089 c := auxIntToInt64(v_1.AuxInt)
9090 if !((1 << 16) <= c) {
9091 break
9092 }
9093 v.reset(OpConstBool)
9094 v.AuxInt = boolToAuxInt(true)
9095 return true
9096 }
9097
9098
9099 for {
9100 x := v_0
9101 if x != v_1 {
9102 break
9103 }
9104 v.reset(OpConstBool)
9105 v.AuxInt = boolToAuxInt(false)
9106 return true
9107 }
9108
9109
9110
9111 for {
9112 if v_0.Op != OpAnd8 {
9113 break
9114 }
9115 v_0_0 := v_0.Args[0]
9116 v_0_1 := v_0.Args[1]
9117 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9118 if v_0_0.Op != OpConst8 {
9119 continue
9120 }
9121 c := auxIntToInt8(v_0_0.AuxInt)
9122 if v_1.Op != OpConst8 {
9123 continue
9124 }
9125 d := auxIntToInt8(v_1.AuxInt)
9126 if !(0 <= c && c < d) {
9127 continue
9128 }
9129 v.reset(OpConstBool)
9130 v.AuxInt = boolToAuxInt(true)
9131 return true
9132 }
9133 break
9134 }
9135
9136
9137
9138 for {
9139 if v_0.Op != OpZeroExt8to16 {
9140 break
9141 }
9142 v_0_0 := v_0.Args[0]
9143 if v_0_0.Op != OpAnd8 {
9144 break
9145 }
9146 v_0_0_0 := v_0_0.Args[0]
9147 v_0_0_1 := v_0_0.Args[1]
9148 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9149 if v_0_0_0.Op != OpConst8 {
9150 continue
9151 }
9152 c := auxIntToInt8(v_0_0_0.AuxInt)
9153 if v_1.Op != OpConst16 {
9154 continue
9155 }
9156 d := auxIntToInt16(v_1.AuxInt)
9157 if !(0 <= c && int16(c) < d) {
9158 continue
9159 }
9160 v.reset(OpConstBool)
9161 v.AuxInt = boolToAuxInt(true)
9162 return true
9163 }
9164 break
9165 }
9166
9167
9168
9169 for {
9170 if v_0.Op != OpZeroExt8to32 {
9171 break
9172 }
9173 v_0_0 := v_0.Args[0]
9174 if v_0_0.Op != OpAnd8 {
9175 break
9176 }
9177 v_0_0_0 := v_0_0.Args[0]
9178 v_0_0_1 := v_0_0.Args[1]
9179 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9180 if v_0_0_0.Op != OpConst8 {
9181 continue
9182 }
9183 c := auxIntToInt8(v_0_0_0.AuxInt)
9184 if v_1.Op != OpConst32 {
9185 continue
9186 }
9187 d := auxIntToInt32(v_1.AuxInt)
9188 if !(0 <= c && int32(c) < d) {
9189 continue
9190 }
9191 v.reset(OpConstBool)
9192 v.AuxInt = boolToAuxInt(true)
9193 return true
9194 }
9195 break
9196 }
9197
9198
9199
9200 for {
9201 if v_0.Op != OpZeroExt8to64 {
9202 break
9203 }
9204 v_0_0 := v_0.Args[0]
9205 if v_0_0.Op != OpAnd8 {
9206 break
9207 }
9208 v_0_0_0 := v_0_0.Args[0]
9209 v_0_0_1 := v_0_0.Args[1]
9210 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9211 if v_0_0_0.Op != OpConst8 {
9212 continue
9213 }
9214 c := auxIntToInt8(v_0_0_0.AuxInt)
9215 if v_1.Op != OpConst64 {
9216 continue
9217 }
9218 d := auxIntToInt64(v_1.AuxInt)
9219 if !(0 <= c && int64(c) < d) {
9220 continue
9221 }
9222 v.reset(OpConstBool)
9223 v.AuxInt = boolToAuxInt(true)
9224 return true
9225 }
9226 break
9227 }
9228
9229
9230
9231 for {
9232 if v_0.Op != OpAnd16 {
9233 break
9234 }
9235 v_0_0 := v_0.Args[0]
9236 v_0_1 := v_0.Args[1]
9237 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9238 if v_0_0.Op != OpConst16 {
9239 continue
9240 }
9241 c := auxIntToInt16(v_0_0.AuxInt)
9242 if v_1.Op != OpConst16 {
9243 continue
9244 }
9245 d := auxIntToInt16(v_1.AuxInt)
9246 if !(0 <= c && c < d) {
9247 continue
9248 }
9249 v.reset(OpConstBool)
9250 v.AuxInt = boolToAuxInt(true)
9251 return true
9252 }
9253 break
9254 }
9255
9256
9257
9258 for {
9259 if v_0.Op != OpZeroExt16to32 {
9260 break
9261 }
9262 v_0_0 := v_0.Args[0]
9263 if v_0_0.Op != OpAnd16 {
9264 break
9265 }
9266 v_0_0_0 := v_0_0.Args[0]
9267 v_0_0_1 := v_0_0.Args[1]
9268 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9269 if v_0_0_0.Op != OpConst16 {
9270 continue
9271 }
9272 c := auxIntToInt16(v_0_0_0.AuxInt)
9273 if v_1.Op != OpConst32 {
9274 continue
9275 }
9276 d := auxIntToInt32(v_1.AuxInt)
9277 if !(0 <= c && int32(c) < d) {
9278 continue
9279 }
9280 v.reset(OpConstBool)
9281 v.AuxInt = boolToAuxInt(true)
9282 return true
9283 }
9284 break
9285 }
9286
9287
9288
9289 for {
9290 if v_0.Op != OpZeroExt16to64 {
9291 break
9292 }
9293 v_0_0 := v_0.Args[0]
9294 if v_0_0.Op != OpAnd16 {
9295 break
9296 }
9297 v_0_0_0 := v_0_0.Args[0]
9298 v_0_0_1 := v_0_0.Args[1]
9299 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9300 if v_0_0_0.Op != OpConst16 {
9301 continue
9302 }
9303 c := auxIntToInt16(v_0_0_0.AuxInt)
9304 if v_1.Op != OpConst64 {
9305 continue
9306 }
9307 d := auxIntToInt64(v_1.AuxInt)
9308 if !(0 <= c && int64(c) < d) {
9309 continue
9310 }
9311 v.reset(OpConstBool)
9312 v.AuxInt = boolToAuxInt(true)
9313 return true
9314 }
9315 break
9316 }
9317
9318
9319
9320 for {
9321 if v_0.Op != OpAnd32 {
9322 break
9323 }
9324 v_0_0 := v_0.Args[0]
9325 v_0_1 := v_0.Args[1]
9326 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9327 if v_0_0.Op != OpConst32 {
9328 continue
9329 }
9330 c := auxIntToInt32(v_0_0.AuxInt)
9331 if v_1.Op != OpConst32 {
9332 continue
9333 }
9334 d := auxIntToInt32(v_1.AuxInt)
9335 if !(0 <= c && c < d) {
9336 continue
9337 }
9338 v.reset(OpConstBool)
9339 v.AuxInt = boolToAuxInt(true)
9340 return true
9341 }
9342 break
9343 }
9344
9345
9346
9347 for {
9348 if v_0.Op != OpZeroExt32to64 {
9349 break
9350 }
9351 v_0_0 := v_0.Args[0]
9352 if v_0_0.Op != OpAnd32 {
9353 break
9354 }
9355 v_0_0_0 := v_0_0.Args[0]
9356 v_0_0_1 := v_0_0.Args[1]
9357 for _i0 := 0; _i0 <= 1; _i0, v_0_0_0, v_0_0_1 = _i0+1, v_0_0_1, v_0_0_0 {
9358 if v_0_0_0.Op != OpConst32 {
9359 continue
9360 }
9361 c := auxIntToInt32(v_0_0_0.AuxInt)
9362 if v_1.Op != OpConst64 {
9363 continue
9364 }
9365 d := auxIntToInt64(v_1.AuxInt)
9366 if !(0 <= c && int64(c) < d) {
9367 continue
9368 }
9369 v.reset(OpConstBool)
9370 v.AuxInt = boolToAuxInt(true)
9371 return true
9372 }
9373 break
9374 }
9375
9376
9377
9378 for {
9379 if v_0.Op != OpAnd64 {
9380 break
9381 }
9382 v_0_0 := v_0.Args[0]
9383 v_0_1 := v_0.Args[1]
9384 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9385 if v_0_0.Op != OpConst64 {
9386 continue
9387 }
9388 c := auxIntToInt64(v_0_0.AuxInt)
9389 if v_1.Op != OpConst64 {
9390 continue
9391 }
9392 d := auxIntToInt64(v_1.AuxInt)
9393 if !(0 <= c && c < d) {
9394 continue
9395 }
9396 v.reset(OpConstBool)
9397 v.AuxInt = boolToAuxInt(true)
9398 return true
9399 }
9400 break
9401 }
9402
9403
9404 for {
9405 if v_0.Op != OpConst32 {
9406 break
9407 }
9408 c := auxIntToInt32(v_0.AuxInt)
9409 if v_1.Op != OpConst32 {
9410 break
9411 }
9412 d := auxIntToInt32(v_1.AuxInt)
9413 v.reset(OpConstBool)
9414 v.AuxInt = boolToAuxInt(0 <= c && c < d)
9415 return true
9416 }
9417
9418
9419 for {
9420 if v_0.Op != OpConst64 {
9421 break
9422 }
9423 c := auxIntToInt64(v_0.AuxInt)
9424 if v_1.Op != OpConst64 {
9425 break
9426 }
9427 d := auxIntToInt64(v_1.AuxInt)
9428 v.reset(OpConstBool)
9429 v.AuxInt = boolToAuxInt(0 <= c && c < d)
9430 return true
9431 }
9432
9433
9434 for {
9435 if v_0.Op != OpMod32u {
9436 break
9437 }
9438 y := v_0.Args[1]
9439 if y != v_1 {
9440 break
9441 }
9442 v.reset(OpConstBool)
9443 v.AuxInt = boolToAuxInt(true)
9444 return true
9445 }
9446
9447
9448 for {
9449 if v_0.Op != OpMod64u {
9450 break
9451 }
9452 y := v_0.Args[1]
9453 if y != v_1 {
9454 break
9455 }
9456 v.reset(OpConstBool)
9457 v.AuxInt = boolToAuxInt(true)
9458 return true
9459 }
9460
9461
9462
9463 for {
9464 if v_0.Op != OpZeroExt8to64 {
9465 break
9466 }
9467 v_0_0 := v_0.Args[0]
9468 if v_0_0.Op != OpRsh8Ux64 {
9469 break
9470 }
9471 _ = v_0_0.Args[1]
9472 v_0_0_1 := v_0_0.Args[1]
9473 if v_0_0_1.Op != OpConst64 {
9474 break
9475 }
9476 c := auxIntToInt64(v_0_0_1.AuxInt)
9477 if v_1.Op != OpConst64 {
9478 break
9479 }
9480 d := auxIntToInt64(v_1.AuxInt)
9481 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
9482 break
9483 }
9484 v.reset(OpConstBool)
9485 v.AuxInt = boolToAuxInt(true)
9486 return true
9487 }
9488
9489
9490
9491 for {
9492 if v_0.Op != OpZeroExt8to32 {
9493 break
9494 }
9495 v_0_0 := v_0.Args[0]
9496 if v_0_0.Op != OpRsh8Ux64 {
9497 break
9498 }
9499 _ = v_0_0.Args[1]
9500 v_0_0_1 := v_0_0.Args[1]
9501 if v_0_0_1.Op != OpConst64 {
9502 break
9503 }
9504 c := auxIntToInt64(v_0_0_1.AuxInt)
9505 if v_1.Op != OpConst32 {
9506 break
9507 }
9508 d := auxIntToInt32(v_1.AuxInt)
9509 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
9510 break
9511 }
9512 v.reset(OpConstBool)
9513 v.AuxInt = boolToAuxInt(true)
9514 return true
9515 }
9516
9517
9518
9519 for {
9520 if v_0.Op != OpZeroExt8to16 {
9521 break
9522 }
9523 v_0_0 := v_0.Args[0]
9524 if v_0_0.Op != OpRsh8Ux64 {
9525 break
9526 }
9527 _ = v_0_0.Args[1]
9528 v_0_0_1 := v_0_0.Args[1]
9529 if v_0_0_1.Op != OpConst64 {
9530 break
9531 }
9532 c := auxIntToInt64(v_0_0_1.AuxInt)
9533 if v_1.Op != OpConst16 {
9534 break
9535 }
9536 d := auxIntToInt16(v_1.AuxInt)
9537 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
9538 break
9539 }
9540 v.reset(OpConstBool)
9541 v.AuxInt = boolToAuxInt(true)
9542 return true
9543 }
9544
9545
9546
9547 for {
9548 if v_0.Op != OpRsh8Ux64 {
9549 break
9550 }
9551 _ = v_0.Args[1]
9552 v_0_1 := v_0.Args[1]
9553 if v_0_1.Op != OpConst64 {
9554 break
9555 }
9556 c := auxIntToInt64(v_0_1.AuxInt)
9557 if v_1.Op != OpConst64 {
9558 break
9559 }
9560 d := auxIntToInt64(v_1.AuxInt)
9561 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) {
9562 break
9563 }
9564 v.reset(OpConstBool)
9565 v.AuxInt = boolToAuxInt(true)
9566 return true
9567 }
9568
9569
9570
9571 for {
9572 if v_0.Op != OpZeroExt16to64 {
9573 break
9574 }
9575 v_0_0 := v_0.Args[0]
9576 if v_0_0.Op != OpRsh16Ux64 {
9577 break
9578 }
9579 _ = v_0_0.Args[1]
9580 v_0_0_1 := v_0_0.Args[1]
9581 if v_0_0_1.Op != OpConst64 {
9582 break
9583 }
9584 c := auxIntToInt64(v_0_0_1.AuxInt)
9585 if v_1.Op != OpConst64 {
9586 break
9587 }
9588 d := auxIntToInt64(v_1.AuxInt)
9589 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
9590 break
9591 }
9592 v.reset(OpConstBool)
9593 v.AuxInt = boolToAuxInt(true)
9594 return true
9595 }
9596
9597
9598
9599 for {
9600 if v_0.Op != OpZeroExt16to32 {
9601 break
9602 }
9603 v_0_0 := v_0.Args[0]
9604 if v_0_0.Op != OpRsh16Ux64 {
9605 break
9606 }
9607 _ = v_0_0.Args[1]
9608 v_0_0_1 := v_0_0.Args[1]
9609 if v_0_0_1.Op != OpConst64 {
9610 break
9611 }
9612 c := auxIntToInt64(v_0_0_1.AuxInt)
9613 if v_1.Op != OpConst64 {
9614 break
9615 }
9616 d := auxIntToInt64(v_1.AuxInt)
9617 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
9618 break
9619 }
9620 v.reset(OpConstBool)
9621 v.AuxInt = boolToAuxInt(true)
9622 return true
9623 }
9624
9625
9626
9627 for {
9628 if v_0.Op != OpRsh16Ux64 {
9629 break
9630 }
9631 _ = v_0.Args[1]
9632 v_0_1 := v_0.Args[1]
9633 if v_0_1.Op != OpConst64 {
9634 break
9635 }
9636 c := auxIntToInt64(v_0_1.AuxInt)
9637 if v_1.Op != OpConst64 {
9638 break
9639 }
9640 d := auxIntToInt64(v_1.AuxInt)
9641 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) {
9642 break
9643 }
9644 v.reset(OpConstBool)
9645 v.AuxInt = boolToAuxInt(true)
9646 return true
9647 }
9648
9649
9650
9651 for {
9652 if v_0.Op != OpZeroExt32to64 {
9653 break
9654 }
9655 v_0_0 := v_0.Args[0]
9656 if v_0_0.Op != OpRsh32Ux64 {
9657 break
9658 }
9659 _ = v_0_0.Args[1]
9660 v_0_0_1 := v_0_0.Args[1]
9661 if v_0_0_1.Op != OpConst64 {
9662 break
9663 }
9664 c := auxIntToInt64(v_0_0_1.AuxInt)
9665 if v_1.Op != OpConst64 {
9666 break
9667 }
9668 d := auxIntToInt64(v_1.AuxInt)
9669 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) {
9670 break
9671 }
9672 v.reset(OpConstBool)
9673 v.AuxInt = boolToAuxInt(true)
9674 return true
9675 }
9676
9677
9678
9679 for {
9680 if v_0.Op != OpRsh32Ux64 {
9681 break
9682 }
9683 _ = v_0.Args[1]
9684 v_0_1 := v_0.Args[1]
9685 if v_0_1.Op != OpConst64 {
9686 break
9687 }
9688 c := auxIntToInt64(v_0_1.AuxInt)
9689 if v_1.Op != OpConst64 {
9690 break
9691 }
9692 d := auxIntToInt64(v_1.AuxInt)
9693 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) {
9694 break
9695 }
9696 v.reset(OpConstBool)
9697 v.AuxInt = boolToAuxInt(true)
9698 return true
9699 }
9700
9701
9702
9703 for {
9704 if v_0.Op != OpRsh64Ux64 {
9705 break
9706 }
9707 _ = v_0.Args[1]
9708 v_0_1 := v_0.Args[1]
9709 if v_0_1.Op != OpConst64 {
9710 break
9711 }
9712 c := auxIntToInt64(v_0_1.AuxInt)
9713 if v_1.Op != OpConst64 {
9714 break
9715 }
9716 d := auxIntToInt64(v_1.AuxInt)
9717 if !(0 < c && c < 64 && 1<<uint(64-c)-1 < d) {
9718 break
9719 }
9720 v.reset(OpConstBool)
9721 v.AuxInt = boolToAuxInt(true)
9722 return true
9723 }
9724 return false
9725 }
9726 func rewriteValuegeneric_OpIsNonNil(v *Value) bool {
9727 v_0 := v.Args[0]
9728
9729
9730 for {
9731 if v_0.Op != OpConstNil {
9732 break
9733 }
9734 v.reset(OpConstBool)
9735 v.AuxInt = boolToAuxInt(false)
9736 return true
9737 }
9738
9739
9740 for {
9741 if v_0.Op != OpConst32 {
9742 break
9743 }
9744 c := auxIntToInt32(v_0.AuxInt)
9745 v.reset(OpConstBool)
9746 v.AuxInt = boolToAuxInt(c != 0)
9747 return true
9748 }
9749
9750
9751 for {
9752 if v_0.Op != OpConst64 {
9753 break
9754 }
9755 c := auxIntToInt64(v_0.AuxInt)
9756 v.reset(OpConstBool)
9757 v.AuxInt = boolToAuxInt(c != 0)
9758 return true
9759 }
9760
9761
9762 for {
9763 if v_0.Op != OpAddr {
9764 break
9765 }
9766 v.reset(OpConstBool)
9767 v.AuxInt = boolToAuxInt(true)
9768 return true
9769 }
9770
9771
9772 for {
9773 if v_0.Op != OpConvert {
9774 break
9775 }
9776 v_0_0 := v_0.Args[0]
9777 if v_0_0.Op != OpAddr {
9778 break
9779 }
9780 v.reset(OpConstBool)
9781 v.AuxInt = boolToAuxInt(true)
9782 return true
9783 }
9784
9785
9786 for {
9787 if v_0.Op != OpLocalAddr {
9788 break
9789 }
9790 v.reset(OpConstBool)
9791 v.AuxInt = boolToAuxInt(true)
9792 return true
9793 }
9794 return false
9795 }
9796 func rewriteValuegeneric_OpIsSliceInBounds(v *Value) bool {
9797 v_1 := v.Args[1]
9798 v_0 := v.Args[0]
9799
9800
9801 for {
9802 x := v_0
9803 if x != v_1 {
9804 break
9805 }
9806 v.reset(OpConstBool)
9807 v.AuxInt = boolToAuxInt(true)
9808 return true
9809 }
9810
9811
9812
9813 for {
9814 if v_0.Op != OpAnd32 {
9815 break
9816 }
9817 v_0_0 := v_0.Args[0]
9818 v_0_1 := v_0.Args[1]
9819 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9820 if v_0_0.Op != OpConst32 {
9821 continue
9822 }
9823 c := auxIntToInt32(v_0_0.AuxInt)
9824 if v_1.Op != OpConst32 {
9825 continue
9826 }
9827 d := auxIntToInt32(v_1.AuxInt)
9828 if !(0 <= c && c <= d) {
9829 continue
9830 }
9831 v.reset(OpConstBool)
9832 v.AuxInt = boolToAuxInt(true)
9833 return true
9834 }
9835 break
9836 }
9837
9838
9839
9840 for {
9841 if v_0.Op != OpAnd64 {
9842 break
9843 }
9844 v_0_0 := v_0.Args[0]
9845 v_0_1 := v_0.Args[1]
9846 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
9847 if v_0_0.Op != OpConst64 {
9848 continue
9849 }
9850 c := auxIntToInt64(v_0_0.AuxInt)
9851 if v_1.Op != OpConst64 {
9852 continue
9853 }
9854 d := auxIntToInt64(v_1.AuxInt)
9855 if !(0 <= c && c <= d) {
9856 continue
9857 }
9858 v.reset(OpConstBool)
9859 v.AuxInt = boolToAuxInt(true)
9860 return true
9861 }
9862 break
9863 }
9864
9865
9866 for {
9867 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
9868 break
9869 }
9870 v.reset(OpConstBool)
9871 v.AuxInt = boolToAuxInt(true)
9872 return true
9873 }
9874
9875
9876 for {
9877 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
9878 break
9879 }
9880 v.reset(OpConstBool)
9881 v.AuxInt = boolToAuxInt(true)
9882 return true
9883 }
9884
9885
9886 for {
9887 if v_0.Op != OpConst32 {
9888 break
9889 }
9890 c := auxIntToInt32(v_0.AuxInt)
9891 if v_1.Op != OpConst32 {
9892 break
9893 }
9894 d := auxIntToInt32(v_1.AuxInt)
9895 v.reset(OpConstBool)
9896 v.AuxInt = boolToAuxInt(0 <= c && c <= d)
9897 return true
9898 }
9899
9900
9901 for {
9902 if v_0.Op != OpConst64 {
9903 break
9904 }
9905 c := auxIntToInt64(v_0.AuxInt)
9906 if v_1.Op != OpConst64 {
9907 break
9908 }
9909 d := auxIntToInt64(v_1.AuxInt)
9910 v.reset(OpConstBool)
9911 v.AuxInt = boolToAuxInt(0 <= c && c <= d)
9912 return true
9913 }
9914
9915
9916 for {
9917 if v_0.Op != OpSliceLen {
9918 break
9919 }
9920 x := v_0.Args[0]
9921 if v_1.Op != OpSliceCap || x != v_1.Args[0] {
9922 break
9923 }
9924 v.reset(OpConstBool)
9925 v.AuxInt = boolToAuxInt(true)
9926 return true
9927 }
9928 return false
9929 }
9930 func rewriteValuegeneric_OpLeq16(v *Value) bool {
9931 v_1 := v.Args[1]
9932 v_0 := v.Args[0]
9933 b := v.Block
9934
9935
9936 for {
9937 if v_0.Op != OpConst16 {
9938 break
9939 }
9940 c := auxIntToInt16(v_0.AuxInt)
9941 if v_1.Op != OpConst16 {
9942 break
9943 }
9944 d := auxIntToInt16(v_1.AuxInt)
9945 v.reset(OpConstBool)
9946 v.AuxInt = boolToAuxInt(c <= d)
9947 return true
9948 }
9949
9950
9951
9952 for {
9953 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 || v_1.Op != OpAnd16 {
9954 break
9955 }
9956 _ = v_1.Args[1]
9957 v_1_0 := v_1.Args[0]
9958 v_1_1 := v_1.Args[1]
9959 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
9960 if v_1_1.Op != OpConst16 {
9961 continue
9962 }
9963 c := auxIntToInt16(v_1_1.AuxInt)
9964 if !(c >= 0) {
9965 continue
9966 }
9967 v.reset(OpConstBool)
9968 v.AuxInt = boolToAuxInt(true)
9969 return true
9970 }
9971 break
9972 }
9973
9974
9975
9976 for {
9977 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 || v_1.Op != OpRsh16Ux64 {
9978 break
9979 }
9980 _ = v_1.Args[1]
9981 v_1_1 := v_1.Args[1]
9982 if v_1_1.Op != OpConst64 {
9983 break
9984 }
9985 c := auxIntToInt64(v_1_1.AuxInt)
9986 if !(c > 0) {
9987 break
9988 }
9989 v.reset(OpConstBool)
9990 v.AuxInt = boolToAuxInt(true)
9991 return true
9992 }
9993
9994
9995 for {
9996 x := v_0
9997 if v_1.Op != OpConst16 {
9998 break
9999 }
10000 t := v_1.Type
10001 if auxIntToInt16(v_1.AuxInt) != -1 {
10002 break
10003 }
10004 v.reset(OpLess16)
10005 v0 := b.NewValue0(v.Pos, OpConst16, t)
10006 v0.AuxInt = int16ToAuxInt(0)
10007 v.AddArg2(x, v0)
10008 return true
10009 }
10010
10011
10012 for {
10013 if v_0.Op != OpConst16 {
10014 break
10015 }
10016 t := v_0.Type
10017 if auxIntToInt16(v_0.AuxInt) != 1 {
10018 break
10019 }
10020 x := v_1
10021 v.reset(OpLess16)
10022 v0 := b.NewValue0(v.Pos, OpConst16, t)
10023 v0.AuxInt = int16ToAuxInt(0)
10024 v.AddArg2(v0, x)
10025 return true
10026 }
10027
10028
10029 for {
10030 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != math.MinInt16 {
10031 break
10032 }
10033 v.reset(OpConstBool)
10034 v.AuxInt = boolToAuxInt(true)
10035 return true
10036 }
10037
10038
10039 for {
10040 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != math.MaxInt16 {
10041 break
10042 }
10043 v.reset(OpConstBool)
10044 v.AuxInt = boolToAuxInt(true)
10045 return true
10046 }
10047
10048
10049 for {
10050 x := v_0
10051 c := v_1
10052 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != math.MinInt16 {
10053 break
10054 }
10055 v.reset(OpEq16)
10056 v.AddArg2(x, c)
10057 return true
10058 }
10059
10060
10061 for {
10062 c := v_0
10063 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != math.MaxInt16 {
10064 break
10065 }
10066 x := v_1
10067 v.reset(OpEq16)
10068 v.AddArg2(x, c)
10069 return true
10070 }
10071 return false
10072 }
10073 func rewriteValuegeneric_OpLeq16U(v *Value) bool {
10074 v_1 := v.Args[1]
10075 v_0 := v.Args[0]
10076 b := v.Block
10077
10078
10079 for {
10080 if v_0.Op != OpConst16 {
10081 break
10082 }
10083 c := auxIntToInt16(v_0.AuxInt)
10084 if v_1.Op != OpConst16 {
10085 break
10086 }
10087 d := auxIntToInt16(v_1.AuxInt)
10088 v.reset(OpConstBool)
10089 v.AuxInt = boolToAuxInt(uint16(c) <= uint16(d))
10090 return true
10091 }
10092
10093
10094 for {
10095 if v_0.Op != OpConst16 {
10096 break
10097 }
10098 t := v_0.Type
10099 if auxIntToInt16(v_0.AuxInt) != 1 {
10100 break
10101 }
10102 x := v_1
10103 v.reset(OpNeq16)
10104 v0 := b.NewValue0(v.Pos, OpConst16, t)
10105 v0.AuxInt = int16ToAuxInt(0)
10106 v.AddArg2(v0, x)
10107 return true
10108 }
10109
10110
10111 for {
10112 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
10113 break
10114 }
10115 v.reset(OpConstBool)
10116 v.AuxInt = boolToAuxInt(true)
10117 return true
10118 }
10119
10120
10121 for {
10122 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != -1 {
10123 break
10124 }
10125 v.reset(OpConstBool)
10126 v.AuxInt = boolToAuxInt(true)
10127 return true
10128 }
10129
10130
10131 for {
10132 x := v_0
10133 c := v_1
10134 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != 0 {
10135 break
10136 }
10137 v.reset(OpEq16)
10138 v.AddArg2(x, c)
10139 return true
10140 }
10141
10142
10143 for {
10144 c := v_0
10145 if c.Op != OpConst16 || auxIntToInt16(c.AuxInt) != -1 {
10146 break
10147 }
10148 x := v_1
10149 v.reset(OpEq16)
10150 v.AddArg2(x, c)
10151 return true
10152 }
10153 return false
10154 }
10155 func rewriteValuegeneric_OpLeq32(v *Value) bool {
10156 v_1 := v.Args[1]
10157 v_0 := v.Args[0]
10158 b := v.Block
10159
10160
10161 for {
10162 if v_0.Op != OpConst32 {
10163 break
10164 }
10165 c := auxIntToInt32(v_0.AuxInt)
10166 if v_1.Op != OpConst32 {
10167 break
10168 }
10169 d := auxIntToInt32(v_1.AuxInt)
10170 v.reset(OpConstBool)
10171 v.AuxInt = boolToAuxInt(c <= d)
10172 return true
10173 }
10174
10175
10176
10177 for {
10178 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 || v_1.Op != OpAnd32 {
10179 break
10180 }
10181 _ = v_1.Args[1]
10182 v_1_0 := v_1.Args[0]
10183 v_1_1 := v_1.Args[1]
10184 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
10185 if v_1_1.Op != OpConst32 {
10186 continue
10187 }
10188 c := auxIntToInt32(v_1_1.AuxInt)
10189 if !(c >= 0) {
10190 continue
10191 }
10192 v.reset(OpConstBool)
10193 v.AuxInt = boolToAuxInt(true)
10194 return true
10195 }
10196 break
10197 }
10198
10199
10200
10201 for {
10202 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 || v_1.Op != OpRsh32Ux64 {
10203 break
10204 }
10205 _ = v_1.Args[1]
10206 v_1_1 := v_1.Args[1]
10207 if v_1_1.Op != OpConst64 {
10208 break
10209 }
10210 c := auxIntToInt64(v_1_1.AuxInt)
10211 if !(c > 0) {
10212 break
10213 }
10214 v.reset(OpConstBool)
10215 v.AuxInt = boolToAuxInt(true)
10216 return true
10217 }
10218
10219
10220 for {
10221 x := v_0
10222 if v_1.Op != OpConst32 {
10223 break
10224 }
10225 t := v_1.Type
10226 if auxIntToInt32(v_1.AuxInt) != -1 {
10227 break
10228 }
10229 v.reset(OpLess32)
10230 v0 := b.NewValue0(v.Pos, OpConst32, t)
10231 v0.AuxInt = int32ToAuxInt(0)
10232 v.AddArg2(x, v0)
10233 return true
10234 }
10235
10236
10237 for {
10238 if v_0.Op != OpConst32 {
10239 break
10240 }
10241 t := v_0.Type
10242 if auxIntToInt32(v_0.AuxInt) != 1 {
10243 break
10244 }
10245 x := v_1
10246 v.reset(OpLess32)
10247 v0 := b.NewValue0(v.Pos, OpConst32, t)
10248 v0.AuxInt = int32ToAuxInt(0)
10249 v.AddArg2(v0, x)
10250 return true
10251 }
10252
10253
10254 for {
10255 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != math.MinInt32 {
10256 break
10257 }
10258 v.reset(OpConstBool)
10259 v.AuxInt = boolToAuxInt(true)
10260 return true
10261 }
10262
10263
10264 for {
10265 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != math.MaxInt32 {
10266 break
10267 }
10268 v.reset(OpConstBool)
10269 v.AuxInt = boolToAuxInt(true)
10270 return true
10271 }
10272
10273
10274 for {
10275 x := v_0
10276 c := v_1
10277 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != math.MinInt32 {
10278 break
10279 }
10280 v.reset(OpEq32)
10281 v.AddArg2(x, c)
10282 return true
10283 }
10284
10285
10286 for {
10287 c := v_0
10288 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != math.MaxInt32 {
10289 break
10290 }
10291 x := v_1
10292 v.reset(OpEq32)
10293 v.AddArg2(x, c)
10294 return true
10295 }
10296 return false
10297 }
10298 func rewriteValuegeneric_OpLeq32F(v *Value) bool {
10299 v_1 := v.Args[1]
10300 v_0 := v.Args[0]
10301
10302
10303 for {
10304 if v_0.Op != OpConst32F {
10305 break
10306 }
10307 c := auxIntToFloat32(v_0.AuxInt)
10308 if v_1.Op != OpConst32F {
10309 break
10310 }
10311 d := auxIntToFloat32(v_1.AuxInt)
10312 v.reset(OpConstBool)
10313 v.AuxInt = boolToAuxInt(c <= d)
10314 return true
10315 }
10316 return false
10317 }
10318 func rewriteValuegeneric_OpLeq32U(v *Value) bool {
10319 v_1 := v.Args[1]
10320 v_0 := v.Args[0]
10321 b := v.Block
10322
10323
10324 for {
10325 if v_0.Op != OpConst32 {
10326 break
10327 }
10328 c := auxIntToInt32(v_0.AuxInt)
10329 if v_1.Op != OpConst32 {
10330 break
10331 }
10332 d := auxIntToInt32(v_1.AuxInt)
10333 v.reset(OpConstBool)
10334 v.AuxInt = boolToAuxInt(uint32(c) <= uint32(d))
10335 return true
10336 }
10337
10338
10339 for {
10340 if v_0.Op != OpConst32 {
10341 break
10342 }
10343 t := v_0.Type
10344 if auxIntToInt32(v_0.AuxInt) != 1 {
10345 break
10346 }
10347 x := v_1
10348 v.reset(OpNeq32)
10349 v0 := b.NewValue0(v.Pos, OpConst32, t)
10350 v0.AuxInt = int32ToAuxInt(0)
10351 v.AddArg2(v0, x)
10352 return true
10353 }
10354
10355
10356 for {
10357 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
10358 break
10359 }
10360 v.reset(OpConstBool)
10361 v.AuxInt = boolToAuxInt(true)
10362 return true
10363 }
10364
10365
10366 for {
10367 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != -1 {
10368 break
10369 }
10370 v.reset(OpConstBool)
10371 v.AuxInt = boolToAuxInt(true)
10372 return true
10373 }
10374
10375
10376 for {
10377 x := v_0
10378 c := v_1
10379 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != 0 {
10380 break
10381 }
10382 v.reset(OpEq32)
10383 v.AddArg2(x, c)
10384 return true
10385 }
10386
10387
10388 for {
10389 c := v_0
10390 if c.Op != OpConst32 || auxIntToInt32(c.AuxInt) != -1 {
10391 break
10392 }
10393 x := v_1
10394 v.reset(OpEq32)
10395 v.AddArg2(x, c)
10396 return true
10397 }
10398 return false
10399 }
10400 func rewriteValuegeneric_OpLeq64(v *Value) bool {
10401 v_1 := v.Args[1]
10402 v_0 := v.Args[0]
10403 b := v.Block
10404
10405
10406 for {
10407 if v_0.Op != OpConst64 {
10408 break
10409 }
10410 c := auxIntToInt64(v_0.AuxInt)
10411 if v_1.Op != OpConst64 {
10412 break
10413 }
10414 d := auxIntToInt64(v_1.AuxInt)
10415 v.reset(OpConstBool)
10416 v.AuxInt = boolToAuxInt(c <= d)
10417 return true
10418 }
10419
10420
10421
10422 for {
10423 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 || v_1.Op != OpAnd64 {
10424 break
10425 }
10426 _ = v_1.Args[1]
10427 v_1_0 := v_1.Args[0]
10428 v_1_1 := v_1.Args[1]
10429 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
10430 if v_1_1.Op != OpConst64 {
10431 continue
10432 }
10433 c := auxIntToInt64(v_1_1.AuxInt)
10434 if !(c >= 0) {
10435 continue
10436 }
10437 v.reset(OpConstBool)
10438 v.AuxInt = boolToAuxInt(true)
10439 return true
10440 }
10441 break
10442 }
10443
10444
10445
10446 for {
10447 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 || v_1.Op != OpRsh64Ux64 {
10448 break
10449 }
10450 _ = v_1.Args[1]
10451 v_1_1 := v_1.Args[1]
10452 if v_1_1.Op != OpConst64 {
10453 break
10454 }
10455 c := auxIntToInt64(v_1_1.AuxInt)
10456 if !(c > 0) {
10457 break
10458 }
10459 v.reset(OpConstBool)
10460 v.AuxInt = boolToAuxInt(true)
10461 return true
10462 }
10463
10464
10465 for {
10466 x := v_0
10467 if v_1.Op != OpConst64 {
10468 break
10469 }
10470 t := v_1.Type
10471 if auxIntToInt64(v_1.AuxInt) != -1 {
10472 break
10473 }
10474 v.reset(OpLess64)
10475 v0 := b.NewValue0(v.Pos, OpConst64, t)
10476 v0.AuxInt = int64ToAuxInt(0)
10477 v.AddArg2(x, v0)
10478 return true
10479 }
10480
10481
10482 for {
10483 if v_0.Op != OpConst64 {
10484 break
10485 }
10486 t := v_0.Type
10487 if auxIntToInt64(v_0.AuxInt) != 1 {
10488 break
10489 }
10490 x := v_1
10491 v.reset(OpLess64)
10492 v0 := b.NewValue0(v.Pos, OpConst64, t)
10493 v0.AuxInt = int64ToAuxInt(0)
10494 v.AddArg2(v0, x)
10495 return true
10496 }
10497
10498
10499 for {
10500 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != math.MinInt64 {
10501 break
10502 }
10503 v.reset(OpConstBool)
10504 v.AuxInt = boolToAuxInt(true)
10505 return true
10506 }
10507
10508
10509 for {
10510 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != math.MaxInt64 {
10511 break
10512 }
10513 v.reset(OpConstBool)
10514 v.AuxInt = boolToAuxInt(true)
10515 return true
10516 }
10517
10518
10519 for {
10520 x := v_0
10521 c := v_1
10522 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != math.MinInt64 {
10523 break
10524 }
10525 v.reset(OpEq64)
10526 v.AddArg2(x, c)
10527 return true
10528 }
10529
10530
10531 for {
10532 c := v_0
10533 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != math.MaxInt64 {
10534 break
10535 }
10536 x := v_1
10537 v.reset(OpEq64)
10538 v.AddArg2(x, c)
10539 return true
10540 }
10541 return false
10542 }
10543 func rewriteValuegeneric_OpLeq64F(v *Value) bool {
10544 v_1 := v.Args[1]
10545 v_0 := v.Args[0]
10546
10547
10548 for {
10549 if v_0.Op != OpConst64F {
10550 break
10551 }
10552 c := auxIntToFloat64(v_0.AuxInt)
10553 if v_1.Op != OpConst64F {
10554 break
10555 }
10556 d := auxIntToFloat64(v_1.AuxInt)
10557 v.reset(OpConstBool)
10558 v.AuxInt = boolToAuxInt(c <= d)
10559 return true
10560 }
10561 return false
10562 }
10563 func rewriteValuegeneric_OpLeq64U(v *Value) bool {
10564 v_1 := v.Args[1]
10565 v_0 := v.Args[0]
10566 b := v.Block
10567
10568
10569 for {
10570 if v_0.Op != OpConst64 {
10571 break
10572 }
10573 c := auxIntToInt64(v_0.AuxInt)
10574 if v_1.Op != OpConst64 {
10575 break
10576 }
10577 d := auxIntToInt64(v_1.AuxInt)
10578 v.reset(OpConstBool)
10579 v.AuxInt = boolToAuxInt(uint64(c) <= uint64(d))
10580 return true
10581 }
10582
10583
10584 for {
10585 if v_0.Op != OpConst64 {
10586 break
10587 }
10588 t := v_0.Type
10589 if auxIntToInt64(v_0.AuxInt) != 1 {
10590 break
10591 }
10592 x := v_1
10593 v.reset(OpNeq64)
10594 v0 := b.NewValue0(v.Pos, OpConst64, t)
10595 v0.AuxInt = int64ToAuxInt(0)
10596 v.AddArg2(v0, x)
10597 return true
10598 }
10599
10600
10601 for {
10602 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
10603 break
10604 }
10605 v.reset(OpConstBool)
10606 v.AuxInt = boolToAuxInt(true)
10607 return true
10608 }
10609
10610
10611 for {
10612 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1 {
10613 break
10614 }
10615 v.reset(OpConstBool)
10616 v.AuxInt = boolToAuxInt(true)
10617 return true
10618 }
10619
10620
10621 for {
10622 x := v_0
10623 c := v_1
10624 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != 0 {
10625 break
10626 }
10627 v.reset(OpEq64)
10628 v.AddArg2(x, c)
10629 return true
10630 }
10631
10632
10633 for {
10634 c := v_0
10635 if c.Op != OpConst64 || auxIntToInt64(c.AuxInt) != -1 {
10636 break
10637 }
10638 x := v_1
10639 v.reset(OpEq64)
10640 v.AddArg2(x, c)
10641 return true
10642 }
10643 return false
10644 }
10645 func rewriteValuegeneric_OpLeq8(v *Value) bool {
10646 v_1 := v.Args[1]
10647 v_0 := v.Args[0]
10648 b := v.Block
10649
10650
10651 for {
10652 if v_0.Op != OpConst8 {
10653 break
10654 }
10655 c := auxIntToInt8(v_0.AuxInt)
10656 if v_1.Op != OpConst8 {
10657 break
10658 }
10659 d := auxIntToInt8(v_1.AuxInt)
10660 v.reset(OpConstBool)
10661 v.AuxInt = boolToAuxInt(c <= d)
10662 return true
10663 }
10664
10665
10666
10667 for {
10668 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 || v_1.Op != OpAnd8 {
10669 break
10670 }
10671 _ = v_1.Args[1]
10672 v_1_0 := v_1.Args[0]
10673 v_1_1 := v_1.Args[1]
10674 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
10675 if v_1_1.Op != OpConst8 {
10676 continue
10677 }
10678 c := auxIntToInt8(v_1_1.AuxInt)
10679 if !(c >= 0) {
10680 continue
10681 }
10682 v.reset(OpConstBool)
10683 v.AuxInt = boolToAuxInt(true)
10684 return true
10685 }
10686 break
10687 }
10688
10689
10690
10691 for {
10692 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 || v_1.Op != OpRsh8Ux64 {
10693 break
10694 }
10695 _ = v_1.Args[1]
10696 v_1_1 := v_1.Args[1]
10697 if v_1_1.Op != OpConst64 {
10698 break
10699 }
10700 c := auxIntToInt64(v_1_1.AuxInt)
10701 if !(c > 0) {
10702 break
10703 }
10704 v.reset(OpConstBool)
10705 v.AuxInt = boolToAuxInt(true)
10706 return true
10707 }
10708
10709
10710 for {
10711 x := v_0
10712 if v_1.Op != OpConst8 {
10713 break
10714 }
10715 t := v_1.Type
10716 if auxIntToInt8(v_1.AuxInt) != -1 {
10717 break
10718 }
10719 v.reset(OpLess8)
10720 v0 := b.NewValue0(v.Pos, OpConst8, t)
10721 v0.AuxInt = int8ToAuxInt(0)
10722 v.AddArg2(x, v0)
10723 return true
10724 }
10725
10726
10727 for {
10728 if v_0.Op != OpConst8 {
10729 break
10730 }
10731 t := v_0.Type
10732 if auxIntToInt8(v_0.AuxInt) != 1 {
10733 break
10734 }
10735 x := v_1
10736 v.reset(OpLess8)
10737 v0 := b.NewValue0(v.Pos, OpConst8, t)
10738 v0.AuxInt = int8ToAuxInt(0)
10739 v.AddArg2(v0, x)
10740 return true
10741 }
10742
10743
10744 for {
10745 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != math.MinInt8 {
10746 break
10747 }
10748 v.reset(OpConstBool)
10749 v.AuxInt = boolToAuxInt(true)
10750 return true
10751 }
10752
10753
10754 for {
10755 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != math.MaxInt8 {
10756 break
10757 }
10758 v.reset(OpConstBool)
10759 v.AuxInt = boolToAuxInt(true)
10760 return true
10761 }
10762
10763
10764 for {
10765 x := v_0
10766 c := v_1
10767 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != math.MinInt8 {
10768 break
10769 }
10770 v.reset(OpEq8)
10771 v.AddArg2(x, c)
10772 return true
10773 }
10774
10775
10776 for {
10777 c := v_0
10778 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != math.MaxInt8 {
10779 break
10780 }
10781 x := v_1
10782 v.reset(OpEq8)
10783 v.AddArg2(x, c)
10784 return true
10785 }
10786 return false
10787 }
10788 func rewriteValuegeneric_OpLeq8U(v *Value) bool {
10789 v_1 := v.Args[1]
10790 v_0 := v.Args[0]
10791 b := v.Block
10792
10793
10794 for {
10795 if v_0.Op != OpConst8 {
10796 break
10797 }
10798 c := auxIntToInt8(v_0.AuxInt)
10799 if v_1.Op != OpConst8 {
10800 break
10801 }
10802 d := auxIntToInt8(v_1.AuxInt)
10803 v.reset(OpConstBool)
10804 v.AuxInt = boolToAuxInt(uint8(c) <= uint8(d))
10805 return true
10806 }
10807
10808
10809 for {
10810 if v_0.Op != OpConst8 {
10811 break
10812 }
10813 t := v_0.Type
10814 if auxIntToInt8(v_0.AuxInt) != 1 {
10815 break
10816 }
10817 x := v_1
10818 v.reset(OpNeq8)
10819 v0 := b.NewValue0(v.Pos, OpConst8, t)
10820 v0.AuxInt = int8ToAuxInt(0)
10821 v.AddArg2(v0, x)
10822 return true
10823 }
10824
10825
10826 for {
10827 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
10828 break
10829 }
10830 v.reset(OpConstBool)
10831 v.AuxInt = boolToAuxInt(true)
10832 return true
10833 }
10834
10835
10836 for {
10837 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != -1 {
10838 break
10839 }
10840 v.reset(OpConstBool)
10841 v.AuxInt = boolToAuxInt(true)
10842 return true
10843 }
10844
10845
10846 for {
10847 x := v_0
10848 c := v_1
10849 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != 0 {
10850 break
10851 }
10852 v.reset(OpEq8)
10853 v.AddArg2(x, c)
10854 return true
10855 }
10856
10857
10858 for {
10859 c := v_0
10860 if c.Op != OpConst8 || auxIntToInt8(c.AuxInt) != -1 {
10861 break
10862 }
10863 x := v_1
10864 v.reset(OpEq8)
10865 v.AddArg2(x, c)
10866 return true
10867 }
10868 return false
10869 }
10870 func rewriteValuegeneric_OpLess16(v *Value) bool {
10871 v_1 := v.Args[1]
10872 v_0 := v.Args[0]
10873 b := v.Block
10874
10875
10876 for {
10877 if v_0.Op != OpConst16 {
10878 break
10879 }
10880 c := auxIntToInt16(v_0.AuxInt)
10881 if v_1.Op != OpConst16 {
10882 break
10883 }
10884 d := auxIntToInt16(v_1.AuxInt)
10885 v.reset(OpConstBool)
10886 v.AuxInt = boolToAuxInt(c < d)
10887 return true
10888 }
10889
10890
10891
10892 for {
10893 if v_0.Op != OpConst16 {
10894 break
10895 }
10896 t := v_0.Type
10897 if auxIntToInt16(v_0.AuxInt) != 0 {
10898 break
10899 }
10900 x := v_1
10901 if !(isNonNegative(x)) {
10902 break
10903 }
10904 v.reset(OpNeq16)
10905 v0 := b.NewValue0(v.Pos, OpConst16, t)
10906 v0.AuxInt = int16ToAuxInt(0)
10907 v.AddArg2(v0, x)
10908 return true
10909 }
10910
10911
10912
10913 for {
10914 x := v_0
10915 if v_1.Op != OpConst16 {
10916 break
10917 }
10918 t := v_1.Type
10919 if auxIntToInt16(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
10920 break
10921 }
10922 v.reset(OpEq16)
10923 v0 := b.NewValue0(v.Pos, OpConst16, t)
10924 v0.AuxInt = int16ToAuxInt(0)
10925 v.AddArg2(v0, x)
10926 return true
10927 }
10928
10929
10930 for {
10931 x := v_0
10932 if v_1.Op != OpConst16 {
10933 break
10934 }
10935 t := v_1.Type
10936 if auxIntToInt16(v_1.AuxInt) != 1 {
10937 break
10938 }
10939 v.reset(OpLeq16)
10940 v0 := b.NewValue0(v.Pos, OpConst16, t)
10941 v0.AuxInt = int16ToAuxInt(0)
10942 v.AddArg2(x, v0)
10943 return true
10944 }
10945
10946
10947 for {
10948 if v_0.Op != OpConst16 {
10949 break
10950 }
10951 t := v_0.Type
10952 if auxIntToInt16(v_0.AuxInt) != -1 {
10953 break
10954 }
10955 x := v_1
10956 v.reset(OpLeq16)
10957 v0 := b.NewValue0(v.Pos, OpConst16, t)
10958 v0.AuxInt = int16ToAuxInt(0)
10959 v.AddArg2(v0, x)
10960 return true
10961 }
10962
10963
10964 for {
10965 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != math.MinInt16 {
10966 break
10967 }
10968 v.reset(OpConstBool)
10969 v.AuxInt = boolToAuxInt(false)
10970 return true
10971 }
10972
10973
10974 for {
10975 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != math.MaxInt16 {
10976 break
10977 }
10978 v.reset(OpConstBool)
10979 v.AuxInt = boolToAuxInt(false)
10980 return true
10981 }
10982
10983
10984 for {
10985 x := v_0
10986 if v_1.Op != OpConst16 {
10987 break
10988 }
10989 t := v_1.Type
10990 if auxIntToInt16(v_1.AuxInt) != math.MinInt16+1 {
10991 break
10992 }
10993 v.reset(OpEq16)
10994 v0 := b.NewValue0(v.Pos, OpConst16, t)
10995 v0.AuxInt = int16ToAuxInt(math.MinInt16)
10996 v.AddArg2(x, v0)
10997 return true
10998 }
10999
11000
11001 for {
11002 if v_0.Op != OpConst16 {
11003 break
11004 }
11005 t := v_0.Type
11006 if auxIntToInt16(v_0.AuxInt) != math.MaxInt16-1 {
11007 break
11008 }
11009 x := v_1
11010 v.reset(OpEq16)
11011 v0 := b.NewValue0(v.Pos, OpConst16, t)
11012 v0.AuxInt = int16ToAuxInt(math.MaxInt16)
11013 v.AddArg2(x, v0)
11014 return true
11015 }
11016 return false
11017 }
11018 func rewriteValuegeneric_OpLess16U(v *Value) bool {
11019 v_1 := v.Args[1]
11020 v_0 := v.Args[0]
11021 b := v.Block
11022
11023
11024 for {
11025 if v_0.Op != OpConst16 {
11026 break
11027 }
11028 c := auxIntToInt16(v_0.AuxInt)
11029 if v_1.Op != OpConst16 {
11030 break
11031 }
11032 d := auxIntToInt16(v_1.AuxInt)
11033 v.reset(OpConstBool)
11034 v.AuxInt = boolToAuxInt(uint16(c) < uint16(d))
11035 return true
11036 }
11037
11038
11039 for {
11040 x := v_0
11041 if v_1.Op != OpConst16 {
11042 break
11043 }
11044 t := v_1.Type
11045 if auxIntToInt16(v_1.AuxInt) != 1 {
11046 break
11047 }
11048 v.reset(OpEq16)
11049 v0 := b.NewValue0(v.Pos, OpConst16, t)
11050 v0.AuxInt = int16ToAuxInt(0)
11051 v.AddArg2(v0, x)
11052 return true
11053 }
11054
11055
11056 for {
11057 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
11058 break
11059 }
11060 v.reset(OpConstBool)
11061 v.AuxInt = boolToAuxInt(false)
11062 return true
11063 }
11064
11065
11066 for {
11067 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
11068 break
11069 }
11070 v.reset(OpConstBool)
11071 v.AuxInt = boolToAuxInt(false)
11072 return true
11073 }
11074
11075
11076 for {
11077 x := v_0
11078 if v_1.Op != OpConst16 {
11079 break
11080 }
11081 t := v_1.Type
11082 if auxIntToInt16(v_1.AuxInt) != 1 {
11083 break
11084 }
11085 v.reset(OpEq16)
11086 v0 := b.NewValue0(v.Pos, OpConst16, t)
11087 v0.AuxInt = int16ToAuxInt(0)
11088 v.AddArg2(x, v0)
11089 return true
11090 }
11091
11092
11093 for {
11094 if v_0.Op != OpConst16 {
11095 break
11096 }
11097 t := v_0.Type
11098 if auxIntToInt16(v_0.AuxInt) != -2 {
11099 break
11100 }
11101 x := v_1
11102 v.reset(OpEq16)
11103 v0 := b.NewValue0(v.Pos, OpConst16, t)
11104 v0.AuxInt = int16ToAuxInt(-1)
11105 v.AddArg2(x, v0)
11106 return true
11107 }
11108 return false
11109 }
11110 func rewriteValuegeneric_OpLess32(v *Value) bool {
11111 v_1 := v.Args[1]
11112 v_0 := v.Args[0]
11113 b := v.Block
11114
11115
11116 for {
11117 if v_0.Op != OpConst32 {
11118 break
11119 }
11120 c := auxIntToInt32(v_0.AuxInt)
11121 if v_1.Op != OpConst32 {
11122 break
11123 }
11124 d := auxIntToInt32(v_1.AuxInt)
11125 v.reset(OpConstBool)
11126 v.AuxInt = boolToAuxInt(c < d)
11127 return true
11128 }
11129
11130
11131
11132 for {
11133 if v_0.Op != OpConst32 {
11134 break
11135 }
11136 t := v_0.Type
11137 if auxIntToInt32(v_0.AuxInt) != 0 {
11138 break
11139 }
11140 x := v_1
11141 if !(isNonNegative(x)) {
11142 break
11143 }
11144 v.reset(OpNeq32)
11145 v0 := b.NewValue0(v.Pos, OpConst32, t)
11146 v0.AuxInt = int32ToAuxInt(0)
11147 v.AddArg2(v0, x)
11148 return true
11149 }
11150
11151
11152
11153 for {
11154 x := v_0
11155 if v_1.Op != OpConst32 {
11156 break
11157 }
11158 t := v_1.Type
11159 if auxIntToInt32(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
11160 break
11161 }
11162 v.reset(OpEq32)
11163 v0 := b.NewValue0(v.Pos, OpConst32, t)
11164 v0.AuxInt = int32ToAuxInt(0)
11165 v.AddArg2(v0, x)
11166 return true
11167 }
11168
11169
11170 for {
11171 x := v_0
11172 if v_1.Op != OpConst32 {
11173 break
11174 }
11175 t := v_1.Type
11176 if auxIntToInt32(v_1.AuxInt) != 1 {
11177 break
11178 }
11179 v.reset(OpLeq32)
11180 v0 := b.NewValue0(v.Pos, OpConst32, t)
11181 v0.AuxInt = int32ToAuxInt(0)
11182 v.AddArg2(x, v0)
11183 return true
11184 }
11185
11186
11187 for {
11188 if v_0.Op != OpConst32 {
11189 break
11190 }
11191 t := v_0.Type
11192 if auxIntToInt32(v_0.AuxInt) != -1 {
11193 break
11194 }
11195 x := v_1
11196 v.reset(OpLeq32)
11197 v0 := b.NewValue0(v.Pos, OpConst32, t)
11198 v0.AuxInt = int32ToAuxInt(0)
11199 v.AddArg2(v0, x)
11200 return true
11201 }
11202
11203
11204 for {
11205 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != math.MinInt32 {
11206 break
11207 }
11208 v.reset(OpConstBool)
11209 v.AuxInt = boolToAuxInt(false)
11210 return true
11211 }
11212
11213
11214 for {
11215 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != math.MaxInt32 {
11216 break
11217 }
11218 v.reset(OpConstBool)
11219 v.AuxInt = boolToAuxInt(false)
11220 return true
11221 }
11222
11223
11224 for {
11225 x := v_0
11226 if v_1.Op != OpConst32 {
11227 break
11228 }
11229 t := v_1.Type
11230 if auxIntToInt32(v_1.AuxInt) != math.MinInt32+1 {
11231 break
11232 }
11233 v.reset(OpEq32)
11234 v0 := b.NewValue0(v.Pos, OpConst32, t)
11235 v0.AuxInt = int32ToAuxInt(math.MinInt32)
11236 v.AddArg2(x, v0)
11237 return true
11238 }
11239
11240
11241 for {
11242 if v_0.Op != OpConst32 {
11243 break
11244 }
11245 t := v_0.Type
11246 if auxIntToInt32(v_0.AuxInt) != math.MaxInt32-1 {
11247 break
11248 }
11249 x := v_1
11250 v.reset(OpEq32)
11251 v0 := b.NewValue0(v.Pos, OpConst32, t)
11252 v0.AuxInt = int32ToAuxInt(math.MaxInt32)
11253 v.AddArg2(x, v0)
11254 return true
11255 }
11256 return false
11257 }
11258 func rewriteValuegeneric_OpLess32F(v *Value) bool {
11259 v_1 := v.Args[1]
11260 v_0 := v.Args[0]
11261
11262
11263 for {
11264 if v_0.Op != OpConst32F {
11265 break
11266 }
11267 c := auxIntToFloat32(v_0.AuxInt)
11268 if v_1.Op != OpConst32F {
11269 break
11270 }
11271 d := auxIntToFloat32(v_1.AuxInt)
11272 v.reset(OpConstBool)
11273 v.AuxInt = boolToAuxInt(c < d)
11274 return true
11275 }
11276 return false
11277 }
11278 func rewriteValuegeneric_OpLess32U(v *Value) bool {
11279 v_1 := v.Args[1]
11280 v_0 := v.Args[0]
11281 b := v.Block
11282
11283
11284 for {
11285 if v_0.Op != OpConst32 {
11286 break
11287 }
11288 c := auxIntToInt32(v_0.AuxInt)
11289 if v_1.Op != OpConst32 {
11290 break
11291 }
11292 d := auxIntToInt32(v_1.AuxInt)
11293 v.reset(OpConstBool)
11294 v.AuxInt = boolToAuxInt(uint32(c) < uint32(d))
11295 return true
11296 }
11297
11298
11299 for {
11300 x := v_0
11301 if v_1.Op != OpConst32 {
11302 break
11303 }
11304 t := v_1.Type
11305 if auxIntToInt32(v_1.AuxInt) != 1 {
11306 break
11307 }
11308 v.reset(OpEq32)
11309 v0 := b.NewValue0(v.Pos, OpConst32, t)
11310 v0.AuxInt = int32ToAuxInt(0)
11311 v.AddArg2(v0, x)
11312 return true
11313 }
11314
11315
11316 for {
11317 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
11318 break
11319 }
11320 v.reset(OpConstBool)
11321 v.AuxInt = boolToAuxInt(false)
11322 return true
11323 }
11324
11325
11326 for {
11327 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
11328 break
11329 }
11330 v.reset(OpConstBool)
11331 v.AuxInt = boolToAuxInt(false)
11332 return true
11333 }
11334
11335
11336 for {
11337 x := v_0
11338 if v_1.Op != OpConst32 {
11339 break
11340 }
11341 t := v_1.Type
11342 if auxIntToInt32(v_1.AuxInt) != 1 {
11343 break
11344 }
11345 v.reset(OpEq32)
11346 v0 := b.NewValue0(v.Pos, OpConst32, t)
11347 v0.AuxInt = int32ToAuxInt(0)
11348 v.AddArg2(x, v0)
11349 return true
11350 }
11351
11352
11353 for {
11354 if v_0.Op != OpConst32 {
11355 break
11356 }
11357 t := v_0.Type
11358 if auxIntToInt32(v_0.AuxInt) != -2 {
11359 break
11360 }
11361 x := v_1
11362 v.reset(OpEq32)
11363 v0 := b.NewValue0(v.Pos, OpConst32, t)
11364 v0.AuxInt = int32ToAuxInt(-1)
11365 v.AddArg2(x, v0)
11366 return true
11367 }
11368 return false
11369 }
11370 func rewriteValuegeneric_OpLess64(v *Value) bool {
11371 v_1 := v.Args[1]
11372 v_0 := v.Args[0]
11373 b := v.Block
11374
11375
11376 for {
11377 if v_0.Op != OpConst64 {
11378 break
11379 }
11380 c := auxIntToInt64(v_0.AuxInt)
11381 if v_1.Op != OpConst64 {
11382 break
11383 }
11384 d := auxIntToInt64(v_1.AuxInt)
11385 v.reset(OpConstBool)
11386 v.AuxInt = boolToAuxInt(c < d)
11387 return true
11388 }
11389
11390
11391
11392 for {
11393 if v_0.Op != OpConst64 {
11394 break
11395 }
11396 t := v_0.Type
11397 if auxIntToInt64(v_0.AuxInt) != 0 {
11398 break
11399 }
11400 x := v_1
11401 if !(isNonNegative(x)) {
11402 break
11403 }
11404 v.reset(OpNeq64)
11405 v0 := b.NewValue0(v.Pos, OpConst64, t)
11406 v0.AuxInt = int64ToAuxInt(0)
11407 v.AddArg2(v0, x)
11408 return true
11409 }
11410
11411
11412
11413 for {
11414 x := v_0
11415 if v_1.Op != OpConst64 {
11416 break
11417 }
11418 t := v_1.Type
11419 if auxIntToInt64(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
11420 break
11421 }
11422 v.reset(OpEq64)
11423 v0 := b.NewValue0(v.Pos, OpConst64, t)
11424 v0.AuxInt = int64ToAuxInt(0)
11425 v.AddArg2(v0, x)
11426 return true
11427 }
11428
11429
11430 for {
11431 x := v_0
11432 if v_1.Op != OpConst64 {
11433 break
11434 }
11435 t := v_1.Type
11436 if auxIntToInt64(v_1.AuxInt) != 1 {
11437 break
11438 }
11439 v.reset(OpLeq64)
11440 v0 := b.NewValue0(v.Pos, OpConst64, t)
11441 v0.AuxInt = int64ToAuxInt(0)
11442 v.AddArg2(x, v0)
11443 return true
11444 }
11445
11446
11447 for {
11448 if v_0.Op != OpConst64 {
11449 break
11450 }
11451 t := v_0.Type
11452 if auxIntToInt64(v_0.AuxInt) != -1 {
11453 break
11454 }
11455 x := v_1
11456 v.reset(OpLeq64)
11457 v0 := b.NewValue0(v.Pos, OpConst64, t)
11458 v0.AuxInt = int64ToAuxInt(0)
11459 v.AddArg2(v0, x)
11460 return true
11461 }
11462
11463
11464 for {
11465 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != math.MinInt64 {
11466 break
11467 }
11468 v.reset(OpConstBool)
11469 v.AuxInt = boolToAuxInt(false)
11470 return true
11471 }
11472
11473
11474 for {
11475 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != math.MaxInt64 {
11476 break
11477 }
11478 v.reset(OpConstBool)
11479 v.AuxInt = boolToAuxInt(false)
11480 return true
11481 }
11482
11483
11484 for {
11485 x := v_0
11486 if v_1.Op != OpConst64 {
11487 break
11488 }
11489 t := v_1.Type
11490 if auxIntToInt64(v_1.AuxInt) != math.MinInt64+1 {
11491 break
11492 }
11493 v.reset(OpEq64)
11494 v0 := b.NewValue0(v.Pos, OpConst64, t)
11495 v0.AuxInt = int64ToAuxInt(math.MinInt64)
11496 v.AddArg2(x, v0)
11497 return true
11498 }
11499
11500
11501 for {
11502 if v_0.Op != OpConst64 {
11503 break
11504 }
11505 t := v_0.Type
11506 if auxIntToInt64(v_0.AuxInt) != math.MaxInt64-1 {
11507 break
11508 }
11509 x := v_1
11510 v.reset(OpEq64)
11511 v0 := b.NewValue0(v.Pos, OpConst64, t)
11512 v0.AuxInt = int64ToAuxInt(math.MaxInt64)
11513 v.AddArg2(x, v0)
11514 return true
11515 }
11516 return false
11517 }
11518 func rewriteValuegeneric_OpLess64F(v *Value) bool {
11519 v_1 := v.Args[1]
11520 v_0 := v.Args[0]
11521
11522
11523 for {
11524 if v_0.Op != OpConst64F {
11525 break
11526 }
11527 c := auxIntToFloat64(v_0.AuxInt)
11528 if v_1.Op != OpConst64F {
11529 break
11530 }
11531 d := auxIntToFloat64(v_1.AuxInt)
11532 v.reset(OpConstBool)
11533 v.AuxInt = boolToAuxInt(c < d)
11534 return true
11535 }
11536 return false
11537 }
11538 func rewriteValuegeneric_OpLess64U(v *Value) bool {
11539 v_1 := v.Args[1]
11540 v_0 := v.Args[0]
11541 b := v.Block
11542
11543
11544 for {
11545 if v_0.Op != OpConst64 {
11546 break
11547 }
11548 c := auxIntToInt64(v_0.AuxInt)
11549 if v_1.Op != OpConst64 {
11550 break
11551 }
11552 d := auxIntToInt64(v_1.AuxInt)
11553 v.reset(OpConstBool)
11554 v.AuxInt = boolToAuxInt(uint64(c) < uint64(d))
11555 return true
11556 }
11557
11558
11559 for {
11560 x := v_0
11561 if v_1.Op != OpConst64 {
11562 break
11563 }
11564 t := v_1.Type
11565 if auxIntToInt64(v_1.AuxInt) != 1 {
11566 break
11567 }
11568 v.reset(OpEq64)
11569 v0 := b.NewValue0(v.Pos, OpConst64, t)
11570 v0.AuxInt = int64ToAuxInt(0)
11571 v.AddArg2(v0, x)
11572 return true
11573 }
11574
11575
11576 for {
11577 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
11578 break
11579 }
11580 v.reset(OpConstBool)
11581 v.AuxInt = boolToAuxInt(false)
11582 return true
11583 }
11584
11585
11586 for {
11587 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
11588 break
11589 }
11590 v.reset(OpConstBool)
11591 v.AuxInt = boolToAuxInt(false)
11592 return true
11593 }
11594
11595
11596 for {
11597 x := v_0
11598 if v_1.Op != OpConst64 {
11599 break
11600 }
11601 t := v_1.Type
11602 if auxIntToInt64(v_1.AuxInt) != 1 {
11603 break
11604 }
11605 v.reset(OpEq64)
11606 v0 := b.NewValue0(v.Pos, OpConst64, t)
11607 v0.AuxInt = int64ToAuxInt(0)
11608 v.AddArg2(x, v0)
11609 return true
11610 }
11611
11612
11613 for {
11614 if v_0.Op != OpConst64 {
11615 break
11616 }
11617 t := v_0.Type
11618 if auxIntToInt64(v_0.AuxInt) != -2 {
11619 break
11620 }
11621 x := v_1
11622 v.reset(OpEq64)
11623 v0 := b.NewValue0(v.Pos, OpConst64, t)
11624 v0.AuxInt = int64ToAuxInt(-1)
11625 v.AddArg2(x, v0)
11626 return true
11627 }
11628 return false
11629 }
11630 func rewriteValuegeneric_OpLess8(v *Value) bool {
11631 v_1 := v.Args[1]
11632 v_0 := v.Args[0]
11633 b := v.Block
11634
11635
11636 for {
11637 if v_0.Op != OpConst8 {
11638 break
11639 }
11640 c := auxIntToInt8(v_0.AuxInt)
11641 if v_1.Op != OpConst8 {
11642 break
11643 }
11644 d := auxIntToInt8(v_1.AuxInt)
11645 v.reset(OpConstBool)
11646 v.AuxInt = boolToAuxInt(c < d)
11647 return true
11648 }
11649
11650
11651
11652 for {
11653 if v_0.Op != OpConst8 {
11654 break
11655 }
11656 t := v_0.Type
11657 if auxIntToInt8(v_0.AuxInt) != 0 {
11658 break
11659 }
11660 x := v_1
11661 if !(isNonNegative(x)) {
11662 break
11663 }
11664 v.reset(OpNeq8)
11665 v0 := b.NewValue0(v.Pos, OpConst8, t)
11666 v0.AuxInt = int8ToAuxInt(0)
11667 v.AddArg2(v0, x)
11668 return true
11669 }
11670
11671
11672
11673 for {
11674 x := v_0
11675 if v_1.Op != OpConst8 {
11676 break
11677 }
11678 t := v_1.Type
11679 if auxIntToInt8(v_1.AuxInt) != 1 || !(isNonNegative(x)) {
11680 break
11681 }
11682 v.reset(OpEq8)
11683 v0 := b.NewValue0(v.Pos, OpConst8, t)
11684 v0.AuxInt = int8ToAuxInt(0)
11685 v.AddArg2(v0, x)
11686 return true
11687 }
11688
11689
11690 for {
11691 x := v_0
11692 if v_1.Op != OpConst8 {
11693 break
11694 }
11695 t := v_1.Type
11696 if auxIntToInt8(v_1.AuxInt) != 1 {
11697 break
11698 }
11699 v.reset(OpLeq8)
11700 v0 := b.NewValue0(v.Pos, OpConst8, t)
11701 v0.AuxInt = int8ToAuxInt(0)
11702 v.AddArg2(x, v0)
11703 return true
11704 }
11705
11706
11707 for {
11708 if v_0.Op != OpConst8 {
11709 break
11710 }
11711 t := v_0.Type
11712 if auxIntToInt8(v_0.AuxInt) != -1 {
11713 break
11714 }
11715 x := v_1
11716 v.reset(OpLeq8)
11717 v0 := b.NewValue0(v.Pos, OpConst8, t)
11718 v0.AuxInt = int8ToAuxInt(0)
11719 v.AddArg2(v0, x)
11720 return true
11721 }
11722
11723
11724 for {
11725 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != math.MinInt8 {
11726 break
11727 }
11728 v.reset(OpConstBool)
11729 v.AuxInt = boolToAuxInt(false)
11730 return true
11731 }
11732
11733
11734 for {
11735 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != math.MaxInt8 {
11736 break
11737 }
11738 v.reset(OpConstBool)
11739 v.AuxInt = boolToAuxInt(false)
11740 return true
11741 }
11742
11743
11744 for {
11745 x := v_0
11746 if v_1.Op != OpConst8 {
11747 break
11748 }
11749 t := v_1.Type
11750 if auxIntToInt8(v_1.AuxInt) != math.MinInt8+1 {
11751 break
11752 }
11753 v.reset(OpEq8)
11754 v0 := b.NewValue0(v.Pos, OpConst8, t)
11755 v0.AuxInt = int8ToAuxInt(math.MinInt8)
11756 v.AddArg2(x, v0)
11757 return true
11758 }
11759
11760
11761 for {
11762 if v_0.Op != OpConst8 {
11763 break
11764 }
11765 t := v_0.Type
11766 if auxIntToInt8(v_0.AuxInt) != math.MaxInt8-1 {
11767 break
11768 }
11769 x := v_1
11770 v.reset(OpEq8)
11771 v0 := b.NewValue0(v.Pos, OpConst8, t)
11772 v0.AuxInt = int8ToAuxInt(math.MaxInt8)
11773 v.AddArg2(x, v0)
11774 return true
11775 }
11776 return false
11777 }
11778 func rewriteValuegeneric_OpLess8U(v *Value) bool {
11779 v_1 := v.Args[1]
11780 v_0 := v.Args[0]
11781 b := v.Block
11782
11783
11784 for {
11785 if v_0.Op != OpConst8 {
11786 break
11787 }
11788 c := auxIntToInt8(v_0.AuxInt)
11789 if v_1.Op != OpConst8 {
11790 break
11791 }
11792 d := auxIntToInt8(v_1.AuxInt)
11793 v.reset(OpConstBool)
11794 v.AuxInt = boolToAuxInt(uint8(c) < uint8(d))
11795 return true
11796 }
11797
11798
11799 for {
11800 x := v_0
11801 if v_1.Op != OpConst8 {
11802 break
11803 }
11804 t := v_1.Type
11805 if auxIntToInt8(v_1.AuxInt) != 1 {
11806 break
11807 }
11808 v.reset(OpEq8)
11809 v0 := b.NewValue0(v.Pos, OpConst8, t)
11810 v0.AuxInt = int8ToAuxInt(0)
11811 v.AddArg2(v0, x)
11812 return true
11813 }
11814
11815
11816 for {
11817 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
11818 break
11819 }
11820 v.reset(OpConstBool)
11821 v.AuxInt = boolToAuxInt(false)
11822 return true
11823 }
11824
11825
11826 for {
11827 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
11828 break
11829 }
11830 v.reset(OpConstBool)
11831 v.AuxInt = boolToAuxInt(false)
11832 return true
11833 }
11834
11835
11836 for {
11837 x := v_0
11838 if v_1.Op != OpConst8 {
11839 break
11840 }
11841 t := v_1.Type
11842 if auxIntToInt8(v_1.AuxInt) != 1 {
11843 break
11844 }
11845 v.reset(OpEq8)
11846 v0 := b.NewValue0(v.Pos, OpConst8, t)
11847 v0.AuxInt = int8ToAuxInt(0)
11848 v.AddArg2(x, v0)
11849 return true
11850 }
11851
11852
11853 for {
11854 if v_0.Op != OpConst8 {
11855 break
11856 }
11857 t := v_0.Type
11858 if auxIntToInt8(v_0.AuxInt) != -2 {
11859 break
11860 }
11861 x := v_1
11862 v.reset(OpEq8)
11863 v0 := b.NewValue0(v.Pos, OpConst8, t)
11864 v0.AuxInt = int8ToAuxInt(-1)
11865 v.AddArg2(x, v0)
11866 return true
11867 }
11868 return false
11869 }
11870 func rewriteValuegeneric_OpLoad(v *Value) bool {
11871 v_1 := v.Args[1]
11872 v_0 := v.Args[0]
11873 b := v.Block
11874 config := b.Func.Config
11875 typ := &b.Func.Config.Types
11876
11877
11878
11879 for {
11880 t1 := v.Type
11881 p1 := v_0
11882 if v_1.Op != OpStore {
11883 break
11884 }
11885 t2 := auxToType(v_1.Aux)
11886 x := v_1.Args[1]
11887 p2 := v_1.Args[0]
11888 if !(isSamePtr(p1, p2) && copyCompatibleType(t1, x.Type) && t1.Size() == t2.Size()) {
11889 break
11890 }
11891 v.copyOf(x)
11892 return true
11893 }
11894
11895
11896
11897 for {
11898 t1 := v.Type
11899 p1 := v_0
11900 if v_1.Op != OpStore {
11901 break
11902 }
11903 t2 := auxToType(v_1.Aux)
11904 _ = v_1.Args[2]
11905 p2 := v_1.Args[0]
11906 v_1_2 := v_1.Args[2]
11907 if v_1_2.Op != OpStore {
11908 break
11909 }
11910 t3 := auxToType(v_1_2.Aux)
11911 x := v_1_2.Args[1]
11912 p3 := v_1_2.Args[0]
11913 if !(isSamePtr(p1, p3) && copyCompatibleType(t1, x.Type) && t1.Size() == t3.Size() && disjoint(p3, t3.Size(), p2, t2.Size())) {
11914 break
11915 }
11916 v.copyOf(x)
11917 return true
11918 }
11919
11920
11921
11922 for {
11923 t1 := v.Type
11924 p1 := v_0
11925 if v_1.Op != OpStore {
11926 break
11927 }
11928 t2 := auxToType(v_1.Aux)
11929 _ = v_1.Args[2]
11930 p2 := v_1.Args[0]
11931 v_1_2 := v_1.Args[2]
11932 if v_1_2.Op != OpStore {
11933 break
11934 }
11935 t3 := auxToType(v_1_2.Aux)
11936 _ = v_1_2.Args[2]
11937 p3 := v_1_2.Args[0]
11938 v_1_2_2 := v_1_2.Args[2]
11939 if v_1_2_2.Op != OpStore {
11940 break
11941 }
11942 t4 := auxToType(v_1_2_2.Aux)
11943 x := v_1_2_2.Args[1]
11944 p4 := v_1_2_2.Args[0]
11945 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())) {
11946 break
11947 }
11948 v.copyOf(x)
11949 return true
11950 }
11951
11952
11953
11954 for {
11955 t1 := v.Type
11956 p1 := v_0
11957 if v_1.Op != OpStore {
11958 break
11959 }
11960 t2 := auxToType(v_1.Aux)
11961 _ = v_1.Args[2]
11962 p2 := v_1.Args[0]
11963 v_1_2 := v_1.Args[2]
11964 if v_1_2.Op != OpStore {
11965 break
11966 }
11967 t3 := auxToType(v_1_2.Aux)
11968 _ = v_1_2.Args[2]
11969 p3 := v_1_2.Args[0]
11970 v_1_2_2 := v_1_2.Args[2]
11971 if v_1_2_2.Op != OpStore {
11972 break
11973 }
11974 t4 := auxToType(v_1_2_2.Aux)
11975 _ = v_1_2_2.Args[2]
11976 p4 := v_1_2_2.Args[0]
11977 v_1_2_2_2 := v_1_2_2.Args[2]
11978 if v_1_2_2_2.Op != OpStore {
11979 break
11980 }
11981 t5 := auxToType(v_1_2_2_2.Aux)
11982 x := v_1_2_2_2.Args[1]
11983 p5 := v_1_2_2_2.Args[0]
11984 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())) {
11985 break
11986 }
11987 v.copyOf(x)
11988 return true
11989 }
11990
11991
11992
11993 for {
11994 t1 := v.Type
11995 p1 := v_0
11996 if v_1.Op != OpStore {
11997 break
11998 }
11999 t2 := auxToType(v_1.Aux)
12000 _ = v_1.Args[1]
12001 p2 := v_1.Args[0]
12002 v_1_1 := v_1.Args[1]
12003 if v_1_1.Op != OpConst64 {
12004 break
12005 }
12006 x := auxIntToInt64(v_1_1.AuxInt)
12007 if !(isSamePtr(p1, p2) && t2.Size() == 8 && is64BitFloat(t1) && !math.IsNaN(math.Float64frombits(uint64(x)))) {
12008 break
12009 }
12010 v.reset(OpConst64F)
12011 v.AuxInt = float64ToAuxInt(math.Float64frombits(uint64(x)))
12012 return true
12013 }
12014
12015
12016
12017 for {
12018 t1 := v.Type
12019 p1 := v_0
12020 if v_1.Op != OpStore {
12021 break
12022 }
12023 t2 := auxToType(v_1.Aux)
12024 _ = v_1.Args[1]
12025 p2 := v_1.Args[0]
12026 v_1_1 := v_1.Args[1]
12027 if v_1_1.Op != OpConst32 {
12028 break
12029 }
12030 x := auxIntToInt32(v_1_1.AuxInt)
12031 if !(isSamePtr(p1, p2) && t2.Size() == 4 && is32BitFloat(t1) && !math.IsNaN(float64(math.Float32frombits(uint32(x))))) {
12032 break
12033 }
12034 v.reset(OpConst32F)
12035 v.AuxInt = float32ToAuxInt(math.Float32frombits(uint32(x)))
12036 return true
12037 }
12038
12039
12040
12041 for {
12042 t1 := v.Type
12043 p1 := v_0
12044 if v_1.Op != OpStore {
12045 break
12046 }
12047 t2 := auxToType(v_1.Aux)
12048 _ = v_1.Args[1]
12049 p2 := v_1.Args[0]
12050 v_1_1 := v_1.Args[1]
12051 if v_1_1.Op != OpConst64F {
12052 break
12053 }
12054 x := auxIntToFloat64(v_1_1.AuxInt)
12055 if !(isSamePtr(p1, p2) && t2.Size() == 8 && is64BitInt(t1)) {
12056 break
12057 }
12058 v.reset(OpConst64)
12059 v.AuxInt = int64ToAuxInt(int64(math.Float64bits(x)))
12060 return true
12061 }
12062
12063
12064
12065 for {
12066 t1 := v.Type
12067 p1 := v_0
12068 if v_1.Op != OpStore {
12069 break
12070 }
12071 t2 := auxToType(v_1.Aux)
12072 _ = v_1.Args[1]
12073 p2 := v_1.Args[0]
12074 v_1_1 := v_1.Args[1]
12075 if v_1_1.Op != OpConst32F {
12076 break
12077 }
12078 x := auxIntToFloat32(v_1_1.AuxInt)
12079 if !(isSamePtr(p1, p2) && t2.Size() == 4 && is32BitInt(t1)) {
12080 break
12081 }
12082 v.reset(OpConst32)
12083 v.AuxInt = int32ToAuxInt(int32(math.Float32bits(x)))
12084 return true
12085 }
12086
12087
12088
12089 for {
12090 t1 := v.Type
12091 op := v_0
12092 if op.Op != OpOffPtr {
12093 break
12094 }
12095 o1 := auxIntToInt64(op.AuxInt)
12096 p1 := op.Args[0]
12097 if v_1.Op != OpStore {
12098 break
12099 }
12100 t2 := auxToType(v_1.Aux)
12101 _ = v_1.Args[2]
12102 p2 := v_1.Args[0]
12103 mem := v_1.Args[2]
12104 if mem.Op != OpZero {
12105 break
12106 }
12107 n := auxIntToInt64(mem.AuxInt)
12108 p3 := mem.Args[0]
12109 if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p3) && CanSSA(t1) && disjoint(op, t1.Size(), p2, t2.Size())) {
12110 break
12111 }
12112 b = mem.Block
12113 v0 := b.NewValue0(v.Pos, OpLoad, t1)
12114 v.copyOf(v0)
12115 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
12116 v1.AuxInt = int64ToAuxInt(o1)
12117 v1.AddArg(p3)
12118 v0.AddArg2(v1, mem)
12119 return true
12120 }
12121
12122
12123
12124 for {
12125 t1 := v.Type
12126 op := v_0
12127 if op.Op != OpOffPtr {
12128 break
12129 }
12130 o1 := auxIntToInt64(op.AuxInt)
12131 p1 := op.Args[0]
12132 if v_1.Op != OpStore {
12133 break
12134 }
12135 t2 := auxToType(v_1.Aux)
12136 _ = v_1.Args[2]
12137 p2 := v_1.Args[0]
12138 v_1_2 := v_1.Args[2]
12139 if v_1_2.Op != OpStore {
12140 break
12141 }
12142 t3 := auxToType(v_1_2.Aux)
12143 _ = v_1_2.Args[2]
12144 p3 := v_1_2.Args[0]
12145 mem := v_1_2.Args[2]
12146 if mem.Op != OpZero {
12147 break
12148 }
12149 n := auxIntToInt64(mem.AuxInt)
12150 p4 := mem.Args[0]
12151 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())) {
12152 break
12153 }
12154 b = mem.Block
12155 v0 := b.NewValue0(v.Pos, OpLoad, t1)
12156 v.copyOf(v0)
12157 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
12158 v1.AuxInt = int64ToAuxInt(o1)
12159 v1.AddArg(p4)
12160 v0.AddArg2(v1, mem)
12161 return true
12162 }
12163
12164
12165
12166 for {
12167 t1 := v.Type
12168 op := v_0
12169 if op.Op != OpOffPtr {
12170 break
12171 }
12172 o1 := auxIntToInt64(op.AuxInt)
12173 p1 := op.Args[0]
12174 if v_1.Op != OpStore {
12175 break
12176 }
12177 t2 := auxToType(v_1.Aux)
12178 _ = v_1.Args[2]
12179 p2 := v_1.Args[0]
12180 v_1_2 := v_1.Args[2]
12181 if v_1_2.Op != OpStore {
12182 break
12183 }
12184 t3 := auxToType(v_1_2.Aux)
12185 _ = v_1_2.Args[2]
12186 p3 := v_1_2.Args[0]
12187 v_1_2_2 := v_1_2.Args[2]
12188 if v_1_2_2.Op != OpStore {
12189 break
12190 }
12191 t4 := auxToType(v_1_2_2.Aux)
12192 _ = v_1_2_2.Args[2]
12193 p4 := v_1_2_2.Args[0]
12194 mem := v_1_2_2.Args[2]
12195 if mem.Op != OpZero {
12196 break
12197 }
12198 n := auxIntToInt64(mem.AuxInt)
12199 p5 := mem.Args[0]
12200 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())) {
12201 break
12202 }
12203 b = mem.Block
12204 v0 := b.NewValue0(v.Pos, OpLoad, t1)
12205 v.copyOf(v0)
12206 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
12207 v1.AuxInt = int64ToAuxInt(o1)
12208 v1.AddArg(p5)
12209 v0.AddArg2(v1, mem)
12210 return true
12211 }
12212
12213
12214
12215 for {
12216 t1 := v.Type
12217 op := v_0
12218 if op.Op != OpOffPtr {
12219 break
12220 }
12221 o1 := auxIntToInt64(op.AuxInt)
12222 p1 := op.Args[0]
12223 if v_1.Op != OpStore {
12224 break
12225 }
12226 t2 := auxToType(v_1.Aux)
12227 _ = v_1.Args[2]
12228 p2 := v_1.Args[0]
12229 v_1_2 := v_1.Args[2]
12230 if v_1_2.Op != OpStore {
12231 break
12232 }
12233 t3 := auxToType(v_1_2.Aux)
12234 _ = v_1_2.Args[2]
12235 p3 := v_1_2.Args[0]
12236 v_1_2_2 := v_1_2.Args[2]
12237 if v_1_2_2.Op != OpStore {
12238 break
12239 }
12240 t4 := auxToType(v_1_2_2.Aux)
12241 _ = v_1_2_2.Args[2]
12242 p4 := v_1_2_2.Args[0]
12243 v_1_2_2_2 := v_1_2_2.Args[2]
12244 if v_1_2_2_2.Op != OpStore {
12245 break
12246 }
12247 t5 := auxToType(v_1_2_2_2.Aux)
12248 _ = v_1_2_2_2.Args[2]
12249 p5 := v_1_2_2_2.Args[0]
12250 mem := v_1_2_2_2.Args[2]
12251 if mem.Op != OpZero {
12252 break
12253 }
12254 n := auxIntToInt64(mem.AuxInt)
12255 p6 := mem.Args[0]
12256 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())) {
12257 break
12258 }
12259 b = mem.Block
12260 v0 := b.NewValue0(v.Pos, OpLoad, t1)
12261 v.copyOf(v0)
12262 v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type)
12263 v1.AuxInt = int64ToAuxInt(o1)
12264 v1.AddArg(p6)
12265 v0.AddArg2(v1, mem)
12266 return true
12267 }
12268
12269
12270
12271 for {
12272 t1 := v.Type
12273 if v_0.Op != OpOffPtr {
12274 break
12275 }
12276 o := auxIntToInt64(v_0.AuxInt)
12277 p1 := v_0.Args[0]
12278 if v_1.Op != OpZero {
12279 break
12280 }
12281 n := auxIntToInt64(v_1.AuxInt)
12282 p2 := v_1.Args[0]
12283 if !(t1.IsBoolean() && isSamePtr(p1, p2) && n >= o+1) {
12284 break
12285 }
12286 v.reset(OpConstBool)
12287 v.AuxInt = boolToAuxInt(false)
12288 return true
12289 }
12290
12291
12292
12293 for {
12294 t1 := v.Type
12295 if v_0.Op != OpOffPtr {
12296 break
12297 }
12298 o := auxIntToInt64(v_0.AuxInt)
12299 p1 := v_0.Args[0]
12300 if v_1.Op != OpZero {
12301 break
12302 }
12303 n := auxIntToInt64(v_1.AuxInt)
12304 p2 := v_1.Args[0]
12305 if !(is8BitInt(t1) && isSamePtr(p1, p2) && n >= o+1) {
12306 break
12307 }
12308 v.reset(OpConst8)
12309 v.AuxInt = int8ToAuxInt(0)
12310 return true
12311 }
12312
12313
12314
12315 for {
12316 t1 := v.Type
12317 if v_0.Op != OpOffPtr {
12318 break
12319 }
12320 o := auxIntToInt64(v_0.AuxInt)
12321 p1 := v_0.Args[0]
12322 if v_1.Op != OpZero {
12323 break
12324 }
12325 n := auxIntToInt64(v_1.AuxInt)
12326 p2 := v_1.Args[0]
12327 if !(is16BitInt(t1) && isSamePtr(p1, p2) && n >= o+2) {
12328 break
12329 }
12330 v.reset(OpConst16)
12331 v.AuxInt = int16ToAuxInt(0)
12332 return true
12333 }
12334
12335
12336
12337 for {
12338 t1 := v.Type
12339 if v_0.Op != OpOffPtr {
12340 break
12341 }
12342 o := auxIntToInt64(v_0.AuxInt)
12343 p1 := v_0.Args[0]
12344 if v_1.Op != OpZero {
12345 break
12346 }
12347 n := auxIntToInt64(v_1.AuxInt)
12348 p2 := v_1.Args[0]
12349 if !(is32BitInt(t1) && isSamePtr(p1, p2) && n >= o+4) {
12350 break
12351 }
12352 v.reset(OpConst32)
12353 v.AuxInt = int32ToAuxInt(0)
12354 return true
12355 }
12356
12357
12358
12359 for {
12360 t1 := v.Type
12361 if v_0.Op != OpOffPtr {
12362 break
12363 }
12364 o := auxIntToInt64(v_0.AuxInt)
12365 p1 := v_0.Args[0]
12366 if v_1.Op != OpZero {
12367 break
12368 }
12369 n := auxIntToInt64(v_1.AuxInt)
12370 p2 := v_1.Args[0]
12371 if !(is64BitInt(t1) && isSamePtr(p1, p2) && n >= o+8) {
12372 break
12373 }
12374 v.reset(OpConst64)
12375 v.AuxInt = int64ToAuxInt(0)
12376 return true
12377 }
12378
12379
12380
12381 for {
12382 t1 := v.Type
12383 if v_0.Op != OpOffPtr {
12384 break
12385 }
12386 o := auxIntToInt64(v_0.AuxInt)
12387 p1 := v_0.Args[0]
12388 if v_1.Op != OpZero {
12389 break
12390 }
12391 n := auxIntToInt64(v_1.AuxInt)
12392 p2 := v_1.Args[0]
12393 if !(is32BitFloat(t1) && isSamePtr(p1, p2) && n >= o+4) {
12394 break
12395 }
12396 v.reset(OpConst32F)
12397 v.AuxInt = float32ToAuxInt(0)
12398 return true
12399 }
12400
12401
12402
12403 for {
12404 t1 := v.Type
12405 if v_0.Op != OpOffPtr {
12406 break
12407 }
12408 o := auxIntToInt64(v_0.AuxInt)
12409 p1 := v_0.Args[0]
12410 if v_1.Op != OpZero {
12411 break
12412 }
12413 n := auxIntToInt64(v_1.AuxInt)
12414 p2 := v_1.Args[0]
12415 if !(is64BitFloat(t1) && isSamePtr(p1, p2) && n >= o+8) {
12416 break
12417 }
12418 v.reset(OpConst64F)
12419 v.AuxInt = float64ToAuxInt(0)
12420 return true
12421 }
12422
12423
12424
12425 for {
12426 t := v.Type
12427 if !(t.IsStruct() && CanSSA(t) && !t.IsSIMD()) {
12428 break
12429 }
12430 v.copyOf(rewriteStructLoad(v))
12431 return true
12432 }
12433
12434
12435
12436 for {
12437 t := v.Type
12438 if !(t.IsArray() && t.NumElem() == 0) {
12439 break
12440 }
12441 v.reset(OpArrayMake0)
12442 return true
12443 }
12444
12445
12446
12447 for {
12448 t := v.Type
12449 ptr := v_0
12450 mem := v_1
12451 if !(t.IsArray() && t.NumElem() == 1 && CanSSA(t)) {
12452 break
12453 }
12454 v.reset(OpArrayMake1)
12455 v0 := b.NewValue0(v.Pos, OpLoad, t.Elem())
12456 v0.AddArg2(ptr, mem)
12457 v.AddArg(v0)
12458 return true
12459 }
12460
12461
12462
12463 for {
12464 if v.Type != typ.Int8 {
12465 break
12466 }
12467 sptr := v_0
12468 if sptr.Op != OpAddr {
12469 break
12470 }
12471 scon := auxToSym(sptr.Aux)
12472 sptr_0 := sptr.Args[0]
12473 if sptr_0.Op != OpSB {
12474 break
12475 }
12476 if !(symIsRO(scon)) {
12477 break
12478 }
12479 v.reset(OpConst8)
12480 v.Type = typ.Int8
12481 v.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
12482 return true
12483 }
12484
12485
12486
12487 for {
12488 if v.Type != typ.Int16 {
12489 break
12490 }
12491 sptr := v_0
12492 if sptr.Op != OpAddr {
12493 break
12494 }
12495 scon := auxToSym(sptr.Aux)
12496 sptr_0 := sptr.Args[0]
12497 if sptr_0.Op != OpSB {
12498 break
12499 }
12500 if !(symIsRO(scon)) {
12501 break
12502 }
12503 v.reset(OpConst16)
12504 v.Type = typ.Int16
12505 v.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
12506 return true
12507 }
12508
12509
12510
12511 for {
12512 if v.Type != typ.Int32 {
12513 break
12514 }
12515 sptr := v_0
12516 if sptr.Op != OpAddr {
12517 break
12518 }
12519 scon := auxToSym(sptr.Aux)
12520 sptr_0 := sptr.Args[0]
12521 if sptr_0.Op != OpSB {
12522 break
12523 }
12524 if !(symIsRO(scon)) {
12525 break
12526 }
12527 v.reset(OpConst32)
12528 v.Type = typ.Int32
12529 v.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
12530 return true
12531 }
12532
12533
12534
12535 for {
12536 if v.Type != typ.Int64 {
12537 break
12538 }
12539 sptr := v_0
12540 if sptr.Op != OpAddr {
12541 break
12542 }
12543 scon := auxToSym(sptr.Aux)
12544 sptr_0 := sptr.Args[0]
12545 if sptr_0.Op != OpSB {
12546 break
12547 }
12548 if !(symIsRO(scon)) {
12549 break
12550 }
12551 v.reset(OpConst64)
12552 v.Type = typ.Int64
12553 v.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
12554 return true
12555 }
12556
12557
12558
12559 for {
12560 if v_0.Op != OpAddr {
12561 break
12562 }
12563 s := auxToSym(v_0.Aux)
12564 sb := v_0.Args[0]
12565 if !(isFixedLoad(v, s, 0)) {
12566 break
12567 }
12568 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
12569 return true
12570 }
12571
12572
12573
12574 for {
12575 if v_0.Op != OpConvert {
12576 break
12577 }
12578 v_0_0 := v_0.Args[0]
12579 if v_0_0.Op != OpAddr {
12580 break
12581 }
12582 s := auxToSym(v_0_0.Aux)
12583 sb := v_0_0.Args[0]
12584 if !(isFixedLoad(v, s, 0)) {
12585 break
12586 }
12587 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
12588 return true
12589 }
12590
12591
12592
12593 for {
12594 if v_0.Op != OpITab {
12595 break
12596 }
12597 v_0_0 := v_0.Args[0]
12598 if v_0_0.Op != OpIMake {
12599 break
12600 }
12601 v_0_0_0 := v_0_0.Args[0]
12602 if v_0_0_0.Op != OpAddr {
12603 break
12604 }
12605 s := auxToSym(v_0_0_0.Aux)
12606 sb := v_0_0_0.Args[0]
12607 if !(isFixedLoad(v, s, 0)) {
12608 break
12609 }
12610 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
12611 return true
12612 }
12613
12614
12615
12616 for {
12617 if v_0.Op != OpITab {
12618 break
12619 }
12620 v_0_0 := v_0.Args[0]
12621 if v_0_0.Op != OpIMake {
12622 break
12623 }
12624 v_0_0_0 := v_0_0.Args[0]
12625 if v_0_0_0.Op != OpConvert {
12626 break
12627 }
12628 v_0_0_0_0 := v_0_0_0.Args[0]
12629 if v_0_0_0_0.Op != OpAddr {
12630 break
12631 }
12632 s := auxToSym(v_0_0_0_0.Aux)
12633 sb := v_0_0_0_0.Args[0]
12634 if !(isFixedLoad(v, s, 0)) {
12635 break
12636 }
12637 v.copyOf(rewriteFixedLoad(v, s, sb, 0))
12638 return true
12639 }
12640
12641
12642
12643 for {
12644 if v_0.Op != OpOffPtr {
12645 break
12646 }
12647 off := auxIntToInt64(v_0.AuxInt)
12648 v_0_0 := v_0.Args[0]
12649 if v_0_0.Op != OpAddr {
12650 break
12651 }
12652 s := auxToSym(v_0_0.Aux)
12653 sb := v_0_0.Args[0]
12654 if !(isFixedLoad(v, s, off)) {
12655 break
12656 }
12657 v.copyOf(rewriteFixedLoad(v, s, sb, off))
12658 return true
12659 }
12660
12661
12662
12663 for {
12664 if v_0.Op != OpOffPtr {
12665 break
12666 }
12667 off := auxIntToInt64(v_0.AuxInt)
12668 v_0_0 := v_0.Args[0]
12669 if v_0_0.Op != OpConvert {
12670 break
12671 }
12672 v_0_0_0 := v_0_0.Args[0]
12673 if v_0_0_0.Op != OpAddr {
12674 break
12675 }
12676 s := auxToSym(v_0_0_0.Aux)
12677 sb := v_0_0_0.Args[0]
12678 if !(isFixedLoad(v, s, off)) {
12679 break
12680 }
12681 v.copyOf(rewriteFixedLoad(v, s, sb, off))
12682 return true
12683 }
12684
12685
12686
12687 for {
12688 if v_0.Op != OpOffPtr {
12689 break
12690 }
12691 off := auxIntToInt64(v_0.AuxInt)
12692 v_0_0 := v_0.Args[0]
12693 if v_0_0.Op != OpITab {
12694 break
12695 }
12696 v_0_0_0 := v_0_0.Args[0]
12697 if v_0_0_0.Op != OpIMake {
12698 break
12699 }
12700 v_0_0_0_0 := v_0_0_0.Args[0]
12701 if v_0_0_0_0.Op != OpAddr {
12702 break
12703 }
12704 s := auxToSym(v_0_0_0_0.Aux)
12705 sb := v_0_0_0_0.Args[0]
12706 if !(isFixedLoad(v, s, off)) {
12707 break
12708 }
12709 v.copyOf(rewriteFixedLoad(v, s, sb, off))
12710 return true
12711 }
12712
12713
12714
12715 for {
12716 if v_0.Op != OpOffPtr {
12717 break
12718 }
12719 off := auxIntToInt64(v_0.AuxInt)
12720 v_0_0 := v_0.Args[0]
12721 if v_0_0.Op != OpITab {
12722 break
12723 }
12724 v_0_0_0 := v_0_0.Args[0]
12725 if v_0_0_0.Op != OpIMake {
12726 break
12727 }
12728 v_0_0_0_0 := v_0_0_0.Args[0]
12729 if v_0_0_0_0.Op != OpConvert {
12730 break
12731 }
12732 v_0_0_0_0_0 := v_0_0_0_0.Args[0]
12733 if v_0_0_0_0_0.Op != OpAddr {
12734 break
12735 }
12736 s := auxToSym(v_0_0_0_0_0.Aux)
12737 sb := v_0_0_0_0_0.Args[0]
12738 if !(isFixedLoad(v, s, off)) {
12739 break
12740 }
12741 v.copyOf(rewriteFixedLoad(v, s, sb, off))
12742 return true
12743 }
12744 return false
12745 }
12746 func rewriteValuegeneric_OpLsh16x16(v *Value) bool {
12747 v_1 := v.Args[1]
12748 v_0 := v.Args[0]
12749 b := v.Block
12750
12751
12752 for {
12753 t := v.Type
12754 x := v_0
12755 if v_1.Op != OpConst16 {
12756 break
12757 }
12758 c := auxIntToInt16(v_1.AuxInt)
12759 v.reset(OpLsh16x64)
12760 v0 := b.NewValue0(v.Pos, OpConst64, t)
12761 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
12762 v.AddArg2(x, v0)
12763 return true
12764 }
12765
12766
12767 for {
12768 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
12769 break
12770 }
12771 v.reset(OpConst16)
12772 v.AuxInt = int16ToAuxInt(0)
12773 return true
12774 }
12775
12776
12777
12778 for {
12779 if auxIntToBool(v.AuxInt) != false {
12780 break
12781 }
12782 x := v_0
12783 con := v_1
12784 if con.Op != OpConst16 {
12785 break
12786 }
12787 c := auxIntToInt16(con.AuxInt)
12788 if !(0 < c && c < 16) {
12789 break
12790 }
12791 v.reset(OpLsh16x16)
12792 v.AuxInt = boolToAuxInt(true)
12793 v.AddArg2(x, con)
12794 return true
12795 }
12796 return false
12797 }
12798 func rewriteValuegeneric_OpLsh16x32(v *Value) bool {
12799 v_1 := v.Args[1]
12800 v_0 := v.Args[0]
12801 b := v.Block
12802
12803
12804 for {
12805 t := v.Type
12806 x := v_0
12807 if v_1.Op != OpConst32 {
12808 break
12809 }
12810 c := auxIntToInt32(v_1.AuxInt)
12811 v.reset(OpLsh16x64)
12812 v0 := b.NewValue0(v.Pos, OpConst64, t)
12813 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
12814 v.AddArg2(x, v0)
12815 return true
12816 }
12817
12818
12819 for {
12820 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
12821 break
12822 }
12823 v.reset(OpConst16)
12824 v.AuxInt = int16ToAuxInt(0)
12825 return true
12826 }
12827
12828
12829
12830 for {
12831 if auxIntToBool(v.AuxInt) != false {
12832 break
12833 }
12834 x := v_0
12835 con := v_1
12836 if con.Op != OpConst32 {
12837 break
12838 }
12839 c := auxIntToInt32(con.AuxInt)
12840 if !(0 < c && c < 16) {
12841 break
12842 }
12843 v.reset(OpLsh16x32)
12844 v.AuxInt = boolToAuxInt(true)
12845 v.AddArg2(x, con)
12846 return true
12847 }
12848 return false
12849 }
12850 func rewriteValuegeneric_OpLsh16x64(v *Value) bool {
12851 v_1 := v.Args[1]
12852 v_0 := v.Args[0]
12853 b := v.Block
12854 typ := &b.Func.Config.Types
12855
12856
12857 for {
12858 if v_0.Op != OpConst16 {
12859 break
12860 }
12861 c := auxIntToInt16(v_0.AuxInt)
12862 if v_1.Op != OpConst64 {
12863 break
12864 }
12865 d := auxIntToInt64(v_1.AuxInt)
12866 v.reset(OpConst16)
12867 v.AuxInt = int16ToAuxInt(c << uint64(d))
12868 return true
12869 }
12870
12871
12872 for {
12873 x := v_0
12874 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
12875 break
12876 }
12877 v.copyOf(x)
12878 return true
12879 }
12880
12881
12882 for {
12883 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
12884 break
12885 }
12886 v.reset(OpConst16)
12887 v.AuxInt = int16ToAuxInt(0)
12888 return true
12889 }
12890
12891
12892
12893 for {
12894 if v_1.Op != OpConst64 {
12895 break
12896 }
12897 c := auxIntToInt64(v_1.AuxInt)
12898 if !(uint64(c) >= 16) {
12899 break
12900 }
12901 v.reset(OpConst16)
12902 v.AuxInt = int16ToAuxInt(0)
12903 return true
12904 }
12905
12906
12907
12908 for {
12909 t := v.Type
12910 if v_0.Op != OpLsh16x64 {
12911 break
12912 }
12913 _ = v_0.Args[1]
12914 x := v_0.Args[0]
12915 v_0_1 := v_0.Args[1]
12916 if v_0_1.Op != OpConst64 {
12917 break
12918 }
12919 c := auxIntToInt64(v_0_1.AuxInt)
12920 if v_1.Op != OpConst64 {
12921 break
12922 }
12923 d := auxIntToInt64(v_1.AuxInt)
12924 if !(!uaddOvf(c, d)) {
12925 break
12926 }
12927 v.reset(OpLsh16x64)
12928 v0 := b.NewValue0(v.Pos, OpConst64, t)
12929 v0.AuxInt = int64ToAuxInt(c + d)
12930 v.AddArg2(x, v0)
12931 return true
12932 }
12933
12934
12935
12936 for {
12937 i := v_0
12938 if i.Op != OpRsh16x64 {
12939 break
12940 }
12941 _ = i.Args[1]
12942 x := i.Args[0]
12943 i_1 := i.Args[1]
12944 if i_1.Op != OpConst64 {
12945 break
12946 }
12947 c := auxIntToInt64(i_1.AuxInt)
12948 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
12949 break
12950 }
12951 v.reset(OpAnd16)
12952 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
12953 v0.AuxInt = int16ToAuxInt(int16(-1) << c)
12954 v.AddArg2(x, v0)
12955 return true
12956 }
12957
12958
12959
12960 for {
12961 i := v_0
12962 if i.Op != OpRsh16Ux64 {
12963 break
12964 }
12965 _ = i.Args[1]
12966 x := i.Args[0]
12967 i_1 := i.Args[1]
12968 if i_1.Op != OpConst64 {
12969 break
12970 }
12971 c := auxIntToInt64(i_1.AuxInt)
12972 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
12973 break
12974 }
12975 v.reset(OpAnd16)
12976 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
12977 v0.AuxInt = int16ToAuxInt(int16(-1) << c)
12978 v.AddArg2(x, v0)
12979 return true
12980 }
12981
12982
12983
12984 for {
12985 if v_0.Op != OpRsh16Ux64 {
12986 break
12987 }
12988 _ = v_0.Args[1]
12989 v_0_0 := v_0.Args[0]
12990 if v_0_0.Op != OpLsh16x64 {
12991 break
12992 }
12993 _ = v_0_0.Args[1]
12994 x := v_0_0.Args[0]
12995 v_0_0_1 := v_0_0.Args[1]
12996 if v_0_0_1.Op != OpConst64 {
12997 break
12998 }
12999 c1 := auxIntToInt64(v_0_0_1.AuxInt)
13000 v_0_1 := v_0.Args[1]
13001 if v_0_1.Op != OpConst64 {
13002 break
13003 }
13004 c2 := auxIntToInt64(v_0_1.AuxInt)
13005 if v_1.Op != OpConst64 {
13006 break
13007 }
13008 c3 := auxIntToInt64(v_1.AuxInt)
13009 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
13010 break
13011 }
13012 v.reset(OpLsh16x64)
13013 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
13014 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
13015 v.AddArg2(x, v0)
13016 return true
13017 }
13018
13019
13020
13021 for {
13022 if v_0.Op != OpAnd16 {
13023 break
13024 }
13025 _ = v_0.Args[1]
13026 v_0_0 := v_0.Args[0]
13027 v_0_1 := v_0.Args[1]
13028 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13029 if v_0_0.Op != OpRsh16x64 {
13030 continue
13031 }
13032 t := v_0_0.Type
13033 _ = v_0_0.Args[1]
13034 x := v_0_0.Args[0]
13035 v_0_0_1 := v_0_0.Args[1]
13036 if v_0_0_1.Op != OpConst64 {
13037 continue
13038 }
13039 t2 := v_0_0_1.Type
13040 c := auxIntToInt64(v_0_0_1.AuxInt)
13041 if v_0_1.Op != OpConst16 {
13042 continue
13043 }
13044 d := auxIntToInt16(v_0_1.AuxInt)
13045 if v_1.Op != OpConst64 {
13046 continue
13047 }
13048 e := auxIntToInt64(v_1.AuxInt)
13049 if !(c >= e) {
13050 continue
13051 }
13052 v.reset(OpAnd16)
13053 v0 := b.NewValue0(v.Pos, OpRsh16x64, t)
13054 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13055 v1.AuxInt = int64ToAuxInt(c - e)
13056 v0.AddArg2(x, v1)
13057 v2 := b.NewValue0(v.Pos, OpConst16, t)
13058 v2.AuxInt = int16ToAuxInt(d << e)
13059 v.AddArg2(v0, v2)
13060 return true
13061 }
13062 break
13063 }
13064
13065
13066
13067 for {
13068 if v_0.Op != OpAnd16 {
13069 break
13070 }
13071 _ = v_0.Args[1]
13072 v_0_0 := v_0.Args[0]
13073 v_0_1 := v_0.Args[1]
13074 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13075 if v_0_0.Op != OpRsh16Ux64 {
13076 continue
13077 }
13078 t := v_0_0.Type
13079 _ = v_0_0.Args[1]
13080 x := v_0_0.Args[0]
13081 v_0_0_1 := v_0_0.Args[1]
13082 if v_0_0_1.Op != OpConst64 {
13083 continue
13084 }
13085 t2 := v_0_0_1.Type
13086 c := auxIntToInt64(v_0_0_1.AuxInt)
13087 if v_0_1.Op != OpConst16 {
13088 continue
13089 }
13090 d := auxIntToInt16(v_0_1.AuxInt)
13091 if v_1.Op != OpConst64 {
13092 continue
13093 }
13094 e := auxIntToInt64(v_1.AuxInt)
13095 if !(c >= e) {
13096 continue
13097 }
13098 v.reset(OpAnd16)
13099 v0 := b.NewValue0(v.Pos, OpRsh16Ux64, t)
13100 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13101 v1.AuxInt = int64ToAuxInt(c - e)
13102 v0.AddArg2(x, v1)
13103 v2 := b.NewValue0(v.Pos, OpConst16, t)
13104 v2.AuxInt = int16ToAuxInt(d << e)
13105 v.AddArg2(v0, v2)
13106 return true
13107 }
13108 break
13109 }
13110
13111
13112
13113 for {
13114 if v_0.Op != OpAnd16 {
13115 break
13116 }
13117 _ = v_0.Args[1]
13118 v_0_0 := v_0.Args[0]
13119 v_0_1 := v_0.Args[1]
13120 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13121 if v_0_0.Op != OpRsh16x64 {
13122 continue
13123 }
13124 t := v_0_0.Type
13125 _ = v_0_0.Args[1]
13126 x := v_0_0.Args[0]
13127 v_0_0_1 := v_0_0.Args[1]
13128 if v_0_0_1.Op != OpConst64 {
13129 continue
13130 }
13131 t2 := v_0_0_1.Type
13132 c := auxIntToInt64(v_0_0_1.AuxInt)
13133 if v_0_1.Op != OpConst16 {
13134 continue
13135 }
13136 d := auxIntToInt16(v_0_1.AuxInt)
13137 if v_1.Op != OpConst64 {
13138 continue
13139 }
13140 e := auxIntToInt64(v_1.AuxInt)
13141 if !(c < e) {
13142 continue
13143 }
13144 v.reset(OpAnd16)
13145 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
13146 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13147 v1.AuxInt = int64ToAuxInt(e - c)
13148 v0.AddArg2(x, v1)
13149 v2 := b.NewValue0(v.Pos, OpConst16, t)
13150 v2.AuxInt = int16ToAuxInt(d << e)
13151 v.AddArg2(v0, v2)
13152 return true
13153 }
13154 break
13155 }
13156
13157
13158
13159 for {
13160 if v_0.Op != OpAnd16 {
13161 break
13162 }
13163 _ = v_0.Args[1]
13164 v_0_0 := v_0.Args[0]
13165 v_0_1 := v_0.Args[1]
13166 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13167 if v_0_0.Op != OpRsh16Ux64 {
13168 continue
13169 }
13170 t := v_0_0.Type
13171 _ = v_0_0.Args[1]
13172 x := v_0_0.Args[0]
13173 v_0_0_1 := v_0_0.Args[1]
13174 if v_0_0_1.Op != OpConst64 {
13175 continue
13176 }
13177 t2 := v_0_0_1.Type
13178 c := auxIntToInt64(v_0_0_1.AuxInt)
13179 if v_0_1.Op != OpConst16 {
13180 continue
13181 }
13182 d := auxIntToInt16(v_0_1.AuxInt)
13183 if v_1.Op != OpConst64 {
13184 continue
13185 }
13186 e := auxIntToInt64(v_1.AuxInt)
13187 if !(c < e) {
13188 continue
13189 }
13190 v.reset(OpAnd16)
13191 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
13192 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13193 v1.AuxInt = int64ToAuxInt(e - c)
13194 v0.AddArg2(x, v1)
13195 v2 := b.NewValue0(v.Pos, OpConst16, t)
13196 v2.AuxInt = int16ToAuxInt(d << e)
13197 v.AddArg2(v0, v2)
13198 return true
13199 }
13200 break
13201 }
13202
13203
13204
13205 for {
13206 if auxIntToBool(v.AuxInt) != false {
13207 break
13208 }
13209 x := v_0
13210 con := v_1
13211 if con.Op != OpConst64 {
13212 break
13213 }
13214 c := auxIntToInt64(con.AuxInt)
13215 if !(0 < c && c < 16) {
13216 break
13217 }
13218 v.reset(OpLsh16x64)
13219 v.AuxInt = boolToAuxInt(true)
13220 v.AddArg2(x, con)
13221 return true
13222 }
13223 return false
13224 }
13225 func rewriteValuegeneric_OpLsh16x8(v *Value) bool {
13226 v_1 := v.Args[1]
13227 v_0 := v.Args[0]
13228 b := v.Block
13229
13230
13231 for {
13232 t := v.Type
13233 x := v_0
13234 if v_1.Op != OpConst8 {
13235 break
13236 }
13237 c := auxIntToInt8(v_1.AuxInt)
13238 v.reset(OpLsh16x64)
13239 v0 := b.NewValue0(v.Pos, OpConst64, t)
13240 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
13241 v.AddArg2(x, v0)
13242 return true
13243 }
13244
13245
13246 for {
13247 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
13248 break
13249 }
13250 v.reset(OpConst16)
13251 v.AuxInt = int16ToAuxInt(0)
13252 return true
13253 }
13254
13255
13256
13257 for {
13258 if auxIntToBool(v.AuxInt) != false {
13259 break
13260 }
13261 x := v_0
13262 con := v_1
13263 if con.Op != OpConst8 {
13264 break
13265 }
13266 c := auxIntToInt8(con.AuxInt)
13267 if !(0 < c && c < 16) {
13268 break
13269 }
13270 v.reset(OpLsh16x8)
13271 v.AuxInt = boolToAuxInt(true)
13272 v.AddArg2(x, con)
13273 return true
13274 }
13275 return false
13276 }
13277 func rewriteValuegeneric_OpLsh32x16(v *Value) bool {
13278 v_1 := v.Args[1]
13279 v_0 := v.Args[0]
13280 b := v.Block
13281
13282
13283 for {
13284 t := v.Type
13285 x := v_0
13286 if v_1.Op != OpConst16 {
13287 break
13288 }
13289 c := auxIntToInt16(v_1.AuxInt)
13290 v.reset(OpLsh32x64)
13291 v0 := b.NewValue0(v.Pos, OpConst64, t)
13292 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
13293 v.AddArg2(x, v0)
13294 return true
13295 }
13296
13297
13298 for {
13299 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
13300 break
13301 }
13302 v.reset(OpConst32)
13303 v.AuxInt = int32ToAuxInt(0)
13304 return true
13305 }
13306
13307
13308
13309 for {
13310 if auxIntToBool(v.AuxInt) != false {
13311 break
13312 }
13313 x := v_0
13314 con := v_1
13315 if con.Op != OpConst16 {
13316 break
13317 }
13318 c := auxIntToInt16(con.AuxInt)
13319 if !(0 < c && c < 32) {
13320 break
13321 }
13322 v.reset(OpLsh32x16)
13323 v.AuxInt = boolToAuxInt(true)
13324 v.AddArg2(x, con)
13325 return true
13326 }
13327 return false
13328 }
13329 func rewriteValuegeneric_OpLsh32x32(v *Value) bool {
13330 v_1 := v.Args[1]
13331 v_0 := v.Args[0]
13332 b := v.Block
13333
13334
13335 for {
13336 t := v.Type
13337 x := v_0
13338 if v_1.Op != OpConst32 {
13339 break
13340 }
13341 c := auxIntToInt32(v_1.AuxInt)
13342 v.reset(OpLsh32x64)
13343 v0 := b.NewValue0(v.Pos, OpConst64, t)
13344 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
13345 v.AddArg2(x, v0)
13346 return true
13347 }
13348
13349
13350 for {
13351 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
13352 break
13353 }
13354 v.reset(OpConst32)
13355 v.AuxInt = int32ToAuxInt(0)
13356 return true
13357 }
13358
13359
13360
13361 for {
13362 if auxIntToBool(v.AuxInt) != false {
13363 break
13364 }
13365 x := v_0
13366 con := v_1
13367 if con.Op != OpConst32 {
13368 break
13369 }
13370 c := auxIntToInt32(con.AuxInt)
13371 if !(0 < c && c < 32) {
13372 break
13373 }
13374 v.reset(OpLsh32x32)
13375 v.AuxInt = boolToAuxInt(true)
13376 v.AddArg2(x, con)
13377 return true
13378 }
13379 return false
13380 }
13381 func rewriteValuegeneric_OpLsh32x64(v *Value) bool {
13382 v_1 := v.Args[1]
13383 v_0 := v.Args[0]
13384 b := v.Block
13385 typ := &b.Func.Config.Types
13386
13387
13388 for {
13389 if v_0.Op != OpConst32 {
13390 break
13391 }
13392 c := auxIntToInt32(v_0.AuxInt)
13393 if v_1.Op != OpConst64 {
13394 break
13395 }
13396 d := auxIntToInt64(v_1.AuxInt)
13397 v.reset(OpConst32)
13398 v.AuxInt = int32ToAuxInt(c << uint64(d))
13399 return true
13400 }
13401
13402
13403 for {
13404 x := v_0
13405 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
13406 break
13407 }
13408 v.copyOf(x)
13409 return true
13410 }
13411
13412
13413 for {
13414 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
13415 break
13416 }
13417 v.reset(OpConst32)
13418 v.AuxInt = int32ToAuxInt(0)
13419 return true
13420 }
13421
13422
13423
13424 for {
13425 if v_1.Op != OpConst64 {
13426 break
13427 }
13428 c := auxIntToInt64(v_1.AuxInt)
13429 if !(uint64(c) >= 32) {
13430 break
13431 }
13432 v.reset(OpConst32)
13433 v.AuxInt = int32ToAuxInt(0)
13434 return true
13435 }
13436
13437
13438
13439 for {
13440 t := v.Type
13441 if v_0.Op != OpLsh32x64 {
13442 break
13443 }
13444 _ = v_0.Args[1]
13445 x := v_0.Args[0]
13446 v_0_1 := v_0.Args[1]
13447 if v_0_1.Op != OpConst64 {
13448 break
13449 }
13450 c := auxIntToInt64(v_0_1.AuxInt)
13451 if v_1.Op != OpConst64 {
13452 break
13453 }
13454 d := auxIntToInt64(v_1.AuxInt)
13455 if !(!uaddOvf(c, d)) {
13456 break
13457 }
13458 v.reset(OpLsh32x64)
13459 v0 := b.NewValue0(v.Pos, OpConst64, t)
13460 v0.AuxInt = int64ToAuxInt(c + d)
13461 v.AddArg2(x, v0)
13462 return true
13463 }
13464
13465
13466
13467 for {
13468 i := v_0
13469 if i.Op != OpRsh32x64 {
13470 break
13471 }
13472 _ = i.Args[1]
13473 x := i.Args[0]
13474 i_1 := i.Args[1]
13475 if i_1.Op != OpConst64 {
13476 break
13477 }
13478 c := auxIntToInt64(i_1.AuxInt)
13479 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
13480 break
13481 }
13482 v.reset(OpAnd32)
13483 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
13484 v0.AuxInt = int32ToAuxInt(int32(-1) << c)
13485 v.AddArg2(x, v0)
13486 return true
13487 }
13488
13489
13490
13491 for {
13492 i := v_0
13493 if i.Op != OpRsh32Ux64 {
13494 break
13495 }
13496 _ = i.Args[1]
13497 x := i.Args[0]
13498 i_1 := i.Args[1]
13499 if i_1.Op != OpConst64 {
13500 break
13501 }
13502 c := auxIntToInt64(i_1.AuxInt)
13503 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
13504 break
13505 }
13506 v.reset(OpAnd32)
13507 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
13508 v0.AuxInt = int32ToAuxInt(int32(-1) << c)
13509 v.AddArg2(x, v0)
13510 return true
13511 }
13512
13513
13514
13515 for {
13516 if v_0.Op != OpRsh32Ux64 {
13517 break
13518 }
13519 _ = v_0.Args[1]
13520 v_0_0 := v_0.Args[0]
13521 if v_0_0.Op != OpLsh32x64 {
13522 break
13523 }
13524 _ = v_0_0.Args[1]
13525 x := v_0_0.Args[0]
13526 v_0_0_1 := v_0_0.Args[1]
13527 if v_0_0_1.Op != OpConst64 {
13528 break
13529 }
13530 c1 := auxIntToInt64(v_0_0_1.AuxInt)
13531 v_0_1 := v_0.Args[1]
13532 if v_0_1.Op != OpConst64 {
13533 break
13534 }
13535 c2 := auxIntToInt64(v_0_1.AuxInt)
13536 if v_1.Op != OpConst64 {
13537 break
13538 }
13539 c3 := auxIntToInt64(v_1.AuxInt)
13540 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
13541 break
13542 }
13543 v.reset(OpLsh32x64)
13544 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
13545 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
13546 v.AddArg2(x, v0)
13547 return true
13548 }
13549
13550
13551
13552 for {
13553 if v_0.Op != OpAnd32 {
13554 break
13555 }
13556 _ = v_0.Args[1]
13557 v_0_0 := v_0.Args[0]
13558 v_0_1 := v_0.Args[1]
13559 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13560 if v_0_0.Op != OpRsh32x64 {
13561 continue
13562 }
13563 t := v_0_0.Type
13564 _ = v_0_0.Args[1]
13565 x := v_0_0.Args[0]
13566 v_0_0_1 := v_0_0.Args[1]
13567 if v_0_0_1.Op != OpConst64 {
13568 continue
13569 }
13570 t2 := v_0_0_1.Type
13571 c := auxIntToInt64(v_0_0_1.AuxInt)
13572 if v_0_1.Op != OpConst32 {
13573 continue
13574 }
13575 d := auxIntToInt32(v_0_1.AuxInt)
13576 if v_1.Op != OpConst64 {
13577 continue
13578 }
13579 e := auxIntToInt64(v_1.AuxInt)
13580 if !(c >= e) {
13581 continue
13582 }
13583 v.reset(OpAnd32)
13584 v0 := b.NewValue0(v.Pos, OpRsh32x64, t)
13585 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13586 v1.AuxInt = int64ToAuxInt(c - e)
13587 v0.AddArg2(x, v1)
13588 v2 := b.NewValue0(v.Pos, OpConst32, t)
13589 v2.AuxInt = int32ToAuxInt(d << e)
13590 v.AddArg2(v0, v2)
13591 return true
13592 }
13593 break
13594 }
13595
13596
13597
13598 for {
13599 if v_0.Op != OpAnd32 {
13600 break
13601 }
13602 _ = v_0.Args[1]
13603 v_0_0 := v_0.Args[0]
13604 v_0_1 := v_0.Args[1]
13605 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13606 if v_0_0.Op != OpRsh32Ux64 {
13607 continue
13608 }
13609 t := v_0_0.Type
13610 _ = v_0_0.Args[1]
13611 x := v_0_0.Args[0]
13612 v_0_0_1 := v_0_0.Args[1]
13613 if v_0_0_1.Op != OpConst64 {
13614 continue
13615 }
13616 t2 := v_0_0_1.Type
13617 c := auxIntToInt64(v_0_0_1.AuxInt)
13618 if v_0_1.Op != OpConst32 {
13619 continue
13620 }
13621 d := auxIntToInt32(v_0_1.AuxInt)
13622 if v_1.Op != OpConst64 {
13623 continue
13624 }
13625 e := auxIntToInt64(v_1.AuxInt)
13626 if !(c >= e) {
13627 continue
13628 }
13629 v.reset(OpAnd32)
13630 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, t)
13631 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13632 v1.AuxInt = int64ToAuxInt(c - e)
13633 v0.AddArg2(x, v1)
13634 v2 := b.NewValue0(v.Pos, OpConst32, t)
13635 v2.AuxInt = int32ToAuxInt(d << e)
13636 v.AddArg2(v0, v2)
13637 return true
13638 }
13639 break
13640 }
13641
13642
13643
13644 for {
13645 if v_0.Op != OpAnd32 {
13646 break
13647 }
13648 _ = v_0.Args[1]
13649 v_0_0 := v_0.Args[0]
13650 v_0_1 := v_0.Args[1]
13651 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13652 if v_0_0.Op != OpRsh32x64 {
13653 continue
13654 }
13655 t := v_0_0.Type
13656 _ = v_0_0.Args[1]
13657 x := v_0_0.Args[0]
13658 v_0_0_1 := v_0_0.Args[1]
13659 if v_0_0_1.Op != OpConst64 {
13660 continue
13661 }
13662 t2 := v_0_0_1.Type
13663 c := auxIntToInt64(v_0_0_1.AuxInt)
13664 if v_0_1.Op != OpConst32 {
13665 continue
13666 }
13667 d := auxIntToInt32(v_0_1.AuxInt)
13668 if v_1.Op != OpConst64 {
13669 continue
13670 }
13671 e := auxIntToInt64(v_1.AuxInt)
13672 if !(c < e) {
13673 continue
13674 }
13675 v.reset(OpAnd32)
13676 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
13677 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13678 v1.AuxInt = int64ToAuxInt(e - c)
13679 v0.AddArg2(x, v1)
13680 v2 := b.NewValue0(v.Pos, OpConst32, t)
13681 v2.AuxInt = int32ToAuxInt(d << e)
13682 v.AddArg2(v0, v2)
13683 return true
13684 }
13685 break
13686 }
13687
13688
13689
13690 for {
13691 if v_0.Op != OpAnd32 {
13692 break
13693 }
13694 _ = v_0.Args[1]
13695 v_0_0 := v_0.Args[0]
13696 v_0_1 := v_0.Args[1]
13697 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
13698 if v_0_0.Op != OpRsh32Ux64 {
13699 continue
13700 }
13701 t := v_0_0.Type
13702 _ = v_0_0.Args[1]
13703 x := v_0_0.Args[0]
13704 v_0_0_1 := v_0_0.Args[1]
13705 if v_0_0_1.Op != OpConst64 {
13706 continue
13707 }
13708 t2 := v_0_0_1.Type
13709 c := auxIntToInt64(v_0_0_1.AuxInt)
13710 if v_0_1.Op != OpConst32 {
13711 continue
13712 }
13713 d := auxIntToInt32(v_0_1.AuxInt)
13714 if v_1.Op != OpConst64 {
13715 continue
13716 }
13717 e := auxIntToInt64(v_1.AuxInt)
13718 if !(c < e) {
13719 continue
13720 }
13721 v.reset(OpAnd32)
13722 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
13723 v1 := b.NewValue0(v.Pos, OpConst64, t2)
13724 v1.AuxInt = int64ToAuxInt(e - c)
13725 v0.AddArg2(x, v1)
13726 v2 := b.NewValue0(v.Pos, OpConst32, t)
13727 v2.AuxInt = int32ToAuxInt(d << e)
13728 v.AddArg2(v0, v2)
13729 return true
13730 }
13731 break
13732 }
13733
13734
13735
13736 for {
13737 if auxIntToBool(v.AuxInt) != false {
13738 break
13739 }
13740 x := v_0
13741 con := v_1
13742 if con.Op != OpConst64 {
13743 break
13744 }
13745 c := auxIntToInt64(con.AuxInt)
13746 if !(0 < c && c < 32) {
13747 break
13748 }
13749 v.reset(OpLsh32x64)
13750 v.AuxInt = boolToAuxInt(true)
13751 v.AddArg2(x, con)
13752 return true
13753 }
13754 return false
13755 }
13756 func rewriteValuegeneric_OpLsh32x8(v *Value) bool {
13757 v_1 := v.Args[1]
13758 v_0 := v.Args[0]
13759 b := v.Block
13760
13761
13762 for {
13763 t := v.Type
13764 x := v_0
13765 if v_1.Op != OpConst8 {
13766 break
13767 }
13768 c := auxIntToInt8(v_1.AuxInt)
13769 v.reset(OpLsh32x64)
13770 v0 := b.NewValue0(v.Pos, OpConst64, t)
13771 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
13772 v.AddArg2(x, v0)
13773 return true
13774 }
13775
13776
13777 for {
13778 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
13779 break
13780 }
13781 v.reset(OpConst32)
13782 v.AuxInt = int32ToAuxInt(0)
13783 return true
13784 }
13785
13786
13787
13788 for {
13789 if auxIntToBool(v.AuxInt) != false {
13790 break
13791 }
13792 x := v_0
13793 con := v_1
13794 if con.Op != OpConst8 {
13795 break
13796 }
13797 c := auxIntToInt8(con.AuxInt)
13798 if !(0 < c && c < 32) {
13799 break
13800 }
13801 v.reset(OpLsh32x8)
13802 v.AuxInt = boolToAuxInt(true)
13803 v.AddArg2(x, con)
13804 return true
13805 }
13806 return false
13807 }
13808 func rewriteValuegeneric_OpLsh64x16(v *Value) bool {
13809 v_1 := v.Args[1]
13810 v_0 := v.Args[0]
13811 b := v.Block
13812
13813
13814 for {
13815 t := v.Type
13816 x := v_0
13817 if v_1.Op != OpConst16 {
13818 break
13819 }
13820 c := auxIntToInt16(v_1.AuxInt)
13821 v.reset(OpLsh64x64)
13822 v0 := b.NewValue0(v.Pos, OpConst64, t)
13823 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
13824 v.AddArg2(x, v0)
13825 return true
13826 }
13827
13828
13829 for {
13830 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
13831 break
13832 }
13833 v.reset(OpConst64)
13834 v.AuxInt = int64ToAuxInt(0)
13835 return true
13836 }
13837
13838
13839
13840 for {
13841 if auxIntToBool(v.AuxInt) != false {
13842 break
13843 }
13844 x := v_0
13845 con := v_1
13846 if con.Op != OpConst16 {
13847 break
13848 }
13849 c := auxIntToInt16(con.AuxInt)
13850 if !(0 < c && c < 64) {
13851 break
13852 }
13853 v.reset(OpLsh64x16)
13854 v.AuxInt = boolToAuxInt(true)
13855 v.AddArg2(x, con)
13856 return true
13857 }
13858 return false
13859 }
13860 func rewriteValuegeneric_OpLsh64x32(v *Value) bool {
13861 v_1 := v.Args[1]
13862 v_0 := v.Args[0]
13863 b := v.Block
13864
13865
13866 for {
13867 t := v.Type
13868 x := v_0
13869 if v_1.Op != OpConst32 {
13870 break
13871 }
13872 c := auxIntToInt32(v_1.AuxInt)
13873 v.reset(OpLsh64x64)
13874 v0 := b.NewValue0(v.Pos, OpConst64, t)
13875 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
13876 v.AddArg2(x, v0)
13877 return true
13878 }
13879
13880
13881 for {
13882 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
13883 break
13884 }
13885 v.reset(OpConst64)
13886 v.AuxInt = int64ToAuxInt(0)
13887 return true
13888 }
13889
13890
13891
13892 for {
13893 if auxIntToBool(v.AuxInt) != false {
13894 break
13895 }
13896 x := v_0
13897 con := v_1
13898 if con.Op != OpConst32 {
13899 break
13900 }
13901 c := auxIntToInt32(con.AuxInt)
13902 if !(0 < c && c < 64) {
13903 break
13904 }
13905 v.reset(OpLsh64x32)
13906 v.AuxInt = boolToAuxInt(true)
13907 v.AddArg2(x, con)
13908 return true
13909 }
13910 return false
13911 }
13912 func rewriteValuegeneric_OpLsh64x64(v *Value) bool {
13913 v_1 := v.Args[1]
13914 v_0 := v.Args[0]
13915 b := v.Block
13916 typ := &b.Func.Config.Types
13917
13918
13919 for {
13920 if v_0.Op != OpConst64 {
13921 break
13922 }
13923 c := auxIntToInt64(v_0.AuxInt)
13924 if v_1.Op != OpConst64 {
13925 break
13926 }
13927 d := auxIntToInt64(v_1.AuxInt)
13928 v.reset(OpConst64)
13929 v.AuxInt = int64ToAuxInt(c << uint64(d))
13930 return true
13931 }
13932
13933
13934 for {
13935 x := v_0
13936 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
13937 break
13938 }
13939 v.copyOf(x)
13940 return true
13941 }
13942
13943
13944 for {
13945 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
13946 break
13947 }
13948 v.reset(OpConst64)
13949 v.AuxInt = int64ToAuxInt(0)
13950 return true
13951 }
13952
13953
13954
13955 for {
13956 if v_1.Op != OpConst64 {
13957 break
13958 }
13959 c := auxIntToInt64(v_1.AuxInt)
13960 if !(uint64(c) >= 64) {
13961 break
13962 }
13963 v.reset(OpConst64)
13964 v.AuxInt = int64ToAuxInt(0)
13965 return true
13966 }
13967
13968
13969
13970 for {
13971 t := v.Type
13972 if v_0.Op != OpLsh64x64 {
13973 break
13974 }
13975 _ = v_0.Args[1]
13976 x := v_0.Args[0]
13977 v_0_1 := v_0.Args[1]
13978 if v_0_1.Op != OpConst64 {
13979 break
13980 }
13981 c := auxIntToInt64(v_0_1.AuxInt)
13982 if v_1.Op != OpConst64 {
13983 break
13984 }
13985 d := auxIntToInt64(v_1.AuxInt)
13986 if !(!uaddOvf(c, d)) {
13987 break
13988 }
13989 v.reset(OpLsh64x64)
13990 v0 := b.NewValue0(v.Pos, OpConst64, t)
13991 v0.AuxInt = int64ToAuxInt(c + d)
13992 v.AddArg2(x, v0)
13993 return true
13994 }
13995
13996
13997
13998 for {
13999 i := v_0
14000 if i.Op != OpRsh64x64 {
14001 break
14002 }
14003 _ = i.Args[1]
14004 x := i.Args[0]
14005 i_1 := i.Args[1]
14006 if i_1.Op != OpConst64 {
14007 break
14008 }
14009 c := auxIntToInt64(i_1.AuxInt)
14010 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
14011 break
14012 }
14013 v.reset(OpAnd64)
14014 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
14015 v0.AuxInt = int64ToAuxInt(int64(-1) << c)
14016 v.AddArg2(x, v0)
14017 return true
14018 }
14019
14020
14021
14022 for {
14023 i := v_0
14024 if i.Op != OpRsh64Ux64 {
14025 break
14026 }
14027 _ = i.Args[1]
14028 x := i.Args[0]
14029 i_1 := i.Args[1]
14030 if i_1.Op != OpConst64 {
14031 break
14032 }
14033 c := auxIntToInt64(i_1.AuxInt)
14034 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
14035 break
14036 }
14037 v.reset(OpAnd64)
14038 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
14039 v0.AuxInt = int64ToAuxInt(int64(-1) << c)
14040 v.AddArg2(x, v0)
14041 return true
14042 }
14043
14044
14045
14046 for {
14047 if v_0.Op != OpRsh64Ux64 {
14048 break
14049 }
14050 _ = v_0.Args[1]
14051 v_0_0 := v_0.Args[0]
14052 if v_0_0.Op != OpLsh64x64 {
14053 break
14054 }
14055 _ = v_0_0.Args[1]
14056 x := v_0_0.Args[0]
14057 v_0_0_1 := v_0_0.Args[1]
14058 if v_0_0_1.Op != OpConst64 {
14059 break
14060 }
14061 c1 := auxIntToInt64(v_0_0_1.AuxInt)
14062 v_0_1 := v_0.Args[1]
14063 if v_0_1.Op != OpConst64 {
14064 break
14065 }
14066 c2 := auxIntToInt64(v_0_1.AuxInt)
14067 if v_1.Op != OpConst64 {
14068 break
14069 }
14070 c3 := auxIntToInt64(v_1.AuxInt)
14071 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
14072 break
14073 }
14074 v.reset(OpLsh64x64)
14075 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
14076 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
14077 v.AddArg2(x, v0)
14078 return true
14079 }
14080
14081
14082
14083 for {
14084 if v_0.Op != OpAnd64 {
14085 break
14086 }
14087 _ = v_0.Args[1]
14088 v_0_0 := v_0.Args[0]
14089 v_0_1 := v_0.Args[1]
14090 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14091 if v_0_0.Op != OpRsh64x64 {
14092 continue
14093 }
14094 t := v_0_0.Type
14095 _ = v_0_0.Args[1]
14096 x := v_0_0.Args[0]
14097 v_0_0_1 := v_0_0.Args[1]
14098 if v_0_0_1.Op != OpConst64 {
14099 continue
14100 }
14101 t2 := v_0_0_1.Type
14102 c := auxIntToInt64(v_0_0_1.AuxInt)
14103 if v_0_1.Op != OpConst64 {
14104 continue
14105 }
14106 d := auxIntToInt64(v_0_1.AuxInt)
14107 if v_1.Op != OpConst64 {
14108 continue
14109 }
14110 e := auxIntToInt64(v_1.AuxInt)
14111 if !(c >= e) {
14112 continue
14113 }
14114 v.reset(OpAnd64)
14115 v0 := b.NewValue0(v.Pos, OpRsh64x64, t)
14116 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14117 v1.AuxInt = int64ToAuxInt(c - e)
14118 v0.AddArg2(x, v1)
14119 v2 := b.NewValue0(v.Pos, OpConst64, t)
14120 v2.AuxInt = int64ToAuxInt(d << e)
14121 v.AddArg2(v0, v2)
14122 return true
14123 }
14124 break
14125 }
14126
14127
14128
14129 for {
14130 if v_0.Op != OpAnd64 {
14131 break
14132 }
14133 _ = v_0.Args[1]
14134 v_0_0 := v_0.Args[0]
14135 v_0_1 := v_0.Args[1]
14136 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14137 if v_0_0.Op != OpRsh64Ux64 {
14138 continue
14139 }
14140 t := v_0_0.Type
14141 _ = v_0_0.Args[1]
14142 x := v_0_0.Args[0]
14143 v_0_0_1 := v_0_0.Args[1]
14144 if v_0_0_1.Op != OpConst64 {
14145 continue
14146 }
14147 t2 := v_0_0_1.Type
14148 c := auxIntToInt64(v_0_0_1.AuxInt)
14149 if v_0_1.Op != OpConst64 {
14150 continue
14151 }
14152 d := auxIntToInt64(v_0_1.AuxInt)
14153 if v_1.Op != OpConst64 {
14154 continue
14155 }
14156 e := auxIntToInt64(v_1.AuxInt)
14157 if !(c >= e) {
14158 continue
14159 }
14160 v.reset(OpAnd64)
14161 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t)
14162 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14163 v1.AuxInt = int64ToAuxInt(c - e)
14164 v0.AddArg2(x, v1)
14165 v2 := b.NewValue0(v.Pos, OpConst64, t)
14166 v2.AuxInt = int64ToAuxInt(d << e)
14167 v.AddArg2(v0, v2)
14168 return true
14169 }
14170 break
14171 }
14172
14173
14174
14175 for {
14176 if v_0.Op != OpAnd64 {
14177 break
14178 }
14179 _ = v_0.Args[1]
14180 v_0_0 := v_0.Args[0]
14181 v_0_1 := v_0.Args[1]
14182 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14183 if v_0_0.Op != OpRsh64x64 {
14184 continue
14185 }
14186 t := v_0_0.Type
14187 _ = v_0_0.Args[1]
14188 x := v_0_0.Args[0]
14189 v_0_0_1 := v_0_0.Args[1]
14190 if v_0_0_1.Op != OpConst64 {
14191 continue
14192 }
14193 t2 := v_0_0_1.Type
14194 c := auxIntToInt64(v_0_0_1.AuxInt)
14195 if v_0_1.Op != OpConst64 {
14196 continue
14197 }
14198 d := auxIntToInt64(v_0_1.AuxInt)
14199 if v_1.Op != OpConst64 {
14200 continue
14201 }
14202 e := auxIntToInt64(v_1.AuxInt)
14203 if !(c < e) {
14204 continue
14205 }
14206 v.reset(OpAnd64)
14207 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
14208 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14209 v1.AuxInt = int64ToAuxInt(e - c)
14210 v0.AddArg2(x, v1)
14211 v2 := b.NewValue0(v.Pos, OpConst64, t)
14212 v2.AuxInt = int64ToAuxInt(d << e)
14213 v.AddArg2(v0, v2)
14214 return true
14215 }
14216 break
14217 }
14218
14219
14220
14221 for {
14222 if v_0.Op != OpAnd64 {
14223 break
14224 }
14225 _ = v_0.Args[1]
14226 v_0_0 := v_0.Args[0]
14227 v_0_1 := v_0.Args[1]
14228 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14229 if v_0_0.Op != OpRsh64Ux64 {
14230 continue
14231 }
14232 t := v_0_0.Type
14233 _ = v_0_0.Args[1]
14234 x := v_0_0.Args[0]
14235 v_0_0_1 := v_0_0.Args[1]
14236 if v_0_0_1.Op != OpConst64 {
14237 continue
14238 }
14239 t2 := v_0_0_1.Type
14240 c := auxIntToInt64(v_0_0_1.AuxInt)
14241 if v_0_1.Op != OpConst64 {
14242 continue
14243 }
14244 d := auxIntToInt64(v_0_1.AuxInt)
14245 if v_1.Op != OpConst64 {
14246 continue
14247 }
14248 e := auxIntToInt64(v_1.AuxInt)
14249 if !(c < e) {
14250 continue
14251 }
14252 v.reset(OpAnd64)
14253 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
14254 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14255 v1.AuxInt = int64ToAuxInt(e - c)
14256 v0.AddArg2(x, v1)
14257 v2 := b.NewValue0(v.Pos, OpConst64, t)
14258 v2.AuxInt = int64ToAuxInt(d << e)
14259 v.AddArg2(v0, v2)
14260 return true
14261 }
14262 break
14263 }
14264
14265
14266
14267 for {
14268 if auxIntToBool(v.AuxInt) != false {
14269 break
14270 }
14271 x := v_0
14272 con := v_1
14273 if con.Op != OpConst64 {
14274 break
14275 }
14276 c := auxIntToInt64(con.AuxInt)
14277 if !(0 < c && c < 64) {
14278 break
14279 }
14280 v.reset(OpLsh64x64)
14281 v.AuxInt = boolToAuxInt(true)
14282 v.AddArg2(x, con)
14283 return true
14284 }
14285 return false
14286 }
14287 func rewriteValuegeneric_OpLsh64x8(v *Value) bool {
14288 v_1 := v.Args[1]
14289 v_0 := v.Args[0]
14290 b := v.Block
14291
14292
14293 for {
14294 t := v.Type
14295 x := v_0
14296 if v_1.Op != OpConst8 {
14297 break
14298 }
14299 c := auxIntToInt8(v_1.AuxInt)
14300 v.reset(OpLsh64x64)
14301 v0 := b.NewValue0(v.Pos, OpConst64, t)
14302 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
14303 v.AddArg2(x, v0)
14304 return true
14305 }
14306
14307
14308 for {
14309 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
14310 break
14311 }
14312 v.reset(OpConst64)
14313 v.AuxInt = int64ToAuxInt(0)
14314 return true
14315 }
14316
14317
14318
14319 for {
14320 if auxIntToBool(v.AuxInt) != false {
14321 break
14322 }
14323 x := v_0
14324 con := v_1
14325 if con.Op != OpConst8 {
14326 break
14327 }
14328 c := auxIntToInt8(con.AuxInt)
14329 if !(0 < c && c < 64) {
14330 break
14331 }
14332 v.reset(OpLsh64x8)
14333 v.AuxInt = boolToAuxInt(true)
14334 v.AddArg2(x, con)
14335 return true
14336 }
14337 return false
14338 }
14339 func rewriteValuegeneric_OpLsh8x16(v *Value) bool {
14340 v_1 := v.Args[1]
14341 v_0 := v.Args[0]
14342 b := v.Block
14343
14344
14345 for {
14346 t := v.Type
14347 x := v_0
14348 if v_1.Op != OpConst16 {
14349 break
14350 }
14351 c := auxIntToInt16(v_1.AuxInt)
14352 v.reset(OpLsh8x64)
14353 v0 := b.NewValue0(v.Pos, OpConst64, t)
14354 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
14355 v.AddArg2(x, v0)
14356 return true
14357 }
14358
14359
14360 for {
14361 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
14362 break
14363 }
14364 v.reset(OpConst8)
14365 v.AuxInt = int8ToAuxInt(0)
14366 return true
14367 }
14368
14369
14370
14371 for {
14372 if auxIntToBool(v.AuxInt) != false {
14373 break
14374 }
14375 x := v_0
14376 con := v_1
14377 if con.Op != OpConst16 {
14378 break
14379 }
14380 c := auxIntToInt16(con.AuxInt)
14381 if !(0 < c && c < 8) {
14382 break
14383 }
14384 v.reset(OpLsh8x16)
14385 v.AuxInt = boolToAuxInt(true)
14386 v.AddArg2(x, con)
14387 return true
14388 }
14389 return false
14390 }
14391 func rewriteValuegeneric_OpLsh8x32(v *Value) bool {
14392 v_1 := v.Args[1]
14393 v_0 := v.Args[0]
14394 b := v.Block
14395
14396
14397 for {
14398 t := v.Type
14399 x := v_0
14400 if v_1.Op != OpConst32 {
14401 break
14402 }
14403 c := auxIntToInt32(v_1.AuxInt)
14404 v.reset(OpLsh8x64)
14405 v0 := b.NewValue0(v.Pos, OpConst64, t)
14406 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
14407 v.AddArg2(x, v0)
14408 return true
14409 }
14410
14411
14412 for {
14413 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
14414 break
14415 }
14416 v.reset(OpConst8)
14417 v.AuxInt = int8ToAuxInt(0)
14418 return true
14419 }
14420
14421
14422
14423 for {
14424 if auxIntToBool(v.AuxInt) != false {
14425 break
14426 }
14427 x := v_0
14428 con := v_1
14429 if con.Op != OpConst32 {
14430 break
14431 }
14432 c := auxIntToInt32(con.AuxInt)
14433 if !(0 < c && c < 8) {
14434 break
14435 }
14436 v.reset(OpLsh8x32)
14437 v.AuxInt = boolToAuxInt(true)
14438 v.AddArg2(x, con)
14439 return true
14440 }
14441 return false
14442 }
14443 func rewriteValuegeneric_OpLsh8x64(v *Value) bool {
14444 v_1 := v.Args[1]
14445 v_0 := v.Args[0]
14446 b := v.Block
14447 typ := &b.Func.Config.Types
14448
14449
14450 for {
14451 if v_0.Op != OpConst8 {
14452 break
14453 }
14454 c := auxIntToInt8(v_0.AuxInt)
14455 if v_1.Op != OpConst64 {
14456 break
14457 }
14458 d := auxIntToInt64(v_1.AuxInt)
14459 v.reset(OpConst8)
14460 v.AuxInt = int8ToAuxInt(c << uint64(d))
14461 return true
14462 }
14463
14464
14465 for {
14466 x := v_0
14467 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
14468 break
14469 }
14470 v.copyOf(x)
14471 return true
14472 }
14473
14474
14475 for {
14476 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
14477 break
14478 }
14479 v.reset(OpConst8)
14480 v.AuxInt = int8ToAuxInt(0)
14481 return true
14482 }
14483
14484
14485
14486 for {
14487 if v_1.Op != OpConst64 {
14488 break
14489 }
14490 c := auxIntToInt64(v_1.AuxInt)
14491 if !(uint64(c) >= 8) {
14492 break
14493 }
14494 v.reset(OpConst8)
14495 v.AuxInt = int8ToAuxInt(0)
14496 return true
14497 }
14498
14499
14500
14501 for {
14502 t := v.Type
14503 if v_0.Op != OpLsh8x64 {
14504 break
14505 }
14506 _ = v_0.Args[1]
14507 x := v_0.Args[0]
14508 v_0_1 := v_0.Args[1]
14509 if v_0_1.Op != OpConst64 {
14510 break
14511 }
14512 c := auxIntToInt64(v_0_1.AuxInt)
14513 if v_1.Op != OpConst64 {
14514 break
14515 }
14516 d := auxIntToInt64(v_1.AuxInt)
14517 if !(!uaddOvf(c, d)) {
14518 break
14519 }
14520 v.reset(OpLsh8x64)
14521 v0 := b.NewValue0(v.Pos, OpConst64, t)
14522 v0.AuxInt = int64ToAuxInt(c + d)
14523 v.AddArg2(x, v0)
14524 return true
14525 }
14526
14527
14528
14529 for {
14530 i := v_0
14531 if i.Op != OpRsh8x64 {
14532 break
14533 }
14534 _ = i.Args[1]
14535 x := i.Args[0]
14536 i_1 := i.Args[1]
14537 if i_1.Op != OpConst64 {
14538 break
14539 }
14540 c := auxIntToInt64(i_1.AuxInt)
14541 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
14542 break
14543 }
14544 v.reset(OpAnd8)
14545 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
14546 v0.AuxInt = int8ToAuxInt(int8(-1) << c)
14547 v.AddArg2(x, v0)
14548 return true
14549 }
14550
14551
14552
14553 for {
14554 i := v_0
14555 if i.Op != OpRsh8Ux64 {
14556 break
14557 }
14558 _ = i.Args[1]
14559 x := i.Args[0]
14560 i_1 := i.Args[1]
14561 if i_1.Op != OpConst64 {
14562 break
14563 }
14564 c := auxIntToInt64(i_1.AuxInt)
14565 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
14566 break
14567 }
14568 v.reset(OpAnd8)
14569 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
14570 v0.AuxInt = int8ToAuxInt(int8(-1) << c)
14571 v.AddArg2(x, v0)
14572 return true
14573 }
14574
14575
14576
14577 for {
14578 if v_0.Op != OpRsh8Ux64 {
14579 break
14580 }
14581 _ = v_0.Args[1]
14582 v_0_0 := v_0.Args[0]
14583 if v_0_0.Op != OpLsh8x64 {
14584 break
14585 }
14586 _ = v_0_0.Args[1]
14587 x := v_0_0.Args[0]
14588 v_0_0_1 := v_0_0.Args[1]
14589 if v_0_0_1.Op != OpConst64 {
14590 break
14591 }
14592 c1 := auxIntToInt64(v_0_0_1.AuxInt)
14593 v_0_1 := v_0.Args[1]
14594 if v_0_1.Op != OpConst64 {
14595 break
14596 }
14597 c2 := auxIntToInt64(v_0_1.AuxInt)
14598 if v_1.Op != OpConst64 {
14599 break
14600 }
14601 c3 := auxIntToInt64(v_1.AuxInt)
14602 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
14603 break
14604 }
14605 v.reset(OpLsh8x64)
14606 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
14607 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
14608 v.AddArg2(x, v0)
14609 return true
14610 }
14611
14612
14613
14614 for {
14615 if v_0.Op != OpAnd8 {
14616 break
14617 }
14618 _ = v_0.Args[1]
14619 v_0_0 := v_0.Args[0]
14620 v_0_1 := v_0.Args[1]
14621 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14622 if v_0_0.Op != OpRsh8x64 {
14623 continue
14624 }
14625 t := v_0_0.Type
14626 _ = v_0_0.Args[1]
14627 x := v_0_0.Args[0]
14628 v_0_0_1 := v_0_0.Args[1]
14629 if v_0_0_1.Op != OpConst64 {
14630 continue
14631 }
14632 t2 := v_0_0_1.Type
14633 c := auxIntToInt64(v_0_0_1.AuxInt)
14634 if v_0_1.Op != OpConst8 {
14635 continue
14636 }
14637 d := auxIntToInt8(v_0_1.AuxInt)
14638 if v_1.Op != OpConst64 {
14639 continue
14640 }
14641 e := auxIntToInt64(v_1.AuxInt)
14642 if !(c >= e) {
14643 continue
14644 }
14645 v.reset(OpAnd8)
14646 v0 := b.NewValue0(v.Pos, OpRsh8x64, t)
14647 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14648 v1.AuxInt = int64ToAuxInt(c - e)
14649 v0.AddArg2(x, v1)
14650 v2 := b.NewValue0(v.Pos, OpConst8, t)
14651 v2.AuxInt = int8ToAuxInt(d << e)
14652 v.AddArg2(v0, v2)
14653 return true
14654 }
14655 break
14656 }
14657
14658
14659
14660 for {
14661 if v_0.Op != OpAnd8 {
14662 break
14663 }
14664 _ = v_0.Args[1]
14665 v_0_0 := v_0.Args[0]
14666 v_0_1 := v_0.Args[1]
14667 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14668 if v_0_0.Op != OpRsh8Ux64 {
14669 continue
14670 }
14671 t := v_0_0.Type
14672 _ = v_0_0.Args[1]
14673 x := v_0_0.Args[0]
14674 v_0_0_1 := v_0_0.Args[1]
14675 if v_0_0_1.Op != OpConst64 {
14676 continue
14677 }
14678 t2 := v_0_0_1.Type
14679 c := auxIntToInt64(v_0_0_1.AuxInt)
14680 if v_0_1.Op != OpConst8 {
14681 continue
14682 }
14683 d := auxIntToInt8(v_0_1.AuxInt)
14684 if v_1.Op != OpConst64 {
14685 continue
14686 }
14687 e := auxIntToInt64(v_1.AuxInt)
14688 if !(c >= e) {
14689 continue
14690 }
14691 v.reset(OpAnd8)
14692 v0 := b.NewValue0(v.Pos, OpRsh8Ux64, t)
14693 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14694 v1.AuxInt = int64ToAuxInt(c - e)
14695 v0.AddArg2(x, v1)
14696 v2 := b.NewValue0(v.Pos, OpConst8, t)
14697 v2.AuxInt = int8ToAuxInt(d << e)
14698 v.AddArg2(v0, v2)
14699 return true
14700 }
14701 break
14702 }
14703
14704
14705
14706 for {
14707 if v_0.Op != OpAnd8 {
14708 break
14709 }
14710 _ = v_0.Args[1]
14711 v_0_0 := v_0.Args[0]
14712 v_0_1 := v_0.Args[1]
14713 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14714 if v_0_0.Op != OpRsh8x64 {
14715 continue
14716 }
14717 t := v_0_0.Type
14718 _ = v_0_0.Args[1]
14719 x := v_0_0.Args[0]
14720 v_0_0_1 := v_0_0.Args[1]
14721 if v_0_0_1.Op != OpConst64 {
14722 continue
14723 }
14724 t2 := v_0_0_1.Type
14725 c := auxIntToInt64(v_0_0_1.AuxInt)
14726 if v_0_1.Op != OpConst8 {
14727 continue
14728 }
14729 d := auxIntToInt8(v_0_1.AuxInt)
14730 if v_1.Op != OpConst64 {
14731 continue
14732 }
14733 e := auxIntToInt64(v_1.AuxInt)
14734 if !(c < e) {
14735 continue
14736 }
14737 v.reset(OpAnd8)
14738 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
14739 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14740 v1.AuxInt = int64ToAuxInt(e - c)
14741 v0.AddArg2(x, v1)
14742 v2 := b.NewValue0(v.Pos, OpConst8, t)
14743 v2.AuxInt = int8ToAuxInt(d << e)
14744 v.AddArg2(v0, v2)
14745 return true
14746 }
14747 break
14748 }
14749
14750
14751
14752 for {
14753 if v_0.Op != OpAnd8 {
14754 break
14755 }
14756 _ = v_0.Args[1]
14757 v_0_0 := v_0.Args[0]
14758 v_0_1 := v_0.Args[1]
14759 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
14760 if v_0_0.Op != OpRsh8Ux64 {
14761 continue
14762 }
14763 t := v_0_0.Type
14764 _ = v_0_0.Args[1]
14765 x := v_0_0.Args[0]
14766 v_0_0_1 := v_0_0.Args[1]
14767 if v_0_0_1.Op != OpConst64 {
14768 continue
14769 }
14770 t2 := v_0_0_1.Type
14771 c := auxIntToInt64(v_0_0_1.AuxInt)
14772 if v_0_1.Op != OpConst8 {
14773 continue
14774 }
14775 d := auxIntToInt8(v_0_1.AuxInt)
14776 if v_1.Op != OpConst64 {
14777 continue
14778 }
14779 e := auxIntToInt64(v_1.AuxInt)
14780 if !(c < e) {
14781 continue
14782 }
14783 v.reset(OpAnd8)
14784 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
14785 v1 := b.NewValue0(v.Pos, OpConst64, t2)
14786 v1.AuxInt = int64ToAuxInt(e - c)
14787 v0.AddArg2(x, v1)
14788 v2 := b.NewValue0(v.Pos, OpConst8, t)
14789 v2.AuxInt = int8ToAuxInt(d << e)
14790 v.AddArg2(v0, v2)
14791 return true
14792 }
14793 break
14794 }
14795
14796
14797
14798 for {
14799 if auxIntToBool(v.AuxInt) != false {
14800 break
14801 }
14802 x := v_0
14803 con := v_1
14804 if con.Op != OpConst64 {
14805 break
14806 }
14807 c := auxIntToInt64(con.AuxInt)
14808 if !(0 < c && c < 8) {
14809 break
14810 }
14811 v.reset(OpLsh8x64)
14812 v.AuxInt = boolToAuxInt(true)
14813 v.AddArg2(x, con)
14814 return true
14815 }
14816 return false
14817 }
14818 func rewriteValuegeneric_OpLsh8x8(v *Value) bool {
14819 v_1 := v.Args[1]
14820 v_0 := v.Args[0]
14821 b := v.Block
14822
14823
14824 for {
14825 t := v.Type
14826 x := v_0
14827 if v_1.Op != OpConst8 {
14828 break
14829 }
14830 c := auxIntToInt8(v_1.AuxInt)
14831 v.reset(OpLsh8x64)
14832 v0 := b.NewValue0(v.Pos, OpConst64, t)
14833 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
14834 v.AddArg2(x, v0)
14835 return true
14836 }
14837
14838
14839 for {
14840 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
14841 break
14842 }
14843 v.reset(OpConst8)
14844 v.AuxInt = int8ToAuxInt(0)
14845 return true
14846 }
14847
14848
14849
14850 for {
14851 if auxIntToBool(v.AuxInt) != false {
14852 break
14853 }
14854 x := v_0
14855 con := v_1
14856 if con.Op != OpConst8 {
14857 break
14858 }
14859 c := auxIntToInt8(con.AuxInt)
14860 if !(0 < c && c < 8) {
14861 break
14862 }
14863 v.reset(OpLsh8x8)
14864 v.AuxInt = boolToAuxInt(true)
14865 v.AddArg2(x, con)
14866 return true
14867 }
14868 return false
14869 }
14870 func rewriteValuegeneric_OpMemEq(v *Value) bool {
14871 v_3 := v.Args[3]
14872 v_2 := v.Args[2]
14873 v_1 := v.Args[1]
14874 v_0 := v.Args[0]
14875 b := v.Block
14876 config := b.Func.Config
14877 typ := &b.Func.Config.Types
14878
14879
14880 for {
14881 sptr := v_0
14882 tptr := v_1
14883 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 {
14884 break
14885 }
14886 mem := v_3
14887 v.reset(OpEq8)
14888 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
14889 v0.AddArg2(sptr, mem)
14890 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
14891 v1.AddArg2(tptr, mem)
14892 v.AddArg2(v0, v1)
14893 return true
14894 }
14895
14896
14897
14898 for {
14899 sptr := v_0
14900 tptr := v_1
14901 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 {
14902 break
14903 }
14904 mem := v_3
14905 if !(canLoadUnaligned(config)) {
14906 break
14907 }
14908 v.reset(OpEq16)
14909 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
14910 v0.AddArg2(sptr, mem)
14911 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
14912 v1.AddArg2(tptr, mem)
14913 v.AddArg2(v0, v1)
14914 return true
14915 }
14916
14917
14918
14919 for {
14920 sptr := v_0
14921 tptr := v_1
14922 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 {
14923 break
14924 }
14925 mem := v_3
14926 if !(canLoadUnaligned(config)) {
14927 break
14928 }
14929 v.reset(OpEq32)
14930 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
14931 v0.AddArg2(sptr, mem)
14932 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
14933 v1.AddArg2(tptr, mem)
14934 v.AddArg2(v0, v1)
14935 return true
14936 }
14937
14938
14939
14940 for {
14941 sptr := v_0
14942 tptr := v_1
14943 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 {
14944 break
14945 }
14946 mem := v_3
14947 if !(canLoadUnaligned(config) && config.PtrSize == 8) {
14948 break
14949 }
14950 v.reset(OpEq64)
14951 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
14952 v0.AddArg2(sptr, mem)
14953 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
14954 v1.AddArg2(tptr, mem)
14955 v.AddArg2(v0, v1)
14956 return true
14957 }
14958
14959
14960 for {
14961 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 {
14962 break
14963 }
14964 v.reset(OpConstBool)
14965 v.Type = typ.Bool
14966 v.AuxInt = boolToAuxInt(true)
14967 return true
14968 }
14969
14970
14971
14972 for {
14973 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
14974 p := v_0
14975 q := v_1
14976 if !(isSamePtr(p, q)) {
14977 continue
14978 }
14979 v.reset(OpConstBool)
14980 v.Type = typ.Bool
14981 v.AuxInt = boolToAuxInt(true)
14982 return true
14983 }
14984 break
14985 }
14986 return false
14987 }
14988 func rewriteValuegeneric_OpMod16(v *Value) bool {
14989 v_1 := v.Args[1]
14990 v_0 := v.Args[0]
14991 b := v.Block
14992
14993
14994
14995 for {
14996 if v_0.Op != OpConst16 {
14997 break
14998 }
14999 c := auxIntToInt16(v_0.AuxInt)
15000 if v_1.Op != OpConst16 {
15001 break
15002 }
15003 d := auxIntToInt16(v_1.AuxInt)
15004 if !(d != 0) {
15005 break
15006 }
15007 v.reset(OpConst16)
15008 v.AuxInt = int16ToAuxInt(c % d)
15009 return true
15010 }
15011
15012
15013
15014 for {
15015 t := v.Type
15016 n := v_0
15017 if v_1.Op != OpConst16 {
15018 break
15019 }
15020 c := auxIntToInt16(v_1.AuxInt)
15021 if !(isNonNegative(n) && isPowerOfTwo(c)) {
15022 break
15023 }
15024 v.reset(OpAnd16)
15025 v0 := b.NewValue0(v.Pos, OpConst16, t)
15026 v0.AuxInt = int16ToAuxInt(c - 1)
15027 v.AddArg2(n, v0)
15028 return true
15029 }
15030
15031
15032
15033 for {
15034 t := v.Type
15035 n := v_0
15036 if v_1.Op != OpConst16 {
15037 break
15038 }
15039 c := auxIntToInt16(v_1.AuxInt)
15040 if !(c < 0 && c != -1<<15) {
15041 break
15042 }
15043 v.reset(OpMod16)
15044 v.Type = t
15045 v0 := b.NewValue0(v.Pos, OpConst16, t)
15046 v0.AuxInt = int16ToAuxInt(-c)
15047 v.AddArg2(n, v0)
15048 return true
15049 }
15050
15051
15052
15053 for {
15054 t := v.Type
15055 x := v_0
15056 if v_1.Op != OpConst16 {
15057 break
15058 }
15059 c := auxIntToInt16(v_1.AuxInt)
15060 if !(x.Op != OpConst16 && (c > 0 || c == -1<<15)) {
15061 break
15062 }
15063 v.reset(OpSub16)
15064 v0 := b.NewValue0(v.Pos, OpMul16, t)
15065 v1 := b.NewValue0(v.Pos, OpDiv16, t)
15066 v2 := b.NewValue0(v.Pos, OpConst16, t)
15067 v2.AuxInt = int16ToAuxInt(c)
15068 v1.AddArg2(x, v2)
15069 v0.AddArg2(v1, v2)
15070 v.AddArg2(x, v0)
15071 return true
15072 }
15073 return false
15074 }
15075 func rewriteValuegeneric_OpMod16u(v *Value) bool {
15076 v_1 := v.Args[1]
15077 v_0 := v.Args[0]
15078 b := v.Block
15079
15080
15081
15082 for {
15083 if v_0.Op != OpConst16 {
15084 break
15085 }
15086 c := auxIntToInt16(v_0.AuxInt)
15087 if v_1.Op != OpConst16 {
15088 break
15089 }
15090 d := auxIntToInt16(v_1.AuxInt)
15091 if !(d != 0) {
15092 break
15093 }
15094 v.reset(OpConst16)
15095 v.AuxInt = int16ToAuxInt(int16(uint16(c) % uint16(d)))
15096 return true
15097 }
15098
15099
15100
15101 for {
15102 t := v.Type
15103 n := v_0
15104 if v_1.Op != OpConst16 {
15105 break
15106 }
15107 c := auxIntToInt16(v_1.AuxInt)
15108 if !(isUnsignedPowerOfTwo(uint16(c))) {
15109 break
15110 }
15111 v.reset(OpAnd16)
15112 v0 := b.NewValue0(v.Pos, OpConst16, t)
15113 v0.AuxInt = int16ToAuxInt(c - 1)
15114 v.AddArg2(n, v0)
15115 return true
15116 }
15117
15118
15119
15120 for {
15121 t := v.Type
15122 x := v_0
15123 if v_1.Op != OpConst16 {
15124 break
15125 }
15126 c := auxIntToInt16(v_1.AuxInt)
15127 if !(x.Op != OpConst16 && c != 0) {
15128 break
15129 }
15130 v.reset(OpSub16)
15131 v0 := b.NewValue0(v.Pos, OpMul16, t)
15132 v1 := b.NewValue0(v.Pos, OpDiv16u, t)
15133 v2 := b.NewValue0(v.Pos, OpConst16, t)
15134 v2.AuxInt = int16ToAuxInt(c)
15135 v1.AddArg2(x, v2)
15136 v0.AddArg2(v1, v2)
15137 v.AddArg2(x, v0)
15138 return true
15139 }
15140 return false
15141 }
15142 func rewriteValuegeneric_OpMod32(v *Value) bool {
15143 v_1 := v.Args[1]
15144 v_0 := v.Args[0]
15145 b := v.Block
15146
15147
15148
15149 for {
15150 if v_0.Op != OpConst32 {
15151 break
15152 }
15153 c := auxIntToInt32(v_0.AuxInt)
15154 if v_1.Op != OpConst32 {
15155 break
15156 }
15157 d := auxIntToInt32(v_1.AuxInt)
15158 if !(d != 0) {
15159 break
15160 }
15161 v.reset(OpConst32)
15162 v.AuxInt = int32ToAuxInt(c % d)
15163 return true
15164 }
15165
15166
15167
15168 for {
15169 t := v.Type
15170 n := v_0
15171 if v_1.Op != OpConst32 {
15172 break
15173 }
15174 c := auxIntToInt32(v_1.AuxInt)
15175 if !(isNonNegative(n) && isPowerOfTwo(c)) {
15176 break
15177 }
15178 v.reset(OpAnd32)
15179 v0 := b.NewValue0(v.Pos, OpConst32, t)
15180 v0.AuxInt = int32ToAuxInt(c - 1)
15181 v.AddArg2(n, v0)
15182 return true
15183 }
15184
15185
15186
15187 for {
15188 t := v.Type
15189 n := v_0
15190 if v_1.Op != OpConst32 {
15191 break
15192 }
15193 c := auxIntToInt32(v_1.AuxInt)
15194 if !(c < 0 && c != -1<<31) {
15195 break
15196 }
15197 v.reset(OpMod32)
15198 v.Type = t
15199 v0 := b.NewValue0(v.Pos, OpConst32, t)
15200 v0.AuxInt = int32ToAuxInt(-c)
15201 v.AddArg2(n, v0)
15202 return true
15203 }
15204
15205
15206
15207 for {
15208 t := v.Type
15209 x := v_0
15210 if v_1.Op != OpConst32 {
15211 break
15212 }
15213 c := auxIntToInt32(v_1.AuxInt)
15214 if !(x.Op != OpConst32 && (c > 0 || c == -1<<31)) {
15215 break
15216 }
15217 v.reset(OpSub32)
15218 v0 := b.NewValue0(v.Pos, OpMul32, t)
15219 v1 := b.NewValue0(v.Pos, OpDiv32, t)
15220 v2 := b.NewValue0(v.Pos, OpConst32, t)
15221 v2.AuxInt = int32ToAuxInt(c)
15222 v1.AddArg2(x, v2)
15223 v0.AddArg2(v1, v2)
15224 v.AddArg2(x, v0)
15225 return true
15226 }
15227 return false
15228 }
15229 func rewriteValuegeneric_OpMod32u(v *Value) bool {
15230 v_1 := v.Args[1]
15231 v_0 := v.Args[0]
15232 b := v.Block
15233
15234
15235
15236 for {
15237 if v_0.Op != OpConst32 {
15238 break
15239 }
15240 c := auxIntToInt32(v_0.AuxInt)
15241 if v_1.Op != OpConst32 {
15242 break
15243 }
15244 d := auxIntToInt32(v_1.AuxInt)
15245 if !(d != 0) {
15246 break
15247 }
15248 v.reset(OpConst32)
15249 v.AuxInt = int32ToAuxInt(int32(uint32(c) % uint32(d)))
15250 return true
15251 }
15252
15253
15254
15255 for {
15256 t := v.Type
15257 n := v_0
15258 if v_1.Op != OpConst32 {
15259 break
15260 }
15261 c := auxIntToInt32(v_1.AuxInt)
15262 if !(isUnsignedPowerOfTwo(uint32(c))) {
15263 break
15264 }
15265 v.reset(OpAnd32)
15266 v0 := b.NewValue0(v.Pos, OpConst32, t)
15267 v0.AuxInt = int32ToAuxInt(c - 1)
15268 v.AddArg2(n, v0)
15269 return true
15270 }
15271
15272
15273
15274 for {
15275 t := v.Type
15276 x := v_0
15277 if v_1.Op != OpConst32 {
15278 break
15279 }
15280 c := auxIntToInt32(v_1.AuxInt)
15281 if !(x.Op != OpConst32 && c != 0) {
15282 break
15283 }
15284 v.reset(OpSub32)
15285 v0 := b.NewValue0(v.Pos, OpMul32, t)
15286 v1 := b.NewValue0(v.Pos, OpDiv32u, t)
15287 v2 := b.NewValue0(v.Pos, OpConst32, t)
15288 v2.AuxInt = int32ToAuxInt(c)
15289 v1.AddArg2(x, v2)
15290 v0.AddArg2(v1, v2)
15291 v.AddArg2(x, v0)
15292 return true
15293 }
15294 return false
15295 }
15296 func rewriteValuegeneric_OpMod64(v *Value) bool {
15297 v_1 := v.Args[1]
15298 v_0 := v.Args[0]
15299 b := v.Block
15300
15301
15302
15303 for {
15304 if v_0.Op != OpConst64 {
15305 break
15306 }
15307 c := auxIntToInt64(v_0.AuxInt)
15308 if v_1.Op != OpConst64 {
15309 break
15310 }
15311 d := auxIntToInt64(v_1.AuxInt)
15312 if !(d != 0) {
15313 break
15314 }
15315 v.reset(OpConst64)
15316 v.AuxInt = int64ToAuxInt(c % d)
15317 return true
15318 }
15319
15320
15321
15322 for {
15323 t := v.Type
15324 n := v_0
15325 if v_1.Op != OpConst64 {
15326 break
15327 }
15328 c := auxIntToInt64(v_1.AuxInt)
15329 if !(isNonNegative(n) && isPowerOfTwo(c)) {
15330 break
15331 }
15332 v.reset(OpAnd64)
15333 v0 := b.NewValue0(v.Pos, OpConst64, t)
15334 v0.AuxInt = int64ToAuxInt(c - 1)
15335 v.AddArg2(n, v0)
15336 return true
15337 }
15338
15339
15340
15341 for {
15342 n := v_0
15343 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != -1<<63 || !(isNonNegative(n)) {
15344 break
15345 }
15346 v.copyOf(n)
15347 return true
15348 }
15349
15350
15351
15352 for {
15353 t := v.Type
15354 n := v_0
15355 if v_1.Op != OpConst64 {
15356 break
15357 }
15358 c := auxIntToInt64(v_1.AuxInt)
15359 if !(c < 0 && c != -1<<63) {
15360 break
15361 }
15362 v.reset(OpMod64)
15363 v.Type = t
15364 v0 := b.NewValue0(v.Pos, OpConst64, t)
15365 v0.AuxInt = int64ToAuxInt(-c)
15366 v.AddArg2(n, v0)
15367 return true
15368 }
15369
15370
15371
15372 for {
15373 t := v.Type
15374 x := v_0
15375 if v_1.Op != OpConst64 {
15376 break
15377 }
15378 c := auxIntToInt64(v_1.AuxInt)
15379 if !(x.Op != OpConst64 && (c > 0 || c == -1<<63)) {
15380 break
15381 }
15382 v.reset(OpSub64)
15383 v0 := b.NewValue0(v.Pos, OpMul64, t)
15384 v1 := b.NewValue0(v.Pos, OpDiv64, t)
15385 v2 := b.NewValue0(v.Pos, OpConst64, t)
15386 v2.AuxInt = int64ToAuxInt(c)
15387 v1.AddArg2(x, v2)
15388 v0.AddArg2(v1, v2)
15389 v.AddArg2(x, v0)
15390 return true
15391 }
15392 return false
15393 }
15394 func rewriteValuegeneric_OpMod64u(v *Value) bool {
15395 v_1 := v.Args[1]
15396 v_0 := v.Args[0]
15397 b := v.Block
15398
15399
15400
15401 for {
15402 if v_0.Op != OpConst64 {
15403 break
15404 }
15405 c := auxIntToInt64(v_0.AuxInt)
15406 if v_1.Op != OpConst64 {
15407 break
15408 }
15409 d := auxIntToInt64(v_1.AuxInt)
15410 if !(d != 0) {
15411 break
15412 }
15413 v.reset(OpConst64)
15414 v.AuxInt = int64ToAuxInt(int64(uint64(c) % uint64(d)))
15415 return true
15416 }
15417
15418
15419
15420 for {
15421 t := v.Type
15422 n := v_0
15423 if v_1.Op != OpConst64 {
15424 break
15425 }
15426 c := auxIntToInt64(v_1.AuxInt)
15427 if !(isUnsignedPowerOfTwo(uint64(c))) {
15428 break
15429 }
15430 v.reset(OpAnd64)
15431 v0 := b.NewValue0(v.Pos, OpConst64, t)
15432 v0.AuxInt = int64ToAuxInt(c - 1)
15433 v.AddArg2(n, v0)
15434 return true
15435 }
15436
15437
15438
15439 for {
15440 t := v.Type
15441 x := v_0
15442 if v_1.Op != OpConst64 {
15443 break
15444 }
15445 c := auxIntToInt64(v_1.AuxInt)
15446 if !(x.Op != OpConst64 && c != 0) {
15447 break
15448 }
15449 v.reset(OpSub64)
15450 v0 := b.NewValue0(v.Pos, OpMul64, t)
15451 v1 := b.NewValue0(v.Pos, OpDiv64u, t)
15452 v2 := b.NewValue0(v.Pos, OpConst64, t)
15453 v2.AuxInt = int64ToAuxInt(c)
15454 v1.AddArg2(x, v2)
15455 v0.AddArg2(v1, v2)
15456 v.AddArg2(x, v0)
15457 return true
15458 }
15459 return false
15460 }
15461 func rewriteValuegeneric_OpMod8(v *Value) bool {
15462 v_1 := v.Args[1]
15463 v_0 := v.Args[0]
15464 b := v.Block
15465
15466
15467
15468 for {
15469 if v_0.Op != OpConst8 {
15470 break
15471 }
15472 c := auxIntToInt8(v_0.AuxInt)
15473 if v_1.Op != OpConst8 {
15474 break
15475 }
15476 d := auxIntToInt8(v_1.AuxInt)
15477 if !(d != 0) {
15478 break
15479 }
15480 v.reset(OpConst8)
15481 v.AuxInt = int8ToAuxInt(c % d)
15482 return true
15483 }
15484
15485
15486
15487 for {
15488 t := v.Type
15489 n := v_0
15490 if v_1.Op != OpConst8 {
15491 break
15492 }
15493 c := auxIntToInt8(v_1.AuxInt)
15494 if !(isNonNegative(n) && isPowerOfTwo(c)) {
15495 break
15496 }
15497 v.reset(OpAnd8)
15498 v0 := b.NewValue0(v.Pos, OpConst8, t)
15499 v0.AuxInt = int8ToAuxInt(c - 1)
15500 v.AddArg2(n, v0)
15501 return true
15502 }
15503
15504
15505
15506 for {
15507 t := v.Type
15508 n := v_0
15509 if v_1.Op != OpConst8 {
15510 break
15511 }
15512 c := auxIntToInt8(v_1.AuxInt)
15513 if !(c < 0 && c != -1<<7) {
15514 break
15515 }
15516 v.reset(OpMod8)
15517 v.Type = t
15518 v0 := b.NewValue0(v.Pos, OpConst8, t)
15519 v0.AuxInt = int8ToAuxInt(-c)
15520 v.AddArg2(n, v0)
15521 return true
15522 }
15523
15524
15525
15526 for {
15527 t := v.Type
15528 x := v_0
15529 if v_1.Op != OpConst8 {
15530 break
15531 }
15532 c := auxIntToInt8(v_1.AuxInt)
15533 if !(x.Op != OpConst8 && (c > 0 || c == -1<<7)) {
15534 break
15535 }
15536 v.reset(OpSub8)
15537 v0 := b.NewValue0(v.Pos, OpMul8, t)
15538 v1 := b.NewValue0(v.Pos, OpDiv8, t)
15539 v2 := b.NewValue0(v.Pos, OpConst8, t)
15540 v2.AuxInt = int8ToAuxInt(c)
15541 v1.AddArg2(x, v2)
15542 v0.AddArg2(v1, v2)
15543 v.AddArg2(x, v0)
15544 return true
15545 }
15546 return false
15547 }
15548 func rewriteValuegeneric_OpMod8u(v *Value) bool {
15549 v_1 := v.Args[1]
15550 v_0 := v.Args[0]
15551 b := v.Block
15552
15553
15554
15555 for {
15556 if v_0.Op != OpConst8 {
15557 break
15558 }
15559 c := auxIntToInt8(v_0.AuxInt)
15560 if v_1.Op != OpConst8 {
15561 break
15562 }
15563 d := auxIntToInt8(v_1.AuxInt)
15564 if !(d != 0) {
15565 break
15566 }
15567 v.reset(OpConst8)
15568 v.AuxInt = int8ToAuxInt(int8(uint8(c) % uint8(d)))
15569 return true
15570 }
15571
15572
15573
15574 for {
15575 t := v.Type
15576 n := v_0
15577 if v_1.Op != OpConst8 {
15578 break
15579 }
15580 c := auxIntToInt8(v_1.AuxInt)
15581 if !(isUnsignedPowerOfTwo(uint8(c))) {
15582 break
15583 }
15584 v.reset(OpAnd8)
15585 v0 := b.NewValue0(v.Pos, OpConst8, t)
15586 v0.AuxInt = int8ToAuxInt(c - 1)
15587 v.AddArg2(n, v0)
15588 return true
15589 }
15590
15591
15592
15593 for {
15594 t := v.Type
15595 x := v_0
15596 if v_1.Op != OpConst8 {
15597 break
15598 }
15599 c := auxIntToInt8(v_1.AuxInt)
15600 if !(x.Op != OpConst8 && c != 0) {
15601 break
15602 }
15603 v.reset(OpSub8)
15604 v0 := b.NewValue0(v.Pos, OpMul8, t)
15605 v1 := b.NewValue0(v.Pos, OpDiv8u, t)
15606 v2 := b.NewValue0(v.Pos, OpConst8, t)
15607 v2.AuxInt = int8ToAuxInt(c)
15608 v1.AddArg2(x, v2)
15609 v0.AddArg2(v1, v2)
15610 v.AddArg2(x, v0)
15611 return true
15612 }
15613 return false
15614 }
15615 func rewriteValuegeneric_OpMove(v *Value) bool {
15616 v_2 := v.Args[2]
15617 v_1 := v.Args[1]
15618 v_0 := v.Args[0]
15619 b := v.Block
15620 config := b.Func.Config
15621
15622
15623
15624 for {
15625 n := auxIntToInt64(v.AuxInt)
15626 t := auxToType(v.Aux)
15627 dst1 := v_0
15628 src := v_1
15629 mem := v_2
15630 if mem.Op != OpZero || auxIntToInt64(mem.AuxInt) != n || auxToType(mem.Aux) != t {
15631 break
15632 }
15633 dst2 := mem.Args[0]
15634 if !(isSamePtr(src, dst2)) {
15635 break
15636 }
15637 v.reset(OpZero)
15638 v.AuxInt = int64ToAuxInt(n)
15639 v.Aux = typeToAux(t)
15640 v.AddArg2(dst1, mem)
15641 return true
15642 }
15643
15644
15645
15646 for {
15647 n := auxIntToInt64(v.AuxInt)
15648 t := auxToType(v.Aux)
15649 dst1 := v_0
15650 src := v_1
15651 mem := v_2
15652 if mem.Op != OpVarDef {
15653 break
15654 }
15655 mem_0 := mem.Args[0]
15656 if mem_0.Op != OpZero || auxIntToInt64(mem_0.AuxInt) != n || auxToType(mem_0.Aux) != t {
15657 break
15658 }
15659 dst0 := mem_0.Args[0]
15660 if !(isSamePtr(src, dst0)) {
15661 break
15662 }
15663 v.reset(OpZero)
15664 v.AuxInt = int64ToAuxInt(n)
15665 v.Aux = typeToAux(t)
15666 v.AddArg2(dst1, mem)
15667 return true
15668 }
15669
15670
15671
15672 for {
15673 n := auxIntToInt64(v.AuxInt)
15674 t := auxToType(v.Aux)
15675 dst := v_0
15676 if v_1.Op != OpAddr {
15677 break
15678 }
15679 sym := auxToSym(v_1.Aux)
15680 v_1_0 := v_1.Args[0]
15681 if v_1_0.Op != OpSB {
15682 break
15683 }
15684 mem := v_2
15685 if !(symIsROZero(sym)) {
15686 break
15687 }
15688 v.reset(OpZero)
15689 v.AuxInt = int64ToAuxInt(n)
15690 v.Aux = typeToAux(t)
15691 v.AddArg2(dst, mem)
15692 return true
15693 }
15694
15695
15696
15697 for {
15698 n := auxIntToInt64(v.AuxInt)
15699 t1 := auxToType(v.Aux)
15700 dst1 := v_0
15701 src1 := v_1
15702 store := v_2
15703 if store.Op != OpStore {
15704 break
15705 }
15706 t2 := auxToType(store.Aux)
15707 mem := store.Args[2]
15708 op := store.Args[0]
15709 if op.Op != OpOffPtr {
15710 break
15711 }
15712 o2 := auxIntToInt64(op.AuxInt)
15713 dst2 := op.Args[0]
15714 if !(isSamePtr(dst1, dst2) && store.Uses == 1 && n >= o2+t2.Size() && disjoint(src1, n, op, t2.Size()) && clobber(store)) {
15715 break
15716 }
15717 v.reset(OpMove)
15718 v.AuxInt = int64ToAuxInt(n)
15719 v.Aux = typeToAux(t1)
15720 v.AddArg3(dst1, src1, mem)
15721 return true
15722 }
15723
15724
15725
15726 for {
15727 n := auxIntToInt64(v.AuxInt)
15728 t := auxToType(v.Aux)
15729 dst1 := v_0
15730 src1 := v_1
15731 move := v_2
15732 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
15733 break
15734 }
15735 mem := move.Args[2]
15736 dst2 := move.Args[0]
15737 if !(move.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move)) {
15738 break
15739 }
15740 v.reset(OpMove)
15741 v.AuxInt = int64ToAuxInt(n)
15742 v.Aux = typeToAux(t)
15743 v.AddArg3(dst1, src1, mem)
15744 return true
15745 }
15746
15747
15748
15749 for {
15750 n := auxIntToInt64(v.AuxInt)
15751 t := auxToType(v.Aux)
15752 dst1 := v_0
15753 src1 := v_1
15754 vardef := v_2
15755 if vardef.Op != OpVarDef {
15756 break
15757 }
15758 x := auxToSym(vardef.Aux)
15759 move := vardef.Args[0]
15760 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
15761 break
15762 }
15763 mem := move.Args[2]
15764 dst2 := move.Args[0]
15765 if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move, vardef)) {
15766 break
15767 }
15768 v.reset(OpMove)
15769 v.AuxInt = int64ToAuxInt(n)
15770 v.Aux = typeToAux(t)
15771 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
15772 v0.Aux = symToAux(x)
15773 v0.AddArg(mem)
15774 v.AddArg3(dst1, src1, v0)
15775 return true
15776 }
15777
15778
15779
15780 for {
15781 n := auxIntToInt64(v.AuxInt)
15782 t := auxToType(v.Aux)
15783 dst1 := v_0
15784 src1 := v_1
15785 zero := v_2
15786 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != n || auxToType(zero.Aux) != t {
15787 break
15788 }
15789 mem := zero.Args[1]
15790 dst2 := zero.Args[0]
15791 if !(zero.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero)) {
15792 break
15793 }
15794 v.reset(OpMove)
15795 v.AuxInt = int64ToAuxInt(n)
15796 v.Aux = typeToAux(t)
15797 v.AddArg3(dst1, src1, mem)
15798 return true
15799 }
15800
15801
15802
15803 for {
15804 n := auxIntToInt64(v.AuxInt)
15805 t := auxToType(v.Aux)
15806 dst1 := v_0
15807 src1 := v_1
15808 vardef := v_2
15809 if vardef.Op != OpVarDef {
15810 break
15811 }
15812 x := auxToSym(vardef.Aux)
15813 zero := vardef.Args[0]
15814 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != n || auxToType(zero.Aux) != t {
15815 break
15816 }
15817 mem := zero.Args[1]
15818 dst2 := zero.Args[0]
15819 if !(zero.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero, vardef)) {
15820 break
15821 }
15822 v.reset(OpMove)
15823 v.AuxInt = int64ToAuxInt(n)
15824 v.Aux = typeToAux(t)
15825 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
15826 v0.Aux = symToAux(x)
15827 v0.AddArg(mem)
15828 v.AddArg3(dst1, src1, v0)
15829 return true
15830 }
15831
15832
15833
15834 for {
15835 n := auxIntToInt64(v.AuxInt)
15836 t1 := auxToType(v.Aux)
15837 dst := v_0
15838 p1 := v_1
15839 mem := v_2
15840 if mem.Op != OpStore {
15841 break
15842 }
15843 t2 := auxToType(mem.Aux)
15844 _ = mem.Args[2]
15845 op2 := mem.Args[0]
15846 if op2.Op != OpOffPtr {
15847 break
15848 }
15849 tt2 := op2.Type
15850 o2 := auxIntToInt64(op2.AuxInt)
15851 p2 := op2.Args[0]
15852 d1 := mem.Args[1]
15853 mem_2 := mem.Args[2]
15854 if mem_2.Op != OpStore {
15855 break
15856 }
15857 t3 := auxToType(mem_2.Aux)
15858 d2 := mem_2.Args[1]
15859 op3 := mem_2.Args[0]
15860 if op3.Op != OpOffPtr {
15861 break
15862 }
15863 tt3 := op3.Type
15864 if auxIntToInt64(op3.AuxInt) != 0 {
15865 break
15866 }
15867 p3 := op3.Args[0]
15868 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()) {
15869 break
15870 }
15871 v.reset(OpStore)
15872 v.Aux = typeToAux(t2)
15873 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
15874 v0.AuxInt = int64ToAuxInt(o2)
15875 v0.AddArg(dst)
15876 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
15877 v1.Aux = typeToAux(t3)
15878 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
15879 v2.AuxInt = int64ToAuxInt(0)
15880 v2.AddArg(dst)
15881 v1.AddArg3(v2, d2, mem)
15882 v.AddArg3(v0, d1, v1)
15883 return true
15884 }
15885
15886
15887
15888 for {
15889 n := auxIntToInt64(v.AuxInt)
15890 t1 := auxToType(v.Aux)
15891 dst := v_0
15892 p1 := v_1
15893 mem := v_2
15894 if mem.Op != OpStore {
15895 break
15896 }
15897 t2 := auxToType(mem.Aux)
15898 _ = mem.Args[2]
15899 op2 := mem.Args[0]
15900 if op2.Op != OpOffPtr {
15901 break
15902 }
15903 tt2 := op2.Type
15904 o2 := auxIntToInt64(op2.AuxInt)
15905 p2 := op2.Args[0]
15906 d1 := mem.Args[1]
15907 mem_2 := mem.Args[2]
15908 if mem_2.Op != OpStore {
15909 break
15910 }
15911 t3 := auxToType(mem_2.Aux)
15912 _ = mem_2.Args[2]
15913 op3 := mem_2.Args[0]
15914 if op3.Op != OpOffPtr {
15915 break
15916 }
15917 tt3 := op3.Type
15918 o3 := auxIntToInt64(op3.AuxInt)
15919 p3 := op3.Args[0]
15920 d2 := mem_2.Args[1]
15921 mem_2_2 := mem_2.Args[2]
15922 if mem_2_2.Op != OpStore {
15923 break
15924 }
15925 t4 := auxToType(mem_2_2.Aux)
15926 d3 := mem_2_2.Args[1]
15927 op4 := mem_2_2.Args[0]
15928 if op4.Op != OpOffPtr {
15929 break
15930 }
15931 tt4 := op4.Type
15932 if auxIntToInt64(op4.AuxInt) != 0 {
15933 break
15934 }
15935 p4 := op4.Args[0]
15936 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()) {
15937 break
15938 }
15939 v.reset(OpStore)
15940 v.Aux = typeToAux(t2)
15941 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
15942 v0.AuxInt = int64ToAuxInt(o2)
15943 v0.AddArg(dst)
15944 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
15945 v1.Aux = typeToAux(t3)
15946 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
15947 v2.AuxInt = int64ToAuxInt(o3)
15948 v2.AddArg(dst)
15949 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
15950 v3.Aux = typeToAux(t4)
15951 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
15952 v4.AuxInt = int64ToAuxInt(0)
15953 v4.AddArg(dst)
15954 v3.AddArg3(v4, d3, mem)
15955 v1.AddArg3(v2, d2, v3)
15956 v.AddArg3(v0, d1, v1)
15957 return true
15958 }
15959
15960
15961
15962 for {
15963 n := auxIntToInt64(v.AuxInt)
15964 t1 := auxToType(v.Aux)
15965 dst := v_0
15966 p1 := v_1
15967 mem := v_2
15968 if mem.Op != OpStore {
15969 break
15970 }
15971 t2 := auxToType(mem.Aux)
15972 _ = mem.Args[2]
15973 op2 := mem.Args[0]
15974 if op2.Op != OpOffPtr {
15975 break
15976 }
15977 tt2 := op2.Type
15978 o2 := auxIntToInt64(op2.AuxInt)
15979 p2 := op2.Args[0]
15980 d1 := mem.Args[1]
15981 mem_2 := mem.Args[2]
15982 if mem_2.Op != OpStore {
15983 break
15984 }
15985 t3 := auxToType(mem_2.Aux)
15986 _ = mem_2.Args[2]
15987 op3 := mem_2.Args[0]
15988 if op3.Op != OpOffPtr {
15989 break
15990 }
15991 tt3 := op3.Type
15992 o3 := auxIntToInt64(op3.AuxInt)
15993 p3 := op3.Args[0]
15994 d2 := mem_2.Args[1]
15995 mem_2_2 := mem_2.Args[2]
15996 if mem_2_2.Op != OpStore {
15997 break
15998 }
15999 t4 := auxToType(mem_2_2.Aux)
16000 _ = mem_2_2.Args[2]
16001 op4 := mem_2_2.Args[0]
16002 if op4.Op != OpOffPtr {
16003 break
16004 }
16005 tt4 := op4.Type
16006 o4 := auxIntToInt64(op4.AuxInt)
16007 p4 := op4.Args[0]
16008 d3 := mem_2_2.Args[1]
16009 mem_2_2_2 := mem_2_2.Args[2]
16010 if mem_2_2_2.Op != OpStore {
16011 break
16012 }
16013 t5 := auxToType(mem_2_2_2.Aux)
16014 d4 := mem_2_2_2.Args[1]
16015 op5 := mem_2_2_2.Args[0]
16016 if op5.Op != OpOffPtr {
16017 break
16018 }
16019 tt5 := op5.Type
16020 if auxIntToInt64(op5.AuxInt) != 0 {
16021 break
16022 }
16023 p5 := op5.Args[0]
16024 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()) {
16025 break
16026 }
16027 v.reset(OpStore)
16028 v.Aux = typeToAux(t2)
16029 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16030 v0.AuxInt = int64ToAuxInt(o2)
16031 v0.AddArg(dst)
16032 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16033 v1.Aux = typeToAux(t3)
16034 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16035 v2.AuxInt = int64ToAuxInt(o3)
16036 v2.AddArg(dst)
16037 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16038 v3.Aux = typeToAux(t4)
16039 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16040 v4.AuxInt = int64ToAuxInt(o4)
16041 v4.AddArg(dst)
16042 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16043 v5.Aux = typeToAux(t5)
16044 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
16045 v6.AuxInt = int64ToAuxInt(0)
16046 v6.AddArg(dst)
16047 v5.AddArg3(v6, d4, mem)
16048 v3.AddArg3(v4, d3, v5)
16049 v1.AddArg3(v2, d2, v3)
16050 v.AddArg3(v0, d1, v1)
16051 return true
16052 }
16053
16054
16055
16056 for {
16057 n := auxIntToInt64(v.AuxInt)
16058 t1 := auxToType(v.Aux)
16059 dst := v_0
16060 p1 := v_1
16061 mem := v_2
16062 if mem.Op != OpVarDef {
16063 break
16064 }
16065 mem_0 := mem.Args[0]
16066 if mem_0.Op != OpStore {
16067 break
16068 }
16069 t2 := auxToType(mem_0.Aux)
16070 _ = mem_0.Args[2]
16071 op2 := mem_0.Args[0]
16072 if op2.Op != OpOffPtr {
16073 break
16074 }
16075 tt2 := op2.Type
16076 o2 := auxIntToInt64(op2.AuxInt)
16077 p2 := op2.Args[0]
16078 d1 := mem_0.Args[1]
16079 mem_0_2 := mem_0.Args[2]
16080 if mem_0_2.Op != OpStore {
16081 break
16082 }
16083 t3 := auxToType(mem_0_2.Aux)
16084 d2 := mem_0_2.Args[1]
16085 op3 := mem_0_2.Args[0]
16086 if op3.Op != OpOffPtr {
16087 break
16088 }
16089 tt3 := op3.Type
16090 if auxIntToInt64(op3.AuxInt) != 0 {
16091 break
16092 }
16093 p3 := op3.Args[0]
16094 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()) {
16095 break
16096 }
16097 v.reset(OpStore)
16098 v.Aux = typeToAux(t2)
16099 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16100 v0.AuxInt = int64ToAuxInt(o2)
16101 v0.AddArg(dst)
16102 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16103 v1.Aux = typeToAux(t3)
16104 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16105 v2.AuxInt = int64ToAuxInt(0)
16106 v2.AddArg(dst)
16107 v1.AddArg3(v2, d2, mem)
16108 v.AddArg3(v0, d1, v1)
16109 return true
16110 }
16111
16112
16113
16114 for {
16115 n := auxIntToInt64(v.AuxInt)
16116 t1 := auxToType(v.Aux)
16117 dst := v_0
16118 p1 := v_1
16119 mem := v_2
16120 if mem.Op != OpVarDef {
16121 break
16122 }
16123 mem_0 := mem.Args[0]
16124 if mem_0.Op != OpStore {
16125 break
16126 }
16127 t2 := auxToType(mem_0.Aux)
16128 _ = mem_0.Args[2]
16129 op2 := mem_0.Args[0]
16130 if op2.Op != OpOffPtr {
16131 break
16132 }
16133 tt2 := op2.Type
16134 o2 := auxIntToInt64(op2.AuxInt)
16135 p2 := op2.Args[0]
16136 d1 := mem_0.Args[1]
16137 mem_0_2 := mem_0.Args[2]
16138 if mem_0_2.Op != OpStore {
16139 break
16140 }
16141 t3 := auxToType(mem_0_2.Aux)
16142 _ = mem_0_2.Args[2]
16143 op3 := mem_0_2.Args[0]
16144 if op3.Op != OpOffPtr {
16145 break
16146 }
16147 tt3 := op3.Type
16148 o3 := auxIntToInt64(op3.AuxInt)
16149 p3 := op3.Args[0]
16150 d2 := mem_0_2.Args[1]
16151 mem_0_2_2 := mem_0_2.Args[2]
16152 if mem_0_2_2.Op != OpStore {
16153 break
16154 }
16155 t4 := auxToType(mem_0_2_2.Aux)
16156 d3 := mem_0_2_2.Args[1]
16157 op4 := mem_0_2_2.Args[0]
16158 if op4.Op != OpOffPtr {
16159 break
16160 }
16161 tt4 := op4.Type
16162 if auxIntToInt64(op4.AuxInt) != 0 {
16163 break
16164 }
16165 p4 := op4.Args[0]
16166 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()) {
16167 break
16168 }
16169 v.reset(OpStore)
16170 v.Aux = typeToAux(t2)
16171 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16172 v0.AuxInt = int64ToAuxInt(o2)
16173 v0.AddArg(dst)
16174 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16175 v1.Aux = typeToAux(t3)
16176 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16177 v2.AuxInt = int64ToAuxInt(o3)
16178 v2.AddArg(dst)
16179 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16180 v3.Aux = typeToAux(t4)
16181 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16182 v4.AuxInt = int64ToAuxInt(0)
16183 v4.AddArg(dst)
16184 v3.AddArg3(v4, d3, mem)
16185 v1.AddArg3(v2, d2, v3)
16186 v.AddArg3(v0, d1, v1)
16187 return true
16188 }
16189
16190
16191
16192 for {
16193 n := auxIntToInt64(v.AuxInt)
16194 t1 := auxToType(v.Aux)
16195 dst := v_0
16196 p1 := v_1
16197 mem := v_2
16198 if mem.Op != OpVarDef {
16199 break
16200 }
16201 mem_0 := mem.Args[0]
16202 if mem_0.Op != OpStore {
16203 break
16204 }
16205 t2 := auxToType(mem_0.Aux)
16206 _ = mem_0.Args[2]
16207 op2 := mem_0.Args[0]
16208 if op2.Op != OpOffPtr {
16209 break
16210 }
16211 tt2 := op2.Type
16212 o2 := auxIntToInt64(op2.AuxInt)
16213 p2 := op2.Args[0]
16214 d1 := mem_0.Args[1]
16215 mem_0_2 := mem_0.Args[2]
16216 if mem_0_2.Op != OpStore {
16217 break
16218 }
16219 t3 := auxToType(mem_0_2.Aux)
16220 _ = mem_0_2.Args[2]
16221 op3 := mem_0_2.Args[0]
16222 if op3.Op != OpOffPtr {
16223 break
16224 }
16225 tt3 := op3.Type
16226 o3 := auxIntToInt64(op3.AuxInt)
16227 p3 := op3.Args[0]
16228 d2 := mem_0_2.Args[1]
16229 mem_0_2_2 := mem_0_2.Args[2]
16230 if mem_0_2_2.Op != OpStore {
16231 break
16232 }
16233 t4 := auxToType(mem_0_2_2.Aux)
16234 _ = mem_0_2_2.Args[2]
16235 op4 := mem_0_2_2.Args[0]
16236 if op4.Op != OpOffPtr {
16237 break
16238 }
16239 tt4 := op4.Type
16240 o4 := auxIntToInt64(op4.AuxInt)
16241 p4 := op4.Args[0]
16242 d3 := mem_0_2_2.Args[1]
16243 mem_0_2_2_2 := mem_0_2_2.Args[2]
16244 if mem_0_2_2_2.Op != OpStore {
16245 break
16246 }
16247 t5 := auxToType(mem_0_2_2_2.Aux)
16248 d4 := mem_0_2_2_2.Args[1]
16249 op5 := mem_0_2_2_2.Args[0]
16250 if op5.Op != OpOffPtr {
16251 break
16252 }
16253 tt5 := op5.Type
16254 if auxIntToInt64(op5.AuxInt) != 0 {
16255 break
16256 }
16257 p5 := op5.Args[0]
16258 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()) {
16259 break
16260 }
16261 v.reset(OpStore)
16262 v.Aux = typeToAux(t2)
16263 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16264 v0.AuxInt = int64ToAuxInt(o2)
16265 v0.AddArg(dst)
16266 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16267 v1.Aux = typeToAux(t3)
16268 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16269 v2.AuxInt = int64ToAuxInt(o3)
16270 v2.AddArg(dst)
16271 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16272 v3.Aux = typeToAux(t4)
16273 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16274 v4.AuxInt = int64ToAuxInt(o4)
16275 v4.AddArg(dst)
16276 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16277 v5.Aux = typeToAux(t5)
16278 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
16279 v6.AuxInt = int64ToAuxInt(0)
16280 v6.AddArg(dst)
16281 v5.AddArg3(v6, d4, mem)
16282 v3.AddArg3(v4, d3, v5)
16283 v1.AddArg3(v2, d2, v3)
16284 v.AddArg3(v0, d1, v1)
16285 return true
16286 }
16287
16288
16289
16290 for {
16291 n := auxIntToInt64(v.AuxInt)
16292 t1 := auxToType(v.Aux)
16293 dst := v_0
16294 p1 := v_1
16295 mem := v_2
16296 if mem.Op != OpStore {
16297 break
16298 }
16299 t2 := auxToType(mem.Aux)
16300 _ = mem.Args[2]
16301 op2 := mem.Args[0]
16302 if op2.Op != OpOffPtr {
16303 break
16304 }
16305 tt2 := op2.Type
16306 o2 := auxIntToInt64(op2.AuxInt)
16307 p2 := op2.Args[0]
16308 d1 := mem.Args[1]
16309 mem_2 := mem.Args[2]
16310 if mem_2.Op != OpZero || auxIntToInt64(mem_2.AuxInt) != n {
16311 break
16312 }
16313 t3 := auxToType(mem_2.Aux)
16314 p3 := mem_2.Args[0]
16315 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && registerizable(b, t2) && n >= o2+t2.Size()) {
16316 break
16317 }
16318 v.reset(OpStore)
16319 v.Aux = typeToAux(t2)
16320 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16321 v0.AuxInt = int64ToAuxInt(o2)
16322 v0.AddArg(dst)
16323 v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16324 v1.AuxInt = int64ToAuxInt(n)
16325 v1.Aux = typeToAux(t1)
16326 v1.AddArg2(dst, mem)
16327 v.AddArg3(v0, d1, v1)
16328 return true
16329 }
16330
16331
16332
16333 for {
16334 n := auxIntToInt64(v.AuxInt)
16335 t1 := auxToType(v.Aux)
16336 dst := v_0
16337 p1 := v_1
16338 mem := v_2
16339 if mem.Op != OpStore {
16340 break
16341 }
16342 t2 := auxToType(mem.Aux)
16343 _ = mem.Args[2]
16344 mem_0 := mem.Args[0]
16345 if mem_0.Op != OpOffPtr {
16346 break
16347 }
16348 tt2 := mem_0.Type
16349 o2 := auxIntToInt64(mem_0.AuxInt)
16350 p2 := mem_0.Args[0]
16351 d1 := mem.Args[1]
16352 mem_2 := mem.Args[2]
16353 if mem_2.Op != OpStore {
16354 break
16355 }
16356 t3 := auxToType(mem_2.Aux)
16357 _ = mem_2.Args[2]
16358 mem_2_0 := mem_2.Args[0]
16359 if mem_2_0.Op != OpOffPtr {
16360 break
16361 }
16362 tt3 := mem_2_0.Type
16363 o3 := auxIntToInt64(mem_2_0.AuxInt)
16364 p3 := mem_2_0.Args[0]
16365 d2 := mem_2.Args[1]
16366 mem_2_2 := mem_2.Args[2]
16367 if mem_2_2.Op != OpZero || auxIntToInt64(mem_2_2.AuxInt) != n {
16368 break
16369 }
16370 t4 := auxToType(mem_2_2.Aux)
16371 p4 := mem_2_2.Args[0]
16372 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()) {
16373 break
16374 }
16375 v.reset(OpStore)
16376 v.Aux = typeToAux(t2)
16377 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16378 v0.AuxInt = int64ToAuxInt(o2)
16379 v0.AddArg(dst)
16380 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16381 v1.Aux = typeToAux(t3)
16382 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16383 v2.AuxInt = int64ToAuxInt(o3)
16384 v2.AddArg(dst)
16385 v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16386 v3.AuxInt = int64ToAuxInt(n)
16387 v3.Aux = typeToAux(t1)
16388 v3.AddArg2(dst, mem)
16389 v1.AddArg3(v2, d2, v3)
16390 v.AddArg3(v0, d1, v1)
16391 return true
16392 }
16393
16394
16395
16396 for {
16397 n := auxIntToInt64(v.AuxInt)
16398 t1 := auxToType(v.Aux)
16399 dst := v_0
16400 p1 := v_1
16401 mem := v_2
16402 if mem.Op != OpStore {
16403 break
16404 }
16405 t2 := auxToType(mem.Aux)
16406 _ = mem.Args[2]
16407 mem_0 := mem.Args[0]
16408 if mem_0.Op != OpOffPtr {
16409 break
16410 }
16411 tt2 := mem_0.Type
16412 o2 := auxIntToInt64(mem_0.AuxInt)
16413 p2 := mem_0.Args[0]
16414 d1 := mem.Args[1]
16415 mem_2 := mem.Args[2]
16416 if mem_2.Op != OpStore {
16417 break
16418 }
16419 t3 := auxToType(mem_2.Aux)
16420 _ = mem_2.Args[2]
16421 mem_2_0 := mem_2.Args[0]
16422 if mem_2_0.Op != OpOffPtr {
16423 break
16424 }
16425 tt3 := mem_2_0.Type
16426 o3 := auxIntToInt64(mem_2_0.AuxInt)
16427 p3 := mem_2_0.Args[0]
16428 d2 := mem_2.Args[1]
16429 mem_2_2 := mem_2.Args[2]
16430 if mem_2_2.Op != OpStore {
16431 break
16432 }
16433 t4 := auxToType(mem_2_2.Aux)
16434 _ = mem_2_2.Args[2]
16435 mem_2_2_0 := mem_2_2.Args[0]
16436 if mem_2_2_0.Op != OpOffPtr {
16437 break
16438 }
16439 tt4 := mem_2_2_0.Type
16440 o4 := auxIntToInt64(mem_2_2_0.AuxInt)
16441 p4 := mem_2_2_0.Args[0]
16442 d3 := mem_2_2.Args[1]
16443 mem_2_2_2 := mem_2_2.Args[2]
16444 if mem_2_2_2.Op != OpZero || auxIntToInt64(mem_2_2_2.AuxInt) != n {
16445 break
16446 }
16447 t5 := auxToType(mem_2_2_2.Aux)
16448 p5 := mem_2_2_2.Args[0]
16449 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()) {
16450 break
16451 }
16452 v.reset(OpStore)
16453 v.Aux = typeToAux(t2)
16454 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16455 v0.AuxInt = int64ToAuxInt(o2)
16456 v0.AddArg(dst)
16457 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16458 v1.Aux = typeToAux(t3)
16459 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16460 v2.AuxInt = int64ToAuxInt(o3)
16461 v2.AddArg(dst)
16462 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16463 v3.Aux = typeToAux(t4)
16464 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16465 v4.AuxInt = int64ToAuxInt(o4)
16466 v4.AddArg(dst)
16467 v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16468 v5.AuxInt = int64ToAuxInt(n)
16469 v5.Aux = typeToAux(t1)
16470 v5.AddArg2(dst, mem)
16471 v3.AddArg3(v4, d3, v5)
16472 v1.AddArg3(v2, d2, v3)
16473 v.AddArg3(v0, d1, v1)
16474 return true
16475 }
16476
16477
16478
16479 for {
16480 n := auxIntToInt64(v.AuxInt)
16481 t1 := auxToType(v.Aux)
16482 dst := v_0
16483 p1 := v_1
16484 mem := v_2
16485 if mem.Op != OpStore {
16486 break
16487 }
16488 t2 := auxToType(mem.Aux)
16489 _ = mem.Args[2]
16490 mem_0 := mem.Args[0]
16491 if mem_0.Op != OpOffPtr {
16492 break
16493 }
16494 tt2 := mem_0.Type
16495 o2 := auxIntToInt64(mem_0.AuxInt)
16496 p2 := mem_0.Args[0]
16497 d1 := mem.Args[1]
16498 mem_2 := mem.Args[2]
16499 if mem_2.Op != OpStore {
16500 break
16501 }
16502 t3 := auxToType(mem_2.Aux)
16503 _ = mem_2.Args[2]
16504 mem_2_0 := mem_2.Args[0]
16505 if mem_2_0.Op != OpOffPtr {
16506 break
16507 }
16508 tt3 := mem_2_0.Type
16509 o3 := auxIntToInt64(mem_2_0.AuxInt)
16510 p3 := mem_2_0.Args[0]
16511 d2 := mem_2.Args[1]
16512 mem_2_2 := mem_2.Args[2]
16513 if mem_2_2.Op != OpStore {
16514 break
16515 }
16516 t4 := auxToType(mem_2_2.Aux)
16517 _ = mem_2_2.Args[2]
16518 mem_2_2_0 := mem_2_2.Args[0]
16519 if mem_2_2_0.Op != OpOffPtr {
16520 break
16521 }
16522 tt4 := mem_2_2_0.Type
16523 o4 := auxIntToInt64(mem_2_2_0.AuxInt)
16524 p4 := mem_2_2_0.Args[0]
16525 d3 := mem_2_2.Args[1]
16526 mem_2_2_2 := mem_2_2.Args[2]
16527 if mem_2_2_2.Op != OpStore {
16528 break
16529 }
16530 t5 := auxToType(mem_2_2_2.Aux)
16531 _ = mem_2_2_2.Args[2]
16532 mem_2_2_2_0 := mem_2_2_2.Args[0]
16533 if mem_2_2_2_0.Op != OpOffPtr {
16534 break
16535 }
16536 tt5 := mem_2_2_2_0.Type
16537 o5 := auxIntToInt64(mem_2_2_2_0.AuxInt)
16538 p5 := mem_2_2_2_0.Args[0]
16539 d4 := mem_2_2_2.Args[1]
16540 mem_2_2_2_2 := mem_2_2_2.Args[2]
16541 if mem_2_2_2_2.Op != OpZero || auxIntToInt64(mem_2_2_2_2.AuxInt) != n {
16542 break
16543 }
16544 t6 := auxToType(mem_2_2_2_2.Aux)
16545 p6 := mem_2_2_2_2.Args[0]
16546 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()) {
16547 break
16548 }
16549 v.reset(OpStore)
16550 v.Aux = typeToAux(t2)
16551 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16552 v0.AuxInt = int64ToAuxInt(o2)
16553 v0.AddArg(dst)
16554 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16555 v1.Aux = typeToAux(t3)
16556 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16557 v2.AuxInt = int64ToAuxInt(o3)
16558 v2.AddArg(dst)
16559 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16560 v3.Aux = typeToAux(t4)
16561 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16562 v4.AuxInt = int64ToAuxInt(o4)
16563 v4.AddArg(dst)
16564 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16565 v5.Aux = typeToAux(t5)
16566 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
16567 v6.AuxInt = int64ToAuxInt(o5)
16568 v6.AddArg(dst)
16569 v7 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16570 v7.AuxInt = int64ToAuxInt(n)
16571 v7.Aux = typeToAux(t1)
16572 v7.AddArg2(dst, mem)
16573 v5.AddArg3(v6, d4, v7)
16574 v3.AddArg3(v4, d3, v5)
16575 v1.AddArg3(v2, d2, v3)
16576 v.AddArg3(v0, d1, v1)
16577 return true
16578 }
16579
16580
16581
16582 for {
16583 n := auxIntToInt64(v.AuxInt)
16584 t1 := auxToType(v.Aux)
16585 dst := v_0
16586 p1 := v_1
16587 mem := v_2
16588 if mem.Op != OpVarDef {
16589 break
16590 }
16591 mem_0 := mem.Args[0]
16592 if mem_0.Op != OpStore {
16593 break
16594 }
16595 t2 := auxToType(mem_0.Aux)
16596 _ = mem_0.Args[2]
16597 op2 := mem_0.Args[0]
16598 if op2.Op != OpOffPtr {
16599 break
16600 }
16601 tt2 := op2.Type
16602 o2 := auxIntToInt64(op2.AuxInt)
16603 p2 := op2.Args[0]
16604 d1 := mem_0.Args[1]
16605 mem_0_2 := mem_0.Args[2]
16606 if mem_0_2.Op != OpZero || auxIntToInt64(mem_0_2.AuxInt) != n {
16607 break
16608 }
16609 t3 := auxToType(mem_0_2.Aux)
16610 p3 := mem_0_2.Args[0]
16611 if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && t2.Alignment() <= t1.Alignment() && t3.Alignment() <= t1.Alignment() && registerizable(b, t2) && n >= o2+t2.Size()) {
16612 break
16613 }
16614 v.reset(OpStore)
16615 v.Aux = typeToAux(t2)
16616 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16617 v0.AuxInt = int64ToAuxInt(o2)
16618 v0.AddArg(dst)
16619 v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16620 v1.AuxInt = int64ToAuxInt(n)
16621 v1.Aux = typeToAux(t1)
16622 v1.AddArg2(dst, mem)
16623 v.AddArg3(v0, d1, v1)
16624 return true
16625 }
16626
16627
16628
16629 for {
16630 n := auxIntToInt64(v.AuxInt)
16631 t1 := auxToType(v.Aux)
16632 dst := v_0
16633 p1 := v_1
16634 mem := v_2
16635 if mem.Op != OpVarDef {
16636 break
16637 }
16638 mem_0 := mem.Args[0]
16639 if mem_0.Op != OpStore {
16640 break
16641 }
16642 t2 := auxToType(mem_0.Aux)
16643 _ = mem_0.Args[2]
16644 mem_0_0 := mem_0.Args[0]
16645 if mem_0_0.Op != OpOffPtr {
16646 break
16647 }
16648 tt2 := mem_0_0.Type
16649 o2 := auxIntToInt64(mem_0_0.AuxInt)
16650 p2 := mem_0_0.Args[0]
16651 d1 := mem_0.Args[1]
16652 mem_0_2 := mem_0.Args[2]
16653 if mem_0_2.Op != OpStore {
16654 break
16655 }
16656 t3 := auxToType(mem_0_2.Aux)
16657 _ = mem_0_2.Args[2]
16658 mem_0_2_0 := mem_0_2.Args[0]
16659 if mem_0_2_0.Op != OpOffPtr {
16660 break
16661 }
16662 tt3 := mem_0_2_0.Type
16663 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
16664 p3 := mem_0_2_0.Args[0]
16665 d2 := mem_0_2.Args[1]
16666 mem_0_2_2 := mem_0_2.Args[2]
16667 if mem_0_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2.AuxInt) != n {
16668 break
16669 }
16670 t4 := auxToType(mem_0_2_2.Aux)
16671 p4 := mem_0_2_2.Args[0]
16672 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()) {
16673 break
16674 }
16675 v.reset(OpStore)
16676 v.Aux = typeToAux(t2)
16677 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16678 v0.AuxInt = int64ToAuxInt(o2)
16679 v0.AddArg(dst)
16680 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16681 v1.Aux = typeToAux(t3)
16682 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16683 v2.AuxInt = int64ToAuxInt(o3)
16684 v2.AddArg(dst)
16685 v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16686 v3.AuxInt = int64ToAuxInt(n)
16687 v3.Aux = typeToAux(t1)
16688 v3.AddArg2(dst, mem)
16689 v1.AddArg3(v2, d2, v3)
16690 v.AddArg3(v0, d1, v1)
16691 return true
16692 }
16693
16694
16695
16696 for {
16697 n := auxIntToInt64(v.AuxInt)
16698 t1 := auxToType(v.Aux)
16699 dst := v_0
16700 p1 := v_1
16701 mem := v_2
16702 if mem.Op != OpVarDef {
16703 break
16704 }
16705 mem_0 := mem.Args[0]
16706 if mem_0.Op != OpStore {
16707 break
16708 }
16709 t2 := auxToType(mem_0.Aux)
16710 _ = mem_0.Args[2]
16711 mem_0_0 := mem_0.Args[0]
16712 if mem_0_0.Op != OpOffPtr {
16713 break
16714 }
16715 tt2 := mem_0_0.Type
16716 o2 := auxIntToInt64(mem_0_0.AuxInt)
16717 p2 := mem_0_0.Args[0]
16718 d1 := mem_0.Args[1]
16719 mem_0_2 := mem_0.Args[2]
16720 if mem_0_2.Op != OpStore {
16721 break
16722 }
16723 t3 := auxToType(mem_0_2.Aux)
16724 _ = mem_0_2.Args[2]
16725 mem_0_2_0 := mem_0_2.Args[0]
16726 if mem_0_2_0.Op != OpOffPtr {
16727 break
16728 }
16729 tt3 := mem_0_2_0.Type
16730 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
16731 p3 := mem_0_2_0.Args[0]
16732 d2 := mem_0_2.Args[1]
16733 mem_0_2_2 := mem_0_2.Args[2]
16734 if mem_0_2_2.Op != OpStore {
16735 break
16736 }
16737 t4 := auxToType(mem_0_2_2.Aux)
16738 _ = mem_0_2_2.Args[2]
16739 mem_0_2_2_0 := mem_0_2_2.Args[0]
16740 if mem_0_2_2_0.Op != OpOffPtr {
16741 break
16742 }
16743 tt4 := mem_0_2_2_0.Type
16744 o4 := auxIntToInt64(mem_0_2_2_0.AuxInt)
16745 p4 := mem_0_2_2_0.Args[0]
16746 d3 := mem_0_2_2.Args[1]
16747 mem_0_2_2_2 := mem_0_2_2.Args[2]
16748 if mem_0_2_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2_2.AuxInt) != n {
16749 break
16750 }
16751 t5 := auxToType(mem_0_2_2_2.Aux)
16752 p5 := mem_0_2_2_2.Args[0]
16753 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()) {
16754 break
16755 }
16756 v.reset(OpStore)
16757 v.Aux = typeToAux(t2)
16758 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16759 v0.AuxInt = int64ToAuxInt(o2)
16760 v0.AddArg(dst)
16761 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16762 v1.Aux = typeToAux(t3)
16763 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16764 v2.AuxInt = int64ToAuxInt(o3)
16765 v2.AddArg(dst)
16766 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16767 v3.Aux = typeToAux(t4)
16768 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16769 v4.AuxInt = int64ToAuxInt(o4)
16770 v4.AddArg(dst)
16771 v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16772 v5.AuxInt = int64ToAuxInt(n)
16773 v5.Aux = typeToAux(t1)
16774 v5.AddArg2(dst, mem)
16775 v3.AddArg3(v4, d3, v5)
16776 v1.AddArg3(v2, d2, v3)
16777 v.AddArg3(v0, d1, v1)
16778 return true
16779 }
16780
16781
16782
16783 for {
16784 n := auxIntToInt64(v.AuxInt)
16785 t1 := auxToType(v.Aux)
16786 dst := v_0
16787 p1 := v_1
16788 mem := v_2
16789 if mem.Op != OpVarDef {
16790 break
16791 }
16792 mem_0 := mem.Args[0]
16793 if mem_0.Op != OpStore {
16794 break
16795 }
16796 t2 := auxToType(mem_0.Aux)
16797 _ = mem_0.Args[2]
16798 mem_0_0 := mem_0.Args[0]
16799 if mem_0_0.Op != OpOffPtr {
16800 break
16801 }
16802 tt2 := mem_0_0.Type
16803 o2 := auxIntToInt64(mem_0_0.AuxInt)
16804 p2 := mem_0_0.Args[0]
16805 d1 := mem_0.Args[1]
16806 mem_0_2 := mem_0.Args[2]
16807 if mem_0_2.Op != OpStore {
16808 break
16809 }
16810 t3 := auxToType(mem_0_2.Aux)
16811 _ = mem_0_2.Args[2]
16812 mem_0_2_0 := mem_0_2.Args[0]
16813 if mem_0_2_0.Op != OpOffPtr {
16814 break
16815 }
16816 tt3 := mem_0_2_0.Type
16817 o3 := auxIntToInt64(mem_0_2_0.AuxInt)
16818 p3 := mem_0_2_0.Args[0]
16819 d2 := mem_0_2.Args[1]
16820 mem_0_2_2 := mem_0_2.Args[2]
16821 if mem_0_2_2.Op != OpStore {
16822 break
16823 }
16824 t4 := auxToType(mem_0_2_2.Aux)
16825 _ = mem_0_2_2.Args[2]
16826 mem_0_2_2_0 := mem_0_2_2.Args[0]
16827 if mem_0_2_2_0.Op != OpOffPtr {
16828 break
16829 }
16830 tt4 := mem_0_2_2_0.Type
16831 o4 := auxIntToInt64(mem_0_2_2_0.AuxInt)
16832 p4 := mem_0_2_2_0.Args[0]
16833 d3 := mem_0_2_2.Args[1]
16834 mem_0_2_2_2 := mem_0_2_2.Args[2]
16835 if mem_0_2_2_2.Op != OpStore {
16836 break
16837 }
16838 t5 := auxToType(mem_0_2_2_2.Aux)
16839 _ = mem_0_2_2_2.Args[2]
16840 mem_0_2_2_2_0 := mem_0_2_2_2.Args[0]
16841 if mem_0_2_2_2_0.Op != OpOffPtr {
16842 break
16843 }
16844 tt5 := mem_0_2_2_2_0.Type
16845 o5 := auxIntToInt64(mem_0_2_2_2_0.AuxInt)
16846 p5 := mem_0_2_2_2_0.Args[0]
16847 d4 := mem_0_2_2_2.Args[1]
16848 mem_0_2_2_2_2 := mem_0_2_2_2.Args[2]
16849 if mem_0_2_2_2_2.Op != OpZero || auxIntToInt64(mem_0_2_2_2_2.AuxInt) != n {
16850 break
16851 }
16852 t6 := auxToType(mem_0_2_2_2_2.Aux)
16853 p6 := mem_0_2_2_2_2.Args[0]
16854 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()) {
16855 break
16856 }
16857 v.reset(OpStore)
16858 v.Aux = typeToAux(t2)
16859 v0 := b.NewValue0(v.Pos, OpOffPtr, tt2)
16860 v0.AuxInt = int64ToAuxInt(o2)
16861 v0.AddArg(dst)
16862 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16863 v1.Aux = typeToAux(t3)
16864 v2 := b.NewValue0(v.Pos, OpOffPtr, tt3)
16865 v2.AuxInt = int64ToAuxInt(o3)
16866 v2.AddArg(dst)
16867 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16868 v3.Aux = typeToAux(t4)
16869 v4 := b.NewValue0(v.Pos, OpOffPtr, tt4)
16870 v4.AuxInt = int64ToAuxInt(o4)
16871 v4.AddArg(dst)
16872 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
16873 v5.Aux = typeToAux(t5)
16874 v6 := b.NewValue0(v.Pos, OpOffPtr, tt5)
16875 v6.AuxInt = int64ToAuxInt(o5)
16876 v6.AddArg(dst)
16877 v7 := b.NewValue0(v.Pos, OpZero, types.TypeMem)
16878 v7.AuxInt = int64ToAuxInt(n)
16879 v7.Aux = typeToAux(t1)
16880 v7.AddArg2(dst, mem)
16881 v5.AddArg3(v6, d4, v7)
16882 v3.AddArg3(v4, d3, v5)
16883 v1.AddArg3(v2, d2, v3)
16884 v.AddArg3(v0, d1, v1)
16885 return true
16886 }
16887
16888
16889
16890 for {
16891 s := auxIntToInt64(v.AuxInt)
16892 t1 := auxToType(v.Aux)
16893 dst := v_0
16894 tmp1 := v_1
16895 midmem := v_2
16896 if midmem.Op != OpMove || auxIntToInt64(midmem.AuxInt) != s {
16897 break
16898 }
16899 t2 := auxToType(midmem.Aux)
16900 src := midmem.Args[1]
16901 tmp2 := midmem.Args[0]
16902 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))) {
16903 break
16904 }
16905 v.reset(OpMove)
16906 v.AuxInt = int64ToAuxInt(s)
16907 v.Aux = typeToAux(t1)
16908 v.AddArg3(dst, src, midmem)
16909 return true
16910 }
16911
16912
16913
16914 for {
16915 s := auxIntToInt64(v.AuxInt)
16916 t1 := auxToType(v.Aux)
16917 dst := v_0
16918 tmp1 := v_1
16919 midmem := v_2
16920 if midmem.Op != OpVarDef {
16921 break
16922 }
16923 midmem_0 := midmem.Args[0]
16924 if midmem_0.Op != OpMove || auxIntToInt64(midmem_0.AuxInt) != s {
16925 break
16926 }
16927 t2 := auxToType(midmem_0.Aux)
16928 src := midmem_0.Args[1]
16929 tmp2 := midmem_0.Args[0]
16930 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))) {
16931 break
16932 }
16933 v.reset(OpMove)
16934 v.AuxInt = int64ToAuxInt(s)
16935 v.Aux = typeToAux(t1)
16936 v.AddArg3(dst, src, midmem)
16937 return true
16938 }
16939
16940
16941
16942 for {
16943 dst := v_0
16944 src := v_1
16945 mem := v_2
16946 if !(isSamePtr(dst, src)) {
16947 break
16948 }
16949 v.copyOf(mem)
16950 return true
16951 }
16952 return false
16953 }
16954 func rewriteValuegeneric_OpMul16(v *Value) bool {
16955 v_1 := v.Args[1]
16956 v_0 := v.Args[0]
16957 b := v.Block
16958 typ := &b.Func.Config.Types
16959
16960
16961 for {
16962 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16963 if v_0.Op != OpConst16 {
16964 continue
16965 }
16966 c := auxIntToInt16(v_0.AuxInt)
16967 if v_1.Op != OpConst16 {
16968 continue
16969 }
16970 d := auxIntToInt16(v_1.AuxInt)
16971 v.reset(OpConst16)
16972 v.AuxInt = int16ToAuxInt(c * d)
16973 return true
16974 }
16975 break
16976 }
16977
16978
16979 for {
16980 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16981 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 1 {
16982 continue
16983 }
16984 x := v_1
16985 v.copyOf(x)
16986 return true
16987 }
16988 break
16989 }
16990
16991
16992 for {
16993 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
16994 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
16995 continue
16996 }
16997 x := v_1
16998 v.reset(OpNeg16)
16999 v.AddArg(x)
17000 return true
17001 }
17002 break
17003 }
17004
17005
17006 for {
17007 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17008 if v_0.Op != OpConst16 {
17009 continue
17010 }
17011 t := v_0.Type
17012 c := auxIntToInt16(v_0.AuxInt)
17013 if v_1.Op != OpNeg16 {
17014 continue
17015 }
17016 x := v_1.Args[0]
17017 v.reset(OpMul16)
17018 v0 := b.NewValue0(v.Pos, OpConst16, t)
17019 v0.AuxInt = int16ToAuxInt(-c)
17020 v.AddArg2(x, v0)
17021 return true
17022 }
17023 break
17024 }
17025
17026
17027 for {
17028 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17029 if v_0.Op != OpNeg16 {
17030 continue
17031 }
17032 x := v_0.Args[0]
17033 if v_1.Op != OpNeg16 {
17034 continue
17035 }
17036 y := v_1.Args[0]
17037 v.reset(OpMul16)
17038 v.AddArg2(x, y)
17039 return true
17040 }
17041 break
17042 }
17043
17044
17045
17046 for {
17047 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17048 if v_0.Op != OpConst16 {
17049 continue
17050 }
17051 t := v_0.Type
17052 c := auxIntToInt16(v_0.AuxInt)
17053 if v_1.Op != OpAdd16 || v_1.Type != t {
17054 continue
17055 }
17056 _ = v_1.Args[1]
17057 v_1_0 := v_1.Args[0]
17058 v_1_1 := v_1.Args[1]
17059 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
17060 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
17061 continue
17062 }
17063 d := auxIntToInt16(v_1_0.AuxInt)
17064 x := v_1_1
17065 if !(!isPowerOfTwo(c)) {
17066 continue
17067 }
17068 v.reset(OpAdd16)
17069 v0 := b.NewValue0(v.Pos, OpConst16, t)
17070 v0.AuxInt = int16ToAuxInt(c * d)
17071 v1 := b.NewValue0(v.Pos, OpMul16, t)
17072 v2 := b.NewValue0(v.Pos, OpConst16, t)
17073 v2.AuxInt = int16ToAuxInt(c)
17074 v1.AddArg2(v2, x)
17075 v.AddArg2(v0, v1)
17076 return true
17077 }
17078 }
17079 break
17080 }
17081
17082
17083 for {
17084 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17085 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
17086 continue
17087 }
17088 v.reset(OpConst16)
17089 v.AuxInt = int16ToAuxInt(0)
17090 return true
17091 }
17092 break
17093 }
17094
17095
17096
17097 for {
17098 t := v.Type
17099 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17100 x := v_0
17101 if v_1.Op != OpConst16 {
17102 continue
17103 }
17104 c := auxIntToInt16(v_1.AuxInt)
17105 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
17106 continue
17107 }
17108 v.reset(OpLsh16x64)
17109 v.Type = t
17110 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17111 v0.AuxInt = int64ToAuxInt(log16(c))
17112 v.AddArg2(x, v0)
17113 return true
17114 }
17115 break
17116 }
17117
17118
17119
17120 for {
17121 t := v.Type
17122 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17123 x := v_0
17124 if v_1.Op != OpConst16 {
17125 continue
17126 }
17127 c := auxIntToInt16(v_1.AuxInt)
17128 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
17129 continue
17130 }
17131 v.reset(OpNeg16)
17132 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
17133 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17134 v1.AuxInt = int64ToAuxInt(log16(-c))
17135 v0.AddArg2(x, v1)
17136 v.AddArg(v0)
17137 return true
17138 }
17139 break
17140 }
17141
17142
17143
17144 for {
17145 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17146 if v_0.Op != OpMul16 {
17147 continue
17148 }
17149 _ = v_0.Args[1]
17150 v_0_0 := v_0.Args[0]
17151 v_0_1 := v_0.Args[1]
17152 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
17153 i := v_0_0
17154 if i.Op != OpConst16 {
17155 continue
17156 }
17157 t := i.Type
17158 z := v_0_1
17159 x := v_1
17160 if !(z.Op != OpConst16 && x.Op != OpConst16) {
17161 continue
17162 }
17163 v.reset(OpMul16)
17164 v0 := b.NewValue0(v.Pos, OpMul16, t)
17165 v0.AddArg2(x, z)
17166 v.AddArg2(i, v0)
17167 return true
17168 }
17169 }
17170 break
17171 }
17172
17173
17174 for {
17175 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17176 if v_0.Op != OpConst16 {
17177 continue
17178 }
17179 t := v_0.Type
17180 c := auxIntToInt16(v_0.AuxInt)
17181 if v_1.Op != OpMul16 {
17182 continue
17183 }
17184 _ = v_1.Args[1]
17185 v_1_0 := v_1.Args[0]
17186 v_1_1 := v_1.Args[1]
17187 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
17188 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
17189 continue
17190 }
17191 d := auxIntToInt16(v_1_0.AuxInt)
17192 x := v_1_1
17193 v.reset(OpMul16)
17194 v0 := b.NewValue0(v.Pos, OpConst16, t)
17195 v0.AuxInt = int16ToAuxInt(c * d)
17196 v.AddArg2(v0, x)
17197 return true
17198 }
17199 }
17200 break
17201 }
17202 return false
17203 }
17204 func rewriteValuegeneric_OpMul32(v *Value) bool {
17205 v_1 := v.Args[1]
17206 v_0 := v.Args[0]
17207 b := v.Block
17208 typ := &b.Func.Config.Types
17209
17210
17211 for {
17212 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17213 if v_0.Op != OpConst32 {
17214 continue
17215 }
17216 c := auxIntToInt32(v_0.AuxInt)
17217 if v_1.Op != OpConst32 {
17218 continue
17219 }
17220 d := auxIntToInt32(v_1.AuxInt)
17221 v.reset(OpConst32)
17222 v.AuxInt = int32ToAuxInt(c * d)
17223 return true
17224 }
17225 break
17226 }
17227
17228
17229 for {
17230 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17231 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 {
17232 continue
17233 }
17234 x := v_1
17235 v.copyOf(x)
17236 return true
17237 }
17238 break
17239 }
17240
17241
17242 for {
17243 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17244 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
17245 continue
17246 }
17247 x := v_1
17248 v.reset(OpNeg32)
17249 v.AddArg(x)
17250 return true
17251 }
17252 break
17253 }
17254
17255
17256 for {
17257 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17258 if v_0.Op != OpConst32 {
17259 continue
17260 }
17261 t := v_0.Type
17262 c := auxIntToInt32(v_0.AuxInt)
17263 if v_1.Op != OpNeg32 {
17264 continue
17265 }
17266 x := v_1.Args[0]
17267 v.reset(OpMul32)
17268 v0 := b.NewValue0(v.Pos, OpConst32, t)
17269 v0.AuxInt = int32ToAuxInt(-c)
17270 v.AddArg2(x, v0)
17271 return true
17272 }
17273 break
17274 }
17275
17276
17277 for {
17278 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17279 if v_0.Op != OpNeg32 {
17280 continue
17281 }
17282 x := v_0.Args[0]
17283 if v_1.Op != OpNeg32 {
17284 continue
17285 }
17286 y := v_1.Args[0]
17287 v.reset(OpMul32)
17288 v.AddArg2(x, y)
17289 return true
17290 }
17291 break
17292 }
17293
17294
17295
17296 for {
17297 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17298 if v_0.Op != OpConst32 {
17299 continue
17300 }
17301 t := v_0.Type
17302 c := auxIntToInt32(v_0.AuxInt)
17303 if v_1.Op != OpAdd32 || v_1.Type != t {
17304 continue
17305 }
17306 _ = v_1.Args[1]
17307 v_1_0 := v_1.Args[0]
17308 v_1_1 := v_1.Args[1]
17309 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
17310 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
17311 continue
17312 }
17313 d := auxIntToInt32(v_1_0.AuxInt)
17314 x := v_1_1
17315 if !(!isPowerOfTwo(c)) {
17316 continue
17317 }
17318 v.reset(OpAdd32)
17319 v0 := b.NewValue0(v.Pos, OpConst32, t)
17320 v0.AuxInt = int32ToAuxInt(c * d)
17321 v1 := b.NewValue0(v.Pos, OpMul32, t)
17322 v2 := b.NewValue0(v.Pos, OpConst32, t)
17323 v2.AuxInt = int32ToAuxInt(c)
17324 v1.AddArg2(v2, x)
17325 v.AddArg2(v0, v1)
17326 return true
17327 }
17328 }
17329 break
17330 }
17331
17332
17333 for {
17334 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17335 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
17336 continue
17337 }
17338 v.reset(OpConst32)
17339 v.AuxInt = int32ToAuxInt(0)
17340 return true
17341 }
17342 break
17343 }
17344
17345
17346
17347 for {
17348 t := v.Type
17349 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17350 x := v_0
17351 if v_1.Op != OpConst32 {
17352 continue
17353 }
17354 c := auxIntToInt32(v_1.AuxInt)
17355 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
17356 continue
17357 }
17358 v.reset(OpLsh32x64)
17359 v.Type = t
17360 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17361 v0.AuxInt = int64ToAuxInt(log32(c))
17362 v.AddArg2(x, v0)
17363 return true
17364 }
17365 break
17366 }
17367
17368
17369
17370 for {
17371 t := v.Type
17372 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17373 x := v_0
17374 if v_1.Op != OpConst32 {
17375 continue
17376 }
17377 c := auxIntToInt32(v_1.AuxInt)
17378 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
17379 continue
17380 }
17381 v.reset(OpNeg32)
17382 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
17383 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17384 v1.AuxInt = int64ToAuxInt(log32(-c))
17385 v0.AddArg2(x, v1)
17386 v.AddArg(v0)
17387 return true
17388 }
17389 break
17390 }
17391
17392
17393
17394 for {
17395 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17396 if v_0.Op != OpMul32 {
17397 continue
17398 }
17399 _ = v_0.Args[1]
17400 v_0_0 := v_0.Args[0]
17401 v_0_1 := v_0.Args[1]
17402 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
17403 i := v_0_0
17404 if i.Op != OpConst32 {
17405 continue
17406 }
17407 t := i.Type
17408 z := v_0_1
17409 x := v_1
17410 if !(z.Op != OpConst32 && x.Op != OpConst32) {
17411 continue
17412 }
17413 v.reset(OpMul32)
17414 v0 := b.NewValue0(v.Pos, OpMul32, t)
17415 v0.AddArg2(x, z)
17416 v.AddArg2(i, v0)
17417 return true
17418 }
17419 }
17420 break
17421 }
17422
17423
17424 for {
17425 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17426 if v_0.Op != OpConst32 {
17427 continue
17428 }
17429 t := v_0.Type
17430 c := auxIntToInt32(v_0.AuxInt)
17431 if v_1.Op != OpMul32 {
17432 continue
17433 }
17434 _ = v_1.Args[1]
17435 v_1_0 := v_1.Args[0]
17436 v_1_1 := v_1.Args[1]
17437 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
17438 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
17439 continue
17440 }
17441 d := auxIntToInt32(v_1_0.AuxInt)
17442 x := v_1_1
17443 v.reset(OpMul32)
17444 v0 := b.NewValue0(v.Pos, OpConst32, t)
17445 v0.AuxInt = int32ToAuxInt(c * d)
17446 v.AddArg2(v0, x)
17447 return true
17448 }
17449 }
17450 break
17451 }
17452 return false
17453 }
17454 func rewriteValuegeneric_OpMul32F(v *Value) bool {
17455 v_1 := v.Args[1]
17456 v_0 := v.Args[0]
17457
17458
17459
17460 for {
17461 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17462 if v_0.Op != OpConst32F {
17463 continue
17464 }
17465 c := auxIntToFloat32(v_0.AuxInt)
17466 if v_1.Op != OpConst32F {
17467 continue
17468 }
17469 d := auxIntToFloat32(v_1.AuxInt)
17470 if !(c*d == c*d) {
17471 continue
17472 }
17473 v.reset(OpConst32F)
17474 v.AuxInt = float32ToAuxInt(c * d)
17475 return true
17476 }
17477 break
17478 }
17479
17480
17481 for {
17482 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17483 x := v_0
17484 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != 1 {
17485 continue
17486 }
17487 v.copyOf(x)
17488 return true
17489 }
17490 break
17491 }
17492
17493
17494 for {
17495 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17496 x := v_0
17497 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != -1 {
17498 continue
17499 }
17500 v.reset(OpNeg32F)
17501 v.AddArg(x)
17502 return true
17503 }
17504 break
17505 }
17506
17507
17508 for {
17509 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17510 x := v_0
17511 if v_1.Op != OpConst32F || auxIntToFloat32(v_1.AuxInt) != 2 {
17512 continue
17513 }
17514 v.reset(OpAdd32F)
17515 v.AddArg2(x, x)
17516 return true
17517 }
17518 break
17519 }
17520 return false
17521 }
17522 func rewriteValuegeneric_OpMul32uhilo(v *Value) bool {
17523 v_1 := v.Args[1]
17524 v_0 := v.Args[0]
17525 b := v.Block
17526 typ := &b.Func.Config.Types
17527
17528
17529 for {
17530 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17531 if v_0.Op != OpConst32 {
17532 continue
17533 }
17534 c := auxIntToInt32(v_0.AuxInt)
17535 if v_1.Op != OpConst32 {
17536 continue
17537 }
17538 d := auxIntToInt32(v_1.AuxInt)
17539 v.reset(OpMakeTuple)
17540 v0 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
17541 v0.AuxInt = int32ToAuxInt(bitsMulU32(c, d).hi)
17542 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
17543 v1.AuxInt = int32ToAuxInt(bitsMulU32(c, d).lo)
17544 v.AddArg2(v0, v1)
17545 return true
17546 }
17547 break
17548 }
17549 return false
17550 }
17551 func rewriteValuegeneric_OpMul32uover(v *Value) bool {
17552 v_1 := v.Args[1]
17553 v_0 := v.Args[0]
17554 b := v.Block
17555 typ := &b.Func.Config.Types
17556
17557
17558 for {
17559 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17560 if v_0.Op != OpConst32 {
17561 continue
17562 }
17563 c := auxIntToInt32(v_0.AuxInt)
17564 if v_1.Op != OpConst32 {
17565 continue
17566 }
17567 d := auxIntToInt32(v_1.AuxInt)
17568 v.reset(OpMakeTuple)
17569 v0 := b.NewValue0(v.Pos, OpConst32, typ.UInt32)
17570 v0.AuxInt = int32ToAuxInt(bitsMulU32(c, d).lo)
17571 v1 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
17572 v1.AuxInt = boolToAuxInt(bitsMulU32(c, d).hi != 0)
17573 v.AddArg2(v0, v1)
17574 return true
17575 }
17576 break
17577 }
17578
17579
17580 for {
17581 t := v.Type
17582 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17583 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 1 {
17584 continue
17585 }
17586 x := v_1
17587 v.reset(OpMakeTuple)
17588 v0 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
17589 v0.AuxInt = boolToAuxInt(false)
17590 v.AddArg2(x, v0)
17591 return true
17592 }
17593 break
17594 }
17595
17596
17597 for {
17598 t := v.Type
17599 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17600 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
17601 continue
17602 }
17603 v.reset(OpMakeTuple)
17604 v0 := b.NewValue0(v.Pos, OpConst32, t.FieldType(0))
17605 v0.AuxInt = int32ToAuxInt(0)
17606 v1 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
17607 v1.AuxInt = boolToAuxInt(false)
17608 v.AddArg2(v0, v1)
17609 return true
17610 }
17611 break
17612 }
17613 return false
17614 }
17615 func rewriteValuegeneric_OpMul64(v *Value) bool {
17616 v_1 := v.Args[1]
17617 v_0 := v.Args[0]
17618 b := v.Block
17619 typ := &b.Func.Config.Types
17620
17621
17622 for {
17623 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17624 if v_0.Op != OpConst64 {
17625 continue
17626 }
17627 c := auxIntToInt64(v_0.AuxInt)
17628 if v_1.Op != OpConst64 {
17629 continue
17630 }
17631 d := auxIntToInt64(v_1.AuxInt)
17632 v.reset(OpConst64)
17633 v.AuxInt = int64ToAuxInt(c * d)
17634 return true
17635 }
17636 break
17637 }
17638
17639
17640 for {
17641 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17642 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 {
17643 continue
17644 }
17645 x := v_1
17646 v.copyOf(x)
17647 return true
17648 }
17649 break
17650 }
17651
17652
17653 for {
17654 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17655 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
17656 continue
17657 }
17658 x := v_1
17659 v.reset(OpNeg64)
17660 v.AddArg(x)
17661 return true
17662 }
17663 break
17664 }
17665
17666
17667 for {
17668 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17669 if v_0.Op != OpConst64 {
17670 continue
17671 }
17672 t := v_0.Type
17673 c := auxIntToInt64(v_0.AuxInt)
17674 if v_1.Op != OpNeg64 {
17675 continue
17676 }
17677 x := v_1.Args[0]
17678 v.reset(OpMul64)
17679 v0 := b.NewValue0(v.Pos, OpConst64, t)
17680 v0.AuxInt = int64ToAuxInt(-c)
17681 v.AddArg2(x, v0)
17682 return true
17683 }
17684 break
17685 }
17686
17687
17688 for {
17689 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17690 if v_0.Op != OpNeg64 {
17691 continue
17692 }
17693 x := v_0.Args[0]
17694 if v_1.Op != OpNeg64 {
17695 continue
17696 }
17697 y := v_1.Args[0]
17698 v.reset(OpMul64)
17699 v.AddArg2(x, y)
17700 return true
17701 }
17702 break
17703 }
17704
17705
17706
17707 for {
17708 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17709 if v_0.Op != OpConst64 {
17710 continue
17711 }
17712 t := v_0.Type
17713 c := auxIntToInt64(v_0.AuxInt)
17714 if v_1.Op != OpAdd64 || v_1.Type != t {
17715 continue
17716 }
17717 _ = v_1.Args[1]
17718 v_1_0 := v_1.Args[0]
17719 v_1_1 := v_1.Args[1]
17720 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
17721 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
17722 continue
17723 }
17724 d := auxIntToInt64(v_1_0.AuxInt)
17725 x := v_1_1
17726 if !(!isPowerOfTwo(c)) {
17727 continue
17728 }
17729 v.reset(OpAdd64)
17730 v0 := b.NewValue0(v.Pos, OpConst64, t)
17731 v0.AuxInt = int64ToAuxInt(c * d)
17732 v1 := b.NewValue0(v.Pos, OpMul64, t)
17733 v2 := b.NewValue0(v.Pos, OpConst64, t)
17734 v2.AuxInt = int64ToAuxInt(c)
17735 v1.AddArg2(v2, x)
17736 v.AddArg2(v0, v1)
17737 return true
17738 }
17739 }
17740 break
17741 }
17742
17743
17744 for {
17745 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17746 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
17747 continue
17748 }
17749 v.reset(OpConst64)
17750 v.AuxInt = int64ToAuxInt(0)
17751 return true
17752 }
17753 break
17754 }
17755
17756
17757
17758 for {
17759 t := v.Type
17760 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17761 x := v_0
17762 if v_1.Op != OpConst64 {
17763 continue
17764 }
17765 c := auxIntToInt64(v_1.AuxInt)
17766 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
17767 continue
17768 }
17769 v.reset(OpLsh64x64)
17770 v.Type = t
17771 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17772 v0.AuxInt = int64ToAuxInt(log64(c))
17773 v.AddArg2(x, v0)
17774 return true
17775 }
17776 break
17777 }
17778
17779
17780
17781 for {
17782 t := v.Type
17783 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17784 x := v_0
17785 if v_1.Op != OpConst64 {
17786 continue
17787 }
17788 c := auxIntToInt64(v_1.AuxInt)
17789 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
17790 continue
17791 }
17792 v.reset(OpNeg64)
17793 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
17794 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17795 v1.AuxInt = int64ToAuxInt(log64(-c))
17796 v0.AddArg2(x, v1)
17797 v.AddArg(v0)
17798 return true
17799 }
17800 break
17801 }
17802
17803
17804
17805 for {
17806 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17807 if v_0.Op != OpMul64 {
17808 continue
17809 }
17810 _ = v_0.Args[1]
17811 v_0_0 := v_0.Args[0]
17812 v_0_1 := v_0.Args[1]
17813 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
17814 i := v_0_0
17815 if i.Op != OpConst64 {
17816 continue
17817 }
17818 t := i.Type
17819 z := v_0_1
17820 x := v_1
17821 if !(z.Op != OpConst64 && x.Op != OpConst64) {
17822 continue
17823 }
17824 v.reset(OpMul64)
17825 v0 := b.NewValue0(v.Pos, OpMul64, t)
17826 v0.AddArg2(x, z)
17827 v.AddArg2(i, v0)
17828 return true
17829 }
17830 }
17831 break
17832 }
17833
17834
17835 for {
17836 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17837 if v_0.Op != OpConst64 {
17838 continue
17839 }
17840 t := v_0.Type
17841 c := auxIntToInt64(v_0.AuxInt)
17842 if v_1.Op != OpMul64 {
17843 continue
17844 }
17845 _ = v_1.Args[1]
17846 v_1_0 := v_1.Args[0]
17847 v_1_1 := v_1.Args[1]
17848 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
17849 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
17850 continue
17851 }
17852 d := auxIntToInt64(v_1_0.AuxInt)
17853 x := v_1_1
17854 v.reset(OpMul64)
17855 v0 := b.NewValue0(v.Pos, OpConst64, t)
17856 v0.AuxInt = int64ToAuxInt(c * d)
17857 v.AddArg2(v0, x)
17858 return true
17859 }
17860 }
17861 break
17862 }
17863 return false
17864 }
17865 func rewriteValuegeneric_OpMul64F(v *Value) bool {
17866 v_1 := v.Args[1]
17867 v_0 := v.Args[0]
17868
17869
17870
17871 for {
17872 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17873 if v_0.Op != OpConst64F {
17874 continue
17875 }
17876 c := auxIntToFloat64(v_0.AuxInt)
17877 if v_1.Op != OpConst64F {
17878 continue
17879 }
17880 d := auxIntToFloat64(v_1.AuxInt)
17881 if !(c*d == c*d) {
17882 continue
17883 }
17884 v.reset(OpConst64F)
17885 v.AuxInt = float64ToAuxInt(c * d)
17886 return true
17887 }
17888 break
17889 }
17890
17891
17892 for {
17893 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17894 x := v_0
17895 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != 1 {
17896 continue
17897 }
17898 v.copyOf(x)
17899 return true
17900 }
17901 break
17902 }
17903
17904
17905 for {
17906 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17907 x := v_0
17908 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != -1 {
17909 continue
17910 }
17911 v.reset(OpNeg64F)
17912 v.AddArg(x)
17913 return true
17914 }
17915 break
17916 }
17917
17918
17919 for {
17920 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17921 x := v_0
17922 if v_1.Op != OpConst64F || auxIntToFloat64(v_1.AuxInt) != 2 {
17923 continue
17924 }
17925 v.reset(OpAdd64F)
17926 v.AddArg2(x, x)
17927 return true
17928 }
17929 break
17930 }
17931 return false
17932 }
17933 func rewriteValuegeneric_OpMul64uhilo(v *Value) bool {
17934 v_1 := v.Args[1]
17935 v_0 := v.Args[0]
17936 b := v.Block
17937 typ := &b.Func.Config.Types
17938
17939
17940 for {
17941 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17942 if v_0.Op != OpConst64 {
17943 continue
17944 }
17945 c := auxIntToInt64(v_0.AuxInt)
17946 if v_1.Op != OpConst64 {
17947 continue
17948 }
17949 d := auxIntToInt64(v_1.AuxInt)
17950 v.reset(OpMakeTuple)
17951 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17952 v0.AuxInt = int64ToAuxInt(bitsMulU64(c, d).hi)
17953 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17954 v1.AuxInt = int64ToAuxInt(bitsMulU64(c, d).lo)
17955 v.AddArg2(v0, v1)
17956 return true
17957 }
17958 break
17959 }
17960 return false
17961 }
17962 func rewriteValuegeneric_OpMul64uover(v *Value) bool {
17963 v_1 := v.Args[1]
17964 v_0 := v.Args[0]
17965 b := v.Block
17966 typ := &b.Func.Config.Types
17967
17968
17969 for {
17970 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17971 if v_0.Op != OpConst64 {
17972 continue
17973 }
17974 c := auxIntToInt64(v_0.AuxInt)
17975 if v_1.Op != OpConst64 {
17976 continue
17977 }
17978 d := auxIntToInt64(v_1.AuxInt)
17979 v.reset(OpMakeTuple)
17980 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
17981 v0.AuxInt = int64ToAuxInt(bitsMulU64(c, d).lo)
17982 v1 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
17983 v1.AuxInt = boolToAuxInt(bitsMulU64(c, d).hi != 0)
17984 v.AddArg2(v0, v1)
17985 return true
17986 }
17987 break
17988 }
17989
17990
17991 for {
17992 t := v.Type
17993 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
17994 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 1 {
17995 continue
17996 }
17997 x := v_1
17998 v.reset(OpMakeTuple)
17999 v0 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
18000 v0.AuxInt = boolToAuxInt(false)
18001 v.AddArg2(x, v0)
18002 return true
18003 }
18004 break
18005 }
18006
18007
18008 for {
18009 t := v.Type
18010 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18011 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
18012 continue
18013 }
18014 v.reset(OpMakeTuple)
18015 v0 := b.NewValue0(v.Pos, OpConst64, t.FieldType(0))
18016 v0.AuxInt = int64ToAuxInt(0)
18017 v1 := b.NewValue0(v.Pos, OpConstBool, t.FieldType(1))
18018 v1.AuxInt = boolToAuxInt(false)
18019 v.AddArg2(v0, v1)
18020 return true
18021 }
18022 break
18023 }
18024 return false
18025 }
18026 func rewriteValuegeneric_OpMul8(v *Value) bool {
18027 v_1 := v.Args[1]
18028 v_0 := v.Args[0]
18029 b := v.Block
18030 typ := &b.Func.Config.Types
18031
18032
18033 for {
18034 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18035 if v_0.Op != OpConst8 {
18036 continue
18037 }
18038 c := auxIntToInt8(v_0.AuxInt)
18039 if v_1.Op != OpConst8 {
18040 continue
18041 }
18042 d := auxIntToInt8(v_1.AuxInt)
18043 v.reset(OpConst8)
18044 v.AuxInt = int8ToAuxInt(c * d)
18045 return true
18046 }
18047 break
18048 }
18049
18050
18051 for {
18052 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18053 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 1 {
18054 continue
18055 }
18056 x := v_1
18057 v.copyOf(x)
18058 return true
18059 }
18060 break
18061 }
18062
18063
18064 for {
18065 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18066 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
18067 continue
18068 }
18069 x := v_1
18070 v.reset(OpNeg8)
18071 v.AddArg(x)
18072 return true
18073 }
18074 break
18075 }
18076
18077
18078 for {
18079 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18080 if v_0.Op != OpConst8 {
18081 continue
18082 }
18083 t := v_0.Type
18084 c := auxIntToInt8(v_0.AuxInt)
18085 if v_1.Op != OpNeg8 {
18086 continue
18087 }
18088 x := v_1.Args[0]
18089 v.reset(OpMul8)
18090 v0 := b.NewValue0(v.Pos, OpConst8, t)
18091 v0.AuxInt = int8ToAuxInt(-c)
18092 v.AddArg2(x, v0)
18093 return true
18094 }
18095 break
18096 }
18097
18098
18099 for {
18100 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18101 if v_0.Op != OpNeg8 {
18102 continue
18103 }
18104 x := v_0.Args[0]
18105 if v_1.Op != OpNeg8 {
18106 continue
18107 }
18108 y := v_1.Args[0]
18109 v.reset(OpMul8)
18110 v.AddArg2(x, y)
18111 return true
18112 }
18113 break
18114 }
18115
18116
18117
18118 for {
18119 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18120 if v_0.Op != OpConst8 {
18121 continue
18122 }
18123 t := v_0.Type
18124 c := auxIntToInt8(v_0.AuxInt)
18125 if v_1.Op != OpAdd8 || v_1.Type != t {
18126 continue
18127 }
18128 _ = v_1.Args[1]
18129 v_1_0 := v_1.Args[0]
18130 v_1_1 := v_1.Args[1]
18131 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18132 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
18133 continue
18134 }
18135 d := auxIntToInt8(v_1_0.AuxInt)
18136 x := v_1_1
18137 if !(!isPowerOfTwo(c)) {
18138 continue
18139 }
18140 v.reset(OpAdd8)
18141 v0 := b.NewValue0(v.Pos, OpConst8, t)
18142 v0.AuxInt = int8ToAuxInt(c * d)
18143 v1 := b.NewValue0(v.Pos, OpMul8, t)
18144 v2 := b.NewValue0(v.Pos, OpConst8, t)
18145 v2.AuxInt = int8ToAuxInt(c)
18146 v1.AddArg2(v2, x)
18147 v.AddArg2(v0, v1)
18148 return true
18149 }
18150 }
18151 break
18152 }
18153
18154
18155 for {
18156 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18157 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
18158 continue
18159 }
18160 v.reset(OpConst8)
18161 v.AuxInt = int8ToAuxInt(0)
18162 return true
18163 }
18164 break
18165 }
18166
18167
18168
18169 for {
18170 t := v.Type
18171 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18172 x := v_0
18173 if v_1.Op != OpConst8 {
18174 continue
18175 }
18176 c := auxIntToInt8(v_1.AuxInt)
18177 if !(isPowerOfTwo(c) && v.Block.Func.pass.name != "opt") {
18178 continue
18179 }
18180 v.reset(OpLsh8x64)
18181 v.Type = t
18182 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18183 v0.AuxInt = int64ToAuxInt(log8(c))
18184 v.AddArg2(x, v0)
18185 return true
18186 }
18187 break
18188 }
18189
18190
18191
18192 for {
18193 t := v.Type
18194 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18195 x := v_0
18196 if v_1.Op != OpConst8 {
18197 continue
18198 }
18199 c := auxIntToInt8(v_1.AuxInt)
18200 if !(t.IsSigned() && isPowerOfTwo(-c) && v.Block.Func.pass.name != "opt") {
18201 continue
18202 }
18203 v.reset(OpNeg8)
18204 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
18205 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
18206 v1.AuxInt = int64ToAuxInt(log8(-c))
18207 v0.AddArg2(x, v1)
18208 v.AddArg(v0)
18209 return true
18210 }
18211 break
18212 }
18213
18214
18215
18216 for {
18217 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18218 if v_0.Op != OpMul8 {
18219 continue
18220 }
18221 _ = v_0.Args[1]
18222 v_0_0 := v_0.Args[0]
18223 v_0_1 := v_0.Args[1]
18224 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18225 i := v_0_0
18226 if i.Op != OpConst8 {
18227 continue
18228 }
18229 t := i.Type
18230 z := v_0_1
18231 x := v_1
18232 if !(z.Op != OpConst8 && x.Op != OpConst8) {
18233 continue
18234 }
18235 v.reset(OpMul8)
18236 v0 := b.NewValue0(v.Pos, OpMul8, t)
18237 v0.AddArg2(x, z)
18238 v.AddArg2(i, v0)
18239 return true
18240 }
18241 }
18242 break
18243 }
18244
18245
18246 for {
18247 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18248 if v_0.Op != OpConst8 {
18249 continue
18250 }
18251 t := v_0.Type
18252 c := auxIntToInt8(v_0.AuxInt)
18253 if v_1.Op != OpMul8 {
18254 continue
18255 }
18256 _ = v_1.Args[1]
18257 v_1_0 := v_1.Args[0]
18258 v_1_1 := v_1.Args[1]
18259 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18260 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
18261 continue
18262 }
18263 d := auxIntToInt8(v_1_0.AuxInt)
18264 x := v_1_1
18265 v.reset(OpMul8)
18266 v0 := b.NewValue0(v.Pos, OpConst8, t)
18267 v0.AuxInt = int8ToAuxInt(c * d)
18268 v.AddArg2(v0, x)
18269 return true
18270 }
18271 }
18272 break
18273 }
18274 return false
18275 }
18276 func rewriteValuegeneric_OpNeg16(v *Value) bool {
18277 v_0 := v.Args[0]
18278 b := v.Block
18279
18280
18281 for {
18282 if v_0.Op != OpConst16 {
18283 break
18284 }
18285 c := auxIntToInt16(v_0.AuxInt)
18286 v.reset(OpConst16)
18287 v.AuxInt = int16ToAuxInt(-c)
18288 return true
18289 }
18290
18291
18292 for {
18293 if v_0.Op != OpMul16 {
18294 break
18295 }
18296 _ = v_0.Args[1]
18297 v_0_0 := v_0.Args[0]
18298 v_0_1 := v_0.Args[1]
18299 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18300 x := v_0_0
18301 if v_0_1.Op != OpConst16 {
18302 continue
18303 }
18304 t := v_0_1.Type
18305 c := auxIntToInt16(v_0_1.AuxInt)
18306 v.reset(OpMul16)
18307 v0 := b.NewValue0(v.Pos, OpConst16, t)
18308 v0.AuxInt = int16ToAuxInt(-c)
18309 v.AddArg2(x, v0)
18310 return true
18311 }
18312 break
18313 }
18314
18315
18316 for {
18317 if v_0.Op != OpMul16 {
18318 break
18319 }
18320 _ = v_0.Args[1]
18321 v_0_0 := v_0.Args[0]
18322 v_0_1 := v_0.Args[1]
18323 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18324 x := v_0_0
18325 if v_0_1.Op != OpNeg16 {
18326 continue
18327 }
18328 y := v_0_1.Args[0]
18329 v.reset(OpMul16)
18330 v.AddArg2(x, y)
18331 return true
18332 }
18333 break
18334 }
18335
18336
18337 for {
18338 if v_0.Op != OpSub16 {
18339 break
18340 }
18341 y := v_0.Args[1]
18342 x := v_0.Args[0]
18343 v.reset(OpSub16)
18344 v.AddArg2(y, x)
18345 return true
18346 }
18347
18348
18349 for {
18350 if v_0.Op != OpNeg16 {
18351 break
18352 }
18353 x := v_0.Args[0]
18354 v.copyOf(x)
18355 return true
18356 }
18357
18358
18359 for {
18360 t := v.Type
18361 if v_0.Op != OpCom16 {
18362 break
18363 }
18364 x := v_0.Args[0]
18365 v.reset(OpAdd16)
18366 v0 := b.NewValue0(v.Pos, OpConst16, t)
18367 v0.AuxInt = int16ToAuxInt(1)
18368 v.AddArg2(v0, x)
18369 return true
18370 }
18371 return false
18372 }
18373 func rewriteValuegeneric_OpNeg32(v *Value) bool {
18374 v_0 := v.Args[0]
18375 b := v.Block
18376
18377
18378 for {
18379 if v_0.Op != OpConst32 {
18380 break
18381 }
18382 c := auxIntToInt32(v_0.AuxInt)
18383 v.reset(OpConst32)
18384 v.AuxInt = int32ToAuxInt(-c)
18385 return true
18386 }
18387
18388
18389 for {
18390 if v_0.Op != OpMul32 {
18391 break
18392 }
18393 _ = v_0.Args[1]
18394 v_0_0 := v_0.Args[0]
18395 v_0_1 := v_0.Args[1]
18396 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18397 x := v_0_0
18398 if v_0_1.Op != OpConst32 {
18399 continue
18400 }
18401 t := v_0_1.Type
18402 c := auxIntToInt32(v_0_1.AuxInt)
18403 v.reset(OpMul32)
18404 v0 := b.NewValue0(v.Pos, OpConst32, t)
18405 v0.AuxInt = int32ToAuxInt(-c)
18406 v.AddArg2(x, v0)
18407 return true
18408 }
18409 break
18410 }
18411
18412
18413 for {
18414 if v_0.Op != OpMul32 {
18415 break
18416 }
18417 _ = v_0.Args[1]
18418 v_0_0 := v_0.Args[0]
18419 v_0_1 := v_0.Args[1]
18420 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18421 x := v_0_0
18422 if v_0_1.Op != OpNeg32 {
18423 continue
18424 }
18425 y := v_0_1.Args[0]
18426 v.reset(OpMul32)
18427 v.AddArg2(x, y)
18428 return true
18429 }
18430 break
18431 }
18432
18433
18434 for {
18435 if v_0.Op != OpSub32 {
18436 break
18437 }
18438 y := v_0.Args[1]
18439 x := v_0.Args[0]
18440 v.reset(OpSub32)
18441 v.AddArg2(y, x)
18442 return true
18443 }
18444
18445
18446 for {
18447 if v_0.Op != OpNeg32 {
18448 break
18449 }
18450 x := v_0.Args[0]
18451 v.copyOf(x)
18452 return true
18453 }
18454
18455
18456 for {
18457 t := v.Type
18458 if v_0.Op != OpCom32 {
18459 break
18460 }
18461 x := v_0.Args[0]
18462 v.reset(OpAdd32)
18463 v0 := b.NewValue0(v.Pos, OpConst32, t)
18464 v0.AuxInt = int32ToAuxInt(1)
18465 v.AddArg2(v0, x)
18466 return true
18467 }
18468 return false
18469 }
18470 func rewriteValuegeneric_OpNeg32F(v *Value) bool {
18471 v_0 := v.Args[0]
18472
18473
18474
18475 for {
18476 if v_0.Op != OpConst32F {
18477 break
18478 }
18479 c := auxIntToFloat32(v_0.AuxInt)
18480 if !(c != 0) {
18481 break
18482 }
18483 v.reset(OpConst32F)
18484 v.AuxInt = float32ToAuxInt(-c)
18485 return true
18486 }
18487 return false
18488 }
18489 func rewriteValuegeneric_OpNeg64(v *Value) bool {
18490 v_0 := v.Args[0]
18491 b := v.Block
18492
18493
18494 for {
18495 if v_0.Op != OpConst64 {
18496 break
18497 }
18498 c := auxIntToInt64(v_0.AuxInt)
18499 v.reset(OpConst64)
18500 v.AuxInt = int64ToAuxInt(-c)
18501 return true
18502 }
18503
18504
18505 for {
18506 if v_0.Op != OpMul64 {
18507 break
18508 }
18509 _ = v_0.Args[1]
18510 v_0_0 := v_0.Args[0]
18511 v_0_1 := v_0.Args[1]
18512 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18513 x := v_0_0
18514 if v_0_1.Op != OpConst64 {
18515 continue
18516 }
18517 t := v_0_1.Type
18518 c := auxIntToInt64(v_0_1.AuxInt)
18519 v.reset(OpMul64)
18520 v0 := b.NewValue0(v.Pos, OpConst64, t)
18521 v0.AuxInt = int64ToAuxInt(-c)
18522 v.AddArg2(x, v0)
18523 return true
18524 }
18525 break
18526 }
18527
18528
18529 for {
18530 if v_0.Op != OpMul64 {
18531 break
18532 }
18533 _ = v_0.Args[1]
18534 v_0_0 := v_0.Args[0]
18535 v_0_1 := v_0.Args[1]
18536 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18537 x := v_0_0
18538 if v_0_1.Op != OpNeg64 {
18539 continue
18540 }
18541 y := v_0_1.Args[0]
18542 v.reset(OpMul64)
18543 v.AddArg2(x, y)
18544 return true
18545 }
18546 break
18547 }
18548
18549
18550 for {
18551 if v_0.Op != OpSub64 {
18552 break
18553 }
18554 y := v_0.Args[1]
18555 x := v_0.Args[0]
18556 v.reset(OpSub64)
18557 v.AddArg2(y, x)
18558 return true
18559 }
18560
18561
18562 for {
18563 if v_0.Op != OpNeg64 {
18564 break
18565 }
18566 x := v_0.Args[0]
18567 v.copyOf(x)
18568 return true
18569 }
18570
18571
18572 for {
18573 t := v.Type
18574 if v_0.Op != OpCom64 {
18575 break
18576 }
18577 x := v_0.Args[0]
18578 v.reset(OpAdd64)
18579 v0 := b.NewValue0(v.Pos, OpConst64, t)
18580 v0.AuxInt = int64ToAuxInt(1)
18581 v.AddArg2(v0, x)
18582 return true
18583 }
18584 return false
18585 }
18586 func rewriteValuegeneric_OpNeg64F(v *Value) bool {
18587 v_0 := v.Args[0]
18588
18589
18590
18591 for {
18592 if v_0.Op != OpConst64F {
18593 break
18594 }
18595 c := auxIntToFloat64(v_0.AuxInt)
18596 if !(c != 0) {
18597 break
18598 }
18599 v.reset(OpConst64F)
18600 v.AuxInt = float64ToAuxInt(-c)
18601 return true
18602 }
18603 return false
18604 }
18605 func rewriteValuegeneric_OpNeg8(v *Value) bool {
18606 v_0 := v.Args[0]
18607 b := v.Block
18608
18609
18610 for {
18611 if v_0.Op != OpConst8 {
18612 break
18613 }
18614 c := auxIntToInt8(v_0.AuxInt)
18615 v.reset(OpConst8)
18616 v.AuxInt = int8ToAuxInt(-c)
18617 return true
18618 }
18619
18620
18621 for {
18622 if v_0.Op != OpMul8 {
18623 break
18624 }
18625 _ = v_0.Args[1]
18626 v_0_0 := v_0.Args[0]
18627 v_0_1 := v_0.Args[1]
18628 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18629 x := v_0_0
18630 if v_0_1.Op != OpConst8 {
18631 continue
18632 }
18633 t := v_0_1.Type
18634 c := auxIntToInt8(v_0_1.AuxInt)
18635 v.reset(OpMul8)
18636 v0 := b.NewValue0(v.Pos, OpConst8, t)
18637 v0.AuxInt = int8ToAuxInt(-c)
18638 v.AddArg2(x, v0)
18639 return true
18640 }
18641 break
18642 }
18643
18644
18645 for {
18646 if v_0.Op != OpMul8 {
18647 break
18648 }
18649 _ = v_0.Args[1]
18650 v_0_0 := v_0.Args[0]
18651 v_0_1 := v_0.Args[1]
18652 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
18653 x := v_0_0
18654 if v_0_1.Op != OpNeg8 {
18655 continue
18656 }
18657 y := v_0_1.Args[0]
18658 v.reset(OpMul8)
18659 v.AddArg2(x, y)
18660 return true
18661 }
18662 break
18663 }
18664
18665
18666 for {
18667 if v_0.Op != OpSub8 {
18668 break
18669 }
18670 y := v_0.Args[1]
18671 x := v_0.Args[0]
18672 v.reset(OpSub8)
18673 v.AddArg2(y, x)
18674 return true
18675 }
18676
18677
18678 for {
18679 if v_0.Op != OpNeg8 {
18680 break
18681 }
18682 x := v_0.Args[0]
18683 v.copyOf(x)
18684 return true
18685 }
18686
18687
18688 for {
18689 t := v.Type
18690 if v_0.Op != OpCom8 {
18691 break
18692 }
18693 x := v_0.Args[0]
18694 v.reset(OpAdd8)
18695 v0 := b.NewValue0(v.Pos, OpConst8, t)
18696 v0.AuxInt = int8ToAuxInt(1)
18697 v.AddArg2(v0, x)
18698 return true
18699 }
18700 return false
18701 }
18702 func rewriteValuegeneric_OpNeq16(v *Value) bool {
18703 v_1 := v.Args[1]
18704 v_0 := v.Args[0]
18705 b := v.Block
18706
18707
18708 for {
18709 x := v_0
18710 if x != v_1 {
18711 break
18712 }
18713 v.reset(OpConstBool)
18714 v.AuxInt = boolToAuxInt(false)
18715 return true
18716 }
18717
18718
18719 for {
18720 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18721 if v_0.Op != OpConst16 {
18722 continue
18723 }
18724 t := v_0.Type
18725 c := auxIntToInt16(v_0.AuxInt)
18726 if v_1.Op != OpAdd16 {
18727 continue
18728 }
18729 _ = v_1.Args[1]
18730 v_1_0 := v_1.Args[0]
18731 v_1_1 := v_1.Args[1]
18732 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18733 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
18734 continue
18735 }
18736 d := auxIntToInt16(v_1_0.AuxInt)
18737 x := v_1_1
18738 v.reset(OpNeq16)
18739 v0 := b.NewValue0(v.Pos, OpConst16, t)
18740 v0.AuxInt = int16ToAuxInt(c - d)
18741 v.AddArg2(v0, x)
18742 return true
18743 }
18744 }
18745 break
18746 }
18747
18748
18749 for {
18750 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18751 if v_0.Op != OpConst16 {
18752 continue
18753 }
18754 c := auxIntToInt16(v_0.AuxInt)
18755 if v_1.Op != OpConst16 {
18756 continue
18757 }
18758 d := auxIntToInt16(v_1.AuxInt)
18759 v.reset(OpConstBool)
18760 v.AuxInt = boolToAuxInt(c != d)
18761 return true
18762 }
18763 break
18764 }
18765
18766
18767
18768 for {
18769 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18770 s := v_0
18771 if s.Op != OpSub16 {
18772 continue
18773 }
18774 y := s.Args[1]
18775 x := s.Args[0]
18776 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 || !(s.Uses == 1) {
18777 continue
18778 }
18779 v.reset(OpNeq16)
18780 v.AddArg2(x, y)
18781 return true
18782 }
18783 break
18784 }
18785
18786
18787
18788 for {
18789 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18790 if v_0.Op != OpAnd16 {
18791 continue
18792 }
18793 t := v_0.Type
18794 _ = v_0.Args[1]
18795 v_0_0 := v_0.Args[0]
18796 v_0_1 := v_0.Args[1]
18797 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18798 x := v_0_0
18799 if v_0_1.Op != OpConst16 || v_0_1.Type != t {
18800 continue
18801 }
18802 y := auxIntToInt16(v_0_1.AuxInt)
18803 if v_1.Op != OpConst16 || v_1.Type != t || auxIntToInt16(v_1.AuxInt) != y || !(oneBit(y)) {
18804 continue
18805 }
18806 v.reset(OpEq16)
18807 v0 := b.NewValue0(v.Pos, OpAnd16, t)
18808 v1 := b.NewValue0(v.Pos, OpConst16, t)
18809 v1.AuxInt = int16ToAuxInt(y)
18810 v0.AddArg2(x, v1)
18811 v2 := b.NewValue0(v.Pos, OpConst16, t)
18812 v2.AuxInt = int16ToAuxInt(0)
18813 v.AddArg2(v0, v2)
18814 return true
18815 }
18816 }
18817 break
18818 }
18819
18820
18821 for {
18822 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18823 if v_0.Op != OpZeroExt8to16 {
18824 continue
18825 }
18826 v_0_0 := v_0.Args[0]
18827 if v_0_0.Op != OpCvtBoolToUint8 {
18828 continue
18829 }
18830 x := v_0_0.Args[0]
18831 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
18832 continue
18833 }
18834 v.copyOf(x)
18835 return true
18836 }
18837 break
18838 }
18839
18840
18841 for {
18842 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18843 if v_0.Op != OpZeroExt8to16 {
18844 continue
18845 }
18846 v_0_0 := v_0.Args[0]
18847 if v_0_0.Op != OpCvtBoolToUint8 {
18848 continue
18849 }
18850 x := v_0_0.Args[0]
18851 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
18852 continue
18853 }
18854 v.reset(OpNot)
18855 v.AddArg(x)
18856 return true
18857 }
18858 break
18859 }
18860
18861
18862 for {
18863 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18864 if v_0.Op != OpSignExt8to16 {
18865 continue
18866 }
18867 v_0_0 := v_0.Args[0]
18868 if v_0_0.Op != OpCvtBoolToUint8 {
18869 continue
18870 }
18871 x := v_0_0.Args[0]
18872 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 {
18873 continue
18874 }
18875 v.copyOf(x)
18876 return true
18877 }
18878 break
18879 }
18880
18881
18882 for {
18883 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18884 if v_0.Op != OpSignExt8to16 {
18885 continue
18886 }
18887 v_0_0 := v_0.Args[0]
18888 if v_0_0.Op != OpCvtBoolToUint8 {
18889 continue
18890 }
18891 x := v_0_0.Args[0]
18892 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 1 {
18893 continue
18894 }
18895 v.reset(OpNot)
18896 v.AddArg(x)
18897 return true
18898 }
18899 break
18900 }
18901 return false
18902 }
18903 func rewriteValuegeneric_OpNeq32(v *Value) bool {
18904 v_1 := v.Args[1]
18905 v_0 := v.Args[0]
18906 b := v.Block
18907
18908
18909 for {
18910 x := v_0
18911 if x != v_1 {
18912 break
18913 }
18914 v.reset(OpConstBool)
18915 v.AuxInt = boolToAuxInt(false)
18916 return true
18917 }
18918
18919
18920 for {
18921 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18922 if v_0.Op != OpConst32 {
18923 continue
18924 }
18925 t := v_0.Type
18926 c := auxIntToInt32(v_0.AuxInt)
18927 if v_1.Op != OpAdd32 {
18928 continue
18929 }
18930 _ = v_1.Args[1]
18931 v_1_0 := v_1.Args[0]
18932 v_1_1 := v_1.Args[1]
18933 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
18934 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
18935 continue
18936 }
18937 d := auxIntToInt32(v_1_0.AuxInt)
18938 x := v_1_1
18939 v.reset(OpNeq32)
18940 v0 := b.NewValue0(v.Pos, OpConst32, t)
18941 v0.AuxInt = int32ToAuxInt(c - d)
18942 v.AddArg2(v0, x)
18943 return true
18944 }
18945 }
18946 break
18947 }
18948
18949
18950 for {
18951 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18952 if v_0.Op != OpConst32 {
18953 continue
18954 }
18955 c := auxIntToInt32(v_0.AuxInt)
18956 if v_1.Op != OpConst32 {
18957 continue
18958 }
18959 d := auxIntToInt32(v_1.AuxInt)
18960 v.reset(OpConstBool)
18961 v.AuxInt = boolToAuxInt(c != d)
18962 return true
18963 }
18964 break
18965 }
18966
18967
18968
18969 for {
18970 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18971 s := v_0
18972 if s.Op != OpSub32 {
18973 continue
18974 }
18975 y := s.Args[1]
18976 x := s.Args[0]
18977 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 || !(s.Uses == 1) {
18978 continue
18979 }
18980 v.reset(OpNeq32)
18981 v.AddArg2(x, y)
18982 return true
18983 }
18984 break
18985 }
18986
18987
18988
18989 for {
18990 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
18991 if v_0.Op != OpAnd32 {
18992 continue
18993 }
18994 t := v_0.Type
18995 _ = v_0.Args[1]
18996 v_0_0 := v_0.Args[0]
18997 v_0_1 := v_0.Args[1]
18998 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
18999 x := v_0_0
19000 if v_0_1.Op != OpConst32 || v_0_1.Type != t {
19001 continue
19002 }
19003 y := auxIntToInt32(v_0_1.AuxInt)
19004 if v_1.Op != OpConst32 || v_1.Type != t || auxIntToInt32(v_1.AuxInt) != y || !(oneBit(y)) {
19005 continue
19006 }
19007 v.reset(OpEq32)
19008 v0 := b.NewValue0(v.Pos, OpAnd32, t)
19009 v1 := b.NewValue0(v.Pos, OpConst32, t)
19010 v1.AuxInt = int32ToAuxInt(y)
19011 v0.AddArg2(x, v1)
19012 v2 := b.NewValue0(v.Pos, OpConst32, t)
19013 v2.AuxInt = int32ToAuxInt(0)
19014 v.AddArg2(v0, v2)
19015 return true
19016 }
19017 }
19018 break
19019 }
19020
19021
19022 for {
19023 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19024 if v_0.Op != OpZeroExt8to32 {
19025 continue
19026 }
19027 v_0_0 := v_0.Args[0]
19028 if v_0_0.Op != OpCvtBoolToUint8 {
19029 continue
19030 }
19031 x := v_0_0.Args[0]
19032 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
19033 continue
19034 }
19035 v.copyOf(x)
19036 return true
19037 }
19038 break
19039 }
19040
19041
19042 for {
19043 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19044 if v_0.Op != OpZeroExt8to32 {
19045 continue
19046 }
19047 v_0_0 := v_0.Args[0]
19048 if v_0_0.Op != OpCvtBoolToUint8 {
19049 continue
19050 }
19051 x := v_0_0.Args[0]
19052 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
19053 continue
19054 }
19055 v.reset(OpNot)
19056 v.AddArg(x)
19057 return true
19058 }
19059 break
19060 }
19061
19062
19063 for {
19064 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19065 if v_0.Op != OpSignExt8to32 {
19066 continue
19067 }
19068 v_0_0 := v_0.Args[0]
19069 if v_0_0.Op != OpCvtBoolToUint8 {
19070 continue
19071 }
19072 x := v_0_0.Args[0]
19073 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
19074 continue
19075 }
19076 v.copyOf(x)
19077 return true
19078 }
19079 break
19080 }
19081
19082
19083 for {
19084 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19085 if v_0.Op != OpSignExt8to32 {
19086 continue
19087 }
19088 v_0_0 := v_0.Args[0]
19089 if v_0_0.Op != OpCvtBoolToUint8 {
19090 continue
19091 }
19092 x := v_0_0.Args[0]
19093 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 1 {
19094 continue
19095 }
19096 v.reset(OpNot)
19097 v.AddArg(x)
19098 return true
19099 }
19100 break
19101 }
19102 return false
19103 }
19104 func rewriteValuegeneric_OpNeq32F(v *Value) bool {
19105 v_1 := v.Args[1]
19106 v_0 := v.Args[0]
19107
19108
19109 for {
19110 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19111 if v_0.Op != OpConst32F {
19112 continue
19113 }
19114 c := auxIntToFloat32(v_0.AuxInt)
19115 if v_1.Op != OpConst32F {
19116 continue
19117 }
19118 d := auxIntToFloat32(v_1.AuxInt)
19119 v.reset(OpConstBool)
19120 v.AuxInt = boolToAuxInt(c != d)
19121 return true
19122 }
19123 break
19124 }
19125 return false
19126 }
19127 func rewriteValuegeneric_OpNeq64(v *Value) bool {
19128 v_1 := v.Args[1]
19129 v_0 := v.Args[0]
19130 b := v.Block
19131
19132
19133 for {
19134 x := v_0
19135 if x != v_1 {
19136 break
19137 }
19138 v.reset(OpConstBool)
19139 v.AuxInt = boolToAuxInt(false)
19140 return true
19141 }
19142
19143
19144 for {
19145 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19146 if v_0.Op != OpConst64 {
19147 continue
19148 }
19149 t := v_0.Type
19150 c := auxIntToInt64(v_0.AuxInt)
19151 if v_1.Op != OpAdd64 {
19152 continue
19153 }
19154 _ = v_1.Args[1]
19155 v_1_0 := v_1.Args[0]
19156 v_1_1 := v_1.Args[1]
19157 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19158 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
19159 continue
19160 }
19161 d := auxIntToInt64(v_1_0.AuxInt)
19162 x := v_1_1
19163 v.reset(OpNeq64)
19164 v0 := b.NewValue0(v.Pos, OpConst64, t)
19165 v0.AuxInt = int64ToAuxInt(c - d)
19166 v.AddArg2(v0, x)
19167 return true
19168 }
19169 }
19170 break
19171 }
19172
19173
19174 for {
19175 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19176 if v_0.Op != OpConst64 {
19177 continue
19178 }
19179 c := auxIntToInt64(v_0.AuxInt)
19180 if v_1.Op != OpConst64 {
19181 continue
19182 }
19183 d := auxIntToInt64(v_1.AuxInt)
19184 v.reset(OpConstBool)
19185 v.AuxInt = boolToAuxInt(c != d)
19186 return true
19187 }
19188 break
19189 }
19190
19191
19192
19193 for {
19194 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19195 s := v_0
19196 if s.Op != OpSub64 {
19197 continue
19198 }
19199 y := s.Args[1]
19200 x := s.Args[0]
19201 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 || !(s.Uses == 1) {
19202 continue
19203 }
19204 v.reset(OpNeq64)
19205 v.AddArg2(x, y)
19206 return true
19207 }
19208 break
19209 }
19210
19211
19212
19213 for {
19214 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19215 if v_0.Op != OpAnd64 {
19216 continue
19217 }
19218 t := v_0.Type
19219 _ = v_0.Args[1]
19220 v_0_0 := v_0.Args[0]
19221 v_0_1 := v_0.Args[1]
19222 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19223 x := v_0_0
19224 if v_0_1.Op != OpConst64 || v_0_1.Type != t {
19225 continue
19226 }
19227 y := auxIntToInt64(v_0_1.AuxInt)
19228 if v_1.Op != OpConst64 || v_1.Type != t || auxIntToInt64(v_1.AuxInt) != y || !(oneBit(y)) {
19229 continue
19230 }
19231 v.reset(OpEq64)
19232 v0 := b.NewValue0(v.Pos, OpAnd64, t)
19233 v1 := b.NewValue0(v.Pos, OpConst64, t)
19234 v1.AuxInt = int64ToAuxInt(y)
19235 v0.AddArg2(x, v1)
19236 v2 := b.NewValue0(v.Pos, OpConst64, t)
19237 v2.AuxInt = int64ToAuxInt(0)
19238 v.AddArg2(v0, v2)
19239 return true
19240 }
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 != OpZeroExt8to64 {
19249 continue
19250 }
19251 v_0_0 := v_0.Args[0]
19252 if v_0_0.Op != OpCvtBoolToUint8 {
19253 continue
19254 }
19255 x := v_0_0.Args[0]
19256 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
19257 continue
19258 }
19259 v.copyOf(x)
19260 return true
19261 }
19262 break
19263 }
19264
19265
19266 for {
19267 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19268 if v_0.Op != OpZeroExt8to64 {
19269 continue
19270 }
19271 v_0_0 := v_0.Args[0]
19272 if v_0_0.Op != OpCvtBoolToUint8 {
19273 continue
19274 }
19275 x := v_0_0.Args[0]
19276 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
19277 continue
19278 }
19279 v.reset(OpNot)
19280 v.AddArg(x)
19281 return true
19282 }
19283 break
19284 }
19285
19286
19287 for {
19288 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19289 if v_0.Op != OpSignExt8to64 {
19290 continue
19291 }
19292 v_0_0 := v_0.Args[0]
19293 if v_0_0.Op != OpCvtBoolToUint8 {
19294 continue
19295 }
19296 x := v_0_0.Args[0]
19297 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
19298 continue
19299 }
19300 v.copyOf(x)
19301 return true
19302 }
19303 break
19304 }
19305
19306
19307 for {
19308 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19309 if v_0.Op != OpSignExt8to64 {
19310 continue
19311 }
19312 v_0_0 := v_0.Args[0]
19313 if v_0_0.Op != OpCvtBoolToUint8 {
19314 continue
19315 }
19316 x := v_0_0.Args[0]
19317 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 1 {
19318 continue
19319 }
19320 v.reset(OpNot)
19321 v.AddArg(x)
19322 return true
19323 }
19324 break
19325 }
19326 return false
19327 }
19328 func rewriteValuegeneric_OpNeq64F(v *Value) bool {
19329 v_1 := v.Args[1]
19330 v_0 := v.Args[0]
19331
19332
19333 for {
19334 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19335 if v_0.Op != OpConst64F {
19336 continue
19337 }
19338 c := auxIntToFloat64(v_0.AuxInt)
19339 if v_1.Op != OpConst64F {
19340 continue
19341 }
19342 d := auxIntToFloat64(v_1.AuxInt)
19343 v.reset(OpConstBool)
19344 v.AuxInt = boolToAuxInt(c != d)
19345 return true
19346 }
19347 break
19348 }
19349 return false
19350 }
19351 func rewriteValuegeneric_OpNeq8(v *Value) bool {
19352 v_1 := v.Args[1]
19353 v_0 := v.Args[0]
19354 b := v.Block
19355
19356
19357 for {
19358 x := v_0
19359 if x != v_1 {
19360 break
19361 }
19362 v.reset(OpConstBool)
19363 v.AuxInt = boolToAuxInt(false)
19364 return true
19365 }
19366
19367
19368 for {
19369 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19370 if v_0.Op != OpConst8 {
19371 continue
19372 }
19373 t := v_0.Type
19374 c := auxIntToInt8(v_0.AuxInt)
19375 if v_1.Op != OpAdd8 {
19376 continue
19377 }
19378 _ = v_1.Args[1]
19379 v_1_0 := v_1.Args[0]
19380 v_1_1 := v_1.Args[1]
19381 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
19382 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
19383 continue
19384 }
19385 d := auxIntToInt8(v_1_0.AuxInt)
19386 x := v_1_1
19387 v.reset(OpNeq8)
19388 v0 := b.NewValue0(v.Pos, OpConst8, t)
19389 v0.AuxInt = int8ToAuxInt(c - d)
19390 v.AddArg2(v0, x)
19391 return true
19392 }
19393 }
19394 break
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 != OpConst8 {
19401 continue
19402 }
19403 c := auxIntToInt8(v_0.AuxInt)
19404 if v_1.Op != OpConst8 {
19405 continue
19406 }
19407 d := auxIntToInt8(v_1.AuxInt)
19408 v.reset(OpConstBool)
19409 v.AuxInt = boolToAuxInt(c != d)
19410 return true
19411 }
19412 break
19413 }
19414
19415
19416
19417 for {
19418 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19419 s := v_0
19420 if s.Op != OpSub8 {
19421 continue
19422 }
19423 y := s.Args[1]
19424 x := s.Args[0]
19425 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 || !(s.Uses == 1) {
19426 continue
19427 }
19428 v.reset(OpNeq8)
19429 v.AddArg2(x, y)
19430 return true
19431 }
19432 break
19433 }
19434
19435
19436
19437 for {
19438 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19439 if v_0.Op != OpAnd8 {
19440 continue
19441 }
19442 t := v_0.Type
19443 _ = v_0.Args[1]
19444 v_0_0 := v_0.Args[0]
19445 v_0_1 := v_0.Args[1]
19446 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
19447 x := v_0_0
19448 if v_0_1.Op != OpConst8 || v_0_1.Type != t {
19449 continue
19450 }
19451 y := auxIntToInt8(v_0_1.AuxInt)
19452 if v_1.Op != OpConst8 || v_1.Type != t || auxIntToInt8(v_1.AuxInt) != y || !(oneBit(y)) {
19453 continue
19454 }
19455 v.reset(OpEq8)
19456 v0 := b.NewValue0(v.Pos, OpAnd8, t)
19457 v1 := b.NewValue0(v.Pos, OpConst8, t)
19458 v1.AuxInt = int8ToAuxInt(y)
19459 v0.AddArg2(x, v1)
19460 v2 := b.NewValue0(v.Pos, OpConst8, t)
19461 v2.AuxInt = int8ToAuxInt(0)
19462 v.AddArg2(v0, v2)
19463 return true
19464 }
19465 }
19466 break
19467 }
19468
19469
19470 for {
19471 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19472 if v_0.Op != OpCvtBoolToUint8 {
19473 continue
19474 }
19475 x := v_0.Args[0]
19476 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 {
19477 continue
19478 }
19479 v.copyOf(x)
19480 return true
19481 }
19482 break
19483 }
19484
19485
19486 for {
19487 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19488 if v_0.Op != OpCvtBoolToUint8 {
19489 continue
19490 }
19491 x := v_0.Args[0]
19492 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 1 {
19493 continue
19494 }
19495 v.reset(OpNot)
19496 v.AddArg(x)
19497 return true
19498 }
19499 break
19500 }
19501 return false
19502 }
19503 func rewriteValuegeneric_OpNeqB(v *Value) bool {
19504 v_1 := v.Args[1]
19505 v_0 := v.Args[0]
19506
19507
19508 for {
19509 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19510 if v_0.Op != OpConstBool {
19511 continue
19512 }
19513 c := auxIntToBool(v_0.AuxInt)
19514 if v_1.Op != OpConstBool {
19515 continue
19516 }
19517 d := auxIntToBool(v_1.AuxInt)
19518 v.reset(OpConstBool)
19519 v.AuxInt = boolToAuxInt(c != d)
19520 return true
19521 }
19522 break
19523 }
19524
19525
19526 for {
19527 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19528 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != false {
19529 continue
19530 }
19531 x := v_1
19532 v.copyOf(x)
19533 return true
19534 }
19535 break
19536 }
19537
19538
19539 for {
19540 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19541 if v_0.Op != OpConstBool || auxIntToBool(v_0.AuxInt) != true {
19542 continue
19543 }
19544 x := v_1
19545 v.reset(OpNot)
19546 v.AddArg(x)
19547 return true
19548 }
19549 break
19550 }
19551
19552
19553 for {
19554 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19555 if v_0.Op != OpNot {
19556 continue
19557 }
19558 x := v_0.Args[0]
19559 if v_1.Op != OpNot {
19560 continue
19561 }
19562 y := v_1.Args[0]
19563 v.reset(OpNeqB)
19564 v.AddArg2(x, y)
19565 return true
19566 }
19567 break
19568 }
19569 return false
19570 }
19571 func rewriteValuegeneric_OpNeqInter(v *Value) bool {
19572 v_1 := v.Args[1]
19573 v_0 := v.Args[0]
19574 b := v.Block
19575 typ := &b.Func.Config.Types
19576
19577
19578 for {
19579 x := v_0
19580 y := v_1
19581 v.reset(OpNeqPtr)
19582 v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
19583 v0.AddArg(x)
19584 v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr)
19585 v1.AddArg(y)
19586 v.AddArg2(v0, v1)
19587 return true
19588 }
19589 }
19590 func rewriteValuegeneric_OpNeqPtr(v *Value) bool {
19591 v_1 := v.Args[1]
19592 v_0 := v.Args[0]
19593
19594
19595 for {
19596 x := v_0
19597 if x != v_1 {
19598 break
19599 }
19600 v.reset(OpConstBool)
19601 v.AuxInt = boolToAuxInt(false)
19602 return true
19603 }
19604
19605
19606 for {
19607 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19608 if v_0.Op != OpAddr {
19609 continue
19610 }
19611 x := auxToSym(v_0.Aux)
19612 if v_1.Op != OpAddr {
19613 continue
19614 }
19615 y := auxToSym(v_1.Aux)
19616 v.reset(OpConstBool)
19617 v.AuxInt = boolToAuxInt(x != y)
19618 return true
19619 }
19620 break
19621 }
19622
19623
19624 for {
19625 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19626 if v_0.Op != OpAddr {
19627 continue
19628 }
19629 x := auxToSym(v_0.Aux)
19630 if v_1.Op != OpOffPtr {
19631 continue
19632 }
19633 o := auxIntToInt64(v_1.AuxInt)
19634 v_1_0 := v_1.Args[0]
19635 if v_1_0.Op != OpAddr {
19636 continue
19637 }
19638 y := auxToSym(v_1_0.Aux)
19639 v.reset(OpConstBool)
19640 v.AuxInt = boolToAuxInt(x != y || o != 0)
19641 return true
19642 }
19643 break
19644 }
19645
19646
19647 for {
19648 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19649 if v_0.Op != OpOffPtr {
19650 continue
19651 }
19652 o1 := auxIntToInt64(v_0.AuxInt)
19653 v_0_0 := v_0.Args[0]
19654 if v_0_0.Op != OpAddr {
19655 continue
19656 }
19657 x := auxToSym(v_0_0.Aux)
19658 if v_1.Op != OpOffPtr {
19659 continue
19660 }
19661 o2 := auxIntToInt64(v_1.AuxInt)
19662 v_1_0 := v_1.Args[0]
19663 if v_1_0.Op != OpAddr {
19664 continue
19665 }
19666 y := auxToSym(v_1_0.Aux)
19667 v.reset(OpConstBool)
19668 v.AuxInt = boolToAuxInt(x != y || o1 != o2)
19669 return true
19670 }
19671 break
19672 }
19673
19674
19675 for {
19676 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19677 if v_0.Op != OpLocalAddr {
19678 continue
19679 }
19680 x := auxToSym(v_0.Aux)
19681 if v_1.Op != OpLocalAddr {
19682 continue
19683 }
19684 y := auxToSym(v_1.Aux)
19685 v.reset(OpConstBool)
19686 v.AuxInt = boolToAuxInt(x != y)
19687 return true
19688 }
19689 break
19690 }
19691
19692
19693 for {
19694 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19695 if v_0.Op != OpLocalAddr {
19696 continue
19697 }
19698 x := auxToSym(v_0.Aux)
19699 if v_1.Op != OpOffPtr {
19700 continue
19701 }
19702 o := auxIntToInt64(v_1.AuxInt)
19703 v_1_0 := v_1.Args[0]
19704 if v_1_0.Op != OpLocalAddr {
19705 continue
19706 }
19707 y := auxToSym(v_1_0.Aux)
19708 v.reset(OpConstBool)
19709 v.AuxInt = boolToAuxInt(x != y || o != 0)
19710 return true
19711 }
19712 break
19713 }
19714
19715
19716 for {
19717 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19718 if v_0.Op != OpOffPtr {
19719 continue
19720 }
19721 o1 := auxIntToInt64(v_0.AuxInt)
19722 v_0_0 := v_0.Args[0]
19723 if v_0_0.Op != OpLocalAddr {
19724 continue
19725 }
19726 x := auxToSym(v_0_0.Aux)
19727 if v_1.Op != OpOffPtr {
19728 continue
19729 }
19730 o2 := auxIntToInt64(v_1.AuxInt)
19731 v_1_0 := v_1.Args[0]
19732 if v_1_0.Op != OpLocalAddr {
19733 continue
19734 }
19735 y := auxToSym(v_1_0.Aux)
19736 v.reset(OpConstBool)
19737 v.AuxInt = boolToAuxInt(x != y || o1 != o2)
19738 return true
19739 }
19740 break
19741 }
19742
19743
19744
19745 for {
19746 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19747 if v_0.Op != OpOffPtr {
19748 continue
19749 }
19750 o1 := auxIntToInt64(v_0.AuxInt)
19751 p1 := v_0.Args[0]
19752 p2 := v_1
19753 if !(isSamePtr(p1, p2)) {
19754 continue
19755 }
19756 v.reset(OpConstBool)
19757 v.AuxInt = boolToAuxInt(o1 != 0)
19758 return true
19759 }
19760 break
19761 }
19762
19763
19764
19765 for {
19766 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19767 if v_0.Op != OpOffPtr {
19768 continue
19769 }
19770 o1 := auxIntToInt64(v_0.AuxInt)
19771 p1 := v_0.Args[0]
19772 if v_1.Op != OpOffPtr {
19773 continue
19774 }
19775 o2 := auxIntToInt64(v_1.AuxInt)
19776 p2 := v_1.Args[0]
19777 if !(isSamePtr(p1, p2)) {
19778 continue
19779 }
19780 v.reset(OpConstBool)
19781 v.AuxInt = boolToAuxInt(o1 != o2)
19782 return true
19783 }
19784 break
19785 }
19786
19787
19788 for {
19789 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19790 if v_0.Op != OpConst32 {
19791 continue
19792 }
19793 c := auxIntToInt32(v_0.AuxInt)
19794 if v_1.Op != OpConst32 {
19795 continue
19796 }
19797 d := auxIntToInt32(v_1.AuxInt)
19798 v.reset(OpConstBool)
19799 v.AuxInt = boolToAuxInt(c != d)
19800 return true
19801 }
19802 break
19803 }
19804
19805
19806 for {
19807 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19808 if v_0.Op != OpConst64 {
19809 continue
19810 }
19811 c := auxIntToInt64(v_0.AuxInt)
19812 if v_1.Op != OpConst64 {
19813 continue
19814 }
19815 d := auxIntToInt64(v_1.AuxInt)
19816 v.reset(OpConstBool)
19817 v.AuxInt = boolToAuxInt(c != d)
19818 return true
19819 }
19820 break
19821 }
19822
19823
19824 for {
19825 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19826 if v_0.Op != OpConvert {
19827 continue
19828 }
19829 v_0_0 := v_0.Args[0]
19830 if v_0_0.Op != OpAddr {
19831 continue
19832 }
19833 x := auxToSym(v_0_0.Aux)
19834 if v_1.Op != OpAddr {
19835 continue
19836 }
19837 y := auxToSym(v_1.Aux)
19838 v.reset(OpConstBool)
19839 v.AuxInt = boolToAuxInt(x != y)
19840 return true
19841 }
19842 break
19843 }
19844
19845
19846 for {
19847 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19848 if v_0.Op != OpLocalAddr || v_1.Op != OpAddr {
19849 continue
19850 }
19851 v.reset(OpConstBool)
19852 v.AuxInt = boolToAuxInt(true)
19853 return true
19854 }
19855 break
19856 }
19857
19858
19859 for {
19860 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19861 if v_0.Op != OpOffPtr {
19862 continue
19863 }
19864 v_0_0 := v_0.Args[0]
19865 if v_0_0.Op != OpLocalAddr || v_1.Op != OpAddr {
19866 continue
19867 }
19868 v.reset(OpConstBool)
19869 v.AuxInt = boolToAuxInt(true)
19870 return true
19871 }
19872 break
19873 }
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 != OpLocalAddr || v_1.Op != OpOffPtr {
19879 continue
19880 }
19881 v_1_0 := v_1.Args[0]
19882 if v_1_0.Op != OpAddr {
19883 continue
19884 }
19885 v.reset(OpConstBool)
19886 v.AuxInt = boolToAuxInt(true)
19887 return true
19888 }
19889 break
19890 }
19891
19892
19893 for {
19894 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19895 if v_0.Op != OpOffPtr {
19896 continue
19897 }
19898 v_0_0 := v_0.Args[0]
19899 if v_0_0.Op != OpLocalAddr || v_1.Op != OpOffPtr {
19900 continue
19901 }
19902 v_1_0 := v_1.Args[0]
19903 if v_1_0.Op != OpAddr {
19904 continue
19905 }
19906 v.reset(OpConstBool)
19907 v.AuxInt = boolToAuxInt(true)
19908 return true
19909 }
19910 break
19911 }
19912
19913
19914
19915 for {
19916 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19917 if v_0.Op != OpAddPtr {
19918 continue
19919 }
19920 o1 := v_0.Args[1]
19921 p1 := v_0.Args[0]
19922 p2 := v_1
19923 if !(isSamePtr(p1, p2)) {
19924 continue
19925 }
19926 v.reset(OpIsNonNil)
19927 v.AddArg(o1)
19928 return true
19929 }
19930 break
19931 }
19932
19933
19934 for {
19935 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19936 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
19937 continue
19938 }
19939 p := v_1
19940 v.reset(OpIsNonNil)
19941 v.AddArg(p)
19942 return true
19943 }
19944 break
19945 }
19946
19947
19948 for {
19949 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19950 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
19951 continue
19952 }
19953 p := v_1
19954 v.reset(OpIsNonNil)
19955 v.AddArg(p)
19956 return true
19957 }
19958 break
19959 }
19960
19961
19962 for {
19963 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
19964 if v_0.Op != OpConstNil {
19965 continue
19966 }
19967 p := v_1
19968 v.reset(OpIsNonNil)
19969 v.AddArg(p)
19970 return true
19971 }
19972 break
19973 }
19974 return false
19975 }
19976 func rewriteValuegeneric_OpNeqSlice(v *Value) bool {
19977 v_1 := v.Args[1]
19978 v_0 := v.Args[0]
19979 b := v.Block
19980 typ := &b.Func.Config.Types
19981
19982
19983 for {
19984 x := v_0
19985 y := v_1
19986 v.reset(OpNeqPtr)
19987 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
19988 v0.AddArg(x)
19989 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr)
19990 v1.AddArg(y)
19991 v.AddArg2(v0, v1)
19992 return true
19993 }
19994 }
19995 func rewriteValuegeneric_OpNilCheck(v *Value) bool {
19996 v_1 := v.Args[1]
19997 v_0 := v.Args[0]
19998 b := v.Block
19999 fe := b.Func.fe
20000
20001
20002 for {
20003 ptr := v_0
20004 if ptr.Op != OpGetG {
20005 break
20006 }
20007 mem := ptr.Args[0]
20008 if mem != v_1 {
20009 break
20010 }
20011 v.copyOf(ptr)
20012 return true
20013 }
20014
20015
20016
20017 for {
20018 ptr := v_0
20019 if ptr.Op != OpSelectN || auxIntToInt64(ptr.AuxInt) != 0 {
20020 break
20021 }
20022 call := ptr.Args[0]
20023 if call.Op != OpStaticLECall {
20024 break
20025 }
20026 if !(isMalloc(call.Aux) && warnRule(fe.Debug_checknil(), v, "removed nil check")) {
20027 break
20028 }
20029 v.copyOf(ptr)
20030 return true
20031 }
20032
20033
20034
20035 for {
20036 ptr := v_0
20037 if ptr.Op != OpOffPtr {
20038 break
20039 }
20040 ptr_0 := ptr.Args[0]
20041 if ptr_0.Op != OpSelectN || auxIntToInt64(ptr_0.AuxInt) != 0 {
20042 break
20043 }
20044 call := ptr_0.Args[0]
20045 if call.Op != OpStaticLECall {
20046 break
20047 }
20048 if !(isMalloc(call.Aux) && warnRule(fe.Debug_checknil(), v, "removed nil check")) {
20049 break
20050 }
20051 v.copyOf(ptr)
20052 return true
20053 }
20054
20055
20056 for {
20057 ptr := v_0
20058 if ptr.Op != OpAddr {
20059 break
20060 }
20061 ptr_0 := ptr.Args[0]
20062 if ptr_0.Op != OpSB {
20063 break
20064 }
20065 v.copyOf(ptr)
20066 return true
20067 }
20068
20069
20070 for {
20071 ptr := v_0
20072 if ptr.Op != OpConvert {
20073 break
20074 }
20075 ptr_0 := ptr.Args[0]
20076 if ptr_0.Op != OpAddr {
20077 break
20078 }
20079 ptr_0_0 := ptr_0.Args[0]
20080 if ptr_0_0.Op != OpSB {
20081 break
20082 }
20083 v.copyOf(ptr)
20084 return true
20085 }
20086
20087
20088
20089 for {
20090 ptr := v_0
20091 if ptr.Op != OpLocalAddr || !(warnRule(fe.Debug_checknil(), v, "removed nil check")) {
20092 break
20093 }
20094 v.copyOf(ptr)
20095 return true
20096 }
20097
20098
20099
20100 for {
20101 ptr := v_0
20102 if ptr.Op != OpArg {
20103 break
20104 }
20105 sym := auxToSym(ptr.Aux)
20106 if !(isDictArgSym(sym)) {
20107 break
20108 }
20109 v.copyOf(ptr)
20110 return true
20111 }
20112
20113
20114 for {
20115 ptr := v_0
20116 if ptr.Op != OpNilCheck {
20117 break
20118 }
20119 v.copyOf(ptr)
20120 return true
20121 }
20122 return false
20123 }
20124 func rewriteValuegeneric_OpNot(v *Value) bool {
20125 v_0 := v.Args[0]
20126
20127
20128 for {
20129 if v_0.Op != OpConstBool {
20130 break
20131 }
20132 c := auxIntToBool(v_0.AuxInt)
20133 v.reset(OpConstBool)
20134 v.AuxInt = boolToAuxInt(!c)
20135 return true
20136 }
20137
20138
20139 for {
20140 if v_0.Op != OpEq64 {
20141 break
20142 }
20143 y := v_0.Args[1]
20144 x := v_0.Args[0]
20145 v.reset(OpNeq64)
20146 v.AddArg2(x, y)
20147 return true
20148 }
20149
20150
20151 for {
20152 if v_0.Op != OpEq32 {
20153 break
20154 }
20155 y := v_0.Args[1]
20156 x := v_0.Args[0]
20157 v.reset(OpNeq32)
20158 v.AddArg2(x, y)
20159 return true
20160 }
20161
20162
20163 for {
20164 if v_0.Op != OpEq16 {
20165 break
20166 }
20167 y := v_0.Args[1]
20168 x := v_0.Args[0]
20169 v.reset(OpNeq16)
20170 v.AddArg2(x, y)
20171 return true
20172 }
20173
20174
20175 for {
20176 if v_0.Op != OpEq8 {
20177 break
20178 }
20179 y := v_0.Args[1]
20180 x := v_0.Args[0]
20181 v.reset(OpNeq8)
20182 v.AddArg2(x, y)
20183 return true
20184 }
20185
20186
20187 for {
20188 if v_0.Op != OpEqB {
20189 break
20190 }
20191 y := v_0.Args[1]
20192 x := v_0.Args[0]
20193 v.reset(OpNeqB)
20194 v.AddArg2(x, y)
20195 return true
20196 }
20197
20198
20199 for {
20200 if v_0.Op != OpEqPtr {
20201 break
20202 }
20203 y := v_0.Args[1]
20204 x := v_0.Args[0]
20205 v.reset(OpNeqPtr)
20206 v.AddArg2(x, y)
20207 return true
20208 }
20209
20210
20211 for {
20212 if v_0.Op != OpEq64F {
20213 break
20214 }
20215 y := v_0.Args[1]
20216 x := v_0.Args[0]
20217 v.reset(OpNeq64F)
20218 v.AddArg2(x, y)
20219 return true
20220 }
20221
20222
20223 for {
20224 if v_0.Op != OpEq32F {
20225 break
20226 }
20227 y := v_0.Args[1]
20228 x := v_0.Args[0]
20229 v.reset(OpNeq32F)
20230 v.AddArg2(x, y)
20231 return true
20232 }
20233
20234
20235 for {
20236 if v_0.Op != OpNeq64 {
20237 break
20238 }
20239 y := v_0.Args[1]
20240 x := v_0.Args[0]
20241 v.reset(OpEq64)
20242 v.AddArg2(x, y)
20243 return true
20244 }
20245
20246
20247 for {
20248 if v_0.Op != OpNeq32 {
20249 break
20250 }
20251 y := v_0.Args[1]
20252 x := v_0.Args[0]
20253 v.reset(OpEq32)
20254 v.AddArg2(x, y)
20255 return true
20256 }
20257
20258
20259 for {
20260 if v_0.Op != OpNeq16 {
20261 break
20262 }
20263 y := v_0.Args[1]
20264 x := v_0.Args[0]
20265 v.reset(OpEq16)
20266 v.AddArg2(x, y)
20267 return true
20268 }
20269
20270
20271 for {
20272 if v_0.Op != OpNeq8 {
20273 break
20274 }
20275 y := v_0.Args[1]
20276 x := v_0.Args[0]
20277 v.reset(OpEq8)
20278 v.AddArg2(x, y)
20279 return true
20280 }
20281
20282
20283 for {
20284 if v_0.Op != OpNeqB {
20285 break
20286 }
20287 y := v_0.Args[1]
20288 x := v_0.Args[0]
20289 v.reset(OpEqB)
20290 v.AddArg2(x, y)
20291 return true
20292 }
20293
20294
20295 for {
20296 if v_0.Op != OpNeqPtr {
20297 break
20298 }
20299 y := v_0.Args[1]
20300 x := v_0.Args[0]
20301 v.reset(OpEqPtr)
20302 v.AddArg2(x, y)
20303 return true
20304 }
20305
20306
20307 for {
20308 if v_0.Op != OpNeq64F {
20309 break
20310 }
20311 y := v_0.Args[1]
20312 x := v_0.Args[0]
20313 v.reset(OpEq64F)
20314 v.AddArg2(x, y)
20315 return true
20316 }
20317
20318
20319 for {
20320 if v_0.Op != OpNeq32F {
20321 break
20322 }
20323 y := v_0.Args[1]
20324 x := v_0.Args[0]
20325 v.reset(OpEq32F)
20326 v.AddArg2(x, y)
20327 return true
20328 }
20329
20330
20331 for {
20332 if v_0.Op != OpLess64 {
20333 break
20334 }
20335 y := v_0.Args[1]
20336 x := v_0.Args[0]
20337 v.reset(OpLeq64)
20338 v.AddArg2(y, x)
20339 return true
20340 }
20341
20342
20343 for {
20344 if v_0.Op != OpLess32 {
20345 break
20346 }
20347 y := v_0.Args[1]
20348 x := v_0.Args[0]
20349 v.reset(OpLeq32)
20350 v.AddArg2(y, x)
20351 return true
20352 }
20353
20354
20355 for {
20356 if v_0.Op != OpLess16 {
20357 break
20358 }
20359 y := v_0.Args[1]
20360 x := v_0.Args[0]
20361 v.reset(OpLeq16)
20362 v.AddArg2(y, x)
20363 return true
20364 }
20365
20366
20367 for {
20368 if v_0.Op != OpLess8 {
20369 break
20370 }
20371 y := v_0.Args[1]
20372 x := v_0.Args[0]
20373 v.reset(OpLeq8)
20374 v.AddArg2(y, x)
20375 return true
20376 }
20377
20378
20379 for {
20380 if v_0.Op != OpLess64U {
20381 break
20382 }
20383 y := v_0.Args[1]
20384 x := v_0.Args[0]
20385 v.reset(OpLeq64U)
20386 v.AddArg2(y, x)
20387 return true
20388 }
20389
20390
20391 for {
20392 if v_0.Op != OpLess32U {
20393 break
20394 }
20395 y := v_0.Args[1]
20396 x := v_0.Args[0]
20397 v.reset(OpLeq32U)
20398 v.AddArg2(y, x)
20399 return true
20400 }
20401
20402
20403 for {
20404 if v_0.Op != OpLess16U {
20405 break
20406 }
20407 y := v_0.Args[1]
20408 x := v_0.Args[0]
20409 v.reset(OpLeq16U)
20410 v.AddArg2(y, x)
20411 return true
20412 }
20413
20414
20415 for {
20416 if v_0.Op != OpLess8U {
20417 break
20418 }
20419 y := v_0.Args[1]
20420 x := v_0.Args[0]
20421 v.reset(OpLeq8U)
20422 v.AddArg2(y, x)
20423 return true
20424 }
20425
20426
20427 for {
20428 if v_0.Op != OpLeq64 {
20429 break
20430 }
20431 y := v_0.Args[1]
20432 x := v_0.Args[0]
20433 v.reset(OpLess64)
20434 v.AddArg2(y, x)
20435 return true
20436 }
20437
20438
20439 for {
20440 if v_0.Op != OpLeq32 {
20441 break
20442 }
20443 y := v_0.Args[1]
20444 x := v_0.Args[0]
20445 v.reset(OpLess32)
20446 v.AddArg2(y, x)
20447 return true
20448 }
20449
20450
20451 for {
20452 if v_0.Op != OpLeq16 {
20453 break
20454 }
20455 y := v_0.Args[1]
20456 x := v_0.Args[0]
20457 v.reset(OpLess16)
20458 v.AddArg2(y, x)
20459 return true
20460 }
20461
20462
20463 for {
20464 if v_0.Op != OpLeq8 {
20465 break
20466 }
20467 y := v_0.Args[1]
20468 x := v_0.Args[0]
20469 v.reset(OpLess8)
20470 v.AddArg2(y, x)
20471 return true
20472 }
20473
20474
20475 for {
20476 if v_0.Op != OpLeq64U {
20477 break
20478 }
20479 y := v_0.Args[1]
20480 x := v_0.Args[0]
20481 v.reset(OpLess64U)
20482 v.AddArg2(y, x)
20483 return true
20484 }
20485
20486
20487 for {
20488 if v_0.Op != OpLeq32U {
20489 break
20490 }
20491 y := v_0.Args[1]
20492 x := v_0.Args[0]
20493 v.reset(OpLess32U)
20494 v.AddArg2(y, x)
20495 return true
20496 }
20497
20498
20499 for {
20500 if v_0.Op != OpLeq16U {
20501 break
20502 }
20503 y := v_0.Args[1]
20504 x := v_0.Args[0]
20505 v.reset(OpLess16U)
20506 v.AddArg2(y, x)
20507 return true
20508 }
20509
20510
20511 for {
20512 if v_0.Op != OpLeq8U {
20513 break
20514 }
20515 y := v_0.Args[1]
20516 x := v_0.Args[0]
20517 v.reset(OpLess8U)
20518 v.AddArg2(y, x)
20519 return true
20520 }
20521 return false
20522 }
20523 func rewriteValuegeneric_OpOffPtr(v *Value) bool {
20524 v_0 := v.Args[0]
20525
20526
20527 for {
20528 x := auxIntToInt64(v.AuxInt)
20529 if v_0.Op != OpOffPtr {
20530 break
20531 }
20532 y := auxIntToInt64(v_0.AuxInt)
20533 p := v_0.Args[0]
20534 v.reset(OpOffPtr)
20535 v.AuxInt = int64ToAuxInt(x + y)
20536 v.AddArg(p)
20537 return true
20538 }
20539
20540
20541
20542 for {
20543 if auxIntToInt64(v.AuxInt) != 0 {
20544 break
20545 }
20546 p := v_0
20547 if !(v.Type.Compare(p.Type) == types.CMPeq) {
20548 break
20549 }
20550 v.copyOf(p)
20551 return true
20552 }
20553 return false
20554 }
20555 func rewriteValuegeneric_OpOr16(v *Value) bool {
20556 v_1 := v.Args[1]
20557 v_0 := v.Args[0]
20558 b := v.Block
20559 config := b.Func.Config
20560
20561
20562 for {
20563 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20564 if v_0.Op != OpConst16 {
20565 continue
20566 }
20567 c := auxIntToInt16(v_0.AuxInt)
20568 if v_1.Op != OpConst16 {
20569 continue
20570 }
20571 d := auxIntToInt16(v_1.AuxInt)
20572 v.reset(OpConst16)
20573 v.AuxInt = int16ToAuxInt(c | d)
20574 return true
20575 }
20576 break
20577 }
20578
20579
20580 for {
20581 t := v.Type
20582 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20583 if v_0.Op != OpCom16 {
20584 continue
20585 }
20586 x := v_0.Args[0]
20587 if v_1.Op != OpCom16 {
20588 continue
20589 }
20590 y := v_1.Args[0]
20591 v.reset(OpCom16)
20592 v0 := b.NewValue0(v.Pos, OpAnd16, t)
20593 v0.AddArg2(x, y)
20594 v.AddArg(v0)
20595 return true
20596 }
20597 break
20598 }
20599
20600
20601 for {
20602 x := v_0
20603 if x != v_1 {
20604 break
20605 }
20606 v.copyOf(x)
20607 return true
20608 }
20609
20610
20611 for {
20612 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20613 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
20614 continue
20615 }
20616 x := v_1
20617 v.copyOf(x)
20618 return true
20619 }
20620 break
20621 }
20622
20623
20624 for {
20625 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20626 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
20627 continue
20628 }
20629 v.reset(OpConst16)
20630 v.AuxInt = int16ToAuxInt(-1)
20631 return true
20632 }
20633 break
20634 }
20635
20636
20637 for {
20638 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20639 if v_0.Op != OpCom16 {
20640 continue
20641 }
20642 x := v_0.Args[0]
20643 if x != v_1 {
20644 continue
20645 }
20646 v.reset(OpConst16)
20647 v.AuxInt = int16ToAuxInt(-1)
20648 return true
20649 }
20650 break
20651 }
20652
20653
20654 for {
20655 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20656 x := v_0
20657 if v_1.Op != OpOr16 {
20658 continue
20659 }
20660 _ = v_1.Args[1]
20661 v_1_0 := v_1.Args[0]
20662 v_1_1 := v_1.Args[1]
20663 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
20664 if x != v_1_0 {
20665 continue
20666 }
20667 y := v_1_1
20668 v.reset(OpOr16)
20669 v.AddArg2(x, y)
20670 return true
20671 }
20672 }
20673 break
20674 }
20675
20676
20677
20678 for {
20679 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20680 if v_0.Op != OpAnd16 {
20681 continue
20682 }
20683 _ = v_0.Args[1]
20684 v_0_0 := v_0.Args[0]
20685 v_0_1 := v_0.Args[1]
20686 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
20687 x := v_0_0
20688 if v_0_1.Op != OpConst16 {
20689 continue
20690 }
20691 c2 := auxIntToInt16(v_0_1.AuxInt)
20692 if v_1.Op != OpConst16 {
20693 continue
20694 }
20695 t := v_1.Type
20696 c1 := auxIntToInt16(v_1.AuxInt)
20697 if !(^(c1 | c2) == 0) {
20698 continue
20699 }
20700 v.reset(OpOr16)
20701 v0 := b.NewValue0(v.Pos, OpConst16, t)
20702 v0.AuxInt = int16ToAuxInt(c1)
20703 v.AddArg2(v0, x)
20704 return true
20705 }
20706 }
20707 break
20708 }
20709
20710
20711
20712 for {
20713 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20714 if v_0.Op != OpOr16 {
20715 continue
20716 }
20717 _ = v_0.Args[1]
20718 v_0_0 := v_0.Args[0]
20719 v_0_1 := v_0.Args[1]
20720 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
20721 i := v_0_0
20722 if i.Op != OpConst16 {
20723 continue
20724 }
20725 t := i.Type
20726 z := v_0_1
20727 x := v_1
20728 if !(z.Op != OpConst16 && x.Op != OpConst16) {
20729 continue
20730 }
20731 v.reset(OpOr16)
20732 v0 := b.NewValue0(v.Pos, OpOr16, t)
20733 v0.AddArg2(z, x)
20734 v.AddArg2(i, v0)
20735 return true
20736 }
20737 }
20738 break
20739 }
20740
20741
20742 for {
20743 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20744 if v_0.Op != OpConst16 {
20745 continue
20746 }
20747 t := v_0.Type
20748 c := auxIntToInt16(v_0.AuxInt)
20749 if v_1.Op != OpOr16 {
20750 continue
20751 }
20752 _ = v_1.Args[1]
20753 v_1_0 := v_1.Args[0]
20754 v_1_1 := v_1.Args[1]
20755 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
20756 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
20757 continue
20758 }
20759 d := auxIntToInt16(v_1_0.AuxInt)
20760 x := v_1_1
20761 v.reset(OpOr16)
20762 v0 := b.NewValue0(v.Pos, OpConst16, t)
20763 v0.AuxInt = int16ToAuxInt(c | d)
20764 v.AddArg2(v0, x)
20765 return true
20766 }
20767 }
20768 break
20769 }
20770
20771
20772
20773 for {
20774 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20775 if v_0.Op != OpLsh16x64 {
20776 continue
20777 }
20778 _ = v_0.Args[1]
20779 x := v_0.Args[0]
20780 z := v_0.Args[1]
20781 if z.Op != OpConst64 {
20782 continue
20783 }
20784 c := auxIntToInt64(z.AuxInt)
20785 if v_1.Op != OpRsh16Ux64 {
20786 continue
20787 }
20788 _ = v_1.Args[1]
20789 if x != v_1.Args[0] {
20790 continue
20791 }
20792 v_1_1 := v_1.Args[1]
20793 if v_1_1.Op != OpConst64 {
20794 continue
20795 }
20796 d := auxIntToInt64(v_1_1.AuxInt)
20797 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
20798 continue
20799 }
20800 v.reset(OpRotateLeft16)
20801 v.AddArg2(x, z)
20802 return true
20803 }
20804 break
20805 }
20806
20807
20808
20809 for {
20810 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20811 left := v_0
20812 if left.Op != OpLsh16x64 {
20813 continue
20814 }
20815 y := left.Args[1]
20816 x := left.Args[0]
20817 right := v_1
20818 if right.Op != OpRsh16Ux64 {
20819 continue
20820 }
20821 _ = right.Args[1]
20822 if x != right.Args[0] {
20823 continue
20824 }
20825 right_1 := right.Args[1]
20826 if right_1.Op != OpSub64 {
20827 continue
20828 }
20829 _ = right_1.Args[1]
20830 right_1_0 := right_1.Args[0]
20831 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
20832 continue
20833 }
20834 v.reset(OpRotateLeft16)
20835 v.AddArg2(x, y)
20836 return true
20837 }
20838 break
20839 }
20840
20841
20842
20843 for {
20844 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20845 left := v_0
20846 if left.Op != OpLsh16x32 {
20847 continue
20848 }
20849 y := left.Args[1]
20850 x := left.Args[0]
20851 right := v_1
20852 if right.Op != OpRsh16Ux32 {
20853 continue
20854 }
20855 _ = right.Args[1]
20856 if x != right.Args[0] {
20857 continue
20858 }
20859 right_1 := right.Args[1]
20860 if right_1.Op != OpSub32 {
20861 continue
20862 }
20863 _ = right_1.Args[1]
20864 right_1_0 := right_1.Args[0]
20865 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
20866 continue
20867 }
20868 v.reset(OpRotateLeft16)
20869 v.AddArg2(x, y)
20870 return true
20871 }
20872 break
20873 }
20874
20875
20876
20877 for {
20878 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20879 left := v_0
20880 if left.Op != OpLsh16x16 {
20881 continue
20882 }
20883 y := left.Args[1]
20884 x := left.Args[0]
20885 right := v_1
20886 if right.Op != OpRsh16Ux16 {
20887 continue
20888 }
20889 _ = right.Args[1]
20890 if x != right.Args[0] {
20891 continue
20892 }
20893 right_1 := right.Args[1]
20894 if right_1.Op != OpSub16 {
20895 continue
20896 }
20897 _ = right_1.Args[1]
20898 right_1_0 := right_1.Args[0]
20899 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
20900 continue
20901 }
20902 v.reset(OpRotateLeft16)
20903 v.AddArg2(x, y)
20904 return true
20905 }
20906 break
20907 }
20908
20909
20910
20911 for {
20912 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20913 left := v_0
20914 if left.Op != OpLsh16x8 {
20915 continue
20916 }
20917 y := left.Args[1]
20918 x := left.Args[0]
20919 right := v_1
20920 if right.Op != OpRsh16Ux8 {
20921 continue
20922 }
20923 _ = right.Args[1]
20924 if x != right.Args[0] {
20925 continue
20926 }
20927 right_1 := right.Args[1]
20928 if right_1.Op != OpSub8 {
20929 continue
20930 }
20931 _ = right_1.Args[1]
20932 right_1_0 := right_1.Args[0]
20933 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
20934 continue
20935 }
20936 v.reset(OpRotateLeft16)
20937 v.AddArg2(x, y)
20938 return true
20939 }
20940 break
20941 }
20942
20943
20944
20945 for {
20946 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20947 right := v_0
20948 if right.Op != OpRsh16Ux64 {
20949 continue
20950 }
20951 y := right.Args[1]
20952 x := right.Args[0]
20953 left := v_1
20954 if left.Op != OpLsh16x64 {
20955 continue
20956 }
20957 _ = left.Args[1]
20958 if x != left.Args[0] {
20959 continue
20960 }
20961 z := left.Args[1]
20962 if z.Op != OpSub64 {
20963 continue
20964 }
20965 _ = z.Args[1]
20966 z_0 := z.Args[0]
20967 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
20968 continue
20969 }
20970 v.reset(OpRotateLeft16)
20971 v.AddArg2(x, z)
20972 return true
20973 }
20974 break
20975 }
20976
20977
20978
20979 for {
20980 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
20981 right := v_0
20982 if right.Op != OpRsh16Ux32 {
20983 continue
20984 }
20985 y := right.Args[1]
20986 x := right.Args[0]
20987 left := v_1
20988 if left.Op != OpLsh16x32 {
20989 continue
20990 }
20991 _ = left.Args[1]
20992 if x != left.Args[0] {
20993 continue
20994 }
20995 z := left.Args[1]
20996 if z.Op != OpSub32 {
20997 continue
20998 }
20999 _ = z.Args[1]
21000 z_0 := z.Args[0]
21001 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21002 continue
21003 }
21004 v.reset(OpRotateLeft16)
21005 v.AddArg2(x, z)
21006 return true
21007 }
21008 break
21009 }
21010
21011
21012
21013 for {
21014 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21015 right := v_0
21016 if right.Op != OpRsh16Ux16 {
21017 continue
21018 }
21019 y := right.Args[1]
21020 x := right.Args[0]
21021 left := v_1
21022 if left.Op != OpLsh16x16 {
21023 continue
21024 }
21025 _ = left.Args[1]
21026 if x != left.Args[0] {
21027 continue
21028 }
21029 z := left.Args[1]
21030 if z.Op != OpSub16 {
21031 continue
21032 }
21033 _ = z.Args[1]
21034 z_0 := z.Args[0]
21035 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21036 continue
21037 }
21038 v.reset(OpRotateLeft16)
21039 v.AddArg2(x, z)
21040 return true
21041 }
21042 break
21043 }
21044
21045
21046
21047 for {
21048 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21049 right := v_0
21050 if right.Op != OpRsh16Ux8 {
21051 continue
21052 }
21053 y := right.Args[1]
21054 x := right.Args[0]
21055 left := v_1
21056 if left.Op != OpLsh16x8 {
21057 continue
21058 }
21059 _ = left.Args[1]
21060 if x != left.Args[0] {
21061 continue
21062 }
21063 z := left.Args[1]
21064 if z.Op != OpSub8 {
21065 continue
21066 }
21067 _ = z.Args[1]
21068 z_0 := z.Args[0]
21069 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
21070 continue
21071 }
21072 v.reset(OpRotateLeft16)
21073 v.AddArg2(x, z)
21074 return true
21075 }
21076 break
21077 }
21078 return false
21079 }
21080 func rewriteValuegeneric_OpOr32(v *Value) bool {
21081 v_1 := v.Args[1]
21082 v_0 := v.Args[0]
21083 b := v.Block
21084 config := b.Func.Config
21085
21086
21087 for {
21088 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21089 if v_0.Op != OpConst32 {
21090 continue
21091 }
21092 c := auxIntToInt32(v_0.AuxInt)
21093 if v_1.Op != OpConst32 {
21094 continue
21095 }
21096 d := auxIntToInt32(v_1.AuxInt)
21097 v.reset(OpConst32)
21098 v.AuxInt = int32ToAuxInt(c | d)
21099 return true
21100 }
21101 break
21102 }
21103
21104
21105 for {
21106 t := v.Type
21107 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21108 if v_0.Op != OpCom32 {
21109 continue
21110 }
21111 x := v_0.Args[0]
21112 if v_1.Op != OpCom32 {
21113 continue
21114 }
21115 y := v_1.Args[0]
21116 v.reset(OpCom32)
21117 v0 := b.NewValue0(v.Pos, OpAnd32, t)
21118 v0.AddArg2(x, y)
21119 v.AddArg(v0)
21120 return true
21121 }
21122 break
21123 }
21124
21125
21126 for {
21127 x := v_0
21128 if x != v_1 {
21129 break
21130 }
21131 v.copyOf(x)
21132 return true
21133 }
21134
21135
21136 for {
21137 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21138 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
21139 continue
21140 }
21141 x := v_1
21142 v.copyOf(x)
21143 return true
21144 }
21145 break
21146 }
21147
21148
21149 for {
21150 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21151 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
21152 continue
21153 }
21154 v.reset(OpConst32)
21155 v.AuxInt = int32ToAuxInt(-1)
21156 return true
21157 }
21158 break
21159 }
21160
21161
21162 for {
21163 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21164 if v_0.Op != OpCom32 {
21165 continue
21166 }
21167 x := v_0.Args[0]
21168 if x != v_1 {
21169 continue
21170 }
21171 v.reset(OpConst32)
21172 v.AuxInt = int32ToAuxInt(-1)
21173 return true
21174 }
21175 break
21176 }
21177
21178
21179 for {
21180 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21181 x := v_0
21182 if v_1.Op != OpOr32 {
21183 continue
21184 }
21185 _ = v_1.Args[1]
21186 v_1_0 := v_1.Args[0]
21187 v_1_1 := v_1.Args[1]
21188 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21189 if x != v_1_0 {
21190 continue
21191 }
21192 y := v_1_1
21193 v.reset(OpOr32)
21194 v.AddArg2(x, y)
21195 return true
21196 }
21197 }
21198 break
21199 }
21200
21201
21202
21203 for {
21204 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21205 if v_0.Op != OpAnd32 {
21206 continue
21207 }
21208 _ = v_0.Args[1]
21209 v_0_0 := v_0.Args[0]
21210 v_0_1 := v_0.Args[1]
21211 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21212 x := v_0_0
21213 if v_0_1.Op != OpConst32 {
21214 continue
21215 }
21216 c2 := auxIntToInt32(v_0_1.AuxInt)
21217 if v_1.Op != OpConst32 {
21218 continue
21219 }
21220 t := v_1.Type
21221 c1 := auxIntToInt32(v_1.AuxInt)
21222 if !(^(c1 | c2) == 0) {
21223 continue
21224 }
21225 v.reset(OpOr32)
21226 v0 := b.NewValue0(v.Pos, OpConst32, t)
21227 v0.AuxInt = int32ToAuxInt(c1)
21228 v.AddArg2(v0, x)
21229 return true
21230 }
21231 }
21232 break
21233 }
21234
21235
21236
21237 for {
21238 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21239 if v_0.Op != OpOr32 {
21240 continue
21241 }
21242 _ = v_0.Args[1]
21243 v_0_0 := v_0.Args[0]
21244 v_0_1 := v_0.Args[1]
21245 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21246 i := v_0_0
21247 if i.Op != OpConst32 {
21248 continue
21249 }
21250 t := i.Type
21251 z := v_0_1
21252 x := v_1
21253 if !(z.Op != OpConst32 && x.Op != OpConst32) {
21254 continue
21255 }
21256 v.reset(OpOr32)
21257 v0 := b.NewValue0(v.Pos, OpOr32, t)
21258 v0.AddArg2(z, x)
21259 v.AddArg2(i, v0)
21260 return true
21261 }
21262 }
21263 break
21264 }
21265
21266
21267 for {
21268 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21269 if v_0.Op != OpConst32 {
21270 continue
21271 }
21272 t := v_0.Type
21273 c := auxIntToInt32(v_0.AuxInt)
21274 if v_1.Op != OpOr32 {
21275 continue
21276 }
21277 _ = v_1.Args[1]
21278 v_1_0 := v_1.Args[0]
21279 v_1_1 := v_1.Args[1]
21280 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21281 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
21282 continue
21283 }
21284 d := auxIntToInt32(v_1_0.AuxInt)
21285 x := v_1_1
21286 v.reset(OpOr32)
21287 v0 := b.NewValue0(v.Pos, OpConst32, t)
21288 v0.AuxInt = int32ToAuxInt(c | d)
21289 v.AddArg2(v0, x)
21290 return true
21291 }
21292 }
21293 break
21294 }
21295
21296
21297
21298 for {
21299 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21300 if v_0.Op != OpLsh32x64 {
21301 continue
21302 }
21303 _ = v_0.Args[1]
21304 x := v_0.Args[0]
21305 z := v_0.Args[1]
21306 if z.Op != OpConst64 {
21307 continue
21308 }
21309 c := auxIntToInt64(z.AuxInt)
21310 if v_1.Op != OpRsh32Ux64 {
21311 continue
21312 }
21313 _ = v_1.Args[1]
21314 if x != v_1.Args[0] {
21315 continue
21316 }
21317 v_1_1 := v_1.Args[1]
21318 if v_1_1.Op != OpConst64 {
21319 continue
21320 }
21321 d := auxIntToInt64(v_1_1.AuxInt)
21322 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
21323 continue
21324 }
21325 v.reset(OpRotateLeft32)
21326 v.AddArg2(x, z)
21327 return true
21328 }
21329 break
21330 }
21331
21332
21333
21334 for {
21335 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21336 left := v_0
21337 if left.Op != OpLsh32x64 {
21338 continue
21339 }
21340 y := left.Args[1]
21341 x := left.Args[0]
21342 right := v_1
21343 if right.Op != OpRsh32Ux64 {
21344 continue
21345 }
21346 _ = right.Args[1]
21347 if x != right.Args[0] {
21348 continue
21349 }
21350 right_1 := right.Args[1]
21351 if right_1.Op != OpSub64 {
21352 continue
21353 }
21354 _ = right_1.Args[1]
21355 right_1_0 := right_1.Args[0]
21356 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21357 continue
21358 }
21359 v.reset(OpRotateLeft32)
21360 v.AddArg2(x, y)
21361 return true
21362 }
21363 break
21364 }
21365
21366
21367
21368 for {
21369 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21370 left := v_0
21371 if left.Op != OpLsh32x32 {
21372 continue
21373 }
21374 y := left.Args[1]
21375 x := left.Args[0]
21376 right := v_1
21377 if right.Op != OpRsh32Ux32 {
21378 continue
21379 }
21380 _ = right.Args[1]
21381 if x != right.Args[0] {
21382 continue
21383 }
21384 right_1 := right.Args[1]
21385 if right_1.Op != OpSub32 {
21386 continue
21387 }
21388 _ = right_1.Args[1]
21389 right_1_0 := right_1.Args[0]
21390 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21391 continue
21392 }
21393 v.reset(OpRotateLeft32)
21394 v.AddArg2(x, y)
21395 return true
21396 }
21397 break
21398 }
21399
21400
21401
21402 for {
21403 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21404 left := v_0
21405 if left.Op != OpLsh32x16 {
21406 continue
21407 }
21408 y := left.Args[1]
21409 x := left.Args[0]
21410 right := v_1
21411 if right.Op != OpRsh32Ux16 {
21412 continue
21413 }
21414 _ = right.Args[1]
21415 if x != right.Args[0] {
21416 continue
21417 }
21418 right_1 := right.Args[1]
21419 if right_1.Op != OpSub16 {
21420 continue
21421 }
21422 _ = right_1.Args[1]
21423 right_1_0 := right_1.Args[0]
21424 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21425 continue
21426 }
21427 v.reset(OpRotateLeft32)
21428 v.AddArg2(x, y)
21429 return true
21430 }
21431 break
21432 }
21433
21434
21435
21436 for {
21437 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21438 left := v_0
21439 if left.Op != OpLsh32x8 {
21440 continue
21441 }
21442 y := left.Args[1]
21443 x := left.Args[0]
21444 right := v_1
21445 if right.Op != OpRsh32Ux8 {
21446 continue
21447 }
21448 _ = right.Args[1]
21449 if x != right.Args[0] {
21450 continue
21451 }
21452 right_1 := right.Args[1]
21453 if right_1.Op != OpSub8 {
21454 continue
21455 }
21456 _ = right_1.Args[1]
21457 right_1_0 := right_1.Args[0]
21458 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21459 continue
21460 }
21461 v.reset(OpRotateLeft32)
21462 v.AddArg2(x, y)
21463 return true
21464 }
21465 break
21466 }
21467
21468
21469
21470 for {
21471 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21472 right := v_0
21473 if right.Op != OpRsh32Ux64 {
21474 continue
21475 }
21476 y := right.Args[1]
21477 x := right.Args[0]
21478 left := v_1
21479 if left.Op != OpLsh32x64 {
21480 continue
21481 }
21482 _ = left.Args[1]
21483 if x != left.Args[0] {
21484 continue
21485 }
21486 z := left.Args[1]
21487 if z.Op != OpSub64 {
21488 continue
21489 }
21490 _ = z.Args[1]
21491 z_0 := z.Args[0]
21492 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21493 continue
21494 }
21495 v.reset(OpRotateLeft32)
21496 v.AddArg2(x, z)
21497 return true
21498 }
21499 break
21500 }
21501
21502
21503
21504 for {
21505 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21506 right := v_0
21507 if right.Op != OpRsh32Ux32 {
21508 continue
21509 }
21510 y := right.Args[1]
21511 x := right.Args[0]
21512 left := v_1
21513 if left.Op != OpLsh32x32 {
21514 continue
21515 }
21516 _ = left.Args[1]
21517 if x != left.Args[0] {
21518 continue
21519 }
21520 z := left.Args[1]
21521 if z.Op != OpSub32 {
21522 continue
21523 }
21524 _ = z.Args[1]
21525 z_0 := z.Args[0]
21526 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21527 continue
21528 }
21529 v.reset(OpRotateLeft32)
21530 v.AddArg2(x, z)
21531 return true
21532 }
21533 break
21534 }
21535
21536
21537
21538 for {
21539 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21540 right := v_0
21541 if right.Op != OpRsh32Ux16 {
21542 continue
21543 }
21544 y := right.Args[1]
21545 x := right.Args[0]
21546 left := v_1
21547 if left.Op != OpLsh32x16 {
21548 continue
21549 }
21550 _ = left.Args[1]
21551 if x != left.Args[0] {
21552 continue
21553 }
21554 z := left.Args[1]
21555 if z.Op != OpSub16 {
21556 continue
21557 }
21558 _ = z.Args[1]
21559 z_0 := z.Args[0]
21560 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21561 continue
21562 }
21563 v.reset(OpRotateLeft32)
21564 v.AddArg2(x, z)
21565 return true
21566 }
21567 break
21568 }
21569
21570
21571
21572 for {
21573 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21574 right := v_0
21575 if right.Op != OpRsh32Ux8 {
21576 continue
21577 }
21578 y := right.Args[1]
21579 x := right.Args[0]
21580 left := v_1
21581 if left.Op != OpLsh32x8 {
21582 continue
21583 }
21584 _ = left.Args[1]
21585 if x != left.Args[0] {
21586 continue
21587 }
21588 z := left.Args[1]
21589 if z.Op != OpSub8 {
21590 continue
21591 }
21592 _ = z.Args[1]
21593 z_0 := z.Args[0]
21594 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
21595 continue
21596 }
21597 v.reset(OpRotateLeft32)
21598 v.AddArg2(x, z)
21599 return true
21600 }
21601 break
21602 }
21603 return false
21604 }
21605 func rewriteValuegeneric_OpOr64(v *Value) bool {
21606 v_1 := v.Args[1]
21607 v_0 := v.Args[0]
21608 b := v.Block
21609 config := b.Func.Config
21610
21611
21612 for {
21613 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21614 if v_0.Op != OpConst64 {
21615 continue
21616 }
21617 c := auxIntToInt64(v_0.AuxInt)
21618 if v_1.Op != OpConst64 {
21619 continue
21620 }
21621 d := auxIntToInt64(v_1.AuxInt)
21622 v.reset(OpConst64)
21623 v.AuxInt = int64ToAuxInt(c | d)
21624 return true
21625 }
21626 break
21627 }
21628
21629
21630 for {
21631 t := v.Type
21632 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21633 if v_0.Op != OpCom64 {
21634 continue
21635 }
21636 x := v_0.Args[0]
21637 if v_1.Op != OpCom64 {
21638 continue
21639 }
21640 y := v_1.Args[0]
21641 v.reset(OpCom64)
21642 v0 := b.NewValue0(v.Pos, OpAnd64, t)
21643 v0.AddArg2(x, y)
21644 v.AddArg(v0)
21645 return true
21646 }
21647 break
21648 }
21649
21650
21651 for {
21652 x := v_0
21653 if x != v_1 {
21654 break
21655 }
21656 v.copyOf(x)
21657 return true
21658 }
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 != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
21664 continue
21665 }
21666 x := v_1
21667 v.copyOf(x)
21668 return true
21669 }
21670 break
21671 }
21672
21673
21674 for {
21675 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21676 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
21677 continue
21678 }
21679 v.reset(OpConst64)
21680 v.AuxInt = int64ToAuxInt(-1)
21681 return true
21682 }
21683 break
21684 }
21685
21686
21687 for {
21688 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21689 if v_0.Op != OpCom64 {
21690 continue
21691 }
21692 x := v_0.Args[0]
21693 if x != v_1 {
21694 continue
21695 }
21696 v.reset(OpConst64)
21697 v.AuxInt = int64ToAuxInt(-1)
21698 return true
21699 }
21700 break
21701 }
21702
21703
21704 for {
21705 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21706 x := v_0
21707 if v_1.Op != OpOr64 {
21708 continue
21709 }
21710 _ = v_1.Args[1]
21711 v_1_0 := v_1.Args[0]
21712 v_1_1 := v_1.Args[1]
21713 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21714 if x != v_1_0 {
21715 continue
21716 }
21717 y := v_1_1
21718 v.reset(OpOr64)
21719 v.AddArg2(x, y)
21720 return true
21721 }
21722 }
21723 break
21724 }
21725
21726
21727
21728 for {
21729 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21730 if v_0.Op != OpAnd64 {
21731 continue
21732 }
21733 _ = v_0.Args[1]
21734 v_0_0 := v_0.Args[0]
21735 v_0_1 := v_0.Args[1]
21736 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21737 x := v_0_0
21738 if v_0_1.Op != OpConst64 {
21739 continue
21740 }
21741 c2 := auxIntToInt64(v_0_1.AuxInt)
21742 if v_1.Op != OpConst64 {
21743 continue
21744 }
21745 t := v_1.Type
21746 c1 := auxIntToInt64(v_1.AuxInt)
21747 if !(^(c1 | c2) == 0) {
21748 continue
21749 }
21750 v.reset(OpOr64)
21751 v0 := b.NewValue0(v.Pos, OpConst64, t)
21752 v0.AuxInt = int64ToAuxInt(c1)
21753 v.AddArg2(v0, x)
21754 return true
21755 }
21756 }
21757 break
21758 }
21759
21760
21761
21762 for {
21763 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21764 if v_0.Op != OpOr64 {
21765 continue
21766 }
21767 _ = v_0.Args[1]
21768 v_0_0 := v_0.Args[0]
21769 v_0_1 := v_0.Args[1]
21770 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
21771 i := v_0_0
21772 if i.Op != OpConst64 {
21773 continue
21774 }
21775 t := i.Type
21776 z := v_0_1
21777 x := v_1
21778 if !(z.Op != OpConst64 && x.Op != OpConst64) {
21779 continue
21780 }
21781 v.reset(OpOr64)
21782 v0 := b.NewValue0(v.Pos, OpOr64, t)
21783 v0.AddArg2(z, x)
21784 v.AddArg2(i, v0)
21785 return true
21786 }
21787 }
21788 break
21789 }
21790
21791
21792 for {
21793 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21794 if v_0.Op != OpConst64 {
21795 continue
21796 }
21797 t := v_0.Type
21798 c := auxIntToInt64(v_0.AuxInt)
21799 if v_1.Op != OpOr64 {
21800 continue
21801 }
21802 _ = v_1.Args[1]
21803 v_1_0 := v_1.Args[0]
21804 v_1_1 := v_1.Args[1]
21805 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
21806 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
21807 continue
21808 }
21809 d := auxIntToInt64(v_1_0.AuxInt)
21810 x := v_1_1
21811 v.reset(OpOr64)
21812 v0 := b.NewValue0(v.Pos, OpConst64, t)
21813 v0.AuxInt = int64ToAuxInt(c | d)
21814 v.AddArg2(v0, x)
21815 return true
21816 }
21817 }
21818 break
21819 }
21820
21821
21822
21823 for {
21824 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21825 if v_0.Op != OpLsh64x64 {
21826 continue
21827 }
21828 _ = v_0.Args[1]
21829 x := v_0.Args[0]
21830 z := v_0.Args[1]
21831 if z.Op != OpConst64 {
21832 continue
21833 }
21834 c := auxIntToInt64(z.AuxInt)
21835 if v_1.Op != OpRsh64Ux64 {
21836 continue
21837 }
21838 _ = v_1.Args[1]
21839 if x != v_1.Args[0] {
21840 continue
21841 }
21842 v_1_1 := v_1.Args[1]
21843 if v_1_1.Op != OpConst64 {
21844 continue
21845 }
21846 d := auxIntToInt64(v_1_1.AuxInt)
21847 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
21848 continue
21849 }
21850 v.reset(OpRotateLeft64)
21851 v.AddArg2(x, z)
21852 return true
21853 }
21854 break
21855 }
21856
21857
21858
21859 for {
21860 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21861 left := v_0
21862 if left.Op != OpLsh64x64 {
21863 continue
21864 }
21865 y := left.Args[1]
21866 x := left.Args[0]
21867 right := v_1
21868 if right.Op != OpRsh64Ux64 {
21869 continue
21870 }
21871 _ = right.Args[1]
21872 if x != right.Args[0] {
21873 continue
21874 }
21875 right_1 := right.Args[1]
21876 if right_1.Op != OpSub64 {
21877 continue
21878 }
21879 _ = right_1.Args[1]
21880 right_1_0 := right_1.Args[0]
21881 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
21882 continue
21883 }
21884 v.reset(OpRotateLeft64)
21885 v.AddArg2(x, y)
21886 return true
21887 }
21888 break
21889 }
21890
21891
21892
21893 for {
21894 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21895 left := v_0
21896 if left.Op != OpLsh64x32 {
21897 continue
21898 }
21899 y := left.Args[1]
21900 x := left.Args[0]
21901 right := v_1
21902 if right.Op != OpRsh64Ux32 {
21903 continue
21904 }
21905 _ = right.Args[1]
21906 if x != right.Args[0] {
21907 continue
21908 }
21909 right_1 := right.Args[1]
21910 if right_1.Op != OpSub32 {
21911 continue
21912 }
21913 _ = right_1.Args[1]
21914 right_1_0 := right_1.Args[0]
21915 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
21916 continue
21917 }
21918 v.reset(OpRotateLeft64)
21919 v.AddArg2(x, y)
21920 return true
21921 }
21922 break
21923 }
21924
21925
21926
21927 for {
21928 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21929 left := v_0
21930 if left.Op != OpLsh64x16 {
21931 continue
21932 }
21933 y := left.Args[1]
21934 x := left.Args[0]
21935 right := v_1
21936 if right.Op != OpRsh64Ux16 {
21937 continue
21938 }
21939 _ = right.Args[1]
21940 if x != right.Args[0] {
21941 continue
21942 }
21943 right_1 := right.Args[1]
21944 if right_1.Op != OpSub16 {
21945 continue
21946 }
21947 _ = right_1.Args[1]
21948 right_1_0 := right_1.Args[0]
21949 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
21950 continue
21951 }
21952 v.reset(OpRotateLeft64)
21953 v.AddArg2(x, y)
21954 return true
21955 }
21956 break
21957 }
21958
21959
21960
21961 for {
21962 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21963 left := v_0
21964 if left.Op != OpLsh64x8 {
21965 continue
21966 }
21967 y := left.Args[1]
21968 x := left.Args[0]
21969 right := v_1
21970 if right.Op != OpRsh64Ux8 {
21971 continue
21972 }
21973 _ = right.Args[1]
21974 if x != right.Args[0] {
21975 continue
21976 }
21977 right_1 := right.Args[1]
21978 if right_1.Op != OpSub8 {
21979 continue
21980 }
21981 _ = right_1.Args[1]
21982 right_1_0 := right_1.Args[0]
21983 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
21984 continue
21985 }
21986 v.reset(OpRotateLeft64)
21987 v.AddArg2(x, y)
21988 return true
21989 }
21990 break
21991 }
21992
21993
21994
21995 for {
21996 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
21997 right := v_0
21998 if right.Op != OpRsh64Ux64 {
21999 continue
22000 }
22001 y := right.Args[1]
22002 x := right.Args[0]
22003 left := v_1
22004 if left.Op != OpLsh64x64 {
22005 continue
22006 }
22007 _ = left.Args[1]
22008 if x != left.Args[0] {
22009 continue
22010 }
22011 z := left.Args[1]
22012 if z.Op != OpSub64 {
22013 continue
22014 }
22015 _ = z.Args[1]
22016 z_0 := z.Args[0]
22017 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22018 continue
22019 }
22020 v.reset(OpRotateLeft64)
22021 v.AddArg2(x, z)
22022 return true
22023 }
22024 break
22025 }
22026
22027
22028
22029 for {
22030 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22031 right := v_0
22032 if right.Op != OpRsh64Ux32 {
22033 continue
22034 }
22035 y := right.Args[1]
22036 x := right.Args[0]
22037 left := v_1
22038 if left.Op != OpLsh64x32 {
22039 continue
22040 }
22041 _ = left.Args[1]
22042 if x != left.Args[0] {
22043 continue
22044 }
22045 z := left.Args[1]
22046 if z.Op != OpSub32 {
22047 continue
22048 }
22049 _ = z.Args[1]
22050 z_0 := z.Args[0]
22051 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22052 continue
22053 }
22054 v.reset(OpRotateLeft64)
22055 v.AddArg2(x, z)
22056 return true
22057 }
22058 break
22059 }
22060
22061
22062
22063 for {
22064 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22065 right := v_0
22066 if right.Op != OpRsh64Ux16 {
22067 continue
22068 }
22069 y := right.Args[1]
22070 x := right.Args[0]
22071 left := v_1
22072 if left.Op != OpLsh64x16 {
22073 continue
22074 }
22075 _ = left.Args[1]
22076 if x != left.Args[0] {
22077 continue
22078 }
22079 z := left.Args[1]
22080 if z.Op != OpSub16 {
22081 continue
22082 }
22083 _ = z.Args[1]
22084 z_0 := z.Args[0]
22085 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22086 continue
22087 }
22088 v.reset(OpRotateLeft64)
22089 v.AddArg2(x, z)
22090 return true
22091 }
22092 break
22093 }
22094
22095
22096
22097 for {
22098 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22099 right := v_0
22100 if right.Op != OpRsh64Ux8 {
22101 continue
22102 }
22103 y := right.Args[1]
22104 x := right.Args[0]
22105 left := v_1
22106 if left.Op != OpLsh64x8 {
22107 continue
22108 }
22109 _ = left.Args[1]
22110 if x != left.Args[0] {
22111 continue
22112 }
22113 z := left.Args[1]
22114 if z.Op != OpSub8 {
22115 continue
22116 }
22117 _ = z.Args[1]
22118 z_0 := z.Args[0]
22119 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
22120 continue
22121 }
22122 v.reset(OpRotateLeft64)
22123 v.AddArg2(x, z)
22124 return true
22125 }
22126 break
22127 }
22128 return false
22129 }
22130 func rewriteValuegeneric_OpOr8(v *Value) bool {
22131 v_1 := v.Args[1]
22132 v_0 := v.Args[0]
22133 b := v.Block
22134 config := b.Func.Config
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 c := auxIntToInt8(v_0.AuxInt)
22143 if v_1.Op != OpConst8 {
22144 continue
22145 }
22146 d := auxIntToInt8(v_1.AuxInt)
22147 v.reset(OpConst8)
22148 v.AuxInt = int8ToAuxInt(c | d)
22149 return true
22150 }
22151 break
22152 }
22153
22154
22155 for {
22156 t := v.Type
22157 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22158 if v_0.Op != OpCom8 {
22159 continue
22160 }
22161 x := v_0.Args[0]
22162 if v_1.Op != OpCom8 {
22163 continue
22164 }
22165 y := v_1.Args[0]
22166 v.reset(OpCom8)
22167 v0 := b.NewValue0(v.Pos, OpAnd8, t)
22168 v0.AddArg2(x, y)
22169 v.AddArg(v0)
22170 return true
22171 }
22172 break
22173 }
22174
22175
22176 for {
22177 x := v_0
22178 if x != v_1 {
22179 break
22180 }
22181 v.copyOf(x)
22182 return true
22183 }
22184
22185
22186 for {
22187 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22188 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
22189 continue
22190 }
22191 x := v_1
22192 v.copyOf(x)
22193 return true
22194 }
22195 break
22196 }
22197
22198
22199 for {
22200 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22201 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
22202 continue
22203 }
22204 v.reset(OpConst8)
22205 v.AuxInt = int8ToAuxInt(-1)
22206 return true
22207 }
22208 break
22209 }
22210
22211
22212 for {
22213 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22214 if v_0.Op != OpCom8 {
22215 continue
22216 }
22217 x := v_0.Args[0]
22218 if x != v_1 {
22219 continue
22220 }
22221 v.reset(OpConst8)
22222 v.AuxInt = int8ToAuxInt(-1)
22223 return true
22224 }
22225 break
22226 }
22227
22228
22229 for {
22230 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22231 x := v_0
22232 if v_1.Op != OpOr8 {
22233 continue
22234 }
22235 _ = v_1.Args[1]
22236 v_1_0 := v_1.Args[0]
22237 v_1_1 := v_1.Args[1]
22238 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22239 if x != v_1_0 {
22240 continue
22241 }
22242 y := v_1_1
22243 v.reset(OpOr8)
22244 v.AddArg2(x, y)
22245 return true
22246 }
22247 }
22248 break
22249 }
22250
22251
22252
22253 for {
22254 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22255 if v_0.Op != OpAnd8 {
22256 continue
22257 }
22258 _ = v_0.Args[1]
22259 v_0_0 := v_0.Args[0]
22260 v_0_1 := v_0.Args[1]
22261 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22262 x := v_0_0
22263 if v_0_1.Op != OpConst8 {
22264 continue
22265 }
22266 c2 := auxIntToInt8(v_0_1.AuxInt)
22267 if v_1.Op != OpConst8 {
22268 continue
22269 }
22270 t := v_1.Type
22271 c1 := auxIntToInt8(v_1.AuxInt)
22272 if !(^(c1 | c2) == 0) {
22273 continue
22274 }
22275 v.reset(OpOr8)
22276 v0 := b.NewValue0(v.Pos, OpConst8, t)
22277 v0.AuxInt = int8ToAuxInt(c1)
22278 v.AddArg2(v0, x)
22279 return true
22280 }
22281 }
22282 break
22283 }
22284
22285
22286
22287 for {
22288 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22289 if v_0.Op != OpOr8 {
22290 continue
22291 }
22292 _ = v_0.Args[1]
22293 v_0_0 := v_0.Args[0]
22294 v_0_1 := v_0.Args[1]
22295 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
22296 i := v_0_0
22297 if i.Op != OpConst8 {
22298 continue
22299 }
22300 t := i.Type
22301 z := v_0_1
22302 x := v_1
22303 if !(z.Op != OpConst8 && x.Op != OpConst8) {
22304 continue
22305 }
22306 v.reset(OpOr8)
22307 v0 := b.NewValue0(v.Pos, OpOr8, t)
22308 v0.AddArg2(z, x)
22309 v.AddArg2(i, v0)
22310 return true
22311 }
22312 }
22313 break
22314 }
22315
22316
22317 for {
22318 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22319 if v_0.Op != OpConst8 {
22320 continue
22321 }
22322 t := v_0.Type
22323 c := auxIntToInt8(v_0.AuxInt)
22324 if v_1.Op != OpOr8 {
22325 continue
22326 }
22327 _ = v_1.Args[1]
22328 v_1_0 := v_1.Args[0]
22329 v_1_1 := v_1.Args[1]
22330 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
22331 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
22332 continue
22333 }
22334 d := auxIntToInt8(v_1_0.AuxInt)
22335 x := v_1_1
22336 v.reset(OpOr8)
22337 v0 := b.NewValue0(v.Pos, OpConst8, t)
22338 v0.AuxInt = int8ToAuxInt(c | d)
22339 v.AddArg2(v0, x)
22340 return true
22341 }
22342 }
22343 break
22344 }
22345
22346
22347
22348 for {
22349 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22350 if v_0.Op != OpLsh8x64 {
22351 continue
22352 }
22353 _ = v_0.Args[1]
22354 x := v_0.Args[0]
22355 z := v_0.Args[1]
22356 if z.Op != OpConst64 {
22357 continue
22358 }
22359 c := auxIntToInt64(z.AuxInt)
22360 if v_1.Op != OpRsh8Ux64 {
22361 continue
22362 }
22363 _ = v_1.Args[1]
22364 if x != v_1.Args[0] {
22365 continue
22366 }
22367 v_1_1 := v_1.Args[1]
22368 if v_1_1.Op != OpConst64 {
22369 continue
22370 }
22371 d := auxIntToInt64(v_1_1.AuxInt)
22372 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
22373 continue
22374 }
22375 v.reset(OpRotateLeft8)
22376 v.AddArg2(x, z)
22377 return true
22378 }
22379 break
22380 }
22381
22382
22383
22384 for {
22385 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22386 left := v_0
22387 if left.Op != OpLsh8x64 {
22388 continue
22389 }
22390 y := left.Args[1]
22391 x := left.Args[0]
22392 right := v_1
22393 if right.Op != OpRsh8Ux64 {
22394 continue
22395 }
22396 _ = right.Args[1]
22397 if x != right.Args[0] {
22398 continue
22399 }
22400 right_1 := right.Args[1]
22401 if right_1.Op != OpSub64 {
22402 continue
22403 }
22404 _ = right_1.Args[1]
22405 right_1_0 := right_1.Args[0]
22406 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22407 continue
22408 }
22409 v.reset(OpRotateLeft8)
22410 v.AddArg2(x, y)
22411 return true
22412 }
22413 break
22414 }
22415
22416
22417
22418 for {
22419 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22420 left := v_0
22421 if left.Op != OpLsh8x32 {
22422 continue
22423 }
22424 y := left.Args[1]
22425 x := left.Args[0]
22426 right := v_1
22427 if right.Op != OpRsh8Ux32 {
22428 continue
22429 }
22430 _ = right.Args[1]
22431 if x != right.Args[0] {
22432 continue
22433 }
22434 right_1 := right.Args[1]
22435 if right_1.Op != OpSub32 {
22436 continue
22437 }
22438 _ = right_1.Args[1]
22439 right_1_0 := right_1.Args[0]
22440 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22441 continue
22442 }
22443 v.reset(OpRotateLeft8)
22444 v.AddArg2(x, y)
22445 return true
22446 }
22447 break
22448 }
22449
22450
22451
22452 for {
22453 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22454 left := v_0
22455 if left.Op != OpLsh8x16 {
22456 continue
22457 }
22458 y := left.Args[1]
22459 x := left.Args[0]
22460 right := v_1
22461 if right.Op != OpRsh8Ux16 {
22462 continue
22463 }
22464 _ = right.Args[1]
22465 if x != right.Args[0] {
22466 continue
22467 }
22468 right_1 := right.Args[1]
22469 if right_1.Op != OpSub16 {
22470 continue
22471 }
22472 _ = right_1.Args[1]
22473 right_1_0 := right_1.Args[0]
22474 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22475 continue
22476 }
22477 v.reset(OpRotateLeft8)
22478 v.AddArg2(x, y)
22479 return true
22480 }
22481 break
22482 }
22483
22484
22485
22486 for {
22487 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22488 left := v_0
22489 if left.Op != OpLsh8x8 {
22490 continue
22491 }
22492 y := left.Args[1]
22493 x := left.Args[0]
22494 right := v_1
22495 if right.Op != OpRsh8Ux8 {
22496 continue
22497 }
22498 _ = right.Args[1]
22499 if x != right.Args[0] {
22500 continue
22501 }
22502 right_1 := right.Args[1]
22503 if right_1.Op != OpSub8 {
22504 continue
22505 }
22506 _ = right_1.Args[1]
22507 right_1_0 := right_1.Args[0]
22508 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22509 continue
22510 }
22511 v.reset(OpRotateLeft8)
22512 v.AddArg2(x, y)
22513 return true
22514 }
22515 break
22516 }
22517
22518
22519
22520 for {
22521 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22522 right := v_0
22523 if right.Op != OpRsh8Ux64 {
22524 continue
22525 }
22526 y := right.Args[1]
22527 x := right.Args[0]
22528 left := v_1
22529 if left.Op != OpLsh8x64 {
22530 continue
22531 }
22532 _ = left.Args[1]
22533 if x != left.Args[0] {
22534 continue
22535 }
22536 z := left.Args[1]
22537 if z.Op != OpSub64 {
22538 continue
22539 }
22540 _ = z.Args[1]
22541 z_0 := z.Args[0]
22542 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22543 continue
22544 }
22545 v.reset(OpRotateLeft8)
22546 v.AddArg2(x, z)
22547 return true
22548 }
22549 break
22550 }
22551
22552
22553
22554 for {
22555 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22556 right := v_0
22557 if right.Op != OpRsh8Ux32 {
22558 continue
22559 }
22560 y := right.Args[1]
22561 x := right.Args[0]
22562 left := v_1
22563 if left.Op != OpLsh8x32 {
22564 continue
22565 }
22566 _ = left.Args[1]
22567 if x != left.Args[0] {
22568 continue
22569 }
22570 z := left.Args[1]
22571 if z.Op != OpSub32 {
22572 continue
22573 }
22574 _ = z.Args[1]
22575 z_0 := z.Args[0]
22576 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22577 continue
22578 }
22579 v.reset(OpRotateLeft8)
22580 v.AddArg2(x, z)
22581 return true
22582 }
22583 break
22584 }
22585
22586
22587
22588 for {
22589 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22590 right := v_0
22591 if right.Op != OpRsh8Ux16 {
22592 continue
22593 }
22594 y := right.Args[1]
22595 x := right.Args[0]
22596 left := v_1
22597 if left.Op != OpLsh8x16 {
22598 continue
22599 }
22600 _ = left.Args[1]
22601 if x != left.Args[0] {
22602 continue
22603 }
22604 z := left.Args[1]
22605 if z.Op != OpSub16 {
22606 continue
22607 }
22608 _ = z.Args[1]
22609 z_0 := z.Args[0]
22610 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22611 continue
22612 }
22613 v.reset(OpRotateLeft8)
22614 v.AddArg2(x, z)
22615 return true
22616 }
22617 break
22618 }
22619
22620
22621
22622 for {
22623 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22624 right := v_0
22625 if right.Op != OpRsh8Ux8 {
22626 continue
22627 }
22628 y := right.Args[1]
22629 x := right.Args[0]
22630 left := v_1
22631 if left.Op != OpLsh8x8 {
22632 continue
22633 }
22634 _ = left.Args[1]
22635 if x != left.Args[0] {
22636 continue
22637 }
22638 z := left.Args[1]
22639 if z.Op != OpSub8 {
22640 continue
22641 }
22642 _ = z.Args[1]
22643 z_0 := z.Args[0]
22644 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
22645 continue
22646 }
22647 v.reset(OpRotateLeft8)
22648 v.AddArg2(x, z)
22649 return true
22650 }
22651 break
22652 }
22653 return false
22654 }
22655 func rewriteValuegeneric_OpOrB(v *Value) bool {
22656 v_1 := v.Args[1]
22657 v_0 := v.Args[0]
22658 b := v.Block
22659 typ := &b.Func.Config.Types
22660
22661
22662
22663 for {
22664 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22665 if v_0.Op != OpLess64 {
22666 continue
22667 }
22668 x := v_0.Args[1]
22669 v_0_0 := v_0.Args[0]
22670 if v_0_0.Op != OpConst64 {
22671 continue
22672 }
22673 c := auxIntToInt64(v_0_0.AuxInt)
22674 if v_1.Op != OpLess64 {
22675 continue
22676 }
22677 _ = v_1.Args[1]
22678 if x != v_1.Args[0] {
22679 continue
22680 }
22681 v_1_1 := v_1.Args[1]
22682 if v_1_1.Op != OpConst64 {
22683 continue
22684 }
22685 d := auxIntToInt64(v_1_1.AuxInt)
22686 if !(c >= d) {
22687 continue
22688 }
22689 v.reset(OpLess64U)
22690 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
22691 v0.AuxInt = int64ToAuxInt(c - d)
22692 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
22693 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
22694 v2.AuxInt = int64ToAuxInt(d)
22695 v1.AddArg2(x, v2)
22696 v.AddArg2(v0, v1)
22697 return true
22698 }
22699 break
22700 }
22701
22702
22703
22704 for {
22705 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22706 if v_0.Op != OpLeq64 {
22707 continue
22708 }
22709 x := v_0.Args[1]
22710 v_0_0 := v_0.Args[0]
22711 if v_0_0.Op != OpConst64 {
22712 continue
22713 }
22714 c := auxIntToInt64(v_0_0.AuxInt)
22715 if v_1.Op != OpLess64 {
22716 continue
22717 }
22718 _ = v_1.Args[1]
22719 if x != v_1.Args[0] {
22720 continue
22721 }
22722 v_1_1 := v_1.Args[1]
22723 if v_1_1.Op != OpConst64 {
22724 continue
22725 }
22726 d := auxIntToInt64(v_1_1.AuxInt)
22727 if !(c >= d) {
22728 continue
22729 }
22730 v.reset(OpLeq64U)
22731 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
22732 v0.AuxInt = int64ToAuxInt(c - d)
22733 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
22734 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
22735 v2.AuxInt = int64ToAuxInt(d)
22736 v1.AddArg2(x, v2)
22737 v.AddArg2(v0, v1)
22738 return true
22739 }
22740 break
22741 }
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 != OpLess32 {
22748 continue
22749 }
22750 x := v_0.Args[1]
22751 v_0_0 := v_0.Args[0]
22752 if v_0_0.Op != OpConst32 {
22753 continue
22754 }
22755 c := auxIntToInt32(v_0_0.AuxInt)
22756 if v_1.Op != OpLess32 {
22757 continue
22758 }
22759 _ = v_1.Args[1]
22760 if x != v_1.Args[0] {
22761 continue
22762 }
22763 v_1_1 := v_1.Args[1]
22764 if v_1_1.Op != OpConst32 {
22765 continue
22766 }
22767 d := auxIntToInt32(v_1_1.AuxInt)
22768 if !(c >= d) {
22769 continue
22770 }
22771 v.reset(OpLess32U)
22772 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
22773 v0.AuxInt = int32ToAuxInt(c - d)
22774 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
22775 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
22776 v2.AuxInt = int32ToAuxInt(d)
22777 v1.AddArg2(x, v2)
22778 v.AddArg2(v0, v1)
22779 return true
22780 }
22781 break
22782 }
22783
22784
22785
22786 for {
22787 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22788 if v_0.Op != OpLeq32 {
22789 continue
22790 }
22791 x := v_0.Args[1]
22792 v_0_0 := v_0.Args[0]
22793 if v_0_0.Op != OpConst32 {
22794 continue
22795 }
22796 c := auxIntToInt32(v_0_0.AuxInt)
22797 if v_1.Op != OpLess32 {
22798 continue
22799 }
22800 _ = v_1.Args[1]
22801 if x != v_1.Args[0] {
22802 continue
22803 }
22804 v_1_1 := v_1.Args[1]
22805 if v_1_1.Op != OpConst32 {
22806 continue
22807 }
22808 d := auxIntToInt32(v_1_1.AuxInt)
22809 if !(c >= d) {
22810 continue
22811 }
22812 v.reset(OpLeq32U)
22813 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
22814 v0.AuxInt = int32ToAuxInt(c - d)
22815 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
22816 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
22817 v2.AuxInt = int32ToAuxInt(d)
22818 v1.AddArg2(x, v2)
22819 v.AddArg2(v0, v1)
22820 return true
22821 }
22822 break
22823 }
22824
22825
22826
22827 for {
22828 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22829 if v_0.Op != OpLess16 {
22830 continue
22831 }
22832 x := v_0.Args[1]
22833 v_0_0 := v_0.Args[0]
22834 if v_0_0.Op != OpConst16 {
22835 continue
22836 }
22837 c := auxIntToInt16(v_0_0.AuxInt)
22838 if v_1.Op != OpLess16 {
22839 continue
22840 }
22841 _ = v_1.Args[1]
22842 if x != v_1.Args[0] {
22843 continue
22844 }
22845 v_1_1 := v_1.Args[1]
22846 if v_1_1.Op != OpConst16 {
22847 continue
22848 }
22849 d := auxIntToInt16(v_1_1.AuxInt)
22850 if !(c >= d) {
22851 continue
22852 }
22853 v.reset(OpLess16U)
22854 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
22855 v0.AuxInt = int16ToAuxInt(c - d)
22856 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
22857 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
22858 v2.AuxInt = int16ToAuxInt(d)
22859 v1.AddArg2(x, v2)
22860 v.AddArg2(v0, v1)
22861 return true
22862 }
22863 break
22864 }
22865
22866
22867
22868 for {
22869 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22870 if v_0.Op != OpLeq16 {
22871 continue
22872 }
22873 x := v_0.Args[1]
22874 v_0_0 := v_0.Args[0]
22875 if v_0_0.Op != OpConst16 {
22876 continue
22877 }
22878 c := auxIntToInt16(v_0_0.AuxInt)
22879 if v_1.Op != OpLess16 {
22880 continue
22881 }
22882 _ = v_1.Args[1]
22883 if x != v_1.Args[0] {
22884 continue
22885 }
22886 v_1_1 := v_1.Args[1]
22887 if v_1_1.Op != OpConst16 {
22888 continue
22889 }
22890 d := auxIntToInt16(v_1_1.AuxInt)
22891 if !(c >= d) {
22892 continue
22893 }
22894 v.reset(OpLeq16U)
22895 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
22896 v0.AuxInt = int16ToAuxInt(c - d)
22897 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
22898 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
22899 v2.AuxInt = int16ToAuxInt(d)
22900 v1.AddArg2(x, v2)
22901 v.AddArg2(v0, v1)
22902 return true
22903 }
22904 break
22905 }
22906
22907
22908
22909 for {
22910 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22911 if v_0.Op != OpLess8 {
22912 continue
22913 }
22914 x := v_0.Args[1]
22915 v_0_0 := v_0.Args[0]
22916 if v_0_0.Op != OpConst8 {
22917 continue
22918 }
22919 c := auxIntToInt8(v_0_0.AuxInt)
22920 if v_1.Op != OpLess8 {
22921 continue
22922 }
22923 _ = v_1.Args[1]
22924 if x != v_1.Args[0] {
22925 continue
22926 }
22927 v_1_1 := v_1.Args[1]
22928 if v_1_1.Op != OpConst8 {
22929 continue
22930 }
22931 d := auxIntToInt8(v_1_1.AuxInt)
22932 if !(c >= d) {
22933 continue
22934 }
22935 v.reset(OpLess8U)
22936 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
22937 v0.AuxInt = int8ToAuxInt(c - d)
22938 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
22939 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
22940 v2.AuxInt = int8ToAuxInt(d)
22941 v1.AddArg2(x, v2)
22942 v.AddArg2(v0, v1)
22943 return true
22944 }
22945 break
22946 }
22947
22948
22949
22950 for {
22951 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22952 if v_0.Op != OpLeq8 {
22953 continue
22954 }
22955 x := v_0.Args[1]
22956 v_0_0 := v_0.Args[0]
22957 if v_0_0.Op != OpConst8 {
22958 continue
22959 }
22960 c := auxIntToInt8(v_0_0.AuxInt)
22961 if v_1.Op != OpLess8 {
22962 continue
22963 }
22964 _ = v_1.Args[1]
22965 if x != v_1.Args[0] {
22966 continue
22967 }
22968 v_1_1 := v_1.Args[1]
22969 if v_1_1.Op != OpConst8 {
22970 continue
22971 }
22972 d := auxIntToInt8(v_1_1.AuxInt)
22973 if !(c >= d) {
22974 continue
22975 }
22976 v.reset(OpLeq8U)
22977 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
22978 v0.AuxInt = int8ToAuxInt(c - d)
22979 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
22980 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
22981 v2.AuxInt = int8ToAuxInt(d)
22982 v1.AddArg2(x, v2)
22983 v.AddArg2(v0, v1)
22984 return true
22985 }
22986 break
22987 }
22988
22989
22990
22991 for {
22992 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
22993 if v_0.Op != OpLess64 {
22994 continue
22995 }
22996 x := v_0.Args[1]
22997 v_0_0 := v_0.Args[0]
22998 if v_0_0.Op != OpConst64 {
22999 continue
23000 }
23001 c := auxIntToInt64(v_0_0.AuxInt)
23002 if v_1.Op != OpLeq64 {
23003 continue
23004 }
23005 _ = v_1.Args[1]
23006 if x != v_1.Args[0] {
23007 continue
23008 }
23009 v_1_1 := v_1.Args[1]
23010 if v_1_1.Op != OpConst64 {
23011 continue
23012 }
23013 d := auxIntToInt64(v_1_1.AuxInt)
23014 if !(c >= d+1 && d+1 > d) {
23015 continue
23016 }
23017 v.reset(OpLess64U)
23018 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23019 v0.AuxInt = int64ToAuxInt(c - d - 1)
23020 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23021 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23022 v2.AuxInt = int64ToAuxInt(d + 1)
23023 v1.AddArg2(x, v2)
23024 v.AddArg2(v0, v1)
23025 return true
23026 }
23027 break
23028 }
23029
23030
23031
23032 for {
23033 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23034 if v_0.Op != OpLeq64 {
23035 continue
23036 }
23037 x := v_0.Args[1]
23038 v_0_0 := v_0.Args[0]
23039 if v_0_0.Op != OpConst64 {
23040 continue
23041 }
23042 c := auxIntToInt64(v_0_0.AuxInt)
23043 if v_1.Op != OpLeq64 {
23044 continue
23045 }
23046 _ = v_1.Args[1]
23047 if x != v_1.Args[0] {
23048 continue
23049 }
23050 v_1_1 := v_1.Args[1]
23051 if v_1_1.Op != OpConst64 {
23052 continue
23053 }
23054 d := auxIntToInt64(v_1_1.AuxInt)
23055 if !(c >= d+1 && d+1 > d) {
23056 continue
23057 }
23058 v.reset(OpLeq64U)
23059 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23060 v0.AuxInt = int64ToAuxInt(c - d - 1)
23061 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23062 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23063 v2.AuxInt = int64ToAuxInt(d + 1)
23064 v1.AddArg2(x, v2)
23065 v.AddArg2(v0, v1)
23066 return true
23067 }
23068 break
23069 }
23070
23071
23072
23073 for {
23074 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23075 if v_0.Op != OpLess32 {
23076 continue
23077 }
23078 x := v_0.Args[1]
23079 v_0_0 := v_0.Args[0]
23080 if v_0_0.Op != OpConst32 {
23081 continue
23082 }
23083 c := auxIntToInt32(v_0_0.AuxInt)
23084 if v_1.Op != OpLeq32 {
23085 continue
23086 }
23087 _ = v_1.Args[1]
23088 if x != v_1.Args[0] {
23089 continue
23090 }
23091 v_1_1 := v_1.Args[1]
23092 if v_1_1.Op != OpConst32 {
23093 continue
23094 }
23095 d := auxIntToInt32(v_1_1.AuxInt)
23096 if !(c >= d+1 && d+1 > d) {
23097 continue
23098 }
23099 v.reset(OpLess32U)
23100 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23101 v0.AuxInt = int32ToAuxInt(c - d - 1)
23102 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23103 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23104 v2.AuxInt = int32ToAuxInt(d + 1)
23105 v1.AddArg2(x, v2)
23106 v.AddArg2(v0, v1)
23107 return true
23108 }
23109 break
23110 }
23111
23112
23113
23114 for {
23115 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23116 if v_0.Op != OpLeq32 {
23117 continue
23118 }
23119 x := v_0.Args[1]
23120 v_0_0 := v_0.Args[0]
23121 if v_0_0.Op != OpConst32 {
23122 continue
23123 }
23124 c := auxIntToInt32(v_0_0.AuxInt)
23125 if v_1.Op != OpLeq32 {
23126 continue
23127 }
23128 _ = v_1.Args[1]
23129 if x != v_1.Args[0] {
23130 continue
23131 }
23132 v_1_1 := v_1.Args[1]
23133 if v_1_1.Op != OpConst32 {
23134 continue
23135 }
23136 d := auxIntToInt32(v_1_1.AuxInt)
23137 if !(c >= d+1 && d+1 > d) {
23138 continue
23139 }
23140 v.reset(OpLeq32U)
23141 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23142 v0.AuxInt = int32ToAuxInt(c - d - 1)
23143 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23144 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23145 v2.AuxInt = int32ToAuxInt(d + 1)
23146 v1.AddArg2(x, v2)
23147 v.AddArg2(v0, v1)
23148 return true
23149 }
23150 break
23151 }
23152
23153
23154
23155 for {
23156 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23157 if v_0.Op != OpLess16 {
23158 continue
23159 }
23160 x := v_0.Args[1]
23161 v_0_0 := v_0.Args[0]
23162 if v_0_0.Op != OpConst16 {
23163 continue
23164 }
23165 c := auxIntToInt16(v_0_0.AuxInt)
23166 if v_1.Op != OpLeq16 {
23167 continue
23168 }
23169 _ = v_1.Args[1]
23170 if x != v_1.Args[0] {
23171 continue
23172 }
23173 v_1_1 := v_1.Args[1]
23174 if v_1_1.Op != OpConst16 {
23175 continue
23176 }
23177 d := auxIntToInt16(v_1_1.AuxInt)
23178 if !(c >= d+1 && d+1 > d) {
23179 continue
23180 }
23181 v.reset(OpLess16U)
23182 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23183 v0.AuxInt = int16ToAuxInt(c - d - 1)
23184 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23185 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23186 v2.AuxInt = int16ToAuxInt(d + 1)
23187 v1.AddArg2(x, v2)
23188 v.AddArg2(v0, v1)
23189 return true
23190 }
23191 break
23192 }
23193
23194
23195
23196 for {
23197 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23198 if v_0.Op != OpLeq16 {
23199 continue
23200 }
23201 x := v_0.Args[1]
23202 v_0_0 := v_0.Args[0]
23203 if v_0_0.Op != OpConst16 {
23204 continue
23205 }
23206 c := auxIntToInt16(v_0_0.AuxInt)
23207 if v_1.Op != OpLeq16 {
23208 continue
23209 }
23210 _ = v_1.Args[1]
23211 if x != v_1.Args[0] {
23212 continue
23213 }
23214 v_1_1 := v_1.Args[1]
23215 if v_1_1.Op != OpConst16 {
23216 continue
23217 }
23218 d := auxIntToInt16(v_1_1.AuxInt)
23219 if !(c >= d+1 && d+1 > d) {
23220 continue
23221 }
23222 v.reset(OpLeq16U)
23223 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23224 v0.AuxInt = int16ToAuxInt(c - d - 1)
23225 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23226 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23227 v2.AuxInt = int16ToAuxInt(d + 1)
23228 v1.AddArg2(x, v2)
23229 v.AddArg2(v0, v1)
23230 return true
23231 }
23232 break
23233 }
23234
23235
23236
23237 for {
23238 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23239 if v_0.Op != OpLess8 {
23240 continue
23241 }
23242 x := v_0.Args[1]
23243 v_0_0 := v_0.Args[0]
23244 if v_0_0.Op != OpConst8 {
23245 continue
23246 }
23247 c := auxIntToInt8(v_0_0.AuxInt)
23248 if v_1.Op != OpLeq8 {
23249 continue
23250 }
23251 _ = v_1.Args[1]
23252 if x != v_1.Args[0] {
23253 continue
23254 }
23255 v_1_1 := v_1.Args[1]
23256 if v_1_1.Op != OpConst8 {
23257 continue
23258 }
23259 d := auxIntToInt8(v_1_1.AuxInt)
23260 if !(c >= d+1 && d+1 > d) {
23261 continue
23262 }
23263 v.reset(OpLess8U)
23264 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23265 v0.AuxInt = int8ToAuxInt(c - d - 1)
23266 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23267 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23268 v2.AuxInt = int8ToAuxInt(d + 1)
23269 v1.AddArg2(x, v2)
23270 v.AddArg2(v0, v1)
23271 return true
23272 }
23273 break
23274 }
23275
23276
23277
23278 for {
23279 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23280 if v_0.Op != OpLeq8 {
23281 continue
23282 }
23283 x := v_0.Args[1]
23284 v_0_0 := v_0.Args[0]
23285 if v_0_0.Op != OpConst8 {
23286 continue
23287 }
23288 c := auxIntToInt8(v_0_0.AuxInt)
23289 if v_1.Op != OpLeq8 {
23290 continue
23291 }
23292 _ = v_1.Args[1]
23293 if x != v_1.Args[0] {
23294 continue
23295 }
23296 v_1_1 := v_1.Args[1]
23297 if v_1_1.Op != OpConst8 {
23298 continue
23299 }
23300 d := auxIntToInt8(v_1_1.AuxInt)
23301 if !(c >= d+1 && d+1 > d) {
23302 continue
23303 }
23304 v.reset(OpLeq8U)
23305 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23306 v0.AuxInt = int8ToAuxInt(c - d - 1)
23307 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23308 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23309 v2.AuxInt = int8ToAuxInt(d + 1)
23310 v1.AddArg2(x, v2)
23311 v.AddArg2(v0, v1)
23312 return true
23313 }
23314 break
23315 }
23316
23317
23318
23319 for {
23320 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23321 if v_0.Op != OpLess64U {
23322 continue
23323 }
23324 x := v_0.Args[1]
23325 v_0_0 := v_0.Args[0]
23326 if v_0_0.Op != OpConst64 {
23327 continue
23328 }
23329 c := auxIntToInt64(v_0_0.AuxInt)
23330 if v_1.Op != OpLess64U {
23331 continue
23332 }
23333 _ = v_1.Args[1]
23334 if x != v_1.Args[0] {
23335 continue
23336 }
23337 v_1_1 := v_1.Args[1]
23338 if v_1_1.Op != OpConst64 {
23339 continue
23340 }
23341 d := auxIntToInt64(v_1_1.AuxInt)
23342 if !(uint64(c) >= uint64(d)) {
23343 continue
23344 }
23345 v.reset(OpLess64U)
23346 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23347 v0.AuxInt = int64ToAuxInt(c - d)
23348 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23349 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23350 v2.AuxInt = int64ToAuxInt(d)
23351 v1.AddArg2(x, v2)
23352 v.AddArg2(v0, v1)
23353 return true
23354 }
23355 break
23356 }
23357
23358
23359
23360 for {
23361 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23362 if v_0.Op != OpLeq64U {
23363 continue
23364 }
23365 x := v_0.Args[1]
23366 v_0_0 := v_0.Args[0]
23367 if v_0_0.Op != OpConst64 {
23368 continue
23369 }
23370 c := auxIntToInt64(v_0_0.AuxInt)
23371 if v_1.Op != OpLess64U {
23372 continue
23373 }
23374 _ = v_1.Args[1]
23375 if x != v_1.Args[0] {
23376 continue
23377 }
23378 v_1_1 := v_1.Args[1]
23379 if v_1_1.Op != OpConst64 {
23380 continue
23381 }
23382 d := auxIntToInt64(v_1_1.AuxInt)
23383 if !(uint64(c) >= uint64(d)) {
23384 continue
23385 }
23386 v.reset(OpLeq64U)
23387 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23388 v0.AuxInt = int64ToAuxInt(c - d)
23389 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23390 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23391 v2.AuxInt = int64ToAuxInt(d)
23392 v1.AddArg2(x, v2)
23393 v.AddArg2(v0, v1)
23394 return true
23395 }
23396 break
23397 }
23398
23399
23400
23401 for {
23402 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23403 if v_0.Op != OpLess32U {
23404 continue
23405 }
23406 x := v_0.Args[1]
23407 v_0_0 := v_0.Args[0]
23408 if v_0_0.Op != OpConst32 {
23409 continue
23410 }
23411 c := auxIntToInt32(v_0_0.AuxInt)
23412 if v_1.Op != OpLess32U {
23413 continue
23414 }
23415 _ = v_1.Args[1]
23416 if x != v_1.Args[0] {
23417 continue
23418 }
23419 v_1_1 := v_1.Args[1]
23420 if v_1_1.Op != OpConst32 {
23421 continue
23422 }
23423 d := auxIntToInt32(v_1_1.AuxInt)
23424 if !(uint32(c) >= uint32(d)) {
23425 continue
23426 }
23427 v.reset(OpLess32U)
23428 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23429 v0.AuxInt = int32ToAuxInt(c - d)
23430 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23431 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23432 v2.AuxInt = int32ToAuxInt(d)
23433 v1.AddArg2(x, v2)
23434 v.AddArg2(v0, v1)
23435 return true
23436 }
23437 break
23438 }
23439
23440
23441
23442 for {
23443 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23444 if v_0.Op != OpLeq32U {
23445 continue
23446 }
23447 x := v_0.Args[1]
23448 v_0_0 := v_0.Args[0]
23449 if v_0_0.Op != OpConst32 {
23450 continue
23451 }
23452 c := auxIntToInt32(v_0_0.AuxInt)
23453 if v_1.Op != OpLess32U {
23454 continue
23455 }
23456 _ = v_1.Args[1]
23457 if x != v_1.Args[0] {
23458 continue
23459 }
23460 v_1_1 := v_1.Args[1]
23461 if v_1_1.Op != OpConst32 {
23462 continue
23463 }
23464 d := auxIntToInt32(v_1_1.AuxInt)
23465 if !(uint32(c) >= uint32(d)) {
23466 continue
23467 }
23468 v.reset(OpLeq32U)
23469 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23470 v0.AuxInt = int32ToAuxInt(c - d)
23471 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23472 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23473 v2.AuxInt = int32ToAuxInt(d)
23474 v1.AddArg2(x, v2)
23475 v.AddArg2(v0, v1)
23476 return true
23477 }
23478 break
23479 }
23480
23481
23482
23483 for {
23484 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23485 if v_0.Op != OpLess16U {
23486 continue
23487 }
23488 x := v_0.Args[1]
23489 v_0_0 := v_0.Args[0]
23490 if v_0_0.Op != OpConst16 {
23491 continue
23492 }
23493 c := auxIntToInt16(v_0_0.AuxInt)
23494 if v_1.Op != OpLess16U {
23495 continue
23496 }
23497 _ = v_1.Args[1]
23498 if x != v_1.Args[0] {
23499 continue
23500 }
23501 v_1_1 := v_1.Args[1]
23502 if v_1_1.Op != OpConst16 {
23503 continue
23504 }
23505 d := auxIntToInt16(v_1_1.AuxInt)
23506 if !(uint16(c) >= uint16(d)) {
23507 continue
23508 }
23509 v.reset(OpLess16U)
23510 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23511 v0.AuxInt = int16ToAuxInt(c - d)
23512 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23513 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23514 v2.AuxInt = int16ToAuxInt(d)
23515 v1.AddArg2(x, v2)
23516 v.AddArg2(v0, v1)
23517 return true
23518 }
23519 break
23520 }
23521
23522
23523
23524 for {
23525 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23526 if v_0.Op != OpLeq16U {
23527 continue
23528 }
23529 x := v_0.Args[1]
23530 v_0_0 := v_0.Args[0]
23531 if v_0_0.Op != OpConst16 {
23532 continue
23533 }
23534 c := auxIntToInt16(v_0_0.AuxInt)
23535 if v_1.Op != OpLess16U {
23536 continue
23537 }
23538 _ = v_1.Args[1]
23539 if x != v_1.Args[0] {
23540 continue
23541 }
23542 v_1_1 := v_1.Args[1]
23543 if v_1_1.Op != OpConst16 {
23544 continue
23545 }
23546 d := auxIntToInt16(v_1_1.AuxInt)
23547 if !(uint16(c) >= uint16(d)) {
23548 continue
23549 }
23550 v.reset(OpLeq16U)
23551 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23552 v0.AuxInt = int16ToAuxInt(c - d)
23553 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23554 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23555 v2.AuxInt = int16ToAuxInt(d)
23556 v1.AddArg2(x, v2)
23557 v.AddArg2(v0, v1)
23558 return true
23559 }
23560 break
23561 }
23562
23563
23564
23565 for {
23566 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23567 if v_0.Op != OpLess8U {
23568 continue
23569 }
23570 x := v_0.Args[1]
23571 v_0_0 := v_0.Args[0]
23572 if v_0_0.Op != OpConst8 {
23573 continue
23574 }
23575 c := auxIntToInt8(v_0_0.AuxInt)
23576 if v_1.Op != OpLess8U {
23577 continue
23578 }
23579 _ = v_1.Args[1]
23580 if x != v_1.Args[0] {
23581 continue
23582 }
23583 v_1_1 := v_1.Args[1]
23584 if v_1_1.Op != OpConst8 {
23585 continue
23586 }
23587 d := auxIntToInt8(v_1_1.AuxInt)
23588 if !(uint8(c) >= uint8(d)) {
23589 continue
23590 }
23591 v.reset(OpLess8U)
23592 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23593 v0.AuxInt = int8ToAuxInt(c - d)
23594 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23595 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23596 v2.AuxInt = int8ToAuxInt(d)
23597 v1.AddArg2(x, v2)
23598 v.AddArg2(v0, v1)
23599 return true
23600 }
23601 break
23602 }
23603
23604
23605
23606 for {
23607 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23608 if v_0.Op != OpLeq8U {
23609 continue
23610 }
23611 x := v_0.Args[1]
23612 v_0_0 := v_0.Args[0]
23613 if v_0_0.Op != OpConst8 {
23614 continue
23615 }
23616 c := auxIntToInt8(v_0_0.AuxInt)
23617 if v_1.Op != OpLess8U {
23618 continue
23619 }
23620 _ = v_1.Args[1]
23621 if x != v_1.Args[0] {
23622 continue
23623 }
23624 v_1_1 := v_1.Args[1]
23625 if v_1_1.Op != OpConst8 {
23626 continue
23627 }
23628 d := auxIntToInt8(v_1_1.AuxInt)
23629 if !(uint8(c) >= uint8(d)) {
23630 continue
23631 }
23632 v.reset(OpLeq8U)
23633 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23634 v0.AuxInt = int8ToAuxInt(c - d)
23635 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23636 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23637 v2.AuxInt = int8ToAuxInt(d)
23638 v1.AddArg2(x, v2)
23639 v.AddArg2(v0, v1)
23640 return true
23641 }
23642 break
23643 }
23644
23645
23646
23647 for {
23648 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23649 if v_0.Op != OpLess64U {
23650 continue
23651 }
23652 x := v_0.Args[1]
23653 v_0_0 := v_0.Args[0]
23654 if v_0_0.Op != OpConst64 {
23655 continue
23656 }
23657 c := auxIntToInt64(v_0_0.AuxInt)
23658 if v_1.Op != OpLeq64U {
23659 continue
23660 }
23661 _ = v_1.Args[1]
23662 if x != v_1.Args[0] {
23663 continue
23664 }
23665 v_1_1 := v_1.Args[1]
23666 if v_1_1.Op != OpConst64 {
23667 continue
23668 }
23669 d := auxIntToInt64(v_1_1.AuxInt)
23670 if !(uint64(c) >= uint64(d+1) && uint64(d+1) > uint64(d)) {
23671 continue
23672 }
23673 v.reset(OpLess64U)
23674 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23675 v0.AuxInt = int64ToAuxInt(c - d - 1)
23676 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23677 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23678 v2.AuxInt = int64ToAuxInt(d + 1)
23679 v1.AddArg2(x, v2)
23680 v.AddArg2(v0, v1)
23681 return true
23682 }
23683 break
23684 }
23685
23686
23687
23688 for {
23689 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23690 if v_0.Op != OpLeq64U {
23691 continue
23692 }
23693 x := v_0.Args[1]
23694 v_0_0 := v_0.Args[0]
23695 if v_0_0.Op != OpConst64 {
23696 continue
23697 }
23698 c := auxIntToInt64(v_0_0.AuxInt)
23699 if v_1.Op != OpLeq64U {
23700 continue
23701 }
23702 _ = v_1.Args[1]
23703 if x != v_1.Args[0] {
23704 continue
23705 }
23706 v_1_1 := v_1.Args[1]
23707 if v_1_1.Op != OpConst64 {
23708 continue
23709 }
23710 d := auxIntToInt64(v_1_1.AuxInt)
23711 if !(uint64(c) >= uint64(d+1) && uint64(d+1) > uint64(d)) {
23712 continue
23713 }
23714 v.reset(OpLeq64U)
23715 v0 := b.NewValue0(v.Pos, OpConst64, x.Type)
23716 v0.AuxInt = int64ToAuxInt(c - d - 1)
23717 v1 := b.NewValue0(v.Pos, OpSub64, x.Type)
23718 v2 := b.NewValue0(v.Pos, OpConst64, x.Type)
23719 v2.AuxInt = int64ToAuxInt(d + 1)
23720 v1.AddArg2(x, v2)
23721 v.AddArg2(v0, v1)
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 if v_0.Op != OpLess32U {
23732 continue
23733 }
23734 x := v_0.Args[1]
23735 v_0_0 := v_0.Args[0]
23736 if v_0_0.Op != OpConst32 {
23737 continue
23738 }
23739 c := auxIntToInt32(v_0_0.AuxInt)
23740 if v_1.Op != OpLeq32U {
23741 continue
23742 }
23743 _ = v_1.Args[1]
23744 if x != v_1.Args[0] {
23745 continue
23746 }
23747 v_1_1 := v_1.Args[1]
23748 if v_1_1.Op != OpConst32 {
23749 continue
23750 }
23751 d := auxIntToInt32(v_1_1.AuxInt)
23752 if !(uint32(c) >= uint32(d+1) && uint32(d+1) > uint32(d)) {
23753 continue
23754 }
23755 v.reset(OpLess32U)
23756 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23757 v0.AuxInt = int32ToAuxInt(c - d - 1)
23758 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23759 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23760 v2.AuxInt = int32ToAuxInt(d + 1)
23761 v1.AddArg2(x, v2)
23762 v.AddArg2(v0, v1)
23763 return true
23764 }
23765 break
23766 }
23767
23768
23769
23770 for {
23771 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23772 if v_0.Op != OpLeq32U {
23773 continue
23774 }
23775 x := v_0.Args[1]
23776 v_0_0 := v_0.Args[0]
23777 if v_0_0.Op != OpConst32 {
23778 continue
23779 }
23780 c := auxIntToInt32(v_0_0.AuxInt)
23781 if v_1.Op != OpLeq32U {
23782 continue
23783 }
23784 _ = v_1.Args[1]
23785 if x != v_1.Args[0] {
23786 continue
23787 }
23788 v_1_1 := v_1.Args[1]
23789 if v_1_1.Op != OpConst32 {
23790 continue
23791 }
23792 d := auxIntToInt32(v_1_1.AuxInt)
23793 if !(uint32(c) >= uint32(d+1) && uint32(d+1) > uint32(d)) {
23794 continue
23795 }
23796 v.reset(OpLeq32U)
23797 v0 := b.NewValue0(v.Pos, OpConst32, x.Type)
23798 v0.AuxInt = int32ToAuxInt(c - d - 1)
23799 v1 := b.NewValue0(v.Pos, OpSub32, x.Type)
23800 v2 := b.NewValue0(v.Pos, OpConst32, x.Type)
23801 v2.AuxInt = int32ToAuxInt(d + 1)
23802 v1.AddArg2(x, v2)
23803 v.AddArg2(v0, v1)
23804 return true
23805 }
23806 break
23807 }
23808
23809
23810
23811 for {
23812 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23813 if v_0.Op != OpLess16U {
23814 continue
23815 }
23816 x := v_0.Args[1]
23817 v_0_0 := v_0.Args[0]
23818 if v_0_0.Op != OpConst16 {
23819 continue
23820 }
23821 c := auxIntToInt16(v_0_0.AuxInt)
23822 if v_1.Op != OpLeq16U {
23823 continue
23824 }
23825 _ = v_1.Args[1]
23826 if x != v_1.Args[0] {
23827 continue
23828 }
23829 v_1_1 := v_1.Args[1]
23830 if v_1_1.Op != OpConst16 {
23831 continue
23832 }
23833 d := auxIntToInt16(v_1_1.AuxInt)
23834 if !(uint16(c) >= uint16(d+1) && uint16(d+1) > uint16(d)) {
23835 continue
23836 }
23837 v.reset(OpLess16U)
23838 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23839 v0.AuxInt = int16ToAuxInt(c - d - 1)
23840 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23841 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23842 v2.AuxInt = int16ToAuxInt(d + 1)
23843 v1.AddArg2(x, v2)
23844 v.AddArg2(v0, v1)
23845 return true
23846 }
23847 break
23848 }
23849
23850
23851
23852 for {
23853 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23854 if v_0.Op != OpLeq16U {
23855 continue
23856 }
23857 x := v_0.Args[1]
23858 v_0_0 := v_0.Args[0]
23859 if v_0_0.Op != OpConst16 {
23860 continue
23861 }
23862 c := auxIntToInt16(v_0_0.AuxInt)
23863 if v_1.Op != OpLeq16U {
23864 continue
23865 }
23866 _ = v_1.Args[1]
23867 if x != v_1.Args[0] {
23868 continue
23869 }
23870 v_1_1 := v_1.Args[1]
23871 if v_1_1.Op != OpConst16 {
23872 continue
23873 }
23874 d := auxIntToInt16(v_1_1.AuxInt)
23875 if !(uint16(c) >= uint16(d+1) && uint16(d+1) > uint16(d)) {
23876 continue
23877 }
23878 v.reset(OpLeq16U)
23879 v0 := b.NewValue0(v.Pos, OpConst16, x.Type)
23880 v0.AuxInt = int16ToAuxInt(c - d - 1)
23881 v1 := b.NewValue0(v.Pos, OpSub16, x.Type)
23882 v2 := b.NewValue0(v.Pos, OpConst16, x.Type)
23883 v2.AuxInt = int16ToAuxInt(d + 1)
23884 v1.AddArg2(x, v2)
23885 v.AddArg2(v0, v1)
23886 return true
23887 }
23888 break
23889 }
23890
23891
23892
23893 for {
23894 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23895 if v_0.Op != OpLess8U {
23896 continue
23897 }
23898 x := v_0.Args[1]
23899 v_0_0 := v_0.Args[0]
23900 if v_0_0.Op != OpConst8 {
23901 continue
23902 }
23903 c := auxIntToInt8(v_0_0.AuxInt)
23904 if v_1.Op != OpLeq8U {
23905 continue
23906 }
23907 _ = v_1.Args[1]
23908 if x != v_1.Args[0] {
23909 continue
23910 }
23911 v_1_1 := v_1.Args[1]
23912 if v_1_1.Op != OpConst8 {
23913 continue
23914 }
23915 d := auxIntToInt8(v_1_1.AuxInt)
23916 if !(uint8(c) >= uint8(d+1) && uint8(d+1) > uint8(d)) {
23917 continue
23918 }
23919 v.reset(OpLess8U)
23920 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23921 v0.AuxInt = int8ToAuxInt(c - d - 1)
23922 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23923 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23924 v2.AuxInt = int8ToAuxInt(d + 1)
23925 v1.AddArg2(x, v2)
23926 v.AddArg2(v0, v1)
23927 return true
23928 }
23929 break
23930 }
23931
23932
23933
23934 for {
23935 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23936 if v_0.Op != OpLeq8U {
23937 continue
23938 }
23939 x := v_0.Args[1]
23940 v_0_0 := v_0.Args[0]
23941 if v_0_0.Op != OpConst8 {
23942 continue
23943 }
23944 c := auxIntToInt8(v_0_0.AuxInt)
23945 if v_1.Op != OpLeq8U {
23946 continue
23947 }
23948 _ = v_1.Args[1]
23949 if x != v_1.Args[0] {
23950 continue
23951 }
23952 v_1_1 := v_1.Args[1]
23953 if v_1_1.Op != OpConst8 {
23954 continue
23955 }
23956 d := auxIntToInt8(v_1_1.AuxInt)
23957 if !(uint8(c) >= uint8(d+1) && uint8(d+1) > uint8(d)) {
23958 continue
23959 }
23960 v.reset(OpLeq8U)
23961 v0 := b.NewValue0(v.Pos, OpConst8, x.Type)
23962 v0.AuxInt = int8ToAuxInt(c - d - 1)
23963 v1 := b.NewValue0(v.Pos, OpSub8, x.Type)
23964 v2 := b.NewValue0(v.Pos, OpConst8, x.Type)
23965 v2.AuxInt = int8ToAuxInt(d + 1)
23966 v1.AddArg2(x, v2)
23967 v.AddArg2(v0, v1)
23968 return true
23969 }
23970 break
23971 }
23972
23973
23974
23975 for {
23976 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
23977 if v_0.Op != OpEq64 {
23978 continue
23979 }
23980 _ = v_0.Args[1]
23981 v_0_0 := v_0.Args[0]
23982 v_0_1 := v_0.Args[1]
23983 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
23984 x := v_0_0
23985 cv := v_0_1
23986 if cv.Op != OpConst64 {
23987 continue
23988 }
23989 c := auxIntToInt64(cv.AuxInt)
23990 if v_1.Op != OpEq64 {
23991 continue
23992 }
23993 _ = v_1.Args[1]
23994 v_1_0 := v_1.Args[0]
23995 v_1_1 := v_1.Args[1]
23996 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
23997 if x != v_1_0 || v_1_1.Op != OpConst64 {
23998 continue
23999 }
24000 d := auxIntToInt64(v_1_1.AuxInt)
24001 if !(c|d == c && oneBit(c^d)) {
24002 continue
24003 }
24004 v.reset(OpEq64)
24005 v0 := b.NewValue0(v.Pos, OpOr64, x.Type)
24006 v1 := b.NewValue0(v.Pos, OpConst64, x.Type)
24007 v1.AuxInt = int64ToAuxInt(c ^ d)
24008 v0.AddArg2(x, v1)
24009 v.AddArg2(v0, cv)
24010 return true
24011 }
24012 }
24013 }
24014 break
24015 }
24016
24017
24018
24019 for {
24020 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24021 if v_0.Op != OpEq32 {
24022 continue
24023 }
24024 _ = v_0.Args[1]
24025 v_0_0 := v_0.Args[0]
24026 v_0_1 := v_0.Args[1]
24027 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
24028 x := v_0_0
24029 cv := v_0_1
24030 if cv.Op != OpConst32 {
24031 continue
24032 }
24033 c := auxIntToInt32(cv.AuxInt)
24034 if v_1.Op != OpEq32 {
24035 continue
24036 }
24037 _ = v_1.Args[1]
24038 v_1_0 := v_1.Args[0]
24039 v_1_1 := v_1.Args[1]
24040 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
24041 if x != v_1_0 || v_1_1.Op != OpConst32 {
24042 continue
24043 }
24044 d := auxIntToInt32(v_1_1.AuxInt)
24045 if !(c|d == c && oneBit(c^d)) {
24046 continue
24047 }
24048 v.reset(OpEq32)
24049 v0 := b.NewValue0(v.Pos, OpOr32, x.Type)
24050 v1 := b.NewValue0(v.Pos, OpConst32, x.Type)
24051 v1.AuxInt = int32ToAuxInt(c ^ d)
24052 v0.AddArg2(x, v1)
24053 v.AddArg2(v0, cv)
24054 return true
24055 }
24056 }
24057 }
24058 break
24059 }
24060
24061
24062
24063 for {
24064 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24065 if v_0.Op != OpEq16 {
24066 continue
24067 }
24068 _ = v_0.Args[1]
24069 v_0_0 := v_0.Args[0]
24070 v_0_1 := v_0.Args[1]
24071 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
24072 x := v_0_0
24073 cv := v_0_1
24074 if cv.Op != OpConst16 {
24075 continue
24076 }
24077 c := auxIntToInt16(cv.AuxInt)
24078 if v_1.Op != OpEq16 {
24079 continue
24080 }
24081 _ = v_1.Args[1]
24082 v_1_0 := v_1.Args[0]
24083 v_1_1 := v_1.Args[1]
24084 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
24085 if x != v_1_0 || v_1_1.Op != OpConst16 {
24086 continue
24087 }
24088 d := auxIntToInt16(v_1_1.AuxInt)
24089 if !(c|d == c && oneBit(c^d)) {
24090 continue
24091 }
24092 v.reset(OpEq16)
24093 v0 := b.NewValue0(v.Pos, OpOr16, x.Type)
24094 v1 := b.NewValue0(v.Pos, OpConst16, x.Type)
24095 v1.AuxInt = int16ToAuxInt(c ^ d)
24096 v0.AddArg2(x, v1)
24097 v.AddArg2(v0, cv)
24098 return true
24099 }
24100 }
24101 }
24102 break
24103 }
24104
24105
24106
24107 for {
24108 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24109 if v_0.Op != OpEq8 {
24110 continue
24111 }
24112 _ = v_0.Args[1]
24113 v_0_0 := v_0.Args[0]
24114 v_0_1 := v_0.Args[1]
24115 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
24116 x := v_0_0
24117 cv := v_0_1
24118 if cv.Op != OpConst8 {
24119 continue
24120 }
24121 c := auxIntToInt8(cv.AuxInt)
24122 if v_1.Op != OpEq8 {
24123 continue
24124 }
24125 _ = v_1.Args[1]
24126 v_1_0 := v_1.Args[0]
24127 v_1_1 := v_1.Args[1]
24128 for _i2 := 0; _i2 <= 1; _i2, v_1_0, v_1_1 = _i2+1, v_1_1, v_1_0 {
24129 if x != v_1_0 || v_1_1.Op != OpConst8 {
24130 continue
24131 }
24132 d := auxIntToInt8(v_1_1.AuxInt)
24133 if !(c|d == c && oneBit(c^d)) {
24134 continue
24135 }
24136 v.reset(OpEq8)
24137 v0 := b.NewValue0(v.Pos, OpOr8, x.Type)
24138 v1 := b.NewValue0(v.Pos, OpConst8, x.Type)
24139 v1.AuxInt = int8ToAuxInt(c ^ d)
24140 v0.AddArg2(x, v1)
24141 v.AddArg2(v0, cv)
24142 return true
24143 }
24144 }
24145 }
24146 break
24147 }
24148
24149
24150 for {
24151 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24152 if v_0.Op != OpNeq64F {
24153 continue
24154 }
24155 x := v_0.Args[1]
24156 if x != v_0.Args[0] || v_1.Op != OpLess64F {
24157 continue
24158 }
24159 _ = v_1.Args[1]
24160 if x != v_1.Args[0] {
24161 continue
24162 }
24163 y := v_1.Args[1]
24164 if y.Op != OpConst64F {
24165 continue
24166 }
24167 v.reset(OpNot)
24168 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
24169 v0.AddArg2(y, x)
24170 v.AddArg(v0)
24171 return true
24172 }
24173 break
24174 }
24175
24176
24177 for {
24178 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24179 if v_0.Op != OpNeq64F {
24180 continue
24181 }
24182 x := v_0.Args[1]
24183 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
24184 continue
24185 }
24186 _ = v_1.Args[1]
24187 if x != v_1.Args[0] {
24188 continue
24189 }
24190 y := v_1.Args[1]
24191 if y.Op != OpConst64F {
24192 continue
24193 }
24194 v.reset(OpNot)
24195 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
24196 v0.AddArg2(y, x)
24197 v.AddArg(v0)
24198 return true
24199 }
24200 break
24201 }
24202
24203
24204 for {
24205 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24206 if v_0.Op != OpNeq64F {
24207 continue
24208 }
24209 x := v_0.Args[1]
24210 if x != v_0.Args[0] || v_1.Op != OpLess64F {
24211 continue
24212 }
24213 _ = v_1.Args[1]
24214 y := v_1.Args[0]
24215 if y.Op != OpConst64F {
24216 continue
24217 }
24218 if x != v_1.Args[1] {
24219 continue
24220 }
24221 v.reset(OpNot)
24222 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
24223 v0.AddArg2(x, y)
24224 v.AddArg(v0)
24225 return true
24226 }
24227 break
24228 }
24229
24230
24231 for {
24232 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24233 if v_0.Op != OpNeq64F {
24234 continue
24235 }
24236 x := v_0.Args[1]
24237 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
24238 continue
24239 }
24240 _ = v_1.Args[1]
24241 y := v_1.Args[0]
24242 if y.Op != OpConst64F {
24243 continue
24244 }
24245 if x != v_1.Args[1] {
24246 continue
24247 }
24248 v.reset(OpNot)
24249 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
24250 v0.AddArg2(x, y)
24251 v.AddArg(v0)
24252 return true
24253 }
24254 break
24255 }
24256
24257
24258 for {
24259 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24260 if v_0.Op != OpNeq32F {
24261 continue
24262 }
24263 x := v_0.Args[1]
24264 if x != v_0.Args[0] || v_1.Op != OpLess32F {
24265 continue
24266 }
24267 _ = v_1.Args[1]
24268 if x != v_1.Args[0] {
24269 continue
24270 }
24271 y := v_1.Args[1]
24272 if y.Op != OpConst32F {
24273 continue
24274 }
24275 v.reset(OpNot)
24276 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
24277 v0.AddArg2(y, x)
24278 v.AddArg(v0)
24279 return true
24280 }
24281 break
24282 }
24283
24284
24285 for {
24286 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24287 if v_0.Op != OpNeq32F {
24288 continue
24289 }
24290 x := v_0.Args[1]
24291 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
24292 continue
24293 }
24294 _ = v_1.Args[1]
24295 if x != v_1.Args[0] {
24296 continue
24297 }
24298 y := v_1.Args[1]
24299 if y.Op != OpConst32F {
24300 continue
24301 }
24302 v.reset(OpNot)
24303 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
24304 v0.AddArg2(y, x)
24305 v.AddArg(v0)
24306 return true
24307 }
24308 break
24309 }
24310
24311
24312 for {
24313 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24314 if v_0.Op != OpNeq32F {
24315 continue
24316 }
24317 x := v_0.Args[1]
24318 if x != v_0.Args[0] || v_1.Op != OpLess32F {
24319 continue
24320 }
24321 _ = v_1.Args[1]
24322 y := v_1.Args[0]
24323 if y.Op != OpConst32F {
24324 continue
24325 }
24326 if x != v_1.Args[1] {
24327 continue
24328 }
24329 v.reset(OpNot)
24330 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
24331 v0.AddArg2(x, y)
24332 v.AddArg(v0)
24333 return true
24334 }
24335 break
24336 }
24337
24338
24339 for {
24340 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24341 if v_0.Op != OpNeq32F {
24342 continue
24343 }
24344 x := v_0.Args[1]
24345 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
24346 continue
24347 }
24348 _ = v_1.Args[1]
24349 y := v_1.Args[0]
24350 if y.Op != OpConst32F {
24351 continue
24352 }
24353 if x != v_1.Args[1] {
24354 continue
24355 }
24356 v.reset(OpNot)
24357 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
24358 v0.AddArg2(x, y)
24359 v.AddArg(v0)
24360 return true
24361 }
24362 break
24363 }
24364
24365
24366 for {
24367 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24368 if v_0.Op != OpNeq64F {
24369 continue
24370 }
24371 x := v_0.Args[1]
24372 if x != v_0.Args[0] || v_1.Op != OpLess64F {
24373 continue
24374 }
24375 _ = v_1.Args[1]
24376 abs := v_1.Args[0]
24377 if abs.Op != OpAbs || x != abs.Args[0] {
24378 continue
24379 }
24380 y := v_1.Args[1]
24381 if y.Op != OpConst64F {
24382 continue
24383 }
24384 v.reset(OpNot)
24385 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
24386 v0.AddArg2(y, abs)
24387 v.AddArg(v0)
24388 return true
24389 }
24390 break
24391 }
24392
24393
24394 for {
24395 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24396 if v_0.Op != OpNeq64F {
24397 continue
24398 }
24399 x := v_0.Args[1]
24400 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
24401 continue
24402 }
24403 _ = v_1.Args[1]
24404 abs := v_1.Args[0]
24405 if abs.Op != OpAbs || x != abs.Args[0] {
24406 continue
24407 }
24408 y := v_1.Args[1]
24409 if y.Op != OpConst64F {
24410 continue
24411 }
24412 v.reset(OpNot)
24413 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
24414 v0.AddArg2(y, abs)
24415 v.AddArg(v0)
24416 return true
24417 }
24418 break
24419 }
24420
24421
24422 for {
24423 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24424 if v_0.Op != OpNeq64F {
24425 continue
24426 }
24427 x := v_0.Args[1]
24428 if x != v_0.Args[0] || v_1.Op != OpLess64F {
24429 continue
24430 }
24431 _ = v_1.Args[1]
24432 y := v_1.Args[0]
24433 if y.Op != OpConst64F {
24434 continue
24435 }
24436 abs := v_1.Args[1]
24437 if abs.Op != OpAbs || x != abs.Args[0] {
24438 continue
24439 }
24440 v.reset(OpNot)
24441 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
24442 v0.AddArg2(abs, y)
24443 v.AddArg(v0)
24444 return true
24445 }
24446 break
24447 }
24448
24449
24450 for {
24451 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24452 if v_0.Op != OpNeq64F {
24453 continue
24454 }
24455 x := v_0.Args[1]
24456 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
24457 continue
24458 }
24459 _ = v_1.Args[1]
24460 y := v_1.Args[0]
24461 if y.Op != OpConst64F {
24462 continue
24463 }
24464 abs := v_1.Args[1]
24465 if abs.Op != OpAbs || x != abs.Args[0] {
24466 continue
24467 }
24468 v.reset(OpNot)
24469 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
24470 v0.AddArg2(abs, y)
24471 v.AddArg(v0)
24472 return true
24473 }
24474 break
24475 }
24476
24477
24478 for {
24479 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24480 if v_0.Op != OpNeq64F {
24481 continue
24482 }
24483 x := v_0.Args[1]
24484 if x != v_0.Args[0] || v_1.Op != OpLess64F {
24485 continue
24486 }
24487 _ = v_1.Args[1]
24488 neg := v_1.Args[0]
24489 if neg.Op != OpNeg64F || x != neg.Args[0] {
24490 continue
24491 }
24492 y := v_1.Args[1]
24493 if y.Op != OpConst64F {
24494 continue
24495 }
24496 v.reset(OpNot)
24497 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
24498 v0.AddArg2(y, neg)
24499 v.AddArg(v0)
24500 return true
24501 }
24502 break
24503 }
24504
24505
24506 for {
24507 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24508 if v_0.Op != OpNeq64F {
24509 continue
24510 }
24511 x := v_0.Args[1]
24512 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
24513 continue
24514 }
24515 _ = v_1.Args[1]
24516 neg := v_1.Args[0]
24517 if neg.Op != OpNeg64F || x != neg.Args[0] {
24518 continue
24519 }
24520 y := v_1.Args[1]
24521 if y.Op != OpConst64F {
24522 continue
24523 }
24524 v.reset(OpNot)
24525 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
24526 v0.AddArg2(y, neg)
24527 v.AddArg(v0)
24528 return true
24529 }
24530 break
24531 }
24532
24533
24534 for {
24535 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24536 if v_0.Op != OpNeq64F {
24537 continue
24538 }
24539 x := v_0.Args[1]
24540 if x != v_0.Args[0] || v_1.Op != OpLess64F {
24541 continue
24542 }
24543 _ = v_1.Args[1]
24544 y := v_1.Args[0]
24545 if y.Op != OpConst64F {
24546 continue
24547 }
24548 neg := v_1.Args[1]
24549 if neg.Op != OpNeg64F || x != neg.Args[0] {
24550 continue
24551 }
24552 v.reset(OpNot)
24553 v0 := b.NewValue0(v.Pos, OpLeq64F, typ.Bool)
24554 v0.AddArg2(neg, y)
24555 v.AddArg(v0)
24556 return true
24557 }
24558 break
24559 }
24560
24561
24562 for {
24563 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24564 if v_0.Op != OpNeq64F {
24565 continue
24566 }
24567 x := v_0.Args[1]
24568 if x != v_0.Args[0] || v_1.Op != OpLeq64F {
24569 continue
24570 }
24571 _ = v_1.Args[1]
24572 y := v_1.Args[0]
24573 if y.Op != OpConst64F {
24574 continue
24575 }
24576 neg := v_1.Args[1]
24577 if neg.Op != OpNeg64F || x != neg.Args[0] {
24578 continue
24579 }
24580 v.reset(OpNot)
24581 v0 := b.NewValue0(v.Pos, OpLess64F, typ.Bool)
24582 v0.AddArg2(neg, y)
24583 v.AddArg(v0)
24584 return true
24585 }
24586 break
24587 }
24588
24589
24590 for {
24591 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24592 if v_0.Op != OpNeq32F {
24593 continue
24594 }
24595 x := v_0.Args[1]
24596 if x != v_0.Args[0] || v_1.Op != OpLess32F {
24597 continue
24598 }
24599 _ = v_1.Args[1]
24600 neg := v_1.Args[0]
24601 if neg.Op != OpNeg32F || x != neg.Args[0] {
24602 continue
24603 }
24604 y := v_1.Args[1]
24605 if y.Op != OpConst32F {
24606 continue
24607 }
24608 v.reset(OpNot)
24609 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
24610 v0.AddArg2(y, neg)
24611 v.AddArg(v0)
24612 return true
24613 }
24614 break
24615 }
24616
24617
24618 for {
24619 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24620 if v_0.Op != OpNeq32F {
24621 continue
24622 }
24623 x := v_0.Args[1]
24624 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
24625 continue
24626 }
24627 _ = v_1.Args[1]
24628 neg := v_1.Args[0]
24629 if neg.Op != OpNeg32F || x != neg.Args[0] {
24630 continue
24631 }
24632 y := v_1.Args[1]
24633 if y.Op != OpConst32F {
24634 continue
24635 }
24636 v.reset(OpNot)
24637 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
24638 v0.AddArg2(y, neg)
24639 v.AddArg(v0)
24640 return true
24641 }
24642 break
24643 }
24644
24645
24646 for {
24647 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24648 if v_0.Op != OpNeq32F {
24649 continue
24650 }
24651 x := v_0.Args[1]
24652 if x != v_0.Args[0] || v_1.Op != OpLess32F {
24653 continue
24654 }
24655 _ = v_1.Args[1]
24656 y := v_1.Args[0]
24657 if y.Op != OpConst32F {
24658 continue
24659 }
24660 neg := v_1.Args[1]
24661 if neg.Op != OpNeg32F || x != neg.Args[0] {
24662 continue
24663 }
24664 v.reset(OpNot)
24665 v0 := b.NewValue0(v.Pos, OpLeq32F, typ.Bool)
24666 v0.AddArg2(neg, y)
24667 v.AddArg(v0)
24668 return true
24669 }
24670 break
24671 }
24672
24673
24674 for {
24675 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
24676 if v_0.Op != OpNeq32F {
24677 continue
24678 }
24679 x := v_0.Args[1]
24680 if x != v_0.Args[0] || v_1.Op != OpLeq32F {
24681 continue
24682 }
24683 _ = v_1.Args[1]
24684 y := v_1.Args[0]
24685 if y.Op != OpConst32F {
24686 continue
24687 }
24688 neg := v_1.Args[1]
24689 if neg.Op != OpNeg32F || x != neg.Args[0] {
24690 continue
24691 }
24692 v.reset(OpNot)
24693 v0 := b.NewValue0(v.Pos, OpLess32F, typ.Bool)
24694 v0.AddArg2(neg, y)
24695 v.AddArg(v0)
24696 return true
24697 }
24698 break
24699 }
24700 return false
24701 }
24702 func rewriteValuegeneric_OpPhi(v *Value) bool {
24703 b := v.Block
24704
24705
24706 for {
24707 if len(v.Args) != 2 {
24708 break
24709 }
24710 _ = v.Args[1]
24711 v_0 := v.Args[0]
24712 if v_0.Op != OpConst8 {
24713 break
24714 }
24715 c := auxIntToInt8(v_0.AuxInt)
24716 v_1 := v.Args[1]
24717 if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != c {
24718 break
24719 }
24720 v.reset(OpConst8)
24721 v.AuxInt = int8ToAuxInt(c)
24722 return true
24723 }
24724
24725
24726 for {
24727 if len(v.Args) != 2 {
24728 break
24729 }
24730 _ = v.Args[1]
24731 v_0 := v.Args[0]
24732 if v_0.Op != OpConst16 {
24733 break
24734 }
24735 c := auxIntToInt16(v_0.AuxInt)
24736 v_1 := v.Args[1]
24737 if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != c {
24738 break
24739 }
24740 v.reset(OpConst16)
24741 v.AuxInt = int16ToAuxInt(c)
24742 return true
24743 }
24744
24745
24746 for {
24747 if len(v.Args) != 2 {
24748 break
24749 }
24750 _ = v.Args[1]
24751 v_0 := v.Args[0]
24752 if v_0.Op != OpConst32 {
24753 break
24754 }
24755 c := auxIntToInt32(v_0.AuxInt)
24756 v_1 := v.Args[1]
24757 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != c {
24758 break
24759 }
24760 v.reset(OpConst32)
24761 v.AuxInt = int32ToAuxInt(c)
24762 return true
24763 }
24764
24765
24766 for {
24767 if len(v.Args) != 2 {
24768 break
24769 }
24770 _ = v.Args[1]
24771 v_0 := v.Args[0]
24772 if v_0.Op != OpConst64 {
24773 break
24774 }
24775 c := auxIntToInt64(v_0.AuxInt)
24776 v_1 := v.Args[1]
24777 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c {
24778 break
24779 }
24780 v.reset(OpConst64)
24781 v.AuxInt = int64ToAuxInt(c)
24782 return true
24783 }
24784
24785
24786
24787 for {
24788 if len(v.Args) != 2 {
24789 break
24790 }
24791 t := v.Type
24792 _ = v.Args[1]
24793 nx := v.Args[0]
24794 if nx.Op != OpNot {
24795 break
24796 }
24797 x := nx.Args[0]
24798 ny := v.Args[1]
24799 if ny.Op != OpNot {
24800 break
24801 }
24802 y := ny.Args[0]
24803 if !(nx.Uses == 1 && ny.Uses == 1) {
24804 break
24805 }
24806 v.reset(OpNot)
24807 v0 := b.NewValue0(v.Pos, OpPhi, t)
24808 v0.AddArg2(x, y)
24809 v.AddArg(v0)
24810 return true
24811 }
24812 return false
24813 }
24814 func rewriteValuegeneric_OpPopCount16(v *Value) bool {
24815 v_0 := v.Args[0]
24816 b := v.Block
24817 config := b.Func.Config
24818
24819
24820
24821 for {
24822 if v_0.Op != OpConst16 {
24823 break
24824 }
24825 c := auxIntToInt16(v_0.AuxInt)
24826 if !(config.PtrSize == 8) {
24827 break
24828 }
24829 v.reset(OpConst64)
24830 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount16(uint16(c))))
24831 return true
24832 }
24833
24834
24835
24836 for {
24837 if v_0.Op != OpConst16 {
24838 break
24839 }
24840 c := auxIntToInt16(v_0.AuxInt)
24841 if !(config.PtrSize == 4) {
24842 break
24843 }
24844 v.reset(OpConst32)
24845 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount16(uint16(c))))
24846 return true
24847 }
24848 return false
24849 }
24850 func rewriteValuegeneric_OpPopCount32(v *Value) bool {
24851 v_0 := v.Args[0]
24852 b := v.Block
24853 config := b.Func.Config
24854
24855
24856
24857 for {
24858 if v_0.Op != OpConst32 {
24859 break
24860 }
24861 c := auxIntToInt32(v_0.AuxInt)
24862 if !(config.PtrSize == 8) {
24863 break
24864 }
24865 v.reset(OpConst64)
24866 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount32(uint32(c))))
24867 return true
24868 }
24869
24870
24871
24872 for {
24873 if v_0.Op != OpConst32 {
24874 break
24875 }
24876 c := auxIntToInt32(v_0.AuxInt)
24877 if !(config.PtrSize == 4) {
24878 break
24879 }
24880 v.reset(OpConst32)
24881 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount32(uint32(c))))
24882 return true
24883 }
24884 return false
24885 }
24886 func rewriteValuegeneric_OpPopCount64(v *Value) bool {
24887 v_0 := v.Args[0]
24888 b := v.Block
24889 config := b.Func.Config
24890
24891
24892
24893 for {
24894 if v_0.Op != OpConst64 {
24895 break
24896 }
24897 c := auxIntToInt64(v_0.AuxInt)
24898 if !(config.PtrSize == 8) {
24899 break
24900 }
24901 v.reset(OpConst64)
24902 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount64(uint64(c))))
24903 return true
24904 }
24905
24906
24907
24908 for {
24909 if v_0.Op != OpConst64 {
24910 break
24911 }
24912 c := auxIntToInt64(v_0.AuxInt)
24913 if !(config.PtrSize == 4) {
24914 break
24915 }
24916 v.reset(OpConst32)
24917 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount64(uint64(c))))
24918 return true
24919 }
24920 return false
24921 }
24922 func rewriteValuegeneric_OpPopCount8(v *Value) bool {
24923 v_0 := v.Args[0]
24924 b := v.Block
24925 config := b.Func.Config
24926
24927
24928
24929 for {
24930 if v_0.Op != OpConst8 {
24931 break
24932 }
24933 c := auxIntToInt8(v_0.AuxInt)
24934 if !(config.PtrSize == 8) {
24935 break
24936 }
24937 v.reset(OpConst64)
24938 v.AuxInt = int64ToAuxInt(int64(bits.OnesCount8(uint8(c))))
24939 return true
24940 }
24941
24942
24943
24944 for {
24945 if v_0.Op != OpConst8 {
24946 break
24947 }
24948 c := auxIntToInt8(v_0.AuxInt)
24949 if !(config.PtrSize == 4) {
24950 break
24951 }
24952 v.reset(OpConst32)
24953 v.AuxInt = int32ToAuxInt(int32(bits.OnesCount8(uint8(c))))
24954 return true
24955 }
24956 return false
24957 }
24958 func rewriteValuegeneric_OpPtrIndex(v *Value) bool {
24959 v_1 := v.Args[1]
24960 v_0 := v.Args[0]
24961 b := v.Block
24962 config := b.Func.Config
24963 typ := &b.Func.Config.Types
24964
24965
24966
24967 for {
24968 t := v.Type
24969 ptr := v_0
24970 idx := v_1
24971 if !(config.PtrSize == 4 && is32Bit(t.Elem().Size())) {
24972 break
24973 }
24974 v.reset(OpAddPtr)
24975 v0 := b.NewValue0(v.Pos, OpMul32, typ.Int)
24976 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int)
24977 v1.AuxInt = int32ToAuxInt(int32(t.Elem().Size()))
24978 v0.AddArg2(idx, v1)
24979 v.AddArg2(ptr, v0)
24980 return true
24981 }
24982
24983
24984
24985 for {
24986 t := v.Type
24987 ptr := v_0
24988 idx := v_1
24989 if !(config.PtrSize == 8) {
24990 break
24991 }
24992 v.reset(OpAddPtr)
24993 v0 := b.NewValue0(v.Pos, OpMul64, typ.Int)
24994 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int)
24995 v1.AuxInt = int64ToAuxInt(t.Elem().Size())
24996 v0.AddArg2(idx, v1)
24997 v.AddArg2(ptr, v0)
24998 return true
24999 }
25000 return false
25001 }
25002 func rewriteValuegeneric_OpRotateLeft16(v *Value) bool {
25003 v_1 := v.Args[1]
25004 v_0 := v.Args[0]
25005 b := v.Block
25006 config := b.Func.Config
25007
25008
25009
25010 for {
25011 x := v_0
25012 if v_1.Op != OpConst16 {
25013 break
25014 }
25015 c := auxIntToInt16(v_1.AuxInt)
25016 if !(c%16 == 0) {
25017 break
25018 }
25019 v.copyOf(x)
25020 return true
25021 }
25022
25023
25024
25025 for {
25026 x := v_0
25027 if v_1.Op != OpAnd64 {
25028 break
25029 }
25030 _ = v_1.Args[1]
25031 v_1_0 := v_1.Args[0]
25032 v_1_1 := v_1.Args[1]
25033 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25034 y := v_1_0
25035 if v_1_1.Op != OpConst64 {
25036 continue
25037 }
25038 c := auxIntToInt64(v_1_1.AuxInt)
25039 if !(c&15 == 15) {
25040 continue
25041 }
25042 v.reset(OpRotateLeft16)
25043 v.AddArg2(x, y)
25044 return true
25045 }
25046 break
25047 }
25048
25049
25050
25051 for {
25052 x := v_0
25053 if v_1.Op != OpAnd32 {
25054 break
25055 }
25056 _ = v_1.Args[1]
25057 v_1_0 := v_1.Args[0]
25058 v_1_1 := v_1.Args[1]
25059 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25060 y := v_1_0
25061 if v_1_1.Op != OpConst32 {
25062 continue
25063 }
25064 c := auxIntToInt32(v_1_1.AuxInt)
25065 if !(c&15 == 15) {
25066 continue
25067 }
25068 v.reset(OpRotateLeft16)
25069 v.AddArg2(x, y)
25070 return true
25071 }
25072 break
25073 }
25074
25075
25076
25077 for {
25078 x := v_0
25079 if v_1.Op != OpAnd16 {
25080 break
25081 }
25082 _ = v_1.Args[1]
25083 v_1_0 := v_1.Args[0]
25084 v_1_1 := v_1.Args[1]
25085 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25086 y := v_1_0
25087 if v_1_1.Op != OpConst16 {
25088 continue
25089 }
25090 c := auxIntToInt16(v_1_1.AuxInt)
25091 if !(c&15 == 15) {
25092 continue
25093 }
25094 v.reset(OpRotateLeft16)
25095 v.AddArg2(x, y)
25096 return true
25097 }
25098 break
25099 }
25100
25101
25102
25103 for {
25104 x := v_0
25105 if v_1.Op != OpAnd8 {
25106 break
25107 }
25108 _ = v_1.Args[1]
25109 v_1_0 := v_1.Args[0]
25110 v_1_1 := v_1.Args[1]
25111 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25112 y := v_1_0
25113 if v_1_1.Op != OpConst8 {
25114 continue
25115 }
25116 c := auxIntToInt8(v_1_1.AuxInt)
25117 if !(c&15 == 15) {
25118 continue
25119 }
25120 v.reset(OpRotateLeft16)
25121 v.AddArg2(x, y)
25122 return true
25123 }
25124 break
25125 }
25126
25127
25128
25129 for {
25130 x := v_0
25131 if v_1.Op != OpNeg64 {
25132 break
25133 }
25134 v_1_0 := v_1.Args[0]
25135 if v_1_0.Op != OpAnd64 {
25136 break
25137 }
25138 _ = v_1_0.Args[1]
25139 v_1_0_0 := v_1_0.Args[0]
25140 v_1_0_1 := v_1_0.Args[1]
25141 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25142 y := v_1_0_0
25143 if v_1_0_1.Op != OpConst64 {
25144 continue
25145 }
25146 c := auxIntToInt64(v_1_0_1.AuxInt)
25147 if !(c&15 == 15) {
25148 continue
25149 }
25150 v.reset(OpRotateLeft16)
25151 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
25152 v0.AddArg(y)
25153 v.AddArg2(x, v0)
25154 return true
25155 }
25156 break
25157 }
25158
25159
25160
25161 for {
25162 x := v_0
25163 if v_1.Op != OpNeg32 {
25164 break
25165 }
25166 v_1_0 := v_1.Args[0]
25167 if v_1_0.Op != OpAnd32 {
25168 break
25169 }
25170 _ = v_1_0.Args[1]
25171 v_1_0_0 := v_1_0.Args[0]
25172 v_1_0_1 := v_1_0.Args[1]
25173 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25174 y := v_1_0_0
25175 if v_1_0_1.Op != OpConst32 {
25176 continue
25177 }
25178 c := auxIntToInt32(v_1_0_1.AuxInt)
25179 if !(c&15 == 15) {
25180 continue
25181 }
25182 v.reset(OpRotateLeft16)
25183 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
25184 v0.AddArg(y)
25185 v.AddArg2(x, v0)
25186 return true
25187 }
25188 break
25189 }
25190
25191
25192
25193 for {
25194 x := v_0
25195 if v_1.Op != OpNeg16 {
25196 break
25197 }
25198 v_1_0 := v_1.Args[0]
25199 if v_1_0.Op != OpAnd16 {
25200 break
25201 }
25202 _ = v_1_0.Args[1]
25203 v_1_0_0 := v_1_0.Args[0]
25204 v_1_0_1 := v_1_0.Args[1]
25205 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25206 y := v_1_0_0
25207 if v_1_0_1.Op != OpConst16 {
25208 continue
25209 }
25210 c := auxIntToInt16(v_1_0_1.AuxInt)
25211 if !(c&15 == 15) {
25212 continue
25213 }
25214 v.reset(OpRotateLeft16)
25215 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
25216 v0.AddArg(y)
25217 v.AddArg2(x, v0)
25218 return true
25219 }
25220 break
25221 }
25222
25223
25224
25225 for {
25226 x := v_0
25227 if v_1.Op != OpNeg8 {
25228 break
25229 }
25230 v_1_0 := v_1.Args[0]
25231 if v_1_0.Op != OpAnd8 {
25232 break
25233 }
25234 _ = v_1_0.Args[1]
25235 v_1_0_0 := v_1_0.Args[0]
25236 v_1_0_1 := v_1_0.Args[1]
25237 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25238 y := v_1_0_0
25239 if v_1_0_1.Op != OpConst8 {
25240 continue
25241 }
25242 c := auxIntToInt8(v_1_0_1.AuxInt)
25243 if !(c&15 == 15) {
25244 continue
25245 }
25246 v.reset(OpRotateLeft16)
25247 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
25248 v0.AddArg(y)
25249 v.AddArg2(x, v0)
25250 return true
25251 }
25252 break
25253 }
25254
25255
25256
25257 for {
25258 x := v_0
25259 if v_1.Op != OpAdd64 {
25260 break
25261 }
25262 _ = v_1.Args[1]
25263 v_1_0 := v_1.Args[0]
25264 v_1_1 := v_1.Args[1]
25265 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25266 y := v_1_0
25267 if v_1_1.Op != OpConst64 {
25268 continue
25269 }
25270 c := auxIntToInt64(v_1_1.AuxInt)
25271 if !(c&15 == 0) {
25272 continue
25273 }
25274 v.reset(OpRotateLeft16)
25275 v.AddArg2(x, y)
25276 return true
25277 }
25278 break
25279 }
25280
25281
25282
25283 for {
25284 x := v_0
25285 if v_1.Op != OpAdd32 {
25286 break
25287 }
25288 _ = v_1.Args[1]
25289 v_1_0 := v_1.Args[0]
25290 v_1_1 := v_1.Args[1]
25291 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25292 y := v_1_0
25293 if v_1_1.Op != OpConst32 {
25294 continue
25295 }
25296 c := auxIntToInt32(v_1_1.AuxInt)
25297 if !(c&15 == 0) {
25298 continue
25299 }
25300 v.reset(OpRotateLeft16)
25301 v.AddArg2(x, y)
25302 return true
25303 }
25304 break
25305 }
25306
25307
25308
25309 for {
25310 x := v_0
25311 if v_1.Op != OpAdd16 {
25312 break
25313 }
25314 _ = v_1.Args[1]
25315 v_1_0 := v_1.Args[0]
25316 v_1_1 := v_1.Args[1]
25317 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25318 y := v_1_0
25319 if v_1_1.Op != OpConst16 {
25320 continue
25321 }
25322 c := auxIntToInt16(v_1_1.AuxInt)
25323 if !(c&15 == 0) {
25324 continue
25325 }
25326 v.reset(OpRotateLeft16)
25327 v.AddArg2(x, y)
25328 return true
25329 }
25330 break
25331 }
25332
25333
25334
25335 for {
25336 x := v_0
25337 if v_1.Op != OpAdd8 {
25338 break
25339 }
25340 _ = v_1.Args[1]
25341 v_1_0 := v_1.Args[0]
25342 v_1_1 := v_1.Args[1]
25343 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25344 y := v_1_0
25345 if v_1_1.Op != OpConst8 {
25346 continue
25347 }
25348 c := auxIntToInt8(v_1_1.AuxInt)
25349 if !(c&15 == 0) {
25350 continue
25351 }
25352 v.reset(OpRotateLeft16)
25353 v.AddArg2(x, y)
25354 return true
25355 }
25356 break
25357 }
25358
25359
25360
25361 for {
25362 x := v_0
25363 if v_1.Op != OpSub64 {
25364 break
25365 }
25366 y := v_1.Args[1]
25367 v_1_0 := v_1.Args[0]
25368 if v_1_0.Op != OpConst64 {
25369 break
25370 }
25371 c := auxIntToInt64(v_1_0.AuxInt)
25372 if !(c&15 == 0) {
25373 break
25374 }
25375 v.reset(OpRotateLeft16)
25376 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
25377 v0.AddArg(y)
25378 v.AddArg2(x, v0)
25379 return true
25380 }
25381
25382
25383
25384 for {
25385 x := v_0
25386 if v_1.Op != OpSub32 {
25387 break
25388 }
25389 y := v_1.Args[1]
25390 v_1_0 := v_1.Args[0]
25391 if v_1_0.Op != OpConst32 {
25392 break
25393 }
25394 c := auxIntToInt32(v_1_0.AuxInt)
25395 if !(c&15 == 0) {
25396 break
25397 }
25398 v.reset(OpRotateLeft16)
25399 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
25400 v0.AddArg(y)
25401 v.AddArg2(x, v0)
25402 return true
25403 }
25404
25405
25406
25407 for {
25408 x := v_0
25409 if v_1.Op != OpSub16 {
25410 break
25411 }
25412 y := v_1.Args[1]
25413 v_1_0 := v_1.Args[0]
25414 if v_1_0.Op != OpConst16 {
25415 break
25416 }
25417 c := auxIntToInt16(v_1_0.AuxInt)
25418 if !(c&15 == 0) {
25419 break
25420 }
25421 v.reset(OpRotateLeft16)
25422 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
25423 v0.AddArg(y)
25424 v.AddArg2(x, v0)
25425 return true
25426 }
25427
25428
25429
25430 for {
25431 x := v_0
25432 if v_1.Op != OpSub8 {
25433 break
25434 }
25435 y := v_1.Args[1]
25436 v_1_0 := v_1.Args[0]
25437 if v_1_0.Op != OpConst8 {
25438 break
25439 }
25440 c := auxIntToInt8(v_1_0.AuxInt)
25441 if !(c&15 == 0) {
25442 break
25443 }
25444 v.reset(OpRotateLeft16)
25445 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
25446 v0.AddArg(y)
25447 v.AddArg2(x, v0)
25448 return true
25449 }
25450
25451
25452
25453 for {
25454 x := v_0
25455 if v_1.Op != OpConst64 {
25456 break
25457 }
25458 t := v_1.Type
25459 c := auxIntToInt64(v_1.AuxInt)
25460 if !(config.PtrSize == 4) {
25461 break
25462 }
25463 v.reset(OpRotateLeft16)
25464 v0 := b.NewValue0(v.Pos, OpConst32, t)
25465 v0.AuxInt = int32ToAuxInt(int32(c))
25466 v.AddArg2(x, v0)
25467 return true
25468 }
25469
25470
25471
25472 for {
25473 if v_0.Op != OpRotateLeft16 {
25474 break
25475 }
25476 c := v_0.Args[1]
25477 x := v_0.Args[0]
25478 d := v_1
25479 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
25480 break
25481 }
25482 v.reset(OpRotateLeft16)
25483 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
25484 v0.AddArg2(c, d)
25485 v.AddArg2(x, v0)
25486 return true
25487 }
25488
25489
25490
25491 for {
25492 if v_0.Op != OpRotateLeft16 {
25493 break
25494 }
25495 c := v_0.Args[1]
25496 x := v_0.Args[0]
25497 d := v_1
25498 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
25499 break
25500 }
25501 v.reset(OpRotateLeft16)
25502 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
25503 v0.AddArg2(c, d)
25504 v.AddArg2(x, v0)
25505 return true
25506 }
25507
25508
25509
25510 for {
25511 if v_0.Op != OpRotateLeft16 {
25512 break
25513 }
25514 c := v_0.Args[1]
25515 x := v_0.Args[0]
25516 d := v_1
25517 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
25518 break
25519 }
25520 v.reset(OpRotateLeft16)
25521 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
25522 v0.AddArg2(c, d)
25523 v.AddArg2(x, v0)
25524 return true
25525 }
25526
25527
25528
25529 for {
25530 if v_0.Op != OpRotateLeft16 {
25531 break
25532 }
25533 c := v_0.Args[1]
25534 x := v_0.Args[0]
25535 d := v_1
25536 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
25537 break
25538 }
25539 v.reset(OpRotateLeft16)
25540 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
25541 v0.AddArg2(c, d)
25542 v.AddArg2(x, v0)
25543 return true
25544 }
25545 return false
25546 }
25547 func rewriteValuegeneric_OpRotateLeft32(v *Value) bool {
25548 v_1 := v.Args[1]
25549 v_0 := v.Args[0]
25550 b := v.Block
25551 config := b.Func.Config
25552
25553
25554
25555 for {
25556 x := v_0
25557 if v_1.Op != OpConst32 {
25558 break
25559 }
25560 c := auxIntToInt32(v_1.AuxInt)
25561 if !(c%32 == 0) {
25562 break
25563 }
25564 v.copyOf(x)
25565 return true
25566 }
25567
25568
25569
25570 for {
25571 x := v_0
25572 if v_1.Op != OpAnd64 {
25573 break
25574 }
25575 _ = v_1.Args[1]
25576 v_1_0 := v_1.Args[0]
25577 v_1_1 := v_1.Args[1]
25578 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25579 y := v_1_0
25580 if v_1_1.Op != OpConst64 {
25581 continue
25582 }
25583 c := auxIntToInt64(v_1_1.AuxInt)
25584 if !(c&31 == 31) {
25585 continue
25586 }
25587 v.reset(OpRotateLeft32)
25588 v.AddArg2(x, y)
25589 return true
25590 }
25591 break
25592 }
25593
25594
25595
25596 for {
25597 x := v_0
25598 if v_1.Op != OpAnd32 {
25599 break
25600 }
25601 _ = v_1.Args[1]
25602 v_1_0 := v_1.Args[0]
25603 v_1_1 := v_1.Args[1]
25604 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25605 y := v_1_0
25606 if v_1_1.Op != OpConst32 {
25607 continue
25608 }
25609 c := auxIntToInt32(v_1_1.AuxInt)
25610 if !(c&31 == 31) {
25611 continue
25612 }
25613 v.reset(OpRotateLeft32)
25614 v.AddArg2(x, y)
25615 return true
25616 }
25617 break
25618 }
25619
25620
25621
25622 for {
25623 x := v_0
25624 if v_1.Op != OpAnd16 {
25625 break
25626 }
25627 _ = v_1.Args[1]
25628 v_1_0 := v_1.Args[0]
25629 v_1_1 := v_1.Args[1]
25630 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25631 y := v_1_0
25632 if v_1_1.Op != OpConst16 {
25633 continue
25634 }
25635 c := auxIntToInt16(v_1_1.AuxInt)
25636 if !(c&31 == 31) {
25637 continue
25638 }
25639 v.reset(OpRotateLeft32)
25640 v.AddArg2(x, y)
25641 return true
25642 }
25643 break
25644 }
25645
25646
25647
25648 for {
25649 x := v_0
25650 if v_1.Op != OpAnd8 {
25651 break
25652 }
25653 _ = v_1.Args[1]
25654 v_1_0 := v_1.Args[0]
25655 v_1_1 := v_1.Args[1]
25656 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25657 y := v_1_0
25658 if v_1_1.Op != OpConst8 {
25659 continue
25660 }
25661 c := auxIntToInt8(v_1_1.AuxInt)
25662 if !(c&31 == 31) {
25663 continue
25664 }
25665 v.reset(OpRotateLeft32)
25666 v.AddArg2(x, y)
25667 return true
25668 }
25669 break
25670 }
25671
25672
25673
25674 for {
25675 x := v_0
25676 if v_1.Op != OpNeg64 {
25677 break
25678 }
25679 v_1_0 := v_1.Args[0]
25680 if v_1_0.Op != OpAnd64 {
25681 break
25682 }
25683 _ = v_1_0.Args[1]
25684 v_1_0_0 := v_1_0.Args[0]
25685 v_1_0_1 := v_1_0.Args[1]
25686 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25687 y := v_1_0_0
25688 if v_1_0_1.Op != OpConst64 {
25689 continue
25690 }
25691 c := auxIntToInt64(v_1_0_1.AuxInt)
25692 if !(c&31 == 31) {
25693 continue
25694 }
25695 v.reset(OpRotateLeft32)
25696 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
25697 v0.AddArg(y)
25698 v.AddArg2(x, v0)
25699 return true
25700 }
25701 break
25702 }
25703
25704
25705
25706 for {
25707 x := v_0
25708 if v_1.Op != OpNeg32 {
25709 break
25710 }
25711 v_1_0 := v_1.Args[0]
25712 if v_1_0.Op != OpAnd32 {
25713 break
25714 }
25715 _ = v_1_0.Args[1]
25716 v_1_0_0 := v_1_0.Args[0]
25717 v_1_0_1 := v_1_0.Args[1]
25718 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25719 y := v_1_0_0
25720 if v_1_0_1.Op != OpConst32 {
25721 continue
25722 }
25723 c := auxIntToInt32(v_1_0_1.AuxInt)
25724 if !(c&31 == 31) {
25725 continue
25726 }
25727 v.reset(OpRotateLeft32)
25728 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
25729 v0.AddArg(y)
25730 v.AddArg2(x, v0)
25731 return true
25732 }
25733 break
25734 }
25735
25736
25737
25738 for {
25739 x := v_0
25740 if v_1.Op != OpNeg16 {
25741 break
25742 }
25743 v_1_0 := v_1.Args[0]
25744 if v_1_0.Op != OpAnd16 {
25745 break
25746 }
25747 _ = v_1_0.Args[1]
25748 v_1_0_0 := v_1_0.Args[0]
25749 v_1_0_1 := v_1_0.Args[1]
25750 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25751 y := v_1_0_0
25752 if v_1_0_1.Op != OpConst16 {
25753 continue
25754 }
25755 c := auxIntToInt16(v_1_0_1.AuxInt)
25756 if !(c&31 == 31) {
25757 continue
25758 }
25759 v.reset(OpRotateLeft32)
25760 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
25761 v0.AddArg(y)
25762 v.AddArg2(x, v0)
25763 return true
25764 }
25765 break
25766 }
25767
25768
25769
25770 for {
25771 x := v_0
25772 if v_1.Op != OpNeg8 {
25773 break
25774 }
25775 v_1_0 := v_1.Args[0]
25776 if v_1_0.Op != OpAnd8 {
25777 break
25778 }
25779 _ = v_1_0.Args[1]
25780 v_1_0_0 := v_1_0.Args[0]
25781 v_1_0_1 := v_1_0.Args[1]
25782 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
25783 y := v_1_0_0
25784 if v_1_0_1.Op != OpConst8 {
25785 continue
25786 }
25787 c := auxIntToInt8(v_1_0_1.AuxInt)
25788 if !(c&31 == 31) {
25789 continue
25790 }
25791 v.reset(OpRotateLeft32)
25792 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
25793 v0.AddArg(y)
25794 v.AddArg2(x, v0)
25795 return true
25796 }
25797 break
25798 }
25799
25800
25801
25802 for {
25803 x := v_0
25804 if v_1.Op != OpAdd64 {
25805 break
25806 }
25807 _ = v_1.Args[1]
25808 v_1_0 := v_1.Args[0]
25809 v_1_1 := v_1.Args[1]
25810 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25811 y := v_1_0
25812 if v_1_1.Op != OpConst64 {
25813 continue
25814 }
25815 c := auxIntToInt64(v_1_1.AuxInt)
25816 if !(c&31 == 0) {
25817 continue
25818 }
25819 v.reset(OpRotateLeft32)
25820 v.AddArg2(x, y)
25821 return true
25822 }
25823 break
25824 }
25825
25826
25827
25828 for {
25829 x := v_0
25830 if v_1.Op != OpAdd32 {
25831 break
25832 }
25833 _ = v_1.Args[1]
25834 v_1_0 := v_1.Args[0]
25835 v_1_1 := v_1.Args[1]
25836 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25837 y := v_1_0
25838 if v_1_1.Op != OpConst32 {
25839 continue
25840 }
25841 c := auxIntToInt32(v_1_1.AuxInt)
25842 if !(c&31 == 0) {
25843 continue
25844 }
25845 v.reset(OpRotateLeft32)
25846 v.AddArg2(x, y)
25847 return true
25848 }
25849 break
25850 }
25851
25852
25853
25854 for {
25855 x := v_0
25856 if v_1.Op != OpAdd16 {
25857 break
25858 }
25859 _ = v_1.Args[1]
25860 v_1_0 := v_1.Args[0]
25861 v_1_1 := v_1.Args[1]
25862 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25863 y := v_1_0
25864 if v_1_1.Op != OpConst16 {
25865 continue
25866 }
25867 c := auxIntToInt16(v_1_1.AuxInt)
25868 if !(c&31 == 0) {
25869 continue
25870 }
25871 v.reset(OpRotateLeft32)
25872 v.AddArg2(x, y)
25873 return true
25874 }
25875 break
25876 }
25877
25878
25879
25880 for {
25881 x := v_0
25882 if v_1.Op != OpAdd8 {
25883 break
25884 }
25885 _ = v_1.Args[1]
25886 v_1_0 := v_1.Args[0]
25887 v_1_1 := v_1.Args[1]
25888 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
25889 y := v_1_0
25890 if v_1_1.Op != OpConst8 {
25891 continue
25892 }
25893 c := auxIntToInt8(v_1_1.AuxInt)
25894 if !(c&31 == 0) {
25895 continue
25896 }
25897 v.reset(OpRotateLeft32)
25898 v.AddArg2(x, y)
25899 return true
25900 }
25901 break
25902 }
25903
25904
25905
25906 for {
25907 x := v_0
25908 if v_1.Op != OpSub64 {
25909 break
25910 }
25911 y := v_1.Args[1]
25912 v_1_0 := v_1.Args[0]
25913 if v_1_0.Op != OpConst64 {
25914 break
25915 }
25916 c := auxIntToInt64(v_1_0.AuxInt)
25917 if !(c&31 == 0) {
25918 break
25919 }
25920 v.reset(OpRotateLeft32)
25921 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
25922 v0.AddArg(y)
25923 v.AddArg2(x, v0)
25924 return true
25925 }
25926
25927
25928
25929 for {
25930 x := v_0
25931 if v_1.Op != OpSub32 {
25932 break
25933 }
25934 y := v_1.Args[1]
25935 v_1_0 := v_1.Args[0]
25936 if v_1_0.Op != OpConst32 {
25937 break
25938 }
25939 c := auxIntToInt32(v_1_0.AuxInt)
25940 if !(c&31 == 0) {
25941 break
25942 }
25943 v.reset(OpRotateLeft32)
25944 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
25945 v0.AddArg(y)
25946 v.AddArg2(x, v0)
25947 return true
25948 }
25949
25950
25951
25952 for {
25953 x := v_0
25954 if v_1.Op != OpSub16 {
25955 break
25956 }
25957 y := v_1.Args[1]
25958 v_1_0 := v_1.Args[0]
25959 if v_1_0.Op != OpConst16 {
25960 break
25961 }
25962 c := auxIntToInt16(v_1_0.AuxInt)
25963 if !(c&31 == 0) {
25964 break
25965 }
25966 v.reset(OpRotateLeft32)
25967 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
25968 v0.AddArg(y)
25969 v.AddArg2(x, v0)
25970 return true
25971 }
25972
25973
25974
25975 for {
25976 x := v_0
25977 if v_1.Op != OpSub8 {
25978 break
25979 }
25980 y := v_1.Args[1]
25981 v_1_0 := v_1.Args[0]
25982 if v_1_0.Op != OpConst8 {
25983 break
25984 }
25985 c := auxIntToInt8(v_1_0.AuxInt)
25986 if !(c&31 == 0) {
25987 break
25988 }
25989 v.reset(OpRotateLeft32)
25990 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
25991 v0.AddArg(y)
25992 v.AddArg2(x, v0)
25993 return true
25994 }
25995
25996
25997
25998 for {
25999 x := v_0
26000 if v_1.Op != OpConst64 {
26001 break
26002 }
26003 t := v_1.Type
26004 c := auxIntToInt64(v_1.AuxInt)
26005 if !(config.PtrSize == 4) {
26006 break
26007 }
26008 v.reset(OpRotateLeft32)
26009 v0 := b.NewValue0(v.Pos, OpConst32, t)
26010 v0.AuxInt = int32ToAuxInt(int32(c))
26011 v.AddArg2(x, v0)
26012 return true
26013 }
26014
26015
26016
26017 for {
26018 if v_0.Op != OpRotateLeft32 {
26019 break
26020 }
26021 c := v_0.Args[1]
26022 x := v_0.Args[0]
26023 d := v_1
26024 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
26025 break
26026 }
26027 v.reset(OpRotateLeft32)
26028 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
26029 v0.AddArg2(c, d)
26030 v.AddArg2(x, v0)
26031 return true
26032 }
26033
26034
26035
26036 for {
26037 if v_0.Op != OpRotateLeft32 {
26038 break
26039 }
26040 c := v_0.Args[1]
26041 x := v_0.Args[0]
26042 d := v_1
26043 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
26044 break
26045 }
26046 v.reset(OpRotateLeft32)
26047 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
26048 v0.AddArg2(c, d)
26049 v.AddArg2(x, v0)
26050 return true
26051 }
26052
26053
26054
26055 for {
26056 if v_0.Op != OpRotateLeft32 {
26057 break
26058 }
26059 c := v_0.Args[1]
26060 x := v_0.Args[0]
26061 d := v_1
26062 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
26063 break
26064 }
26065 v.reset(OpRotateLeft32)
26066 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
26067 v0.AddArg2(c, d)
26068 v.AddArg2(x, v0)
26069 return true
26070 }
26071
26072
26073
26074 for {
26075 if v_0.Op != OpRotateLeft32 {
26076 break
26077 }
26078 c := v_0.Args[1]
26079 x := v_0.Args[0]
26080 d := v_1
26081 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
26082 break
26083 }
26084 v.reset(OpRotateLeft32)
26085 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
26086 v0.AddArg2(c, d)
26087 v.AddArg2(x, v0)
26088 return true
26089 }
26090 return false
26091 }
26092 func rewriteValuegeneric_OpRotateLeft64(v *Value) bool {
26093 v_1 := v.Args[1]
26094 v_0 := v.Args[0]
26095 b := v.Block
26096 config := b.Func.Config
26097
26098
26099
26100 for {
26101 x := v_0
26102 if v_1.Op != OpConst64 {
26103 break
26104 }
26105 c := auxIntToInt64(v_1.AuxInt)
26106 if !(c%64 == 0) {
26107 break
26108 }
26109 v.copyOf(x)
26110 return true
26111 }
26112
26113
26114
26115 for {
26116 x := v_0
26117 if v_1.Op != OpAnd64 {
26118 break
26119 }
26120 _ = v_1.Args[1]
26121 v_1_0 := v_1.Args[0]
26122 v_1_1 := v_1.Args[1]
26123 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26124 y := v_1_0
26125 if v_1_1.Op != OpConst64 {
26126 continue
26127 }
26128 c := auxIntToInt64(v_1_1.AuxInt)
26129 if !(c&63 == 63) {
26130 continue
26131 }
26132 v.reset(OpRotateLeft64)
26133 v.AddArg2(x, y)
26134 return true
26135 }
26136 break
26137 }
26138
26139
26140
26141 for {
26142 x := v_0
26143 if v_1.Op != OpAnd32 {
26144 break
26145 }
26146 _ = v_1.Args[1]
26147 v_1_0 := v_1.Args[0]
26148 v_1_1 := v_1.Args[1]
26149 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26150 y := v_1_0
26151 if v_1_1.Op != OpConst32 {
26152 continue
26153 }
26154 c := auxIntToInt32(v_1_1.AuxInt)
26155 if !(c&63 == 63) {
26156 continue
26157 }
26158 v.reset(OpRotateLeft64)
26159 v.AddArg2(x, y)
26160 return true
26161 }
26162 break
26163 }
26164
26165
26166
26167 for {
26168 x := v_0
26169 if v_1.Op != OpAnd16 {
26170 break
26171 }
26172 _ = v_1.Args[1]
26173 v_1_0 := v_1.Args[0]
26174 v_1_1 := v_1.Args[1]
26175 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26176 y := v_1_0
26177 if v_1_1.Op != OpConst16 {
26178 continue
26179 }
26180 c := auxIntToInt16(v_1_1.AuxInt)
26181 if !(c&63 == 63) {
26182 continue
26183 }
26184 v.reset(OpRotateLeft64)
26185 v.AddArg2(x, y)
26186 return true
26187 }
26188 break
26189 }
26190
26191
26192
26193 for {
26194 x := v_0
26195 if v_1.Op != OpAnd8 {
26196 break
26197 }
26198 _ = v_1.Args[1]
26199 v_1_0 := v_1.Args[0]
26200 v_1_1 := v_1.Args[1]
26201 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26202 y := v_1_0
26203 if v_1_1.Op != OpConst8 {
26204 continue
26205 }
26206 c := auxIntToInt8(v_1_1.AuxInt)
26207 if !(c&63 == 63) {
26208 continue
26209 }
26210 v.reset(OpRotateLeft64)
26211 v.AddArg2(x, y)
26212 return true
26213 }
26214 break
26215 }
26216
26217
26218
26219 for {
26220 x := v_0
26221 if v_1.Op != OpNeg64 {
26222 break
26223 }
26224 v_1_0 := v_1.Args[0]
26225 if v_1_0.Op != OpAnd64 {
26226 break
26227 }
26228 _ = v_1_0.Args[1]
26229 v_1_0_0 := v_1_0.Args[0]
26230 v_1_0_1 := v_1_0.Args[1]
26231 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26232 y := v_1_0_0
26233 if v_1_0_1.Op != OpConst64 {
26234 continue
26235 }
26236 c := auxIntToInt64(v_1_0_1.AuxInt)
26237 if !(c&63 == 63) {
26238 continue
26239 }
26240 v.reset(OpRotateLeft64)
26241 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26242 v0.AddArg(y)
26243 v.AddArg2(x, v0)
26244 return true
26245 }
26246 break
26247 }
26248
26249
26250
26251 for {
26252 x := v_0
26253 if v_1.Op != OpNeg32 {
26254 break
26255 }
26256 v_1_0 := v_1.Args[0]
26257 if v_1_0.Op != OpAnd32 {
26258 break
26259 }
26260 _ = v_1_0.Args[1]
26261 v_1_0_0 := v_1_0.Args[0]
26262 v_1_0_1 := v_1_0.Args[1]
26263 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26264 y := v_1_0_0
26265 if v_1_0_1.Op != OpConst32 {
26266 continue
26267 }
26268 c := auxIntToInt32(v_1_0_1.AuxInt)
26269 if !(c&63 == 63) {
26270 continue
26271 }
26272 v.reset(OpRotateLeft64)
26273 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26274 v0.AddArg(y)
26275 v.AddArg2(x, v0)
26276 return true
26277 }
26278 break
26279 }
26280
26281
26282
26283 for {
26284 x := v_0
26285 if v_1.Op != OpNeg16 {
26286 break
26287 }
26288 v_1_0 := v_1.Args[0]
26289 if v_1_0.Op != OpAnd16 {
26290 break
26291 }
26292 _ = v_1_0.Args[1]
26293 v_1_0_0 := v_1_0.Args[0]
26294 v_1_0_1 := v_1_0.Args[1]
26295 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26296 y := v_1_0_0
26297 if v_1_0_1.Op != OpConst16 {
26298 continue
26299 }
26300 c := auxIntToInt16(v_1_0_1.AuxInt)
26301 if !(c&63 == 63) {
26302 continue
26303 }
26304 v.reset(OpRotateLeft64)
26305 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
26306 v0.AddArg(y)
26307 v.AddArg2(x, v0)
26308 return true
26309 }
26310 break
26311 }
26312
26313
26314
26315 for {
26316 x := v_0
26317 if v_1.Op != OpNeg8 {
26318 break
26319 }
26320 v_1_0 := v_1.Args[0]
26321 if v_1_0.Op != OpAnd8 {
26322 break
26323 }
26324 _ = v_1_0.Args[1]
26325 v_1_0_0 := v_1_0.Args[0]
26326 v_1_0_1 := v_1_0.Args[1]
26327 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26328 y := v_1_0_0
26329 if v_1_0_1.Op != OpConst8 {
26330 continue
26331 }
26332 c := auxIntToInt8(v_1_0_1.AuxInt)
26333 if !(c&63 == 63) {
26334 continue
26335 }
26336 v.reset(OpRotateLeft64)
26337 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
26338 v0.AddArg(y)
26339 v.AddArg2(x, v0)
26340 return true
26341 }
26342 break
26343 }
26344
26345
26346
26347 for {
26348 x := v_0
26349 if v_1.Op != OpAdd64 {
26350 break
26351 }
26352 _ = v_1.Args[1]
26353 v_1_0 := v_1.Args[0]
26354 v_1_1 := v_1.Args[1]
26355 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26356 y := v_1_0
26357 if v_1_1.Op != OpConst64 {
26358 continue
26359 }
26360 c := auxIntToInt64(v_1_1.AuxInt)
26361 if !(c&63 == 0) {
26362 continue
26363 }
26364 v.reset(OpRotateLeft64)
26365 v.AddArg2(x, y)
26366 return true
26367 }
26368 break
26369 }
26370
26371
26372
26373 for {
26374 x := v_0
26375 if v_1.Op != OpAdd32 {
26376 break
26377 }
26378 _ = v_1.Args[1]
26379 v_1_0 := v_1.Args[0]
26380 v_1_1 := v_1.Args[1]
26381 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26382 y := v_1_0
26383 if v_1_1.Op != OpConst32 {
26384 continue
26385 }
26386 c := auxIntToInt32(v_1_1.AuxInt)
26387 if !(c&63 == 0) {
26388 continue
26389 }
26390 v.reset(OpRotateLeft64)
26391 v.AddArg2(x, y)
26392 return true
26393 }
26394 break
26395 }
26396
26397
26398
26399 for {
26400 x := v_0
26401 if v_1.Op != OpAdd16 {
26402 break
26403 }
26404 _ = v_1.Args[1]
26405 v_1_0 := v_1.Args[0]
26406 v_1_1 := v_1.Args[1]
26407 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26408 y := v_1_0
26409 if v_1_1.Op != OpConst16 {
26410 continue
26411 }
26412 c := auxIntToInt16(v_1_1.AuxInt)
26413 if !(c&63 == 0) {
26414 continue
26415 }
26416 v.reset(OpRotateLeft64)
26417 v.AddArg2(x, y)
26418 return true
26419 }
26420 break
26421 }
26422
26423
26424
26425 for {
26426 x := v_0
26427 if v_1.Op != OpAdd8 {
26428 break
26429 }
26430 _ = v_1.Args[1]
26431 v_1_0 := v_1.Args[0]
26432 v_1_1 := v_1.Args[1]
26433 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26434 y := v_1_0
26435 if v_1_1.Op != OpConst8 {
26436 continue
26437 }
26438 c := auxIntToInt8(v_1_1.AuxInt)
26439 if !(c&63 == 0) {
26440 continue
26441 }
26442 v.reset(OpRotateLeft64)
26443 v.AddArg2(x, y)
26444 return true
26445 }
26446 break
26447 }
26448
26449
26450
26451 for {
26452 x := v_0
26453 if v_1.Op != OpSub64 {
26454 break
26455 }
26456 y := v_1.Args[1]
26457 v_1_0 := v_1.Args[0]
26458 if v_1_0.Op != OpConst64 {
26459 break
26460 }
26461 c := auxIntToInt64(v_1_0.AuxInt)
26462 if !(c&63 == 0) {
26463 break
26464 }
26465 v.reset(OpRotateLeft64)
26466 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26467 v0.AddArg(y)
26468 v.AddArg2(x, v0)
26469 return true
26470 }
26471
26472
26473
26474 for {
26475 x := v_0
26476 if v_1.Op != OpSub32 {
26477 break
26478 }
26479 y := v_1.Args[1]
26480 v_1_0 := v_1.Args[0]
26481 if v_1_0.Op != OpConst32 {
26482 break
26483 }
26484 c := auxIntToInt32(v_1_0.AuxInt)
26485 if !(c&63 == 0) {
26486 break
26487 }
26488 v.reset(OpRotateLeft64)
26489 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26490 v0.AddArg(y)
26491 v.AddArg2(x, v0)
26492 return true
26493 }
26494
26495
26496
26497 for {
26498 x := v_0
26499 if v_1.Op != OpSub16 {
26500 break
26501 }
26502 y := v_1.Args[1]
26503 v_1_0 := v_1.Args[0]
26504 if v_1_0.Op != OpConst16 {
26505 break
26506 }
26507 c := auxIntToInt16(v_1_0.AuxInt)
26508 if !(c&63 == 0) {
26509 break
26510 }
26511 v.reset(OpRotateLeft64)
26512 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
26513 v0.AddArg(y)
26514 v.AddArg2(x, v0)
26515 return true
26516 }
26517
26518
26519
26520 for {
26521 x := v_0
26522 if v_1.Op != OpSub8 {
26523 break
26524 }
26525 y := v_1.Args[1]
26526 v_1_0 := v_1.Args[0]
26527 if v_1_0.Op != OpConst8 {
26528 break
26529 }
26530 c := auxIntToInt8(v_1_0.AuxInt)
26531 if !(c&63 == 0) {
26532 break
26533 }
26534 v.reset(OpRotateLeft64)
26535 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
26536 v0.AddArg(y)
26537 v.AddArg2(x, v0)
26538 return true
26539 }
26540
26541
26542
26543 for {
26544 x := v_0
26545 if v_1.Op != OpConst64 {
26546 break
26547 }
26548 t := v_1.Type
26549 c := auxIntToInt64(v_1.AuxInt)
26550 if !(config.PtrSize == 4) {
26551 break
26552 }
26553 v.reset(OpRotateLeft64)
26554 v0 := b.NewValue0(v.Pos, OpConst32, t)
26555 v0.AuxInt = int32ToAuxInt(int32(c))
26556 v.AddArg2(x, v0)
26557 return true
26558 }
26559
26560
26561
26562 for {
26563 if v_0.Op != OpRotateLeft64 {
26564 break
26565 }
26566 c := v_0.Args[1]
26567 x := v_0.Args[0]
26568 d := v_1
26569 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
26570 break
26571 }
26572 v.reset(OpRotateLeft64)
26573 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
26574 v0.AddArg2(c, d)
26575 v.AddArg2(x, v0)
26576 return true
26577 }
26578
26579
26580
26581 for {
26582 if v_0.Op != OpRotateLeft64 {
26583 break
26584 }
26585 c := v_0.Args[1]
26586 x := v_0.Args[0]
26587 d := v_1
26588 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
26589 break
26590 }
26591 v.reset(OpRotateLeft64)
26592 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
26593 v0.AddArg2(c, d)
26594 v.AddArg2(x, v0)
26595 return true
26596 }
26597
26598
26599
26600 for {
26601 if v_0.Op != OpRotateLeft64 {
26602 break
26603 }
26604 c := v_0.Args[1]
26605 x := v_0.Args[0]
26606 d := v_1
26607 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
26608 break
26609 }
26610 v.reset(OpRotateLeft64)
26611 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
26612 v0.AddArg2(c, d)
26613 v.AddArg2(x, v0)
26614 return true
26615 }
26616
26617
26618
26619 for {
26620 if v_0.Op != OpRotateLeft64 {
26621 break
26622 }
26623 c := v_0.Args[1]
26624 x := v_0.Args[0]
26625 d := v_1
26626 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
26627 break
26628 }
26629 v.reset(OpRotateLeft64)
26630 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
26631 v0.AddArg2(c, d)
26632 v.AddArg2(x, v0)
26633 return true
26634 }
26635 return false
26636 }
26637 func rewriteValuegeneric_OpRotateLeft8(v *Value) bool {
26638 v_1 := v.Args[1]
26639 v_0 := v.Args[0]
26640 b := v.Block
26641 config := b.Func.Config
26642
26643
26644
26645 for {
26646 x := v_0
26647 if v_1.Op != OpConst8 {
26648 break
26649 }
26650 c := auxIntToInt8(v_1.AuxInt)
26651 if !(c%8 == 0) {
26652 break
26653 }
26654 v.copyOf(x)
26655 return true
26656 }
26657
26658
26659
26660 for {
26661 x := v_0
26662 if v_1.Op != OpAnd64 {
26663 break
26664 }
26665 _ = v_1.Args[1]
26666 v_1_0 := v_1.Args[0]
26667 v_1_1 := v_1.Args[1]
26668 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26669 y := v_1_0
26670 if v_1_1.Op != OpConst64 {
26671 continue
26672 }
26673 c := auxIntToInt64(v_1_1.AuxInt)
26674 if !(c&7 == 7) {
26675 continue
26676 }
26677 v.reset(OpRotateLeft8)
26678 v.AddArg2(x, y)
26679 return true
26680 }
26681 break
26682 }
26683
26684
26685
26686 for {
26687 x := v_0
26688 if v_1.Op != OpAnd32 {
26689 break
26690 }
26691 _ = v_1.Args[1]
26692 v_1_0 := v_1.Args[0]
26693 v_1_1 := v_1.Args[1]
26694 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26695 y := v_1_0
26696 if v_1_1.Op != OpConst32 {
26697 continue
26698 }
26699 c := auxIntToInt32(v_1_1.AuxInt)
26700 if !(c&7 == 7) {
26701 continue
26702 }
26703 v.reset(OpRotateLeft8)
26704 v.AddArg2(x, y)
26705 return true
26706 }
26707 break
26708 }
26709
26710
26711
26712 for {
26713 x := v_0
26714 if v_1.Op != OpAnd16 {
26715 break
26716 }
26717 _ = v_1.Args[1]
26718 v_1_0 := v_1.Args[0]
26719 v_1_1 := v_1.Args[1]
26720 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26721 y := v_1_0
26722 if v_1_1.Op != OpConst16 {
26723 continue
26724 }
26725 c := auxIntToInt16(v_1_1.AuxInt)
26726 if !(c&7 == 7) {
26727 continue
26728 }
26729 v.reset(OpRotateLeft8)
26730 v.AddArg2(x, y)
26731 return true
26732 }
26733 break
26734 }
26735
26736
26737
26738 for {
26739 x := v_0
26740 if v_1.Op != OpAnd8 {
26741 break
26742 }
26743 _ = v_1.Args[1]
26744 v_1_0 := v_1.Args[0]
26745 v_1_1 := v_1.Args[1]
26746 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26747 y := v_1_0
26748 if v_1_1.Op != OpConst8 {
26749 continue
26750 }
26751 c := auxIntToInt8(v_1_1.AuxInt)
26752 if !(c&7 == 7) {
26753 continue
26754 }
26755 v.reset(OpRotateLeft8)
26756 v.AddArg2(x, y)
26757 return true
26758 }
26759 break
26760 }
26761
26762
26763
26764 for {
26765 x := v_0
26766 if v_1.Op != OpNeg64 {
26767 break
26768 }
26769 v_1_0 := v_1.Args[0]
26770 if v_1_0.Op != OpAnd64 {
26771 break
26772 }
26773 _ = v_1_0.Args[1]
26774 v_1_0_0 := v_1_0.Args[0]
26775 v_1_0_1 := v_1_0.Args[1]
26776 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26777 y := v_1_0_0
26778 if v_1_0_1.Op != OpConst64 {
26779 continue
26780 }
26781 c := auxIntToInt64(v_1_0_1.AuxInt)
26782 if !(c&7 == 7) {
26783 continue
26784 }
26785 v.reset(OpRotateLeft8)
26786 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
26787 v0.AddArg(y)
26788 v.AddArg2(x, v0)
26789 return true
26790 }
26791 break
26792 }
26793
26794
26795
26796 for {
26797 x := v_0
26798 if v_1.Op != OpNeg32 {
26799 break
26800 }
26801 v_1_0 := v_1.Args[0]
26802 if v_1_0.Op != OpAnd32 {
26803 break
26804 }
26805 _ = v_1_0.Args[1]
26806 v_1_0_0 := v_1_0.Args[0]
26807 v_1_0_1 := v_1_0.Args[1]
26808 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26809 y := v_1_0_0
26810 if v_1_0_1.Op != OpConst32 {
26811 continue
26812 }
26813 c := auxIntToInt32(v_1_0_1.AuxInt)
26814 if !(c&7 == 7) {
26815 continue
26816 }
26817 v.reset(OpRotateLeft8)
26818 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
26819 v0.AddArg(y)
26820 v.AddArg2(x, v0)
26821 return true
26822 }
26823 break
26824 }
26825
26826
26827
26828 for {
26829 x := v_0
26830 if v_1.Op != OpNeg16 {
26831 break
26832 }
26833 v_1_0 := v_1.Args[0]
26834 if v_1_0.Op != OpAnd16 {
26835 break
26836 }
26837 _ = v_1_0.Args[1]
26838 v_1_0_0 := v_1_0.Args[0]
26839 v_1_0_1 := v_1_0.Args[1]
26840 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26841 y := v_1_0_0
26842 if v_1_0_1.Op != OpConst16 {
26843 continue
26844 }
26845 c := auxIntToInt16(v_1_0_1.AuxInt)
26846 if !(c&7 == 7) {
26847 continue
26848 }
26849 v.reset(OpRotateLeft8)
26850 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
26851 v0.AddArg(y)
26852 v.AddArg2(x, v0)
26853 return true
26854 }
26855 break
26856 }
26857
26858
26859
26860 for {
26861 x := v_0
26862 if v_1.Op != OpNeg8 {
26863 break
26864 }
26865 v_1_0 := v_1.Args[0]
26866 if v_1_0.Op != OpAnd8 {
26867 break
26868 }
26869 _ = v_1_0.Args[1]
26870 v_1_0_0 := v_1_0.Args[0]
26871 v_1_0_1 := v_1_0.Args[1]
26872 for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 {
26873 y := v_1_0_0
26874 if v_1_0_1.Op != OpConst8 {
26875 continue
26876 }
26877 c := auxIntToInt8(v_1_0_1.AuxInt)
26878 if !(c&7 == 7) {
26879 continue
26880 }
26881 v.reset(OpRotateLeft8)
26882 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
26883 v0.AddArg(y)
26884 v.AddArg2(x, v0)
26885 return true
26886 }
26887 break
26888 }
26889
26890
26891
26892 for {
26893 x := v_0
26894 if v_1.Op != OpAdd64 {
26895 break
26896 }
26897 _ = v_1.Args[1]
26898 v_1_0 := v_1.Args[0]
26899 v_1_1 := v_1.Args[1]
26900 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26901 y := v_1_0
26902 if v_1_1.Op != OpConst64 {
26903 continue
26904 }
26905 c := auxIntToInt64(v_1_1.AuxInt)
26906 if !(c&7 == 0) {
26907 continue
26908 }
26909 v.reset(OpRotateLeft8)
26910 v.AddArg2(x, y)
26911 return true
26912 }
26913 break
26914 }
26915
26916
26917
26918 for {
26919 x := v_0
26920 if v_1.Op != OpAdd32 {
26921 break
26922 }
26923 _ = v_1.Args[1]
26924 v_1_0 := v_1.Args[0]
26925 v_1_1 := v_1.Args[1]
26926 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26927 y := v_1_0
26928 if v_1_1.Op != OpConst32 {
26929 continue
26930 }
26931 c := auxIntToInt32(v_1_1.AuxInt)
26932 if !(c&7 == 0) {
26933 continue
26934 }
26935 v.reset(OpRotateLeft8)
26936 v.AddArg2(x, y)
26937 return true
26938 }
26939 break
26940 }
26941
26942
26943
26944 for {
26945 x := v_0
26946 if v_1.Op != OpAdd16 {
26947 break
26948 }
26949 _ = v_1.Args[1]
26950 v_1_0 := v_1.Args[0]
26951 v_1_1 := v_1.Args[1]
26952 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26953 y := v_1_0
26954 if v_1_1.Op != OpConst16 {
26955 continue
26956 }
26957 c := auxIntToInt16(v_1_1.AuxInt)
26958 if !(c&7 == 0) {
26959 continue
26960 }
26961 v.reset(OpRotateLeft8)
26962 v.AddArg2(x, y)
26963 return true
26964 }
26965 break
26966 }
26967
26968
26969
26970 for {
26971 x := v_0
26972 if v_1.Op != OpAdd8 {
26973 break
26974 }
26975 _ = v_1.Args[1]
26976 v_1_0 := v_1.Args[0]
26977 v_1_1 := v_1.Args[1]
26978 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
26979 y := v_1_0
26980 if v_1_1.Op != OpConst8 {
26981 continue
26982 }
26983 c := auxIntToInt8(v_1_1.AuxInt)
26984 if !(c&7 == 0) {
26985 continue
26986 }
26987 v.reset(OpRotateLeft8)
26988 v.AddArg2(x, y)
26989 return true
26990 }
26991 break
26992 }
26993
26994
26995
26996 for {
26997 x := v_0
26998 if v_1.Op != OpSub64 {
26999 break
27000 }
27001 y := v_1.Args[1]
27002 v_1_0 := v_1.Args[0]
27003 if v_1_0.Op != OpConst64 {
27004 break
27005 }
27006 c := auxIntToInt64(v_1_0.AuxInt)
27007 if !(c&7 == 0) {
27008 break
27009 }
27010 v.reset(OpRotateLeft8)
27011 v0 := b.NewValue0(v.Pos, OpNeg64, y.Type)
27012 v0.AddArg(y)
27013 v.AddArg2(x, v0)
27014 return true
27015 }
27016
27017
27018
27019 for {
27020 x := v_0
27021 if v_1.Op != OpSub32 {
27022 break
27023 }
27024 y := v_1.Args[1]
27025 v_1_0 := v_1.Args[0]
27026 if v_1_0.Op != OpConst32 {
27027 break
27028 }
27029 c := auxIntToInt32(v_1_0.AuxInt)
27030 if !(c&7 == 0) {
27031 break
27032 }
27033 v.reset(OpRotateLeft8)
27034 v0 := b.NewValue0(v.Pos, OpNeg32, y.Type)
27035 v0.AddArg(y)
27036 v.AddArg2(x, v0)
27037 return true
27038 }
27039
27040
27041
27042 for {
27043 x := v_0
27044 if v_1.Op != OpSub16 {
27045 break
27046 }
27047 y := v_1.Args[1]
27048 v_1_0 := v_1.Args[0]
27049 if v_1_0.Op != OpConst16 {
27050 break
27051 }
27052 c := auxIntToInt16(v_1_0.AuxInt)
27053 if !(c&7 == 0) {
27054 break
27055 }
27056 v.reset(OpRotateLeft8)
27057 v0 := b.NewValue0(v.Pos, OpNeg16, y.Type)
27058 v0.AddArg(y)
27059 v.AddArg2(x, v0)
27060 return true
27061 }
27062
27063
27064
27065 for {
27066 x := v_0
27067 if v_1.Op != OpSub8 {
27068 break
27069 }
27070 y := v_1.Args[1]
27071 v_1_0 := v_1.Args[0]
27072 if v_1_0.Op != OpConst8 {
27073 break
27074 }
27075 c := auxIntToInt8(v_1_0.AuxInt)
27076 if !(c&7 == 0) {
27077 break
27078 }
27079 v.reset(OpRotateLeft8)
27080 v0 := b.NewValue0(v.Pos, OpNeg8, y.Type)
27081 v0.AddArg(y)
27082 v.AddArg2(x, v0)
27083 return true
27084 }
27085
27086
27087
27088 for {
27089 x := v_0
27090 if v_1.Op != OpConst64 {
27091 break
27092 }
27093 t := v_1.Type
27094 c := auxIntToInt64(v_1.AuxInt)
27095 if !(config.PtrSize == 4) {
27096 break
27097 }
27098 v.reset(OpRotateLeft8)
27099 v0 := b.NewValue0(v.Pos, OpConst32, t)
27100 v0.AuxInt = int32ToAuxInt(int32(c))
27101 v.AddArg2(x, v0)
27102 return true
27103 }
27104
27105
27106
27107 for {
27108 if v_0.Op != OpRotateLeft8 {
27109 break
27110 }
27111 c := v_0.Args[1]
27112 x := v_0.Args[0]
27113 d := v_1
27114 if !(c.Type.Size() == 8 && d.Type.Size() == 8) {
27115 break
27116 }
27117 v.reset(OpRotateLeft8)
27118 v0 := b.NewValue0(v.Pos, OpAdd64, c.Type)
27119 v0.AddArg2(c, d)
27120 v.AddArg2(x, v0)
27121 return true
27122 }
27123
27124
27125
27126 for {
27127 if v_0.Op != OpRotateLeft8 {
27128 break
27129 }
27130 c := v_0.Args[1]
27131 x := v_0.Args[0]
27132 d := v_1
27133 if !(c.Type.Size() == 4 && d.Type.Size() == 4) {
27134 break
27135 }
27136 v.reset(OpRotateLeft8)
27137 v0 := b.NewValue0(v.Pos, OpAdd32, c.Type)
27138 v0.AddArg2(c, d)
27139 v.AddArg2(x, v0)
27140 return true
27141 }
27142
27143
27144
27145 for {
27146 if v_0.Op != OpRotateLeft8 {
27147 break
27148 }
27149 c := v_0.Args[1]
27150 x := v_0.Args[0]
27151 d := v_1
27152 if !(c.Type.Size() == 2 && d.Type.Size() == 2) {
27153 break
27154 }
27155 v.reset(OpRotateLeft8)
27156 v0 := b.NewValue0(v.Pos, OpAdd16, c.Type)
27157 v0.AddArg2(c, d)
27158 v.AddArg2(x, v0)
27159 return true
27160 }
27161
27162
27163
27164 for {
27165 if v_0.Op != OpRotateLeft8 {
27166 break
27167 }
27168 c := v_0.Args[1]
27169 x := v_0.Args[0]
27170 d := v_1
27171 if !(c.Type.Size() == 1 && d.Type.Size() == 1) {
27172 break
27173 }
27174 v.reset(OpRotateLeft8)
27175 v0 := b.NewValue0(v.Pos, OpAdd8, c.Type)
27176 v0.AddArg2(c, d)
27177 v.AddArg2(x, v0)
27178 return true
27179 }
27180 return false
27181 }
27182 func rewriteValuegeneric_OpRound32F(v *Value) bool {
27183 v_0 := v.Args[0]
27184
27185
27186 for {
27187 x := v_0
27188 if x.Op != OpConst32F {
27189 break
27190 }
27191 v.copyOf(x)
27192 return true
27193 }
27194 return false
27195 }
27196 func rewriteValuegeneric_OpRound64F(v *Value) bool {
27197 v_0 := v.Args[0]
27198
27199
27200 for {
27201 x := v_0
27202 if x.Op != OpConst64F {
27203 break
27204 }
27205 v.copyOf(x)
27206 return true
27207 }
27208 return false
27209 }
27210 func rewriteValuegeneric_OpRoundToEven(v *Value) bool {
27211 v_0 := v.Args[0]
27212
27213
27214 for {
27215 if v_0.Op != OpConst64F {
27216 break
27217 }
27218 c := auxIntToFloat64(v_0.AuxInt)
27219 v.reset(OpConst64F)
27220 v.AuxInt = float64ToAuxInt(math.RoundToEven(c))
27221 return true
27222 }
27223 return false
27224 }
27225 func rewriteValuegeneric_OpRsh16Ux16(v *Value) bool {
27226 v_1 := v.Args[1]
27227 v_0 := v.Args[0]
27228 b := v.Block
27229
27230
27231 for {
27232 t := v.Type
27233 x := v_0
27234 if v_1.Op != OpConst16 {
27235 break
27236 }
27237 c := auxIntToInt16(v_1.AuxInt)
27238 v.reset(OpRsh16Ux64)
27239 v0 := b.NewValue0(v.Pos, OpConst64, t)
27240 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
27241 v.AddArg2(x, v0)
27242 return true
27243 }
27244
27245
27246 for {
27247 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27248 break
27249 }
27250 v.reset(OpConst16)
27251 v.AuxInt = int16ToAuxInt(0)
27252 return true
27253 }
27254
27255
27256
27257 for {
27258 if auxIntToBool(v.AuxInt) != false {
27259 break
27260 }
27261 x := v_0
27262 con := v_1
27263 if con.Op != OpConst16 {
27264 break
27265 }
27266 c := auxIntToInt16(con.AuxInt)
27267 if !(0 < c && c < 16) {
27268 break
27269 }
27270 v.reset(OpRsh16Ux16)
27271 v.AuxInt = boolToAuxInt(true)
27272 v.AddArg2(x, con)
27273 return true
27274 }
27275 return false
27276 }
27277 func rewriteValuegeneric_OpRsh16Ux32(v *Value) bool {
27278 v_1 := v.Args[1]
27279 v_0 := v.Args[0]
27280 b := v.Block
27281
27282
27283 for {
27284 t := v.Type
27285 x := v_0
27286 if v_1.Op != OpConst32 {
27287 break
27288 }
27289 c := auxIntToInt32(v_1.AuxInt)
27290 v.reset(OpRsh16Ux64)
27291 v0 := b.NewValue0(v.Pos, OpConst64, t)
27292 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
27293 v.AddArg2(x, v0)
27294 return true
27295 }
27296
27297
27298 for {
27299 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27300 break
27301 }
27302 v.reset(OpConst16)
27303 v.AuxInt = int16ToAuxInt(0)
27304 return true
27305 }
27306
27307
27308
27309 for {
27310 if auxIntToBool(v.AuxInt) != false {
27311 break
27312 }
27313 x := v_0
27314 con := v_1
27315 if con.Op != OpConst32 {
27316 break
27317 }
27318 c := auxIntToInt32(con.AuxInt)
27319 if !(0 < c && c < 16) {
27320 break
27321 }
27322 v.reset(OpRsh16Ux32)
27323 v.AuxInt = boolToAuxInt(true)
27324 v.AddArg2(x, con)
27325 return true
27326 }
27327 return false
27328 }
27329 func rewriteValuegeneric_OpRsh16Ux64(v *Value) bool {
27330 v_1 := v.Args[1]
27331 v_0 := v.Args[0]
27332 b := v.Block
27333 typ := &b.Func.Config.Types
27334
27335
27336 for {
27337 if v_0.Op != OpConst16 {
27338 break
27339 }
27340 c := auxIntToInt16(v_0.AuxInt)
27341 if v_1.Op != OpConst64 {
27342 break
27343 }
27344 d := auxIntToInt64(v_1.AuxInt)
27345 v.reset(OpConst16)
27346 v.AuxInt = int16ToAuxInt(int16(uint16(c) >> uint64(d)))
27347 return true
27348 }
27349
27350
27351 for {
27352 x := v_0
27353 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
27354 break
27355 }
27356 v.copyOf(x)
27357 return true
27358 }
27359
27360
27361 for {
27362 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27363 break
27364 }
27365 v.reset(OpConst16)
27366 v.AuxInt = int16ToAuxInt(0)
27367 return true
27368 }
27369
27370
27371
27372 for {
27373 if v_1.Op != OpConst64 {
27374 break
27375 }
27376 c := auxIntToInt64(v_1.AuxInt)
27377 if !(uint64(c) >= 16) {
27378 break
27379 }
27380 v.reset(OpConst16)
27381 v.AuxInt = int16ToAuxInt(0)
27382 return true
27383 }
27384
27385
27386
27387 for {
27388 t := v.Type
27389 if v_0.Op != OpRsh16Ux64 {
27390 break
27391 }
27392 _ = v_0.Args[1]
27393 x := v_0.Args[0]
27394 v_0_1 := v_0.Args[1]
27395 if v_0_1.Op != OpConst64 {
27396 break
27397 }
27398 c := auxIntToInt64(v_0_1.AuxInt)
27399 if v_1.Op != OpConst64 {
27400 break
27401 }
27402 d := auxIntToInt64(v_1.AuxInt)
27403 if !(!uaddOvf(c, d)) {
27404 break
27405 }
27406 v.reset(OpRsh16Ux64)
27407 v0 := b.NewValue0(v.Pos, OpConst64, t)
27408 v0.AuxInt = int64ToAuxInt(c + d)
27409 v.AddArg2(x, v0)
27410 return true
27411 }
27412
27413
27414 for {
27415 if v_0.Op != OpRsh16x64 {
27416 break
27417 }
27418 x := v_0.Args[0]
27419 if v_1.Op != OpConst64 {
27420 break
27421 }
27422 t := v_1.Type
27423 if auxIntToInt64(v_1.AuxInt) != 15 {
27424 break
27425 }
27426 v.reset(OpRsh16Ux64)
27427 v0 := b.NewValue0(v.Pos, OpConst64, t)
27428 v0.AuxInt = int64ToAuxInt(15)
27429 v.AddArg2(x, v0)
27430 return true
27431 }
27432
27433
27434
27435 for {
27436 i := v_0
27437 if i.Op != OpLsh16x64 {
27438 break
27439 }
27440 _ = i.Args[1]
27441 x := i.Args[0]
27442 i_1 := i.Args[1]
27443 if i_1.Op != OpConst64 {
27444 break
27445 }
27446 c := auxIntToInt64(i_1.AuxInt)
27447 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 16 && i.Uses == 1) {
27448 break
27449 }
27450 v.reset(OpAnd16)
27451 v0 := b.NewValue0(v.Pos, OpConst16, v.Type)
27452 v0.AuxInt = int16ToAuxInt(int16(^uint16(0) >> c))
27453 v.AddArg2(x, v0)
27454 return true
27455 }
27456
27457
27458
27459 for {
27460 if v_0.Op != OpLsh16x64 {
27461 break
27462 }
27463 _ = v_0.Args[1]
27464 v_0_0 := v_0.Args[0]
27465 if v_0_0.Op != OpRsh16Ux64 {
27466 break
27467 }
27468 _ = v_0_0.Args[1]
27469 x := v_0_0.Args[0]
27470 v_0_0_1 := v_0_0.Args[1]
27471 if v_0_0_1.Op != OpConst64 {
27472 break
27473 }
27474 c1 := auxIntToInt64(v_0_0_1.AuxInt)
27475 v_0_1 := v_0.Args[1]
27476 if v_0_1.Op != OpConst64 {
27477 break
27478 }
27479 c2 := auxIntToInt64(v_0_1.AuxInt)
27480 if v_1.Op != OpConst64 {
27481 break
27482 }
27483 c3 := auxIntToInt64(v_1.AuxInt)
27484 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
27485 break
27486 }
27487 v.reset(OpRsh16Ux64)
27488 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
27489 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
27490 v.AddArg2(x, v0)
27491 return true
27492 }
27493
27494
27495 for {
27496 if v_0.Op != OpLsh16x64 {
27497 break
27498 }
27499 _ = v_0.Args[1]
27500 x := v_0.Args[0]
27501 v_0_1 := v_0.Args[1]
27502 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 8 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 8 {
27503 break
27504 }
27505 v.reset(OpZeroExt8to16)
27506 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.UInt8)
27507 v0.AddArg(x)
27508 v.AddArg(v0)
27509 return true
27510 }
27511
27512
27513
27514 for {
27515 if auxIntToBool(v.AuxInt) != false {
27516 break
27517 }
27518 x := v_0
27519 con := v_1
27520 if con.Op != OpConst64 {
27521 break
27522 }
27523 c := auxIntToInt64(con.AuxInt)
27524 if !(0 < c && c < 16) {
27525 break
27526 }
27527 v.reset(OpRsh16Ux64)
27528 v.AuxInt = boolToAuxInt(true)
27529 v.AddArg2(x, con)
27530 return true
27531 }
27532 return false
27533 }
27534 func rewriteValuegeneric_OpRsh16Ux8(v *Value) bool {
27535 v_1 := v.Args[1]
27536 v_0 := v.Args[0]
27537 b := v.Block
27538
27539
27540 for {
27541 t := v.Type
27542 x := v_0
27543 if v_1.Op != OpConst8 {
27544 break
27545 }
27546 c := auxIntToInt8(v_1.AuxInt)
27547 v.reset(OpRsh16Ux64)
27548 v0 := b.NewValue0(v.Pos, OpConst64, t)
27549 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
27550 v.AddArg2(x, v0)
27551 return true
27552 }
27553
27554
27555 for {
27556 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27557 break
27558 }
27559 v.reset(OpConst16)
27560 v.AuxInt = int16ToAuxInt(0)
27561 return true
27562 }
27563
27564
27565
27566 for {
27567 if auxIntToBool(v.AuxInt) != false {
27568 break
27569 }
27570 x := v_0
27571 con := v_1
27572 if con.Op != OpConst8 {
27573 break
27574 }
27575 c := auxIntToInt8(con.AuxInt)
27576 if !(0 < c && c < 16) {
27577 break
27578 }
27579 v.reset(OpRsh16Ux8)
27580 v.AuxInt = boolToAuxInt(true)
27581 v.AddArg2(x, con)
27582 return true
27583 }
27584 return false
27585 }
27586 func rewriteValuegeneric_OpRsh16x16(v *Value) bool {
27587 v_1 := v.Args[1]
27588 v_0 := v.Args[0]
27589 b := v.Block
27590
27591
27592 for {
27593 t := v.Type
27594 x := v_0
27595 if v_1.Op != OpConst16 {
27596 break
27597 }
27598 c := auxIntToInt16(v_1.AuxInt)
27599 v.reset(OpRsh16x64)
27600 v0 := b.NewValue0(v.Pos, OpConst64, t)
27601 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
27602 v.AddArg2(x, v0)
27603 return true
27604 }
27605
27606
27607 for {
27608 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27609 break
27610 }
27611 v.reset(OpConst16)
27612 v.AuxInt = int16ToAuxInt(0)
27613 return true
27614 }
27615
27616
27617
27618 for {
27619 if auxIntToBool(v.AuxInt) != false {
27620 break
27621 }
27622 x := v_0
27623 con := v_1
27624 if con.Op != OpConst16 {
27625 break
27626 }
27627 c := auxIntToInt16(con.AuxInt)
27628 if !(0 < c && c < 16) {
27629 break
27630 }
27631 v.reset(OpRsh16x16)
27632 v.AuxInt = boolToAuxInt(true)
27633 v.AddArg2(x, con)
27634 return true
27635 }
27636 return false
27637 }
27638 func rewriteValuegeneric_OpRsh16x32(v *Value) bool {
27639 v_1 := v.Args[1]
27640 v_0 := v.Args[0]
27641 b := v.Block
27642
27643
27644 for {
27645 t := v.Type
27646 x := v_0
27647 if v_1.Op != OpConst32 {
27648 break
27649 }
27650 c := auxIntToInt32(v_1.AuxInt)
27651 v.reset(OpRsh16x64)
27652 v0 := b.NewValue0(v.Pos, OpConst64, t)
27653 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
27654 v.AddArg2(x, v0)
27655 return true
27656 }
27657
27658
27659 for {
27660 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27661 break
27662 }
27663 v.reset(OpConst16)
27664 v.AuxInt = int16ToAuxInt(0)
27665 return true
27666 }
27667
27668
27669
27670 for {
27671 if auxIntToBool(v.AuxInt) != false {
27672 break
27673 }
27674 x := v_0
27675 con := v_1
27676 if con.Op != OpConst32 {
27677 break
27678 }
27679 c := auxIntToInt32(con.AuxInt)
27680 if !(0 < c && c < 16) {
27681 break
27682 }
27683 v.reset(OpRsh16x32)
27684 v.AuxInt = boolToAuxInt(true)
27685 v.AddArg2(x, con)
27686 return true
27687 }
27688 return false
27689 }
27690 func rewriteValuegeneric_OpRsh16x64(v *Value) bool {
27691 v_1 := v.Args[1]
27692 v_0 := v.Args[0]
27693 b := v.Block
27694 typ := &b.Func.Config.Types
27695
27696
27697 for {
27698 if v_0.Op != OpConst16 {
27699 break
27700 }
27701 c := auxIntToInt16(v_0.AuxInt)
27702 if v_1.Op != OpConst64 {
27703 break
27704 }
27705 d := auxIntToInt64(v_1.AuxInt)
27706 v.reset(OpConst16)
27707 v.AuxInt = int16ToAuxInt(c >> uint64(d))
27708 return true
27709 }
27710
27711
27712 for {
27713 x := v_0
27714 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
27715 break
27716 }
27717 v.copyOf(x)
27718 return true
27719 }
27720
27721
27722 for {
27723 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27724 break
27725 }
27726 v.reset(OpConst16)
27727 v.AuxInt = int16ToAuxInt(0)
27728 return true
27729 }
27730
27731
27732
27733 for {
27734 t := v.Type
27735 if v_0.Op != OpRsh16x64 {
27736 break
27737 }
27738 _ = v_0.Args[1]
27739 x := v_0.Args[0]
27740 v_0_1 := v_0.Args[1]
27741 if v_0_1.Op != OpConst64 {
27742 break
27743 }
27744 c := auxIntToInt64(v_0_1.AuxInt)
27745 if v_1.Op != OpConst64 {
27746 break
27747 }
27748 d := auxIntToInt64(v_1.AuxInt)
27749 if !(!uaddOvf(c, d)) {
27750 break
27751 }
27752 v.reset(OpRsh16x64)
27753 v0 := b.NewValue0(v.Pos, OpConst64, t)
27754 v0.AuxInt = int64ToAuxInt(c + d)
27755 v.AddArg2(x, v0)
27756 return true
27757 }
27758
27759
27760 for {
27761 if v_0.Op != OpLsh16x64 {
27762 break
27763 }
27764 _ = v_0.Args[1]
27765 x := v_0.Args[0]
27766 v_0_1 := v_0.Args[1]
27767 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 8 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 8 {
27768 break
27769 }
27770 v.reset(OpSignExt8to16)
27771 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.Int8)
27772 v0.AddArg(x)
27773 v.AddArg(v0)
27774 return true
27775 }
27776
27777
27778
27779 for {
27780 if auxIntToBool(v.AuxInt) != false {
27781 break
27782 }
27783 x := v_0
27784 con := v_1
27785 if con.Op != OpConst64 {
27786 break
27787 }
27788 c := auxIntToInt64(con.AuxInt)
27789 if !(0 < c && c < 16) {
27790 break
27791 }
27792 v.reset(OpRsh16x64)
27793 v.AuxInt = boolToAuxInt(true)
27794 v.AddArg2(x, con)
27795 return true
27796 }
27797 return false
27798 }
27799 func rewriteValuegeneric_OpRsh16x8(v *Value) bool {
27800 v_1 := v.Args[1]
27801 v_0 := v.Args[0]
27802 b := v.Block
27803
27804
27805 for {
27806 t := v.Type
27807 x := v_0
27808 if v_1.Op != OpConst8 {
27809 break
27810 }
27811 c := auxIntToInt8(v_1.AuxInt)
27812 v.reset(OpRsh16x64)
27813 v0 := b.NewValue0(v.Pos, OpConst64, t)
27814 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
27815 v.AddArg2(x, v0)
27816 return true
27817 }
27818
27819
27820 for {
27821 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
27822 break
27823 }
27824 v.reset(OpConst16)
27825 v.AuxInt = int16ToAuxInt(0)
27826 return true
27827 }
27828
27829
27830
27831 for {
27832 if auxIntToBool(v.AuxInt) != false {
27833 break
27834 }
27835 x := v_0
27836 con := v_1
27837 if con.Op != OpConst8 {
27838 break
27839 }
27840 c := auxIntToInt8(con.AuxInt)
27841 if !(0 < c && c < 16) {
27842 break
27843 }
27844 v.reset(OpRsh16x8)
27845 v.AuxInt = boolToAuxInt(true)
27846 v.AddArg2(x, con)
27847 return true
27848 }
27849 return false
27850 }
27851 func rewriteValuegeneric_OpRsh32Ux16(v *Value) bool {
27852 v_1 := v.Args[1]
27853 v_0 := v.Args[0]
27854 b := v.Block
27855
27856
27857 for {
27858 t := v.Type
27859 x := v_0
27860 if v_1.Op != OpConst16 {
27861 break
27862 }
27863 c := auxIntToInt16(v_1.AuxInt)
27864 v.reset(OpRsh32Ux64)
27865 v0 := b.NewValue0(v.Pos, OpConst64, t)
27866 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
27867 v.AddArg2(x, v0)
27868 return true
27869 }
27870
27871
27872 for {
27873 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
27874 break
27875 }
27876 v.reset(OpConst32)
27877 v.AuxInt = int32ToAuxInt(0)
27878 return true
27879 }
27880
27881
27882
27883 for {
27884 if auxIntToBool(v.AuxInt) != false {
27885 break
27886 }
27887 x := v_0
27888 con := v_1
27889 if con.Op != OpConst16 {
27890 break
27891 }
27892 c := auxIntToInt16(con.AuxInt)
27893 if !(0 < c && c < 32) {
27894 break
27895 }
27896 v.reset(OpRsh32Ux16)
27897 v.AuxInt = boolToAuxInt(true)
27898 v.AddArg2(x, con)
27899 return true
27900 }
27901 return false
27902 }
27903 func rewriteValuegeneric_OpRsh32Ux32(v *Value) bool {
27904 v_1 := v.Args[1]
27905 v_0 := v.Args[0]
27906 b := v.Block
27907
27908
27909 for {
27910 t := v.Type
27911 x := v_0
27912 if v_1.Op != OpConst32 {
27913 break
27914 }
27915 c := auxIntToInt32(v_1.AuxInt)
27916 v.reset(OpRsh32Ux64)
27917 v0 := b.NewValue0(v.Pos, OpConst64, t)
27918 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
27919 v.AddArg2(x, v0)
27920 return true
27921 }
27922
27923
27924 for {
27925 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
27926 break
27927 }
27928 v.reset(OpConst32)
27929 v.AuxInt = int32ToAuxInt(0)
27930 return true
27931 }
27932
27933
27934
27935 for {
27936 if auxIntToBool(v.AuxInt) != false {
27937 break
27938 }
27939 x := v_0
27940 con := v_1
27941 if con.Op != OpConst32 {
27942 break
27943 }
27944 c := auxIntToInt32(con.AuxInt)
27945 if !(0 < c && c < 32) {
27946 break
27947 }
27948 v.reset(OpRsh32Ux32)
27949 v.AuxInt = boolToAuxInt(true)
27950 v.AddArg2(x, con)
27951 return true
27952 }
27953 return false
27954 }
27955 func rewriteValuegeneric_OpRsh32Ux64(v *Value) bool {
27956 v_1 := v.Args[1]
27957 v_0 := v.Args[0]
27958 b := v.Block
27959 typ := &b.Func.Config.Types
27960
27961
27962 for {
27963 if v_0.Op != OpConst32 {
27964 break
27965 }
27966 c := auxIntToInt32(v_0.AuxInt)
27967 if v_1.Op != OpConst64 {
27968 break
27969 }
27970 d := auxIntToInt64(v_1.AuxInt)
27971 v.reset(OpConst32)
27972 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
27973 return true
27974 }
27975
27976
27977 for {
27978 x := v_0
27979 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
27980 break
27981 }
27982 v.copyOf(x)
27983 return true
27984 }
27985
27986
27987 for {
27988 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
27989 break
27990 }
27991 v.reset(OpConst32)
27992 v.AuxInt = int32ToAuxInt(0)
27993 return true
27994 }
27995
27996
27997
27998 for {
27999 if v_1.Op != OpConst64 {
28000 break
28001 }
28002 c := auxIntToInt64(v_1.AuxInt)
28003 if !(uint64(c) >= 32) {
28004 break
28005 }
28006 v.reset(OpConst32)
28007 v.AuxInt = int32ToAuxInt(0)
28008 return true
28009 }
28010
28011
28012
28013 for {
28014 t := v.Type
28015 if v_0.Op != OpRsh32Ux64 {
28016 break
28017 }
28018 _ = v_0.Args[1]
28019 x := v_0.Args[0]
28020 v_0_1 := v_0.Args[1]
28021 if v_0_1.Op != OpConst64 {
28022 break
28023 }
28024 c := auxIntToInt64(v_0_1.AuxInt)
28025 if v_1.Op != OpConst64 {
28026 break
28027 }
28028 d := auxIntToInt64(v_1.AuxInt)
28029 if !(!uaddOvf(c, d)) {
28030 break
28031 }
28032 v.reset(OpRsh32Ux64)
28033 v0 := b.NewValue0(v.Pos, OpConst64, t)
28034 v0.AuxInt = int64ToAuxInt(c + d)
28035 v.AddArg2(x, v0)
28036 return true
28037 }
28038
28039
28040 for {
28041 if v_0.Op != OpRsh32x64 {
28042 break
28043 }
28044 x := v_0.Args[0]
28045 if v_1.Op != OpConst64 {
28046 break
28047 }
28048 t := v_1.Type
28049 if auxIntToInt64(v_1.AuxInt) != 31 {
28050 break
28051 }
28052 v.reset(OpRsh32Ux64)
28053 v0 := b.NewValue0(v.Pos, OpConst64, t)
28054 v0.AuxInt = int64ToAuxInt(31)
28055 v.AddArg2(x, v0)
28056 return true
28057 }
28058
28059
28060
28061 for {
28062 i := v_0
28063 if i.Op != OpLsh32x64 {
28064 break
28065 }
28066 _ = i.Args[1]
28067 x := i.Args[0]
28068 i_1 := i.Args[1]
28069 if i_1.Op != OpConst64 {
28070 break
28071 }
28072 c := auxIntToInt64(i_1.AuxInt)
28073 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 32 && i.Uses == 1) {
28074 break
28075 }
28076 v.reset(OpAnd32)
28077 v0 := b.NewValue0(v.Pos, OpConst32, v.Type)
28078 v0.AuxInt = int32ToAuxInt(int32(^uint32(0) >> c))
28079 v.AddArg2(x, v0)
28080 return true
28081 }
28082
28083
28084
28085 for {
28086 if v_0.Op != OpLsh32x64 {
28087 break
28088 }
28089 _ = v_0.Args[1]
28090 v_0_0 := v_0.Args[0]
28091 if v_0_0.Op != OpRsh32Ux64 {
28092 break
28093 }
28094 _ = v_0_0.Args[1]
28095 x := v_0_0.Args[0]
28096 v_0_0_1 := v_0_0.Args[1]
28097 if v_0_0_1.Op != OpConst64 {
28098 break
28099 }
28100 c1 := auxIntToInt64(v_0_0_1.AuxInt)
28101 v_0_1 := v_0.Args[1]
28102 if v_0_1.Op != OpConst64 {
28103 break
28104 }
28105 c2 := auxIntToInt64(v_0_1.AuxInt)
28106 if v_1.Op != OpConst64 {
28107 break
28108 }
28109 c3 := auxIntToInt64(v_1.AuxInt)
28110 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
28111 break
28112 }
28113 v.reset(OpRsh32Ux64)
28114 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
28115 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
28116 v.AddArg2(x, v0)
28117 return true
28118 }
28119
28120
28121 for {
28122 if v_0.Op != OpLsh32x64 {
28123 break
28124 }
28125 _ = v_0.Args[1]
28126 x := v_0.Args[0]
28127 v_0_1 := v_0.Args[1]
28128 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 24 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 24 {
28129 break
28130 }
28131 v.reset(OpZeroExt8to32)
28132 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.UInt8)
28133 v0.AddArg(x)
28134 v.AddArg(v0)
28135 return true
28136 }
28137
28138
28139 for {
28140 if v_0.Op != OpLsh32x64 {
28141 break
28142 }
28143 _ = v_0.Args[1]
28144 x := v_0.Args[0]
28145 v_0_1 := v_0.Args[1]
28146 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 16 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 16 {
28147 break
28148 }
28149 v.reset(OpZeroExt16to32)
28150 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.UInt16)
28151 v0.AddArg(x)
28152 v.AddArg(v0)
28153 return true
28154 }
28155
28156
28157
28158 for {
28159 if auxIntToBool(v.AuxInt) != false {
28160 break
28161 }
28162 x := v_0
28163 con := v_1
28164 if con.Op != OpConst64 {
28165 break
28166 }
28167 c := auxIntToInt64(con.AuxInt)
28168 if !(0 < c && c < 32) {
28169 break
28170 }
28171 v.reset(OpRsh32Ux64)
28172 v.AuxInt = boolToAuxInt(true)
28173 v.AddArg2(x, con)
28174 return true
28175 }
28176 return false
28177 }
28178 func rewriteValuegeneric_OpRsh32Ux8(v *Value) bool {
28179 v_1 := v.Args[1]
28180 v_0 := v.Args[0]
28181 b := v.Block
28182
28183
28184 for {
28185 t := v.Type
28186 x := v_0
28187 if v_1.Op != OpConst8 {
28188 break
28189 }
28190 c := auxIntToInt8(v_1.AuxInt)
28191 v.reset(OpRsh32Ux64)
28192 v0 := b.NewValue0(v.Pos, OpConst64, t)
28193 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
28194 v.AddArg2(x, v0)
28195 return true
28196 }
28197
28198
28199 for {
28200 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28201 break
28202 }
28203 v.reset(OpConst32)
28204 v.AuxInt = int32ToAuxInt(0)
28205 return true
28206 }
28207
28208
28209
28210 for {
28211 if auxIntToBool(v.AuxInt) != false {
28212 break
28213 }
28214 x := v_0
28215 con := v_1
28216 if con.Op != OpConst8 {
28217 break
28218 }
28219 c := auxIntToInt8(con.AuxInt)
28220 if !(0 < c && c < 32) {
28221 break
28222 }
28223 v.reset(OpRsh32Ux8)
28224 v.AuxInt = boolToAuxInt(true)
28225 v.AddArg2(x, con)
28226 return true
28227 }
28228 return false
28229 }
28230 func rewriteValuegeneric_OpRsh32x16(v *Value) bool {
28231 v_1 := v.Args[1]
28232 v_0 := v.Args[0]
28233 b := v.Block
28234
28235
28236 for {
28237 t := v.Type
28238 x := v_0
28239 if v_1.Op != OpConst16 {
28240 break
28241 }
28242 c := auxIntToInt16(v_1.AuxInt)
28243 v.reset(OpRsh32x64)
28244 v0 := b.NewValue0(v.Pos, OpConst64, t)
28245 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28246 v.AddArg2(x, v0)
28247 return true
28248 }
28249
28250
28251 for {
28252 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28253 break
28254 }
28255 v.reset(OpConst32)
28256 v.AuxInt = int32ToAuxInt(0)
28257 return true
28258 }
28259
28260
28261
28262 for {
28263 if auxIntToBool(v.AuxInt) != false {
28264 break
28265 }
28266 x := v_0
28267 con := v_1
28268 if con.Op != OpConst16 {
28269 break
28270 }
28271 c := auxIntToInt16(con.AuxInt)
28272 if !(0 < c && c < 32) {
28273 break
28274 }
28275 v.reset(OpRsh32x16)
28276 v.AuxInt = boolToAuxInt(true)
28277 v.AddArg2(x, con)
28278 return true
28279 }
28280 return false
28281 }
28282 func rewriteValuegeneric_OpRsh32x32(v *Value) bool {
28283 v_1 := v.Args[1]
28284 v_0 := v.Args[0]
28285 b := v.Block
28286
28287
28288 for {
28289 t := v.Type
28290 x := v_0
28291 if v_1.Op != OpConst32 {
28292 break
28293 }
28294 c := auxIntToInt32(v_1.AuxInt)
28295 v.reset(OpRsh32x64)
28296 v0 := b.NewValue0(v.Pos, OpConst64, t)
28297 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
28298 v.AddArg2(x, v0)
28299 return true
28300 }
28301
28302
28303 for {
28304 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28305 break
28306 }
28307 v.reset(OpConst32)
28308 v.AuxInt = int32ToAuxInt(0)
28309 return true
28310 }
28311
28312
28313
28314 for {
28315 if auxIntToBool(v.AuxInt) != false {
28316 break
28317 }
28318 x := v_0
28319 con := v_1
28320 if con.Op != OpConst32 {
28321 break
28322 }
28323 c := auxIntToInt32(con.AuxInt)
28324 if !(0 < c && c < 32) {
28325 break
28326 }
28327 v.reset(OpRsh32x32)
28328 v.AuxInt = boolToAuxInt(true)
28329 v.AddArg2(x, con)
28330 return true
28331 }
28332 return false
28333 }
28334 func rewriteValuegeneric_OpRsh32x64(v *Value) bool {
28335 v_1 := v.Args[1]
28336 v_0 := v.Args[0]
28337 b := v.Block
28338 typ := &b.Func.Config.Types
28339
28340
28341 for {
28342 if v_0.Op != OpConst32 {
28343 break
28344 }
28345 c := auxIntToInt32(v_0.AuxInt)
28346 if v_1.Op != OpConst64 {
28347 break
28348 }
28349 d := auxIntToInt64(v_1.AuxInt)
28350 v.reset(OpConst32)
28351 v.AuxInt = int32ToAuxInt(c >> uint64(d))
28352 return true
28353 }
28354
28355
28356 for {
28357 x := v_0
28358 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
28359 break
28360 }
28361 v.copyOf(x)
28362 return true
28363 }
28364
28365
28366 for {
28367 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28368 break
28369 }
28370 v.reset(OpConst32)
28371 v.AuxInt = int32ToAuxInt(0)
28372 return true
28373 }
28374
28375
28376
28377 for {
28378 t := v.Type
28379 if v_0.Op != OpRsh32x64 {
28380 break
28381 }
28382 _ = v_0.Args[1]
28383 x := v_0.Args[0]
28384 v_0_1 := v_0.Args[1]
28385 if v_0_1.Op != OpConst64 {
28386 break
28387 }
28388 c := auxIntToInt64(v_0_1.AuxInt)
28389 if v_1.Op != OpConst64 {
28390 break
28391 }
28392 d := auxIntToInt64(v_1.AuxInt)
28393 if !(!uaddOvf(c, d)) {
28394 break
28395 }
28396 v.reset(OpRsh32x64)
28397 v0 := b.NewValue0(v.Pos, OpConst64, t)
28398 v0.AuxInt = int64ToAuxInt(c + d)
28399 v.AddArg2(x, v0)
28400 return true
28401 }
28402
28403
28404 for {
28405 if v_0.Op != OpLsh32x64 {
28406 break
28407 }
28408 _ = v_0.Args[1]
28409 x := v_0.Args[0]
28410 v_0_1 := v_0.Args[1]
28411 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 24 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 24 {
28412 break
28413 }
28414 v.reset(OpSignExt8to32)
28415 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.Int8)
28416 v0.AddArg(x)
28417 v.AddArg(v0)
28418 return true
28419 }
28420
28421
28422 for {
28423 if v_0.Op != OpLsh32x64 {
28424 break
28425 }
28426 _ = v_0.Args[1]
28427 x := v_0.Args[0]
28428 v_0_1 := v_0.Args[1]
28429 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 16 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 16 {
28430 break
28431 }
28432 v.reset(OpSignExt16to32)
28433 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.Int16)
28434 v0.AddArg(x)
28435 v.AddArg(v0)
28436 return true
28437 }
28438
28439
28440
28441 for {
28442 if auxIntToBool(v.AuxInt) != false {
28443 break
28444 }
28445 x := v_0
28446 con := v_1
28447 if con.Op != OpConst64 {
28448 break
28449 }
28450 c := auxIntToInt64(con.AuxInt)
28451 if !(0 < c && c < 32) {
28452 break
28453 }
28454 v.reset(OpRsh32x64)
28455 v.AuxInt = boolToAuxInt(true)
28456 v.AddArg2(x, con)
28457 return true
28458 }
28459 return false
28460 }
28461 func rewriteValuegeneric_OpRsh32x8(v *Value) bool {
28462 v_1 := v.Args[1]
28463 v_0 := v.Args[0]
28464 b := v.Block
28465
28466
28467 for {
28468 t := v.Type
28469 x := v_0
28470 if v_1.Op != OpConst8 {
28471 break
28472 }
28473 c := auxIntToInt8(v_1.AuxInt)
28474 v.reset(OpRsh32x64)
28475 v0 := b.NewValue0(v.Pos, OpConst64, t)
28476 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
28477 v.AddArg2(x, v0)
28478 return true
28479 }
28480
28481
28482 for {
28483 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
28484 break
28485 }
28486 v.reset(OpConst32)
28487 v.AuxInt = int32ToAuxInt(0)
28488 return true
28489 }
28490
28491
28492
28493 for {
28494 if auxIntToBool(v.AuxInt) != false {
28495 break
28496 }
28497 x := v_0
28498 con := v_1
28499 if con.Op != OpConst8 {
28500 break
28501 }
28502 c := auxIntToInt8(con.AuxInt)
28503 if !(0 < c && c < 32) {
28504 break
28505 }
28506 v.reset(OpRsh32x8)
28507 v.AuxInt = boolToAuxInt(true)
28508 v.AddArg2(x, con)
28509 return true
28510 }
28511 return false
28512 }
28513 func rewriteValuegeneric_OpRsh64Ux16(v *Value) bool {
28514 v_1 := v.Args[1]
28515 v_0 := v.Args[0]
28516 b := v.Block
28517
28518
28519 for {
28520 t := v.Type
28521 x := v_0
28522 if v_1.Op != OpConst16 {
28523 break
28524 }
28525 c := auxIntToInt16(v_1.AuxInt)
28526 v.reset(OpRsh64Ux64)
28527 v0 := b.NewValue0(v.Pos, OpConst64, t)
28528 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28529 v.AddArg2(x, v0)
28530 return true
28531 }
28532
28533
28534 for {
28535 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
28536 break
28537 }
28538 v.reset(OpConst64)
28539 v.AuxInt = int64ToAuxInt(0)
28540 return true
28541 }
28542
28543
28544
28545 for {
28546 if auxIntToBool(v.AuxInt) != false {
28547 break
28548 }
28549 x := v_0
28550 con := v_1
28551 if con.Op != OpConst16 {
28552 break
28553 }
28554 c := auxIntToInt16(con.AuxInt)
28555 if !(0 < c && c < 64) {
28556 break
28557 }
28558 v.reset(OpRsh64Ux16)
28559 v.AuxInt = boolToAuxInt(true)
28560 v.AddArg2(x, con)
28561 return true
28562 }
28563 return false
28564 }
28565 func rewriteValuegeneric_OpRsh64Ux32(v *Value) bool {
28566 v_1 := v.Args[1]
28567 v_0 := v.Args[0]
28568 b := v.Block
28569
28570
28571 for {
28572 t := v.Type
28573 x := v_0
28574 if v_1.Op != OpConst32 {
28575 break
28576 }
28577 c := auxIntToInt32(v_1.AuxInt)
28578 v.reset(OpRsh64Ux64)
28579 v0 := b.NewValue0(v.Pos, OpConst64, t)
28580 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
28581 v.AddArg2(x, v0)
28582 return true
28583 }
28584
28585
28586 for {
28587 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
28588 break
28589 }
28590 v.reset(OpConst64)
28591 v.AuxInt = int64ToAuxInt(0)
28592 return true
28593 }
28594
28595
28596
28597 for {
28598 if auxIntToBool(v.AuxInt) != false {
28599 break
28600 }
28601 x := v_0
28602 con := v_1
28603 if con.Op != OpConst32 {
28604 break
28605 }
28606 c := auxIntToInt32(con.AuxInt)
28607 if !(0 < c && c < 64) {
28608 break
28609 }
28610 v.reset(OpRsh64Ux32)
28611 v.AuxInt = boolToAuxInt(true)
28612 v.AddArg2(x, con)
28613 return true
28614 }
28615 return false
28616 }
28617 func rewriteValuegeneric_OpRsh64Ux64(v *Value) bool {
28618 v_1 := v.Args[1]
28619 v_0 := v.Args[0]
28620 b := v.Block
28621 typ := &b.Func.Config.Types
28622
28623
28624 for {
28625 if v_0.Op != OpConst64 {
28626 break
28627 }
28628 c := auxIntToInt64(v_0.AuxInt)
28629 if v_1.Op != OpConst64 {
28630 break
28631 }
28632 d := auxIntToInt64(v_1.AuxInt)
28633 v.reset(OpConst64)
28634 v.AuxInt = int64ToAuxInt(int64(uint64(c) >> uint64(d)))
28635 return true
28636 }
28637
28638
28639 for {
28640 x := v_0
28641 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
28642 break
28643 }
28644 v.copyOf(x)
28645 return true
28646 }
28647
28648
28649 for {
28650 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
28651 break
28652 }
28653 v.reset(OpConst64)
28654 v.AuxInt = int64ToAuxInt(0)
28655 return true
28656 }
28657
28658
28659
28660 for {
28661 if v_1.Op != OpConst64 {
28662 break
28663 }
28664 c := auxIntToInt64(v_1.AuxInt)
28665 if !(uint64(c) >= 64) {
28666 break
28667 }
28668 v.reset(OpConst64)
28669 v.AuxInt = int64ToAuxInt(0)
28670 return true
28671 }
28672
28673
28674
28675 for {
28676 t := v.Type
28677 if v_0.Op != OpRsh64Ux64 {
28678 break
28679 }
28680 _ = v_0.Args[1]
28681 x := v_0.Args[0]
28682 v_0_1 := v_0.Args[1]
28683 if v_0_1.Op != OpConst64 {
28684 break
28685 }
28686 c := auxIntToInt64(v_0_1.AuxInt)
28687 if v_1.Op != OpConst64 {
28688 break
28689 }
28690 d := auxIntToInt64(v_1.AuxInt)
28691 if !(!uaddOvf(c, d)) {
28692 break
28693 }
28694 v.reset(OpRsh64Ux64)
28695 v0 := b.NewValue0(v.Pos, OpConst64, t)
28696 v0.AuxInt = int64ToAuxInt(c + d)
28697 v.AddArg2(x, v0)
28698 return true
28699 }
28700
28701
28702 for {
28703 if v_0.Op != OpRsh64x64 {
28704 break
28705 }
28706 x := v_0.Args[0]
28707 if v_1.Op != OpConst64 {
28708 break
28709 }
28710 t := v_1.Type
28711 if auxIntToInt64(v_1.AuxInt) != 63 {
28712 break
28713 }
28714 v.reset(OpRsh64Ux64)
28715 v0 := b.NewValue0(v.Pos, OpConst64, t)
28716 v0.AuxInt = int64ToAuxInt(63)
28717 v.AddArg2(x, v0)
28718 return true
28719 }
28720
28721
28722
28723 for {
28724 i := v_0
28725 if i.Op != OpLsh64x64 {
28726 break
28727 }
28728 _ = i.Args[1]
28729 x := i.Args[0]
28730 i_1 := i.Args[1]
28731 if i_1.Op != OpConst64 {
28732 break
28733 }
28734 c := auxIntToInt64(i_1.AuxInt)
28735 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 64 && i.Uses == 1) {
28736 break
28737 }
28738 v.reset(OpAnd64)
28739 v0 := b.NewValue0(v.Pos, OpConst64, v.Type)
28740 v0.AuxInt = int64ToAuxInt(int64(^uint64(0) >> c))
28741 v.AddArg2(x, v0)
28742 return true
28743 }
28744
28745
28746
28747 for {
28748 if v_0.Op != OpLsh64x64 {
28749 break
28750 }
28751 _ = v_0.Args[1]
28752 v_0_0 := v_0.Args[0]
28753 if v_0_0.Op != OpRsh64Ux64 {
28754 break
28755 }
28756 _ = v_0_0.Args[1]
28757 x := v_0_0.Args[0]
28758 v_0_0_1 := v_0_0.Args[1]
28759 if v_0_0_1.Op != OpConst64 {
28760 break
28761 }
28762 c1 := auxIntToInt64(v_0_0_1.AuxInt)
28763 v_0_1 := v_0.Args[1]
28764 if v_0_1.Op != OpConst64 {
28765 break
28766 }
28767 c2 := auxIntToInt64(v_0_1.AuxInt)
28768 if v_1.Op != OpConst64 {
28769 break
28770 }
28771 c3 := auxIntToInt64(v_1.AuxInt)
28772 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
28773 break
28774 }
28775 v.reset(OpRsh64Ux64)
28776 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
28777 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
28778 v.AddArg2(x, v0)
28779 return true
28780 }
28781
28782
28783 for {
28784 if v_0.Op != OpLsh64x64 {
28785 break
28786 }
28787 _ = v_0.Args[1]
28788 x := v_0.Args[0]
28789 v_0_1 := v_0.Args[1]
28790 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 56 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 56 {
28791 break
28792 }
28793 v.reset(OpZeroExt8to64)
28794 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.UInt8)
28795 v0.AddArg(x)
28796 v.AddArg(v0)
28797 return true
28798 }
28799
28800
28801 for {
28802 if v_0.Op != OpLsh64x64 {
28803 break
28804 }
28805 _ = v_0.Args[1]
28806 x := v_0.Args[0]
28807 v_0_1 := v_0.Args[1]
28808 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 48 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 48 {
28809 break
28810 }
28811 v.reset(OpZeroExt16to64)
28812 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.UInt16)
28813 v0.AddArg(x)
28814 v.AddArg(v0)
28815 return true
28816 }
28817
28818
28819 for {
28820 if v_0.Op != OpLsh64x64 {
28821 break
28822 }
28823 _ = v_0.Args[1]
28824 x := v_0.Args[0]
28825 v_0_1 := v_0.Args[1]
28826 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 32 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 32 {
28827 break
28828 }
28829 v.reset(OpZeroExt32to64)
28830 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.UInt32)
28831 v0.AddArg(x)
28832 v.AddArg(v0)
28833 return true
28834 }
28835
28836
28837
28838 for {
28839 if auxIntToBool(v.AuxInt) != false {
28840 break
28841 }
28842 x := v_0
28843 con := v_1
28844 if con.Op != OpConst64 {
28845 break
28846 }
28847 c := auxIntToInt64(con.AuxInt)
28848 if !(0 < c && c < 64) {
28849 break
28850 }
28851 v.reset(OpRsh64Ux64)
28852 v.AuxInt = boolToAuxInt(true)
28853 v.AddArg2(x, con)
28854 return true
28855 }
28856 return false
28857 }
28858 func rewriteValuegeneric_OpRsh64Ux8(v *Value) bool {
28859 v_1 := v.Args[1]
28860 v_0 := v.Args[0]
28861 b := v.Block
28862
28863
28864 for {
28865 t := v.Type
28866 x := v_0
28867 if v_1.Op != OpConst8 {
28868 break
28869 }
28870 c := auxIntToInt8(v_1.AuxInt)
28871 v.reset(OpRsh64Ux64)
28872 v0 := b.NewValue0(v.Pos, OpConst64, t)
28873 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
28874 v.AddArg2(x, v0)
28875 return true
28876 }
28877
28878
28879 for {
28880 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
28881 break
28882 }
28883 v.reset(OpConst64)
28884 v.AuxInt = int64ToAuxInt(0)
28885 return true
28886 }
28887
28888
28889
28890 for {
28891 if auxIntToBool(v.AuxInt) != false {
28892 break
28893 }
28894 x := v_0
28895 con := v_1
28896 if con.Op != OpConst8 {
28897 break
28898 }
28899 c := auxIntToInt8(con.AuxInt)
28900 if !(0 < c && c < 64) {
28901 break
28902 }
28903 v.reset(OpRsh64Ux8)
28904 v.AuxInt = boolToAuxInt(true)
28905 v.AddArg2(x, con)
28906 return true
28907 }
28908 return false
28909 }
28910 func rewriteValuegeneric_OpRsh64x16(v *Value) bool {
28911 v_1 := v.Args[1]
28912 v_0 := v.Args[0]
28913 b := v.Block
28914
28915
28916 for {
28917 t := v.Type
28918 x := v_0
28919 if v_1.Op != OpConst16 {
28920 break
28921 }
28922 c := auxIntToInt16(v_1.AuxInt)
28923 v.reset(OpRsh64x64)
28924 v0 := b.NewValue0(v.Pos, OpConst64, t)
28925 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
28926 v.AddArg2(x, v0)
28927 return true
28928 }
28929
28930
28931 for {
28932 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
28933 break
28934 }
28935 v.reset(OpConst64)
28936 v.AuxInt = int64ToAuxInt(0)
28937 return true
28938 }
28939
28940
28941
28942 for {
28943 if auxIntToBool(v.AuxInt) != false {
28944 break
28945 }
28946 x := v_0
28947 con := v_1
28948 if con.Op != OpConst16 {
28949 break
28950 }
28951 c := auxIntToInt16(con.AuxInt)
28952 if !(0 < c && c < 64) {
28953 break
28954 }
28955 v.reset(OpRsh64x16)
28956 v.AuxInt = boolToAuxInt(true)
28957 v.AddArg2(x, con)
28958 return true
28959 }
28960 return false
28961 }
28962 func rewriteValuegeneric_OpRsh64x32(v *Value) bool {
28963 v_1 := v.Args[1]
28964 v_0 := v.Args[0]
28965 b := v.Block
28966
28967
28968 for {
28969 t := v.Type
28970 x := v_0
28971 if v_1.Op != OpConst32 {
28972 break
28973 }
28974 c := auxIntToInt32(v_1.AuxInt)
28975 v.reset(OpRsh64x64)
28976 v0 := b.NewValue0(v.Pos, OpConst64, t)
28977 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
28978 v.AddArg2(x, v0)
28979 return true
28980 }
28981
28982
28983 for {
28984 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
28985 break
28986 }
28987 v.reset(OpConst64)
28988 v.AuxInt = int64ToAuxInt(0)
28989 return true
28990 }
28991
28992
28993
28994 for {
28995 if auxIntToBool(v.AuxInt) != false {
28996 break
28997 }
28998 x := v_0
28999 con := v_1
29000 if con.Op != OpConst32 {
29001 break
29002 }
29003 c := auxIntToInt32(con.AuxInt)
29004 if !(0 < c && c < 64) {
29005 break
29006 }
29007 v.reset(OpRsh64x32)
29008 v.AuxInt = boolToAuxInt(true)
29009 v.AddArg2(x, con)
29010 return true
29011 }
29012 return false
29013 }
29014 func rewriteValuegeneric_OpRsh64x64(v *Value) bool {
29015 v_1 := v.Args[1]
29016 v_0 := v.Args[0]
29017 b := v.Block
29018 typ := &b.Func.Config.Types
29019
29020
29021 for {
29022 if v_0.Op != OpConst64 {
29023 break
29024 }
29025 c := auxIntToInt64(v_0.AuxInt)
29026 if v_1.Op != OpConst64 {
29027 break
29028 }
29029 d := auxIntToInt64(v_1.AuxInt)
29030 v.reset(OpConst64)
29031 v.AuxInt = int64ToAuxInt(c >> uint64(d))
29032 return true
29033 }
29034
29035
29036 for {
29037 x := v_0
29038 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
29039 break
29040 }
29041 v.copyOf(x)
29042 return true
29043 }
29044
29045
29046 for {
29047 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29048 break
29049 }
29050 v.reset(OpConst64)
29051 v.AuxInt = int64ToAuxInt(0)
29052 return true
29053 }
29054
29055
29056
29057 for {
29058 t := v.Type
29059 if v_0.Op != OpRsh64x64 {
29060 break
29061 }
29062 _ = v_0.Args[1]
29063 x := v_0.Args[0]
29064 v_0_1 := v_0.Args[1]
29065 if v_0_1.Op != OpConst64 {
29066 break
29067 }
29068 c := auxIntToInt64(v_0_1.AuxInt)
29069 if v_1.Op != OpConst64 {
29070 break
29071 }
29072 d := auxIntToInt64(v_1.AuxInt)
29073 if !(!uaddOvf(c, d)) {
29074 break
29075 }
29076 v.reset(OpRsh64x64)
29077 v0 := b.NewValue0(v.Pos, OpConst64, t)
29078 v0.AuxInt = int64ToAuxInt(c + d)
29079 v.AddArg2(x, v0)
29080 return true
29081 }
29082
29083
29084 for {
29085 if v_0.Op != OpLsh64x64 {
29086 break
29087 }
29088 _ = v_0.Args[1]
29089 x := v_0.Args[0]
29090 v_0_1 := v_0.Args[1]
29091 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 56 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 56 {
29092 break
29093 }
29094 v.reset(OpSignExt8to64)
29095 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.Int8)
29096 v0.AddArg(x)
29097 v.AddArg(v0)
29098 return true
29099 }
29100
29101
29102 for {
29103 if v_0.Op != OpLsh64x64 {
29104 break
29105 }
29106 _ = v_0.Args[1]
29107 x := v_0.Args[0]
29108 v_0_1 := v_0.Args[1]
29109 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 48 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 48 {
29110 break
29111 }
29112 v.reset(OpSignExt16to64)
29113 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.Int16)
29114 v0.AddArg(x)
29115 v.AddArg(v0)
29116 return true
29117 }
29118
29119
29120 for {
29121 if v_0.Op != OpLsh64x64 {
29122 break
29123 }
29124 _ = v_0.Args[1]
29125 x := v_0.Args[0]
29126 v_0_1 := v_0.Args[1]
29127 if v_0_1.Op != OpConst64 || auxIntToInt64(v_0_1.AuxInt) != 32 || v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 32 {
29128 break
29129 }
29130 v.reset(OpSignExt32to64)
29131 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.Int32)
29132 v0.AddArg(x)
29133 v.AddArg(v0)
29134 return true
29135 }
29136
29137
29138
29139 for {
29140 if auxIntToBool(v.AuxInt) != false {
29141 break
29142 }
29143 x := v_0
29144 con := v_1
29145 if con.Op != OpConst64 {
29146 break
29147 }
29148 c := auxIntToInt64(con.AuxInt)
29149 if !(0 < c && c < 64) {
29150 break
29151 }
29152 v.reset(OpRsh64x64)
29153 v.AuxInt = boolToAuxInt(true)
29154 v.AddArg2(x, con)
29155 return true
29156 }
29157 return false
29158 }
29159 func rewriteValuegeneric_OpRsh64x8(v *Value) bool {
29160 v_1 := v.Args[1]
29161 v_0 := v.Args[0]
29162 b := v.Block
29163
29164
29165 for {
29166 t := v.Type
29167 x := v_0
29168 if v_1.Op != OpConst8 {
29169 break
29170 }
29171 c := auxIntToInt8(v_1.AuxInt)
29172 v.reset(OpRsh64x64)
29173 v0 := b.NewValue0(v.Pos, OpConst64, t)
29174 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
29175 v.AddArg2(x, v0)
29176 return true
29177 }
29178
29179
29180 for {
29181 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
29182 break
29183 }
29184 v.reset(OpConst64)
29185 v.AuxInt = int64ToAuxInt(0)
29186 return true
29187 }
29188
29189
29190
29191 for {
29192 if auxIntToBool(v.AuxInt) != false {
29193 break
29194 }
29195 x := v_0
29196 con := v_1
29197 if con.Op != OpConst8 {
29198 break
29199 }
29200 c := auxIntToInt8(con.AuxInt)
29201 if !(0 < c && c < 64) {
29202 break
29203 }
29204 v.reset(OpRsh64x8)
29205 v.AuxInt = boolToAuxInt(true)
29206 v.AddArg2(x, con)
29207 return true
29208 }
29209 return false
29210 }
29211 func rewriteValuegeneric_OpRsh8Ux16(v *Value) bool {
29212 v_1 := v.Args[1]
29213 v_0 := v.Args[0]
29214 b := v.Block
29215
29216
29217 for {
29218 t := v.Type
29219 x := v_0
29220 if v_1.Op != OpConst16 {
29221 break
29222 }
29223 c := auxIntToInt16(v_1.AuxInt)
29224 v.reset(OpRsh8Ux64)
29225 v0 := b.NewValue0(v.Pos, OpConst64, t)
29226 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
29227 v.AddArg2(x, v0)
29228 return true
29229 }
29230
29231
29232 for {
29233 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29234 break
29235 }
29236 v.reset(OpConst8)
29237 v.AuxInt = int8ToAuxInt(0)
29238 return true
29239 }
29240
29241
29242
29243 for {
29244 if auxIntToBool(v.AuxInt) != false {
29245 break
29246 }
29247 x := v_0
29248 con := v_1
29249 if con.Op != OpConst16 {
29250 break
29251 }
29252 c := auxIntToInt16(con.AuxInt)
29253 if !(0 < c && c < 8) {
29254 break
29255 }
29256 v.reset(OpRsh8Ux16)
29257 v.AuxInt = boolToAuxInt(true)
29258 v.AddArg2(x, con)
29259 return true
29260 }
29261 return false
29262 }
29263 func rewriteValuegeneric_OpRsh8Ux32(v *Value) bool {
29264 v_1 := v.Args[1]
29265 v_0 := v.Args[0]
29266 b := v.Block
29267
29268
29269 for {
29270 t := v.Type
29271 x := v_0
29272 if v_1.Op != OpConst32 {
29273 break
29274 }
29275 c := auxIntToInt32(v_1.AuxInt)
29276 v.reset(OpRsh8Ux64)
29277 v0 := b.NewValue0(v.Pos, OpConst64, t)
29278 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
29279 v.AddArg2(x, v0)
29280 return true
29281 }
29282
29283
29284 for {
29285 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29286 break
29287 }
29288 v.reset(OpConst8)
29289 v.AuxInt = int8ToAuxInt(0)
29290 return true
29291 }
29292
29293
29294
29295 for {
29296 if auxIntToBool(v.AuxInt) != false {
29297 break
29298 }
29299 x := v_0
29300 con := v_1
29301 if con.Op != OpConst32 {
29302 break
29303 }
29304 c := auxIntToInt32(con.AuxInt)
29305 if !(0 < c && c < 8) {
29306 break
29307 }
29308 v.reset(OpRsh8Ux32)
29309 v.AuxInt = boolToAuxInt(true)
29310 v.AddArg2(x, con)
29311 return true
29312 }
29313 return false
29314 }
29315 func rewriteValuegeneric_OpRsh8Ux64(v *Value) bool {
29316 v_1 := v.Args[1]
29317 v_0 := v.Args[0]
29318 b := v.Block
29319 typ := &b.Func.Config.Types
29320
29321
29322 for {
29323 if v_0.Op != OpConst8 {
29324 break
29325 }
29326 c := auxIntToInt8(v_0.AuxInt)
29327 if v_1.Op != OpConst64 {
29328 break
29329 }
29330 d := auxIntToInt64(v_1.AuxInt)
29331 v.reset(OpConst8)
29332 v.AuxInt = int8ToAuxInt(int8(uint8(c) >> uint64(d)))
29333 return true
29334 }
29335
29336
29337 for {
29338 x := v_0
29339 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
29340 break
29341 }
29342 v.copyOf(x)
29343 return true
29344 }
29345
29346
29347 for {
29348 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29349 break
29350 }
29351 v.reset(OpConst8)
29352 v.AuxInt = int8ToAuxInt(0)
29353 return true
29354 }
29355
29356
29357
29358 for {
29359 if v_1.Op != OpConst64 {
29360 break
29361 }
29362 c := auxIntToInt64(v_1.AuxInt)
29363 if !(uint64(c) >= 8) {
29364 break
29365 }
29366 v.reset(OpConst8)
29367 v.AuxInt = int8ToAuxInt(0)
29368 return true
29369 }
29370
29371
29372
29373 for {
29374 t := v.Type
29375 if v_0.Op != OpRsh8Ux64 {
29376 break
29377 }
29378 _ = v_0.Args[1]
29379 x := v_0.Args[0]
29380 v_0_1 := v_0.Args[1]
29381 if v_0_1.Op != OpConst64 {
29382 break
29383 }
29384 c := auxIntToInt64(v_0_1.AuxInt)
29385 if v_1.Op != OpConst64 {
29386 break
29387 }
29388 d := auxIntToInt64(v_1.AuxInt)
29389 if !(!uaddOvf(c, d)) {
29390 break
29391 }
29392 v.reset(OpRsh8Ux64)
29393 v0 := b.NewValue0(v.Pos, OpConst64, t)
29394 v0.AuxInt = int64ToAuxInt(c + d)
29395 v.AddArg2(x, v0)
29396 return true
29397 }
29398
29399
29400 for {
29401 if v_0.Op != OpRsh8x64 {
29402 break
29403 }
29404 x := v_0.Args[0]
29405 if v_1.Op != OpConst64 {
29406 break
29407 }
29408 t := v_1.Type
29409 if auxIntToInt64(v_1.AuxInt) != 7 {
29410 break
29411 }
29412 v.reset(OpRsh8Ux64)
29413 v0 := b.NewValue0(v.Pos, OpConst64, t)
29414 v0.AuxInt = int64ToAuxInt(7)
29415 v.AddArg2(x, v0)
29416 return true
29417 }
29418
29419
29420
29421 for {
29422 i := v_0
29423 if i.Op != OpLsh8x64 {
29424 break
29425 }
29426 _ = i.Args[1]
29427 x := i.Args[0]
29428 i_1 := i.Args[1]
29429 if i_1.Op != OpConst64 {
29430 break
29431 }
29432 c := auxIntToInt64(i_1.AuxInt)
29433 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != c || !(c >= 0 && c < 8 && i.Uses == 1) {
29434 break
29435 }
29436 v.reset(OpAnd8)
29437 v0 := b.NewValue0(v.Pos, OpConst8, v.Type)
29438 v0.AuxInt = int8ToAuxInt(int8(^uint8(0) >> c))
29439 v.AddArg2(x, v0)
29440 return true
29441 }
29442
29443
29444
29445 for {
29446 if v_0.Op != OpLsh8x64 {
29447 break
29448 }
29449 _ = v_0.Args[1]
29450 v_0_0 := v_0.Args[0]
29451 if v_0_0.Op != OpRsh8Ux64 {
29452 break
29453 }
29454 _ = v_0_0.Args[1]
29455 x := v_0_0.Args[0]
29456 v_0_0_1 := v_0_0.Args[1]
29457 if v_0_0_1.Op != OpConst64 {
29458 break
29459 }
29460 c1 := auxIntToInt64(v_0_0_1.AuxInt)
29461 v_0_1 := v_0.Args[1]
29462 if v_0_1.Op != OpConst64 {
29463 break
29464 }
29465 c2 := auxIntToInt64(v_0_1.AuxInt)
29466 if v_1.Op != OpConst64 {
29467 break
29468 }
29469 c3 := auxIntToInt64(v_1.AuxInt)
29470 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) {
29471 break
29472 }
29473 v.reset(OpRsh8Ux64)
29474 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64)
29475 v0.AuxInt = int64ToAuxInt(c1 - c2 + c3)
29476 v.AddArg2(x, v0)
29477 return true
29478 }
29479
29480
29481
29482 for {
29483 if auxIntToBool(v.AuxInt) != false {
29484 break
29485 }
29486 x := v_0
29487 con := v_1
29488 if con.Op != OpConst64 {
29489 break
29490 }
29491 c := auxIntToInt64(con.AuxInt)
29492 if !(0 < c && c < 8) {
29493 break
29494 }
29495 v.reset(OpRsh8Ux64)
29496 v.AuxInt = boolToAuxInt(true)
29497 v.AddArg2(x, con)
29498 return true
29499 }
29500 return false
29501 }
29502 func rewriteValuegeneric_OpRsh8Ux8(v *Value) bool {
29503 v_1 := v.Args[1]
29504 v_0 := v.Args[0]
29505 b := v.Block
29506
29507
29508 for {
29509 t := v.Type
29510 x := v_0
29511 if v_1.Op != OpConst8 {
29512 break
29513 }
29514 c := auxIntToInt8(v_1.AuxInt)
29515 v.reset(OpRsh8Ux64)
29516 v0 := b.NewValue0(v.Pos, OpConst64, t)
29517 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
29518 v.AddArg2(x, v0)
29519 return true
29520 }
29521
29522
29523 for {
29524 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29525 break
29526 }
29527 v.reset(OpConst8)
29528 v.AuxInt = int8ToAuxInt(0)
29529 return true
29530 }
29531
29532
29533
29534 for {
29535 if auxIntToBool(v.AuxInt) != false {
29536 break
29537 }
29538 x := v_0
29539 con := v_1
29540 if con.Op != OpConst8 {
29541 break
29542 }
29543 c := auxIntToInt8(con.AuxInt)
29544 if !(0 < c && c < 8) {
29545 break
29546 }
29547 v.reset(OpRsh8Ux8)
29548 v.AuxInt = boolToAuxInt(true)
29549 v.AddArg2(x, con)
29550 return true
29551 }
29552 return false
29553 }
29554 func rewriteValuegeneric_OpRsh8x16(v *Value) bool {
29555 v_1 := v.Args[1]
29556 v_0 := v.Args[0]
29557 b := v.Block
29558
29559
29560 for {
29561 t := v.Type
29562 x := v_0
29563 if v_1.Op != OpConst16 {
29564 break
29565 }
29566 c := auxIntToInt16(v_1.AuxInt)
29567 v.reset(OpRsh8x64)
29568 v0 := b.NewValue0(v.Pos, OpConst64, t)
29569 v0.AuxInt = int64ToAuxInt(int64(uint16(c)))
29570 v.AddArg2(x, v0)
29571 return true
29572 }
29573
29574
29575 for {
29576 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29577 break
29578 }
29579 v.reset(OpConst8)
29580 v.AuxInt = int8ToAuxInt(0)
29581 return true
29582 }
29583
29584
29585
29586 for {
29587 if auxIntToBool(v.AuxInt) != false {
29588 break
29589 }
29590 x := v_0
29591 con := v_1
29592 if con.Op != OpConst16 {
29593 break
29594 }
29595 c := auxIntToInt16(con.AuxInt)
29596 if !(0 < c && c < 8) {
29597 break
29598 }
29599 v.reset(OpRsh8x16)
29600 v.AuxInt = boolToAuxInt(true)
29601 v.AddArg2(x, con)
29602 return true
29603 }
29604 return false
29605 }
29606 func rewriteValuegeneric_OpRsh8x32(v *Value) bool {
29607 v_1 := v.Args[1]
29608 v_0 := v.Args[0]
29609 b := v.Block
29610
29611
29612 for {
29613 t := v.Type
29614 x := v_0
29615 if v_1.Op != OpConst32 {
29616 break
29617 }
29618 c := auxIntToInt32(v_1.AuxInt)
29619 v.reset(OpRsh8x64)
29620 v0 := b.NewValue0(v.Pos, OpConst64, t)
29621 v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
29622 v.AddArg2(x, v0)
29623 return true
29624 }
29625
29626
29627 for {
29628 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29629 break
29630 }
29631 v.reset(OpConst8)
29632 v.AuxInt = int8ToAuxInt(0)
29633 return true
29634 }
29635
29636
29637
29638 for {
29639 if auxIntToBool(v.AuxInt) != false {
29640 break
29641 }
29642 x := v_0
29643 con := v_1
29644 if con.Op != OpConst32 {
29645 break
29646 }
29647 c := auxIntToInt32(con.AuxInt)
29648 if !(0 < c && c < 8) {
29649 break
29650 }
29651 v.reset(OpRsh8x32)
29652 v.AuxInt = boolToAuxInt(true)
29653 v.AddArg2(x, con)
29654 return true
29655 }
29656 return false
29657 }
29658 func rewriteValuegeneric_OpRsh8x64(v *Value) bool {
29659 v_1 := v.Args[1]
29660 v_0 := v.Args[0]
29661 b := v.Block
29662
29663
29664 for {
29665 if v_0.Op != OpConst8 {
29666 break
29667 }
29668 c := auxIntToInt8(v_0.AuxInt)
29669 if v_1.Op != OpConst64 {
29670 break
29671 }
29672 d := auxIntToInt64(v_1.AuxInt)
29673 v.reset(OpConst8)
29674 v.AuxInt = int8ToAuxInt(c >> uint64(d))
29675 return true
29676 }
29677
29678
29679 for {
29680 x := v_0
29681 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
29682 break
29683 }
29684 v.copyOf(x)
29685 return true
29686 }
29687
29688
29689 for {
29690 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29691 break
29692 }
29693 v.reset(OpConst8)
29694 v.AuxInt = int8ToAuxInt(0)
29695 return true
29696 }
29697
29698
29699
29700 for {
29701 t := v.Type
29702 if v_0.Op != OpRsh8x64 {
29703 break
29704 }
29705 _ = v_0.Args[1]
29706 x := v_0.Args[0]
29707 v_0_1 := v_0.Args[1]
29708 if v_0_1.Op != OpConst64 {
29709 break
29710 }
29711 c := auxIntToInt64(v_0_1.AuxInt)
29712 if v_1.Op != OpConst64 {
29713 break
29714 }
29715 d := auxIntToInt64(v_1.AuxInt)
29716 if !(!uaddOvf(c, d)) {
29717 break
29718 }
29719 v.reset(OpRsh8x64)
29720 v0 := b.NewValue0(v.Pos, OpConst64, t)
29721 v0.AuxInt = int64ToAuxInt(c + d)
29722 v.AddArg2(x, v0)
29723 return true
29724 }
29725
29726
29727
29728 for {
29729 if auxIntToBool(v.AuxInt) != false {
29730 break
29731 }
29732 x := v_0
29733 con := v_1
29734 if con.Op != OpConst64 {
29735 break
29736 }
29737 c := auxIntToInt64(con.AuxInt)
29738 if !(0 < c && c < 8) {
29739 break
29740 }
29741 v.reset(OpRsh8x64)
29742 v.AuxInt = boolToAuxInt(true)
29743 v.AddArg2(x, con)
29744 return true
29745 }
29746 return false
29747 }
29748 func rewriteValuegeneric_OpRsh8x8(v *Value) bool {
29749 v_1 := v.Args[1]
29750 v_0 := v.Args[0]
29751 b := v.Block
29752
29753
29754 for {
29755 t := v.Type
29756 x := v_0
29757 if v_1.Op != OpConst8 {
29758 break
29759 }
29760 c := auxIntToInt8(v_1.AuxInt)
29761 v.reset(OpRsh8x64)
29762 v0 := b.NewValue0(v.Pos, OpConst64, t)
29763 v0.AuxInt = int64ToAuxInt(int64(uint8(c)))
29764 v.AddArg2(x, v0)
29765 return true
29766 }
29767
29768
29769 for {
29770 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
29771 break
29772 }
29773 v.reset(OpConst8)
29774 v.AuxInt = int8ToAuxInt(0)
29775 return true
29776 }
29777
29778
29779
29780 for {
29781 if auxIntToBool(v.AuxInt) != false {
29782 break
29783 }
29784 x := v_0
29785 con := v_1
29786 if con.Op != OpConst8 {
29787 break
29788 }
29789 c := auxIntToInt8(con.AuxInt)
29790 if !(0 < c && c < 8) {
29791 break
29792 }
29793 v.reset(OpRsh8x8)
29794 v.AuxInt = boolToAuxInt(true)
29795 v.AddArg2(x, con)
29796 return true
29797 }
29798 return false
29799 }
29800 func rewriteValuegeneric_OpSelect0(v *Value) bool {
29801 v_0 := v.Args[0]
29802
29803
29804
29805 for {
29806 a := v_0
29807 if a.Op != OpAdd64carry {
29808 break
29809 }
29810 _ = a.Args[2]
29811 x := a.Args[0]
29812 y := a.Args[1]
29813 a_2 := a.Args[2]
29814 if a_2.Op != OpConst64 || auxIntToInt64(a_2.AuxInt) != 0 || !(a.Uses == 1) {
29815 break
29816 }
29817 v.reset(OpAdd64)
29818 v.AddArg2(x, y)
29819 return true
29820 }
29821
29822
29823 for {
29824 if v_0.Op != OpMakeTuple {
29825 break
29826 }
29827 x := v_0.Args[0]
29828 v.copyOf(x)
29829 return true
29830 }
29831 return false
29832 }
29833 func rewriteValuegeneric_OpSelect1(v *Value) bool {
29834 v_0 := v.Args[0]
29835
29836
29837 for {
29838 if v_0.Op != OpMakeTuple {
29839 break
29840 }
29841 y := v_0.Args[1]
29842 v.copyOf(y)
29843 return true
29844 }
29845 return false
29846 }
29847 func rewriteValuegeneric_OpSelectN(v *Value) bool {
29848 v_0 := v.Args[0]
29849 b := v.Block
29850 config := b.Func.Config
29851 typ := &b.Func.Config.Types
29852
29853
29854 for {
29855 n := auxIntToInt64(v.AuxInt)
29856 m := v_0
29857 if m.Op != OpMakeResult {
29858 break
29859 }
29860 v.copyOf(m.Args[n])
29861 return true
29862 }
29863
29864
29865
29866 for {
29867 if auxIntToInt64(v.AuxInt) != 0 {
29868 break
29869 }
29870 call := v_0
29871 if call.Op != OpStaticCall || len(call.Args) != 3 {
29872 break
29873 }
29874 sym := auxToCall(call.Aux)
29875 mem := call.Args[2]
29876 sptr := call.Args[0]
29877 call_1 := call.Args[1]
29878 if call_1.Op != OpConst64 {
29879 break
29880 }
29881 c := auxIntToInt64(call_1.AuxInt)
29882 if !(isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)) {
29883 break
29884 }
29885 v.reset(OpZero)
29886 v.AuxInt = int64ToAuxInt(int64(c))
29887 v.Aux = typeToAux(types.Types[types.TUINT8])
29888 v.AddArg2(sptr, mem)
29889 return true
29890 }
29891
29892
29893
29894 for {
29895 if auxIntToInt64(v.AuxInt) != 0 {
29896 break
29897 }
29898 call := v_0
29899 if call.Op != OpStaticCall || len(call.Args) != 3 {
29900 break
29901 }
29902 sym := auxToCall(call.Aux)
29903 mem := call.Args[2]
29904 sptr := call.Args[0]
29905 call_1 := call.Args[1]
29906 if call_1.Op != OpConst32 {
29907 break
29908 }
29909 c := auxIntToInt32(call_1.AuxInt)
29910 if !(isInlinableMemclr(config, int64(c)) && isSameCall(sym, "runtime.memclrNoHeapPointers") && call.Uses == 1 && clobber(call)) {
29911 break
29912 }
29913 v.reset(OpZero)
29914 v.AuxInt = int64ToAuxInt(int64(c))
29915 v.Aux = typeToAux(types.Types[types.TUINT8])
29916 v.AddArg2(sptr, mem)
29917 return true
29918 }
29919
29920
29921
29922 for {
29923 if auxIntToInt64(v.AuxInt) != 0 {
29924 break
29925 }
29926 call := v_0
29927 if call.Op != OpStaticCall || len(call.Args) != 1 {
29928 break
29929 }
29930 sym := auxToCall(call.Aux)
29931 s1 := call.Args[0]
29932 if s1.Op != OpStore {
29933 break
29934 }
29935 _ = s1.Args[2]
29936 s1_1 := s1.Args[1]
29937 if s1_1.Op != OpConst64 {
29938 break
29939 }
29940 sz := auxIntToInt64(s1_1.AuxInt)
29941 s2 := s1.Args[2]
29942 if s2.Op != OpStore {
29943 break
29944 }
29945 _ = s2.Args[2]
29946 src := s2.Args[1]
29947 s3 := s2.Args[2]
29948 if s3.Op != OpStore {
29949 break
29950 }
29951 mem := s3.Args[2]
29952 dst := s3.Args[1]
29953 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)) {
29954 break
29955 }
29956 v.reset(OpMove)
29957 v.AuxInt = int64ToAuxInt(int64(sz))
29958 v.Aux = typeToAux(types.Types[types.TUINT8])
29959 v.AddArg3(dst, src, mem)
29960 return true
29961 }
29962
29963
29964
29965 for {
29966 if auxIntToInt64(v.AuxInt) != 0 {
29967 break
29968 }
29969 call := v_0
29970 if call.Op != OpStaticCall || len(call.Args) != 1 {
29971 break
29972 }
29973 sym := auxToCall(call.Aux)
29974 s1 := call.Args[0]
29975 if s1.Op != OpStore {
29976 break
29977 }
29978 _ = s1.Args[2]
29979 s1_1 := s1.Args[1]
29980 if s1_1.Op != OpConst32 {
29981 break
29982 }
29983 sz := auxIntToInt32(s1_1.AuxInt)
29984 s2 := s1.Args[2]
29985 if s2.Op != OpStore {
29986 break
29987 }
29988 _ = s2.Args[2]
29989 src := s2.Args[1]
29990 s3 := s2.Args[2]
29991 if s3.Op != OpStore {
29992 break
29993 }
29994 mem := s3.Args[2]
29995 dst := s3.Args[1]
29996 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)) {
29997 break
29998 }
29999 v.reset(OpMove)
30000 v.AuxInt = int64ToAuxInt(int64(sz))
30001 v.Aux = typeToAux(types.Types[types.TUINT8])
30002 v.AddArg3(dst, src, mem)
30003 return true
30004 }
30005
30006
30007
30008 for {
30009 if auxIntToInt64(v.AuxInt) != 0 {
30010 break
30011 }
30012 call := v_0
30013 if call.Op != OpStaticCall || len(call.Args) != 4 {
30014 break
30015 }
30016 sym := auxToCall(call.Aux)
30017 mem := call.Args[3]
30018 dst := call.Args[0]
30019 src := call.Args[1]
30020 call_2 := call.Args[2]
30021 if call_2.Op != OpConst64 {
30022 break
30023 }
30024 sz := auxIntToInt64(call_2.AuxInt)
30025 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
30026 break
30027 }
30028 v.reset(OpMove)
30029 v.AuxInt = int64ToAuxInt(int64(sz))
30030 v.Aux = typeToAux(types.Types[types.TUINT8])
30031 v.AddArg3(dst, src, mem)
30032 return true
30033 }
30034
30035
30036
30037 for {
30038 if auxIntToInt64(v.AuxInt) != 0 {
30039 break
30040 }
30041 call := v_0
30042 if call.Op != OpStaticCall || len(call.Args) != 4 {
30043 break
30044 }
30045 sym := auxToCall(call.Aux)
30046 mem := call.Args[3]
30047 dst := call.Args[0]
30048 src := call.Args[1]
30049 call_2 := call.Args[2]
30050 if call_2.Op != OpConst32 {
30051 break
30052 }
30053 sz := auxIntToInt32(call_2.AuxInt)
30054 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
30055 break
30056 }
30057 v.reset(OpMove)
30058 v.AuxInt = int64ToAuxInt(int64(sz))
30059 v.Aux = typeToAux(types.Types[types.TUINT8])
30060 v.AddArg3(dst, src, mem)
30061 return true
30062 }
30063
30064
30065
30066 for {
30067 if auxIntToInt64(v.AuxInt) != 0 {
30068 break
30069 }
30070 call := v_0
30071 if call.Op != OpStaticLECall || len(call.Args) != 4 {
30072 break
30073 }
30074 sym := auxToCall(call.Aux)
30075 mem := call.Args[3]
30076 dst := call.Args[0]
30077 src := call.Args[1]
30078 call_2 := call.Args[2]
30079 if call_2.Op != OpConst64 {
30080 break
30081 }
30082 sz := auxIntToInt64(call_2.AuxInt)
30083 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
30084 break
30085 }
30086 v.reset(OpMove)
30087 v.AuxInt = int64ToAuxInt(int64(sz))
30088 v.Aux = typeToAux(types.Types[types.TUINT8])
30089 v.AddArg3(dst, src, mem)
30090 return true
30091 }
30092
30093
30094
30095 for {
30096 if auxIntToInt64(v.AuxInt) != 0 {
30097 break
30098 }
30099 call := v_0
30100 if call.Op != OpStaticLECall || len(call.Args) != 4 {
30101 break
30102 }
30103 sym := auxToCall(call.Aux)
30104 mem := call.Args[3]
30105 dst := call.Args[0]
30106 src := call.Args[1]
30107 call_2 := call.Args[2]
30108 if call_2.Op != OpConst32 {
30109 break
30110 }
30111 sz := auxIntToInt32(call_2.AuxInt)
30112 if !(sz >= 0 && call.Uses == 1 && isSameCall(sym, "runtime.memmove") && isInlinableMemmove(dst, src, int64(sz), config) && clobber(call)) {
30113 break
30114 }
30115 v.reset(OpMove)
30116 v.AuxInt = int64ToAuxInt(int64(sz))
30117 v.Aux = typeToAux(types.Types[types.TUINT8])
30118 v.AddArg3(dst, src, mem)
30119 return true
30120 }
30121
30122
30123
30124 for {
30125 if auxIntToInt64(v.AuxInt) != 0 {
30126 break
30127 }
30128 call := v_0
30129 if call.Op != OpStaticLECall || len(call.Args) != 2 {
30130 break
30131 }
30132 sym := auxToCall(call.Aux)
30133 x := call.Args[1]
30134 if !(needRaceCleanup(sym, call) && clobber(call)) {
30135 break
30136 }
30137 v.copyOf(x)
30138 return true
30139 }
30140
30141
30142
30143 for {
30144 if auxIntToInt64(v.AuxInt) != 0 {
30145 break
30146 }
30147 call := v_0
30148 if call.Op != OpStaticLECall || len(call.Args) != 1 {
30149 break
30150 }
30151 sym := auxToCall(call.Aux)
30152 x := call.Args[0]
30153 if !(needRaceCleanup(sym, call) && clobber(call)) {
30154 break
30155 }
30156 v.copyOf(x)
30157 return true
30158 }
30159
30160
30161
30162 for {
30163 if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpStaticCall || len(v_0.Args) != 6 {
30164 break
30165 }
30166 sym := auxToCall(v_0.Aux)
30167 _ = v_0.Args[1]
30168 newLen := v_0.Args[1]
30169 if newLen.Op != OpConst64 || !(v.Type.IsInteger() && (isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias"))) {
30170 break
30171 }
30172 v.copyOf(newLen)
30173 return true
30174 }
30175
30176
30177
30178 for {
30179 if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpStaticCall || len(v_0.Args) != 6 {
30180 break
30181 }
30182 sym := auxToCall(v_0.Aux)
30183 _ = v_0.Args[1]
30184 newLen := v_0.Args[1]
30185 if newLen.Op != OpConst32 || !(v.Type.IsInteger() && (isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias"))) {
30186 break
30187 }
30188 v.copyOf(newLen)
30189 return true
30190 }
30191
30192
30193
30194 for {
30195 if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpStaticLECall || len(v_0.Args) != 3 {
30196 break
30197 }
30198 f := auxToCall(v_0.Aux)
30199 _ = v_0.Args[2]
30200 x := v_0.Args[0]
30201 y := v_0.Args[1]
30202 v_0_2 := v_0.Args[2]
30203 if v_0_2.Op != OpSelectN || auxIntToInt64(v_0_2.AuxInt) != 1 {
30204 break
30205 }
30206 c := v_0_2.Args[0]
30207 if c.Op != OpStaticLECall || len(c.Args) != 3 {
30208 break
30209 }
30210 g := auxToCall(c.Aux)
30211 if x != c.Args[0] || y != c.Args[1] || !(isSameCall(f, "runtime.cmpstring") && isSameCall(g, "runtime.cmpstring")) {
30212 break
30213 }
30214 b = c.Block
30215 v0 := b.NewValue0(v.Pos, OpSelectN, typ.Int)
30216 v.copyOf(v0)
30217 v0.AuxInt = int64ToAuxInt(0)
30218 v0.AddArg(c)
30219 return true
30220 }
30221
30222
30223
30224 for {
30225 if auxIntToInt64(v.AuxInt) != 1 {
30226 break
30227 }
30228 c := v_0
30229 if c.Op != OpStaticLECall || len(c.Args) != 3 {
30230 break
30231 }
30232 f := auxToCall(c.Aux)
30233 mem := c.Args[2]
30234 if !(c.Uses == 1 && isSameCall(f, "runtime.cmpstring") && clobber(c)) {
30235 break
30236 }
30237 v.copyOf(mem)
30238 return true
30239 }
30240 return false
30241 }
30242 func rewriteValuegeneric_OpSignExt16to32(v *Value) bool {
30243 v_0 := v.Args[0]
30244
30245
30246 for {
30247 if v_0.Op != OpConst16 {
30248 break
30249 }
30250 c := auxIntToInt16(v_0.AuxInt)
30251 v.reset(OpConst32)
30252 v.AuxInt = int32ToAuxInt(int32(c))
30253 return true
30254 }
30255
30256
30257
30258 for {
30259 if v_0.Op != OpTrunc32to16 {
30260 break
30261 }
30262 x := v_0.Args[0]
30263 if x.Op != OpRsh32x64 {
30264 break
30265 }
30266 _ = x.Args[1]
30267 x_1 := x.Args[1]
30268 if x_1.Op != OpConst64 {
30269 break
30270 }
30271 s := auxIntToInt64(x_1.AuxInt)
30272 if !(s >= 16) {
30273 break
30274 }
30275 v.copyOf(x)
30276 return true
30277 }
30278 return false
30279 }
30280 func rewriteValuegeneric_OpSignExt16to64(v *Value) bool {
30281 v_0 := v.Args[0]
30282
30283
30284 for {
30285 if v_0.Op != OpConst16 {
30286 break
30287 }
30288 c := auxIntToInt16(v_0.AuxInt)
30289 v.reset(OpConst64)
30290 v.AuxInt = int64ToAuxInt(int64(c))
30291 return true
30292 }
30293
30294
30295
30296 for {
30297 if v_0.Op != OpTrunc64to16 {
30298 break
30299 }
30300 x := v_0.Args[0]
30301 if x.Op != OpRsh64x64 {
30302 break
30303 }
30304 _ = x.Args[1]
30305 x_1 := x.Args[1]
30306 if x_1.Op != OpConst64 {
30307 break
30308 }
30309 s := auxIntToInt64(x_1.AuxInt)
30310 if !(s >= 48) {
30311 break
30312 }
30313 v.copyOf(x)
30314 return true
30315 }
30316 return false
30317 }
30318 func rewriteValuegeneric_OpSignExt32to64(v *Value) bool {
30319 v_0 := v.Args[0]
30320
30321
30322 for {
30323 if v_0.Op != OpConst32 {
30324 break
30325 }
30326 c := auxIntToInt32(v_0.AuxInt)
30327 v.reset(OpConst64)
30328 v.AuxInt = int64ToAuxInt(int64(c))
30329 return true
30330 }
30331
30332
30333
30334 for {
30335 if v_0.Op != OpTrunc64to32 {
30336 break
30337 }
30338 x := v_0.Args[0]
30339 if x.Op != OpRsh64x64 {
30340 break
30341 }
30342 _ = x.Args[1]
30343 x_1 := x.Args[1]
30344 if x_1.Op != OpConst64 {
30345 break
30346 }
30347 s := auxIntToInt64(x_1.AuxInt)
30348 if !(s >= 32) {
30349 break
30350 }
30351 v.copyOf(x)
30352 return true
30353 }
30354 return false
30355 }
30356 func rewriteValuegeneric_OpSignExt8to16(v *Value) bool {
30357 v_0 := v.Args[0]
30358
30359
30360 for {
30361 if v_0.Op != OpConst8 {
30362 break
30363 }
30364 c := auxIntToInt8(v_0.AuxInt)
30365 v.reset(OpConst16)
30366 v.AuxInt = int16ToAuxInt(int16(c))
30367 return true
30368 }
30369
30370
30371
30372 for {
30373 if v_0.Op != OpTrunc16to8 {
30374 break
30375 }
30376 x := v_0.Args[0]
30377 if x.Op != OpRsh16x64 {
30378 break
30379 }
30380 _ = x.Args[1]
30381 x_1 := x.Args[1]
30382 if x_1.Op != OpConst64 {
30383 break
30384 }
30385 s := auxIntToInt64(x_1.AuxInt)
30386 if !(s >= 8) {
30387 break
30388 }
30389 v.copyOf(x)
30390 return true
30391 }
30392 return false
30393 }
30394 func rewriteValuegeneric_OpSignExt8to32(v *Value) bool {
30395 v_0 := v.Args[0]
30396
30397
30398 for {
30399 if v_0.Op != OpConst8 {
30400 break
30401 }
30402 c := auxIntToInt8(v_0.AuxInt)
30403 v.reset(OpConst32)
30404 v.AuxInt = int32ToAuxInt(int32(c))
30405 return true
30406 }
30407
30408
30409
30410 for {
30411 if v_0.Op != OpTrunc32to8 {
30412 break
30413 }
30414 x := v_0.Args[0]
30415 if x.Op != OpRsh32x64 {
30416 break
30417 }
30418 _ = x.Args[1]
30419 x_1 := x.Args[1]
30420 if x_1.Op != OpConst64 {
30421 break
30422 }
30423 s := auxIntToInt64(x_1.AuxInt)
30424 if !(s >= 24) {
30425 break
30426 }
30427 v.copyOf(x)
30428 return true
30429 }
30430 return false
30431 }
30432 func rewriteValuegeneric_OpSignExt8to64(v *Value) bool {
30433 v_0 := v.Args[0]
30434
30435
30436 for {
30437 if v_0.Op != OpConst8 {
30438 break
30439 }
30440 c := auxIntToInt8(v_0.AuxInt)
30441 v.reset(OpConst64)
30442 v.AuxInt = int64ToAuxInt(int64(c))
30443 return true
30444 }
30445
30446
30447
30448 for {
30449 if v_0.Op != OpTrunc64to8 {
30450 break
30451 }
30452 x := v_0.Args[0]
30453 if x.Op != OpRsh64x64 {
30454 break
30455 }
30456 _ = x.Args[1]
30457 x_1 := x.Args[1]
30458 if x_1.Op != OpConst64 {
30459 break
30460 }
30461 s := auxIntToInt64(x_1.AuxInt)
30462 if !(s >= 56) {
30463 break
30464 }
30465 v.copyOf(x)
30466 return true
30467 }
30468 return false
30469 }
30470 func rewriteValuegeneric_OpSliceCap(v *Value) bool {
30471 v_0 := v.Args[0]
30472
30473
30474 for {
30475 if v_0.Op != OpSliceMake {
30476 break
30477 }
30478 _ = v_0.Args[2]
30479 v_0_2 := v_0.Args[2]
30480 if v_0_2.Op != OpConst64 {
30481 break
30482 }
30483 t := v_0_2.Type
30484 c := auxIntToInt64(v_0_2.AuxInt)
30485 v.reset(OpConst64)
30486 v.Type = t
30487 v.AuxInt = int64ToAuxInt(c)
30488 return true
30489 }
30490
30491
30492 for {
30493 if v_0.Op != OpSliceMake {
30494 break
30495 }
30496 _ = v_0.Args[2]
30497 v_0_2 := v_0.Args[2]
30498 if v_0_2.Op != OpConst32 {
30499 break
30500 }
30501 t := v_0_2.Type
30502 c := auxIntToInt32(v_0_2.AuxInt)
30503 v.reset(OpConst32)
30504 v.Type = t
30505 v.AuxInt = int32ToAuxInt(c)
30506 return true
30507 }
30508
30509
30510 for {
30511 if v_0.Op != OpSliceMake {
30512 break
30513 }
30514 _ = v_0.Args[2]
30515 v_0_2 := v_0.Args[2]
30516 if v_0_2.Op != OpSliceCap {
30517 break
30518 }
30519 x := v_0_2.Args[0]
30520 v.reset(OpSliceCap)
30521 v.AddArg(x)
30522 return true
30523 }
30524
30525
30526 for {
30527 if v_0.Op != OpSliceMake {
30528 break
30529 }
30530 _ = v_0.Args[2]
30531 v_0_2 := v_0.Args[2]
30532 if v_0_2.Op != OpSliceLen {
30533 break
30534 }
30535 x := v_0_2.Args[0]
30536 v.reset(OpSliceLen)
30537 v.AddArg(x)
30538 return true
30539 }
30540 return false
30541 }
30542 func rewriteValuegeneric_OpSliceLen(v *Value) bool {
30543 v_0 := v.Args[0]
30544
30545
30546 for {
30547 if v_0.Op != OpSliceMake {
30548 break
30549 }
30550 _ = v_0.Args[1]
30551 v_0_1 := v_0.Args[1]
30552 if v_0_1.Op != OpConst64 {
30553 break
30554 }
30555 t := v_0_1.Type
30556 c := auxIntToInt64(v_0_1.AuxInt)
30557 v.reset(OpConst64)
30558 v.Type = t
30559 v.AuxInt = int64ToAuxInt(c)
30560 return true
30561 }
30562
30563
30564 for {
30565 if v_0.Op != OpSliceMake {
30566 break
30567 }
30568 _ = v_0.Args[1]
30569 v_0_1 := v_0.Args[1]
30570 if v_0_1.Op != OpConst32 {
30571 break
30572 }
30573 t := v_0_1.Type
30574 c := auxIntToInt32(v_0_1.AuxInt)
30575 v.reset(OpConst32)
30576 v.Type = t
30577 v.AuxInt = int32ToAuxInt(c)
30578 return true
30579 }
30580
30581
30582 for {
30583 if v_0.Op != OpSliceMake {
30584 break
30585 }
30586 _ = v_0.Args[1]
30587 v_0_1 := v_0.Args[1]
30588 if v_0_1.Op != OpSliceLen {
30589 break
30590 }
30591 x := v_0_1.Args[0]
30592 v.reset(OpSliceLen)
30593 v.AddArg(x)
30594 return true
30595 }
30596
30597
30598
30599 for {
30600 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
30601 break
30602 }
30603 v_0_0 := v_0.Args[0]
30604 if v_0_0.Op != OpStaticLECall || len(v_0_0.Args) != 6 {
30605 break
30606 }
30607 sym := auxToCall(v_0_0.Aux)
30608 _ = v_0_0.Args[1]
30609 newLen := v_0_0.Args[1]
30610 if newLen.Op != OpConst64 || !(isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias")) {
30611 break
30612 }
30613 v.copyOf(newLen)
30614 return true
30615 }
30616
30617
30618
30619 for {
30620 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
30621 break
30622 }
30623 v_0_0 := v_0.Args[0]
30624 if v_0_0.Op != OpStaticLECall || len(v_0_0.Args) != 6 {
30625 break
30626 }
30627 sym := auxToCall(v_0_0.Aux)
30628 _ = v_0_0.Args[1]
30629 newLen := v_0_0.Args[1]
30630 if newLen.Op != OpConst32 || !(isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias")) {
30631 break
30632 }
30633 v.copyOf(newLen)
30634 return true
30635 }
30636 return false
30637 }
30638 func rewriteValuegeneric_OpSliceMake(v *Value) bool {
30639 v_2 := v.Args[2]
30640 v_1 := v.Args[1]
30641 v_0 := v.Args[0]
30642 b := v.Block
30643
30644
30645
30646 for {
30647 if v_0.Op != OpAddPtr {
30648 break
30649 }
30650 t := v_0.Type
30651 _ = v_0.Args[1]
30652 x := v_0.Args[0]
30653 v_0_1 := v_0.Args[1]
30654 if v_0_1.Op != OpAnd64 {
30655 break
30656 }
30657 _ = v_0_1.Args[1]
30658 v_0_1_0 := v_0_1.Args[0]
30659 v_0_1_1 := v_0_1.Args[1]
30660 for _i0 := 0; _i0 <= 1; _i0, v_0_1_0, v_0_1_1 = _i0+1, v_0_1_1, v_0_1_0 {
30661 y := v_0_1_0
30662 if v_0_1_1.Op != OpSlicemask {
30663 continue
30664 }
30665 w := v_1
30666 if w.Op != OpConst64 {
30667 continue
30668 }
30669 c := auxIntToInt64(w.AuxInt)
30670 z := v_2
30671 if !(c > 0) {
30672 continue
30673 }
30674 v.reset(OpSliceMake)
30675 v0 := b.NewValue0(v.Pos, OpAddPtr, t)
30676 v0.AddArg2(x, y)
30677 v.AddArg3(v0, w, z)
30678 return true
30679 }
30680 break
30681 }
30682
30683
30684
30685 for {
30686 if v_0.Op != OpAddPtr {
30687 break
30688 }
30689 t := v_0.Type
30690 _ = v_0.Args[1]
30691 x := v_0.Args[0]
30692 v_0_1 := v_0.Args[1]
30693 if v_0_1.Op != OpAnd32 {
30694 break
30695 }
30696 _ = v_0_1.Args[1]
30697 v_0_1_0 := v_0_1.Args[0]
30698 v_0_1_1 := v_0_1.Args[1]
30699 for _i0 := 0; _i0 <= 1; _i0, v_0_1_0, v_0_1_1 = _i0+1, v_0_1_1, v_0_1_0 {
30700 y := v_0_1_0
30701 if v_0_1_1.Op != OpSlicemask {
30702 continue
30703 }
30704 w := v_1
30705 if w.Op != OpConst32 {
30706 continue
30707 }
30708 c := auxIntToInt32(w.AuxInt)
30709 z := v_2
30710 if !(c > 0) {
30711 continue
30712 }
30713 v.reset(OpSliceMake)
30714 v0 := b.NewValue0(v.Pos, OpAddPtr, t)
30715 v0.AddArg2(x, y)
30716 v.AddArg3(v0, w, z)
30717 return true
30718 }
30719 break
30720 }
30721 return false
30722 }
30723 func rewriteValuegeneric_OpSlicePtr(v *Value) bool {
30724 v_0 := v.Args[0]
30725
30726
30727 for {
30728 if v_0.Op != OpSliceMake {
30729 break
30730 }
30731 v_0_0 := v_0.Args[0]
30732 if v_0_0.Op != OpSlicePtr {
30733 break
30734 }
30735 x := v_0_0.Args[0]
30736 v.reset(OpSlicePtr)
30737 v.AddArg(x)
30738 return true
30739 }
30740 return false
30741 }
30742 func rewriteValuegeneric_OpSlicemask(v *Value) bool {
30743 v_0 := v.Args[0]
30744
30745
30746
30747 for {
30748 if v_0.Op != OpConst32 {
30749 break
30750 }
30751 x := auxIntToInt32(v_0.AuxInt)
30752 if !(x > 0) {
30753 break
30754 }
30755 v.reset(OpConst32)
30756 v.AuxInt = int32ToAuxInt(-1)
30757 return true
30758 }
30759
30760
30761 for {
30762 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
30763 break
30764 }
30765 v.reset(OpConst32)
30766 v.AuxInt = int32ToAuxInt(0)
30767 return true
30768 }
30769
30770
30771
30772 for {
30773 if v_0.Op != OpConst64 {
30774 break
30775 }
30776 x := auxIntToInt64(v_0.AuxInt)
30777 if !(x > 0) {
30778 break
30779 }
30780 v.reset(OpConst64)
30781 v.AuxInt = int64ToAuxInt(-1)
30782 return true
30783 }
30784
30785
30786 for {
30787 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
30788 break
30789 }
30790 v.reset(OpConst64)
30791 v.AuxInt = int64ToAuxInt(0)
30792 return true
30793 }
30794 return false
30795 }
30796 func rewriteValuegeneric_OpSqrt(v *Value) bool {
30797 v_0 := v.Args[0]
30798
30799
30800
30801 for {
30802 if v_0.Op != OpConst64F {
30803 break
30804 }
30805 c := auxIntToFloat64(v_0.AuxInt)
30806 if !(!math.IsNaN(math.Sqrt(c))) {
30807 break
30808 }
30809 v.reset(OpConst64F)
30810 v.AuxInt = float64ToAuxInt(math.Sqrt(c))
30811 return true
30812 }
30813 return false
30814 }
30815 func rewriteValuegeneric_OpStaticCall(v *Value) bool {
30816 b := v.Block
30817 typ := &b.Func.Config.Types
30818
30819
30820
30821 for {
30822 if len(v.Args) != 4 {
30823 break
30824 }
30825 callAux := auxToCall(v.Aux)
30826 mem := v.Args[3]
30827 p := v.Args[0]
30828 q := v.Args[1]
30829 if !(isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)) {
30830 break
30831 }
30832 v.reset(OpMakeResult)
30833 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
30834 v0.AuxInt = boolToAuxInt(true)
30835 v.AddArg2(v0, mem)
30836 return true
30837 }
30838 return false
30839 }
30840 func rewriteValuegeneric_OpStaticLECall(v *Value) bool {
30841 b := v.Block
30842 config := b.Func.Config
30843 typ := &b.Func.Config.Types
30844
30845
30846
30847 for {
30848 if len(v.Args) != 4 {
30849 break
30850 }
30851 callAux := auxToCall(v.Aux)
30852 mem := v.Args[3]
30853 sptr := v.Args[0]
30854 v_1 := v.Args[1]
30855 if v_1.Op != OpAddr {
30856 break
30857 }
30858 scon := auxToSym(v_1.Aux)
30859 v_1_0 := v_1.Args[0]
30860 if v_1_0.Op != OpSB {
30861 break
30862 }
30863 v_2 := v.Args[2]
30864 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon)) {
30865 break
30866 }
30867 v.reset(OpMakeResult)
30868 v0 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
30869 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
30870 v1.AddArg2(sptr, mem)
30871 v2 := b.NewValue0(v.Pos, OpConst8, typ.Int8)
30872 v2.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
30873 v0.AddArg2(v1, v2)
30874 v.AddArg2(v0, mem)
30875 return true
30876 }
30877
30878
30879
30880 for {
30881 if len(v.Args) != 4 {
30882 break
30883 }
30884 callAux := auxToCall(v.Aux)
30885 mem := v.Args[3]
30886 v_0 := v.Args[0]
30887 if v_0.Op != OpAddr {
30888 break
30889 }
30890 scon := auxToSym(v_0.Aux)
30891 v_0_0 := v_0.Args[0]
30892 if v_0_0.Op != OpSB {
30893 break
30894 }
30895 sptr := v.Args[1]
30896 v_2 := v.Args[2]
30897 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 1 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon)) {
30898 break
30899 }
30900 v.reset(OpMakeResult)
30901 v0 := b.NewValue0(v.Pos, OpEq8, typ.Bool)
30902 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
30903 v1.AddArg2(sptr, mem)
30904 v2 := b.NewValue0(v.Pos, OpConst8, typ.Int8)
30905 v2.AuxInt = int8ToAuxInt(int8(read8(scon, 0)))
30906 v0.AddArg2(v1, v2)
30907 v.AddArg2(v0, mem)
30908 return true
30909 }
30910
30911
30912
30913 for {
30914 if len(v.Args) != 4 {
30915 break
30916 }
30917 callAux := auxToCall(v.Aux)
30918 mem := v.Args[3]
30919 sptr := v.Args[0]
30920 v_1 := v.Args[1]
30921 if v_1.Op != OpAddr {
30922 break
30923 }
30924 scon := auxToSym(v_1.Aux)
30925 v_1_0 := v_1.Args[0]
30926 if v_1_0.Op != OpSB {
30927 break
30928 }
30929 v_2 := v.Args[2]
30930 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
30931 break
30932 }
30933 v.reset(OpMakeResult)
30934 v0 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
30935 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
30936 v1.AddArg2(sptr, mem)
30937 v2 := b.NewValue0(v.Pos, OpConst16, typ.Int16)
30938 v2.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
30939 v0.AddArg2(v1, v2)
30940 v.AddArg2(v0, mem)
30941 return true
30942 }
30943
30944
30945
30946 for {
30947 if len(v.Args) != 4 {
30948 break
30949 }
30950 callAux := auxToCall(v.Aux)
30951 mem := v.Args[3]
30952 v_0 := v.Args[0]
30953 if v_0.Op != OpAddr {
30954 break
30955 }
30956 scon := auxToSym(v_0.Aux)
30957 v_0_0 := v_0.Args[0]
30958 if v_0_0.Op != OpSB {
30959 break
30960 }
30961 sptr := v.Args[1]
30962 v_2 := v.Args[2]
30963 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 2 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
30964 break
30965 }
30966 v.reset(OpMakeResult)
30967 v0 := b.NewValue0(v.Pos, OpEq16, typ.Bool)
30968 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
30969 v1.AddArg2(sptr, mem)
30970 v2 := b.NewValue0(v.Pos, OpConst16, typ.Int16)
30971 v2.AuxInt = int16ToAuxInt(int16(read16(scon, 0, config.ctxt.Arch.ByteOrder)))
30972 v0.AddArg2(v1, v2)
30973 v.AddArg2(v0, mem)
30974 return true
30975 }
30976
30977
30978
30979 for {
30980 if len(v.Args) != 4 {
30981 break
30982 }
30983 callAux := auxToCall(v.Aux)
30984 mem := v.Args[3]
30985 sptr := v.Args[0]
30986 v_1 := v.Args[1]
30987 if v_1.Op != OpAddr {
30988 break
30989 }
30990 scon := auxToSym(v_1.Aux)
30991 v_1_0 := v_1.Args[0]
30992 if v_1_0.Op != OpSB {
30993 break
30994 }
30995 v_2 := v.Args[2]
30996 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
30997 break
30998 }
30999 v.reset(OpMakeResult)
31000 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
31001 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31002 v1.AddArg2(sptr, mem)
31003 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
31004 v2.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
31005 v0.AddArg2(v1, v2)
31006 v.AddArg2(v0, mem)
31007 return true
31008 }
31009
31010
31011
31012 for {
31013 if len(v.Args) != 4 {
31014 break
31015 }
31016 callAux := auxToCall(v.Aux)
31017 mem := v.Args[3]
31018 v_0 := v.Args[0]
31019 if v_0.Op != OpAddr {
31020 break
31021 }
31022 scon := auxToSym(v_0.Aux)
31023 v_0_0 := v_0.Args[0]
31024 if v_0_0.Op != OpSB {
31025 break
31026 }
31027 sptr := v.Args[1]
31028 v_2 := v.Args[2]
31029 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 4 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
31030 break
31031 }
31032 v.reset(OpMakeResult)
31033 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
31034 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31035 v1.AddArg2(sptr, mem)
31036 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
31037 v2.AuxInt = int32ToAuxInt(int32(read32(scon, 0, config.ctxt.Arch.ByteOrder)))
31038 v0.AddArg2(v1, v2)
31039 v.AddArg2(v0, mem)
31040 return true
31041 }
31042
31043
31044
31045 for {
31046 if len(v.Args) != 4 {
31047 break
31048 }
31049 callAux := auxToCall(v.Aux)
31050 mem := v.Args[3]
31051 sptr := v.Args[0]
31052 v_1 := v.Args[1]
31053 if v_1.Op != OpAddr {
31054 break
31055 }
31056 scon := auxToSym(v_1.Aux)
31057 v_1_0 := v_1.Args[0]
31058 if v_1_0.Op != OpSB {
31059 break
31060 }
31061 v_2 := v.Args[2]
31062 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31063 break
31064 }
31065 v.reset(OpMakeResult)
31066 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31067 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
31068 v1.AddArg2(sptr, mem)
31069 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31070 v2.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
31071 v0.AddArg2(v1, v2)
31072 v.AddArg2(v0, mem)
31073 return true
31074 }
31075
31076
31077
31078 for {
31079 if len(v.Args) != 4 {
31080 break
31081 }
31082 callAux := auxToCall(v.Aux)
31083 mem := v.Args[3]
31084 v_0 := v.Args[0]
31085 if v_0.Op != OpAddr {
31086 break
31087 }
31088 scon := auxToSym(v_0.Aux)
31089 v_0_0 := v_0.Args[0]
31090 if v_0_0.Op != OpSB {
31091 break
31092 }
31093 sptr := v.Args[1]
31094 v_2 := v.Args[2]
31095 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 8 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31096 break
31097 }
31098 v.reset(OpMakeResult)
31099 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31100 v1 := b.NewValue0(v.Pos, OpLoad, typ.Int64)
31101 v1.AddArg2(sptr, mem)
31102 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31103 v2.AuxInt = int64ToAuxInt(int64(read64(scon, 0, config.ctxt.Arch.ByteOrder)))
31104 v0.AddArg2(v1, v2)
31105 v.AddArg2(v0, mem)
31106 return true
31107 }
31108
31109
31110
31111 for {
31112 if len(v.Args) != 4 {
31113 break
31114 }
31115 callAux := auxToCall(v.Aux)
31116 mem := v.Args[3]
31117 sptr := v.Args[0]
31118 v_1 := v.Args[1]
31119 if v_1.Op != OpAddr {
31120 break
31121 }
31122 scon := auxToSym(v_1.Aux)
31123 v_1_0 := v_1.Args[0]
31124 if v_1_0.Op != OpSB {
31125 break
31126 }
31127 v_2 := v.Args[2]
31128 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 3 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
31129 break
31130 }
31131 v.reset(OpMakeResult)
31132 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
31133 v1 := b.NewValue0(v.Pos, OpOr32, typ.Int32)
31134 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.Int32)
31135 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
31136 v3.AddArg2(sptr, mem)
31137 v2.AddArg(v3)
31138 v4 := b.NewValue0(v.Pos, OpLsh32x32, typ.Int32)
31139 v5 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.Int32)
31140 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
31141 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31142 v7.AuxInt = int64ToAuxInt(2)
31143 v7.AddArg(sptr)
31144 v6.AddArg2(v7, mem)
31145 v5.AddArg(v6)
31146 v8 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
31147 v8.AuxInt = int32ToAuxInt(16)
31148 v4.AddArg2(v5, v8)
31149 v1.AddArg2(v2, v4)
31150 v9 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
31151 v9.AuxInt = int32ToAuxInt(int32(uint32(read16(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint32(read8(scon, 2)) << 16)))
31152 v0.AddArg2(v1, v9)
31153 v.AddArg2(v0, mem)
31154 return true
31155 }
31156
31157
31158
31159 for {
31160 if len(v.Args) != 4 {
31161 break
31162 }
31163 callAux := auxToCall(v.Aux)
31164 mem := v.Args[3]
31165 v_0 := v.Args[0]
31166 if v_0.Op != OpAddr {
31167 break
31168 }
31169 scon := auxToSym(v_0.Aux)
31170 v_0_0 := v_0.Args[0]
31171 if v_0_0.Op != OpSB {
31172 break
31173 }
31174 sptr := v.Args[1]
31175 v_2 := v.Args[2]
31176 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 3 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config)) {
31177 break
31178 }
31179 v.reset(OpMakeResult)
31180 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool)
31181 v1 := b.NewValue0(v.Pos, OpOr32, typ.Int32)
31182 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.Int32)
31183 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
31184 v3.AddArg2(sptr, mem)
31185 v2.AddArg(v3)
31186 v4 := b.NewValue0(v.Pos, OpLsh32x32, typ.Int32)
31187 v5 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.Int32)
31188 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
31189 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31190 v7.AuxInt = int64ToAuxInt(2)
31191 v7.AddArg(sptr)
31192 v6.AddArg2(v7, mem)
31193 v5.AddArg(v6)
31194 v8 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
31195 v8.AuxInt = int32ToAuxInt(16)
31196 v4.AddArg2(v5, v8)
31197 v1.AddArg2(v2, v4)
31198 v9 := b.NewValue0(v.Pos, OpConst32, typ.Int32)
31199 v9.AuxInt = int32ToAuxInt(int32(uint32(read16(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint32(read8(scon, 2)) << 16)))
31200 v0.AddArg2(v1, v9)
31201 v.AddArg2(v0, mem)
31202 return true
31203 }
31204
31205
31206
31207 for {
31208 if len(v.Args) != 4 {
31209 break
31210 }
31211 callAux := auxToCall(v.Aux)
31212 mem := v.Args[3]
31213 sptr := v.Args[0]
31214 v_1 := v.Args[1]
31215 if v_1.Op != OpAddr {
31216 break
31217 }
31218 scon := auxToSym(v_1.Aux)
31219 v_1_0 := v_1.Args[0]
31220 if v_1_0.Op != OpSB {
31221 break
31222 }
31223 v_2 := v.Args[2]
31224 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 5 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31225 break
31226 }
31227 v.reset(OpMakeResult)
31228 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31229 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
31230 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31231 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31232 v3.AddArg2(sptr, mem)
31233 v2.AddArg(v3)
31234 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
31235 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.Int64)
31236 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
31237 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31238 v7.AuxInt = int64ToAuxInt(4)
31239 v7.AddArg(sptr)
31240 v6.AddArg2(v7, mem)
31241 v5.AddArg(v6)
31242 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31243 v8.AuxInt = int64ToAuxInt(32)
31244 v4.AddArg2(v5, v8)
31245 v1.AddArg2(v2, v4)
31246 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31247 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read8(scon, 4)) << 32)))
31248 v0.AddArg2(v1, v9)
31249 v.AddArg2(v0, mem)
31250 return true
31251 }
31252
31253
31254
31255 for {
31256 if len(v.Args) != 4 {
31257 break
31258 }
31259 callAux := auxToCall(v.Aux)
31260 mem := v.Args[3]
31261 v_0 := v.Args[0]
31262 if v_0.Op != OpAddr {
31263 break
31264 }
31265 scon := auxToSym(v_0.Aux)
31266 v_0_0 := v_0.Args[0]
31267 if v_0_0.Op != OpSB {
31268 break
31269 }
31270 sptr := v.Args[1]
31271 v_2 := v.Args[2]
31272 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 5 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31273 break
31274 }
31275 v.reset(OpMakeResult)
31276 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31277 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
31278 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31279 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31280 v3.AddArg2(sptr, mem)
31281 v2.AddArg(v3)
31282 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
31283 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.Int64)
31284 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int8)
31285 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31286 v7.AuxInt = int64ToAuxInt(4)
31287 v7.AddArg(sptr)
31288 v6.AddArg2(v7, mem)
31289 v5.AddArg(v6)
31290 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31291 v8.AuxInt = int64ToAuxInt(32)
31292 v4.AddArg2(v5, v8)
31293 v1.AddArg2(v2, v4)
31294 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31295 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read8(scon, 4)) << 32)))
31296 v0.AddArg2(v1, v9)
31297 v.AddArg2(v0, mem)
31298 return true
31299 }
31300
31301
31302
31303 for {
31304 if len(v.Args) != 4 {
31305 break
31306 }
31307 callAux := auxToCall(v.Aux)
31308 mem := v.Args[3]
31309 sptr := v.Args[0]
31310 v_1 := v.Args[1]
31311 if v_1.Op != OpAddr {
31312 break
31313 }
31314 scon := auxToSym(v_1.Aux)
31315 v_1_0 := v_1.Args[0]
31316 if v_1_0.Op != OpSB {
31317 break
31318 }
31319 v_2 := v.Args[2]
31320 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 6 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31321 break
31322 }
31323 v.reset(OpMakeResult)
31324 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31325 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
31326 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31327 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31328 v3.AddArg2(sptr, mem)
31329 v2.AddArg(v3)
31330 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
31331 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.Int64)
31332 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
31333 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31334 v7.AuxInt = int64ToAuxInt(4)
31335 v7.AddArg(sptr)
31336 v6.AddArg2(v7, mem)
31337 v5.AddArg(v6)
31338 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31339 v8.AuxInt = int64ToAuxInt(32)
31340 v4.AddArg2(v5, v8)
31341 v1.AddArg2(v2, v4)
31342 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31343 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read16(scon, 4, config.ctxt.Arch.ByteOrder)) << 32)))
31344 v0.AddArg2(v1, v9)
31345 v.AddArg2(v0, mem)
31346 return true
31347 }
31348
31349
31350
31351 for {
31352 if len(v.Args) != 4 {
31353 break
31354 }
31355 callAux := auxToCall(v.Aux)
31356 mem := v.Args[3]
31357 v_0 := v.Args[0]
31358 if v_0.Op != OpAddr {
31359 break
31360 }
31361 scon := auxToSym(v_0.Aux)
31362 v_0_0 := v_0.Args[0]
31363 if v_0_0.Op != OpSB {
31364 break
31365 }
31366 sptr := v.Args[1]
31367 v_2 := v.Args[2]
31368 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 6 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31369 break
31370 }
31371 v.reset(OpMakeResult)
31372 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31373 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
31374 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31375 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31376 v3.AddArg2(sptr, mem)
31377 v2.AddArg(v3)
31378 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
31379 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.Int64)
31380 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int16)
31381 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31382 v7.AuxInt = int64ToAuxInt(4)
31383 v7.AddArg(sptr)
31384 v6.AddArg2(v7, mem)
31385 v5.AddArg(v6)
31386 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31387 v8.AuxInt = int64ToAuxInt(32)
31388 v4.AddArg2(v5, v8)
31389 v1.AddArg2(v2, v4)
31390 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31391 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read16(scon, 4, config.ctxt.Arch.ByteOrder)) << 32)))
31392 v0.AddArg2(v1, v9)
31393 v.AddArg2(v0, mem)
31394 return true
31395 }
31396
31397
31398
31399 for {
31400 if len(v.Args) != 4 {
31401 break
31402 }
31403 callAux := auxToCall(v.Aux)
31404 mem := v.Args[3]
31405 sptr := v.Args[0]
31406 v_1 := v.Args[1]
31407 if v_1.Op != OpAddr {
31408 break
31409 }
31410 scon := auxToSym(v_1.Aux)
31411 v_1_0 := v_1.Args[0]
31412 if v_1_0.Op != OpSB {
31413 break
31414 }
31415 v_2 := v.Args[2]
31416 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 7 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31417 break
31418 }
31419 v.reset(OpMakeResult)
31420 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31421 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
31422 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31423 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31424 v3.AddArg2(sptr, mem)
31425 v2.AddArg(v3)
31426 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
31427 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31428 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31429 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31430 v7.AuxInt = int64ToAuxInt(3)
31431 v7.AddArg(sptr)
31432 v6.AddArg2(v7, mem)
31433 v5.AddArg(v6)
31434 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31435 v8.AuxInt = int64ToAuxInt(32)
31436 v4.AddArg2(v5, v8)
31437 v1.AddArg2(v2, v4)
31438 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31439 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read32(scon, 3, config.ctxt.Arch.ByteOrder)) << 32)))
31440 v0.AddArg2(v1, v9)
31441 v.AddArg2(v0, mem)
31442 return true
31443 }
31444
31445
31446
31447 for {
31448 if len(v.Args) != 4 {
31449 break
31450 }
31451 callAux := auxToCall(v.Aux)
31452 mem := v.Args[3]
31453 v_0 := v.Args[0]
31454 if v_0.Op != OpAddr {
31455 break
31456 }
31457 scon := auxToSym(v_0.Aux)
31458 v_0_0 := v_0.Args[0]
31459 if v_0_0.Op != OpSB {
31460 break
31461 }
31462 sptr := v.Args[1]
31463 v_2 := v.Args[2]
31464 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 7 || !(isSameCall(callAux, "runtime.memequal") && symIsRO(scon) && canLoadUnaligned(config) && config.PtrSize == 8) {
31465 break
31466 }
31467 v.reset(OpMakeResult)
31468 v0 := b.NewValue0(v.Pos, OpEq64, typ.Bool)
31469 v1 := b.NewValue0(v.Pos, OpOr64, typ.Int64)
31470 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31471 v3 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31472 v3.AddArg2(sptr, mem)
31473 v2.AddArg(v3)
31474 v4 := b.NewValue0(v.Pos, OpLsh64x64, typ.Int64)
31475 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.Int64)
31476 v6 := b.NewValue0(v.Pos, OpLoad, typ.Int32)
31477 v7 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtr)
31478 v7.AuxInt = int64ToAuxInt(3)
31479 v7.AddArg(sptr)
31480 v6.AddArg2(v7, mem)
31481 v5.AddArg(v6)
31482 v8 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31483 v8.AuxInt = int64ToAuxInt(32)
31484 v4.AddArg2(v5, v8)
31485 v1.AddArg2(v2, v4)
31486 v9 := b.NewValue0(v.Pos, OpConst64, typ.Int64)
31487 v9.AuxInt = int64ToAuxInt(int64(uint64(read32(scon, 0, config.ctxt.Arch.ByteOrder)) | (uint64(read32(scon, 3, config.ctxt.Arch.ByteOrder)) << 32)))
31488 v0.AddArg2(v1, v9)
31489 v.AddArg2(v0, mem)
31490 return true
31491 }
31492
31493
31494
31495 for {
31496 if len(v.Args) != 4 {
31497 break
31498 }
31499 callAux := auxToCall(v.Aux)
31500 mem := v.Args[3]
31501 v_2 := v.Args[2]
31502 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.memequal")) {
31503 break
31504 }
31505 v.reset(OpMakeResult)
31506 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
31507 v0.AuxInt = boolToAuxInt(true)
31508 v.AddArg2(v0, mem)
31509 return true
31510 }
31511
31512
31513
31514 for {
31515 if len(v.Args) != 4 {
31516 break
31517 }
31518 callAux := auxToCall(v.Aux)
31519 mem := v.Args[3]
31520 p := v.Args[0]
31521 q := v.Args[1]
31522 if !(isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)) {
31523 break
31524 }
31525 v.reset(OpMakeResult)
31526 v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
31527 v0.AuxInt = boolToAuxInt(true)
31528 v.AddArg2(v0, mem)
31529 return true
31530 }
31531
31532
31533
31534 for {
31535 if len(v.Args) != 4 {
31536 break
31537 }
31538 callAux := auxToCall(v.Aux)
31539 mem := v.Args[3]
31540 v_1 := v.Args[1]
31541 if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 {
31542 break
31543 }
31544 v_2 := v.Args[2]
31545 if v_2.Op != OpConst64 || auxIntToInt64(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.makeslice")) {
31546 break
31547 }
31548 v.reset(OpMakeResult)
31549 v0 := b.NewValue0(v.Pos, OpAddr, v.Type.FieldType(0))
31550 v0.Aux = symToAux(ir.Syms.Zerobase)
31551 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
31552 v0.AddArg(v1)
31553 v.AddArg2(v0, mem)
31554 return true
31555 }
31556
31557
31558
31559 for {
31560 if len(v.Args) != 4 {
31561 break
31562 }
31563 callAux := auxToCall(v.Aux)
31564 mem := v.Args[3]
31565 v_1 := v.Args[1]
31566 if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 {
31567 break
31568 }
31569 v_2 := v.Args[2]
31570 if v_2.Op != OpConst32 || auxIntToInt32(v_2.AuxInt) != 0 || !(isSameCall(callAux, "runtime.makeslice")) {
31571 break
31572 }
31573 v.reset(OpMakeResult)
31574 v0 := b.NewValue0(v.Pos, OpAddr, v.Type.FieldType(0))
31575 v0.Aux = symToAux(ir.Syms.Zerobase)
31576 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr)
31577 v0.AddArg(v1)
31578 v.AddArg2(v0, mem)
31579 return true
31580 }
31581
31582
31583
31584 for {
31585 if len(v.Args) != 4 {
31586 break
31587 }
31588 f := auxToCall(v.Aux)
31589 mem := v.Args[3]
31590 typ_ := v.Args[0]
31591 x := v.Args[1]
31592 y := v.Args[2]
31593 if !(isSameCall(f, "runtime.efaceeq") && isDirectAndComparableType(typ_) && clobber(v)) {
31594 break
31595 }
31596 v.reset(OpMakeResult)
31597 v0 := b.NewValue0(v.Pos, OpEqPtr, typ.Bool)
31598 v0.AddArg2(x, y)
31599 v.AddArg2(v0, mem)
31600 return true
31601 }
31602
31603
31604
31605 for {
31606 if len(v.Args) != 4 {
31607 break
31608 }
31609 f := auxToCall(v.Aux)
31610 mem := v.Args[3]
31611 itab := v.Args[0]
31612 x := v.Args[1]
31613 y := v.Args[2]
31614 if !(isSameCall(f, "runtime.ifaceeq") && isDirectAndComparableIface(itab) && clobber(v)) {
31615 break
31616 }
31617 v.reset(OpMakeResult)
31618 v0 := b.NewValue0(v.Pos, OpEqPtr, typ.Bool)
31619 v0.AddArg2(x, y)
31620 v.AddArg2(v0, mem)
31621 return true
31622 }
31623
31624
31625
31626 for {
31627 if len(v.Args) != 4 {
31628 break
31629 }
31630 argsize := auxIntToInt32(v.AuxInt)
31631 f := auxToCall(v.Aux)
31632 _ = v.Args[3]
31633 typ_ := v.Args[0]
31634 map_ := v.Args[1]
31635 key := v.Args[2]
31636 if key.Op != OpSelectN || auxIntToInt64(key.AuxInt) != 0 {
31637 break
31638 }
31639 sbts := key.Args[0]
31640 if sbts.Op != OpStaticLECall || len(sbts.Args) != 4 {
31641 break
31642 }
31643 g := auxToCall(sbts.Aux)
31644 mem := sbts.Args[3]
31645 ptr := sbts.Args[1]
31646 len := sbts.Args[2]
31647 m := v.Args[3]
31648 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)) {
31649 break
31650 }
31651 v.reset(OpStaticLECall)
31652 v.AuxInt = int32ToAuxInt(argsize)
31653 v.Aux = callToAux(f)
31654 v0 := b.NewValue0(v.Pos, OpStringMake, typ.String)
31655 v0.AddArg2(ptr, len)
31656 v.AddArg4(typ_, map_, v0, mem)
31657 return true
31658 }
31659
31660
31661
31662 for {
31663 if len(v.Args) != 3 {
31664 break
31665 }
31666 argsize := auxIntToInt32(v.AuxInt)
31667 f := auxToCall(v.Aux)
31668 _ = v.Args[2]
31669 dict_ := v.Args[0]
31670 key := v.Args[1]
31671 if key.Op != OpSelectN || auxIntToInt64(key.AuxInt) != 0 {
31672 break
31673 }
31674 sbts := key.Args[0]
31675 if sbts.Op != OpStaticLECall || len(sbts.Args) != 4 {
31676 break
31677 }
31678 g := auxToCall(sbts.Aux)
31679 mem := sbts.Args[3]
31680 ptr := sbts.Args[1]
31681 len := sbts.Args[2]
31682 m := v.Args[2]
31683 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)) {
31684 break
31685 }
31686 v.reset(OpStaticLECall)
31687 v.AuxInt = int32ToAuxInt(argsize)
31688 v.Aux = callToAux(f)
31689 v0 := b.NewValue0(v.Pos, OpStringMake, typ.String)
31690 v0.AddArg2(ptr, len)
31691 v.AddArg3(dict_, v0, mem)
31692 return true
31693 }
31694 return false
31695 }
31696 func rewriteValuegeneric_OpStore(v *Value) bool {
31697 v_2 := v.Args[2]
31698 v_1 := v.Args[1]
31699 v_0 := v.Args[0]
31700 b := v.Block
31701
31702
31703
31704 for {
31705 t1 := auxToType(v.Aux)
31706 p1 := v_0
31707 if v_1.Op != OpLoad {
31708 break
31709 }
31710 t2 := v_1.Type
31711 mem := v_1.Args[1]
31712 p2 := v_1.Args[0]
31713 if mem != v_2 || !(isSamePtr(p1, p2) && t2.Size() == t1.Size()) {
31714 break
31715 }
31716 v.copyOf(mem)
31717 return true
31718 }
31719
31720
31721
31722 for {
31723 t1 := auxToType(v.Aux)
31724 p1 := v_0
31725 if v_1.Op != OpLoad {
31726 break
31727 }
31728 t2 := v_1.Type
31729 oldmem := v_1.Args[1]
31730 p2 := v_1.Args[0]
31731 mem := v_2
31732 if mem.Op != OpStore {
31733 break
31734 }
31735 t3 := auxToType(mem.Aux)
31736 _ = mem.Args[2]
31737 p3 := mem.Args[0]
31738 if oldmem != mem.Args[2] || !(isSamePtr(p1, p2) && t2.Size() == t1.Size() && disjoint(p1, t1.Size(), p3, t3.Size())) {
31739 break
31740 }
31741 v.copyOf(mem)
31742 return true
31743 }
31744
31745
31746
31747 for {
31748 t1 := auxToType(v.Aux)
31749 p1 := v_0
31750 if v_1.Op != OpLoad {
31751 break
31752 }
31753 t2 := v_1.Type
31754 oldmem := v_1.Args[1]
31755 p2 := v_1.Args[0]
31756 mem := v_2
31757 if mem.Op != OpStore {
31758 break
31759 }
31760 t3 := auxToType(mem.Aux)
31761 _ = mem.Args[2]
31762 p3 := mem.Args[0]
31763 mem_2 := mem.Args[2]
31764 if mem_2.Op != OpStore {
31765 break
31766 }
31767 t4 := auxToType(mem_2.Aux)
31768 _ = mem_2.Args[2]
31769 p4 := mem_2.Args[0]
31770 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())) {
31771 break
31772 }
31773 v.copyOf(mem)
31774 return true
31775 }
31776
31777
31778
31779 for {
31780 t1 := auxToType(v.Aux)
31781 p1 := v_0
31782 if v_1.Op != OpLoad {
31783 break
31784 }
31785 t2 := v_1.Type
31786 oldmem := v_1.Args[1]
31787 p2 := v_1.Args[0]
31788 mem := v_2
31789 if mem.Op != OpStore {
31790 break
31791 }
31792 t3 := auxToType(mem.Aux)
31793 _ = mem.Args[2]
31794 p3 := mem.Args[0]
31795 mem_2 := mem.Args[2]
31796 if mem_2.Op != OpStore {
31797 break
31798 }
31799 t4 := auxToType(mem_2.Aux)
31800 _ = mem_2.Args[2]
31801 p4 := mem_2.Args[0]
31802 mem_2_2 := mem_2.Args[2]
31803 if mem_2_2.Op != OpStore {
31804 break
31805 }
31806 t5 := auxToType(mem_2_2.Aux)
31807 _ = mem_2_2.Args[2]
31808 p5 := mem_2_2.Args[0]
31809 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())) {
31810 break
31811 }
31812 v.copyOf(mem)
31813 return true
31814 }
31815
31816
31817
31818 for {
31819 t := auxToType(v.Aux)
31820 if v_0.Op != OpOffPtr {
31821 break
31822 }
31823 o := auxIntToInt64(v_0.AuxInt)
31824 p1 := v_0.Args[0]
31825 x := v_1
31826 mem := v_2
31827 if mem.Op != OpZero {
31828 break
31829 }
31830 n := auxIntToInt64(mem.AuxInt)
31831 p2 := mem.Args[0]
31832 if !(isConstZero(x) && o >= 0 && t.Size()+o <= n && isSamePtr(p1, p2)) {
31833 break
31834 }
31835 v.copyOf(mem)
31836 return true
31837 }
31838
31839
31840
31841 for {
31842 t1 := auxToType(v.Aux)
31843 op := v_0
31844 if op.Op != OpOffPtr {
31845 break
31846 }
31847 o1 := auxIntToInt64(op.AuxInt)
31848 p1 := op.Args[0]
31849 x := v_1
31850 mem := v_2
31851 if mem.Op != OpStore {
31852 break
31853 }
31854 t2 := auxToType(mem.Aux)
31855 _ = mem.Args[2]
31856 p2 := mem.Args[0]
31857 mem_2 := mem.Args[2]
31858 if mem_2.Op != OpZero {
31859 break
31860 }
31861 n := auxIntToInt64(mem_2.AuxInt)
31862 p3 := mem_2.Args[0]
31863 if !(isConstZero(x) && o1 >= 0 && t1.Size()+o1 <= n && isSamePtr(p1, p3) && disjoint(op, t1.Size(), p2, t2.Size())) {
31864 break
31865 }
31866 v.copyOf(mem)
31867 return true
31868 }
31869
31870
31871
31872 for {
31873 t1 := auxToType(v.Aux)
31874 op := v_0
31875 if op.Op != OpOffPtr {
31876 break
31877 }
31878 o1 := auxIntToInt64(op.AuxInt)
31879 p1 := op.Args[0]
31880 x := v_1
31881 mem := v_2
31882 if mem.Op != OpStore {
31883 break
31884 }
31885 t2 := auxToType(mem.Aux)
31886 _ = mem.Args[2]
31887 p2 := mem.Args[0]
31888 mem_2 := mem.Args[2]
31889 if mem_2.Op != OpStore {
31890 break
31891 }
31892 t3 := auxToType(mem_2.Aux)
31893 _ = mem_2.Args[2]
31894 p3 := mem_2.Args[0]
31895 mem_2_2 := mem_2.Args[2]
31896 if mem_2_2.Op != OpZero {
31897 break
31898 }
31899 n := auxIntToInt64(mem_2_2.AuxInt)
31900 p4 := mem_2_2.Args[0]
31901 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())) {
31902 break
31903 }
31904 v.copyOf(mem)
31905 return true
31906 }
31907
31908
31909
31910 for {
31911 t1 := auxToType(v.Aux)
31912 op := v_0
31913 if op.Op != OpOffPtr {
31914 break
31915 }
31916 o1 := auxIntToInt64(op.AuxInt)
31917 p1 := op.Args[0]
31918 x := v_1
31919 mem := v_2
31920 if mem.Op != OpStore {
31921 break
31922 }
31923 t2 := auxToType(mem.Aux)
31924 _ = mem.Args[2]
31925 p2 := mem.Args[0]
31926 mem_2 := mem.Args[2]
31927 if mem_2.Op != OpStore {
31928 break
31929 }
31930 t3 := auxToType(mem_2.Aux)
31931 _ = mem_2.Args[2]
31932 p3 := mem_2.Args[0]
31933 mem_2_2 := mem_2.Args[2]
31934 if mem_2_2.Op != OpStore {
31935 break
31936 }
31937 t4 := auxToType(mem_2_2.Aux)
31938 _ = mem_2_2.Args[2]
31939 p4 := mem_2_2.Args[0]
31940 mem_2_2_2 := mem_2_2.Args[2]
31941 if mem_2_2_2.Op != OpZero {
31942 break
31943 }
31944 n := auxIntToInt64(mem_2_2_2.AuxInt)
31945 p5 := mem_2_2_2.Args[0]
31946 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())) {
31947 break
31948 }
31949 v.copyOf(mem)
31950 return true
31951 }
31952
31953
31954 for {
31955 if v_1.Op != OpStructMake {
31956 break
31957 }
31958 v.copyOf(rewriteStructStore(v))
31959 return true
31960 }
31961
31962
31963
31964 for {
31965 t := auxToType(v.Aux)
31966 dst := v_0
31967 if v_1.Op != OpLoad {
31968 break
31969 }
31970 mem := v_1.Args[1]
31971 src := v_1.Args[0]
31972 if mem != v_2 || !(!CanSSA(t)) {
31973 break
31974 }
31975 v.reset(OpMove)
31976 v.AuxInt = int64ToAuxInt(t.Size())
31977 v.Aux = typeToAux(t)
31978 v.AddArg3(dst, src, mem)
31979 return true
31980 }
31981
31982
31983
31984 for {
31985 t := auxToType(v.Aux)
31986 dst := v_0
31987 if v_1.Op != OpLoad {
31988 break
31989 }
31990 mem := v_1.Args[1]
31991 src := v_1.Args[0]
31992 if v_2.Op != OpVarDef {
31993 break
31994 }
31995 x := auxToSym(v_2.Aux)
31996 if mem != v_2.Args[0] || !(!CanSSA(t)) {
31997 break
31998 }
31999 v.reset(OpMove)
32000 v.AuxInt = int64ToAuxInt(t.Size())
32001 v.Aux = typeToAux(t)
32002 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
32003 v0.Aux = symToAux(x)
32004 v0.AddArg(mem)
32005 v.AddArg3(dst, src, v0)
32006 return true
32007 }
32008
32009
32010 for {
32011 if v_1.Op != OpArrayMake0 {
32012 break
32013 }
32014 mem := v_2
32015 v.copyOf(mem)
32016 return true
32017 }
32018
32019
32020 for {
32021 dst := v_0
32022 if v_1.Op != OpArrayMake1 {
32023 break
32024 }
32025 e := v_1.Args[0]
32026 mem := v_2
32027 v.reset(OpStore)
32028 v.Aux = typeToAux(e.Type)
32029 v.AddArg3(dst, e, mem)
32030 return true
32031 }
32032
32033
32034
32035 for {
32036 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
32037 break
32038 }
32039 call := v_0.Args[0]
32040 if call.Op != OpStaticLECall {
32041 break
32042 }
32043 x := v_1
32044 mem := v_2
32045 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isConstZero(x) && isMalloc(call.Aux)) {
32046 break
32047 }
32048 v.copyOf(mem)
32049 return true
32050 }
32051
32052
32053
32054 for {
32055 if v_0.Op != OpOffPtr {
32056 break
32057 }
32058 v_0_0 := v_0.Args[0]
32059 if v_0_0.Op != OpSelectN || auxIntToInt64(v_0_0.AuxInt) != 0 {
32060 break
32061 }
32062 call := v_0_0.Args[0]
32063 if call.Op != OpStaticLECall {
32064 break
32065 }
32066 x := v_1
32067 mem := v_2
32068 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isConstZero(x) && isMalloc(call.Aux)) {
32069 break
32070 }
32071 v.copyOf(mem)
32072 return true
32073 }
32074
32075
32076
32077 for {
32078 t1 := auxToType(v.Aux)
32079 op1 := v_0
32080 if op1.Op != OpOffPtr {
32081 break
32082 }
32083 o1 := auxIntToInt64(op1.AuxInt)
32084 p1 := op1.Args[0]
32085 d1 := v_1
32086 m2 := v_2
32087 if m2.Op != OpStore {
32088 break
32089 }
32090 t2 := auxToType(m2.Aux)
32091 _ = m2.Args[2]
32092 op2 := m2.Args[0]
32093 if op2.Op != OpOffPtr || auxIntToInt64(op2.AuxInt) != 0 {
32094 break
32095 }
32096 p2 := op2.Args[0]
32097 d2 := m2.Args[1]
32098 m3 := m2.Args[2]
32099 if m3.Op != OpMove {
32100 break
32101 }
32102 n := auxIntToInt64(m3.AuxInt)
32103 mem := m3.Args[2]
32104 p3 := m3.Args[0]
32105 if !(m2.Uses == 1 && m3.Uses == 1 && o1 == t2.Size() && n == t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2, m3)) {
32106 break
32107 }
32108 v.reset(OpStore)
32109 v.Aux = typeToAux(t1)
32110 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32111 v0.Aux = typeToAux(t2)
32112 v0.AddArg3(op2, d2, mem)
32113 v.AddArg3(op1, d1, v0)
32114 return true
32115 }
32116
32117
32118
32119 for {
32120 t1 := auxToType(v.Aux)
32121 op1 := v_0
32122 if op1.Op != OpOffPtr {
32123 break
32124 }
32125 o1 := auxIntToInt64(op1.AuxInt)
32126 p1 := op1.Args[0]
32127 d1 := v_1
32128 m2 := v_2
32129 if m2.Op != OpStore {
32130 break
32131 }
32132 t2 := auxToType(m2.Aux)
32133 _ = m2.Args[2]
32134 op2 := m2.Args[0]
32135 if op2.Op != OpOffPtr {
32136 break
32137 }
32138 o2 := auxIntToInt64(op2.AuxInt)
32139 p2 := op2.Args[0]
32140 d2 := m2.Args[1]
32141 m3 := m2.Args[2]
32142 if m3.Op != OpStore {
32143 break
32144 }
32145 t3 := auxToType(m3.Aux)
32146 _ = m3.Args[2]
32147 op3 := m3.Args[0]
32148 if op3.Op != OpOffPtr || auxIntToInt64(op3.AuxInt) != 0 {
32149 break
32150 }
32151 p3 := op3.Args[0]
32152 d3 := m3.Args[1]
32153 m4 := m3.Args[2]
32154 if m4.Op != OpMove {
32155 break
32156 }
32157 n := auxIntToInt64(m4.AuxInt)
32158 mem := m4.Args[2]
32159 p4 := m4.Args[0]
32160 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)) {
32161 break
32162 }
32163 v.reset(OpStore)
32164 v.Aux = typeToAux(t1)
32165 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32166 v0.Aux = typeToAux(t2)
32167 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32168 v1.Aux = typeToAux(t3)
32169 v1.AddArg3(op3, d3, mem)
32170 v0.AddArg3(op2, d2, v1)
32171 v.AddArg3(op1, d1, v0)
32172 return true
32173 }
32174
32175
32176
32177 for {
32178 t1 := auxToType(v.Aux)
32179 op1 := v_0
32180 if op1.Op != OpOffPtr {
32181 break
32182 }
32183 o1 := auxIntToInt64(op1.AuxInt)
32184 p1 := op1.Args[0]
32185 d1 := v_1
32186 m2 := v_2
32187 if m2.Op != OpStore {
32188 break
32189 }
32190 t2 := auxToType(m2.Aux)
32191 _ = m2.Args[2]
32192 op2 := m2.Args[0]
32193 if op2.Op != OpOffPtr {
32194 break
32195 }
32196 o2 := auxIntToInt64(op2.AuxInt)
32197 p2 := op2.Args[0]
32198 d2 := m2.Args[1]
32199 m3 := m2.Args[2]
32200 if m3.Op != OpStore {
32201 break
32202 }
32203 t3 := auxToType(m3.Aux)
32204 _ = m3.Args[2]
32205 op3 := m3.Args[0]
32206 if op3.Op != OpOffPtr {
32207 break
32208 }
32209 o3 := auxIntToInt64(op3.AuxInt)
32210 p3 := op3.Args[0]
32211 d3 := m3.Args[1]
32212 m4 := m3.Args[2]
32213 if m4.Op != OpStore {
32214 break
32215 }
32216 t4 := auxToType(m4.Aux)
32217 _ = m4.Args[2]
32218 op4 := m4.Args[0]
32219 if op4.Op != OpOffPtr || auxIntToInt64(op4.AuxInt) != 0 {
32220 break
32221 }
32222 p4 := op4.Args[0]
32223 d4 := m4.Args[1]
32224 m5 := m4.Args[2]
32225 if m5.Op != OpMove {
32226 break
32227 }
32228 n := auxIntToInt64(m5.AuxInt)
32229 mem := m5.Args[2]
32230 p5 := m5.Args[0]
32231 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)) {
32232 break
32233 }
32234 v.reset(OpStore)
32235 v.Aux = typeToAux(t1)
32236 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32237 v0.Aux = typeToAux(t2)
32238 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32239 v1.Aux = typeToAux(t3)
32240 v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32241 v2.Aux = typeToAux(t4)
32242 v2.AddArg3(op4, d4, mem)
32243 v1.AddArg3(op3, d3, v2)
32244 v0.AddArg3(op2, d2, v1)
32245 v.AddArg3(op1, d1, v0)
32246 return true
32247 }
32248
32249
32250
32251 for {
32252 t1 := auxToType(v.Aux)
32253 op1 := v_0
32254 if op1.Op != OpOffPtr {
32255 break
32256 }
32257 o1 := auxIntToInt64(op1.AuxInt)
32258 p1 := op1.Args[0]
32259 d1 := v_1
32260 m2 := v_2
32261 if m2.Op != OpStore {
32262 break
32263 }
32264 t2 := auxToType(m2.Aux)
32265 _ = m2.Args[2]
32266 op2 := m2.Args[0]
32267 if op2.Op != OpOffPtr || auxIntToInt64(op2.AuxInt) != 0 {
32268 break
32269 }
32270 p2 := op2.Args[0]
32271 d2 := m2.Args[1]
32272 m3 := m2.Args[2]
32273 if m3.Op != OpZero {
32274 break
32275 }
32276 n := auxIntToInt64(m3.AuxInt)
32277 mem := m3.Args[1]
32278 p3 := m3.Args[0]
32279 if !(m2.Uses == 1 && m3.Uses == 1 && o1 == t2.Size() && n == t2.Size()+t1.Size() && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2, m3)) {
32280 break
32281 }
32282 v.reset(OpStore)
32283 v.Aux = typeToAux(t1)
32284 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32285 v0.Aux = typeToAux(t2)
32286 v0.AddArg3(op2, d2, mem)
32287 v.AddArg3(op1, d1, v0)
32288 return true
32289 }
32290
32291
32292
32293 for {
32294 t1 := auxToType(v.Aux)
32295 op1 := v_0
32296 if op1.Op != OpOffPtr {
32297 break
32298 }
32299 o1 := auxIntToInt64(op1.AuxInt)
32300 p1 := op1.Args[0]
32301 d1 := v_1
32302 m2 := v_2
32303 if m2.Op != OpStore {
32304 break
32305 }
32306 t2 := auxToType(m2.Aux)
32307 _ = m2.Args[2]
32308 op2 := m2.Args[0]
32309 if op2.Op != OpOffPtr {
32310 break
32311 }
32312 o2 := auxIntToInt64(op2.AuxInt)
32313 p2 := op2.Args[0]
32314 d2 := m2.Args[1]
32315 m3 := m2.Args[2]
32316 if m3.Op != OpStore {
32317 break
32318 }
32319 t3 := auxToType(m3.Aux)
32320 _ = m3.Args[2]
32321 op3 := m3.Args[0]
32322 if op3.Op != OpOffPtr || auxIntToInt64(op3.AuxInt) != 0 {
32323 break
32324 }
32325 p3 := op3.Args[0]
32326 d3 := m3.Args[1]
32327 m4 := m3.Args[2]
32328 if m4.Op != OpZero {
32329 break
32330 }
32331 n := auxIntToInt64(m4.AuxInt)
32332 mem := m4.Args[1]
32333 p4 := m4.Args[0]
32334 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)) {
32335 break
32336 }
32337 v.reset(OpStore)
32338 v.Aux = typeToAux(t1)
32339 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32340 v0.Aux = typeToAux(t2)
32341 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32342 v1.Aux = typeToAux(t3)
32343 v1.AddArg3(op3, d3, mem)
32344 v0.AddArg3(op2, d2, v1)
32345 v.AddArg3(op1, d1, v0)
32346 return true
32347 }
32348
32349
32350
32351 for {
32352 t1 := auxToType(v.Aux)
32353 op1 := v_0
32354 if op1.Op != OpOffPtr {
32355 break
32356 }
32357 o1 := auxIntToInt64(op1.AuxInt)
32358 p1 := op1.Args[0]
32359 d1 := v_1
32360 m2 := v_2
32361 if m2.Op != OpStore {
32362 break
32363 }
32364 t2 := auxToType(m2.Aux)
32365 _ = m2.Args[2]
32366 op2 := m2.Args[0]
32367 if op2.Op != OpOffPtr {
32368 break
32369 }
32370 o2 := auxIntToInt64(op2.AuxInt)
32371 p2 := op2.Args[0]
32372 d2 := m2.Args[1]
32373 m3 := m2.Args[2]
32374 if m3.Op != OpStore {
32375 break
32376 }
32377 t3 := auxToType(m3.Aux)
32378 _ = m3.Args[2]
32379 op3 := m3.Args[0]
32380 if op3.Op != OpOffPtr {
32381 break
32382 }
32383 o3 := auxIntToInt64(op3.AuxInt)
32384 p3 := op3.Args[0]
32385 d3 := m3.Args[1]
32386 m4 := m3.Args[2]
32387 if m4.Op != OpStore {
32388 break
32389 }
32390 t4 := auxToType(m4.Aux)
32391 _ = m4.Args[2]
32392 op4 := m4.Args[0]
32393 if op4.Op != OpOffPtr || auxIntToInt64(op4.AuxInt) != 0 {
32394 break
32395 }
32396 p4 := op4.Args[0]
32397 d4 := m4.Args[1]
32398 m5 := m4.Args[2]
32399 if m5.Op != OpZero {
32400 break
32401 }
32402 n := auxIntToInt64(m5.AuxInt)
32403 mem := m5.Args[1]
32404 p5 := m5.Args[0]
32405 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)) {
32406 break
32407 }
32408 v.reset(OpStore)
32409 v.Aux = typeToAux(t1)
32410 v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32411 v0.Aux = typeToAux(t2)
32412 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32413 v1.Aux = typeToAux(t3)
32414 v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem)
32415 v2.Aux = typeToAux(t4)
32416 v2.AddArg3(op4, d4, mem)
32417 v1.AddArg3(op3, d3, v2)
32418 v0.AddArg3(op2, d2, v1)
32419 v.AddArg3(op1, d1, v0)
32420 return true
32421 }
32422 return false
32423 }
32424 func rewriteValuegeneric_OpStringLen(v *Value) bool {
32425 v_0 := v.Args[0]
32426
32427
32428 for {
32429 if v_0.Op != OpStringMake {
32430 break
32431 }
32432 _ = v_0.Args[1]
32433 v_0_1 := v_0.Args[1]
32434 if v_0_1.Op != OpConst64 {
32435 break
32436 }
32437 t := v_0_1.Type
32438 c := auxIntToInt64(v_0_1.AuxInt)
32439 v.reset(OpConst64)
32440 v.Type = t
32441 v.AuxInt = int64ToAuxInt(c)
32442 return true
32443 }
32444 return false
32445 }
32446 func rewriteValuegeneric_OpStringPtr(v *Value) bool {
32447 v_0 := v.Args[0]
32448
32449
32450 for {
32451 if v_0.Op != OpStringMake {
32452 break
32453 }
32454 v_0_0 := v_0.Args[0]
32455 if v_0_0.Op != OpAddr {
32456 break
32457 }
32458 t := v_0_0.Type
32459 s := auxToSym(v_0_0.Aux)
32460 base := v_0_0.Args[0]
32461 v.reset(OpAddr)
32462 v.Type = t
32463 v.Aux = symToAux(s)
32464 v.AddArg(base)
32465 return true
32466 }
32467 return false
32468 }
32469 func rewriteValuegeneric_OpStructSelect(v *Value) bool {
32470 v_0 := v.Args[0]
32471 b := v.Block
32472
32473
32474 for {
32475 i := auxIntToInt64(v.AuxInt)
32476 x := v_0
32477 if x.Op != OpStructMake {
32478 break
32479 }
32480 v.copyOf(x.Args[i])
32481 return true
32482 }
32483
32484
32485
32486 for {
32487 i := auxIntToInt64(v.AuxInt)
32488 x := v_0
32489 if x.Op != OpLoad {
32490 break
32491 }
32492 t := x.Type
32493 mem := x.Args[1]
32494 ptr := x.Args[0]
32495 if !(!CanSSA(t)) {
32496 break
32497 }
32498 b = x.Block
32499 v0 := b.NewValue0(v.Pos, OpLoad, v.Type)
32500 v.copyOf(v0)
32501 v1 := b.NewValue0(v.Pos, OpOffPtr, v.Type.PtrTo())
32502 v1.AuxInt = int64ToAuxInt(t.FieldOff(int(i)))
32503 v1.AddArg(ptr)
32504 v0.AddArg2(v1, mem)
32505 return true
32506 }
32507
32508
32509
32510 for {
32511 if v_0.Op != OpIData {
32512 break
32513 }
32514 x := v_0.Args[0]
32515 if !(v.Type.Size() > 0) {
32516 break
32517 }
32518 v.reset(OpIData)
32519 v.AddArg(x)
32520 return true
32521 }
32522
32523
32524
32525 for {
32526 if v_0.Op != OpIData {
32527 break
32528 }
32529 if !(v.Type.Size() == 0 && v.Type.IsStruct()) {
32530 break
32531 }
32532 v.reset(OpStructMake)
32533 return true
32534 }
32535
32536
32537
32538 for {
32539 if v_0.Op != OpIData {
32540 break
32541 }
32542 if !(v.Type.Size() == 0 && v.Type.IsArray()) {
32543 break
32544 }
32545 v.reset(OpArrayMake0)
32546 return true
32547 }
32548 return false
32549 }
32550 func rewriteValuegeneric_OpSub16(v *Value) bool {
32551 v_1 := v.Args[1]
32552 v_0 := v.Args[0]
32553 b := v.Block
32554
32555
32556 for {
32557 if v_0.Op != OpConst16 {
32558 break
32559 }
32560 c := auxIntToInt16(v_0.AuxInt)
32561 if v_1.Op != OpConst16 {
32562 break
32563 }
32564 d := auxIntToInt16(v_1.AuxInt)
32565 v.reset(OpConst16)
32566 v.AuxInt = int16ToAuxInt(c - d)
32567 return true
32568 }
32569
32570
32571
32572 for {
32573 x := v_0
32574 if v_1.Op != OpConst16 {
32575 break
32576 }
32577 t := v_1.Type
32578 c := auxIntToInt16(v_1.AuxInt)
32579 if !(x.Op != OpConst16) {
32580 break
32581 }
32582 v.reset(OpAdd16)
32583 v0 := b.NewValue0(v.Pos, OpConst16, t)
32584 v0.AuxInt = int16ToAuxInt(-c)
32585 v.AddArg2(v0, x)
32586 return true
32587 }
32588
32589
32590 for {
32591 t := v.Type
32592 if v_0.Op != OpMul16 {
32593 break
32594 }
32595 _ = v_0.Args[1]
32596 v_0_0 := v_0.Args[0]
32597 v_0_1 := v_0.Args[1]
32598 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32599 x := v_0_0
32600 y := v_0_1
32601 if v_1.Op != OpMul16 {
32602 continue
32603 }
32604 _ = v_1.Args[1]
32605 v_1_0 := v_1.Args[0]
32606 v_1_1 := v_1.Args[1]
32607 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
32608 if x != v_1_0 {
32609 continue
32610 }
32611 z := v_1_1
32612 v.reset(OpMul16)
32613 v0 := b.NewValue0(v.Pos, OpSub16, t)
32614 v0.AddArg2(y, z)
32615 v.AddArg2(x, v0)
32616 return true
32617 }
32618 }
32619 break
32620 }
32621
32622
32623 for {
32624 x := v_0
32625 if x != v_1 {
32626 break
32627 }
32628 v.reset(OpConst16)
32629 v.AuxInt = int16ToAuxInt(0)
32630 return true
32631 }
32632
32633
32634 for {
32635 if v_0.Op != OpNeg16 {
32636 break
32637 }
32638 x := v_0.Args[0]
32639 if v_1.Op != OpCom16 || x != v_1.Args[0] {
32640 break
32641 }
32642 v.reset(OpConst16)
32643 v.AuxInt = int16ToAuxInt(1)
32644 return true
32645 }
32646
32647
32648 for {
32649 if v_0.Op != OpCom16 {
32650 break
32651 }
32652 x := v_0.Args[0]
32653 if v_1.Op != OpNeg16 || x != v_1.Args[0] {
32654 break
32655 }
32656 v.reset(OpConst16)
32657 v.AuxInt = int16ToAuxInt(-1)
32658 return true
32659 }
32660
32661
32662 for {
32663 if v_0.Op != OpAdd16 {
32664 break
32665 }
32666 _ = v_0.Args[1]
32667 v_0_0 := v_0.Args[0]
32668 v_0_1 := v_0.Args[1]
32669 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32670 t := v_0_0
32671 x := v_0_1
32672 if v_1.Op != OpAdd16 {
32673 continue
32674 }
32675 _ = v_1.Args[1]
32676 v_1_0 := v_1.Args[0]
32677 v_1_1 := v_1.Args[1]
32678 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
32679 if t != v_1_0 {
32680 continue
32681 }
32682 y := v_1_1
32683 v.reset(OpSub16)
32684 v.AddArg2(x, y)
32685 return true
32686 }
32687 }
32688 break
32689 }
32690
32691
32692 for {
32693 if v_0.Op != OpAdd16 {
32694 break
32695 }
32696 _ = v_0.Args[1]
32697 v_0_0 := v_0.Args[0]
32698 v_0_1 := v_0.Args[1]
32699 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32700 x := v_0_0
32701 y := v_0_1
32702 if x != v_1 {
32703 continue
32704 }
32705 v.copyOf(y)
32706 return true
32707 }
32708 break
32709 }
32710
32711
32712 for {
32713 if v_0.Op != OpAdd16 {
32714 break
32715 }
32716 _ = v_0.Args[1]
32717 v_0_0 := v_0.Args[0]
32718 v_0_1 := v_0.Args[1]
32719 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32720 x := v_0_0
32721 y := v_0_1
32722 if y != v_1 {
32723 continue
32724 }
32725 v.copyOf(x)
32726 return true
32727 }
32728 break
32729 }
32730
32731
32732 for {
32733 if v_0.Op != OpSub16 {
32734 break
32735 }
32736 y := v_0.Args[1]
32737 x := v_0.Args[0]
32738 if x != v_1 {
32739 break
32740 }
32741 v.reset(OpNeg16)
32742 v.AddArg(y)
32743 return true
32744 }
32745
32746
32747 for {
32748 x := v_0
32749 if v_1.Op != OpAdd16 {
32750 break
32751 }
32752 _ = v_1.Args[1]
32753 v_1_0 := v_1.Args[0]
32754 v_1_1 := v_1.Args[1]
32755 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
32756 if x != v_1_0 {
32757 continue
32758 }
32759 y := v_1_1
32760 v.reset(OpNeg16)
32761 v.AddArg(y)
32762 return true
32763 }
32764 break
32765 }
32766
32767
32768
32769 for {
32770 x := v_0
32771 if v_1.Op != OpSub16 {
32772 break
32773 }
32774 z := v_1.Args[1]
32775 i := v_1.Args[0]
32776 if i.Op != OpConst16 {
32777 break
32778 }
32779 t := i.Type
32780 if !(z.Op != OpConst16 && x.Op != OpConst16) {
32781 break
32782 }
32783 v.reset(OpSub16)
32784 v0 := b.NewValue0(v.Pos, OpAdd16, t)
32785 v0.AddArg2(x, z)
32786 v.AddArg2(v0, i)
32787 return true
32788 }
32789
32790
32791
32792 for {
32793 x := v_0
32794 if v_1.Op != OpAdd16 {
32795 break
32796 }
32797 _ = v_1.Args[1]
32798 v_1_0 := v_1.Args[0]
32799 v_1_1 := v_1.Args[1]
32800 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
32801 z := v_1_0
32802 i := v_1_1
32803 if i.Op != OpConst16 {
32804 continue
32805 }
32806 t := i.Type
32807 if !(z.Op != OpConst16 && x.Op != OpConst16) {
32808 continue
32809 }
32810 v.reset(OpSub16)
32811 v0 := b.NewValue0(v.Pos, OpSub16, t)
32812 v0.AddArg2(x, z)
32813 v.AddArg2(v0, i)
32814 return true
32815 }
32816 break
32817 }
32818
32819
32820
32821 for {
32822 if v_0.Op != OpSub16 {
32823 break
32824 }
32825 z := v_0.Args[1]
32826 i := v_0.Args[0]
32827 if i.Op != OpConst16 {
32828 break
32829 }
32830 t := i.Type
32831 x := v_1
32832 if !(z.Op != OpConst16 && x.Op != OpConst16) {
32833 break
32834 }
32835 v.reset(OpSub16)
32836 v0 := b.NewValue0(v.Pos, OpAdd16, t)
32837 v0.AddArg2(z, x)
32838 v.AddArg2(i, v0)
32839 return true
32840 }
32841
32842
32843
32844 for {
32845 if v_0.Op != OpAdd16 {
32846 break
32847 }
32848 _ = v_0.Args[1]
32849 v_0_0 := v_0.Args[0]
32850 v_0_1 := v_0.Args[1]
32851 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32852 z := v_0_0
32853 i := v_0_1
32854 if i.Op != OpConst16 {
32855 continue
32856 }
32857 t := i.Type
32858 x := v_1
32859 if !(z.Op != OpConst16 && x.Op != OpConst16) {
32860 continue
32861 }
32862 v.reset(OpAdd16)
32863 v0 := b.NewValue0(v.Pos, OpSub16, t)
32864 v0.AddArg2(z, x)
32865 v.AddArg2(i, v0)
32866 return true
32867 }
32868 break
32869 }
32870
32871
32872 for {
32873 if v_0.Op != OpConst16 {
32874 break
32875 }
32876 t := v_0.Type
32877 c := auxIntToInt16(v_0.AuxInt)
32878 if v_1.Op != OpSub16 {
32879 break
32880 }
32881 x := v_1.Args[1]
32882 v_1_0 := v_1.Args[0]
32883 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
32884 break
32885 }
32886 d := auxIntToInt16(v_1_0.AuxInt)
32887 v.reset(OpAdd16)
32888 v0 := b.NewValue0(v.Pos, OpConst16, t)
32889 v0.AuxInt = int16ToAuxInt(c - d)
32890 v.AddArg2(v0, x)
32891 return true
32892 }
32893
32894
32895 for {
32896 if v_0.Op != OpConst16 {
32897 break
32898 }
32899 t := v_0.Type
32900 c := auxIntToInt16(v_0.AuxInt)
32901 if v_1.Op != OpAdd16 {
32902 break
32903 }
32904 _ = v_1.Args[1]
32905 v_1_0 := v_1.Args[0]
32906 v_1_1 := v_1.Args[1]
32907 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
32908 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
32909 continue
32910 }
32911 d := auxIntToInt16(v_1_0.AuxInt)
32912 x := v_1_1
32913 v.reset(OpSub16)
32914 v0 := b.NewValue0(v.Pos, OpConst16, t)
32915 v0.AuxInt = int16ToAuxInt(c - d)
32916 v.AddArg2(v0, x)
32917 return true
32918 }
32919 break
32920 }
32921 return false
32922 }
32923 func rewriteValuegeneric_OpSub32(v *Value) bool {
32924 v_1 := v.Args[1]
32925 v_0 := v.Args[0]
32926 b := v.Block
32927
32928
32929 for {
32930 if v_0.Op != OpConst32 {
32931 break
32932 }
32933 c := auxIntToInt32(v_0.AuxInt)
32934 if v_1.Op != OpConst32 {
32935 break
32936 }
32937 d := auxIntToInt32(v_1.AuxInt)
32938 v.reset(OpConst32)
32939 v.AuxInt = int32ToAuxInt(c - d)
32940 return true
32941 }
32942
32943
32944
32945 for {
32946 x := v_0
32947 if v_1.Op != OpConst32 {
32948 break
32949 }
32950 t := v_1.Type
32951 c := auxIntToInt32(v_1.AuxInt)
32952 if !(x.Op != OpConst32) {
32953 break
32954 }
32955 v.reset(OpAdd32)
32956 v0 := b.NewValue0(v.Pos, OpConst32, t)
32957 v0.AuxInt = int32ToAuxInt(-c)
32958 v.AddArg2(v0, x)
32959 return true
32960 }
32961
32962
32963 for {
32964 t := v.Type
32965 if v_0.Op != OpMul32 {
32966 break
32967 }
32968 _ = v_0.Args[1]
32969 v_0_0 := v_0.Args[0]
32970 v_0_1 := v_0.Args[1]
32971 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
32972 x := v_0_0
32973 y := v_0_1
32974 if v_1.Op != OpMul32 {
32975 continue
32976 }
32977 _ = v_1.Args[1]
32978 v_1_0 := v_1.Args[0]
32979 v_1_1 := v_1.Args[1]
32980 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
32981 if x != v_1_0 {
32982 continue
32983 }
32984 z := v_1_1
32985 v.reset(OpMul32)
32986 v0 := b.NewValue0(v.Pos, OpSub32, t)
32987 v0.AddArg2(y, z)
32988 v.AddArg2(x, v0)
32989 return true
32990 }
32991 }
32992 break
32993 }
32994
32995
32996 for {
32997 x := v_0
32998 if x != v_1 {
32999 break
33000 }
33001 v.reset(OpConst32)
33002 v.AuxInt = int32ToAuxInt(0)
33003 return true
33004 }
33005
33006
33007 for {
33008 if v_0.Op != OpNeg32 {
33009 break
33010 }
33011 x := v_0.Args[0]
33012 if v_1.Op != OpCom32 || x != v_1.Args[0] {
33013 break
33014 }
33015 v.reset(OpConst32)
33016 v.AuxInt = int32ToAuxInt(1)
33017 return true
33018 }
33019
33020
33021 for {
33022 if v_0.Op != OpCom32 {
33023 break
33024 }
33025 x := v_0.Args[0]
33026 if v_1.Op != OpNeg32 || x != v_1.Args[0] {
33027 break
33028 }
33029 v.reset(OpConst32)
33030 v.AuxInt = int32ToAuxInt(-1)
33031 return true
33032 }
33033
33034
33035 for {
33036 if v_0.Op != OpAdd32 {
33037 break
33038 }
33039 _ = v_0.Args[1]
33040 v_0_0 := v_0.Args[0]
33041 v_0_1 := v_0.Args[1]
33042 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33043 t := v_0_0
33044 x := v_0_1
33045 if v_1.Op != OpAdd32 {
33046 continue
33047 }
33048 _ = v_1.Args[1]
33049 v_1_0 := v_1.Args[0]
33050 v_1_1 := v_1.Args[1]
33051 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33052 if t != v_1_0 {
33053 continue
33054 }
33055 y := v_1_1
33056 v.reset(OpSub32)
33057 v.AddArg2(x, y)
33058 return true
33059 }
33060 }
33061 break
33062 }
33063
33064
33065 for {
33066 if v_0.Op != OpAdd32 {
33067 break
33068 }
33069 _ = v_0.Args[1]
33070 v_0_0 := v_0.Args[0]
33071 v_0_1 := v_0.Args[1]
33072 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33073 x := v_0_0
33074 y := v_0_1
33075 if x != v_1 {
33076 continue
33077 }
33078 v.copyOf(y)
33079 return true
33080 }
33081 break
33082 }
33083
33084
33085 for {
33086 if v_0.Op != OpAdd32 {
33087 break
33088 }
33089 _ = v_0.Args[1]
33090 v_0_0 := v_0.Args[0]
33091 v_0_1 := v_0.Args[1]
33092 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33093 x := v_0_0
33094 y := v_0_1
33095 if y != v_1 {
33096 continue
33097 }
33098 v.copyOf(x)
33099 return true
33100 }
33101 break
33102 }
33103
33104
33105 for {
33106 if v_0.Op != OpSub32 {
33107 break
33108 }
33109 y := v_0.Args[1]
33110 x := v_0.Args[0]
33111 if x != v_1 {
33112 break
33113 }
33114 v.reset(OpNeg32)
33115 v.AddArg(y)
33116 return true
33117 }
33118
33119
33120 for {
33121 x := v_0
33122 if v_1.Op != OpAdd32 {
33123 break
33124 }
33125 _ = v_1.Args[1]
33126 v_1_0 := v_1.Args[0]
33127 v_1_1 := v_1.Args[1]
33128 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33129 if x != v_1_0 {
33130 continue
33131 }
33132 y := v_1_1
33133 v.reset(OpNeg32)
33134 v.AddArg(y)
33135 return true
33136 }
33137 break
33138 }
33139
33140
33141
33142 for {
33143 x := v_0
33144 if v_1.Op != OpSub32 {
33145 break
33146 }
33147 z := v_1.Args[1]
33148 i := v_1.Args[0]
33149 if i.Op != OpConst32 {
33150 break
33151 }
33152 t := i.Type
33153 if !(z.Op != OpConst32 && x.Op != OpConst32) {
33154 break
33155 }
33156 v.reset(OpSub32)
33157 v0 := b.NewValue0(v.Pos, OpAdd32, t)
33158 v0.AddArg2(x, z)
33159 v.AddArg2(v0, i)
33160 return true
33161 }
33162
33163
33164
33165 for {
33166 x := v_0
33167 if v_1.Op != OpAdd32 {
33168 break
33169 }
33170 _ = v_1.Args[1]
33171 v_1_0 := v_1.Args[0]
33172 v_1_1 := v_1.Args[1]
33173 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33174 z := v_1_0
33175 i := v_1_1
33176 if i.Op != OpConst32 {
33177 continue
33178 }
33179 t := i.Type
33180 if !(z.Op != OpConst32 && x.Op != OpConst32) {
33181 continue
33182 }
33183 v.reset(OpSub32)
33184 v0 := b.NewValue0(v.Pos, OpSub32, t)
33185 v0.AddArg2(x, z)
33186 v.AddArg2(v0, i)
33187 return true
33188 }
33189 break
33190 }
33191
33192
33193
33194 for {
33195 if v_0.Op != OpSub32 {
33196 break
33197 }
33198 z := v_0.Args[1]
33199 i := v_0.Args[0]
33200 if i.Op != OpConst32 {
33201 break
33202 }
33203 t := i.Type
33204 x := v_1
33205 if !(z.Op != OpConst32 && x.Op != OpConst32) {
33206 break
33207 }
33208 v.reset(OpSub32)
33209 v0 := b.NewValue0(v.Pos, OpAdd32, t)
33210 v0.AddArg2(z, x)
33211 v.AddArg2(i, v0)
33212 return true
33213 }
33214
33215
33216
33217 for {
33218 if v_0.Op != OpAdd32 {
33219 break
33220 }
33221 _ = v_0.Args[1]
33222 v_0_0 := v_0.Args[0]
33223 v_0_1 := v_0.Args[1]
33224 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33225 z := v_0_0
33226 i := v_0_1
33227 if i.Op != OpConst32 {
33228 continue
33229 }
33230 t := i.Type
33231 x := v_1
33232 if !(z.Op != OpConst32 && x.Op != OpConst32) {
33233 continue
33234 }
33235 v.reset(OpAdd32)
33236 v0 := b.NewValue0(v.Pos, OpSub32, t)
33237 v0.AddArg2(z, x)
33238 v.AddArg2(i, v0)
33239 return true
33240 }
33241 break
33242 }
33243
33244
33245 for {
33246 if v_0.Op != OpConst32 {
33247 break
33248 }
33249 t := v_0.Type
33250 c := auxIntToInt32(v_0.AuxInt)
33251 if v_1.Op != OpSub32 {
33252 break
33253 }
33254 x := v_1.Args[1]
33255 v_1_0 := v_1.Args[0]
33256 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
33257 break
33258 }
33259 d := auxIntToInt32(v_1_0.AuxInt)
33260 v.reset(OpAdd32)
33261 v0 := b.NewValue0(v.Pos, OpConst32, t)
33262 v0.AuxInt = int32ToAuxInt(c - d)
33263 v.AddArg2(v0, x)
33264 return true
33265 }
33266
33267
33268 for {
33269 if v_0.Op != OpConst32 {
33270 break
33271 }
33272 t := v_0.Type
33273 c := auxIntToInt32(v_0.AuxInt)
33274 if v_1.Op != OpAdd32 {
33275 break
33276 }
33277 _ = v_1.Args[1]
33278 v_1_0 := v_1.Args[0]
33279 v_1_1 := v_1.Args[1]
33280 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33281 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
33282 continue
33283 }
33284 d := auxIntToInt32(v_1_0.AuxInt)
33285 x := v_1_1
33286 v.reset(OpSub32)
33287 v0 := b.NewValue0(v.Pos, OpConst32, t)
33288 v0.AuxInt = int32ToAuxInt(c - d)
33289 v.AddArg2(v0, x)
33290 return true
33291 }
33292 break
33293 }
33294 return false
33295 }
33296 func rewriteValuegeneric_OpSub32F(v *Value) bool {
33297 v_1 := v.Args[1]
33298 v_0 := v.Args[0]
33299
33300
33301
33302 for {
33303 if v_0.Op != OpConst32F {
33304 break
33305 }
33306 c := auxIntToFloat32(v_0.AuxInt)
33307 if v_1.Op != OpConst32F {
33308 break
33309 }
33310 d := auxIntToFloat32(v_1.AuxInt)
33311 if !(c-d == c-d) {
33312 break
33313 }
33314 v.reset(OpConst32F)
33315 v.AuxInt = float32ToAuxInt(c - d)
33316 return true
33317 }
33318 return false
33319 }
33320 func rewriteValuegeneric_OpSub64(v *Value) bool {
33321 v_1 := v.Args[1]
33322 v_0 := v.Args[0]
33323 b := v.Block
33324
33325
33326 for {
33327 if v_0.Op != OpConst64 {
33328 break
33329 }
33330 c := auxIntToInt64(v_0.AuxInt)
33331 if v_1.Op != OpConst64 {
33332 break
33333 }
33334 d := auxIntToInt64(v_1.AuxInt)
33335 v.reset(OpConst64)
33336 v.AuxInt = int64ToAuxInt(c - d)
33337 return true
33338 }
33339
33340
33341
33342 for {
33343 x := v_0
33344 if v_1.Op != OpConst64 {
33345 break
33346 }
33347 t := v_1.Type
33348 c := auxIntToInt64(v_1.AuxInt)
33349 if !(x.Op != OpConst64) {
33350 break
33351 }
33352 v.reset(OpAdd64)
33353 v0 := b.NewValue0(v.Pos, OpConst64, t)
33354 v0.AuxInt = int64ToAuxInt(-c)
33355 v.AddArg2(v0, x)
33356 return true
33357 }
33358
33359
33360 for {
33361 t := v.Type
33362 if v_0.Op != OpMul64 {
33363 break
33364 }
33365 _ = v_0.Args[1]
33366 v_0_0 := v_0.Args[0]
33367 v_0_1 := v_0.Args[1]
33368 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33369 x := v_0_0
33370 y := v_0_1
33371 if v_1.Op != OpMul64 {
33372 continue
33373 }
33374 _ = v_1.Args[1]
33375 v_1_0 := v_1.Args[0]
33376 v_1_1 := v_1.Args[1]
33377 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33378 if x != v_1_0 {
33379 continue
33380 }
33381 z := v_1_1
33382 v.reset(OpMul64)
33383 v0 := b.NewValue0(v.Pos, OpSub64, t)
33384 v0.AddArg2(y, z)
33385 v.AddArg2(x, v0)
33386 return true
33387 }
33388 }
33389 break
33390 }
33391
33392
33393 for {
33394 x := v_0
33395 if x != v_1 {
33396 break
33397 }
33398 v.reset(OpConst64)
33399 v.AuxInt = int64ToAuxInt(0)
33400 return true
33401 }
33402
33403
33404 for {
33405 if v_0.Op != OpNeg64 {
33406 break
33407 }
33408 x := v_0.Args[0]
33409 if v_1.Op != OpCom64 || x != v_1.Args[0] {
33410 break
33411 }
33412 v.reset(OpConst64)
33413 v.AuxInt = int64ToAuxInt(1)
33414 return true
33415 }
33416
33417
33418 for {
33419 if v_0.Op != OpCom64 {
33420 break
33421 }
33422 x := v_0.Args[0]
33423 if v_1.Op != OpNeg64 || x != v_1.Args[0] {
33424 break
33425 }
33426 v.reset(OpConst64)
33427 v.AuxInt = int64ToAuxInt(-1)
33428 return true
33429 }
33430
33431
33432 for {
33433 if v_0.Op != OpAdd64 {
33434 break
33435 }
33436 _ = v_0.Args[1]
33437 v_0_0 := v_0.Args[0]
33438 v_0_1 := v_0.Args[1]
33439 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33440 t := v_0_0
33441 x := v_0_1
33442 if v_1.Op != OpAdd64 {
33443 continue
33444 }
33445 _ = v_1.Args[1]
33446 v_1_0 := v_1.Args[0]
33447 v_1_1 := v_1.Args[1]
33448 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33449 if t != v_1_0 {
33450 continue
33451 }
33452 y := v_1_1
33453 v.reset(OpSub64)
33454 v.AddArg2(x, y)
33455 return true
33456 }
33457 }
33458 break
33459 }
33460
33461
33462 for {
33463 if v_0.Op != OpAdd64 {
33464 break
33465 }
33466 _ = v_0.Args[1]
33467 v_0_0 := v_0.Args[0]
33468 v_0_1 := v_0.Args[1]
33469 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33470 x := v_0_0
33471 y := v_0_1
33472 if x != v_1 {
33473 continue
33474 }
33475 v.copyOf(y)
33476 return true
33477 }
33478 break
33479 }
33480
33481
33482 for {
33483 if v_0.Op != OpAdd64 {
33484 break
33485 }
33486 _ = v_0.Args[1]
33487 v_0_0 := v_0.Args[0]
33488 v_0_1 := v_0.Args[1]
33489 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33490 x := v_0_0
33491 y := v_0_1
33492 if y != v_1 {
33493 continue
33494 }
33495 v.copyOf(x)
33496 return true
33497 }
33498 break
33499 }
33500
33501
33502 for {
33503 if v_0.Op != OpSub64 {
33504 break
33505 }
33506 y := v_0.Args[1]
33507 x := v_0.Args[0]
33508 if x != v_1 {
33509 break
33510 }
33511 v.reset(OpNeg64)
33512 v.AddArg(y)
33513 return true
33514 }
33515
33516
33517 for {
33518 x := v_0
33519 if v_1.Op != OpAdd64 {
33520 break
33521 }
33522 _ = v_1.Args[1]
33523 v_1_0 := v_1.Args[0]
33524 v_1_1 := v_1.Args[1]
33525 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33526 if x != v_1_0 {
33527 continue
33528 }
33529 y := v_1_1
33530 v.reset(OpNeg64)
33531 v.AddArg(y)
33532 return true
33533 }
33534 break
33535 }
33536
33537
33538
33539 for {
33540 x := v_0
33541 if v_1.Op != OpSub64 {
33542 break
33543 }
33544 z := v_1.Args[1]
33545 i := v_1.Args[0]
33546 if i.Op != OpConst64 {
33547 break
33548 }
33549 t := i.Type
33550 if !(z.Op != OpConst64 && x.Op != OpConst64) {
33551 break
33552 }
33553 v.reset(OpSub64)
33554 v0 := b.NewValue0(v.Pos, OpAdd64, t)
33555 v0.AddArg2(x, z)
33556 v.AddArg2(v0, i)
33557 return true
33558 }
33559
33560
33561
33562 for {
33563 x := v_0
33564 if v_1.Op != OpAdd64 {
33565 break
33566 }
33567 _ = v_1.Args[1]
33568 v_1_0 := v_1.Args[0]
33569 v_1_1 := v_1.Args[1]
33570 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33571 z := v_1_0
33572 i := v_1_1
33573 if i.Op != OpConst64 {
33574 continue
33575 }
33576 t := i.Type
33577 if !(z.Op != OpConst64 && x.Op != OpConst64) {
33578 continue
33579 }
33580 v.reset(OpSub64)
33581 v0 := b.NewValue0(v.Pos, OpSub64, t)
33582 v0.AddArg2(x, z)
33583 v.AddArg2(v0, i)
33584 return true
33585 }
33586 break
33587 }
33588
33589
33590
33591 for {
33592 if v_0.Op != OpSub64 {
33593 break
33594 }
33595 z := v_0.Args[1]
33596 i := v_0.Args[0]
33597 if i.Op != OpConst64 {
33598 break
33599 }
33600 t := i.Type
33601 x := v_1
33602 if !(z.Op != OpConst64 && x.Op != OpConst64) {
33603 break
33604 }
33605 v.reset(OpSub64)
33606 v0 := b.NewValue0(v.Pos, OpAdd64, t)
33607 v0.AddArg2(z, x)
33608 v.AddArg2(i, v0)
33609 return true
33610 }
33611
33612
33613
33614 for {
33615 if v_0.Op != OpAdd64 {
33616 break
33617 }
33618 _ = v_0.Args[1]
33619 v_0_0 := v_0.Args[0]
33620 v_0_1 := v_0.Args[1]
33621 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33622 z := v_0_0
33623 i := v_0_1
33624 if i.Op != OpConst64 {
33625 continue
33626 }
33627 t := i.Type
33628 x := v_1
33629 if !(z.Op != OpConst64 && x.Op != OpConst64) {
33630 continue
33631 }
33632 v.reset(OpAdd64)
33633 v0 := b.NewValue0(v.Pos, OpSub64, t)
33634 v0.AddArg2(z, x)
33635 v.AddArg2(i, v0)
33636 return true
33637 }
33638 break
33639 }
33640
33641
33642 for {
33643 if v_0.Op != OpConst64 {
33644 break
33645 }
33646 t := v_0.Type
33647 c := auxIntToInt64(v_0.AuxInt)
33648 if v_1.Op != OpSub64 {
33649 break
33650 }
33651 x := v_1.Args[1]
33652 v_1_0 := v_1.Args[0]
33653 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
33654 break
33655 }
33656 d := auxIntToInt64(v_1_0.AuxInt)
33657 v.reset(OpAdd64)
33658 v0 := b.NewValue0(v.Pos, OpConst64, t)
33659 v0.AuxInt = int64ToAuxInt(c - d)
33660 v.AddArg2(v0, x)
33661 return true
33662 }
33663
33664
33665 for {
33666 if v_0.Op != OpConst64 {
33667 break
33668 }
33669 t := v_0.Type
33670 c := auxIntToInt64(v_0.AuxInt)
33671 if v_1.Op != OpAdd64 {
33672 break
33673 }
33674 _ = v_1.Args[1]
33675 v_1_0 := v_1.Args[0]
33676 v_1_1 := v_1.Args[1]
33677 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33678 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
33679 continue
33680 }
33681 d := auxIntToInt64(v_1_0.AuxInt)
33682 x := v_1_1
33683 v.reset(OpSub64)
33684 v0 := b.NewValue0(v.Pos, OpConst64, t)
33685 v0.AuxInt = int64ToAuxInt(c - d)
33686 v.AddArg2(v0, x)
33687 return true
33688 }
33689 break
33690 }
33691 return false
33692 }
33693 func rewriteValuegeneric_OpSub64F(v *Value) bool {
33694 v_1 := v.Args[1]
33695 v_0 := v.Args[0]
33696
33697
33698
33699 for {
33700 if v_0.Op != OpConst64F {
33701 break
33702 }
33703 c := auxIntToFloat64(v_0.AuxInt)
33704 if v_1.Op != OpConst64F {
33705 break
33706 }
33707 d := auxIntToFloat64(v_1.AuxInt)
33708 if !(c-d == c-d) {
33709 break
33710 }
33711 v.reset(OpConst64F)
33712 v.AuxInt = float64ToAuxInt(c - d)
33713 return true
33714 }
33715 return false
33716 }
33717 func rewriteValuegeneric_OpSub8(v *Value) bool {
33718 v_1 := v.Args[1]
33719 v_0 := v.Args[0]
33720 b := v.Block
33721
33722
33723 for {
33724 if v_0.Op != OpConst8 {
33725 break
33726 }
33727 c := auxIntToInt8(v_0.AuxInt)
33728 if v_1.Op != OpConst8 {
33729 break
33730 }
33731 d := auxIntToInt8(v_1.AuxInt)
33732 v.reset(OpConst8)
33733 v.AuxInt = int8ToAuxInt(c - d)
33734 return true
33735 }
33736
33737
33738
33739 for {
33740 x := v_0
33741 if v_1.Op != OpConst8 {
33742 break
33743 }
33744 t := v_1.Type
33745 c := auxIntToInt8(v_1.AuxInt)
33746 if !(x.Op != OpConst8) {
33747 break
33748 }
33749 v.reset(OpAdd8)
33750 v0 := b.NewValue0(v.Pos, OpConst8, t)
33751 v0.AuxInt = int8ToAuxInt(-c)
33752 v.AddArg2(v0, x)
33753 return true
33754 }
33755
33756
33757 for {
33758 t := v.Type
33759 if v_0.Op != OpMul8 {
33760 break
33761 }
33762 _ = v_0.Args[1]
33763 v_0_0 := v_0.Args[0]
33764 v_0_1 := v_0.Args[1]
33765 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33766 x := v_0_0
33767 y := v_0_1
33768 if v_1.Op != OpMul8 {
33769 continue
33770 }
33771 _ = v_1.Args[1]
33772 v_1_0 := v_1.Args[0]
33773 v_1_1 := v_1.Args[1]
33774 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33775 if x != v_1_0 {
33776 continue
33777 }
33778 z := v_1_1
33779 v.reset(OpMul8)
33780 v0 := b.NewValue0(v.Pos, OpSub8, t)
33781 v0.AddArg2(y, z)
33782 v.AddArg2(x, v0)
33783 return true
33784 }
33785 }
33786 break
33787 }
33788
33789
33790 for {
33791 x := v_0
33792 if x != v_1 {
33793 break
33794 }
33795 v.reset(OpConst8)
33796 v.AuxInt = int8ToAuxInt(0)
33797 return true
33798 }
33799
33800
33801 for {
33802 if v_0.Op != OpNeg8 {
33803 break
33804 }
33805 x := v_0.Args[0]
33806 if v_1.Op != OpCom8 || x != v_1.Args[0] {
33807 break
33808 }
33809 v.reset(OpConst8)
33810 v.AuxInt = int8ToAuxInt(1)
33811 return true
33812 }
33813
33814
33815 for {
33816 if v_0.Op != OpCom8 {
33817 break
33818 }
33819 x := v_0.Args[0]
33820 if v_1.Op != OpNeg8 || x != v_1.Args[0] {
33821 break
33822 }
33823 v.reset(OpConst8)
33824 v.AuxInt = int8ToAuxInt(-1)
33825 return true
33826 }
33827
33828
33829 for {
33830 if v_0.Op != OpAdd8 {
33831 break
33832 }
33833 _ = v_0.Args[1]
33834 v_0_0 := v_0.Args[0]
33835 v_0_1 := v_0.Args[1]
33836 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33837 t := v_0_0
33838 x := v_0_1
33839 if v_1.Op != OpAdd8 {
33840 continue
33841 }
33842 _ = v_1.Args[1]
33843 v_1_0 := v_1.Args[0]
33844 v_1_1 := v_1.Args[1]
33845 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
33846 if t != v_1_0 {
33847 continue
33848 }
33849 y := v_1_1
33850 v.reset(OpSub8)
33851 v.AddArg2(x, y)
33852 return true
33853 }
33854 }
33855 break
33856 }
33857
33858
33859 for {
33860 if v_0.Op != OpAdd8 {
33861 break
33862 }
33863 _ = v_0.Args[1]
33864 v_0_0 := v_0.Args[0]
33865 v_0_1 := v_0.Args[1]
33866 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33867 x := v_0_0
33868 y := v_0_1
33869 if x != v_1 {
33870 continue
33871 }
33872 v.copyOf(y)
33873 return true
33874 }
33875 break
33876 }
33877
33878
33879 for {
33880 if v_0.Op != OpAdd8 {
33881 break
33882 }
33883 _ = v_0.Args[1]
33884 v_0_0 := v_0.Args[0]
33885 v_0_1 := v_0.Args[1]
33886 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
33887 x := v_0_0
33888 y := v_0_1
33889 if y != v_1 {
33890 continue
33891 }
33892 v.copyOf(x)
33893 return true
33894 }
33895 break
33896 }
33897
33898
33899 for {
33900 if v_0.Op != OpSub8 {
33901 break
33902 }
33903 y := v_0.Args[1]
33904 x := v_0.Args[0]
33905 if x != v_1 {
33906 break
33907 }
33908 v.reset(OpNeg8)
33909 v.AddArg(y)
33910 return true
33911 }
33912
33913
33914 for {
33915 x := v_0
33916 if v_1.Op != OpAdd8 {
33917 break
33918 }
33919 _ = v_1.Args[1]
33920 v_1_0 := v_1.Args[0]
33921 v_1_1 := v_1.Args[1]
33922 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33923 if x != v_1_0 {
33924 continue
33925 }
33926 y := v_1_1
33927 v.reset(OpNeg8)
33928 v.AddArg(y)
33929 return true
33930 }
33931 break
33932 }
33933
33934
33935
33936 for {
33937 x := v_0
33938 if v_1.Op != OpSub8 {
33939 break
33940 }
33941 z := v_1.Args[1]
33942 i := v_1.Args[0]
33943 if i.Op != OpConst8 {
33944 break
33945 }
33946 t := i.Type
33947 if !(z.Op != OpConst8 && x.Op != OpConst8) {
33948 break
33949 }
33950 v.reset(OpSub8)
33951 v0 := b.NewValue0(v.Pos, OpAdd8, t)
33952 v0.AddArg2(x, z)
33953 v.AddArg2(v0, i)
33954 return true
33955 }
33956
33957
33958
33959 for {
33960 x := v_0
33961 if v_1.Op != OpAdd8 {
33962 break
33963 }
33964 _ = v_1.Args[1]
33965 v_1_0 := v_1.Args[0]
33966 v_1_1 := v_1.Args[1]
33967 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
33968 z := v_1_0
33969 i := v_1_1
33970 if i.Op != OpConst8 {
33971 continue
33972 }
33973 t := i.Type
33974 if !(z.Op != OpConst8 && x.Op != OpConst8) {
33975 continue
33976 }
33977 v.reset(OpSub8)
33978 v0 := b.NewValue0(v.Pos, OpSub8, t)
33979 v0.AddArg2(x, z)
33980 v.AddArg2(v0, i)
33981 return true
33982 }
33983 break
33984 }
33985
33986
33987
33988 for {
33989 if v_0.Op != OpSub8 {
33990 break
33991 }
33992 z := v_0.Args[1]
33993 i := v_0.Args[0]
33994 if i.Op != OpConst8 {
33995 break
33996 }
33997 t := i.Type
33998 x := v_1
33999 if !(z.Op != OpConst8 && x.Op != OpConst8) {
34000 break
34001 }
34002 v.reset(OpSub8)
34003 v0 := b.NewValue0(v.Pos, OpAdd8, t)
34004 v0.AddArg2(z, x)
34005 v.AddArg2(i, v0)
34006 return true
34007 }
34008
34009
34010
34011 for {
34012 if v_0.Op != OpAdd8 {
34013 break
34014 }
34015 _ = v_0.Args[1]
34016 v_0_0 := v_0.Args[0]
34017 v_0_1 := v_0.Args[1]
34018 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34019 z := v_0_0
34020 i := v_0_1
34021 if i.Op != OpConst8 {
34022 continue
34023 }
34024 t := i.Type
34025 x := v_1
34026 if !(z.Op != OpConst8 && x.Op != OpConst8) {
34027 continue
34028 }
34029 v.reset(OpAdd8)
34030 v0 := b.NewValue0(v.Pos, OpSub8, t)
34031 v0.AddArg2(z, x)
34032 v.AddArg2(i, v0)
34033 return true
34034 }
34035 break
34036 }
34037
34038
34039 for {
34040 if v_0.Op != OpConst8 {
34041 break
34042 }
34043 t := v_0.Type
34044 c := auxIntToInt8(v_0.AuxInt)
34045 if v_1.Op != OpSub8 {
34046 break
34047 }
34048 x := v_1.Args[1]
34049 v_1_0 := v_1.Args[0]
34050 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
34051 break
34052 }
34053 d := auxIntToInt8(v_1_0.AuxInt)
34054 v.reset(OpAdd8)
34055 v0 := b.NewValue0(v.Pos, OpConst8, t)
34056 v0.AuxInt = int8ToAuxInt(c - d)
34057 v.AddArg2(v0, x)
34058 return true
34059 }
34060
34061
34062 for {
34063 if v_0.Op != OpConst8 {
34064 break
34065 }
34066 t := v_0.Type
34067 c := auxIntToInt8(v_0.AuxInt)
34068 if v_1.Op != OpAdd8 {
34069 break
34070 }
34071 _ = v_1.Args[1]
34072 v_1_0 := v_1.Args[0]
34073 v_1_1 := v_1.Args[1]
34074 for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
34075 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
34076 continue
34077 }
34078 d := auxIntToInt8(v_1_0.AuxInt)
34079 x := v_1_1
34080 v.reset(OpSub8)
34081 v0 := b.NewValue0(v.Pos, OpConst8, t)
34082 v0.AuxInt = int8ToAuxInt(c - d)
34083 v.AddArg2(v0, x)
34084 return true
34085 }
34086 break
34087 }
34088 return false
34089 }
34090 func rewriteValuegeneric_OpTrunc(v *Value) bool {
34091 v_0 := v.Args[0]
34092
34093
34094 for {
34095 if v_0.Op != OpConst64F {
34096 break
34097 }
34098 c := auxIntToFloat64(v_0.AuxInt)
34099 v.reset(OpConst64F)
34100 v.AuxInt = float64ToAuxInt(math.Trunc(c))
34101 return true
34102 }
34103 return false
34104 }
34105 func rewriteValuegeneric_OpTrunc16to8(v *Value) bool {
34106 v_0 := v.Args[0]
34107
34108
34109 for {
34110 if v_0.Op != OpConst16 {
34111 break
34112 }
34113 c := auxIntToInt16(v_0.AuxInt)
34114 v.reset(OpConst8)
34115 v.AuxInt = int8ToAuxInt(int8(c))
34116 return true
34117 }
34118
34119
34120 for {
34121 if v_0.Op != OpZeroExt8to16 {
34122 break
34123 }
34124 x := v_0.Args[0]
34125 v.copyOf(x)
34126 return true
34127 }
34128
34129
34130 for {
34131 if v_0.Op != OpSignExt8to16 {
34132 break
34133 }
34134 x := v_0.Args[0]
34135 v.copyOf(x)
34136 return true
34137 }
34138
34139
34140
34141 for {
34142 if v_0.Op != OpAnd16 {
34143 break
34144 }
34145 _ = v_0.Args[1]
34146 v_0_0 := v_0.Args[0]
34147 v_0_1 := v_0.Args[1]
34148 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34149 if v_0_0.Op != OpConst16 {
34150 continue
34151 }
34152 y := auxIntToInt16(v_0_0.AuxInt)
34153 x := v_0_1
34154 if !(y&0xFF == 0xFF) {
34155 continue
34156 }
34157 v.reset(OpTrunc16to8)
34158 v.AddArg(x)
34159 return true
34160 }
34161 break
34162 }
34163 return false
34164 }
34165 func rewriteValuegeneric_OpTrunc32to16(v *Value) bool {
34166 v_0 := v.Args[0]
34167
34168
34169 for {
34170 if v_0.Op != OpConst32 {
34171 break
34172 }
34173 c := auxIntToInt32(v_0.AuxInt)
34174 v.reset(OpConst16)
34175 v.AuxInt = int16ToAuxInt(int16(c))
34176 return true
34177 }
34178
34179
34180 for {
34181 if v_0.Op != OpZeroExt8to32 {
34182 break
34183 }
34184 x := v_0.Args[0]
34185 v.reset(OpZeroExt8to16)
34186 v.AddArg(x)
34187 return true
34188 }
34189
34190
34191 for {
34192 if v_0.Op != OpZeroExt16to32 {
34193 break
34194 }
34195 x := v_0.Args[0]
34196 v.copyOf(x)
34197 return true
34198 }
34199
34200
34201 for {
34202 if v_0.Op != OpSignExt8to32 {
34203 break
34204 }
34205 x := v_0.Args[0]
34206 v.reset(OpSignExt8to16)
34207 v.AddArg(x)
34208 return true
34209 }
34210
34211
34212 for {
34213 if v_0.Op != OpSignExt16to32 {
34214 break
34215 }
34216 x := v_0.Args[0]
34217 v.copyOf(x)
34218 return true
34219 }
34220
34221
34222
34223 for {
34224 if v_0.Op != OpAnd32 {
34225 break
34226 }
34227 _ = v_0.Args[1]
34228 v_0_0 := v_0.Args[0]
34229 v_0_1 := v_0.Args[1]
34230 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34231 if v_0_0.Op != OpConst32 {
34232 continue
34233 }
34234 y := auxIntToInt32(v_0_0.AuxInt)
34235 x := v_0_1
34236 if !(y&0xFFFF == 0xFFFF) {
34237 continue
34238 }
34239 v.reset(OpTrunc32to16)
34240 v.AddArg(x)
34241 return true
34242 }
34243 break
34244 }
34245 return false
34246 }
34247 func rewriteValuegeneric_OpTrunc32to8(v *Value) bool {
34248 v_0 := v.Args[0]
34249
34250
34251 for {
34252 if v_0.Op != OpConst32 {
34253 break
34254 }
34255 c := auxIntToInt32(v_0.AuxInt)
34256 v.reset(OpConst8)
34257 v.AuxInt = int8ToAuxInt(int8(c))
34258 return true
34259 }
34260
34261
34262 for {
34263 if v_0.Op != OpZeroExt8to32 {
34264 break
34265 }
34266 x := v_0.Args[0]
34267 v.copyOf(x)
34268 return true
34269 }
34270
34271
34272 for {
34273 if v_0.Op != OpSignExt8to32 {
34274 break
34275 }
34276 x := v_0.Args[0]
34277 v.copyOf(x)
34278 return true
34279 }
34280
34281
34282
34283 for {
34284 if v_0.Op != OpAnd32 {
34285 break
34286 }
34287 _ = v_0.Args[1]
34288 v_0_0 := v_0.Args[0]
34289 v_0_1 := v_0.Args[1]
34290 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34291 if v_0_0.Op != OpConst32 {
34292 continue
34293 }
34294 y := auxIntToInt32(v_0_0.AuxInt)
34295 x := v_0_1
34296 if !(y&0xFF == 0xFF) {
34297 continue
34298 }
34299 v.reset(OpTrunc32to8)
34300 v.AddArg(x)
34301 return true
34302 }
34303 break
34304 }
34305 return false
34306 }
34307 func rewriteValuegeneric_OpTrunc64to16(v *Value) bool {
34308 v_0 := v.Args[0]
34309
34310
34311 for {
34312 if v_0.Op != OpConst64 {
34313 break
34314 }
34315 c := auxIntToInt64(v_0.AuxInt)
34316 v.reset(OpConst16)
34317 v.AuxInt = int16ToAuxInt(int16(c))
34318 return true
34319 }
34320
34321
34322 for {
34323 if v_0.Op != OpZeroExt8to64 {
34324 break
34325 }
34326 x := v_0.Args[0]
34327 v.reset(OpZeroExt8to16)
34328 v.AddArg(x)
34329 return true
34330 }
34331
34332
34333 for {
34334 if v_0.Op != OpZeroExt16to64 {
34335 break
34336 }
34337 x := v_0.Args[0]
34338 v.copyOf(x)
34339 return true
34340 }
34341
34342
34343 for {
34344 if v_0.Op != OpSignExt8to64 {
34345 break
34346 }
34347 x := v_0.Args[0]
34348 v.reset(OpSignExt8to16)
34349 v.AddArg(x)
34350 return true
34351 }
34352
34353
34354 for {
34355 if v_0.Op != OpSignExt16to64 {
34356 break
34357 }
34358 x := v_0.Args[0]
34359 v.copyOf(x)
34360 return true
34361 }
34362
34363
34364
34365 for {
34366 if v_0.Op != OpAnd64 {
34367 break
34368 }
34369 _ = v_0.Args[1]
34370 v_0_0 := v_0.Args[0]
34371 v_0_1 := v_0.Args[1]
34372 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34373 if v_0_0.Op != OpConst64 {
34374 continue
34375 }
34376 y := auxIntToInt64(v_0_0.AuxInt)
34377 x := v_0_1
34378 if !(y&0xFFFF == 0xFFFF) {
34379 continue
34380 }
34381 v.reset(OpTrunc64to16)
34382 v.AddArg(x)
34383 return true
34384 }
34385 break
34386 }
34387 return false
34388 }
34389 func rewriteValuegeneric_OpTrunc64to32(v *Value) bool {
34390 v_0 := v.Args[0]
34391
34392
34393 for {
34394 if v_0.Op != OpConst64 {
34395 break
34396 }
34397 c := auxIntToInt64(v_0.AuxInt)
34398 v.reset(OpConst32)
34399 v.AuxInt = int32ToAuxInt(int32(c))
34400 return true
34401 }
34402
34403
34404 for {
34405 if v_0.Op != OpZeroExt8to64 {
34406 break
34407 }
34408 x := v_0.Args[0]
34409 v.reset(OpZeroExt8to32)
34410 v.AddArg(x)
34411 return true
34412 }
34413
34414
34415 for {
34416 if v_0.Op != OpZeroExt16to64 {
34417 break
34418 }
34419 x := v_0.Args[0]
34420 v.reset(OpZeroExt16to32)
34421 v.AddArg(x)
34422 return true
34423 }
34424
34425
34426 for {
34427 if v_0.Op != OpZeroExt32to64 {
34428 break
34429 }
34430 x := v_0.Args[0]
34431 v.copyOf(x)
34432 return true
34433 }
34434
34435
34436 for {
34437 if v_0.Op != OpSignExt8to64 {
34438 break
34439 }
34440 x := v_0.Args[0]
34441 v.reset(OpSignExt8to32)
34442 v.AddArg(x)
34443 return true
34444 }
34445
34446
34447 for {
34448 if v_0.Op != OpSignExt16to64 {
34449 break
34450 }
34451 x := v_0.Args[0]
34452 v.reset(OpSignExt16to32)
34453 v.AddArg(x)
34454 return true
34455 }
34456
34457
34458 for {
34459 if v_0.Op != OpSignExt32to64 {
34460 break
34461 }
34462 x := v_0.Args[0]
34463 v.copyOf(x)
34464 return true
34465 }
34466
34467
34468
34469 for {
34470 if v_0.Op != OpAnd64 {
34471 break
34472 }
34473 _ = v_0.Args[1]
34474 v_0_0 := v_0.Args[0]
34475 v_0_1 := v_0.Args[1]
34476 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34477 if v_0_0.Op != OpConst64 {
34478 continue
34479 }
34480 y := auxIntToInt64(v_0_0.AuxInt)
34481 x := v_0_1
34482 if !(y&0xFFFFFFFF == 0xFFFFFFFF) {
34483 continue
34484 }
34485 v.reset(OpTrunc64to32)
34486 v.AddArg(x)
34487 return true
34488 }
34489 break
34490 }
34491 return false
34492 }
34493 func rewriteValuegeneric_OpTrunc64to8(v *Value) bool {
34494 v_0 := v.Args[0]
34495
34496
34497 for {
34498 if v_0.Op != OpConst64 {
34499 break
34500 }
34501 c := auxIntToInt64(v_0.AuxInt)
34502 v.reset(OpConst8)
34503 v.AuxInt = int8ToAuxInt(int8(c))
34504 return true
34505 }
34506
34507
34508 for {
34509 if v_0.Op != OpZeroExt8to64 {
34510 break
34511 }
34512 x := v_0.Args[0]
34513 v.copyOf(x)
34514 return true
34515 }
34516
34517
34518 for {
34519 if v_0.Op != OpSignExt8to64 {
34520 break
34521 }
34522 x := v_0.Args[0]
34523 v.copyOf(x)
34524 return true
34525 }
34526
34527
34528
34529 for {
34530 if v_0.Op != OpAnd64 {
34531 break
34532 }
34533 _ = v_0.Args[1]
34534 v_0_0 := v_0.Args[0]
34535 v_0_1 := v_0.Args[1]
34536 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
34537 if v_0_0.Op != OpConst64 {
34538 continue
34539 }
34540 y := auxIntToInt64(v_0_0.AuxInt)
34541 x := v_0_1
34542 if !(y&0xFF == 0xFF) {
34543 continue
34544 }
34545 v.reset(OpTrunc64to8)
34546 v.AddArg(x)
34547 return true
34548 }
34549 break
34550 }
34551 return false
34552 }
34553 func rewriteValuegeneric_OpXor16(v *Value) bool {
34554 v_1 := v.Args[1]
34555 v_0 := v.Args[0]
34556 b := v.Block
34557 config := b.Func.Config
34558
34559
34560 for {
34561 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34562 if v_0.Op != OpConst16 {
34563 continue
34564 }
34565 c := auxIntToInt16(v_0.AuxInt)
34566 if v_1.Op != OpConst16 {
34567 continue
34568 }
34569 d := auxIntToInt16(v_1.AuxInt)
34570 v.reset(OpConst16)
34571 v.AuxInt = int16ToAuxInt(c ^ d)
34572 return true
34573 }
34574 break
34575 }
34576
34577
34578 for {
34579 x := v_0
34580 if x != v_1 {
34581 break
34582 }
34583 v.reset(OpConst16)
34584 v.AuxInt = int16ToAuxInt(0)
34585 return true
34586 }
34587
34588
34589 for {
34590 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34591 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 {
34592 continue
34593 }
34594 x := v_1
34595 v.copyOf(x)
34596 return true
34597 }
34598 break
34599 }
34600
34601
34602 for {
34603 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34604 if v_0.Op != OpCom16 {
34605 continue
34606 }
34607 x := v_0.Args[0]
34608 if x != v_1 {
34609 continue
34610 }
34611 v.reset(OpConst16)
34612 v.AuxInt = int16ToAuxInt(-1)
34613 return true
34614 }
34615 break
34616 }
34617
34618
34619 for {
34620 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34621 if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != -1 {
34622 continue
34623 }
34624 x := v_1
34625 v.reset(OpCom16)
34626 v.AddArg(x)
34627 return true
34628 }
34629 break
34630 }
34631
34632
34633 for {
34634 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34635 x := v_0
34636 if v_1.Op != OpXor16 {
34637 continue
34638 }
34639 _ = v_1.Args[1]
34640 v_1_0 := v_1.Args[0]
34641 v_1_1 := v_1.Args[1]
34642 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34643 if x != v_1_0 {
34644 continue
34645 }
34646 y := v_1_1
34647 v.copyOf(y)
34648 return true
34649 }
34650 }
34651 break
34652 }
34653
34654
34655
34656 for {
34657 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34658 if v_0.Op != OpXor16 {
34659 continue
34660 }
34661 _ = v_0.Args[1]
34662 v_0_0 := v_0.Args[0]
34663 v_0_1 := v_0.Args[1]
34664 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
34665 i := v_0_0
34666 if i.Op != OpConst16 {
34667 continue
34668 }
34669 t := i.Type
34670 z := v_0_1
34671 x := v_1
34672 if !(z.Op != OpConst16 && x.Op != OpConst16) {
34673 continue
34674 }
34675 v.reset(OpXor16)
34676 v0 := b.NewValue0(v.Pos, OpXor16, t)
34677 v0.AddArg2(z, x)
34678 v.AddArg2(i, v0)
34679 return true
34680 }
34681 }
34682 break
34683 }
34684
34685
34686 for {
34687 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34688 if v_0.Op != OpConst16 {
34689 continue
34690 }
34691 t := v_0.Type
34692 c := auxIntToInt16(v_0.AuxInt)
34693 if v_1.Op != OpXor16 {
34694 continue
34695 }
34696 _ = v_1.Args[1]
34697 v_1_0 := v_1.Args[0]
34698 v_1_1 := v_1.Args[1]
34699 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
34700 if v_1_0.Op != OpConst16 || v_1_0.Type != t {
34701 continue
34702 }
34703 d := auxIntToInt16(v_1_0.AuxInt)
34704 x := v_1_1
34705 v.reset(OpXor16)
34706 v0 := b.NewValue0(v.Pos, OpConst16, t)
34707 v0.AuxInt = int16ToAuxInt(c ^ d)
34708 v.AddArg2(v0, x)
34709 return true
34710 }
34711 }
34712 break
34713 }
34714
34715
34716
34717 for {
34718 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34719 if v_0.Op != OpLsh16x64 {
34720 continue
34721 }
34722 _ = v_0.Args[1]
34723 x := v_0.Args[0]
34724 z := v_0.Args[1]
34725 if z.Op != OpConst64 {
34726 continue
34727 }
34728 c := auxIntToInt64(z.AuxInt)
34729 if v_1.Op != OpRsh16Ux64 {
34730 continue
34731 }
34732 _ = v_1.Args[1]
34733 if x != v_1.Args[0] {
34734 continue
34735 }
34736 v_1_1 := v_1.Args[1]
34737 if v_1_1.Op != OpConst64 {
34738 continue
34739 }
34740 d := auxIntToInt64(v_1_1.AuxInt)
34741 if !(c < 16 && d == 16-c && canRotate(config, 16)) {
34742 continue
34743 }
34744 v.reset(OpRotateLeft16)
34745 v.AddArg2(x, z)
34746 return true
34747 }
34748 break
34749 }
34750
34751
34752
34753 for {
34754 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34755 left := v_0
34756 if left.Op != OpLsh16x64 {
34757 continue
34758 }
34759 y := left.Args[1]
34760 x := left.Args[0]
34761 right := v_1
34762 if right.Op != OpRsh16Ux64 {
34763 continue
34764 }
34765 _ = right.Args[1]
34766 if x != right.Args[0] {
34767 continue
34768 }
34769 right_1 := right.Args[1]
34770 if right_1.Op != OpSub64 {
34771 continue
34772 }
34773 _ = right_1.Args[1]
34774 right_1_0 := right_1.Args[0]
34775 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
34776 continue
34777 }
34778 v.reset(OpRotateLeft16)
34779 v.AddArg2(x, y)
34780 return true
34781 }
34782 break
34783 }
34784
34785
34786
34787 for {
34788 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34789 left := v_0
34790 if left.Op != OpLsh16x32 {
34791 continue
34792 }
34793 y := left.Args[1]
34794 x := left.Args[0]
34795 right := v_1
34796 if right.Op != OpRsh16Ux32 {
34797 continue
34798 }
34799 _ = right.Args[1]
34800 if x != right.Args[0] {
34801 continue
34802 }
34803 right_1 := right.Args[1]
34804 if right_1.Op != OpSub32 {
34805 continue
34806 }
34807 _ = right_1.Args[1]
34808 right_1_0 := right_1.Args[0]
34809 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
34810 continue
34811 }
34812 v.reset(OpRotateLeft16)
34813 v.AddArg2(x, y)
34814 return true
34815 }
34816 break
34817 }
34818
34819
34820
34821 for {
34822 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34823 left := v_0
34824 if left.Op != OpLsh16x16 {
34825 continue
34826 }
34827 y := left.Args[1]
34828 x := left.Args[0]
34829 right := v_1
34830 if right.Op != OpRsh16Ux16 {
34831 continue
34832 }
34833 _ = right.Args[1]
34834 if x != right.Args[0] {
34835 continue
34836 }
34837 right_1 := right.Args[1]
34838 if right_1.Op != OpSub16 {
34839 continue
34840 }
34841 _ = right_1.Args[1]
34842 right_1_0 := right_1.Args[0]
34843 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
34844 continue
34845 }
34846 v.reset(OpRotateLeft16)
34847 v.AddArg2(x, y)
34848 return true
34849 }
34850 break
34851 }
34852
34853
34854
34855 for {
34856 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34857 left := v_0
34858 if left.Op != OpLsh16x8 {
34859 continue
34860 }
34861 y := left.Args[1]
34862 x := left.Args[0]
34863 right := v_1
34864 if right.Op != OpRsh16Ux8 {
34865 continue
34866 }
34867 _ = right.Args[1]
34868 if x != right.Args[0] {
34869 continue
34870 }
34871 right_1 := right.Args[1]
34872 if right_1.Op != OpSub8 {
34873 continue
34874 }
34875 _ = right_1.Args[1]
34876 right_1_0 := right_1.Args[0]
34877 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 16 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
34878 continue
34879 }
34880 v.reset(OpRotateLeft16)
34881 v.AddArg2(x, y)
34882 return true
34883 }
34884 break
34885 }
34886
34887
34888
34889 for {
34890 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34891 right := v_0
34892 if right.Op != OpRsh16Ux64 {
34893 continue
34894 }
34895 y := right.Args[1]
34896 x := right.Args[0]
34897 left := v_1
34898 if left.Op != OpLsh16x64 {
34899 continue
34900 }
34901 _ = left.Args[1]
34902 if x != left.Args[0] {
34903 continue
34904 }
34905 z := left.Args[1]
34906 if z.Op != OpSub64 {
34907 continue
34908 }
34909 _ = z.Args[1]
34910 z_0 := z.Args[0]
34911 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
34912 continue
34913 }
34914 v.reset(OpRotateLeft16)
34915 v.AddArg2(x, z)
34916 return true
34917 }
34918 break
34919 }
34920
34921
34922
34923 for {
34924 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34925 right := v_0
34926 if right.Op != OpRsh16Ux32 {
34927 continue
34928 }
34929 y := right.Args[1]
34930 x := right.Args[0]
34931 left := v_1
34932 if left.Op != OpLsh16x32 {
34933 continue
34934 }
34935 _ = left.Args[1]
34936 if x != left.Args[0] {
34937 continue
34938 }
34939 z := left.Args[1]
34940 if z.Op != OpSub32 {
34941 continue
34942 }
34943 _ = z.Args[1]
34944 z_0 := z.Args[0]
34945 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
34946 continue
34947 }
34948 v.reset(OpRotateLeft16)
34949 v.AddArg2(x, z)
34950 return true
34951 }
34952 break
34953 }
34954
34955
34956
34957 for {
34958 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34959 right := v_0
34960 if right.Op != OpRsh16Ux16 {
34961 continue
34962 }
34963 y := right.Args[1]
34964 x := right.Args[0]
34965 left := v_1
34966 if left.Op != OpLsh16x16 {
34967 continue
34968 }
34969 _ = left.Args[1]
34970 if x != left.Args[0] {
34971 continue
34972 }
34973 z := left.Args[1]
34974 if z.Op != OpSub16 {
34975 continue
34976 }
34977 _ = z.Args[1]
34978 z_0 := z.Args[0]
34979 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
34980 continue
34981 }
34982 v.reset(OpRotateLeft16)
34983 v.AddArg2(x, z)
34984 return true
34985 }
34986 break
34987 }
34988
34989
34990
34991 for {
34992 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
34993 right := v_0
34994 if right.Op != OpRsh16Ux8 {
34995 continue
34996 }
34997 y := right.Args[1]
34998 x := right.Args[0]
34999 left := v_1
35000 if left.Op != OpLsh16x8 {
35001 continue
35002 }
35003 _ = left.Args[1]
35004 if x != left.Args[0] {
35005 continue
35006 }
35007 z := left.Args[1]
35008 if z.Op != OpSub8 {
35009 continue
35010 }
35011 _ = z.Args[1]
35012 z_0 := z.Args[0]
35013 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 16 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 16)) {
35014 continue
35015 }
35016 v.reset(OpRotateLeft16)
35017 v.AddArg2(x, z)
35018 return true
35019 }
35020 break
35021 }
35022 return false
35023 }
35024 func rewriteValuegeneric_OpXor32(v *Value) bool {
35025 v_1 := v.Args[1]
35026 v_0 := v.Args[0]
35027 b := v.Block
35028 config := b.Func.Config
35029
35030
35031 for {
35032 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35033 if v_0.Op != OpConst32 {
35034 continue
35035 }
35036 c := auxIntToInt32(v_0.AuxInt)
35037 if v_1.Op != OpConst32 {
35038 continue
35039 }
35040 d := auxIntToInt32(v_1.AuxInt)
35041 v.reset(OpConst32)
35042 v.AuxInt = int32ToAuxInt(c ^ d)
35043 return true
35044 }
35045 break
35046 }
35047
35048
35049 for {
35050 x := v_0
35051 if x != v_1 {
35052 break
35053 }
35054 v.reset(OpConst32)
35055 v.AuxInt = int32ToAuxInt(0)
35056 return true
35057 }
35058
35059
35060 for {
35061 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35062 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 {
35063 continue
35064 }
35065 x := v_1
35066 v.copyOf(x)
35067 return true
35068 }
35069 break
35070 }
35071
35072
35073 for {
35074 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35075 if v_0.Op != OpCom32 {
35076 continue
35077 }
35078 x := v_0.Args[0]
35079 if x != v_1 {
35080 continue
35081 }
35082 v.reset(OpConst32)
35083 v.AuxInt = int32ToAuxInt(-1)
35084 return true
35085 }
35086 break
35087 }
35088
35089
35090 for {
35091 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35092 if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != -1 {
35093 continue
35094 }
35095 x := v_1
35096 v.reset(OpCom32)
35097 v.AddArg(x)
35098 return true
35099 }
35100 break
35101 }
35102
35103
35104 for {
35105 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35106 x := v_0
35107 if v_1.Op != OpXor32 {
35108 continue
35109 }
35110 _ = v_1.Args[1]
35111 v_1_0 := v_1.Args[0]
35112 v_1_1 := v_1.Args[1]
35113 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35114 if x != v_1_0 {
35115 continue
35116 }
35117 y := v_1_1
35118 v.copyOf(y)
35119 return true
35120 }
35121 }
35122 break
35123 }
35124
35125
35126
35127 for {
35128 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35129 if v_0.Op != OpXor32 {
35130 continue
35131 }
35132 _ = v_0.Args[1]
35133 v_0_0 := v_0.Args[0]
35134 v_0_1 := v_0.Args[1]
35135 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
35136 i := v_0_0
35137 if i.Op != OpConst32 {
35138 continue
35139 }
35140 t := i.Type
35141 z := v_0_1
35142 x := v_1
35143 if !(z.Op != OpConst32 && x.Op != OpConst32) {
35144 continue
35145 }
35146 v.reset(OpXor32)
35147 v0 := b.NewValue0(v.Pos, OpXor32, t)
35148 v0.AddArg2(z, x)
35149 v.AddArg2(i, v0)
35150 return true
35151 }
35152 }
35153 break
35154 }
35155
35156
35157 for {
35158 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35159 if v_0.Op != OpConst32 {
35160 continue
35161 }
35162 t := v_0.Type
35163 c := auxIntToInt32(v_0.AuxInt)
35164 if v_1.Op != OpXor32 {
35165 continue
35166 }
35167 _ = v_1.Args[1]
35168 v_1_0 := v_1.Args[0]
35169 v_1_1 := v_1.Args[1]
35170 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35171 if v_1_0.Op != OpConst32 || v_1_0.Type != t {
35172 continue
35173 }
35174 d := auxIntToInt32(v_1_0.AuxInt)
35175 x := v_1_1
35176 v.reset(OpXor32)
35177 v0 := b.NewValue0(v.Pos, OpConst32, t)
35178 v0.AuxInt = int32ToAuxInt(c ^ d)
35179 v.AddArg2(v0, x)
35180 return true
35181 }
35182 }
35183 break
35184 }
35185
35186
35187
35188 for {
35189 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35190 if v_0.Op != OpLsh32x64 {
35191 continue
35192 }
35193 _ = v_0.Args[1]
35194 x := v_0.Args[0]
35195 z := v_0.Args[1]
35196 if z.Op != OpConst64 {
35197 continue
35198 }
35199 c := auxIntToInt64(z.AuxInt)
35200 if v_1.Op != OpRsh32Ux64 {
35201 continue
35202 }
35203 _ = v_1.Args[1]
35204 if x != v_1.Args[0] {
35205 continue
35206 }
35207 v_1_1 := v_1.Args[1]
35208 if v_1_1.Op != OpConst64 {
35209 continue
35210 }
35211 d := auxIntToInt64(v_1_1.AuxInt)
35212 if !(c < 32 && d == 32-c && canRotate(config, 32)) {
35213 continue
35214 }
35215 v.reset(OpRotateLeft32)
35216 v.AddArg2(x, z)
35217 return true
35218 }
35219 break
35220 }
35221
35222
35223
35224 for {
35225 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35226 left := v_0
35227 if left.Op != OpLsh32x64 {
35228 continue
35229 }
35230 y := left.Args[1]
35231 x := left.Args[0]
35232 right := v_1
35233 if right.Op != OpRsh32Ux64 {
35234 continue
35235 }
35236 _ = right.Args[1]
35237 if x != right.Args[0] {
35238 continue
35239 }
35240 right_1 := right.Args[1]
35241 if right_1.Op != OpSub64 {
35242 continue
35243 }
35244 _ = right_1.Args[1]
35245 right_1_0 := right_1.Args[0]
35246 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35247 continue
35248 }
35249 v.reset(OpRotateLeft32)
35250 v.AddArg2(x, y)
35251 return true
35252 }
35253 break
35254 }
35255
35256
35257
35258 for {
35259 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35260 left := v_0
35261 if left.Op != OpLsh32x32 {
35262 continue
35263 }
35264 y := left.Args[1]
35265 x := left.Args[0]
35266 right := v_1
35267 if right.Op != OpRsh32Ux32 {
35268 continue
35269 }
35270 _ = right.Args[1]
35271 if x != right.Args[0] {
35272 continue
35273 }
35274 right_1 := right.Args[1]
35275 if right_1.Op != OpSub32 {
35276 continue
35277 }
35278 _ = right_1.Args[1]
35279 right_1_0 := right_1.Args[0]
35280 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35281 continue
35282 }
35283 v.reset(OpRotateLeft32)
35284 v.AddArg2(x, y)
35285 return true
35286 }
35287 break
35288 }
35289
35290
35291
35292 for {
35293 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35294 left := v_0
35295 if left.Op != OpLsh32x16 {
35296 continue
35297 }
35298 y := left.Args[1]
35299 x := left.Args[0]
35300 right := v_1
35301 if right.Op != OpRsh32Ux16 {
35302 continue
35303 }
35304 _ = right.Args[1]
35305 if x != right.Args[0] {
35306 continue
35307 }
35308 right_1 := right.Args[1]
35309 if right_1.Op != OpSub16 {
35310 continue
35311 }
35312 _ = right_1.Args[1]
35313 right_1_0 := right_1.Args[0]
35314 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35315 continue
35316 }
35317 v.reset(OpRotateLeft32)
35318 v.AddArg2(x, y)
35319 return true
35320 }
35321 break
35322 }
35323
35324
35325
35326 for {
35327 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35328 left := v_0
35329 if left.Op != OpLsh32x8 {
35330 continue
35331 }
35332 y := left.Args[1]
35333 x := left.Args[0]
35334 right := v_1
35335 if right.Op != OpRsh32Ux8 {
35336 continue
35337 }
35338 _ = right.Args[1]
35339 if x != right.Args[0] {
35340 continue
35341 }
35342 right_1 := right.Args[1]
35343 if right_1.Op != OpSub8 {
35344 continue
35345 }
35346 _ = right_1.Args[1]
35347 right_1_0 := right_1.Args[0]
35348 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 32 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35349 continue
35350 }
35351 v.reset(OpRotateLeft32)
35352 v.AddArg2(x, y)
35353 return true
35354 }
35355 break
35356 }
35357
35358
35359
35360 for {
35361 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35362 right := v_0
35363 if right.Op != OpRsh32Ux64 {
35364 continue
35365 }
35366 y := right.Args[1]
35367 x := right.Args[0]
35368 left := v_1
35369 if left.Op != OpLsh32x64 {
35370 continue
35371 }
35372 _ = left.Args[1]
35373 if x != left.Args[0] {
35374 continue
35375 }
35376 z := left.Args[1]
35377 if z.Op != OpSub64 {
35378 continue
35379 }
35380 _ = z.Args[1]
35381 z_0 := z.Args[0]
35382 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35383 continue
35384 }
35385 v.reset(OpRotateLeft32)
35386 v.AddArg2(x, z)
35387 return true
35388 }
35389 break
35390 }
35391
35392
35393
35394 for {
35395 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35396 right := v_0
35397 if right.Op != OpRsh32Ux32 {
35398 continue
35399 }
35400 y := right.Args[1]
35401 x := right.Args[0]
35402 left := v_1
35403 if left.Op != OpLsh32x32 {
35404 continue
35405 }
35406 _ = left.Args[1]
35407 if x != left.Args[0] {
35408 continue
35409 }
35410 z := left.Args[1]
35411 if z.Op != OpSub32 {
35412 continue
35413 }
35414 _ = z.Args[1]
35415 z_0 := z.Args[0]
35416 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35417 continue
35418 }
35419 v.reset(OpRotateLeft32)
35420 v.AddArg2(x, z)
35421 return true
35422 }
35423 break
35424 }
35425
35426
35427
35428 for {
35429 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35430 right := v_0
35431 if right.Op != OpRsh32Ux16 {
35432 continue
35433 }
35434 y := right.Args[1]
35435 x := right.Args[0]
35436 left := v_1
35437 if left.Op != OpLsh32x16 {
35438 continue
35439 }
35440 _ = left.Args[1]
35441 if x != left.Args[0] {
35442 continue
35443 }
35444 z := left.Args[1]
35445 if z.Op != OpSub16 {
35446 continue
35447 }
35448 _ = z.Args[1]
35449 z_0 := z.Args[0]
35450 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35451 continue
35452 }
35453 v.reset(OpRotateLeft32)
35454 v.AddArg2(x, z)
35455 return true
35456 }
35457 break
35458 }
35459
35460
35461
35462 for {
35463 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35464 right := v_0
35465 if right.Op != OpRsh32Ux8 {
35466 continue
35467 }
35468 y := right.Args[1]
35469 x := right.Args[0]
35470 left := v_1
35471 if left.Op != OpLsh32x8 {
35472 continue
35473 }
35474 _ = left.Args[1]
35475 if x != left.Args[0] {
35476 continue
35477 }
35478 z := left.Args[1]
35479 if z.Op != OpSub8 {
35480 continue
35481 }
35482 _ = z.Args[1]
35483 z_0 := z.Args[0]
35484 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 32 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 32)) {
35485 continue
35486 }
35487 v.reset(OpRotateLeft32)
35488 v.AddArg2(x, z)
35489 return true
35490 }
35491 break
35492 }
35493 return false
35494 }
35495 func rewriteValuegeneric_OpXor64(v *Value) bool {
35496 v_1 := v.Args[1]
35497 v_0 := v.Args[0]
35498 b := v.Block
35499 config := b.Func.Config
35500
35501
35502 for {
35503 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35504 if v_0.Op != OpConst64 {
35505 continue
35506 }
35507 c := auxIntToInt64(v_0.AuxInt)
35508 if v_1.Op != OpConst64 {
35509 continue
35510 }
35511 d := auxIntToInt64(v_1.AuxInt)
35512 v.reset(OpConst64)
35513 v.AuxInt = int64ToAuxInt(c ^ d)
35514 return true
35515 }
35516 break
35517 }
35518
35519
35520 for {
35521 x := v_0
35522 if x != v_1 {
35523 break
35524 }
35525 v.reset(OpConst64)
35526 v.AuxInt = int64ToAuxInt(0)
35527 return true
35528 }
35529
35530
35531 for {
35532 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35533 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 {
35534 continue
35535 }
35536 x := v_1
35537 v.copyOf(x)
35538 return true
35539 }
35540 break
35541 }
35542
35543
35544 for {
35545 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35546 if v_0.Op != OpCom64 {
35547 continue
35548 }
35549 x := v_0.Args[0]
35550 if x != v_1 {
35551 continue
35552 }
35553 v.reset(OpConst64)
35554 v.AuxInt = int64ToAuxInt(-1)
35555 return true
35556 }
35557 break
35558 }
35559
35560
35561 for {
35562 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35563 if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != -1 {
35564 continue
35565 }
35566 x := v_1
35567 v.reset(OpCom64)
35568 v.AddArg(x)
35569 return true
35570 }
35571 break
35572 }
35573
35574
35575 for {
35576 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35577 x := v_0
35578 if v_1.Op != OpXor64 {
35579 continue
35580 }
35581 _ = v_1.Args[1]
35582 v_1_0 := v_1.Args[0]
35583 v_1_1 := v_1.Args[1]
35584 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35585 if x != v_1_0 {
35586 continue
35587 }
35588 y := v_1_1
35589 v.copyOf(y)
35590 return true
35591 }
35592 }
35593 break
35594 }
35595
35596
35597
35598 for {
35599 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35600 if v_0.Op != OpXor64 {
35601 continue
35602 }
35603 _ = v_0.Args[1]
35604 v_0_0 := v_0.Args[0]
35605 v_0_1 := v_0.Args[1]
35606 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
35607 i := v_0_0
35608 if i.Op != OpConst64 {
35609 continue
35610 }
35611 t := i.Type
35612 z := v_0_1
35613 x := v_1
35614 if !(z.Op != OpConst64 && x.Op != OpConst64) {
35615 continue
35616 }
35617 v.reset(OpXor64)
35618 v0 := b.NewValue0(v.Pos, OpXor64, t)
35619 v0.AddArg2(z, x)
35620 v.AddArg2(i, v0)
35621 return true
35622 }
35623 }
35624 break
35625 }
35626
35627
35628 for {
35629 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35630 if v_0.Op != OpConst64 {
35631 continue
35632 }
35633 t := v_0.Type
35634 c := auxIntToInt64(v_0.AuxInt)
35635 if v_1.Op != OpXor64 {
35636 continue
35637 }
35638 _ = v_1.Args[1]
35639 v_1_0 := v_1.Args[0]
35640 v_1_1 := v_1.Args[1]
35641 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
35642 if v_1_0.Op != OpConst64 || v_1_0.Type != t {
35643 continue
35644 }
35645 d := auxIntToInt64(v_1_0.AuxInt)
35646 x := v_1_1
35647 v.reset(OpXor64)
35648 v0 := b.NewValue0(v.Pos, OpConst64, t)
35649 v0.AuxInt = int64ToAuxInt(c ^ d)
35650 v.AddArg2(v0, x)
35651 return true
35652 }
35653 }
35654 break
35655 }
35656
35657
35658
35659 for {
35660 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35661 if v_0.Op != OpLsh64x64 {
35662 continue
35663 }
35664 _ = v_0.Args[1]
35665 x := v_0.Args[0]
35666 z := v_0.Args[1]
35667 if z.Op != OpConst64 {
35668 continue
35669 }
35670 c := auxIntToInt64(z.AuxInt)
35671 if v_1.Op != OpRsh64Ux64 {
35672 continue
35673 }
35674 _ = v_1.Args[1]
35675 if x != v_1.Args[0] {
35676 continue
35677 }
35678 v_1_1 := v_1.Args[1]
35679 if v_1_1.Op != OpConst64 {
35680 continue
35681 }
35682 d := auxIntToInt64(v_1_1.AuxInt)
35683 if !(c < 64 && d == 64-c && canRotate(config, 64)) {
35684 continue
35685 }
35686 v.reset(OpRotateLeft64)
35687 v.AddArg2(x, z)
35688 return true
35689 }
35690 break
35691 }
35692
35693
35694
35695 for {
35696 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35697 left := v_0
35698 if left.Op != OpLsh64x64 {
35699 continue
35700 }
35701 y := left.Args[1]
35702 x := left.Args[0]
35703 right := v_1
35704 if right.Op != OpRsh64Ux64 {
35705 continue
35706 }
35707 _ = right.Args[1]
35708 if x != right.Args[0] {
35709 continue
35710 }
35711 right_1 := right.Args[1]
35712 if right_1.Op != OpSub64 {
35713 continue
35714 }
35715 _ = right_1.Args[1]
35716 right_1_0 := right_1.Args[0]
35717 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
35718 continue
35719 }
35720 v.reset(OpRotateLeft64)
35721 v.AddArg2(x, y)
35722 return true
35723 }
35724 break
35725 }
35726
35727
35728
35729 for {
35730 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35731 left := v_0
35732 if left.Op != OpLsh64x32 {
35733 continue
35734 }
35735 y := left.Args[1]
35736 x := left.Args[0]
35737 right := v_1
35738 if right.Op != OpRsh64Ux32 {
35739 continue
35740 }
35741 _ = right.Args[1]
35742 if x != right.Args[0] {
35743 continue
35744 }
35745 right_1 := right.Args[1]
35746 if right_1.Op != OpSub32 {
35747 continue
35748 }
35749 _ = right_1.Args[1]
35750 right_1_0 := right_1.Args[0]
35751 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
35752 continue
35753 }
35754 v.reset(OpRotateLeft64)
35755 v.AddArg2(x, y)
35756 return true
35757 }
35758 break
35759 }
35760
35761
35762
35763 for {
35764 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35765 left := v_0
35766 if left.Op != OpLsh64x16 {
35767 continue
35768 }
35769 y := left.Args[1]
35770 x := left.Args[0]
35771 right := v_1
35772 if right.Op != OpRsh64Ux16 {
35773 continue
35774 }
35775 _ = right.Args[1]
35776 if x != right.Args[0] {
35777 continue
35778 }
35779 right_1 := right.Args[1]
35780 if right_1.Op != OpSub16 {
35781 continue
35782 }
35783 _ = right_1.Args[1]
35784 right_1_0 := right_1.Args[0]
35785 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
35786 continue
35787 }
35788 v.reset(OpRotateLeft64)
35789 v.AddArg2(x, y)
35790 return true
35791 }
35792 break
35793 }
35794
35795
35796
35797 for {
35798 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35799 left := v_0
35800 if left.Op != OpLsh64x8 {
35801 continue
35802 }
35803 y := left.Args[1]
35804 x := left.Args[0]
35805 right := v_1
35806 if right.Op != OpRsh64Ux8 {
35807 continue
35808 }
35809 _ = right.Args[1]
35810 if x != right.Args[0] {
35811 continue
35812 }
35813 right_1 := right.Args[1]
35814 if right_1.Op != OpSub8 {
35815 continue
35816 }
35817 _ = right_1.Args[1]
35818 right_1_0 := right_1.Args[0]
35819 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 64 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
35820 continue
35821 }
35822 v.reset(OpRotateLeft64)
35823 v.AddArg2(x, y)
35824 return true
35825 }
35826 break
35827 }
35828
35829
35830
35831 for {
35832 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35833 right := v_0
35834 if right.Op != OpRsh64Ux64 {
35835 continue
35836 }
35837 y := right.Args[1]
35838 x := right.Args[0]
35839 left := v_1
35840 if left.Op != OpLsh64x64 {
35841 continue
35842 }
35843 _ = left.Args[1]
35844 if x != left.Args[0] {
35845 continue
35846 }
35847 z := left.Args[1]
35848 if z.Op != OpSub64 {
35849 continue
35850 }
35851 _ = z.Args[1]
35852 z_0 := z.Args[0]
35853 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
35854 continue
35855 }
35856 v.reset(OpRotateLeft64)
35857 v.AddArg2(x, z)
35858 return true
35859 }
35860 break
35861 }
35862
35863
35864
35865 for {
35866 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35867 right := v_0
35868 if right.Op != OpRsh64Ux32 {
35869 continue
35870 }
35871 y := right.Args[1]
35872 x := right.Args[0]
35873 left := v_1
35874 if left.Op != OpLsh64x32 {
35875 continue
35876 }
35877 _ = left.Args[1]
35878 if x != left.Args[0] {
35879 continue
35880 }
35881 z := left.Args[1]
35882 if z.Op != OpSub32 {
35883 continue
35884 }
35885 _ = z.Args[1]
35886 z_0 := z.Args[0]
35887 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
35888 continue
35889 }
35890 v.reset(OpRotateLeft64)
35891 v.AddArg2(x, z)
35892 return true
35893 }
35894 break
35895 }
35896
35897
35898
35899 for {
35900 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35901 right := v_0
35902 if right.Op != OpRsh64Ux16 {
35903 continue
35904 }
35905 y := right.Args[1]
35906 x := right.Args[0]
35907 left := v_1
35908 if left.Op != OpLsh64x16 {
35909 continue
35910 }
35911 _ = left.Args[1]
35912 if x != left.Args[0] {
35913 continue
35914 }
35915 z := left.Args[1]
35916 if z.Op != OpSub16 {
35917 continue
35918 }
35919 _ = z.Args[1]
35920 z_0 := z.Args[0]
35921 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
35922 continue
35923 }
35924 v.reset(OpRotateLeft64)
35925 v.AddArg2(x, z)
35926 return true
35927 }
35928 break
35929 }
35930
35931
35932
35933 for {
35934 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35935 right := v_0
35936 if right.Op != OpRsh64Ux8 {
35937 continue
35938 }
35939 y := right.Args[1]
35940 x := right.Args[0]
35941 left := v_1
35942 if left.Op != OpLsh64x8 {
35943 continue
35944 }
35945 _ = left.Args[1]
35946 if x != left.Args[0] {
35947 continue
35948 }
35949 z := left.Args[1]
35950 if z.Op != OpSub8 {
35951 continue
35952 }
35953 _ = z.Args[1]
35954 z_0 := z.Args[0]
35955 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 64 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 64)) {
35956 continue
35957 }
35958 v.reset(OpRotateLeft64)
35959 v.AddArg2(x, z)
35960 return true
35961 }
35962 break
35963 }
35964 return false
35965 }
35966 func rewriteValuegeneric_OpXor8(v *Value) bool {
35967 v_1 := v.Args[1]
35968 v_0 := v.Args[0]
35969 b := v.Block
35970 config := b.Func.Config
35971
35972
35973 for {
35974 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
35975 if v_0.Op != OpConst8 {
35976 continue
35977 }
35978 c := auxIntToInt8(v_0.AuxInt)
35979 if v_1.Op != OpConst8 {
35980 continue
35981 }
35982 d := auxIntToInt8(v_1.AuxInt)
35983 v.reset(OpConst8)
35984 v.AuxInt = int8ToAuxInt(c ^ d)
35985 return true
35986 }
35987 break
35988 }
35989
35990
35991 for {
35992 x := v_0
35993 if x != v_1 {
35994 break
35995 }
35996 v.reset(OpConst8)
35997 v.AuxInt = int8ToAuxInt(0)
35998 return true
35999 }
36000
36001
36002 for {
36003 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36004 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 {
36005 continue
36006 }
36007 x := v_1
36008 v.copyOf(x)
36009 return true
36010 }
36011 break
36012 }
36013
36014
36015 for {
36016 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36017 if v_0.Op != OpCom8 {
36018 continue
36019 }
36020 x := v_0.Args[0]
36021 if x != v_1 {
36022 continue
36023 }
36024 v.reset(OpConst8)
36025 v.AuxInt = int8ToAuxInt(-1)
36026 return true
36027 }
36028 break
36029 }
36030
36031
36032 for {
36033 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36034 if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != -1 {
36035 continue
36036 }
36037 x := v_1
36038 v.reset(OpCom8)
36039 v.AddArg(x)
36040 return true
36041 }
36042 break
36043 }
36044
36045
36046 for {
36047 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36048 x := v_0
36049 if v_1.Op != OpXor8 {
36050 continue
36051 }
36052 _ = v_1.Args[1]
36053 v_1_0 := v_1.Args[0]
36054 v_1_1 := v_1.Args[1]
36055 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36056 if x != v_1_0 {
36057 continue
36058 }
36059 y := v_1_1
36060 v.copyOf(y)
36061 return true
36062 }
36063 }
36064 break
36065 }
36066
36067
36068
36069 for {
36070 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36071 if v_0.Op != OpXor8 {
36072 continue
36073 }
36074 _ = v_0.Args[1]
36075 v_0_0 := v_0.Args[0]
36076 v_0_1 := v_0.Args[1]
36077 for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 {
36078 i := v_0_0
36079 if i.Op != OpConst8 {
36080 continue
36081 }
36082 t := i.Type
36083 z := v_0_1
36084 x := v_1
36085 if !(z.Op != OpConst8 && x.Op != OpConst8) {
36086 continue
36087 }
36088 v.reset(OpXor8)
36089 v0 := b.NewValue0(v.Pos, OpXor8, t)
36090 v0.AddArg2(z, x)
36091 v.AddArg2(i, v0)
36092 return true
36093 }
36094 }
36095 break
36096 }
36097
36098
36099 for {
36100 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36101 if v_0.Op != OpConst8 {
36102 continue
36103 }
36104 t := v_0.Type
36105 c := auxIntToInt8(v_0.AuxInt)
36106 if v_1.Op != OpXor8 {
36107 continue
36108 }
36109 _ = v_1.Args[1]
36110 v_1_0 := v_1.Args[0]
36111 v_1_1 := v_1.Args[1]
36112 for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
36113 if v_1_0.Op != OpConst8 || v_1_0.Type != t {
36114 continue
36115 }
36116 d := auxIntToInt8(v_1_0.AuxInt)
36117 x := v_1_1
36118 v.reset(OpXor8)
36119 v0 := b.NewValue0(v.Pos, OpConst8, t)
36120 v0.AuxInt = int8ToAuxInt(c ^ d)
36121 v.AddArg2(v0, x)
36122 return true
36123 }
36124 }
36125 break
36126 }
36127
36128
36129
36130 for {
36131 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36132 if v_0.Op != OpLsh8x64 {
36133 continue
36134 }
36135 _ = v_0.Args[1]
36136 x := v_0.Args[0]
36137 z := v_0.Args[1]
36138 if z.Op != OpConst64 {
36139 continue
36140 }
36141 c := auxIntToInt64(z.AuxInt)
36142 if v_1.Op != OpRsh8Ux64 {
36143 continue
36144 }
36145 _ = v_1.Args[1]
36146 if x != v_1.Args[0] {
36147 continue
36148 }
36149 v_1_1 := v_1.Args[1]
36150 if v_1_1.Op != OpConst64 {
36151 continue
36152 }
36153 d := auxIntToInt64(v_1_1.AuxInt)
36154 if !(c < 8 && d == 8-c && canRotate(config, 8)) {
36155 continue
36156 }
36157 v.reset(OpRotateLeft8)
36158 v.AddArg2(x, z)
36159 return true
36160 }
36161 break
36162 }
36163
36164
36165
36166 for {
36167 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36168 left := v_0
36169 if left.Op != OpLsh8x64 {
36170 continue
36171 }
36172 y := left.Args[1]
36173 x := left.Args[0]
36174 right := v_1
36175 if right.Op != OpRsh8Ux64 {
36176 continue
36177 }
36178 _ = right.Args[1]
36179 if x != right.Args[0] {
36180 continue
36181 }
36182 right_1 := right.Args[1]
36183 if right_1.Op != OpSub64 {
36184 continue
36185 }
36186 _ = right_1.Args[1]
36187 right_1_0 := right_1.Args[0]
36188 if right_1_0.Op != OpConst64 || auxIntToInt64(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36189 continue
36190 }
36191 v.reset(OpRotateLeft8)
36192 v.AddArg2(x, y)
36193 return true
36194 }
36195 break
36196 }
36197
36198
36199
36200 for {
36201 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36202 left := v_0
36203 if left.Op != OpLsh8x32 {
36204 continue
36205 }
36206 y := left.Args[1]
36207 x := left.Args[0]
36208 right := v_1
36209 if right.Op != OpRsh8Ux32 {
36210 continue
36211 }
36212 _ = right.Args[1]
36213 if x != right.Args[0] {
36214 continue
36215 }
36216 right_1 := right.Args[1]
36217 if right_1.Op != OpSub32 {
36218 continue
36219 }
36220 _ = right_1.Args[1]
36221 right_1_0 := right_1.Args[0]
36222 if right_1_0.Op != OpConst32 || auxIntToInt32(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36223 continue
36224 }
36225 v.reset(OpRotateLeft8)
36226 v.AddArg2(x, y)
36227 return true
36228 }
36229 break
36230 }
36231
36232
36233
36234 for {
36235 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36236 left := v_0
36237 if left.Op != OpLsh8x16 {
36238 continue
36239 }
36240 y := left.Args[1]
36241 x := left.Args[0]
36242 right := v_1
36243 if right.Op != OpRsh8Ux16 {
36244 continue
36245 }
36246 _ = right.Args[1]
36247 if x != right.Args[0] {
36248 continue
36249 }
36250 right_1 := right.Args[1]
36251 if right_1.Op != OpSub16 {
36252 continue
36253 }
36254 _ = right_1.Args[1]
36255 right_1_0 := right_1.Args[0]
36256 if right_1_0.Op != OpConst16 || auxIntToInt16(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36257 continue
36258 }
36259 v.reset(OpRotateLeft8)
36260 v.AddArg2(x, y)
36261 return true
36262 }
36263 break
36264 }
36265
36266
36267
36268 for {
36269 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36270 left := v_0
36271 if left.Op != OpLsh8x8 {
36272 continue
36273 }
36274 y := left.Args[1]
36275 x := left.Args[0]
36276 right := v_1
36277 if right.Op != OpRsh8Ux8 {
36278 continue
36279 }
36280 _ = right.Args[1]
36281 if x != right.Args[0] {
36282 continue
36283 }
36284 right_1 := right.Args[1]
36285 if right_1.Op != OpSub8 {
36286 continue
36287 }
36288 _ = right_1.Args[1]
36289 right_1_0 := right_1.Args[0]
36290 if right_1_0.Op != OpConst8 || auxIntToInt8(right_1_0.AuxInt) != 8 || y != right_1.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36291 continue
36292 }
36293 v.reset(OpRotateLeft8)
36294 v.AddArg2(x, y)
36295 return true
36296 }
36297 break
36298 }
36299
36300
36301
36302 for {
36303 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36304 right := v_0
36305 if right.Op != OpRsh8Ux64 {
36306 continue
36307 }
36308 y := right.Args[1]
36309 x := right.Args[0]
36310 left := v_1
36311 if left.Op != OpLsh8x64 {
36312 continue
36313 }
36314 _ = left.Args[1]
36315 if x != left.Args[0] {
36316 continue
36317 }
36318 z := left.Args[1]
36319 if z.Op != OpSub64 {
36320 continue
36321 }
36322 _ = z.Args[1]
36323 z_0 := z.Args[0]
36324 if z_0.Op != OpConst64 || auxIntToInt64(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36325 continue
36326 }
36327 v.reset(OpRotateLeft8)
36328 v.AddArg2(x, z)
36329 return true
36330 }
36331 break
36332 }
36333
36334
36335
36336 for {
36337 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36338 right := v_0
36339 if right.Op != OpRsh8Ux32 {
36340 continue
36341 }
36342 y := right.Args[1]
36343 x := right.Args[0]
36344 left := v_1
36345 if left.Op != OpLsh8x32 {
36346 continue
36347 }
36348 _ = left.Args[1]
36349 if x != left.Args[0] {
36350 continue
36351 }
36352 z := left.Args[1]
36353 if z.Op != OpSub32 {
36354 continue
36355 }
36356 _ = z.Args[1]
36357 z_0 := z.Args[0]
36358 if z_0.Op != OpConst32 || auxIntToInt32(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36359 continue
36360 }
36361 v.reset(OpRotateLeft8)
36362 v.AddArg2(x, z)
36363 return true
36364 }
36365 break
36366 }
36367
36368
36369
36370 for {
36371 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36372 right := v_0
36373 if right.Op != OpRsh8Ux16 {
36374 continue
36375 }
36376 y := right.Args[1]
36377 x := right.Args[0]
36378 left := v_1
36379 if left.Op != OpLsh8x16 {
36380 continue
36381 }
36382 _ = left.Args[1]
36383 if x != left.Args[0] {
36384 continue
36385 }
36386 z := left.Args[1]
36387 if z.Op != OpSub16 {
36388 continue
36389 }
36390 _ = z.Args[1]
36391 z_0 := z.Args[0]
36392 if z_0.Op != OpConst16 || auxIntToInt16(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36393 continue
36394 }
36395 v.reset(OpRotateLeft8)
36396 v.AddArg2(x, z)
36397 return true
36398 }
36399 break
36400 }
36401
36402
36403
36404 for {
36405 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
36406 right := v_0
36407 if right.Op != OpRsh8Ux8 {
36408 continue
36409 }
36410 y := right.Args[1]
36411 x := right.Args[0]
36412 left := v_1
36413 if left.Op != OpLsh8x8 {
36414 continue
36415 }
36416 _ = left.Args[1]
36417 if x != left.Args[0] {
36418 continue
36419 }
36420 z := left.Args[1]
36421 if z.Op != OpSub8 {
36422 continue
36423 }
36424 _ = z.Args[1]
36425 z_0 := z.Args[0]
36426 if z_0.Op != OpConst8 || auxIntToInt8(z_0.AuxInt) != 8 || y != z.Args[1] || !((shiftIsBounded(left) || shiftIsBounded(right)) && canRotate(config, 8)) {
36427 continue
36428 }
36429 v.reset(OpRotateLeft8)
36430 v.AddArg2(x, z)
36431 return true
36432 }
36433 break
36434 }
36435 return false
36436 }
36437 func rewriteValuegeneric_OpZero(v *Value) bool {
36438 v_1 := v.Args[1]
36439 v_0 := v.Args[0]
36440 b := v.Block
36441
36442
36443
36444 for {
36445 if v_0.Op != OpSelectN || auxIntToInt64(v_0.AuxInt) != 0 {
36446 break
36447 }
36448 call := v_0.Args[0]
36449 if call.Op != OpStaticLECall {
36450 break
36451 }
36452 mem := v_1
36453 if mem.Op != OpSelectN || auxIntToInt64(mem.AuxInt) != 1 || call != mem.Args[0] || !(isMalloc(call.Aux)) {
36454 break
36455 }
36456 v.copyOf(mem)
36457 return true
36458 }
36459
36460
36461
36462 for {
36463 n := auxIntToInt64(v.AuxInt)
36464 t1 := auxToType(v.Aux)
36465 p1 := v_0
36466 store := v_1
36467 if store.Op != OpStore {
36468 break
36469 }
36470 t2 := auxToType(store.Aux)
36471 mem := store.Args[2]
36472 store_0 := store.Args[0]
36473 if store_0.Op != OpOffPtr {
36474 break
36475 }
36476 o2 := auxIntToInt64(store_0.AuxInt)
36477 p2 := store_0.Args[0]
36478 if !(isSamePtr(p1, p2) && store.Uses == 1 && n >= o2+t2.Size() && clobber(store)) {
36479 break
36480 }
36481 v.reset(OpZero)
36482 v.AuxInt = int64ToAuxInt(n)
36483 v.Aux = typeToAux(t1)
36484 v.AddArg2(p1, mem)
36485 return true
36486 }
36487
36488
36489
36490 for {
36491 n := auxIntToInt64(v.AuxInt)
36492 t := auxToType(v.Aux)
36493 dst1 := v_0
36494 move := v_1
36495 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
36496 break
36497 }
36498 mem := move.Args[2]
36499 dst2 := move.Args[0]
36500 if !(move.Uses == 1 && isSamePtr(dst1, dst2) && clobber(move)) {
36501 break
36502 }
36503 v.reset(OpZero)
36504 v.AuxInt = int64ToAuxInt(n)
36505 v.Aux = typeToAux(t)
36506 v.AddArg2(dst1, mem)
36507 return true
36508 }
36509
36510
36511
36512 for {
36513 n := auxIntToInt64(v.AuxInt)
36514 t := auxToType(v.Aux)
36515 dst1 := v_0
36516 vardef := v_1
36517 if vardef.Op != OpVarDef {
36518 break
36519 }
36520 x := auxToSym(vardef.Aux)
36521 move := vardef.Args[0]
36522 if move.Op != OpMove || auxIntToInt64(move.AuxInt) != n || auxToType(move.Aux) != t {
36523 break
36524 }
36525 mem := move.Args[2]
36526 dst2 := move.Args[0]
36527 if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && clobber(move, vardef)) {
36528 break
36529 }
36530 v.reset(OpZero)
36531 v.AuxInt = int64ToAuxInt(n)
36532 v.Aux = typeToAux(t)
36533 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem)
36534 v0.Aux = symToAux(x)
36535 v0.AddArg(mem)
36536 v.AddArg2(dst1, v0)
36537 return true
36538 }
36539
36540
36541
36542 for {
36543 s := auxIntToInt64(v.AuxInt)
36544 t := auxToType(v.Aux)
36545 dst1 := v_0
36546 zero := v_1
36547 if zero.Op != OpZero || auxIntToInt64(zero.AuxInt) != s || auxToType(zero.Aux) != t {
36548 break
36549 }
36550 dst2 := zero.Args[0]
36551 if !(isSamePtr(dst1, dst2)) {
36552 break
36553 }
36554 v.copyOf(zero)
36555 return true
36556 }
36557
36558
36559
36560 for {
36561 s := auxIntToInt64(v.AuxInt)
36562 t := auxToType(v.Aux)
36563 dst1 := v_0
36564 vardef := v_1
36565 if vardef.Op != OpVarDef {
36566 break
36567 }
36568 vardef_0 := vardef.Args[0]
36569 if vardef_0.Op != OpZero || auxIntToInt64(vardef_0.AuxInt) != s || auxToType(vardef_0.Aux) != t {
36570 break
36571 }
36572 dst2 := vardef_0.Args[0]
36573 if !(isSamePtr(dst1, dst2)) {
36574 break
36575 }
36576 v.copyOf(vardef)
36577 return true
36578 }
36579 return false
36580 }
36581 func rewriteValuegeneric_OpZeroExt16to32(v *Value) bool {
36582 v_0 := v.Args[0]
36583
36584
36585 for {
36586 if v_0.Op != OpConst16 {
36587 break
36588 }
36589 c := auxIntToInt16(v_0.AuxInt)
36590 v.reset(OpConst32)
36591 v.AuxInt = int32ToAuxInt(int32(uint16(c)))
36592 return true
36593 }
36594
36595
36596
36597 for {
36598 if v_0.Op != OpTrunc32to16 {
36599 break
36600 }
36601 x := v_0.Args[0]
36602 if x.Op != OpRsh32Ux64 {
36603 break
36604 }
36605 _ = x.Args[1]
36606 x_1 := x.Args[1]
36607 if x_1.Op != OpConst64 {
36608 break
36609 }
36610 s := auxIntToInt64(x_1.AuxInt)
36611 if !(s >= 16) {
36612 break
36613 }
36614 v.copyOf(x)
36615 return true
36616 }
36617 return false
36618 }
36619 func rewriteValuegeneric_OpZeroExt16to64(v *Value) bool {
36620 v_0 := v.Args[0]
36621
36622
36623 for {
36624 if v_0.Op != OpConst16 {
36625 break
36626 }
36627 c := auxIntToInt16(v_0.AuxInt)
36628 v.reset(OpConst64)
36629 v.AuxInt = int64ToAuxInt(int64(uint16(c)))
36630 return true
36631 }
36632
36633
36634
36635 for {
36636 if v_0.Op != OpTrunc64to16 {
36637 break
36638 }
36639 x := v_0.Args[0]
36640 if x.Op != OpRsh64Ux64 {
36641 break
36642 }
36643 _ = x.Args[1]
36644 x_1 := x.Args[1]
36645 if x_1.Op != OpConst64 {
36646 break
36647 }
36648 s := auxIntToInt64(x_1.AuxInt)
36649 if !(s >= 48) {
36650 break
36651 }
36652 v.copyOf(x)
36653 return true
36654 }
36655 return false
36656 }
36657 func rewriteValuegeneric_OpZeroExt32to64(v *Value) bool {
36658 v_0 := v.Args[0]
36659
36660
36661 for {
36662 if v_0.Op != OpConst32 {
36663 break
36664 }
36665 c := auxIntToInt32(v_0.AuxInt)
36666 v.reset(OpConst64)
36667 v.AuxInt = int64ToAuxInt(int64(uint32(c)))
36668 return true
36669 }
36670
36671
36672
36673 for {
36674 if v_0.Op != OpTrunc64to32 {
36675 break
36676 }
36677 x := v_0.Args[0]
36678 if x.Op != OpRsh64Ux64 {
36679 break
36680 }
36681 _ = x.Args[1]
36682 x_1 := x.Args[1]
36683 if x_1.Op != OpConst64 {
36684 break
36685 }
36686 s := auxIntToInt64(x_1.AuxInt)
36687 if !(s >= 32) {
36688 break
36689 }
36690 v.copyOf(x)
36691 return true
36692 }
36693 return false
36694 }
36695 func rewriteValuegeneric_OpZeroExt8to16(v *Value) bool {
36696 v_0 := v.Args[0]
36697
36698
36699 for {
36700 if v_0.Op != OpConst8 {
36701 break
36702 }
36703 c := auxIntToInt8(v_0.AuxInt)
36704 v.reset(OpConst16)
36705 v.AuxInt = int16ToAuxInt(int16(uint8(c)))
36706 return true
36707 }
36708
36709
36710
36711 for {
36712 if v_0.Op != OpTrunc16to8 {
36713 break
36714 }
36715 x := v_0.Args[0]
36716 if x.Op != OpRsh16Ux64 {
36717 break
36718 }
36719 _ = x.Args[1]
36720 x_1 := x.Args[1]
36721 if x_1.Op != OpConst64 {
36722 break
36723 }
36724 s := auxIntToInt64(x_1.AuxInt)
36725 if !(s >= 8) {
36726 break
36727 }
36728 v.copyOf(x)
36729 return true
36730 }
36731 return false
36732 }
36733 func rewriteValuegeneric_OpZeroExt8to32(v *Value) bool {
36734 v_0 := v.Args[0]
36735
36736
36737 for {
36738 if v_0.Op != OpConst8 {
36739 break
36740 }
36741 c := auxIntToInt8(v_0.AuxInt)
36742 v.reset(OpConst32)
36743 v.AuxInt = int32ToAuxInt(int32(uint8(c)))
36744 return true
36745 }
36746
36747
36748
36749 for {
36750 if v_0.Op != OpTrunc32to8 {
36751 break
36752 }
36753 x := v_0.Args[0]
36754 if x.Op != OpRsh32Ux64 {
36755 break
36756 }
36757 _ = x.Args[1]
36758 x_1 := x.Args[1]
36759 if x_1.Op != OpConst64 {
36760 break
36761 }
36762 s := auxIntToInt64(x_1.AuxInt)
36763 if !(s >= 24) {
36764 break
36765 }
36766 v.copyOf(x)
36767 return true
36768 }
36769 return false
36770 }
36771 func rewriteValuegeneric_OpZeroExt8to64(v *Value) bool {
36772 v_0 := v.Args[0]
36773
36774
36775 for {
36776 if v_0.Op != OpConst8 {
36777 break
36778 }
36779 c := auxIntToInt8(v_0.AuxInt)
36780 v.reset(OpConst64)
36781 v.AuxInt = int64ToAuxInt(int64(uint8(c)))
36782 return true
36783 }
36784
36785
36786
36787 for {
36788 if v_0.Op != OpTrunc64to8 {
36789 break
36790 }
36791 x := v_0.Args[0]
36792 if x.Op != OpRsh64Ux64 {
36793 break
36794 }
36795 _ = x.Args[1]
36796 x_1 := x.Args[1]
36797 if x_1.Op != OpConst64 {
36798 break
36799 }
36800 s := auxIntToInt64(x_1.AuxInt)
36801 if !(s >= 56) {
36802 break
36803 }
36804 v.copyOf(x)
36805 return true
36806 }
36807 return false
36808 }
36809 func rewriteBlockgeneric(b *Block) bool {
36810 switch b.Kind {
36811 case BlockIf:
36812
36813
36814 for b.Controls[0].Op == OpNot {
36815 v_0 := b.Controls[0]
36816 cond := v_0.Args[0]
36817 b.resetWithControl(BlockIf, cond)
36818 b.swapSuccessors()
36819 return true
36820 }
36821
36822
36823
36824 for b.Controls[0].Op == OpConstBool {
36825 v_0 := b.Controls[0]
36826 c := auxIntToBool(v_0.AuxInt)
36827 if !(c) {
36828 break
36829 }
36830 b.Reset(BlockFirst)
36831 return true
36832 }
36833
36834
36835
36836 for b.Controls[0].Op == OpConstBool {
36837 v_0 := b.Controls[0]
36838 c := auxIntToBool(v_0.AuxInt)
36839 if !(!c) {
36840 break
36841 }
36842 b.Reset(BlockFirst)
36843 b.swapSuccessors()
36844 return true
36845 }
36846 }
36847 return false
36848 }
36849
View as plain text