gbdk-releases/sdcc/device/lib/_fs2ulong.c
2015-01-10 16:25:09 +01:00

63 lines
1.4 KiB
C

/*
** libgcc support for software floating point.
** Copyright (C) 1991 by Pipeline Associates, Inc. All rights reserved.
** Permission is granted to do *anything* you want with this file,
** commercial or otherwise, provided this message remains intact. So there!
** I would appreciate receiving any updates/patches/changes that anyone
** makes, and am willing to be the repository for said changes (am I
** making a big mistake?).
**
** Pat Wood
** Pipeline Associates, Inc.
** pipeline!phw@motown.com or
** sun!pipeline!phw or
** uunet!motown!pipeline!phw
*/
/* (c)2000: hacked a little by johan.knol@iduna.nl for sdcc */
#include <limits.h>
/* the following deal with IEEE single-precision numbers */
#define EXCESS 126
#define SIGNBIT ((unsigned long)0x80000000)
#define HIDDEN (unsigned long)(1 << 23)
#define SIGN(fp) ((fp >> (8*sizeof(fp)-1)) & 1)
#define EXP(fp) (((fp) >> 23) & (unsigned int) 0x00FF)
#define MANT(fp) (((fp) & (unsigned long) 0x007FFFFF) | HIDDEN)
#define PACK(s,e,m) ((s) | ((e) << 23) | (m))
union float_long
{
float f;
long l;
};
/* convert float to unsigned long */
unsigned long
__fs2ulong (float a1)
{
volatile union float_long fl1;
volatile int exp;
volatile long l;
fl1.f = a1;
if (!fl1.l || SIGN(fl1.l))
return (0);
if (a1>=ULONG_MAX)
return ULONG_MAX;
exp = EXP (fl1.l) - EXCESS - 24;
l = MANT (fl1.l);
l >>= -exp;
return l;
}