.. | .. |
---|
31 | 31 | #define _FP_FRAC_HIGH_2(X) (X##_f1) |
---|
32 | 32 | #define _FP_FRAC_LOW_2(X) (X##_f0) |
---|
33 | 33 | #define _FP_FRAC_WORD_2(X,w) (X##_f##w) |
---|
| 34 | +#define _FP_FRAC_SLL_2(X, N) ( \ |
---|
| 35 | + (void) (((N) < _FP_W_TYPE_SIZE) \ |
---|
| 36 | + ? ({ \ |
---|
| 37 | + if (__builtin_constant_p(N) && (N) == 1) { \ |
---|
| 38 | + X##_f1 = X##_f1 + X##_f1 + \ |
---|
| 39 | + (((_FP_WS_TYPE) (X##_f0)) < 0); \ |
---|
| 40 | + X##_f0 += X##_f0; \ |
---|
| 41 | + } else { \ |
---|
| 42 | + X##_f1 = X##_f1 << (N) | X##_f0 >> \ |
---|
| 43 | + (_FP_W_TYPE_SIZE - (N)); \ |
---|
| 44 | + X##_f0 <<= (N); \ |
---|
| 45 | + } \ |
---|
| 46 | + 0; \ |
---|
| 47 | + }) \ |
---|
| 48 | + : ({ \ |
---|
| 49 | + X##_f1 = X##_f0 << ((N) - _FP_W_TYPE_SIZE); \ |
---|
| 50 | + X##_f0 = 0; \ |
---|
| 51 | + }))) |
---|
34 | 52 | |
---|
35 | | -#define _FP_FRAC_SLL_2(X,N) \ |
---|
36 | | - do { \ |
---|
37 | | - if ((N) < _FP_W_TYPE_SIZE) \ |
---|
38 | | - { \ |
---|
39 | | - if (__builtin_constant_p(N) && (N) == 1) \ |
---|
40 | | - { \ |
---|
41 | | - X##_f1 = X##_f1 + X##_f1 + (((_FP_WS_TYPE)(X##_f0)) < 0); \ |
---|
42 | | - X##_f0 += X##_f0; \ |
---|
43 | | - } \ |
---|
44 | | - else \ |
---|
45 | | - { \ |
---|
46 | | - X##_f1 = X##_f1 << (N) | X##_f0 >> (_FP_W_TYPE_SIZE - (N)); \ |
---|
47 | | - X##_f0 <<= (N); \ |
---|
48 | | - } \ |
---|
49 | | - } \ |
---|
50 | | - else \ |
---|
51 | | - { \ |
---|
52 | | - X##_f1 = X##_f0 << ((N) - _FP_W_TYPE_SIZE); \ |
---|
53 | | - X##_f0 = 0; \ |
---|
54 | | - } \ |
---|
55 | | - } while (0) |
---|
56 | 53 | |
---|
57 | | -#define _FP_FRAC_SRL_2(X,N) \ |
---|
58 | | - do { \ |
---|
59 | | - if ((N) < _FP_W_TYPE_SIZE) \ |
---|
60 | | - { \ |
---|
61 | | - X##_f0 = X##_f0 >> (N) | X##_f1 << (_FP_W_TYPE_SIZE - (N)); \ |
---|
62 | | - X##_f1 >>= (N); \ |
---|
63 | | - } \ |
---|
64 | | - else \ |
---|
65 | | - { \ |
---|
66 | | - X##_f0 = X##_f1 >> ((N) - _FP_W_TYPE_SIZE); \ |
---|
67 | | - X##_f1 = 0; \ |
---|
68 | | - } \ |
---|
69 | | - } while (0) |
---|
| 54 | +#define _FP_FRAC_SRL_2(X, N) ( \ |
---|
| 55 | + (void) (((N) < _FP_W_TYPE_SIZE) \ |
---|
| 56 | + ? ({ \ |
---|
| 57 | + X##_f0 = X##_f0 >> (N) | X##_f1 << (_FP_W_TYPE_SIZE - (N)); \ |
---|
| 58 | + X##_f1 >>= (N); \ |
---|
| 59 | + }) \ |
---|
| 60 | + : ({ \ |
---|
| 61 | + X##_f0 = X##_f1 >> ((N) - _FP_W_TYPE_SIZE); \ |
---|
| 62 | + X##_f1 = 0; \ |
---|
| 63 | + }))) |
---|
| 64 | + |
---|
70 | 65 | |
---|
71 | 66 | /* Right shift with sticky-lsb. */ |
---|
72 | | -#define _FP_FRAC_SRS_2(X,N,sz) \ |
---|
73 | | - do { \ |
---|
74 | | - if ((N) < _FP_W_TYPE_SIZE) \ |
---|
75 | | - { \ |
---|
76 | | - X##_f0 = (X##_f1 << (_FP_W_TYPE_SIZE - (N)) | X##_f0 >> (N) | \ |
---|
77 | | - (__builtin_constant_p(N) && (N) == 1 \ |
---|
78 | | - ? X##_f0 & 1 \ |
---|
79 | | - : (X##_f0 << (_FP_W_TYPE_SIZE - (N))) != 0)); \ |
---|
80 | | - X##_f1 >>= (N); \ |
---|
81 | | - } \ |
---|
82 | | - else \ |
---|
83 | | - { \ |
---|
84 | | - X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE) | \ |
---|
85 | | - (((X##_f1 << (2*_FP_W_TYPE_SIZE - (N))) | X##_f0) != 0)); \ |
---|
86 | | - X##_f1 = 0; \ |
---|
87 | | - } \ |
---|
88 | | - } while (0) |
---|
| 67 | +#define _FP_FRAC_SRS_2(X, N, sz) ( \ |
---|
| 68 | + (void) (((N) < _FP_W_TYPE_SIZE) \ |
---|
| 69 | + ? ({ \ |
---|
| 70 | + X##_f0 = (X##_f1 << (_FP_W_TYPE_SIZE - (N)) | X##_f0 >> (N) \ |
---|
| 71 | + | (__builtin_constant_p(N) && (N) == 1 \ |
---|
| 72 | + ? X##_f0 & 1 \ |
---|
| 73 | + : (X##_f0 << (_FP_W_TYPE_SIZE - (N))) != 0)); \ |
---|
| 74 | + X##_f1 >>= (N); \ |
---|
| 75 | + }) \ |
---|
| 76 | + : ({ \ |
---|
| 77 | + X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE) \ |
---|
| 78 | + | ((((N) == _FP_W_TYPE_SIZE \ |
---|
| 79 | + ? 0 \ |
---|
| 80 | + : (X##_f1 << (2*_FP_W_TYPE_SIZE - (N)))) \ |
---|
| 81 | + | X##_f0) != 0)); \ |
---|
| 82 | + X##_f1 = 0; \ |
---|
| 83 | + }))) |
---|
89 | 84 | |
---|
90 | 85 | #define _FP_FRAC_ADDI_2(X,I) \ |
---|
91 | 86 | __FP_FRAC_ADDI_2(X##_f1, X##_f0, I) |
---|
.. | .. |
---|
572 | 567 | */ |
---|
573 | 568 | |
---|
574 | 569 | #define _FP_FRAC_ASSEMBLE_2(r, X, rsize) \ |
---|
575 | | - do { \ |
---|
576 | | - if (rsize <= _FP_W_TYPE_SIZE) \ |
---|
577 | | - r = X##_f0; \ |
---|
578 | | - else \ |
---|
579 | | - { \ |
---|
580 | | - r = X##_f1; \ |
---|
581 | | - r <<= _FP_W_TYPE_SIZE; \ |
---|
582 | | - r += X##_f0; \ |
---|
583 | | - } \ |
---|
584 | | - } while (0) |
---|
| 570 | + (void) (((rsize) <= _FP_W_TYPE_SIZE) \ |
---|
| 571 | + ? ({ (r) = X##_f0; }) \ |
---|
| 572 | + : ({ \ |
---|
| 573 | + (r) = X##_f1; \ |
---|
| 574 | + (r) <<= _FP_W_TYPE_SIZE; \ |
---|
| 575 | + (r) += X##_f0; \ |
---|
| 576 | + })) |
---|
585 | 577 | |
---|
586 | 578 | #define _FP_FRAC_DISASSEMBLE_2(X, r, rsize) \ |
---|
587 | 579 | do { \ |
---|