Return to BSD News archive
Received: by minnie.vk1xwt.ampr.org with NNTP id AA1618 ; Tue, 23 Feb 93 14:50:45 EST Path: sserve!manuel.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!agate!doc.ic.ac.uk!pipex!seunet!sunic!news.funet.fi!fuug!kiae!relcom!newsserv From: "Andrew A. Chernov, Black Mage" <ache@astral.msk.su> Newsgroups: comp.unix.bsd Subject: Re: [386bsd] Libc error converting double to int Date: Thu, 18 Feb 93 05:46:59 +0300 Distribution: world Organization: Ha-oh-lahm Yetzirah Message-ID: <tGZYlWhOR1@astral.msk.su> Sender: news-service@newcom.kiae.su Reply-To: ache@astral.msk.su Lines: 151 I write: >> Please, send me fixed version of fixdfsi.s, I am not >> experienced in math coprocessor to fix it. Thanx to all peoples involved, this problem are gone, here working fix from Kenji: Article: 7156 of comp.unix.bsd Path: fcom.cc.utah.edu!hellgate.utah.edu!cs.utexas.edu!sun-barr!sh.wide!wnoc-kyo!astemgw!kocb!yab From: yab@kocb.kocb.astem.or.jp (Kenji Yabuuchi) Newsgroups: comp.unix.bsd Subject: BUG: assigning float to int. Message-ID: <YAB.92Dec8145855@kocb.kocb.astem.or.jp> Date: 8 Dec 92 05:58:55 GMT Sender: news@kocb.astem.or.jp Organization: Kubota, Kyoto Office of Computer Business Lines: 121 Nntp-Posting-Host: kocb I'm using 386BSD and gcc-1.39. And I found that when assigning a floating point number to an integer, it rounds the value rather than truncate. This is because there is a wrong assumption about rounding control bits of control word of floating point unit in the following libraries: ___fixdfsi (/usr/src/lib/libc/i386/gen/fixdfsi.s) ___fixundfsi (/usr/src/lib/libc/i386/gen/fixunsdfsi.s) These libraries are also in /usr/src/usr.bin/gcc/gnulib/i386 directory. I don't know which is better, to rewrite these libraries or rewrite floating point unit intialization codes. However, in the source code of function modf(/usr/src/lib/libc/i386/gen/modf.s), there is a rounding control bits processing. So I fix the libraries. The diff against the original codes are following. *** fixdfsi.s.orig Wed Dec 9 07:20:01 1992 --- fixdfsi.s Wed Dec 9 07:22:57 1992 *************** *** 40,46 **** .globl ___fixdfsi ___fixdfsi: ! fldl 4(%esp) ! fistpl 4(%esp) ! movl 4(%esp),%eax ret --- 40,60 ---- .globl ___fixdfsi ___fixdfsi: ! enter $20, $0 ! ! fnstcw -4(%ebp) ! movw -4(%ebp), %dx ! orw $0xc00, %dx /* set truncate bits */ ! movw %dx, -8(%ebp) ! fldcw -8(%ebp) /* save it to control word */ ! ! movl 8(%ebp), %edx /* copy arg to local */ ! movl 12(%ebp), %ecx ! movl %edx, -20(%ebp) ! movl %ecx, -16(%ebp) ! fldl -20(%ebp) ! fistpl -12(%ebp) /* truncate it */ ! fldcw -4(%ebp) /* restore control word */ ! movl -12(%ebp), %eax ! leave ret *** fixunsdfsi.s.orig Wed Dec 9 07:19:51 1992 --- fixunsdfsi.s Wed Dec 9 07:19:33 1992 *************** *** 40,60 **** .globl ___fixunsdfsi ___fixunsdfsi: ! fldl 4(%esp) /* argument double to accum stack */ ! frndint /* create integer */ ! fcoml fbiggestsigned /* bigger than biggest signed? */ fstsw %ax sahf jnb 1f ! fistpl 4(%esp) ! movl 4(%esp),%eax ret ! 1: fsubl fbiggestsigned /* reduce for proper conversion */ ! fistpl 4(%esp) /* convert */ ! movl 4(%esp),%eax orl $0x80000000,%eax /* restore bias */ ret fbiggestsigned: .double 0r2147483648.0 --- 40,76 ---- .globl ___fixunsdfsi ___fixunsdfsi: ! enter $20, $0 ! ! fnstcw -4(%ebp) ! movw -4(%ebp), %dx ! orw $0xc00, %dx /* set truncate bits */ ! movw %dx, -8(%ebp) ! fldcw -8(%ebp) /* save it to control word */ ! ! movl 8(%ebp), %edx /* copy arg to local */ ! movl 12(%ebp), %ecx ! movl %edx, -20(%ebp) ! movl %ecx, -16(%ebp) ! fldl -20(%ebp) /* argument double to accum stack */ ! frndint /* create integer */ ! fcoml fbiggestsigned /* bigger than biggest signed? */ fstsw %ax sahf jnb 1f ! fistpl -12(%ebp) ! fldcw -4(%ebp) /* restore control word */ ! movl -12(%ebp),%eax ! leave ret ! 1: fsubl fbiggestsigned /* reduce for proper conversion */ ! fistpl -12(%ebp) /* convert */ ! fldcw -4(%ebp) /* restore control word */ ! movl -12(%ebp),%eax orl $0x80000000,%eax /* restore bias */ + leave ret fbiggestsigned: .double 0r2147483648.0 --- Kenji Yabuuchi KUBOTA corporation yab@kocb.astem.or.jp ASTEM RI -- In-This-Life: Andrew A. Chernov | "Hay mas dicha, mas contento Internet: ache@astral.msk.su | "Que adorar una hermosura FIDOnet: 2:5020/23.34 | "Brujuleada entre los lejos Organization: The RELCOM Corp. | "De lo imposible?!" (Calderon)