Single-precision float version of matherr

Jozef Lawrynowicz jozef.l@mittosystems.com
Fri Nov 30 12:42:00 GMT 2018


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



More information about the Newlib mailing list