You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.4 KiB
60 lines
1.4 KiB
/* 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; |
|
} |
|
}
|
|
|