|
270 | 270 |
|
271 | 271 | // We need to fold MOVaddr into the LD/MOVDstore ops so that the live variable analysis
|
272 | 272 | // knows what variables are being read/written by the ops.
|
273 |
| -(MOVBUload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => |
274 |
| - (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} base mem) |
275 |
| -(MOVBload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => |
276 |
| - (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) |
277 |
| -(MOVHUload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => |
278 |
| - (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} base mem) |
279 |
| -(MOVHload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => |
280 |
| - (MOVHload [off1+off2] {mergeSym(sym1,sym2)} base mem) |
281 |
| -(MOVWUload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => |
282 |
| - (MOVWUload [off1+off2] {mergeSym(sym1,sym2)} base mem) |
283 |
| -(MOVWload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => |
284 |
| - (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) |
285 |
| -(MOVDload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => |
286 |
| - (MOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) |
287 |
| - |
288 |
| -(MOVBstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => |
289 |
| - (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) |
290 |
| -(MOVHstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => |
291 |
| - (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) |
292 |
| -(MOVWstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => |
293 |
| - (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) |
294 |
| -(MOVDstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => |
295 |
| - (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) |
296 |
| -(MOVBstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => |
297 |
| - (MOVBstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) |
298 |
| -(MOVHstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => |
299 |
| - (MOVHstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) |
300 |
| -(MOVWstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => |
301 |
| - (MOVWstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) |
302 |
| -(MOVDstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => |
303 |
| - (MOVDstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) |
304 |
| - |
305 |
| -(MOVBUload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) => |
306 |
| - (MOVBUload [off1+int32(off2)] {sym} base mem) |
307 |
| -(MOVBload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) => |
308 |
| - (MOVBload [off1+int32(off2)] {sym} base mem) |
309 |
| -(MOVHUload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) => |
310 |
| - (MOVHUload [off1+int32(off2)] {sym} base mem) |
311 |
| -(MOVHload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) => |
312 |
| - (MOVHload [off1+int32(off2)] {sym} base mem) |
313 |
| -(MOVWUload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) => |
314 |
| - (MOVWUload [off1+int32(off2)] {sym} base mem) |
315 |
| -(MOVWload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) => |
316 |
| - (MOVWload [off1+int32(off2)] {sym} base mem) |
317 |
| -(MOVDload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) => |
318 |
| - (MOVDload [off1+int32(off2)] {sym} base mem) |
319 |
| - |
320 |
| -(MOVBstore [off1] {sym} (ADDI [off2] base) val mem) && is32Bit(int64(off1)+off2) => |
321 |
| - (MOVBstore [off1+int32(off2)] {sym} base val mem) |
322 |
| -(MOVHstore [off1] {sym} (ADDI [off2] base) val mem) && is32Bit(int64(off1)+off2) => |
323 |
| - (MOVHstore [off1+int32(off2)] {sym} base val mem) |
324 |
| -(MOVWstore [off1] {sym} (ADDI [off2] base) val mem) && is32Bit(int64(off1)+off2) => |
325 |
| - (MOVWstore [off1+int32(off2)] {sym} base val mem) |
326 |
| -(MOVDstore [off1] {sym} (ADDI [off2] base) val mem) && is32Bit(int64(off1)+off2) => |
327 |
| - (MOVDstore [off1+int32(off2)] {sym} base val mem) |
328 |
| -(MOVBstorezero [off1] {sym} (ADDI [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVBstorezero [off1+int32(off2)] {sym} ptr mem) |
329 |
| -(MOVHstorezero [off1] {sym} (ADDI [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVHstorezero [off1+int32(off2)] {sym} ptr mem) |
330 |
| -(MOVWstorezero [off1] {sym} (ADDI [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVWstorezero [off1+int32(off2)] {sym} ptr mem) |
331 |
| -(MOVDstorezero [off1] {sym} (ADDI [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVDstorezero [off1+int32(off2)] {sym} ptr mem) |
| 273 | +(MOV(B|BU|H|HU|W|WU|D)load [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && |
| 274 | + is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && |
| 275 | + (base.Op != OpSB || !config.ctxt.Flag_dynlink) => |
| 276 | + (MOV(B|BU|H|HU|W|WU|D)load [off1+off2] {mergeSym(sym1,sym2)} base mem) |
| 277 | + |
| 278 | +(MOV(B|H|W|D)store [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem) && |
| 279 | + is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && |
| 280 | + (base.Op != OpSB || !config.ctxt.Flag_dynlink) => |
| 281 | + (MOV(B|H|W|D)store [off1+off2] {mergeSym(sym1,sym2)} base val mem) |
| 282 | + |
| 283 | +(MOV(B|H|W|D)storezero [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && |
| 284 | + canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) && |
| 285 | + (base.Op != OpSB || !config.ctxt.Flag_dynlink) => |
| 286 | + (MOV(B|H|W|D)storezero [off1+off2] {mergeSym(sym1,sym2)} base mem) |
| 287 | + |
| 288 | +(MOV(B|BU|H|HU|W|WU|D)load [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) => |
| 289 | + (MOV(B|BU|H|HU|W|WU|D)load [off1+int32(off2)] {sym} base mem) |
| 290 | + |
| 291 | +(MOV(B|H|W|D)store [off1] {sym} (ADDI [off2] base) val mem) && is32Bit(int64(off1)+off2) => |
| 292 | + (MOV(B|H|W|D)store [off1+int32(off2)] {sym} base val mem) |
| 293 | + |
| 294 | +(MOV(B|H|W|D)storezero [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) => |
| 295 | + (MOV(B|H|W|D)storezero [off1+int32(off2)] {sym} base mem) |
332 | 296 |
|
333 | 297 | // Similarly, fold ADDI into MOVaddr to avoid confusing live variable analysis
|
334 | 298 | // with OffPtr -> ADDI.
|
|
0 commit comments