X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/f521d4c7a97076db34681c598d7965c7d05713b0..a90d420cbe87490c844ae422c966e746d3134b07:/math/fgoldi.h diff --git a/math/fgoldi.h b/math/fgoldi.h index 4f6c043f..6e351079 100644 --- a/math/fgoldi.h +++ b/math/fgoldi.h @@ -134,6 +134,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 @@ -148,6 +194,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@) @@ -200,6 +261,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