From mboxrd@z Thu Jan 1 00:00:00 1970 From: erik quanstrom Date: Mon, 28 Jan 2013 12:08:14 -0500 To: 9fans@9fans.net Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Subject: [9fans] emulated fp on arm Topicbox-Message-UUID: 0fe50124-ead8-11e9-9d60-3106f5b1d025 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