2 Copyright © 1995-2003, The AROS Development Team. All rights reserved.
6 #include "mathieeedoubbas_intern.h"
10 Calculates the floor-value of a IEEE double precision number
37 AROS_LHQUAD1(double, IEEEDPFloor
,
38 AROS_LHAQUAD(double, y
, D0
, D1
),
39 struct MathIeeeDoubBasBase
*, MathIeeeDoubBasBase
, 15, MathIeeeDoubBas
47 QUAD
* Qy
= (QUAD
*)&y
;
49 if (is_eqC(*Qy
,0,0)) return *Qy
;
51 Set_Value64(y_tmp
, *Qy
);
52 AND64QC(y_tmp
, IEEEDPExponent_Mask_Hi
, IEEEDPExponent_Mask_Lo
);
54 if (is_lessC(y_tmp
, one_Hi
, one_Lo
))
56 if (is_lessSC(*Qy
,0,0))
58 SetSR(Negative_Bit
, Zero_Bit
| Negative_Bit
| Overflow_Bit
);
62 one_Hi
| IEEEDPSign_Mask_Hi
,
63 one_Lo
| IEEEDPSign_Mask_Lo
69 SetSR(Zero_Bit
, Zero_Bit
| Negative_Bit
| Overflow_Bit
);
70 Set_Value64C(*Qy
, 0,0);
76 Set_Value64C(Mask
, 0x80000000, 0x00000000);
77 SHRU32(shift
, y_tmp
, 52);
78 SHRS64(Mask
, Mask
, (shift
-0x3ff+11)); /* leave the () there! StormC 1.1 needs 'em! */
81 if (is_leqSC(*Qy
, 0x0, 0x0))
87 if (is_neqC(y2
,0x0,0x0))
90 double * Dminusone
= (double *)&minusone
;
94 one_Hi
| IEEEDPSign_Mask_Hi
,
95 one_Lo
| IEEEDPSign_Mask_Lo
97 *Qy
= IEEEDPAdd(*Qy
, *Dminusone
);
98 Set_Value64C(Mask
, 0x80000000, 0x00000000);
99 SHRU32(shift
, y_tmp
, 52);
100 SHRS64(Mask
, Mask
, (shift
-0x3ff+11)); /* leave the () there! StormC 1.1 needs 'em! */
104 if (is_lessSC(*Qy
,0x0,0x0))
106 SetSR(Negative_Bit
, Zero_Bit
| Negative_Bit
| Overflow_Bit
);