This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Single-precision float version of matherr


The float version of floating point math functions, such as <<sqrtf>>, call the
<<matherr>> function when an error occurs.

<<matherr>> takes the <<exception>> structure (defined in math.h) as an
argument. <<exception>> is reproduced below:
  struct exception
  {
    int type;
    char *name;
    double arg1;
    double arg2;
    double retval;
    int err;
  };

Note that arg1, arg2, and retval are doubles, so conversions from the float
value in the math function to double will require some double arithmeric
routines.

I implemented <<sf_matherr>> (i.e. a single-precision float matherr), and
<<sf_exception>> (i.e. single-precision float exception), and patched 
sqrtf in wf_sqrt.c to use the new constructs.
For msp430-elf this saves 1.5k bytes in a simple program which calls sqrtf,
compared to the current double-precision <<matherr>> and <<exception>>
implementation.
The reduced code size comes from some math functions which are no longer
needed:
  __ashldi3 = 128 bytes
  __extendsfdf2 = 86 bytes
  __make_dp = 52 bytes
  __make_fp = 58 bytes
  __pack_d = 688 bytes
  __truncdfsf2 = 108 bytes
  __unpack_d = 358 bytes

Before I go ahead and fixup the other floating point math functions to use
sf_matherr and sf_exception, is there anything I should be aware of, e.g. any
standards I am breaking by doing this, or any reason the double-precision
arg1, arg2 and retval are useful for single-precision float operations?

My plan for is for the out-of-the-box behaviour to remain the same, but if
the "_SF_MATHERR" symbol is defined, then the alternative implementation will
be used.

Thanks,
Jozef


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]