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 OpAdd32withcarry:
450 v.Op = OpARMADC
451 return true
452 case OpAdd64F:
453 v.Op = OpARMADDD
454 return true
455 case OpAdd8:
456 v.Op = OpARMADD
457 return true
458 case OpAddPtr:
459 v.Op = OpARMADD
460 return true
461 case OpAddr:
462 return rewriteValueARM_OpAddr(v)
463 case OpAnd16:
464 v.Op = OpARMAND
465 return true
466 case OpAnd32:
467 v.Op = OpARMAND
468 return true
469 case OpAnd8:
470 v.Op = OpARMAND
471 return true
472 case OpAndB:
473 v.Op = OpARMAND
474 return true
475 case OpAvg32u:
476 return rewriteValueARM_OpAvg32u(v)
477 case OpBitLen16:
478 return rewriteValueARM_OpBitLen16(v)
479 case OpBitLen32:
480 return rewriteValueARM_OpBitLen32(v)
481 case OpBitLen8:
482 return rewriteValueARM_OpBitLen8(v)
483 case OpBswap32:
484 return rewriteValueARM_OpBswap32(v)
485 case OpClosureCall:
486 v.Op = OpARMCALLclosure
487 return true
488 case OpCom16:
489 v.Op = OpARMMVN
490 return true
491 case OpCom32:
492 v.Op = OpARMMVN
493 return true
494 case OpCom8:
495 v.Op = OpARMMVN
496 return true
497 case OpConst16:
498 return rewriteValueARM_OpConst16(v)
499 case OpConst32:
500 return rewriteValueARM_OpConst32(v)
501 case OpConst32F:
502 return rewriteValueARM_OpConst32F(v)
503 case OpConst64F:
504 return rewriteValueARM_OpConst64F(v)
505 case OpConst8:
506 return rewriteValueARM_OpConst8(v)
507 case OpConstBool:
508 return rewriteValueARM_OpConstBool(v)
509 case OpConstNil:
510 return rewriteValueARM_OpConstNil(v)
511 case OpCtz16:
512 return rewriteValueARM_OpCtz16(v)
513 case OpCtz16NonZero:
514 v.Op = OpCtz32
515 return true
516 case OpCtz32:
517 return rewriteValueARM_OpCtz32(v)
518 case OpCtz32NonZero:
519 v.Op = OpCtz32
520 return true
521 case OpCtz8:
522 return rewriteValueARM_OpCtz8(v)
523 case OpCtz8NonZero:
524 v.Op = OpCtz32
525 return true
526 case OpCvt32Fto32:
527 v.Op = OpARMMOVFW
528 return true
529 case OpCvt32Fto32U:
530 v.Op = OpARMMOVFWU
531 return true
532 case OpCvt32Fto64F:
533 v.Op = OpARMMOVFD
534 return true
535 case OpCvt32Uto32F:
536 v.Op = OpARMMOVWUF
537 return true
538 case OpCvt32Uto64F:
539 v.Op = OpARMMOVWUD
540 return true
541 case OpCvt32to32F:
542 v.Op = OpARMMOVWF
543 return true
544 case OpCvt32to64F:
545 v.Op = OpARMMOVWD
546 return true
547 case OpCvt64Fto32:
548 v.Op = OpARMMOVDW
549 return true
550 case OpCvt64Fto32F:
551 v.Op = OpARMMOVDF
552 return true
553 case OpCvt64Fto32U:
554 v.Op = OpARMMOVDWU
555 return true
556 case OpCvtBoolToUint8:
557 v.Op = OpCopy
558 return true
559 case OpDiv16:
560 return rewriteValueARM_OpDiv16(v)
561 case OpDiv16u:
562 return rewriteValueARM_OpDiv16u(v)
563 case OpDiv32:
564 return rewriteValueARM_OpDiv32(v)
565 case OpDiv32F:
566 v.Op = OpARMDIVF
567 return true
568 case OpDiv32u:
569 return rewriteValueARM_OpDiv32u(v)
570 case OpDiv64F:
571 v.Op = OpARMDIVD
572 return true
573 case OpDiv8:
574 return rewriteValueARM_OpDiv8(v)
575 case OpDiv8u:
576 return rewriteValueARM_OpDiv8u(v)
577 case OpEq16:
578 return rewriteValueARM_OpEq16(v)
579 case OpEq32:
580 return rewriteValueARM_OpEq32(v)
581 case OpEq32F:
582 return rewriteValueARM_OpEq32F(v)
583 case OpEq64F:
584 return rewriteValueARM_OpEq64F(v)
585 case OpEq8:
586 return rewriteValueARM_OpEq8(v)
587 case OpEqB:
588 return rewriteValueARM_OpEqB(v)
589 case OpEqPtr:
590 return rewriteValueARM_OpEqPtr(v)
591 case OpFMA:
592 return rewriteValueARM_OpFMA(v)
593 case OpGetCallerPC:
594 v.Op = OpARMLoweredGetCallerPC
595 return true
596 case OpGetCallerSP:
597 v.Op = OpARMLoweredGetCallerSP
598 return true
599 case OpGetClosurePtr:
600 v.Op = OpARMLoweredGetClosurePtr
601 return true
602 case OpHmul32:
603 v.Op = OpARMHMUL
604 return true
605 case OpHmul32u:
606 v.Op = OpARMHMULU
607 return true
608 case OpInterCall:
609 v.Op = OpARMCALLinter
610 return true
611 case OpIsInBounds:
612 return rewriteValueARM_OpIsInBounds(v)
613 case OpIsNonNil:
614 return rewriteValueARM_OpIsNonNil(v)
615 case OpIsSliceInBounds:
616 return rewriteValueARM_OpIsSliceInBounds(v)
617 case OpLeq16:
618 return rewriteValueARM_OpLeq16(v)
619 case OpLeq16U:
620 return rewriteValueARM_OpLeq16U(v)
621 case OpLeq32:
622 return rewriteValueARM_OpLeq32(v)
623 case OpLeq32F:
624 return rewriteValueARM_OpLeq32F(v)
625 case OpLeq32U:
626 return rewriteValueARM_OpLeq32U(v)
627 case OpLeq64F:
628 return rewriteValueARM_OpLeq64F(v)
629 case OpLeq8:
630 return rewriteValueARM_OpLeq8(v)
631 case OpLeq8U:
632 return rewriteValueARM_OpLeq8U(v)
633 case OpLess16:
634 return rewriteValueARM_OpLess16(v)
635 case OpLess16U:
636 return rewriteValueARM_OpLess16U(v)
637 case OpLess32:
638 return rewriteValueARM_OpLess32(v)
639 case OpLess32F:
640 return rewriteValueARM_OpLess32F(v)
641 case OpLess32U:
642 return rewriteValueARM_OpLess32U(v)
643 case OpLess64F:
644 return rewriteValueARM_OpLess64F(v)
645 case OpLess8:
646 return rewriteValueARM_OpLess8(v)
647 case OpLess8U:
648 return rewriteValueARM_OpLess8U(v)
649 case OpLoad:
650 return rewriteValueARM_OpLoad(v)
651 case OpLocalAddr:
652 return rewriteValueARM_OpLocalAddr(v)
653 case OpLsh16x16:
654 return rewriteValueARM_OpLsh16x16(v)
655 case OpLsh16x32:
656 return rewriteValueARM_OpLsh16x32(v)
657 case OpLsh16x64:
658 return rewriteValueARM_OpLsh16x64(v)
659 case OpLsh16x8:
660 return rewriteValueARM_OpLsh16x8(v)
661 case OpLsh32x16:
662 return rewriteValueARM_OpLsh32x16(v)
663 case OpLsh32x32:
664 return rewriteValueARM_OpLsh32x32(v)
665 case OpLsh32x64:
666 return rewriteValueARM_OpLsh32x64(v)
667 case OpLsh32x8:
668 return rewriteValueARM_OpLsh32x8(v)
669 case OpLsh8x16:
670 return rewriteValueARM_OpLsh8x16(v)
671 case OpLsh8x32:
672 return rewriteValueARM_OpLsh8x32(v)
673 case OpLsh8x64:
674 return rewriteValueARM_OpLsh8x64(v)
675 case OpLsh8x8:
676 return rewriteValueARM_OpLsh8x8(v)
677 case OpMod16:
678 return rewriteValueARM_OpMod16(v)
679 case OpMod16u:
680 return rewriteValueARM_OpMod16u(v)
681 case OpMod32:
682 return rewriteValueARM_OpMod32(v)
683 case OpMod32u:
684 return rewriteValueARM_OpMod32u(v)
685 case OpMod8:
686 return rewriteValueARM_OpMod8(v)
687 case OpMod8u:
688 return rewriteValueARM_OpMod8u(v)
689 case OpMove:
690 return rewriteValueARM_OpMove(v)
691 case OpMul16:
692 v.Op = OpARMMUL
693 return true
694 case OpMul32:
695 v.Op = OpARMMUL
696 return true
697 case OpMul32F:
698 v.Op = OpARMMULF
699 return true
700 case OpMul32uhilo:
701 v.Op = OpARMMULLU
702 return true
703 case OpMul64F:
704 v.Op = OpARMMULD
705 return true
706 case OpMul8:
707 v.Op = OpARMMUL
708 return true
709 case OpNeg16:
710 return rewriteValueARM_OpNeg16(v)
711 case OpNeg32:
712 return rewriteValueARM_OpNeg32(v)
713 case OpNeg32F:
714 v.Op = OpARMNEGF
715 return true
716 case OpNeg64F:
717 v.Op = OpARMNEGD
718 return true
719 case OpNeg8:
720 return rewriteValueARM_OpNeg8(v)
721 case OpNeq16:
722 return rewriteValueARM_OpNeq16(v)
723 case OpNeq32:
724 return rewriteValueARM_OpNeq32(v)
725 case OpNeq32F:
726 return rewriteValueARM_OpNeq32F(v)
727 case OpNeq64F:
728 return rewriteValueARM_OpNeq64F(v)
729 case OpNeq8:
730 return rewriteValueARM_OpNeq8(v)
731 case OpNeqB:
732 v.Op = OpARMXOR
733 return true
734 case OpNeqPtr:
735 return rewriteValueARM_OpNeqPtr(v)
736 case OpNilCheck:
737 v.Op = OpARMLoweredNilCheck
738 return true
739 case OpNot:
740 return rewriteValueARM_OpNot(v)
741 case OpOffPtr:
742 return rewriteValueARM_OpOffPtr(v)
743 case OpOr16:
744 v.Op = OpARMOR
745 return true
746 case OpOr32:
747 v.Op = OpARMOR
748 return true
749 case OpOr8:
750 v.Op = OpARMOR
751 return true
752 case OpOrB:
753 v.Op = OpARMOR
754 return true
755 case OpPanicBounds:
756 v.Op = OpARMLoweredPanicBoundsRR
757 return true
758 case OpPanicExtend:
759 v.Op = OpARMLoweredPanicExtendRR
760 return true
761 case OpRotateLeft16:
762 return rewriteValueARM_OpRotateLeft16(v)
763 case OpRotateLeft32:
764 return rewriteValueARM_OpRotateLeft32(v)
765 case OpRotateLeft8:
766 return rewriteValueARM_OpRotateLeft8(v)
767 case OpRound32F:
768 v.Op = OpCopy
769 return true
770 case OpRound64F:
771 v.Op = OpCopy
772 return true
773 case OpRsh16Ux16:
774 return rewriteValueARM_OpRsh16Ux16(v)
775 case OpRsh16Ux32:
776 return rewriteValueARM_OpRsh16Ux32(v)
777 case OpRsh16Ux64:
778 return rewriteValueARM_OpRsh16Ux64(v)
779 case OpRsh16Ux8:
780 return rewriteValueARM_OpRsh16Ux8(v)
781 case OpRsh16x16:
782 return rewriteValueARM_OpRsh16x16(v)
783 case OpRsh16x32:
784 return rewriteValueARM_OpRsh16x32(v)
785 case OpRsh16x64:
786 return rewriteValueARM_OpRsh16x64(v)
787 case OpRsh16x8:
788 return rewriteValueARM_OpRsh16x8(v)
789 case OpRsh32Ux16:
790 return rewriteValueARM_OpRsh32Ux16(v)
791 case OpRsh32Ux32:
792 return rewriteValueARM_OpRsh32Ux32(v)
793 case OpRsh32Ux64:
794 return rewriteValueARM_OpRsh32Ux64(v)
795 case OpRsh32Ux8:
796 return rewriteValueARM_OpRsh32Ux8(v)
797 case OpRsh32x16:
798 return rewriteValueARM_OpRsh32x16(v)
799 case OpRsh32x32:
800 return rewriteValueARM_OpRsh32x32(v)
801 case OpRsh32x64:
802 return rewriteValueARM_OpRsh32x64(v)
803 case OpRsh32x8:
804 return rewriteValueARM_OpRsh32x8(v)
805 case OpRsh8Ux16:
806 return rewriteValueARM_OpRsh8Ux16(v)
807 case OpRsh8Ux32:
808 return rewriteValueARM_OpRsh8Ux32(v)
809 case OpRsh8Ux64:
810 return rewriteValueARM_OpRsh8Ux64(v)
811 case OpRsh8Ux8:
812 return rewriteValueARM_OpRsh8Ux8(v)
813 case OpRsh8x16:
814 return rewriteValueARM_OpRsh8x16(v)
815 case OpRsh8x32:
816 return rewriteValueARM_OpRsh8x32(v)
817 case OpRsh8x64:
818 return rewriteValueARM_OpRsh8x64(v)
819 case OpRsh8x8:
820 return rewriteValueARM_OpRsh8x8(v)
821 case OpSelect0:
822 return rewriteValueARM_OpSelect0(v)
823 case OpSelect1:
824 return rewriteValueARM_OpSelect1(v)
825 case OpSignExt16to32:
826 v.Op = OpARMMOVHreg
827 return true
828 case OpSignExt8to16:
829 v.Op = OpARMMOVBreg
830 return true
831 case OpSignExt8to32:
832 v.Op = OpARMMOVBreg
833 return true
834 case OpSignmask:
835 return rewriteValueARM_OpSignmask(v)
836 case OpSlicemask:
837 return rewriteValueARM_OpSlicemask(v)
838 case OpSqrt:
839 v.Op = OpARMSQRTD
840 return true
841 case OpSqrt32:
842 v.Op = OpARMSQRTF
843 return true
844 case OpStaticCall:
845 v.Op = OpARMCALLstatic
846 return true
847 case OpStore:
848 return rewriteValueARM_OpStore(v)
849 case OpSub16:
850 v.Op = OpARMSUB
851 return true
852 case OpSub32:
853 v.Op = OpARMSUB
854 return true
855 case OpSub32F:
856 v.Op = OpARMSUBF
857 return true
858 case OpSub32carry:
859 v.Op = OpARMSUBS
860 return true
861 case OpSub32withcarry:
862 v.Op = OpARMSBC
863 return true
864 case OpSub64F:
865 v.Op = OpARMSUBD
866 return true
867 case OpSub8:
868 v.Op = OpARMSUB
869 return true
870 case OpSubPtr:
871 v.Op = OpARMSUB
872 return true
873 case OpTailCall:
874 v.Op = OpARMCALLtail
875 return true
876 case OpTrunc16to8:
877 v.Op = OpCopy
878 return true
879 case OpTrunc32to16:
880 v.Op = OpCopy
881 return true
882 case OpTrunc32to8:
883 v.Op = OpCopy
884 return true
885 case OpWB:
886 v.Op = OpARMLoweredWB
887 return true
888 case OpXor16:
889 v.Op = OpARMXOR
890 return true
891 case OpXor32:
892 v.Op = OpARMXOR
893 return true
894 case OpXor8:
895 v.Op = OpARMXOR
896 return true
897 case OpZero:
898 return rewriteValueARM_OpZero(v)
899 case OpZeroExt16to32:
900 v.Op = OpARMMOVHUreg
901 return true
902 case OpZeroExt8to16:
903 v.Op = OpARMMOVBUreg
904 return true
905 case OpZeroExt8to32:
906 v.Op = OpARMMOVBUreg
907 return true
908 case OpZeromask:
909 return rewriteValueARM_OpZeromask(v)
910 }
911 return false
912 }
913 func rewriteValueARM_OpARMADC(v *Value) bool {
914 v_2 := v.Args[2]
915 v_1 := v.Args[1]
916 v_0 := v.Args[0]
917
918
919 for {
920 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
921 if v_0.Op != OpARMMOVWconst {
922 continue
923 }
924 c := auxIntToInt32(v_0.AuxInt)
925 x := v_1
926 flags := v_2
927 v.reset(OpARMADCconst)
928 v.AuxInt = int32ToAuxInt(c)
929 v.AddArg2(x, flags)
930 return true
931 }
932 break
933 }
934
935
936 for {
937 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
938 x := v_0
939 if v_1.Op != OpARMSLLconst {
940 continue
941 }
942 c := auxIntToInt32(v_1.AuxInt)
943 y := v_1.Args[0]
944 flags := v_2
945 v.reset(OpARMADCshiftLL)
946 v.AuxInt = int32ToAuxInt(c)
947 v.AddArg3(x, y, flags)
948 return true
949 }
950 break
951 }
952
953
954 for {
955 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
956 x := v_0
957 if v_1.Op != OpARMSRLconst {
958 continue
959 }
960 c := auxIntToInt32(v_1.AuxInt)
961 y := v_1.Args[0]
962 flags := v_2
963 v.reset(OpARMADCshiftRL)
964 v.AuxInt = int32ToAuxInt(c)
965 v.AddArg3(x, y, flags)
966 return true
967 }
968 break
969 }
970
971
972 for {
973 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
974 x := v_0
975 if v_1.Op != OpARMSRAconst {
976 continue
977 }
978 c := auxIntToInt32(v_1.AuxInt)
979 y := v_1.Args[0]
980 flags := v_2
981 v.reset(OpARMADCshiftRA)
982 v.AuxInt = int32ToAuxInt(c)
983 v.AddArg3(x, y, flags)
984 return true
985 }
986 break
987 }
988
989
990 for {
991 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
992 x := v_0
993 if v_1.Op != OpARMSLL {
994 continue
995 }
996 z := v_1.Args[1]
997 y := v_1.Args[0]
998 flags := v_2
999 v.reset(OpARMADCshiftLLreg)
1000 v.AddArg4(x, y, z, flags)
1001 return true
1002 }
1003 break
1004 }
1005
1006
1007 for {
1008 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1009 x := v_0
1010 if v_1.Op != OpARMSRL {
1011 continue
1012 }
1013 z := v_1.Args[1]
1014 y := v_1.Args[0]
1015 flags := v_2
1016 v.reset(OpARMADCshiftRLreg)
1017 v.AddArg4(x, y, z, flags)
1018 return true
1019 }
1020 break
1021 }
1022
1023
1024 for {
1025 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1026 x := v_0
1027 if v_1.Op != OpARMSRA {
1028 continue
1029 }
1030 z := v_1.Args[1]
1031 y := v_1.Args[0]
1032 flags := v_2
1033 v.reset(OpARMADCshiftRAreg)
1034 v.AddArg4(x, y, z, flags)
1035 return true
1036 }
1037 break
1038 }
1039 return false
1040 }
1041 func rewriteValueARM_OpARMADCconst(v *Value) bool {
1042 v_1 := v.Args[1]
1043 v_0 := v.Args[0]
1044
1045
1046 for {
1047 c := auxIntToInt32(v.AuxInt)
1048 if v_0.Op != OpARMADDconst {
1049 break
1050 }
1051 d := auxIntToInt32(v_0.AuxInt)
1052 x := v_0.Args[0]
1053 flags := v_1
1054 v.reset(OpARMADCconst)
1055 v.AuxInt = int32ToAuxInt(c + d)
1056 v.AddArg2(x, flags)
1057 return true
1058 }
1059
1060
1061 for {
1062 c := auxIntToInt32(v.AuxInt)
1063 if v_0.Op != OpARMSUBconst {
1064 break
1065 }
1066 d := auxIntToInt32(v_0.AuxInt)
1067 x := v_0.Args[0]
1068 flags := v_1
1069 v.reset(OpARMADCconst)
1070 v.AuxInt = int32ToAuxInt(c - d)
1071 v.AddArg2(x, flags)
1072 return true
1073 }
1074 return false
1075 }
1076 func rewriteValueARM_OpARMADCshiftLL(v *Value) bool {
1077 v_2 := v.Args[2]
1078 v_1 := v.Args[1]
1079 v_0 := v.Args[0]
1080 b := v.Block
1081
1082
1083 for {
1084 d := auxIntToInt32(v.AuxInt)
1085 if v_0.Op != OpARMMOVWconst {
1086 break
1087 }
1088 c := auxIntToInt32(v_0.AuxInt)
1089 x := v_1
1090 flags := v_2
1091 v.reset(OpARMADCconst)
1092 v.AuxInt = int32ToAuxInt(c)
1093 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
1094 v0.AuxInt = int32ToAuxInt(d)
1095 v0.AddArg(x)
1096 v.AddArg2(v0, flags)
1097 return true
1098 }
1099
1100
1101 for {
1102 d := auxIntToInt32(v.AuxInt)
1103 x := v_0
1104 if v_1.Op != OpARMMOVWconst {
1105 break
1106 }
1107 c := auxIntToInt32(v_1.AuxInt)
1108 flags := v_2
1109 v.reset(OpARMADCconst)
1110 v.AuxInt = int32ToAuxInt(c << uint64(d))
1111 v.AddArg2(x, flags)
1112 return true
1113 }
1114 return false
1115 }
1116 func rewriteValueARM_OpARMADCshiftLLreg(v *Value) bool {
1117 v_3 := v.Args[3]
1118 v_2 := v.Args[2]
1119 v_1 := v.Args[1]
1120 v_0 := v.Args[0]
1121 b := v.Block
1122
1123
1124 for {
1125 if v_0.Op != OpARMMOVWconst {
1126 break
1127 }
1128 c := auxIntToInt32(v_0.AuxInt)
1129 x := v_1
1130 y := v_2
1131 flags := v_3
1132 v.reset(OpARMADCconst)
1133 v.AuxInt = int32ToAuxInt(c)
1134 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
1135 v0.AddArg2(x, y)
1136 v.AddArg2(v0, flags)
1137 return true
1138 }
1139
1140
1141
1142 for {
1143 x := v_0
1144 y := v_1
1145 if v_2.Op != OpARMMOVWconst {
1146 break
1147 }
1148 c := auxIntToInt32(v_2.AuxInt)
1149 flags := v_3
1150 if !(0 <= c && c < 32) {
1151 break
1152 }
1153 v.reset(OpARMADCshiftLL)
1154 v.AuxInt = int32ToAuxInt(c)
1155 v.AddArg3(x, y, flags)
1156 return true
1157 }
1158 return false
1159 }
1160 func rewriteValueARM_OpARMADCshiftRA(v *Value) bool {
1161 v_2 := v.Args[2]
1162 v_1 := v.Args[1]
1163 v_0 := v.Args[0]
1164 b := v.Block
1165
1166
1167 for {
1168 d := auxIntToInt32(v.AuxInt)
1169 if v_0.Op != OpARMMOVWconst {
1170 break
1171 }
1172 c := auxIntToInt32(v_0.AuxInt)
1173 x := v_1
1174 flags := v_2
1175 v.reset(OpARMADCconst)
1176 v.AuxInt = int32ToAuxInt(c)
1177 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
1178 v0.AuxInt = int32ToAuxInt(d)
1179 v0.AddArg(x)
1180 v.AddArg2(v0, flags)
1181 return true
1182 }
1183
1184
1185 for {
1186 d := auxIntToInt32(v.AuxInt)
1187 x := v_0
1188 if v_1.Op != OpARMMOVWconst {
1189 break
1190 }
1191 c := auxIntToInt32(v_1.AuxInt)
1192 flags := v_2
1193 v.reset(OpARMADCconst)
1194 v.AuxInt = int32ToAuxInt(c >> uint64(d))
1195 v.AddArg2(x, flags)
1196 return true
1197 }
1198 return false
1199 }
1200 func rewriteValueARM_OpARMADCshiftRAreg(v *Value) bool {
1201 v_3 := v.Args[3]
1202 v_2 := v.Args[2]
1203 v_1 := v.Args[1]
1204 v_0 := v.Args[0]
1205 b := v.Block
1206
1207
1208 for {
1209 if v_0.Op != OpARMMOVWconst {
1210 break
1211 }
1212 c := auxIntToInt32(v_0.AuxInt)
1213 x := v_1
1214 y := v_2
1215 flags := v_3
1216 v.reset(OpARMADCconst)
1217 v.AuxInt = int32ToAuxInt(c)
1218 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
1219 v0.AddArg2(x, y)
1220 v.AddArg2(v0, flags)
1221 return true
1222 }
1223
1224
1225
1226 for {
1227 x := v_0
1228 y := v_1
1229 if v_2.Op != OpARMMOVWconst {
1230 break
1231 }
1232 c := auxIntToInt32(v_2.AuxInt)
1233 flags := v_3
1234 if !(0 <= c && c < 32) {
1235 break
1236 }
1237 v.reset(OpARMADCshiftRA)
1238 v.AuxInt = int32ToAuxInt(c)
1239 v.AddArg3(x, y, flags)
1240 return true
1241 }
1242 return false
1243 }
1244 func rewriteValueARM_OpARMADCshiftRL(v *Value) bool {
1245 v_2 := v.Args[2]
1246 v_1 := v.Args[1]
1247 v_0 := v.Args[0]
1248 b := v.Block
1249
1250
1251 for {
1252 d := auxIntToInt32(v.AuxInt)
1253 if v_0.Op != OpARMMOVWconst {
1254 break
1255 }
1256 c := auxIntToInt32(v_0.AuxInt)
1257 x := v_1
1258 flags := v_2
1259 v.reset(OpARMADCconst)
1260 v.AuxInt = int32ToAuxInt(c)
1261 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
1262 v0.AuxInt = int32ToAuxInt(d)
1263 v0.AddArg(x)
1264 v.AddArg2(v0, flags)
1265 return true
1266 }
1267
1268
1269 for {
1270 d := auxIntToInt32(v.AuxInt)
1271 x := v_0
1272 if v_1.Op != OpARMMOVWconst {
1273 break
1274 }
1275 c := auxIntToInt32(v_1.AuxInt)
1276 flags := v_2
1277 v.reset(OpARMADCconst)
1278 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
1279 v.AddArg2(x, flags)
1280 return true
1281 }
1282 return false
1283 }
1284 func rewriteValueARM_OpARMADCshiftRLreg(v *Value) bool {
1285 v_3 := v.Args[3]
1286 v_2 := v.Args[2]
1287 v_1 := v.Args[1]
1288 v_0 := v.Args[0]
1289 b := v.Block
1290
1291
1292 for {
1293 if v_0.Op != OpARMMOVWconst {
1294 break
1295 }
1296 c := auxIntToInt32(v_0.AuxInt)
1297 x := v_1
1298 y := v_2
1299 flags := v_3
1300 v.reset(OpARMADCconst)
1301 v.AuxInt = int32ToAuxInt(c)
1302 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
1303 v0.AddArg2(x, y)
1304 v.AddArg2(v0, flags)
1305 return true
1306 }
1307
1308
1309
1310 for {
1311 x := v_0
1312 y := v_1
1313 if v_2.Op != OpARMMOVWconst {
1314 break
1315 }
1316 c := auxIntToInt32(v_2.AuxInt)
1317 flags := v_3
1318 if !(0 <= c && c < 32) {
1319 break
1320 }
1321 v.reset(OpARMADCshiftRL)
1322 v.AuxInt = int32ToAuxInt(c)
1323 v.AddArg3(x, y, flags)
1324 return true
1325 }
1326 return false
1327 }
1328 func rewriteValueARM_OpARMADD(v *Value) bool {
1329 v_1 := v.Args[1]
1330 v_0 := v.Args[0]
1331 b := v.Block
1332
1333
1334
1335 for {
1336 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1337 x := v_0
1338 if v_1.Op != OpARMMOVWconst {
1339 continue
1340 }
1341 t := v_1.Type
1342 c := auxIntToInt32(v_1.AuxInt)
1343 if !(!t.IsPtr()) {
1344 continue
1345 }
1346 v.reset(OpARMADDconst)
1347 v.AuxInt = int32ToAuxInt(c)
1348 v.AddArg(x)
1349 return true
1350 }
1351 break
1352 }
1353
1354
1355 for {
1356 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1357 x := v_0
1358 if v_1.Op != OpARMSLLconst {
1359 continue
1360 }
1361 c := auxIntToInt32(v_1.AuxInt)
1362 y := v_1.Args[0]
1363 v.reset(OpARMADDshiftLL)
1364 v.AuxInt = int32ToAuxInt(c)
1365 v.AddArg2(x, y)
1366 return true
1367 }
1368 break
1369 }
1370
1371
1372 for {
1373 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1374 x := v_0
1375 if v_1.Op != OpARMSRLconst {
1376 continue
1377 }
1378 c := auxIntToInt32(v_1.AuxInt)
1379 y := v_1.Args[0]
1380 v.reset(OpARMADDshiftRL)
1381 v.AuxInt = int32ToAuxInt(c)
1382 v.AddArg2(x, y)
1383 return true
1384 }
1385 break
1386 }
1387
1388
1389 for {
1390 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1391 x := v_0
1392 if v_1.Op != OpARMSRAconst {
1393 continue
1394 }
1395 c := auxIntToInt32(v_1.AuxInt)
1396 y := v_1.Args[0]
1397 v.reset(OpARMADDshiftRA)
1398 v.AuxInt = int32ToAuxInt(c)
1399 v.AddArg2(x, y)
1400 return true
1401 }
1402 break
1403 }
1404
1405
1406 for {
1407 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1408 x := v_0
1409 if v_1.Op != OpARMSLL {
1410 continue
1411 }
1412 z := v_1.Args[1]
1413 y := v_1.Args[0]
1414 v.reset(OpARMADDshiftLLreg)
1415 v.AddArg3(x, y, z)
1416 return true
1417 }
1418 break
1419 }
1420
1421
1422 for {
1423 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1424 x := v_0
1425 if v_1.Op != OpARMSRL {
1426 continue
1427 }
1428 z := v_1.Args[1]
1429 y := v_1.Args[0]
1430 v.reset(OpARMADDshiftRLreg)
1431 v.AddArg3(x, y, z)
1432 return true
1433 }
1434 break
1435 }
1436
1437
1438 for {
1439 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1440 x := v_0
1441 if v_1.Op != OpARMSRA {
1442 continue
1443 }
1444 z := v_1.Args[1]
1445 y := v_1.Args[0]
1446 v.reset(OpARMADDshiftRAreg)
1447 v.AddArg3(x, y, z)
1448 return true
1449 }
1450 break
1451 }
1452
1453
1454 for {
1455 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1456 x := v_0
1457 if v_1.Op != OpARMRSBconst || auxIntToInt32(v_1.AuxInt) != 0 {
1458 continue
1459 }
1460 y := v_1.Args[0]
1461 v.reset(OpARMSUB)
1462 v.AddArg2(x, y)
1463 return true
1464 }
1465 break
1466 }
1467
1468
1469 for {
1470 t := v.Type
1471 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1472 if v_0.Op != OpARMRSBconst {
1473 continue
1474 }
1475 c := auxIntToInt32(v_0.AuxInt)
1476 x := v_0.Args[0]
1477 if v_1.Op != OpARMRSBconst {
1478 continue
1479 }
1480 d := auxIntToInt32(v_1.AuxInt)
1481 y := v_1.Args[0]
1482 v.reset(OpARMRSBconst)
1483 v.AuxInt = int32ToAuxInt(c + d)
1484 v0 := b.NewValue0(v.Pos, OpARMADD, t)
1485 v0.AddArg2(x, y)
1486 v.AddArg(v0)
1487 return true
1488 }
1489 break
1490 }
1491
1492
1493 for {
1494 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1495 if v_0.Op != OpARMMUL {
1496 continue
1497 }
1498 y := v_0.Args[1]
1499 x := v_0.Args[0]
1500 a := v_1
1501 v.reset(OpARMMULA)
1502 v.AddArg3(x, y, a)
1503 return true
1504 }
1505 break
1506 }
1507 return false
1508 }
1509 func rewriteValueARM_OpARMADDD(v *Value) bool {
1510 v_1 := v.Args[1]
1511 v_0 := v.Args[0]
1512
1513
1514
1515 for {
1516 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1517 a := v_0
1518 if v_1.Op != OpARMMULD {
1519 continue
1520 }
1521 y := v_1.Args[1]
1522 x := v_1.Args[0]
1523 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
1524 continue
1525 }
1526 v.reset(OpARMMULAD)
1527 v.AddArg3(a, x, y)
1528 return true
1529 }
1530 break
1531 }
1532
1533
1534
1535 for {
1536 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1537 a := v_0
1538 if v_1.Op != OpARMNMULD {
1539 continue
1540 }
1541 y := v_1.Args[1]
1542 x := v_1.Args[0]
1543 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
1544 continue
1545 }
1546 v.reset(OpARMMULSD)
1547 v.AddArg3(a, x, y)
1548 return true
1549 }
1550 break
1551 }
1552 return false
1553 }
1554 func rewriteValueARM_OpARMADDF(v *Value) bool {
1555 v_1 := v.Args[1]
1556 v_0 := v.Args[0]
1557
1558
1559
1560 for {
1561 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1562 a := v_0
1563 if v_1.Op != OpARMMULF {
1564 continue
1565 }
1566 y := v_1.Args[1]
1567 x := v_1.Args[0]
1568 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
1569 continue
1570 }
1571 v.reset(OpARMMULAF)
1572 v.AddArg3(a, x, y)
1573 return true
1574 }
1575 break
1576 }
1577
1578
1579
1580 for {
1581 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1582 a := v_0
1583 if v_1.Op != OpARMNMULF {
1584 continue
1585 }
1586 y := v_1.Args[1]
1587 x := v_1.Args[0]
1588 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
1589 continue
1590 }
1591 v.reset(OpARMMULSF)
1592 v.AddArg3(a, x, y)
1593 return true
1594 }
1595 break
1596 }
1597 return false
1598 }
1599 func rewriteValueARM_OpARMADDS(v *Value) bool {
1600 v_1 := v.Args[1]
1601 v_0 := v.Args[0]
1602
1603
1604 for {
1605 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1606 x := v_0
1607 if v_1.Op != OpARMMOVWconst {
1608 continue
1609 }
1610 c := auxIntToInt32(v_1.AuxInt)
1611 v.reset(OpARMADDSconst)
1612 v.AuxInt = int32ToAuxInt(c)
1613 v.AddArg(x)
1614 return true
1615 }
1616 break
1617 }
1618
1619
1620 for {
1621 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1622 x := v_0
1623 if v_1.Op != OpARMSLLconst {
1624 continue
1625 }
1626 c := auxIntToInt32(v_1.AuxInt)
1627 y := v_1.Args[0]
1628 v.reset(OpARMADDSshiftLL)
1629 v.AuxInt = int32ToAuxInt(c)
1630 v.AddArg2(x, y)
1631 return true
1632 }
1633 break
1634 }
1635
1636
1637 for {
1638 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1639 x := v_0
1640 if v_1.Op != OpARMSRLconst {
1641 continue
1642 }
1643 c := auxIntToInt32(v_1.AuxInt)
1644 y := v_1.Args[0]
1645 v.reset(OpARMADDSshiftRL)
1646 v.AuxInt = int32ToAuxInt(c)
1647 v.AddArg2(x, y)
1648 return true
1649 }
1650 break
1651 }
1652
1653
1654 for {
1655 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1656 x := v_0
1657 if v_1.Op != OpARMSRAconst {
1658 continue
1659 }
1660 c := auxIntToInt32(v_1.AuxInt)
1661 y := v_1.Args[0]
1662 v.reset(OpARMADDSshiftRA)
1663 v.AuxInt = int32ToAuxInt(c)
1664 v.AddArg2(x, y)
1665 return true
1666 }
1667 break
1668 }
1669
1670
1671 for {
1672 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1673 x := v_0
1674 if v_1.Op != OpARMSLL {
1675 continue
1676 }
1677 z := v_1.Args[1]
1678 y := v_1.Args[0]
1679 v.reset(OpARMADDSshiftLLreg)
1680 v.AddArg3(x, y, z)
1681 return true
1682 }
1683 break
1684 }
1685
1686
1687 for {
1688 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1689 x := v_0
1690 if v_1.Op != OpARMSRL {
1691 continue
1692 }
1693 z := v_1.Args[1]
1694 y := v_1.Args[0]
1695 v.reset(OpARMADDSshiftRLreg)
1696 v.AddArg3(x, y, z)
1697 return true
1698 }
1699 break
1700 }
1701
1702
1703 for {
1704 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
1705 x := v_0
1706 if v_1.Op != OpARMSRA {
1707 continue
1708 }
1709 z := v_1.Args[1]
1710 y := v_1.Args[0]
1711 v.reset(OpARMADDSshiftRAreg)
1712 v.AddArg3(x, y, z)
1713 return true
1714 }
1715 break
1716 }
1717 return false
1718 }
1719 func rewriteValueARM_OpARMADDSshiftLL(v *Value) bool {
1720 v_1 := v.Args[1]
1721 v_0 := v.Args[0]
1722 b := v.Block
1723
1724
1725 for {
1726 d := auxIntToInt32(v.AuxInt)
1727 if v_0.Op != OpARMMOVWconst {
1728 break
1729 }
1730 c := auxIntToInt32(v_0.AuxInt)
1731 x := v_1
1732 v.reset(OpARMADDSconst)
1733 v.AuxInt = int32ToAuxInt(c)
1734 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
1735 v0.AuxInt = int32ToAuxInt(d)
1736 v0.AddArg(x)
1737 v.AddArg(v0)
1738 return true
1739 }
1740
1741
1742 for {
1743 d := auxIntToInt32(v.AuxInt)
1744 x := v_0
1745 if v_1.Op != OpARMMOVWconst {
1746 break
1747 }
1748 c := auxIntToInt32(v_1.AuxInt)
1749 v.reset(OpARMADDSconst)
1750 v.AuxInt = int32ToAuxInt(c << uint64(d))
1751 v.AddArg(x)
1752 return true
1753 }
1754 return false
1755 }
1756 func rewriteValueARM_OpARMADDSshiftLLreg(v *Value) bool {
1757 v_2 := v.Args[2]
1758 v_1 := v.Args[1]
1759 v_0 := v.Args[0]
1760 b := v.Block
1761
1762
1763 for {
1764 if v_0.Op != OpARMMOVWconst {
1765 break
1766 }
1767 c := auxIntToInt32(v_0.AuxInt)
1768 x := v_1
1769 y := v_2
1770 v.reset(OpARMADDSconst)
1771 v.AuxInt = int32ToAuxInt(c)
1772 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
1773 v0.AddArg2(x, y)
1774 v.AddArg(v0)
1775 return true
1776 }
1777
1778
1779
1780 for {
1781 x := v_0
1782 y := v_1
1783 if v_2.Op != OpARMMOVWconst {
1784 break
1785 }
1786 c := auxIntToInt32(v_2.AuxInt)
1787 if !(0 <= c && c < 32) {
1788 break
1789 }
1790 v.reset(OpARMADDSshiftLL)
1791 v.AuxInt = int32ToAuxInt(c)
1792 v.AddArg2(x, y)
1793 return true
1794 }
1795 return false
1796 }
1797 func rewriteValueARM_OpARMADDSshiftRA(v *Value) bool {
1798 v_1 := v.Args[1]
1799 v_0 := v.Args[0]
1800 b := v.Block
1801
1802
1803 for {
1804 d := auxIntToInt32(v.AuxInt)
1805 if v_0.Op != OpARMMOVWconst {
1806 break
1807 }
1808 c := auxIntToInt32(v_0.AuxInt)
1809 x := v_1
1810 v.reset(OpARMADDSconst)
1811 v.AuxInt = int32ToAuxInt(c)
1812 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
1813 v0.AuxInt = int32ToAuxInt(d)
1814 v0.AddArg(x)
1815 v.AddArg(v0)
1816 return true
1817 }
1818
1819
1820 for {
1821 d := auxIntToInt32(v.AuxInt)
1822 x := v_0
1823 if v_1.Op != OpARMMOVWconst {
1824 break
1825 }
1826 c := auxIntToInt32(v_1.AuxInt)
1827 v.reset(OpARMADDSconst)
1828 v.AuxInt = int32ToAuxInt(c >> uint64(d))
1829 v.AddArg(x)
1830 return true
1831 }
1832 return false
1833 }
1834 func rewriteValueARM_OpARMADDSshiftRAreg(v *Value) bool {
1835 v_2 := v.Args[2]
1836 v_1 := v.Args[1]
1837 v_0 := v.Args[0]
1838 b := v.Block
1839
1840
1841 for {
1842 if v_0.Op != OpARMMOVWconst {
1843 break
1844 }
1845 c := auxIntToInt32(v_0.AuxInt)
1846 x := v_1
1847 y := v_2
1848 v.reset(OpARMADDSconst)
1849 v.AuxInt = int32ToAuxInt(c)
1850 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
1851 v0.AddArg2(x, y)
1852 v.AddArg(v0)
1853 return true
1854 }
1855
1856
1857
1858 for {
1859 x := v_0
1860 y := v_1
1861 if v_2.Op != OpARMMOVWconst {
1862 break
1863 }
1864 c := auxIntToInt32(v_2.AuxInt)
1865 if !(0 <= c && c < 32) {
1866 break
1867 }
1868 v.reset(OpARMADDSshiftRA)
1869 v.AuxInt = int32ToAuxInt(c)
1870 v.AddArg2(x, y)
1871 return true
1872 }
1873 return false
1874 }
1875 func rewriteValueARM_OpARMADDSshiftRL(v *Value) bool {
1876 v_1 := v.Args[1]
1877 v_0 := v.Args[0]
1878 b := v.Block
1879
1880
1881 for {
1882 d := auxIntToInt32(v.AuxInt)
1883 if v_0.Op != OpARMMOVWconst {
1884 break
1885 }
1886 c := auxIntToInt32(v_0.AuxInt)
1887 x := v_1
1888 v.reset(OpARMADDSconst)
1889 v.AuxInt = int32ToAuxInt(c)
1890 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
1891 v0.AuxInt = int32ToAuxInt(d)
1892 v0.AddArg(x)
1893 v.AddArg(v0)
1894 return true
1895 }
1896
1897
1898 for {
1899 d := auxIntToInt32(v.AuxInt)
1900 x := v_0
1901 if v_1.Op != OpARMMOVWconst {
1902 break
1903 }
1904 c := auxIntToInt32(v_1.AuxInt)
1905 v.reset(OpARMADDSconst)
1906 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
1907 v.AddArg(x)
1908 return true
1909 }
1910 return false
1911 }
1912 func rewriteValueARM_OpARMADDSshiftRLreg(v *Value) bool {
1913 v_2 := v.Args[2]
1914 v_1 := v.Args[1]
1915 v_0 := v.Args[0]
1916 b := v.Block
1917
1918
1919 for {
1920 if v_0.Op != OpARMMOVWconst {
1921 break
1922 }
1923 c := auxIntToInt32(v_0.AuxInt)
1924 x := v_1
1925 y := v_2
1926 v.reset(OpARMADDSconst)
1927 v.AuxInt = int32ToAuxInt(c)
1928 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
1929 v0.AddArg2(x, y)
1930 v.AddArg(v0)
1931 return true
1932 }
1933
1934
1935
1936 for {
1937 x := v_0
1938 y := v_1
1939 if v_2.Op != OpARMMOVWconst {
1940 break
1941 }
1942 c := auxIntToInt32(v_2.AuxInt)
1943 if !(0 <= c && c < 32) {
1944 break
1945 }
1946 v.reset(OpARMADDSshiftRL)
1947 v.AuxInt = int32ToAuxInt(c)
1948 v.AddArg2(x, y)
1949 return true
1950 }
1951 return false
1952 }
1953 func rewriteValueARM_OpARMADDconst(v *Value) bool {
1954 v_0 := v.Args[0]
1955
1956
1957 for {
1958 off1 := auxIntToInt32(v.AuxInt)
1959 if v_0.Op != OpARMMOVWaddr {
1960 break
1961 }
1962 off2 := auxIntToInt32(v_0.AuxInt)
1963 sym := auxToSym(v_0.Aux)
1964 ptr := v_0.Args[0]
1965 v.reset(OpARMMOVWaddr)
1966 v.AuxInt = int32ToAuxInt(off1 + off2)
1967 v.Aux = symToAux(sym)
1968 v.AddArg(ptr)
1969 return true
1970 }
1971
1972
1973 for {
1974 if auxIntToInt32(v.AuxInt) != 0 {
1975 break
1976 }
1977 x := v_0
1978 v.copyOf(x)
1979 return true
1980 }
1981
1982
1983
1984 for {
1985 c := auxIntToInt32(v.AuxInt)
1986 x := v_0
1987 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) {
1988 break
1989 }
1990 v.reset(OpARMSUBconst)
1991 v.AuxInt = int32ToAuxInt(-c)
1992 v.AddArg(x)
1993 return true
1994 }
1995
1996
1997
1998 for {
1999 c := auxIntToInt32(v.AuxInt)
2000 x := v_0
2001 if !(buildcfg.GOARM.Version == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && uint32(-c) <= 0xffff) {
2002 break
2003 }
2004 v.reset(OpARMSUBconst)
2005 v.AuxInt = int32ToAuxInt(-c)
2006 v.AddArg(x)
2007 return true
2008 }
2009
2010
2011 for {
2012 c := auxIntToInt32(v.AuxInt)
2013 if v_0.Op != OpARMMOVWconst {
2014 break
2015 }
2016 d := auxIntToInt32(v_0.AuxInt)
2017 v.reset(OpARMMOVWconst)
2018 v.AuxInt = int32ToAuxInt(c + d)
2019 return true
2020 }
2021
2022
2023 for {
2024 c := auxIntToInt32(v.AuxInt)
2025 if v_0.Op != OpARMADDconst {
2026 break
2027 }
2028 d := auxIntToInt32(v_0.AuxInt)
2029 x := v_0.Args[0]
2030 v.reset(OpARMADDconst)
2031 v.AuxInt = int32ToAuxInt(c + d)
2032 v.AddArg(x)
2033 return true
2034 }
2035
2036
2037 for {
2038 c := auxIntToInt32(v.AuxInt)
2039 if v_0.Op != OpARMSUBconst {
2040 break
2041 }
2042 d := auxIntToInt32(v_0.AuxInt)
2043 x := v_0.Args[0]
2044 v.reset(OpARMADDconst)
2045 v.AuxInt = int32ToAuxInt(c - d)
2046 v.AddArg(x)
2047 return true
2048 }
2049
2050
2051 for {
2052 c := auxIntToInt32(v.AuxInt)
2053 if v_0.Op != OpARMRSBconst {
2054 break
2055 }
2056 d := auxIntToInt32(v_0.AuxInt)
2057 x := v_0.Args[0]
2058 v.reset(OpARMRSBconst)
2059 v.AuxInt = int32ToAuxInt(c + d)
2060 v.AddArg(x)
2061 return true
2062 }
2063 return false
2064 }
2065 func rewriteValueARM_OpARMADDshiftLL(v *Value) bool {
2066 v_1 := v.Args[1]
2067 v_0 := v.Args[0]
2068 b := v.Block
2069 typ := &b.Func.Config.Types
2070
2071
2072 for {
2073 d := auxIntToInt32(v.AuxInt)
2074 if v_0.Op != OpARMMOVWconst {
2075 break
2076 }
2077 c := auxIntToInt32(v_0.AuxInt)
2078 x := v_1
2079 v.reset(OpARMADDconst)
2080 v.AuxInt = int32ToAuxInt(c)
2081 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
2082 v0.AuxInt = int32ToAuxInt(d)
2083 v0.AddArg(x)
2084 v.AddArg(v0)
2085 return true
2086 }
2087
2088
2089 for {
2090 d := auxIntToInt32(v.AuxInt)
2091 x := v_0
2092 if v_1.Op != OpARMMOVWconst {
2093 break
2094 }
2095 c := auxIntToInt32(v_1.AuxInt)
2096 v.reset(OpARMADDconst)
2097 v.AuxInt = int32ToAuxInt(c << uint64(d))
2098 v.AddArg(x)
2099 return true
2100 }
2101
2102
2103 for {
2104 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)) {
2105 break
2106 }
2107 x := v_0.Args[0]
2108 if x != v_1 {
2109 break
2110 }
2111 v.reset(OpARMREV16)
2112 v.AddArg(x)
2113 return true
2114 }
2115
2116
2117
2118 for {
2119 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMSRLconst || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != 24 {
2120 break
2121 }
2122 v_0_0 := v_0.Args[0]
2123 if v_0_0.Op != OpARMSLLconst || auxIntToInt32(v_0_0.AuxInt) != 16 {
2124 break
2125 }
2126 x := v_0_0.Args[0]
2127 if x != v_1 || !(buildcfg.GOARM.Version >= 6) {
2128 break
2129 }
2130 v.reset(OpARMREV16)
2131 v.AddArg(x)
2132 return true
2133 }
2134 return false
2135 }
2136 func rewriteValueARM_OpARMADDshiftLLreg(v *Value) bool {
2137 v_2 := v.Args[2]
2138 v_1 := v.Args[1]
2139 v_0 := v.Args[0]
2140 b := v.Block
2141
2142
2143 for {
2144 if v_0.Op != OpARMMOVWconst {
2145 break
2146 }
2147 c := auxIntToInt32(v_0.AuxInt)
2148 x := v_1
2149 y := v_2
2150 v.reset(OpARMADDconst)
2151 v.AuxInt = int32ToAuxInt(c)
2152 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
2153 v0.AddArg2(x, y)
2154 v.AddArg(v0)
2155 return true
2156 }
2157
2158
2159
2160 for {
2161 x := v_0
2162 y := v_1
2163 if v_2.Op != OpARMMOVWconst {
2164 break
2165 }
2166 c := auxIntToInt32(v_2.AuxInt)
2167 if !(0 <= c && c < 32) {
2168 break
2169 }
2170 v.reset(OpARMADDshiftLL)
2171 v.AuxInt = int32ToAuxInt(c)
2172 v.AddArg2(x, y)
2173 return true
2174 }
2175 return false
2176 }
2177 func rewriteValueARM_OpARMADDshiftRA(v *Value) bool {
2178 v_1 := v.Args[1]
2179 v_0 := v.Args[0]
2180 b := v.Block
2181
2182
2183 for {
2184 d := auxIntToInt32(v.AuxInt)
2185 if v_0.Op != OpARMMOVWconst {
2186 break
2187 }
2188 c := auxIntToInt32(v_0.AuxInt)
2189 x := v_1
2190 v.reset(OpARMADDconst)
2191 v.AuxInt = int32ToAuxInt(c)
2192 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
2193 v0.AuxInt = int32ToAuxInt(d)
2194 v0.AddArg(x)
2195 v.AddArg(v0)
2196 return true
2197 }
2198
2199
2200 for {
2201 d := auxIntToInt32(v.AuxInt)
2202 x := v_0
2203 if v_1.Op != OpARMMOVWconst {
2204 break
2205 }
2206 c := auxIntToInt32(v_1.AuxInt)
2207 v.reset(OpARMADDconst)
2208 v.AuxInt = int32ToAuxInt(c >> uint64(d))
2209 v.AddArg(x)
2210 return true
2211 }
2212 return false
2213 }
2214 func rewriteValueARM_OpARMADDshiftRAreg(v *Value) bool {
2215 v_2 := v.Args[2]
2216 v_1 := v.Args[1]
2217 v_0 := v.Args[0]
2218 b := v.Block
2219
2220
2221 for {
2222 if v_0.Op != OpARMMOVWconst {
2223 break
2224 }
2225 c := auxIntToInt32(v_0.AuxInt)
2226 x := v_1
2227 y := v_2
2228 v.reset(OpARMADDconst)
2229 v.AuxInt = int32ToAuxInt(c)
2230 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
2231 v0.AddArg2(x, y)
2232 v.AddArg(v0)
2233 return true
2234 }
2235
2236
2237
2238 for {
2239 x := v_0
2240 y := v_1
2241 if v_2.Op != OpARMMOVWconst {
2242 break
2243 }
2244 c := auxIntToInt32(v_2.AuxInt)
2245 if !(0 <= c && c < 32) {
2246 break
2247 }
2248 v.reset(OpARMADDshiftRA)
2249 v.AuxInt = int32ToAuxInt(c)
2250 v.AddArg2(x, y)
2251 return true
2252 }
2253 return false
2254 }
2255 func rewriteValueARM_OpARMADDshiftRL(v *Value) bool {
2256 v_1 := v.Args[1]
2257 v_0 := v.Args[0]
2258 b := v.Block
2259
2260
2261 for {
2262 d := auxIntToInt32(v.AuxInt)
2263 if v_0.Op != OpARMMOVWconst {
2264 break
2265 }
2266 c := auxIntToInt32(v_0.AuxInt)
2267 x := v_1
2268 v.reset(OpARMADDconst)
2269 v.AuxInt = int32ToAuxInt(c)
2270 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
2271 v0.AuxInt = int32ToAuxInt(d)
2272 v0.AddArg(x)
2273 v.AddArg(v0)
2274 return true
2275 }
2276
2277
2278 for {
2279 d := auxIntToInt32(v.AuxInt)
2280 x := v_0
2281 if v_1.Op != OpARMMOVWconst {
2282 break
2283 }
2284 c := auxIntToInt32(v_1.AuxInt)
2285 v.reset(OpARMADDconst)
2286 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
2287 v.AddArg(x)
2288 return true
2289 }
2290 return false
2291 }
2292 func rewriteValueARM_OpARMADDshiftRLreg(v *Value) bool {
2293 v_2 := v.Args[2]
2294 v_1 := v.Args[1]
2295 v_0 := v.Args[0]
2296 b := v.Block
2297
2298
2299 for {
2300 if v_0.Op != OpARMMOVWconst {
2301 break
2302 }
2303 c := auxIntToInt32(v_0.AuxInt)
2304 x := v_1
2305 y := v_2
2306 v.reset(OpARMADDconst)
2307 v.AuxInt = int32ToAuxInt(c)
2308 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
2309 v0.AddArg2(x, y)
2310 v.AddArg(v0)
2311 return true
2312 }
2313
2314
2315
2316 for {
2317 x := v_0
2318 y := v_1
2319 if v_2.Op != OpARMMOVWconst {
2320 break
2321 }
2322 c := auxIntToInt32(v_2.AuxInt)
2323 if !(0 <= c && c < 32) {
2324 break
2325 }
2326 v.reset(OpARMADDshiftRL)
2327 v.AuxInt = int32ToAuxInt(c)
2328 v.AddArg2(x, y)
2329 return true
2330 }
2331 return false
2332 }
2333 func rewriteValueARM_OpARMAND(v *Value) bool {
2334 v_1 := v.Args[1]
2335 v_0 := v.Args[0]
2336
2337
2338 for {
2339 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2340 x := v_0
2341 if v_1.Op != OpARMMOVWconst {
2342 continue
2343 }
2344 c := auxIntToInt32(v_1.AuxInt)
2345 v.reset(OpARMANDconst)
2346 v.AuxInt = int32ToAuxInt(c)
2347 v.AddArg(x)
2348 return true
2349 }
2350 break
2351 }
2352
2353
2354 for {
2355 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2356 x := v_0
2357 if v_1.Op != OpARMSLLconst {
2358 continue
2359 }
2360 c := auxIntToInt32(v_1.AuxInt)
2361 y := v_1.Args[0]
2362 v.reset(OpARMANDshiftLL)
2363 v.AuxInt = int32ToAuxInt(c)
2364 v.AddArg2(x, y)
2365 return true
2366 }
2367 break
2368 }
2369
2370
2371 for {
2372 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2373 x := v_0
2374 if v_1.Op != OpARMSRLconst {
2375 continue
2376 }
2377 c := auxIntToInt32(v_1.AuxInt)
2378 y := v_1.Args[0]
2379 v.reset(OpARMANDshiftRL)
2380 v.AuxInt = int32ToAuxInt(c)
2381 v.AddArg2(x, y)
2382 return true
2383 }
2384 break
2385 }
2386
2387
2388 for {
2389 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2390 x := v_0
2391 if v_1.Op != OpARMSRAconst {
2392 continue
2393 }
2394 c := auxIntToInt32(v_1.AuxInt)
2395 y := v_1.Args[0]
2396 v.reset(OpARMANDshiftRA)
2397 v.AuxInt = int32ToAuxInt(c)
2398 v.AddArg2(x, y)
2399 return true
2400 }
2401 break
2402 }
2403
2404
2405 for {
2406 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2407 x := v_0
2408 if v_1.Op != OpARMSLL {
2409 continue
2410 }
2411 z := v_1.Args[1]
2412 y := v_1.Args[0]
2413 v.reset(OpARMANDshiftLLreg)
2414 v.AddArg3(x, y, z)
2415 return true
2416 }
2417 break
2418 }
2419
2420
2421 for {
2422 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2423 x := v_0
2424 if v_1.Op != OpARMSRL {
2425 continue
2426 }
2427 z := v_1.Args[1]
2428 y := v_1.Args[0]
2429 v.reset(OpARMANDshiftRLreg)
2430 v.AddArg3(x, y, z)
2431 return true
2432 }
2433 break
2434 }
2435
2436
2437 for {
2438 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2439 x := v_0
2440 if v_1.Op != OpARMSRA {
2441 continue
2442 }
2443 z := v_1.Args[1]
2444 y := v_1.Args[0]
2445 v.reset(OpARMANDshiftRAreg)
2446 v.AddArg3(x, y, z)
2447 return true
2448 }
2449 break
2450 }
2451
2452
2453 for {
2454 x := v_0
2455 if x != v_1 {
2456 break
2457 }
2458 v.copyOf(x)
2459 return true
2460 }
2461
2462
2463 for {
2464 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2465 x := v_0
2466 if v_1.Op != OpARMMVN {
2467 continue
2468 }
2469 y := v_1.Args[0]
2470 v.reset(OpARMBIC)
2471 v.AddArg2(x, y)
2472 return true
2473 }
2474 break
2475 }
2476
2477
2478 for {
2479 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2480 x := v_0
2481 if v_1.Op != OpARMMVNshiftLL {
2482 continue
2483 }
2484 c := auxIntToInt32(v_1.AuxInt)
2485 y := v_1.Args[0]
2486 v.reset(OpARMBICshiftLL)
2487 v.AuxInt = int32ToAuxInt(c)
2488 v.AddArg2(x, y)
2489 return true
2490 }
2491 break
2492 }
2493
2494
2495 for {
2496 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2497 x := v_0
2498 if v_1.Op != OpARMMVNshiftRL {
2499 continue
2500 }
2501 c := auxIntToInt32(v_1.AuxInt)
2502 y := v_1.Args[0]
2503 v.reset(OpARMBICshiftRL)
2504 v.AuxInt = int32ToAuxInt(c)
2505 v.AddArg2(x, y)
2506 return true
2507 }
2508 break
2509 }
2510
2511
2512 for {
2513 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2514 x := v_0
2515 if v_1.Op != OpARMMVNshiftRA {
2516 continue
2517 }
2518 c := auxIntToInt32(v_1.AuxInt)
2519 y := v_1.Args[0]
2520 v.reset(OpARMBICshiftRA)
2521 v.AuxInt = int32ToAuxInt(c)
2522 v.AddArg2(x, y)
2523 return true
2524 }
2525 break
2526 }
2527 return false
2528 }
2529 func rewriteValueARM_OpARMANDconst(v *Value) bool {
2530 v_0 := v.Args[0]
2531
2532
2533 for {
2534 if auxIntToInt32(v.AuxInt) != 0 {
2535 break
2536 }
2537 v.reset(OpARMMOVWconst)
2538 v.AuxInt = int32ToAuxInt(0)
2539 return true
2540 }
2541
2542
2543
2544 for {
2545 c := auxIntToInt32(v.AuxInt)
2546 x := v_0
2547 if !(int32(c) == -1) {
2548 break
2549 }
2550 v.copyOf(x)
2551 return true
2552 }
2553
2554
2555
2556 for {
2557 c := auxIntToInt32(v.AuxInt)
2558 x := v_0
2559 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) {
2560 break
2561 }
2562 v.reset(OpARMBICconst)
2563 v.AuxInt = int32ToAuxInt(int32(^uint32(c)))
2564 v.AddArg(x)
2565 return true
2566 }
2567
2568
2569
2570 for {
2571 c := auxIntToInt32(v.AuxInt)
2572 x := v_0
2573 if !(buildcfg.GOARM.Version == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && ^uint32(c) <= 0xffff) {
2574 break
2575 }
2576 v.reset(OpARMBICconst)
2577 v.AuxInt = int32ToAuxInt(int32(^uint32(c)))
2578 v.AddArg(x)
2579 return true
2580 }
2581
2582
2583 for {
2584 c := auxIntToInt32(v.AuxInt)
2585 if v_0.Op != OpARMMOVWconst {
2586 break
2587 }
2588 d := auxIntToInt32(v_0.AuxInt)
2589 v.reset(OpARMMOVWconst)
2590 v.AuxInt = int32ToAuxInt(c & d)
2591 return true
2592 }
2593
2594
2595 for {
2596 c := auxIntToInt32(v.AuxInt)
2597 if v_0.Op != OpARMANDconst {
2598 break
2599 }
2600 d := auxIntToInt32(v_0.AuxInt)
2601 x := v_0.Args[0]
2602 v.reset(OpARMANDconst)
2603 v.AuxInt = int32ToAuxInt(c & d)
2604 v.AddArg(x)
2605 return true
2606 }
2607 return false
2608 }
2609 func rewriteValueARM_OpARMANDshiftLL(v *Value) bool {
2610 v_1 := v.Args[1]
2611 v_0 := v.Args[0]
2612 b := v.Block
2613
2614
2615 for {
2616 d := auxIntToInt32(v.AuxInt)
2617 if v_0.Op != OpARMMOVWconst {
2618 break
2619 }
2620 c := auxIntToInt32(v_0.AuxInt)
2621 x := v_1
2622 v.reset(OpARMANDconst)
2623 v.AuxInt = int32ToAuxInt(c)
2624 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
2625 v0.AuxInt = int32ToAuxInt(d)
2626 v0.AddArg(x)
2627 v.AddArg(v0)
2628 return true
2629 }
2630
2631
2632 for {
2633 d := auxIntToInt32(v.AuxInt)
2634 x := v_0
2635 if v_1.Op != OpARMMOVWconst {
2636 break
2637 }
2638 c := auxIntToInt32(v_1.AuxInt)
2639 v.reset(OpARMANDconst)
2640 v.AuxInt = int32ToAuxInt(c << uint64(d))
2641 v.AddArg(x)
2642 return true
2643 }
2644
2645
2646 for {
2647 c := auxIntToInt32(v.AuxInt)
2648 y := v_0
2649 if y.Op != OpARMSLLconst || auxIntToInt32(y.AuxInt) != c {
2650 break
2651 }
2652 x := y.Args[0]
2653 if x != v_1 {
2654 break
2655 }
2656 v.copyOf(y)
2657 return true
2658 }
2659 return false
2660 }
2661 func rewriteValueARM_OpARMANDshiftLLreg(v *Value) bool {
2662 v_2 := v.Args[2]
2663 v_1 := v.Args[1]
2664 v_0 := v.Args[0]
2665 b := v.Block
2666
2667
2668 for {
2669 if v_0.Op != OpARMMOVWconst {
2670 break
2671 }
2672 c := auxIntToInt32(v_0.AuxInt)
2673 x := v_1
2674 y := v_2
2675 v.reset(OpARMANDconst)
2676 v.AuxInt = int32ToAuxInt(c)
2677 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
2678 v0.AddArg2(x, y)
2679 v.AddArg(v0)
2680 return true
2681 }
2682
2683
2684
2685 for {
2686 x := v_0
2687 y := v_1
2688 if v_2.Op != OpARMMOVWconst {
2689 break
2690 }
2691 c := auxIntToInt32(v_2.AuxInt)
2692 if !(0 <= c && c < 32) {
2693 break
2694 }
2695 v.reset(OpARMANDshiftLL)
2696 v.AuxInt = int32ToAuxInt(c)
2697 v.AddArg2(x, y)
2698 return true
2699 }
2700 return false
2701 }
2702 func rewriteValueARM_OpARMANDshiftRA(v *Value) bool {
2703 v_1 := v.Args[1]
2704 v_0 := v.Args[0]
2705 b := v.Block
2706
2707
2708 for {
2709 d := auxIntToInt32(v.AuxInt)
2710 if v_0.Op != OpARMMOVWconst {
2711 break
2712 }
2713 c := auxIntToInt32(v_0.AuxInt)
2714 x := v_1
2715 v.reset(OpARMANDconst)
2716 v.AuxInt = int32ToAuxInt(c)
2717 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
2718 v0.AuxInt = int32ToAuxInt(d)
2719 v0.AddArg(x)
2720 v.AddArg(v0)
2721 return true
2722 }
2723
2724
2725 for {
2726 d := auxIntToInt32(v.AuxInt)
2727 x := v_0
2728 if v_1.Op != OpARMMOVWconst {
2729 break
2730 }
2731 c := auxIntToInt32(v_1.AuxInt)
2732 v.reset(OpARMANDconst)
2733 v.AuxInt = int32ToAuxInt(c >> uint64(d))
2734 v.AddArg(x)
2735 return true
2736 }
2737
2738
2739 for {
2740 c := auxIntToInt32(v.AuxInt)
2741 y := v_0
2742 if y.Op != OpARMSRAconst || auxIntToInt32(y.AuxInt) != c {
2743 break
2744 }
2745 x := y.Args[0]
2746 if x != v_1 {
2747 break
2748 }
2749 v.copyOf(y)
2750 return true
2751 }
2752 return false
2753 }
2754 func rewriteValueARM_OpARMANDshiftRAreg(v *Value) bool {
2755 v_2 := v.Args[2]
2756 v_1 := v.Args[1]
2757 v_0 := v.Args[0]
2758 b := v.Block
2759
2760
2761 for {
2762 if v_0.Op != OpARMMOVWconst {
2763 break
2764 }
2765 c := auxIntToInt32(v_0.AuxInt)
2766 x := v_1
2767 y := v_2
2768 v.reset(OpARMANDconst)
2769 v.AuxInt = int32ToAuxInt(c)
2770 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
2771 v0.AddArg2(x, y)
2772 v.AddArg(v0)
2773 return true
2774 }
2775
2776
2777
2778 for {
2779 x := v_0
2780 y := v_1
2781 if v_2.Op != OpARMMOVWconst {
2782 break
2783 }
2784 c := auxIntToInt32(v_2.AuxInt)
2785 if !(0 <= c && c < 32) {
2786 break
2787 }
2788 v.reset(OpARMANDshiftRA)
2789 v.AuxInt = int32ToAuxInt(c)
2790 v.AddArg2(x, y)
2791 return true
2792 }
2793 return false
2794 }
2795 func rewriteValueARM_OpARMANDshiftRL(v *Value) bool {
2796 v_1 := v.Args[1]
2797 v_0 := v.Args[0]
2798 b := v.Block
2799
2800
2801 for {
2802 d := auxIntToInt32(v.AuxInt)
2803 if v_0.Op != OpARMMOVWconst {
2804 break
2805 }
2806 c := auxIntToInt32(v_0.AuxInt)
2807 x := v_1
2808 v.reset(OpARMANDconst)
2809 v.AuxInt = int32ToAuxInt(c)
2810 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
2811 v0.AuxInt = int32ToAuxInt(d)
2812 v0.AddArg(x)
2813 v.AddArg(v0)
2814 return true
2815 }
2816
2817
2818 for {
2819 d := auxIntToInt32(v.AuxInt)
2820 x := v_0
2821 if v_1.Op != OpARMMOVWconst {
2822 break
2823 }
2824 c := auxIntToInt32(v_1.AuxInt)
2825 v.reset(OpARMANDconst)
2826 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
2827 v.AddArg(x)
2828 return true
2829 }
2830
2831
2832 for {
2833 c := auxIntToInt32(v.AuxInt)
2834 y := v_0
2835 if y.Op != OpARMSRLconst || auxIntToInt32(y.AuxInt) != c {
2836 break
2837 }
2838 x := y.Args[0]
2839 if x != v_1 {
2840 break
2841 }
2842 v.copyOf(y)
2843 return true
2844 }
2845 return false
2846 }
2847 func rewriteValueARM_OpARMANDshiftRLreg(v *Value) bool {
2848 v_2 := v.Args[2]
2849 v_1 := v.Args[1]
2850 v_0 := v.Args[0]
2851 b := v.Block
2852
2853
2854 for {
2855 if v_0.Op != OpARMMOVWconst {
2856 break
2857 }
2858 c := auxIntToInt32(v_0.AuxInt)
2859 x := v_1
2860 y := v_2
2861 v.reset(OpARMANDconst)
2862 v.AuxInt = int32ToAuxInt(c)
2863 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
2864 v0.AddArg2(x, y)
2865 v.AddArg(v0)
2866 return true
2867 }
2868
2869
2870
2871 for {
2872 x := v_0
2873 y := v_1
2874 if v_2.Op != OpARMMOVWconst {
2875 break
2876 }
2877 c := auxIntToInt32(v_2.AuxInt)
2878 if !(0 <= c && c < 32) {
2879 break
2880 }
2881 v.reset(OpARMANDshiftRL)
2882 v.AuxInt = int32ToAuxInt(c)
2883 v.AddArg2(x, y)
2884 return true
2885 }
2886 return false
2887 }
2888 func rewriteValueARM_OpARMBFX(v *Value) bool {
2889 v_0 := v.Args[0]
2890
2891
2892 for {
2893 c := auxIntToInt32(v.AuxInt)
2894 if v_0.Op != OpARMMOVWconst {
2895 break
2896 }
2897 d := auxIntToInt32(v_0.AuxInt)
2898 v.reset(OpARMMOVWconst)
2899 v.AuxInt = int32ToAuxInt(d << (32 - uint32(c&0xff) - uint32(c>>8)) >> (32 - uint32(c>>8)))
2900 return true
2901 }
2902 return false
2903 }
2904 func rewriteValueARM_OpARMBFXU(v *Value) bool {
2905 v_0 := v.Args[0]
2906
2907
2908 for {
2909 c := auxIntToInt32(v.AuxInt)
2910 if v_0.Op != OpARMMOVWconst {
2911 break
2912 }
2913 d := auxIntToInt32(v_0.AuxInt)
2914 v.reset(OpARMMOVWconst)
2915 v.AuxInt = int32ToAuxInt(int32(uint32(d) << (32 - uint32(c&0xff) - uint32(c>>8)) >> (32 - uint32(c>>8))))
2916 return true
2917 }
2918 return false
2919 }
2920 func rewriteValueARM_OpARMBIC(v *Value) bool {
2921 v_1 := v.Args[1]
2922 v_0 := v.Args[0]
2923
2924
2925 for {
2926 x := v_0
2927 if v_1.Op != OpARMMOVWconst {
2928 break
2929 }
2930 c := auxIntToInt32(v_1.AuxInt)
2931 v.reset(OpARMBICconst)
2932 v.AuxInt = int32ToAuxInt(c)
2933 v.AddArg(x)
2934 return true
2935 }
2936
2937
2938 for {
2939 x := v_0
2940 if v_1.Op != OpARMSLLconst {
2941 break
2942 }
2943 c := auxIntToInt32(v_1.AuxInt)
2944 y := v_1.Args[0]
2945 v.reset(OpARMBICshiftLL)
2946 v.AuxInt = int32ToAuxInt(c)
2947 v.AddArg2(x, y)
2948 return true
2949 }
2950
2951
2952 for {
2953 x := v_0
2954 if v_1.Op != OpARMSRLconst {
2955 break
2956 }
2957 c := auxIntToInt32(v_1.AuxInt)
2958 y := v_1.Args[0]
2959 v.reset(OpARMBICshiftRL)
2960 v.AuxInt = int32ToAuxInt(c)
2961 v.AddArg2(x, y)
2962 return true
2963 }
2964
2965
2966 for {
2967 x := v_0
2968 if v_1.Op != OpARMSRAconst {
2969 break
2970 }
2971 c := auxIntToInt32(v_1.AuxInt)
2972 y := v_1.Args[0]
2973 v.reset(OpARMBICshiftRA)
2974 v.AuxInt = int32ToAuxInt(c)
2975 v.AddArg2(x, y)
2976 return true
2977 }
2978
2979
2980 for {
2981 x := v_0
2982 if v_1.Op != OpARMSLL {
2983 break
2984 }
2985 z := v_1.Args[1]
2986 y := v_1.Args[0]
2987 v.reset(OpARMBICshiftLLreg)
2988 v.AddArg3(x, y, z)
2989 return true
2990 }
2991
2992
2993 for {
2994 x := v_0
2995 if v_1.Op != OpARMSRL {
2996 break
2997 }
2998 z := v_1.Args[1]
2999 y := v_1.Args[0]
3000 v.reset(OpARMBICshiftRLreg)
3001 v.AddArg3(x, y, z)
3002 return true
3003 }
3004
3005
3006 for {
3007 x := v_0
3008 if v_1.Op != OpARMSRA {
3009 break
3010 }
3011 z := v_1.Args[1]
3012 y := v_1.Args[0]
3013 v.reset(OpARMBICshiftRAreg)
3014 v.AddArg3(x, y, z)
3015 return true
3016 }
3017
3018
3019 for {
3020 x := v_0
3021 if x != v_1 {
3022 break
3023 }
3024 v.reset(OpARMMOVWconst)
3025 v.AuxInt = int32ToAuxInt(0)
3026 return true
3027 }
3028 return false
3029 }
3030 func rewriteValueARM_OpARMBICconst(v *Value) bool {
3031 v_0 := v.Args[0]
3032
3033
3034 for {
3035 if auxIntToInt32(v.AuxInt) != 0 {
3036 break
3037 }
3038 x := v_0
3039 v.copyOf(x)
3040 return true
3041 }
3042
3043
3044
3045 for {
3046 c := auxIntToInt32(v.AuxInt)
3047 if !(int32(c) == -1) {
3048 break
3049 }
3050 v.reset(OpARMMOVWconst)
3051 v.AuxInt = int32ToAuxInt(0)
3052 return true
3053 }
3054
3055
3056
3057 for {
3058 c := auxIntToInt32(v.AuxInt)
3059 x := v_0
3060 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) {
3061 break
3062 }
3063 v.reset(OpARMANDconst)
3064 v.AuxInt = int32ToAuxInt(int32(^uint32(c)))
3065 v.AddArg(x)
3066 return true
3067 }
3068
3069
3070
3071 for {
3072 c := auxIntToInt32(v.AuxInt)
3073 x := v_0
3074 if !(buildcfg.GOARM.Version == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && ^uint32(c) <= 0xffff) {
3075 break
3076 }
3077 v.reset(OpARMANDconst)
3078 v.AuxInt = int32ToAuxInt(int32(^uint32(c)))
3079 v.AddArg(x)
3080 return true
3081 }
3082
3083
3084 for {
3085 c := auxIntToInt32(v.AuxInt)
3086 if v_0.Op != OpARMMOVWconst {
3087 break
3088 }
3089 d := auxIntToInt32(v_0.AuxInt)
3090 v.reset(OpARMMOVWconst)
3091 v.AuxInt = int32ToAuxInt(d &^ c)
3092 return true
3093 }
3094
3095
3096 for {
3097 c := auxIntToInt32(v.AuxInt)
3098 if v_0.Op != OpARMBICconst {
3099 break
3100 }
3101 d := auxIntToInt32(v_0.AuxInt)
3102 x := v_0.Args[0]
3103 v.reset(OpARMBICconst)
3104 v.AuxInt = int32ToAuxInt(c | d)
3105 v.AddArg(x)
3106 return true
3107 }
3108 return false
3109 }
3110 func rewriteValueARM_OpARMBICshiftLL(v *Value) bool {
3111 v_1 := v.Args[1]
3112 v_0 := v.Args[0]
3113
3114
3115 for {
3116 d := auxIntToInt32(v.AuxInt)
3117 x := v_0
3118 if v_1.Op != OpARMMOVWconst {
3119 break
3120 }
3121 c := auxIntToInt32(v_1.AuxInt)
3122 v.reset(OpARMBICconst)
3123 v.AuxInt = int32ToAuxInt(c << uint64(d))
3124 v.AddArg(x)
3125 return true
3126 }
3127
3128
3129 for {
3130 c := auxIntToInt32(v.AuxInt)
3131 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c {
3132 break
3133 }
3134 x := v_0.Args[0]
3135 if x != v_1 {
3136 break
3137 }
3138 v.reset(OpARMMOVWconst)
3139 v.AuxInt = int32ToAuxInt(0)
3140 return true
3141 }
3142 return false
3143 }
3144 func rewriteValueARM_OpARMBICshiftLLreg(v *Value) bool {
3145 v_2 := v.Args[2]
3146 v_1 := v.Args[1]
3147 v_0 := v.Args[0]
3148
3149
3150
3151 for {
3152 x := v_0
3153 y := v_1
3154 if v_2.Op != OpARMMOVWconst {
3155 break
3156 }
3157 c := auxIntToInt32(v_2.AuxInt)
3158 if !(0 <= c && c < 32) {
3159 break
3160 }
3161 v.reset(OpARMBICshiftLL)
3162 v.AuxInt = int32ToAuxInt(c)
3163 v.AddArg2(x, y)
3164 return true
3165 }
3166 return false
3167 }
3168 func rewriteValueARM_OpARMBICshiftRA(v *Value) bool {
3169 v_1 := v.Args[1]
3170 v_0 := v.Args[0]
3171
3172
3173 for {
3174 d := auxIntToInt32(v.AuxInt)
3175 x := v_0
3176 if v_1.Op != OpARMMOVWconst {
3177 break
3178 }
3179 c := auxIntToInt32(v_1.AuxInt)
3180 v.reset(OpARMBICconst)
3181 v.AuxInt = int32ToAuxInt(c >> uint64(d))
3182 v.AddArg(x)
3183 return true
3184 }
3185
3186
3187 for {
3188 c := auxIntToInt32(v.AuxInt)
3189 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c {
3190 break
3191 }
3192 x := v_0.Args[0]
3193 if x != v_1 {
3194 break
3195 }
3196 v.reset(OpARMMOVWconst)
3197 v.AuxInt = int32ToAuxInt(0)
3198 return true
3199 }
3200 return false
3201 }
3202 func rewriteValueARM_OpARMBICshiftRAreg(v *Value) bool {
3203 v_2 := v.Args[2]
3204 v_1 := v.Args[1]
3205 v_0 := v.Args[0]
3206
3207
3208
3209 for {
3210 x := v_0
3211 y := v_1
3212 if v_2.Op != OpARMMOVWconst {
3213 break
3214 }
3215 c := auxIntToInt32(v_2.AuxInt)
3216 if !(0 <= c && c < 32) {
3217 break
3218 }
3219 v.reset(OpARMBICshiftRA)
3220 v.AuxInt = int32ToAuxInt(c)
3221 v.AddArg2(x, y)
3222 return true
3223 }
3224 return false
3225 }
3226 func rewriteValueARM_OpARMBICshiftRL(v *Value) bool {
3227 v_1 := v.Args[1]
3228 v_0 := v.Args[0]
3229
3230
3231 for {
3232 d := auxIntToInt32(v.AuxInt)
3233 x := v_0
3234 if v_1.Op != OpARMMOVWconst {
3235 break
3236 }
3237 c := auxIntToInt32(v_1.AuxInt)
3238 v.reset(OpARMBICconst)
3239 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
3240 v.AddArg(x)
3241 return true
3242 }
3243
3244
3245 for {
3246 c := auxIntToInt32(v.AuxInt)
3247 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c {
3248 break
3249 }
3250 x := v_0.Args[0]
3251 if x != v_1 {
3252 break
3253 }
3254 v.reset(OpARMMOVWconst)
3255 v.AuxInt = int32ToAuxInt(0)
3256 return true
3257 }
3258 return false
3259 }
3260 func rewriteValueARM_OpARMBICshiftRLreg(v *Value) bool {
3261 v_2 := v.Args[2]
3262 v_1 := v.Args[1]
3263 v_0 := v.Args[0]
3264
3265
3266
3267 for {
3268 x := v_0
3269 y := v_1
3270 if v_2.Op != OpARMMOVWconst {
3271 break
3272 }
3273 c := auxIntToInt32(v_2.AuxInt)
3274 if !(0 <= c && c < 32) {
3275 break
3276 }
3277 v.reset(OpARMBICshiftRL)
3278 v.AuxInt = int32ToAuxInt(c)
3279 v.AddArg2(x, y)
3280 return true
3281 }
3282 return false
3283 }
3284 func rewriteValueARM_OpARMCMN(v *Value) bool {
3285 v_1 := v.Args[1]
3286 v_0 := v.Args[0]
3287
3288
3289 for {
3290 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3291 x := v_0
3292 if v_1.Op != OpARMMOVWconst {
3293 continue
3294 }
3295 c := auxIntToInt32(v_1.AuxInt)
3296 v.reset(OpARMCMNconst)
3297 v.AuxInt = int32ToAuxInt(c)
3298 v.AddArg(x)
3299 return true
3300 }
3301 break
3302 }
3303
3304
3305 for {
3306 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3307 x := v_0
3308 if v_1.Op != OpARMSLLconst {
3309 continue
3310 }
3311 c := auxIntToInt32(v_1.AuxInt)
3312 y := v_1.Args[0]
3313 v.reset(OpARMCMNshiftLL)
3314 v.AuxInt = int32ToAuxInt(c)
3315 v.AddArg2(x, y)
3316 return true
3317 }
3318 break
3319 }
3320
3321
3322 for {
3323 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3324 x := v_0
3325 if v_1.Op != OpARMSRLconst {
3326 continue
3327 }
3328 c := auxIntToInt32(v_1.AuxInt)
3329 y := v_1.Args[0]
3330 v.reset(OpARMCMNshiftRL)
3331 v.AuxInt = int32ToAuxInt(c)
3332 v.AddArg2(x, y)
3333 return true
3334 }
3335 break
3336 }
3337
3338
3339 for {
3340 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3341 x := v_0
3342 if v_1.Op != OpARMSRAconst {
3343 continue
3344 }
3345 c := auxIntToInt32(v_1.AuxInt)
3346 y := v_1.Args[0]
3347 v.reset(OpARMCMNshiftRA)
3348 v.AuxInt = int32ToAuxInt(c)
3349 v.AddArg2(x, y)
3350 return true
3351 }
3352 break
3353 }
3354
3355
3356 for {
3357 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3358 x := v_0
3359 if v_1.Op != OpARMSLL {
3360 continue
3361 }
3362 z := v_1.Args[1]
3363 y := v_1.Args[0]
3364 v.reset(OpARMCMNshiftLLreg)
3365 v.AddArg3(x, y, z)
3366 return true
3367 }
3368 break
3369 }
3370
3371
3372 for {
3373 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3374 x := v_0
3375 if v_1.Op != OpARMSRL {
3376 continue
3377 }
3378 z := v_1.Args[1]
3379 y := v_1.Args[0]
3380 v.reset(OpARMCMNshiftRLreg)
3381 v.AddArg3(x, y, z)
3382 return true
3383 }
3384 break
3385 }
3386
3387
3388 for {
3389 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
3390 x := v_0
3391 if v_1.Op != OpARMSRA {
3392 continue
3393 }
3394 z := v_1.Args[1]
3395 y := v_1.Args[0]
3396 v.reset(OpARMCMNshiftRAreg)
3397 v.AddArg3(x, y, z)
3398 return true
3399 }
3400 break
3401 }
3402 return false
3403 }
3404 func rewriteValueARM_OpARMCMNconst(v *Value) bool {
3405 v_0 := v.Args[0]
3406
3407
3408 for {
3409 y := auxIntToInt32(v.AuxInt)
3410 if v_0.Op != OpARMMOVWconst {
3411 break
3412 }
3413 x := auxIntToInt32(v_0.AuxInt)
3414 v.reset(OpARMFlagConstant)
3415 v.AuxInt = flagConstantToAuxInt(addFlags32(x, y))
3416 return true
3417 }
3418 return false
3419 }
3420 func rewriteValueARM_OpARMCMNshiftLL(v *Value) bool {
3421 v_1 := v.Args[1]
3422 v_0 := v.Args[0]
3423 b := v.Block
3424
3425
3426 for {
3427 d := auxIntToInt32(v.AuxInt)
3428 if v_0.Op != OpARMMOVWconst {
3429 break
3430 }
3431 c := auxIntToInt32(v_0.AuxInt)
3432 x := v_1
3433 v.reset(OpARMCMNconst)
3434 v.AuxInt = int32ToAuxInt(c)
3435 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
3436 v0.AuxInt = int32ToAuxInt(d)
3437 v0.AddArg(x)
3438 v.AddArg(v0)
3439 return true
3440 }
3441
3442
3443 for {
3444 d := auxIntToInt32(v.AuxInt)
3445 x := v_0
3446 if v_1.Op != OpARMMOVWconst {
3447 break
3448 }
3449 c := auxIntToInt32(v_1.AuxInt)
3450 v.reset(OpARMCMNconst)
3451 v.AuxInt = int32ToAuxInt(c << uint64(d))
3452 v.AddArg(x)
3453 return true
3454 }
3455 return false
3456 }
3457 func rewriteValueARM_OpARMCMNshiftLLreg(v *Value) bool {
3458 v_2 := v.Args[2]
3459 v_1 := v.Args[1]
3460 v_0 := v.Args[0]
3461 b := v.Block
3462
3463
3464 for {
3465 if v_0.Op != OpARMMOVWconst {
3466 break
3467 }
3468 c := auxIntToInt32(v_0.AuxInt)
3469 x := v_1
3470 y := v_2
3471 v.reset(OpARMCMNconst)
3472 v.AuxInt = int32ToAuxInt(c)
3473 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
3474 v0.AddArg2(x, y)
3475 v.AddArg(v0)
3476 return true
3477 }
3478
3479
3480
3481 for {
3482 x := v_0
3483 y := v_1
3484 if v_2.Op != OpARMMOVWconst {
3485 break
3486 }
3487 c := auxIntToInt32(v_2.AuxInt)
3488 if !(0 <= c && c < 32) {
3489 break
3490 }
3491 v.reset(OpARMCMNshiftLL)
3492 v.AuxInt = int32ToAuxInt(c)
3493 v.AddArg2(x, y)
3494 return true
3495 }
3496 return false
3497 }
3498 func rewriteValueARM_OpARMCMNshiftRA(v *Value) bool {
3499 v_1 := v.Args[1]
3500 v_0 := v.Args[0]
3501 b := v.Block
3502
3503
3504 for {
3505 d := auxIntToInt32(v.AuxInt)
3506 if v_0.Op != OpARMMOVWconst {
3507 break
3508 }
3509 c := auxIntToInt32(v_0.AuxInt)
3510 x := v_1
3511 v.reset(OpARMCMNconst)
3512 v.AuxInt = int32ToAuxInt(c)
3513 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
3514 v0.AuxInt = int32ToAuxInt(d)
3515 v0.AddArg(x)
3516 v.AddArg(v0)
3517 return true
3518 }
3519
3520
3521 for {
3522 d := auxIntToInt32(v.AuxInt)
3523 x := v_0
3524 if v_1.Op != OpARMMOVWconst {
3525 break
3526 }
3527 c := auxIntToInt32(v_1.AuxInt)
3528 v.reset(OpARMCMNconst)
3529 v.AuxInt = int32ToAuxInt(c >> uint64(d))
3530 v.AddArg(x)
3531 return true
3532 }
3533 return false
3534 }
3535 func rewriteValueARM_OpARMCMNshiftRAreg(v *Value) bool {
3536 v_2 := v.Args[2]
3537 v_1 := v.Args[1]
3538 v_0 := v.Args[0]
3539 b := v.Block
3540
3541
3542 for {
3543 if v_0.Op != OpARMMOVWconst {
3544 break
3545 }
3546 c := auxIntToInt32(v_0.AuxInt)
3547 x := v_1
3548 y := v_2
3549 v.reset(OpARMCMNconst)
3550 v.AuxInt = int32ToAuxInt(c)
3551 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
3552 v0.AddArg2(x, y)
3553 v.AddArg(v0)
3554 return true
3555 }
3556
3557
3558
3559 for {
3560 x := v_0
3561 y := v_1
3562 if v_2.Op != OpARMMOVWconst {
3563 break
3564 }
3565 c := auxIntToInt32(v_2.AuxInt)
3566 if !(0 <= c && c < 32) {
3567 break
3568 }
3569 v.reset(OpARMCMNshiftRA)
3570 v.AuxInt = int32ToAuxInt(c)
3571 v.AddArg2(x, y)
3572 return true
3573 }
3574 return false
3575 }
3576 func rewriteValueARM_OpARMCMNshiftRL(v *Value) bool {
3577 v_1 := v.Args[1]
3578 v_0 := v.Args[0]
3579 b := v.Block
3580
3581
3582 for {
3583 d := auxIntToInt32(v.AuxInt)
3584 if v_0.Op != OpARMMOVWconst {
3585 break
3586 }
3587 c := auxIntToInt32(v_0.AuxInt)
3588 x := v_1
3589 v.reset(OpARMCMNconst)
3590 v.AuxInt = int32ToAuxInt(c)
3591 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
3592 v0.AuxInt = int32ToAuxInt(d)
3593 v0.AddArg(x)
3594 v.AddArg(v0)
3595 return true
3596 }
3597
3598
3599 for {
3600 d := auxIntToInt32(v.AuxInt)
3601 x := v_0
3602 if v_1.Op != OpARMMOVWconst {
3603 break
3604 }
3605 c := auxIntToInt32(v_1.AuxInt)
3606 v.reset(OpARMCMNconst)
3607 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
3608 v.AddArg(x)
3609 return true
3610 }
3611 return false
3612 }
3613 func rewriteValueARM_OpARMCMNshiftRLreg(v *Value) bool {
3614 v_2 := v.Args[2]
3615 v_1 := v.Args[1]
3616 v_0 := v.Args[0]
3617 b := v.Block
3618
3619
3620 for {
3621 if v_0.Op != OpARMMOVWconst {
3622 break
3623 }
3624 c := auxIntToInt32(v_0.AuxInt)
3625 x := v_1
3626 y := v_2
3627 v.reset(OpARMCMNconst)
3628 v.AuxInt = int32ToAuxInt(c)
3629 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
3630 v0.AddArg2(x, y)
3631 v.AddArg(v0)
3632 return true
3633 }
3634
3635
3636
3637 for {
3638 x := v_0
3639 y := v_1
3640 if v_2.Op != OpARMMOVWconst {
3641 break
3642 }
3643 c := auxIntToInt32(v_2.AuxInt)
3644 if !(0 <= c && c < 32) {
3645 break
3646 }
3647 v.reset(OpARMCMNshiftRL)
3648 v.AuxInt = int32ToAuxInt(c)
3649 v.AddArg2(x, y)
3650 return true
3651 }
3652 return false
3653 }
3654 func rewriteValueARM_OpARMCMOVWHSconst(v *Value) bool {
3655 v_1 := v.Args[1]
3656 v_0 := v.Args[0]
3657
3658
3659
3660 for {
3661 c := auxIntToInt32(v.AuxInt)
3662 if v_1.Op != OpARMFlagConstant {
3663 break
3664 }
3665 fc := auxIntToFlagConstant(v_1.AuxInt)
3666 if !(fc.uge()) {
3667 break
3668 }
3669 v.reset(OpARMMOVWconst)
3670 v.AuxInt = int32ToAuxInt(c)
3671 return true
3672 }
3673
3674
3675
3676 for {
3677 x := v_0
3678 if v_1.Op != OpARMFlagConstant {
3679 break
3680 }
3681 fc := auxIntToFlagConstant(v_1.AuxInt)
3682 if !(fc.ult()) {
3683 break
3684 }
3685 v.copyOf(x)
3686 return true
3687 }
3688
3689
3690 for {
3691 c := auxIntToInt32(v.AuxInt)
3692 x := v_0
3693 if v_1.Op != OpARMInvertFlags {
3694 break
3695 }
3696 flags := v_1.Args[0]
3697 v.reset(OpARMCMOVWLSconst)
3698 v.AuxInt = int32ToAuxInt(c)
3699 v.AddArg2(x, flags)
3700 return true
3701 }
3702 return false
3703 }
3704 func rewriteValueARM_OpARMCMOVWLSconst(v *Value) bool {
3705 v_1 := v.Args[1]
3706 v_0 := v.Args[0]
3707
3708
3709
3710 for {
3711 c := auxIntToInt32(v.AuxInt)
3712 if v_1.Op != OpARMFlagConstant {
3713 break
3714 }
3715 fc := auxIntToFlagConstant(v_1.AuxInt)
3716 if !(fc.ule()) {
3717 break
3718 }
3719 v.reset(OpARMMOVWconst)
3720 v.AuxInt = int32ToAuxInt(c)
3721 return true
3722 }
3723
3724
3725
3726 for {
3727 x := v_0
3728 if v_1.Op != OpARMFlagConstant {
3729 break
3730 }
3731 fc := auxIntToFlagConstant(v_1.AuxInt)
3732 if !(fc.ugt()) {
3733 break
3734 }
3735 v.copyOf(x)
3736 return true
3737 }
3738
3739
3740 for {
3741 c := auxIntToInt32(v.AuxInt)
3742 x := v_0
3743 if v_1.Op != OpARMInvertFlags {
3744 break
3745 }
3746 flags := v_1.Args[0]
3747 v.reset(OpARMCMOVWHSconst)
3748 v.AuxInt = int32ToAuxInt(c)
3749 v.AddArg2(x, flags)
3750 return true
3751 }
3752 return false
3753 }
3754 func rewriteValueARM_OpARMCMP(v *Value) bool {
3755 v_1 := v.Args[1]
3756 v_0 := v.Args[0]
3757 b := v.Block
3758
3759
3760 for {
3761 x := v_0
3762 if v_1.Op != OpARMMOVWconst {
3763 break
3764 }
3765 c := auxIntToInt32(v_1.AuxInt)
3766 v.reset(OpARMCMPconst)
3767 v.AuxInt = int32ToAuxInt(c)
3768 v.AddArg(x)
3769 return true
3770 }
3771
3772
3773 for {
3774 if v_0.Op != OpARMMOVWconst {
3775 break
3776 }
3777 c := auxIntToInt32(v_0.AuxInt)
3778 x := v_1
3779 v.reset(OpARMInvertFlags)
3780 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
3781 v0.AuxInt = int32ToAuxInt(c)
3782 v0.AddArg(x)
3783 v.AddArg(v0)
3784 return true
3785 }
3786
3787
3788
3789 for {
3790 x := v_0
3791 y := v_1
3792 if !(canonLessThan(x, y)) {
3793 break
3794 }
3795 v.reset(OpARMInvertFlags)
3796 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
3797 v0.AddArg2(y, x)
3798 v.AddArg(v0)
3799 return true
3800 }
3801
3802
3803 for {
3804 x := v_0
3805 if v_1.Op != OpARMSLLconst {
3806 break
3807 }
3808 c := auxIntToInt32(v_1.AuxInt)
3809 y := v_1.Args[0]
3810 v.reset(OpARMCMPshiftLL)
3811 v.AuxInt = int32ToAuxInt(c)
3812 v.AddArg2(x, y)
3813 return true
3814 }
3815
3816
3817 for {
3818 if v_0.Op != OpARMSLLconst {
3819 break
3820 }
3821 c := auxIntToInt32(v_0.AuxInt)
3822 y := v_0.Args[0]
3823 x := v_1
3824 v.reset(OpARMInvertFlags)
3825 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags)
3826 v0.AuxInt = int32ToAuxInt(c)
3827 v0.AddArg2(x, y)
3828 v.AddArg(v0)
3829 return true
3830 }
3831
3832
3833 for {
3834 x := v_0
3835 if v_1.Op != OpARMSRLconst {
3836 break
3837 }
3838 c := auxIntToInt32(v_1.AuxInt)
3839 y := v_1.Args[0]
3840 v.reset(OpARMCMPshiftRL)
3841 v.AuxInt = int32ToAuxInt(c)
3842 v.AddArg2(x, y)
3843 return true
3844 }
3845
3846
3847 for {
3848 if v_0.Op != OpARMSRLconst {
3849 break
3850 }
3851 c := auxIntToInt32(v_0.AuxInt)
3852 y := v_0.Args[0]
3853 x := v_1
3854 v.reset(OpARMInvertFlags)
3855 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags)
3856 v0.AuxInt = int32ToAuxInt(c)
3857 v0.AddArg2(x, y)
3858 v.AddArg(v0)
3859 return true
3860 }
3861
3862
3863 for {
3864 x := v_0
3865 if v_1.Op != OpARMSRAconst {
3866 break
3867 }
3868 c := auxIntToInt32(v_1.AuxInt)
3869 y := v_1.Args[0]
3870 v.reset(OpARMCMPshiftRA)
3871 v.AuxInt = int32ToAuxInt(c)
3872 v.AddArg2(x, y)
3873 return true
3874 }
3875
3876
3877 for {
3878 if v_0.Op != OpARMSRAconst {
3879 break
3880 }
3881 c := auxIntToInt32(v_0.AuxInt)
3882 y := v_0.Args[0]
3883 x := v_1
3884 v.reset(OpARMInvertFlags)
3885 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags)
3886 v0.AuxInt = int32ToAuxInt(c)
3887 v0.AddArg2(x, y)
3888 v.AddArg(v0)
3889 return true
3890 }
3891
3892
3893 for {
3894 x := v_0
3895 if v_1.Op != OpARMSLL {
3896 break
3897 }
3898 z := v_1.Args[1]
3899 y := v_1.Args[0]
3900 v.reset(OpARMCMPshiftLLreg)
3901 v.AddArg3(x, y, z)
3902 return true
3903 }
3904
3905
3906 for {
3907 if v_0.Op != OpARMSLL {
3908 break
3909 }
3910 z := v_0.Args[1]
3911 y := v_0.Args[0]
3912 x := v_1
3913 v.reset(OpARMInvertFlags)
3914 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
3915 v0.AddArg3(x, y, z)
3916 v.AddArg(v0)
3917 return true
3918 }
3919
3920
3921 for {
3922 x := v_0
3923 if v_1.Op != OpARMSRL {
3924 break
3925 }
3926 z := v_1.Args[1]
3927 y := v_1.Args[0]
3928 v.reset(OpARMCMPshiftRLreg)
3929 v.AddArg3(x, y, z)
3930 return true
3931 }
3932
3933
3934 for {
3935 if v_0.Op != OpARMSRL {
3936 break
3937 }
3938 z := v_0.Args[1]
3939 y := v_0.Args[0]
3940 x := v_1
3941 v.reset(OpARMInvertFlags)
3942 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
3943 v0.AddArg3(x, y, z)
3944 v.AddArg(v0)
3945 return true
3946 }
3947
3948
3949 for {
3950 x := v_0
3951 if v_1.Op != OpARMSRA {
3952 break
3953 }
3954 z := v_1.Args[1]
3955 y := v_1.Args[0]
3956 v.reset(OpARMCMPshiftRAreg)
3957 v.AddArg3(x, y, z)
3958 return true
3959 }
3960
3961
3962 for {
3963 if v_0.Op != OpARMSRA {
3964 break
3965 }
3966 z := v_0.Args[1]
3967 y := v_0.Args[0]
3968 x := v_1
3969 v.reset(OpARMInvertFlags)
3970 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
3971 v0.AddArg3(x, y, z)
3972 v.AddArg(v0)
3973 return true
3974 }
3975 return false
3976 }
3977 func rewriteValueARM_OpARMCMPD(v *Value) bool {
3978 v_1 := v.Args[1]
3979 v_0 := v.Args[0]
3980
3981
3982 for {
3983 x := v_0
3984 if v_1.Op != OpARMMOVDconst || auxIntToFloat64(v_1.AuxInt) != 0 {
3985 break
3986 }
3987 v.reset(OpARMCMPD0)
3988 v.AddArg(x)
3989 return true
3990 }
3991 return false
3992 }
3993 func rewriteValueARM_OpARMCMPF(v *Value) bool {
3994 v_1 := v.Args[1]
3995 v_0 := v.Args[0]
3996
3997
3998 for {
3999 x := v_0
4000 if v_1.Op != OpARMMOVFconst || auxIntToFloat64(v_1.AuxInt) != 0 {
4001 break
4002 }
4003 v.reset(OpARMCMPF0)
4004 v.AddArg(x)
4005 return true
4006 }
4007 return false
4008 }
4009 func rewriteValueARM_OpARMCMPconst(v *Value) bool {
4010 v_0 := v.Args[0]
4011
4012
4013 for {
4014 y := auxIntToInt32(v.AuxInt)
4015 if v_0.Op != OpARMMOVWconst {
4016 break
4017 }
4018 x := auxIntToInt32(v_0.AuxInt)
4019 v.reset(OpARMFlagConstant)
4020 v.AuxInt = flagConstantToAuxInt(subFlags32(x, y))
4021 return true
4022 }
4023
4024
4025
4026 for {
4027 c := auxIntToInt32(v.AuxInt)
4028 if v_0.Op != OpARMMOVBUreg || !(0xff < c) {
4029 break
4030 }
4031 v.reset(OpARMFlagConstant)
4032 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1))
4033 return true
4034 }
4035
4036
4037
4038 for {
4039 c := auxIntToInt32(v.AuxInt)
4040 if v_0.Op != OpARMMOVHUreg || !(0xffff < c) {
4041 break
4042 }
4043 v.reset(OpARMFlagConstant)
4044 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1))
4045 return true
4046 }
4047
4048
4049
4050 for {
4051 n := auxIntToInt32(v.AuxInt)
4052 if v_0.Op != OpARMANDconst {
4053 break
4054 }
4055 m := auxIntToInt32(v_0.AuxInt)
4056 if !(0 <= m && m < n) {
4057 break
4058 }
4059 v.reset(OpARMFlagConstant)
4060 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1))
4061 return true
4062 }
4063
4064
4065
4066 for {
4067 n := auxIntToInt32(v.AuxInt)
4068 if v_0.Op != OpARMSRLconst {
4069 break
4070 }
4071 c := auxIntToInt32(v_0.AuxInt)
4072 if !(0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n)) {
4073 break
4074 }
4075 v.reset(OpARMFlagConstant)
4076 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1))
4077 return true
4078 }
4079 return false
4080 }
4081 func rewriteValueARM_OpARMCMPshiftLL(v *Value) bool {
4082 v_1 := v.Args[1]
4083 v_0 := v.Args[0]
4084 b := v.Block
4085
4086
4087 for {
4088 d := auxIntToInt32(v.AuxInt)
4089 if v_0.Op != OpARMMOVWconst {
4090 break
4091 }
4092 c := auxIntToInt32(v_0.AuxInt)
4093 x := v_1
4094 v.reset(OpARMInvertFlags)
4095 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
4096 v0.AuxInt = int32ToAuxInt(c)
4097 v1 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
4098 v1.AuxInt = int32ToAuxInt(d)
4099 v1.AddArg(x)
4100 v0.AddArg(v1)
4101 v.AddArg(v0)
4102 return true
4103 }
4104
4105
4106 for {
4107 d := auxIntToInt32(v.AuxInt)
4108 x := v_0
4109 if v_1.Op != OpARMMOVWconst {
4110 break
4111 }
4112 c := auxIntToInt32(v_1.AuxInt)
4113 v.reset(OpARMCMPconst)
4114 v.AuxInt = int32ToAuxInt(c << uint64(d))
4115 v.AddArg(x)
4116 return true
4117 }
4118 return false
4119 }
4120 func rewriteValueARM_OpARMCMPshiftLLreg(v *Value) bool {
4121 v_2 := v.Args[2]
4122 v_1 := v.Args[1]
4123 v_0 := v.Args[0]
4124 b := v.Block
4125
4126
4127 for {
4128 if v_0.Op != OpARMMOVWconst {
4129 break
4130 }
4131 c := auxIntToInt32(v_0.AuxInt)
4132 x := v_1
4133 y := v_2
4134 v.reset(OpARMInvertFlags)
4135 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
4136 v0.AuxInt = int32ToAuxInt(c)
4137 v1 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
4138 v1.AddArg2(x, y)
4139 v0.AddArg(v1)
4140 v.AddArg(v0)
4141 return true
4142 }
4143
4144
4145
4146 for {
4147 x := v_0
4148 y := v_1
4149 if v_2.Op != OpARMMOVWconst {
4150 break
4151 }
4152 c := auxIntToInt32(v_2.AuxInt)
4153 if !(0 <= c && c < 32) {
4154 break
4155 }
4156 v.reset(OpARMCMPshiftLL)
4157 v.AuxInt = int32ToAuxInt(c)
4158 v.AddArg2(x, y)
4159 return true
4160 }
4161 return false
4162 }
4163 func rewriteValueARM_OpARMCMPshiftRA(v *Value) bool {
4164 v_1 := v.Args[1]
4165 v_0 := v.Args[0]
4166 b := v.Block
4167
4168
4169 for {
4170 d := auxIntToInt32(v.AuxInt)
4171 if v_0.Op != OpARMMOVWconst {
4172 break
4173 }
4174 c := auxIntToInt32(v_0.AuxInt)
4175 x := v_1
4176 v.reset(OpARMInvertFlags)
4177 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
4178 v0.AuxInt = int32ToAuxInt(c)
4179 v1 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
4180 v1.AuxInt = int32ToAuxInt(d)
4181 v1.AddArg(x)
4182 v0.AddArg(v1)
4183 v.AddArg(v0)
4184 return true
4185 }
4186
4187
4188 for {
4189 d := auxIntToInt32(v.AuxInt)
4190 x := v_0
4191 if v_1.Op != OpARMMOVWconst {
4192 break
4193 }
4194 c := auxIntToInt32(v_1.AuxInt)
4195 v.reset(OpARMCMPconst)
4196 v.AuxInt = int32ToAuxInt(c >> uint64(d))
4197 v.AddArg(x)
4198 return true
4199 }
4200 return false
4201 }
4202 func rewriteValueARM_OpARMCMPshiftRAreg(v *Value) bool {
4203 v_2 := v.Args[2]
4204 v_1 := v.Args[1]
4205 v_0 := v.Args[0]
4206 b := v.Block
4207
4208
4209 for {
4210 if v_0.Op != OpARMMOVWconst {
4211 break
4212 }
4213 c := auxIntToInt32(v_0.AuxInt)
4214 x := v_1
4215 y := v_2
4216 v.reset(OpARMInvertFlags)
4217 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
4218 v0.AuxInt = int32ToAuxInt(c)
4219 v1 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
4220 v1.AddArg2(x, y)
4221 v0.AddArg(v1)
4222 v.AddArg(v0)
4223 return true
4224 }
4225
4226
4227
4228 for {
4229 x := v_0
4230 y := v_1
4231 if v_2.Op != OpARMMOVWconst {
4232 break
4233 }
4234 c := auxIntToInt32(v_2.AuxInt)
4235 if !(0 <= c && c < 32) {
4236 break
4237 }
4238 v.reset(OpARMCMPshiftRA)
4239 v.AuxInt = int32ToAuxInt(c)
4240 v.AddArg2(x, y)
4241 return true
4242 }
4243 return false
4244 }
4245 func rewriteValueARM_OpARMCMPshiftRL(v *Value) bool {
4246 v_1 := v.Args[1]
4247 v_0 := v.Args[0]
4248 b := v.Block
4249
4250
4251 for {
4252 d := auxIntToInt32(v.AuxInt)
4253 if v_0.Op != OpARMMOVWconst {
4254 break
4255 }
4256 c := auxIntToInt32(v_0.AuxInt)
4257 x := v_1
4258 v.reset(OpARMInvertFlags)
4259 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
4260 v0.AuxInt = int32ToAuxInt(c)
4261 v1 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
4262 v1.AuxInt = int32ToAuxInt(d)
4263 v1.AddArg(x)
4264 v0.AddArg(v1)
4265 v.AddArg(v0)
4266 return true
4267 }
4268
4269
4270 for {
4271 d := auxIntToInt32(v.AuxInt)
4272 x := v_0
4273 if v_1.Op != OpARMMOVWconst {
4274 break
4275 }
4276 c := auxIntToInt32(v_1.AuxInt)
4277 v.reset(OpARMCMPconst)
4278 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
4279 v.AddArg(x)
4280 return true
4281 }
4282 return false
4283 }
4284 func rewriteValueARM_OpARMCMPshiftRLreg(v *Value) bool {
4285 v_2 := v.Args[2]
4286 v_1 := v.Args[1]
4287 v_0 := v.Args[0]
4288 b := v.Block
4289
4290
4291 for {
4292 if v_0.Op != OpARMMOVWconst {
4293 break
4294 }
4295 c := auxIntToInt32(v_0.AuxInt)
4296 x := v_1
4297 y := v_2
4298 v.reset(OpARMInvertFlags)
4299 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
4300 v0.AuxInt = int32ToAuxInt(c)
4301 v1 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
4302 v1.AddArg2(x, y)
4303 v0.AddArg(v1)
4304 v.AddArg(v0)
4305 return true
4306 }
4307
4308
4309
4310 for {
4311 x := v_0
4312 y := v_1
4313 if v_2.Op != OpARMMOVWconst {
4314 break
4315 }
4316 c := auxIntToInt32(v_2.AuxInt)
4317 if !(0 <= c && c < 32) {
4318 break
4319 }
4320 v.reset(OpARMCMPshiftRL)
4321 v.AuxInt = int32ToAuxInt(c)
4322 v.AddArg2(x, y)
4323 return true
4324 }
4325 return false
4326 }
4327 func rewriteValueARM_OpARMEqual(v *Value) bool {
4328 v_0 := v.Args[0]
4329
4330
4331 for {
4332 if v_0.Op != OpARMFlagConstant {
4333 break
4334 }
4335 fc := auxIntToFlagConstant(v_0.AuxInt)
4336 v.reset(OpARMMOVWconst)
4337 v.AuxInt = int32ToAuxInt(b2i32(fc.eq()))
4338 return true
4339 }
4340
4341
4342 for {
4343 if v_0.Op != OpARMInvertFlags {
4344 break
4345 }
4346 x := v_0.Args[0]
4347 v.reset(OpARMEqual)
4348 v.AddArg(x)
4349 return true
4350 }
4351 return false
4352 }
4353 func rewriteValueARM_OpARMGreaterEqual(v *Value) bool {
4354 v_0 := v.Args[0]
4355
4356
4357 for {
4358 if v_0.Op != OpARMFlagConstant {
4359 break
4360 }
4361 fc := auxIntToFlagConstant(v_0.AuxInt)
4362 v.reset(OpARMMOVWconst)
4363 v.AuxInt = int32ToAuxInt(b2i32(fc.ge()))
4364 return true
4365 }
4366
4367
4368 for {
4369 if v_0.Op != OpARMInvertFlags {
4370 break
4371 }
4372 x := v_0.Args[0]
4373 v.reset(OpARMLessEqual)
4374 v.AddArg(x)
4375 return true
4376 }
4377 return false
4378 }
4379 func rewriteValueARM_OpARMGreaterEqualU(v *Value) bool {
4380 v_0 := v.Args[0]
4381
4382
4383 for {
4384 if v_0.Op != OpARMFlagConstant {
4385 break
4386 }
4387 fc := auxIntToFlagConstant(v_0.AuxInt)
4388 v.reset(OpARMMOVWconst)
4389 v.AuxInt = int32ToAuxInt(b2i32(fc.uge()))
4390 return true
4391 }
4392
4393
4394 for {
4395 if v_0.Op != OpARMInvertFlags {
4396 break
4397 }
4398 x := v_0.Args[0]
4399 v.reset(OpARMLessEqualU)
4400 v.AddArg(x)
4401 return true
4402 }
4403 return false
4404 }
4405 func rewriteValueARM_OpARMGreaterThan(v *Value) bool {
4406 v_0 := v.Args[0]
4407
4408
4409 for {
4410 if v_0.Op != OpARMFlagConstant {
4411 break
4412 }
4413 fc := auxIntToFlagConstant(v_0.AuxInt)
4414 v.reset(OpARMMOVWconst)
4415 v.AuxInt = int32ToAuxInt(b2i32(fc.gt()))
4416 return true
4417 }
4418
4419
4420 for {
4421 if v_0.Op != OpARMInvertFlags {
4422 break
4423 }
4424 x := v_0.Args[0]
4425 v.reset(OpARMLessThan)
4426 v.AddArg(x)
4427 return true
4428 }
4429 return false
4430 }
4431 func rewriteValueARM_OpARMGreaterThanU(v *Value) bool {
4432 v_0 := v.Args[0]
4433
4434
4435 for {
4436 if v_0.Op != OpARMFlagConstant {
4437 break
4438 }
4439 fc := auxIntToFlagConstant(v_0.AuxInt)
4440 v.reset(OpARMMOVWconst)
4441 v.AuxInt = int32ToAuxInt(b2i32(fc.ugt()))
4442 return true
4443 }
4444
4445
4446 for {
4447 if v_0.Op != OpARMInvertFlags {
4448 break
4449 }
4450 x := v_0.Args[0]
4451 v.reset(OpARMLessThanU)
4452 v.AddArg(x)
4453 return true
4454 }
4455 return false
4456 }
4457 func rewriteValueARM_OpARMLessEqual(v *Value) bool {
4458 v_0 := v.Args[0]
4459
4460
4461 for {
4462 if v_0.Op != OpARMFlagConstant {
4463 break
4464 }
4465 fc := auxIntToFlagConstant(v_0.AuxInt)
4466 v.reset(OpARMMOVWconst)
4467 v.AuxInt = int32ToAuxInt(b2i32(fc.le()))
4468 return true
4469 }
4470
4471
4472 for {
4473 if v_0.Op != OpARMInvertFlags {
4474 break
4475 }
4476 x := v_0.Args[0]
4477 v.reset(OpARMGreaterEqual)
4478 v.AddArg(x)
4479 return true
4480 }
4481 return false
4482 }
4483 func rewriteValueARM_OpARMLessEqualU(v *Value) bool {
4484 v_0 := v.Args[0]
4485
4486
4487 for {
4488 if v_0.Op != OpARMFlagConstant {
4489 break
4490 }
4491 fc := auxIntToFlagConstant(v_0.AuxInt)
4492 v.reset(OpARMMOVWconst)
4493 v.AuxInt = int32ToAuxInt(b2i32(fc.ule()))
4494 return true
4495 }
4496
4497
4498 for {
4499 if v_0.Op != OpARMInvertFlags {
4500 break
4501 }
4502 x := v_0.Args[0]
4503 v.reset(OpARMGreaterEqualU)
4504 v.AddArg(x)
4505 return true
4506 }
4507 return false
4508 }
4509 func rewriteValueARM_OpARMLessThan(v *Value) bool {
4510 v_0 := v.Args[0]
4511
4512
4513 for {
4514 if v_0.Op != OpARMFlagConstant {
4515 break
4516 }
4517 fc := auxIntToFlagConstant(v_0.AuxInt)
4518 v.reset(OpARMMOVWconst)
4519 v.AuxInt = int32ToAuxInt(b2i32(fc.lt()))
4520 return true
4521 }
4522
4523
4524 for {
4525 if v_0.Op != OpARMInvertFlags {
4526 break
4527 }
4528 x := v_0.Args[0]
4529 v.reset(OpARMGreaterThan)
4530 v.AddArg(x)
4531 return true
4532 }
4533 return false
4534 }
4535 func rewriteValueARM_OpARMLessThanU(v *Value) bool {
4536 v_0 := v.Args[0]
4537
4538
4539 for {
4540 if v_0.Op != OpARMFlagConstant {
4541 break
4542 }
4543 fc := auxIntToFlagConstant(v_0.AuxInt)
4544 v.reset(OpARMMOVWconst)
4545 v.AuxInt = int32ToAuxInt(b2i32(fc.ult()))
4546 return true
4547 }
4548
4549
4550 for {
4551 if v_0.Op != OpARMInvertFlags {
4552 break
4553 }
4554 x := v_0.Args[0]
4555 v.reset(OpARMGreaterThanU)
4556 v.AddArg(x)
4557 return true
4558 }
4559 return false
4560 }
4561 func rewriteValueARM_OpARMLoweredPanicBoundsRC(v *Value) bool {
4562 v_1 := v.Args[1]
4563 v_0 := v.Args[0]
4564
4565
4566 for {
4567 kind := auxIntToInt64(v.AuxInt)
4568 p := auxToPanicBoundsC(v.Aux)
4569 if v_0.Op != OpARMMOVWconst {
4570 break
4571 }
4572 c := auxIntToInt32(v_0.AuxInt)
4573 mem := v_1
4574 v.reset(OpARMLoweredPanicBoundsCC)
4575 v.AuxInt = int64ToAuxInt(kind)
4576 v.Aux = panicBoundsCCToAux(PanicBoundsCC{Cx: int64(c), Cy: p.C})
4577 v.AddArg(mem)
4578 return true
4579 }
4580 return false
4581 }
4582 func rewriteValueARM_OpARMLoweredPanicBoundsRR(v *Value) bool {
4583 v_2 := v.Args[2]
4584 v_1 := v.Args[1]
4585 v_0 := v.Args[0]
4586
4587
4588 for {
4589 kind := auxIntToInt64(v.AuxInt)
4590 x := v_0
4591 if v_1.Op != OpARMMOVWconst {
4592 break
4593 }
4594 c := auxIntToInt32(v_1.AuxInt)
4595 mem := v_2
4596 v.reset(OpARMLoweredPanicBoundsRC)
4597 v.AuxInt = int64ToAuxInt(kind)
4598 v.Aux = panicBoundsCToAux(PanicBoundsC{C: int64(c)})
4599 v.AddArg2(x, mem)
4600 return true
4601 }
4602
4603
4604 for {
4605 kind := auxIntToInt64(v.AuxInt)
4606 if v_0.Op != OpARMMOVWconst {
4607 break
4608 }
4609 c := auxIntToInt32(v_0.AuxInt)
4610 y := v_1
4611 mem := v_2
4612 v.reset(OpARMLoweredPanicBoundsCR)
4613 v.AuxInt = int64ToAuxInt(kind)
4614 v.Aux = panicBoundsCToAux(PanicBoundsC{C: int64(c)})
4615 v.AddArg2(y, mem)
4616 return true
4617 }
4618 return false
4619 }
4620 func rewriteValueARM_OpARMLoweredPanicExtendRC(v *Value) bool {
4621 v_2 := v.Args[2]
4622 v_1 := v.Args[1]
4623 v_0 := v.Args[0]
4624
4625
4626 for {
4627 kind := auxIntToInt64(v.AuxInt)
4628 p := auxToPanicBoundsC(v.Aux)
4629 if v_0.Op != OpARMMOVWconst {
4630 break
4631 }
4632 hi := auxIntToInt32(v_0.AuxInt)
4633 if v_1.Op != OpARMMOVWconst {
4634 break
4635 }
4636 lo := auxIntToInt32(v_1.AuxInt)
4637 mem := v_2
4638 v.reset(OpARMLoweredPanicBoundsCC)
4639 v.AuxInt = int64ToAuxInt(kind)
4640 v.Aux = panicBoundsCCToAux(PanicBoundsCC{Cx: int64(hi)<<32 + int64(uint32(lo)), Cy: p.C})
4641 v.AddArg(mem)
4642 return true
4643 }
4644 return false
4645 }
4646 func rewriteValueARM_OpARMLoweredPanicExtendRR(v *Value) bool {
4647 v_3 := v.Args[3]
4648 v_2 := v.Args[2]
4649 v_1 := v.Args[1]
4650 v_0 := v.Args[0]
4651
4652
4653 for {
4654 kind := auxIntToInt64(v.AuxInt)
4655 hi := v_0
4656 lo := v_1
4657 if v_2.Op != OpARMMOVWconst {
4658 break
4659 }
4660 c := auxIntToInt32(v_2.AuxInt)
4661 mem := v_3
4662 v.reset(OpARMLoweredPanicExtendRC)
4663 v.AuxInt = int64ToAuxInt(kind)
4664 v.Aux = panicBoundsCToAux(PanicBoundsC{C: int64(c)})
4665 v.AddArg3(hi, lo, mem)
4666 return true
4667 }
4668
4669
4670 for {
4671 kind := auxIntToInt64(v.AuxInt)
4672 if v_0.Op != OpARMMOVWconst {
4673 break
4674 }
4675 hi := auxIntToInt32(v_0.AuxInt)
4676 if v_1.Op != OpARMMOVWconst {
4677 break
4678 }
4679 lo := auxIntToInt32(v_1.AuxInt)
4680 y := v_2
4681 mem := v_3
4682 v.reset(OpARMLoweredPanicBoundsCR)
4683 v.AuxInt = int64ToAuxInt(kind)
4684 v.Aux = panicBoundsCToAux(PanicBoundsC{C: int64(hi)<<32 + int64(uint32(lo))})
4685 v.AddArg2(y, mem)
4686 return true
4687 }
4688 return false
4689 }
4690 func rewriteValueARM_OpARMMOVBUload(v *Value) bool {
4691 v_1 := v.Args[1]
4692 v_0 := v.Args[0]
4693
4694
4695 for {
4696 off1 := auxIntToInt32(v.AuxInt)
4697 sym := auxToSym(v.Aux)
4698 if v_0.Op != OpARMADDconst {
4699 break
4700 }
4701 off2 := auxIntToInt32(v_0.AuxInt)
4702 ptr := v_0.Args[0]
4703 mem := v_1
4704 v.reset(OpARMMOVBUload)
4705 v.AuxInt = int32ToAuxInt(off1 + off2)
4706 v.Aux = symToAux(sym)
4707 v.AddArg2(ptr, mem)
4708 return true
4709 }
4710
4711
4712 for {
4713 off1 := auxIntToInt32(v.AuxInt)
4714 sym := auxToSym(v.Aux)
4715 if v_0.Op != OpARMSUBconst {
4716 break
4717 }
4718 off2 := auxIntToInt32(v_0.AuxInt)
4719 ptr := v_0.Args[0]
4720 mem := v_1
4721 v.reset(OpARMMOVBUload)
4722 v.AuxInt = int32ToAuxInt(off1 - off2)
4723 v.Aux = symToAux(sym)
4724 v.AddArg2(ptr, mem)
4725 return true
4726 }
4727
4728
4729
4730 for {
4731 off1 := auxIntToInt32(v.AuxInt)
4732 sym1 := auxToSym(v.Aux)
4733 if v_0.Op != OpARMMOVWaddr {
4734 break
4735 }
4736 off2 := auxIntToInt32(v_0.AuxInt)
4737 sym2 := auxToSym(v_0.Aux)
4738 ptr := v_0.Args[0]
4739 mem := v_1
4740 if !(canMergeSym(sym1, sym2)) {
4741 break
4742 }
4743 v.reset(OpARMMOVBUload)
4744 v.AuxInt = int32ToAuxInt(off1 + off2)
4745 v.Aux = symToAux(mergeSym(sym1, sym2))
4746 v.AddArg2(ptr, mem)
4747 return true
4748 }
4749
4750
4751
4752 for {
4753 off := auxIntToInt32(v.AuxInt)
4754 sym := auxToSym(v.Aux)
4755 ptr := v_0
4756 if v_1.Op != OpARMMOVBstore {
4757 break
4758 }
4759 off2 := auxIntToInt32(v_1.AuxInt)
4760 sym2 := auxToSym(v_1.Aux)
4761 x := v_1.Args[1]
4762 ptr2 := v_1.Args[0]
4763 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
4764 break
4765 }
4766 v.reset(OpARMMOVBUreg)
4767 v.AddArg(x)
4768 return true
4769 }
4770
4771
4772
4773 for {
4774 if auxIntToInt32(v.AuxInt) != 0 {
4775 break
4776 }
4777 sym := auxToSym(v.Aux)
4778 if v_0.Op != OpARMADD {
4779 break
4780 }
4781 idx := v_0.Args[1]
4782 ptr := v_0.Args[0]
4783 mem := v_1
4784 if !(sym == nil) {
4785 break
4786 }
4787 v.reset(OpARMMOVBUloadidx)
4788 v.AddArg3(ptr, idx, mem)
4789 return true
4790 }
4791
4792
4793
4794 for {
4795 off := auxIntToInt32(v.AuxInt)
4796 sym := auxToSym(v.Aux)
4797 if v_0.Op != OpSB || !(symIsRO(sym)) {
4798 break
4799 }
4800 v.reset(OpARMMOVWconst)
4801 v.AuxInt = int32ToAuxInt(int32(read8(sym, int64(off))))
4802 return true
4803 }
4804 return false
4805 }
4806 func rewriteValueARM_OpARMMOVBUloadidx(v *Value) bool {
4807 v_2 := v.Args[2]
4808 v_1 := v.Args[1]
4809 v_0 := v.Args[0]
4810
4811
4812
4813 for {
4814 ptr := v_0
4815 idx := v_1
4816 if v_2.Op != OpARMMOVBstoreidx {
4817 break
4818 }
4819 x := v_2.Args[2]
4820 ptr2 := v_2.Args[0]
4821 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) {
4822 break
4823 }
4824 v.reset(OpARMMOVBUreg)
4825 v.AddArg(x)
4826 return true
4827 }
4828
4829
4830 for {
4831 ptr := v_0
4832 if v_1.Op != OpARMMOVWconst {
4833 break
4834 }
4835 c := auxIntToInt32(v_1.AuxInt)
4836 mem := v_2
4837 v.reset(OpARMMOVBUload)
4838 v.AuxInt = int32ToAuxInt(c)
4839 v.AddArg2(ptr, mem)
4840 return true
4841 }
4842
4843
4844 for {
4845 if v_0.Op != OpARMMOVWconst {
4846 break
4847 }
4848 c := auxIntToInt32(v_0.AuxInt)
4849 ptr := v_1
4850 mem := v_2
4851 v.reset(OpARMMOVBUload)
4852 v.AuxInt = int32ToAuxInt(c)
4853 v.AddArg2(ptr, mem)
4854 return true
4855 }
4856 return false
4857 }
4858 func rewriteValueARM_OpARMMOVBUreg(v *Value) bool {
4859 v_0 := v.Args[0]
4860
4861
4862 for {
4863 x := v_0
4864 if x.Op != OpARMMOVBUload {
4865 break
4866 }
4867 v.reset(OpARMMOVWreg)
4868 v.AddArg(x)
4869 return true
4870 }
4871
4872
4873 for {
4874 if v_0.Op != OpARMANDconst {
4875 break
4876 }
4877 c := auxIntToInt32(v_0.AuxInt)
4878 x := v_0.Args[0]
4879 v.reset(OpARMANDconst)
4880 v.AuxInt = int32ToAuxInt(c & 0xff)
4881 v.AddArg(x)
4882 return true
4883 }
4884
4885
4886 for {
4887 x := v_0
4888 if x.Op != OpARMMOVBUreg {
4889 break
4890 }
4891 v.reset(OpARMMOVWreg)
4892 v.AddArg(x)
4893 return true
4894 }
4895
4896
4897 for {
4898 if v_0.Op != OpARMMOVWconst {
4899 break
4900 }
4901 c := auxIntToInt32(v_0.AuxInt)
4902 v.reset(OpARMMOVWconst)
4903 v.AuxInt = int32ToAuxInt(int32(uint8(c)))
4904 return true
4905 }
4906 return false
4907 }
4908 func rewriteValueARM_OpARMMOVBload(v *Value) bool {
4909 v_1 := v.Args[1]
4910 v_0 := v.Args[0]
4911
4912
4913 for {
4914 off1 := auxIntToInt32(v.AuxInt)
4915 sym := auxToSym(v.Aux)
4916 if v_0.Op != OpARMADDconst {
4917 break
4918 }
4919 off2 := auxIntToInt32(v_0.AuxInt)
4920 ptr := v_0.Args[0]
4921 mem := v_1
4922 v.reset(OpARMMOVBload)
4923 v.AuxInt = int32ToAuxInt(off1 + off2)
4924 v.Aux = symToAux(sym)
4925 v.AddArg2(ptr, mem)
4926 return true
4927 }
4928
4929
4930 for {
4931 off1 := auxIntToInt32(v.AuxInt)
4932 sym := auxToSym(v.Aux)
4933 if v_0.Op != OpARMSUBconst {
4934 break
4935 }
4936 off2 := auxIntToInt32(v_0.AuxInt)
4937 ptr := v_0.Args[0]
4938 mem := v_1
4939 v.reset(OpARMMOVBload)
4940 v.AuxInt = int32ToAuxInt(off1 - off2)
4941 v.Aux = symToAux(sym)
4942 v.AddArg2(ptr, mem)
4943 return true
4944 }
4945
4946
4947
4948 for {
4949 off1 := auxIntToInt32(v.AuxInt)
4950 sym1 := auxToSym(v.Aux)
4951 if v_0.Op != OpARMMOVWaddr {
4952 break
4953 }
4954 off2 := auxIntToInt32(v_0.AuxInt)
4955 sym2 := auxToSym(v_0.Aux)
4956 ptr := v_0.Args[0]
4957 mem := v_1
4958 if !(canMergeSym(sym1, sym2)) {
4959 break
4960 }
4961 v.reset(OpARMMOVBload)
4962 v.AuxInt = int32ToAuxInt(off1 + off2)
4963 v.Aux = symToAux(mergeSym(sym1, sym2))
4964 v.AddArg2(ptr, mem)
4965 return true
4966 }
4967
4968
4969
4970 for {
4971 off := auxIntToInt32(v.AuxInt)
4972 sym := auxToSym(v.Aux)
4973 ptr := v_0
4974 if v_1.Op != OpARMMOVBstore {
4975 break
4976 }
4977 off2 := auxIntToInt32(v_1.AuxInt)
4978 sym2 := auxToSym(v_1.Aux)
4979 x := v_1.Args[1]
4980 ptr2 := v_1.Args[0]
4981 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
4982 break
4983 }
4984 v.reset(OpARMMOVBreg)
4985 v.AddArg(x)
4986 return true
4987 }
4988
4989
4990
4991 for {
4992 if auxIntToInt32(v.AuxInt) != 0 {
4993 break
4994 }
4995 sym := auxToSym(v.Aux)
4996 if v_0.Op != OpARMADD {
4997 break
4998 }
4999 idx := v_0.Args[1]
5000 ptr := v_0.Args[0]
5001 mem := v_1
5002 if !(sym == nil) {
5003 break
5004 }
5005 v.reset(OpARMMOVBloadidx)
5006 v.AddArg3(ptr, idx, mem)
5007 return true
5008 }
5009
5010
5011
5012 for {
5013 off := auxIntToInt32(v.AuxInt)
5014 sym := auxToSym(v.Aux)
5015 if v_0.Op != OpSB || !(symIsRO(sym)) {
5016 break
5017 }
5018 v.reset(OpARMMOVWconst)
5019 v.AuxInt = int32ToAuxInt(int32(int8(read8(sym, int64(off)))))
5020 return true
5021 }
5022 return false
5023 }
5024 func rewriteValueARM_OpARMMOVBloadidx(v *Value) bool {
5025 v_2 := v.Args[2]
5026 v_1 := v.Args[1]
5027 v_0 := v.Args[0]
5028
5029
5030
5031 for {
5032 ptr := v_0
5033 idx := v_1
5034 if v_2.Op != OpARMMOVBstoreidx {
5035 break
5036 }
5037 x := v_2.Args[2]
5038 ptr2 := v_2.Args[0]
5039 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) {
5040 break
5041 }
5042 v.reset(OpARMMOVBreg)
5043 v.AddArg(x)
5044 return true
5045 }
5046
5047
5048 for {
5049 ptr := v_0
5050 if v_1.Op != OpARMMOVWconst {
5051 break
5052 }
5053 c := auxIntToInt32(v_1.AuxInt)
5054 mem := v_2
5055 v.reset(OpARMMOVBload)
5056 v.AuxInt = int32ToAuxInt(c)
5057 v.AddArg2(ptr, mem)
5058 return true
5059 }
5060
5061
5062 for {
5063 if v_0.Op != OpARMMOVWconst {
5064 break
5065 }
5066 c := auxIntToInt32(v_0.AuxInt)
5067 ptr := v_1
5068 mem := v_2
5069 v.reset(OpARMMOVBload)
5070 v.AuxInt = int32ToAuxInt(c)
5071 v.AddArg2(ptr, mem)
5072 return true
5073 }
5074 return false
5075 }
5076 func rewriteValueARM_OpARMMOVBreg(v *Value) bool {
5077 v_0 := v.Args[0]
5078
5079
5080 for {
5081 x := v_0
5082 if x.Op != OpARMMOVBload {
5083 break
5084 }
5085 v.reset(OpARMMOVWreg)
5086 v.AddArg(x)
5087 return true
5088 }
5089
5090
5091
5092 for {
5093 if v_0.Op != OpARMANDconst {
5094 break
5095 }
5096 c := auxIntToInt32(v_0.AuxInt)
5097 x := v_0.Args[0]
5098 if !(c&0x80 == 0) {
5099 break
5100 }
5101 v.reset(OpARMANDconst)
5102 v.AuxInt = int32ToAuxInt(c & 0x7f)
5103 v.AddArg(x)
5104 return true
5105 }
5106
5107
5108 for {
5109 x := v_0
5110 if x.Op != OpARMMOVBreg {
5111 break
5112 }
5113 v.reset(OpARMMOVWreg)
5114 v.AddArg(x)
5115 return true
5116 }
5117
5118
5119 for {
5120 if v_0.Op != OpARMMOVWconst {
5121 break
5122 }
5123 c := auxIntToInt32(v_0.AuxInt)
5124 v.reset(OpARMMOVWconst)
5125 v.AuxInt = int32ToAuxInt(int32(int8(c)))
5126 return true
5127 }
5128 return false
5129 }
5130 func rewriteValueARM_OpARMMOVBstore(v *Value) bool {
5131 v_2 := v.Args[2]
5132 v_1 := v.Args[1]
5133 v_0 := v.Args[0]
5134
5135
5136 for {
5137 off1 := auxIntToInt32(v.AuxInt)
5138 sym := auxToSym(v.Aux)
5139 if v_0.Op != OpARMADDconst {
5140 break
5141 }
5142 off2 := auxIntToInt32(v_0.AuxInt)
5143 ptr := v_0.Args[0]
5144 val := v_1
5145 mem := v_2
5146 v.reset(OpARMMOVBstore)
5147 v.AuxInt = int32ToAuxInt(off1 + off2)
5148 v.Aux = symToAux(sym)
5149 v.AddArg3(ptr, val, mem)
5150 return true
5151 }
5152
5153
5154 for {
5155 off1 := auxIntToInt32(v.AuxInt)
5156 sym := auxToSym(v.Aux)
5157 if v_0.Op != OpARMSUBconst {
5158 break
5159 }
5160 off2 := auxIntToInt32(v_0.AuxInt)
5161 ptr := v_0.Args[0]
5162 val := v_1
5163 mem := v_2
5164 v.reset(OpARMMOVBstore)
5165 v.AuxInt = int32ToAuxInt(off1 - off2)
5166 v.Aux = symToAux(sym)
5167 v.AddArg3(ptr, val, mem)
5168 return true
5169 }
5170
5171
5172
5173 for {
5174 off1 := auxIntToInt32(v.AuxInt)
5175 sym1 := auxToSym(v.Aux)
5176 if v_0.Op != OpARMMOVWaddr {
5177 break
5178 }
5179 off2 := auxIntToInt32(v_0.AuxInt)
5180 sym2 := auxToSym(v_0.Aux)
5181 ptr := v_0.Args[0]
5182 val := v_1
5183 mem := v_2
5184 if !(canMergeSym(sym1, sym2)) {
5185 break
5186 }
5187 v.reset(OpARMMOVBstore)
5188 v.AuxInt = int32ToAuxInt(off1 + off2)
5189 v.Aux = symToAux(mergeSym(sym1, sym2))
5190 v.AddArg3(ptr, val, mem)
5191 return true
5192 }
5193
5194
5195 for {
5196 off := auxIntToInt32(v.AuxInt)
5197 sym := auxToSym(v.Aux)
5198 ptr := v_0
5199 if v_1.Op != OpARMMOVBreg {
5200 break
5201 }
5202 x := v_1.Args[0]
5203 mem := v_2
5204 v.reset(OpARMMOVBstore)
5205 v.AuxInt = int32ToAuxInt(off)
5206 v.Aux = symToAux(sym)
5207 v.AddArg3(ptr, x, mem)
5208 return true
5209 }
5210
5211
5212 for {
5213 off := auxIntToInt32(v.AuxInt)
5214 sym := auxToSym(v.Aux)
5215 ptr := v_0
5216 if v_1.Op != OpARMMOVBUreg {
5217 break
5218 }
5219 x := v_1.Args[0]
5220 mem := v_2
5221 v.reset(OpARMMOVBstore)
5222 v.AuxInt = int32ToAuxInt(off)
5223 v.Aux = symToAux(sym)
5224 v.AddArg3(ptr, x, mem)
5225 return true
5226 }
5227
5228
5229 for {
5230 off := auxIntToInt32(v.AuxInt)
5231 sym := auxToSym(v.Aux)
5232 ptr := v_0
5233 if v_1.Op != OpARMMOVHreg {
5234 break
5235 }
5236 x := v_1.Args[0]
5237 mem := v_2
5238 v.reset(OpARMMOVBstore)
5239 v.AuxInt = int32ToAuxInt(off)
5240 v.Aux = symToAux(sym)
5241 v.AddArg3(ptr, x, mem)
5242 return true
5243 }
5244
5245
5246 for {
5247 off := auxIntToInt32(v.AuxInt)
5248 sym := auxToSym(v.Aux)
5249 ptr := v_0
5250 if v_1.Op != OpARMMOVHUreg {
5251 break
5252 }
5253 x := v_1.Args[0]
5254 mem := v_2
5255 v.reset(OpARMMOVBstore)
5256 v.AuxInt = int32ToAuxInt(off)
5257 v.Aux = symToAux(sym)
5258 v.AddArg3(ptr, x, mem)
5259 return true
5260 }
5261
5262
5263
5264 for {
5265 if auxIntToInt32(v.AuxInt) != 0 {
5266 break
5267 }
5268 sym := auxToSym(v.Aux)
5269 if v_0.Op != OpARMADD {
5270 break
5271 }
5272 idx := v_0.Args[1]
5273 ptr := v_0.Args[0]
5274 val := v_1
5275 mem := v_2
5276 if !(sym == nil) {
5277 break
5278 }
5279 v.reset(OpARMMOVBstoreidx)
5280 v.AddArg4(ptr, idx, val, mem)
5281 return true
5282 }
5283 return false
5284 }
5285 func rewriteValueARM_OpARMMOVBstoreidx(v *Value) bool {
5286 v_3 := v.Args[3]
5287 v_2 := v.Args[2]
5288 v_1 := v.Args[1]
5289 v_0 := v.Args[0]
5290
5291
5292 for {
5293 ptr := v_0
5294 if v_1.Op != OpARMMOVWconst {
5295 break
5296 }
5297 c := auxIntToInt32(v_1.AuxInt)
5298 val := v_2
5299 mem := v_3
5300 v.reset(OpARMMOVBstore)
5301 v.AuxInt = int32ToAuxInt(c)
5302 v.AddArg3(ptr, val, mem)
5303 return true
5304 }
5305
5306
5307 for {
5308 if v_0.Op != OpARMMOVWconst {
5309 break
5310 }
5311 c := auxIntToInt32(v_0.AuxInt)
5312 ptr := v_1
5313 val := v_2
5314 mem := v_3
5315 v.reset(OpARMMOVBstore)
5316 v.AuxInt = int32ToAuxInt(c)
5317 v.AddArg3(ptr, val, mem)
5318 return true
5319 }
5320 return false
5321 }
5322 func rewriteValueARM_OpARMMOVDload(v *Value) bool {
5323 v_1 := v.Args[1]
5324 v_0 := v.Args[0]
5325
5326
5327 for {
5328 off1 := auxIntToInt32(v.AuxInt)
5329 sym := auxToSym(v.Aux)
5330 if v_0.Op != OpARMADDconst {
5331 break
5332 }
5333 off2 := auxIntToInt32(v_0.AuxInt)
5334 ptr := v_0.Args[0]
5335 mem := v_1
5336 v.reset(OpARMMOVDload)
5337 v.AuxInt = int32ToAuxInt(off1 + off2)
5338 v.Aux = symToAux(sym)
5339 v.AddArg2(ptr, mem)
5340 return true
5341 }
5342
5343
5344 for {
5345 off1 := auxIntToInt32(v.AuxInt)
5346 sym := auxToSym(v.Aux)
5347 if v_0.Op != OpARMSUBconst {
5348 break
5349 }
5350 off2 := auxIntToInt32(v_0.AuxInt)
5351 ptr := v_0.Args[0]
5352 mem := v_1
5353 v.reset(OpARMMOVDload)
5354 v.AuxInt = int32ToAuxInt(off1 - off2)
5355 v.Aux = symToAux(sym)
5356 v.AddArg2(ptr, mem)
5357 return true
5358 }
5359
5360
5361
5362 for {
5363 off1 := auxIntToInt32(v.AuxInt)
5364 sym1 := auxToSym(v.Aux)
5365 if v_0.Op != OpARMMOVWaddr {
5366 break
5367 }
5368 off2 := auxIntToInt32(v_0.AuxInt)
5369 sym2 := auxToSym(v_0.Aux)
5370 ptr := v_0.Args[0]
5371 mem := v_1
5372 if !(canMergeSym(sym1, sym2)) {
5373 break
5374 }
5375 v.reset(OpARMMOVDload)
5376 v.AuxInt = int32ToAuxInt(off1 + off2)
5377 v.Aux = symToAux(mergeSym(sym1, sym2))
5378 v.AddArg2(ptr, mem)
5379 return true
5380 }
5381
5382
5383
5384 for {
5385 off := auxIntToInt32(v.AuxInt)
5386 sym := auxToSym(v.Aux)
5387 ptr := v_0
5388 if v_1.Op != OpARMMOVDstore {
5389 break
5390 }
5391 off2 := auxIntToInt32(v_1.AuxInt)
5392 sym2 := auxToSym(v_1.Aux)
5393 x := v_1.Args[1]
5394 ptr2 := v_1.Args[0]
5395 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
5396 break
5397 }
5398 v.copyOf(x)
5399 return true
5400 }
5401 return false
5402 }
5403 func rewriteValueARM_OpARMMOVDstore(v *Value) bool {
5404 v_2 := v.Args[2]
5405 v_1 := v.Args[1]
5406 v_0 := v.Args[0]
5407
5408
5409 for {
5410 off1 := auxIntToInt32(v.AuxInt)
5411 sym := auxToSym(v.Aux)
5412 if v_0.Op != OpARMADDconst {
5413 break
5414 }
5415 off2 := auxIntToInt32(v_0.AuxInt)
5416 ptr := v_0.Args[0]
5417 val := v_1
5418 mem := v_2
5419 v.reset(OpARMMOVDstore)
5420 v.AuxInt = int32ToAuxInt(off1 + off2)
5421 v.Aux = symToAux(sym)
5422 v.AddArg3(ptr, val, mem)
5423 return true
5424 }
5425
5426
5427 for {
5428 off1 := auxIntToInt32(v.AuxInt)
5429 sym := auxToSym(v.Aux)
5430 if v_0.Op != OpARMSUBconst {
5431 break
5432 }
5433 off2 := auxIntToInt32(v_0.AuxInt)
5434 ptr := v_0.Args[0]
5435 val := v_1
5436 mem := v_2
5437 v.reset(OpARMMOVDstore)
5438 v.AuxInt = int32ToAuxInt(off1 - off2)
5439 v.Aux = symToAux(sym)
5440 v.AddArg3(ptr, val, mem)
5441 return true
5442 }
5443
5444
5445
5446 for {
5447 off1 := auxIntToInt32(v.AuxInt)
5448 sym1 := auxToSym(v.Aux)
5449 if v_0.Op != OpARMMOVWaddr {
5450 break
5451 }
5452 off2 := auxIntToInt32(v_0.AuxInt)
5453 sym2 := auxToSym(v_0.Aux)
5454 ptr := v_0.Args[0]
5455 val := v_1
5456 mem := v_2
5457 if !(canMergeSym(sym1, sym2)) {
5458 break
5459 }
5460 v.reset(OpARMMOVDstore)
5461 v.AuxInt = int32ToAuxInt(off1 + off2)
5462 v.Aux = symToAux(mergeSym(sym1, sym2))
5463 v.AddArg3(ptr, val, mem)
5464 return true
5465 }
5466 return false
5467 }
5468 func rewriteValueARM_OpARMMOVFload(v *Value) bool {
5469 v_1 := v.Args[1]
5470 v_0 := v.Args[0]
5471
5472
5473 for {
5474 off1 := auxIntToInt32(v.AuxInt)
5475 sym := auxToSym(v.Aux)
5476 if v_0.Op != OpARMADDconst {
5477 break
5478 }
5479 off2 := auxIntToInt32(v_0.AuxInt)
5480 ptr := v_0.Args[0]
5481 mem := v_1
5482 v.reset(OpARMMOVFload)
5483 v.AuxInt = int32ToAuxInt(off1 + off2)
5484 v.Aux = symToAux(sym)
5485 v.AddArg2(ptr, mem)
5486 return true
5487 }
5488
5489
5490 for {
5491 off1 := auxIntToInt32(v.AuxInt)
5492 sym := auxToSym(v.Aux)
5493 if v_0.Op != OpARMSUBconst {
5494 break
5495 }
5496 off2 := auxIntToInt32(v_0.AuxInt)
5497 ptr := v_0.Args[0]
5498 mem := v_1
5499 v.reset(OpARMMOVFload)
5500 v.AuxInt = int32ToAuxInt(off1 - off2)
5501 v.Aux = symToAux(sym)
5502 v.AddArg2(ptr, mem)
5503 return true
5504 }
5505
5506
5507
5508 for {
5509 off1 := auxIntToInt32(v.AuxInt)
5510 sym1 := auxToSym(v.Aux)
5511 if v_0.Op != OpARMMOVWaddr {
5512 break
5513 }
5514 off2 := auxIntToInt32(v_0.AuxInt)
5515 sym2 := auxToSym(v_0.Aux)
5516 ptr := v_0.Args[0]
5517 mem := v_1
5518 if !(canMergeSym(sym1, sym2)) {
5519 break
5520 }
5521 v.reset(OpARMMOVFload)
5522 v.AuxInt = int32ToAuxInt(off1 + off2)
5523 v.Aux = symToAux(mergeSym(sym1, sym2))
5524 v.AddArg2(ptr, mem)
5525 return true
5526 }
5527
5528
5529
5530 for {
5531 off := auxIntToInt32(v.AuxInt)
5532 sym := auxToSym(v.Aux)
5533 ptr := v_0
5534 if v_1.Op != OpARMMOVFstore {
5535 break
5536 }
5537 off2 := auxIntToInt32(v_1.AuxInt)
5538 sym2 := auxToSym(v_1.Aux)
5539 x := v_1.Args[1]
5540 ptr2 := v_1.Args[0]
5541 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
5542 break
5543 }
5544 v.copyOf(x)
5545 return true
5546 }
5547 return false
5548 }
5549 func rewriteValueARM_OpARMMOVFstore(v *Value) bool {
5550 v_2 := v.Args[2]
5551 v_1 := v.Args[1]
5552 v_0 := v.Args[0]
5553
5554
5555 for {
5556 off1 := auxIntToInt32(v.AuxInt)
5557 sym := auxToSym(v.Aux)
5558 if v_0.Op != OpARMADDconst {
5559 break
5560 }
5561 off2 := auxIntToInt32(v_0.AuxInt)
5562 ptr := v_0.Args[0]
5563 val := v_1
5564 mem := v_2
5565 v.reset(OpARMMOVFstore)
5566 v.AuxInt = int32ToAuxInt(off1 + off2)
5567 v.Aux = symToAux(sym)
5568 v.AddArg3(ptr, val, mem)
5569 return true
5570 }
5571
5572
5573 for {
5574 off1 := auxIntToInt32(v.AuxInt)
5575 sym := auxToSym(v.Aux)
5576 if v_0.Op != OpARMSUBconst {
5577 break
5578 }
5579 off2 := auxIntToInt32(v_0.AuxInt)
5580 ptr := v_0.Args[0]
5581 val := v_1
5582 mem := v_2
5583 v.reset(OpARMMOVFstore)
5584 v.AuxInt = int32ToAuxInt(off1 - off2)
5585 v.Aux = symToAux(sym)
5586 v.AddArg3(ptr, val, mem)
5587 return true
5588 }
5589
5590
5591
5592 for {
5593 off1 := auxIntToInt32(v.AuxInt)
5594 sym1 := auxToSym(v.Aux)
5595 if v_0.Op != OpARMMOVWaddr {
5596 break
5597 }
5598 off2 := auxIntToInt32(v_0.AuxInt)
5599 sym2 := auxToSym(v_0.Aux)
5600 ptr := v_0.Args[0]
5601 val := v_1
5602 mem := v_2
5603 if !(canMergeSym(sym1, sym2)) {
5604 break
5605 }
5606 v.reset(OpARMMOVFstore)
5607 v.AuxInt = int32ToAuxInt(off1 + off2)
5608 v.Aux = symToAux(mergeSym(sym1, sym2))
5609 v.AddArg3(ptr, val, mem)
5610 return true
5611 }
5612 return false
5613 }
5614 func rewriteValueARM_OpARMMOVHUload(v *Value) bool {
5615 v_1 := v.Args[1]
5616 v_0 := v.Args[0]
5617 b := v.Block
5618 config := b.Func.Config
5619
5620
5621 for {
5622 off1 := auxIntToInt32(v.AuxInt)
5623 sym := auxToSym(v.Aux)
5624 if v_0.Op != OpARMADDconst {
5625 break
5626 }
5627 off2 := auxIntToInt32(v_0.AuxInt)
5628 ptr := v_0.Args[0]
5629 mem := v_1
5630 v.reset(OpARMMOVHUload)
5631 v.AuxInt = int32ToAuxInt(off1 + off2)
5632 v.Aux = symToAux(sym)
5633 v.AddArg2(ptr, mem)
5634 return true
5635 }
5636
5637
5638 for {
5639 off1 := auxIntToInt32(v.AuxInt)
5640 sym := auxToSym(v.Aux)
5641 if v_0.Op != OpARMSUBconst {
5642 break
5643 }
5644 off2 := auxIntToInt32(v_0.AuxInt)
5645 ptr := v_0.Args[0]
5646 mem := v_1
5647 v.reset(OpARMMOVHUload)
5648 v.AuxInt = int32ToAuxInt(off1 - off2)
5649 v.Aux = symToAux(sym)
5650 v.AddArg2(ptr, mem)
5651 return true
5652 }
5653
5654
5655
5656 for {
5657 off1 := auxIntToInt32(v.AuxInt)
5658 sym1 := auxToSym(v.Aux)
5659 if v_0.Op != OpARMMOVWaddr {
5660 break
5661 }
5662 off2 := auxIntToInt32(v_0.AuxInt)
5663 sym2 := auxToSym(v_0.Aux)
5664 ptr := v_0.Args[0]
5665 mem := v_1
5666 if !(canMergeSym(sym1, sym2)) {
5667 break
5668 }
5669 v.reset(OpARMMOVHUload)
5670 v.AuxInt = int32ToAuxInt(off1 + off2)
5671 v.Aux = symToAux(mergeSym(sym1, sym2))
5672 v.AddArg2(ptr, mem)
5673 return true
5674 }
5675
5676
5677
5678 for {
5679 off := auxIntToInt32(v.AuxInt)
5680 sym := auxToSym(v.Aux)
5681 ptr := v_0
5682 if v_1.Op != OpARMMOVHstore {
5683 break
5684 }
5685 off2 := auxIntToInt32(v_1.AuxInt)
5686 sym2 := auxToSym(v_1.Aux)
5687 x := v_1.Args[1]
5688 ptr2 := v_1.Args[0]
5689 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
5690 break
5691 }
5692 v.reset(OpARMMOVHUreg)
5693 v.AddArg(x)
5694 return true
5695 }
5696
5697
5698
5699 for {
5700 if auxIntToInt32(v.AuxInt) != 0 {
5701 break
5702 }
5703 sym := auxToSym(v.Aux)
5704 if v_0.Op != OpARMADD {
5705 break
5706 }
5707 idx := v_0.Args[1]
5708 ptr := v_0.Args[0]
5709 mem := v_1
5710 if !(sym == nil) {
5711 break
5712 }
5713 v.reset(OpARMMOVHUloadidx)
5714 v.AddArg3(ptr, idx, mem)
5715 return true
5716 }
5717
5718
5719
5720 for {
5721 off := auxIntToInt32(v.AuxInt)
5722 sym := auxToSym(v.Aux)
5723 if v_0.Op != OpSB || !(symIsRO(sym)) {
5724 break
5725 }
5726 v.reset(OpARMMOVWconst)
5727 v.AuxInt = int32ToAuxInt(int32(read16(sym, int64(off), config.ctxt.Arch.ByteOrder)))
5728 return true
5729 }
5730 return false
5731 }
5732 func rewriteValueARM_OpARMMOVHUloadidx(v *Value) bool {
5733 v_2 := v.Args[2]
5734 v_1 := v.Args[1]
5735 v_0 := v.Args[0]
5736
5737
5738
5739 for {
5740 ptr := v_0
5741 idx := v_1
5742 if v_2.Op != OpARMMOVHstoreidx {
5743 break
5744 }
5745 x := v_2.Args[2]
5746 ptr2 := v_2.Args[0]
5747 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) {
5748 break
5749 }
5750 v.reset(OpARMMOVHUreg)
5751 v.AddArg(x)
5752 return true
5753 }
5754
5755
5756 for {
5757 ptr := v_0
5758 if v_1.Op != OpARMMOVWconst {
5759 break
5760 }
5761 c := auxIntToInt32(v_1.AuxInt)
5762 mem := v_2
5763 v.reset(OpARMMOVHUload)
5764 v.AuxInt = int32ToAuxInt(c)
5765 v.AddArg2(ptr, mem)
5766 return true
5767 }
5768
5769
5770 for {
5771 if v_0.Op != OpARMMOVWconst {
5772 break
5773 }
5774 c := auxIntToInt32(v_0.AuxInt)
5775 ptr := v_1
5776 mem := v_2
5777 v.reset(OpARMMOVHUload)
5778 v.AuxInt = int32ToAuxInt(c)
5779 v.AddArg2(ptr, mem)
5780 return true
5781 }
5782 return false
5783 }
5784 func rewriteValueARM_OpARMMOVHUreg(v *Value) bool {
5785 v_0 := v.Args[0]
5786
5787
5788 for {
5789 x := v_0
5790 if x.Op != OpARMMOVBUload {
5791 break
5792 }
5793 v.reset(OpARMMOVWreg)
5794 v.AddArg(x)
5795 return true
5796 }
5797
5798
5799 for {
5800 x := v_0
5801 if x.Op != OpARMMOVHUload {
5802 break
5803 }
5804 v.reset(OpARMMOVWreg)
5805 v.AddArg(x)
5806 return true
5807 }
5808
5809
5810 for {
5811 if v_0.Op != OpARMANDconst {
5812 break
5813 }
5814 c := auxIntToInt32(v_0.AuxInt)
5815 x := v_0.Args[0]
5816 v.reset(OpARMANDconst)
5817 v.AuxInt = int32ToAuxInt(c & 0xffff)
5818 v.AddArg(x)
5819 return true
5820 }
5821
5822
5823 for {
5824 x := v_0
5825 if x.Op != OpARMMOVBUreg {
5826 break
5827 }
5828 v.reset(OpARMMOVWreg)
5829 v.AddArg(x)
5830 return true
5831 }
5832
5833
5834 for {
5835 x := v_0
5836 if x.Op != OpARMMOVHUreg {
5837 break
5838 }
5839 v.reset(OpARMMOVWreg)
5840 v.AddArg(x)
5841 return true
5842 }
5843
5844
5845 for {
5846 if v_0.Op != OpARMMOVWconst {
5847 break
5848 }
5849 c := auxIntToInt32(v_0.AuxInt)
5850 v.reset(OpARMMOVWconst)
5851 v.AuxInt = int32ToAuxInt(int32(uint16(c)))
5852 return true
5853 }
5854 return false
5855 }
5856 func rewriteValueARM_OpARMMOVHload(v *Value) bool {
5857 v_1 := v.Args[1]
5858 v_0 := v.Args[0]
5859 b := v.Block
5860 config := b.Func.Config
5861
5862
5863 for {
5864 off1 := auxIntToInt32(v.AuxInt)
5865 sym := auxToSym(v.Aux)
5866 if v_0.Op != OpARMADDconst {
5867 break
5868 }
5869 off2 := auxIntToInt32(v_0.AuxInt)
5870 ptr := v_0.Args[0]
5871 mem := v_1
5872 v.reset(OpARMMOVHload)
5873 v.AuxInt = int32ToAuxInt(off1 + off2)
5874 v.Aux = symToAux(sym)
5875 v.AddArg2(ptr, mem)
5876 return true
5877 }
5878
5879
5880 for {
5881 off1 := auxIntToInt32(v.AuxInt)
5882 sym := auxToSym(v.Aux)
5883 if v_0.Op != OpARMSUBconst {
5884 break
5885 }
5886 off2 := auxIntToInt32(v_0.AuxInt)
5887 ptr := v_0.Args[0]
5888 mem := v_1
5889 v.reset(OpARMMOVHload)
5890 v.AuxInt = int32ToAuxInt(off1 - off2)
5891 v.Aux = symToAux(sym)
5892 v.AddArg2(ptr, mem)
5893 return true
5894 }
5895
5896
5897
5898 for {
5899 off1 := auxIntToInt32(v.AuxInt)
5900 sym1 := auxToSym(v.Aux)
5901 if v_0.Op != OpARMMOVWaddr {
5902 break
5903 }
5904 off2 := auxIntToInt32(v_0.AuxInt)
5905 sym2 := auxToSym(v_0.Aux)
5906 ptr := v_0.Args[0]
5907 mem := v_1
5908 if !(canMergeSym(sym1, sym2)) {
5909 break
5910 }
5911 v.reset(OpARMMOVHload)
5912 v.AuxInt = int32ToAuxInt(off1 + off2)
5913 v.Aux = symToAux(mergeSym(sym1, sym2))
5914 v.AddArg2(ptr, mem)
5915 return true
5916 }
5917
5918
5919
5920 for {
5921 off := auxIntToInt32(v.AuxInt)
5922 sym := auxToSym(v.Aux)
5923 ptr := v_0
5924 if v_1.Op != OpARMMOVHstore {
5925 break
5926 }
5927 off2 := auxIntToInt32(v_1.AuxInt)
5928 sym2 := auxToSym(v_1.Aux)
5929 x := v_1.Args[1]
5930 ptr2 := v_1.Args[0]
5931 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
5932 break
5933 }
5934 v.reset(OpARMMOVHreg)
5935 v.AddArg(x)
5936 return true
5937 }
5938
5939
5940
5941 for {
5942 if auxIntToInt32(v.AuxInt) != 0 {
5943 break
5944 }
5945 sym := auxToSym(v.Aux)
5946 if v_0.Op != OpARMADD {
5947 break
5948 }
5949 idx := v_0.Args[1]
5950 ptr := v_0.Args[0]
5951 mem := v_1
5952 if !(sym == nil) {
5953 break
5954 }
5955 v.reset(OpARMMOVHloadidx)
5956 v.AddArg3(ptr, idx, mem)
5957 return true
5958 }
5959
5960
5961
5962 for {
5963 off := auxIntToInt32(v.AuxInt)
5964 sym := auxToSym(v.Aux)
5965 if v_0.Op != OpSB || !(symIsRO(sym)) {
5966 break
5967 }
5968 v.reset(OpARMMOVWconst)
5969 v.AuxInt = int32ToAuxInt(int32(int16(read16(sym, int64(off), config.ctxt.Arch.ByteOrder))))
5970 return true
5971 }
5972 return false
5973 }
5974 func rewriteValueARM_OpARMMOVHloadidx(v *Value) bool {
5975 v_2 := v.Args[2]
5976 v_1 := v.Args[1]
5977 v_0 := v.Args[0]
5978
5979
5980
5981 for {
5982 ptr := v_0
5983 idx := v_1
5984 if v_2.Op != OpARMMOVHstoreidx {
5985 break
5986 }
5987 x := v_2.Args[2]
5988 ptr2 := v_2.Args[0]
5989 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) {
5990 break
5991 }
5992 v.reset(OpARMMOVHreg)
5993 v.AddArg(x)
5994 return true
5995 }
5996
5997
5998 for {
5999 ptr := v_0
6000 if v_1.Op != OpARMMOVWconst {
6001 break
6002 }
6003 c := auxIntToInt32(v_1.AuxInt)
6004 mem := v_2
6005 v.reset(OpARMMOVHload)
6006 v.AuxInt = int32ToAuxInt(c)
6007 v.AddArg2(ptr, mem)
6008 return true
6009 }
6010
6011
6012 for {
6013 if v_0.Op != OpARMMOVWconst {
6014 break
6015 }
6016 c := auxIntToInt32(v_0.AuxInt)
6017 ptr := v_1
6018 mem := v_2
6019 v.reset(OpARMMOVHload)
6020 v.AuxInt = int32ToAuxInt(c)
6021 v.AddArg2(ptr, mem)
6022 return true
6023 }
6024 return false
6025 }
6026 func rewriteValueARM_OpARMMOVHreg(v *Value) bool {
6027 v_0 := v.Args[0]
6028
6029
6030 for {
6031 x := v_0
6032 if x.Op != OpARMMOVBload {
6033 break
6034 }
6035 v.reset(OpARMMOVWreg)
6036 v.AddArg(x)
6037 return true
6038 }
6039
6040
6041 for {
6042 x := v_0
6043 if x.Op != OpARMMOVBUload {
6044 break
6045 }
6046 v.reset(OpARMMOVWreg)
6047 v.AddArg(x)
6048 return true
6049 }
6050
6051
6052 for {
6053 x := v_0
6054 if x.Op != OpARMMOVHload {
6055 break
6056 }
6057 v.reset(OpARMMOVWreg)
6058 v.AddArg(x)
6059 return true
6060 }
6061
6062
6063
6064 for {
6065 if v_0.Op != OpARMANDconst {
6066 break
6067 }
6068 c := auxIntToInt32(v_0.AuxInt)
6069 x := v_0.Args[0]
6070 if !(c&0x8000 == 0) {
6071 break
6072 }
6073 v.reset(OpARMANDconst)
6074 v.AuxInt = int32ToAuxInt(c & 0x7fff)
6075 v.AddArg(x)
6076 return true
6077 }
6078
6079
6080 for {
6081 x := v_0
6082 if x.Op != OpARMMOVBreg {
6083 break
6084 }
6085 v.reset(OpARMMOVWreg)
6086 v.AddArg(x)
6087 return true
6088 }
6089
6090
6091 for {
6092 x := v_0
6093 if x.Op != OpARMMOVBUreg {
6094 break
6095 }
6096 v.reset(OpARMMOVWreg)
6097 v.AddArg(x)
6098 return true
6099 }
6100
6101
6102 for {
6103 x := v_0
6104 if x.Op != OpARMMOVHreg {
6105 break
6106 }
6107 v.reset(OpARMMOVWreg)
6108 v.AddArg(x)
6109 return true
6110 }
6111
6112
6113 for {
6114 if v_0.Op != OpARMMOVWconst {
6115 break
6116 }
6117 c := auxIntToInt32(v_0.AuxInt)
6118 v.reset(OpARMMOVWconst)
6119 v.AuxInt = int32ToAuxInt(int32(int16(c)))
6120 return true
6121 }
6122 return false
6123 }
6124 func rewriteValueARM_OpARMMOVHstore(v *Value) bool {
6125 v_2 := v.Args[2]
6126 v_1 := v.Args[1]
6127 v_0 := v.Args[0]
6128
6129
6130 for {
6131 off1 := auxIntToInt32(v.AuxInt)
6132 sym := auxToSym(v.Aux)
6133 if v_0.Op != OpARMADDconst {
6134 break
6135 }
6136 off2 := auxIntToInt32(v_0.AuxInt)
6137 ptr := v_0.Args[0]
6138 val := v_1
6139 mem := v_2
6140 v.reset(OpARMMOVHstore)
6141 v.AuxInt = int32ToAuxInt(off1 + off2)
6142 v.Aux = symToAux(sym)
6143 v.AddArg3(ptr, val, mem)
6144 return true
6145 }
6146
6147
6148 for {
6149 off1 := auxIntToInt32(v.AuxInt)
6150 sym := auxToSym(v.Aux)
6151 if v_0.Op != OpARMSUBconst {
6152 break
6153 }
6154 off2 := auxIntToInt32(v_0.AuxInt)
6155 ptr := v_0.Args[0]
6156 val := v_1
6157 mem := v_2
6158 v.reset(OpARMMOVHstore)
6159 v.AuxInt = int32ToAuxInt(off1 - off2)
6160 v.Aux = symToAux(sym)
6161 v.AddArg3(ptr, val, mem)
6162 return true
6163 }
6164
6165
6166
6167 for {
6168 off1 := auxIntToInt32(v.AuxInt)
6169 sym1 := auxToSym(v.Aux)
6170 if v_0.Op != OpARMMOVWaddr {
6171 break
6172 }
6173 off2 := auxIntToInt32(v_0.AuxInt)
6174 sym2 := auxToSym(v_0.Aux)
6175 ptr := v_0.Args[0]
6176 val := v_1
6177 mem := v_2
6178 if !(canMergeSym(sym1, sym2)) {
6179 break
6180 }
6181 v.reset(OpARMMOVHstore)
6182 v.AuxInt = int32ToAuxInt(off1 + off2)
6183 v.Aux = symToAux(mergeSym(sym1, sym2))
6184 v.AddArg3(ptr, val, mem)
6185 return true
6186 }
6187
6188
6189 for {
6190 off := auxIntToInt32(v.AuxInt)
6191 sym := auxToSym(v.Aux)
6192 ptr := v_0
6193 if v_1.Op != OpARMMOVHreg {
6194 break
6195 }
6196 x := v_1.Args[0]
6197 mem := v_2
6198 v.reset(OpARMMOVHstore)
6199 v.AuxInt = int32ToAuxInt(off)
6200 v.Aux = symToAux(sym)
6201 v.AddArg3(ptr, x, mem)
6202 return true
6203 }
6204
6205
6206 for {
6207 off := auxIntToInt32(v.AuxInt)
6208 sym := auxToSym(v.Aux)
6209 ptr := v_0
6210 if v_1.Op != OpARMMOVHUreg {
6211 break
6212 }
6213 x := v_1.Args[0]
6214 mem := v_2
6215 v.reset(OpARMMOVHstore)
6216 v.AuxInt = int32ToAuxInt(off)
6217 v.Aux = symToAux(sym)
6218 v.AddArg3(ptr, x, mem)
6219 return true
6220 }
6221
6222
6223
6224 for {
6225 if auxIntToInt32(v.AuxInt) != 0 {
6226 break
6227 }
6228 sym := auxToSym(v.Aux)
6229 if v_0.Op != OpARMADD {
6230 break
6231 }
6232 idx := v_0.Args[1]
6233 ptr := v_0.Args[0]
6234 val := v_1
6235 mem := v_2
6236 if !(sym == nil) {
6237 break
6238 }
6239 v.reset(OpARMMOVHstoreidx)
6240 v.AddArg4(ptr, idx, val, mem)
6241 return true
6242 }
6243 return false
6244 }
6245 func rewriteValueARM_OpARMMOVHstoreidx(v *Value) bool {
6246 v_3 := v.Args[3]
6247 v_2 := v.Args[2]
6248 v_1 := v.Args[1]
6249 v_0 := v.Args[0]
6250
6251
6252 for {
6253 ptr := v_0
6254 if v_1.Op != OpARMMOVWconst {
6255 break
6256 }
6257 c := auxIntToInt32(v_1.AuxInt)
6258 val := v_2
6259 mem := v_3
6260 v.reset(OpARMMOVHstore)
6261 v.AuxInt = int32ToAuxInt(c)
6262 v.AddArg3(ptr, val, mem)
6263 return true
6264 }
6265
6266
6267 for {
6268 if v_0.Op != OpARMMOVWconst {
6269 break
6270 }
6271 c := auxIntToInt32(v_0.AuxInt)
6272 ptr := v_1
6273 val := v_2
6274 mem := v_3
6275 v.reset(OpARMMOVHstore)
6276 v.AuxInt = int32ToAuxInt(c)
6277 v.AddArg3(ptr, val, mem)
6278 return true
6279 }
6280 return false
6281 }
6282 func rewriteValueARM_OpARMMOVWload(v *Value) bool {
6283 v_1 := v.Args[1]
6284 v_0 := v.Args[0]
6285 b := v.Block
6286 config := b.Func.Config
6287
6288
6289 for {
6290 off1 := auxIntToInt32(v.AuxInt)
6291 sym := auxToSym(v.Aux)
6292 if v_0.Op != OpARMADDconst {
6293 break
6294 }
6295 off2 := auxIntToInt32(v_0.AuxInt)
6296 ptr := v_0.Args[0]
6297 mem := v_1
6298 v.reset(OpARMMOVWload)
6299 v.AuxInt = int32ToAuxInt(off1 + off2)
6300 v.Aux = symToAux(sym)
6301 v.AddArg2(ptr, mem)
6302 return true
6303 }
6304
6305
6306 for {
6307 off1 := auxIntToInt32(v.AuxInt)
6308 sym := auxToSym(v.Aux)
6309 if v_0.Op != OpARMSUBconst {
6310 break
6311 }
6312 off2 := auxIntToInt32(v_0.AuxInt)
6313 ptr := v_0.Args[0]
6314 mem := v_1
6315 v.reset(OpARMMOVWload)
6316 v.AuxInt = int32ToAuxInt(off1 - off2)
6317 v.Aux = symToAux(sym)
6318 v.AddArg2(ptr, mem)
6319 return true
6320 }
6321
6322
6323
6324 for {
6325 off1 := auxIntToInt32(v.AuxInt)
6326 sym1 := auxToSym(v.Aux)
6327 if v_0.Op != OpARMMOVWaddr {
6328 break
6329 }
6330 off2 := auxIntToInt32(v_0.AuxInt)
6331 sym2 := auxToSym(v_0.Aux)
6332 ptr := v_0.Args[0]
6333 mem := v_1
6334 if !(canMergeSym(sym1, sym2)) {
6335 break
6336 }
6337 v.reset(OpARMMOVWload)
6338 v.AuxInt = int32ToAuxInt(off1 + off2)
6339 v.Aux = symToAux(mergeSym(sym1, sym2))
6340 v.AddArg2(ptr, mem)
6341 return true
6342 }
6343
6344
6345
6346 for {
6347 off := auxIntToInt32(v.AuxInt)
6348 sym := auxToSym(v.Aux)
6349 ptr := v_0
6350 if v_1.Op != OpARMMOVWstore {
6351 break
6352 }
6353 off2 := auxIntToInt32(v_1.AuxInt)
6354 sym2 := auxToSym(v_1.Aux)
6355 x := v_1.Args[1]
6356 ptr2 := v_1.Args[0]
6357 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) {
6358 break
6359 }
6360 v.copyOf(x)
6361 return true
6362 }
6363
6364
6365
6366 for {
6367 if auxIntToInt32(v.AuxInt) != 0 {
6368 break
6369 }
6370 sym := auxToSym(v.Aux)
6371 if v_0.Op != OpARMADD {
6372 break
6373 }
6374 idx := v_0.Args[1]
6375 ptr := v_0.Args[0]
6376 mem := v_1
6377 if !(sym == nil) {
6378 break
6379 }
6380 v.reset(OpARMMOVWloadidx)
6381 v.AddArg3(ptr, idx, mem)
6382 return true
6383 }
6384
6385
6386
6387 for {
6388 if auxIntToInt32(v.AuxInt) != 0 {
6389 break
6390 }
6391 sym := auxToSym(v.Aux)
6392 if v_0.Op != OpARMADDshiftLL {
6393 break
6394 }
6395 c := auxIntToInt32(v_0.AuxInt)
6396 idx := v_0.Args[1]
6397 ptr := v_0.Args[0]
6398 mem := v_1
6399 if !(sym == nil) {
6400 break
6401 }
6402 v.reset(OpARMMOVWloadshiftLL)
6403 v.AuxInt = int32ToAuxInt(c)
6404 v.AddArg3(ptr, idx, mem)
6405 return true
6406 }
6407
6408
6409
6410 for {
6411 if auxIntToInt32(v.AuxInt) != 0 {
6412 break
6413 }
6414 sym := auxToSym(v.Aux)
6415 if v_0.Op != OpARMADDshiftRL {
6416 break
6417 }
6418 c := auxIntToInt32(v_0.AuxInt)
6419 idx := v_0.Args[1]
6420 ptr := v_0.Args[0]
6421 mem := v_1
6422 if !(sym == nil) {
6423 break
6424 }
6425 v.reset(OpARMMOVWloadshiftRL)
6426 v.AuxInt = int32ToAuxInt(c)
6427 v.AddArg3(ptr, idx, mem)
6428 return true
6429 }
6430
6431
6432
6433 for {
6434 if auxIntToInt32(v.AuxInt) != 0 {
6435 break
6436 }
6437 sym := auxToSym(v.Aux)
6438 if v_0.Op != OpARMADDshiftRA {
6439 break
6440 }
6441 c := auxIntToInt32(v_0.AuxInt)
6442 idx := v_0.Args[1]
6443 ptr := v_0.Args[0]
6444 mem := v_1
6445 if !(sym == nil) {
6446 break
6447 }
6448 v.reset(OpARMMOVWloadshiftRA)
6449 v.AuxInt = int32ToAuxInt(c)
6450 v.AddArg3(ptr, idx, mem)
6451 return true
6452 }
6453
6454
6455
6456 for {
6457 off := auxIntToInt32(v.AuxInt)
6458 sym := auxToSym(v.Aux)
6459 if v_0.Op != OpSB || !(symIsRO(sym)) {
6460 break
6461 }
6462 v.reset(OpARMMOVWconst)
6463 v.AuxInt = int32ToAuxInt(int32(read32(sym, int64(off), config.ctxt.Arch.ByteOrder)))
6464 return true
6465 }
6466 return false
6467 }
6468 func rewriteValueARM_OpARMMOVWloadidx(v *Value) bool {
6469 v_2 := v.Args[2]
6470 v_1 := v.Args[1]
6471 v_0 := v.Args[0]
6472
6473
6474
6475 for {
6476 ptr := v_0
6477 idx := v_1
6478 if v_2.Op != OpARMMOVWstoreidx {
6479 break
6480 }
6481 x := v_2.Args[2]
6482 ptr2 := v_2.Args[0]
6483 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) {
6484 break
6485 }
6486 v.copyOf(x)
6487 return true
6488 }
6489
6490
6491 for {
6492 ptr := v_0
6493 if v_1.Op != OpARMMOVWconst {
6494 break
6495 }
6496 c := auxIntToInt32(v_1.AuxInt)
6497 mem := v_2
6498 v.reset(OpARMMOVWload)
6499 v.AuxInt = int32ToAuxInt(c)
6500 v.AddArg2(ptr, mem)
6501 return true
6502 }
6503
6504
6505 for {
6506 if v_0.Op != OpARMMOVWconst {
6507 break
6508 }
6509 c := auxIntToInt32(v_0.AuxInt)
6510 ptr := v_1
6511 mem := v_2
6512 v.reset(OpARMMOVWload)
6513 v.AuxInt = int32ToAuxInt(c)
6514 v.AddArg2(ptr, mem)
6515 return true
6516 }
6517
6518
6519 for {
6520 ptr := v_0
6521 if v_1.Op != OpARMSLLconst {
6522 break
6523 }
6524 c := auxIntToInt32(v_1.AuxInt)
6525 idx := v_1.Args[0]
6526 mem := v_2
6527 v.reset(OpARMMOVWloadshiftLL)
6528 v.AuxInt = int32ToAuxInt(c)
6529 v.AddArg3(ptr, idx, mem)
6530 return true
6531 }
6532
6533
6534 for {
6535 if v_0.Op != OpARMSLLconst {
6536 break
6537 }
6538 c := auxIntToInt32(v_0.AuxInt)
6539 idx := v_0.Args[0]
6540 ptr := v_1
6541 mem := v_2
6542 v.reset(OpARMMOVWloadshiftLL)
6543 v.AuxInt = int32ToAuxInt(c)
6544 v.AddArg3(ptr, idx, mem)
6545 return true
6546 }
6547
6548
6549 for {
6550 ptr := v_0
6551 if v_1.Op != OpARMSRLconst {
6552 break
6553 }
6554 c := auxIntToInt32(v_1.AuxInt)
6555 idx := v_1.Args[0]
6556 mem := v_2
6557 v.reset(OpARMMOVWloadshiftRL)
6558 v.AuxInt = int32ToAuxInt(c)
6559 v.AddArg3(ptr, idx, mem)
6560 return true
6561 }
6562
6563
6564 for {
6565 if v_0.Op != OpARMSRLconst {
6566 break
6567 }
6568 c := auxIntToInt32(v_0.AuxInt)
6569 idx := v_0.Args[0]
6570 ptr := v_1
6571 mem := v_2
6572 v.reset(OpARMMOVWloadshiftRL)
6573 v.AuxInt = int32ToAuxInt(c)
6574 v.AddArg3(ptr, idx, mem)
6575 return true
6576 }
6577
6578
6579 for {
6580 ptr := v_0
6581 if v_1.Op != OpARMSRAconst {
6582 break
6583 }
6584 c := auxIntToInt32(v_1.AuxInt)
6585 idx := v_1.Args[0]
6586 mem := v_2
6587 v.reset(OpARMMOVWloadshiftRA)
6588 v.AuxInt = int32ToAuxInt(c)
6589 v.AddArg3(ptr, idx, mem)
6590 return true
6591 }
6592
6593
6594 for {
6595 if v_0.Op != OpARMSRAconst {
6596 break
6597 }
6598 c := auxIntToInt32(v_0.AuxInt)
6599 idx := v_0.Args[0]
6600 ptr := v_1
6601 mem := v_2
6602 v.reset(OpARMMOVWloadshiftRA)
6603 v.AuxInt = int32ToAuxInt(c)
6604 v.AddArg3(ptr, idx, mem)
6605 return true
6606 }
6607 return false
6608 }
6609 func rewriteValueARM_OpARMMOVWloadshiftLL(v *Value) bool {
6610 v_2 := v.Args[2]
6611 v_1 := v.Args[1]
6612 v_0 := v.Args[0]
6613
6614
6615
6616 for {
6617 c := auxIntToInt32(v.AuxInt)
6618 ptr := v_0
6619 idx := v_1
6620 if v_2.Op != OpARMMOVWstoreshiftLL {
6621 break
6622 }
6623 d := auxIntToInt32(v_2.AuxInt)
6624 x := v_2.Args[2]
6625 ptr2 := v_2.Args[0]
6626 if idx != v_2.Args[1] || !(c == d && isSamePtr(ptr, ptr2)) {
6627 break
6628 }
6629 v.copyOf(x)
6630 return true
6631 }
6632
6633
6634 for {
6635 d := auxIntToInt32(v.AuxInt)
6636 ptr := v_0
6637 if v_1.Op != OpARMMOVWconst {
6638 break
6639 }
6640 c := auxIntToInt32(v_1.AuxInt)
6641 mem := v_2
6642 v.reset(OpARMMOVWload)
6643 v.AuxInt = int32ToAuxInt(int32(uint32(c) << uint64(d)))
6644 v.AddArg2(ptr, mem)
6645 return true
6646 }
6647 return false
6648 }
6649 func rewriteValueARM_OpARMMOVWloadshiftRA(v *Value) bool {
6650 v_2 := v.Args[2]
6651 v_1 := v.Args[1]
6652 v_0 := v.Args[0]
6653
6654
6655
6656 for {
6657 c := auxIntToInt32(v.AuxInt)
6658 ptr := v_0
6659 idx := v_1
6660 if v_2.Op != OpARMMOVWstoreshiftRA {
6661 break
6662 }
6663 d := auxIntToInt32(v_2.AuxInt)
6664 x := v_2.Args[2]
6665 ptr2 := v_2.Args[0]
6666 if idx != v_2.Args[1] || !(c == d && isSamePtr(ptr, ptr2)) {
6667 break
6668 }
6669 v.copyOf(x)
6670 return true
6671 }
6672
6673
6674 for {
6675 d := auxIntToInt32(v.AuxInt)
6676 ptr := v_0
6677 if v_1.Op != OpARMMOVWconst {
6678 break
6679 }
6680 c := auxIntToInt32(v_1.AuxInt)
6681 mem := v_2
6682 v.reset(OpARMMOVWload)
6683 v.AuxInt = int32ToAuxInt(c >> uint64(d))
6684 v.AddArg2(ptr, mem)
6685 return true
6686 }
6687 return false
6688 }
6689 func rewriteValueARM_OpARMMOVWloadshiftRL(v *Value) bool {
6690 v_2 := v.Args[2]
6691 v_1 := v.Args[1]
6692 v_0 := v.Args[0]
6693
6694
6695
6696 for {
6697 c := auxIntToInt32(v.AuxInt)
6698 ptr := v_0
6699 idx := v_1
6700 if v_2.Op != OpARMMOVWstoreshiftRL {
6701 break
6702 }
6703 d := auxIntToInt32(v_2.AuxInt)
6704 x := v_2.Args[2]
6705 ptr2 := v_2.Args[0]
6706 if idx != v_2.Args[1] || !(c == d && isSamePtr(ptr, ptr2)) {
6707 break
6708 }
6709 v.copyOf(x)
6710 return true
6711 }
6712
6713
6714 for {
6715 d := auxIntToInt32(v.AuxInt)
6716 ptr := v_0
6717 if v_1.Op != OpARMMOVWconst {
6718 break
6719 }
6720 c := auxIntToInt32(v_1.AuxInt)
6721 mem := v_2
6722 v.reset(OpARMMOVWload)
6723 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
6724 v.AddArg2(ptr, mem)
6725 return true
6726 }
6727 return false
6728 }
6729 func rewriteValueARM_OpARMMOVWnop(v *Value) bool {
6730 v_0 := v.Args[0]
6731
6732
6733 for {
6734 if v_0.Op != OpARMMOVWconst {
6735 break
6736 }
6737 c := auxIntToInt32(v_0.AuxInt)
6738 v.reset(OpARMMOVWconst)
6739 v.AuxInt = int32ToAuxInt(c)
6740 return true
6741 }
6742 return false
6743 }
6744 func rewriteValueARM_OpARMMOVWreg(v *Value) bool {
6745 v_0 := v.Args[0]
6746
6747
6748
6749 for {
6750 x := v_0
6751 if !(x.Uses == 1) {
6752 break
6753 }
6754 v.reset(OpARMMOVWnop)
6755 v.AddArg(x)
6756 return true
6757 }
6758
6759
6760 for {
6761 if v_0.Op != OpARMMOVWconst {
6762 break
6763 }
6764 c := auxIntToInt32(v_0.AuxInt)
6765 v.reset(OpARMMOVWconst)
6766 v.AuxInt = int32ToAuxInt(c)
6767 return true
6768 }
6769 return false
6770 }
6771 func rewriteValueARM_OpARMMOVWstore(v *Value) bool {
6772 v_2 := v.Args[2]
6773 v_1 := v.Args[1]
6774 v_0 := v.Args[0]
6775
6776
6777 for {
6778 off1 := auxIntToInt32(v.AuxInt)
6779 sym := auxToSym(v.Aux)
6780 if v_0.Op != OpARMADDconst {
6781 break
6782 }
6783 off2 := auxIntToInt32(v_0.AuxInt)
6784 ptr := v_0.Args[0]
6785 val := v_1
6786 mem := v_2
6787 v.reset(OpARMMOVWstore)
6788 v.AuxInt = int32ToAuxInt(off1 + off2)
6789 v.Aux = symToAux(sym)
6790 v.AddArg3(ptr, val, mem)
6791 return true
6792 }
6793
6794
6795 for {
6796 off1 := auxIntToInt32(v.AuxInt)
6797 sym := auxToSym(v.Aux)
6798 if v_0.Op != OpARMSUBconst {
6799 break
6800 }
6801 off2 := auxIntToInt32(v_0.AuxInt)
6802 ptr := v_0.Args[0]
6803 val := v_1
6804 mem := v_2
6805 v.reset(OpARMMOVWstore)
6806 v.AuxInt = int32ToAuxInt(off1 - off2)
6807 v.Aux = symToAux(sym)
6808 v.AddArg3(ptr, val, mem)
6809 return true
6810 }
6811
6812
6813
6814 for {
6815 off1 := auxIntToInt32(v.AuxInt)
6816 sym1 := auxToSym(v.Aux)
6817 if v_0.Op != OpARMMOVWaddr {
6818 break
6819 }
6820 off2 := auxIntToInt32(v_0.AuxInt)
6821 sym2 := auxToSym(v_0.Aux)
6822 ptr := v_0.Args[0]
6823 val := v_1
6824 mem := v_2
6825 if !(canMergeSym(sym1, sym2)) {
6826 break
6827 }
6828 v.reset(OpARMMOVWstore)
6829 v.AuxInt = int32ToAuxInt(off1 + off2)
6830 v.Aux = symToAux(mergeSym(sym1, sym2))
6831 v.AddArg3(ptr, val, mem)
6832 return true
6833 }
6834
6835
6836
6837 for {
6838 if auxIntToInt32(v.AuxInt) != 0 {
6839 break
6840 }
6841 sym := auxToSym(v.Aux)
6842 if v_0.Op != OpARMADD {
6843 break
6844 }
6845 idx := v_0.Args[1]
6846 ptr := v_0.Args[0]
6847 val := v_1
6848 mem := v_2
6849 if !(sym == nil) {
6850 break
6851 }
6852 v.reset(OpARMMOVWstoreidx)
6853 v.AddArg4(ptr, idx, val, mem)
6854 return true
6855 }
6856
6857
6858
6859 for {
6860 if auxIntToInt32(v.AuxInt) != 0 {
6861 break
6862 }
6863 sym := auxToSym(v.Aux)
6864 if v_0.Op != OpARMADDshiftLL {
6865 break
6866 }
6867 c := auxIntToInt32(v_0.AuxInt)
6868 idx := v_0.Args[1]
6869 ptr := v_0.Args[0]
6870 val := v_1
6871 mem := v_2
6872 if !(sym == nil) {
6873 break
6874 }
6875 v.reset(OpARMMOVWstoreshiftLL)
6876 v.AuxInt = int32ToAuxInt(c)
6877 v.AddArg4(ptr, idx, val, mem)
6878 return true
6879 }
6880
6881
6882
6883 for {
6884 if auxIntToInt32(v.AuxInt) != 0 {
6885 break
6886 }
6887 sym := auxToSym(v.Aux)
6888 if v_0.Op != OpARMADDshiftRL {
6889 break
6890 }
6891 c := auxIntToInt32(v_0.AuxInt)
6892 idx := v_0.Args[1]
6893 ptr := v_0.Args[0]
6894 val := v_1
6895 mem := v_2
6896 if !(sym == nil) {
6897 break
6898 }
6899 v.reset(OpARMMOVWstoreshiftRL)
6900 v.AuxInt = int32ToAuxInt(c)
6901 v.AddArg4(ptr, idx, val, mem)
6902 return true
6903 }
6904
6905
6906
6907 for {
6908 if auxIntToInt32(v.AuxInt) != 0 {
6909 break
6910 }
6911 sym := auxToSym(v.Aux)
6912 if v_0.Op != OpARMADDshiftRA {
6913 break
6914 }
6915 c := auxIntToInt32(v_0.AuxInt)
6916 idx := v_0.Args[1]
6917 ptr := v_0.Args[0]
6918 val := v_1
6919 mem := v_2
6920 if !(sym == nil) {
6921 break
6922 }
6923 v.reset(OpARMMOVWstoreshiftRA)
6924 v.AuxInt = int32ToAuxInt(c)
6925 v.AddArg4(ptr, idx, val, mem)
6926 return true
6927 }
6928 return false
6929 }
6930 func rewriteValueARM_OpARMMOVWstoreidx(v *Value) bool {
6931 v_3 := v.Args[3]
6932 v_2 := v.Args[2]
6933 v_1 := v.Args[1]
6934 v_0 := v.Args[0]
6935
6936
6937 for {
6938 ptr := v_0
6939 if v_1.Op != OpARMMOVWconst {
6940 break
6941 }
6942 c := auxIntToInt32(v_1.AuxInt)
6943 val := v_2
6944 mem := v_3
6945 v.reset(OpARMMOVWstore)
6946 v.AuxInt = int32ToAuxInt(c)
6947 v.AddArg3(ptr, val, mem)
6948 return true
6949 }
6950
6951
6952 for {
6953 if v_0.Op != OpARMMOVWconst {
6954 break
6955 }
6956 c := auxIntToInt32(v_0.AuxInt)
6957 ptr := v_1
6958 val := v_2
6959 mem := v_3
6960 v.reset(OpARMMOVWstore)
6961 v.AuxInt = int32ToAuxInt(c)
6962 v.AddArg3(ptr, val, mem)
6963 return true
6964 }
6965
6966
6967 for {
6968 ptr := v_0
6969 if v_1.Op != OpARMSLLconst {
6970 break
6971 }
6972 c := auxIntToInt32(v_1.AuxInt)
6973 idx := v_1.Args[0]
6974 val := v_2
6975 mem := v_3
6976 v.reset(OpARMMOVWstoreshiftLL)
6977 v.AuxInt = int32ToAuxInt(c)
6978 v.AddArg4(ptr, idx, val, mem)
6979 return true
6980 }
6981
6982
6983 for {
6984 if v_0.Op != OpARMSLLconst {
6985 break
6986 }
6987 c := auxIntToInt32(v_0.AuxInt)
6988 idx := v_0.Args[0]
6989 ptr := v_1
6990 val := v_2
6991 mem := v_3
6992 v.reset(OpARMMOVWstoreshiftLL)
6993 v.AuxInt = int32ToAuxInt(c)
6994 v.AddArg4(ptr, idx, val, mem)
6995 return true
6996 }
6997
6998
6999 for {
7000 ptr := v_0
7001 if v_1.Op != OpARMSRLconst {
7002 break
7003 }
7004 c := auxIntToInt32(v_1.AuxInt)
7005 idx := v_1.Args[0]
7006 val := v_2
7007 mem := v_3
7008 v.reset(OpARMMOVWstoreshiftRL)
7009 v.AuxInt = int32ToAuxInt(c)
7010 v.AddArg4(ptr, idx, val, mem)
7011 return true
7012 }
7013
7014
7015 for {
7016 if v_0.Op != OpARMSRLconst {
7017 break
7018 }
7019 c := auxIntToInt32(v_0.AuxInt)
7020 idx := v_0.Args[0]
7021 ptr := v_1
7022 val := v_2
7023 mem := v_3
7024 v.reset(OpARMMOVWstoreshiftRL)
7025 v.AuxInt = int32ToAuxInt(c)
7026 v.AddArg4(ptr, idx, val, mem)
7027 return true
7028 }
7029
7030
7031 for {
7032 ptr := v_0
7033 if v_1.Op != OpARMSRAconst {
7034 break
7035 }
7036 c := auxIntToInt32(v_1.AuxInt)
7037 idx := v_1.Args[0]
7038 val := v_2
7039 mem := v_3
7040 v.reset(OpARMMOVWstoreshiftRA)
7041 v.AuxInt = int32ToAuxInt(c)
7042 v.AddArg4(ptr, idx, val, mem)
7043 return true
7044 }
7045
7046
7047 for {
7048 if v_0.Op != OpARMSRAconst {
7049 break
7050 }
7051 c := auxIntToInt32(v_0.AuxInt)
7052 idx := v_0.Args[0]
7053 ptr := v_1
7054 val := v_2
7055 mem := v_3
7056 v.reset(OpARMMOVWstoreshiftRA)
7057 v.AuxInt = int32ToAuxInt(c)
7058 v.AddArg4(ptr, idx, val, mem)
7059 return true
7060 }
7061 return false
7062 }
7063 func rewriteValueARM_OpARMMOVWstoreshiftLL(v *Value) bool {
7064 v_3 := v.Args[3]
7065 v_2 := v.Args[2]
7066 v_1 := v.Args[1]
7067 v_0 := v.Args[0]
7068
7069
7070 for {
7071 d := auxIntToInt32(v.AuxInt)
7072 ptr := v_0
7073 if v_1.Op != OpARMMOVWconst {
7074 break
7075 }
7076 c := auxIntToInt32(v_1.AuxInt)
7077 val := v_2
7078 mem := v_3
7079 v.reset(OpARMMOVWstore)
7080 v.AuxInt = int32ToAuxInt(int32(uint32(c) << uint64(d)))
7081 v.AddArg3(ptr, val, mem)
7082 return true
7083 }
7084 return false
7085 }
7086 func rewriteValueARM_OpARMMOVWstoreshiftRA(v *Value) bool {
7087 v_3 := v.Args[3]
7088 v_2 := v.Args[2]
7089 v_1 := v.Args[1]
7090 v_0 := v.Args[0]
7091
7092
7093 for {
7094 d := auxIntToInt32(v.AuxInt)
7095 ptr := v_0
7096 if v_1.Op != OpARMMOVWconst {
7097 break
7098 }
7099 c := auxIntToInt32(v_1.AuxInt)
7100 val := v_2
7101 mem := v_3
7102 v.reset(OpARMMOVWstore)
7103 v.AuxInt = int32ToAuxInt(c >> uint64(d))
7104 v.AddArg3(ptr, val, mem)
7105 return true
7106 }
7107 return false
7108 }
7109 func rewriteValueARM_OpARMMOVWstoreshiftRL(v *Value) bool {
7110 v_3 := v.Args[3]
7111 v_2 := v.Args[2]
7112 v_1 := v.Args[1]
7113 v_0 := v.Args[0]
7114
7115
7116 for {
7117 d := auxIntToInt32(v.AuxInt)
7118 ptr := v_0
7119 if v_1.Op != OpARMMOVWconst {
7120 break
7121 }
7122 c := auxIntToInt32(v_1.AuxInt)
7123 val := v_2
7124 mem := v_3
7125 v.reset(OpARMMOVWstore)
7126 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
7127 v.AddArg3(ptr, val, mem)
7128 return true
7129 }
7130 return false
7131 }
7132 func rewriteValueARM_OpARMMUL(v *Value) bool {
7133 v_1 := v.Args[1]
7134 v_0 := v.Args[0]
7135 b := v.Block
7136
7137
7138
7139 for {
7140 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7141 x := v_0
7142 if v_1.Op != OpARMMOVWconst {
7143 continue
7144 }
7145 c := auxIntToInt32(v_1.AuxInt)
7146 if !(int32(c) == -1) {
7147 continue
7148 }
7149 v.reset(OpARMRSBconst)
7150 v.AuxInt = int32ToAuxInt(0)
7151 v.AddArg(x)
7152 return true
7153 }
7154 break
7155 }
7156
7157
7158 for {
7159 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7160 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 0 {
7161 continue
7162 }
7163 v.reset(OpARMMOVWconst)
7164 v.AuxInt = int32ToAuxInt(0)
7165 return true
7166 }
7167 break
7168 }
7169
7170
7171 for {
7172 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7173 x := v_0
7174 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 1 {
7175 continue
7176 }
7177 v.copyOf(x)
7178 return true
7179 }
7180 break
7181 }
7182
7183
7184
7185 for {
7186 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7187 x := v_0
7188 if v_1.Op != OpARMMOVWconst {
7189 continue
7190 }
7191 c := auxIntToInt32(v_1.AuxInt)
7192 if !(isPowerOfTwo(c)) {
7193 continue
7194 }
7195 v.reset(OpARMSLLconst)
7196 v.AuxInt = int32ToAuxInt(int32(log32(c)))
7197 v.AddArg(x)
7198 return true
7199 }
7200 break
7201 }
7202
7203
7204
7205 for {
7206 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7207 x := v_0
7208 if v_1.Op != OpARMMOVWconst {
7209 continue
7210 }
7211 c := auxIntToInt32(v_1.AuxInt)
7212 if !(isPowerOfTwo(c-1) && c >= 3) {
7213 continue
7214 }
7215 v.reset(OpARMADDshiftLL)
7216 v.AuxInt = int32ToAuxInt(int32(log32(c - 1)))
7217 v.AddArg2(x, x)
7218 return true
7219 }
7220 break
7221 }
7222
7223
7224
7225 for {
7226 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7227 x := v_0
7228 if v_1.Op != OpARMMOVWconst {
7229 continue
7230 }
7231 c := auxIntToInt32(v_1.AuxInt)
7232 if !(isPowerOfTwo(c+1) && c >= 7) {
7233 continue
7234 }
7235 v.reset(OpARMRSBshiftLL)
7236 v.AuxInt = int32ToAuxInt(int32(log32(c + 1)))
7237 v.AddArg2(x, x)
7238 return true
7239 }
7240 break
7241 }
7242
7243
7244
7245 for {
7246 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7247 x := v_0
7248 if v_1.Op != OpARMMOVWconst {
7249 continue
7250 }
7251 c := auxIntToInt32(v_1.AuxInt)
7252 if !(c%3 == 0 && isPowerOfTwo(c/3)) {
7253 continue
7254 }
7255 v.reset(OpARMSLLconst)
7256 v.AuxInt = int32ToAuxInt(int32(log32(c / 3)))
7257 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7258 v0.AuxInt = int32ToAuxInt(1)
7259 v0.AddArg2(x, x)
7260 v.AddArg(v0)
7261 return true
7262 }
7263 break
7264 }
7265
7266
7267
7268 for {
7269 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7270 x := v_0
7271 if v_1.Op != OpARMMOVWconst {
7272 continue
7273 }
7274 c := auxIntToInt32(v_1.AuxInt)
7275 if !(c%5 == 0 && isPowerOfTwo(c/5)) {
7276 continue
7277 }
7278 v.reset(OpARMSLLconst)
7279 v.AuxInt = int32ToAuxInt(int32(log32(c / 5)))
7280 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7281 v0.AuxInt = int32ToAuxInt(2)
7282 v0.AddArg2(x, x)
7283 v.AddArg(v0)
7284 return true
7285 }
7286 break
7287 }
7288
7289
7290
7291 for {
7292 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7293 x := v_0
7294 if v_1.Op != OpARMMOVWconst {
7295 continue
7296 }
7297 c := auxIntToInt32(v_1.AuxInt)
7298 if !(c%7 == 0 && isPowerOfTwo(c/7)) {
7299 continue
7300 }
7301 v.reset(OpARMSLLconst)
7302 v.AuxInt = int32ToAuxInt(int32(log32(c / 7)))
7303 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7304 v0.AuxInt = int32ToAuxInt(3)
7305 v0.AddArg2(x, x)
7306 v.AddArg(v0)
7307 return true
7308 }
7309 break
7310 }
7311
7312
7313
7314 for {
7315 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7316 x := v_0
7317 if v_1.Op != OpARMMOVWconst {
7318 continue
7319 }
7320 c := auxIntToInt32(v_1.AuxInt)
7321 if !(c%9 == 0 && isPowerOfTwo(c/9)) {
7322 continue
7323 }
7324 v.reset(OpARMSLLconst)
7325 v.AuxInt = int32ToAuxInt(int32(log32(c / 9)))
7326 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7327 v0.AuxInt = int32ToAuxInt(3)
7328 v0.AddArg2(x, x)
7329 v.AddArg(v0)
7330 return true
7331 }
7332 break
7333 }
7334
7335
7336 for {
7337 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7338 if v_0.Op != OpARMMOVWconst {
7339 continue
7340 }
7341 c := auxIntToInt32(v_0.AuxInt)
7342 if v_1.Op != OpARMMOVWconst {
7343 continue
7344 }
7345 d := auxIntToInt32(v_1.AuxInt)
7346 v.reset(OpARMMOVWconst)
7347 v.AuxInt = int32ToAuxInt(c * d)
7348 return true
7349 }
7350 break
7351 }
7352 return false
7353 }
7354 func rewriteValueARM_OpARMMULA(v *Value) bool {
7355 v_2 := v.Args[2]
7356 v_1 := v.Args[1]
7357 v_0 := v.Args[0]
7358 b := v.Block
7359
7360
7361
7362 for {
7363 x := v_0
7364 if v_1.Op != OpARMMOVWconst {
7365 break
7366 }
7367 c := auxIntToInt32(v_1.AuxInt)
7368 a := v_2
7369 if !(c == -1) {
7370 break
7371 }
7372 v.reset(OpARMSUB)
7373 v.AddArg2(a, x)
7374 return true
7375 }
7376
7377
7378 for {
7379 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 0 {
7380 break
7381 }
7382 a := v_2
7383 v.copyOf(a)
7384 return true
7385 }
7386
7387
7388 for {
7389 x := v_0
7390 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 1 {
7391 break
7392 }
7393 a := v_2
7394 v.reset(OpARMADD)
7395 v.AddArg2(x, a)
7396 return true
7397 }
7398
7399
7400
7401 for {
7402 x := v_0
7403 if v_1.Op != OpARMMOVWconst {
7404 break
7405 }
7406 c := auxIntToInt32(v_1.AuxInt)
7407 a := v_2
7408 if !(isPowerOfTwo(c)) {
7409 break
7410 }
7411 v.reset(OpARMADD)
7412 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7413 v0.AuxInt = int32ToAuxInt(int32(log32(c)))
7414 v0.AddArg(x)
7415 v.AddArg2(v0, a)
7416 return true
7417 }
7418
7419
7420
7421 for {
7422 x := v_0
7423 if v_1.Op != OpARMMOVWconst {
7424 break
7425 }
7426 c := auxIntToInt32(v_1.AuxInt)
7427 a := v_2
7428 if !(isPowerOfTwo(c-1) && c >= 3) {
7429 break
7430 }
7431 v.reset(OpARMADD)
7432 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7433 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1)))
7434 v0.AddArg2(x, x)
7435 v.AddArg2(v0, a)
7436 return true
7437 }
7438
7439
7440
7441 for {
7442 x := v_0
7443 if v_1.Op != OpARMMOVWconst {
7444 break
7445 }
7446 c := auxIntToInt32(v_1.AuxInt)
7447 a := v_2
7448 if !(isPowerOfTwo(c+1) && c >= 7) {
7449 break
7450 }
7451 v.reset(OpARMADD)
7452 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7453 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1)))
7454 v0.AddArg2(x, x)
7455 v.AddArg2(v0, a)
7456 return true
7457 }
7458
7459
7460
7461 for {
7462 x := v_0
7463 if v_1.Op != OpARMMOVWconst {
7464 break
7465 }
7466 c := auxIntToInt32(v_1.AuxInt)
7467 a := v_2
7468 if !(c%3 == 0 && isPowerOfTwo(c/3)) {
7469 break
7470 }
7471 v.reset(OpARMADD)
7472 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7473 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3)))
7474 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7475 v1.AuxInt = int32ToAuxInt(1)
7476 v1.AddArg2(x, x)
7477 v0.AddArg(v1)
7478 v.AddArg2(v0, a)
7479 return true
7480 }
7481
7482
7483
7484 for {
7485 x := v_0
7486 if v_1.Op != OpARMMOVWconst {
7487 break
7488 }
7489 c := auxIntToInt32(v_1.AuxInt)
7490 a := v_2
7491 if !(c%5 == 0 && isPowerOfTwo(c/5)) {
7492 break
7493 }
7494 v.reset(OpARMADD)
7495 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7496 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5)))
7497 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7498 v1.AuxInt = int32ToAuxInt(2)
7499 v1.AddArg2(x, x)
7500 v0.AddArg(v1)
7501 v.AddArg2(v0, a)
7502 return true
7503 }
7504
7505
7506
7507 for {
7508 x := v_0
7509 if v_1.Op != OpARMMOVWconst {
7510 break
7511 }
7512 c := auxIntToInt32(v_1.AuxInt)
7513 a := v_2
7514 if !(c%7 == 0 && isPowerOfTwo(c/7)) {
7515 break
7516 }
7517 v.reset(OpARMADD)
7518 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7519 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7)))
7520 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7521 v1.AuxInt = int32ToAuxInt(3)
7522 v1.AddArg2(x, x)
7523 v0.AddArg(v1)
7524 v.AddArg2(v0, a)
7525 return true
7526 }
7527
7528
7529
7530 for {
7531 x := v_0
7532 if v_1.Op != OpARMMOVWconst {
7533 break
7534 }
7535 c := auxIntToInt32(v_1.AuxInt)
7536 a := v_2
7537 if !(c%9 == 0 && isPowerOfTwo(c/9)) {
7538 break
7539 }
7540 v.reset(OpARMADD)
7541 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7542 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9)))
7543 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7544 v1.AuxInt = int32ToAuxInt(3)
7545 v1.AddArg2(x, x)
7546 v0.AddArg(v1)
7547 v.AddArg2(v0, a)
7548 return true
7549 }
7550
7551
7552
7553 for {
7554 if v_0.Op != OpARMMOVWconst {
7555 break
7556 }
7557 c := auxIntToInt32(v_0.AuxInt)
7558 x := v_1
7559 a := v_2
7560 if !(c == -1) {
7561 break
7562 }
7563 v.reset(OpARMSUB)
7564 v.AddArg2(a, x)
7565 return true
7566 }
7567
7568
7569 for {
7570 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 0 {
7571 break
7572 }
7573 a := v_2
7574 v.copyOf(a)
7575 return true
7576 }
7577
7578
7579 for {
7580 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 1 {
7581 break
7582 }
7583 x := v_1
7584 a := v_2
7585 v.reset(OpARMADD)
7586 v.AddArg2(x, a)
7587 return true
7588 }
7589
7590
7591
7592 for {
7593 if v_0.Op != OpARMMOVWconst {
7594 break
7595 }
7596 c := auxIntToInt32(v_0.AuxInt)
7597 x := v_1
7598 a := v_2
7599 if !(isPowerOfTwo(c)) {
7600 break
7601 }
7602 v.reset(OpARMADD)
7603 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7604 v0.AuxInt = int32ToAuxInt(int32(log32(c)))
7605 v0.AddArg(x)
7606 v.AddArg2(v0, a)
7607 return true
7608 }
7609
7610
7611
7612 for {
7613 if v_0.Op != OpARMMOVWconst {
7614 break
7615 }
7616 c := auxIntToInt32(v_0.AuxInt)
7617 x := v_1
7618 a := v_2
7619 if !(isPowerOfTwo(c-1) && c >= 3) {
7620 break
7621 }
7622 v.reset(OpARMADD)
7623 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7624 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1)))
7625 v0.AddArg2(x, x)
7626 v.AddArg2(v0, a)
7627 return true
7628 }
7629
7630
7631
7632 for {
7633 if v_0.Op != OpARMMOVWconst {
7634 break
7635 }
7636 c := auxIntToInt32(v_0.AuxInt)
7637 x := v_1
7638 a := v_2
7639 if !(isPowerOfTwo(c+1) && c >= 7) {
7640 break
7641 }
7642 v.reset(OpARMADD)
7643 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7644 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1)))
7645 v0.AddArg2(x, x)
7646 v.AddArg2(v0, a)
7647 return true
7648 }
7649
7650
7651
7652 for {
7653 if v_0.Op != OpARMMOVWconst {
7654 break
7655 }
7656 c := auxIntToInt32(v_0.AuxInt)
7657 x := v_1
7658 a := v_2
7659 if !(c%3 == 0 && isPowerOfTwo(c/3)) {
7660 break
7661 }
7662 v.reset(OpARMADD)
7663 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7664 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3)))
7665 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7666 v1.AuxInt = int32ToAuxInt(1)
7667 v1.AddArg2(x, x)
7668 v0.AddArg(v1)
7669 v.AddArg2(v0, a)
7670 return true
7671 }
7672
7673
7674
7675 for {
7676 if v_0.Op != OpARMMOVWconst {
7677 break
7678 }
7679 c := auxIntToInt32(v_0.AuxInt)
7680 x := v_1
7681 a := v_2
7682 if !(c%5 == 0 && isPowerOfTwo(c/5)) {
7683 break
7684 }
7685 v.reset(OpARMADD)
7686 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7687 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5)))
7688 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7689 v1.AuxInt = int32ToAuxInt(2)
7690 v1.AddArg2(x, x)
7691 v0.AddArg(v1)
7692 v.AddArg2(v0, a)
7693 return true
7694 }
7695
7696
7697
7698 for {
7699 if v_0.Op != OpARMMOVWconst {
7700 break
7701 }
7702 c := auxIntToInt32(v_0.AuxInt)
7703 x := v_1
7704 a := v_2
7705 if !(c%7 == 0 && isPowerOfTwo(c/7)) {
7706 break
7707 }
7708 v.reset(OpARMADD)
7709 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7710 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7)))
7711 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7712 v1.AuxInt = int32ToAuxInt(3)
7713 v1.AddArg2(x, x)
7714 v0.AddArg(v1)
7715 v.AddArg2(v0, a)
7716 return true
7717 }
7718
7719
7720
7721 for {
7722 if v_0.Op != OpARMMOVWconst {
7723 break
7724 }
7725 c := auxIntToInt32(v_0.AuxInt)
7726 x := v_1
7727 a := v_2
7728 if !(c%9 == 0 && isPowerOfTwo(c/9)) {
7729 break
7730 }
7731 v.reset(OpARMADD)
7732 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7733 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9)))
7734 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7735 v1.AuxInt = int32ToAuxInt(3)
7736 v1.AddArg2(x, x)
7737 v0.AddArg(v1)
7738 v.AddArg2(v0, a)
7739 return true
7740 }
7741
7742
7743 for {
7744 if v_0.Op != OpARMMOVWconst {
7745 break
7746 }
7747 c := auxIntToInt32(v_0.AuxInt)
7748 if v_1.Op != OpARMMOVWconst {
7749 break
7750 }
7751 d := auxIntToInt32(v_1.AuxInt)
7752 a := v_2
7753 v.reset(OpARMADDconst)
7754 v.AuxInt = int32ToAuxInt(c * d)
7755 v.AddArg(a)
7756 return true
7757 }
7758 return false
7759 }
7760 func rewriteValueARM_OpARMMULD(v *Value) bool {
7761 v_1 := v.Args[1]
7762 v_0 := v.Args[0]
7763
7764
7765
7766 for {
7767 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7768 if v_0.Op != OpARMNEGD {
7769 continue
7770 }
7771 x := v_0.Args[0]
7772 y := v_1
7773 if !(buildcfg.GOARM.Version >= 6) {
7774 continue
7775 }
7776 v.reset(OpARMNMULD)
7777 v.AddArg2(x, y)
7778 return true
7779 }
7780 break
7781 }
7782 return false
7783 }
7784 func rewriteValueARM_OpARMMULF(v *Value) bool {
7785 v_1 := v.Args[1]
7786 v_0 := v.Args[0]
7787
7788
7789
7790 for {
7791 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
7792 if v_0.Op != OpARMNEGF {
7793 continue
7794 }
7795 x := v_0.Args[0]
7796 y := v_1
7797 if !(buildcfg.GOARM.Version >= 6) {
7798 continue
7799 }
7800 v.reset(OpARMNMULF)
7801 v.AddArg2(x, y)
7802 return true
7803 }
7804 break
7805 }
7806 return false
7807 }
7808 func rewriteValueARM_OpARMMULS(v *Value) bool {
7809 v_2 := v.Args[2]
7810 v_1 := v.Args[1]
7811 v_0 := v.Args[0]
7812 b := v.Block
7813
7814
7815
7816 for {
7817 x := v_0
7818 if v_1.Op != OpARMMOVWconst {
7819 break
7820 }
7821 c := auxIntToInt32(v_1.AuxInt)
7822 a := v_2
7823 if !(c == -1) {
7824 break
7825 }
7826 v.reset(OpARMADD)
7827 v.AddArg2(a, x)
7828 return true
7829 }
7830
7831
7832 for {
7833 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 0 {
7834 break
7835 }
7836 a := v_2
7837 v.copyOf(a)
7838 return true
7839 }
7840
7841
7842 for {
7843 x := v_0
7844 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 1 {
7845 break
7846 }
7847 a := v_2
7848 v.reset(OpARMRSB)
7849 v.AddArg2(x, a)
7850 return true
7851 }
7852
7853
7854
7855 for {
7856 x := v_0
7857 if v_1.Op != OpARMMOVWconst {
7858 break
7859 }
7860 c := auxIntToInt32(v_1.AuxInt)
7861 a := v_2
7862 if !(isPowerOfTwo(c)) {
7863 break
7864 }
7865 v.reset(OpARMRSB)
7866 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7867 v0.AuxInt = int32ToAuxInt(int32(log32(c)))
7868 v0.AddArg(x)
7869 v.AddArg2(v0, a)
7870 return true
7871 }
7872
7873
7874
7875 for {
7876 x := v_0
7877 if v_1.Op != OpARMMOVWconst {
7878 break
7879 }
7880 c := auxIntToInt32(v_1.AuxInt)
7881 a := v_2
7882 if !(isPowerOfTwo(c-1) && c >= 3) {
7883 break
7884 }
7885 v.reset(OpARMRSB)
7886 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7887 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1)))
7888 v0.AddArg2(x, x)
7889 v.AddArg2(v0, a)
7890 return true
7891 }
7892
7893
7894
7895 for {
7896 x := v_0
7897 if v_1.Op != OpARMMOVWconst {
7898 break
7899 }
7900 c := auxIntToInt32(v_1.AuxInt)
7901 a := v_2
7902 if !(isPowerOfTwo(c+1) && c >= 7) {
7903 break
7904 }
7905 v.reset(OpARMRSB)
7906 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7907 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1)))
7908 v0.AddArg2(x, x)
7909 v.AddArg2(v0, a)
7910 return true
7911 }
7912
7913
7914
7915 for {
7916 x := v_0
7917 if v_1.Op != OpARMMOVWconst {
7918 break
7919 }
7920 c := auxIntToInt32(v_1.AuxInt)
7921 a := v_2
7922 if !(c%3 == 0 && isPowerOfTwo(c/3)) {
7923 break
7924 }
7925 v.reset(OpARMRSB)
7926 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7927 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3)))
7928 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7929 v1.AuxInt = int32ToAuxInt(1)
7930 v1.AddArg2(x, x)
7931 v0.AddArg(v1)
7932 v.AddArg2(v0, a)
7933 return true
7934 }
7935
7936
7937
7938 for {
7939 x := v_0
7940 if v_1.Op != OpARMMOVWconst {
7941 break
7942 }
7943 c := auxIntToInt32(v_1.AuxInt)
7944 a := v_2
7945 if !(c%5 == 0 && isPowerOfTwo(c/5)) {
7946 break
7947 }
7948 v.reset(OpARMRSB)
7949 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7950 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5)))
7951 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7952 v1.AuxInt = int32ToAuxInt(2)
7953 v1.AddArg2(x, x)
7954 v0.AddArg(v1)
7955 v.AddArg2(v0, a)
7956 return true
7957 }
7958
7959
7960
7961 for {
7962 x := v_0
7963 if v_1.Op != OpARMMOVWconst {
7964 break
7965 }
7966 c := auxIntToInt32(v_1.AuxInt)
7967 a := v_2
7968 if !(c%7 == 0 && isPowerOfTwo(c/7)) {
7969 break
7970 }
7971 v.reset(OpARMRSB)
7972 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7973 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7)))
7974 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
7975 v1.AuxInt = int32ToAuxInt(3)
7976 v1.AddArg2(x, x)
7977 v0.AddArg(v1)
7978 v.AddArg2(v0, a)
7979 return true
7980 }
7981
7982
7983
7984 for {
7985 x := v_0
7986 if v_1.Op != OpARMMOVWconst {
7987 break
7988 }
7989 c := auxIntToInt32(v_1.AuxInt)
7990 a := v_2
7991 if !(c%9 == 0 && isPowerOfTwo(c/9)) {
7992 break
7993 }
7994 v.reset(OpARMRSB)
7995 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
7996 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9)))
7997 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
7998 v1.AuxInt = int32ToAuxInt(3)
7999 v1.AddArg2(x, x)
8000 v0.AddArg(v1)
8001 v.AddArg2(v0, a)
8002 return true
8003 }
8004
8005
8006
8007 for {
8008 if v_0.Op != OpARMMOVWconst {
8009 break
8010 }
8011 c := auxIntToInt32(v_0.AuxInt)
8012 x := v_1
8013 a := v_2
8014 if !(c == -1) {
8015 break
8016 }
8017 v.reset(OpARMADD)
8018 v.AddArg2(a, x)
8019 return true
8020 }
8021
8022
8023 for {
8024 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 0 {
8025 break
8026 }
8027 a := v_2
8028 v.copyOf(a)
8029 return true
8030 }
8031
8032
8033 for {
8034 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 1 {
8035 break
8036 }
8037 x := v_1
8038 a := v_2
8039 v.reset(OpARMRSB)
8040 v.AddArg2(x, a)
8041 return true
8042 }
8043
8044
8045
8046 for {
8047 if v_0.Op != OpARMMOVWconst {
8048 break
8049 }
8050 c := auxIntToInt32(v_0.AuxInt)
8051 x := v_1
8052 a := v_2
8053 if !(isPowerOfTwo(c)) {
8054 break
8055 }
8056 v.reset(OpARMRSB)
8057 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
8058 v0.AuxInt = int32ToAuxInt(int32(log32(c)))
8059 v0.AddArg(x)
8060 v.AddArg2(v0, a)
8061 return true
8062 }
8063
8064
8065
8066 for {
8067 if v_0.Op != OpARMMOVWconst {
8068 break
8069 }
8070 c := auxIntToInt32(v_0.AuxInt)
8071 x := v_1
8072 a := v_2
8073 if !(isPowerOfTwo(c-1) && c >= 3) {
8074 break
8075 }
8076 v.reset(OpARMRSB)
8077 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
8078 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1)))
8079 v0.AddArg2(x, x)
8080 v.AddArg2(v0, a)
8081 return true
8082 }
8083
8084
8085
8086 for {
8087 if v_0.Op != OpARMMOVWconst {
8088 break
8089 }
8090 c := auxIntToInt32(v_0.AuxInt)
8091 x := v_1
8092 a := v_2
8093 if !(isPowerOfTwo(c+1) && c >= 7) {
8094 break
8095 }
8096 v.reset(OpARMRSB)
8097 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
8098 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1)))
8099 v0.AddArg2(x, x)
8100 v.AddArg2(v0, a)
8101 return true
8102 }
8103
8104
8105
8106 for {
8107 if v_0.Op != OpARMMOVWconst {
8108 break
8109 }
8110 c := auxIntToInt32(v_0.AuxInt)
8111 x := v_1
8112 a := v_2
8113 if !(c%3 == 0 && isPowerOfTwo(c/3)) {
8114 break
8115 }
8116 v.reset(OpARMRSB)
8117 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
8118 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3)))
8119 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
8120 v1.AuxInt = int32ToAuxInt(1)
8121 v1.AddArg2(x, x)
8122 v0.AddArg(v1)
8123 v.AddArg2(v0, a)
8124 return true
8125 }
8126
8127
8128
8129 for {
8130 if v_0.Op != OpARMMOVWconst {
8131 break
8132 }
8133 c := auxIntToInt32(v_0.AuxInt)
8134 x := v_1
8135 a := v_2
8136 if !(c%5 == 0 && isPowerOfTwo(c/5)) {
8137 break
8138 }
8139 v.reset(OpARMRSB)
8140 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
8141 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5)))
8142 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
8143 v1.AuxInt = int32ToAuxInt(2)
8144 v1.AddArg2(x, x)
8145 v0.AddArg(v1)
8146 v.AddArg2(v0, a)
8147 return true
8148 }
8149
8150
8151
8152 for {
8153 if v_0.Op != OpARMMOVWconst {
8154 break
8155 }
8156 c := auxIntToInt32(v_0.AuxInt)
8157 x := v_1
8158 a := v_2
8159 if !(c%7 == 0 && isPowerOfTwo(c/7)) {
8160 break
8161 }
8162 v.reset(OpARMRSB)
8163 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
8164 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7)))
8165 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type)
8166 v1.AuxInt = int32ToAuxInt(3)
8167 v1.AddArg2(x, x)
8168 v0.AddArg(v1)
8169 v.AddArg2(v0, a)
8170 return true
8171 }
8172
8173
8174
8175 for {
8176 if v_0.Op != OpARMMOVWconst {
8177 break
8178 }
8179 c := auxIntToInt32(v_0.AuxInt)
8180 x := v_1
8181 a := v_2
8182 if !(c%9 == 0 && isPowerOfTwo(c/9)) {
8183 break
8184 }
8185 v.reset(OpARMRSB)
8186 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
8187 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9)))
8188 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type)
8189 v1.AuxInt = int32ToAuxInt(3)
8190 v1.AddArg2(x, x)
8191 v0.AddArg(v1)
8192 v.AddArg2(v0, a)
8193 return true
8194 }
8195
8196
8197 for {
8198 if v_0.Op != OpARMMOVWconst {
8199 break
8200 }
8201 c := auxIntToInt32(v_0.AuxInt)
8202 if v_1.Op != OpARMMOVWconst {
8203 break
8204 }
8205 d := auxIntToInt32(v_1.AuxInt)
8206 a := v_2
8207 v.reset(OpARMSUBconst)
8208 v.AuxInt = int32ToAuxInt(c * d)
8209 v.AddArg(a)
8210 return true
8211 }
8212 return false
8213 }
8214 func rewriteValueARM_OpARMMVN(v *Value) bool {
8215 v_0 := v.Args[0]
8216
8217
8218 for {
8219 if v_0.Op != OpARMMOVWconst {
8220 break
8221 }
8222 c := auxIntToInt32(v_0.AuxInt)
8223 v.reset(OpARMMOVWconst)
8224 v.AuxInt = int32ToAuxInt(^c)
8225 return true
8226 }
8227
8228
8229 for {
8230 if v_0.Op != OpARMSLLconst {
8231 break
8232 }
8233 c := auxIntToInt32(v_0.AuxInt)
8234 x := v_0.Args[0]
8235 v.reset(OpARMMVNshiftLL)
8236 v.AuxInt = int32ToAuxInt(c)
8237 v.AddArg(x)
8238 return true
8239 }
8240
8241
8242 for {
8243 if v_0.Op != OpARMSRLconst {
8244 break
8245 }
8246 c := auxIntToInt32(v_0.AuxInt)
8247 x := v_0.Args[0]
8248 v.reset(OpARMMVNshiftRL)
8249 v.AuxInt = int32ToAuxInt(c)
8250 v.AddArg(x)
8251 return true
8252 }
8253
8254
8255 for {
8256 if v_0.Op != OpARMSRAconst {
8257 break
8258 }
8259 c := auxIntToInt32(v_0.AuxInt)
8260 x := v_0.Args[0]
8261 v.reset(OpARMMVNshiftRA)
8262 v.AuxInt = int32ToAuxInt(c)
8263 v.AddArg(x)
8264 return true
8265 }
8266
8267
8268 for {
8269 if v_0.Op != OpARMSLL {
8270 break
8271 }
8272 y := v_0.Args[1]
8273 x := v_0.Args[0]
8274 v.reset(OpARMMVNshiftLLreg)
8275 v.AddArg2(x, y)
8276 return true
8277 }
8278
8279
8280 for {
8281 if v_0.Op != OpARMSRL {
8282 break
8283 }
8284 y := v_0.Args[1]
8285 x := v_0.Args[0]
8286 v.reset(OpARMMVNshiftRLreg)
8287 v.AddArg2(x, y)
8288 return true
8289 }
8290
8291
8292 for {
8293 if v_0.Op != OpARMSRA {
8294 break
8295 }
8296 y := v_0.Args[1]
8297 x := v_0.Args[0]
8298 v.reset(OpARMMVNshiftRAreg)
8299 v.AddArg2(x, y)
8300 return true
8301 }
8302 return false
8303 }
8304 func rewriteValueARM_OpARMMVNshiftLL(v *Value) bool {
8305 v_0 := v.Args[0]
8306
8307
8308 for {
8309 d := auxIntToInt32(v.AuxInt)
8310 if v_0.Op != OpARMMOVWconst {
8311 break
8312 }
8313 c := auxIntToInt32(v_0.AuxInt)
8314 v.reset(OpARMMOVWconst)
8315 v.AuxInt = int32ToAuxInt(^(c << uint64(d)))
8316 return true
8317 }
8318 return false
8319 }
8320 func rewriteValueARM_OpARMMVNshiftLLreg(v *Value) bool {
8321 v_1 := v.Args[1]
8322 v_0 := v.Args[0]
8323
8324
8325
8326 for {
8327 x := v_0
8328 if v_1.Op != OpARMMOVWconst {
8329 break
8330 }
8331 c := auxIntToInt32(v_1.AuxInt)
8332 if !(0 <= c && c < 32) {
8333 break
8334 }
8335 v.reset(OpARMMVNshiftLL)
8336 v.AuxInt = int32ToAuxInt(c)
8337 v.AddArg(x)
8338 return true
8339 }
8340 return false
8341 }
8342 func rewriteValueARM_OpARMMVNshiftRA(v *Value) bool {
8343 v_0 := v.Args[0]
8344
8345
8346 for {
8347 d := auxIntToInt32(v.AuxInt)
8348 if v_0.Op != OpARMMOVWconst {
8349 break
8350 }
8351 c := auxIntToInt32(v_0.AuxInt)
8352 v.reset(OpARMMOVWconst)
8353 v.AuxInt = int32ToAuxInt(int32(c) >> uint64(d))
8354 return true
8355 }
8356 return false
8357 }
8358 func rewriteValueARM_OpARMMVNshiftRAreg(v *Value) bool {
8359 v_1 := v.Args[1]
8360 v_0 := v.Args[0]
8361
8362
8363
8364 for {
8365 x := v_0
8366 if v_1.Op != OpARMMOVWconst {
8367 break
8368 }
8369 c := auxIntToInt32(v_1.AuxInt)
8370 if !(0 <= c && c < 32) {
8371 break
8372 }
8373 v.reset(OpARMMVNshiftRA)
8374 v.AuxInt = int32ToAuxInt(c)
8375 v.AddArg(x)
8376 return true
8377 }
8378 return false
8379 }
8380 func rewriteValueARM_OpARMMVNshiftRL(v *Value) bool {
8381 v_0 := v.Args[0]
8382
8383
8384 for {
8385 d := auxIntToInt32(v.AuxInt)
8386 if v_0.Op != OpARMMOVWconst {
8387 break
8388 }
8389 c := auxIntToInt32(v_0.AuxInt)
8390 v.reset(OpARMMOVWconst)
8391 v.AuxInt = int32ToAuxInt(^int32(uint32(c) >> uint64(d)))
8392 return true
8393 }
8394 return false
8395 }
8396 func rewriteValueARM_OpARMMVNshiftRLreg(v *Value) bool {
8397 v_1 := v.Args[1]
8398 v_0 := v.Args[0]
8399
8400
8401
8402 for {
8403 x := v_0
8404 if v_1.Op != OpARMMOVWconst {
8405 break
8406 }
8407 c := auxIntToInt32(v_1.AuxInt)
8408 if !(0 <= c && c < 32) {
8409 break
8410 }
8411 v.reset(OpARMMVNshiftRL)
8412 v.AuxInt = int32ToAuxInt(c)
8413 v.AddArg(x)
8414 return true
8415 }
8416 return false
8417 }
8418 func rewriteValueARM_OpARMNEGD(v *Value) bool {
8419 v_0 := v.Args[0]
8420
8421
8422
8423 for {
8424 if v_0.Op != OpARMMULD {
8425 break
8426 }
8427 y := v_0.Args[1]
8428 x := v_0.Args[0]
8429 if !(buildcfg.GOARM.Version >= 6) {
8430 break
8431 }
8432 v.reset(OpARMNMULD)
8433 v.AddArg2(x, y)
8434 return true
8435 }
8436 return false
8437 }
8438 func rewriteValueARM_OpARMNEGF(v *Value) bool {
8439 v_0 := v.Args[0]
8440
8441
8442
8443 for {
8444 if v_0.Op != OpARMMULF {
8445 break
8446 }
8447 y := v_0.Args[1]
8448 x := v_0.Args[0]
8449 if !(buildcfg.GOARM.Version >= 6) {
8450 break
8451 }
8452 v.reset(OpARMNMULF)
8453 v.AddArg2(x, y)
8454 return true
8455 }
8456 return false
8457 }
8458 func rewriteValueARM_OpARMNMULD(v *Value) bool {
8459 v_1 := v.Args[1]
8460 v_0 := v.Args[0]
8461
8462
8463 for {
8464 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8465 if v_0.Op != OpARMNEGD {
8466 continue
8467 }
8468 x := v_0.Args[0]
8469 y := v_1
8470 v.reset(OpARMMULD)
8471 v.AddArg2(x, y)
8472 return true
8473 }
8474 break
8475 }
8476 return false
8477 }
8478 func rewriteValueARM_OpARMNMULF(v *Value) bool {
8479 v_1 := v.Args[1]
8480 v_0 := v.Args[0]
8481
8482
8483 for {
8484 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8485 if v_0.Op != OpARMNEGF {
8486 continue
8487 }
8488 x := v_0.Args[0]
8489 y := v_1
8490 v.reset(OpARMMULF)
8491 v.AddArg2(x, y)
8492 return true
8493 }
8494 break
8495 }
8496 return false
8497 }
8498 func rewriteValueARM_OpARMNotEqual(v *Value) bool {
8499 v_0 := v.Args[0]
8500
8501
8502 for {
8503 if v_0.Op != OpARMFlagConstant {
8504 break
8505 }
8506 fc := auxIntToFlagConstant(v_0.AuxInt)
8507 v.reset(OpARMMOVWconst)
8508 v.AuxInt = int32ToAuxInt(b2i32(fc.ne()))
8509 return true
8510 }
8511
8512
8513 for {
8514 if v_0.Op != OpARMInvertFlags {
8515 break
8516 }
8517 x := v_0.Args[0]
8518 v.reset(OpARMNotEqual)
8519 v.AddArg(x)
8520 return true
8521 }
8522 return false
8523 }
8524 func rewriteValueARM_OpARMOR(v *Value) bool {
8525 v_1 := v.Args[1]
8526 v_0 := v.Args[0]
8527
8528
8529 for {
8530 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8531 x := v_0
8532 if v_1.Op != OpARMMOVWconst {
8533 continue
8534 }
8535 c := auxIntToInt32(v_1.AuxInt)
8536 v.reset(OpARMORconst)
8537 v.AuxInt = int32ToAuxInt(c)
8538 v.AddArg(x)
8539 return true
8540 }
8541 break
8542 }
8543
8544
8545 for {
8546 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8547 x := v_0
8548 if v_1.Op != OpARMSLLconst {
8549 continue
8550 }
8551 c := auxIntToInt32(v_1.AuxInt)
8552 y := v_1.Args[0]
8553 v.reset(OpARMORshiftLL)
8554 v.AuxInt = int32ToAuxInt(c)
8555 v.AddArg2(x, y)
8556 return true
8557 }
8558 break
8559 }
8560
8561
8562 for {
8563 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8564 x := v_0
8565 if v_1.Op != OpARMSRLconst {
8566 continue
8567 }
8568 c := auxIntToInt32(v_1.AuxInt)
8569 y := v_1.Args[0]
8570 v.reset(OpARMORshiftRL)
8571 v.AuxInt = int32ToAuxInt(c)
8572 v.AddArg2(x, y)
8573 return true
8574 }
8575 break
8576 }
8577
8578
8579 for {
8580 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8581 x := v_0
8582 if v_1.Op != OpARMSRAconst {
8583 continue
8584 }
8585 c := auxIntToInt32(v_1.AuxInt)
8586 y := v_1.Args[0]
8587 v.reset(OpARMORshiftRA)
8588 v.AuxInt = int32ToAuxInt(c)
8589 v.AddArg2(x, y)
8590 return true
8591 }
8592 break
8593 }
8594
8595
8596 for {
8597 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8598 x := v_0
8599 if v_1.Op != OpARMSLL {
8600 continue
8601 }
8602 z := v_1.Args[1]
8603 y := v_1.Args[0]
8604 v.reset(OpARMORshiftLLreg)
8605 v.AddArg3(x, y, z)
8606 return true
8607 }
8608 break
8609 }
8610
8611
8612 for {
8613 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8614 x := v_0
8615 if v_1.Op != OpARMSRL {
8616 continue
8617 }
8618 z := v_1.Args[1]
8619 y := v_1.Args[0]
8620 v.reset(OpARMORshiftRLreg)
8621 v.AddArg3(x, y, z)
8622 return true
8623 }
8624 break
8625 }
8626
8627
8628 for {
8629 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
8630 x := v_0
8631 if v_1.Op != OpARMSRA {
8632 continue
8633 }
8634 z := v_1.Args[1]
8635 y := v_1.Args[0]
8636 v.reset(OpARMORshiftRAreg)
8637 v.AddArg3(x, y, z)
8638 return true
8639 }
8640 break
8641 }
8642
8643
8644 for {
8645 x := v_0
8646 if x != v_1 {
8647 break
8648 }
8649 v.copyOf(x)
8650 return true
8651 }
8652 return false
8653 }
8654 func rewriteValueARM_OpARMORconst(v *Value) bool {
8655 v_0 := v.Args[0]
8656
8657
8658 for {
8659 if auxIntToInt32(v.AuxInt) != 0 {
8660 break
8661 }
8662 x := v_0
8663 v.copyOf(x)
8664 return true
8665 }
8666
8667
8668
8669 for {
8670 c := auxIntToInt32(v.AuxInt)
8671 if !(int32(c) == -1) {
8672 break
8673 }
8674 v.reset(OpARMMOVWconst)
8675 v.AuxInt = int32ToAuxInt(-1)
8676 return true
8677 }
8678
8679
8680 for {
8681 c := auxIntToInt32(v.AuxInt)
8682 if v_0.Op != OpARMMOVWconst {
8683 break
8684 }
8685 d := auxIntToInt32(v_0.AuxInt)
8686 v.reset(OpARMMOVWconst)
8687 v.AuxInt = int32ToAuxInt(c | d)
8688 return true
8689 }
8690
8691
8692 for {
8693 c := auxIntToInt32(v.AuxInt)
8694 if v_0.Op != OpARMORconst {
8695 break
8696 }
8697 d := auxIntToInt32(v_0.AuxInt)
8698 x := v_0.Args[0]
8699 v.reset(OpARMORconst)
8700 v.AuxInt = int32ToAuxInt(c | d)
8701 v.AddArg(x)
8702 return true
8703 }
8704 return false
8705 }
8706 func rewriteValueARM_OpARMORshiftLL(v *Value) bool {
8707 v_1 := v.Args[1]
8708 v_0 := v.Args[0]
8709 b := v.Block
8710 typ := &b.Func.Config.Types
8711
8712
8713 for {
8714 d := auxIntToInt32(v.AuxInt)
8715 if v_0.Op != OpARMMOVWconst {
8716 break
8717 }
8718 c := auxIntToInt32(v_0.AuxInt)
8719 x := v_1
8720 v.reset(OpARMORconst)
8721 v.AuxInt = int32ToAuxInt(c)
8722 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
8723 v0.AuxInt = int32ToAuxInt(d)
8724 v0.AddArg(x)
8725 v.AddArg(v0)
8726 return true
8727 }
8728
8729
8730 for {
8731 d := auxIntToInt32(v.AuxInt)
8732 x := v_0
8733 if v_1.Op != OpARMMOVWconst {
8734 break
8735 }
8736 c := auxIntToInt32(v_1.AuxInt)
8737 v.reset(OpARMORconst)
8738 v.AuxInt = int32ToAuxInt(c << uint64(d))
8739 v.AddArg(x)
8740 return true
8741 }
8742
8743
8744 for {
8745 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)) {
8746 break
8747 }
8748 x := v_0.Args[0]
8749 if x != v_1 {
8750 break
8751 }
8752 v.reset(OpARMREV16)
8753 v.AddArg(x)
8754 return true
8755 }
8756
8757
8758
8759 for {
8760 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMSRLconst || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != 24 {
8761 break
8762 }
8763 v_0_0 := v_0.Args[0]
8764 if v_0_0.Op != OpARMSLLconst || auxIntToInt32(v_0_0.AuxInt) != 16 {
8765 break
8766 }
8767 x := v_0_0.Args[0]
8768 if x != v_1 || !(buildcfg.GOARM.Version >= 6) {
8769 break
8770 }
8771 v.reset(OpARMREV16)
8772 v.AddArg(x)
8773 return true
8774 }
8775
8776
8777 for {
8778 c := auxIntToInt32(v.AuxInt)
8779 y := v_0
8780 if y.Op != OpARMSLLconst || auxIntToInt32(y.AuxInt) != c {
8781 break
8782 }
8783 x := y.Args[0]
8784 if x != v_1 {
8785 break
8786 }
8787 v.copyOf(y)
8788 return true
8789 }
8790 return false
8791 }
8792 func rewriteValueARM_OpARMORshiftLLreg(v *Value) bool {
8793 v_2 := v.Args[2]
8794 v_1 := v.Args[1]
8795 v_0 := v.Args[0]
8796 b := v.Block
8797
8798
8799 for {
8800 if v_0.Op != OpARMMOVWconst {
8801 break
8802 }
8803 c := auxIntToInt32(v_0.AuxInt)
8804 x := v_1
8805 y := v_2
8806 v.reset(OpARMORconst)
8807 v.AuxInt = int32ToAuxInt(c)
8808 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
8809 v0.AddArg2(x, y)
8810 v.AddArg(v0)
8811 return true
8812 }
8813
8814
8815
8816 for {
8817 x := v_0
8818 y := v_1
8819 if v_2.Op != OpARMMOVWconst {
8820 break
8821 }
8822 c := auxIntToInt32(v_2.AuxInt)
8823 if !(0 <= c && c < 32) {
8824 break
8825 }
8826 v.reset(OpARMORshiftLL)
8827 v.AuxInt = int32ToAuxInt(c)
8828 v.AddArg2(x, y)
8829 return true
8830 }
8831 return false
8832 }
8833 func rewriteValueARM_OpARMORshiftRA(v *Value) bool {
8834 v_1 := v.Args[1]
8835 v_0 := v.Args[0]
8836 b := v.Block
8837
8838
8839 for {
8840 d := auxIntToInt32(v.AuxInt)
8841 if v_0.Op != OpARMMOVWconst {
8842 break
8843 }
8844 c := auxIntToInt32(v_0.AuxInt)
8845 x := v_1
8846 v.reset(OpARMORconst)
8847 v.AuxInt = int32ToAuxInt(c)
8848 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
8849 v0.AuxInt = int32ToAuxInt(d)
8850 v0.AddArg(x)
8851 v.AddArg(v0)
8852 return true
8853 }
8854
8855
8856 for {
8857 d := auxIntToInt32(v.AuxInt)
8858 x := v_0
8859 if v_1.Op != OpARMMOVWconst {
8860 break
8861 }
8862 c := auxIntToInt32(v_1.AuxInt)
8863 v.reset(OpARMORconst)
8864 v.AuxInt = int32ToAuxInt(c >> uint64(d))
8865 v.AddArg(x)
8866 return true
8867 }
8868
8869
8870 for {
8871 c := auxIntToInt32(v.AuxInt)
8872 y := v_0
8873 if y.Op != OpARMSRAconst || auxIntToInt32(y.AuxInt) != c {
8874 break
8875 }
8876 x := y.Args[0]
8877 if x != v_1 {
8878 break
8879 }
8880 v.copyOf(y)
8881 return true
8882 }
8883 return false
8884 }
8885 func rewriteValueARM_OpARMORshiftRAreg(v *Value) bool {
8886 v_2 := v.Args[2]
8887 v_1 := v.Args[1]
8888 v_0 := v.Args[0]
8889 b := v.Block
8890
8891
8892 for {
8893 if v_0.Op != OpARMMOVWconst {
8894 break
8895 }
8896 c := auxIntToInt32(v_0.AuxInt)
8897 x := v_1
8898 y := v_2
8899 v.reset(OpARMORconst)
8900 v.AuxInt = int32ToAuxInt(c)
8901 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
8902 v0.AddArg2(x, y)
8903 v.AddArg(v0)
8904 return true
8905 }
8906
8907
8908
8909 for {
8910 x := v_0
8911 y := v_1
8912 if v_2.Op != OpARMMOVWconst {
8913 break
8914 }
8915 c := auxIntToInt32(v_2.AuxInt)
8916 if !(0 <= c && c < 32) {
8917 break
8918 }
8919 v.reset(OpARMORshiftRA)
8920 v.AuxInt = int32ToAuxInt(c)
8921 v.AddArg2(x, y)
8922 return true
8923 }
8924 return false
8925 }
8926 func rewriteValueARM_OpARMORshiftRL(v *Value) bool {
8927 v_1 := v.Args[1]
8928 v_0 := v.Args[0]
8929 b := v.Block
8930
8931
8932 for {
8933 d := auxIntToInt32(v.AuxInt)
8934 if v_0.Op != OpARMMOVWconst {
8935 break
8936 }
8937 c := auxIntToInt32(v_0.AuxInt)
8938 x := v_1
8939 v.reset(OpARMORconst)
8940 v.AuxInt = int32ToAuxInt(c)
8941 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
8942 v0.AuxInt = int32ToAuxInt(d)
8943 v0.AddArg(x)
8944 v.AddArg(v0)
8945 return true
8946 }
8947
8948
8949 for {
8950 d := auxIntToInt32(v.AuxInt)
8951 x := v_0
8952 if v_1.Op != OpARMMOVWconst {
8953 break
8954 }
8955 c := auxIntToInt32(v_1.AuxInt)
8956 v.reset(OpARMORconst)
8957 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
8958 v.AddArg(x)
8959 return true
8960 }
8961
8962
8963 for {
8964 c := auxIntToInt32(v.AuxInt)
8965 y := v_0
8966 if y.Op != OpARMSRLconst || auxIntToInt32(y.AuxInt) != c {
8967 break
8968 }
8969 x := y.Args[0]
8970 if x != v_1 {
8971 break
8972 }
8973 v.copyOf(y)
8974 return true
8975 }
8976 return false
8977 }
8978 func rewriteValueARM_OpARMORshiftRLreg(v *Value) bool {
8979 v_2 := v.Args[2]
8980 v_1 := v.Args[1]
8981 v_0 := v.Args[0]
8982 b := v.Block
8983
8984
8985 for {
8986 if v_0.Op != OpARMMOVWconst {
8987 break
8988 }
8989 c := auxIntToInt32(v_0.AuxInt)
8990 x := v_1
8991 y := v_2
8992 v.reset(OpARMORconst)
8993 v.AuxInt = int32ToAuxInt(c)
8994 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
8995 v0.AddArg2(x, y)
8996 v.AddArg(v0)
8997 return true
8998 }
8999
9000
9001
9002 for {
9003 x := v_0
9004 y := v_1
9005 if v_2.Op != OpARMMOVWconst {
9006 break
9007 }
9008 c := auxIntToInt32(v_2.AuxInt)
9009 if !(0 <= c && c < 32) {
9010 break
9011 }
9012 v.reset(OpARMORshiftRL)
9013 v.AuxInt = int32ToAuxInt(c)
9014 v.AddArg2(x, y)
9015 return true
9016 }
9017 return false
9018 }
9019 func rewriteValueARM_OpARMRSB(v *Value) bool {
9020 v_1 := v.Args[1]
9021 v_0 := v.Args[0]
9022
9023
9024 for {
9025 if v_0.Op != OpARMMOVWconst {
9026 break
9027 }
9028 c := auxIntToInt32(v_0.AuxInt)
9029 x := v_1
9030 v.reset(OpARMSUBconst)
9031 v.AuxInt = int32ToAuxInt(c)
9032 v.AddArg(x)
9033 return true
9034 }
9035
9036
9037 for {
9038 x := v_0
9039 if v_1.Op != OpARMMOVWconst {
9040 break
9041 }
9042 c := auxIntToInt32(v_1.AuxInt)
9043 v.reset(OpARMRSBconst)
9044 v.AuxInt = int32ToAuxInt(c)
9045 v.AddArg(x)
9046 return true
9047 }
9048
9049
9050 for {
9051 x := v_0
9052 if v_1.Op != OpARMSLLconst {
9053 break
9054 }
9055 c := auxIntToInt32(v_1.AuxInt)
9056 y := v_1.Args[0]
9057 v.reset(OpARMRSBshiftLL)
9058 v.AuxInt = int32ToAuxInt(c)
9059 v.AddArg2(x, y)
9060 return true
9061 }
9062
9063
9064 for {
9065 if v_0.Op != OpARMSLLconst {
9066 break
9067 }
9068 c := auxIntToInt32(v_0.AuxInt)
9069 y := v_0.Args[0]
9070 x := v_1
9071 v.reset(OpARMSUBshiftLL)
9072 v.AuxInt = int32ToAuxInt(c)
9073 v.AddArg2(x, y)
9074 return true
9075 }
9076
9077
9078 for {
9079 x := v_0
9080 if v_1.Op != OpARMSRLconst {
9081 break
9082 }
9083 c := auxIntToInt32(v_1.AuxInt)
9084 y := v_1.Args[0]
9085 v.reset(OpARMRSBshiftRL)
9086 v.AuxInt = int32ToAuxInt(c)
9087 v.AddArg2(x, y)
9088 return true
9089 }
9090
9091
9092 for {
9093 if v_0.Op != OpARMSRLconst {
9094 break
9095 }
9096 c := auxIntToInt32(v_0.AuxInt)
9097 y := v_0.Args[0]
9098 x := v_1
9099 v.reset(OpARMSUBshiftRL)
9100 v.AuxInt = int32ToAuxInt(c)
9101 v.AddArg2(x, y)
9102 return true
9103 }
9104
9105
9106 for {
9107 x := v_0
9108 if v_1.Op != OpARMSRAconst {
9109 break
9110 }
9111 c := auxIntToInt32(v_1.AuxInt)
9112 y := v_1.Args[0]
9113 v.reset(OpARMRSBshiftRA)
9114 v.AuxInt = int32ToAuxInt(c)
9115 v.AddArg2(x, y)
9116 return true
9117 }
9118
9119
9120 for {
9121 if v_0.Op != OpARMSRAconst {
9122 break
9123 }
9124 c := auxIntToInt32(v_0.AuxInt)
9125 y := v_0.Args[0]
9126 x := v_1
9127 v.reset(OpARMSUBshiftRA)
9128 v.AuxInt = int32ToAuxInt(c)
9129 v.AddArg2(x, y)
9130 return true
9131 }
9132
9133
9134 for {
9135 x := v_0
9136 if v_1.Op != OpARMSLL {
9137 break
9138 }
9139 z := v_1.Args[1]
9140 y := v_1.Args[0]
9141 v.reset(OpARMRSBshiftLLreg)
9142 v.AddArg3(x, y, z)
9143 return true
9144 }
9145
9146
9147 for {
9148 if v_0.Op != OpARMSLL {
9149 break
9150 }
9151 z := v_0.Args[1]
9152 y := v_0.Args[0]
9153 x := v_1
9154 v.reset(OpARMSUBshiftLLreg)
9155 v.AddArg3(x, y, z)
9156 return true
9157 }
9158
9159
9160 for {
9161 x := v_0
9162 if v_1.Op != OpARMSRL {
9163 break
9164 }
9165 z := v_1.Args[1]
9166 y := v_1.Args[0]
9167 v.reset(OpARMRSBshiftRLreg)
9168 v.AddArg3(x, y, z)
9169 return true
9170 }
9171
9172
9173 for {
9174 if v_0.Op != OpARMSRL {
9175 break
9176 }
9177 z := v_0.Args[1]
9178 y := v_0.Args[0]
9179 x := v_1
9180 v.reset(OpARMSUBshiftRLreg)
9181 v.AddArg3(x, y, z)
9182 return true
9183 }
9184
9185
9186 for {
9187 x := v_0
9188 if v_1.Op != OpARMSRA {
9189 break
9190 }
9191 z := v_1.Args[1]
9192 y := v_1.Args[0]
9193 v.reset(OpARMRSBshiftRAreg)
9194 v.AddArg3(x, y, z)
9195 return true
9196 }
9197
9198
9199 for {
9200 if v_0.Op != OpARMSRA {
9201 break
9202 }
9203 z := v_0.Args[1]
9204 y := v_0.Args[0]
9205 x := v_1
9206 v.reset(OpARMSUBshiftRAreg)
9207 v.AddArg3(x, y, z)
9208 return true
9209 }
9210
9211
9212 for {
9213 x := v_0
9214 if x != v_1 {
9215 break
9216 }
9217 v.reset(OpARMMOVWconst)
9218 v.AuxInt = int32ToAuxInt(0)
9219 return true
9220 }
9221
9222
9223
9224 for {
9225 if v_0.Op != OpARMMUL {
9226 break
9227 }
9228 y := v_0.Args[1]
9229 x := v_0.Args[0]
9230 a := v_1
9231 if !(buildcfg.GOARM.Version == 7) {
9232 break
9233 }
9234 v.reset(OpARMMULS)
9235 v.AddArg3(x, y, a)
9236 return true
9237 }
9238 return false
9239 }
9240 func rewriteValueARM_OpARMRSBSshiftLL(v *Value) bool {
9241 v_1 := v.Args[1]
9242 v_0 := v.Args[0]
9243 b := v.Block
9244
9245
9246 for {
9247 d := auxIntToInt32(v.AuxInt)
9248 if v_0.Op != OpARMMOVWconst {
9249 break
9250 }
9251 c := auxIntToInt32(v_0.AuxInt)
9252 x := v_1
9253 v.reset(OpARMSUBSconst)
9254 v.AuxInt = int32ToAuxInt(c)
9255 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
9256 v0.AuxInt = int32ToAuxInt(d)
9257 v0.AddArg(x)
9258 v.AddArg(v0)
9259 return true
9260 }
9261
9262
9263 for {
9264 d := auxIntToInt32(v.AuxInt)
9265 x := v_0
9266 if v_1.Op != OpARMMOVWconst {
9267 break
9268 }
9269 c := auxIntToInt32(v_1.AuxInt)
9270 v.reset(OpARMRSBSconst)
9271 v.AuxInt = int32ToAuxInt(c << uint64(d))
9272 v.AddArg(x)
9273 return true
9274 }
9275 return false
9276 }
9277 func rewriteValueARM_OpARMRSBSshiftLLreg(v *Value) bool {
9278 v_2 := v.Args[2]
9279 v_1 := v.Args[1]
9280 v_0 := v.Args[0]
9281 b := v.Block
9282
9283
9284 for {
9285 if v_0.Op != OpARMMOVWconst {
9286 break
9287 }
9288 c := auxIntToInt32(v_0.AuxInt)
9289 x := v_1
9290 y := v_2
9291 v.reset(OpARMSUBSconst)
9292 v.AuxInt = int32ToAuxInt(c)
9293 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
9294 v0.AddArg2(x, y)
9295 v.AddArg(v0)
9296 return true
9297 }
9298
9299
9300
9301 for {
9302 x := v_0
9303 y := v_1
9304 if v_2.Op != OpARMMOVWconst {
9305 break
9306 }
9307 c := auxIntToInt32(v_2.AuxInt)
9308 if !(0 <= c && c < 32) {
9309 break
9310 }
9311 v.reset(OpARMRSBSshiftLL)
9312 v.AuxInt = int32ToAuxInt(c)
9313 v.AddArg2(x, y)
9314 return true
9315 }
9316 return false
9317 }
9318 func rewriteValueARM_OpARMRSBSshiftRA(v *Value) bool {
9319 v_1 := v.Args[1]
9320 v_0 := v.Args[0]
9321 b := v.Block
9322
9323
9324 for {
9325 d := auxIntToInt32(v.AuxInt)
9326 if v_0.Op != OpARMMOVWconst {
9327 break
9328 }
9329 c := auxIntToInt32(v_0.AuxInt)
9330 x := v_1
9331 v.reset(OpARMSUBSconst)
9332 v.AuxInt = int32ToAuxInt(c)
9333 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
9334 v0.AuxInt = int32ToAuxInt(d)
9335 v0.AddArg(x)
9336 v.AddArg(v0)
9337 return true
9338 }
9339
9340
9341 for {
9342 d := auxIntToInt32(v.AuxInt)
9343 x := v_0
9344 if v_1.Op != OpARMMOVWconst {
9345 break
9346 }
9347 c := auxIntToInt32(v_1.AuxInt)
9348 v.reset(OpARMRSBSconst)
9349 v.AuxInt = int32ToAuxInt(c >> uint64(d))
9350 v.AddArg(x)
9351 return true
9352 }
9353 return false
9354 }
9355 func rewriteValueARM_OpARMRSBSshiftRAreg(v *Value) bool {
9356 v_2 := v.Args[2]
9357 v_1 := v.Args[1]
9358 v_0 := v.Args[0]
9359 b := v.Block
9360
9361
9362 for {
9363 if v_0.Op != OpARMMOVWconst {
9364 break
9365 }
9366 c := auxIntToInt32(v_0.AuxInt)
9367 x := v_1
9368 y := v_2
9369 v.reset(OpARMSUBSconst)
9370 v.AuxInt = int32ToAuxInt(c)
9371 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
9372 v0.AddArg2(x, y)
9373 v.AddArg(v0)
9374 return true
9375 }
9376
9377
9378
9379 for {
9380 x := v_0
9381 y := v_1
9382 if v_2.Op != OpARMMOVWconst {
9383 break
9384 }
9385 c := auxIntToInt32(v_2.AuxInt)
9386 if !(0 <= c && c < 32) {
9387 break
9388 }
9389 v.reset(OpARMRSBSshiftRA)
9390 v.AuxInt = int32ToAuxInt(c)
9391 v.AddArg2(x, y)
9392 return true
9393 }
9394 return false
9395 }
9396 func rewriteValueARM_OpARMRSBSshiftRL(v *Value) bool {
9397 v_1 := v.Args[1]
9398 v_0 := v.Args[0]
9399 b := v.Block
9400
9401
9402 for {
9403 d := auxIntToInt32(v.AuxInt)
9404 if v_0.Op != OpARMMOVWconst {
9405 break
9406 }
9407 c := auxIntToInt32(v_0.AuxInt)
9408 x := v_1
9409 v.reset(OpARMSUBSconst)
9410 v.AuxInt = int32ToAuxInt(c)
9411 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
9412 v0.AuxInt = int32ToAuxInt(d)
9413 v0.AddArg(x)
9414 v.AddArg(v0)
9415 return true
9416 }
9417
9418
9419 for {
9420 d := auxIntToInt32(v.AuxInt)
9421 x := v_0
9422 if v_1.Op != OpARMMOVWconst {
9423 break
9424 }
9425 c := auxIntToInt32(v_1.AuxInt)
9426 v.reset(OpARMRSBSconst)
9427 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
9428 v.AddArg(x)
9429 return true
9430 }
9431 return false
9432 }
9433 func rewriteValueARM_OpARMRSBSshiftRLreg(v *Value) bool {
9434 v_2 := v.Args[2]
9435 v_1 := v.Args[1]
9436 v_0 := v.Args[0]
9437 b := v.Block
9438
9439
9440 for {
9441 if v_0.Op != OpARMMOVWconst {
9442 break
9443 }
9444 c := auxIntToInt32(v_0.AuxInt)
9445 x := v_1
9446 y := v_2
9447 v.reset(OpARMSUBSconst)
9448 v.AuxInt = int32ToAuxInt(c)
9449 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
9450 v0.AddArg2(x, y)
9451 v.AddArg(v0)
9452 return true
9453 }
9454
9455
9456
9457 for {
9458 x := v_0
9459 y := v_1
9460 if v_2.Op != OpARMMOVWconst {
9461 break
9462 }
9463 c := auxIntToInt32(v_2.AuxInt)
9464 if !(0 <= c && c < 32) {
9465 break
9466 }
9467 v.reset(OpARMRSBSshiftRL)
9468 v.AuxInt = int32ToAuxInt(c)
9469 v.AddArg2(x, y)
9470 return true
9471 }
9472 return false
9473 }
9474 func rewriteValueARM_OpARMRSBconst(v *Value) bool {
9475 v_0 := v.Args[0]
9476
9477
9478 for {
9479 c := auxIntToInt32(v.AuxInt)
9480 if v_0.Op != OpARMMOVWconst {
9481 break
9482 }
9483 d := auxIntToInt32(v_0.AuxInt)
9484 v.reset(OpARMMOVWconst)
9485 v.AuxInt = int32ToAuxInt(c - d)
9486 return true
9487 }
9488
9489
9490 for {
9491 c := auxIntToInt32(v.AuxInt)
9492 if v_0.Op != OpARMRSBconst {
9493 break
9494 }
9495 d := auxIntToInt32(v_0.AuxInt)
9496 x := v_0.Args[0]
9497 v.reset(OpARMADDconst)
9498 v.AuxInt = int32ToAuxInt(c - d)
9499 v.AddArg(x)
9500 return true
9501 }
9502
9503
9504 for {
9505 c := auxIntToInt32(v.AuxInt)
9506 if v_0.Op != OpARMADDconst {
9507 break
9508 }
9509 d := auxIntToInt32(v_0.AuxInt)
9510 x := v_0.Args[0]
9511 v.reset(OpARMRSBconst)
9512 v.AuxInt = int32ToAuxInt(c - d)
9513 v.AddArg(x)
9514 return true
9515 }
9516
9517
9518 for {
9519 c := auxIntToInt32(v.AuxInt)
9520 if v_0.Op != OpARMSUBconst {
9521 break
9522 }
9523 d := auxIntToInt32(v_0.AuxInt)
9524 x := v_0.Args[0]
9525 v.reset(OpARMRSBconst)
9526 v.AuxInt = int32ToAuxInt(c + d)
9527 v.AddArg(x)
9528 return true
9529 }
9530 return false
9531 }
9532 func rewriteValueARM_OpARMRSBshiftLL(v *Value) bool {
9533 v_1 := v.Args[1]
9534 v_0 := v.Args[0]
9535 b := v.Block
9536
9537
9538 for {
9539 d := auxIntToInt32(v.AuxInt)
9540 if v_0.Op != OpARMMOVWconst {
9541 break
9542 }
9543 c := auxIntToInt32(v_0.AuxInt)
9544 x := v_1
9545 v.reset(OpARMSUBconst)
9546 v.AuxInt = int32ToAuxInt(c)
9547 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
9548 v0.AuxInt = int32ToAuxInt(d)
9549 v0.AddArg(x)
9550 v.AddArg(v0)
9551 return true
9552 }
9553
9554
9555 for {
9556 d := auxIntToInt32(v.AuxInt)
9557 x := v_0
9558 if v_1.Op != OpARMMOVWconst {
9559 break
9560 }
9561 c := auxIntToInt32(v_1.AuxInt)
9562 v.reset(OpARMRSBconst)
9563 v.AuxInt = int32ToAuxInt(c << uint64(d))
9564 v.AddArg(x)
9565 return true
9566 }
9567
9568
9569 for {
9570 c := auxIntToInt32(v.AuxInt)
9571 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c {
9572 break
9573 }
9574 x := v_0.Args[0]
9575 if x != v_1 {
9576 break
9577 }
9578 v.reset(OpARMMOVWconst)
9579 v.AuxInt = int32ToAuxInt(0)
9580 return true
9581 }
9582 return false
9583 }
9584 func rewriteValueARM_OpARMRSBshiftLLreg(v *Value) bool {
9585 v_2 := v.Args[2]
9586 v_1 := v.Args[1]
9587 v_0 := v.Args[0]
9588 b := v.Block
9589
9590
9591 for {
9592 if v_0.Op != OpARMMOVWconst {
9593 break
9594 }
9595 c := auxIntToInt32(v_0.AuxInt)
9596 x := v_1
9597 y := v_2
9598 v.reset(OpARMSUBconst)
9599 v.AuxInt = int32ToAuxInt(c)
9600 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
9601 v0.AddArg2(x, y)
9602 v.AddArg(v0)
9603 return true
9604 }
9605
9606
9607
9608 for {
9609 x := v_0
9610 y := v_1
9611 if v_2.Op != OpARMMOVWconst {
9612 break
9613 }
9614 c := auxIntToInt32(v_2.AuxInt)
9615 if !(0 <= c && c < 32) {
9616 break
9617 }
9618 v.reset(OpARMRSBshiftLL)
9619 v.AuxInt = int32ToAuxInt(c)
9620 v.AddArg2(x, y)
9621 return true
9622 }
9623 return false
9624 }
9625 func rewriteValueARM_OpARMRSBshiftRA(v *Value) bool {
9626 v_1 := v.Args[1]
9627 v_0 := v.Args[0]
9628 b := v.Block
9629
9630
9631 for {
9632 d := auxIntToInt32(v.AuxInt)
9633 if v_0.Op != OpARMMOVWconst {
9634 break
9635 }
9636 c := auxIntToInt32(v_0.AuxInt)
9637 x := v_1
9638 v.reset(OpARMSUBconst)
9639 v.AuxInt = int32ToAuxInt(c)
9640 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
9641 v0.AuxInt = int32ToAuxInt(d)
9642 v0.AddArg(x)
9643 v.AddArg(v0)
9644 return true
9645 }
9646
9647
9648 for {
9649 d := auxIntToInt32(v.AuxInt)
9650 x := v_0
9651 if v_1.Op != OpARMMOVWconst {
9652 break
9653 }
9654 c := auxIntToInt32(v_1.AuxInt)
9655 v.reset(OpARMRSBconst)
9656 v.AuxInt = int32ToAuxInt(c >> uint64(d))
9657 v.AddArg(x)
9658 return true
9659 }
9660
9661
9662 for {
9663 c := auxIntToInt32(v.AuxInt)
9664 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c {
9665 break
9666 }
9667 x := v_0.Args[0]
9668 if x != v_1 {
9669 break
9670 }
9671 v.reset(OpARMMOVWconst)
9672 v.AuxInt = int32ToAuxInt(0)
9673 return true
9674 }
9675 return false
9676 }
9677 func rewriteValueARM_OpARMRSBshiftRAreg(v *Value) bool {
9678 v_2 := v.Args[2]
9679 v_1 := v.Args[1]
9680 v_0 := v.Args[0]
9681 b := v.Block
9682
9683
9684 for {
9685 if v_0.Op != OpARMMOVWconst {
9686 break
9687 }
9688 c := auxIntToInt32(v_0.AuxInt)
9689 x := v_1
9690 y := v_2
9691 v.reset(OpARMSUBconst)
9692 v.AuxInt = int32ToAuxInt(c)
9693 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
9694 v0.AddArg2(x, y)
9695 v.AddArg(v0)
9696 return true
9697 }
9698
9699
9700
9701 for {
9702 x := v_0
9703 y := v_1
9704 if v_2.Op != OpARMMOVWconst {
9705 break
9706 }
9707 c := auxIntToInt32(v_2.AuxInt)
9708 if !(0 <= c && c < 32) {
9709 break
9710 }
9711 v.reset(OpARMRSBshiftRA)
9712 v.AuxInt = int32ToAuxInt(c)
9713 v.AddArg2(x, y)
9714 return true
9715 }
9716 return false
9717 }
9718 func rewriteValueARM_OpARMRSBshiftRL(v *Value) bool {
9719 v_1 := v.Args[1]
9720 v_0 := v.Args[0]
9721 b := v.Block
9722
9723
9724 for {
9725 d := auxIntToInt32(v.AuxInt)
9726 if v_0.Op != OpARMMOVWconst {
9727 break
9728 }
9729 c := auxIntToInt32(v_0.AuxInt)
9730 x := v_1
9731 v.reset(OpARMSUBconst)
9732 v.AuxInt = int32ToAuxInt(c)
9733 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
9734 v0.AuxInt = int32ToAuxInt(d)
9735 v0.AddArg(x)
9736 v.AddArg(v0)
9737 return true
9738 }
9739
9740
9741 for {
9742 d := auxIntToInt32(v.AuxInt)
9743 x := v_0
9744 if v_1.Op != OpARMMOVWconst {
9745 break
9746 }
9747 c := auxIntToInt32(v_1.AuxInt)
9748 v.reset(OpARMRSBconst)
9749 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
9750 v.AddArg(x)
9751 return true
9752 }
9753
9754
9755 for {
9756 c := auxIntToInt32(v.AuxInt)
9757 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c {
9758 break
9759 }
9760 x := v_0.Args[0]
9761 if x != v_1 {
9762 break
9763 }
9764 v.reset(OpARMMOVWconst)
9765 v.AuxInt = int32ToAuxInt(0)
9766 return true
9767 }
9768 return false
9769 }
9770 func rewriteValueARM_OpARMRSBshiftRLreg(v *Value) bool {
9771 v_2 := v.Args[2]
9772 v_1 := v.Args[1]
9773 v_0 := v.Args[0]
9774 b := v.Block
9775
9776
9777 for {
9778 if v_0.Op != OpARMMOVWconst {
9779 break
9780 }
9781 c := auxIntToInt32(v_0.AuxInt)
9782 x := v_1
9783 y := v_2
9784 v.reset(OpARMSUBconst)
9785 v.AuxInt = int32ToAuxInt(c)
9786 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
9787 v0.AddArg2(x, y)
9788 v.AddArg(v0)
9789 return true
9790 }
9791
9792
9793
9794 for {
9795 x := v_0
9796 y := v_1
9797 if v_2.Op != OpARMMOVWconst {
9798 break
9799 }
9800 c := auxIntToInt32(v_2.AuxInt)
9801 if !(0 <= c && c < 32) {
9802 break
9803 }
9804 v.reset(OpARMRSBshiftRL)
9805 v.AuxInt = int32ToAuxInt(c)
9806 v.AddArg2(x, y)
9807 return true
9808 }
9809 return false
9810 }
9811 func rewriteValueARM_OpARMRSCconst(v *Value) bool {
9812 v_1 := v.Args[1]
9813 v_0 := v.Args[0]
9814
9815
9816 for {
9817 c := auxIntToInt32(v.AuxInt)
9818 if v_0.Op != OpARMADDconst {
9819 break
9820 }
9821 d := auxIntToInt32(v_0.AuxInt)
9822 x := v_0.Args[0]
9823 flags := v_1
9824 v.reset(OpARMRSCconst)
9825 v.AuxInt = int32ToAuxInt(c - d)
9826 v.AddArg2(x, flags)
9827 return true
9828 }
9829
9830
9831 for {
9832 c := auxIntToInt32(v.AuxInt)
9833 if v_0.Op != OpARMSUBconst {
9834 break
9835 }
9836 d := auxIntToInt32(v_0.AuxInt)
9837 x := v_0.Args[0]
9838 flags := v_1
9839 v.reset(OpARMRSCconst)
9840 v.AuxInt = int32ToAuxInt(c + d)
9841 v.AddArg2(x, flags)
9842 return true
9843 }
9844 return false
9845 }
9846 func rewriteValueARM_OpARMRSCshiftLL(v *Value) bool {
9847 v_2 := v.Args[2]
9848 v_1 := v.Args[1]
9849 v_0 := v.Args[0]
9850 b := v.Block
9851
9852
9853 for {
9854 d := auxIntToInt32(v.AuxInt)
9855 if v_0.Op != OpARMMOVWconst {
9856 break
9857 }
9858 c := auxIntToInt32(v_0.AuxInt)
9859 x := v_1
9860 flags := v_2
9861 v.reset(OpARMSBCconst)
9862 v.AuxInt = int32ToAuxInt(c)
9863 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
9864 v0.AuxInt = int32ToAuxInt(d)
9865 v0.AddArg(x)
9866 v.AddArg2(v0, flags)
9867 return true
9868 }
9869
9870
9871 for {
9872 d := auxIntToInt32(v.AuxInt)
9873 x := v_0
9874 if v_1.Op != OpARMMOVWconst {
9875 break
9876 }
9877 c := auxIntToInt32(v_1.AuxInt)
9878 flags := v_2
9879 v.reset(OpARMRSCconst)
9880 v.AuxInt = int32ToAuxInt(c << uint64(d))
9881 v.AddArg2(x, flags)
9882 return true
9883 }
9884 return false
9885 }
9886 func rewriteValueARM_OpARMRSCshiftLLreg(v *Value) bool {
9887 v_3 := v.Args[3]
9888 v_2 := v.Args[2]
9889 v_1 := v.Args[1]
9890 v_0 := v.Args[0]
9891 b := v.Block
9892
9893
9894 for {
9895 if v_0.Op != OpARMMOVWconst {
9896 break
9897 }
9898 c := auxIntToInt32(v_0.AuxInt)
9899 x := v_1
9900 y := v_2
9901 flags := v_3
9902 v.reset(OpARMSBCconst)
9903 v.AuxInt = int32ToAuxInt(c)
9904 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
9905 v0.AddArg2(x, y)
9906 v.AddArg2(v0, flags)
9907 return true
9908 }
9909
9910
9911
9912 for {
9913 x := v_0
9914 y := v_1
9915 if v_2.Op != OpARMMOVWconst {
9916 break
9917 }
9918 c := auxIntToInt32(v_2.AuxInt)
9919 flags := v_3
9920 if !(0 <= c && c < 32) {
9921 break
9922 }
9923 v.reset(OpARMRSCshiftLL)
9924 v.AuxInt = int32ToAuxInt(c)
9925 v.AddArg3(x, y, flags)
9926 return true
9927 }
9928 return false
9929 }
9930 func rewriteValueARM_OpARMRSCshiftRA(v *Value) bool {
9931 v_2 := v.Args[2]
9932 v_1 := v.Args[1]
9933 v_0 := v.Args[0]
9934 b := v.Block
9935
9936
9937 for {
9938 d := auxIntToInt32(v.AuxInt)
9939 if v_0.Op != OpARMMOVWconst {
9940 break
9941 }
9942 c := auxIntToInt32(v_0.AuxInt)
9943 x := v_1
9944 flags := v_2
9945 v.reset(OpARMSBCconst)
9946 v.AuxInt = int32ToAuxInt(c)
9947 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
9948 v0.AuxInt = int32ToAuxInt(d)
9949 v0.AddArg(x)
9950 v.AddArg2(v0, flags)
9951 return true
9952 }
9953
9954
9955 for {
9956 d := auxIntToInt32(v.AuxInt)
9957 x := v_0
9958 if v_1.Op != OpARMMOVWconst {
9959 break
9960 }
9961 c := auxIntToInt32(v_1.AuxInt)
9962 flags := v_2
9963 v.reset(OpARMRSCconst)
9964 v.AuxInt = int32ToAuxInt(c >> uint64(d))
9965 v.AddArg2(x, flags)
9966 return true
9967 }
9968 return false
9969 }
9970 func rewriteValueARM_OpARMRSCshiftRAreg(v *Value) bool {
9971 v_3 := v.Args[3]
9972 v_2 := v.Args[2]
9973 v_1 := v.Args[1]
9974 v_0 := v.Args[0]
9975 b := v.Block
9976
9977
9978 for {
9979 if v_0.Op != OpARMMOVWconst {
9980 break
9981 }
9982 c := auxIntToInt32(v_0.AuxInt)
9983 x := v_1
9984 y := v_2
9985 flags := v_3
9986 v.reset(OpARMSBCconst)
9987 v.AuxInt = int32ToAuxInt(c)
9988 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
9989 v0.AddArg2(x, y)
9990 v.AddArg2(v0, flags)
9991 return true
9992 }
9993
9994
9995
9996 for {
9997 x := v_0
9998 y := v_1
9999 if v_2.Op != OpARMMOVWconst {
10000 break
10001 }
10002 c := auxIntToInt32(v_2.AuxInt)
10003 flags := v_3
10004 if !(0 <= c && c < 32) {
10005 break
10006 }
10007 v.reset(OpARMRSCshiftRA)
10008 v.AuxInt = int32ToAuxInt(c)
10009 v.AddArg3(x, y, flags)
10010 return true
10011 }
10012 return false
10013 }
10014 func rewriteValueARM_OpARMRSCshiftRL(v *Value) bool {
10015 v_2 := v.Args[2]
10016 v_1 := v.Args[1]
10017 v_0 := v.Args[0]
10018 b := v.Block
10019
10020
10021 for {
10022 d := auxIntToInt32(v.AuxInt)
10023 if v_0.Op != OpARMMOVWconst {
10024 break
10025 }
10026 c := auxIntToInt32(v_0.AuxInt)
10027 x := v_1
10028 flags := v_2
10029 v.reset(OpARMSBCconst)
10030 v.AuxInt = int32ToAuxInt(c)
10031 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
10032 v0.AuxInt = int32ToAuxInt(d)
10033 v0.AddArg(x)
10034 v.AddArg2(v0, flags)
10035 return true
10036 }
10037
10038
10039 for {
10040 d := auxIntToInt32(v.AuxInt)
10041 x := v_0
10042 if v_1.Op != OpARMMOVWconst {
10043 break
10044 }
10045 c := auxIntToInt32(v_1.AuxInt)
10046 flags := v_2
10047 v.reset(OpARMRSCconst)
10048 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
10049 v.AddArg2(x, flags)
10050 return true
10051 }
10052 return false
10053 }
10054 func rewriteValueARM_OpARMRSCshiftRLreg(v *Value) bool {
10055 v_3 := v.Args[3]
10056 v_2 := v.Args[2]
10057 v_1 := v.Args[1]
10058 v_0 := v.Args[0]
10059 b := v.Block
10060
10061
10062 for {
10063 if v_0.Op != OpARMMOVWconst {
10064 break
10065 }
10066 c := auxIntToInt32(v_0.AuxInt)
10067 x := v_1
10068 y := v_2
10069 flags := v_3
10070 v.reset(OpARMSBCconst)
10071 v.AuxInt = int32ToAuxInt(c)
10072 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
10073 v0.AddArg2(x, y)
10074 v.AddArg2(v0, flags)
10075 return true
10076 }
10077
10078
10079
10080 for {
10081 x := v_0
10082 y := v_1
10083 if v_2.Op != OpARMMOVWconst {
10084 break
10085 }
10086 c := auxIntToInt32(v_2.AuxInt)
10087 flags := v_3
10088 if !(0 <= c && c < 32) {
10089 break
10090 }
10091 v.reset(OpARMRSCshiftRL)
10092 v.AuxInt = int32ToAuxInt(c)
10093 v.AddArg3(x, y, flags)
10094 return true
10095 }
10096 return false
10097 }
10098 func rewriteValueARM_OpARMSBC(v *Value) bool {
10099 v_2 := v.Args[2]
10100 v_1 := v.Args[1]
10101 v_0 := v.Args[0]
10102
10103
10104 for {
10105 if v_0.Op != OpARMMOVWconst {
10106 break
10107 }
10108 c := auxIntToInt32(v_0.AuxInt)
10109 x := v_1
10110 flags := v_2
10111 v.reset(OpARMRSCconst)
10112 v.AuxInt = int32ToAuxInt(c)
10113 v.AddArg2(x, flags)
10114 return true
10115 }
10116
10117
10118 for {
10119 x := v_0
10120 if v_1.Op != OpARMMOVWconst {
10121 break
10122 }
10123 c := auxIntToInt32(v_1.AuxInt)
10124 flags := v_2
10125 v.reset(OpARMSBCconst)
10126 v.AuxInt = int32ToAuxInt(c)
10127 v.AddArg2(x, flags)
10128 return true
10129 }
10130
10131
10132 for {
10133 x := v_0
10134 if v_1.Op != OpARMSLLconst {
10135 break
10136 }
10137 c := auxIntToInt32(v_1.AuxInt)
10138 y := v_1.Args[0]
10139 flags := v_2
10140 v.reset(OpARMSBCshiftLL)
10141 v.AuxInt = int32ToAuxInt(c)
10142 v.AddArg3(x, y, flags)
10143 return true
10144 }
10145
10146
10147 for {
10148 if v_0.Op != OpARMSLLconst {
10149 break
10150 }
10151 c := auxIntToInt32(v_0.AuxInt)
10152 y := v_0.Args[0]
10153 x := v_1
10154 flags := v_2
10155 v.reset(OpARMRSCshiftLL)
10156 v.AuxInt = int32ToAuxInt(c)
10157 v.AddArg3(x, y, flags)
10158 return true
10159 }
10160
10161
10162 for {
10163 x := v_0
10164 if v_1.Op != OpARMSRLconst {
10165 break
10166 }
10167 c := auxIntToInt32(v_1.AuxInt)
10168 y := v_1.Args[0]
10169 flags := v_2
10170 v.reset(OpARMSBCshiftRL)
10171 v.AuxInt = int32ToAuxInt(c)
10172 v.AddArg3(x, y, flags)
10173 return true
10174 }
10175
10176
10177 for {
10178 if v_0.Op != OpARMSRLconst {
10179 break
10180 }
10181 c := auxIntToInt32(v_0.AuxInt)
10182 y := v_0.Args[0]
10183 x := v_1
10184 flags := v_2
10185 v.reset(OpARMRSCshiftRL)
10186 v.AuxInt = int32ToAuxInt(c)
10187 v.AddArg3(x, y, flags)
10188 return true
10189 }
10190
10191
10192 for {
10193 x := v_0
10194 if v_1.Op != OpARMSRAconst {
10195 break
10196 }
10197 c := auxIntToInt32(v_1.AuxInt)
10198 y := v_1.Args[0]
10199 flags := v_2
10200 v.reset(OpARMSBCshiftRA)
10201 v.AuxInt = int32ToAuxInt(c)
10202 v.AddArg3(x, y, flags)
10203 return true
10204 }
10205
10206
10207 for {
10208 if v_0.Op != OpARMSRAconst {
10209 break
10210 }
10211 c := auxIntToInt32(v_0.AuxInt)
10212 y := v_0.Args[0]
10213 x := v_1
10214 flags := v_2
10215 v.reset(OpARMRSCshiftRA)
10216 v.AuxInt = int32ToAuxInt(c)
10217 v.AddArg3(x, y, flags)
10218 return true
10219 }
10220
10221
10222 for {
10223 x := v_0
10224 if v_1.Op != OpARMSLL {
10225 break
10226 }
10227 z := v_1.Args[1]
10228 y := v_1.Args[0]
10229 flags := v_2
10230 v.reset(OpARMSBCshiftLLreg)
10231 v.AddArg4(x, y, z, flags)
10232 return true
10233 }
10234
10235
10236 for {
10237 if v_0.Op != OpARMSLL {
10238 break
10239 }
10240 z := v_0.Args[1]
10241 y := v_0.Args[0]
10242 x := v_1
10243 flags := v_2
10244 v.reset(OpARMRSCshiftLLreg)
10245 v.AddArg4(x, y, z, flags)
10246 return true
10247 }
10248
10249
10250 for {
10251 x := v_0
10252 if v_1.Op != OpARMSRL {
10253 break
10254 }
10255 z := v_1.Args[1]
10256 y := v_1.Args[0]
10257 flags := v_2
10258 v.reset(OpARMSBCshiftRLreg)
10259 v.AddArg4(x, y, z, flags)
10260 return true
10261 }
10262
10263
10264 for {
10265 if v_0.Op != OpARMSRL {
10266 break
10267 }
10268 z := v_0.Args[1]
10269 y := v_0.Args[0]
10270 x := v_1
10271 flags := v_2
10272 v.reset(OpARMRSCshiftRLreg)
10273 v.AddArg4(x, y, z, flags)
10274 return true
10275 }
10276
10277
10278 for {
10279 x := v_0
10280 if v_1.Op != OpARMSRA {
10281 break
10282 }
10283 z := v_1.Args[1]
10284 y := v_1.Args[0]
10285 flags := v_2
10286 v.reset(OpARMSBCshiftRAreg)
10287 v.AddArg4(x, y, z, flags)
10288 return true
10289 }
10290
10291
10292 for {
10293 if v_0.Op != OpARMSRA {
10294 break
10295 }
10296 z := v_0.Args[1]
10297 y := v_0.Args[0]
10298 x := v_1
10299 flags := v_2
10300 v.reset(OpARMRSCshiftRAreg)
10301 v.AddArg4(x, y, z, flags)
10302 return true
10303 }
10304 return false
10305 }
10306 func rewriteValueARM_OpARMSBCconst(v *Value) bool {
10307 v_1 := v.Args[1]
10308 v_0 := v.Args[0]
10309
10310
10311 for {
10312 c := auxIntToInt32(v.AuxInt)
10313 if v_0.Op != OpARMADDconst {
10314 break
10315 }
10316 d := auxIntToInt32(v_0.AuxInt)
10317 x := v_0.Args[0]
10318 flags := v_1
10319 v.reset(OpARMSBCconst)
10320 v.AuxInt = int32ToAuxInt(c - d)
10321 v.AddArg2(x, flags)
10322 return true
10323 }
10324
10325
10326 for {
10327 c := auxIntToInt32(v.AuxInt)
10328 if v_0.Op != OpARMSUBconst {
10329 break
10330 }
10331 d := auxIntToInt32(v_0.AuxInt)
10332 x := v_0.Args[0]
10333 flags := v_1
10334 v.reset(OpARMSBCconst)
10335 v.AuxInt = int32ToAuxInt(c + d)
10336 v.AddArg2(x, flags)
10337 return true
10338 }
10339 return false
10340 }
10341 func rewriteValueARM_OpARMSBCshiftLL(v *Value) bool {
10342 v_2 := v.Args[2]
10343 v_1 := v.Args[1]
10344 v_0 := v.Args[0]
10345 b := v.Block
10346
10347
10348 for {
10349 d := auxIntToInt32(v.AuxInt)
10350 if v_0.Op != OpARMMOVWconst {
10351 break
10352 }
10353 c := auxIntToInt32(v_0.AuxInt)
10354 x := v_1
10355 flags := v_2
10356 v.reset(OpARMRSCconst)
10357 v.AuxInt = int32ToAuxInt(c)
10358 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
10359 v0.AuxInt = int32ToAuxInt(d)
10360 v0.AddArg(x)
10361 v.AddArg2(v0, flags)
10362 return true
10363 }
10364
10365
10366 for {
10367 d := auxIntToInt32(v.AuxInt)
10368 x := v_0
10369 if v_1.Op != OpARMMOVWconst {
10370 break
10371 }
10372 c := auxIntToInt32(v_1.AuxInt)
10373 flags := v_2
10374 v.reset(OpARMSBCconst)
10375 v.AuxInt = int32ToAuxInt(c << uint64(d))
10376 v.AddArg2(x, flags)
10377 return true
10378 }
10379 return false
10380 }
10381 func rewriteValueARM_OpARMSBCshiftLLreg(v *Value) bool {
10382 v_3 := v.Args[3]
10383 v_2 := v.Args[2]
10384 v_1 := v.Args[1]
10385 v_0 := v.Args[0]
10386 b := v.Block
10387
10388
10389 for {
10390 if v_0.Op != OpARMMOVWconst {
10391 break
10392 }
10393 c := auxIntToInt32(v_0.AuxInt)
10394 x := v_1
10395 y := v_2
10396 flags := v_3
10397 v.reset(OpARMRSCconst)
10398 v.AuxInt = int32ToAuxInt(c)
10399 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
10400 v0.AddArg2(x, y)
10401 v.AddArg2(v0, flags)
10402 return true
10403 }
10404
10405
10406
10407 for {
10408 x := v_0
10409 y := v_1
10410 if v_2.Op != OpARMMOVWconst {
10411 break
10412 }
10413 c := auxIntToInt32(v_2.AuxInt)
10414 flags := v_3
10415 if !(0 <= c && c < 32) {
10416 break
10417 }
10418 v.reset(OpARMSBCshiftLL)
10419 v.AuxInt = int32ToAuxInt(c)
10420 v.AddArg3(x, y, flags)
10421 return true
10422 }
10423 return false
10424 }
10425 func rewriteValueARM_OpARMSBCshiftRA(v *Value) bool {
10426 v_2 := v.Args[2]
10427 v_1 := v.Args[1]
10428 v_0 := v.Args[0]
10429 b := v.Block
10430
10431
10432 for {
10433 d := auxIntToInt32(v.AuxInt)
10434 if v_0.Op != OpARMMOVWconst {
10435 break
10436 }
10437 c := auxIntToInt32(v_0.AuxInt)
10438 x := v_1
10439 flags := v_2
10440 v.reset(OpARMRSCconst)
10441 v.AuxInt = int32ToAuxInt(c)
10442 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
10443 v0.AuxInt = int32ToAuxInt(d)
10444 v0.AddArg(x)
10445 v.AddArg2(v0, flags)
10446 return true
10447 }
10448
10449
10450 for {
10451 d := auxIntToInt32(v.AuxInt)
10452 x := v_0
10453 if v_1.Op != OpARMMOVWconst {
10454 break
10455 }
10456 c := auxIntToInt32(v_1.AuxInt)
10457 flags := v_2
10458 v.reset(OpARMSBCconst)
10459 v.AuxInt = int32ToAuxInt(c >> uint64(d))
10460 v.AddArg2(x, flags)
10461 return true
10462 }
10463 return false
10464 }
10465 func rewriteValueARM_OpARMSBCshiftRAreg(v *Value) bool {
10466 v_3 := v.Args[3]
10467 v_2 := v.Args[2]
10468 v_1 := v.Args[1]
10469 v_0 := v.Args[0]
10470 b := v.Block
10471
10472
10473 for {
10474 if v_0.Op != OpARMMOVWconst {
10475 break
10476 }
10477 c := auxIntToInt32(v_0.AuxInt)
10478 x := v_1
10479 y := v_2
10480 flags := v_3
10481 v.reset(OpARMRSCconst)
10482 v.AuxInt = int32ToAuxInt(c)
10483 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
10484 v0.AddArg2(x, y)
10485 v.AddArg2(v0, flags)
10486 return true
10487 }
10488
10489
10490
10491 for {
10492 x := v_0
10493 y := v_1
10494 if v_2.Op != OpARMMOVWconst {
10495 break
10496 }
10497 c := auxIntToInt32(v_2.AuxInt)
10498 flags := v_3
10499 if !(0 <= c && c < 32) {
10500 break
10501 }
10502 v.reset(OpARMSBCshiftRA)
10503 v.AuxInt = int32ToAuxInt(c)
10504 v.AddArg3(x, y, flags)
10505 return true
10506 }
10507 return false
10508 }
10509 func rewriteValueARM_OpARMSBCshiftRL(v *Value) bool {
10510 v_2 := v.Args[2]
10511 v_1 := v.Args[1]
10512 v_0 := v.Args[0]
10513 b := v.Block
10514
10515
10516 for {
10517 d := auxIntToInt32(v.AuxInt)
10518 if v_0.Op != OpARMMOVWconst {
10519 break
10520 }
10521 c := auxIntToInt32(v_0.AuxInt)
10522 x := v_1
10523 flags := v_2
10524 v.reset(OpARMRSCconst)
10525 v.AuxInt = int32ToAuxInt(c)
10526 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
10527 v0.AuxInt = int32ToAuxInt(d)
10528 v0.AddArg(x)
10529 v.AddArg2(v0, flags)
10530 return true
10531 }
10532
10533
10534 for {
10535 d := auxIntToInt32(v.AuxInt)
10536 x := v_0
10537 if v_1.Op != OpARMMOVWconst {
10538 break
10539 }
10540 c := auxIntToInt32(v_1.AuxInt)
10541 flags := v_2
10542 v.reset(OpARMSBCconst)
10543 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
10544 v.AddArg2(x, flags)
10545 return true
10546 }
10547 return false
10548 }
10549 func rewriteValueARM_OpARMSBCshiftRLreg(v *Value) bool {
10550 v_3 := v.Args[3]
10551 v_2 := v.Args[2]
10552 v_1 := v.Args[1]
10553 v_0 := v.Args[0]
10554 b := v.Block
10555
10556
10557 for {
10558 if v_0.Op != OpARMMOVWconst {
10559 break
10560 }
10561 c := auxIntToInt32(v_0.AuxInt)
10562 x := v_1
10563 y := v_2
10564 flags := v_3
10565 v.reset(OpARMRSCconst)
10566 v.AuxInt = int32ToAuxInt(c)
10567 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
10568 v0.AddArg2(x, y)
10569 v.AddArg2(v0, flags)
10570 return true
10571 }
10572
10573
10574
10575 for {
10576 x := v_0
10577 y := v_1
10578 if v_2.Op != OpARMMOVWconst {
10579 break
10580 }
10581 c := auxIntToInt32(v_2.AuxInt)
10582 flags := v_3
10583 if !(0 <= c && c < 32) {
10584 break
10585 }
10586 v.reset(OpARMSBCshiftRL)
10587 v.AuxInt = int32ToAuxInt(c)
10588 v.AddArg3(x, y, flags)
10589 return true
10590 }
10591 return false
10592 }
10593 func rewriteValueARM_OpARMSLL(v *Value) bool {
10594 v_1 := v.Args[1]
10595 v_0 := v.Args[0]
10596
10597
10598
10599 for {
10600 x := v_0
10601 if v_1.Op != OpARMMOVWconst {
10602 break
10603 }
10604 c := auxIntToInt32(v_1.AuxInt)
10605 if !(0 <= c && c < 32) {
10606 break
10607 }
10608 v.reset(OpARMSLLconst)
10609 v.AuxInt = int32ToAuxInt(c)
10610 v.AddArg(x)
10611 return true
10612 }
10613 return false
10614 }
10615 func rewriteValueARM_OpARMSLLconst(v *Value) bool {
10616 v_0 := v.Args[0]
10617
10618
10619 for {
10620 c := auxIntToInt32(v.AuxInt)
10621 if v_0.Op != OpARMMOVWconst {
10622 break
10623 }
10624 d := auxIntToInt32(v_0.AuxInt)
10625 v.reset(OpARMMOVWconst)
10626 v.AuxInt = int32ToAuxInt(d << uint64(c))
10627 return true
10628 }
10629 return false
10630 }
10631 func rewriteValueARM_OpARMSRA(v *Value) bool {
10632 v_1 := v.Args[1]
10633 v_0 := v.Args[0]
10634
10635
10636
10637 for {
10638 x := v_0
10639 if v_1.Op != OpARMMOVWconst {
10640 break
10641 }
10642 c := auxIntToInt32(v_1.AuxInt)
10643 if !(0 <= c && c < 32) {
10644 break
10645 }
10646 v.reset(OpARMSRAconst)
10647 v.AuxInt = int32ToAuxInt(c)
10648 v.AddArg(x)
10649 return true
10650 }
10651 return false
10652 }
10653 func rewriteValueARM_OpARMSRAcond(v *Value) bool {
10654 v_2 := v.Args[2]
10655 v_1 := v.Args[1]
10656 v_0 := v.Args[0]
10657
10658
10659
10660 for {
10661 x := v_0
10662 if v_2.Op != OpARMFlagConstant {
10663 break
10664 }
10665 fc := auxIntToFlagConstant(v_2.AuxInt)
10666 if !(fc.uge()) {
10667 break
10668 }
10669 v.reset(OpARMSRAconst)
10670 v.AuxInt = int32ToAuxInt(31)
10671 v.AddArg(x)
10672 return true
10673 }
10674
10675
10676
10677 for {
10678 x := v_0
10679 y := v_1
10680 if v_2.Op != OpARMFlagConstant {
10681 break
10682 }
10683 fc := auxIntToFlagConstant(v_2.AuxInt)
10684 if !(fc.ult()) {
10685 break
10686 }
10687 v.reset(OpARMSRA)
10688 v.AddArg2(x, y)
10689 return true
10690 }
10691 return false
10692 }
10693 func rewriteValueARM_OpARMSRAconst(v *Value) bool {
10694 v_0 := v.Args[0]
10695
10696
10697 for {
10698 c := auxIntToInt32(v.AuxInt)
10699 if v_0.Op != OpARMMOVWconst {
10700 break
10701 }
10702 d := auxIntToInt32(v_0.AuxInt)
10703 v.reset(OpARMMOVWconst)
10704 v.AuxInt = int32ToAuxInt(d >> uint64(c))
10705 return true
10706 }
10707
10708
10709
10710 for {
10711 d := auxIntToInt32(v.AuxInt)
10712 if v_0.Op != OpARMSLLconst {
10713 break
10714 }
10715 c := auxIntToInt32(v_0.AuxInt)
10716 x := v_0.Args[0]
10717 if !(buildcfg.GOARM.Version == 7 && uint64(d) >= uint64(c) && uint64(d) <= 31) {
10718 break
10719 }
10720 v.reset(OpARMBFX)
10721 v.AuxInt = int32ToAuxInt((d - c) | (32-d)<<8)
10722 v.AddArg(x)
10723 return true
10724 }
10725 return false
10726 }
10727 func rewriteValueARM_OpARMSRL(v *Value) bool {
10728 v_1 := v.Args[1]
10729 v_0 := v.Args[0]
10730
10731
10732
10733 for {
10734 x := v_0
10735 if v_1.Op != OpARMMOVWconst {
10736 break
10737 }
10738 c := auxIntToInt32(v_1.AuxInt)
10739 if !(0 <= c && c < 32) {
10740 break
10741 }
10742 v.reset(OpARMSRLconst)
10743 v.AuxInt = int32ToAuxInt(c)
10744 v.AddArg(x)
10745 return true
10746 }
10747 return false
10748 }
10749 func rewriteValueARM_OpARMSRLconst(v *Value) bool {
10750 v_0 := v.Args[0]
10751
10752
10753 for {
10754 c := auxIntToInt32(v.AuxInt)
10755 if v_0.Op != OpARMMOVWconst {
10756 break
10757 }
10758 d := auxIntToInt32(v_0.AuxInt)
10759 v.reset(OpARMMOVWconst)
10760 v.AuxInt = int32ToAuxInt(int32(uint32(d) >> uint64(c)))
10761 return true
10762 }
10763
10764
10765
10766 for {
10767 d := auxIntToInt32(v.AuxInt)
10768 if v_0.Op != OpARMSLLconst {
10769 break
10770 }
10771 c := auxIntToInt32(v_0.AuxInt)
10772 x := v_0.Args[0]
10773 if !(buildcfg.GOARM.Version == 7 && uint64(d) >= uint64(c) && uint64(d) <= 31) {
10774 break
10775 }
10776 v.reset(OpARMBFXU)
10777 v.AuxInt = int32ToAuxInt((d - c) | (32-d)<<8)
10778 v.AddArg(x)
10779 return true
10780 }
10781 return false
10782 }
10783 func rewriteValueARM_OpARMSRR(v *Value) bool {
10784 v_1 := v.Args[1]
10785 v_0 := v.Args[0]
10786
10787
10788 for {
10789 x := v_0
10790 if v_1.Op != OpARMMOVWconst {
10791 break
10792 }
10793 c := auxIntToInt32(v_1.AuxInt)
10794 v.reset(OpARMSRRconst)
10795 v.AuxInt = int32ToAuxInt(c & 31)
10796 v.AddArg(x)
10797 return true
10798 }
10799 return false
10800 }
10801 func rewriteValueARM_OpARMSUB(v *Value) bool {
10802 v_1 := v.Args[1]
10803 v_0 := v.Args[0]
10804
10805
10806 for {
10807 if v_0.Op != OpARMMOVWconst {
10808 break
10809 }
10810 c := auxIntToInt32(v_0.AuxInt)
10811 x := v_1
10812 v.reset(OpARMRSBconst)
10813 v.AuxInt = int32ToAuxInt(c)
10814 v.AddArg(x)
10815 return true
10816 }
10817
10818
10819 for {
10820 x := v_0
10821 if v_1.Op != OpARMMOVWconst {
10822 break
10823 }
10824 c := auxIntToInt32(v_1.AuxInt)
10825 v.reset(OpARMSUBconst)
10826 v.AuxInt = int32ToAuxInt(c)
10827 v.AddArg(x)
10828 return true
10829 }
10830
10831
10832 for {
10833 x := v_0
10834 if v_1.Op != OpARMSLLconst {
10835 break
10836 }
10837 c := auxIntToInt32(v_1.AuxInt)
10838 y := v_1.Args[0]
10839 v.reset(OpARMSUBshiftLL)
10840 v.AuxInt = int32ToAuxInt(c)
10841 v.AddArg2(x, y)
10842 return true
10843 }
10844
10845
10846 for {
10847 if v_0.Op != OpARMSLLconst {
10848 break
10849 }
10850 c := auxIntToInt32(v_0.AuxInt)
10851 y := v_0.Args[0]
10852 x := v_1
10853 v.reset(OpARMRSBshiftLL)
10854 v.AuxInt = int32ToAuxInt(c)
10855 v.AddArg2(x, y)
10856 return true
10857 }
10858
10859
10860 for {
10861 x := v_0
10862 if v_1.Op != OpARMSRLconst {
10863 break
10864 }
10865 c := auxIntToInt32(v_1.AuxInt)
10866 y := v_1.Args[0]
10867 v.reset(OpARMSUBshiftRL)
10868 v.AuxInt = int32ToAuxInt(c)
10869 v.AddArg2(x, y)
10870 return true
10871 }
10872
10873
10874 for {
10875 if v_0.Op != OpARMSRLconst {
10876 break
10877 }
10878 c := auxIntToInt32(v_0.AuxInt)
10879 y := v_0.Args[0]
10880 x := v_1
10881 v.reset(OpARMRSBshiftRL)
10882 v.AuxInt = int32ToAuxInt(c)
10883 v.AddArg2(x, y)
10884 return true
10885 }
10886
10887
10888 for {
10889 x := v_0
10890 if v_1.Op != OpARMSRAconst {
10891 break
10892 }
10893 c := auxIntToInt32(v_1.AuxInt)
10894 y := v_1.Args[0]
10895 v.reset(OpARMSUBshiftRA)
10896 v.AuxInt = int32ToAuxInt(c)
10897 v.AddArg2(x, y)
10898 return true
10899 }
10900
10901
10902 for {
10903 if v_0.Op != OpARMSRAconst {
10904 break
10905 }
10906 c := auxIntToInt32(v_0.AuxInt)
10907 y := v_0.Args[0]
10908 x := v_1
10909 v.reset(OpARMRSBshiftRA)
10910 v.AuxInt = int32ToAuxInt(c)
10911 v.AddArg2(x, y)
10912 return true
10913 }
10914
10915
10916 for {
10917 x := v_0
10918 if v_1.Op != OpARMSLL {
10919 break
10920 }
10921 z := v_1.Args[1]
10922 y := v_1.Args[0]
10923 v.reset(OpARMSUBshiftLLreg)
10924 v.AddArg3(x, y, z)
10925 return true
10926 }
10927
10928
10929 for {
10930 if v_0.Op != OpARMSLL {
10931 break
10932 }
10933 z := v_0.Args[1]
10934 y := v_0.Args[0]
10935 x := v_1
10936 v.reset(OpARMRSBshiftLLreg)
10937 v.AddArg3(x, y, z)
10938 return true
10939 }
10940
10941
10942 for {
10943 x := v_0
10944 if v_1.Op != OpARMSRL {
10945 break
10946 }
10947 z := v_1.Args[1]
10948 y := v_1.Args[0]
10949 v.reset(OpARMSUBshiftRLreg)
10950 v.AddArg3(x, y, z)
10951 return true
10952 }
10953
10954
10955 for {
10956 if v_0.Op != OpARMSRL {
10957 break
10958 }
10959 z := v_0.Args[1]
10960 y := v_0.Args[0]
10961 x := v_1
10962 v.reset(OpARMRSBshiftRLreg)
10963 v.AddArg3(x, y, z)
10964 return true
10965 }
10966
10967
10968 for {
10969 x := v_0
10970 if v_1.Op != OpARMSRA {
10971 break
10972 }
10973 z := v_1.Args[1]
10974 y := v_1.Args[0]
10975 v.reset(OpARMSUBshiftRAreg)
10976 v.AddArg3(x, y, z)
10977 return true
10978 }
10979
10980
10981 for {
10982 if v_0.Op != OpARMSRA {
10983 break
10984 }
10985 z := v_0.Args[1]
10986 y := v_0.Args[0]
10987 x := v_1
10988 v.reset(OpARMRSBshiftRAreg)
10989 v.AddArg3(x, y, z)
10990 return true
10991 }
10992
10993
10994 for {
10995 x := v_0
10996 if x != v_1 {
10997 break
10998 }
10999 v.reset(OpARMMOVWconst)
11000 v.AuxInt = int32ToAuxInt(0)
11001 return true
11002 }
11003
11004
11005
11006 for {
11007 a := v_0
11008 if v_1.Op != OpARMMUL {
11009 break
11010 }
11011 y := v_1.Args[1]
11012 x := v_1.Args[0]
11013 if !(buildcfg.GOARM.Version == 7) {
11014 break
11015 }
11016 v.reset(OpARMMULS)
11017 v.AddArg3(x, y, a)
11018 return true
11019 }
11020 return false
11021 }
11022 func rewriteValueARM_OpARMSUBD(v *Value) bool {
11023 v_1 := v.Args[1]
11024 v_0 := v.Args[0]
11025
11026
11027
11028 for {
11029 a := v_0
11030 if v_1.Op != OpARMMULD {
11031 break
11032 }
11033 y := v_1.Args[1]
11034 x := v_1.Args[0]
11035 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
11036 break
11037 }
11038 v.reset(OpARMMULSD)
11039 v.AddArg3(a, x, y)
11040 return true
11041 }
11042
11043
11044
11045 for {
11046 a := v_0
11047 if v_1.Op != OpARMNMULD {
11048 break
11049 }
11050 y := v_1.Args[1]
11051 x := v_1.Args[0]
11052 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
11053 break
11054 }
11055 v.reset(OpARMMULAD)
11056 v.AddArg3(a, x, y)
11057 return true
11058 }
11059 return false
11060 }
11061 func rewriteValueARM_OpARMSUBF(v *Value) bool {
11062 v_1 := v.Args[1]
11063 v_0 := v.Args[0]
11064
11065
11066
11067 for {
11068 a := v_0
11069 if v_1.Op != OpARMMULF {
11070 break
11071 }
11072 y := v_1.Args[1]
11073 x := v_1.Args[0]
11074 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
11075 break
11076 }
11077 v.reset(OpARMMULSF)
11078 v.AddArg3(a, x, y)
11079 return true
11080 }
11081
11082
11083
11084 for {
11085 a := v_0
11086 if v_1.Op != OpARMNMULF {
11087 break
11088 }
11089 y := v_1.Args[1]
11090 x := v_1.Args[0]
11091 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) {
11092 break
11093 }
11094 v.reset(OpARMMULAF)
11095 v.AddArg3(a, x, y)
11096 return true
11097 }
11098 return false
11099 }
11100 func rewriteValueARM_OpARMSUBS(v *Value) bool {
11101 v_1 := v.Args[1]
11102 v_0 := v.Args[0]
11103
11104
11105 for {
11106 x := v_0
11107 if v_1.Op != OpARMMOVWconst {
11108 break
11109 }
11110 c := auxIntToInt32(v_1.AuxInt)
11111 v.reset(OpARMSUBSconst)
11112 v.AuxInt = int32ToAuxInt(c)
11113 v.AddArg(x)
11114 return true
11115 }
11116
11117
11118 for {
11119 x := v_0
11120 if v_1.Op != OpARMSLLconst {
11121 break
11122 }
11123 c := auxIntToInt32(v_1.AuxInt)
11124 y := v_1.Args[0]
11125 v.reset(OpARMSUBSshiftLL)
11126 v.AuxInt = int32ToAuxInt(c)
11127 v.AddArg2(x, y)
11128 return true
11129 }
11130
11131
11132 for {
11133 if v_0.Op != OpARMSLLconst {
11134 break
11135 }
11136 c := auxIntToInt32(v_0.AuxInt)
11137 y := v_0.Args[0]
11138 x := v_1
11139 v.reset(OpARMRSBSshiftLL)
11140 v.AuxInt = int32ToAuxInt(c)
11141 v.AddArg2(x, y)
11142 return true
11143 }
11144
11145
11146 for {
11147 x := v_0
11148 if v_1.Op != OpARMSRLconst {
11149 break
11150 }
11151 c := auxIntToInt32(v_1.AuxInt)
11152 y := v_1.Args[0]
11153 v.reset(OpARMSUBSshiftRL)
11154 v.AuxInt = int32ToAuxInt(c)
11155 v.AddArg2(x, y)
11156 return true
11157 }
11158
11159
11160 for {
11161 if v_0.Op != OpARMSRLconst {
11162 break
11163 }
11164 c := auxIntToInt32(v_0.AuxInt)
11165 y := v_0.Args[0]
11166 x := v_1
11167 v.reset(OpARMRSBSshiftRL)
11168 v.AuxInt = int32ToAuxInt(c)
11169 v.AddArg2(x, y)
11170 return true
11171 }
11172
11173
11174 for {
11175 x := v_0
11176 if v_1.Op != OpARMSRAconst {
11177 break
11178 }
11179 c := auxIntToInt32(v_1.AuxInt)
11180 y := v_1.Args[0]
11181 v.reset(OpARMSUBSshiftRA)
11182 v.AuxInt = int32ToAuxInt(c)
11183 v.AddArg2(x, y)
11184 return true
11185 }
11186
11187
11188 for {
11189 if v_0.Op != OpARMSRAconst {
11190 break
11191 }
11192 c := auxIntToInt32(v_0.AuxInt)
11193 y := v_0.Args[0]
11194 x := v_1
11195 v.reset(OpARMRSBSshiftRA)
11196 v.AuxInt = int32ToAuxInt(c)
11197 v.AddArg2(x, y)
11198 return true
11199 }
11200
11201
11202 for {
11203 x := v_0
11204 if v_1.Op != OpARMSLL {
11205 break
11206 }
11207 z := v_1.Args[1]
11208 y := v_1.Args[0]
11209 v.reset(OpARMSUBSshiftLLreg)
11210 v.AddArg3(x, y, z)
11211 return true
11212 }
11213
11214
11215 for {
11216 if v_0.Op != OpARMSLL {
11217 break
11218 }
11219 z := v_0.Args[1]
11220 y := v_0.Args[0]
11221 x := v_1
11222 v.reset(OpARMRSBSshiftLLreg)
11223 v.AddArg3(x, y, z)
11224 return true
11225 }
11226
11227
11228 for {
11229 x := v_0
11230 if v_1.Op != OpARMSRL {
11231 break
11232 }
11233 z := v_1.Args[1]
11234 y := v_1.Args[0]
11235 v.reset(OpARMSUBSshiftRLreg)
11236 v.AddArg3(x, y, z)
11237 return true
11238 }
11239
11240
11241 for {
11242 if v_0.Op != OpARMSRL {
11243 break
11244 }
11245 z := v_0.Args[1]
11246 y := v_0.Args[0]
11247 x := v_1
11248 v.reset(OpARMRSBSshiftRLreg)
11249 v.AddArg3(x, y, z)
11250 return true
11251 }
11252
11253
11254 for {
11255 x := v_0
11256 if v_1.Op != OpARMSRA {
11257 break
11258 }
11259 z := v_1.Args[1]
11260 y := v_1.Args[0]
11261 v.reset(OpARMSUBSshiftRAreg)
11262 v.AddArg3(x, y, z)
11263 return true
11264 }
11265
11266
11267 for {
11268 if v_0.Op != OpARMSRA {
11269 break
11270 }
11271 z := v_0.Args[1]
11272 y := v_0.Args[0]
11273 x := v_1
11274 v.reset(OpARMRSBSshiftRAreg)
11275 v.AddArg3(x, y, z)
11276 return true
11277 }
11278 return false
11279 }
11280 func rewriteValueARM_OpARMSUBSshiftLL(v *Value) bool {
11281 v_1 := v.Args[1]
11282 v_0 := v.Args[0]
11283 b := v.Block
11284
11285
11286 for {
11287 d := auxIntToInt32(v.AuxInt)
11288 if v_0.Op != OpARMMOVWconst {
11289 break
11290 }
11291 c := auxIntToInt32(v_0.AuxInt)
11292 x := v_1
11293 v.reset(OpARMRSBSconst)
11294 v.AuxInt = int32ToAuxInt(c)
11295 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
11296 v0.AuxInt = int32ToAuxInt(d)
11297 v0.AddArg(x)
11298 v.AddArg(v0)
11299 return true
11300 }
11301
11302
11303 for {
11304 d := auxIntToInt32(v.AuxInt)
11305 x := v_0
11306 if v_1.Op != OpARMMOVWconst {
11307 break
11308 }
11309 c := auxIntToInt32(v_1.AuxInt)
11310 v.reset(OpARMSUBSconst)
11311 v.AuxInt = int32ToAuxInt(c << uint64(d))
11312 v.AddArg(x)
11313 return true
11314 }
11315 return false
11316 }
11317 func rewriteValueARM_OpARMSUBSshiftLLreg(v *Value) bool {
11318 v_2 := v.Args[2]
11319 v_1 := v.Args[1]
11320 v_0 := v.Args[0]
11321 b := v.Block
11322
11323
11324 for {
11325 if v_0.Op != OpARMMOVWconst {
11326 break
11327 }
11328 c := auxIntToInt32(v_0.AuxInt)
11329 x := v_1
11330 y := v_2
11331 v.reset(OpARMRSBSconst)
11332 v.AuxInt = int32ToAuxInt(c)
11333 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
11334 v0.AddArg2(x, y)
11335 v.AddArg(v0)
11336 return true
11337 }
11338
11339
11340
11341 for {
11342 x := v_0
11343 y := v_1
11344 if v_2.Op != OpARMMOVWconst {
11345 break
11346 }
11347 c := auxIntToInt32(v_2.AuxInt)
11348 if !(0 <= c && c < 32) {
11349 break
11350 }
11351 v.reset(OpARMSUBSshiftLL)
11352 v.AuxInt = int32ToAuxInt(c)
11353 v.AddArg2(x, y)
11354 return true
11355 }
11356 return false
11357 }
11358 func rewriteValueARM_OpARMSUBSshiftRA(v *Value) bool {
11359 v_1 := v.Args[1]
11360 v_0 := v.Args[0]
11361 b := v.Block
11362
11363
11364 for {
11365 d := auxIntToInt32(v.AuxInt)
11366 if v_0.Op != OpARMMOVWconst {
11367 break
11368 }
11369 c := auxIntToInt32(v_0.AuxInt)
11370 x := v_1
11371 v.reset(OpARMRSBSconst)
11372 v.AuxInt = int32ToAuxInt(c)
11373 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
11374 v0.AuxInt = int32ToAuxInt(d)
11375 v0.AddArg(x)
11376 v.AddArg(v0)
11377 return true
11378 }
11379
11380
11381 for {
11382 d := auxIntToInt32(v.AuxInt)
11383 x := v_0
11384 if v_1.Op != OpARMMOVWconst {
11385 break
11386 }
11387 c := auxIntToInt32(v_1.AuxInt)
11388 v.reset(OpARMSUBSconst)
11389 v.AuxInt = int32ToAuxInt(c >> uint64(d))
11390 v.AddArg(x)
11391 return true
11392 }
11393 return false
11394 }
11395 func rewriteValueARM_OpARMSUBSshiftRAreg(v *Value) bool {
11396 v_2 := v.Args[2]
11397 v_1 := v.Args[1]
11398 v_0 := v.Args[0]
11399 b := v.Block
11400
11401
11402 for {
11403 if v_0.Op != OpARMMOVWconst {
11404 break
11405 }
11406 c := auxIntToInt32(v_0.AuxInt)
11407 x := v_1
11408 y := v_2
11409 v.reset(OpARMRSBSconst)
11410 v.AuxInt = int32ToAuxInt(c)
11411 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
11412 v0.AddArg2(x, y)
11413 v.AddArg(v0)
11414 return true
11415 }
11416
11417
11418
11419 for {
11420 x := v_0
11421 y := v_1
11422 if v_2.Op != OpARMMOVWconst {
11423 break
11424 }
11425 c := auxIntToInt32(v_2.AuxInt)
11426 if !(0 <= c && c < 32) {
11427 break
11428 }
11429 v.reset(OpARMSUBSshiftRA)
11430 v.AuxInt = int32ToAuxInt(c)
11431 v.AddArg2(x, y)
11432 return true
11433 }
11434 return false
11435 }
11436 func rewriteValueARM_OpARMSUBSshiftRL(v *Value) bool {
11437 v_1 := v.Args[1]
11438 v_0 := v.Args[0]
11439 b := v.Block
11440
11441
11442 for {
11443 d := auxIntToInt32(v.AuxInt)
11444 if v_0.Op != OpARMMOVWconst {
11445 break
11446 }
11447 c := auxIntToInt32(v_0.AuxInt)
11448 x := v_1
11449 v.reset(OpARMRSBSconst)
11450 v.AuxInt = int32ToAuxInt(c)
11451 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
11452 v0.AuxInt = int32ToAuxInt(d)
11453 v0.AddArg(x)
11454 v.AddArg(v0)
11455 return true
11456 }
11457
11458
11459 for {
11460 d := auxIntToInt32(v.AuxInt)
11461 x := v_0
11462 if v_1.Op != OpARMMOVWconst {
11463 break
11464 }
11465 c := auxIntToInt32(v_1.AuxInt)
11466 v.reset(OpARMSUBSconst)
11467 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
11468 v.AddArg(x)
11469 return true
11470 }
11471 return false
11472 }
11473 func rewriteValueARM_OpARMSUBSshiftRLreg(v *Value) bool {
11474 v_2 := v.Args[2]
11475 v_1 := v.Args[1]
11476 v_0 := v.Args[0]
11477 b := v.Block
11478
11479
11480 for {
11481 if v_0.Op != OpARMMOVWconst {
11482 break
11483 }
11484 c := auxIntToInt32(v_0.AuxInt)
11485 x := v_1
11486 y := v_2
11487 v.reset(OpARMRSBSconst)
11488 v.AuxInt = int32ToAuxInt(c)
11489 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
11490 v0.AddArg2(x, y)
11491 v.AddArg(v0)
11492 return true
11493 }
11494
11495
11496
11497 for {
11498 x := v_0
11499 y := v_1
11500 if v_2.Op != OpARMMOVWconst {
11501 break
11502 }
11503 c := auxIntToInt32(v_2.AuxInt)
11504 if !(0 <= c && c < 32) {
11505 break
11506 }
11507 v.reset(OpARMSUBSshiftRL)
11508 v.AuxInt = int32ToAuxInt(c)
11509 v.AddArg2(x, y)
11510 return true
11511 }
11512 return false
11513 }
11514 func rewriteValueARM_OpARMSUBconst(v *Value) bool {
11515 v_0 := v.Args[0]
11516
11517
11518 for {
11519 off1 := auxIntToInt32(v.AuxInt)
11520 if v_0.Op != OpARMMOVWaddr {
11521 break
11522 }
11523 off2 := auxIntToInt32(v_0.AuxInt)
11524 sym := auxToSym(v_0.Aux)
11525 ptr := v_0.Args[0]
11526 v.reset(OpARMMOVWaddr)
11527 v.AuxInt = int32ToAuxInt(off2 - off1)
11528 v.Aux = symToAux(sym)
11529 v.AddArg(ptr)
11530 return true
11531 }
11532
11533
11534 for {
11535 if auxIntToInt32(v.AuxInt) != 0 {
11536 break
11537 }
11538 x := v_0
11539 v.copyOf(x)
11540 return true
11541 }
11542
11543
11544
11545 for {
11546 c := auxIntToInt32(v.AuxInt)
11547 x := v_0
11548 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) {
11549 break
11550 }
11551 v.reset(OpARMADDconst)
11552 v.AuxInt = int32ToAuxInt(-c)
11553 v.AddArg(x)
11554 return true
11555 }
11556
11557
11558
11559 for {
11560 c := auxIntToInt32(v.AuxInt)
11561 x := v_0
11562 if !(buildcfg.GOARM.Version == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && uint32(-c) <= 0xffff) {
11563 break
11564 }
11565 v.reset(OpARMADDconst)
11566 v.AuxInt = int32ToAuxInt(-c)
11567 v.AddArg(x)
11568 return true
11569 }
11570
11571
11572 for {
11573 c := auxIntToInt32(v.AuxInt)
11574 if v_0.Op != OpARMMOVWconst {
11575 break
11576 }
11577 d := auxIntToInt32(v_0.AuxInt)
11578 v.reset(OpARMMOVWconst)
11579 v.AuxInt = int32ToAuxInt(d - c)
11580 return true
11581 }
11582
11583
11584 for {
11585 c := auxIntToInt32(v.AuxInt)
11586 if v_0.Op != OpARMSUBconst {
11587 break
11588 }
11589 d := auxIntToInt32(v_0.AuxInt)
11590 x := v_0.Args[0]
11591 v.reset(OpARMADDconst)
11592 v.AuxInt = int32ToAuxInt(-c - d)
11593 v.AddArg(x)
11594 return true
11595 }
11596
11597
11598 for {
11599 c := auxIntToInt32(v.AuxInt)
11600 if v_0.Op != OpARMADDconst {
11601 break
11602 }
11603 d := auxIntToInt32(v_0.AuxInt)
11604 x := v_0.Args[0]
11605 v.reset(OpARMADDconst)
11606 v.AuxInt = int32ToAuxInt(-c + d)
11607 v.AddArg(x)
11608 return true
11609 }
11610
11611
11612 for {
11613 c := auxIntToInt32(v.AuxInt)
11614 if v_0.Op != OpARMRSBconst {
11615 break
11616 }
11617 d := auxIntToInt32(v_0.AuxInt)
11618 x := v_0.Args[0]
11619 v.reset(OpARMRSBconst)
11620 v.AuxInt = int32ToAuxInt(-c + d)
11621 v.AddArg(x)
11622 return true
11623 }
11624 return false
11625 }
11626 func rewriteValueARM_OpARMSUBshiftLL(v *Value) bool {
11627 v_1 := v.Args[1]
11628 v_0 := v.Args[0]
11629 b := v.Block
11630
11631
11632 for {
11633 d := auxIntToInt32(v.AuxInt)
11634 if v_0.Op != OpARMMOVWconst {
11635 break
11636 }
11637 c := auxIntToInt32(v_0.AuxInt)
11638 x := v_1
11639 v.reset(OpARMRSBconst)
11640 v.AuxInt = int32ToAuxInt(c)
11641 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
11642 v0.AuxInt = int32ToAuxInt(d)
11643 v0.AddArg(x)
11644 v.AddArg(v0)
11645 return true
11646 }
11647
11648
11649 for {
11650 d := auxIntToInt32(v.AuxInt)
11651 x := v_0
11652 if v_1.Op != OpARMMOVWconst {
11653 break
11654 }
11655 c := auxIntToInt32(v_1.AuxInt)
11656 v.reset(OpARMSUBconst)
11657 v.AuxInt = int32ToAuxInt(c << uint64(d))
11658 v.AddArg(x)
11659 return true
11660 }
11661
11662
11663 for {
11664 c := auxIntToInt32(v.AuxInt)
11665 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c {
11666 break
11667 }
11668 x := v_0.Args[0]
11669 if x != v_1 {
11670 break
11671 }
11672 v.reset(OpARMMOVWconst)
11673 v.AuxInt = int32ToAuxInt(0)
11674 return true
11675 }
11676 return false
11677 }
11678 func rewriteValueARM_OpARMSUBshiftLLreg(v *Value) bool {
11679 v_2 := v.Args[2]
11680 v_1 := v.Args[1]
11681 v_0 := v.Args[0]
11682 b := v.Block
11683
11684
11685 for {
11686 if v_0.Op != OpARMMOVWconst {
11687 break
11688 }
11689 c := auxIntToInt32(v_0.AuxInt)
11690 x := v_1
11691 y := v_2
11692 v.reset(OpARMRSBconst)
11693 v.AuxInt = int32ToAuxInt(c)
11694 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
11695 v0.AddArg2(x, y)
11696 v.AddArg(v0)
11697 return true
11698 }
11699
11700
11701
11702 for {
11703 x := v_0
11704 y := v_1
11705 if v_2.Op != OpARMMOVWconst {
11706 break
11707 }
11708 c := auxIntToInt32(v_2.AuxInt)
11709 if !(0 <= c && c < 32) {
11710 break
11711 }
11712 v.reset(OpARMSUBshiftLL)
11713 v.AuxInt = int32ToAuxInt(c)
11714 v.AddArg2(x, y)
11715 return true
11716 }
11717 return false
11718 }
11719 func rewriteValueARM_OpARMSUBshiftRA(v *Value) bool {
11720 v_1 := v.Args[1]
11721 v_0 := v.Args[0]
11722 b := v.Block
11723
11724
11725 for {
11726 d := auxIntToInt32(v.AuxInt)
11727 if v_0.Op != OpARMMOVWconst {
11728 break
11729 }
11730 c := auxIntToInt32(v_0.AuxInt)
11731 x := v_1
11732 v.reset(OpARMRSBconst)
11733 v.AuxInt = int32ToAuxInt(c)
11734 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
11735 v0.AuxInt = int32ToAuxInt(d)
11736 v0.AddArg(x)
11737 v.AddArg(v0)
11738 return true
11739 }
11740
11741
11742 for {
11743 d := auxIntToInt32(v.AuxInt)
11744 x := v_0
11745 if v_1.Op != OpARMMOVWconst {
11746 break
11747 }
11748 c := auxIntToInt32(v_1.AuxInt)
11749 v.reset(OpARMSUBconst)
11750 v.AuxInt = int32ToAuxInt(c >> uint64(d))
11751 v.AddArg(x)
11752 return true
11753 }
11754
11755
11756 for {
11757 c := auxIntToInt32(v.AuxInt)
11758 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c {
11759 break
11760 }
11761 x := v_0.Args[0]
11762 if x != v_1 {
11763 break
11764 }
11765 v.reset(OpARMMOVWconst)
11766 v.AuxInt = int32ToAuxInt(0)
11767 return true
11768 }
11769 return false
11770 }
11771 func rewriteValueARM_OpARMSUBshiftRAreg(v *Value) bool {
11772 v_2 := v.Args[2]
11773 v_1 := v.Args[1]
11774 v_0 := v.Args[0]
11775 b := v.Block
11776
11777
11778 for {
11779 if v_0.Op != OpARMMOVWconst {
11780 break
11781 }
11782 c := auxIntToInt32(v_0.AuxInt)
11783 x := v_1
11784 y := v_2
11785 v.reset(OpARMRSBconst)
11786 v.AuxInt = int32ToAuxInt(c)
11787 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
11788 v0.AddArg2(x, y)
11789 v.AddArg(v0)
11790 return true
11791 }
11792
11793
11794
11795 for {
11796 x := v_0
11797 y := v_1
11798 if v_2.Op != OpARMMOVWconst {
11799 break
11800 }
11801 c := auxIntToInt32(v_2.AuxInt)
11802 if !(0 <= c && c < 32) {
11803 break
11804 }
11805 v.reset(OpARMSUBshiftRA)
11806 v.AuxInt = int32ToAuxInt(c)
11807 v.AddArg2(x, y)
11808 return true
11809 }
11810 return false
11811 }
11812 func rewriteValueARM_OpARMSUBshiftRL(v *Value) bool {
11813 v_1 := v.Args[1]
11814 v_0 := v.Args[0]
11815 b := v.Block
11816
11817
11818 for {
11819 d := auxIntToInt32(v.AuxInt)
11820 if v_0.Op != OpARMMOVWconst {
11821 break
11822 }
11823 c := auxIntToInt32(v_0.AuxInt)
11824 x := v_1
11825 v.reset(OpARMRSBconst)
11826 v.AuxInt = int32ToAuxInt(c)
11827 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
11828 v0.AuxInt = int32ToAuxInt(d)
11829 v0.AddArg(x)
11830 v.AddArg(v0)
11831 return true
11832 }
11833
11834
11835 for {
11836 d := auxIntToInt32(v.AuxInt)
11837 x := v_0
11838 if v_1.Op != OpARMMOVWconst {
11839 break
11840 }
11841 c := auxIntToInt32(v_1.AuxInt)
11842 v.reset(OpARMSUBconst)
11843 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
11844 v.AddArg(x)
11845 return true
11846 }
11847
11848
11849 for {
11850 c := auxIntToInt32(v.AuxInt)
11851 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c {
11852 break
11853 }
11854 x := v_0.Args[0]
11855 if x != v_1 {
11856 break
11857 }
11858 v.reset(OpARMMOVWconst)
11859 v.AuxInt = int32ToAuxInt(0)
11860 return true
11861 }
11862 return false
11863 }
11864 func rewriteValueARM_OpARMSUBshiftRLreg(v *Value) bool {
11865 v_2 := v.Args[2]
11866 v_1 := v.Args[1]
11867 v_0 := v.Args[0]
11868 b := v.Block
11869
11870
11871 for {
11872 if v_0.Op != OpARMMOVWconst {
11873 break
11874 }
11875 c := auxIntToInt32(v_0.AuxInt)
11876 x := v_1
11877 y := v_2
11878 v.reset(OpARMRSBconst)
11879 v.AuxInt = int32ToAuxInt(c)
11880 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
11881 v0.AddArg2(x, y)
11882 v.AddArg(v0)
11883 return true
11884 }
11885
11886
11887
11888 for {
11889 x := v_0
11890 y := v_1
11891 if v_2.Op != OpARMMOVWconst {
11892 break
11893 }
11894 c := auxIntToInt32(v_2.AuxInt)
11895 if !(0 <= c && c < 32) {
11896 break
11897 }
11898 v.reset(OpARMSUBshiftRL)
11899 v.AuxInt = int32ToAuxInt(c)
11900 v.AddArg2(x, y)
11901 return true
11902 }
11903 return false
11904 }
11905 func rewriteValueARM_OpARMTEQ(v *Value) bool {
11906 v_1 := v.Args[1]
11907 v_0 := v.Args[0]
11908
11909
11910 for {
11911 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11912 x := v_0
11913 if v_1.Op != OpARMMOVWconst {
11914 continue
11915 }
11916 c := auxIntToInt32(v_1.AuxInt)
11917 v.reset(OpARMTEQconst)
11918 v.AuxInt = int32ToAuxInt(c)
11919 v.AddArg(x)
11920 return true
11921 }
11922 break
11923 }
11924
11925
11926 for {
11927 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11928 x := v_0
11929 if v_1.Op != OpARMSLLconst {
11930 continue
11931 }
11932 c := auxIntToInt32(v_1.AuxInt)
11933 y := v_1.Args[0]
11934 v.reset(OpARMTEQshiftLL)
11935 v.AuxInt = int32ToAuxInt(c)
11936 v.AddArg2(x, y)
11937 return true
11938 }
11939 break
11940 }
11941
11942
11943 for {
11944 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11945 x := v_0
11946 if v_1.Op != OpARMSRLconst {
11947 continue
11948 }
11949 c := auxIntToInt32(v_1.AuxInt)
11950 y := v_1.Args[0]
11951 v.reset(OpARMTEQshiftRL)
11952 v.AuxInt = int32ToAuxInt(c)
11953 v.AddArg2(x, y)
11954 return true
11955 }
11956 break
11957 }
11958
11959
11960 for {
11961 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11962 x := v_0
11963 if v_1.Op != OpARMSRAconst {
11964 continue
11965 }
11966 c := auxIntToInt32(v_1.AuxInt)
11967 y := v_1.Args[0]
11968 v.reset(OpARMTEQshiftRA)
11969 v.AuxInt = int32ToAuxInt(c)
11970 v.AddArg2(x, y)
11971 return true
11972 }
11973 break
11974 }
11975
11976
11977 for {
11978 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11979 x := v_0
11980 if v_1.Op != OpARMSLL {
11981 continue
11982 }
11983 z := v_1.Args[1]
11984 y := v_1.Args[0]
11985 v.reset(OpARMTEQshiftLLreg)
11986 v.AddArg3(x, y, z)
11987 return true
11988 }
11989 break
11990 }
11991
11992
11993 for {
11994 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
11995 x := v_0
11996 if v_1.Op != OpARMSRL {
11997 continue
11998 }
11999 z := v_1.Args[1]
12000 y := v_1.Args[0]
12001 v.reset(OpARMTEQshiftRLreg)
12002 v.AddArg3(x, y, z)
12003 return true
12004 }
12005 break
12006 }
12007
12008
12009 for {
12010 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12011 x := v_0
12012 if v_1.Op != OpARMSRA {
12013 continue
12014 }
12015 z := v_1.Args[1]
12016 y := v_1.Args[0]
12017 v.reset(OpARMTEQshiftRAreg)
12018 v.AddArg3(x, y, z)
12019 return true
12020 }
12021 break
12022 }
12023 return false
12024 }
12025 func rewriteValueARM_OpARMTEQconst(v *Value) bool {
12026 v_0 := v.Args[0]
12027
12028
12029 for {
12030 y := auxIntToInt32(v.AuxInt)
12031 if v_0.Op != OpARMMOVWconst {
12032 break
12033 }
12034 x := auxIntToInt32(v_0.AuxInt)
12035 v.reset(OpARMFlagConstant)
12036 v.AuxInt = flagConstantToAuxInt(logicFlags32(x ^ y))
12037 return true
12038 }
12039 return false
12040 }
12041 func rewriteValueARM_OpARMTEQshiftLL(v *Value) bool {
12042 v_1 := v.Args[1]
12043 v_0 := v.Args[0]
12044 b := v.Block
12045
12046
12047 for {
12048 d := auxIntToInt32(v.AuxInt)
12049 if v_0.Op != OpARMMOVWconst {
12050 break
12051 }
12052 c := auxIntToInt32(v_0.AuxInt)
12053 x := v_1
12054 v.reset(OpARMTEQconst)
12055 v.AuxInt = int32ToAuxInt(c)
12056 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
12057 v0.AuxInt = int32ToAuxInt(d)
12058 v0.AddArg(x)
12059 v.AddArg(v0)
12060 return true
12061 }
12062
12063
12064 for {
12065 d := auxIntToInt32(v.AuxInt)
12066 x := v_0
12067 if v_1.Op != OpARMMOVWconst {
12068 break
12069 }
12070 c := auxIntToInt32(v_1.AuxInt)
12071 v.reset(OpARMTEQconst)
12072 v.AuxInt = int32ToAuxInt(c << uint64(d))
12073 v.AddArg(x)
12074 return true
12075 }
12076 return false
12077 }
12078 func rewriteValueARM_OpARMTEQshiftLLreg(v *Value) bool {
12079 v_2 := v.Args[2]
12080 v_1 := v.Args[1]
12081 v_0 := v.Args[0]
12082 b := v.Block
12083
12084
12085 for {
12086 if v_0.Op != OpARMMOVWconst {
12087 break
12088 }
12089 c := auxIntToInt32(v_0.AuxInt)
12090 x := v_1
12091 y := v_2
12092 v.reset(OpARMTEQconst)
12093 v.AuxInt = int32ToAuxInt(c)
12094 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
12095 v0.AddArg2(x, y)
12096 v.AddArg(v0)
12097 return true
12098 }
12099
12100
12101
12102 for {
12103 x := v_0
12104 y := v_1
12105 if v_2.Op != OpARMMOVWconst {
12106 break
12107 }
12108 c := auxIntToInt32(v_2.AuxInt)
12109 if !(0 <= c && c < 32) {
12110 break
12111 }
12112 v.reset(OpARMTEQshiftLL)
12113 v.AuxInt = int32ToAuxInt(c)
12114 v.AddArg2(x, y)
12115 return true
12116 }
12117 return false
12118 }
12119 func rewriteValueARM_OpARMTEQshiftRA(v *Value) bool {
12120 v_1 := v.Args[1]
12121 v_0 := v.Args[0]
12122 b := v.Block
12123
12124
12125 for {
12126 d := auxIntToInt32(v.AuxInt)
12127 if v_0.Op != OpARMMOVWconst {
12128 break
12129 }
12130 c := auxIntToInt32(v_0.AuxInt)
12131 x := v_1
12132 v.reset(OpARMTEQconst)
12133 v.AuxInt = int32ToAuxInt(c)
12134 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
12135 v0.AuxInt = int32ToAuxInt(d)
12136 v0.AddArg(x)
12137 v.AddArg(v0)
12138 return true
12139 }
12140
12141
12142 for {
12143 d := auxIntToInt32(v.AuxInt)
12144 x := v_0
12145 if v_1.Op != OpARMMOVWconst {
12146 break
12147 }
12148 c := auxIntToInt32(v_1.AuxInt)
12149 v.reset(OpARMTEQconst)
12150 v.AuxInt = int32ToAuxInt(c >> uint64(d))
12151 v.AddArg(x)
12152 return true
12153 }
12154 return false
12155 }
12156 func rewriteValueARM_OpARMTEQshiftRAreg(v *Value) bool {
12157 v_2 := v.Args[2]
12158 v_1 := v.Args[1]
12159 v_0 := v.Args[0]
12160 b := v.Block
12161
12162
12163 for {
12164 if v_0.Op != OpARMMOVWconst {
12165 break
12166 }
12167 c := auxIntToInt32(v_0.AuxInt)
12168 x := v_1
12169 y := v_2
12170 v.reset(OpARMTEQconst)
12171 v.AuxInt = int32ToAuxInt(c)
12172 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
12173 v0.AddArg2(x, y)
12174 v.AddArg(v0)
12175 return true
12176 }
12177
12178
12179
12180 for {
12181 x := v_0
12182 y := v_1
12183 if v_2.Op != OpARMMOVWconst {
12184 break
12185 }
12186 c := auxIntToInt32(v_2.AuxInt)
12187 if !(0 <= c && c < 32) {
12188 break
12189 }
12190 v.reset(OpARMTEQshiftRA)
12191 v.AuxInt = int32ToAuxInt(c)
12192 v.AddArg2(x, y)
12193 return true
12194 }
12195 return false
12196 }
12197 func rewriteValueARM_OpARMTEQshiftRL(v *Value) bool {
12198 v_1 := v.Args[1]
12199 v_0 := v.Args[0]
12200 b := v.Block
12201
12202
12203 for {
12204 d := auxIntToInt32(v.AuxInt)
12205 if v_0.Op != OpARMMOVWconst {
12206 break
12207 }
12208 c := auxIntToInt32(v_0.AuxInt)
12209 x := v_1
12210 v.reset(OpARMTEQconst)
12211 v.AuxInt = int32ToAuxInt(c)
12212 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
12213 v0.AuxInt = int32ToAuxInt(d)
12214 v0.AddArg(x)
12215 v.AddArg(v0)
12216 return true
12217 }
12218
12219
12220 for {
12221 d := auxIntToInt32(v.AuxInt)
12222 x := v_0
12223 if v_1.Op != OpARMMOVWconst {
12224 break
12225 }
12226 c := auxIntToInt32(v_1.AuxInt)
12227 v.reset(OpARMTEQconst)
12228 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
12229 v.AddArg(x)
12230 return true
12231 }
12232 return false
12233 }
12234 func rewriteValueARM_OpARMTEQshiftRLreg(v *Value) bool {
12235 v_2 := v.Args[2]
12236 v_1 := v.Args[1]
12237 v_0 := v.Args[0]
12238 b := v.Block
12239
12240
12241 for {
12242 if v_0.Op != OpARMMOVWconst {
12243 break
12244 }
12245 c := auxIntToInt32(v_0.AuxInt)
12246 x := v_1
12247 y := v_2
12248 v.reset(OpARMTEQconst)
12249 v.AuxInt = int32ToAuxInt(c)
12250 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
12251 v0.AddArg2(x, y)
12252 v.AddArg(v0)
12253 return true
12254 }
12255
12256
12257
12258 for {
12259 x := v_0
12260 y := v_1
12261 if v_2.Op != OpARMMOVWconst {
12262 break
12263 }
12264 c := auxIntToInt32(v_2.AuxInt)
12265 if !(0 <= c && c < 32) {
12266 break
12267 }
12268 v.reset(OpARMTEQshiftRL)
12269 v.AuxInt = int32ToAuxInt(c)
12270 v.AddArg2(x, y)
12271 return true
12272 }
12273 return false
12274 }
12275 func rewriteValueARM_OpARMTST(v *Value) bool {
12276 v_1 := v.Args[1]
12277 v_0 := v.Args[0]
12278
12279
12280 for {
12281 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12282 x := v_0
12283 if v_1.Op != OpARMMOVWconst {
12284 continue
12285 }
12286 c := auxIntToInt32(v_1.AuxInt)
12287 v.reset(OpARMTSTconst)
12288 v.AuxInt = int32ToAuxInt(c)
12289 v.AddArg(x)
12290 return true
12291 }
12292 break
12293 }
12294
12295
12296 for {
12297 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12298 x := v_0
12299 if v_1.Op != OpARMSLLconst {
12300 continue
12301 }
12302 c := auxIntToInt32(v_1.AuxInt)
12303 y := v_1.Args[0]
12304 v.reset(OpARMTSTshiftLL)
12305 v.AuxInt = int32ToAuxInt(c)
12306 v.AddArg2(x, y)
12307 return true
12308 }
12309 break
12310 }
12311
12312
12313 for {
12314 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12315 x := v_0
12316 if v_1.Op != OpARMSRLconst {
12317 continue
12318 }
12319 c := auxIntToInt32(v_1.AuxInt)
12320 y := v_1.Args[0]
12321 v.reset(OpARMTSTshiftRL)
12322 v.AuxInt = int32ToAuxInt(c)
12323 v.AddArg2(x, y)
12324 return true
12325 }
12326 break
12327 }
12328
12329
12330 for {
12331 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12332 x := v_0
12333 if v_1.Op != OpARMSRAconst {
12334 continue
12335 }
12336 c := auxIntToInt32(v_1.AuxInt)
12337 y := v_1.Args[0]
12338 v.reset(OpARMTSTshiftRA)
12339 v.AuxInt = int32ToAuxInt(c)
12340 v.AddArg2(x, y)
12341 return true
12342 }
12343 break
12344 }
12345
12346
12347 for {
12348 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12349 x := v_0
12350 if v_1.Op != OpARMSLL {
12351 continue
12352 }
12353 z := v_1.Args[1]
12354 y := v_1.Args[0]
12355 v.reset(OpARMTSTshiftLLreg)
12356 v.AddArg3(x, y, z)
12357 return true
12358 }
12359 break
12360 }
12361
12362
12363 for {
12364 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12365 x := v_0
12366 if v_1.Op != OpARMSRL {
12367 continue
12368 }
12369 z := v_1.Args[1]
12370 y := v_1.Args[0]
12371 v.reset(OpARMTSTshiftRLreg)
12372 v.AddArg3(x, y, z)
12373 return true
12374 }
12375 break
12376 }
12377
12378
12379 for {
12380 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12381 x := v_0
12382 if v_1.Op != OpARMSRA {
12383 continue
12384 }
12385 z := v_1.Args[1]
12386 y := v_1.Args[0]
12387 v.reset(OpARMTSTshiftRAreg)
12388 v.AddArg3(x, y, z)
12389 return true
12390 }
12391 break
12392 }
12393 return false
12394 }
12395 func rewriteValueARM_OpARMTSTconst(v *Value) bool {
12396 v_0 := v.Args[0]
12397
12398
12399 for {
12400 y := auxIntToInt32(v.AuxInt)
12401 if v_0.Op != OpARMMOVWconst {
12402 break
12403 }
12404 x := auxIntToInt32(v_0.AuxInt)
12405 v.reset(OpARMFlagConstant)
12406 v.AuxInt = flagConstantToAuxInt(logicFlags32(x & y))
12407 return true
12408 }
12409 return false
12410 }
12411 func rewriteValueARM_OpARMTSTshiftLL(v *Value) bool {
12412 v_1 := v.Args[1]
12413 v_0 := v.Args[0]
12414 b := v.Block
12415
12416
12417 for {
12418 d := auxIntToInt32(v.AuxInt)
12419 if v_0.Op != OpARMMOVWconst {
12420 break
12421 }
12422 c := auxIntToInt32(v_0.AuxInt)
12423 x := v_1
12424 v.reset(OpARMTSTconst)
12425 v.AuxInt = int32ToAuxInt(c)
12426 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
12427 v0.AuxInt = int32ToAuxInt(d)
12428 v0.AddArg(x)
12429 v.AddArg(v0)
12430 return true
12431 }
12432
12433
12434 for {
12435 d := auxIntToInt32(v.AuxInt)
12436 x := v_0
12437 if v_1.Op != OpARMMOVWconst {
12438 break
12439 }
12440 c := auxIntToInt32(v_1.AuxInt)
12441 v.reset(OpARMTSTconst)
12442 v.AuxInt = int32ToAuxInt(c << uint64(d))
12443 v.AddArg(x)
12444 return true
12445 }
12446 return false
12447 }
12448 func rewriteValueARM_OpARMTSTshiftLLreg(v *Value) bool {
12449 v_2 := v.Args[2]
12450 v_1 := v.Args[1]
12451 v_0 := v.Args[0]
12452 b := v.Block
12453
12454
12455 for {
12456 if v_0.Op != OpARMMOVWconst {
12457 break
12458 }
12459 c := auxIntToInt32(v_0.AuxInt)
12460 x := v_1
12461 y := v_2
12462 v.reset(OpARMTSTconst)
12463 v.AuxInt = int32ToAuxInt(c)
12464 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
12465 v0.AddArg2(x, y)
12466 v.AddArg(v0)
12467 return true
12468 }
12469
12470
12471
12472 for {
12473 x := v_0
12474 y := v_1
12475 if v_2.Op != OpARMMOVWconst {
12476 break
12477 }
12478 c := auxIntToInt32(v_2.AuxInt)
12479 if !(0 <= c && c < 32) {
12480 break
12481 }
12482 v.reset(OpARMTSTshiftLL)
12483 v.AuxInt = int32ToAuxInt(c)
12484 v.AddArg2(x, y)
12485 return true
12486 }
12487 return false
12488 }
12489 func rewriteValueARM_OpARMTSTshiftRA(v *Value) bool {
12490 v_1 := v.Args[1]
12491 v_0 := v.Args[0]
12492 b := v.Block
12493
12494
12495 for {
12496 d := auxIntToInt32(v.AuxInt)
12497 if v_0.Op != OpARMMOVWconst {
12498 break
12499 }
12500 c := auxIntToInt32(v_0.AuxInt)
12501 x := v_1
12502 v.reset(OpARMTSTconst)
12503 v.AuxInt = int32ToAuxInt(c)
12504 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
12505 v0.AuxInt = int32ToAuxInt(d)
12506 v0.AddArg(x)
12507 v.AddArg(v0)
12508 return true
12509 }
12510
12511
12512 for {
12513 d := auxIntToInt32(v.AuxInt)
12514 x := v_0
12515 if v_1.Op != OpARMMOVWconst {
12516 break
12517 }
12518 c := auxIntToInt32(v_1.AuxInt)
12519 v.reset(OpARMTSTconst)
12520 v.AuxInt = int32ToAuxInt(c >> uint64(d))
12521 v.AddArg(x)
12522 return true
12523 }
12524 return false
12525 }
12526 func rewriteValueARM_OpARMTSTshiftRAreg(v *Value) bool {
12527 v_2 := v.Args[2]
12528 v_1 := v.Args[1]
12529 v_0 := v.Args[0]
12530 b := v.Block
12531
12532
12533 for {
12534 if v_0.Op != OpARMMOVWconst {
12535 break
12536 }
12537 c := auxIntToInt32(v_0.AuxInt)
12538 x := v_1
12539 y := v_2
12540 v.reset(OpARMTSTconst)
12541 v.AuxInt = int32ToAuxInt(c)
12542 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
12543 v0.AddArg2(x, y)
12544 v.AddArg(v0)
12545 return true
12546 }
12547
12548
12549
12550 for {
12551 x := v_0
12552 y := v_1
12553 if v_2.Op != OpARMMOVWconst {
12554 break
12555 }
12556 c := auxIntToInt32(v_2.AuxInt)
12557 if !(0 <= c && c < 32) {
12558 break
12559 }
12560 v.reset(OpARMTSTshiftRA)
12561 v.AuxInt = int32ToAuxInt(c)
12562 v.AddArg2(x, y)
12563 return true
12564 }
12565 return false
12566 }
12567 func rewriteValueARM_OpARMTSTshiftRL(v *Value) bool {
12568 v_1 := v.Args[1]
12569 v_0 := v.Args[0]
12570 b := v.Block
12571
12572
12573 for {
12574 d := auxIntToInt32(v.AuxInt)
12575 if v_0.Op != OpARMMOVWconst {
12576 break
12577 }
12578 c := auxIntToInt32(v_0.AuxInt)
12579 x := v_1
12580 v.reset(OpARMTSTconst)
12581 v.AuxInt = int32ToAuxInt(c)
12582 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
12583 v0.AuxInt = int32ToAuxInt(d)
12584 v0.AddArg(x)
12585 v.AddArg(v0)
12586 return true
12587 }
12588
12589
12590 for {
12591 d := auxIntToInt32(v.AuxInt)
12592 x := v_0
12593 if v_1.Op != OpARMMOVWconst {
12594 break
12595 }
12596 c := auxIntToInt32(v_1.AuxInt)
12597 v.reset(OpARMTSTconst)
12598 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
12599 v.AddArg(x)
12600 return true
12601 }
12602 return false
12603 }
12604 func rewriteValueARM_OpARMTSTshiftRLreg(v *Value) bool {
12605 v_2 := v.Args[2]
12606 v_1 := v.Args[1]
12607 v_0 := v.Args[0]
12608 b := v.Block
12609
12610
12611 for {
12612 if v_0.Op != OpARMMOVWconst {
12613 break
12614 }
12615 c := auxIntToInt32(v_0.AuxInt)
12616 x := v_1
12617 y := v_2
12618 v.reset(OpARMTSTconst)
12619 v.AuxInt = int32ToAuxInt(c)
12620 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
12621 v0.AddArg2(x, y)
12622 v.AddArg(v0)
12623 return true
12624 }
12625
12626
12627
12628 for {
12629 x := v_0
12630 y := v_1
12631 if v_2.Op != OpARMMOVWconst {
12632 break
12633 }
12634 c := auxIntToInt32(v_2.AuxInt)
12635 if !(0 <= c && c < 32) {
12636 break
12637 }
12638 v.reset(OpARMTSTshiftRL)
12639 v.AuxInt = int32ToAuxInt(c)
12640 v.AddArg2(x, y)
12641 return true
12642 }
12643 return false
12644 }
12645 func rewriteValueARM_OpARMXOR(v *Value) bool {
12646 v_1 := v.Args[1]
12647 v_0 := v.Args[0]
12648
12649
12650 for {
12651 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12652 x := v_0
12653 if v_1.Op != OpARMMOVWconst {
12654 continue
12655 }
12656 c := auxIntToInt32(v_1.AuxInt)
12657 v.reset(OpARMXORconst)
12658 v.AuxInt = int32ToAuxInt(c)
12659 v.AddArg(x)
12660 return true
12661 }
12662 break
12663 }
12664
12665
12666 for {
12667 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12668 x := v_0
12669 if v_1.Op != OpARMSLLconst {
12670 continue
12671 }
12672 c := auxIntToInt32(v_1.AuxInt)
12673 y := v_1.Args[0]
12674 v.reset(OpARMXORshiftLL)
12675 v.AuxInt = int32ToAuxInt(c)
12676 v.AddArg2(x, y)
12677 return true
12678 }
12679 break
12680 }
12681
12682
12683 for {
12684 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12685 x := v_0
12686 if v_1.Op != OpARMSRLconst {
12687 continue
12688 }
12689 c := auxIntToInt32(v_1.AuxInt)
12690 y := v_1.Args[0]
12691 v.reset(OpARMXORshiftRL)
12692 v.AuxInt = int32ToAuxInt(c)
12693 v.AddArg2(x, y)
12694 return true
12695 }
12696 break
12697 }
12698
12699
12700 for {
12701 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12702 x := v_0
12703 if v_1.Op != OpARMSRAconst {
12704 continue
12705 }
12706 c := auxIntToInt32(v_1.AuxInt)
12707 y := v_1.Args[0]
12708 v.reset(OpARMXORshiftRA)
12709 v.AuxInt = int32ToAuxInt(c)
12710 v.AddArg2(x, y)
12711 return true
12712 }
12713 break
12714 }
12715
12716
12717 for {
12718 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12719 x := v_0
12720 if v_1.Op != OpARMSRRconst {
12721 continue
12722 }
12723 c := auxIntToInt32(v_1.AuxInt)
12724 y := v_1.Args[0]
12725 v.reset(OpARMXORshiftRR)
12726 v.AuxInt = int32ToAuxInt(c)
12727 v.AddArg2(x, y)
12728 return true
12729 }
12730 break
12731 }
12732
12733
12734 for {
12735 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12736 x := v_0
12737 if v_1.Op != OpARMSLL {
12738 continue
12739 }
12740 z := v_1.Args[1]
12741 y := v_1.Args[0]
12742 v.reset(OpARMXORshiftLLreg)
12743 v.AddArg3(x, y, z)
12744 return true
12745 }
12746 break
12747 }
12748
12749
12750 for {
12751 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12752 x := v_0
12753 if v_1.Op != OpARMSRL {
12754 continue
12755 }
12756 z := v_1.Args[1]
12757 y := v_1.Args[0]
12758 v.reset(OpARMXORshiftRLreg)
12759 v.AddArg3(x, y, z)
12760 return true
12761 }
12762 break
12763 }
12764
12765
12766 for {
12767 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
12768 x := v_0
12769 if v_1.Op != OpARMSRA {
12770 continue
12771 }
12772 z := v_1.Args[1]
12773 y := v_1.Args[0]
12774 v.reset(OpARMXORshiftRAreg)
12775 v.AddArg3(x, y, z)
12776 return true
12777 }
12778 break
12779 }
12780
12781
12782 for {
12783 x := v_0
12784 if x != v_1 {
12785 break
12786 }
12787 v.reset(OpARMMOVWconst)
12788 v.AuxInt = int32ToAuxInt(0)
12789 return true
12790 }
12791 return false
12792 }
12793 func rewriteValueARM_OpARMXORconst(v *Value) bool {
12794 v_0 := v.Args[0]
12795
12796
12797 for {
12798 if auxIntToInt32(v.AuxInt) != 0 {
12799 break
12800 }
12801 x := v_0
12802 v.copyOf(x)
12803 return true
12804 }
12805
12806
12807 for {
12808 c := auxIntToInt32(v.AuxInt)
12809 if v_0.Op != OpARMMOVWconst {
12810 break
12811 }
12812 d := auxIntToInt32(v_0.AuxInt)
12813 v.reset(OpARMMOVWconst)
12814 v.AuxInt = int32ToAuxInt(c ^ d)
12815 return true
12816 }
12817
12818
12819 for {
12820 c := auxIntToInt32(v.AuxInt)
12821 if v_0.Op != OpARMXORconst {
12822 break
12823 }
12824 d := auxIntToInt32(v_0.AuxInt)
12825 x := v_0.Args[0]
12826 v.reset(OpARMXORconst)
12827 v.AuxInt = int32ToAuxInt(c ^ d)
12828 v.AddArg(x)
12829 return true
12830 }
12831 return false
12832 }
12833 func rewriteValueARM_OpARMXORshiftLL(v *Value) bool {
12834 v_1 := v.Args[1]
12835 v_0 := v.Args[0]
12836 b := v.Block
12837 typ := &b.Func.Config.Types
12838
12839
12840 for {
12841 d := auxIntToInt32(v.AuxInt)
12842 if v_0.Op != OpARMMOVWconst {
12843 break
12844 }
12845 c := auxIntToInt32(v_0.AuxInt)
12846 x := v_1
12847 v.reset(OpARMXORconst)
12848 v.AuxInt = int32ToAuxInt(c)
12849 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type)
12850 v0.AuxInt = int32ToAuxInt(d)
12851 v0.AddArg(x)
12852 v.AddArg(v0)
12853 return true
12854 }
12855
12856
12857 for {
12858 d := auxIntToInt32(v.AuxInt)
12859 x := v_0
12860 if v_1.Op != OpARMMOVWconst {
12861 break
12862 }
12863 c := auxIntToInt32(v_1.AuxInt)
12864 v.reset(OpARMXORconst)
12865 v.AuxInt = int32ToAuxInt(c << uint64(d))
12866 v.AddArg(x)
12867 return true
12868 }
12869
12870
12871 for {
12872 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)) {
12873 break
12874 }
12875 x := v_0.Args[0]
12876 if x != v_1 {
12877 break
12878 }
12879 v.reset(OpARMREV16)
12880 v.AddArg(x)
12881 return true
12882 }
12883
12884
12885
12886 for {
12887 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMSRLconst || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != 24 {
12888 break
12889 }
12890 v_0_0 := v_0.Args[0]
12891 if v_0_0.Op != OpARMSLLconst || auxIntToInt32(v_0_0.AuxInt) != 16 {
12892 break
12893 }
12894 x := v_0_0.Args[0]
12895 if x != v_1 || !(buildcfg.GOARM.Version >= 6) {
12896 break
12897 }
12898 v.reset(OpARMREV16)
12899 v.AddArg(x)
12900 return true
12901 }
12902
12903
12904 for {
12905 c := auxIntToInt32(v.AuxInt)
12906 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c {
12907 break
12908 }
12909 x := v_0.Args[0]
12910 if x != v_1 {
12911 break
12912 }
12913 v.reset(OpARMMOVWconst)
12914 v.AuxInt = int32ToAuxInt(0)
12915 return true
12916 }
12917 return false
12918 }
12919 func rewriteValueARM_OpARMXORshiftLLreg(v *Value) bool {
12920 v_2 := v.Args[2]
12921 v_1 := v.Args[1]
12922 v_0 := v.Args[0]
12923 b := v.Block
12924
12925
12926 for {
12927 if v_0.Op != OpARMMOVWconst {
12928 break
12929 }
12930 c := auxIntToInt32(v_0.AuxInt)
12931 x := v_1
12932 y := v_2
12933 v.reset(OpARMXORconst)
12934 v.AuxInt = int32ToAuxInt(c)
12935 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
12936 v0.AddArg2(x, y)
12937 v.AddArg(v0)
12938 return true
12939 }
12940
12941
12942
12943 for {
12944 x := v_0
12945 y := v_1
12946 if v_2.Op != OpARMMOVWconst {
12947 break
12948 }
12949 c := auxIntToInt32(v_2.AuxInt)
12950 if !(0 <= c && c < 32) {
12951 break
12952 }
12953 v.reset(OpARMXORshiftLL)
12954 v.AuxInt = int32ToAuxInt(c)
12955 v.AddArg2(x, y)
12956 return true
12957 }
12958 return false
12959 }
12960 func rewriteValueARM_OpARMXORshiftRA(v *Value) bool {
12961 v_1 := v.Args[1]
12962 v_0 := v.Args[0]
12963 b := v.Block
12964
12965
12966 for {
12967 d := auxIntToInt32(v.AuxInt)
12968 if v_0.Op != OpARMMOVWconst {
12969 break
12970 }
12971 c := auxIntToInt32(v_0.AuxInt)
12972 x := v_1
12973 v.reset(OpARMXORconst)
12974 v.AuxInt = int32ToAuxInt(c)
12975 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type)
12976 v0.AuxInt = int32ToAuxInt(d)
12977 v0.AddArg(x)
12978 v.AddArg(v0)
12979 return true
12980 }
12981
12982
12983 for {
12984 d := auxIntToInt32(v.AuxInt)
12985 x := v_0
12986 if v_1.Op != OpARMMOVWconst {
12987 break
12988 }
12989 c := auxIntToInt32(v_1.AuxInt)
12990 v.reset(OpARMXORconst)
12991 v.AuxInt = int32ToAuxInt(c >> uint64(d))
12992 v.AddArg(x)
12993 return true
12994 }
12995
12996
12997 for {
12998 c := auxIntToInt32(v.AuxInt)
12999 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c {
13000 break
13001 }
13002 x := v_0.Args[0]
13003 if x != v_1 {
13004 break
13005 }
13006 v.reset(OpARMMOVWconst)
13007 v.AuxInt = int32ToAuxInt(0)
13008 return true
13009 }
13010 return false
13011 }
13012 func rewriteValueARM_OpARMXORshiftRAreg(v *Value) bool {
13013 v_2 := v.Args[2]
13014 v_1 := v.Args[1]
13015 v_0 := v.Args[0]
13016 b := v.Block
13017
13018
13019 for {
13020 if v_0.Op != OpARMMOVWconst {
13021 break
13022 }
13023 c := auxIntToInt32(v_0.AuxInt)
13024 x := v_1
13025 y := v_2
13026 v.reset(OpARMXORconst)
13027 v.AuxInt = int32ToAuxInt(c)
13028 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type)
13029 v0.AddArg2(x, y)
13030 v.AddArg(v0)
13031 return true
13032 }
13033
13034
13035
13036 for {
13037 x := v_0
13038 y := v_1
13039 if v_2.Op != OpARMMOVWconst {
13040 break
13041 }
13042 c := auxIntToInt32(v_2.AuxInt)
13043 if !(0 <= c && c < 32) {
13044 break
13045 }
13046 v.reset(OpARMXORshiftRA)
13047 v.AuxInt = int32ToAuxInt(c)
13048 v.AddArg2(x, y)
13049 return true
13050 }
13051 return false
13052 }
13053 func rewriteValueARM_OpARMXORshiftRL(v *Value) bool {
13054 v_1 := v.Args[1]
13055 v_0 := v.Args[0]
13056 b := v.Block
13057
13058
13059 for {
13060 d := auxIntToInt32(v.AuxInt)
13061 if v_0.Op != OpARMMOVWconst {
13062 break
13063 }
13064 c := auxIntToInt32(v_0.AuxInt)
13065 x := v_1
13066 v.reset(OpARMXORconst)
13067 v.AuxInt = int32ToAuxInt(c)
13068 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type)
13069 v0.AuxInt = int32ToAuxInt(d)
13070 v0.AddArg(x)
13071 v.AddArg(v0)
13072 return true
13073 }
13074
13075
13076 for {
13077 d := auxIntToInt32(v.AuxInt)
13078 x := v_0
13079 if v_1.Op != OpARMMOVWconst {
13080 break
13081 }
13082 c := auxIntToInt32(v_1.AuxInt)
13083 v.reset(OpARMXORconst)
13084 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d)))
13085 v.AddArg(x)
13086 return true
13087 }
13088
13089
13090 for {
13091 c := auxIntToInt32(v.AuxInt)
13092 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c {
13093 break
13094 }
13095 x := v_0.Args[0]
13096 if x != v_1 {
13097 break
13098 }
13099 v.reset(OpARMMOVWconst)
13100 v.AuxInt = int32ToAuxInt(0)
13101 return true
13102 }
13103 return false
13104 }
13105 func rewriteValueARM_OpARMXORshiftRLreg(v *Value) bool {
13106 v_2 := v.Args[2]
13107 v_1 := v.Args[1]
13108 v_0 := v.Args[0]
13109 b := v.Block
13110
13111
13112 for {
13113 if v_0.Op != OpARMMOVWconst {
13114 break
13115 }
13116 c := auxIntToInt32(v_0.AuxInt)
13117 x := v_1
13118 y := v_2
13119 v.reset(OpARMXORconst)
13120 v.AuxInt = int32ToAuxInt(c)
13121 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
13122 v0.AddArg2(x, y)
13123 v.AddArg(v0)
13124 return true
13125 }
13126
13127
13128
13129 for {
13130 x := v_0
13131 y := v_1
13132 if v_2.Op != OpARMMOVWconst {
13133 break
13134 }
13135 c := auxIntToInt32(v_2.AuxInt)
13136 if !(0 <= c && c < 32) {
13137 break
13138 }
13139 v.reset(OpARMXORshiftRL)
13140 v.AuxInt = int32ToAuxInt(c)
13141 v.AddArg2(x, y)
13142 return true
13143 }
13144 return false
13145 }
13146 func rewriteValueARM_OpARMXORshiftRR(v *Value) bool {
13147 v_1 := v.Args[1]
13148 v_0 := v.Args[0]
13149 b := v.Block
13150
13151
13152 for {
13153 d := auxIntToInt32(v.AuxInt)
13154 if v_0.Op != OpARMMOVWconst {
13155 break
13156 }
13157 c := auxIntToInt32(v_0.AuxInt)
13158 x := v_1
13159 v.reset(OpARMXORconst)
13160 v.AuxInt = int32ToAuxInt(c)
13161 v0 := b.NewValue0(v.Pos, OpARMSRRconst, x.Type)
13162 v0.AuxInt = int32ToAuxInt(d)
13163 v0.AddArg(x)
13164 v.AddArg(v0)
13165 return true
13166 }
13167
13168
13169 for {
13170 d := auxIntToInt32(v.AuxInt)
13171 x := v_0
13172 if v_1.Op != OpARMMOVWconst {
13173 break
13174 }
13175 c := auxIntToInt32(v_1.AuxInt)
13176 v.reset(OpARMXORconst)
13177 v.AuxInt = int32ToAuxInt(int32(uint32(c)>>uint64(d) | uint32(c)<<uint64(32-d)))
13178 v.AddArg(x)
13179 return true
13180 }
13181 return false
13182 }
13183 func rewriteValueARM_OpAddr(v *Value) bool {
13184 v_0 := v.Args[0]
13185
13186
13187 for {
13188 sym := auxToSym(v.Aux)
13189 base := v_0
13190 v.reset(OpARMMOVWaddr)
13191 v.Aux = symToAux(sym)
13192 v.AddArg(base)
13193 return true
13194 }
13195 }
13196 func rewriteValueARM_OpAvg32u(v *Value) bool {
13197 v_1 := v.Args[1]
13198 v_0 := v.Args[0]
13199 b := v.Block
13200
13201
13202 for {
13203 t := v.Type
13204 x := v_0
13205 y := v_1
13206 v.reset(OpARMADD)
13207 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t)
13208 v0.AuxInt = int32ToAuxInt(1)
13209 v1 := b.NewValue0(v.Pos, OpARMSUB, t)
13210 v1.AddArg2(x, y)
13211 v0.AddArg(v1)
13212 v.AddArg2(v0, y)
13213 return true
13214 }
13215 }
13216 func rewriteValueARM_OpBitLen16(v *Value) bool {
13217 v_0 := v.Args[0]
13218 b := v.Block
13219 typ := &b.Func.Config.Types
13220
13221
13222 for {
13223 x := v_0
13224 v.reset(OpBitLen32)
13225 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13226 v0.AddArg(x)
13227 v.AddArg(v0)
13228 return true
13229 }
13230 }
13231 func rewriteValueARM_OpBitLen32(v *Value) bool {
13232 v_0 := v.Args[0]
13233 b := v.Block
13234
13235
13236 for {
13237 t := v.Type
13238 x := v_0
13239 v.reset(OpARMRSBconst)
13240 v.AuxInt = int32ToAuxInt(32)
13241 v0 := b.NewValue0(v.Pos, OpARMCLZ, t)
13242 v0.AddArg(x)
13243 v.AddArg(v0)
13244 return true
13245 }
13246 }
13247 func rewriteValueARM_OpBitLen8(v *Value) bool {
13248 v_0 := v.Args[0]
13249 b := v.Block
13250 typ := &b.Func.Config.Types
13251
13252
13253 for {
13254 x := v_0
13255 v.reset(OpBitLen32)
13256 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13257 v0.AddArg(x)
13258 v.AddArg(v0)
13259 return true
13260 }
13261 }
13262 func rewriteValueARM_OpBswap32(v *Value) bool {
13263 v_0 := v.Args[0]
13264 b := v.Block
13265
13266
13267
13268 for {
13269 t := v.Type
13270 x := v_0
13271 if !(buildcfg.GOARM.Version == 5) {
13272 break
13273 }
13274 v.reset(OpARMXOR)
13275 v.Type = t
13276 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t)
13277 v0.AuxInt = int32ToAuxInt(8)
13278 v1 := b.NewValue0(v.Pos, OpARMBICconst, t)
13279 v1.AuxInt = int32ToAuxInt(0xff0000)
13280 v2 := b.NewValue0(v.Pos, OpARMXOR, t)
13281 v3 := b.NewValue0(v.Pos, OpARMSRRconst, t)
13282 v3.AuxInt = int32ToAuxInt(16)
13283 v3.AddArg(x)
13284 v2.AddArg2(x, v3)
13285 v1.AddArg(v2)
13286 v0.AddArg(v1)
13287 v4 := b.NewValue0(v.Pos, OpARMSRRconst, t)
13288 v4.AuxInt = int32ToAuxInt(8)
13289 v4.AddArg(x)
13290 v.AddArg2(v0, v4)
13291 return true
13292 }
13293
13294
13295
13296 for {
13297 x := v_0
13298 if !(buildcfg.GOARM.Version >= 6) {
13299 break
13300 }
13301 v.reset(OpARMREV)
13302 v.AddArg(x)
13303 return true
13304 }
13305 return false
13306 }
13307 func rewriteValueARM_OpConst16(v *Value) bool {
13308
13309
13310 for {
13311 val := auxIntToInt16(v.AuxInt)
13312 v.reset(OpARMMOVWconst)
13313 v.AuxInt = int32ToAuxInt(int32(val))
13314 return true
13315 }
13316 }
13317 func rewriteValueARM_OpConst32(v *Value) bool {
13318
13319
13320 for {
13321 val := auxIntToInt32(v.AuxInt)
13322 v.reset(OpARMMOVWconst)
13323 v.AuxInt = int32ToAuxInt(int32(val))
13324 return true
13325 }
13326 }
13327 func rewriteValueARM_OpConst32F(v *Value) bool {
13328
13329
13330 for {
13331 val := auxIntToFloat32(v.AuxInt)
13332 v.reset(OpARMMOVFconst)
13333 v.AuxInt = float64ToAuxInt(float64(val))
13334 return true
13335 }
13336 }
13337 func rewriteValueARM_OpConst64F(v *Value) bool {
13338
13339
13340 for {
13341 val := auxIntToFloat64(v.AuxInt)
13342 v.reset(OpARMMOVDconst)
13343 v.AuxInt = float64ToAuxInt(float64(val))
13344 return true
13345 }
13346 }
13347 func rewriteValueARM_OpConst8(v *Value) bool {
13348
13349
13350 for {
13351 val := auxIntToInt8(v.AuxInt)
13352 v.reset(OpARMMOVWconst)
13353 v.AuxInt = int32ToAuxInt(int32(val))
13354 return true
13355 }
13356 }
13357 func rewriteValueARM_OpConstBool(v *Value) bool {
13358
13359
13360 for {
13361 t := auxIntToBool(v.AuxInt)
13362 v.reset(OpARMMOVWconst)
13363 v.AuxInt = int32ToAuxInt(b2i32(t))
13364 return true
13365 }
13366 }
13367 func rewriteValueARM_OpConstNil(v *Value) bool {
13368
13369
13370 for {
13371 v.reset(OpARMMOVWconst)
13372 v.AuxInt = int32ToAuxInt(0)
13373 return true
13374 }
13375 }
13376 func rewriteValueARM_OpCtz16(v *Value) bool {
13377 v_0 := v.Args[0]
13378 b := v.Block
13379 typ := &b.Func.Config.Types
13380
13381
13382
13383 for {
13384 t := v.Type
13385 x := v_0
13386 if !(buildcfg.GOARM.Version <= 6) {
13387 break
13388 }
13389 v.reset(OpARMRSBconst)
13390 v.AuxInt = int32ToAuxInt(32)
13391 v0 := b.NewValue0(v.Pos, OpARMCLZ, t)
13392 v1 := b.NewValue0(v.Pos, OpARMSUBconst, typ.UInt32)
13393 v1.AuxInt = int32ToAuxInt(1)
13394 v2 := b.NewValue0(v.Pos, OpARMAND, typ.UInt32)
13395 v3 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32)
13396 v3.AuxInt = int32ToAuxInt(0x10000)
13397 v3.AddArg(x)
13398 v4 := b.NewValue0(v.Pos, OpARMRSBconst, typ.UInt32)
13399 v4.AuxInt = int32ToAuxInt(0)
13400 v4.AddArg(v3)
13401 v2.AddArg2(v3, v4)
13402 v1.AddArg(v2)
13403 v0.AddArg(v1)
13404 v.AddArg(v0)
13405 return true
13406 }
13407
13408
13409
13410 for {
13411 t := v.Type
13412 x := v_0
13413 if !(buildcfg.GOARM.Version == 7) {
13414 break
13415 }
13416 v.reset(OpARMCLZ)
13417 v.Type = t
13418 v0 := b.NewValue0(v.Pos, OpARMRBIT, typ.UInt32)
13419 v1 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32)
13420 v1.AuxInt = int32ToAuxInt(0x10000)
13421 v1.AddArg(x)
13422 v0.AddArg(v1)
13423 v.AddArg(v0)
13424 return true
13425 }
13426 return false
13427 }
13428 func rewriteValueARM_OpCtz32(v *Value) bool {
13429 v_0 := v.Args[0]
13430 b := v.Block
13431
13432
13433
13434 for {
13435 t := v.Type
13436 x := v_0
13437 if !(buildcfg.GOARM.Version <= 6) {
13438 break
13439 }
13440 v.reset(OpARMRSBconst)
13441 v.AuxInt = int32ToAuxInt(32)
13442 v0 := b.NewValue0(v.Pos, OpARMCLZ, t)
13443 v1 := b.NewValue0(v.Pos, OpARMSUBconst, t)
13444 v1.AuxInt = int32ToAuxInt(1)
13445 v2 := b.NewValue0(v.Pos, OpARMAND, t)
13446 v3 := b.NewValue0(v.Pos, OpARMRSBconst, t)
13447 v3.AuxInt = int32ToAuxInt(0)
13448 v3.AddArg(x)
13449 v2.AddArg2(x, v3)
13450 v1.AddArg(v2)
13451 v0.AddArg(v1)
13452 v.AddArg(v0)
13453 return true
13454 }
13455
13456
13457
13458 for {
13459 t := v.Type
13460 x := v_0
13461 if !(buildcfg.GOARM.Version == 7) {
13462 break
13463 }
13464 v.reset(OpARMCLZ)
13465 v.Type = t
13466 v0 := b.NewValue0(v.Pos, OpARMRBIT, t)
13467 v0.AddArg(x)
13468 v.AddArg(v0)
13469 return true
13470 }
13471 return false
13472 }
13473 func rewriteValueARM_OpCtz8(v *Value) bool {
13474 v_0 := v.Args[0]
13475 b := v.Block
13476 typ := &b.Func.Config.Types
13477
13478
13479
13480 for {
13481 t := v.Type
13482 x := v_0
13483 if !(buildcfg.GOARM.Version <= 6) {
13484 break
13485 }
13486 v.reset(OpARMRSBconst)
13487 v.AuxInt = int32ToAuxInt(32)
13488 v0 := b.NewValue0(v.Pos, OpARMCLZ, t)
13489 v1 := b.NewValue0(v.Pos, OpARMSUBconst, typ.UInt32)
13490 v1.AuxInt = int32ToAuxInt(1)
13491 v2 := b.NewValue0(v.Pos, OpARMAND, typ.UInt32)
13492 v3 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32)
13493 v3.AuxInt = int32ToAuxInt(0x100)
13494 v3.AddArg(x)
13495 v4 := b.NewValue0(v.Pos, OpARMRSBconst, typ.UInt32)
13496 v4.AuxInt = int32ToAuxInt(0)
13497 v4.AddArg(v3)
13498 v2.AddArg2(v3, v4)
13499 v1.AddArg(v2)
13500 v0.AddArg(v1)
13501 v.AddArg(v0)
13502 return true
13503 }
13504
13505
13506
13507 for {
13508 t := v.Type
13509 x := v_0
13510 if !(buildcfg.GOARM.Version == 7) {
13511 break
13512 }
13513 v.reset(OpARMCLZ)
13514 v.Type = t
13515 v0 := b.NewValue0(v.Pos, OpARMRBIT, typ.UInt32)
13516 v1 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32)
13517 v1.AuxInt = int32ToAuxInt(0x100)
13518 v1.AddArg(x)
13519 v0.AddArg(v1)
13520 v.AddArg(v0)
13521 return true
13522 }
13523 return false
13524 }
13525 func rewriteValueARM_OpDiv16(v *Value) bool {
13526 v_1 := v.Args[1]
13527 v_0 := v.Args[0]
13528 b := v.Block
13529 typ := &b.Func.Config.Types
13530
13531
13532 for {
13533 x := v_0
13534 y := v_1
13535 v.reset(OpDiv32)
13536 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
13537 v0.AddArg(x)
13538 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
13539 v1.AddArg(y)
13540 v.AddArg2(v0, v1)
13541 return true
13542 }
13543 }
13544 func rewriteValueARM_OpDiv16u(v *Value) bool {
13545 v_1 := v.Args[1]
13546 v_0 := v.Args[0]
13547 b := v.Block
13548 typ := &b.Func.Config.Types
13549
13550
13551 for {
13552 x := v_0
13553 y := v_1
13554 v.reset(OpDiv32u)
13555 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13556 v0.AddArg(x)
13557 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13558 v1.AddArg(y)
13559 v.AddArg2(v0, v1)
13560 return true
13561 }
13562 }
13563 func rewriteValueARM_OpDiv32(v *Value) bool {
13564 v_1 := v.Args[1]
13565 v_0 := v.Args[0]
13566 b := v.Block
13567 typ := &b.Func.Config.Types
13568
13569
13570 for {
13571 x := v_0
13572 y := v_1
13573 v.reset(OpARMSUB)
13574 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
13575 v1 := b.NewValue0(v.Pos, OpSelect0, typ.UInt32)
13576 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32))
13577 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32)
13578 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
13579 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32)
13580 v5.AddArg(x)
13581 v4.AddArg2(x, v5)
13582 v3.AddArg2(v4, v5)
13583 v6 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32)
13584 v7 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
13585 v8 := b.NewValue0(v.Pos, OpSignmask, typ.Int32)
13586 v8.AddArg(y)
13587 v7.AddArg2(y, v8)
13588 v6.AddArg2(v7, v8)
13589 v2.AddArg2(v3, v6)
13590 v1.AddArg(v2)
13591 v9 := b.NewValue0(v.Pos, OpSignmask, typ.Int32)
13592 v10 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
13593 v10.AddArg2(x, y)
13594 v9.AddArg(v10)
13595 v0.AddArg2(v1, v9)
13596 v.AddArg2(v0, v9)
13597 return true
13598 }
13599 }
13600 func rewriteValueARM_OpDiv32u(v *Value) bool {
13601 v_1 := v.Args[1]
13602 v_0 := v.Args[0]
13603 b := v.Block
13604 typ := &b.Func.Config.Types
13605
13606
13607 for {
13608 x := v_0
13609 y := v_1
13610 v.reset(OpSelect0)
13611 v.Type = typ.UInt32
13612 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32))
13613 v0.AddArg2(x, y)
13614 v.AddArg(v0)
13615 return true
13616 }
13617 }
13618 func rewriteValueARM_OpDiv8(v *Value) bool {
13619 v_1 := v.Args[1]
13620 v_0 := v.Args[0]
13621 b := v.Block
13622 typ := &b.Func.Config.Types
13623
13624
13625 for {
13626 x := v_0
13627 y := v_1
13628 v.reset(OpDiv32)
13629 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
13630 v0.AddArg(x)
13631 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
13632 v1.AddArg(y)
13633 v.AddArg2(v0, v1)
13634 return true
13635 }
13636 }
13637 func rewriteValueARM_OpDiv8u(v *Value) bool {
13638 v_1 := v.Args[1]
13639 v_0 := v.Args[0]
13640 b := v.Block
13641 typ := &b.Func.Config.Types
13642
13643
13644 for {
13645 x := v_0
13646 y := v_1
13647 v.reset(OpDiv32u)
13648 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13649 v0.AddArg(x)
13650 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13651 v1.AddArg(y)
13652 v.AddArg2(v0, v1)
13653 return true
13654 }
13655 }
13656 func rewriteValueARM_OpEq16(v *Value) bool {
13657 v_1 := v.Args[1]
13658 v_0 := v.Args[0]
13659 b := v.Block
13660 typ := &b.Func.Config.Types
13661
13662
13663 for {
13664 x := v_0
13665 y := v_1
13666 v.reset(OpARMEqual)
13667 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13668 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13669 v1.AddArg(x)
13670 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13671 v2.AddArg(y)
13672 v0.AddArg2(v1, v2)
13673 v.AddArg(v0)
13674 return true
13675 }
13676 }
13677 func rewriteValueARM_OpEq32(v *Value) bool {
13678 v_1 := v.Args[1]
13679 v_0 := v.Args[0]
13680 b := v.Block
13681
13682
13683 for {
13684 x := v_0
13685 y := v_1
13686 v.reset(OpARMEqual)
13687 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13688 v0.AddArg2(x, y)
13689 v.AddArg(v0)
13690 return true
13691 }
13692 }
13693 func rewriteValueARM_OpEq32F(v *Value) bool {
13694 v_1 := v.Args[1]
13695 v_0 := v.Args[0]
13696 b := v.Block
13697
13698
13699 for {
13700 x := v_0
13701 y := v_1
13702 v.reset(OpARMEqual)
13703 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags)
13704 v0.AddArg2(x, y)
13705 v.AddArg(v0)
13706 return true
13707 }
13708 }
13709 func rewriteValueARM_OpEq64F(v *Value) bool {
13710 v_1 := v.Args[1]
13711 v_0 := v.Args[0]
13712 b := v.Block
13713
13714
13715 for {
13716 x := v_0
13717 y := v_1
13718 v.reset(OpARMEqual)
13719 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags)
13720 v0.AddArg2(x, y)
13721 v.AddArg(v0)
13722 return true
13723 }
13724 }
13725 func rewriteValueARM_OpEq8(v *Value) bool {
13726 v_1 := v.Args[1]
13727 v_0 := v.Args[0]
13728 b := v.Block
13729 typ := &b.Func.Config.Types
13730
13731
13732 for {
13733 x := v_0
13734 y := v_1
13735 v.reset(OpARMEqual)
13736 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13737 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13738 v1.AddArg(x)
13739 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13740 v2.AddArg(y)
13741 v0.AddArg2(v1, v2)
13742 v.AddArg(v0)
13743 return true
13744 }
13745 }
13746 func rewriteValueARM_OpEqB(v *Value) bool {
13747 v_1 := v.Args[1]
13748 v_0 := v.Args[0]
13749 b := v.Block
13750 typ := &b.Func.Config.Types
13751
13752
13753 for {
13754 x := v_0
13755 y := v_1
13756 v.reset(OpARMXORconst)
13757 v.AuxInt = int32ToAuxInt(1)
13758 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.Bool)
13759 v0.AddArg2(x, y)
13760 v.AddArg(v0)
13761 return true
13762 }
13763 }
13764 func rewriteValueARM_OpEqPtr(v *Value) bool {
13765 v_1 := v.Args[1]
13766 v_0 := v.Args[0]
13767 b := v.Block
13768
13769
13770 for {
13771 x := v_0
13772 y := v_1
13773 v.reset(OpARMEqual)
13774 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13775 v0.AddArg2(x, y)
13776 v.AddArg(v0)
13777 return true
13778 }
13779 }
13780 func rewriteValueARM_OpFMA(v *Value) bool {
13781 v_2 := v.Args[2]
13782 v_1 := v.Args[1]
13783 v_0 := v.Args[0]
13784
13785
13786 for {
13787 x := v_0
13788 y := v_1
13789 z := v_2
13790 v.reset(OpARMFMULAD)
13791 v.AddArg3(z, x, y)
13792 return true
13793 }
13794 }
13795 func rewriteValueARM_OpIsInBounds(v *Value) bool {
13796 v_1 := v.Args[1]
13797 v_0 := v.Args[0]
13798 b := v.Block
13799
13800
13801 for {
13802 idx := v_0
13803 len := v_1
13804 v.reset(OpARMLessThanU)
13805 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13806 v0.AddArg2(idx, len)
13807 v.AddArg(v0)
13808 return true
13809 }
13810 }
13811 func rewriteValueARM_OpIsNonNil(v *Value) bool {
13812 v_0 := v.Args[0]
13813 b := v.Block
13814
13815
13816 for {
13817 ptr := v_0
13818 v.reset(OpARMNotEqual)
13819 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
13820 v0.AuxInt = int32ToAuxInt(0)
13821 v0.AddArg(ptr)
13822 v.AddArg(v0)
13823 return true
13824 }
13825 }
13826 func rewriteValueARM_OpIsSliceInBounds(v *Value) bool {
13827 v_1 := v.Args[1]
13828 v_0 := v.Args[0]
13829 b := v.Block
13830
13831
13832 for {
13833 idx := v_0
13834 len := v_1
13835 v.reset(OpARMLessEqualU)
13836 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13837 v0.AddArg2(idx, len)
13838 v.AddArg(v0)
13839 return true
13840 }
13841 }
13842 func rewriteValueARM_OpLeq16(v *Value) bool {
13843 v_1 := v.Args[1]
13844 v_0 := v.Args[0]
13845 b := v.Block
13846 typ := &b.Func.Config.Types
13847
13848
13849 for {
13850 x := v_0
13851 y := v_1
13852 v.reset(OpARMLessEqual)
13853 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13854 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
13855 v1.AddArg(x)
13856 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
13857 v2.AddArg(y)
13858 v0.AddArg2(v1, v2)
13859 v.AddArg(v0)
13860 return true
13861 }
13862 }
13863 func rewriteValueARM_OpLeq16U(v *Value) bool {
13864 v_1 := v.Args[1]
13865 v_0 := v.Args[0]
13866 b := v.Block
13867 typ := &b.Func.Config.Types
13868
13869
13870 for {
13871 x := v_0
13872 y := v_1
13873 v.reset(OpARMLessEqualU)
13874 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13875 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13876 v1.AddArg(x)
13877 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
13878 v2.AddArg(y)
13879 v0.AddArg2(v1, v2)
13880 v.AddArg(v0)
13881 return true
13882 }
13883 }
13884 func rewriteValueARM_OpLeq32(v *Value) bool {
13885 v_1 := v.Args[1]
13886 v_0 := v.Args[0]
13887 b := v.Block
13888
13889
13890 for {
13891 x := v_0
13892 y := v_1
13893 v.reset(OpARMLessEqual)
13894 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13895 v0.AddArg2(x, y)
13896 v.AddArg(v0)
13897 return true
13898 }
13899 }
13900 func rewriteValueARM_OpLeq32F(v *Value) bool {
13901 v_1 := v.Args[1]
13902 v_0 := v.Args[0]
13903 b := v.Block
13904
13905
13906 for {
13907 x := v_0
13908 y := v_1
13909 v.reset(OpARMGreaterEqual)
13910 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags)
13911 v0.AddArg2(y, x)
13912 v.AddArg(v0)
13913 return true
13914 }
13915 }
13916 func rewriteValueARM_OpLeq32U(v *Value) bool {
13917 v_1 := v.Args[1]
13918 v_0 := v.Args[0]
13919 b := v.Block
13920
13921
13922 for {
13923 x := v_0
13924 y := v_1
13925 v.reset(OpARMLessEqualU)
13926 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13927 v0.AddArg2(x, y)
13928 v.AddArg(v0)
13929 return true
13930 }
13931 }
13932 func rewriteValueARM_OpLeq64F(v *Value) bool {
13933 v_1 := v.Args[1]
13934 v_0 := v.Args[0]
13935 b := v.Block
13936
13937
13938 for {
13939 x := v_0
13940 y := v_1
13941 v.reset(OpARMGreaterEqual)
13942 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags)
13943 v0.AddArg2(y, x)
13944 v.AddArg(v0)
13945 return true
13946 }
13947 }
13948 func rewriteValueARM_OpLeq8(v *Value) bool {
13949 v_1 := v.Args[1]
13950 v_0 := v.Args[0]
13951 b := v.Block
13952 typ := &b.Func.Config.Types
13953
13954
13955 for {
13956 x := v_0
13957 y := v_1
13958 v.reset(OpARMLessEqual)
13959 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13960 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
13961 v1.AddArg(x)
13962 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
13963 v2.AddArg(y)
13964 v0.AddArg2(v1, v2)
13965 v.AddArg(v0)
13966 return true
13967 }
13968 }
13969 func rewriteValueARM_OpLeq8U(v *Value) bool {
13970 v_1 := v.Args[1]
13971 v_0 := v.Args[0]
13972 b := v.Block
13973 typ := &b.Func.Config.Types
13974
13975
13976 for {
13977 x := v_0
13978 y := v_1
13979 v.reset(OpARMLessEqualU)
13980 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
13981 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13982 v1.AddArg(x)
13983 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
13984 v2.AddArg(y)
13985 v0.AddArg2(v1, v2)
13986 v.AddArg(v0)
13987 return true
13988 }
13989 }
13990 func rewriteValueARM_OpLess16(v *Value) bool {
13991 v_1 := v.Args[1]
13992 v_0 := v.Args[0]
13993 b := v.Block
13994 typ := &b.Func.Config.Types
13995
13996
13997 for {
13998 x := v_0
13999 y := v_1
14000 v.reset(OpARMLessThan)
14001 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
14002 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
14003 v1.AddArg(x)
14004 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
14005 v2.AddArg(y)
14006 v0.AddArg2(v1, v2)
14007 v.AddArg(v0)
14008 return true
14009 }
14010 }
14011 func rewriteValueARM_OpLess16U(v *Value) bool {
14012 v_1 := v.Args[1]
14013 v_0 := v.Args[0]
14014 b := v.Block
14015 typ := &b.Func.Config.Types
14016
14017
14018 for {
14019 x := v_0
14020 y := v_1
14021 v.reset(OpARMLessThanU)
14022 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
14023 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14024 v1.AddArg(x)
14025 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14026 v2.AddArg(y)
14027 v0.AddArg2(v1, v2)
14028 v.AddArg(v0)
14029 return true
14030 }
14031 }
14032 func rewriteValueARM_OpLess32(v *Value) bool {
14033 v_1 := v.Args[1]
14034 v_0 := v.Args[0]
14035 b := v.Block
14036
14037
14038 for {
14039 x := v_0
14040 y := v_1
14041 v.reset(OpARMLessThan)
14042 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
14043 v0.AddArg2(x, y)
14044 v.AddArg(v0)
14045 return true
14046 }
14047 }
14048 func rewriteValueARM_OpLess32F(v *Value) bool {
14049 v_1 := v.Args[1]
14050 v_0 := v.Args[0]
14051 b := v.Block
14052
14053
14054 for {
14055 x := v_0
14056 y := v_1
14057 v.reset(OpARMGreaterThan)
14058 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags)
14059 v0.AddArg2(y, x)
14060 v.AddArg(v0)
14061 return true
14062 }
14063 }
14064 func rewriteValueARM_OpLess32U(v *Value) bool {
14065 v_1 := v.Args[1]
14066 v_0 := v.Args[0]
14067 b := v.Block
14068
14069
14070 for {
14071 x := v_0
14072 y := v_1
14073 v.reset(OpARMLessThanU)
14074 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
14075 v0.AddArg2(x, y)
14076 v.AddArg(v0)
14077 return true
14078 }
14079 }
14080 func rewriteValueARM_OpLess64F(v *Value) bool {
14081 v_1 := v.Args[1]
14082 v_0 := v.Args[0]
14083 b := v.Block
14084
14085
14086 for {
14087 x := v_0
14088 y := v_1
14089 v.reset(OpARMGreaterThan)
14090 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags)
14091 v0.AddArg2(y, x)
14092 v.AddArg(v0)
14093 return true
14094 }
14095 }
14096 func rewriteValueARM_OpLess8(v *Value) bool {
14097 v_1 := v.Args[1]
14098 v_0 := v.Args[0]
14099 b := v.Block
14100 typ := &b.Func.Config.Types
14101
14102
14103 for {
14104 x := v_0
14105 y := v_1
14106 v.reset(OpARMLessThan)
14107 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
14108 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
14109 v1.AddArg(x)
14110 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
14111 v2.AddArg(y)
14112 v0.AddArg2(v1, v2)
14113 v.AddArg(v0)
14114 return true
14115 }
14116 }
14117 func rewriteValueARM_OpLess8U(v *Value) bool {
14118 v_1 := v.Args[1]
14119 v_0 := v.Args[0]
14120 b := v.Block
14121 typ := &b.Func.Config.Types
14122
14123
14124 for {
14125 x := v_0
14126 y := v_1
14127 v.reset(OpARMLessThanU)
14128 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
14129 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14130 v1.AddArg(x)
14131 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14132 v2.AddArg(y)
14133 v0.AddArg2(v1, v2)
14134 v.AddArg(v0)
14135 return true
14136 }
14137 }
14138 func rewriteValueARM_OpLoad(v *Value) bool {
14139 v_1 := v.Args[1]
14140 v_0 := v.Args[0]
14141
14142
14143
14144 for {
14145 t := v.Type
14146 ptr := v_0
14147 mem := v_1
14148 if !(t.IsBoolean()) {
14149 break
14150 }
14151 v.reset(OpARMMOVBUload)
14152 v.AddArg2(ptr, mem)
14153 return true
14154 }
14155
14156
14157
14158 for {
14159 t := v.Type
14160 ptr := v_0
14161 mem := v_1
14162 if !(is8BitInt(t) && t.IsSigned()) {
14163 break
14164 }
14165 v.reset(OpARMMOVBload)
14166 v.AddArg2(ptr, mem)
14167 return true
14168 }
14169
14170
14171
14172 for {
14173 t := v.Type
14174 ptr := v_0
14175 mem := v_1
14176 if !(is8BitInt(t) && !t.IsSigned()) {
14177 break
14178 }
14179 v.reset(OpARMMOVBUload)
14180 v.AddArg2(ptr, mem)
14181 return true
14182 }
14183
14184
14185
14186 for {
14187 t := v.Type
14188 ptr := v_0
14189 mem := v_1
14190 if !(is16BitInt(t) && t.IsSigned()) {
14191 break
14192 }
14193 v.reset(OpARMMOVHload)
14194 v.AddArg2(ptr, mem)
14195 return true
14196 }
14197
14198
14199
14200 for {
14201 t := v.Type
14202 ptr := v_0
14203 mem := v_1
14204 if !(is16BitInt(t) && !t.IsSigned()) {
14205 break
14206 }
14207 v.reset(OpARMMOVHUload)
14208 v.AddArg2(ptr, mem)
14209 return true
14210 }
14211
14212
14213
14214 for {
14215 t := v.Type
14216 ptr := v_0
14217 mem := v_1
14218 if !(is32BitInt(t) || isPtr(t)) {
14219 break
14220 }
14221 v.reset(OpARMMOVWload)
14222 v.AddArg2(ptr, mem)
14223 return true
14224 }
14225
14226
14227
14228 for {
14229 t := v.Type
14230 ptr := v_0
14231 mem := v_1
14232 if !(is32BitFloat(t)) {
14233 break
14234 }
14235 v.reset(OpARMMOVFload)
14236 v.AddArg2(ptr, mem)
14237 return true
14238 }
14239
14240
14241
14242 for {
14243 t := v.Type
14244 ptr := v_0
14245 mem := v_1
14246 if !(is64BitFloat(t)) {
14247 break
14248 }
14249 v.reset(OpARMMOVDload)
14250 v.AddArg2(ptr, mem)
14251 return true
14252 }
14253 return false
14254 }
14255 func rewriteValueARM_OpLocalAddr(v *Value) bool {
14256 v_1 := v.Args[1]
14257 v_0 := v.Args[0]
14258 b := v.Block
14259 typ := &b.Func.Config.Types
14260
14261
14262
14263 for {
14264 t := v.Type
14265 sym := auxToSym(v.Aux)
14266 base := v_0
14267 mem := v_1
14268 if !(t.Elem().HasPointers()) {
14269 break
14270 }
14271 v.reset(OpARMMOVWaddr)
14272 v.Aux = symToAux(sym)
14273 v0 := b.NewValue0(v.Pos, OpSPanchored, typ.Uintptr)
14274 v0.AddArg2(base, mem)
14275 v.AddArg(v0)
14276 return true
14277 }
14278
14279
14280
14281 for {
14282 t := v.Type
14283 sym := auxToSym(v.Aux)
14284 base := v_0
14285 if !(!t.Elem().HasPointers()) {
14286 break
14287 }
14288 v.reset(OpARMMOVWaddr)
14289 v.Aux = symToAux(sym)
14290 v.AddArg(base)
14291 return true
14292 }
14293 return false
14294 }
14295 func rewriteValueARM_OpLsh16x16(v *Value) bool {
14296 v_1 := v.Args[1]
14297 v_0 := v.Args[0]
14298 b := v.Block
14299 typ := &b.Func.Config.Types
14300
14301
14302 for {
14303 x := v_0
14304 y := v_1
14305 v.reset(OpARMCMOVWHSconst)
14306 v.AuxInt = int32ToAuxInt(0)
14307 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
14308 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14309 v1.AddArg(y)
14310 v0.AddArg2(x, v1)
14311 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
14312 v2.AuxInt = int32ToAuxInt(256)
14313 v2.AddArg(v1)
14314 v.AddArg2(v0, v2)
14315 return true
14316 }
14317 }
14318 func rewriteValueARM_OpLsh16x32(v *Value) bool {
14319 v_1 := v.Args[1]
14320 v_0 := v.Args[0]
14321 b := v.Block
14322
14323
14324 for {
14325 x := v_0
14326 y := v_1
14327 v.reset(OpARMCMOVWHSconst)
14328 v.AuxInt = int32ToAuxInt(0)
14329 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
14330 v0.AddArg2(x, y)
14331 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
14332 v1.AuxInt = int32ToAuxInt(256)
14333 v1.AddArg(y)
14334 v.AddArg2(v0, v1)
14335 return true
14336 }
14337 }
14338 func rewriteValueARM_OpLsh16x64(v *Value) bool {
14339 v_1 := v.Args[1]
14340 v_0 := v.Args[0]
14341
14342
14343
14344 for {
14345 x := v_0
14346 if v_1.Op != OpConst64 {
14347 break
14348 }
14349 c := auxIntToInt64(v_1.AuxInt)
14350 if !(uint64(c) < 16) {
14351 break
14352 }
14353 v.reset(OpARMSLLconst)
14354 v.AuxInt = int32ToAuxInt(int32(c))
14355 v.AddArg(x)
14356 return true
14357 }
14358
14359
14360
14361 for {
14362 if v_1.Op != OpConst64 {
14363 break
14364 }
14365 c := auxIntToInt64(v_1.AuxInt)
14366 if !(uint64(c) >= 16) {
14367 break
14368 }
14369 v.reset(OpConst16)
14370 v.AuxInt = int16ToAuxInt(0)
14371 return true
14372 }
14373 return false
14374 }
14375 func rewriteValueARM_OpLsh16x8(v *Value) bool {
14376 v_1 := v.Args[1]
14377 v_0 := v.Args[0]
14378 b := v.Block
14379 typ := &b.Func.Config.Types
14380
14381
14382 for {
14383 x := v_0
14384 y := v_1
14385 v.reset(OpARMSLL)
14386 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14387 v0.AddArg(y)
14388 v.AddArg2(x, v0)
14389 return true
14390 }
14391 }
14392 func rewriteValueARM_OpLsh32x16(v *Value) bool {
14393 v_1 := v.Args[1]
14394 v_0 := v.Args[0]
14395 b := v.Block
14396 typ := &b.Func.Config.Types
14397
14398
14399 for {
14400 x := v_0
14401 y := v_1
14402 v.reset(OpARMCMOVWHSconst)
14403 v.AuxInt = int32ToAuxInt(0)
14404 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
14405 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14406 v1.AddArg(y)
14407 v0.AddArg2(x, v1)
14408 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
14409 v2.AuxInt = int32ToAuxInt(256)
14410 v2.AddArg(v1)
14411 v.AddArg2(v0, v2)
14412 return true
14413 }
14414 }
14415 func rewriteValueARM_OpLsh32x32(v *Value) bool {
14416 v_1 := v.Args[1]
14417 v_0 := v.Args[0]
14418 b := v.Block
14419
14420
14421 for {
14422 x := v_0
14423 y := v_1
14424 v.reset(OpARMCMOVWHSconst)
14425 v.AuxInt = int32ToAuxInt(0)
14426 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
14427 v0.AddArg2(x, y)
14428 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
14429 v1.AuxInt = int32ToAuxInt(256)
14430 v1.AddArg(y)
14431 v.AddArg2(v0, v1)
14432 return true
14433 }
14434 }
14435 func rewriteValueARM_OpLsh32x64(v *Value) bool {
14436 v_1 := v.Args[1]
14437 v_0 := v.Args[0]
14438
14439
14440
14441 for {
14442 x := v_0
14443 if v_1.Op != OpConst64 {
14444 break
14445 }
14446 c := auxIntToInt64(v_1.AuxInt)
14447 if !(uint64(c) < 32) {
14448 break
14449 }
14450 v.reset(OpARMSLLconst)
14451 v.AuxInt = int32ToAuxInt(int32(c))
14452 v.AddArg(x)
14453 return true
14454 }
14455
14456
14457
14458 for {
14459 if v_1.Op != OpConst64 {
14460 break
14461 }
14462 c := auxIntToInt64(v_1.AuxInt)
14463 if !(uint64(c) >= 32) {
14464 break
14465 }
14466 v.reset(OpConst32)
14467 v.AuxInt = int32ToAuxInt(0)
14468 return true
14469 }
14470 return false
14471 }
14472 func rewriteValueARM_OpLsh32x8(v *Value) bool {
14473 v_1 := v.Args[1]
14474 v_0 := v.Args[0]
14475 b := v.Block
14476 typ := &b.Func.Config.Types
14477
14478
14479 for {
14480 x := v_0
14481 y := v_1
14482 v.reset(OpARMSLL)
14483 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14484 v0.AddArg(y)
14485 v.AddArg2(x, v0)
14486 return true
14487 }
14488 }
14489 func rewriteValueARM_OpLsh8x16(v *Value) bool {
14490 v_1 := v.Args[1]
14491 v_0 := v.Args[0]
14492 b := v.Block
14493 typ := &b.Func.Config.Types
14494
14495
14496 for {
14497 x := v_0
14498 y := v_1
14499 v.reset(OpARMCMOVWHSconst)
14500 v.AuxInt = int32ToAuxInt(0)
14501 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
14502 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14503 v1.AddArg(y)
14504 v0.AddArg2(x, v1)
14505 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
14506 v2.AuxInt = int32ToAuxInt(256)
14507 v2.AddArg(v1)
14508 v.AddArg2(v0, v2)
14509 return true
14510 }
14511 }
14512 func rewriteValueARM_OpLsh8x32(v *Value) bool {
14513 v_1 := v.Args[1]
14514 v_0 := v.Args[0]
14515 b := v.Block
14516
14517
14518 for {
14519 x := v_0
14520 y := v_1
14521 v.reset(OpARMCMOVWHSconst)
14522 v.AuxInt = int32ToAuxInt(0)
14523 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type)
14524 v0.AddArg2(x, y)
14525 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
14526 v1.AuxInt = int32ToAuxInt(256)
14527 v1.AddArg(y)
14528 v.AddArg2(v0, v1)
14529 return true
14530 }
14531 }
14532 func rewriteValueARM_OpLsh8x64(v *Value) bool {
14533 v_1 := v.Args[1]
14534 v_0 := v.Args[0]
14535
14536
14537
14538 for {
14539 x := v_0
14540 if v_1.Op != OpConst64 {
14541 break
14542 }
14543 c := auxIntToInt64(v_1.AuxInt)
14544 if !(uint64(c) < 8) {
14545 break
14546 }
14547 v.reset(OpARMSLLconst)
14548 v.AuxInt = int32ToAuxInt(int32(c))
14549 v.AddArg(x)
14550 return true
14551 }
14552
14553
14554
14555 for {
14556 if v_1.Op != OpConst64 {
14557 break
14558 }
14559 c := auxIntToInt64(v_1.AuxInt)
14560 if !(uint64(c) >= 8) {
14561 break
14562 }
14563 v.reset(OpConst8)
14564 v.AuxInt = int8ToAuxInt(0)
14565 return true
14566 }
14567 return false
14568 }
14569 func rewriteValueARM_OpLsh8x8(v *Value) bool {
14570 v_1 := v.Args[1]
14571 v_0 := v.Args[0]
14572 b := v.Block
14573 typ := &b.Func.Config.Types
14574
14575
14576 for {
14577 x := v_0
14578 y := v_1
14579 v.reset(OpARMSLL)
14580 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14581 v0.AddArg(y)
14582 v.AddArg2(x, v0)
14583 return true
14584 }
14585 }
14586 func rewriteValueARM_OpMod16(v *Value) bool {
14587 v_1 := v.Args[1]
14588 v_0 := v.Args[0]
14589 b := v.Block
14590 typ := &b.Func.Config.Types
14591
14592
14593 for {
14594 x := v_0
14595 y := v_1
14596 v.reset(OpMod32)
14597 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
14598 v0.AddArg(x)
14599 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
14600 v1.AddArg(y)
14601 v.AddArg2(v0, v1)
14602 return true
14603 }
14604 }
14605 func rewriteValueARM_OpMod16u(v *Value) bool {
14606 v_1 := v.Args[1]
14607 v_0 := v.Args[0]
14608 b := v.Block
14609 typ := &b.Func.Config.Types
14610
14611
14612 for {
14613 x := v_0
14614 y := v_1
14615 v.reset(OpMod32u)
14616 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14617 v0.AddArg(x)
14618 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14619 v1.AddArg(y)
14620 v.AddArg2(v0, v1)
14621 return true
14622 }
14623 }
14624 func rewriteValueARM_OpMod32(v *Value) bool {
14625 v_1 := v.Args[1]
14626 v_0 := v.Args[0]
14627 b := v.Block
14628 typ := &b.Func.Config.Types
14629
14630
14631 for {
14632 x := v_0
14633 y := v_1
14634 v.reset(OpARMSUB)
14635 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
14636 v1 := b.NewValue0(v.Pos, OpSelect1, typ.UInt32)
14637 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32))
14638 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32)
14639 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
14640 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32)
14641 v5.AddArg(x)
14642 v4.AddArg2(x, v5)
14643 v3.AddArg2(v4, v5)
14644 v6 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32)
14645 v7 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32)
14646 v8 := b.NewValue0(v.Pos, OpSignmask, typ.Int32)
14647 v8.AddArg(y)
14648 v7.AddArg2(y, v8)
14649 v6.AddArg2(v7, v8)
14650 v2.AddArg2(v3, v6)
14651 v1.AddArg(v2)
14652 v0.AddArg2(v1, v5)
14653 v.AddArg2(v0, v5)
14654 return true
14655 }
14656 }
14657 func rewriteValueARM_OpMod32u(v *Value) bool {
14658 v_1 := v.Args[1]
14659 v_0 := v.Args[0]
14660 b := v.Block
14661 typ := &b.Func.Config.Types
14662
14663
14664 for {
14665 x := v_0
14666 y := v_1
14667 v.reset(OpSelect1)
14668 v.Type = typ.UInt32
14669 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32))
14670 v0.AddArg2(x, y)
14671 v.AddArg(v0)
14672 return true
14673 }
14674 }
14675 func rewriteValueARM_OpMod8(v *Value) bool {
14676 v_1 := v.Args[1]
14677 v_0 := v.Args[0]
14678 b := v.Block
14679 typ := &b.Func.Config.Types
14680
14681
14682 for {
14683 x := v_0
14684 y := v_1
14685 v.reset(OpMod32)
14686 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
14687 v0.AddArg(x)
14688 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
14689 v1.AddArg(y)
14690 v.AddArg2(v0, v1)
14691 return true
14692 }
14693 }
14694 func rewriteValueARM_OpMod8u(v *Value) bool {
14695 v_1 := v.Args[1]
14696 v_0 := v.Args[0]
14697 b := v.Block
14698 typ := &b.Func.Config.Types
14699
14700
14701 for {
14702 x := v_0
14703 y := v_1
14704 v.reset(OpMod32u)
14705 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14706 v0.AddArg(x)
14707 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
14708 v1.AddArg(y)
14709 v.AddArg2(v0, v1)
14710 return true
14711 }
14712 }
14713 func rewriteValueARM_OpMove(v *Value) bool {
14714 v_2 := v.Args[2]
14715 v_1 := v.Args[1]
14716 v_0 := v.Args[0]
14717 b := v.Block
14718 config := b.Func.Config
14719 typ := &b.Func.Config.Types
14720
14721
14722 for {
14723 if auxIntToInt64(v.AuxInt) != 0 {
14724 break
14725 }
14726 mem := v_2
14727 v.copyOf(mem)
14728 return true
14729 }
14730
14731
14732 for {
14733 if auxIntToInt64(v.AuxInt) != 1 {
14734 break
14735 }
14736 dst := v_0
14737 src := v_1
14738 mem := v_2
14739 v.reset(OpARMMOVBstore)
14740 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14741 v0.AddArg2(src, mem)
14742 v.AddArg3(dst, v0, mem)
14743 return true
14744 }
14745
14746
14747
14748 for {
14749 if auxIntToInt64(v.AuxInt) != 2 {
14750 break
14751 }
14752 t := auxToType(v.Aux)
14753 dst := v_0
14754 src := v_1
14755 mem := v_2
14756 if !(t.Alignment()%2 == 0) {
14757 break
14758 }
14759 v.reset(OpARMMOVHstore)
14760 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16)
14761 v0.AddArg2(src, mem)
14762 v.AddArg3(dst, v0, mem)
14763 return true
14764 }
14765
14766
14767 for {
14768 if auxIntToInt64(v.AuxInt) != 2 {
14769 break
14770 }
14771 dst := v_0
14772 src := v_1
14773 mem := v_2
14774 v.reset(OpARMMOVBstore)
14775 v.AuxInt = int32ToAuxInt(1)
14776 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14777 v0.AuxInt = int32ToAuxInt(1)
14778 v0.AddArg2(src, mem)
14779 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
14780 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14781 v2.AddArg2(src, mem)
14782 v1.AddArg3(dst, v2, mem)
14783 v.AddArg3(dst, v0, v1)
14784 return true
14785 }
14786
14787
14788
14789 for {
14790 if auxIntToInt64(v.AuxInt) != 4 {
14791 break
14792 }
14793 t := auxToType(v.Aux)
14794 dst := v_0
14795 src := v_1
14796 mem := v_2
14797 if !(t.Alignment()%4 == 0) {
14798 break
14799 }
14800 v.reset(OpARMMOVWstore)
14801 v0 := b.NewValue0(v.Pos, OpARMMOVWload, typ.UInt32)
14802 v0.AddArg2(src, mem)
14803 v.AddArg3(dst, v0, mem)
14804 return true
14805 }
14806
14807
14808
14809 for {
14810 if auxIntToInt64(v.AuxInt) != 4 {
14811 break
14812 }
14813 t := auxToType(v.Aux)
14814 dst := v_0
14815 src := v_1
14816 mem := v_2
14817 if !(t.Alignment()%2 == 0) {
14818 break
14819 }
14820 v.reset(OpARMMOVHstore)
14821 v.AuxInt = int32ToAuxInt(2)
14822 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16)
14823 v0.AuxInt = int32ToAuxInt(2)
14824 v0.AddArg2(src, mem)
14825 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem)
14826 v2 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16)
14827 v2.AddArg2(src, mem)
14828 v1.AddArg3(dst, v2, mem)
14829 v.AddArg3(dst, v0, v1)
14830 return true
14831 }
14832
14833
14834 for {
14835 if auxIntToInt64(v.AuxInt) != 4 {
14836 break
14837 }
14838 dst := v_0
14839 src := v_1
14840 mem := v_2
14841 v.reset(OpARMMOVBstore)
14842 v.AuxInt = int32ToAuxInt(3)
14843 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14844 v0.AuxInt = int32ToAuxInt(3)
14845 v0.AddArg2(src, mem)
14846 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
14847 v1.AuxInt = int32ToAuxInt(2)
14848 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14849 v2.AuxInt = int32ToAuxInt(2)
14850 v2.AddArg2(src, mem)
14851 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
14852 v3.AuxInt = int32ToAuxInt(1)
14853 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14854 v4.AuxInt = int32ToAuxInt(1)
14855 v4.AddArg2(src, mem)
14856 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
14857 v6 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14858 v6.AddArg2(src, mem)
14859 v5.AddArg3(dst, v6, mem)
14860 v3.AddArg3(dst, v4, v5)
14861 v1.AddArg3(dst, v2, v3)
14862 v.AddArg3(dst, v0, v1)
14863 return true
14864 }
14865
14866
14867 for {
14868 if auxIntToInt64(v.AuxInt) != 3 {
14869 break
14870 }
14871 dst := v_0
14872 src := v_1
14873 mem := v_2
14874 v.reset(OpARMMOVBstore)
14875 v.AuxInt = int32ToAuxInt(2)
14876 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14877 v0.AuxInt = int32ToAuxInt(2)
14878 v0.AddArg2(src, mem)
14879 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
14880 v1.AuxInt = int32ToAuxInt(1)
14881 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14882 v2.AuxInt = int32ToAuxInt(1)
14883 v2.AddArg2(src, mem)
14884 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
14885 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8)
14886 v4.AddArg2(src, mem)
14887 v3.AddArg3(dst, v4, mem)
14888 v1.AddArg3(dst, v2, v3)
14889 v.AddArg3(dst, v0, v1)
14890 return true
14891 }
14892
14893
14894
14895 for {
14896 s := auxIntToInt64(v.AuxInt)
14897 t := auxToType(v.Aux)
14898 dst := v_0
14899 src := v_1
14900 mem := v_2
14901 if !(s%4 == 0 && s > 4 && s <= 512 && t.Alignment()%4 == 0 && logLargeCopy(v, s)) {
14902 break
14903 }
14904 v.reset(OpARMDUFFCOPY)
14905 v.AuxInt = int64ToAuxInt(8 * (128 - s/4))
14906 v.AddArg3(dst, src, mem)
14907 return true
14908 }
14909
14910
14911
14912 for {
14913 s := auxIntToInt64(v.AuxInt)
14914 t := auxToType(v.Aux)
14915 dst := v_0
14916 src := v_1
14917 mem := v_2
14918 if !((s > 512 || t.Alignment()%4 != 0) && logLargeCopy(v, s)) {
14919 break
14920 }
14921 v.reset(OpARMLoweredMove)
14922 v.AuxInt = int64ToAuxInt(t.Alignment())
14923 v0 := b.NewValue0(v.Pos, OpARMADDconst, src.Type)
14924 v0.AuxInt = int32ToAuxInt(int32(s - moveSize(t.Alignment(), config)))
14925 v0.AddArg(src)
14926 v.AddArg4(dst, src, v0, mem)
14927 return true
14928 }
14929 return false
14930 }
14931 func rewriteValueARM_OpNeg16(v *Value) bool {
14932 v_0 := v.Args[0]
14933
14934
14935 for {
14936 x := v_0
14937 v.reset(OpARMRSBconst)
14938 v.AuxInt = int32ToAuxInt(0)
14939 v.AddArg(x)
14940 return true
14941 }
14942 }
14943 func rewriteValueARM_OpNeg32(v *Value) bool {
14944 v_0 := v.Args[0]
14945
14946
14947 for {
14948 x := v_0
14949 v.reset(OpARMRSBconst)
14950 v.AuxInt = int32ToAuxInt(0)
14951 v.AddArg(x)
14952 return true
14953 }
14954 }
14955 func rewriteValueARM_OpNeg8(v *Value) bool {
14956 v_0 := v.Args[0]
14957
14958
14959 for {
14960 x := v_0
14961 v.reset(OpARMRSBconst)
14962 v.AuxInt = int32ToAuxInt(0)
14963 v.AddArg(x)
14964 return true
14965 }
14966 }
14967 func rewriteValueARM_OpNeq16(v *Value) bool {
14968 v_1 := v.Args[1]
14969 v_0 := v.Args[0]
14970 b := v.Block
14971 typ := &b.Func.Config.Types
14972
14973
14974 for {
14975 x := v_0
14976 y := v_1
14977 v.reset(OpARMNotEqual)
14978 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
14979 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14980 v1.AddArg(x)
14981 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
14982 v2.AddArg(y)
14983 v0.AddArg2(v1, v2)
14984 v.AddArg(v0)
14985 return true
14986 }
14987 }
14988 func rewriteValueARM_OpNeq32(v *Value) bool {
14989 v_1 := v.Args[1]
14990 v_0 := v.Args[0]
14991 b := v.Block
14992
14993
14994 for {
14995 x := v_0
14996 y := v_1
14997 v.reset(OpARMNotEqual)
14998 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
14999 v0.AddArg2(x, y)
15000 v.AddArg(v0)
15001 return true
15002 }
15003 }
15004 func rewriteValueARM_OpNeq32F(v *Value) bool {
15005 v_1 := v.Args[1]
15006 v_0 := v.Args[0]
15007 b := v.Block
15008
15009
15010 for {
15011 x := v_0
15012 y := v_1
15013 v.reset(OpARMNotEqual)
15014 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags)
15015 v0.AddArg2(x, y)
15016 v.AddArg(v0)
15017 return true
15018 }
15019 }
15020 func rewriteValueARM_OpNeq64F(v *Value) bool {
15021 v_1 := v.Args[1]
15022 v_0 := v.Args[0]
15023 b := v.Block
15024
15025
15026 for {
15027 x := v_0
15028 y := v_1
15029 v.reset(OpARMNotEqual)
15030 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags)
15031 v0.AddArg2(x, y)
15032 v.AddArg(v0)
15033 return true
15034 }
15035 }
15036 func rewriteValueARM_OpNeq8(v *Value) bool {
15037 v_1 := v.Args[1]
15038 v_0 := v.Args[0]
15039 b := v.Block
15040 typ := &b.Func.Config.Types
15041
15042
15043 for {
15044 x := v_0
15045 y := v_1
15046 v.reset(OpARMNotEqual)
15047 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
15048 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15049 v1.AddArg(x)
15050 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15051 v2.AddArg(y)
15052 v0.AddArg2(v1, v2)
15053 v.AddArg(v0)
15054 return true
15055 }
15056 }
15057 func rewriteValueARM_OpNeqPtr(v *Value) bool {
15058 v_1 := v.Args[1]
15059 v_0 := v.Args[0]
15060 b := v.Block
15061
15062
15063 for {
15064 x := v_0
15065 y := v_1
15066 v.reset(OpARMNotEqual)
15067 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags)
15068 v0.AddArg2(x, y)
15069 v.AddArg(v0)
15070 return true
15071 }
15072 }
15073 func rewriteValueARM_OpNot(v *Value) bool {
15074 v_0 := v.Args[0]
15075
15076
15077 for {
15078 x := v_0
15079 v.reset(OpARMXORconst)
15080 v.AuxInt = int32ToAuxInt(1)
15081 v.AddArg(x)
15082 return true
15083 }
15084 }
15085 func rewriteValueARM_OpOffPtr(v *Value) bool {
15086 v_0 := v.Args[0]
15087
15088
15089 for {
15090 off := auxIntToInt64(v.AuxInt)
15091 ptr := v_0
15092 if ptr.Op != OpSP {
15093 break
15094 }
15095 v.reset(OpARMMOVWaddr)
15096 v.AuxInt = int32ToAuxInt(int32(off))
15097 v.AddArg(ptr)
15098 return true
15099 }
15100
15101
15102 for {
15103 off := auxIntToInt64(v.AuxInt)
15104 ptr := v_0
15105 v.reset(OpARMADDconst)
15106 v.AuxInt = int32ToAuxInt(int32(off))
15107 v.AddArg(ptr)
15108 return true
15109 }
15110 }
15111 func rewriteValueARM_OpRotateLeft16(v *Value) bool {
15112 v_1 := v.Args[1]
15113 v_0 := v.Args[0]
15114 b := v.Block
15115 typ := &b.Func.Config.Types
15116
15117
15118 for {
15119 t := v.Type
15120 x := v_0
15121 if v_1.Op != OpARMMOVWconst {
15122 break
15123 }
15124 c := auxIntToInt32(v_1.AuxInt)
15125 v.reset(OpOr16)
15126 v0 := b.NewValue0(v.Pos, OpLsh16x32, t)
15127 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
15128 v1.AuxInt = int32ToAuxInt(c & 15)
15129 v0.AddArg2(x, v1)
15130 v2 := b.NewValue0(v.Pos, OpRsh16Ux32, t)
15131 v3 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
15132 v3.AuxInt = int32ToAuxInt(-c & 15)
15133 v2.AddArg2(x, v3)
15134 v.AddArg2(v0, v2)
15135 return true
15136 }
15137 return false
15138 }
15139 func rewriteValueARM_OpRotateLeft32(v *Value) bool {
15140 v_1 := v.Args[1]
15141 v_0 := v.Args[0]
15142 b := v.Block
15143
15144
15145 for {
15146 x := v_0
15147 y := v_1
15148 v.reset(OpARMSRR)
15149 v0 := b.NewValue0(v.Pos, OpARMRSBconst, y.Type)
15150 v0.AuxInt = int32ToAuxInt(0)
15151 v0.AddArg(y)
15152 v.AddArg2(x, v0)
15153 return true
15154 }
15155 }
15156 func rewriteValueARM_OpRotateLeft8(v *Value) bool {
15157 v_1 := v.Args[1]
15158 v_0 := v.Args[0]
15159 b := v.Block
15160 typ := &b.Func.Config.Types
15161
15162
15163 for {
15164 t := v.Type
15165 x := v_0
15166 if v_1.Op != OpARMMOVWconst {
15167 break
15168 }
15169 c := auxIntToInt32(v_1.AuxInt)
15170 v.reset(OpOr8)
15171 v0 := b.NewValue0(v.Pos, OpLsh8x32, t)
15172 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
15173 v1.AuxInt = int32ToAuxInt(c & 7)
15174 v0.AddArg2(x, v1)
15175 v2 := b.NewValue0(v.Pos, OpRsh8Ux32, t)
15176 v3 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
15177 v3.AuxInt = int32ToAuxInt(-c & 7)
15178 v2.AddArg2(x, v3)
15179 v.AddArg2(v0, v2)
15180 return true
15181 }
15182 return false
15183 }
15184 func rewriteValueARM_OpRsh16Ux16(v *Value) bool {
15185 v_1 := v.Args[1]
15186 v_0 := v.Args[0]
15187 b := v.Block
15188 typ := &b.Func.Config.Types
15189
15190
15191 for {
15192 x := v_0
15193 y := v_1
15194 v.reset(OpARMCMOVWHSconst)
15195 v.AuxInt = int32ToAuxInt(0)
15196 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
15197 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15198 v1.AddArg(x)
15199 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15200 v2.AddArg(y)
15201 v0.AddArg2(v1, v2)
15202 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15203 v3.AuxInt = int32ToAuxInt(256)
15204 v3.AddArg(v2)
15205 v.AddArg2(v0, v3)
15206 return true
15207 }
15208 }
15209 func rewriteValueARM_OpRsh16Ux32(v *Value) bool {
15210 v_1 := v.Args[1]
15211 v_0 := v.Args[0]
15212 b := v.Block
15213 typ := &b.Func.Config.Types
15214
15215
15216 for {
15217 x := v_0
15218 y := v_1
15219 v.reset(OpARMCMOVWHSconst)
15220 v.AuxInt = int32ToAuxInt(0)
15221 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
15222 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15223 v1.AddArg(x)
15224 v0.AddArg2(v1, y)
15225 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15226 v2.AuxInt = int32ToAuxInt(256)
15227 v2.AddArg(y)
15228 v.AddArg2(v0, v2)
15229 return true
15230 }
15231 }
15232 func rewriteValueARM_OpRsh16Ux64(v *Value) bool {
15233 v_1 := v.Args[1]
15234 v_0 := v.Args[0]
15235 b := v.Block
15236 typ := &b.Func.Config.Types
15237
15238
15239
15240 for {
15241 x := v_0
15242 if v_1.Op != OpConst64 {
15243 break
15244 }
15245 c := auxIntToInt64(v_1.AuxInt)
15246 if !(uint64(c) < 16) {
15247 break
15248 }
15249 v.reset(OpARMSRLconst)
15250 v.AuxInt = int32ToAuxInt(int32(c + 16))
15251 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32)
15252 v0.AuxInt = int32ToAuxInt(16)
15253 v0.AddArg(x)
15254 v.AddArg(v0)
15255 return true
15256 }
15257
15258
15259
15260 for {
15261 if v_1.Op != OpConst64 {
15262 break
15263 }
15264 c := auxIntToInt64(v_1.AuxInt)
15265 if !(uint64(c) >= 16) {
15266 break
15267 }
15268 v.reset(OpConst16)
15269 v.AuxInt = int16ToAuxInt(0)
15270 return true
15271 }
15272 return false
15273 }
15274 func rewriteValueARM_OpRsh16Ux8(v *Value) bool {
15275 v_1 := v.Args[1]
15276 v_0 := v.Args[0]
15277 b := v.Block
15278 typ := &b.Func.Config.Types
15279
15280
15281 for {
15282 x := v_0
15283 y := v_1
15284 v.reset(OpARMSRL)
15285 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15286 v0.AddArg(x)
15287 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15288 v1.AddArg(y)
15289 v.AddArg2(v0, v1)
15290 return true
15291 }
15292 }
15293 func rewriteValueARM_OpRsh16x16(v *Value) bool {
15294 v_1 := v.Args[1]
15295 v_0 := v.Args[0]
15296 b := v.Block
15297 typ := &b.Func.Config.Types
15298
15299
15300 for {
15301 x := v_0
15302 y := v_1
15303 v.reset(OpARMSRAcond)
15304 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
15305 v0.AddArg(x)
15306 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15307 v1.AddArg(y)
15308 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15309 v2.AuxInt = int32ToAuxInt(256)
15310 v2.AddArg(v1)
15311 v.AddArg3(v0, v1, v2)
15312 return true
15313 }
15314 }
15315 func rewriteValueARM_OpRsh16x32(v *Value) bool {
15316 v_1 := v.Args[1]
15317 v_0 := v.Args[0]
15318 b := v.Block
15319 typ := &b.Func.Config.Types
15320
15321
15322 for {
15323 x := v_0
15324 y := v_1
15325 v.reset(OpARMSRAcond)
15326 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
15327 v0.AddArg(x)
15328 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15329 v1.AuxInt = int32ToAuxInt(256)
15330 v1.AddArg(y)
15331 v.AddArg3(v0, y, v1)
15332 return true
15333 }
15334 }
15335 func rewriteValueARM_OpRsh16x64(v *Value) bool {
15336 v_1 := v.Args[1]
15337 v_0 := v.Args[0]
15338 b := v.Block
15339 typ := &b.Func.Config.Types
15340
15341
15342
15343 for {
15344 x := v_0
15345 if v_1.Op != OpConst64 {
15346 break
15347 }
15348 c := auxIntToInt64(v_1.AuxInt)
15349 if !(uint64(c) < 16) {
15350 break
15351 }
15352 v.reset(OpARMSRAconst)
15353 v.AuxInt = int32ToAuxInt(int32(c + 16))
15354 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32)
15355 v0.AuxInt = int32ToAuxInt(16)
15356 v0.AddArg(x)
15357 v.AddArg(v0)
15358 return true
15359 }
15360
15361
15362
15363 for {
15364 x := v_0
15365 if v_1.Op != OpConst64 {
15366 break
15367 }
15368 c := auxIntToInt64(v_1.AuxInt)
15369 if !(uint64(c) >= 16) {
15370 break
15371 }
15372 v.reset(OpARMSRAconst)
15373 v.AuxInt = int32ToAuxInt(31)
15374 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32)
15375 v0.AuxInt = int32ToAuxInt(16)
15376 v0.AddArg(x)
15377 v.AddArg(v0)
15378 return true
15379 }
15380 return false
15381 }
15382 func rewriteValueARM_OpRsh16x8(v *Value) bool {
15383 v_1 := v.Args[1]
15384 v_0 := v.Args[0]
15385 b := v.Block
15386 typ := &b.Func.Config.Types
15387
15388
15389 for {
15390 x := v_0
15391 y := v_1
15392 v.reset(OpARMSRA)
15393 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
15394 v0.AddArg(x)
15395 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15396 v1.AddArg(y)
15397 v.AddArg2(v0, v1)
15398 return true
15399 }
15400 }
15401 func rewriteValueARM_OpRsh32Ux16(v *Value) bool {
15402 v_1 := v.Args[1]
15403 v_0 := v.Args[0]
15404 b := v.Block
15405 typ := &b.Func.Config.Types
15406
15407
15408 for {
15409 x := v_0
15410 y := v_1
15411 v.reset(OpARMCMOVWHSconst)
15412 v.AuxInt = int32ToAuxInt(0)
15413 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
15414 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15415 v1.AddArg(y)
15416 v0.AddArg2(x, v1)
15417 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15418 v2.AuxInt = int32ToAuxInt(256)
15419 v2.AddArg(v1)
15420 v.AddArg2(v0, v2)
15421 return true
15422 }
15423 }
15424 func rewriteValueARM_OpRsh32Ux32(v *Value) bool {
15425 v_1 := v.Args[1]
15426 v_0 := v.Args[0]
15427 b := v.Block
15428
15429
15430 for {
15431 x := v_0
15432 y := v_1
15433 v.reset(OpARMCMOVWHSconst)
15434 v.AuxInt = int32ToAuxInt(0)
15435 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
15436 v0.AddArg2(x, y)
15437 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15438 v1.AuxInt = int32ToAuxInt(256)
15439 v1.AddArg(y)
15440 v.AddArg2(v0, v1)
15441 return true
15442 }
15443 }
15444 func rewriteValueARM_OpRsh32Ux64(v *Value) bool {
15445 v_1 := v.Args[1]
15446 v_0 := v.Args[0]
15447
15448
15449
15450 for {
15451 x := v_0
15452 if v_1.Op != OpConst64 {
15453 break
15454 }
15455 c := auxIntToInt64(v_1.AuxInt)
15456 if !(uint64(c) < 32) {
15457 break
15458 }
15459 v.reset(OpARMSRLconst)
15460 v.AuxInt = int32ToAuxInt(int32(c))
15461 v.AddArg(x)
15462 return true
15463 }
15464
15465
15466
15467 for {
15468 if v_1.Op != OpConst64 {
15469 break
15470 }
15471 c := auxIntToInt64(v_1.AuxInt)
15472 if !(uint64(c) >= 32) {
15473 break
15474 }
15475 v.reset(OpConst32)
15476 v.AuxInt = int32ToAuxInt(0)
15477 return true
15478 }
15479 return false
15480 }
15481 func rewriteValueARM_OpRsh32Ux8(v *Value) bool {
15482 v_1 := v.Args[1]
15483 v_0 := v.Args[0]
15484 b := v.Block
15485 typ := &b.Func.Config.Types
15486
15487
15488 for {
15489 x := v_0
15490 y := v_1
15491 v.reset(OpARMSRL)
15492 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15493 v0.AddArg(y)
15494 v.AddArg2(x, v0)
15495 return true
15496 }
15497 }
15498 func rewriteValueARM_OpRsh32x16(v *Value) bool {
15499 v_1 := v.Args[1]
15500 v_0 := v.Args[0]
15501 b := v.Block
15502 typ := &b.Func.Config.Types
15503
15504
15505 for {
15506 x := v_0
15507 y := v_1
15508 v.reset(OpARMSRAcond)
15509 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15510 v0.AddArg(y)
15511 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15512 v1.AuxInt = int32ToAuxInt(256)
15513 v1.AddArg(v0)
15514 v.AddArg3(x, v0, v1)
15515 return true
15516 }
15517 }
15518 func rewriteValueARM_OpRsh32x32(v *Value) bool {
15519 v_1 := v.Args[1]
15520 v_0 := v.Args[0]
15521 b := v.Block
15522
15523
15524 for {
15525 x := v_0
15526 y := v_1
15527 v.reset(OpARMSRAcond)
15528 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15529 v0.AuxInt = int32ToAuxInt(256)
15530 v0.AddArg(y)
15531 v.AddArg3(x, y, v0)
15532 return true
15533 }
15534 }
15535 func rewriteValueARM_OpRsh32x64(v *Value) bool {
15536 v_1 := v.Args[1]
15537 v_0 := v.Args[0]
15538
15539
15540
15541 for {
15542 x := v_0
15543 if v_1.Op != OpConst64 {
15544 break
15545 }
15546 c := auxIntToInt64(v_1.AuxInt)
15547 if !(uint64(c) < 32) {
15548 break
15549 }
15550 v.reset(OpARMSRAconst)
15551 v.AuxInt = int32ToAuxInt(int32(c))
15552 v.AddArg(x)
15553 return true
15554 }
15555
15556
15557
15558 for {
15559 x := v_0
15560 if v_1.Op != OpConst64 {
15561 break
15562 }
15563 c := auxIntToInt64(v_1.AuxInt)
15564 if !(uint64(c) >= 32) {
15565 break
15566 }
15567 v.reset(OpARMSRAconst)
15568 v.AuxInt = int32ToAuxInt(31)
15569 v.AddArg(x)
15570 return true
15571 }
15572 return false
15573 }
15574 func rewriteValueARM_OpRsh32x8(v *Value) bool {
15575 v_1 := v.Args[1]
15576 v_0 := v.Args[0]
15577 b := v.Block
15578 typ := &b.Func.Config.Types
15579
15580
15581 for {
15582 x := v_0
15583 y := v_1
15584 v.reset(OpARMSRA)
15585 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15586 v0.AddArg(y)
15587 v.AddArg2(x, v0)
15588 return true
15589 }
15590 }
15591 func rewriteValueARM_OpRsh8Ux16(v *Value) bool {
15592 v_1 := v.Args[1]
15593 v_0 := v.Args[0]
15594 b := v.Block
15595 typ := &b.Func.Config.Types
15596
15597
15598 for {
15599 x := v_0
15600 y := v_1
15601 v.reset(OpARMCMOVWHSconst)
15602 v.AuxInt = int32ToAuxInt(0)
15603 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
15604 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15605 v1.AddArg(x)
15606 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15607 v2.AddArg(y)
15608 v0.AddArg2(v1, v2)
15609 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15610 v3.AuxInt = int32ToAuxInt(256)
15611 v3.AddArg(v2)
15612 v.AddArg2(v0, v3)
15613 return true
15614 }
15615 }
15616 func rewriteValueARM_OpRsh8Ux32(v *Value) bool {
15617 v_1 := v.Args[1]
15618 v_0 := v.Args[0]
15619 b := v.Block
15620 typ := &b.Func.Config.Types
15621
15622
15623 for {
15624 x := v_0
15625 y := v_1
15626 v.reset(OpARMCMOVWHSconst)
15627 v.AuxInt = int32ToAuxInt(0)
15628 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type)
15629 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15630 v1.AddArg(x)
15631 v0.AddArg2(v1, y)
15632 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15633 v2.AuxInt = int32ToAuxInt(256)
15634 v2.AddArg(y)
15635 v.AddArg2(v0, v2)
15636 return true
15637 }
15638 }
15639 func rewriteValueARM_OpRsh8Ux64(v *Value) bool {
15640 v_1 := v.Args[1]
15641 v_0 := v.Args[0]
15642 b := v.Block
15643 typ := &b.Func.Config.Types
15644
15645
15646
15647 for {
15648 x := v_0
15649 if v_1.Op != OpConst64 {
15650 break
15651 }
15652 c := auxIntToInt64(v_1.AuxInt)
15653 if !(uint64(c) < 8) {
15654 break
15655 }
15656 v.reset(OpARMSRLconst)
15657 v.AuxInt = int32ToAuxInt(int32(c + 24))
15658 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32)
15659 v0.AuxInt = int32ToAuxInt(24)
15660 v0.AddArg(x)
15661 v.AddArg(v0)
15662 return true
15663 }
15664
15665
15666
15667 for {
15668 if v_1.Op != OpConst64 {
15669 break
15670 }
15671 c := auxIntToInt64(v_1.AuxInt)
15672 if !(uint64(c) >= 8) {
15673 break
15674 }
15675 v.reset(OpConst8)
15676 v.AuxInt = int8ToAuxInt(0)
15677 return true
15678 }
15679 return false
15680 }
15681 func rewriteValueARM_OpRsh8Ux8(v *Value) bool {
15682 v_1 := v.Args[1]
15683 v_0 := v.Args[0]
15684 b := v.Block
15685 typ := &b.Func.Config.Types
15686
15687
15688 for {
15689 x := v_0
15690 y := v_1
15691 v.reset(OpARMSRL)
15692 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15693 v0.AddArg(x)
15694 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15695 v1.AddArg(y)
15696 v.AddArg2(v0, v1)
15697 return true
15698 }
15699 }
15700 func rewriteValueARM_OpRsh8x16(v *Value) bool {
15701 v_1 := v.Args[1]
15702 v_0 := v.Args[0]
15703 b := v.Block
15704 typ := &b.Func.Config.Types
15705
15706
15707 for {
15708 x := v_0
15709 y := v_1
15710 v.reset(OpARMSRAcond)
15711 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
15712 v0.AddArg(x)
15713 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
15714 v1.AddArg(y)
15715 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15716 v2.AuxInt = int32ToAuxInt(256)
15717 v2.AddArg(v1)
15718 v.AddArg3(v0, v1, v2)
15719 return true
15720 }
15721 }
15722 func rewriteValueARM_OpRsh8x32(v *Value) bool {
15723 v_1 := v.Args[1]
15724 v_0 := v.Args[0]
15725 b := v.Block
15726 typ := &b.Func.Config.Types
15727
15728
15729 for {
15730 x := v_0
15731 y := v_1
15732 v.reset(OpARMSRAcond)
15733 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
15734 v0.AddArg(x)
15735 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags)
15736 v1.AuxInt = int32ToAuxInt(256)
15737 v1.AddArg(y)
15738 v.AddArg3(v0, y, v1)
15739 return true
15740 }
15741 }
15742 func rewriteValueARM_OpRsh8x64(v *Value) bool {
15743 v_1 := v.Args[1]
15744 v_0 := v.Args[0]
15745 b := v.Block
15746 typ := &b.Func.Config.Types
15747
15748
15749
15750 for {
15751 x := v_0
15752 if v_1.Op != OpConst64 {
15753 break
15754 }
15755 c := auxIntToInt64(v_1.AuxInt)
15756 if !(uint64(c) < 8) {
15757 break
15758 }
15759 v.reset(OpARMSRAconst)
15760 v.AuxInt = int32ToAuxInt(int32(c + 24))
15761 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32)
15762 v0.AuxInt = int32ToAuxInt(24)
15763 v0.AddArg(x)
15764 v.AddArg(v0)
15765 return true
15766 }
15767
15768
15769
15770 for {
15771 x := v_0
15772 if v_1.Op != OpConst64 {
15773 break
15774 }
15775 c := auxIntToInt64(v_1.AuxInt)
15776 if !(uint64(c) >= 8) {
15777 break
15778 }
15779 v.reset(OpARMSRAconst)
15780 v.AuxInt = int32ToAuxInt(31)
15781 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32)
15782 v0.AuxInt = int32ToAuxInt(24)
15783 v0.AddArg(x)
15784 v.AddArg(v0)
15785 return true
15786 }
15787 return false
15788 }
15789 func rewriteValueARM_OpRsh8x8(v *Value) bool {
15790 v_1 := v.Args[1]
15791 v_0 := v.Args[0]
15792 b := v.Block
15793 typ := &b.Func.Config.Types
15794
15795
15796 for {
15797 x := v_0
15798 y := v_1
15799 v.reset(OpARMSRA)
15800 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
15801 v0.AddArg(x)
15802 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
15803 v1.AddArg(y)
15804 v.AddArg2(v0, v1)
15805 return true
15806 }
15807 }
15808 func rewriteValueARM_OpSelect0(v *Value) bool {
15809 v_0 := v.Args[0]
15810
15811
15812 for {
15813 if v_0.Op != OpARMCALLudiv {
15814 break
15815 }
15816 _ = v_0.Args[1]
15817 x := v_0.Args[0]
15818 v_0_1 := v_0.Args[1]
15819 if v_0_1.Op != OpARMMOVWconst || auxIntToInt32(v_0_1.AuxInt) != 1 {
15820 break
15821 }
15822 v.copyOf(x)
15823 return true
15824 }
15825
15826
15827
15828 for {
15829 if v_0.Op != OpARMCALLudiv {
15830 break
15831 }
15832 _ = v_0.Args[1]
15833 x := v_0.Args[0]
15834 v_0_1 := v_0.Args[1]
15835 if v_0_1.Op != OpARMMOVWconst {
15836 break
15837 }
15838 c := auxIntToInt32(v_0_1.AuxInt)
15839 if !(isPowerOfTwo(c)) {
15840 break
15841 }
15842 v.reset(OpARMSRLconst)
15843 v.AuxInt = int32ToAuxInt(int32(log32(c)))
15844 v.AddArg(x)
15845 return true
15846 }
15847
15848
15849
15850 for {
15851 if v_0.Op != OpARMCALLudiv {
15852 break
15853 }
15854 _ = v_0.Args[1]
15855 v_0_0 := v_0.Args[0]
15856 if v_0_0.Op != OpARMMOVWconst {
15857 break
15858 }
15859 c := auxIntToInt32(v_0_0.AuxInt)
15860 v_0_1 := v_0.Args[1]
15861 if v_0_1.Op != OpARMMOVWconst {
15862 break
15863 }
15864 d := auxIntToInt32(v_0_1.AuxInt)
15865 if !(d != 0) {
15866 break
15867 }
15868 v.reset(OpARMMOVWconst)
15869 v.AuxInt = int32ToAuxInt(int32(uint32(c) / uint32(d)))
15870 return true
15871 }
15872 return false
15873 }
15874 func rewriteValueARM_OpSelect1(v *Value) bool {
15875 v_0 := v.Args[0]
15876
15877
15878 for {
15879 if v_0.Op != OpARMCALLudiv {
15880 break
15881 }
15882 _ = v_0.Args[1]
15883 v_0_1 := v_0.Args[1]
15884 if v_0_1.Op != OpARMMOVWconst || auxIntToInt32(v_0_1.AuxInt) != 1 {
15885 break
15886 }
15887 v.reset(OpARMMOVWconst)
15888 v.AuxInt = int32ToAuxInt(0)
15889 return true
15890 }
15891
15892
15893
15894 for {
15895 if v_0.Op != OpARMCALLudiv {
15896 break
15897 }
15898 _ = v_0.Args[1]
15899 x := v_0.Args[0]
15900 v_0_1 := v_0.Args[1]
15901 if v_0_1.Op != OpARMMOVWconst {
15902 break
15903 }
15904 c := auxIntToInt32(v_0_1.AuxInt)
15905 if !(isPowerOfTwo(c)) {
15906 break
15907 }
15908 v.reset(OpARMANDconst)
15909 v.AuxInt = int32ToAuxInt(c - 1)
15910 v.AddArg(x)
15911 return true
15912 }
15913
15914
15915
15916 for {
15917 if v_0.Op != OpARMCALLudiv {
15918 break
15919 }
15920 _ = v_0.Args[1]
15921 v_0_0 := v_0.Args[0]
15922 if v_0_0.Op != OpARMMOVWconst {
15923 break
15924 }
15925 c := auxIntToInt32(v_0_0.AuxInt)
15926 v_0_1 := v_0.Args[1]
15927 if v_0_1.Op != OpARMMOVWconst {
15928 break
15929 }
15930 d := auxIntToInt32(v_0_1.AuxInt)
15931 if !(d != 0) {
15932 break
15933 }
15934 v.reset(OpARMMOVWconst)
15935 v.AuxInt = int32ToAuxInt(int32(uint32(c) % uint32(d)))
15936 return true
15937 }
15938 return false
15939 }
15940 func rewriteValueARM_OpSignmask(v *Value) bool {
15941 v_0 := v.Args[0]
15942
15943
15944 for {
15945 x := v_0
15946 v.reset(OpARMSRAconst)
15947 v.AuxInt = int32ToAuxInt(31)
15948 v.AddArg(x)
15949 return true
15950 }
15951 }
15952 func rewriteValueARM_OpSlicemask(v *Value) bool {
15953 v_0 := v.Args[0]
15954 b := v.Block
15955
15956
15957 for {
15958 t := v.Type
15959 x := v_0
15960 v.reset(OpARMSRAconst)
15961 v.AuxInt = int32ToAuxInt(31)
15962 v0 := b.NewValue0(v.Pos, OpARMRSBconst, t)
15963 v0.AuxInt = int32ToAuxInt(0)
15964 v0.AddArg(x)
15965 v.AddArg(v0)
15966 return true
15967 }
15968 }
15969 func rewriteValueARM_OpStore(v *Value) bool {
15970 v_2 := v.Args[2]
15971 v_1 := v.Args[1]
15972 v_0 := v.Args[0]
15973
15974
15975
15976 for {
15977 t := auxToType(v.Aux)
15978 ptr := v_0
15979 val := v_1
15980 mem := v_2
15981 if !(t.Size() == 1) {
15982 break
15983 }
15984 v.reset(OpARMMOVBstore)
15985 v.AddArg3(ptr, val, mem)
15986 return true
15987 }
15988
15989
15990
15991 for {
15992 t := auxToType(v.Aux)
15993 ptr := v_0
15994 val := v_1
15995 mem := v_2
15996 if !(t.Size() == 2) {
15997 break
15998 }
15999 v.reset(OpARMMOVHstore)
16000 v.AddArg3(ptr, val, mem)
16001 return true
16002 }
16003
16004
16005
16006 for {
16007 t := auxToType(v.Aux)
16008 ptr := v_0
16009 val := v_1
16010 mem := v_2
16011 if !(t.Size() == 4 && !t.IsFloat()) {
16012 break
16013 }
16014 v.reset(OpARMMOVWstore)
16015 v.AddArg3(ptr, val, mem)
16016 return true
16017 }
16018
16019
16020
16021 for {
16022 t := auxToType(v.Aux)
16023 ptr := v_0
16024 val := v_1
16025 mem := v_2
16026 if !(t.Size() == 4 && t.IsFloat()) {
16027 break
16028 }
16029 v.reset(OpARMMOVFstore)
16030 v.AddArg3(ptr, val, mem)
16031 return true
16032 }
16033
16034
16035
16036 for {
16037 t := auxToType(v.Aux)
16038 ptr := v_0
16039 val := v_1
16040 mem := v_2
16041 if !(t.Size() == 8 && t.IsFloat()) {
16042 break
16043 }
16044 v.reset(OpARMMOVDstore)
16045 v.AddArg3(ptr, val, mem)
16046 return true
16047 }
16048 return false
16049 }
16050 func rewriteValueARM_OpZero(v *Value) bool {
16051 v_1 := v.Args[1]
16052 v_0 := v.Args[0]
16053 b := v.Block
16054 config := b.Func.Config
16055 typ := &b.Func.Config.Types
16056
16057
16058 for {
16059 if auxIntToInt64(v.AuxInt) != 0 {
16060 break
16061 }
16062 mem := v_1
16063 v.copyOf(mem)
16064 return true
16065 }
16066
16067
16068 for {
16069 if auxIntToInt64(v.AuxInt) != 1 {
16070 break
16071 }
16072 ptr := v_0
16073 mem := v_1
16074 v.reset(OpARMMOVBstore)
16075 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16076 v0.AuxInt = int32ToAuxInt(0)
16077 v.AddArg3(ptr, v0, mem)
16078 return true
16079 }
16080
16081
16082
16083 for {
16084 if auxIntToInt64(v.AuxInt) != 2 {
16085 break
16086 }
16087 t := auxToType(v.Aux)
16088 ptr := v_0
16089 mem := v_1
16090 if !(t.Alignment()%2 == 0) {
16091 break
16092 }
16093 v.reset(OpARMMOVHstore)
16094 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16095 v0.AuxInt = int32ToAuxInt(0)
16096 v.AddArg3(ptr, v0, mem)
16097 return true
16098 }
16099
16100
16101 for {
16102 if auxIntToInt64(v.AuxInt) != 2 {
16103 break
16104 }
16105 ptr := v_0
16106 mem := v_1
16107 v.reset(OpARMMOVBstore)
16108 v.AuxInt = int32ToAuxInt(1)
16109 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16110 v0.AuxInt = int32ToAuxInt(0)
16111 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
16112 v1.AuxInt = int32ToAuxInt(0)
16113 v1.AddArg3(ptr, v0, mem)
16114 v.AddArg3(ptr, v0, v1)
16115 return true
16116 }
16117
16118
16119
16120 for {
16121 if auxIntToInt64(v.AuxInt) != 4 {
16122 break
16123 }
16124 t := auxToType(v.Aux)
16125 ptr := v_0
16126 mem := v_1
16127 if !(t.Alignment()%4 == 0) {
16128 break
16129 }
16130 v.reset(OpARMMOVWstore)
16131 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16132 v0.AuxInt = int32ToAuxInt(0)
16133 v.AddArg3(ptr, v0, mem)
16134 return true
16135 }
16136
16137
16138
16139 for {
16140 if auxIntToInt64(v.AuxInt) != 4 {
16141 break
16142 }
16143 t := auxToType(v.Aux)
16144 ptr := v_0
16145 mem := v_1
16146 if !(t.Alignment()%2 == 0) {
16147 break
16148 }
16149 v.reset(OpARMMOVHstore)
16150 v.AuxInt = int32ToAuxInt(2)
16151 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16152 v0.AuxInt = int32ToAuxInt(0)
16153 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem)
16154 v1.AuxInt = int32ToAuxInt(0)
16155 v1.AddArg3(ptr, v0, mem)
16156 v.AddArg3(ptr, v0, v1)
16157 return true
16158 }
16159
16160
16161 for {
16162 if auxIntToInt64(v.AuxInt) != 4 {
16163 break
16164 }
16165 ptr := v_0
16166 mem := v_1
16167 v.reset(OpARMMOVBstore)
16168 v.AuxInt = int32ToAuxInt(3)
16169 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16170 v0.AuxInt = int32ToAuxInt(0)
16171 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
16172 v1.AuxInt = int32ToAuxInt(2)
16173 v2 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
16174 v2.AuxInt = int32ToAuxInt(1)
16175 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
16176 v3.AuxInt = int32ToAuxInt(0)
16177 v3.AddArg3(ptr, v0, mem)
16178 v2.AddArg3(ptr, v0, v3)
16179 v1.AddArg3(ptr, v0, v2)
16180 v.AddArg3(ptr, v0, v1)
16181 return true
16182 }
16183
16184
16185 for {
16186 if auxIntToInt64(v.AuxInt) != 3 {
16187 break
16188 }
16189 ptr := v_0
16190 mem := v_1
16191 v.reset(OpARMMOVBstore)
16192 v.AuxInt = int32ToAuxInt(2)
16193 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16194 v0.AuxInt = int32ToAuxInt(0)
16195 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
16196 v1.AuxInt = int32ToAuxInt(1)
16197 v2 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem)
16198 v2.AuxInt = int32ToAuxInt(0)
16199 v2.AddArg3(ptr, v0, mem)
16200 v1.AddArg3(ptr, v0, v2)
16201 v.AddArg3(ptr, v0, v1)
16202 return true
16203 }
16204
16205
16206
16207 for {
16208 s := auxIntToInt64(v.AuxInt)
16209 t := auxToType(v.Aux)
16210 ptr := v_0
16211 mem := v_1
16212 if !(s%4 == 0 && s > 4 && s <= 512 && t.Alignment()%4 == 0) {
16213 break
16214 }
16215 v.reset(OpARMDUFFZERO)
16216 v.AuxInt = int64ToAuxInt(4 * (128 - s/4))
16217 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16218 v0.AuxInt = int32ToAuxInt(0)
16219 v.AddArg3(ptr, v0, mem)
16220 return true
16221 }
16222
16223
16224
16225 for {
16226 s := auxIntToInt64(v.AuxInt)
16227 t := auxToType(v.Aux)
16228 ptr := v_0
16229 mem := v_1
16230 if !(s > 512 || t.Alignment()%4 != 0) {
16231 break
16232 }
16233 v.reset(OpARMLoweredZero)
16234 v.AuxInt = int64ToAuxInt(t.Alignment())
16235 v0 := b.NewValue0(v.Pos, OpARMADDconst, ptr.Type)
16236 v0.AuxInt = int32ToAuxInt(int32(s - moveSize(t.Alignment(), config)))
16237 v0.AddArg(ptr)
16238 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32)
16239 v1.AuxInt = int32ToAuxInt(0)
16240 v.AddArg4(ptr, v0, v1, mem)
16241 return true
16242 }
16243 return false
16244 }
16245 func rewriteValueARM_OpZeromask(v *Value) bool {
16246 v_0 := v.Args[0]
16247 b := v.Block
16248 typ := &b.Func.Config.Types
16249
16250
16251 for {
16252 x := v_0
16253 v.reset(OpARMSRAconst)
16254 v.AuxInt = int32ToAuxInt(31)
16255 v0 := b.NewValue0(v.Pos, OpARMRSBshiftRL, typ.Int32)
16256 v0.AuxInt = int32ToAuxInt(1)
16257 v0.AddArg2(x, x)
16258 v.AddArg(v0)
16259 return true
16260 }
16261 }
16262 func rewriteBlockARM(b *Block) bool {
16263 switch b.Kind {
16264 case BlockARMEQ:
16265
16266
16267
16268 for b.Controls[0].Op == OpARMFlagConstant {
16269 v_0 := b.Controls[0]
16270 fc := auxIntToFlagConstant(v_0.AuxInt)
16271 if !(fc.eq()) {
16272 break
16273 }
16274 b.Reset(BlockFirst)
16275 return true
16276 }
16277
16278
16279
16280 for b.Controls[0].Op == OpARMFlagConstant {
16281 v_0 := b.Controls[0]
16282 fc := auxIntToFlagConstant(v_0.AuxInt)
16283 if !(!fc.eq()) {
16284 break
16285 }
16286 b.Reset(BlockFirst)
16287 b.swapSuccessors()
16288 return true
16289 }
16290
16291
16292 for b.Controls[0].Op == OpARMInvertFlags {
16293 v_0 := b.Controls[0]
16294 cmp := v_0.Args[0]
16295 b.resetWithControl(BlockARMEQ, cmp)
16296 return true
16297 }
16298
16299
16300 for b.Controls[0].Op == OpARMCMP {
16301 v_0 := b.Controls[0]
16302 _ = v_0.Args[1]
16303 x := v_0.Args[0]
16304 v_0_1 := v_0.Args[1]
16305 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 {
16306 break
16307 }
16308 y := v_0_1.Args[0]
16309 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
16310 v0.AddArg2(x, y)
16311 b.resetWithControl(BlockARMEQ, v0)
16312 return true
16313 }
16314
16315
16316 for b.Controls[0].Op == OpARMCMN {
16317 v_0 := b.Controls[0]
16318 _ = v_0.Args[1]
16319 v_0_0 := v_0.Args[0]
16320 v_0_1 := v_0.Args[1]
16321 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
16322 x := v_0_0
16323 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 {
16324 continue
16325 }
16326 y := v_0_1.Args[0]
16327 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
16328 v0.AddArg2(x, y)
16329 b.resetWithControl(BlockARMEQ, v0)
16330 return true
16331 }
16332 break
16333 }
16334
16335
16336
16337 for b.Controls[0].Op == OpARMCMPconst {
16338 v_0 := b.Controls[0]
16339 if auxIntToInt32(v_0.AuxInt) != 0 {
16340 break
16341 }
16342 l := v_0.Args[0]
16343 if l.Op != OpARMSUB {
16344 break
16345 }
16346 y := l.Args[1]
16347 x := l.Args[0]
16348 if !(l.Uses == 1) {
16349 break
16350 }
16351 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
16352 v0.AddArg2(x, y)
16353 b.resetWithControl(BlockARMEQ, v0)
16354 return true
16355 }
16356
16357
16358
16359 for b.Controls[0].Op == OpARMCMPconst {
16360 v_0 := b.Controls[0]
16361 if auxIntToInt32(v_0.AuxInt) != 0 {
16362 break
16363 }
16364 l := v_0.Args[0]
16365 if l.Op != OpARMMULS {
16366 break
16367 }
16368 a := l.Args[2]
16369 x := l.Args[0]
16370 y := l.Args[1]
16371 if !(l.Uses == 1) {
16372 break
16373 }
16374 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
16375 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
16376 v1.AddArg2(x, y)
16377 v0.AddArg2(a, v1)
16378 b.resetWithControl(BlockARMEQ, v0)
16379 return true
16380 }
16381
16382
16383
16384 for b.Controls[0].Op == OpARMCMPconst {
16385 v_0 := b.Controls[0]
16386 if auxIntToInt32(v_0.AuxInt) != 0 {
16387 break
16388 }
16389 l := v_0.Args[0]
16390 if l.Op != OpARMSUBconst {
16391 break
16392 }
16393 c := auxIntToInt32(l.AuxInt)
16394 x := l.Args[0]
16395 if !(l.Uses == 1) {
16396 break
16397 }
16398 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags)
16399 v0.AuxInt = int32ToAuxInt(c)
16400 v0.AddArg(x)
16401 b.resetWithControl(BlockARMEQ, v0)
16402 return true
16403 }
16404
16405
16406
16407 for b.Controls[0].Op == OpARMCMPconst {
16408 v_0 := b.Controls[0]
16409 if auxIntToInt32(v_0.AuxInt) != 0 {
16410 break
16411 }
16412 l := v_0.Args[0]
16413 if l.Op != OpARMSUBshiftLL {
16414 break
16415 }
16416 c := auxIntToInt32(l.AuxInt)
16417 y := l.Args[1]
16418 x := l.Args[0]
16419 if !(l.Uses == 1) {
16420 break
16421 }
16422 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags)
16423 v0.AuxInt = int32ToAuxInt(c)
16424 v0.AddArg2(x, y)
16425 b.resetWithControl(BlockARMEQ, v0)
16426 return true
16427 }
16428
16429
16430
16431 for b.Controls[0].Op == OpARMCMPconst {
16432 v_0 := b.Controls[0]
16433 if auxIntToInt32(v_0.AuxInt) != 0 {
16434 break
16435 }
16436 l := v_0.Args[0]
16437 if l.Op != OpARMSUBshiftRL {
16438 break
16439 }
16440 c := auxIntToInt32(l.AuxInt)
16441 y := l.Args[1]
16442 x := l.Args[0]
16443 if !(l.Uses == 1) {
16444 break
16445 }
16446 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags)
16447 v0.AuxInt = int32ToAuxInt(c)
16448 v0.AddArg2(x, y)
16449 b.resetWithControl(BlockARMEQ, v0)
16450 return true
16451 }
16452
16453
16454
16455 for b.Controls[0].Op == OpARMCMPconst {
16456 v_0 := b.Controls[0]
16457 if auxIntToInt32(v_0.AuxInt) != 0 {
16458 break
16459 }
16460 l := v_0.Args[0]
16461 if l.Op != OpARMSUBshiftRA {
16462 break
16463 }
16464 c := auxIntToInt32(l.AuxInt)
16465 y := l.Args[1]
16466 x := l.Args[0]
16467 if !(l.Uses == 1) {
16468 break
16469 }
16470 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags)
16471 v0.AuxInt = int32ToAuxInt(c)
16472 v0.AddArg2(x, y)
16473 b.resetWithControl(BlockARMEQ, v0)
16474 return true
16475 }
16476
16477
16478
16479 for b.Controls[0].Op == OpARMCMPconst {
16480 v_0 := b.Controls[0]
16481 if auxIntToInt32(v_0.AuxInt) != 0 {
16482 break
16483 }
16484 l := v_0.Args[0]
16485 if l.Op != OpARMSUBshiftLLreg {
16486 break
16487 }
16488 z := l.Args[2]
16489 x := l.Args[0]
16490 y := l.Args[1]
16491 if !(l.Uses == 1) {
16492 break
16493 }
16494 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
16495 v0.AddArg3(x, y, z)
16496 b.resetWithControl(BlockARMEQ, v0)
16497 return true
16498 }
16499
16500
16501
16502 for b.Controls[0].Op == OpARMCMPconst {
16503 v_0 := b.Controls[0]
16504 if auxIntToInt32(v_0.AuxInt) != 0 {
16505 break
16506 }
16507 l := v_0.Args[0]
16508 if l.Op != OpARMSUBshiftRLreg {
16509 break
16510 }
16511 z := l.Args[2]
16512 x := l.Args[0]
16513 y := l.Args[1]
16514 if !(l.Uses == 1) {
16515 break
16516 }
16517 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
16518 v0.AddArg3(x, y, z)
16519 b.resetWithControl(BlockARMEQ, v0)
16520 return true
16521 }
16522
16523
16524
16525 for b.Controls[0].Op == OpARMCMPconst {
16526 v_0 := b.Controls[0]
16527 if auxIntToInt32(v_0.AuxInt) != 0 {
16528 break
16529 }
16530 l := v_0.Args[0]
16531 if l.Op != OpARMSUBshiftRAreg {
16532 break
16533 }
16534 z := l.Args[2]
16535 x := l.Args[0]
16536 y := l.Args[1]
16537 if !(l.Uses == 1) {
16538 break
16539 }
16540 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
16541 v0.AddArg3(x, y, z)
16542 b.resetWithControl(BlockARMEQ, v0)
16543 return true
16544 }
16545
16546
16547
16548 for b.Controls[0].Op == OpARMCMPconst {
16549 v_0 := b.Controls[0]
16550 if auxIntToInt32(v_0.AuxInt) != 0 {
16551 break
16552 }
16553 l := v_0.Args[0]
16554 if l.Op != OpARMADD {
16555 break
16556 }
16557 _ = l.Args[1]
16558 l_0 := l.Args[0]
16559 l_1 := l.Args[1]
16560 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
16561 x := l_0
16562 y := l_1
16563 if !(l.Uses == 1) {
16564 continue
16565 }
16566 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
16567 v0.AddArg2(x, y)
16568 b.resetWithControl(BlockARMEQ, v0)
16569 return true
16570 }
16571 break
16572 }
16573
16574
16575
16576 for b.Controls[0].Op == OpARMCMPconst {
16577 v_0 := b.Controls[0]
16578 if auxIntToInt32(v_0.AuxInt) != 0 {
16579 break
16580 }
16581 l := v_0.Args[0]
16582 if l.Op != OpARMMULA {
16583 break
16584 }
16585 a := l.Args[2]
16586 x := l.Args[0]
16587 y := l.Args[1]
16588 if !(l.Uses == 1) {
16589 break
16590 }
16591 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
16592 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
16593 v1.AddArg2(x, y)
16594 v0.AddArg2(a, v1)
16595 b.resetWithControl(BlockARMEQ, v0)
16596 return true
16597 }
16598
16599
16600
16601 for b.Controls[0].Op == OpARMCMPconst {
16602 v_0 := b.Controls[0]
16603 if auxIntToInt32(v_0.AuxInt) != 0 {
16604 break
16605 }
16606 l := v_0.Args[0]
16607 if l.Op != OpARMADDconst {
16608 break
16609 }
16610 c := auxIntToInt32(l.AuxInt)
16611 x := l.Args[0]
16612 if !(l.Uses == 1) {
16613 break
16614 }
16615 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags)
16616 v0.AuxInt = int32ToAuxInt(c)
16617 v0.AddArg(x)
16618 b.resetWithControl(BlockARMEQ, v0)
16619 return true
16620 }
16621
16622
16623
16624 for b.Controls[0].Op == OpARMCMPconst {
16625 v_0 := b.Controls[0]
16626 if auxIntToInt32(v_0.AuxInt) != 0 {
16627 break
16628 }
16629 l := v_0.Args[0]
16630 if l.Op != OpARMADDshiftLL {
16631 break
16632 }
16633 c := auxIntToInt32(l.AuxInt)
16634 y := l.Args[1]
16635 x := l.Args[0]
16636 if !(l.Uses == 1) {
16637 break
16638 }
16639 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags)
16640 v0.AuxInt = int32ToAuxInt(c)
16641 v0.AddArg2(x, y)
16642 b.resetWithControl(BlockARMEQ, v0)
16643 return true
16644 }
16645
16646
16647
16648 for b.Controls[0].Op == OpARMCMPconst {
16649 v_0 := b.Controls[0]
16650 if auxIntToInt32(v_0.AuxInt) != 0 {
16651 break
16652 }
16653 l := v_0.Args[0]
16654 if l.Op != OpARMADDshiftRL {
16655 break
16656 }
16657 c := auxIntToInt32(l.AuxInt)
16658 y := l.Args[1]
16659 x := l.Args[0]
16660 if !(l.Uses == 1) {
16661 break
16662 }
16663 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags)
16664 v0.AuxInt = int32ToAuxInt(c)
16665 v0.AddArg2(x, y)
16666 b.resetWithControl(BlockARMEQ, v0)
16667 return true
16668 }
16669
16670
16671
16672 for b.Controls[0].Op == OpARMCMPconst {
16673 v_0 := b.Controls[0]
16674 if auxIntToInt32(v_0.AuxInt) != 0 {
16675 break
16676 }
16677 l := v_0.Args[0]
16678 if l.Op != OpARMADDshiftRA {
16679 break
16680 }
16681 c := auxIntToInt32(l.AuxInt)
16682 y := l.Args[1]
16683 x := l.Args[0]
16684 if !(l.Uses == 1) {
16685 break
16686 }
16687 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags)
16688 v0.AuxInt = int32ToAuxInt(c)
16689 v0.AddArg2(x, y)
16690 b.resetWithControl(BlockARMEQ, v0)
16691 return true
16692 }
16693
16694
16695
16696 for b.Controls[0].Op == OpARMCMPconst {
16697 v_0 := b.Controls[0]
16698 if auxIntToInt32(v_0.AuxInt) != 0 {
16699 break
16700 }
16701 l := v_0.Args[0]
16702 if l.Op != OpARMADDshiftLLreg {
16703 break
16704 }
16705 z := l.Args[2]
16706 x := l.Args[0]
16707 y := l.Args[1]
16708 if !(l.Uses == 1) {
16709 break
16710 }
16711 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags)
16712 v0.AddArg3(x, y, z)
16713 b.resetWithControl(BlockARMEQ, v0)
16714 return true
16715 }
16716
16717
16718
16719 for b.Controls[0].Op == OpARMCMPconst {
16720 v_0 := b.Controls[0]
16721 if auxIntToInt32(v_0.AuxInt) != 0 {
16722 break
16723 }
16724 l := v_0.Args[0]
16725 if l.Op != OpARMADDshiftRLreg {
16726 break
16727 }
16728 z := l.Args[2]
16729 x := l.Args[0]
16730 y := l.Args[1]
16731 if !(l.Uses == 1) {
16732 break
16733 }
16734 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags)
16735 v0.AddArg3(x, y, z)
16736 b.resetWithControl(BlockARMEQ, v0)
16737 return true
16738 }
16739
16740
16741
16742 for b.Controls[0].Op == OpARMCMPconst {
16743 v_0 := b.Controls[0]
16744 if auxIntToInt32(v_0.AuxInt) != 0 {
16745 break
16746 }
16747 l := v_0.Args[0]
16748 if l.Op != OpARMADDshiftRAreg {
16749 break
16750 }
16751 z := l.Args[2]
16752 x := l.Args[0]
16753 y := l.Args[1]
16754 if !(l.Uses == 1) {
16755 break
16756 }
16757 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags)
16758 v0.AddArg3(x, y, z)
16759 b.resetWithControl(BlockARMEQ, v0)
16760 return true
16761 }
16762
16763
16764
16765 for b.Controls[0].Op == OpARMCMPconst {
16766 v_0 := b.Controls[0]
16767 if auxIntToInt32(v_0.AuxInt) != 0 {
16768 break
16769 }
16770 l := v_0.Args[0]
16771 if l.Op != OpARMAND {
16772 break
16773 }
16774 _ = l.Args[1]
16775 l_0 := l.Args[0]
16776 l_1 := l.Args[1]
16777 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
16778 x := l_0
16779 y := l_1
16780 if !(l.Uses == 1) {
16781 continue
16782 }
16783 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags)
16784 v0.AddArg2(x, y)
16785 b.resetWithControl(BlockARMEQ, v0)
16786 return true
16787 }
16788 break
16789 }
16790
16791
16792
16793 for b.Controls[0].Op == OpARMCMPconst {
16794 v_0 := b.Controls[0]
16795 if auxIntToInt32(v_0.AuxInt) != 0 {
16796 break
16797 }
16798 l := v_0.Args[0]
16799 if l.Op != OpARMANDconst {
16800 break
16801 }
16802 c := auxIntToInt32(l.AuxInt)
16803 x := l.Args[0]
16804 if !(l.Uses == 1) {
16805 break
16806 }
16807 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags)
16808 v0.AuxInt = int32ToAuxInt(c)
16809 v0.AddArg(x)
16810 b.resetWithControl(BlockARMEQ, v0)
16811 return true
16812 }
16813
16814
16815
16816 for b.Controls[0].Op == OpARMCMPconst {
16817 v_0 := b.Controls[0]
16818 if auxIntToInt32(v_0.AuxInt) != 0 {
16819 break
16820 }
16821 l := v_0.Args[0]
16822 if l.Op != OpARMANDshiftLL {
16823 break
16824 }
16825 c := auxIntToInt32(l.AuxInt)
16826 y := l.Args[1]
16827 x := l.Args[0]
16828 if !(l.Uses == 1) {
16829 break
16830 }
16831 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags)
16832 v0.AuxInt = int32ToAuxInt(c)
16833 v0.AddArg2(x, y)
16834 b.resetWithControl(BlockARMEQ, v0)
16835 return true
16836 }
16837
16838
16839
16840 for b.Controls[0].Op == OpARMCMPconst {
16841 v_0 := b.Controls[0]
16842 if auxIntToInt32(v_0.AuxInt) != 0 {
16843 break
16844 }
16845 l := v_0.Args[0]
16846 if l.Op != OpARMANDshiftRL {
16847 break
16848 }
16849 c := auxIntToInt32(l.AuxInt)
16850 y := l.Args[1]
16851 x := l.Args[0]
16852 if !(l.Uses == 1) {
16853 break
16854 }
16855 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags)
16856 v0.AuxInt = int32ToAuxInt(c)
16857 v0.AddArg2(x, y)
16858 b.resetWithControl(BlockARMEQ, v0)
16859 return true
16860 }
16861
16862
16863
16864 for b.Controls[0].Op == OpARMCMPconst {
16865 v_0 := b.Controls[0]
16866 if auxIntToInt32(v_0.AuxInt) != 0 {
16867 break
16868 }
16869 l := v_0.Args[0]
16870 if l.Op != OpARMANDshiftRA {
16871 break
16872 }
16873 c := auxIntToInt32(l.AuxInt)
16874 y := l.Args[1]
16875 x := l.Args[0]
16876 if !(l.Uses == 1) {
16877 break
16878 }
16879 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags)
16880 v0.AuxInt = int32ToAuxInt(c)
16881 v0.AddArg2(x, y)
16882 b.resetWithControl(BlockARMEQ, v0)
16883 return true
16884 }
16885
16886
16887
16888 for b.Controls[0].Op == OpARMCMPconst {
16889 v_0 := b.Controls[0]
16890 if auxIntToInt32(v_0.AuxInt) != 0 {
16891 break
16892 }
16893 l := v_0.Args[0]
16894 if l.Op != OpARMANDshiftLLreg {
16895 break
16896 }
16897 z := l.Args[2]
16898 x := l.Args[0]
16899 y := l.Args[1]
16900 if !(l.Uses == 1) {
16901 break
16902 }
16903 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags)
16904 v0.AddArg3(x, y, z)
16905 b.resetWithControl(BlockARMEQ, v0)
16906 return true
16907 }
16908
16909
16910
16911 for b.Controls[0].Op == OpARMCMPconst {
16912 v_0 := b.Controls[0]
16913 if auxIntToInt32(v_0.AuxInt) != 0 {
16914 break
16915 }
16916 l := v_0.Args[0]
16917 if l.Op != OpARMANDshiftRLreg {
16918 break
16919 }
16920 z := l.Args[2]
16921 x := l.Args[0]
16922 y := l.Args[1]
16923 if !(l.Uses == 1) {
16924 break
16925 }
16926 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags)
16927 v0.AddArg3(x, y, z)
16928 b.resetWithControl(BlockARMEQ, v0)
16929 return true
16930 }
16931
16932
16933
16934 for b.Controls[0].Op == OpARMCMPconst {
16935 v_0 := b.Controls[0]
16936 if auxIntToInt32(v_0.AuxInt) != 0 {
16937 break
16938 }
16939 l := v_0.Args[0]
16940 if l.Op != OpARMANDshiftRAreg {
16941 break
16942 }
16943 z := l.Args[2]
16944 x := l.Args[0]
16945 y := l.Args[1]
16946 if !(l.Uses == 1) {
16947 break
16948 }
16949 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags)
16950 v0.AddArg3(x, y, z)
16951 b.resetWithControl(BlockARMEQ, v0)
16952 return true
16953 }
16954
16955
16956
16957 for b.Controls[0].Op == OpARMCMPconst {
16958 v_0 := b.Controls[0]
16959 if auxIntToInt32(v_0.AuxInt) != 0 {
16960 break
16961 }
16962 l := v_0.Args[0]
16963 if l.Op != OpARMXOR {
16964 break
16965 }
16966 _ = l.Args[1]
16967 l_0 := l.Args[0]
16968 l_1 := l.Args[1]
16969 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
16970 x := l_0
16971 y := l_1
16972 if !(l.Uses == 1) {
16973 continue
16974 }
16975 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags)
16976 v0.AddArg2(x, y)
16977 b.resetWithControl(BlockARMEQ, v0)
16978 return true
16979 }
16980 break
16981 }
16982
16983
16984
16985 for b.Controls[0].Op == OpARMCMPconst {
16986 v_0 := b.Controls[0]
16987 if auxIntToInt32(v_0.AuxInt) != 0 {
16988 break
16989 }
16990 l := v_0.Args[0]
16991 if l.Op != OpARMXORconst {
16992 break
16993 }
16994 c := auxIntToInt32(l.AuxInt)
16995 x := l.Args[0]
16996 if !(l.Uses == 1) {
16997 break
16998 }
16999 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags)
17000 v0.AuxInt = int32ToAuxInt(c)
17001 v0.AddArg(x)
17002 b.resetWithControl(BlockARMEQ, v0)
17003 return true
17004 }
17005
17006
17007
17008 for b.Controls[0].Op == OpARMCMPconst {
17009 v_0 := b.Controls[0]
17010 if auxIntToInt32(v_0.AuxInt) != 0 {
17011 break
17012 }
17013 l := v_0.Args[0]
17014 if l.Op != OpARMXORshiftLL {
17015 break
17016 }
17017 c := auxIntToInt32(l.AuxInt)
17018 y := l.Args[1]
17019 x := l.Args[0]
17020 if !(l.Uses == 1) {
17021 break
17022 }
17023 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags)
17024 v0.AuxInt = int32ToAuxInt(c)
17025 v0.AddArg2(x, y)
17026 b.resetWithControl(BlockARMEQ, v0)
17027 return true
17028 }
17029
17030
17031
17032 for b.Controls[0].Op == OpARMCMPconst {
17033 v_0 := b.Controls[0]
17034 if auxIntToInt32(v_0.AuxInt) != 0 {
17035 break
17036 }
17037 l := v_0.Args[0]
17038 if l.Op != OpARMXORshiftRL {
17039 break
17040 }
17041 c := auxIntToInt32(l.AuxInt)
17042 y := l.Args[1]
17043 x := l.Args[0]
17044 if !(l.Uses == 1) {
17045 break
17046 }
17047 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags)
17048 v0.AuxInt = int32ToAuxInt(c)
17049 v0.AddArg2(x, y)
17050 b.resetWithControl(BlockARMEQ, v0)
17051 return true
17052 }
17053
17054
17055
17056 for b.Controls[0].Op == OpARMCMPconst {
17057 v_0 := b.Controls[0]
17058 if auxIntToInt32(v_0.AuxInt) != 0 {
17059 break
17060 }
17061 l := v_0.Args[0]
17062 if l.Op != OpARMXORshiftRA {
17063 break
17064 }
17065 c := auxIntToInt32(l.AuxInt)
17066 y := l.Args[1]
17067 x := l.Args[0]
17068 if !(l.Uses == 1) {
17069 break
17070 }
17071 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags)
17072 v0.AuxInt = int32ToAuxInt(c)
17073 v0.AddArg2(x, y)
17074 b.resetWithControl(BlockARMEQ, v0)
17075 return true
17076 }
17077
17078
17079
17080 for b.Controls[0].Op == OpARMCMPconst {
17081 v_0 := b.Controls[0]
17082 if auxIntToInt32(v_0.AuxInt) != 0 {
17083 break
17084 }
17085 l := v_0.Args[0]
17086 if l.Op != OpARMXORshiftLLreg {
17087 break
17088 }
17089 z := l.Args[2]
17090 x := l.Args[0]
17091 y := l.Args[1]
17092 if !(l.Uses == 1) {
17093 break
17094 }
17095 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags)
17096 v0.AddArg3(x, y, z)
17097 b.resetWithControl(BlockARMEQ, v0)
17098 return true
17099 }
17100
17101
17102
17103 for b.Controls[0].Op == OpARMCMPconst {
17104 v_0 := b.Controls[0]
17105 if auxIntToInt32(v_0.AuxInt) != 0 {
17106 break
17107 }
17108 l := v_0.Args[0]
17109 if l.Op != OpARMXORshiftRLreg {
17110 break
17111 }
17112 z := l.Args[2]
17113 x := l.Args[0]
17114 y := l.Args[1]
17115 if !(l.Uses == 1) {
17116 break
17117 }
17118 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags)
17119 v0.AddArg3(x, y, z)
17120 b.resetWithControl(BlockARMEQ, v0)
17121 return true
17122 }
17123
17124
17125
17126 for b.Controls[0].Op == OpARMCMPconst {
17127 v_0 := b.Controls[0]
17128 if auxIntToInt32(v_0.AuxInt) != 0 {
17129 break
17130 }
17131 l := v_0.Args[0]
17132 if l.Op != OpARMXORshiftRAreg {
17133 break
17134 }
17135 z := l.Args[2]
17136 x := l.Args[0]
17137 y := l.Args[1]
17138 if !(l.Uses == 1) {
17139 break
17140 }
17141 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags)
17142 v0.AddArg3(x, y, z)
17143 b.resetWithControl(BlockARMEQ, v0)
17144 return true
17145 }
17146 case BlockARMGE:
17147
17148
17149
17150 for b.Controls[0].Op == OpARMFlagConstant {
17151 v_0 := b.Controls[0]
17152 fc := auxIntToFlagConstant(v_0.AuxInt)
17153 if !(fc.ge()) {
17154 break
17155 }
17156 b.Reset(BlockFirst)
17157 return true
17158 }
17159
17160
17161
17162 for b.Controls[0].Op == OpARMFlagConstant {
17163 v_0 := b.Controls[0]
17164 fc := auxIntToFlagConstant(v_0.AuxInt)
17165 if !(!fc.ge()) {
17166 break
17167 }
17168 b.Reset(BlockFirst)
17169 b.swapSuccessors()
17170 return true
17171 }
17172
17173
17174 for b.Controls[0].Op == OpARMInvertFlags {
17175 v_0 := b.Controls[0]
17176 cmp := v_0.Args[0]
17177 b.resetWithControl(BlockARMLE, cmp)
17178 return true
17179 }
17180
17181
17182
17183 for b.Controls[0].Op == OpARMCMPconst {
17184 v_0 := b.Controls[0]
17185 if auxIntToInt32(v_0.AuxInt) != 0 {
17186 break
17187 }
17188 l := v_0.Args[0]
17189 if l.Op != OpARMSUB {
17190 break
17191 }
17192 y := l.Args[1]
17193 x := l.Args[0]
17194 if !(l.Uses == 1) {
17195 break
17196 }
17197 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
17198 v0.AddArg2(x, y)
17199 b.resetWithControl(BlockARMGEnoov, v0)
17200 return true
17201 }
17202
17203
17204
17205 for b.Controls[0].Op == OpARMCMPconst {
17206 v_0 := b.Controls[0]
17207 if auxIntToInt32(v_0.AuxInt) != 0 {
17208 break
17209 }
17210 l := v_0.Args[0]
17211 if l.Op != OpARMMULS {
17212 break
17213 }
17214 a := l.Args[2]
17215 x := l.Args[0]
17216 y := l.Args[1]
17217 if !(l.Uses == 1) {
17218 break
17219 }
17220 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
17221 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
17222 v1.AddArg2(x, y)
17223 v0.AddArg2(a, v1)
17224 b.resetWithControl(BlockARMGEnoov, v0)
17225 return true
17226 }
17227
17228
17229
17230 for b.Controls[0].Op == OpARMCMPconst {
17231 v_0 := b.Controls[0]
17232 if auxIntToInt32(v_0.AuxInt) != 0 {
17233 break
17234 }
17235 l := v_0.Args[0]
17236 if l.Op != OpARMSUBconst {
17237 break
17238 }
17239 c := auxIntToInt32(l.AuxInt)
17240 x := l.Args[0]
17241 if !(l.Uses == 1) {
17242 break
17243 }
17244 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags)
17245 v0.AuxInt = int32ToAuxInt(c)
17246 v0.AddArg(x)
17247 b.resetWithControl(BlockARMGEnoov, v0)
17248 return true
17249 }
17250
17251
17252
17253 for b.Controls[0].Op == OpARMCMPconst {
17254 v_0 := b.Controls[0]
17255 if auxIntToInt32(v_0.AuxInt) != 0 {
17256 break
17257 }
17258 l := v_0.Args[0]
17259 if l.Op != OpARMSUBshiftLL {
17260 break
17261 }
17262 c := auxIntToInt32(l.AuxInt)
17263 y := l.Args[1]
17264 x := l.Args[0]
17265 if !(l.Uses == 1) {
17266 break
17267 }
17268 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags)
17269 v0.AuxInt = int32ToAuxInt(c)
17270 v0.AddArg2(x, y)
17271 b.resetWithControl(BlockARMGEnoov, v0)
17272 return true
17273 }
17274
17275
17276
17277 for b.Controls[0].Op == OpARMCMPconst {
17278 v_0 := b.Controls[0]
17279 if auxIntToInt32(v_0.AuxInt) != 0 {
17280 break
17281 }
17282 l := v_0.Args[0]
17283 if l.Op != OpARMSUBshiftRL {
17284 break
17285 }
17286 c := auxIntToInt32(l.AuxInt)
17287 y := l.Args[1]
17288 x := l.Args[0]
17289 if !(l.Uses == 1) {
17290 break
17291 }
17292 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags)
17293 v0.AuxInt = int32ToAuxInt(c)
17294 v0.AddArg2(x, y)
17295 b.resetWithControl(BlockARMGEnoov, v0)
17296 return true
17297 }
17298
17299
17300
17301 for b.Controls[0].Op == OpARMCMPconst {
17302 v_0 := b.Controls[0]
17303 if auxIntToInt32(v_0.AuxInt) != 0 {
17304 break
17305 }
17306 l := v_0.Args[0]
17307 if l.Op != OpARMSUBshiftRA {
17308 break
17309 }
17310 c := auxIntToInt32(l.AuxInt)
17311 y := l.Args[1]
17312 x := l.Args[0]
17313 if !(l.Uses == 1) {
17314 break
17315 }
17316 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags)
17317 v0.AuxInt = int32ToAuxInt(c)
17318 v0.AddArg2(x, y)
17319 b.resetWithControl(BlockARMGEnoov, v0)
17320 return true
17321 }
17322
17323
17324
17325 for b.Controls[0].Op == OpARMCMPconst {
17326 v_0 := b.Controls[0]
17327 if auxIntToInt32(v_0.AuxInt) != 0 {
17328 break
17329 }
17330 l := v_0.Args[0]
17331 if l.Op != OpARMSUBshiftLLreg {
17332 break
17333 }
17334 z := l.Args[2]
17335 x := l.Args[0]
17336 y := l.Args[1]
17337 if !(l.Uses == 1) {
17338 break
17339 }
17340 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
17341 v0.AddArg3(x, y, z)
17342 b.resetWithControl(BlockARMGEnoov, v0)
17343 return true
17344 }
17345
17346
17347
17348 for b.Controls[0].Op == OpARMCMPconst {
17349 v_0 := b.Controls[0]
17350 if auxIntToInt32(v_0.AuxInt) != 0 {
17351 break
17352 }
17353 l := v_0.Args[0]
17354 if l.Op != OpARMSUBshiftRLreg {
17355 break
17356 }
17357 z := l.Args[2]
17358 x := l.Args[0]
17359 y := l.Args[1]
17360 if !(l.Uses == 1) {
17361 break
17362 }
17363 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
17364 v0.AddArg3(x, y, z)
17365 b.resetWithControl(BlockARMGEnoov, v0)
17366 return true
17367 }
17368
17369
17370
17371 for b.Controls[0].Op == OpARMCMPconst {
17372 v_0 := b.Controls[0]
17373 if auxIntToInt32(v_0.AuxInt) != 0 {
17374 break
17375 }
17376 l := v_0.Args[0]
17377 if l.Op != OpARMSUBshiftRAreg {
17378 break
17379 }
17380 z := l.Args[2]
17381 x := l.Args[0]
17382 y := l.Args[1]
17383 if !(l.Uses == 1) {
17384 break
17385 }
17386 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
17387 v0.AddArg3(x, y, z)
17388 b.resetWithControl(BlockARMGEnoov, v0)
17389 return true
17390 }
17391
17392
17393
17394 for b.Controls[0].Op == OpARMCMPconst {
17395 v_0 := b.Controls[0]
17396 if auxIntToInt32(v_0.AuxInt) != 0 {
17397 break
17398 }
17399 l := v_0.Args[0]
17400 if l.Op != OpARMADD {
17401 break
17402 }
17403 _ = l.Args[1]
17404 l_0 := l.Args[0]
17405 l_1 := l.Args[1]
17406 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
17407 x := l_0
17408 y := l_1
17409 if !(l.Uses == 1) {
17410 continue
17411 }
17412 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
17413 v0.AddArg2(x, y)
17414 b.resetWithControl(BlockARMGEnoov, v0)
17415 return true
17416 }
17417 break
17418 }
17419
17420
17421
17422 for b.Controls[0].Op == OpARMCMPconst {
17423 v_0 := b.Controls[0]
17424 if auxIntToInt32(v_0.AuxInt) != 0 {
17425 break
17426 }
17427 l := v_0.Args[0]
17428 if l.Op != OpARMMULA {
17429 break
17430 }
17431 a := l.Args[2]
17432 x := l.Args[0]
17433 y := l.Args[1]
17434 if !(l.Uses == 1) {
17435 break
17436 }
17437 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
17438 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
17439 v1.AddArg2(x, y)
17440 v0.AddArg2(a, v1)
17441 b.resetWithControl(BlockARMGEnoov, v0)
17442 return true
17443 }
17444
17445
17446
17447 for b.Controls[0].Op == OpARMCMPconst {
17448 v_0 := b.Controls[0]
17449 if auxIntToInt32(v_0.AuxInt) != 0 {
17450 break
17451 }
17452 l := v_0.Args[0]
17453 if l.Op != OpARMADDconst {
17454 break
17455 }
17456 c := auxIntToInt32(l.AuxInt)
17457 x := l.Args[0]
17458 if !(l.Uses == 1) {
17459 break
17460 }
17461 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags)
17462 v0.AuxInt = int32ToAuxInt(c)
17463 v0.AddArg(x)
17464 b.resetWithControl(BlockARMGEnoov, v0)
17465 return true
17466 }
17467
17468
17469
17470 for b.Controls[0].Op == OpARMCMPconst {
17471 v_0 := b.Controls[0]
17472 if auxIntToInt32(v_0.AuxInt) != 0 {
17473 break
17474 }
17475 l := v_0.Args[0]
17476 if l.Op != OpARMADDshiftLL {
17477 break
17478 }
17479 c := auxIntToInt32(l.AuxInt)
17480 y := l.Args[1]
17481 x := l.Args[0]
17482 if !(l.Uses == 1) {
17483 break
17484 }
17485 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags)
17486 v0.AuxInt = int32ToAuxInt(c)
17487 v0.AddArg2(x, y)
17488 b.resetWithControl(BlockARMGEnoov, v0)
17489 return true
17490 }
17491
17492
17493
17494 for b.Controls[0].Op == OpARMCMPconst {
17495 v_0 := b.Controls[0]
17496 if auxIntToInt32(v_0.AuxInt) != 0 {
17497 break
17498 }
17499 l := v_0.Args[0]
17500 if l.Op != OpARMADDshiftRL {
17501 break
17502 }
17503 c := auxIntToInt32(l.AuxInt)
17504 y := l.Args[1]
17505 x := l.Args[0]
17506 if !(l.Uses == 1) {
17507 break
17508 }
17509 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags)
17510 v0.AuxInt = int32ToAuxInt(c)
17511 v0.AddArg2(x, y)
17512 b.resetWithControl(BlockARMGEnoov, v0)
17513 return true
17514 }
17515
17516
17517
17518 for b.Controls[0].Op == OpARMCMPconst {
17519 v_0 := b.Controls[0]
17520 if auxIntToInt32(v_0.AuxInt) != 0 {
17521 break
17522 }
17523 l := v_0.Args[0]
17524 if l.Op != OpARMADDshiftRA {
17525 break
17526 }
17527 c := auxIntToInt32(l.AuxInt)
17528 y := l.Args[1]
17529 x := l.Args[0]
17530 if !(l.Uses == 1) {
17531 break
17532 }
17533 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags)
17534 v0.AuxInt = int32ToAuxInt(c)
17535 v0.AddArg2(x, y)
17536 b.resetWithControl(BlockARMGEnoov, v0)
17537 return true
17538 }
17539
17540
17541
17542 for b.Controls[0].Op == OpARMCMPconst {
17543 v_0 := b.Controls[0]
17544 if auxIntToInt32(v_0.AuxInt) != 0 {
17545 break
17546 }
17547 l := v_0.Args[0]
17548 if l.Op != OpARMADDshiftLLreg {
17549 break
17550 }
17551 z := l.Args[2]
17552 x := l.Args[0]
17553 y := l.Args[1]
17554 if !(l.Uses == 1) {
17555 break
17556 }
17557 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags)
17558 v0.AddArg3(x, y, z)
17559 b.resetWithControl(BlockARMGEnoov, v0)
17560 return true
17561 }
17562
17563
17564
17565 for b.Controls[0].Op == OpARMCMPconst {
17566 v_0 := b.Controls[0]
17567 if auxIntToInt32(v_0.AuxInt) != 0 {
17568 break
17569 }
17570 l := v_0.Args[0]
17571 if l.Op != OpARMADDshiftRLreg {
17572 break
17573 }
17574 z := l.Args[2]
17575 x := l.Args[0]
17576 y := l.Args[1]
17577 if !(l.Uses == 1) {
17578 break
17579 }
17580 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags)
17581 v0.AddArg3(x, y, z)
17582 b.resetWithControl(BlockARMGEnoov, v0)
17583 return true
17584 }
17585
17586
17587
17588 for b.Controls[0].Op == OpARMCMPconst {
17589 v_0 := b.Controls[0]
17590 if auxIntToInt32(v_0.AuxInt) != 0 {
17591 break
17592 }
17593 l := v_0.Args[0]
17594 if l.Op != OpARMADDshiftRAreg {
17595 break
17596 }
17597 z := l.Args[2]
17598 x := l.Args[0]
17599 y := l.Args[1]
17600 if !(l.Uses == 1) {
17601 break
17602 }
17603 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags)
17604 v0.AddArg3(x, y, z)
17605 b.resetWithControl(BlockARMGEnoov, v0)
17606 return true
17607 }
17608
17609
17610
17611 for b.Controls[0].Op == OpARMCMPconst {
17612 v_0 := b.Controls[0]
17613 if auxIntToInt32(v_0.AuxInt) != 0 {
17614 break
17615 }
17616 l := v_0.Args[0]
17617 if l.Op != OpARMAND {
17618 break
17619 }
17620 _ = l.Args[1]
17621 l_0 := l.Args[0]
17622 l_1 := l.Args[1]
17623 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
17624 x := l_0
17625 y := l_1
17626 if !(l.Uses == 1) {
17627 continue
17628 }
17629 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags)
17630 v0.AddArg2(x, y)
17631 b.resetWithControl(BlockARMGEnoov, v0)
17632 return true
17633 }
17634 break
17635 }
17636
17637
17638
17639 for b.Controls[0].Op == OpARMCMPconst {
17640 v_0 := b.Controls[0]
17641 if auxIntToInt32(v_0.AuxInt) != 0 {
17642 break
17643 }
17644 l := v_0.Args[0]
17645 if l.Op != OpARMANDconst {
17646 break
17647 }
17648 c := auxIntToInt32(l.AuxInt)
17649 x := l.Args[0]
17650 if !(l.Uses == 1) {
17651 break
17652 }
17653 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags)
17654 v0.AuxInt = int32ToAuxInt(c)
17655 v0.AddArg(x)
17656 b.resetWithControl(BlockARMGEnoov, v0)
17657 return true
17658 }
17659
17660
17661
17662 for b.Controls[0].Op == OpARMCMPconst {
17663 v_0 := b.Controls[0]
17664 if auxIntToInt32(v_0.AuxInt) != 0 {
17665 break
17666 }
17667 l := v_0.Args[0]
17668 if l.Op != OpARMANDshiftLL {
17669 break
17670 }
17671 c := auxIntToInt32(l.AuxInt)
17672 y := l.Args[1]
17673 x := l.Args[0]
17674 if !(l.Uses == 1) {
17675 break
17676 }
17677 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags)
17678 v0.AuxInt = int32ToAuxInt(c)
17679 v0.AddArg2(x, y)
17680 b.resetWithControl(BlockARMGEnoov, v0)
17681 return true
17682 }
17683
17684
17685
17686 for b.Controls[0].Op == OpARMCMPconst {
17687 v_0 := b.Controls[0]
17688 if auxIntToInt32(v_0.AuxInt) != 0 {
17689 break
17690 }
17691 l := v_0.Args[0]
17692 if l.Op != OpARMANDshiftRL {
17693 break
17694 }
17695 c := auxIntToInt32(l.AuxInt)
17696 y := l.Args[1]
17697 x := l.Args[0]
17698 if !(l.Uses == 1) {
17699 break
17700 }
17701 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags)
17702 v0.AuxInt = int32ToAuxInt(c)
17703 v0.AddArg2(x, y)
17704 b.resetWithControl(BlockARMGEnoov, v0)
17705 return true
17706 }
17707
17708
17709
17710 for b.Controls[0].Op == OpARMCMPconst {
17711 v_0 := b.Controls[0]
17712 if auxIntToInt32(v_0.AuxInt) != 0 {
17713 break
17714 }
17715 l := v_0.Args[0]
17716 if l.Op != OpARMANDshiftRA {
17717 break
17718 }
17719 c := auxIntToInt32(l.AuxInt)
17720 y := l.Args[1]
17721 x := l.Args[0]
17722 if !(l.Uses == 1) {
17723 break
17724 }
17725 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags)
17726 v0.AuxInt = int32ToAuxInt(c)
17727 v0.AddArg2(x, y)
17728 b.resetWithControl(BlockARMGEnoov, v0)
17729 return true
17730 }
17731
17732
17733
17734 for b.Controls[0].Op == OpARMCMPconst {
17735 v_0 := b.Controls[0]
17736 if auxIntToInt32(v_0.AuxInt) != 0 {
17737 break
17738 }
17739 l := v_0.Args[0]
17740 if l.Op != OpARMANDshiftLLreg {
17741 break
17742 }
17743 z := l.Args[2]
17744 x := l.Args[0]
17745 y := l.Args[1]
17746 if !(l.Uses == 1) {
17747 break
17748 }
17749 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags)
17750 v0.AddArg3(x, y, z)
17751 b.resetWithControl(BlockARMGEnoov, v0)
17752 return true
17753 }
17754
17755
17756
17757 for b.Controls[0].Op == OpARMCMPconst {
17758 v_0 := b.Controls[0]
17759 if auxIntToInt32(v_0.AuxInt) != 0 {
17760 break
17761 }
17762 l := v_0.Args[0]
17763 if l.Op != OpARMANDshiftRLreg {
17764 break
17765 }
17766 z := l.Args[2]
17767 x := l.Args[0]
17768 y := l.Args[1]
17769 if !(l.Uses == 1) {
17770 break
17771 }
17772 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags)
17773 v0.AddArg3(x, y, z)
17774 b.resetWithControl(BlockARMGEnoov, v0)
17775 return true
17776 }
17777
17778
17779
17780 for b.Controls[0].Op == OpARMCMPconst {
17781 v_0 := b.Controls[0]
17782 if auxIntToInt32(v_0.AuxInt) != 0 {
17783 break
17784 }
17785 l := v_0.Args[0]
17786 if l.Op != OpARMANDshiftRAreg {
17787 break
17788 }
17789 z := l.Args[2]
17790 x := l.Args[0]
17791 y := l.Args[1]
17792 if !(l.Uses == 1) {
17793 break
17794 }
17795 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags)
17796 v0.AddArg3(x, y, z)
17797 b.resetWithControl(BlockARMGEnoov, v0)
17798 return true
17799 }
17800
17801
17802
17803 for b.Controls[0].Op == OpARMCMPconst {
17804 v_0 := b.Controls[0]
17805 if auxIntToInt32(v_0.AuxInt) != 0 {
17806 break
17807 }
17808 l := v_0.Args[0]
17809 if l.Op != OpARMXOR {
17810 break
17811 }
17812 _ = l.Args[1]
17813 l_0 := l.Args[0]
17814 l_1 := l.Args[1]
17815 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
17816 x := l_0
17817 y := l_1
17818 if !(l.Uses == 1) {
17819 continue
17820 }
17821 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags)
17822 v0.AddArg2(x, y)
17823 b.resetWithControl(BlockARMGEnoov, v0)
17824 return true
17825 }
17826 break
17827 }
17828
17829
17830
17831 for b.Controls[0].Op == OpARMCMPconst {
17832 v_0 := b.Controls[0]
17833 if auxIntToInt32(v_0.AuxInt) != 0 {
17834 break
17835 }
17836 l := v_0.Args[0]
17837 if l.Op != OpARMXORconst {
17838 break
17839 }
17840 c := auxIntToInt32(l.AuxInt)
17841 x := l.Args[0]
17842 if !(l.Uses == 1) {
17843 break
17844 }
17845 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags)
17846 v0.AuxInt = int32ToAuxInt(c)
17847 v0.AddArg(x)
17848 b.resetWithControl(BlockARMGEnoov, v0)
17849 return true
17850 }
17851
17852
17853
17854 for b.Controls[0].Op == OpARMCMPconst {
17855 v_0 := b.Controls[0]
17856 if auxIntToInt32(v_0.AuxInt) != 0 {
17857 break
17858 }
17859 l := v_0.Args[0]
17860 if l.Op != OpARMXORshiftLL {
17861 break
17862 }
17863 c := auxIntToInt32(l.AuxInt)
17864 y := l.Args[1]
17865 x := l.Args[0]
17866 if !(l.Uses == 1) {
17867 break
17868 }
17869 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags)
17870 v0.AuxInt = int32ToAuxInt(c)
17871 v0.AddArg2(x, y)
17872 b.resetWithControl(BlockARMGEnoov, v0)
17873 return true
17874 }
17875
17876
17877
17878 for b.Controls[0].Op == OpARMCMPconst {
17879 v_0 := b.Controls[0]
17880 if auxIntToInt32(v_0.AuxInt) != 0 {
17881 break
17882 }
17883 l := v_0.Args[0]
17884 if l.Op != OpARMXORshiftRL {
17885 break
17886 }
17887 c := auxIntToInt32(l.AuxInt)
17888 y := l.Args[1]
17889 x := l.Args[0]
17890 if !(l.Uses == 1) {
17891 break
17892 }
17893 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags)
17894 v0.AuxInt = int32ToAuxInt(c)
17895 v0.AddArg2(x, y)
17896 b.resetWithControl(BlockARMGEnoov, v0)
17897 return true
17898 }
17899
17900
17901
17902 for b.Controls[0].Op == OpARMCMPconst {
17903 v_0 := b.Controls[0]
17904 if auxIntToInt32(v_0.AuxInt) != 0 {
17905 break
17906 }
17907 l := v_0.Args[0]
17908 if l.Op != OpARMXORshiftRA {
17909 break
17910 }
17911 c := auxIntToInt32(l.AuxInt)
17912 y := l.Args[1]
17913 x := l.Args[0]
17914 if !(l.Uses == 1) {
17915 break
17916 }
17917 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags)
17918 v0.AuxInt = int32ToAuxInt(c)
17919 v0.AddArg2(x, y)
17920 b.resetWithControl(BlockARMGEnoov, v0)
17921 return true
17922 }
17923
17924
17925
17926 for b.Controls[0].Op == OpARMCMPconst {
17927 v_0 := b.Controls[0]
17928 if auxIntToInt32(v_0.AuxInt) != 0 {
17929 break
17930 }
17931 l := v_0.Args[0]
17932 if l.Op != OpARMXORshiftLLreg {
17933 break
17934 }
17935 z := l.Args[2]
17936 x := l.Args[0]
17937 y := l.Args[1]
17938 if !(l.Uses == 1) {
17939 break
17940 }
17941 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags)
17942 v0.AddArg3(x, y, z)
17943 b.resetWithControl(BlockARMGEnoov, v0)
17944 return true
17945 }
17946
17947
17948
17949 for b.Controls[0].Op == OpARMCMPconst {
17950 v_0 := b.Controls[0]
17951 if auxIntToInt32(v_0.AuxInt) != 0 {
17952 break
17953 }
17954 l := v_0.Args[0]
17955 if l.Op != OpARMXORshiftRLreg {
17956 break
17957 }
17958 z := l.Args[2]
17959 x := l.Args[0]
17960 y := l.Args[1]
17961 if !(l.Uses == 1) {
17962 break
17963 }
17964 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags)
17965 v0.AddArg3(x, y, z)
17966 b.resetWithControl(BlockARMGEnoov, v0)
17967 return true
17968 }
17969
17970
17971
17972 for b.Controls[0].Op == OpARMCMPconst {
17973 v_0 := b.Controls[0]
17974 if auxIntToInt32(v_0.AuxInt) != 0 {
17975 break
17976 }
17977 l := v_0.Args[0]
17978 if l.Op != OpARMXORshiftRAreg {
17979 break
17980 }
17981 z := l.Args[2]
17982 x := l.Args[0]
17983 y := l.Args[1]
17984 if !(l.Uses == 1) {
17985 break
17986 }
17987 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags)
17988 v0.AddArg3(x, y, z)
17989 b.resetWithControl(BlockARMGEnoov, v0)
17990 return true
17991 }
17992 case BlockARMGEnoov:
17993
17994
17995
17996 for b.Controls[0].Op == OpARMFlagConstant {
17997 v_0 := b.Controls[0]
17998 fc := auxIntToFlagConstant(v_0.AuxInt)
17999 if !(fc.geNoov()) {
18000 break
18001 }
18002 b.Reset(BlockFirst)
18003 return true
18004 }
18005
18006
18007
18008 for b.Controls[0].Op == OpARMFlagConstant {
18009 v_0 := b.Controls[0]
18010 fc := auxIntToFlagConstant(v_0.AuxInt)
18011 if !(!fc.geNoov()) {
18012 break
18013 }
18014 b.Reset(BlockFirst)
18015 b.swapSuccessors()
18016 return true
18017 }
18018
18019
18020 for b.Controls[0].Op == OpARMInvertFlags {
18021 v_0 := b.Controls[0]
18022 cmp := v_0.Args[0]
18023 b.resetWithControl(BlockARMLEnoov, cmp)
18024 return true
18025 }
18026 case BlockARMGT:
18027
18028
18029
18030 for b.Controls[0].Op == OpARMFlagConstant {
18031 v_0 := b.Controls[0]
18032 fc := auxIntToFlagConstant(v_0.AuxInt)
18033 if !(fc.gt()) {
18034 break
18035 }
18036 b.Reset(BlockFirst)
18037 return true
18038 }
18039
18040
18041
18042 for b.Controls[0].Op == OpARMFlagConstant {
18043 v_0 := b.Controls[0]
18044 fc := auxIntToFlagConstant(v_0.AuxInt)
18045 if !(!fc.gt()) {
18046 break
18047 }
18048 b.Reset(BlockFirst)
18049 b.swapSuccessors()
18050 return true
18051 }
18052
18053
18054 for b.Controls[0].Op == OpARMInvertFlags {
18055 v_0 := b.Controls[0]
18056 cmp := v_0.Args[0]
18057 b.resetWithControl(BlockARMLT, cmp)
18058 return true
18059 }
18060
18061
18062
18063 for b.Controls[0].Op == OpARMCMPconst {
18064 v_0 := b.Controls[0]
18065 if auxIntToInt32(v_0.AuxInt) != 0 {
18066 break
18067 }
18068 l := v_0.Args[0]
18069 if l.Op != OpARMSUB {
18070 break
18071 }
18072 y := l.Args[1]
18073 x := l.Args[0]
18074 if !(l.Uses == 1) {
18075 break
18076 }
18077 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
18078 v0.AddArg2(x, y)
18079 b.resetWithControl(BlockARMGTnoov, v0)
18080 return true
18081 }
18082
18083
18084
18085 for b.Controls[0].Op == OpARMCMPconst {
18086 v_0 := b.Controls[0]
18087 if auxIntToInt32(v_0.AuxInt) != 0 {
18088 break
18089 }
18090 l := v_0.Args[0]
18091 if l.Op != OpARMMULS {
18092 break
18093 }
18094 a := l.Args[2]
18095 x := l.Args[0]
18096 y := l.Args[1]
18097 if !(l.Uses == 1) {
18098 break
18099 }
18100 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
18101 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
18102 v1.AddArg2(x, y)
18103 v0.AddArg2(a, v1)
18104 b.resetWithControl(BlockARMGTnoov, v0)
18105 return true
18106 }
18107
18108
18109
18110 for b.Controls[0].Op == OpARMCMPconst {
18111 v_0 := b.Controls[0]
18112 if auxIntToInt32(v_0.AuxInt) != 0 {
18113 break
18114 }
18115 l := v_0.Args[0]
18116 if l.Op != OpARMSUBconst {
18117 break
18118 }
18119 c := auxIntToInt32(l.AuxInt)
18120 x := l.Args[0]
18121 if !(l.Uses == 1) {
18122 break
18123 }
18124 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags)
18125 v0.AuxInt = int32ToAuxInt(c)
18126 v0.AddArg(x)
18127 b.resetWithControl(BlockARMGTnoov, v0)
18128 return true
18129 }
18130
18131
18132
18133 for b.Controls[0].Op == OpARMCMPconst {
18134 v_0 := b.Controls[0]
18135 if auxIntToInt32(v_0.AuxInt) != 0 {
18136 break
18137 }
18138 l := v_0.Args[0]
18139 if l.Op != OpARMSUBshiftLL {
18140 break
18141 }
18142 c := auxIntToInt32(l.AuxInt)
18143 y := l.Args[1]
18144 x := l.Args[0]
18145 if !(l.Uses == 1) {
18146 break
18147 }
18148 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags)
18149 v0.AuxInt = int32ToAuxInt(c)
18150 v0.AddArg2(x, y)
18151 b.resetWithControl(BlockARMGTnoov, v0)
18152 return true
18153 }
18154
18155
18156
18157 for b.Controls[0].Op == OpARMCMPconst {
18158 v_0 := b.Controls[0]
18159 if auxIntToInt32(v_0.AuxInt) != 0 {
18160 break
18161 }
18162 l := v_0.Args[0]
18163 if l.Op != OpARMSUBshiftRL {
18164 break
18165 }
18166 c := auxIntToInt32(l.AuxInt)
18167 y := l.Args[1]
18168 x := l.Args[0]
18169 if !(l.Uses == 1) {
18170 break
18171 }
18172 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags)
18173 v0.AuxInt = int32ToAuxInt(c)
18174 v0.AddArg2(x, y)
18175 b.resetWithControl(BlockARMGTnoov, v0)
18176 return true
18177 }
18178
18179
18180
18181 for b.Controls[0].Op == OpARMCMPconst {
18182 v_0 := b.Controls[0]
18183 if auxIntToInt32(v_0.AuxInt) != 0 {
18184 break
18185 }
18186 l := v_0.Args[0]
18187 if l.Op != OpARMSUBshiftRA {
18188 break
18189 }
18190 c := auxIntToInt32(l.AuxInt)
18191 y := l.Args[1]
18192 x := l.Args[0]
18193 if !(l.Uses == 1) {
18194 break
18195 }
18196 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags)
18197 v0.AuxInt = int32ToAuxInt(c)
18198 v0.AddArg2(x, y)
18199 b.resetWithControl(BlockARMGTnoov, v0)
18200 return true
18201 }
18202
18203
18204
18205 for b.Controls[0].Op == OpARMCMPconst {
18206 v_0 := b.Controls[0]
18207 if auxIntToInt32(v_0.AuxInt) != 0 {
18208 break
18209 }
18210 l := v_0.Args[0]
18211 if l.Op != OpARMSUBshiftLLreg {
18212 break
18213 }
18214 z := l.Args[2]
18215 x := l.Args[0]
18216 y := l.Args[1]
18217 if !(l.Uses == 1) {
18218 break
18219 }
18220 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
18221 v0.AddArg3(x, y, z)
18222 b.resetWithControl(BlockARMGTnoov, v0)
18223 return true
18224 }
18225
18226
18227
18228 for b.Controls[0].Op == OpARMCMPconst {
18229 v_0 := b.Controls[0]
18230 if auxIntToInt32(v_0.AuxInt) != 0 {
18231 break
18232 }
18233 l := v_0.Args[0]
18234 if l.Op != OpARMSUBshiftRLreg {
18235 break
18236 }
18237 z := l.Args[2]
18238 x := l.Args[0]
18239 y := l.Args[1]
18240 if !(l.Uses == 1) {
18241 break
18242 }
18243 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
18244 v0.AddArg3(x, y, z)
18245 b.resetWithControl(BlockARMGTnoov, v0)
18246 return true
18247 }
18248
18249
18250
18251 for b.Controls[0].Op == OpARMCMPconst {
18252 v_0 := b.Controls[0]
18253 if auxIntToInt32(v_0.AuxInt) != 0 {
18254 break
18255 }
18256 l := v_0.Args[0]
18257 if l.Op != OpARMSUBshiftRAreg {
18258 break
18259 }
18260 z := l.Args[2]
18261 x := l.Args[0]
18262 y := l.Args[1]
18263 if !(l.Uses == 1) {
18264 break
18265 }
18266 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
18267 v0.AddArg3(x, y, z)
18268 b.resetWithControl(BlockARMGTnoov, v0)
18269 return true
18270 }
18271
18272
18273
18274 for b.Controls[0].Op == OpARMCMPconst {
18275 v_0 := b.Controls[0]
18276 if auxIntToInt32(v_0.AuxInt) != 0 {
18277 break
18278 }
18279 l := v_0.Args[0]
18280 if l.Op != OpARMADD {
18281 break
18282 }
18283 _ = l.Args[1]
18284 l_0 := l.Args[0]
18285 l_1 := l.Args[1]
18286 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
18287 x := l_0
18288 y := l_1
18289 if !(l.Uses == 1) {
18290 continue
18291 }
18292 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
18293 v0.AddArg2(x, y)
18294 b.resetWithControl(BlockARMGTnoov, v0)
18295 return true
18296 }
18297 break
18298 }
18299
18300
18301
18302 for b.Controls[0].Op == OpARMCMPconst {
18303 v_0 := b.Controls[0]
18304 if auxIntToInt32(v_0.AuxInt) != 0 {
18305 break
18306 }
18307 l := v_0.Args[0]
18308 if l.Op != OpARMADDconst {
18309 break
18310 }
18311 c := auxIntToInt32(l.AuxInt)
18312 x := l.Args[0]
18313 if !(l.Uses == 1) {
18314 break
18315 }
18316 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags)
18317 v0.AuxInt = int32ToAuxInt(c)
18318 v0.AddArg(x)
18319 b.resetWithControl(BlockARMGTnoov, v0)
18320 return true
18321 }
18322
18323
18324
18325 for b.Controls[0].Op == OpARMCMPconst {
18326 v_0 := b.Controls[0]
18327 if auxIntToInt32(v_0.AuxInt) != 0 {
18328 break
18329 }
18330 l := v_0.Args[0]
18331 if l.Op != OpARMADDshiftLL {
18332 break
18333 }
18334 c := auxIntToInt32(l.AuxInt)
18335 y := l.Args[1]
18336 x := l.Args[0]
18337 if !(l.Uses == 1) {
18338 break
18339 }
18340 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags)
18341 v0.AuxInt = int32ToAuxInt(c)
18342 v0.AddArg2(x, y)
18343 b.resetWithControl(BlockARMGTnoov, v0)
18344 return true
18345 }
18346
18347
18348
18349 for b.Controls[0].Op == OpARMCMPconst {
18350 v_0 := b.Controls[0]
18351 if auxIntToInt32(v_0.AuxInt) != 0 {
18352 break
18353 }
18354 l := v_0.Args[0]
18355 if l.Op != OpARMADDshiftRL {
18356 break
18357 }
18358 c := auxIntToInt32(l.AuxInt)
18359 y := l.Args[1]
18360 x := l.Args[0]
18361 if !(l.Uses == 1) {
18362 break
18363 }
18364 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags)
18365 v0.AuxInt = int32ToAuxInt(c)
18366 v0.AddArg2(x, y)
18367 b.resetWithControl(BlockARMGTnoov, v0)
18368 return true
18369 }
18370
18371
18372
18373 for b.Controls[0].Op == OpARMCMPconst {
18374 v_0 := b.Controls[0]
18375 if auxIntToInt32(v_0.AuxInt) != 0 {
18376 break
18377 }
18378 l := v_0.Args[0]
18379 if l.Op != OpARMADDshiftRA {
18380 break
18381 }
18382 c := auxIntToInt32(l.AuxInt)
18383 y := l.Args[1]
18384 x := l.Args[0]
18385 if !(l.Uses == 1) {
18386 break
18387 }
18388 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags)
18389 v0.AuxInt = int32ToAuxInt(c)
18390 v0.AddArg2(x, y)
18391 b.resetWithControl(BlockARMGTnoov, v0)
18392 return true
18393 }
18394
18395
18396
18397 for b.Controls[0].Op == OpARMCMPconst {
18398 v_0 := b.Controls[0]
18399 if auxIntToInt32(v_0.AuxInt) != 0 {
18400 break
18401 }
18402 l := v_0.Args[0]
18403 if l.Op != OpARMADDshiftLLreg {
18404 break
18405 }
18406 z := l.Args[2]
18407 x := l.Args[0]
18408 y := l.Args[1]
18409 if !(l.Uses == 1) {
18410 break
18411 }
18412 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags)
18413 v0.AddArg3(x, y, z)
18414 b.resetWithControl(BlockARMGTnoov, v0)
18415 return true
18416 }
18417
18418
18419
18420 for b.Controls[0].Op == OpARMCMPconst {
18421 v_0 := b.Controls[0]
18422 if auxIntToInt32(v_0.AuxInt) != 0 {
18423 break
18424 }
18425 l := v_0.Args[0]
18426 if l.Op != OpARMADDshiftRLreg {
18427 break
18428 }
18429 z := l.Args[2]
18430 x := l.Args[0]
18431 y := l.Args[1]
18432 if !(l.Uses == 1) {
18433 break
18434 }
18435 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags)
18436 v0.AddArg3(x, y, z)
18437 b.resetWithControl(BlockARMGTnoov, v0)
18438 return true
18439 }
18440
18441
18442
18443 for b.Controls[0].Op == OpARMCMPconst {
18444 v_0 := b.Controls[0]
18445 if auxIntToInt32(v_0.AuxInt) != 0 {
18446 break
18447 }
18448 l := v_0.Args[0]
18449 if l.Op != OpARMADDshiftRAreg {
18450 break
18451 }
18452 z := l.Args[2]
18453 x := l.Args[0]
18454 y := l.Args[1]
18455 if !(l.Uses == 1) {
18456 break
18457 }
18458 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags)
18459 v0.AddArg3(x, y, z)
18460 b.resetWithControl(BlockARMGTnoov, v0)
18461 return true
18462 }
18463
18464
18465
18466 for b.Controls[0].Op == OpARMCMPconst {
18467 v_0 := b.Controls[0]
18468 if auxIntToInt32(v_0.AuxInt) != 0 {
18469 break
18470 }
18471 l := v_0.Args[0]
18472 if l.Op != OpARMMULA {
18473 break
18474 }
18475 a := l.Args[2]
18476 x := l.Args[0]
18477 y := l.Args[1]
18478 if !(l.Uses == 1) {
18479 break
18480 }
18481 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
18482 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
18483 v1.AddArg2(x, y)
18484 v0.AddArg2(a, v1)
18485 b.resetWithControl(BlockARMGTnoov, v0)
18486 return true
18487 }
18488
18489
18490
18491 for b.Controls[0].Op == OpARMCMPconst {
18492 v_0 := b.Controls[0]
18493 if auxIntToInt32(v_0.AuxInt) != 0 {
18494 break
18495 }
18496 l := v_0.Args[0]
18497 if l.Op != OpARMAND {
18498 break
18499 }
18500 _ = l.Args[1]
18501 l_0 := l.Args[0]
18502 l_1 := l.Args[1]
18503 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
18504 x := l_0
18505 y := l_1
18506 if !(l.Uses == 1) {
18507 continue
18508 }
18509 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags)
18510 v0.AddArg2(x, y)
18511 b.resetWithControl(BlockARMGTnoov, v0)
18512 return true
18513 }
18514 break
18515 }
18516
18517
18518
18519 for b.Controls[0].Op == OpARMCMPconst {
18520 v_0 := b.Controls[0]
18521 if auxIntToInt32(v_0.AuxInt) != 0 {
18522 break
18523 }
18524 l := v_0.Args[0]
18525 if l.Op != OpARMANDconst {
18526 break
18527 }
18528 c := auxIntToInt32(l.AuxInt)
18529 x := l.Args[0]
18530 if !(l.Uses == 1) {
18531 break
18532 }
18533 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags)
18534 v0.AuxInt = int32ToAuxInt(c)
18535 v0.AddArg(x)
18536 b.resetWithControl(BlockARMGTnoov, v0)
18537 return true
18538 }
18539
18540
18541
18542 for b.Controls[0].Op == OpARMCMPconst {
18543 v_0 := b.Controls[0]
18544 if auxIntToInt32(v_0.AuxInt) != 0 {
18545 break
18546 }
18547 l := v_0.Args[0]
18548 if l.Op != OpARMANDshiftLL {
18549 break
18550 }
18551 c := auxIntToInt32(l.AuxInt)
18552 y := l.Args[1]
18553 x := l.Args[0]
18554 if !(l.Uses == 1) {
18555 break
18556 }
18557 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags)
18558 v0.AuxInt = int32ToAuxInt(c)
18559 v0.AddArg2(x, y)
18560 b.resetWithControl(BlockARMGTnoov, v0)
18561 return true
18562 }
18563
18564
18565
18566 for b.Controls[0].Op == OpARMCMPconst {
18567 v_0 := b.Controls[0]
18568 if auxIntToInt32(v_0.AuxInt) != 0 {
18569 break
18570 }
18571 l := v_0.Args[0]
18572 if l.Op != OpARMANDshiftRL {
18573 break
18574 }
18575 c := auxIntToInt32(l.AuxInt)
18576 y := l.Args[1]
18577 x := l.Args[0]
18578 if !(l.Uses == 1) {
18579 break
18580 }
18581 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags)
18582 v0.AuxInt = int32ToAuxInt(c)
18583 v0.AddArg2(x, y)
18584 b.resetWithControl(BlockARMGTnoov, v0)
18585 return true
18586 }
18587
18588
18589
18590 for b.Controls[0].Op == OpARMCMPconst {
18591 v_0 := b.Controls[0]
18592 if auxIntToInt32(v_0.AuxInt) != 0 {
18593 break
18594 }
18595 l := v_0.Args[0]
18596 if l.Op != OpARMANDshiftRA {
18597 break
18598 }
18599 c := auxIntToInt32(l.AuxInt)
18600 y := l.Args[1]
18601 x := l.Args[0]
18602 if !(l.Uses == 1) {
18603 break
18604 }
18605 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags)
18606 v0.AuxInt = int32ToAuxInt(c)
18607 v0.AddArg2(x, y)
18608 b.resetWithControl(BlockARMGTnoov, v0)
18609 return true
18610 }
18611
18612
18613
18614 for b.Controls[0].Op == OpARMCMPconst {
18615 v_0 := b.Controls[0]
18616 if auxIntToInt32(v_0.AuxInt) != 0 {
18617 break
18618 }
18619 l := v_0.Args[0]
18620 if l.Op != OpARMANDshiftLLreg {
18621 break
18622 }
18623 z := l.Args[2]
18624 x := l.Args[0]
18625 y := l.Args[1]
18626 if !(l.Uses == 1) {
18627 break
18628 }
18629 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags)
18630 v0.AddArg3(x, y, z)
18631 b.resetWithControl(BlockARMGTnoov, v0)
18632 return true
18633 }
18634
18635
18636
18637 for b.Controls[0].Op == OpARMCMPconst {
18638 v_0 := b.Controls[0]
18639 if auxIntToInt32(v_0.AuxInt) != 0 {
18640 break
18641 }
18642 l := v_0.Args[0]
18643 if l.Op != OpARMANDshiftRLreg {
18644 break
18645 }
18646 z := l.Args[2]
18647 x := l.Args[0]
18648 y := l.Args[1]
18649 if !(l.Uses == 1) {
18650 break
18651 }
18652 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags)
18653 v0.AddArg3(x, y, z)
18654 b.resetWithControl(BlockARMGTnoov, v0)
18655 return true
18656 }
18657
18658
18659
18660 for b.Controls[0].Op == OpARMCMPconst {
18661 v_0 := b.Controls[0]
18662 if auxIntToInt32(v_0.AuxInt) != 0 {
18663 break
18664 }
18665 l := v_0.Args[0]
18666 if l.Op != OpARMANDshiftRAreg {
18667 break
18668 }
18669 z := l.Args[2]
18670 x := l.Args[0]
18671 y := l.Args[1]
18672 if !(l.Uses == 1) {
18673 break
18674 }
18675 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags)
18676 v0.AddArg3(x, y, z)
18677 b.resetWithControl(BlockARMGTnoov, v0)
18678 return true
18679 }
18680
18681
18682
18683 for b.Controls[0].Op == OpARMCMPconst {
18684 v_0 := b.Controls[0]
18685 if auxIntToInt32(v_0.AuxInt) != 0 {
18686 break
18687 }
18688 l := v_0.Args[0]
18689 if l.Op != OpARMXOR {
18690 break
18691 }
18692 _ = l.Args[1]
18693 l_0 := l.Args[0]
18694 l_1 := l.Args[1]
18695 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
18696 x := l_0
18697 y := l_1
18698 if !(l.Uses == 1) {
18699 continue
18700 }
18701 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags)
18702 v0.AddArg2(x, y)
18703 b.resetWithControl(BlockARMGTnoov, v0)
18704 return true
18705 }
18706 break
18707 }
18708
18709
18710
18711 for b.Controls[0].Op == OpARMCMPconst {
18712 v_0 := b.Controls[0]
18713 if auxIntToInt32(v_0.AuxInt) != 0 {
18714 break
18715 }
18716 l := v_0.Args[0]
18717 if l.Op != OpARMXORconst {
18718 break
18719 }
18720 c := auxIntToInt32(l.AuxInt)
18721 x := l.Args[0]
18722 if !(l.Uses == 1) {
18723 break
18724 }
18725 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags)
18726 v0.AuxInt = int32ToAuxInt(c)
18727 v0.AddArg(x)
18728 b.resetWithControl(BlockARMGTnoov, v0)
18729 return true
18730 }
18731
18732
18733
18734 for b.Controls[0].Op == OpARMCMPconst {
18735 v_0 := b.Controls[0]
18736 if auxIntToInt32(v_0.AuxInt) != 0 {
18737 break
18738 }
18739 l := v_0.Args[0]
18740 if l.Op != OpARMXORshiftLL {
18741 break
18742 }
18743 c := auxIntToInt32(l.AuxInt)
18744 y := l.Args[1]
18745 x := l.Args[0]
18746 if !(l.Uses == 1) {
18747 break
18748 }
18749 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags)
18750 v0.AuxInt = int32ToAuxInt(c)
18751 v0.AddArg2(x, y)
18752 b.resetWithControl(BlockARMGTnoov, v0)
18753 return true
18754 }
18755
18756
18757
18758 for b.Controls[0].Op == OpARMCMPconst {
18759 v_0 := b.Controls[0]
18760 if auxIntToInt32(v_0.AuxInt) != 0 {
18761 break
18762 }
18763 l := v_0.Args[0]
18764 if l.Op != OpARMXORshiftRL {
18765 break
18766 }
18767 c := auxIntToInt32(l.AuxInt)
18768 y := l.Args[1]
18769 x := l.Args[0]
18770 if !(l.Uses == 1) {
18771 break
18772 }
18773 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags)
18774 v0.AuxInt = int32ToAuxInt(c)
18775 v0.AddArg2(x, y)
18776 b.resetWithControl(BlockARMGTnoov, v0)
18777 return true
18778 }
18779
18780
18781
18782 for b.Controls[0].Op == OpARMCMPconst {
18783 v_0 := b.Controls[0]
18784 if auxIntToInt32(v_0.AuxInt) != 0 {
18785 break
18786 }
18787 l := v_0.Args[0]
18788 if l.Op != OpARMXORshiftRA {
18789 break
18790 }
18791 c := auxIntToInt32(l.AuxInt)
18792 y := l.Args[1]
18793 x := l.Args[0]
18794 if !(l.Uses == 1) {
18795 break
18796 }
18797 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags)
18798 v0.AuxInt = int32ToAuxInt(c)
18799 v0.AddArg2(x, y)
18800 b.resetWithControl(BlockARMGTnoov, v0)
18801 return true
18802 }
18803
18804
18805
18806 for b.Controls[0].Op == OpARMCMPconst {
18807 v_0 := b.Controls[0]
18808 if auxIntToInt32(v_0.AuxInt) != 0 {
18809 break
18810 }
18811 l := v_0.Args[0]
18812 if l.Op != OpARMXORshiftLLreg {
18813 break
18814 }
18815 z := l.Args[2]
18816 x := l.Args[0]
18817 y := l.Args[1]
18818 if !(l.Uses == 1) {
18819 break
18820 }
18821 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags)
18822 v0.AddArg3(x, y, z)
18823 b.resetWithControl(BlockARMGTnoov, v0)
18824 return true
18825 }
18826
18827
18828
18829 for b.Controls[0].Op == OpARMCMPconst {
18830 v_0 := b.Controls[0]
18831 if auxIntToInt32(v_0.AuxInt) != 0 {
18832 break
18833 }
18834 l := v_0.Args[0]
18835 if l.Op != OpARMXORshiftRLreg {
18836 break
18837 }
18838 z := l.Args[2]
18839 x := l.Args[0]
18840 y := l.Args[1]
18841 if !(l.Uses == 1) {
18842 break
18843 }
18844 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags)
18845 v0.AddArg3(x, y, z)
18846 b.resetWithControl(BlockARMGTnoov, v0)
18847 return true
18848 }
18849
18850
18851
18852 for b.Controls[0].Op == OpARMCMPconst {
18853 v_0 := b.Controls[0]
18854 if auxIntToInt32(v_0.AuxInt) != 0 {
18855 break
18856 }
18857 l := v_0.Args[0]
18858 if l.Op != OpARMXORshiftRAreg {
18859 break
18860 }
18861 z := l.Args[2]
18862 x := l.Args[0]
18863 y := l.Args[1]
18864 if !(l.Uses == 1) {
18865 break
18866 }
18867 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags)
18868 v0.AddArg3(x, y, z)
18869 b.resetWithControl(BlockARMGTnoov, v0)
18870 return true
18871 }
18872 case BlockARMGTnoov:
18873
18874
18875
18876 for b.Controls[0].Op == OpARMFlagConstant {
18877 v_0 := b.Controls[0]
18878 fc := auxIntToFlagConstant(v_0.AuxInt)
18879 if !(fc.gtNoov()) {
18880 break
18881 }
18882 b.Reset(BlockFirst)
18883 return true
18884 }
18885
18886
18887
18888 for b.Controls[0].Op == OpARMFlagConstant {
18889 v_0 := b.Controls[0]
18890 fc := auxIntToFlagConstant(v_0.AuxInt)
18891 if !(!fc.gtNoov()) {
18892 break
18893 }
18894 b.Reset(BlockFirst)
18895 b.swapSuccessors()
18896 return true
18897 }
18898
18899
18900 for b.Controls[0].Op == OpARMInvertFlags {
18901 v_0 := b.Controls[0]
18902 cmp := v_0.Args[0]
18903 b.resetWithControl(BlockARMLTnoov, cmp)
18904 return true
18905 }
18906 case BlockIf:
18907
18908
18909 for b.Controls[0].Op == OpARMEqual {
18910 v_0 := b.Controls[0]
18911 cc := v_0.Args[0]
18912 b.resetWithControl(BlockARMEQ, cc)
18913 return true
18914 }
18915
18916
18917 for b.Controls[0].Op == OpARMNotEqual {
18918 v_0 := b.Controls[0]
18919 cc := v_0.Args[0]
18920 b.resetWithControl(BlockARMNE, cc)
18921 return true
18922 }
18923
18924
18925 for b.Controls[0].Op == OpARMLessThan {
18926 v_0 := b.Controls[0]
18927 cc := v_0.Args[0]
18928 b.resetWithControl(BlockARMLT, cc)
18929 return true
18930 }
18931
18932
18933 for b.Controls[0].Op == OpARMLessThanU {
18934 v_0 := b.Controls[0]
18935 cc := v_0.Args[0]
18936 b.resetWithControl(BlockARMULT, cc)
18937 return true
18938 }
18939
18940
18941 for b.Controls[0].Op == OpARMLessEqual {
18942 v_0 := b.Controls[0]
18943 cc := v_0.Args[0]
18944 b.resetWithControl(BlockARMLE, cc)
18945 return true
18946 }
18947
18948
18949 for b.Controls[0].Op == OpARMLessEqualU {
18950 v_0 := b.Controls[0]
18951 cc := v_0.Args[0]
18952 b.resetWithControl(BlockARMULE, cc)
18953 return true
18954 }
18955
18956
18957 for b.Controls[0].Op == OpARMGreaterThan {
18958 v_0 := b.Controls[0]
18959 cc := v_0.Args[0]
18960 b.resetWithControl(BlockARMGT, cc)
18961 return true
18962 }
18963
18964
18965 for b.Controls[0].Op == OpARMGreaterThanU {
18966 v_0 := b.Controls[0]
18967 cc := v_0.Args[0]
18968 b.resetWithControl(BlockARMUGT, cc)
18969 return true
18970 }
18971
18972
18973 for b.Controls[0].Op == OpARMGreaterEqual {
18974 v_0 := b.Controls[0]
18975 cc := v_0.Args[0]
18976 b.resetWithControl(BlockARMGE, cc)
18977 return true
18978 }
18979
18980
18981 for b.Controls[0].Op == OpARMGreaterEqualU {
18982 v_0 := b.Controls[0]
18983 cc := v_0.Args[0]
18984 b.resetWithControl(BlockARMUGE, cc)
18985 return true
18986 }
18987
18988
18989 for {
18990 cond := b.Controls[0]
18991 v0 := b.NewValue0(cond.Pos, OpARMCMPconst, types.TypeFlags)
18992 v0.AuxInt = int32ToAuxInt(0)
18993 v0.AddArg(cond)
18994 b.resetWithControl(BlockARMNE, v0)
18995 return true
18996 }
18997 case BlockARMLE:
18998
18999
19000
19001 for b.Controls[0].Op == OpARMFlagConstant {
19002 v_0 := b.Controls[0]
19003 fc := auxIntToFlagConstant(v_0.AuxInt)
19004 if !(fc.le()) {
19005 break
19006 }
19007 b.Reset(BlockFirst)
19008 return true
19009 }
19010
19011
19012
19013 for b.Controls[0].Op == OpARMFlagConstant {
19014 v_0 := b.Controls[0]
19015 fc := auxIntToFlagConstant(v_0.AuxInt)
19016 if !(!fc.le()) {
19017 break
19018 }
19019 b.Reset(BlockFirst)
19020 b.swapSuccessors()
19021 return true
19022 }
19023
19024
19025 for b.Controls[0].Op == OpARMInvertFlags {
19026 v_0 := b.Controls[0]
19027 cmp := v_0.Args[0]
19028 b.resetWithControl(BlockARMGE, cmp)
19029 return true
19030 }
19031
19032
19033
19034 for b.Controls[0].Op == OpARMCMPconst {
19035 v_0 := b.Controls[0]
19036 if auxIntToInt32(v_0.AuxInt) != 0 {
19037 break
19038 }
19039 l := v_0.Args[0]
19040 if l.Op != OpARMSUB {
19041 break
19042 }
19043 y := l.Args[1]
19044 x := l.Args[0]
19045 if !(l.Uses == 1) {
19046 break
19047 }
19048 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
19049 v0.AddArg2(x, y)
19050 b.resetWithControl(BlockARMLEnoov, v0)
19051 return true
19052 }
19053
19054
19055
19056 for b.Controls[0].Op == OpARMCMPconst {
19057 v_0 := b.Controls[0]
19058 if auxIntToInt32(v_0.AuxInt) != 0 {
19059 break
19060 }
19061 l := v_0.Args[0]
19062 if l.Op != OpARMMULS {
19063 break
19064 }
19065 a := l.Args[2]
19066 x := l.Args[0]
19067 y := l.Args[1]
19068 if !(l.Uses == 1) {
19069 break
19070 }
19071 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
19072 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
19073 v1.AddArg2(x, y)
19074 v0.AddArg2(a, v1)
19075 b.resetWithControl(BlockARMLEnoov, v0)
19076 return true
19077 }
19078
19079
19080
19081 for b.Controls[0].Op == OpARMCMPconst {
19082 v_0 := b.Controls[0]
19083 if auxIntToInt32(v_0.AuxInt) != 0 {
19084 break
19085 }
19086 l := v_0.Args[0]
19087 if l.Op != OpARMSUBconst {
19088 break
19089 }
19090 c := auxIntToInt32(l.AuxInt)
19091 x := l.Args[0]
19092 if !(l.Uses == 1) {
19093 break
19094 }
19095 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags)
19096 v0.AuxInt = int32ToAuxInt(c)
19097 v0.AddArg(x)
19098 b.resetWithControl(BlockARMLEnoov, v0)
19099 return true
19100 }
19101
19102
19103
19104 for b.Controls[0].Op == OpARMCMPconst {
19105 v_0 := b.Controls[0]
19106 if auxIntToInt32(v_0.AuxInt) != 0 {
19107 break
19108 }
19109 l := v_0.Args[0]
19110 if l.Op != OpARMSUBshiftLL {
19111 break
19112 }
19113 c := auxIntToInt32(l.AuxInt)
19114 y := l.Args[1]
19115 x := l.Args[0]
19116 if !(l.Uses == 1) {
19117 break
19118 }
19119 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags)
19120 v0.AuxInt = int32ToAuxInt(c)
19121 v0.AddArg2(x, y)
19122 b.resetWithControl(BlockARMLEnoov, v0)
19123 return true
19124 }
19125
19126
19127
19128 for b.Controls[0].Op == OpARMCMPconst {
19129 v_0 := b.Controls[0]
19130 if auxIntToInt32(v_0.AuxInt) != 0 {
19131 break
19132 }
19133 l := v_0.Args[0]
19134 if l.Op != OpARMSUBshiftRL {
19135 break
19136 }
19137 c := auxIntToInt32(l.AuxInt)
19138 y := l.Args[1]
19139 x := l.Args[0]
19140 if !(l.Uses == 1) {
19141 break
19142 }
19143 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags)
19144 v0.AuxInt = int32ToAuxInt(c)
19145 v0.AddArg2(x, y)
19146 b.resetWithControl(BlockARMLEnoov, v0)
19147 return true
19148 }
19149
19150
19151
19152 for b.Controls[0].Op == OpARMCMPconst {
19153 v_0 := b.Controls[0]
19154 if auxIntToInt32(v_0.AuxInt) != 0 {
19155 break
19156 }
19157 l := v_0.Args[0]
19158 if l.Op != OpARMSUBshiftRA {
19159 break
19160 }
19161 c := auxIntToInt32(l.AuxInt)
19162 y := l.Args[1]
19163 x := l.Args[0]
19164 if !(l.Uses == 1) {
19165 break
19166 }
19167 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags)
19168 v0.AuxInt = int32ToAuxInt(c)
19169 v0.AddArg2(x, y)
19170 b.resetWithControl(BlockARMLEnoov, v0)
19171 return true
19172 }
19173
19174
19175
19176 for b.Controls[0].Op == OpARMCMPconst {
19177 v_0 := b.Controls[0]
19178 if auxIntToInt32(v_0.AuxInt) != 0 {
19179 break
19180 }
19181 l := v_0.Args[0]
19182 if l.Op != OpARMSUBshiftLLreg {
19183 break
19184 }
19185 z := l.Args[2]
19186 x := l.Args[0]
19187 y := l.Args[1]
19188 if !(l.Uses == 1) {
19189 break
19190 }
19191 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
19192 v0.AddArg3(x, y, z)
19193 b.resetWithControl(BlockARMLEnoov, v0)
19194 return true
19195 }
19196
19197
19198
19199 for b.Controls[0].Op == OpARMCMPconst {
19200 v_0 := b.Controls[0]
19201 if auxIntToInt32(v_0.AuxInt) != 0 {
19202 break
19203 }
19204 l := v_0.Args[0]
19205 if l.Op != OpARMSUBshiftRLreg {
19206 break
19207 }
19208 z := l.Args[2]
19209 x := l.Args[0]
19210 y := l.Args[1]
19211 if !(l.Uses == 1) {
19212 break
19213 }
19214 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
19215 v0.AddArg3(x, y, z)
19216 b.resetWithControl(BlockARMLEnoov, v0)
19217 return true
19218 }
19219
19220
19221
19222 for b.Controls[0].Op == OpARMCMPconst {
19223 v_0 := b.Controls[0]
19224 if auxIntToInt32(v_0.AuxInt) != 0 {
19225 break
19226 }
19227 l := v_0.Args[0]
19228 if l.Op != OpARMSUBshiftRAreg {
19229 break
19230 }
19231 z := l.Args[2]
19232 x := l.Args[0]
19233 y := l.Args[1]
19234 if !(l.Uses == 1) {
19235 break
19236 }
19237 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
19238 v0.AddArg3(x, y, z)
19239 b.resetWithControl(BlockARMLEnoov, v0)
19240 return true
19241 }
19242
19243
19244
19245 for b.Controls[0].Op == OpARMCMPconst {
19246 v_0 := b.Controls[0]
19247 if auxIntToInt32(v_0.AuxInt) != 0 {
19248 break
19249 }
19250 l := v_0.Args[0]
19251 if l.Op != OpARMADD {
19252 break
19253 }
19254 _ = l.Args[1]
19255 l_0 := l.Args[0]
19256 l_1 := l.Args[1]
19257 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
19258 x := l_0
19259 y := l_1
19260 if !(l.Uses == 1) {
19261 continue
19262 }
19263 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
19264 v0.AddArg2(x, y)
19265 b.resetWithControl(BlockARMLEnoov, v0)
19266 return true
19267 }
19268 break
19269 }
19270
19271
19272
19273 for b.Controls[0].Op == OpARMCMPconst {
19274 v_0 := b.Controls[0]
19275 if auxIntToInt32(v_0.AuxInt) != 0 {
19276 break
19277 }
19278 l := v_0.Args[0]
19279 if l.Op != OpARMMULA {
19280 break
19281 }
19282 a := l.Args[2]
19283 x := l.Args[0]
19284 y := l.Args[1]
19285 if !(l.Uses == 1) {
19286 break
19287 }
19288 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
19289 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
19290 v1.AddArg2(x, y)
19291 v0.AddArg2(a, v1)
19292 b.resetWithControl(BlockARMLEnoov, v0)
19293 return true
19294 }
19295
19296
19297
19298 for b.Controls[0].Op == OpARMCMPconst {
19299 v_0 := b.Controls[0]
19300 if auxIntToInt32(v_0.AuxInt) != 0 {
19301 break
19302 }
19303 l := v_0.Args[0]
19304 if l.Op != OpARMADDconst {
19305 break
19306 }
19307 c := auxIntToInt32(l.AuxInt)
19308 x := l.Args[0]
19309 if !(l.Uses == 1) {
19310 break
19311 }
19312 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags)
19313 v0.AuxInt = int32ToAuxInt(c)
19314 v0.AddArg(x)
19315 b.resetWithControl(BlockARMLEnoov, v0)
19316 return true
19317 }
19318
19319
19320
19321 for b.Controls[0].Op == OpARMCMPconst {
19322 v_0 := b.Controls[0]
19323 if auxIntToInt32(v_0.AuxInt) != 0 {
19324 break
19325 }
19326 l := v_0.Args[0]
19327 if l.Op != OpARMADDshiftLL {
19328 break
19329 }
19330 c := auxIntToInt32(l.AuxInt)
19331 y := l.Args[1]
19332 x := l.Args[0]
19333 if !(l.Uses == 1) {
19334 break
19335 }
19336 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags)
19337 v0.AuxInt = int32ToAuxInt(c)
19338 v0.AddArg2(x, y)
19339 b.resetWithControl(BlockARMLEnoov, v0)
19340 return true
19341 }
19342
19343
19344
19345 for b.Controls[0].Op == OpARMCMPconst {
19346 v_0 := b.Controls[0]
19347 if auxIntToInt32(v_0.AuxInt) != 0 {
19348 break
19349 }
19350 l := v_0.Args[0]
19351 if l.Op != OpARMADDshiftRL {
19352 break
19353 }
19354 c := auxIntToInt32(l.AuxInt)
19355 y := l.Args[1]
19356 x := l.Args[0]
19357 if !(l.Uses == 1) {
19358 break
19359 }
19360 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags)
19361 v0.AuxInt = int32ToAuxInt(c)
19362 v0.AddArg2(x, y)
19363 b.resetWithControl(BlockARMLEnoov, v0)
19364 return true
19365 }
19366
19367
19368
19369 for b.Controls[0].Op == OpARMCMPconst {
19370 v_0 := b.Controls[0]
19371 if auxIntToInt32(v_0.AuxInt) != 0 {
19372 break
19373 }
19374 l := v_0.Args[0]
19375 if l.Op != OpARMADDshiftRA {
19376 break
19377 }
19378 c := auxIntToInt32(l.AuxInt)
19379 y := l.Args[1]
19380 x := l.Args[0]
19381 if !(l.Uses == 1) {
19382 break
19383 }
19384 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags)
19385 v0.AuxInt = int32ToAuxInt(c)
19386 v0.AddArg2(x, y)
19387 b.resetWithControl(BlockARMLEnoov, v0)
19388 return true
19389 }
19390
19391
19392
19393 for b.Controls[0].Op == OpARMCMPconst {
19394 v_0 := b.Controls[0]
19395 if auxIntToInt32(v_0.AuxInt) != 0 {
19396 break
19397 }
19398 l := v_0.Args[0]
19399 if l.Op != OpARMADDshiftLLreg {
19400 break
19401 }
19402 z := l.Args[2]
19403 x := l.Args[0]
19404 y := l.Args[1]
19405 if !(l.Uses == 1) {
19406 break
19407 }
19408 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags)
19409 v0.AddArg3(x, y, z)
19410 b.resetWithControl(BlockARMLEnoov, v0)
19411 return true
19412 }
19413
19414
19415
19416 for b.Controls[0].Op == OpARMCMPconst {
19417 v_0 := b.Controls[0]
19418 if auxIntToInt32(v_0.AuxInt) != 0 {
19419 break
19420 }
19421 l := v_0.Args[0]
19422 if l.Op != OpARMADDshiftRLreg {
19423 break
19424 }
19425 z := l.Args[2]
19426 x := l.Args[0]
19427 y := l.Args[1]
19428 if !(l.Uses == 1) {
19429 break
19430 }
19431 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags)
19432 v0.AddArg3(x, y, z)
19433 b.resetWithControl(BlockARMLEnoov, v0)
19434 return true
19435 }
19436
19437
19438
19439 for b.Controls[0].Op == OpARMCMPconst {
19440 v_0 := b.Controls[0]
19441 if auxIntToInt32(v_0.AuxInt) != 0 {
19442 break
19443 }
19444 l := v_0.Args[0]
19445 if l.Op != OpARMADDshiftRAreg {
19446 break
19447 }
19448 z := l.Args[2]
19449 x := l.Args[0]
19450 y := l.Args[1]
19451 if !(l.Uses == 1) {
19452 break
19453 }
19454 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags)
19455 v0.AddArg3(x, y, z)
19456 b.resetWithControl(BlockARMLEnoov, v0)
19457 return true
19458 }
19459
19460
19461
19462 for b.Controls[0].Op == OpARMCMPconst {
19463 v_0 := b.Controls[0]
19464 if auxIntToInt32(v_0.AuxInt) != 0 {
19465 break
19466 }
19467 l := v_0.Args[0]
19468 if l.Op != OpARMAND {
19469 break
19470 }
19471 _ = l.Args[1]
19472 l_0 := l.Args[0]
19473 l_1 := l.Args[1]
19474 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
19475 x := l_0
19476 y := l_1
19477 if !(l.Uses == 1) {
19478 continue
19479 }
19480 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags)
19481 v0.AddArg2(x, y)
19482 b.resetWithControl(BlockARMLEnoov, v0)
19483 return true
19484 }
19485 break
19486 }
19487
19488
19489
19490 for b.Controls[0].Op == OpARMCMPconst {
19491 v_0 := b.Controls[0]
19492 if auxIntToInt32(v_0.AuxInt) != 0 {
19493 break
19494 }
19495 l := v_0.Args[0]
19496 if l.Op != OpARMANDconst {
19497 break
19498 }
19499 c := auxIntToInt32(l.AuxInt)
19500 x := l.Args[0]
19501 if !(l.Uses == 1) {
19502 break
19503 }
19504 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags)
19505 v0.AuxInt = int32ToAuxInt(c)
19506 v0.AddArg(x)
19507 b.resetWithControl(BlockARMLEnoov, v0)
19508 return true
19509 }
19510
19511
19512
19513 for b.Controls[0].Op == OpARMCMPconst {
19514 v_0 := b.Controls[0]
19515 if auxIntToInt32(v_0.AuxInt) != 0 {
19516 break
19517 }
19518 l := v_0.Args[0]
19519 if l.Op != OpARMANDshiftLL {
19520 break
19521 }
19522 c := auxIntToInt32(l.AuxInt)
19523 y := l.Args[1]
19524 x := l.Args[0]
19525 if !(l.Uses == 1) {
19526 break
19527 }
19528 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags)
19529 v0.AuxInt = int32ToAuxInt(c)
19530 v0.AddArg2(x, y)
19531 b.resetWithControl(BlockARMLEnoov, v0)
19532 return true
19533 }
19534
19535
19536
19537 for b.Controls[0].Op == OpARMCMPconst {
19538 v_0 := b.Controls[0]
19539 if auxIntToInt32(v_0.AuxInt) != 0 {
19540 break
19541 }
19542 l := v_0.Args[0]
19543 if l.Op != OpARMANDshiftRL {
19544 break
19545 }
19546 c := auxIntToInt32(l.AuxInt)
19547 y := l.Args[1]
19548 x := l.Args[0]
19549 if !(l.Uses == 1) {
19550 break
19551 }
19552 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags)
19553 v0.AuxInt = int32ToAuxInt(c)
19554 v0.AddArg2(x, y)
19555 b.resetWithControl(BlockARMLEnoov, v0)
19556 return true
19557 }
19558
19559
19560
19561 for b.Controls[0].Op == OpARMCMPconst {
19562 v_0 := b.Controls[0]
19563 if auxIntToInt32(v_0.AuxInt) != 0 {
19564 break
19565 }
19566 l := v_0.Args[0]
19567 if l.Op != OpARMANDshiftRA {
19568 break
19569 }
19570 c := auxIntToInt32(l.AuxInt)
19571 y := l.Args[1]
19572 x := l.Args[0]
19573 if !(l.Uses == 1) {
19574 break
19575 }
19576 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags)
19577 v0.AuxInt = int32ToAuxInt(c)
19578 v0.AddArg2(x, y)
19579 b.resetWithControl(BlockARMLEnoov, v0)
19580 return true
19581 }
19582
19583
19584
19585 for b.Controls[0].Op == OpARMCMPconst {
19586 v_0 := b.Controls[0]
19587 if auxIntToInt32(v_0.AuxInt) != 0 {
19588 break
19589 }
19590 l := v_0.Args[0]
19591 if l.Op != OpARMANDshiftLLreg {
19592 break
19593 }
19594 z := l.Args[2]
19595 x := l.Args[0]
19596 y := l.Args[1]
19597 if !(l.Uses == 1) {
19598 break
19599 }
19600 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags)
19601 v0.AddArg3(x, y, z)
19602 b.resetWithControl(BlockARMLEnoov, v0)
19603 return true
19604 }
19605
19606
19607
19608 for b.Controls[0].Op == OpARMCMPconst {
19609 v_0 := b.Controls[0]
19610 if auxIntToInt32(v_0.AuxInt) != 0 {
19611 break
19612 }
19613 l := v_0.Args[0]
19614 if l.Op != OpARMANDshiftRLreg {
19615 break
19616 }
19617 z := l.Args[2]
19618 x := l.Args[0]
19619 y := l.Args[1]
19620 if !(l.Uses == 1) {
19621 break
19622 }
19623 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags)
19624 v0.AddArg3(x, y, z)
19625 b.resetWithControl(BlockARMLEnoov, v0)
19626 return true
19627 }
19628
19629
19630
19631 for b.Controls[0].Op == OpARMCMPconst {
19632 v_0 := b.Controls[0]
19633 if auxIntToInt32(v_0.AuxInt) != 0 {
19634 break
19635 }
19636 l := v_0.Args[0]
19637 if l.Op != OpARMANDshiftRAreg {
19638 break
19639 }
19640 z := l.Args[2]
19641 x := l.Args[0]
19642 y := l.Args[1]
19643 if !(l.Uses == 1) {
19644 break
19645 }
19646 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags)
19647 v0.AddArg3(x, y, z)
19648 b.resetWithControl(BlockARMLEnoov, v0)
19649 return true
19650 }
19651
19652
19653
19654 for b.Controls[0].Op == OpARMCMPconst {
19655 v_0 := b.Controls[0]
19656 if auxIntToInt32(v_0.AuxInt) != 0 {
19657 break
19658 }
19659 l := v_0.Args[0]
19660 if l.Op != OpARMXOR {
19661 break
19662 }
19663 _ = l.Args[1]
19664 l_0 := l.Args[0]
19665 l_1 := l.Args[1]
19666 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
19667 x := l_0
19668 y := l_1
19669 if !(l.Uses == 1) {
19670 continue
19671 }
19672 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags)
19673 v0.AddArg2(x, y)
19674 b.resetWithControl(BlockARMLEnoov, v0)
19675 return true
19676 }
19677 break
19678 }
19679
19680
19681
19682 for b.Controls[0].Op == OpARMCMPconst {
19683 v_0 := b.Controls[0]
19684 if auxIntToInt32(v_0.AuxInt) != 0 {
19685 break
19686 }
19687 l := v_0.Args[0]
19688 if l.Op != OpARMXORconst {
19689 break
19690 }
19691 c := auxIntToInt32(l.AuxInt)
19692 x := l.Args[0]
19693 if !(l.Uses == 1) {
19694 break
19695 }
19696 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags)
19697 v0.AuxInt = int32ToAuxInt(c)
19698 v0.AddArg(x)
19699 b.resetWithControl(BlockARMLEnoov, v0)
19700 return true
19701 }
19702
19703
19704
19705 for b.Controls[0].Op == OpARMCMPconst {
19706 v_0 := b.Controls[0]
19707 if auxIntToInt32(v_0.AuxInt) != 0 {
19708 break
19709 }
19710 l := v_0.Args[0]
19711 if l.Op != OpARMXORshiftLL {
19712 break
19713 }
19714 c := auxIntToInt32(l.AuxInt)
19715 y := l.Args[1]
19716 x := l.Args[0]
19717 if !(l.Uses == 1) {
19718 break
19719 }
19720 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags)
19721 v0.AuxInt = int32ToAuxInt(c)
19722 v0.AddArg2(x, y)
19723 b.resetWithControl(BlockARMLEnoov, v0)
19724 return true
19725 }
19726
19727
19728
19729 for b.Controls[0].Op == OpARMCMPconst {
19730 v_0 := b.Controls[0]
19731 if auxIntToInt32(v_0.AuxInt) != 0 {
19732 break
19733 }
19734 l := v_0.Args[0]
19735 if l.Op != OpARMXORshiftRL {
19736 break
19737 }
19738 c := auxIntToInt32(l.AuxInt)
19739 y := l.Args[1]
19740 x := l.Args[0]
19741 if !(l.Uses == 1) {
19742 break
19743 }
19744 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags)
19745 v0.AuxInt = int32ToAuxInt(c)
19746 v0.AddArg2(x, y)
19747 b.resetWithControl(BlockARMLEnoov, v0)
19748 return true
19749 }
19750
19751
19752
19753 for b.Controls[0].Op == OpARMCMPconst {
19754 v_0 := b.Controls[0]
19755 if auxIntToInt32(v_0.AuxInt) != 0 {
19756 break
19757 }
19758 l := v_0.Args[0]
19759 if l.Op != OpARMXORshiftRA {
19760 break
19761 }
19762 c := auxIntToInt32(l.AuxInt)
19763 y := l.Args[1]
19764 x := l.Args[0]
19765 if !(l.Uses == 1) {
19766 break
19767 }
19768 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags)
19769 v0.AuxInt = int32ToAuxInt(c)
19770 v0.AddArg2(x, y)
19771 b.resetWithControl(BlockARMLEnoov, v0)
19772 return true
19773 }
19774
19775
19776
19777 for b.Controls[0].Op == OpARMCMPconst {
19778 v_0 := b.Controls[0]
19779 if auxIntToInt32(v_0.AuxInt) != 0 {
19780 break
19781 }
19782 l := v_0.Args[0]
19783 if l.Op != OpARMXORshiftLLreg {
19784 break
19785 }
19786 z := l.Args[2]
19787 x := l.Args[0]
19788 y := l.Args[1]
19789 if !(l.Uses == 1) {
19790 break
19791 }
19792 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags)
19793 v0.AddArg3(x, y, z)
19794 b.resetWithControl(BlockARMLEnoov, v0)
19795 return true
19796 }
19797
19798
19799
19800 for b.Controls[0].Op == OpARMCMPconst {
19801 v_0 := b.Controls[0]
19802 if auxIntToInt32(v_0.AuxInt) != 0 {
19803 break
19804 }
19805 l := v_0.Args[0]
19806 if l.Op != OpARMXORshiftRLreg {
19807 break
19808 }
19809 z := l.Args[2]
19810 x := l.Args[0]
19811 y := l.Args[1]
19812 if !(l.Uses == 1) {
19813 break
19814 }
19815 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags)
19816 v0.AddArg3(x, y, z)
19817 b.resetWithControl(BlockARMLEnoov, v0)
19818 return true
19819 }
19820
19821
19822
19823 for b.Controls[0].Op == OpARMCMPconst {
19824 v_0 := b.Controls[0]
19825 if auxIntToInt32(v_0.AuxInt) != 0 {
19826 break
19827 }
19828 l := v_0.Args[0]
19829 if l.Op != OpARMXORshiftRAreg {
19830 break
19831 }
19832 z := l.Args[2]
19833 x := l.Args[0]
19834 y := l.Args[1]
19835 if !(l.Uses == 1) {
19836 break
19837 }
19838 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags)
19839 v0.AddArg3(x, y, z)
19840 b.resetWithControl(BlockARMLEnoov, v0)
19841 return true
19842 }
19843 case BlockARMLEnoov:
19844
19845
19846
19847 for b.Controls[0].Op == OpARMFlagConstant {
19848 v_0 := b.Controls[0]
19849 fc := auxIntToFlagConstant(v_0.AuxInt)
19850 if !(fc.leNoov()) {
19851 break
19852 }
19853 b.Reset(BlockFirst)
19854 return true
19855 }
19856
19857
19858
19859 for b.Controls[0].Op == OpARMFlagConstant {
19860 v_0 := b.Controls[0]
19861 fc := auxIntToFlagConstant(v_0.AuxInt)
19862 if !(!fc.leNoov()) {
19863 break
19864 }
19865 b.Reset(BlockFirst)
19866 b.swapSuccessors()
19867 return true
19868 }
19869
19870
19871 for b.Controls[0].Op == OpARMInvertFlags {
19872 v_0 := b.Controls[0]
19873 cmp := v_0.Args[0]
19874 b.resetWithControl(BlockARMGEnoov, cmp)
19875 return true
19876 }
19877 case BlockARMLT:
19878
19879
19880
19881 for b.Controls[0].Op == OpARMFlagConstant {
19882 v_0 := b.Controls[0]
19883 fc := auxIntToFlagConstant(v_0.AuxInt)
19884 if !(fc.lt()) {
19885 break
19886 }
19887 b.Reset(BlockFirst)
19888 return true
19889 }
19890
19891
19892
19893 for b.Controls[0].Op == OpARMFlagConstant {
19894 v_0 := b.Controls[0]
19895 fc := auxIntToFlagConstant(v_0.AuxInt)
19896 if !(!fc.lt()) {
19897 break
19898 }
19899 b.Reset(BlockFirst)
19900 b.swapSuccessors()
19901 return true
19902 }
19903
19904
19905 for b.Controls[0].Op == OpARMInvertFlags {
19906 v_0 := b.Controls[0]
19907 cmp := v_0.Args[0]
19908 b.resetWithControl(BlockARMGT, cmp)
19909 return true
19910 }
19911
19912
19913
19914 for b.Controls[0].Op == OpARMCMPconst {
19915 v_0 := b.Controls[0]
19916 if auxIntToInt32(v_0.AuxInt) != 0 {
19917 break
19918 }
19919 l := v_0.Args[0]
19920 if l.Op != OpARMSUB {
19921 break
19922 }
19923 y := l.Args[1]
19924 x := l.Args[0]
19925 if !(l.Uses == 1) {
19926 break
19927 }
19928 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
19929 v0.AddArg2(x, y)
19930 b.resetWithControl(BlockARMLTnoov, v0)
19931 return true
19932 }
19933
19934
19935
19936 for b.Controls[0].Op == OpARMCMPconst {
19937 v_0 := b.Controls[0]
19938 if auxIntToInt32(v_0.AuxInt) != 0 {
19939 break
19940 }
19941 l := v_0.Args[0]
19942 if l.Op != OpARMMULS {
19943 break
19944 }
19945 a := l.Args[2]
19946 x := l.Args[0]
19947 y := l.Args[1]
19948 if !(l.Uses == 1) {
19949 break
19950 }
19951 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
19952 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
19953 v1.AddArg2(x, y)
19954 v0.AddArg2(a, v1)
19955 b.resetWithControl(BlockARMLTnoov, v0)
19956 return true
19957 }
19958
19959
19960
19961 for b.Controls[0].Op == OpARMCMPconst {
19962 v_0 := b.Controls[0]
19963 if auxIntToInt32(v_0.AuxInt) != 0 {
19964 break
19965 }
19966 l := v_0.Args[0]
19967 if l.Op != OpARMSUBconst {
19968 break
19969 }
19970 c := auxIntToInt32(l.AuxInt)
19971 x := l.Args[0]
19972 if !(l.Uses == 1) {
19973 break
19974 }
19975 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags)
19976 v0.AuxInt = int32ToAuxInt(c)
19977 v0.AddArg(x)
19978 b.resetWithControl(BlockARMLTnoov, v0)
19979 return true
19980 }
19981
19982
19983
19984 for b.Controls[0].Op == OpARMCMPconst {
19985 v_0 := b.Controls[0]
19986 if auxIntToInt32(v_0.AuxInt) != 0 {
19987 break
19988 }
19989 l := v_0.Args[0]
19990 if l.Op != OpARMSUBshiftLL {
19991 break
19992 }
19993 c := auxIntToInt32(l.AuxInt)
19994 y := l.Args[1]
19995 x := l.Args[0]
19996 if !(l.Uses == 1) {
19997 break
19998 }
19999 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags)
20000 v0.AuxInt = int32ToAuxInt(c)
20001 v0.AddArg2(x, y)
20002 b.resetWithControl(BlockARMLTnoov, v0)
20003 return true
20004 }
20005
20006
20007
20008 for b.Controls[0].Op == OpARMCMPconst {
20009 v_0 := b.Controls[0]
20010 if auxIntToInt32(v_0.AuxInt) != 0 {
20011 break
20012 }
20013 l := v_0.Args[0]
20014 if l.Op != OpARMSUBshiftRL {
20015 break
20016 }
20017 c := auxIntToInt32(l.AuxInt)
20018 y := l.Args[1]
20019 x := l.Args[0]
20020 if !(l.Uses == 1) {
20021 break
20022 }
20023 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags)
20024 v0.AuxInt = int32ToAuxInt(c)
20025 v0.AddArg2(x, y)
20026 b.resetWithControl(BlockARMLTnoov, v0)
20027 return true
20028 }
20029
20030
20031
20032 for b.Controls[0].Op == OpARMCMPconst {
20033 v_0 := b.Controls[0]
20034 if auxIntToInt32(v_0.AuxInt) != 0 {
20035 break
20036 }
20037 l := v_0.Args[0]
20038 if l.Op != OpARMSUBshiftRA {
20039 break
20040 }
20041 c := auxIntToInt32(l.AuxInt)
20042 y := l.Args[1]
20043 x := l.Args[0]
20044 if !(l.Uses == 1) {
20045 break
20046 }
20047 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags)
20048 v0.AuxInt = int32ToAuxInt(c)
20049 v0.AddArg2(x, y)
20050 b.resetWithControl(BlockARMLTnoov, v0)
20051 return true
20052 }
20053
20054
20055
20056 for b.Controls[0].Op == OpARMCMPconst {
20057 v_0 := b.Controls[0]
20058 if auxIntToInt32(v_0.AuxInt) != 0 {
20059 break
20060 }
20061 l := v_0.Args[0]
20062 if l.Op != OpARMSUBshiftLLreg {
20063 break
20064 }
20065 z := l.Args[2]
20066 x := l.Args[0]
20067 y := l.Args[1]
20068 if !(l.Uses == 1) {
20069 break
20070 }
20071 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
20072 v0.AddArg3(x, y, z)
20073 b.resetWithControl(BlockARMLTnoov, v0)
20074 return true
20075 }
20076
20077
20078
20079 for b.Controls[0].Op == OpARMCMPconst {
20080 v_0 := b.Controls[0]
20081 if auxIntToInt32(v_0.AuxInt) != 0 {
20082 break
20083 }
20084 l := v_0.Args[0]
20085 if l.Op != OpARMSUBshiftRLreg {
20086 break
20087 }
20088 z := l.Args[2]
20089 x := l.Args[0]
20090 y := l.Args[1]
20091 if !(l.Uses == 1) {
20092 break
20093 }
20094 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
20095 v0.AddArg3(x, y, z)
20096 b.resetWithControl(BlockARMLTnoov, v0)
20097 return true
20098 }
20099
20100
20101
20102 for b.Controls[0].Op == OpARMCMPconst {
20103 v_0 := b.Controls[0]
20104 if auxIntToInt32(v_0.AuxInt) != 0 {
20105 break
20106 }
20107 l := v_0.Args[0]
20108 if l.Op != OpARMSUBshiftRAreg {
20109 break
20110 }
20111 z := l.Args[2]
20112 x := l.Args[0]
20113 y := l.Args[1]
20114 if !(l.Uses == 1) {
20115 break
20116 }
20117 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
20118 v0.AddArg3(x, y, z)
20119 b.resetWithControl(BlockARMLTnoov, v0)
20120 return true
20121 }
20122
20123
20124
20125 for b.Controls[0].Op == OpARMCMPconst {
20126 v_0 := b.Controls[0]
20127 if auxIntToInt32(v_0.AuxInt) != 0 {
20128 break
20129 }
20130 l := v_0.Args[0]
20131 if l.Op != OpARMADD {
20132 break
20133 }
20134 _ = l.Args[1]
20135 l_0 := l.Args[0]
20136 l_1 := l.Args[1]
20137 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
20138 x := l_0
20139 y := l_1
20140 if !(l.Uses == 1) {
20141 continue
20142 }
20143 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
20144 v0.AddArg2(x, y)
20145 b.resetWithControl(BlockARMLTnoov, v0)
20146 return true
20147 }
20148 break
20149 }
20150
20151
20152
20153 for b.Controls[0].Op == OpARMCMPconst {
20154 v_0 := b.Controls[0]
20155 if auxIntToInt32(v_0.AuxInt) != 0 {
20156 break
20157 }
20158 l := v_0.Args[0]
20159 if l.Op != OpARMMULA {
20160 break
20161 }
20162 a := l.Args[2]
20163 x := l.Args[0]
20164 y := l.Args[1]
20165 if !(l.Uses == 1) {
20166 break
20167 }
20168 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
20169 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
20170 v1.AddArg2(x, y)
20171 v0.AddArg2(a, v1)
20172 b.resetWithControl(BlockARMLTnoov, v0)
20173 return true
20174 }
20175
20176
20177
20178 for b.Controls[0].Op == OpARMCMPconst {
20179 v_0 := b.Controls[0]
20180 if auxIntToInt32(v_0.AuxInt) != 0 {
20181 break
20182 }
20183 l := v_0.Args[0]
20184 if l.Op != OpARMADDconst {
20185 break
20186 }
20187 c := auxIntToInt32(l.AuxInt)
20188 x := l.Args[0]
20189 if !(l.Uses == 1) {
20190 break
20191 }
20192 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags)
20193 v0.AuxInt = int32ToAuxInt(c)
20194 v0.AddArg(x)
20195 b.resetWithControl(BlockARMLTnoov, v0)
20196 return true
20197 }
20198
20199
20200
20201 for b.Controls[0].Op == OpARMCMPconst {
20202 v_0 := b.Controls[0]
20203 if auxIntToInt32(v_0.AuxInt) != 0 {
20204 break
20205 }
20206 l := v_0.Args[0]
20207 if l.Op != OpARMADDshiftLL {
20208 break
20209 }
20210 c := auxIntToInt32(l.AuxInt)
20211 y := l.Args[1]
20212 x := l.Args[0]
20213 if !(l.Uses == 1) {
20214 break
20215 }
20216 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags)
20217 v0.AuxInt = int32ToAuxInt(c)
20218 v0.AddArg2(x, y)
20219 b.resetWithControl(BlockARMLTnoov, v0)
20220 return true
20221 }
20222
20223
20224
20225 for b.Controls[0].Op == OpARMCMPconst {
20226 v_0 := b.Controls[0]
20227 if auxIntToInt32(v_0.AuxInt) != 0 {
20228 break
20229 }
20230 l := v_0.Args[0]
20231 if l.Op != OpARMADDshiftRL {
20232 break
20233 }
20234 c := auxIntToInt32(l.AuxInt)
20235 y := l.Args[1]
20236 x := l.Args[0]
20237 if !(l.Uses == 1) {
20238 break
20239 }
20240 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags)
20241 v0.AuxInt = int32ToAuxInt(c)
20242 v0.AddArg2(x, y)
20243 b.resetWithControl(BlockARMLTnoov, v0)
20244 return true
20245 }
20246
20247
20248
20249 for b.Controls[0].Op == OpARMCMPconst {
20250 v_0 := b.Controls[0]
20251 if auxIntToInt32(v_0.AuxInt) != 0 {
20252 break
20253 }
20254 l := v_0.Args[0]
20255 if l.Op != OpARMADDshiftRA {
20256 break
20257 }
20258 c := auxIntToInt32(l.AuxInt)
20259 y := l.Args[1]
20260 x := l.Args[0]
20261 if !(l.Uses == 1) {
20262 break
20263 }
20264 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags)
20265 v0.AuxInt = int32ToAuxInt(c)
20266 v0.AddArg2(x, y)
20267 b.resetWithControl(BlockARMLTnoov, v0)
20268 return true
20269 }
20270
20271
20272
20273 for b.Controls[0].Op == OpARMCMPconst {
20274 v_0 := b.Controls[0]
20275 if auxIntToInt32(v_0.AuxInt) != 0 {
20276 break
20277 }
20278 l := v_0.Args[0]
20279 if l.Op != OpARMADDshiftLLreg {
20280 break
20281 }
20282 z := l.Args[2]
20283 x := l.Args[0]
20284 y := l.Args[1]
20285 if !(l.Uses == 1) {
20286 break
20287 }
20288 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags)
20289 v0.AddArg3(x, y, z)
20290 b.resetWithControl(BlockARMLTnoov, v0)
20291 return true
20292 }
20293
20294
20295
20296 for b.Controls[0].Op == OpARMCMPconst {
20297 v_0 := b.Controls[0]
20298 if auxIntToInt32(v_0.AuxInt) != 0 {
20299 break
20300 }
20301 l := v_0.Args[0]
20302 if l.Op != OpARMADDshiftRLreg {
20303 break
20304 }
20305 z := l.Args[2]
20306 x := l.Args[0]
20307 y := l.Args[1]
20308 if !(l.Uses == 1) {
20309 break
20310 }
20311 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags)
20312 v0.AddArg3(x, y, z)
20313 b.resetWithControl(BlockARMLTnoov, v0)
20314 return true
20315 }
20316
20317
20318
20319 for b.Controls[0].Op == OpARMCMPconst {
20320 v_0 := b.Controls[0]
20321 if auxIntToInt32(v_0.AuxInt) != 0 {
20322 break
20323 }
20324 l := v_0.Args[0]
20325 if l.Op != OpARMADDshiftRAreg {
20326 break
20327 }
20328 z := l.Args[2]
20329 x := l.Args[0]
20330 y := l.Args[1]
20331 if !(l.Uses == 1) {
20332 break
20333 }
20334 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags)
20335 v0.AddArg3(x, y, z)
20336 b.resetWithControl(BlockARMLTnoov, v0)
20337 return true
20338 }
20339
20340
20341
20342 for b.Controls[0].Op == OpARMCMPconst {
20343 v_0 := b.Controls[0]
20344 if auxIntToInt32(v_0.AuxInt) != 0 {
20345 break
20346 }
20347 l := v_0.Args[0]
20348 if l.Op != OpARMAND {
20349 break
20350 }
20351 _ = l.Args[1]
20352 l_0 := l.Args[0]
20353 l_1 := l.Args[1]
20354 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
20355 x := l_0
20356 y := l_1
20357 if !(l.Uses == 1) {
20358 continue
20359 }
20360 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags)
20361 v0.AddArg2(x, y)
20362 b.resetWithControl(BlockARMLTnoov, v0)
20363 return true
20364 }
20365 break
20366 }
20367
20368
20369
20370 for b.Controls[0].Op == OpARMCMPconst {
20371 v_0 := b.Controls[0]
20372 if auxIntToInt32(v_0.AuxInt) != 0 {
20373 break
20374 }
20375 l := v_0.Args[0]
20376 if l.Op != OpARMANDconst {
20377 break
20378 }
20379 c := auxIntToInt32(l.AuxInt)
20380 x := l.Args[0]
20381 if !(l.Uses == 1) {
20382 break
20383 }
20384 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags)
20385 v0.AuxInt = int32ToAuxInt(c)
20386 v0.AddArg(x)
20387 b.resetWithControl(BlockARMLTnoov, v0)
20388 return true
20389 }
20390
20391
20392
20393 for b.Controls[0].Op == OpARMCMPconst {
20394 v_0 := b.Controls[0]
20395 if auxIntToInt32(v_0.AuxInt) != 0 {
20396 break
20397 }
20398 l := v_0.Args[0]
20399 if l.Op != OpARMANDshiftLL {
20400 break
20401 }
20402 c := auxIntToInt32(l.AuxInt)
20403 y := l.Args[1]
20404 x := l.Args[0]
20405 if !(l.Uses == 1) {
20406 break
20407 }
20408 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags)
20409 v0.AuxInt = int32ToAuxInt(c)
20410 v0.AddArg2(x, y)
20411 b.resetWithControl(BlockARMLTnoov, v0)
20412 return true
20413 }
20414
20415
20416
20417 for b.Controls[0].Op == OpARMCMPconst {
20418 v_0 := b.Controls[0]
20419 if auxIntToInt32(v_0.AuxInt) != 0 {
20420 break
20421 }
20422 l := v_0.Args[0]
20423 if l.Op != OpARMANDshiftRL {
20424 break
20425 }
20426 c := auxIntToInt32(l.AuxInt)
20427 y := l.Args[1]
20428 x := l.Args[0]
20429 if !(l.Uses == 1) {
20430 break
20431 }
20432 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags)
20433 v0.AuxInt = int32ToAuxInt(c)
20434 v0.AddArg2(x, y)
20435 b.resetWithControl(BlockARMLTnoov, v0)
20436 return true
20437 }
20438
20439
20440
20441 for b.Controls[0].Op == OpARMCMPconst {
20442 v_0 := b.Controls[0]
20443 if auxIntToInt32(v_0.AuxInt) != 0 {
20444 break
20445 }
20446 l := v_0.Args[0]
20447 if l.Op != OpARMANDshiftRA {
20448 break
20449 }
20450 c := auxIntToInt32(l.AuxInt)
20451 y := l.Args[1]
20452 x := l.Args[0]
20453 if !(l.Uses == 1) {
20454 break
20455 }
20456 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags)
20457 v0.AuxInt = int32ToAuxInt(c)
20458 v0.AddArg2(x, y)
20459 b.resetWithControl(BlockARMLTnoov, v0)
20460 return true
20461 }
20462
20463
20464
20465 for b.Controls[0].Op == OpARMCMPconst {
20466 v_0 := b.Controls[0]
20467 if auxIntToInt32(v_0.AuxInt) != 0 {
20468 break
20469 }
20470 l := v_0.Args[0]
20471 if l.Op != OpARMANDshiftLLreg {
20472 break
20473 }
20474 z := l.Args[2]
20475 x := l.Args[0]
20476 y := l.Args[1]
20477 if !(l.Uses == 1) {
20478 break
20479 }
20480 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags)
20481 v0.AddArg3(x, y, z)
20482 b.resetWithControl(BlockARMLTnoov, v0)
20483 return true
20484 }
20485
20486
20487
20488 for b.Controls[0].Op == OpARMCMPconst {
20489 v_0 := b.Controls[0]
20490 if auxIntToInt32(v_0.AuxInt) != 0 {
20491 break
20492 }
20493 l := v_0.Args[0]
20494 if l.Op != OpARMANDshiftRLreg {
20495 break
20496 }
20497 z := l.Args[2]
20498 x := l.Args[0]
20499 y := l.Args[1]
20500 if !(l.Uses == 1) {
20501 break
20502 }
20503 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags)
20504 v0.AddArg3(x, y, z)
20505 b.resetWithControl(BlockARMLTnoov, v0)
20506 return true
20507 }
20508
20509
20510
20511 for b.Controls[0].Op == OpARMCMPconst {
20512 v_0 := b.Controls[0]
20513 if auxIntToInt32(v_0.AuxInt) != 0 {
20514 break
20515 }
20516 l := v_0.Args[0]
20517 if l.Op != OpARMANDshiftRAreg {
20518 break
20519 }
20520 z := l.Args[2]
20521 x := l.Args[0]
20522 y := l.Args[1]
20523 if !(l.Uses == 1) {
20524 break
20525 }
20526 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags)
20527 v0.AddArg3(x, y, z)
20528 b.resetWithControl(BlockARMLTnoov, v0)
20529 return true
20530 }
20531
20532
20533
20534 for b.Controls[0].Op == OpARMCMPconst {
20535 v_0 := b.Controls[0]
20536 if auxIntToInt32(v_0.AuxInt) != 0 {
20537 break
20538 }
20539 l := v_0.Args[0]
20540 if l.Op != OpARMXOR {
20541 break
20542 }
20543 _ = l.Args[1]
20544 l_0 := l.Args[0]
20545 l_1 := l.Args[1]
20546 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
20547 x := l_0
20548 y := l_1
20549 if !(l.Uses == 1) {
20550 continue
20551 }
20552 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags)
20553 v0.AddArg2(x, y)
20554 b.resetWithControl(BlockARMLTnoov, v0)
20555 return true
20556 }
20557 break
20558 }
20559
20560
20561
20562 for b.Controls[0].Op == OpARMCMPconst {
20563 v_0 := b.Controls[0]
20564 if auxIntToInt32(v_0.AuxInt) != 0 {
20565 break
20566 }
20567 l := v_0.Args[0]
20568 if l.Op != OpARMXORconst {
20569 break
20570 }
20571 c := auxIntToInt32(l.AuxInt)
20572 x := l.Args[0]
20573 if !(l.Uses == 1) {
20574 break
20575 }
20576 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags)
20577 v0.AuxInt = int32ToAuxInt(c)
20578 v0.AddArg(x)
20579 b.resetWithControl(BlockARMLTnoov, v0)
20580 return true
20581 }
20582
20583
20584
20585 for b.Controls[0].Op == OpARMCMPconst {
20586 v_0 := b.Controls[0]
20587 if auxIntToInt32(v_0.AuxInt) != 0 {
20588 break
20589 }
20590 l := v_0.Args[0]
20591 if l.Op != OpARMXORshiftLL {
20592 break
20593 }
20594 c := auxIntToInt32(l.AuxInt)
20595 y := l.Args[1]
20596 x := l.Args[0]
20597 if !(l.Uses == 1) {
20598 break
20599 }
20600 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags)
20601 v0.AuxInt = int32ToAuxInt(c)
20602 v0.AddArg2(x, y)
20603 b.resetWithControl(BlockARMLTnoov, v0)
20604 return true
20605 }
20606
20607
20608
20609 for b.Controls[0].Op == OpARMCMPconst {
20610 v_0 := b.Controls[0]
20611 if auxIntToInt32(v_0.AuxInt) != 0 {
20612 break
20613 }
20614 l := v_0.Args[0]
20615 if l.Op != OpARMXORshiftRL {
20616 break
20617 }
20618 c := auxIntToInt32(l.AuxInt)
20619 y := l.Args[1]
20620 x := l.Args[0]
20621 if !(l.Uses == 1) {
20622 break
20623 }
20624 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags)
20625 v0.AuxInt = int32ToAuxInt(c)
20626 v0.AddArg2(x, y)
20627 b.resetWithControl(BlockARMLTnoov, v0)
20628 return true
20629 }
20630
20631
20632
20633 for b.Controls[0].Op == OpARMCMPconst {
20634 v_0 := b.Controls[0]
20635 if auxIntToInt32(v_0.AuxInt) != 0 {
20636 break
20637 }
20638 l := v_0.Args[0]
20639 if l.Op != OpARMXORshiftRA {
20640 break
20641 }
20642 c := auxIntToInt32(l.AuxInt)
20643 y := l.Args[1]
20644 x := l.Args[0]
20645 if !(l.Uses == 1) {
20646 break
20647 }
20648 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags)
20649 v0.AuxInt = int32ToAuxInt(c)
20650 v0.AddArg2(x, y)
20651 b.resetWithControl(BlockARMLTnoov, v0)
20652 return true
20653 }
20654
20655
20656
20657 for b.Controls[0].Op == OpARMCMPconst {
20658 v_0 := b.Controls[0]
20659 if auxIntToInt32(v_0.AuxInt) != 0 {
20660 break
20661 }
20662 l := v_0.Args[0]
20663 if l.Op != OpARMXORshiftLLreg {
20664 break
20665 }
20666 z := l.Args[2]
20667 x := l.Args[0]
20668 y := l.Args[1]
20669 if !(l.Uses == 1) {
20670 break
20671 }
20672 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags)
20673 v0.AddArg3(x, y, z)
20674 b.resetWithControl(BlockARMLTnoov, v0)
20675 return true
20676 }
20677
20678
20679
20680 for b.Controls[0].Op == OpARMCMPconst {
20681 v_0 := b.Controls[0]
20682 if auxIntToInt32(v_0.AuxInt) != 0 {
20683 break
20684 }
20685 l := v_0.Args[0]
20686 if l.Op != OpARMXORshiftRLreg {
20687 break
20688 }
20689 z := l.Args[2]
20690 x := l.Args[0]
20691 y := l.Args[1]
20692 if !(l.Uses == 1) {
20693 break
20694 }
20695 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags)
20696 v0.AddArg3(x, y, z)
20697 b.resetWithControl(BlockARMLTnoov, v0)
20698 return true
20699 }
20700
20701
20702
20703 for b.Controls[0].Op == OpARMCMPconst {
20704 v_0 := b.Controls[0]
20705 if auxIntToInt32(v_0.AuxInt) != 0 {
20706 break
20707 }
20708 l := v_0.Args[0]
20709 if l.Op != OpARMXORshiftRAreg {
20710 break
20711 }
20712 z := l.Args[2]
20713 x := l.Args[0]
20714 y := l.Args[1]
20715 if !(l.Uses == 1) {
20716 break
20717 }
20718 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags)
20719 v0.AddArg3(x, y, z)
20720 b.resetWithControl(BlockARMLTnoov, v0)
20721 return true
20722 }
20723 case BlockARMLTnoov:
20724
20725
20726
20727 for b.Controls[0].Op == OpARMFlagConstant {
20728 v_0 := b.Controls[0]
20729 fc := auxIntToFlagConstant(v_0.AuxInt)
20730 if !(fc.ltNoov()) {
20731 break
20732 }
20733 b.Reset(BlockFirst)
20734 return true
20735 }
20736
20737
20738
20739 for b.Controls[0].Op == OpARMFlagConstant {
20740 v_0 := b.Controls[0]
20741 fc := auxIntToFlagConstant(v_0.AuxInt)
20742 if !(!fc.ltNoov()) {
20743 break
20744 }
20745 b.Reset(BlockFirst)
20746 b.swapSuccessors()
20747 return true
20748 }
20749
20750
20751 for b.Controls[0].Op == OpARMInvertFlags {
20752 v_0 := b.Controls[0]
20753 cmp := v_0.Args[0]
20754 b.resetWithControl(BlockARMGTnoov, cmp)
20755 return true
20756 }
20757 case BlockARMNE:
20758
20759
20760 for b.Controls[0].Op == OpARMCMPconst {
20761 v_0 := b.Controls[0]
20762 if auxIntToInt32(v_0.AuxInt) != 0 {
20763 break
20764 }
20765 v_0_0 := v_0.Args[0]
20766 if v_0_0.Op != OpARMEqual {
20767 break
20768 }
20769 cc := v_0_0.Args[0]
20770 b.resetWithControl(BlockARMEQ, cc)
20771 return true
20772 }
20773
20774
20775 for b.Controls[0].Op == OpARMCMPconst {
20776 v_0 := b.Controls[0]
20777 if auxIntToInt32(v_0.AuxInt) != 0 {
20778 break
20779 }
20780 v_0_0 := v_0.Args[0]
20781 if v_0_0.Op != OpARMNotEqual {
20782 break
20783 }
20784 cc := v_0_0.Args[0]
20785 b.resetWithControl(BlockARMNE, cc)
20786 return true
20787 }
20788
20789
20790 for b.Controls[0].Op == OpARMCMPconst {
20791 v_0 := b.Controls[0]
20792 if auxIntToInt32(v_0.AuxInt) != 0 {
20793 break
20794 }
20795 v_0_0 := v_0.Args[0]
20796 if v_0_0.Op != OpARMLessThan {
20797 break
20798 }
20799 cc := v_0_0.Args[0]
20800 b.resetWithControl(BlockARMLT, cc)
20801 return true
20802 }
20803
20804
20805 for b.Controls[0].Op == OpARMCMPconst {
20806 v_0 := b.Controls[0]
20807 if auxIntToInt32(v_0.AuxInt) != 0 {
20808 break
20809 }
20810 v_0_0 := v_0.Args[0]
20811 if v_0_0.Op != OpARMLessThanU {
20812 break
20813 }
20814 cc := v_0_0.Args[0]
20815 b.resetWithControl(BlockARMULT, cc)
20816 return true
20817 }
20818
20819
20820 for b.Controls[0].Op == OpARMCMPconst {
20821 v_0 := b.Controls[0]
20822 if auxIntToInt32(v_0.AuxInt) != 0 {
20823 break
20824 }
20825 v_0_0 := v_0.Args[0]
20826 if v_0_0.Op != OpARMLessEqual {
20827 break
20828 }
20829 cc := v_0_0.Args[0]
20830 b.resetWithControl(BlockARMLE, cc)
20831 return true
20832 }
20833
20834
20835 for b.Controls[0].Op == OpARMCMPconst {
20836 v_0 := b.Controls[0]
20837 if auxIntToInt32(v_0.AuxInt) != 0 {
20838 break
20839 }
20840 v_0_0 := v_0.Args[0]
20841 if v_0_0.Op != OpARMLessEqualU {
20842 break
20843 }
20844 cc := v_0_0.Args[0]
20845 b.resetWithControl(BlockARMULE, cc)
20846 return true
20847 }
20848
20849
20850 for b.Controls[0].Op == OpARMCMPconst {
20851 v_0 := b.Controls[0]
20852 if auxIntToInt32(v_0.AuxInt) != 0 {
20853 break
20854 }
20855 v_0_0 := v_0.Args[0]
20856 if v_0_0.Op != OpARMGreaterThan {
20857 break
20858 }
20859 cc := v_0_0.Args[0]
20860 b.resetWithControl(BlockARMGT, cc)
20861 return true
20862 }
20863
20864
20865 for b.Controls[0].Op == OpARMCMPconst {
20866 v_0 := b.Controls[0]
20867 if auxIntToInt32(v_0.AuxInt) != 0 {
20868 break
20869 }
20870 v_0_0 := v_0.Args[0]
20871 if v_0_0.Op != OpARMGreaterThanU {
20872 break
20873 }
20874 cc := v_0_0.Args[0]
20875 b.resetWithControl(BlockARMUGT, cc)
20876 return true
20877 }
20878
20879
20880 for b.Controls[0].Op == OpARMCMPconst {
20881 v_0 := b.Controls[0]
20882 if auxIntToInt32(v_0.AuxInt) != 0 {
20883 break
20884 }
20885 v_0_0 := v_0.Args[0]
20886 if v_0_0.Op != OpARMGreaterEqual {
20887 break
20888 }
20889 cc := v_0_0.Args[0]
20890 b.resetWithControl(BlockARMGE, cc)
20891 return true
20892 }
20893
20894
20895 for b.Controls[0].Op == OpARMCMPconst {
20896 v_0 := b.Controls[0]
20897 if auxIntToInt32(v_0.AuxInt) != 0 {
20898 break
20899 }
20900 v_0_0 := v_0.Args[0]
20901 if v_0_0.Op != OpARMGreaterEqualU {
20902 break
20903 }
20904 cc := v_0_0.Args[0]
20905 b.resetWithControl(BlockARMUGE, cc)
20906 return true
20907 }
20908
20909
20910
20911 for b.Controls[0].Op == OpARMFlagConstant {
20912 v_0 := b.Controls[0]
20913 fc := auxIntToFlagConstant(v_0.AuxInt)
20914 if !(fc.ne()) {
20915 break
20916 }
20917 b.Reset(BlockFirst)
20918 return true
20919 }
20920
20921
20922
20923 for b.Controls[0].Op == OpARMFlagConstant {
20924 v_0 := b.Controls[0]
20925 fc := auxIntToFlagConstant(v_0.AuxInt)
20926 if !(!fc.ne()) {
20927 break
20928 }
20929 b.Reset(BlockFirst)
20930 b.swapSuccessors()
20931 return true
20932 }
20933
20934
20935 for b.Controls[0].Op == OpARMInvertFlags {
20936 v_0 := b.Controls[0]
20937 cmp := v_0.Args[0]
20938 b.resetWithControl(BlockARMNE, cmp)
20939 return true
20940 }
20941
20942
20943 for b.Controls[0].Op == OpARMCMP {
20944 v_0 := b.Controls[0]
20945 _ = v_0.Args[1]
20946 x := v_0.Args[0]
20947 v_0_1 := v_0.Args[1]
20948 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 {
20949 break
20950 }
20951 y := v_0_1.Args[0]
20952 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
20953 v0.AddArg2(x, y)
20954 b.resetWithControl(BlockARMNE, v0)
20955 return true
20956 }
20957
20958
20959 for b.Controls[0].Op == OpARMCMN {
20960 v_0 := b.Controls[0]
20961 _ = v_0.Args[1]
20962 v_0_0 := v_0.Args[0]
20963 v_0_1 := v_0.Args[1]
20964 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
20965 x := v_0_0
20966 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 {
20967 continue
20968 }
20969 y := v_0_1.Args[0]
20970 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
20971 v0.AddArg2(x, y)
20972 b.resetWithControl(BlockARMNE, v0)
20973 return true
20974 }
20975 break
20976 }
20977
20978
20979
20980 for b.Controls[0].Op == OpARMCMPconst {
20981 v_0 := b.Controls[0]
20982 if auxIntToInt32(v_0.AuxInt) != 0 {
20983 break
20984 }
20985 l := v_0.Args[0]
20986 if l.Op != OpARMSUB {
20987 break
20988 }
20989 y := l.Args[1]
20990 x := l.Args[0]
20991 if !(l.Uses == 1) {
20992 break
20993 }
20994 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
20995 v0.AddArg2(x, y)
20996 b.resetWithControl(BlockARMNE, v0)
20997 return true
20998 }
20999
21000
21001
21002 for b.Controls[0].Op == OpARMCMPconst {
21003 v_0 := b.Controls[0]
21004 if auxIntToInt32(v_0.AuxInt) != 0 {
21005 break
21006 }
21007 l := v_0.Args[0]
21008 if l.Op != OpARMMULS {
21009 break
21010 }
21011 a := l.Args[2]
21012 x := l.Args[0]
21013 y := l.Args[1]
21014 if !(l.Uses == 1) {
21015 break
21016 }
21017 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags)
21018 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
21019 v1.AddArg2(x, y)
21020 v0.AddArg2(a, v1)
21021 b.resetWithControl(BlockARMNE, v0)
21022 return true
21023 }
21024
21025
21026
21027 for b.Controls[0].Op == OpARMCMPconst {
21028 v_0 := b.Controls[0]
21029 if auxIntToInt32(v_0.AuxInt) != 0 {
21030 break
21031 }
21032 l := v_0.Args[0]
21033 if l.Op != OpARMSUBconst {
21034 break
21035 }
21036 c := auxIntToInt32(l.AuxInt)
21037 x := l.Args[0]
21038 if !(l.Uses == 1) {
21039 break
21040 }
21041 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags)
21042 v0.AuxInt = int32ToAuxInt(c)
21043 v0.AddArg(x)
21044 b.resetWithControl(BlockARMNE, v0)
21045 return true
21046 }
21047
21048
21049
21050 for b.Controls[0].Op == OpARMCMPconst {
21051 v_0 := b.Controls[0]
21052 if auxIntToInt32(v_0.AuxInt) != 0 {
21053 break
21054 }
21055 l := v_0.Args[0]
21056 if l.Op != OpARMSUBshiftLL {
21057 break
21058 }
21059 c := auxIntToInt32(l.AuxInt)
21060 y := l.Args[1]
21061 x := l.Args[0]
21062 if !(l.Uses == 1) {
21063 break
21064 }
21065 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags)
21066 v0.AuxInt = int32ToAuxInt(c)
21067 v0.AddArg2(x, y)
21068 b.resetWithControl(BlockARMNE, v0)
21069 return true
21070 }
21071
21072
21073
21074 for b.Controls[0].Op == OpARMCMPconst {
21075 v_0 := b.Controls[0]
21076 if auxIntToInt32(v_0.AuxInt) != 0 {
21077 break
21078 }
21079 l := v_0.Args[0]
21080 if l.Op != OpARMSUBshiftRL {
21081 break
21082 }
21083 c := auxIntToInt32(l.AuxInt)
21084 y := l.Args[1]
21085 x := l.Args[0]
21086 if !(l.Uses == 1) {
21087 break
21088 }
21089 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags)
21090 v0.AuxInt = int32ToAuxInt(c)
21091 v0.AddArg2(x, y)
21092 b.resetWithControl(BlockARMNE, v0)
21093 return true
21094 }
21095
21096
21097
21098 for b.Controls[0].Op == OpARMCMPconst {
21099 v_0 := b.Controls[0]
21100 if auxIntToInt32(v_0.AuxInt) != 0 {
21101 break
21102 }
21103 l := v_0.Args[0]
21104 if l.Op != OpARMSUBshiftRA {
21105 break
21106 }
21107 c := auxIntToInt32(l.AuxInt)
21108 y := l.Args[1]
21109 x := l.Args[0]
21110 if !(l.Uses == 1) {
21111 break
21112 }
21113 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags)
21114 v0.AuxInt = int32ToAuxInt(c)
21115 v0.AddArg2(x, y)
21116 b.resetWithControl(BlockARMNE, v0)
21117 return true
21118 }
21119
21120
21121
21122 for b.Controls[0].Op == OpARMCMPconst {
21123 v_0 := b.Controls[0]
21124 if auxIntToInt32(v_0.AuxInt) != 0 {
21125 break
21126 }
21127 l := v_0.Args[0]
21128 if l.Op != OpARMSUBshiftLLreg {
21129 break
21130 }
21131 z := l.Args[2]
21132 x := l.Args[0]
21133 y := l.Args[1]
21134 if !(l.Uses == 1) {
21135 break
21136 }
21137 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags)
21138 v0.AddArg3(x, y, z)
21139 b.resetWithControl(BlockARMNE, v0)
21140 return true
21141 }
21142
21143
21144
21145 for b.Controls[0].Op == OpARMCMPconst {
21146 v_0 := b.Controls[0]
21147 if auxIntToInt32(v_0.AuxInt) != 0 {
21148 break
21149 }
21150 l := v_0.Args[0]
21151 if l.Op != OpARMSUBshiftRLreg {
21152 break
21153 }
21154 z := l.Args[2]
21155 x := l.Args[0]
21156 y := l.Args[1]
21157 if !(l.Uses == 1) {
21158 break
21159 }
21160 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags)
21161 v0.AddArg3(x, y, z)
21162 b.resetWithControl(BlockARMNE, v0)
21163 return true
21164 }
21165
21166
21167
21168 for b.Controls[0].Op == OpARMCMPconst {
21169 v_0 := b.Controls[0]
21170 if auxIntToInt32(v_0.AuxInt) != 0 {
21171 break
21172 }
21173 l := v_0.Args[0]
21174 if l.Op != OpARMSUBshiftRAreg {
21175 break
21176 }
21177 z := l.Args[2]
21178 x := l.Args[0]
21179 y := l.Args[1]
21180 if !(l.Uses == 1) {
21181 break
21182 }
21183 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags)
21184 v0.AddArg3(x, y, z)
21185 b.resetWithControl(BlockARMNE, v0)
21186 return true
21187 }
21188
21189
21190
21191 for b.Controls[0].Op == OpARMCMPconst {
21192 v_0 := b.Controls[0]
21193 if auxIntToInt32(v_0.AuxInt) != 0 {
21194 break
21195 }
21196 l := v_0.Args[0]
21197 if l.Op != OpARMADD {
21198 break
21199 }
21200 _ = l.Args[1]
21201 l_0 := l.Args[0]
21202 l_1 := l.Args[1]
21203 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
21204 x := l_0
21205 y := l_1
21206 if !(l.Uses == 1) {
21207 continue
21208 }
21209 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
21210 v0.AddArg2(x, y)
21211 b.resetWithControl(BlockARMNE, v0)
21212 return true
21213 }
21214 break
21215 }
21216
21217
21218
21219 for b.Controls[0].Op == OpARMCMPconst {
21220 v_0 := b.Controls[0]
21221 if auxIntToInt32(v_0.AuxInt) != 0 {
21222 break
21223 }
21224 l := v_0.Args[0]
21225 if l.Op != OpARMMULA {
21226 break
21227 }
21228 a := l.Args[2]
21229 x := l.Args[0]
21230 y := l.Args[1]
21231 if !(l.Uses == 1) {
21232 break
21233 }
21234 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags)
21235 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type)
21236 v1.AddArg2(x, y)
21237 v0.AddArg2(a, v1)
21238 b.resetWithControl(BlockARMNE, v0)
21239 return true
21240 }
21241
21242
21243
21244 for b.Controls[0].Op == OpARMCMPconst {
21245 v_0 := b.Controls[0]
21246 if auxIntToInt32(v_0.AuxInt) != 0 {
21247 break
21248 }
21249 l := v_0.Args[0]
21250 if l.Op != OpARMADDconst {
21251 break
21252 }
21253 c := auxIntToInt32(l.AuxInt)
21254 x := l.Args[0]
21255 if !(l.Uses == 1) {
21256 break
21257 }
21258 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags)
21259 v0.AuxInt = int32ToAuxInt(c)
21260 v0.AddArg(x)
21261 b.resetWithControl(BlockARMNE, v0)
21262 return true
21263 }
21264
21265
21266
21267 for b.Controls[0].Op == OpARMCMPconst {
21268 v_0 := b.Controls[0]
21269 if auxIntToInt32(v_0.AuxInt) != 0 {
21270 break
21271 }
21272 l := v_0.Args[0]
21273 if l.Op != OpARMADDshiftLL {
21274 break
21275 }
21276 c := auxIntToInt32(l.AuxInt)
21277 y := l.Args[1]
21278 x := l.Args[0]
21279 if !(l.Uses == 1) {
21280 break
21281 }
21282 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags)
21283 v0.AuxInt = int32ToAuxInt(c)
21284 v0.AddArg2(x, y)
21285 b.resetWithControl(BlockARMNE, v0)
21286 return true
21287 }
21288
21289
21290
21291 for b.Controls[0].Op == OpARMCMPconst {
21292 v_0 := b.Controls[0]
21293 if auxIntToInt32(v_0.AuxInt) != 0 {
21294 break
21295 }
21296 l := v_0.Args[0]
21297 if l.Op != OpARMADDshiftRL {
21298 break
21299 }
21300 c := auxIntToInt32(l.AuxInt)
21301 y := l.Args[1]
21302 x := l.Args[0]
21303 if !(l.Uses == 1) {
21304 break
21305 }
21306 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags)
21307 v0.AuxInt = int32ToAuxInt(c)
21308 v0.AddArg2(x, y)
21309 b.resetWithControl(BlockARMNE, v0)
21310 return true
21311 }
21312
21313
21314
21315 for b.Controls[0].Op == OpARMCMPconst {
21316 v_0 := b.Controls[0]
21317 if auxIntToInt32(v_0.AuxInt) != 0 {
21318 break
21319 }
21320 l := v_0.Args[0]
21321 if l.Op != OpARMADDshiftRA {
21322 break
21323 }
21324 c := auxIntToInt32(l.AuxInt)
21325 y := l.Args[1]
21326 x := l.Args[0]
21327 if !(l.Uses == 1) {
21328 break
21329 }
21330 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags)
21331 v0.AuxInt = int32ToAuxInt(c)
21332 v0.AddArg2(x, y)
21333 b.resetWithControl(BlockARMNE, v0)
21334 return true
21335 }
21336
21337
21338
21339 for b.Controls[0].Op == OpARMCMPconst {
21340 v_0 := b.Controls[0]
21341 if auxIntToInt32(v_0.AuxInt) != 0 {
21342 break
21343 }
21344 l := v_0.Args[0]
21345 if l.Op != OpARMADDshiftLLreg {
21346 break
21347 }
21348 z := l.Args[2]
21349 x := l.Args[0]
21350 y := l.Args[1]
21351 if !(l.Uses == 1) {
21352 break
21353 }
21354 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags)
21355 v0.AddArg3(x, y, z)
21356 b.resetWithControl(BlockARMNE, v0)
21357 return true
21358 }
21359
21360
21361
21362 for b.Controls[0].Op == OpARMCMPconst {
21363 v_0 := b.Controls[0]
21364 if auxIntToInt32(v_0.AuxInt) != 0 {
21365 break
21366 }
21367 l := v_0.Args[0]
21368 if l.Op != OpARMADDshiftRLreg {
21369 break
21370 }
21371 z := l.Args[2]
21372 x := l.Args[0]
21373 y := l.Args[1]
21374 if !(l.Uses == 1) {
21375 break
21376 }
21377 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags)
21378 v0.AddArg3(x, y, z)
21379 b.resetWithControl(BlockARMNE, v0)
21380 return true
21381 }
21382
21383
21384
21385 for b.Controls[0].Op == OpARMCMPconst {
21386 v_0 := b.Controls[0]
21387 if auxIntToInt32(v_0.AuxInt) != 0 {
21388 break
21389 }
21390 l := v_0.Args[0]
21391 if l.Op != OpARMADDshiftRAreg {
21392 break
21393 }
21394 z := l.Args[2]
21395 x := l.Args[0]
21396 y := l.Args[1]
21397 if !(l.Uses == 1) {
21398 break
21399 }
21400 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags)
21401 v0.AddArg3(x, y, z)
21402 b.resetWithControl(BlockARMNE, v0)
21403 return true
21404 }
21405
21406
21407
21408 for b.Controls[0].Op == OpARMCMPconst {
21409 v_0 := b.Controls[0]
21410 if auxIntToInt32(v_0.AuxInt) != 0 {
21411 break
21412 }
21413 l := v_0.Args[0]
21414 if l.Op != OpARMAND {
21415 break
21416 }
21417 _ = l.Args[1]
21418 l_0 := l.Args[0]
21419 l_1 := l.Args[1]
21420 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
21421 x := l_0
21422 y := l_1
21423 if !(l.Uses == 1) {
21424 continue
21425 }
21426 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags)
21427 v0.AddArg2(x, y)
21428 b.resetWithControl(BlockARMNE, v0)
21429 return true
21430 }
21431 break
21432 }
21433
21434
21435
21436 for b.Controls[0].Op == OpARMCMPconst {
21437 v_0 := b.Controls[0]
21438 if auxIntToInt32(v_0.AuxInt) != 0 {
21439 break
21440 }
21441 l := v_0.Args[0]
21442 if l.Op != OpARMANDconst {
21443 break
21444 }
21445 c := auxIntToInt32(l.AuxInt)
21446 x := l.Args[0]
21447 if !(l.Uses == 1) {
21448 break
21449 }
21450 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags)
21451 v0.AuxInt = int32ToAuxInt(c)
21452 v0.AddArg(x)
21453 b.resetWithControl(BlockARMNE, v0)
21454 return true
21455 }
21456
21457
21458
21459 for b.Controls[0].Op == OpARMCMPconst {
21460 v_0 := b.Controls[0]
21461 if auxIntToInt32(v_0.AuxInt) != 0 {
21462 break
21463 }
21464 l := v_0.Args[0]
21465 if l.Op != OpARMANDshiftLL {
21466 break
21467 }
21468 c := auxIntToInt32(l.AuxInt)
21469 y := l.Args[1]
21470 x := l.Args[0]
21471 if !(l.Uses == 1) {
21472 break
21473 }
21474 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags)
21475 v0.AuxInt = int32ToAuxInt(c)
21476 v0.AddArg2(x, y)
21477 b.resetWithControl(BlockARMNE, v0)
21478 return true
21479 }
21480
21481
21482
21483 for b.Controls[0].Op == OpARMCMPconst {
21484 v_0 := b.Controls[0]
21485 if auxIntToInt32(v_0.AuxInt) != 0 {
21486 break
21487 }
21488 l := v_0.Args[0]
21489 if l.Op != OpARMANDshiftRL {
21490 break
21491 }
21492 c := auxIntToInt32(l.AuxInt)
21493 y := l.Args[1]
21494 x := l.Args[0]
21495 if !(l.Uses == 1) {
21496 break
21497 }
21498 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags)
21499 v0.AuxInt = int32ToAuxInt(c)
21500 v0.AddArg2(x, y)
21501 b.resetWithControl(BlockARMNE, v0)
21502 return true
21503 }
21504
21505
21506
21507 for b.Controls[0].Op == OpARMCMPconst {
21508 v_0 := b.Controls[0]
21509 if auxIntToInt32(v_0.AuxInt) != 0 {
21510 break
21511 }
21512 l := v_0.Args[0]
21513 if l.Op != OpARMANDshiftRA {
21514 break
21515 }
21516 c := auxIntToInt32(l.AuxInt)
21517 y := l.Args[1]
21518 x := l.Args[0]
21519 if !(l.Uses == 1) {
21520 break
21521 }
21522 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags)
21523 v0.AuxInt = int32ToAuxInt(c)
21524 v0.AddArg2(x, y)
21525 b.resetWithControl(BlockARMNE, v0)
21526 return true
21527 }
21528
21529
21530
21531 for b.Controls[0].Op == OpARMCMPconst {
21532 v_0 := b.Controls[0]
21533 if auxIntToInt32(v_0.AuxInt) != 0 {
21534 break
21535 }
21536 l := v_0.Args[0]
21537 if l.Op != OpARMANDshiftLLreg {
21538 break
21539 }
21540 z := l.Args[2]
21541 x := l.Args[0]
21542 y := l.Args[1]
21543 if !(l.Uses == 1) {
21544 break
21545 }
21546 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags)
21547 v0.AddArg3(x, y, z)
21548 b.resetWithControl(BlockARMNE, v0)
21549 return true
21550 }
21551
21552
21553
21554 for b.Controls[0].Op == OpARMCMPconst {
21555 v_0 := b.Controls[0]
21556 if auxIntToInt32(v_0.AuxInt) != 0 {
21557 break
21558 }
21559 l := v_0.Args[0]
21560 if l.Op != OpARMANDshiftRLreg {
21561 break
21562 }
21563 z := l.Args[2]
21564 x := l.Args[0]
21565 y := l.Args[1]
21566 if !(l.Uses == 1) {
21567 break
21568 }
21569 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags)
21570 v0.AddArg3(x, y, z)
21571 b.resetWithControl(BlockARMNE, v0)
21572 return true
21573 }
21574
21575
21576
21577 for b.Controls[0].Op == OpARMCMPconst {
21578 v_0 := b.Controls[0]
21579 if auxIntToInt32(v_0.AuxInt) != 0 {
21580 break
21581 }
21582 l := v_0.Args[0]
21583 if l.Op != OpARMANDshiftRAreg {
21584 break
21585 }
21586 z := l.Args[2]
21587 x := l.Args[0]
21588 y := l.Args[1]
21589 if !(l.Uses == 1) {
21590 break
21591 }
21592 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags)
21593 v0.AddArg3(x, y, z)
21594 b.resetWithControl(BlockARMNE, v0)
21595 return true
21596 }
21597
21598
21599
21600 for b.Controls[0].Op == OpARMCMPconst {
21601 v_0 := b.Controls[0]
21602 if auxIntToInt32(v_0.AuxInt) != 0 {
21603 break
21604 }
21605 l := v_0.Args[0]
21606 if l.Op != OpARMXOR {
21607 break
21608 }
21609 _ = l.Args[1]
21610 l_0 := l.Args[0]
21611 l_1 := l.Args[1]
21612 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 {
21613 x := l_0
21614 y := l_1
21615 if !(l.Uses == 1) {
21616 continue
21617 }
21618 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags)
21619 v0.AddArg2(x, y)
21620 b.resetWithControl(BlockARMNE, v0)
21621 return true
21622 }
21623 break
21624 }
21625
21626
21627
21628 for b.Controls[0].Op == OpARMCMPconst {
21629 v_0 := b.Controls[0]
21630 if auxIntToInt32(v_0.AuxInt) != 0 {
21631 break
21632 }
21633 l := v_0.Args[0]
21634 if l.Op != OpARMXORconst {
21635 break
21636 }
21637 c := auxIntToInt32(l.AuxInt)
21638 x := l.Args[0]
21639 if !(l.Uses == 1) {
21640 break
21641 }
21642 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags)
21643 v0.AuxInt = int32ToAuxInt(c)
21644 v0.AddArg(x)
21645 b.resetWithControl(BlockARMNE, v0)
21646 return true
21647 }
21648
21649
21650
21651 for b.Controls[0].Op == OpARMCMPconst {
21652 v_0 := b.Controls[0]
21653 if auxIntToInt32(v_0.AuxInt) != 0 {
21654 break
21655 }
21656 l := v_0.Args[0]
21657 if l.Op != OpARMXORshiftLL {
21658 break
21659 }
21660 c := auxIntToInt32(l.AuxInt)
21661 y := l.Args[1]
21662 x := l.Args[0]
21663 if !(l.Uses == 1) {
21664 break
21665 }
21666 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags)
21667 v0.AuxInt = int32ToAuxInt(c)
21668 v0.AddArg2(x, y)
21669 b.resetWithControl(BlockARMNE, v0)
21670 return true
21671 }
21672
21673
21674
21675 for b.Controls[0].Op == OpARMCMPconst {
21676 v_0 := b.Controls[0]
21677 if auxIntToInt32(v_0.AuxInt) != 0 {
21678 break
21679 }
21680 l := v_0.Args[0]
21681 if l.Op != OpARMXORshiftRL {
21682 break
21683 }
21684 c := auxIntToInt32(l.AuxInt)
21685 y := l.Args[1]
21686 x := l.Args[0]
21687 if !(l.Uses == 1) {
21688 break
21689 }
21690 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags)
21691 v0.AuxInt = int32ToAuxInt(c)
21692 v0.AddArg2(x, y)
21693 b.resetWithControl(BlockARMNE, v0)
21694 return true
21695 }
21696
21697
21698
21699 for b.Controls[0].Op == OpARMCMPconst {
21700 v_0 := b.Controls[0]
21701 if auxIntToInt32(v_0.AuxInt) != 0 {
21702 break
21703 }
21704 l := v_0.Args[0]
21705 if l.Op != OpARMXORshiftRA {
21706 break
21707 }
21708 c := auxIntToInt32(l.AuxInt)
21709 y := l.Args[1]
21710 x := l.Args[0]
21711 if !(l.Uses == 1) {
21712 break
21713 }
21714 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags)
21715 v0.AuxInt = int32ToAuxInt(c)
21716 v0.AddArg2(x, y)
21717 b.resetWithControl(BlockARMNE, v0)
21718 return true
21719 }
21720
21721
21722
21723 for b.Controls[0].Op == OpARMCMPconst {
21724 v_0 := b.Controls[0]
21725 if auxIntToInt32(v_0.AuxInt) != 0 {
21726 break
21727 }
21728 l := v_0.Args[0]
21729 if l.Op != OpARMXORshiftLLreg {
21730 break
21731 }
21732 z := l.Args[2]
21733 x := l.Args[0]
21734 y := l.Args[1]
21735 if !(l.Uses == 1) {
21736 break
21737 }
21738 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags)
21739 v0.AddArg3(x, y, z)
21740 b.resetWithControl(BlockARMNE, v0)
21741 return true
21742 }
21743
21744
21745
21746 for b.Controls[0].Op == OpARMCMPconst {
21747 v_0 := b.Controls[0]
21748 if auxIntToInt32(v_0.AuxInt) != 0 {
21749 break
21750 }
21751 l := v_0.Args[0]
21752 if l.Op != OpARMXORshiftRLreg {
21753 break
21754 }
21755 z := l.Args[2]
21756 x := l.Args[0]
21757 y := l.Args[1]
21758 if !(l.Uses == 1) {
21759 break
21760 }
21761 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags)
21762 v0.AddArg3(x, y, z)
21763 b.resetWithControl(BlockARMNE, v0)
21764 return true
21765 }
21766
21767
21768
21769 for b.Controls[0].Op == OpARMCMPconst {
21770 v_0 := b.Controls[0]
21771 if auxIntToInt32(v_0.AuxInt) != 0 {
21772 break
21773 }
21774 l := v_0.Args[0]
21775 if l.Op != OpARMXORshiftRAreg {
21776 break
21777 }
21778 z := l.Args[2]
21779 x := l.Args[0]
21780 y := l.Args[1]
21781 if !(l.Uses == 1) {
21782 break
21783 }
21784 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags)
21785 v0.AddArg3(x, y, z)
21786 b.resetWithControl(BlockARMNE, v0)
21787 return true
21788 }
21789 case BlockARMUGE:
21790
21791
21792
21793 for b.Controls[0].Op == OpARMFlagConstant {
21794 v_0 := b.Controls[0]
21795 fc := auxIntToFlagConstant(v_0.AuxInt)
21796 if !(fc.uge()) {
21797 break
21798 }
21799 b.Reset(BlockFirst)
21800 return true
21801 }
21802
21803
21804
21805 for b.Controls[0].Op == OpARMFlagConstant {
21806 v_0 := b.Controls[0]
21807 fc := auxIntToFlagConstant(v_0.AuxInt)
21808 if !(!fc.uge()) {
21809 break
21810 }
21811 b.Reset(BlockFirst)
21812 b.swapSuccessors()
21813 return true
21814 }
21815
21816
21817 for b.Controls[0].Op == OpARMInvertFlags {
21818 v_0 := b.Controls[0]
21819 cmp := v_0.Args[0]
21820 b.resetWithControl(BlockARMULE, cmp)
21821 return true
21822 }
21823 case BlockARMUGT:
21824
21825
21826
21827 for b.Controls[0].Op == OpARMFlagConstant {
21828 v_0 := b.Controls[0]
21829 fc := auxIntToFlagConstant(v_0.AuxInt)
21830 if !(fc.ugt()) {
21831 break
21832 }
21833 b.Reset(BlockFirst)
21834 return true
21835 }
21836
21837
21838
21839 for b.Controls[0].Op == OpARMFlagConstant {
21840 v_0 := b.Controls[0]
21841 fc := auxIntToFlagConstant(v_0.AuxInt)
21842 if !(!fc.ugt()) {
21843 break
21844 }
21845 b.Reset(BlockFirst)
21846 b.swapSuccessors()
21847 return true
21848 }
21849
21850
21851 for b.Controls[0].Op == OpARMInvertFlags {
21852 v_0 := b.Controls[0]
21853 cmp := v_0.Args[0]
21854 b.resetWithControl(BlockARMULT, cmp)
21855 return true
21856 }
21857 case BlockARMULE:
21858
21859
21860
21861 for b.Controls[0].Op == OpARMFlagConstant {
21862 v_0 := b.Controls[0]
21863 fc := auxIntToFlagConstant(v_0.AuxInt)
21864 if !(fc.ule()) {
21865 break
21866 }
21867 b.Reset(BlockFirst)
21868 return true
21869 }
21870
21871
21872
21873 for b.Controls[0].Op == OpARMFlagConstant {
21874 v_0 := b.Controls[0]
21875 fc := auxIntToFlagConstant(v_0.AuxInt)
21876 if !(!fc.ule()) {
21877 break
21878 }
21879 b.Reset(BlockFirst)
21880 b.swapSuccessors()
21881 return true
21882 }
21883
21884
21885 for b.Controls[0].Op == OpARMInvertFlags {
21886 v_0 := b.Controls[0]
21887 cmp := v_0.Args[0]
21888 b.resetWithControl(BlockARMUGE, cmp)
21889 return true
21890 }
21891 case BlockARMULT:
21892
21893
21894
21895 for b.Controls[0].Op == OpARMFlagConstant {
21896 v_0 := b.Controls[0]
21897 fc := auxIntToFlagConstant(v_0.AuxInt)
21898 if !(fc.ult()) {
21899 break
21900 }
21901 b.Reset(BlockFirst)
21902 return true
21903 }
21904
21905
21906
21907 for b.Controls[0].Op == OpARMFlagConstant {
21908 v_0 := b.Controls[0]
21909 fc := auxIntToFlagConstant(v_0.AuxInt)
21910 if !(!fc.ult()) {
21911 break
21912 }
21913 b.Reset(BlockFirst)
21914 b.swapSuccessors()
21915 return true
21916 }
21917
21918
21919 for b.Controls[0].Op == OpARMInvertFlags {
21920 v_0 := b.Controls[0]
21921 cmp := v_0.Args[0]
21922 b.resetWithControl(BlockARMUGT, cmp)
21923 return true
21924 }
21925 }
21926 return false
21927 }
21928
View as plain text