Hi all,
I'm trying to implement PC Relative addressing for toolchain (GCC, LLVM).
MIPS Release6 had introduced pcrel instructions (e.g. auipc) that made
PC relative addressing for local data possible. It can help us reduce GOT
overhead and implement position independent kernel easier.
Just as RISC-V, MIPS R6 can load address by a pair of %pcrel_hi and
%pcrel_lo
modifier. However, the usage is slightly different.
For RISC-V, %pcrel_lo shall point to the label of corresponding
%pcrel_hi, like
.LA0:
auipc a0, %pcrel_hi(sym)
addi a0, a0, %pcrel_lo(.LA0)
However, for MIPS %pcrel_lo simply calculate LO16 of the symbol to current
PC, thus PC relative addressing will look like:
.LA0:
auipc a0, %pcrel_hi(sym)
.LA1:
addi a0, %pcrel_lo(sym + (.LA1 - .LA0))
I found it's very difficult for GCC to generate this kind of pcrel_lo
expression,
RTX label_ref can't be lower into such LOW_SUM expression.
Could you please give me some hints about how to implement it?
If it looks infeasible for GCC side, another option would be adding
RISC-V style
%pcrel_{hi,lo} modifier at assembler side. We can add another pair of
modifier
like %pcrel_paired_{hi,lo} to implement the behavior. Would it be a good
idea?
Thanks.
-Jiaxun