From c21576f8a32715ab439690d18184b0e02022bbbd Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Thu, 10 Oct 2024 22:46:14 +0200 Subject: [PATCH] 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 --- x86_64-gen.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/x86_64-gen.c b/x86_64-gen.c index 4f46efc9..e1ed7199 100644 --- a/x86_64-gen.c +++ b/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);