Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 Aug 1998 20:54:37 +1000
From:      Bruce Evans <bde@zeta.org.au>
To:        bde@zeta.org.au, cracauer@cons.org, current@FreeBSD.ORG, luoqi@watermarkgroup.com, shocking@prth.pgs.com
Subject:   Re: Floating Point Exceptions, signal handlers & subsequent ops
Message-ID:  <199808271054.UAA18772@godzilla.zeta.org.au>

next in thread | raw e-mail | index | archive | help
>> 2) if the SIGFPE was for an FP  operation, then the FP operatation will be
>>    restarted.  The kernel has cleared the trap-pending flag before delivering
>>    the SIGFPE to the application, and on i386's traps are delivered to the
>>    kernel on the the first non-control FP operation after the one that
>>    caused the exception, so it is certain that the restarted FP operation
>>    won't trap; it may cause an exception which will be delivered to the
>>    kernel on the next non-control FP operation.
>
>I'm not able to reproduce this behaviour. I wrote a short test program
>that runs like this:

It's easiest to reproduce it using assembler code - fill up the stack
with near-garbage using 8 fldz's and then attempt to clean up the stack
using 8 fdivp's.  The fdivp's will have no effect except to generate
FP exceptions, but if a compiler had generated them, it would expect
the stack to be clean at the end.

I wrote the assembler code.  Run it under gdb and look at the FP
state using `info float'.  Homework: explain why this generates
only 6 SIGFPE's although it divides by 0.0 by 0.0 8 times.

Bruce

#include <floatingpoint.h>
#include <signal.h>

int
main(void)
{
	/* I'm too lazy to set up signal handler.  Use gdb to watch signals. */
	signal(SIGFPE, SIG_IGN);

	/* Ensure a SIGFPE for 0.0/0.0. */
	fpsetmask(FP_X_INV);

	asm("fldz");
	asm("fldz");
	asm("fldz");
	asm("fldz");
	asm("fldz");
	asm("fldz");
	asm("fldz");
	asm("fldz");
	asm("fdivp %st(0)");
	asm("fdivp %st(0)");
	asm("fdivp %st(0)");
	asm("fdivp %st(0)");
	asm("fdivp %st(0)");
	asm("fdivp %st(0)");
	asm("fdivp %st(0)");
	asm("fdivp %st(0)");

	return (0);
}

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199808271054.UAA18772>