| .. | .. |
|---|
| 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 { \ |
|---|