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 | #endif | 490 | #endif |
| 491 | } else if (is64_type(ft)) { | 491 | } else if (is64_type(ft)) { |
| 492 | orex(1,r,0, 0xb8 + REG_VALUE(r)); /* mov $xx, r */ | 492 | if (sv->c.i > UINT32_MAX) { |
| 493 | gen_le64(sv->c.i); | 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 | } else { | 501 | } else { |
| 495 | orex(0,r,0, 0xb8 + REG_VALUE(r)); /* mov $xx, r */ | 502 | orex(0,r,0, 0xb8 + REG_VALUE(r)); /* mov $xx, r */ |
| 496 | gen_le32(fc); | 503 | gen_le32(fc); |