4.1 ld and the H8/300

For the H8/300, ld can perform these global optimizations when you specify the ‘ --relax ’ command-line option.

relaxing address modes
ld finds all jsr and jmp instructions whose targets are within eight bits, and turns them into eight-bit program-counter relative bsr and bra instructions, respectively.


synthesizing instructions
ld finds all mov.b instructions which use the sixteen-bit absolute address form, but refer to the top page of memory, and changes them to use the eight-bit address form. (That is: the linker turns ‘ mov.b @ aa :16 ’ into ‘ mov.b @ aa :8 ’ whenever the address aa is in the top page of memory).

ld finds all mov instructions which use the register indirect with 32-bit displacement addressing mode, but use a small displacement inside 16-bit displacement range, and changes them to use the 16-bit displacement form. (That is: the linker turns ‘ mov.b @ d :32,ERx ’ into ‘ mov.b @ d :16,ERx ’ whenever the displacement d is in the 16 bit signed integer range. Only implemented in ELF-format ld).

bit manipulation instructions
ld finds all bit manipulation instructions like band, bclr, biand, bild, bior, bist, bixor, bld, bnot, bor, bset, bst, btst, bxor which use 32 bit and 16 bit absolute address form, but refer to the top page of memory, and changes them to use the 8 bit address form. (That is: the linker turns ‘ bset #xx:3, @ aa :32 ’ into ‘ bset #xx:3, @ aa :8 ’ whenever the address aa is in the top page of memory).
system control instructions
ld finds all ldc.w, stc.w instructions which use the 32 bit absolute address form, but refer to the top page of memory, and changes them to use 16 bit address form. (That is: the linker turns ‘ ldc.w @ aa :32,ccr ’ into ‘ ldc.w @ aa :16,ccr ’ whenever the address aa is in the top page of memory).