10 #ifndef MOD_ARITH_XMT_H 11 #define MOD_ARITH_XMT_H 15 #include <machine/mtaops.h> 26 static inline uint_fast32_t mod_add(uint_fast32_t a, uint_fast32_t b) {
28 assert (a <= 0x7FFFFFFE);
29 assert (b <= 0x7FFFFFFE);
31 return (x + MTA_UNS_ADD_MUL_UPPER(0x0000000200000003, 0x0000000200000004, x)) & 0x7FFFFFFF;
35 static inline uint_fast32_t mod_mul(uint_fast32_t a, uint_fast32_t b) {
38 assert (a <= 0x7FFFFFFE);
39 assert (b <= 0x7FFFFFFE);
40 temp = MTA_INT_ADD_MUL(0, a, b);
41 return (temp + MTA_UNS_ADD_MUL_UPPER(0x0000000200000003, 0x0000000200000004, temp)) & 0x7FFFFFFF;
45 static inline uint_fast32_t mod_mac(uint_fast32_t sum, uint_fast32_t a, uint_fast32_t b) {
48 assert (sum <= 0x7FFFFFFE);
49 assert (a <= 0x7FFFFFFE);
50 assert (b <= 0x7FFFFFFE);
51 temp = MTA_INT_ADD_MUL(sum, a, b);
52 return (temp + MTA_UNS_ADD_MUL_UPPER(0x0000000200000003, 0x0000000200000004, temp)) & 0x7FFFFFFF;
56 static inline uint_fast32_t mod_mac2(uint_fast32_t sum, uint_fast32_t a, uint_fast32_t b, uint_fast32_t c, uint_fast32_t d) {
58 assert (sum <= 0x7FFFFFFE);
59 assert (a <= 0x7FFFFFFE);
60 assert (b <= 0x7FFFFFFE);
61 assert (c <= 0x7FFFFFFE);
62 assert (d <= 0x7FFFFFFE);
63 temp = MTA_INT_ADD_MUL(MTA_INT_ADD_MUL(sum, a, b), c, d);
64 return (temp + MTA_UNS_ADD_MUL_UPPER(0x0000000200000003, 0x0000000200000004, temp)) & 0x7FFFFFFF;
68 static inline uint_fast32_t mod_mac3(uint_fast32_t sum, uint_fast32_t a, uint_fast32_t b, uint_fast32_t c, uint_fast32_t d, uint_fast32_t e, uint_fast32_t f) {
70 assert (sum <= 0x7FFFFFFE);
71 assert (a <= 0x7FFFFFFE);
72 assert (b <= 0x7FFFFFFE);
73 assert (c <= 0x7FFFFFFE);
74 assert (d <= 0x7FFFFFFE);
75 assert (e <= 0x7FFFFFFE);
76 assert (f <= 0x7FFFFFFE);
77 temp = MTA_INT_ADD_MUL(MTA_INT_ADD_MUL(MTA_INT_ADD_MUL(sum, a, b), c, d), e, f);
78 return (temp + MTA_UNS_ADD_MUL_UPPER(0x0000000200000003, 0x0000000200000004, temp)) & 0x7FFFFFFF;
82 static inline uint_fast32_t mod_mac4(uint_fast32_t sum, uint_fast32_t a, uint_fast32_t b, uint_fast32_t c, uint_fast32_t d, uint_fast32_t e, uint_fast32_t f, uint_fast32_t g, uint_fast32_t h) {
84 assert (sum <= 0x7FFFFFFE);
85 assert (a <= 0x7FFFFFFE);
86 assert (b <= 0x7FFFFFFE);
87 assert (c <= 0x7FFFFFFE);
88 assert (d <= 0x7FFFFFFE);
89 assert (e <= 0x7FFFFFFE);
90 assert (f <= 0x7FFFFFFE);
91 assert (g <= 0x7FFFFFFE);
92 assert (h <= 0x7FFFFFFE);
93 temp = MTA_INT_ADD_MUL(MTA_INT_ADD_MUL(MTA_INT_ADD_MUL(MTA_INT_ADD_MUL(sum, a, b), c, d), e, f), g, h);
94 return (temp + MTA_UNS_ADD_MUL_UPPER(0x0000000200000003, 0x0000000200000004, temp)) & 0x7FFFFFFF;
97 static inline uint_fast64_t mod_down(uint_fast64_t x);
100 static inline uint_fast64_t mod_down_fast(uint_fast64_t x) {
101 return (x >> 31) + (x & 0x7FFFFFFF);
105 static inline uint_fast64_t mod_down(uint_fast64_t x) {
106 return ((x + MTA_UNS_ADD_MUL_UPPER(0x0000000200000003, 0x0000000200000004, x)) & 0x7FFFFFFF);
118 static inline uint_fast32_t mod_mul_x(uint_fast32_t a) {
119 return mod_mul(a, 107374182);
123 static inline uint_fast32_t mod_mul_y(uint_fast32_t a) {
124 return mod_mul(a, 104480);
128 static inline uint_fast32_t mod_mac_y(uint_fast32_t sum, uint_fast32_t a) {
129 return mod_mac(sum, a, 104480);