Return to BSD News archive
Newsgroups: comp.os.386bsd.bugs
Path: sserve!newshost.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!pacbell.com!amdahl!netcomsv!netcom.com!abe
From: abe@netcom.com (David Abercrombie)
Subject: Casts to int rounding bug fix
Message-ID: <abeC5rIqp.2Bn@netcom.com>
Keywords: int, cast, gcc, fix
Organization: NETCOM On-line Communication Services (408 241-9760 guest)
Date: Tue, 20 Apr 1993 03:23:13 GMT
Lines: 212
I have included the following:
1) Description of the bug,
2) A fix by steve@robobar.co.uk (Steve Bleazard),
3) Brief installation instructions
4) Description of my system configuration, and
5) A test program.
1) Bug description =============================================
Programs compiled on 386bsd using the stock gcc 1.39 do not cast
doubles to ints correctly. K&R says: "When the value of a
floating type is converted to integral type, the fractional part
is discarded...". However, under 386bsd, doubles get ROUNDED to
the nearest int during a cast (instead of getting truncated).
This did not seem to occur under gcc 2.3.3 (on ref.tfs.com).
2) Fix by steve@robobar.co.uk (Steve Bleazard) ==================
"...the bug appears to be in the __fix{uns}dfsi routines that
convert from double to long. The 386 versions of these routines
do not appear to set the rounding mode. [...] gcc 2.3.3 appears to
have it's own C version of these routines...."
------------------------------ Cut Here -------------------------
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line, and after the
# "Cut Here" line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
# fixdfsi.S
# fixunsdfsi.S
# This archive created: Sat Jan 9 10:34:31 1993
export PATH; PATH=/bin:$PATH
if test -f 'fixdfsi.S'
then
echo shar: will not over-write existing file "'fixdfsi.S'"
else
sed 's/^X//' << \SHAR_EOF > 'fixdfsi.S'
X .file "__fixdfsi.s"
X.text
X .align 2
X.globl ___fixdfsi
X___fixdfsi:
X pushl %ebp
X movl %esp,%ebp
X subl $12,%esp
X fstcw -4(%ebp)
X movw -4(%ebp),%ax
X orw $0x0c00,%ax
X movw %ax,-2(%ebp)
X fldcw -2(%ebp)
X fldl 8(%ebp)
X fistpl -12(%ebp)
X fldcw -4(%ebp)
X movl -12(%ebp),%eax
X leave
X ret
SHAR_EOF
fi # end of overwriting check
if test -f 'fixunsdfsi.S'
then
echo shar: will not over-write existing file "'fixunsdfsi.S'"
else
sed 's/^X//' << \SHAR_EOF > 'fixunsdfsi.S'
X .file "__fixdfsi.s"
X.text
X .align 2
X.globl ___fixunsdfsi
X___fixunsdfsi:
X pushl %ebp
X movl %esp,%ebp
X subl $12,%esp
X fstcw -4(%ebp)
X movw -4(%ebp),%ax
X orw $0x0c00,%ax
X movw %ax,-2(%ebp)
X fldcw -2(%ebp)
X fldl 8(%ebp)
X
X fcoml fbiggestsigned /* bigger than biggest signed? */
X fstsw %ax
X sahf
X jnb 1f
X
X fistpl -12(%ebp)
X movl -12(%ebp),%eax
X jmp 2f
X
X1: fsubl fbiggestsigned /* reduce for proper conversion */
X fistpl -12(%ebp) /* convert */
X movl -12(%ebp),%eax
X orl $0x80000000,%eax /* restore bias */
X
X2: fldcw -4(%ebp)
X leave
X ret
X
X fcoml fbiggestsigned /* bigger than biggest signed? */
X fstsw %ax
X sahf
X jnb 1f
X
X fistpl 4(%esp)
X movl 4(%esp),%eax
X ret
X
X1: fsubl fbiggestsigned /* reduce for proper conversion */
X fistpl 4(%esp) /* convert */
X movl 4(%esp),%eax
X orl $0x80000000,%eax /* restore bias */
X ret
X
X .data
Xfbiggestsigned: .double 0r2147483648.0
SHAR_EOF
fi # end of overwriting check
# End of shell archive
exit 0
------------------------------ Cut Here -------------------------
3) Installation =================================================
The files provided above replace the following files:
/usr/src/usr.bin/gcc/gnulib/i386/fixunsdfsi.s
/usr/src/usr.bin/gcc/gnulib/i386/fixdfsi.s
/usr/src/lib/libc/i386/gen/fixunsdfsi.s
/usr/src/lib/libc/i386/gen/fixdfsi.s
Note that the replacement files end with upper-case "S" and the
original files end with lower-case "s". The original files
should be saved, and the replacemet files should be renamed to
end in lower-case "s". Note also that the original files in
gnulib are identical to the original files in libc (with the
exception of the version control date in fixdfsi.s). I created
hard links between the replacement files, since it is not clear
to me why they should be different.
Recompile /usr/src/lib, /usr/src/usr.bin/gcc, etc...
cd /usr/src/lib; make; make install; make clean;
cd /usr/src/usr.bin/gcc; make; make install; make clean;
4) System configuration =========================================
386/486/387: Micronics 386/33, Intel 387
ISA/EISA/SCSI: Adaptec 1542B
RAM size: 16
drive(s) type and size: Maxtor 340
tape(s) type and size: Archive 2150S
ethernet type: none
graphics type: Prodesigner II
serial type: 16550
parallel type: n/a
other: patches 1-?
5) Test program =================================================
This program prompts for a numeric string, then asks for a
storage type. As soon as a storage type is chosen, the program
prints the number as cast to a variety of data types. The most
recent number entered at the prompt is saved to facilitate
testing a variety of storage types with a single numeric value.
Ctrl-D exits the program.
begin 644 cast.c.Z
M'YV0(\B4,9/&31D038)@^<*DB!,0-F@H4#"BX!@V=02"X#&'#IDT;UR@\4'1
M(D:-'#VR22-&),F*;BYF/,CQ#!TZ>5R6C'F2YIP\<UZ '$.'C4Z8,E%VE%/P
MC$X%!>F D%,F#)DO*PVB #$&31@Y(%2 2+$#JANI5*U^Z?IU:]2P8\LJ8 MV
MZ1<T;]@(E+,EX<*&3E;$Z%*6S)LZ8M@<O.JF3ILO=L*P*7PX\<'&CR-/5F"&
MS9LP4LU\P0Q9<MFW:48[+KW9SILT9.#"87I6]6,X=.3(C:J@39B"*%* V*,
M!(BW8W: *,[5*U@5=,IT9 VB!PB[>/66T3W1^!TT:11O37LU:QD4T:=K%BZ<
M^'+CQE&XABV<_%KG6TV,B<L\_GPRPLT6E1E;B<"%&R+PUQ\(C*VF674@P* <
M""^(55 :=*0A61IZ'$0'&M(=5(8=V^4!0H9M'*3""PN*1MJ#UDFX8&HO2@:A
MC/U5V)\*8@E8&VFX@97&'"?F <=!\KT6FPK"B3'0&U2="!Z1<]R!85<N["@6
M%2!>9R4=75U'!VAEI'@6"&',,4<:9[A!9!@@:%;'06&X$1N<.!VIY8EO2'F0
MCW38]D60+ABW(XL+5GDE&EOMU]Z"8Z1YT EDG* #"#6R 2%H;Q!XHG2!/D@6
M"&*DM499\'$E*0@GF&$II@[::!T*G7U&AW"<>II>J#:.6FI5IT*ZZ@EIO)KI
MIG2\MM6NU/EJ*JKP"61&&'6P(=6E2=(' J">BN#&&U+!"<<;:K*D6'.OC5%&
M"%R$<6""9"W81W?P90O@MK31T6VD'?')8&6*75I"#"[$8,-![[+P7JKU&H:8
M8L(=&^^"]@:8[[YI2I4L"+6"=BD( Q=\, @)+\PP"+1Z!EK$L6HZ<:H5XSM@
M@?QJW&=4'QM70FPEI[H@S%&QG%FO<C$WKW]*6CPS" 8BR)]Q9>"!(0HPQ#NO
M670H8)]YC3H7UE)C#<?<FAU^(95=BKDA%]+:<EM@&6=M]VF_<AZT10ES='&I
M" HO%:]Q8%MGQAEE%%70>6)^Y(;")J -MX(Z\IBJ$8>!-6ZYEEV'81V@@>0F
M"%$/&:X9T8$U>.%<UU=X'7*XJ8,"DL,7A'!<>FAD&;&9!X)O)CH)@F=N$ [6
MAW5RC"&1!8DIQUUY[;5%%X4N%SO#0;@!NAQR0+F[='.$0?AQ1'XT!QQLA)$'
M[@I_>%D9=\0IV9S@3U6&&F40A;[T8IU<9VPMQ! _572H@T%B(P83;>UPP<G2
M]$ @!.$$ 5/L<Q]&#M(I-(U!7;@)0^;29A,T@. .:2K2D<@0/2X-28+P&Q+L
M\L>P,;P!#FG W7'.TB?L-&\[ST.3G8Y#!R)Q\$/_6UWK<*= %H)@"+3K4AWF
M(+<\R5 $<"M=@D#C)WR]L UT*.&40'"&-)#H3<K#"MQ6>#(05! &.KP3IM[@
MAA8XH0I,8(+RMO6:N,DA>E5@HAGU$L;L[$4Y &2=]0A&1O@0(8D'66(3;Q<;
M$1!%#FQH 0D3! (I"-%Z:-Q8Z=I0$#)]$#SG\LP+%8@HXZ3!4R@(6AC3!@(?
M($0A#'%(V/90QE15B$]] MX9.*8]/Y*J#F8P@]Q61+'_",<,;DO<=N2@,!'H
M+EFY9.,9V.4NI_T-/H%LW5;Z]S00' UT;- C+6M)SG+6\I8_]. 3EJ"P_8%
MD<]A4:I.N96EI T%?@-!"&(4MN&8TY9B<6)L#-*^NH5%G@R+V5+& (<\U#,W
MS-,.,^=XS51ETPU;2>59A.,XZU74FQ02"]P^8@9>@H6@*%010J$6SH.,\Y\P
M/6= &0FZ-N#&1$MIRD%_=AQ/@6V?('AC'&<9TY/=L@PN< K3HK@=%E!R#GVZ
M@TH5D("+;L5_HRHJ.6])E18H4H(S!($?Y28&8.[T9'T(*>CL=$J3+M6."2+F
MR<K04G]J5:NW%"C3'AE),CA5?@%L781V6M5+;@6-6;VK4<4"52D5SS?)$R4<
MO!,>3<F586E5K&;SNAU.NL&3ES7.-^=U-=[8ARYN.9,*'"4VP.6F#D2YCDUP
M(@;90BMFR11!1Z!$)R*A $ *X/":)4"E=%!8=I+90K.] .F77,H13FLPJB0
MA"<,X0A%H (4&#>'75ZSNR[H[A<ZXSTB\<$Z0Q""%(H0A"5 "[ILD"X(J&O=
M*61WNR!HG'>AM5H(G0Y,^/1(0:Z)3-81[J&*ZR9\Y4O?Z]Z7N_L=FU/$2]XS
D$,D$UO%#>M?;WO>^@2CQC=!TJSL$^VH7PMV\*,H&:S5ZP4<!
end
--
Dave Abercrombie abe@netcom.com
(415) 442-0102 lyra!abe@wet.com