mirror of
https://github.com/TinyCC/tinycc.git
synced 2025-11-16 12:34:45 +00:00
Emit better x86_64 asm for constant loads
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
This commit is contained in:
11
x86_64-gen.c
11
x86_64-gen.c
@@ -489,8 +489,15 @@ void load(int r, SValue *sv)
|
||||
}
|
||||
#endif
|
||||
} else if (is64_type(ft)) {
|
||||
orex(1,r,0, 0xb8 + REG_VALUE(r)); /* mov $xx, r */
|
||||
gen_le64(sv->c.i);
|
||||
if (sv->c.i > UINT32_MAX) {
|
||||
orex(1,r,0, 0xb8 + REG_VALUE(r)); /* movabs $xx, r */
|
||||
gen_le64(sv->c.i);
|
||||
} else if (sv->c.i > 0) {
|
||||
orex(0,r,0, 0xb8 + REG_VALUE(r)); /* mov $xx, r */
|
||||
gen_le32(sv->c.i);
|
||||
} else {
|
||||
o(0xc031 + REG_VALUE(r) * 0x900); /* xor r, r */
|
||||
}
|
||||
} else {
|
||||
orex(0,r,0, 0xb8 + REG_VALUE(r)); /* mov $xx, r */
|
||||
gen_le32(fc);
|
||||
|
||||
Reference in New Issue
Block a user