On 11/27/18 1:10 PM, Alistair Francis wrote:
> + if (short_jmp) {
> + reloc_sbimm12(code_ptr, (tcg_insn_unit *)value);
> + } else {
> + /* Invert the condition */
> + insn = insn ^ (1 << 12);
> + /* Clear the offset */
> + insn &= 0xFFF;
> + /* Set the offset to the PC + 8 */
> + insn |= ((unsigned int)(code_ptr + 8)) << 12;
This isn't a pc-relative value you're storing.
reloc_sbimm12(code_ptr, code_ptr + 2);
> + /* Overwrite the NOP with jal x0,value */
> + insn = encode_uj(OPC_JAL, TCG_REG_ZERO, value);
This isn't pc-relative either. Perhaps best as
code_ptr[1] = encode_uj(OPC_JAL, TCG_REG_ZERO, 0);
reloc_jimm20(code_ptr + 1, (tcg_insn_unit *)value);
r~