Table of Contents

1. RISCV CALL OPTIMIZE

1.1. FAR CALL

# RANGE: PC +-2GiB
# NEED 8 BYTES
auipc x1, offset[31:12]
jalr x1, x1, offset[11:0]

OR

# RANGE: 0GiB ~ 4GiB
# NEED 8 BYTES
lui x1, offset[31:12]
jalr x1, x1, offset[11:0]

1.2. NEARBY CALL

# RANGE: PC +-1MiB
# NEED 4 BYTES
jal x1, offset

1.3. REGISTER RELATED CALL

# RANGE: REG +-2KiB
# NEED 4 BYTES
jalr x1, reg, offset

WE CAN PUT FORTH CORE WORD ON 0X000~0X800, USE JALR X1, OFFSET(X0) CALL IT.

WE CAN USE A LOT OF GLOBAL POINTER REGISTERS TO OPTIMIZE FAR CALL INTO REGISTER RELATED CALL

BUT GNU GAS IS NOT SUPPORT THIS ACTION, WE MUST WRITE OWN ASSEMBLER

1.4. COMPRESSED NEARLY CALL

# RANGE: PC +-2KiB
# NEED 2 BYTES
c.jal (offset << 1)

1.5. COMPRESSED REGISTER RELATED CALL

# RANGE: REG +-0
# NEED 2 BYTES
c.jalr reg

SAME WITH: 'JALR x1, reg, 0'

Created: 2026-03-17 Tue 23:02

Validate