diff options
Diffstat (limited to 'gnu')
-rw-r--r-- | gnu/gcc/gcc/config/sh/divcost-analysis | 76 | ||||
-rw-r--r-- | gnu/gcc/gcc/config/sh/divtab-sh4.c | 90 | ||||
-rw-r--r-- | gnu/gcc/gcc/config/sh/lib1funcs.asm | 633 | ||||
-rw-r--r-- | gnu/gcc/gcc/config/sh/sh.c | 53 | ||||
-rw-r--r-- | gnu/gcc/gcc/config/sh/sh.h | 17 | ||||
-rw-r--r-- | gnu/gcc/gcc/config/sh/sh.md | 29 | ||||
-rw-r--r-- | gnu/gcc/gcc/config/sh/sh.opt | 4 | ||||
-rw-r--r-- | gnu/gcc/gcc/config/sh/t-sh | 2 | ||||
-rw-r--r-- | gnu/usr.bin/cc/libgcc/Makefile | 5 |
9 files changed, 27 insertions, 882 deletions
diff --git a/gnu/gcc/gcc/config/sh/divcost-analysis b/gnu/gcc/gcc/config/sh/divcost-analysis deleted file mode 100644 index 541e31324b3..00000000000 --- a/gnu/gcc/gcc/config/sh/divcost-analysis +++ /dev/null @@ -1,76 +0,0 @@ -Analysis of cycle costs for SH4: - --> udiv_le128: 5 --> udiv_ge64k: 6 --> udiv udiv_25: 10 --> pos_divisor: 3 --> pos_result linear: 5 --> pos_result - -: 5 --> div_le128: 7 --> div_ge64k: 9 -sdivsi3 -> udiv_25 13 -udiv25 -> div_ge64k_end: 15 -div_ge64k_end -> rts: 13 -div_le128 -> div_le128_2: 2, r1 latency 3 -udiv_le128 -> div_le128_2: 2, r1 latency 3 -(u)div_le128 -> div_by_1: 9 -(u)div_le128 -> rts: 17 -div_by_1(_neg) -> rts: 4 -div_ge64k -> div_r8: 2 -div_ge64k -> div_ge64k_2: 3 -udiv_ge64k -> udiv_r8: 3 -udiv_ge64k -> div_ge64k_2: 3 + LS -(u)div_ge64k -> div_ge64k_end: 13 -div_r8 -> div_r8_2: 2 -udiv_r8 -> div_r8_2: 2 + LS -(u)div_r8 -> rts: 21 - --> - + neg_result: 5 --> + - neg_result: 5 --> div_le128_neg: 7 --> div_ge64k_neg: 9 --> div_r8_neg: 11 --> <64k div_ge64k_neg_end: 28 --> >=64k div_ge64k_neg_end: 22 -div_ge64k_neg_end ft -> rts: 14 -div_r8_neg_end -> rts: 4 -div_r8_neg -> div_r8_neg_end: 18 -div_le128_neg -> div_by_1_neg: 4 -div_le128_neg -> rts 18 - - absolute divisor range: - 1 [2..128] [129..64K) [64K..|divident|/256] >=64K,>|divident/256| -udiv 18 22 38 32 30 -sdiv pos: 20 24 41 35 32 -sdiv neg: 15 25 42 36 33 - - -fp-based: - -unsigned: 42 + 3 + 3 (lingering ftrc latency + sts fpul,rx) at caller's site -signed: 33 + 3 + 3 (lingering ftrc latency + sts fpul,rx) at caller's site - -call-div1: divisor range: - [1..64K) >= 64K -unsigned: 63 58 -signed: 76 76 - -SFUNC_STATIC call overhead: -mov.l 0f,r1 -bsrf r1 - -SFUNC_GOT call overhead - current: -mov.l 0f,r1 -mova 0f,r0 -mov.l 1f,r2 -add r1,r0 -mov.l @(r0,r2),r0 -jmp @r0 -; 3 cycles worse than SFUNC_STATIC - -SFUNC_GOT call overhead - improved assembler: -mov.l 0f,r1 -mova 0f,r0 -mov.l @(r0,r1),r0 -jmp @r0 -; 2 cycles worse than SFUNC_STATIC diff --git a/gnu/gcc/gcc/config/sh/divtab-sh4.c b/gnu/gcc/gcc/config/sh/divtab-sh4.c deleted file mode 100644 index 9877eda1fcc..00000000000 --- a/gnu/gcc/gcc/config/sh/divtab-sh4.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Copyright (C) 2004 Free Software Foundation, Inc. - -This file is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) any -later version. - -In addition to the permissions in the GNU General Public License, the -Free Software Foundation gives you unlimited permission to link the -compiled version of this file into combinations with other programs, -and to distribute those combinations without any restriction coming -from the use of this file. (The General Public License restrictions -do apply in other respects; for example, they cover modification of -the file, and distribution when not linked into a combine -executable.) - -This file is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; see the file COPYING. If not, write to -the Free Software Foundation, 51 Franklin Street, Fifth Floor, -Boston, MA 02110-1301, USA. */ - -/* Calculate division table for SH2..4 integer division - Contributed by Joern Rernnecke - joern.rennecke@superh.com */ - -#include <stdio.h> -#include <math.h> - -int -main () -{ - int i, j; - double q, r, err, max_err = 0, max_s_err = 0; - - puts("/* This table has been generated by divtab-sh4.c. */"); - puts ("\t.balign 4"); - puts ("LOCAL(div_table_clz):"); - /* output some dummy number for 1/0. */ - printf ("\t.byte\t%d\n", 0); - for (i = 1; i <= 128; i++) - { - int n = 0; - if (i == 128) - puts ("\ -/* Lookup table translating positive divisor to index into table of\n\ - normalized inverse. N.B. the '0' entry is also the last entry of the\n\ - previous table, and causes an unaligned access for division by zero. */\n\ -LOCAL(div_table_ix):"); - for (j = i; j <= 128; j += j) - n++; - printf ("\t.byte\t%d\n", n - 7); - } - for (i = 1; i <= 128; i++) - { - j = i < 0 ? -i : i; - while (j < 128) - j += j; - printf ("\t.byte\t%d\n", j * 2 - 96*4); - } - puts("\ -/* 1/64 .. 1/127, normalized. There is an implicit leading 1 in bit 32. */\n\ - .balign 4\n\ -LOCAL(zero_l):"); - for (i = 64; i < 128; i++) - { - if (i == 96) - puts ("LOCAL(div_table):"); - q = 4.*(1<<30)*128/i; - r = ceil (q); - /* The value for 64 is actually differently scaled that it would - appear from this calculation. The implicit part is %01, not 10. - Still, since the value in the table is 0 either way, this - doesn't matter here. Still, the 1/64 entry is effectively a 1/128 - entry. */ - printf ("\t.long\t0x%X\n", (unsigned) r); - err = r - q; - if (err > max_err) - max_err = err; - err = err * i / 128; - if (err > max_s_err) - max_s_err = err; - } - printf ("\t/* maximum error: %f scaled: %f*/\n", max_err, max_s_err); - exit (0); -} diff --git a/gnu/gcc/gcc/config/sh/lib1funcs.asm b/gnu/gcc/gcc/config/sh/lib1funcs.asm index 99f589fae7a..8d1acb9b338 100644 --- a/gnu/gcc/gcc/config/sh/lib1funcs.asm +++ b/gnu/gcc/gcc/config/sh/lib1funcs.asm @@ -1,5 +1,5 @@ /* Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, - 2004, 2005, 2006 + 2004, 2005 Free Software Foundation, Inc. This file is free software; you can redistribute it and/or modify it @@ -2986,8 +2986,8 @@ GLOBAL(GCC_pop_shmedia_regs_nofpu): #endif /* __SH5__ == 32 */ #endif /* L_push_pop_shmedia_regs */ -#ifdef L_div_table #if __SH5__ +#ifdef L_div_table #if defined(__pic__) && defined(__SHMEDIA__) .global GLOBAL(sdivsi3) FUNC(GLOBAL(sdivsi3)) @@ -3214,635 +3214,8 @@ GLOBAL(div_table): .word 17738 .word 17136 .word 16639 - -#elif defined (__SH3__) || defined (__SH3E__) || defined (__SH4__) || defined (__SH4_SINGLE__) || defined (__SH4_SINGLE_ONLY__) || defined (__SH4_NOFPU__) -/* This code used shld, thus is not suitable for SH1 / SH2. */ - -/* Signed / unsigned division without use of FPU, optimized for SH4. - Uses a lookup table for divisors in the range -128 .. +128, and - div1 with case distinction for larger divisors in three more ranges. - The code is lumped together with the table to allow the use of mova. */ -#ifdef __LITTLE_ENDIAN__ -#define L_LSB 0 -#define L_LSWMSB 1 -#define L_MSWLSB 2 -#else -#define L_LSB 3 -#define L_LSWMSB 2 -#define L_MSWLSB 1 -#endif - - .balign 4 - .global GLOBAL(udivsi3_i4i) - FUNC(GLOBAL(udivsi3_i4i)) -GLOBAL(udivsi3_i4i): - mov.w LOCAL(c128_w), r1 - div0u - mov r4,r0 - shlr8 r0 - cmp/hi r1,r5 - extu.w r5,r1 - bf LOCAL(udiv_le128) - cmp/eq r5,r1 - bf LOCAL(udiv_ge64k) - shlr r0 - mov r5,r1 - shll16 r5 - mov.l r4,@-r15 - div1 r5,r0 - mov.l r1,@-r15 - div1 r5,r0 - div1 r5,r0 - bra LOCAL(udiv_25) - div1 r5,r0 - -LOCAL(div_le128): - mova LOCAL(div_table_ix),r0 - bra LOCAL(div_le128_2) - mov.b @(r0,r5),r1 -LOCAL(udiv_le128): - mov.l r4,@-r15 - mova LOCAL(div_table_ix),r0 - mov.b @(r0,r5),r1 - mov.l r5,@-r15 -LOCAL(div_le128_2): - mova LOCAL(div_table_inv),r0 - mov.l @(r0,r1),r1 - mov r5,r0 - tst #0xfe,r0 - mova LOCAL(div_table_clz),r0 - dmulu.l r1,r4 - mov.b @(r0,r5),r1 - bt/s LOCAL(div_by_1) - mov r4,r0 - mov.l @r15+,r5 - sts mach,r0 - /* clrt */ - addc r4,r0 - mov.l @r15+,r4 - rotcr r0 - rts - shld r1,r0 - -LOCAL(div_by_1_neg): - neg r4,r0 -LOCAL(div_by_1): - mov.l @r15+,r5 - rts - mov.l @r15+,r4 - -LOCAL(div_ge64k): - bt/s LOCAL(div_r8) - div0u - shll8 r5 - bra LOCAL(div_ge64k_2) - div1 r5,r0 -LOCAL(udiv_ge64k): - cmp/hi r0,r5 - mov r5,r1 - bt LOCAL(udiv_r8) - shll8 r5 - mov.l r4,@-r15 - div1 r5,r0 - mov.l r1,@-r15 -LOCAL(div_ge64k_2): - div1 r5,r0 - mov.l LOCAL(zero_l),r1 - .rept 4 - div1 r5,r0 - .endr - mov.l r1,@-r15 - div1 r5,r0 - mov.w LOCAL(m256_w),r1 - div1 r5,r0 - mov.b r0,@(L_LSWMSB,r15) - xor r4,r0 - and r1,r0 - bra LOCAL(div_ge64k_end) - xor r4,r0 - -LOCAL(div_r8): - shll16 r4 - bra LOCAL(div_r8_2) - shll8 r4 -LOCAL(udiv_r8): - mov.l r4,@-r15 - shll16 r4 - clrt - shll8 r4 - mov.l r5,@-r15 -LOCAL(div_r8_2): - rotcl r4 - mov r0,r1 - div1 r5,r1 - mov r4,r0 - rotcl r0 - mov r5,r4 - div1 r5,r1 - .rept 5 - rotcl r0; div1 r5,r1 - .endr - rotcl r0 - mov.l @r15+,r5 - div1 r4,r1 - mov.l @r15+,r4 - rts - rotcl r0 - - ENDFUNC(GLOBAL(udivsi3_i4i)) - - .global GLOBAL(sdivsi3_i4i) - FUNC(GLOBAL(sdivsi3_i4i)) - /* This is link-compatible with a GLOBAL(sdivsi3) call, - but we effectively clobber only r1. */ -GLOBAL(sdivsi3_i4i): - mov.l r4,@-r15 - cmp/pz r5 - mov.w LOCAL(c128_w), r1 - bt/s LOCAL(pos_divisor) - cmp/pz r4 - mov.l r5,@-r15 - neg r5,r5 - bt/s LOCAL(neg_result) - cmp/hi r1,r5 - neg r4,r4 -LOCAL(pos_result): - extu.w r5,r0 - bf LOCAL(div_le128) - cmp/eq r5,r0 - mov r4,r0 - shlr8 r0 - bf/s LOCAL(div_ge64k) - cmp/hi r0,r5 - div0u - shll16 r5 - div1 r5,r0 - div1 r5,r0 - div1 r5,r0 -LOCAL(udiv_25): - mov.l LOCAL(zero_l),r1 - div1 r5,r0 - div1 r5,r0 - mov.l r1,@-r15 - .rept 3 - div1 r5,r0 - .endr - mov.b r0,@(L_MSWLSB,r15) - xtrct r4,r0 - swap.w r0,r0 - .rept 8 - div1 r5,r0 - .endr - mov.b r0,@(L_LSWMSB,r15) -LOCAL(div_ge64k_end): - .rept 8 - div1 r5,r0 - .endr - mov.l @r15+,r4 ! zero-extension and swap using LS unit. - extu.b r0,r0 - mov.l @r15+,r5 - or r4,r0 - mov.l @r15+,r4 - rts - rotcl r0 - -LOCAL(div_le128_neg): - tst #0xfe,r0 - mova LOCAL(div_table_ix),r0 - mov.b @(r0,r5),r1 - mova LOCAL(div_table_inv),r0 - bt/s LOCAL(div_by_1_neg) - mov.l @(r0,r1),r1 - mova LOCAL(div_table_clz),r0 - dmulu.l r1,r4 - mov.b @(r0,r5),r1 - mov.l @r15+,r5 - sts mach,r0 - /* clrt */ - addc r4,r0 - mov.l @r15+,r4 - rotcr r0 - shld r1,r0 - rts - neg r0,r0 - -LOCAL(pos_divisor): - mov.l r5,@-r15 - bt/s LOCAL(pos_result) - cmp/hi r1,r5 - neg r4,r4 -LOCAL(neg_result): - extu.w r5,r0 - bf LOCAL(div_le128_neg) - cmp/eq r5,r0 - mov r4,r0 - shlr8 r0 - bf/s LOCAL(div_ge64k_neg) - cmp/hi r0,r5 - div0u - mov.l LOCAL(zero_l),r1 - shll16 r5 - div1 r5,r0 - mov.l r1,@-r15 - .rept 7 - div1 r5,r0 - .endr - mov.b r0,@(L_MSWLSB,r15) - xtrct r4,r0 - swap.w r0,r0 - .rept 8 - div1 r5,r0 - .endr - mov.b r0,@(L_LSWMSB,r15) -LOCAL(div_ge64k_neg_end): - .rept 8 - div1 r5,r0 - .endr - mov.l @r15+,r4 ! zero-extension and swap using LS unit. - extu.b r0,r1 - mov.l @r15+,r5 - or r4,r1 -LOCAL(div_r8_neg_end): - mov.l @r15+,r4 - rotcl r1 - rts - neg r1,r0 - -LOCAL(div_ge64k_neg): - bt/s LOCAL(div_r8_neg) - div0u - shll8 r5 - mov.l LOCAL(zero_l),r1 - .rept 6 - div1 r5,r0 - .endr - mov.l r1,@-r15 - div1 r5,r0 - mov.w LOCAL(m256_w),r1 - div1 r5,r0 - mov.b r0,@(L_LSWMSB,r15) - xor r4,r0 - and r1,r0 - bra LOCAL(div_ge64k_neg_end) - xor r4,r0 - -LOCAL(c128_w): - .word 128 - -LOCAL(div_r8_neg): - clrt - shll16 r4 - mov r4,r1 - shll8 r1 - mov r5,r4 - .rept 7 - rotcl r1; div1 r5,r0 - .endr - mov.l @r15+,r5 - rotcl r1 - bra LOCAL(div_r8_neg_end) - div1 r4,r0 - -LOCAL(m256_w): - .word 0xff00 -/* This table has been generated by divtab-sh4.c. */ - .balign 4 -LOCAL(div_table_clz): - .byte 0 - .byte 1 - .byte 0 - .byte -1 - .byte -1 - .byte -2 - .byte -2 - .byte -2 - .byte -2 - .byte -3 - .byte -3 - .byte -3 - .byte -3 - .byte -3 - .byte -3 - .byte -3 - .byte -3 - .byte -4 - .byte -4 - .byte -4 - .byte -4 - .byte -4 - .byte -4 - .byte -4 - .byte -4 - .byte -4 - .byte -4 - .byte -4 - .byte -4 - .byte -4 - .byte -4 - .byte -4 - .byte -4 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -5 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 - .byte -6 -/* Lookup table translating positive divisor to index into table of - normalized inverse. N.B. the '0' entry is also the last entry of the - previous table, and causes an unaligned access for division by zero. */ -LOCAL(div_table_ix): - .byte -6 - .byte -128 - .byte -128 - .byte 0 - .byte -128 - .byte -64 - .byte 0 - .byte 64 - .byte -128 - .byte -96 - .byte -64 - .byte -32 - .byte 0 - .byte 32 - .byte 64 - .byte 96 - .byte -128 - .byte -112 - .byte -96 - .byte -80 - .byte -64 - .byte -48 - .byte -32 - .byte -16 - .byte 0 - .byte 16 - .byte 32 - .byte 48 - .byte 64 - .byte 80 - .byte 96 - .byte 112 - .byte -128 - .byte -120 - .byte -112 - .byte -104 - .byte -96 - .byte -88 - .byte -80 - .byte -72 - .byte -64 - .byte -56 - .byte -48 - .byte -40 - .byte -32 - .byte -24 - .byte -16 - .byte -8 - .byte 0 - .byte 8 - .byte 16 - .byte 24 - .byte 32 - .byte 40 - .byte 48 - .byte 56 - .byte 64 - .byte 72 - .byte 80 - .byte 88 - .byte 96 - .byte 104 - .byte 112 - .byte 120 - .byte -128 - .byte -124 - .byte -120 - .byte -116 - .byte -112 - .byte -108 - .byte -104 - .byte -100 - .byte -96 - .byte -92 - .byte -88 - .byte -84 - .byte -80 - .byte -76 - .byte -72 - .byte -68 - .byte -64 - .byte -60 - .byte -56 - .byte -52 - .byte -48 - .byte -44 - .byte -40 - .byte -36 - .byte -32 - .byte -28 - .byte -24 - .byte -20 - .byte -16 - .byte -12 - .byte -8 - .byte -4 - .byte 0 - .byte 4 - .byte 8 - .byte 12 - .byte 16 - .byte 20 - .byte 24 - .byte 28 - .byte 32 - .byte 36 - .byte 40 - .byte 44 - .byte 48 - .byte 52 - .byte 56 - .byte 60 - .byte 64 - .byte 68 - .byte 72 - .byte 76 - .byte 80 - .byte 84 - .byte 88 - .byte 92 - .byte 96 - .byte 100 - .byte 104 - .byte 108 - .byte 112 - .byte 116 - .byte 120 - .byte 124 - .byte -128 -/* 1/64 .. 1/127, normalized. There is an implicit leading 1 in bit 32. */ - .balign 4 -LOCAL(zero_l): - .long 0x0 - .long 0xF81F81F9 - .long 0xF07C1F08 - .long 0xE9131AC0 - .long 0xE1E1E1E2 - .long 0xDAE6076C - .long 0xD41D41D5 - .long 0xCD856891 - .long 0xC71C71C8 - .long 0xC0E07039 - .long 0xBACF914D - .long 0xB4E81B4F - .long 0xAF286BCB - .long 0xA98EF607 - .long 0xA41A41A5 - .long 0x9EC8E952 - .long 0x9999999A - .long 0x948B0FCE - .long 0x8F9C18FA - .long 0x8ACB90F7 - .long 0x86186187 - .long 0x81818182 - .long 0x7D05F418 - .long 0x78A4C818 - .long 0x745D1746 - .long 0x702E05C1 - .long 0x6C16C16D - .long 0x68168169 - .long 0x642C8591 - .long 0x60581606 - .long 0x5C9882BA - .long 0x58ED2309 -LOCAL(div_table_inv): - .long 0x55555556 - .long 0x51D07EAF - .long 0x4E5E0A73 - .long 0x4AFD6A06 - .long 0x47AE147B - .long 0x446F8657 - .long 0x41414142 - .long 0x3E22CBCF - .long 0x3B13B13C - .long 0x38138139 - .long 0x3521CFB3 - .long 0x323E34A3 - .long 0x2F684BDB - .long 0x2C9FB4D9 - .long 0x29E4129F - .long 0x27350B89 - .long 0x24924925 - .long 0x21FB7813 - .long 0x1F7047DD - .long 0x1CF06ADB - .long 0x1A7B9612 - .long 0x18118119 - .long 0x15B1E5F8 - .long 0x135C8114 - .long 0x11111112 - .long 0xECF56BF - .long 0xC9714FC - .long 0xA6810A7 - .long 0x8421085 - .long 0x624DD30 - .long 0x4104105 - .long 0x2040811 - /* maximum error: 0.987342 scaled: 0.921875*/ - - ENDFUNC(GLOBAL(sdivsi3_i4i)) -#endif /* SH3 / SH4 */ - #endif /* L_div_table */ +#endif /* __SH5__ */ #ifdef L_udiv_qrnnd_16 #if !__SHMEDIA__ diff --git a/gnu/gcc/gcc/config/sh/sh.c b/gnu/gcc/gcc/config/sh/sh.c index 9640c2048c6..e00d862dca5 100644 --- a/gnu/gcc/gcc/config/sh/sh.c +++ b/gnu/gcc/gcc/config/sh/sh.c @@ -3478,6 +3478,10 @@ untangle_mova (int *num_mova, rtx *first_mova, rtx new_mova) if (optimize) { + /* If NEW_MOVA has no address yet, it will be handled later. */ + if (INSN_ADDRESSES_SIZE() <= (unsigned) INSN_UID (new_mova)) + return -1; + n_addr = INSN_ADDRESSES (INSN_UID (new_mova)); n_target = INSN_ADDRESSES (INSN_UID (XEXP (MOVA_LABELREF (new_mova), 0))); if (n_addr > n_target || n_addr + 1022 < n_target) @@ -3531,6 +3535,7 @@ find_barrier (int num_mova, rtx mova, rtx from) rtx barrier_before_mova = 0, found_barrier = 0, good_barrier = 0; int si_limit; int hi_limit; + rtx orig = from; /* For HImode: range is 510, add 4 because pc counts from address of second instruction after this one, subtract 2 for the jump instruction @@ -3754,7 +3759,8 @@ find_barrier (int num_mova, rtx mova, rtx from) /* If we exceeded the range, then we must back up over the last instruction we looked at. Otherwise, we just need to undo the NEXT_INSN at the end of the loop. */ - if (count_hi > hi_limit || count_si > si_limit) + if (PREV_INSN (from) != orig + && (count_hi > hi_limit || count_si > si_limit)) from = PREV_INSN (PREV_INSN (from)); else from = PREV_INSN (from); @@ -11051,50 +11057,19 @@ sh_override_options (void) targetm.asm_out.aligned_op.di = NULL; targetm.asm_out.unaligned_op.di = NULL; } - if (TARGET_SH1) - { - if (! strcmp (sh_div_str, "call-div1")) - sh_div_strategy = SH_DIV_CALL_DIV1; - else if (! strcmp (sh_div_str, "call-fp") - && (TARGET_FPU_DOUBLE - || (TARGET_HARD_SH4 && TARGET_SH2E) - || (TARGET_SHCOMPACT && TARGET_FPU_ANY))) - sh_div_strategy = SH_DIV_CALL_FP; - else if (! strcmp (sh_div_str, "call-table") && TARGET_SH2) - sh_div_strategy = SH_DIV_CALL_TABLE; - else - /* Pick one that makes most sense for the target in general. - It is not much good to use different functions depending - on -Os, since then we'll end up with two different functions - when some of the code is compiled for size, and some for - speed. */ - - /* SH4 tends to emphasize speed. */ - if (TARGET_HARD_SH4) - sh_div_strategy = SH_DIV_CALL_TABLE; - /* These have their own way of doing things. */ - else if (TARGET_SH2A) - sh_div_strategy = SH_DIV_INTRINSIC; - /* ??? Should we use the integer SHmedia function instead? */ - else if (TARGET_SHCOMPACT && TARGET_FPU_ANY) - sh_div_strategy = SH_DIV_CALL_FP; - /* SH1 .. SH3 cores often go into small-footprint systems, so - default to the smallest implementation available. */ - else if (TARGET_SH2) /* ??? EXPERIMENTAL */ - sh_div_strategy = SH_DIV_CALL_TABLE; - else - sh_div_strategy = SH_DIV_CALL_DIV1; - } if (!TARGET_SH1) TARGET_PRETEND_CMOVE = 0; if (sh_divsi3_libfunc[0]) ; /* User supplied - leave it alone. */ - else if (TARGET_DIVIDE_CALL_FP) + else if (TARGET_HARD_SH4 && TARGET_SH2E) sh_divsi3_libfunc = "__sdivsi3_i4"; - else if (TARGET_DIVIDE_CALL_TABLE) - sh_divsi3_libfunc = "__sdivsi3_i4i"; else if (TARGET_SH5) - sh_divsi3_libfunc = "__sdivsi3_1"; + { + if (TARGET_FPU_ANY && TARGET_SH1) + sh_divsi3_libfunc = "__sdivsi3_i4"; + else + sh_divsi3_libfunc = "__sdivsi3_1"; + } else sh_divsi3_libfunc = "__sdivsi3"; if (TARGET_FMOVD) diff --git a/gnu/gcc/gcc/config/sh/sh.h b/gnu/gcc/gcc/config/sh/sh.h index ef35840be41..fa9080f23fb 100644 --- a/gnu/gcc/gcc/config/sh/sh.h +++ b/gnu/gcc/gcc/config/sh/sh.h @@ -234,9 +234,6 @@ do { \ #define TARGET_DIVIDE_INV20L (sh_div_strategy == SH_DIV_INV20L) #define TARGET_DIVIDE_INV_CALL (sh_div_strategy == SH_DIV_INV_CALL) #define TARGET_DIVIDE_INV_CALL2 (sh_div_strategy == SH_DIV_INV_CALL2) -#define TARGET_DIVIDE_CALL_DIV1 (sh_div_strategy == SH_DIV_CALL_DIV1) -#define TARGET_DIVIDE_CALL_FP (sh_div_strategy == SH_DIV_CALL_FP) -#define TARGET_DIVIDE_CALL_TABLE (sh_div_strategy == SH_DIV_CALL_TABLE) #define SELECT_SH1 (MASK_SH1) #define SELECT_SH2 (MASK_SH2 | SELECT_SH1) @@ -470,7 +467,7 @@ do { \ sh_div_str = SH_DIV_STR_FOR_SIZE ; \ } \ /* We can't meaningfully test TARGET_SHMEDIA here, because -m options \ - haven't been parsed yet, hence we'd read only the default. \ + haven't been parsed yet, hence we';d read only the default. \ sh_target_reg_class will return NO_REGS if this is not SHMEDIA, so \ it's OK to always set flag_branch_target_load_optimize. */ \ if (LEVEL > 1) \ @@ -495,24 +492,16 @@ do { \ extern int assembler_dialect; enum sh_divide_strategy_e { - /* SH5 strategies. */ SH_DIV_CALL, SH_DIV_CALL2, - SH_DIV_FP, /* We could do this also for SH4. */ + SH_DIV_FP, SH_DIV_INV, SH_DIV_INV_MINLAT, SH_DIV_INV20U, SH_DIV_INV20L, SH_DIV_INV_CALL, SH_DIV_INV_CALL2, - SH_DIV_INV_FP, - /* SH1 .. SH4 strategies. Because of the small number of registers - available, the compiler uses knowledge of the actual set of registers - being clobbered by the different functions called. */ - SH_DIV_CALL_DIV1, /* No FPU, medium size, highest latency. */ - SH_DIV_CALL_FP, /* FPU needed, small size, high latency. */ - SH_DIV_CALL_TABLE, /* No FPU, large size, medium latency. */ - SH_DIV_INTRINSIC + SH_DIV_INV_FP }; extern enum sh_divide_strategy_e sh_div_strategy; diff --git a/gnu/gcc/gcc/config/sh/sh.md b/gnu/gcc/gcc/config/sh/sh.md index 309acca4e3c..4837276f7a3 100644 --- a/gnu/gcc/gcc/config/sh/sh.md +++ b/gnu/gcc/gcc/config/sh/sh.md @@ -1775,27 +1775,7 @@ operands[3] = gen_reg_rtx (Pmode); /* Emit the move of the address to a pseudo outside of the libcall. */ - if (TARGET_DIVIDE_CALL_TABLE) - { - /* libgcc2:__udivmoddi4 is not supposed to use an actual division, since - that causes problems when the divide code is supposed to come from a - separate library. Division by zero is undefined, so dividing 1 can be - implemented by comparing with the divisor. */ - if (operands[1] == const1_rtx && currently_expanding_to_rtl) - { - emit_insn (gen_cmpsi (operands[1], operands[2])); - emit_insn (gen_sgeu (operands[0])); - DONE; - } - else if (operands[2] == const0_rtx) - { - emit_move_insn (operands[0], operands[2]); - DONE; - } - function_symbol (operands[3], \"__udivsi3_i4i\", SFUNC_GOT); - last = gen_udivsi3_i4_int (operands[0], operands[3]); - } - else if (TARGET_DIVIDE_CALL_FP) + if (TARGET_HARD_SH4 && TARGET_SH2E) { function_symbol (operands[3], \"__udivsi3_i4\", SFUNC_STATIC); if (TARGET_FPU_SINGLE) @@ -2047,12 +2027,7 @@ operands[3] = gen_reg_rtx (Pmode); /* Emit the move of the address to a pseudo outside of the libcall. */ - if (TARGET_DIVIDE_CALL_TABLE) - { - function_symbol (operands[3], sh_divsi3_libfunc, SFUNC_GOT); - last = gen_divsi3_i4_int (operands[0], operands[3]); - } - else if (TARGET_DIVIDE_CALL_FP) + if (TARGET_HARD_SH4 && TARGET_SH2E) { function_symbol (operands[3], sh_divsi3_libfunc, SFUNC_STATIC); if (TARGET_FPU_SINGLE) diff --git a/gnu/gcc/gcc/config/sh/sh.opt b/gnu/gcc/gcc/config/sh/sh.opt index 7f9a87e95d9..fbafa6b4a9d 100644 --- a/gnu/gcc/gcc/config/sh/sh.opt +++ b/gnu/gcc/gcc/config/sh/sh.opt @@ -1,6 +1,6 @@ ; Options for the SH port of the compiler. -; Copyright (C) 2005, 2006 Free Software Foundation, Inc. +; Copyright (C) 2005 Free Software Foundation, Inc. ; ; This file is part of GCC. ; @@ -192,7 +192,7 @@ Align doubles at 64-bit boundaries mdiv= Target RejectNegative Joined Var(sh_div_str) Init("") -Division strategy, one of: call, call2, fp, inv, inv:minlat, inv20u, inv20l, inv:call, inv:call2, inv:fp call-div1 call-fp call-table +Division strategy, one of: call, call2, fp, inv, inv:minlat, inv20u, inv20l, inv:call, inv:call2, inv:fp mdivsi3_libfunc= Target RejectNegative Joined Var(sh_divsi3_libfunc) Init("") diff --git a/gnu/gcc/gcc/config/sh/t-sh b/gnu/gcc/gcc/config/sh/t-sh index 3ebc09d6e3c..18a032d7dca 100644 --- a/gnu/gcc/gcc/config/sh/t-sh +++ b/gnu/gcc/gcc/config/sh/t-sh @@ -5,7 +5,7 @@ sh-c.o: $(srcdir)/config/sh/sh-c.c \ LIB1ASMSRC = sh/lib1funcs.asm LIB1ASMFUNCS = _ashiftrt _ashiftrt_n _ashiftlt _lshiftrt _movmem \ _movmem_i4 _mulsi3 _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ - _div_table _udiv_qrnnd_16 \ + _udiv_qrnnd_16 \ $(LIB1ASMFUNCS_CACHE) # We want fine grained libraries, so use the new code to build the diff --git a/gnu/usr.bin/cc/libgcc/Makefile b/gnu/usr.bin/cc/libgcc/Makefile index 6ae9e7638e4..3ce6255173f 100644 --- a/gnu/usr.bin/cc/libgcc/Makefile +++ b/gnu/usr.bin/cc/libgcc/Makefile @@ -1,5 +1,5 @@ # $FreeBSD: src/gnu/lib/libgcc/Makefile,v 1.58.8.1 2009/04/15 03:14:26 kensmith Exp $ -# $OpenBSD: Makefile,v 1.20 2011/09/22 20:57:20 kettenis Exp $ +# $OpenBSD: Makefile,v 1.21 2012/04/12 11:18:29 jsg Exp $ .include <bsd.own.mk> @@ -163,8 +163,7 @@ CFLAGS+= -fpic LIB1ASMSRC = sh/lib1funcs.asm LIB1ASMFUNCS = _ashiftrt _ashiftrt_n _ashiftlt _lshiftrt _movmem \ _movmem_i4 _mulsi3 _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ - _div_table _udiv_qrnnd_16 \ - _ic_invalidate + _udiv_qrnnd_16 _ic_invalidate .endif .if ${TARGET_ARCH} == "powerpc" |