]>
Commit | Line | Data |
---|---|---|
a334319f UD |
1 | #define _FP_W_TYPE_SIZE 64 |
2 | #define _FP_W_TYPE unsigned long long | |
3 | #define _FP_WS_TYPE signed long long | |
4 | #define _FP_I_TYPE long long | |
5 | ||
6 | #define _FP_MUL_MEAT_S(R,X,Y) \ | |
7 | _FP_MUL_MEAT_1_imm(_FP_WFRACBITS_S,R,X,Y) | |
8 | #define _FP_MUL_MEAT_D(R,X,Y) \ | |
9 | _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm) | |
10 | #define _FP_MUL_MEAT_Q(R,X,Y) \ | |
11 | _FP_MUL_MEAT_2_wide_3mul(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm) | |
12 | ||
13 | #define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_imm(S,R,X,Y,_FP_DIV_HELP_imm) | |
14 | #define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_1_udiv_norm(D,R,X,Y) | |
15 | #define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_2_udiv(Q,R,X,Y) | |
16 | ||
17 | #define _FP_NANFRAC_S ((_FP_QNANBIT_S << 1) - 1) | |
18 | #define _FP_NANFRAC_D ((_FP_QNANBIT_D << 1) - 1) | |
19 | #define _FP_NANFRAC_Q ((_FP_QNANBIT_Q << 1) - 1), -1 | |
20 | #define _FP_NANSIGN_S 0 | |
21 | #define _FP_NANSIGN_D 0 | |
22 | #define _FP_NANSIGN_Q 0 | |
23 | ||
24 | #define _FP_KEEPNANFRACP 1 | |
25 | /* From my experiments it seems X is chosen unless one of the | |
26 | NaNs is sNaN, in which case the result is NANSIGN/NANFRAC. */ | |
27 | #define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \ | |
28 | do { \ | |
29 | if ((_FP_FRAC_HIGH_RAW_##fs(X) | \ | |
30 | _FP_FRAC_HIGH_RAW_##fs(Y)) & _FP_QNANBIT_##fs) \ | |
31 | { \ | |
32 | R##_s = _FP_NANSIGN_##fs; \ | |
33 | _FP_FRAC_SET_##wc(R,_FP_NANFRAC_##fs); \ | |
34 | } \ | |
35 | else \ | |
36 | { \ | |
37 | R##_s = X##_s; \ | |
38 | _FP_FRAC_COPY_##wc(R,X); \ | |
39 | } \ | |
40 | R##_c = FP_CLS_NAN; \ | |
41 | } while (0) | |
42 | ||
43 | #define FP_EX_INVALID (1 << 4) | |
44 | #define FP_EX_DIVZERO (1 << 3) | |
45 | #define FP_EX_OVERFLOW (1 << 2) | |
46 | #define FP_EX_UNDERFLOW (1 << 1) | |
47 | #define FP_EX_INEXACT (1 << 0) |