*BSD News Article 5474


Return to BSD News archive

Newsgroups: comp.unix.bsd
Path: sserve!manuel!munnari.oz.au!spool.mu.edu!nigel.msen.com!sdd.hp.com!swrinde!cs.utexas.edu!torn!watserv2.uwaterloo.ca!watdragon.uwaterloo.ca!kcwellsc
From: kcwellsc@watdragon.uwaterloo.ca (Ken Wellsch)
Subject: Re: gcc-2.2.2, BSDI, runtime errors in fixdfsi.o !?!?
Message-ID: <Bv1C4D.E9B@watdragon.uwaterloo.ca>
Organization: University of Waterloo
References: <BuzwJJ.MH0@immd4.informatik.uni-erlangen.de>
Date: Wed, 23 Sep 1992 14:26:37 GMT
Lines: 31

You can't use gcc to build gcc.  At least you can't compile gnulib1.c
as it requires a local non-gcc compiler.  Otherwise compiling

int __fixdfsi(d) double d; { return((int)d); }

for example will have gcc produce a call to fixdfsi to do the float to int
conversion (recursion occurs obviously).  Thus 386bsd provides assembler
copies for such built-in operations with gcc-1.39.

The copy of __fixdfsi in 386bsd does not switch the '387 to truncate
mode so float->int rounds rather than truncates as "defined" in K&R.

Here is a copy that I compiled on a Dynix 386 system (some 386/387
wizard can clean up the thing to make it shorter if they like):

	.globl	___fixdfsi
___fixdfsi:
	pushl	%ebp
	movl	%esp,%ebp
	subl	$12,%esp
	fstcw	-4(%ebp)	/ stash current '387 control word
	movw	-4(%ebp),%ax
	orb	$12,%ah		/ set "truncate" mode
	movw	%ax,-2(%ebp)
	fldcw	-2(%ebp)	/ set control word on '387
	fldl	8(%ebp)		/ load double onto '387 stack
	fistpl	-12(%ebp)	/ store as int off '387 stack
	fldcw	-4(%ebp)	/ restore previous '387 control word
	movl	-12(%ebp),%eax
	leave	
	ret