Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Thu, 15 Mar 2012 06:30:11 +0100
From: Szabolcs Nagy <nsz@...t70.net>
To: musl@...ts.openwall.com
Subject: Re: correctly rounded sqrt

* Rich Felker <dalias@...ifal.cx> [2012-03-15 01:07:48 -0400]:
> Here's the asm version based on fpu status word. I'm not sure if it's
> safe for non-default rounding modes but otherwise it should be
> correct.

up,down,zero rounding should be ok
we change
..xxx|10000..
into one of
..xxx|10100..
..xxx|01100..
and both of them round the same way with ru,rd,rz

> .global sqrt
> .type sqrt,@function
> sqrt:	fldl 4(%esp)
> 	fsqrt
> 	fstsw %ax
> 	sub $12,%esp
> 	fld %st(0)
> 	fstpt (%esp)
> 	mov (%esp),%ecx
> 	and $0x7ff,%ecx
> 	cmp $0x400,%ecx
> 	jnz 1f
> 	and $0x200,%eax
> 	sub $0x100,%eax
> 	sub %eax,(%esp)
here you modify the return value even if it was nan
eg c99 F.9 recommends no nan modifications
if ((y & 0x7fff<<64) == 0x7fff<<64) ...

> 	fstp %st(0)
> 	fldt (%esp)
> 1:	add $12,%esp
> 	fstpl 4(%esp)
> 	fldl 4(%esp)
> 	ret

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.