From 1706d2254b168309b2c38985750b6d00ad254ef3 Mon Sep 17 00:00:00 2001 From: Edmund Grimley Evans Date: Mon, 2 Mar 2015 20:51:03 +0000 Subject: [PATCH] arm64-gen.c: Improve generation of stack offsets. --- arm64-gen.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/arm64-gen.c b/arm64-gen.c index 630556d..5444f29 100644 --- a/arm64-gen.c +++ b/arm64-gen.c @@ -274,8 +274,16 @@ static int arm64_type_size(int t) static void arm64_spoff(int reg, uint64_t off) { - arm64_movimm(30, off); // use x30 for offset - o(0x8b3e63e0 | reg); // add x(reg),sp,x30 + uint32_t sub = off >> 63; + if (sub) + off = -off; + if (off < 4096) + o(0x910003e0 | sub << 30 | reg | off << 10); + // (add|sub) x(reg),sp,#(off) + else { + arm64_movimm(30, off); // use x30 for offset + o(0x8b3e63e0 | sub << 30 | reg); // (add|sub) x(reg),sp,x30 + } } static void arm64_ldrx(int sg, int sz, int dst, int bas, uint64_t off)