wgb@tntdev.tnt.com (William G. Bunton) (05/23/89)
I believe I've found the problem with floating point
subtraction/division. Appearently, most 386 compilers generate
incorrect code for the 'reversed' forms of fsub and fdiv. A comment in
config/out-i386.c notes this fact, and uses the 'unreversed' forms
instead. This is a problem when using GAS, since GAS gets it right. To
correct, copy config/out-i386.c to config/out-i386g.c, run the
following through patch, and the run config.gcc again. This creates
out-i386g.c using the proper reversed insn, which seems to cure the
problem, and not break anything else.
*** config.gcc~ Fri May 19 18:36:15 1989
--- config.gcc Mon May 22 17:24:30 1989
***************
*** 81,86 ****
--- 81,87 ----
cpu_type=i386
configuration_file=xm-i386v.h
target_machine=tm-i386gas.h
+ aux_output=out-i386g.c
;;
next )
cpu_type=m68k
*** config/out-i386g.c~ Mon May 22 17:21:29 1989
--- config/out-i386g.c Mon May 22 17:22:53 1989
***************
*** 142,148 ****
which exchanges the meanings of fsubr and fsub, and of fdivr and fdiv!
So use the "unreversed" opcode (which will assemble into
the "reversed" insn). */
! rev = op;
while (*rev && *rev != '%')
fputc (*rev++, asm_out_file);
--- 142,150 ----
which exchanges the meanings of fsubr and fsub, and of fdivr and fdiv!
So use the "unreversed" opcode (which will assemble into
the "reversed" insn). */
! /* This only appears true of AT&T assemblers; at least gas1.31 seems
! to get it right, so we'll use the reversed opcode correctly */
! /* rev = op; */
while (*rev && *rev != '%')
fputc (*rev++, asm_out_file);
Bill
--
William G. Bunton wgb@tntdev.tnt.com {uunet,natinst}!tntdev!wgb
Tools & Techniques, Inc. Austin, TX