crufty memcmp on 386
Col. G. L. Sicherman
gls at cbnewsh.att.com
Tue Nov 13 04:38:12 AEST 1990
There is a problem with the memcmp routine on my 6386WGS running Vr3.2.
The ordering it returns is not transitive, or even antisymmetric. In
other words, it can tell you that x < y and y < x, or that x < y < z < x.
I do not know whether the formal specifications for memcmp require that
it produces a lineal ordering, but obviously it should. A nonlineal
memcmp cannot be used for sorting and searching.
The 386-specific code does this:
jz zeroexit
lahf // load low byte of flags to high byte of AX
cwtl // convert word to longword with sign extension
There are two problems with this. One is that if EAX contains zero and
all the flag bits are 0, it will return 0 instead of positive. This
never seems to happen; apparently the unused bit 1 is always set to 1.
The other is that it effectively returns the sign flag as the sign of
the result. Even PDP-11 programmers know better than that! There are
two ways to give a consistent ordering on a 386:
1. Use unsigned byte comparison. This amounts to replacing
the CWTL by a 9-bit right rotate, to put the carry flag
into the sign position. There is probably a faster way;
I don't have a 386 manual. Like the method above, this
assumes that bit 1 of the flags is set -- otherwise you
could get zero.
2. Use consistent signed byte comparison. This means testing
for SF=OF. The simplest way to do it is with a JGE, but
again there may well be a faster way.
Is anybody working on a fix for the code and (if necessary) the formal
specs for memcmp()?
--
Col. G. L. Sicherman
gls at odyssey.att.COM
More information about the Comp.unix.sysv386
mailing list