9fans - fans of the OS Plan 9 from Bell Labs
 help / color / mirror / Atom feed
* [9fans] emulated fp on arm
@ 2013-01-28 17:08 erik quanstrom
  2013-01-28 17:10 ` erik quanstrom
  2013-01-29 22:10 ` Richard Miller
  0 siblings, 2 replies; 7+ messages in thread
From: erik quanstrom @ 2013-01-28 17:08 UTC (permalink / raw)
  To: 9fans

speaking of arm issues ...

this problem was causing a script of mine to fail.

kw; awk 'BEGIN {print -1 + 1; if ((-1 + 1) == 0) print "yes"; else print "no"}'
-0
no

i'm not a fp expert, but i think there are two problems here.  first
it is bad form to generate -0 in the emulator, even if it is technically
correct, and second, -0 is defined to be equal to 0 by the spec, so
-0 == 0 should always be true.

here's a fix for the first issue.  it is sufficient to catch the case above.

; diffy -c fpi.h
/n/dump/2013/0125/sys/src/9/omap/fpi.h:37,43 - fpi.h:37,43
  #define	SetQNaN(n)	((n)->s = 0, (n)->e = ExpInfinity, 		\
  			 (n)->h = HiddenBit|(LsBit<<1), (n)->l = 0)
  #define IsZero(n)	((n)->e == 1 && (n)->h == 0 && (n)->l == 0)
- #define SetZero(n)	((n)->e = 1, (n)->h = 0, (n)->l = 0)
+ #define SetZero(n)	((n)->s = 0, (n)->e = 1, (n)->h = 0, (n)->l = 0)

  /*
   * fpi.c

for maximum completeness, fpicmp could be corrected as follows.
i haven't done this yet since atof(2) doesn't generate them.

int
fpicmp(Internal *x, Internal *y)
{
	if(IsNaN(x) && IsNaN(y))
		return 0;
	if(IsInfinity(x) && IsInfinity(y))
		return y->s - x->s;
	if(x->e == y->e && x->h == y->h && x->l == y->l){
>>		if(IsZero(y))
>>			return 0;
		return y->s - x->s;
	}
	if(x->e < y->e
	   || (x->e == y->e && (x->h < y->h || (x->h == y->h && x->l < y->l))))
		return y->s ? 1: -1;
	return x->s ? -1: 1;
}

- erik



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2013-01-31  3:50 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-01-28 17:08 [9fans] emulated fp on arm erik quanstrom
2013-01-28 17:10 ` erik quanstrom
2013-01-29 22:10 ` Richard Miller
2013-01-29 22:44   ` erik quanstrom
2013-01-30 10:35     ` Richard Miller
2013-01-30 22:18     ` Bakul Shah
2013-01-31  3:50       ` erik quanstrom

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).