Subject: looks like a compiler error
To: None <tech-toolchain@NetBSD.ORG>
From: Matthias Drochner <>
List: tech-toolchain
Date: 01/16/1998 18:24:04
I just found a piece of code which doesn't work as expected:
(from cgd's new wscons code)

		ev->value = ffs(d) - 1;
#if 0
		KASSERT(ev->value >= 0);
		if (ev->value < 0)
		    printf("wsms_in: %x/%x/%x\n", mb, ub, ev->value);

Here is what the (-current) compiler makes of it:

0xf021be28 <wsmouse_input+116>: bsfl   0xffffffec(%ebp),%eax
0xf021be2c <wsmouse_input+120>: jne    0xf021be33 <wsmouse_input+127>
0xf021be2e <wsmouse_input+122>: movl   $0xffffffff,%eax
0xf021be33 <wsmouse_input+127>: movl   %eax,0x4(%ebx)
0xf021be36 <wsmouse_input+130>: jns    0xf021be4c <wsmouse_input+152>
0xf021be38 <wsmouse_input+132>: pushl  %eax
0xf021be39 <wsmouse_input+133>: pushl  0xfffffff4(%ebp)
0xf021be3c <wsmouse_input+136>: pushl  0xfffffff8(%ebp)
0xf021be3f <wsmouse_input+139>: pushl  $0xf021bd9e
0xf021be44 <wsmouse_input+144>: call   0xf012e044 <printf>
0xf021be49 <wsmouse_input+149>: addl   $0x10,%esp

The "less than zero" decision is made by "jns", but the sign flag
is not valid at this point ("bsfl" sets only the zero flag).

best regards