1 /* PR target/9732 2 This testcase segfaulted on PPC because PIC_OFFSET_TABLE_REGNUM was no 3 fixed register. 4 Distilled from the xvid sources by Guillaume Morin <guillaume@morinfr.org> 5 and Benjamin Herrenschmidt <benh@kernel.crashing.org>. */ 6 /* { dg-do run } */ 7 /* { dg-options "-O2 -fPIC" } */ 8 /* { dg-warning "not supported" "PIC unsupported" { target cris-*-elf* mmix-*-* } 0 } */ 9 10 11 extern void exit (int); 12 13 #define W1 2841 /* 2048*sqrt(2)*cos(1*pi/16) */ 14 #define W2 2676 /* 2048*sqrt(2)*cos(2*pi/16) */ 15 #define W3 2408 /* 2048*sqrt(2)*cos(3*pi/16) */ 16 #define W5 1609 /* 2048*sqrt(2)*cos(5*pi/16) */ 17 #define W6 1108 /* 2048*sqrt(2)*cos(6*pi/16) */ 18 #define W7 565 /* 2048*sqrt(2)*cos(7*pi/16) */ 19 20 21 /* private data */ 22 static short iclip[1024]; /* clipping table */ 23 static short *iclp; 24 25 void idct_int32(short * const block)26idct_int32(short *const block) 27 { 28 static short *blk; 29 static long i; 30 static long X0, X1, X2, X3, X4, X5, X6, X7, X8; 31 32 for (i = 0; i < 8; i++) /* idct columns */ 33 { 34 blk = block + i; 35 /* shortcut */ 36 if (! ((X1 = (blk[8 * 4] << 8)) | (X2 = blk[8 * 6]) 37 | (X3 = blk[8 * 2]) | (X4 = blk[8 * 1]) | (X5 = blk[8 * 7]) 38 | (X6 = blk[8 * 5]) | (X7 = blk[8 * 3]))) 39 { 40 blk[8 * 0] = blk[8 * 1] = blk[8 * 2] = 41 blk[8 * 3] = blk[8 * 4] = 42 blk[8 * 5] = blk[8 * 6] = blk[8 * 7] = 43 iclp[(blk[8 * 0] + 32) >> 6]; 44 continue; 45 } 46 X0 = (blk[8 * 0] << 8) + 8192; 47 48 /* first stage */ 49 X8 = W7 * (X4 + X5) + 4; 50 X4 = (X8 + (W1 - W7) * X4) >> 3; 51 X5 = (X8 - (W1 + W7) * X5) >> 3; 52 X8 = W3 * (X6 + X7) + 4; 53 X6 = (X8 - (W3 - W5) * X6) >> 3; 54 X7 = (X8 - (W3 + W5) * X7) >> 3; 55 56 /* second stage */ 57 X8 = X0 + X1; 58 X0 -= X1; 59 X1 = W6 * (X3 + X2) + 4; 60 X2 = (X1 - (W2 + W6) * X2) >> 3; 61 X3 = (X1 + (W2 - W6) * X3) >> 3; 62 X1 = X4 + X6; 63 X4 -= X6; 64 X6 = X5 + X7; 65 X5 -= X7; 66 67 /* third stage */ 68 X7 = X8 + X3; 69 X8 -= X3; 70 X3 = X0 + X2; 71 X0 -= X2; 72 X2 = (181 * (X4 + X5) + 128) >> 8; 73 X4 = (181 * (X4 - X5) + 128) >> 8; 74 75 /* fourth stage */ 76 blk[8 * 0] = iclp[(X7 + X1) >> 14]; 77 blk[8 * 1] = iclp[(X3 + X2) >> 14]; 78 blk[8 * 2] = iclp[(X0 + X4) >> 14]; 79 blk[8 * 3] = iclp[(X8 + X6) >> 14]; 80 blk[8 * 4] = iclp[(X8 - X6) >> 14]; 81 blk[8 * 5] = iclp[(X0 - X4) >> 14]; 82 blk[8 * 6] = iclp[(X3 - X2) >> 14]; 83 blk[8 * 7] = iclp[(X7 - X1) >> 14]; 84 } 85 } /* end function idct_int32(block) */ 86 87 main(void)88int main(void) { 89 int i; 90 unsigned short tab[64]; 91 92 for (i = 0 ; i < 64 ; ++i) 93 { 94 tab[i] = (1+(int) (65535)*8000/(2147483647+1.0)); 95 } 96 97 iclp = iclip + 512; 98 for (i = -512; i < 512; i++) 99 iclp[i] = (i < -256) ? -256 : ((i > 255) ? 255 : i); 100 101 idct_int32((short *) tab); 102 exit (0); 103 } 104