On Tue, Aug 25, 2015 at 5:50 PM, Andrew Pinski <pins...@gmail.com> wrote:
> On Tue, Aug 25, 2015 at 5:37 PM, Andre Vieira
> <andre.simoesdiasvie...@arm.com> wrote:
>> Conditional branches have a maximum range of [-1048576, 1048572]. Any
>> destination further away can not be reached by these.
>> To be able to have conditional branches in very large functions, we invert
>> the condition and change the destination to jump over an unconditional
>> branch to the original, far away, destination.
>>
>> gcc/ChangeLog:
>> 2015-08-07  Ramana Radhakrishnan  <ramana.radhakrish...@arm.com>
>>             Andre Vieira  <andre.simoesdiasvie...@arm.com>
>>
>>         * config/aarch64/aarch64.md (*condjump): Handle functions > 1
>>         Mib.
>>         (*cb<optab><mode>1): Idem.
>>         (*tb<optab><mode>1): Idem.
>>         (*cb<optab><mode>1): Idem.
>>         * config/aarch64/iterators.md (inv_cb): New code attribute.
>>         (inv_tb): Idem.
>>         * config/aarch64/aarch64.c (aarch64_gen_far_branch): New.
>>         * config/aarch64/aarch64-protos.h (aarch64_gen_far_branch): New.
>>
>> gcc/testsuite/ChangeLog:
>> 2015-08-07  Andre Vieira  <andre.simoesdiasvie...@arm.com>
>>
>>         * gcc.target/aarch64/long-branch.c: New test.
>
> Just a few comments about the testcase.  You could improve the size
> (on disk) of the testcase by using the preprocessor some more:
> Something like:
> #define CASE_ENTRY2 (x) CASE_ENTRY ((x)) CASE_ENTRY ((x)+1)
> #define CASE_ENTRY4 (x) CASE_ENTRY2 ((x)) CASE_ENTRY2 ((x)+2+1)
> #define CASE_ENTRY8 (x) CASE_ENTRY4 ((x)) CASE_ENTRY4 ((x)+4+1)
> #define CASE_ENTRY16 (x) CASE_ENTRY8 ((x)) CASE_ENTRY8 ((x)+8+1)
> #define CASE_ENTRY32 (x) CASE_ENTRY16 ((x)) CASE_ENTRY16 ((x)+16)
> #define CASE_ENTRY64 (x) CASE_ENTRY32 ((x)) CASE_ENTRY32 ((x)+32+1)
> #define CASE_ENTRY128 (x) CASE_ENTRY64 ((x)) CASE_ENTRY16 ((x)+64+1)
> #define CASE_ENTRY256 (x) CASE_ENTRY128 ((x)) CASE_ENTRY128 ((x)+128+1)


I do have an off by one error but you should get the idea.  Basically
instead of 200 lines, we only have 9 lines (log2(256) == 8).

Thanks,
Andrew

>
> And then use
> CASE_ENTRY256 (1)
>
> You can do the same trick to reduce the size of CASE_ENTRY too.
>
> Thanks,
> Andrew Pinski

Reply via email to