#ifndef _CK_NSGIANT_PORT_I486_H_
#define _CK_NSGIANT_PORT_I486_H_
#include "giantIntegers.h"
#ifdef __cplusplus
extern "C" {
#endif
static inline giantDigit giantAddDigits(
giantDigit dig1,
giantDigit dig2,
giantDigit *carry)
{
giantDigit _sum;
asm volatile(
"movl %2, %0 /* _sum = dig1 */ \n"
"addl %3, %0 /* _sum += dig2 */ \n"
"jc .+9 \n"
"movl $0, %1 /* carry = 0 */ \n"
"jmp .+7 \n"
"movl $1, %1 /* carry = 1 */ \n"
: "=&r" (_sum), "=&r" (*carry)
: "r" (dig1), "r" (dig2));
return _sum;
}
static inline void giantAddDouble(
giantDigit *accLow,
giantDigit *accHigh,
giantDigit val)
{
asm volatile(
"addl %4, %0 /* accLow += val */ \n"
"jnc .+3 \n"
"incl %1 /* accHigh++ */ \n"
: "=&r" (*accLow), "=&r" (*accHigh)
: "0" (*accLow), "1" (*accHigh), "r" (val));
}
static inline giantDigit giantSubDigits(
giantDigit a,
giantDigit b,
giantDigit *borrow)
{
giantDigit _diff;
asm volatile(
"movl %2, %0 /* _diff = a */ \n"
"subl %3, %0 /* _diff -= b */ \n"
"jc .+9 \n"
"movl $0, %1 /* borrow = 0 */ \n"
"jmp .+7 \n"
"movl $1, %1 /* borrow = 1 */ \n"
: "=&r" (_diff), "=&r" (*borrow)
: "r" (a), "r" (b));
return _diff;
}
static inline void giantMulDigits(
giantDigit dig1,
giantDigit dig2,
giantDigit *lowProduct, giantDigit *hiProduct)
{
asm volatile(
"movl %2, %%eax /* eax = dig1 */ \n"
"movl %3, %%edx /* edx = dig2 */ \n"
"mull %%edx /* eax *= dig2 */ \n"
: "=&a" (*lowProduct), "=&d" (*hiProduct)
: "r" (dig1), "r" (dig2)
: "%eax", "%edx" );
}
extern giantDigit vectorMult_x86(
giantDigit plierDigit,
giantDigit *candVector,
unsigned candLength,
giantDigit *prodVector);
#define VectorMultiply(pd, cv, cl, pv) vectorMult_x86(pd, cv, cl, pv)
#ifdef __cplusplus
}
#endif
#endif _CK_NSGIANT_PORT_I486_H_