X-Git-Url: https://git.distorted.org.uk/~mdw/secnet/blobdiff_plain/b7a5ecfcbac18c56d0b044975f6ed6835dd86ab4..0bcb8184cfce875a4dde57621139dd44c433f3a5:/qfarith.h diff --git a/qfarith.h b/qfarith.h index abcd293..fcedf3e 100644 --- a/qfarith.h +++ b/qfarith.h @@ -1,3 +1,40 @@ +/* + * qfarith.h: utilities for quick field arithmetic + */ +/* + * This file is Free Software. It has been modified to as part of its + * incorporation into secnet. + * + * Copyright 2017 Mark Wooding + * + * You may redistribute this file and/or modify it under the terms of + * the permissive licence shown below. + * + * You may redistribute secnet as a whole and/or modify it under the + * terms of the GNU General Public License as published by the Free + * Software Foundation; either version 3, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see + * https://www.gnu.org/licenses/gpl.html. + */ +/* + * Imported from Catacomb, and modified for Secnet (2017-04-30): + * + * * Use `fake-mLib-bits.h' in place of the real . + * + * * Use C99 signed integer types instead of our own local probing. + * + * * Remove the support for non-two's-complement targets. + * + * The file's original comment headers are preserved below. + */ /* -*-c-*- * * Utilities for quick field arithmetic @@ -35,35 +72,15 @@ /*----- Header files ------------------------------------------------------*/ #include +#include -#include +#include "fake-mLib-bits.h" /*----- Signed integer types ----------------------------------------------*/ -/* See if we can find a suitable 64-bit or wider type. Don't bother if we - * don't have a corresponding unsigned type, because we really need both. - */ -#ifdef HAVE_UINT64 -# if INT_MAX >> 31 == 0xffffffff -# define HAVE_INT64 - typedef int int64; -# elif LONG_MAX >> 31 == 0xffffffff -# define HAVE_INT64 - typedef long int64; -# elif defined(LLONG_MAX) -# define HAVE_INT64 - MLIB_BITS_EXTENSION typedef long long int64; -# endif -#endif - -/* Choose suitable 32- and 16-bit types. */ -#if INT_MAX >= 0x7fffffff - typedef int int32; -#else - typedef long int32; -#endif - -typedef short int16; +typedef int_fast32_t int32; +typedef int_fast64_t int64; +#define HAVE_INT64 1 /*----- General bit-hacking utilities -------------------------------------*/ @@ -117,42 +134,7 @@ typedef short int16; # define CONDSWAP(x, y, m) \ do { mask32 t_ = ((x) ^ (y))&(m); (x) ^= t_; (y) ^= t_; } while (0) #else - - /* We don't have two's complement arithmetic. We can't use bithacking at - * all: if we try to hack on the bits of signed numbers we'll come unstuck - * when we hit the other representation of zero; and if we switch to - * unsigned arithmetic then we'll have overflow when we try to convert a - * negative number back. So fall back to simple arithmetic. - */ - typedef uint32 mask32; - - /* Convert an unsigned mask M into a `mask32'. Our masks are unsigned, so - * this does nothing. - */ -# define FIX_MASK32(m) ((mask32)(m)) - - /* If Z is zero and M has its low 32 bits set, then copy (at least) the low - * 32 bits of X to Z; if M is zero, do nothing. Otherwise, scramble Z - * unhelpfully. - */ -# define CONDPICK(z, x, m) \ - do { (z) += (x)*(int)((unsigned)(m)&1u); } while (0) - - /* If M has its low 32 bits set, then return (at least) the low 32 bits of - * X in Z; if M is zero, then return (at least) the low 32 bits of Y in Z. - * Otherwise, return an unhelful result. - */ -# define PICK2(x, y, m) \ - ((x)*(int)((unsigned)(m)&1u) + (y)*(int)(1 - ((unsigned)(m)&1u))) - - /* If M has its low 32 bits set then swap (at least) the low 32 bits of X - * and Y; if M is zero, then do nothing. Otherwise, scramble X and Y - * unhelpfully. - */ -# define CONDSWAP(x, y, m) do { \ - int32 x_ = PICK2((y), (x), (m)), y_ = PICK2((x), (y), (m)); \ - (x) = x_; (y) = y_; \ - } while (0) +# error "Targets without two's complement arithmetic aren't supported" #endif /* Return zero if bit 31 of X is clear, or a mask with (at least) the low 32