2 Copyright © 1995-2003, The AROS Development Team. All rights reserved.
6 #include "mathieeedoubbas_intern.h"
8 /*****************************************************************************
12 AROS_LHQUAD1(double, IEEEDPFloor
,
15 AROS_LHAQUAD(double, y
, D0
, D1
),
18 struct MathIeeeDoubBasBase
*, MathIeeeDoubBasBase
, 15, MathIeeeDoubBas
)
21 Calculates the floor-value of a IEEE double precision number
39 *****************************************************************************/
46 QUAD
* Qy
= (QUAD
*)&y
;
48 if (is_eqC(*Qy
,0,0)) return *Qy
;
50 Set_Value64(y_tmp
, *Qy
);
51 AND64QC(y_tmp
, IEEEDPExponent_Mask_Hi
, IEEEDPExponent_Mask_Lo
);
53 if (is_lessC(y_tmp
, one_Hi
, one_Lo
))
55 if (is_lessSC(*Qy
,0,0))
57 SetSR(Negative_Bit
, Zero_Bit
| Negative_Bit
| Overflow_Bit
);
61 one_Hi
| IEEEDPSign_Mask_Hi
,
62 one_Lo
| IEEEDPSign_Mask_Lo
68 SetSR(Zero_Bit
, Zero_Bit
| Negative_Bit
| Overflow_Bit
);
69 Set_Value64C(*Qy
, 0,0);
75 Set_Value64C(Mask
, 0x80000000, 0x00000000);
76 SHRU32(shift
, y_tmp
, 52);
77 SHRS64(Mask
, Mask
, (shift
-0x3ff+11)); /* leave the () there! StormC 1.1 needs 'em! */
80 if (is_leqSC(*Qy
, 0x0, 0x0))
86 if (is_neqC(y2
,0x0,0x0))
89 double * Dminusone
= (double *)&minusone
;
93 one_Hi
| IEEEDPSign_Mask_Hi
,
94 one_Lo
| IEEEDPSign_Mask_Lo
96 *Qy
= IEEEDPAdd(*Qy
, *Dminusone
);
97 Set_Value64C(Mask
, 0x80000000, 0x00000000);
98 SHRU32(shift
, y_tmp
, 52);
99 SHRS64(Mask
, Mask
, (shift
-0x3ff+11)); /* leave the () there! StormC 1.1 needs 'em! */
103 if (is_lessSC(*Qy
,0x0,0x0))
105 SetSR(Negative_Bit
, Zero_Bit
| Negative_Bit
| Overflow_Bit
);