PATCH: Re: SNaN & QNaN on mips
From: H . J . Lu <hidden>
Date: 2002-02-05 23:05:07
On Tue, Feb 05, 2002 at 05:48:18PM +0800, Zhang Fuxin wrote:
hi,
I am sorry but it seems i can't fix this without ugly changes.
since i am not familiar with gcc code, i decide to leave it to you,
but provide some information instead.
In gcc there are 3 spaces where the NaN handling is assumed the
Intel way.
1. gcc/real.c (the most important one)
here the author seems to have known the NaN pattern problem,so
he leaves a interface macro for defining non intel NaN patterns:
(comment of function "make_nan()",at about line 6219)
/* Output a binary NaN bit pattern in the target machine's format. */
/* If special NaN bit patterns are required, define them in tm.h
as arrays of unsigned 16-bit shorts. Otherwise, use the default
patterns here. */
I have read through this file and decided that the follow defined should
be enough for mips:
/* NaN pattern,mips QNAN & SNAN is different from intel's
* DFMODE_NAN and SFMODE_NAN is used in real.c */
#define DFMODE_NAN \
unsigned short DFbignan[4] = {0x7ff7, 0xffff, 0xffff, 0xffff}; \
unsigned short DFlittlenan[4] = {0xffff, 0xffff, 0xffff, 0xfff7}
#define SFMODE_NAN \
unsigned short SFbignan[2] = {0x7fbf, 0xffff}; \
unsigned short SFlittlenan[2] = {0xffff, 0xffbf}
But the problem is where to put them:(. Obviously it is target specified
definitions and should be in config/mips/. Documents say tm.h is a symbol
link and included in config.h,but it is no long true.If i add them to xm-mips.h
then for native compilation it is ok but it fails for cross-compile.I am enclosing a patch here.
2.gcc/reg-stack.c
There is a hardcoded QNaN used around line 477:
nan = gen_lowpart (SFmode, GEN_INT (0x7fc00000));
I sugest defining a macro QNAN_HAS_1ST_FRACBIT_CLEARED for mips and change
it to,just don't know where to put it:
#ifndef QNAN_HAS_1ST_FRACBIT_CLEARED
nan = gen_lowpart (SFmode, GEN_INT (0x7fc00000));
#else
nan = gen_lowpart (SFmode, GEN_INT (0x7fbfffff));
#endifMIPS doesn't use reg-stack.c.
3. config/fp-bit.c
this is for machine having no fpu hardware.
again i susgest define QNAN_HAS_1ST_FRACBIT_CLEARED and then apply this patch:
190d189
< #ifndef QNAN_HAS_1ST_FRACBIT_CLEARED
192,195d190
< #else
< fraction &= ~QUIET_NAN;
< #endif
<
379,380d373
<
< #ifndef QNAN_HAS_1ST_FRACBIT_CLEARED
382,384d374
< #else
< if (!(fraction & QUIET_NAN))
< #endifThis one is tricky. fp-bit.c is not supposed to be target specific. I think we add SET_QUIET_NAN/IS_QUIET_NAN and provide the special ones for MIPS. H.J. ---- 2002-02-05 H.J. Lu [off-list ref] Base on suggestions from Zhang Fuxin [off-list ref]: * config/mips/mips.h (DFMODE_NAN): Defined. (SFMODE_NAN): Likewise.
--- gcc/config/mips/mips.h.ieee Thu Nov 15 12:21:17 2001
+++ gcc/config/mips/mips.h Tue Feb 5 14:38:11 2002@@ -4637,3 +4637,10 @@ do \ } \ } \ while (0) + +#define DFMODE_NAN \ + unsigned short DFbignan[4] = {0x7ff7, 0xffff, 0xffff, 0xffff}; \ + unsigned short DFlittlenan[4] = {0xffff, 0xffff, 0xffff, 0xfff7} +#define SFMODE_NAN \ + unsigned short SFbignan[2] = {0x7fbf, 0xffff}; \ + unsigned short SFlittlenan[2] = {0xffff, 0xffbf}