#include <openssl/bn.h>
#ifndef HEADER_BN_ARCH_H
#define HEADER_BN_ARCH_H
#ifndef OPENSSL_NO_ASM
#define HAVE_BN_ADD
#define HAVE_BN_ADD_WORDS
#define HAVE_BN_DIV_WORDS
#define HAVE_BN_MOD_ADD_WORDS
#define HAVE_BN_MOD_SUB_WORDS
#define HAVE_BN_MUL_COMBA4
#define HAVE_BN_MUL_COMBA6
#define HAVE_BN_MUL_COMBA8
#define HAVE_BN_MUL_WORDS
#define HAVE_BN_MULW_ADD_WORDS
#define HAVE_BN_MULW_WORDS
#define HAVE_BN_SQR_COMBA4
#define HAVE_BN_SQR_COMBA6
#define HAVE_BN_SQR_COMBA8
#define HAVE_BN_SQR_WORDS
#define HAVE_BN_SUB
#define HAVE_BN_SUB_WORDS
#define HAVE_BN_WORD_CLZ
#if defined(__GNUC__)
#define HAVE_BN_DIV_REM_WORDS_INLINE
static inline void
bn_div_rem_words_inline(BN_ULONG h, BN_ULONG l, BN_ULONG d, BN_ULONG *out_q,
BN_ULONG *out_r)
{
BN_ULONG q, r;
__asm__ volatile ("divq %4"
: "=a"(q), "=d"(r)
: "d"(h), "a"(l), "rm"(d)
: "cc");
*out_q = q;
*out_r = r;
}
#define HAVE_BN_MULW
static inline void
bn_mulw(BN_ULONG a, BN_ULONG b, BN_ULONG *out_r1, BN_ULONG *out_r0)
{
BN_ULONG r1, r0;
__asm__ ("mulq %3"
: "=d"(r1), "=a"(r0)
: "a"(a), "rm"(b)
: "cc");
*out_r1 = r1;
*out_r0 = r0;
}
#define HAVE_BN_SUBW
static inline void
bn_subw(BN_ULONG a, BN_ULONG b, BN_ULONG *out_borrow, BN_ULONG *out_r0)
{
BN_ULONG borrow, r0;
__asm__ (
"subq %3, %1 \n"
"setb %b0 \n"
"and $1, %0 \n"
: "=r"(borrow), "=r"(r0)
: "1"(a), "rm"(b)
: "cc");
*out_borrow = borrow;
*out_r0 = r0;
}
#endif
#endif
#endif