Instead of always emitting movabs, emit a regular mov or a xor. Slims down sequences like: movabs $0,%rax mov %rsi,%rax To: xor %eax,%eax // also zeroes upper word mov %rsi,%rax Future work is to just emit: xor %esi,%esi
Unified · Split
| @@ -489,8 +489,15 @@ void load(int r, SValue *sv) · 488 unmodified lines | ||
| 489 | 489 | } |
| 490 | 490 | #endif |
| 491 | 491 | } else if (is64_type(ft)) { |
| 492 | − orex(1,r,0, 0xb8 + REG_VALUE(r)); /* mov $xx, r */ | |
| 493 | − gen_le64(sv->c.i); | |
| 492 | + if (sv->c.i > UINT32_MAX) { | |
| 493 | + orex(1,r,0, 0xb8 + REG_VALUE(r)); /* movabs $xx, r */ | |
| 494 | + gen_le64(sv->c.i); | |
| 495 | + } else if (sv->c.i > 0) { | |
| 496 | + orex(0,r,0, 0xb8 + REG_VALUE(r)); /* mov $xx, r */ | |
| 497 | + gen_le32(sv->c.i); | |
| 498 | + } else { | |
| 499 | + o(0xc031 + REG_VALUE(r) * 0x900); /* xor r, r */ | |
| 500 | + } | |
| 494 | 501 | } else { |
| 495 | 502 | orex(0,r,0, 0xb8 + REG_VALUE(r)); /* mov $xx, r */ |
| 496 | 503 | gen_le32(fc); |