From 31b66c077a35f8c058c0cdd433982962acacb5ec Mon Sep 17 00:00:00 2001 From: Robbin Ehn Date: Thu, 11 Apr 2024 18:35:33 +0200 Subject: [PATCH] auipc + 12b check --- src/hotspot/cpu/riscv/macroAssembler_riscv.cpp | 2 +- src/hotspot/cpu/riscv/macroAssembler_riscv.hpp | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp index 0dfd37c13a5f6..15fb841f4e5cc 100644 --- a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp @@ -729,7 +729,7 @@ void MacroAssembler::la(Register Rd, const address addr) { void MacroAssembler::la(Register Rd, const address addr, int32_t &offset) { int64_t distance = addr - pc(); - if (is_simm32(distance)) { + if (in_range_auipc_12bit(distance)) { auipc(Rd, (int32_t)distance + 0x800); offset = ((int32_t)distance << 20) >> 20; } else { diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp index 8f9c86a92f1bc..bd31ec6a60f67 100644 --- a/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp +++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp @@ -690,6 +690,12 @@ class MacroAssembler: public Assembler { int pop_v(unsigned int bitset, Register stack); #endif // COMPILER2 + bool in_range_auipc_12bit(int64_t x) { + int64_t twoG = (2 * G); + int64_t twoK = (2 * K); + return x <= (twoG - twoK) && x >= (-twoG + twoK); + } + public: void push_reg(Register Rs); void pop_reg(Register Rd); @@ -844,7 +850,7 @@ class MacroAssembler: public Assembler { void NAME(Register Rd, address dest) { \ assert_cond(dest != nullptr); \ int64_t distance = dest - pc(); \ - if (is_simm32(distance)) { \ + if (in_range_auipc_12bit(distance)) { \ auipc(Rd, (int32_t)distance + 0x800); \ Assembler::NAME(Rd, Rd, ((int32_t)distance << 20) >> 20); \ } else { \ @@ -901,7 +907,7 @@ class MacroAssembler: public Assembler { void NAME(FloatRegister Rd, address dest, Register temp = t0) { \ assert_cond(dest != nullptr); \ int64_t distance = dest - pc(); \ - if (is_simm32(distance)) { \ + if (in_range_auipc_12bit(distance)) { \ auipc(temp, (int32_t)distance + 0x800); \ Assembler::NAME(Rd, temp, ((int32_t)distance << 20) >> 20); \ } else { \ @@ -962,7 +968,7 @@ class MacroAssembler: public Assembler { assert_cond(dest != nullptr); \ assert_different_registers(Rs, temp); \ int64_t distance = dest - pc(); \ - if (is_simm32(distance)) { \ + if (in_range_auipc_12bit(distance)) { \ auipc(temp, (int32_t)distance + 0x800); \ Assembler::NAME(Rs, temp, ((int32_t)distance << 20) >> 20); \ } else { \ @@ -1007,7 +1013,7 @@ class MacroAssembler: public Assembler { void NAME(FloatRegister Rs, address dest, Register temp = t0) { \ assert_cond(dest != nullptr); \ int64_t distance = dest - pc(); \ - if (is_simm32(distance)) { \ + if (in_range_auipc_12bit(distance)) { \ auipc(temp, (int32_t)distance + 0x800); \ Assembler::NAME(Rs, temp, ((int32_t)distance << 20) >> 20); \ } else { \