diff --git a/riscv64-gen.c b/riscv64-gen.c index b728d59e..490eca79 100644 --- a/riscv64-gen.c +++ b/riscv64-gen.c @@ -1382,12 +1382,24 @@ ST_FUNC void ggoto(void) ST_FUNC void gen_vla_sp_save(int addr) { - ES(0x23, 3, 8, 2, addr); // sd sp, fc(s0) + if (((unsigned)addr + (1 << 11)) >> 12) { + o(0x37 | (5 << 7) | ((0x800 + addr) & 0xfffff000)); //lui t0,upper(addr) + ER(0x33, 0, 5, 5, 8, 0); // add t0, t0, s0 + ES(0x23, 3, 5, 2, (int)addr << 20 >> 20); // sd sp, fc(t0) + } + else + ES(0x23, 3, 8, 2, addr); // sd sp, fc(s0) } ST_FUNC void gen_vla_sp_restore(int addr) { - EI(0x03, 3, 2, 8, addr); // ld sp, fc(s0) + if (((unsigned)addr + (1 << 11)) >> 12) { + o(0x37 | (5 << 7) | ((0x800 + addr) & 0xfffff000)); //lui t0,upper(addr) + ER(0x33, 0, 5, 5, 8, 0); // add t0, t0, s0 + EI(0x03, 3, 2, 5, (int)addr << 20 >> 20); // ld sp, fc(t0) + } + else + EI(0x03, 3, 2, 8, addr); // ld sp, fc(s0) } ST_FUNC void gen_vla_alloc(CType *type, int align) diff --git a/tests/Makefile b/tests/Makefile index fa97c74a..e850b958 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -32,9 +32,6 @@ endif ifeq ($(CONFIG_dll),no) TESTS := $(filter-out dlltest, $(TESTS)) endif -ifeq (,$(filter arm64 i386 x86_64,$(ARCH))) - TESTS := $(filter-out vla_test-run,$(TESTS)) -endif ifeq (-$(CONFIG_arm_eabi)-$(CONFIG_arm_vfp)-,-yes--) TESTS := $(filter-out test3 test1b,$(TESTS)) endif