diff options
author | Franz Sirl <Franz.Sirl-kernel@lauterbach.com> | 2003-02-25 23:13:42 +0000 |
---|---|---|
committer | Franz Sirl <sirl@gcc.gnu.org> | 2003-02-25 23:13:42 +0000 |
commit | 3eaa60442ff2727dab5f81465771461f91de8e8b (patch) | |
tree | 511e5b52a74ce60d687b07e970d556c917203e86 /gcc | |
parent | 14f00213a7d7b42f836200e3f9650677caabff15 (diff) | |
download | gcc-3eaa60442ff2727dab5f81465771461f91de8e8b.zip gcc-3eaa60442ff2727dab5f81465771461f91de8e8b.tar.gz gcc-3eaa60442ff2727dab5f81465771461f91de8e8b.tar.bz2 |
re PR target/9732 ([ppc32] Wrong code with -O2 -fPIC)
2003-02-25 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
PR target/9732
* gcc.dg/20030225-1.c: New test.
From-SVN: r63424
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/20030225-1.c | 103 |
2 files changed, 108 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9ea81bb..e13423d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-02-25 Franz Sirl <Franz.Sirl-kernel@lauterbach.com> + + PR target/9732 + * gcc.dg/20030225-1.c: New test. + 2003-02-24 Mark Mitchell <mark@codesourcery.com> * README: Remove out-of-date information. diff --git a/gcc/testsuite/gcc.dg/20030225-1.c b/gcc/testsuite/gcc.dg/20030225-1.c new file mode 100644 index 0000000..7c30898 --- /dev/null +++ b/gcc/testsuite/gcc.dg/20030225-1.c @@ -0,0 +1,103 @@ +/* PR target/9732 + This testcase segfaulted on PPC because PIC_OFFSET_TABLE_REGNUM was no + fixed register. + Distilled from the xvid sources by Guillaume Morin <guillaume@morinfr.org> + and Benjamin Herrenschmidt <benh@kernel.crashing.org>. */ +/* { dg-do run } */ +/* { dg-options "-O2 -fPIC" } */ +/* { dg-warning "not supported" "PIC unsupported" { target cris-*-elf* mmix-*-* } 0 } */ + + +extern void exit (int); + +#define W1 2841 /* 2048*sqrt(2)*cos(1*pi/16) */ +#define W2 2676 /* 2048*sqrt(2)*cos(2*pi/16) */ +#define W3 2408 /* 2048*sqrt(2)*cos(3*pi/16) */ +#define W5 1609 /* 2048*sqrt(2)*cos(5*pi/16) */ +#define W6 1108 /* 2048*sqrt(2)*cos(6*pi/16) */ +#define W7 565 /* 2048*sqrt(2)*cos(7*pi/16) */ + + +/* private data */ +static short iclip[1024]; /* clipping table */ +static short *iclp; + +void +idct_int32(short *const block) +{ + static short *blk; + static long i; + static long X0, X1, X2, X3, X4, X5, X6, X7, X8; + + for (i = 0; i < 8; i++) /* idct columns */ + { + blk = block + i; + /* shortcut */ + if (! ((X1 = (blk[8 * 4] << 8)) | (X2 = blk[8 * 6]) + | (X3 = blk[8 * 2]) | (X4 = blk[8 * 1]) | (X5 = blk[8 * 7]) + | (X6 = blk[8 * 5]) | (X7 = blk[8 * 3]))) + { + blk[8 * 0] = blk[8 * 1] = blk[8 * 2] = + blk[8 * 3] = blk[8 * 4] = + blk[8 * 5] = blk[8 * 6] = blk[8 * 7] = + iclp[(blk[8 * 0] + 32) >> 6]; + continue; + } + X0 = (blk[8 * 0] << 8) + 8192; + + /* first stage */ + X8 = W7 * (X4 + X5) + 4; + X4 = (X8 + (W1 - W7) * X4) >> 3; + X5 = (X8 - (W1 + W7) * X5) >> 3; + X8 = W3 * (X6 + X7) + 4; + X6 = (X8 - (W3 - W5) * X6) >> 3; + X7 = (X8 - (W3 + W5) * X7) >> 3; + + /* second stage */ + X8 = X0 + X1; + X0 -= X1; + X1 = W6 * (X3 + X2) + 4; + X2 = (X1 - (W2 + W6) * X2) >> 3; + X3 = (X1 + (W2 - W6) * X3) >> 3; + X1 = X4 + X6; + X4 -= X6; + X6 = X5 + X7; + X5 -= X7; + + /* third stage */ + X7 = X8 + X3; + X8 -= X3; + X3 = X0 + X2; + X0 -= X2; + X2 = (181 * (X4 + X5) + 128) >> 8; + X4 = (181 * (X4 - X5) + 128) >> 8; + + /* fourth stage */ + blk[8 * 0] = iclp[(X7 + X1) >> 14]; + blk[8 * 1] = iclp[(X3 + X2) >> 14]; + blk[8 * 2] = iclp[(X0 + X4) >> 14]; + blk[8 * 3] = iclp[(X8 + X6) >> 14]; + blk[8 * 4] = iclp[(X8 - X6) >> 14]; + blk[8 * 5] = iclp[(X0 - X4) >> 14]; + blk[8 * 6] = iclp[(X3 - X2) >> 14]; + blk[8 * 7] = iclp[(X7 - X1) >> 14]; + } +} /* end function idct_int32(block) */ + + +int main(void) { + int i; + unsigned short tab[64]; + + for (i = 0 ; i < 64 ; ++i) + { + tab[i] = (1+(int) (65535)*8000/(2147483647+1.0)); + } + + iclp = iclip + 512; + for (i = -512; i < 512; i++) + iclp[i] = (i < -256) ? -256 : ((i > 255) ? 255 : i); + + idct_int32((short *) tab); + exit (0); +} |