2 Copyright © 1995-2017, 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 an IEEE double precision number.
24 y - IEEE double precision floating point number.
31 negative : result is negative
41 IEEEDPCeil(), IEEEDPFix()
45 *****************************************************************************/
52 QUAD
* Qy
= (QUAD
*)&y
;
54 if (is_eqC(*Qy
,0,0)) return *Qy
;
56 Set_Value64(y_tmp
, *Qy
);
57 AND64QC(y_tmp
, IEEEDPExponent_Mask_Hi
, IEEEDPExponent_Mask_Lo
);
59 if (is_lessC(y_tmp
, one_Hi
, one_Lo
))
61 if (is_lessSC(*Qy
,0,0))
63 SetSR(Negative_Bit
, Zero_Bit
| Negative_Bit
| Overflow_Bit
);
67 one_Hi
| IEEEDPSign_Mask_Hi
,
68 one_Lo
| IEEEDPSign_Mask_Lo
74 SetSR(Zero_Bit
, Zero_Bit
| Negative_Bit
| Overflow_Bit
);
75 Set_Value64C(*Qy
, 0,0);
81 Set_Value64C(Mask
, 0x80000000, 0x00000000);
82 SHRU32(shift
, y_tmp
, 52);
83 SHRS64(Mask
, Mask
, (shift
-0x3ff+11)); /* leave the () there! StormC 1.1 needs 'em! */
86 if (is_leqSC(*Qy
, 0x0, 0x0))
92 if (is_neqC(y2
,0x0,0x0))
95 double * Dminusone
= (double *)&minusone
;
99 one_Hi
| IEEEDPSign_Mask_Hi
,
100 one_Lo
| IEEEDPSign_Mask_Lo
102 *Qy
= IEEEDPAdd(*Qy
, *Dminusone
);
103 Set_Value64C(Mask
, 0x80000000, 0x00000000);
104 SHRU32(shift
, y_tmp
, 52);
105 SHRS64(Mask
, Mask
, (shift
-0x3ff+11)); /* leave the () there! StormC 1.1 needs 'em! */
109 if (is_lessSC(*Qy
,0x0,0x0))
111 SetSR(Negative_Bit
, Zero_Bit
| Negative_Bit
| Overflow_Bit
);