1
2
3 package ssa
4
5 import "internal/buildcfg"
6 import "cmd/compile/internal/types"
7
8 func rewriteValueARM(v *Value) bool {
9 switch v.Op {
10 case OpARMADC:
11 return rewriteValueARM_OpARMADC(v)
12 case OpARMADCconst:
13 return rewriteValueARM_OpARMADCconst(v)
14 case OpARMADCshiftLL:
15 return rewriteValueARM_OpARMADCshiftLL(v)
16 case OpARMADCshiftLLreg:
17 return rewriteValueARM_OpARMADCshiftLLreg(v)
18 case OpARMADCshiftRA:
19 return rewriteValueARM_OpARMADCshiftRA(v)
20 case OpARMADCshiftRAreg:
21 return rewriteValueARM_OpARMADCshiftRAreg(v)
22 case OpARMADCshiftRL:
23 return rewriteValueARM_OpARMADCshiftRL(v)
24 case OpARMADCshiftRLreg:
25 return rewriteValueARM_OpARMADCshiftRLreg(v)
26 case OpARMADD:
27 return rewriteValueARM_OpARMADD(v)
28 case OpARMADDD:
29 return rewriteValueARM_OpARMADDD(v)
30 case OpARMADDF:
31 return rewriteValueARM_OpARMADDF(v)
32 case OpARMADDS:
33 return rewriteValueARM_OpARMADDS(v)
34 case OpARMADDSshiftLL:
35 return rewriteValueARM_OpARMADDSshiftLL(v)
36 case OpARMADDSshiftLLreg:
37 return rewriteValueARM_OpARMADDSshiftLLreg(v)
38 case OpARMADDSshiftRA:
39 return rewriteValueARM_OpARMADDSshiftRA(v)
40 case OpARMADDSshiftRAreg:
41 return rewriteValueARM_OpARMADDSshiftRAreg(v)
42 case OpARMADDSshiftRL:
43 return rewriteValueARM_OpARMADDSshiftRL(v)
44 case OpARMADDSshiftRLreg:
45 return rewriteValueARM_OpARMADDSshiftRLreg(v)
46 case OpARMADDconst:
47 return rewriteValueARM_OpARMADDconst(v)
48 case OpARMADDshiftLL:
49 return rewriteValueARM_OpARMADDshiftLL(v)
50 case OpARMADDshiftLLreg:
51 return rewriteValueARM_OpARMADDshiftLLreg(v)
52 case OpARMADDshiftRA:
53 return rewriteValueARM_OpARMADDshiftRA(v)
54 case OpARMADDshiftRAreg:
55 return rewriteValueARM_OpARMADDshiftRAreg(v)
56 case OpARMADDshiftRL:
57 return rewriteValueARM_OpARMADDshiftRL(v)
58 case OpARMADDshiftRLreg:
59 return rewriteValueARM_OpARMADDshiftRLreg(v)
60 case OpARMAND:
61 return rewriteValueARM_OpARMAND(v)
62 case OpARMANDconst:
63 return rewriteValueARM_OpARMANDconst(v)
64 case OpARMANDshiftLL:
65 return rewriteValueARM_OpARMANDshiftLL(v)
66 case OpARMANDshiftLLreg:
67 return rewriteValueARM_OpARMANDshiftLLreg(v)
68 case OpARMANDshiftRA:
69 return rewriteValueARM_OpARMANDshiftRA(v)
70 case OpARMANDshiftRAreg:
71 return rewriteValueARM_OpARMANDshiftRAreg(v)
72 case OpARMANDshiftRL:
73 return rewriteValueARM_OpARMANDshiftRL(v)
74 case OpARMANDshiftRLreg:
75 return rewriteValueARM_OpARMANDshiftRLreg(v)
76 case OpARMBFX:
77 return rewriteValueARM_OpARMBFX(v)
78 case OpARMBFXU:
79 return rewriteValueARM_OpARMBFXU(v)
80 case OpARMBIC:
81 return rewriteValueARM_OpARMBIC(v)
82 case OpARMBICconst:
83 return rewriteValueARM_OpARMBICconst(v)
84 case OpARMBICshiftLL:
85 return rewriteValueARM_OpARMBICshiftLL(v)
86 case OpARMBICshiftLLreg:
87 return rewriteValueARM_OpARMBICshiftLLreg(v)
88 case OpARMBICshiftRA:
89 return rewriteValueARM_OpARMBICshiftRA(v)
90 case OpARMBICshiftRAreg:
91 return rewriteValueARM_OpARMBICshiftRAreg(v)
92 case OpARMBICshiftRL:
93 return rewriteValueARM_OpARMBICshiftRL(v)
94 case OpARMBICshiftRLreg:
95 return rewriteValueARM_OpARMBICshiftRLreg(v)
96 case OpARMCMN:
97 return rewriteValueARM_OpARMCMN(v)
98 case OpARMCMNconst:
99 return rewriteValueARM_OpARMCMNconst(v)
100 case OpARMCMNshiftLL:
101 return rewriteValueARM_OpARMCMNshiftLL(v)
102 case OpARMCMNshiftLLreg:
103 return rewriteValueARM_OpARMCMNshiftLLreg(v)
104 case OpARMCMNshiftRA:
105 return rewriteValueARM_OpARMCMNshiftRA(v)
106 case OpARMCMNshiftRAreg:
107 return rewriteValueARM_OpARMCMNshiftRAreg(v)
108 case OpARMCMNshiftRL:
109 return rewriteValueARM_OpARMCMNshiftRL(v)
110 case OpARMCMNshiftRLreg:
111 return rewriteValueARM_OpARMCMNshiftRLreg(v)
112 case OpARMCMOVWHSconst:
113 return rewriteValueARM_OpARMCMOVWHSconst(v)
114 case OpARMCMOVWLSconst:
115 return rewriteValueARM_OpARMCMOVWLSconst(v)
116 case OpARMCMP:
117 return rewriteValueARM_OpARMCMP(v)
118 case OpARMCMPD:
119 return rewriteValueARM_OpARMCMPD(v)
120 case OpARMCMPF:
121 return rewriteValueARM_OpARMCMPF(v)
122 case OpARMCMPconst:
123 return rewriteValueARM_OpARMCMPconst(v)
124 case OpARMCMPshiftLL:
125 return rewriteValueARM_OpARMCMPshiftLL(v)
126 case OpARMCMPshiftLLreg:
127 return rewriteValueARM_OpARMCMPshiftLLreg(v)
128 case OpARMCMPshiftRA:
129 return rewriteValueARM_OpARMCMPshiftRA(v)
130 case OpARMCMPshiftRAreg:
131 return rewriteValueARM_OpARMCMPshiftRAreg(v)
132 case OpARMCMPshiftRL:
133 return rewriteValueARM_OpARMCMPshiftRL(v)
134 case OpARMCMPshiftRLreg:
135 return rewriteValueARM_OpARMCMPshiftRLreg(v)
136 case OpARMEqual:
137 return rewriteValueARM_OpARMEqual(v)
138 case OpARMGreaterEqual:
139 return rewriteValueARM_OpARMGreaterEqual(v)
140 case OpARMGreaterEqualU:
141 return rewriteValueARM_OpARMGreaterEqualU(v)
142 case OpARMGreaterThan:
143 return rewriteValueARM_OpARMGreaterThan(v)
144 case OpARMGreaterThanU:
145 return rewriteValueARM_OpARMGreaterThanU(v)
146 case OpARMLessEqual:
147 return rewriteValueARM_OpARMLessEqual(v)
148 case OpARMLessEqualU:
149 return rewriteValueARM_OpARMLessEqualU(v)
150 case OpARMLessThan:
151 return rewriteValueARM_OpARMLessThan(v)
152 case OpARMLessThanU:
153 return rewriteValueARM_OpARMLessThanU(v)
154 case OpARMMOVBUload:
155 return rewriteValueARM_OpARMMOVBUload(v)
156 case OpARMMOVBUloadidx:
157 return rewriteValueARM_OpARMMOVBUloadidx(v)
158 case OpARMMOVBUreg:
159 return rewriteValueARM_OpARMMOVBUreg(v)
160 case OpARMMOVBload:
161 return rewriteValueARM_OpARMMOVBload(v)
162 case OpARMMOVBloadidx:
163 return rewriteValueARM_OpARMMOVBloadidx(v)
164 case OpARMMOVBreg:
165 return rewriteValueARM_OpARMMOVBreg(v)
166 case OpARMMOVBstore:
167 return rewriteValueARM_OpARMMOVBstore(v)
168 case OpARMMOVBstoreidx:
169 return rewriteValueARM_OpARMMOVBstoreidx(v)
170 case OpARMMOVDload:
171 return rewriteValueARM_OpARMMOVDload(v)
172 case OpARMMOVDstore:
173 return rewriteValueARM_OpARMMOVDstore(v)
174 case OpARMMOVFload:
175 return rewriteValueARM_OpARMMOVFload(v)
176 case OpARMMOVFstore:
177 return rewriteValueARM_OpARMMOVFstore(v)
178 case OpARMMOVHUload:
179 return rewriteValueARM_OpARMMOVHUload(v)
180 case OpARMMOVHUloadidx:
181 return rewriteValueARM_OpARMMOVHUloadidx(v)
182 case OpARMMOVHUreg:
183 return rewriteValueARM_OpARMMOVHUreg(v)
184 case OpARMMOVHload:
185 return rewriteValueARM_OpARMMOVHload(v)
186 case OpARMMOVHloadidx:
187 return rewriteValueARM_OpARMMOVHloadidx(v)
188 case OpARMMOVHreg:
189 return rewriteValueARM_OpARMMOVHreg(v)
190 case OpARMMOVHstore:
191 return rewriteValueARM_OpARMMOVHstore(v)
192 case OpARMMOVHstoreidx:
193 return rewriteValueARM_OpARMMOVHstoreidx(v)
194 case OpARMMOVWload:
195 return rewriteValueARM_OpARMMOVWload(v)
196 case OpARMMOVWloadidx:
197 return rewriteValueARM_OpARMMOVWloadidx(v)
198 case OpARMMOVWloadshiftLL:
199 return rewriteValueARM_OpARMMOVWloadshiftLL(v)
200 case OpARMMOVWloadshiftRA:
201 return rewriteValueARM_OpARMMOVWloadshiftRA(v)
202 case OpARMMOVWloadshiftRL:
203 return rewriteValueARM_OpARMMOVWloadshiftRL(v)
204 case OpARMMOVWnop:
205 return rewriteValueARM_OpARMMOVWnop(v)
206 case OpARMMOVWreg:
207 return rewriteValueARM_OpARMMOVWreg(v)
208 case OpARMMOVWstore:
209 return rewriteValueARM_OpARMMOVWstore(v)
210 case OpARMMOVWstoreidx:
211 return rewriteValueARM_OpARMMOVWstoreidx(v)
212 case OpARMMOVWstoreshiftLL:
213 return rewriteValueARM_OpARMMOVWstoreshiftLL(v)
214 case OpARMMOVWstoreshiftRA:
215 return rewriteValueARM_OpARMMOVWstoreshiftRA(v)
216 case OpARMMOVWstoreshiftRL:
217 return rewriteValueARM_OpARMMOVWstoreshiftRL(v)
218 case OpARMMUL:
219 return rewriteValueARM_OpARMMUL(v)
220 case OpARMMULA:
221 return rewriteValueARM_OpARMMULA(v)
222 case OpARMMULD:
223 return rewriteValueARM_OpARMMULD(v)
224 case OpARMMULF:
225 return rewriteValueARM_OpARMMULF(v)
226 case OpARMMULS:
227 return rewriteValueARM_OpARMMULS(v)
228 case OpARMMVN:
229 return rewriteValueARM_OpARMMVN(v)
230 case OpARMMVNshiftLL:
231 return rewriteValueARM_OpARMMVNshiftLL(v)
232 case OpARMMVNshiftLLreg:
233 return rewriteValueARM_OpARMMVNshiftLLreg(v)
234 case OpARMMVNshiftRA:
235 return rewriteValueARM_OpARMMVNshiftRA(v)
236 case OpARMMVNshiftRAreg:
237 return rewriteValueARM_OpARMMVNshiftRAreg(v)
238 case OpARMMVNshiftRL:
239 return rewriteValueARM_OpARMMVNshiftRL(v)
240 case OpARMMVNshiftRLreg:
241 return rewriteValueARM_OpARMMVNshiftRLreg(v)
242 case OpARMNEGD:
243 return rewriteValueARM_OpARMNEGD(v)
244 case OpARMNEGF:
245 return rewriteValueARM_OpARMNEGF(v)
246 case OpARMNMULD:
247 return rewriteValueARM_OpARMNMULD(v)
248 case OpARMNMULF:
249 return rewriteValueARM_OpARMNMULF(v)
250 case OpARMNotEqual:
251 return rewriteValueARM_OpARMNotEqual(v)
252 case OpARMOR:
253 return rewriteValueARM_OpARMOR(v)
254 case OpARMORconst:
255 return rewriteValueARM_OpARMORconst(v)
256 case OpARMORshiftLL:
257 return rewriteValueARM_OpARMORshiftLL(v)
258 case OpARMORshiftLLreg:
259 return rewriteValueARM_OpARMORshiftLLreg(v)
260 case OpARMORshiftRA:
261 return rewriteValueARM_OpARMORshiftRA(v)
262 case OpARMORshiftRAreg:
263 return rewriteValueARM_OpARMORshiftRAreg(v)
264 case OpARMORshiftRL:
265 return rewriteValueARM_OpARMORshiftRL(v)
266 case OpARMORshiftRLreg:
267 return rewriteValueARM_OpARMORshiftRLreg(v)
268 case OpARMRSB:
269 return rewriteValueARM_OpARMRSB(v)
270 case OpARMRSBSshiftLL:
271 return rewriteValueARM_OpARMRSBSshiftLL(v)
272 case OpARMRSBSshiftLLreg:
273 return rewriteValueARM_OpARMRSBSshiftLLreg(v)
274 case OpARMRSBSshiftRA:
275 return rewriteValueARM_OpARMRSBSshiftRA(v)
276 case OpARMRSBSshiftRAreg:
277 return rewriteValueARM_OpARMRSBSshiftRAreg(v)
278 case OpARMRSBSshiftRL:
279 return rewriteValueARM_OpARMRSBSshiftRL(v)
280 case OpARMRSBSshiftRLreg:
281 return rewriteValueARM_OpARMRSBSshiftRLreg(v)
282 case OpARMRSBconst:
283 return rewriteValueARM_OpARMRSBconst(v)
284 case OpARMRSBshiftLL:
285 return rewriteValueARM_OpARMRSBshiftLL(v)
286 case OpARMRSBshiftLLreg:
287 return rewriteValueARM_OpARMRSBshiftLLreg(v)
288 case OpARMRSBshiftRA:
289 return rewriteValueARM_OpARMRSBshiftRA(v)
290 case OpARMRSBshiftRAreg:
291 return rewriteValueARM_OpARMRSBshiftRAreg(v)
292 case OpARMRSBshiftRL:
293 return rewriteValueARM_OpARMRSBshiftRL(v)
294 case OpARMRSBshiftRLreg:
295 return rewriteValueARM_OpARMRSBshiftRLreg(v)
296 case OpARMRSCconst:
297 return rewriteValueARM_OpARMRSCconst(v)
298 case OpARMRSCshiftLL:
299 return rewriteValueARM_OpARMRSCshiftLL(v)
300 case OpARMRSCshiftLLreg:
301 return rewriteValueARM_OpARMRSCshiftLLreg(v)
302 case OpARMRSCshiftRA:
303 return rewriteValueARM_OpARMRSCshiftRA(v)
304 case OpARMRSCshiftRAreg:
305 return rewriteValueARM_OpARMRSCshiftRAreg(v)
306 case OpARMRSCshiftRL:
307 return rewriteValueARM_OpARMRSCshiftRL(v)
308 case OpARMRSCshiftRLreg:
309 return rewriteValueARM_OpARMRSCshiftRLreg(v)
310 case OpARMSBC:
311 return rewriteValueARM_OpARMSBC(v)
312 case OpARMSBCconst:
313 return rewriteValueARM_OpARMSBCconst(v)
314 case OpARMSBCshiftLL:
315 return rewriteValueARM_OpARMSBCshiftLL(v)
316 case OpARMSBCshiftLLreg:
317 return rewriteValueARM_OpARMSBCshiftLLreg(v)
318 case OpARMSBCshiftRA:
319 return rewriteValueARM_OpARMSBCshiftRA(v)
320 case OpARMSBCshiftRAreg:
321 return rewriteValueARM_OpARMSBCshiftRAreg(v)
322 case OpARMSBCshiftRL:
323 return rewriteValueARM_OpARMSBCshiftRL(v)
324 case OpARMSBCshiftRLreg:
325 return rewriteValueARM_OpARMSBCshiftRLreg(v)
326 case OpARMSLL:
327 return rewriteValueARM_OpARMSLL(v)
328 case OpARMSLLconst:
329 return rewriteValueARM_OpARMSLLconst(v)
330 case OpARMSRA:
331 return rewriteValueARM_OpARMSRA(v)
332 case OpARMSRAcond:
333 return rewriteValueARM_OpARMSRAcond(v)
334 case OpARMSRAconst:
335 return rewriteValueARM_OpARMSRAconst(v)
336 case OpARMSRL:
337 return rewriteValueARM_OpARMSRL(v)
338 case OpARMSRLconst:
339 return rewriteValueARM_OpARMSRLconst(v)
340 case OpARMSRR:
341 return rewriteValueARM_OpARMSRR(v)
342 case OpARMSUB:
343 return rewriteValueARM_OpARMSUB(v)
344 case OpARMSUBD:
345 return rewriteValueARM_OpARMSUBD(v)
346 case OpARMSUBF:
347 return rewriteValueARM_OpARMSUBF(v)
348 case OpARMSUBS:
349 return rewriteValueARM_OpARMSUBS(v)
350 case OpARMSUBSshiftLL:
351 return rewriteValueARM_OpARMSUBSshiftLL(v)
352 case OpARMSUBSshiftLLreg:
353 return rewriteValueARM_OpARMSUBSshiftLLreg(v)
354 case OpARMSUBSshiftRA:
355 return rewriteValueARM_OpARMSUBSshiftRA(v)
356 case OpARMSUBSshiftRAreg:
357 return rewriteValueARM_OpARMSUBSshiftRAreg(v)
358 case OpARMSUBSshiftRL:
359 return rewriteValueARM_OpARMSUBSshiftRL(v)
360 case OpARMSUBSshiftRLreg:
361 return rewriteValueARM_OpARMSUBSshiftRLreg(v)
362 case OpARMSUBconst:
363 return rewriteValueARM_OpARMSUBconst(v)
364 case OpARMSUBshiftLL:
365 return rewriteValueARM_OpARMSUBshiftLL(v)
366 case OpARMSUBshiftLLreg:
367 return rewriteValueARM_OpARMSUBshiftLLreg(v)
368 case OpARMSUBshiftRA:
369 return rewriteValueARM_OpARMSUBshiftRA(v)
370 case OpARMSUBshiftRAreg:
371 return rewriteValueARM_OpARMSUBshiftRAreg(v)
372 case OpARMSUBshiftRL:
373 return rewriteValueARM_OpARMSUBshiftRL(v)
374 case OpARMSUBshiftRLreg:
375 return rewriteValueARM_OpARMSUBshiftRLreg(v)
376 case OpARMTEQ:
377 return rewriteValueARM_OpARMTEQ(v)
378 case OpARMTEQconst:
379 return rewriteValueARM_OpARMTEQconst(v)
380 case OpARMTEQshiftLL:
381 return rewriteValueARM_OpARMTEQshiftLL(v)
382 case OpARMTEQshiftLLreg:
383 return rewriteValueARM_OpARMTEQshiftLLreg(v)
384 case OpARMTEQshiftRA:
385 return rewriteValueARM_OpARMTEQshiftRA(v)
386 case OpARMTEQshiftRAreg:
387 return rewriteValueARM_OpARMTEQshiftRAreg(v)
388 case OpARMTEQshiftRL:
389 return rewriteValueARM_OpARMTEQshiftRL(v)
390 case OpARMTEQshiftRLreg:
391 return rewriteValueARM_OpARMTEQshiftRLreg(v)
392 case OpARMTST:
393 return rewriteValueARM_OpARMTST(v)
394 case OpARMTSTconst:
395 return rewriteValueARM_OpARMTSTconst(v)
396 case OpARMTSTshiftLL:
397 return rewriteValueARM_OpARMTSTshiftLL(v)
398 case OpARMTSTshiftLLreg:
399 return rewriteValueARM_OpARMTSTshiftLLreg(v)
400 case OpARMTSTshiftRA:
401 return rewriteValueARM_OpARMTSTshiftRA(v)
402 case OpARMTSTshiftRAreg:
403 return rewriteValueARM_OpARMTSTshiftRAreg(v)
404 case OpARMTSTshiftRL:
405 return rewriteValueARM_OpARMTSTshiftRL(v)
406 case OpARMTSTshiftRLreg:
407 return rewriteValueARM_OpARMTSTshiftRLreg(v)
408 case OpARMXOR:
409 return rewriteValueARM_OpARMXOR(v)
410 case OpARMXORconst:
411 return rewriteValueARM_OpARMXORconst(v)
412 case OpARMXORshiftLL:
413 return rewriteValueARM_OpARMXORshiftLL(v)
414 case OpARMXORshiftLLreg:
415 return rewriteValueARM_OpARMXORshiftLLreg(v)
416 case OpARMXORshiftRA:
417 return rewriteValueARM_OpARMXORshiftRA(v)
418 case OpARMXORshiftRAreg:
419 return rewriteValueARM_OpARMXORshiftRAreg(v)
420 case OpARMXORshiftRL:
421 return rewriteValueARM_OpARMXORshiftRL(v)
422 case OpARMXORshiftRLreg:
423 return rewriteValueARM_OpARMXORshiftRLreg(v)
424 case OpARMXORshiftRR:
425 return rewriteValueARM_OpARMXORshiftRR(v)
426 case OpAbs:
427 v.Op = OpARMABSD
428 return true
429 case OpAdd16:
430 v.Op = OpARMADD
431 return true
432 case OpAdd32:
433 v.Op = OpARMADD
434 return true
435 case OpAdd32F:
436 v.Op = OpARMADDF
437 return true
438 case OpAdd32carry:
439 v.Op = OpARMADDS
440 return true
441 case OpAdd32withcarry:
442 v.Op = OpARMADC
443 return true
444 case OpAdd64F:
445 v.Op = OpARMADDD
446 return true
447 case OpAdd8:
448 v.Op = OpARMADD
449 return true
450 case OpAddPtr:
451 v.Op = OpARMADD
452 return true
453 case OpAddr:
454 return rewriteValueARM_OpAddr(v)
455 case OpAnd16:
456 v.Op = OpARMAND
457 return true
458 case OpAnd32:
459 v.Op = OpARMAND
460 return true
461 case OpAnd8:
462 v.Op = OpARMAND
463 return true
464 case OpAndB:
465 v.Op = OpARMAND
466 return true
467 case OpAvg32u:
468 return rewriteValueARM_OpAvg32u(v)
469 case OpBitLen16:
470 return rewriteValueARM_OpBitLen16(v)
471 case OpBitLen32:
472 return rewriteValueARM_OpBitLen32(v)
473 case OpBitLen8:
474 return rewriteValueARM_OpBitLen8(v)
475 case OpBswap32:
476 return rewriteValueARM_OpBswap32(v)
477 case OpClosureCall:
478 v.Op = OpARMCALLclosure
479 return true
480 case OpCom16:
481 v.Op = OpARMMVN
482 return true
483 case OpCom32:
484 v.Op = OpARMMVN
485 return true
486 case OpCom8:
487 v.Op = OpARMMVN
488 return true
489 case OpConst16:
490 return rewriteValueARM_OpConst16(v)
491 case OpConst32:
492 return rewriteValueARM_OpConst32(v)
493 case OpConst32F:
494 return rewriteValueARM_OpConst32F(v)
495 case OpConst64F:
496 return rewriteValueARM_OpConst64F(v)
497 case OpConst8:
498 return rewriteValueARM_OpConst8(v)
499 case OpConstBool:
500 return rewriteValueARM_OpConstBool(v)
501 case OpConstNil:
502 return rewriteValueARM_OpConstNil(v)
503 case OpCtz16:
504 return rewriteValueARM_OpCtz16(v)
505 case OpCtz16NonZero:
506 v.Op = OpCtz32
507 return true
508 case OpCtz32:
509 return rewriteValueARM_OpCtz32(v)
510 case OpCtz32NonZero:
511 v.Op = OpCtz32
512 return true
513 case OpCtz8:
514 return rewriteValueARM_OpCtz8(v)
515 case OpCtz8NonZero:
516 v.Op = OpCtz32
517 return true
518 case OpCvt32Fto32:
519 v.Op = OpARMMOVFW
520 return true
521 case OpCvt32Fto32U:
522 v.Op = OpARMMOVFWU
523 return true
524 case OpCvt32Fto64F:
525 v.Op = OpARMMOVFD
526 return true
527 case OpCvt32Uto32F:
528 v.Op = OpARMMOVWUF
529 return true
530 case OpCvt32Uto64F:
531 v.Op = OpARMMOVWUD
532 return true
533 case OpCvt32to32F:
534 v.Op = OpARMMOVWF
535 return true
536 case OpCvt32to64F:
537 v.Op = OpARMMOVWD
538 return true
539 case OpCvt64Fto32:
540 v.Op = OpARMMOVDW
541 return true
542 case OpCvt64Fto32F:
543 v.Op = OpARMMOVDF
544 return true
545 case OpCvt64Fto32U:
546 v.Op = OpARMMOVDWU
547 return true
548 case OpCvtBoolToUint8:
549 v.Op = OpCopy
550 return true
551 case OpDiv16:
552 return rewriteValueARM_OpDiv16(v)
553 case OpDiv16u:
554 return rewriteValueARM_OpDiv16u(v)
555 case OpDiv32:
556 return rewriteValueARM_OpDiv32(v)
557 case OpDiv32F:
558 v.Op = OpARMDIVF
559 return true
560 case OpDiv32u:
561 return rewriteValueARM_OpDiv32u(v)
562 case OpDiv64F:
563 v.Op = OpARMDIVD
564 return true
565 case OpDiv8:
566 return rewriteValueARM_OpDiv8(v)
567 case OpDiv8u:
568 return rewriteValueARM_OpDiv8u(v)
569 case OpEq16:
570 return rewriteValueARM_OpEq16(v)
571 case OpEq32:
572 return rewriteValueARM_OpEq32(v)
573 case OpEq32F:
574 return rewriteValueARM_OpEq32F(v)
575 case OpEq64F:
576 return rewriteValueARM_OpEq64F(v)
577 case OpEq8:
578 return rewriteValueARM_OpEq8(v)
579 case OpEqB:
580 return rewriteValueARM_OpEqB(v)
581 case OpEqPtr:
582 return rewriteValueARM_OpEqPtr(v)
583 case OpFMA:
584 return rewriteValueARM_OpFMA(v)
585 case OpGetCallerPC:
586 v.Op = OpARMLoweredGetCallerPC
587 return true
588 case OpGetCallerSP:
589 v.Op = OpARMLoweredGetCallerSP
590 return true
591 case OpGetClosurePtr:
592 v.Op = OpARMLoweredGetClosurePtr
593 return true
594 case OpHmul32:
595 v.Op = OpARMHMUL
596 return true
597 case OpHmul32u:
598 v.Op = OpARMHMULU
599 return true
600 case OpInterCall:
601 v.Op = OpARMCALLinter
602 return true
603 case OpIsInBounds:
604 return rewriteValueARM_OpIsInBounds(v)
605 case OpIsNonNil:
606 return rewriteValueARM_OpIsNonNil(v)
607 case OpIsSliceInBounds:
608 return rewriteValueARM_OpIsSliceInBounds(v)
609 case OpLeq16:
610 return rewriteValueARM_OpLeq16(v)
611 case OpLeq16U:
612 return rewriteValueARM_OpLeq16U(v)
613 case OpLeq32:
614 return rewriteValueARM_OpLeq32(v)
615 case OpLeq32F:
616 return rewriteValueARM_OpLeq32F(v)
617 case OpLeq32U:
618 return rewriteValueARM_OpLeq32U(v)
619 case OpLeq64F:
620 return rewriteValueARM_OpLeq64F(v)
621 case OpLeq8:
622 return rewriteValueARM_OpLeq8(v)
623 case OpLeq8U:
624 return rewriteValueARM_OpLeq8U(v)
625 case OpLess16:
626 return rewriteValueARM_OpLess16(v)
627 case OpLess16U:
628 return rewriteValueARM_OpLess16U(v)
629 case OpLess32:
630 return rewriteValueARM_OpLess32(v)
631 case OpLess32F:
632 return rewriteValueARM_OpLess32F(v)
633 case OpLess32U:
634 return rewriteValueARM_OpLess32U(v)
635 case OpLess64F:
636 return rewriteValueARM_OpLess64F(v)
637 case OpLess8:
638 return rewriteValueARM_OpLess8(v)
639 case OpLess8U:
640 return rewriteValueARM_OpLess8U(v)
641 case OpLoad:
642 return rewriteValueARM_OpLoad(v)
643 case OpLocalAddr:
644 return rewriteValueARM_OpLocalAddr(v)
645 case OpLsh16x16:
646 return rewriteValueARM_OpLsh16x16(v)
647 case OpLsh16x32:
648 return rewriteValueARM_OpLsh16x32(v)
649 case OpLsh16x64:
650 return rewriteValueARM_OpLsh16x64(v)
651 case OpLsh16x8:
652 return rewriteValueARM_OpLsh16x8(v)
653 case OpLsh32x16:
654 return rewriteValueARM_OpLsh32x16(v)
655 case OpLsh32x32:
656 return rewriteValueARM_OpLsh32x32(v)
657 case OpLsh32x64:
658 return rewriteValueARM_OpLsh32x64(v)
659 case OpLsh32x8:
660 return rewriteValueARM_OpLsh32x8(v)
661 case OpLsh8x16:
662 return rewriteValueARM_OpLsh8x16(v)
663 case OpLsh8x32:
664 return rewriteValueARM_OpLsh8x32(v)
665 case OpLsh8x64:
666 return rewriteValueARM_OpLsh8x64(v)
667 case OpLsh8x8:
668 return rewriteValueARM_OpLsh8x8(v)
669 case OpMod16:
670 return rewriteValueARM_OpMod16(v)
671 case OpMod16u:
672 return rewriteValueARM_OpMod16u(v)
673 case OpMod32:
674 return rewriteValueARM_OpMod32(v)
675 case OpMod32u:
676 return rewriteValueARM_OpMod32u(v)
677 case OpMod8:
678 return rewriteValueARM_OpMod8(v)
679 case OpMod8u:
680 return rewriteValueARM_OpMod8u(v)
681 case OpMove:
682 return rewriteValueARM_OpMove(v)
683 case OpMul16:
684 v.Op = OpARMMUL
685 return true
686 case OpMul32:
687 v.Op = OpARMMUL
688 return true
689 case OpMul32F:
690 v.Op = OpARMMULF
691 return true
692 case OpMul32uhilo:
693 v.Op = OpARMMULLU
694 return true
695 case OpMul64F:
696 v.Op = OpARMMULD
697 return true
698 case OpMul8:
699 v.Op = OpARMMUL
700 return true
701 case OpNeg16:
702 return rewriteValueARM_OpNeg16(v)
703 case OpNeg32:
704 return rewriteValueARM_OpNeg32(v)
705 case OpNeg32F:
706 v.Op = OpARMNEGF
707 return true
708 case OpNeg64F:
709 v.Op = OpARMNEGD
710 return true
711 case OpNeg8:
712 return rewriteValueARM_OpNeg8(v)
713 case OpNeq16:
714 return rewriteValueARM_OpNeq16(v)
715 case OpNeq32:
716 return rewriteValueARM_OpNeq32(v)
717 case OpNeq32F:
718 return rewriteValueARM_OpNeq32F(v)
719 case OpNeq64F:
720 return rewriteValueARM_OpNeq64F(v)
721 case OpNeq8:
722 return rewriteValueARM_OpNeq8(v)
723 case OpNeqB:
724 v.Op = OpARMXOR
725 return true
726 case OpNeqPtr:
727 return rewriteValueARM_OpNeqPtr(v)
728 case OpNilCheck:
729 v.Op = OpARMLoweredNilCheck
730 return true
731 case OpNot:
732 return rewriteValueARM_OpNot(v)
733 case OpOffPtr:
734 return rewriteValueARM_OpOffPtr(v)
735 case OpOr16:
736 v.Op = OpARMOR
737 return true
738 case OpOr32:
739 v.Op = OpARMOR
740 return true
741 case OpOr8:
742 v.Op = OpARMOR
743 return true
744 case OpOrB:
745 v.Op = OpARMOR
746 return true
747 case OpPanicBounds:
748 return rewriteValueARM_OpPanicBounds(v)
749 case OpPanicExtend:
750 return rewriteValueARM_OpPanicExtend(v)
751 case OpRotateLeft16:
752 return rewriteValueARM_OpRotateLeft16(v)
753 case OpRotateLeft32:
754 return rewriteValueARM_OpRotateLeft32(v)
755 case OpRotateLeft8:
756 return rewriteValueARM_OpRotateLeft8(v)
757 case OpRound32F:
758 v.Op = OpCopy
759 return true
760 case OpRound64F:
761 v.Op = OpCopy
762 return true
763 case OpRsh16Ux16:
764 return rewriteValueARM_OpRsh16Ux16(v)
765 case OpRsh16Ux32:
766 return rewriteValueARM_OpRsh16Ux32(v)
767 case OpRsh16Ux64:
768 return rewriteValueARM_OpRsh16Ux64(v)
769 case OpRsh16Ux8:
770 return rewriteValueARM_OpRsh16Ux8(v)
771 case OpRsh16x16:
772 return rewriteValueARM_OpRsh16x16(v)
773 case OpRsh16x32:
774 return rewriteValueARM_OpRsh16x32(v)
775 case OpRsh16x64:
776 return rewriteValueARM_OpRsh16x64(v)
777 case OpRsh16x8:
778 return rewriteValueARM_OpRsh16x8(v)
779 case OpRsh32Ux16:
780 return rewriteValueARM_OpRsh32Ux16(v)
781 case OpRsh32Ux32:
782 return rewriteValueARM_OpRsh32Ux32(v)
783 case OpRsh32Ux64:
784 return rewriteValueARM_OpRsh32Ux64(v)
785 case OpRsh32Ux8:
786 return rewriteValueARM_OpRsh32Ux8(v)
787 case OpRsh32x16:
788 return rewriteValueARM_OpRsh32x16(v)
789 case OpRsh32x32:
790 return rewriteValueARM_OpRsh32x32(v)
791 case OpRsh32x64:
792 return rewriteValueARM_OpRsh32x64(v)
793 case OpRsh32x8:
794 return rewriteValueARM_OpRsh32x8(v)
795 case OpRsh8Ux16:
796 return rewriteValueARM_OpRsh8Ux16(v)
797 case OpRsh8Ux32:
798 return rewriteValueARM_OpRsh8Ux32(v)
799 case OpRsh8Ux64:
800 return rewriteValueARM_OpRsh8Ux64(v)
801 case OpRsh8Ux8:
802 return rewriteValueARM_OpRsh8Ux8(v)
803 case OpRsh8x16:
804 return rewriteValueARM_OpRsh8x16(v)
805 case OpRsh8x32:
806 return rewriteValueARM_OpRsh8x32(v)
807 case OpRsh8x64:
808 return rewriteValueARM_OpRsh8x64(v)
809 case OpRsh8x8:
810 return rewriteValueARM_OpRsh8x8(v)
811 case OpSelect0:
812 return rewriteValueARM_OpSelect0(v)
813 case OpSelect1:
814 return rewriteValueARM_OpSelect1(v)
815 case OpSignExt16to32:
816 v.Op = OpARMMOVHreg
817 return true
818 case OpSignExt8to16:
819 v.Op = OpARMMOVBreg
820 return true
821 case OpSignExt8to32:
822 v.Op = OpARMMOVBreg
823 return true
824 case OpSignmask:
825 return rewriteValueARM_OpSignmask(v)
826 case OpSlicemask:
827 return rewriteValueARM_OpSlicemask(v)
828 case OpSqrt:
829 v.Op = OpARMSQRTD
830 return true
831 case OpSqrt32:
832 v.Op = OpARMSQRTF
833 return true
834 case OpStaticCall:
835 v.Op = OpARMCALLstatic
836 return true
837 case OpStore:
838 return rewriteValueARM_OpStore(v)
839 case OpSub16:
840 v.Op = OpARMSUB
841 return true
842 case OpSub32:
843 v.Op = OpARMSUB
844 return true
845 case OpSub32F:
846 v.Op = OpARMSUBF
847 return true
848 case OpSub32carry:
849 v.Op = OpARMSUBS
850 return true
851 case OpSub32withcarry:
852 v.Op = OpARMSBC
853 return true
854 case OpSub64F:
855 v.Op = OpARMSUBD
856 return true
857 case OpSub8:
858 v.Op = OpARMSUB
859 return true
860 case OpSubPtr:
861 v.Op = OpARMSUB
862 return true
863 case OpTailCall:
864 v.Op = OpARMCALLtail
865 return true
866 case OpTrunc16to8:
867 v.Op = OpCopy
868 return true
869 case OpTrunc32to16:
870 v.Op = OpCopy
871 return true
872 case OpTrunc32to8:
873 v.Op = OpCopy
874 return true
875 case OpWB:
876 v.Op = OpARMLoweredWB
877 return true
878 case OpXor16:
879 v.Op = OpARMXOR
880 return true
881 case OpXor32:
882 v.Op = OpARMXOR
883 return true
884 case OpXor8:
885 v.Op = OpARMXOR
886 return true
887 case OpZero:
888 return rewriteValueARM_OpZero(v)
889 case OpZeroExt16to32:
890 v.Op = OpARMMOVHUreg
891 return true
892 case OpZeroExt8to16:
893 v.Op = OpARMMOVBUreg
894 return true
895 case OpZeroExt8to32:
896 v.Op = OpARMMOVBUreg
897 return true
898 case OpZeromask:
899 return rewriteValueARM_OpZeromask(v)
900 }
901 return false
902 }
903 func rewriteValueARM_OpARMADC(v *Value) bool {
904 v_2 := v.Args[2]
905 v_1 := v.Args[1]
906 v_0 := v.Args[0]
907
908
909 for {
910 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
911 if v_0.Op != OpARMMOVWconst {
912 continue
913 }
914 c := auxIntToInt32(v_0.AuxInt)
915 x := v_1
916 flags := v_2
917 v.reset(OpARMADCconst)
918 v.AuxInt = int32ToAuxInt(c)
919 v.AddArg2(x, flags)
920 return true
921 }
922 break
923 }
924
925
926 for {
927 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
928 x := v_0
929 if v_1.Op != OpARMSLLconst {
930 continue
931 }
932 c := auxIntToInt32(v_1.AuxInt)
933 y := v_1.Args[0]
934 flags := v_2
935 v.reset(OpARMADCshiftLL)
936 v.AuxInt = int32ToAuxInt(c)
937 v.AddArg3(x, y, flags)
938 return true
939 }
940 break
941 }
942
943
944 for {
945 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
946 x := v_0
947 if v_1.Op != OpARMSRLconst {
948 continue
949 }
950 c := auxIntToInt32(v_1.AuxInt)
951 y := v_1.Args[0]
952 flags := v_2
953 v.reset(OpARMADCshiftRL)
954 v.AuxInt = int32ToAuxInt(c)
955 v.AddArg3(x, y, flags)
956 return true
957 }
958 break
959 }
960
961
962 for {
963 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
964 x := v_0
965 if v_1.Op != OpARMSRAconst {
966 continue
967 }
968 c := auxIntToInt32(v_1.AuxInt)
969 y := v_1.Args[0]
970 flags := v_2
971 v.reset(OpARMADCshiftRA)
972 v.AuxInt = int32ToAuxInt(c)
973 v.AddArg3(x, y, flags)
974 return true
975 }
976 break
977 }
978
979
980 for {
981 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
982 x := v_0
983 if v_1.Op != OpARMSLL {
984 continue
985 }
986 z := v_1.Args[1]
987 y := v_1.Args[0]
988 flags := v_2
989 v.reset(OpARMADCshiftLLreg)
990 v.AddArg4(x, y, z, flags)
991 return true
992 }
993 break
994 }
995
996
997 for {
998 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
999 x := v_0
1000 if v_1.Op != OpARMSRL {
1001 continue
1002 }
1003 z := v_1.Args[1]
1004 y := v_1.Args[0]
1005 flags := v_2
1006 v.reset(OpARMADCshiftRLreg)
1007 v.AddArg4(x, y, z, flags)
1008 return true
1009 }
1010 break
1011 }
1012
1013
1014 for {
1015 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1016 x := v_0
1017 if v_1.Op != OpARMSRA {
1018 continue
1019 }
1020 z := v_1.Args[1]
1021 y := v_1.Args[0]
1022 flags := v_2
1023 v.reset(OpARMADCshiftRAreg)
1024 v.AddArg4(x, y, z, flags)
1025 return true
1026 }
1027 break
1028 }
1029 return false
1030 }
1031 func rewriteValueARM_OpARMADCconst(v *Value) bool {
1032 v_1 := v.Args[1]
1033 v_0 := v.Args[0]
1034
1035
1036 for {
1037 c := auxIntToInt32(v.AuxInt)
1038 if v_0.Op != OpARMADDconst {
1039 break
1040 }
1041 d := auxIntToInt32(v_0.AuxInt)
1042 x := v_0.Args[0]
1043 flags := v_1
1044 v.reset(OpARMADCconst)
1045 v.AuxInt = int32ToAuxInt(c + d)
1046 v.AddArg2(x, flags)
1047 return true
1048 }
1049
1050
1051 for {
1052 c := auxIntToInt32(v.AuxInt)
1053 if v_0.Op != OpARMSUBconst {
1054 break
1055 }
1056 d := auxIntToInt32(v_0.AuxInt)
1057 x := v_0.Args[0]
1058 flags := v_1
1059 v.reset(OpARMADCconst)
1060 v.AuxInt = int32ToAuxInt(c - d)
1061 v.AddArg2(x, flags)
1062 return true
1063 }
1064 return false
1065 }
1066 func rewriteValueARM_OpARMADCshiftLL(v *Value) bool {
1067 v_2 := v.Args[2]
1068 v_1 := v.Args[1]
1069 v_0 := v.Args[0]
1070 b := v.Block
1071
1072
1073 for {
1074 d := auxIntToInt32(v.AuxInt)
1075 if v_0.Op != OpARMMOVWconst {
1076 break
1077 }
1078 c := auxIntToInt32(v_0.AuxInt)
1079 x := v_1
1080 flags := v_2
1081 v.reset(OpARMADCconst)
1082 v.AuxInt = int32ToAuxInt(c)
1083 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
1084 v0.AuxInt = int32ToAuxInt(d)
1085 v0.AddArg(x)
1086 v.AddArg2(v0, flags)
1087 return true
1088 }
1089
1090
1091 for {
1092 d := auxIntToInt32(v.AuxInt)
1093 x := v_0
1094 if v_1.Op != OpARMMOVWconst {
1095 break
1096 }
1097 c := auxIntToInt32(v_1.AuxInt)
1098 flags := v_2
1099 v.reset(OpARMADCconst)
1100 v.AuxInt = int32ToAuxInt(c << uint64(d))
1101 v.AddArg2(x, flags)
1102 return true
1103 }
1104 return false
1105 }
1106 func rewriteValueARM_OpARMADCshiftLLreg(v *Value) bool {
1107 v_3 := v.Args[3]
1108 v_2 := v.Args[2]
1109 v_1 := v.Args[1]
1110 v_0 := v.Args[0]
1111 b := v.Block
1112
1113
1114 for {
1115 if v_0.Op != OpARMMOVWconst {
1116 break
1117 }
1118 c := auxIntToInt32(v_0.AuxInt)
1119 x := v_1
1120 y := v_2
1121 flags := v_3
1122 v.reset(OpARMADCconst)
1123 v.AuxInt = int32ToAuxInt(c)
1124 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
1125 v0.AddArg2(x, y)
1126 v.AddArg2(v0, flags)
1127 return true
1128 }
1129
1130
1131
1132 for {
1133 x := v_0
1134 y := v_1
1135 if v_2.Op != OpARMMOVWconst {
1136 break
1137 }
1138 c := auxIntToInt32(v_2.AuxInt)
1139 flags := v_3
1140 if !(0 <= c && c < 32) {
1141 break
1142 }
1143 v.reset(OpARMADCshiftLL)
1144 v.AuxInt = int32ToAuxInt(c)
1145 v.AddArg3(x, y, flags)
1146 return true
1147 }
1148 return false
1149 }
1150 func rewriteValueARM_OpARMADCshiftRA(v *Value) bool {
1151 v_2 := v.Args[2]
1152 v_1 := v.Args[1]
1153 v_0 := v.Args[0]
1154 b := v.Block
1155
1156
1157 for {
1158 d := auxIntToInt32(v.AuxInt)
1159 if v_0.Op != OpARMMOVWconst {
1160 break
1161 }
1162 c := auxIntToInt32(v_0.AuxInt)
1163 x := v_1
1164 flags := v_2
1165 v.reset(OpARMADCconst)
1166 v.AuxInt = int32ToAuxInt(c)
1167 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
1168 v0.AuxInt = int32ToAuxInt(d)
1169 v0.AddArg(x)
1170 v.AddArg2(v0, flags)
1171 return true
1172 }
1173
1174
1175 for {
1176 d := auxIntToInt32(v.AuxInt)
1177 x := v_0
1178 if v_1.Op != OpARMMOVWconst {
1179 break
1180 }
1181 c := auxIntToInt32(v_1.AuxInt)
1182 flags := v_2
1183 v.reset(OpARMADCconst)
1184 v.AuxInt = int32ToAuxInt(c >> uint64(d))
1185 v.AddArg2(x, flags)
1186 return true
1187 }
1188 return false
1189 }
1190 func rewriteValueARM_OpARMADCshiftRAreg(v *Value) bool {
1191 v_3 := v.Args[3]
1192 v_2 := v.Args[2]
1193 v_1 := v.Args[1]
1194 v_0 := v.Args[0]
1195 b := v.Block
1196
1197
1198 for {
1199 if v_0.Op != OpARMMOVWconst {
1200 break
1201 }
1202 c := auxIntToInt32(v_0.AuxInt)
1203 x := v_1
1204 y := v_2
1205 flags := v_3
1206 v.reset(OpARMADCconst)
1207 v.AuxInt = int32ToAuxInt(c)
1208 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
1209 v0.AddArg2(x, y)
1210 v.AddArg2(v0, flags)
1211 return true
1212 }
1213
1214
1215
1216 for {
1217 x := v_0
1218 y := v_1
1219 if v_2.Op != OpARMMOVWconst {
1220 break
1221 }
1222 c := auxIntToInt32(v_2.AuxInt)
1223 flags := v_3
1224 if !(0 <= c && c < 32) {
1225 break
1226 }
1227 v.reset(OpARMADCshiftRA)
1228 v.AuxInt = int32ToAuxInt(c)
1229 v.AddArg3(x, y, flags)
1230 return true
1231 }
1232 return false
1233 }
1234 func rewriteValueARM_OpARMADCshiftRL(v *Value) bool {
1235 v_2 := v.Args[2]
1236 v_1 := v.Args[1]
1237 v_0 := v.Args[0]
1238 b := v.Block
1239
1240
1241 for {
1242 d := auxIntToInt32(v.AuxInt)
1243 if v_0.Op != OpARMMOVWconst {
1244 break
1245 }
1246 c := auxIntToInt32(v_0.AuxInt)
1247 x := v_1
1248 flags := v_2
1249 v.reset(OpARMADCconst)
1250 v.AuxInt = int32ToAuxInt(c)
1251 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
1252 v0.AuxInt = int32ToAuxInt(d)
1253 v0.AddArg(x)
1254 v.AddArg2(v0, flags)
1255 return true
1256 }
1257
1258
1259 for {
1260 d := auxIntToInt32(v.AuxInt)
1261 x := v_0
1262 if v_1.Op != OpARMMOVWconst {
1263 break
1264 }
1265 c := auxIntToInt32(v_1.AuxInt)
1266 flags := v_2
1267 v.reset(OpARMADCconst)
1268 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
1269 v.AddArg2(x, flags)
1270 return true
1271 }
1272 return false
1273 }
1274 func rewriteValueARM_OpARMADCshiftRLreg(v *Value) bool {
1275 v_3 := v.Args[3]
1276 v_2 := v.Args[2]
1277 v_1 := v.Args[1]
1278 v_0 := v.Args[0]
1279 b := v.Block
1280
1281
1282 for {
1283 if v_0.Op != OpARMMOVWconst {
1284 break
1285 }
1286 c := auxIntToInt32(v_0.AuxInt)
1287 x := v_1
1288 y := v_2
1289 flags := v_3
1290 v.reset(OpARMADCconst)
1291 v.AuxInt = int32ToAuxInt(c)
1292 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
1293 v0.AddArg2(x, y)
1294 v.AddArg2(v0, flags)
1295 return true
1296 }
1297
1298
1299
1300 for {
1301 x := v_0
1302 y := v_1
1303 if v_2.Op != OpARMMOVWconst {
1304 break
1305 }
1306 c := auxIntToInt32(v_2.AuxInt)
1307 flags := v_3
1308 if !(0 <= c && c < 32) {
1309 break
1310 }
1311 v.reset(OpARMADCshiftRL)
1312 v.AuxInt = int32ToAuxInt(c)
1313 v.AddArg3(x, y, flags)
1314 return true
1315 }
1316 return false
1317 }
1318 func rewriteValueARM_OpARMADD(v *Value) bool {
1319 v_1 := v.Args[1]
1320 v_0 := v.Args[0]
1321 b := v.Block
1322
1323
1324
1325 for {
1326 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1327 x := v_0
1328 if v_1.Op != OpARMMOVWconst {
1329 continue
1330 }
1331 t := v_1.Type
1332 c := auxIntToInt32(v_1.AuxInt)
1333 if !(!t.IsPtr()) {
1334 continue
1335 }
1336 v.reset(OpARMADDconst)
1337 v.AuxInt = int32ToAuxInt(c)
1338 v.AddArg(x)
1339 return true
1340 }
1341 break
1342 }
1343
1344
1345 for {
1346 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1347 x := v_0
1348 if v_1.Op != OpARMSLLconst {
1349 continue
1350 }
1351 c := auxIntToInt32(v_1.AuxInt)
1352 y := v_1.Args[0]
1353 v.reset(OpARMADDshiftLL)
1354 v.AuxInt = int32ToAuxInt(c)
1355 v.AddArg2(x, y)
1356 return true
1357 }
1358 break
1359 }
1360
1361
1362 for {
1363 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1364 x := v_0
1365 if v_1.Op != OpARMSRLconst {
1366 continue
1367 }
1368 c := auxIntToInt32(v_1.AuxInt)
1369 y := v_1.Args[0]
1370 v.reset(OpARMADDshiftRL)
1371 v.AuxInt = int32ToAuxInt(c)
1372 v.AddArg2(x, y)
1373 return true
1374 }
1375 break
1376 }
1377
1378
1379 for {
1380 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1381 x := v_0
1382 if v_1.Op != OpARMSRAconst {
1383 continue
1384 }
1385 c := auxIntToInt32(v_1.AuxInt)
1386 y := v_1.Args[0]
1387 v.reset(OpARMADDshiftRA)
1388 v.AuxInt = int32ToAuxInt(c)
1389 v.AddArg2(x, y)
1390 return true
1391 }
1392 break
1393 }
1394
1395
1396 for {
1397 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1398 x := v_0
1399 if v_1.Op != OpARMSLL {
1400 continue
1401 }
1402 z := v_1.Args[1]
1403 y := v_1.Args[0]
1404 v.reset(OpARMADDshiftLLreg)
1405 v.AddArg3(x, y, z)
1406 return true
1407 }
1408 break
1409 }
1410
1411
1412 for {
1413 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1414 x := v_0
1415 if v_1.Op != OpARMSRL {
1416 continue
1417 }
1418 z := v_1.Args[1]
1419 y := v_1.Args[0]
1420 v.reset(OpARMADDshiftRLreg)
1421 v.AddArg3(x, y, z)
1422 return true
1423 }
1424 break
1425 }
1426
1427
1428 for {
1429 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1430 x := v_0
1431 if v_1.Op != OpARMSRA {
1432 continue
1433 }
1434 z := v_1.Args[1]
1435 y := v_1.Args[0]
1436 v.reset(OpARMADDshiftRAreg)
1437 v.AddArg3(x, y, z)
1438 return true
1439 }
1440 break
1441 }
1442
1443
1444 for {
1445 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1446 x := v_0
1447 if v_1.Op != OpARMRSBconst || auxIntToInt32(v_1.AuxInt) != 0 {
1448 continue
1449 }
1450 y := v_1.Args[0]
1451 v.reset(OpARMSUB)
1452 v.AddArg2(x, y)
1453 return true
1454 }
1455 break
1456 }
1457
1458
1459 for {
1460 t := v.Type
1461 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1462 if v_0.Op != OpARMRSBconst {
1463 continue
1464 }
1465 c := auxIntToInt32(v_0.AuxInt)
1466 x := v_0.Args[0]
1467 if v_1.Op != OpARMRSBconst {
1468 continue
1469 }
1470 d := auxIntToInt32(v_1.AuxInt)
1471 y := v_1.Args[0]
1472 v.reset(OpARMRSBconst)
1473 v.AuxInt = int32ToAuxInt(c + d)
1474 v0 := b.NewValue0(v.Pos, OpARMADD, t)
1475 v0.AddArg2(x, y)
1476 v.AddArg(v0)
1477 return true
1478 }
1479 break
1480 }
1481
1482
1483 for {
1484 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1485 if v_0.Op != OpARMMUL {
1486 continue
1487 }
1488 y := v_0.Args[1]
1489 x := v_0.Args[0]
1490 a := v_1
1491 v.reset(OpARMMULA)
1492 v.AddArg3(x, y, a)
1493 return true
1494 }
1495 break
1496 }
1497 return false
1498 }
1499 func rewriteValueARM_OpARMADDD(v *Value) bool {
1500 v_1 := v.Args[1]
1501 v_0 := v.Args[0]
1502
1503
1504
1505 for {
1506 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1507 a := v_0
1508 if v_1.Op != OpARMMULD {
1509 continue
1510 }
1511 y := v_1.Args[1]
1512 x := v_1.Args[0]
1513 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
1514 continue
1515 }
1516 v.reset(OpARMMULAD)
1517 v.AddArg3(a, x, y)
1518 return true
1519 }
1520 break
1521 }
1522
1523
1524
1525 for {
1526 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1527 a := v_0
1528 if v_1.Op != OpARMNMULD {
1529 continue
1530 }
1531 y := v_1.Args[1]
1532 x := v_1.Args[0]
1533 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
1534 continue
1535 }
1536 v.reset(OpARMMULSD)
1537 v.AddArg3(a, x, y)
1538 return true
1539 }
1540 break
1541 }
1542 return false
1543 }
1544 func rewriteValueARM_OpARMADDF(v *Value) bool {
1545 v_1 := v.Args[1]
1546 v_0 := v.Args[0]
1547
1548
1549
1550 for {
1551 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1552 a := v_0
1553 if v_1.Op != OpARMMULF {
1554 continue
1555 }
1556 y := v_1.Args[1]
1557 x := v_1.Args[0]
1558 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
1559 continue
1560 }
1561 v.reset(OpARMMULAF)
1562 v.AddArg3(a, x, y)
1563 return true
1564 }
1565 break
1566 }
1567
1568
1569
1570 for {
1571 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1572 a := v_0
1573 if v_1.Op != OpARMNMULF {
1574 continue
1575 }
1576 y := v_1.Args[1]
1577 x := v_1.Args[0]
1578 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
1579 continue
1580 }
1581 v.reset(OpARMMULSF)
1582 v.AddArg3(a, x, y)
1583 return true
1584 }
1585 break
1586 }
1587 return false
1588 }
1589 func rewriteValueARM_OpARMADDS(v *Value) bool {
1590 v_1 := v.Args[1]
1591 v_0 := v.Args[0]
1592
1593
1594 for {
1595 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1596 x := v_0
1597 if v_1.Op != OpARMMOVWconst {
1598 continue
1599 }
1600 c := auxIntToInt32(v_1.AuxInt)
1601 v.reset(OpARMADDSconst)
1602 v.AuxInt = int32ToAuxInt(c)
1603 v.AddArg(x)
1604 return true
1605 }
1606 break
1607 }
1608
1609
1610 for {
1611 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1612 x := v_0
1613 if v_1.Op != OpARMSLLconst {
1614 continue
1615 }
1616 c := auxIntToInt32(v_1.AuxInt)
1617 y := v_1.Args[0]
1618 v.reset(OpARMADDSshiftLL)
1619 v.AuxInt = int32ToAuxInt(c)
1620 v.AddArg2(x, y)
1621 return true
1622 }
1623 break
1624 }
1625
1626
1627 for {
1628 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1629 x := v_0
1630 if v_1.Op != OpARMSRLconst {
1631 continue
1632 }
1633 c := auxIntToInt32(v_1.AuxInt)
1634 y := v_1.Args[0]
1635 v.reset(OpARMADDSshiftRL)
1636 v.AuxInt = int32ToAuxInt(c)
1637 v.AddArg2(x, y)
1638 return true
1639 }
1640 break
1641 }
1642
1643
1644 for {
1645 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1646 x := v_0
1647 if v_1.Op != OpARMSRAconst {
1648 continue
1649 }
1650 c := auxIntToInt32(v_1.AuxInt)
1651 y := v_1.Args[0]
1652 v.reset(OpARMADDSshiftRA)
1653 v.AuxInt = int32ToAuxInt(c)
1654 v.AddArg2(x, y)
1655 return true
1656 }
1657 break
1658 }
1659
1660
1661 for {
1662 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1663 x := v_0
1664 if v_1.Op != OpARMSLL {
1665 continue
1666 }
1667 z := v_1.Args[1]
1668 y := v_1.Args[0]
1669 v.reset(OpARMADDSshiftLLreg)
1670 v.AddArg3(x, y, z)
1671 return true
1672 }
1673 break
1674 }
1675
1676
1677 for {
1678 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1679 x := v_0
1680 if v_1.Op != OpARMSRL {
1681 continue
1682 }
1683 z := v_1.Args[1]
1684 y := v_1.Args[0]
1685 v.reset(OpARMADDSshiftRLreg)
1686 v.AddArg3(x, y, z)
1687 return true
1688 }
1689 break
1690 }
1691
1692
1693 for {
1694 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1695 x := v_0
1696 if v_1.Op != OpARMSRA {
1697 continue
1698 }
1699 z := v_1.Args[1]
1700 y := v_1.Args[0]
1701 v.reset(OpARMADDSshiftRAreg)
1702 v.AddArg3(x, y, z)
1703 return true
1704 }
1705 break
1706 }
1707 return false
1708 }
1709 func rewriteValueARM_OpARMADDSshiftLL(v *Value) bool {
1710 v_1 := v.Args[1]
1711 v_0 := v.Args[0]
1712 b := v.Block
1713
1714
1715 for {
1716 d := auxIntToInt32(v.AuxInt)
1717 if v_0.Op != OpARMMOVWconst {
1718 break
1719 }
1720 c := auxIntToInt32(v_0.AuxInt)
1721 x := v_1
1722 v.reset(OpARMADDSconst)
1723 v.AuxInt = int32ToAuxInt(c)
1724 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
1725 v0.AuxInt = int32ToAuxInt(d)
1726 v0.AddArg(x)
1727 v.AddArg(v0)
1728 return true
1729 }
1730
1731
1732 for {
1733 d := auxIntToInt32(v.AuxInt)
1734 x := v_0
1735 if v_1.Op != OpARMMOVWconst {
1736 break
1737 }
1738 c := auxIntToInt32(v_1.AuxInt)
1739 v.reset(OpARMADDSconst)
1740 v.AuxInt = int32ToAuxInt(c << uint64(d))
1741 v.AddArg(x)
1742 return true
1743 }
1744 return false
1745 }
1746 func rewriteValueARM_OpARMADDSshiftLLreg(v *Value) bool {
1747 v_2 := v.Args[2]
1748 v_1 := v.Args[1]
1749 v_0 := v.Args[0]
1750 b := v.Block
1751
1752
1753 for {
1754 if v_0.Op != OpARMMOVWconst {
1755 break
1756 }
1757 c := auxIntToInt32(v_0.AuxInt)
1758 x := v_1
1759 y := v_2
1760 v.reset(OpARMADDSconst)
1761 v.AuxInt = int32ToAuxInt(c)
1762 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
1763 v0.AddArg2(x, y)
1764 v.AddArg(v0)
1765 return true
1766 }
1767
1768
1769
1770 for {
1771 x := v_0
1772 y := v_1
1773 if v_2.Op != OpARMMOVWconst {
1774 break
1775 }
1776 c := auxIntToInt32(v_2.AuxInt)
1777 if !(0 <= c && c < 32) {
1778 break
1779 }
1780 v.reset(OpARMADDSshiftLL)
1781 v.AuxInt = int32ToAuxInt(c)
1782 v.AddArg2(x, y)
1783 return true
1784 }
1785 return false
1786 }
1787 func rewriteValueARM_OpARMADDSshiftRA(v *Value) bool {
1788 v_1 := v.Args[1]
1789 v_0 := v.Args[0]
1790 b := v.Block
1791
1792
1793 for {
1794 d := auxIntToInt32(v.AuxInt)
1795 if v_0.Op != OpARMMOVWconst {
1796 break
1797 }
1798 c := auxIntToInt32(v_0.AuxInt)
1799 x := v_1
1800 v.reset(OpARMADDSconst)
1801 v.AuxInt = int32ToAuxInt(c)
1802 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
1803 v0.AuxInt = int32ToAuxInt(d)
1804 v0.AddArg(x)
1805 v.AddArg(v0)
1806 return true
1807 }
1808
1809
1810 for {
1811 d := auxIntToInt32(v.AuxInt)
1812 x := v_0
1813 if v_1.Op != OpARMMOVWconst {
1814 break
1815 }
1816 c := auxIntToInt32(v_1.AuxInt)
1817 v.reset(OpARMADDSconst)
1818 v.AuxInt = int32ToAuxInt(c >> uint64(d))
1819 v.AddArg(x)
1820 return true
1821 }
1822 return false
1823 }
1824 func rewriteValueARM_OpARMADDSshiftRAreg(v *Value) bool {
1825 v_2 := v.Args[2]
1826 v_1 := v.Args[1]
1827 v_0 := v.Args[0]
1828 b := v.Block
1829
1830
1831 for {
1832 if v_0.Op != OpARMMOVWconst {
1833 break
1834 }
1835 c := auxIntToInt32(v_0.AuxInt)
1836 x := v_1
1837 y := v_2
1838 v.reset(OpARMADDSconst)
1839 v.AuxInt = int32ToAuxInt(c)
1840 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
1841 v0.AddArg2(x, y)
1842 v.AddArg(v0)
1843 return true
1844 }
1845
1846
1847
1848 for {
1849 x := v_0
1850 y := v_1
1851 if v_2.Op != OpARMMOVWconst {
1852 break
1853 }
1854 c := auxIntToInt32(v_2.AuxInt)
1855 if !(0 <= c && c < 32) {
1856 break
1857 }
1858 v.reset(OpARMADDSshiftRA)
1859 v.AuxInt = int32ToAuxInt(c)
1860 v.AddArg2(x, y)
1861 return true
1862 }
1863 return false
1864 }
1865 func rewriteValueARM_OpARMADDSshiftRL(v *Value) bool {
1866 v_1 := v.Args[1]
1867 v_0 := v.Args[0]
1868 b := v.Block
1869
1870
1871 for {
1872 d := auxIntToInt32(v.AuxInt)
1873 if v_0.Op != OpARMMOVWconst {
1874 break
1875 }
1876 c := auxIntToInt32(v_0.AuxInt)
1877 x := v_1
1878 v.reset(OpARMADDSconst)
1879 v.AuxInt = int32ToAuxInt(c)
1880 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
1881 v0.AuxInt = int32ToAuxInt(d)
1882 v0.AddArg(x)
1883 v.AddArg(v0)
1884 return true
1885 }
1886
1887
1888 for {
1889 d := auxIntToInt32(v.AuxInt)
1890 x := v_0
1891 if v_1.Op != OpARMMOVWconst {
1892 break
1893 }
1894 c := auxIntToInt32(v_1.AuxInt)
1895 v.reset(OpARMADDSconst)
1896 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
1897 v.AddArg(x)
1898 return true
1899 }
1900 return false
1901 }
1902 func rewriteValueARM_OpARMADDSshiftRLreg(v *Value) bool {
1903 v_2 := v.Args[2]
1904 v_1 := v.Args[1]
1905 v_0 := v.Args[0]
1906 b := v.Block
1907
1908
1909 for {
1910 if v_0.Op != OpARMMOVWconst {
1911 break
1912 }
1913 c := auxIntToInt32(v_0.AuxInt)
1914 x := v_1
1915 y := v_2
1916 v.reset(OpARMADDSconst)
1917 v.AuxInt = int32ToAuxInt(c)
1918 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
1919 v0.AddArg2(x, y)
1920 v.AddArg(v0)
1921 return true
1922 }
1923
1924
1925
1926 for {
1927 x := v_0
1928 y := v_1
1929 if v_2.Op != OpARMMOVWconst {
1930 break
1931 }
1932 c := auxIntToInt32(v_2.AuxInt)
1933 if !(0 <= c && c < 32) {
1934 break
1935 }
1936 v.reset(OpARMADDSshiftRL)
1937 v.AuxInt = int32ToAuxInt(c)
1938 v.AddArg2(x, y)
1939 return true
1940 }
1941 return false
1942 }
1943 func rewriteValueARM_OpARMADDconst(v *Value) bool {
1944 v_0 := v.Args[0]
1945
1946
1947 for {
1948 off1 := auxIntToInt32(v.AuxInt)
1949 if v_0.Op != OpARMMOVWaddr {
1950 break
1951 }
1952 off2 := auxIntToInt32(v_0.AuxInt)
1953 sym := auxToSym(v_0.Aux)
1954 ptr := v_0.Args[0]
1955 v.reset(OpARMMOVWaddr)
1956 v.AuxInt = int32ToAuxInt(off1 + off2)
1957 v.Aux = symToAux(sym)
1958 v.AddArg(ptr)
1959 return true
1960 }
1961
1962
1963 for {
1964 if auxIntToInt32(v.AuxInt) != 0 {
1965 break
1966 }
1967 x := v_0
1968 v.copyOf(x)
1969 return true
1970 }
1971
1972
1973
1974 for {
1975 c := auxIntToInt32(v.AuxInt)
1976 x := v_0
1977 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) {
1978 break
1979 }
1980 v.reset(OpARMSUBconst)
1981 v.AuxInt = int32ToAuxInt(-c)
1982 v.AddArg(x)
1983 return true
1984 }
1985
1986
1987
1988 for {
1989 c := auxIntToInt32(v.AuxInt)
1990 x := v_0
1991 if !(buildcfg.GOARM.Version == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && uint32(-c) <= 0xffff) {
1992 break
1993 }
1994 v.reset(OpARMSUBconst)
1995 v.AuxInt = int32ToAuxInt(-c)
1996 v.AddArg(x)
1997 return true
1998 }
1999
2000
2001 for {
2002 c := auxIntToInt32(v.AuxInt)
2003 if v_0.Op != OpARMMOVWconst {
2004 break
2005 }
2006 d := auxIntToInt32(v_0.AuxInt)
2007 v.reset(OpARMMOVWconst)
2008 v.AuxInt = int32ToAuxInt(c + d)
2009 return true
2010 }
2011
2012
2013 for {
2014 c := auxIntToInt32(v.AuxInt)
2015 if v_0.Op != OpARMADDconst {
2016 break
2017 }
2018 d := auxIntToInt32(v_0.AuxInt)
2019 x := v_0.Args[0]
2020 v.reset(OpARMADDconst)
2021 v.AuxInt = int32ToAuxInt(c + d)
2022 v.AddArg(x)
2023 return true
2024 }
2025
2026
2027 for {
2028 c := auxIntToInt32(v.AuxInt)
2029 if v_0.Op != OpARMSUBconst {
2030 break
2031 }
2032 d := auxIntToInt32(v_0.AuxInt)
2033 x := v_0.Args[0]
2034 v.reset(OpARMADDconst)
2035 v.AuxInt = int32ToAuxInt(c - d)
2036 v.AddArg(x)
2037 return true
2038 }
2039
2040
2041 for {
2042 c := auxIntToInt32(v.AuxInt)
2043 if v_0.Op != OpARMRSBconst {
2044 break
2045 }
2046 d := auxIntToInt32(v_0.AuxInt)
2047 x := v_0.Args[0]
2048 v.reset(OpARMRSBconst)
2049 v.AuxInt = int32ToAuxInt(c + d)
2050 v.AddArg(x)
2051 return true
2052 }
2053 return false
2054 }
2055 func rewriteValueARM_OpARMADDshiftLL(v *Value) bool {
2056 v_1 := v.Args[1]
2057 v_0 := v.Args[0]
2058 b := v.Block
2059 typ := &b.Func.Config.Types
2060
2061
2062 for {
2063 d := auxIntToInt32(v.AuxInt)
2064 if v_0.Op != OpARMMOVWconst {
2065 break
2066 }
2067 c := auxIntToInt32(v_0.AuxInt)
2068 x := v_1
2069 v.reset(OpARMADDconst)
2070 v.AuxInt = int32ToAuxInt(c)
2071 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
2072 v0.AuxInt = int32ToAuxInt(d)
2073 v0.AddArg(x)
2074 v.AddArg(v0)
2075 return true
2076 }
2077
2078
2079 for {
2080 d := auxIntToInt32(v.AuxInt)
2081 x := v_0
2082 if v_1.Op != OpARMMOVWconst {
2083 break
2084 }
2085 c := auxIntToInt32(v_1.AuxInt)
2086 v.reset(OpARMADDconst)
2087 v.AuxInt = int32ToAuxInt(c << uint64(d))
2088 v.AddArg(x)
2089 return true
2090 }
2091
2092
2093 for {
2094 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMBFXU || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != int32(armBFAuxInt(8, 8)) {
2095 break
2096 }
2097 x := v_0.Args[0]
2098 if x != v_1 {
2099 break
2100 }
2101 v.reset(OpARMREV16)
2102 v.AddArg(x)
2103 return true
2104 }
2105
2106
2107
2108 for {
2109 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMSRLconst || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != 24 {
2110 break
2111 }
2112 v_0_0 := v_0.Args[0]
2113 if v_0_0.Op != OpARMSLLconst || auxIntToInt32(v_0_0.AuxInt) != 16 {
2114 break
2115 }
2116 x := v_0_0.Args[0]
2117 if x != v_1 || !(buildcfg.GOARM.Version >= 6) {
2118 break
2119 }
2120 v.reset(OpARMREV16)
2121 v.AddArg(x)
2122 return true
2123 }
2124 return false
2125 }
2126 func rewriteValueARM_OpARMADDshiftLLreg(v *Value) bool {
2127 v_2 := v.Args[2]
2128 v_1 := v.Args[1]
2129 v_0 := v.Args[0]
2130 b := v.Block
2131
2132
2133 for {
2134 if v_0.Op != OpARMMOVWconst {
2135 break
2136 }
2137 c := auxIntToInt32(v_0.AuxInt)
2138 x := v_1
2139 y := v_2
2140 v.reset(OpARMADDconst)
2141 v.AuxInt = int32ToAuxInt(c)
2142 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
2143 v0.AddArg2(x, y)
2144 v.AddArg(v0)
2145 return true
2146 }
2147
2148
2149
2150 for {
2151 x := v_0
2152 y := v_1
2153 if v_2.Op != OpARMMOVWconst {
2154 break
2155 }
2156 c := auxIntToInt32(v_2.AuxInt)
2157 if !(0 <= c && c < 32) {
2158 break
2159 }
2160 v.reset(OpARMADDshiftLL)
2161 v.AuxInt = int32ToAuxInt(c)
2162 v.AddArg2(x, y)
2163 return true
2164 }
2165 return false
2166 }
2167 func rewriteValueARM_OpARMADDshiftRA(v *Value) bool {
2168 v_1 := v.Args[1]
2169 v_0 := v.Args[0]
2170 b := v.Block
2171
2172
2173 for {
2174 d := auxIntToInt32(v.AuxInt)
2175 if v_0.Op != OpARMMOVWconst {
2176 break
2177 }
2178 c := auxIntToInt32(v_0.AuxInt)
2179 x := v_1
2180 v.reset(OpARMADDconst)
2181 v.AuxInt = int32ToAuxInt(c)
2182 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
2183 v0.AuxInt = int32ToAuxInt(d)
2184 v0.AddArg(x)
2185 v.AddArg(v0)
2186 return true
2187 }
2188
2189
2190 for {
2191 d := auxIntToInt32(v.AuxInt)
2192 x := v_0
2193 if v_1.Op != OpARMMOVWconst {
2194 break
2195 }
2196 c := auxIntToInt32(v_1.AuxInt)
2197 v.reset(OpARMADDconst)
2198 v.AuxInt = int32ToAuxInt(c >> uint64(d))
2199 v.AddArg(x)
2200 return true
2201 }
2202 return false
2203 }
2204 func rewriteValueARM_OpARMADDshiftRAreg(v *Value) bool {
2205 v_2 := v.Args[2]
2206 v_1 := v.Args[1]
2207 v_0 := v.Args[0]
2208 b := v.Block
2209
2210
2211 for {
2212 if v_0.Op != OpARMMOVWconst {
2213 break
2214 }
2215 c := auxIntToInt32(v_0.AuxInt)
2216 x := v_1
2217 y := v_2
2218 v.reset(OpARMADDconst)
2219 v.AuxInt = int32ToAuxInt(c)
2220 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
2221 v0.AddArg2(x, y)
2222 v.AddArg(v0)
2223 return true
2224 }
2225
2226
2227
2228 for {
2229 x := v_0
2230 y := v_1
2231 if v_2.Op != OpARMMOVWconst {
2232 break
2233 }
2234 c := auxIntToInt32(v_2.AuxInt)
2235 if !(0 <= c && c < 32) {
2236 break
2237 }
2238 v.reset(OpARMADDshiftRA)
2239 v.AuxInt = int32ToAuxInt(c)
2240 v.AddArg2(x, y)
2241 return true
2242 }
2243 return false
2244 }
2245 func rewriteValueARM_OpARMADDshiftRL(v *Value) bool {
2246 v_1 := v.Args[1]
2247 v_0 := v.Args[0]
2248 b := v.Block
2249
2250
2251 for {
2252 d := auxIntToInt32(v.AuxInt)
2253 if v_0.Op != OpARMMOVWconst {
2254 break
2255 }
2256 c := auxIntToInt32(v_0.AuxInt)
2257 x := v_1
2258 v.reset(OpARMADDconst)
2259 v.AuxInt = int32ToAuxInt(c)
2260 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
2261 v0.AuxInt = int32ToAuxInt(d)
2262 v0.AddArg(x)
2263 v.AddArg(v0)
2264 return true
2265 }
2266
2267
2268 for {
2269 d := auxIntToInt32(v.AuxInt)
2270 x := v_0
2271 if v_1.Op != OpARMMOVWconst {
2272 break
2273 }
2274 c := auxIntToInt32(v_1.AuxInt)
2275 v.reset(OpARMADDconst)
2276 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
2277 v.AddArg(x)
2278 return true
2279 }
2280 return false
2281 }
2282 func rewriteValueARM_OpARMADDshiftRLreg(v *Value) bool {
2283 v_2 := v.Args[2]
2284 v_1 := v.Args[1]
2285 v_0 := v.Args[0]
2286 b := v.Block
2287
2288
2289 for {
2290 if v_0.Op != OpARMMOVWconst {
2291 break
2292 }
2293 c := auxIntToInt32(v_0.AuxInt)
2294 x := v_1
2295 y := v_2
2296 v.reset(OpARMADDconst)
2297 v.AuxInt = int32ToAuxInt(c)
2298 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
2299 v0.AddArg2(x, y)
2300 v.AddArg(v0)
2301 return true
2302 }
2303
2304
2305
2306 for {
2307 x := v_0
2308 y := v_1
2309 if v_2.Op != OpARMMOVWconst {
2310 break
2311 }
2312 c := auxIntToInt32(v_2.AuxInt)
2313 if !(0 <= c && c < 32) {
2314 break
2315 }
2316 v.reset(OpARMADDshiftRL)
2317 v.AuxInt = int32ToAuxInt(c)
2318 v.AddArg2(x, y)
2319 return true
2320 }
2321 return false
2322 }
2323 func rewriteValueARM_OpARMAND(v *Value) bool {
2324 v_1 := v.Args[1]
2325 v_0 := v.Args[0]
2326
2327
2328 for {
2329 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2330 x := v_0
2331 if v_1.Op != OpARMMOVWconst {
2332 continue
2333 }
2334 c := auxIntToInt32(v_1.AuxInt)
2335 v.reset(OpARMANDconst)
2336 v.AuxInt = int32ToAuxInt(c)
2337 v.AddArg(x)
2338 return true
2339 }
2340 break
2341 }
2342
2343
2344 for {
2345 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2346 x := v_0
2347 if v_1.Op != OpARMSLLconst {
2348 continue
2349 }
2350 c := auxIntToInt32(v_1.AuxInt)
2351 y := v_1.Args[0]
2352 v.reset(OpARMANDshiftLL)
2353 v.AuxInt = int32ToAuxInt(c)
2354 v.AddArg2(x, y)
2355 return true
2356 }
2357 break
2358 }
2359
2360
2361 for {
2362 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2363 x := v_0
2364 if v_1.Op != OpARMSRLconst {
2365 continue
2366 }
2367 c := auxIntToInt32(v_1.AuxInt)
2368 y := v_1.Args[0]
2369 v.reset(OpARMANDshiftRL)
2370 v.AuxInt = int32ToAuxInt(c)
2371 v.AddArg2(x, y)
2372 return true
2373 }
2374 break
2375 }
2376
2377
2378 for {
2379 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2380 x := v_0
2381 if v_1.Op != OpARMSRAconst {
2382 continue
2383 }
2384 c := auxIntToInt32(v_1.AuxInt)
2385 y := v_1.Args[0]
2386 v.reset(OpARMANDshiftRA)
2387 v.AuxInt = int32ToAuxInt(c)
2388 v.AddArg2(x, y)
2389 return true
2390 }
2391 break
2392 }
2393
2394
2395 for {
2396 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2397 x := v_0
2398 if v_1.Op != OpARMSLL {
2399 continue
2400 }
2401 z := v_1.Args[1]
2402 y := v_1.Args[0]
2403 v.reset(OpARMANDshiftLLreg)
2404 v.AddArg3(x, y, z)
2405 return true
2406 }
2407 break
2408 }
2409
2410
2411 for {
2412 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2413 x := v_0
2414 if v_1.Op != OpARMSRL {
2415 continue
2416 }
2417 z := v_1.Args[1]
2418 y := v_1.Args[0]
2419 v.reset(OpARMANDshiftRLreg)
2420 v.AddArg3(x, y, z)
2421 return true
2422 }
2423 break
2424 }
2425
2426
2427 for {
2428 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2429 x := v_0
2430 if v_1.Op != OpARMSRA {
2431 continue
2432 }
2433 z := v_1.Args[1]
2434 y := v_1.Args[0]
2435 v.reset(OpARMANDshiftRAreg)
2436 v.AddArg3(x, y, z)
2437 return true
2438 }
2439 break
2440 }
2441
2442
2443 for {
2444 x := v_0
2445 if x != v_1 {
2446 break
2447 }
2448 v.copyOf(x)
2449 return true
2450 }
2451
2452
2453 for {
2454 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2455 x := v_0
2456 if v_1.Op != OpARMMVN {
2457 continue
2458 }
2459 y := v_1.Args[0]
2460 v.reset(OpARMBIC)
2461 v.AddArg2(x, y)
2462 return true
2463 }
2464 break
2465 }
2466
2467
2468 for {
2469 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2470 x := v_0
2471 if v_1.Op != OpARMMVNshiftLL {
2472 continue
2473 }
2474 c := auxIntToInt32(v_1.AuxInt)
2475 y := v_1.Args[0]
2476 v.reset(OpARMBICshiftLL)
2477 v.AuxInt = int32ToAuxInt(c)
2478 v.AddArg2(x, y)
2479 return true
2480 }
2481 break
2482 }
2483
2484
2485 for {
2486 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2487 x := v_0
2488 if v_1.Op != OpARMMVNshiftRL {
2489 continue
2490 }
2491 c := auxIntToInt32(v_1.AuxInt)
2492 y := v_1.Args[0]
2493 v.reset(OpARMBICshiftRL)
2494 v.AuxInt = int32ToAuxInt(c)
2495 v.AddArg2(x, y)
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 != OpARMMVNshiftRA {
2506 continue
2507 }
2508 c := auxIntToInt32(v_1.AuxInt)
2509 y := v_1.Args[0]
2510 v.reset(OpARMBICshiftRA)
2511 v.AuxInt = int32ToAuxInt(c)
2512 v.AddArg2(x, y)
2513 return true
2514 }
2515 break
2516 }
2517 return false
2518 }
2519 func rewriteValueARM_OpARMANDconst(v *Value) bool {
2520 v_0 := v.Args[0]
2521
2522
2523 for {
2524 if auxIntToInt32(v.AuxInt) != 0 {
2525 break
2526 }
2527 v.reset(OpARMMOVWconst)
2528 v.AuxInt = int32ToAuxInt(0)
2529 return true
2530 }
2531
2532
2533
2534 for {
2535 c := auxIntToInt32(v.AuxInt)
2536 x := v_0
2537 if !(int32(c) == -1) {
2538 break
2539 }
2540 v.copyOf(x)
2541 return true
2542 }
2543
2544
2545
2546 for {
2547 c := auxIntToInt32(v.AuxInt)
2548 x := v_0
2549 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) {
2550 break
2551 }
2552 v.reset(OpARMBICconst)
2553 v.AuxInt = int32ToAuxInt(int32(^uint32(c)))
2554 v.AddArg(x)
2555 return true
2556 }
2557
2558
2559
2560 for {
2561 c := auxIntToInt32(v.AuxInt)
2562 x := v_0
2563 if !(buildcfg.GOARM.Version == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && ^uint32(c) <= 0xffff) {
2564 break
2565 }
2566 v.reset(OpARMBICconst)
2567 v.AuxInt = int32ToAuxInt(int32(^uint32(c)))
2568 v.AddArg(x)
2569 return true
2570 }
2571
2572
2573 for {
2574 c := auxIntToInt32(v.AuxInt)
2575 if v_0.Op != OpARMMOVWconst {
2576 break
2577 }
2578 d := auxIntToInt32(v_0.AuxInt)
2579 v.reset(OpARMMOVWconst)
2580 v.AuxInt = int32ToAuxInt(c & d)
2581 return true
2582 }
2583
2584
2585 for {
2586 c := auxIntToInt32(v.AuxInt)
2587 if v_0.Op != OpARMANDconst {
2588 break
2589 }
2590 d := auxIntToInt32(v_0.AuxInt)
2591 x := v_0.Args[0]
2592 v.reset(OpARMANDconst)
2593 v.AuxInt = int32ToAuxInt(c & d)
2594 v.AddArg(x)
2595 return true
2596 }
2597 return false
2598 }
2599 func rewriteValueARM_OpARMANDshiftLL(v *Value) bool {
2600 v_1 := v.Args[1]
2601 v_0 := v.Args[0]
2602 b := v.Block
2603
2604
2605 for {
2606 d := auxIntToInt32(v.AuxInt)
2607 if v_0.Op != OpARMMOVWconst {
2608 break
2609 }
2610 c := auxIntToInt32(v_0.AuxInt)
2611 x := v_1
2612 v.reset(OpARMANDconst)
2613 v.AuxInt = int32ToAuxInt(c)
2614 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
2615 v0.AuxInt = int32ToAuxInt(d)
2616 v0.AddArg(x)
2617 v.AddArg(v0)
2618 return true
2619 }
2620
2621
2622 for {
2623 d := auxIntToInt32(v.AuxInt)
2624 x := v_0
2625 if v_1.Op != OpARMMOVWconst {
2626 break
2627 }
2628 c := auxIntToInt32(v_1.AuxInt)
2629 v.reset(OpARMANDconst)
2630 v.AuxInt = int32ToAuxInt(c << uint64(d))
2631 v.AddArg(x)
2632 return true
2633 }
2634
2635
2636 for {
2637 c := auxIntToInt32(v.AuxInt)
2638 y := v_0
2639 if y.Op != OpARMSLLconst || auxIntToInt32(y.AuxInt) != c {
2640 break
2641 }
2642 x := y.Args[0]
2643 if x != v_1 {
2644 break
2645 }
2646 v.copyOf(y)
2647 return true
2648 }
2649 return false
2650 }
2651 func rewriteValueARM_OpARMANDshiftLLreg(v *Value) bool {
2652 v_2 := v.Args[2]
2653 v_1 := v.Args[1]
2654 v_0 := v.Args[0]
2655 b := v.Block
2656
2657
2658 for {
2659 if v_0.Op != OpARMMOVWconst {
2660 break
2661 }
2662 c := auxIntToInt32(v_0.AuxInt)
2663 x := v_1
2664 y := v_2
2665 v.reset(OpARMANDconst)
2666 v.AuxInt = int32ToAuxInt(c)
2667 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
2668 v0.AddArg2(x, y)
2669 v.AddArg(v0)
2670 return true
2671 }
2672
2673
2674
2675 for {
2676 x := v_0
2677 y := v_1
2678 if v_2.Op != OpARMMOVWconst {
2679 break
2680 }
2681 c := auxIntToInt32(v_2.AuxInt)
2682 if !(0 <= c && c < 32) {
2683 break
2684 }
2685 v.reset(OpARMANDshiftLL)
2686 v.AuxInt = int32ToAuxInt(c)
2687 v.AddArg2(x, y)
2688 return true
2689 }
2690 return false
2691 }
2692 func rewriteValueARM_OpARMANDshiftRA(v *Value) bool {
2693 v_1 := v.Args[1]
2694 v_0 := v.Args[0]
2695 b := v.Block
2696
2697
2698 for {
2699 d := auxIntToInt32(v.AuxInt)
2700 if v_0.Op != OpARMMOVWconst {
2701 break
2702 }
2703 c := auxIntToInt32(v_0.AuxInt)
2704 x := v_1
2705 v.reset(OpARMANDconst)
2706 v.AuxInt = int32ToAuxInt(c)
2707 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
2708 v0.AuxInt = int32ToAuxInt(d)
2709 v0.AddArg(x)
2710 v.AddArg(v0)
2711 return true
2712 }
2713
2714
2715 for {
2716 d := auxIntToInt32(v.AuxInt)
2717 x := v_0
2718 if v_1.Op != OpARMMOVWconst {
2719 break
2720 }
2721 c := auxIntToInt32(v_1.AuxInt)
2722 v.reset(OpARMANDconst)
2723 v.AuxInt = int32ToAuxInt(c >> uint64(d))
2724 v.AddArg(x)
2725 return true
2726 }
2727
2728
2729 for {
2730 c := auxIntToInt32(v.AuxInt)
2731 y := v_0
2732 if y.Op != OpARMSRAconst || auxIntToInt32(y.AuxInt) != c {
2733 break
2734 }
2735 x := y.Args[0]
2736 if x != v_1 {
2737 break
2738 }
2739 v.copyOf(y)
2740 return true
2741 }
2742 return false
2743 }
2744 func rewriteValueARM_OpARMANDshiftRAreg(v *Value) bool {
2745 v_2 := v.Args[2]
2746 v_1 := v.Args[1]
2747 v_0 := v.Args[0]
2748 b := v.Block
2749
2750
2751 for {
2752 if v_0.Op != OpARMMOVWconst {
2753 break
2754 }
2755 c := auxIntToInt32(v_0.AuxInt)
2756 x := v_1
2757 y := v_2
2758 v.reset(OpARMANDconst)
2759 v.AuxInt = int32ToAuxInt(c)
2760 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
2761 v0.AddArg2(x, y)
2762 v.AddArg(v0)
2763 return true
2764 }
2765
2766
2767
2768 for {
2769 x := v_0
2770 y := v_1
2771 if v_2.Op != OpARMMOVWconst {
2772 break
2773 }
2774 c := auxIntToInt32(v_2.AuxInt)
2775 if !(0 <= c && c < 32) {
2776 break
2777 }
2778 v.reset(OpARMANDshiftRA)
2779 v.AuxInt = int32ToAuxInt(c)
2780 v.AddArg2(x, y)
2781 return true
2782 }
2783 return false
2784 }
2785 func rewriteValueARM_OpARMANDshiftRL(v *Value) bool {
2786 v_1 := v.Args[1]
2787 v_0 := v.Args[0]
2788 b := v.Block
2789
2790
2791 for {
2792 d := auxIntToInt32(v.AuxInt)
2793 if v_0.Op != OpARMMOVWconst {
2794 break
2795 }
2796 c := auxIntToInt32(v_0.AuxInt)
2797 x := v_1
2798 v.reset(OpARMANDconst)
2799 v.AuxInt = int32ToAuxInt(c)
2800 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
2801 v0.AuxInt = int32ToAuxInt(d)
2802 v0.AddArg(x)
2803 v.AddArg(v0)
2804 return true
2805 }
2806
2807
2808 for {
2809 d := auxIntToInt32(v.AuxInt)
2810 x := v_0
2811 if v_1.Op != OpARMMOVWconst {
2812 break
2813 }
2814 c := auxIntToInt32(v_1.AuxInt)
2815 v.reset(OpARMANDconst)
2816 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
2817 v.AddArg(x)
2818 return true
2819 }
2820
2821
2822 for {
2823 c := auxIntToInt32(v.AuxInt)
2824 y := v_0
2825 if y.Op != OpARMSRLconst || auxIntToInt32(y.AuxInt) != c {
2826 break
2827 }
2828 x := y.Args[0]
2829 if x != v_1 {
2830 break
2831 }
2832 v.copyOf(y)
2833 return true
2834 }
2835 return false
2836 }
2837 func rewriteValueARM_OpARMANDshiftRLreg(v *Value) bool {
2838 v_2 := v.Args[2]
2839 v_1 := v.Args[1]
2840 v_0 := v.Args[0]
2841 b := v.Block
2842
2843
2844 for {
2845 if v_0.Op != OpARMMOVWconst {
2846 break
2847 }
2848 c := auxIntToInt32(v_0.AuxInt)
2849 x := v_1
2850 y := v_2
2851 v.reset(OpARMANDconst)
2852 v.AuxInt = int32ToAuxInt(c)
2853 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
2854 v0.AddArg2(x, y)
2855 v.AddArg(v0)
2856 return true
2857 }
2858
2859
2860
2861 for {
2862 x := v_0
2863 y := v_1
2864 if v_2.Op != OpARMMOVWconst {
2865 break
2866 }
2867 c := auxIntToInt32(v_2.AuxInt)
2868 if !(0 <= c && c < 32) {
2869 break
2870 }
2871 v.reset(OpARMANDshiftRL)
2872 v.AuxInt = int32ToAuxInt(c)
2873 v.AddArg2(x, y)
2874 return true
2875 }
2876 return false
2877 }
2878 func rewriteValueARM_OpARMBFX(v *Value) bool {
2879 v_0 := v.Args[0]
2880
2881
2882 for {
2883 c := auxIntToInt32(v.AuxInt)
2884 if v_0.Op != OpARMMOVWconst {
2885 break
2886 }
2887 d := auxIntToInt32(v_0.AuxInt)
2888 v.reset(OpARMMOVWconst)
2889 v.AuxInt = int32ToAuxInt(d << (32 - uint32(c&0xff) - uint32(c>>8)) >> (32 - uint32(c>>8)))
2890 return true
2891 }
2892 return false
2893 }
2894 func rewriteValueARM_OpARMBFXU(v *Value) bool {
2895 v_0 := v.Args[0]
2896
2897
2898 for {
2899 c := auxIntToInt32(v.AuxInt)
2900 if v_0.Op != OpARMMOVWconst {
2901 break
2902 }
2903 d := auxIntToInt32(v_0.AuxInt)
2904 v.reset(OpARMMOVWconst)
2905 v.AuxInt = int32ToAuxInt(int32(uint32(d) << (32 - uint32(c&0xff) - uint32(c>>8)) >> (32 - uint32(c>>8))))
2906 return true
2907 }
2908 return false
2909 }
2910 func rewriteValueARM_OpARMBIC(v *Value) bool {
2911 v_1 := v.Args[1]
2912 v_0 := v.Args[0]
2913
2914
2915 for {
2916 x := v_0
2917 if v_1.Op != OpARMMOVWconst {
2918 break
2919 }
2920 c := auxIntToInt32(v_1.AuxInt)
2921 v.reset(OpARMBICconst)
2922 v.AuxInt = int32ToAuxInt(c)
2923 v.AddArg(x)
2924 return true
2925 }
2926
2927
2928 for {
2929 x := v_0
2930 if v_1.Op != OpARMSLLconst {
2931 break
2932 }
2933 c := auxIntToInt32(v_1.AuxInt)
2934 y := v_1.Args[0]
2935 v.reset(OpARMBICshiftLL)
2936 v.AuxInt = int32ToAuxInt(c)
2937 v.AddArg2(x, y)
2938 return true
2939 }
2940
2941
2942 for {
2943 x := v_0
2944 if v_1.Op != OpARMSRLconst {
2945 break
2946 }
2947 c := auxIntToInt32(v_1.AuxInt)
2948 y := v_1.Args[0]
2949 v.reset(OpARMBICshiftRL)
2950 v.AuxInt = int32ToAuxInt(c)
2951 v.AddArg2(x, y)
2952 return true
2953 }
2954
2955
2956 for {
2957 x := v_0
2958 if v_1.Op != OpARMSRAconst {
2959 break
2960 }
2961 c := auxIntToInt32(v_1.AuxInt)
2962 y := v_1.Args[0]
2963 v.reset(OpARMBICshiftRA)
2964 v.AuxInt = int32ToAuxInt(c)
2965 v.AddArg2(x, y)
2966 return true
2967 }
2968
2969
2970 for {
2971 x := v_0
2972 if v_1.Op != OpARMSLL {
2973 break
2974 }
2975 z := v_1.Args[1]
2976 y := v_1.Args[0]
2977 v.reset(OpARMBICshiftLLreg)
2978 v.AddArg3(x, y, z)
2979 return true
2980 }
2981
2982
2983 for {
2984 x := v_0
2985 if v_1.Op != OpARMSRL {
2986 break
2987 }
2988 z := v_1.Args[1]
2989 y := v_1.Args[0]
2990 v.reset(OpARMBICshiftRLreg)
2991 v.AddArg3(x, y, z)
2992 return true
2993 }
2994
2995
2996 for {
2997 x := v_0
2998 if v_1.Op != OpARMSRA {
2999 break
3000 }
3001 z := v_1.Args[1]
3002 y := v_1.Args[0]
3003 v.reset(OpARMBICshiftRAreg)
3004 v.AddArg3(x, y, z)
3005 return true
3006 }
3007
3008
3009 for {
3010 x := v_0
3011 if x != v_1 {
3012 break
3013 }
3014 v.reset(OpARMMOVWconst)
3015 v.AuxInt = int32ToAuxInt(0)
3016 return true
3017 }
3018 return false
3019 }
3020 func rewriteValueARM_OpARMBICconst(v *Value) bool {
3021 v_0 := v.Args[0]
3022
3023
3024 for {
3025 if auxIntToInt32(v.AuxInt) != 0 {
3026 break
3027 }
3028 x := v_0
3029 v.copyOf(x)
3030 return true
3031 }
3032
3033
3034
3035 for {
3036 c := auxIntToInt32(v.AuxInt)
3037 if !(int32(c) == -1) {
3038 break
3039 }
3040 v.reset(OpARMMOVWconst)
3041 v.AuxInt = int32ToAuxInt(0)
3042 return true
3043 }
3044
3045
3046
3047 for {
3048 c := auxIntToInt32(v.AuxInt)
3049 x := v_0
3050 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) {
3051 break
3052 }
3053 v.reset(OpARMANDconst)
3054 v.AuxInt = int32ToAuxInt(int32(^uint32(c)))
3055 v.AddArg(x)
3056 return true
3057 }
3058
3059
3060
3061 for {
3062 c := auxIntToInt32(v.AuxInt)
3063 x := v_0
3064 if !(buildcfg.GOARM.Version == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && ^uint32(c) <= 0xffff) {
3065 break
3066 }
3067 v.reset(OpARMANDconst)
3068 v.AuxInt = int32ToAuxInt(int32(^uint32(c)))
3069 v.AddArg(x)
3070 return true
3071 }
3072
3073
3074 for {
3075 c := auxIntToInt32(v.AuxInt)
3076 if v_0.Op != OpARMMOVWconst {
3077 break
3078 }
3079 d := auxIntToInt32(v_0.AuxInt)
3080 v.reset(OpARMMOVWconst)
3081 v.AuxInt = int32ToAuxInt(d &^ c)
3082 return true
3083 }
3084
3085
3086 for {
3087 c := auxIntToInt32(v.AuxInt)
3088 if v_0.Op != OpARMBICconst {
3089 break
3090 }
3091 d := auxIntToInt32(v_0.AuxInt)
3092 x := v_0.Args[0]
3093 v.reset(OpARMBICconst)
3094 v.AuxInt = int32ToAuxInt(c | d)
3095 v.AddArg(x)
3096 return true
3097 }
3098 return false
3099 }
3100 func rewriteValueARM_OpARMBICshiftLL(v *Value) bool {
3101 v_1 := v.Args[1]
3102 v_0 := v.Args[0]
3103
3104
3105 for {
3106 d := auxIntToInt32(v.AuxInt)
3107 x := v_0
3108 if v_1.Op != OpARMMOVWconst {
3109 break
3110 }
3111 c := auxIntToInt32(v_1.AuxInt)
3112 v.reset(OpARMBICconst)
3113 v.AuxInt = int32ToAuxInt(c << uint64(d))
3114 v.AddArg(x)
3115 return true
3116 }
3117
3118
3119 for {
3120 c := auxIntToInt32(v.AuxInt)
3121 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c {
3122 break
3123 }
3124 x := v_0.Args[0]
3125 if x != v_1 {
3126 break
3127 }
3128 v.reset(OpARMMOVWconst)
3129 v.AuxInt = int32ToAuxInt(0)
3130 return true
3131 }
3132 return false
3133 }
3134 func rewriteValueARM_OpARMBICshiftLLreg(v *Value) bool {
3135 v_2 := v.Args[2]
3136 v_1 := v.Args[1]
3137 v_0 := v.Args[0]
3138
3139
3140
3141 for {
3142 x := v_0
3143 y := v_1
3144 if v_2.Op != OpARMMOVWconst {
3145 break
3146 }
3147 c := auxIntToInt32(v_2.AuxInt)
3148 if !(0 <= c && c < 32) {
3149 break
3150 }
3151 v.reset(OpARMBICshiftLL)
3152 v.AuxInt = int32ToAuxInt(c)
3153 v.AddArg2(x, y)
3154 return true
3155 }
3156 return false
3157 }
3158 func rewriteValueARM_OpARMBICshiftRA(v *Value) bool {
3159 v_1 := v.Args[1]
3160 v_0 := v.Args[0]
3161
3162
3163 for {
3164 d := auxIntToInt32(v.AuxInt)
3165 x := v_0
3166 if v_1.Op != OpARMMOVWconst {
3167 break
3168 }
3169 c := auxIntToInt32(v_1.AuxInt)
3170 v.reset(OpARMBICconst)
3171 v.AuxInt = int32ToAuxInt(c >> uint64(d))
3172 v.AddArg(x)
3173 return true
3174 }
3175
3176
3177 for {
3178 c := auxIntToInt32(v.AuxInt)
3179 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c {
3180 break
3181 }
3182 x := v_0.Args[0]
3183 if x != v_1 {
3184 break
3185 }
3186 v.reset(OpARMMOVWconst)
3187 v.AuxInt = int32ToAuxInt(0)
3188 return true
3189 }
3190 return false
3191 }
3192 func rewriteValueARM_OpARMBICshiftRAreg(v *Value) bool {
3193 v_2 := v.Args[2]
3194 v_1 := v.Args[1]
3195 v_0 := v.Args[0]
3196
3197
3198
3199 for {
3200 x := v_0
3201 y := v_1
3202 if v_2.Op != OpARMMOVWconst {
3203 break
3204 }
3205 c := auxIntToInt32(v_2.AuxInt)
3206 if !(0 <= c && c < 32) {
3207 break
3208 }
3209 v.reset(OpARMBICshiftRA)
3210 v.AuxInt = int32ToAuxInt(c)
3211 v.AddArg2(x, y)
3212 return true
3213 }
3214 return false
3215 }
3216 func rewriteValueARM_OpARMBICshiftRL(v *Value) bool {
3217 v_1 := v.Args[1]
3218 v_0 := v.Args[0]
3219
3220
3221 for {
3222 d := auxIntToInt32(v.AuxInt)
3223 x := v_0
3224 if v_1.Op != OpARMMOVWconst {
3225 break
3226 }
3227 c := auxIntToInt32(v_1.AuxInt)
3228 v.reset(OpARMBICconst)
3229 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
3230 v.AddArg(x)
3231 return true
3232 }
3233
3234
3235 for {
3236 c := auxIntToInt32(v.AuxInt)
3237 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c {
3238 break
3239 }
3240 x := v_0.Args[0]
3241 if x != v_1 {
3242 break
3243 }
3244 v.reset(OpARMMOVWconst)
3245 v.AuxInt = int32ToAuxInt(0)
3246 return true
3247 }
3248 return false
3249 }
3250 func rewriteValueARM_OpARMBICshiftRLreg(v *Value) bool {
3251 v_2 := v.Args[2]
3252 v_1 := v.Args[1]
3253 v_0 := v.Args[0]
3254
3255
3256
3257 for {
3258 x := v_0
3259 y := v_1
3260 if v_2.Op != OpARMMOVWconst {
3261 break
3262 }
3263 c := auxIntToInt32(v_2.AuxInt)
3264 if !(0 <= c && c < 32) {
3265 break
3266 }
3267 v.reset(OpARMBICshiftRL)
3268 v.AuxInt = int32ToAuxInt(c)
3269 v.AddArg2(x, y)
3270 return true
3271 }
3272 return false
3273 }
3274 func rewriteValueARM_OpARMCMN(v *Value) bool {
3275 v_1 := v.Args[1]
3276 v_0 := v.Args[0]
3277
3278
3279 for {
3280 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3281 x := v_0
3282 if v_1.Op != OpARMMOVWconst {
3283 continue
3284 }
3285 c := auxIntToInt32(v_1.AuxInt)
3286 v.reset(OpARMCMNconst)
3287 v.AuxInt = int32ToAuxInt(c)
3288 v.AddArg(x)
3289 return true
3290 }
3291 break
3292 }
3293
3294
3295 for {
3296 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3297 x := v_0
3298 if v_1.Op != OpARMSLLconst {
3299 continue
3300 }
3301 c := auxIntToInt32(v_1.AuxInt)
3302 y := v_1.Args[0]
3303 v.reset(OpARMCMNshiftLL)
3304 v.AuxInt = int32ToAuxInt(c)
3305 v.AddArg2(x, y)
3306 return true
3307 }
3308 break
3309 }
3310
3311
3312 for {
3313 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3314 x := v_0
3315 if v_1.Op != OpARMSRLconst {
3316 continue
3317 }
3318 c := auxIntToInt32(v_1.AuxInt)
3319 y := v_1.Args[0]
3320 v.reset(OpARMCMNshiftRL)
3321 v.AuxInt = int32ToAuxInt(c)
3322 v.AddArg2(x, y)
3323 return true
3324 }
3325 break
3326 }
3327
3328
3329 for {
3330 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3331 x := v_0
3332 if v_1.Op != OpARMSRAconst {
3333 continue
3334 }
3335 c := auxIntToInt32(v_1.AuxInt)
3336 y := v_1.Args[0]
3337 v.reset(OpARMCMNshiftRA)
3338 v.AuxInt = int32ToAuxInt(c)
3339 v.AddArg2(x, y)
3340 return true
3341 }
3342 break
3343 }
3344
3345
3346 for {
3347 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3348 x := v_0
3349 if v_1.Op != OpARMSLL {
3350 continue
3351 }
3352 z := v_1.Args[1]
3353 y := v_1.Args[0]
3354 v.reset(OpARMCMNshiftLLreg)
3355 v.AddArg3(x, y, z)
3356 return true
3357 }
3358 break
3359 }
3360
3361
3362 for {
3363 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3364 x := v_0
3365 if v_1.Op != OpARMSRL {
3366 continue
3367 }
3368 z := v_1.Args[1]
3369 y := v_1.Args[0]
3370 v.reset(OpARMCMNshiftRLreg)
3371 v.AddArg3(x, y, z)
3372 return true
3373 }
3374 break
3375 }
3376
3377
3378 for {
3379 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3380 x := v_0
3381 if v_1.Op != OpARMSRA {
3382 continue
3383 }
3384 z := v_1.Args[1]
3385 y := v_1.Args[0]
3386 v.reset(OpARMCMNshiftRAreg)
3387 v.AddArg3(x, y, z)
3388 return true
3389 }
3390 break
3391 }
3392 return false
3393 }
3394 func rewriteValueARM_OpARMCMNconst(v *Value) bool {
3395 v_0 := v.Args[0]
3396
3397
3398 for {
3399 y := auxIntToInt32(v.AuxInt)
3400 if v_0.Op != OpARMMOVWconst {
3401 break
3402 }
3403 x := auxIntToInt32(v_0.AuxInt)
3404 v.reset(OpARMFlagConstant)
3405 v.AuxInt = flagConstantToAuxInt(addFlags32(x, y))
3406 return true
3407 }
3408 return false
3409 }
3410 func rewriteValueARM_OpARMCMNshiftLL(v *Value) bool {
3411 v_1 := v.Args[1]
3412 v_0 := v.Args[0]
3413 b := v.Block
3414
3415
3416 for {
3417 d := auxIntToInt32(v.AuxInt)
3418 if v_0.Op != OpARMMOVWconst {
3419 break
3420 }
3421 c := auxIntToInt32(v_0.AuxInt)
3422 x := v_1
3423 v.reset(OpARMCMNconst)
3424 v.AuxInt = int32ToAuxInt(c)
3425 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
3426 v0.AuxInt = int32ToAuxInt(d)
3427 v0.AddArg(x)
3428 v.AddArg(v0)
3429 return true
3430 }
3431
3432
3433 for {
3434 d := auxIntToInt32(v.AuxInt)
3435 x := v_0
3436 if v_1.Op != OpARMMOVWconst {
3437 break
3438 }
3439 c := auxIntToInt32(v_1.AuxInt)
3440 v.reset(OpARMCMNconst)
3441 v.AuxInt = int32ToAuxInt(c << uint64(d))
3442 v.AddArg(x)
3443 return true
3444 }
3445 return false
3446 }
3447 func rewriteValueARM_OpARMCMNshiftLLreg(v *Value) bool {
3448 v_2 := v.Args[2]
3449 v_1 := v.Args[1]
3450 v_0 := v.Args[0]
3451 b := v.Block
3452
3453
3454 for {
3455 if v_0.Op != OpARMMOVWconst {
3456 break
3457 }
3458 c := auxIntToInt32(v_0.AuxInt)
3459 x := v_1
3460 y := v_2
3461 v.reset(OpARMCMNconst)
3462 v.AuxInt = int32ToAuxInt(c)
3463 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
3464 v0.AddArg2(x, y)
3465 v.AddArg(v0)
3466 return true
3467 }
3468
3469
3470
3471 for {
3472 x := v_0
3473 y := v_1
3474 if v_2.Op != OpARMMOVWconst {
3475 break
3476 }
3477 c := auxIntToInt32(v_2.AuxInt)
3478 if !(0 <= c && c < 32) {
3479 break
3480 }
3481 v.reset(OpARMCMNshiftLL)
3482 v.AuxInt = int32ToAuxInt(c)
3483 v.AddArg2(x, y)
3484 return true
3485 }
3486 return false
3487 }
3488 func rewriteValueARM_OpARMCMNshiftRA(v *Value) bool {
3489 v_1 := v.Args[1]
3490 v_0 := v.Args[0]
3491 b := v.Block
3492
3493
3494 for {
3495 d := auxIntToInt32(v.AuxInt)
3496 if v_0.Op != OpARMMOVWconst {
3497 break
3498 }
3499 c := auxIntToInt32(v_0.AuxInt)
3500 x := v_1
3501 v.reset(OpARMCMNconst)
3502 v.AuxInt = int32ToAuxInt(c)
3503 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
3504 v0.AuxInt = int32ToAuxInt(d)
3505 v0.AddArg(x)
3506 v.AddArg(v0)
3507 return true
3508 }
3509
3510
3511 for {
3512 d := auxIntToInt32(v.AuxInt)
3513 x := v_0
3514 if v_1.Op != OpARMMOVWconst {
3515 break
3516 }
3517 c := auxIntToInt32(v_1.AuxInt)
3518 v.reset(OpARMCMNconst)
3519 v.AuxInt = int32ToAuxInt(c >> uint64(d))
3520 v.AddArg(x)
3521 return true
3522 }
3523 return false
3524 }
3525 func rewriteValueARM_OpARMCMNshiftRAreg(v *Value) bool {
3526 v_2 := v.Args[2]
3527 v_1 := v.Args[1]
3528 v_0 := v.Args[0]
3529 b := v.Block
3530
3531
3532 for {
3533 if v_0.Op != OpARMMOVWconst {
3534 break
3535 }
3536 c := auxIntToInt32(v_0.AuxInt)
3537 x := v_1
3538 y := v_2
3539 v.reset(OpARMCMNconst)
3540 v.AuxInt = int32ToAuxInt(c)
3541 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
3542 v0.AddArg2(x, y)
3543 v.AddArg(v0)
3544 return true
3545 }
3546
3547
3548
3549 for {
3550 x := v_0
3551 y := v_1
3552 if v_2.Op != OpARMMOVWconst {
3553 break
3554 }
3555 c := auxIntToInt32(v_2.AuxInt)
3556 if !(0 <= c && c < 32) {
3557 break
3558 }
3559 v.reset(OpARMCMNshiftRA)
3560 v.AuxInt = int32ToAuxInt(c)
3561 v.AddArg2(x, y)
3562 return true
3563 }
3564 return false
3565 }
3566 func rewriteValueARM_OpARMCMNshiftRL(v *Value) bool {
3567 v_1 := v.Args[1]
3568 v_0 := v.Args[0]
3569 b := v.Block
3570
3571
3572 for {
3573 d := auxIntToInt32(v.AuxInt)
3574 if v_0.Op != OpARMMOVWconst {
3575 break
3576 }
3577 c := auxIntToInt32(v_0.AuxInt)
3578 x := v_1
3579 v.reset(OpARMCMNconst)
3580 v.AuxInt = int32ToAuxInt(c)
3581 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
3582 v0.AuxInt = int32ToAuxInt(d)
3583 v0.AddArg(x)
3584 v.AddArg(v0)
3585 return true
3586 }
3587
3588
3589 for {
3590 d := auxIntToInt32(v.AuxInt)
3591 x := v_0
3592 if v_1.Op != OpARMMOVWconst {
3593 break
3594 }
3595 c := auxIntToInt32(v_1.AuxInt)
3596 v.reset(OpARMCMNconst)
3597 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
3598 v.AddArg(x)
3599 return true
3600 }
3601 return false
3602 }
3603 func rewriteValueARM_OpARMCMNshiftRLreg(v *Value) bool {
3604 v_2 := v.Args[2]
3605 v_1 := v.Args[1]
3606 v_0 := v.Args[0]
3607 b := v.Block
3608
3609
3610 for {
3611 if v_0.Op != OpARMMOVWconst {
3612 break
3613 }
3614 c := auxIntToInt32(v_0.AuxInt)
3615 x := v_1
3616 y := v_2
3617 v.reset(OpARMCMNconst)
3618 v.AuxInt = int32ToAuxInt(c)
3619 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
3620 v0.AddArg2(x, y)
3621 v.AddArg(v0)
3622 return true
3623 }
3624
3625
3626
3627 for {
3628 x := v_0
3629 y := v_1
3630 if v_2.Op != OpARMMOVWconst {
3631 break
3632 }
3633 c := auxIntToInt32(v_2.AuxInt)
3634 if !(0 <= c && c < 32) {
3635 break
3636 }
3637 v.reset(OpARMCMNshiftRL)
3638 v.AuxInt = int32ToAuxInt(c)
3639 v.AddArg2(x, y)
3640 return true
3641 }
3642 return false
3643 }
3644 func rewriteValueARM_OpARMCMOVWHSconst(v *Value) bool {
3645 v_1 := v.Args[1]
3646 v_0 := v.Args[0]
3647
3648
3649
3650 for {
3651 c := auxIntToInt32(v.AuxInt)
3652 if v_1.Op != OpARMFlagConstant {
3653 break
3654 }
3655 fc := auxIntToFlagConstant(v_1.AuxInt)
3656 if !(fc.uge()) {
3657 break
3658 }
3659 v.reset(OpARMMOVWconst)
3660 v.AuxInt = int32ToAuxInt(c)
3661 return true
3662 }
3663
3664
3665
3666 for {
3667 x := v_0
3668 if v_1.Op != OpARMFlagConstant {
3669 break
3670 }
3671 fc := auxIntToFlagConstant(v_1.AuxInt)
3672 if !(fc.ult()) {
3673 break
3674 }
3675 v.copyOf(x)
3676 return true
3677 }
3678
3679
3680 for {
3681 c := auxIntToInt32(v.AuxInt)
3682 x := v_0
3683 if v_1.Op != OpARMInvertFlags {
3684 break
3685 }
3686 flags := v_1.Args[0]
3687 v.reset(OpARMCMOVWLSconst)
3688 v.AuxInt = int32ToAuxInt(c)
3689 v.AddArg2(x, flags)
3690 return true
3691 }
3692 return false
3693 }
3694 func rewriteValueARM_OpARMCMOVWLSconst(v *Value) bool {
3695 v_1 := v.Args[1]
3696 v_0 := v.Args[0]
3697
3698
3699
3700 for {
3701 c := auxIntToInt32(v.AuxInt)
3702 if v_1.Op != OpARMFlagConstant {
3703 break
3704 }
3705 fc := auxIntToFlagConstant(v_1.AuxInt)
3706 if !(fc.ule()) {
3707 break
3708 }
3709 v.reset(OpARMMOVWconst)
3710 v.AuxInt = int32ToAuxInt(c)
3711 return true
3712 }
3713
3714
3715
3716 for {
3717 x := v_0
3718 if v_1.Op != OpARMFlagConstant {
3719 break
3720 }
3721 fc := auxIntToFlagConstant(v_1.AuxInt)
3722 if !(fc.ugt()) {
3723 break
3724 }
3725 v.copyOf(x)
3726 return true
3727 }
3728
3729
3730 for {
3731 c := auxIntToInt32(v.AuxInt)
3732 x := v_0
3733 if v_1.Op != OpARMInvertFlags {
3734 break
3735 }
3736 flags := v_1.Args[0]
3737 v.reset(OpARMCMOVWHSconst)
3738 v.AuxInt = int32ToAuxInt(c)
3739 v.AddArg2(x, flags)
3740 return true
3741 }
3742 return false
3743 }
3744 func rewriteValueARM_OpARMCMP(v *Value) bool {
3745 v_1 := v.Args[1]
3746 v_0 := v.Args[0]
3747 b := v.Block
3748
3749
3750 for {
3751 x := v_0
3752 if v_1.Op != OpARMMOVWconst {
3753 break
3754 }
3755 c := auxIntToInt32(v_1.AuxInt)
3756 v.reset(OpARMCMPconst)
3757 v.AuxInt = int32ToAuxInt(c)
3758 v.AddArg(x)
3759 return true
3760 }
3761
3762
3763 for {
3764 if v_0.Op != OpARMMOVWconst {
3765 break
3766 }
3767 c := auxIntToInt32(v_0.AuxInt)
3768 x := v_1
3769 v.reset(OpARMInvertFlags)
3770 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
3771 v0.AuxInt = int32ToAuxInt(c)
3772 v0.AddArg(x)
3773 v.AddArg(v0)
3774 return true
3775 }
3776
3777
3778
3779 for {
3780 x := v_0
3781 y := v_1
3782 if !(canonLessThan(x, y)) {
3783 break
3784 }
3785 v.reset(OpARMInvertFlags)
3786 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
3787 v0.AddArg2(y, x)
3788 v.AddArg(v0)
3789 return true
3790 }
3791
3792
3793 for {
3794 x := v_0
3795 if v_1.Op != OpARMSLLconst {
3796 break
3797 }
3798 c := auxIntToInt32(v_1.AuxInt)
3799 y := v_1.Args[0]
3800 v.reset(OpARMCMPshiftLL)
3801 v.AuxInt = int32ToAuxInt(c)
3802 v.AddArg2(x, y)
3803 return true
3804 }
3805
3806
3807 for {
3808 if v_0.Op != OpARMSLLconst {
3809 break
3810 }
3811 c := auxIntToInt32(v_0.AuxInt)
3812 y := v_0.Args[0]
3813 x := v_1
3814 v.reset(OpARMInvertFlags)
3815 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags)
3816 v0.AuxInt = int32ToAuxInt(c)
3817 v0.AddArg2(x, y)
3818 v.AddArg(v0)
3819 return true
3820 }
3821
3822
3823 for {
3824 x := v_0
3825 if v_1.Op != OpARMSRLconst {
3826 break
3827 }
3828 c := auxIntToInt32(v_1.AuxInt)
3829 y := v_1.Args[0]
3830 v.reset(OpARMCMPshiftRL)
3831 v.AuxInt = int32ToAuxInt(c)
3832 v.AddArg2(x, y)
3833 return true
3834 }
3835
3836
3837 for {
3838 if v_0.Op != OpARMSRLconst {
3839 break
3840 }
3841 c := auxIntToInt32(v_0.AuxInt)
3842 y := v_0.Args[0]
3843 x := v_1
3844 v.reset(OpARMInvertFlags)
3845 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags)
3846 v0.AuxInt = int32ToAuxInt(c)
3847 v0.AddArg2(x, y)
3848 v.AddArg(v0)
3849 return true
3850 }
3851
3852
3853 for {
3854 x := v_0
3855 if v_1.Op != OpARMSRAconst {
3856 break
3857 }
3858 c := auxIntToInt32(v_1.AuxInt)
3859 y := v_1.Args[0]
3860 v.reset(OpARMCMPshiftRA)
3861 v.AuxInt = int32ToAuxInt(c)
3862 v.AddArg2(x, y)
3863 return true
3864 }
3865
3866
3867 for {
3868 if v_0.Op != OpARMSRAconst {
3869 break
3870 }
3871 c := auxIntToInt32(v_0.AuxInt)
3872 y := v_0.Args[0]
3873 x := v_1
3874 v.reset(OpARMInvertFlags)
3875 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags)
3876 v0.AuxInt = int32ToAuxInt(c)
3877 v0.AddArg2(x, y)
3878 v.AddArg(v0)
3879 return true
3880 }
3881
3882
3883 for {
3884 x := v_0
3885 if v_1.Op != OpARMSLL {
3886 break
3887 }
3888 z := v_1.Args[1]
3889 y := v_1.Args[0]
3890 v.reset(OpARMCMPshiftLLreg)
3891 v.AddArg3(x, y, z)
3892 return true
3893 }
3894
3895
3896 for {
3897 if v_0.Op != OpARMSLL {
3898 break
3899 }
3900 z := v_0.Args[1]
3901 y := v_0.Args[0]
3902 x := v_1
3903 v.reset(OpARMInvertFlags)
3904 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
3905 v0.AddArg3(x, y, z)
3906 v.AddArg(v0)
3907 return true
3908 }
3909
3910
3911 for {
3912 x := v_0
3913 if v_1.Op != OpARMSRL {
3914 break
3915 }
3916 z := v_1.Args[1]
3917 y := v_1.Args[0]
3918 v.reset(OpARMCMPshiftRLreg)
3919 v.AddArg3(x, y, z)
3920 return true
3921 }
3922
3923
3924 for {
3925 if v_0.Op != OpARMSRL {
3926 break
3927 }
3928 z := v_0.Args[1]
3929 y := v_0.Args[0]
3930 x := v_1
3931 v.reset(OpARMInvertFlags)
3932 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
3933 v0.AddArg3(x, y, z)
3934 v.AddArg(v0)
3935 return true
3936 }
3937
3938
3939 for {
3940 x := v_0
3941 if v_1.Op != OpARMSRA {
3942 break
3943 }
3944 z := v_1.Args[1]
3945 y := v_1.Args[0]
3946 v.reset(OpARMCMPshiftRAreg)
3947 v.AddArg3(x, y, z)
3948 return true
3949 }
3950
3951
3952 for {
3953 if v_0.Op != OpARMSRA {
3954 break
3955 }
3956 z := v_0.Args[1]
3957 y := v_0.Args[0]
3958 x := v_1
3959 v.reset(OpARMInvertFlags)
3960 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
3961 v0.AddArg3(x, y, z)
3962 v.AddArg(v0)
3963 return true
3964 }
3965 return false
3966 }
3967 func rewriteValueARM_OpARMCMPD(v *Value) bool {
3968 v_1 := v.Args[1]
3969 v_0 := v.Args[0]
3970
3971
3972 for {
3973 x := v_0
3974 if v_1.Op != OpARMMOVDconst || auxIntToFloat64(v_1.AuxInt) != 0 {
3975 break
3976 }
3977 v.reset(OpARMCMPD0)
3978 v.AddArg(x)
3979 return true
3980 }
3981 return false
3982 }
3983 func rewriteValueARM_OpARMCMPF(v *Value) bool {
3984 v_1 := v.Args[1]
3985 v_0 := v.Args[0]
3986
3987
3988 for {
3989 x := v_0
3990 if v_1.Op != OpARMMOVFconst || auxIntToFloat64(v_1.AuxInt) != 0 {
3991 break
3992 }
3993 v.reset(OpARMCMPF0)
3994 v.AddArg(x)
3995 return true
3996 }
3997 return false
3998 }
3999 func rewriteValueARM_OpARMCMPconst(v *Value) bool {
4000 v_0 := v.Args[0]
4001
4002
4003 for {
4004 y := auxIntToInt32(v.AuxInt)
4005 if v_0.Op != OpARMMOVWconst {
4006 break
4007 }
4008 x := auxIntToInt32(v_0.AuxInt)
4009 v.reset(OpARMFlagConstant)
4010 v.AuxInt = flagConstantToAuxInt(subFlags32(x, y))
4011 return true
4012 }
4013
4014
4015
4016 for {
4017 c := auxIntToInt32(v.AuxInt)
4018 if v_0.Op != OpARMMOVBUreg || !(0xff < c) {
4019 break
4020 }
4021 v.reset(OpARMFlagConstant)
4022 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1))
4023 return true
4024 }
4025
4026
4027
4028 for {
4029 c := auxIntToInt32(v.AuxInt)
4030 if v_0.Op != OpARMMOVHUreg || !(0xffff < c) {
4031 break
4032 }
4033 v.reset(OpARMFlagConstant)
4034 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1))
4035 return true
4036 }
4037
4038
4039
4040 for {
4041 n := auxIntToInt32(v.AuxInt)
4042 if v_0.Op != OpARMANDconst {
4043 break
4044 }
4045 m := auxIntToInt32(v_0.AuxInt)
4046 if !(0 <= m && m < n) {
4047 break
4048 }
4049 v.reset(OpARMFlagConstant)
4050 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1))
4051 return true
4052 }
4053
4054
4055
4056 for {
4057 n := auxIntToInt32(v.AuxInt)
4058 if v_0.Op != OpARMSRLconst {
4059 break
4060 }
4061 c := auxIntToInt32(v_0.AuxInt)
4062 if !(0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n)) {
4063 break
4064 }
4065 v.reset(OpARMFlagConstant)
4066 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1))
4067 return true
4068 }
4069 return false
4070 }
4071 func rewriteValueARM_OpARMCMPshiftLL(v *Value) bool {
4072 v_1 := v.Args[1]
4073 v_0 := v.Args[0]
4074 b := v.Block
4075
4076
4077 for {
4078 d := auxIntToInt32(v.AuxInt)
4079 if v_0.Op != OpARMMOVWconst {
4080 break
4081 }
4082 c := auxIntToInt32(v_0.AuxInt)
4083 x := v_1
4084 v.reset(OpARMInvertFlags)
4085 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
4086 v0.AuxInt = int32ToAuxInt(c)
4087 v1 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
4088 v1.AuxInt = int32ToAuxInt(d)
4089 v1.AddArg(x)
4090 v0.AddArg(v1)
4091 v.AddArg(v0)
4092 return true
4093 }
4094
4095
4096 for {
4097 d := auxIntToInt32(v.AuxInt)
4098 x := v_0
4099 if v_1.Op != OpARMMOVWconst {
4100 break
4101 }
4102 c := auxIntToInt32(v_1.AuxInt)
4103 v.reset(OpARMCMPconst)
4104 v.AuxInt = int32ToAuxInt(c << uint64(d))
4105 v.AddArg(x)
4106 return true
4107 }
4108 return false
4109 }
4110 func rewriteValueARM_OpARMCMPshiftLLreg(v *Value) bool {
4111 v_2 := v.Args[2]
4112 v_1 := v.Args[1]
4113 v_0 := v.Args[0]
4114 b := v.Block
4115
4116
4117 for {
4118 if v_0.Op != OpARMMOVWconst {
4119 break
4120 }
4121 c := auxIntToInt32(v_0.AuxInt)
4122 x := v_1
4123 y := v_2
4124 v.reset(OpARMInvertFlags)
4125 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
4126 v0.AuxInt = int32ToAuxInt(c)
4127 v1 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
4128 v1.AddArg2(x, y)
4129 v0.AddArg(v1)
4130 v.AddArg(v0)
4131 return true
4132 }
4133
4134
4135
4136 for {
4137 x := v_0
4138 y := v_1
4139 if v_2.Op != OpARMMOVWconst {
4140 break
4141 }
4142 c := auxIntToInt32(v_2.AuxInt)
4143 if !(0 <= c && c < 32) {
4144 break
4145 }
4146 v.reset(OpARMCMPshiftLL)
4147 v.AuxInt = int32ToAuxInt(c)
4148 v.AddArg2(x, y)
4149 return true
4150 }
4151 return false
4152 }
4153 func rewriteValueARM_OpARMCMPshiftRA(v *Value) bool {
4154 v_1 := v.Args[1]
4155 v_0 := v.Args[0]
4156 b := v.Block
4157
4158
4159 for {
4160 d := auxIntToInt32(v.AuxInt)
4161 if v_0.Op != OpARMMOVWconst {
4162 break
4163 }
4164 c := auxIntToInt32(v_0.AuxInt)
4165 x := v_1
4166 v.reset(OpARMInvertFlags)
4167 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
4168 v0.AuxInt = int32ToAuxInt(c)
4169 v1 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
4170 v1.AuxInt = int32ToAuxInt(d)
4171 v1.AddArg(x)
4172 v0.AddArg(v1)
4173 v.AddArg(v0)
4174 return true
4175 }
4176
4177
4178 for {
4179 d := auxIntToInt32(v.AuxInt)
4180 x := v_0
4181 if v_1.Op != OpARMMOVWconst {
4182 break
4183 }
4184 c := auxIntToInt32(v_1.AuxInt)
4185 v.reset(OpARMCMPconst)
4186 v.AuxInt = int32ToAuxInt(c >> uint64(d))
4187 v.AddArg(x)
4188 return true
4189 }
4190 return false
4191 }
4192 func rewriteValueARM_OpARMCMPshiftRAreg(v *Value) bool {
4193 v_2 := v.Args[2]
4194 v_1 := v.Args[1]
4195 v_0 := v.Args[0]
4196 b := v.Block
4197
4198
4199 for {
4200 if v_0.Op != OpARMMOVWconst {
4201 break
4202 }
4203 c := auxIntToInt32(v_0.AuxInt)
4204 x := v_1
4205 y := v_2
4206 v.reset(OpARMInvertFlags)
4207 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
4208 v0.AuxInt = int32ToAuxInt(c)
4209 v1 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
4210 v1.AddArg2(x, y)
4211 v0.AddArg(v1)
4212 v.AddArg(v0)
4213 return true
4214 }
4215
4216
4217
4218 for {
4219 x := v_0
4220 y := v_1
4221 if v_2.Op != OpARMMOVWconst {
4222 break
4223 }
4224 c := auxIntToInt32(v_2.AuxInt)
4225 if !(0 <= c && c < 32) {
4226 break
4227 }
4228 v.reset(OpARMCMPshiftRA)
4229 v.AuxInt = int32ToAuxInt(c)
4230 v.AddArg2(x, y)
4231 return true
4232 }
4233 return false
4234 }
4235 func rewriteValueARM_OpARMCMPshiftRL(v *Value) bool {
4236 v_1 := v.Args[1]
4237 v_0 := v.Args[0]
4238 b := v.Block
4239
4240
4241 for {
4242 d := auxIntToInt32(v.AuxInt)
4243 if v_0.Op != OpARMMOVWconst {
4244 break
4245 }
4246 c := auxIntToInt32(v_0.AuxInt)
4247 x := v_1
4248 v.reset(OpARMInvertFlags)
4249 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
4250 v0.AuxInt = int32ToAuxInt(c)
4251 v1 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
4252 v1.AuxInt = int32ToAuxInt(d)
4253 v1.AddArg(x)
4254 v0.AddArg(v1)
4255 v.AddArg(v0)
4256 return true
4257 }
4258
4259
4260 for {
4261 d := auxIntToInt32(v.AuxInt)
4262 x := v_0
4263 if v_1.Op != OpARMMOVWconst {
4264 break
4265 }
4266 c := auxIntToInt32(v_1.AuxInt)
4267 v.reset(OpARMCMPconst)
4268 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
4269 v.AddArg(x)
4270 return true
4271 }
4272 return false
4273 }
4274 func rewriteValueARM_OpARMCMPshiftRLreg(v *Value) bool {
4275 v_2 := v.Args[2]
4276 v_1 := v.Args[1]
4277 v_0 := v.Args[0]
4278 b := v.Block
4279
4280
4281 for {
4282 if v_0.Op != OpARMMOVWconst {
4283 break
4284 }
4285 c := auxIntToInt32(v_0.AuxInt)
4286 x := v_1
4287 y := v_2
4288 v.reset(OpARMInvertFlags)
4289 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
4290 v0.AuxInt = int32ToAuxInt(c)
4291 v1 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
4292 v1.AddArg2(x, y)
4293 v0.AddArg(v1)
4294 v.AddArg(v0)
4295 return true
4296 }
4297
4298
4299
4300 for {
4301 x := v_0
4302 y := v_1
4303 if v_2.Op != OpARMMOVWconst {
4304 break
4305 }
4306 c := auxIntToInt32(v_2.AuxInt)
4307 if !(0 <= c && c < 32) {
4308 break
4309 }
4310 v.reset(OpARMCMPshiftRL)
4311 v.AuxInt = int32ToAuxInt(c)
4312 v.AddArg2(x, y)
4313 return true
4314 }
4315 return false
4316 }
4317 func rewriteValueARM_OpARMEqual(v *Value) bool {
4318 v_0 := v.Args[0]
4319
4320
4321 for {
4322 if v_0.Op != OpARMFlagConstant {
4323 break
4324 }
4325 fc := auxIntToFlagConstant(v_0.AuxInt)
4326 v.reset(OpARMMOVWconst)
4327 v.AuxInt = int32ToAuxInt(b2i32(fc.eq()))
4328 return true
4329 }
4330
4331
4332 for {
4333 if v_0.Op != OpARMInvertFlags {
4334 break
4335 }
4336 x := v_0.Args[0]
4337 v.reset(OpARMEqual)
4338 v.AddArg(x)
4339 return true
4340 }
4341 return false
4342 }
4343 func rewriteValueARM_OpARMGreaterEqual(v *Value) bool {
4344 v_0 := v.Args[0]
4345
4346
4347 for {
4348 if v_0.Op != OpARMFlagConstant {
4349 break
4350 }
4351 fc := auxIntToFlagConstant(v_0.AuxInt)
4352 v.reset(OpARMMOVWconst)
4353 v.AuxInt = int32ToAuxInt(b2i32(fc.ge()))
4354 return true
4355 }
4356
4357
4358 for {
4359 if v_0.Op != OpARMInvertFlags {
4360 break
4361 }
4362 x := v_0.Args[0]
4363 v.reset(OpARMLessEqual)
4364 v.AddArg(x)
4365 return true
4366 }
4367 return false
4368 }
4369 func rewriteValueARM_OpARMGreaterEqualU(v *Value) bool {
4370 v_0 := v.Args[0]
4371
4372
4373 for {
4374 if v_0.Op != OpARMFlagConstant {
4375 break
4376 }
4377 fc := auxIntToFlagConstant(v_0.AuxInt)
4378 v.reset(OpARMMOVWconst)
4379 v.AuxInt = int32ToAuxInt(b2i32(fc.uge()))
4380 return true
4381 }
4382
4383
4384 for {
4385 if v_0.Op != OpARMInvertFlags {
4386 break
4387 }
4388 x := v_0.Args[0]
4389 v.reset(OpARMLessEqualU)
4390 v.AddArg(x)
4391 return true
4392 }
4393 return false
4394 }
4395 func rewriteValueARM_OpARMGreaterThan(v *Value) bool {
4396 v_0 := v.Args[0]
4397
4398
4399 for {
4400 if v_0.Op != OpARMFlagConstant {
4401 break
4402 }
4403 fc := auxIntToFlagConstant(v_0.AuxInt)
4404 v.reset(OpARMMOVWconst)
4405 v.AuxInt = int32ToAuxInt(b2i32(fc.gt()))
4406 return true
4407 }
4408
4409
4410 for {
4411 if v_0.Op != OpARMInvertFlags {
4412 break
4413 }
4414 x := v_0.Args[0]
4415 v.reset(OpARMLessThan)
4416 v.AddArg(x)
4417 return true
4418 }
4419 return false
4420 }
4421 func rewriteValueARM_OpARMGreaterThanU(v *Value) bool {
4422 v_0 := v.Args[0]
4423
4424
4425 for {
4426 if v_0.Op != OpARMFlagConstant {
4427 break
4428 }
4429 fc := auxIntToFlagConstant(v_0.AuxInt)
4430 v.reset(OpARMMOVWconst)
4431 v.AuxInt = int32ToAuxInt(b2i32(fc.ugt()))
4432 return true
4433 }
4434
4435
4436 for {
4437 if v_0.Op != OpARMInvertFlags {
4438 break
4439 }
4440 x := v_0.Args[0]
4441 v.reset(OpARMLessThanU)
4442 v.AddArg(x)
4443 return true
4444 }
4445 return false
4446 }
4447 func rewriteValueARM_OpARMLessEqual(v *Value) bool {
4448 v_0 := v.Args[0]
4449
4450
4451 for {
4452 if v_0.Op != OpARMFlagConstant {
4453 break
4454 }
4455 fc := auxIntToFlagConstant(v_0.AuxInt)
4456 v.reset(OpARMMOVWconst)
4457 v.AuxInt = int32ToAuxInt(b2i32(fc.le()))
4458 return true
4459 }
4460
4461
4462 for {
4463 if v_0.Op != OpARMInvertFlags {
4464 break
4465 }
4466 x := v_0.Args[0]
4467 v.reset(OpARMGreaterEqual)
4468 v.AddArg(x)
4469 return true
4470 }
4471 return false
4472 }
4473 func rewriteValueARM_OpARMLessEqualU(v *Value) bool {
4474 v_0 := v.Args[0]
4475
4476
4477 for {
4478 if v_0.Op != OpARMFlagConstant {
4479 break
4480 }
4481 fc := auxIntToFlagConstant(v_0.AuxInt)
4482 v.reset(OpARMMOVWconst)
4483 v.AuxInt = int32ToAuxInt(b2i32(fc.ule()))
4484 return true
4485 }
4486
4487
4488 for {
4489 if v_0.Op != OpARMInvertFlags {
4490 break
4491 }
4492 x := v_0.Args[0]
4493 v.reset(OpARMGreaterEqualU)
4494 v.AddArg(x)
4495 return true
4496 }
4497 return false
4498 }
4499 func rewriteValueARM_OpARMLessThan(v *Value) bool {
4500 v_0 := v.Args[0]
4501
4502
4503 for {
4504 if v_0.Op != OpARMFlagConstant {
4505 break
4506 }
4507 fc := auxIntToFlagConstant(v_0.AuxInt)
4508 v.reset(OpARMMOVWconst)
4509 v.AuxInt = int32ToAuxInt(b2i32(fc.lt()))
4510 return true
4511 }
4512
4513
4514 for {
4515 if v_0.Op != OpARMInvertFlags {
4516 break
4517 }
4518 x := v_0.Args[0]
4519 v.reset(OpARMGreaterThan)
4520 v.AddArg(x)
4521 return true
4522 }
4523 return false
4524 }
4525 func rewriteValueARM_OpARMLessThanU(v *Value) bool {
4526 v_0 := v.Args[0]
4527
4528
4529 for {
4530 if v_0.Op != OpARMFlagConstant {
4531 break
4532 }
4533 fc := auxIntToFlagConstant(v_0.AuxInt)
4534 v.reset(OpARMMOVWconst)
4535 v.AuxInt = int32ToAuxInt(b2i32(fc.ult()))
4536 return true
4537 }
4538
4539
4540 for {
4541 if v_0.Op != OpARMInvertFlags {
4542 break
4543 }
4544 x := v_0.Args[0]
4545 v.reset(OpARMGreaterThanU)
4546 v.AddArg(x)
4547 return true
4548 }
4549 return false
4550 }
4551 func rewriteValueARM_OpARMMOVBUload(v *Value) bool {
4552 v_1 := v.Args[1]
4553 v_0 := v.Args[0]
4554
4555
4556 for {
4557 off1 := auxIntToInt32(v.AuxInt)
4558 sym := auxToSym(v.Aux)
4559 if v_0.Op != OpARMADDconst {
4560 break
4561 }
4562 off2 := auxIntToInt32(v_0.AuxInt)
4563 ptr := v_0.Args[0]
4564 mem := v_1
4565 v.reset(OpARMMOVBUload)
4566 v.AuxInt = int32ToAuxInt(off1 + off2)
4567 v.Aux = symToAux(sym)
4568 v.AddArg2(ptr, mem)
4569 return true
4570 }
4571
4572
4573 for {
4574 off1 := auxIntToInt32(v.AuxInt)
4575 sym := auxToSym(v.Aux)
4576 if v_0.Op != OpARMSUBconst {
4577 break
4578 }
4579 off2 := auxIntToInt32(v_0.AuxInt)
4580 ptr := v_0.Args[0]
4581 mem := v_1
4582 v.reset(OpARMMOVBUload)
4583 v.AuxInt = int32ToAuxInt(off1 - off2)
4584 v.Aux = symToAux(sym)
4585 v.AddArg2(ptr, mem)
4586 return true
4587 }
4588
4589
4590
4591 for {
4592 off1 := auxIntToInt32(v.AuxInt)
4593 sym1 := auxToSym(v.Aux)
4594 if v_0.Op != OpARMMOVWaddr {
4595 break
4596 }
4597 off2 := auxIntToInt32(v_0.AuxInt)
4598 sym2 := auxToSym(v_0.Aux)
4599 ptr := v_0.Args[0]
4600 mem := v_1
4601 if !(canMergeSym(sym1, sym2)) {
4602 break
4603 }
4604 v.reset(OpARMMOVBUload)
4605 v.AuxInt = int32ToAuxInt(off1 + off2)
4606 v.Aux = symToAux(mergeSym(sym1, sym2))
4607 v.AddArg2(ptr, mem)
4608 return true
4609 }
4610
4611
4612
4613 for {
4614 off := auxIntToInt32(v.AuxInt)
4615 sym := auxToSym(v.Aux)
4616 ptr := v_0
4617 if v_1.Op != OpARMMOVBstore {
4618 break
4619 }
4620 off2 := auxIntToInt32(v_1.AuxInt)
4621 sym2 := auxToSym(v_1.Aux)
4622 x := v_1.Args[1]
4623 ptr2 := v_1.Args[0]
4624 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
4625 break
4626 }
4627 v.reset(OpARMMOVBUreg)
4628 v.AddArg(x)
4629 return true
4630 }
4631
4632
4633
4634 for {
4635 if auxIntToInt32(v.AuxInt) != 0 {
4636 break
4637 }
4638 sym := auxToSym(v.Aux)
4639 if v_0.Op != OpARMADD {
4640 break
4641 }
4642 idx := v_0.Args[1]
4643 ptr := v_0.Args[0]
4644 mem := v_1
4645 if !(sym == nil) {
4646 break
4647 }
4648 v.reset(OpARMMOVBUloadidx)
4649 v.AddArg3(ptr, idx, mem)
4650 return true
4651 }
4652
4653
4654
4655 for {
4656 off := auxIntToInt32(v.AuxInt)
4657 sym := auxToSym(v.Aux)
4658 if v_0.Op != OpSB || !(symIsRO(sym)) {
4659 break
4660 }
4661 v.reset(OpARMMOVWconst)
4662 v.AuxInt = int32ToAuxInt(int32(read8(sym, int64(off))))
4663 return true
4664 }
4665 return false
4666 }
4667 func rewriteValueARM_OpARMMOVBUloadidx(v *Value) bool {
4668 v_2 := v.Args[2]
4669 v_1 := v.Args[1]
4670 v_0 := v.Args[0]
4671
4672
4673
4674 for {
4675 ptr := v_0
4676 idx := v_1
4677 if v_2.Op != OpARMMOVBstoreidx {
4678 break
4679 }
4680 x := v_2.Args[2]
4681 ptr2 := v_2.Args[0]
4682 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) {
4683 break
4684 }
4685 v.reset(OpARMMOVBUreg)
4686 v.AddArg(x)
4687 return true
4688 }
4689
4690
4691 for {
4692 ptr := v_0
4693 if v_1.Op != OpARMMOVWconst {
4694 break
4695 }
4696 c := auxIntToInt32(v_1.AuxInt)
4697 mem := v_2
4698 v.reset(OpARMMOVBUload)
4699 v.AuxInt = int32ToAuxInt(c)
4700 v.AddArg2(ptr, mem)
4701 return true
4702 }
4703
4704
4705 for {
4706 if v_0.Op != OpARMMOVWconst {
4707 break
4708 }
4709 c := auxIntToInt32(v_0.AuxInt)
4710 ptr := v_1
4711 mem := v_2
4712 v.reset(OpARMMOVBUload)
4713 v.AuxInt = int32ToAuxInt(c)
4714 v.AddArg2(ptr, mem)
4715 return true
4716 }
4717 return false
4718 }
4719 func rewriteValueARM_OpARMMOVBUreg(v *Value) bool {
4720 v_0 := v.Args[0]
4721
4722
4723 for {
4724 x := v_0
4725 if x.Op != OpARMMOVBUload {
4726 break
4727 }
4728 v.reset(OpARMMOVWreg)
4729 v.AddArg(x)
4730 return true
4731 }
4732
4733
4734 for {
4735 if v_0.Op != OpARMANDconst {
4736 break
4737 }
4738 c := auxIntToInt32(v_0.AuxInt)
4739 x := v_0.Args[0]
4740 v.reset(OpARMANDconst)
4741 v.AuxInt = int32ToAuxInt(c & 0xff)
4742 v.AddArg(x)
4743 return true
4744 }
4745
4746
4747 for {
4748 x := v_0
4749 if x.Op != OpARMMOVBUreg {
4750 break
4751 }
4752 v.reset(OpARMMOVWreg)
4753 v.AddArg(x)
4754 return true
4755 }
4756
4757
4758 for {
4759 if v_0.Op != OpARMMOVWconst {
4760 break
4761 }
4762 c := auxIntToInt32(v_0.AuxInt)
4763 v.reset(OpARMMOVWconst)
4764 v.AuxInt = int32ToAuxInt(int32(uint8(c)))
4765 return true
4766 }
4767 return false
4768 }
4769 func rewriteValueARM_OpARMMOVBload(v *Value) bool {
4770 v_1 := v.Args[1]
4771 v_0 := v.Args[0]
4772
4773
4774 for {
4775 off1 := auxIntToInt32(v.AuxInt)
4776 sym := auxToSym(v.Aux)
4777 if v_0.Op != OpARMADDconst {
4778 break
4779 }
4780 off2 := auxIntToInt32(v_0.AuxInt)
4781 ptr := v_0.Args[0]
4782 mem := v_1
4783 v.reset(OpARMMOVBload)
4784 v.AuxInt = int32ToAuxInt(off1 + off2)
4785 v.Aux = symToAux(sym)
4786 v.AddArg2(ptr, mem)
4787 return true
4788 }
4789
4790
4791 for {
4792 off1 := auxIntToInt32(v.AuxInt)
4793 sym := auxToSym(v.Aux)
4794 if v_0.Op != OpARMSUBconst {
4795 break
4796 }
4797 off2 := auxIntToInt32(v_0.AuxInt)
4798 ptr := v_0.Args[0]
4799 mem := v_1
4800 v.reset(OpARMMOVBload)
4801 v.AuxInt = int32ToAuxInt(off1 - off2)
4802 v.Aux = symToAux(sym)
4803 v.AddArg2(ptr, mem)
4804 return true
4805 }
4806
4807
4808
4809 for {
4810 off1 := auxIntToInt32(v.AuxInt)
4811 sym1 := auxToSym(v.Aux)
4812 if v_0.Op != OpARMMOVWaddr {
4813 break
4814 }
4815 off2 := auxIntToInt32(v_0.AuxInt)
4816 sym2 := auxToSym(v_0.Aux)
4817 ptr := v_0.Args[0]
4818 mem := v_1
4819 if !(canMergeSym(sym1, sym2)) {
4820 break
4821 }
4822 v.reset(OpARMMOVBload)
4823 v.AuxInt = int32ToAuxInt(off1 + off2)
4824 v.Aux = symToAux(mergeSym(sym1, sym2))
4825 v.AddArg2(ptr, mem)
4826 return true
4827 }
4828
4829
4830
4831 for {
4832 off := auxIntToInt32(v.AuxInt)
4833 sym := auxToSym(v.Aux)
4834 ptr := v_0
4835 if v_1.Op != OpARMMOVBstore {
4836 break
4837 }
4838 off2 := auxIntToInt32(v_1.AuxInt)
4839 sym2 := auxToSym(v_1.Aux)
4840 x := v_1.Args[1]
4841 ptr2 := v_1.Args[0]
4842 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
4843 break
4844 }
4845 v.reset(OpARMMOVBreg)
4846 v.AddArg(x)
4847 return true
4848 }
4849
4850
4851
4852 for {
4853 if auxIntToInt32(v.AuxInt) != 0 {
4854 break
4855 }
4856 sym := auxToSym(v.Aux)
4857 if v_0.Op != OpARMADD {
4858 break
4859 }
4860 idx := v_0.Args[1]
4861 ptr := v_0.Args[0]
4862 mem := v_1
4863 if !(sym == nil) {
4864 break
4865 }
4866 v.reset(OpARMMOVBloadidx)
4867 v.AddArg3(ptr, idx, mem)
4868 return true
4869 }
4870
4871
4872
4873 for {
4874 off := auxIntToInt32(v.AuxInt)
4875 sym := auxToSym(v.Aux)
4876 if v_0.Op != OpSB || !(symIsRO(sym)) {
4877 break
4878 }
4879 v.reset(OpARMMOVWconst)
4880 v.AuxInt = int32ToAuxInt(int32(int8(read8(sym, int64(off)))))
4881 return true
4882 }
4883 return false
4884 }
4885 func rewriteValueARM_OpARMMOVBloadidx(v *Value) bool {
4886 v_2 := v.Args[2]
4887 v_1 := v.Args[1]
4888 v_0 := v.Args[0]
4889
4890
4891
4892 for {
4893 ptr := v_0
4894 idx := v_1
4895 if v_2.Op != OpARMMOVBstoreidx {
4896 break
4897 }
4898 x := v_2.Args[2]
4899 ptr2 := v_2.Args[0]
4900 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) {
4901 break
4902 }
4903 v.reset(OpARMMOVBreg)
4904 v.AddArg(x)
4905 return true
4906 }
4907
4908
4909 for {
4910 ptr := v_0
4911 if v_1.Op != OpARMMOVWconst {
4912 break
4913 }
4914 c := auxIntToInt32(v_1.AuxInt)
4915 mem := v_2
4916 v.reset(OpARMMOVBload)
4917 v.AuxInt = int32ToAuxInt(c)
4918 v.AddArg2(ptr, mem)
4919 return true
4920 }
4921
4922
4923 for {
4924 if v_0.Op != OpARMMOVWconst {
4925 break
4926 }
4927 c := auxIntToInt32(v_0.AuxInt)
4928 ptr := v_1
4929 mem := v_2
4930 v.reset(OpARMMOVBload)
4931 v.AuxInt = int32ToAuxInt(c)
4932 v.AddArg2(ptr, mem)
4933 return true
4934 }
4935 return false
4936 }
4937 func rewriteValueARM_OpARMMOVBreg(v *Value) bool {
4938 v_0 := v.Args[0]
4939
4940
4941 for {
4942 x := v_0
4943 if x.Op != OpARMMOVBload {
4944 break
4945 }
4946 v.reset(OpARMMOVWreg)
4947 v.AddArg(x)
4948 return true
4949 }
4950
4951
4952
4953 for {
4954 if v_0.Op != OpARMANDconst {
4955 break
4956 }
4957 c := auxIntToInt32(v_0.AuxInt)
4958 x := v_0.Args[0]
4959 if !(c&0x80 == 0) {
4960 break
4961 }
4962 v.reset(OpARMANDconst)
4963 v.AuxInt = int32ToAuxInt(c & 0x7f)
4964 v.AddArg(x)
4965 return true
4966 }
4967
4968
4969 for {
4970 x := v_0
4971 if x.Op != OpARMMOVBreg {
4972 break
4973 }
4974 v.reset(OpARMMOVWreg)
4975 v.AddArg(x)
4976 return true
4977 }
4978
4979
4980 for {
4981 if v_0.Op != OpARMMOVWconst {
4982 break
4983 }
4984 c := auxIntToInt32(v_0.AuxInt)
4985 v.reset(OpARMMOVWconst)
4986 v.AuxInt = int32ToAuxInt(int32(int8(c)))
4987 return true
4988 }
4989 return false
4990 }
4991 func rewriteValueARM_OpARMMOVBstore(v *Value) bool {
4992 v_2 := v.Args[2]
4993 v_1 := v.Args[1]
4994 v_0 := v.Args[0]
4995
4996
4997 for {
4998 off1 := auxIntToInt32(v.AuxInt)
4999 sym := auxToSym(v.Aux)
5000 if v_0.Op != OpARMADDconst {
5001 break
5002 }
5003 off2 := auxIntToInt32(v_0.AuxInt)
5004 ptr := v_0.Args[0]
5005 val := v_1
5006 mem := v_2
5007 v.reset(OpARMMOVBstore)
5008 v.AuxInt = int32ToAuxInt(off1 + off2)
5009 v.Aux = symToAux(sym)
5010 v.AddArg3(ptr, val, mem)
5011 return true
5012 }
5013
5014
5015 for {
5016 off1 := auxIntToInt32(v.AuxInt)
5017 sym := auxToSym(v.Aux)
5018 if v_0.Op != OpARMSUBconst {
5019 break
5020 }
5021 off2 := auxIntToInt32(v_0.AuxInt)
5022 ptr := v_0.Args[0]
5023 val := v_1
5024 mem := v_2
5025 v.reset(OpARMMOVBstore)
5026 v.AuxInt = int32ToAuxInt(off1 - off2)
5027 v.Aux = symToAux(sym)
5028 v.AddArg3(ptr, val, mem)
5029 return true
5030 }
5031
5032
5033
5034 for {
5035 off1 := auxIntToInt32(v.AuxInt)
5036 sym1 := auxToSym(v.Aux)
5037 if v_0.Op != OpARMMOVWaddr {
5038 break
5039 }
5040 off2 := auxIntToInt32(v_0.AuxInt)
5041 sym2 := auxToSym(v_0.Aux)
5042 ptr := v_0.Args[0]
5043 val := v_1
5044 mem := v_2
5045 if !(canMergeSym(sym1, sym2)) {
5046 break
5047 }
5048 v.reset(OpARMMOVBstore)
5049 v.AuxInt = int32ToAuxInt(off1 + off2)
5050 v.Aux = symToAux(mergeSym(sym1, sym2))
5051 v.AddArg3(ptr, val, mem)
5052 return true
5053 }
5054
5055
5056 for {
5057 off := auxIntToInt32(v.AuxInt)
5058 sym := auxToSym(v.Aux)
5059 ptr := v_0
5060 if v_1.Op != OpARMMOVBreg {
5061 break
5062 }
5063 x := v_1.Args[0]
5064 mem := v_2
5065 v.reset(OpARMMOVBstore)
5066 v.AuxInt = int32ToAuxInt(off)
5067 v.Aux = symToAux(sym)
5068 v.AddArg3(ptr, x, mem)
5069 return true
5070 }
5071
5072
5073 for {
5074 off := auxIntToInt32(v.AuxInt)
5075 sym := auxToSym(v.Aux)
5076 ptr := v_0
5077 if v_1.Op != OpARMMOVBUreg {
5078 break
5079 }
5080 x := v_1.Args[0]
5081 mem := v_2
5082 v.reset(OpARMMOVBstore)
5083 v.AuxInt = int32ToAuxInt(off)
5084 v.Aux = symToAux(sym)
5085 v.AddArg3(ptr, x, mem)
5086 return true
5087 }
5088
5089
5090 for {
5091 off := auxIntToInt32(v.AuxInt)
5092 sym := auxToSym(v.Aux)
5093 ptr := v_0
5094 if v_1.Op != OpARMMOVHreg {
5095 break
5096 }
5097 x := v_1.Args[0]
5098 mem := v_2
5099 v.reset(OpARMMOVBstore)
5100 v.AuxInt = int32ToAuxInt(off)
5101 v.Aux = symToAux(sym)
5102 v.AddArg3(ptr, x, mem)
5103 return true
5104 }
5105
5106
5107 for {
5108 off := auxIntToInt32(v.AuxInt)
5109 sym := auxToSym(v.Aux)
5110 ptr := v_0
5111 if v_1.Op != OpARMMOVHUreg {
5112 break
5113 }
5114 x := v_1.Args[0]
5115 mem := v_2
5116 v.reset(OpARMMOVBstore)
5117 v.AuxInt = int32ToAuxInt(off)
5118 v.Aux = symToAux(sym)
5119 v.AddArg3(ptr, x, mem)
5120 return true
5121 }
5122
5123
5124
5125 for {
5126 if auxIntToInt32(v.AuxInt) != 0 {
5127 break
5128 }
5129 sym := auxToSym(v.Aux)
5130 if v_0.Op != OpARMADD {
5131 break
5132 }
5133 idx := v_0.Args[1]
5134 ptr := v_0.Args[0]
5135 val := v_1
5136 mem := v_2
5137 if !(sym == nil) {
5138 break
5139 }
5140 v.reset(OpARMMOVBstoreidx)
5141 v.AddArg4(ptr, idx, val, mem)
5142 return true
5143 }
5144 return false
5145 }
5146 func rewriteValueARM_OpARMMOVBstoreidx(v *Value) bool {
5147 v_3 := v.Args[3]
5148 v_2 := v.Args[2]
5149 v_1 := v.Args[1]
5150 v_0 := v.Args[0]
5151
5152
5153 for {
5154 ptr := v_0
5155 if v_1.Op != OpARMMOVWconst {
5156 break
5157 }
5158 c := auxIntToInt32(v_1.AuxInt)
5159 val := v_2
5160 mem := v_3
5161 v.reset(OpARMMOVBstore)
5162 v.AuxInt = int32ToAuxInt(c)
5163 v.AddArg3(ptr, val, mem)
5164 return true
5165 }
5166
5167
5168 for {
5169 if v_0.Op != OpARMMOVWconst {
5170 break
5171 }
5172 c := auxIntToInt32(v_0.AuxInt)
5173 ptr := v_1
5174 val := v_2
5175 mem := v_3
5176 v.reset(OpARMMOVBstore)
5177 v.AuxInt = int32ToAuxInt(c)
5178 v.AddArg3(ptr, val, mem)
5179 return true
5180 }
5181 return false
5182 }
5183 func rewriteValueARM_OpARMMOVDload(v *Value) bool {
5184 v_1 := v.Args[1]
5185 v_0 := v.Args[0]
5186
5187
5188 for {
5189 off1 := auxIntToInt32(v.AuxInt)
5190 sym := auxToSym(v.Aux)
5191 if v_0.Op != OpARMADDconst {
5192 break
5193 }
5194 off2 := auxIntToInt32(v_0.AuxInt)
5195 ptr := v_0.Args[0]
5196 mem := v_1
5197 v.reset(OpARMMOVDload)
5198 v.AuxInt = int32ToAuxInt(off1 + off2)
5199 v.Aux = symToAux(sym)
5200 v.AddArg2(ptr, mem)
5201 return true
5202 }
5203
5204
5205 for {
5206 off1 := auxIntToInt32(v.AuxInt)
5207 sym := auxToSym(v.Aux)
5208 if v_0.Op != OpARMSUBconst {
5209 break
5210 }
5211 off2 := auxIntToInt32(v_0.AuxInt)
5212 ptr := v_0.Args[0]
5213 mem := v_1
5214 v.reset(OpARMMOVDload)
5215 v.AuxInt = int32ToAuxInt(off1 - off2)
5216 v.Aux = symToAux(sym)
5217 v.AddArg2(ptr, mem)
5218 return true
5219 }
5220
5221
5222
5223 for {
5224 off1 := auxIntToInt32(v.AuxInt)
5225 sym1 := auxToSym(v.Aux)
5226 if v_0.Op != OpARMMOVWaddr {
5227 break
5228 }
5229 off2 := auxIntToInt32(v_0.AuxInt)
5230 sym2 := auxToSym(v_0.Aux)
5231 ptr := v_0.Args[0]
5232 mem := v_1
5233 if !(canMergeSym(sym1, sym2)) {
5234 break
5235 }
5236 v.reset(OpARMMOVDload)
5237 v.AuxInt = int32ToAuxInt(off1 + off2)
5238 v.Aux = symToAux(mergeSym(sym1, sym2))
5239 v.AddArg2(ptr, mem)
5240 return true
5241 }
5242
5243
5244
5245 for {
5246 off := auxIntToInt32(v.AuxInt)
5247 sym := auxToSym(v.Aux)
5248 ptr := v_0
5249 if v_1.Op != OpARMMOVDstore {
5250 break
5251 }
5252 off2 := auxIntToInt32(v_1.AuxInt)
5253 sym2 := auxToSym(v_1.Aux)
5254 x := v_1.Args[1]
5255 ptr2 := v_1.Args[0]
5256 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
5257 break
5258 }
5259 v.copyOf(x)
5260 return true
5261 }
5262 return false
5263 }
5264 func rewriteValueARM_OpARMMOVDstore(v *Value) bool {
5265 v_2 := v.Args[2]
5266 v_1 := v.Args[1]
5267 v_0 := v.Args[0]
5268
5269
5270 for {
5271 off1 := auxIntToInt32(v.AuxInt)
5272 sym := auxToSym(v.Aux)
5273 if v_0.Op != OpARMADDconst {
5274 break
5275 }
5276 off2 := auxIntToInt32(v_0.AuxInt)
5277 ptr := v_0.Args[0]
5278 val := v_1
5279 mem := v_2
5280 v.reset(OpARMMOVDstore)
5281 v.AuxInt = int32ToAuxInt(off1 + off2)
5282 v.Aux = symToAux(sym)
5283 v.AddArg3(ptr, val, mem)
5284 return true
5285 }
5286
5287
5288 for {
5289 off1 := auxIntToInt32(v.AuxInt)
5290 sym := auxToSym(v.Aux)
5291 if v_0.Op != OpARMSUBconst {
5292 break
5293 }
5294 off2 := auxIntToInt32(v_0.AuxInt)
5295 ptr := v_0.Args[0]
5296 val := v_1
5297 mem := v_2
5298 v.reset(OpARMMOVDstore)
5299 v.AuxInt = int32ToAuxInt(off1 - off2)
5300 v.Aux = symToAux(sym)
5301 v.AddArg3(ptr, val, mem)
5302 return true
5303 }
5304
5305
5306
5307 for {
5308 off1 := auxIntToInt32(v.AuxInt)
5309 sym1 := auxToSym(v.Aux)
5310 if v_0.Op != OpARMMOVWaddr {
5311 break
5312 }
5313 off2 := auxIntToInt32(v_0.AuxInt)
5314 sym2 := auxToSym(v_0.Aux)
5315 ptr := v_0.Args[0]
5316 val := v_1
5317 mem := v_2
5318 if !(canMergeSym(sym1, sym2)) {
5319 break
5320 }
5321 v.reset(OpARMMOVDstore)
5322 v.AuxInt = int32ToAuxInt(off1 + off2)
5323 v.Aux = symToAux(mergeSym(sym1, sym2))
5324 v.AddArg3(ptr, val, mem)
5325 return true
5326 }
5327 return false
5328 }
5329 func rewriteValueARM_OpARMMOVFload(v *Value) bool {
5330 v_1 := v.Args[1]
5331 v_0 := v.Args[0]
5332
5333
5334 for {
5335 off1 := auxIntToInt32(v.AuxInt)
5336 sym := auxToSym(v.Aux)
5337 if v_0.Op != OpARMADDconst {
5338 break
5339 }
5340 off2 := auxIntToInt32(v_0.AuxInt)
5341 ptr := v_0.Args[0]
5342 mem := v_1
5343 v.reset(OpARMMOVFload)
5344 v.AuxInt = int32ToAuxInt(off1 + off2)
5345 v.Aux = symToAux(sym)
5346 v.AddArg2(ptr, mem)
5347 return true
5348 }
5349
5350
5351 for {
5352 off1 := auxIntToInt32(v.AuxInt)
5353 sym := auxToSym(v.Aux)
5354 if v_0.Op != OpARMSUBconst {
5355 break
5356 }
5357 off2 := auxIntToInt32(v_0.AuxInt)
5358 ptr := v_0.Args[0]
5359 mem := v_1
5360 v.reset(OpARMMOVFload)
5361 v.AuxInt = int32ToAuxInt(off1 - off2)
5362 v.Aux = symToAux(sym)
5363 v.AddArg2(ptr, mem)
5364 return true
5365 }
5366
5367
5368
5369 for {
5370 off1 := auxIntToInt32(v.AuxInt)
5371 sym1 := auxToSym(v.Aux)
5372 if v_0.Op != OpARMMOVWaddr {
5373 break
5374 }
5375 off2 := auxIntToInt32(v_0.AuxInt)
5376 sym2 := auxToSym(v_0.Aux)
5377 ptr := v_0.Args[0]
5378 mem := v_1
5379 if !(canMergeSym(sym1, sym2)) {
5380 break
5381 }
5382 v.reset(OpARMMOVFload)
5383 v.AuxInt = int32ToAuxInt(off1 + off2)
5384 v.Aux = symToAux(mergeSym(sym1, sym2))
5385 v.AddArg2(ptr, mem)
5386 return true
5387 }
5388
5389
5390
5391 for {
5392 off := auxIntToInt32(v.AuxInt)
5393 sym := auxToSym(v.Aux)
5394 ptr := v_0
5395 if v_1.Op != OpARMMOVFstore {
5396 break
5397 }
5398 off2 := auxIntToInt32(v_1.AuxInt)
5399 sym2 := auxToSym(v_1.Aux)
5400 x := v_1.Args[1]
5401 ptr2 := v_1.Args[0]
5402 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
5403 break
5404 }
5405 v.copyOf(x)
5406 return true
5407 }
5408 return false
5409 }
5410 func rewriteValueARM_OpARMMOVFstore(v *Value) bool {
5411 v_2 := v.Args[2]
5412 v_1 := v.Args[1]
5413 v_0 := v.Args[0]
5414
5415
5416 for {
5417 off1 := auxIntToInt32(v.AuxInt)
5418 sym := auxToSym(v.Aux)
5419 if v_0.Op != OpARMADDconst {
5420 break
5421 }
5422 off2 := auxIntToInt32(v_0.AuxInt)
5423 ptr := v_0.Args[0]
5424 val := v_1
5425 mem := v_2
5426 v.reset(OpARMMOVFstore)
5427 v.AuxInt = int32ToAuxInt(off1 + off2)
5428 v.Aux = symToAux(sym)
5429 v.AddArg3(ptr, val, mem)
5430 return true
5431 }
5432
5433
5434 for {
5435 off1 := auxIntToInt32(v.AuxInt)
5436 sym := auxToSym(v.Aux)
5437 if v_0.Op != OpARMSUBconst {
5438 break
5439 }
5440 off2 := auxIntToInt32(v_0.AuxInt)
5441 ptr := v_0.Args[0]
5442 val := v_1
5443 mem := v_2
5444 v.reset(OpARMMOVFstore)
5445 v.AuxInt = int32ToAuxInt(off1 - off2)
5446 v.Aux = symToAux(sym)
5447 v.AddArg3(ptr, val, mem)
5448 return true
5449 }
5450
5451
5452
5453 for {
5454 off1 := auxIntToInt32(v.AuxInt)
5455 sym1 := auxToSym(v.Aux)
5456 if v_0.Op != OpARMMOVWaddr {
5457 break
5458 }
5459 off2 := auxIntToInt32(v_0.AuxInt)
5460 sym2 := auxToSym(v_0.Aux)
5461 ptr := v_0.Args[0]
5462 val := v_1
5463 mem := v_2
5464 if !(canMergeSym(sym1, sym2)) {
5465 break
5466 }
5467 v.reset(OpARMMOVFstore)
5468 v.AuxInt = int32ToAuxInt(off1 + off2)
5469 v.Aux = symToAux(mergeSym(sym1, sym2))
5470 v.AddArg3(ptr, val, mem)
5471 return true
5472 }
5473 return false
5474 }
5475 func rewriteValueARM_OpARMMOVHUload(v *Value) bool {
5476 v_1 := v.Args[1]
5477 v_0 := v.Args[0]
5478 b := v.Block
5479 config := b.Func.Config
5480
5481
5482 for {
5483 off1 := auxIntToInt32(v.AuxInt)
5484 sym := auxToSym(v.Aux)
5485 if v_0.Op != OpARMADDconst {
5486 break
5487 }
5488 off2 := auxIntToInt32(v_0.AuxInt)
5489 ptr := v_0.Args[0]
5490 mem := v_1
5491 v.reset(OpARMMOVHUload)
5492 v.AuxInt = int32ToAuxInt(off1 + off2)
5493 v.Aux = symToAux(sym)
5494 v.AddArg2(ptr, mem)
5495 return true
5496 }
5497
5498
5499 for {
5500 off1 := auxIntToInt32(v.AuxInt)
5501 sym := auxToSym(v.Aux)
5502 if v_0.Op != OpARMSUBconst {
5503 break
5504 }
5505 off2 := auxIntToInt32(v_0.AuxInt)
5506 ptr := v_0.Args[0]
5507 mem := v_1
5508 v.reset(OpARMMOVHUload)
5509 v.AuxInt = int32ToAuxInt(off1 - off2)
5510 v.Aux = symToAux(sym)
5511 v.AddArg2(ptr, mem)
5512 return true
5513 }
5514
5515
5516
5517 for {
5518 off1 := auxIntToInt32(v.AuxInt)
5519 sym1 := auxToSym(v.Aux)
5520 if v_0.Op != OpARMMOVWaddr {
5521 break
5522 }
5523 off2 := auxIntToInt32(v_0.AuxInt)
5524 sym2 := auxToSym(v_0.Aux)
5525 ptr := v_0.Args[0]
5526 mem := v_1
5527 if !(canMergeSym(sym1, sym2)) {
5528 break
5529 }
5530 v.reset(OpARMMOVHUload)
5531 v.AuxInt = int32ToAuxInt(off1 + off2)
5532 v.Aux = symToAux(mergeSym(sym1, sym2))
5533 v.AddArg2(ptr, mem)
5534 return true
5535 }
5536
5537
5538
5539 for {
5540 off := auxIntToInt32(v.AuxInt)
5541 sym := auxToSym(v.Aux)
5542 ptr := v_0
5543 if v_1.Op != OpARMMOVHstore {
5544 break
5545 }
5546 off2 := auxIntToInt32(v_1.AuxInt)
5547 sym2 := auxToSym(v_1.Aux)
5548 x := v_1.Args[1]
5549 ptr2 := v_1.Args[0]
5550 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
5551 break
5552 }
5553 v.reset(OpARMMOVHUreg)
5554 v.AddArg(x)
5555 return true
5556 }
5557
5558
5559
5560 for {
5561 if auxIntToInt32(v.AuxInt) != 0 {
5562 break
5563 }
5564 sym := auxToSym(v.Aux)
5565 if v_0.Op != OpARMADD {
5566 break
5567 }
5568 idx := v_0.Args[1]
5569 ptr := v_0.Args[0]
5570 mem := v_1
5571 if !(sym == nil) {
5572 break
5573 }
5574 v.reset(OpARMMOVHUloadidx)
5575 v.AddArg3(ptr, idx, mem)
5576 return true
5577 }
5578
5579
5580
5581 for {
5582 off := auxIntToInt32(v.AuxInt)
5583 sym := auxToSym(v.Aux)
5584 if v_0.Op != OpSB || !(symIsRO(sym)) {
5585 break
5586 }
5587 v.reset(OpARMMOVWconst)
5588 v.AuxInt = int32ToAuxInt(int32(read16(sym, int64(off), config.ctxt.Arch.ByteOrder)))
5589 return true
5590 }
5591 return false
5592 }
5593 func rewriteValueARM_OpARMMOVHUloadidx(v *Value) bool {
5594 v_2 := v.Args[2]
5595 v_1 := v.Args[1]
5596 v_0 := v.Args[0]
5597
5598
5599
5600 for {
5601 ptr := v_0
5602 idx := v_1
5603 if v_2.Op != OpARMMOVHstoreidx {
5604 break
5605 }
5606 x := v_2.Args[2]
5607 ptr2 := v_2.Args[0]
5608 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) {
5609 break
5610 }
5611 v.reset(OpARMMOVHUreg)
5612 v.AddArg(x)
5613 return true
5614 }
5615
5616
5617 for {
5618 ptr := v_0
5619 if v_1.Op != OpARMMOVWconst {
5620 break
5621 }
5622 c := auxIntToInt32(v_1.AuxInt)
5623 mem := v_2
5624 v.reset(OpARMMOVHUload)
5625 v.AuxInt = int32ToAuxInt(c)
5626 v.AddArg2(ptr, mem)
5627 return true
5628 }
5629
5630
5631 for {
5632 if v_0.Op != OpARMMOVWconst {
5633 break
5634 }
5635 c := auxIntToInt32(v_0.AuxInt)
5636 ptr := v_1
5637 mem := v_2
5638 v.reset(OpARMMOVHUload)
5639 v.AuxInt = int32ToAuxInt(c)
5640 v.AddArg2(ptr, mem)
5641 return true
5642 }
5643 return false
5644 }
5645 func rewriteValueARM_OpARMMOVHUreg(v *Value) bool {
5646 v_0 := v.Args[0]
5647
5648
5649 for {
5650 x := v_0
5651 if x.Op != OpARMMOVBUload {
5652 break
5653 }
5654 v.reset(OpARMMOVWreg)
5655 v.AddArg(x)
5656 return true
5657 }
5658
5659
5660 for {
5661 x := v_0
5662 if x.Op != OpARMMOVHUload {
5663 break
5664 }
5665 v.reset(OpARMMOVWreg)
5666 v.AddArg(x)
5667 return true
5668 }
5669
5670
5671 for {
5672 if v_0.Op != OpARMANDconst {
5673 break
5674 }
5675 c := auxIntToInt32(v_0.AuxInt)
5676 x := v_0.Args[0]
5677 v.reset(OpARMANDconst)
5678 v.AuxInt = int32ToAuxInt(c & 0xffff)
5679 v.AddArg(x)
5680 return true
5681 }
5682
5683
5684 for {
5685 x := v_0
5686 if x.Op != OpARMMOVBUreg {
5687 break
5688 }
5689 v.reset(OpARMMOVWreg)
5690 v.AddArg(x)
5691 return true
5692 }
5693
5694
5695 for {
5696 x := v_0
5697 if x.Op != OpARMMOVHUreg {
5698 break
5699 }
5700 v.reset(OpARMMOVWreg)
5701 v.AddArg(x)
5702 return true
5703 }
5704
5705
5706 for {
5707 if v_0.Op != OpARMMOVWconst {
5708 break
5709 }
5710 c := auxIntToInt32(v_0.AuxInt)
5711 v.reset(OpARMMOVWconst)
5712 v.AuxInt = int32ToAuxInt(int32(uint16(c)))
5713 return true
5714 }
5715 return false
5716 }
5717 func rewriteValueARM_OpARMMOVHload(v *Value) bool {
5718 v_1 := v.Args[1]
5719 v_0 := v.Args[0]
5720 b := v.Block
5721 config := b.Func.Config
5722
5723
5724 for {
5725 off1 := auxIntToInt32(v.AuxInt)
5726 sym := auxToSym(v.Aux)
5727 if v_0.Op != OpARMADDconst {
5728 break
5729 }
5730 off2 := auxIntToInt32(v_0.AuxInt)
5731 ptr := v_0.Args[0]
5732 mem := v_1
5733 v.reset(OpARMMOVHload)
5734 v.AuxInt = int32ToAuxInt(off1 + off2)
5735 v.Aux = symToAux(sym)
5736 v.AddArg2(ptr, mem)
5737 return true
5738 }
5739
5740
5741 for {
5742 off1 := auxIntToInt32(v.AuxInt)
5743 sym := auxToSym(v.Aux)
5744 if v_0.Op != OpARMSUBconst {
5745 break
5746 }
5747 off2 := auxIntToInt32(v_0.AuxInt)
5748 ptr := v_0.Args[0]
5749 mem := v_1
5750 v.reset(OpARMMOVHload)
5751 v.AuxInt = int32ToAuxInt(off1 - off2)
5752 v.Aux = symToAux(sym)
5753 v.AddArg2(ptr, mem)
5754 return true
5755 }
5756
5757
5758
5759 for {
5760 off1 := auxIntToInt32(v.AuxInt)
5761 sym1 := auxToSym(v.Aux)
5762 if v_0.Op != OpARMMOVWaddr {
5763 break
5764 }
5765 off2 := auxIntToInt32(v_0.AuxInt)
5766 sym2 := auxToSym(v_0.Aux)
5767 ptr := v_0.Args[0]
5768 mem := v_1
5769 if !(canMergeSym(sym1, sym2)) {
5770 break
5771 }
5772 v.reset(OpARMMOVHload)
5773 v.AuxInt = int32ToAuxInt(off1 + off2)
5774 v.Aux = symToAux(mergeSym(sym1, sym2))
5775 v.AddArg2(ptr, mem)
5776 return true
5777 }
5778
5779
5780
5781 for {
5782 off := auxIntToInt32(v.AuxInt)
5783 sym := auxToSym(v.Aux)
5784 ptr := v_0
5785 if v_1.Op != OpARMMOVHstore {
5786 break
5787 }
5788 off2 := auxIntToInt32(v_1.AuxInt)
5789 sym2 := auxToSym(v_1.Aux)
5790 x := v_1.Args[1]
5791 ptr2 := v_1.Args[0]
5792 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
5793 break
5794 }
5795 v.reset(OpARMMOVHreg)
5796 v.AddArg(x)
5797 return true
5798 }
5799
5800
5801
5802 for {
5803 if auxIntToInt32(v.AuxInt) != 0 {
5804 break
5805 }
5806 sym := auxToSym(v.Aux)
5807 if v_0.Op != OpARMADD {
5808 break
5809 }
5810 idx := v_0.Args[1]
5811 ptr := v_0.Args[0]
5812 mem := v_1
5813 if !(sym == nil) {
5814 break
5815 }
5816 v.reset(OpARMMOVHloadidx)
5817 v.AddArg3(ptr, idx, mem)
5818 return true
5819 }
5820
5821
5822
5823 for {
5824 off := auxIntToInt32(v.AuxInt)
5825 sym := auxToSym(v.Aux)
5826 if v_0.Op != OpSB || !(symIsRO(sym)) {
5827 break
5828 }
5829 v.reset(OpARMMOVWconst)
5830 v.AuxInt = int32ToAuxInt(int32(int16(read16(sym, int64(off), config.ctxt.Arch.ByteOrder))))
5831 return true
5832 }
5833 return false
5834 }
5835 func rewriteValueARM_OpARMMOVHloadidx(v *Value) bool {
5836 v_2 := v.Args[2]
5837 v_1 := v.Args[1]
5838 v_0 := v.Args[0]
5839
5840
5841
5842 for {
5843 ptr := v_0
5844 idx := v_1
5845 if v_2.Op != OpARMMOVHstoreidx {
5846 break
5847 }
5848 x := v_2.Args[2]
5849 ptr2 := v_2.Args[0]
5850 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) {
5851 break
5852 }
5853 v.reset(OpARMMOVHreg)
5854 v.AddArg(x)
5855 return true
5856 }
5857
5858
5859 for {
5860 ptr := v_0
5861 if v_1.Op != OpARMMOVWconst {
5862 break
5863 }
5864 c := auxIntToInt32(v_1.AuxInt)
5865 mem := v_2
5866 v.reset(OpARMMOVHload)
5867 v.AuxInt = int32ToAuxInt(c)
5868 v.AddArg2(ptr, mem)
5869 return true
5870 }
5871
5872
5873 for {
5874 if v_0.Op != OpARMMOVWconst {
5875 break
5876 }
5877 c := auxIntToInt32(v_0.AuxInt)
5878 ptr := v_1
5879 mem := v_2
5880 v.reset(OpARMMOVHload)
5881 v.AuxInt = int32ToAuxInt(c)
5882 v.AddArg2(ptr, mem)
5883 return true
5884 }
5885 return false
5886 }
5887 func rewriteValueARM_OpARMMOVHreg(v *Value) bool {
5888 v_0 := v.Args[0]
5889
5890
5891 for {
5892 x := v_0
5893 if x.Op != OpARMMOVBload {
5894 break
5895 }
5896 v.reset(OpARMMOVWreg)
5897 v.AddArg(x)
5898 return true
5899 }
5900
5901
5902 for {
5903 x := v_0
5904 if x.Op != OpARMMOVBUload {
5905 break
5906 }
5907 v.reset(OpARMMOVWreg)
5908 v.AddArg(x)
5909 return true
5910 }
5911
5912
5913 for {
5914 x := v_0
5915 if x.Op != OpARMMOVHload {
5916 break
5917 }
5918 v.reset(OpARMMOVWreg)
5919 v.AddArg(x)
5920 return true
5921 }
5922
5923
5924
5925 for {
5926 if v_0.Op != OpARMANDconst {
5927 break
5928 }
5929 c := auxIntToInt32(v_0.AuxInt)
5930 x := v_0.Args[0]
5931 if !(c&0x8000 == 0) {
5932 break
5933 }
5934 v.reset(OpARMANDconst)
5935 v.AuxInt = int32ToAuxInt(c & 0x7fff)
5936 v.AddArg(x)
5937 return true
5938 }
5939
5940
5941 for {
5942 x := v_0
5943 if x.Op != OpARMMOVBreg {
5944 break
5945 }
5946 v.reset(OpARMMOVWreg)
5947 v.AddArg(x)
5948 return true
5949 }
5950
5951
5952 for {
5953 x := v_0
5954 if x.Op != OpARMMOVBUreg {
5955 break
5956 }
5957 v.reset(OpARMMOVWreg)
5958 v.AddArg(x)
5959 return true
5960 }
5961
5962
5963 for {
5964 x := v_0
5965 if x.Op != OpARMMOVHreg {
5966 break
5967 }
5968 v.reset(OpARMMOVWreg)
5969 v.AddArg(x)
5970 return true
5971 }
5972
5973
5974 for {
5975 if v_0.Op != OpARMMOVWconst {
5976 break
5977 }
5978 c := auxIntToInt32(v_0.AuxInt)
5979 v.reset(OpARMMOVWconst)
5980 v.AuxInt = int32ToAuxInt(int32(int16(c)))
5981 return true
5982 }
5983 return false
5984 }
5985 func rewriteValueARM_OpARMMOVHstore(v *Value) bool {
5986 v_2 := v.Args[2]
5987 v_1 := v.Args[1]
5988 v_0 := v.Args[0]
5989
5990
5991 for {
5992 off1 := auxIntToInt32(v.AuxInt)
5993 sym := auxToSym(v.Aux)
5994 if v_0.Op != OpARMADDconst {
5995 break
5996 }
5997 off2 := auxIntToInt32(v_0.AuxInt)
5998 ptr := v_0.Args[0]
5999 val := v_1
6000 mem := v_2
6001 v.reset(OpARMMOVHstore)
6002 v.AuxInt = int32ToAuxInt(off1 + off2)
6003 v.Aux = symToAux(sym)
6004 v.AddArg3(ptr, val, mem)
6005 return true
6006 }
6007
6008
6009 for {
6010 off1 := auxIntToInt32(v.AuxInt)
6011 sym := auxToSym(v.Aux)
6012 if v_0.Op != OpARMSUBconst {
6013 break
6014 }
6015 off2 := auxIntToInt32(v_0.AuxInt)
6016 ptr := v_0.Args[0]
6017 val := v_1
6018 mem := v_2
6019 v.reset(OpARMMOVHstore)
6020 v.AuxInt = int32ToAuxInt(off1 - off2)
6021 v.Aux = symToAux(sym)
6022 v.AddArg3(ptr, val, mem)
6023 return true
6024 }
6025
6026
6027
6028 for {
6029 off1 := auxIntToInt32(v.AuxInt)
6030 sym1 := auxToSym(v.Aux)
6031 if v_0.Op != OpARMMOVWaddr {
6032 break
6033 }
6034 off2 := auxIntToInt32(v_0.AuxInt)
6035 sym2 := auxToSym(v_0.Aux)
6036 ptr := v_0.Args[0]
6037 val := v_1
6038 mem := v_2
6039 if !(canMergeSym(sym1, sym2)) {
6040 break
6041 }
6042 v.reset(OpARMMOVHstore)
6043 v.AuxInt = int32ToAuxInt(off1 + off2)
6044 v.Aux = symToAux(mergeSym(sym1, sym2))
6045 v.AddArg3(ptr, val, mem)
6046 return true
6047 }
6048
6049
6050 for {
6051 off := auxIntToInt32(v.AuxInt)
6052 sym := auxToSym(v.Aux)
6053 ptr := v_0
6054 if v_1.Op != OpARMMOVHreg {
6055 break
6056 }
6057 x := v_1.Args[0]
6058 mem := v_2
6059 v.reset(OpARMMOVHstore)
6060 v.AuxInt = int32ToAuxInt(off)
6061 v.Aux = symToAux(sym)
6062 v.AddArg3(ptr, x, mem)
6063 return true
6064 }
6065
6066
6067 for {
6068 off := auxIntToInt32(v.AuxInt)
6069 sym := auxToSym(v.Aux)
6070 ptr := v_0
6071 if v_1.Op != OpARMMOVHUreg {
6072 break
6073 }
6074 x := v_1.Args[0]
6075 mem := v_2
6076 v.reset(OpARMMOVHstore)
6077 v.AuxInt = int32ToAuxInt(off)
6078 v.Aux = symToAux(sym)
6079 v.AddArg3(ptr, x, mem)
6080 return true
6081 }
6082
6083
6084
6085 for {
6086 if auxIntToInt32(v.AuxInt) != 0 {
6087 break
6088 }
6089 sym := auxToSym(v.Aux)
6090 if v_0.Op != OpARMADD {
6091 break
6092 }
6093 idx := v_0.Args[1]
6094 ptr := v_0.Args[0]
6095 val := v_1
6096 mem := v_2
6097 if !(sym == nil) {
6098 break
6099 }
6100 v.reset(OpARMMOVHstoreidx)
6101 v.AddArg4(ptr, idx, val, mem)
6102 return true
6103 }
6104 return false
6105 }
6106 func rewriteValueARM_OpARMMOVHstoreidx(v *Value) bool {
6107 v_3 := v.Args[3]
6108 v_2 := v.Args[2]
6109 v_1 := v.Args[1]
6110 v_0 := v.Args[0]
6111
6112
6113 for {
6114 ptr := v_0
6115 if v_1.Op != OpARMMOVWconst {
6116 break
6117 }
6118 c := auxIntToInt32(v_1.AuxInt)
6119 val := v_2
6120 mem := v_3
6121 v.reset(OpARMMOVHstore)
6122 v.AuxInt = int32ToAuxInt(c)
6123 v.AddArg3(ptr, val, mem)
6124 return true
6125 }
6126
6127
6128 for {
6129 if v_0.Op != OpARMMOVWconst {
6130 break
6131 }
6132 c := auxIntToInt32(v_0.AuxInt)
6133 ptr := v_1
6134 val := v_2
6135 mem := v_3
6136 v.reset(OpARMMOVHstore)
6137 v.AuxInt = int32ToAuxInt(c)
6138 v.AddArg3(ptr, val, mem)
6139 return true
6140 }
6141 return false
6142 }
6143 func rewriteValueARM_OpARMMOVWload(v *Value) bool {
6144 v_1 := v.Args[1]
6145 v_0 := v.Args[0]
6146 b := v.Block
6147 config := b.Func.Config
6148
6149
6150 for {
6151 off1 := auxIntToInt32(v.AuxInt)
6152 sym := auxToSym(v.Aux)
6153 if v_0.Op != OpARMADDconst {
6154 break
6155 }
6156 off2 := auxIntToInt32(v_0.AuxInt)
6157 ptr := v_0.Args[0]
6158 mem := v_1
6159 v.reset(OpARMMOVWload)
6160 v.AuxInt = int32ToAuxInt(off1 + off2)
6161 v.Aux = symToAux(sym)
6162 v.AddArg2(ptr, mem)
6163 return true
6164 }
6165
6166
6167 for {
6168 off1 := auxIntToInt32(v.AuxInt)
6169 sym := auxToSym(v.Aux)
6170 if v_0.Op != OpARMSUBconst {
6171 break
6172 }
6173 off2 := auxIntToInt32(v_0.AuxInt)
6174 ptr := v_0.Args[0]
6175 mem := v_1
6176 v.reset(OpARMMOVWload)
6177 v.AuxInt = int32ToAuxInt(off1 - off2)
6178 v.Aux = symToAux(sym)
6179 v.AddArg2(ptr, mem)
6180 return true
6181 }
6182
6183
6184
6185 for {
6186 off1 := auxIntToInt32(v.AuxInt)
6187 sym1 := auxToSym(v.Aux)
6188 if v_0.Op != OpARMMOVWaddr {
6189 break
6190 }
6191 off2 := auxIntToInt32(v_0.AuxInt)
6192 sym2 := auxToSym(v_0.Aux)
6193 ptr := v_0.Args[0]
6194 mem := v_1
6195 if !(canMergeSym(sym1, sym2)) {
6196 break
6197 }
6198 v.reset(OpARMMOVWload)
6199 v.AuxInt = int32ToAuxInt(off1 + off2)
6200 v.Aux = symToAux(mergeSym(sym1, sym2))
6201 v.AddArg2(ptr, mem)
6202 return true
6203 }
6204
6205
6206
6207 for {
6208 off := auxIntToInt32(v.AuxInt)
6209 sym := auxToSym(v.Aux)
6210 ptr := v_0
6211 if v_1.Op != OpARMMOVWstore {
6212 break
6213 }
6214 off2 := auxIntToInt32(v_1.AuxInt)
6215 sym2 := auxToSym(v_1.Aux)
6216 x := v_1.Args[1]
6217 ptr2 := v_1.Args[0]
6218 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
6219 break
6220 }
6221 v.copyOf(x)
6222 return true
6223 }
6224
6225
6226
6227 for {
6228 if auxIntToInt32(v.AuxInt) != 0 {
6229 break
6230 }
6231 sym := auxToSym(v.Aux)
6232 if v_0.Op != OpARMADD {
6233 break
6234 }
6235 idx := v_0.Args[1]
6236 ptr := v_0.Args[0]
6237 mem := v_1
6238 if !(sym == nil) {
6239 break
6240 }
6241 v.reset(OpARMMOVWloadidx)
6242 v.AddArg3(ptr, idx, mem)
6243 return true
6244 }
6245
6246
6247
6248 for {
6249 if auxIntToInt32(v.AuxInt) != 0 {
6250 break
6251 }
6252 sym := auxToSym(v.Aux)
6253 if v_0.Op != OpARMADDshiftLL {
6254 break
6255 }
6256 c := auxIntToInt32(v_0.AuxInt)
6257 idx := v_0.Args[1]
6258 ptr := v_0.Args[0]
6259 mem := v_1
6260 if !(sym == nil) {
6261 break
6262 }
6263 v.reset(OpARMMOVWloadshiftLL)
6264 v.AuxInt = int32ToAuxInt(c)
6265 v.AddArg3(ptr, idx, mem)
6266 return true
6267 }
6268
6269
6270
6271 for {
6272 if auxIntToInt32(v.AuxInt) != 0 {
6273 break
6274 }
6275 sym := auxToSym(v.Aux)
6276 if v_0.Op != OpARMADDshiftRL {
6277 break
6278 }
6279 c := auxIntToInt32(v_0.AuxInt)
6280 idx := v_0.Args[1]
6281 ptr := v_0.Args[0]
6282 mem := v_1
6283 if !(sym == nil) {
6284 break
6285 }
6286 v.reset(OpARMMOVWloadshiftRL)
6287 v.AuxInt = int32ToAuxInt(c)
6288 v.AddArg3(ptr, idx, mem)
6289 return true
6290 }
6291
6292
6293
6294 for {
6295 if auxIntToInt32(v.AuxInt) != 0 {
6296 break
6297 }
6298 sym := auxToSym(v.Aux)
6299 if v_0.Op != OpARMADDshiftRA {
6300 break
6301 }
6302 c := auxIntToInt32(v_0.AuxInt)
6303 idx := v_0.Args[1]
6304 ptr := v_0.Args[0]
6305 mem := v_1
6306 if !(sym == nil) {
6307 break
6308 }
6309 v.reset(OpARMMOVWloadshiftRA)
6310 v.AuxInt = int32ToAuxInt(c)
6311 v.AddArg3(ptr, idx, mem)
6312 return true
6313 }
6314
6315
6316
6317 for {
6318 off := auxIntToInt32(v.AuxInt)
6319 sym := auxToSym(v.Aux)
6320 if v_0.Op != OpSB || !(symIsRO(sym)) {
6321 break
6322 }
6323 v.reset(OpARMMOVWconst)
6324 v.AuxInt = int32ToAuxInt(int32(read32(sym, int64(off), config.ctxt.Arch.ByteOrder)))
6325 return true
6326 }
6327 return false
6328 }
6329 func rewriteValueARM_OpARMMOVWloadidx(v *Value) bool {
6330 v_2 := v.Args[2]
6331 v_1 := v.Args[1]
6332 v_0 := v.Args[0]
6333
6334
6335
6336 for {
6337 ptr := v_0
6338 idx := v_1
6339 if v_2.Op != OpARMMOVWstoreidx {
6340 break
6341 }
6342 x := v_2.Args[2]
6343 ptr2 := v_2.Args[0]
6344 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) {
6345 break
6346 }
6347 v.copyOf(x)
6348 return true
6349 }
6350
6351
6352 for {
6353 ptr := v_0
6354 if v_1.Op != OpARMMOVWconst {
6355 break
6356 }
6357 c := auxIntToInt32(v_1.AuxInt)
6358 mem := v_2
6359 v.reset(OpARMMOVWload)
6360 v.AuxInt = int32ToAuxInt(c)
6361 v.AddArg2(ptr, mem)
6362 return true
6363 }
6364
6365
6366 for {
6367 if v_0.Op != OpARMMOVWconst {
6368 break
6369 }
6370 c := auxIntToInt32(v_0.AuxInt)
6371 ptr := v_1
6372 mem := v_2
6373 v.reset(OpARMMOVWload)
6374 v.AuxInt = int32ToAuxInt(c)
6375 v.AddArg2(ptr, mem)
6376 return true
6377 }
6378
6379
6380 for {
6381 ptr := v_0
6382 if v_1.Op != OpARMSLLconst {
6383 break
6384 }
6385 c := auxIntToInt32(v_1.AuxInt)
6386 idx := v_1.Args[0]
6387 mem := v_2
6388 v.reset(OpARMMOVWloadshiftLL)
6389 v.AuxInt = int32ToAuxInt(c)
6390 v.AddArg3(ptr, idx, mem)
6391 return true
6392 }
6393
6394
6395 for {
6396 if v_0.Op != OpARMSLLconst {
6397 break
6398 }
6399 c := auxIntToInt32(v_0.AuxInt)
6400 idx := v_0.Args[0]
6401 ptr := v_1
6402 mem := v_2
6403 v.reset(OpARMMOVWloadshiftLL)
6404 v.AuxInt = int32ToAuxInt(c)
6405 v.AddArg3(ptr, idx, mem)
6406 return true
6407 }
6408
6409
6410 for {
6411 ptr := v_0
6412 if v_1.Op != OpARMSRLconst {
6413 break
6414 }
6415 c := auxIntToInt32(v_1.AuxInt)
6416 idx := v_1.Args[0]
6417 mem := v_2
6418 v.reset(OpARMMOVWloadshiftRL)
6419 v.AuxInt = int32ToAuxInt(c)
6420 v.AddArg3(ptr, idx, mem)
6421 return true
6422 }
6423
6424
6425 for {
6426 if v_0.Op != OpARMSRLconst {
6427 break
6428 }
6429 c := auxIntToInt32(v_0.AuxInt)
6430 idx := v_0.Args[0]
6431 ptr := v_1
6432 mem := v_2
6433 v.reset(OpARMMOVWloadshiftRL)
6434 v.AuxInt = int32ToAuxInt(c)
6435 v.AddArg3(ptr, idx, mem)
6436 return true
6437 }
6438
6439
6440 for {
6441 ptr := v_0
6442 if v_1.Op != OpARMSRAconst {
6443 break
6444 }
6445 c := auxIntToInt32(v_1.AuxInt)
6446 idx := v_1.Args[0]
6447 mem := v_2
6448 v.reset(OpARMMOVWloadshiftRA)
6449 v.AuxInt = int32ToAuxInt(c)
6450 v.AddArg3(ptr, idx, mem)
6451 return true
6452 }
6453
6454
6455 for {
6456 if v_0.Op != OpARMSRAconst {
6457 break
6458 }
6459 c := auxIntToInt32(v_0.AuxInt)
6460 idx := v_0.Args[0]
6461 ptr := v_1
6462 mem := v_2
6463 v.reset(OpARMMOVWloadshiftRA)
6464 v.AuxInt = int32ToAuxInt(c)
6465 v.AddArg3(ptr, idx, mem)
6466 return true
6467 }
6468 return false
6469 }
6470 func rewriteValueARM_OpARMMOVWloadshiftLL(v *Value) bool {
6471 v_2 := v.Args[2]
6472 v_1 := v.Args[1]
6473 v_0 := v.Args[0]
6474
6475
6476
6477 for {
6478 c := auxIntToInt32(v.AuxInt)
6479 ptr := v_0
6480 idx := v_1
6481 if v_2.Op != OpARMMOVWstoreshiftLL {
6482 break
6483 }
6484 d := auxIntToInt32(v_2.AuxInt)
6485 x := v_2.Args[2]
6486 ptr2 := v_2.Args[0]
6487 if idx != v_2.Args[1] || !(c == d && isSamePtr(ptr, ptr2)) {
6488 break
6489 }
6490 v.copyOf(x)
6491 return true
6492 }
6493
6494
6495 for {
6496 d := auxIntToInt32(v.AuxInt)
6497 ptr := v_0
6498 if v_1.Op != OpARMMOVWconst {
6499 break
6500 }
6501 c := auxIntToInt32(v_1.AuxInt)
6502 mem := v_2
6503 v.reset(OpARMMOVWload)
6504 v.AuxInt = int32ToAuxInt(int32(uint32(c) << uint64(d)))
6505 v.AddArg2(ptr, mem)
6506 return true
6507 }
6508 return false
6509 }
6510 func rewriteValueARM_OpARMMOVWloadshiftRA(v *Value) bool {
6511 v_2 := v.Args[2]
6512 v_1 := v.Args[1]
6513 v_0 := v.Args[0]
6514
6515
6516
6517 for {
6518 c := auxIntToInt32(v.AuxInt)
6519 ptr := v_0
6520 idx := v_1
6521 if v_2.Op != OpARMMOVWstoreshiftRA {
6522 break
6523 }
6524 d := auxIntToInt32(v_2.AuxInt)
6525 x := v_2.Args[2]
6526 ptr2 := v_2.Args[0]
6527 if idx != v_2.Args[1] || !(c == d && isSamePtr(ptr, ptr2)) {
6528 break
6529 }
6530 v.copyOf(x)
6531 return true
6532 }
6533
6534
6535 for {
6536 d := auxIntToInt32(v.AuxInt)
6537 ptr := v_0
6538 if v_1.Op != OpARMMOVWconst {
6539 break
6540 }
6541 c := auxIntToInt32(v_1.AuxInt)
6542 mem := v_2
6543 v.reset(OpARMMOVWload)
6544 v.AuxInt = int32ToAuxInt(c >> uint64(d))
6545 v.AddArg2(ptr, mem)
6546 return true
6547 }
6548 return false
6549 }
6550 func rewriteValueARM_OpARMMOVWloadshiftRL(v *Value) bool {
6551 v_2 := v.Args[2]
6552 v_1 := v.Args[1]
6553 v_0 := v.Args[0]
6554
6555
6556
6557 for {
6558 c := auxIntToInt32(v.AuxInt)
6559 ptr := v_0
6560 idx := v_1
6561 if v_2.Op != OpARMMOVWstoreshiftRL {
6562 break
6563 }
6564 d := auxIntToInt32(v_2.AuxInt)
6565 x := v_2.Args[2]
6566 ptr2 := v_2.Args[0]
6567 if idx != v_2.Args[1] || !(c == d && isSamePtr(ptr, ptr2)) {
6568 break
6569 }
6570 v.copyOf(x)
6571 return true
6572 }
6573
6574
6575 for {
6576 d := auxIntToInt32(v.AuxInt)
6577 ptr := v_0
6578 if v_1.Op != OpARMMOVWconst {
6579 break
6580 }
6581 c := auxIntToInt32(v_1.AuxInt)
6582 mem := v_2
6583 v.reset(OpARMMOVWload)
6584 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
6585 v.AddArg2(ptr, mem)
6586 return true
6587 }
6588 return false
6589 }
6590 func rewriteValueARM_OpARMMOVWnop(v *Value) bool {
6591 v_0 := v.Args[0]
6592
6593
6594 for {
6595 if v_0.Op != OpARMMOVWconst {
6596 break
6597 }
6598 c := auxIntToInt32(v_0.AuxInt)
6599 v.reset(OpARMMOVWconst)
6600 v.AuxInt = int32ToAuxInt(c)
6601 return true
6602 }
6603 return false
6604 }
6605 func rewriteValueARM_OpARMMOVWreg(v *Value) bool {
6606 v_0 := v.Args[0]
6607
6608
6609
6610 for {
6611 x := v_0
6612 if !(x.Uses == 1) {
6613 break
6614 }
6615 v.reset(OpARMMOVWnop)
6616 v.AddArg(x)
6617 return true
6618 }
6619
6620
6621 for {
6622 if v_0.Op != OpARMMOVWconst {
6623 break
6624 }
6625 c := auxIntToInt32(v_0.AuxInt)
6626 v.reset(OpARMMOVWconst)
6627 v.AuxInt = int32ToAuxInt(c)
6628 return true
6629 }
6630 return false
6631 }
6632 func rewriteValueARM_OpARMMOVWstore(v *Value) bool {
6633 v_2 := v.Args[2]
6634 v_1 := v.Args[1]
6635 v_0 := v.Args[0]
6636
6637
6638 for {
6639 off1 := auxIntToInt32(v.AuxInt)
6640 sym := auxToSym(v.Aux)
6641 if v_0.Op != OpARMADDconst {
6642 break
6643 }
6644 off2 := auxIntToInt32(v_0.AuxInt)
6645 ptr := v_0.Args[0]
6646 val := v_1
6647 mem := v_2
6648 v.reset(OpARMMOVWstore)
6649 v.AuxInt = int32ToAuxInt(off1 + off2)
6650 v.Aux = symToAux(sym)
6651 v.AddArg3(ptr, val, mem)
6652 return true
6653 }
6654
6655
6656 for {
6657 off1 := auxIntToInt32(v.AuxInt)
6658 sym := auxToSym(v.Aux)
6659 if v_0.Op != OpARMSUBconst {
6660 break
6661 }
6662 off2 := auxIntToInt32(v_0.AuxInt)
6663 ptr := v_0.Args[0]
6664 val := v_1
6665 mem := v_2
6666 v.reset(OpARMMOVWstore)
6667 v.AuxInt = int32ToAuxInt(off1 - off2)
6668 v.Aux = symToAux(sym)
6669 v.AddArg3(ptr, val, mem)
6670 return true
6671 }
6672
6673
6674
6675 for {
6676 off1 := auxIntToInt32(v.AuxInt)
6677 sym1 := auxToSym(v.Aux)
6678 if v_0.Op != OpARMMOVWaddr {
6679 break
6680 }
6681 off2 := auxIntToInt32(v_0.AuxInt)
6682 sym2 := auxToSym(v_0.Aux)
6683 ptr := v_0.Args[0]
6684 val := v_1
6685 mem := v_2
6686 if !(canMergeSym(sym1, sym2)) {
6687 break
6688 }
6689 v.reset(OpARMMOVWstore)
6690 v.AuxInt = int32ToAuxInt(off1 + off2)
6691 v.Aux = symToAux(mergeSym(sym1, sym2))
6692 v.AddArg3(ptr, val, mem)
6693 return true
6694 }
6695
6696
6697
6698 for {
6699 if auxIntToInt32(v.AuxInt) != 0 {
6700 break
6701 }
6702 sym := auxToSym(v.Aux)
6703 if v_0.Op != OpARMADD {
6704 break
6705 }
6706 idx := v_0.Args[1]
6707 ptr := v_0.Args[0]
6708 val := v_1
6709 mem := v_2
6710 if !(sym == nil) {
6711 break
6712 }
6713 v.reset(OpARMMOVWstoreidx)
6714 v.AddArg4(ptr, idx, val, mem)
6715 return true
6716 }
6717
6718
6719
6720 for {
6721 if auxIntToInt32(v.AuxInt) != 0 {
6722 break
6723 }
6724 sym := auxToSym(v.Aux)
6725 if v_0.Op != OpARMADDshiftLL {
6726 break
6727 }
6728 c := auxIntToInt32(v_0.AuxInt)
6729 idx := v_0.Args[1]
6730 ptr := v_0.Args[0]
6731 val := v_1
6732 mem := v_2
6733 if !(sym == nil) {
6734 break
6735 }
6736 v.reset(OpARMMOVWstoreshiftLL)
6737 v.AuxInt = int32ToAuxInt(c)
6738 v.AddArg4(ptr, idx, val, mem)
6739 return true
6740 }
6741
6742
6743
6744 for {
6745 if auxIntToInt32(v.AuxInt) != 0 {
6746 break
6747 }
6748 sym := auxToSym(v.Aux)
6749 if v_0.Op != OpARMADDshiftRL {
6750 break
6751 }
6752 c := auxIntToInt32(v_0.AuxInt)
6753 idx := v_0.Args[1]
6754 ptr := v_0.Args[0]
6755 val := v_1
6756 mem := v_2
6757 if !(sym == nil) {
6758 break
6759 }
6760 v.reset(OpARMMOVWstoreshiftRL)
6761 v.AuxInt = int32ToAuxInt(c)
6762 v.AddArg4(ptr, idx, val, mem)
6763 return true
6764 }
6765
6766
6767
6768 for {
6769 if auxIntToInt32(v.AuxInt) != 0 {
6770 break
6771 }
6772 sym := auxToSym(v.Aux)
6773 if v_0.Op != OpARMADDshiftRA {
6774 break
6775 }
6776 c := auxIntToInt32(v_0.AuxInt)
6777 idx := v_0.Args[1]
6778 ptr := v_0.Args[0]
6779 val := v_1
6780 mem := v_2
6781 if !(sym == nil) {
6782 break
6783 }
6784 v.reset(OpARMMOVWstoreshiftRA)
6785 v.AuxInt = int32ToAuxInt(c)
6786 v.AddArg4(ptr, idx, val, mem)
6787 return true
6788 }
6789 return false
6790 }
6791 func rewriteValueARM_OpARMMOVWstoreidx(v *Value) bool {
6792 v_3 := v.Args[3]
6793 v_2 := v.Args[2]
6794 v_1 := v.Args[1]
6795 v_0 := v.Args[0]
6796
6797
6798 for {
6799 ptr := v_0
6800 if v_1.Op != OpARMMOVWconst {
6801 break
6802 }
6803 c := auxIntToInt32(v_1.AuxInt)
6804 val := v_2
6805 mem := v_3
6806 v.reset(OpARMMOVWstore)
6807 v.AuxInt = int32ToAuxInt(c)
6808 v.AddArg3(ptr, val, mem)
6809 return true
6810 }
6811
6812
6813 for {
6814 if v_0.Op != OpARMMOVWconst {
6815 break
6816 }
6817 c := auxIntToInt32(v_0.AuxInt)
6818 ptr := v_1
6819 val := v_2
6820 mem := v_3
6821 v.reset(OpARMMOVWstore)
6822 v.AuxInt = int32ToAuxInt(c)
6823 v.AddArg3(ptr, val, mem)
6824 return true
6825 }
6826
6827
6828 for {
6829 ptr := v_0
6830 if v_1.Op != OpARMSLLconst {
6831 break
6832 }
6833 c := auxIntToInt32(v_1.AuxInt)
6834 idx := v_1.Args[0]
6835 val := v_2
6836 mem := v_3
6837 v.reset(OpARMMOVWstoreshiftLL)
6838 v.AuxInt = int32ToAuxInt(c)
6839 v.AddArg4(ptr, idx, val, mem)
6840 return true
6841 }
6842
6843
6844 for {
6845 if v_0.Op != OpARMSLLconst {
6846 break
6847 }
6848 c := auxIntToInt32(v_0.AuxInt)
6849 idx := v_0.Args[0]
6850 ptr := v_1
6851 val := v_2
6852 mem := v_3
6853 v.reset(OpARMMOVWstoreshiftLL)
6854 v.AuxInt = int32ToAuxInt(c)
6855 v.AddArg4(ptr, idx, val, mem)
6856 return true
6857 }
6858
6859
6860 for {
6861 ptr := v_0
6862 if v_1.Op != OpARMSRLconst {
6863 break
6864 }
6865 c := auxIntToInt32(v_1.AuxInt)
6866 idx := v_1.Args[0]
6867 val := v_2
6868 mem := v_3
6869 v.reset(OpARMMOVWstoreshiftRL)
6870 v.AuxInt = int32ToAuxInt(c)
6871 v.AddArg4(ptr, idx, val, mem)
6872 return true
6873 }
6874
6875
6876 for {
6877 if v_0.Op != OpARMSRLconst {
6878 break
6879 }
6880 c := auxIntToInt32(v_0.AuxInt)
6881 idx := v_0.Args[0]
6882 ptr := v_1
6883 val := v_2
6884 mem := v_3
6885 v.reset(OpARMMOVWstoreshiftRL)
6886 v.AuxInt = int32ToAuxInt(c)
6887 v.AddArg4(ptr, idx, val, mem)
6888 return true
6889 }
6890
6891
6892 for {
6893 ptr := v_0
6894 if v_1.Op != OpARMSRAconst {
6895 break
6896 }
6897 c := auxIntToInt32(v_1.AuxInt)
6898 idx := v_1.Args[0]
6899 val := v_2
6900 mem := v_3
6901 v.reset(OpARMMOVWstoreshiftRA)
6902 v.AuxInt = int32ToAuxInt(c)
6903 v.AddArg4(ptr, idx, val, mem)
6904 return true
6905 }
6906
6907
6908 for {
6909 if v_0.Op != OpARMSRAconst {
6910 break
6911 }
6912 c := auxIntToInt32(v_0.AuxInt)
6913 idx := v_0.Args[0]
6914 ptr := v_1
6915 val := v_2
6916 mem := v_3
6917 v.reset(OpARMMOVWstoreshiftRA)
6918 v.AuxInt = int32ToAuxInt(c)
6919 v.AddArg4(ptr, idx, val, mem)
6920 return true
6921 }
6922 return false
6923 }
6924 func rewriteValueARM_OpARMMOVWstoreshiftLL(v *Value) bool {
6925 v_3 := v.Args[3]
6926 v_2 := v.Args[2]
6927 v_1 := v.Args[1]
6928 v_0 := v.Args[0]
6929
6930
6931 for {
6932 d := auxIntToInt32(v.AuxInt)
6933 ptr := v_0
6934 if v_1.Op != OpARMMOVWconst {
6935 break
6936 }
6937 c := auxIntToInt32(v_1.AuxInt)
6938 val := v_2
6939 mem := v_3
6940 v.reset(OpARMMOVWstore)
6941 v.AuxInt = int32ToAuxInt(int32(uint32(c) << uint64(d)))
6942 v.AddArg3(ptr, val, mem)
6943 return true
6944 }
6945 return false
6946 }
6947 func rewriteValueARM_OpARMMOVWstoreshiftRA(v *Value) bool {
6948 v_3 := v.Args[3]
6949 v_2 := v.Args[2]
6950 v_1 := v.Args[1]
6951 v_0 := v.Args[0]
6952
6953
6954 for {
6955 d := auxIntToInt32(v.AuxInt)
6956 ptr := v_0
6957 if v_1.Op != OpARMMOVWconst {
6958 break
6959 }
6960 c := auxIntToInt32(v_1.AuxInt)
6961 val := v_2
6962 mem := v_3
6963 v.reset(OpARMMOVWstore)
6964 v.AuxInt = int32ToAuxInt(c >> uint64(d))
6965 v.AddArg3(ptr, val, mem)
6966 return true
6967 }
6968 return false
6969 }
6970 func rewriteValueARM_OpARMMOVWstoreshiftRL(v *Value) bool {
6971 v_3 := v.Args[3]
6972 v_2 := v.Args[2]
6973 v_1 := v.Args[1]
6974 v_0 := v.Args[0]
6975
6976
6977 for {
6978 d := auxIntToInt32(v.AuxInt)
6979 ptr := v_0
6980 if v_1.Op != OpARMMOVWconst {
6981 break
6982 }
6983 c := auxIntToInt32(v_1.AuxInt)
6984 val := v_2
6985 mem := v_3
6986 v.reset(OpARMMOVWstore)
6987 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
6988 v.AddArg3(ptr, val, mem)
6989 return true
6990 }
6991 return false
6992 }
6993 func rewriteValueARM_OpARMMUL(v *Value) bool {
6994 v_1 := v.Args[1]
6995 v_0 := v.Args[0]
6996 b := v.Block
6997
6998
6999
7000 for {
7001 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7002 x := v_0
7003 if v_1.Op != OpARMMOVWconst {
7004 continue
7005 }
7006 c := auxIntToInt32(v_1.AuxInt)
7007 if !(int32(c) == -1) {
7008 continue
7009 }
7010 v.reset(OpARMRSBconst)
7011 v.AuxInt = int32ToAuxInt(0)
7012 v.AddArg(x)
7013 return true
7014 }
7015 break
7016 }
7017
7018
7019 for {
7020 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7021 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 0 {
7022 continue
7023 }
7024 v.reset(OpARMMOVWconst)
7025 v.AuxInt = int32ToAuxInt(0)
7026 return true
7027 }
7028 break
7029 }
7030
7031
7032 for {
7033 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7034 x := v_0
7035 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 1 {
7036 continue
7037 }
7038 v.copyOf(x)
7039 return true
7040 }
7041 break
7042 }
7043
7044
7045
7046 for {
7047 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7048 x := v_0
7049 if v_1.Op != OpARMMOVWconst {
7050 continue
7051 }
7052 c := auxIntToInt32(v_1.AuxInt)
7053 if !(isPowerOfTwo(c)) {
7054 continue
7055 }
7056 v.reset(OpARMSLLconst)
7057 v.AuxInt = int32ToAuxInt(int32(log32(c)))
7058 v.AddArg(x)
7059 return true
7060 }
7061 break
7062 }
7063
7064
7065
7066 for {
7067 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7068 x := v_0
7069 if v_1.Op != OpARMMOVWconst {
7070 continue
7071 }
7072 c := auxIntToInt32(v_1.AuxInt)
7073 if !(isPowerOfTwo(c-1) && c >= 3) {
7074 continue
7075 }
7076 v.reset(OpARMADDshiftLL)
7077 v.AuxInt = int32ToAuxInt(int32(log32(c - 1)))
7078 v.AddArg2(x, x)
7079 return true
7080 }
7081 break
7082 }
7083
7084
7085
7086 for {
7087 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7088 x := v_0
7089 if v_1.Op != OpARMMOVWconst {
7090 continue
7091 }
7092 c := auxIntToInt32(v_1.AuxInt)
7093 if !(isPowerOfTwo(c+1) && c >= 7) {
7094 continue
7095 }
7096 v.reset(OpARMRSBshiftLL)
7097 v.AuxInt = int32ToAuxInt(int32(log32(c + 1)))
7098 v.AddArg2(x, x)
7099 return true
7100 }
7101 break
7102 }
7103
7104
7105
7106 for {
7107 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7108 x := v_0
7109 if v_1.Op != OpARMMOVWconst {
7110 continue
7111 }
7112 c := auxIntToInt32(v_1.AuxInt)
7113 if !(c%3 == 0 && isPowerOfTwo(c/3)) {
7114 continue
7115 }
7116 v.reset(OpARMSLLconst)
7117 v.AuxInt = int32ToAuxInt(int32(log32(c / 3)))
7118 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7119 v0.AuxInt = int32ToAuxInt(1)
7120 v0.AddArg2(x, x)
7121 v.AddArg(v0)
7122 return true
7123 }
7124 break
7125 }
7126
7127
7128
7129 for {
7130 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7131 x := v_0
7132 if v_1.Op != OpARMMOVWconst {
7133 continue
7134 }
7135 c := auxIntToInt32(v_1.AuxInt)
7136 if !(c%5 == 0 && isPowerOfTwo(c/5)) {
7137 continue
7138 }
7139 v.reset(OpARMSLLconst)
7140 v.AuxInt = int32ToAuxInt(int32(log32(c / 5)))
7141 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7142 v0.AuxInt = int32ToAuxInt(2)
7143 v0.AddArg2(x, x)
7144 v.AddArg(v0)
7145 return true
7146 }
7147 break
7148 }
7149
7150
7151
7152 for {
7153 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7154 x := v_0
7155 if v_1.Op != OpARMMOVWconst {
7156 continue
7157 }
7158 c := auxIntToInt32(v_1.AuxInt)
7159 if !(c%7 == 0 && isPowerOfTwo(c/7)) {
7160 continue
7161 }
7162 v.reset(OpARMSLLconst)
7163 v.AuxInt = int32ToAuxInt(int32(log32(c / 7)))
7164 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7165 v0.AuxInt = int32ToAuxInt(3)
7166 v0.AddArg2(x, x)
7167 v.AddArg(v0)
7168 return true
7169 }
7170 break
7171 }
7172
7173
7174
7175 for {
7176 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7177 x := v_0
7178 if v_1.Op != OpARMMOVWconst {
7179 continue
7180 }
7181 c := auxIntToInt32(v_1.AuxInt)
7182 if !(c%9 == 0 && isPowerOfTwo(c/9)) {
7183 continue
7184 }
7185 v.reset(OpARMSLLconst)
7186 v.AuxInt = int32ToAuxInt(int32(log32(c / 9)))
7187 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7188 v0.AuxInt = int32ToAuxInt(3)
7189 v0.AddArg2(x, x)
7190 v.AddArg(v0)
7191 return true
7192 }
7193 break
7194 }
7195
7196
7197 for {
7198 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7199 if v_0.Op != OpARMMOVWconst {
7200 continue
7201 }
7202 c := auxIntToInt32(v_0.AuxInt)
7203 if v_1.Op != OpARMMOVWconst {
7204 continue
7205 }
7206 d := auxIntToInt32(v_1.AuxInt)
7207 v.reset(OpARMMOVWconst)
7208 v.AuxInt = int32ToAuxInt(c * d)
7209 return true
7210 }
7211 break
7212 }
7213 return false
7214 }
7215 func rewriteValueARM_OpARMMULA(v *Value) bool {
7216 v_2 := v.Args[2]
7217 v_1 := v.Args[1]
7218 v_0 := v.Args[0]
7219 b := v.Block
7220
7221
7222
7223 for {
7224 x := v_0
7225 if v_1.Op != OpARMMOVWconst {
7226 break
7227 }
7228 c := auxIntToInt32(v_1.AuxInt)
7229 a := v_2
7230 if !(c == -1) {
7231 break
7232 }
7233 v.reset(OpARMSUB)
7234 v.AddArg2(a, x)
7235 return true
7236 }
7237
7238
7239 for {
7240 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 0 {
7241 break
7242 }
7243 a := v_2
7244 v.copyOf(a)
7245 return true
7246 }
7247
7248
7249 for {
7250 x := v_0
7251 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 1 {
7252 break
7253 }
7254 a := v_2
7255 v.reset(OpARMADD)
7256 v.AddArg2(x, a)
7257 return true
7258 }
7259
7260
7261
7262 for {
7263 x := v_0
7264 if v_1.Op != OpARMMOVWconst {
7265 break
7266 }
7267 c := auxIntToInt32(v_1.AuxInt)
7268 a := v_2
7269 if !(isPowerOfTwo(c)) {
7270 break
7271 }
7272 v.reset(OpARMADD)
7273 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7274 v0.AuxInt = int32ToAuxInt(int32(log32(c)))
7275 v0.AddArg(x)
7276 v.AddArg2(v0, a)
7277 return true
7278 }
7279
7280
7281
7282 for {
7283 x := v_0
7284 if v_1.Op != OpARMMOVWconst {
7285 break
7286 }
7287 c := auxIntToInt32(v_1.AuxInt)
7288 a := v_2
7289 if !(isPowerOfTwo(c-1) && c >= 3) {
7290 break
7291 }
7292 v.reset(OpARMADD)
7293 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7294 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1)))
7295 v0.AddArg2(x, x)
7296 v.AddArg2(v0, a)
7297 return true
7298 }
7299
7300
7301
7302 for {
7303 x := v_0
7304 if v_1.Op != OpARMMOVWconst {
7305 break
7306 }
7307 c := auxIntToInt32(v_1.AuxInt)
7308 a := v_2
7309 if !(isPowerOfTwo(c+1) && c >= 7) {
7310 break
7311 }
7312 v.reset(OpARMADD)
7313 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7314 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1)))
7315 v0.AddArg2(x, x)
7316 v.AddArg2(v0, a)
7317 return true
7318 }
7319
7320
7321
7322 for {
7323 x := v_0
7324 if v_1.Op != OpARMMOVWconst {
7325 break
7326 }
7327 c := auxIntToInt32(v_1.AuxInt)
7328 a := v_2
7329 if !(c%3 == 0 && isPowerOfTwo(c/3)) {
7330 break
7331 }
7332 v.reset(OpARMADD)
7333 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7334 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3)))
7335 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7336 v1.AuxInt = int32ToAuxInt(1)
7337 v1.AddArg2(x, x)
7338 v0.AddArg(v1)
7339 v.AddArg2(v0, a)
7340 return true
7341 }
7342
7343
7344
7345 for {
7346 x := v_0
7347 if v_1.Op != OpARMMOVWconst {
7348 break
7349 }
7350 c := auxIntToInt32(v_1.AuxInt)
7351 a := v_2
7352 if !(c%5 == 0 && isPowerOfTwo(c/5)) {
7353 break
7354 }
7355 v.reset(OpARMADD)
7356 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7357 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5)))
7358 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7359 v1.AuxInt = int32ToAuxInt(2)
7360 v1.AddArg2(x, x)
7361 v0.AddArg(v1)
7362 v.AddArg2(v0, a)
7363 return true
7364 }
7365
7366
7367
7368 for {
7369 x := v_0
7370 if v_1.Op != OpARMMOVWconst {
7371 break
7372 }
7373 c := auxIntToInt32(v_1.AuxInt)
7374 a := v_2
7375 if !(c%7 == 0 && isPowerOfTwo(c/7)) {
7376 break
7377 }
7378 v.reset(OpARMADD)
7379 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7380 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7)))
7381 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7382 v1.AuxInt = int32ToAuxInt(3)
7383 v1.AddArg2(x, x)
7384 v0.AddArg(v1)
7385 v.AddArg2(v0, a)
7386 return true
7387 }
7388
7389
7390
7391 for {
7392 x := v_0
7393 if v_1.Op != OpARMMOVWconst {
7394 break
7395 }
7396 c := auxIntToInt32(v_1.AuxInt)
7397 a := v_2
7398 if !(c%9 == 0 && isPowerOfTwo(c/9)) {
7399 break
7400 }
7401 v.reset(OpARMADD)
7402 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7403 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9)))
7404 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7405 v1.AuxInt = int32ToAuxInt(3)
7406 v1.AddArg2(x, x)
7407 v0.AddArg(v1)
7408 v.AddArg2(v0, a)
7409 return true
7410 }
7411
7412
7413
7414 for {
7415 if v_0.Op != OpARMMOVWconst {
7416 break
7417 }
7418 c := auxIntToInt32(v_0.AuxInt)
7419 x := v_1
7420 a := v_2
7421 if !(c == -1) {
7422 break
7423 }
7424 v.reset(OpARMSUB)
7425 v.AddArg2(a, x)
7426 return true
7427 }
7428
7429
7430 for {
7431 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 0 {
7432 break
7433 }
7434 a := v_2
7435 v.copyOf(a)
7436 return true
7437 }
7438
7439
7440 for {
7441 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 1 {
7442 break
7443 }
7444 x := v_1
7445 a := v_2
7446 v.reset(OpARMADD)
7447 v.AddArg2(x, a)
7448 return true
7449 }
7450
7451
7452
7453 for {
7454 if v_0.Op != OpARMMOVWconst {
7455 break
7456 }
7457 c := auxIntToInt32(v_0.AuxInt)
7458 x := v_1
7459 a := v_2
7460 if !(isPowerOfTwo(c)) {
7461 break
7462 }
7463 v.reset(OpARMADD)
7464 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7465 v0.AuxInt = int32ToAuxInt(int32(log32(c)))
7466 v0.AddArg(x)
7467 v.AddArg2(v0, a)
7468 return true
7469 }
7470
7471
7472
7473 for {
7474 if v_0.Op != OpARMMOVWconst {
7475 break
7476 }
7477 c := auxIntToInt32(v_0.AuxInt)
7478 x := v_1
7479 a := v_2
7480 if !(isPowerOfTwo(c-1) && c >= 3) {
7481 break
7482 }
7483 v.reset(OpARMADD)
7484 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7485 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1)))
7486 v0.AddArg2(x, x)
7487 v.AddArg2(v0, a)
7488 return true
7489 }
7490
7491
7492
7493 for {
7494 if v_0.Op != OpARMMOVWconst {
7495 break
7496 }
7497 c := auxIntToInt32(v_0.AuxInt)
7498 x := v_1
7499 a := v_2
7500 if !(isPowerOfTwo(c+1) && c >= 7) {
7501 break
7502 }
7503 v.reset(OpARMADD)
7504 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7505 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1)))
7506 v0.AddArg2(x, x)
7507 v.AddArg2(v0, a)
7508 return true
7509 }
7510
7511
7512
7513 for {
7514 if v_0.Op != OpARMMOVWconst {
7515 break
7516 }
7517 c := auxIntToInt32(v_0.AuxInt)
7518 x := v_1
7519 a := v_2
7520 if !(c%3 == 0 && isPowerOfTwo(c/3)) {
7521 break
7522 }
7523 v.reset(OpARMADD)
7524 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7525 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3)))
7526 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7527 v1.AuxInt = int32ToAuxInt(1)
7528 v1.AddArg2(x, x)
7529 v0.AddArg(v1)
7530 v.AddArg2(v0, a)
7531 return true
7532 }
7533
7534
7535
7536 for {
7537 if v_0.Op != OpARMMOVWconst {
7538 break
7539 }
7540 c := auxIntToInt32(v_0.AuxInt)
7541 x := v_1
7542 a := v_2
7543 if !(c%5 == 0 && isPowerOfTwo(c/5)) {
7544 break
7545 }
7546 v.reset(OpARMADD)
7547 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7548 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5)))
7549 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7550 v1.AuxInt = int32ToAuxInt(2)
7551 v1.AddArg2(x, x)
7552 v0.AddArg(v1)
7553 v.AddArg2(v0, a)
7554 return true
7555 }
7556
7557
7558
7559 for {
7560 if v_0.Op != OpARMMOVWconst {
7561 break
7562 }
7563 c := auxIntToInt32(v_0.AuxInt)
7564 x := v_1
7565 a := v_2
7566 if !(c%7 == 0 && isPowerOfTwo(c/7)) {
7567 break
7568 }
7569 v.reset(OpARMADD)
7570 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7571 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7)))
7572 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7573 v1.AuxInt = int32ToAuxInt(3)
7574 v1.AddArg2(x, x)
7575 v0.AddArg(v1)
7576 v.AddArg2(v0, a)
7577 return true
7578 }
7579
7580
7581
7582 for {
7583 if v_0.Op != OpARMMOVWconst {
7584 break
7585 }
7586 c := auxIntToInt32(v_0.AuxInt)
7587 x := v_1
7588 a := v_2
7589 if !(c%9 == 0 && isPowerOfTwo(c/9)) {
7590 break
7591 }
7592 v.reset(OpARMADD)
7593 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7594 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9)))
7595 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7596 v1.AuxInt = int32ToAuxInt(3)
7597 v1.AddArg2(x, x)
7598 v0.AddArg(v1)
7599 v.AddArg2(v0, a)
7600 return true
7601 }
7602
7603
7604 for {
7605 if v_0.Op != OpARMMOVWconst {
7606 break
7607 }
7608 c := auxIntToInt32(v_0.AuxInt)
7609 if v_1.Op != OpARMMOVWconst {
7610 break
7611 }
7612 d := auxIntToInt32(v_1.AuxInt)
7613 a := v_2
7614 v.reset(OpARMADDconst)
7615 v.AuxInt = int32ToAuxInt(c * d)
7616 v.AddArg(a)
7617 return true
7618 }
7619 return false
7620 }
7621 func rewriteValueARM_OpARMMULD(v *Value) bool {
7622 v_1 := v.Args[1]
7623 v_0 := v.Args[0]
7624
7625
7626
7627 for {
7628 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7629 if v_0.Op != OpARMNEGD {
7630 continue
7631 }
7632 x := v_0.Args[0]
7633 y := v_1
7634 if !(buildcfg.GOARM.Version >= 6) {
7635 continue
7636 }
7637 v.reset(OpARMNMULD)
7638 v.AddArg2(x, y)
7639 return true
7640 }
7641 break
7642 }
7643 return false
7644 }
7645 func rewriteValueARM_OpARMMULF(v *Value) bool {
7646 v_1 := v.Args[1]
7647 v_0 := v.Args[0]
7648
7649
7650
7651 for {
7652 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7653 if v_0.Op != OpARMNEGF {
7654 continue
7655 }
7656 x := v_0.Args[0]
7657 y := v_1
7658 if !(buildcfg.GOARM.Version >= 6) {
7659 continue
7660 }
7661 v.reset(OpARMNMULF)
7662 v.AddArg2(x, y)
7663 return true
7664 }
7665 break
7666 }
7667 return false
7668 }
7669 func rewriteValueARM_OpARMMULS(v *Value) bool {
7670 v_2 := v.Args[2]
7671 v_1 := v.Args[1]
7672 v_0 := v.Args[0]
7673 b := v.Block
7674
7675
7676
7677 for {
7678 x := v_0
7679 if v_1.Op != OpARMMOVWconst {
7680 break
7681 }
7682 c := auxIntToInt32(v_1.AuxInt)
7683 a := v_2
7684 if !(c == -1) {
7685 break
7686 }
7687 v.reset(OpARMADD)
7688 v.AddArg2(a, x)
7689 return true
7690 }
7691
7692
7693 for {
7694 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 0 {
7695 break
7696 }
7697 a := v_2
7698 v.copyOf(a)
7699 return true
7700 }
7701
7702
7703 for {
7704 x := v_0
7705 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 1 {
7706 break
7707 }
7708 a := v_2
7709 v.reset(OpARMRSB)
7710 v.AddArg2(x, a)
7711 return true
7712 }
7713
7714
7715
7716 for {
7717 x := v_0
7718 if v_1.Op != OpARMMOVWconst {
7719 break
7720 }
7721 c := auxIntToInt32(v_1.AuxInt)
7722 a := v_2
7723 if !(isPowerOfTwo(c)) {
7724 break
7725 }
7726 v.reset(OpARMRSB)
7727 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7728 v0.AuxInt = int32ToAuxInt(int32(log32(c)))
7729 v0.AddArg(x)
7730 v.AddArg2(v0, a)
7731 return true
7732 }
7733
7734
7735
7736 for {
7737 x := v_0
7738 if v_1.Op != OpARMMOVWconst {
7739 break
7740 }
7741 c := auxIntToInt32(v_1.AuxInt)
7742 a := v_2
7743 if !(isPowerOfTwo(c-1) && c >= 3) {
7744 break
7745 }
7746 v.reset(OpARMRSB)
7747 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7748 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1)))
7749 v0.AddArg2(x, x)
7750 v.AddArg2(v0, a)
7751 return true
7752 }
7753
7754
7755
7756 for {
7757 x := v_0
7758 if v_1.Op != OpARMMOVWconst {
7759 break
7760 }
7761 c := auxIntToInt32(v_1.AuxInt)
7762 a := v_2
7763 if !(isPowerOfTwo(c+1) && c >= 7) {
7764 break
7765 }
7766 v.reset(OpARMRSB)
7767 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7768 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1)))
7769 v0.AddArg2(x, x)
7770 v.AddArg2(v0, a)
7771 return true
7772 }
7773
7774
7775
7776 for {
7777 x := v_0
7778 if v_1.Op != OpARMMOVWconst {
7779 break
7780 }
7781 c := auxIntToInt32(v_1.AuxInt)
7782 a := v_2
7783 if !(c%3 == 0 && isPowerOfTwo(c/3)) {
7784 break
7785 }
7786 v.reset(OpARMRSB)
7787 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7788 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3)))
7789 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7790 v1.AuxInt = int32ToAuxInt(1)
7791 v1.AddArg2(x, x)
7792 v0.AddArg(v1)
7793 v.AddArg2(v0, a)
7794 return true
7795 }
7796
7797
7798
7799 for {
7800 x := v_0
7801 if v_1.Op != OpARMMOVWconst {
7802 break
7803 }
7804 c := auxIntToInt32(v_1.AuxInt)
7805 a := v_2
7806 if !(c%5 == 0 && isPowerOfTwo(c/5)) {
7807 break
7808 }
7809 v.reset(OpARMRSB)
7810 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7811 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5)))
7812 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7813 v1.AuxInt = int32ToAuxInt(2)
7814 v1.AddArg2(x, x)
7815 v0.AddArg(v1)
7816 v.AddArg2(v0, a)
7817 return true
7818 }
7819
7820
7821
7822 for {
7823 x := v_0
7824 if v_1.Op != OpARMMOVWconst {
7825 break
7826 }
7827 c := auxIntToInt32(v_1.AuxInt)
7828 a := v_2
7829 if !(c%7 == 0 && isPowerOfTwo(c/7)) {
7830 break
7831 }
7832 v.reset(OpARMRSB)
7833 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7834 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7)))
7835 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7836 v1.AuxInt = int32ToAuxInt(3)
7837 v1.AddArg2(x, x)
7838 v0.AddArg(v1)
7839 v.AddArg2(v0, a)
7840 return true
7841 }
7842
7843
7844
7845 for {
7846 x := v_0
7847 if v_1.Op != OpARMMOVWconst {
7848 break
7849 }
7850 c := auxIntToInt32(v_1.AuxInt)
7851 a := v_2
7852 if !(c%9 == 0 && isPowerOfTwo(c/9)) {
7853 break
7854 }
7855 v.reset(OpARMRSB)
7856 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7857 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9)))
7858 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7859 v1.AuxInt = int32ToAuxInt(3)
7860 v1.AddArg2(x, x)
7861 v0.AddArg(v1)
7862 v.AddArg2(v0, a)
7863 return true
7864 }
7865
7866
7867
7868 for {
7869 if v_0.Op != OpARMMOVWconst {
7870 break
7871 }
7872 c := auxIntToInt32(v_0.AuxInt)
7873 x := v_1
7874 a := v_2
7875 if !(c == -1) {
7876 break
7877 }
7878 v.reset(OpARMADD)
7879 v.AddArg2(a, x)
7880 return true
7881 }
7882
7883
7884 for {
7885 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 0 {
7886 break
7887 }
7888 a := v_2
7889 v.copyOf(a)
7890 return true
7891 }
7892
7893
7894 for {
7895 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 1 {
7896 break
7897 }
7898 x := v_1
7899 a := v_2
7900 v.reset(OpARMRSB)
7901 v.AddArg2(x, a)
7902 return true
7903 }
7904
7905
7906
7907 for {
7908 if v_0.Op != OpARMMOVWconst {
7909 break
7910 }
7911 c := auxIntToInt32(v_0.AuxInt)
7912 x := v_1
7913 a := v_2
7914 if !(isPowerOfTwo(c)) {
7915 break
7916 }
7917 v.reset(OpARMRSB)
7918 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7919 v0.AuxInt = int32ToAuxInt(int32(log32(c)))
7920 v0.AddArg(x)
7921 v.AddArg2(v0, a)
7922 return true
7923 }
7924
7925
7926
7927 for {
7928 if v_0.Op != OpARMMOVWconst {
7929 break
7930 }
7931 c := auxIntToInt32(v_0.AuxInt)
7932 x := v_1
7933 a := v_2
7934 if !(isPowerOfTwo(c-1) && c >= 3) {
7935 break
7936 }
7937 v.reset(OpARMRSB)
7938 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7939 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1)))
7940 v0.AddArg2(x, x)
7941 v.AddArg2(v0, a)
7942 return true
7943 }
7944
7945
7946
7947 for {
7948 if v_0.Op != OpARMMOVWconst {
7949 break
7950 }
7951 c := auxIntToInt32(v_0.AuxInt)
7952 x := v_1
7953 a := v_2
7954 if !(isPowerOfTwo(c+1) && c >= 7) {
7955 break
7956 }
7957 v.reset(OpARMRSB)
7958 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7959 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1)))
7960 v0.AddArg2(x, x)
7961 v.AddArg2(v0, a)
7962 return true
7963 }
7964
7965
7966
7967 for {
7968 if v_0.Op != OpARMMOVWconst {
7969 break
7970 }
7971 c := auxIntToInt32(v_0.AuxInt)
7972 x := v_1
7973 a := v_2
7974 if !(c%3 == 0 && isPowerOfTwo(c/3)) {
7975 break
7976 }
7977 v.reset(OpARMRSB)
7978 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7979 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3)))
7980 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7981 v1.AuxInt = int32ToAuxInt(1)
7982 v1.AddArg2(x, x)
7983 v0.AddArg(v1)
7984 v.AddArg2(v0, a)
7985 return true
7986 }
7987
7988
7989
7990 for {
7991 if v_0.Op != OpARMMOVWconst {
7992 break
7993 }
7994 c := auxIntToInt32(v_0.AuxInt)
7995 x := v_1
7996 a := v_2
7997 if !(c%5 == 0 && isPowerOfTwo(c/5)) {
7998 break
7999 }
8000 v.reset(OpARMRSB)
8001 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
8002 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5)))
8003 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
8004 v1.AuxInt = int32ToAuxInt(2)
8005 v1.AddArg2(x, x)
8006 v0.AddArg(v1)
8007 v.AddArg2(v0, a)
8008 return true
8009 }
8010
8011
8012
8013 for {
8014 if v_0.Op != OpARMMOVWconst {
8015 break
8016 }
8017 c := auxIntToInt32(v_0.AuxInt)
8018 x := v_1
8019 a := v_2
8020 if !(c%7 == 0 && isPowerOfTwo(c/7)) {
8021 break
8022 }
8023 v.reset(OpARMRSB)
8024 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
8025 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7)))
8026 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
8027 v1.AuxInt = int32ToAuxInt(3)
8028 v1.AddArg2(x, x)
8029 v0.AddArg(v1)
8030 v.AddArg2(v0, a)
8031 return true
8032 }
8033
8034
8035
8036 for {
8037 if v_0.Op != OpARMMOVWconst {
8038 break
8039 }
8040 c := auxIntToInt32(v_0.AuxInt)
8041 x := v_1
8042 a := v_2
8043 if !(c%9 == 0 && isPowerOfTwo(c/9)) {
8044 break
8045 }
8046 v.reset(OpARMRSB)
8047 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
8048 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9)))
8049 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
8050 v1.AuxInt = int32ToAuxInt(3)
8051 v1.AddArg2(x, x)
8052 v0.AddArg(v1)
8053 v.AddArg2(v0, a)
8054 return true
8055 }
8056
8057
8058 for {
8059 if v_0.Op != OpARMMOVWconst {
8060 break
8061 }
8062 c := auxIntToInt32(v_0.AuxInt)
8063 if v_1.Op != OpARMMOVWconst {
8064 break
8065 }
8066 d := auxIntToInt32(v_1.AuxInt)
8067 a := v_2
8068 v.reset(OpARMSUBconst)
8069 v.AuxInt = int32ToAuxInt(c * d)
8070 v.AddArg(a)
8071 return true
8072 }
8073 return false
8074 }
8075 func rewriteValueARM_OpARMMVN(v *Value) bool {
8076 v_0 := v.Args[0]
8077
8078
8079 for {
8080 if v_0.Op != OpARMMOVWconst {
8081 break
8082 }
8083 c := auxIntToInt32(v_0.AuxInt)
8084 v.reset(OpARMMOVWconst)
8085 v.AuxInt = int32ToAuxInt(^c)
8086 return true
8087 }
8088
8089
8090 for {
8091 if v_0.Op != OpARMSLLconst {
8092 break
8093 }
8094 c := auxIntToInt32(v_0.AuxInt)
8095 x := v_0.Args[0]
8096 v.reset(OpARMMVNshiftLL)
8097 v.AuxInt = int32ToAuxInt(c)
8098 v.AddArg(x)
8099 return true
8100 }
8101
8102
8103 for {
8104 if v_0.Op != OpARMSRLconst {
8105 break
8106 }
8107 c := auxIntToInt32(v_0.AuxInt)
8108 x := v_0.Args[0]
8109 v.reset(OpARMMVNshiftRL)
8110 v.AuxInt = int32ToAuxInt(c)
8111 v.AddArg(x)
8112 return true
8113 }
8114
8115
8116 for {
8117 if v_0.Op != OpARMSRAconst {
8118 break
8119 }
8120 c := auxIntToInt32(v_0.AuxInt)
8121 x := v_0.Args[0]
8122 v.reset(OpARMMVNshiftRA)
8123 v.AuxInt = int32ToAuxInt(c)
8124 v.AddArg(x)
8125 return true
8126 }
8127
8128
8129 for {
8130 if v_0.Op != OpARMSLL {
8131 break
8132 }
8133 y := v_0.Args[1]
8134 x := v_0.Args[0]
8135 v.reset(OpARMMVNshiftLLreg)
8136 v.AddArg2(x, y)
8137 return true
8138 }
8139
8140
8141 for {
8142 if v_0.Op != OpARMSRL {
8143 break
8144 }
8145 y := v_0.Args[1]
8146 x := v_0.Args[0]
8147 v.reset(OpARMMVNshiftRLreg)
8148 v.AddArg2(x, y)
8149 return true
8150 }
8151
8152
8153 for {
8154 if v_0.Op != OpARMSRA {
8155 break
8156 }
8157 y := v_0.Args[1]
8158 x := v_0.Args[0]
8159 v.reset(OpARMMVNshiftRAreg)
8160 v.AddArg2(x, y)
8161 return true
8162 }
8163 return false
8164 }
8165 func rewriteValueARM_OpARMMVNshiftLL(v *Value) bool {
8166 v_0 := v.Args[0]
8167
8168
8169 for {
8170 d := auxIntToInt32(v.AuxInt)
8171 if v_0.Op != OpARMMOVWconst {
8172 break
8173 }
8174 c := auxIntToInt32(v_0.AuxInt)
8175 v.reset(OpARMMOVWconst)
8176 v.AuxInt = int32ToAuxInt(^(c << uint64(d)))
8177 return true
8178 }
8179 return false
8180 }
8181 func rewriteValueARM_OpARMMVNshiftLLreg(v *Value) bool {
8182 v_1 := v.Args[1]
8183 v_0 := v.Args[0]
8184
8185
8186
8187 for {
8188 x := v_0
8189 if v_1.Op != OpARMMOVWconst {
8190 break
8191 }
8192 c := auxIntToInt32(v_1.AuxInt)
8193 if !(0 <= c && c < 32) {
8194 break
8195 }
8196 v.reset(OpARMMVNshiftLL)
8197 v.AuxInt = int32ToAuxInt(c)
8198 v.AddArg(x)
8199 return true
8200 }
8201 return false
8202 }
8203 func rewriteValueARM_OpARMMVNshiftRA(v *Value) bool {
8204 v_0 := v.Args[0]
8205
8206
8207 for {
8208 d := auxIntToInt32(v.AuxInt)
8209 if v_0.Op != OpARMMOVWconst {
8210 break
8211 }
8212 c := auxIntToInt32(v_0.AuxInt)
8213 v.reset(OpARMMOVWconst)
8214 v.AuxInt = int32ToAuxInt(int32(c) >> uint64(d))
8215 return true
8216 }
8217 return false
8218 }
8219 func rewriteValueARM_OpARMMVNshiftRAreg(v *Value) bool {
8220 v_1 := v.Args[1]
8221 v_0 := v.Args[0]
8222
8223
8224
8225 for {
8226 x := v_0
8227 if v_1.Op != OpARMMOVWconst {
8228 break
8229 }
8230 c := auxIntToInt32(v_1.AuxInt)
8231 if !(0 <= c && c < 32) {
8232 break
8233 }
8234 v.reset(OpARMMVNshiftRA)
8235 v.AuxInt = int32ToAuxInt(c)
8236 v.AddArg(x)
8237 return true
8238 }
8239 return false
8240 }
8241 func rewriteValueARM_OpARMMVNshiftRL(v *Value) bool {
8242 v_0 := v.Args[0]
8243
8244
8245 for {
8246 d := auxIntToInt32(v.AuxInt)
8247 if v_0.Op != OpARMMOVWconst {
8248 break
8249 }
8250 c := auxIntToInt32(v_0.AuxInt)
8251 v.reset(OpARMMOVWconst)
8252 v.AuxInt = int32ToAuxInt(^int32(uint32(c) >> uint64(d)))
8253 return true
8254 }
8255 return false
8256 }
8257 func rewriteValueARM_OpARMMVNshiftRLreg(v *Value) bool {
8258 v_1 := v.Args[1]
8259 v_0 := v.Args[0]
8260
8261
8262
8263 for {
8264 x := v_0
8265 if v_1.Op != OpARMMOVWconst {
8266 break
8267 }
8268 c := auxIntToInt32(v_1.AuxInt)
8269 if !(0 <= c && c < 32) {
8270 break
8271 }
8272 v.reset(OpARMMVNshiftRL)
8273 v.AuxInt = int32ToAuxInt(c)
8274 v.AddArg(x)
8275 return true
8276 }
8277 return false
8278 }
8279 func rewriteValueARM_OpARMNEGD(v *Value) bool {
8280 v_0 := v.Args[0]
8281
8282
8283
8284 for {
8285 if v_0.Op != OpARMMULD {
8286 break
8287 }
8288 y := v_0.Args[1]
8289 x := v_0.Args[0]
8290 if !(buildcfg.GOARM.Version >= 6) {
8291 break
8292 }
8293 v.reset(OpARMNMULD)
8294 v.AddArg2(x, y)
8295 return true
8296 }
8297 return false
8298 }
8299 func rewriteValueARM_OpARMNEGF(v *Value) bool {
8300 v_0 := v.Args[0]
8301
8302
8303
8304 for {
8305 if v_0.Op != OpARMMULF {
8306 break
8307 }
8308 y := v_0.Args[1]
8309 x := v_0.Args[0]
8310 if !(buildcfg.GOARM.Version >= 6) {
8311 break
8312 }
8313 v.reset(OpARMNMULF)
8314 v.AddArg2(x, y)
8315 return true
8316 }
8317 return false
8318 }
8319 func rewriteValueARM_OpARMNMULD(v *Value) bool {
8320 v_1 := v.Args[1]
8321 v_0 := v.Args[0]
8322
8323
8324 for {
8325 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8326 if v_0.Op != OpARMNEGD {
8327 continue
8328 }
8329 x := v_0.Args[0]
8330 y := v_1
8331 v.reset(OpARMMULD)
8332 v.AddArg2(x, y)
8333 return true
8334 }
8335 break
8336 }
8337 return false
8338 }
8339 func rewriteValueARM_OpARMNMULF(v *Value) bool {
8340 v_1 := v.Args[1]
8341 v_0 := v.Args[0]
8342
8343
8344 for {
8345 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8346 if v_0.Op != OpARMNEGF {
8347 continue
8348 }
8349 x := v_0.Args[0]
8350 y := v_1
8351 v.reset(OpARMMULF)
8352 v.AddArg2(x, y)
8353 return true
8354 }
8355 break
8356 }
8357 return false
8358 }
8359 func rewriteValueARM_OpARMNotEqual(v *Value) bool {
8360 v_0 := v.Args[0]
8361
8362
8363 for {
8364 if v_0.Op != OpARMFlagConstant {
8365 break
8366 }
8367 fc := auxIntToFlagConstant(v_0.AuxInt)
8368 v.reset(OpARMMOVWconst)
8369 v.AuxInt = int32ToAuxInt(b2i32(fc.ne()))
8370 return true
8371 }
8372
8373
8374 for {
8375 if v_0.Op != OpARMInvertFlags {
8376 break
8377 }
8378 x := v_0.Args[0]
8379 v.reset(OpARMNotEqual)
8380 v.AddArg(x)
8381 return true
8382 }
8383 return false
8384 }
8385 func rewriteValueARM_OpARMOR(v *Value) bool {
8386 v_1 := v.Args[1]
8387 v_0 := v.Args[0]
8388
8389
8390 for {
8391 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8392 x := v_0
8393 if v_1.Op != OpARMMOVWconst {
8394 continue
8395 }
8396 c := auxIntToInt32(v_1.AuxInt)
8397 v.reset(OpARMORconst)
8398 v.AuxInt = int32ToAuxInt(c)
8399 v.AddArg(x)
8400 return true
8401 }
8402 break
8403 }
8404
8405
8406 for {
8407 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8408 x := v_0
8409 if v_1.Op != OpARMSLLconst {
8410 continue
8411 }
8412 c := auxIntToInt32(v_1.AuxInt)
8413 y := v_1.Args[0]
8414 v.reset(OpARMORshiftLL)
8415 v.AuxInt = int32ToAuxInt(c)
8416 v.AddArg2(x, y)
8417 return true
8418 }
8419 break
8420 }
8421
8422
8423 for {
8424 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8425 x := v_0
8426 if v_1.Op != OpARMSRLconst {
8427 continue
8428 }
8429 c := auxIntToInt32(v_1.AuxInt)
8430 y := v_1.Args[0]
8431 v.reset(OpARMORshiftRL)
8432 v.AuxInt = int32ToAuxInt(c)
8433 v.AddArg2(x, y)
8434 return true
8435 }
8436 break
8437 }
8438
8439
8440 for {
8441 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8442 x := v_0
8443 if v_1.Op != OpARMSRAconst {
8444 continue
8445 }
8446 c := auxIntToInt32(v_1.AuxInt)
8447 y := v_1.Args[0]
8448 v.reset(OpARMORshiftRA)
8449 v.AuxInt = int32ToAuxInt(c)
8450 v.AddArg2(x, y)
8451 return true
8452 }
8453 break
8454 }
8455
8456
8457 for {
8458 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8459 x := v_0
8460 if v_1.Op != OpARMSLL {
8461 continue
8462 }
8463 z := v_1.Args[1]
8464 y := v_1.Args[0]
8465 v.reset(OpARMORshiftLLreg)
8466 v.AddArg3(x, y, z)
8467 return true
8468 }
8469 break
8470 }
8471
8472
8473 for {
8474 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8475 x := v_0
8476 if v_1.Op != OpARMSRL {
8477 continue
8478 }
8479 z := v_1.Args[1]
8480 y := v_1.Args[0]
8481 v.reset(OpARMORshiftRLreg)
8482 v.AddArg3(x, y, z)
8483 return true
8484 }
8485 break
8486 }
8487
8488
8489 for {
8490 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8491 x := v_0
8492 if v_1.Op != OpARMSRA {
8493 continue
8494 }
8495 z := v_1.Args[1]
8496 y := v_1.Args[0]
8497 v.reset(OpARMORshiftRAreg)
8498 v.AddArg3(x, y, z)
8499 return true
8500 }
8501 break
8502 }
8503
8504
8505 for {
8506 x := v_0
8507 if x != v_1 {
8508 break
8509 }
8510 v.copyOf(x)
8511 return true
8512 }
8513 return false
8514 }
8515 func rewriteValueARM_OpARMORconst(v *Value) bool {
8516 v_0 := v.Args[0]
8517
8518
8519 for {
8520 if auxIntToInt32(v.AuxInt) != 0 {
8521 break
8522 }
8523 x := v_0
8524 v.copyOf(x)
8525 return true
8526 }
8527
8528
8529
8530 for {
8531 c := auxIntToInt32(v.AuxInt)
8532 if !(int32(c) == -1) {
8533 break
8534 }
8535 v.reset(OpARMMOVWconst)
8536 v.AuxInt = int32ToAuxInt(-1)
8537 return true
8538 }
8539
8540
8541 for {
8542 c := auxIntToInt32(v.AuxInt)
8543 if v_0.Op != OpARMMOVWconst {
8544 break
8545 }
8546 d := auxIntToInt32(v_0.AuxInt)
8547 v.reset(OpARMMOVWconst)
8548 v.AuxInt = int32ToAuxInt(c | d)
8549 return true
8550 }
8551
8552
8553 for {
8554 c := auxIntToInt32(v.AuxInt)
8555 if v_0.Op != OpARMORconst {
8556 break
8557 }
8558 d := auxIntToInt32(v_0.AuxInt)
8559 x := v_0.Args[0]
8560 v.reset(OpARMORconst)
8561 v.AuxInt = int32ToAuxInt(c | d)
8562 v.AddArg(x)
8563 return true
8564 }
8565 return false
8566 }
8567 func rewriteValueARM_OpARMORshiftLL(v *Value) bool {
8568 v_1 := v.Args[1]
8569 v_0 := v.Args[0]
8570 b := v.Block
8571 typ := &b.Func.Config.Types
8572
8573
8574 for {
8575 d := auxIntToInt32(v.AuxInt)
8576 if v_0.Op != OpARMMOVWconst {
8577 break
8578 }
8579 c := auxIntToInt32(v_0.AuxInt)
8580 x := v_1
8581 v.reset(OpARMORconst)
8582 v.AuxInt = int32ToAuxInt(c)
8583 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
8584 v0.AuxInt = int32ToAuxInt(d)
8585 v0.AddArg(x)
8586 v.AddArg(v0)
8587 return true
8588 }
8589
8590
8591 for {
8592 d := auxIntToInt32(v.AuxInt)
8593 x := v_0
8594 if v_1.Op != OpARMMOVWconst {
8595 break
8596 }
8597 c := auxIntToInt32(v_1.AuxInt)
8598 v.reset(OpARMORconst)
8599 v.AuxInt = int32ToAuxInt(c << uint64(d))
8600 v.AddArg(x)
8601 return true
8602 }
8603
8604
8605 for {
8606 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMBFXU || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != int32(armBFAuxInt(8, 8)) {
8607 break
8608 }
8609 x := v_0.Args[0]
8610 if x != v_1 {
8611 break
8612 }
8613 v.reset(OpARMREV16)
8614 v.AddArg(x)
8615 return true
8616 }
8617
8618
8619
8620 for {
8621 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMSRLconst || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != 24 {
8622 break
8623 }
8624 v_0_0 := v_0.Args[0]
8625 if v_0_0.Op != OpARMSLLconst || auxIntToInt32(v_0_0.AuxInt) != 16 {
8626 break
8627 }
8628 x := v_0_0.Args[0]
8629 if x != v_1 || !(buildcfg.GOARM.Version >= 6) {
8630 break
8631 }
8632 v.reset(OpARMREV16)
8633 v.AddArg(x)
8634 return true
8635 }
8636
8637
8638 for {
8639 c := auxIntToInt32(v.AuxInt)
8640 y := v_0
8641 if y.Op != OpARMSLLconst || auxIntToInt32(y.AuxInt) != c {
8642 break
8643 }
8644 x := y.Args[0]
8645 if x != v_1 {
8646 break
8647 }
8648 v.copyOf(y)
8649 return true
8650 }
8651 return false
8652 }
8653 func rewriteValueARM_OpARMORshiftLLreg(v *Value) bool {
8654 v_2 := v.Args[2]
8655 v_1 := v.Args[1]
8656 v_0 := v.Args[0]
8657 b := v.Block
8658
8659
8660 for {
8661 if v_0.Op != OpARMMOVWconst {
8662 break
8663 }
8664 c := auxIntToInt32(v_0.AuxInt)
8665 x := v_1
8666 y := v_2
8667 v.reset(OpARMORconst)
8668 v.AuxInt = int32ToAuxInt(c)
8669 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
8670 v0.AddArg2(x, y)
8671 v.AddArg(v0)
8672 return true
8673 }
8674
8675
8676
8677 for {
8678 x := v_0
8679 y := v_1
8680 if v_2.Op != OpARMMOVWconst {
8681 break
8682 }
8683 c := auxIntToInt32(v_2.AuxInt)
8684 if !(0 <= c && c < 32) {
8685 break
8686 }
8687 v.reset(OpARMORshiftLL)
8688 v.AuxInt = int32ToAuxInt(c)
8689 v.AddArg2(x, y)
8690 return true
8691 }
8692 return false
8693 }
8694 func rewriteValueARM_OpARMORshiftRA(v *Value) bool {
8695 v_1 := v.Args[1]
8696 v_0 := v.Args[0]
8697 b := v.Block
8698
8699
8700 for {
8701 d := auxIntToInt32(v.AuxInt)
8702 if v_0.Op != OpARMMOVWconst {
8703 break
8704 }
8705 c := auxIntToInt32(v_0.AuxInt)
8706 x := v_1
8707 v.reset(OpARMORconst)
8708 v.AuxInt = int32ToAuxInt(c)
8709 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
8710 v0.AuxInt = int32ToAuxInt(d)
8711 v0.AddArg(x)
8712 v.AddArg(v0)
8713 return true
8714 }
8715
8716
8717 for {
8718 d := auxIntToInt32(v.AuxInt)
8719 x := v_0
8720 if v_1.Op != OpARMMOVWconst {
8721 break
8722 }
8723 c := auxIntToInt32(v_1.AuxInt)
8724 v.reset(OpARMORconst)
8725 v.AuxInt = int32ToAuxInt(c >> uint64(d))
8726 v.AddArg(x)
8727 return true
8728 }
8729
8730
8731 for {
8732 c := auxIntToInt32(v.AuxInt)
8733 y := v_0
8734 if y.Op != OpARMSRAconst || auxIntToInt32(y.AuxInt) != c {
8735 break
8736 }
8737 x := y.Args[0]
8738 if x != v_1 {
8739 break
8740 }
8741 v.copyOf(y)
8742 return true
8743 }
8744 return false
8745 }
8746 func rewriteValueARM_OpARMORshiftRAreg(v *Value) bool {
8747 v_2 := v.Args[2]
8748 v_1 := v.Args[1]
8749 v_0 := v.Args[0]
8750 b := v.Block
8751
8752
8753 for {
8754 if v_0.Op != OpARMMOVWconst {
8755 break
8756 }
8757 c := auxIntToInt32(v_0.AuxInt)
8758 x := v_1
8759 y := v_2
8760 v.reset(OpARMORconst)
8761 v.AuxInt = int32ToAuxInt(c)
8762 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
8763 v0.AddArg2(x, y)
8764 v.AddArg(v0)
8765 return true
8766 }
8767
8768
8769
8770 for {
8771 x := v_0
8772 y := v_1
8773 if v_2.Op != OpARMMOVWconst {
8774 break
8775 }
8776 c := auxIntToInt32(v_2.AuxInt)
8777 if !(0 <= c && c < 32) {
8778 break
8779 }
8780 v.reset(OpARMORshiftRA)
8781 v.AuxInt = int32ToAuxInt(c)
8782 v.AddArg2(x, y)
8783 return true
8784 }
8785 return false
8786 }
8787 func rewriteValueARM_OpARMORshiftRL(v *Value) bool {
8788 v_1 := v.Args[1]
8789 v_0 := v.Args[0]
8790 b := v.Block
8791
8792
8793 for {
8794 d := auxIntToInt32(v.AuxInt)
8795 if v_0.Op != OpARMMOVWconst {
8796 break
8797 }
8798 c := auxIntToInt32(v_0.AuxInt)
8799 x := v_1
8800 v.reset(OpARMORconst)
8801 v.AuxInt = int32ToAuxInt(c)
8802 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
8803 v0.AuxInt = int32ToAuxInt(d)
8804 v0.AddArg(x)
8805 v.AddArg(v0)
8806 return true
8807 }
8808
8809
8810 for {
8811 d := auxIntToInt32(v.AuxInt)
8812 x := v_0
8813 if v_1.Op != OpARMMOVWconst {
8814 break
8815 }
8816 c := auxIntToInt32(v_1.AuxInt)
8817 v.reset(OpARMORconst)
8818 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
8819 v.AddArg(x)
8820 return true
8821 }
8822
8823
8824 for {
8825 c := auxIntToInt32(v.AuxInt)
8826 y := v_0
8827 if y.Op != OpARMSRLconst || auxIntToInt32(y.AuxInt) != c {
8828 break
8829 }
8830 x := y.Args[0]
8831 if x != v_1 {
8832 break
8833 }
8834 v.copyOf(y)
8835 return true
8836 }
8837 return false
8838 }
8839 func rewriteValueARM_OpARMORshiftRLreg(v *Value) bool {
8840 v_2 := v.Args[2]
8841 v_1 := v.Args[1]
8842 v_0 := v.Args[0]
8843 b := v.Block
8844
8845
8846 for {
8847 if v_0.Op != OpARMMOVWconst {
8848 break
8849 }
8850 c := auxIntToInt32(v_0.AuxInt)
8851 x := v_1
8852 y := v_2
8853 v.reset(OpARMORconst)
8854 v.AuxInt = int32ToAuxInt(c)
8855 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
8856 v0.AddArg2(x, y)
8857 v.AddArg(v0)
8858 return true
8859 }
8860
8861
8862
8863 for {
8864 x := v_0
8865 y := v_1
8866 if v_2.Op != OpARMMOVWconst {
8867 break
8868 }
8869 c := auxIntToInt32(v_2.AuxInt)
8870 if !(0 <= c && c < 32) {
8871 break
8872 }
8873 v.reset(OpARMORshiftRL)
8874 v.AuxInt = int32ToAuxInt(c)
8875 v.AddArg2(x, y)
8876 return true
8877 }
8878 return false
8879 }
8880 func rewriteValueARM_OpARMRSB(v *Value) bool {
8881 v_1 := v.Args[1]
8882 v_0 := v.Args[0]
8883
8884
8885 for {
8886 if v_0.Op != OpARMMOVWconst {
8887 break
8888 }
8889 c := auxIntToInt32(v_0.AuxInt)
8890 x := v_1
8891 v.reset(OpARMSUBconst)
8892 v.AuxInt = int32ToAuxInt(c)
8893 v.AddArg(x)
8894 return true
8895 }
8896
8897
8898 for {
8899 x := v_0
8900 if v_1.Op != OpARMMOVWconst {
8901 break
8902 }
8903 c := auxIntToInt32(v_1.AuxInt)
8904 v.reset(OpARMRSBconst)
8905 v.AuxInt = int32ToAuxInt(c)
8906 v.AddArg(x)
8907 return true
8908 }
8909
8910
8911 for {
8912 x := v_0
8913 if v_1.Op != OpARMSLLconst {
8914 break
8915 }
8916 c := auxIntToInt32(v_1.AuxInt)
8917 y := v_1.Args[0]
8918 v.reset(OpARMRSBshiftLL)
8919 v.AuxInt = int32ToAuxInt(c)
8920 v.AddArg2(x, y)
8921 return true
8922 }
8923
8924
8925 for {
8926 if v_0.Op != OpARMSLLconst {
8927 break
8928 }
8929 c := auxIntToInt32(v_0.AuxInt)
8930 y := v_0.Args[0]
8931 x := v_1
8932 v.reset(OpARMSUBshiftLL)
8933 v.AuxInt = int32ToAuxInt(c)
8934 v.AddArg2(x, y)
8935 return true
8936 }
8937
8938
8939 for {
8940 x := v_0
8941 if v_1.Op != OpARMSRLconst {
8942 break
8943 }
8944 c := auxIntToInt32(v_1.AuxInt)
8945 y := v_1.Args[0]
8946 v.reset(OpARMRSBshiftRL)
8947 v.AuxInt = int32ToAuxInt(c)
8948 v.AddArg2(x, y)
8949 return true
8950 }
8951
8952
8953 for {
8954 if v_0.Op != OpARMSRLconst {
8955 break
8956 }
8957 c := auxIntToInt32(v_0.AuxInt)
8958 y := v_0.Args[0]
8959 x := v_1
8960 v.reset(OpARMSUBshiftRL)
8961 v.AuxInt = int32ToAuxInt(c)
8962 v.AddArg2(x, y)
8963 return true
8964 }
8965
8966
8967 for {
8968 x := v_0
8969 if v_1.Op != OpARMSRAconst {
8970 break
8971 }
8972 c := auxIntToInt32(v_1.AuxInt)
8973 y := v_1.Args[0]
8974 v.reset(OpARMRSBshiftRA)
8975 v.AuxInt = int32ToAuxInt(c)
8976 v.AddArg2(x, y)
8977 return true
8978 }
8979
8980
8981 for {
8982 if v_0.Op != OpARMSRAconst {
8983 break
8984 }
8985 c := auxIntToInt32(v_0.AuxInt)
8986 y := v_0.Args[0]
8987 x := v_1
8988 v.reset(OpARMSUBshiftRA)
8989 v.AuxInt = int32ToAuxInt(c)
8990 v.AddArg2(x, y)
8991 return true
8992 }
8993
8994
8995 for {
8996 x := v_0
8997 if v_1.Op != OpARMSLL {
8998 break
8999 }
9000 z := v_1.Args[1]
9001 y := v_1.Args[0]
9002 v.reset(OpARMRSBshiftLLreg)
9003 v.AddArg3(x, y, z)
9004 return true
9005 }
9006
9007
9008 for {
9009 if v_0.Op != OpARMSLL {
9010 break
9011 }
9012 z := v_0.Args[1]
9013 y := v_0.Args[0]
9014 x := v_1
9015 v.reset(OpARMSUBshiftLLreg)
9016 v.AddArg3(x, y, z)
9017 return true
9018 }
9019
9020
9021 for {
9022 x := v_0
9023 if v_1.Op != OpARMSRL {
9024 break
9025 }
9026 z := v_1.Args[1]
9027 y := v_1.Args[0]
9028 v.reset(OpARMRSBshiftRLreg)
9029 v.AddArg3(x, y, z)
9030 return true
9031 }
9032
9033
9034 for {
9035 if v_0.Op != OpARMSRL {
9036 break
9037 }
9038 z := v_0.Args[1]
9039 y := v_0.Args[0]
9040 x := v_1
9041 v.reset(OpARMSUBshiftRLreg)
9042 v.AddArg3(x, y, z)
9043 return true
9044 }
9045
9046
9047 for {
9048 x := v_0
9049 if v_1.Op != OpARMSRA {
9050 break
9051 }
9052 z := v_1.Args[1]
9053 y := v_1.Args[0]
9054 v.reset(OpARMRSBshiftRAreg)
9055 v.AddArg3(x, y, z)
9056 return true
9057 }
9058
9059
9060 for {
9061 if v_0.Op != OpARMSRA {
9062 break
9063 }
9064 z := v_0.Args[1]
9065 y := v_0.Args[0]
9066 x := v_1
9067 v.reset(OpARMSUBshiftRAreg)
9068 v.AddArg3(x, y, z)
9069 return true
9070 }
9071
9072
9073 for {
9074 x := v_0
9075 if x != v_1 {
9076 break
9077 }
9078 v.reset(OpARMMOVWconst)
9079 v.AuxInt = int32ToAuxInt(0)
9080 return true
9081 }
9082
9083
9084
9085 for {
9086 if v_0.Op != OpARMMUL {
9087 break
9088 }
9089 y := v_0.Args[1]
9090 x := v_0.Args[0]
9091 a := v_1
9092 if !(buildcfg.GOARM.Version == 7) {
9093 break
9094 }
9095 v.reset(OpARMMULS)
9096 v.AddArg3(x, y, a)
9097 return true
9098 }
9099 return false
9100 }
9101 func rewriteValueARM_OpARMRSBSshiftLL(v *Value) bool {
9102 v_1 := v.Args[1]
9103 v_0 := v.Args[0]
9104 b := v.Block
9105
9106
9107 for {
9108 d := auxIntToInt32(v.AuxInt)
9109 if v_0.Op != OpARMMOVWconst {
9110 break
9111 }
9112 c := auxIntToInt32(v_0.AuxInt)
9113 x := v_1
9114 v.reset(OpARMSUBSconst)
9115 v.AuxInt = int32ToAuxInt(c)
9116 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
9117 v0.AuxInt = int32ToAuxInt(d)
9118 v0.AddArg(x)
9119 v.AddArg(v0)
9120 return true
9121 }
9122
9123
9124 for {
9125 d := auxIntToInt32(v.AuxInt)
9126 x := v_0
9127 if v_1.Op != OpARMMOVWconst {
9128 break
9129 }
9130 c := auxIntToInt32(v_1.AuxInt)
9131 v.reset(OpARMRSBSconst)
9132 v.AuxInt = int32ToAuxInt(c << uint64(d))
9133 v.AddArg(x)
9134 return true
9135 }
9136 return false
9137 }
9138 func rewriteValueARM_OpARMRSBSshiftLLreg(v *Value) bool {
9139 v_2 := v.Args[2]
9140 v_1 := v.Args[1]
9141 v_0 := v.Args[0]
9142 b := v.Block
9143
9144
9145 for {
9146 if v_0.Op != OpARMMOVWconst {
9147 break
9148 }
9149 c := auxIntToInt32(v_0.AuxInt)
9150 x := v_1
9151 y := v_2
9152 v.reset(OpARMSUBSconst)
9153 v.AuxInt = int32ToAuxInt(c)
9154 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
9155 v0.AddArg2(x, y)
9156 v.AddArg(v0)
9157 return true
9158 }
9159
9160
9161
9162 for {
9163 x := v_0
9164 y := v_1
9165 if v_2.Op != OpARMMOVWconst {
9166 break
9167 }
9168 c := auxIntToInt32(v_2.AuxInt)
9169 if !(0 <= c && c < 32) {
9170 break
9171 }
9172 v.reset(OpARMRSBSshiftLL)
9173 v.AuxInt = int32ToAuxInt(c)
9174 v.AddArg2(x, y)
9175 return true
9176 }
9177 return false
9178 }
9179 func rewriteValueARM_OpARMRSBSshiftRA(v *Value) bool {
9180 v_1 := v.Args[1]
9181 v_0 := v.Args[0]
9182 b := v.Block
9183
9184
9185 for {
9186 d := auxIntToInt32(v.AuxInt)
9187 if v_0.Op != OpARMMOVWconst {
9188 break
9189 }
9190 c := auxIntToInt32(v_0.AuxInt)
9191 x := v_1
9192 v.reset(OpARMSUBSconst)
9193 v.AuxInt = int32ToAuxInt(c)
9194 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
9195 v0.AuxInt = int32ToAuxInt(d)
9196 v0.AddArg(x)
9197 v.AddArg(v0)
9198 return true
9199 }
9200
9201
9202 for {
9203 d := auxIntToInt32(v.AuxInt)
9204 x := v_0
9205 if v_1.Op != OpARMMOVWconst {
9206 break
9207 }
9208 c := auxIntToInt32(v_1.AuxInt)
9209 v.reset(OpARMRSBSconst)
9210 v.AuxInt = int32ToAuxInt(c >> uint64(d))
9211 v.AddArg(x)
9212 return true
9213 }
9214 return false
9215 }
9216 func rewriteValueARM_OpARMRSBSshiftRAreg(v *Value) bool {
9217 v_2 := v.Args[2]
9218 v_1 := v.Args[1]
9219 v_0 := v.Args[0]
9220 b := v.Block
9221
9222
9223 for {
9224 if v_0.Op != OpARMMOVWconst {
9225 break
9226 }
9227 c := auxIntToInt32(v_0.AuxInt)
9228 x := v_1
9229 y := v_2
9230 v.reset(OpARMSUBSconst)
9231 v.AuxInt = int32ToAuxInt(c)
9232 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
9233 v0.AddArg2(x, y)
9234 v.AddArg(v0)
9235 return true
9236 }
9237
9238
9239
9240 for {
9241 x := v_0
9242 y := v_1
9243 if v_2.Op != OpARMMOVWconst {
9244 break
9245 }
9246 c := auxIntToInt32(v_2.AuxInt)
9247 if !(0 <= c && c < 32) {
9248 break
9249 }
9250 v.reset(OpARMRSBSshiftRA)
9251 v.AuxInt = int32ToAuxInt(c)
9252 v.AddArg2(x, y)
9253 return true
9254 }
9255 return false
9256 }
9257 func rewriteValueARM_OpARMRSBSshiftRL(v *Value) bool {
9258 v_1 := v.Args[1]
9259 v_0 := v.Args[0]
9260 b := v.Block
9261
9262
9263 for {
9264 d := auxIntToInt32(v.AuxInt)
9265 if v_0.Op != OpARMMOVWconst {
9266 break
9267 }
9268 c := auxIntToInt32(v_0.AuxInt)
9269 x := v_1
9270 v.reset(OpARMSUBSconst)
9271 v.AuxInt = int32ToAuxInt(c)
9272 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
9273 v0.AuxInt = int32ToAuxInt(d)
9274 v0.AddArg(x)
9275 v.AddArg(v0)
9276 return true
9277 }
9278
9279
9280 for {
9281 d := auxIntToInt32(v.AuxInt)
9282 x := v_0
9283 if v_1.Op != OpARMMOVWconst {
9284 break
9285 }
9286 c := auxIntToInt32(v_1.AuxInt)
9287 v.reset(OpARMRSBSconst)
9288 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
9289 v.AddArg(x)
9290 return true
9291 }
9292 return false
9293 }
9294 func rewriteValueARM_OpARMRSBSshiftRLreg(v *Value) bool {
9295 v_2 := v.Args[2]
9296 v_1 := v.Args[1]
9297 v_0 := v.Args[0]
9298 b := v.Block
9299
9300
9301 for {
9302 if v_0.Op != OpARMMOVWconst {
9303 break
9304 }
9305 c := auxIntToInt32(v_0.AuxInt)
9306 x := v_1
9307 y := v_2
9308 v.reset(OpARMSUBSconst)
9309 v.AuxInt = int32ToAuxInt(c)
9310 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
9311 v0.AddArg2(x, y)
9312 v.AddArg(v0)
9313 return true
9314 }
9315
9316
9317
9318 for {
9319 x := v_0
9320 y := v_1
9321 if v_2.Op != OpARMMOVWconst {
9322 break
9323 }
9324 c := auxIntToInt32(v_2.AuxInt)
9325 if !(0 <= c && c < 32) {
9326 break
9327 }
9328 v.reset(OpARMRSBSshiftRL)
9329 v.AuxInt = int32ToAuxInt(c)
9330 v.AddArg2(x, y)
9331 return true
9332 }
9333 return false
9334 }
9335 func rewriteValueARM_OpARMRSBconst(v *Value) bool {
9336 v_0 := v.Args[0]
9337
9338
9339 for {
9340 c := auxIntToInt32(v.AuxInt)
9341 if v_0.Op != OpARMMOVWconst {
9342 break
9343 }
9344 d := auxIntToInt32(v_0.AuxInt)
9345 v.reset(OpARMMOVWconst)
9346 v.AuxInt = int32ToAuxInt(c - d)
9347 return true
9348 }
9349
9350
9351 for {
9352 c := auxIntToInt32(v.AuxInt)
9353 if v_0.Op != OpARMRSBconst {
9354 break
9355 }
9356 d := auxIntToInt32(v_0.AuxInt)
9357 x := v_0.Args[0]
9358 v.reset(OpARMADDconst)
9359 v.AuxInt = int32ToAuxInt(c - d)
9360 v.AddArg(x)
9361 return true
9362 }
9363
9364
9365 for {
9366 c := auxIntToInt32(v.AuxInt)
9367 if v_0.Op != OpARMADDconst {
9368 break
9369 }
9370 d := auxIntToInt32(v_0.AuxInt)
9371 x := v_0.Args[0]
9372 v.reset(OpARMRSBconst)
9373 v.AuxInt = int32ToAuxInt(c - d)
9374 v.AddArg(x)
9375 return true
9376 }
9377
9378
9379 for {
9380 c := auxIntToInt32(v.AuxInt)
9381 if v_0.Op != OpARMSUBconst {
9382 break
9383 }
9384 d := auxIntToInt32(v_0.AuxInt)
9385 x := v_0.Args[0]
9386 v.reset(OpARMRSBconst)
9387 v.AuxInt = int32ToAuxInt(c + d)
9388 v.AddArg(x)
9389 return true
9390 }
9391 return false
9392 }
9393 func rewriteValueARM_OpARMRSBshiftLL(v *Value) bool {
9394 v_1 := v.Args[1]
9395 v_0 := v.Args[0]
9396 b := v.Block
9397
9398
9399 for {
9400 d := auxIntToInt32(v.AuxInt)
9401 if v_0.Op != OpARMMOVWconst {
9402 break
9403 }
9404 c := auxIntToInt32(v_0.AuxInt)
9405 x := v_1
9406 v.reset(OpARMSUBconst)
9407 v.AuxInt = int32ToAuxInt(c)
9408 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
9409 v0.AuxInt = int32ToAuxInt(d)
9410 v0.AddArg(x)
9411 v.AddArg(v0)
9412 return true
9413 }
9414
9415
9416 for {
9417 d := auxIntToInt32(v.AuxInt)
9418 x := v_0
9419 if v_1.Op != OpARMMOVWconst {
9420 break
9421 }
9422 c := auxIntToInt32(v_1.AuxInt)
9423 v.reset(OpARMRSBconst)
9424 v.AuxInt = int32ToAuxInt(c << uint64(d))
9425 v.AddArg(x)
9426 return true
9427 }
9428
9429
9430 for {
9431 c := auxIntToInt32(v.AuxInt)
9432 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c {
9433 break
9434 }
9435 x := v_0.Args[0]
9436 if x != v_1 {
9437 break
9438 }
9439 v.reset(OpARMMOVWconst)
9440 v.AuxInt = int32ToAuxInt(0)
9441 return true
9442 }
9443 return false
9444 }
9445 func rewriteValueARM_OpARMRSBshiftLLreg(v *Value) bool {
9446 v_2 := v.Args[2]
9447 v_1 := v.Args[1]
9448 v_0 := v.Args[0]
9449 b := v.Block
9450
9451
9452 for {
9453 if v_0.Op != OpARMMOVWconst {
9454 break
9455 }
9456 c := auxIntToInt32(v_0.AuxInt)
9457 x := v_1
9458 y := v_2
9459 v.reset(OpARMSUBconst)
9460 v.AuxInt = int32ToAuxInt(c)
9461 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
9462 v0.AddArg2(x, y)
9463 v.AddArg(v0)
9464 return true
9465 }
9466
9467
9468
9469 for {
9470 x := v_0
9471 y := v_1
9472 if v_2.Op != OpARMMOVWconst {
9473 break
9474 }
9475 c := auxIntToInt32(v_2.AuxInt)
9476 if !(0 <= c && c < 32) {
9477 break
9478 }
9479 v.reset(OpARMRSBshiftLL)
9480 v.AuxInt = int32ToAuxInt(c)
9481 v.AddArg2(x, y)
9482 return true
9483 }
9484 return false
9485 }
9486 func rewriteValueARM_OpARMRSBshiftRA(v *Value) bool {
9487 v_1 := v.Args[1]
9488 v_0 := v.Args[0]
9489 b := v.Block
9490
9491
9492 for {
9493 d := auxIntToInt32(v.AuxInt)
9494 if v_0.Op != OpARMMOVWconst {
9495 break
9496 }
9497 c := auxIntToInt32(v_0.AuxInt)
9498 x := v_1
9499 v.reset(OpARMSUBconst)
9500 v.AuxInt = int32ToAuxInt(c)
9501 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
9502 v0.AuxInt = int32ToAuxInt(d)
9503 v0.AddArg(x)
9504 v.AddArg(v0)
9505 return true
9506 }
9507
9508
9509 for {
9510 d := auxIntToInt32(v.AuxInt)
9511 x := v_0
9512 if v_1.Op != OpARMMOVWconst {
9513 break
9514 }
9515 c := auxIntToInt32(v_1.AuxInt)
9516 v.reset(OpARMRSBconst)
9517 v.AuxInt = int32ToAuxInt(c >> uint64(d))
9518 v.AddArg(x)
9519 return true
9520 }
9521
9522
9523 for {
9524 c := auxIntToInt32(v.AuxInt)
9525 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c {
9526 break
9527 }
9528 x := v_0.Args[0]
9529 if x != v_1 {
9530 break
9531 }
9532 v.reset(OpARMMOVWconst)
9533 v.AuxInt = int32ToAuxInt(0)
9534 return true
9535 }
9536 return false
9537 }
9538 func rewriteValueARM_OpARMRSBshiftRAreg(v *Value) bool {
9539 v_2 := v.Args[2]
9540 v_1 := v.Args[1]
9541 v_0 := v.Args[0]
9542 b := v.Block
9543
9544
9545 for {
9546 if v_0.Op != OpARMMOVWconst {
9547 break
9548 }
9549 c := auxIntToInt32(v_0.AuxInt)
9550 x := v_1
9551 y := v_2
9552 v.reset(OpARMSUBconst)
9553 v.AuxInt = int32ToAuxInt(c)
9554 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
9555 v0.AddArg2(x, y)
9556 v.AddArg(v0)
9557 return true
9558 }
9559
9560
9561
9562 for {
9563 x := v_0
9564 y := v_1
9565 if v_2.Op != OpARMMOVWconst {
9566 break
9567 }
9568 c := auxIntToInt32(v_2.AuxInt)
9569 if !(0 <= c && c < 32) {
9570 break
9571 }
9572 v.reset(OpARMRSBshiftRA)
9573 v.AuxInt = int32ToAuxInt(c)
9574 v.AddArg2(x, y)
9575 return true
9576 }
9577 return false
9578 }
9579 func rewriteValueARM_OpARMRSBshiftRL(v *Value) bool {
9580 v_1 := v.Args[1]
9581 v_0 := v.Args[0]
9582 b := v.Block
9583
9584
9585 for {
9586 d := auxIntToInt32(v.AuxInt)
9587 if v_0.Op != OpARMMOVWconst {
9588 break
9589 }
9590 c := auxIntToInt32(v_0.AuxInt)
9591 x := v_1
9592 v.reset(OpARMSUBconst)
9593 v.AuxInt = int32ToAuxInt(c)
9594 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
9595 v0.AuxInt = int32ToAuxInt(d)
9596 v0.AddArg(x)
9597 v.AddArg(v0)
9598 return true
9599 }
9600
9601
9602 for {
9603 d := auxIntToInt32(v.AuxInt)
9604 x := v_0
9605 if v_1.Op != OpARMMOVWconst {
9606 break
9607 }
9608 c := auxIntToInt32(v_1.AuxInt)
9609 v.reset(OpARMRSBconst)
9610 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
9611 v.AddArg(x)
9612 return true
9613 }
9614
9615
9616 for {
9617 c := auxIntToInt32(v.AuxInt)
9618 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c {
9619 break
9620 }
9621 x := v_0.Args[0]
9622 if x != v_1 {
9623 break
9624 }
9625 v.reset(OpARMMOVWconst)
9626 v.AuxInt = int32ToAuxInt(0)
9627 return true
9628 }
9629 return false
9630 }
9631 func rewriteValueARM_OpARMRSBshiftRLreg(v *Value) bool {
9632 v_2 := v.Args[2]
9633 v_1 := v.Args[1]
9634 v_0 := v.Args[0]
9635 b := v.Block
9636
9637
9638 for {
9639 if v_0.Op != OpARMMOVWconst {
9640 break
9641 }
9642 c := auxIntToInt32(v_0.AuxInt)
9643 x := v_1
9644 y := v_2
9645 v.reset(OpARMSUBconst)
9646 v.AuxInt = int32ToAuxInt(c)
9647 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
9648 v0.AddArg2(x, y)
9649 v.AddArg(v0)
9650 return true
9651 }
9652
9653
9654
9655 for {
9656 x := v_0
9657 y := v_1
9658 if v_2.Op != OpARMMOVWconst {
9659 break
9660 }
9661 c := auxIntToInt32(v_2.AuxInt)
9662 if !(0 <= c && c < 32) {
9663 break
9664 }
9665 v.reset(OpARMRSBshiftRL)
9666 v.AuxInt = int32ToAuxInt(c)
9667 v.AddArg2(x, y)
9668 return true
9669 }
9670 return false
9671 }
9672 func rewriteValueARM_OpARMRSCconst(v *Value) bool {
9673 v_1 := v.Args[1]
9674 v_0 := v.Args[0]
9675
9676
9677 for {
9678 c := auxIntToInt32(v.AuxInt)
9679 if v_0.Op != OpARMADDconst {
9680 break
9681 }
9682 d := auxIntToInt32(v_0.AuxInt)
9683 x := v_0.Args[0]
9684 flags := v_1
9685 v.reset(OpARMRSCconst)
9686 v.AuxInt = int32ToAuxInt(c - d)
9687 v.AddArg2(x, flags)
9688 return true
9689 }
9690
9691
9692 for {
9693 c := auxIntToInt32(v.AuxInt)
9694 if v_0.Op != OpARMSUBconst {
9695 break
9696 }
9697 d := auxIntToInt32(v_0.AuxInt)
9698 x := v_0.Args[0]
9699 flags := v_1
9700 v.reset(OpARMRSCconst)
9701 v.AuxInt = int32ToAuxInt(c + d)
9702 v.AddArg2(x, flags)
9703 return true
9704 }
9705 return false
9706 }
9707 func rewriteValueARM_OpARMRSCshiftLL(v *Value) bool {
9708 v_2 := v.Args[2]
9709 v_1 := v.Args[1]
9710 v_0 := v.Args[0]
9711 b := v.Block
9712
9713
9714 for {
9715 d := auxIntToInt32(v.AuxInt)
9716 if v_0.Op != OpARMMOVWconst {
9717 break
9718 }
9719 c := auxIntToInt32(v_0.AuxInt)
9720 x := v_1
9721 flags := v_2
9722 v.reset(OpARMSBCconst)
9723 v.AuxInt = int32ToAuxInt(c)
9724 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
9725 v0.AuxInt = int32ToAuxInt(d)
9726 v0.AddArg(x)
9727 v.AddArg2(v0, flags)
9728 return true
9729 }
9730
9731
9732 for {
9733 d := auxIntToInt32(v.AuxInt)
9734 x := v_0
9735 if v_1.Op != OpARMMOVWconst {
9736 break
9737 }
9738 c := auxIntToInt32(v_1.AuxInt)
9739 flags := v_2
9740 v.reset(OpARMRSCconst)
9741 v.AuxInt = int32ToAuxInt(c << uint64(d))
9742 v.AddArg2(x, flags)
9743 return true
9744 }
9745 return false
9746 }
9747 func rewriteValueARM_OpARMRSCshiftLLreg(v *Value) bool {
9748 v_3 := v.Args[3]
9749 v_2 := v.Args[2]
9750 v_1 := v.Args[1]
9751 v_0 := v.Args[0]
9752 b := v.Block
9753
9754
9755 for {
9756 if v_0.Op != OpARMMOVWconst {
9757 break
9758 }
9759 c := auxIntToInt32(v_0.AuxInt)
9760 x := v_1
9761 y := v_2
9762 flags := v_3
9763 v.reset(OpARMSBCconst)
9764 v.AuxInt = int32ToAuxInt(c)
9765 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
9766 v0.AddArg2(x, y)
9767 v.AddArg2(v0, flags)
9768 return true
9769 }
9770
9771
9772
9773 for {
9774 x := v_0
9775 y := v_1
9776 if v_2.Op != OpARMMOVWconst {
9777 break
9778 }
9779 c := auxIntToInt32(v_2.AuxInt)
9780 flags := v_3
9781 if !(0 <= c && c < 32) {
9782 break
9783 }
9784 v.reset(OpARMRSCshiftLL)
9785 v.AuxInt = int32ToAuxInt(c)
9786 v.AddArg3(x, y, flags)
9787 return true
9788 }
9789 return false
9790 }
9791 func rewriteValueARM_OpARMRSCshiftRA(v *Value) bool {
9792 v_2 := v.Args[2]
9793 v_1 := v.Args[1]
9794 v_0 := v.Args[0]
9795 b := v.Block
9796
9797
9798 for {
9799 d := auxIntToInt32(v.AuxInt)
9800 if v_0.Op != OpARMMOVWconst {
9801 break
9802 }
9803 c := auxIntToInt32(v_0.AuxInt)
9804 x := v_1
9805 flags := v_2
9806 v.reset(OpARMSBCconst)
9807 v.AuxInt = int32ToAuxInt(c)
9808 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
9809 v0.AuxInt = int32ToAuxInt(d)
9810 v0.AddArg(x)
9811 v.AddArg2(v0, flags)
9812 return true
9813 }
9814
9815
9816 for {
9817 d := auxIntToInt32(v.AuxInt)
9818 x := v_0
9819 if v_1.Op != OpARMMOVWconst {
9820 break
9821 }
9822 c := auxIntToInt32(v_1.AuxInt)
9823 flags := v_2
9824 v.reset(OpARMRSCconst)
9825 v.AuxInt = int32ToAuxInt(c >> uint64(d))
9826 v.AddArg2(x, flags)
9827 return true
9828 }
9829 return false
9830 }
9831 func rewriteValueARM_OpARMRSCshiftRAreg(v *Value) bool {
9832 v_3 := v.Args[3]
9833 v_2 := v.Args[2]
9834 v_1 := v.Args[1]
9835 v_0 := v.Args[0]
9836 b := v.Block
9837
9838
9839 for {
9840 if v_0.Op != OpARMMOVWconst {
9841 break
9842 }
9843 c := auxIntToInt32(v_0.AuxInt)
9844 x := v_1
9845 y := v_2
9846 flags := v_3
9847 v.reset(OpARMSBCconst)
9848 v.AuxInt = int32ToAuxInt(c)
9849 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
9850 v0.AddArg2(x, y)
9851 v.AddArg2(v0, flags)
9852 return true
9853 }
9854
9855
9856
9857 for {
9858 x := v_0
9859 y := v_1
9860 if v_2.Op != OpARMMOVWconst {
9861 break
9862 }
9863 c := auxIntToInt32(v_2.AuxInt)
9864 flags := v_3
9865 if !(0 <= c && c < 32) {
9866 break
9867 }
9868 v.reset(OpARMRSCshiftRA)
9869 v.AuxInt = int32ToAuxInt(c)
9870 v.AddArg3(x, y, flags)
9871 return true
9872 }
9873 return false
9874 }
9875 func rewriteValueARM_OpARMRSCshiftRL(v *Value) bool {
9876 v_2 := v.Args[2]
9877 v_1 := v.Args[1]
9878 v_0 := v.Args[0]
9879 b := v.Block
9880
9881
9882 for {
9883 d := auxIntToInt32(v.AuxInt)
9884 if v_0.Op != OpARMMOVWconst {
9885 break
9886 }
9887 c := auxIntToInt32(v_0.AuxInt)
9888 x := v_1
9889 flags := v_2
9890 v.reset(OpARMSBCconst)
9891 v.AuxInt = int32ToAuxInt(c)
9892 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
9893 v0.AuxInt = int32ToAuxInt(d)
9894 v0.AddArg(x)
9895 v.AddArg2(v0, flags)
9896 return true
9897 }
9898
9899
9900 for {
9901 d := auxIntToInt32(v.AuxInt)
9902 x := v_0
9903 if v_1.Op != OpARMMOVWconst {
9904 break
9905 }
9906 c := auxIntToInt32(v_1.AuxInt)
9907 flags := v_2
9908 v.reset(OpARMRSCconst)
9909 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
9910 v.AddArg2(x, flags)
9911 return true
9912 }
9913 return false
9914 }
9915 func rewriteValueARM_OpARMRSCshiftRLreg(v *Value) bool {
9916 v_3 := v.Args[3]
9917 v_2 := v.Args[2]
9918 v_1 := v.Args[1]
9919 v_0 := v.Args[0]
9920 b := v.Block
9921
9922
9923 for {
9924 if v_0.Op != OpARMMOVWconst {
9925 break
9926 }
9927 c := auxIntToInt32(v_0.AuxInt)
9928 x := v_1
9929 y := v_2
9930 flags := v_3
9931 v.reset(OpARMSBCconst)
9932 v.AuxInt = int32ToAuxInt(c)
9933 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
9934 v0.AddArg2(x, y)
9935 v.AddArg2(v0, flags)
9936 return true
9937 }
9938
9939
9940
9941 for {
9942 x := v_0
9943 y := v_1
9944 if v_2.Op != OpARMMOVWconst {
9945 break
9946 }
9947 c := auxIntToInt32(v_2.AuxInt)
9948 flags := v_3
9949 if !(0 <= c && c < 32) {
9950 break
9951 }
9952 v.reset(OpARMRSCshiftRL)
9953 v.AuxInt = int32ToAuxInt(c)
9954 v.AddArg3(x, y, flags)
9955 return true
9956 }
9957 return false
9958 }
9959 func rewriteValueARM_OpARMSBC(v *Value) bool {
9960 v_2 := v.Args[2]
9961 v_1 := v.Args[1]
9962 v_0 := v.Args[0]
9963
9964
9965 for {
9966 if v_0.Op != OpARMMOVWconst {
9967 break
9968 }
9969 c := auxIntToInt32(v_0.AuxInt)
9970 x := v_1
9971 flags := v_2
9972 v.reset(OpARMRSCconst)
9973 v.AuxInt = int32ToAuxInt(c)
9974 v.AddArg2(x, flags)
9975 return true
9976 }
9977
9978
9979 for {
9980 x := v_0
9981 if v_1.Op != OpARMMOVWconst {
9982 break
9983 }
9984 c := auxIntToInt32(v_1.AuxInt)
9985 flags := v_2
9986 v.reset(OpARMSBCconst)
9987 v.AuxInt = int32ToAuxInt(c)
9988 v.AddArg2(x, flags)
9989 return true
9990 }
9991
9992
9993 for {
9994 x := v_0
9995 if v_1.Op != OpARMSLLconst {
9996 break
9997 }
9998 c := auxIntToInt32(v_1.AuxInt)
9999 y := v_1.Args[0]
10000 flags := v_2
10001 v.reset(OpARMSBCshiftLL)
10002 v.AuxInt = int32ToAuxInt(c)
10003 v.AddArg3(x, y, flags)
10004 return true
10005 }
10006
10007
10008 for {
10009 if v_0.Op != OpARMSLLconst {
10010 break
10011 }
10012 c := auxIntToInt32(v_0.AuxInt)
10013 y := v_0.Args[0]
10014 x := v_1
10015 flags := v_2
10016 v.reset(OpARMRSCshiftLL)
10017 v.AuxInt = int32ToAuxInt(c)
10018 v.AddArg3(x, y, flags)
10019 return true
10020 }
10021
10022
10023 for {
10024 x := v_0
10025 if v_1.Op != OpARMSRLconst {
10026 break
10027 }
10028 c := auxIntToInt32(v_1.AuxInt)
10029 y := v_1.Args[0]
10030 flags := v_2
10031 v.reset(OpARMSBCshiftRL)
10032 v.AuxInt = int32ToAuxInt(c)
10033 v.AddArg3(x, y, flags)
10034 return true
10035 }
10036
10037
10038 for {
10039 if v_0.Op != OpARMSRLconst {
10040 break
10041 }
10042 c := auxIntToInt32(v_0.AuxInt)
10043 y := v_0.Args[0]
10044 x := v_1
10045 flags := v_2
10046 v.reset(OpARMRSCshiftRL)
10047 v.AuxInt = int32ToAuxInt(c)
10048 v.AddArg3(x, y, flags)
10049 return true
10050 }
10051
10052
10053 for {
10054 x := v_0
10055 if v_1.Op != OpARMSRAconst {
10056 break
10057 }
10058 c := auxIntToInt32(v_1.AuxInt)
10059 y := v_1.Args[0]
10060 flags := v_2
10061 v.reset(OpARMSBCshiftRA)
10062 v.AuxInt = int32ToAuxInt(c)
10063 v.AddArg3(x, y, flags)
10064 return true
10065 }
10066
10067
10068 for {
10069 if v_0.Op != OpARMSRAconst {
10070 break
10071 }
10072 c := auxIntToInt32(v_0.AuxInt)
10073 y := v_0.Args[0]
10074 x := v_1
10075 flags := v_2
10076 v.reset(OpARMRSCshiftRA)
10077 v.AuxInt = int32ToAuxInt(c)
10078 v.AddArg3(x, y, flags)
10079 return true
10080 }
10081
10082
10083 for {
10084 x := v_0
10085 if v_1.Op != OpARMSLL {
10086 break
10087 }
10088 z := v_1.Args[1]
10089 y := v_1.Args[0]
10090 flags := v_2
10091 v.reset(OpARMSBCshiftLLreg)
10092 v.AddArg4(x, y, z, flags)
10093 return true
10094 }
10095
10096
10097 for {
10098 if v_0.Op != OpARMSLL {
10099 break
10100 }
10101 z := v_0.Args[1]
10102 y := v_0.Args[0]
10103 x := v_1
10104 flags := v_2
10105 v.reset(OpARMRSCshiftLLreg)
10106 v.AddArg4(x, y, z, flags)
10107 return true
10108 }
10109
10110
10111 for {
10112 x := v_0
10113 if v_1.Op != OpARMSRL {
10114 break
10115 }
10116 z := v_1.Args[1]
10117 y := v_1.Args[0]
10118 flags := v_2
10119 v.reset(OpARMSBCshiftRLreg)
10120 v.AddArg4(x, y, z, flags)
10121 return true
10122 }
10123
10124
10125 for {
10126 if v_0.Op != OpARMSRL {
10127 break
10128 }
10129 z := v_0.Args[1]
10130 y := v_0.Args[0]
10131 x := v_1
10132 flags := v_2
10133 v.reset(OpARMRSCshiftRLreg)
10134 v.AddArg4(x, y, z, flags)
10135 return true
10136 }
10137
10138
10139 for {
10140 x := v_0
10141 if v_1.Op != OpARMSRA {
10142 break
10143 }
10144 z := v_1.Args[1]
10145 y := v_1.Args[0]
10146 flags := v_2
10147 v.reset(OpARMSBCshiftRAreg)
10148 v.AddArg4(x, y, z, flags)
10149 return true
10150 }
10151
10152
10153 for {
10154 if v_0.Op != OpARMSRA {
10155 break
10156 }
10157 z := v_0.Args[1]
10158 y := v_0.Args[0]
10159 x := v_1
10160 flags := v_2
10161 v.reset(OpARMRSCshiftRAreg)
10162 v.AddArg4(x, y, z, flags)
10163 return true
10164 }
10165 return false
10166 }
10167 func rewriteValueARM_OpARMSBCconst(v *Value) bool {
10168 v_1 := v.Args[1]
10169 v_0 := v.Args[0]
10170
10171
10172 for {
10173 c := auxIntToInt32(v.AuxInt)
10174 if v_0.Op != OpARMADDconst {
10175 break
10176 }
10177 d := auxIntToInt32(v_0.AuxInt)
10178 x := v_0.Args[0]
10179 flags := v_1
10180 v.reset(OpARMSBCconst)
10181 v.AuxInt = int32ToAuxInt(c - d)
10182 v.AddArg2(x, flags)
10183 return true
10184 }
10185
10186
10187 for {
10188 c := auxIntToInt32(v.AuxInt)
10189 if v_0.Op != OpARMSUBconst {
10190 break
10191 }
10192 d := auxIntToInt32(v_0.AuxInt)
10193 x := v_0.Args[0]
10194 flags := v_1
10195 v.reset(OpARMSBCconst)
10196 v.AuxInt = int32ToAuxInt(c + d)
10197 v.AddArg2(x, flags)
10198 return true
10199 }
10200 return false
10201 }
10202 func rewriteValueARM_OpARMSBCshiftLL(v *Value) bool {
10203 v_2 := v.Args[2]
10204 v_1 := v.Args[1]
10205 v_0 := v.Args[0]
10206 b := v.Block
10207
10208
10209 for {
10210 d := auxIntToInt32(v.AuxInt)
10211 if v_0.Op != OpARMMOVWconst {
10212 break
10213 }
10214 c := auxIntToInt32(v_0.AuxInt)
10215 x := v_1
10216 flags := v_2
10217 v.reset(OpARMRSCconst)
10218 v.AuxInt = int32ToAuxInt(c)
10219 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
10220 v0.AuxInt = int32ToAuxInt(d)
10221 v0.AddArg(x)
10222 v.AddArg2(v0, flags)
10223 return true
10224 }
10225
10226
10227 for {
10228 d := auxIntToInt32(v.AuxInt)
10229 x := v_0
10230 if v_1.Op != OpARMMOVWconst {
10231 break
10232 }
10233 c := auxIntToInt32(v_1.AuxInt)
10234 flags := v_2
10235 v.reset(OpARMSBCconst)
10236 v.AuxInt = int32ToAuxInt(c << uint64(d))
10237 v.AddArg2(x, flags)
10238 return true
10239 }
10240 return false
10241 }
10242 func rewriteValueARM_OpARMSBCshiftLLreg(v *Value) bool {
10243 v_3 := v.Args[3]
10244 v_2 := v.Args[2]
10245 v_1 := v.Args[1]
10246 v_0 := v.Args[0]
10247 b := v.Block
10248
10249
10250 for {
10251 if v_0.Op != OpARMMOVWconst {
10252 break
10253 }
10254 c := auxIntToInt32(v_0.AuxInt)
10255 x := v_1
10256 y := v_2
10257 flags := v_3
10258 v.reset(OpARMRSCconst)
10259 v.AuxInt = int32ToAuxInt(c)
10260 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
10261 v0.AddArg2(x, y)
10262 v.AddArg2(v0, flags)
10263 return true
10264 }
10265
10266
10267
10268 for {
10269 x := v_0
10270 y := v_1
10271 if v_2.Op != OpARMMOVWconst {
10272 break
10273 }
10274 c := auxIntToInt32(v_2.AuxInt)
10275 flags := v_3
10276 if !(0 <= c && c < 32) {
10277 break
10278 }
10279 v.reset(OpARMSBCshiftLL)
10280 v.AuxInt = int32ToAuxInt(c)
10281 v.AddArg3(x, y, flags)
10282 return true
10283 }
10284 return false
10285 }
10286 func rewriteValueARM_OpARMSBCshiftRA(v *Value) bool {
10287 v_2 := v.Args[2]
10288 v_1 := v.Args[1]
10289 v_0 := v.Args[0]
10290 b := v.Block
10291
10292
10293 for {
10294 d := auxIntToInt32(v.AuxInt)
10295 if v_0.Op != OpARMMOVWconst {
10296 break
10297 }
10298 c := auxIntToInt32(v_0.AuxInt)
10299 x := v_1
10300 flags := v_2
10301 v.reset(OpARMRSCconst)
10302 v.AuxInt = int32ToAuxInt(c)
10303 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
10304 v0.AuxInt = int32ToAuxInt(d)
10305 v0.AddArg(x)
10306 v.AddArg2(v0, flags)
10307 return true
10308 }
10309
10310
10311 for {
10312 d := auxIntToInt32(v.AuxInt)
10313 x := v_0
10314 if v_1.Op != OpARMMOVWconst {
10315 break
10316 }
10317 c := auxIntToInt32(v_1.AuxInt)
10318 flags := v_2
10319 v.reset(OpARMSBCconst)
10320 v.AuxInt = int32ToAuxInt(c >> uint64(d))
10321 v.AddArg2(x, flags)
10322 return true
10323 }
10324 return false
10325 }
10326 func rewriteValueARM_OpARMSBCshiftRAreg(v *Value) bool {
10327 v_3 := v.Args[3]
10328 v_2 := v.Args[2]
10329 v_1 := v.Args[1]
10330 v_0 := v.Args[0]
10331 b := v.Block
10332
10333
10334 for {
10335 if v_0.Op != OpARMMOVWconst {
10336 break
10337 }
10338 c := auxIntToInt32(v_0.AuxInt)
10339 x := v_1
10340 y := v_2
10341 flags := v_3
10342 v.reset(OpARMRSCconst)
10343 v.AuxInt = int32ToAuxInt(c)
10344 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
10345 v0.AddArg2(x, y)
10346 v.AddArg2(v0, flags)
10347 return true
10348 }
10349
10350
10351
10352 for {
10353 x := v_0
10354 y := v_1
10355 if v_2.Op != OpARMMOVWconst {
10356 break
10357 }
10358 c := auxIntToInt32(v_2.AuxInt)
10359 flags := v_3
10360 if !(0 <= c && c < 32) {
10361 break
10362 }
10363 v.reset(OpARMSBCshiftRA)
10364 v.AuxInt = int32ToAuxInt(c)
10365 v.AddArg3(x, y, flags)
10366 return true
10367 }
10368 return false
10369 }
10370 func rewriteValueARM_OpARMSBCshiftRL(v *Value) bool {
10371 v_2 := v.Args[2]
10372 v_1 := v.Args[1]
10373 v_0 := v.Args[0]
10374 b := v.Block
10375
10376
10377 for {
10378 d := auxIntToInt32(v.AuxInt)
10379 if v_0.Op != OpARMMOVWconst {
10380 break
10381 }
10382 c := auxIntToInt32(v_0.AuxInt)
10383 x := v_1
10384 flags := v_2
10385 v.reset(OpARMRSCconst)
10386 v.AuxInt = int32ToAuxInt(c)
10387 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
10388 v0.AuxInt = int32ToAuxInt(d)
10389 v0.AddArg(x)
10390 v.AddArg2(v0, flags)
10391 return true
10392 }
10393
10394
10395 for {
10396 d := auxIntToInt32(v.AuxInt)
10397 x := v_0
10398 if v_1.Op != OpARMMOVWconst {
10399 break
10400 }
10401 c := auxIntToInt32(v_1.AuxInt)
10402 flags := v_2
10403 v.reset(OpARMSBCconst)
10404 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
10405 v.AddArg2(x, flags)
10406 return true
10407 }
10408 return false
10409 }
10410 func rewriteValueARM_OpARMSBCshiftRLreg(v *Value) bool {
10411 v_3 := v.Args[3]
10412 v_2 := v.Args[2]
10413 v_1 := v.Args[1]
10414 v_0 := v.Args[0]
10415 b := v.Block
10416
10417
10418 for {
10419 if v_0.Op != OpARMMOVWconst {
10420 break
10421 }
10422 c := auxIntToInt32(v_0.AuxInt)
10423 x := v_1
10424 y := v_2
10425 flags := v_3
10426 v.reset(OpARMRSCconst)
10427 v.AuxInt = int32ToAuxInt(c)
10428 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
10429 v0.AddArg2(x, y)
10430 v.AddArg2(v0, flags)
10431 return true
10432 }
10433
10434
10435
10436 for {
10437 x := v_0
10438 y := v_1
10439 if v_2.Op != OpARMMOVWconst {
10440 break
10441 }
10442 c := auxIntToInt32(v_2.AuxInt)
10443 flags := v_3
10444 if !(0 <= c && c < 32) {
10445 break
10446 }
10447 v.reset(OpARMSBCshiftRL)
10448 v.AuxInt = int32ToAuxInt(c)
10449 v.AddArg3(x, y, flags)
10450 return true
10451 }
10452 return false
10453 }
10454 func rewriteValueARM_OpARMSLL(v *Value) bool {
10455 v_1 := v.Args[1]
10456 v_0 := v.Args[0]
10457
10458
10459
10460 for {
10461 x := v_0
10462 if v_1.Op != OpARMMOVWconst {
10463 break
10464 }
10465 c := auxIntToInt32(v_1.AuxInt)
10466 if !(0 <= c && c < 32) {
10467 break
10468 }
10469 v.reset(OpARMSLLconst)
10470 v.AuxInt = int32ToAuxInt(c)
10471 v.AddArg(x)
10472 return true
10473 }
10474 return false
10475 }
10476 func rewriteValueARM_OpARMSLLconst(v *Value) bool {
10477 v_0 := v.Args[0]
10478
10479
10480 for {
10481 c := auxIntToInt32(v.AuxInt)
10482 if v_0.Op != OpARMMOVWconst {
10483 break
10484 }
10485 d := auxIntToInt32(v_0.AuxInt)
10486 v.reset(OpARMMOVWconst)
10487 v.AuxInt = int32ToAuxInt(d << uint64(c))
10488 return true
10489 }
10490 return false
10491 }
10492 func rewriteValueARM_OpARMSRA(v *Value) bool {
10493 v_1 := v.Args[1]
10494 v_0 := v.Args[0]
10495
10496
10497
10498 for {
10499 x := v_0
10500 if v_1.Op != OpARMMOVWconst {
10501 break
10502 }
10503 c := auxIntToInt32(v_1.AuxInt)
10504 if !(0 <= c && c < 32) {
10505 break
10506 }
10507 v.reset(OpARMSRAconst)
10508 v.AuxInt = int32ToAuxInt(c)
10509 v.AddArg(x)
10510 return true
10511 }
10512 return false
10513 }
10514 func rewriteValueARM_OpARMSRAcond(v *Value) bool {
10515 v_2 := v.Args[2]
10516 v_1 := v.Args[1]
10517 v_0 := v.Args[0]
10518
10519
10520
10521 for {
10522 x := v_0
10523 if v_2.Op != OpARMFlagConstant {
10524 break
10525 }
10526 fc := auxIntToFlagConstant(v_2.AuxInt)
10527 if !(fc.uge()) {
10528 break
10529 }
10530 v.reset(OpARMSRAconst)
10531 v.AuxInt = int32ToAuxInt(31)
10532 v.AddArg(x)
10533 return true
10534 }
10535
10536
10537
10538 for {
10539 x := v_0
10540 y := v_1
10541 if v_2.Op != OpARMFlagConstant {
10542 break
10543 }
10544 fc := auxIntToFlagConstant(v_2.AuxInt)
10545 if !(fc.ult()) {
10546 break
10547 }
10548 v.reset(OpARMSRA)
10549 v.AddArg2(x, y)
10550 return true
10551 }
10552 return false
10553 }
10554 func rewriteValueARM_OpARMSRAconst(v *Value) bool {
10555 v_0 := v.Args[0]
10556
10557
10558 for {
10559 c := auxIntToInt32(v.AuxInt)
10560 if v_0.Op != OpARMMOVWconst {
10561 break
10562 }
10563 d := auxIntToInt32(v_0.AuxInt)
10564 v.reset(OpARMMOVWconst)
10565 v.AuxInt = int32ToAuxInt(d >> uint64(c))
10566 return true
10567 }
10568
10569
10570
10571 for {
10572 d := auxIntToInt32(v.AuxInt)
10573 if v_0.Op != OpARMSLLconst {
10574 break
10575 }
10576 c := auxIntToInt32(v_0.AuxInt)
10577 x := v_0.Args[0]
10578 if !(buildcfg.GOARM.Version == 7 && uint64(d) >= uint64(c) && uint64(d) <= 31) {
10579 break
10580 }
10581 v.reset(OpARMBFX)
10582 v.AuxInt = int32ToAuxInt((d - c) | (32-d)<<8)
10583 v.AddArg(x)
10584 return true
10585 }
10586 return false
10587 }
10588 func rewriteValueARM_OpARMSRL(v *Value) bool {
10589 v_1 := v.Args[1]
10590 v_0 := v.Args[0]
10591
10592
10593
10594 for {
10595 x := v_0
10596 if v_1.Op != OpARMMOVWconst {
10597 break
10598 }
10599 c := auxIntToInt32(v_1.AuxInt)
10600 if !(0 <= c && c < 32) {
10601 break
10602 }
10603 v.reset(OpARMSRLconst)
10604 v.AuxInt = int32ToAuxInt(c)
10605 v.AddArg(x)
10606 return true
10607 }
10608 return false
10609 }
10610 func rewriteValueARM_OpARMSRLconst(v *Value) bool {
10611 v_0 := v.Args[0]
10612
10613
10614 for {
10615 c := auxIntToInt32(v.AuxInt)
10616 if v_0.Op != OpARMMOVWconst {
10617 break
10618 }
10619 d := auxIntToInt32(v_0.AuxInt)
10620 v.reset(OpARMMOVWconst)
10621 v.AuxInt = int32ToAuxInt(int32(uint32(d) >> uint64(c)))
10622 return true
10623 }
10624
10625
10626
10627 for {
10628 d := auxIntToInt32(v.AuxInt)
10629 if v_0.Op != OpARMSLLconst {
10630 break
10631 }
10632 c := auxIntToInt32(v_0.AuxInt)
10633 x := v_0.Args[0]
10634 if !(buildcfg.GOARM.Version == 7 && uint64(d) >= uint64(c) && uint64(d) <= 31) {
10635 break
10636 }
10637 v.reset(OpARMBFXU)
10638 v.AuxInt = int32ToAuxInt((d - c) | (32-d)<<8)
10639 v.AddArg(x)
10640 return true
10641 }
10642 return false
10643 }
10644 func rewriteValueARM_OpARMSRR(v *Value) bool {
10645 v_1 := v.Args[1]
10646 v_0 := v.Args[0]
10647
10648
10649 for {
10650 x := v_0
10651 if v_1.Op != OpARMMOVWconst {
10652 break
10653 }
10654 c := auxIntToInt32(v_1.AuxInt)
10655 v.reset(OpARMSRRconst)
10656 v.AuxInt = int32ToAuxInt(c & 31)
10657 v.AddArg(x)
10658 return true
10659 }
10660 return false
10661 }
10662 func rewriteValueARM_OpARMSUB(v *Value) bool {
10663 v_1 := v.Args[1]
10664 v_0 := v.Args[0]
10665
10666
10667 for {
10668 if v_0.Op != OpARMMOVWconst {
10669 break
10670 }
10671 c := auxIntToInt32(v_0.AuxInt)
10672 x := v_1
10673 v.reset(OpARMRSBconst)
10674 v.AuxInt = int32ToAuxInt(c)
10675 v.AddArg(x)
10676 return true
10677 }
10678
10679
10680 for {
10681 x := v_0
10682 if v_1.Op != OpARMMOVWconst {
10683 break
10684 }
10685 c := auxIntToInt32(v_1.AuxInt)
10686 v.reset(OpARMSUBconst)
10687 v.AuxInt = int32ToAuxInt(c)
10688 v.AddArg(x)
10689 return true
10690 }
10691
10692
10693 for {
10694 x := v_0
10695 if v_1.Op != OpARMSLLconst {
10696 break
10697 }
10698 c := auxIntToInt32(v_1.AuxInt)
10699 y := v_1.Args[0]
10700 v.reset(OpARMSUBshiftLL)
10701 v.AuxInt = int32ToAuxInt(c)
10702 v.AddArg2(x, y)
10703 return true
10704 }
10705
10706
10707 for {
10708 if v_0.Op != OpARMSLLconst {
10709 break
10710 }
10711 c := auxIntToInt32(v_0.AuxInt)
10712 y := v_0.Args[0]
10713 x := v_1
10714 v.reset(OpARMRSBshiftLL)
10715 v.AuxInt = int32ToAuxInt(c)
10716 v.AddArg2(x, y)
10717 return true
10718 }
10719
10720
10721 for {
10722 x := v_0
10723 if v_1.Op != OpARMSRLconst {
10724 break
10725 }
10726 c := auxIntToInt32(v_1.AuxInt)
10727 y := v_1.Args[0]
10728 v.reset(OpARMSUBshiftRL)
10729 v.AuxInt = int32ToAuxInt(c)
10730 v.AddArg2(x, y)
10731 return true
10732 }
10733
10734
10735 for {
10736 if v_0.Op != OpARMSRLconst {
10737 break
10738 }
10739 c := auxIntToInt32(v_0.AuxInt)
10740 y := v_0.Args[0]
10741 x := v_1
10742 v.reset(OpARMRSBshiftRL)
10743 v.AuxInt = int32ToAuxInt(c)
10744 v.AddArg2(x, y)
10745 return true
10746 }
10747
10748
10749 for {
10750 x := v_0
10751 if v_1.Op != OpARMSRAconst {
10752 break
10753 }
10754 c := auxIntToInt32(v_1.AuxInt)
10755 y := v_1.Args[0]
10756 v.reset(OpARMSUBshiftRA)
10757 v.AuxInt = int32ToAuxInt(c)
10758 v.AddArg2(x, y)
10759 return true
10760 }
10761
10762
10763 for {
10764 if v_0.Op != OpARMSRAconst {
10765 break
10766 }
10767 c := auxIntToInt32(v_0.AuxInt)
10768 y := v_0.Args[0]
10769 x := v_1
10770 v.reset(OpARMRSBshiftRA)
10771 v.AuxInt = int32ToAuxInt(c)
10772 v.AddArg2(x, y)
10773 return true
10774 }
10775
10776
10777 for {
10778 x := v_0
10779 if v_1.Op != OpARMSLL {
10780 break
10781 }
10782 z := v_1.Args[1]
10783 y := v_1.Args[0]
10784 v.reset(OpARMSUBshiftLLreg)
10785 v.AddArg3(x, y, z)
10786 return true
10787 }
10788
10789
10790 for {
10791 if v_0.Op != OpARMSLL {
10792 break
10793 }
10794 z := v_0.Args[1]
10795 y := v_0.Args[0]
10796 x := v_1
10797 v.reset(OpARMRSBshiftLLreg)
10798 v.AddArg3(x, y, z)
10799 return true
10800 }
10801
10802
10803 for {
10804 x := v_0
10805 if v_1.Op != OpARMSRL {
10806 break
10807 }
10808 z := v_1.Args[1]
10809 y := v_1.Args[0]
10810 v.reset(OpARMSUBshiftRLreg)
10811 v.AddArg3(x, y, z)
10812 return true
10813 }
10814
10815
10816 for {
10817 if v_0.Op != OpARMSRL {
10818 break
10819 }
10820 z := v_0.Args[1]
10821 y := v_0.Args[0]
10822 x := v_1
10823 v.reset(OpARMRSBshiftRLreg)
10824 v.AddArg3(x, y, z)
10825 return true
10826 }
10827
10828
10829 for {
10830 x := v_0
10831 if v_1.Op != OpARMSRA {
10832 break
10833 }
10834 z := v_1.Args[1]
10835 y := v_1.Args[0]
10836 v.reset(OpARMSUBshiftRAreg)
10837 v.AddArg3(x, y, z)
10838 return true
10839 }
10840
10841
10842 for {
10843 if v_0.Op != OpARMSRA {
10844 break
10845 }
10846 z := v_0.Args[1]
10847 y := v_0.Args[0]
10848 x := v_1
10849 v.reset(OpARMRSBshiftRAreg)
10850 v.AddArg3(x, y, z)
10851 return true
10852 }
10853
10854
10855 for {
10856 x := v_0
10857 if x != v_1 {
10858 break
10859 }
10860 v.reset(OpARMMOVWconst)
10861 v.AuxInt = int32ToAuxInt(0)
10862 return true
10863 }
10864
10865
10866
10867 for {
10868 a := v_0
10869 if v_1.Op != OpARMMUL {
10870 break
10871 }
10872 y := v_1.Args[1]
10873 x := v_1.Args[0]
10874 if !(buildcfg.GOARM.Version == 7) {
10875 break
10876 }
10877 v.reset(OpARMMULS)
10878 v.AddArg3(x, y, a)
10879 return true
10880 }
10881 return false
10882 }
10883 func rewriteValueARM_OpARMSUBD(v *Value) bool {
10884 v_1 := v.Args[1]
10885 v_0 := v.Args[0]
10886
10887
10888
10889 for {
10890 a := v_0
10891 if v_1.Op != OpARMMULD {
10892 break
10893 }
10894 y := v_1.Args[1]
10895 x := v_1.Args[0]
10896 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
10897 break
10898 }
10899 v.reset(OpARMMULSD)
10900 v.AddArg3(a, x, y)
10901 return true
10902 }
10903
10904
10905
10906 for {
10907 a := v_0
10908 if v_1.Op != OpARMNMULD {
10909 break
10910 }
10911 y := v_1.Args[1]
10912 x := v_1.Args[0]
10913 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
10914 break
10915 }
10916 v.reset(OpARMMULAD)
10917 v.AddArg3(a, x, y)
10918 return true
10919 }
10920 return false
10921 }
10922 func rewriteValueARM_OpARMSUBF(v *Value) bool {
10923 v_1 := v.Args[1]
10924 v_0 := v.Args[0]
10925
10926
10927
10928 for {
10929 a := v_0
10930 if v_1.Op != OpARMMULF {
10931 break
10932 }
10933 y := v_1.Args[1]
10934 x := v_1.Args[0]
10935 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
10936 break
10937 }
10938 v.reset(OpARMMULSF)
10939 v.AddArg3(a, x, y)
10940 return true
10941 }
10942
10943
10944
10945 for {
10946 a := v_0
10947 if v_1.Op != OpARMNMULF {
10948 break
10949 }
10950 y := v_1.Args[1]
10951 x := v_1.Args[0]
10952 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
10953 break
10954 }
10955 v.reset(OpARMMULAF)
10956 v.AddArg3(a, x, y)
10957 return true
10958 }
10959 return false
10960 }
10961 func rewriteValueARM_OpARMSUBS(v *Value) bool {
10962 v_1 := v.Args[1]
10963 v_0 := v.Args[0]
10964
10965
10966 for {
10967 x := v_0
10968 if v_1.Op != OpARMMOVWconst {
10969 break
10970 }
10971 c := auxIntToInt32(v_1.AuxInt)
10972 v.reset(OpARMSUBSconst)
10973 v.AuxInt = int32ToAuxInt(c)
10974 v.AddArg(x)
10975 return true
10976 }
10977
10978
10979 for {
10980 x := v_0
10981 if v_1.Op != OpARMSLLconst {
10982 break
10983 }
10984 c := auxIntToInt32(v_1.AuxInt)
10985 y := v_1.Args[0]
10986 v.reset(OpARMSUBSshiftLL)
10987 v.AuxInt = int32ToAuxInt(c)
10988 v.AddArg2(x, y)
10989 return true
10990 }
10991
10992
10993 for {
10994 if v_0.Op != OpARMSLLconst {
10995 break
10996 }
10997 c := auxIntToInt32(v_0.AuxInt)
10998 y := v_0.Args[0]
10999 x := v_1
11000 v.reset(OpARMRSBSshiftLL)
11001 v.AuxInt = int32ToAuxInt(c)
11002 v.AddArg2(x, y)
11003 return true
11004 }
11005
11006
11007 for {
11008 x := v_0
11009 if v_1.Op != OpARMSRLconst {
11010 break
11011 }
11012 c := auxIntToInt32(v_1.AuxInt)
11013 y := v_1.Args[0]
11014 v.reset(OpARMSUBSshiftRL)
11015 v.AuxInt = int32ToAuxInt(c)
11016 v.AddArg2(x, y)
11017 return true
11018 }
11019
11020
11021 for {
11022 if v_0.Op != OpARMSRLconst {
11023 break
11024 }
11025 c := auxIntToInt32(v_0.AuxInt)
11026 y := v_0.Args[0]
11027 x := v_1
11028 v.reset(OpARMRSBSshiftRL)
11029 v.AuxInt = int32ToAuxInt(c)
11030 v.AddArg2(x, y)
11031 return true
11032 }
11033
11034
11035 for {
11036 x := v_0
11037 if v_1.Op != OpARMSRAconst {
11038 break
11039 }
11040 c := auxIntToInt32(v_1.AuxInt)
11041 y := v_1.Args[0]
11042 v.reset(OpARMSUBSshiftRA)
11043 v.AuxInt = int32ToAuxInt(c)
11044 v.AddArg2(x, y)
11045 return true
11046 }
11047
11048
11049 for {
11050 if v_0.Op != OpARMSRAconst {
11051 break
11052 }
11053 c := auxIntToInt32(v_0.AuxInt)
11054 y := v_0.Args[0]
11055 x := v_1
11056 v.reset(OpARMRSBSshiftRA)
11057 v.AuxInt = int32ToAuxInt(c)
11058 v.AddArg2(x, y)
11059 return true
11060 }
11061
11062
11063 for {
11064 x := v_0
11065 if v_1.Op != OpARMSLL {
11066 break
11067 }
11068 z := v_1.Args[1]
11069 y := v_1.Args[0]
11070 v.reset(OpARMSUBSshiftLLreg)
11071 v.AddArg3(x, y, z)
11072 return true
11073 }
11074
11075
11076 for {
11077 if v_0.Op != OpARMSLL {
11078 break
11079 }
11080 z := v_0.Args[1]
11081 y := v_0.Args[0]
11082 x := v_1
11083 v.reset(OpARMRSBSshiftLLreg)
11084 v.AddArg3(x, y, z)
11085 return true
11086 }
11087
11088
11089 for {
11090 x := v_0
11091 if v_1.Op != OpARMSRL {
11092 break
11093 }
11094 z := v_1.Args[1]
11095 y := v_1.Args[0]
11096 v.reset(OpARMSUBSshiftRLreg)
11097 v.AddArg3(x, y, z)
11098 return true
11099 }
11100
11101
11102 for {
11103 if v_0.Op != OpARMSRL {
11104 break
11105 }
11106 z := v_0.Args[1]
11107 y := v_0.Args[0]
11108 x := v_1
11109 v.reset(OpARMRSBSshiftRLreg)
11110 v.AddArg3(x, y, z)
11111 return true
11112 }
11113
11114
11115 for {
11116 x := v_0
11117 if v_1.Op != OpARMSRA {
11118 break
11119 }
11120 z := v_1.Args[1]
11121 y := v_1.Args[0]
11122 v.reset(OpARMSUBSshiftRAreg)
11123 v.AddArg3(x, y, z)
11124 return true
11125 }
11126
11127
11128 for {
11129 if v_0.Op != OpARMSRA {
11130 break
11131 }
11132 z := v_0.Args[1]
11133 y := v_0.Args[0]
11134 x := v_1
11135 v.reset(OpARMRSBSshiftRAreg)
11136 v.AddArg3(x, y, z)
11137 return true
11138 }
11139 return false
11140 }
11141 func rewriteValueARM_OpARMSUBSshiftLL(v *Value) bool {
11142 v_1 := v.Args[1]
11143 v_0 := v.Args[0]
11144 b := v.Block
11145
11146
11147 for {
11148 d := auxIntToInt32(v.AuxInt)
11149 if v_0.Op != OpARMMOVWconst {
11150 break
11151 }
11152 c := auxIntToInt32(v_0.AuxInt)
11153 x := v_1
11154 v.reset(OpARMRSBSconst)
11155 v.AuxInt = int32ToAuxInt(c)
11156 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
11157 v0.AuxInt = int32ToAuxInt(d)
11158 v0.AddArg(x)
11159 v.AddArg(v0)
11160 return true
11161 }
11162
11163
11164 for {
11165 d := auxIntToInt32(v.AuxInt)
11166 x := v_0
11167 if v_1.Op != OpARMMOVWconst {
11168 break
11169 }
11170 c := auxIntToInt32(v_1.AuxInt)
11171 v.reset(OpARMSUBSconst)
11172 v.AuxInt = int32ToAuxInt(c << uint64(d))
11173 v.AddArg(x)
11174 return true
11175 }
11176 return false
11177 }
11178 func rewriteValueARM_OpARMSUBSshiftLLreg(v *Value) bool {
11179 v_2 := v.Args[2]
11180 v_1 := v.Args[1]
11181 v_0 := v.Args[0]
11182 b := v.Block
11183
11184
11185 for {
11186 if v_0.Op != OpARMMOVWconst {
11187 break
11188 }
11189 c := auxIntToInt32(v_0.AuxInt)
11190 x := v_1
11191 y := v_2
11192 v.reset(OpARMRSBSconst)
11193 v.AuxInt = int32ToAuxInt(c)
11194 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
11195 v0.AddArg2(x, y)
11196 v.AddArg(v0)
11197 return true
11198 }
11199
11200
11201
11202 for {
11203 x := v_0
11204 y := v_1
11205 if v_2.Op != OpARMMOVWconst {
11206 break
11207 }
11208 c := auxIntToInt32(v_2.AuxInt)
11209 if !(0 <= c && c < 32) {
11210 break
11211 }
11212 v.reset(OpARMSUBSshiftLL)
11213 v.AuxInt = int32ToAuxInt(c)
11214 v.AddArg2(x, y)
11215 return true
11216 }
11217 return false
11218 }
11219 func rewriteValueARM_OpARMSUBSshiftRA(v *Value) bool {
11220 v_1 := v.Args[1]
11221 v_0 := v.Args[0]
11222 b := v.Block
11223
11224
11225 for {
11226 d := auxIntToInt32(v.AuxInt)
11227 if v_0.Op != OpARMMOVWconst {
11228 break
11229 }
11230 c := auxIntToInt32(v_0.AuxInt)
11231 x := v_1
11232 v.reset(OpARMRSBSconst)
11233 v.AuxInt = int32ToAuxInt(c)
11234 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
11235 v0.AuxInt = int32ToAuxInt(d)
11236 v0.AddArg(x)
11237 v.AddArg(v0)
11238 return true
11239 }
11240
11241
11242 for {
11243 d := auxIntToInt32(v.AuxInt)
11244 x := v_0
11245 if v_1.Op != OpARMMOVWconst {
11246 break
11247 }
11248 c := auxIntToInt32(v_1.AuxInt)
11249 v.reset(OpARMSUBSconst)
11250 v.AuxInt = int32ToAuxInt(c >> uint64(d))
11251 v.AddArg(x)
11252 return true
11253 }
11254 return false
11255 }
11256 func rewriteValueARM_OpARMSUBSshiftRAreg(v *Value) bool {
11257 v_2 := v.Args[2]
11258 v_1 := v.Args[1]
11259 v_0 := v.Args[0]
11260 b := v.Block
11261
11262
11263 for {
11264 if v_0.Op != OpARMMOVWconst {
11265 break
11266 }
11267 c := auxIntToInt32(v_0.AuxInt)
11268 x := v_1
11269 y := v_2
11270 v.reset(OpARMRSBSconst)
11271 v.AuxInt = int32ToAuxInt(c)
11272 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
11273 v0.AddArg2(x, y)
11274 v.AddArg(v0)
11275 return true
11276 }
11277
11278
11279
11280 for {
11281 x := v_0
11282 y := v_1
11283 if v_2.Op != OpARMMOVWconst {
11284 break
11285 }
11286 c := auxIntToInt32(v_2.AuxInt)
11287 if !(0 <= c && c < 32) {
11288 break
11289 }
11290 v.reset(OpARMSUBSshiftRA)
11291 v.AuxInt = int32ToAuxInt(c)
11292 v.AddArg2(x, y)
11293 return true
11294 }
11295 return false
11296 }
11297 func rewriteValueARM_OpARMSUBSshiftRL(v *Value) bool {
11298 v_1 := v.Args[1]
11299 v_0 := v.Args[0]
11300 b := v.Block
11301
11302
11303 for {
11304 d := auxIntToInt32(v.AuxInt)
11305 if v_0.Op != OpARMMOVWconst {
11306 break
11307 }
11308 c := auxIntToInt32(v_0.AuxInt)
11309 x := v_1
11310 v.reset(OpARMRSBSconst)
11311 v.AuxInt = int32ToAuxInt(c)
11312 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
11313 v0.AuxInt = int32ToAuxInt(d)
11314 v0.AddArg(x)
11315 v.AddArg(v0)
11316 return true
11317 }
11318
11319
11320 for {
11321 d := auxIntToInt32(v.AuxInt)
11322 x := v_0
11323 if v_1.Op != OpARMMOVWconst {
11324 break
11325 }
11326 c := auxIntToInt32(v_1.AuxInt)
11327 v.reset(OpARMSUBSconst)
11328 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
11329 v.AddArg(x)
11330 return true
11331 }
11332 return false
11333 }
11334 func rewriteValueARM_OpARMSUBSshiftRLreg(v *Value) bool {
11335 v_2 := v.Args[2]
11336 v_1 := v.Args[1]
11337 v_0 := v.Args[0]
11338 b := v.Block
11339
11340
11341 for {
11342 if v_0.Op != OpARMMOVWconst {
11343 break
11344 }
11345 c := auxIntToInt32(v_0.AuxInt)
11346 x := v_1
11347 y := v_2
11348 v.reset(OpARMRSBSconst)
11349 v.AuxInt = int32ToAuxInt(c)
11350 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
11351 v0.AddArg2(x, y)
11352 v.AddArg(v0)
11353 return true
11354 }
11355
11356
11357
11358 for {
11359 x := v_0
11360 y := v_1
11361 if v_2.Op != OpARMMOVWconst {
11362 break
11363 }
11364 c := auxIntToInt32(v_2.AuxInt)
11365 if !(0 <= c && c < 32) {
11366 break
11367 }
11368 v.reset(OpARMSUBSshiftRL)
11369 v.AuxInt = int32ToAuxInt(c)
11370 v.AddArg2(x, y)
11371 return true
11372 }
11373 return false
11374 }
11375 func rewriteValueARM_OpARMSUBconst(v *Value) bool {
11376 v_0 := v.Args[0]
11377
11378
11379 for {
11380 off1 := auxIntToInt32(v.AuxInt)
11381 if v_0.Op != OpARMMOVWaddr {
11382 break
11383 }
11384 off2 := auxIntToInt32(v_0.AuxInt)
11385 sym := auxToSym(v_0.Aux)
11386 ptr := v_0.Args[0]
11387 v.reset(OpARMMOVWaddr)
11388 v.AuxInt = int32ToAuxInt(off2 - off1)
11389 v.Aux = symToAux(sym)
11390 v.AddArg(ptr)
11391 return true
11392 }
11393
11394
11395 for {
11396 if auxIntToInt32(v.AuxInt) != 0 {
11397 break
11398 }
11399 x := v_0
11400 v.copyOf(x)
11401 return true
11402 }
11403
11404
11405
11406 for {
11407 c := auxIntToInt32(v.AuxInt)
11408 x := v_0
11409 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) {
11410 break
11411 }
11412 v.reset(OpARMADDconst)
11413 v.AuxInt = int32ToAuxInt(-c)
11414 v.AddArg(x)
11415 return true
11416 }
11417
11418
11419
11420 for {
11421 c := auxIntToInt32(v.AuxInt)
11422 x := v_0
11423 if !(buildcfg.GOARM.Version == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && uint32(-c) <= 0xffff) {
11424 break
11425 }
11426 v.reset(OpARMADDconst)
11427 v.AuxInt = int32ToAuxInt(-c)
11428 v.AddArg(x)
11429 return true
11430 }
11431
11432
11433 for {
11434 c := auxIntToInt32(v.AuxInt)
11435 if v_0.Op != OpARMMOVWconst {
11436 break
11437 }
11438 d := auxIntToInt32(v_0.AuxInt)
11439 v.reset(OpARMMOVWconst)
11440 v.AuxInt = int32ToAuxInt(d - c)
11441 return true
11442 }
11443
11444
11445 for {
11446 c := auxIntToInt32(v.AuxInt)
11447 if v_0.Op != OpARMSUBconst {
11448 break
11449 }
11450 d := auxIntToInt32(v_0.AuxInt)
11451 x := v_0.Args[0]
11452 v.reset(OpARMADDconst)
11453 v.AuxInt = int32ToAuxInt(-c - d)
11454 v.AddArg(x)
11455 return true
11456 }
11457
11458
11459 for {
11460 c := auxIntToInt32(v.AuxInt)
11461 if v_0.Op != OpARMADDconst {
11462 break
11463 }
11464 d := auxIntToInt32(v_0.AuxInt)
11465 x := v_0.Args[0]
11466 v.reset(OpARMADDconst)
11467 v.AuxInt = int32ToAuxInt(-c + d)
11468 v.AddArg(x)
11469 return true
11470 }
11471
11472
11473 for {
11474 c := auxIntToInt32(v.AuxInt)
11475 if v_0.Op != OpARMRSBconst {
11476 break
11477 }
11478 d := auxIntToInt32(v_0.AuxInt)
11479 x := v_0.Args[0]
11480 v.reset(OpARMRSBconst)
11481 v.AuxInt = int32ToAuxInt(-c + d)
11482 v.AddArg(x)
11483 return true
11484 }
11485 return false
11486 }
11487 func rewriteValueARM_OpARMSUBshiftLL(v *Value) bool {
11488 v_1 := v.Args[1]
11489 v_0 := v.Args[0]
11490 b := v.Block
11491
11492
11493 for {
11494 d := auxIntToInt32(v.AuxInt)
11495 if v_0.Op != OpARMMOVWconst {
11496 break
11497 }
11498 c := auxIntToInt32(v_0.AuxInt)
11499 x := v_1
11500 v.reset(OpARMRSBconst)
11501 v.AuxInt = int32ToAuxInt(c)
11502 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
11503 v0.AuxInt = int32ToAuxInt(d)
11504 v0.AddArg(x)
11505 v.AddArg(v0)
11506 return true
11507 }
11508
11509
11510 for {
11511 d := auxIntToInt32(v.AuxInt)
11512 x := v_0
11513 if v_1.Op != OpARMMOVWconst {
11514 break
11515 }
11516 c := auxIntToInt32(v_1.AuxInt)
11517 v.reset(OpARMSUBconst)
11518 v.AuxInt = int32ToAuxInt(c << uint64(d))
11519 v.AddArg(x)
11520 return true
11521 }
11522
11523
11524 for {
11525 c := auxIntToInt32(v.AuxInt)
11526 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c {
11527 break
11528 }
11529 x := v_0.Args[0]
11530 if x != v_1 {
11531 break
11532 }
11533 v.reset(OpARMMOVWconst)
11534 v.AuxInt = int32ToAuxInt(0)
11535 return true
11536 }
11537 return false
11538 }
11539 func rewriteValueARM_OpARMSUBshiftLLreg(v *Value) bool {
11540 v_2 := v.Args[2]
11541 v_1 := v.Args[1]
11542 v_0 := v.Args[0]
11543 b := v.Block
11544
11545
11546 for {
11547 if v_0.Op != OpARMMOVWconst {
11548 break
11549 }
11550 c := auxIntToInt32(v_0.AuxInt)
11551 x := v_1
11552 y := v_2
11553 v.reset(OpARMRSBconst)
11554 v.AuxInt = int32ToAuxInt(c)
11555 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
11556 v0.AddArg2(x, y)
11557 v.AddArg(v0)
11558 return true
11559 }
11560
11561
11562
11563 for {
11564 x := v_0
11565 y := v_1
11566 if v_2.Op != OpARMMOVWconst {
11567 break
11568 }
11569 c := auxIntToInt32(v_2.AuxInt)
11570 if !(0 <= c && c < 32) {
11571 break
11572 }
11573 v.reset(OpARMSUBshiftLL)
11574 v.AuxInt = int32ToAuxInt(c)
11575 v.AddArg2(x, y)
11576 return true
11577 }
11578 return false
11579 }
11580 func rewriteValueARM_OpARMSUBshiftRA(v *Value) bool {
11581 v_1 := v.Args[1]
11582 v_0 := v.Args[0]
11583 b := v.Block
11584
11585
11586 for {
11587 d := auxIntToInt32(v.AuxInt)
11588 if v_0.Op != OpARMMOVWconst {
11589 break
11590 }
11591 c := auxIntToInt32(v_0.AuxInt)
11592 x := v_1
11593 v.reset(OpARMRSBconst)
11594 v.AuxInt = int32ToAuxInt(c)
11595 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
11596 v0.AuxInt = int32ToAuxInt(d)
11597 v0.AddArg(x)
11598 v.AddArg(v0)
11599 return true
11600 }
11601
11602
11603 for {
11604 d := auxIntToInt32(v.AuxInt)
11605 x := v_0
11606 if v_1.Op != OpARMMOVWconst {
11607 break
11608 }
11609 c := auxIntToInt32(v_1.AuxInt)
11610 v.reset(OpARMSUBconst)
11611 v.AuxInt = int32ToAuxInt(c >> uint64(d))
11612 v.AddArg(x)
11613 return true
11614 }
11615
11616
11617 for {
11618 c := auxIntToInt32(v.AuxInt)
11619 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c {
11620 break
11621 }
11622 x := v_0.Args[0]
11623 if x != v_1 {
11624 break
11625 }
11626 v.reset(OpARMMOVWconst)
11627 v.AuxInt = int32ToAuxInt(0)
11628 return true
11629 }
11630 return false
11631 }
11632 func rewriteValueARM_OpARMSUBshiftRAreg(v *Value) bool {
11633 v_2 := v.Args[2]
11634 v_1 := v.Args[1]
11635 v_0 := v.Args[0]
11636 b := v.Block
11637
11638
11639 for {
11640 if v_0.Op != OpARMMOVWconst {
11641 break
11642 }
11643 c := auxIntToInt32(v_0.AuxInt)
11644 x := v_1
11645 y := v_2
11646 v.reset(OpARMRSBconst)
11647 v.AuxInt = int32ToAuxInt(c)
11648 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
11649 v0.AddArg2(x, y)
11650 v.AddArg(v0)
11651 return true
11652 }
11653
11654
11655
11656 for {
11657 x := v_0
11658 y := v_1
11659 if v_2.Op != OpARMMOVWconst {
11660 break
11661 }
11662 c := auxIntToInt32(v_2.AuxInt)
11663 if !(0 <= c && c < 32) {
11664 break
11665 }
11666 v.reset(OpARMSUBshiftRA)
11667 v.AuxInt = int32ToAuxInt(c)
11668 v.AddArg2(x, y)
11669 return true
11670 }
11671 return false
11672 }
11673 func rewriteValueARM_OpARMSUBshiftRL(v *Value) bool {
11674 v_1 := v.Args[1]
11675 v_0 := v.Args[0]
11676 b := v.Block
11677
11678
11679 for {
11680 d := auxIntToInt32(v.AuxInt)
11681 if v_0.Op != OpARMMOVWconst {
11682 break
11683 }
11684 c := auxIntToInt32(v_0.AuxInt)
11685 x := v_1
11686 v.reset(OpARMRSBconst)
11687 v.AuxInt = int32ToAuxInt(c)
11688 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
11689 v0.AuxInt = int32ToAuxInt(d)
11690 v0.AddArg(x)
11691 v.AddArg(v0)
11692 return true
11693 }
11694
11695
11696 for {
11697 d := auxIntToInt32(v.AuxInt)
11698 x := v_0
11699 if v_1.Op != OpARMMOVWconst {
11700 break
11701 }
11702 c := auxIntToInt32(v_1.AuxInt)
11703 v.reset(OpARMSUBconst)
11704 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
11705 v.AddArg(x)
11706 return true
11707 }
11708
11709
11710 for {
11711 c := auxIntToInt32(v.AuxInt)
11712 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c {
11713 break
11714 }
11715 x := v_0.Args[0]
11716 if x != v_1 {
11717 break
11718 }
11719 v.reset(OpARMMOVWconst)
11720 v.AuxInt = int32ToAuxInt(0)
11721 return true
11722 }
11723 return false
11724 }
11725 func rewriteValueARM_OpARMSUBshiftRLreg(v *Value) bool {
11726 v_2 := v.Args[2]
11727 v_1 := v.Args[1]
11728 v_0 := v.Args[0]
11729 b := v.Block
11730
11731
11732 for {
11733 if v_0.Op != OpARMMOVWconst {
11734 break
11735 }
11736 c := auxIntToInt32(v_0.AuxInt)
11737 x := v_1
11738 y := v_2
11739 v.reset(OpARMRSBconst)
11740 v.AuxInt = int32ToAuxInt(c)
11741 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
11742 v0.AddArg2(x, y)
11743 v.AddArg(v0)
11744 return true
11745 }
11746
11747
11748
11749 for {
11750 x := v_0
11751 y := v_1
11752 if v_2.Op != OpARMMOVWconst {
11753 break
11754 }
11755 c := auxIntToInt32(v_2.AuxInt)
11756 if !(0 <= c && c < 32) {
11757 break
11758 }
11759 v.reset(OpARMSUBshiftRL)
11760 v.AuxInt = int32ToAuxInt(c)
11761 v.AddArg2(x, y)
11762 return true
11763 }
11764 return false
11765 }
11766 func rewriteValueARM_OpARMTEQ(v *Value) bool {
11767 v_1 := v.Args[1]
11768 v_0 := v.Args[0]
11769
11770
11771 for {
11772 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11773 x := v_0
11774 if v_1.Op != OpARMMOVWconst {
11775 continue
11776 }
11777 c := auxIntToInt32(v_1.AuxInt)
11778 v.reset(OpARMTEQconst)
11779 v.AuxInt = int32ToAuxInt(c)
11780 v.AddArg(x)
11781 return true
11782 }
11783 break
11784 }
11785
11786
11787 for {
11788 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11789 x := v_0
11790 if v_1.Op != OpARMSLLconst {
11791 continue
11792 }
11793 c := auxIntToInt32(v_1.AuxInt)
11794 y := v_1.Args[0]
11795 v.reset(OpARMTEQshiftLL)
11796 v.AuxInt = int32ToAuxInt(c)
11797 v.AddArg2(x, y)
11798 return true
11799 }
11800 break
11801 }
11802
11803
11804 for {
11805 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11806 x := v_0
11807 if v_1.Op != OpARMSRLconst {
11808 continue
11809 }
11810 c := auxIntToInt32(v_1.AuxInt)
11811 y := v_1.Args[0]
11812 v.reset(OpARMTEQshiftRL)
11813 v.AuxInt = int32ToAuxInt(c)
11814 v.AddArg2(x, y)
11815 return true
11816 }
11817 break
11818 }
11819
11820
11821 for {
11822 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11823 x := v_0
11824 if v_1.Op != OpARMSRAconst {
11825 continue
11826 }
11827 c := auxIntToInt32(v_1.AuxInt)
11828 y := v_1.Args[0]
11829 v.reset(OpARMTEQshiftRA)
11830 v.AuxInt = int32ToAuxInt(c)
11831 v.AddArg2(x, y)
11832 return true
11833 }
11834 break
11835 }
11836
11837
11838 for {
11839 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11840 x := v_0
11841 if v_1.Op != OpARMSLL {
11842 continue
11843 }
11844 z := v_1.Args[1]
11845 y := v_1.Args[0]
11846 v.reset(OpARMTEQshiftLLreg)
11847 v.AddArg3(x, y, z)
11848 return true
11849 }
11850 break
11851 }
11852
11853
11854 for {
11855 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11856 x := v_0
11857 if v_1.Op != OpARMSRL {
11858 continue
11859 }
11860 z := v_1.Args[1]
11861 y := v_1.Args[0]
11862 v.reset(OpARMTEQshiftRLreg)
11863 v.AddArg3(x, y, z)
11864 return true
11865 }
11866 break
11867 }
11868
11869
11870 for {
11871 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11872 x := v_0
11873 if v_1.Op != OpARMSRA {
11874 continue
11875 }
11876 z := v_1.Args[1]
11877 y := v_1.Args[0]
11878 v.reset(OpARMTEQshiftRAreg)
11879 v.AddArg3(x, y, z)
11880 return true
11881 }
11882 break
11883 }
11884 return false
11885 }
11886 func rewriteValueARM_OpARMTEQconst(v *Value) bool {
11887 v_0 := v.Args[0]
11888
11889
11890 for {
11891 y := auxIntToInt32(v.AuxInt)
11892 if v_0.Op != OpARMMOVWconst {
11893 break
11894 }
11895 x := auxIntToInt32(v_0.AuxInt)
11896 v.reset(OpARMFlagConstant)
11897 v.AuxInt = flagConstantToAuxInt(logicFlags32(x ^ y))
11898 return true
11899 }
11900 return false
11901 }
11902 func rewriteValueARM_OpARMTEQshiftLL(v *Value) bool {
11903 v_1 := v.Args[1]
11904 v_0 := v.Args[0]
11905 b := v.Block
11906
11907
11908 for {
11909 d := auxIntToInt32(v.AuxInt)
11910 if v_0.Op != OpARMMOVWconst {
11911 break
11912 }
11913 c := auxIntToInt32(v_0.AuxInt)
11914 x := v_1
11915 v.reset(OpARMTEQconst)
11916 v.AuxInt = int32ToAuxInt(c)
11917 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
11918 v0.AuxInt = int32ToAuxInt(d)
11919 v0.AddArg(x)
11920 v.AddArg(v0)
11921 return true
11922 }
11923
11924
11925 for {
11926 d := auxIntToInt32(v.AuxInt)
11927 x := v_0
11928 if v_1.Op != OpARMMOVWconst {
11929 break
11930 }
11931 c := auxIntToInt32(v_1.AuxInt)
11932 v.reset(OpARMTEQconst)
11933 v.AuxInt = int32ToAuxInt(c << uint64(d))
11934 v.AddArg(x)
11935 return true
11936 }
11937 return false
11938 }
11939 func rewriteValueARM_OpARMTEQshiftLLreg(v *Value) bool {
11940 v_2 := v.Args[2]
11941 v_1 := v.Args[1]
11942 v_0 := v.Args[0]
11943 b := v.Block
11944
11945
11946 for {
11947 if v_0.Op != OpARMMOVWconst {
11948 break
11949 }
11950 c := auxIntToInt32(v_0.AuxInt)
11951 x := v_1
11952 y := v_2
11953 v.reset(OpARMTEQconst)
11954 v.AuxInt = int32ToAuxInt(c)
11955 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
11956 v0.AddArg2(x, y)
11957 v.AddArg(v0)
11958 return true
11959 }
11960
11961
11962
11963 for {
11964 x := v_0
11965 y := v_1
11966 if v_2.Op != OpARMMOVWconst {
11967 break
11968 }
11969 c := auxIntToInt32(v_2.AuxInt)
11970 if !(0 <= c && c < 32) {
11971 break
11972 }
11973 v.reset(OpARMTEQshiftLL)
11974 v.AuxInt = int32ToAuxInt(c)
11975 v.AddArg2(x, y)
11976 return true
11977 }
11978 return false
11979 }
11980 func rewriteValueARM_OpARMTEQshiftRA(v *Value) bool {
11981 v_1 := v.Args[1]
11982 v_0 := v.Args[0]
11983 b := v.Block
11984
11985
11986 for {
11987 d := auxIntToInt32(v.AuxInt)
11988 if v_0.Op != OpARMMOVWconst {
11989 break
11990 }
11991 c := auxIntToInt32(v_0.AuxInt)
11992 x := v_1
11993 v.reset(OpARMTEQconst)
11994 v.AuxInt = int32ToAuxInt(c)
11995 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
11996 v0.AuxInt = int32ToAuxInt(d)
11997 v0.AddArg(x)
11998 v.AddArg(v0)
11999 return true
12000 }
12001
12002
12003 for {
12004 d := auxIntToInt32(v.AuxInt)
12005 x := v_0
12006 if v_1.Op != OpARMMOVWconst {
12007 break
12008 }
12009 c := auxIntToInt32(v_1.AuxInt)
12010 v.reset(OpARMTEQconst)
12011 v.AuxInt = int32ToAuxInt(c >> uint64(d))
12012 v.AddArg(x)
12013 return true
12014 }
12015 return false
12016 }
12017 func rewriteValueARM_OpARMTEQshiftRAreg(v *Value) bool {
12018 v_2 := v.Args[2]
12019 v_1 := v.Args[1]
12020 v_0 := v.Args[0]
12021 b := v.Block
12022
12023
12024 for {
12025 if v_0.Op != OpARMMOVWconst {
12026 break
12027 }
12028 c := auxIntToInt32(v_0.AuxInt)
12029 x := v_1
12030 y := v_2
12031 v.reset(OpARMTEQconst)
12032 v.AuxInt = int32ToAuxInt(c)
12033 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
12034 v0.AddArg2(x, y)
12035 v.AddArg(v0)
12036 return true
12037 }
12038
12039
12040
12041 for {
12042 x := v_0
12043 y := v_1
12044 if v_2.Op != OpARMMOVWconst {
12045 break
12046 }
12047 c := auxIntToInt32(v_2.AuxInt)
12048 if !(0 <= c && c < 32) {
12049 break
12050 }
12051 v.reset(OpARMTEQshiftRA)
12052 v.AuxInt = int32ToAuxInt(c)
12053 v.AddArg2(x, y)
12054 return true
12055 }
12056 return false
12057 }
12058 func rewriteValueARM_OpARMTEQshiftRL(v *Value) bool {
12059 v_1 := v.Args[1]
12060 v_0 := v.Args[0]
12061 b := v.Block
12062
12063
12064 for {
12065 d := auxIntToInt32(v.AuxInt)
12066 if v_0.Op != OpARMMOVWconst {
12067 break
12068 }
12069 c := auxIntToInt32(v_0.AuxInt)
12070 x := v_1
12071 v.reset(OpARMTEQconst)
12072 v.AuxInt = int32ToAuxInt(c)
12073 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
12074 v0.AuxInt = int32ToAuxInt(d)
12075 v0.AddArg(x)
12076 v.AddArg(v0)
12077 return true
12078 }
12079
12080
12081 for {
12082 d := auxIntToInt32(v.AuxInt)
12083 x := v_0
12084 if v_1.Op != OpARMMOVWconst {
12085 break
12086 }
12087 c := auxIntToInt32(v_1.AuxInt)
12088 v.reset(OpARMTEQconst)
12089 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
12090 v.AddArg(x)
12091 return true
12092 }
12093 return false
12094 }
12095 func rewriteValueARM_OpARMTEQshiftRLreg(v *Value) bool {
12096 v_2 := v.Args[2]
12097 v_1 := v.Args[1]
12098 v_0 := v.Args[0]
12099 b := v.Block
12100
12101
12102 for {
12103 if v_0.Op != OpARMMOVWconst {
12104 break
12105 }
12106 c := auxIntToInt32(v_0.AuxInt)
12107 x := v_1
12108 y := v_2
12109 v.reset(OpARMTEQconst)
12110 v.AuxInt = int32ToAuxInt(c)
12111 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
12112 v0.AddArg2(x, y)
12113 v.AddArg(v0)
12114 return true
12115 }
12116
12117
12118
12119 for {
12120 x := v_0
12121 y := v_1
12122 if v_2.Op != OpARMMOVWconst {
12123 break
12124 }
12125 c := auxIntToInt32(v_2.AuxInt)
12126 if !(0 <= c && c < 32) {
12127 break
12128 }
12129 v.reset(OpARMTEQshiftRL)
12130 v.AuxInt = int32ToAuxInt(c)
12131 v.AddArg2(x, y)
12132 return true
12133 }
12134 return false
12135 }
12136 func rewriteValueARM_OpARMTST(v *Value) bool {
12137 v_1 := v.Args[1]
12138 v_0 := v.Args[0]
12139
12140
12141 for {
12142 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12143 x := v_0
12144 if v_1.Op != OpARMMOVWconst {
12145 continue
12146 }
12147 c := auxIntToInt32(v_1.AuxInt)
12148 v.reset(OpARMTSTconst)
12149 v.AuxInt = int32ToAuxInt(c)
12150 v.AddArg(x)
12151 return true
12152 }
12153 break
12154 }
12155
12156
12157 for {
12158 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12159 x := v_0
12160 if v_1.Op != OpARMSLLconst {
12161 continue
12162 }
12163 c := auxIntToInt32(v_1.AuxInt)
12164 y := v_1.Args[0]
12165 v.reset(OpARMTSTshiftLL)
12166 v.AuxInt = int32ToAuxInt(c)
12167 v.AddArg2(x, y)
12168 return true
12169 }
12170 break
12171 }
12172
12173
12174 for {
12175 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12176 x := v_0
12177 if v_1.Op != OpARMSRLconst {
12178 continue
12179 }
12180 c := auxIntToInt32(v_1.AuxInt)
12181 y := v_1.Args[0]
12182 v.reset(OpARMTSTshiftRL)
12183 v.AuxInt = int32ToAuxInt(c)
12184 v.AddArg2(x, y)
12185 return true
12186 }
12187 break
12188 }
12189
12190
12191 for {
12192 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12193 x := v_0
12194 if v_1.Op != OpARMSRAconst {
12195 continue
12196 }
12197 c := auxIntToInt32(v_1.AuxInt)
12198 y := v_1.Args[0]
12199 v.reset(OpARMTSTshiftRA)
12200 v.AuxInt = int32ToAuxInt(c)
12201 v.AddArg2(x, y)
12202 return true
12203 }
12204 break
12205 }
12206
12207
12208 for {
12209 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12210 x := v_0
12211 if v_1.Op != OpARMSLL {
12212 continue
12213 }
12214 z := v_1.Args[1]
12215 y := v_1.Args[0]
12216 v.reset(OpARMTSTshiftLLreg)
12217 v.AddArg3(x, y, z)
12218 return true
12219 }
12220 break
12221 }
12222
12223
12224 for {
12225 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12226 x := v_0
12227 if v_1.Op != OpARMSRL {
12228 continue
12229 }
12230 z := v_1.Args[1]
12231 y := v_1.Args[0]
12232 v.reset(OpARMTSTshiftRLreg)
12233 v.AddArg3(x, y, z)
12234 return true
12235 }
12236 break
12237 }
12238
12239
12240 for {
12241 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12242 x := v_0
12243 if v_1.Op != OpARMSRA {
12244 continue
12245 }
12246 z := v_1.Args[1]
12247 y := v_1.Args[0]
12248 v.reset(OpARMTSTshiftRAreg)
12249 v.AddArg3(x, y, z)
12250 return true
12251 }
12252 break
12253 }
12254 return false
12255 }
12256 func rewriteValueARM_OpARMTSTconst(v *Value) bool {
12257 v_0 := v.Args[0]
12258
12259
12260 for {
12261 y := auxIntToInt32(v.AuxInt)
12262 if v_0.Op != OpARMMOVWconst {
12263 break
12264 }
12265 x := auxIntToInt32(v_0.AuxInt)
12266 v.reset(OpARMFlagConstant)
12267 v.AuxInt = flagConstantToAuxInt(logicFlags32(x & y))
12268 return true
12269 }
12270 return false
12271 }
12272 func rewriteValueARM_OpARMTSTshiftLL(v *Value) bool {
12273 v_1 := v.Args[1]
12274 v_0 := v.Args[0]
12275 b := v.Block
12276
12277
12278 for {
12279 d := auxIntToInt32(v.AuxInt)
12280 if v_0.Op != OpARMMOVWconst {
12281 break
12282 }
12283 c := auxIntToInt32(v_0.AuxInt)
12284 x := v_1
12285 v.reset(OpARMTSTconst)
12286 v.AuxInt = int32ToAuxInt(c)
12287 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
12288 v0.AuxInt = int32ToAuxInt(d)
12289 v0.AddArg(x)
12290 v.AddArg(v0)
12291 return true
12292 }
12293
12294
12295 for {
12296 d := auxIntToInt32(v.AuxInt)
12297 x := v_0
12298 if v_1.Op != OpARMMOVWconst {
12299 break
12300 }
12301 c := auxIntToInt32(v_1.AuxInt)
12302 v.reset(OpARMTSTconst)
12303 v.AuxInt = int32ToAuxInt(c << uint64(d))
12304 v.AddArg(x)
12305 return true
12306 }
12307 return false
12308 }
12309 func rewriteValueARM_OpARMTSTshiftLLreg(v *Value) bool {
12310 v_2 := v.Args[2]
12311 v_1 := v.Args[1]
12312 v_0 := v.Args[0]
12313 b := v.Block
12314
12315
12316 for {
12317 if v_0.Op != OpARMMOVWconst {
12318 break
12319 }
12320 c := auxIntToInt32(v_0.AuxInt)
12321 x := v_1
12322 y := v_2
12323 v.reset(OpARMTSTconst)
12324 v.AuxInt = int32ToAuxInt(c)
12325 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
12326 v0.AddArg2(x, y)
12327 v.AddArg(v0)
12328 return true
12329 }
12330
12331
12332
12333 for {
12334 x := v_0
12335 y := v_1
12336 if v_2.Op != OpARMMOVWconst {
12337 break
12338 }
12339 c := auxIntToInt32(v_2.AuxInt)
12340 if !(0 <= c && c < 32) {
12341 break
12342 }
12343 v.reset(OpARMTSTshiftLL)
12344 v.AuxInt = int32ToAuxInt(c)
12345 v.AddArg2(x, y)
12346 return true
12347 }
12348 return false
12349 }
12350 func rewriteValueARM_OpARMTSTshiftRA(v *Value) bool {
12351 v_1 := v.Args[1]
12352 v_0 := v.Args[0]
12353 b := v.Block
12354
12355
12356 for {
12357 d := auxIntToInt32(v.AuxInt)
12358 if v_0.Op != OpARMMOVWconst {
12359 break
12360 }
12361 c := auxIntToInt32(v_0.AuxInt)
12362 x := v_1
12363 v.reset(OpARMTSTconst)
12364 v.AuxInt = int32ToAuxInt(c)
12365 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
12366 v0.AuxInt = int32ToAuxInt(d)
12367 v0.AddArg(x)
12368 v.AddArg(v0)
12369 return true
12370 }
12371
12372
12373 for {
12374 d := auxIntToInt32(v.AuxInt)
12375 x := v_0
12376 if v_1.Op != OpARMMOVWconst {
12377 break
12378 }
12379 c := auxIntToInt32(v_1.AuxInt)
12380 v.reset(OpARMTSTconst)
12381 v.AuxInt = int32ToAuxInt(c >> uint64(d))
12382 v.AddArg(x)
12383 return true
12384 }
12385 return false
12386 }
12387 func rewriteValueARM_OpARMTSTshiftRAreg(v *Value) bool {
12388 v_2 := v.Args[2]
12389 v_1 := v.Args[1]
12390 v_0 := v.Args[0]
12391 b := v.Block
12392
12393
12394 for {
12395 if v_0.Op != OpARMMOVWconst {
12396 break
12397 }
12398 c := auxIntToInt32(v_0.AuxInt)
12399 x := v_1
12400 y := v_2
12401 v.reset(OpARMTSTconst)
12402 v.AuxInt = int32ToAuxInt(c)
12403 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
12404 v0.AddArg2(x, y)
12405 v.AddArg(v0)
12406 return true
12407 }
12408
12409
12410
12411 for {
12412 x := v_0
12413 y := v_1
12414 if v_2.Op != OpARMMOVWconst {
12415 break
12416 }
12417 c := auxIntToInt32(v_2.AuxInt)
12418 if !(0 <= c && c < 32) {
12419 break
12420 }
12421 v.reset(OpARMTSTshiftRA)
12422 v.AuxInt = int32ToAuxInt(c)
12423 v.AddArg2(x, y)
12424 return true
12425 }
12426 return false
12427 }
12428 func rewriteValueARM_OpARMTSTshiftRL(v *Value) bool {
12429 v_1 := v.Args[1]
12430 v_0 := v.Args[0]
12431 b := v.Block
12432
12433
12434 for {
12435 d := auxIntToInt32(v.AuxInt)
12436 if v_0.Op != OpARMMOVWconst {
12437 break
12438 }
12439 c := auxIntToInt32(v_0.AuxInt)
12440 x := v_1
12441 v.reset(OpARMTSTconst)
12442 v.AuxInt = int32ToAuxInt(c)
12443 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
12444 v0.AuxInt = int32ToAuxInt(d)
12445 v0.AddArg(x)
12446 v.AddArg(v0)
12447 return true
12448 }
12449
12450
12451 for {
12452 d := auxIntToInt32(v.AuxInt)
12453 x := v_0
12454 if v_1.Op != OpARMMOVWconst {
12455 break
12456 }
12457 c := auxIntToInt32(v_1.AuxInt)
12458 v.reset(OpARMTSTconst)
12459 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
12460 v.AddArg(x)
12461 return true
12462 }
12463 return false
12464 }
12465 func rewriteValueARM_OpARMTSTshiftRLreg(v *Value) bool {
12466 v_2 := v.Args[2]
12467 v_1 := v.Args[1]
12468 v_0 := v.Args[0]
12469 b := v.Block
12470
12471
12472 for {
12473 if v_0.Op != OpARMMOVWconst {
12474 break
12475 }
12476 c := auxIntToInt32(v_0.AuxInt)
12477 x := v_1
12478 y := v_2
12479 v.reset(OpARMTSTconst)
12480 v.AuxInt = int32ToAuxInt(c)
12481 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
12482 v0.AddArg2(x, y)
12483 v.AddArg(v0)
12484 return true
12485 }
12486
12487
12488
12489 for {
12490 x := v_0
12491 y := v_1
12492 if v_2.Op != OpARMMOVWconst {
12493 break
12494 }
12495 c := auxIntToInt32(v_2.AuxInt)
12496 if !(0 <= c && c < 32) {
12497 break
12498 }
12499 v.reset(OpARMTSTshiftRL)
12500 v.AuxInt = int32ToAuxInt(c)
12501 v.AddArg2(x, y)
12502 return true
12503 }
12504 return false
12505 }
12506 func rewriteValueARM_OpARMXOR(v *Value) bool {
12507 v_1 := v.Args[1]
12508 v_0 := v.Args[0]
12509
12510
12511 for {
12512 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12513 x := v_0
12514 if v_1.Op != OpARMMOVWconst {
12515 continue
12516 }
12517 c := auxIntToInt32(v_1.AuxInt)
12518 v.reset(OpARMXORconst)
12519 v.AuxInt = int32ToAuxInt(c)
12520 v.AddArg(x)
12521 return true
12522 }
12523 break
12524 }
12525
12526
12527 for {
12528 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12529 x := v_0
12530 if v_1.Op != OpARMSLLconst {
12531 continue
12532 }
12533 c := auxIntToInt32(v_1.AuxInt)
12534 y := v_1.Args[0]
12535 v.reset(OpARMXORshiftLL)
12536 v.AuxInt = int32ToAuxInt(c)
12537 v.AddArg2(x, y)
12538 return true
12539 }
12540 break
12541 }
12542
12543
12544 for {
12545 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12546 x := v_0
12547 if v_1.Op != OpARMSRLconst {
12548 continue
12549 }
12550 c := auxIntToInt32(v_1.AuxInt)
12551 y := v_1.Args[0]
12552 v.reset(OpARMXORshiftRL)
12553 v.AuxInt = int32ToAuxInt(c)
12554 v.AddArg2(x, y)
12555 return true
12556 }
12557 break
12558 }
12559
12560
12561 for {
12562 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12563 x := v_0
12564 if v_1.Op != OpARMSRAconst {
12565 continue
12566 }
12567 c := auxIntToInt32(v_1.AuxInt)
12568 y := v_1.Args[0]
12569 v.reset(OpARMXORshiftRA)
12570 v.AuxInt = int32ToAuxInt(c)
12571 v.AddArg2(x, y)
12572 return true
12573 }
12574 break
12575 }
12576
12577
12578 for {
12579 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12580 x := v_0
12581 if v_1.Op != OpARMSRRconst {
12582 continue
12583 }
12584 c := auxIntToInt32(v_1.AuxInt)
12585 y := v_1.Args[0]
12586 v.reset(OpARMXORshiftRR)
12587 v.AuxInt = int32ToAuxInt(c)
12588 v.AddArg2(x, y)
12589 return true
12590 }
12591 break
12592 }
12593
12594
12595 for {
12596 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12597 x := v_0
12598 if v_1.Op != OpARMSLL {
12599 continue
12600 }
12601 z := v_1.Args[1]
12602 y := v_1.Args[0]
12603 v.reset(OpARMXORshiftLLreg)
12604 v.AddArg3(x, y, z)
12605 return true
12606 }
12607 break
12608 }
12609
12610
12611 for {
12612 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12613 x := v_0
12614 if v_1.Op != OpARMSRL {
12615 continue
12616 }
12617 z := v_1.Args[1]
12618 y := v_1.Args[0]
12619 v.reset(OpARMXORshiftRLreg)
12620 v.AddArg3(x, y, z)
12621 return true
12622 }
12623 break
12624 }
12625
12626
12627 for {
12628 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12629 x := v_0
12630 if v_1.Op != OpARMSRA {
12631 continue
12632 }
12633 z := v_1.Args[1]
12634 y := v_1.Args[0]
12635 v.reset(OpARMXORshiftRAreg)
12636 v.AddArg3(x, y, z)
12637 return true
12638 }
12639 break
12640 }
12641
12642
12643 for {
12644 x := v_0
12645 if x != v_1 {
12646 break
12647 }
12648 v.reset(OpARMMOVWconst)
12649 v.AuxInt = int32ToAuxInt(0)
12650 return true
12651 }
12652 return false
12653 }
12654 func rewriteValueARM_OpARMXORconst(v *Value) bool {
12655 v_0 := v.Args[0]
12656
12657
12658 for {
12659 if auxIntToInt32(v.AuxInt) != 0 {
12660 break
12661 }
12662 x := v_0
12663 v.copyOf(x)
12664 return true
12665 }
12666
12667
12668 for {
12669 c := auxIntToInt32(v.AuxInt)
12670 if v_0.Op != OpARMMOVWconst {
12671 break
12672 }
12673 d := auxIntToInt32(v_0.AuxInt)
12674 v.reset(OpARMMOVWconst)
12675 v.AuxInt = int32ToAuxInt(c ^ d)
12676 return true
12677 }
12678
12679
12680 for {
12681 c := auxIntToInt32(v.AuxInt)
12682 if v_0.Op != OpARMXORconst {
12683 break
12684 }
12685 d := auxIntToInt32(v_0.AuxInt)
12686 x := v_0.Args[0]
12687 v.reset(OpARMXORconst)
12688 v.AuxInt = int32ToAuxInt(c ^ d)
12689 v.AddArg(x)
12690 return true
12691 }
12692 return false
12693 }
12694 func rewriteValueARM_OpARMXORshiftLL(v *Value) bool {
12695 v_1 := v.Args[1]
12696 v_0 := v.Args[0]
12697 b := v.Block
12698 typ := &b.Func.Config.Types
12699
12700
12701 for {
12702 d := auxIntToInt32(v.AuxInt)
12703 if v_0.Op != OpARMMOVWconst {
12704 break
12705 }
12706 c := auxIntToInt32(v_0.AuxInt)
12707 x := v_1
12708 v.reset(OpARMXORconst)
12709 v.AuxInt = int32ToAuxInt(c)
12710 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
12711 v0.AuxInt = int32ToAuxInt(d)
12712 v0.AddArg(x)
12713 v.AddArg(v0)
12714 return true
12715 }
12716
12717
12718 for {
12719 d := auxIntToInt32(v.AuxInt)
12720 x := v_0
12721 if v_1.Op != OpARMMOVWconst {
12722 break
12723 }
12724 c := auxIntToInt32(v_1.AuxInt)
12725 v.reset(OpARMXORconst)
12726 v.AuxInt = int32ToAuxInt(c << uint64(d))
12727 v.AddArg(x)
12728 return true
12729 }
12730
12731
12732 for {
12733 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMBFXU || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != int32(armBFAuxInt(8, 8)) {
12734 break
12735 }
12736 x := v_0.Args[0]
12737 if x != v_1 {
12738 break
12739 }
12740 v.reset(OpARMREV16)
12741 v.AddArg(x)
12742 return true
12743 }
12744
12745
12746
12747 for {
12748 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMSRLconst || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != 24 {
12749 break
12750 }
12751 v_0_0 := v_0.Args[0]
12752 if v_0_0.Op != OpARMSLLconst || auxIntToInt32(v_0_0.AuxInt) != 16 {
12753 break
12754 }
12755 x := v_0_0.Args[0]
12756 if x != v_1 || !(buildcfg.GOARM.Version >= 6) {
12757 break
12758 }
12759 v.reset(OpARMREV16)
12760 v.AddArg(x)
12761 return true
12762 }
12763
12764
12765 for {
12766 c := auxIntToInt32(v.AuxInt)
12767 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c {
12768 break
12769 }
12770 x := v_0.Args[0]
12771 if x != v_1 {
12772 break
12773 }
12774 v.reset(OpARMMOVWconst)
12775 v.AuxInt = int32ToAuxInt(0)
12776 return true
12777 }
12778 return false
12779 }
12780 func rewriteValueARM_OpARMXORshiftLLreg(v *Value) bool {
12781 v_2 := v.Args[2]
12782 v_1 := v.Args[1]
12783 v_0 := v.Args[0]
12784 b := v.Block
12785
12786
12787 for {
12788 if v_0.Op != OpARMMOVWconst {
12789 break
12790 }
12791 c := auxIntToInt32(v_0.AuxInt)
12792 x := v_1
12793 y := v_2
12794 v.reset(OpARMXORconst)
12795 v.AuxInt = int32ToAuxInt(c)
12796 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
12797 v0.AddArg2(x, y)
12798 v.AddArg(v0)
12799 return true
12800 }
12801
12802
12803
12804 for {
12805 x := v_0
12806 y := v_1
12807 if v_2.Op != OpARMMOVWconst {
12808 break
12809 }
12810 c := auxIntToInt32(v_2.AuxInt)
12811 if !(0 <= c && c < 32) {
12812 break
12813 }
12814 v.reset(OpARMXORshiftLL)
12815 v.AuxInt = int32ToAuxInt(c)
12816 v.AddArg2(x, y)
12817 return true
12818 }
12819 return false
12820 }
12821 func rewriteValueARM_OpARMXORshiftRA(v *Value) bool {
12822 v_1 := v.Args[1]
12823 v_0 := v.Args[0]
12824 b := v.Block
12825
12826
12827 for {
12828 d := auxIntToInt32(v.AuxInt)
12829 if v_0.Op != OpARMMOVWconst {
12830 break
12831 }
12832 c := auxIntToInt32(v_0.AuxInt)
12833 x := v_1
12834 v.reset(OpARMXORconst)
12835 v.AuxInt = int32ToAuxInt(c)
12836 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
12837 v0.AuxInt = int32ToAuxInt(d)
12838 v0.AddArg(x)
12839 v.AddArg(v0)
12840 return true
12841 }
12842
12843
12844 for {
12845 d := auxIntToInt32(v.AuxInt)
12846 x := v_0
12847 if v_1.Op != OpARMMOVWconst {
12848 break
12849 }
12850 c := auxIntToInt32(v_1.AuxInt)
12851 v.reset(OpARMXORconst)
12852 v.AuxInt = int32ToAuxInt(c >> uint64(d))
12853 v.AddArg(x)
12854 return true
12855 }
12856
12857
12858 for {
12859 c := auxIntToInt32(v.AuxInt)
12860 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c {
12861 break
12862 }
12863 x := v_0.Args[0]
12864 if x != v_1 {
12865 break
12866 }
12867 v.reset(OpARMMOVWconst)
12868 v.AuxInt = int32ToAuxInt(0)
12869 return true
12870 }
12871 return false
12872 }
12873 func rewriteValueARM_OpARMXORshiftRAreg(v *Value) bool {
12874 v_2 := v.Args[2]
12875 v_1 := v.Args[1]
12876 v_0 := v.Args[0]
12877 b := v.Block
12878
12879
12880 for {
12881 if v_0.Op != OpARMMOVWconst {
12882 break
12883 }
12884 c := auxIntToInt32(v_0.AuxInt)
12885 x := v_1
12886 y := v_2
12887 v.reset(OpARMXORconst)
12888 v.AuxInt = int32ToAuxInt(c)
12889 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
12890 v0.AddArg2(x, y)
12891 v.AddArg(v0)
12892 return true
12893 }
12894
12895
12896
12897 for {
12898 x := v_0
12899 y := v_1
12900 if v_2.Op != OpARMMOVWconst {
12901 break
12902 }
12903 c := auxIntToInt32(v_2.AuxInt)
12904 if !(0 <= c && c < 32) {
12905 break
12906 }
12907 v.reset(OpARMXORshiftRA)
12908 v.AuxInt = int32ToAuxInt(c)
12909 v.AddArg2(x, y)
12910 return true
12911 }
12912 return false
12913 }
12914 func rewriteValueARM_OpARMXORshiftRL(v *Value) bool {
12915 v_1 := v.Args[1]
12916 v_0 := v.Args[0]
12917 b := v.Block
12918
12919
12920 for {
12921 d := auxIntToInt32(v.AuxInt)
12922 if v_0.Op != OpARMMOVWconst {
12923 break
12924 }
12925 c := auxIntToInt32(v_0.AuxInt)
12926 x := v_1
12927 v.reset(OpARMXORconst)
12928 v.AuxInt = int32ToAuxInt(c)
12929 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
12930 v0.AuxInt = int32ToAuxInt(d)
12931 v0.AddArg(x)
12932 v.AddArg(v0)
12933 return true
12934 }
12935
12936
12937 for {
12938 d := auxIntToInt32(v.AuxInt)
12939 x := v_0
12940 if v_1.Op != OpARMMOVWconst {
12941 break
12942 }
12943 c := auxIntToInt32(v_1.AuxInt)
12944 v.reset(OpARMXORconst)
12945 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
12946 v.AddArg(x)
12947 return true
12948 }
12949
12950
12951 for {
12952 c := auxIntToInt32(v.AuxInt)
12953 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c {
12954 break
12955 }
12956 x := v_0.Args[0]
12957 if x != v_1 {
12958 break
12959 }
12960 v.reset(OpARMMOVWconst)
12961 v.AuxInt = int32ToAuxInt(0)
12962 return true
12963 }
12964 return false
12965 }
12966 func rewriteValueARM_OpARMXORshiftRLreg(v *Value) bool {
12967 v_2 := v.Args[2]
12968 v_1 := v.Args[1]
12969 v_0 := v.Args[0]
12970 b := v.Block
12971
12972
12973 for {
12974 if v_0.Op != OpARMMOVWconst {
12975 break
12976 }
12977 c := auxIntToInt32(v_0.AuxInt)
12978 x := v_1
12979 y := v_2
12980 v.reset(OpARMXORconst)
12981 v.AuxInt = int32ToAuxInt(c)
12982 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
12983 v0.AddArg2(x, y)
12984 v.AddArg(v0)
12985 return true
12986 }
12987
12988
12989
12990 for {
12991 x := v_0
12992 y := v_1
12993 if v_2.Op != OpARMMOVWconst {
12994 break
12995 }
12996 c := auxIntToInt32(v_2.AuxInt)
12997 if !(0 <= c && c < 32) {
12998 break
12999 }
13000 v.reset(OpARMXORshiftRL)
13001 v.AuxInt = int32ToAuxInt(c)
13002 v.AddArg2(x, y)
13003 return true
13004 }
13005 return false
13006 }
13007 func rewriteValueARM_OpARMXORshiftRR(v *Value) bool {
13008 v_1 := v.Args[1]
13009 v_0 := v.Args[0]
13010 b := v.Block
13011
13012
13013 for {
13014 d := auxIntToInt32(v.AuxInt)
13015 if v_0.Op != OpARMMOVWconst {
13016 break
13017 }
13018 c := auxIntToInt32(v_0.AuxInt)
13019 x := v_1
13020 v.reset(OpARMXORconst)
13021 v.AuxInt = int32ToAuxInt(c)
13022 v0 := b.NewValue0(v.Pos, OpARMSRRconst, x.Type)
13023 v0.AuxInt = int32ToAuxInt(d)
13024 v0.AddArg(x)
13025 v.AddArg(v0)
13026 return true
13027 }
13028
13029
13030 for {
13031 d := auxIntToInt32(v.AuxInt)
13032 x := v_0
13033 if v_1.Op != OpARMMOVWconst {
13034 break
13035 }
13036 c := auxIntToInt32(v_1.AuxInt)
13037 v.reset(OpARMXORconst)
13038 v.AuxInt = int32ToAuxInt(int32(uint32(c)>>uint64(d) | uint32(c)<<uint64(32-d)))
13039 v.AddArg(x)
13040 return true
13041 }
13042 return false
13043 }
13044 func rewriteValueARM_OpAddr(v *Value) bool {
13045 v_0 := v.Args[0]
13046
13047
13048 for {
13049 sym := auxToSym(v.Aux)
13050 base := v_0
13051 v.reset(OpARMMOVWaddr)
13052 v.Aux = symToAux(sym)
13053 v.AddArg(base)
13054 return true
13055 }
13056 }
13057 func rewriteValueARM_OpAvg32u(v *Value) bool {
13058 v_1 := v.Args[1]
13059 v_0 := v.Args[0]
13060 b := v.Block
13061
13062
13063 for {
13064 t := v.Type
13065 x := v_0
13066 y := v_1
13067 v.reset(OpARMADD)
13068 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t)
13069 v0.AuxInt = int32ToAuxInt(1)
13070 v1 := b.NewValue0(v.Pos, OpARMSUB, t)
13071 v1.AddArg2(x, y)
13072 v0.AddArg(v1)
13073 v.AddArg2(v0, y)
13074 return true
13075 }
13076 }
13077 func rewriteValueARM_OpBitLen16(v *Value) bool {
13078 v_0 := v.Args[0]
13079 b := v.Block
13080 typ := &b.Func.Config.Types
13081
13082
13083 for {
13084 x := v_0
13085 v.reset(OpBitLen32)
13086 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13087 v0.AddArg(x)
13088 v.AddArg(v0)
13089 return true
13090 }
13091 }
13092 func rewriteValueARM_OpBitLen32(v *Value) bool {
13093 v_0 := v.Args[0]
13094 b := v.Block
13095
13096
13097 for {
13098 t := v.Type
13099 x := v_0
13100 v.reset(OpARMRSBconst)
13101 v.AuxInt = int32ToAuxInt(32)
13102 v0 := b.NewValue0(v.Pos, OpARMCLZ, t)
13103 v0.AddArg(x)
13104 v.AddArg(v0)
13105 return true
13106 }
13107 }
13108 func rewriteValueARM_OpBitLen8(v *Value) bool {
13109 v_0 := v.Args[0]
13110 b := v.Block
13111 typ := &b.Func.Config.Types
13112
13113
13114 for {
13115 x := v_0
13116 v.reset(OpBitLen32)
13117 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13118 v0.AddArg(x)
13119 v.AddArg(v0)
13120 return true
13121 }
13122 }
13123 func rewriteValueARM_OpBswap32(v *Value) bool {
13124 v_0 := v.Args[0]
13125 b := v.Block
13126
13127
13128
13129 for {
13130 t := v.Type
13131 x := v_0
13132 if !(buildcfg.GOARM.Version == 5) {
13133 break
13134 }
13135 v.reset(OpARMXOR)
13136 v.Type = t
13137 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t)
13138 v0.AuxInt = int32ToAuxInt(8)
13139 v1 := b.NewValue0(v.Pos, OpARMBICconst, t)
13140 v1.AuxInt = int32ToAuxInt(0xff0000)
13141 v2 := b.NewValue0(v.Pos, OpARMXOR, t)
13142 v3 := b.NewValue0(v.Pos, OpARMSRRconst, t)
13143 v3.AuxInt = int32ToAuxInt(16)
13144 v3.AddArg(x)
13145 v2.AddArg2(x, v3)
13146 v1.AddArg(v2)
13147 v0.AddArg(v1)
13148 v4 := b.NewValue0(v.Pos, OpARMSRRconst, t)
13149 v4.AuxInt = int32ToAuxInt(8)
13150 v4.AddArg(x)
13151 v.AddArg2(v0, v4)
13152 return true
13153 }
13154
13155
13156
13157 for {
13158 x := v_0
13159 if !(buildcfg.GOARM.Version >= 6) {
13160 break
13161 }
13162 v.reset(OpARMREV)
13163 v.AddArg(x)
13164 return true
13165 }
13166 return false
13167 }
13168 func rewriteValueARM_OpConst16(v *Value) bool {
13169
13170
13171 for {
13172 val := auxIntToInt16(v.AuxInt)
13173 v.reset(OpARMMOVWconst)
13174 v.AuxInt = int32ToAuxInt(int32(val))
13175 return true
13176 }
13177 }
13178 func rewriteValueARM_OpConst32(v *Value) bool {
13179
13180
13181 for {
13182 val := auxIntToInt32(v.AuxInt)
13183 v.reset(OpARMMOVWconst)
13184 v.AuxInt = int32ToAuxInt(int32(val))
13185 return true
13186 }
13187 }
13188 func rewriteValueARM_OpConst32F(v *Value) bool {
13189
13190
13191 for {
13192 val := auxIntToFloat32(v.AuxInt)
13193 v.reset(OpARMMOVFconst)
13194 v.AuxInt = float64ToAuxInt(float64(val))
13195 return true
13196 }
13197 }
13198 func rewriteValueARM_OpConst64F(v *Value) bool {
13199
13200
13201 for {
13202 val := auxIntToFloat64(v.AuxInt)
13203 v.reset(OpARMMOVDconst)
13204 v.AuxInt = float64ToAuxInt(float64(val))
13205 return true
13206 }
13207 }
13208 func rewriteValueARM_OpConst8(v *Value) bool {
13209
13210
13211 for {
13212 val := auxIntToInt8(v.AuxInt)
13213 v.reset(OpARMMOVWconst)
13214 v.AuxInt = int32ToAuxInt(int32(val))
13215 return true
13216 }
13217 }
13218 func rewriteValueARM_OpConstBool(v *Value) bool {
13219
13220
13221 for {
13222 t := auxIntToBool(v.AuxInt)
13223 v.reset(OpARMMOVWconst)
13224 v.AuxInt = int32ToAuxInt(b2i32(t))
13225 return true
13226 }
13227 }
13228 func rewriteValueARM_OpConstNil(v *Value) bool {
13229
13230
13231 for {
13232 v.reset(OpARMMOVWconst)
13233 v.AuxInt = int32ToAuxInt(0)
13234 return true
13235 }
13236 }
13237 func rewriteValueARM_OpCtz16(v *Value) bool {
13238 v_0 := v.Args[0]
13239 b := v.Block
13240 typ := &b.Func.Config.Types
13241
13242
13243
13244 for {
13245 t := v.Type
13246 x := v_0
13247 if !(buildcfg.GOARM.Version <= 6) {
13248 break
13249 }
13250 v.reset(OpARMRSBconst)
13251 v.AuxInt = int32ToAuxInt(32)
13252 v0 := b.NewValue0(v.Pos, OpARMCLZ, t)
13253 v1 := b.NewValue0(v.Pos, OpARMSUBconst, typ.UInt32)
13254 v1.AuxInt = int32ToAuxInt(1)
13255 v2 := b.NewValue0(v.Pos, OpARMAND, typ.UInt32)
13256 v3 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32)
13257 v3.AuxInt = int32ToAuxInt(0x10000)
13258 v3.AddArg(x)
13259 v4 := b.NewValue0(v.Pos, OpARMRSBconst, typ.UInt32)
13260 v4.AuxInt = int32ToAuxInt(0)
13261 v4.AddArg(v3)
13262 v2.AddArg2(v3, v4)
13263 v1.AddArg(v2)
13264 v0.AddArg(v1)
13265 v.AddArg(v0)
13266 return true
13267 }
13268
13269
13270
13271 for {
13272 t := v.Type
13273 x := v_0
13274 if !(buildcfg.GOARM.Version == 7) {
13275 break
13276 }
13277 v.reset(OpARMCLZ)
13278 v.Type = t
13279 v0 := b.NewValue0(v.Pos, OpARMRBIT, typ.UInt32)
13280 v1 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32)
13281 v1.AuxInt = int32ToAuxInt(0x10000)
13282 v1.AddArg(x)
13283 v0.AddArg(v1)
13284 v.AddArg(v0)
13285 return true
13286 }
13287 return false
13288 }
13289 func rewriteValueARM_OpCtz32(v *Value) bool {
13290 v_0 := v.Args[0]
13291 b := v.Block
13292
13293
13294
13295 for {
13296 t := v.Type
13297 x := v_0
13298 if !(buildcfg.GOARM.Version <= 6) {
13299 break
13300 }
13301 v.reset(OpARMRSBconst)
13302 v.AuxInt = int32ToAuxInt(32)
13303 v0 := b.NewValue0(v.Pos, OpARMCLZ, t)
13304 v1 := b.NewValue0(v.Pos, OpARMSUBconst, t)
13305 v1.AuxInt = int32ToAuxInt(1)
13306 v2 := b.NewValue0(v.Pos, OpARMAND, t)
13307 v3 := b.NewValue0(v.Pos, OpARMRSBconst, t)
13308 v3.AuxInt = int32ToAuxInt(0)
13309 v3.AddArg(x)
13310 v2.AddArg2(x, v3)
13311 v1.AddArg(v2)
13312 v0.AddArg(v1)
13313 v.AddArg(v0)
13314 return true
13315 }
13316
13317
13318
13319 for {
13320 t := v.Type
13321 x := v_0
13322 if !(buildcfg.GOARM.Version == 7) {
13323 break
13324 }
13325 v.reset(OpARMCLZ)
13326 v.Type = t
13327 v0 := b.NewValue0(v.Pos, OpARMRBIT, t)
13328 v0.AddArg(x)
13329 v.AddArg(v0)
13330 return true
13331 }
13332 return false
13333 }
13334 func rewriteValueARM_OpCtz8(v *Value) bool {
13335 v_0 := v.Args[0]
13336 b := v.Block
13337 typ := &b.Func.Config.Types
13338
13339
13340
13341 for {
13342 t := v.Type
13343 x := v_0
13344 if !(buildcfg.GOARM.Version <= 6) {
13345 break
13346 }
13347 v.reset(OpARMRSBconst)
13348 v.AuxInt = int32ToAuxInt(32)
13349 v0 := b.NewValue0(v.Pos, OpARMCLZ, t)
13350 v1 := b.NewValue0(v.Pos, OpARMSUBconst, typ.UInt32)
13351 v1.AuxInt = int32ToAuxInt(1)
13352 v2 := b.NewValue0(v.Pos, OpARMAND, typ.UInt32)
13353 v3 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32)
13354 v3.AuxInt = int32ToAuxInt(0x100)
13355 v3.AddArg(x)
13356 v4 := b.NewValue0(v.Pos, OpARMRSBconst, typ.UInt32)
13357 v4.AuxInt = int32ToAuxInt(0)
13358 v4.AddArg(v3)
13359 v2.AddArg2(v3, v4)
13360 v1.AddArg(v2)
13361 v0.AddArg(v1)
13362 v.AddArg(v0)
13363 return true
13364 }
13365
13366
13367
13368 for {
13369 t := v.Type
13370 x := v_0
13371 if !(buildcfg.GOARM.Version == 7) {
13372 break
13373 }
13374 v.reset(OpARMCLZ)
13375 v.Type = t
13376 v0 := b.NewValue0(v.Pos, OpARMRBIT, typ.UInt32)
13377 v1 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32)
13378 v1.AuxInt = int32ToAuxInt(0x100)
13379 v1.AddArg(x)
13380 v0.AddArg(v1)
13381 v.AddArg(v0)
13382 return true
13383 }
13384 return false
13385 }
13386 func rewriteValueARM_OpDiv16(v *Value) bool {
13387 v_1 := v.Args[1]
13388 v_0 := v.Args[0]
13389 b := v.Block
13390 typ := &b.Func.Config.Types
13391
13392
13393 for {
13394 x := v_0
13395 y := v_1
13396 v.reset(OpDiv32)
13397 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
13398 v0.AddArg(x)
13399 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
13400 v1.AddArg(y)
13401 v.AddArg2(v0, v1)
13402 return true
13403 }
13404 }
13405 func rewriteValueARM_OpDiv16u(v *Value) bool {
13406 v_1 := v.Args[1]
13407 v_0 := v.Args[0]
13408 b := v.Block
13409 typ := &b.Func.Config.Types
13410
13411
13412 for {
13413 x := v_0
13414 y := v_1
13415 v.reset(OpDiv32u)
13416 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13417 v0.AddArg(x)
13418 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13419 v1.AddArg(y)
13420 v.AddArg2(v0, v1)
13421 return true
13422 }
13423 }
13424 func rewriteValueARM_OpDiv32(v *Value) bool {
13425 v_1 := v.Args[1]
13426 v_0 := v.Args[0]
13427 b := v.Block
13428 typ := &b.Func.Config.Types
13429
13430
13431 for {
13432 x := v_0
13433 y := v_1
13434 v.reset(OpARMSUB)
13435 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
13436 v1 := b.NewValue0(v.Pos, OpSelect0, typ.UInt32)
13437 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32))
13438 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32)
13439 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
13440 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32)
13441 v5.AddArg(x)
13442 v4.AddArg2(x, v5)
13443 v3.AddArg2(v4, v5)
13444 v6 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32)
13445 v7 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
13446 v8 := b.NewValue0(v.Pos, OpSignmask, typ.Int32)
13447 v8.AddArg(y)
13448 v7.AddArg2(y, v8)
13449 v6.AddArg2(v7, v8)
13450 v2.AddArg2(v3, v6)
13451 v1.AddArg(v2)
13452 v9 := b.NewValue0(v.Pos, OpSignmask, typ.Int32)
13453 v10 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
13454 v10.AddArg2(x, y)
13455 v9.AddArg(v10)
13456 v0.AddArg2(v1, v9)
13457 v.AddArg2(v0, v9)
13458 return true
13459 }
13460 }
13461 func rewriteValueARM_OpDiv32u(v *Value) bool {
13462 v_1 := v.Args[1]
13463 v_0 := v.Args[0]
13464 b := v.Block
13465 typ := &b.Func.Config.Types
13466
13467
13468 for {
13469 x := v_0
13470 y := v_1
13471 v.reset(OpSelect0)
13472 v.Type = typ.UInt32
13473 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32))
13474 v0.AddArg2(x, y)
13475 v.AddArg(v0)
13476 return true
13477 }
13478 }
13479 func rewriteValueARM_OpDiv8(v *Value) bool {
13480 v_1 := v.Args[1]
13481 v_0 := v.Args[0]
13482 b := v.Block
13483 typ := &b.Func.Config.Types
13484
13485
13486 for {
13487 x := v_0
13488 y := v_1
13489 v.reset(OpDiv32)
13490 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
13491 v0.AddArg(x)
13492 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
13493 v1.AddArg(y)
13494 v.AddArg2(v0, v1)
13495 return true
13496 }
13497 }
13498 func rewriteValueARM_OpDiv8u(v *Value) bool {
13499 v_1 := v.Args[1]
13500 v_0 := v.Args[0]
13501 b := v.Block
13502 typ := &b.Func.Config.Types
13503
13504
13505 for {
13506 x := v_0
13507 y := v_1
13508 v.reset(OpDiv32u)
13509 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13510 v0.AddArg(x)
13511 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13512 v1.AddArg(y)
13513 v.AddArg2(v0, v1)
13514 return true
13515 }
13516 }
13517 func rewriteValueARM_OpEq16(v *Value) bool {
13518 v_1 := v.Args[1]
13519 v_0 := v.Args[0]
13520 b := v.Block
13521 typ := &b.Func.Config.Types
13522
13523
13524 for {
13525 x := v_0
13526 y := v_1
13527 v.reset(OpARMEqual)
13528 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13529 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13530 v1.AddArg(x)
13531 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13532 v2.AddArg(y)
13533 v0.AddArg2(v1, v2)
13534 v.AddArg(v0)
13535 return true
13536 }
13537 }
13538 func rewriteValueARM_OpEq32(v *Value) bool {
13539 v_1 := v.Args[1]
13540 v_0 := v.Args[0]
13541 b := v.Block
13542
13543
13544 for {
13545 x := v_0
13546 y := v_1
13547 v.reset(OpARMEqual)
13548 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13549 v0.AddArg2(x, y)
13550 v.AddArg(v0)
13551 return true
13552 }
13553 }
13554 func rewriteValueARM_OpEq32F(v *Value) bool {
13555 v_1 := v.Args[1]
13556 v_0 := v.Args[0]
13557 b := v.Block
13558
13559
13560 for {
13561 x := v_0
13562 y := v_1
13563 v.reset(OpARMEqual)
13564 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags)
13565 v0.AddArg2(x, y)
13566 v.AddArg(v0)
13567 return true
13568 }
13569 }
13570 func rewriteValueARM_OpEq64F(v *Value) bool {
13571 v_1 := v.Args[1]
13572 v_0 := v.Args[0]
13573 b := v.Block
13574
13575
13576 for {
13577 x := v_0
13578 y := v_1
13579 v.reset(OpARMEqual)
13580 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags)
13581 v0.AddArg2(x, y)
13582 v.AddArg(v0)
13583 return true
13584 }
13585 }
13586 func rewriteValueARM_OpEq8(v *Value) bool {
13587 v_1 := v.Args[1]
13588 v_0 := v.Args[0]
13589 b := v.Block
13590 typ := &b.Func.Config.Types
13591
13592
13593 for {
13594 x := v_0
13595 y := v_1
13596 v.reset(OpARMEqual)
13597 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13598 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13599 v1.AddArg(x)
13600 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13601 v2.AddArg(y)
13602 v0.AddArg2(v1, v2)
13603 v.AddArg(v0)
13604 return true
13605 }
13606 }
13607 func rewriteValueARM_OpEqB(v *Value) bool {
13608 v_1 := v.Args[1]
13609 v_0 := v.Args[0]
13610 b := v.Block
13611 typ := &b.Func.Config.Types
13612
13613
13614 for {
13615 x := v_0
13616 y := v_1
13617 v.reset(OpARMXORconst)
13618 v.AuxInt = int32ToAuxInt(1)
13619 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.Bool)
13620 v0.AddArg2(x, y)
13621 v.AddArg(v0)
13622 return true
13623 }
13624 }
13625 func rewriteValueARM_OpEqPtr(v *Value) bool {
13626 v_1 := v.Args[1]
13627 v_0 := v.Args[0]
13628 b := v.Block
13629
13630
13631 for {
13632 x := v_0
13633 y := v_1
13634 v.reset(OpARMEqual)
13635 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13636 v0.AddArg2(x, y)
13637 v.AddArg(v0)
13638 return true
13639 }
13640 }
13641 func rewriteValueARM_OpFMA(v *Value) bool {
13642 v_2 := v.Args[2]
13643 v_1 := v.Args[1]
13644 v_0 := v.Args[0]
13645
13646
13647 for {
13648 x := v_0
13649 y := v_1
13650 z := v_2
13651 v.reset(OpARMFMULAD)
13652 v.AddArg3(z, x, y)
13653 return true
13654 }
13655 }
13656 func rewriteValueARM_OpIsInBounds(v *Value) bool {
13657 v_1 := v.Args[1]
13658 v_0 := v.Args[0]
13659 b := v.Block
13660
13661
13662 for {
13663 idx := v_0
13664 len := v_1
13665 v.reset(OpARMLessThanU)
13666 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13667 v0.AddArg2(idx, len)
13668 v.AddArg(v0)
13669 return true
13670 }
13671 }
13672 func rewriteValueARM_OpIsNonNil(v *Value) bool {
13673 v_0 := v.Args[0]
13674 b := v.Block
13675
13676
13677 for {
13678 ptr := v_0
13679 v.reset(OpARMNotEqual)
13680 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
13681 v0.AuxInt = int32ToAuxInt(0)
13682 v0.AddArg(ptr)
13683 v.AddArg(v0)
13684 return true
13685 }
13686 }
13687 func rewriteValueARM_OpIsSliceInBounds(v *Value) bool {
13688 v_1 := v.Args[1]
13689 v_0 := v.Args[0]
13690 b := v.Block
13691
13692
13693 for {
13694 idx := v_0
13695 len := v_1
13696 v.reset(OpARMLessEqualU)
13697 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13698 v0.AddArg2(idx, len)
13699 v.AddArg(v0)
13700 return true
13701 }
13702 }
13703 func rewriteValueARM_OpLeq16(v *Value) bool {
13704 v_1 := v.Args[1]
13705 v_0 := v.Args[0]
13706 b := v.Block
13707 typ := &b.Func.Config.Types
13708
13709
13710 for {
13711 x := v_0
13712 y := v_1
13713 v.reset(OpARMLessEqual)
13714 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13715 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
13716 v1.AddArg(x)
13717 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
13718 v2.AddArg(y)
13719 v0.AddArg2(v1, v2)
13720 v.AddArg(v0)
13721 return true
13722 }
13723 }
13724 func rewriteValueARM_OpLeq16U(v *Value) bool {
13725 v_1 := v.Args[1]
13726 v_0 := v.Args[0]
13727 b := v.Block
13728 typ := &b.Func.Config.Types
13729
13730
13731 for {
13732 x := v_0
13733 y := v_1
13734 v.reset(OpARMLessEqualU)
13735 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13736 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13737 v1.AddArg(x)
13738 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13739 v2.AddArg(y)
13740 v0.AddArg2(v1, v2)
13741 v.AddArg(v0)
13742 return true
13743 }
13744 }
13745 func rewriteValueARM_OpLeq32(v *Value) bool {
13746 v_1 := v.Args[1]
13747 v_0 := v.Args[0]
13748 b := v.Block
13749
13750
13751 for {
13752 x := v_0
13753 y := v_1
13754 v.reset(OpARMLessEqual)
13755 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13756 v0.AddArg2(x, y)
13757 v.AddArg(v0)
13758 return true
13759 }
13760 }
13761 func rewriteValueARM_OpLeq32F(v *Value) bool {
13762 v_1 := v.Args[1]
13763 v_0 := v.Args[0]
13764 b := v.Block
13765
13766
13767 for {
13768 x := v_0
13769 y := v_1
13770 v.reset(OpARMGreaterEqual)
13771 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags)
13772 v0.AddArg2(y, x)
13773 v.AddArg(v0)
13774 return true
13775 }
13776 }
13777 func rewriteValueARM_OpLeq32U(v *Value) bool {
13778 v_1 := v.Args[1]
13779 v_0 := v.Args[0]
13780 b := v.Block
13781
13782
13783 for {
13784 x := v_0
13785 y := v_1
13786 v.reset(OpARMLessEqualU)
13787 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13788 v0.AddArg2(x, y)
13789 v.AddArg(v0)
13790 return true
13791 }
13792 }
13793 func rewriteValueARM_OpLeq64F(v *Value) bool {
13794 v_1 := v.Args[1]
13795 v_0 := v.Args[0]
13796 b := v.Block
13797
13798
13799 for {
13800 x := v_0
13801 y := v_1
13802 v.reset(OpARMGreaterEqual)
13803 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags)
13804 v0.AddArg2(y, x)
13805 v.AddArg(v0)
13806 return true
13807 }
13808 }
13809 func rewriteValueARM_OpLeq8(v *Value) bool {
13810 v_1 := v.Args[1]
13811 v_0 := v.Args[0]
13812 b := v.Block
13813 typ := &b.Func.Config.Types
13814
13815
13816 for {
13817 x := v_0
13818 y := v_1
13819 v.reset(OpARMLessEqual)
13820 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13821 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
13822 v1.AddArg(x)
13823 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
13824 v2.AddArg(y)
13825 v0.AddArg2(v1, v2)
13826 v.AddArg(v0)
13827 return true
13828 }
13829 }
13830 func rewriteValueARM_OpLeq8U(v *Value) bool {
13831 v_1 := v.Args[1]
13832 v_0 := v.Args[0]
13833 b := v.Block
13834 typ := &b.Func.Config.Types
13835
13836
13837 for {
13838 x := v_0
13839 y := v_1
13840 v.reset(OpARMLessEqualU)
13841 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13842 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13843 v1.AddArg(x)
13844 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13845 v2.AddArg(y)
13846 v0.AddArg2(v1, v2)
13847 v.AddArg(v0)
13848 return true
13849 }
13850 }
13851 func rewriteValueARM_OpLess16(v *Value) bool {
13852 v_1 := v.Args[1]
13853 v_0 := v.Args[0]
13854 b := v.Block
13855 typ := &b.Func.Config.Types
13856
13857
13858 for {
13859 x := v_0
13860 y := v_1
13861 v.reset(OpARMLessThan)
13862 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13863 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
13864 v1.AddArg(x)
13865 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
13866 v2.AddArg(y)
13867 v0.AddArg2(v1, v2)
13868 v.AddArg(v0)
13869 return true
13870 }
13871 }
13872 func rewriteValueARM_OpLess16U(v *Value) bool {
13873 v_1 := v.Args[1]
13874 v_0 := v.Args[0]
13875 b := v.Block
13876 typ := &b.Func.Config.Types
13877
13878
13879 for {
13880 x := v_0
13881 y := v_1
13882 v.reset(OpARMLessThanU)
13883 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13884 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13885 v1.AddArg(x)
13886 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13887 v2.AddArg(y)
13888 v0.AddArg2(v1, v2)
13889 v.AddArg(v0)
13890 return true
13891 }
13892 }
13893 func rewriteValueARM_OpLess32(v *Value) bool {
13894 v_1 := v.Args[1]
13895 v_0 := v.Args[0]
13896 b := v.Block
13897
13898
13899 for {
13900 x := v_0
13901 y := v_1
13902 v.reset(OpARMLessThan)
13903 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13904 v0.AddArg2(x, y)
13905 v.AddArg(v0)
13906 return true
13907 }
13908 }
13909 func rewriteValueARM_OpLess32F(v *Value) bool {
13910 v_1 := v.Args[1]
13911 v_0 := v.Args[0]
13912 b := v.Block
13913
13914
13915 for {
13916 x := v_0
13917 y := v_1
13918 v.reset(OpARMGreaterThan)
13919 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags)
13920 v0.AddArg2(y, x)
13921 v.AddArg(v0)
13922 return true
13923 }
13924 }
13925 func rewriteValueARM_OpLess32U(v *Value) bool {
13926 v_1 := v.Args[1]
13927 v_0 := v.Args[0]
13928 b := v.Block
13929
13930
13931 for {
13932 x := v_0
13933 y := v_1
13934 v.reset(OpARMLessThanU)
13935 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13936 v0.AddArg2(x, y)
13937 v.AddArg(v0)
13938 return true
13939 }
13940 }
13941 func rewriteValueARM_OpLess64F(v *Value) bool {
13942 v_1 := v.Args[1]
13943 v_0 := v.Args[0]
13944 b := v.Block
13945
13946
13947 for {
13948 x := v_0
13949 y := v_1
13950 v.reset(OpARMGreaterThan)
13951 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags)
13952 v0.AddArg2(y, x)
13953 v.AddArg(v0)
13954 return true
13955 }
13956 }
13957 func rewriteValueARM_OpLess8(v *Value) bool {
13958 v_1 := v.Args[1]
13959 v_0 := v.Args[0]
13960 b := v.Block
13961 typ := &b.Func.Config.Types
13962
13963
13964 for {
13965 x := v_0
13966 y := v_1
13967 v.reset(OpARMLessThan)
13968 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13969 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
13970 v1.AddArg(x)
13971 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
13972 v2.AddArg(y)
13973 v0.AddArg2(v1, v2)
13974 v.AddArg(v0)
13975 return true
13976 }
13977 }
13978 func rewriteValueARM_OpLess8U(v *Value) bool {
13979 v_1 := v.Args[1]
13980 v_0 := v.Args[0]
13981 b := v.Block
13982 typ := &b.Func.Config.Types
13983
13984
13985 for {
13986 x := v_0
13987 y := v_1
13988 v.reset(OpARMLessThanU)
13989 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13990 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13991 v1.AddArg(x)
13992 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13993 v2.AddArg(y)
13994 v0.AddArg2(v1, v2)
13995 v.AddArg(v0)
13996 return true
13997 }
13998 }
13999 func rewriteValueARM_OpLoad(v *Value) bool {
14000 v_1 := v.Args[1]
14001 v_0 := v.Args[0]
14002
14003
14004
14005 for {
14006 t := v.Type
14007 ptr := v_0
14008 mem := v_1
14009 if !(t.IsBoolean()) {
14010 break
14011 }
14012 v.reset(OpARMMOVBUload)
14013 v.AddArg2(ptr, mem)
14014 return true
14015 }
14016
14017
14018
14019 for {
14020 t := v.Type
14021 ptr := v_0
14022 mem := v_1
14023 if !(is8BitInt(t) && t.IsSigned()) {
14024 break
14025 }
14026 v.reset(OpARMMOVBload)
14027 v.AddArg2(ptr, mem)
14028 return true
14029 }
14030
14031
14032
14033 for {
14034 t := v.Type
14035 ptr := v_0
14036 mem := v_1
14037 if !(is8BitInt(t) && !t.IsSigned()) {
14038 break
14039 }
14040 v.reset(OpARMMOVBUload)
14041 v.AddArg2(ptr, mem)
14042 return true
14043 }
14044
14045
14046
14047 for {
14048 t := v.Type
14049 ptr := v_0
14050 mem := v_1
14051 if !(is16BitInt(t) && t.IsSigned()) {
14052 break
14053 }
14054 v.reset(OpARMMOVHload)
14055 v.AddArg2(ptr, mem)
14056 return true
14057 }
14058
14059
14060
14061 for {
14062 t := v.Type
14063 ptr := v_0
14064 mem := v_1
14065 if !(is16BitInt(t) && !t.IsSigned()) {
14066 break
14067 }
14068 v.reset(OpARMMOVHUload)
14069 v.AddArg2(ptr, mem)
14070 return true
14071 }
14072
14073
14074
14075 for {
14076 t := v.Type
14077 ptr := v_0
14078 mem := v_1
14079 if !(is32BitInt(t) || isPtr(t)) {
14080 break
14081 }
14082 v.reset(OpARMMOVWload)
14083 v.AddArg2(ptr, mem)
14084 return true
14085 }
14086
14087
14088
14089 for {
14090 t := v.Type
14091 ptr := v_0
14092 mem := v_1
14093 if !(is32BitFloat(t)) {
14094 break
14095 }
14096 v.reset(OpARMMOVFload)
14097 v.AddArg2(ptr, mem)
14098 return true
14099 }
14100
14101
14102
14103 for {
14104 t := v.Type
14105 ptr := v_0
14106 mem := v_1
14107 if !(is64BitFloat(t)) {
14108 break
14109 }
14110 v.reset(OpARMMOVDload)
14111 v.AddArg2(ptr, mem)
14112 return true
14113 }
14114 return false
14115 }
14116 func rewriteValueARM_OpLocalAddr(v *Value) bool {
14117 v_1 := v.Args[1]
14118 v_0 := v.Args[0]
14119 b := v.Block
14120 typ := &b.Func.Config.Types
14121
14122
14123
14124 for {
14125 t := v.Type
14126 sym := auxToSym(v.Aux)
14127 base := v_0
14128 mem := v_1
14129 if !(t.Elem().HasPointers()) {
14130 break
14131 }
14132 v.reset(OpARMMOVWaddr)
14133 v.Aux = symToAux(sym)
14134 v0 := b.NewValue0(v.Pos, OpSPanchored, typ.Uintptr)
14135 v0.AddArg2(base, mem)
14136 v.AddArg(v0)
14137 return true
14138 }
14139
14140
14141
14142 for {
14143 t := v.Type
14144 sym := auxToSym(v.Aux)
14145 base := v_0
14146 if !(!t.Elem().HasPointers()) {
14147 break
14148 }
14149 v.reset(OpARMMOVWaddr)
14150 v.Aux = symToAux(sym)
14151 v.AddArg(base)
14152 return true
14153 }
14154 return false
14155 }
14156 func rewriteValueARM_OpLsh16x16(v *Value) bool {
14157 v_1 := v.Args[1]
14158 v_0 := v.Args[0]
14159 b := v.Block
14160 typ := &b.Func.Config.Types
14161
14162
14163 for {
14164 x := v_0
14165 y := v_1
14166 v.reset(OpARMCMOVWHSconst)
14167 v.AuxInt = int32ToAuxInt(0)
14168 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
14169 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14170 v1.AddArg(y)
14171 v0.AddArg2(x, v1)
14172 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
14173 v2.AuxInt = int32ToAuxInt(256)
14174 v2.AddArg(v1)
14175 v.AddArg2(v0, v2)
14176 return true
14177 }
14178 }
14179 func rewriteValueARM_OpLsh16x32(v *Value) bool {
14180 v_1 := v.Args[1]
14181 v_0 := v.Args[0]
14182 b := v.Block
14183
14184
14185 for {
14186 x := v_0
14187 y := v_1
14188 v.reset(OpARMCMOVWHSconst)
14189 v.AuxInt = int32ToAuxInt(0)
14190 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
14191 v0.AddArg2(x, y)
14192 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
14193 v1.AuxInt = int32ToAuxInt(256)
14194 v1.AddArg(y)
14195 v.AddArg2(v0, v1)
14196 return true
14197 }
14198 }
14199 func rewriteValueARM_OpLsh16x64(v *Value) bool {
14200 v_1 := v.Args[1]
14201 v_0 := v.Args[0]
14202
14203
14204
14205 for {
14206 x := v_0
14207 if v_1.Op != OpConst64 {
14208 break
14209 }
14210 c := auxIntToInt64(v_1.AuxInt)
14211 if !(uint64(c) < 16) {
14212 break
14213 }
14214 v.reset(OpARMSLLconst)
14215 v.AuxInt = int32ToAuxInt(int32(c))
14216 v.AddArg(x)
14217 return true
14218 }
14219
14220
14221
14222 for {
14223 if v_1.Op != OpConst64 {
14224 break
14225 }
14226 c := auxIntToInt64(v_1.AuxInt)
14227 if !(uint64(c) >= 16) {
14228 break
14229 }
14230 v.reset(OpConst16)
14231 v.AuxInt = int16ToAuxInt(0)
14232 return true
14233 }
14234 return false
14235 }
14236 func rewriteValueARM_OpLsh16x8(v *Value) bool {
14237 v_1 := v.Args[1]
14238 v_0 := v.Args[0]
14239 b := v.Block
14240 typ := &b.Func.Config.Types
14241
14242
14243 for {
14244 x := v_0
14245 y := v_1
14246 v.reset(OpARMSLL)
14247 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14248 v0.AddArg(y)
14249 v.AddArg2(x, v0)
14250 return true
14251 }
14252 }
14253 func rewriteValueARM_OpLsh32x16(v *Value) bool {
14254 v_1 := v.Args[1]
14255 v_0 := v.Args[0]
14256 b := v.Block
14257 typ := &b.Func.Config.Types
14258
14259
14260 for {
14261 x := v_0
14262 y := v_1
14263 v.reset(OpARMCMOVWHSconst)
14264 v.AuxInt = int32ToAuxInt(0)
14265 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
14266 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14267 v1.AddArg(y)
14268 v0.AddArg2(x, v1)
14269 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
14270 v2.AuxInt = int32ToAuxInt(256)
14271 v2.AddArg(v1)
14272 v.AddArg2(v0, v2)
14273 return true
14274 }
14275 }
14276 func rewriteValueARM_OpLsh32x32(v *Value) bool {
14277 v_1 := v.Args[1]
14278 v_0 := v.Args[0]
14279 b := v.Block
14280
14281
14282 for {
14283 x := v_0
14284 y := v_1
14285 v.reset(OpARMCMOVWHSconst)
14286 v.AuxInt = int32ToAuxInt(0)
14287 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
14288 v0.AddArg2(x, y)
14289 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
14290 v1.AuxInt = int32ToAuxInt(256)
14291 v1.AddArg(y)
14292 v.AddArg2(v0, v1)
14293 return true
14294 }
14295 }
14296 func rewriteValueARM_OpLsh32x64(v *Value) bool {
14297 v_1 := v.Args[1]
14298 v_0 := v.Args[0]
14299
14300
14301
14302 for {
14303 x := v_0
14304 if v_1.Op != OpConst64 {
14305 break
14306 }
14307 c := auxIntToInt64(v_1.AuxInt)
14308 if !(uint64(c) < 32) {
14309 break
14310 }
14311 v.reset(OpARMSLLconst)
14312 v.AuxInt = int32ToAuxInt(int32(c))
14313 v.AddArg(x)
14314 return true
14315 }
14316
14317
14318
14319 for {
14320 if v_1.Op != OpConst64 {
14321 break
14322 }
14323 c := auxIntToInt64(v_1.AuxInt)
14324 if !(uint64(c) >= 32) {
14325 break
14326 }
14327 v.reset(OpConst32)
14328 v.AuxInt = int32ToAuxInt(0)
14329 return true
14330 }
14331 return false
14332 }
14333 func rewriteValueARM_OpLsh32x8(v *Value) bool {
14334 v_1 := v.Args[1]
14335 v_0 := v.Args[0]
14336 b := v.Block
14337 typ := &b.Func.Config.Types
14338
14339
14340 for {
14341 x := v_0
14342 y := v_1
14343 v.reset(OpARMSLL)
14344 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14345 v0.AddArg(y)
14346 v.AddArg2(x, v0)
14347 return true
14348 }
14349 }
14350 func rewriteValueARM_OpLsh8x16(v *Value) bool {
14351 v_1 := v.Args[1]
14352 v_0 := v.Args[0]
14353 b := v.Block
14354 typ := &b.Func.Config.Types
14355
14356
14357 for {
14358 x := v_0
14359 y := v_1
14360 v.reset(OpARMCMOVWHSconst)
14361 v.AuxInt = int32ToAuxInt(0)
14362 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
14363 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14364 v1.AddArg(y)
14365 v0.AddArg2(x, v1)
14366 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
14367 v2.AuxInt = int32ToAuxInt(256)
14368 v2.AddArg(v1)
14369 v.AddArg2(v0, v2)
14370 return true
14371 }
14372 }
14373 func rewriteValueARM_OpLsh8x32(v *Value) bool {
14374 v_1 := v.Args[1]
14375 v_0 := v.Args[0]
14376 b := v.Block
14377
14378
14379 for {
14380 x := v_0
14381 y := v_1
14382 v.reset(OpARMCMOVWHSconst)
14383 v.AuxInt = int32ToAuxInt(0)
14384 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
14385 v0.AddArg2(x, y)
14386 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
14387 v1.AuxInt = int32ToAuxInt(256)
14388 v1.AddArg(y)
14389 v.AddArg2(v0, v1)
14390 return true
14391 }
14392 }
14393 func rewriteValueARM_OpLsh8x64(v *Value) bool {
14394 v_1 := v.Args[1]
14395 v_0 := v.Args[0]
14396
14397
14398
14399 for {
14400 x := v_0
14401 if v_1.Op != OpConst64 {
14402 break
14403 }
14404 c := auxIntToInt64(v_1.AuxInt)
14405 if !(uint64(c) < 8) {
14406 break
14407 }
14408 v.reset(OpARMSLLconst)
14409 v.AuxInt = int32ToAuxInt(int32(c))
14410 v.AddArg(x)
14411 return true
14412 }
14413
14414
14415
14416 for {
14417 if v_1.Op != OpConst64 {
14418 break
14419 }
14420 c := auxIntToInt64(v_1.AuxInt)
14421 if !(uint64(c) >= 8) {
14422 break
14423 }
14424 v.reset(OpConst8)
14425 v.AuxInt = int8ToAuxInt(0)
14426 return true
14427 }
14428 return false
14429 }
14430 func rewriteValueARM_OpLsh8x8(v *Value) bool {
14431 v_1 := v.Args[1]
14432 v_0 := v.Args[0]
14433 b := v.Block
14434 typ := &b.Func.Config.Types
14435
14436
14437 for {
14438 x := v_0
14439 y := v_1
14440 v.reset(OpARMSLL)
14441 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14442 v0.AddArg(y)
14443 v.AddArg2(x, v0)
14444 return true
14445 }
14446 }
14447 func rewriteValueARM_OpMod16(v *Value) bool {
14448 v_1 := v.Args[1]
14449 v_0 := v.Args[0]
14450 b := v.Block
14451 typ := &b.Func.Config.Types
14452
14453
14454 for {
14455 x := v_0
14456 y := v_1
14457 v.reset(OpMod32)
14458 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
14459 v0.AddArg(x)
14460 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
14461 v1.AddArg(y)
14462 v.AddArg2(v0, v1)
14463 return true
14464 }
14465 }
14466 func rewriteValueARM_OpMod16u(v *Value) bool {
14467 v_1 := v.Args[1]
14468 v_0 := v.Args[0]
14469 b := v.Block
14470 typ := &b.Func.Config.Types
14471
14472
14473 for {
14474 x := v_0
14475 y := v_1
14476 v.reset(OpMod32u)
14477 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14478 v0.AddArg(x)
14479 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14480 v1.AddArg(y)
14481 v.AddArg2(v0, v1)
14482 return true
14483 }
14484 }
14485 func rewriteValueARM_OpMod32(v *Value) bool {
14486 v_1 := v.Args[1]
14487 v_0 := v.Args[0]
14488 b := v.Block
14489 typ := &b.Func.Config.Types
14490
14491
14492 for {
14493 x := v_0
14494 y := v_1
14495 v.reset(OpARMSUB)
14496 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
14497 v1 := b.NewValue0(v.Pos, OpSelect1, typ.UInt32)
14498 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32))
14499 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32)
14500 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
14501 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32)
14502 v5.AddArg(x)
14503 v4.AddArg2(x, v5)
14504 v3.AddArg2(v4, v5)
14505 v6 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32)
14506 v7 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
14507 v8 := b.NewValue0(v.Pos, OpSignmask, typ.Int32)
14508 v8.AddArg(y)
14509 v7.AddArg2(y, v8)
14510 v6.AddArg2(v7, v8)
14511 v2.AddArg2(v3, v6)
14512 v1.AddArg(v2)
14513 v0.AddArg2(v1, v5)
14514 v.AddArg2(v0, v5)
14515 return true
14516 }
14517 }
14518 func rewriteValueARM_OpMod32u(v *Value) bool {
14519 v_1 := v.Args[1]
14520 v_0 := v.Args[0]
14521 b := v.Block
14522 typ := &b.Func.Config.Types
14523
14524
14525 for {
14526 x := v_0
14527 y := v_1
14528 v.reset(OpSelect1)
14529 v.Type = typ.UInt32
14530 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32))
14531 v0.AddArg2(x, y)
14532 v.AddArg(v0)
14533 return true
14534 }
14535 }
14536 func rewriteValueARM_OpMod8(v *Value) bool {
14537 v_1 := v.Args[1]
14538 v_0 := v.Args[0]
14539 b := v.Block
14540 typ := &b.Func.Config.Types
14541
14542
14543 for {
14544 x := v_0
14545 y := v_1
14546 v.reset(OpMod32)
14547 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
14548 v0.AddArg(x)
14549 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
14550 v1.AddArg(y)
14551 v.AddArg2(v0, v1)
14552 return true
14553 }
14554 }
14555 func rewriteValueARM_OpMod8u(v *Value) bool {
14556 v_1 := v.Args[1]
14557 v_0 := v.Args[0]
14558 b := v.Block
14559 typ := &b.Func.Config.Types
14560
14561
14562 for {
14563 x := v_0
14564 y := v_1
14565 v.reset(OpMod32u)
14566 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14567 v0.AddArg(x)
14568 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14569 v1.AddArg(y)
14570 v.AddArg2(v0, v1)
14571 return true
14572 }
14573 }
14574 func rewriteValueARM_OpMove(v *Value) bool {
14575 v_2 := v.Args[2]
14576 v_1 := v.Args[1]
14577 v_0 := v.Args[0]
14578 b := v.Block
14579 config := b.Func.Config
14580 typ := &b.Func.Config.Types
14581
14582
14583 for {
14584 if auxIntToInt64(v.AuxInt) != 0 {
14585 break
14586 }
14587 mem := v_2
14588 v.copyOf(mem)
14589 return true
14590 }
14591
14592
14593 for {
14594 if auxIntToInt64(v.AuxInt) != 1 {
14595 break
14596 }
14597 dst := v_0
14598 src := v_1
14599 mem := v_2
14600 v.reset(OpARMMOVBstore)
14601 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14602 v0.AddArg2(src, mem)
14603 v.AddArg3(dst, v0, mem)
14604 return true
14605 }
14606
14607
14608
14609 for {
14610 if auxIntToInt64(v.AuxInt) != 2 {
14611 break
14612 }
14613 t := auxToType(v.Aux)
14614 dst := v_0
14615 src := v_1
14616 mem := v_2
14617 if !(t.Alignment()%2 == 0) {
14618 break
14619 }
14620 v.reset(OpARMMOVHstore)
14621 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16)
14622 v0.AddArg2(src, mem)
14623 v.AddArg3(dst, v0, mem)
14624 return true
14625 }
14626
14627
14628 for {
14629 if auxIntToInt64(v.AuxInt) != 2 {
14630 break
14631 }
14632 dst := v_0
14633 src := v_1
14634 mem := v_2
14635 v.reset(OpARMMOVBstore)
14636 v.AuxInt = int32ToAuxInt(1)
14637 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14638 v0.AuxInt = int32ToAuxInt(1)
14639 v0.AddArg2(src, mem)
14640 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
14641 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14642 v2.AddArg2(src, mem)
14643 v1.AddArg3(dst, v2, mem)
14644 v.AddArg3(dst, v0, v1)
14645 return true
14646 }
14647
14648
14649
14650 for {
14651 if auxIntToInt64(v.AuxInt) != 4 {
14652 break
14653 }
14654 t := auxToType(v.Aux)
14655 dst := v_0
14656 src := v_1
14657 mem := v_2
14658 if !(t.Alignment()%4 == 0) {
14659 break
14660 }
14661 v.reset(OpARMMOVWstore)
14662 v0 := b.NewValue0(v.Pos, OpARMMOVWload, typ.UInt32)
14663 v0.AddArg2(src, mem)
14664 v.AddArg3(dst, v0, mem)
14665 return true
14666 }
14667
14668
14669
14670 for {
14671 if auxIntToInt64(v.AuxInt) != 4 {
14672 break
14673 }
14674 t := auxToType(v.Aux)
14675 dst := v_0
14676 src := v_1
14677 mem := v_2
14678 if !(t.Alignment()%2 == 0) {
14679 break
14680 }
14681 v.reset(OpARMMOVHstore)
14682 v.AuxInt = int32ToAuxInt(2)
14683 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16)
14684 v0.AuxInt = int32ToAuxInt(2)
14685 v0.AddArg2(src, mem)
14686 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem)
14687 v2 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16)
14688 v2.AddArg2(src, mem)
14689 v1.AddArg3(dst, v2, mem)
14690 v.AddArg3(dst, v0, v1)
14691 return true
14692 }
14693
14694
14695 for {
14696 if auxIntToInt64(v.AuxInt) != 4 {
14697 break
14698 }
14699 dst := v_0
14700 src := v_1
14701 mem := v_2
14702 v.reset(OpARMMOVBstore)
14703 v.AuxInt = int32ToAuxInt(3)
14704 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14705 v0.AuxInt = int32ToAuxInt(3)
14706 v0.AddArg2(src, mem)
14707 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
14708 v1.AuxInt = int32ToAuxInt(2)
14709 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14710 v2.AuxInt = int32ToAuxInt(2)
14711 v2.AddArg2(src, mem)
14712 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
14713 v3.AuxInt = int32ToAuxInt(1)
14714 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14715 v4.AuxInt = int32ToAuxInt(1)
14716 v4.AddArg2(src, mem)
14717 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
14718 v6 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14719 v6.AddArg2(src, mem)
14720 v5.AddArg3(dst, v6, mem)
14721 v3.AddArg3(dst, v4, v5)
14722 v1.AddArg3(dst, v2, v3)
14723 v.AddArg3(dst, v0, v1)
14724 return true
14725 }
14726
14727
14728 for {
14729 if auxIntToInt64(v.AuxInt) != 3 {
14730 break
14731 }
14732 dst := v_0
14733 src := v_1
14734 mem := v_2
14735 v.reset(OpARMMOVBstore)
14736 v.AuxInt = int32ToAuxInt(2)
14737 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14738 v0.AuxInt = int32ToAuxInt(2)
14739 v0.AddArg2(src, mem)
14740 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
14741 v1.AuxInt = int32ToAuxInt(1)
14742 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14743 v2.AuxInt = int32ToAuxInt(1)
14744 v2.AddArg2(src, mem)
14745 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
14746 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14747 v4.AddArg2(src, mem)
14748 v3.AddArg3(dst, v4, mem)
14749 v1.AddArg3(dst, v2, v3)
14750 v.AddArg3(dst, v0, v1)
14751 return true
14752 }
14753
14754
14755
14756 for {
14757 s := auxIntToInt64(v.AuxInt)
14758 t := auxToType(v.Aux)
14759 dst := v_0
14760 src := v_1
14761 mem := v_2
14762 if !(s%4 == 0 && s > 4 && s <= 512 && t.Alignment()%4 == 0 && logLargeCopy(v, s)) {
14763 break
14764 }
14765 v.reset(OpARMDUFFCOPY)
14766 v.AuxInt = int64ToAuxInt(8 * (128 - s/4))
14767 v.AddArg3(dst, src, mem)
14768 return true
14769 }
14770
14771
14772
14773 for {
14774 s := auxIntToInt64(v.AuxInt)
14775 t := auxToType(v.Aux)
14776 dst := v_0
14777 src := v_1
14778 mem := v_2
14779 if !((s > 512 || t.Alignment()%4 != 0) && logLargeCopy(v, s)) {
14780 break
14781 }
14782 v.reset(OpARMLoweredMove)
14783 v.AuxInt = int64ToAuxInt(t.Alignment())
14784 v0 := b.NewValue0(v.Pos, OpARMADDconst, src.Type)
14785 v0.AuxInt = int32ToAuxInt(int32(s - moveSize(t.Alignment(), config)))
14786 v0.AddArg(src)
14787 v.AddArg4(dst, src, v0, mem)
14788 return true
14789 }
14790 return false
14791 }
14792 func rewriteValueARM_OpNeg16(v *Value) bool {
14793 v_0 := v.Args[0]
14794
14795
14796 for {
14797 x := v_0
14798 v.reset(OpARMRSBconst)
14799 v.AuxInt = int32ToAuxInt(0)
14800 v.AddArg(x)
14801 return true
14802 }
14803 }
14804 func rewriteValueARM_OpNeg32(v *Value) bool {
14805 v_0 := v.Args[0]
14806
14807
14808 for {
14809 x := v_0
14810 v.reset(OpARMRSBconst)
14811 v.AuxInt = int32ToAuxInt(0)
14812 v.AddArg(x)
14813 return true
14814 }
14815 }
14816 func rewriteValueARM_OpNeg8(v *Value) bool {
14817 v_0 := v.Args[0]
14818
14819
14820 for {
14821 x := v_0
14822 v.reset(OpARMRSBconst)
14823 v.AuxInt = int32ToAuxInt(0)
14824 v.AddArg(x)
14825 return true
14826 }
14827 }
14828 func rewriteValueARM_OpNeq16(v *Value) bool {
14829 v_1 := v.Args[1]
14830 v_0 := v.Args[0]
14831 b := v.Block
14832 typ := &b.Func.Config.Types
14833
14834
14835 for {
14836 x := v_0
14837 y := v_1
14838 v.reset(OpARMNotEqual)
14839 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
14840 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14841 v1.AddArg(x)
14842 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14843 v2.AddArg(y)
14844 v0.AddArg2(v1, v2)
14845 v.AddArg(v0)
14846 return true
14847 }
14848 }
14849 func rewriteValueARM_OpNeq32(v *Value) bool {
14850 v_1 := v.Args[1]
14851 v_0 := v.Args[0]
14852 b := v.Block
14853
14854
14855 for {
14856 x := v_0
14857 y := v_1
14858 v.reset(OpARMNotEqual)
14859 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
14860 v0.AddArg2(x, y)
14861 v.AddArg(v0)
14862 return true
14863 }
14864 }
14865 func rewriteValueARM_OpNeq32F(v *Value) bool {
14866 v_1 := v.Args[1]
14867 v_0 := v.Args[0]
14868 b := v.Block
14869
14870
14871 for {
14872 x := v_0
14873 y := v_1
14874 v.reset(OpARMNotEqual)
14875 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags)
14876 v0.AddArg2(x, y)
14877 v.AddArg(v0)
14878 return true
14879 }
14880 }
14881 func rewriteValueARM_OpNeq64F(v *Value) bool {
14882 v_1 := v.Args[1]
14883 v_0 := v.Args[0]
14884 b := v.Block
14885
14886
14887 for {
14888 x := v_0
14889 y := v_1
14890 v.reset(OpARMNotEqual)
14891 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags)
14892 v0.AddArg2(x, y)
14893 v.AddArg(v0)
14894 return true
14895 }
14896 }
14897 func rewriteValueARM_OpNeq8(v *Value) bool {
14898 v_1 := v.Args[1]
14899 v_0 := v.Args[0]
14900 b := v.Block
14901 typ := &b.Func.Config.Types
14902
14903
14904 for {
14905 x := v_0
14906 y := v_1
14907 v.reset(OpARMNotEqual)
14908 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
14909 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14910 v1.AddArg(x)
14911 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14912 v2.AddArg(y)
14913 v0.AddArg2(v1, v2)
14914 v.AddArg(v0)
14915 return true
14916 }
14917 }
14918 func rewriteValueARM_OpNeqPtr(v *Value) bool {
14919 v_1 := v.Args[1]
14920 v_0 := v.Args[0]
14921 b := v.Block
14922
14923
14924 for {
14925 x := v_0
14926 y := v_1
14927 v.reset(OpARMNotEqual)
14928 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
14929 v0.AddArg2(x, y)
14930 v.AddArg(v0)
14931 return true
14932 }
14933 }
14934 func rewriteValueARM_OpNot(v *Value) bool {
14935 v_0 := v.Args[0]
14936
14937
14938 for {
14939 x := v_0
14940 v.reset(OpARMXORconst)
14941 v.AuxInt = int32ToAuxInt(1)
14942 v.AddArg(x)
14943 return true
14944 }
14945 }
14946 func rewriteValueARM_OpOffPtr(v *Value) bool {
14947 v_0 := v.Args[0]
14948
14949
14950 for {
14951 off := auxIntToInt64(v.AuxInt)
14952 ptr := v_0
14953 if ptr.Op != OpSP {
14954 break
14955 }
14956 v.reset(OpARMMOVWaddr)
14957 v.AuxInt = int32ToAuxInt(int32(off))
14958 v.AddArg(ptr)
14959 return true
14960 }
14961
14962
14963 for {
14964 off := auxIntToInt64(v.AuxInt)
14965 ptr := v_0
14966 v.reset(OpARMADDconst)
14967 v.AuxInt = int32ToAuxInt(int32(off))
14968 v.AddArg(ptr)
14969 return true
14970 }
14971 }
14972 func rewriteValueARM_OpPanicBounds(v *Value) bool {
14973 v_2 := v.Args[2]
14974 v_1 := v.Args[1]
14975 v_0 := v.Args[0]
14976
14977
14978
14979 for {
14980 kind := auxIntToInt64(v.AuxInt)
14981 x := v_0
14982 y := v_1
14983 mem := v_2
14984 if !(boundsABI(kind) == 0) {
14985 break
14986 }
14987 v.reset(OpARMLoweredPanicBoundsA)
14988 v.AuxInt = int64ToAuxInt(kind)
14989 v.AddArg3(x, y, mem)
14990 return true
14991 }
14992
14993
14994
14995 for {
14996 kind := auxIntToInt64(v.AuxInt)
14997 x := v_0
14998 y := v_1
14999 mem := v_2
15000 if !(boundsABI(kind) == 1) {
15001 break
15002 }
15003 v.reset(OpARMLoweredPanicBoundsB)
15004 v.AuxInt = int64ToAuxInt(kind)
15005 v.AddArg3(x, y, mem)
15006 return true
15007 }
15008
15009
15010
15011 for {
15012 kind := auxIntToInt64(v.AuxInt)
15013 x := v_0
15014 y := v_1
15015 mem := v_2
15016 if !(boundsABI(kind) == 2) {
15017 break
15018 }
15019 v.reset(OpARMLoweredPanicBoundsC)
15020 v.AuxInt = int64ToAuxInt(kind)
15021 v.AddArg3(x, y, mem)
15022 return true
15023 }
15024 return false
15025 }
15026 func rewriteValueARM_OpPanicExtend(v *Value) bool {
15027 v_3 := v.Args[3]
15028 v_2 := v.Args[2]
15029 v_1 := v.Args[1]
15030 v_0 := v.Args[0]
15031
15032
15033
15034 for {
15035 kind := auxIntToInt64(v.AuxInt)
15036 hi := v_0
15037 lo := v_1
15038 y := v_2
15039 mem := v_3
15040 if !(boundsABI(kind) == 0) {
15041 break
15042 }
15043 v.reset(OpARMLoweredPanicExtendA)
15044 v.AuxInt = int64ToAuxInt(kind)
15045 v.AddArg4(hi, lo, y, mem)
15046 return true
15047 }
15048
15049
15050
15051 for {
15052 kind := auxIntToInt64(v.AuxInt)
15053 hi := v_0
15054 lo := v_1
15055 y := v_2
15056 mem := v_3
15057 if !(boundsABI(kind) == 1) {
15058 break
15059 }
15060 v.reset(OpARMLoweredPanicExtendB)
15061 v.AuxInt = int64ToAuxInt(kind)
15062 v.AddArg4(hi, lo, y, mem)
15063 return true
15064 }
15065
15066
15067
15068 for {
15069 kind := auxIntToInt64(v.AuxInt)
15070 hi := v_0
15071 lo := v_1
15072 y := v_2
15073 mem := v_3
15074 if !(boundsABI(kind) == 2) {
15075 break
15076 }
15077 v.reset(OpARMLoweredPanicExtendC)
15078 v.AuxInt = int64ToAuxInt(kind)
15079 v.AddArg4(hi, lo, y, mem)
15080 return true
15081 }
15082 return false
15083 }
15084 func rewriteValueARM_OpRotateLeft16(v *Value) bool {
15085 v_1 := v.Args[1]
15086 v_0 := v.Args[0]
15087 b := v.Block
15088 typ := &b.Func.Config.Types
15089
15090
15091 for {
15092 t := v.Type
15093 x := v_0
15094 if v_1.Op != OpARMMOVWconst {
15095 break
15096 }
15097 c := auxIntToInt32(v_1.AuxInt)
15098 v.reset(OpOr16)
15099 v0 := b.NewValue0(v.Pos, OpLsh16x32, t)
15100 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
15101 v1.AuxInt = int32ToAuxInt(c & 15)
15102 v0.AddArg2(x, v1)
15103 v2 := b.NewValue0(v.Pos, OpRsh16Ux32, t)
15104 v3 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
15105 v3.AuxInt = int32ToAuxInt(-c & 15)
15106 v2.AddArg2(x, v3)
15107 v.AddArg2(v0, v2)
15108 return true
15109 }
15110 return false
15111 }
15112 func rewriteValueARM_OpRotateLeft32(v *Value) bool {
15113 v_1 := v.Args[1]
15114 v_0 := v.Args[0]
15115 b := v.Block
15116
15117
15118 for {
15119 x := v_0
15120 y := v_1
15121 v.reset(OpARMSRR)
15122 v0 := b.NewValue0(v.Pos, OpARMRSBconst, y.Type)
15123 v0.AuxInt = int32ToAuxInt(0)
15124 v0.AddArg(y)
15125 v.AddArg2(x, v0)
15126 return true
15127 }
15128 }
15129 func rewriteValueARM_OpRotateLeft8(v *Value) bool {
15130 v_1 := v.Args[1]
15131 v_0 := v.Args[0]
15132 b := v.Block
15133 typ := &b.Func.Config.Types
15134
15135
15136 for {
15137 t := v.Type
15138 x := v_0
15139 if v_1.Op != OpARMMOVWconst {
15140 break
15141 }
15142 c := auxIntToInt32(v_1.AuxInt)
15143 v.reset(OpOr8)
15144 v0 := b.NewValue0(v.Pos, OpLsh8x32, t)
15145 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
15146 v1.AuxInt = int32ToAuxInt(c & 7)
15147 v0.AddArg2(x, v1)
15148 v2 := b.NewValue0(v.Pos, OpRsh8Ux32, t)
15149 v3 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
15150 v3.AuxInt = int32ToAuxInt(-c & 7)
15151 v2.AddArg2(x, v3)
15152 v.AddArg2(v0, v2)
15153 return true
15154 }
15155 return false
15156 }
15157 func rewriteValueARM_OpRsh16Ux16(v *Value) bool {
15158 v_1 := v.Args[1]
15159 v_0 := v.Args[0]
15160 b := v.Block
15161 typ := &b.Func.Config.Types
15162
15163
15164 for {
15165 x := v_0
15166 y := v_1
15167 v.reset(OpARMCMOVWHSconst)
15168 v.AuxInt = int32ToAuxInt(0)
15169 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
15170 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15171 v1.AddArg(x)
15172 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15173 v2.AddArg(y)
15174 v0.AddArg2(v1, v2)
15175 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15176 v3.AuxInt = int32ToAuxInt(256)
15177 v3.AddArg(v2)
15178 v.AddArg2(v0, v3)
15179 return true
15180 }
15181 }
15182 func rewriteValueARM_OpRsh16Ux32(v *Value) bool {
15183 v_1 := v.Args[1]
15184 v_0 := v.Args[0]
15185 b := v.Block
15186 typ := &b.Func.Config.Types
15187
15188
15189 for {
15190 x := v_0
15191 y := v_1
15192 v.reset(OpARMCMOVWHSconst)
15193 v.AuxInt = int32ToAuxInt(0)
15194 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
15195 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15196 v1.AddArg(x)
15197 v0.AddArg2(v1, y)
15198 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15199 v2.AuxInt = int32ToAuxInt(256)
15200 v2.AddArg(y)
15201 v.AddArg2(v0, v2)
15202 return true
15203 }
15204 }
15205 func rewriteValueARM_OpRsh16Ux64(v *Value) bool {
15206 v_1 := v.Args[1]
15207 v_0 := v.Args[0]
15208 b := v.Block
15209 typ := &b.Func.Config.Types
15210
15211
15212
15213 for {
15214 x := v_0
15215 if v_1.Op != OpConst64 {
15216 break
15217 }
15218 c := auxIntToInt64(v_1.AuxInt)
15219 if !(uint64(c) < 16) {
15220 break
15221 }
15222 v.reset(OpARMSRLconst)
15223 v.AuxInt = int32ToAuxInt(int32(c + 16))
15224 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32)
15225 v0.AuxInt = int32ToAuxInt(16)
15226 v0.AddArg(x)
15227 v.AddArg(v0)
15228 return true
15229 }
15230
15231
15232
15233 for {
15234 if v_1.Op != OpConst64 {
15235 break
15236 }
15237 c := auxIntToInt64(v_1.AuxInt)
15238 if !(uint64(c) >= 16) {
15239 break
15240 }
15241 v.reset(OpConst16)
15242 v.AuxInt = int16ToAuxInt(0)
15243 return true
15244 }
15245 return false
15246 }
15247 func rewriteValueARM_OpRsh16Ux8(v *Value) bool {
15248 v_1 := v.Args[1]
15249 v_0 := v.Args[0]
15250 b := v.Block
15251 typ := &b.Func.Config.Types
15252
15253
15254 for {
15255 x := v_0
15256 y := v_1
15257 v.reset(OpARMSRL)
15258 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15259 v0.AddArg(x)
15260 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15261 v1.AddArg(y)
15262 v.AddArg2(v0, v1)
15263 return true
15264 }
15265 }
15266 func rewriteValueARM_OpRsh16x16(v *Value) bool {
15267 v_1 := v.Args[1]
15268 v_0 := v.Args[0]
15269 b := v.Block
15270 typ := &b.Func.Config.Types
15271
15272
15273 for {
15274 x := v_0
15275 y := v_1
15276 v.reset(OpARMSRAcond)
15277 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
15278 v0.AddArg(x)
15279 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15280 v1.AddArg(y)
15281 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15282 v2.AuxInt = int32ToAuxInt(256)
15283 v2.AddArg(v1)
15284 v.AddArg3(v0, v1, v2)
15285 return true
15286 }
15287 }
15288 func rewriteValueARM_OpRsh16x32(v *Value) bool {
15289 v_1 := v.Args[1]
15290 v_0 := v.Args[0]
15291 b := v.Block
15292 typ := &b.Func.Config.Types
15293
15294
15295 for {
15296 x := v_0
15297 y := v_1
15298 v.reset(OpARMSRAcond)
15299 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
15300 v0.AddArg(x)
15301 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15302 v1.AuxInt = int32ToAuxInt(256)
15303 v1.AddArg(y)
15304 v.AddArg3(v0, y, v1)
15305 return true
15306 }
15307 }
15308 func rewriteValueARM_OpRsh16x64(v *Value) bool {
15309 v_1 := v.Args[1]
15310 v_0 := v.Args[0]
15311 b := v.Block
15312 typ := &b.Func.Config.Types
15313
15314
15315
15316 for {
15317 x := v_0
15318 if v_1.Op != OpConst64 {
15319 break
15320 }
15321 c := auxIntToInt64(v_1.AuxInt)
15322 if !(uint64(c) < 16) {
15323 break
15324 }
15325 v.reset(OpARMSRAconst)
15326 v.AuxInt = int32ToAuxInt(int32(c + 16))
15327 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32)
15328 v0.AuxInt = int32ToAuxInt(16)
15329 v0.AddArg(x)
15330 v.AddArg(v0)
15331 return true
15332 }
15333
15334
15335
15336 for {
15337 x := v_0
15338 if v_1.Op != OpConst64 {
15339 break
15340 }
15341 c := auxIntToInt64(v_1.AuxInt)
15342 if !(uint64(c) >= 16) {
15343 break
15344 }
15345 v.reset(OpARMSRAconst)
15346 v.AuxInt = int32ToAuxInt(31)
15347 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32)
15348 v0.AuxInt = int32ToAuxInt(16)
15349 v0.AddArg(x)
15350 v.AddArg(v0)
15351 return true
15352 }
15353 return false
15354 }
15355 func rewriteValueARM_OpRsh16x8(v *Value) bool {
15356 v_1 := v.Args[1]
15357 v_0 := v.Args[0]
15358 b := v.Block
15359 typ := &b.Func.Config.Types
15360
15361
15362 for {
15363 x := v_0
15364 y := v_1
15365 v.reset(OpARMSRA)
15366 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
15367 v0.AddArg(x)
15368 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15369 v1.AddArg(y)
15370 v.AddArg2(v0, v1)
15371 return true
15372 }
15373 }
15374 func rewriteValueARM_OpRsh32Ux16(v *Value) bool {
15375 v_1 := v.Args[1]
15376 v_0 := v.Args[0]
15377 b := v.Block
15378 typ := &b.Func.Config.Types
15379
15380
15381 for {
15382 x := v_0
15383 y := v_1
15384 v.reset(OpARMCMOVWHSconst)
15385 v.AuxInt = int32ToAuxInt(0)
15386 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
15387 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15388 v1.AddArg(y)
15389 v0.AddArg2(x, v1)
15390 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15391 v2.AuxInt = int32ToAuxInt(256)
15392 v2.AddArg(v1)
15393 v.AddArg2(v0, v2)
15394 return true
15395 }
15396 }
15397 func rewriteValueARM_OpRsh32Ux32(v *Value) bool {
15398 v_1 := v.Args[1]
15399 v_0 := v.Args[0]
15400 b := v.Block
15401
15402
15403 for {
15404 x := v_0
15405 y := v_1
15406 v.reset(OpARMCMOVWHSconst)
15407 v.AuxInt = int32ToAuxInt(0)
15408 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
15409 v0.AddArg2(x, y)
15410 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15411 v1.AuxInt = int32ToAuxInt(256)
15412 v1.AddArg(y)
15413 v.AddArg2(v0, v1)
15414 return true
15415 }
15416 }
15417 func rewriteValueARM_OpRsh32Ux64(v *Value) bool {
15418 v_1 := v.Args[1]
15419 v_0 := v.Args[0]
15420
15421
15422
15423 for {
15424 x := v_0
15425 if v_1.Op != OpConst64 {
15426 break
15427 }
15428 c := auxIntToInt64(v_1.AuxInt)
15429 if !(uint64(c) < 32) {
15430 break
15431 }
15432 v.reset(OpARMSRLconst)
15433 v.AuxInt = int32ToAuxInt(int32(c))
15434 v.AddArg(x)
15435 return true
15436 }
15437
15438
15439
15440 for {
15441 if v_1.Op != OpConst64 {
15442 break
15443 }
15444 c := auxIntToInt64(v_1.AuxInt)
15445 if !(uint64(c) >= 32) {
15446 break
15447 }
15448 v.reset(OpConst32)
15449 v.AuxInt = int32ToAuxInt(0)
15450 return true
15451 }
15452 return false
15453 }
15454 func rewriteValueARM_OpRsh32Ux8(v *Value) bool {
15455 v_1 := v.Args[1]
15456 v_0 := v.Args[0]
15457 b := v.Block
15458 typ := &b.Func.Config.Types
15459
15460
15461 for {
15462 x := v_0
15463 y := v_1
15464 v.reset(OpARMSRL)
15465 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15466 v0.AddArg(y)
15467 v.AddArg2(x, v0)
15468 return true
15469 }
15470 }
15471 func rewriteValueARM_OpRsh32x16(v *Value) bool {
15472 v_1 := v.Args[1]
15473 v_0 := v.Args[0]
15474 b := v.Block
15475 typ := &b.Func.Config.Types
15476
15477
15478 for {
15479 x := v_0
15480 y := v_1
15481 v.reset(OpARMSRAcond)
15482 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15483 v0.AddArg(y)
15484 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15485 v1.AuxInt = int32ToAuxInt(256)
15486 v1.AddArg(v0)
15487 v.AddArg3(x, v0, v1)
15488 return true
15489 }
15490 }
15491 func rewriteValueARM_OpRsh32x32(v *Value) bool {
15492 v_1 := v.Args[1]
15493 v_0 := v.Args[0]
15494 b := v.Block
15495
15496
15497 for {
15498 x := v_0
15499 y := v_1
15500 v.reset(OpARMSRAcond)
15501 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15502 v0.AuxInt = int32ToAuxInt(256)
15503 v0.AddArg(y)
15504 v.AddArg3(x, y, v0)
15505 return true
15506 }
15507 }
15508 func rewriteValueARM_OpRsh32x64(v *Value) bool {
15509 v_1 := v.Args[1]
15510 v_0 := v.Args[0]
15511
15512
15513
15514 for {
15515 x := v_0
15516 if v_1.Op != OpConst64 {
15517 break
15518 }
15519 c := auxIntToInt64(v_1.AuxInt)
15520 if !(uint64(c) < 32) {
15521 break
15522 }
15523 v.reset(OpARMSRAconst)
15524 v.AuxInt = int32ToAuxInt(int32(c))
15525 v.AddArg(x)
15526 return true
15527 }
15528
15529
15530
15531 for {
15532 x := v_0
15533 if v_1.Op != OpConst64 {
15534 break
15535 }
15536 c := auxIntToInt64(v_1.AuxInt)
15537 if !(uint64(c) >= 32) {
15538 break
15539 }
15540 v.reset(OpARMSRAconst)
15541 v.AuxInt = int32ToAuxInt(31)
15542 v.AddArg(x)
15543 return true
15544 }
15545 return false
15546 }
15547 func rewriteValueARM_OpRsh32x8(v *Value) bool {
15548 v_1 := v.Args[1]
15549 v_0 := v.Args[0]
15550 b := v.Block
15551 typ := &b.Func.Config.Types
15552
15553
15554 for {
15555 x := v_0
15556 y := v_1
15557 v.reset(OpARMSRA)
15558 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15559 v0.AddArg(y)
15560 v.AddArg2(x, v0)
15561 return true
15562 }
15563 }
15564 func rewriteValueARM_OpRsh8Ux16(v *Value) bool {
15565 v_1 := v.Args[1]
15566 v_0 := v.Args[0]
15567 b := v.Block
15568 typ := &b.Func.Config.Types
15569
15570
15571 for {
15572 x := v_0
15573 y := v_1
15574 v.reset(OpARMCMOVWHSconst)
15575 v.AuxInt = int32ToAuxInt(0)
15576 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
15577 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15578 v1.AddArg(x)
15579 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15580 v2.AddArg(y)
15581 v0.AddArg2(v1, v2)
15582 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15583 v3.AuxInt = int32ToAuxInt(256)
15584 v3.AddArg(v2)
15585 v.AddArg2(v0, v3)
15586 return true
15587 }
15588 }
15589 func rewriteValueARM_OpRsh8Ux32(v *Value) bool {
15590 v_1 := v.Args[1]
15591 v_0 := v.Args[0]
15592 b := v.Block
15593 typ := &b.Func.Config.Types
15594
15595
15596 for {
15597 x := v_0
15598 y := v_1
15599 v.reset(OpARMCMOVWHSconst)
15600 v.AuxInt = int32ToAuxInt(0)
15601 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
15602 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15603 v1.AddArg(x)
15604 v0.AddArg2(v1, y)
15605 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15606 v2.AuxInt = int32ToAuxInt(256)
15607 v2.AddArg(y)
15608 v.AddArg2(v0, v2)
15609 return true
15610 }
15611 }
15612 func rewriteValueARM_OpRsh8Ux64(v *Value) bool {
15613 v_1 := v.Args[1]
15614 v_0 := v.Args[0]
15615 b := v.Block
15616 typ := &b.Func.Config.Types
15617
15618
15619
15620 for {
15621 x := v_0
15622 if v_1.Op != OpConst64 {
15623 break
15624 }
15625 c := auxIntToInt64(v_1.AuxInt)
15626 if !(uint64(c) < 8) {
15627 break
15628 }
15629 v.reset(OpARMSRLconst)
15630 v.AuxInt = int32ToAuxInt(int32(c + 24))
15631 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32)
15632 v0.AuxInt = int32ToAuxInt(24)
15633 v0.AddArg(x)
15634 v.AddArg(v0)
15635 return true
15636 }
15637
15638
15639
15640 for {
15641 if v_1.Op != OpConst64 {
15642 break
15643 }
15644 c := auxIntToInt64(v_1.AuxInt)
15645 if !(uint64(c) >= 8) {
15646 break
15647 }
15648 v.reset(OpConst8)
15649 v.AuxInt = int8ToAuxInt(0)
15650 return true
15651 }
15652 return false
15653 }
15654 func rewriteValueARM_OpRsh8Ux8(v *Value) bool {
15655 v_1 := v.Args[1]
15656 v_0 := v.Args[0]
15657 b := v.Block
15658 typ := &b.Func.Config.Types
15659
15660
15661 for {
15662 x := v_0
15663 y := v_1
15664 v.reset(OpARMSRL)
15665 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15666 v0.AddArg(x)
15667 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15668 v1.AddArg(y)
15669 v.AddArg2(v0, v1)
15670 return true
15671 }
15672 }
15673 func rewriteValueARM_OpRsh8x16(v *Value) bool {
15674 v_1 := v.Args[1]
15675 v_0 := v.Args[0]
15676 b := v.Block
15677 typ := &b.Func.Config.Types
15678
15679
15680 for {
15681 x := v_0
15682 y := v_1
15683 v.reset(OpARMSRAcond)
15684 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
15685 v0.AddArg(x)
15686 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15687 v1.AddArg(y)
15688 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15689 v2.AuxInt = int32ToAuxInt(256)
15690 v2.AddArg(v1)
15691 v.AddArg3(v0, v1, v2)
15692 return true
15693 }
15694 }
15695 func rewriteValueARM_OpRsh8x32(v *Value) bool {
15696 v_1 := v.Args[1]
15697 v_0 := v.Args[0]
15698 b := v.Block
15699 typ := &b.Func.Config.Types
15700
15701
15702 for {
15703 x := v_0
15704 y := v_1
15705 v.reset(OpARMSRAcond)
15706 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
15707 v0.AddArg(x)
15708 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15709 v1.AuxInt = int32ToAuxInt(256)
15710 v1.AddArg(y)
15711 v.AddArg3(v0, y, v1)
15712 return true
15713 }
15714 }
15715 func rewriteValueARM_OpRsh8x64(v *Value) bool {
15716 v_1 := v.Args[1]
15717 v_0 := v.Args[0]
15718 b := v.Block
15719 typ := &b.Func.Config.Types
15720
15721
15722
15723 for {
15724 x := v_0
15725 if v_1.Op != OpConst64 {
15726 break
15727 }
15728 c := auxIntToInt64(v_1.AuxInt)
15729 if !(uint64(c) < 8) {
15730 break
15731 }
15732 v.reset(OpARMSRAconst)
15733 v.AuxInt = int32ToAuxInt(int32(c + 24))
15734 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32)
15735 v0.AuxInt = int32ToAuxInt(24)
15736 v0.AddArg(x)
15737 v.AddArg(v0)
15738 return true
15739 }
15740
15741
15742
15743 for {
15744 x := v_0
15745 if v_1.Op != OpConst64 {
15746 break
15747 }
15748 c := auxIntToInt64(v_1.AuxInt)
15749 if !(uint64(c) >= 8) {
15750 break
15751 }
15752 v.reset(OpARMSRAconst)
15753 v.AuxInt = int32ToAuxInt(31)
15754 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32)
15755 v0.AuxInt = int32ToAuxInt(24)
15756 v0.AddArg(x)
15757 v.AddArg(v0)
15758 return true
15759 }
15760 return false
15761 }
15762 func rewriteValueARM_OpRsh8x8(v *Value) bool {
15763 v_1 := v.Args[1]
15764 v_0 := v.Args[0]
15765 b := v.Block
15766 typ := &b.Func.Config.Types
15767
15768
15769 for {
15770 x := v_0
15771 y := v_1
15772 v.reset(OpARMSRA)
15773 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
15774 v0.AddArg(x)
15775 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15776 v1.AddArg(y)
15777 v.AddArg2(v0, v1)
15778 return true
15779 }
15780 }
15781 func rewriteValueARM_OpSelect0(v *Value) bool {
15782 v_0 := v.Args[0]
15783
15784
15785 for {
15786 if v_0.Op != OpARMCALLudiv {
15787 break
15788 }
15789 _ = v_0.Args[1]
15790 x := v_0.Args[0]
15791 v_0_1 := v_0.Args[1]
15792 if v_0_1.Op != OpARMMOVWconst || auxIntToInt32(v_0_1.AuxInt) != 1 {
15793 break
15794 }
15795 v.copyOf(x)
15796 return true
15797 }
15798
15799
15800
15801 for {
15802 if v_0.Op != OpARMCALLudiv {
15803 break
15804 }
15805 _ = v_0.Args[1]
15806 x := v_0.Args[0]
15807 v_0_1 := v_0.Args[1]
15808 if v_0_1.Op != OpARMMOVWconst {
15809 break
15810 }
15811 c := auxIntToInt32(v_0_1.AuxInt)
15812 if !(isPowerOfTwo(c)) {
15813 break
15814 }
15815 v.reset(OpARMSRLconst)
15816 v.AuxInt = int32ToAuxInt(int32(log32(c)))
15817 v.AddArg(x)
15818 return true
15819 }
15820
15821
15822
15823 for {
15824 if v_0.Op != OpARMCALLudiv {
15825 break
15826 }
15827 _ = v_0.Args[1]
15828 v_0_0 := v_0.Args[0]
15829 if v_0_0.Op != OpARMMOVWconst {
15830 break
15831 }
15832 c := auxIntToInt32(v_0_0.AuxInt)
15833 v_0_1 := v_0.Args[1]
15834 if v_0_1.Op != OpARMMOVWconst {
15835 break
15836 }
15837 d := auxIntToInt32(v_0_1.AuxInt)
15838 if !(d != 0) {
15839 break
15840 }
15841 v.reset(OpARMMOVWconst)
15842 v.AuxInt = int32ToAuxInt(int32(uint32(c) / uint32(d)))
15843 return true
15844 }
15845 return false
15846 }
15847 func rewriteValueARM_OpSelect1(v *Value) bool {
15848 v_0 := v.Args[0]
15849
15850
15851 for {
15852 if v_0.Op != OpARMCALLudiv {
15853 break
15854 }
15855 _ = v_0.Args[1]
15856 v_0_1 := v_0.Args[1]
15857 if v_0_1.Op != OpARMMOVWconst || auxIntToInt32(v_0_1.AuxInt) != 1 {
15858 break
15859 }
15860 v.reset(OpARMMOVWconst)
15861 v.AuxInt = int32ToAuxInt(0)
15862 return true
15863 }
15864
15865
15866
15867 for {
15868 if v_0.Op != OpARMCALLudiv {
15869 break
15870 }
15871 _ = v_0.Args[1]
15872 x := v_0.Args[0]
15873 v_0_1 := v_0.Args[1]
15874 if v_0_1.Op != OpARMMOVWconst {
15875 break
15876 }
15877 c := auxIntToInt32(v_0_1.AuxInt)
15878 if !(isPowerOfTwo(c)) {
15879 break
15880 }
15881 v.reset(OpARMANDconst)
15882 v.AuxInt = int32ToAuxInt(c - 1)
15883 v.AddArg(x)
15884 return true
15885 }
15886
15887
15888
15889 for {
15890 if v_0.Op != OpARMCALLudiv {
15891 break
15892 }
15893 _ = v_0.Args[1]
15894 v_0_0 := v_0.Args[0]
15895 if v_0_0.Op != OpARMMOVWconst {
15896 break
15897 }
15898 c := auxIntToInt32(v_0_0.AuxInt)
15899 v_0_1 := v_0.Args[1]
15900 if v_0_1.Op != OpARMMOVWconst {
15901 break
15902 }
15903 d := auxIntToInt32(v_0_1.AuxInt)
15904 if !(d != 0) {
15905 break
15906 }
15907 v.reset(OpARMMOVWconst)
15908 v.AuxInt = int32ToAuxInt(int32(uint32(c) % uint32(d)))
15909 return true
15910 }
15911 return false
15912 }
15913 func rewriteValueARM_OpSignmask(v *Value) bool {
15914 v_0 := v.Args[0]
15915
15916
15917 for {
15918 x := v_0
15919 v.reset(OpARMSRAconst)
15920 v.AuxInt = int32ToAuxInt(31)
15921 v.AddArg(x)
15922 return true
15923 }
15924 }
15925 func rewriteValueARM_OpSlicemask(v *Value) bool {
15926 v_0 := v.Args[0]
15927 b := v.Block
15928
15929
15930 for {
15931 t := v.Type
15932 x := v_0
15933 v.reset(OpARMSRAconst)
15934 v.AuxInt = int32ToAuxInt(31)
15935 v0 := b.NewValue0(v.Pos, OpARMRSBconst, t)
15936 v0.AuxInt = int32ToAuxInt(0)
15937 v0.AddArg(x)
15938 v.AddArg(v0)
15939 return true
15940 }
15941 }
15942 func rewriteValueARM_OpStore(v *Value) bool {
15943 v_2 := v.Args[2]
15944 v_1 := v.Args[1]
15945 v_0 := v.Args[0]
15946
15947
15948
15949 for {
15950 t := auxToType(v.Aux)
15951 ptr := v_0
15952 val := v_1
15953 mem := v_2
15954 if !(t.Size() == 1) {
15955 break
15956 }
15957 v.reset(OpARMMOVBstore)
15958 v.AddArg3(ptr, val, mem)
15959 return true
15960 }
15961
15962
15963
15964 for {
15965 t := auxToType(v.Aux)
15966 ptr := v_0
15967 val := v_1
15968 mem := v_2
15969 if !(t.Size() == 2) {
15970 break
15971 }
15972 v.reset(OpARMMOVHstore)
15973 v.AddArg3(ptr, val, mem)
15974 return true
15975 }
15976
15977
15978
15979 for {
15980 t := auxToType(v.Aux)
15981 ptr := v_0
15982 val := v_1
15983 mem := v_2
15984 if !(t.Size() == 4 && !t.IsFloat()) {
15985 break
15986 }
15987 v.reset(OpARMMOVWstore)
15988 v.AddArg3(ptr, val, mem)
15989 return true
15990 }
15991
15992
15993
15994 for {
15995 t := auxToType(v.Aux)
15996 ptr := v_0
15997 val := v_1
15998 mem := v_2
15999 if !(t.Size() == 4 && t.IsFloat()) {
16000 break
16001 }
16002 v.reset(OpARMMOVFstore)
16003 v.AddArg3(ptr, val, mem)
16004 return true
16005 }
16006
16007
16008
16009 for {
16010 t := auxToType(v.Aux)
16011 ptr := v_0
16012 val := v_1
16013 mem := v_2
16014 if !(t.Size() == 8 && t.IsFloat()) {
16015 break
16016 }
16017 v.reset(OpARMMOVDstore)
16018 v.AddArg3(ptr, val, mem)
16019 return true
16020 }
16021 return false
16022 }
16023 func rewriteValueARM_OpZero(v *Value) bool {
16024 v_1 := v.Args[1]
16025 v_0 := v.Args[0]
16026 b := v.Block
16027 config := b.Func.Config
16028 typ := &b.Func.Config.Types
16029
16030
16031 for {
16032 if auxIntToInt64(v.AuxInt) != 0 {
16033 break
16034 }
16035 mem := v_1
16036 v.copyOf(mem)
16037 return true
16038 }
16039
16040
16041 for {
16042 if auxIntToInt64(v.AuxInt) != 1 {
16043 break
16044 }
16045 ptr := v_0
16046 mem := v_1
16047 v.reset(OpARMMOVBstore)
16048 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16049 v0.AuxInt = int32ToAuxInt(0)
16050 v.AddArg3(ptr, v0, mem)
16051 return true
16052 }
16053
16054
16055
16056 for {
16057 if auxIntToInt64(v.AuxInt) != 2 {
16058 break
16059 }
16060 t := auxToType(v.Aux)
16061 ptr := v_0
16062 mem := v_1
16063 if !(t.Alignment()%2 == 0) {
16064 break
16065 }
16066 v.reset(OpARMMOVHstore)
16067 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16068 v0.AuxInt = int32ToAuxInt(0)
16069 v.AddArg3(ptr, v0, mem)
16070 return true
16071 }
16072
16073
16074 for {
16075 if auxIntToInt64(v.AuxInt) != 2 {
16076 break
16077 }
16078 ptr := v_0
16079 mem := v_1
16080 v.reset(OpARMMOVBstore)
16081 v.AuxInt = int32ToAuxInt(1)
16082 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16083 v0.AuxInt = int32ToAuxInt(0)
16084 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
16085 v1.AuxInt = int32ToAuxInt(0)
16086 v1.AddArg3(ptr, v0, mem)
16087 v.AddArg3(ptr, v0, v1)
16088 return true
16089 }
16090
16091
16092
16093 for {
16094 if auxIntToInt64(v.AuxInt) != 4 {
16095 break
16096 }
16097 t := auxToType(v.Aux)
16098 ptr := v_0
16099 mem := v_1
16100 if !(t.Alignment()%4 == 0) {
16101 break
16102 }
16103 v.reset(OpARMMOVWstore)
16104 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16105 v0.AuxInt = int32ToAuxInt(0)
16106 v.AddArg3(ptr, v0, mem)
16107 return true
16108 }
16109
16110
16111
16112 for {
16113 if auxIntToInt64(v.AuxInt) != 4 {
16114 break
16115 }
16116 t := auxToType(v.Aux)
16117 ptr := v_0
16118 mem := v_1
16119 if !(t.Alignment()%2 == 0) {
16120 break
16121 }
16122 v.reset(OpARMMOVHstore)
16123 v.AuxInt = int32ToAuxInt(2)
16124 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16125 v0.AuxInt = int32ToAuxInt(0)
16126 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem)
16127 v1.AuxInt = int32ToAuxInt(0)
16128 v1.AddArg3(ptr, v0, mem)
16129 v.AddArg3(ptr, v0, v1)
16130 return true
16131 }
16132
16133
16134 for {
16135 if auxIntToInt64(v.AuxInt) != 4 {
16136 break
16137 }
16138 ptr := v_0
16139 mem := v_1
16140 v.reset(OpARMMOVBstore)
16141 v.AuxInt = int32ToAuxInt(3)
16142 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16143 v0.AuxInt = int32ToAuxInt(0)
16144 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
16145 v1.AuxInt = int32ToAuxInt(2)
16146 v2 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
16147 v2.AuxInt = int32ToAuxInt(1)
16148 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
16149 v3.AuxInt = int32ToAuxInt(0)
16150 v3.AddArg3(ptr, v0, mem)
16151 v2.AddArg3(ptr, v0, v3)
16152 v1.AddArg3(ptr, v0, v2)
16153 v.AddArg3(ptr, v0, v1)
16154 return true
16155 }
16156
16157
16158 for {
16159 if auxIntToInt64(v.AuxInt) != 3 {
16160 break
16161 }
16162 ptr := v_0
16163 mem := v_1
16164 v.reset(OpARMMOVBstore)
16165 v.AuxInt = int32ToAuxInt(2)
16166 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16167 v0.AuxInt = int32ToAuxInt(0)
16168 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
16169 v1.AuxInt = int32ToAuxInt(1)
16170 v2 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
16171 v2.AuxInt = int32ToAuxInt(0)
16172 v2.AddArg3(ptr, v0, mem)
16173 v1.AddArg3(ptr, v0, v2)
16174 v.AddArg3(ptr, v0, v1)
16175 return true
16176 }
16177
16178
16179
16180 for {
16181 s := auxIntToInt64(v.AuxInt)
16182 t := auxToType(v.Aux)
16183 ptr := v_0
16184 mem := v_1
16185 if !(s%4 == 0 && s > 4 && s <= 512 && t.Alignment()%4 == 0) {
16186 break
16187 }
16188 v.reset(OpARMDUFFZERO)
16189 v.AuxInt = int64ToAuxInt(4 * (128 - s/4))
16190 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16191 v0.AuxInt = int32ToAuxInt(0)
16192 v.AddArg3(ptr, v0, mem)
16193 return true
16194 }
16195
16196
16197
16198 for {
16199 s := auxIntToInt64(v.AuxInt)
16200 t := auxToType(v.Aux)
16201 ptr := v_0
16202 mem := v_1
16203 if !(s > 512 || t.Alignment()%4 != 0) {
16204 break
16205 }
16206 v.reset(OpARMLoweredZero)
16207 v.AuxInt = int64ToAuxInt(t.Alignment())
16208 v0 := b.NewValue0(v.Pos, OpARMADDconst, ptr.Type)
16209 v0.AuxInt = int32ToAuxInt(int32(s - moveSize(t.Alignment(), config)))
16210 v0.AddArg(ptr)
16211 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16212 v1.AuxInt = int32ToAuxInt(0)
16213 v.AddArg4(ptr, v0, v1, mem)
16214 return true
16215 }
16216 return false
16217 }
16218 func rewriteValueARM_OpZeromask(v *Value) bool {
16219 v_0 := v.Args[0]
16220 b := v.Block
16221 typ := &b.Func.Config.Types
16222
16223
16224 for {
16225 x := v_0
16226 v.reset(OpARMSRAconst)
16227 v.AuxInt = int32ToAuxInt(31)
16228 v0 := b.NewValue0(v.Pos, OpARMRSBshiftRL, typ.Int32)
16229 v0.AuxInt = int32ToAuxInt(1)
16230 v0.AddArg2(x, x)
16231 v.AddArg(v0)
16232 return true
16233 }
16234 }
16235 func rewriteBlockARM(b *Block) bool {
16236 switch b.Kind {
16237 case BlockARMEQ:
16238
16239
16240
16241 for b.Controls[0].Op == OpARMFlagConstant {
16242 v_0 := b.Controls[0]
16243 fc := auxIntToFlagConstant(v_0.AuxInt)
16244 if !(fc.eq()) {
16245 break
16246 }
16247 b.Reset(BlockFirst)
16248 return true
16249 }
16250
16251
16252
16253 for b.Controls[0].Op == OpARMFlagConstant {
16254 v_0 := b.Controls[0]
16255 fc := auxIntToFlagConstant(v_0.AuxInt)
16256 if !(!fc.eq()) {
16257 break
16258 }
16259 b.Reset(BlockFirst)
16260 b.swapSuccessors()
16261 return true
16262 }
16263
16264
16265 for b.Controls[0].Op == OpARMInvertFlags {
16266 v_0 := b.Controls[0]
16267 cmp := v_0.Args[0]
16268 b.resetWithControl(BlockARMEQ, cmp)
16269 return true
16270 }
16271
16272
16273 for b.Controls[0].Op == OpARMCMP {
16274 v_0 := b.Controls[0]
16275 _ = v_0.Args[1]
16276 x := v_0.Args[0]
16277 v_0_1 := v_0.Args[1]
16278 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 {
16279 break
16280 }
16281 y := v_0_1.Args[0]
16282 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
16283 v0.AddArg2(x, y)
16284 b.resetWithControl(BlockARMEQ, v0)
16285 return true
16286 }
16287
16288
16289 for b.Controls[0].Op == OpARMCMN {
16290 v_0 := b.Controls[0]
16291 _ = v_0.Args[1]
16292 v_0_0 := v_0.Args[0]
16293 v_0_1 := v_0.Args[1]
16294 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
16295 x := v_0_0
16296 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 {
16297 continue
16298 }
16299 y := v_0_1.Args[0]
16300 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
16301 v0.AddArg2(x, y)
16302 b.resetWithControl(BlockARMEQ, v0)
16303 return true
16304 }
16305 break
16306 }
16307
16308
16309
16310 for b.Controls[0].Op == OpARMCMPconst {
16311 v_0 := b.Controls[0]
16312 if auxIntToInt32(v_0.AuxInt) != 0 {
16313 break
16314 }
16315 l := v_0.Args[0]
16316 if l.Op != OpARMSUB {
16317 break
16318 }
16319 y := l.Args[1]
16320 x := l.Args[0]
16321 if !(l.Uses == 1) {
16322 break
16323 }
16324 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
16325 v0.AddArg2(x, y)
16326 b.resetWithControl(BlockARMEQ, v0)
16327 return true
16328 }
16329
16330
16331
16332 for b.Controls[0].Op == OpARMCMPconst {
16333 v_0 := b.Controls[0]
16334 if auxIntToInt32(v_0.AuxInt) != 0 {
16335 break
16336 }
16337 l := v_0.Args[0]
16338 if l.Op != OpARMMULS {
16339 break
16340 }
16341 a := l.Args[2]
16342 x := l.Args[0]
16343 y := l.Args[1]
16344 if !(l.Uses == 1) {
16345 break
16346 }
16347 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
16348 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
16349 v1.AddArg2(x, y)
16350 v0.AddArg2(a, v1)
16351 b.resetWithControl(BlockARMEQ, v0)
16352 return true
16353 }
16354
16355
16356
16357 for b.Controls[0].Op == OpARMCMPconst {
16358 v_0 := b.Controls[0]
16359 if auxIntToInt32(v_0.AuxInt) != 0 {
16360 break
16361 }
16362 l := v_0.Args[0]
16363 if l.Op != OpARMSUBconst {
16364 break
16365 }
16366 c := auxIntToInt32(l.AuxInt)
16367 x := l.Args[0]
16368 if !(l.Uses == 1) {
16369 break
16370 }
16371 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags)
16372 v0.AuxInt = int32ToAuxInt(c)
16373 v0.AddArg(x)
16374 b.resetWithControl(BlockARMEQ, v0)
16375 return true
16376 }
16377
16378
16379
16380 for b.Controls[0].Op == OpARMCMPconst {
16381 v_0 := b.Controls[0]
16382 if auxIntToInt32(v_0.AuxInt) != 0 {
16383 break
16384 }
16385 l := v_0.Args[0]
16386 if l.Op != OpARMSUBshiftLL {
16387 break
16388 }
16389 c := auxIntToInt32(l.AuxInt)
16390 y := l.Args[1]
16391 x := l.Args[0]
16392 if !(l.Uses == 1) {
16393 break
16394 }
16395 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags)
16396 v0.AuxInt = int32ToAuxInt(c)
16397 v0.AddArg2(x, y)
16398 b.resetWithControl(BlockARMEQ, v0)
16399 return true
16400 }
16401
16402
16403
16404 for b.Controls[0].Op == OpARMCMPconst {
16405 v_0 := b.Controls[0]
16406 if auxIntToInt32(v_0.AuxInt) != 0 {
16407 break
16408 }
16409 l := v_0.Args[0]
16410 if l.Op != OpARMSUBshiftRL {
16411 break
16412 }
16413 c := auxIntToInt32(l.AuxInt)
16414 y := l.Args[1]
16415 x := l.Args[0]
16416 if !(l.Uses == 1) {
16417 break
16418 }
16419 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags)
16420 v0.AuxInt = int32ToAuxInt(c)
16421 v0.AddArg2(x, y)
16422 b.resetWithControl(BlockARMEQ, v0)
16423 return true
16424 }
16425
16426
16427
16428 for b.Controls[0].Op == OpARMCMPconst {
16429 v_0 := b.Controls[0]
16430 if auxIntToInt32(v_0.AuxInt) != 0 {
16431 break
16432 }
16433 l := v_0.Args[0]
16434 if l.Op != OpARMSUBshiftRA {
16435 break
16436 }
16437 c := auxIntToInt32(l.AuxInt)
16438 y := l.Args[1]
16439 x := l.Args[0]
16440 if !(l.Uses == 1) {
16441 break
16442 }
16443 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags)
16444 v0.AuxInt = int32ToAuxInt(c)
16445 v0.AddArg2(x, y)
16446 b.resetWithControl(BlockARMEQ, v0)
16447 return true
16448 }
16449
16450
16451
16452 for b.Controls[0].Op == OpARMCMPconst {
16453 v_0 := b.Controls[0]
16454 if auxIntToInt32(v_0.AuxInt) != 0 {
16455 break
16456 }
16457 l := v_0.Args[0]
16458 if l.Op != OpARMSUBshiftLLreg {
16459 break
16460 }
16461 z := l.Args[2]
16462 x := l.Args[0]
16463 y := l.Args[1]
16464 if !(l.Uses == 1) {
16465 break
16466 }
16467 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
16468 v0.AddArg3(x, y, z)
16469 b.resetWithControl(BlockARMEQ, v0)
16470 return true
16471 }
16472
16473
16474
16475 for b.Controls[0].Op == OpARMCMPconst {
16476 v_0 := b.Controls[0]
16477 if auxIntToInt32(v_0.AuxInt) != 0 {
16478 break
16479 }
16480 l := v_0.Args[0]
16481 if l.Op != OpARMSUBshiftRLreg {
16482 break
16483 }
16484 z := l.Args[2]
16485 x := l.Args[0]
16486 y := l.Args[1]
16487 if !(l.Uses == 1) {
16488 break
16489 }
16490 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
16491 v0.AddArg3(x, y, z)
16492 b.resetWithControl(BlockARMEQ, v0)
16493 return true
16494 }
16495
16496
16497
16498 for b.Controls[0].Op == OpARMCMPconst {
16499 v_0 := b.Controls[0]
16500 if auxIntToInt32(v_0.AuxInt) != 0 {
16501 break
16502 }
16503 l := v_0.Args[0]
16504 if l.Op != OpARMSUBshiftRAreg {
16505 break
16506 }
16507 z := l.Args[2]
16508 x := l.Args[0]
16509 y := l.Args[1]
16510 if !(l.Uses == 1) {
16511 break
16512 }
16513 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
16514 v0.AddArg3(x, y, z)
16515 b.resetWithControl(BlockARMEQ, v0)
16516 return true
16517 }
16518
16519
16520
16521 for b.Controls[0].Op == OpARMCMPconst {
16522 v_0 := b.Controls[0]
16523 if auxIntToInt32(v_0.AuxInt) != 0 {
16524 break
16525 }
16526 l := v_0.Args[0]
16527 if l.Op != OpARMADD {
16528 break
16529 }
16530 _ = l.Args[1]
16531 l_0 := l.Args[0]
16532 l_1 := l.Args[1]
16533 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
16534 x := l_0
16535 y := l_1
16536 if !(l.Uses == 1) {
16537 continue
16538 }
16539 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
16540 v0.AddArg2(x, y)
16541 b.resetWithControl(BlockARMEQ, v0)
16542 return true
16543 }
16544 break
16545 }
16546
16547
16548
16549 for b.Controls[0].Op == OpARMCMPconst {
16550 v_0 := b.Controls[0]
16551 if auxIntToInt32(v_0.AuxInt) != 0 {
16552 break
16553 }
16554 l := v_0.Args[0]
16555 if l.Op != OpARMMULA {
16556 break
16557 }
16558 a := l.Args[2]
16559 x := l.Args[0]
16560 y := l.Args[1]
16561 if !(l.Uses == 1) {
16562 break
16563 }
16564 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
16565 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
16566 v1.AddArg2(x, y)
16567 v0.AddArg2(a, v1)
16568 b.resetWithControl(BlockARMEQ, v0)
16569 return true
16570 }
16571
16572
16573
16574 for b.Controls[0].Op == OpARMCMPconst {
16575 v_0 := b.Controls[0]
16576 if auxIntToInt32(v_0.AuxInt) != 0 {
16577 break
16578 }
16579 l := v_0.Args[0]
16580 if l.Op != OpARMADDconst {
16581 break
16582 }
16583 c := auxIntToInt32(l.AuxInt)
16584 x := l.Args[0]
16585 if !(l.Uses == 1) {
16586 break
16587 }
16588 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags)
16589 v0.AuxInt = int32ToAuxInt(c)
16590 v0.AddArg(x)
16591 b.resetWithControl(BlockARMEQ, v0)
16592 return true
16593 }
16594
16595
16596
16597 for b.Controls[0].Op == OpARMCMPconst {
16598 v_0 := b.Controls[0]
16599 if auxIntToInt32(v_0.AuxInt) != 0 {
16600 break
16601 }
16602 l := v_0.Args[0]
16603 if l.Op != OpARMADDshiftLL {
16604 break
16605 }
16606 c := auxIntToInt32(l.AuxInt)
16607 y := l.Args[1]
16608 x := l.Args[0]
16609 if !(l.Uses == 1) {
16610 break
16611 }
16612 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags)
16613 v0.AuxInt = int32ToAuxInt(c)
16614 v0.AddArg2(x, y)
16615 b.resetWithControl(BlockARMEQ, v0)
16616 return true
16617 }
16618
16619
16620
16621 for b.Controls[0].Op == OpARMCMPconst {
16622 v_0 := b.Controls[0]
16623 if auxIntToInt32(v_0.AuxInt) != 0 {
16624 break
16625 }
16626 l := v_0.Args[0]
16627 if l.Op != OpARMADDshiftRL {
16628 break
16629 }
16630 c := auxIntToInt32(l.AuxInt)
16631 y := l.Args[1]
16632 x := l.Args[0]
16633 if !(l.Uses == 1) {
16634 break
16635 }
16636 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags)
16637 v0.AuxInt = int32ToAuxInt(c)
16638 v0.AddArg2(x, y)
16639 b.resetWithControl(BlockARMEQ, v0)
16640 return true
16641 }
16642
16643
16644
16645 for b.Controls[0].Op == OpARMCMPconst {
16646 v_0 := b.Controls[0]
16647 if auxIntToInt32(v_0.AuxInt) != 0 {
16648 break
16649 }
16650 l := v_0.Args[0]
16651 if l.Op != OpARMADDshiftRA {
16652 break
16653 }
16654 c := auxIntToInt32(l.AuxInt)
16655 y := l.Args[1]
16656 x := l.Args[0]
16657 if !(l.Uses == 1) {
16658 break
16659 }
16660 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags)
16661 v0.AuxInt = int32ToAuxInt(c)
16662 v0.AddArg2(x, y)
16663 b.resetWithControl(BlockARMEQ, v0)
16664 return true
16665 }
16666
16667
16668
16669 for b.Controls[0].Op == OpARMCMPconst {
16670 v_0 := b.Controls[0]
16671 if auxIntToInt32(v_0.AuxInt) != 0 {
16672 break
16673 }
16674 l := v_0.Args[0]
16675 if l.Op != OpARMADDshiftLLreg {
16676 break
16677 }
16678 z := l.Args[2]
16679 x := l.Args[0]
16680 y := l.Args[1]
16681 if !(l.Uses == 1) {
16682 break
16683 }
16684 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags)
16685 v0.AddArg3(x, y, z)
16686 b.resetWithControl(BlockARMEQ, v0)
16687 return true
16688 }
16689
16690
16691
16692 for b.Controls[0].Op == OpARMCMPconst {
16693 v_0 := b.Controls[0]
16694 if auxIntToInt32(v_0.AuxInt) != 0 {
16695 break
16696 }
16697 l := v_0.Args[0]
16698 if l.Op != OpARMADDshiftRLreg {
16699 break
16700 }
16701 z := l.Args[2]
16702 x := l.Args[0]
16703 y := l.Args[1]
16704 if !(l.Uses == 1) {
16705 break
16706 }
16707 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags)
16708 v0.AddArg3(x, y, z)
16709 b.resetWithControl(BlockARMEQ, v0)
16710 return true
16711 }
16712
16713
16714
16715 for b.Controls[0].Op == OpARMCMPconst {
16716 v_0 := b.Controls[0]
16717 if auxIntToInt32(v_0.AuxInt) != 0 {
16718 break
16719 }
16720 l := v_0.Args[0]
16721 if l.Op != OpARMADDshiftRAreg {
16722 break
16723 }
16724 z := l.Args[2]
16725 x := l.Args[0]
16726 y := l.Args[1]
16727 if !(l.Uses == 1) {
16728 break
16729 }
16730 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags)
16731 v0.AddArg3(x, y, z)
16732 b.resetWithControl(BlockARMEQ, v0)
16733 return true
16734 }
16735
16736
16737
16738 for b.Controls[0].Op == OpARMCMPconst {
16739 v_0 := b.Controls[0]
16740 if auxIntToInt32(v_0.AuxInt) != 0 {
16741 break
16742 }
16743 l := v_0.Args[0]
16744 if l.Op != OpARMAND {
16745 break
16746 }
16747 _ = l.Args[1]
16748 l_0 := l.Args[0]
16749 l_1 := l.Args[1]
16750 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
16751 x := l_0
16752 y := l_1
16753 if !(l.Uses == 1) {
16754 continue
16755 }
16756 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags)
16757 v0.AddArg2(x, y)
16758 b.resetWithControl(BlockARMEQ, v0)
16759 return true
16760 }
16761 break
16762 }
16763
16764
16765
16766 for b.Controls[0].Op == OpARMCMPconst {
16767 v_0 := b.Controls[0]
16768 if auxIntToInt32(v_0.AuxInt) != 0 {
16769 break
16770 }
16771 l := v_0.Args[0]
16772 if l.Op != OpARMANDconst {
16773 break
16774 }
16775 c := auxIntToInt32(l.AuxInt)
16776 x := l.Args[0]
16777 if !(l.Uses == 1) {
16778 break
16779 }
16780 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags)
16781 v0.AuxInt = int32ToAuxInt(c)
16782 v0.AddArg(x)
16783 b.resetWithControl(BlockARMEQ, v0)
16784 return true
16785 }
16786
16787
16788
16789 for b.Controls[0].Op == OpARMCMPconst {
16790 v_0 := b.Controls[0]
16791 if auxIntToInt32(v_0.AuxInt) != 0 {
16792 break
16793 }
16794 l := v_0.Args[0]
16795 if l.Op != OpARMANDshiftLL {
16796 break
16797 }
16798 c := auxIntToInt32(l.AuxInt)
16799 y := l.Args[1]
16800 x := l.Args[0]
16801 if !(l.Uses == 1) {
16802 break
16803 }
16804 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags)
16805 v0.AuxInt = int32ToAuxInt(c)
16806 v0.AddArg2(x, y)
16807 b.resetWithControl(BlockARMEQ, v0)
16808 return true
16809 }
16810
16811
16812
16813 for b.Controls[0].Op == OpARMCMPconst {
16814 v_0 := b.Controls[0]
16815 if auxIntToInt32(v_0.AuxInt) != 0 {
16816 break
16817 }
16818 l := v_0.Args[0]
16819 if l.Op != OpARMANDshiftRL {
16820 break
16821 }
16822 c := auxIntToInt32(l.AuxInt)
16823 y := l.Args[1]
16824 x := l.Args[0]
16825 if !(l.Uses == 1) {
16826 break
16827 }
16828 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags)
16829 v0.AuxInt = int32ToAuxInt(c)
16830 v0.AddArg2(x, y)
16831 b.resetWithControl(BlockARMEQ, v0)
16832 return true
16833 }
16834
16835
16836
16837 for b.Controls[0].Op == OpARMCMPconst {
16838 v_0 := b.Controls[0]
16839 if auxIntToInt32(v_0.AuxInt) != 0 {
16840 break
16841 }
16842 l := v_0.Args[0]
16843 if l.Op != OpARMANDshiftRA {
16844 break
16845 }
16846 c := auxIntToInt32(l.AuxInt)
16847 y := l.Args[1]
16848 x := l.Args[0]
16849 if !(l.Uses == 1) {
16850 break
16851 }
16852 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags)
16853 v0.AuxInt = int32ToAuxInt(c)
16854 v0.AddArg2(x, y)
16855 b.resetWithControl(BlockARMEQ, v0)
16856 return true
16857 }
16858
16859
16860
16861 for b.Controls[0].Op == OpARMCMPconst {
16862 v_0 := b.Controls[0]
16863 if auxIntToInt32(v_0.AuxInt) != 0 {
16864 break
16865 }
16866 l := v_0.Args[0]
16867 if l.Op != OpARMANDshiftLLreg {
16868 break
16869 }
16870 z := l.Args[2]
16871 x := l.Args[0]
16872 y := l.Args[1]
16873 if !(l.Uses == 1) {
16874 break
16875 }
16876 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags)
16877 v0.AddArg3(x, y, z)
16878 b.resetWithControl(BlockARMEQ, v0)
16879 return true
16880 }
16881
16882
16883
16884 for b.Controls[0].Op == OpARMCMPconst {
16885 v_0 := b.Controls[0]
16886 if auxIntToInt32(v_0.AuxInt) != 0 {
16887 break
16888 }
16889 l := v_0.Args[0]
16890 if l.Op != OpARMANDshiftRLreg {
16891 break
16892 }
16893 z := l.Args[2]
16894 x := l.Args[0]
16895 y := l.Args[1]
16896 if !(l.Uses == 1) {
16897 break
16898 }
16899 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags)
16900 v0.AddArg3(x, y, z)
16901 b.resetWithControl(BlockARMEQ, v0)
16902 return true
16903 }
16904
16905
16906
16907 for b.Controls[0].Op == OpARMCMPconst {
16908 v_0 := b.Controls[0]
16909 if auxIntToInt32(v_0.AuxInt) != 0 {
16910 break
16911 }
16912 l := v_0.Args[0]
16913 if l.Op != OpARMANDshiftRAreg {
16914 break
16915 }
16916 z := l.Args[2]
16917 x := l.Args[0]
16918 y := l.Args[1]
16919 if !(l.Uses == 1) {
16920 break
16921 }
16922 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags)
16923 v0.AddArg3(x, y, z)
16924 b.resetWithControl(BlockARMEQ, v0)
16925 return true
16926 }
16927
16928
16929
16930 for b.Controls[0].Op == OpARMCMPconst {
16931 v_0 := b.Controls[0]
16932 if auxIntToInt32(v_0.AuxInt) != 0 {
16933 break
16934 }
16935 l := v_0.Args[0]
16936 if l.Op != OpARMXOR {
16937 break
16938 }
16939 _ = l.Args[1]
16940 l_0 := l.Args[0]
16941 l_1 := l.Args[1]
16942 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
16943 x := l_0
16944 y := l_1
16945 if !(l.Uses == 1) {
16946 continue
16947 }
16948 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags)
16949 v0.AddArg2(x, y)
16950 b.resetWithControl(BlockARMEQ, v0)
16951 return true
16952 }
16953 break
16954 }
16955
16956
16957
16958 for b.Controls[0].Op == OpARMCMPconst {
16959 v_0 := b.Controls[0]
16960 if auxIntToInt32(v_0.AuxInt) != 0 {
16961 break
16962 }
16963 l := v_0.Args[0]
16964 if l.Op != OpARMXORconst {
16965 break
16966 }
16967 c := auxIntToInt32(l.AuxInt)
16968 x := l.Args[0]
16969 if !(l.Uses == 1) {
16970 break
16971 }
16972 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags)
16973 v0.AuxInt = int32ToAuxInt(c)
16974 v0.AddArg(x)
16975 b.resetWithControl(BlockARMEQ, v0)
16976 return true
16977 }
16978
16979
16980
16981 for b.Controls[0].Op == OpARMCMPconst {
16982 v_0 := b.Controls[0]
16983 if auxIntToInt32(v_0.AuxInt) != 0 {
16984 break
16985 }
16986 l := v_0.Args[0]
16987 if l.Op != OpARMXORshiftLL {
16988 break
16989 }
16990 c := auxIntToInt32(l.AuxInt)
16991 y := l.Args[1]
16992 x := l.Args[0]
16993 if !(l.Uses == 1) {
16994 break
16995 }
16996 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags)
16997 v0.AuxInt = int32ToAuxInt(c)
16998 v0.AddArg2(x, y)
16999 b.resetWithControl(BlockARMEQ, v0)
17000 return true
17001 }
17002
17003
17004
17005 for b.Controls[0].Op == OpARMCMPconst {
17006 v_0 := b.Controls[0]
17007 if auxIntToInt32(v_0.AuxInt) != 0 {
17008 break
17009 }
17010 l := v_0.Args[0]
17011 if l.Op != OpARMXORshiftRL {
17012 break
17013 }
17014 c := auxIntToInt32(l.AuxInt)
17015 y := l.Args[1]
17016 x := l.Args[0]
17017 if !(l.Uses == 1) {
17018 break
17019 }
17020 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags)
17021 v0.AuxInt = int32ToAuxInt(c)
17022 v0.AddArg2(x, y)
17023 b.resetWithControl(BlockARMEQ, v0)
17024 return true
17025 }
17026
17027
17028
17029 for b.Controls[0].Op == OpARMCMPconst {
17030 v_0 := b.Controls[0]
17031 if auxIntToInt32(v_0.AuxInt) != 0 {
17032 break
17033 }
17034 l := v_0.Args[0]
17035 if l.Op != OpARMXORshiftRA {
17036 break
17037 }
17038 c := auxIntToInt32(l.AuxInt)
17039 y := l.Args[1]
17040 x := l.Args[0]
17041 if !(l.Uses == 1) {
17042 break
17043 }
17044 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags)
17045 v0.AuxInt = int32ToAuxInt(c)
17046 v0.AddArg2(x, y)
17047 b.resetWithControl(BlockARMEQ, v0)
17048 return true
17049 }
17050
17051
17052
17053 for b.Controls[0].Op == OpARMCMPconst {
17054 v_0 := b.Controls[0]
17055 if auxIntToInt32(v_0.AuxInt) != 0 {
17056 break
17057 }
17058 l := v_0.Args[0]
17059 if l.Op != OpARMXORshiftLLreg {
17060 break
17061 }
17062 z := l.Args[2]
17063 x := l.Args[0]
17064 y := l.Args[1]
17065 if !(l.Uses == 1) {
17066 break
17067 }
17068 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags)
17069 v0.AddArg3(x, y, z)
17070 b.resetWithControl(BlockARMEQ, v0)
17071 return true
17072 }
17073
17074
17075
17076 for b.Controls[0].Op == OpARMCMPconst {
17077 v_0 := b.Controls[0]
17078 if auxIntToInt32(v_0.AuxInt) != 0 {
17079 break
17080 }
17081 l := v_0.Args[0]
17082 if l.Op != OpARMXORshiftRLreg {
17083 break
17084 }
17085 z := l.Args[2]
17086 x := l.Args[0]
17087 y := l.Args[1]
17088 if !(l.Uses == 1) {
17089 break
17090 }
17091 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags)
17092 v0.AddArg3(x, y, z)
17093 b.resetWithControl(BlockARMEQ, v0)
17094 return true
17095 }
17096
17097
17098
17099 for b.Controls[0].Op == OpARMCMPconst {
17100 v_0 := b.Controls[0]
17101 if auxIntToInt32(v_0.AuxInt) != 0 {
17102 break
17103 }
17104 l := v_0.Args[0]
17105 if l.Op != OpARMXORshiftRAreg {
17106 break
17107 }
17108 z := l.Args[2]
17109 x := l.Args[0]
17110 y := l.Args[1]
17111 if !(l.Uses == 1) {
17112 break
17113 }
17114 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags)
17115 v0.AddArg3(x, y, z)
17116 b.resetWithControl(BlockARMEQ, v0)
17117 return true
17118 }
17119 case BlockARMGE:
17120
17121
17122
17123 for b.Controls[0].Op == OpARMFlagConstant {
17124 v_0 := b.Controls[0]
17125 fc := auxIntToFlagConstant(v_0.AuxInt)
17126 if !(fc.ge()) {
17127 break
17128 }
17129 b.Reset(BlockFirst)
17130 return true
17131 }
17132
17133
17134
17135 for b.Controls[0].Op == OpARMFlagConstant {
17136 v_0 := b.Controls[0]
17137 fc := auxIntToFlagConstant(v_0.AuxInt)
17138 if !(!fc.ge()) {
17139 break
17140 }
17141 b.Reset(BlockFirst)
17142 b.swapSuccessors()
17143 return true
17144 }
17145
17146
17147 for b.Controls[0].Op == OpARMInvertFlags {
17148 v_0 := b.Controls[0]
17149 cmp := v_0.Args[0]
17150 b.resetWithControl(BlockARMLE, cmp)
17151 return true
17152 }
17153
17154
17155
17156 for b.Controls[0].Op == OpARMCMPconst {
17157 v_0 := b.Controls[0]
17158 if auxIntToInt32(v_0.AuxInt) != 0 {
17159 break
17160 }
17161 l := v_0.Args[0]
17162 if l.Op != OpARMSUB {
17163 break
17164 }
17165 y := l.Args[1]
17166 x := l.Args[0]
17167 if !(l.Uses == 1) {
17168 break
17169 }
17170 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
17171 v0.AddArg2(x, y)
17172 b.resetWithControl(BlockARMGEnoov, v0)
17173 return true
17174 }
17175
17176
17177
17178 for b.Controls[0].Op == OpARMCMPconst {
17179 v_0 := b.Controls[0]
17180 if auxIntToInt32(v_0.AuxInt) != 0 {
17181 break
17182 }
17183 l := v_0.Args[0]
17184 if l.Op != OpARMMULS {
17185 break
17186 }
17187 a := l.Args[2]
17188 x := l.Args[0]
17189 y := l.Args[1]
17190 if !(l.Uses == 1) {
17191 break
17192 }
17193 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
17194 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
17195 v1.AddArg2(x, y)
17196 v0.AddArg2(a, v1)
17197 b.resetWithControl(BlockARMGEnoov, v0)
17198 return true
17199 }
17200
17201
17202
17203 for b.Controls[0].Op == OpARMCMPconst {
17204 v_0 := b.Controls[0]
17205 if auxIntToInt32(v_0.AuxInt) != 0 {
17206 break
17207 }
17208 l := v_0.Args[0]
17209 if l.Op != OpARMSUBconst {
17210 break
17211 }
17212 c := auxIntToInt32(l.AuxInt)
17213 x := l.Args[0]
17214 if !(l.Uses == 1) {
17215 break
17216 }
17217 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags)
17218 v0.AuxInt = int32ToAuxInt(c)
17219 v0.AddArg(x)
17220 b.resetWithControl(BlockARMGEnoov, v0)
17221 return true
17222 }
17223
17224
17225
17226 for b.Controls[0].Op == OpARMCMPconst {
17227 v_0 := b.Controls[0]
17228 if auxIntToInt32(v_0.AuxInt) != 0 {
17229 break
17230 }
17231 l := v_0.Args[0]
17232 if l.Op != OpARMSUBshiftLL {
17233 break
17234 }
17235 c := auxIntToInt32(l.AuxInt)
17236 y := l.Args[1]
17237 x := l.Args[0]
17238 if !(l.Uses == 1) {
17239 break
17240 }
17241 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags)
17242 v0.AuxInt = int32ToAuxInt(c)
17243 v0.AddArg2(x, y)
17244 b.resetWithControl(BlockARMGEnoov, v0)
17245 return true
17246 }
17247
17248
17249
17250 for b.Controls[0].Op == OpARMCMPconst {
17251 v_0 := b.Controls[0]
17252 if auxIntToInt32(v_0.AuxInt) != 0 {
17253 break
17254 }
17255 l := v_0.Args[0]
17256 if l.Op != OpARMSUBshiftRL {
17257 break
17258 }
17259 c := auxIntToInt32(l.AuxInt)
17260 y := l.Args[1]
17261 x := l.Args[0]
17262 if !(l.Uses == 1) {
17263 break
17264 }
17265 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags)
17266 v0.AuxInt = int32ToAuxInt(c)
17267 v0.AddArg2(x, y)
17268 b.resetWithControl(BlockARMGEnoov, v0)
17269 return true
17270 }
17271
17272
17273
17274 for b.Controls[0].Op == OpARMCMPconst {
17275 v_0 := b.Controls[0]
17276 if auxIntToInt32(v_0.AuxInt) != 0 {
17277 break
17278 }
17279 l := v_0.Args[0]
17280 if l.Op != OpARMSUBshiftRA {
17281 break
17282 }
17283 c := auxIntToInt32(l.AuxInt)
17284 y := l.Args[1]
17285 x := l.Args[0]
17286 if !(l.Uses == 1) {
17287 break
17288 }
17289 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags)
17290 v0.AuxInt = int32ToAuxInt(c)
17291 v0.AddArg2(x, y)
17292 b.resetWithControl(BlockARMGEnoov, v0)
17293 return true
17294 }
17295
17296
17297
17298 for b.Controls[0].Op == OpARMCMPconst {
17299 v_0 := b.Controls[0]
17300 if auxIntToInt32(v_0.AuxInt) != 0 {
17301 break
17302 }
17303 l := v_0.Args[0]
17304 if l.Op != OpARMSUBshiftLLreg {
17305 break
17306 }
17307 z := l.Args[2]
17308 x := l.Args[0]
17309 y := l.Args[1]
17310 if !(l.Uses == 1) {
17311 break
17312 }
17313 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
17314 v0.AddArg3(x, y, z)
17315 b.resetWithControl(BlockARMGEnoov, v0)
17316 return true
17317 }
17318
17319
17320
17321 for b.Controls[0].Op == OpARMCMPconst {
17322 v_0 := b.Controls[0]
17323 if auxIntToInt32(v_0.AuxInt) != 0 {
17324 break
17325 }
17326 l := v_0.Args[0]
17327 if l.Op != OpARMSUBshiftRLreg {
17328 break
17329 }
17330 z := l.Args[2]
17331 x := l.Args[0]
17332 y := l.Args[1]
17333 if !(l.Uses == 1) {
17334 break
17335 }
17336 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
17337 v0.AddArg3(x, y, z)
17338 b.resetWithControl(BlockARMGEnoov, v0)
17339 return true
17340 }
17341
17342
17343
17344 for b.Controls[0].Op == OpARMCMPconst {
17345 v_0 := b.Controls[0]
17346 if auxIntToInt32(v_0.AuxInt) != 0 {
17347 break
17348 }
17349 l := v_0.Args[0]
17350 if l.Op != OpARMSUBshiftRAreg {
17351 break
17352 }
17353 z := l.Args[2]
17354 x := l.Args[0]
17355 y := l.Args[1]
17356 if !(l.Uses == 1) {
17357 break
17358 }
17359 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
17360 v0.AddArg3(x, y, z)
17361 b.resetWithControl(BlockARMGEnoov, v0)
17362 return true
17363 }
17364
17365
17366
17367 for b.Controls[0].Op == OpARMCMPconst {
17368 v_0 := b.Controls[0]
17369 if auxIntToInt32(v_0.AuxInt) != 0 {
17370 break
17371 }
17372 l := v_0.Args[0]
17373 if l.Op != OpARMADD {
17374 break
17375 }
17376 _ = l.Args[1]
17377 l_0 := l.Args[0]
17378 l_1 := l.Args[1]
17379 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
17380 x := l_0
17381 y := l_1
17382 if !(l.Uses == 1) {
17383 continue
17384 }
17385 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
17386 v0.AddArg2(x, y)
17387 b.resetWithControl(BlockARMGEnoov, v0)
17388 return true
17389 }
17390 break
17391 }
17392
17393
17394
17395 for b.Controls[0].Op == OpARMCMPconst {
17396 v_0 := b.Controls[0]
17397 if auxIntToInt32(v_0.AuxInt) != 0 {
17398 break
17399 }
17400 l := v_0.Args[0]
17401 if l.Op != OpARMMULA {
17402 break
17403 }
17404 a := l.Args[2]
17405 x := l.Args[0]
17406 y := l.Args[1]
17407 if !(l.Uses == 1) {
17408 break
17409 }
17410 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
17411 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
17412 v1.AddArg2(x, y)
17413 v0.AddArg2(a, v1)
17414 b.resetWithControl(BlockARMGEnoov, v0)
17415 return true
17416 }
17417
17418
17419
17420 for b.Controls[0].Op == OpARMCMPconst {
17421 v_0 := b.Controls[0]
17422 if auxIntToInt32(v_0.AuxInt) != 0 {
17423 break
17424 }
17425 l := v_0.Args[0]
17426 if l.Op != OpARMADDconst {
17427 break
17428 }
17429 c := auxIntToInt32(l.AuxInt)
17430 x := l.Args[0]
17431 if !(l.Uses == 1) {
17432 break
17433 }
17434 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags)
17435 v0.AuxInt = int32ToAuxInt(c)
17436 v0.AddArg(x)
17437 b.resetWithControl(BlockARMGEnoov, v0)
17438 return true
17439 }
17440
17441
17442
17443 for b.Controls[0].Op == OpARMCMPconst {
17444 v_0 := b.Controls[0]
17445 if auxIntToInt32(v_0.AuxInt) != 0 {
17446 break
17447 }
17448 l := v_0.Args[0]
17449 if l.Op != OpARMADDshiftLL {
17450 break
17451 }
17452 c := auxIntToInt32(l.AuxInt)
17453 y := l.Args[1]
17454 x := l.Args[0]
17455 if !(l.Uses == 1) {
17456 break
17457 }
17458 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags)
17459 v0.AuxInt = int32ToAuxInt(c)
17460 v0.AddArg2(x, y)
17461 b.resetWithControl(BlockARMGEnoov, v0)
17462 return true
17463 }
17464
17465
17466
17467 for b.Controls[0].Op == OpARMCMPconst {
17468 v_0 := b.Controls[0]
17469 if auxIntToInt32(v_0.AuxInt) != 0 {
17470 break
17471 }
17472 l := v_0.Args[0]
17473 if l.Op != OpARMADDshiftRL {
17474 break
17475 }
17476 c := auxIntToInt32(l.AuxInt)
17477 y := l.Args[1]
17478 x := l.Args[0]
17479 if !(l.Uses == 1) {
17480 break
17481 }
17482 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags)
17483 v0.AuxInt = int32ToAuxInt(c)
17484 v0.AddArg2(x, y)
17485 b.resetWithControl(BlockARMGEnoov, v0)
17486 return true
17487 }
17488
17489
17490
17491 for b.Controls[0].Op == OpARMCMPconst {
17492 v_0 := b.Controls[0]
17493 if auxIntToInt32(v_0.AuxInt) != 0 {
17494 break
17495 }
17496 l := v_0.Args[0]
17497 if l.Op != OpARMADDshiftRA {
17498 break
17499 }
17500 c := auxIntToInt32(l.AuxInt)
17501 y := l.Args[1]
17502 x := l.Args[0]
17503 if !(l.Uses == 1) {
17504 break
17505 }
17506 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags)
17507 v0.AuxInt = int32ToAuxInt(c)
17508 v0.AddArg2(x, y)
17509 b.resetWithControl(BlockARMGEnoov, v0)
17510 return true
17511 }
17512
17513
17514
17515 for b.Controls[0].Op == OpARMCMPconst {
17516 v_0 := b.Controls[0]
17517 if auxIntToInt32(v_0.AuxInt) != 0 {
17518 break
17519 }
17520 l := v_0.Args[0]
17521 if l.Op != OpARMADDshiftLLreg {
17522 break
17523 }
17524 z := l.Args[2]
17525 x := l.Args[0]
17526 y := l.Args[1]
17527 if !(l.Uses == 1) {
17528 break
17529 }
17530 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags)
17531 v0.AddArg3(x, y, z)
17532 b.resetWithControl(BlockARMGEnoov, v0)
17533 return true
17534 }
17535
17536
17537
17538 for b.Controls[0].Op == OpARMCMPconst {
17539 v_0 := b.Controls[0]
17540 if auxIntToInt32(v_0.AuxInt) != 0 {
17541 break
17542 }
17543 l := v_0.Args[0]
17544 if l.Op != OpARMADDshiftRLreg {
17545 break
17546 }
17547 z := l.Args[2]
17548 x := l.Args[0]
17549 y := l.Args[1]
17550 if !(l.Uses == 1) {
17551 break
17552 }
17553 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags)
17554 v0.AddArg3(x, y, z)
17555 b.resetWithControl(BlockARMGEnoov, v0)
17556 return true
17557 }
17558
17559
17560
17561 for b.Controls[0].Op == OpARMCMPconst {
17562 v_0 := b.Controls[0]
17563 if auxIntToInt32(v_0.AuxInt) != 0 {
17564 break
17565 }
17566 l := v_0.Args[0]
17567 if l.Op != OpARMADDshiftRAreg {
17568 break
17569 }
17570 z := l.Args[2]
17571 x := l.Args[0]
17572 y := l.Args[1]
17573 if !(l.Uses == 1) {
17574 break
17575 }
17576 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags)
17577 v0.AddArg3(x, y, z)
17578 b.resetWithControl(BlockARMGEnoov, v0)
17579 return true
17580 }
17581
17582
17583
17584 for b.Controls[0].Op == OpARMCMPconst {
17585 v_0 := b.Controls[0]
17586 if auxIntToInt32(v_0.AuxInt) != 0 {
17587 break
17588 }
17589 l := v_0.Args[0]
17590 if l.Op != OpARMAND {
17591 break
17592 }
17593 _ = l.Args[1]
17594 l_0 := l.Args[0]
17595 l_1 := l.Args[1]
17596 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
17597 x := l_0
17598 y := l_1
17599 if !(l.Uses == 1) {
17600 continue
17601 }
17602 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags)
17603 v0.AddArg2(x, y)
17604 b.resetWithControl(BlockARMGEnoov, v0)
17605 return true
17606 }
17607 break
17608 }
17609
17610
17611
17612 for b.Controls[0].Op == OpARMCMPconst {
17613 v_0 := b.Controls[0]
17614 if auxIntToInt32(v_0.AuxInt) != 0 {
17615 break
17616 }
17617 l := v_0.Args[0]
17618 if l.Op != OpARMANDconst {
17619 break
17620 }
17621 c := auxIntToInt32(l.AuxInt)
17622 x := l.Args[0]
17623 if !(l.Uses == 1) {
17624 break
17625 }
17626 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags)
17627 v0.AuxInt = int32ToAuxInt(c)
17628 v0.AddArg(x)
17629 b.resetWithControl(BlockARMGEnoov, v0)
17630 return true
17631 }
17632
17633
17634
17635 for b.Controls[0].Op == OpARMCMPconst {
17636 v_0 := b.Controls[0]
17637 if auxIntToInt32(v_0.AuxInt) != 0 {
17638 break
17639 }
17640 l := v_0.Args[0]
17641 if l.Op != OpARMANDshiftLL {
17642 break
17643 }
17644 c := auxIntToInt32(l.AuxInt)
17645 y := l.Args[1]
17646 x := l.Args[0]
17647 if !(l.Uses == 1) {
17648 break
17649 }
17650 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags)
17651 v0.AuxInt = int32ToAuxInt(c)
17652 v0.AddArg2(x, y)
17653 b.resetWithControl(BlockARMGEnoov, v0)
17654 return true
17655 }
17656
17657
17658
17659 for b.Controls[0].Op == OpARMCMPconst {
17660 v_0 := b.Controls[0]
17661 if auxIntToInt32(v_0.AuxInt) != 0 {
17662 break
17663 }
17664 l := v_0.Args[0]
17665 if l.Op != OpARMANDshiftRL {
17666 break
17667 }
17668 c := auxIntToInt32(l.AuxInt)
17669 y := l.Args[1]
17670 x := l.Args[0]
17671 if !(l.Uses == 1) {
17672 break
17673 }
17674 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags)
17675 v0.AuxInt = int32ToAuxInt(c)
17676 v0.AddArg2(x, y)
17677 b.resetWithControl(BlockARMGEnoov, v0)
17678 return true
17679 }
17680
17681
17682
17683 for b.Controls[0].Op == OpARMCMPconst {
17684 v_0 := b.Controls[0]
17685 if auxIntToInt32(v_0.AuxInt) != 0 {
17686 break
17687 }
17688 l := v_0.Args[0]
17689 if l.Op != OpARMANDshiftRA {
17690 break
17691 }
17692 c := auxIntToInt32(l.AuxInt)
17693 y := l.Args[1]
17694 x := l.Args[0]
17695 if !(l.Uses == 1) {
17696 break
17697 }
17698 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags)
17699 v0.AuxInt = int32ToAuxInt(c)
17700 v0.AddArg2(x, y)
17701 b.resetWithControl(BlockARMGEnoov, v0)
17702 return true
17703 }
17704
17705
17706
17707 for b.Controls[0].Op == OpARMCMPconst {
17708 v_0 := b.Controls[0]
17709 if auxIntToInt32(v_0.AuxInt) != 0 {
17710 break
17711 }
17712 l := v_0.Args[0]
17713 if l.Op != OpARMANDshiftLLreg {
17714 break
17715 }
17716 z := l.Args[2]
17717 x := l.Args[0]
17718 y := l.Args[1]
17719 if !(l.Uses == 1) {
17720 break
17721 }
17722 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags)
17723 v0.AddArg3(x, y, z)
17724 b.resetWithControl(BlockARMGEnoov, v0)
17725 return true
17726 }
17727
17728
17729
17730 for b.Controls[0].Op == OpARMCMPconst {
17731 v_0 := b.Controls[0]
17732 if auxIntToInt32(v_0.AuxInt) != 0 {
17733 break
17734 }
17735 l := v_0.Args[0]
17736 if l.Op != OpARMANDshiftRLreg {
17737 break
17738 }
17739 z := l.Args[2]
17740 x := l.Args[0]
17741 y := l.Args[1]
17742 if !(l.Uses == 1) {
17743 break
17744 }
17745 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags)
17746 v0.AddArg3(x, y, z)
17747 b.resetWithControl(BlockARMGEnoov, v0)
17748 return true
17749 }
17750
17751
17752
17753 for b.Controls[0].Op == OpARMCMPconst {
17754 v_0 := b.Controls[0]
17755 if auxIntToInt32(v_0.AuxInt) != 0 {
17756 break
17757 }
17758 l := v_0.Args[0]
17759 if l.Op != OpARMANDshiftRAreg {
17760 break
17761 }
17762 z := l.Args[2]
17763 x := l.Args[0]
17764 y := l.Args[1]
17765 if !(l.Uses == 1) {
17766 break
17767 }
17768 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags)
17769 v0.AddArg3(x, y, z)
17770 b.resetWithControl(BlockARMGEnoov, v0)
17771 return true
17772 }
17773
17774
17775
17776 for b.Controls[0].Op == OpARMCMPconst {
17777 v_0 := b.Controls[0]
17778 if auxIntToInt32(v_0.AuxInt) != 0 {
17779 break
17780 }
17781 l := v_0.Args[0]
17782 if l.Op != OpARMXOR {
17783 break
17784 }
17785 _ = l.Args[1]
17786 l_0 := l.Args[0]
17787 l_1 := l.Args[1]
17788 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
17789 x := l_0
17790 y := l_1
17791 if !(l.Uses == 1) {
17792 continue
17793 }
17794 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags)
17795 v0.AddArg2(x, y)
17796 b.resetWithControl(BlockARMGEnoov, v0)
17797 return true
17798 }
17799 break
17800 }
17801
17802
17803
17804 for b.Controls[0].Op == OpARMCMPconst {
17805 v_0 := b.Controls[0]
17806 if auxIntToInt32(v_0.AuxInt) != 0 {
17807 break
17808 }
17809 l := v_0.Args[0]
17810 if l.Op != OpARMXORconst {
17811 break
17812 }
17813 c := auxIntToInt32(l.AuxInt)
17814 x := l.Args[0]
17815 if !(l.Uses == 1) {
17816 break
17817 }
17818 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags)
17819 v0.AuxInt = int32ToAuxInt(c)
17820 v0.AddArg(x)
17821 b.resetWithControl(BlockARMGEnoov, v0)
17822 return true
17823 }
17824
17825
17826
17827 for b.Controls[0].Op == OpARMCMPconst {
17828 v_0 := b.Controls[0]
17829 if auxIntToInt32(v_0.AuxInt) != 0 {
17830 break
17831 }
17832 l := v_0.Args[0]
17833 if l.Op != OpARMXORshiftLL {
17834 break
17835 }
17836 c := auxIntToInt32(l.AuxInt)
17837 y := l.Args[1]
17838 x := l.Args[0]
17839 if !(l.Uses == 1) {
17840 break
17841 }
17842 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags)
17843 v0.AuxInt = int32ToAuxInt(c)
17844 v0.AddArg2(x, y)
17845 b.resetWithControl(BlockARMGEnoov, v0)
17846 return true
17847 }
17848
17849
17850
17851 for b.Controls[0].Op == OpARMCMPconst {
17852 v_0 := b.Controls[0]
17853 if auxIntToInt32(v_0.AuxInt) != 0 {
17854 break
17855 }
17856 l := v_0.Args[0]
17857 if l.Op != OpARMXORshiftRL {
17858 break
17859 }
17860 c := auxIntToInt32(l.AuxInt)
17861 y := l.Args[1]
17862 x := l.Args[0]
17863 if !(l.Uses == 1) {
17864 break
17865 }
17866 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags)
17867 v0.AuxInt = int32ToAuxInt(c)
17868 v0.AddArg2(x, y)
17869 b.resetWithControl(BlockARMGEnoov, v0)
17870 return true
17871 }
17872
17873
17874
17875 for b.Controls[0].Op == OpARMCMPconst {
17876 v_0 := b.Controls[0]
17877 if auxIntToInt32(v_0.AuxInt) != 0 {
17878 break
17879 }
17880 l := v_0.Args[0]
17881 if l.Op != OpARMXORshiftRA {
17882 break
17883 }
17884 c := auxIntToInt32(l.AuxInt)
17885 y := l.Args[1]
17886 x := l.Args[0]
17887 if !(l.Uses == 1) {
17888 break
17889 }
17890 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags)
17891 v0.AuxInt = int32ToAuxInt(c)
17892 v0.AddArg2(x, y)
17893 b.resetWithControl(BlockARMGEnoov, v0)
17894 return true
17895 }
17896
17897
17898
17899 for b.Controls[0].Op == OpARMCMPconst {
17900 v_0 := b.Controls[0]
17901 if auxIntToInt32(v_0.AuxInt) != 0 {
17902 break
17903 }
17904 l := v_0.Args[0]
17905 if l.Op != OpARMXORshiftLLreg {
17906 break
17907 }
17908 z := l.Args[2]
17909 x := l.Args[0]
17910 y := l.Args[1]
17911 if !(l.Uses == 1) {
17912 break
17913 }
17914 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags)
17915 v0.AddArg3(x, y, z)
17916 b.resetWithControl(BlockARMGEnoov, v0)
17917 return true
17918 }
17919
17920
17921
17922 for b.Controls[0].Op == OpARMCMPconst {
17923 v_0 := b.Controls[0]
17924 if auxIntToInt32(v_0.AuxInt) != 0 {
17925 break
17926 }
17927 l := v_0.Args[0]
17928 if l.Op != OpARMXORshiftRLreg {
17929 break
17930 }
17931 z := l.Args[2]
17932 x := l.Args[0]
17933 y := l.Args[1]
17934 if !(l.Uses == 1) {
17935 break
17936 }
17937 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags)
17938 v0.AddArg3(x, y, z)
17939 b.resetWithControl(BlockARMGEnoov, v0)
17940 return true
17941 }
17942
17943
17944
17945 for b.Controls[0].Op == OpARMCMPconst {
17946 v_0 := b.Controls[0]
17947 if auxIntToInt32(v_0.AuxInt) != 0 {
17948 break
17949 }
17950 l := v_0.Args[0]
17951 if l.Op != OpARMXORshiftRAreg {
17952 break
17953 }
17954 z := l.Args[2]
17955 x := l.Args[0]
17956 y := l.Args[1]
17957 if !(l.Uses == 1) {
17958 break
17959 }
17960 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags)
17961 v0.AddArg3(x, y, z)
17962 b.resetWithControl(BlockARMGEnoov, v0)
17963 return true
17964 }
17965 case BlockARMGEnoov:
17966
17967
17968
17969 for b.Controls[0].Op == OpARMFlagConstant {
17970 v_0 := b.Controls[0]
17971 fc := auxIntToFlagConstant(v_0.AuxInt)
17972 if !(fc.geNoov()) {
17973 break
17974 }
17975 b.Reset(BlockFirst)
17976 return true
17977 }
17978
17979
17980
17981 for b.Controls[0].Op == OpARMFlagConstant {
17982 v_0 := b.Controls[0]
17983 fc := auxIntToFlagConstant(v_0.AuxInt)
17984 if !(!fc.geNoov()) {
17985 break
17986 }
17987 b.Reset(BlockFirst)
17988 b.swapSuccessors()
17989 return true
17990 }
17991
17992
17993 for b.Controls[0].Op == OpARMInvertFlags {
17994 v_0 := b.Controls[0]
17995 cmp := v_0.Args[0]
17996 b.resetWithControl(BlockARMLEnoov, cmp)
17997 return true
17998 }
17999 case BlockARMGT:
18000
18001
18002
18003 for b.Controls[0].Op == OpARMFlagConstant {
18004 v_0 := b.Controls[0]
18005 fc := auxIntToFlagConstant(v_0.AuxInt)
18006 if !(fc.gt()) {
18007 break
18008 }
18009 b.Reset(BlockFirst)
18010 return true
18011 }
18012
18013
18014
18015 for b.Controls[0].Op == OpARMFlagConstant {
18016 v_0 := b.Controls[0]
18017 fc := auxIntToFlagConstant(v_0.AuxInt)
18018 if !(!fc.gt()) {
18019 break
18020 }
18021 b.Reset(BlockFirst)
18022 b.swapSuccessors()
18023 return true
18024 }
18025
18026
18027 for b.Controls[0].Op == OpARMInvertFlags {
18028 v_0 := b.Controls[0]
18029 cmp := v_0.Args[0]
18030 b.resetWithControl(BlockARMLT, cmp)
18031 return true
18032 }
18033
18034
18035
18036 for b.Controls[0].Op == OpARMCMPconst {
18037 v_0 := b.Controls[0]
18038 if auxIntToInt32(v_0.AuxInt) != 0 {
18039 break
18040 }
18041 l := v_0.Args[0]
18042 if l.Op != OpARMSUB {
18043 break
18044 }
18045 y := l.Args[1]
18046 x := l.Args[0]
18047 if !(l.Uses == 1) {
18048 break
18049 }
18050 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
18051 v0.AddArg2(x, y)
18052 b.resetWithControl(BlockARMGTnoov, v0)
18053 return true
18054 }
18055
18056
18057
18058 for b.Controls[0].Op == OpARMCMPconst {
18059 v_0 := b.Controls[0]
18060 if auxIntToInt32(v_0.AuxInt) != 0 {
18061 break
18062 }
18063 l := v_0.Args[0]
18064 if l.Op != OpARMMULS {
18065 break
18066 }
18067 a := l.Args[2]
18068 x := l.Args[0]
18069 y := l.Args[1]
18070 if !(l.Uses == 1) {
18071 break
18072 }
18073 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
18074 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
18075 v1.AddArg2(x, y)
18076 v0.AddArg2(a, v1)
18077 b.resetWithControl(BlockARMGTnoov, v0)
18078 return true
18079 }
18080
18081
18082
18083 for b.Controls[0].Op == OpARMCMPconst {
18084 v_0 := b.Controls[0]
18085 if auxIntToInt32(v_0.AuxInt) != 0 {
18086 break
18087 }
18088 l := v_0.Args[0]
18089 if l.Op != OpARMSUBconst {
18090 break
18091 }
18092 c := auxIntToInt32(l.AuxInt)
18093 x := l.Args[0]
18094 if !(l.Uses == 1) {
18095 break
18096 }
18097 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags)
18098 v0.AuxInt = int32ToAuxInt(c)
18099 v0.AddArg(x)
18100 b.resetWithControl(BlockARMGTnoov, v0)
18101 return true
18102 }
18103
18104
18105
18106 for b.Controls[0].Op == OpARMCMPconst {
18107 v_0 := b.Controls[0]
18108 if auxIntToInt32(v_0.AuxInt) != 0 {
18109 break
18110 }
18111 l := v_0.Args[0]
18112 if l.Op != OpARMSUBshiftLL {
18113 break
18114 }
18115 c := auxIntToInt32(l.AuxInt)
18116 y := l.Args[1]
18117 x := l.Args[0]
18118 if !(l.Uses == 1) {
18119 break
18120 }
18121 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags)
18122 v0.AuxInt = int32ToAuxInt(c)
18123 v0.AddArg2(x, y)
18124 b.resetWithControl(BlockARMGTnoov, v0)
18125 return true
18126 }
18127
18128
18129
18130 for b.Controls[0].Op == OpARMCMPconst {
18131 v_0 := b.Controls[0]
18132 if auxIntToInt32(v_0.AuxInt) != 0 {
18133 break
18134 }
18135 l := v_0.Args[0]
18136 if l.Op != OpARMSUBshiftRL {
18137 break
18138 }
18139 c := auxIntToInt32(l.AuxInt)
18140 y := l.Args[1]
18141 x := l.Args[0]
18142 if !(l.Uses == 1) {
18143 break
18144 }
18145 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags)
18146 v0.AuxInt = int32ToAuxInt(c)
18147 v0.AddArg2(x, y)
18148 b.resetWithControl(BlockARMGTnoov, v0)
18149 return true
18150 }
18151
18152
18153
18154 for b.Controls[0].Op == OpARMCMPconst {
18155 v_0 := b.Controls[0]
18156 if auxIntToInt32(v_0.AuxInt) != 0 {
18157 break
18158 }
18159 l := v_0.Args[0]
18160 if l.Op != OpARMSUBshiftRA {
18161 break
18162 }
18163 c := auxIntToInt32(l.AuxInt)
18164 y := l.Args[1]
18165 x := l.Args[0]
18166 if !(l.Uses == 1) {
18167 break
18168 }
18169 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags)
18170 v0.AuxInt = int32ToAuxInt(c)
18171 v0.AddArg2(x, y)
18172 b.resetWithControl(BlockARMGTnoov, v0)
18173 return true
18174 }
18175
18176
18177
18178 for b.Controls[0].Op == OpARMCMPconst {
18179 v_0 := b.Controls[0]
18180 if auxIntToInt32(v_0.AuxInt) != 0 {
18181 break
18182 }
18183 l := v_0.Args[0]
18184 if l.Op != OpARMSUBshiftLLreg {
18185 break
18186 }
18187 z := l.Args[2]
18188 x := l.Args[0]
18189 y := l.Args[1]
18190 if !(l.Uses == 1) {
18191 break
18192 }
18193 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
18194 v0.AddArg3(x, y, z)
18195 b.resetWithControl(BlockARMGTnoov, v0)
18196 return true
18197 }
18198
18199
18200
18201 for b.Controls[0].Op == OpARMCMPconst {
18202 v_0 := b.Controls[0]
18203 if auxIntToInt32(v_0.AuxInt) != 0 {
18204 break
18205 }
18206 l := v_0.Args[0]
18207 if l.Op != OpARMSUBshiftRLreg {
18208 break
18209 }
18210 z := l.Args[2]
18211 x := l.Args[0]
18212 y := l.Args[1]
18213 if !(l.Uses == 1) {
18214 break
18215 }
18216 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
18217 v0.AddArg3(x, y, z)
18218 b.resetWithControl(BlockARMGTnoov, v0)
18219 return true
18220 }
18221
18222
18223
18224 for b.Controls[0].Op == OpARMCMPconst {
18225 v_0 := b.Controls[0]
18226 if auxIntToInt32(v_0.AuxInt) != 0 {
18227 break
18228 }
18229 l := v_0.Args[0]
18230 if l.Op != OpARMSUBshiftRAreg {
18231 break
18232 }
18233 z := l.Args[2]
18234 x := l.Args[0]
18235 y := l.Args[1]
18236 if !(l.Uses == 1) {
18237 break
18238 }
18239 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
18240 v0.AddArg3(x, y, z)
18241 b.resetWithControl(BlockARMGTnoov, v0)
18242 return true
18243 }
18244
18245
18246
18247 for b.Controls[0].Op == OpARMCMPconst {
18248 v_0 := b.Controls[0]
18249 if auxIntToInt32(v_0.AuxInt) != 0 {
18250 break
18251 }
18252 l := v_0.Args[0]
18253 if l.Op != OpARMADD {
18254 break
18255 }
18256 _ = l.Args[1]
18257 l_0 := l.Args[0]
18258 l_1 := l.Args[1]
18259 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
18260 x := l_0
18261 y := l_1
18262 if !(l.Uses == 1) {
18263 continue
18264 }
18265 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
18266 v0.AddArg2(x, y)
18267 b.resetWithControl(BlockARMGTnoov, v0)
18268 return true
18269 }
18270 break
18271 }
18272
18273
18274
18275 for b.Controls[0].Op == OpARMCMPconst {
18276 v_0 := b.Controls[0]
18277 if auxIntToInt32(v_0.AuxInt) != 0 {
18278 break
18279 }
18280 l := v_0.Args[0]
18281 if l.Op != OpARMADDconst {
18282 break
18283 }
18284 c := auxIntToInt32(l.AuxInt)
18285 x := l.Args[0]
18286 if !(l.Uses == 1) {
18287 break
18288 }
18289 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags)
18290 v0.AuxInt = int32ToAuxInt(c)
18291 v0.AddArg(x)
18292 b.resetWithControl(BlockARMGTnoov, v0)
18293 return true
18294 }
18295
18296
18297
18298 for b.Controls[0].Op == OpARMCMPconst {
18299 v_0 := b.Controls[0]
18300 if auxIntToInt32(v_0.AuxInt) != 0 {
18301 break
18302 }
18303 l := v_0.Args[0]
18304 if l.Op != OpARMADDshiftLL {
18305 break
18306 }
18307 c := auxIntToInt32(l.AuxInt)
18308 y := l.Args[1]
18309 x := l.Args[0]
18310 if !(l.Uses == 1) {
18311 break
18312 }
18313 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags)
18314 v0.AuxInt = int32ToAuxInt(c)
18315 v0.AddArg2(x, y)
18316 b.resetWithControl(BlockARMGTnoov, v0)
18317 return true
18318 }
18319
18320
18321
18322 for b.Controls[0].Op == OpARMCMPconst {
18323 v_0 := b.Controls[0]
18324 if auxIntToInt32(v_0.AuxInt) != 0 {
18325 break
18326 }
18327 l := v_0.Args[0]
18328 if l.Op != OpARMADDshiftRL {
18329 break
18330 }
18331 c := auxIntToInt32(l.AuxInt)
18332 y := l.Args[1]
18333 x := l.Args[0]
18334 if !(l.Uses == 1) {
18335 break
18336 }
18337 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags)
18338 v0.AuxInt = int32ToAuxInt(c)
18339 v0.AddArg2(x, y)
18340 b.resetWithControl(BlockARMGTnoov, v0)
18341 return true
18342 }
18343
18344
18345
18346 for b.Controls[0].Op == OpARMCMPconst {
18347 v_0 := b.Controls[0]
18348 if auxIntToInt32(v_0.AuxInt) != 0 {
18349 break
18350 }
18351 l := v_0.Args[0]
18352 if l.Op != OpARMADDshiftRA {
18353 break
18354 }
18355 c := auxIntToInt32(l.AuxInt)
18356 y := l.Args[1]
18357 x := l.Args[0]
18358 if !(l.Uses == 1) {
18359 break
18360 }
18361 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags)
18362 v0.AuxInt = int32ToAuxInt(c)
18363 v0.AddArg2(x, y)
18364 b.resetWithControl(BlockARMGTnoov, v0)
18365 return true
18366 }
18367
18368
18369
18370 for b.Controls[0].Op == OpARMCMPconst {
18371 v_0 := b.Controls[0]
18372 if auxIntToInt32(v_0.AuxInt) != 0 {
18373 break
18374 }
18375 l := v_0.Args[0]
18376 if l.Op != OpARMADDshiftLLreg {
18377 break
18378 }
18379 z := l.Args[2]
18380 x := l.Args[0]
18381 y := l.Args[1]
18382 if !(l.Uses == 1) {
18383 break
18384 }
18385 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags)
18386 v0.AddArg3(x, y, z)
18387 b.resetWithControl(BlockARMGTnoov, v0)
18388 return true
18389 }
18390
18391
18392
18393 for b.Controls[0].Op == OpARMCMPconst {
18394 v_0 := b.Controls[0]
18395 if auxIntToInt32(v_0.AuxInt) != 0 {
18396 break
18397 }
18398 l := v_0.Args[0]
18399 if l.Op != OpARMADDshiftRLreg {
18400 break
18401 }
18402 z := l.Args[2]
18403 x := l.Args[0]
18404 y := l.Args[1]
18405 if !(l.Uses == 1) {
18406 break
18407 }
18408 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags)
18409 v0.AddArg3(x, y, z)
18410 b.resetWithControl(BlockARMGTnoov, v0)
18411 return true
18412 }
18413
18414
18415
18416 for b.Controls[0].Op == OpARMCMPconst {
18417 v_0 := b.Controls[0]
18418 if auxIntToInt32(v_0.AuxInt) != 0 {
18419 break
18420 }
18421 l := v_0.Args[0]
18422 if l.Op != OpARMADDshiftRAreg {
18423 break
18424 }
18425 z := l.Args[2]
18426 x := l.Args[0]
18427 y := l.Args[1]
18428 if !(l.Uses == 1) {
18429 break
18430 }
18431 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags)
18432 v0.AddArg3(x, y, z)
18433 b.resetWithControl(BlockARMGTnoov, v0)
18434 return true
18435 }
18436
18437
18438
18439 for b.Controls[0].Op == OpARMCMPconst {
18440 v_0 := b.Controls[0]
18441 if auxIntToInt32(v_0.AuxInt) != 0 {
18442 break
18443 }
18444 l := v_0.Args[0]
18445 if l.Op != OpARMMULA {
18446 break
18447 }
18448 a := l.Args[2]
18449 x := l.Args[0]
18450 y := l.Args[1]
18451 if !(l.Uses == 1) {
18452 break
18453 }
18454 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
18455 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
18456 v1.AddArg2(x, y)
18457 v0.AddArg2(a, v1)
18458 b.resetWithControl(BlockARMGTnoov, v0)
18459 return true
18460 }
18461
18462
18463
18464 for b.Controls[0].Op == OpARMCMPconst {
18465 v_0 := b.Controls[0]
18466 if auxIntToInt32(v_0.AuxInt) != 0 {
18467 break
18468 }
18469 l := v_0.Args[0]
18470 if l.Op != OpARMAND {
18471 break
18472 }
18473 _ = l.Args[1]
18474 l_0 := l.Args[0]
18475 l_1 := l.Args[1]
18476 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
18477 x := l_0
18478 y := l_1
18479 if !(l.Uses == 1) {
18480 continue
18481 }
18482 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags)
18483 v0.AddArg2(x, y)
18484 b.resetWithControl(BlockARMGTnoov, v0)
18485 return true
18486 }
18487 break
18488 }
18489
18490
18491
18492 for b.Controls[0].Op == OpARMCMPconst {
18493 v_0 := b.Controls[0]
18494 if auxIntToInt32(v_0.AuxInt) != 0 {
18495 break
18496 }
18497 l := v_0.Args[0]
18498 if l.Op != OpARMANDconst {
18499 break
18500 }
18501 c := auxIntToInt32(l.AuxInt)
18502 x := l.Args[0]
18503 if !(l.Uses == 1) {
18504 break
18505 }
18506 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags)
18507 v0.AuxInt = int32ToAuxInt(c)
18508 v0.AddArg(x)
18509 b.resetWithControl(BlockARMGTnoov, v0)
18510 return true
18511 }
18512
18513
18514
18515 for b.Controls[0].Op == OpARMCMPconst {
18516 v_0 := b.Controls[0]
18517 if auxIntToInt32(v_0.AuxInt) != 0 {
18518 break
18519 }
18520 l := v_0.Args[0]
18521 if l.Op != OpARMANDshiftLL {
18522 break
18523 }
18524 c := auxIntToInt32(l.AuxInt)
18525 y := l.Args[1]
18526 x := l.Args[0]
18527 if !(l.Uses == 1) {
18528 break
18529 }
18530 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags)
18531 v0.AuxInt = int32ToAuxInt(c)
18532 v0.AddArg2(x, y)
18533 b.resetWithControl(BlockARMGTnoov, v0)
18534 return true
18535 }
18536
18537
18538
18539 for b.Controls[0].Op == OpARMCMPconst {
18540 v_0 := b.Controls[0]
18541 if auxIntToInt32(v_0.AuxInt) != 0 {
18542 break
18543 }
18544 l := v_0.Args[0]
18545 if l.Op != OpARMANDshiftRL {
18546 break
18547 }
18548 c := auxIntToInt32(l.AuxInt)
18549 y := l.Args[1]
18550 x := l.Args[0]
18551 if !(l.Uses == 1) {
18552 break
18553 }
18554 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags)
18555 v0.AuxInt = int32ToAuxInt(c)
18556 v0.AddArg2(x, y)
18557 b.resetWithControl(BlockARMGTnoov, v0)
18558 return true
18559 }
18560
18561
18562
18563 for b.Controls[0].Op == OpARMCMPconst {
18564 v_0 := b.Controls[0]
18565 if auxIntToInt32(v_0.AuxInt) != 0 {
18566 break
18567 }
18568 l := v_0.Args[0]
18569 if l.Op != OpARMANDshiftRA {
18570 break
18571 }
18572 c := auxIntToInt32(l.AuxInt)
18573 y := l.Args[1]
18574 x := l.Args[0]
18575 if !(l.Uses == 1) {
18576 break
18577 }
18578 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags)
18579 v0.AuxInt = int32ToAuxInt(c)
18580 v0.AddArg2(x, y)
18581 b.resetWithControl(BlockARMGTnoov, v0)
18582 return true
18583 }
18584
18585
18586
18587 for b.Controls[0].Op == OpARMCMPconst {
18588 v_0 := b.Controls[0]
18589 if auxIntToInt32(v_0.AuxInt) != 0 {
18590 break
18591 }
18592 l := v_0.Args[0]
18593 if l.Op != OpARMANDshiftLLreg {
18594 break
18595 }
18596 z := l.Args[2]
18597 x := l.Args[0]
18598 y := l.Args[1]
18599 if !(l.Uses == 1) {
18600 break
18601 }
18602 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags)
18603 v0.AddArg3(x, y, z)
18604 b.resetWithControl(BlockARMGTnoov, v0)
18605 return true
18606 }
18607
18608
18609
18610 for b.Controls[0].Op == OpARMCMPconst {
18611 v_0 := b.Controls[0]
18612 if auxIntToInt32(v_0.AuxInt) != 0 {
18613 break
18614 }
18615 l := v_0.Args[0]
18616 if l.Op != OpARMANDshiftRLreg {
18617 break
18618 }
18619 z := l.Args[2]
18620 x := l.Args[0]
18621 y := l.Args[1]
18622 if !(l.Uses == 1) {
18623 break
18624 }
18625 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags)
18626 v0.AddArg3(x, y, z)
18627 b.resetWithControl(BlockARMGTnoov, v0)
18628 return true
18629 }
18630
18631
18632
18633 for b.Controls[0].Op == OpARMCMPconst {
18634 v_0 := b.Controls[0]
18635 if auxIntToInt32(v_0.AuxInt) != 0 {
18636 break
18637 }
18638 l := v_0.Args[0]
18639 if l.Op != OpARMANDshiftRAreg {
18640 break
18641 }
18642 z := l.Args[2]
18643 x := l.Args[0]
18644 y := l.Args[1]
18645 if !(l.Uses == 1) {
18646 break
18647 }
18648 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags)
18649 v0.AddArg3(x, y, z)
18650 b.resetWithControl(BlockARMGTnoov, v0)
18651 return true
18652 }
18653
18654
18655
18656 for b.Controls[0].Op == OpARMCMPconst {
18657 v_0 := b.Controls[0]
18658 if auxIntToInt32(v_0.AuxInt) != 0 {
18659 break
18660 }
18661 l := v_0.Args[0]
18662 if l.Op != OpARMXOR {
18663 break
18664 }
18665 _ = l.Args[1]
18666 l_0 := l.Args[0]
18667 l_1 := l.Args[1]
18668 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
18669 x := l_0
18670 y := l_1
18671 if !(l.Uses == 1) {
18672 continue
18673 }
18674 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags)
18675 v0.AddArg2(x, y)
18676 b.resetWithControl(BlockARMGTnoov, v0)
18677 return true
18678 }
18679 break
18680 }
18681
18682
18683
18684 for b.Controls[0].Op == OpARMCMPconst {
18685 v_0 := b.Controls[0]
18686 if auxIntToInt32(v_0.AuxInt) != 0 {
18687 break
18688 }
18689 l := v_0.Args[0]
18690 if l.Op != OpARMXORconst {
18691 break
18692 }
18693 c := auxIntToInt32(l.AuxInt)
18694 x := l.Args[0]
18695 if !(l.Uses == 1) {
18696 break
18697 }
18698 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags)
18699 v0.AuxInt = int32ToAuxInt(c)
18700 v0.AddArg(x)
18701 b.resetWithControl(BlockARMGTnoov, v0)
18702 return true
18703 }
18704
18705
18706
18707 for b.Controls[0].Op == OpARMCMPconst {
18708 v_0 := b.Controls[0]
18709 if auxIntToInt32(v_0.AuxInt) != 0 {
18710 break
18711 }
18712 l := v_0.Args[0]
18713 if l.Op != OpARMXORshiftLL {
18714 break
18715 }
18716 c := auxIntToInt32(l.AuxInt)
18717 y := l.Args[1]
18718 x := l.Args[0]
18719 if !(l.Uses == 1) {
18720 break
18721 }
18722 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags)
18723 v0.AuxInt = int32ToAuxInt(c)
18724 v0.AddArg2(x, y)
18725 b.resetWithControl(BlockARMGTnoov, v0)
18726 return true
18727 }
18728
18729
18730
18731 for b.Controls[0].Op == OpARMCMPconst {
18732 v_0 := b.Controls[0]
18733 if auxIntToInt32(v_0.AuxInt) != 0 {
18734 break
18735 }
18736 l := v_0.Args[0]
18737 if l.Op != OpARMXORshiftRL {
18738 break
18739 }
18740 c := auxIntToInt32(l.AuxInt)
18741 y := l.Args[1]
18742 x := l.Args[0]
18743 if !(l.Uses == 1) {
18744 break
18745 }
18746 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags)
18747 v0.AuxInt = int32ToAuxInt(c)
18748 v0.AddArg2(x, y)
18749 b.resetWithControl(BlockARMGTnoov, v0)
18750 return true
18751 }
18752
18753
18754
18755 for b.Controls[0].Op == OpARMCMPconst {
18756 v_0 := b.Controls[0]
18757 if auxIntToInt32(v_0.AuxInt) != 0 {
18758 break
18759 }
18760 l := v_0.Args[0]
18761 if l.Op != OpARMXORshiftRA {
18762 break
18763 }
18764 c := auxIntToInt32(l.AuxInt)
18765 y := l.Args[1]
18766 x := l.Args[0]
18767 if !(l.Uses == 1) {
18768 break
18769 }
18770 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags)
18771 v0.AuxInt = int32ToAuxInt(c)
18772 v0.AddArg2(x, y)
18773 b.resetWithControl(BlockARMGTnoov, v0)
18774 return true
18775 }
18776
18777
18778
18779 for b.Controls[0].Op == OpARMCMPconst {
18780 v_0 := b.Controls[0]
18781 if auxIntToInt32(v_0.AuxInt) != 0 {
18782 break
18783 }
18784 l := v_0.Args[0]
18785 if l.Op != OpARMXORshiftLLreg {
18786 break
18787 }
18788 z := l.Args[2]
18789 x := l.Args[0]
18790 y := l.Args[1]
18791 if !(l.Uses == 1) {
18792 break
18793 }
18794 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags)
18795 v0.AddArg3(x, y, z)
18796 b.resetWithControl(BlockARMGTnoov, v0)
18797 return true
18798 }
18799
18800
18801
18802 for b.Controls[0].Op == OpARMCMPconst {
18803 v_0 := b.Controls[0]
18804 if auxIntToInt32(v_0.AuxInt) != 0 {
18805 break
18806 }
18807 l := v_0.Args[0]
18808 if l.Op != OpARMXORshiftRLreg {
18809 break
18810 }
18811 z := l.Args[2]
18812 x := l.Args[0]
18813 y := l.Args[1]
18814 if !(l.Uses == 1) {
18815 break
18816 }
18817 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags)
18818 v0.AddArg3(x, y, z)
18819 b.resetWithControl(BlockARMGTnoov, v0)
18820 return true
18821 }
18822
18823
18824
18825 for b.Controls[0].Op == OpARMCMPconst {
18826 v_0 := b.Controls[0]
18827 if auxIntToInt32(v_0.AuxInt) != 0 {
18828 break
18829 }
18830 l := v_0.Args[0]
18831 if l.Op != OpARMXORshiftRAreg {
18832 break
18833 }
18834 z := l.Args[2]
18835 x := l.Args[0]
18836 y := l.Args[1]
18837 if !(l.Uses == 1) {
18838 break
18839 }
18840 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags)
18841 v0.AddArg3(x, y, z)
18842 b.resetWithControl(BlockARMGTnoov, v0)
18843 return true
18844 }
18845 case BlockARMGTnoov:
18846
18847
18848
18849 for b.Controls[0].Op == OpARMFlagConstant {
18850 v_0 := b.Controls[0]
18851 fc := auxIntToFlagConstant(v_0.AuxInt)
18852 if !(fc.gtNoov()) {
18853 break
18854 }
18855 b.Reset(BlockFirst)
18856 return true
18857 }
18858
18859
18860
18861 for b.Controls[0].Op == OpARMFlagConstant {
18862 v_0 := b.Controls[0]
18863 fc := auxIntToFlagConstant(v_0.AuxInt)
18864 if !(!fc.gtNoov()) {
18865 break
18866 }
18867 b.Reset(BlockFirst)
18868 b.swapSuccessors()
18869 return true
18870 }
18871
18872
18873 for b.Controls[0].Op == OpARMInvertFlags {
18874 v_0 := b.Controls[0]
18875 cmp := v_0.Args[0]
18876 b.resetWithControl(BlockARMLTnoov, cmp)
18877 return true
18878 }
18879 case BlockIf:
18880
18881
18882 for b.Controls[0].Op == OpARMEqual {
18883 v_0 := b.Controls[0]
18884 cc := v_0.Args[0]
18885 b.resetWithControl(BlockARMEQ, cc)
18886 return true
18887 }
18888
18889
18890 for b.Controls[0].Op == OpARMNotEqual {
18891 v_0 := b.Controls[0]
18892 cc := v_0.Args[0]
18893 b.resetWithControl(BlockARMNE, cc)
18894 return true
18895 }
18896
18897
18898 for b.Controls[0].Op == OpARMLessThan {
18899 v_0 := b.Controls[0]
18900 cc := v_0.Args[0]
18901 b.resetWithControl(BlockARMLT, cc)
18902 return true
18903 }
18904
18905
18906 for b.Controls[0].Op == OpARMLessThanU {
18907 v_0 := b.Controls[0]
18908 cc := v_0.Args[0]
18909 b.resetWithControl(BlockARMULT, cc)
18910 return true
18911 }
18912
18913
18914 for b.Controls[0].Op == OpARMLessEqual {
18915 v_0 := b.Controls[0]
18916 cc := v_0.Args[0]
18917 b.resetWithControl(BlockARMLE, cc)
18918 return true
18919 }
18920
18921
18922 for b.Controls[0].Op == OpARMLessEqualU {
18923 v_0 := b.Controls[0]
18924 cc := v_0.Args[0]
18925 b.resetWithControl(BlockARMULE, cc)
18926 return true
18927 }
18928
18929
18930 for b.Controls[0].Op == OpARMGreaterThan {
18931 v_0 := b.Controls[0]
18932 cc := v_0.Args[0]
18933 b.resetWithControl(BlockARMGT, cc)
18934 return true
18935 }
18936
18937
18938 for b.Controls[0].Op == OpARMGreaterThanU {
18939 v_0 := b.Controls[0]
18940 cc := v_0.Args[0]
18941 b.resetWithControl(BlockARMUGT, cc)
18942 return true
18943 }
18944
18945
18946 for b.Controls[0].Op == OpARMGreaterEqual {
18947 v_0 := b.Controls[0]
18948 cc := v_0.Args[0]
18949 b.resetWithControl(BlockARMGE, cc)
18950 return true
18951 }
18952
18953
18954 for b.Controls[0].Op == OpARMGreaterEqualU {
18955 v_0 := b.Controls[0]
18956 cc := v_0.Args[0]
18957 b.resetWithControl(BlockARMUGE, cc)
18958 return true
18959 }
18960
18961
18962 for {
18963 cond := b.Controls[0]
18964 v0 := b.NewValue0(cond.Pos, OpARMCMPconst, types.TypeFlags)
18965 v0.AuxInt = int32ToAuxInt(0)
18966 v0.AddArg(cond)
18967 b.resetWithControl(BlockARMNE, v0)
18968 return true
18969 }
18970 case BlockARMLE:
18971
18972
18973
18974 for b.Controls[0].Op == OpARMFlagConstant {
18975 v_0 := b.Controls[0]
18976 fc := auxIntToFlagConstant(v_0.AuxInt)
18977 if !(fc.le()) {
18978 break
18979 }
18980 b.Reset(BlockFirst)
18981 return true
18982 }
18983
18984
18985
18986 for b.Controls[0].Op == OpARMFlagConstant {
18987 v_0 := b.Controls[0]
18988 fc := auxIntToFlagConstant(v_0.AuxInt)
18989 if !(!fc.le()) {
18990 break
18991 }
18992 b.Reset(BlockFirst)
18993 b.swapSuccessors()
18994 return true
18995 }
18996
18997
18998 for b.Controls[0].Op == OpARMInvertFlags {
18999 v_0 := b.Controls[0]
19000 cmp := v_0.Args[0]
19001 b.resetWithControl(BlockARMGE, cmp)
19002 return true
19003 }
19004
19005
19006
19007 for b.Controls[0].Op == OpARMCMPconst {
19008 v_0 := b.Controls[0]
19009 if auxIntToInt32(v_0.AuxInt) != 0 {
19010 break
19011 }
19012 l := v_0.Args[0]
19013 if l.Op != OpARMSUB {
19014 break
19015 }
19016 y := l.Args[1]
19017 x := l.Args[0]
19018 if !(l.Uses == 1) {
19019 break
19020 }
19021 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
19022 v0.AddArg2(x, y)
19023 b.resetWithControl(BlockARMLEnoov, v0)
19024 return true
19025 }
19026
19027
19028
19029 for b.Controls[0].Op == OpARMCMPconst {
19030 v_0 := b.Controls[0]
19031 if auxIntToInt32(v_0.AuxInt) != 0 {
19032 break
19033 }
19034 l := v_0.Args[0]
19035 if l.Op != OpARMMULS {
19036 break
19037 }
19038 a := l.Args[2]
19039 x := l.Args[0]
19040 y := l.Args[1]
19041 if !(l.Uses == 1) {
19042 break
19043 }
19044 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
19045 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
19046 v1.AddArg2(x, y)
19047 v0.AddArg2(a, v1)
19048 b.resetWithControl(BlockARMLEnoov, v0)
19049 return true
19050 }
19051
19052
19053
19054 for b.Controls[0].Op == OpARMCMPconst {
19055 v_0 := b.Controls[0]
19056 if auxIntToInt32(v_0.AuxInt) != 0 {
19057 break
19058 }
19059 l := v_0.Args[0]
19060 if l.Op != OpARMSUBconst {
19061 break
19062 }
19063 c := auxIntToInt32(l.AuxInt)
19064 x := l.Args[0]
19065 if !(l.Uses == 1) {
19066 break
19067 }
19068 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags)
19069 v0.AuxInt = int32ToAuxInt(c)
19070 v0.AddArg(x)
19071 b.resetWithControl(BlockARMLEnoov, v0)
19072 return true
19073 }
19074
19075
19076
19077 for b.Controls[0].Op == OpARMCMPconst {
19078 v_0 := b.Controls[0]
19079 if auxIntToInt32(v_0.AuxInt) != 0 {
19080 break
19081 }
19082 l := v_0.Args[0]
19083 if l.Op != OpARMSUBshiftLL {
19084 break
19085 }
19086 c := auxIntToInt32(l.AuxInt)
19087 y := l.Args[1]
19088 x := l.Args[0]
19089 if !(l.Uses == 1) {
19090 break
19091 }
19092 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags)
19093 v0.AuxInt = int32ToAuxInt(c)
19094 v0.AddArg2(x, y)
19095 b.resetWithControl(BlockARMLEnoov, v0)
19096 return true
19097 }
19098
19099
19100
19101 for b.Controls[0].Op == OpARMCMPconst {
19102 v_0 := b.Controls[0]
19103 if auxIntToInt32(v_0.AuxInt) != 0 {
19104 break
19105 }
19106 l := v_0.Args[0]
19107 if l.Op != OpARMSUBshiftRL {
19108 break
19109 }
19110 c := auxIntToInt32(l.AuxInt)
19111 y := l.Args[1]
19112 x := l.Args[0]
19113 if !(l.Uses == 1) {
19114 break
19115 }
19116 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags)
19117 v0.AuxInt = int32ToAuxInt(c)
19118 v0.AddArg2(x, y)
19119 b.resetWithControl(BlockARMLEnoov, v0)
19120 return true
19121 }
19122
19123
19124
19125 for b.Controls[0].Op == OpARMCMPconst {
19126 v_0 := b.Controls[0]
19127 if auxIntToInt32(v_0.AuxInt) != 0 {
19128 break
19129 }
19130 l := v_0.Args[0]
19131 if l.Op != OpARMSUBshiftRA {
19132 break
19133 }
19134 c := auxIntToInt32(l.AuxInt)
19135 y := l.Args[1]
19136 x := l.Args[0]
19137 if !(l.Uses == 1) {
19138 break
19139 }
19140 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags)
19141 v0.AuxInt = int32ToAuxInt(c)
19142 v0.AddArg2(x, y)
19143 b.resetWithControl(BlockARMLEnoov, v0)
19144 return true
19145 }
19146
19147
19148
19149 for b.Controls[0].Op == OpARMCMPconst {
19150 v_0 := b.Controls[0]
19151 if auxIntToInt32(v_0.AuxInt) != 0 {
19152 break
19153 }
19154 l := v_0.Args[0]
19155 if l.Op != OpARMSUBshiftLLreg {
19156 break
19157 }
19158 z := l.Args[2]
19159 x := l.Args[0]
19160 y := l.Args[1]
19161 if !(l.Uses == 1) {
19162 break
19163 }
19164 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
19165 v0.AddArg3(x, y, z)
19166 b.resetWithControl(BlockARMLEnoov, v0)
19167 return true
19168 }
19169
19170
19171
19172 for b.Controls[0].Op == OpARMCMPconst {
19173 v_0 := b.Controls[0]
19174 if auxIntToInt32(v_0.AuxInt) != 0 {
19175 break
19176 }
19177 l := v_0.Args[0]
19178 if l.Op != OpARMSUBshiftRLreg {
19179 break
19180 }
19181 z := l.Args[2]
19182 x := l.Args[0]
19183 y := l.Args[1]
19184 if !(l.Uses == 1) {
19185 break
19186 }
19187 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
19188 v0.AddArg3(x, y, z)
19189 b.resetWithControl(BlockARMLEnoov, v0)
19190 return true
19191 }
19192
19193
19194
19195 for b.Controls[0].Op == OpARMCMPconst {
19196 v_0 := b.Controls[0]
19197 if auxIntToInt32(v_0.AuxInt) != 0 {
19198 break
19199 }
19200 l := v_0.Args[0]
19201 if l.Op != OpARMSUBshiftRAreg {
19202 break
19203 }
19204 z := l.Args[2]
19205 x := l.Args[0]
19206 y := l.Args[1]
19207 if !(l.Uses == 1) {
19208 break
19209 }
19210 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
19211 v0.AddArg3(x, y, z)
19212 b.resetWithControl(BlockARMLEnoov, v0)
19213 return true
19214 }
19215
19216
19217
19218 for b.Controls[0].Op == OpARMCMPconst {
19219 v_0 := b.Controls[0]
19220 if auxIntToInt32(v_0.AuxInt) != 0 {
19221 break
19222 }
19223 l := v_0.Args[0]
19224 if l.Op != OpARMADD {
19225 break
19226 }
19227 _ = l.Args[1]
19228 l_0 := l.Args[0]
19229 l_1 := l.Args[1]
19230 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
19231 x := l_0
19232 y := l_1
19233 if !(l.Uses == 1) {
19234 continue
19235 }
19236 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
19237 v0.AddArg2(x, y)
19238 b.resetWithControl(BlockARMLEnoov, v0)
19239 return true
19240 }
19241 break
19242 }
19243
19244
19245
19246 for b.Controls[0].Op == OpARMCMPconst {
19247 v_0 := b.Controls[0]
19248 if auxIntToInt32(v_0.AuxInt) != 0 {
19249 break
19250 }
19251 l := v_0.Args[0]
19252 if l.Op != OpARMMULA {
19253 break
19254 }
19255 a := l.Args[2]
19256 x := l.Args[0]
19257 y := l.Args[1]
19258 if !(l.Uses == 1) {
19259 break
19260 }
19261 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
19262 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
19263 v1.AddArg2(x, y)
19264 v0.AddArg2(a, v1)
19265 b.resetWithControl(BlockARMLEnoov, v0)
19266 return true
19267 }
19268
19269
19270
19271 for b.Controls[0].Op == OpARMCMPconst {
19272 v_0 := b.Controls[0]
19273 if auxIntToInt32(v_0.AuxInt) != 0 {
19274 break
19275 }
19276 l := v_0.Args[0]
19277 if l.Op != OpARMADDconst {
19278 break
19279 }
19280 c := auxIntToInt32(l.AuxInt)
19281 x := l.Args[0]
19282 if !(l.Uses == 1) {
19283 break
19284 }
19285 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags)
19286 v0.AuxInt = int32ToAuxInt(c)
19287 v0.AddArg(x)
19288 b.resetWithControl(BlockARMLEnoov, v0)
19289 return true
19290 }
19291
19292
19293
19294 for b.Controls[0].Op == OpARMCMPconst {
19295 v_0 := b.Controls[0]
19296 if auxIntToInt32(v_0.AuxInt) != 0 {
19297 break
19298 }
19299 l := v_0.Args[0]
19300 if l.Op != OpARMADDshiftLL {
19301 break
19302 }
19303 c := auxIntToInt32(l.AuxInt)
19304 y := l.Args[1]
19305 x := l.Args[0]
19306 if !(l.Uses == 1) {
19307 break
19308 }
19309 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags)
19310 v0.AuxInt = int32ToAuxInt(c)
19311 v0.AddArg2(x, y)
19312 b.resetWithControl(BlockARMLEnoov, v0)
19313 return true
19314 }
19315
19316
19317
19318 for b.Controls[0].Op == OpARMCMPconst {
19319 v_0 := b.Controls[0]
19320 if auxIntToInt32(v_0.AuxInt) != 0 {
19321 break
19322 }
19323 l := v_0.Args[0]
19324 if l.Op != OpARMADDshiftRL {
19325 break
19326 }
19327 c := auxIntToInt32(l.AuxInt)
19328 y := l.Args[1]
19329 x := l.Args[0]
19330 if !(l.Uses == 1) {
19331 break
19332 }
19333 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags)
19334 v0.AuxInt = int32ToAuxInt(c)
19335 v0.AddArg2(x, y)
19336 b.resetWithControl(BlockARMLEnoov, v0)
19337 return true
19338 }
19339
19340
19341
19342 for b.Controls[0].Op == OpARMCMPconst {
19343 v_0 := b.Controls[0]
19344 if auxIntToInt32(v_0.AuxInt) != 0 {
19345 break
19346 }
19347 l := v_0.Args[0]
19348 if l.Op != OpARMADDshiftRA {
19349 break
19350 }
19351 c := auxIntToInt32(l.AuxInt)
19352 y := l.Args[1]
19353 x := l.Args[0]
19354 if !(l.Uses == 1) {
19355 break
19356 }
19357 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags)
19358 v0.AuxInt = int32ToAuxInt(c)
19359 v0.AddArg2(x, y)
19360 b.resetWithControl(BlockARMLEnoov, v0)
19361 return true
19362 }
19363
19364
19365
19366 for b.Controls[0].Op == OpARMCMPconst {
19367 v_0 := b.Controls[0]
19368 if auxIntToInt32(v_0.AuxInt) != 0 {
19369 break
19370 }
19371 l := v_0.Args[0]
19372 if l.Op != OpARMADDshiftLLreg {
19373 break
19374 }
19375 z := l.Args[2]
19376 x := l.Args[0]
19377 y := l.Args[1]
19378 if !(l.Uses == 1) {
19379 break
19380 }
19381 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags)
19382 v0.AddArg3(x, y, z)
19383 b.resetWithControl(BlockARMLEnoov, v0)
19384 return true
19385 }
19386
19387
19388
19389 for b.Controls[0].Op == OpARMCMPconst {
19390 v_0 := b.Controls[0]
19391 if auxIntToInt32(v_0.AuxInt) != 0 {
19392 break
19393 }
19394 l := v_0.Args[0]
19395 if l.Op != OpARMADDshiftRLreg {
19396 break
19397 }
19398 z := l.Args[2]
19399 x := l.Args[0]
19400 y := l.Args[1]
19401 if !(l.Uses == 1) {
19402 break
19403 }
19404 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags)
19405 v0.AddArg3(x, y, z)
19406 b.resetWithControl(BlockARMLEnoov, v0)
19407 return true
19408 }
19409
19410
19411
19412 for b.Controls[0].Op == OpARMCMPconst {
19413 v_0 := b.Controls[0]
19414 if auxIntToInt32(v_0.AuxInt) != 0 {
19415 break
19416 }
19417 l := v_0.Args[0]
19418 if l.Op != OpARMADDshiftRAreg {
19419 break
19420 }
19421 z := l.Args[2]
19422 x := l.Args[0]
19423 y := l.Args[1]
19424 if !(l.Uses == 1) {
19425 break
19426 }
19427 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags)
19428 v0.AddArg3(x, y, z)
19429 b.resetWithControl(BlockARMLEnoov, v0)
19430 return true
19431 }
19432
19433
19434
19435 for b.Controls[0].Op == OpARMCMPconst {
19436 v_0 := b.Controls[0]
19437 if auxIntToInt32(v_0.AuxInt) != 0 {
19438 break
19439 }
19440 l := v_0.Args[0]
19441 if l.Op != OpARMAND {
19442 break
19443 }
19444 _ = l.Args[1]
19445 l_0 := l.Args[0]
19446 l_1 := l.Args[1]
19447 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
19448 x := l_0
19449 y := l_1
19450 if !(l.Uses == 1) {
19451 continue
19452 }
19453 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags)
19454 v0.AddArg2(x, y)
19455 b.resetWithControl(BlockARMLEnoov, v0)
19456 return true
19457 }
19458 break
19459 }
19460
19461
19462
19463 for b.Controls[0].Op == OpARMCMPconst {
19464 v_0 := b.Controls[0]
19465 if auxIntToInt32(v_0.AuxInt) != 0 {
19466 break
19467 }
19468 l := v_0.Args[0]
19469 if l.Op != OpARMANDconst {
19470 break
19471 }
19472 c := auxIntToInt32(l.AuxInt)
19473 x := l.Args[0]
19474 if !(l.Uses == 1) {
19475 break
19476 }
19477 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags)
19478 v0.AuxInt = int32ToAuxInt(c)
19479 v0.AddArg(x)
19480 b.resetWithControl(BlockARMLEnoov, v0)
19481 return true
19482 }
19483
19484
19485
19486 for b.Controls[0].Op == OpARMCMPconst {
19487 v_0 := b.Controls[0]
19488 if auxIntToInt32(v_0.AuxInt) != 0 {
19489 break
19490 }
19491 l := v_0.Args[0]
19492 if l.Op != OpARMANDshiftLL {
19493 break
19494 }
19495 c := auxIntToInt32(l.AuxInt)
19496 y := l.Args[1]
19497 x := l.Args[0]
19498 if !(l.Uses == 1) {
19499 break
19500 }
19501 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags)
19502 v0.AuxInt = int32ToAuxInt(c)
19503 v0.AddArg2(x, y)
19504 b.resetWithControl(BlockARMLEnoov, v0)
19505 return true
19506 }
19507
19508
19509
19510 for b.Controls[0].Op == OpARMCMPconst {
19511 v_0 := b.Controls[0]
19512 if auxIntToInt32(v_0.AuxInt) != 0 {
19513 break
19514 }
19515 l := v_0.Args[0]
19516 if l.Op != OpARMANDshiftRL {
19517 break
19518 }
19519 c := auxIntToInt32(l.AuxInt)
19520 y := l.Args[1]
19521 x := l.Args[0]
19522 if !(l.Uses == 1) {
19523 break
19524 }
19525 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags)
19526 v0.AuxInt = int32ToAuxInt(c)
19527 v0.AddArg2(x, y)
19528 b.resetWithControl(BlockARMLEnoov, v0)
19529 return true
19530 }
19531
19532
19533
19534 for b.Controls[0].Op == OpARMCMPconst {
19535 v_0 := b.Controls[0]
19536 if auxIntToInt32(v_0.AuxInt) != 0 {
19537 break
19538 }
19539 l := v_0.Args[0]
19540 if l.Op != OpARMANDshiftRA {
19541 break
19542 }
19543 c := auxIntToInt32(l.AuxInt)
19544 y := l.Args[1]
19545 x := l.Args[0]
19546 if !(l.Uses == 1) {
19547 break
19548 }
19549 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags)
19550 v0.AuxInt = int32ToAuxInt(c)
19551 v0.AddArg2(x, y)
19552 b.resetWithControl(BlockARMLEnoov, v0)
19553 return true
19554 }
19555
19556
19557
19558 for b.Controls[0].Op == OpARMCMPconst {
19559 v_0 := b.Controls[0]
19560 if auxIntToInt32(v_0.AuxInt) != 0 {
19561 break
19562 }
19563 l := v_0.Args[0]
19564 if l.Op != OpARMANDshiftLLreg {
19565 break
19566 }
19567 z := l.Args[2]
19568 x := l.Args[0]
19569 y := l.Args[1]
19570 if !(l.Uses == 1) {
19571 break
19572 }
19573 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags)
19574 v0.AddArg3(x, y, z)
19575 b.resetWithControl(BlockARMLEnoov, v0)
19576 return true
19577 }
19578
19579
19580
19581 for b.Controls[0].Op == OpARMCMPconst {
19582 v_0 := b.Controls[0]
19583 if auxIntToInt32(v_0.AuxInt) != 0 {
19584 break
19585 }
19586 l := v_0.Args[0]
19587 if l.Op != OpARMANDshiftRLreg {
19588 break
19589 }
19590 z := l.Args[2]
19591 x := l.Args[0]
19592 y := l.Args[1]
19593 if !(l.Uses == 1) {
19594 break
19595 }
19596 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags)
19597 v0.AddArg3(x, y, z)
19598 b.resetWithControl(BlockARMLEnoov, v0)
19599 return true
19600 }
19601
19602
19603
19604 for b.Controls[0].Op == OpARMCMPconst {
19605 v_0 := b.Controls[0]
19606 if auxIntToInt32(v_0.AuxInt) != 0 {
19607 break
19608 }
19609 l := v_0.Args[0]
19610 if l.Op != OpARMANDshiftRAreg {
19611 break
19612 }
19613 z := l.Args[2]
19614 x := l.Args[0]
19615 y := l.Args[1]
19616 if !(l.Uses == 1) {
19617 break
19618 }
19619 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags)
19620 v0.AddArg3(x, y, z)
19621 b.resetWithControl(BlockARMLEnoov, v0)
19622 return true
19623 }
19624
19625
19626
19627 for b.Controls[0].Op == OpARMCMPconst {
19628 v_0 := b.Controls[0]
19629 if auxIntToInt32(v_0.AuxInt) != 0 {
19630 break
19631 }
19632 l := v_0.Args[0]
19633 if l.Op != OpARMXOR {
19634 break
19635 }
19636 _ = l.Args[1]
19637 l_0 := l.Args[0]
19638 l_1 := l.Args[1]
19639 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
19640 x := l_0
19641 y := l_1
19642 if !(l.Uses == 1) {
19643 continue
19644 }
19645 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags)
19646 v0.AddArg2(x, y)
19647 b.resetWithControl(BlockARMLEnoov, v0)
19648 return true
19649 }
19650 break
19651 }
19652
19653
19654
19655 for b.Controls[0].Op == OpARMCMPconst {
19656 v_0 := b.Controls[0]
19657 if auxIntToInt32(v_0.AuxInt) != 0 {
19658 break
19659 }
19660 l := v_0.Args[0]
19661 if l.Op != OpARMXORconst {
19662 break
19663 }
19664 c := auxIntToInt32(l.AuxInt)
19665 x := l.Args[0]
19666 if !(l.Uses == 1) {
19667 break
19668 }
19669 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags)
19670 v0.AuxInt = int32ToAuxInt(c)
19671 v0.AddArg(x)
19672 b.resetWithControl(BlockARMLEnoov, v0)
19673 return true
19674 }
19675
19676
19677
19678 for b.Controls[0].Op == OpARMCMPconst {
19679 v_0 := b.Controls[0]
19680 if auxIntToInt32(v_0.AuxInt) != 0 {
19681 break
19682 }
19683 l := v_0.Args[0]
19684 if l.Op != OpARMXORshiftLL {
19685 break
19686 }
19687 c := auxIntToInt32(l.AuxInt)
19688 y := l.Args[1]
19689 x := l.Args[0]
19690 if !(l.Uses == 1) {
19691 break
19692 }
19693 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags)
19694 v0.AuxInt = int32ToAuxInt(c)
19695 v0.AddArg2(x, y)
19696 b.resetWithControl(BlockARMLEnoov, v0)
19697 return true
19698 }
19699
19700
19701
19702 for b.Controls[0].Op == OpARMCMPconst {
19703 v_0 := b.Controls[0]
19704 if auxIntToInt32(v_0.AuxInt) != 0 {
19705 break
19706 }
19707 l := v_0.Args[0]
19708 if l.Op != OpARMXORshiftRL {
19709 break
19710 }
19711 c := auxIntToInt32(l.AuxInt)
19712 y := l.Args[1]
19713 x := l.Args[0]
19714 if !(l.Uses == 1) {
19715 break
19716 }
19717 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags)
19718 v0.AuxInt = int32ToAuxInt(c)
19719 v0.AddArg2(x, y)
19720 b.resetWithControl(BlockARMLEnoov, v0)
19721 return true
19722 }
19723
19724
19725
19726 for b.Controls[0].Op == OpARMCMPconst {
19727 v_0 := b.Controls[0]
19728 if auxIntToInt32(v_0.AuxInt) != 0 {
19729 break
19730 }
19731 l := v_0.Args[0]
19732 if l.Op != OpARMXORshiftRA {
19733 break
19734 }
19735 c := auxIntToInt32(l.AuxInt)
19736 y := l.Args[1]
19737 x := l.Args[0]
19738 if !(l.Uses == 1) {
19739 break
19740 }
19741 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags)
19742 v0.AuxInt = int32ToAuxInt(c)
19743 v0.AddArg2(x, y)
19744 b.resetWithControl(BlockARMLEnoov, v0)
19745 return true
19746 }
19747
19748
19749
19750 for b.Controls[0].Op == OpARMCMPconst {
19751 v_0 := b.Controls[0]
19752 if auxIntToInt32(v_0.AuxInt) != 0 {
19753 break
19754 }
19755 l := v_0.Args[0]
19756 if l.Op != OpARMXORshiftLLreg {
19757 break
19758 }
19759 z := l.Args[2]
19760 x := l.Args[0]
19761 y := l.Args[1]
19762 if !(l.Uses == 1) {
19763 break
19764 }
19765 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags)
19766 v0.AddArg3(x, y, z)
19767 b.resetWithControl(BlockARMLEnoov, v0)
19768 return true
19769 }
19770
19771
19772
19773 for b.Controls[0].Op == OpARMCMPconst {
19774 v_0 := b.Controls[0]
19775 if auxIntToInt32(v_0.AuxInt) != 0 {
19776 break
19777 }
19778 l := v_0.Args[0]
19779 if l.Op != OpARMXORshiftRLreg {
19780 break
19781 }
19782 z := l.Args[2]
19783 x := l.Args[0]
19784 y := l.Args[1]
19785 if !(l.Uses == 1) {
19786 break
19787 }
19788 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags)
19789 v0.AddArg3(x, y, z)
19790 b.resetWithControl(BlockARMLEnoov, v0)
19791 return true
19792 }
19793
19794
19795
19796 for b.Controls[0].Op == OpARMCMPconst {
19797 v_0 := b.Controls[0]
19798 if auxIntToInt32(v_0.AuxInt) != 0 {
19799 break
19800 }
19801 l := v_0.Args[0]
19802 if l.Op != OpARMXORshiftRAreg {
19803 break
19804 }
19805 z := l.Args[2]
19806 x := l.Args[0]
19807 y := l.Args[1]
19808 if !(l.Uses == 1) {
19809 break
19810 }
19811 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags)
19812 v0.AddArg3(x, y, z)
19813 b.resetWithControl(BlockARMLEnoov, v0)
19814 return true
19815 }
19816 case BlockARMLEnoov:
19817
19818
19819
19820 for b.Controls[0].Op == OpARMFlagConstant {
19821 v_0 := b.Controls[0]
19822 fc := auxIntToFlagConstant(v_0.AuxInt)
19823 if !(fc.leNoov()) {
19824 break
19825 }
19826 b.Reset(BlockFirst)
19827 return true
19828 }
19829
19830
19831
19832 for b.Controls[0].Op == OpARMFlagConstant {
19833 v_0 := b.Controls[0]
19834 fc := auxIntToFlagConstant(v_0.AuxInt)
19835 if !(!fc.leNoov()) {
19836 break
19837 }
19838 b.Reset(BlockFirst)
19839 b.swapSuccessors()
19840 return true
19841 }
19842
19843
19844 for b.Controls[0].Op == OpARMInvertFlags {
19845 v_0 := b.Controls[0]
19846 cmp := v_0.Args[0]
19847 b.resetWithControl(BlockARMGEnoov, cmp)
19848 return true
19849 }
19850 case BlockARMLT:
19851
19852
19853
19854 for b.Controls[0].Op == OpARMFlagConstant {
19855 v_0 := b.Controls[0]
19856 fc := auxIntToFlagConstant(v_0.AuxInt)
19857 if !(fc.lt()) {
19858 break
19859 }
19860 b.Reset(BlockFirst)
19861 return true
19862 }
19863
19864
19865
19866 for b.Controls[0].Op == OpARMFlagConstant {
19867 v_0 := b.Controls[0]
19868 fc := auxIntToFlagConstant(v_0.AuxInt)
19869 if !(!fc.lt()) {
19870 break
19871 }
19872 b.Reset(BlockFirst)
19873 b.swapSuccessors()
19874 return true
19875 }
19876
19877
19878 for b.Controls[0].Op == OpARMInvertFlags {
19879 v_0 := b.Controls[0]
19880 cmp := v_0.Args[0]
19881 b.resetWithControl(BlockARMGT, cmp)
19882 return true
19883 }
19884
19885
19886
19887 for b.Controls[0].Op == OpARMCMPconst {
19888 v_0 := b.Controls[0]
19889 if auxIntToInt32(v_0.AuxInt) != 0 {
19890 break
19891 }
19892 l := v_0.Args[0]
19893 if l.Op != OpARMSUB {
19894 break
19895 }
19896 y := l.Args[1]
19897 x := l.Args[0]
19898 if !(l.Uses == 1) {
19899 break
19900 }
19901 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
19902 v0.AddArg2(x, y)
19903 b.resetWithControl(BlockARMLTnoov, v0)
19904 return true
19905 }
19906
19907
19908
19909 for b.Controls[0].Op == OpARMCMPconst {
19910 v_0 := b.Controls[0]
19911 if auxIntToInt32(v_0.AuxInt) != 0 {
19912 break
19913 }
19914 l := v_0.Args[0]
19915 if l.Op != OpARMMULS {
19916 break
19917 }
19918 a := l.Args[2]
19919 x := l.Args[0]
19920 y := l.Args[1]
19921 if !(l.Uses == 1) {
19922 break
19923 }
19924 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
19925 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
19926 v1.AddArg2(x, y)
19927 v0.AddArg2(a, v1)
19928 b.resetWithControl(BlockARMLTnoov, v0)
19929 return true
19930 }
19931
19932
19933
19934 for b.Controls[0].Op == OpARMCMPconst {
19935 v_0 := b.Controls[0]
19936 if auxIntToInt32(v_0.AuxInt) != 0 {
19937 break
19938 }
19939 l := v_0.Args[0]
19940 if l.Op != OpARMSUBconst {
19941 break
19942 }
19943 c := auxIntToInt32(l.AuxInt)
19944 x := l.Args[0]
19945 if !(l.Uses == 1) {
19946 break
19947 }
19948 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags)
19949 v0.AuxInt = int32ToAuxInt(c)
19950 v0.AddArg(x)
19951 b.resetWithControl(BlockARMLTnoov, v0)
19952 return true
19953 }
19954
19955
19956
19957 for b.Controls[0].Op == OpARMCMPconst {
19958 v_0 := b.Controls[0]
19959 if auxIntToInt32(v_0.AuxInt) != 0 {
19960 break
19961 }
19962 l := v_0.Args[0]
19963 if l.Op != OpARMSUBshiftLL {
19964 break
19965 }
19966 c := auxIntToInt32(l.AuxInt)
19967 y := l.Args[1]
19968 x := l.Args[0]
19969 if !(l.Uses == 1) {
19970 break
19971 }
19972 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags)
19973 v0.AuxInt = int32ToAuxInt(c)
19974 v0.AddArg2(x, y)
19975 b.resetWithControl(BlockARMLTnoov, v0)
19976 return true
19977 }
19978
19979
19980
19981 for b.Controls[0].Op == OpARMCMPconst {
19982 v_0 := b.Controls[0]
19983 if auxIntToInt32(v_0.AuxInt) != 0 {
19984 break
19985 }
19986 l := v_0.Args[0]
19987 if l.Op != OpARMSUBshiftRL {
19988 break
19989 }
19990 c := auxIntToInt32(l.AuxInt)
19991 y := l.Args[1]
19992 x := l.Args[0]
19993 if !(l.Uses == 1) {
19994 break
19995 }
19996 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags)
19997 v0.AuxInt = int32ToAuxInt(c)
19998 v0.AddArg2(x, y)
19999 b.resetWithControl(BlockARMLTnoov, v0)
20000 return true
20001 }
20002
20003
20004
20005 for b.Controls[0].Op == OpARMCMPconst {
20006 v_0 := b.Controls[0]
20007 if auxIntToInt32(v_0.AuxInt) != 0 {
20008 break
20009 }
20010 l := v_0.Args[0]
20011 if l.Op != OpARMSUBshiftRA {
20012 break
20013 }
20014 c := auxIntToInt32(l.AuxInt)
20015 y := l.Args[1]
20016 x := l.Args[0]
20017 if !(l.Uses == 1) {
20018 break
20019 }
20020 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags)
20021 v0.AuxInt = int32ToAuxInt(c)
20022 v0.AddArg2(x, y)
20023 b.resetWithControl(BlockARMLTnoov, v0)
20024 return true
20025 }
20026
20027
20028
20029 for b.Controls[0].Op == OpARMCMPconst {
20030 v_0 := b.Controls[0]
20031 if auxIntToInt32(v_0.AuxInt) != 0 {
20032 break
20033 }
20034 l := v_0.Args[0]
20035 if l.Op != OpARMSUBshiftLLreg {
20036 break
20037 }
20038 z := l.Args[2]
20039 x := l.Args[0]
20040 y := l.Args[1]
20041 if !(l.Uses == 1) {
20042 break
20043 }
20044 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
20045 v0.AddArg3(x, y, z)
20046 b.resetWithControl(BlockARMLTnoov, v0)
20047 return true
20048 }
20049
20050
20051
20052 for b.Controls[0].Op == OpARMCMPconst {
20053 v_0 := b.Controls[0]
20054 if auxIntToInt32(v_0.AuxInt) != 0 {
20055 break
20056 }
20057 l := v_0.Args[0]
20058 if l.Op != OpARMSUBshiftRLreg {
20059 break
20060 }
20061 z := l.Args[2]
20062 x := l.Args[0]
20063 y := l.Args[1]
20064 if !(l.Uses == 1) {
20065 break
20066 }
20067 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
20068 v0.AddArg3(x, y, z)
20069 b.resetWithControl(BlockARMLTnoov, v0)
20070 return true
20071 }
20072
20073
20074
20075 for b.Controls[0].Op == OpARMCMPconst {
20076 v_0 := b.Controls[0]
20077 if auxIntToInt32(v_0.AuxInt) != 0 {
20078 break
20079 }
20080 l := v_0.Args[0]
20081 if l.Op != OpARMSUBshiftRAreg {
20082 break
20083 }
20084 z := l.Args[2]
20085 x := l.Args[0]
20086 y := l.Args[1]
20087 if !(l.Uses == 1) {
20088 break
20089 }
20090 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
20091 v0.AddArg3(x, y, z)
20092 b.resetWithControl(BlockARMLTnoov, v0)
20093 return true
20094 }
20095
20096
20097
20098 for b.Controls[0].Op == OpARMCMPconst {
20099 v_0 := b.Controls[0]
20100 if auxIntToInt32(v_0.AuxInt) != 0 {
20101 break
20102 }
20103 l := v_0.Args[0]
20104 if l.Op != OpARMADD {
20105 break
20106 }
20107 _ = l.Args[1]
20108 l_0 := l.Args[0]
20109 l_1 := l.Args[1]
20110 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
20111 x := l_0
20112 y := l_1
20113 if !(l.Uses == 1) {
20114 continue
20115 }
20116 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
20117 v0.AddArg2(x, y)
20118 b.resetWithControl(BlockARMLTnoov, v0)
20119 return true
20120 }
20121 break
20122 }
20123
20124
20125
20126 for b.Controls[0].Op == OpARMCMPconst {
20127 v_0 := b.Controls[0]
20128 if auxIntToInt32(v_0.AuxInt) != 0 {
20129 break
20130 }
20131 l := v_0.Args[0]
20132 if l.Op != OpARMMULA {
20133 break
20134 }
20135 a := l.Args[2]
20136 x := l.Args[0]
20137 y := l.Args[1]
20138 if !(l.Uses == 1) {
20139 break
20140 }
20141 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
20142 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
20143 v1.AddArg2(x, y)
20144 v0.AddArg2(a, v1)
20145 b.resetWithControl(BlockARMLTnoov, v0)
20146 return true
20147 }
20148
20149
20150
20151 for b.Controls[0].Op == OpARMCMPconst {
20152 v_0 := b.Controls[0]
20153 if auxIntToInt32(v_0.AuxInt) != 0 {
20154 break
20155 }
20156 l := v_0.Args[0]
20157 if l.Op != OpARMADDconst {
20158 break
20159 }
20160 c := auxIntToInt32(l.AuxInt)
20161 x := l.Args[0]
20162 if !(l.Uses == 1) {
20163 break
20164 }
20165 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags)
20166 v0.AuxInt = int32ToAuxInt(c)
20167 v0.AddArg(x)
20168 b.resetWithControl(BlockARMLTnoov, v0)
20169 return true
20170 }
20171
20172
20173
20174 for b.Controls[0].Op == OpARMCMPconst {
20175 v_0 := b.Controls[0]
20176 if auxIntToInt32(v_0.AuxInt) != 0 {
20177 break
20178 }
20179 l := v_0.Args[0]
20180 if l.Op != OpARMADDshiftLL {
20181 break
20182 }
20183 c := auxIntToInt32(l.AuxInt)
20184 y := l.Args[1]
20185 x := l.Args[0]
20186 if !(l.Uses == 1) {
20187 break
20188 }
20189 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags)
20190 v0.AuxInt = int32ToAuxInt(c)
20191 v0.AddArg2(x, y)
20192 b.resetWithControl(BlockARMLTnoov, v0)
20193 return true
20194 }
20195
20196
20197
20198 for b.Controls[0].Op == OpARMCMPconst {
20199 v_0 := b.Controls[0]
20200 if auxIntToInt32(v_0.AuxInt) != 0 {
20201 break
20202 }
20203 l := v_0.Args[0]
20204 if l.Op != OpARMADDshiftRL {
20205 break
20206 }
20207 c := auxIntToInt32(l.AuxInt)
20208 y := l.Args[1]
20209 x := l.Args[0]
20210 if !(l.Uses == 1) {
20211 break
20212 }
20213 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags)
20214 v0.AuxInt = int32ToAuxInt(c)
20215 v0.AddArg2(x, y)
20216 b.resetWithControl(BlockARMLTnoov, v0)
20217 return true
20218 }
20219
20220
20221
20222 for b.Controls[0].Op == OpARMCMPconst {
20223 v_0 := b.Controls[0]
20224 if auxIntToInt32(v_0.AuxInt) != 0 {
20225 break
20226 }
20227 l := v_0.Args[0]
20228 if l.Op != OpARMADDshiftRA {
20229 break
20230 }
20231 c := auxIntToInt32(l.AuxInt)
20232 y := l.Args[1]
20233 x := l.Args[0]
20234 if !(l.Uses == 1) {
20235 break
20236 }
20237 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags)
20238 v0.AuxInt = int32ToAuxInt(c)
20239 v0.AddArg2(x, y)
20240 b.resetWithControl(BlockARMLTnoov, v0)
20241 return true
20242 }
20243
20244
20245
20246 for b.Controls[0].Op == OpARMCMPconst {
20247 v_0 := b.Controls[0]
20248 if auxIntToInt32(v_0.AuxInt) != 0 {
20249 break
20250 }
20251 l := v_0.Args[0]
20252 if l.Op != OpARMADDshiftLLreg {
20253 break
20254 }
20255 z := l.Args[2]
20256 x := l.Args[0]
20257 y := l.Args[1]
20258 if !(l.Uses == 1) {
20259 break
20260 }
20261 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags)
20262 v0.AddArg3(x, y, z)
20263 b.resetWithControl(BlockARMLTnoov, v0)
20264 return true
20265 }
20266
20267
20268
20269 for b.Controls[0].Op == OpARMCMPconst {
20270 v_0 := b.Controls[0]
20271 if auxIntToInt32(v_0.AuxInt) != 0 {
20272 break
20273 }
20274 l := v_0.Args[0]
20275 if l.Op != OpARMADDshiftRLreg {
20276 break
20277 }
20278 z := l.Args[2]
20279 x := l.Args[0]
20280 y := l.Args[1]
20281 if !(l.Uses == 1) {
20282 break
20283 }
20284 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags)
20285 v0.AddArg3(x, y, z)
20286 b.resetWithControl(BlockARMLTnoov, v0)
20287 return true
20288 }
20289
20290
20291
20292 for b.Controls[0].Op == OpARMCMPconst {
20293 v_0 := b.Controls[0]
20294 if auxIntToInt32(v_0.AuxInt) != 0 {
20295 break
20296 }
20297 l := v_0.Args[0]
20298 if l.Op != OpARMADDshiftRAreg {
20299 break
20300 }
20301 z := l.Args[2]
20302 x := l.Args[0]
20303 y := l.Args[1]
20304 if !(l.Uses == 1) {
20305 break
20306 }
20307 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags)
20308 v0.AddArg3(x, y, z)
20309 b.resetWithControl(BlockARMLTnoov, v0)
20310 return true
20311 }
20312
20313
20314
20315 for b.Controls[0].Op == OpARMCMPconst {
20316 v_0 := b.Controls[0]
20317 if auxIntToInt32(v_0.AuxInt) != 0 {
20318 break
20319 }
20320 l := v_0.Args[0]
20321 if l.Op != OpARMAND {
20322 break
20323 }
20324 _ = l.Args[1]
20325 l_0 := l.Args[0]
20326 l_1 := l.Args[1]
20327 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
20328 x := l_0
20329 y := l_1
20330 if !(l.Uses == 1) {
20331 continue
20332 }
20333 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags)
20334 v0.AddArg2(x, y)
20335 b.resetWithControl(BlockARMLTnoov, v0)
20336 return true
20337 }
20338 break
20339 }
20340
20341
20342
20343 for b.Controls[0].Op == OpARMCMPconst {
20344 v_0 := b.Controls[0]
20345 if auxIntToInt32(v_0.AuxInt) != 0 {
20346 break
20347 }
20348 l := v_0.Args[0]
20349 if l.Op != OpARMANDconst {
20350 break
20351 }
20352 c := auxIntToInt32(l.AuxInt)
20353 x := l.Args[0]
20354 if !(l.Uses == 1) {
20355 break
20356 }
20357 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags)
20358 v0.AuxInt = int32ToAuxInt(c)
20359 v0.AddArg(x)
20360 b.resetWithControl(BlockARMLTnoov, v0)
20361 return true
20362 }
20363
20364
20365
20366 for b.Controls[0].Op == OpARMCMPconst {
20367 v_0 := b.Controls[0]
20368 if auxIntToInt32(v_0.AuxInt) != 0 {
20369 break
20370 }
20371 l := v_0.Args[0]
20372 if l.Op != OpARMANDshiftLL {
20373 break
20374 }
20375 c := auxIntToInt32(l.AuxInt)
20376 y := l.Args[1]
20377 x := l.Args[0]
20378 if !(l.Uses == 1) {
20379 break
20380 }
20381 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags)
20382 v0.AuxInt = int32ToAuxInt(c)
20383 v0.AddArg2(x, y)
20384 b.resetWithControl(BlockARMLTnoov, v0)
20385 return true
20386 }
20387
20388
20389
20390 for b.Controls[0].Op == OpARMCMPconst {
20391 v_0 := b.Controls[0]
20392 if auxIntToInt32(v_0.AuxInt) != 0 {
20393 break
20394 }
20395 l := v_0.Args[0]
20396 if l.Op != OpARMANDshiftRL {
20397 break
20398 }
20399 c := auxIntToInt32(l.AuxInt)
20400 y := l.Args[1]
20401 x := l.Args[0]
20402 if !(l.Uses == 1) {
20403 break
20404 }
20405 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags)
20406 v0.AuxInt = int32ToAuxInt(c)
20407 v0.AddArg2(x, y)
20408 b.resetWithControl(BlockARMLTnoov, v0)
20409 return true
20410 }
20411
20412
20413
20414 for b.Controls[0].Op == OpARMCMPconst {
20415 v_0 := b.Controls[0]
20416 if auxIntToInt32(v_0.AuxInt) != 0 {
20417 break
20418 }
20419 l := v_0.Args[0]
20420 if l.Op != OpARMANDshiftRA {
20421 break
20422 }
20423 c := auxIntToInt32(l.AuxInt)
20424 y := l.Args[1]
20425 x := l.Args[0]
20426 if !(l.Uses == 1) {
20427 break
20428 }
20429 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags)
20430 v0.AuxInt = int32ToAuxInt(c)
20431 v0.AddArg2(x, y)
20432 b.resetWithControl(BlockARMLTnoov, v0)
20433 return true
20434 }
20435
20436
20437
20438 for b.Controls[0].Op == OpARMCMPconst {
20439 v_0 := b.Controls[0]
20440 if auxIntToInt32(v_0.AuxInt) != 0 {
20441 break
20442 }
20443 l := v_0.Args[0]
20444 if l.Op != OpARMANDshiftLLreg {
20445 break
20446 }
20447 z := l.Args[2]
20448 x := l.Args[0]
20449 y := l.Args[1]
20450 if !(l.Uses == 1) {
20451 break
20452 }
20453 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags)
20454 v0.AddArg3(x, y, z)
20455 b.resetWithControl(BlockARMLTnoov, v0)
20456 return true
20457 }
20458
20459
20460
20461 for b.Controls[0].Op == OpARMCMPconst {
20462 v_0 := b.Controls[0]
20463 if auxIntToInt32(v_0.AuxInt) != 0 {
20464 break
20465 }
20466 l := v_0.Args[0]
20467 if l.Op != OpARMANDshiftRLreg {
20468 break
20469 }
20470 z := l.Args[2]
20471 x := l.Args[0]
20472 y := l.Args[1]
20473 if !(l.Uses == 1) {
20474 break
20475 }
20476 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags)
20477 v0.AddArg3(x, y, z)
20478 b.resetWithControl(BlockARMLTnoov, v0)
20479 return true
20480 }
20481
20482
20483
20484 for b.Controls[0].Op == OpARMCMPconst {
20485 v_0 := b.Controls[0]
20486 if auxIntToInt32(v_0.AuxInt) != 0 {
20487 break
20488 }
20489 l := v_0.Args[0]
20490 if l.Op != OpARMANDshiftRAreg {
20491 break
20492 }
20493 z := l.Args[2]
20494 x := l.Args[0]
20495 y := l.Args[1]
20496 if !(l.Uses == 1) {
20497 break
20498 }
20499 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags)
20500 v0.AddArg3(x, y, z)
20501 b.resetWithControl(BlockARMLTnoov, v0)
20502 return true
20503 }
20504
20505
20506
20507 for b.Controls[0].Op == OpARMCMPconst {
20508 v_0 := b.Controls[0]
20509 if auxIntToInt32(v_0.AuxInt) != 0 {
20510 break
20511 }
20512 l := v_0.Args[0]
20513 if l.Op != OpARMXOR {
20514 break
20515 }
20516 _ = l.Args[1]
20517 l_0 := l.Args[0]
20518 l_1 := l.Args[1]
20519 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
20520 x := l_0
20521 y := l_1
20522 if !(l.Uses == 1) {
20523 continue
20524 }
20525 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags)
20526 v0.AddArg2(x, y)
20527 b.resetWithControl(BlockARMLTnoov, v0)
20528 return true
20529 }
20530 break
20531 }
20532
20533
20534
20535 for b.Controls[0].Op == OpARMCMPconst {
20536 v_0 := b.Controls[0]
20537 if auxIntToInt32(v_0.AuxInt) != 0 {
20538 break
20539 }
20540 l := v_0.Args[0]
20541 if l.Op != OpARMXORconst {
20542 break
20543 }
20544 c := auxIntToInt32(l.AuxInt)
20545 x := l.Args[0]
20546 if !(l.Uses == 1) {
20547 break
20548 }
20549 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags)
20550 v0.AuxInt = int32ToAuxInt(c)
20551 v0.AddArg(x)
20552 b.resetWithControl(BlockARMLTnoov, v0)
20553 return true
20554 }
20555
20556
20557
20558 for b.Controls[0].Op == OpARMCMPconst {
20559 v_0 := b.Controls[0]
20560 if auxIntToInt32(v_0.AuxInt) != 0 {
20561 break
20562 }
20563 l := v_0.Args[0]
20564 if l.Op != OpARMXORshiftLL {
20565 break
20566 }
20567 c := auxIntToInt32(l.AuxInt)
20568 y := l.Args[1]
20569 x := l.Args[0]
20570 if !(l.Uses == 1) {
20571 break
20572 }
20573 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags)
20574 v0.AuxInt = int32ToAuxInt(c)
20575 v0.AddArg2(x, y)
20576 b.resetWithControl(BlockARMLTnoov, v0)
20577 return true
20578 }
20579
20580
20581
20582 for b.Controls[0].Op == OpARMCMPconst {
20583 v_0 := b.Controls[0]
20584 if auxIntToInt32(v_0.AuxInt) != 0 {
20585 break
20586 }
20587 l := v_0.Args[0]
20588 if l.Op != OpARMXORshiftRL {
20589 break
20590 }
20591 c := auxIntToInt32(l.AuxInt)
20592 y := l.Args[1]
20593 x := l.Args[0]
20594 if !(l.Uses == 1) {
20595 break
20596 }
20597 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags)
20598 v0.AuxInt = int32ToAuxInt(c)
20599 v0.AddArg2(x, y)
20600 b.resetWithControl(BlockARMLTnoov, v0)
20601 return true
20602 }
20603
20604
20605
20606 for b.Controls[0].Op == OpARMCMPconst {
20607 v_0 := b.Controls[0]
20608 if auxIntToInt32(v_0.AuxInt) != 0 {
20609 break
20610 }
20611 l := v_0.Args[0]
20612 if l.Op != OpARMXORshiftRA {
20613 break
20614 }
20615 c := auxIntToInt32(l.AuxInt)
20616 y := l.Args[1]
20617 x := l.Args[0]
20618 if !(l.Uses == 1) {
20619 break
20620 }
20621 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags)
20622 v0.AuxInt = int32ToAuxInt(c)
20623 v0.AddArg2(x, y)
20624 b.resetWithControl(BlockARMLTnoov, v0)
20625 return true
20626 }
20627
20628
20629
20630 for b.Controls[0].Op == OpARMCMPconst {
20631 v_0 := b.Controls[0]
20632 if auxIntToInt32(v_0.AuxInt) != 0 {
20633 break
20634 }
20635 l := v_0.Args[0]
20636 if l.Op != OpARMXORshiftLLreg {
20637 break
20638 }
20639 z := l.Args[2]
20640 x := l.Args[0]
20641 y := l.Args[1]
20642 if !(l.Uses == 1) {
20643 break
20644 }
20645 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags)
20646 v0.AddArg3(x, y, z)
20647 b.resetWithControl(BlockARMLTnoov, v0)
20648 return true
20649 }
20650
20651
20652
20653 for b.Controls[0].Op == OpARMCMPconst {
20654 v_0 := b.Controls[0]
20655 if auxIntToInt32(v_0.AuxInt) != 0 {
20656 break
20657 }
20658 l := v_0.Args[0]
20659 if l.Op != OpARMXORshiftRLreg {
20660 break
20661 }
20662 z := l.Args[2]
20663 x := l.Args[0]
20664 y := l.Args[1]
20665 if !(l.Uses == 1) {
20666 break
20667 }
20668 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags)
20669 v0.AddArg3(x, y, z)
20670 b.resetWithControl(BlockARMLTnoov, v0)
20671 return true
20672 }
20673
20674
20675
20676 for b.Controls[0].Op == OpARMCMPconst {
20677 v_0 := b.Controls[0]
20678 if auxIntToInt32(v_0.AuxInt) != 0 {
20679 break
20680 }
20681 l := v_0.Args[0]
20682 if l.Op != OpARMXORshiftRAreg {
20683 break
20684 }
20685 z := l.Args[2]
20686 x := l.Args[0]
20687 y := l.Args[1]
20688 if !(l.Uses == 1) {
20689 break
20690 }
20691 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags)
20692 v0.AddArg3(x, y, z)
20693 b.resetWithControl(BlockARMLTnoov, v0)
20694 return true
20695 }
20696 case BlockARMLTnoov:
20697
20698
20699
20700 for b.Controls[0].Op == OpARMFlagConstant {
20701 v_0 := b.Controls[0]
20702 fc := auxIntToFlagConstant(v_0.AuxInt)
20703 if !(fc.ltNoov()) {
20704 break
20705 }
20706 b.Reset(BlockFirst)
20707 return true
20708 }
20709
20710
20711
20712 for b.Controls[0].Op == OpARMFlagConstant {
20713 v_0 := b.Controls[0]
20714 fc := auxIntToFlagConstant(v_0.AuxInt)
20715 if !(!fc.ltNoov()) {
20716 break
20717 }
20718 b.Reset(BlockFirst)
20719 b.swapSuccessors()
20720 return true
20721 }
20722
20723
20724 for b.Controls[0].Op == OpARMInvertFlags {
20725 v_0 := b.Controls[0]
20726 cmp := v_0.Args[0]
20727 b.resetWithControl(BlockARMGTnoov, cmp)
20728 return true
20729 }
20730 case BlockARMNE:
20731
20732
20733 for b.Controls[0].Op == OpARMCMPconst {
20734 v_0 := b.Controls[0]
20735 if auxIntToInt32(v_0.AuxInt) != 0 {
20736 break
20737 }
20738 v_0_0 := v_0.Args[0]
20739 if v_0_0.Op != OpARMEqual {
20740 break
20741 }
20742 cc := v_0_0.Args[0]
20743 b.resetWithControl(BlockARMEQ, cc)
20744 return true
20745 }
20746
20747
20748 for b.Controls[0].Op == OpARMCMPconst {
20749 v_0 := b.Controls[0]
20750 if auxIntToInt32(v_0.AuxInt) != 0 {
20751 break
20752 }
20753 v_0_0 := v_0.Args[0]
20754 if v_0_0.Op != OpARMNotEqual {
20755 break
20756 }
20757 cc := v_0_0.Args[0]
20758 b.resetWithControl(BlockARMNE, cc)
20759 return true
20760 }
20761
20762
20763 for b.Controls[0].Op == OpARMCMPconst {
20764 v_0 := b.Controls[0]
20765 if auxIntToInt32(v_0.AuxInt) != 0 {
20766 break
20767 }
20768 v_0_0 := v_0.Args[0]
20769 if v_0_0.Op != OpARMLessThan {
20770 break
20771 }
20772 cc := v_0_0.Args[0]
20773 b.resetWithControl(BlockARMLT, cc)
20774 return true
20775 }
20776
20777
20778 for b.Controls[0].Op == OpARMCMPconst {
20779 v_0 := b.Controls[0]
20780 if auxIntToInt32(v_0.AuxInt) != 0 {
20781 break
20782 }
20783 v_0_0 := v_0.Args[0]
20784 if v_0_0.Op != OpARMLessThanU {
20785 break
20786 }
20787 cc := v_0_0.Args[0]
20788 b.resetWithControl(BlockARMULT, cc)
20789 return true
20790 }
20791
20792
20793 for b.Controls[0].Op == OpARMCMPconst {
20794 v_0 := b.Controls[0]
20795 if auxIntToInt32(v_0.AuxInt) != 0 {
20796 break
20797 }
20798 v_0_0 := v_0.Args[0]
20799 if v_0_0.Op != OpARMLessEqual {
20800 break
20801 }
20802 cc := v_0_0.Args[0]
20803 b.resetWithControl(BlockARMLE, cc)
20804 return true
20805 }
20806
20807
20808 for b.Controls[0].Op == OpARMCMPconst {
20809 v_0 := b.Controls[0]
20810 if auxIntToInt32(v_0.AuxInt) != 0 {
20811 break
20812 }
20813 v_0_0 := v_0.Args[0]
20814 if v_0_0.Op != OpARMLessEqualU {
20815 break
20816 }
20817 cc := v_0_0.Args[0]
20818 b.resetWithControl(BlockARMULE, cc)
20819 return true
20820 }
20821
20822
20823 for b.Controls[0].Op == OpARMCMPconst {
20824 v_0 := b.Controls[0]
20825 if auxIntToInt32(v_0.AuxInt) != 0 {
20826 break
20827 }
20828 v_0_0 := v_0.Args[0]
20829 if v_0_0.Op != OpARMGreaterThan {
20830 break
20831 }
20832 cc := v_0_0.Args[0]
20833 b.resetWithControl(BlockARMGT, cc)
20834 return true
20835 }
20836
20837
20838 for b.Controls[0].Op == OpARMCMPconst {
20839 v_0 := b.Controls[0]
20840 if auxIntToInt32(v_0.AuxInt) != 0 {
20841 break
20842 }
20843 v_0_0 := v_0.Args[0]
20844 if v_0_0.Op != OpARMGreaterThanU {
20845 break
20846 }
20847 cc := v_0_0.Args[0]
20848 b.resetWithControl(BlockARMUGT, cc)
20849 return true
20850 }
20851
20852
20853 for b.Controls[0].Op == OpARMCMPconst {
20854 v_0 := b.Controls[0]
20855 if auxIntToInt32(v_0.AuxInt) != 0 {
20856 break
20857 }
20858 v_0_0 := v_0.Args[0]
20859 if v_0_0.Op != OpARMGreaterEqual {
20860 break
20861 }
20862 cc := v_0_0.Args[0]
20863 b.resetWithControl(BlockARMGE, cc)
20864 return true
20865 }
20866
20867
20868 for b.Controls[0].Op == OpARMCMPconst {
20869 v_0 := b.Controls[0]
20870 if auxIntToInt32(v_0.AuxInt) != 0 {
20871 break
20872 }
20873 v_0_0 := v_0.Args[0]
20874 if v_0_0.Op != OpARMGreaterEqualU {
20875 break
20876 }
20877 cc := v_0_0.Args[0]
20878 b.resetWithControl(BlockARMUGE, cc)
20879 return true
20880 }
20881
20882
20883
20884 for b.Controls[0].Op == OpARMFlagConstant {
20885 v_0 := b.Controls[0]
20886 fc := auxIntToFlagConstant(v_0.AuxInt)
20887 if !(fc.ne()) {
20888 break
20889 }
20890 b.Reset(BlockFirst)
20891 return true
20892 }
20893
20894
20895
20896 for b.Controls[0].Op == OpARMFlagConstant {
20897 v_0 := b.Controls[0]
20898 fc := auxIntToFlagConstant(v_0.AuxInt)
20899 if !(!fc.ne()) {
20900 break
20901 }
20902 b.Reset(BlockFirst)
20903 b.swapSuccessors()
20904 return true
20905 }
20906
20907
20908 for b.Controls[0].Op == OpARMInvertFlags {
20909 v_0 := b.Controls[0]
20910 cmp := v_0.Args[0]
20911 b.resetWithControl(BlockARMNE, cmp)
20912 return true
20913 }
20914
20915
20916 for b.Controls[0].Op == OpARMCMP {
20917 v_0 := b.Controls[0]
20918 _ = v_0.Args[1]
20919 x := v_0.Args[0]
20920 v_0_1 := v_0.Args[1]
20921 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 {
20922 break
20923 }
20924 y := v_0_1.Args[0]
20925 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
20926 v0.AddArg2(x, y)
20927 b.resetWithControl(BlockARMNE, v0)
20928 return true
20929 }
20930
20931
20932 for b.Controls[0].Op == OpARMCMN {
20933 v_0 := b.Controls[0]
20934 _ = v_0.Args[1]
20935 v_0_0 := v_0.Args[0]
20936 v_0_1 := v_0.Args[1]
20937 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
20938 x := v_0_0
20939 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 {
20940 continue
20941 }
20942 y := v_0_1.Args[0]
20943 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
20944 v0.AddArg2(x, y)
20945 b.resetWithControl(BlockARMNE, v0)
20946 return true
20947 }
20948 break
20949 }
20950
20951
20952
20953 for b.Controls[0].Op == OpARMCMPconst {
20954 v_0 := b.Controls[0]
20955 if auxIntToInt32(v_0.AuxInt) != 0 {
20956 break
20957 }
20958 l := v_0.Args[0]
20959 if l.Op != OpARMSUB {
20960 break
20961 }
20962 y := l.Args[1]
20963 x := l.Args[0]
20964 if !(l.Uses == 1) {
20965 break
20966 }
20967 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
20968 v0.AddArg2(x, y)
20969 b.resetWithControl(BlockARMNE, v0)
20970 return true
20971 }
20972
20973
20974
20975 for b.Controls[0].Op == OpARMCMPconst {
20976 v_0 := b.Controls[0]
20977 if auxIntToInt32(v_0.AuxInt) != 0 {
20978 break
20979 }
20980 l := v_0.Args[0]
20981 if l.Op != OpARMMULS {
20982 break
20983 }
20984 a := l.Args[2]
20985 x := l.Args[0]
20986 y := l.Args[1]
20987 if !(l.Uses == 1) {
20988 break
20989 }
20990 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
20991 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
20992 v1.AddArg2(x, y)
20993 v0.AddArg2(a, v1)
20994 b.resetWithControl(BlockARMNE, v0)
20995 return true
20996 }
20997
20998
20999
21000 for b.Controls[0].Op == OpARMCMPconst {
21001 v_0 := b.Controls[0]
21002 if auxIntToInt32(v_0.AuxInt) != 0 {
21003 break
21004 }
21005 l := v_0.Args[0]
21006 if l.Op != OpARMSUBconst {
21007 break
21008 }
21009 c := auxIntToInt32(l.AuxInt)
21010 x := l.Args[0]
21011 if !(l.Uses == 1) {
21012 break
21013 }
21014 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags)
21015 v0.AuxInt = int32ToAuxInt(c)
21016 v0.AddArg(x)
21017 b.resetWithControl(BlockARMNE, v0)
21018 return true
21019 }
21020
21021
21022
21023 for b.Controls[0].Op == OpARMCMPconst {
21024 v_0 := b.Controls[0]
21025 if auxIntToInt32(v_0.AuxInt) != 0 {
21026 break
21027 }
21028 l := v_0.Args[0]
21029 if l.Op != OpARMSUBshiftLL {
21030 break
21031 }
21032 c := auxIntToInt32(l.AuxInt)
21033 y := l.Args[1]
21034 x := l.Args[0]
21035 if !(l.Uses == 1) {
21036 break
21037 }
21038 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags)
21039 v0.AuxInt = int32ToAuxInt(c)
21040 v0.AddArg2(x, y)
21041 b.resetWithControl(BlockARMNE, v0)
21042 return true
21043 }
21044
21045
21046
21047 for b.Controls[0].Op == OpARMCMPconst {
21048 v_0 := b.Controls[0]
21049 if auxIntToInt32(v_0.AuxInt) != 0 {
21050 break
21051 }
21052 l := v_0.Args[0]
21053 if l.Op != OpARMSUBshiftRL {
21054 break
21055 }
21056 c := auxIntToInt32(l.AuxInt)
21057 y := l.Args[1]
21058 x := l.Args[0]
21059 if !(l.Uses == 1) {
21060 break
21061 }
21062 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags)
21063 v0.AuxInt = int32ToAuxInt(c)
21064 v0.AddArg2(x, y)
21065 b.resetWithControl(BlockARMNE, v0)
21066 return true
21067 }
21068
21069
21070
21071 for b.Controls[0].Op == OpARMCMPconst {
21072 v_0 := b.Controls[0]
21073 if auxIntToInt32(v_0.AuxInt) != 0 {
21074 break
21075 }
21076 l := v_0.Args[0]
21077 if l.Op != OpARMSUBshiftRA {
21078 break
21079 }
21080 c := auxIntToInt32(l.AuxInt)
21081 y := l.Args[1]
21082 x := l.Args[0]
21083 if !(l.Uses == 1) {
21084 break
21085 }
21086 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags)
21087 v0.AuxInt = int32ToAuxInt(c)
21088 v0.AddArg2(x, y)
21089 b.resetWithControl(BlockARMNE, v0)
21090 return true
21091 }
21092
21093
21094
21095 for b.Controls[0].Op == OpARMCMPconst {
21096 v_0 := b.Controls[0]
21097 if auxIntToInt32(v_0.AuxInt) != 0 {
21098 break
21099 }
21100 l := v_0.Args[0]
21101 if l.Op != OpARMSUBshiftLLreg {
21102 break
21103 }
21104 z := l.Args[2]
21105 x := l.Args[0]
21106 y := l.Args[1]
21107 if !(l.Uses == 1) {
21108 break
21109 }
21110 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
21111 v0.AddArg3(x, y, z)
21112 b.resetWithControl(BlockARMNE, v0)
21113 return true
21114 }
21115
21116
21117
21118 for b.Controls[0].Op == OpARMCMPconst {
21119 v_0 := b.Controls[0]
21120 if auxIntToInt32(v_0.AuxInt) != 0 {
21121 break
21122 }
21123 l := v_0.Args[0]
21124 if l.Op != OpARMSUBshiftRLreg {
21125 break
21126 }
21127 z := l.Args[2]
21128 x := l.Args[0]
21129 y := l.Args[1]
21130 if !(l.Uses == 1) {
21131 break
21132 }
21133 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
21134 v0.AddArg3(x, y, z)
21135 b.resetWithControl(BlockARMNE, v0)
21136 return true
21137 }
21138
21139
21140
21141 for b.Controls[0].Op == OpARMCMPconst {
21142 v_0 := b.Controls[0]
21143 if auxIntToInt32(v_0.AuxInt) != 0 {
21144 break
21145 }
21146 l := v_0.Args[0]
21147 if l.Op != OpARMSUBshiftRAreg {
21148 break
21149 }
21150 z := l.Args[2]
21151 x := l.Args[0]
21152 y := l.Args[1]
21153 if !(l.Uses == 1) {
21154 break
21155 }
21156 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
21157 v0.AddArg3(x, y, z)
21158 b.resetWithControl(BlockARMNE, v0)
21159 return true
21160 }
21161
21162
21163
21164 for b.Controls[0].Op == OpARMCMPconst {
21165 v_0 := b.Controls[0]
21166 if auxIntToInt32(v_0.AuxInt) != 0 {
21167 break
21168 }
21169 l := v_0.Args[0]
21170 if l.Op != OpARMADD {
21171 break
21172 }
21173 _ = l.Args[1]
21174 l_0 := l.Args[0]
21175 l_1 := l.Args[1]
21176 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
21177 x := l_0
21178 y := l_1
21179 if !(l.Uses == 1) {
21180 continue
21181 }
21182 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
21183 v0.AddArg2(x, y)
21184 b.resetWithControl(BlockARMNE, v0)
21185 return true
21186 }
21187 break
21188 }
21189
21190
21191
21192 for b.Controls[0].Op == OpARMCMPconst {
21193 v_0 := b.Controls[0]
21194 if auxIntToInt32(v_0.AuxInt) != 0 {
21195 break
21196 }
21197 l := v_0.Args[0]
21198 if l.Op != OpARMMULA {
21199 break
21200 }
21201 a := l.Args[2]
21202 x := l.Args[0]
21203 y := l.Args[1]
21204 if !(l.Uses == 1) {
21205 break
21206 }
21207 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
21208 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
21209 v1.AddArg2(x, y)
21210 v0.AddArg2(a, v1)
21211 b.resetWithControl(BlockARMNE, v0)
21212 return true
21213 }
21214
21215
21216
21217 for b.Controls[0].Op == OpARMCMPconst {
21218 v_0 := b.Controls[0]
21219 if auxIntToInt32(v_0.AuxInt) != 0 {
21220 break
21221 }
21222 l := v_0.Args[0]
21223 if l.Op != OpARMADDconst {
21224 break
21225 }
21226 c := auxIntToInt32(l.AuxInt)
21227 x := l.Args[0]
21228 if !(l.Uses == 1) {
21229 break
21230 }
21231 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags)
21232 v0.AuxInt = int32ToAuxInt(c)
21233 v0.AddArg(x)
21234 b.resetWithControl(BlockARMNE, v0)
21235 return true
21236 }
21237
21238
21239
21240 for b.Controls[0].Op == OpARMCMPconst {
21241 v_0 := b.Controls[0]
21242 if auxIntToInt32(v_0.AuxInt) != 0 {
21243 break
21244 }
21245 l := v_0.Args[0]
21246 if l.Op != OpARMADDshiftLL {
21247 break
21248 }
21249 c := auxIntToInt32(l.AuxInt)
21250 y := l.Args[1]
21251 x := l.Args[0]
21252 if !(l.Uses == 1) {
21253 break
21254 }
21255 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags)
21256 v0.AuxInt = int32ToAuxInt(c)
21257 v0.AddArg2(x, y)
21258 b.resetWithControl(BlockARMNE, v0)
21259 return true
21260 }
21261
21262
21263
21264 for b.Controls[0].Op == OpARMCMPconst {
21265 v_0 := b.Controls[0]
21266 if auxIntToInt32(v_0.AuxInt) != 0 {
21267 break
21268 }
21269 l := v_0.Args[0]
21270 if l.Op != OpARMADDshiftRL {
21271 break
21272 }
21273 c := auxIntToInt32(l.AuxInt)
21274 y := l.Args[1]
21275 x := l.Args[0]
21276 if !(l.Uses == 1) {
21277 break
21278 }
21279 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags)
21280 v0.AuxInt = int32ToAuxInt(c)
21281 v0.AddArg2(x, y)
21282 b.resetWithControl(BlockARMNE, v0)
21283 return true
21284 }
21285
21286
21287
21288 for b.Controls[0].Op == OpARMCMPconst {
21289 v_0 := b.Controls[0]
21290 if auxIntToInt32(v_0.AuxInt) != 0 {
21291 break
21292 }
21293 l := v_0.Args[0]
21294 if l.Op != OpARMADDshiftRA {
21295 break
21296 }
21297 c := auxIntToInt32(l.AuxInt)
21298 y := l.Args[1]
21299 x := l.Args[0]
21300 if !(l.Uses == 1) {
21301 break
21302 }
21303 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags)
21304 v0.AuxInt = int32ToAuxInt(c)
21305 v0.AddArg2(x, y)
21306 b.resetWithControl(BlockARMNE, v0)
21307 return true
21308 }
21309
21310
21311
21312 for b.Controls[0].Op == OpARMCMPconst {
21313 v_0 := b.Controls[0]
21314 if auxIntToInt32(v_0.AuxInt) != 0 {
21315 break
21316 }
21317 l := v_0.Args[0]
21318 if l.Op != OpARMADDshiftLLreg {
21319 break
21320 }
21321 z := l.Args[2]
21322 x := l.Args[0]
21323 y := l.Args[1]
21324 if !(l.Uses == 1) {
21325 break
21326 }
21327 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags)
21328 v0.AddArg3(x, y, z)
21329 b.resetWithControl(BlockARMNE, v0)
21330 return true
21331 }
21332
21333
21334
21335 for b.Controls[0].Op == OpARMCMPconst {
21336 v_0 := b.Controls[0]
21337 if auxIntToInt32(v_0.AuxInt) != 0 {
21338 break
21339 }
21340 l := v_0.Args[0]
21341 if l.Op != OpARMADDshiftRLreg {
21342 break
21343 }
21344 z := l.Args[2]
21345 x := l.Args[0]
21346 y := l.Args[1]
21347 if !(l.Uses == 1) {
21348 break
21349 }
21350 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags)
21351 v0.AddArg3(x, y, z)
21352 b.resetWithControl(BlockARMNE, v0)
21353 return true
21354 }
21355
21356
21357
21358 for b.Controls[0].Op == OpARMCMPconst {
21359 v_0 := b.Controls[0]
21360 if auxIntToInt32(v_0.AuxInt) != 0 {
21361 break
21362 }
21363 l := v_0.Args[0]
21364 if l.Op != OpARMADDshiftRAreg {
21365 break
21366 }
21367 z := l.Args[2]
21368 x := l.Args[0]
21369 y := l.Args[1]
21370 if !(l.Uses == 1) {
21371 break
21372 }
21373 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags)
21374 v0.AddArg3(x, y, z)
21375 b.resetWithControl(BlockARMNE, v0)
21376 return true
21377 }
21378
21379
21380
21381 for b.Controls[0].Op == OpARMCMPconst {
21382 v_0 := b.Controls[0]
21383 if auxIntToInt32(v_0.AuxInt) != 0 {
21384 break
21385 }
21386 l := v_0.Args[0]
21387 if l.Op != OpARMAND {
21388 break
21389 }
21390 _ = l.Args[1]
21391 l_0 := l.Args[0]
21392 l_1 := l.Args[1]
21393 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
21394 x := l_0
21395 y := l_1
21396 if !(l.Uses == 1) {
21397 continue
21398 }
21399 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags)
21400 v0.AddArg2(x, y)
21401 b.resetWithControl(BlockARMNE, v0)
21402 return true
21403 }
21404 break
21405 }
21406
21407
21408
21409 for b.Controls[0].Op == OpARMCMPconst {
21410 v_0 := b.Controls[0]
21411 if auxIntToInt32(v_0.AuxInt) != 0 {
21412 break
21413 }
21414 l := v_0.Args[0]
21415 if l.Op != OpARMANDconst {
21416 break
21417 }
21418 c := auxIntToInt32(l.AuxInt)
21419 x := l.Args[0]
21420 if !(l.Uses == 1) {
21421 break
21422 }
21423 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags)
21424 v0.AuxInt = int32ToAuxInt(c)
21425 v0.AddArg(x)
21426 b.resetWithControl(BlockARMNE, v0)
21427 return true
21428 }
21429
21430
21431
21432 for b.Controls[0].Op == OpARMCMPconst {
21433 v_0 := b.Controls[0]
21434 if auxIntToInt32(v_0.AuxInt) != 0 {
21435 break
21436 }
21437 l := v_0.Args[0]
21438 if l.Op != OpARMANDshiftLL {
21439 break
21440 }
21441 c := auxIntToInt32(l.AuxInt)
21442 y := l.Args[1]
21443 x := l.Args[0]
21444 if !(l.Uses == 1) {
21445 break
21446 }
21447 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags)
21448 v0.AuxInt = int32ToAuxInt(c)
21449 v0.AddArg2(x, y)
21450 b.resetWithControl(BlockARMNE, v0)
21451 return true
21452 }
21453
21454
21455
21456 for b.Controls[0].Op == OpARMCMPconst {
21457 v_0 := b.Controls[0]
21458 if auxIntToInt32(v_0.AuxInt) != 0 {
21459 break
21460 }
21461 l := v_0.Args[0]
21462 if l.Op != OpARMANDshiftRL {
21463 break
21464 }
21465 c := auxIntToInt32(l.AuxInt)
21466 y := l.Args[1]
21467 x := l.Args[0]
21468 if !(l.Uses == 1) {
21469 break
21470 }
21471 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags)
21472 v0.AuxInt = int32ToAuxInt(c)
21473 v0.AddArg2(x, y)
21474 b.resetWithControl(BlockARMNE, v0)
21475 return true
21476 }
21477
21478
21479
21480 for b.Controls[0].Op == OpARMCMPconst {
21481 v_0 := b.Controls[0]
21482 if auxIntToInt32(v_0.AuxInt) != 0 {
21483 break
21484 }
21485 l := v_0.Args[0]
21486 if l.Op != OpARMANDshiftRA {
21487 break
21488 }
21489 c := auxIntToInt32(l.AuxInt)
21490 y := l.Args[1]
21491 x := l.Args[0]
21492 if !(l.Uses == 1) {
21493 break
21494 }
21495 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags)
21496 v0.AuxInt = int32ToAuxInt(c)
21497 v0.AddArg2(x, y)
21498 b.resetWithControl(BlockARMNE, v0)
21499 return true
21500 }
21501
21502
21503
21504 for b.Controls[0].Op == OpARMCMPconst {
21505 v_0 := b.Controls[0]
21506 if auxIntToInt32(v_0.AuxInt) != 0 {
21507 break
21508 }
21509 l := v_0.Args[0]
21510 if l.Op != OpARMANDshiftLLreg {
21511 break
21512 }
21513 z := l.Args[2]
21514 x := l.Args[0]
21515 y := l.Args[1]
21516 if !(l.Uses == 1) {
21517 break
21518 }
21519 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags)
21520 v0.AddArg3(x, y, z)
21521 b.resetWithControl(BlockARMNE, v0)
21522 return true
21523 }
21524
21525
21526
21527 for b.Controls[0].Op == OpARMCMPconst {
21528 v_0 := b.Controls[0]
21529 if auxIntToInt32(v_0.AuxInt) != 0 {
21530 break
21531 }
21532 l := v_0.Args[0]
21533 if l.Op != OpARMANDshiftRLreg {
21534 break
21535 }
21536 z := l.Args[2]
21537 x := l.Args[0]
21538 y := l.Args[1]
21539 if !(l.Uses == 1) {
21540 break
21541 }
21542 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags)
21543 v0.AddArg3(x, y, z)
21544 b.resetWithControl(BlockARMNE, v0)
21545 return true
21546 }
21547
21548
21549
21550 for b.Controls[0].Op == OpARMCMPconst {
21551 v_0 := b.Controls[0]
21552 if auxIntToInt32(v_0.AuxInt) != 0 {
21553 break
21554 }
21555 l := v_0.Args[0]
21556 if l.Op != OpARMANDshiftRAreg {
21557 break
21558 }
21559 z := l.Args[2]
21560 x := l.Args[0]
21561 y := l.Args[1]
21562 if !(l.Uses == 1) {
21563 break
21564 }
21565 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags)
21566 v0.AddArg3(x, y, z)
21567 b.resetWithControl(BlockARMNE, v0)
21568 return true
21569 }
21570
21571
21572
21573 for b.Controls[0].Op == OpARMCMPconst {
21574 v_0 := b.Controls[0]
21575 if auxIntToInt32(v_0.AuxInt) != 0 {
21576 break
21577 }
21578 l := v_0.Args[0]
21579 if l.Op != OpARMXOR {
21580 break
21581 }
21582 _ = l.Args[1]
21583 l_0 := l.Args[0]
21584 l_1 := l.Args[1]
21585 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
21586 x := l_0
21587 y := l_1
21588 if !(l.Uses == 1) {
21589 continue
21590 }
21591 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags)
21592 v0.AddArg2(x, y)
21593 b.resetWithControl(BlockARMNE, v0)
21594 return true
21595 }
21596 break
21597 }
21598
21599
21600
21601 for b.Controls[0].Op == OpARMCMPconst {
21602 v_0 := b.Controls[0]
21603 if auxIntToInt32(v_0.AuxInt) != 0 {
21604 break
21605 }
21606 l := v_0.Args[0]
21607 if l.Op != OpARMXORconst {
21608 break
21609 }
21610 c := auxIntToInt32(l.AuxInt)
21611 x := l.Args[0]
21612 if !(l.Uses == 1) {
21613 break
21614 }
21615 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags)
21616 v0.AuxInt = int32ToAuxInt(c)
21617 v0.AddArg(x)
21618 b.resetWithControl(BlockARMNE, v0)
21619 return true
21620 }
21621
21622
21623
21624 for b.Controls[0].Op == OpARMCMPconst {
21625 v_0 := b.Controls[0]
21626 if auxIntToInt32(v_0.AuxInt) != 0 {
21627 break
21628 }
21629 l := v_0.Args[0]
21630 if l.Op != OpARMXORshiftLL {
21631 break
21632 }
21633 c := auxIntToInt32(l.AuxInt)
21634 y := l.Args[1]
21635 x := l.Args[0]
21636 if !(l.Uses == 1) {
21637 break
21638 }
21639 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags)
21640 v0.AuxInt = int32ToAuxInt(c)
21641 v0.AddArg2(x, y)
21642 b.resetWithControl(BlockARMNE, v0)
21643 return true
21644 }
21645
21646
21647
21648 for b.Controls[0].Op == OpARMCMPconst {
21649 v_0 := b.Controls[0]
21650 if auxIntToInt32(v_0.AuxInt) != 0 {
21651 break
21652 }
21653 l := v_0.Args[0]
21654 if l.Op != OpARMXORshiftRL {
21655 break
21656 }
21657 c := auxIntToInt32(l.AuxInt)
21658 y := l.Args[1]
21659 x := l.Args[0]
21660 if !(l.Uses == 1) {
21661 break
21662 }
21663 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags)
21664 v0.AuxInt = int32ToAuxInt(c)
21665 v0.AddArg2(x, y)
21666 b.resetWithControl(BlockARMNE, v0)
21667 return true
21668 }
21669
21670
21671
21672 for b.Controls[0].Op == OpARMCMPconst {
21673 v_0 := b.Controls[0]
21674 if auxIntToInt32(v_0.AuxInt) != 0 {
21675 break
21676 }
21677 l := v_0.Args[0]
21678 if l.Op != OpARMXORshiftRA {
21679 break
21680 }
21681 c := auxIntToInt32(l.AuxInt)
21682 y := l.Args[1]
21683 x := l.Args[0]
21684 if !(l.Uses == 1) {
21685 break
21686 }
21687 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags)
21688 v0.AuxInt = int32ToAuxInt(c)
21689 v0.AddArg2(x, y)
21690 b.resetWithControl(BlockARMNE, v0)
21691 return true
21692 }
21693
21694
21695
21696 for b.Controls[0].Op == OpARMCMPconst {
21697 v_0 := b.Controls[0]
21698 if auxIntToInt32(v_0.AuxInt) != 0 {
21699 break
21700 }
21701 l := v_0.Args[0]
21702 if l.Op != OpARMXORshiftLLreg {
21703 break
21704 }
21705 z := l.Args[2]
21706 x := l.Args[0]
21707 y := l.Args[1]
21708 if !(l.Uses == 1) {
21709 break
21710 }
21711 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags)
21712 v0.AddArg3(x, y, z)
21713 b.resetWithControl(BlockARMNE, v0)
21714 return true
21715 }
21716
21717
21718
21719 for b.Controls[0].Op == OpARMCMPconst {
21720 v_0 := b.Controls[0]
21721 if auxIntToInt32(v_0.AuxInt) != 0 {
21722 break
21723 }
21724 l := v_0.Args[0]
21725 if l.Op != OpARMXORshiftRLreg {
21726 break
21727 }
21728 z := l.Args[2]
21729 x := l.Args[0]
21730 y := l.Args[1]
21731 if !(l.Uses == 1) {
21732 break
21733 }
21734 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags)
21735 v0.AddArg3(x, y, z)
21736 b.resetWithControl(BlockARMNE, v0)
21737 return true
21738 }
21739
21740
21741
21742 for b.Controls[0].Op == OpARMCMPconst {
21743 v_0 := b.Controls[0]
21744 if auxIntToInt32(v_0.AuxInt) != 0 {
21745 break
21746 }
21747 l := v_0.Args[0]
21748 if l.Op != OpARMXORshiftRAreg {
21749 break
21750 }
21751 z := l.Args[2]
21752 x := l.Args[0]
21753 y := l.Args[1]
21754 if !(l.Uses == 1) {
21755 break
21756 }
21757 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags)
21758 v0.AddArg3(x, y, z)
21759 b.resetWithControl(BlockARMNE, v0)
21760 return true
21761 }
21762 case BlockARMUGE:
21763
21764
21765
21766 for b.Controls[0].Op == OpARMFlagConstant {
21767 v_0 := b.Controls[0]
21768 fc := auxIntToFlagConstant(v_0.AuxInt)
21769 if !(fc.uge()) {
21770 break
21771 }
21772 b.Reset(BlockFirst)
21773 return true
21774 }
21775
21776
21777
21778 for b.Controls[0].Op == OpARMFlagConstant {
21779 v_0 := b.Controls[0]
21780 fc := auxIntToFlagConstant(v_0.AuxInt)
21781 if !(!fc.uge()) {
21782 break
21783 }
21784 b.Reset(BlockFirst)
21785 b.swapSuccessors()
21786 return true
21787 }
21788
21789
21790 for b.Controls[0].Op == OpARMInvertFlags {
21791 v_0 := b.Controls[0]
21792 cmp := v_0.Args[0]
21793 b.resetWithControl(BlockARMULE, cmp)
21794 return true
21795 }
21796 case BlockARMUGT:
21797
21798
21799
21800 for b.Controls[0].Op == OpARMFlagConstant {
21801 v_0 := b.Controls[0]
21802 fc := auxIntToFlagConstant(v_0.AuxInt)
21803 if !(fc.ugt()) {
21804 break
21805 }
21806 b.Reset(BlockFirst)
21807 return true
21808 }
21809
21810
21811
21812 for b.Controls[0].Op == OpARMFlagConstant {
21813 v_0 := b.Controls[0]
21814 fc := auxIntToFlagConstant(v_0.AuxInt)
21815 if !(!fc.ugt()) {
21816 break
21817 }
21818 b.Reset(BlockFirst)
21819 b.swapSuccessors()
21820 return true
21821 }
21822
21823
21824 for b.Controls[0].Op == OpARMInvertFlags {
21825 v_0 := b.Controls[0]
21826 cmp := v_0.Args[0]
21827 b.resetWithControl(BlockARMULT, cmp)
21828 return true
21829 }
21830 case BlockARMULE:
21831
21832
21833
21834 for b.Controls[0].Op == OpARMFlagConstant {
21835 v_0 := b.Controls[0]
21836 fc := auxIntToFlagConstant(v_0.AuxInt)
21837 if !(fc.ule()) {
21838 break
21839 }
21840 b.Reset(BlockFirst)
21841 return true
21842 }
21843
21844
21845
21846 for b.Controls[0].Op == OpARMFlagConstant {
21847 v_0 := b.Controls[0]
21848 fc := auxIntToFlagConstant(v_0.AuxInt)
21849 if !(!fc.ule()) {
21850 break
21851 }
21852 b.Reset(BlockFirst)
21853 b.swapSuccessors()
21854 return true
21855 }
21856
21857
21858 for b.Controls[0].Op == OpARMInvertFlags {
21859 v_0 := b.Controls[0]
21860 cmp := v_0.Args[0]
21861 b.resetWithControl(BlockARMUGE, cmp)
21862 return true
21863 }
21864 case BlockARMULT:
21865
21866
21867
21868 for b.Controls[0].Op == OpARMFlagConstant {
21869 v_0 := b.Controls[0]
21870 fc := auxIntToFlagConstant(v_0.AuxInt)
21871 if !(fc.ult()) {
21872 break
21873 }
21874 b.Reset(BlockFirst)
21875 return true
21876 }
21877
21878
21879
21880 for b.Controls[0].Op == OpARMFlagConstant {
21881 v_0 := b.Controls[0]
21882 fc := auxIntToFlagConstant(v_0.AuxInt)
21883 if !(!fc.ult()) {
21884 break
21885 }
21886 b.Reset(BlockFirst)
21887 b.swapSuccessors()
21888 return true
21889 }
21890
21891
21892 for b.Controls[0].Op == OpARMInvertFlags {
21893 v_0 := b.Controls[0]
21894 cmp := v_0.Args[0]
21895 b.resetWithControl(BlockARMUGT, cmp)
21896 return true
21897 }
21898 }
21899 return false
21900 }
21901
View as plain text