8294492: RISC-V: Use li instead of patchable movptr at non-patchable callsites

Reviewed-by: fyang
This commit is contained in:
Xiaolin Zheng 2022-09-29 07:21:07 +00:00 committed by Fei Yang
parent 8491fd5c12
commit 1decdcee71
8 changed files with 51 additions and 82 deletions

View file

@ -527,12 +527,18 @@ public:
}
// mv
void mv(Register Rd, address addr) { li(Rd, (int64_t)addr); }
void mv(Register Rd, address addr) { li(Rd, (int64_t)addr); }
void mv(Register Rd, address addr, int32_t &offset) {
// Split address into a lower 12-bit sign-extended offset and the remainder,
// so that the offset could be encoded in jalr or load/store instruction.
offset = ((int32_t)(int64_t)addr << 20) >> 20;
li(Rd, (int64_t)addr - offset);
}
template<typename T, ENABLE_IF(std::is_integral<T>::value)>
inline void mv(Register Rd, T o) { li(Rd, (int64_t)o); }
inline void mv(Register Rd, T o) { li(Rd, (int64_t)o); }
inline void mvw(Register Rd, int32_t imm32) { mv(Rd, imm32); }
inline void mvw(Register Rd, int32_t imm32) { mv(Rd, imm32); }
void mv(Register Rd, Address dest);
void mv(Register Rd, RegisterOrConstant src);
@ -890,6 +896,18 @@ public:
void rt_call(address dest, Register tmp = t0);
void call(const address dest, Register temp = t0) {
assert_cond(dest != NULL);
assert(temp != noreg, "temp must not be empty register!");
int32_t offset = 0;
mv(temp, dest, offset);
jalr(x1, temp, offset);
}
void ret() {
jalr(x0, x1, 0);
}
private:
#ifdef ASSERT