]>
Commit | Line | Data |
---|---|---|
d02b48c6 RE |
1 | /* NOCW */ |
2 | /* sgibug.c */ | |
3 | /* bug found by Eric Young (eay@mincom.oz.au) May 95 */ | |
4 | ||
5 | #include <stdio.h> | |
6 | ||
7 | /* This compiler bug it present on IRIX 5.3, 5.1 and 4.0.5 (these are | |
8 | * the only versions of IRIX I have access to. | |
9 | * defining FIXBUG removes the bug. | |
10 | */ | |
11 | ||
12 | /* Compare the output from | |
13 | * cc sgiccbug.c; ./a.out | |
14 | * and | |
15 | * cc -O sgiccbug.c; ./a.out | |
16 | */ | |
17 | ||
18 | static unsigned long a[4]={0x01234567,0x89ABCDEF,0xFEDCBA98,0x76543210}; | |
19 | static unsigned long b[4]={0x89ABCDEF,0xFEDCBA98,0x76543210,0x01234567}; | |
20 | static unsigned long c[4]={0x77777778,0x8ACF1357,0x88888888,0x7530ECA9}; | |
21 | ||
22 | main() | |
23 | { | |
24 | unsigned long r[4]; | |
25 | sub(r,a,b); | |
26 | fprintf(stderr,"input a= %08X %08X %08X %08X\n",a[3],a[2],a[1],a[0]); | |
27 | fprintf(stderr,"input b= %08X %08X %08X %08X\n",b[3],b[2],b[1],b[0]); | |
28 | fprintf(stderr,"output = %08X %08X %08X %08X\n",r[3],r[2],r[1],r[0]); | |
29 | fprintf(stderr,"correct= %08X %08X %08X %08X\n",c[3],c[2],c[1],c[0]); | |
30 | } | |
31 | ||
32 | int sub(r,a,b) | |
33 | unsigned long *r,*a,*b; | |
34 | { | |
35 | register unsigned long t1,t2,*ap,*bp,*rp; | |
36 | int i,carry; | |
37 | #ifdef FIXBUG | |
38 | unsigned long dummy; | |
39 | #endif | |
40 | ||
41 | ap=a; | |
42 | bp=b; | |
43 | rp=r; | |
44 | carry=0; | |
45 | for (i=0; i<4; i++) | |
46 | { | |
47 | t1= *(ap++); | |
48 | t2= *(bp++); | |
49 | t1=(t1-t2); | |
50 | #ifdef FIXBUG | |
51 | dummy=t1; | |
52 | #endif | |
53 | *(rp++)=t1&0xffffffff; | |
54 | } | |
55 | } |