mark@mips.COM (Mark G. Johnson) (07/15/90)
The problem is this: the source code assumes it will be run on a little-endian machine. Presumably the Sequent incorporates an Intel CPU, which is little-endian. The SGI (as well as the Sun, MIPS, and Apollo machines mentioned earlier) are all big-endian. Further evidence comes from the DECstation 3100, a little-endian machine which uses the same CPU (R2000) and same C compiler as the SGI. However, the DS3100 gets the answer that John Forrest wants, CRC=9cda, while the SGI does not. You can monkey around in the debugger to see this, or you can insert the following printf statement in between two existing assignments: ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ temp = (iUn.Bit.i7 ^ iUn.Bit.i6 ^ iUn.Bit.i5 ^ iUn.Bit.i4 ^ iUn.Bit.i3 ^ iUn.Bit.i2 ^ iUn.Bit.i1); printf("DEBUG: iUn.i = %3d LSBs 4 3 2 1 = %d %d %d %d temp = %d\n", (iUn.i), (iUn.Bit.i4), (iUn.Bit.i3), (iUn.Bit.i2), (iUn.Bit.i1), temp ); EntryUn.EntryBit.b16 = (iUn.Bit.i8 ^ temp); ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ On the SGI you find that "the LSBs" are all zeroes, while on the DS3100 they contain ones as appropriate. In short, this "bug" seems to be a problem with the source code, not the C compiler. -- -- Mark Johnson MIPS Computer Systems, 930 E. Arques M/S 2-02, Sunnyvale, CA 94086 (408) 524-8308 mark@mips.com {or ...!decwrl!mips!mark}