This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
handling of long conditional branches
- From: <chandrakumar at chandrakumar dot in>
- To: <gcc-help at gcc dot gnu dot org>
- Date: Fri, 18 Jun 2010 06:21:12 -0400
- Subject: handling of long conditional branches
Hi,
I am working with gcc-2.95.3 ported to a RISC architecture.
I did a modification in the port to insert 'nop' instruction. This is done
to fix a defect. When I built the compiler (with this fix) and used it to
build the glibc I got the assembler error "Relocation overflow".
On analysis it is found that the RISC architecture has conditional
branches that can address destinations with a depth of 4000 bytes. This
limitation is not considered while doing the port.
After the fix I did, some conditional branches addressed destination that
were beyond the 4000 bytes breaking the limitation.
Now I want to fix this case as follows:
1. Conditionally branch to the maximum depth it (a conditional branch) can
address (i.e. branch to a temporary place within the allowed range)
2. Then jump from there to the actual destination.
For example, fix the following case:
0000 bge r0, r1, __LABEL__
0004 ...
0008 ...
0012 ...
0016 ...
..
..
7000 ...
7004 __LABEL__: add r3, r4, r5
7008 sub r6, r4, r2
to as shown below:
0000 bge r0, r1, __TMP_LABEL__
0004 ...
0008 ...
0012 ...
0016 ...
..
..
4000 ...
4004 __TMP_LABEL__: jmp __LABEL__
..
..
7000 ...
7004 __LABEL__: add r3, r4, r5
7008 sub r6, r4, r2
I checked some reference ports regarding this only to find that the short
conditional branches are converted to long branches as follows:
-- cut ---
sprintf (asmtext, \"b%sz %%2,1f\;bra %%l0\;1:\", br);
-- cut --
gcc-2.95.3/gcc/config/m32r/m32r.md
Could someone help me to find out a reference/reference-port that I can
refer to provide the fix as I have shown above.
Thank you,
Chandra Kumar R.