266 Chapter 7
Position-Independent Code
Generating Position-Independent Code
LDIL L'target,%r1
BE R'target(%sr4,%r1)
For PIC, these two instructions must be transformed into four
instructions, similar to the long call sequence:
BL .+8,%r1 ; get pc into r1
ADDIL L'target-L,%r1 ; add pc-relative offset
L: LDO R'target-L,%r1 ; add pc-relative offset
BV,N 0(%r1) ; and branch
The only problem with this sequence occurs when the long branch is in a
switch table, where each switch table entry is restricted to two words. A
long branch within a switch table must allocate a linkage table entry and
make an indirect branch:
LDW T'target(%r19),%r1 ; load LT entry
BV,N 0(%r1) ; branch indirect
Here, the T' operator indicates a new fixup request supported by the
linker for linkage table entries.
Assigned GOTO Statements
ASSIGN statements in FORTRAN must be converted to a PC-relative
form. The existing sequence forms the absolute address in a register
before storing it in the variable:
LDIL L'target,tmp
LDO R'target(tmp),tmp
This must be transformed into the following four-instruction sequence:
BL .+8,tmp ; get rp into tmp
DEPI 0,31,2,tmp ; zero out low-order 2 bits
L: ADDIL L'target-L,tmp ; get pc-rel offset
LDO R'target-L(%r1),tmp
Literal References
References to literals in the text space are handled exactly like ASSIGN
statements (shown above). TheLDO instruction can be replaced with LDW
as appropriate.
An opportunity for optimization in both cases is to share a single label (L)
throughout a procedure, and let the result of BL become a common
sub-expression. Thus only the first literal reference within a procedure is
expanded to three instructions; the rest remain two instructions.