• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * This file is part of the openHiTLS project.
3  *
4  * openHiTLS is licensed under the Mulan PSL v2.
5  * You can use this software according to the terms and conditions of the Mulan PSL v2.
6  * You may obtain a copy of Mulan PSL v2 at:
7  *
8  *     http://license.coscl.org.cn/MulanPSL2
9  *
10  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13  * See the Mulan PSL v2 for more details.
14  */
15 #ifndef BN_BINCAL_X8664_H
16 #define BN_BINCAL_X8664_H
17 
18 #include "hitls_build.h"
19 #ifdef HITLS_CRYPTO_BN
20 
21 #include <stdint.h>
22 #include "bn_basic.h"
23 
24 #ifdef __cplusplus
25 extern "c" {
26 #endif
27 
28 // wh | wl = u * v
29 #define MUL_AB(wh, wl, u, v)                                           \
30     {                                                                  \
31         __asm("mulq %3" : "=d"(wh), "=a"(wl) : "a"(u), "r"(v) : "cc"); \
32     }
33 // wh | wl = u ^ 2
34 #define SQR_A(wh, wl, u)                                               \
35     {                                                                  \
36         __asm("mulq %2 " : "=d"(wh), "=a"(wl) : "a"(u) : "cc"); \
37     }
38 
39 // nh | nl / d = q...r
40 #define DIV_ND(q, r, nh, nl, d)                                                  \
41     {                                                                            \
42         __asm("divq   %4" : "=a"(q), "=d"(r) : "d"(nh), "a"(nl), "r"(d) : "cc"); \
43     }
44 
45 /* r += c
46  * c = carry
47  */
48 #define ADD_CARRY(carry, r)          \
49     do {                             \
50         __asm("addq %1, %0 \n\t "    \
51               "adcq %4, %1 \n\t "    \
52               "adcq $0, %2 \n\t "    \
53               : "+m"(l), "+r"(carry) \
54               :                      \
55               : "cc");               \
56     } while (0)
57 
58 /* h|m|l = h|m|l + u * v. Ensure that the value of h is not too large to avoid carry. */
59 #define MULXADD_AB(h, m, l, u, v)                                     \
60     do {                                                             \
61         BN_UINT hi, lo;                                              \
62         __asm("mulq %0, %1, %2" : "=a"(lo), "=d"(hi) : "a"(u), "m"(v) : "cc"); \
63         __asm("addq %3, %0 \n\t "                                    \
64               "adcq %4, %1 \n\t "                                    \
65               "adcq $0, %2 \n\t "                                    \
66               : "+r"(l), "+r"(m), "+r"(h)                            \
67               : "r"(lo), "r"(hi)                                     \
68               : "cc");                                               \
69     } while (0)
70 
71 // (hi, lo) = a * b
72 // r += lo + carry
73 // carry = hi + c
74 #define MULADC_AB(r, a, b, carry)                                      \
75     do {                                                               \
76         BN_UINT hi, lo;                                                \
77         __asm("mulq %3" : "=a"(lo), "=d"(hi) : "a"(a), "g"(b) : "cc"); \
78         __asm("addq %3, %1 \n\t"                                       \
79               "adcq $0, %2 \n\t"                                       \
80               "addq %1, %0 \n\t"                                       \
81               "adcq $0, %2 \n\t"                                       \
82               "movq %2, %1 \n\t"                                       \
83               : "+r"(r), "+r"(carry), "+r"(hi)                         \
84               : "r"(lo)                                                \
85               : "cc");                                                 \
86     } while (0)
87 
88 /* h|m|l = h|m|l + u * v. Ensure that the value of h is not too large to avoid carry. */
89 #define MULADD_AB(h, m, l, u, v)                                       \
90     do {                                                               \
91         BN_UINT hi, lo;                                                \
92         __asm("mulq %3" : "=a"(lo), "=d"(hi) : "a"(u), "m"(v) : "cc"); \
93         __asm("addq %3, %0 \n\t "                                      \
94               "adcq %4, %1 \n\t "                                      \
95               "adcq $0, %2 \n\t "                                      \
96               : "+r"(l), "+r"(m), "+r"(h)                              \
97               : "r"(lo), "r"(hi)                                       \
98               : "cc");                                                 \
99     } while (0)
100 
101 /* h|m|l = h|m|l + 2 * u * v. Ensure that the value of h is not too large to avoid carry. */
102 #define MULADD_AB2(h, m, l, u, v)                                     \
103     do {                                                             \
104         BN_UINT hi, lo;                                              \
105         __asm("mulq %3" : "=a"(lo), "=d"(hi) : "a"(u), "m"(v) : "cc"); \
106         __asm("addq %3, %0 \n\t "                                    \
107               "adcq %4, %1 \n\t "                                    \
108               "adcq $0, %2 \n\t "                                    \
109               "addq %3, %0 \n\t "                                    \
110               "adcq %4, %1 \n\t "                                    \
111               "adcq $0, %2 \n\t "                                    \
112               : "+r"(l), "+r"(m), "+r"(h)                            \
113               : "r"(lo), "r"(hi)                                     \
114               : "cc");                                               \
115     } while (0)
116 
117 /* h|m|l = h|m|l + u * u. Ensure that the value of h is not too large to avoid carry. */
118 #define SQRADD_A(h, m, l, u)   MULADD_AB(h, m, l, u, u)
119 
120 #ifdef __cplusplus
121 }
122 #endif
123 
124 #endif /* HITLS_CRYPTO_BN */
125 
126 #endif