123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- /* 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;
- }
- }
|