|  | /* NOCW */ | 
|  | /* sgibug.c */ | 
|  | /* bug found by Eric Young (eay@mincom.oz.au) May 95 */ | 
|  |  | 
|  | #include <stdio.h> | 
|  |  | 
|  | /* This compiler bug it present on IRIX 5.3, 5.1 and 4.0.5 (these are | 
|  | * the only versions of IRIX I have access to. | 
|  | * defining FIXBUG removes the bug. | 
|  | * (bug is still present in IRIX 6.3 according to | 
|  | * Gage <agage@forgetmenot.Mines.EDU> | 
|  | */ | 
|  |  | 
|  | /* Compare the output from | 
|  | * cc sgiccbug.c; ./a.out | 
|  | * and | 
|  | * cc -O sgiccbug.c; ./a.out | 
|  | */ | 
|  |  | 
|  | static unsigned long a[4]={0x01234567,0x89ABCDEF,0xFEDCBA98,0x76543210}; | 
|  | static unsigned long b[4]={0x89ABCDEF,0xFEDCBA98,0x76543210,0x01234567}; | 
|  | static unsigned long c[4]={0x77777778,0x8ACF1357,0x88888888,0x7530ECA9}; | 
|  |  | 
|  | main() | 
|  | { | 
|  | unsigned long r[4]; | 
|  | sub(r,a,b); | 
|  | fprintf(stderr,"input a= %08X %08X %08X %08X\n",a[3],a[2],a[1],a[0]); | 
|  | fprintf(stderr,"input b= %08X %08X %08X %08X\n",b[3],b[2],b[1],b[0]); | 
|  | fprintf(stderr,"output = %08X %08X %08X %08X\n",r[3],r[2],r[1],r[0]); | 
|  | fprintf(stderr,"correct= %08X %08X %08X %08X\n",c[3],c[2],c[1],c[0]); | 
|  | } | 
|  |  | 
|  | int sub(r,a,b) | 
|  | unsigned long *r,*a,*b; | 
|  | { | 
|  | register unsigned long t1,t2,*ap,*bp,*rp; | 
|  | int i,carry; | 
|  | #ifdef FIXBUG | 
|  | unsigned long dummy; | 
|  | #endif | 
|  |  | 
|  | ap=a; | 
|  | bp=b; | 
|  | rp=r; | 
|  | carry=0; | 
|  | for (i=0; i<4; i++) | 
|  | { | 
|  | t1= *(ap++); | 
|  | t2= *(bp++); | 
|  | t1=(t1-t2); | 
|  | #ifdef FIXBUG | 
|  | dummy=t1; | 
|  | #endif | 
|  | *(rp++)=t1&0xffffffff; | 
|  | } | 
|  | } |