11919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah/* 2ecff6554d3c3be05df7416c780ddec219da72a3dStefan Krah * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. 31919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * 41919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * Redistribution and use in source and binary forms, with or without 51919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * modification, are permitted provided that the following conditions 61919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * are met: 71919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * 81919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * 1. Redistributions of source code must retain the above copyright 91919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * notice, this list of conditions and the following disclaimer. 101919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * 111919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * 2. Redistributions in binary form must reproduce the above copyright 121919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * notice, this list of conditions and the following disclaimer in the 131919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * documentation and/or other materials provided with the distribution. 141919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * 151919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND 161919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 171919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 181919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 191919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 201919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 211919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 221919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 231919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 241919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 251919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * SUCH DAMAGE. 261919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah */ 271919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 281919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 291919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah#ifndef CONSTANTS_H 301919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah#define CONSTANTS_H 311919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 321919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 331919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah#include "mpdecimal.h" 341919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 351919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 36fdf1a34ba113a783ed4865f810adbbbde11c8635Stefan Krah/* Internal header file: all symbols have local scope in the DSO */ 37fdf1a34ba113a783ed4865f810adbbbde11c8635Stefan KrahMPD_PRAGMA(MPD_HIDE_SYMBOLS_START) 38fdf1a34ba113a783ed4865f810adbbbde11c8635Stefan Krah 39fdf1a34ba113a783ed4865f810adbbbde11c8635Stefan Krah 401919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah/* choice of optimized functions */ 411919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah#if defined(CONFIG_64) 421919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah/* x64 */ 431919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah #define MULMOD(a, b) x64_mulmod(a, b, umod) 441919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah #define MULMOD2C(a0, a1, w) x64_mulmod2c(a0, a1, w, umod) 451919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah #define MULMOD2(a0, b0, a1, b1) x64_mulmod2(a0, b0, a1, b1, umod) 461919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah #define POWMOD(base, exp) x64_powmod(base, exp, umod) 471919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah #define SETMODULUS(modnum) std_setmodulus(modnum, &umod) 481919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah #define SIZE3_NTT(x0, x1, x2, w3table) std_size3_ntt(x0, x1, x2, w3table, umod) 491919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah#elif defined(PPRO) 501919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah/* PentiumPro (or later) gcc inline asm */ 511919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah #define MULMOD(a, b) ppro_mulmod(a, b, &dmod, dinvmod) 521919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah #define MULMOD2C(a0, a1, w) ppro_mulmod2c(a0, a1, w, &dmod, dinvmod) 531919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah #define MULMOD2(a0, b0, a1, b1) ppro_mulmod2(a0, b0, a1, b1, &dmod, dinvmod) 541919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah #define POWMOD(base, exp) ppro_powmod(base, exp, &dmod, dinvmod) 551919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah #define SETMODULUS(modnum) ppro_setmodulus(modnum, &umod, &dmod, dinvmod) 561919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah #define SIZE3_NTT(x0, x1, x2, w3table) ppro_size3_ntt(x0, x1, x2, w3table, umod, &dmod, dinvmod) 571919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah#else 581919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah /* ANSI C99 */ 591919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah #define MULMOD(a, b) std_mulmod(a, b, umod) 601919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah #define MULMOD2C(a0, a1, w) std_mulmod2c(a0, a1, w, umod) 611919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah #define MULMOD2(a0, b0, a1, b1) std_mulmod2(a0, b0, a1, b1, umod) 621919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah #define POWMOD(base, exp) std_powmod(base, exp, umod) 631919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah #define SETMODULUS(modnum) std_setmodulus(modnum, &umod) 641919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah #define SIZE3_NTT(x0, x1, x2, w3table) std_size3_ntt(x0, x1, x2, w3table, umod) 651919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah#endif 661919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 671919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah/* PentiumPro (or later) gcc inline asm */ 681919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahextern const float MPD_TWO63; 691919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahextern const uint32_t mpd_invmoduli[3][3]; 701919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 711919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahenum {P1, P2, P3}; 721919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 731919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahextern const mpd_uint_t mpd_moduli[]; 741919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahextern const mpd_uint_t mpd_roots[]; 751919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahextern const mpd_size_t mpd_bits[]; 761919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahextern const mpd_uint_t mpd_pow10[]; 771919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 781919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahextern const mpd_uint_t INV_P1_MOD_P2; 791919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahextern const mpd_uint_t INV_P1P2_MOD_P3; 801919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahextern const mpd_uint_t LH_P1P2; 811919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahextern const mpd_uint_t UH_P1P2; 821919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 831919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 84fdf1a34ba113a783ed4865f810adbbbde11c8635Stefan KrahMPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ 85fdf1a34ba113a783ed4865f810adbbbde11c8635Stefan Krah 86fdf1a34ba113a783ed4865f810adbbbde11c8635Stefan Krah 871919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah#endif /* CONSTANTS_H */ 881919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 891919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 901919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 91