]> git.saurik.com Git - apple/security.git/blobdiff - Security/libsecurity_cryptkit/lib/giantPort_i486.h
Security-57031.1.35.tar.gz
[apple/security.git] / Security / libsecurity_cryptkit / lib / giantPort_i486.h
diff --git a/Security/libsecurity_cryptkit/lib/giantPort_i486.h b/Security/libsecurity_cryptkit/lib/giantPort_i486.h
new file mode 100644 (file)
index 0000000..b0e74f7
--- /dev/null
@@ -0,0 +1,126 @@
+/* Copyright (c) 1998,2011,2014 Apple Inc.  All Rights Reserved.
+ *
+ * NOTICE: USE OF THE MATERIALS ACCOMPANYING THIS NOTICE IS SUBJECT
+ * TO THE TERMS OF THE SIGNED "FAST ELLIPTIC ENCRYPTION (FEE) REFERENCE
+ * SOURCE CODE EVALUATION AGREEMENT" BETWEEN APPLE, INC. AND THE
+ * ORIGINAL LICENSEE THAT OBTAINED THESE MATERIALS FROM APPLE,
+ * INC.  ANY USE OF THESE MATERIALS NOT PERMITTED BY SUCH AGREEMENT WILL
+ * EXPOSE YOU TO LIABILITY.
+ ***************************************************************************
+ *
+ * giantPorti486.h - OpenStep-dependent giant definitions.
+ *
+ * Revision History
+ * ----------------
+ * 06 Apr 1998 at Apple
+ *     Created.
+ */
+
+#ifndef        _CK_NSGIANT_PORT_I486_H_
+#define _CK_NSGIANT_PORT_I486_H_
+
+#include "giantIntegers.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Add two digits, return sum. Carry bit returned as an out parameter.
+ */
+static inline giantDigit giantAddDigits(
+       giantDigit dig1,
+       giantDigit dig2,
+       giantDigit *carry)      /* RETURNED, 0 or 1 */
+{
+       giantDigit _sum;        /* r/w %0 */
+       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;
+}
+
+/*
+ * Add a single digit value to a double digit accumulator in place.
+ * Carry out of the MSD of the accumulator is not handled.
+ */
+static inline void giantAddDouble(
+       giantDigit *accLow,             /* IN/OUT */
+       giantDigit *accHigh,            /* IN/OUT */
+       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));
+}
+
+/*
+ * Subtract a - b, return difference. Borrow bit returned as an out parameter.
+ */
+static inline giantDigit giantSubDigits(
+       giantDigit a,
+       giantDigit b,
+       giantDigit *borrow)             /* RETURNED, 0 or 1 */
+{
+       giantDigit _diff;       /* r/w %0 */
+       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;
+}
+
+/*
+ * Multiply two digits, return two digits.
+ */
+static inline void giantMulDigits(
+       giantDigit      dig1,
+       giantDigit      dig2,
+       giantDigit      *lowProduct,    // RETURNED, low digit
+       giantDigit      *hiProduct)     // RETURNED, high digit
+
+{
+       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" );
+}
+
+/*
+ * Multiply a vector of giantDigits, candVector, by a single giantDigit,
+ * plierDigit, adding results into prodVector. Returns m.s. digit from
+ * final multiply; only candLength digits of *prodVector will be written.
+ *
+ * This one's implemented in a .s file.
+ */
+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_