h8300.h (TARGET_H8300H, [...]): Make sure UNITS_PER_WORD and BITS_PER_WORD are compile time constants when...
* config/h8300/h8300.h (TARGET_H8300H, TARGET_H8300S): Make sure UNITS_PER_WORD and BITS_PER_WORD are compile time constants when compiling libgcc2. * config/mips/mips.h (TARGET_64BIT): Likewise. * config/rs6000/rs6000.h (TARGET_POWERPC64): Likewise. * libgcc2.c: Use {,U}{HW,W,DW}type and DWunion everywhere instead of {SI,DI}type and DIunion. Define these types to QI/HI modes on dsps. Give routines proper names if SI/DI modes are not used. * longlong.h: Use DWunion instead of DIunion. From-SVN: r31095
This commit is contained in:
parent
9310f1eb4c
commit
996ed075bd
@ -1,3 +1,15 @@
|
||||
1999-12-17 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* config/h8300/h8300.h (TARGET_H8300H, TARGET_H8300S): Make sure
|
||||
UNITS_PER_WORD and BITS_PER_WORD are compile time constants when
|
||||
compiling libgcc2.
|
||||
* config/mips/mips.h (TARGET_64BIT): Likewise.
|
||||
* config/rs6000/rs6000.h (TARGET_POWERPC64): Likewise.
|
||||
* libgcc2.c: Use {,U}{HW,W,DW}type and DWunion everywhere instead
|
||||
of {SI,DI}type and DIunion. Define these types to QI/HI modes on
|
||||
dsps. Give routines proper names if SI/DI modes are not used.
|
||||
* longlong.h: Use DWunion instead of DIunion.
|
||||
|
||||
1999-12-26 Zack Weinberg <zack@wolery.cumb.org>
|
||||
|
||||
* acconfig.h: New ENABLE flags: TREE_CHECKING, RTL_CHECKING,
|
||||
|
@ -112,6 +112,23 @@ extern int target_flags;
|
||||
{"align-300", 8192, "Use H8/300 alignment rules"}, \
|
||||
{ "", TARGET_DEFAULT, NULL}}
|
||||
|
||||
#ifdef IN_LIBGCC2
|
||||
#undef TARGET_H8300H
|
||||
#undef TARGET_H8300S
|
||||
/* If compiling libgcc2, make these compile time constants based on what
|
||||
flags are we actually compiling with. */
|
||||
#ifdef __H8300H__
|
||||
#define TARGET_H8300H 1
|
||||
#else
|
||||
#define TARGET_H8300H 0
|
||||
#endif
|
||||
#ifdef __H8300S__
|
||||
#define TARGET_H8300S 1
|
||||
#else
|
||||
#define TARGET_H8300S 0
|
||||
#endif
|
||||
#endif /* !IN_LIBGCC2 */
|
||||
|
||||
/* Do things that must be done once at start up. */
|
||||
|
||||
#define OVERRIDE_OPTIONS \
|
||||
|
@ -481,6 +481,16 @@ extern void sbss_section PARAMS ((void));
|
||||
#define MIPS_ISA_DEFAULT 1
|
||||
#endif
|
||||
|
||||
#ifdef IN_LIBGCC2
|
||||
#undef TARGET_64BIT
|
||||
/* Make this compile time constant for libgcc2 */
|
||||
#ifdef __mips64
|
||||
#define TARGET_64BIT 1
|
||||
#else
|
||||
#define TARGET_64BIT 0
|
||||
#endif
|
||||
#else /* IN_LIBGCC2 */
|
||||
|
||||
#ifndef MULTILIB_ENDIAN_DEFAULT
|
||||
#if TARGET_ENDIAN_DEFAULT == 0
|
||||
#define MULTILIB_ENDIAN_DEFAULT "EL"
|
||||
|
@ -303,6 +303,16 @@ extern int target_flags;
|
||||
#define TARGET_UPDATE (! TARGET_NO_UPDATE)
|
||||
#define TARGET_FUSED_MADD (! TARGET_NO_FUSED_MADD)
|
||||
|
||||
#ifdef IN_LIBGCC2
|
||||
/* For libgcc2 we make sure this is a compile time constant */
|
||||
#undef TARGET_POWERPC64
|
||||
#ifdef __64BIT__
|
||||
#define TARGET_POWERPC64 1
|
||||
#else
|
||||
#define TARGET_POWERPC64 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Pseudo target to indicate whether the object format is ELF
|
||||
(to get around not having conditional compilation in the md file) */
|
||||
#ifndef TARGET_ELF
|
||||
|
474
gcc/libgcc2.c
474
gcc/libgcc2.c
@ -95,11 +95,22 @@ extern int atexit(void (*)(void));
|
||||
because the sizes for those types can be configured to be anything.
|
||||
Instead we use the following special type names. */
|
||||
|
||||
typedef int QItype __attribute__ ((mode (QI)));
|
||||
typedef unsigned int UQItype __attribute__ ((mode (QI)));
|
||||
typedef int HItype __attribute__ ((mode (HI)));
|
||||
typedef unsigned int UHItype __attribute__ ((mode (HI)));
|
||||
#if UNITS_PER_WORD > 1
|
||||
/* These typedefs are usually forbidden on dsp's with UNITS_PER_WORD 1 */
|
||||
typedef int SItype __attribute__ ((mode (SI)));
|
||||
typedef unsigned int USItype __attribute__ ((mode (SI)));
|
||||
#if UNITS_PER_WORD > 2
|
||||
/* These typedefs are usually forbidden on archs with UNITS_PER_WORD 2 */
|
||||
typedef int DItype __attribute__ ((mode (DI)));
|
||||
typedef unsigned int UDItype __attribute__ ((mode (DI)));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if BITS_PER_UNIT == 8
|
||||
|
||||
typedef float SFtype __attribute__ ((mode (SF)));
|
||||
typedef float DFtype __attribute__ ((mode (DF)));
|
||||
@ -111,6 +122,29 @@ typedef float XFtype __attribute__ ((mode (XF)));
|
||||
typedef float TFtype __attribute__ ((mode (TF)));
|
||||
#endif
|
||||
|
||||
#else /* BITS_PER_UNIT != 8 */
|
||||
|
||||
/* On dsp's there are usually qf/hf/tqf modes used instead of the above.
|
||||
For now we don't support them in libgcc2.c. */
|
||||
|
||||
#undef L_fixdfdi
|
||||
#undef L_fixsfdi
|
||||
#undef L_fixtfdi
|
||||
#undef L_fixunsdfdi
|
||||
#undef L_fixunsdfsi
|
||||
#undef L_fixunssfdi
|
||||
#undef L_fixunssfsi
|
||||
#undef L_fixunstfdi
|
||||
#undef L_fixunsxfdi
|
||||
#undef L_fixunsxfsi
|
||||
#undef L_fixxfdi
|
||||
#undef L_floatdidf
|
||||
#undef L_floatdisf
|
||||
#undef L_floatditf
|
||||
#undef L_floatdixf
|
||||
|
||||
#endif /* BITS_PER_UNIT != 8 */
|
||||
|
||||
typedef int word_type __attribute__ ((mode (__word__)));
|
||||
|
||||
/* Make sure that we don't accidentally use any normal C language built-in
|
||||
@ -127,23 +161,75 @@ typedef int word_type __attribute__ ((mode (__word__)));
|
||||
#define float bogus_type
|
||||
#define double bogus_type
|
||||
|
||||
#if BITS_PER_UNIT == 8
|
||||
#define SI_TYPE_SIZE 32
|
||||
#else
|
||||
#define SI_TYPE_SIZE (sizeof (SItype) * BITS_PER_UNIT)
|
||||
#endif
|
||||
#define W_TYPE_SIZE SI_TYPE_SIZE
|
||||
#if UNITS_PER_WORD > 2
|
||||
#define W_TYPE_SIZE (4 * BITS_PER_UNIT)
|
||||
#define Wtype SItype
|
||||
#define UWtype USItype
|
||||
#define HWtype SItype
|
||||
#define UHWtype USItype
|
||||
#define DWtype DItype
|
||||
#define UDWtype UDItype
|
||||
#define __NW(a,b) __ ## a ## si ## b
|
||||
#define __NDW(a,b) __ ## a ## di ## b
|
||||
#elif UNITS_PER_WORD > 1
|
||||
#define W_TYPE_SIZE (2 * BITS_PER_UNIT)
|
||||
#define Wtype HItype
|
||||
#define UWtype UHItype
|
||||
#define HWtype HItype
|
||||
#define UHWtype UHItype
|
||||
#define DWtype SItype
|
||||
#define UDWtype USItype
|
||||
#define __NW(a,b) __ ## a ## hi ## b
|
||||
#define __NDW(a,b) __ ## a ## si ## b
|
||||
#else
|
||||
#define W_TYPE_SIZE BITS_PER_UNIT
|
||||
#define Wtype QItype
|
||||
#define UWtype UQItype
|
||||
#define HWtype QItype
|
||||
#define UHWtype UQItype
|
||||
#define DWtype HItype
|
||||
#define UDWtype UHItype
|
||||
#define __NW(a,b) __ ## a ## qi ## b
|
||||
#define __NDW(a,b) __ ## a ## hi ## b
|
||||
#endif
|
||||
|
||||
/* DIstructs are pairs of SItype values in the order determined by
|
||||
#define __muldi3 __NDW(mul,3)
|
||||
#define __divdi3 __NDW(div,3)
|
||||
#define __udivdi3 __NDW(udiv,3)
|
||||
#define __moddi3 __NDW(mod,3)
|
||||
#define __umoddi3 __NDW(umod,3)
|
||||
#define __negdi2 __NDW(neg,2)
|
||||
#define __lshrdi3 __NDW(lshr,3)
|
||||
#define __ashldi3 __NDW(ashl,3)
|
||||
#define __ashrdi3 __NDW(ashr,3)
|
||||
#define __ffsdi2 __NDW(ffs,2)
|
||||
#define __cmpdi2 __NDW(cmp,2)
|
||||
#define __ucmpdi2 __NDW(ucmp,2)
|
||||
#define __udivmoddi4 __NDW(udivmod,4)
|
||||
#define __fixunstfdi __NDW(fixunstf,)
|
||||
#define __fixtfdi __NDW(fixtf,)
|
||||
#define __fixunsxfdi __NDW(fixunsxf,)
|
||||
#define __fixxfdi __NDW(fixxf,)
|
||||
#define __fixunsdfdi __NDW(fixunsdf,)
|
||||
#define __fixdfdi __NDW(fixdf,)
|
||||
#define __fixunssfdi __NDW(fixunssf,)
|
||||
#define __fixsfdi __NDW(fixsf,)
|
||||
#define __floatdixf __NDW(float,xf)
|
||||
#define __floatditf __NDW(float,tf)
|
||||
#define __floatdidf __NDW(float,df)
|
||||
#define __floatdisf __NDW(float,sf)
|
||||
#define __fixunsxfsi __NW(fixunsxf,)
|
||||
#define __fixunstfsi __NW(fixunstf,)
|
||||
#define __fixunsdfsi __NW(fixunsdf,)
|
||||
#define __fixunssfsi __NW(fixunssf,)
|
||||
|
||||
/* DWstructs are pairs of Wtype values in the order determined by
|
||||
LIBGCC2_WORDS_BIG_ENDIAN. */
|
||||
|
||||
#if LIBGCC2_WORDS_BIG_ENDIAN
|
||||
struct DIstruct {SItype high, low;};
|
||||
struct DWstruct {Wtype high, low;};
|
||||
#else
|
||||
struct DIstruct {SItype low, high;};
|
||||
struct DWstruct {Wtype low, high;};
|
||||
#endif
|
||||
|
||||
/* We need this union to unpack/pack DImode values, since we don't have
|
||||
@ -152,9 +238,9 @@ typedef int word_type __attribute__ ((mode (__word__)));
|
||||
|
||||
typedef union
|
||||
{
|
||||
struct DIstruct s;
|
||||
DItype ll;
|
||||
} DIunion;
|
||||
struct DWstruct s;
|
||||
DWtype ll;
|
||||
} DWunion;
|
||||
|
||||
#if (defined (L_udivmoddi4) || defined (L_muldi3) || defined (L_udiv_w_sdiv)\
|
||||
|| defined (L_divdi3) || defined (L_udivdi3) \
|
||||
@ -164,29 +250,21 @@ typedef union
|
||||
|
||||
#endif /* udiv or mul */
|
||||
|
||||
extern DItype __fixunssfdi (SFtype a);
|
||||
extern DItype __fixunsdfdi (DFtype a);
|
||||
#if LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96
|
||||
extern DItype __fixunsxfdi (XFtype a);
|
||||
#endif
|
||||
#if LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128
|
||||
extern DItype __fixunstfdi (TFtype a);
|
||||
#endif
|
||||
|
||||
#if defined (L_negdi2) || defined (L_divdi3) || defined (L_moddi3)
|
||||
#if defined (L_divdi3) || defined (L_moddi3)
|
||||
static inline
|
||||
#endif
|
||||
DItype
|
||||
__negdi2 (DItype u)
|
||||
DWtype
|
||||
__negdi2 (DWtype u)
|
||||
{
|
||||
DIunion w;
|
||||
DIunion uu;
|
||||
DWunion w;
|
||||
DWunion uu;
|
||||
|
||||
uu.ll = u;
|
||||
|
||||
w.s.low = -uu.s.low;
|
||||
w.s.high = -uu.s.high - ((USItype) w.s.low > 0);
|
||||
w.s.high = -uu.s.high - ((UWtype) w.s.low > 0);
|
||||
|
||||
return w.ll;
|
||||
}
|
||||
@ -195,29 +273,29 @@ __negdi2 (DItype u)
|
||||
/* Unless shift functions are defined whith full ANSI prototypes,
|
||||
parameter b will be promoted to int if word_type is smaller than an int. */
|
||||
#ifdef L_lshrdi3
|
||||
DItype
|
||||
__lshrdi3 (DItype u, word_type b)
|
||||
DWtype
|
||||
__lshrdi3 (DWtype u, word_type b)
|
||||
{
|
||||
DIunion w;
|
||||
DWunion w;
|
||||
word_type bm;
|
||||
DIunion uu;
|
||||
DWunion uu;
|
||||
|
||||
if (b == 0)
|
||||
return u;
|
||||
|
||||
uu.ll = u;
|
||||
|
||||
bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
|
||||
bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
|
||||
if (bm <= 0)
|
||||
{
|
||||
w.s.high = 0;
|
||||
w.s.low = (USItype)uu.s.high >> -bm;
|
||||
w.s.low = (UWtype)uu.s.high >> -bm;
|
||||
}
|
||||
else
|
||||
{
|
||||
USItype carries = (USItype)uu.s.high << bm;
|
||||
w.s.high = (USItype)uu.s.high >> b;
|
||||
w.s.low = ((USItype)uu.s.low >> b) | carries;
|
||||
UWtype carries = (UWtype)uu.s.high << bm;
|
||||
w.s.high = (UWtype)uu.s.high >> b;
|
||||
w.s.low = ((UWtype)uu.s.low >> b) | carries;
|
||||
}
|
||||
|
||||
return w.ll;
|
||||
@ -225,29 +303,29 @@ __lshrdi3 (DItype u, word_type b)
|
||||
#endif
|
||||
|
||||
#ifdef L_ashldi3
|
||||
DItype
|
||||
__ashldi3 (DItype u, word_type b)
|
||||
DWtype
|
||||
__ashldi3 (DWtype u, word_type b)
|
||||
{
|
||||
DIunion w;
|
||||
DWunion w;
|
||||
word_type bm;
|
||||
DIunion uu;
|
||||
DWunion uu;
|
||||
|
||||
if (b == 0)
|
||||
return u;
|
||||
|
||||
uu.ll = u;
|
||||
|
||||
bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
|
||||
bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
|
||||
if (bm <= 0)
|
||||
{
|
||||
w.s.low = 0;
|
||||
w.s.high = (USItype)uu.s.low << -bm;
|
||||
w.s.high = (UWtype)uu.s.low << -bm;
|
||||
}
|
||||
else
|
||||
{
|
||||
USItype carries = (USItype)uu.s.low >> bm;
|
||||
w.s.low = (USItype)uu.s.low << b;
|
||||
w.s.high = ((USItype)uu.s.high << b) | carries;
|
||||
UWtype carries = (UWtype)uu.s.low >> bm;
|
||||
w.s.low = (UWtype)uu.s.low << b;
|
||||
w.s.high = ((UWtype)uu.s.high << b) | carries;
|
||||
}
|
||||
|
||||
return w.ll;
|
||||
@ -255,30 +333,30 @@ __ashldi3 (DItype u, word_type b)
|
||||
#endif
|
||||
|
||||
#ifdef L_ashrdi3
|
||||
DItype
|
||||
__ashrdi3 (DItype u, word_type b)
|
||||
DWtype
|
||||
__ashrdi3 (DWtype u, word_type b)
|
||||
{
|
||||
DIunion w;
|
||||
DWunion w;
|
||||
word_type bm;
|
||||
DIunion uu;
|
||||
DWunion uu;
|
||||
|
||||
if (b == 0)
|
||||
return u;
|
||||
|
||||
uu.ll = u;
|
||||
|
||||
bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
|
||||
bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
|
||||
if (bm <= 0)
|
||||
{
|
||||
/* w.s.high = 1..1 or 0..0 */
|
||||
w.s.high = uu.s.high >> (sizeof (SItype) * BITS_PER_UNIT - 1);
|
||||
w.s.high = uu.s.high >> (sizeof (Wtype) * BITS_PER_UNIT - 1);
|
||||
w.s.low = uu.s.high >> -bm;
|
||||
}
|
||||
else
|
||||
{
|
||||
USItype carries = (USItype)uu.s.high << bm;
|
||||
UWtype carries = (UWtype)uu.s.high << bm;
|
||||
w.s.high = uu.s.high >> b;
|
||||
w.s.low = ((USItype)uu.s.low >> b) | carries;
|
||||
w.s.low = ((UWtype)uu.s.low >> b) | carries;
|
||||
}
|
||||
|
||||
return w.ll;
|
||||
@ -286,10 +364,10 @@ __ashrdi3 (DItype u, word_type b)
|
||||
#endif
|
||||
|
||||
#ifdef L_ffsdi2
|
||||
DItype
|
||||
__ffsdi2 (DItype u)
|
||||
DWtype
|
||||
__ffsdi2 (DWtype u)
|
||||
{
|
||||
DIunion uu, w;
|
||||
DWunion uu, w;
|
||||
uu.ll = u;
|
||||
w.s.high = 0;
|
||||
w.s.low = ffs (uu.s.low);
|
||||
@ -298,7 +376,7 @@ __ffsdi2 (DItype u)
|
||||
w.s.low = ffs (uu.s.high);
|
||||
if (w.s.low != 0)
|
||||
{
|
||||
w.s.low += BITS_PER_UNIT * sizeof (SItype);
|
||||
w.s.low += BITS_PER_UNIT * sizeof (Wtype);
|
||||
return w.ll;
|
||||
}
|
||||
return w.ll;
|
||||
@ -306,18 +384,18 @@ __ffsdi2 (DItype u)
|
||||
#endif
|
||||
|
||||
#ifdef L_muldi3
|
||||
DItype
|
||||
__muldi3 (DItype u, DItype v)
|
||||
DWtype
|
||||
__muldi3 (DWtype u, DWtype v)
|
||||
{
|
||||
DIunion w;
|
||||
DIunion uu, vv;
|
||||
DWunion w;
|
||||
DWunion uu, vv;
|
||||
|
||||
uu.ll = u,
|
||||
vv.ll = v;
|
||||
|
||||
w.ll = __umulsidi3 (uu.s.low, vv.s.low);
|
||||
w.s.high += ((USItype) uu.s.low * (USItype) vv.s.high
|
||||
+ (USItype) uu.s.high * (USItype) vv.s.low);
|
||||
w.s.high += ((UWtype) uu.s.low * (UWtype) vv.s.high
|
||||
+ (UWtype) uu.s.high * (UWtype) vv.s.low);
|
||||
|
||||
return w.ll;
|
||||
}
|
||||
@ -325,15 +403,15 @@ __muldi3 (DItype u, DItype v)
|
||||
|
||||
#ifdef L_udiv_w_sdiv
|
||||
#if defined (sdiv_qrnnd)
|
||||
USItype
|
||||
__udiv_w_sdiv (USItype *rp, USItype a1, USItype a0, USItype d)
|
||||
UWtype
|
||||
__udiv_w_sdiv (UWtype *rp, UWtype a1, UWtype a0, UWtype d)
|
||||
{
|
||||
USItype q, r;
|
||||
USItype c0, c1, b1;
|
||||
UWtype q, r;
|
||||
UWtype c0, c1, b1;
|
||||
|
||||
if ((SItype) d >= 0)
|
||||
if ((Wtype) d >= 0)
|
||||
{
|
||||
if (a1 < d - a1 - (a0 >> (SI_TYPE_SIZE - 1)))
|
||||
if (a1 < d - a1 - (a0 >> (W_TYPE_SIZE - 1)))
|
||||
{
|
||||
/* dividend, divisor, and quotient are nonnegative */
|
||||
sdiv_qrnnd (q, r, a1, a0, d);
|
||||
@ -341,18 +419,18 @@ __udiv_w_sdiv (USItype *rp, USItype a1, USItype a0, USItype d)
|
||||
else
|
||||
{
|
||||
/* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d */
|
||||
sub_ddmmss (c1, c0, a1, a0, d >> 1, d << (SI_TYPE_SIZE - 1));
|
||||
sub_ddmmss (c1, c0, a1, a0, d >> 1, d << (W_TYPE_SIZE - 1));
|
||||
/* Divide (c1*2^32 + c0) by d */
|
||||
sdiv_qrnnd (q, r, c1, c0, d);
|
||||
/* Add 2^31 to quotient */
|
||||
q += (USItype) 1 << (SI_TYPE_SIZE - 1);
|
||||
q += (UWtype) 1 << (W_TYPE_SIZE - 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
b1 = d >> 1; /* d/2, between 2^30 and 2^31 - 1 */
|
||||
c1 = a1 >> 1; /* A/2 */
|
||||
c0 = (a1 << (SI_TYPE_SIZE - 1)) + (a0 >> 1);
|
||||
c0 = (a1 << (W_TYPE_SIZE - 1)) + (a0 >> 1);
|
||||
|
||||
if (a1 < b1) /* A < 2^32*b1, so A/2 < 2^31*b1 */
|
||||
{
|
||||
@ -423,11 +501,11 @@ __udiv_w_sdiv (USItype *rp, USItype a1, USItype a0, USItype d)
|
||||
}
|
||||
#else
|
||||
/* If sdiv_qrnnd doesn't exist, define dummy __udiv_w_sdiv. */
|
||||
USItype
|
||||
__udiv_w_sdiv (USItype *rp __attribute__ ((__unused__)),
|
||||
USItype a1 __attribute__ ((__unused__)),
|
||||
USItype a0 __attribute__ ((__unused__)),
|
||||
USItype d __attribute__ ((__unused__)))
|
||||
UWtype
|
||||
__udiv_w_sdiv (UWtype *rp __attribute__ ((__unused__)),
|
||||
UWtype a1 __attribute__ ((__unused__)),
|
||||
UWtype a0 __attribute__ ((__unused__)),
|
||||
UWtype d __attribute__ ((__unused__)))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@ -456,15 +534,15 @@ static const UQItype __clz_tab[] =
|
||||
defined (L_umoddi3) || defined (L_moddi3))
|
||||
static inline
|
||||
#endif
|
||||
UDItype
|
||||
__udivmoddi4 (UDItype n, UDItype d, UDItype *rp)
|
||||
UDWtype
|
||||
__udivmoddi4 (UDWtype n, UDWtype d, UDWtype *rp)
|
||||
{
|
||||
DIunion ww;
|
||||
DIunion nn, dd;
|
||||
DIunion rr;
|
||||
USItype d0, d1, n0, n1, n2;
|
||||
USItype q0, q1;
|
||||
USItype b, bm;
|
||||
DWunion ww;
|
||||
DWunion nn, dd;
|
||||
DWunion rr;
|
||||
UWtype d0, d1, n0, n1, n2;
|
||||
UWtype q0, q1;
|
||||
UWtype b, bm;
|
||||
|
||||
nn.ll = n;
|
||||
dd.ll = d;
|
||||
@ -523,7 +601,7 @@ __udivmoddi4 (UDItype n, UDItype d, UDItype *rp)
|
||||
denominator set. */
|
||||
|
||||
d0 = d0 << bm;
|
||||
n1 = (n1 << bm) | (n0 >> (SI_TYPE_SIZE - bm));
|
||||
n1 = (n1 << bm) | (n0 >> (W_TYPE_SIZE - bm));
|
||||
n0 = n0 << bm;
|
||||
}
|
||||
|
||||
@ -548,7 +626,7 @@ __udivmoddi4 (UDItype n, UDItype d, UDItype *rp)
|
||||
leading quotient digit q1 = 1).
|
||||
|
||||
This special case is necessary, not an optimization.
|
||||
(Shifts counts of SI_TYPE_SIZE are undefined.) */
|
||||
(Shifts counts of W_TYPE_SIZE are undefined.) */
|
||||
|
||||
n1 -= d0;
|
||||
q1 = 1;
|
||||
@ -557,7 +635,7 @@ __udivmoddi4 (UDItype n, UDItype d, UDItype *rp)
|
||||
{
|
||||
/* Normalize. */
|
||||
|
||||
b = SI_TYPE_SIZE - bm;
|
||||
b = W_TYPE_SIZE - bm;
|
||||
|
||||
d0 = d0 << bm;
|
||||
n2 = n1 >> b;
|
||||
@ -634,10 +712,10 @@ __udivmoddi4 (UDItype n, UDItype d, UDItype *rp)
|
||||
}
|
||||
else
|
||||
{
|
||||
USItype m1, m0;
|
||||
UWtype m1, m0;
|
||||
/* Normalize. */
|
||||
|
||||
b = SI_TYPE_SIZE - bm;
|
||||
b = W_TYPE_SIZE - bm;
|
||||
|
||||
d1 = (d1 << bm) | (d0 >> b);
|
||||
d0 = d0 << bm;
|
||||
@ -675,12 +753,12 @@ __udivmoddi4 (UDItype n, UDItype d, UDItype *rp)
|
||||
#endif
|
||||
|
||||
#ifdef L_divdi3
|
||||
DItype
|
||||
__divdi3 (DItype u, DItype v)
|
||||
DWtype
|
||||
__divdi3 (DWtype u, DWtype v)
|
||||
{
|
||||
word_type c = 0;
|
||||
DIunion uu, vv;
|
||||
DItype w;
|
||||
DWunion uu, vv;
|
||||
DWtype w;
|
||||
|
||||
uu.ll = u;
|
||||
vv.ll = v;
|
||||
@ -692,7 +770,7 @@ __divdi3 (DItype u, DItype v)
|
||||
c = ~c,
|
||||
vv.ll = __negdi2 (vv.ll);
|
||||
|
||||
w = __udivmoddi4 (uu.ll, vv.ll, (UDItype *) 0);
|
||||
w = __udivmoddi4 (uu.ll, vv.ll, (UDWtype *) 0);
|
||||
if (c)
|
||||
w = __negdi2 (w);
|
||||
|
||||
@ -701,12 +779,12 @@ __divdi3 (DItype u, DItype v)
|
||||
#endif
|
||||
|
||||
#ifdef L_moddi3
|
||||
DItype
|
||||
__moddi3 (DItype u, DItype v)
|
||||
DWtype
|
||||
__moddi3 (DWtype u, DWtype v)
|
||||
{
|
||||
word_type c = 0;
|
||||
DIunion uu, vv;
|
||||
DItype w;
|
||||
DWunion uu, vv;
|
||||
DWtype w;
|
||||
|
||||
uu.ll = u;
|
||||
vv.ll = v;
|
||||
@ -726,10 +804,10 @@ __moddi3 (DItype u, DItype v)
|
||||
#endif
|
||||
|
||||
#ifdef L_umoddi3
|
||||
UDItype
|
||||
__umoddi3 (UDItype u, UDItype v)
|
||||
UDWtype
|
||||
__umoddi3 (UDWtype u, UDWtype v)
|
||||
{
|
||||
UDItype w;
|
||||
UDWtype w;
|
||||
|
||||
(void) __udivmoddi4 (u, v, &w);
|
||||
|
||||
@ -738,18 +816,18 @@ __umoddi3 (UDItype u, UDItype v)
|
||||
#endif
|
||||
|
||||
#ifdef L_udivdi3
|
||||
UDItype
|
||||
__udivdi3 (UDItype n, UDItype d)
|
||||
UDWtype
|
||||
__udivdi3 (UDWtype n, UDWtype d)
|
||||
{
|
||||
return __udivmoddi4 (n, d, (UDItype *) 0);
|
||||
return __udivmoddi4 (n, d, (UDWtype *) 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef L_cmpdi2
|
||||
word_type
|
||||
__cmpdi2 (DItype a, DItype b)
|
||||
__cmpdi2 (DWtype a, DWtype b)
|
||||
{
|
||||
DIunion au, bu;
|
||||
DWunion au, bu;
|
||||
|
||||
au.ll = a, bu.ll = b;
|
||||
|
||||
@ -757,9 +835,9 @@ __cmpdi2 (DItype a, DItype b)
|
||||
return 0;
|
||||
else if (au.s.high > bu.s.high)
|
||||
return 2;
|
||||
if ((USItype) au.s.low < (USItype) bu.s.low)
|
||||
if ((UWtype) au.s.low < (UWtype) bu.s.low)
|
||||
return 0;
|
||||
else if ((USItype) au.s.low > (USItype) bu.s.low)
|
||||
else if ((UWtype) au.s.low > (UWtype) bu.s.low)
|
||||
return 2;
|
||||
return 1;
|
||||
}
|
||||
@ -767,58 +845,60 @@ __cmpdi2 (DItype a, DItype b)
|
||||
|
||||
#ifdef L_ucmpdi2
|
||||
word_type
|
||||
__ucmpdi2 (DItype a, DItype b)
|
||||
__ucmpdi2 (DWtype a, DWtype b)
|
||||
{
|
||||
DIunion au, bu;
|
||||
DWunion au, bu;
|
||||
|
||||
au.ll = a, bu.ll = b;
|
||||
|
||||
if ((USItype) au.s.high < (USItype) bu.s.high)
|
||||
if ((UWtype) au.s.high < (UWtype) bu.s.high)
|
||||
return 0;
|
||||
else if ((USItype) au.s.high > (USItype) bu.s.high)
|
||||
else if ((UWtype) au.s.high > (UWtype) bu.s.high)
|
||||
return 2;
|
||||
if ((USItype) au.s.low < (USItype) bu.s.low)
|
||||
if ((UWtype) au.s.low < (UWtype) bu.s.low)
|
||||
return 0;
|
||||
else if ((USItype) au.s.low > (USItype) bu.s.low)
|
||||
else if ((UWtype) au.s.low > (UWtype) bu.s.low)
|
||||
return 2;
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(L_fixunstfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
|
||||
#define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
|
||||
#define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
|
||||
#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
|
||||
#define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
|
||||
|
||||
DItype
|
||||
DWtype
|
||||
__fixunstfdi (TFtype a)
|
||||
{
|
||||
TFtype b;
|
||||
UDItype v;
|
||||
UDWtype v;
|
||||
|
||||
if (a < 0)
|
||||
return 0;
|
||||
|
||||
/* Compute high word of result, as a flonum. */
|
||||
b = (a / HIGH_WORD_COEFF);
|
||||
/* Convert that to fixed (but not to DItype!),
|
||||
/* Convert that to fixed (but not to DWtype!),
|
||||
and shift it into the high word. */
|
||||
v = (USItype) b;
|
||||
v = (UWtype) b;
|
||||
v <<= WORD_SIZE;
|
||||
/* Remove high part from the TFtype, leaving the low part as flonum. */
|
||||
a -= (TFtype)v;
|
||||
/* Convert that to fixed (but not to DItype!) and add it in.
|
||||
/* Convert that to fixed (but not to DWtype!) and add it in.
|
||||
Sometimes A comes out negative. This is significant, since
|
||||
A has more bits than a long int does. */
|
||||
if (a < 0)
|
||||
v -= (USItype) (- a);
|
||||
v -= (UWtype) (- a);
|
||||
else
|
||||
v += (USItype) a;
|
||||
v += (UWtype) a;
|
||||
return v;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(L_fixtfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
|
||||
DItype
|
||||
extern DWtype __fixunstfdi (TFtype a);
|
||||
|
||||
DWtype
|
||||
__fixtfdi (TFtype a)
|
||||
{
|
||||
if (a < 0)
|
||||
@ -828,39 +908,41 @@ __fixtfdi (TFtype a)
|
||||
#endif
|
||||
|
||||
#if defined(L_fixunsxfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96)
|
||||
#define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
|
||||
#define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
|
||||
#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
|
||||
#define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
|
||||
|
||||
DItype
|
||||
DWtype
|
||||
__fixunsxfdi (XFtype a)
|
||||
{
|
||||
XFtype b;
|
||||
UDItype v;
|
||||
UDWtype v;
|
||||
|
||||
if (a < 0)
|
||||
return 0;
|
||||
|
||||
/* Compute high word of result, as a flonum. */
|
||||
b = (a / HIGH_WORD_COEFF);
|
||||
/* Convert that to fixed (but not to DItype!),
|
||||
/* Convert that to fixed (but not to DWtype!),
|
||||
and shift it into the high word. */
|
||||
v = (USItype) b;
|
||||
v = (UWtype) b;
|
||||
v <<= WORD_SIZE;
|
||||
/* Remove high part from the XFtype, leaving the low part as flonum. */
|
||||
a -= (XFtype)v;
|
||||
/* Convert that to fixed (but not to DItype!) and add it in.
|
||||
/* Convert that to fixed (but not to DWtype!) and add it in.
|
||||
Sometimes A comes out negative. This is significant, since
|
||||
A has more bits than a long int does. */
|
||||
if (a < 0)
|
||||
v -= (USItype) (- a);
|
||||
v -= (UWtype) (- a);
|
||||
else
|
||||
v += (USItype) a;
|
||||
v += (UWtype) a;
|
||||
return v;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(L_fixxfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96)
|
||||
DItype
|
||||
extern DWtype __fixunsxfdi (XFtype a);
|
||||
|
||||
DWtype
|
||||
__fixxfdi (XFtype a)
|
||||
{
|
||||
if (a < 0)
|
||||
@ -870,39 +952,41 @@ __fixxfdi (XFtype a)
|
||||
#endif
|
||||
|
||||
#ifdef L_fixunsdfdi
|
||||
#define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
|
||||
#define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
|
||||
#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
|
||||
#define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
|
||||
|
||||
DItype
|
||||
DWtype
|
||||
__fixunsdfdi (DFtype a)
|
||||
{
|
||||
DFtype b;
|
||||
UDItype v;
|
||||
UDWtype v;
|
||||
|
||||
if (a < 0)
|
||||
return 0;
|
||||
|
||||
/* Compute high word of result, as a flonum. */
|
||||
b = (a / HIGH_WORD_COEFF);
|
||||
/* Convert that to fixed (but not to DItype!),
|
||||
/* Convert that to fixed (but not to DWtype!),
|
||||
and shift it into the high word. */
|
||||
v = (USItype) b;
|
||||
v = (UWtype) b;
|
||||
v <<= WORD_SIZE;
|
||||
/* Remove high part from the DFtype, leaving the low part as flonum. */
|
||||
a -= (DFtype)v;
|
||||
/* Convert that to fixed (but not to DItype!) and add it in.
|
||||
/* Convert that to fixed (but not to DWtype!) and add it in.
|
||||
Sometimes A comes out negative. This is significant, since
|
||||
A has more bits than a long int does. */
|
||||
if (a < 0)
|
||||
v -= (USItype) (- a);
|
||||
v -= (UWtype) (- a);
|
||||
else
|
||||
v += (USItype) a;
|
||||
v += (UWtype) a;
|
||||
return v;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef L_fixdfdi
|
||||
DItype
|
||||
extern DWtype __fixunsdfdi (DFtype a);
|
||||
|
||||
DWtype
|
||||
__fixdfdi (DFtype a)
|
||||
{
|
||||
if (a < 0)
|
||||
@ -912,10 +996,10 @@ __fixdfdi (DFtype a)
|
||||
#endif
|
||||
|
||||
#ifdef L_fixunssfdi
|
||||
#define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
|
||||
#define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
|
||||
#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
|
||||
#define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
|
||||
|
||||
DItype
|
||||
DWtype
|
||||
__fixunssfdi (SFtype original_a)
|
||||
{
|
||||
/* Convert the SFtype to a DFtype, because that is surely not going
|
||||
@ -923,32 +1007,34 @@ __fixunssfdi (SFtype original_a)
|
||||
that avoids converting to DFtype, and verify it really works right. */
|
||||
DFtype a = original_a;
|
||||
DFtype b;
|
||||
UDItype v;
|
||||
UDWtype v;
|
||||
|
||||
if (a < 0)
|
||||
return 0;
|
||||
|
||||
/* Compute high word of result, as a flonum. */
|
||||
b = (a / HIGH_WORD_COEFF);
|
||||
/* Convert that to fixed (but not to DItype!),
|
||||
/* Convert that to fixed (but not to DWtype!),
|
||||
and shift it into the high word. */
|
||||
v = (USItype) b;
|
||||
v = (UWtype) b;
|
||||
v <<= WORD_SIZE;
|
||||
/* Remove high part from the DFtype, leaving the low part as flonum. */
|
||||
a -= (DFtype)v;
|
||||
/* Convert that to fixed (but not to DItype!) and add it in.
|
||||
/* Convert that to fixed (but not to DWtype!) and add it in.
|
||||
Sometimes A comes out negative. This is significant, since
|
||||
A has more bits than a long int does. */
|
||||
if (a < 0)
|
||||
v -= (USItype) (- a);
|
||||
v -= (UWtype) (- a);
|
||||
else
|
||||
v += (USItype) a;
|
||||
v += (UWtype) a;
|
||||
return v;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef L_fixsfdi
|
||||
DItype
|
||||
extern DWtype __fixunssfdi (SFtype a);
|
||||
|
||||
DWtype
|
||||
__fixsfdi (SFtype a)
|
||||
{
|
||||
if (a < 0)
|
||||
@ -958,67 +1044,67 @@ __fixsfdi (SFtype a)
|
||||
#endif
|
||||
|
||||
#if defined(L_floatdixf) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96)
|
||||
#define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
|
||||
#define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2))
|
||||
#define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
|
||||
#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
|
||||
#define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
|
||||
#define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
|
||||
|
||||
XFtype
|
||||
__floatdixf (DItype u)
|
||||
__floatdixf (DWtype u)
|
||||
{
|
||||
XFtype d;
|
||||
|
||||
d = (SItype) (u >> WORD_SIZE);
|
||||
d = (Wtype) (u >> WORD_SIZE);
|
||||
d *= HIGH_HALFWORD_COEFF;
|
||||
d *= HIGH_HALFWORD_COEFF;
|
||||
d += (USItype) (u & (HIGH_WORD_COEFF - 1));
|
||||
d += (UWtype) (u & (HIGH_WORD_COEFF - 1));
|
||||
|
||||
return d;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(L_floatditf) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
|
||||
#define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
|
||||
#define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2))
|
||||
#define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
|
||||
#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
|
||||
#define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
|
||||
#define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
|
||||
|
||||
TFtype
|
||||
__floatditf (DItype u)
|
||||
__floatditf (DWtype u)
|
||||
{
|
||||
TFtype d;
|
||||
|
||||
d = (SItype) (u >> WORD_SIZE);
|
||||
d = (Wtype) (u >> WORD_SIZE);
|
||||
d *= HIGH_HALFWORD_COEFF;
|
||||
d *= HIGH_HALFWORD_COEFF;
|
||||
d += (USItype) (u & (HIGH_WORD_COEFF - 1));
|
||||
d += (UWtype) (u & (HIGH_WORD_COEFF - 1));
|
||||
|
||||
return d;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef L_floatdidf
|
||||
#define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
|
||||
#define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2))
|
||||
#define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
|
||||
#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
|
||||
#define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
|
||||
#define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
|
||||
|
||||
DFtype
|
||||
__floatdidf (DItype u)
|
||||
__floatdidf (DWtype u)
|
||||
{
|
||||
DFtype d;
|
||||
|
||||
d = (SItype) (u >> WORD_SIZE);
|
||||
d = (Wtype) (u >> WORD_SIZE);
|
||||
d *= HIGH_HALFWORD_COEFF;
|
||||
d *= HIGH_HALFWORD_COEFF;
|
||||
d += (USItype) (u & (HIGH_WORD_COEFF - 1));
|
||||
d += (UWtype) (u & (HIGH_WORD_COEFF - 1));
|
||||
|
||||
return d;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef L_floatdisf
|
||||
#define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
|
||||
#define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2))
|
||||
#define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
|
||||
#define DI_SIZE (sizeof (DItype) * BITS_PER_UNIT)
|
||||
#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
|
||||
#define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
|
||||
#define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
|
||||
#define DI_SIZE (sizeof (DWtype) * BITS_PER_UNIT)
|
||||
|
||||
/* Define codes for all the float formats that we know of. Note
|
||||
that this is copied from real.h. */
|
||||
@ -1049,7 +1135,7 @@ __floatdidf (DItype u)
|
||||
#endif
|
||||
|
||||
SFtype
|
||||
__floatdisf (DItype u)
|
||||
__floatdisf (DWtype u)
|
||||
{
|
||||
/* Do the calculation in DFmode
|
||||
so that we don't lose any of the precision of the high word
|
||||
@ -1065,18 +1151,18 @@ __floatdisf (DItype u)
|
||||
if (DF_SIZE < DI_SIZE
|
||||
&& DF_SIZE > (DI_SIZE - DF_SIZE + SF_SIZE))
|
||||
{
|
||||
#define REP_BIT ((USItype) 1 << (DI_SIZE - DF_SIZE))
|
||||
if (! (- ((DItype) 1 << DF_SIZE) < u
|
||||
&& u < ((DItype) 1 << DF_SIZE)))
|
||||
#define REP_BIT ((UWtype) 1 << (DI_SIZE - DF_SIZE))
|
||||
if (! (- ((DWtype) 1 << DF_SIZE) < u
|
||||
&& u < ((DWtype) 1 << DF_SIZE)))
|
||||
{
|
||||
if ((USItype) u & (REP_BIT - 1))
|
||||
if ((UWtype) u & (REP_BIT - 1))
|
||||
u |= REP_BIT;
|
||||
}
|
||||
}
|
||||
f = (SItype) (u >> WORD_SIZE);
|
||||
f = (Wtype) (u >> WORD_SIZE);
|
||||
f *= HIGH_HALFWORD_COEFF;
|
||||
f *= HIGH_HALFWORD_COEFF;
|
||||
f += (USItype) (u & (HIGH_WORD_COEFF - 1));
|
||||
f += (UWtype) (u & (HIGH_WORD_COEFF - 1));
|
||||
|
||||
return (SFtype) f;
|
||||
}
|
||||
@ -1095,12 +1181,12 @@ __floatdisf (DItype u)
|
||||
#undef MAX
|
||||
#include <limits.h>
|
||||
|
||||
USItype
|
||||
UWtype
|
||||
__fixunsxfsi (XFtype a)
|
||||
{
|
||||
if (a >= - (DFtype) LONG_MIN)
|
||||
return (SItype) (a + LONG_MIN) - LONG_MIN;
|
||||
return (SItype) a;
|
||||
return (Wtype) (a + LONG_MIN) - LONG_MIN;
|
||||
return (Wtype) a;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1117,12 +1203,12 @@ __fixunsxfsi (XFtype a)
|
||||
#undef MAX
|
||||
#include <limits.h>
|
||||
|
||||
USItype
|
||||
UWtype
|
||||
__fixunsdfsi (DFtype a)
|
||||
{
|
||||
if (a >= - (DFtype) LONG_MIN)
|
||||
return (SItype) (a + LONG_MIN) - LONG_MIN;
|
||||
return (SItype) a;
|
||||
return (Wtype) (a + LONG_MIN) - LONG_MIN;
|
||||
return (Wtype) a;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1139,12 +1225,12 @@ __fixunsdfsi (DFtype a)
|
||||
#undef MAX
|
||||
#include <limits.h>
|
||||
|
||||
USItype
|
||||
UWtype
|
||||
__fixunssfsi (SFtype a)
|
||||
{
|
||||
if (a >= - (SFtype) LONG_MIN)
|
||||
return (SItype) (a + LONG_MIN) - LONG_MIN;
|
||||
return (SItype) a;
|
||||
return (Wtype) (a + LONG_MIN) - LONG_MIN;
|
||||
return (Wtype) a;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1156,6 +1242,12 @@ __fixunssfsi (SFtype a)
|
||||
#define UDItype bogus_type
|
||||
#define SFtype bogus_type
|
||||
#define DFtype bogus_type
|
||||
#undef Wtype
|
||||
#undef UWtype
|
||||
#undef HWtype
|
||||
#undef UHWtype
|
||||
#undef DWtype
|
||||
#undef UDWtype
|
||||
|
||||
#undef char
|
||||
#undef short
|
||||
|
@ -195,7 +195,7 @@ extern UDItype __udiv_qrnnd __P ((UDItype *, UDItype, UDItype, UDItype));
|
||||
/* Call libgcc1 routine. */
|
||||
#define umul_ppmm(w1, w0, u, v) \
|
||||
do { \
|
||||
DIunion __w; \
|
||||
DWunion __w; \
|
||||
__w.ll = __umulsidi3 (u, v); \
|
||||
w1 = __w.s.high; \
|
||||
w0 = __w.s.low; \
|
||||
@ -1383,7 +1383,7 @@ UDItype __umulsidi3 (USItype, USItype);
|
||||
|
||||
#if !defined (__umulsidi3)
|
||||
#define __umulsidi3(u, v) \
|
||||
({DIunion __w; \
|
||||
({DWunion __w; \
|
||||
umul_ppmm (__w.s.high, __w.s.low, u, v); \
|
||||
__w.ll; })
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user