X-Git-Url: https://git.distorted.org.uk/~mdw/secnet/blobdiff_plain/1047c205103e6da9fc6a317f41583147dbc11aa3..a1a6042e24c9873aa6abf668bcb68d39d0eb4190:/fgoldi.h diff --git a/fgoldi.h b/fgoldi.h index cac2ff1..37dc6e2 100644 --- a/fgoldi.h +++ b/fgoldi.h @@ -65,6 +65,8 @@ typedef union { int32 p28[16]; } fgoldi; + typedef int32 fgoldi_piece; + /*----- Functions provided ------------------------------------------------*/ /* --- @fgoldi_load@ --- * @@ -137,6 +139,52 @@ extern void fgoldi_add(fgoldi */*z*/, extern void fgoldi_sub(fgoldi */*z*/, const fgoldi */*x*/, const fgoldi */*y*/); +/* --- @fgoldi_neg@ --- * + * + * Arguments: @fgoldi *z@ = where to put the result (may alias @x@) + * @const fgoldi *x@ = an operand + * + * Returns: --- + * + * Use: Set @z = -x@. + */ + +extern void fgoldi_neg(fgoldi */*z*/, const fgoldi */*x*/); + +/* --- @fgoldi_pick2@ --- * + * + * Arguments: @fgoldi *z@ = where to put the result (may alias @x@ or @y@) + * @const fgoldi *x, *y@ = two operands + * @uint32 m@ = a mask + * + * Returns: --- + * + * Use: If @m@ is zero, set @z = y@; if @m@ is all-bits-set, then set + * @z = x@. If @m@ has some other value, then scramble @z@ in + * an unhelpful way. + */ + +extern void fgoldi_pick2(fgoldi */*z*/, + const fgoldi */*x*/, const fgoldi */*y*/, + uint32 /*m*/); + +/* --- @fgoldi_pickn@ --- * + * + * Arguments: @fgoldi *z@ = where to put the result + * @const fgoldi *v@ = a table of entries + * @size_t n@ = the number of entries in @v@ + * @size_t i@ = an index + * + * Returns: --- + * + * Use: If @0 <= i < n < 32@ then set @z = v[i]@. If @n >= 32@ then + * do something unhelpful; otherwise, if @i >= n@ then set @z@ + * to zero. + */ + +extern void fgoldi_pickn(fgoldi */*z*/, + const fgoldi */*v*/, size_t /*n*/, size_t /*i*/); + /* --- @fgoldi_condswap@ --- * * * Arguments: @fgoldi *x, *y@ = two operands @@ -151,6 +199,21 @@ extern void fgoldi_sub(fgoldi */*z*/, extern void fgoldi_condswap(fgoldi */*x*/, fgoldi */*y*/, uint32 /*m*/); +/* --- @fgoldi_condneg@ --- * + * + * Arguments: @fgoldi *z@ = where to put the result (may alias @x@) + * @const fgoldi *x@ = an operand + * @uint32 m@ = a mask + * + * Returns: --- + * + * Use: If @m@ is zero, set @z = x@; if @m@ is all-bits-set, then set + * @z = -x@. If @m@ has some other value then scramble @z@ in + * an unhelpful way. + */ + +extern void fgoldi_condneg(fgoldi */*z*/, const fgoldi */*x*/, uint32 /*m*/); + /* --- @fgoldi_mulconst@ --- * * * Arguments: @fgoldi *z@ = where to put the result (may alias @x@) @@ -203,6 +266,22 @@ extern void fgoldi_sqr(fgoldi */*z*/, const fgoldi */*x*/); extern void fgoldi_inv(fgoldi */*z*/, const fgoldi */*x*/); +/* --- @fgoldi_quosqrt@ --- * + * + * Arguments: @fgoldi *z@ = where to put the result (may alias @x@ or @y@) + * @const fgoldi *x, *y@ = two operands + * + * Returns: Zero if successful, @-1@ if %$x/y$% is not a square. + * + * Use: Stores in @z@ the one of the square roots %$\pm\sqrt{x/y}$%. + * If %$x = y = 0% then the result is zero; if %$y = 0$% but %$x + * \ne 0$% then the operation fails. If you wanted a specific + * square root then you'll have to pick it yourself. + */ + +extern int fgoldi_quosqrt(fgoldi */*z*/, + const fgoldi */*x*/, const fgoldi */*y*/); + /*----- That's all, folks -------------------------------------------------*/ #ifdef __cplusplus