From d8b313e3fdd355071dbe2c33c7dc55010d2995ef Mon Sep 17 00:00:00 2001 From: losfair Date: Tue, 17 Sep 2019 00:49:21 +0800 Subject: [PATCH] Fix emit_lea. --- lib/singlepass-backend/src/translator_aarch64.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/singlepass-backend/src/translator_aarch64.rs b/lib/singlepass-backend/src/translator_aarch64.rs index 6d7d699e1..865129741 100644 --- a/lib/singlepass-backend/src/translator_aarch64.rs +++ b/lib/singlepass-backend/src/translator_aarch64.rs @@ -325,10 +325,18 @@ impl Emitter for Assembler { fn emit_lea(&mut self, sz: Size, src: Location, dst: Location) { match (sz, src, dst) { (Size::S32, Location::Memory(src, disp), Location::GPR(dst)) => { - dynasm!(self ; add W(map_gpr(dst).x()), W(map_gpr(src).x()), disp as u32); + if disp >= 0 { + dynasm!(self ; add W(map_gpr(dst).x()), W(map_gpr(src).x()), disp as u32); + } else { + dynasm!(self ; sub W(map_gpr(dst).x()), W(map_gpr(src).x()), (-disp) as u32); + } } (Size::S64, Location::Memory(src, disp), Location::GPR(dst)) => { - dynasm!(self ; add X(map_gpr(dst).x()), X(map_gpr(src).x()), disp as u32); + if disp >= 0 { + dynasm!(self ; add X(map_gpr(dst).x()), X(map_gpr(src).x()), disp as u32); + } else { + dynasm!(self ; sub X(map_gpr(dst).x()), X(map_gpr(src).x()), (-disp) as u32); + } } _ => unreachable!(), }