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 OpARMLoweredPanicBoundsRC:
155 return rewriteValueARM_OpARMLoweredPanicBoundsRC(v)
156 case OpARMLoweredPanicBoundsRR:
157 return rewriteValueARM_OpARMLoweredPanicBoundsRR(v)
158 case OpARMLoweredPanicExtendRC:
159 return rewriteValueARM_OpARMLoweredPanicExtendRC(v)
160 case OpARMLoweredPanicExtendRR:
161 return rewriteValueARM_OpARMLoweredPanicExtendRR(v)
162 case OpARMMOVBUload:
163 return rewriteValueARM_OpARMMOVBUload(v)
164 case OpARMMOVBUloadidx:
165 return rewriteValueARM_OpARMMOVBUloadidx(v)
166 case OpARMMOVBUreg:
167 return rewriteValueARM_OpARMMOVBUreg(v)
168 case OpARMMOVBload:
169 return rewriteValueARM_OpARMMOVBload(v)
170 case OpARMMOVBloadidx:
171 return rewriteValueARM_OpARMMOVBloadidx(v)
172 case OpARMMOVBreg:
173 return rewriteValueARM_OpARMMOVBreg(v)
174 case OpARMMOVBstore:
175 return rewriteValueARM_OpARMMOVBstore(v)
176 case OpARMMOVBstoreidx:
177 return rewriteValueARM_OpARMMOVBstoreidx(v)
178 case OpARMMOVDload:
179 return rewriteValueARM_OpARMMOVDload(v)
180 case OpARMMOVDstore:
181 return rewriteValueARM_OpARMMOVDstore(v)
182 case OpARMMOVFload:
183 return rewriteValueARM_OpARMMOVFload(v)
184 case OpARMMOVFstore:
185 return rewriteValueARM_OpARMMOVFstore(v)
186 case OpARMMOVHUload:
187 return rewriteValueARM_OpARMMOVHUload(v)
188 case OpARMMOVHUloadidx:
189 return rewriteValueARM_OpARMMOVHUloadidx(v)
190 case OpARMMOVHUreg:
191 return rewriteValueARM_OpARMMOVHUreg(v)
192 case OpARMMOVHload:
193 return rewriteValueARM_OpARMMOVHload(v)
194 case OpARMMOVHloadidx:
195 return rewriteValueARM_OpARMMOVHloadidx(v)
196 case OpARMMOVHreg:
197 return rewriteValueARM_OpARMMOVHreg(v)
198 case OpARMMOVHstore:
199 return rewriteValueARM_OpARMMOVHstore(v)
200 case OpARMMOVHstoreidx:
201 return rewriteValueARM_OpARMMOVHstoreidx(v)
202 case OpARMMOVWload:
203 return rewriteValueARM_OpARMMOVWload(v)
204 case OpARMMOVWloadidx:
205 return rewriteValueARM_OpARMMOVWloadidx(v)
206 case OpARMMOVWloadshiftLL:
207 return rewriteValueARM_OpARMMOVWloadshiftLL(v)
208 case OpARMMOVWloadshiftRA:
209 return rewriteValueARM_OpARMMOVWloadshiftRA(v)
210 case OpARMMOVWloadshiftRL:
211 return rewriteValueARM_OpARMMOVWloadshiftRL(v)
212 case OpARMMOVWnop:
213 return rewriteValueARM_OpARMMOVWnop(v)
214 case OpARMMOVWreg:
215 return rewriteValueARM_OpARMMOVWreg(v)
216 case OpARMMOVWstore:
217 return rewriteValueARM_OpARMMOVWstore(v)
218 case OpARMMOVWstoreidx:
219 return rewriteValueARM_OpARMMOVWstoreidx(v)
220 case OpARMMOVWstoreshiftLL:
221 return rewriteValueARM_OpARMMOVWstoreshiftLL(v)
222 case OpARMMOVWstoreshiftRA:
223 return rewriteValueARM_OpARMMOVWstoreshiftRA(v)
224 case OpARMMOVWstoreshiftRL:
225 return rewriteValueARM_OpARMMOVWstoreshiftRL(v)
226 case OpARMMUL:
227 return rewriteValueARM_OpARMMUL(v)
228 case OpARMMULA:
229 return rewriteValueARM_OpARMMULA(v)
230 case OpARMMULD:
231 return rewriteValueARM_OpARMMULD(v)
232 case OpARMMULF:
233 return rewriteValueARM_OpARMMULF(v)
234 case OpARMMULS:
235 return rewriteValueARM_OpARMMULS(v)
236 case OpARMMVN:
237 return rewriteValueARM_OpARMMVN(v)
238 case OpARMMVNshiftLL:
239 return rewriteValueARM_OpARMMVNshiftLL(v)
240 case OpARMMVNshiftLLreg:
241 return rewriteValueARM_OpARMMVNshiftLLreg(v)
242 case OpARMMVNshiftRA:
243 return rewriteValueARM_OpARMMVNshiftRA(v)
244 case OpARMMVNshiftRAreg:
245 return rewriteValueARM_OpARMMVNshiftRAreg(v)
246 case OpARMMVNshiftRL:
247 return rewriteValueARM_OpARMMVNshiftRL(v)
248 case OpARMMVNshiftRLreg:
249 return rewriteValueARM_OpARMMVNshiftRLreg(v)
250 case OpARMNEGD:
251 return rewriteValueARM_OpARMNEGD(v)
252 case OpARMNEGF:
253 return rewriteValueARM_OpARMNEGF(v)
254 case OpARMNMULD:
255 return rewriteValueARM_OpARMNMULD(v)
256 case OpARMNMULF:
257 return rewriteValueARM_OpARMNMULF(v)
258 case OpARMNotEqual:
259 return rewriteValueARM_OpARMNotEqual(v)
260 case OpARMOR:
261 return rewriteValueARM_OpARMOR(v)
262 case OpARMORconst:
263 return rewriteValueARM_OpARMORconst(v)
264 case OpARMORshiftLL:
265 return rewriteValueARM_OpARMORshiftLL(v)
266 case OpARMORshiftLLreg:
267 return rewriteValueARM_OpARMORshiftLLreg(v)
268 case OpARMORshiftRA:
269 return rewriteValueARM_OpARMORshiftRA(v)
270 case OpARMORshiftRAreg:
271 return rewriteValueARM_OpARMORshiftRAreg(v)
272 case OpARMORshiftRL:
273 return rewriteValueARM_OpARMORshiftRL(v)
274 case OpARMORshiftRLreg:
275 return rewriteValueARM_OpARMORshiftRLreg(v)
276 case OpARMRSB:
277 return rewriteValueARM_OpARMRSB(v)
278 case OpARMRSBSshiftLL:
279 return rewriteValueARM_OpARMRSBSshiftLL(v)
280 case OpARMRSBSshiftLLreg:
281 return rewriteValueARM_OpARMRSBSshiftLLreg(v)
282 case OpARMRSBSshiftRA:
283 return rewriteValueARM_OpARMRSBSshiftRA(v)
284 case OpARMRSBSshiftRAreg:
285 return rewriteValueARM_OpARMRSBSshiftRAreg(v)
286 case OpARMRSBSshiftRL:
287 return rewriteValueARM_OpARMRSBSshiftRL(v)
288 case OpARMRSBSshiftRLreg:
289 return rewriteValueARM_OpARMRSBSshiftRLreg(v)
290 case OpARMRSBconst:
291 return rewriteValueARM_OpARMRSBconst(v)
292 case OpARMRSBshiftLL:
293 return rewriteValueARM_OpARMRSBshiftLL(v)
294 case OpARMRSBshiftLLreg:
295 return rewriteValueARM_OpARMRSBshiftLLreg(v)
296 case OpARMRSBshiftRA:
297 return rewriteValueARM_OpARMRSBshiftRA(v)
298 case OpARMRSBshiftRAreg:
299 return rewriteValueARM_OpARMRSBshiftRAreg(v)
300 case OpARMRSBshiftRL:
301 return rewriteValueARM_OpARMRSBshiftRL(v)
302 case OpARMRSBshiftRLreg:
303 return rewriteValueARM_OpARMRSBshiftRLreg(v)
304 case OpARMRSCconst:
305 return rewriteValueARM_OpARMRSCconst(v)
306 case OpARMRSCshiftLL:
307 return rewriteValueARM_OpARMRSCshiftLL(v)
308 case OpARMRSCshiftLLreg:
309 return rewriteValueARM_OpARMRSCshiftLLreg(v)
310 case OpARMRSCshiftRA:
311 return rewriteValueARM_OpARMRSCshiftRA(v)
312 case OpARMRSCshiftRAreg:
313 return rewriteValueARM_OpARMRSCshiftRAreg(v)
314 case OpARMRSCshiftRL:
315 return rewriteValueARM_OpARMRSCshiftRL(v)
316 case OpARMRSCshiftRLreg:
317 return rewriteValueARM_OpARMRSCshiftRLreg(v)
318 case OpARMSBC:
319 return rewriteValueARM_OpARMSBC(v)
320 case OpARMSBCconst:
321 return rewriteValueARM_OpARMSBCconst(v)
322 case OpARMSBCshiftLL:
323 return rewriteValueARM_OpARMSBCshiftLL(v)
324 case OpARMSBCshiftLLreg:
325 return rewriteValueARM_OpARMSBCshiftLLreg(v)
326 case OpARMSBCshiftRA:
327 return rewriteValueARM_OpARMSBCshiftRA(v)
328 case OpARMSBCshiftRAreg:
329 return rewriteValueARM_OpARMSBCshiftRAreg(v)
330 case OpARMSBCshiftRL:
331 return rewriteValueARM_OpARMSBCshiftRL(v)
332 case OpARMSBCshiftRLreg:
333 return rewriteValueARM_OpARMSBCshiftRLreg(v)
334 case OpARMSLL:
335 return rewriteValueARM_OpARMSLL(v)
336 case OpARMSLLconst:
337 return rewriteValueARM_OpARMSLLconst(v)
338 case OpARMSRA:
339 return rewriteValueARM_OpARMSRA(v)
340 case OpARMSRAcond:
341 return rewriteValueARM_OpARMSRAcond(v)
342 case OpARMSRAconst:
343 return rewriteValueARM_OpARMSRAconst(v)
344 case OpARMSRL:
345 return rewriteValueARM_OpARMSRL(v)
346 case OpARMSRLconst:
347 return rewriteValueARM_OpARMSRLconst(v)
348 case OpARMSRR:
349 return rewriteValueARM_OpARMSRR(v)
350 case OpARMSUB:
351 return rewriteValueARM_OpARMSUB(v)
352 case OpARMSUBD:
353 return rewriteValueARM_OpARMSUBD(v)
354 case OpARMSUBF:
355 return rewriteValueARM_OpARMSUBF(v)
356 case OpARMSUBS:
357 return rewriteValueARM_OpARMSUBS(v)
358 case OpARMSUBSshiftLL:
359 return rewriteValueARM_OpARMSUBSshiftLL(v)
360 case OpARMSUBSshiftLLreg:
361 return rewriteValueARM_OpARMSUBSshiftLLreg(v)
362 case OpARMSUBSshiftRA:
363 return rewriteValueARM_OpARMSUBSshiftRA(v)
364 case OpARMSUBSshiftRAreg:
365 return rewriteValueARM_OpARMSUBSshiftRAreg(v)
366 case OpARMSUBSshiftRL:
367 return rewriteValueARM_OpARMSUBSshiftRL(v)
368 case OpARMSUBSshiftRLreg:
369 return rewriteValueARM_OpARMSUBSshiftRLreg(v)
370 case OpARMSUBconst:
371 return rewriteValueARM_OpARMSUBconst(v)
372 case OpARMSUBshiftLL:
373 return rewriteValueARM_OpARMSUBshiftLL(v)
374 case OpARMSUBshiftLLreg:
375 return rewriteValueARM_OpARMSUBshiftLLreg(v)
376 case OpARMSUBshiftRA:
377 return rewriteValueARM_OpARMSUBshiftRA(v)
378 case OpARMSUBshiftRAreg:
379 return rewriteValueARM_OpARMSUBshiftRAreg(v)
380 case OpARMSUBshiftRL:
381 return rewriteValueARM_OpARMSUBshiftRL(v)
382 case OpARMSUBshiftRLreg:
383 return rewriteValueARM_OpARMSUBshiftRLreg(v)
384 case OpARMTEQ:
385 return rewriteValueARM_OpARMTEQ(v)
386 case OpARMTEQconst:
387 return rewriteValueARM_OpARMTEQconst(v)
388 case OpARMTEQshiftLL:
389 return rewriteValueARM_OpARMTEQshiftLL(v)
390 case OpARMTEQshiftLLreg:
391 return rewriteValueARM_OpARMTEQshiftLLreg(v)
392 case OpARMTEQshiftRA:
393 return rewriteValueARM_OpARMTEQshiftRA(v)
394 case OpARMTEQshiftRAreg:
395 return rewriteValueARM_OpARMTEQshiftRAreg(v)
396 case OpARMTEQshiftRL:
397 return rewriteValueARM_OpARMTEQshiftRL(v)
398 case OpARMTEQshiftRLreg:
399 return rewriteValueARM_OpARMTEQshiftRLreg(v)
400 case OpARMTST:
401 return rewriteValueARM_OpARMTST(v)
402 case OpARMTSTconst:
403 return rewriteValueARM_OpARMTSTconst(v)
404 case OpARMTSTshiftLL:
405 return rewriteValueARM_OpARMTSTshiftLL(v)
406 case OpARMTSTshiftLLreg:
407 return rewriteValueARM_OpARMTSTshiftLLreg(v)
408 case OpARMTSTshiftRA:
409 return rewriteValueARM_OpARMTSTshiftRA(v)
410 case OpARMTSTshiftRAreg:
411 return rewriteValueARM_OpARMTSTshiftRAreg(v)
412 case OpARMTSTshiftRL:
413 return rewriteValueARM_OpARMTSTshiftRL(v)
414 case OpARMTSTshiftRLreg:
415 return rewriteValueARM_OpARMTSTshiftRLreg(v)
416 case OpARMXOR:
417 return rewriteValueARM_OpARMXOR(v)
418 case OpARMXORconst:
419 return rewriteValueARM_OpARMXORconst(v)
420 case OpARMXORshiftLL:
421 return rewriteValueARM_OpARMXORshiftLL(v)
422 case OpARMXORshiftLLreg:
423 return rewriteValueARM_OpARMXORshiftLLreg(v)
424 case OpARMXORshiftRA:
425 return rewriteValueARM_OpARMXORshiftRA(v)
426 case OpARMXORshiftRAreg:
427 return rewriteValueARM_OpARMXORshiftRAreg(v)
428 case OpARMXORshiftRL:
429 return rewriteValueARM_OpARMXORshiftRL(v)
430 case OpARMXORshiftRLreg:
431 return rewriteValueARM_OpARMXORshiftRLreg(v)
432 case OpARMXORshiftRR:
433 return rewriteValueARM_OpARMXORshiftRR(v)
434 case OpAbs:
435 v.Op = OpARMABSD
436 return true
437 case OpAdd16:
438 v.Op = OpARMADD
439 return true
440 case OpAdd32:
441 v.Op = OpARMADD
442 return true
443 case OpAdd32F:
444 v.Op = OpARMADDF
445 return true
446 case OpAdd32carry:
447 v.Op = OpARMADDS
448 return true
449 case OpAdd32carrywithcarry:
450 v.Op = OpARMADCS
451 return true
452 case OpAdd32withcarry:
453 v.Op = OpARMADC
454 return true
455 case OpAdd64F:
456 v.Op = OpARMADDD
457 return true
458 case OpAdd8:
459 v.Op = OpARMADD
460 return true
461 case OpAddPtr:
462 v.Op = OpARMADD
463 return true
464 case OpAddr:
465 return rewriteValueARM_OpAddr(v)
466 case OpAnd16:
467 v.Op = OpARMAND
468 return true
469 case OpAnd32:
470 v.Op = OpARMAND
471 return true
472 case OpAnd8:
473 v.Op = OpARMAND
474 return true
475 case OpAndB:
476 v.Op = OpARMAND
477 return true
478 case OpAvg32u:
479 return rewriteValueARM_OpAvg32u(v)
480 case OpBitLen16:
481 return rewriteValueARM_OpBitLen16(v)
482 case OpBitLen32:
483 return rewriteValueARM_OpBitLen32(v)
484 case OpBitLen8:
485 return rewriteValueARM_OpBitLen8(v)
486 case OpBswap32:
487 return rewriteValueARM_OpBswap32(v)
488 case OpClosureCall:
489 v.Op = OpARMCALLclosure
490 return true
491 case OpCom16:
492 v.Op = OpARMMVN
493 return true
494 case OpCom32:
495 v.Op = OpARMMVN
496 return true
497 case OpCom8:
498 v.Op = OpARMMVN
499 return true
500 case OpConst16:
501 return rewriteValueARM_OpConst16(v)
502 case OpConst32:
503 return rewriteValueARM_OpConst32(v)
504 case OpConst32F:
505 return rewriteValueARM_OpConst32F(v)
506 case OpConst64F:
507 return rewriteValueARM_OpConst64F(v)
508 case OpConst8:
509 return rewriteValueARM_OpConst8(v)
510 case OpConstBool:
511 return rewriteValueARM_OpConstBool(v)
512 case OpConstNil:
513 return rewriteValueARM_OpConstNil(v)
514 case OpCtz16:
515 return rewriteValueARM_OpCtz16(v)
516 case OpCtz16NonZero:
517 v.Op = OpCtz32
518 return true
519 case OpCtz32:
520 return rewriteValueARM_OpCtz32(v)
521 case OpCtz32NonZero:
522 v.Op = OpCtz32
523 return true
524 case OpCtz8:
525 return rewriteValueARM_OpCtz8(v)
526 case OpCtz8NonZero:
527 v.Op = OpCtz32
528 return true
529 case OpCvt32Fto32:
530 v.Op = OpARMMOVFW
531 return true
532 case OpCvt32Fto32U:
533 v.Op = OpARMMOVFWU
534 return true
535 case OpCvt32Fto64F:
536 v.Op = OpARMMOVFD
537 return true
538 case OpCvt32Uto32F:
539 v.Op = OpARMMOVWUF
540 return true
541 case OpCvt32Uto64F:
542 v.Op = OpARMMOVWUD
543 return true
544 case OpCvt32to32F:
545 v.Op = OpARMMOVWF
546 return true
547 case OpCvt32to64F:
548 v.Op = OpARMMOVWD
549 return true
550 case OpCvt64Fto32:
551 v.Op = OpARMMOVDW
552 return true
553 case OpCvt64Fto32F:
554 v.Op = OpARMMOVDF
555 return true
556 case OpCvt64Fto32U:
557 v.Op = OpARMMOVDWU
558 return true
559 case OpCvtBoolToUint8:
560 v.Op = OpCopy
561 return true
562 case OpDiv16:
563 return rewriteValueARM_OpDiv16(v)
564 case OpDiv16u:
565 return rewriteValueARM_OpDiv16u(v)
566 case OpDiv32:
567 return rewriteValueARM_OpDiv32(v)
568 case OpDiv32F:
569 v.Op = OpARMDIVF
570 return true
571 case OpDiv32u:
572 return rewriteValueARM_OpDiv32u(v)
573 case OpDiv64F:
574 v.Op = OpARMDIVD
575 return true
576 case OpDiv8:
577 return rewriteValueARM_OpDiv8(v)
578 case OpDiv8u:
579 return rewriteValueARM_OpDiv8u(v)
580 case OpEq16:
581 return rewriteValueARM_OpEq16(v)
582 case OpEq32:
583 return rewriteValueARM_OpEq32(v)
584 case OpEq32F:
585 return rewriteValueARM_OpEq32F(v)
586 case OpEq64F:
587 return rewriteValueARM_OpEq64F(v)
588 case OpEq8:
589 return rewriteValueARM_OpEq8(v)
590 case OpEqB:
591 return rewriteValueARM_OpEqB(v)
592 case OpEqPtr:
593 return rewriteValueARM_OpEqPtr(v)
594 case OpFMA:
595 return rewriteValueARM_OpFMA(v)
596 case OpGetCallerPC:
597 v.Op = OpARMLoweredGetCallerPC
598 return true
599 case OpGetCallerSP:
600 v.Op = OpARMLoweredGetCallerSP
601 return true
602 case OpGetClosurePtr:
603 v.Op = OpARMLoweredGetClosurePtr
604 return true
605 case OpHmul32:
606 v.Op = OpARMHMUL
607 return true
608 case OpHmul32u:
609 v.Op = OpARMHMULU
610 return true
611 case OpInterCall:
612 v.Op = OpARMCALLinter
613 return true
614 case OpIsInBounds:
615 return rewriteValueARM_OpIsInBounds(v)
616 case OpIsNonNil:
617 return rewriteValueARM_OpIsNonNil(v)
618 case OpIsSliceInBounds:
619 return rewriteValueARM_OpIsSliceInBounds(v)
620 case OpLeq16:
621 return rewriteValueARM_OpLeq16(v)
622 case OpLeq16U:
623 return rewriteValueARM_OpLeq16U(v)
624 case OpLeq32:
625 return rewriteValueARM_OpLeq32(v)
626 case OpLeq32F:
627 return rewriteValueARM_OpLeq32F(v)
628 case OpLeq32U:
629 return rewriteValueARM_OpLeq32U(v)
630 case OpLeq64F:
631 return rewriteValueARM_OpLeq64F(v)
632 case OpLeq8:
633 return rewriteValueARM_OpLeq8(v)
634 case OpLeq8U:
635 return rewriteValueARM_OpLeq8U(v)
636 case OpLess16:
637 return rewriteValueARM_OpLess16(v)
638 case OpLess16U:
639 return rewriteValueARM_OpLess16U(v)
640 case OpLess32:
641 return rewriteValueARM_OpLess32(v)
642 case OpLess32F:
643 return rewriteValueARM_OpLess32F(v)
644 case OpLess32U:
645 return rewriteValueARM_OpLess32U(v)
646 case OpLess64F:
647 return rewriteValueARM_OpLess64F(v)
648 case OpLess8:
649 return rewriteValueARM_OpLess8(v)
650 case OpLess8U:
651 return rewriteValueARM_OpLess8U(v)
652 case OpLoad:
653 return rewriteValueARM_OpLoad(v)
654 case OpLocalAddr:
655 return rewriteValueARM_OpLocalAddr(v)
656 case OpLsh16x16:
657 return rewriteValueARM_OpLsh16x16(v)
658 case OpLsh16x32:
659 return rewriteValueARM_OpLsh16x32(v)
660 case OpLsh16x64:
661 return rewriteValueARM_OpLsh16x64(v)
662 case OpLsh16x8:
663 return rewriteValueARM_OpLsh16x8(v)
664 case OpLsh32x16:
665 return rewriteValueARM_OpLsh32x16(v)
666 case OpLsh32x32:
667 return rewriteValueARM_OpLsh32x32(v)
668 case OpLsh32x64:
669 return rewriteValueARM_OpLsh32x64(v)
670 case OpLsh32x8:
671 return rewriteValueARM_OpLsh32x8(v)
672 case OpLsh8x16:
673 return rewriteValueARM_OpLsh8x16(v)
674 case OpLsh8x32:
675 return rewriteValueARM_OpLsh8x32(v)
676 case OpLsh8x64:
677 return rewriteValueARM_OpLsh8x64(v)
678 case OpLsh8x8:
679 return rewriteValueARM_OpLsh8x8(v)
680 case OpMod16:
681 return rewriteValueARM_OpMod16(v)
682 case OpMod16u:
683 return rewriteValueARM_OpMod16u(v)
684 case OpMod32:
685 return rewriteValueARM_OpMod32(v)
686 case OpMod32u:
687 return rewriteValueARM_OpMod32u(v)
688 case OpMod8:
689 return rewriteValueARM_OpMod8(v)
690 case OpMod8u:
691 return rewriteValueARM_OpMod8u(v)
692 case OpMove:
693 return rewriteValueARM_OpMove(v)
694 case OpMul16:
695 v.Op = OpARMMUL
696 return true
697 case OpMul32:
698 v.Op = OpARMMUL
699 return true
700 case OpMul32F:
701 v.Op = OpARMMULF
702 return true
703 case OpMul32uhilo:
704 v.Op = OpARMMULLU
705 return true
706 case OpMul64F:
707 v.Op = OpARMMULD
708 return true
709 case OpMul8:
710 v.Op = OpARMMUL
711 return true
712 case OpNeg16:
713 return rewriteValueARM_OpNeg16(v)
714 case OpNeg32:
715 return rewriteValueARM_OpNeg32(v)
716 case OpNeg32F:
717 v.Op = OpARMNEGF
718 return true
719 case OpNeg64F:
720 v.Op = OpARMNEGD
721 return true
722 case OpNeg8:
723 return rewriteValueARM_OpNeg8(v)
724 case OpNeq16:
725 return rewriteValueARM_OpNeq16(v)
726 case OpNeq32:
727 return rewriteValueARM_OpNeq32(v)
728 case OpNeq32F:
729 return rewriteValueARM_OpNeq32F(v)
730 case OpNeq64F:
731 return rewriteValueARM_OpNeq64F(v)
732 case OpNeq8:
733 return rewriteValueARM_OpNeq8(v)
734 case OpNeqB:
735 v.Op = OpARMXOR
736 return true
737 case OpNeqPtr:
738 return rewriteValueARM_OpNeqPtr(v)
739 case OpNilCheck:
740 v.Op = OpARMLoweredNilCheck
741 return true
742 case OpNot:
743 return rewriteValueARM_OpNot(v)
744 case OpOffPtr:
745 return rewriteValueARM_OpOffPtr(v)
746 case OpOr16:
747 v.Op = OpARMOR
748 return true
749 case OpOr32:
750 v.Op = OpARMOR
751 return true
752 case OpOr8:
753 v.Op = OpARMOR
754 return true
755 case OpOrB:
756 v.Op = OpARMOR
757 return true
758 case OpPanicBounds:
759 v.Op = OpARMLoweredPanicBoundsRR
760 return true
761 case OpPanicExtend:
762 v.Op = OpARMLoweredPanicExtendRR
763 return true
764 case OpRotateLeft16:
765 return rewriteValueARM_OpRotateLeft16(v)
766 case OpRotateLeft32:
767 return rewriteValueARM_OpRotateLeft32(v)
768 case OpRotateLeft8:
769 return rewriteValueARM_OpRotateLeft8(v)
770 case OpRound32F:
771 v.Op = OpCopy
772 return true
773 case OpRound64F:
774 v.Op = OpCopy
775 return true
776 case OpRsh16Ux16:
777 return rewriteValueARM_OpRsh16Ux16(v)
778 case OpRsh16Ux32:
779 return rewriteValueARM_OpRsh16Ux32(v)
780 case OpRsh16Ux64:
781 return rewriteValueARM_OpRsh16Ux64(v)
782 case OpRsh16Ux8:
783 return rewriteValueARM_OpRsh16Ux8(v)
784 case OpRsh16x16:
785 return rewriteValueARM_OpRsh16x16(v)
786 case OpRsh16x32:
787 return rewriteValueARM_OpRsh16x32(v)
788 case OpRsh16x64:
789 return rewriteValueARM_OpRsh16x64(v)
790 case OpRsh16x8:
791 return rewriteValueARM_OpRsh16x8(v)
792 case OpRsh32Ux16:
793 return rewriteValueARM_OpRsh32Ux16(v)
794 case OpRsh32Ux32:
795 return rewriteValueARM_OpRsh32Ux32(v)
796 case OpRsh32Ux64:
797 return rewriteValueARM_OpRsh32Ux64(v)
798 case OpRsh32Ux8:
799 return rewriteValueARM_OpRsh32Ux8(v)
800 case OpRsh32x16:
801 return rewriteValueARM_OpRsh32x16(v)
802 case OpRsh32x32:
803 return rewriteValueARM_OpRsh32x32(v)
804 case OpRsh32x64:
805 return rewriteValueARM_OpRsh32x64(v)
806 case OpRsh32x8:
807 return rewriteValueARM_OpRsh32x8(v)
808 case OpRsh8Ux16:
809 return rewriteValueARM_OpRsh8Ux16(v)
810 case OpRsh8Ux32:
811 return rewriteValueARM_OpRsh8Ux32(v)
812 case OpRsh8Ux64:
813 return rewriteValueARM_OpRsh8Ux64(v)
814 case OpRsh8Ux8:
815 return rewriteValueARM_OpRsh8Ux8(v)
816 case OpRsh8x16:
817 return rewriteValueARM_OpRsh8x16(v)
818 case OpRsh8x32:
819 return rewriteValueARM_OpRsh8x32(v)
820 case OpRsh8x64:
821 return rewriteValueARM_OpRsh8x64(v)
822 case OpRsh8x8:
823 return rewriteValueARM_OpRsh8x8(v)
824 case OpSelect0:
825 return rewriteValueARM_OpSelect0(v)
826 case OpSelect1:
827 return rewriteValueARM_OpSelect1(v)
828 case OpSignExt16to32:
829 v.Op = OpARMMOVHreg
830 return true
831 case OpSignExt8to16:
832 v.Op = OpARMMOVBreg
833 return true
834 case OpSignExt8to32:
835 v.Op = OpARMMOVBreg
836 return true
837 case OpSignmask:
838 return rewriteValueARM_OpSignmask(v)
839 case OpSlicemask:
840 return rewriteValueARM_OpSlicemask(v)
841 case OpSqrt:
842 v.Op = OpARMSQRTD
843 return true
844 case OpSqrt32:
845 v.Op = OpARMSQRTF
846 return true
847 case OpStaticCall:
848 v.Op = OpARMCALLstatic
849 return true
850 case OpStore:
851 return rewriteValueARM_OpStore(v)
852 case OpSub16:
853 v.Op = OpARMSUB
854 return true
855 case OpSub32:
856 v.Op = OpARMSUB
857 return true
858 case OpSub32F:
859 v.Op = OpARMSUBF
860 return true
861 case OpSub32carry:
862 v.Op = OpARMSUBS
863 return true
864 case OpSub32withcarry:
865 v.Op = OpARMSBC
866 return true
867 case OpSub64F:
868 v.Op = OpARMSUBD
869 return true
870 case OpSub8:
871 v.Op = OpARMSUB
872 return true
873 case OpSubPtr:
874 v.Op = OpARMSUB
875 return true
876 case OpTailCall:
877 v.Op = OpARMCALLtail
878 return true
879 case OpTrunc16to8:
880 v.Op = OpCopy
881 return true
882 case OpTrunc32to16:
883 v.Op = OpCopy
884 return true
885 case OpTrunc32to8:
886 v.Op = OpCopy
887 return true
888 case OpWB:
889 v.Op = OpARMLoweredWB
890 return true
891 case OpXor16:
892 v.Op = OpARMXOR
893 return true
894 case OpXor32:
895 v.Op = OpARMXOR
896 return true
897 case OpXor8:
898 v.Op = OpARMXOR
899 return true
900 case OpZero:
901 return rewriteValueARM_OpZero(v)
902 case OpZeroExt16to32:
903 v.Op = OpARMMOVHUreg
904 return true
905 case OpZeroExt8to16:
906 v.Op = OpARMMOVBUreg
907 return true
908 case OpZeroExt8to32:
909 v.Op = OpARMMOVBUreg
910 return true
911 case OpZeromask:
912 return rewriteValueARM_OpZeromask(v)
913 }
914 return false
915 }
916 func rewriteValueARM_OpARMADC(v *Value) bool {
917 v_2 := v.Args[2]
918 v_1 := v.Args[1]
919 v_0 := v.Args[0]
920
921
922 for {
923 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
924 if v_0.Op != OpARMMOVWconst {
925 continue
926 }
927 c := auxIntToInt32(v_0.AuxInt)
928 x := v_1
929 flags := v_2
930 v.reset(OpARMADCconst)
931 v.AuxInt = int32ToAuxInt(c)
932 v.AddArg2(x, flags)
933 return true
934 }
935 break
936 }
937
938
939 for {
940 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
941 x := v_0
942 if v_1.Op != OpARMSLLconst {
943 continue
944 }
945 c := auxIntToInt32(v_1.AuxInt)
946 y := v_1.Args[0]
947 flags := v_2
948 v.reset(OpARMADCshiftLL)
949 v.AuxInt = int32ToAuxInt(c)
950 v.AddArg3(x, y, flags)
951 return true
952 }
953 break
954 }
955
956
957 for {
958 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
959 x := v_0
960 if v_1.Op != OpARMSRLconst {
961 continue
962 }
963 c := auxIntToInt32(v_1.AuxInt)
964 y := v_1.Args[0]
965 flags := v_2
966 v.reset(OpARMADCshiftRL)
967 v.AuxInt = int32ToAuxInt(c)
968 v.AddArg3(x, y, flags)
969 return true
970 }
971 break
972 }
973
974
975 for {
976 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
977 x := v_0
978 if v_1.Op != OpARMSRAconst {
979 continue
980 }
981 c := auxIntToInt32(v_1.AuxInt)
982 y := v_1.Args[0]
983 flags := v_2
984 v.reset(OpARMADCshiftRA)
985 v.AuxInt = int32ToAuxInt(c)
986 v.AddArg3(x, y, flags)
987 return true
988 }
989 break
990 }
991
992
993 for {
994 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
995 x := v_0
996 if v_1.Op != OpARMSLL {
997 continue
998 }
999 z := v_1.Args[1]
1000 y := v_1.Args[0]
1001 flags := v_2
1002 v.reset(OpARMADCshiftLLreg)
1003 v.AddArg4(x, y, z, flags)
1004 return true
1005 }
1006 break
1007 }
1008
1009
1010 for {
1011 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1012 x := v_0
1013 if v_1.Op != OpARMSRL {
1014 continue
1015 }
1016 z := v_1.Args[1]
1017 y := v_1.Args[0]
1018 flags := v_2
1019 v.reset(OpARMADCshiftRLreg)
1020 v.AddArg4(x, y, z, flags)
1021 return true
1022 }
1023 break
1024 }
1025
1026
1027 for {
1028 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1029 x := v_0
1030 if v_1.Op != OpARMSRA {
1031 continue
1032 }
1033 z := v_1.Args[1]
1034 y := v_1.Args[0]
1035 flags := v_2
1036 v.reset(OpARMADCshiftRAreg)
1037 v.AddArg4(x, y, z, flags)
1038 return true
1039 }
1040 break
1041 }
1042 return false
1043 }
1044 func rewriteValueARM_OpARMADCconst(v *Value) bool {
1045 v_1 := v.Args[1]
1046 v_0 := v.Args[0]
1047
1048
1049 for {
1050 c := auxIntToInt32(v.AuxInt)
1051 if v_0.Op != OpARMADDconst {
1052 break
1053 }
1054 d := auxIntToInt32(v_0.AuxInt)
1055 x := v_0.Args[0]
1056 flags := v_1
1057 v.reset(OpARMADCconst)
1058 v.AuxInt = int32ToAuxInt(c + d)
1059 v.AddArg2(x, flags)
1060 return true
1061 }
1062
1063
1064 for {
1065 c := auxIntToInt32(v.AuxInt)
1066 if v_0.Op != OpARMSUBconst {
1067 break
1068 }
1069 d := auxIntToInt32(v_0.AuxInt)
1070 x := v_0.Args[0]
1071 flags := v_1
1072 v.reset(OpARMADCconst)
1073 v.AuxInt = int32ToAuxInt(c - d)
1074 v.AddArg2(x, flags)
1075 return true
1076 }
1077 return false
1078 }
1079 func rewriteValueARM_OpARMADCshiftLL(v *Value) bool {
1080 v_2 := v.Args[2]
1081 v_1 := v.Args[1]
1082 v_0 := v.Args[0]
1083 b := v.Block
1084
1085
1086 for {
1087 d := auxIntToInt32(v.AuxInt)
1088 if v_0.Op != OpARMMOVWconst {
1089 break
1090 }
1091 c := auxIntToInt32(v_0.AuxInt)
1092 x := v_1
1093 flags := v_2
1094 v.reset(OpARMADCconst)
1095 v.AuxInt = int32ToAuxInt(c)
1096 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
1097 v0.AuxInt = int32ToAuxInt(d)
1098 v0.AddArg(x)
1099 v.AddArg2(v0, flags)
1100 return true
1101 }
1102
1103
1104 for {
1105 d := auxIntToInt32(v.AuxInt)
1106 x := v_0
1107 if v_1.Op != OpARMMOVWconst {
1108 break
1109 }
1110 c := auxIntToInt32(v_1.AuxInt)
1111 flags := v_2
1112 v.reset(OpARMADCconst)
1113 v.AuxInt = int32ToAuxInt(c << uint64(d))
1114 v.AddArg2(x, flags)
1115 return true
1116 }
1117 return false
1118 }
1119 func rewriteValueARM_OpARMADCshiftLLreg(v *Value) bool {
1120 v_3 := v.Args[3]
1121 v_2 := v.Args[2]
1122 v_1 := v.Args[1]
1123 v_0 := v.Args[0]
1124 b := v.Block
1125
1126
1127 for {
1128 if v_0.Op != OpARMMOVWconst {
1129 break
1130 }
1131 c := auxIntToInt32(v_0.AuxInt)
1132 x := v_1
1133 y := v_2
1134 flags := v_3
1135 v.reset(OpARMADCconst)
1136 v.AuxInt = int32ToAuxInt(c)
1137 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
1138 v0.AddArg2(x, y)
1139 v.AddArg2(v0, flags)
1140 return true
1141 }
1142
1143
1144
1145 for {
1146 x := v_0
1147 y := v_1
1148 if v_2.Op != OpARMMOVWconst {
1149 break
1150 }
1151 c := auxIntToInt32(v_2.AuxInt)
1152 flags := v_3
1153 if !(0 <= c && c < 32) {
1154 break
1155 }
1156 v.reset(OpARMADCshiftLL)
1157 v.AuxInt = int32ToAuxInt(c)
1158 v.AddArg3(x, y, flags)
1159 return true
1160 }
1161 return false
1162 }
1163 func rewriteValueARM_OpARMADCshiftRA(v *Value) bool {
1164 v_2 := v.Args[2]
1165 v_1 := v.Args[1]
1166 v_0 := v.Args[0]
1167 b := v.Block
1168
1169
1170 for {
1171 d := auxIntToInt32(v.AuxInt)
1172 if v_0.Op != OpARMMOVWconst {
1173 break
1174 }
1175 c := auxIntToInt32(v_0.AuxInt)
1176 x := v_1
1177 flags := v_2
1178 v.reset(OpARMADCconst)
1179 v.AuxInt = int32ToAuxInt(c)
1180 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
1181 v0.AuxInt = int32ToAuxInt(d)
1182 v0.AddArg(x)
1183 v.AddArg2(v0, flags)
1184 return true
1185 }
1186
1187
1188 for {
1189 d := auxIntToInt32(v.AuxInt)
1190 x := v_0
1191 if v_1.Op != OpARMMOVWconst {
1192 break
1193 }
1194 c := auxIntToInt32(v_1.AuxInt)
1195 flags := v_2
1196 v.reset(OpARMADCconst)
1197 v.AuxInt = int32ToAuxInt(c >> uint64(d))
1198 v.AddArg2(x, flags)
1199 return true
1200 }
1201 return false
1202 }
1203 func rewriteValueARM_OpARMADCshiftRAreg(v *Value) bool {
1204 v_3 := v.Args[3]
1205 v_2 := v.Args[2]
1206 v_1 := v.Args[1]
1207 v_0 := v.Args[0]
1208 b := v.Block
1209
1210
1211 for {
1212 if v_0.Op != OpARMMOVWconst {
1213 break
1214 }
1215 c := auxIntToInt32(v_0.AuxInt)
1216 x := v_1
1217 y := v_2
1218 flags := v_3
1219 v.reset(OpARMADCconst)
1220 v.AuxInt = int32ToAuxInt(c)
1221 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
1222 v0.AddArg2(x, y)
1223 v.AddArg2(v0, flags)
1224 return true
1225 }
1226
1227
1228
1229 for {
1230 x := v_0
1231 y := v_1
1232 if v_2.Op != OpARMMOVWconst {
1233 break
1234 }
1235 c := auxIntToInt32(v_2.AuxInt)
1236 flags := v_3
1237 if !(0 <= c && c < 32) {
1238 break
1239 }
1240 v.reset(OpARMADCshiftRA)
1241 v.AuxInt = int32ToAuxInt(c)
1242 v.AddArg3(x, y, flags)
1243 return true
1244 }
1245 return false
1246 }
1247 func rewriteValueARM_OpARMADCshiftRL(v *Value) bool {
1248 v_2 := v.Args[2]
1249 v_1 := v.Args[1]
1250 v_0 := v.Args[0]
1251 b := v.Block
1252
1253
1254 for {
1255 d := auxIntToInt32(v.AuxInt)
1256 if v_0.Op != OpARMMOVWconst {
1257 break
1258 }
1259 c := auxIntToInt32(v_0.AuxInt)
1260 x := v_1
1261 flags := v_2
1262 v.reset(OpARMADCconst)
1263 v.AuxInt = int32ToAuxInt(c)
1264 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
1265 v0.AuxInt = int32ToAuxInt(d)
1266 v0.AddArg(x)
1267 v.AddArg2(v0, flags)
1268 return true
1269 }
1270
1271
1272 for {
1273 d := auxIntToInt32(v.AuxInt)
1274 x := v_0
1275 if v_1.Op != OpARMMOVWconst {
1276 break
1277 }
1278 c := auxIntToInt32(v_1.AuxInt)
1279 flags := v_2
1280 v.reset(OpARMADCconst)
1281 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
1282 v.AddArg2(x, flags)
1283 return true
1284 }
1285 return false
1286 }
1287 func rewriteValueARM_OpARMADCshiftRLreg(v *Value) bool {
1288 v_3 := v.Args[3]
1289 v_2 := v.Args[2]
1290 v_1 := v.Args[1]
1291 v_0 := v.Args[0]
1292 b := v.Block
1293
1294
1295 for {
1296 if v_0.Op != OpARMMOVWconst {
1297 break
1298 }
1299 c := auxIntToInt32(v_0.AuxInt)
1300 x := v_1
1301 y := v_2
1302 flags := v_3
1303 v.reset(OpARMADCconst)
1304 v.AuxInt = int32ToAuxInt(c)
1305 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
1306 v0.AddArg2(x, y)
1307 v.AddArg2(v0, flags)
1308 return true
1309 }
1310
1311
1312
1313 for {
1314 x := v_0
1315 y := v_1
1316 if v_2.Op != OpARMMOVWconst {
1317 break
1318 }
1319 c := auxIntToInt32(v_2.AuxInt)
1320 flags := v_3
1321 if !(0 <= c && c < 32) {
1322 break
1323 }
1324 v.reset(OpARMADCshiftRL)
1325 v.AuxInt = int32ToAuxInt(c)
1326 v.AddArg3(x, y, flags)
1327 return true
1328 }
1329 return false
1330 }
1331 func rewriteValueARM_OpARMADD(v *Value) bool {
1332 v_1 := v.Args[1]
1333 v_0 := v.Args[0]
1334 b := v.Block
1335
1336
1337
1338 for {
1339 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1340 x := v_0
1341 if v_1.Op != OpARMMOVWconst {
1342 continue
1343 }
1344 t := v_1.Type
1345 c := auxIntToInt32(v_1.AuxInt)
1346 if !(!t.IsPtr()) {
1347 continue
1348 }
1349 v.reset(OpARMADDconst)
1350 v.AuxInt = int32ToAuxInt(c)
1351 v.AddArg(x)
1352 return true
1353 }
1354 break
1355 }
1356
1357
1358 for {
1359 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1360 x := v_0
1361 if v_1.Op != OpARMSLLconst {
1362 continue
1363 }
1364 c := auxIntToInt32(v_1.AuxInt)
1365 y := v_1.Args[0]
1366 v.reset(OpARMADDshiftLL)
1367 v.AuxInt = int32ToAuxInt(c)
1368 v.AddArg2(x, y)
1369 return true
1370 }
1371 break
1372 }
1373
1374
1375 for {
1376 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1377 x := v_0
1378 if v_1.Op != OpARMSRLconst {
1379 continue
1380 }
1381 c := auxIntToInt32(v_1.AuxInt)
1382 y := v_1.Args[0]
1383 v.reset(OpARMADDshiftRL)
1384 v.AuxInt = int32ToAuxInt(c)
1385 v.AddArg2(x, y)
1386 return true
1387 }
1388 break
1389 }
1390
1391
1392 for {
1393 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1394 x := v_0
1395 if v_1.Op != OpARMSRAconst {
1396 continue
1397 }
1398 c := auxIntToInt32(v_1.AuxInt)
1399 y := v_1.Args[0]
1400 v.reset(OpARMADDshiftRA)
1401 v.AuxInt = int32ToAuxInt(c)
1402 v.AddArg2(x, y)
1403 return true
1404 }
1405 break
1406 }
1407
1408
1409 for {
1410 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1411 x := v_0
1412 if v_1.Op != OpARMSLL {
1413 continue
1414 }
1415 z := v_1.Args[1]
1416 y := v_1.Args[0]
1417 v.reset(OpARMADDshiftLLreg)
1418 v.AddArg3(x, y, z)
1419 return true
1420 }
1421 break
1422 }
1423
1424
1425 for {
1426 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1427 x := v_0
1428 if v_1.Op != OpARMSRL {
1429 continue
1430 }
1431 z := v_1.Args[1]
1432 y := v_1.Args[0]
1433 v.reset(OpARMADDshiftRLreg)
1434 v.AddArg3(x, y, z)
1435 return true
1436 }
1437 break
1438 }
1439
1440
1441 for {
1442 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1443 x := v_0
1444 if v_1.Op != OpARMSRA {
1445 continue
1446 }
1447 z := v_1.Args[1]
1448 y := v_1.Args[0]
1449 v.reset(OpARMADDshiftRAreg)
1450 v.AddArg3(x, y, z)
1451 return true
1452 }
1453 break
1454 }
1455
1456
1457 for {
1458 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1459 x := v_0
1460 if v_1.Op != OpARMRSBconst || auxIntToInt32(v_1.AuxInt) != 0 {
1461 continue
1462 }
1463 y := v_1.Args[0]
1464 v.reset(OpARMSUB)
1465 v.AddArg2(x, y)
1466 return true
1467 }
1468 break
1469 }
1470
1471
1472 for {
1473 t := v.Type
1474 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1475 if v_0.Op != OpARMRSBconst {
1476 continue
1477 }
1478 c := auxIntToInt32(v_0.AuxInt)
1479 x := v_0.Args[0]
1480 if v_1.Op != OpARMRSBconst {
1481 continue
1482 }
1483 d := auxIntToInt32(v_1.AuxInt)
1484 y := v_1.Args[0]
1485 v.reset(OpARMRSBconst)
1486 v.AuxInt = int32ToAuxInt(c + d)
1487 v0 := b.NewValue0(v.Pos, OpARMADD, t)
1488 v0.AddArg2(x, y)
1489 v.AddArg(v0)
1490 return true
1491 }
1492 break
1493 }
1494
1495
1496 for {
1497 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1498 if v_0.Op != OpARMMUL {
1499 continue
1500 }
1501 y := v_0.Args[1]
1502 x := v_0.Args[0]
1503 a := v_1
1504 v.reset(OpARMMULA)
1505 v.AddArg3(x, y, a)
1506 return true
1507 }
1508 break
1509 }
1510 return false
1511 }
1512 func rewriteValueARM_OpARMADDD(v *Value) bool {
1513 v_1 := v.Args[1]
1514 v_0 := v.Args[0]
1515
1516
1517
1518 for {
1519 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1520 a := v_0
1521 if v_1.Op != OpARMMULD {
1522 continue
1523 }
1524 y := v_1.Args[1]
1525 x := v_1.Args[0]
1526 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
1527 continue
1528 }
1529 v.reset(OpARMMULAD)
1530 v.AddArg3(a, x, y)
1531 return true
1532 }
1533 break
1534 }
1535
1536
1537
1538 for {
1539 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1540 a := v_0
1541 if v_1.Op != OpARMNMULD {
1542 continue
1543 }
1544 y := v_1.Args[1]
1545 x := v_1.Args[0]
1546 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
1547 continue
1548 }
1549 v.reset(OpARMMULSD)
1550 v.AddArg3(a, x, y)
1551 return true
1552 }
1553 break
1554 }
1555 return false
1556 }
1557 func rewriteValueARM_OpARMADDF(v *Value) bool {
1558 v_1 := v.Args[1]
1559 v_0 := v.Args[0]
1560
1561
1562
1563 for {
1564 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1565 a := v_0
1566 if v_1.Op != OpARMMULF {
1567 continue
1568 }
1569 y := v_1.Args[1]
1570 x := v_1.Args[0]
1571 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
1572 continue
1573 }
1574 v.reset(OpARMMULAF)
1575 v.AddArg3(a, x, y)
1576 return true
1577 }
1578 break
1579 }
1580
1581
1582
1583 for {
1584 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1585 a := v_0
1586 if v_1.Op != OpARMNMULF {
1587 continue
1588 }
1589 y := v_1.Args[1]
1590 x := v_1.Args[0]
1591 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
1592 continue
1593 }
1594 v.reset(OpARMMULSF)
1595 v.AddArg3(a, x, y)
1596 return true
1597 }
1598 break
1599 }
1600 return false
1601 }
1602 func rewriteValueARM_OpARMADDS(v *Value) bool {
1603 v_1 := v.Args[1]
1604 v_0 := v.Args[0]
1605
1606
1607 for {
1608 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1609 x := v_0
1610 if v_1.Op != OpARMMOVWconst {
1611 continue
1612 }
1613 c := auxIntToInt32(v_1.AuxInt)
1614 v.reset(OpARMADDSconst)
1615 v.AuxInt = int32ToAuxInt(c)
1616 v.AddArg(x)
1617 return true
1618 }
1619 break
1620 }
1621
1622
1623 for {
1624 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1625 x := v_0
1626 if v_1.Op != OpARMSLLconst {
1627 continue
1628 }
1629 c := auxIntToInt32(v_1.AuxInt)
1630 y := v_1.Args[0]
1631 v.reset(OpARMADDSshiftLL)
1632 v.AuxInt = int32ToAuxInt(c)
1633 v.AddArg2(x, y)
1634 return true
1635 }
1636 break
1637 }
1638
1639
1640 for {
1641 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1642 x := v_0
1643 if v_1.Op != OpARMSRLconst {
1644 continue
1645 }
1646 c := auxIntToInt32(v_1.AuxInt)
1647 y := v_1.Args[0]
1648 v.reset(OpARMADDSshiftRL)
1649 v.AuxInt = int32ToAuxInt(c)
1650 v.AddArg2(x, y)
1651 return true
1652 }
1653 break
1654 }
1655
1656
1657 for {
1658 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1659 x := v_0
1660 if v_1.Op != OpARMSRAconst {
1661 continue
1662 }
1663 c := auxIntToInt32(v_1.AuxInt)
1664 y := v_1.Args[0]
1665 v.reset(OpARMADDSshiftRA)
1666 v.AuxInt = int32ToAuxInt(c)
1667 v.AddArg2(x, y)
1668 return true
1669 }
1670 break
1671 }
1672
1673
1674 for {
1675 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1676 x := v_0
1677 if v_1.Op != OpARMSLL {
1678 continue
1679 }
1680 z := v_1.Args[1]
1681 y := v_1.Args[0]
1682 v.reset(OpARMADDSshiftLLreg)
1683 v.AddArg3(x, y, z)
1684 return true
1685 }
1686 break
1687 }
1688
1689
1690 for {
1691 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1692 x := v_0
1693 if v_1.Op != OpARMSRL {
1694 continue
1695 }
1696 z := v_1.Args[1]
1697 y := v_1.Args[0]
1698 v.reset(OpARMADDSshiftRLreg)
1699 v.AddArg3(x, y, z)
1700 return true
1701 }
1702 break
1703 }
1704
1705
1706 for {
1707 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1708 x := v_0
1709 if v_1.Op != OpARMSRA {
1710 continue
1711 }
1712 z := v_1.Args[1]
1713 y := v_1.Args[0]
1714 v.reset(OpARMADDSshiftRAreg)
1715 v.AddArg3(x, y, z)
1716 return true
1717 }
1718 break
1719 }
1720 return false
1721 }
1722 func rewriteValueARM_OpARMADDSshiftLL(v *Value) bool {
1723 v_1 := v.Args[1]
1724 v_0 := v.Args[0]
1725 b := v.Block
1726
1727
1728 for {
1729 d := auxIntToInt32(v.AuxInt)
1730 if v_0.Op != OpARMMOVWconst {
1731 break
1732 }
1733 c := auxIntToInt32(v_0.AuxInt)
1734 x := v_1
1735 v.reset(OpARMADDSconst)
1736 v.AuxInt = int32ToAuxInt(c)
1737 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
1738 v0.AuxInt = int32ToAuxInt(d)
1739 v0.AddArg(x)
1740 v.AddArg(v0)
1741 return true
1742 }
1743
1744
1745 for {
1746 d := auxIntToInt32(v.AuxInt)
1747 x := v_0
1748 if v_1.Op != OpARMMOVWconst {
1749 break
1750 }
1751 c := auxIntToInt32(v_1.AuxInt)
1752 v.reset(OpARMADDSconst)
1753 v.AuxInt = int32ToAuxInt(c << uint64(d))
1754 v.AddArg(x)
1755 return true
1756 }
1757 return false
1758 }
1759 func rewriteValueARM_OpARMADDSshiftLLreg(v *Value) bool {
1760 v_2 := v.Args[2]
1761 v_1 := v.Args[1]
1762 v_0 := v.Args[0]
1763 b := v.Block
1764
1765
1766 for {
1767 if v_0.Op != OpARMMOVWconst {
1768 break
1769 }
1770 c := auxIntToInt32(v_0.AuxInt)
1771 x := v_1
1772 y := v_2
1773 v.reset(OpARMADDSconst)
1774 v.AuxInt = int32ToAuxInt(c)
1775 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
1776 v0.AddArg2(x, y)
1777 v.AddArg(v0)
1778 return true
1779 }
1780
1781
1782
1783 for {
1784 x := v_0
1785 y := v_1
1786 if v_2.Op != OpARMMOVWconst {
1787 break
1788 }
1789 c := auxIntToInt32(v_2.AuxInt)
1790 if !(0 <= c && c < 32) {
1791 break
1792 }
1793 v.reset(OpARMADDSshiftLL)
1794 v.AuxInt = int32ToAuxInt(c)
1795 v.AddArg2(x, y)
1796 return true
1797 }
1798 return false
1799 }
1800 func rewriteValueARM_OpARMADDSshiftRA(v *Value) bool {
1801 v_1 := v.Args[1]
1802 v_0 := v.Args[0]
1803 b := v.Block
1804
1805
1806 for {
1807 d := auxIntToInt32(v.AuxInt)
1808 if v_0.Op != OpARMMOVWconst {
1809 break
1810 }
1811 c := auxIntToInt32(v_0.AuxInt)
1812 x := v_1
1813 v.reset(OpARMADDSconst)
1814 v.AuxInt = int32ToAuxInt(c)
1815 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
1816 v0.AuxInt = int32ToAuxInt(d)
1817 v0.AddArg(x)
1818 v.AddArg(v0)
1819 return true
1820 }
1821
1822
1823 for {
1824 d := auxIntToInt32(v.AuxInt)
1825 x := v_0
1826 if v_1.Op != OpARMMOVWconst {
1827 break
1828 }
1829 c := auxIntToInt32(v_1.AuxInt)
1830 v.reset(OpARMADDSconst)
1831 v.AuxInt = int32ToAuxInt(c >> uint64(d))
1832 v.AddArg(x)
1833 return true
1834 }
1835 return false
1836 }
1837 func rewriteValueARM_OpARMADDSshiftRAreg(v *Value) bool {
1838 v_2 := v.Args[2]
1839 v_1 := v.Args[1]
1840 v_0 := v.Args[0]
1841 b := v.Block
1842
1843
1844 for {
1845 if v_0.Op != OpARMMOVWconst {
1846 break
1847 }
1848 c := auxIntToInt32(v_0.AuxInt)
1849 x := v_1
1850 y := v_2
1851 v.reset(OpARMADDSconst)
1852 v.AuxInt = int32ToAuxInt(c)
1853 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
1854 v0.AddArg2(x, y)
1855 v.AddArg(v0)
1856 return true
1857 }
1858
1859
1860
1861 for {
1862 x := v_0
1863 y := v_1
1864 if v_2.Op != OpARMMOVWconst {
1865 break
1866 }
1867 c := auxIntToInt32(v_2.AuxInt)
1868 if !(0 <= c && c < 32) {
1869 break
1870 }
1871 v.reset(OpARMADDSshiftRA)
1872 v.AuxInt = int32ToAuxInt(c)
1873 v.AddArg2(x, y)
1874 return true
1875 }
1876 return false
1877 }
1878 func rewriteValueARM_OpARMADDSshiftRL(v *Value) bool {
1879 v_1 := v.Args[1]
1880 v_0 := v.Args[0]
1881 b := v.Block
1882
1883
1884 for {
1885 d := auxIntToInt32(v.AuxInt)
1886 if v_0.Op != OpARMMOVWconst {
1887 break
1888 }
1889 c := auxIntToInt32(v_0.AuxInt)
1890 x := v_1
1891 v.reset(OpARMADDSconst)
1892 v.AuxInt = int32ToAuxInt(c)
1893 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
1894 v0.AuxInt = int32ToAuxInt(d)
1895 v0.AddArg(x)
1896 v.AddArg(v0)
1897 return true
1898 }
1899
1900
1901 for {
1902 d := auxIntToInt32(v.AuxInt)
1903 x := v_0
1904 if v_1.Op != OpARMMOVWconst {
1905 break
1906 }
1907 c := auxIntToInt32(v_1.AuxInt)
1908 v.reset(OpARMADDSconst)
1909 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
1910 v.AddArg(x)
1911 return true
1912 }
1913 return false
1914 }
1915 func rewriteValueARM_OpARMADDSshiftRLreg(v *Value) bool {
1916 v_2 := v.Args[2]
1917 v_1 := v.Args[1]
1918 v_0 := v.Args[0]
1919 b := v.Block
1920
1921
1922 for {
1923 if v_0.Op != OpARMMOVWconst {
1924 break
1925 }
1926 c := auxIntToInt32(v_0.AuxInt)
1927 x := v_1
1928 y := v_2
1929 v.reset(OpARMADDSconst)
1930 v.AuxInt = int32ToAuxInt(c)
1931 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
1932 v0.AddArg2(x, y)
1933 v.AddArg(v0)
1934 return true
1935 }
1936
1937
1938
1939 for {
1940 x := v_0
1941 y := v_1
1942 if v_2.Op != OpARMMOVWconst {
1943 break
1944 }
1945 c := auxIntToInt32(v_2.AuxInt)
1946 if !(0 <= c && c < 32) {
1947 break
1948 }
1949 v.reset(OpARMADDSshiftRL)
1950 v.AuxInt = int32ToAuxInt(c)
1951 v.AddArg2(x, y)
1952 return true
1953 }
1954 return false
1955 }
1956 func rewriteValueARM_OpARMADDconst(v *Value) bool {
1957 v_0 := v.Args[0]
1958
1959
1960 for {
1961 off1 := auxIntToInt32(v.AuxInt)
1962 if v_0.Op != OpARMMOVWaddr {
1963 break
1964 }
1965 off2 := auxIntToInt32(v_0.AuxInt)
1966 sym := auxToSym(v_0.Aux)
1967 ptr := v_0.Args[0]
1968 v.reset(OpARMMOVWaddr)
1969 v.AuxInt = int32ToAuxInt(off1 + off2)
1970 v.Aux = symToAux(sym)
1971 v.AddArg(ptr)
1972 return true
1973 }
1974
1975
1976 for {
1977 if auxIntToInt32(v.AuxInt) != 0 {
1978 break
1979 }
1980 x := v_0
1981 v.copyOf(x)
1982 return true
1983 }
1984
1985
1986
1987 for {
1988 c := auxIntToInt32(v.AuxInt)
1989 x := v_0
1990 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) {
1991 break
1992 }
1993 v.reset(OpARMSUBconst)
1994 v.AuxInt = int32ToAuxInt(-c)
1995 v.AddArg(x)
1996 return true
1997 }
1998
1999
2000
2001 for {
2002 c := auxIntToInt32(v.AuxInt)
2003 x := v_0
2004 if !(buildcfg.GOARM.Version == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && uint32(-c) <= 0xffff) {
2005 break
2006 }
2007 v.reset(OpARMSUBconst)
2008 v.AuxInt = int32ToAuxInt(-c)
2009 v.AddArg(x)
2010 return true
2011 }
2012
2013
2014 for {
2015 c := auxIntToInt32(v.AuxInt)
2016 if v_0.Op != OpARMMOVWconst {
2017 break
2018 }
2019 d := auxIntToInt32(v_0.AuxInt)
2020 v.reset(OpARMMOVWconst)
2021 v.AuxInt = int32ToAuxInt(c + d)
2022 return true
2023 }
2024
2025
2026 for {
2027 c := auxIntToInt32(v.AuxInt)
2028 if v_0.Op != OpARMADDconst {
2029 break
2030 }
2031 d := auxIntToInt32(v_0.AuxInt)
2032 x := v_0.Args[0]
2033 v.reset(OpARMADDconst)
2034 v.AuxInt = int32ToAuxInt(c + d)
2035 v.AddArg(x)
2036 return true
2037 }
2038
2039
2040 for {
2041 c := auxIntToInt32(v.AuxInt)
2042 if v_0.Op != OpARMSUBconst {
2043 break
2044 }
2045 d := auxIntToInt32(v_0.AuxInt)
2046 x := v_0.Args[0]
2047 v.reset(OpARMADDconst)
2048 v.AuxInt = int32ToAuxInt(c - d)
2049 v.AddArg(x)
2050 return true
2051 }
2052
2053
2054 for {
2055 c := auxIntToInt32(v.AuxInt)
2056 if v_0.Op != OpARMRSBconst {
2057 break
2058 }
2059 d := auxIntToInt32(v_0.AuxInt)
2060 x := v_0.Args[0]
2061 v.reset(OpARMRSBconst)
2062 v.AuxInt = int32ToAuxInt(c + d)
2063 v.AddArg(x)
2064 return true
2065 }
2066 return false
2067 }
2068 func rewriteValueARM_OpARMADDshiftLL(v *Value) bool {
2069 v_1 := v.Args[1]
2070 v_0 := v.Args[0]
2071 b := v.Block
2072 typ := &b.Func.Config.Types
2073
2074
2075 for {
2076 d := auxIntToInt32(v.AuxInt)
2077 if v_0.Op != OpARMMOVWconst {
2078 break
2079 }
2080 c := auxIntToInt32(v_0.AuxInt)
2081 x := v_1
2082 v.reset(OpARMADDconst)
2083 v.AuxInt = int32ToAuxInt(c)
2084 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
2085 v0.AuxInt = int32ToAuxInt(d)
2086 v0.AddArg(x)
2087 v.AddArg(v0)
2088 return true
2089 }
2090
2091
2092 for {
2093 d := auxIntToInt32(v.AuxInt)
2094 x := v_0
2095 if v_1.Op != OpARMMOVWconst {
2096 break
2097 }
2098 c := auxIntToInt32(v_1.AuxInt)
2099 v.reset(OpARMADDconst)
2100 v.AuxInt = int32ToAuxInt(c << uint64(d))
2101 v.AddArg(x)
2102 return true
2103 }
2104
2105
2106 for {
2107 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)) {
2108 break
2109 }
2110 x := v_0.Args[0]
2111 if x != v_1 {
2112 break
2113 }
2114 v.reset(OpARMREV16)
2115 v.AddArg(x)
2116 return true
2117 }
2118
2119
2120
2121 for {
2122 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMSRLconst || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != 24 {
2123 break
2124 }
2125 v_0_0 := v_0.Args[0]
2126 if v_0_0.Op != OpARMSLLconst || auxIntToInt32(v_0_0.AuxInt) != 16 {
2127 break
2128 }
2129 x := v_0_0.Args[0]
2130 if x != v_1 || !(buildcfg.GOARM.Version >= 6) {
2131 break
2132 }
2133 v.reset(OpARMREV16)
2134 v.AddArg(x)
2135 return true
2136 }
2137 return false
2138 }
2139 func rewriteValueARM_OpARMADDshiftLLreg(v *Value) bool {
2140 v_2 := v.Args[2]
2141 v_1 := v.Args[1]
2142 v_0 := v.Args[0]
2143 b := v.Block
2144
2145
2146 for {
2147 if v_0.Op != OpARMMOVWconst {
2148 break
2149 }
2150 c := auxIntToInt32(v_0.AuxInt)
2151 x := v_1
2152 y := v_2
2153 v.reset(OpARMADDconst)
2154 v.AuxInt = int32ToAuxInt(c)
2155 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
2156 v0.AddArg2(x, y)
2157 v.AddArg(v0)
2158 return true
2159 }
2160
2161
2162
2163 for {
2164 x := v_0
2165 y := v_1
2166 if v_2.Op != OpARMMOVWconst {
2167 break
2168 }
2169 c := auxIntToInt32(v_2.AuxInt)
2170 if !(0 <= c && c < 32) {
2171 break
2172 }
2173 v.reset(OpARMADDshiftLL)
2174 v.AuxInt = int32ToAuxInt(c)
2175 v.AddArg2(x, y)
2176 return true
2177 }
2178 return false
2179 }
2180 func rewriteValueARM_OpARMADDshiftRA(v *Value) bool {
2181 v_1 := v.Args[1]
2182 v_0 := v.Args[0]
2183 b := v.Block
2184
2185
2186 for {
2187 d := auxIntToInt32(v.AuxInt)
2188 if v_0.Op != OpARMMOVWconst {
2189 break
2190 }
2191 c := auxIntToInt32(v_0.AuxInt)
2192 x := v_1
2193 v.reset(OpARMADDconst)
2194 v.AuxInt = int32ToAuxInt(c)
2195 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
2196 v0.AuxInt = int32ToAuxInt(d)
2197 v0.AddArg(x)
2198 v.AddArg(v0)
2199 return true
2200 }
2201
2202
2203 for {
2204 d := auxIntToInt32(v.AuxInt)
2205 x := v_0
2206 if v_1.Op != OpARMMOVWconst {
2207 break
2208 }
2209 c := auxIntToInt32(v_1.AuxInt)
2210 v.reset(OpARMADDconst)
2211 v.AuxInt = int32ToAuxInt(c >> uint64(d))
2212 v.AddArg(x)
2213 return true
2214 }
2215 return false
2216 }
2217 func rewriteValueARM_OpARMADDshiftRAreg(v *Value) bool {
2218 v_2 := v.Args[2]
2219 v_1 := v.Args[1]
2220 v_0 := v.Args[0]
2221 b := v.Block
2222
2223
2224 for {
2225 if v_0.Op != OpARMMOVWconst {
2226 break
2227 }
2228 c := auxIntToInt32(v_0.AuxInt)
2229 x := v_1
2230 y := v_2
2231 v.reset(OpARMADDconst)
2232 v.AuxInt = int32ToAuxInt(c)
2233 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
2234 v0.AddArg2(x, y)
2235 v.AddArg(v0)
2236 return true
2237 }
2238
2239
2240
2241 for {
2242 x := v_0
2243 y := v_1
2244 if v_2.Op != OpARMMOVWconst {
2245 break
2246 }
2247 c := auxIntToInt32(v_2.AuxInt)
2248 if !(0 <= c && c < 32) {
2249 break
2250 }
2251 v.reset(OpARMADDshiftRA)
2252 v.AuxInt = int32ToAuxInt(c)
2253 v.AddArg2(x, y)
2254 return true
2255 }
2256 return false
2257 }
2258 func rewriteValueARM_OpARMADDshiftRL(v *Value) bool {
2259 v_1 := v.Args[1]
2260 v_0 := v.Args[0]
2261 b := v.Block
2262
2263
2264 for {
2265 d := auxIntToInt32(v.AuxInt)
2266 if v_0.Op != OpARMMOVWconst {
2267 break
2268 }
2269 c := auxIntToInt32(v_0.AuxInt)
2270 x := v_1
2271 v.reset(OpARMADDconst)
2272 v.AuxInt = int32ToAuxInt(c)
2273 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
2274 v0.AuxInt = int32ToAuxInt(d)
2275 v0.AddArg(x)
2276 v.AddArg(v0)
2277 return true
2278 }
2279
2280
2281 for {
2282 d := auxIntToInt32(v.AuxInt)
2283 x := v_0
2284 if v_1.Op != OpARMMOVWconst {
2285 break
2286 }
2287 c := auxIntToInt32(v_1.AuxInt)
2288 v.reset(OpARMADDconst)
2289 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
2290 v.AddArg(x)
2291 return true
2292 }
2293 return false
2294 }
2295 func rewriteValueARM_OpARMADDshiftRLreg(v *Value) bool {
2296 v_2 := v.Args[2]
2297 v_1 := v.Args[1]
2298 v_0 := v.Args[0]
2299 b := v.Block
2300
2301
2302 for {
2303 if v_0.Op != OpARMMOVWconst {
2304 break
2305 }
2306 c := auxIntToInt32(v_0.AuxInt)
2307 x := v_1
2308 y := v_2
2309 v.reset(OpARMADDconst)
2310 v.AuxInt = int32ToAuxInt(c)
2311 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
2312 v0.AddArg2(x, y)
2313 v.AddArg(v0)
2314 return true
2315 }
2316
2317
2318
2319 for {
2320 x := v_0
2321 y := v_1
2322 if v_2.Op != OpARMMOVWconst {
2323 break
2324 }
2325 c := auxIntToInt32(v_2.AuxInt)
2326 if !(0 <= c && c < 32) {
2327 break
2328 }
2329 v.reset(OpARMADDshiftRL)
2330 v.AuxInt = int32ToAuxInt(c)
2331 v.AddArg2(x, y)
2332 return true
2333 }
2334 return false
2335 }
2336 func rewriteValueARM_OpARMAND(v *Value) bool {
2337 v_1 := v.Args[1]
2338 v_0 := v.Args[0]
2339
2340
2341 for {
2342 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2343 x := v_0
2344 if v_1.Op != OpARMMOVWconst {
2345 continue
2346 }
2347 c := auxIntToInt32(v_1.AuxInt)
2348 v.reset(OpARMANDconst)
2349 v.AuxInt = int32ToAuxInt(c)
2350 v.AddArg(x)
2351 return true
2352 }
2353 break
2354 }
2355
2356
2357 for {
2358 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2359 x := v_0
2360 if v_1.Op != OpARMSLLconst {
2361 continue
2362 }
2363 c := auxIntToInt32(v_1.AuxInt)
2364 y := v_1.Args[0]
2365 v.reset(OpARMANDshiftLL)
2366 v.AuxInt = int32ToAuxInt(c)
2367 v.AddArg2(x, y)
2368 return true
2369 }
2370 break
2371 }
2372
2373
2374 for {
2375 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2376 x := v_0
2377 if v_1.Op != OpARMSRLconst {
2378 continue
2379 }
2380 c := auxIntToInt32(v_1.AuxInt)
2381 y := v_1.Args[0]
2382 v.reset(OpARMANDshiftRL)
2383 v.AuxInt = int32ToAuxInt(c)
2384 v.AddArg2(x, y)
2385 return true
2386 }
2387 break
2388 }
2389
2390
2391 for {
2392 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2393 x := v_0
2394 if v_1.Op != OpARMSRAconst {
2395 continue
2396 }
2397 c := auxIntToInt32(v_1.AuxInt)
2398 y := v_1.Args[0]
2399 v.reset(OpARMANDshiftRA)
2400 v.AuxInt = int32ToAuxInt(c)
2401 v.AddArg2(x, y)
2402 return true
2403 }
2404 break
2405 }
2406
2407
2408 for {
2409 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2410 x := v_0
2411 if v_1.Op != OpARMSLL {
2412 continue
2413 }
2414 z := v_1.Args[1]
2415 y := v_1.Args[0]
2416 v.reset(OpARMANDshiftLLreg)
2417 v.AddArg3(x, y, z)
2418 return true
2419 }
2420 break
2421 }
2422
2423
2424 for {
2425 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2426 x := v_0
2427 if v_1.Op != OpARMSRL {
2428 continue
2429 }
2430 z := v_1.Args[1]
2431 y := v_1.Args[0]
2432 v.reset(OpARMANDshiftRLreg)
2433 v.AddArg3(x, y, z)
2434 return true
2435 }
2436 break
2437 }
2438
2439
2440 for {
2441 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2442 x := v_0
2443 if v_1.Op != OpARMSRA {
2444 continue
2445 }
2446 z := v_1.Args[1]
2447 y := v_1.Args[0]
2448 v.reset(OpARMANDshiftRAreg)
2449 v.AddArg3(x, y, z)
2450 return true
2451 }
2452 break
2453 }
2454
2455
2456 for {
2457 x := v_0
2458 if x != v_1 {
2459 break
2460 }
2461 v.copyOf(x)
2462 return true
2463 }
2464
2465
2466 for {
2467 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2468 x := v_0
2469 if v_1.Op != OpARMMVN {
2470 continue
2471 }
2472 y := v_1.Args[0]
2473 v.reset(OpARMBIC)
2474 v.AddArg2(x, y)
2475 return true
2476 }
2477 break
2478 }
2479
2480
2481 for {
2482 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2483 x := v_0
2484 if v_1.Op != OpARMMVNshiftLL {
2485 continue
2486 }
2487 c := auxIntToInt32(v_1.AuxInt)
2488 y := v_1.Args[0]
2489 v.reset(OpARMBICshiftLL)
2490 v.AuxInt = int32ToAuxInt(c)
2491 v.AddArg2(x, y)
2492 return true
2493 }
2494 break
2495 }
2496
2497
2498 for {
2499 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2500 x := v_0
2501 if v_1.Op != OpARMMVNshiftRL {
2502 continue
2503 }
2504 c := auxIntToInt32(v_1.AuxInt)
2505 y := v_1.Args[0]
2506 v.reset(OpARMBICshiftRL)
2507 v.AuxInt = int32ToAuxInt(c)
2508 v.AddArg2(x, y)
2509 return true
2510 }
2511 break
2512 }
2513
2514
2515 for {
2516 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2517 x := v_0
2518 if v_1.Op != OpARMMVNshiftRA {
2519 continue
2520 }
2521 c := auxIntToInt32(v_1.AuxInt)
2522 y := v_1.Args[0]
2523 v.reset(OpARMBICshiftRA)
2524 v.AuxInt = int32ToAuxInt(c)
2525 v.AddArg2(x, y)
2526 return true
2527 }
2528 break
2529 }
2530 return false
2531 }
2532 func rewriteValueARM_OpARMANDconst(v *Value) bool {
2533 v_0 := v.Args[0]
2534
2535
2536 for {
2537 if auxIntToInt32(v.AuxInt) != 0 {
2538 break
2539 }
2540 v.reset(OpARMMOVWconst)
2541 v.AuxInt = int32ToAuxInt(0)
2542 return true
2543 }
2544
2545
2546
2547 for {
2548 c := auxIntToInt32(v.AuxInt)
2549 x := v_0
2550 if !(int32(c) == -1) {
2551 break
2552 }
2553 v.copyOf(x)
2554 return true
2555 }
2556
2557
2558
2559 for {
2560 c := auxIntToInt32(v.AuxInt)
2561 x := v_0
2562 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) {
2563 break
2564 }
2565 v.reset(OpARMBICconst)
2566 v.AuxInt = int32ToAuxInt(int32(^uint32(c)))
2567 v.AddArg(x)
2568 return true
2569 }
2570
2571
2572
2573 for {
2574 c := auxIntToInt32(v.AuxInt)
2575 x := v_0
2576 if !(buildcfg.GOARM.Version == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && ^uint32(c) <= 0xffff) {
2577 break
2578 }
2579 v.reset(OpARMBICconst)
2580 v.AuxInt = int32ToAuxInt(int32(^uint32(c)))
2581 v.AddArg(x)
2582 return true
2583 }
2584
2585
2586 for {
2587 c := auxIntToInt32(v.AuxInt)
2588 if v_0.Op != OpARMMOVWconst {
2589 break
2590 }
2591 d := auxIntToInt32(v_0.AuxInt)
2592 v.reset(OpARMMOVWconst)
2593 v.AuxInt = int32ToAuxInt(c & d)
2594 return true
2595 }
2596
2597
2598 for {
2599 c := auxIntToInt32(v.AuxInt)
2600 if v_0.Op != OpARMANDconst {
2601 break
2602 }
2603 d := auxIntToInt32(v_0.AuxInt)
2604 x := v_0.Args[0]
2605 v.reset(OpARMANDconst)
2606 v.AuxInt = int32ToAuxInt(c & d)
2607 v.AddArg(x)
2608 return true
2609 }
2610 return false
2611 }
2612 func rewriteValueARM_OpARMANDshiftLL(v *Value) bool {
2613 v_1 := v.Args[1]
2614 v_0 := v.Args[0]
2615 b := v.Block
2616
2617
2618 for {
2619 d := auxIntToInt32(v.AuxInt)
2620 if v_0.Op != OpARMMOVWconst {
2621 break
2622 }
2623 c := auxIntToInt32(v_0.AuxInt)
2624 x := v_1
2625 v.reset(OpARMANDconst)
2626 v.AuxInt = int32ToAuxInt(c)
2627 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
2628 v0.AuxInt = int32ToAuxInt(d)
2629 v0.AddArg(x)
2630 v.AddArg(v0)
2631 return true
2632 }
2633
2634
2635 for {
2636 d := auxIntToInt32(v.AuxInt)
2637 x := v_0
2638 if v_1.Op != OpARMMOVWconst {
2639 break
2640 }
2641 c := auxIntToInt32(v_1.AuxInt)
2642 v.reset(OpARMANDconst)
2643 v.AuxInt = int32ToAuxInt(c << uint64(d))
2644 v.AddArg(x)
2645 return true
2646 }
2647
2648
2649 for {
2650 c := auxIntToInt32(v.AuxInt)
2651 y := v_0
2652 if y.Op != OpARMSLLconst || auxIntToInt32(y.AuxInt) != c {
2653 break
2654 }
2655 x := y.Args[0]
2656 if x != v_1 {
2657 break
2658 }
2659 v.copyOf(y)
2660 return true
2661 }
2662 return false
2663 }
2664 func rewriteValueARM_OpARMANDshiftLLreg(v *Value) bool {
2665 v_2 := v.Args[2]
2666 v_1 := v.Args[1]
2667 v_0 := v.Args[0]
2668 b := v.Block
2669
2670
2671 for {
2672 if v_0.Op != OpARMMOVWconst {
2673 break
2674 }
2675 c := auxIntToInt32(v_0.AuxInt)
2676 x := v_1
2677 y := v_2
2678 v.reset(OpARMANDconst)
2679 v.AuxInt = int32ToAuxInt(c)
2680 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
2681 v0.AddArg2(x, y)
2682 v.AddArg(v0)
2683 return true
2684 }
2685
2686
2687
2688 for {
2689 x := v_0
2690 y := v_1
2691 if v_2.Op != OpARMMOVWconst {
2692 break
2693 }
2694 c := auxIntToInt32(v_2.AuxInt)
2695 if !(0 <= c && c < 32) {
2696 break
2697 }
2698 v.reset(OpARMANDshiftLL)
2699 v.AuxInt = int32ToAuxInt(c)
2700 v.AddArg2(x, y)
2701 return true
2702 }
2703 return false
2704 }
2705 func rewriteValueARM_OpARMANDshiftRA(v *Value) bool {
2706 v_1 := v.Args[1]
2707 v_0 := v.Args[0]
2708 b := v.Block
2709
2710
2711 for {
2712 d := auxIntToInt32(v.AuxInt)
2713 if v_0.Op != OpARMMOVWconst {
2714 break
2715 }
2716 c := auxIntToInt32(v_0.AuxInt)
2717 x := v_1
2718 v.reset(OpARMANDconst)
2719 v.AuxInt = int32ToAuxInt(c)
2720 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
2721 v0.AuxInt = int32ToAuxInt(d)
2722 v0.AddArg(x)
2723 v.AddArg(v0)
2724 return true
2725 }
2726
2727
2728 for {
2729 d := auxIntToInt32(v.AuxInt)
2730 x := v_0
2731 if v_1.Op != OpARMMOVWconst {
2732 break
2733 }
2734 c := auxIntToInt32(v_1.AuxInt)
2735 v.reset(OpARMANDconst)
2736 v.AuxInt = int32ToAuxInt(c >> uint64(d))
2737 v.AddArg(x)
2738 return true
2739 }
2740
2741
2742 for {
2743 c := auxIntToInt32(v.AuxInt)
2744 y := v_0
2745 if y.Op != OpARMSRAconst || auxIntToInt32(y.AuxInt) != c {
2746 break
2747 }
2748 x := y.Args[0]
2749 if x != v_1 {
2750 break
2751 }
2752 v.copyOf(y)
2753 return true
2754 }
2755 return false
2756 }
2757 func rewriteValueARM_OpARMANDshiftRAreg(v *Value) bool {
2758 v_2 := v.Args[2]
2759 v_1 := v.Args[1]
2760 v_0 := v.Args[0]
2761 b := v.Block
2762
2763
2764 for {
2765 if v_0.Op != OpARMMOVWconst {
2766 break
2767 }
2768 c := auxIntToInt32(v_0.AuxInt)
2769 x := v_1
2770 y := v_2
2771 v.reset(OpARMANDconst)
2772 v.AuxInt = int32ToAuxInt(c)
2773 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
2774 v0.AddArg2(x, y)
2775 v.AddArg(v0)
2776 return true
2777 }
2778
2779
2780
2781 for {
2782 x := v_0
2783 y := v_1
2784 if v_2.Op != OpARMMOVWconst {
2785 break
2786 }
2787 c := auxIntToInt32(v_2.AuxInt)
2788 if !(0 <= c && c < 32) {
2789 break
2790 }
2791 v.reset(OpARMANDshiftRA)
2792 v.AuxInt = int32ToAuxInt(c)
2793 v.AddArg2(x, y)
2794 return true
2795 }
2796 return false
2797 }
2798 func rewriteValueARM_OpARMANDshiftRL(v *Value) bool {
2799 v_1 := v.Args[1]
2800 v_0 := v.Args[0]
2801 b := v.Block
2802
2803
2804 for {
2805 d := auxIntToInt32(v.AuxInt)
2806 if v_0.Op != OpARMMOVWconst {
2807 break
2808 }
2809 c := auxIntToInt32(v_0.AuxInt)
2810 x := v_1
2811 v.reset(OpARMANDconst)
2812 v.AuxInt = int32ToAuxInt(c)
2813 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
2814 v0.AuxInt = int32ToAuxInt(d)
2815 v0.AddArg(x)
2816 v.AddArg(v0)
2817 return true
2818 }
2819
2820
2821 for {
2822 d := auxIntToInt32(v.AuxInt)
2823 x := v_0
2824 if v_1.Op != OpARMMOVWconst {
2825 break
2826 }
2827 c := auxIntToInt32(v_1.AuxInt)
2828 v.reset(OpARMANDconst)
2829 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
2830 v.AddArg(x)
2831 return true
2832 }
2833
2834
2835 for {
2836 c := auxIntToInt32(v.AuxInt)
2837 y := v_0
2838 if y.Op != OpARMSRLconst || auxIntToInt32(y.AuxInt) != c {
2839 break
2840 }
2841 x := y.Args[0]
2842 if x != v_1 {
2843 break
2844 }
2845 v.copyOf(y)
2846 return true
2847 }
2848 return false
2849 }
2850 func rewriteValueARM_OpARMANDshiftRLreg(v *Value) bool {
2851 v_2 := v.Args[2]
2852 v_1 := v.Args[1]
2853 v_0 := v.Args[0]
2854 b := v.Block
2855
2856
2857 for {
2858 if v_0.Op != OpARMMOVWconst {
2859 break
2860 }
2861 c := auxIntToInt32(v_0.AuxInt)
2862 x := v_1
2863 y := v_2
2864 v.reset(OpARMANDconst)
2865 v.AuxInt = int32ToAuxInt(c)
2866 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
2867 v0.AddArg2(x, y)
2868 v.AddArg(v0)
2869 return true
2870 }
2871
2872
2873
2874 for {
2875 x := v_0
2876 y := v_1
2877 if v_2.Op != OpARMMOVWconst {
2878 break
2879 }
2880 c := auxIntToInt32(v_2.AuxInt)
2881 if !(0 <= c && c < 32) {
2882 break
2883 }
2884 v.reset(OpARMANDshiftRL)
2885 v.AuxInt = int32ToAuxInt(c)
2886 v.AddArg2(x, y)
2887 return true
2888 }
2889 return false
2890 }
2891 func rewriteValueARM_OpARMBFX(v *Value) bool {
2892 v_0 := v.Args[0]
2893
2894
2895 for {
2896 c := auxIntToInt32(v.AuxInt)
2897 if v_0.Op != OpARMMOVWconst {
2898 break
2899 }
2900 d := auxIntToInt32(v_0.AuxInt)
2901 v.reset(OpARMMOVWconst)
2902 v.AuxInt = int32ToAuxInt(d << (32 - uint32(c&0xff) - uint32(c>>8)) >> (32 - uint32(c>>8)))
2903 return true
2904 }
2905 return false
2906 }
2907 func rewriteValueARM_OpARMBFXU(v *Value) bool {
2908 v_0 := v.Args[0]
2909
2910
2911 for {
2912 c := auxIntToInt32(v.AuxInt)
2913 if v_0.Op != OpARMMOVWconst {
2914 break
2915 }
2916 d := auxIntToInt32(v_0.AuxInt)
2917 v.reset(OpARMMOVWconst)
2918 v.AuxInt = int32ToAuxInt(int32(uint32(d) << (32 - uint32(c&0xff) - uint32(c>>8)) >> (32 - uint32(c>>8))))
2919 return true
2920 }
2921 return false
2922 }
2923 func rewriteValueARM_OpARMBIC(v *Value) bool {
2924 v_1 := v.Args[1]
2925 v_0 := v.Args[0]
2926
2927
2928 for {
2929 x := v_0
2930 if v_1.Op != OpARMMOVWconst {
2931 break
2932 }
2933 c := auxIntToInt32(v_1.AuxInt)
2934 v.reset(OpARMBICconst)
2935 v.AuxInt = int32ToAuxInt(c)
2936 v.AddArg(x)
2937 return true
2938 }
2939
2940
2941 for {
2942 x := v_0
2943 if v_1.Op != OpARMSLLconst {
2944 break
2945 }
2946 c := auxIntToInt32(v_1.AuxInt)
2947 y := v_1.Args[0]
2948 v.reset(OpARMBICshiftLL)
2949 v.AuxInt = int32ToAuxInt(c)
2950 v.AddArg2(x, y)
2951 return true
2952 }
2953
2954
2955 for {
2956 x := v_0
2957 if v_1.Op != OpARMSRLconst {
2958 break
2959 }
2960 c := auxIntToInt32(v_1.AuxInt)
2961 y := v_1.Args[0]
2962 v.reset(OpARMBICshiftRL)
2963 v.AuxInt = int32ToAuxInt(c)
2964 v.AddArg2(x, y)
2965 return true
2966 }
2967
2968
2969 for {
2970 x := v_0
2971 if v_1.Op != OpARMSRAconst {
2972 break
2973 }
2974 c := auxIntToInt32(v_1.AuxInt)
2975 y := v_1.Args[0]
2976 v.reset(OpARMBICshiftRA)
2977 v.AuxInt = int32ToAuxInt(c)
2978 v.AddArg2(x, y)
2979 return true
2980 }
2981
2982
2983 for {
2984 x := v_0
2985 if v_1.Op != OpARMSLL {
2986 break
2987 }
2988 z := v_1.Args[1]
2989 y := v_1.Args[0]
2990 v.reset(OpARMBICshiftLLreg)
2991 v.AddArg3(x, y, z)
2992 return true
2993 }
2994
2995
2996 for {
2997 x := v_0
2998 if v_1.Op != OpARMSRL {
2999 break
3000 }
3001 z := v_1.Args[1]
3002 y := v_1.Args[0]
3003 v.reset(OpARMBICshiftRLreg)
3004 v.AddArg3(x, y, z)
3005 return true
3006 }
3007
3008
3009 for {
3010 x := v_0
3011 if v_1.Op != OpARMSRA {
3012 break
3013 }
3014 z := v_1.Args[1]
3015 y := v_1.Args[0]
3016 v.reset(OpARMBICshiftRAreg)
3017 v.AddArg3(x, y, z)
3018 return true
3019 }
3020
3021
3022 for {
3023 x := v_0
3024 if x != v_1 {
3025 break
3026 }
3027 v.reset(OpARMMOVWconst)
3028 v.AuxInt = int32ToAuxInt(0)
3029 return true
3030 }
3031 return false
3032 }
3033 func rewriteValueARM_OpARMBICconst(v *Value) bool {
3034 v_0 := v.Args[0]
3035
3036
3037 for {
3038 if auxIntToInt32(v.AuxInt) != 0 {
3039 break
3040 }
3041 x := v_0
3042 v.copyOf(x)
3043 return true
3044 }
3045
3046
3047
3048 for {
3049 c := auxIntToInt32(v.AuxInt)
3050 if !(int32(c) == -1) {
3051 break
3052 }
3053 v.reset(OpARMMOVWconst)
3054 v.AuxInt = int32ToAuxInt(0)
3055 return true
3056 }
3057
3058
3059
3060 for {
3061 c := auxIntToInt32(v.AuxInt)
3062 x := v_0
3063 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) {
3064 break
3065 }
3066 v.reset(OpARMANDconst)
3067 v.AuxInt = int32ToAuxInt(int32(^uint32(c)))
3068 v.AddArg(x)
3069 return true
3070 }
3071
3072
3073
3074 for {
3075 c := auxIntToInt32(v.AuxInt)
3076 x := v_0
3077 if !(buildcfg.GOARM.Version == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && ^uint32(c) <= 0xffff) {
3078 break
3079 }
3080 v.reset(OpARMANDconst)
3081 v.AuxInt = int32ToAuxInt(int32(^uint32(c)))
3082 v.AddArg(x)
3083 return true
3084 }
3085
3086
3087 for {
3088 c := auxIntToInt32(v.AuxInt)
3089 if v_0.Op != OpARMMOVWconst {
3090 break
3091 }
3092 d := auxIntToInt32(v_0.AuxInt)
3093 v.reset(OpARMMOVWconst)
3094 v.AuxInt = int32ToAuxInt(d &^ c)
3095 return true
3096 }
3097
3098
3099 for {
3100 c := auxIntToInt32(v.AuxInt)
3101 if v_0.Op != OpARMBICconst {
3102 break
3103 }
3104 d := auxIntToInt32(v_0.AuxInt)
3105 x := v_0.Args[0]
3106 v.reset(OpARMBICconst)
3107 v.AuxInt = int32ToAuxInt(c | d)
3108 v.AddArg(x)
3109 return true
3110 }
3111 return false
3112 }
3113 func rewriteValueARM_OpARMBICshiftLL(v *Value) bool {
3114 v_1 := v.Args[1]
3115 v_0 := v.Args[0]
3116
3117
3118 for {
3119 d := auxIntToInt32(v.AuxInt)
3120 x := v_0
3121 if v_1.Op != OpARMMOVWconst {
3122 break
3123 }
3124 c := auxIntToInt32(v_1.AuxInt)
3125 v.reset(OpARMBICconst)
3126 v.AuxInt = int32ToAuxInt(c << uint64(d))
3127 v.AddArg(x)
3128 return true
3129 }
3130
3131
3132 for {
3133 c := auxIntToInt32(v.AuxInt)
3134 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c {
3135 break
3136 }
3137 x := v_0.Args[0]
3138 if x != v_1 {
3139 break
3140 }
3141 v.reset(OpARMMOVWconst)
3142 v.AuxInt = int32ToAuxInt(0)
3143 return true
3144 }
3145 return false
3146 }
3147 func rewriteValueARM_OpARMBICshiftLLreg(v *Value) bool {
3148 v_2 := v.Args[2]
3149 v_1 := v.Args[1]
3150 v_0 := v.Args[0]
3151
3152
3153
3154 for {
3155 x := v_0
3156 y := v_1
3157 if v_2.Op != OpARMMOVWconst {
3158 break
3159 }
3160 c := auxIntToInt32(v_2.AuxInt)
3161 if !(0 <= c && c < 32) {
3162 break
3163 }
3164 v.reset(OpARMBICshiftLL)
3165 v.AuxInt = int32ToAuxInt(c)
3166 v.AddArg2(x, y)
3167 return true
3168 }
3169 return false
3170 }
3171 func rewriteValueARM_OpARMBICshiftRA(v *Value) bool {
3172 v_1 := v.Args[1]
3173 v_0 := v.Args[0]
3174
3175
3176 for {
3177 d := auxIntToInt32(v.AuxInt)
3178 x := v_0
3179 if v_1.Op != OpARMMOVWconst {
3180 break
3181 }
3182 c := auxIntToInt32(v_1.AuxInt)
3183 v.reset(OpARMBICconst)
3184 v.AuxInt = int32ToAuxInt(c >> uint64(d))
3185 v.AddArg(x)
3186 return true
3187 }
3188
3189
3190 for {
3191 c := auxIntToInt32(v.AuxInt)
3192 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c {
3193 break
3194 }
3195 x := v_0.Args[0]
3196 if x != v_1 {
3197 break
3198 }
3199 v.reset(OpARMMOVWconst)
3200 v.AuxInt = int32ToAuxInt(0)
3201 return true
3202 }
3203 return false
3204 }
3205 func rewriteValueARM_OpARMBICshiftRAreg(v *Value) bool {
3206 v_2 := v.Args[2]
3207 v_1 := v.Args[1]
3208 v_0 := v.Args[0]
3209
3210
3211
3212 for {
3213 x := v_0
3214 y := v_1
3215 if v_2.Op != OpARMMOVWconst {
3216 break
3217 }
3218 c := auxIntToInt32(v_2.AuxInt)
3219 if !(0 <= c && c < 32) {
3220 break
3221 }
3222 v.reset(OpARMBICshiftRA)
3223 v.AuxInt = int32ToAuxInt(c)
3224 v.AddArg2(x, y)
3225 return true
3226 }
3227 return false
3228 }
3229 func rewriteValueARM_OpARMBICshiftRL(v *Value) bool {
3230 v_1 := v.Args[1]
3231 v_0 := v.Args[0]
3232
3233
3234 for {
3235 d := auxIntToInt32(v.AuxInt)
3236 x := v_0
3237 if v_1.Op != OpARMMOVWconst {
3238 break
3239 }
3240 c := auxIntToInt32(v_1.AuxInt)
3241 v.reset(OpARMBICconst)
3242 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
3243 v.AddArg(x)
3244 return true
3245 }
3246
3247
3248 for {
3249 c := auxIntToInt32(v.AuxInt)
3250 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c {
3251 break
3252 }
3253 x := v_0.Args[0]
3254 if x != v_1 {
3255 break
3256 }
3257 v.reset(OpARMMOVWconst)
3258 v.AuxInt = int32ToAuxInt(0)
3259 return true
3260 }
3261 return false
3262 }
3263 func rewriteValueARM_OpARMBICshiftRLreg(v *Value) bool {
3264 v_2 := v.Args[2]
3265 v_1 := v.Args[1]
3266 v_0 := v.Args[0]
3267
3268
3269
3270 for {
3271 x := v_0
3272 y := v_1
3273 if v_2.Op != OpARMMOVWconst {
3274 break
3275 }
3276 c := auxIntToInt32(v_2.AuxInt)
3277 if !(0 <= c && c < 32) {
3278 break
3279 }
3280 v.reset(OpARMBICshiftRL)
3281 v.AuxInt = int32ToAuxInt(c)
3282 v.AddArg2(x, y)
3283 return true
3284 }
3285 return false
3286 }
3287 func rewriteValueARM_OpARMCMN(v *Value) bool {
3288 v_1 := v.Args[1]
3289 v_0 := v.Args[0]
3290
3291
3292 for {
3293 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3294 x := v_0
3295 if v_1.Op != OpARMMOVWconst {
3296 continue
3297 }
3298 c := auxIntToInt32(v_1.AuxInt)
3299 v.reset(OpARMCMNconst)
3300 v.AuxInt = int32ToAuxInt(c)
3301 v.AddArg(x)
3302 return true
3303 }
3304 break
3305 }
3306
3307
3308 for {
3309 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3310 x := v_0
3311 if v_1.Op != OpARMSLLconst {
3312 continue
3313 }
3314 c := auxIntToInt32(v_1.AuxInt)
3315 y := v_1.Args[0]
3316 v.reset(OpARMCMNshiftLL)
3317 v.AuxInt = int32ToAuxInt(c)
3318 v.AddArg2(x, y)
3319 return true
3320 }
3321 break
3322 }
3323
3324
3325 for {
3326 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3327 x := v_0
3328 if v_1.Op != OpARMSRLconst {
3329 continue
3330 }
3331 c := auxIntToInt32(v_1.AuxInt)
3332 y := v_1.Args[0]
3333 v.reset(OpARMCMNshiftRL)
3334 v.AuxInt = int32ToAuxInt(c)
3335 v.AddArg2(x, y)
3336 return true
3337 }
3338 break
3339 }
3340
3341
3342 for {
3343 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3344 x := v_0
3345 if v_1.Op != OpARMSRAconst {
3346 continue
3347 }
3348 c := auxIntToInt32(v_1.AuxInt)
3349 y := v_1.Args[0]
3350 v.reset(OpARMCMNshiftRA)
3351 v.AuxInt = int32ToAuxInt(c)
3352 v.AddArg2(x, y)
3353 return true
3354 }
3355 break
3356 }
3357
3358
3359 for {
3360 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3361 x := v_0
3362 if v_1.Op != OpARMSLL {
3363 continue
3364 }
3365 z := v_1.Args[1]
3366 y := v_1.Args[0]
3367 v.reset(OpARMCMNshiftLLreg)
3368 v.AddArg3(x, y, z)
3369 return true
3370 }
3371 break
3372 }
3373
3374
3375 for {
3376 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3377 x := v_0
3378 if v_1.Op != OpARMSRL {
3379 continue
3380 }
3381 z := v_1.Args[1]
3382 y := v_1.Args[0]
3383 v.reset(OpARMCMNshiftRLreg)
3384 v.AddArg3(x, y, z)
3385 return true
3386 }
3387 break
3388 }
3389
3390
3391 for {
3392 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3393 x := v_0
3394 if v_1.Op != OpARMSRA {
3395 continue
3396 }
3397 z := v_1.Args[1]
3398 y := v_1.Args[0]
3399 v.reset(OpARMCMNshiftRAreg)
3400 v.AddArg3(x, y, z)
3401 return true
3402 }
3403 break
3404 }
3405 return false
3406 }
3407 func rewriteValueARM_OpARMCMNconst(v *Value) bool {
3408 v_0 := v.Args[0]
3409
3410
3411 for {
3412 y := auxIntToInt32(v.AuxInt)
3413 if v_0.Op != OpARMMOVWconst {
3414 break
3415 }
3416 x := auxIntToInt32(v_0.AuxInt)
3417 v.reset(OpARMFlagConstant)
3418 v.AuxInt = flagConstantToAuxInt(addFlags32(x, y))
3419 return true
3420 }
3421 return false
3422 }
3423 func rewriteValueARM_OpARMCMNshiftLL(v *Value) bool {
3424 v_1 := v.Args[1]
3425 v_0 := v.Args[0]
3426 b := v.Block
3427
3428
3429 for {
3430 d := auxIntToInt32(v.AuxInt)
3431 if v_0.Op != OpARMMOVWconst {
3432 break
3433 }
3434 c := auxIntToInt32(v_0.AuxInt)
3435 x := v_1
3436 v.reset(OpARMCMNconst)
3437 v.AuxInt = int32ToAuxInt(c)
3438 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
3439 v0.AuxInt = int32ToAuxInt(d)
3440 v0.AddArg(x)
3441 v.AddArg(v0)
3442 return true
3443 }
3444
3445
3446 for {
3447 d := auxIntToInt32(v.AuxInt)
3448 x := v_0
3449 if v_1.Op != OpARMMOVWconst {
3450 break
3451 }
3452 c := auxIntToInt32(v_1.AuxInt)
3453 v.reset(OpARMCMNconst)
3454 v.AuxInt = int32ToAuxInt(c << uint64(d))
3455 v.AddArg(x)
3456 return true
3457 }
3458 return false
3459 }
3460 func rewriteValueARM_OpARMCMNshiftLLreg(v *Value) bool {
3461 v_2 := v.Args[2]
3462 v_1 := v.Args[1]
3463 v_0 := v.Args[0]
3464 b := v.Block
3465
3466
3467 for {
3468 if v_0.Op != OpARMMOVWconst {
3469 break
3470 }
3471 c := auxIntToInt32(v_0.AuxInt)
3472 x := v_1
3473 y := v_2
3474 v.reset(OpARMCMNconst)
3475 v.AuxInt = int32ToAuxInt(c)
3476 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
3477 v0.AddArg2(x, y)
3478 v.AddArg(v0)
3479 return true
3480 }
3481
3482
3483
3484 for {
3485 x := v_0
3486 y := v_1
3487 if v_2.Op != OpARMMOVWconst {
3488 break
3489 }
3490 c := auxIntToInt32(v_2.AuxInt)
3491 if !(0 <= c && c < 32) {
3492 break
3493 }
3494 v.reset(OpARMCMNshiftLL)
3495 v.AuxInt = int32ToAuxInt(c)
3496 v.AddArg2(x, y)
3497 return true
3498 }
3499 return false
3500 }
3501 func rewriteValueARM_OpARMCMNshiftRA(v *Value) bool {
3502 v_1 := v.Args[1]
3503 v_0 := v.Args[0]
3504 b := v.Block
3505
3506
3507 for {
3508 d := auxIntToInt32(v.AuxInt)
3509 if v_0.Op != OpARMMOVWconst {
3510 break
3511 }
3512 c := auxIntToInt32(v_0.AuxInt)
3513 x := v_1
3514 v.reset(OpARMCMNconst)
3515 v.AuxInt = int32ToAuxInt(c)
3516 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
3517 v0.AuxInt = int32ToAuxInt(d)
3518 v0.AddArg(x)
3519 v.AddArg(v0)
3520 return true
3521 }
3522
3523
3524 for {
3525 d := auxIntToInt32(v.AuxInt)
3526 x := v_0
3527 if v_1.Op != OpARMMOVWconst {
3528 break
3529 }
3530 c := auxIntToInt32(v_1.AuxInt)
3531 v.reset(OpARMCMNconst)
3532 v.AuxInt = int32ToAuxInt(c >> uint64(d))
3533 v.AddArg(x)
3534 return true
3535 }
3536 return false
3537 }
3538 func rewriteValueARM_OpARMCMNshiftRAreg(v *Value) bool {
3539 v_2 := v.Args[2]
3540 v_1 := v.Args[1]
3541 v_0 := v.Args[0]
3542 b := v.Block
3543
3544
3545 for {
3546 if v_0.Op != OpARMMOVWconst {
3547 break
3548 }
3549 c := auxIntToInt32(v_0.AuxInt)
3550 x := v_1
3551 y := v_2
3552 v.reset(OpARMCMNconst)
3553 v.AuxInt = int32ToAuxInt(c)
3554 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
3555 v0.AddArg2(x, y)
3556 v.AddArg(v0)
3557 return true
3558 }
3559
3560
3561
3562 for {
3563 x := v_0
3564 y := v_1
3565 if v_2.Op != OpARMMOVWconst {
3566 break
3567 }
3568 c := auxIntToInt32(v_2.AuxInt)
3569 if !(0 <= c && c < 32) {
3570 break
3571 }
3572 v.reset(OpARMCMNshiftRA)
3573 v.AuxInt = int32ToAuxInt(c)
3574 v.AddArg2(x, y)
3575 return true
3576 }
3577 return false
3578 }
3579 func rewriteValueARM_OpARMCMNshiftRL(v *Value) bool {
3580 v_1 := v.Args[1]
3581 v_0 := v.Args[0]
3582 b := v.Block
3583
3584
3585 for {
3586 d := auxIntToInt32(v.AuxInt)
3587 if v_0.Op != OpARMMOVWconst {
3588 break
3589 }
3590 c := auxIntToInt32(v_0.AuxInt)
3591 x := v_1
3592 v.reset(OpARMCMNconst)
3593 v.AuxInt = int32ToAuxInt(c)
3594 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
3595 v0.AuxInt = int32ToAuxInt(d)
3596 v0.AddArg(x)
3597 v.AddArg(v0)
3598 return true
3599 }
3600
3601
3602 for {
3603 d := auxIntToInt32(v.AuxInt)
3604 x := v_0
3605 if v_1.Op != OpARMMOVWconst {
3606 break
3607 }
3608 c := auxIntToInt32(v_1.AuxInt)
3609 v.reset(OpARMCMNconst)
3610 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
3611 v.AddArg(x)
3612 return true
3613 }
3614 return false
3615 }
3616 func rewriteValueARM_OpARMCMNshiftRLreg(v *Value) bool {
3617 v_2 := v.Args[2]
3618 v_1 := v.Args[1]
3619 v_0 := v.Args[0]
3620 b := v.Block
3621
3622
3623 for {
3624 if v_0.Op != OpARMMOVWconst {
3625 break
3626 }
3627 c := auxIntToInt32(v_0.AuxInt)
3628 x := v_1
3629 y := v_2
3630 v.reset(OpARMCMNconst)
3631 v.AuxInt = int32ToAuxInt(c)
3632 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
3633 v0.AddArg2(x, y)
3634 v.AddArg(v0)
3635 return true
3636 }
3637
3638
3639
3640 for {
3641 x := v_0
3642 y := v_1
3643 if v_2.Op != OpARMMOVWconst {
3644 break
3645 }
3646 c := auxIntToInt32(v_2.AuxInt)
3647 if !(0 <= c && c < 32) {
3648 break
3649 }
3650 v.reset(OpARMCMNshiftRL)
3651 v.AuxInt = int32ToAuxInt(c)
3652 v.AddArg2(x, y)
3653 return true
3654 }
3655 return false
3656 }
3657 func rewriteValueARM_OpARMCMOVWHSconst(v *Value) bool {
3658 v_1 := v.Args[1]
3659 v_0 := v.Args[0]
3660
3661
3662
3663 for {
3664 c := auxIntToInt32(v.AuxInt)
3665 if v_1.Op != OpARMFlagConstant {
3666 break
3667 }
3668 fc := auxIntToFlagConstant(v_1.AuxInt)
3669 if !(fc.uge()) {
3670 break
3671 }
3672 v.reset(OpARMMOVWconst)
3673 v.AuxInt = int32ToAuxInt(c)
3674 return true
3675 }
3676
3677
3678
3679 for {
3680 x := v_0
3681 if v_1.Op != OpARMFlagConstant {
3682 break
3683 }
3684 fc := auxIntToFlagConstant(v_1.AuxInt)
3685 if !(fc.ult()) {
3686 break
3687 }
3688 v.copyOf(x)
3689 return true
3690 }
3691
3692
3693 for {
3694 c := auxIntToInt32(v.AuxInt)
3695 x := v_0
3696 if v_1.Op != OpARMInvertFlags {
3697 break
3698 }
3699 flags := v_1.Args[0]
3700 v.reset(OpARMCMOVWLSconst)
3701 v.AuxInt = int32ToAuxInt(c)
3702 v.AddArg2(x, flags)
3703 return true
3704 }
3705 return false
3706 }
3707 func rewriteValueARM_OpARMCMOVWLSconst(v *Value) bool {
3708 v_1 := v.Args[1]
3709 v_0 := v.Args[0]
3710
3711
3712
3713 for {
3714 c := auxIntToInt32(v.AuxInt)
3715 if v_1.Op != OpARMFlagConstant {
3716 break
3717 }
3718 fc := auxIntToFlagConstant(v_1.AuxInt)
3719 if !(fc.ule()) {
3720 break
3721 }
3722 v.reset(OpARMMOVWconst)
3723 v.AuxInt = int32ToAuxInt(c)
3724 return true
3725 }
3726
3727
3728
3729 for {
3730 x := v_0
3731 if v_1.Op != OpARMFlagConstant {
3732 break
3733 }
3734 fc := auxIntToFlagConstant(v_1.AuxInt)
3735 if !(fc.ugt()) {
3736 break
3737 }
3738 v.copyOf(x)
3739 return true
3740 }
3741
3742
3743 for {
3744 c := auxIntToInt32(v.AuxInt)
3745 x := v_0
3746 if v_1.Op != OpARMInvertFlags {
3747 break
3748 }
3749 flags := v_1.Args[0]
3750 v.reset(OpARMCMOVWHSconst)
3751 v.AuxInt = int32ToAuxInt(c)
3752 v.AddArg2(x, flags)
3753 return true
3754 }
3755 return false
3756 }
3757 func rewriteValueARM_OpARMCMP(v *Value) bool {
3758 v_1 := v.Args[1]
3759 v_0 := v.Args[0]
3760 b := v.Block
3761
3762
3763 for {
3764 x := v_0
3765 if v_1.Op != OpARMMOVWconst {
3766 break
3767 }
3768 c := auxIntToInt32(v_1.AuxInt)
3769 v.reset(OpARMCMPconst)
3770 v.AuxInt = int32ToAuxInt(c)
3771 v.AddArg(x)
3772 return true
3773 }
3774
3775
3776 for {
3777 if v_0.Op != OpARMMOVWconst {
3778 break
3779 }
3780 c := auxIntToInt32(v_0.AuxInt)
3781 x := v_1
3782 v.reset(OpARMInvertFlags)
3783 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
3784 v0.AuxInt = int32ToAuxInt(c)
3785 v0.AddArg(x)
3786 v.AddArg(v0)
3787 return true
3788 }
3789
3790
3791
3792 for {
3793 x := v_0
3794 y := v_1
3795 if !(canonLessThan(x, y)) {
3796 break
3797 }
3798 v.reset(OpARMInvertFlags)
3799 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
3800 v0.AddArg2(y, x)
3801 v.AddArg(v0)
3802 return true
3803 }
3804
3805
3806 for {
3807 x := v_0
3808 if v_1.Op != OpARMSLLconst {
3809 break
3810 }
3811 c := auxIntToInt32(v_1.AuxInt)
3812 y := v_1.Args[0]
3813 v.reset(OpARMCMPshiftLL)
3814 v.AuxInt = int32ToAuxInt(c)
3815 v.AddArg2(x, y)
3816 return true
3817 }
3818
3819
3820 for {
3821 if v_0.Op != OpARMSLLconst {
3822 break
3823 }
3824 c := auxIntToInt32(v_0.AuxInt)
3825 y := v_0.Args[0]
3826 x := v_1
3827 v.reset(OpARMInvertFlags)
3828 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags)
3829 v0.AuxInt = int32ToAuxInt(c)
3830 v0.AddArg2(x, y)
3831 v.AddArg(v0)
3832 return true
3833 }
3834
3835
3836 for {
3837 x := v_0
3838 if v_1.Op != OpARMSRLconst {
3839 break
3840 }
3841 c := auxIntToInt32(v_1.AuxInt)
3842 y := v_1.Args[0]
3843 v.reset(OpARMCMPshiftRL)
3844 v.AuxInt = int32ToAuxInt(c)
3845 v.AddArg2(x, y)
3846 return true
3847 }
3848
3849
3850 for {
3851 if v_0.Op != OpARMSRLconst {
3852 break
3853 }
3854 c := auxIntToInt32(v_0.AuxInt)
3855 y := v_0.Args[0]
3856 x := v_1
3857 v.reset(OpARMInvertFlags)
3858 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags)
3859 v0.AuxInt = int32ToAuxInt(c)
3860 v0.AddArg2(x, y)
3861 v.AddArg(v0)
3862 return true
3863 }
3864
3865
3866 for {
3867 x := v_0
3868 if v_1.Op != OpARMSRAconst {
3869 break
3870 }
3871 c := auxIntToInt32(v_1.AuxInt)
3872 y := v_1.Args[0]
3873 v.reset(OpARMCMPshiftRA)
3874 v.AuxInt = int32ToAuxInt(c)
3875 v.AddArg2(x, y)
3876 return true
3877 }
3878
3879
3880 for {
3881 if v_0.Op != OpARMSRAconst {
3882 break
3883 }
3884 c := auxIntToInt32(v_0.AuxInt)
3885 y := v_0.Args[0]
3886 x := v_1
3887 v.reset(OpARMInvertFlags)
3888 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags)
3889 v0.AuxInt = int32ToAuxInt(c)
3890 v0.AddArg2(x, y)
3891 v.AddArg(v0)
3892 return true
3893 }
3894
3895
3896 for {
3897 x := v_0
3898 if v_1.Op != OpARMSLL {
3899 break
3900 }
3901 z := v_1.Args[1]
3902 y := v_1.Args[0]
3903 v.reset(OpARMCMPshiftLLreg)
3904 v.AddArg3(x, y, z)
3905 return true
3906 }
3907
3908
3909 for {
3910 if v_0.Op != OpARMSLL {
3911 break
3912 }
3913 z := v_0.Args[1]
3914 y := v_0.Args[0]
3915 x := v_1
3916 v.reset(OpARMInvertFlags)
3917 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
3918 v0.AddArg3(x, y, z)
3919 v.AddArg(v0)
3920 return true
3921 }
3922
3923
3924 for {
3925 x := v_0
3926 if v_1.Op != OpARMSRL {
3927 break
3928 }
3929 z := v_1.Args[1]
3930 y := v_1.Args[0]
3931 v.reset(OpARMCMPshiftRLreg)
3932 v.AddArg3(x, y, z)
3933 return true
3934 }
3935
3936
3937 for {
3938 if v_0.Op != OpARMSRL {
3939 break
3940 }
3941 z := v_0.Args[1]
3942 y := v_0.Args[0]
3943 x := v_1
3944 v.reset(OpARMInvertFlags)
3945 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
3946 v0.AddArg3(x, y, z)
3947 v.AddArg(v0)
3948 return true
3949 }
3950
3951
3952 for {
3953 x := v_0
3954 if v_1.Op != OpARMSRA {
3955 break
3956 }
3957 z := v_1.Args[1]
3958 y := v_1.Args[0]
3959 v.reset(OpARMCMPshiftRAreg)
3960 v.AddArg3(x, y, z)
3961 return true
3962 }
3963
3964
3965 for {
3966 if v_0.Op != OpARMSRA {
3967 break
3968 }
3969 z := v_0.Args[1]
3970 y := v_0.Args[0]
3971 x := v_1
3972 v.reset(OpARMInvertFlags)
3973 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
3974 v0.AddArg3(x, y, z)
3975 v.AddArg(v0)
3976 return true
3977 }
3978 return false
3979 }
3980 func rewriteValueARM_OpARMCMPD(v *Value) bool {
3981 v_1 := v.Args[1]
3982 v_0 := v.Args[0]
3983
3984
3985 for {
3986 x := v_0
3987 if v_1.Op != OpARMMOVDconst || auxIntToFloat64(v_1.AuxInt) != 0 {
3988 break
3989 }
3990 v.reset(OpARMCMPD0)
3991 v.AddArg(x)
3992 return true
3993 }
3994 return false
3995 }
3996 func rewriteValueARM_OpARMCMPF(v *Value) bool {
3997 v_1 := v.Args[1]
3998 v_0 := v.Args[0]
3999
4000
4001 for {
4002 x := v_0
4003 if v_1.Op != OpARMMOVFconst || auxIntToFloat64(v_1.AuxInt) != 0 {
4004 break
4005 }
4006 v.reset(OpARMCMPF0)
4007 v.AddArg(x)
4008 return true
4009 }
4010 return false
4011 }
4012 func rewriteValueARM_OpARMCMPconst(v *Value) bool {
4013 v_0 := v.Args[0]
4014
4015
4016 for {
4017 y := auxIntToInt32(v.AuxInt)
4018 if v_0.Op != OpARMMOVWconst {
4019 break
4020 }
4021 x := auxIntToInt32(v_0.AuxInt)
4022 v.reset(OpARMFlagConstant)
4023 v.AuxInt = flagConstantToAuxInt(subFlags32(x, y))
4024 return true
4025 }
4026
4027
4028
4029 for {
4030 c := auxIntToInt32(v.AuxInt)
4031 if v_0.Op != OpARMMOVBUreg || !(0xff < c) {
4032 break
4033 }
4034 v.reset(OpARMFlagConstant)
4035 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1))
4036 return true
4037 }
4038
4039
4040
4041 for {
4042 c := auxIntToInt32(v.AuxInt)
4043 if v_0.Op != OpARMMOVHUreg || !(0xffff < c) {
4044 break
4045 }
4046 v.reset(OpARMFlagConstant)
4047 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1))
4048 return true
4049 }
4050
4051
4052
4053 for {
4054 n := auxIntToInt32(v.AuxInt)
4055 if v_0.Op != OpARMANDconst {
4056 break
4057 }
4058 m := auxIntToInt32(v_0.AuxInt)
4059 if !(0 <= m && m < n) {
4060 break
4061 }
4062 v.reset(OpARMFlagConstant)
4063 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1))
4064 return true
4065 }
4066
4067
4068
4069 for {
4070 n := auxIntToInt32(v.AuxInt)
4071 if v_0.Op != OpARMSRLconst {
4072 break
4073 }
4074 c := auxIntToInt32(v_0.AuxInt)
4075 if !(0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n)) {
4076 break
4077 }
4078 v.reset(OpARMFlagConstant)
4079 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1))
4080 return true
4081 }
4082 return false
4083 }
4084 func rewriteValueARM_OpARMCMPshiftLL(v *Value) bool {
4085 v_1 := v.Args[1]
4086 v_0 := v.Args[0]
4087 b := v.Block
4088
4089
4090 for {
4091 d := auxIntToInt32(v.AuxInt)
4092 if v_0.Op != OpARMMOVWconst {
4093 break
4094 }
4095 c := auxIntToInt32(v_0.AuxInt)
4096 x := v_1
4097 v.reset(OpARMInvertFlags)
4098 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
4099 v0.AuxInt = int32ToAuxInt(c)
4100 v1 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
4101 v1.AuxInt = int32ToAuxInt(d)
4102 v1.AddArg(x)
4103 v0.AddArg(v1)
4104 v.AddArg(v0)
4105 return true
4106 }
4107
4108
4109 for {
4110 d := auxIntToInt32(v.AuxInt)
4111 x := v_0
4112 if v_1.Op != OpARMMOVWconst {
4113 break
4114 }
4115 c := auxIntToInt32(v_1.AuxInt)
4116 v.reset(OpARMCMPconst)
4117 v.AuxInt = int32ToAuxInt(c << uint64(d))
4118 v.AddArg(x)
4119 return true
4120 }
4121 return false
4122 }
4123 func rewriteValueARM_OpARMCMPshiftLLreg(v *Value) bool {
4124 v_2 := v.Args[2]
4125 v_1 := v.Args[1]
4126 v_0 := v.Args[0]
4127 b := v.Block
4128
4129
4130 for {
4131 if v_0.Op != OpARMMOVWconst {
4132 break
4133 }
4134 c := auxIntToInt32(v_0.AuxInt)
4135 x := v_1
4136 y := v_2
4137 v.reset(OpARMInvertFlags)
4138 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
4139 v0.AuxInt = int32ToAuxInt(c)
4140 v1 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
4141 v1.AddArg2(x, y)
4142 v0.AddArg(v1)
4143 v.AddArg(v0)
4144 return true
4145 }
4146
4147
4148
4149 for {
4150 x := v_0
4151 y := v_1
4152 if v_2.Op != OpARMMOVWconst {
4153 break
4154 }
4155 c := auxIntToInt32(v_2.AuxInt)
4156 if !(0 <= c && c < 32) {
4157 break
4158 }
4159 v.reset(OpARMCMPshiftLL)
4160 v.AuxInt = int32ToAuxInt(c)
4161 v.AddArg2(x, y)
4162 return true
4163 }
4164 return false
4165 }
4166 func rewriteValueARM_OpARMCMPshiftRA(v *Value) bool {
4167 v_1 := v.Args[1]
4168 v_0 := v.Args[0]
4169 b := v.Block
4170
4171
4172 for {
4173 d := auxIntToInt32(v.AuxInt)
4174 if v_0.Op != OpARMMOVWconst {
4175 break
4176 }
4177 c := auxIntToInt32(v_0.AuxInt)
4178 x := v_1
4179 v.reset(OpARMInvertFlags)
4180 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
4181 v0.AuxInt = int32ToAuxInt(c)
4182 v1 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
4183 v1.AuxInt = int32ToAuxInt(d)
4184 v1.AddArg(x)
4185 v0.AddArg(v1)
4186 v.AddArg(v0)
4187 return true
4188 }
4189
4190
4191 for {
4192 d := auxIntToInt32(v.AuxInt)
4193 x := v_0
4194 if v_1.Op != OpARMMOVWconst {
4195 break
4196 }
4197 c := auxIntToInt32(v_1.AuxInt)
4198 v.reset(OpARMCMPconst)
4199 v.AuxInt = int32ToAuxInt(c >> uint64(d))
4200 v.AddArg(x)
4201 return true
4202 }
4203 return false
4204 }
4205 func rewriteValueARM_OpARMCMPshiftRAreg(v *Value) bool {
4206 v_2 := v.Args[2]
4207 v_1 := v.Args[1]
4208 v_0 := v.Args[0]
4209 b := v.Block
4210
4211
4212 for {
4213 if v_0.Op != OpARMMOVWconst {
4214 break
4215 }
4216 c := auxIntToInt32(v_0.AuxInt)
4217 x := v_1
4218 y := v_2
4219 v.reset(OpARMInvertFlags)
4220 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
4221 v0.AuxInt = int32ToAuxInt(c)
4222 v1 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
4223 v1.AddArg2(x, y)
4224 v0.AddArg(v1)
4225 v.AddArg(v0)
4226 return true
4227 }
4228
4229
4230
4231 for {
4232 x := v_0
4233 y := v_1
4234 if v_2.Op != OpARMMOVWconst {
4235 break
4236 }
4237 c := auxIntToInt32(v_2.AuxInt)
4238 if !(0 <= c && c < 32) {
4239 break
4240 }
4241 v.reset(OpARMCMPshiftRA)
4242 v.AuxInt = int32ToAuxInt(c)
4243 v.AddArg2(x, y)
4244 return true
4245 }
4246 return false
4247 }
4248 func rewriteValueARM_OpARMCMPshiftRL(v *Value) bool {
4249 v_1 := v.Args[1]
4250 v_0 := v.Args[0]
4251 b := v.Block
4252
4253
4254 for {
4255 d := auxIntToInt32(v.AuxInt)
4256 if v_0.Op != OpARMMOVWconst {
4257 break
4258 }
4259 c := auxIntToInt32(v_0.AuxInt)
4260 x := v_1
4261 v.reset(OpARMInvertFlags)
4262 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
4263 v0.AuxInt = int32ToAuxInt(c)
4264 v1 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
4265 v1.AuxInt = int32ToAuxInt(d)
4266 v1.AddArg(x)
4267 v0.AddArg(v1)
4268 v.AddArg(v0)
4269 return true
4270 }
4271
4272
4273 for {
4274 d := auxIntToInt32(v.AuxInt)
4275 x := v_0
4276 if v_1.Op != OpARMMOVWconst {
4277 break
4278 }
4279 c := auxIntToInt32(v_1.AuxInt)
4280 v.reset(OpARMCMPconst)
4281 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
4282 v.AddArg(x)
4283 return true
4284 }
4285 return false
4286 }
4287 func rewriteValueARM_OpARMCMPshiftRLreg(v *Value) bool {
4288 v_2 := v.Args[2]
4289 v_1 := v.Args[1]
4290 v_0 := v.Args[0]
4291 b := v.Block
4292
4293
4294 for {
4295 if v_0.Op != OpARMMOVWconst {
4296 break
4297 }
4298 c := auxIntToInt32(v_0.AuxInt)
4299 x := v_1
4300 y := v_2
4301 v.reset(OpARMInvertFlags)
4302 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
4303 v0.AuxInt = int32ToAuxInt(c)
4304 v1 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
4305 v1.AddArg2(x, y)
4306 v0.AddArg(v1)
4307 v.AddArg(v0)
4308 return true
4309 }
4310
4311
4312
4313 for {
4314 x := v_0
4315 y := v_1
4316 if v_2.Op != OpARMMOVWconst {
4317 break
4318 }
4319 c := auxIntToInt32(v_2.AuxInt)
4320 if !(0 <= c && c < 32) {
4321 break
4322 }
4323 v.reset(OpARMCMPshiftRL)
4324 v.AuxInt = int32ToAuxInt(c)
4325 v.AddArg2(x, y)
4326 return true
4327 }
4328 return false
4329 }
4330 func rewriteValueARM_OpARMEqual(v *Value) bool {
4331 v_0 := v.Args[0]
4332
4333
4334 for {
4335 if v_0.Op != OpARMFlagConstant {
4336 break
4337 }
4338 fc := auxIntToFlagConstant(v_0.AuxInt)
4339 v.reset(OpARMMOVWconst)
4340 v.AuxInt = int32ToAuxInt(b2i32(fc.eq()))
4341 return true
4342 }
4343
4344
4345 for {
4346 if v_0.Op != OpARMInvertFlags {
4347 break
4348 }
4349 x := v_0.Args[0]
4350 v.reset(OpARMEqual)
4351 v.AddArg(x)
4352 return true
4353 }
4354 return false
4355 }
4356 func rewriteValueARM_OpARMGreaterEqual(v *Value) bool {
4357 v_0 := v.Args[0]
4358
4359
4360 for {
4361 if v_0.Op != OpARMFlagConstant {
4362 break
4363 }
4364 fc := auxIntToFlagConstant(v_0.AuxInt)
4365 v.reset(OpARMMOVWconst)
4366 v.AuxInt = int32ToAuxInt(b2i32(fc.ge()))
4367 return true
4368 }
4369
4370
4371 for {
4372 if v_0.Op != OpARMInvertFlags {
4373 break
4374 }
4375 x := v_0.Args[0]
4376 v.reset(OpARMLessEqual)
4377 v.AddArg(x)
4378 return true
4379 }
4380 return false
4381 }
4382 func rewriteValueARM_OpARMGreaterEqualU(v *Value) bool {
4383 v_0 := v.Args[0]
4384
4385
4386 for {
4387 if v_0.Op != OpARMFlagConstant {
4388 break
4389 }
4390 fc := auxIntToFlagConstant(v_0.AuxInt)
4391 v.reset(OpARMMOVWconst)
4392 v.AuxInt = int32ToAuxInt(b2i32(fc.uge()))
4393 return true
4394 }
4395
4396
4397 for {
4398 if v_0.Op != OpARMInvertFlags {
4399 break
4400 }
4401 x := v_0.Args[0]
4402 v.reset(OpARMLessEqualU)
4403 v.AddArg(x)
4404 return true
4405 }
4406 return false
4407 }
4408 func rewriteValueARM_OpARMGreaterThan(v *Value) bool {
4409 v_0 := v.Args[0]
4410
4411
4412 for {
4413 if v_0.Op != OpARMFlagConstant {
4414 break
4415 }
4416 fc := auxIntToFlagConstant(v_0.AuxInt)
4417 v.reset(OpARMMOVWconst)
4418 v.AuxInt = int32ToAuxInt(b2i32(fc.gt()))
4419 return true
4420 }
4421
4422
4423 for {
4424 if v_0.Op != OpARMInvertFlags {
4425 break
4426 }
4427 x := v_0.Args[0]
4428 v.reset(OpARMLessThan)
4429 v.AddArg(x)
4430 return true
4431 }
4432 return false
4433 }
4434 func rewriteValueARM_OpARMGreaterThanU(v *Value) bool {
4435 v_0 := v.Args[0]
4436
4437
4438 for {
4439 if v_0.Op != OpARMFlagConstant {
4440 break
4441 }
4442 fc := auxIntToFlagConstant(v_0.AuxInt)
4443 v.reset(OpARMMOVWconst)
4444 v.AuxInt = int32ToAuxInt(b2i32(fc.ugt()))
4445 return true
4446 }
4447
4448
4449 for {
4450 if v_0.Op != OpARMInvertFlags {
4451 break
4452 }
4453 x := v_0.Args[0]
4454 v.reset(OpARMLessThanU)
4455 v.AddArg(x)
4456 return true
4457 }
4458 return false
4459 }
4460 func rewriteValueARM_OpARMLessEqual(v *Value) bool {
4461 v_0 := v.Args[0]
4462
4463
4464 for {
4465 if v_0.Op != OpARMFlagConstant {
4466 break
4467 }
4468 fc := auxIntToFlagConstant(v_0.AuxInt)
4469 v.reset(OpARMMOVWconst)
4470 v.AuxInt = int32ToAuxInt(b2i32(fc.le()))
4471 return true
4472 }
4473
4474
4475 for {
4476 if v_0.Op != OpARMInvertFlags {
4477 break
4478 }
4479 x := v_0.Args[0]
4480 v.reset(OpARMGreaterEqual)
4481 v.AddArg(x)
4482 return true
4483 }
4484 return false
4485 }
4486 func rewriteValueARM_OpARMLessEqualU(v *Value) bool {
4487 v_0 := v.Args[0]
4488
4489
4490 for {
4491 if v_0.Op != OpARMFlagConstant {
4492 break
4493 }
4494 fc := auxIntToFlagConstant(v_0.AuxInt)
4495 v.reset(OpARMMOVWconst)
4496 v.AuxInt = int32ToAuxInt(b2i32(fc.ule()))
4497 return true
4498 }
4499
4500
4501 for {
4502 if v_0.Op != OpARMInvertFlags {
4503 break
4504 }
4505 x := v_0.Args[0]
4506 v.reset(OpARMGreaterEqualU)
4507 v.AddArg(x)
4508 return true
4509 }
4510 return false
4511 }
4512 func rewriteValueARM_OpARMLessThan(v *Value) bool {
4513 v_0 := v.Args[0]
4514
4515
4516 for {
4517 if v_0.Op != OpARMFlagConstant {
4518 break
4519 }
4520 fc := auxIntToFlagConstant(v_0.AuxInt)
4521 v.reset(OpARMMOVWconst)
4522 v.AuxInt = int32ToAuxInt(b2i32(fc.lt()))
4523 return true
4524 }
4525
4526
4527 for {
4528 if v_0.Op != OpARMInvertFlags {
4529 break
4530 }
4531 x := v_0.Args[0]
4532 v.reset(OpARMGreaterThan)
4533 v.AddArg(x)
4534 return true
4535 }
4536 return false
4537 }
4538 func rewriteValueARM_OpARMLessThanU(v *Value) bool {
4539 v_0 := v.Args[0]
4540
4541
4542 for {
4543 if v_0.Op != OpARMFlagConstant {
4544 break
4545 }
4546 fc := auxIntToFlagConstant(v_0.AuxInt)
4547 v.reset(OpARMMOVWconst)
4548 v.AuxInt = int32ToAuxInt(b2i32(fc.ult()))
4549 return true
4550 }
4551
4552
4553 for {
4554 if v_0.Op != OpARMInvertFlags {
4555 break
4556 }
4557 x := v_0.Args[0]
4558 v.reset(OpARMGreaterThanU)
4559 v.AddArg(x)
4560 return true
4561 }
4562 return false
4563 }
4564 func rewriteValueARM_OpARMLoweredPanicBoundsRC(v *Value) bool {
4565 v_1 := v.Args[1]
4566 v_0 := v.Args[0]
4567
4568
4569 for {
4570 kind := auxIntToInt64(v.AuxInt)
4571 p := auxToPanicBoundsC(v.Aux)
4572 if v_0.Op != OpARMMOVWconst {
4573 break
4574 }
4575 c := auxIntToInt32(v_0.AuxInt)
4576 mem := v_1
4577 v.reset(OpARMLoweredPanicBoundsCC)
4578 v.AuxInt = int64ToAuxInt(kind)
4579 v.Aux = panicBoundsCCToAux(PanicBoundsCC{Cx: int64(c), Cy: p.C})
4580 v.AddArg(mem)
4581 return true
4582 }
4583 return false
4584 }
4585 func rewriteValueARM_OpARMLoweredPanicBoundsRR(v *Value) bool {
4586 v_2 := v.Args[2]
4587 v_1 := v.Args[1]
4588 v_0 := v.Args[0]
4589
4590
4591 for {
4592 kind := auxIntToInt64(v.AuxInt)
4593 x := v_0
4594 if v_1.Op != OpARMMOVWconst {
4595 break
4596 }
4597 c := auxIntToInt32(v_1.AuxInt)
4598 mem := v_2
4599 v.reset(OpARMLoweredPanicBoundsRC)
4600 v.AuxInt = int64ToAuxInt(kind)
4601 v.Aux = panicBoundsCToAux(PanicBoundsC{C: int64(c)})
4602 v.AddArg2(x, mem)
4603 return true
4604 }
4605
4606
4607 for {
4608 kind := auxIntToInt64(v.AuxInt)
4609 if v_0.Op != OpARMMOVWconst {
4610 break
4611 }
4612 c := auxIntToInt32(v_0.AuxInt)
4613 y := v_1
4614 mem := v_2
4615 v.reset(OpARMLoweredPanicBoundsCR)
4616 v.AuxInt = int64ToAuxInt(kind)
4617 v.Aux = panicBoundsCToAux(PanicBoundsC{C: int64(c)})
4618 v.AddArg2(y, mem)
4619 return true
4620 }
4621 return false
4622 }
4623 func rewriteValueARM_OpARMLoweredPanicExtendRC(v *Value) bool {
4624 v_2 := v.Args[2]
4625 v_1 := v.Args[1]
4626 v_0 := v.Args[0]
4627
4628
4629 for {
4630 kind := auxIntToInt64(v.AuxInt)
4631 p := auxToPanicBoundsC(v.Aux)
4632 if v_0.Op != OpARMMOVWconst {
4633 break
4634 }
4635 hi := auxIntToInt32(v_0.AuxInt)
4636 if v_1.Op != OpARMMOVWconst {
4637 break
4638 }
4639 lo := auxIntToInt32(v_1.AuxInt)
4640 mem := v_2
4641 v.reset(OpARMLoweredPanicBoundsCC)
4642 v.AuxInt = int64ToAuxInt(kind)
4643 v.Aux = panicBoundsCCToAux(PanicBoundsCC{Cx: int64(hi)<<32 + int64(uint32(lo)), Cy: p.C})
4644 v.AddArg(mem)
4645 return true
4646 }
4647 return false
4648 }
4649 func rewriteValueARM_OpARMLoweredPanicExtendRR(v *Value) bool {
4650 v_3 := v.Args[3]
4651 v_2 := v.Args[2]
4652 v_1 := v.Args[1]
4653 v_0 := v.Args[0]
4654
4655
4656 for {
4657 kind := auxIntToInt64(v.AuxInt)
4658 hi := v_0
4659 lo := v_1
4660 if v_2.Op != OpARMMOVWconst {
4661 break
4662 }
4663 c := auxIntToInt32(v_2.AuxInt)
4664 mem := v_3
4665 v.reset(OpARMLoweredPanicExtendRC)
4666 v.AuxInt = int64ToAuxInt(kind)
4667 v.Aux = panicBoundsCToAux(PanicBoundsC{C: int64(c)})
4668 v.AddArg3(hi, lo, mem)
4669 return true
4670 }
4671
4672
4673 for {
4674 kind := auxIntToInt64(v.AuxInt)
4675 if v_0.Op != OpARMMOVWconst {
4676 break
4677 }
4678 hi := auxIntToInt32(v_0.AuxInt)
4679 if v_1.Op != OpARMMOVWconst {
4680 break
4681 }
4682 lo := auxIntToInt32(v_1.AuxInt)
4683 y := v_2
4684 mem := v_3
4685 v.reset(OpARMLoweredPanicBoundsCR)
4686 v.AuxInt = int64ToAuxInt(kind)
4687 v.Aux = panicBoundsCToAux(PanicBoundsC{C: int64(hi)<<32 + int64(uint32(lo))})
4688 v.AddArg2(y, mem)
4689 return true
4690 }
4691 return false
4692 }
4693 func rewriteValueARM_OpARMMOVBUload(v *Value) bool {
4694 v_1 := v.Args[1]
4695 v_0 := v.Args[0]
4696
4697
4698 for {
4699 off1 := auxIntToInt32(v.AuxInt)
4700 sym := auxToSym(v.Aux)
4701 if v_0.Op != OpARMADDconst {
4702 break
4703 }
4704 off2 := auxIntToInt32(v_0.AuxInt)
4705 ptr := v_0.Args[0]
4706 mem := v_1
4707 v.reset(OpARMMOVBUload)
4708 v.AuxInt = int32ToAuxInt(off1 + off2)
4709 v.Aux = symToAux(sym)
4710 v.AddArg2(ptr, mem)
4711 return true
4712 }
4713
4714
4715 for {
4716 off1 := auxIntToInt32(v.AuxInt)
4717 sym := auxToSym(v.Aux)
4718 if v_0.Op != OpARMSUBconst {
4719 break
4720 }
4721 off2 := auxIntToInt32(v_0.AuxInt)
4722 ptr := v_0.Args[0]
4723 mem := v_1
4724 v.reset(OpARMMOVBUload)
4725 v.AuxInt = int32ToAuxInt(off1 - off2)
4726 v.Aux = symToAux(sym)
4727 v.AddArg2(ptr, mem)
4728 return true
4729 }
4730
4731
4732
4733 for {
4734 off1 := auxIntToInt32(v.AuxInt)
4735 sym1 := auxToSym(v.Aux)
4736 if v_0.Op != OpARMMOVWaddr {
4737 break
4738 }
4739 off2 := auxIntToInt32(v_0.AuxInt)
4740 sym2 := auxToSym(v_0.Aux)
4741 ptr := v_0.Args[0]
4742 mem := v_1
4743 if !(canMergeSym(sym1, sym2)) {
4744 break
4745 }
4746 v.reset(OpARMMOVBUload)
4747 v.AuxInt = int32ToAuxInt(off1 + off2)
4748 v.Aux = symToAux(mergeSym(sym1, sym2))
4749 v.AddArg2(ptr, mem)
4750 return true
4751 }
4752
4753
4754
4755 for {
4756 off := auxIntToInt32(v.AuxInt)
4757 sym := auxToSym(v.Aux)
4758 ptr := v_0
4759 if v_1.Op != OpARMMOVBstore {
4760 break
4761 }
4762 off2 := auxIntToInt32(v_1.AuxInt)
4763 sym2 := auxToSym(v_1.Aux)
4764 x := v_1.Args[1]
4765 ptr2 := v_1.Args[0]
4766 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
4767 break
4768 }
4769 v.reset(OpARMMOVBUreg)
4770 v.AddArg(x)
4771 return true
4772 }
4773
4774
4775
4776 for {
4777 if auxIntToInt32(v.AuxInt) != 0 {
4778 break
4779 }
4780 sym := auxToSym(v.Aux)
4781 if v_0.Op != OpARMADD {
4782 break
4783 }
4784 idx := v_0.Args[1]
4785 ptr := v_0.Args[0]
4786 mem := v_1
4787 if !(sym == nil) {
4788 break
4789 }
4790 v.reset(OpARMMOVBUloadidx)
4791 v.AddArg3(ptr, idx, mem)
4792 return true
4793 }
4794
4795
4796
4797 for {
4798 off := auxIntToInt32(v.AuxInt)
4799 sym := auxToSym(v.Aux)
4800 if v_0.Op != OpSB || !(symIsRO(sym)) {
4801 break
4802 }
4803 v.reset(OpARMMOVWconst)
4804 v.AuxInt = int32ToAuxInt(int32(read8(sym, int64(off))))
4805 return true
4806 }
4807 return false
4808 }
4809 func rewriteValueARM_OpARMMOVBUloadidx(v *Value) bool {
4810 v_2 := v.Args[2]
4811 v_1 := v.Args[1]
4812 v_0 := v.Args[0]
4813
4814
4815
4816 for {
4817 ptr := v_0
4818 idx := v_1
4819 if v_2.Op != OpARMMOVBstoreidx {
4820 break
4821 }
4822 x := v_2.Args[2]
4823 ptr2 := v_2.Args[0]
4824 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) {
4825 break
4826 }
4827 v.reset(OpARMMOVBUreg)
4828 v.AddArg(x)
4829 return true
4830 }
4831
4832
4833 for {
4834 ptr := v_0
4835 if v_1.Op != OpARMMOVWconst {
4836 break
4837 }
4838 c := auxIntToInt32(v_1.AuxInt)
4839 mem := v_2
4840 v.reset(OpARMMOVBUload)
4841 v.AuxInt = int32ToAuxInt(c)
4842 v.AddArg2(ptr, mem)
4843 return true
4844 }
4845
4846
4847 for {
4848 if v_0.Op != OpARMMOVWconst {
4849 break
4850 }
4851 c := auxIntToInt32(v_0.AuxInt)
4852 ptr := v_1
4853 mem := v_2
4854 v.reset(OpARMMOVBUload)
4855 v.AuxInt = int32ToAuxInt(c)
4856 v.AddArg2(ptr, mem)
4857 return true
4858 }
4859 return false
4860 }
4861 func rewriteValueARM_OpARMMOVBUreg(v *Value) bool {
4862 v_0 := v.Args[0]
4863
4864
4865 for {
4866 x := v_0
4867 if x.Op != OpARMMOVBUload {
4868 break
4869 }
4870 v.reset(OpARMMOVWreg)
4871 v.AddArg(x)
4872 return true
4873 }
4874
4875
4876 for {
4877 if v_0.Op != OpARMANDconst {
4878 break
4879 }
4880 c := auxIntToInt32(v_0.AuxInt)
4881 x := v_0.Args[0]
4882 v.reset(OpARMANDconst)
4883 v.AuxInt = int32ToAuxInt(c & 0xff)
4884 v.AddArg(x)
4885 return true
4886 }
4887
4888
4889 for {
4890 x := v_0
4891 if x.Op != OpARMMOVBUreg {
4892 break
4893 }
4894 v.reset(OpARMMOVWreg)
4895 v.AddArg(x)
4896 return true
4897 }
4898
4899
4900 for {
4901 if v_0.Op != OpARMMOVWconst {
4902 break
4903 }
4904 c := auxIntToInt32(v_0.AuxInt)
4905 v.reset(OpARMMOVWconst)
4906 v.AuxInt = int32ToAuxInt(int32(uint8(c)))
4907 return true
4908 }
4909 return false
4910 }
4911 func rewriteValueARM_OpARMMOVBload(v *Value) bool {
4912 v_1 := v.Args[1]
4913 v_0 := v.Args[0]
4914
4915
4916 for {
4917 off1 := auxIntToInt32(v.AuxInt)
4918 sym := auxToSym(v.Aux)
4919 if v_0.Op != OpARMADDconst {
4920 break
4921 }
4922 off2 := auxIntToInt32(v_0.AuxInt)
4923 ptr := v_0.Args[0]
4924 mem := v_1
4925 v.reset(OpARMMOVBload)
4926 v.AuxInt = int32ToAuxInt(off1 + off2)
4927 v.Aux = symToAux(sym)
4928 v.AddArg2(ptr, mem)
4929 return true
4930 }
4931
4932
4933 for {
4934 off1 := auxIntToInt32(v.AuxInt)
4935 sym := auxToSym(v.Aux)
4936 if v_0.Op != OpARMSUBconst {
4937 break
4938 }
4939 off2 := auxIntToInt32(v_0.AuxInt)
4940 ptr := v_0.Args[0]
4941 mem := v_1
4942 v.reset(OpARMMOVBload)
4943 v.AuxInt = int32ToAuxInt(off1 - off2)
4944 v.Aux = symToAux(sym)
4945 v.AddArg2(ptr, mem)
4946 return true
4947 }
4948
4949
4950
4951 for {
4952 off1 := auxIntToInt32(v.AuxInt)
4953 sym1 := auxToSym(v.Aux)
4954 if v_0.Op != OpARMMOVWaddr {
4955 break
4956 }
4957 off2 := auxIntToInt32(v_0.AuxInt)
4958 sym2 := auxToSym(v_0.Aux)
4959 ptr := v_0.Args[0]
4960 mem := v_1
4961 if !(canMergeSym(sym1, sym2)) {
4962 break
4963 }
4964 v.reset(OpARMMOVBload)
4965 v.AuxInt = int32ToAuxInt(off1 + off2)
4966 v.Aux = symToAux(mergeSym(sym1, sym2))
4967 v.AddArg2(ptr, mem)
4968 return true
4969 }
4970
4971
4972
4973 for {
4974 off := auxIntToInt32(v.AuxInt)
4975 sym := auxToSym(v.Aux)
4976 ptr := v_0
4977 if v_1.Op != OpARMMOVBstore {
4978 break
4979 }
4980 off2 := auxIntToInt32(v_1.AuxInt)
4981 sym2 := auxToSym(v_1.Aux)
4982 x := v_1.Args[1]
4983 ptr2 := v_1.Args[0]
4984 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
4985 break
4986 }
4987 v.reset(OpARMMOVBreg)
4988 v.AddArg(x)
4989 return true
4990 }
4991
4992
4993
4994 for {
4995 if auxIntToInt32(v.AuxInt) != 0 {
4996 break
4997 }
4998 sym := auxToSym(v.Aux)
4999 if v_0.Op != OpARMADD {
5000 break
5001 }
5002 idx := v_0.Args[1]
5003 ptr := v_0.Args[0]
5004 mem := v_1
5005 if !(sym == nil) {
5006 break
5007 }
5008 v.reset(OpARMMOVBloadidx)
5009 v.AddArg3(ptr, idx, mem)
5010 return true
5011 }
5012
5013
5014
5015 for {
5016 off := auxIntToInt32(v.AuxInt)
5017 sym := auxToSym(v.Aux)
5018 if v_0.Op != OpSB || !(symIsRO(sym)) {
5019 break
5020 }
5021 v.reset(OpARMMOVWconst)
5022 v.AuxInt = int32ToAuxInt(int32(int8(read8(sym, int64(off)))))
5023 return true
5024 }
5025 return false
5026 }
5027 func rewriteValueARM_OpARMMOVBloadidx(v *Value) bool {
5028 v_2 := v.Args[2]
5029 v_1 := v.Args[1]
5030 v_0 := v.Args[0]
5031
5032
5033
5034 for {
5035 ptr := v_0
5036 idx := v_1
5037 if v_2.Op != OpARMMOVBstoreidx {
5038 break
5039 }
5040 x := v_2.Args[2]
5041 ptr2 := v_2.Args[0]
5042 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) {
5043 break
5044 }
5045 v.reset(OpARMMOVBreg)
5046 v.AddArg(x)
5047 return true
5048 }
5049
5050
5051 for {
5052 ptr := v_0
5053 if v_1.Op != OpARMMOVWconst {
5054 break
5055 }
5056 c := auxIntToInt32(v_1.AuxInt)
5057 mem := v_2
5058 v.reset(OpARMMOVBload)
5059 v.AuxInt = int32ToAuxInt(c)
5060 v.AddArg2(ptr, mem)
5061 return true
5062 }
5063
5064
5065 for {
5066 if v_0.Op != OpARMMOVWconst {
5067 break
5068 }
5069 c := auxIntToInt32(v_0.AuxInt)
5070 ptr := v_1
5071 mem := v_2
5072 v.reset(OpARMMOVBload)
5073 v.AuxInt = int32ToAuxInt(c)
5074 v.AddArg2(ptr, mem)
5075 return true
5076 }
5077 return false
5078 }
5079 func rewriteValueARM_OpARMMOVBreg(v *Value) bool {
5080 v_0 := v.Args[0]
5081
5082
5083 for {
5084 x := v_0
5085 if x.Op != OpARMMOVBload {
5086 break
5087 }
5088 v.reset(OpARMMOVWreg)
5089 v.AddArg(x)
5090 return true
5091 }
5092
5093
5094
5095 for {
5096 if v_0.Op != OpARMANDconst {
5097 break
5098 }
5099 c := auxIntToInt32(v_0.AuxInt)
5100 x := v_0.Args[0]
5101 if !(c&0x80 == 0) {
5102 break
5103 }
5104 v.reset(OpARMANDconst)
5105 v.AuxInt = int32ToAuxInt(c & 0x7f)
5106 v.AddArg(x)
5107 return true
5108 }
5109
5110
5111 for {
5112 x := v_0
5113 if x.Op != OpARMMOVBreg {
5114 break
5115 }
5116 v.reset(OpARMMOVWreg)
5117 v.AddArg(x)
5118 return true
5119 }
5120
5121
5122 for {
5123 if v_0.Op != OpARMMOVWconst {
5124 break
5125 }
5126 c := auxIntToInt32(v_0.AuxInt)
5127 v.reset(OpARMMOVWconst)
5128 v.AuxInt = int32ToAuxInt(int32(int8(c)))
5129 return true
5130 }
5131 return false
5132 }
5133 func rewriteValueARM_OpARMMOVBstore(v *Value) bool {
5134 v_2 := v.Args[2]
5135 v_1 := v.Args[1]
5136 v_0 := v.Args[0]
5137
5138
5139 for {
5140 off1 := auxIntToInt32(v.AuxInt)
5141 sym := auxToSym(v.Aux)
5142 if v_0.Op != OpARMADDconst {
5143 break
5144 }
5145 off2 := auxIntToInt32(v_0.AuxInt)
5146 ptr := v_0.Args[0]
5147 val := v_1
5148 mem := v_2
5149 v.reset(OpARMMOVBstore)
5150 v.AuxInt = int32ToAuxInt(off1 + off2)
5151 v.Aux = symToAux(sym)
5152 v.AddArg3(ptr, val, mem)
5153 return true
5154 }
5155
5156
5157 for {
5158 off1 := auxIntToInt32(v.AuxInt)
5159 sym := auxToSym(v.Aux)
5160 if v_0.Op != OpARMSUBconst {
5161 break
5162 }
5163 off2 := auxIntToInt32(v_0.AuxInt)
5164 ptr := v_0.Args[0]
5165 val := v_1
5166 mem := v_2
5167 v.reset(OpARMMOVBstore)
5168 v.AuxInt = int32ToAuxInt(off1 - off2)
5169 v.Aux = symToAux(sym)
5170 v.AddArg3(ptr, val, mem)
5171 return true
5172 }
5173
5174
5175
5176 for {
5177 off1 := auxIntToInt32(v.AuxInt)
5178 sym1 := auxToSym(v.Aux)
5179 if v_0.Op != OpARMMOVWaddr {
5180 break
5181 }
5182 off2 := auxIntToInt32(v_0.AuxInt)
5183 sym2 := auxToSym(v_0.Aux)
5184 ptr := v_0.Args[0]
5185 val := v_1
5186 mem := v_2
5187 if !(canMergeSym(sym1, sym2)) {
5188 break
5189 }
5190 v.reset(OpARMMOVBstore)
5191 v.AuxInt = int32ToAuxInt(off1 + off2)
5192 v.Aux = symToAux(mergeSym(sym1, sym2))
5193 v.AddArg3(ptr, val, mem)
5194 return true
5195 }
5196
5197
5198 for {
5199 off := auxIntToInt32(v.AuxInt)
5200 sym := auxToSym(v.Aux)
5201 ptr := v_0
5202 if v_1.Op != OpARMMOVBreg {
5203 break
5204 }
5205 x := v_1.Args[0]
5206 mem := v_2
5207 v.reset(OpARMMOVBstore)
5208 v.AuxInt = int32ToAuxInt(off)
5209 v.Aux = symToAux(sym)
5210 v.AddArg3(ptr, x, mem)
5211 return true
5212 }
5213
5214
5215 for {
5216 off := auxIntToInt32(v.AuxInt)
5217 sym := auxToSym(v.Aux)
5218 ptr := v_0
5219 if v_1.Op != OpARMMOVBUreg {
5220 break
5221 }
5222 x := v_1.Args[0]
5223 mem := v_2
5224 v.reset(OpARMMOVBstore)
5225 v.AuxInt = int32ToAuxInt(off)
5226 v.Aux = symToAux(sym)
5227 v.AddArg3(ptr, x, mem)
5228 return true
5229 }
5230
5231
5232 for {
5233 off := auxIntToInt32(v.AuxInt)
5234 sym := auxToSym(v.Aux)
5235 ptr := v_0
5236 if v_1.Op != OpARMMOVHreg {
5237 break
5238 }
5239 x := v_1.Args[0]
5240 mem := v_2
5241 v.reset(OpARMMOVBstore)
5242 v.AuxInt = int32ToAuxInt(off)
5243 v.Aux = symToAux(sym)
5244 v.AddArg3(ptr, x, mem)
5245 return true
5246 }
5247
5248
5249 for {
5250 off := auxIntToInt32(v.AuxInt)
5251 sym := auxToSym(v.Aux)
5252 ptr := v_0
5253 if v_1.Op != OpARMMOVHUreg {
5254 break
5255 }
5256 x := v_1.Args[0]
5257 mem := v_2
5258 v.reset(OpARMMOVBstore)
5259 v.AuxInt = int32ToAuxInt(off)
5260 v.Aux = symToAux(sym)
5261 v.AddArg3(ptr, x, mem)
5262 return true
5263 }
5264
5265
5266
5267 for {
5268 if auxIntToInt32(v.AuxInt) != 0 {
5269 break
5270 }
5271 sym := auxToSym(v.Aux)
5272 if v_0.Op != OpARMADD {
5273 break
5274 }
5275 idx := v_0.Args[1]
5276 ptr := v_0.Args[0]
5277 val := v_1
5278 mem := v_2
5279 if !(sym == nil) {
5280 break
5281 }
5282 v.reset(OpARMMOVBstoreidx)
5283 v.AddArg4(ptr, idx, val, mem)
5284 return true
5285 }
5286 return false
5287 }
5288 func rewriteValueARM_OpARMMOVBstoreidx(v *Value) bool {
5289 v_3 := v.Args[3]
5290 v_2 := v.Args[2]
5291 v_1 := v.Args[1]
5292 v_0 := v.Args[0]
5293
5294
5295 for {
5296 ptr := v_0
5297 if v_1.Op != OpARMMOVWconst {
5298 break
5299 }
5300 c := auxIntToInt32(v_1.AuxInt)
5301 val := v_2
5302 mem := v_3
5303 v.reset(OpARMMOVBstore)
5304 v.AuxInt = int32ToAuxInt(c)
5305 v.AddArg3(ptr, val, mem)
5306 return true
5307 }
5308
5309
5310 for {
5311 if v_0.Op != OpARMMOVWconst {
5312 break
5313 }
5314 c := auxIntToInt32(v_0.AuxInt)
5315 ptr := v_1
5316 val := v_2
5317 mem := v_3
5318 v.reset(OpARMMOVBstore)
5319 v.AuxInt = int32ToAuxInt(c)
5320 v.AddArg3(ptr, val, mem)
5321 return true
5322 }
5323 return false
5324 }
5325 func rewriteValueARM_OpARMMOVDload(v *Value) bool {
5326 v_1 := v.Args[1]
5327 v_0 := v.Args[0]
5328
5329
5330 for {
5331 off1 := auxIntToInt32(v.AuxInt)
5332 sym := auxToSym(v.Aux)
5333 if v_0.Op != OpARMADDconst {
5334 break
5335 }
5336 off2 := auxIntToInt32(v_0.AuxInt)
5337 ptr := v_0.Args[0]
5338 mem := v_1
5339 v.reset(OpARMMOVDload)
5340 v.AuxInt = int32ToAuxInt(off1 + off2)
5341 v.Aux = symToAux(sym)
5342 v.AddArg2(ptr, mem)
5343 return true
5344 }
5345
5346
5347 for {
5348 off1 := auxIntToInt32(v.AuxInt)
5349 sym := auxToSym(v.Aux)
5350 if v_0.Op != OpARMSUBconst {
5351 break
5352 }
5353 off2 := auxIntToInt32(v_0.AuxInt)
5354 ptr := v_0.Args[0]
5355 mem := v_1
5356 v.reset(OpARMMOVDload)
5357 v.AuxInt = int32ToAuxInt(off1 - off2)
5358 v.Aux = symToAux(sym)
5359 v.AddArg2(ptr, mem)
5360 return true
5361 }
5362
5363
5364
5365 for {
5366 off1 := auxIntToInt32(v.AuxInt)
5367 sym1 := auxToSym(v.Aux)
5368 if v_0.Op != OpARMMOVWaddr {
5369 break
5370 }
5371 off2 := auxIntToInt32(v_0.AuxInt)
5372 sym2 := auxToSym(v_0.Aux)
5373 ptr := v_0.Args[0]
5374 mem := v_1
5375 if !(canMergeSym(sym1, sym2)) {
5376 break
5377 }
5378 v.reset(OpARMMOVDload)
5379 v.AuxInt = int32ToAuxInt(off1 + off2)
5380 v.Aux = symToAux(mergeSym(sym1, sym2))
5381 v.AddArg2(ptr, mem)
5382 return true
5383 }
5384
5385
5386
5387 for {
5388 off := auxIntToInt32(v.AuxInt)
5389 sym := auxToSym(v.Aux)
5390 ptr := v_0
5391 if v_1.Op != OpARMMOVDstore {
5392 break
5393 }
5394 off2 := auxIntToInt32(v_1.AuxInt)
5395 sym2 := auxToSym(v_1.Aux)
5396 x := v_1.Args[1]
5397 ptr2 := v_1.Args[0]
5398 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
5399 break
5400 }
5401 v.copyOf(x)
5402 return true
5403 }
5404 return false
5405 }
5406 func rewriteValueARM_OpARMMOVDstore(v *Value) bool {
5407 v_2 := v.Args[2]
5408 v_1 := v.Args[1]
5409 v_0 := v.Args[0]
5410
5411
5412 for {
5413 off1 := auxIntToInt32(v.AuxInt)
5414 sym := auxToSym(v.Aux)
5415 if v_0.Op != OpARMADDconst {
5416 break
5417 }
5418 off2 := auxIntToInt32(v_0.AuxInt)
5419 ptr := v_0.Args[0]
5420 val := v_1
5421 mem := v_2
5422 v.reset(OpARMMOVDstore)
5423 v.AuxInt = int32ToAuxInt(off1 + off2)
5424 v.Aux = symToAux(sym)
5425 v.AddArg3(ptr, val, mem)
5426 return true
5427 }
5428
5429
5430 for {
5431 off1 := auxIntToInt32(v.AuxInt)
5432 sym := auxToSym(v.Aux)
5433 if v_0.Op != OpARMSUBconst {
5434 break
5435 }
5436 off2 := auxIntToInt32(v_0.AuxInt)
5437 ptr := v_0.Args[0]
5438 val := v_1
5439 mem := v_2
5440 v.reset(OpARMMOVDstore)
5441 v.AuxInt = int32ToAuxInt(off1 - off2)
5442 v.Aux = symToAux(sym)
5443 v.AddArg3(ptr, val, mem)
5444 return true
5445 }
5446
5447
5448
5449 for {
5450 off1 := auxIntToInt32(v.AuxInt)
5451 sym1 := auxToSym(v.Aux)
5452 if v_0.Op != OpARMMOVWaddr {
5453 break
5454 }
5455 off2 := auxIntToInt32(v_0.AuxInt)
5456 sym2 := auxToSym(v_0.Aux)
5457 ptr := v_0.Args[0]
5458 val := v_1
5459 mem := v_2
5460 if !(canMergeSym(sym1, sym2)) {
5461 break
5462 }
5463 v.reset(OpARMMOVDstore)
5464 v.AuxInt = int32ToAuxInt(off1 + off2)
5465 v.Aux = symToAux(mergeSym(sym1, sym2))
5466 v.AddArg3(ptr, val, mem)
5467 return true
5468 }
5469 return false
5470 }
5471 func rewriteValueARM_OpARMMOVFload(v *Value) bool {
5472 v_1 := v.Args[1]
5473 v_0 := v.Args[0]
5474
5475
5476 for {
5477 off1 := auxIntToInt32(v.AuxInt)
5478 sym := auxToSym(v.Aux)
5479 if v_0.Op != OpARMADDconst {
5480 break
5481 }
5482 off2 := auxIntToInt32(v_0.AuxInt)
5483 ptr := v_0.Args[0]
5484 mem := v_1
5485 v.reset(OpARMMOVFload)
5486 v.AuxInt = int32ToAuxInt(off1 + off2)
5487 v.Aux = symToAux(sym)
5488 v.AddArg2(ptr, mem)
5489 return true
5490 }
5491
5492
5493 for {
5494 off1 := auxIntToInt32(v.AuxInt)
5495 sym := auxToSym(v.Aux)
5496 if v_0.Op != OpARMSUBconst {
5497 break
5498 }
5499 off2 := auxIntToInt32(v_0.AuxInt)
5500 ptr := v_0.Args[0]
5501 mem := v_1
5502 v.reset(OpARMMOVFload)
5503 v.AuxInt = int32ToAuxInt(off1 - off2)
5504 v.Aux = symToAux(sym)
5505 v.AddArg2(ptr, mem)
5506 return true
5507 }
5508
5509
5510
5511 for {
5512 off1 := auxIntToInt32(v.AuxInt)
5513 sym1 := auxToSym(v.Aux)
5514 if v_0.Op != OpARMMOVWaddr {
5515 break
5516 }
5517 off2 := auxIntToInt32(v_0.AuxInt)
5518 sym2 := auxToSym(v_0.Aux)
5519 ptr := v_0.Args[0]
5520 mem := v_1
5521 if !(canMergeSym(sym1, sym2)) {
5522 break
5523 }
5524 v.reset(OpARMMOVFload)
5525 v.AuxInt = int32ToAuxInt(off1 + off2)
5526 v.Aux = symToAux(mergeSym(sym1, sym2))
5527 v.AddArg2(ptr, mem)
5528 return true
5529 }
5530
5531
5532
5533 for {
5534 off := auxIntToInt32(v.AuxInt)
5535 sym := auxToSym(v.Aux)
5536 ptr := v_0
5537 if v_1.Op != OpARMMOVFstore {
5538 break
5539 }
5540 off2 := auxIntToInt32(v_1.AuxInt)
5541 sym2 := auxToSym(v_1.Aux)
5542 x := v_1.Args[1]
5543 ptr2 := v_1.Args[0]
5544 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
5545 break
5546 }
5547 v.copyOf(x)
5548 return true
5549 }
5550 return false
5551 }
5552 func rewriteValueARM_OpARMMOVFstore(v *Value) bool {
5553 v_2 := v.Args[2]
5554 v_1 := v.Args[1]
5555 v_0 := v.Args[0]
5556
5557
5558 for {
5559 off1 := auxIntToInt32(v.AuxInt)
5560 sym := auxToSym(v.Aux)
5561 if v_0.Op != OpARMADDconst {
5562 break
5563 }
5564 off2 := auxIntToInt32(v_0.AuxInt)
5565 ptr := v_0.Args[0]
5566 val := v_1
5567 mem := v_2
5568 v.reset(OpARMMOVFstore)
5569 v.AuxInt = int32ToAuxInt(off1 + off2)
5570 v.Aux = symToAux(sym)
5571 v.AddArg3(ptr, val, mem)
5572 return true
5573 }
5574
5575
5576 for {
5577 off1 := auxIntToInt32(v.AuxInt)
5578 sym := auxToSym(v.Aux)
5579 if v_0.Op != OpARMSUBconst {
5580 break
5581 }
5582 off2 := auxIntToInt32(v_0.AuxInt)
5583 ptr := v_0.Args[0]
5584 val := v_1
5585 mem := v_2
5586 v.reset(OpARMMOVFstore)
5587 v.AuxInt = int32ToAuxInt(off1 - off2)
5588 v.Aux = symToAux(sym)
5589 v.AddArg3(ptr, val, mem)
5590 return true
5591 }
5592
5593
5594
5595 for {
5596 off1 := auxIntToInt32(v.AuxInt)
5597 sym1 := auxToSym(v.Aux)
5598 if v_0.Op != OpARMMOVWaddr {
5599 break
5600 }
5601 off2 := auxIntToInt32(v_0.AuxInt)
5602 sym2 := auxToSym(v_0.Aux)
5603 ptr := v_0.Args[0]
5604 val := v_1
5605 mem := v_2
5606 if !(canMergeSym(sym1, sym2)) {
5607 break
5608 }
5609 v.reset(OpARMMOVFstore)
5610 v.AuxInt = int32ToAuxInt(off1 + off2)
5611 v.Aux = symToAux(mergeSym(sym1, sym2))
5612 v.AddArg3(ptr, val, mem)
5613 return true
5614 }
5615 return false
5616 }
5617 func rewriteValueARM_OpARMMOVHUload(v *Value) bool {
5618 v_1 := v.Args[1]
5619 v_0 := v.Args[0]
5620 b := v.Block
5621 config := b.Func.Config
5622
5623
5624 for {
5625 off1 := auxIntToInt32(v.AuxInt)
5626 sym := auxToSym(v.Aux)
5627 if v_0.Op != OpARMADDconst {
5628 break
5629 }
5630 off2 := auxIntToInt32(v_0.AuxInt)
5631 ptr := v_0.Args[0]
5632 mem := v_1
5633 v.reset(OpARMMOVHUload)
5634 v.AuxInt = int32ToAuxInt(off1 + off2)
5635 v.Aux = symToAux(sym)
5636 v.AddArg2(ptr, mem)
5637 return true
5638 }
5639
5640
5641 for {
5642 off1 := auxIntToInt32(v.AuxInt)
5643 sym := auxToSym(v.Aux)
5644 if v_0.Op != OpARMSUBconst {
5645 break
5646 }
5647 off2 := auxIntToInt32(v_0.AuxInt)
5648 ptr := v_0.Args[0]
5649 mem := v_1
5650 v.reset(OpARMMOVHUload)
5651 v.AuxInt = int32ToAuxInt(off1 - off2)
5652 v.Aux = symToAux(sym)
5653 v.AddArg2(ptr, mem)
5654 return true
5655 }
5656
5657
5658
5659 for {
5660 off1 := auxIntToInt32(v.AuxInt)
5661 sym1 := auxToSym(v.Aux)
5662 if v_0.Op != OpARMMOVWaddr {
5663 break
5664 }
5665 off2 := auxIntToInt32(v_0.AuxInt)
5666 sym2 := auxToSym(v_0.Aux)
5667 ptr := v_0.Args[0]
5668 mem := v_1
5669 if !(canMergeSym(sym1, sym2)) {
5670 break
5671 }
5672 v.reset(OpARMMOVHUload)
5673 v.AuxInt = int32ToAuxInt(off1 + off2)
5674 v.Aux = symToAux(mergeSym(sym1, sym2))
5675 v.AddArg2(ptr, mem)
5676 return true
5677 }
5678
5679
5680
5681 for {
5682 off := auxIntToInt32(v.AuxInt)
5683 sym := auxToSym(v.Aux)
5684 ptr := v_0
5685 if v_1.Op != OpARMMOVHstore {
5686 break
5687 }
5688 off2 := auxIntToInt32(v_1.AuxInt)
5689 sym2 := auxToSym(v_1.Aux)
5690 x := v_1.Args[1]
5691 ptr2 := v_1.Args[0]
5692 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
5693 break
5694 }
5695 v.reset(OpARMMOVHUreg)
5696 v.AddArg(x)
5697 return true
5698 }
5699
5700
5701
5702 for {
5703 if auxIntToInt32(v.AuxInt) != 0 {
5704 break
5705 }
5706 sym := auxToSym(v.Aux)
5707 if v_0.Op != OpARMADD {
5708 break
5709 }
5710 idx := v_0.Args[1]
5711 ptr := v_0.Args[0]
5712 mem := v_1
5713 if !(sym == nil) {
5714 break
5715 }
5716 v.reset(OpARMMOVHUloadidx)
5717 v.AddArg3(ptr, idx, mem)
5718 return true
5719 }
5720
5721
5722
5723 for {
5724 off := auxIntToInt32(v.AuxInt)
5725 sym := auxToSym(v.Aux)
5726 if v_0.Op != OpSB || !(symIsRO(sym)) {
5727 break
5728 }
5729 v.reset(OpARMMOVWconst)
5730 v.AuxInt = int32ToAuxInt(int32(read16(sym, int64(off), config.ctxt.Arch.ByteOrder)))
5731 return true
5732 }
5733 return false
5734 }
5735 func rewriteValueARM_OpARMMOVHUloadidx(v *Value) bool {
5736 v_2 := v.Args[2]
5737 v_1 := v.Args[1]
5738 v_0 := v.Args[0]
5739
5740
5741
5742 for {
5743 ptr := v_0
5744 idx := v_1
5745 if v_2.Op != OpARMMOVHstoreidx {
5746 break
5747 }
5748 x := v_2.Args[2]
5749 ptr2 := v_2.Args[0]
5750 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) {
5751 break
5752 }
5753 v.reset(OpARMMOVHUreg)
5754 v.AddArg(x)
5755 return true
5756 }
5757
5758
5759 for {
5760 ptr := v_0
5761 if v_1.Op != OpARMMOVWconst {
5762 break
5763 }
5764 c := auxIntToInt32(v_1.AuxInt)
5765 mem := v_2
5766 v.reset(OpARMMOVHUload)
5767 v.AuxInt = int32ToAuxInt(c)
5768 v.AddArg2(ptr, mem)
5769 return true
5770 }
5771
5772
5773 for {
5774 if v_0.Op != OpARMMOVWconst {
5775 break
5776 }
5777 c := auxIntToInt32(v_0.AuxInt)
5778 ptr := v_1
5779 mem := v_2
5780 v.reset(OpARMMOVHUload)
5781 v.AuxInt = int32ToAuxInt(c)
5782 v.AddArg2(ptr, mem)
5783 return true
5784 }
5785 return false
5786 }
5787 func rewriteValueARM_OpARMMOVHUreg(v *Value) bool {
5788 v_0 := v.Args[0]
5789
5790
5791 for {
5792 x := v_0
5793 if x.Op != OpARMMOVBUload {
5794 break
5795 }
5796 v.reset(OpARMMOVWreg)
5797 v.AddArg(x)
5798 return true
5799 }
5800
5801
5802 for {
5803 x := v_0
5804 if x.Op != OpARMMOVHUload {
5805 break
5806 }
5807 v.reset(OpARMMOVWreg)
5808 v.AddArg(x)
5809 return true
5810 }
5811
5812
5813 for {
5814 if v_0.Op != OpARMANDconst {
5815 break
5816 }
5817 c := auxIntToInt32(v_0.AuxInt)
5818 x := v_0.Args[0]
5819 v.reset(OpARMANDconst)
5820 v.AuxInt = int32ToAuxInt(c & 0xffff)
5821 v.AddArg(x)
5822 return true
5823 }
5824
5825
5826 for {
5827 x := v_0
5828 if x.Op != OpARMMOVBUreg {
5829 break
5830 }
5831 v.reset(OpARMMOVWreg)
5832 v.AddArg(x)
5833 return true
5834 }
5835
5836
5837 for {
5838 x := v_0
5839 if x.Op != OpARMMOVHUreg {
5840 break
5841 }
5842 v.reset(OpARMMOVWreg)
5843 v.AddArg(x)
5844 return true
5845 }
5846
5847
5848 for {
5849 if v_0.Op != OpARMMOVWconst {
5850 break
5851 }
5852 c := auxIntToInt32(v_0.AuxInt)
5853 v.reset(OpARMMOVWconst)
5854 v.AuxInt = int32ToAuxInt(int32(uint16(c)))
5855 return true
5856 }
5857 return false
5858 }
5859 func rewriteValueARM_OpARMMOVHload(v *Value) bool {
5860 v_1 := v.Args[1]
5861 v_0 := v.Args[0]
5862 b := v.Block
5863 config := b.Func.Config
5864
5865
5866 for {
5867 off1 := auxIntToInt32(v.AuxInt)
5868 sym := auxToSym(v.Aux)
5869 if v_0.Op != OpARMADDconst {
5870 break
5871 }
5872 off2 := auxIntToInt32(v_0.AuxInt)
5873 ptr := v_0.Args[0]
5874 mem := v_1
5875 v.reset(OpARMMOVHload)
5876 v.AuxInt = int32ToAuxInt(off1 + off2)
5877 v.Aux = symToAux(sym)
5878 v.AddArg2(ptr, mem)
5879 return true
5880 }
5881
5882
5883 for {
5884 off1 := auxIntToInt32(v.AuxInt)
5885 sym := auxToSym(v.Aux)
5886 if v_0.Op != OpARMSUBconst {
5887 break
5888 }
5889 off2 := auxIntToInt32(v_0.AuxInt)
5890 ptr := v_0.Args[0]
5891 mem := v_1
5892 v.reset(OpARMMOVHload)
5893 v.AuxInt = int32ToAuxInt(off1 - off2)
5894 v.Aux = symToAux(sym)
5895 v.AddArg2(ptr, mem)
5896 return true
5897 }
5898
5899
5900
5901 for {
5902 off1 := auxIntToInt32(v.AuxInt)
5903 sym1 := auxToSym(v.Aux)
5904 if v_0.Op != OpARMMOVWaddr {
5905 break
5906 }
5907 off2 := auxIntToInt32(v_0.AuxInt)
5908 sym2 := auxToSym(v_0.Aux)
5909 ptr := v_0.Args[0]
5910 mem := v_1
5911 if !(canMergeSym(sym1, sym2)) {
5912 break
5913 }
5914 v.reset(OpARMMOVHload)
5915 v.AuxInt = int32ToAuxInt(off1 + off2)
5916 v.Aux = symToAux(mergeSym(sym1, sym2))
5917 v.AddArg2(ptr, mem)
5918 return true
5919 }
5920
5921
5922
5923 for {
5924 off := auxIntToInt32(v.AuxInt)
5925 sym := auxToSym(v.Aux)
5926 ptr := v_0
5927 if v_1.Op != OpARMMOVHstore {
5928 break
5929 }
5930 off2 := auxIntToInt32(v_1.AuxInt)
5931 sym2 := auxToSym(v_1.Aux)
5932 x := v_1.Args[1]
5933 ptr2 := v_1.Args[0]
5934 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
5935 break
5936 }
5937 v.reset(OpARMMOVHreg)
5938 v.AddArg(x)
5939 return true
5940 }
5941
5942
5943
5944 for {
5945 if auxIntToInt32(v.AuxInt) != 0 {
5946 break
5947 }
5948 sym := auxToSym(v.Aux)
5949 if v_0.Op != OpARMADD {
5950 break
5951 }
5952 idx := v_0.Args[1]
5953 ptr := v_0.Args[0]
5954 mem := v_1
5955 if !(sym == nil) {
5956 break
5957 }
5958 v.reset(OpARMMOVHloadidx)
5959 v.AddArg3(ptr, idx, mem)
5960 return true
5961 }
5962
5963
5964
5965 for {
5966 off := auxIntToInt32(v.AuxInt)
5967 sym := auxToSym(v.Aux)
5968 if v_0.Op != OpSB || !(symIsRO(sym)) {
5969 break
5970 }
5971 v.reset(OpARMMOVWconst)
5972 v.AuxInt = int32ToAuxInt(int32(int16(read16(sym, int64(off), config.ctxt.Arch.ByteOrder))))
5973 return true
5974 }
5975 return false
5976 }
5977 func rewriteValueARM_OpARMMOVHloadidx(v *Value) bool {
5978 v_2 := v.Args[2]
5979 v_1 := v.Args[1]
5980 v_0 := v.Args[0]
5981
5982
5983
5984 for {
5985 ptr := v_0
5986 idx := v_1
5987 if v_2.Op != OpARMMOVHstoreidx {
5988 break
5989 }
5990 x := v_2.Args[2]
5991 ptr2 := v_2.Args[0]
5992 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) {
5993 break
5994 }
5995 v.reset(OpARMMOVHreg)
5996 v.AddArg(x)
5997 return true
5998 }
5999
6000
6001 for {
6002 ptr := v_0
6003 if v_1.Op != OpARMMOVWconst {
6004 break
6005 }
6006 c := auxIntToInt32(v_1.AuxInt)
6007 mem := v_2
6008 v.reset(OpARMMOVHload)
6009 v.AuxInt = int32ToAuxInt(c)
6010 v.AddArg2(ptr, mem)
6011 return true
6012 }
6013
6014
6015 for {
6016 if v_0.Op != OpARMMOVWconst {
6017 break
6018 }
6019 c := auxIntToInt32(v_0.AuxInt)
6020 ptr := v_1
6021 mem := v_2
6022 v.reset(OpARMMOVHload)
6023 v.AuxInt = int32ToAuxInt(c)
6024 v.AddArg2(ptr, mem)
6025 return true
6026 }
6027 return false
6028 }
6029 func rewriteValueARM_OpARMMOVHreg(v *Value) bool {
6030 v_0 := v.Args[0]
6031
6032
6033 for {
6034 x := v_0
6035 if x.Op != OpARMMOVBload {
6036 break
6037 }
6038 v.reset(OpARMMOVWreg)
6039 v.AddArg(x)
6040 return true
6041 }
6042
6043
6044 for {
6045 x := v_0
6046 if x.Op != OpARMMOVBUload {
6047 break
6048 }
6049 v.reset(OpARMMOVWreg)
6050 v.AddArg(x)
6051 return true
6052 }
6053
6054
6055 for {
6056 x := v_0
6057 if x.Op != OpARMMOVHload {
6058 break
6059 }
6060 v.reset(OpARMMOVWreg)
6061 v.AddArg(x)
6062 return true
6063 }
6064
6065
6066
6067 for {
6068 if v_0.Op != OpARMANDconst {
6069 break
6070 }
6071 c := auxIntToInt32(v_0.AuxInt)
6072 x := v_0.Args[0]
6073 if !(c&0x8000 == 0) {
6074 break
6075 }
6076 v.reset(OpARMANDconst)
6077 v.AuxInt = int32ToAuxInt(c & 0x7fff)
6078 v.AddArg(x)
6079 return true
6080 }
6081
6082
6083 for {
6084 x := v_0
6085 if x.Op != OpARMMOVBreg {
6086 break
6087 }
6088 v.reset(OpARMMOVWreg)
6089 v.AddArg(x)
6090 return true
6091 }
6092
6093
6094 for {
6095 x := v_0
6096 if x.Op != OpARMMOVBUreg {
6097 break
6098 }
6099 v.reset(OpARMMOVWreg)
6100 v.AddArg(x)
6101 return true
6102 }
6103
6104
6105 for {
6106 x := v_0
6107 if x.Op != OpARMMOVHreg {
6108 break
6109 }
6110 v.reset(OpARMMOVWreg)
6111 v.AddArg(x)
6112 return true
6113 }
6114
6115
6116 for {
6117 if v_0.Op != OpARMMOVWconst {
6118 break
6119 }
6120 c := auxIntToInt32(v_0.AuxInt)
6121 v.reset(OpARMMOVWconst)
6122 v.AuxInt = int32ToAuxInt(int32(int16(c)))
6123 return true
6124 }
6125 return false
6126 }
6127 func rewriteValueARM_OpARMMOVHstore(v *Value) bool {
6128 v_2 := v.Args[2]
6129 v_1 := v.Args[1]
6130 v_0 := v.Args[0]
6131
6132
6133 for {
6134 off1 := auxIntToInt32(v.AuxInt)
6135 sym := auxToSym(v.Aux)
6136 if v_0.Op != OpARMADDconst {
6137 break
6138 }
6139 off2 := auxIntToInt32(v_0.AuxInt)
6140 ptr := v_0.Args[0]
6141 val := v_1
6142 mem := v_2
6143 v.reset(OpARMMOVHstore)
6144 v.AuxInt = int32ToAuxInt(off1 + off2)
6145 v.Aux = symToAux(sym)
6146 v.AddArg3(ptr, val, mem)
6147 return true
6148 }
6149
6150
6151 for {
6152 off1 := auxIntToInt32(v.AuxInt)
6153 sym := auxToSym(v.Aux)
6154 if v_0.Op != OpARMSUBconst {
6155 break
6156 }
6157 off2 := auxIntToInt32(v_0.AuxInt)
6158 ptr := v_0.Args[0]
6159 val := v_1
6160 mem := v_2
6161 v.reset(OpARMMOVHstore)
6162 v.AuxInt = int32ToAuxInt(off1 - off2)
6163 v.Aux = symToAux(sym)
6164 v.AddArg3(ptr, val, mem)
6165 return true
6166 }
6167
6168
6169
6170 for {
6171 off1 := auxIntToInt32(v.AuxInt)
6172 sym1 := auxToSym(v.Aux)
6173 if v_0.Op != OpARMMOVWaddr {
6174 break
6175 }
6176 off2 := auxIntToInt32(v_0.AuxInt)
6177 sym2 := auxToSym(v_0.Aux)
6178 ptr := v_0.Args[0]
6179 val := v_1
6180 mem := v_2
6181 if !(canMergeSym(sym1, sym2)) {
6182 break
6183 }
6184 v.reset(OpARMMOVHstore)
6185 v.AuxInt = int32ToAuxInt(off1 + off2)
6186 v.Aux = symToAux(mergeSym(sym1, sym2))
6187 v.AddArg3(ptr, val, mem)
6188 return true
6189 }
6190
6191
6192 for {
6193 off := auxIntToInt32(v.AuxInt)
6194 sym := auxToSym(v.Aux)
6195 ptr := v_0
6196 if v_1.Op != OpARMMOVHreg {
6197 break
6198 }
6199 x := v_1.Args[0]
6200 mem := v_2
6201 v.reset(OpARMMOVHstore)
6202 v.AuxInt = int32ToAuxInt(off)
6203 v.Aux = symToAux(sym)
6204 v.AddArg3(ptr, x, mem)
6205 return true
6206 }
6207
6208
6209 for {
6210 off := auxIntToInt32(v.AuxInt)
6211 sym := auxToSym(v.Aux)
6212 ptr := v_0
6213 if v_1.Op != OpARMMOVHUreg {
6214 break
6215 }
6216 x := v_1.Args[0]
6217 mem := v_2
6218 v.reset(OpARMMOVHstore)
6219 v.AuxInt = int32ToAuxInt(off)
6220 v.Aux = symToAux(sym)
6221 v.AddArg3(ptr, x, mem)
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 val := v_1
6238 mem := v_2
6239 if !(sym == nil) {
6240 break
6241 }
6242 v.reset(OpARMMOVHstoreidx)
6243 v.AddArg4(ptr, idx, val, mem)
6244 return true
6245 }
6246 return false
6247 }
6248 func rewriteValueARM_OpARMMOVHstoreidx(v *Value) bool {
6249 v_3 := v.Args[3]
6250 v_2 := v.Args[2]
6251 v_1 := v.Args[1]
6252 v_0 := v.Args[0]
6253
6254
6255 for {
6256 ptr := v_0
6257 if v_1.Op != OpARMMOVWconst {
6258 break
6259 }
6260 c := auxIntToInt32(v_1.AuxInt)
6261 val := v_2
6262 mem := v_3
6263 v.reset(OpARMMOVHstore)
6264 v.AuxInt = int32ToAuxInt(c)
6265 v.AddArg3(ptr, val, mem)
6266 return true
6267 }
6268
6269
6270 for {
6271 if v_0.Op != OpARMMOVWconst {
6272 break
6273 }
6274 c := auxIntToInt32(v_0.AuxInt)
6275 ptr := v_1
6276 val := v_2
6277 mem := v_3
6278 v.reset(OpARMMOVHstore)
6279 v.AuxInt = int32ToAuxInt(c)
6280 v.AddArg3(ptr, val, mem)
6281 return true
6282 }
6283 return false
6284 }
6285 func rewriteValueARM_OpARMMOVWload(v *Value) bool {
6286 v_1 := v.Args[1]
6287 v_0 := v.Args[0]
6288 b := v.Block
6289 config := b.Func.Config
6290
6291
6292 for {
6293 off1 := auxIntToInt32(v.AuxInt)
6294 sym := auxToSym(v.Aux)
6295 if v_0.Op != OpARMADDconst {
6296 break
6297 }
6298 off2 := auxIntToInt32(v_0.AuxInt)
6299 ptr := v_0.Args[0]
6300 mem := v_1
6301 v.reset(OpARMMOVWload)
6302 v.AuxInt = int32ToAuxInt(off1 + off2)
6303 v.Aux = symToAux(sym)
6304 v.AddArg2(ptr, mem)
6305 return true
6306 }
6307
6308
6309 for {
6310 off1 := auxIntToInt32(v.AuxInt)
6311 sym := auxToSym(v.Aux)
6312 if v_0.Op != OpARMSUBconst {
6313 break
6314 }
6315 off2 := auxIntToInt32(v_0.AuxInt)
6316 ptr := v_0.Args[0]
6317 mem := v_1
6318 v.reset(OpARMMOVWload)
6319 v.AuxInt = int32ToAuxInt(off1 - off2)
6320 v.Aux = symToAux(sym)
6321 v.AddArg2(ptr, mem)
6322 return true
6323 }
6324
6325
6326
6327 for {
6328 off1 := auxIntToInt32(v.AuxInt)
6329 sym1 := auxToSym(v.Aux)
6330 if v_0.Op != OpARMMOVWaddr {
6331 break
6332 }
6333 off2 := auxIntToInt32(v_0.AuxInt)
6334 sym2 := auxToSym(v_0.Aux)
6335 ptr := v_0.Args[0]
6336 mem := v_1
6337 if !(canMergeSym(sym1, sym2)) {
6338 break
6339 }
6340 v.reset(OpARMMOVWload)
6341 v.AuxInt = int32ToAuxInt(off1 + off2)
6342 v.Aux = symToAux(mergeSym(sym1, sym2))
6343 v.AddArg2(ptr, mem)
6344 return true
6345 }
6346
6347
6348
6349 for {
6350 off := auxIntToInt32(v.AuxInt)
6351 sym := auxToSym(v.Aux)
6352 ptr := v_0
6353 if v_1.Op != OpARMMOVWstore {
6354 break
6355 }
6356 off2 := auxIntToInt32(v_1.AuxInt)
6357 sym2 := auxToSym(v_1.Aux)
6358 x := v_1.Args[1]
6359 ptr2 := v_1.Args[0]
6360 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
6361 break
6362 }
6363 v.copyOf(x)
6364 return true
6365 }
6366
6367
6368
6369 for {
6370 if auxIntToInt32(v.AuxInt) != 0 {
6371 break
6372 }
6373 sym := auxToSym(v.Aux)
6374 if v_0.Op != OpARMADD {
6375 break
6376 }
6377 idx := v_0.Args[1]
6378 ptr := v_0.Args[0]
6379 mem := v_1
6380 if !(sym == nil) {
6381 break
6382 }
6383 v.reset(OpARMMOVWloadidx)
6384 v.AddArg3(ptr, idx, mem)
6385 return true
6386 }
6387
6388
6389
6390 for {
6391 if auxIntToInt32(v.AuxInt) != 0 {
6392 break
6393 }
6394 sym := auxToSym(v.Aux)
6395 if v_0.Op != OpARMADDshiftLL {
6396 break
6397 }
6398 c := auxIntToInt32(v_0.AuxInt)
6399 idx := v_0.Args[1]
6400 ptr := v_0.Args[0]
6401 mem := v_1
6402 if !(sym == nil) {
6403 break
6404 }
6405 v.reset(OpARMMOVWloadshiftLL)
6406 v.AuxInt = int32ToAuxInt(c)
6407 v.AddArg3(ptr, idx, mem)
6408 return true
6409 }
6410
6411
6412
6413 for {
6414 if auxIntToInt32(v.AuxInt) != 0 {
6415 break
6416 }
6417 sym := auxToSym(v.Aux)
6418 if v_0.Op != OpARMADDshiftRL {
6419 break
6420 }
6421 c := auxIntToInt32(v_0.AuxInt)
6422 idx := v_0.Args[1]
6423 ptr := v_0.Args[0]
6424 mem := v_1
6425 if !(sym == nil) {
6426 break
6427 }
6428 v.reset(OpARMMOVWloadshiftRL)
6429 v.AuxInt = int32ToAuxInt(c)
6430 v.AddArg3(ptr, idx, mem)
6431 return true
6432 }
6433
6434
6435
6436 for {
6437 if auxIntToInt32(v.AuxInt) != 0 {
6438 break
6439 }
6440 sym := auxToSym(v.Aux)
6441 if v_0.Op != OpARMADDshiftRA {
6442 break
6443 }
6444 c := auxIntToInt32(v_0.AuxInt)
6445 idx := v_0.Args[1]
6446 ptr := v_0.Args[0]
6447 mem := v_1
6448 if !(sym == nil) {
6449 break
6450 }
6451 v.reset(OpARMMOVWloadshiftRA)
6452 v.AuxInt = int32ToAuxInt(c)
6453 v.AddArg3(ptr, idx, mem)
6454 return true
6455 }
6456
6457
6458
6459 for {
6460 off := auxIntToInt32(v.AuxInt)
6461 sym := auxToSym(v.Aux)
6462 if v_0.Op != OpSB || !(symIsRO(sym)) {
6463 break
6464 }
6465 v.reset(OpARMMOVWconst)
6466 v.AuxInt = int32ToAuxInt(int32(read32(sym, int64(off), config.ctxt.Arch.ByteOrder)))
6467 return true
6468 }
6469 return false
6470 }
6471 func rewriteValueARM_OpARMMOVWloadidx(v *Value) bool {
6472 v_2 := v.Args[2]
6473 v_1 := v.Args[1]
6474 v_0 := v.Args[0]
6475
6476
6477
6478 for {
6479 ptr := v_0
6480 idx := v_1
6481 if v_2.Op != OpARMMOVWstoreidx {
6482 break
6483 }
6484 x := v_2.Args[2]
6485 ptr2 := v_2.Args[0]
6486 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) {
6487 break
6488 }
6489 v.copyOf(x)
6490 return true
6491 }
6492
6493
6494 for {
6495 ptr := v_0
6496 if v_1.Op != OpARMMOVWconst {
6497 break
6498 }
6499 c := auxIntToInt32(v_1.AuxInt)
6500 mem := v_2
6501 v.reset(OpARMMOVWload)
6502 v.AuxInt = int32ToAuxInt(c)
6503 v.AddArg2(ptr, mem)
6504 return true
6505 }
6506
6507
6508 for {
6509 if v_0.Op != OpARMMOVWconst {
6510 break
6511 }
6512 c := auxIntToInt32(v_0.AuxInt)
6513 ptr := v_1
6514 mem := v_2
6515 v.reset(OpARMMOVWload)
6516 v.AuxInt = int32ToAuxInt(c)
6517 v.AddArg2(ptr, mem)
6518 return true
6519 }
6520
6521
6522 for {
6523 ptr := v_0
6524 if v_1.Op != OpARMSLLconst {
6525 break
6526 }
6527 c := auxIntToInt32(v_1.AuxInt)
6528 idx := v_1.Args[0]
6529 mem := v_2
6530 v.reset(OpARMMOVWloadshiftLL)
6531 v.AuxInt = int32ToAuxInt(c)
6532 v.AddArg3(ptr, idx, mem)
6533 return true
6534 }
6535
6536
6537 for {
6538 if v_0.Op != OpARMSLLconst {
6539 break
6540 }
6541 c := auxIntToInt32(v_0.AuxInt)
6542 idx := v_0.Args[0]
6543 ptr := v_1
6544 mem := v_2
6545 v.reset(OpARMMOVWloadshiftLL)
6546 v.AuxInt = int32ToAuxInt(c)
6547 v.AddArg3(ptr, idx, mem)
6548 return true
6549 }
6550
6551
6552 for {
6553 ptr := v_0
6554 if v_1.Op != OpARMSRLconst {
6555 break
6556 }
6557 c := auxIntToInt32(v_1.AuxInt)
6558 idx := v_1.Args[0]
6559 mem := v_2
6560 v.reset(OpARMMOVWloadshiftRL)
6561 v.AuxInt = int32ToAuxInt(c)
6562 v.AddArg3(ptr, idx, mem)
6563 return true
6564 }
6565
6566
6567 for {
6568 if v_0.Op != OpARMSRLconst {
6569 break
6570 }
6571 c := auxIntToInt32(v_0.AuxInt)
6572 idx := v_0.Args[0]
6573 ptr := v_1
6574 mem := v_2
6575 v.reset(OpARMMOVWloadshiftRL)
6576 v.AuxInt = int32ToAuxInt(c)
6577 v.AddArg3(ptr, idx, mem)
6578 return true
6579 }
6580
6581
6582 for {
6583 ptr := v_0
6584 if v_1.Op != OpARMSRAconst {
6585 break
6586 }
6587 c := auxIntToInt32(v_1.AuxInt)
6588 idx := v_1.Args[0]
6589 mem := v_2
6590 v.reset(OpARMMOVWloadshiftRA)
6591 v.AuxInt = int32ToAuxInt(c)
6592 v.AddArg3(ptr, idx, mem)
6593 return true
6594 }
6595
6596
6597 for {
6598 if v_0.Op != OpARMSRAconst {
6599 break
6600 }
6601 c := auxIntToInt32(v_0.AuxInt)
6602 idx := v_0.Args[0]
6603 ptr := v_1
6604 mem := v_2
6605 v.reset(OpARMMOVWloadshiftRA)
6606 v.AuxInt = int32ToAuxInt(c)
6607 v.AddArg3(ptr, idx, mem)
6608 return true
6609 }
6610 return false
6611 }
6612 func rewriteValueARM_OpARMMOVWloadshiftLL(v *Value) bool {
6613 v_2 := v.Args[2]
6614 v_1 := v.Args[1]
6615 v_0 := v.Args[0]
6616
6617
6618
6619 for {
6620 c := auxIntToInt32(v.AuxInt)
6621 ptr := v_0
6622 idx := v_1
6623 if v_2.Op != OpARMMOVWstoreshiftLL {
6624 break
6625 }
6626 d := auxIntToInt32(v_2.AuxInt)
6627 x := v_2.Args[2]
6628 ptr2 := v_2.Args[0]
6629 if idx != v_2.Args[1] || !(c == d && isSamePtr(ptr, ptr2)) {
6630 break
6631 }
6632 v.copyOf(x)
6633 return true
6634 }
6635
6636
6637 for {
6638 d := auxIntToInt32(v.AuxInt)
6639 ptr := v_0
6640 if v_1.Op != OpARMMOVWconst {
6641 break
6642 }
6643 c := auxIntToInt32(v_1.AuxInt)
6644 mem := v_2
6645 v.reset(OpARMMOVWload)
6646 v.AuxInt = int32ToAuxInt(int32(uint32(c) << uint64(d)))
6647 v.AddArg2(ptr, mem)
6648 return true
6649 }
6650 return false
6651 }
6652 func rewriteValueARM_OpARMMOVWloadshiftRA(v *Value) bool {
6653 v_2 := v.Args[2]
6654 v_1 := v.Args[1]
6655 v_0 := v.Args[0]
6656
6657
6658
6659 for {
6660 c := auxIntToInt32(v.AuxInt)
6661 ptr := v_0
6662 idx := v_1
6663 if v_2.Op != OpARMMOVWstoreshiftRA {
6664 break
6665 }
6666 d := auxIntToInt32(v_2.AuxInt)
6667 x := v_2.Args[2]
6668 ptr2 := v_2.Args[0]
6669 if idx != v_2.Args[1] || !(c == d && isSamePtr(ptr, ptr2)) {
6670 break
6671 }
6672 v.copyOf(x)
6673 return true
6674 }
6675
6676
6677 for {
6678 d := auxIntToInt32(v.AuxInt)
6679 ptr := v_0
6680 if v_1.Op != OpARMMOVWconst {
6681 break
6682 }
6683 c := auxIntToInt32(v_1.AuxInt)
6684 mem := v_2
6685 v.reset(OpARMMOVWload)
6686 v.AuxInt = int32ToAuxInt(c >> uint64(d))
6687 v.AddArg2(ptr, mem)
6688 return true
6689 }
6690 return false
6691 }
6692 func rewriteValueARM_OpARMMOVWloadshiftRL(v *Value) bool {
6693 v_2 := v.Args[2]
6694 v_1 := v.Args[1]
6695 v_0 := v.Args[0]
6696
6697
6698
6699 for {
6700 c := auxIntToInt32(v.AuxInt)
6701 ptr := v_0
6702 idx := v_1
6703 if v_2.Op != OpARMMOVWstoreshiftRL {
6704 break
6705 }
6706 d := auxIntToInt32(v_2.AuxInt)
6707 x := v_2.Args[2]
6708 ptr2 := v_2.Args[0]
6709 if idx != v_2.Args[1] || !(c == d && isSamePtr(ptr, ptr2)) {
6710 break
6711 }
6712 v.copyOf(x)
6713 return true
6714 }
6715
6716
6717 for {
6718 d := auxIntToInt32(v.AuxInt)
6719 ptr := v_0
6720 if v_1.Op != OpARMMOVWconst {
6721 break
6722 }
6723 c := auxIntToInt32(v_1.AuxInt)
6724 mem := v_2
6725 v.reset(OpARMMOVWload)
6726 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
6727 v.AddArg2(ptr, mem)
6728 return true
6729 }
6730 return false
6731 }
6732 func rewriteValueARM_OpARMMOVWnop(v *Value) bool {
6733 v_0 := v.Args[0]
6734
6735
6736 for {
6737 if v_0.Op != OpARMMOVWconst {
6738 break
6739 }
6740 c := auxIntToInt32(v_0.AuxInt)
6741 v.reset(OpARMMOVWconst)
6742 v.AuxInt = int32ToAuxInt(c)
6743 return true
6744 }
6745 return false
6746 }
6747 func rewriteValueARM_OpARMMOVWreg(v *Value) bool {
6748 v_0 := v.Args[0]
6749
6750
6751
6752 for {
6753 x := v_0
6754 if !(x.Uses == 1) {
6755 break
6756 }
6757 v.reset(OpARMMOVWnop)
6758 v.AddArg(x)
6759 return true
6760 }
6761
6762
6763 for {
6764 if v_0.Op != OpARMMOVWconst {
6765 break
6766 }
6767 c := auxIntToInt32(v_0.AuxInt)
6768 v.reset(OpARMMOVWconst)
6769 v.AuxInt = int32ToAuxInt(c)
6770 return true
6771 }
6772 return false
6773 }
6774 func rewriteValueARM_OpARMMOVWstore(v *Value) bool {
6775 v_2 := v.Args[2]
6776 v_1 := v.Args[1]
6777 v_0 := v.Args[0]
6778
6779
6780 for {
6781 off1 := auxIntToInt32(v.AuxInt)
6782 sym := auxToSym(v.Aux)
6783 if v_0.Op != OpARMADDconst {
6784 break
6785 }
6786 off2 := auxIntToInt32(v_0.AuxInt)
6787 ptr := v_0.Args[0]
6788 val := v_1
6789 mem := v_2
6790 v.reset(OpARMMOVWstore)
6791 v.AuxInt = int32ToAuxInt(off1 + off2)
6792 v.Aux = symToAux(sym)
6793 v.AddArg3(ptr, val, mem)
6794 return true
6795 }
6796
6797
6798 for {
6799 off1 := auxIntToInt32(v.AuxInt)
6800 sym := auxToSym(v.Aux)
6801 if v_0.Op != OpARMSUBconst {
6802 break
6803 }
6804 off2 := auxIntToInt32(v_0.AuxInt)
6805 ptr := v_0.Args[0]
6806 val := v_1
6807 mem := v_2
6808 v.reset(OpARMMOVWstore)
6809 v.AuxInt = int32ToAuxInt(off1 - off2)
6810 v.Aux = symToAux(sym)
6811 v.AddArg3(ptr, val, mem)
6812 return true
6813 }
6814
6815
6816
6817 for {
6818 off1 := auxIntToInt32(v.AuxInt)
6819 sym1 := auxToSym(v.Aux)
6820 if v_0.Op != OpARMMOVWaddr {
6821 break
6822 }
6823 off2 := auxIntToInt32(v_0.AuxInt)
6824 sym2 := auxToSym(v_0.Aux)
6825 ptr := v_0.Args[0]
6826 val := v_1
6827 mem := v_2
6828 if !(canMergeSym(sym1, sym2)) {
6829 break
6830 }
6831 v.reset(OpARMMOVWstore)
6832 v.AuxInt = int32ToAuxInt(off1 + off2)
6833 v.Aux = symToAux(mergeSym(sym1, sym2))
6834 v.AddArg3(ptr, val, mem)
6835 return true
6836 }
6837
6838
6839
6840 for {
6841 if auxIntToInt32(v.AuxInt) != 0 {
6842 break
6843 }
6844 sym := auxToSym(v.Aux)
6845 if v_0.Op != OpARMADD {
6846 break
6847 }
6848 idx := v_0.Args[1]
6849 ptr := v_0.Args[0]
6850 val := v_1
6851 mem := v_2
6852 if !(sym == nil) {
6853 break
6854 }
6855 v.reset(OpARMMOVWstoreidx)
6856 v.AddArg4(ptr, idx, val, mem)
6857 return true
6858 }
6859
6860
6861
6862 for {
6863 if auxIntToInt32(v.AuxInt) != 0 {
6864 break
6865 }
6866 sym := auxToSym(v.Aux)
6867 if v_0.Op != OpARMADDshiftLL {
6868 break
6869 }
6870 c := auxIntToInt32(v_0.AuxInt)
6871 idx := v_0.Args[1]
6872 ptr := v_0.Args[0]
6873 val := v_1
6874 mem := v_2
6875 if !(sym == nil) {
6876 break
6877 }
6878 v.reset(OpARMMOVWstoreshiftLL)
6879 v.AuxInt = int32ToAuxInt(c)
6880 v.AddArg4(ptr, idx, val, mem)
6881 return true
6882 }
6883
6884
6885
6886 for {
6887 if auxIntToInt32(v.AuxInt) != 0 {
6888 break
6889 }
6890 sym := auxToSym(v.Aux)
6891 if v_0.Op != OpARMADDshiftRL {
6892 break
6893 }
6894 c := auxIntToInt32(v_0.AuxInt)
6895 idx := v_0.Args[1]
6896 ptr := v_0.Args[0]
6897 val := v_1
6898 mem := v_2
6899 if !(sym == nil) {
6900 break
6901 }
6902 v.reset(OpARMMOVWstoreshiftRL)
6903 v.AuxInt = int32ToAuxInt(c)
6904 v.AddArg4(ptr, idx, val, mem)
6905 return true
6906 }
6907
6908
6909
6910 for {
6911 if auxIntToInt32(v.AuxInt) != 0 {
6912 break
6913 }
6914 sym := auxToSym(v.Aux)
6915 if v_0.Op != OpARMADDshiftRA {
6916 break
6917 }
6918 c := auxIntToInt32(v_0.AuxInt)
6919 idx := v_0.Args[1]
6920 ptr := v_0.Args[0]
6921 val := v_1
6922 mem := v_2
6923 if !(sym == nil) {
6924 break
6925 }
6926 v.reset(OpARMMOVWstoreshiftRA)
6927 v.AuxInt = int32ToAuxInt(c)
6928 v.AddArg4(ptr, idx, val, mem)
6929 return true
6930 }
6931 return false
6932 }
6933 func rewriteValueARM_OpARMMOVWstoreidx(v *Value) bool {
6934 v_3 := v.Args[3]
6935 v_2 := v.Args[2]
6936 v_1 := v.Args[1]
6937 v_0 := v.Args[0]
6938
6939
6940 for {
6941 ptr := v_0
6942 if v_1.Op != OpARMMOVWconst {
6943 break
6944 }
6945 c := auxIntToInt32(v_1.AuxInt)
6946 val := v_2
6947 mem := v_3
6948 v.reset(OpARMMOVWstore)
6949 v.AuxInt = int32ToAuxInt(c)
6950 v.AddArg3(ptr, val, mem)
6951 return true
6952 }
6953
6954
6955 for {
6956 if v_0.Op != OpARMMOVWconst {
6957 break
6958 }
6959 c := auxIntToInt32(v_0.AuxInt)
6960 ptr := v_1
6961 val := v_2
6962 mem := v_3
6963 v.reset(OpARMMOVWstore)
6964 v.AuxInt = int32ToAuxInt(c)
6965 v.AddArg3(ptr, val, mem)
6966 return true
6967 }
6968
6969
6970 for {
6971 ptr := v_0
6972 if v_1.Op != OpARMSLLconst {
6973 break
6974 }
6975 c := auxIntToInt32(v_1.AuxInt)
6976 idx := v_1.Args[0]
6977 val := v_2
6978 mem := v_3
6979 v.reset(OpARMMOVWstoreshiftLL)
6980 v.AuxInt = int32ToAuxInt(c)
6981 v.AddArg4(ptr, idx, val, mem)
6982 return true
6983 }
6984
6985
6986 for {
6987 if v_0.Op != OpARMSLLconst {
6988 break
6989 }
6990 c := auxIntToInt32(v_0.AuxInt)
6991 idx := v_0.Args[0]
6992 ptr := v_1
6993 val := v_2
6994 mem := v_3
6995 v.reset(OpARMMOVWstoreshiftLL)
6996 v.AuxInt = int32ToAuxInt(c)
6997 v.AddArg4(ptr, idx, val, mem)
6998 return true
6999 }
7000
7001
7002 for {
7003 ptr := v_0
7004 if v_1.Op != OpARMSRLconst {
7005 break
7006 }
7007 c := auxIntToInt32(v_1.AuxInt)
7008 idx := v_1.Args[0]
7009 val := v_2
7010 mem := v_3
7011 v.reset(OpARMMOVWstoreshiftRL)
7012 v.AuxInt = int32ToAuxInt(c)
7013 v.AddArg4(ptr, idx, val, mem)
7014 return true
7015 }
7016
7017
7018 for {
7019 if v_0.Op != OpARMSRLconst {
7020 break
7021 }
7022 c := auxIntToInt32(v_0.AuxInt)
7023 idx := v_0.Args[0]
7024 ptr := v_1
7025 val := v_2
7026 mem := v_3
7027 v.reset(OpARMMOVWstoreshiftRL)
7028 v.AuxInt = int32ToAuxInt(c)
7029 v.AddArg4(ptr, idx, val, mem)
7030 return true
7031 }
7032
7033
7034 for {
7035 ptr := v_0
7036 if v_1.Op != OpARMSRAconst {
7037 break
7038 }
7039 c := auxIntToInt32(v_1.AuxInt)
7040 idx := v_1.Args[0]
7041 val := v_2
7042 mem := v_3
7043 v.reset(OpARMMOVWstoreshiftRA)
7044 v.AuxInt = int32ToAuxInt(c)
7045 v.AddArg4(ptr, idx, val, mem)
7046 return true
7047 }
7048
7049
7050 for {
7051 if v_0.Op != OpARMSRAconst {
7052 break
7053 }
7054 c := auxIntToInt32(v_0.AuxInt)
7055 idx := v_0.Args[0]
7056 ptr := v_1
7057 val := v_2
7058 mem := v_3
7059 v.reset(OpARMMOVWstoreshiftRA)
7060 v.AuxInt = int32ToAuxInt(c)
7061 v.AddArg4(ptr, idx, val, mem)
7062 return true
7063 }
7064 return false
7065 }
7066 func rewriteValueARM_OpARMMOVWstoreshiftLL(v *Value) bool {
7067 v_3 := v.Args[3]
7068 v_2 := v.Args[2]
7069 v_1 := v.Args[1]
7070 v_0 := v.Args[0]
7071
7072
7073 for {
7074 d := auxIntToInt32(v.AuxInt)
7075 ptr := v_0
7076 if v_1.Op != OpARMMOVWconst {
7077 break
7078 }
7079 c := auxIntToInt32(v_1.AuxInt)
7080 val := v_2
7081 mem := v_3
7082 v.reset(OpARMMOVWstore)
7083 v.AuxInt = int32ToAuxInt(int32(uint32(c) << uint64(d)))
7084 v.AddArg3(ptr, val, mem)
7085 return true
7086 }
7087 return false
7088 }
7089 func rewriteValueARM_OpARMMOVWstoreshiftRA(v *Value) bool {
7090 v_3 := v.Args[3]
7091 v_2 := v.Args[2]
7092 v_1 := v.Args[1]
7093 v_0 := v.Args[0]
7094
7095
7096 for {
7097 d := auxIntToInt32(v.AuxInt)
7098 ptr := v_0
7099 if v_1.Op != OpARMMOVWconst {
7100 break
7101 }
7102 c := auxIntToInt32(v_1.AuxInt)
7103 val := v_2
7104 mem := v_3
7105 v.reset(OpARMMOVWstore)
7106 v.AuxInt = int32ToAuxInt(c >> uint64(d))
7107 v.AddArg3(ptr, val, mem)
7108 return true
7109 }
7110 return false
7111 }
7112 func rewriteValueARM_OpARMMOVWstoreshiftRL(v *Value) bool {
7113 v_3 := v.Args[3]
7114 v_2 := v.Args[2]
7115 v_1 := v.Args[1]
7116 v_0 := v.Args[0]
7117
7118
7119 for {
7120 d := auxIntToInt32(v.AuxInt)
7121 ptr := v_0
7122 if v_1.Op != OpARMMOVWconst {
7123 break
7124 }
7125 c := auxIntToInt32(v_1.AuxInt)
7126 val := v_2
7127 mem := v_3
7128 v.reset(OpARMMOVWstore)
7129 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
7130 v.AddArg3(ptr, val, mem)
7131 return true
7132 }
7133 return false
7134 }
7135 func rewriteValueARM_OpARMMUL(v *Value) bool {
7136 v_1 := v.Args[1]
7137 v_0 := v.Args[0]
7138 b := v.Block
7139
7140
7141
7142 for {
7143 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7144 x := v_0
7145 if v_1.Op != OpARMMOVWconst {
7146 continue
7147 }
7148 c := auxIntToInt32(v_1.AuxInt)
7149 if !(int32(c) == -1) {
7150 continue
7151 }
7152 v.reset(OpARMRSBconst)
7153 v.AuxInt = int32ToAuxInt(0)
7154 v.AddArg(x)
7155 return true
7156 }
7157 break
7158 }
7159
7160
7161 for {
7162 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7163 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 0 {
7164 continue
7165 }
7166 v.reset(OpARMMOVWconst)
7167 v.AuxInt = int32ToAuxInt(0)
7168 return true
7169 }
7170 break
7171 }
7172
7173
7174 for {
7175 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7176 x := v_0
7177 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 1 {
7178 continue
7179 }
7180 v.copyOf(x)
7181 return true
7182 }
7183 break
7184 }
7185
7186
7187
7188 for {
7189 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7190 x := v_0
7191 if v_1.Op != OpARMMOVWconst {
7192 continue
7193 }
7194 c := auxIntToInt32(v_1.AuxInt)
7195 if !(isPowerOfTwo(c)) {
7196 continue
7197 }
7198 v.reset(OpARMSLLconst)
7199 v.AuxInt = int32ToAuxInt(int32(log32(c)))
7200 v.AddArg(x)
7201 return true
7202 }
7203 break
7204 }
7205
7206
7207
7208 for {
7209 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7210 x := v_0
7211 if v_1.Op != OpARMMOVWconst {
7212 continue
7213 }
7214 c := auxIntToInt32(v_1.AuxInt)
7215 if !(isPowerOfTwo(c-1) && c >= 3) {
7216 continue
7217 }
7218 v.reset(OpARMADDshiftLL)
7219 v.AuxInt = int32ToAuxInt(int32(log32(c - 1)))
7220 v.AddArg2(x, x)
7221 return true
7222 }
7223 break
7224 }
7225
7226
7227
7228 for {
7229 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7230 x := v_0
7231 if v_1.Op != OpARMMOVWconst {
7232 continue
7233 }
7234 c := auxIntToInt32(v_1.AuxInt)
7235 if !(isPowerOfTwo(c+1) && c >= 7) {
7236 continue
7237 }
7238 v.reset(OpARMRSBshiftLL)
7239 v.AuxInt = int32ToAuxInt(int32(log32(c + 1)))
7240 v.AddArg2(x, x)
7241 return true
7242 }
7243 break
7244 }
7245
7246
7247
7248 for {
7249 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7250 x := v_0
7251 if v_1.Op != OpARMMOVWconst {
7252 continue
7253 }
7254 c := auxIntToInt32(v_1.AuxInt)
7255 if !(c%3 == 0 && isPowerOfTwo(c/3)) {
7256 continue
7257 }
7258 v.reset(OpARMSLLconst)
7259 v.AuxInt = int32ToAuxInt(int32(log32(c / 3)))
7260 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7261 v0.AuxInt = int32ToAuxInt(1)
7262 v0.AddArg2(x, x)
7263 v.AddArg(v0)
7264 return true
7265 }
7266 break
7267 }
7268
7269
7270
7271 for {
7272 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7273 x := v_0
7274 if v_1.Op != OpARMMOVWconst {
7275 continue
7276 }
7277 c := auxIntToInt32(v_1.AuxInt)
7278 if !(c%5 == 0 && isPowerOfTwo(c/5)) {
7279 continue
7280 }
7281 v.reset(OpARMSLLconst)
7282 v.AuxInt = int32ToAuxInt(int32(log32(c / 5)))
7283 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7284 v0.AuxInt = int32ToAuxInt(2)
7285 v0.AddArg2(x, x)
7286 v.AddArg(v0)
7287 return true
7288 }
7289 break
7290 }
7291
7292
7293
7294 for {
7295 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7296 x := v_0
7297 if v_1.Op != OpARMMOVWconst {
7298 continue
7299 }
7300 c := auxIntToInt32(v_1.AuxInt)
7301 if !(c%7 == 0 && isPowerOfTwo(c/7)) {
7302 continue
7303 }
7304 v.reset(OpARMSLLconst)
7305 v.AuxInt = int32ToAuxInt(int32(log32(c / 7)))
7306 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7307 v0.AuxInt = int32ToAuxInt(3)
7308 v0.AddArg2(x, x)
7309 v.AddArg(v0)
7310 return true
7311 }
7312 break
7313 }
7314
7315
7316
7317 for {
7318 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7319 x := v_0
7320 if v_1.Op != OpARMMOVWconst {
7321 continue
7322 }
7323 c := auxIntToInt32(v_1.AuxInt)
7324 if !(c%9 == 0 && isPowerOfTwo(c/9)) {
7325 continue
7326 }
7327 v.reset(OpARMSLLconst)
7328 v.AuxInt = int32ToAuxInt(int32(log32(c / 9)))
7329 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7330 v0.AuxInt = int32ToAuxInt(3)
7331 v0.AddArg2(x, x)
7332 v.AddArg(v0)
7333 return true
7334 }
7335 break
7336 }
7337
7338
7339 for {
7340 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7341 if v_0.Op != OpARMMOVWconst {
7342 continue
7343 }
7344 c := auxIntToInt32(v_0.AuxInt)
7345 if v_1.Op != OpARMMOVWconst {
7346 continue
7347 }
7348 d := auxIntToInt32(v_1.AuxInt)
7349 v.reset(OpARMMOVWconst)
7350 v.AuxInt = int32ToAuxInt(c * d)
7351 return true
7352 }
7353 break
7354 }
7355 return false
7356 }
7357 func rewriteValueARM_OpARMMULA(v *Value) bool {
7358 v_2 := v.Args[2]
7359 v_1 := v.Args[1]
7360 v_0 := v.Args[0]
7361 b := v.Block
7362
7363
7364
7365 for {
7366 x := v_0
7367 if v_1.Op != OpARMMOVWconst {
7368 break
7369 }
7370 c := auxIntToInt32(v_1.AuxInt)
7371 a := v_2
7372 if !(c == -1) {
7373 break
7374 }
7375 v.reset(OpARMSUB)
7376 v.AddArg2(a, x)
7377 return true
7378 }
7379
7380
7381 for {
7382 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 0 {
7383 break
7384 }
7385 a := v_2
7386 v.copyOf(a)
7387 return true
7388 }
7389
7390
7391 for {
7392 x := v_0
7393 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 1 {
7394 break
7395 }
7396 a := v_2
7397 v.reset(OpARMADD)
7398 v.AddArg2(x, a)
7399 return true
7400 }
7401
7402
7403
7404 for {
7405 x := v_0
7406 if v_1.Op != OpARMMOVWconst {
7407 break
7408 }
7409 c := auxIntToInt32(v_1.AuxInt)
7410 a := v_2
7411 if !(isPowerOfTwo(c)) {
7412 break
7413 }
7414 v.reset(OpARMADD)
7415 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7416 v0.AuxInt = int32ToAuxInt(int32(log32(c)))
7417 v0.AddArg(x)
7418 v.AddArg2(v0, a)
7419 return true
7420 }
7421
7422
7423
7424 for {
7425 x := v_0
7426 if v_1.Op != OpARMMOVWconst {
7427 break
7428 }
7429 c := auxIntToInt32(v_1.AuxInt)
7430 a := v_2
7431 if !(isPowerOfTwo(c-1) && c >= 3) {
7432 break
7433 }
7434 v.reset(OpARMADD)
7435 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7436 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1)))
7437 v0.AddArg2(x, x)
7438 v.AddArg2(v0, a)
7439 return true
7440 }
7441
7442
7443
7444 for {
7445 x := v_0
7446 if v_1.Op != OpARMMOVWconst {
7447 break
7448 }
7449 c := auxIntToInt32(v_1.AuxInt)
7450 a := v_2
7451 if !(isPowerOfTwo(c+1) && c >= 7) {
7452 break
7453 }
7454 v.reset(OpARMADD)
7455 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7456 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1)))
7457 v0.AddArg2(x, x)
7458 v.AddArg2(v0, a)
7459 return true
7460 }
7461
7462
7463
7464 for {
7465 x := v_0
7466 if v_1.Op != OpARMMOVWconst {
7467 break
7468 }
7469 c := auxIntToInt32(v_1.AuxInt)
7470 a := v_2
7471 if !(c%3 == 0 && isPowerOfTwo(c/3)) {
7472 break
7473 }
7474 v.reset(OpARMADD)
7475 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7476 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3)))
7477 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7478 v1.AuxInt = int32ToAuxInt(1)
7479 v1.AddArg2(x, x)
7480 v0.AddArg(v1)
7481 v.AddArg2(v0, a)
7482 return true
7483 }
7484
7485
7486
7487 for {
7488 x := v_0
7489 if v_1.Op != OpARMMOVWconst {
7490 break
7491 }
7492 c := auxIntToInt32(v_1.AuxInt)
7493 a := v_2
7494 if !(c%5 == 0 && isPowerOfTwo(c/5)) {
7495 break
7496 }
7497 v.reset(OpARMADD)
7498 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7499 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5)))
7500 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7501 v1.AuxInt = int32ToAuxInt(2)
7502 v1.AddArg2(x, x)
7503 v0.AddArg(v1)
7504 v.AddArg2(v0, a)
7505 return true
7506 }
7507
7508
7509
7510 for {
7511 x := v_0
7512 if v_1.Op != OpARMMOVWconst {
7513 break
7514 }
7515 c := auxIntToInt32(v_1.AuxInt)
7516 a := v_2
7517 if !(c%7 == 0 && isPowerOfTwo(c/7)) {
7518 break
7519 }
7520 v.reset(OpARMADD)
7521 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7522 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7)))
7523 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7524 v1.AuxInt = int32ToAuxInt(3)
7525 v1.AddArg2(x, x)
7526 v0.AddArg(v1)
7527 v.AddArg2(v0, a)
7528 return true
7529 }
7530
7531
7532
7533 for {
7534 x := v_0
7535 if v_1.Op != OpARMMOVWconst {
7536 break
7537 }
7538 c := auxIntToInt32(v_1.AuxInt)
7539 a := v_2
7540 if !(c%9 == 0 && isPowerOfTwo(c/9)) {
7541 break
7542 }
7543 v.reset(OpARMADD)
7544 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7545 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9)))
7546 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7547 v1.AuxInt = int32ToAuxInt(3)
7548 v1.AddArg2(x, x)
7549 v0.AddArg(v1)
7550 v.AddArg2(v0, a)
7551 return true
7552 }
7553
7554
7555
7556 for {
7557 if v_0.Op != OpARMMOVWconst {
7558 break
7559 }
7560 c := auxIntToInt32(v_0.AuxInt)
7561 x := v_1
7562 a := v_2
7563 if !(c == -1) {
7564 break
7565 }
7566 v.reset(OpARMSUB)
7567 v.AddArg2(a, x)
7568 return true
7569 }
7570
7571
7572 for {
7573 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 0 {
7574 break
7575 }
7576 a := v_2
7577 v.copyOf(a)
7578 return true
7579 }
7580
7581
7582 for {
7583 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 1 {
7584 break
7585 }
7586 x := v_1
7587 a := v_2
7588 v.reset(OpARMADD)
7589 v.AddArg2(x, a)
7590 return true
7591 }
7592
7593
7594
7595 for {
7596 if v_0.Op != OpARMMOVWconst {
7597 break
7598 }
7599 c := auxIntToInt32(v_0.AuxInt)
7600 x := v_1
7601 a := v_2
7602 if !(isPowerOfTwo(c)) {
7603 break
7604 }
7605 v.reset(OpARMADD)
7606 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7607 v0.AuxInt = int32ToAuxInt(int32(log32(c)))
7608 v0.AddArg(x)
7609 v.AddArg2(v0, a)
7610 return true
7611 }
7612
7613
7614
7615 for {
7616 if v_0.Op != OpARMMOVWconst {
7617 break
7618 }
7619 c := auxIntToInt32(v_0.AuxInt)
7620 x := v_1
7621 a := v_2
7622 if !(isPowerOfTwo(c-1) && c >= 3) {
7623 break
7624 }
7625 v.reset(OpARMADD)
7626 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7627 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1)))
7628 v0.AddArg2(x, x)
7629 v.AddArg2(v0, a)
7630 return true
7631 }
7632
7633
7634
7635 for {
7636 if v_0.Op != OpARMMOVWconst {
7637 break
7638 }
7639 c := auxIntToInt32(v_0.AuxInt)
7640 x := v_1
7641 a := v_2
7642 if !(isPowerOfTwo(c+1) && c >= 7) {
7643 break
7644 }
7645 v.reset(OpARMADD)
7646 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7647 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1)))
7648 v0.AddArg2(x, x)
7649 v.AddArg2(v0, a)
7650 return true
7651 }
7652
7653
7654
7655 for {
7656 if v_0.Op != OpARMMOVWconst {
7657 break
7658 }
7659 c := auxIntToInt32(v_0.AuxInt)
7660 x := v_1
7661 a := v_2
7662 if !(c%3 == 0 && isPowerOfTwo(c/3)) {
7663 break
7664 }
7665 v.reset(OpARMADD)
7666 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7667 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3)))
7668 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7669 v1.AuxInt = int32ToAuxInt(1)
7670 v1.AddArg2(x, x)
7671 v0.AddArg(v1)
7672 v.AddArg2(v0, a)
7673 return true
7674 }
7675
7676
7677
7678 for {
7679 if v_0.Op != OpARMMOVWconst {
7680 break
7681 }
7682 c := auxIntToInt32(v_0.AuxInt)
7683 x := v_1
7684 a := v_2
7685 if !(c%5 == 0 && isPowerOfTwo(c/5)) {
7686 break
7687 }
7688 v.reset(OpARMADD)
7689 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7690 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5)))
7691 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7692 v1.AuxInt = int32ToAuxInt(2)
7693 v1.AddArg2(x, x)
7694 v0.AddArg(v1)
7695 v.AddArg2(v0, a)
7696 return true
7697 }
7698
7699
7700
7701 for {
7702 if v_0.Op != OpARMMOVWconst {
7703 break
7704 }
7705 c := auxIntToInt32(v_0.AuxInt)
7706 x := v_1
7707 a := v_2
7708 if !(c%7 == 0 && isPowerOfTwo(c/7)) {
7709 break
7710 }
7711 v.reset(OpARMADD)
7712 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7713 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7)))
7714 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7715 v1.AuxInt = int32ToAuxInt(3)
7716 v1.AddArg2(x, x)
7717 v0.AddArg(v1)
7718 v.AddArg2(v0, a)
7719 return true
7720 }
7721
7722
7723
7724 for {
7725 if v_0.Op != OpARMMOVWconst {
7726 break
7727 }
7728 c := auxIntToInt32(v_0.AuxInt)
7729 x := v_1
7730 a := v_2
7731 if !(c%9 == 0 && isPowerOfTwo(c/9)) {
7732 break
7733 }
7734 v.reset(OpARMADD)
7735 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7736 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9)))
7737 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7738 v1.AuxInt = int32ToAuxInt(3)
7739 v1.AddArg2(x, x)
7740 v0.AddArg(v1)
7741 v.AddArg2(v0, a)
7742 return true
7743 }
7744
7745
7746 for {
7747 if v_0.Op != OpARMMOVWconst {
7748 break
7749 }
7750 c := auxIntToInt32(v_0.AuxInt)
7751 if v_1.Op != OpARMMOVWconst {
7752 break
7753 }
7754 d := auxIntToInt32(v_1.AuxInt)
7755 a := v_2
7756 v.reset(OpARMADDconst)
7757 v.AuxInt = int32ToAuxInt(c * d)
7758 v.AddArg(a)
7759 return true
7760 }
7761 return false
7762 }
7763 func rewriteValueARM_OpARMMULD(v *Value) bool {
7764 v_1 := v.Args[1]
7765 v_0 := v.Args[0]
7766
7767
7768
7769 for {
7770 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7771 if v_0.Op != OpARMNEGD {
7772 continue
7773 }
7774 x := v_0.Args[0]
7775 y := v_1
7776 if !(buildcfg.GOARM.Version >= 6) {
7777 continue
7778 }
7779 v.reset(OpARMNMULD)
7780 v.AddArg2(x, y)
7781 return true
7782 }
7783 break
7784 }
7785 return false
7786 }
7787 func rewriteValueARM_OpARMMULF(v *Value) bool {
7788 v_1 := v.Args[1]
7789 v_0 := v.Args[0]
7790
7791
7792
7793 for {
7794 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7795 if v_0.Op != OpARMNEGF {
7796 continue
7797 }
7798 x := v_0.Args[0]
7799 y := v_1
7800 if !(buildcfg.GOARM.Version >= 6) {
7801 continue
7802 }
7803 v.reset(OpARMNMULF)
7804 v.AddArg2(x, y)
7805 return true
7806 }
7807 break
7808 }
7809 return false
7810 }
7811 func rewriteValueARM_OpARMMULS(v *Value) bool {
7812 v_2 := v.Args[2]
7813 v_1 := v.Args[1]
7814 v_0 := v.Args[0]
7815 b := v.Block
7816
7817
7818
7819 for {
7820 x := v_0
7821 if v_1.Op != OpARMMOVWconst {
7822 break
7823 }
7824 c := auxIntToInt32(v_1.AuxInt)
7825 a := v_2
7826 if !(c == -1) {
7827 break
7828 }
7829 v.reset(OpARMADD)
7830 v.AddArg2(a, x)
7831 return true
7832 }
7833
7834
7835 for {
7836 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 0 {
7837 break
7838 }
7839 a := v_2
7840 v.copyOf(a)
7841 return true
7842 }
7843
7844
7845 for {
7846 x := v_0
7847 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 1 {
7848 break
7849 }
7850 a := v_2
7851 v.reset(OpARMRSB)
7852 v.AddArg2(x, a)
7853 return true
7854 }
7855
7856
7857
7858 for {
7859 x := v_0
7860 if v_1.Op != OpARMMOVWconst {
7861 break
7862 }
7863 c := auxIntToInt32(v_1.AuxInt)
7864 a := v_2
7865 if !(isPowerOfTwo(c)) {
7866 break
7867 }
7868 v.reset(OpARMRSB)
7869 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7870 v0.AuxInt = int32ToAuxInt(int32(log32(c)))
7871 v0.AddArg(x)
7872 v.AddArg2(v0, a)
7873 return true
7874 }
7875
7876
7877
7878 for {
7879 x := v_0
7880 if v_1.Op != OpARMMOVWconst {
7881 break
7882 }
7883 c := auxIntToInt32(v_1.AuxInt)
7884 a := v_2
7885 if !(isPowerOfTwo(c-1) && c >= 3) {
7886 break
7887 }
7888 v.reset(OpARMRSB)
7889 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7890 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1)))
7891 v0.AddArg2(x, x)
7892 v.AddArg2(v0, a)
7893 return true
7894 }
7895
7896
7897
7898 for {
7899 x := v_0
7900 if v_1.Op != OpARMMOVWconst {
7901 break
7902 }
7903 c := auxIntToInt32(v_1.AuxInt)
7904 a := v_2
7905 if !(isPowerOfTwo(c+1) && c >= 7) {
7906 break
7907 }
7908 v.reset(OpARMRSB)
7909 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7910 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1)))
7911 v0.AddArg2(x, x)
7912 v.AddArg2(v0, a)
7913 return true
7914 }
7915
7916
7917
7918 for {
7919 x := v_0
7920 if v_1.Op != OpARMMOVWconst {
7921 break
7922 }
7923 c := auxIntToInt32(v_1.AuxInt)
7924 a := v_2
7925 if !(c%3 == 0 && isPowerOfTwo(c/3)) {
7926 break
7927 }
7928 v.reset(OpARMRSB)
7929 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7930 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3)))
7931 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7932 v1.AuxInt = int32ToAuxInt(1)
7933 v1.AddArg2(x, x)
7934 v0.AddArg(v1)
7935 v.AddArg2(v0, a)
7936 return true
7937 }
7938
7939
7940
7941 for {
7942 x := v_0
7943 if v_1.Op != OpARMMOVWconst {
7944 break
7945 }
7946 c := auxIntToInt32(v_1.AuxInt)
7947 a := v_2
7948 if !(c%5 == 0 && isPowerOfTwo(c/5)) {
7949 break
7950 }
7951 v.reset(OpARMRSB)
7952 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7953 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5)))
7954 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7955 v1.AuxInt = int32ToAuxInt(2)
7956 v1.AddArg2(x, x)
7957 v0.AddArg(v1)
7958 v.AddArg2(v0, a)
7959 return true
7960 }
7961
7962
7963
7964 for {
7965 x := v_0
7966 if v_1.Op != OpARMMOVWconst {
7967 break
7968 }
7969 c := auxIntToInt32(v_1.AuxInt)
7970 a := v_2
7971 if !(c%7 == 0 && isPowerOfTwo(c/7)) {
7972 break
7973 }
7974 v.reset(OpARMRSB)
7975 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7976 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7)))
7977 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7978 v1.AuxInt = int32ToAuxInt(3)
7979 v1.AddArg2(x, x)
7980 v0.AddArg(v1)
7981 v.AddArg2(v0, a)
7982 return true
7983 }
7984
7985
7986
7987 for {
7988 x := v_0
7989 if v_1.Op != OpARMMOVWconst {
7990 break
7991 }
7992 c := auxIntToInt32(v_1.AuxInt)
7993 a := v_2
7994 if !(c%9 == 0 && isPowerOfTwo(c/9)) {
7995 break
7996 }
7997 v.reset(OpARMRSB)
7998 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7999 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9)))
8000 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
8001 v1.AuxInt = int32ToAuxInt(3)
8002 v1.AddArg2(x, x)
8003 v0.AddArg(v1)
8004 v.AddArg2(v0, a)
8005 return true
8006 }
8007
8008
8009
8010 for {
8011 if v_0.Op != OpARMMOVWconst {
8012 break
8013 }
8014 c := auxIntToInt32(v_0.AuxInt)
8015 x := v_1
8016 a := v_2
8017 if !(c == -1) {
8018 break
8019 }
8020 v.reset(OpARMADD)
8021 v.AddArg2(a, x)
8022 return true
8023 }
8024
8025
8026 for {
8027 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 0 {
8028 break
8029 }
8030 a := v_2
8031 v.copyOf(a)
8032 return true
8033 }
8034
8035
8036 for {
8037 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 1 {
8038 break
8039 }
8040 x := v_1
8041 a := v_2
8042 v.reset(OpARMRSB)
8043 v.AddArg2(x, a)
8044 return true
8045 }
8046
8047
8048
8049 for {
8050 if v_0.Op != OpARMMOVWconst {
8051 break
8052 }
8053 c := auxIntToInt32(v_0.AuxInt)
8054 x := v_1
8055 a := v_2
8056 if !(isPowerOfTwo(c)) {
8057 break
8058 }
8059 v.reset(OpARMRSB)
8060 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
8061 v0.AuxInt = int32ToAuxInt(int32(log32(c)))
8062 v0.AddArg(x)
8063 v.AddArg2(v0, a)
8064 return true
8065 }
8066
8067
8068
8069 for {
8070 if v_0.Op != OpARMMOVWconst {
8071 break
8072 }
8073 c := auxIntToInt32(v_0.AuxInt)
8074 x := v_1
8075 a := v_2
8076 if !(isPowerOfTwo(c-1) && c >= 3) {
8077 break
8078 }
8079 v.reset(OpARMRSB)
8080 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
8081 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1)))
8082 v0.AddArg2(x, x)
8083 v.AddArg2(v0, a)
8084 return true
8085 }
8086
8087
8088
8089 for {
8090 if v_0.Op != OpARMMOVWconst {
8091 break
8092 }
8093 c := auxIntToInt32(v_0.AuxInt)
8094 x := v_1
8095 a := v_2
8096 if !(isPowerOfTwo(c+1) && c >= 7) {
8097 break
8098 }
8099 v.reset(OpARMRSB)
8100 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
8101 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1)))
8102 v0.AddArg2(x, x)
8103 v.AddArg2(v0, a)
8104 return true
8105 }
8106
8107
8108
8109 for {
8110 if v_0.Op != OpARMMOVWconst {
8111 break
8112 }
8113 c := auxIntToInt32(v_0.AuxInt)
8114 x := v_1
8115 a := v_2
8116 if !(c%3 == 0 && isPowerOfTwo(c/3)) {
8117 break
8118 }
8119 v.reset(OpARMRSB)
8120 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
8121 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3)))
8122 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
8123 v1.AuxInt = int32ToAuxInt(1)
8124 v1.AddArg2(x, x)
8125 v0.AddArg(v1)
8126 v.AddArg2(v0, a)
8127 return true
8128 }
8129
8130
8131
8132 for {
8133 if v_0.Op != OpARMMOVWconst {
8134 break
8135 }
8136 c := auxIntToInt32(v_0.AuxInt)
8137 x := v_1
8138 a := v_2
8139 if !(c%5 == 0 && isPowerOfTwo(c/5)) {
8140 break
8141 }
8142 v.reset(OpARMRSB)
8143 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
8144 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5)))
8145 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
8146 v1.AuxInt = int32ToAuxInt(2)
8147 v1.AddArg2(x, x)
8148 v0.AddArg(v1)
8149 v.AddArg2(v0, a)
8150 return true
8151 }
8152
8153
8154
8155 for {
8156 if v_0.Op != OpARMMOVWconst {
8157 break
8158 }
8159 c := auxIntToInt32(v_0.AuxInt)
8160 x := v_1
8161 a := v_2
8162 if !(c%7 == 0 && isPowerOfTwo(c/7)) {
8163 break
8164 }
8165 v.reset(OpARMRSB)
8166 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
8167 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7)))
8168 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
8169 v1.AuxInt = int32ToAuxInt(3)
8170 v1.AddArg2(x, x)
8171 v0.AddArg(v1)
8172 v.AddArg2(v0, a)
8173 return true
8174 }
8175
8176
8177
8178 for {
8179 if v_0.Op != OpARMMOVWconst {
8180 break
8181 }
8182 c := auxIntToInt32(v_0.AuxInt)
8183 x := v_1
8184 a := v_2
8185 if !(c%9 == 0 && isPowerOfTwo(c/9)) {
8186 break
8187 }
8188 v.reset(OpARMRSB)
8189 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
8190 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9)))
8191 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
8192 v1.AuxInt = int32ToAuxInt(3)
8193 v1.AddArg2(x, x)
8194 v0.AddArg(v1)
8195 v.AddArg2(v0, a)
8196 return true
8197 }
8198
8199
8200 for {
8201 if v_0.Op != OpARMMOVWconst {
8202 break
8203 }
8204 c := auxIntToInt32(v_0.AuxInt)
8205 if v_1.Op != OpARMMOVWconst {
8206 break
8207 }
8208 d := auxIntToInt32(v_1.AuxInt)
8209 a := v_2
8210 v.reset(OpARMSUBconst)
8211 v.AuxInt = int32ToAuxInt(c * d)
8212 v.AddArg(a)
8213 return true
8214 }
8215 return false
8216 }
8217 func rewriteValueARM_OpARMMVN(v *Value) bool {
8218 v_0 := v.Args[0]
8219
8220
8221 for {
8222 if v_0.Op != OpARMMOVWconst {
8223 break
8224 }
8225 c := auxIntToInt32(v_0.AuxInt)
8226 v.reset(OpARMMOVWconst)
8227 v.AuxInt = int32ToAuxInt(^c)
8228 return true
8229 }
8230
8231
8232 for {
8233 if v_0.Op != OpARMSLLconst {
8234 break
8235 }
8236 c := auxIntToInt32(v_0.AuxInt)
8237 x := v_0.Args[0]
8238 v.reset(OpARMMVNshiftLL)
8239 v.AuxInt = int32ToAuxInt(c)
8240 v.AddArg(x)
8241 return true
8242 }
8243
8244
8245 for {
8246 if v_0.Op != OpARMSRLconst {
8247 break
8248 }
8249 c := auxIntToInt32(v_0.AuxInt)
8250 x := v_0.Args[0]
8251 v.reset(OpARMMVNshiftRL)
8252 v.AuxInt = int32ToAuxInt(c)
8253 v.AddArg(x)
8254 return true
8255 }
8256
8257
8258 for {
8259 if v_0.Op != OpARMSRAconst {
8260 break
8261 }
8262 c := auxIntToInt32(v_0.AuxInt)
8263 x := v_0.Args[0]
8264 v.reset(OpARMMVNshiftRA)
8265 v.AuxInt = int32ToAuxInt(c)
8266 v.AddArg(x)
8267 return true
8268 }
8269
8270
8271 for {
8272 if v_0.Op != OpARMSLL {
8273 break
8274 }
8275 y := v_0.Args[1]
8276 x := v_0.Args[0]
8277 v.reset(OpARMMVNshiftLLreg)
8278 v.AddArg2(x, y)
8279 return true
8280 }
8281
8282
8283 for {
8284 if v_0.Op != OpARMSRL {
8285 break
8286 }
8287 y := v_0.Args[1]
8288 x := v_0.Args[0]
8289 v.reset(OpARMMVNshiftRLreg)
8290 v.AddArg2(x, y)
8291 return true
8292 }
8293
8294
8295 for {
8296 if v_0.Op != OpARMSRA {
8297 break
8298 }
8299 y := v_0.Args[1]
8300 x := v_0.Args[0]
8301 v.reset(OpARMMVNshiftRAreg)
8302 v.AddArg2(x, y)
8303 return true
8304 }
8305 return false
8306 }
8307 func rewriteValueARM_OpARMMVNshiftLL(v *Value) bool {
8308 v_0 := v.Args[0]
8309
8310
8311 for {
8312 d := auxIntToInt32(v.AuxInt)
8313 if v_0.Op != OpARMMOVWconst {
8314 break
8315 }
8316 c := auxIntToInt32(v_0.AuxInt)
8317 v.reset(OpARMMOVWconst)
8318 v.AuxInt = int32ToAuxInt(^(c << uint64(d)))
8319 return true
8320 }
8321 return false
8322 }
8323 func rewriteValueARM_OpARMMVNshiftLLreg(v *Value) bool {
8324 v_1 := v.Args[1]
8325 v_0 := v.Args[0]
8326
8327
8328
8329 for {
8330 x := v_0
8331 if v_1.Op != OpARMMOVWconst {
8332 break
8333 }
8334 c := auxIntToInt32(v_1.AuxInt)
8335 if !(0 <= c && c < 32) {
8336 break
8337 }
8338 v.reset(OpARMMVNshiftLL)
8339 v.AuxInt = int32ToAuxInt(c)
8340 v.AddArg(x)
8341 return true
8342 }
8343 return false
8344 }
8345 func rewriteValueARM_OpARMMVNshiftRA(v *Value) bool {
8346 v_0 := v.Args[0]
8347
8348
8349 for {
8350 d := auxIntToInt32(v.AuxInt)
8351 if v_0.Op != OpARMMOVWconst {
8352 break
8353 }
8354 c := auxIntToInt32(v_0.AuxInt)
8355 v.reset(OpARMMOVWconst)
8356 v.AuxInt = int32ToAuxInt(int32(c) >> uint64(d))
8357 return true
8358 }
8359 return false
8360 }
8361 func rewriteValueARM_OpARMMVNshiftRAreg(v *Value) bool {
8362 v_1 := v.Args[1]
8363 v_0 := v.Args[0]
8364
8365
8366
8367 for {
8368 x := v_0
8369 if v_1.Op != OpARMMOVWconst {
8370 break
8371 }
8372 c := auxIntToInt32(v_1.AuxInt)
8373 if !(0 <= c && c < 32) {
8374 break
8375 }
8376 v.reset(OpARMMVNshiftRA)
8377 v.AuxInt = int32ToAuxInt(c)
8378 v.AddArg(x)
8379 return true
8380 }
8381 return false
8382 }
8383 func rewriteValueARM_OpARMMVNshiftRL(v *Value) bool {
8384 v_0 := v.Args[0]
8385
8386
8387 for {
8388 d := auxIntToInt32(v.AuxInt)
8389 if v_0.Op != OpARMMOVWconst {
8390 break
8391 }
8392 c := auxIntToInt32(v_0.AuxInt)
8393 v.reset(OpARMMOVWconst)
8394 v.AuxInt = int32ToAuxInt(^int32(uint32(c) >> uint64(d)))
8395 return true
8396 }
8397 return false
8398 }
8399 func rewriteValueARM_OpARMMVNshiftRLreg(v *Value) bool {
8400 v_1 := v.Args[1]
8401 v_0 := v.Args[0]
8402
8403
8404
8405 for {
8406 x := v_0
8407 if v_1.Op != OpARMMOVWconst {
8408 break
8409 }
8410 c := auxIntToInt32(v_1.AuxInt)
8411 if !(0 <= c && c < 32) {
8412 break
8413 }
8414 v.reset(OpARMMVNshiftRL)
8415 v.AuxInt = int32ToAuxInt(c)
8416 v.AddArg(x)
8417 return true
8418 }
8419 return false
8420 }
8421 func rewriteValueARM_OpARMNEGD(v *Value) bool {
8422 v_0 := v.Args[0]
8423
8424
8425
8426 for {
8427 if v_0.Op != OpARMMULD {
8428 break
8429 }
8430 y := v_0.Args[1]
8431 x := v_0.Args[0]
8432 if !(buildcfg.GOARM.Version >= 6) {
8433 break
8434 }
8435 v.reset(OpARMNMULD)
8436 v.AddArg2(x, y)
8437 return true
8438 }
8439 return false
8440 }
8441 func rewriteValueARM_OpARMNEGF(v *Value) bool {
8442 v_0 := v.Args[0]
8443
8444
8445
8446 for {
8447 if v_0.Op != OpARMMULF {
8448 break
8449 }
8450 y := v_0.Args[1]
8451 x := v_0.Args[0]
8452 if !(buildcfg.GOARM.Version >= 6) {
8453 break
8454 }
8455 v.reset(OpARMNMULF)
8456 v.AddArg2(x, y)
8457 return true
8458 }
8459 return false
8460 }
8461 func rewriteValueARM_OpARMNMULD(v *Value) bool {
8462 v_1 := v.Args[1]
8463 v_0 := v.Args[0]
8464
8465
8466 for {
8467 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8468 if v_0.Op != OpARMNEGD {
8469 continue
8470 }
8471 x := v_0.Args[0]
8472 y := v_1
8473 v.reset(OpARMMULD)
8474 v.AddArg2(x, y)
8475 return true
8476 }
8477 break
8478 }
8479 return false
8480 }
8481 func rewriteValueARM_OpARMNMULF(v *Value) bool {
8482 v_1 := v.Args[1]
8483 v_0 := v.Args[0]
8484
8485
8486 for {
8487 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8488 if v_0.Op != OpARMNEGF {
8489 continue
8490 }
8491 x := v_0.Args[0]
8492 y := v_1
8493 v.reset(OpARMMULF)
8494 v.AddArg2(x, y)
8495 return true
8496 }
8497 break
8498 }
8499 return false
8500 }
8501 func rewriteValueARM_OpARMNotEqual(v *Value) bool {
8502 v_0 := v.Args[0]
8503
8504
8505 for {
8506 if v_0.Op != OpARMFlagConstant {
8507 break
8508 }
8509 fc := auxIntToFlagConstant(v_0.AuxInt)
8510 v.reset(OpARMMOVWconst)
8511 v.AuxInt = int32ToAuxInt(b2i32(fc.ne()))
8512 return true
8513 }
8514
8515
8516 for {
8517 if v_0.Op != OpARMInvertFlags {
8518 break
8519 }
8520 x := v_0.Args[0]
8521 v.reset(OpARMNotEqual)
8522 v.AddArg(x)
8523 return true
8524 }
8525 return false
8526 }
8527 func rewriteValueARM_OpARMOR(v *Value) bool {
8528 v_1 := v.Args[1]
8529 v_0 := v.Args[0]
8530
8531
8532 for {
8533 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8534 x := v_0
8535 if v_1.Op != OpARMMOVWconst {
8536 continue
8537 }
8538 c := auxIntToInt32(v_1.AuxInt)
8539 v.reset(OpARMORconst)
8540 v.AuxInt = int32ToAuxInt(c)
8541 v.AddArg(x)
8542 return true
8543 }
8544 break
8545 }
8546
8547
8548 for {
8549 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8550 x := v_0
8551 if v_1.Op != OpARMSLLconst {
8552 continue
8553 }
8554 c := auxIntToInt32(v_1.AuxInt)
8555 y := v_1.Args[0]
8556 v.reset(OpARMORshiftLL)
8557 v.AuxInt = int32ToAuxInt(c)
8558 v.AddArg2(x, y)
8559 return true
8560 }
8561 break
8562 }
8563
8564
8565 for {
8566 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8567 x := v_0
8568 if v_1.Op != OpARMSRLconst {
8569 continue
8570 }
8571 c := auxIntToInt32(v_1.AuxInt)
8572 y := v_1.Args[0]
8573 v.reset(OpARMORshiftRL)
8574 v.AuxInt = int32ToAuxInt(c)
8575 v.AddArg2(x, y)
8576 return true
8577 }
8578 break
8579 }
8580
8581
8582 for {
8583 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8584 x := v_0
8585 if v_1.Op != OpARMSRAconst {
8586 continue
8587 }
8588 c := auxIntToInt32(v_1.AuxInt)
8589 y := v_1.Args[0]
8590 v.reset(OpARMORshiftRA)
8591 v.AuxInt = int32ToAuxInt(c)
8592 v.AddArg2(x, y)
8593 return true
8594 }
8595 break
8596 }
8597
8598
8599 for {
8600 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8601 x := v_0
8602 if v_1.Op != OpARMSLL {
8603 continue
8604 }
8605 z := v_1.Args[1]
8606 y := v_1.Args[0]
8607 v.reset(OpARMORshiftLLreg)
8608 v.AddArg3(x, y, z)
8609 return true
8610 }
8611 break
8612 }
8613
8614
8615 for {
8616 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8617 x := v_0
8618 if v_1.Op != OpARMSRL {
8619 continue
8620 }
8621 z := v_1.Args[1]
8622 y := v_1.Args[0]
8623 v.reset(OpARMORshiftRLreg)
8624 v.AddArg3(x, y, z)
8625 return true
8626 }
8627 break
8628 }
8629
8630
8631 for {
8632 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8633 x := v_0
8634 if v_1.Op != OpARMSRA {
8635 continue
8636 }
8637 z := v_1.Args[1]
8638 y := v_1.Args[0]
8639 v.reset(OpARMORshiftRAreg)
8640 v.AddArg3(x, y, z)
8641 return true
8642 }
8643 break
8644 }
8645
8646
8647 for {
8648 x := v_0
8649 if x != v_1 {
8650 break
8651 }
8652 v.copyOf(x)
8653 return true
8654 }
8655 return false
8656 }
8657 func rewriteValueARM_OpARMORconst(v *Value) bool {
8658 v_0 := v.Args[0]
8659
8660
8661 for {
8662 if auxIntToInt32(v.AuxInt) != 0 {
8663 break
8664 }
8665 x := v_0
8666 v.copyOf(x)
8667 return true
8668 }
8669
8670
8671
8672 for {
8673 c := auxIntToInt32(v.AuxInt)
8674 if !(int32(c) == -1) {
8675 break
8676 }
8677 v.reset(OpARMMOVWconst)
8678 v.AuxInt = int32ToAuxInt(-1)
8679 return true
8680 }
8681
8682
8683 for {
8684 c := auxIntToInt32(v.AuxInt)
8685 if v_0.Op != OpARMMOVWconst {
8686 break
8687 }
8688 d := auxIntToInt32(v_0.AuxInt)
8689 v.reset(OpARMMOVWconst)
8690 v.AuxInt = int32ToAuxInt(c | d)
8691 return true
8692 }
8693
8694
8695 for {
8696 c := auxIntToInt32(v.AuxInt)
8697 if v_0.Op != OpARMORconst {
8698 break
8699 }
8700 d := auxIntToInt32(v_0.AuxInt)
8701 x := v_0.Args[0]
8702 v.reset(OpARMORconst)
8703 v.AuxInt = int32ToAuxInt(c | d)
8704 v.AddArg(x)
8705 return true
8706 }
8707 return false
8708 }
8709 func rewriteValueARM_OpARMORshiftLL(v *Value) bool {
8710 v_1 := v.Args[1]
8711 v_0 := v.Args[0]
8712 b := v.Block
8713 typ := &b.Func.Config.Types
8714
8715
8716 for {
8717 d := auxIntToInt32(v.AuxInt)
8718 if v_0.Op != OpARMMOVWconst {
8719 break
8720 }
8721 c := auxIntToInt32(v_0.AuxInt)
8722 x := v_1
8723 v.reset(OpARMORconst)
8724 v.AuxInt = int32ToAuxInt(c)
8725 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
8726 v0.AuxInt = int32ToAuxInt(d)
8727 v0.AddArg(x)
8728 v.AddArg(v0)
8729 return true
8730 }
8731
8732
8733 for {
8734 d := auxIntToInt32(v.AuxInt)
8735 x := v_0
8736 if v_1.Op != OpARMMOVWconst {
8737 break
8738 }
8739 c := auxIntToInt32(v_1.AuxInt)
8740 v.reset(OpARMORconst)
8741 v.AuxInt = int32ToAuxInt(c << uint64(d))
8742 v.AddArg(x)
8743 return true
8744 }
8745
8746
8747 for {
8748 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)) {
8749 break
8750 }
8751 x := v_0.Args[0]
8752 if x != v_1 {
8753 break
8754 }
8755 v.reset(OpARMREV16)
8756 v.AddArg(x)
8757 return true
8758 }
8759
8760
8761
8762 for {
8763 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMSRLconst || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != 24 {
8764 break
8765 }
8766 v_0_0 := v_0.Args[0]
8767 if v_0_0.Op != OpARMSLLconst || auxIntToInt32(v_0_0.AuxInt) != 16 {
8768 break
8769 }
8770 x := v_0_0.Args[0]
8771 if x != v_1 || !(buildcfg.GOARM.Version >= 6) {
8772 break
8773 }
8774 v.reset(OpARMREV16)
8775 v.AddArg(x)
8776 return true
8777 }
8778
8779
8780 for {
8781 c := auxIntToInt32(v.AuxInt)
8782 y := v_0
8783 if y.Op != OpARMSLLconst || auxIntToInt32(y.AuxInt) != c {
8784 break
8785 }
8786 x := y.Args[0]
8787 if x != v_1 {
8788 break
8789 }
8790 v.copyOf(y)
8791 return true
8792 }
8793 return false
8794 }
8795 func rewriteValueARM_OpARMORshiftLLreg(v *Value) bool {
8796 v_2 := v.Args[2]
8797 v_1 := v.Args[1]
8798 v_0 := v.Args[0]
8799 b := v.Block
8800
8801
8802 for {
8803 if v_0.Op != OpARMMOVWconst {
8804 break
8805 }
8806 c := auxIntToInt32(v_0.AuxInt)
8807 x := v_1
8808 y := v_2
8809 v.reset(OpARMORconst)
8810 v.AuxInt = int32ToAuxInt(c)
8811 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
8812 v0.AddArg2(x, y)
8813 v.AddArg(v0)
8814 return true
8815 }
8816
8817
8818
8819 for {
8820 x := v_0
8821 y := v_1
8822 if v_2.Op != OpARMMOVWconst {
8823 break
8824 }
8825 c := auxIntToInt32(v_2.AuxInt)
8826 if !(0 <= c && c < 32) {
8827 break
8828 }
8829 v.reset(OpARMORshiftLL)
8830 v.AuxInt = int32ToAuxInt(c)
8831 v.AddArg2(x, y)
8832 return true
8833 }
8834 return false
8835 }
8836 func rewriteValueARM_OpARMORshiftRA(v *Value) bool {
8837 v_1 := v.Args[1]
8838 v_0 := v.Args[0]
8839 b := v.Block
8840
8841
8842 for {
8843 d := auxIntToInt32(v.AuxInt)
8844 if v_0.Op != OpARMMOVWconst {
8845 break
8846 }
8847 c := auxIntToInt32(v_0.AuxInt)
8848 x := v_1
8849 v.reset(OpARMORconst)
8850 v.AuxInt = int32ToAuxInt(c)
8851 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
8852 v0.AuxInt = int32ToAuxInt(d)
8853 v0.AddArg(x)
8854 v.AddArg(v0)
8855 return true
8856 }
8857
8858
8859 for {
8860 d := auxIntToInt32(v.AuxInt)
8861 x := v_0
8862 if v_1.Op != OpARMMOVWconst {
8863 break
8864 }
8865 c := auxIntToInt32(v_1.AuxInt)
8866 v.reset(OpARMORconst)
8867 v.AuxInt = int32ToAuxInt(c >> uint64(d))
8868 v.AddArg(x)
8869 return true
8870 }
8871
8872
8873 for {
8874 c := auxIntToInt32(v.AuxInt)
8875 y := v_0
8876 if y.Op != OpARMSRAconst || auxIntToInt32(y.AuxInt) != c {
8877 break
8878 }
8879 x := y.Args[0]
8880 if x != v_1 {
8881 break
8882 }
8883 v.copyOf(y)
8884 return true
8885 }
8886 return false
8887 }
8888 func rewriteValueARM_OpARMORshiftRAreg(v *Value) bool {
8889 v_2 := v.Args[2]
8890 v_1 := v.Args[1]
8891 v_0 := v.Args[0]
8892 b := v.Block
8893
8894
8895 for {
8896 if v_0.Op != OpARMMOVWconst {
8897 break
8898 }
8899 c := auxIntToInt32(v_0.AuxInt)
8900 x := v_1
8901 y := v_2
8902 v.reset(OpARMORconst)
8903 v.AuxInt = int32ToAuxInt(c)
8904 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
8905 v0.AddArg2(x, y)
8906 v.AddArg(v0)
8907 return true
8908 }
8909
8910
8911
8912 for {
8913 x := v_0
8914 y := v_1
8915 if v_2.Op != OpARMMOVWconst {
8916 break
8917 }
8918 c := auxIntToInt32(v_2.AuxInt)
8919 if !(0 <= c && c < 32) {
8920 break
8921 }
8922 v.reset(OpARMORshiftRA)
8923 v.AuxInt = int32ToAuxInt(c)
8924 v.AddArg2(x, y)
8925 return true
8926 }
8927 return false
8928 }
8929 func rewriteValueARM_OpARMORshiftRL(v *Value) bool {
8930 v_1 := v.Args[1]
8931 v_0 := v.Args[0]
8932 b := v.Block
8933
8934
8935 for {
8936 d := auxIntToInt32(v.AuxInt)
8937 if v_0.Op != OpARMMOVWconst {
8938 break
8939 }
8940 c := auxIntToInt32(v_0.AuxInt)
8941 x := v_1
8942 v.reset(OpARMORconst)
8943 v.AuxInt = int32ToAuxInt(c)
8944 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
8945 v0.AuxInt = int32ToAuxInt(d)
8946 v0.AddArg(x)
8947 v.AddArg(v0)
8948 return true
8949 }
8950
8951
8952 for {
8953 d := auxIntToInt32(v.AuxInt)
8954 x := v_0
8955 if v_1.Op != OpARMMOVWconst {
8956 break
8957 }
8958 c := auxIntToInt32(v_1.AuxInt)
8959 v.reset(OpARMORconst)
8960 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
8961 v.AddArg(x)
8962 return true
8963 }
8964
8965
8966 for {
8967 c := auxIntToInt32(v.AuxInt)
8968 y := v_0
8969 if y.Op != OpARMSRLconst || auxIntToInt32(y.AuxInt) != c {
8970 break
8971 }
8972 x := y.Args[0]
8973 if x != v_1 {
8974 break
8975 }
8976 v.copyOf(y)
8977 return true
8978 }
8979 return false
8980 }
8981 func rewriteValueARM_OpARMORshiftRLreg(v *Value) bool {
8982 v_2 := v.Args[2]
8983 v_1 := v.Args[1]
8984 v_0 := v.Args[0]
8985 b := v.Block
8986
8987
8988 for {
8989 if v_0.Op != OpARMMOVWconst {
8990 break
8991 }
8992 c := auxIntToInt32(v_0.AuxInt)
8993 x := v_1
8994 y := v_2
8995 v.reset(OpARMORconst)
8996 v.AuxInt = int32ToAuxInt(c)
8997 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
8998 v0.AddArg2(x, y)
8999 v.AddArg(v0)
9000 return true
9001 }
9002
9003
9004
9005 for {
9006 x := v_0
9007 y := v_1
9008 if v_2.Op != OpARMMOVWconst {
9009 break
9010 }
9011 c := auxIntToInt32(v_2.AuxInt)
9012 if !(0 <= c && c < 32) {
9013 break
9014 }
9015 v.reset(OpARMORshiftRL)
9016 v.AuxInt = int32ToAuxInt(c)
9017 v.AddArg2(x, y)
9018 return true
9019 }
9020 return false
9021 }
9022 func rewriteValueARM_OpARMRSB(v *Value) bool {
9023 v_1 := v.Args[1]
9024 v_0 := v.Args[0]
9025
9026
9027 for {
9028 if v_0.Op != OpARMMOVWconst {
9029 break
9030 }
9031 c := auxIntToInt32(v_0.AuxInt)
9032 x := v_1
9033 v.reset(OpARMSUBconst)
9034 v.AuxInt = int32ToAuxInt(c)
9035 v.AddArg(x)
9036 return true
9037 }
9038
9039
9040 for {
9041 x := v_0
9042 if v_1.Op != OpARMMOVWconst {
9043 break
9044 }
9045 c := auxIntToInt32(v_1.AuxInt)
9046 v.reset(OpARMRSBconst)
9047 v.AuxInt = int32ToAuxInt(c)
9048 v.AddArg(x)
9049 return true
9050 }
9051
9052
9053 for {
9054 x := v_0
9055 if v_1.Op != OpARMSLLconst {
9056 break
9057 }
9058 c := auxIntToInt32(v_1.AuxInt)
9059 y := v_1.Args[0]
9060 v.reset(OpARMRSBshiftLL)
9061 v.AuxInt = int32ToAuxInt(c)
9062 v.AddArg2(x, y)
9063 return true
9064 }
9065
9066
9067 for {
9068 if v_0.Op != OpARMSLLconst {
9069 break
9070 }
9071 c := auxIntToInt32(v_0.AuxInt)
9072 y := v_0.Args[0]
9073 x := v_1
9074 v.reset(OpARMSUBshiftLL)
9075 v.AuxInt = int32ToAuxInt(c)
9076 v.AddArg2(x, y)
9077 return true
9078 }
9079
9080
9081 for {
9082 x := v_0
9083 if v_1.Op != OpARMSRLconst {
9084 break
9085 }
9086 c := auxIntToInt32(v_1.AuxInt)
9087 y := v_1.Args[0]
9088 v.reset(OpARMRSBshiftRL)
9089 v.AuxInt = int32ToAuxInt(c)
9090 v.AddArg2(x, y)
9091 return true
9092 }
9093
9094
9095 for {
9096 if v_0.Op != OpARMSRLconst {
9097 break
9098 }
9099 c := auxIntToInt32(v_0.AuxInt)
9100 y := v_0.Args[0]
9101 x := v_1
9102 v.reset(OpARMSUBshiftRL)
9103 v.AuxInt = int32ToAuxInt(c)
9104 v.AddArg2(x, y)
9105 return true
9106 }
9107
9108
9109 for {
9110 x := v_0
9111 if v_1.Op != OpARMSRAconst {
9112 break
9113 }
9114 c := auxIntToInt32(v_1.AuxInt)
9115 y := v_1.Args[0]
9116 v.reset(OpARMRSBshiftRA)
9117 v.AuxInt = int32ToAuxInt(c)
9118 v.AddArg2(x, y)
9119 return true
9120 }
9121
9122
9123 for {
9124 if v_0.Op != OpARMSRAconst {
9125 break
9126 }
9127 c := auxIntToInt32(v_0.AuxInt)
9128 y := v_0.Args[0]
9129 x := v_1
9130 v.reset(OpARMSUBshiftRA)
9131 v.AuxInt = int32ToAuxInt(c)
9132 v.AddArg2(x, y)
9133 return true
9134 }
9135
9136
9137 for {
9138 x := v_0
9139 if v_1.Op != OpARMSLL {
9140 break
9141 }
9142 z := v_1.Args[1]
9143 y := v_1.Args[0]
9144 v.reset(OpARMRSBshiftLLreg)
9145 v.AddArg3(x, y, z)
9146 return true
9147 }
9148
9149
9150 for {
9151 if v_0.Op != OpARMSLL {
9152 break
9153 }
9154 z := v_0.Args[1]
9155 y := v_0.Args[0]
9156 x := v_1
9157 v.reset(OpARMSUBshiftLLreg)
9158 v.AddArg3(x, y, z)
9159 return true
9160 }
9161
9162
9163 for {
9164 x := v_0
9165 if v_1.Op != OpARMSRL {
9166 break
9167 }
9168 z := v_1.Args[1]
9169 y := v_1.Args[0]
9170 v.reset(OpARMRSBshiftRLreg)
9171 v.AddArg3(x, y, z)
9172 return true
9173 }
9174
9175
9176 for {
9177 if v_0.Op != OpARMSRL {
9178 break
9179 }
9180 z := v_0.Args[1]
9181 y := v_0.Args[0]
9182 x := v_1
9183 v.reset(OpARMSUBshiftRLreg)
9184 v.AddArg3(x, y, z)
9185 return true
9186 }
9187
9188
9189 for {
9190 x := v_0
9191 if v_1.Op != OpARMSRA {
9192 break
9193 }
9194 z := v_1.Args[1]
9195 y := v_1.Args[0]
9196 v.reset(OpARMRSBshiftRAreg)
9197 v.AddArg3(x, y, z)
9198 return true
9199 }
9200
9201
9202 for {
9203 if v_0.Op != OpARMSRA {
9204 break
9205 }
9206 z := v_0.Args[1]
9207 y := v_0.Args[0]
9208 x := v_1
9209 v.reset(OpARMSUBshiftRAreg)
9210 v.AddArg3(x, y, z)
9211 return true
9212 }
9213
9214
9215 for {
9216 x := v_0
9217 if x != v_1 {
9218 break
9219 }
9220 v.reset(OpARMMOVWconst)
9221 v.AuxInt = int32ToAuxInt(0)
9222 return true
9223 }
9224
9225
9226
9227 for {
9228 if v_0.Op != OpARMMUL {
9229 break
9230 }
9231 y := v_0.Args[1]
9232 x := v_0.Args[0]
9233 a := v_1
9234 if !(buildcfg.GOARM.Version == 7) {
9235 break
9236 }
9237 v.reset(OpARMMULS)
9238 v.AddArg3(x, y, a)
9239 return true
9240 }
9241 return false
9242 }
9243 func rewriteValueARM_OpARMRSBSshiftLL(v *Value) bool {
9244 v_1 := v.Args[1]
9245 v_0 := v.Args[0]
9246 b := v.Block
9247
9248
9249 for {
9250 d := auxIntToInt32(v.AuxInt)
9251 if v_0.Op != OpARMMOVWconst {
9252 break
9253 }
9254 c := auxIntToInt32(v_0.AuxInt)
9255 x := v_1
9256 v.reset(OpARMSUBSconst)
9257 v.AuxInt = int32ToAuxInt(c)
9258 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
9259 v0.AuxInt = int32ToAuxInt(d)
9260 v0.AddArg(x)
9261 v.AddArg(v0)
9262 return true
9263 }
9264
9265
9266 for {
9267 d := auxIntToInt32(v.AuxInt)
9268 x := v_0
9269 if v_1.Op != OpARMMOVWconst {
9270 break
9271 }
9272 c := auxIntToInt32(v_1.AuxInt)
9273 v.reset(OpARMRSBSconst)
9274 v.AuxInt = int32ToAuxInt(c << uint64(d))
9275 v.AddArg(x)
9276 return true
9277 }
9278 return false
9279 }
9280 func rewriteValueARM_OpARMRSBSshiftLLreg(v *Value) bool {
9281 v_2 := v.Args[2]
9282 v_1 := v.Args[1]
9283 v_0 := v.Args[0]
9284 b := v.Block
9285
9286
9287 for {
9288 if v_0.Op != OpARMMOVWconst {
9289 break
9290 }
9291 c := auxIntToInt32(v_0.AuxInt)
9292 x := v_1
9293 y := v_2
9294 v.reset(OpARMSUBSconst)
9295 v.AuxInt = int32ToAuxInt(c)
9296 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
9297 v0.AddArg2(x, y)
9298 v.AddArg(v0)
9299 return true
9300 }
9301
9302
9303
9304 for {
9305 x := v_0
9306 y := v_1
9307 if v_2.Op != OpARMMOVWconst {
9308 break
9309 }
9310 c := auxIntToInt32(v_2.AuxInt)
9311 if !(0 <= c && c < 32) {
9312 break
9313 }
9314 v.reset(OpARMRSBSshiftLL)
9315 v.AuxInt = int32ToAuxInt(c)
9316 v.AddArg2(x, y)
9317 return true
9318 }
9319 return false
9320 }
9321 func rewriteValueARM_OpARMRSBSshiftRA(v *Value) bool {
9322 v_1 := v.Args[1]
9323 v_0 := v.Args[0]
9324 b := v.Block
9325
9326
9327 for {
9328 d := auxIntToInt32(v.AuxInt)
9329 if v_0.Op != OpARMMOVWconst {
9330 break
9331 }
9332 c := auxIntToInt32(v_0.AuxInt)
9333 x := v_1
9334 v.reset(OpARMSUBSconst)
9335 v.AuxInt = int32ToAuxInt(c)
9336 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
9337 v0.AuxInt = int32ToAuxInt(d)
9338 v0.AddArg(x)
9339 v.AddArg(v0)
9340 return true
9341 }
9342
9343
9344 for {
9345 d := auxIntToInt32(v.AuxInt)
9346 x := v_0
9347 if v_1.Op != OpARMMOVWconst {
9348 break
9349 }
9350 c := auxIntToInt32(v_1.AuxInt)
9351 v.reset(OpARMRSBSconst)
9352 v.AuxInt = int32ToAuxInt(c >> uint64(d))
9353 v.AddArg(x)
9354 return true
9355 }
9356 return false
9357 }
9358 func rewriteValueARM_OpARMRSBSshiftRAreg(v *Value) bool {
9359 v_2 := v.Args[2]
9360 v_1 := v.Args[1]
9361 v_0 := v.Args[0]
9362 b := v.Block
9363
9364
9365 for {
9366 if v_0.Op != OpARMMOVWconst {
9367 break
9368 }
9369 c := auxIntToInt32(v_0.AuxInt)
9370 x := v_1
9371 y := v_2
9372 v.reset(OpARMSUBSconst)
9373 v.AuxInt = int32ToAuxInt(c)
9374 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
9375 v0.AddArg2(x, y)
9376 v.AddArg(v0)
9377 return true
9378 }
9379
9380
9381
9382 for {
9383 x := v_0
9384 y := v_1
9385 if v_2.Op != OpARMMOVWconst {
9386 break
9387 }
9388 c := auxIntToInt32(v_2.AuxInt)
9389 if !(0 <= c && c < 32) {
9390 break
9391 }
9392 v.reset(OpARMRSBSshiftRA)
9393 v.AuxInt = int32ToAuxInt(c)
9394 v.AddArg2(x, y)
9395 return true
9396 }
9397 return false
9398 }
9399 func rewriteValueARM_OpARMRSBSshiftRL(v *Value) bool {
9400 v_1 := v.Args[1]
9401 v_0 := v.Args[0]
9402 b := v.Block
9403
9404
9405 for {
9406 d := auxIntToInt32(v.AuxInt)
9407 if v_0.Op != OpARMMOVWconst {
9408 break
9409 }
9410 c := auxIntToInt32(v_0.AuxInt)
9411 x := v_1
9412 v.reset(OpARMSUBSconst)
9413 v.AuxInt = int32ToAuxInt(c)
9414 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
9415 v0.AuxInt = int32ToAuxInt(d)
9416 v0.AddArg(x)
9417 v.AddArg(v0)
9418 return true
9419 }
9420
9421
9422 for {
9423 d := auxIntToInt32(v.AuxInt)
9424 x := v_0
9425 if v_1.Op != OpARMMOVWconst {
9426 break
9427 }
9428 c := auxIntToInt32(v_1.AuxInt)
9429 v.reset(OpARMRSBSconst)
9430 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
9431 v.AddArg(x)
9432 return true
9433 }
9434 return false
9435 }
9436 func rewriteValueARM_OpARMRSBSshiftRLreg(v *Value) bool {
9437 v_2 := v.Args[2]
9438 v_1 := v.Args[1]
9439 v_0 := v.Args[0]
9440 b := v.Block
9441
9442
9443 for {
9444 if v_0.Op != OpARMMOVWconst {
9445 break
9446 }
9447 c := auxIntToInt32(v_0.AuxInt)
9448 x := v_1
9449 y := v_2
9450 v.reset(OpARMSUBSconst)
9451 v.AuxInt = int32ToAuxInt(c)
9452 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
9453 v0.AddArg2(x, y)
9454 v.AddArg(v0)
9455 return true
9456 }
9457
9458
9459
9460 for {
9461 x := v_0
9462 y := v_1
9463 if v_2.Op != OpARMMOVWconst {
9464 break
9465 }
9466 c := auxIntToInt32(v_2.AuxInt)
9467 if !(0 <= c && c < 32) {
9468 break
9469 }
9470 v.reset(OpARMRSBSshiftRL)
9471 v.AuxInt = int32ToAuxInt(c)
9472 v.AddArg2(x, y)
9473 return true
9474 }
9475 return false
9476 }
9477 func rewriteValueARM_OpARMRSBconst(v *Value) bool {
9478 v_0 := v.Args[0]
9479
9480
9481 for {
9482 c := auxIntToInt32(v.AuxInt)
9483 if v_0.Op != OpARMMOVWconst {
9484 break
9485 }
9486 d := auxIntToInt32(v_0.AuxInt)
9487 v.reset(OpARMMOVWconst)
9488 v.AuxInt = int32ToAuxInt(c - d)
9489 return true
9490 }
9491
9492
9493 for {
9494 c := auxIntToInt32(v.AuxInt)
9495 if v_0.Op != OpARMRSBconst {
9496 break
9497 }
9498 d := auxIntToInt32(v_0.AuxInt)
9499 x := v_0.Args[0]
9500 v.reset(OpARMADDconst)
9501 v.AuxInt = int32ToAuxInt(c - d)
9502 v.AddArg(x)
9503 return true
9504 }
9505
9506
9507 for {
9508 c := auxIntToInt32(v.AuxInt)
9509 if v_0.Op != OpARMADDconst {
9510 break
9511 }
9512 d := auxIntToInt32(v_0.AuxInt)
9513 x := v_0.Args[0]
9514 v.reset(OpARMRSBconst)
9515 v.AuxInt = int32ToAuxInt(c - d)
9516 v.AddArg(x)
9517 return true
9518 }
9519
9520
9521 for {
9522 c := auxIntToInt32(v.AuxInt)
9523 if v_0.Op != OpARMSUBconst {
9524 break
9525 }
9526 d := auxIntToInt32(v_0.AuxInt)
9527 x := v_0.Args[0]
9528 v.reset(OpARMRSBconst)
9529 v.AuxInt = int32ToAuxInt(c + d)
9530 v.AddArg(x)
9531 return true
9532 }
9533 return false
9534 }
9535 func rewriteValueARM_OpARMRSBshiftLL(v *Value) bool {
9536 v_1 := v.Args[1]
9537 v_0 := v.Args[0]
9538 b := v.Block
9539
9540
9541 for {
9542 d := auxIntToInt32(v.AuxInt)
9543 if v_0.Op != OpARMMOVWconst {
9544 break
9545 }
9546 c := auxIntToInt32(v_0.AuxInt)
9547 x := v_1
9548 v.reset(OpARMSUBconst)
9549 v.AuxInt = int32ToAuxInt(c)
9550 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
9551 v0.AuxInt = int32ToAuxInt(d)
9552 v0.AddArg(x)
9553 v.AddArg(v0)
9554 return true
9555 }
9556
9557
9558 for {
9559 d := auxIntToInt32(v.AuxInt)
9560 x := v_0
9561 if v_1.Op != OpARMMOVWconst {
9562 break
9563 }
9564 c := auxIntToInt32(v_1.AuxInt)
9565 v.reset(OpARMRSBconst)
9566 v.AuxInt = int32ToAuxInt(c << uint64(d))
9567 v.AddArg(x)
9568 return true
9569 }
9570
9571
9572 for {
9573 c := auxIntToInt32(v.AuxInt)
9574 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c {
9575 break
9576 }
9577 x := v_0.Args[0]
9578 if x != v_1 {
9579 break
9580 }
9581 v.reset(OpARMMOVWconst)
9582 v.AuxInt = int32ToAuxInt(0)
9583 return true
9584 }
9585 return false
9586 }
9587 func rewriteValueARM_OpARMRSBshiftLLreg(v *Value) bool {
9588 v_2 := v.Args[2]
9589 v_1 := v.Args[1]
9590 v_0 := v.Args[0]
9591 b := v.Block
9592
9593
9594 for {
9595 if v_0.Op != OpARMMOVWconst {
9596 break
9597 }
9598 c := auxIntToInt32(v_0.AuxInt)
9599 x := v_1
9600 y := v_2
9601 v.reset(OpARMSUBconst)
9602 v.AuxInt = int32ToAuxInt(c)
9603 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
9604 v0.AddArg2(x, y)
9605 v.AddArg(v0)
9606 return true
9607 }
9608
9609
9610
9611 for {
9612 x := v_0
9613 y := v_1
9614 if v_2.Op != OpARMMOVWconst {
9615 break
9616 }
9617 c := auxIntToInt32(v_2.AuxInt)
9618 if !(0 <= c && c < 32) {
9619 break
9620 }
9621 v.reset(OpARMRSBshiftLL)
9622 v.AuxInt = int32ToAuxInt(c)
9623 v.AddArg2(x, y)
9624 return true
9625 }
9626 return false
9627 }
9628 func rewriteValueARM_OpARMRSBshiftRA(v *Value) bool {
9629 v_1 := v.Args[1]
9630 v_0 := v.Args[0]
9631 b := v.Block
9632
9633
9634 for {
9635 d := auxIntToInt32(v.AuxInt)
9636 if v_0.Op != OpARMMOVWconst {
9637 break
9638 }
9639 c := auxIntToInt32(v_0.AuxInt)
9640 x := v_1
9641 v.reset(OpARMSUBconst)
9642 v.AuxInt = int32ToAuxInt(c)
9643 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
9644 v0.AuxInt = int32ToAuxInt(d)
9645 v0.AddArg(x)
9646 v.AddArg(v0)
9647 return true
9648 }
9649
9650
9651 for {
9652 d := auxIntToInt32(v.AuxInt)
9653 x := v_0
9654 if v_1.Op != OpARMMOVWconst {
9655 break
9656 }
9657 c := auxIntToInt32(v_1.AuxInt)
9658 v.reset(OpARMRSBconst)
9659 v.AuxInt = int32ToAuxInt(c >> uint64(d))
9660 v.AddArg(x)
9661 return true
9662 }
9663
9664
9665 for {
9666 c := auxIntToInt32(v.AuxInt)
9667 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c {
9668 break
9669 }
9670 x := v_0.Args[0]
9671 if x != v_1 {
9672 break
9673 }
9674 v.reset(OpARMMOVWconst)
9675 v.AuxInt = int32ToAuxInt(0)
9676 return true
9677 }
9678 return false
9679 }
9680 func rewriteValueARM_OpARMRSBshiftRAreg(v *Value) bool {
9681 v_2 := v.Args[2]
9682 v_1 := v.Args[1]
9683 v_0 := v.Args[0]
9684 b := v.Block
9685
9686
9687 for {
9688 if v_0.Op != OpARMMOVWconst {
9689 break
9690 }
9691 c := auxIntToInt32(v_0.AuxInt)
9692 x := v_1
9693 y := v_2
9694 v.reset(OpARMSUBconst)
9695 v.AuxInt = int32ToAuxInt(c)
9696 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
9697 v0.AddArg2(x, y)
9698 v.AddArg(v0)
9699 return true
9700 }
9701
9702
9703
9704 for {
9705 x := v_0
9706 y := v_1
9707 if v_2.Op != OpARMMOVWconst {
9708 break
9709 }
9710 c := auxIntToInt32(v_2.AuxInt)
9711 if !(0 <= c && c < 32) {
9712 break
9713 }
9714 v.reset(OpARMRSBshiftRA)
9715 v.AuxInt = int32ToAuxInt(c)
9716 v.AddArg2(x, y)
9717 return true
9718 }
9719 return false
9720 }
9721 func rewriteValueARM_OpARMRSBshiftRL(v *Value) bool {
9722 v_1 := v.Args[1]
9723 v_0 := v.Args[0]
9724 b := v.Block
9725
9726
9727 for {
9728 d := auxIntToInt32(v.AuxInt)
9729 if v_0.Op != OpARMMOVWconst {
9730 break
9731 }
9732 c := auxIntToInt32(v_0.AuxInt)
9733 x := v_1
9734 v.reset(OpARMSUBconst)
9735 v.AuxInt = int32ToAuxInt(c)
9736 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
9737 v0.AuxInt = int32ToAuxInt(d)
9738 v0.AddArg(x)
9739 v.AddArg(v0)
9740 return true
9741 }
9742
9743
9744 for {
9745 d := auxIntToInt32(v.AuxInt)
9746 x := v_0
9747 if v_1.Op != OpARMMOVWconst {
9748 break
9749 }
9750 c := auxIntToInt32(v_1.AuxInt)
9751 v.reset(OpARMRSBconst)
9752 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
9753 v.AddArg(x)
9754 return true
9755 }
9756
9757
9758 for {
9759 c := auxIntToInt32(v.AuxInt)
9760 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c {
9761 break
9762 }
9763 x := v_0.Args[0]
9764 if x != v_1 {
9765 break
9766 }
9767 v.reset(OpARMMOVWconst)
9768 v.AuxInt = int32ToAuxInt(0)
9769 return true
9770 }
9771 return false
9772 }
9773 func rewriteValueARM_OpARMRSBshiftRLreg(v *Value) bool {
9774 v_2 := v.Args[2]
9775 v_1 := v.Args[1]
9776 v_0 := v.Args[0]
9777 b := v.Block
9778
9779
9780 for {
9781 if v_0.Op != OpARMMOVWconst {
9782 break
9783 }
9784 c := auxIntToInt32(v_0.AuxInt)
9785 x := v_1
9786 y := v_2
9787 v.reset(OpARMSUBconst)
9788 v.AuxInt = int32ToAuxInt(c)
9789 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
9790 v0.AddArg2(x, y)
9791 v.AddArg(v0)
9792 return true
9793 }
9794
9795
9796
9797 for {
9798 x := v_0
9799 y := v_1
9800 if v_2.Op != OpARMMOVWconst {
9801 break
9802 }
9803 c := auxIntToInt32(v_2.AuxInt)
9804 if !(0 <= c && c < 32) {
9805 break
9806 }
9807 v.reset(OpARMRSBshiftRL)
9808 v.AuxInt = int32ToAuxInt(c)
9809 v.AddArg2(x, y)
9810 return true
9811 }
9812 return false
9813 }
9814 func rewriteValueARM_OpARMRSCconst(v *Value) bool {
9815 v_1 := v.Args[1]
9816 v_0 := v.Args[0]
9817
9818
9819 for {
9820 c := auxIntToInt32(v.AuxInt)
9821 if v_0.Op != OpARMADDconst {
9822 break
9823 }
9824 d := auxIntToInt32(v_0.AuxInt)
9825 x := v_0.Args[0]
9826 flags := v_1
9827 v.reset(OpARMRSCconst)
9828 v.AuxInt = int32ToAuxInt(c - d)
9829 v.AddArg2(x, flags)
9830 return true
9831 }
9832
9833
9834 for {
9835 c := auxIntToInt32(v.AuxInt)
9836 if v_0.Op != OpARMSUBconst {
9837 break
9838 }
9839 d := auxIntToInt32(v_0.AuxInt)
9840 x := v_0.Args[0]
9841 flags := v_1
9842 v.reset(OpARMRSCconst)
9843 v.AuxInt = int32ToAuxInt(c + d)
9844 v.AddArg2(x, flags)
9845 return true
9846 }
9847 return false
9848 }
9849 func rewriteValueARM_OpARMRSCshiftLL(v *Value) bool {
9850 v_2 := v.Args[2]
9851 v_1 := v.Args[1]
9852 v_0 := v.Args[0]
9853 b := v.Block
9854
9855
9856 for {
9857 d := auxIntToInt32(v.AuxInt)
9858 if v_0.Op != OpARMMOVWconst {
9859 break
9860 }
9861 c := auxIntToInt32(v_0.AuxInt)
9862 x := v_1
9863 flags := v_2
9864 v.reset(OpARMSBCconst)
9865 v.AuxInt = int32ToAuxInt(c)
9866 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
9867 v0.AuxInt = int32ToAuxInt(d)
9868 v0.AddArg(x)
9869 v.AddArg2(v0, flags)
9870 return true
9871 }
9872
9873
9874 for {
9875 d := auxIntToInt32(v.AuxInt)
9876 x := v_0
9877 if v_1.Op != OpARMMOVWconst {
9878 break
9879 }
9880 c := auxIntToInt32(v_1.AuxInt)
9881 flags := v_2
9882 v.reset(OpARMRSCconst)
9883 v.AuxInt = int32ToAuxInt(c << uint64(d))
9884 v.AddArg2(x, flags)
9885 return true
9886 }
9887 return false
9888 }
9889 func rewriteValueARM_OpARMRSCshiftLLreg(v *Value) bool {
9890 v_3 := v.Args[3]
9891 v_2 := v.Args[2]
9892 v_1 := v.Args[1]
9893 v_0 := v.Args[0]
9894 b := v.Block
9895
9896
9897 for {
9898 if v_0.Op != OpARMMOVWconst {
9899 break
9900 }
9901 c := auxIntToInt32(v_0.AuxInt)
9902 x := v_1
9903 y := v_2
9904 flags := v_3
9905 v.reset(OpARMSBCconst)
9906 v.AuxInt = int32ToAuxInt(c)
9907 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
9908 v0.AddArg2(x, y)
9909 v.AddArg2(v0, flags)
9910 return true
9911 }
9912
9913
9914
9915 for {
9916 x := v_0
9917 y := v_1
9918 if v_2.Op != OpARMMOVWconst {
9919 break
9920 }
9921 c := auxIntToInt32(v_2.AuxInt)
9922 flags := v_3
9923 if !(0 <= c && c < 32) {
9924 break
9925 }
9926 v.reset(OpARMRSCshiftLL)
9927 v.AuxInt = int32ToAuxInt(c)
9928 v.AddArg3(x, y, flags)
9929 return true
9930 }
9931 return false
9932 }
9933 func rewriteValueARM_OpARMRSCshiftRA(v *Value) bool {
9934 v_2 := v.Args[2]
9935 v_1 := v.Args[1]
9936 v_0 := v.Args[0]
9937 b := v.Block
9938
9939
9940 for {
9941 d := auxIntToInt32(v.AuxInt)
9942 if v_0.Op != OpARMMOVWconst {
9943 break
9944 }
9945 c := auxIntToInt32(v_0.AuxInt)
9946 x := v_1
9947 flags := v_2
9948 v.reset(OpARMSBCconst)
9949 v.AuxInt = int32ToAuxInt(c)
9950 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
9951 v0.AuxInt = int32ToAuxInt(d)
9952 v0.AddArg(x)
9953 v.AddArg2(v0, flags)
9954 return true
9955 }
9956
9957
9958 for {
9959 d := auxIntToInt32(v.AuxInt)
9960 x := v_0
9961 if v_1.Op != OpARMMOVWconst {
9962 break
9963 }
9964 c := auxIntToInt32(v_1.AuxInt)
9965 flags := v_2
9966 v.reset(OpARMRSCconst)
9967 v.AuxInt = int32ToAuxInt(c >> uint64(d))
9968 v.AddArg2(x, flags)
9969 return true
9970 }
9971 return false
9972 }
9973 func rewriteValueARM_OpARMRSCshiftRAreg(v *Value) bool {
9974 v_3 := v.Args[3]
9975 v_2 := v.Args[2]
9976 v_1 := v.Args[1]
9977 v_0 := v.Args[0]
9978 b := v.Block
9979
9980
9981 for {
9982 if v_0.Op != OpARMMOVWconst {
9983 break
9984 }
9985 c := auxIntToInt32(v_0.AuxInt)
9986 x := v_1
9987 y := v_2
9988 flags := v_3
9989 v.reset(OpARMSBCconst)
9990 v.AuxInt = int32ToAuxInt(c)
9991 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
9992 v0.AddArg2(x, y)
9993 v.AddArg2(v0, flags)
9994 return true
9995 }
9996
9997
9998
9999 for {
10000 x := v_0
10001 y := v_1
10002 if v_2.Op != OpARMMOVWconst {
10003 break
10004 }
10005 c := auxIntToInt32(v_2.AuxInt)
10006 flags := v_3
10007 if !(0 <= c && c < 32) {
10008 break
10009 }
10010 v.reset(OpARMRSCshiftRA)
10011 v.AuxInt = int32ToAuxInt(c)
10012 v.AddArg3(x, y, flags)
10013 return true
10014 }
10015 return false
10016 }
10017 func rewriteValueARM_OpARMRSCshiftRL(v *Value) bool {
10018 v_2 := v.Args[2]
10019 v_1 := v.Args[1]
10020 v_0 := v.Args[0]
10021 b := v.Block
10022
10023
10024 for {
10025 d := auxIntToInt32(v.AuxInt)
10026 if v_0.Op != OpARMMOVWconst {
10027 break
10028 }
10029 c := auxIntToInt32(v_0.AuxInt)
10030 x := v_1
10031 flags := v_2
10032 v.reset(OpARMSBCconst)
10033 v.AuxInt = int32ToAuxInt(c)
10034 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
10035 v0.AuxInt = int32ToAuxInt(d)
10036 v0.AddArg(x)
10037 v.AddArg2(v0, flags)
10038 return true
10039 }
10040
10041
10042 for {
10043 d := auxIntToInt32(v.AuxInt)
10044 x := v_0
10045 if v_1.Op != OpARMMOVWconst {
10046 break
10047 }
10048 c := auxIntToInt32(v_1.AuxInt)
10049 flags := v_2
10050 v.reset(OpARMRSCconst)
10051 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
10052 v.AddArg2(x, flags)
10053 return true
10054 }
10055 return false
10056 }
10057 func rewriteValueARM_OpARMRSCshiftRLreg(v *Value) bool {
10058 v_3 := v.Args[3]
10059 v_2 := v.Args[2]
10060 v_1 := v.Args[1]
10061 v_0 := v.Args[0]
10062 b := v.Block
10063
10064
10065 for {
10066 if v_0.Op != OpARMMOVWconst {
10067 break
10068 }
10069 c := auxIntToInt32(v_0.AuxInt)
10070 x := v_1
10071 y := v_2
10072 flags := v_3
10073 v.reset(OpARMSBCconst)
10074 v.AuxInt = int32ToAuxInt(c)
10075 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
10076 v0.AddArg2(x, y)
10077 v.AddArg2(v0, flags)
10078 return true
10079 }
10080
10081
10082
10083 for {
10084 x := v_0
10085 y := v_1
10086 if v_2.Op != OpARMMOVWconst {
10087 break
10088 }
10089 c := auxIntToInt32(v_2.AuxInt)
10090 flags := v_3
10091 if !(0 <= c && c < 32) {
10092 break
10093 }
10094 v.reset(OpARMRSCshiftRL)
10095 v.AuxInt = int32ToAuxInt(c)
10096 v.AddArg3(x, y, flags)
10097 return true
10098 }
10099 return false
10100 }
10101 func rewriteValueARM_OpARMSBC(v *Value) bool {
10102 v_2 := v.Args[2]
10103 v_1 := v.Args[1]
10104 v_0 := v.Args[0]
10105
10106
10107 for {
10108 if v_0.Op != OpARMMOVWconst {
10109 break
10110 }
10111 c := auxIntToInt32(v_0.AuxInt)
10112 x := v_1
10113 flags := v_2
10114 v.reset(OpARMRSCconst)
10115 v.AuxInt = int32ToAuxInt(c)
10116 v.AddArg2(x, flags)
10117 return true
10118 }
10119
10120
10121 for {
10122 x := v_0
10123 if v_1.Op != OpARMMOVWconst {
10124 break
10125 }
10126 c := auxIntToInt32(v_1.AuxInt)
10127 flags := v_2
10128 v.reset(OpARMSBCconst)
10129 v.AuxInt = int32ToAuxInt(c)
10130 v.AddArg2(x, flags)
10131 return true
10132 }
10133
10134
10135 for {
10136 x := v_0
10137 if v_1.Op != OpARMSLLconst {
10138 break
10139 }
10140 c := auxIntToInt32(v_1.AuxInt)
10141 y := v_1.Args[0]
10142 flags := v_2
10143 v.reset(OpARMSBCshiftLL)
10144 v.AuxInt = int32ToAuxInt(c)
10145 v.AddArg3(x, y, flags)
10146 return true
10147 }
10148
10149
10150 for {
10151 if v_0.Op != OpARMSLLconst {
10152 break
10153 }
10154 c := auxIntToInt32(v_0.AuxInt)
10155 y := v_0.Args[0]
10156 x := v_1
10157 flags := v_2
10158 v.reset(OpARMRSCshiftLL)
10159 v.AuxInt = int32ToAuxInt(c)
10160 v.AddArg3(x, y, flags)
10161 return true
10162 }
10163
10164
10165 for {
10166 x := v_0
10167 if v_1.Op != OpARMSRLconst {
10168 break
10169 }
10170 c := auxIntToInt32(v_1.AuxInt)
10171 y := v_1.Args[0]
10172 flags := v_2
10173 v.reset(OpARMSBCshiftRL)
10174 v.AuxInt = int32ToAuxInt(c)
10175 v.AddArg3(x, y, flags)
10176 return true
10177 }
10178
10179
10180 for {
10181 if v_0.Op != OpARMSRLconst {
10182 break
10183 }
10184 c := auxIntToInt32(v_0.AuxInt)
10185 y := v_0.Args[0]
10186 x := v_1
10187 flags := v_2
10188 v.reset(OpARMRSCshiftRL)
10189 v.AuxInt = int32ToAuxInt(c)
10190 v.AddArg3(x, y, flags)
10191 return true
10192 }
10193
10194
10195 for {
10196 x := v_0
10197 if v_1.Op != OpARMSRAconst {
10198 break
10199 }
10200 c := auxIntToInt32(v_1.AuxInt)
10201 y := v_1.Args[0]
10202 flags := v_2
10203 v.reset(OpARMSBCshiftRA)
10204 v.AuxInt = int32ToAuxInt(c)
10205 v.AddArg3(x, y, flags)
10206 return true
10207 }
10208
10209
10210 for {
10211 if v_0.Op != OpARMSRAconst {
10212 break
10213 }
10214 c := auxIntToInt32(v_0.AuxInt)
10215 y := v_0.Args[0]
10216 x := v_1
10217 flags := v_2
10218 v.reset(OpARMRSCshiftRA)
10219 v.AuxInt = int32ToAuxInt(c)
10220 v.AddArg3(x, y, flags)
10221 return true
10222 }
10223
10224
10225 for {
10226 x := v_0
10227 if v_1.Op != OpARMSLL {
10228 break
10229 }
10230 z := v_1.Args[1]
10231 y := v_1.Args[0]
10232 flags := v_2
10233 v.reset(OpARMSBCshiftLLreg)
10234 v.AddArg4(x, y, z, flags)
10235 return true
10236 }
10237
10238
10239 for {
10240 if v_0.Op != OpARMSLL {
10241 break
10242 }
10243 z := v_0.Args[1]
10244 y := v_0.Args[0]
10245 x := v_1
10246 flags := v_2
10247 v.reset(OpARMRSCshiftLLreg)
10248 v.AddArg4(x, y, z, flags)
10249 return true
10250 }
10251
10252
10253 for {
10254 x := v_0
10255 if v_1.Op != OpARMSRL {
10256 break
10257 }
10258 z := v_1.Args[1]
10259 y := v_1.Args[0]
10260 flags := v_2
10261 v.reset(OpARMSBCshiftRLreg)
10262 v.AddArg4(x, y, z, flags)
10263 return true
10264 }
10265
10266
10267 for {
10268 if v_0.Op != OpARMSRL {
10269 break
10270 }
10271 z := v_0.Args[1]
10272 y := v_0.Args[0]
10273 x := v_1
10274 flags := v_2
10275 v.reset(OpARMRSCshiftRLreg)
10276 v.AddArg4(x, y, z, flags)
10277 return true
10278 }
10279
10280
10281 for {
10282 x := v_0
10283 if v_1.Op != OpARMSRA {
10284 break
10285 }
10286 z := v_1.Args[1]
10287 y := v_1.Args[0]
10288 flags := v_2
10289 v.reset(OpARMSBCshiftRAreg)
10290 v.AddArg4(x, y, z, flags)
10291 return true
10292 }
10293
10294
10295 for {
10296 if v_0.Op != OpARMSRA {
10297 break
10298 }
10299 z := v_0.Args[1]
10300 y := v_0.Args[0]
10301 x := v_1
10302 flags := v_2
10303 v.reset(OpARMRSCshiftRAreg)
10304 v.AddArg4(x, y, z, flags)
10305 return true
10306 }
10307 return false
10308 }
10309 func rewriteValueARM_OpARMSBCconst(v *Value) bool {
10310 v_1 := v.Args[1]
10311 v_0 := v.Args[0]
10312
10313
10314 for {
10315 c := auxIntToInt32(v.AuxInt)
10316 if v_0.Op != OpARMADDconst {
10317 break
10318 }
10319 d := auxIntToInt32(v_0.AuxInt)
10320 x := v_0.Args[0]
10321 flags := v_1
10322 v.reset(OpARMSBCconst)
10323 v.AuxInt = int32ToAuxInt(c - d)
10324 v.AddArg2(x, flags)
10325 return true
10326 }
10327
10328
10329 for {
10330 c := auxIntToInt32(v.AuxInt)
10331 if v_0.Op != OpARMSUBconst {
10332 break
10333 }
10334 d := auxIntToInt32(v_0.AuxInt)
10335 x := v_0.Args[0]
10336 flags := v_1
10337 v.reset(OpARMSBCconst)
10338 v.AuxInt = int32ToAuxInt(c + d)
10339 v.AddArg2(x, flags)
10340 return true
10341 }
10342 return false
10343 }
10344 func rewriteValueARM_OpARMSBCshiftLL(v *Value) bool {
10345 v_2 := v.Args[2]
10346 v_1 := v.Args[1]
10347 v_0 := v.Args[0]
10348 b := v.Block
10349
10350
10351 for {
10352 d := auxIntToInt32(v.AuxInt)
10353 if v_0.Op != OpARMMOVWconst {
10354 break
10355 }
10356 c := auxIntToInt32(v_0.AuxInt)
10357 x := v_1
10358 flags := v_2
10359 v.reset(OpARMRSCconst)
10360 v.AuxInt = int32ToAuxInt(c)
10361 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
10362 v0.AuxInt = int32ToAuxInt(d)
10363 v0.AddArg(x)
10364 v.AddArg2(v0, flags)
10365 return true
10366 }
10367
10368
10369 for {
10370 d := auxIntToInt32(v.AuxInt)
10371 x := v_0
10372 if v_1.Op != OpARMMOVWconst {
10373 break
10374 }
10375 c := auxIntToInt32(v_1.AuxInt)
10376 flags := v_2
10377 v.reset(OpARMSBCconst)
10378 v.AuxInt = int32ToAuxInt(c << uint64(d))
10379 v.AddArg2(x, flags)
10380 return true
10381 }
10382 return false
10383 }
10384 func rewriteValueARM_OpARMSBCshiftLLreg(v *Value) bool {
10385 v_3 := v.Args[3]
10386 v_2 := v.Args[2]
10387 v_1 := v.Args[1]
10388 v_0 := v.Args[0]
10389 b := v.Block
10390
10391
10392 for {
10393 if v_0.Op != OpARMMOVWconst {
10394 break
10395 }
10396 c := auxIntToInt32(v_0.AuxInt)
10397 x := v_1
10398 y := v_2
10399 flags := v_3
10400 v.reset(OpARMRSCconst)
10401 v.AuxInt = int32ToAuxInt(c)
10402 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
10403 v0.AddArg2(x, y)
10404 v.AddArg2(v0, flags)
10405 return true
10406 }
10407
10408
10409
10410 for {
10411 x := v_0
10412 y := v_1
10413 if v_2.Op != OpARMMOVWconst {
10414 break
10415 }
10416 c := auxIntToInt32(v_2.AuxInt)
10417 flags := v_3
10418 if !(0 <= c && c < 32) {
10419 break
10420 }
10421 v.reset(OpARMSBCshiftLL)
10422 v.AuxInt = int32ToAuxInt(c)
10423 v.AddArg3(x, y, flags)
10424 return true
10425 }
10426 return false
10427 }
10428 func rewriteValueARM_OpARMSBCshiftRA(v *Value) bool {
10429 v_2 := v.Args[2]
10430 v_1 := v.Args[1]
10431 v_0 := v.Args[0]
10432 b := v.Block
10433
10434
10435 for {
10436 d := auxIntToInt32(v.AuxInt)
10437 if v_0.Op != OpARMMOVWconst {
10438 break
10439 }
10440 c := auxIntToInt32(v_0.AuxInt)
10441 x := v_1
10442 flags := v_2
10443 v.reset(OpARMRSCconst)
10444 v.AuxInt = int32ToAuxInt(c)
10445 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
10446 v0.AuxInt = int32ToAuxInt(d)
10447 v0.AddArg(x)
10448 v.AddArg2(v0, flags)
10449 return true
10450 }
10451
10452
10453 for {
10454 d := auxIntToInt32(v.AuxInt)
10455 x := v_0
10456 if v_1.Op != OpARMMOVWconst {
10457 break
10458 }
10459 c := auxIntToInt32(v_1.AuxInt)
10460 flags := v_2
10461 v.reset(OpARMSBCconst)
10462 v.AuxInt = int32ToAuxInt(c >> uint64(d))
10463 v.AddArg2(x, flags)
10464 return true
10465 }
10466 return false
10467 }
10468 func rewriteValueARM_OpARMSBCshiftRAreg(v *Value) bool {
10469 v_3 := v.Args[3]
10470 v_2 := v.Args[2]
10471 v_1 := v.Args[1]
10472 v_0 := v.Args[0]
10473 b := v.Block
10474
10475
10476 for {
10477 if v_0.Op != OpARMMOVWconst {
10478 break
10479 }
10480 c := auxIntToInt32(v_0.AuxInt)
10481 x := v_1
10482 y := v_2
10483 flags := v_3
10484 v.reset(OpARMRSCconst)
10485 v.AuxInt = int32ToAuxInt(c)
10486 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
10487 v0.AddArg2(x, y)
10488 v.AddArg2(v0, flags)
10489 return true
10490 }
10491
10492
10493
10494 for {
10495 x := v_0
10496 y := v_1
10497 if v_2.Op != OpARMMOVWconst {
10498 break
10499 }
10500 c := auxIntToInt32(v_2.AuxInt)
10501 flags := v_3
10502 if !(0 <= c && c < 32) {
10503 break
10504 }
10505 v.reset(OpARMSBCshiftRA)
10506 v.AuxInt = int32ToAuxInt(c)
10507 v.AddArg3(x, y, flags)
10508 return true
10509 }
10510 return false
10511 }
10512 func rewriteValueARM_OpARMSBCshiftRL(v *Value) bool {
10513 v_2 := v.Args[2]
10514 v_1 := v.Args[1]
10515 v_0 := v.Args[0]
10516 b := v.Block
10517
10518
10519 for {
10520 d := auxIntToInt32(v.AuxInt)
10521 if v_0.Op != OpARMMOVWconst {
10522 break
10523 }
10524 c := auxIntToInt32(v_0.AuxInt)
10525 x := v_1
10526 flags := v_2
10527 v.reset(OpARMRSCconst)
10528 v.AuxInt = int32ToAuxInt(c)
10529 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
10530 v0.AuxInt = int32ToAuxInt(d)
10531 v0.AddArg(x)
10532 v.AddArg2(v0, flags)
10533 return true
10534 }
10535
10536
10537 for {
10538 d := auxIntToInt32(v.AuxInt)
10539 x := v_0
10540 if v_1.Op != OpARMMOVWconst {
10541 break
10542 }
10543 c := auxIntToInt32(v_1.AuxInt)
10544 flags := v_2
10545 v.reset(OpARMSBCconst)
10546 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
10547 v.AddArg2(x, flags)
10548 return true
10549 }
10550 return false
10551 }
10552 func rewriteValueARM_OpARMSBCshiftRLreg(v *Value) bool {
10553 v_3 := v.Args[3]
10554 v_2 := v.Args[2]
10555 v_1 := v.Args[1]
10556 v_0 := v.Args[0]
10557 b := v.Block
10558
10559
10560 for {
10561 if v_0.Op != OpARMMOVWconst {
10562 break
10563 }
10564 c := auxIntToInt32(v_0.AuxInt)
10565 x := v_1
10566 y := v_2
10567 flags := v_3
10568 v.reset(OpARMRSCconst)
10569 v.AuxInt = int32ToAuxInt(c)
10570 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
10571 v0.AddArg2(x, y)
10572 v.AddArg2(v0, flags)
10573 return true
10574 }
10575
10576
10577
10578 for {
10579 x := v_0
10580 y := v_1
10581 if v_2.Op != OpARMMOVWconst {
10582 break
10583 }
10584 c := auxIntToInt32(v_2.AuxInt)
10585 flags := v_3
10586 if !(0 <= c && c < 32) {
10587 break
10588 }
10589 v.reset(OpARMSBCshiftRL)
10590 v.AuxInt = int32ToAuxInt(c)
10591 v.AddArg3(x, y, flags)
10592 return true
10593 }
10594 return false
10595 }
10596 func rewriteValueARM_OpARMSLL(v *Value) bool {
10597 v_1 := v.Args[1]
10598 v_0 := v.Args[0]
10599
10600
10601
10602 for {
10603 x := v_0
10604 if v_1.Op != OpARMMOVWconst {
10605 break
10606 }
10607 c := auxIntToInt32(v_1.AuxInt)
10608 if !(0 <= c && c < 32) {
10609 break
10610 }
10611 v.reset(OpARMSLLconst)
10612 v.AuxInt = int32ToAuxInt(c)
10613 v.AddArg(x)
10614 return true
10615 }
10616 return false
10617 }
10618 func rewriteValueARM_OpARMSLLconst(v *Value) bool {
10619 v_0 := v.Args[0]
10620
10621
10622 for {
10623 c := auxIntToInt32(v.AuxInt)
10624 if v_0.Op != OpARMMOVWconst {
10625 break
10626 }
10627 d := auxIntToInt32(v_0.AuxInt)
10628 v.reset(OpARMMOVWconst)
10629 v.AuxInt = int32ToAuxInt(d << uint64(c))
10630 return true
10631 }
10632 return false
10633 }
10634 func rewriteValueARM_OpARMSRA(v *Value) bool {
10635 v_1 := v.Args[1]
10636 v_0 := v.Args[0]
10637
10638
10639
10640 for {
10641 x := v_0
10642 if v_1.Op != OpARMMOVWconst {
10643 break
10644 }
10645 c := auxIntToInt32(v_1.AuxInt)
10646 if !(0 <= c && c < 32) {
10647 break
10648 }
10649 v.reset(OpARMSRAconst)
10650 v.AuxInt = int32ToAuxInt(c)
10651 v.AddArg(x)
10652 return true
10653 }
10654 return false
10655 }
10656 func rewriteValueARM_OpARMSRAcond(v *Value) bool {
10657 v_2 := v.Args[2]
10658 v_1 := v.Args[1]
10659 v_0 := v.Args[0]
10660
10661
10662
10663 for {
10664 x := v_0
10665 if v_2.Op != OpARMFlagConstant {
10666 break
10667 }
10668 fc := auxIntToFlagConstant(v_2.AuxInt)
10669 if !(fc.uge()) {
10670 break
10671 }
10672 v.reset(OpARMSRAconst)
10673 v.AuxInt = int32ToAuxInt(31)
10674 v.AddArg(x)
10675 return true
10676 }
10677
10678
10679
10680 for {
10681 x := v_0
10682 y := v_1
10683 if v_2.Op != OpARMFlagConstant {
10684 break
10685 }
10686 fc := auxIntToFlagConstant(v_2.AuxInt)
10687 if !(fc.ult()) {
10688 break
10689 }
10690 v.reset(OpARMSRA)
10691 v.AddArg2(x, y)
10692 return true
10693 }
10694 return false
10695 }
10696 func rewriteValueARM_OpARMSRAconst(v *Value) bool {
10697 v_0 := v.Args[0]
10698
10699
10700 for {
10701 c := auxIntToInt32(v.AuxInt)
10702 if v_0.Op != OpARMMOVWconst {
10703 break
10704 }
10705 d := auxIntToInt32(v_0.AuxInt)
10706 v.reset(OpARMMOVWconst)
10707 v.AuxInt = int32ToAuxInt(d >> uint64(c))
10708 return true
10709 }
10710
10711
10712
10713 for {
10714 d := auxIntToInt32(v.AuxInt)
10715 if v_0.Op != OpARMSLLconst {
10716 break
10717 }
10718 c := auxIntToInt32(v_0.AuxInt)
10719 x := v_0.Args[0]
10720 if !(buildcfg.GOARM.Version == 7 && uint64(d) >= uint64(c) && uint64(d) <= 31) {
10721 break
10722 }
10723 v.reset(OpARMBFX)
10724 v.AuxInt = int32ToAuxInt((d - c) | (32-d)<<8)
10725 v.AddArg(x)
10726 return true
10727 }
10728 return false
10729 }
10730 func rewriteValueARM_OpARMSRL(v *Value) bool {
10731 v_1 := v.Args[1]
10732 v_0 := v.Args[0]
10733
10734
10735
10736 for {
10737 x := v_0
10738 if v_1.Op != OpARMMOVWconst {
10739 break
10740 }
10741 c := auxIntToInt32(v_1.AuxInt)
10742 if !(0 <= c && c < 32) {
10743 break
10744 }
10745 v.reset(OpARMSRLconst)
10746 v.AuxInt = int32ToAuxInt(c)
10747 v.AddArg(x)
10748 return true
10749 }
10750 return false
10751 }
10752 func rewriteValueARM_OpARMSRLconst(v *Value) bool {
10753 v_0 := v.Args[0]
10754
10755
10756 for {
10757 c := auxIntToInt32(v.AuxInt)
10758 if v_0.Op != OpARMMOVWconst {
10759 break
10760 }
10761 d := auxIntToInt32(v_0.AuxInt)
10762 v.reset(OpARMMOVWconst)
10763 v.AuxInt = int32ToAuxInt(int32(uint32(d) >> uint64(c)))
10764 return true
10765 }
10766
10767
10768
10769 for {
10770 d := auxIntToInt32(v.AuxInt)
10771 if v_0.Op != OpARMSLLconst {
10772 break
10773 }
10774 c := auxIntToInt32(v_0.AuxInt)
10775 x := v_0.Args[0]
10776 if !(buildcfg.GOARM.Version == 7 && uint64(d) >= uint64(c) && uint64(d) <= 31) {
10777 break
10778 }
10779 v.reset(OpARMBFXU)
10780 v.AuxInt = int32ToAuxInt((d - c) | (32-d)<<8)
10781 v.AddArg(x)
10782 return true
10783 }
10784 return false
10785 }
10786 func rewriteValueARM_OpARMSRR(v *Value) bool {
10787 v_1 := v.Args[1]
10788 v_0 := v.Args[0]
10789
10790
10791 for {
10792 x := v_0
10793 if v_1.Op != OpARMMOVWconst {
10794 break
10795 }
10796 c := auxIntToInt32(v_1.AuxInt)
10797 v.reset(OpARMSRRconst)
10798 v.AuxInt = int32ToAuxInt(c & 31)
10799 v.AddArg(x)
10800 return true
10801 }
10802 return false
10803 }
10804 func rewriteValueARM_OpARMSUB(v *Value) bool {
10805 v_1 := v.Args[1]
10806 v_0 := v.Args[0]
10807
10808
10809 for {
10810 if v_0.Op != OpARMMOVWconst {
10811 break
10812 }
10813 c := auxIntToInt32(v_0.AuxInt)
10814 x := v_1
10815 v.reset(OpARMRSBconst)
10816 v.AuxInt = int32ToAuxInt(c)
10817 v.AddArg(x)
10818 return true
10819 }
10820
10821
10822 for {
10823 x := v_0
10824 if v_1.Op != OpARMMOVWconst {
10825 break
10826 }
10827 c := auxIntToInt32(v_1.AuxInt)
10828 v.reset(OpARMSUBconst)
10829 v.AuxInt = int32ToAuxInt(c)
10830 v.AddArg(x)
10831 return true
10832 }
10833
10834
10835 for {
10836 x := v_0
10837 if v_1.Op != OpARMSLLconst {
10838 break
10839 }
10840 c := auxIntToInt32(v_1.AuxInt)
10841 y := v_1.Args[0]
10842 v.reset(OpARMSUBshiftLL)
10843 v.AuxInt = int32ToAuxInt(c)
10844 v.AddArg2(x, y)
10845 return true
10846 }
10847
10848
10849 for {
10850 if v_0.Op != OpARMSLLconst {
10851 break
10852 }
10853 c := auxIntToInt32(v_0.AuxInt)
10854 y := v_0.Args[0]
10855 x := v_1
10856 v.reset(OpARMRSBshiftLL)
10857 v.AuxInt = int32ToAuxInt(c)
10858 v.AddArg2(x, y)
10859 return true
10860 }
10861
10862
10863 for {
10864 x := v_0
10865 if v_1.Op != OpARMSRLconst {
10866 break
10867 }
10868 c := auxIntToInt32(v_1.AuxInt)
10869 y := v_1.Args[0]
10870 v.reset(OpARMSUBshiftRL)
10871 v.AuxInt = int32ToAuxInt(c)
10872 v.AddArg2(x, y)
10873 return true
10874 }
10875
10876
10877 for {
10878 if v_0.Op != OpARMSRLconst {
10879 break
10880 }
10881 c := auxIntToInt32(v_0.AuxInt)
10882 y := v_0.Args[0]
10883 x := v_1
10884 v.reset(OpARMRSBshiftRL)
10885 v.AuxInt = int32ToAuxInt(c)
10886 v.AddArg2(x, y)
10887 return true
10888 }
10889
10890
10891 for {
10892 x := v_0
10893 if v_1.Op != OpARMSRAconst {
10894 break
10895 }
10896 c := auxIntToInt32(v_1.AuxInt)
10897 y := v_1.Args[0]
10898 v.reset(OpARMSUBshiftRA)
10899 v.AuxInt = int32ToAuxInt(c)
10900 v.AddArg2(x, y)
10901 return true
10902 }
10903
10904
10905 for {
10906 if v_0.Op != OpARMSRAconst {
10907 break
10908 }
10909 c := auxIntToInt32(v_0.AuxInt)
10910 y := v_0.Args[0]
10911 x := v_1
10912 v.reset(OpARMRSBshiftRA)
10913 v.AuxInt = int32ToAuxInt(c)
10914 v.AddArg2(x, y)
10915 return true
10916 }
10917
10918
10919 for {
10920 x := v_0
10921 if v_1.Op != OpARMSLL {
10922 break
10923 }
10924 z := v_1.Args[1]
10925 y := v_1.Args[0]
10926 v.reset(OpARMSUBshiftLLreg)
10927 v.AddArg3(x, y, z)
10928 return true
10929 }
10930
10931
10932 for {
10933 if v_0.Op != OpARMSLL {
10934 break
10935 }
10936 z := v_0.Args[1]
10937 y := v_0.Args[0]
10938 x := v_1
10939 v.reset(OpARMRSBshiftLLreg)
10940 v.AddArg3(x, y, z)
10941 return true
10942 }
10943
10944
10945 for {
10946 x := v_0
10947 if v_1.Op != OpARMSRL {
10948 break
10949 }
10950 z := v_1.Args[1]
10951 y := v_1.Args[0]
10952 v.reset(OpARMSUBshiftRLreg)
10953 v.AddArg3(x, y, z)
10954 return true
10955 }
10956
10957
10958 for {
10959 if v_0.Op != OpARMSRL {
10960 break
10961 }
10962 z := v_0.Args[1]
10963 y := v_0.Args[0]
10964 x := v_1
10965 v.reset(OpARMRSBshiftRLreg)
10966 v.AddArg3(x, y, z)
10967 return true
10968 }
10969
10970
10971 for {
10972 x := v_0
10973 if v_1.Op != OpARMSRA {
10974 break
10975 }
10976 z := v_1.Args[1]
10977 y := v_1.Args[0]
10978 v.reset(OpARMSUBshiftRAreg)
10979 v.AddArg3(x, y, z)
10980 return true
10981 }
10982
10983
10984 for {
10985 if v_0.Op != OpARMSRA {
10986 break
10987 }
10988 z := v_0.Args[1]
10989 y := v_0.Args[0]
10990 x := v_1
10991 v.reset(OpARMRSBshiftRAreg)
10992 v.AddArg3(x, y, z)
10993 return true
10994 }
10995
10996
10997 for {
10998 x := v_0
10999 if x != v_1 {
11000 break
11001 }
11002 v.reset(OpARMMOVWconst)
11003 v.AuxInt = int32ToAuxInt(0)
11004 return true
11005 }
11006
11007
11008
11009 for {
11010 a := v_0
11011 if v_1.Op != OpARMMUL {
11012 break
11013 }
11014 y := v_1.Args[1]
11015 x := v_1.Args[0]
11016 if !(buildcfg.GOARM.Version == 7) {
11017 break
11018 }
11019 v.reset(OpARMMULS)
11020 v.AddArg3(x, y, a)
11021 return true
11022 }
11023 return false
11024 }
11025 func rewriteValueARM_OpARMSUBD(v *Value) bool {
11026 v_1 := v.Args[1]
11027 v_0 := v.Args[0]
11028
11029
11030
11031 for {
11032 a := v_0
11033 if v_1.Op != OpARMMULD {
11034 break
11035 }
11036 y := v_1.Args[1]
11037 x := v_1.Args[0]
11038 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
11039 break
11040 }
11041 v.reset(OpARMMULSD)
11042 v.AddArg3(a, x, y)
11043 return true
11044 }
11045
11046
11047
11048 for {
11049 a := v_0
11050 if v_1.Op != OpARMNMULD {
11051 break
11052 }
11053 y := v_1.Args[1]
11054 x := v_1.Args[0]
11055 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
11056 break
11057 }
11058 v.reset(OpARMMULAD)
11059 v.AddArg3(a, x, y)
11060 return true
11061 }
11062 return false
11063 }
11064 func rewriteValueARM_OpARMSUBF(v *Value) bool {
11065 v_1 := v.Args[1]
11066 v_0 := v.Args[0]
11067
11068
11069
11070 for {
11071 a := v_0
11072 if v_1.Op != OpARMMULF {
11073 break
11074 }
11075 y := v_1.Args[1]
11076 x := v_1.Args[0]
11077 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
11078 break
11079 }
11080 v.reset(OpARMMULSF)
11081 v.AddArg3(a, x, y)
11082 return true
11083 }
11084
11085
11086
11087 for {
11088 a := v_0
11089 if v_1.Op != OpARMNMULF {
11090 break
11091 }
11092 y := v_1.Args[1]
11093 x := v_1.Args[0]
11094 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
11095 break
11096 }
11097 v.reset(OpARMMULAF)
11098 v.AddArg3(a, x, y)
11099 return true
11100 }
11101 return false
11102 }
11103 func rewriteValueARM_OpARMSUBS(v *Value) bool {
11104 v_1 := v.Args[1]
11105 v_0 := v.Args[0]
11106
11107
11108 for {
11109 x := v_0
11110 if v_1.Op != OpARMMOVWconst {
11111 break
11112 }
11113 c := auxIntToInt32(v_1.AuxInt)
11114 v.reset(OpARMSUBSconst)
11115 v.AuxInt = int32ToAuxInt(c)
11116 v.AddArg(x)
11117 return true
11118 }
11119
11120
11121 for {
11122 x := v_0
11123 if v_1.Op != OpARMSLLconst {
11124 break
11125 }
11126 c := auxIntToInt32(v_1.AuxInt)
11127 y := v_1.Args[0]
11128 v.reset(OpARMSUBSshiftLL)
11129 v.AuxInt = int32ToAuxInt(c)
11130 v.AddArg2(x, y)
11131 return true
11132 }
11133
11134
11135 for {
11136 if v_0.Op != OpARMSLLconst {
11137 break
11138 }
11139 c := auxIntToInt32(v_0.AuxInt)
11140 y := v_0.Args[0]
11141 x := v_1
11142 v.reset(OpARMRSBSshiftLL)
11143 v.AuxInt = int32ToAuxInt(c)
11144 v.AddArg2(x, y)
11145 return true
11146 }
11147
11148
11149 for {
11150 x := v_0
11151 if v_1.Op != OpARMSRLconst {
11152 break
11153 }
11154 c := auxIntToInt32(v_1.AuxInt)
11155 y := v_1.Args[0]
11156 v.reset(OpARMSUBSshiftRL)
11157 v.AuxInt = int32ToAuxInt(c)
11158 v.AddArg2(x, y)
11159 return true
11160 }
11161
11162
11163 for {
11164 if v_0.Op != OpARMSRLconst {
11165 break
11166 }
11167 c := auxIntToInt32(v_0.AuxInt)
11168 y := v_0.Args[0]
11169 x := v_1
11170 v.reset(OpARMRSBSshiftRL)
11171 v.AuxInt = int32ToAuxInt(c)
11172 v.AddArg2(x, y)
11173 return true
11174 }
11175
11176
11177 for {
11178 x := v_0
11179 if v_1.Op != OpARMSRAconst {
11180 break
11181 }
11182 c := auxIntToInt32(v_1.AuxInt)
11183 y := v_1.Args[0]
11184 v.reset(OpARMSUBSshiftRA)
11185 v.AuxInt = int32ToAuxInt(c)
11186 v.AddArg2(x, y)
11187 return true
11188 }
11189
11190
11191 for {
11192 if v_0.Op != OpARMSRAconst {
11193 break
11194 }
11195 c := auxIntToInt32(v_0.AuxInt)
11196 y := v_0.Args[0]
11197 x := v_1
11198 v.reset(OpARMRSBSshiftRA)
11199 v.AuxInt = int32ToAuxInt(c)
11200 v.AddArg2(x, y)
11201 return true
11202 }
11203
11204
11205 for {
11206 x := v_0
11207 if v_1.Op != OpARMSLL {
11208 break
11209 }
11210 z := v_1.Args[1]
11211 y := v_1.Args[0]
11212 v.reset(OpARMSUBSshiftLLreg)
11213 v.AddArg3(x, y, z)
11214 return true
11215 }
11216
11217
11218 for {
11219 if v_0.Op != OpARMSLL {
11220 break
11221 }
11222 z := v_0.Args[1]
11223 y := v_0.Args[0]
11224 x := v_1
11225 v.reset(OpARMRSBSshiftLLreg)
11226 v.AddArg3(x, y, z)
11227 return true
11228 }
11229
11230
11231 for {
11232 x := v_0
11233 if v_1.Op != OpARMSRL {
11234 break
11235 }
11236 z := v_1.Args[1]
11237 y := v_1.Args[0]
11238 v.reset(OpARMSUBSshiftRLreg)
11239 v.AddArg3(x, y, z)
11240 return true
11241 }
11242
11243
11244 for {
11245 if v_0.Op != OpARMSRL {
11246 break
11247 }
11248 z := v_0.Args[1]
11249 y := v_0.Args[0]
11250 x := v_1
11251 v.reset(OpARMRSBSshiftRLreg)
11252 v.AddArg3(x, y, z)
11253 return true
11254 }
11255
11256
11257 for {
11258 x := v_0
11259 if v_1.Op != OpARMSRA {
11260 break
11261 }
11262 z := v_1.Args[1]
11263 y := v_1.Args[0]
11264 v.reset(OpARMSUBSshiftRAreg)
11265 v.AddArg3(x, y, z)
11266 return true
11267 }
11268
11269
11270 for {
11271 if v_0.Op != OpARMSRA {
11272 break
11273 }
11274 z := v_0.Args[1]
11275 y := v_0.Args[0]
11276 x := v_1
11277 v.reset(OpARMRSBSshiftRAreg)
11278 v.AddArg3(x, y, z)
11279 return true
11280 }
11281 return false
11282 }
11283 func rewriteValueARM_OpARMSUBSshiftLL(v *Value) bool {
11284 v_1 := v.Args[1]
11285 v_0 := v.Args[0]
11286 b := v.Block
11287
11288
11289 for {
11290 d := auxIntToInt32(v.AuxInt)
11291 if v_0.Op != OpARMMOVWconst {
11292 break
11293 }
11294 c := auxIntToInt32(v_0.AuxInt)
11295 x := v_1
11296 v.reset(OpARMRSBSconst)
11297 v.AuxInt = int32ToAuxInt(c)
11298 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
11299 v0.AuxInt = int32ToAuxInt(d)
11300 v0.AddArg(x)
11301 v.AddArg(v0)
11302 return true
11303 }
11304
11305
11306 for {
11307 d := auxIntToInt32(v.AuxInt)
11308 x := v_0
11309 if v_1.Op != OpARMMOVWconst {
11310 break
11311 }
11312 c := auxIntToInt32(v_1.AuxInt)
11313 v.reset(OpARMSUBSconst)
11314 v.AuxInt = int32ToAuxInt(c << uint64(d))
11315 v.AddArg(x)
11316 return true
11317 }
11318 return false
11319 }
11320 func rewriteValueARM_OpARMSUBSshiftLLreg(v *Value) bool {
11321 v_2 := v.Args[2]
11322 v_1 := v.Args[1]
11323 v_0 := v.Args[0]
11324 b := v.Block
11325
11326
11327 for {
11328 if v_0.Op != OpARMMOVWconst {
11329 break
11330 }
11331 c := auxIntToInt32(v_0.AuxInt)
11332 x := v_1
11333 y := v_2
11334 v.reset(OpARMRSBSconst)
11335 v.AuxInt = int32ToAuxInt(c)
11336 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
11337 v0.AddArg2(x, y)
11338 v.AddArg(v0)
11339 return true
11340 }
11341
11342
11343
11344 for {
11345 x := v_0
11346 y := v_1
11347 if v_2.Op != OpARMMOVWconst {
11348 break
11349 }
11350 c := auxIntToInt32(v_2.AuxInt)
11351 if !(0 <= c && c < 32) {
11352 break
11353 }
11354 v.reset(OpARMSUBSshiftLL)
11355 v.AuxInt = int32ToAuxInt(c)
11356 v.AddArg2(x, y)
11357 return true
11358 }
11359 return false
11360 }
11361 func rewriteValueARM_OpARMSUBSshiftRA(v *Value) bool {
11362 v_1 := v.Args[1]
11363 v_0 := v.Args[0]
11364 b := v.Block
11365
11366
11367 for {
11368 d := auxIntToInt32(v.AuxInt)
11369 if v_0.Op != OpARMMOVWconst {
11370 break
11371 }
11372 c := auxIntToInt32(v_0.AuxInt)
11373 x := v_1
11374 v.reset(OpARMRSBSconst)
11375 v.AuxInt = int32ToAuxInt(c)
11376 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
11377 v0.AuxInt = int32ToAuxInt(d)
11378 v0.AddArg(x)
11379 v.AddArg(v0)
11380 return true
11381 }
11382
11383
11384 for {
11385 d := auxIntToInt32(v.AuxInt)
11386 x := v_0
11387 if v_1.Op != OpARMMOVWconst {
11388 break
11389 }
11390 c := auxIntToInt32(v_1.AuxInt)
11391 v.reset(OpARMSUBSconst)
11392 v.AuxInt = int32ToAuxInt(c >> uint64(d))
11393 v.AddArg(x)
11394 return true
11395 }
11396 return false
11397 }
11398 func rewriteValueARM_OpARMSUBSshiftRAreg(v *Value) bool {
11399 v_2 := v.Args[2]
11400 v_1 := v.Args[1]
11401 v_0 := v.Args[0]
11402 b := v.Block
11403
11404
11405 for {
11406 if v_0.Op != OpARMMOVWconst {
11407 break
11408 }
11409 c := auxIntToInt32(v_0.AuxInt)
11410 x := v_1
11411 y := v_2
11412 v.reset(OpARMRSBSconst)
11413 v.AuxInt = int32ToAuxInt(c)
11414 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
11415 v0.AddArg2(x, y)
11416 v.AddArg(v0)
11417 return true
11418 }
11419
11420
11421
11422 for {
11423 x := v_0
11424 y := v_1
11425 if v_2.Op != OpARMMOVWconst {
11426 break
11427 }
11428 c := auxIntToInt32(v_2.AuxInt)
11429 if !(0 <= c && c < 32) {
11430 break
11431 }
11432 v.reset(OpARMSUBSshiftRA)
11433 v.AuxInt = int32ToAuxInt(c)
11434 v.AddArg2(x, y)
11435 return true
11436 }
11437 return false
11438 }
11439 func rewriteValueARM_OpARMSUBSshiftRL(v *Value) bool {
11440 v_1 := v.Args[1]
11441 v_0 := v.Args[0]
11442 b := v.Block
11443
11444
11445 for {
11446 d := auxIntToInt32(v.AuxInt)
11447 if v_0.Op != OpARMMOVWconst {
11448 break
11449 }
11450 c := auxIntToInt32(v_0.AuxInt)
11451 x := v_1
11452 v.reset(OpARMRSBSconst)
11453 v.AuxInt = int32ToAuxInt(c)
11454 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
11455 v0.AuxInt = int32ToAuxInt(d)
11456 v0.AddArg(x)
11457 v.AddArg(v0)
11458 return true
11459 }
11460
11461
11462 for {
11463 d := auxIntToInt32(v.AuxInt)
11464 x := v_0
11465 if v_1.Op != OpARMMOVWconst {
11466 break
11467 }
11468 c := auxIntToInt32(v_1.AuxInt)
11469 v.reset(OpARMSUBSconst)
11470 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
11471 v.AddArg(x)
11472 return true
11473 }
11474 return false
11475 }
11476 func rewriteValueARM_OpARMSUBSshiftRLreg(v *Value) bool {
11477 v_2 := v.Args[2]
11478 v_1 := v.Args[1]
11479 v_0 := v.Args[0]
11480 b := v.Block
11481
11482
11483 for {
11484 if v_0.Op != OpARMMOVWconst {
11485 break
11486 }
11487 c := auxIntToInt32(v_0.AuxInt)
11488 x := v_1
11489 y := v_2
11490 v.reset(OpARMRSBSconst)
11491 v.AuxInt = int32ToAuxInt(c)
11492 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
11493 v0.AddArg2(x, y)
11494 v.AddArg(v0)
11495 return true
11496 }
11497
11498
11499
11500 for {
11501 x := v_0
11502 y := v_1
11503 if v_2.Op != OpARMMOVWconst {
11504 break
11505 }
11506 c := auxIntToInt32(v_2.AuxInt)
11507 if !(0 <= c && c < 32) {
11508 break
11509 }
11510 v.reset(OpARMSUBSshiftRL)
11511 v.AuxInt = int32ToAuxInt(c)
11512 v.AddArg2(x, y)
11513 return true
11514 }
11515 return false
11516 }
11517 func rewriteValueARM_OpARMSUBconst(v *Value) bool {
11518 v_0 := v.Args[0]
11519
11520
11521 for {
11522 off1 := auxIntToInt32(v.AuxInt)
11523 if v_0.Op != OpARMMOVWaddr {
11524 break
11525 }
11526 off2 := auxIntToInt32(v_0.AuxInt)
11527 sym := auxToSym(v_0.Aux)
11528 ptr := v_0.Args[0]
11529 v.reset(OpARMMOVWaddr)
11530 v.AuxInt = int32ToAuxInt(off2 - off1)
11531 v.Aux = symToAux(sym)
11532 v.AddArg(ptr)
11533 return true
11534 }
11535
11536
11537 for {
11538 if auxIntToInt32(v.AuxInt) != 0 {
11539 break
11540 }
11541 x := v_0
11542 v.copyOf(x)
11543 return true
11544 }
11545
11546
11547
11548 for {
11549 c := auxIntToInt32(v.AuxInt)
11550 x := v_0
11551 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) {
11552 break
11553 }
11554 v.reset(OpARMADDconst)
11555 v.AuxInt = int32ToAuxInt(-c)
11556 v.AddArg(x)
11557 return true
11558 }
11559
11560
11561
11562 for {
11563 c := auxIntToInt32(v.AuxInt)
11564 x := v_0
11565 if !(buildcfg.GOARM.Version == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && uint32(-c) <= 0xffff) {
11566 break
11567 }
11568 v.reset(OpARMADDconst)
11569 v.AuxInt = int32ToAuxInt(-c)
11570 v.AddArg(x)
11571 return true
11572 }
11573
11574
11575 for {
11576 c := auxIntToInt32(v.AuxInt)
11577 if v_0.Op != OpARMMOVWconst {
11578 break
11579 }
11580 d := auxIntToInt32(v_0.AuxInt)
11581 v.reset(OpARMMOVWconst)
11582 v.AuxInt = int32ToAuxInt(d - c)
11583 return true
11584 }
11585
11586
11587 for {
11588 c := auxIntToInt32(v.AuxInt)
11589 if v_0.Op != OpARMSUBconst {
11590 break
11591 }
11592 d := auxIntToInt32(v_0.AuxInt)
11593 x := v_0.Args[0]
11594 v.reset(OpARMADDconst)
11595 v.AuxInt = int32ToAuxInt(-c - d)
11596 v.AddArg(x)
11597 return true
11598 }
11599
11600
11601 for {
11602 c := auxIntToInt32(v.AuxInt)
11603 if v_0.Op != OpARMADDconst {
11604 break
11605 }
11606 d := auxIntToInt32(v_0.AuxInt)
11607 x := v_0.Args[0]
11608 v.reset(OpARMADDconst)
11609 v.AuxInt = int32ToAuxInt(-c + d)
11610 v.AddArg(x)
11611 return true
11612 }
11613
11614
11615 for {
11616 c := auxIntToInt32(v.AuxInt)
11617 if v_0.Op != OpARMRSBconst {
11618 break
11619 }
11620 d := auxIntToInt32(v_0.AuxInt)
11621 x := v_0.Args[0]
11622 v.reset(OpARMRSBconst)
11623 v.AuxInt = int32ToAuxInt(-c + d)
11624 v.AddArg(x)
11625 return true
11626 }
11627 return false
11628 }
11629 func rewriteValueARM_OpARMSUBshiftLL(v *Value) bool {
11630 v_1 := v.Args[1]
11631 v_0 := v.Args[0]
11632 b := v.Block
11633
11634
11635 for {
11636 d := auxIntToInt32(v.AuxInt)
11637 if v_0.Op != OpARMMOVWconst {
11638 break
11639 }
11640 c := auxIntToInt32(v_0.AuxInt)
11641 x := v_1
11642 v.reset(OpARMRSBconst)
11643 v.AuxInt = int32ToAuxInt(c)
11644 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
11645 v0.AuxInt = int32ToAuxInt(d)
11646 v0.AddArg(x)
11647 v.AddArg(v0)
11648 return true
11649 }
11650
11651
11652 for {
11653 d := auxIntToInt32(v.AuxInt)
11654 x := v_0
11655 if v_1.Op != OpARMMOVWconst {
11656 break
11657 }
11658 c := auxIntToInt32(v_1.AuxInt)
11659 v.reset(OpARMSUBconst)
11660 v.AuxInt = int32ToAuxInt(c << uint64(d))
11661 v.AddArg(x)
11662 return true
11663 }
11664
11665
11666 for {
11667 c := auxIntToInt32(v.AuxInt)
11668 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c {
11669 break
11670 }
11671 x := v_0.Args[0]
11672 if x != v_1 {
11673 break
11674 }
11675 v.reset(OpARMMOVWconst)
11676 v.AuxInt = int32ToAuxInt(0)
11677 return true
11678 }
11679 return false
11680 }
11681 func rewriteValueARM_OpARMSUBshiftLLreg(v *Value) bool {
11682 v_2 := v.Args[2]
11683 v_1 := v.Args[1]
11684 v_0 := v.Args[0]
11685 b := v.Block
11686
11687
11688 for {
11689 if v_0.Op != OpARMMOVWconst {
11690 break
11691 }
11692 c := auxIntToInt32(v_0.AuxInt)
11693 x := v_1
11694 y := v_2
11695 v.reset(OpARMRSBconst)
11696 v.AuxInt = int32ToAuxInt(c)
11697 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
11698 v0.AddArg2(x, y)
11699 v.AddArg(v0)
11700 return true
11701 }
11702
11703
11704
11705 for {
11706 x := v_0
11707 y := v_1
11708 if v_2.Op != OpARMMOVWconst {
11709 break
11710 }
11711 c := auxIntToInt32(v_2.AuxInt)
11712 if !(0 <= c && c < 32) {
11713 break
11714 }
11715 v.reset(OpARMSUBshiftLL)
11716 v.AuxInt = int32ToAuxInt(c)
11717 v.AddArg2(x, y)
11718 return true
11719 }
11720 return false
11721 }
11722 func rewriteValueARM_OpARMSUBshiftRA(v *Value) bool {
11723 v_1 := v.Args[1]
11724 v_0 := v.Args[0]
11725 b := v.Block
11726
11727
11728 for {
11729 d := auxIntToInt32(v.AuxInt)
11730 if v_0.Op != OpARMMOVWconst {
11731 break
11732 }
11733 c := auxIntToInt32(v_0.AuxInt)
11734 x := v_1
11735 v.reset(OpARMRSBconst)
11736 v.AuxInt = int32ToAuxInt(c)
11737 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
11738 v0.AuxInt = int32ToAuxInt(d)
11739 v0.AddArg(x)
11740 v.AddArg(v0)
11741 return true
11742 }
11743
11744
11745 for {
11746 d := auxIntToInt32(v.AuxInt)
11747 x := v_0
11748 if v_1.Op != OpARMMOVWconst {
11749 break
11750 }
11751 c := auxIntToInt32(v_1.AuxInt)
11752 v.reset(OpARMSUBconst)
11753 v.AuxInt = int32ToAuxInt(c >> uint64(d))
11754 v.AddArg(x)
11755 return true
11756 }
11757
11758
11759 for {
11760 c := auxIntToInt32(v.AuxInt)
11761 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c {
11762 break
11763 }
11764 x := v_0.Args[0]
11765 if x != v_1 {
11766 break
11767 }
11768 v.reset(OpARMMOVWconst)
11769 v.AuxInt = int32ToAuxInt(0)
11770 return true
11771 }
11772 return false
11773 }
11774 func rewriteValueARM_OpARMSUBshiftRAreg(v *Value) bool {
11775 v_2 := v.Args[2]
11776 v_1 := v.Args[1]
11777 v_0 := v.Args[0]
11778 b := v.Block
11779
11780
11781 for {
11782 if v_0.Op != OpARMMOVWconst {
11783 break
11784 }
11785 c := auxIntToInt32(v_0.AuxInt)
11786 x := v_1
11787 y := v_2
11788 v.reset(OpARMRSBconst)
11789 v.AuxInt = int32ToAuxInt(c)
11790 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
11791 v0.AddArg2(x, y)
11792 v.AddArg(v0)
11793 return true
11794 }
11795
11796
11797
11798 for {
11799 x := v_0
11800 y := v_1
11801 if v_2.Op != OpARMMOVWconst {
11802 break
11803 }
11804 c := auxIntToInt32(v_2.AuxInt)
11805 if !(0 <= c && c < 32) {
11806 break
11807 }
11808 v.reset(OpARMSUBshiftRA)
11809 v.AuxInt = int32ToAuxInt(c)
11810 v.AddArg2(x, y)
11811 return true
11812 }
11813 return false
11814 }
11815 func rewriteValueARM_OpARMSUBshiftRL(v *Value) bool {
11816 v_1 := v.Args[1]
11817 v_0 := v.Args[0]
11818 b := v.Block
11819
11820
11821 for {
11822 d := auxIntToInt32(v.AuxInt)
11823 if v_0.Op != OpARMMOVWconst {
11824 break
11825 }
11826 c := auxIntToInt32(v_0.AuxInt)
11827 x := v_1
11828 v.reset(OpARMRSBconst)
11829 v.AuxInt = int32ToAuxInt(c)
11830 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
11831 v0.AuxInt = int32ToAuxInt(d)
11832 v0.AddArg(x)
11833 v.AddArg(v0)
11834 return true
11835 }
11836
11837
11838 for {
11839 d := auxIntToInt32(v.AuxInt)
11840 x := v_0
11841 if v_1.Op != OpARMMOVWconst {
11842 break
11843 }
11844 c := auxIntToInt32(v_1.AuxInt)
11845 v.reset(OpARMSUBconst)
11846 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
11847 v.AddArg(x)
11848 return true
11849 }
11850
11851
11852 for {
11853 c := auxIntToInt32(v.AuxInt)
11854 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c {
11855 break
11856 }
11857 x := v_0.Args[0]
11858 if x != v_1 {
11859 break
11860 }
11861 v.reset(OpARMMOVWconst)
11862 v.AuxInt = int32ToAuxInt(0)
11863 return true
11864 }
11865 return false
11866 }
11867 func rewriteValueARM_OpARMSUBshiftRLreg(v *Value) bool {
11868 v_2 := v.Args[2]
11869 v_1 := v.Args[1]
11870 v_0 := v.Args[0]
11871 b := v.Block
11872
11873
11874 for {
11875 if v_0.Op != OpARMMOVWconst {
11876 break
11877 }
11878 c := auxIntToInt32(v_0.AuxInt)
11879 x := v_1
11880 y := v_2
11881 v.reset(OpARMRSBconst)
11882 v.AuxInt = int32ToAuxInt(c)
11883 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
11884 v0.AddArg2(x, y)
11885 v.AddArg(v0)
11886 return true
11887 }
11888
11889
11890
11891 for {
11892 x := v_0
11893 y := v_1
11894 if v_2.Op != OpARMMOVWconst {
11895 break
11896 }
11897 c := auxIntToInt32(v_2.AuxInt)
11898 if !(0 <= c && c < 32) {
11899 break
11900 }
11901 v.reset(OpARMSUBshiftRL)
11902 v.AuxInt = int32ToAuxInt(c)
11903 v.AddArg2(x, y)
11904 return true
11905 }
11906 return false
11907 }
11908 func rewriteValueARM_OpARMTEQ(v *Value) bool {
11909 v_1 := v.Args[1]
11910 v_0 := v.Args[0]
11911
11912
11913 for {
11914 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11915 x := v_0
11916 if v_1.Op != OpARMMOVWconst {
11917 continue
11918 }
11919 c := auxIntToInt32(v_1.AuxInt)
11920 v.reset(OpARMTEQconst)
11921 v.AuxInt = int32ToAuxInt(c)
11922 v.AddArg(x)
11923 return true
11924 }
11925 break
11926 }
11927
11928
11929 for {
11930 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11931 x := v_0
11932 if v_1.Op != OpARMSLLconst {
11933 continue
11934 }
11935 c := auxIntToInt32(v_1.AuxInt)
11936 y := v_1.Args[0]
11937 v.reset(OpARMTEQshiftLL)
11938 v.AuxInt = int32ToAuxInt(c)
11939 v.AddArg2(x, y)
11940 return true
11941 }
11942 break
11943 }
11944
11945
11946 for {
11947 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11948 x := v_0
11949 if v_1.Op != OpARMSRLconst {
11950 continue
11951 }
11952 c := auxIntToInt32(v_1.AuxInt)
11953 y := v_1.Args[0]
11954 v.reset(OpARMTEQshiftRL)
11955 v.AuxInt = int32ToAuxInt(c)
11956 v.AddArg2(x, y)
11957 return true
11958 }
11959 break
11960 }
11961
11962
11963 for {
11964 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11965 x := v_0
11966 if v_1.Op != OpARMSRAconst {
11967 continue
11968 }
11969 c := auxIntToInt32(v_1.AuxInt)
11970 y := v_1.Args[0]
11971 v.reset(OpARMTEQshiftRA)
11972 v.AuxInt = int32ToAuxInt(c)
11973 v.AddArg2(x, y)
11974 return true
11975 }
11976 break
11977 }
11978
11979
11980 for {
11981 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11982 x := v_0
11983 if v_1.Op != OpARMSLL {
11984 continue
11985 }
11986 z := v_1.Args[1]
11987 y := v_1.Args[0]
11988 v.reset(OpARMTEQshiftLLreg)
11989 v.AddArg3(x, y, z)
11990 return true
11991 }
11992 break
11993 }
11994
11995
11996 for {
11997 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11998 x := v_0
11999 if v_1.Op != OpARMSRL {
12000 continue
12001 }
12002 z := v_1.Args[1]
12003 y := v_1.Args[0]
12004 v.reset(OpARMTEQshiftRLreg)
12005 v.AddArg3(x, y, z)
12006 return true
12007 }
12008 break
12009 }
12010
12011
12012 for {
12013 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12014 x := v_0
12015 if v_1.Op != OpARMSRA {
12016 continue
12017 }
12018 z := v_1.Args[1]
12019 y := v_1.Args[0]
12020 v.reset(OpARMTEQshiftRAreg)
12021 v.AddArg3(x, y, z)
12022 return true
12023 }
12024 break
12025 }
12026 return false
12027 }
12028 func rewriteValueARM_OpARMTEQconst(v *Value) bool {
12029 v_0 := v.Args[0]
12030
12031
12032 for {
12033 y := auxIntToInt32(v.AuxInt)
12034 if v_0.Op != OpARMMOVWconst {
12035 break
12036 }
12037 x := auxIntToInt32(v_0.AuxInt)
12038 v.reset(OpARMFlagConstant)
12039 v.AuxInt = flagConstantToAuxInt(logicFlags32(x ^ y))
12040 return true
12041 }
12042 return false
12043 }
12044 func rewriteValueARM_OpARMTEQshiftLL(v *Value) bool {
12045 v_1 := v.Args[1]
12046 v_0 := v.Args[0]
12047 b := v.Block
12048
12049
12050 for {
12051 d := auxIntToInt32(v.AuxInt)
12052 if v_0.Op != OpARMMOVWconst {
12053 break
12054 }
12055 c := auxIntToInt32(v_0.AuxInt)
12056 x := v_1
12057 v.reset(OpARMTEQconst)
12058 v.AuxInt = int32ToAuxInt(c)
12059 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
12060 v0.AuxInt = int32ToAuxInt(d)
12061 v0.AddArg(x)
12062 v.AddArg(v0)
12063 return true
12064 }
12065
12066
12067 for {
12068 d := auxIntToInt32(v.AuxInt)
12069 x := v_0
12070 if v_1.Op != OpARMMOVWconst {
12071 break
12072 }
12073 c := auxIntToInt32(v_1.AuxInt)
12074 v.reset(OpARMTEQconst)
12075 v.AuxInt = int32ToAuxInt(c << uint64(d))
12076 v.AddArg(x)
12077 return true
12078 }
12079 return false
12080 }
12081 func rewriteValueARM_OpARMTEQshiftLLreg(v *Value) bool {
12082 v_2 := v.Args[2]
12083 v_1 := v.Args[1]
12084 v_0 := v.Args[0]
12085 b := v.Block
12086
12087
12088 for {
12089 if v_0.Op != OpARMMOVWconst {
12090 break
12091 }
12092 c := auxIntToInt32(v_0.AuxInt)
12093 x := v_1
12094 y := v_2
12095 v.reset(OpARMTEQconst)
12096 v.AuxInt = int32ToAuxInt(c)
12097 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
12098 v0.AddArg2(x, y)
12099 v.AddArg(v0)
12100 return true
12101 }
12102
12103
12104
12105 for {
12106 x := v_0
12107 y := v_1
12108 if v_2.Op != OpARMMOVWconst {
12109 break
12110 }
12111 c := auxIntToInt32(v_2.AuxInt)
12112 if !(0 <= c && c < 32) {
12113 break
12114 }
12115 v.reset(OpARMTEQshiftLL)
12116 v.AuxInt = int32ToAuxInt(c)
12117 v.AddArg2(x, y)
12118 return true
12119 }
12120 return false
12121 }
12122 func rewriteValueARM_OpARMTEQshiftRA(v *Value) bool {
12123 v_1 := v.Args[1]
12124 v_0 := v.Args[0]
12125 b := v.Block
12126
12127
12128 for {
12129 d := auxIntToInt32(v.AuxInt)
12130 if v_0.Op != OpARMMOVWconst {
12131 break
12132 }
12133 c := auxIntToInt32(v_0.AuxInt)
12134 x := v_1
12135 v.reset(OpARMTEQconst)
12136 v.AuxInt = int32ToAuxInt(c)
12137 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
12138 v0.AuxInt = int32ToAuxInt(d)
12139 v0.AddArg(x)
12140 v.AddArg(v0)
12141 return true
12142 }
12143
12144
12145 for {
12146 d := auxIntToInt32(v.AuxInt)
12147 x := v_0
12148 if v_1.Op != OpARMMOVWconst {
12149 break
12150 }
12151 c := auxIntToInt32(v_1.AuxInt)
12152 v.reset(OpARMTEQconst)
12153 v.AuxInt = int32ToAuxInt(c >> uint64(d))
12154 v.AddArg(x)
12155 return true
12156 }
12157 return false
12158 }
12159 func rewriteValueARM_OpARMTEQshiftRAreg(v *Value) bool {
12160 v_2 := v.Args[2]
12161 v_1 := v.Args[1]
12162 v_0 := v.Args[0]
12163 b := v.Block
12164
12165
12166 for {
12167 if v_0.Op != OpARMMOVWconst {
12168 break
12169 }
12170 c := auxIntToInt32(v_0.AuxInt)
12171 x := v_1
12172 y := v_2
12173 v.reset(OpARMTEQconst)
12174 v.AuxInt = int32ToAuxInt(c)
12175 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
12176 v0.AddArg2(x, y)
12177 v.AddArg(v0)
12178 return true
12179 }
12180
12181
12182
12183 for {
12184 x := v_0
12185 y := v_1
12186 if v_2.Op != OpARMMOVWconst {
12187 break
12188 }
12189 c := auxIntToInt32(v_2.AuxInt)
12190 if !(0 <= c && c < 32) {
12191 break
12192 }
12193 v.reset(OpARMTEQshiftRA)
12194 v.AuxInt = int32ToAuxInt(c)
12195 v.AddArg2(x, y)
12196 return true
12197 }
12198 return false
12199 }
12200 func rewriteValueARM_OpARMTEQshiftRL(v *Value) bool {
12201 v_1 := v.Args[1]
12202 v_0 := v.Args[0]
12203 b := v.Block
12204
12205
12206 for {
12207 d := auxIntToInt32(v.AuxInt)
12208 if v_0.Op != OpARMMOVWconst {
12209 break
12210 }
12211 c := auxIntToInt32(v_0.AuxInt)
12212 x := v_1
12213 v.reset(OpARMTEQconst)
12214 v.AuxInt = int32ToAuxInt(c)
12215 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
12216 v0.AuxInt = int32ToAuxInt(d)
12217 v0.AddArg(x)
12218 v.AddArg(v0)
12219 return true
12220 }
12221
12222
12223 for {
12224 d := auxIntToInt32(v.AuxInt)
12225 x := v_0
12226 if v_1.Op != OpARMMOVWconst {
12227 break
12228 }
12229 c := auxIntToInt32(v_1.AuxInt)
12230 v.reset(OpARMTEQconst)
12231 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
12232 v.AddArg(x)
12233 return true
12234 }
12235 return false
12236 }
12237 func rewriteValueARM_OpARMTEQshiftRLreg(v *Value) bool {
12238 v_2 := v.Args[2]
12239 v_1 := v.Args[1]
12240 v_0 := v.Args[0]
12241 b := v.Block
12242
12243
12244 for {
12245 if v_0.Op != OpARMMOVWconst {
12246 break
12247 }
12248 c := auxIntToInt32(v_0.AuxInt)
12249 x := v_1
12250 y := v_2
12251 v.reset(OpARMTEQconst)
12252 v.AuxInt = int32ToAuxInt(c)
12253 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
12254 v0.AddArg2(x, y)
12255 v.AddArg(v0)
12256 return true
12257 }
12258
12259
12260
12261 for {
12262 x := v_0
12263 y := v_1
12264 if v_2.Op != OpARMMOVWconst {
12265 break
12266 }
12267 c := auxIntToInt32(v_2.AuxInt)
12268 if !(0 <= c && c < 32) {
12269 break
12270 }
12271 v.reset(OpARMTEQshiftRL)
12272 v.AuxInt = int32ToAuxInt(c)
12273 v.AddArg2(x, y)
12274 return true
12275 }
12276 return false
12277 }
12278 func rewriteValueARM_OpARMTST(v *Value) bool {
12279 v_1 := v.Args[1]
12280 v_0 := v.Args[0]
12281
12282
12283 for {
12284 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12285 x := v_0
12286 if v_1.Op != OpARMMOVWconst {
12287 continue
12288 }
12289 c := auxIntToInt32(v_1.AuxInt)
12290 v.reset(OpARMTSTconst)
12291 v.AuxInt = int32ToAuxInt(c)
12292 v.AddArg(x)
12293 return true
12294 }
12295 break
12296 }
12297
12298
12299 for {
12300 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12301 x := v_0
12302 if v_1.Op != OpARMSLLconst {
12303 continue
12304 }
12305 c := auxIntToInt32(v_1.AuxInt)
12306 y := v_1.Args[0]
12307 v.reset(OpARMTSTshiftLL)
12308 v.AuxInt = int32ToAuxInt(c)
12309 v.AddArg2(x, y)
12310 return true
12311 }
12312 break
12313 }
12314
12315
12316 for {
12317 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12318 x := v_0
12319 if v_1.Op != OpARMSRLconst {
12320 continue
12321 }
12322 c := auxIntToInt32(v_1.AuxInt)
12323 y := v_1.Args[0]
12324 v.reset(OpARMTSTshiftRL)
12325 v.AuxInt = int32ToAuxInt(c)
12326 v.AddArg2(x, y)
12327 return true
12328 }
12329 break
12330 }
12331
12332
12333 for {
12334 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12335 x := v_0
12336 if v_1.Op != OpARMSRAconst {
12337 continue
12338 }
12339 c := auxIntToInt32(v_1.AuxInt)
12340 y := v_1.Args[0]
12341 v.reset(OpARMTSTshiftRA)
12342 v.AuxInt = int32ToAuxInt(c)
12343 v.AddArg2(x, y)
12344 return true
12345 }
12346 break
12347 }
12348
12349
12350 for {
12351 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12352 x := v_0
12353 if v_1.Op != OpARMSLL {
12354 continue
12355 }
12356 z := v_1.Args[1]
12357 y := v_1.Args[0]
12358 v.reset(OpARMTSTshiftLLreg)
12359 v.AddArg3(x, y, z)
12360 return true
12361 }
12362 break
12363 }
12364
12365
12366 for {
12367 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12368 x := v_0
12369 if v_1.Op != OpARMSRL {
12370 continue
12371 }
12372 z := v_1.Args[1]
12373 y := v_1.Args[0]
12374 v.reset(OpARMTSTshiftRLreg)
12375 v.AddArg3(x, y, z)
12376 return true
12377 }
12378 break
12379 }
12380
12381
12382 for {
12383 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12384 x := v_0
12385 if v_1.Op != OpARMSRA {
12386 continue
12387 }
12388 z := v_1.Args[1]
12389 y := v_1.Args[0]
12390 v.reset(OpARMTSTshiftRAreg)
12391 v.AddArg3(x, y, z)
12392 return true
12393 }
12394 break
12395 }
12396 return false
12397 }
12398 func rewriteValueARM_OpARMTSTconst(v *Value) bool {
12399 v_0 := v.Args[0]
12400
12401
12402 for {
12403 y := auxIntToInt32(v.AuxInt)
12404 if v_0.Op != OpARMMOVWconst {
12405 break
12406 }
12407 x := auxIntToInt32(v_0.AuxInt)
12408 v.reset(OpARMFlagConstant)
12409 v.AuxInt = flagConstantToAuxInt(logicFlags32(x & y))
12410 return true
12411 }
12412 return false
12413 }
12414 func rewriteValueARM_OpARMTSTshiftLL(v *Value) bool {
12415 v_1 := v.Args[1]
12416 v_0 := v.Args[0]
12417 b := v.Block
12418
12419
12420 for {
12421 d := auxIntToInt32(v.AuxInt)
12422 if v_0.Op != OpARMMOVWconst {
12423 break
12424 }
12425 c := auxIntToInt32(v_0.AuxInt)
12426 x := v_1
12427 v.reset(OpARMTSTconst)
12428 v.AuxInt = int32ToAuxInt(c)
12429 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
12430 v0.AuxInt = int32ToAuxInt(d)
12431 v0.AddArg(x)
12432 v.AddArg(v0)
12433 return true
12434 }
12435
12436
12437 for {
12438 d := auxIntToInt32(v.AuxInt)
12439 x := v_0
12440 if v_1.Op != OpARMMOVWconst {
12441 break
12442 }
12443 c := auxIntToInt32(v_1.AuxInt)
12444 v.reset(OpARMTSTconst)
12445 v.AuxInt = int32ToAuxInt(c << uint64(d))
12446 v.AddArg(x)
12447 return true
12448 }
12449 return false
12450 }
12451 func rewriteValueARM_OpARMTSTshiftLLreg(v *Value) bool {
12452 v_2 := v.Args[2]
12453 v_1 := v.Args[1]
12454 v_0 := v.Args[0]
12455 b := v.Block
12456
12457
12458 for {
12459 if v_0.Op != OpARMMOVWconst {
12460 break
12461 }
12462 c := auxIntToInt32(v_0.AuxInt)
12463 x := v_1
12464 y := v_2
12465 v.reset(OpARMTSTconst)
12466 v.AuxInt = int32ToAuxInt(c)
12467 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
12468 v0.AddArg2(x, y)
12469 v.AddArg(v0)
12470 return true
12471 }
12472
12473
12474
12475 for {
12476 x := v_0
12477 y := v_1
12478 if v_2.Op != OpARMMOVWconst {
12479 break
12480 }
12481 c := auxIntToInt32(v_2.AuxInt)
12482 if !(0 <= c && c < 32) {
12483 break
12484 }
12485 v.reset(OpARMTSTshiftLL)
12486 v.AuxInt = int32ToAuxInt(c)
12487 v.AddArg2(x, y)
12488 return true
12489 }
12490 return false
12491 }
12492 func rewriteValueARM_OpARMTSTshiftRA(v *Value) bool {
12493 v_1 := v.Args[1]
12494 v_0 := v.Args[0]
12495 b := v.Block
12496
12497
12498 for {
12499 d := auxIntToInt32(v.AuxInt)
12500 if v_0.Op != OpARMMOVWconst {
12501 break
12502 }
12503 c := auxIntToInt32(v_0.AuxInt)
12504 x := v_1
12505 v.reset(OpARMTSTconst)
12506 v.AuxInt = int32ToAuxInt(c)
12507 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
12508 v0.AuxInt = int32ToAuxInt(d)
12509 v0.AddArg(x)
12510 v.AddArg(v0)
12511 return true
12512 }
12513
12514
12515 for {
12516 d := auxIntToInt32(v.AuxInt)
12517 x := v_0
12518 if v_1.Op != OpARMMOVWconst {
12519 break
12520 }
12521 c := auxIntToInt32(v_1.AuxInt)
12522 v.reset(OpARMTSTconst)
12523 v.AuxInt = int32ToAuxInt(c >> uint64(d))
12524 v.AddArg(x)
12525 return true
12526 }
12527 return false
12528 }
12529 func rewriteValueARM_OpARMTSTshiftRAreg(v *Value) bool {
12530 v_2 := v.Args[2]
12531 v_1 := v.Args[1]
12532 v_0 := v.Args[0]
12533 b := v.Block
12534
12535
12536 for {
12537 if v_0.Op != OpARMMOVWconst {
12538 break
12539 }
12540 c := auxIntToInt32(v_0.AuxInt)
12541 x := v_1
12542 y := v_2
12543 v.reset(OpARMTSTconst)
12544 v.AuxInt = int32ToAuxInt(c)
12545 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
12546 v0.AddArg2(x, y)
12547 v.AddArg(v0)
12548 return true
12549 }
12550
12551
12552
12553 for {
12554 x := v_0
12555 y := v_1
12556 if v_2.Op != OpARMMOVWconst {
12557 break
12558 }
12559 c := auxIntToInt32(v_2.AuxInt)
12560 if !(0 <= c && c < 32) {
12561 break
12562 }
12563 v.reset(OpARMTSTshiftRA)
12564 v.AuxInt = int32ToAuxInt(c)
12565 v.AddArg2(x, y)
12566 return true
12567 }
12568 return false
12569 }
12570 func rewriteValueARM_OpARMTSTshiftRL(v *Value) bool {
12571 v_1 := v.Args[1]
12572 v_0 := v.Args[0]
12573 b := v.Block
12574
12575
12576 for {
12577 d := auxIntToInt32(v.AuxInt)
12578 if v_0.Op != OpARMMOVWconst {
12579 break
12580 }
12581 c := auxIntToInt32(v_0.AuxInt)
12582 x := v_1
12583 v.reset(OpARMTSTconst)
12584 v.AuxInt = int32ToAuxInt(c)
12585 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
12586 v0.AuxInt = int32ToAuxInt(d)
12587 v0.AddArg(x)
12588 v.AddArg(v0)
12589 return true
12590 }
12591
12592
12593 for {
12594 d := auxIntToInt32(v.AuxInt)
12595 x := v_0
12596 if v_1.Op != OpARMMOVWconst {
12597 break
12598 }
12599 c := auxIntToInt32(v_1.AuxInt)
12600 v.reset(OpARMTSTconst)
12601 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
12602 v.AddArg(x)
12603 return true
12604 }
12605 return false
12606 }
12607 func rewriteValueARM_OpARMTSTshiftRLreg(v *Value) bool {
12608 v_2 := v.Args[2]
12609 v_1 := v.Args[1]
12610 v_0 := v.Args[0]
12611 b := v.Block
12612
12613
12614 for {
12615 if v_0.Op != OpARMMOVWconst {
12616 break
12617 }
12618 c := auxIntToInt32(v_0.AuxInt)
12619 x := v_1
12620 y := v_2
12621 v.reset(OpARMTSTconst)
12622 v.AuxInt = int32ToAuxInt(c)
12623 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
12624 v0.AddArg2(x, y)
12625 v.AddArg(v0)
12626 return true
12627 }
12628
12629
12630
12631 for {
12632 x := v_0
12633 y := v_1
12634 if v_2.Op != OpARMMOVWconst {
12635 break
12636 }
12637 c := auxIntToInt32(v_2.AuxInt)
12638 if !(0 <= c && c < 32) {
12639 break
12640 }
12641 v.reset(OpARMTSTshiftRL)
12642 v.AuxInt = int32ToAuxInt(c)
12643 v.AddArg2(x, y)
12644 return true
12645 }
12646 return false
12647 }
12648 func rewriteValueARM_OpARMXOR(v *Value) bool {
12649 v_1 := v.Args[1]
12650 v_0 := v.Args[0]
12651
12652
12653 for {
12654 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12655 x := v_0
12656 if v_1.Op != OpARMMOVWconst {
12657 continue
12658 }
12659 c := auxIntToInt32(v_1.AuxInt)
12660 v.reset(OpARMXORconst)
12661 v.AuxInt = int32ToAuxInt(c)
12662 v.AddArg(x)
12663 return true
12664 }
12665 break
12666 }
12667
12668
12669 for {
12670 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12671 x := v_0
12672 if v_1.Op != OpARMSLLconst {
12673 continue
12674 }
12675 c := auxIntToInt32(v_1.AuxInt)
12676 y := v_1.Args[0]
12677 v.reset(OpARMXORshiftLL)
12678 v.AuxInt = int32ToAuxInt(c)
12679 v.AddArg2(x, y)
12680 return true
12681 }
12682 break
12683 }
12684
12685
12686 for {
12687 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12688 x := v_0
12689 if v_1.Op != OpARMSRLconst {
12690 continue
12691 }
12692 c := auxIntToInt32(v_1.AuxInt)
12693 y := v_1.Args[0]
12694 v.reset(OpARMXORshiftRL)
12695 v.AuxInt = int32ToAuxInt(c)
12696 v.AddArg2(x, y)
12697 return true
12698 }
12699 break
12700 }
12701
12702
12703 for {
12704 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12705 x := v_0
12706 if v_1.Op != OpARMSRAconst {
12707 continue
12708 }
12709 c := auxIntToInt32(v_1.AuxInt)
12710 y := v_1.Args[0]
12711 v.reset(OpARMXORshiftRA)
12712 v.AuxInt = int32ToAuxInt(c)
12713 v.AddArg2(x, y)
12714 return true
12715 }
12716 break
12717 }
12718
12719
12720 for {
12721 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12722 x := v_0
12723 if v_1.Op != OpARMSRRconst {
12724 continue
12725 }
12726 c := auxIntToInt32(v_1.AuxInt)
12727 y := v_1.Args[0]
12728 v.reset(OpARMXORshiftRR)
12729 v.AuxInt = int32ToAuxInt(c)
12730 v.AddArg2(x, y)
12731 return true
12732 }
12733 break
12734 }
12735
12736
12737 for {
12738 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12739 x := v_0
12740 if v_1.Op != OpARMSLL {
12741 continue
12742 }
12743 z := v_1.Args[1]
12744 y := v_1.Args[0]
12745 v.reset(OpARMXORshiftLLreg)
12746 v.AddArg3(x, y, z)
12747 return true
12748 }
12749 break
12750 }
12751
12752
12753 for {
12754 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12755 x := v_0
12756 if v_1.Op != OpARMSRL {
12757 continue
12758 }
12759 z := v_1.Args[1]
12760 y := v_1.Args[0]
12761 v.reset(OpARMXORshiftRLreg)
12762 v.AddArg3(x, y, z)
12763 return true
12764 }
12765 break
12766 }
12767
12768
12769 for {
12770 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12771 x := v_0
12772 if v_1.Op != OpARMSRA {
12773 continue
12774 }
12775 z := v_1.Args[1]
12776 y := v_1.Args[0]
12777 v.reset(OpARMXORshiftRAreg)
12778 v.AddArg3(x, y, z)
12779 return true
12780 }
12781 break
12782 }
12783
12784
12785 for {
12786 x := v_0
12787 if x != v_1 {
12788 break
12789 }
12790 v.reset(OpARMMOVWconst)
12791 v.AuxInt = int32ToAuxInt(0)
12792 return true
12793 }
12794 return false
12795 }
12796 func rewriteValueARM_OpARMXORconst(v *Value) bool {
12797 v_0 := v.Args[0]
12798
12799
12800 for {
12801 if auxIntToInt32(v.AuxInt) != 0 {
12802 break
12803 }
12804 x := v_0
12805 v.copyOf(x)
12806 return true
12807 }
12808
12809
12810 for {
12811 c := auxIntToInt32(v.AuxInt)
12812 if v_0.Op != OpARMMOVWconst {
12813 break
12814 }
12815 d := auxIntToInt32(v_0.AuxInt)
12816 v.reset(OpARMMOVWconst)
12817 v.AuxInt = int32ToAuxInt(c ^ d)
12818 return true
12819 }
12820
12821
12822 for {
12823 c := auxIntToInt32(v.AuxInt)
12824 if v_0.Op != OpARMXORconst {
12825 break
12826 }
12827 d := auxIntToInt32(v_0.AuxInt)
12828 x := v_0.Args[0]
12829 v.reset(OpARMXORconst)
12830 v.AuxInt = int32ToAuxInt(c ^ d)
12831 v.AddArg(x)
12832 return true
12833 }
12834 return false
12835 }
12836 func rewriteValueARM_OpARMXORshiftLL(v *Value) bool {
12837 v_1 := v.Args[1]
12838 v_0 := v.Args[0]
12839 b := v.Block
12840 typ := &b.Func.Config.Types
12841
12842
12843 for {
12844 d := auxIntToInt32(v.AuxInt)
12845 if v_0.Op != OpARMMOVWconst {
12846 break
12847 }
12848 c := auxIntToInt32(v_0.AuxInt)
12849 x := v_1
12850 v.reset(OpARMXORconst)
12851 v.AuxInt = int32ToAuxInt(c)
12852 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
12853 v0.AuxInt = int32ToAuxInt(d)
12854 v0.AddArg(x)
12855 v.AddArg(v0)
12856 return true
12857 }
12858
12859
12860 for {
12861 d := auxIntToInt32(v.AuxInt)
12862 x := v_0
12863 if v_1.Op != OpARMMOVWconst {
12864 break
12865 }
12866 c := auxIntToInt32(v_1.AuxInt)
12867 v.reset(OpARMXORconst)
12868 v.AuxInt = int32ToAuxInt(c << uint64(d))
12869 v.AddArg(x)
12870 return true
12871 }
12872
12873
12874 for {
12875 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)) {
12876 break
12877 }
12878 x := v_0.Args[0]
12879 if x != v_1 {
12880 break
12881 }
12882 v.reset(OpARMREV16)
12883 v.AddArg(x)
12884 return true
12885 }
12886
12887
12888
12889 for {
12890 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMSRLconst || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != 24 {
12891 break
12892 }
12893 v_0_0 := v_0.Args[0]
12894 if v_0_0.Op != OpARMSLLconst || auxIntToInt32(v_0_0.AuxInt) != 16 {
12895 break
12896 }
12897 x := v_0_0.Args[0]
12898 if x != v_1 || !(buildcfg.GOARM.Version >= 6) {
12899 break
12900 }
12901 v.reset(OpARMREV16)
12902 v.AddArg(x)
12903 return true
12904 }
12905
12906
12907 for {
12908 c := auxIntToInt32(v.AuxInt)
12909 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c {
12910 break
12911 }
12912 x := v_0.Args[0]
12913 if x != v_1 {
12914 break
12915 }
12916 v.reset(OpARMMOVWconst)
12917 v.AuxInt = int32ToAuxInt(0)
12918 return true
12919 }
12920 return false
12921 }
12922 func rewriteValueARM_OpARMXORshiftLLreg(v *Value) bool {
12923 v_2 := v.Args[2]
12924 v_1 := v.Args[1]
12925 v_0 := v.Args[0]
12926 b := v.Block
12927
12928
12929 for {
12930 if v_0.Op != OpARMMOVWconst {
12931 break
12932 }
12933 c := auxIntToInt32(v_0.AuxInt)
12934 x := v_1
12935 y := v_2
12936 v.reset(OpARMXORconst)
12937 v.AuxInt = int32ToAuxInt(c)
12938 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
12939 v0.AddArg2(x, y)
12940 v.AddArg(v0)
12941 return true
12942 }
12943
12944
12945
12946 for {
12947 x := v_0
12948 y := v_1
12949 if v_2.Op != OpARMMOVWconst {
12950 break
12951 }
12952 c := auxIntToInt32(v_2.AuxInt)
12953 if !(0 <= c && c < 32) {
12954 break
12955 }
12956 v.reset(OpARMXORshiftLL)
12957 v.AuxInt = int32ToAuxInt(c)
12958 v.AddArg2(x, y)
12959 return true
12960 }
12961 return false
12962 }
12963 func rewriteValueARM_OpARMXORshiftRA(v *Value) bool {
12964 v_1 := v.Args[1]
12965 v_0 := v.Args[0]
12966 b := v.Block
12967
12968
12969 for {
12970 d := auxIntToInt32(v.AuxInt)
12971 if v_0.Op != OpARMMOVWconst {
12972 break
12973 }
12974 c := auxIntToInt32(v_0.AuxInt)
12975 x := v_1
12976 v.reset(OpARMXORconst)
12977 v.AuxInt = int32ToAuxInt(c)
12978 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
12979 v0.AuxInt = int32ToAuxInt(d)
12980 v0.AddArg(x)
12981 v.AddArg(v0)
12982 return true
12983 }
12984
12985
12986 for {
12987 d := auxIntToInt32(v.AuxInt)
12988 x := v_0
12989 if v_1.Op != OpARMMOVWconst {
12990 break
12991 }
12992 c := auxIntToInt32(v_1.AuxInt)
12993 v.reset(OpARMXORconst)
12994 v.AuxInt = int32ToAuxInt(c >> uint64(d))
12995 v.AddArg(x)
12996 return true
12997 }
12998
12999
13000 for {
13001 c := auxIntToInt32(v.AuxInt)
13002 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c {
13003 break
13004 }
13005 x := v_0.Args[0]
13006 if x != v_1 {
13007 break
13008 }
13009 v.reset(OpARMMOVWconst)
13010 v.AuxInt = int32ToAuxInt(0)
13011 return true
13012 }
13013 return false
13014 }
13015 func rewriteValueARM_OpARMXORshiftRAreg(v *Value) bool {
13016 v_2 := v.Args[2]
13017 v_1 := v.Args[1]
13018 v_0 := v.Args[0]
13019 b := v.Block
13020
13021
13022 for {
13023 if v_0.Op != OpARMMOVWconst {
13024 break
13025 }
13026 c := auxIntToInt32(v_0.AuxInt)
13027 x := v_1
13028 y := v_2
13029 v.reset(OpARMXORconst)
13030 v.AuxInt = int32ToAuxInt(c)
13031 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
13032 v0.AddArg2(x, y)
13033 v.AddArg(v0)
13034 return true
13035 }
13036
13037
13038
13039 for {
13040 x := v_0
13041 y := v_1
13042 if v_2.Op != OpARMMOVWconst {
13043 break
13044 }
13045 c := auxIntToInt32(v_2.AuxInt)
13046 if !(0 <= c && c < 32) {
13047 break
13048 }
13049 v.reset(OpARMXORshiftRA)
13050 v.AuxInt = int32ToAuxInt(c)
13051 v.AddArg2(x, y)
13052 return true
13053 }
13054 return false
13055 }
13056 func rewriteValueARM_OpARMXORshiftRL(v *Value) bool {
13057 v_1 := v.Args[1]
13058 v_0 := v.Args[0]
13059 b := v.Block
13060
13061
13062 for {
13063 d := auxIntToInt32(v.AuxInt)
13064 if v_0.Op != OpARMMOVWconst {
13065 break
13066 }
13067 c := auxIntToInt32(v_0.AuxInt)
13068 x := v_1
13069 v.reset(OpARMXORconst)
13070 v.AuxInt = int32ToAuxInt(c)
13071 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
13072 v0.AuxInt = int32ToAuxInt(d)
13073 v0.AddArg(x)
13074 v.AddArg(v0)
13075 return true
13076 }
13077
13078
13079 for {
13080 d := auxIntToInt32(v.AuxInt)
13081 x := v_0
13082 if v_1.Op != OpARMMOVWconst {
13083 break
13084 }
13085 c := auxIntToInt32(v_1.AuxInt)
13086 v.reset(OpARMXORconst)
13087 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
13088 v.AddArg(x)
13089 return true
13090 }
13091
13092
13093 for {
13094 c := auxIntToInt32(v.AuxInt)
13095 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c {
13096 break
13097 }
13098 x := v_0.Args[0]
13099 if x != v_1 {
13100 break
13101 }
13102 v.reset(OpARMMOVWconst)
13103 v.AuxInt = int32ToAuxInt(0)
13104 return true
13105 }
13106 return false
13107 }
13108 func rewriteValueARM_OpARMXORshiftRLreg(v *Value) bool {
13109 v_2 := v.Args[2]
13110 v_1 := v.Args[1]
13111 v_0 := v.Args[0]
13112 b := v.Block
13113
13114
13115 for {
13116 if v_0.Op != OpARMMOVWconst {
13117 break
13118 }
13119 c := auxIntToInt32(v_0.AuxInt)
13120 x := v_1
13121 y := v_2
13122 v.reset(OpARMXORconst)
13123 v.AuxInt = int32ToAuxInt(c)
13124 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
13125 v0.AddArg2(x, y)
13126 v.AddArg(v0)
13127 return true
13128 }
13129
13130
13131
13132 for {
13133 x := v_0
13134 y := v_1
13135 if v_2.Op != OpARMMOVWconst {
13136 break
13137 }
13138 c := auxIntToInt32(v_2.AuxInt)
13139 if !(0 <= c && c < 32) {
13140 break
13141 }
13142 v.reset(OpARMXORshiftRL)
13143 v.AuxInt = int32ToAuxInt(c)
13144 v.AddArg2(x, y)
13145 return true
13146 }
13147 return false
13148 }
13149 func rewriteValueARM_OpARMXORshiftRR(v *Value) bool {
13150 v_1 := v.Args[1]
13151 v_0 := v.Args[0]
13152 b := v.Block
13153
13154
13155 for {
13156 d := auxIntToInt32(v.AuxInt)
13157 if v_0.Op != OpARMMOVWconst {
13158 break
13159 }
13160 c := auxIntToInt32(v_0.AuxInt)
13161 x := v_1
13162 v.reset(OpARMXORconst)
13163 v.AuxInt = int32ToAuxInt(c)
13164 v0 := b.NewValue0(v.Pos, OpARMSRRconst, x.Type)
13165 v0.AuxInt = int32ToAuxInt(d)
13166 v0.AddArg(x)
13167 v.AddArg(v0)
13168 return true
13169 }
13170
13171
13172 for {
13173 d := auxIntToInt32(v.AuxInt)
13174 x := v_0
13175 if v_1.Op != OpARMMOVWconst {
13176 break
13177 }
13178 c := auxIntToInt32(v_1.AuxInt)
13179 v.reset(OpARMXORconst)
13180 v.AuxInt = int32ToAuxInt(int32(uint32(c)>>uint64(d) | uint32(c)<<uint64(32-d)))
13181 v.AddArg(x)
13182 return true
13183 }
13184 return false
13185 }
13186 func rewriteValueARM_OpAddr(v *Value) bool {
13187 v_0 := v.Args[0]
13188
13189
13190 for {
13191 sym := auxToSym(v.Aux)
13192 base := v_0
13193 v.reset(OpARMMOVWaddr)
13194 v.Aux = symToAux(sym)
13195 v.AddArg(base)
13196 return true
13197 }
13198 }
13199 func rewriteValueARM_OpAvg32u(v *Value) bool {
13200 v_1 := v.Args[1]
13201 v_0 := v.Args[0]
13202 b := v.Block
13203
13204
13205 for {
13206 t := v.Type
13207 x := v_0
13208 y := v_1
13209 v.reset(OpARMADD)
13210 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t)
13211 v0.AuxInt = int32ToAuxInt(1)
13212 v1 := b.NewValue0(v.Pos, OpARMSUB, t)
13213 v1.AddArg2(x, y)
13214 v0.AddArg(v1)
13215 v.AddArg2(v0, y)
13216 return true
13217 }
13218 }
13219 func rewriteValueARM_OpBitLen16(v *Value) bool {
13220 v_0 := v.Args[0]
13221 b := v.Block
13222 typ := &b.Func.Config.Types
13223
13224
13225 for {
13226 x := v_0
13227 v.reset(OpBitLen32)
13228 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13229 v0.AddArg(x)
13230 v.AddArg(v0)
13231 return true
13232 }
13233 }
13234 func rewriteValueARM_OpBitLen32(v *Value) bool {
13235 v_0 := v.Args[0]
13236 b := v.Block
13237
13238
13239 for {
13240 t := v.Type
13241 x := v_0
13242 v.reset(OpARMRSBconst)
13243 v.AuxInt = int32ToAuxInt(32)
13244 v0 := b.NewValue0(v.Pos, OpARMCLZ, t)
13245 v0.AddArg(x)
13246 v.AddArg(v0)
13247 return true
13248 }
13249 }
13250 func rewriteValueARM_OpBitLen8(v *Value) bool {
13251 v_0 := v.Args[0]
13252 b := v.Block
13253 typ := &b.Func.Config.Types
13254
13255
13256 for {
13257 x := v_0
13258 v.reset(OpBitLen32)
13259 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13260 v0.AddArg(x)
13261 v.AddArg(v0)
13262 return true
13263 }
13264 }
13265 func rewriteValueARM_OpBswap32(v *Value) bool {
13266 v_0 := v.Args[0]
13267 b := v.Block
13268
13269
13270
13271 for {
13272 t := v.Type
13273 x := v_0
13274 if !(buildcfg.GOARM.Version == 5) {
13275 break
13276 }
13277 v.reset(OpARMXOR)
13278 v.Type = t
13279 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t)
13280 v0.AuxInt = int32ToAuxInt(8)
13281 v1 := b.NewValue0(v.Pos, OpARMBICconst, t)
13282 v1.AuxInt = int32ToAuxInt(0xff0000)
13283 v2 := b.NewValue0(v.Pos, OpARMXOR, t)
13284 v3 := b.NewValue0(v.Pos, OpARMSRRconst, t)
13285 v3.AuxInt = int32ToAuxInt(16)
13286 v3.AddArg(x)
13287 v2.AddArg2(x, v3)
13288 v1.AddArg(v2)
13289 v0.AddArg(v1)
13290 v4 := b.NewValue0(v.Pos, OpARMSRRconst, t)
13291 v4.AuxInt = int32ToAuxInt(8)
13292 v4.AddArg(x)
13293 v.AddArg2(v0, v4)
13294 return true
13295 }
13296
13297
13298
13299 for {
13300 x := v_0
13301 if !(buildcfg.GOARM.Version >= 6) {
13302 break
13303 }
13304 v.reset(OpARMREV)
13305 v.AddArg(x)
13306 return true
13307 }
13308 return false
13309 }
13310 func rewriteValueARM_OpConst16(v *Value) bool {
13311
13312
13313 for {
13314 val := auxIntToInt16(v.AuxInt)
13315 v.reset(OpARMMOVWconst)
13316 v.AuxInt = int32ToAuxInt(int32(val))
13317 return true
13318 }
13319 }
13320 func rewriteValueARM_OpConst32(v *Value) bool {
13321
13322
13323 for {
13324 val := auxIntToInt32(v.AuxInt)
13325 v.reset(OpARMMOVWconst)
13326 v.AuxInt = int32ToAuxInt(int32(val))
13327 return true
13328 }
13329 }
13330 func rewriteValueARM_OpConst32F(v *Value) bool {
13331
13332
13333 for {
13334 val := auxIntToFloat32(v.AuxInt)
13335 v.reset(OpARMMOVFconst)
13336 v.AuxInt = float64ToAuxInt(float64(val))
13337 return true
13338 }
13339 }
13340 func rewriteValueARM_OpConst64F(v *Value) bool {
13341
13342
13343 for {
13344 val := auxIntToFloat64(v.AuxInt)
13345 v.reset(OpARMMOVDconst)
13346 v.AuxInt = float64ToAuxInt(float64(val))
13347 return true
13348 }
13349 }
13350 func rewriteValueARM_OpConst8(v *Value) bool {
13351
13352
13353 for {
13354 val := auxIntToInt8(v.AuxInt)
13355 v.reset(OpARMMOVWconst)
13356 v.AuxInt = int32ToAuxInt(int32(val))
13357 return true
13358 }
13359 }
13360 func rewriteValueARM_OpConstBool(v *Value) bool {
13361
13362
13363 for {
13364 t := auxIntToBool(v.AuxInt)
13365 v.reset(OpARMMOVWconst)
13366 v.AuxInt = int32ToAuxInt(b2i32(t))
13367 return true
13368 }
13369 }
13370 func rewriteValueARM_OpConstNil(v *Value) bool {
13371
13372
13373 for {
13374 v.reset(OpARMMOVWconst)
13375 v.AuxInt = int32ToAuxInt(0)
13376 return true
13377 }
13378 }
13379 func rewriteValueARM_OpCtz16(v *Value) bool {
13380 v_0 := v.Args[0]
13381 b := v.Block
13382 typ := &b.Func.Config.Types
13383
13384
13385
13386 for {
13387 t := v.Type
13388 x := v_0
13389 if !(buildcfg.GOARM.Version <= 6) {
13390 break
13391 }
13392 v.reset(OpARMRSBconst)
13393 v.AuxInt = int32ToAuxInt(32)
13394 v0 := b.NewValue0(v.Pos, OpARMCLZ, t)
13395 v1 := b.NewValue0(v.Pos, OpARMSUBconst, typ.UInt32)
13396 v1.AuxInt = int32ToAuxInt(1)
13397 v2 := b.NewValue0(v.Pos, OpARMAND, typ.UInt32)
13398 v3 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32)
13399 v3.AuxInt = int32ToAuxInt(0x10000)
13400 v3.AddArg(x)
13401 v4 := b.NewValue0(v.Pos, OpARMRSBconst, typ.UInt32)
13402 v4.AuxInt = int32ToAuxInt(0)
13403 v4.AddArg(v3)
13404 v2.AddArg2(v3, v4)
13405 v1.AddArg(v2)
13406 v0.AddArg(v1)
13407 v.AddArg(v0)
13408 return true
13409 }
13410
13411
13412
13413 for {
13414 t := v.Type
13415 x := v_0
13416 if !(buildcfg.GOARM.Version == 7) {
13417 break
13418 }
13419 v.reset(OpARMCLZ)
13420 v.Type = t
13421 v0 := b.NewValue0(v.Pos, OpARMRBIT, typ.UInt32)
13422 v1 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32)
13423 v1.AuxInt = int32ToAuxInt(0x10000)
13424 v1.AddArg(x)
13425 v0.AddArg(v1)
13426 v.AddArg(v0)
13427 return true
13428 }
13429 return false
13430 }
13431 func rewriteValueARM_OpCtz32(v *Value) bool {
13432 v_0 := v.Args[0]
13433 b := v.Block
13434
13435
13436
13437 for {
13438 t := v.Type
13439 x := v_0
13440 if !(buildcfg.GOARM.Version <= 6) {
13441 break
13442 }
13443 v.reset(OpARMRSBconst)
13444 v.AuxInt = int32ToAuxInt(32)
13445 v0 := b.NewValue0(v.Pos, OpARMCLZ, t)
13446 v1 := b.NewValue0(v.Pos, OpARMSUBconst, t)
13447 v1.AuxInt = int32ToAuxInt(1)
13448 v2 := b.NewValue0(v.Pos, OpARMAND, t)
13449 v3 := b.NewValue0(v.Pos, OpARMRSBconst, t)
13450 v3.AuxInt = int32ToAuxInt(0)
13451 v3.AddArg(x)
13452 v2.AddArg2(x, v3)
13453 v1.AddArg(v2)
13454 v0.AddArg(v1)
13455 v.AddArg(v0)
13456 return true
13457 }
13458
13459
13460
13461 for {
13462 t := v.Type
13463 x := v_0
13464 if !(buildcfg.GOARM.Version == 7) {
13465 break
13466 }
13467 v.reset(OpARMCLZ)
13468 v.Type = t
13469 v0 := b.NewValue0(v.Pos, OpARMRBIT, t)
13470 v0.AddArg(x)
13471 v.AddArg(v0)
13472 return true
13473 }
13474 return false
13475 }
13476 func rewriteValueARM_OpCtz8(v *Value) bool {
13477 v_0 := v.Args[0]
13478 b := v.Block
13479 typ := &b.Func.Config.Types
13480
13481
13482
13483 for {
13484 t := v.Type
13485 x := v_0
13486 if !(buildcfg.GOARM.Version <= 6) {
13487 break
13488 }
13489 v.reset(OpARMRSBconst)
13490 v.AuxInt = int32ToAuxInt(32)
13491 v0 := b.NewValue0(v.Pos, OpARMCLZ, t)
13492 v1 := b.NewValue0(v.Pos, OpARMSUBconst, typ.UInt32)
13493 v1.AuxInt = int32ToAuxInt(1)
13494 v2 := b.NewValue0(v.Pos, OpARMAND, typ.UInt32)
13495 v3 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32)
13496 v3.AuxInt = int32ToAuxInt(0x100)
13497 v3.AddArg(x)
13498 v4 := b.NewValue0(v.Pos, OpARMRSBconst, typ.UInt32)
13499 v4.AuxInt = int32ToAuxInt(0)
13500 v4.AddArg(v3)
13501 v2.AddArg2(v3, v4)
13502 v1.AddArg(v2)
13503 v0.AddArg(v1)
13504 v.AddArg(v0)
13505 return true
13506 }
13507
13508
13509
13510 for {
13511 t := v.Type
13512 x := v_0
13513 if !(buildcfg.GOARM.Version == 7) {
13514 break
13515 }
13516 v.reset(OpARMCLZ)
13517 v.Type = t
13518 v0 := b.NewValue0(v.Pos, OpARMRBIT, typ.UInt32)
13519 v1 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32)
13520 v1.AuxInt = int32ToAuxInt(0x100)
13521 v1.AddArg(x)
13522 v0.AddArg(v1)
13523 v.AddArg(v0)
13524 return true
13525 }
13526 return false
13527 }
13528 func rewriteValueARM_OpDiv16(v *Value) bool {
13529 v_1 := v.Args[1]
13530 v_0 := v.Args[0]
13531 b := v.Block
13532 typ := &b.Func.Config.Types
13533
13534
13535 for {
13536 x := v_0
13537 y := v_1
13538 v.reset(OpDiv32)
13539 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
13540 v0.AddArg(x)
13541 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
13542 v1.AddArg(y)
13543 v.AddArg2(v0, v1)
13544 return true
13545 }
13546 }
13547 func rewriteValueARM_OpDiv16u(v *Value) bool {
13548 v_1 := v.Args[1]
13549 v_0 := v.Args[0]
13550 b := v.Block
13551 typ := &b.Func.Config.Types
13552
13553
13554 for {
13555 x := v_0
13556 y := v_1
13557 v.reset(OpDiv32u)
13558 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13559 v0.AddArg(x)
13560 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13561 v1.AddArg(y)
13562 v.AddArg2(v0, v1)
13563 return true
13564 }
13565 }
13566 func rewriteValueARM_OpDiv32(v *Value) bool {
13567 v_1 := v.Args[1]
13568 v_0 := v.Args[0]
13569 b := v.Block
13570 typ := &b.Func.Config.Types
13571
13572
13573 for {
13574 x := v_0
13575 y := v_1
13576 v.reset(OpARMSUB)
13577 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
13578 v1 := b.NewValue0(v.Pos, OpSelect0, typ.UInt32)
13579 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32))
13580 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32)
13581 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
13582 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32)
13583 v5.AddArg(x)
13584 v4.AddArg2(x, v5)
13585 v3.AddArg2(v4, v5)
13586 v6 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32)
13587 v7 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
13588 v8 := b.NewValue0(v.Pos, OpSignmask, typ.Int32)
13589 v8.AddArg(y)
13590 v7.AddArg2(y, v8)
13591 v6.AddArg2(v7, v8)
13592 v2.AddArg2(v3, v6)
13593 v1.AddArg(v2)
13594 v9 := b.NewValue0(v.Pos, OpSignmask, typ.Int32)
13595 v10 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
13596 v10.AddArg2(x, y)
13597 v9.AddArg(v10)
13598 v0.AddArg2(v1, v9)
13599 v.AddArg2(v0, v9)
13600 return true
13601 }
13602 }
13603 func rewriteValueARM_OpDiv32u(v *Value) bool {
13604 v_1 := v.Args[1]
13605 v_0 := v.Args[0]
13606 b := v.Block
13607 typ := &b.Func.Config.Types
13608
13609
13610 for {
13611 x := v_0
13612 y := v_1
13613 v.reset(OpSelect0)
13614 v.Type = typ.UInt32
13615 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32))
13616 v0.AddArg2(x, y)
13617 v.AddArg(v0)
13618 return true
13619 }
13620 }
13621 func rewriteValueARM_OpDiv8(v *Value) bool {
13622 v_1 := v.Args[1]
13623 v_0 := v.Args[0]
13624 b := v.Block
13625 typ := &b.Func.Config.Types
13626
13627
13628 for {
13629 x := v_0
13630 y := v_1
13631 v.reset(OpDiv32)
13632 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
13633 v0.AddArg(x)
13634 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
13635 v1.AddArg(y)
13636 v.AddArg2(v0, v1)
13637 return true
13638 }
13639 }
13640 func rewriteValueARM_OpDiv8u(v *Value) bool {
13641 v_1 := v.Args[1]
13642 v_0 := v.Args[0]
13643 b := v.Block
13644 typ := &b.Func.Config.Types
13645
13646
13647 for {
13648 x := v_0
13649 y := v_1
13650 v.reset(OpDiv32u)
13651 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13652 v0.AddArg(x)
13653 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13654 v1.AddArg(y)
13655 v.AddArg2(v0, v1)
13656 return true
13657 }
13658 }
13659 func rewriteValueARM_OpEq16(v *Value) bool {
13660 v_1 := v.Args[1]
13661 v_0 := v.Args[0]
13662 b := v.Block
13663 typ := &b.Func.Config.Types
13664
13665
13666 for {
13667 x := v_0
13668 y := v_1
13669 v.reset(OpARMEqual)
13670 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13671 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13672 v1.AddArg(x)
13673 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13674 v2.AddArg(y)
13675 v0.AddArg2(v1, v2)
13676 v.AddArg(v0)
13677 return true
13678 }
13679 }
13680 func rewriteValueARM_OpEq32(v *Value) bool {
13681 v_1 := v.Args[1]
13682 v_0 := v.Args[0]
13683 b := v.Block
13684
13685
13686 for {
13687 x := v_0
13688 y := v_1
13689 v.reset(OpARMEqual)
13690 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13691 v0.AddArg2(x, y)
13692 v.AddArg(v0)
13693 return true
13694 }
13695 }
13696 func rewriteValueARM_OpEq32F(v *Value) bool {
13697 v_1 := v.Args[1]
13698 v_0 := v.Args[0]
13699 b := v.Block
13700
13701
13702 for {
13703 x := v_0
13704 y := v_1
13705 v.reset(OpARMEqual)
13706 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags)
13707 v0.AddArg2(x, y)
13708 v.AddArg(v0)
13709 return true
13710 }
13711 }
13712 func rewriteValueARM_OpEq64F(v *Value) bool {
13713 v_1 := v.Args[1]
13714 v_0 := v.Args[0]
13715 b := v.Block
13716
13717
13718 for {
13719 x := v_0
13720 y := v_1
13721 v.reset(OpARMEqual)
13722 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags)
13723 v0.AddArg2(x, y)
13724 v.AddArg(v0)
13725 return true
13726 }
13727 }
13728 func rewriteValueARM_OpEq8(v *Value) bool {
13729 v_1 := v.Args[1]
13730 v_0 := v.Args[0]
13731 b := v.Block
13732 typ := &b.Func.Config.Types
13733
13734
13735 for {
13736 x := v_0
13737 y := v_1
13738 v.reset(OpARMEqual)
13739 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13740 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13741 v1.AddArg(x)
13742 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13743 v2.AddArg(y)
13744 v0.AddArg2(v1, v2)
13745 v.AddArg(v0)
13746 return true
13747 }
13748 }
13749 func rewriteValueARM_OpEqB(v *Value) bool {
13750 v_1 := v.Args[1]
13751 v_0 := v.Args[0]
13752 b := v.Block
13753 typ := &b.Func.Config.Types
13754
13755
13756 for {
13757 x := v_0
13758 y := v_1
13759 v.reset(OpARMXORconst)
13760 v.AuxInt = int32ToAuxInt(1)
13761 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.Bool)
13762 v0.AddArg2(x, y)
13763 v.AddArg(v0)
13764 return true
13765 }
13766 }
13767 func rewriteValueARM_OpEqPtr(v *Value) bool {
13768 v_1 := v.Args[1]
13769 v_0 := v.Args[0]
13770 b := v.Block
13771
13772
13773 for {
13774 x := v_0
13775 y := v_1
13776 v.reset(OpARMEqual)
13777 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13778 v0.AddArg2(x, y)
13779 v.AddArg(v0)
13780 return true
13781 }
13782 }
13783 func rewriteValueARM_OpFMA(v *Value) bool {
13784 v_2 := v.Args[2]
13785 v_1 := v.Args[1]
13786 v_0 := v.Args[0]
13787
13788
13789 for {
13790 x := v_0
13791 y := v_1
13792 z := v_2
13793 v.reset(OpARMFMULAD)
13794 v.AddArg3(z, x, y)
13795 return true
13796 }
13797 }
13798 func rewriteValueARM_OpIsInBounds(v *Value) bool {
13799 v_1 := v.Args[1]
13800 v_0 := v.Args[0]
13801 b := v.Block
13802
13803
13804 for {
13805 idx := v_0
13806 len := v_1
13807 v.reset(OpARMLessThanU)
13808 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13809 v0.AddArg2(idx, len)
13810 v.AddArg(v0)
13811 return true
13812 }
13813 }
13814 func rewriteValueARM_OpIsNonNil(v *Value) bool {
13815 v_0 := v.Args[0]
13816 b := v.Block
13817
13818
13819 for {
13820 ptr := v_0
13821 v.reset(OpARMNotEqual)
13822 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
13823 v0.AuxInt = int32ToAuxInt(0)
13824 v0.AddArg(ptr)
13825 v.AddArg(v0)
13826 return true
13827 }
13828 }
13829 func rewriteValueARM_OpIsSliceInBounds(v *Value) bool {
13830 v_1 := v.Args[1]
13831 v_0 := v.Args[0]
13832 b := v.Block
13833
13834
13835 for {
13836 idx := v_0
13837 len := v_1
13838 v.reset(OpARMLessEqualU)
13839 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13840 v0.AddArg2(idx, len)
13841 v.AddArg(v0)
13842 return true
13843 }
13844 }
13845 func rewriteValueARM_OpLeq16(v *Value) bool {
13846 v_1 := v.Args[1]
13847 v_0 := v.Args[0]
13848 b := v.Block
13849 typ := &b.Func.Config.Types
13850
13851
13852 for {
13853 x := v_0
13854 y := v_1
13855 v.reset(OpARMLessEqual)
13856 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13857 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
13858 v1.AddArg(x)
13859 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
13860 v2.AddArg(y)
13861 v0.AddArg2(v1, v2)
13862 v.AddArg(v0)
13863 return true
13864 }
13865 }
13866 func rewriteValueARM_OpLeq16U(v *Value) bool {
13867 v_1 := v.Args[1]
13868 v_0 := v.Args[0]
13869 b := v.Block
13870 typ := &b.Func.Config.Types
13871
13872
13873 for {
13874 x := v_0
13875 y := v_1
13876 v.reset(OpARMLessEqualU)
13877 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13878 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13879 v1.AddArg(x)
13880 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13881 v2.AddArg(y)
13882 v0.AddArg2(v1, v2)
13883 v.AddArg(v0)
13884 return true
13885 }
13886 }
13887 func rewriteValueARM_OpLeq32(v *Value) bool {
13888 v_1 := v.Args[1]
13889 v_0 := v.Args[0]
13890 b := v.Block
13891
13892
13893 for {
13894 x := v_0
13895 y := v_1
13896 v.reset(OpARMLessEqual)
13897 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13898 v0.AddArg2(x, y)
13899 v.AddArg(v0)
13900 return true
13901 }
13902 }
13903 func rewriteValueARM_OpLeq32F(v *Value) bool {
13904 v_1 := v.Args[1]
13905 v_0 := v.Args[0]
13906 b := v.Block
13907
13908
13909 for {
13910 x := v_0
13911 y := v_1
13912 v.reset(OpARMGreaterEqual)
13913 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags)
13914 v0.AddArg2(y, x)
13915 v.AddArg(v0)
13916 return true
13917 }
13918 }
13919 func rewriteValueARM_OpLeq32U(v *Value) bool {
13920 v_1 := v.Args[1]
13921 v_0 := v.Args[0]
13922 b := v.Block
13923
13924
13925 for {
13926 x := v_0
13927 y := v_1
13928 v.reset(OpARMLessEqualU)
13929 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13930 v0.AddArg2(x, y)
13931 v.AddArg(v0)
13932 return true
13933 }
13934 }
13935 func rewriteValueARM_OpLeq64F(v *Value) bool {
13936 v_1 := v.Args[1]
13937 v_0 := v.Args[0]
13938 b := v.Block
13939
13940
13941 for {
13942 x := v_0
13943 y := v_1
13944 v.reset(OpARMGreaterEqual)
13945 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags)
13946 v0.AddArg2(y, x)
13947 v.AddArg(v0)
13948 return true
13949 }
13950 }
13951 func rewriteValueARM_OpLeq8(v *Value) bool {
13952 v_1 := v.Args[1]
13953 v_0 := v.Args[0]
13954 b := v.Block
13955 typ := &b.Func.Config.Types
13956
13957
13958 for {
13959 x := v_0
13960 y := v_1
13961 v.reset(OpARMLessEqual)
13962 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13963 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
13964 v1.AddArg(x)
13965 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
13966 v2.AddArg(y)
13967 v0.AddArg2(v1, v2)
13968 v.AddArg(v0)
13969 return true
13970 }
13971 }
13972 func rewriteValueARM_OpLeq8U(v *Value) bool {
13973 v_1 := v.Args[1]
13974 v_0 := v.Args[0]
13975 b := v.Block
13976 typ := &b.Func.Config.Types
13977
13978
13979 for {
13980 x := v_0
13981 y := v_1
13982 v.reset(OpARMLessEqualU)
13983 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13984 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13985 v1.AddArg(x)
13986 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13987 v2.AddArg(y)
13988 v0.AddArg2(v1, v2)
13989 v.AddArg(v0)
13990 return true
13991 }
13992 }
13993 func rewriteValueARM_OpLess16(v *Value) bool {
13994 v_1 := v.Args[1]
13995 v_0 := v.Args[0]
13996 b := v.Block
13997 typ := &b.Func.Config.Types
13998
13999
14000 for {
14001 x := v_0
14002 y := v_1
14003 v.reset(OpARMLessThan)
14004 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
14005 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
14006 v1.AddArg(x)
14007 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
14008 v2.AddArg(y)
14009 v0.AddArg2(v1, v2)
14010 v.AddArg(v0)
14011 return true
14012 }
14013 }
14014 func rewriteValueARM_OpLess16U(v *Value) bool {
14015 v_1 := v.Args[1]
14016 v_0 := v.Args[0]
14017 b := v.Block
14018 typ := &b.Func.Config.Types
14019
14020
14021 for {
14022 x := v_0
14023 y := v_1
14024 v.reset(OpARMLessThanU)
14025 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
14026 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14027 v1.AddArg(x)
14028 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14029 v2.AddArg(y)
14030 v0.AddArg2(v1, v2)
14031 v.AddArg(v0)
14032 return true
14033 }
14034 }
14035 func rewriteValueARM_OpLess32(v *Value) bool {
14036 v_1 := v.Args[1]
14037 v_0 := v.Args[0]
14038 b := v.Block
14039
14040
14041 for {
14042 x := v_0
14043 y := v_1
14044 v.reset(OpARMLessThan)
14045 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
14046 v0.AddArg2(x, y)
14047 v.AddArg(v0)
14048 return true
14049 }
14050 }
14051 func rewriteValueARM_OpLess32F(v *Value) bool {
14052 v_1 := v.Args[1]
14053 v_0 := v.Args[0]
14054 b := v.Block
14055
14056
14057 for {
14058 x := v_0
14059 y := v_1
14060 v.reset(OpARMGreaterThan)
14061 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags)
14062 v0.AddArg2(y, x)
14063 v.AddArg(v0)
14064 return true
14065 }
14066 }
14067 func rewriteValueARM_OpLess32U(v *Value) bool {
14068 v_1 := v.Args[1]
14069 v_0 := v.Args[0]
14070 b := v.Block
14071
14072
14073 for {
14074 x := v_0
14075 y := v_1
14076 v.reset(OpARMLessThanU)
14077 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
14078 v0.AddArg2(x, y)
14079 v.AddArg(v0)
14080 return true
14081 }
14082 }
14083 func rewriteValueARM_OpLess64F(v *Value) bool {
14084 v_1 := v.Args[1]
14085 v_0 := v.Args[0]
14086 b := v.Block
14087
14088
14089 for {
14090 x := v_0
14091 y := v_1
14092 v.reset(OpARMGreaterThan)
14093 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags)
14094 v0.AddArg2(y, x)
14095 v.AddArg(v0)
14096 return true
14097 }
14098 }
14099 func rewriteValueARM_OpLess8(v *Value) bool {
14100 v_1 := v.Args[1]
14101 v_0 := v.Args[0]
14102 b := v.Block
14103 typ := &b.Func.Config.Types
14104
14105
14106 for {
14107 x := v_0
14108 y := v_1
14109 v.reset(OpARMLessThan)
14110 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
14111 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
14112 v1.AddArg(x)
14113 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
14114 v2.AddArg(y)
14115 v0.AddArg2(v1, v2)
14116 v.AddArg(v0)
14117 return true
14118 }
14119 }
14120 func rewriteValueARM_OpLess8U(v *Value) bool {
14121 v_1 := v.Args[1]
14122 v_0 := v.Args[0]
14123 b := v.Block
14124 typ := &b.Func.Config.Types
14125
14126
14127 for {
14128 x := v_0
14129 y := v_1
14130 v.reset(OpARMLessThanU)
14131 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
14132 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14133 v1.AddArg(x)
14134 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14135 v2.AddArg(y)
14136 v0.AddArg2(v1, v2)
14137 v.AddArg(v0)
14138 return true
14139 }
14140 }
14141 func rewriteValueARM_OpLoad(v *Value) bool {
14142 v_1 := v.Args[1]
14143 v_0 := v.Args[0]
14144
14145
14146
14147 for {
14148 t := v.Type
14149 ptr := v_0
14150 mem := v_1
14151 if !(t.IsBoolean()) {
14152 break
14153 }
14154 v.reset(OpARMMOVBUload)
14155 v.AddArg2(ptr, mem)
14156 return true
14157 }
14158
14159
14160
14161 for {
14162 t := v.Type
14163 ptr := v_0
14164 mem := v_1
14165 if !(is8BitInt(t) && t.IsSigned()) {
14166 break
14167 }
14168 v.reset(OpARMMOVBload)
14169 v.AddArg2(ptr, mem)
14170 return true
14171 }
14172
14173
14174
14175 for {
14176 t := v.Type
14177 ptr := v_0
14178 mem := v_1
14179 if !(is8BitInt(t) && !t.IsSigned()) {
14180 break
14181 }
14182 v.reset(OpARMMOVBUload)
14183 v.AddArg2(ptr, mem)
14184 return true
14185 }
14186
14187
14188
14189 for {
14190 t := v.Type
14191 ptr := v_0
14192 mem := v_1
14193 if !(is16BitInt(t) && t.IsSigned()) {
14194 break
14195 }
14196 v.reset(OpARMMOVHload)
14197 v.AddArg2(ptr, mem)
14198 return true
14199 }
14200
14201
14202
14203 for {
14204 t := v.Type
14205 ptr := v_0
14206 mem := v_1
14207 if !(is16BitInt(t) && !t.IsSigned()) {
14208 break
14209 }
14210 v.reset(OpARMMOVHUload)
14211 v.AddArg2(ptr, mem)
14212 return true
14213 }
14214
14215
14216
14217 for {
14218 t := v.Type
14219 ptr := v_0
14220 mem := v_1
14221 if !(is32BitInt(t) || isPtr(t)) {
14222 break
14223 }
14224 v.reset(OpARMMOVWload)
14225 v.AddArg2(ptr, mem)
14226 return true
14227 }
14228
14229
14230
14231 for {
14232 t := v.Type
14233 ptr := v_0
14234 mem := v_1
14235 if !(is32BitFloat(t)) {
14236 break
14237 }
14238 v.reset(OpARMMOVFload)
14239 v.AddArg2(ptr, mem)
14240 return true
14241 }
14242
14243
14244
14245 for {
14246 t := v.Type
14247 ptr := v_0
14248 mem := v_1
14249 if !(is64BitFloat(t)) {
14250 break
14251 }
14252 v.reset(OpARMMOVDload)
14253 v.AddArg2(ptr, mem)
14254 return true
14255 }
14256 return false
14257 }
14258 func rewriteValueARM_OpLocalAddr(v *Value) bool {
14259 v_1 := v.Args[1]
14260 v_0 := v.Args[0]
14261 b := v.Block
14262 typ := &b.Func.Config.Types
14263
14264
14265
14266 for {
14267 t := v.Type
14268 sym := auxToSym(v.Aux)
14269 base := v_0
14270 mem := v_1
14271 if !(t.Elem().HasPointers()) {
14272 break
14273 }
14274 v.reset(OpARMMOVWaddr)
14275 v.Aux = symToAux(sym)
14276 v0 := b.NewValue0(v.Pos, OpSPanchored, typ.Uintptr)
14277 v0.AddArg2(base, mem)
14278 v.AddArg(v0)
14279 return true
14280 }
14281
14282
14283
14284 for {
14285 t := v.Type
14286 sym := auxToSym(v.Aux)
14287 base := v_0
14288 if !(!t.Elem().HasPointers()) {
14289 break
14290 }
14291 v.reset(OpARMMOVWaddr)
14292 v.Aux = symToAux(sym)
14293 v.AddArg(base)
14294 return true
14295 }
14296 return false
14297 }
14298 func rewriteValueARM_OpLsh16x16(v *Value) bool {
14299 v_1 := v.Args[1]
14300 v_0 := v.Args[0]
14301 b := v.Block
14302 typ := &b.Func.Config.Types
14303
14304
14305 for {
14306 x := v_0
14307 y := v_1
14308 v.reset(OpARMCMOVWHSconst)
14309 v.AuxInt = int32ToAuxInt(0)
14310 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
14311 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14312 v1.AddArg(y)
14313 v0.AddArg2(x, v1)
14314 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
14315 v2.AuxInt = int32ToAuxInt(256)
14316 v2.AddArg(v1)
14317 v.AddArg2(v0, v2)
14318 return true
14319 }
14320 }
14321 func rewriteValueARM_OpLsh16x32(v *Value) bool {
14322 v_1 := v.Args[1]
14323 v_0 := v.Args[0]
14324 b := v.Block
14325
14326
14327 for {
14328 x := v_0
14329 y := v_1
14330 v.reset(OpARMCMOVWHSconst)
14331 v.AuxInt = int32ToAuxInt(0)
14332 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
14333 v0.AddArg2(x, y)
14334 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
14335 v1.AuxInt = int32ToAuxInt(256)
14336 v1.AddArg(y)
14337 v.AddArg2(v0, v1)
14338 return true
14339 }
14340 }
14341 func rewriteValueARM_OpLsh16x64(v *Value) bool {
14342 v_1 := v.Args[1]
14343 v_0 := v.Args[0]
14344
14345
14346
14347 for {
14348 x := v_0
14349 if v_1.Op != OpConst64 {
14350 break
14351 }
14352 c := auxIntToInt64(v_1.AuxInt)
14353 if !(uint64(c) < 16) {
14354 break
14355 }
14356 v.reset(OpARMSLLconst)
14357 v.AuxInt = int32ToAuxInt(int32(c))
14358 v.AddArg(x)
14359 return true
14360 }
14361
14362
14363
14364 for {
14365 if v_1.Op != OpConst64 {
14366 break
14367 }
14368 c := auxIntToInt64(v_1.AuxInt)
14369 if !(uint64(c) >= 16) {
14370 break
14371 }
14372 v.reset(OpConst16)
14373 v.AuxInt = int16ToAuxInt(0)
14374 return true
14375 }
14376 return false
14377 }
14378 func rewriteValueARM_OpLsh16x8(v *Value) bool {
14379 v_1 := v.Args[1]
14380 v_0 := v.Args[0]
14381 b := v.Block
14382 typ := &b.Func.Config.Types
14383
14384
14385 for {
14386 x := v_0
14387 y := v_1
14388 v.reset(OpARMSLL)
14389 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14390 v0.AddArg(y)
14391 v.AddArg2(x, v0)
14392 return true
14393 }
14394 }
14395 func rewriteValueARM_OpLsh32x16(v *Value) bool {
14396 v_1 := v.Args[1]
14397 v_0 := v.Args[0]
14398 b := v.Block
14399 typ := &b.Func.Config.Types
14400
14401
14402 for {
14403 x := v_0
14404 y := v_1
14405 v.reset(OpARMCMOVWHSconst)
14406 v.AuxInt = int32ToAuxInt(0)
14407 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
14408 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14409 v1.AddArg(y)
14410 v0.AddArg2(x, v1)
14411 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
14412 v2.AuxInt = int32ToAuxInt(256)
14413 v2.AddArg(v1)
14414 v.AddArg2(v0, v2)
14415 return true
14416 }
14417 }
14418 func rewriteValueARM_OpLsh32x32(v *Value) bool {
14419 v_1 := v.Args[1]
14420 v_0 := v.Args[0]
14421 b := v.Block
14422
14423
14424 for {
14425 x := v_0
14426 y := v_1
14427 v.reset(OpARMCMOVWHSconst)
14428 v.AuxInt = int32ToAuxInt(0)
14429 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
14430 v0.AddArg2(x, y)
14431 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
14432 v1.AuxInt = int32ToAuxInt(256)
14433 v1.AddArg(y)
14434 v.AddArg2(v0, v1)
14435 return true
14436 }
14437 }
14438 func rewriteValueARM_OpLsh32x64(v *Value) bool {
14439 v_1 := v.Args[1]
14440 v_0 := v.Args[0]
14441
14442
14443
14444 for {
14445 x := v_0
14446 if v_1.Op != OpConst64 {
14447 break
14448 }
14449 c := auxIntToInt64(v_1.AuxInt)
14450 if !(uint64(c) < 32) {
14451 break
14452 }
14453 v.reset(OpARMSLLconst)
14454 v.AuxInt = int32ToAuxInt(int32(c))
14455 v.AddArg(x)
14456 return true
14457 }
14458
14459
14460
14461 for {
14462 if v_1.Op != OpConst64 {
14463 break
14464 }
14465 c := auxIntToInt64(v_1.AuxInt)
14466 if !(uint64(c) >= 32) {
14467 break
14468 }
14469 v.reset(OpConst32)
14470 v.AuxInt = int32ToAuxInt(0)
14471 return true
14472 }
14473 return false
14474 }
14475 func rewriteValueARM_OpLsh32x8(v *Value) bool {
14476 v_1 := v.Args[1]
14477 v_0 := v.Args[0]
14478 b := v.Block
14479 typ := &b.Func.Config.Types
14480
14481
14482 for {
14483 x := v_0
14484 y := v_1
14485 v.reset(OpARMSLL)
14486 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14487 v0.AddArg(y)
14488 v.AddArg2(x, v0)
14489 return true
14490 }
14491 }
14492 func rewriteValueARM_OpLsh8x16(v *Value) bool {
14493 v_1 := v.Args[1]
14494 v_0 := v.Args[0]
14495 b := v.Block
14496 typ := &b.Func.Config.Types
14497
14498
14499 for {
14500 x := v_0
14501 y := v_1
14502 v.reset(OpARMCMOVWHSconst)
14503 v.AuxInt = int32ToAuxInt(0)
14504 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
14505 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14506 v1.AddArg(y)
14507 v0.AddArg2(x, v1)
14508 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
14509 v2.AuxInt = int32ToAuxInt(256)
14510 v2.AddArg(v1)
14511 v.AddArg2(v0, v2)
14512 return true
14513 }
14514 }
14515 func rewriteValueARM_OpLsh8x32(v *Value) bool {
14516 v_1 := v.Args[1]
14517 v_0 := v.Args[0]
14518 b := v.Block
14519
14520
14521 for {
14522 x := v_0
14523 y := v_1
14524 v.reset(OpARMCMOVWHSconst)
14525 v.AuxInt = int32ToAuxInt(0)
14526 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
14527 v0.AddArg2(x, y)
14528 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
14529 v1.AuxInt = int32ToAuxInt(256)
14530 v1.AddArg(y)
14531 v.AddArg2(v0, v1)
14532 return true
14533 }
14534 }
14535 func rewriteValueARM_OpLsh8x64(v *Value) bool {
14536 v_1 := v.Args[1]
14537 v_0 := v.Args[0]
14538
14539
14540
14541 for {
14542 x := v_0
14543 if v_1.Op != OpConst64 {
14544 break
14545 }
14546 c := auxIntToInt64(v_1.AuxInt)
14547 if !(uint64(c) < 8) {
14548 break
14549 }
14550 v.reset(OpARMSLLconst)
14551 v.AuxInt = int32ToAuxInt(int32(c))
14552 v.AddArg(x)
14553 return true
14554 }
14555
14556
14557
14558 for {
14559 if v_1.Op != OpConst64 {
14560 break
14561 }
14562 c := auxIntToInt64(v_1.AuxInt)
14563 if !(uint64(c) >= 8) {
14564 break
14565 }
14566 v.reset(OpConst8)
14567 v.AuxInt = int8ToAuxInt(0)
14568 return true
14569 }
14570 return false
14571 }
14572 func rewriteValueARM_OpLsh8x8(v *Value) bool {
14573 v_1 := v.Args[1]
14574 v_0 := v.Args[0]
14575 b := v.Block
14576 typ := &b.Func.Config.Types
14577
14578
14579 for {
14580 x := v_0
14581 y := v_1
14582 v.reset(OpARMSLL)
14583 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14584 v0.AddArg(y)
14585 v.AddArg2(x, v0)
14586 return true
14587 }
14588 }
14589 func rewriteValueARM_OpMod16(v *Value) bool {
14590 v_1 := v.Args[1]
14591 v_0 := v.Args[0]
14592 b := v.Block
14593 typ := &b.Func.Config.Types
14594
14595
14596 for {
14597 x := v_0
14598 y := v_1
14599 v.reset(OpMod32)
14600 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
14601 v0.AddArg(x)
14602 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
14603 v1.AddArg(y)
14604 v.AddArg2(v0, v1)
14605 return true
14606 }
14607 }
14608 func rewriteValueARM_OpMod16u(v *Value) bool {
14609 v_1 := v.Args[1]
14610 v_0 := v.Args[0]
14611 b := v.Block
14612 typ := &b.Func.Config.Types
14613
14614
14615 for {
14616 x := v_0
14617 y := v_1
14618 v.reset(OpMod32u)
14619 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14620 v0.AddArg(x)
14621 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14622 v1.AddArg(y)
14623 v.AddArg2(v0, v1)
14624 return true
14625 }
14626 }
14627 func rewriteValueARM_OpMod32(v *Value) bool {
14628 v_1 := v.Args[1]
14629 v_0 := v.Args[0]
14630 b := v.Block
14631 typ := &b.Func.Config.Types
14632
14633
14634 for {
14635 x := v_0
14636 y := v_1
14637 v.reset(OpARMSUB)
14638 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
14639 v1 := b.NewValue0(v.Pos, OpSelect1, typ.UInt32)
14640 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32))
14641 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32)
14642 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
14643 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32)
14644 v5.AddArg(x)
14645 v4.AddArg2(x, v5)
14646 v3.AddArg2(v4, v5)
14647 v6 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32)
14648 v7 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
14649 v8 := b.NewValue0(v.Pos, OpSignmask, typ.Int32)
14650 v8.AddArg(y)
14651 v7.AddArg2(y, v8)
14652 v6.AddArg2(v7, v8)
14653 v2.AddArg2(v3, v6)
14654 v1.AddArg(v2)
14655 v0.AddArg2(v1, v5)
14656 v.AddArg2(v0, v5)
14657 return true
14658 }
14659 }
14660 func rewriteValueARM_OpMod32u(v *Value) bool {
14661 v_1 := v.Args[1]
14662 v_0 := v.Args[0]
14663 b := v.Block
14664 typ := &b.Func.Config.Types
14665
14666
14667 for {
14668 x := v_0
14669 y := v_1
14670 v.reset(OpSelect1)
14671 v.Type = typ.UInt32
14672 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32))
14673 v0.AddArg2(x, y)
14674 v.AddArg(v0)
14675 return true
14676 }
14677 }
14678 func rewriteValueARM_OpMod8(v *Value) bool {
14679 v_1 := v.Args[1]
14680 v_0 := v.Args[0]
14681 b := v.Block
14682 typ := &b.Func.Config.Types
14683
14684
14685 for {
14686 x := v_0
14687 y := v_1
14688 v.reset(OpMod32)
14689 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
14690 v0.AddArg(x)
14691 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
14692 v1.AddArg(y)
14693 v.AddArg2(v0, v1)
14694 return true
14695 }
14696 }
14697 func rewriteValueARM_OpMod8u(v *Value) bool {
14698 v_1 := v.Args[1]
14699 v_0 := v.Args[0]
14700 b := v.Block
14701 typ := &b.Func.Config.Types
14702
14703
14704 for {
14705 x := v_0
14706 y := v_1
14707 v.reset(OpMod32u)
14708 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14709 v0.AddArg(x)
14710 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14711 v1.AddArg(y)
14712 v.AddArg2(v0, v1)
14713 return true
14714 }
14715 }
14716 func rewriteValueARM_OpMove(v *Value) bool {
14717 v_2 := v.Args[2]
14718 v_1 := v.Args[1]
14719 v_0 := v.Args[0]
14720 b := v.Block
14721 config := b.Func.Config
14722 typ := &b.Func.Config.Types
14723
14724
14725 for {
14726 if auxIntToInt64(v.AuxInt) != 0 {
14727 break
14728 }
14729 mem := v_2
14730 v.copyOf(mem)
14731 return true
14732 }
14733
14734
14735 for {
14736 if auxIntToInt64(v.AuxInt) != 1 {
14737 break
14738 }
14739 dst := v_0
14740 src := v_1
14741 mem := v_2
14742 v.reset(OpARMMOVBstore)
14743 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14744 v0.AddArg2(src, mem)
14745 v.AddArg3(dst, v0, mem)
14746 return true
14747 }
14748
14749
14750
14751 for {
14752 if auxIntToInt64(v.AuxInt) != 2 {
14753 break
14754 }
14755 t := auxToType(v.Aux)
14756 dst := v_0
14757 src := v_1
14758 mem := v_2
14759 if !(t.Alignment()%2 == 0) {
14760 break
14761 }
14762 v.reset(OpARMMOVHstore)
14763 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16)
14764 v0.AddArg2(src, mem)
14765 v.AddArg3(dst, v0, mem)
14766 return true
14767 }
14768
14769
14770 for {
14771 if auxIntToInt64(v.AuxInt) != 2 {
14772 break
14773 }
14774 dst := v_0
14775 src := v_1
14776 mem := v_2
14777 v.reset(OpARMMOVBstore)
14778 v.AuxInt = int32ToAuxInt(1)
14779 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14780 v0.AuxInt = int32ToAuxInt(1)
14781 v0.AddArg2(src, mem)
14782 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
14783 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14784 v2.AddArg2(src, mem)
14785 v1.AddArg3(dst, v2, mem)
14786 v.AddArg3(dst, v0, v1)
14787 return true
14788 }
14789
14790
14791
14792 for {
14793 if auxIntToInt64(v.AuxInt) != 4 {
14794 break
14795 }
14796 t := auxToType(v.Aux)
14797 dst := v_0
14798 src := v_1
14799 mem := v_2
14800 if !(t.Alignment()%4 == 0) {
14801 break
14802 }
14803 v.reset(OpARMMOVWstore)
14804 v0 := b.NewValue0(v.Pos, OpARMMOVWload, typ.UInt32)
14805 v0.AddArg2(src, mem)
14806 v.AddArg3(dst, v0, mem)
14807 return true
14808 }
14809
14810
14811
14812 for {
14813 if auxIntToInt64(v.AuxInt) != 4 {
14814 break
14815 }
14816 t := auxToType(v.Aux)
14817 dst := v_0
14818 src := v_1
14819 mem := v_2
14820 if !(t.Alignment()%2 == 0) {
14821 break
14822 }
14823 v.reset(OpARMMOVHstore)
14824 v.AuxInt = int32ToAuxInt(2)
14825 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16)
14826 v0.AuxInt = int32ToAuxInt(2)
14827 v0.AddArg2(src, mem)
14828 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem)
14829 v2 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16)
14830 v2.AddArg2(src, mem)
14831 v1.AddArg3(dst, v2, mem)
14832 v.AddArg3(dst, v0, v1)
14833 return true
14834 }
14835
14836
14837 for {
14838 if auxIntToInt64(v.AuxInt) != 4 {
14839 break
14840 }
14841 dst := v_0
14842 src := v_1
14843 mem := v_2
14844 v.reset(OpARMMOVBstore)
14845 v.AuxInt = int32ToAuxInt(3)
14846 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14847 v0.AuxInt = int32ToAuxInt(3)
14848 v0.AddArg2(src, mem)
14849 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
14850 v1.AuxInt = int32ToAuxInt(2)
14851 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14852 v2.AuxInt = int32ToAuxInt(2)
14853 v2.AddArg2(src, mem)
14854 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
14855 v3.AuxInt = int32ToAuxInt(1)
14856 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14857 v4.AuxInt = int32ToAuxInt(1)
14858 v4.AddArg2(src, mem)
14859 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
14860 v6 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14861 v6.AddArg2(src, mem)
14862 v5.AddArg3(dst, v6, mem)
14863 v3.AddArg3(dst, v4, v5)
14864 v1.AddArg3(dst, v2, v3)
14865 v.AddArg3(dst, v0, v1)
14866 return true
14867 }
14868
14869
14870 for {
14871 if auxIntToInt64(v.AuxInt) != 3 {
14872 break
14873 }
14874 dst := v_0
14875 src := v_1
14876 mem := v_2
14877 v.reset(OpARMMOVBstore)
14878 v.AuxInt = int32ToAuxInt(2)
14879 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14880 v0.AuxInt = int32ToAuxInt(2)
14881 v0.AddArg2(src, mem)
14882 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
14883 v1.AuxInt = int32ToAuxInt(1)
14884 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14885 v2.AuxInt = int32ToAuxInt(1)
14886 v2.AddArg2(src, mem)
14887 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
14888 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14889 v4.AddArg2(src, mem)
14890 v3.AddArg3(dst, v4, mem)
14891 v1.AddArg3(dst, v2, v3)
14892 v.AddArg3(dst, v0, v1)
14893 return true
14894 }
14895
14896
14897
14898 for {
14899 s := auxIntToInt64(v.AuxInt)
14900 t := auxToType(v.Aux)
14901 dst := v_0
14902 src := v_1
14903 mem := v_2
14904 if !(s%4 == 0 && s > 4 && s <= 512 && t.Alignment()%4 == 0 && logLargeCopy(v, s)) {
14905 break
14906 }
14907 v.reset(OpARMDUFFCOPY)
14908 v.AuxInt = int64ToAuxInt(8 * (128 - s/4))
14909 v.AddArg3(dst, src, mem)
14910 return true
14911 }
14912
14913
14914
14915 for {
14916 s := auxIntToInt64(v.AuxInt)
14917 t := auxToType(v.Aux)
14918 dst := v_0
14919 src := v_1
14920 mem := v_2
14921 if !((s > 512 || t.Alignment()%4 != 0) && logLargeCopy(v, s)) {
14922 break
14923 }
14924 v.reset(OpARMLoweredMove)
14925 v.AuxInt = int64ToAuxInt(t.Alignment())
14926 v0 := b.NewValue0(v.Pos, OpARMADDconst, src.Type)
14927 v0.AuxInt = int32ToAuxInt(int32(s - moveSize(t.Alignment(), config)))
14928 v0.AddArg(src)
14929 v.AddArg4(dst, src, v0, mem)
14930 return true
14931 }
14932 return false
14933 }
14934 func rewriteValueARM_OpNeg16(v *Value) bool {
14935 v_0 := v.Args[0]
14936
14937
14938 for {
14939 x := v_0
14940 v.reset(OpARMRSBconst)
14941 v.AuxInt = int32ToAuxInt(0)
14942 v.AddArg(x)
14943 return true
14944 }
14945 }
14946 func rewriteValueARM_OpNeg32(v *Value) bool {
14947 v_0 := v.Args[0]
14948
14949
14950 for {
14951 x := v_0
14952 v.reset(OpARMRSBconst)
14953 v.AuxInt = int32ToAuxInt(0)
14954 v.AddArg(x)
14955 return true
14956 }
14957 }
14958 func rewriteValueARM_OpNeg8(v *Value) bool {
14959 v_0 := v.Args[0]
14960
14961
14962 for {
14963 x := v_0
14964 v.reset(OpARMRSBconst)
14965 v.AuxInt = int32ToAuxInt(0)
14966 v.AddArg(x)
14967 return true
14968 }
14969 }
14970 func rewriteValueARM_OpNeq16(v *Value) bool {
14971 v_1 := v.Args[1]
14972 v_0 := v.Args[0]
14973 b := v.Block
14974 typ := &b.Func.Config.Types
14975
14976
14977 for {
14978 x := v_0
14979 y := v_1
14980 v.reset(OpARMNotEqual)
14981 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
14982 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14983 v1.AddArg(x)
14984 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14985 v2.AddArg(y)
14986 v0.AddArg2(v1, v2)
14987 v.AddArg(v0)
14988 return true
14989 }
14990 }
14991 func rewriteValueARM_OpNeq32(v *Value) bool {
14992 v_1 := v.Args[1]
14993 v_0 := v.Args[0]
14994 b := v.Block
14995
14996
14997 for {
14998 x := v_0
14999 y := v_1
15000 v.reset(OpARMNotEqual)
15001 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
15002 v0.AddArg2(x, y)
15003 v.AddArg(v0)
15004 return true
15005 }
15006 }
15007 func rewriteValueARM_OpNeq32F(v *Value) bool {
15008 v_1 := v.Args[1]
15009 v_0 := v.Args[0]
15010 b := v.Block
15011
15012
15013 for {
15014 x := v_0
15015 y := v_1
15016 v.reset(OpARMNotEqual)
15017 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags)
15018 v0.AddArg2(x, y)
15019 v.AddArg(v0)
15020 return true
15021 }
15022 }
15023 func rewriteValueARM_OpNeq64F(v *Value) bool {
15024 v_1 := v.Args[1]
15025 v_0 := v.Args[0]
15026 b := v.Block
15027
15028
15029 for {
15030 x := v_0
15031 y := v_1
15032 v.reset(OpARMNotEqual)
15033 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags)
15034 v0.AddArg2(x, y)
15035 v.AddArg(v0)
15036 return true
15037 }
15038 }
15039 func rewriteValueARM_OpNeq8(v *Value) bool {
15040 v_1 := v.Args[1]
15041 v_0 := v.Args[0]
15042 b := v.Block
15043 typ := &b.Func.Config.Types
15044
15045
15046 for {
15047 x := v_0
15048 y := v_1
15049 v.reset(OpARMNotEqual)
15050 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
15051 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15052 v1.AddArg(x)
15053 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15054 v2.AddArg(y)
15055 v0.AddArg2(v1, v2)
15056 v.AddArg(v0)
15057 return true
15058 }
15059 }
15060 func rewriteValueARM_OpNeqPtr(v *Value) bool {
15061 v_1 := v.Args[1]
15062 v_0 := v.Args[0]
15063 b := v.Block
15064
15065
15066 for {
15067 x := v_0
15068 y := v_1
15069 v.reset(OpARMNotEqual)
15070 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
15071 v0.AddArg2(x, y)
15072 v.AddArg(v0)
15073 return true
15074 }
15075 }
15076 func rewriteValueARM_OpNot(v *Value) bool {
15077 v_0 := v.Args[0]
15078
15079
15080 for {
15081 x := v_0
15082 v.reset(OpARMXORconst)
15083 v.AuxInt = int32ToAuxInt(1)
15084 v.AddArg(x)
15085 return true
15086 }
15087 }
15088 func rewriteValueARM_OpOffPtr(v *Value) bool {
15089 v_0 := v.Args[0]
15090
15091
15092 for {
15093 off := auxIntToInt64(v.AuxInt)
15094 ptr := v_0
15095 if ptr.Op != OpSP {
15096 break
15097 }
15098 v.reset(OpARMMOVWaddr)
15099 v.AuxInt = int32ToAuxInt(int32(off))
15100 v.AddArg(ptr)
15101 return true
15102 }
15103
15104
15105 for {
15106 off := auxIntToInt64(v.AuxInt)
15107 ptr := v_0
15108 v.reset(OpARMADDconst)
15109 v.AuxInt = int32ToAuxInt(int32(off))
15110 v.AddArg(ptr)
15111 return true
15112 }
15113 }
15114 func rewriteValueARM_OpRotateLeft16(v *Value) bool {
15115 v_1 := v.Args[1]
15116 v_0 := v.Args[0]
15117 b := v.Block
15118 typ := &b.Func.Config.Types
15119
15120
15121 for {
15122 t := v.Type
15123 x := v_0
15124 if v_1.Op != OpARMMOVWconst {
15125 break
15126 }
15127 c := auxIntToInt32(v_1.AuxInt)
15128 v.reset(OpOr16)
15129 v0 := b.NewValue0(v.Pos, OpLsh16x32, t)
15130 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
15131 v1.AuxInt = int32ToAuxInt(c & 15)
15132 v0.AddArg2(x, v1)
15133 v2 := b.NewValue0(v.Pos, OpRsh16Ux32, t)
15134 v3 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
15135 v3.AuxInt = int32ToAuxInt(-c & 15)
15136 v2.AddArg2(x, v3)
15137 v.AddArg2(v0, v2)
15138 return true
15139 }
15140 return false
15141 }
15142 func rewriteValueARM_OpRotateLeft32(v *Value) bool {
15143 v_1 := v.Args[1]
15144 v_0 := v.Args[0]
15145 b := v.Block
15146
15147
15148 for {
15149 x := v_0
15150 y := v_1
15151 v.reset(OpARMSRR)
15152 v0 := b.NewValue0(v.Pos, OpARMRSBconst, y.Type)
15153 v0.AuxInt = int32ToAuxInt(0)
15154 v0.AddArg(y)
15155 v.AddArg2(x, v0)
15156 return true
15157 }
15158 }
15159 func rewriteValueARM_OpRotateLeft8(v *Value) bool {
15160 v_1 := v.Args[1]
15161 v_0 := v.Args[0]
15162 b := v.Block
15163 typ := &b.Func.Config.Types
15164
15165
15166 for {
15167 t := v.Type
15168 x := v_0
15169 if v_1.Op != OpARMMOVWconst {
15170 break
15171 }
15172 c := auxIntToInt32(v_1.AuxInt)
15173 v.reset(OpOr8)
15174 v0 := b.NewValue0(v.Pos, OpLsh8x32, t)
15175 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
15176 v1.AuxInt = int32ToAuxInt(c & 7)
15177 v0.AddArg2(x, v1)
15178 v2 := b.NewValue0(v.Pos, OpRsh8Ux32, t)
15179 v3 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
15180 v3.AuxInt = int32ToAuxInt(-c & 7)
15181 v2.AddArg2(x, v3)
15182 v.AddArg2(v0, v2)
15183 return true
15184 }
15185 return false
15186 }
15187 func rewriteValueARM_OpRsh16Ux16(v *Value) bool {
15188 v_1 := v.Args[1]
15189 v_0 := v.Args[0]
15190 b := v.Block
15191 typ := &b.Func.Config.Types
15192
15193
15194 for {
15195 x := v_0
15196 y := v_1
15197 v.reset(OpARMCMOVWHSconst)
15198 v.AuxInt = int32ToAuxInt(0)
15199 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
15200 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15201 v1.AddArg(x)
15202 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15203 v2.AddArg(y)
15204 v0.AddArg2(v1, v2)
15205 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15206 v3.AuxInt = int32ToAuxInt(256)
15207 v3.AddArg(v2)
15208 v.AddArg2(v0, v3)
15209 return true
15210 }
15211 }
15212 func rewriteValueARM_OpRsh16Ux32(v *Value) bool {
15213 v_1 := v.Args[1]
15214 v_0 := v.Args[0]
15215 b := v.Block
15216 typ := &b.Func.Config.Types
15217
15218
15219 for {
15220 x := v_0
15221 y := v_1
15222 v.reset(OpARMCMOVWHSconst)
15223 v.AuxInt = int32ToAuxInt(0)
15224 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
15225 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15226 v1.AddArg(x)
15227 v0.AddArg2(v1, y)
15228 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15229 v2.AuxInt = int32ToAuxInt(256)
15230 v2.AddArg(y)
15231 v.AddArg2(v0, v2)
15232 return true
15233 }
15234 }
15235 func rewriteValueARM_OpRsh16Ux64(v *Value) bool {
15236 v_1 := v.Args[1]
15237 v_0 := v.Args[0]
15238 b := v.Block
15239 typ := &b.Func.Config.Types
15240
15241
15242
15243 for {
15244 x := v_0
15245 if v_1.Op != OpConst64 {
15246 break
15247 }
15248 c := auxIntToInt64(v_1.AuxInt)
15249 if !(uint64(c) < 16) {
15250 break
15251 }
15252 v.reset(OpARMSRLconst)
15253 v.AuxInt = int32ToAuxInt(int32(c + 16))
15254 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32)
15255 v0.AuxInt = int32ToAuxInt(16)
15256 v0.AddArg(x)
15257 v.AddArg(v0)
15258 return true
15259 }
15260
15261
15262
15263 for {
15264 if v_1.Op != OpConst64 {
15265 break
15266 }
15267 c := auxIntToInt64(v_1.AuxInt)
15268 if !(uint64(c) >= 16) {
15269 break
15270 }
15271 v.reset(OpConst16)
15272 v.AuxInt = int16ToAuxInt(0)
15273 return true
15274 }
15275 return false
15276 }
15277 func rewriteValueARM_OpRsh16Ux8(v *Value) bool {
15278 v_1 := v.Args[1]
15279 v_0 := v.Args[0]
15280 b := v.Block
15281 typ := &b.Func.Config.Types
15282
15283
15284 for {
15285 x := v_0
15286 y := v_1
15287 v.reset(OpARMSRL)
15288 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15289 v0.AddArg(x)
15290 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15291 v1.AddArg(y)
15292 v.AddArg2(v0, v1)
15293 return true
15294 }
15295 }
15296 func rewriteValueARM_OpRsh16x16(v *Value) bool {
15297 v_1 := v.Args[1]
15298 v_0 := v.Args[0]
15299 b := v.Block
15300 typ := &b.Func.Config.Types
15301
15302
15303 for {
15304 x := v_0
15305 y := v_1
15306 v.reset(OpARMSRAcond)
15307 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
15308 v0.AddArg(x)
15309 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15310 v1.AddArg(y)
15311 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15312 v2.AuxInt = int32ToAuxInt(256)
15313 v2.AddArg(v1)
15314 v.AddArg3(v0, v1, v2)
15315 return true
15316 }
15317 }
15318 func rewriteValueARM_OpRsh16x32(v *Value) bool {
15319 v_1 := v.Args[1]
15320 v_0 := v.Args[0]
15321 b := v.Block
15322 typ := &b.Func.Config.Types
15323
15324
15325 for {
15326 x := v_0
15327 y := v_1
15328 v.reset(OpARMSRAcond)
15329 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
15330 v0.AddArg(x)
15331 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15332 v1.AuxInt = int32ToAuxInt(256)
15333 v1.AddArg(y)
15334 v.AddArg3(v0, y, v1)
15335 return true
15336 }
15337 }
15338 func rewriteValueARM_OpRsh16x64(v *Value) bool {
15339 v_1 := v.Args[1]
15340 v_0 := v.Args[0]
15341 b := v.Block
15342 typ := &b.Func.Config.Types
15343
15344
15345
15346 for {
15347 x := v_0
15348 if v_1.Op != OpConst64 {
15349 break
15350 }
15351 c := auxIntToInt64(v_1.AuxInt)
15352 if !(uint64(c) < 16) {
15353 break
15354 }
15355 v.reset(OpARMSRAconst)
15356 v.AuxInt = int32ToAuxInt(int32(c + 16))
15357 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32)
15358 v0.AuxInt = int32ToAuxInt(16)
15359 v0.AddArg(x)
15360 v.AddArg(v0)
15361 return true
15362 }
15363
15364
15365
15366 for {
15367 x := v_0
15368 if v_1.Op != OpConst64 {
15369 break
15370 }
15371 c := auxIntToInt64(v_1.AuxInt)
15372 if !(uint64(c) >= 16) {
15373 break
15374 }
15375 v.reset(OpARMSRAconst)
15376 v.AuxInt = int32ToAuxInt(31)
15377 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32)
15378 v0.AuxInt = int32ToAuxInt(16)
15379 v0.AddArg(x)
15380 v.AddArg(v0)
15381 return true
15382 }
15383 return false
15384 }
15385 func rewriteValueARM_OpRsh16x8(v *Value) bool {
15386 v_1 := v.Args[1]
15387 v_0 := v.Args[0]
15388 b := v.Block
15389 typ := &b.Func.Config.Types
15390
15391
15392 for {
15393 x := v_0
15394 y := v_1
15395 v.reset(OpARMSRA)
15396 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
15397 v0.AddArg(x)
15398 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15399 v1.AddArg(y)
15400 v.AddArg2(v0, v1)
15401 return true
15402 }
15403 }
15404 func rewriteValueARM_OpRsh32Ux16(v *Value) bool {
15405 v_1 := v.Args[1]
15406 v_0 := v.Args[0]
15407 b := v.Block
15408 typ := &b.Func.Config.Types
15409
15410
15411 for {
15412 x := v_0
15413 y := v_1
15414 v.reset(OpARMCMOVWHSconst)
15415 v.AuxInt = int32ToAuxInt(0)
15416 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
15417 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15418 v1.AddArg(y)
15419 v0.AddArg2(x, v1)
15420 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15421 v2.AuxInt = int32ToAuxInt(256)
15422 v2.AddArg(v1)
15423 v.AddArg2(v0, v2)
15424 return true
15425 }
15426 }
15427 func rewriteValueARM_OpRsh32Ux32(v *Value) bool {
15428 v_1 := v.Args[1]
15429 v_0 := v.Args[0]
15430 b := v.Block
15431
15432
15433 for {
15434 x := v_0
15435 y := v_1
15436 v.reset(OpARMCMOVWHSconst)
15437 v.AuxInt = int32ToAuxInt(0)
15438 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
15439 v0.AddArg2(x, y)
15440 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15441 v1.AuxInt = int32ToAuxInt(256)
15442 v1.AddArg(y)
15443 v.AddArg2(v0, v1)
15444 return true
15445 }
15446 }
15447 func rewriteValueARM_OpRsh32Ux64(v *Value) bool {
15448 v_1 := v.Args[1]
15449 v_0 := v.Args[0]
15450
15451
15452
15453 for {
15454 x := v_0
15455 if v_1.Op != OpConst64 {
15456 break
15457 }
15458 c := auxIntToInt64(v_1.AuxInt)
15459 if !(uint64(c) < 32) {
15460 break
15461 }
15462 v.reset(OpARMSRLconst)
15463 v.AuxInt = int32ToAuxInt(int32(c))
15464 v.AddArg(x)
15465 return true
15466 }
15467
15468
15469
15470 for {
15471 if v_1.Op != OpConst64 {
15472 break
15473 }
15474 c := auxIntToInt64(v_1.AuxInt)
15475 if !(uint64(c) >= 32) {
15476 break
15477 }
15478 v.reset(OpConst32)
15479 v.AuxInt = int32ToAuxInt(0)
15480 return true
15481 }
15482 return false
15483 }
15484 func rewriteValueARM_OpRsh32Ux8(v *Value) bool {
15485 v_1 := v.Args[1]
15486 v_0 := v.Args[0]
15487 b := v.Block
15488 typ := &b.Func.Config.Types
15489
15490
15491 for {
15492 x := v_0
15493 y := v_1
15494 v.reset(OpARMSRL)
15495 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15496 v0.AddArg(y)
15497 v.AddArg2(x, v0)
15498 return true
15499 }
15500 }
15501 func rewriteValueARM_OpRsh32x16(v *Value) bool {
15502 v_1 := v.Args[1]
15503 v_0 := v.Args[0]
15504 b := v.Block
15505 typ := &b.Func.Config.Types
15506
15507
15508 for {
15509 x := v_0
15510 y := v_1
15511 v.reset(OpARMSRAcond)
15512 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15513 v0.AddArg(y)
15514 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15515 v1.AuxInt = int32ToAuxInt(256)
15516 v1.AddArg(v0)
15517 v.AddArg3(x, v0, v1)
15518 return true
15519 }
15520 }
15521 func rewriteValueARM_OpRsh32x32(v *Value) bool {
15522 v_1 := v.Args[1]
15523 v_0 := v.Args[0]
15524 b := v.Block
15525
15526
15527 for {
15528 x := v_0
15529 y := v_1
15530 v.reset(OpARMSRAcond)
15531 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15532 v0.AuxInt = int32ToAuxInt(256)
15533 v0.AddArg(y)
15534 v.AddArg3(x, y, v0)
15535 return true
15536 }
15537 }
15538 func rewriteValueARM_OpRsh32x64(v *Value) bool {
15539 v_1 := v.Args[1]
15540 v_0 := v.Args[0]
15541
15542
15543
15544 for {
15545 x := v_0
15546 if v_1.Op != OpConst64 {
15547 break
15548 }
15549 c := auxIntToInt64(v_1.AuxInt)
15550 if !(uint64(c) < 32) {
15551 break
15552 }
15553 v.reset(OpARMSRAconst)
15554 v.AuxInt = int32ToAuxInt(int32(c))
15555 v.AddArg(x)
15556 return true
15557 }
15558
15559
15560
15561 for {
15562 x := v_0
15563 if v_1.Op != OpConst64 {
15564 break
15565 }
15566 c := auxIntToInt64(v_1.AuxInt)
15567 if !(uint64(c) >= 32) {
15568 break
15569 }
15570 v.reset(OpARMSRAconst)
15571 v.AuxInt = int32ToAuxInt(31)
15572 v.AddArg(x)
15573 return true
15574 }
15575 return false
15576 }
15577 func rewriteValueARM_OpRsh32x8(v *Value) bool {
15578 v_1 := v.Args[1]
15579 v_0 := v.Args[0]
15580 b := v.Block
15581 typ := &b.Func.Config.Types
15582
15583
15584 for {
15585 x := v_0
15586 y := v_1
15587 v.reset(OpARMSRA)
15588 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15589 v0.AddArg(y)
15590 v.AddArg2(x, v0)
15591 return true
15592 }
15593 }
15594 func rewriteValueARM_OpRsh8Ux16(v *Value) bool {
15595 v_1 := v.Args[1]
15596 v_0 := v.Args[0]
15597 b := v.Block
15598 typ := &b.Func.Config.Types
15599
15600
15601 for {
15602 x := v_0
15603 y := v_1
15604 v.reset(OpARMCMOVWHSconst)
15605 v.AuxInt = int32ToAuxInt(0)
15606 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
15607 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15608 v1.AddArg(x)
15609 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15610 v2.AddArg(y)
15611 v0.AddArg2(v1, v2)
15612 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15613 v3.AuxInt = int32ToAuxInt(256)
15614 v3.AddArg(v2)
15615 v.AddArg2(v0, v3)
15616 return true
15617 }
15618 }
15619 func rewriteValueARM_OpRsh8Ux32(v *Value) bool {
15620 v_1 := v.Args[1]
15621 v_0 := v.Args[0]
15622 b := v.Block
15623 typ := &b.Func.Config.Types
15624
15625
15626 for {
15627 x := v_0
15628 y := v_1
15629 v.reset(OpARMCMOVWHSconst)
15630 v.AuxInt = int32ToAuxInt(0)
15631 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
15632 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15633 v1.AddArg(x)
15634 v0.AddArg2(v1, y)
15635 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15636 v2.AuxInt = int32ToAuxInt(256)
15637 v2.AddArg(y)
15638 v.AddArg2(v0, v2)
15639 return true
15640 }
15641 }
15642 func rewriteValueARM_OpRsh8Ux64(v *Value) bool {
15643 v_1 := v.Args[1]
15644 v_0 := v.Args[0]
15645 b := v.Block
15646 typ := &b.Func.Config.Types
15647
15648
15649
15650 for {
15651 x := v_0
15652 if v_1.Op != OpConst64 {
15653 break
15654 }
15655 c := auxIntToInt64(v_1.AuxInt)
15656 if !(uint64(c) < 8) {
15657 break
15658 }
15659 v.reset(OpARMSRLconst)
15660 v.AuxInt = int32ToAuxInt(int32(c + 24))
15661 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32)
15662 v0.AuxInt = int32ToAuxInt(24)
15663 v0.AddArg(x)
15664 v.AddArg(v0)
15665 return true
15666 }
15667
15668
15669
15670 for {
15671 if v_1.Op != OpConst64 {
15672 break
15673 }
15674 c := auxIntToInt64(v_1.AuxInt)
15675 if !(uint64(c) >= 8) {
15676 break
15677 }
15678 v.reset(OpConst8)
15679 v.AuxInt = int8ToAuxInt(0)
15680 return true
15681 }
15682 return false
15683 }
15684 func rewriteValueARM_OpRsh8Ux8(v *Value) bool {
15685 v_1 := v.Args[1]
15686 v_0 := v.Args[0]
15687 b := v.Block
15688 typ := &b.Func.Config.Types
15689
15690
15691 for {
15692 x := v_0
15693 y := v_1
15694 v.reset(OpARMSRL)
15695 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15696 v0.AddArg(x)
15697 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15698 v1.AddArg(y)
15699 v.AddArg2(v0, v1)
15700 return true
15701 }
15702 }
15703 func rewriteValueARM_OpRsh8x16(v *Value) bool {
15704 v_1 := v.Args[1]
15705 v_0 := v.Args[0]
15706 b := v.Block
15707 typ := &b.Func.Config.Types
15708
15709
15710 for {
15711 x := v_0
15712 y := v_1
15713 v.reset(OpARMSRAcond)
15714 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
15715 v0.AddArg(x)
15716 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15717 v1.AddArg(y)
15718 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15719 v2.AuxInt = int32ToAuxInt(256)
15720 v2.AddArg(v1)
15721 v.AddArg3(v0, v1, v2)
15722 return true
15723 }
15724 }
15725 func rewriteValueARM_OpRsh8x32(v *Value) bool {
15726 v_1 := v.Args[1]
15727 v_0 := v.Args[0]
15728 b := v.Block
15729 typ := &b.Func.Config.Types
15730
15731
15732 for {
15733 x := v_0
15734 y := v_1
15735 v.reset(OpARMSRAcond)
15736 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
15737 v0.AddArg(x)
15738 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15739 v1.AuxInt = int32ToAuxInt(256)
15740 v1.AddArg(y)
15741 v.AddArg3(v0, y, v1)
15742 return true
15743 }
15744 }
15745 func rewriteValueARM_OpRsh8x64(v *Value) bool {
15746 v_1 := v.Args[1]
15747 v_0 := v.Args[0]
15748 b := v.Block
15749 typ := &b.Func.Config.Types
15750
15751
15752
15753 for {
15754 x := v_0
15755 if v_1.Op != OpConst64 {
15756 break
15757 }
15758 c := auxIntToInt64(v_1.AuxInt)
15759 if !(uint64(c) < 8) {
15760 break
15761 }
15762 v.reset(OpARMSRAconst)
15763 v.AuxInt = int32ToAuxInt(int32(c + 24))
15764 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32)
15765 v0.AuxInt = int32ToAuxInt(24)
15766 v0.AddArg(x)
15767 v.AddArg(v0)
15768 return true
15769 }
15770
15771
15772
15773 for {
15774 x := v_0
15775 if v_1.Op != OpConst64 {
15776 break
15777 }
15778 c := auxIntToInt64(v_1.AuxInt)
15779 if !(uint64(c) >= 8) {
15780 break
15781 }
15782 v.reset(OpARMSRAconst)
15783 v.AuxInt = int32ToAuxInt(31)
15784 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32)
15785 v0.AuxInt = int32ToAuxInt(24)
15786 v0.AddArg(x)
15787 v.AddArg(v0)
15788 return true
15789 }
15790 return false
15791 }
15792 func rewriteValueARM_OpRsh8x8(v *Value) bool {
15793 v_1 := v.Args[1]
15794 v_0 := v.Args[0]
15795 b := v.Block
15796 typ := &b.Func.Config.Types
15797
15798
15799 for {
15800 x := v_0
15801 y := v_1
15802 v.reset(OpARMSRA)
15803 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
15804 v0.AddArg(x)
15805 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15806 v1.AddArg(y)
15807 v.AddArg2(v0, v1)
15808 return true
15809 }
15810 }
15811 func rewriteValueARM_OpSelect0(v *Value) bool {
15812 v_0 := v.Args[0]
15813
15814
15815 for {
15816 if v_0.Op != OpARMCALLudiv {
15817 break
15818 }
15819 _ = v_0.Args[1]
15820 x := v_0.Args[0]
15821 v_0_1 := v_0.Args[1]
15822 if v_0_1.Op != OpARMMOVWconst || auxIntToInt32(v_0_1.AuxInt) != 1 {
15823 break
15824 }
15825 v.copyOf(x)
15826 return true
15827 }
15828
15829
15830
15831 for {
15832 if v_0.Op != OpARMCALLudiv {
15833 break
15834 }
15835 _ = v_0.Args[1]
15836 x := v_0.Args[0]
15837 v_0_1 := v_0.Args[1]
15838 if v_0_1.Op != OpARMMOVWconst {
15839 break
15840 }
15841 c := auxIntToInt32(v_0_1.AuxInt)
15842 if !(isPowerOfTwo(c)) {
15843 break
15844 }
15845 v.reset(OpARMSRLconst)
15846 v.AuxInt = int32ToAuxInt(int32(log32(c)))
15847 v.AddArg(x)
15848 return true
15849 }
15850
15851
15852
15853 for {
15854 if v_0.Op != OpARMCALLudiv {
15855 break
15856 }
15857 _ = v_0.Args[1]
15858 v_0_0 := v_0.Args[0]
15859 if v_0_0.Op != OpARMMOVWconst {
15860 break
15861 }
15862 c := auxIntToInt32(v_0_0.AuxInt)
15863 v_0_1 := v_0.Args[1]
15864 if v_0_1.Op != OpARMMOVWconst {
15865 break
15866 }
15867 d := auxIntToInt32(v_0_1.AuxInt)
15868 if !(d != 0) {
15869 break
15870 }
15871 v.reset(OpARMMOVWconst)
15872 v.AuxInt = int32ToAuxInt(int32(uint32(c) / uint32(d)))
15873 return true
15874 }
15875 return false
15876 }
15877 func rewriteValueARM_OpSelect1(v *Value) bool {
15878 v_0 := v.Args[0]
15879
15880
15881 for {
15882 if v_0.Op != OpARMCALLudiv {
15883 break
15884 }
15885 _ = v_0.Args[1]
15886 v_0_1 := v_0.Args[1]
15887 if v_0_1.Op != OpARMMOVWconst || auxIntToInt32(v_0_1.AuxInt) != 1 {
15888 break
15889 }
15890 v.reset(OpARMMOVWconst)
15891 v.AuxInt = int32ToAuxInt(0)
15892 return true
15893 }
15894
15895
15896
15897 for {
15898 if v_0.Op != OpARMCALLudiv {
15899 break
15900 }
15901 _ = v_0.Args[1]
15902 x := v_0.Args[0]
15903 v_0_1 := v_0.Args[1]
15904 if v_0_1.Op != OpARMMOVWconst {
15905 break
15906 }
15907 c := auxIntToInt32(v_0_1.AuxInt)
15908 if !(isPowerOfTwo(c)) {
15909 break
15910 }
15911 v.reset(OpARMANDconst)
15912 v.AuxInt = int32ToAuxInt(c - 1)
15913 v.AddArg(x)
15914 return true
15915 }
15916
15917
15918
15919 for {
15920 if v_0.Op != OpARMCALLudiv {
15921 break
15922 }
15923 _ = v_0.Args[1]
15924 v_0_0 := v_0.Args[0]
15925 if v_0_0.Op != OpARMMOVWconst {
15926 break
15927 }
15928 c := auxIntToInt32(v_0_0.AuxInt)
15929 v_0_1 := v_0.Args[1]
15930 if v_0_1.Op != OpARMMOVWconst {
15931 break
15932 }
15933 d := auxIntToInt32(v_0_1.AuxInt)
15934 if !(d != 0) {
15935 break
15936 }
15937 v.reset(OpARMMOVWconst)
15938 v.AuxInt = int32ToAuxInt(int32(uint32(c) % uint32(d)))
15939 return true
15940 }
15941 return false
15942 }
15943 func rewriteValueARM_OpSignmask(v *Value) bool {
15944 v_0 := v.Args[0]
15945
15946
15947 for {
15948 x := v_0
15949 v.reset(OpARMSRAconst)
15950 v.AuxInt = int32ToAuxInt(31)
15951 v.AddArg(x)
15952 return true
15953 }
15954 }
15955 func rewriteValueARM_OpSlicemask(v *Value) bool {
15956 v_0 := v.Args[0]
15957 b := v.Block
15958
15959
15960 for {
15961 t := v.Type
15962 x := v_0
15963 v.reset(OpARMSRAconst)
15964 v.AuxInt = int32ToAuxInt(31)
15965 v0 := b.NewValue0(v.Pos, OpARMRSBconst, t)
15966 v0.AuxInt = int32ToAuxInt(0)
15967 v0.AddArg(x)
15968 v.AddArg(v0)
15969 return true
15970 }
15971 }
15972 func rewriteValueARM_OpStore(v *Value) bool {
15973 v_2 := v.Args[2]
15974 v_1 := v.Args[1]
15975 v_0 := v.Args[0]
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() == 1) {
15985 break
15986 }
15987 v.reset(OpARMMOVBstore)
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() == 2) {
16000 break
16001 }
16002 v.reset(OpARMMOVHstore)
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() == 4 && !t.IsFloat()) {
16015 break
16016 }
16017 v.reset(OpARMMOVWstore)
16018 v.AddArg3(ptr, val, mem)
16019 return true
16020 }
16021
16022
16023
16024 for {
16025 t := auxToType(v.Aux)
16026 ptr := v_0
16027 val := v_1
16028 mem := v_2
16029 if !(t.Size() == 4 && t.IsFloat()) {
16030 break
16031 }
16032 v.reset(OpARMMOVFstore)
16033 v.AddArg3(ptr, val, mem)
16034 return true
16035 }
16036
16037
16038
16039 for {
16040 t := auxToType(v.Aux)
16041 ptr := v_0
16042 val := v_1
16043 mem := v_2
16044 if !(t.Size() == 8 && t.IsFloat()) {
16045 break
16046 }
16047 v.reset(OpARMMOVDstore)
16048 v.AddArg3(ptr, val, mem)
16049 return true
16050 }
16051 return false
16052 }
16053 func rewriteValueARM_OpZero(v *Value) bool {
16054 v_1 := v.Args[1]
16055 v_0 := v.Args[0]
16056 b := v.Block
16057 config := b.Func.Config
16058 typ := &b.Func.Config.Types
16059
16060
16061 for {
16062 if auxIntToInt64(v.AuxInt) != 0 {
16063 break
16064 }
16065 mem := v_1
16066 v.copyOf(mem)
16067 return true
16068 }
16069
16070
16071 for {
16072 if auxIntToInt64(v.AuxInt) != 1 {
16073 break
16074 }
16075 ptr := v_0
16076 mem := v_1
16077 v.reset(OpARMMOVBstore)
16078 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16079 v0.AuxInt = int32ToAuxInt(0)
16080 v.AddArg3(ptr, v0, mem)
16081 return true
16082 }
16083
16084
16085
16086 for {
16087 if auxIntToInt64(v.AuxInt) != 2 {
16088 break
16089 }
16090 t := auxToType(v.Aux)
16091 ptr := v_0
16092 mem := v_1
16093 if !(t.Alignment()%2 == 0) {
16094 break
16095 }
16096 v.reset(OpARMMOVHstore)
16097 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16098 v0.AuxInt = int32ToAuxInt(0)
16099 v.AddArg3(ptr, v0, mem)
16100 return true
16101 }
16102
16103
16104 for {
16105 if auxIntToInt64(v.AuxInt) != 2 {
16106 break
16107 }
16108 ptr := v_0
16109 mem := v_1
16110 v.reset(OpARMMOVBstore)
16111 v.AuxInt = int32ToAuxInt(1)
16112 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16113 v0.AuxInt = int32ToAuxInt(0)
16114 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
16115 v1.AuxInt = int32ToAuxInt(0)
16116 v1.AddArg3(ptr, v0, mem)
16117 v.AddArg3(ptr, v0, v1)
16118 return true
16119 }
16120
16121
16122
16123 for {
16124 if auxIntToInt64(v.AuxInt) != 4 {
16125 break
16126 }
16127 t := auxToType(v.Aux)
16128 ptr := v_0
16129 mem := v_1
16130 if !(t.Alignment()%4 == 0) {
16131 break
16132 }
16133 v.reset(OpARMMOVWstore)
16134 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16135 v0.AuxInt = int32ToAuxInt(0)
16136 v.AddArg3(ptr, v0, mem)
16137 return true
16138 }
16139
16140
16141
16142 for {
16143 if auxIntToInt64(v.AuxInt) != 4 {
16144 break
16145 }
16146 t := auxToType(v.Aux)
16147 ptr := v_0
16148 mem := v_1
16149 if !(t.Alignment()%2 == 0) {
16150 break
16151 }
16152 v.reset(OpARMMOVHstore)
16153 v.AuxInt = int32ToAuxInt(2)
16154 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16155 v0.AuxInt = int32ToAuxInt(0)
16156 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem)
16157 v1.AuxInt = int32ToAuxInt(0)
16158 v1.AddArg3(ptr, v0, mem)
16159 v.AddArg3(ptr, v0, v1)
16160 return true
16161 }
16162
16163
16164 for {
16165 if auxIntToInt64(v.AuxInt) != 4 {
16166 break
16167 }
16168 ptr := v_0
16169 mem := v_1
16170 v.reset(OpARMMOVBstore)
16171 v.AuxInt = int32ToAuxInt(3)
16172 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16173 v0.AuxInt = int32ToAuxInt(0)
16174 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
16175 v1.AuxInt = int32ToAuxInt(2)
16176 v2 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
16177 v2.AuxInt = int32ToAuxInt(1)
16178 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
16179 v3.AuxInt = int32ToAuxInt(0)
16180 v3.AddArg3(ptr, v0, mem)
16181 v2.AddArg3(ptr, v0, v3)
16182 v1.AddArg3(ptr, v0, v2)
16183 v.AddArg3(ptr, v0, v1)
16184 return true
16185 }
16186
16187
16188 for {
16189 if auxIntToInt64(v.AuxInt) != 3 {
16190 break
16191 }
16192 ptr := v_0
16193 mem := v_1
16194 v.reset(OpARMMOVBstore)
16195 v.AuxInt = int32ToAuxInt(2)
16196 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16197 v0.AuxInt = int32ToAuxInt(0)
16198 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
16199 v1.AuxInt = int32ToAuxInt(1)
16200 v2 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
16201 v2.AuxInt = int32ToAuxInt(0)
16202 v2.AddArg3(ptr, v0, mem)
16203 v1.AddArg3(ptr, v0, v2)
16204 v.AddArg3(ptr, v0, v1)
16205 return true
16206 }
16207
16208
16209
16210 for {
16211 s := auxIntToInt64(v.AuxInt)
16212 t := auxToType(v.Aux)
16213 ptr := v_0
16214 mem := v_1
16215 if !(s%4 == 0 && s > 4 && s <= 512 && t.Alignment()%4 == 0) {
16216 break
16217 }
16218 v.reset(OpARMDUFFZERO)
16219 v.AuxInt = int64ToAuxInt(4 * (128 - s/4))
16220 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16221 v0.AuxInt = int32ToAuxInt(0)
16222 v.AddArg3(ptr, v0, mem)
16223 return true
16224 }
16225
16226
16227
16228 for {
16229 s := auxIntToInt64(v.AuxInt)
16230 t := auxToType(v.Aux)
16231 ptr := v_0
16232 mem := v_1
16233 if !(s > 512 || t.Alignment()%4 != 0) {
16234 break
16235 }
16236 v.reset(OpARMLoweredZero)
16237 v.AuxInt = int64ToAuxInt(t.Alignment())
16238 v0 := b.NewValue0(v.Pos, OpARMADDconst, ptr.Type)
16239 v0.AuxInt = int32ToAuxInt(int32(s - moveSize(t.Alignment(), config)))
16240 v0.AddArg(ptr)
16241 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16242 v1.AuxInt = int32ToAuxInt(0)
16243 v.AddArg4(ptr, v0, v1, mem)
16244 return true
16245 }
16246 return false
16247 }
16248 func rewriteValueARM_OpZeromask(v *Value) bool {
16249 v_0 := v.Args[0]
16250 b := v.Block
16251 typ := &b.Func.Config.Types
16252
16253
16254 for {
16255 x := v_0
16256 v.reset(OpARMSRAconst)
16257 v.AuxInt = int32ToAuxInt(31)
16258 v0 := b.NewValue0(v.Pos, OpARMRSBshiftRL, typ.Int32)
16259 v0.AuxInt = int32ToAuxInt(1)
16260 v0.AddArg2(x, x)
16261 v.AddArg(v0)
16262 return true
16263 }
16264 }
16265 func rewriteBlockARM(b *Block) bool {
16266 switch b.Kind {
16267 case BlockARMEQ:
16268
16269
16270
16271 for b.Controls[0].Op == OpARMFlagConstant {
16272 v_0 := b.Controls[0]
16273 fc := auxIntToFlagConstant(v_0.AuxInt)
16274 if !(fc.eq()) {
16275 break
16276 }
16277 b.Reset(BlockFirst)
16278 return true
16279 }
16280
16281
16282
16283 for b.Controls[0].Op == OpARMFlagConstant {
16284 v_0 := b.Controls[0]
16285 fc := auxIntToFlagConstant(v_0.AuxInt)
16286 if !(!fc.eq()) {
16287 break
16288 }
16289 b.Reset(BlockFirst)
16290 b.swapSuccessors()
16291 return true
16292 }
16293
16294
16295 for b.Controls[0].Op == OpARMInvertFlags {
16296 v_0 := b.Controls[0]
16297 cmp := v_0.Args[0]
16298 b.resetWithControl(BlockARMEQ, cmp)
16299 return true
16300 }
16301
16302
16303 for b.Controls[0].Op == OpARMCMP {
16304 v_0 := b.Controls[0]
16305 _ = v_0.Args[1]
16306 x := v_0.Args[0]
16307 v_0_1 := v_0.Args[1]
16308 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 {
16309 break
16310 }
16311 y := v_0_1.Args[0]
16312 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
16313 v0.AddArg2(x, y)
16314 b.resetWithControl(BlockARMEQ, v0)
16315 return true
16316 }
16317
16318
16319 for b.Controls[0].Op == OpARMCMN {
16320 v_0 := b.Controls[0]
16321 _ = v_0.Args[1]
16322 v_0_0 := v_0.Args[0]
16323 v_0_1 := v_0.Args[1]
16324 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
16325 x := v_0_0
16326 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 {
16327 continue
16328 }
16329 y := v_0_1.Args[0]
16330 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
16331 v0.AddArg2(x, y)
16332 b.resetWithControl(BlockARMEQ, v0)
16333 return true
16334 }
16335 break
16336 }
16337
16338
16339
16340 for b.Controls[0].Op == OpARMCMPconst {
16341 v_0 := b.Controls[0]
16342 if auxIntToInt32(v_0.AuxInt) != 0 {
16343 break
16344 }
16345 l := v_0.Args[0]
16346 if l.Op != OpARMSUB {
16347 break
16348 }
16349 y := l.Args[1]
16350 x := l.Args[0]
16351 if !(l.Uses == 1) {
16352 break
16353 }
16354 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
16355 v0.AddArg2(x, y)
16356 b.resetWithControl(BlockARMEQ, v0)
16357 return true
16358 }
16359
16360
16361
16362 for b.Controls[0].Op == OpARMCMPconst {
16363 v_0 := b.Controls[0]
16364 if auxIntToInt32(v_0.AuxInt) != 0 {
16365 break
16366 }
16367 l := v_0.Args[0]
16368 if l.Op != OpARMMULS {
16369 break
16370 }
16371 a := l.Args[2]
16372 x := l.Args[0]
16373 y := l.Args[1]
16374 if !(l.Uses == 1) {
16375 break
16376 }
16377 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
16378 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
16379 v1.AddArg2(x, y)
16380 v0.AddArg2(a, v1)
16381 b.resetWithControl(BlockARMEQ, v0)
16382 return true
16383 }
16384
16385
16386
16387 for b.Controls[0].Op == OpARMCMPconst {
16388 v_0 := b.Controls[0]
16389 if auxIntToInt32(v_0.AuxInt) != 0 {
16390 break
16391 }
16392 l := v_0.Args[0]
16393 if l.Op != OpARMSUBconst {
16394 break
16395 }
16396 c := auxIntToInt32(l.AuxInt)
16397 x := l.Args[0]
16398 if !(l.Uses == 1) {
16399 break
16400 }
16401 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags)
16402 v0.AuxInt = int32ToAuxInt(c)
16403 v0.AddArg(x)
16404 b.resetWithControl(BlockARMEQ, v0)
16405 return true
16406 }
16407
16408
16409
16410 for b.Controls[0].Op == OpARMCMPconst {
16411 v_0 := b.Controls[0]
16412 if auxIntToInt32(v_0.AuxInt) != 0 {
16413 break
16414 }
16415 l := v_0.Args[0]
16416 if l.Op != OpARMSUBshiftLL {
16417 break
16418 }
16419 c := auxIntToInt32(l.AuxInt)
16420 y := l.Args[1]
16421 x := l.Args[0]
16422 if !(l.Uses == 1) {
16423 break
16424 }
16425 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags)
16426 v0.AuxInt = int32ToAuxInt(c)
16427 v0.AddArg2(x, y)
16428 b.resetWithControl(BlockARMEQ, v0)
16429 return true
16430 }
16431
16432
16433
16434 for b.Controls[0].Op == OpARMCMPconst {
16435 v_0 := b.Controls[0]
16436 if auxIntToInt32(v_0.AuxInt) != 0 {
16437 break
16438 }
16439 l := v_0.Args[0]
16440 if l.Op != OpARMSUBshiftRL {
16441 break
16442 }
16443 c := auxIntToInt32(l.AuxInt)
16444 y := l.Args[1]
16445 x := l.Args[0]
16446 if !(l.Uses == 1) {
16447 break
16448 }
16449 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags)
16450 v0.AuxInt = int32ToAuxInt(c)
16451 v0.AddArg2(x, y)
16452 b.resetWithControl(BlockARMEQ, v0)
16453 return true
16454 }
16455
16456
16457
16458 for b.Controls[0].Op == OpARMCMPconst {
16459 v_0 := b.Controls[0]
16460 if auxIntToInt32(v_0.AuxInt) != 0 {
16461 break
16462 }
16463 l := v_0.Args[0]
16464 if l.Op != OpARMSUBshiftRA {
16465 break
16466 }
16467 c := auxIntToInt32(l.AuxInt)
16468 y := l.Args[1]
16469 x := l.Args[0]
16470 if !(l.Uses == 1) {
16471 break
16472 }
16473 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags)
16474 v0.AuxInt = int32ToAuxInt(c)
16475 v0.AddArg2(x, y)
16476 b.resetWithControl(BlockARMEQ, v0)
16477 return true
16478 }
16479
16480
16481
16482 for b.Controls[0].Op == OpARMCMPconst {
16483 v_0 := b.Controls[0]
16484 if auxIntToInt32(v_0.AuxInt) != 0 {
16485 break
16486 }
16487 l := v_0.Args[0]
16488 if l.Op != OpARMSUBshiftLLreg {
16489 break
16490 }
16491 z := l.Args[2]
16492 x := l.Args[0]
16493 y := l.Args[1]
16494 if !(l.Uses == 1) {
16495 break
16496 }
16497 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
16498 v0.AddArg3(x, y, z)
16499 b.resetWithControl(BlockARMEQ, v0)
16500 return true
16501 }
16502
16503
16504
16505 for b.Controls[0].Op == OpARMCMPconst {
16506 v_0 := b.Controls[0]
16507 if auxIntToInt32(v_0.AuxInt) != 0 {
16508 break
16509 }
16510 l := v_0.Args[0]
16511 if l.Op != OpARMSUBshiftRLreg {
16512 break
16513 }
16514 z := l.Args[2]
16515 x := l.Args[0]
16516 y := l.Args[1]
16517 if !(l.Uses == 1) {
16518 break
16519 }
16520 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
16521 v0.AddArg3(x, y, z)
16522 b.resetWithControl(BlockARMEQ, v0)
16523 return true
16524 }
16525
16526
16527
16528 for b.Controls[0].Op == OpARMCMPconst {
16529 v_0 := b.Controls[0]
16530 if auxIntToInt32(v_0.AuxInt) != 0 {
16531 break
16532 }
16533 l := v_0.Args[0]
16534 if l.Op != OpARMSUBshiftRAreg {
16535 break
16536 }
16537 z := l.Args[2]
16538 x := l.Args[0]
16539 y := l.Args[1]
16540 if !(l.Uses == 1) {
16541 break
16542 }
16543 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
16544 v0.AddArg3(x, y, z)
16545 b.resetWithControl(BlockARMEQ, v0)
16546 return true
16547 }
16548
16549
16550
16551 for b.Controls[0].Op == OpARMCMPconst {
16552 v_0 := b.Controls[0]
16553 if auxIntToInt32(v_0.AuxInt) != 0 {
16554 break
16555 }
16556 l := v_0.Args[0]
16557 if l.Op != OpARMADD {
16558 break
16559 }
16560 _ = l.Args[1]
16561 l_0 := l.Args[0]
16562 l_1 := l.Args[1]
16563 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
16564 x := l_0
16565 y := l_1
16566 if !(l.Uses == 1) {
16567 continue
16568 }
16569 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
16570 v0.AddArg2(x, y)
16571 b.resetWithControl(BlockARMEQ, v0)
16572 return true
16573 }
16574 break
16575 }
16576
16577
16578
16579 for b.Controls[0].Op == OpARMCMPconst {
16580 v_0 := b.Controls[0]
16581 if auxIntToInt32(v_0.AuxInt) != 0 {
16582 break
16583 }
16584 l := v_0.Args[0]
16585 if l.Op != OpARMMULA {
16586 break
16587 }
16588 a := l.Args[2]
16589 x := l.Args[0]
16590 y := l.Args[1]
16591 if !(l.Uses == 1) {
16592 break
16593 }
16594 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
16595 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
16596 v1.AddArg2(x, y)
16597 v0.AddArg2(a, v1)
16598 b.resetWithControl(BlockARMEQ, v0)
16599 return true
16600 }
16601
16602
16603
16604 for b.Controls[0].Op == OpARMCMPconst {
16605 v_0 := b.Controls[0]
16606 if auxIntToInt32(v_0.AuxInt) != 0 {
16607 break
16608 }
16609 l := v_0.Args[0]
16610 if l.Op != OpARMADDconst {
16611 break
16612 }
16613 c := auxIntToInt32(l.AuxInt)
16614 x := l.Args[0]
16615 if !(l.Uses == 1) {
16616 break
16617 }
16618 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags)
16619 v0.AuxInt = int32ToAuxInt(c)
16620 v0.AddArg(x)
16621 b.resetWithControl(BlockARMEQ, v0)
16622 return true
16623 }
16624
16625
16626
16627 for b.Controls[0].Op == OpARMCMPconst {
16628 v_0 := b.Controls[0]
16629 if auxIntToInt32(v_0.AuxInt) != 0 {
16630 break
16631 }
16632 l := v_0.Args[0]
16633 if l.Op != OpARMADDshiftLL {
16634 break
16635 }
16636 c := auxIntToInt32(l.AuxInt)
16637 y := l.Args[1]
16638 x := l.Args[0]
16639 if !(l.Uses == 1) {
16640 break
16641 }
16642 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags)
16643 v0.AuxInt = int32ToAuxInt(c)
16644 v0.AddArg2(x, y)
16645 b.resetWithControl(BlockARMEQ, v0)
16646 return true
16647 }
16648
16649
16650
16651 for b.Controls[0].Op == OpARMCMPconst {
16652 v_0 := b.Controls[0]
16653 if auxIntToInt32(v_0.AuxInt) != 0 {
16654 break
16655 }
16656 l := v_0.Args[0]
16657 if l.Op != OpARMADDshiftRL {
16658 break
16659 }
16660 c := auxIntToInt32(l.AuxInt)
16661 y := l.Args[1]
16662 x := l.Args[0]
16663 if !(l.Uses == 1) {
16664 break
16665 }
16666 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags)
16667 v0.AuxInt = int32ToAuxInt(c)
16668 v0.AddArg2(x, y)
16669 b.resetWithControl(BlockARMEQ, v0)
16670 return true
16671 }
16672
16673
16674
16675 for b.Controls[0].Op == OpARMCMPconst {
16676 v_0 := b.Controls[0]
16677 if auxIntToInt32(v_0.AuxInt) != 0 {
16678 break
16679 }
16680 l := v_0.Args[0]
16681 if l.Op != OpARMADDshiftRA {
16682 break
16683 }
16684 c := auxIntToInt32(l.AuxInt)
16685 y := l.Args[1]
16686 x := l.Args[0]
16687 if !(l.Uses == 1) {
16688 break
16689 }
16690 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags)
16691 v0.AuxInt = int32ToAuxInt(c)
16692 v0.AddArg2(x, y)
16693 b.resetWithControl(BlockARMEQ, v0)
16694 return true
16695 }
16696
16697
16698
16699 for b.Controls[0].Op == OpARMCMPconst {
16700 v_0 := b.Controls[0]
16701 if auxIntToInt32(v_0.AuxInt) != 0 {
16702 break
16703 }
16704 l := v_0.Args[0]
16705 if l.Op != OpARMADDshiftLLreg {
16706 break
16707 }
16708 z := l.Args[2]
16709 x := l.Args[0]
16710 y := l.Args[1]
16711 if !(l.Uses == 1) {
16712 break
16713 }
16714 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags)
16715 v0.AddArg3(x, y, z)
16716 b.resetWithControl(BlockARMEQ, v0)
16717 return true
16718 }
16719
16720
16721
16722 for b.Controls[0].Op == OpARMCMPconst {
16723 v_0 := b.Controls[0]
16724 if auxIntToInt32(v_0.AuxInt) != 0 {
16725 break
16726 }
16727 l := v_0.Args[0]
16728 if l.Op != OpARMADDshiftRLreg {
16729 break
16730 }
16731 z := l.Args[2]
16732 x := l.Args[0]
16733 y := l.Args[1]
16734 if !(l.Uses == 1) {
16735 break
16736 }
16737 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags)
16738 v0.AddArg3(x, y, z)
16739 b.resetWithControl(BlockARMEQ, v0)
16740 return true
16741 }
16742
16743
16744
16745 for b.Controls[0].Op == OpARMCMPconst {
16746 v_0 := b.Controls[0]
16747 if auxIntToInt32(v_0.AuxInt) != 0 {
16748 break
16749 }
16750 l := v_0.Args[0]
16751 if l.Op != OpARMADDshiftRAreg {
16752 break
16753 }
16754 z := l.Args[2]
16755 x := l.Args[0]
16756 y := l.Args[1]
16757 if !(l.Uses == 1) {
16758 break
16759 }
16760 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags)
16761 v0.AddArg3(x, y, z)
16762 b.resetWithControl(BlockARMEQ, v0)
16763 return true
16764 }
16765
16766
16767
16768 for b.Controls[0].Op == OpARMCMPconst {
16769 v_0 := b.Controls[0]
16770 if auxIntToInt32(v_0.AuxInt) != 0 {
16771 break
16772 }
16773 l := v_0.Args[0]
16774 if l.Op != OpARMAND {
16775 break
16776 }
16777 _ = l.Args[1]
16778 l_0 := l.Args[0]
16779 l_1 := l.Args[1]
16780 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
16781 x := l_0
16782 y := l_1
16783 if !(l.Uses == 1) {
16784 continue
16785 }
16786 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags)
16787 v0.AddArg2(x, y)
16788 b.resetWithControl(BlockARMEQ, v0)
16789 return true
16790 }
16791 break
16792 }
16793
16794
16795
16796 for b.Controls[0].Op == OpARMCMPconst {
16797 v_0 := b.Controls[0]
16798 if auxIntToInt32(v_0.AuxInt) != 0 {
16799 break
16800 }
16801 l := v_0.Args[0]
16802 if l.Op != OpARMANDconst {
16803 break
16804 }
16805 c := auxIntToInt32(l.AuxInt)
16806 x := l.Args[0]
16807 if !(l.Uses == 1) {
16808 break
16809 }
16810 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags)
16811 v0.AuxInt = int32ToAuxInt(c)
16812 v0.AddArg(x)
16813 b.resetWithControl(BlockARMEQ, v0)
16814 return true
16815 }
16816
16817
16818
16819 for b.Controls[0].Op == OpARMCMPconst {
16820 v_0 := b.Controls[0]
16821 if auxIntToInt32(v_0.AuxInt) != 0 {
16822 break
16823 }
16824 l := v_0.Args[0]
16825 if l.Op != OpARMANDshiftLL {
16826 break
16827 }
16828 c := auxIntToInt32(l.AuxInt)
16829 y := l.Args[1]
16830 x := l.Args[0]
16831 if !(l.Uses == 1) {
16832 break
16833 }
16834 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags)
16835 v0.AuxInt = int32ToAuxInt(c)
16836 v0.AddArg2(x, y)
16837 b.resetWithControl(BlockARMEQ, v0)
16838 return true
16839 }
16840
16841
16842
16843 for b.Controls[0].Op == OpARMCMPconst {
16844 v_0 := b.Controls[0]
16845 if auxIntToInt32(v_0.AuxInt) != 0 {
16846 break
16847 }
16848 l := v_0.Args[0]
16849 if l.Op != OpARMANDshiftRL {
16850 break
16851 }
16852 c := auxIntToInt32(l.AuxInt)
16853 y := l.Args[1]
16854 x := l.Args[0]
16855 if !(l.Uses == 1) {
16856 break
16857 }
16858 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags)
16859 v0.AuxInt = int32ToAuxInt(c)
16860 v0.AddArg2(x, y)
16861 b.resetWithControl(BlockARMEQ, v0)
16862 return true
16863 }
16864
16865
16866
16867 for b.Controls[0].Op == OpARMCMPconst {
16868 v_0 := b.Controls[0]
16869 if auxIntToInt32(v_0.AuxInt) != 0 {
16870 break
16871 }
16872 l := v_0.Args[0]
16873 if l.Op != OpARMANDshiftRA {
16874 break
16875 }
16876 c := auxIntToInt32(l.AuxInt)
16877 y := l.Args[1]
16878 x := l.Args[0]
16879 if !(l.Uses == 1) {
16880 break
16881 }
16882 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags)
16883 v0.AuxInt = int32ToAuxInt(c)
16884 v0.AddArg2(x, y)
16885 b.resetWithControl(BlockARMEQ, v0)
16886 return true
16887 }
16888
16889
16890
16891 for b.Controls[0].Op == OpARMCMPconst {
16892 v_0 := b.Controls[0]
16893 if auxIntToInt32(v_0.AuxInt) != 0 {
16894 break
16895 }
16896 l := v_0.Args[0]
16897 if l.Op != OpARMANDshiftLLreg {
16898 break
16899 }
16900 z := l.Args[2]
16901 x := l.Args[0]
16902 y := l.Args[1]
16903 if !(l.Uses == 1) {
16904 break
16905 }
16906 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags)
16907 v0.AddArg3(x, y, z)
16908 b.resetWithControl(BlockARMEQ, v0)
16909 return true
16910 }
16911
16912
16913
16914 for b.Controls[0].Op == OpARMCMPconst {
16915 v_0 := b.Controls[0]
16916 if auxIntToInt32(v_0.AuxInt) != 0 {
16917 break
16918 }
16919 l := v_0.Args[0]
16920 if l.Op != OpARMANDshiftRLreg {
16921 break
16922 }
16923 z := l.Args[2]
16924 x := l.Args[0]
16925 y := l.Args[1]
16926 if !(l.Uses == 1) {
16927 break
16928 }
16929 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags)
16930 v0.AddArg3(x, y, z)
16931 b.resetWithControl(BlockARMEQ, v0)
16932 return true
16933 }
16934
16935
16936
16937 for b.Controls[0].Op == OpARMCMPconst {
16938 v_0 := b.Controls[0]
16939 if auxIntToInt32(v_0.AuxInt) != 0 {
16940 break
16941 }
16942 l := v_0.Args[0]
16943 if l.Op != OpARMANDshiftRAreg {
16944 break
16945 }
16946 z := l.Args[2]
16947 x := l.Args[0]
16948 y := l.Args[1]
16949 if !(l.Uses == 1) {
16950 break
16951 }
16952 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags)
16953 v0.AddArg3(x, y, z)
16954 b.resetWithControl(BlockARMEQ, v0)
16955 return true
16956 }
16957
16958
16959
16960 for b.Controls[0].Op == OpARMCMPconst {
16961 v_0 := b.Controls[0]
16962 if auxIntToInt32(v_0.AuxInt) != 0 {
16963 break
16964 }
16965 l := v_0.Args[0]
16966 if l.Op != OpARMXOR {
16967 break
16968 }
16969 _ = l.Args[1]
16970 l_0 := l.Args[0]
16971 l_1 := l.Args[1]
16972 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
16973 x := l_0
16974 y := l_1
16975 if !(l.Uses == 1) {
16976 continue
16977 }
16978 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags)
16979 v0.AddArg2(x, y)
16980 b.resetWithControl(BlockARMEQ, v0)
16981 return true
16982 }
16983 break
16984 }
16985
16986
16987
16988 for b.Controls[0].Op == OpARMCMPconst {
16989 v_0 := b.Controls[0]
16990 if auxIntToInt32(v_0.AuxInt) != 0 {
16991 break
16992 }
16993 l := v_0.Args[0]
16994 if l.Op != OpARMXORconst {
16995 break
16996 }
16997 c := auxIntToInt32(l.AuxInt)
16998 x := l.Args[0]
16999 if !(l.Uses == 1) {
17000 break
17001 }
17002 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags)
17003 v0.AuxInt = int32ToAuxInt(c)
17004 v0.AddArg(x)
17005 b.resetWithControl(BlockARMEQ, v0)
17006 return true
17007 }
17008
17009
17010
17011 for b.Controls[0].Op == OpARMCMPconst {
17012 v_0 := b.Controls[0]
17013 if auxIntToInt32(v_0.AuxInt) != 0 {
17014 break
17015 }
17016 l := v_0.Args[0]
17017 if l.Op != OpARMXORshiftLL {
17018 break
17019 }
17020 c := auxIntToInt32(l.AuxInt)
17021 y := l.Args[1]
17022 x := l.Args[0]
17023 if !(l.Uses == 1) {
17024 break
17025 }
17026 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags)
17027 v0.AuxInt = int32ToAuxInt(c)
17028 v0.AddArg2(x, y)
17029 b.resetWithControl(BlockARMEQ, v0)
17030 return true
17031 }
17032
17033
17034
17035 for b.Controls[0].Op == OpARMCMPconst {
17036 v_0 := b.Controls[0]
17037 if auxIntToInt32(v_0.AuxInt) != 0 {
17038 break
17039 }
17040 l := v_0.Args[0]
17041 if l.Op != OpARMXORshiftRL {
17042 break
17043 }
17044 c := auxIntToInt32(l.AuxInt)
17045 y := l.Args[1]
17046 x := l.Args[0]
17047 if !(l.Uses == 1) {
17048 break
17049 }
17050 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags)
17051 v0.AuxInt = int32ToAuxInt(c)
17052 v0.AddArg2(x, y)
17053 b.resetWithControl(BlockARMEQ, v0)
17054 return true
17055 }
17056
17057
17058
17059 for b.Controls[0].Op == OpARMCMPconst {
17060 v_0 := b.Controls[0]
17061 if auxIntToInt32(v_0.AuxInt) != 0 {
17062 break
17063 }
17064 l := v_0.Args[0]
17065 if l.Op != OpARMXORshiftRA {
17066 break
17067 }
17068 c := auxIntToInt32(l.AuxInt)
17069 y := l.Args[1]
17070 x := l.Args[0]
17071 if !(l.Uses == 1) {
17072 break
17073 }
17074 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags)
17075 v0.AuxInt = int32ToAuxInt(c)
17076 v0.AddArg2(x, y)
17077 b.resetWithControl(BlockARMEQ, v0)
17078 return true
17079 }
17080
17081
17082
17083 for b.Controls[0].Op == OpARMCMPconst {
17084 v_0 := b.Controls[0]
17085 if auxIntToInt32(v_0.AuxInt) != 0 {
17086 break
17087 }
17088 l := v_0.Args[0]
17089 if l.Op != OpARMXORshiftLLreg {
17090 break
17091 }
17092 z := l.Args[2]
17093 x := l.Args[0]
17094 y := l.Args[1]
17095 if !(l.Uses == 1) {
17096 break
17097 }
17098 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags)
17099 v0.AddArg3(x, y, z)
17100 b.resetWithControl(BlockARMEQ, v0)
17101 return true
17102 }
17103
17104
17105
17106 for b.Controls[0].Op == OpARMCMPconst {
17107 v_0 := b.Controls[0]
17108 if auxIntToInt32(v_0.AuxInt) != 0 {
17109 break
17110 }
17111 l := v_0.Args[0]
17112 if l.Op != OpARMXORshiftRLreg {
17113 break
17114 }
17115 z := l.Args[2]
17116 x := l.Args[0]
17117 y := l.Args[1]
17118 if !(l.Uses == 1) {
17119 break
17120 }
17121 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags)
17122 v0.AddArg3(x, y, z)
17123 b.resetWithControl(BlockARMEQ, v0)
17124 return true
17125 }
17126
17127
17128
17129 for b.Controls[0].Op == OpARMCMPconst {
17130 v_0 := b.Controls[0]
17131 if auxIntToInt32(v_0.AuxInt) != 0 {
17132 break
17133 }
17134 l := v_0.Args[0]
17135 if l.Op != OpARMXORshiftRAreg {
17136 break
17137 }
17138 z := l.Args[2]
17139 x := l.Args[0]
17140 y := l.Args[1]
17141 if !(l.Uses == 1) {
17142 break
17143 }
17144 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags)
17145 v0.AddArg3(x, y, z)
17146 b.resetWithControl(BlockARMEQ, v0)
17147 return true
17148 }
17149 case BlockARMGE:
17150
17151
17152
17153 for b.Controls[0].Op == OpARMFlagConstant {
17154 v_0 := b.Controls[0]
17155 fc := auxIntToFlagConstant(v_0.AuxInt)
17156 if !(fc.ge()) {
17157 break
17158 }
17159 b.Reset(BlockFirst)
17160 return true
17161 }
17162
17163
17164
17165 for b.Controls[0].Op == OpARMFlagConstant {
17166 v_0 := b.Controls[0]
17167 fc := auxIntToFlagConstant(v_0.AuxInt)
17168 if !(!fc.ge()) {
17169 break
17170 }
17171 b.Reset(BlockFirst)
17172 b.swapSuccessors()
17173 return true
17174 }
17175
17176
17177 for b.Controls[0].Op == OpARMInvertFlags {
17178 v_0 := b.Controls[0]
17179 cmp := v_0.Args[0]
17180 b.resetWithControl(BlockARMLE, cmp)
17181 return true
17182 }
17183
17184
17185
17186 for b.Controls[0].Op == OpARMCMPconst {
17187 v_0 := b.Controls[0]
17188 if auxIntToInt32(v_0.AuxInt) != 0 {
17189 break
17190 }
17191 l := v_0.Args[0]
17192 if l.Op != OpARMSUB {
17193 break
17194 }
17195 y := l.Args[1]
17196 x := l.Args[0]
17197 if !(l.Uses == 1) {
17198 break
17199 }
17200 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
17201 v0.AddArg2(x, y)
17202 b.resetWithControl(BlockARMGEnoov, v0)
17203 return true
17204 }
17205
17206
17207
17208 for b.Controls[0].Op == OpARMCMPconst {
17209 v_0 := b.Controls[0]
17210 if auxIntToInt32(v_0.AuxInt) != 0 {
17211 break
17212 }
17213 l := v_0.Args[0]
17214 if l.Op != OpARMMULS {
17215 break
17216 }
17217 a := l.Args[2]
17218 x := l.Args[0]
17219 y := l.Args[1]
17220 if !(l.Uses == 1) {
17221 break
17222 }
17223 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
17224 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
17225 v1.AddArg2(x, y)
17226 v0.AddArg2(a, v1)
17227 b.resetWithControl(BlockARMGEnoov, v0)
17228 return true
17229 }
17230
17231
17232
17233 for b.Controls[0].Op == OpARMCMPconst {
17234 v_0 := b.Controls[0]
17235 if auxIntToInt32(v_0.AuxInt) != 0 {
17236 break
17237 }
17238 l := v_0.Args[0]
17239 if l.Op != OpARMSUBconst {
17240 break
17241 }
17242 c := auxIntToInt32(l.AuxInt)
17243 x := l.Args[0]
17244 if !(l.Uses == 1) {
17245 break
17246 }
17247 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags)
17248 v0.AuxInt = int32ToAuxInt(c)
17249 v0.AddArg(x)
17250 b.resetWithControl(BlockARMGEnoov, v0)
17251 return true
17252 }
17253
17254
17255
17256 for b.Controls[0].Op == OpARMCMPconst {
17257 v_0 := b.Controls[0]
17258 if auxIntToInt32(v_0.AuxInt) != 0 {
17259 break
17260 }
17261 l := v_0.Args[0]
17262 if l.Op != OpARMSUBshiftLL {
17263 break
17264 }
17265 c := auxIntToInt32(l.AuxInt)
17266 y := l.Args[1]
17267 x := l.Args[0]
17268 if !(l.Uses == 1) {
17269 break
17270 }
17271 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags)
17272 v0.AuxInt = int32ToAuxInt(c)
17273 v0.AddArg2(x, y)
17274 b.resetWithControl(BlockARMGEnoov, v0)
17275 return true
17276 }
17277
17278
17279
17280 for b.Controls[0].Op == OpARMCMPconst {
17281 v_0 := b.Controls[0]
17282 if auxIntToInt32(v_0.AuxInt) != 0 {
17283 break
17284 }
17285 l := v_0.Args[0]
17286 if l.Op != OpARMSUBshiftRL {
17287 break
17288 }
17289 c := auxIntToInt32(l.AuxInt)
17290 y := l.Args[1]
17291 x := l.Args[0]
17292 if !(l.Uses == 1) {
17293 break
17294 }
17295 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags)
17296 v0.AuxInt = int32ToAuxInt(c)
17297 v0.AddArg2(x, y)
17298 b.resetWithControl(BlockARMGEnoov, v0)
17299 return true
17300 }
17301
17302
17303
17304 for b.Controls[0].Op == OpARMCMPconst {
17305 v_0 := b.Controls[0]
17306 if auxIntToInt32(v_0.AuxInt) != 0 {
17307 break
17308 }
17309 l := v_0.Args[0]
17310 if l.Op != OpARMSUBshiftRA {
17311 break
17312 }
17313 c := auxIntToInt32(l.AuxInt)
17314 y := l.Args[1]
17315 x := l.Args[0]
17316 if !(l.Uses == 1) {
17317 break
17318 }
17319 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags)
17320 v0.AuxInt = int32ToAuxInt(c)
17321 v0.AddArg2(x, y)
17322 b.resetWithControl(BlockARMGEnoov, v0)
17323 return true
17324 }
17325
17326
17327
17328 for b.Controls[0].Op == OpARMCMPconst {
17329 v_0 := b.Controls[0]
17330 if auxIntToInt32(v_0.AuxInt) != 0 {
17331 break
17332 }
17333 l := v_0.Args[0]
17334 if l.Op != OpARMSUBshiftLLreg {
17335 break
17336 }
17337 z := l.Args[2]
17338 x := l.Args[0]
17339 y := l.Args[1]
17340 if !(l.Uses == 1) {
17341 break
17342 }
17343 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
17344 v0.AddArg3(x, y, z)
17345 b.resetWithControl(BlockARMGEnoov, v0)
17346 return true
17347 }
17348
17349
17350
17351 for b.Controls[0].Op == OpARMCMPconst {
17352 v_0 := b.Controls[0]
17353 if auxIntToInt32(v_0.AuxInt) != 0 {
17354 break
17355 }
17356 l := v_0.Args[0]
17357 if l.Op != OpARMSUBshiftRLreg {
17358 break
17359 }
17360 z := l.Args[2]
17361 x := l.Args[0]
17362 y := l.Args[1]
17363 if !(l.Uses == 1) {
17364 break
17365 }
17366 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
17367 v0.AddArg3(x, y, z)
17368 b.resetWithControl(BlockARMGEnoov, v0)
17369 return true
17370 }
17371
17372
17373
17374 for b.Controls[0].Op == OpARMCMPconst {
17375 v_0 := b.Controls[0]
17376 if auxIntToInt32(v_0.AuxInt) != 0 {
17377 break
17378 }
17379 l := v_0.Args[0]
17380 if l.Op != OpARMSUBshiftRAreg {
17381 break
17382 }
17383 z := l.Args[2]
17384 x := l.Args[0]
17385 y := l.Args[1]
17386 if !(l.Uses == 1) {
17387 break
17388 }
17389 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
17390 v0.AddArg3(x, y, z)
17391 b.resetWithControl(BlockARMGEnoov, v0)
17392 return true
17393 }
17394
17395
17396
17397 for b.Controls[0].Op == OpARMCMPconst {
17398 v_0 := b.Controls[0]
17399 if auxIntToInt32(v_0.AuxInt) != 0 {
17400 break
17401 }
17402 l := v_0.Args[0]
17403 if l.Op != OpARMADD {
17404 break
17405 }
17406 _ = l.Args[1]
17407 l_0 := l.Args[0]
17408 l_1 := l.Args[1]
17409 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
17410 x := l_0
17411 y := l_1
17412 if !(l.Uses == 1) {
17413 continue
17414 }
17415 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
17416 v0.AddArg2(x, y)
17417 b.resetWithControl(BlockARMGEnoov, v0)
17418 return true
17419 }
17420 break
17421 }
17422
17423
17424
17425 for b.Controls[0].Op == OpARMCMPconst {
17426 v_0 := b.Controls[0]
17427 if auxIntToInt32(v_0.AuxInt) != 0 {
17428 break
17429 }
17430 l := v_0.Args[0]
17431 if l.Op != OpARMMULA {
17432 break
17433 }
17434 a := l.Args[2]
17435 x := l.Args[0]
17436 y := l.Args[1]
17437 if !(l.Uses == 1) {
17438 break
17439 }
17440 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
17441 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
17442 v1.AddArg2(x, y)
17443 v0.AddArg2(a, v1)
17444 b.resetWithControl(BlockARMGEnoov, v0)
17445 return true
17446 }
17447
17448
17449
17450 for b.Controls[0].Op == OpARMCMPconst {
17451 v_0 := b.Controls[0]
17452 if auxIntToInt32(v_0.AuxInt) != 0 {
17453 break
17454 }
17455 l := v_0.Args[0]
17456 if l.Op != OpARMADDconst {
17457 break
17458 }
17459 c := auxIntToInt32(l.AuxInt)
17460 x := l.Args[0]
17461 if !(l.Uses == 1) {
17462 break
17463 }
17464 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags)
17465 v0.AuxInt = int32ToAuxInt(c)
17466 v0.AddArg(x)
17467 b.resetWithControl(BlockARMGEnoov, v0)
17468 return true
17469 }
17470
17471
17472
17473 for b.Controls[0].Op == OpARMCMPconst {
17474 v_0 := b.Controls[0]
17475 if auxIntToInt32(v_0.AuxInt) != 0 {
17476 break
17477 }
17478 l := v_0.Args[0]
17479 if l.Op != OpARMADDshiftLL {
17480 break
17481 }
17482 c := auxIntToInt32(l.AuxInt)
17483 y := l.Args[1]
17484 x := l.Args[0]
17485 if !(l.Uses == 1) {
17486 break
17487 }
17488 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags)
17489 v0.AuxInt = int32ToAuxInt(c)
17490 v0.AddArg2(x, y)
17491 b.resetWithControl(BlockARMGEnoov, v0)
17492 return true
17493 }
17494
17495
17496
17497 for b.Controls[0].Op == OpARMCMPconst {
17498 v_0 := b.Controls[0]
17499 if auxIntToInt32(v_0.AuxInt) != 0 {
17500 break
17501 }
17502 l := v_0.Args[0]
17503 if l.Op != OpARMADDshiftRL {
17504 break
17505 }
17506 c := auxIntToInt32(l.AuxInt)
17507 y := l.Args[1]
17508 x := l.Args[0]
17509 if !(l.Uses == 1) {
17510 break
17511 }
17512 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags)
17513 v0.AuxInt = int32ToAuxInt(c)
17514 v0.AddArg2(x, y)
17515 b.resetWithControl(BlockARMGEnoov, v0)
17516 return true
17517 }
17518
17519
17520
17521 for b.Controls[0].Op == OpARMCMPconst {
17522 v_0 := b.Controls[0]
17523 if auxIntToInt32(v_0.AuxInt) != 0 {
17524 break
17525 }
17526 l := v_0.Args[0]
17527 if l.Op != OpARMADDshiftRA {
17528 break
17529 }
17530 c := auxIntToInt32(l.AuxInt)
17531 y := l.Args[1]
17532 x := l.Args[0]
17533 if !(l.Uses == 1) {
17534 break
17535 }
17536 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags)
17537 v0.AuxInt = int32ToAuxInt(c)
17538 v0.AddArg2(x, y)
17539 b.resetWithControl(BlockARMGEnoov, v0)
17540 return true
17541 }
17542
17543
17544
17545 for b.Controls[0].Op == OpARMCMPconst {
17546 v_0 := b.Controls[0]
17547 if auxIntToInt32(v_0.AuxInt) != 0 {
17548 break
17549 }
17550 l := v_0.Args[0]
17551 if l.Op != OpARMADDshiftLLreg {
17552 break
17553 }
17554 z := l.Args[2]
17555 x := l.Args[0]
17556 y := l.Args[1]
17557 if !(l.Uses == 1) {
17558 break
17559 }
17560 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags)
17561 v0.AddArg3(x, y, z)
17562 b.resetWithControl(BlockARMGEnoov, v0)
17563 return true
17564 }
17565
17566
17567
17568 for b.Controls[0].Op == OpARMCMPconst {
17569 v_0 := b.Controls[0]
17570 if auxIntToInt32(v_0.AuxInt) != 0 {
17571 break
17572 }
17573 l := v_0.Args[0]
17574 if l.Op != OpARMADDshiftRLreg {
17575 break
17576 }
17577 z := l.Args[2]
17578 x := l.Args[0]
17579 y := l.Args[1]
17580 if !(l.Uses == 1) {
17581 break
17582 }
17583 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags)
17584 v0.AddArg3(x, y, z)
17585 b.resetWithControl(BlockARMGEnoov, v0)
17586 return true
17587 }
17588
17589
17590
17591 for b.Controls[0].Op == OpARMCMPconst {
17592 v_0 := b.Controls[0]
17593 if auxIntToInt32(v_0.AuxInt) != 0 {
17594 break
17595 }
17596 l := v_0.Args[0]
17597 if l.Op != OpARMADDshiftRAreg {
17598 break
17599 }
17600 z := l.Args[2]
17601 x := l.Args[0]
17602 y := l.Args[1]
17603 if !(l.Uses == 1) {
17604 break
17605 }
17606 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags)
17607 v0.AddArg3(x, y, z)
17608 b.resetWithControl(BlockARMGEnoov, v0)
17609 return true
17610 }
17611
17612
17613
17614 for b.Controls[0].Op == OpARMCMPconst {
17615 v_0 := b.Controls[0]
17616 if auxIntToInt32(v_0.AuxInt) != 0 {
17617 break
17618 }
17619 l := v_0.Args[0]
17620 if l.Op != OpARMAND {
17621 break
17622 }
17623 _ = l.Args[1]
17624 l_0 := l.Args[0]
17625 l_1 := l.Args[1]
17626 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
17627 x := l_0
17628 y := l_1
17629 if !(l.Uses == 1) {
17630 continue
17631 }
17632 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags)
17633 v0.AddArg2(x, y)
17634 b.resetWithControl(BlockARMGEnoov, v0)
17635 return true
17636 }
17637 break
17638 }
17639
17640
17641
17642 for b.Controls[0].Op == OpARMCMPconst {
17643 v_0 := b.Controls[0]
17644 if auxIntToInt32(v_0.AuxInt) != 0 {
17645 break
17646 }
17647 l := v_0.Args[0]
17648 if l.Op != OpARMANDconst {
17649 break
17650 }
17651 c := auxIntToInt32(l.AuxInt)
17652 x := l.Args[0]
17653 if !(l.Uses == 1) {
17654 break
17655 }
17656 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags)
17657 v0.AuxInt = int32ToAuxInt(c)
17658 v0.AddArg(x)
17659 b.resetWithControl(BlockARMGEnoov, v0)
17660 return true
17661 }
17662
17663
17664
17665 for b.Controls[0].Op == OpARMCMPconst {
17666 v_0 := b.Controls[0]
17667 if auxIntToInt32(v_0.AuxInt) != 0 {
17668 break
17669 }
17670 l := v_0.Args[0]
17671 if l.Op != OpARMANDshiftLL {
17672 break
17673 }
17674 c := auxIntToInt32(l.AuxInt)
17675 y := l.Args[1]
17676 x := l.Args[0]
17677 if !(l.Uses == 1) {
17678 break
17679 }
17680 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags)
17681 v0.AuxInt = int32ToAuxInt(c)
17682 v0.AddArg2(x, y)
17683 b.resetWithControl(BlockARMGEnoov, v0)
17684 return true
17685 }
17686
17687
17688
17689 for b.Controls[0].Op == OpARMCMPconst {
17690 v_0 := b.Controls[0]
17691 if auxIntToInt32(v_0.AuxInt) != 0 {
17692 break
17693 }
17694 l := v_0.Args[0]
17695 if l.Op != OpARMANDshiftRL {
17696 break
17697 }
17698 c := auxIntToInt32(l.AuxInt)
17699 y := l.Args[1]
17700 x := l.Args[0]
17701 if !(l.Uses == 1) {
17702 break
17703 }
17704 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags)
17705 v0.AuxInt = int32ToAuxInt(c)
17706 v0.AddArg2(x, y)
17707 b.resetWithControl(BlockARMGEnoov, v0)
17708 return true
17709 }
17710
17711
17712
17713 for b.Controls[0].Op == OpARMCMPconst {
17714 v_0 := b.Controls[0]
17715 if auxIntToInt32(v_0.AuxInt) != 0 {
17716 break
17717 }
17718 l := v_0.Args[0]
17719 if l.Op != OpARMANDshiftRA {
17720 break
17721 }
17722 c := auxIntToInt32(l.AuxInt)
17723 y := l.Args[1]
17724 x := l.Args[0]
17725 if !(l.Uses == 1) {
17726 break
17727 }
17728 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags)
17729 v0.AuxInt = int32ToAuxInt(c)
17730 v0.AddArg2(x, y)
17731 b.resetWithControl(BlockARMGEnoov, v0)
17732 return true
17733 }
17734
17735
17736
17737 for b.Controls[0].Op == OpARMCMPconst {
17738 v_0 := b.Controls[0]
17739 if auxIntToInt32(v_0.AuxInt) != 0 {
17740 break
17741 }
17742 l := v_0.Args[0]
17743 if l.Op != OpARMANDshiftLLreg {
17744 break
17745 }
17746 z := l.Args[2]
17747 x := l.Args[0]
17748 y := l.Args[1]
17749 if !(l.Uses == 1) {
17750 break
17751 }
17752 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags)
17753 v0.AddArg3(x, y, z)
17754 b.resetWithControl(BlockARMGEnoov, v0)
17755 return true
17756 }
17757
17758
17759
17760 for b.Controls[0].Op == OpARMCMPconst {
17761 v_0 := b.Controls[0]
17762 if auxIntToInt32(v_0.AuxInt) != 0 {
17763 break
17764 }
17765 l := v_0.Args[0]
17766 if l.Op != OpARMANDshiftRLreg {
17767 break
17768 }
17769 z := l.Args[2]
17770 x := l.Args[0]
17771 y := l.Args[1]
17772 if !(l.Uses == 1) {
17773 break
17774 }
17775 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags)
17776 v0.AddArg3(x, y, z)
17777 b.resetWithControl(BlockARMGEnoov, v0)
17778 return true
17779 }
17780
17781
17782
17783 for b.Controls[0].Op == OpARMCMPconst {
17784 v_0 := b.Controls[0]
17785 if auxIntToInt32(v_0.AuxInt) != 0 {
17786 break
17787 }
17788 l := v_0.Args[0]
17789 if l.Op != OpARMANDshiftRAreg {
17790 break
17791 }
17792 z := l.Args[2]
17793 x := l.Args[0]
17794 y := l.Args[1]
17795 if !(l.Uses == 1) {
17796 break
17797 }
17798 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags)
17799 v0.AddArg3(x, y, z)
17800 b.resetWithControl(BlockARMGEnoov, v0)
17801 return true
17802 }
17803
17804
17805
17806 for b.Controls[0].Op == OpARMCMPconst {
17807 v_0 := b.Controls[0]
17808 if auxIntToInt32(v_0.AuxInt) != 0 {
17809 break
17810 }
17811 l := v_0.Args[0]
17812 if l.Op != OpARMXOR {
17813 break
17814 }
17815 _ = l.Args[1]
17816 l_0 := l.Args[0]
17817 l_1 := l.Args[1]
17818 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
17819 x := l_0
17820 y := l_1
17821 if !(l.Uses == 1) {
17822 continue
17823 }
17824 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags)
17825 v0.AddArg2(x, y)
17826 b.resetWithControl(BlockARMGEnoov, v0)
17827 return true
17828 }
17829 break
17830 }
17831
17832
17833
17834 for b.Controls[0].Op == OpARMCMPconst {
17835 v_0 := b.Controls[0]
17836 if auxIntToInt32(v_0.AuxInt) != 0 {
17837 break
17838 }
17839 l := v_0.Args[0]
17840 if l.Op != OpARMXORconst {
17841 break
17842 }
17843 c := auxIntToInt32(l.AuxInt)
17844 x := l.Args[0]
17845 if !(l.Uses == 1) {
17846 break
17847 }
17848 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags)
17849 v0.AuxInt = int32ToAuxInt(c)
17850 v0.AddArg(x)
17851 b.resetWithControl(BlockARMGEnoov, v0)
17852 return true
17853 }
17854
17855
17856
17857 for b.Controls[0].Op == OpARMCMPconst {
17858 v_0 := b.Controls[0]
17859 if auxIntToInt32(v_0.AuxInt) != 0 {
17860 break
17861 }
17862 l := v_0.Args[0]
17863 if l.Op != OpARMXORshiftLL {
17864 break
17865 }
17866 c := auxIntToInt32(l.AuxInt)
17867 y := l.Args[1]
17868 x := l.Args[0]
17869 if !(l.Uses == 1) {
17870 break
17871 }
17872 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags)
17873 v0.AuxInt = int32ToAuxInt(c)
17874 v0.AddArg2(x, y)
17875 b.resetWithControl(BlockARMGEnoov, v0)
17876 return true
17877 }
17878
17879
17880
17881 for b.Controls[0].Op == OpARMCMPconst {
17882 v_0 := b.Controls[0]
17883 if auxIntToInt32(v_0.AuxInt) != 0 {
17884 break
17885 }
17886 l := v_0.Args[0]
17887 if l.Op != OpARMXORshiftRL {
17888 break
17889 }
17890 c := auxIntToInt32(l.AuxInt)
17891 y := l.Args[1]
17892 x := l.Args[0]
17893 if !(l.Uses == 1) {
17894 break
17895 }
17896 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags)
17897 v0.AuxInt = int32ToAuxInt(c)
17898 v0.AddArg2(x, y)
17899 b.resetWithControl(BlockARMGEnoov, v0)
17900 return true
17901 }
17902
17903
17904
17905 for b.Controls[0].Op == OpARMCMPconst {
17906 v_0 := b.Controls[0]
17907 if auxIntToInt32(v_0.AuxInt) != 0 {
17908 break
17909 }
17910 l := v_0.Args[0]
17911 if l.Op != OpARMXORshiftRA {
17912 break
17913 }
17914 c := auxIntToInt32(l.AuxInt)
17915 y := l.Args[1]
17916 x := l.Args[0]
17917 if !(l.Uses == 1) {
17918 break
17919 }
17920 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags)
17921 v0.AuxInt = int32ToAuxInt(c)
17922 v0.AddArg2(x, y)
17923 b.resetWithControl(BlockARMGEnoov, v0)
17924 return true
17925 }
17926
17927
17928
17929 for b.Controls[0].Op == OpARMCMPconst {
17930 v_0 := b.Controls[0]
17931 if auxIntToInt32(v_0.AuxInt) != 0 {
17932 break
17933 }
17934 l := v_0.Args[0]
17935 if l.Op != OpARMXORshiftLLreg {
17936 break
17937 }
17938 z := l.Args[2]
17939 x := l.Args[0]
17940 y := l.Args[1]
17941 if !(l.Uses == 1) {
17942 break
17943 }
17944 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags)
17945 v0.AddArg3(x, y, z)
17946 b.resetWithControl(BlockARMGEnoov, v0)
17947 return true
17948 }
17949
17950
17951
17952 for b.Controls[0].Op == OpARMCMPconst {
17953 v_0 := b.Controls[0]
17954 if auxIntToInt32(v_0.AuxInt) != 0 {
17955 break
17956 }
17957 l := v_0.Args[0]
17958 if l.Op != OpARMXORshiftRLreg {
17959 break
17960 }
17961 z := l.Args[2]
17962 x := l.Args[0]
17963 y := l.Args[1]
17964 if !(l.Uses == 1) {
17965 break
17966 }
17967 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags)
17968 v0.AddArg3(x, y, z)
17969 b.resetWithControl(BlockARMGEnoov, v0)
17970 return true
17971 }
17972
17973
17974
17975 for b.Controls[0].Op == OpARMCMPconst {
17976 v_0 := b.Controls[0]
17977 if auxIntToInt32(v_0.AuxInt) != 0 {
17978 break
17979 }
17980 l := v_0.Args[0]
17981 if l.Op != OpARMXORshiftRAreg {
17982 break
17983 }
17984 z := l.Args[2]
17985 x := l.Args[0]
17986 y := l.Args[1]
17987 if !(l.Uses == 1) {
17988 break
17989 }
17990 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags)
17991 v0.AddArg3(x, y, z)
17992 b.resetWithControl(BlockARMGEnoov, v0)
17993 return true
17994 }
17995 case BlockARMGEnoov:
17996
17997
17998
17999 for b.Controls[0].Op == OpARMFlagConstant {
18000 v_0 := b.Controls[0]
18001 fc := auxIntToFlagConstant(v_0.AuxInt)
18002 if !(fc.geNoov()) {
18003 break
18004 }
18005 b.Reset(BlockFirst)
18006 return true
18007 }
18008
18009
18010
18011 for b.Controls[0].Op == OpARMFlagConstant {
18012 v_0 := b.Controls[0]
18013 fc := auxIntToFlagConstant(v_0.AuxInt)
18014 if !(!fc.geNoov()) {
18015 break
18016 }
18017 b.Reset(BlockFirst)
18018 b.swapSuccessors()
18019 return true
18020 }
18021
18022
18023 for b.Controls[0].Op == OpARMInvertFlags {
18024 v_0 := b.Controls[0]
18025 cmp := v_0.Args[0]
18026 b.resetWithControl(BlockARMLEnoov, cmp)
18027 return true
18028 }
18029 case BlockARMGT:
18030
18031
18032
18033 for b.Controls[0].Op == OpARMFlagConstant {
18034 v_0 := b.Controls[0]
18035 fc := auxIntToFlagConstant(v_0.AuxInt)
18036 if !(fc.gt()) {
18037 break
18038 }
18039 b.Reset(BlockFirst)
18040 return true
18041 }
18042
18043
18044
18045 for b.Controls[0].Op == OpARMFlagConstant {
18046 v_0 := b.Controls[0]
18047 fc := auxIntToFlagConstant(v_0.AuxInt)
18048 if !(!fc.gt()) {
18049 break
18050 }
18051 b.Reset(BlockFirst)
18052 b.swapSuccessors()
18053 return true
18054 }
18055
18056
18057 for b.Controls[0].Op == OpARMInvertFlags {
18058 v_0 := b.Controls[0]
18059 cmp := v_0.Args[0]
18060 b.resetWithControl(BlockARMLT, cmp)
18061 return true
18062 }
18063
18064
18065
18066 for b.Controls[0].Op == OpARMCMPconst {
18067 v_0 := b.Controls[0]
18068 if auxIntToInt32(v_0.AuxInt) != 0 {
18069 break
18070 }
18071 l := v_0.Args[0]
18072 if l.Op != OpARMSUB {
18073 break
18074 }
18075 y := l.Args[1]
18076 x := l.Args[0]
18077 if !(l.Uses == 1) {
18078 break
18079 }
18080 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
18081 v0.AddArg2(x, y)
18082 b.resetWithControl(BlockARMGTnoov, v0)
18083 return true
18084 }
18085
18086
18087
18088 for b.Controls[0].Op == OpARMCMPconst {
18089 v_0 := b.Controls[0]
18090 if auxIntToInt32(v_0.AuxInt) != 0 {
18091 break
18092 }
18093 l := v_0.Args[0]
18094 if l.Op != OpARMMULS {
18095 break
18096 }
18097 a := l.Args[2]
18098 x := l.Args[0]
18099 y := l.Args[1]
18100 if !(l.Uses == 1) {
18101 break
18102 }
18103 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
18104 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
18105 v1.AddArg2(x, y)
18106 v0.AddArg2(a, v1)
18107 b.resetWithControl(BlockARMGTnoov, v0)
18108 return true
18109 }
18110
18111
18112
18113 for b.Controls[0].Op == OpARMCMPconst {
18114 v_0 := b.Controls[0]
18115 if auxIntToInt32(v_0.AuxInt) != 0 {
18116 break
18117 }
18118 l := v_0.Args[0]
18119 if l.Op != OpARMSUBconst {
18120 break
18121 }
18122 c := auxIntToInt32(l.AuxInt)
18123 x := l.Args[0]
18124 if !(l.Uses == 1) {
18125 break
18126 }
18127 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags)
18128 v0.AuxInt = int32ToAuxInt(c)
18129 v0.AddArg(x)
18130 b.resetWithControl(BlockARMGTnoov, v0)
18131 return true
18132 }
18133
18134
18135
18136 for b.Controls[0].Op == OpARMCMPconst {
18137 v_0 := b.Controls[0]
18138 if auxIntToInt32(v_0.AuxInt) != 0 {
18139 break
18140 }
18141 l := v_0.Args[0]
18142 if l.Op != OpARMSUBshiftLL {
18143 break
18144 }
18145 c := auxIntToInt32(l.AuxInt)
18146 y := l.Args[1]
18147 x := l.Args[0]
18148 if !(l.Uses == 1) {
18149 break
18150 }
18151 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags)
18152 v0.AuxInt = int32ToAuxInt(c)
18153 v0.AddArg2(x, y)
18154 b.resetWithControl(BlockARMGTnoov, v0)
18155 return true
18156 }
18157
18158
18159
18160 for b.Controls[0].Op == OpARMCMPconst {
18161 v_0 := b.Controls[0]
18162 if auxIntToInt32(v_0.AuxInt) != 0 {
18163 break
18164 }
18165 l := v_0.Args[0]
18166 if l.Op != OpARMSUBshiftRL {
18167 break
18168 }
18169 c := auxIntToInt32(l.AuxInt)
18170 y := l.Args[1]
18171 x := l.Args[0]
18172 if !(l.Uses == 1) {
18173 break
18174 }
18175 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags)
18176 v0.AuxInt = int32ToAuxInt(c)
18177 v0.AddArg2(x, y)
18178 b.resetWithControl(BlockARMGTnoov, v0)
18179 return true
18180 }
18181
18182
18183
18184 for b.Controls[0].Op == OpARMCMPconst {
18185 v_0 := b.Controls[0]
18186 if auxIntToInt32(v_0.AuxInt) != 0 {
18187 break
18188 }
18189 l := v_0.Args[0]
18190 if l.Op != OpARMSUBshiftRA {
18191 break
18192 }
18193 c := auxIntToInt32(l.AuxInt)
18194 y := l.Args[1]
18195 x := l.Args[0]
18196 if !(l.Uses == 1) {
18197 break
18198 }
18199 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags)
18200 v0.AuxInt = int32ToAuxInt(c)
18201 v0.AddArg2(x, y)
18202 b.resetWithControl(BlockARMGTnoov, v0)
18203 return true
18204 }
18205
18206
18207
18208 for b.Controls[0].Op == OpARMCMPconst {
18209 v_0 := b.Controls[0]
18210 if auxIntToInt32(v_0.AuxInt) != 0 {
18211 break
18212 }
18213 l := v_0.Args[0]
18214 if l.Op != OpARMSUBshiftLLreg {
18215 break
18216 }
18217 z := l.Args[2]
18218 x := l.Args[0]
18219 y := l.Args[1]
18220 if !(l.Uses == 1) {
18221 break
18222 }
18223 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
18224 v0.AddArg3(x, y, z)
18225 b.resetWithControl(BlockARMGTnoov, v0)
18226 return true
18227 }
18228
18229
18230
18231 for b.Controls[0].Op == OpARMCMPconst {
18232 v_0 := b.Controls[0]
18233 if auxIntToInt32(v_0.AuxInt) != 0 {
18234 break
18235 }
18236 l := v_0.Args[0]
18237 if l.Op != OpARMSUBshiftRLreg {
18238 break
18239 }
18240 z := l.Args[2]
18241 x := l.Args[0]
18242 y := l.Args[1]
18243 if !(l.Uses == 1) {
18244 break
18245 }
18246 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
18247 v0.AddArg3(x, y, z)
18248 b.resetWithControl(BlockARMGTnoov, v0)
18249 return true
18250 }
18251
18252
18253
18254 for b.Controls[0].Op == OpARMCMPconst {
18255 v_0 := b.Controls[0]
18256 if auxIntToInt32(v_0.AuxInt) != 0 {
18257 break
18258 }
18259 l := v_0.Args[0]
18260 if l.Op != OpARMSUBshiftRAreg {
18261 break
18262 }
18263 z := l.Args[2]
18264 x := l.Args[0]
18265 y := l.Args[1]
18266 if !(l.Uses == 1) {
18267 break
18268 }
18269 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
18270 v0.AddArg3(x, y, z)
18271 b.resetWithControl(BlockARMGTnoov, v0)
18272 return true
18273 }
18274
18275
18276
18277 for b.Controls[0].Op == OpARMCMPconst {
18278 v_0 := b.Controls[0]
18279 if auxIntToInt32(v_0.AuxInt) != 0 {
18280 break
18281 }
18282 l := v_0.Args[0]
18283 if l.Op != OpARMADD {
18284 break
18285 }
18286 _ = l.Args[1]
18287 l_0 := l.Args[0]
18288 l_1 := l.Args[1]
18289 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
18290 x := l_0
18291 y := l_1
18292 if !(l.Uses == 1) {
18293 continue
18294 }
18295 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
18296 v0.AddArg2(x, y)
18297 b.resetWithControl(BlockARMGTnoov, v0)
18298 return true
18299 }
18300 break
18301 }
18302
18303
18304
18305 for b.Controls[0].Op == OpARMCMPconst {
18306 v_0 := b.Controls[0]
18307 if auxIntToInt32(v_0.AuxInt) != 0 {
18308 break
18309 }
18310 l := v_0.Args[0]
18311 if l.Op != OpARMADDconst {
18312 break
18313 }
18314 c := auxIntToInt32(l.AuxInt)
18315 x := l.Args[0]
18316 if !(l.Uses == 1) {
18317 break
18318 }
18319 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags)
18320 v0.AuxInt = int32ToAuxInt(c)
18321 v0.AddArg(x)
18322 b.resetWithControl(BlockARMGTnoov, v0)
18323 return true
18324 }
18325
18326
18327
18328 for b.Controls[0].Op == OpARMCMPconst {
18329 v_0 := b.Controls[0]
18330 if auxIntToInt32(v_0.AuxInt) != 0 {
18331 break
18332 }
18333 l := v_0.Args[0]
18334 if l.Op != OpARMADDshiftLL {
18335 break
18336 }
18337 c := auxIntToInt32(l.AuxInt)
18338 y := l.Args[1]
18339 x := l.Args[0]
18340 if !(l.Uses == 1) {
18341 break
18342 }
18343 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags)
18344 v0.AuxInt = int32ToAuxInt(c)
18345 v0.AddArg2(x, y)
18346 b.resetWithControl(BlockARMGTnoov, v0)
18347 return true
18348 }
18349
18350
18351
18352 for b.Controls[0].Op == OpARMCMPconst {
18353 v_0 := b.Controls[0]
18354 if auxIntToInt32(v_0.AuxInt) != 0 {
18355 break
18356 }
18357 l := v_0.Args[0]
18358 if l.Op != OpARMADDshiftRL {
18359 break
18360 }
18361 c := auxIntToInt32(l.AuxInt)
18362 y := l.Args[1]
18363 x := l.Args[0]
18364 if !(l.Uses == 1) {
18365 break
18366 }
18367 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags)
18368 v0.AuxInt = int32ToAuxInt(c)
18369 v0.AddArg2(x, y)
18370 b.resetWithControl(BlockARMGTnoov, v0)
18371 return true
18372 }
18373
18374
18375
18376 for b.Controls[0].Op == OpARMCMPconst {
18377 v_0 := b.Controls[0]
18378 if auxIntToInt32(v_0.AuxInt) != 0 {
18379 break
18380 }
18381 l := v_0.Args[0]
18382 if l.Op != OpARMADDshiftRA {
18383 break
18384 }
18385 c := auxIntToInt32(l.AuxInt)
18386 y := l.Args[1]
18387 x := l.Args[0]
18388 if !(l.Uses == 1) {
18389 break
18390 }
18391 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags)
18392 v0.AuxInt = int32ToAuxInt(c)
18393 v0.AddArg2(x, y)
18394 b.resetWithControl(BlockARMGTnoov, v0)
18395 return true
18396 }
18397
18398
18399
18400 for b.Controls[0].Op == OpARMCMPconst {
18401 v_0 := b.Controls[0]
18402 if auxIntToInt32(v_0.AuxInt) != 0 {
18403 break
18404 }
18405 l := v_0.Args[0]
18406 if l.Op != OpARMADDshiftLLreg {
18407 break
18408 }
18409 z := l.Args[2]
18410 x := l.Args[0]
18411 y := l.Args[1]
18412 if !(l.Uses == 1) {
18413 break
18414 }
18415 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags)
18416 v0.AddArg3(x, y, z)
18417 b.resetWithControl(BlockARMGTnoov, v0)
18418 return true
18419 }
18420
18421
18422
18423 for b.Controls[0].Op == OpARMCMPconst {
18424 v_0 := b.Controls[0]
18425 if auxIntToInt32(v_0.AuxInt) != 0 {
18426 break
18427 }
18428 l := v_0.Args[0]
18429 if l.Op != OpARMADDshiftRLreg {
18430 break
18431 }
18432 z := l.Args[2]
18433 x := l.Args[0]
18434 y := l.Args[1]
18435 if !(l.Uses == 1) {
18436 break
18437 }
18438 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags)
18439 v0.AddArg3(x, y, z)
18440 b.resetWithControl(BlockARMGTnoov, v0)
18441 return true
18442 }
18443
18444
18445
18446 for b.Controls[0].Op == OpARMCMPconst {
18447 v_0 := b.Controls[0]
18448 if auxIntToInt32(v_0.AuxInt) != 0 {
18449 break
18450 }
18451 l := v_0.Args[0]
18452 if l.Op != OpARMADDshiftRAreg {
18453 break
18454 }
18455 z := l.Args[2]
18456 x := l.Args[0]
18457 y := l.Args[1]
18458 if !(l.Uses == 1) {
18459 break
18460 }
18461 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags)
18462 v0.AddArg3(x, y, z)
18463 b.resetWithControl(BlockARMGTnoov, v0)
18464 return true
18465 }
18466
18467
18468
18469 for b.Controls[0].Op == OpARMCMPconst {
18470 v_0 := b.Controls[0]
18471 if auxIntToInt32(v_0.AuxInt) != 0 {
18472 break
18473 }
18474 l := v_0.Args[0]
18475 if l.Op != OpARMMULA {
18476 break
18477 }
18478 a := l.Args[2]
18479 x := l.Args[0]
18480 y := l.Args[1]
18481 if !(l.Uses == 1) {
18482 break
18483 }
18484 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
18485 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
18486 v1.AddArg2(x, y)
18487 v0.AddArg2(a, v1)
18488 b.resetWithControl(BlockARMGTnoov, v0)
18489 return true
18490 }
18491
18492
18493
18494 for b.Controls[0].Op == OpARMCMPconst {
18495 v_0 := b.Controls[0]
18496 if auxIntToInt32(v_0.AuxInt) != 0 {
18497 break
18498 }
18499 l := v_0.Args[0]
18500 if l.Op != OpARMAND {
18501 break
18502 }
18503 _ = l.Args[1]
18504 l_0 := l.Args[0]
18505 l_1 := l.Args[1]
18506 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
18507 x := l_0
18508 y := l_1
18509 if !(l.Uses == 1) {
18510 continue
18511 }
18512 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags)
18513 v0.AddArg2(x, y)
18514 b.resetWithControl(BlockARMGTnoov, v0)
18515 return true
18516 }
18517 break
18518 }
18519
18520
18521
18522 for b.Controls[0].Op == OpARMCMPconst {
18523 v_0 := b.Controls[0]
18524 if auxIntToInt32(v_0.AuxInt) != 0 {
18525 break
18526 }
18527 l := v_0.Args[0]
18528 if l.Op != OpARMANDconst {
18529 break
18530 }
18531 c := auxIntToInt32(l.AuxInt)
18532 x := l.Args[0]
18533 if !(l.Uses == 1) {
18534 break
18535 }
18536 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags)
18537 v0.AuxInt = int32ToAuxInt(c)
18538 v0.AddArg(x)
18539 b.resetWithControl(BlockARMGTnoov, v0)
18540 return true
18541 }
18542
18543
18544
18545 for b.Controls[0].Op == OpARMCMPconst {
18546 v_0 := b.Controls[0]
18547 if auxIntToInt32(v_0.AuxInt) != 0 {
18548 break
18549 }
18550 l := v_0.Args[0]
18551 if l.Op != OpARMANDshiftLL {
18552 break
18553 }
18554 c := auxIntToInt32(l.AuxInt)
18555 y := l.Args[1]
18556 x := l.Args[0]
18557 if !(l.Uses == 1) {
18558 break
18559 }
18560 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags)
18561 v0.AuxInt = int32ToAuxInt(c)
18562 v0.AddArg2(x, y)
18563 b.resetWithControl(BlockARMGTnoov, v0)
18564 return true
18565 }
18566
18567
18568
18569 for b.Controls[0].Op == OpARMCMPconst {
18570 v_0 := b.Controls[0]
18571 if auxIntToInt32(v_0.AuxInt) != 0 {
18572 break
18573 }
18574 l := v_0.Args[0]
18575 if l.Op != OpARMANDshiftRL {
18576 break
18577 }
18578 c := auxIntToInt32(l.AuxInt)
18579 y := l.Args[1]
18580 x := l.Args[0]
18581 if !(l.Uses == 1) {
18582 break
18583 }
18584 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags)
18585 v0.AuxInt = int32ToAuxInt(c)
18586 v0.AddArg2(x, y)
18587 b.resetWithControl(BlockARMGTnoov, v0)
18588 return true
18589 }
18590
18591
18592
18593 for b.Controls[0].Op == OpARMCMPconst {
18594 v_0 := b.Controls[0]
18595 if auxIntToInt32(v_0.AuxInt) != 0 {
18596 break
18597 }
18598 l := v_0.Args[0]
18599 if l.Op != OpARMANDshiftRA {
18600 break
18601 }
18602 c := auxIntToInt32(l.AuxInt)
18603 y := l.Args[1]
18604 x := l.Args[0]
18605 if !(l.Uses == 1) {
18606 break
18607 }
18608 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags)
18609 v0.AuxInt = int32ToAuxInt(c)
18610 v0.AddArg2(x, y)
18611 b.resetWithControl(BlockARMGTnoov, v0)
18612 return true
18613 }
18614
18615
18616
18617 for b.Controls[0].Op == OpARMCMPconst {
18618 v_0 := b.Controls[0]
18619 if auxIntToInt32(v_0.AuxInt) != 0 {
18620 break
18621 }
18622 l := v_0.Args[0]
18623 if l.Op != OpARMANDshiftLLreg {
18624 break
18625 }
18626 z := l.Args[2]
18627 x := l.Args[0]
18628 y := l.Args[1]
18629 if !(l.Uses == 1) {
18630 break
18631 }
18632 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags)
18633 v0.AddArg3(x, y, z)
18634 b.resetWithControl(BlockARMGTnoov, v0)
18635 return true
18636 }
18637
18638
18639
18640 for b.Controls[0].Op == OpARMCMPconst {
18641 v_0 := b.Controls[0]
18642 if auxIntToInt32(v_0.AuxInt) != 0 {
18643 break
18644 }
18645 l := v_0.Args[0]
18646 if l.Op != OpARMANDshiftRLreg {
18647 break
18648 }
18649 z := l.Args[2]
18650 x := l.Args[0]
18651 y := l.Args[1]
18652 if !(l.Uses == 1) {
18653 break
18654 }
18655 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags)
18656 v0.AddArg3(x, y, z)
18657 b.resetWithControl(BlockARMGTnoov, v0)
18658 return true
18659 }
18660
18661
18662
18663 for b.Controls[0].Op == OpARMCMPconst {
18664 v_0 := b.Controls[0]
18665 if auxIntToInt32(v_0.AuxInt) != 0 {
18666 break
18667 }
18668 l := v_0.Args[0]
18669 if l.Op != OpARMANDshiftRAreg {
18670 break
18671 }
18672 z := l.Args[2]
18673 x := l.Args[0]
18674 y := l.Args[1]
18675 if !(l.Uses == 1) {
18676 break
18677 }
18678 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags)
18679 v0.AddArg3(x, y, z)
18680 b.resetWithControl(BlockARMGTnoov, v0)
18681 return true
18682 }
18683
18684
18685
18686 for b.Controls[0].Op == OpARMCMPconst {
18687 v_0 := b.Controls[0]
18688 if auxIntToInt32(v_0.AuxInt) != 0 {
18689 break
18690 }
18691 l := v_0.Args[0]
18692 if l.Op != OpARMXOR {
18693 break
18694 }
18695 _ = l.Args[1]
18696 l_0 := l.Args[0]
18697 l_1 := l.Args[1]
18698 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
18699 x := l_0
18700 y := l_1
18701 if !(l.Uses == 1) {
18702 continue
18703 }
18704 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags)
18705 v0.AddArg2(x, y)
18706 b.resetWithControl(BlockARMGTnoov, v0)
18707 return true
18708 }
18709 break
18710 }
18711
18712
18713
18714 for b.Controls[0].Op == OpARMCMPconst {
18715 v_0 := b.Controls[0]
18716 if auxIntToInt32(v_0.AuxInt) != 0 {
18717 break
18718 }
18719 l := v_0.Args[0]
18720 if l.Op != OpARMXORconst {
18721 break
18722 }
18723 c := auxIntToInt32(l.AuxInt)
18724 x := l.Args[0]
18725 if !(l.Uses == 1) {
18726 break
18727 }
18728 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags)
18729 v0.AuxInt = int32ToAuxInt(c)
18730 v0.AddArg(x)
18731 b.resetWithControl(BlockARMGTnoov, v0)
18732 return true
18733 }
18734
18735
18736
18737 for b.Controls[0].Op == OpARMCMPconst {
18738 v_0 := b.Controls[0]
18739 if auxIntToInt32(v_0.AuxInt) != 0 {
18740 break
18741 }
18742 l := v_0.Args[0]
18743 if l.Op != OpARMXORshiftLL {
18744 break
18745 }
18746 c := auxIntToInt32(l.AuxInt)
18747 y := l.Args[1]
18748 x := l.Args[0]
18749 if !(l.Uses == 1) {
18750 break
18751 }
18752 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags)
18753 v0.AuxInt = int32ToAuxInt(c)
18754 v0.AddArg2(x, y)
18755 b.resetWithControl(BlockARMGTnoov, v0)
18756 return true
18757 }
18758
18759
18760
18761 for b.Controls[0].Op == OpARMCMPconst {
18762 v_0 := b.Controls[0]
18763 if auxIntToInt32(v_0.AuxInt) != 0 {
18764 break
18765 }
18766 l := v_0.Args[0]
18767 if l.Op != OpARMXORshiftRL {
18768 break
18769 }
18770 c := auxIntToInt32(l.AuxInt)
18771 y := l.Args[1]
18772 x := l.Args[0]
18773 if !(l.Uses == 1) {
18774 break
18775 }
18776 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags)
18777 v0.AuxInt = int32ToAuxInt(c)
18778 v0.AddArg2(x, y)
18779 b.resetWithControl(BlockARMGTnoov, v0)
18780 return true
18781 }
18782
18783
18784
18785 for b.Controls[0].Op == OpARMCMPconst {
18786 v_0 := b.Controls[0]
18787 if auxIntToInt32(v_0.AuxInt) != 0 {
18788 break
18789 }
18790 l := v_0.Args[0]
18791 if l.Op != OpARMXORshiftRA {
18792 break
18793 }
18794 c := auxIntToInt32(l.AuxInt)
18795 y := l.Args[1]
18796 x := l.Args[0]
18797 if !(l.Uses == 1) {
18798 break
18799 }
18800 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags)
18801 v0.AuxInt = int32ToAuxInt(c)
18802 v0.AddArg2(x, y)
18803 b.resetWithControl(BlockARMGTnoov, v0)
18804 return true
18805 }
18806
18807
18808
18809 for b.Controls[0].Op == OpARMCMPconst {
18810 v_0 := b.Controls[0]
18811 if auxIntToInt32(v_0.AuxInt) != 0 {
18812 break
18813 }
18814 l := v_0.Args[0]
18815 if l.Op != OpARMXORshiftLLreg {
18816 break
18817 }
18818 z := l.Args[2]
18819 x := l.Args[0]
18820 y := l.Args[1]
18821 if !(l.Uses == 1) {
18822 break
18823 }
18824 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags)
18825 v0.AddArg3(x, y, z)
18826 b.resetWithControl(BlockARMGTnoov, v0)
18827 return true
18828 }
18829
18830
18831
18832 for b.Controls[0].Op == OpARMCMPconst {
18833 v_0 := b.Controls[0]
18834 if auxIntToInt32(v_0.AuxInt) != 0 {
18835 break
18836 }
18837 l := v_0.Args[0]
18838 if l.Op != OpARMXORshiftRLreg {
18839 break
18840 }
18841 z := l.Args[2]
18842 x := l.Args[0]
18843 y := l.Args[1]
18844 if !(l.Uses == 1) {
18845 break
18846 }
18847 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags)
18848 v0.AddArg3(x, y, z)
18849 b.resetWithControl(BlockARMGTnoov, v0)
18850 return true
18851 }
18852
18853
18854
18855 for b.Controls[0].Op == OpARMCMPconst {
18856 v_0 := b.Controls[0]
18857 if auxIntToInt32(v_0.AuxInt) != 0 {
18858 break
18859 }
18860 l := v_0.Args[0]
18861 if l.Op != OpARMXORshiftRAreg {
18862 break
18863 }
18864 z := l.Args[2]
18865 x := l.Args[0]
18866 y := l.Args[1]
18867 if !(l.Uses == 1) {
18868 break
18869 }
18870 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags)
18871 v0.AddArg3(x, y, z)
18872 b.resetWithControl(BlockARMGTnoov, v0)
18873 return true
18874 }
18875 case BlockARMGTnoov:
18876
18877
18878
18879 for b.Controls[0].Op == OpARMFlagConstant {
18880 v_0 := b.Controls[0]
18881 fc := auxIntToFlagConstant(v_0.AuxInt)
18882 if !(fc.gtNoov()) {
18883 break
18884 }
18885 b.Reset(BlockFirst)
18886 return true
18887 }
18888
18889
18890
18891 for b.Controls[0].Op == OpARMFlagConstant {
18892 v_0 := b.Controls[0]
18893 fc := auxIntToFlagConstant(v_0.AuxInt)
18894 if !(!fc.gtNoov()) {
18895 break
18896 }
18897 b.Reset(BlockFirst)
18898 b.swapSuccessors()
18899 return true
18900 }
18901
18902
18903 for b.Controls[0].Op == OpARMInvertFlags {
18904 v_0 := b.Controls[0]
18905 cmp := v_0.Args[0]
18906 b.resetWithControl(BlockARMLTnoov, cmp)
18907 return true
18908 }
18909 case BlockIf:
18910
18911
18912 for b.Controls[0].Op == OpARMEqual {
18913 v_0 := b.Controls[0]
18914 cc := v_0.Args[0]
18915 b.resetWithControl(BlockARMEQ, cc)
18916 return true
18917 }
18918
18919
18920 for b.Controls[0].Op == OpARMNotEqual {
18921 v_0 := b.Controls[0]
18922 cc := v_0.Args[0]
18923 b.resetWithControl(BlockARMNE, cc)
18924 return true
18925 }
18926
18927
18928 for b.Controls[0].Op == OpARMLessThan {
18929 v_0 := b.Controls[0]
18930 cc := v_0.Args[0]
18931 b.resetWithControl(BlockARMLT, cc)
18932 return true
18933 }
18934
18935
18936 for b.Controls[0].Op == OpARMLessThanU {
18937 v_0 := b.Controls[0]
18938 cc := v_0.Args[0]
18939 b.resetWithControl(BlockARMULT, cc)
18940 return true
18941 }
18942
18943
18944 for b.Controls[0].Op == OpARMLessEqual {
18945 v_0 := b.Controls[0]
18946 cc := v_0.Args[0]
18947 b.resetWithControl(BlockARMLE, cc)
18948 return true
18949 }
18950
18951
18952 for b.Controls[0].Op == OpARMLessEqualU {
18953 v_0 := b.Controls[0]
18954 cc := v_0.Args[0]
18955 b.resetWithControl(BlockARMULE, cc)
18956 return true
18957 }
18958
18959
18960 for b.Controls[0].Op == OpARMGreaterThan {
18961 v_0 := b.Controls[0]
18962 cc := v_0.Args[0]
18963 b.resetWithControl(BlockARMGT, cc)
18964 return true
18965 }
18966
18967
18968 for b.Controls[0].Op == OpARMGreaterThanU {
18969 v_0 := b.Controls[0]
18970 cc := v_0.Args[0]
18971 b.resetWithControl(BlockARMUGT, cc)
18972 return true
18973 }
18974
18975
18976 for b.Controls[0].Op == OpARMGreaterEqual {
18977 v_0 := b.Controls[0]
18978 cc := v_0.Args[0]
18979 b.resetWithControl(BlockARMGE, cc)
18980 return true
18981 }
18982
18983
18984 for b.Controls[0].Op == OpARMGreaterEqualU {
18985 v_0 := b.Controls[0]
18986 cc := v_0.Args[0]
18987 b.resetWithControl(BlockARMUGE, cc)
18988 return true
18989 }
18990
18991
18992 for {
18993 cond := b.Controls[0]
18994 v0 := b.NewValue0(cond.Pos, OpARMCMPconst, types.TypeFlags)
18995 v0.AuxInt = int32ToAuxInt(0)
18996 v0.AddArg(cond)
18997 b.resetWithControl(BlockARMNE, v0)
18998 return true
18999 }
19000 case BlockARMLE:
19001
19002
19003
19004 for b.Controls[0].Op == OpARMFlagConstant {
19005 v_0 := b.Controls[0]
19006 fc := auxIntToFlagConstant(v_0.AuxInt)
19007 if !(fc.le()) {
19008 break
19009 }
19010 b.Reset(BlockFirst)
19011 return true
19012 }
19013
19014
19015
19016 for b.Controls[0].Op == OpARMFlagConstant {
19017 v_0 := b.Controls[0]
19018 fc := auxIntToFlagConstant(v_0.AuxInt)
19019 if !(!fc.le()) {
19020 break
19021 }
19022 b.Reset(BlockFirst)
19023 b.swapSuccessors()
19024 return true
19025 }
19026
19027
19028 for b.Controls[0].Op == OpARMInvertFlags {
19029 v_0 := b.Controls[0]
19030 cmp := v_0.Args[0]
19031 b.resetWithControl(BlockARMGE, cmp)
19032 return true
19033 }
19034
19035
19036
19037 for b.Controls[0].Op == OpARMCMPconst {
19038 v_0 := b.Controls[0]
19039 if auxIntToInt32(v_0.AuxInt) != 0 {
19040 break
19041 }
19042 l := v_0.Args[0]
19043 if l.Op != OpARMSUB {
19044 break
19045 }
19046 y := l.Args[1]
19047 x := l.Args[0]
19048 if !(l.Uses == 1) {
19049 break
19050 }
19051 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
19052 v0.AddArg2(x, y)
19053 b.resetWithControl(BlockARMLEnoov, v0)
19054 return true
19055 }
19056
19057
19058
19059 for b.Controls[0].Op == OpARMCMPconst {
19060 v_0 := b.Controls[0]
19061 if auxIntToInt32(v_0.AuxInt) != 0 {
19062 break
19063 }
19064 l := v_0.Args[0]
19065 if l.Op != OpARMMULS {
19066 break
19067 }
19068 a := l.Args[2]
19069 x := l.Args[0]
19070 y := l.Args[1]
19071 if !(l.Uses == 1) {
19072 break
19073 }
19074 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
19075 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
19076 v1.AddArg2(x, y)
19077 v0.AddArg2(a, v1)
19078 b.resetWithControl(BlockARMLEnoov, v0)
19079 return true
19080 }
19081
19082
19083
19084 for b.Controls[0].Op == OpARMCMPconst {
19085 v_0 := b.Controls[0]
19086 if auxIntToInt32(v_0.AuxInt) != 0 {
19087 break
19088 }
19089 l := v_0.Args[0]
19090 if l.Op != OpARMSUBconst {
19091 break
19092 }
19093 c := auxIntToInt32(l.AuxInt)
19094 x := l.Args[0]
19095 if !(l.Uses == 1) {
19096 break
19097 }
19098 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags)
19099 v0.AuxInt = int32ToAuxInt(c)
19100 v0.AddArg(x)
19101 b.resetWithControl(BlockARMLEnoov, v0)
19102 return true
19103 }
19104
19105
19106
19107 for b.Controls[0].Op == OpARMCMPconst {
19108 v_0 := b.Controls[0]
19109 if auxIntToInt32(v_0.AuxInt) != 0 {
19110 break
19111 }
19112 l := v_0.Args[0]
19113 if l.Op != OpARMSUBshiftLL {
19114 break
19115 }
19116 c := auxIntToInt32(l.AuxInt)
19117 y := l.Args[1]
19118 x := l.Args[0]
19119 if !(l.Uses == 1) {
19120 break
19121 }
19122 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags)
19123 v0.AuxInt = int32ToAuxInt(c)
19124 v0.AddArg2(x, y)
19125 b.resetWithControl(BlockARMLEnoov, v0)
19126 return true
19127 }
19128
19129
19130
19131 for b.Controls[0].Op == OpARMCMPconst {
19132 v_0 := b.Controls[0]
19133 if auxIntToInt32(v_0.AuxInt) != 0 {
19134 break
19135 }
19136 l := v_0.Args[0]
19137 if l.Op != OpARMSUBshiftRL {
19138 break
19139 }
19140 c := auxIntToInt32(l.AuxInt)
19141 y := l.Args[1]
19142 x := l.Args[0]
19143 if !(l.Uses == 1) {
19144 break
19145 }
19146 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags)
19147 v0.AuxInt = int32ToAuxInt(c)
19148 v0.AddArg2(x, y)
19149 b.resetWithControl(BlockARMLEnoov, v0)
19150 return true
19151 }
19152
19153
19154
19155 for b.Controls[0].Op == OpARMCMPconst {
19156 v_0 := b.Controls[0]
19157 if auxIntToInt32(v_0.AuxInt) != 0 {
19158 break
19159 }
19160 l := v_0.Args[0]
19161 if l.Op != OpARMSUBshiftRA {
19162 break
19163 }
19164 c := auxIntToInt32(l.AuxInt)
19165 y := l.Args[1]
19166 x := l.Args[0]
19167 if !(l.Uses == 1) {
19168 break
19169 }
19170 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags)
19171 v0.AuxInt = int32ToAuxInt(c)
19172 v0.AddArg2(x, y)
19173 b.resetWithControl(BlockARMLEnoov, v0)
19174 return true
19175 }
19176
19177
19178
19179 for b.Controls[0].Op == OpARMCMPconst {
19180 v_0 := b.Controls[0]
19181 if auxIntToInt32(v_0.AuxInt) != 0 {
19182 break
19183 }
19184 l := v_0.Args[0]
19185 if l.Op != OpARMSUBshiftLLreg {
19186 break
19187 }
19188 z := l.Args[2]
19189 x := l.Args[0]
19190 y := l.Args[1]
19191 if !(l.Uses == 1) {
19192 break
19193 }
19194 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
19195 v0.AddArg3(x, y, z)
19196 b.resetWithControl(BlockARMLEnoov, v0)
19197 return true
19198 }
19199
19200
19201
19202 for b.Controls[0].Op == OpARMCMPconst {
19203 v_0 := b.Controls[0]
19204 if auxIntToInt32(v_0.AuxInt) != 0 {
19205 break
19206 }
19207 l := v_0.Args[0]
19208 if l.Op != OpARMSUBshiftRLreg {
19209 break
19210 }
19211 z := l.Args[2]
19212 x := l.Args[0]
19213 y := l.Args[1]
19214 if !(l.Uses == 1) {
19215 break
19216 }
19217 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
19218 v0.AddArg3(x, y, z)
19219 b.resetWithControl(BlockARMLEnoov, v0)
19220 return true
19221 }
19222
19223
19224
19225 for b.Controls[0].Op == OpARMCMPconst {
19226 v_0 := b.Controls[0]
19227 if auxIntToInt32(v_0.AuxInt) != 0 {
19228 break
19229 }
19230 l := v_0.Args[0]
19231 if l.Op != OpARMSUBshiftRAreg {
19232 break
19233 }
19234 z := l.Args[2]
19235 x := l.Args[0]
19236 y := l.Args[1]
19237 if !(l.Uses == 1) {
19238 break
19239 }
19240 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
19241 v0.AddArg3(x, y, z)
19242 b.resetWithControl(BlockARMLEnoov, v0)
19243 return true
19244 }
19245
19246
19247
19248 for b.Controls[0].Op == OpARMCMPconst {
19249 v_0 := b.Controls[0]
19250 if auxIntToInt32(v_0.AuxInt) != 0 {
19251 break
19252 }
19253 l := v_0.Args[0]
19254 if l.Op != OpARMADD {
19255 break
19256 }
19257 _ = l.Args[1]
19258 l_0 := l.Args[0]
19259 l_1 := l.Args[1]
19260 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
19261 x := l_0
19262 y := l_1
19263 if !(l.Uses == 1) {
19264 continue
19265 }
19266 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
19267 v0.AddArg2(x, y)
19268 b.resetWithControl(BlockARMLEnoov, v0)
19269 return true
19270 }
19271 break
19272 }
19273
19274
19275
19276 for b.Controls[0].Op == OpARMCMPconst {
19277 v_0 := b.Controls[0]
19278 if auxIntToInt32(v_0.AuxInt) != 0 {
19279 break
19280 }
19281 l := v_0.Args[0]
19282 if l.Op != OpARMMULA {
19283 break
19284 }
19285 a := l.Args[2]
19286 x := l.Args[0]
19287 y := l.Args[1]
19288 if !(l.Uses == 1) {
19289 break
19290 }
19291 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
19292 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
19293 v1.AddArg2(x, y)
19294 v0.AddArg2(a, v1)
19295 b.resetWithControl(BlockARMLEnoov, v0)
19296 return true
19297 }
19298
19299
19300
19301 for b.Controls[0].Op == OpARMCMPconst {
19302 v_0 := b.Controls[0]
19303 if auxIntToInt32(v_0.AuxInt) != 0 {
19304 break
19305 }
19306 l := v_0.Args[0]
19307 if l.Op != OpARMADDconst {
19308 break
19309 }
19310 c := auxIntToInt32(l.AuxInt)
19311 x := l.Args[0]
19312 if !(l.Uses == 1) {
19313 break
19314 }
19315 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags)
19316 v0.AuxInt = int32ToAuxInt(c)
19317 v0.AddArg(x)
19318 b.resetWithControl(BlockARMLEnoov, v0)
19319 return true
19320 }
19321
19322
19323
19324 for b.Controls[0].Op == OpARMCMPconst {
19325 v_0 := b.Controls[0]
19326 if auxIntToInt32(v_0.AuxInt) != 0 {
19327 break
19328 }
19329 l := v_0.Args[0]
19330 if l.Op != OpARMADDshiftLL {
19331 break
19332 }
19333 c := auxIntToInt32(l.AuxInt)
19334 y := l.Args[1]
19335 x := l.Args[0]
19336 if !(l.Uses == 1) {
19337 break
19338 }
19339 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags)
19340 v0.AuxInt = int32ToAuxInt(c)
19341 v0.AddArg2(x, y)
19342 b.resetWithControl(BlockARMLEnoov, v0)
19343 return true
19344 }
19345
19346
19347
19348 for b.Controls[0].Op == OpARMCMPconst {
19349 v_0 := b.Controls[0]
19350 if auxIntToInt32(v_0.AuxInt) != 0 {
19351 break
19352 }
19353 l := v_0.Args[0]
19354 if l.Op != OpARMADDshiftRL {
19355 break
19356 }
19357 c := auxIntToInt32(l.AuxInt)
19358 y := l.Args[1]
19359 x := l.Args[0]
19360 if !(l.Uses == 1) {
19361 break
19362 }
19363 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags)
19364 v0.AuxInt = int32ToAuxInt(c)
19365 v0.AddArg2(x, y)
19366 b.resetWithControl(BlockARMLEnoov, v0)
19367 return true
19368 }
19369
19370
19371
19372 for b.Controls[0].Op == OpARMCMPconst {
19373 v_0 := b.Controls[0]
19374 if auxIntToInt32(v_0.AuxInt) != 0 {
19375 break
19376 }
19377 l := v_0.Args[0]
19378 if l.Op != OpARMADDshiftRA {
19379 break
19380 }
19381 c := auxIntToInt32(l.AuxInt)
19382 y := l.Args[1]
19383 x := l.Args[0]
19384 if !(l.Uses == 1) {
19385 break
19386 }
19387 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags)
19388 v0.AuxInt = int32ToAuxInt(c)
19389 v0.AddArg2(x, y)
19390 b.resetWithControl(BlockARMLEnoov, v0)
19391 return true
19392 }
19393
19394
19395
19396 for b.Controls[0].Op == OpARMCMPconst {
19397 v_0 := b.Controls[0]
19398 if auxIntToInt32(v_0.AuxInt) != 0 {
19399 break
19400 }
19401 l := v_0.Args[0]
19402 if l.Op != OpARMADDshiftLLreg {
19403 break
19404 }
19405 z := l.Args[2]
19406 x := l.Args[0]
19407 y := l.Args[1]
19408 if !(l.Uses == 1) {
19409 break
19410 }
19411 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags)
19412 v0.AddArg3(x, y, z)
19413 b.resetWithControl(BlockARMLEnoov, v0)
19414 return true
19415 }
19416
19417
19418
19419 for b.Controls[0].Op == OpARMCMPconst {
19420 v_0 := b.Controls[0]
19421 if auxIntToInt32(v_0.AuxInt) != 0 {
19422 break
19423 }
19424 l := v_0.Args[0]
19425 if l.Op != OpARMADDshiftRLreg {
19426 break
19427 }
19428 z := l.Args[2]
19429 x := l.Args[0]
19430 y := l.Args[1]
19431 if !(l.Uses == 1) {
19432 break
19433 }
19434 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags)
19435 v0.AddArg3(x, y, z)
19436 b.resetWithControl(BlockARMLEnoov, v0)
19437 return true
19438 }
19439
19440
19441
19442 for b.Controls[0].Op == OpARMCMPconst {
19443 v_0 := b.Controls[0]
19444 if auxIntToInt32(v_0.AuxInt) != 0 {
19445 break
19446 }
19447 l := v_0.Args[0]
19448 if l.Op != OpARMADDshiftRAreg {
19449 break
19450 }
19451 z := l.Args[2]
19452 x := l.Args[0]
19453 y := l.Args[1]
19454 if !(l.Uses == 1) {
19455 break
19456 }
19457 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags)
19458 v0.AddArg3(x, y, z)
19459 b.resetWithControl(BlockARMLEnoov, v0)
19460 return true
19461 }
19462
19463
19464
19465 for b.Controls[0].Op == OpARMCMPconst {
19466 v_0 := b.Controls[0]
19467 if auxIntToInt32(v_0.AuxInt) != 0 {
19468 break
19469 }
19470 l := v_0.Args[0]
19471 if l.Op != OpARMAND {
19472 break
19473 }
19474 _ = l.Args[1]
19475 l_0 := l.Args[0]
19476 l_1 := l.Args[1]
19477 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
19478 x := l_0
19479 y := l_1
19480 if !(l.Uses == 1) {
19481 continue
19482 }
19483 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags)
19484 v0.AddArg2(x, y)
19485 b.resetWithControl(BlockARMLEnoov, v0)
19486 return true
19487 }
19488 break
19489 }
19490
19491
19492
19493 for b.Controls[0].Op == OpARMCMPconst {
19494 v_0 := b.Controls[0]
19495 if auxIntToInt32(v_0.AuxInt) != 0 {
19496 break
19497 }
19498 l := v_0.Args[0]
19499 if l.Op != OpARMANDconst {
19500 break
19501 }
19502 c := auxIntToInt32(l.AuxInt)
19503 x := l.Args[0]
19504 if !(l.Uses == 1) {
19505 break
19506 }
19507 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags)
19508 v0.AuxInt = int32ToAuxInt(c)
19509 v0.AddArg(x)
19510 b.resetWithControl(BlockARMLEnoov, v0)
19511 return true
19512 }
19513
19514
19515
19516 for b.Controls[0].Op == OpARMCMPconst {
19517 v_0 := b.Controls[0]
19518 if auxIntToInt32(v_0.AuxInt) != 0 {
19519 break
19520 }
19521 l := v_0.Args[0]
19522 if l.Op != OpARMANDshiftLL {
19523 break
19524 }
19525 c := auxIntToInt32(l.AuxInt)
19526 y := l.Args[1]
19527 x := l.Args[0]
19528 if !(l.Uses == 1) {
19529 break
19530 }
19531 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags)
19532 v0.AuxInt = int32ToAuxInt(c)
19533 v0.AddArg2(x, y)
19534 b.resetWithControl(BlockARMLEnoov, v0)
19535 return true
19536 }
19537
19538
19539
19540 for b.Controls[0].Op == OpARMCMPconst {
19541 v_0 := b.Controls[0]
19542 if auxIntToInt32(v_0.AuxInt) != 0 {
19543 break
19544 }
19545 l := v_0.Args[0]
19546 if l.Op != OpARMANDshiftRL {
19547 break
19548 }
19549 c := auxIntToInt32(l.AuxInt)
19550 y := l.Args[1]
19551 x := l.Args[0]
19552 if !(l.Uses == 1) {
19553 break
19554 }
19555 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags)
19556 v0.AuxInt = int32ToAuxInt(c)
19557 v0.AddArg2(x, y)
19558 b.resetWithControl(BlockARMLEnoov, v0)
19559 return true
19560 }
19561
19562
19563
19564 for b.Controls[0].Op == OpARMCMPconst {
19565 v_0 := b.Controls[0]
19566 if auxIntToInt32(v_0.AuxInt) != 0 {
19567 break
19568 }
19569 l := v_0.Args[0]
19570 if l.Op != OpARMANDshiftRA {
19571 break
19572 }
19573 c := auxIntToInt32(l.AuxInt)
19574 y := l.Args[1]
19575 x := l.Args[0]
19576 if !(l.Uses == 1) {
19577 break
19578 }
19579 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags)
19580 v0.AuxInt = int32ToAuxInt(c)
19581 v0.AddArg2(x, y)
19582 b.resetWithControl(BlockARMLEnoov, v0)
19583 return true
19584 }
19585
19586
19587
19588 for b.Controls[0].Op == OpARMCMPconst {
19589 v_0 := b.Controls[0]
19590 if auxIntToInt32(v_0.AuxInt) != 0 {
19591 break
19592 }
19593 l := v_0.Args[0]
19594 if l.Op != OpARMANDshiftLLreg {
19595 break
19596 }
19597 z := l.Args[2]
19598 x := l.Args[0]
19599 y := l.Args[1]
19600 if !(l.Uses == 1) {
19601 break
19602 }
19603 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags)
19604 v0.AddArg3(x, y, z)
19605 b.resetWithControl(BlockARMLEnoov, v0)
19606 return true
19607 }
19608
19609
19610
19611 for b.Controls[0].Op == OpARMCMPconst {
19612 v_0 := b.Controls[0]
19613 if auxIntToInt32(v_0.AuxInt) != 0 {
19614 break
19615 }
19616 l := v_0.Args[0]
19617 if l.Op != OpARMANDshiftRLreg {
19618 break
19619 }
19620 z := l.Args[2]
19621 x := l.Args[0]
19622 y := l.Args[1]
19623 if !(l.Uses == 1) {
19624 break
19625 }
19626 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags)
19627 v0.AddArg3(x, y, z)
19628 b.resetWithControl(BlockARMLEnoov, v0)
19629 return true
19630 }
19631
19632
19633
19634 for b.Controls[0].Op == OpARMCMPconst {
19635 v_0 := b.Controls[0]
19636 if auxIntToInt32(v_0.AuxInt) != 0 {
19637 break
19638 }
19639 l := v_0.Args[0]
19640 if l.Op != OpARMANDshiftRAreg {
19641 break
19642 }
19643 z := l.Args[2]
19644 x := l.Args[0]
19645 y := l.Args[1]
19646 if !(l.Uses == 1) {
19647 break
19648 }
19649 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags)
19650 v0.AddArg3(x, y, z)
19651 b.resetWithControl(BlockARMLEnoov, v0)
19652 return true
19653 }
19654
19655
19656
19657 for b.Controls[0].Op == OpARMCMPconst {
19658 v_0 := b.Controls[0]
19659 if auxIntToInt32(v_0.AuxInt) != 0 {
19660 break
19661 }
19662 l := v_0.Args[0]
19663 if l.Op != OpARMXOR {
19664 break
19665 }
19666 _ = l.Args[1]
19667 l_0 := l.Args[0]
19668 l_1 := l.Args[1]
19669 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
19670 x := l_0
19671 y := l_1
19672 if !(l.Uses == 1) {
19673 continue
19674 }
19675 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags)
19676 v0.AddArg2(x, y)
19677 b.resetWithControl(BlockARMLEnoov, v0)
19678 return true
19679 }
19680 break
19681 }
19682
19683
19684
19685 for b.Controls[0].Op == OpARMCMPconst {
19686 v_0 := b.Controls[0]
19687 if auxIntToInt32(v_0.AuxInt) != 0 {
19688 break
19689 }
19690 l := v_0.Args[0]
19691 if l.Op != OpARMXORconst {
19692 break
19693 }
19694 c := auxIntToInt32(l.AuxInt)
19695 x := l.Args[0]
19696 if !(l.Uses == 1) {
19697 break
19698 }
19699 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags)
19700 v0.AuxInt = int32ToAuxInt(c)
19701 v0.AddArg(x)
19702 b.resetWithControl(BlockARMLEnoov, v0)
19703 return true
19704 }
19705
19706
19707
19708 for b.Controls[0].Op == OpARMCMPconst {
19709 v_0 := b.Controls[0]
19710 if auxIntToInt32(v_0.AuxInt) != 0 {
19711 break
19712 }
19713 l := v_0.Args[0]
19714 if l.Op != OpARMXORshiftLL {
19715 break
19716 }
19717 c := auxIntToInt32(l.AuxInt)
19718 y := l.Args[1]
19719 x := l.Args[0]
19720 if !(l.Uses == 1) {
19721 break
19722 }
19723 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags)
19724 v0.AuxInt = int32ToAuxInt(c)
19725 v0.AddArg2(x, y)
19726 b.resetWithControl(BlockARMLEnoov, v0)
19727 return true
19728 }
19729
19730
19731
19732 for b.Controls[0].Op == OpARMCMPconst {
19733 v_0 := b.Controls[0]
19734 if auxIntToInt32(v_0.AuxInt) != 0 {
19735 break
19736 }
19737 l := v_0.Args[0]
19738 if l.Op != OpARMXORshiftRL {
19739 break
19740 }
19741 c := auxIntToInt32(l.AuxInt)
19742 y := l.Args[1]
19743 x := l.Args[0]
19744 if !(l.Uses == 1) {
19745 break
19746 }
19747 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags)
19748 v0.AuxInt = int32ToAuxInt(c)
19749 v0.AddArg2(x, y)
19750 b.resetWithControl(BlockARMLEnoov, v0)
19751 return true
19752 }
19753
19754
19755
19756 for b.Controls[0].Op == OpARMCMPconst {
19757 v_0 := b.Controls[0]
19758 if auxIntToInt32(v_0.AuxInt) != 0 {
19759 break
19760 }
19761 l := v_0.Args[0]
19762 if l.Op != OpARMXORshiftRA {
19763 break
19764 }
19765 c := auxIntToInt32(l.AuxInt)
19766 y := l.Args[1]
19767 x := l.Args[0]
19768 if !(l.Uses == 1) {
19769 break
19770 }
19771 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags)
19772 v0.AuxInt = int32ToAuxInt(c)
19773 v0.AddArg2(x, y)
19774 b.resetWithControl(BlockARMLEnoov, v0)
19775 return true
19776 }
19777
19778
19779
19780 for b.Controls[0].Op == OpARMCMPconst {
19781 v_0 := b.Controls[0]
19782 if auxIntToInt32(v_0.AuxInt) != 0 {
19783 break
19784 }
19785 l := v_0.Args[0]
19786 if l.Op != OpARMXORshiftLLreg {
19787 break
19788 }
19789 z := l.Args[2]
19790 x := l.Args[0]
19791 y := l.Args[1]
19792 if !(l.Uses == 1) {
19793 break
19794 }
19795 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags)
19796 v0.AddArg3(x, y, z)
19797 b.resetWithControl(BlockARMLEnoov, v0)
19798 return true
19799 }
19800
19801
19802
19803 for b.Controls[0].Op == OpARMCMPconst {
19804 v_0 := b.Controls[0]
19805 if auxIntToInt32(v_0.AuxInt) != 0 {
19806 break
19807 }
19808 l := v_0.Args[0]
19809 if l.Op != OpARMXORshiftRLreg {
19810 break
19811 }
19812 z := l.Args[2]
19813 x := l.Args[0]
19814 y := l.Args[1]
19815 if !(l.Uses == 1) {
19816 break
19817 }
19818 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags)
19819 v0.AddArg3(x, y, z)
19820 b.resetWithControl(BlockARMLEnoov, v0)
19821 return true
19822 }
19823
19824
19825
19826 for b.Controls[0].Op == OpARMCMPconst {
19827 v_0 := b.Controls[0]
19828 if auxIntToInt32(v_0.AuxInt) != 0 {
19829 break
19830 }
19831 l := v_0.Args[0]
19832 if l.Op != OpARMXORshiftRAreg {
19833 break
19834 }
19835 z := l.Args[2]
19836 x := l.Args[0]
19837 y := l.Args[1]
19838 if !(l.Uses == 1) {
19839 break
19840 }
19841 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags)
19842 v0.AddArg3(x, y, z)
19843 b.resetWithControl(BlockARMLEnoov, v0)
19844 return true
19845 }
19846 case BlockARMLEnoov:
19847
19848
19849
19850 for b.Controls[0].Op == OpARMFlagConstant {
19851 v_0 := b.Controls[0]
19852 fc := auxIntToFlagConstant(v_0.AuxInt)
19853 if !(fc.leNoov()) {
19854 break
19855 }
19856 b.Reset(BlockFirst)
19857 return true
19858 }
19859
19860
19861
19862 for b.Controls[0].Op == OpARMFlagConstant {
19863 v_0 := b.Controls[0]
19864 fc := auxIntToFlagConstant(v_0.AuxInt)
19865 if !(!fc.leNoov()) {
19866 break
19867 }
19868 b.Reset(BlockFirst)
19869 b.swapSuccessors()
19870 return true
19871 }
19872
19873
19874 for b.Controls[0].Op == OpARMInvertFlags {
19875 v_0 := b.Controls[0]
19876 cmp := v_0.Args[0]
19877 b.resetWithControl(BlockARMGEnoov, cmp)
19878 return true
19879 }
19880 case BlockARMLT:
19881
19882
19883
19884 for b.Controls[0].Op == OpARMFlagConstant {
19885 v_0 := b.Controls[0]
19886 fc := auxIntToFlagConstant(v_0.AuxInt)
19887 if !(fc.lt()) {
19888 break
19889 }
19890 b.Reset(BlockFirst)
19891 return true
19892 }
19893
19894
19895
19896 for b.Controls[0].Op == OpARMFlagConstant {
19897 v_0 := b.Controls[0]
19898 fc := auxIntToFlagConstant(v_0.AuxInt)
19899 if !(!fc.lt()) {
19900 break
19901 }
19902 b.Reset(BlockFirst)
19903 b.swapSuccessors()
19904 return true
19905 }
19906
19907
19908 for b.Controls[0].Op == OpARMInvertFlags {
19909 v_0 := b.Controls[0]
19910 cmp := v_0.Args[0]
19911 b.resetWithControl(BlockARMGT, cmp)
19912 return true
19913 }
19914
19915
19916
19917 for b.Controls[0].Op == OpARMCMPconst {
19918 v_0 := b.Controls[0]
19919 if auxIntToInt32(v_0.AuxInt) != 0 {
19920 break
19921 }
19922 l := v_0.Args[0]
19923 if l.Op != OpARMSUB {
19924 break
19925 }
19926 y := l.Args[1]
19927 x := l.Args[0]
19928 if !(l.Uses == 1) {
19929 break
19930 }
19931 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
19932 v0.AddArg2(x, y)
19933 b.resetWithControl(BlockARMLTnoov, v0)
19934 return true
19935 }
19936
19937
19938
19939 for b.Controls[0].Op == OpARMCMPconst {
19940 v_0 := b.Controls[0]
19941 if auxIntToInt32(v_0.AuxInt) != 0 {
19942 break
19943 }
19944 l := v_0.Args[0]
19945 if l.Op != OpARMMULS {
19946 break
19947 }
19948 a := l.Args[2]
19949 x := l.Args[0]
19950 y := l.Args[1]
19951 if !(l.Uses == 1) {
19952 break
19953 }
19954 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
19955 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
19956 v1.AddArg2(x, y)
19957 v0.AddArg2(a, v1)
19958 b.resetWithControl(BlockARMLTnoov, v0)
19959 return true
19960 }
19961
19962
19963
19964 for b.Controls[0].Op == OpARMCMPconst {
19965 v_0 := b.Controls[0]
19966 if auxIntToInt32(v_0.AuxInt) != 0 {
19967 break
19968 }
19969 l := v_0.Args[0]
19970 if l.Op != OpARMSUBconst {
19971 break
19972 }
19973 c := auxIntToInt32(l.AuxInt)
19974 x := l.Args[0]
19975 if !(l.Uses == 1) {
19976 break
19977 }
19978 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags)
19979 v0.AuxInt = int32ToAuxInt(c)
19980 v0.AddArg(x)
19981 b.resetWithControl(BlockARMLTnoov, v0)
19982 return true
19983 }
19984
19985
19986
19987 for b.Controls[0].Op == OpARMCMPconst {
19988 v_0 := b.Controls[0]
19989 if auxIntToInt32(v_0.AuxInt) != 0 {
19990 break
19991 }
19992 l := v_0.Args[0]
19993 if l.Op != OpARMSUBshiftLL {
19994 break
19995 }
19996 c := auxIntToInt32(l.AuxInt)
19997 y := l.Args[1]
19998 x := l.Args[0]
19999 if !(l.Uses == 1) {
20000 break
20001 }
20002 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags)
20003 v0.AuxInt = int32ToAuxInt(c)
20004 v0.AddArg2(x, y)
20005 b.resetWithControl(BlockARMLTnoov, v0)
20006 return true
20007 }
20008
20009
20010
20011 for b.Controls[0].Op == OpARMCMPconst {
20012 v_0 := b.Controls[0]
20013 if auxIntToInt32(v_0.AuxInt) != 0 {
20014 break
20015 }
20016 l := v_0.Args[0]
20017 if l.Op != OpARMSUBshiftRL {
20018 break
20019 }
20020 c := auxIntToInt32(l.AuxInt)
20021 y := l.Args[1]
20022 x := l.Args[0]
20023 if !(l.Uses == 1) {
20024 break
20025 }
20026 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags)
20027 v0.AuxInt = int32ToAuxInt(c)
20028 v0.AddArg2(x, y)
20029 b.resetWithControl(BlockARMLTnoov, v0)
20030 return true
20031 }
20032
20033
20034
20035 for b.Controls[0].Op == OpARMCMPconst {
20036 v_0 := b.Controls[0]
20037 if auxIntToInt32(v_0.AuxInt) != 0 {
20038 break
20039 }
20040 l := v_0.Args[0]
20041 if l.Op != OpARMSUBshiftRA {
20042 break
20043 }
20044 c := auxIntToInt32(l.AuxInt)
20045 y := l.Args[1]
20046 x := l.Args[0]
20047 if !(l.Uses == 1) {
20048 break
20049 }
20050 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags)
20051 v0.AuxInt = int32ToAuxInt(c)
20052 v0.AddArg2(x, y)
20053 b.resetWithControl(BlockARMLTnoov, v0)
20054 return true
20055 }
20056
20057
20058
20059 for b.Controls[0].Op == OpARMCMPconst {
20060 v_0 := b.Controls[0]
20061 if auxIntToInt32(v_0.AuxInt) != 0 {
20062 break
20063 }
20064 l := v_0.Args[0]
20065 if l.Op != OpARMSUBshiftLLreg {
20066 break
20067 }
20068 z := l.Args[2]
20069 x := l.Args[0]
20070 y := l.Args[1]
20071 if !(l.Uses == 1) {
20072 break
20073 }
20074 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
20075 v0.AddArg3(x, y, z)
20076 b.resetWithControl(BlockARMLTnoov, v0)
20077 return true
20078 }
20079
20080
20081
20082 for b.Controls[0].Op == OpARMCMPconst {
20083 v_0 := b.Controls[0]
20084 if auxIntToInt32(v_0.AuxInt) != 0 {
20085 break
20086 }
20087 l := v_0.Args[0]
20088 if l.Op != OpARMSUBshiftRLreg {
20089 break
20090 }
20091 z := l.Args[2]
20092 x := l.Args[0]
20093 y := l.Args[1]
20094 if !(l.Uses == 1) {
20095 break
20096 }
20097 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
20098 v0.AddArg3(x, y, z)
20099 b.resetWithControl(BlockARMLTnoov, v0)
20100 return true
20101 }
20102
20103
20104
20105 for b.Controls[0].Op == OpARMCMPconst {
20106 v_0 := b.Controls[0]
20107 if auxIntToInt32(v_0.AuxInt) != 0 {
20108 break
20109 }
20110 l := v_0.Args[0]
20111 if l.Op != OpARMSUBshiftRAreg {
20112 break
20113 }
20114 z := l.Args[2]
20115 x := l.Args[0]
20116 y := l.Args[1]
20117 if !(l.Uses == 1) {
20118 break
20119 }
20120 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
20121 v0.AddArg3(x, y, z)
20122 b.resetWithControl(BlockARMLTnoov, v0)
20123 return true
20124 }
20125
20126
20127
20128 for b.Controls[0].Op == OpARMCMPconst {
20129 v_0 := b.Controls[0]
20130 if auxIntToInt32(v_0.AuxInt) != 0 {
20131 break
20132 }
20133 l := v_0.Args[0]
20134 if l.Op != OpARMADD {
20135 break
20136 }
20137 _ = l.Args[1]
20138 l_0 := l.Args[0]
20139 l_1 := l.Args[1]
20140 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
20141 x := l_0
20142 y := l_1
20143 if !(l.Uses == 1) {
20144 continue
20145 }
20146 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
20147 v0.AddArg2(x, y)
20148 b.resetWithControl(BlockARMLTnoov, v0)
20149 return true
20150 }
20151 break
20152 }
20153
20154
20155
20156 for b.Controls[0].Op == OpARMCMPconst {
20157 v_0 := b.Controls[0]
20158 if auxIntToInt32(v_0.AuxInt) != 0 {
20159 break
20160 }
20161 l := v_0.Args[0]
20162 if l.Op != OpARMMULA {
20163 break
20164 }
20165 a := l.Args[2]
20166 x := l.Args[0]
20167 y := l.Args[1]
20168 if !(l.Uses == 1) {
20169 break
20170 }
20171 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
20172 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
20173 v1.AddArg2(x, y)
20174 v0.AddArg2(a, v1)
20175 b.resetWithControl(BlockARMLTnoov, v0)
20176 return true
20177 }
20178
20179
20180
20181 for b.Controls[0].Op == OpARMCMPconst {
20182 v_0 := b.Controls[0]
20183 if auxIntToInt32(v_0.AuxInt) != 0 {
20184 break
20185 }
20186 l := v_0.Args[0]
20187 if l.Op != OpARMADDconst {
20188 break
20189 }
20190 c := auxIntToInt32(l.AuxInt)
20191 x := l.Args[0]
20192 if !(l.Uses == 1) {
20193 break
20194 }
20195 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags)
20196 v0.AuxInt = int32ToAuxInt(c)
20197 v0.AddArg(x)
20198 b.resetWithControl(BlockARMLTnoov, v0)
20199 return true
20200 }
20201
20202
20203
20204 for b.Controls[0].Op == OpARMCMPconst {
20205 v_0 := b.Controls[0]
20206 if auxIntToInt32(v_0.AuxInt) != 0 {
20207 break
20208 }
20209 l := v_0.Args[0]
20210 if l.Op != OpARMADDshiftLL {
20211 break
20212 }
20213 c := auxIntToInt32(l.AuxInt)
20214 y := l.Args[1]
20215 x := l.Args[0]
20216 if !(l.Uses == 1) {
20217 break
20218 }
20219 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags)
20220 v0.AuxInt = int32ToAuxInt(c)
20221 v0.AddArg2(x, y)
20222 b.resetWithControl(BlockARMLTnoov, v0)
20223 return true
20224 }
20225
20226
20227
20228 for b.Controls[0].Op == OpARMCMPconst {
20229 v_0 := b.Controls[0]
20230 if auxIntToInt32(v_0.AuxInt) != 0 {
20231 break
20232 }
20233 l := v_0.Args[0]
20234 if l.Op != OpARMADDshiftRL {
20235 break
20236 }
20237 c := auxIntToInt32(l.AuxInt)
20238 y := l.Args[1]
20239 x := l.Args[0]
20240 if !(l.Uses == 1) {
20241 break
20242 }
20243 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags)
20244 v0.AuxInt = int32ToAuxInt(c)
20245 v0.AddArg2(x, y)
20246 b.resetWithControl(BlockARMLTnoov, v0)
20247 return true
20248 }
20249
20250
20251
20252 for b.Controls[0].Op == OpARMCMPconst {
20253 v_0 := b.Controls[0]
20254 if auxIntToInt32(v_0.AuxInt) != 0 {
20255 break
20256 }
20257 l := v_0.Args[0]
20258 if l.Op != OpARMADDshiftRA {
20259 break
20260 }
20261 c := auxIntToInt32(l.AuxInt)
20262 y := l.Args[1]
20263 x := l.Args[0]
20264 if !(l.Uses == 1) {
20265 break
20266 }
20267 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags)
20268 v0.AuxInt = int32ToAuxInt(c)
20269 v0.AddArg2(x, y)
20270 b.resetWithControl(BlockARMLTnoov, v0)
20271 return true
20272 }
20273
20274
20275
20276 for b.Controls[0].Op == OpARMCMPconst {
20277 v_0 := b.Controls[0]
20278 if auxIntToInt32(v_0.AuxInt) != 0 {
20279 break
20280 }
20281 l := v_0.Args[0]
20282 if l.Op != OpARMADDshiftLLreg {
20283 break
20284 }
20285 z := l.Args[2]
20286 x := l.Args[0]
20287 y := l.Args[1]
20288 if !(l.Uses == 1) {
20289 break
20290 }
20291 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags)
20292 v0.AddArg3(x, y, z)
20293 b.resetWithControl(BlockARMLTnoov, v0)
20294 return true
20295 }
20296
20297
20298
20299 for b.Controls[0].Op == OpARMCMPconst {
20300 v_0 := b.Controls[0]
20301 if auxIntToInt32(v_0.AuxInt) != 0 {
20302 break
20303 }
20304 l := v_0.Args[0]
20305 if l.Op != OpARMADDshiftRLreg {
20306 break
20307 }
20308 z := l.Args[2]
20309 x := l.Args[0]
20310 y := l.Args[1]
20311 if !(l.Uses == 1) {
20312 break
20313 }
20314 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags)
20315 v0.AddArg3(x, y, z)
20316 b.resetWithControl(BlockARMLTnoov, v0)
20317 return true
20318 }
20319
20320
20321
20322 for b.Controls[0].Op == OpARMCMPconst {
20323 v_0 := b.Controls[0]
20324 if auxIntToInt32(v_0.AuxInt) != 0 {
20325 break
20326 }
20327 l := v_0.Args[0]
20328 if l.Op != OpARMADDshiftRAreg {
20329 break
20330 }
20331 z := l.Args[2]
20332 x := l.Args[0]
20333 y := l.Args[1]
20334 if !(l.Uses == 1) {
20335 break
20336 }
20337 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags)
20338 v0.AddArg3(x, y, z)
20339 b.resetWithControl(BlockARMLTnoov, v0)
20340 return true
20341 }
20342
20343
20344
20345 for b.Controls[0].Op == OpARMCMPconst {
20346 v_0 := b.Controls[0]
20347 if auxIntToInt32(v_0.AuxInt) != 0 {
20348 break
20349 }
20350 l := v_0.Args[0]
20351 if l.Op != OpARMAND {
20352 break
20353 }
20354 _ = l.Args[1]
20355 l_0 := l.Args[0]
20356 l_1 := l.Args[1]
20357 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
20358 x := l_0
20359 y := l_1
20360 if !(l.Uses == 1) {
20361 continue
20362 }
20363 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags)
20364 v0.AddArg2(x, y)
20365 b.resetWithControl(BlockARMLTnoov, v0)
20366 return true
20367 }
20368 break
20369 }
20370
20371
20372
20373 for b.Controls[0].Op == OpARMCMPconst {
20374 v_0 := b.Controls[0]
20375 if auxIntToInt32(v_0.AuxInt) != 0 {
20376 break
20377 }
20378 l := v_0.Args[0]
20379 if l.Op != OpARMANDconst {
20380 break
20381 }
20382 c := auxIntToInt32(l.AuxInt)
20383 x := l.Args[0]
20384 if !(l.Uses == 1) {
20385 break
20386 }
20387 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags)
20388 v0.AuxInt = int32ToAuxInt(c)
20389 v0.AddArg(x)
20390 b.resetWithControl(BlockARMLTnoov, v0)
20391 return true
20392 }
20393
20394
20395
20396 for b.Controls[0].Op == OpARMCMPconst {
20397 v_0 := b.Controls[0]
20398 if auxIntToInt32(v_0.AuxInt) != 0 {
20399 break
20400 }
20401 l := v_0.Args[0]
20402 if l.Op != OpARMANDshiftLL {
20403 break
20404 }
20405 c := auxIntToInt32(l.AuxInt)
20406 y := l.Args[1]
20407 x := l.Args[0]
20408 if !(l.Uses == 1) {
20409 break
20410 }
20411 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags)
20412 v0.AuxInt = int32ToAuxInt(c)
20413 v0.AddArg2(x, y)
20414 b.resetWithControl(BlockARMLTnoov, v0)
20415 return true
20416 }
20417
20418
20419
20420 for b.Controls[0].Op == OpARMCMPconst {
20421 v_0 := b.Controls[0]
20422 if auxIntToInt32(v_0.AuxInt) != 0 {
20423 break
20424 }
20425 l := v_0.Args[0]
20426 if l.Op != OpARMANDshiftRL {
20427 break
20428 }
20429 c := auxIntToInt32(l.AuxInt)
20430 y := l.Args[1]
20431 x := l.Args[0]
20432 if !(l.Uses == 1) {
20433 break
20434 }
20435 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags)
20436 v0.AuxInt = int32ToAuxInt(c)
20437 v0.AddArg2(x, y)
20438 b.resetWithControl(BlockARMLTnoov, v0)
20439 return true
20440 }
20441
20442
20443
20444 for b.Controls[0].Op == OpARMCMPconst {
20445 v_0 := b.Controls[0]
20446 if auxIntToInt32(v_0.AuxInt) != 0 {
20447 break
20448 }
20449 l := v_0.Args[0]
20450 if l.Op != OpARMANDshiftRA {
20451 break
20452 }
20453 c := auxIntToInt32(l.AuxInt)
20454 y := l.Args[1]
20455 x := l.Args[0]
20456 if !(l.Uses == 1) {
20457 break
20458 }
20459 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags)
20460 v0.AuxInt = int32ToAuxInt(c)
20461 v0.AddArg2(x, y)
20462 b.resetWithControl(BlockARMLTnoov, v0)
20463 return true
20464 }
20465
20466
20467
20468 for b.Controls[0].Op == OpARMCMPconst {
20469 v_0 := b.Controls[0]
20470 if auxIntToInt32(v_0.AuxInt) != 0 {
20471 break
20472 }
20473 l := v_0.Args[0]
20474 if l.Op != OpARMANDshiftLLreg {
20475 break
20476 }
20477 z := l.Args[2]
20478 x := l.Args[0]
20479 y := l.Args[1]
20480 if !(l.Uses == 1) {
20481 break
20482 }
20483 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags)
20484 v0.AddArg3(x, y, z)
20485 b.resetWithControl(BlockARMLTnoov, v0)
20486 return true
20487 }
20488
20489
20490
20491 for b.Controls[0].Op == OpARMCMPconst {
20492 v_0 := b.Controls[0]
20493 if auxIntToInt32(v_0.AuxInt) != 0 {
20494 break
20495 }
20496 l := v_0.Args[0]
20497 if l.Op != OpARMANDshiftRLreg {
20498 break
20499 }
20500 z := l.Args[2]
20501 x := l.Args[0]
20502 y := l.Args[1]
20503 if !(l.Uses == 1) {
20504 break
20505 }
20506 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags)
20507 v0.AddArg3(x, y, z)
20508 b.resetWithControl(BlockARMLTnoov, v0)
20509 return true
20510 }
20511
20512
20513
20514 for b.Controls[0].Op == OpARMCMPconst {
20515 v_0 := b.Controls[0]
20516 if auxIntToInt32(v_0.AuxInt) != 0 {
20517 break
20518 }
20519 l := v_0.Args[0]
20520 if l.Op != OpARMANDshiftRAreg {
20521 break
20522 }
20523 z := l.Args[2]
20524 x := l.Args[0]
20525 y := l.Args[1]
20526 if !(l.Uses == 1) {
20527 break
20528 }
20529 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags)
20530 v0.AddArg3(x, y, z)
20531 b.resetWithControl(BlockARMLTnoov, v0)
20532 return true
20533 }
20534
20535
20536
20537 for b.Controls[0].Op == OpARMCMPconst {
20538 v_0 := b.Controls[0]
20539 if auxIntToInt32(v_0.AuxInt) != 0 {
20540 break
20541 }
20542 l := v_0.Args[0]
20543 if l.Op != OpARMXOR {
20544 break
20545 }
20546 _ = l.Args[1]
20547 l_0 := l.Args[0]
20548 l_1 := l.Args[1]
20549 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
20550 x := l_0
20551 y := l_1
20552 if !(l.Uses == 1) {
20553 continue
20554 }
20555 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags)
20556 v0.AddArg2(x, y)
20557 b.resetWithControl(BlockARMLTnoov, v0)
20558 return true
20559 }
20560 break
20561 }
20562
20563
20564
20565 for b.Controls[0].Op == OpARMCMPconst {
20566 v_0 := b.Controls[0]
20567 if auxIntToInt32(v_0.AuxInt) != 0 {
20568 break
20569 }
20570 l := v_0.Args[0]
20571 if l.Op != OpARMXORconst {
20572 break
20573 }
20574 c := auxIntToInt32(l.AuxInt)
20575 x := l.Args[0]
20576 if !(l.Uses == 1) {
20577 break
20578 }
20579 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags)
20580 v0.AuxInt = int32ToAuxInt(c)
20581 v0.AddArg(x)
20582 b.resetWithControl(BlockARMLTnoov, v0)
20583 return true
20584 }
20585
20586
20587
20588 for b.Controls[0].Op == OpARMCMPconst {
20589 v_0 := b.Controls[0]
20590 if auxIntToInt32(v_0.AuxInt) != 0 {
20591 break
20592 }
20593 l := v_0.Args[0]
20594 if l.Op != OpARMXORshiftLL {
20595 break
20596 }
20597 c := auxIntToInt32(l.AuxInt)
20598 y := l.Args[1]
20599 x := l.Args[0]
20600 if !(l.Uses == 1) {
20601 break
20602 }
20603 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags)
20604 v0.AuxInt = int32ToAuxInt(c)
20605 v0.AddArg2(x, y)
20606 b.resetWithControl(BlockARMLTnoov, v0)
20607 return true
20608 }
20609
20610
20611
20612 for b.Controls[0].Op == OpARMCMPconst {
20613 v_0 := b.Controls[0]
20614 if auxIntToInt32(v_0.AuxInt) != 0 {
20615 break
20616 }
20617 l := v_0.Args[0]
20618 if l.Op != OpARMXORshiftRL {
20619 break
20620 }
20621 c := auxIntToInt32(l.AuxInt)
20622 y := l.Args[1]
20623 x := l.Args[0]
20624 if !(l.Uses == 1) {
20625 break
20626 }
20627 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags)
20628 v0.AuxInt = int32ToAuxInt(c)
20629 v0.AddArg2(x, y)
20630 b.resetWithControl(BlockARMLTnoov, v0)
20631 return true
20632 }
20633
20634
20635
20636 for b.Controls[0].Op == OpARMCMPconst {
20637 v_0 := b.Controls[0]
20638 if auxIntToInt32(v_0.AuxInt) != 0 {
20639 break
20640 }
20641 l := v_0.Args[0]
20642 if l.Op != OpARMXORshiftRA {
20643 break
20644 }
20645 c := auxIntToInt32(l.AuxInt)
20646 y := l.Args[1]
20647 x := l.Args[0]
20648 if !(l.Uses == 1) {
20649 break
20650 }
20651 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags)
20652 v0.AuxInt = int32ToAuxInt(c)
20653 v0.AddArg2(x, y)
20654 b.resetWithControl(BlockARMLTnoov, v0)
20655 return true
20656 }
20657
20658
20659
20660 for b.Controls[0].Op == OpARMCMPconst {
20661 v_0 := b.Controls[0]
20662 if auxIntToInt32(v_0.AuxInt) != 0 {
20663 break
20664 }
20665 l := v_0.Args[0]
20666 if l.Op != OpARMXORshiftLLreg {
20667 break
20668 }
20669 z := l.Args[2]
20670 x := l.Args[0]
20671 y := l.Args[1]
20672 if !(l.Uses == 1) {
20673 break
20674 }
20675 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags)
20676 v0.AddArg3(x, y, z)
20677 b.resetWithControl(BlockARMLTnoov, v0)
20678 return true
20679 }
20680
20681
20682
20683 for b.Controls[0].Op == OpARMCMPconst {
20684 v_0 := b.Controls[0]
20685 if auxIntToInt32(v_0.AuxInt) != 0 {
20686 break
20687 }
20688 l := v_0.Args[0]
20689 if l.Op != OpARMXORshiftRLreg {
20690 break
20691 }
20692 z := l.Args[2]
20693 x := l.Args[0]
20694 y := l.Args[1]
20695 if !(l.Uses == 1) {
20696 break
20697 }
20698 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags)
20699 v0.AddArg3(x, y, z)
20700 b.resetWithControl(BlockARMLTnoov, v0)
20701 return true
20702 }
20703
20704
20705
20706 for b.Controls[0].Op == OpARMCMPconst {
20707 v_0 := b.Controls[0]
20708 if auxIntToInt32(v_0.AuxInt) != 0 {
20709 break
20710 }
20711 l := v_0.Args[0]
20712 if l.Op != OpARMXORshiftRAreg {
20713 break
20714 }
20715 z := l.Args[2]
20716 x := l.Args[0]
20717 y := l.Args[1]
20718 if !(l.Uses == 1) {
20719 break
20720 }
20721 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags)
20722 v0.AddArg3(x, y, z)
20723 b.resetWithControl(BlockARMLTnoov, v0)
20724 return true
20725 }
20726 case BlockARMLTnoov:
20727
20728
20729
20730 for b.Controls[0].Op == OpARMFlagConstant {
20731 v_0 := b.Controls[0]
20732 fc := auxIntToFlagConstant(v_0.AuxInt)
20733 if !(fc.ltNoov()) {
20734 break
20735 }
20736 b.Reset(BlockFirst)
20737 return true
20738 }
20739
20740
20741
20742 for b.Controls[0].Op == OpARMFlagConstant {
20743 v_0 := b.Controls[0]
20744 fc := auxIntToFlagConstant(v_0.AuxInt)
20745 if !(!fc.ltNoov()) {
20746 break
20747 }
20748 b.Reset(BlockFirst)
20749 b.swapSuccessors()
20750 return true
20751 }
20752
20753
20754 for b.Controls[0].Op == OpARMInvertFlags {
20755 v_0 := b.Controls[0]
20756 cmp := v_0.Args[0]
20757 b.resetWithControl(BlockARMGTnoov, cmp)
20758 return true
20759 }
20760 case BlockARMNE:
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 != OpARMEqual {
20770 break
20771 }
20772 cc := v_0_0.Args[0]
20773 b.resetWithControl(BlockARMEQ, 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 != OpARMNotEqual {
20785 break
20786 }
20787 cc := v_0_0.Args[0]
20788 b.resetWithControl(BlockARMNE, 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 != OpARMLessThan {
20800 break
20801 }
20802 cc := v_0_0.Args[0]
20803 b.resetWithControl(BlockARMLT, 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 != OpARMLessThanU {
20815 break
20816 }
20817 cc := v_0_0.Args[0]
20818 b.resetWithControl(BlockARMULT, 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 != OpARMLessEqual {
20830 break
20831 }
20832 cc := v_0_0.Args[0]
20833 b.resetWithControl(BlockARMLE, 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 != OpARMLessEqualU {
20845 break
20846 }
20847 cc := v_0_0.Args[0]
20848 b.resetWithControl(BlockARMULE, 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 != OpARMGreaterThan {
20860 break
20861 }
20862 cc := v_0_0.Args[0]
20863 b.resetWithControl(BlockARMGT, 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 != OpARMGreaterThanU {
20875 break
20876 }
20877 cc := v_0_0.Args[0]
20878 b.resetWithControl(BlockARMUGT, cc)
20879 return true
20880 }
20881
20882
20883 for b.Controls[0].Op == OpARMCMPconst {
20884 v_0 := b.Controls[0]
20885 if auxIntToInt32(v_0.AuxInt) != 0 {
20886 break
20887 }
20888 v_0_0 := v_0.Args[0]
20889 if v_0_0.Op != OpARMGreaterEqual {
20890 break
20891 }
20892 cc := v_0_0.Args[0]
20893 b.resetWithControl(BlockARMGE, cc)
20894 return true
20895 }
20896
20897
20898 for b.Controls[0].Op == OpARMCMPconst {
20899 v_0 := b.Controls[0]
20900 if auxIntToInt32(v_0.AuxInt) != 0 {
20901 break
20902 }
20903 v_0_0 := v_0.Args[0]
20904 if v_0_0.Op != OpARMGreaterEqualU {
20905 break
20906 }
20907 cc := v_0_0.Args[0]
20908 b.resetWithControl(BlockARMUGE, cc)
20909 return true
20910 }
20911
20912
20913
20914 for b.Controls[0].Op == OpARMFlagConstant {
20915 v_0 := b.Controls[0]
20916 fc := auxIntToFlagConstant(v_0.AuxInt)
20917 if !(fc.ne()) {
20918 break
20919 }
20920 b.Reset(BlockFirst)
20921 return true
20922 }
20923
20924
20925
20926 for b.Controls[0].Op == OpARMFlagConstant {
20927 v_0 := b.Controls[0]
20928 fc := auxIntToFlagConstant(v_0.AuxInt)
20929 if !(!fc.ne()) {
20930 break
20931 }
20932 b.Reset(BlockFirst)
20933 b.swapSuccessors()
20934 return true
20935 }
20936
20937
20938 for b.Controls[0].Op == OpARMInvertFlags {
20939 v_0 := b.Controls[0]
20940 cmp := v_0.Args[0]
20941 b.resetWithControl(BlockARMNE, cmp)
20942 return true
20943 }
20944
20945
20946 for b.Controls[0].Op == OpARMCMP {
20947 v_0 := b.Controls[0]
20948 _ = v_0.Args[1]
20949 x := v_0.Args[0]
20950 v_0_1 := v_0.Args[1]
20951 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 {
20952 break
20953 }
20954 y := v_0_1.Args[0]
20955 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
20956 v0.AddArg2(x, y)
20957 b.resetWithControl(BlockARMNE, v0)
20958 return true
20959 }
20960
20961
20962 for b.Controls[0].Op == OpARMCMN {
20963 v_0 := b.Controls[0]
20964 _ = v_0.Args[1]
20965 v_0_0 := v_0.Args[0]
20966 v_0_1 := v_0.Args[1]
20967 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
20968 x := v_0_0
20969 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 {
20970 continue
20971 }
20972 y := v_0_1.Args[0]
20973 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
20974 v0.AddArg2(x, y)
20975 b.resetWithControl(BlockARMNE, v0)
20976 return true
20977 }
20978 break
20979 }
20980
20981
20982
20983 for b.Controls[0].Op == OpARMCMPconst {
20984 v_0 := b.Controls[0]
20985 if auxIntToInt32(v_0.AuxInt) != 0 {
20986 break
20987 }
20988 l := v_0.Args[0]
20989 if l.Op != OpARMSUB {
20990 break
20991 }
20992 y := l.Args[1]
20993 x := l.Args[0]
20994 if !(l.Uses == 1) {
20995 break
20996 }
20997 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
20998 v0.AddArg2(x, y)
20999 b.resetWithControl(BlockARMNE, v0)
21000 return true
21001 }
21002
21003
21004
21005 for b.Controls[0].Op == OpARMCMPconst {
21006 v_0 := b.Controls[0]
21007 if auxIntToInt32(v_0.AuxInt) != 0 {
21008 break
21009 }
21010 l := v_0.Args[0]
21011 if l.Op != OpARMMULS {
21012 break
21013 }
21014 a := l.Args[2]
21015 x := l.Args[0]
21016 y := l.Args[1]
21017 if !(l.Uses == 1) {
21018 break
21019 }
21020 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
21021 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
21022 v1.AddArg2(x, y)
21023 v0.AddArg2(a, v1)
21024 b.resetWithControl(BlockARMNE, v0)
21025 return true
21026 }
21027
21028
21029
21030 for b.Controls[0].Op == OpARMCMPconst {
21031 v_0 := b.Controls[0]
21032 if auxIntToInt32(v_0.AuxInt) != 0 {
21033 break
21034 }
21035 l := v_0.Args[0]
21036 if l.Op != OpARMSUBconst {
21037 break
21038 }
21039 c := auxIntToInt32(l.AuxInt)
21040 x := l.Args[0]
21041 if !(l.Uses == 1) {
21042 break
21043 }
21044 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags)
21045 v0.AuxInt = int32ToAuxInt(c)
21046 v0.AddArg(x)
21047 b.resetWithControl(BlockARMNE, v0)
21048 return true
21049 }
21050
21051
21052
21053 for b.Controls[0].Op == OpARMCMPconst {
21054 v_0 := b.Controls[0]
21055 if auxIntToInt32(v_0.AuxInt) != 0 {
21056 break
21057 }
21058 l := v_0.Args[0]
21059 if l.Op != OpARMSUBshiftLL {
21060 break
21061 }
21062 c := auxIntToInt32(l.AuxInt)
21063 y := l.Args[1]
21064 x := l.Args[0]
21065 if !(l.Uses == 1) {
21066 break
21067 }
21068 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags)
21069 v0.AuxInt = int32ToAuxInt(c)
21070 v0.AddArg2(x, y)
21071 b.resetWithControl(BlockARMNE, v0)
21072 return true
21073 }
21074
21075
21076
21077 for b.Controls[0].Op == OpARMCMPconst {
21078 v_0 := b.Controls[0]
21079 if auxIntToInt32(v_0.AuxInt) != 0 {
21080 break
21081 }
21082 l := v_0.Args[0]
21083 if l.Op != OpARMSUBshiftRL {
21084 break
21085 }
21086 c := auxIntToInt32(l.AuxInt)
21087 y := l.Args[1]
21088 x := l.Args[0]
21089 if !(l.Uses == 1) {
21090 break
21091 }
21092 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags)
21093 v0.AuxInt = int32ToAuxInt(c)
21094 v0.AddArg2(x, y)
21095 b.resetWithControl(BlockARMNE, v0)
21096 return true
21097 }
21098
21099
21100
21101 for b.Controls[0].Op == OpARMCMPconst {
21102 v_0 := b.Controls[0]
21103 if auxIntToInt32(v_0.AuxInt) != 0 {
21104 break
21105 }
21106 l := v_0.Args[0]
21107 if l.Op != OpARMSUBshiftRA {
21108 break
21109 }
21110 c := auxIntToInt32(l.AuxInt)
21111 y := l.Args[1]
21112 x := l.Args[0]
21113 if !(l.Uses == 1) {
21114 break
21115 }
21116 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags)
21117 v0.AuxInt = int32ToAuxInt(c)
21118 v0.AddArg2(x, y)
21119 b.resetWithControl(BlockARMNE, v0)
21120 return true
21121 }
21122
21123
21124
21125 for b.Controls[0].Op == OpARMCMPconst {
21126 v_0 := b.Controls[0]
21127 if auxIntToInt32(v_0.AuxInt) != 0 {
21128 break
21129 }
21130 l := v_0.Args[0]
21131 if l.Op != OpARMSUBshiftLLreg {
21132 break
21133 }
21134 z := l.Args[2]
21135 x := l.Args[0]
21136 y := l.Args[1]
21137 if !(l.Uses == 1) {
21138 break
21139 }
21140 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
21141 v0.AddArg3(x, y, z)
21142 b.resetWithControl(BlockARMNE, v0)
21143 return true
21144 }
21145
21146
21147
21148 for b.Controls[0].Op == OpARMCMPconst {
21149 v_0 := b.Controls[0]
21150 if auxIntToInt32(v_0.AuxInt) != 0 {
21151 break
21152 }
21153 l := v_0.Args[0]
21154 if l.Op != OpARMSUBshiftRLreg {
21155 break
21156 }
21157 z := l.Args[2]
21158 x := l.Args[0]
21159 y := l.Args[1]
21160 if !(l.Uses == 1) {
21161 break
21162 }
21163 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
21164 v0.AddArg3(x, y, z)
21165 b.resetWithControl(BlockARMNE, v0)
21166 return true
21167 }
21168
21169
21170
21171 for b.Controls[0].Op == OpARMCMPconst {
21172 v_0 := b.Controls[0]
21173 if auxIntToInt32(v_0.AuxInt) != 0 {
21174 break
21175 }
21176 l := v_0.Args[0]
21177 if l.Op != OpARMSUBshiftRAreg {
21178 break
21179 }
21180 z := l.Args[2]
21181 x := l.Args[0]
21182 y := l.Args[1]
21183 if !(l.Uses == 1) {
21184 break
21185 }
21186 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
21187 v0.AddArg3(x, y, z)
21188 b.resetWithControl(BlockARMNE, v0)
21189 return true
21190 }
21191
21192
21193
21194 for b.Controls[0].Op == OpARMCMPconst {
21195 v_0 := b.Controls[0]
21196 if auxIntToInt32(v_0.AuxInt) != 0 {
21197 break
21198 }
21199 l := v_0.Args[0]
21200 if l.Op != OpARMADD {
21201 break
21202 }
21203 _ = l.Args[1]
21204 l_0 := l.Args[0]
21205 l_1 := l.Args[1]
21206 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
21207 x := l_0
21208 y := l_1
21209 if !(l.Uses == 1) {
21210 continue
21211 }
21212 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
21213 v0.AddArg2(x, y)
21214 b.resetWithControl(BlockARMNE, v0)
21215 return true
21216 }
21217 break
21218 }
21219
21220
21221
21222 for b.Controls[0].Op == OpARMCMPconst {
21223 v_0 := b.Controls[0]
21224 if auxIntToInt32(v_0.AuxInt) != 0 {
21225 break
21226 }
21227 l := v_0.Args[0]
21228 if l.Op != OpARMMULA {
21229 break
21230 }
21231 a := l.Args[2]
21232 x := l.Args[0]
21233 y := l.Args[1]
21234 if !(l.Uses == 1) {
21235 break
21236 }
21237 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
21238 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
21239 v1.AddArg2(x, y)
21240 v0.AddArg2(a, v1)
21241 b.resetWithControl(BlockARMNE, v0)
21242 return true
21243 }
21244
21245
21246
21247 for b.Controls[0].Op == OpARMCMPconst {
21248 v_0 := b.Controls[0]
21249 if auxIntToInt32(v_0.AuxInt) != 0 {
21250 break
21251 }
21252 l := v_0.Args[0]
21253 if l.Op != OpARMADDconst {
21254 break
21255 }
21256 c := auxIntToInt32(l.AuxInt)
21257 x := l.Args[0]
21258 if !(l.Uses == 1) {
21259 break
21260 }
21261 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags)
21262 v0.AuxInt = int32ToAuxInt(c)
21263 v0.AddArg(x)
21264 b.resetWithControl(BlockARMNE, v0)
21265 return true
21266 }
21267
21268
21269
21270 for b.Controls[0].Op == OpARMCMPconst {
21271 v_0 := b.Controls[0]
21272 if auxIntToInt32(v_0.AuxInt) != 0 {
21273 break
21274 }
21275 l := v_0.Args[0]
21276 if l.Op != OpARMADDshiftLL {
21277 break
21278 }
21279 c := auxIntToInt32(l.AuxInt)
21280 y := l.Args[1]
21281 x := l.Args[0]
21282 if !(l.Uses == 1) {
21283 break
21284 }
21285 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags)
21286 v0.AuxInt = int32ToAuxInt(c)
21287 v0.AddArg2(x, y)
21288 b.resetWithControl(BlockARMNE, v0)
21289 return true
21290 }
21291
21292
21293
21294 for b.Controls[0].Op == OpARMCMPconst {
21295 v_0 := b.Controls[0]
21296 if auxIntToInt32(v_0.AuxInt) != 0 {
21297 break
21298 }
21299 l := v_0.Args[0]
21300 if l.Op != OpARMADDshiftRL {
21301 break
21302 }
21303 c := auxIntToInt32(l.AuxInt)
21304 y := l.Args[1]
21305 x := l.Args[0]
21306 if !(l.Uses == 1) {
21307 break
21308 }
21309 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags)
21310 v0.AuxInt = int32ToAuxInt(c)
21311 v0.AddArg2(x, y)
21312 b.resetWithControl(BlockARMNE, v0)
21313 return true
21314 }
21315
21316
21317
21318 for b.Controls[0].Op == OpARMCMPconst {
21319 v_0 := b.Controls[0]
21320 if auxIntToInt32(v_0.AuxInt) != 0 {
21321 break
21322 }
21323 l := v_0.Args[0]
21324 if l.Op != OpARMADDshiftRA {
21325 break
21326 }
21327 c := auxIntToInt32(l.AuxInt)
21328 y := l.Args[1]
21329 x := l.Args[0]
21330 if !(l.Uses == 1) {
21331 break
21332 }
21333 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags)
21334 v0.AuxInt = int32ToAuxInt(c)
21335 v0.AddArg2(x, y)
21336 b.resetWithControl(BlockARMNE, v0)
21337 return true
21338 }
21339
21340
21341
21342 for b.Controls[0].Op == OpARMCMPconst {
21343 v_0 := b.Controls[0]
21344 if auxIntToInt32(v_0.AuxInt) != 0 {
21345 break
21346 }
21347 l := v_0.Args[0]
21348 if l.Op != OpARMADDshiftLLreg {
21349 break
21350 }
21351 z := l.Args[2]
21352 x := l.Args[0]
21353 y := l.Args[1]
21354 if !(l.Uses == 1) {
21355 break
21356 }
21357 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags)
21358 v0.AddArg3(x, y, z)
21359 b.resetWithControl(BlockARMNE, v0)
21360 return true
21361 }
21362
21363
21364
21365 for b.Controls[0].Op == OpARMCMPconst {
21366 v_0 := b.Controls[0]
21367 if auxIntToInt32(v_0.AuxInt) != 0 {
21368 break
21369 }
21370 l := v_0.Args[0]
21371 if l.Op != OpARMADDshiftRLreg {
21372 break
21373 }
21374 z := l.Args[2]
21375 x := l.Args[0]
21376 y := l.Args[1]
21377 if !(l.Uses == 1) {
21378 break
21379 }
21380 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags)
21381 v0.AddArg3(x, y, z)
21382 b.resetWithControl(BlockARMNE, v0)
21383 return true
21384 }
21385
21386
21387
21388 for b.Controls[0].Op == OpARMCMPconst {
21389 v_0 := b.Controls[0]
21390 if auxIntToInt32(v_0.AuxInt) != 0 {
21391 break
21392 }
21393 l := v_0.Args[0]
21394 if l.Op != OpARMADDshiftRAreg {
21395 break
21396 }
21397 z := l.Args[2]
21398 x := l.Args[0]
21399 y := l.Args[1]
21400 if !(l.Uses == 1) {
21401 break
21402 }
21403 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags)
21404 v0.AddArg3(x, y, z)
21405 b.resetWithControl(BlockARMNE, v0)
21406 return true
21407 }
21408
21409
21410
21411 for b.Controls[0].Op == OpARMCMPconst {
21412 v_0 := b.Controls[0]
21413 if auxIntToInt32(v_0.AuxInt) != 0 {
21414 break
21415 }
21416 l := v_0.Args[0]
21417 if l.Op != OpARMAND {
21418 break
21419 }
21420 _ = l.Args[1]
21421 l_0 := l.Args[0]
21422 l_1 := l.Args[1]
21423 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
21424 x := l_0
21425 y := l_1
21426 if !(l.Uses == 1) {
21427 continue
21428 }
21429 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags)
21430 v0.AddArg2(x, y)
21431 b.resetWithControl(BlockARMNE, v0)
21432 return true
21433 }
21434 break
21435 }
21436
21437
21438
21439 for b.Controls[0].Op == OpARMCMPconst {
21440 v_0 := b.Controls[0]
21441 if auxIntToInt32(v_0.AuxInt) != 0 {
21442 break
21443 }
21444 l := v_0.Args[0]
21445 if l.Op != OpARMANDconst {
21446 break
21447 }
21448 c := auxIntToInt32(l.AuxInt)
21449 x := l.Args[0]
21450 if !(l.Uses == 1) {
21451 break
21452 }
21453 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags)
21454 v0.AuxInt = int32ToAuxInt(c)
21455 v0.AddArg(x)
21456 b.resetWithControl(BlockARMNE, v0)
21457 return true
21458 }
21459
21460
21461
21462 for b.Controls[0].Op == OpARMCMPconst {
21463 v_0 := b.Controls[0]
21464 if auxIntToInt32(v_0.AuxInt) != 0 {
21465 break
21466 }
21467 l := v_0.Args[0]
21468 if l.Op != OpARMANDshiftLL {
21469 break
21470 }
21471 c := auxIntToInt32(l.AuxInt)
21472 y := l.Args[1]
21473 x := l.Args[0]
21474 if !(l.Uses == 1) {
21475 break
21476 }
21477 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags)
21478 v0.AuxInt = int32ToAuxInt(c)
21479 v0.AddArg2(x, y)
21480 b.resetWithControl(BlockARMNE, v0)
21481 return true
21482 }
21483
21484
21485
21486 for b.Controls[0].Op == OpARMCMPconst {
21487 v_0 := b.Controls[0]
21488 if auxIntToInt32(v_0.AuxInt) != 0 {
21489 break
21490 }
21491 l := v_0.Args[0]
21492 if l.Op != OpARMANDshiftRL {
21493 break
21494 }
21495 c := auxIntToInt32(l.AuxInt)
21496 y := l.Args[1]
21497 x := l.Args[0]
21498 if !(l.Uses == 1) {
21499 break
21500 }
21501 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags)
21502 v0.AuxInt = int32ToAuxInt(c)
21503 v0.AddArg2(x, y)
21504 b.resetWithControl(BlockARMNE, v0)
21505 return true
21506 }
21507
21508
21509
21510 for b.Controls[0].Op == OpARMCMPconst {
21511 v_0 := b.Controls[0]
21512 if auxIntToInt32(v_0.AuxInt) != 0 {
21513 break
21514 }
21515 l := v_0.Args[0]
21516 if l.Op != OpARMANDshiftRA {
21517 break
21518 }
21519 c := auxIntToInt32(l.AuxInt)
21520 y := l.Args[1]
21521 x := l.Args[0]
21522 if !(l.Uses == 1) {
21523 break
21524 }
21525 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags)
21526 v0.AuxInt = int32ToAuxInt(c)
21527 v0.AddArg2(x, y)
21528 b.resetWithControl(BlockARMNE, v0)
21529 return true
21530 }
21531
21532
21533
21534 for b.Controls[0].Op == OpARMCMPconst {
21535 v_0 := b.Controls[0]
21536 if auxIntToInt32(v_0.AuxInt) != 0 {
21537 break
21538 }
21539 l := v_0.Args[0]
21540 if l.Op != OpARMANDshiftLLreg {
21541 break
21542 }
21543 z := l.Args[2]
21544 x := l.Args[0]
21545 y := l.Args[1]
21546 if !(l.Uses == 1) {
21547 break
21548 }
21549 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags)
21550 v0.AddArg3(x, y, z)
21551 b.resetWithControl(BlockARMNE, v0)
21552 return true
21553 }
21554
21555
21556
21557 for b.Controls[0].Op == OpARMCMPconst {
21558 v_0 := b.Controls[0]
21559 if auxIntToInt32(v_0.AuxInt) != 0 {
21560 break
21561 }
21562 l := v_0.Args[0]
21563 if l.Op != OpARMANDshiftRLreg {
21564 break
21565 }
21566 z := l.Args[2]
21567 x := l.Args[0]
21568 y := l.Args[1]
21569 if !(l.Uses == 1) {
21570 break
21571 }
21572 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags)
21573 v0.AddArg3(x, y, z)
21574 b.resetWithControl(BlockARMNE, v0)
21575 return true
21576 }
21577
21578
21579
21580 for b.Controls[0].Op == OpARMCMPconst {
21581 v_0 := b.Controls[0]
21582 if auxIntToInt32(v_0.AuxInt) != 0 {
21583 break
21584 }
21585 l := v_0.Args[0]
21586 if l.Op != OpARMANDshiftRAreg {
21587 break
21588 }
21589 z := l.Args[2]
21590 x := l.Args[0]
21591 y := l.Args[1]
21592 if !(l.Uses == 1) {
21593 break
21594 }
21595 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags)
21596 v0.AddArg3(x, y, z)
21597 b.resetWithControl(BlockARMNE, v0)
21598 return true
21599 }
21600
21601
21602
21603 for b.Controls[0].Op == OpARMCMPconst {
21604 v_0 := b.Controls[0]
21605 if auxIntToInt32(v_0.AuxInt) != 0 {
21606 break
21607 }
21608 l := v_0.Args[0]
21609 if l.Op != OpARMXOR {
21610 break
21611 }
21612 _ = l.Args[1]
21613 l_0 := l.Args[0]
21614 l_1 := l.Args[1]
21615 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
21616 x := l_0
21617 y := l_1
21618 if !(l.Uses == 1) {
21619 continue
21620 }
21621 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags)
21622 v0.AddArg2(x, y)
21623 b.resetWithControl(BlockARMNE, v0)
21624 return true
21625 }
21626 break
21627 }
21628
21629
21630
21631 for b.Controls[0].Op == OpARMCMPconst {
21632 v_0 := b.Controls[0]
21633 if auxIntToInt32(v_0.AuxInt) != 0 {
21634 break
21635 }
21636 l := v_0.Args[0]
21637 if l.Op != OpARMXORconst {
21638 break
21639 }
21640 c := auxIntToInt32(l.AuxInt)
21641 x := l.Args[0]
21642 if !(l.Uses == 1) {
21643 break
21644 }
21645 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags)
21646 v0.AuxInt = int32ToAuxInt(c)
21647 v0.AddArg(x)
21648 b.resetWithControl(BlockARMNE, v0)
21649 return true
21650 }
21651
21652
21653
21654 for b.Controls[0].Op == OpARMCMPconst {
21655 v_0 := b.Controls[0]
21656 if auxIntToInt32(v_0.AuxInt) != 0 {
21657 break
21658 }
21659 l := v_0.Args[0]
21660 if l.Op != OpARMXORshiftLL {
21661 break
21662 }
21663 c := auxIntToInt32(l.AuxInt)
21664 y := l.Args[1]
21665 x := l.Args[0]
21666 if !(l.Uses == 1) {
21667 break
21668 }
21669 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags)
21670 v0.AuxInt = int32ToAuxInt(c)
21671 v0.AddArg2(x, y)
21672 b.resetWithControl(BlockARMNE, v0)
21673 return true
21674 }
21675
21676
21677
21678 for b.Controls[0].Op == OpARMCMPconst {
21679 v_0 := b.Controls[0]
21680 if auxIntToInt32(v_0.AuxInt) != 0 {
21681 break
21682 }
21683 l := v_0.Args[0]
21684 if l.Op != OpARMXORshiftRL {
21685 break
21686 }
21687 c := auxIntToInt32(l.AuxInt)
21688 y := l.Args[1]
21689 x := l.Args[0]
21690 if !(l.Uses == 1) {
21691 break
21692 }
21693 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags)
21694 v0.AuxInt = int32ToAuxInt(c)
21695 v0.AddArg2(x, y)
21696 b.resetWithControl(BlockARMNE, v0)
21697 return true
21698 }
21699
21700
21701
21702 for b.Controls[0].Op == OpARMCMPconst {
21703 v_0 := b.Controls[0]
21704 if auxIntToInt32(v_0.AuxInt) != 0 {
21705 break
21706 }
21707 l := v_0.Args[0]
21708 if l.Op != OpARMXORshiftRA {
21709 break
21710 }
21711 c := auxIntToInt32(l.AuxInt)
21712 y := l.Args[1]
21713 x := l.Args[0]
21714 if !(l.Uses == 1) {
21715 break
21716 }
21717 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags)
21718 v0.AuxInt = int32ToAuxInt(c)
21719 v0.AddArg2(x, y)
21720 b.resetWithControl(BlockARMNE, v0)
21721 return true
21722 }
21723
21724
21725
21726 for b.Controls[0].Op == OpARMCMPconst {
21727 v_0 := b.Controls[0]
21728 if auxIntToInt32(v_0.AuxInt) != 0 {
21729 break
21730 }
21731 l := v_0.Args[0]
21732 if l.Op != OpARMXORshiftLLreg {
21733 break
21734 }
21735 z := l.Args[2]
21736 x := l.Args[0]
21737 y := l.Args[1]
21738 if !(l.Uses == 1) {
21739 break
21740 }
21741 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags)
21742 v0.AddArg3(x, y, z)
21743 b.resetWithControl(BlockARMNE, v0)
21744 return true
21745 }
21746
21747
21748
21749 for b.Controls[0].Op == OpARMCMPconst {
21750 v_0 := b.Controls[0]
21751 if auxIntToInt32(v_0.AuxInt) != 0 {
21752 break
21753 }
21754 l := v_0.Args[0]
21755 if l.Op != OpARMXORshiftRLreg {
21756 break
21757 }
21758 z := l.Args[2]
21759 x := l.Args[0]
21760 y := l.Args[1]
21761 if !(l.Uses == 1) {
21762 break
21763 }
21764 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags)
21765 v0.AddArg3(x, y, z)
21766 b.resetWithControl(BlockARMNE, v0)
21767 return true
21768 }
21769
21770
21771
21772 for b.Controls[0].Op == OpARMCMPconst {
21773 v_0 := b.Controls[0]
21774 if auxIntToInt32(v_0.AuxInt) != 0 {
21775 break
21776 }
21777 l := v_0.Args[0]
21778 if l.Op != OpARMXORshiftRAreg {
21779 break
21780 }
21781 z := l.Args[2]
21782 x := l.Args[0]
21783 y := l.Args[1]
21784 if !(l.Uses == 1) {
21785 break
21786 }
21787 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags)
21788 v0.AddArg3(x, y, z)
21789 b.resetWithControl(BlockARMNE, v0)
21790 return true
21791 }
21792 case BlockARMUGE:
21793
21794
21795
21796 for b.Controls[0].Op == OpARMFlagConstant {
21797 v_0 := b.Controls[0]
21798 fc := auxIntToFlagConstant(v_0.AuxInt)
21799 if !(fc.uge()) {
21800 break
21801 }
21802 b.Reset(BlockFirst)
21803 return true
21804 }
21805
21806
21807
21808 for b.Controls[0].Op == OpARMFlagConstant {
21809 v_0 := b.Controls[0]
21810 fc := auxIntToFlagConstant(v_0.AuxInt)
21811 if !(!fc.uge()) {
21812 break
21813 }
21814 b.Reset(BlockFirst)
21815 b.swapSuccessors()
21816 return true
21817 }
21818
21819
21820 for b.Controls[0].Op == OpARMInvertFlags {
21821 v_0 := b.Controls[0]
21822 cmp := v_0.Args[0]
21823 b.resetWithControl(BlockARMULE, cmp)
21824 return true
21825 }
21826 case BlockARMUGT:
21827
21828
21829
21830 for b.Controls[0].Op == OpARMFlagConstant {
21831 v_0 := b.Controls[0]
21832 fc := auxIntToFlagConstant(v_0.AuxInt)
21833 if !(fc.ugt()) {
21834 break
21835 }
21836 b.Reset(BlockFirst)
21837 return true
21838 }
21839
21840
21841
21842 for b.Controls[0].Op == OpARMFlagConstant {
21843 v_0 := b.Controls[0]
21844 fc := auxIntToFlagConstant(v_0.AuxInt)
21845 if !(!fc.ugt()) {
21846 break
21847 }
21848 b.Reset(BlockFirst)
21849 b.swapSuccessors()
21850 return true
21851 }
21852
21853
21854 for b.Controls[0].Op == OpARMInvertFlags {
21855 v_0 := b.Controls[0]
21856 cmp := v_0.Args[0]
21857 b.resetWithControl(BlockARMULT, cmp)
21858 return true
21859 }
21860 case BlockARMULE:
21861
21862
21863
21864 for b.Controls[0].Op == OpARMFlagConstant {
21865 v_0 := b.Controls[0]
21866 fc := auxIntToFlagConstant(v_0.AuxInt)
21867 if !(fc.ule()) {
21868 break
21869 }
21870 b.Reset(BlockFirst)
21871 return true
21872 }
21873
21874
21875
21876 for b.Controls[0].Op == OpARMFlagConstant {
21877 v_0 := b.Controls[0]
21878 fc := auxIntToFlagConstant(v_0.AuxInt)
21879 if !(!fc.ule()) {
21880 break
21881 }
21882 b.Reset(BlockFirst)
21883 b.swapSuccessors()
21884 return true
21885 }
21886
21887
21888 for b.Controls[0].Op == OpARMInvertFlags {
21889 v_0 := b.Controls[0]
21890 cmp := v_0.Args[0]
21891 b.resetWithControl(BlockARMUGE, cmp)
21892 return true
21893 }
21894 case BlockARMULT:
21895
21896
21897
21898 for b.Controls[0].Op == OpARMFlagConstant {
21899 v_0 := b.Controls[0]
21900 fc := auxIntToFlagConstant(v_0.AuxInt)
21901 if !(fc.ult()) {
21902 break
21903 }
21904 b.Reset(BlockFirst)
21905 return true
21906 }
21907
21908
21909
21910 for b.Controls[0].Op == OpARMFlagConstant {
21911 v_0 := b.Controls[0]
21912 fc := auxIntToFlagConstant(v_0.AuxInt)
21913 if !(!fc.ult()) {
21914 break
21915 }
21916 b.Reset(BlockFirst)
21917 b.swapSuccessors()
21918 return true
21919 }
21920
21921
21922 for b.Controls[0].Op == OpARMInvertFlags {
21923 v_0 := b.Controls[0]
21924 cmp := v_0.Args[0]
21925 b.resetWithControl(BlockARMUGT, cmp)
21926 return true
21927 }
21928 }
21929 return false
21930 }
21931
View as plain text