From ecdee4a69704912f27318de89b9e448a97ee8ffd Mon Sep 17 00:00:00 2001 From: herman ten brugge Date: Tue, 12 Jan 2021 08:46:05 +0100 Subject: [PATCH] arm64: Fix loading from constant address --- arm64-gen.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/arm64-gen.c b/arm64-gen.c index feff7415..2854176b 100644 --- a/arm64-gen.c +++ b/arm64-gen.c @@ -497,8 +497,11 @@ ST_FUNC void load(int r, SValue *sv) } if (svr == (VT_CONST | VT_LVAL)) { - arm64_sym(30, sv->sym, // use x30 for address - arm64_check_offset(0, arm64_type_size(svtt), sv->c.i)); + if (sv->sym) + arm64_sym(30, sv->sym, // use x30 for address + arm64_check_offset(0, arm64_type_size(svtt), sv->c.i)); + else + arm64_movimm (30, sv->c.i); if (IS_FREG(r)) arm64_ldrv(arm64_type_size(svtt), fltr(r), 30, arm64_check_offset(1, arm64_type_size(svtt), sv->c.i)); @@ -612,8 +615,11 @@ ST_FUNC void store(int r, SValue *sv) } if (svr == (VT_CONST | VT_LVAL)) { - arm64_sym(30, sv->sym, // use x30 for address - arm64_check_offset(0, arm64_type_size(svtt), sv->c.i)); + if (sv->sym) + arm64_sym(30, sv->sym, // use x30 for address + arm64_check_offset(0, arm64_type_size(svtt), sv->c.i)); + else + arm64_movimm (30, sv->c.i); if (IS_FREG(r)) arm64_strv(arm64_type_size(svtt), fltr(r), 30, arm64_check_offset(1, arm64_type_size(svtt), sv->c.i));