• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*******************************************************************************
2 * Copyright 2012-2018 Intel Corporation
3 * All Rights Reserved.
4 *
5 * If this  software was obtained  under the  Intel Simplified  Software License,
6 * the following terms apply:
7 *
8 * The source code,  information  and material  ("Material") contained  herein is
9 * owned by Intel Corporation or its  suppliers or licensors,  and  title to such
10 * Material remains with Intel  Corporation or its  suppliers or  licensors.  The
11 * Material  contains  proprietary  information  of  Intel or  its suppliers  and
12 * licensors.  The Material is protected by  worldwide copyright  laws and treaty
13 * provisions.  No part  of  the  Material   may  be  used,  copied,  reproduced,
14 * modified, published,  uploaded, posted, transmitted,  distributed or disclosed
15 * in any way without Intel's prior express written permission.  No license under
16 * any patent,  copyright or other  intellectual property rights  in the Material
17 * is granted to  or  conferred  upon  you,  either   expressly,  by implication,
18 * inducement,  estoppel  or  otherwise.  Any  license   under such  intellectual
19 * property rights must be express and approved by Intel in writing.
20 *
21 * Unless otherwise agreed by Intel in writing,  you may not remove or alter this
22 * notice or  any  other  notice   embedded  in  Materials  by  Intel  or Intel's
23 * suppliers or licensors in any way.
24 *
25 *
26 * If this  software  was obtained  under the  Apache License,  Version  2.0 (the
27 * "License"), the following terms apply:
28 *
29 * You may  not use this  file except  in compliance  with  the License.  You may
30 * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
31 *
32 *
33 * Unless  required  by   applicable  law  or  agreed  to  in  writing,  software
34 * distributed under the License  is distributed  on an  "AS IS"  BASIS,  WITHOUT
35 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
36 *
37 * See the   License  for the   specific  language   governing   permissions  and
38 * limitations under the License.
39 *******************************************************************************/
40 
41 /*
42 //  Purpose:
43 //     Intel(R) Integrated Performance Primitives.
44 //     Internal Unsigned internal arithmetic
45 //
46 //
47 */
48 
49 #if !defined(_CP_BNU_ARITH_H)
50 #define _CP_BNU_ARITH_H
51 
52 #include "pcpbnuimpl.h"
53 #include "pcpbnu32arith.h"
54 
55 #define     cpAdd_BNU OWNAPI(cpAdd_BNU)
56 BNU_CHUNK_T cpAdd_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, cpSize ns);
57 #define     cpSub_BNU OWNAPI(cpSub_BNU)
58 BNU_CHUNK_T cpSub_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, cpSize ns);
59 #define     cpInc_BNU OWNAPI(cpInc_BNU)
60 BNU_CHUNK_T cpInc_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, cpSize ns, BNU_CHUNK_T val);
61 #define     cpDec_BNU OWNAPI(cpDec_BNU)
62 BNU_CHUNK_T cpDec_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, cpSize ns, BNU_CHUNK_T val);
63 
64 #define     cpAddMulDgt_BNU OWNAPI(cpAddMulDgt_BNU)
65 BNU_CHUNK_T cpAddMulDgt_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, cpSize ns, BNU_CHUNK_T val);
66 
67 
68 #define     cpMulAdc_BNU_school OWNAPI(cpMulAdc_BNU_school)
69 BNU_CHUNK_T cpMulAdc_BNU_school(BNU_CHUNK_T* pR,
70                          const BNU_CHUNK_T* pA, cpSize nsA,
71                          const BNU_CHUNK_T* pB, cpSize nsB);
72 #define     cpMulAdx_BNU_school OWNAPI(cpMulAdx_BNU_school)
73 BNU_CHUNK_T cpMulAdx_BNU_school(BNU_CHUNK_T* pR,
74                          const BNU_CHUNK_T* pA, cpSize nsA,
75                          const BNU_CHUNK_T* pB, cpSize nsB);
76 
77 /*F*
78 //    Name: cpMul_BNU_school
79 //
80 // Purpose: Multiply 2 BigNums.
81 //
82 // Returns:
83 //    extension of result of multiply 2 BigNums
84 //
85 // Parameters:
86 //    pA    source BigNum A
87 //    nsA   size of A
88 //    pB    source BigNum B
89 //    nsB   size of B
90 //    pR    resultant BigNum
91 //
92 *F*/
93 
cpMul_BNU_school(BNU_CHUNK_T * pR,const BNU_CHUNK_T * pA,cpSize nsA,const BNU_CHUNK_T * pB,cpSize nsB)94 __INLINE BNU_CHUNK_T cpMul_BNU_school(BNU_CHUNK_T* pR,
95                                 const BNU_CHUNK_T* pA, cpSize nsA,
96                                 const BNU_CHUNK_T* pB, cpSize nsB)
97 {
98 #if(_ADCOX_NI_ENABLING_==_FEATURE_ON_)
99    return cpMulAdx_BNU_school(pR, pA,nsA, pB,nsB);
100 #elif(_ADCOX_NI_ENABLING_==_FEATURE_TICKTOCK_)
101    return IsFeatureEnabled(ippCPUID_ADCOX)? cpMulAdx_BNU_school(pR, pA,nsA, pB,nsB)
102                                           : cpMulAdc_BNU_school(pR, pA,nsA, pB,nsB);
103 #else
104    return cpMulAdc_BNU_school(pR, pA,nsA, pB,nsB);
105 #endif
106 }
107 
108 
109 #define     cpSqrAdc_BNU_school OWNAPI(cpSqrAdc_BNU_school)
110 BNU_CHUNK_T cpSqrAdc_BNU_school(BNU_CHUNK_T * pR, const BNU_CHUNK_T * pA, cpSize nsA);
111 
112 #define     cpSqrAdx_BNU_school OWNAPI(cpSqrAdx_BNU_school)
113 BNU_CHUNK_T cpSqrAdx_BNU_school(BNU_CHUNK_T * pR, const BNU_CHUNK_T * pA, cpSize nsA);
114 
115 /*F*
116 //    Name: cpSqr_BNU_school
117 //
118 // Purpose: Square BigNum.
119 //
120 // Returns:
121 //    extension of result of square BigNum
122 //
123 // Parameters:
124 //    pA    source BigNum
125 //    pR    resultant BigNum
126 //
127 *F*/
128 
cpSqr_BNU_school(BNU_CHUNK_T * pR,const BNU_CHUNK_T * pA,cpSize nsA)129 __INLINE BNU_CHUNK_T cpSqr_BNU_school(BNU_CHUNK_T * pR, const BNU_CHUNK_T * pA, cpSize nsA)
130 {
131 #if(_ADCOX_NI_ENABLING_==_FEATURE_ON_)
132    return cpSqrAdx_BNU_school(pR, pA,nsA);
133 #elif(_ADCOX_NI_ENABLING_==_FEATURE_TICKTOCK_)
134    return IsFeatureEnabled(ippCPUID_ADCOX)? cpSqrAdx_BNU_school(pR, pA,nsA)
135                                           : cpSqrAdc_BNU_school(pR, pA,nsA);
136 #else
137    return cpSqrAdc_BNU_school(pR, pA,nsA);
138 #endif
139 }
140 
141 #define     cpGcd_BNU OWNAPI(cpGcd_BNU)
142 BNU_CHUNK_T cpGcd_BNU(BNU_CHUNK_T a, BNU_CHUNK_T b);
143 
144 #define cpModInv_BNU OWNAPI(cpModInv_BNU)
145 int     cpModInv_BNU(BNU_CHUNK_T* pInv,
146                const BNU_CHUNK_T* pA, cpSize nsA,
147                const BNU_CHUNK_T* pM, cpSize nsM,
148                      BNU_CHUNK_T* bufInv, BNU_CHUNK_T* bufA, BNU_CHUNK_T* bufM);
149 
150 
151 /*
152 // multiplication/squaring wrappers
153 */
cpMul_BNU(BNU_CHUNK_T * pR,const BNU_CHUNK_T * pA,cpSize nsA,const BNU_CHUNK_T * pB,cpSize nsB,BNU_CHUNK_T * pBuffer)154 __INLINE BNU_CHUNK_T cpMul_BNU(BNU_CHUNK_T* pR,
155                          const BNU_CHUNK_T* pA, cpSize nsA,
156                          const BNU_CHUNK_T* pB, cpSize nsB,
157                                BNU_CHUNK_T* pBuffer)
158 {
159    UNREFERENCED_PARAMETER(pBuffer);
160    return cpMul_BNU_school(pR, pA,nsA, pB,nsB);
161 }
cpSqr_BNU(BNU_CHUNK_T * pR,const BNU_CHUNK_T * pA,cpSize nsA,BNU_CHUNK_T * pBuffer)162 __INLINE BNU_CHUNK_T cpSqr_BNU(BNU_CHUNK_T * pR,
163                          const BNU_CHUNK_T * pA, cpSize nsA,
164                                BNU_CHUNK_T* pBuffer)
165 {
166    UNREFERENCED_PARAMETER(pBuffer);
167    return cpSqr_BNU_school(pR, pA,nsA);
168 }
169 
170 /*F*
171 //    Name: cpDiv_BNU
172 //
173 // Purpose: division/reduction BigNums.
174 //
175 // Returns:
176 //    size of result
177 //
178 // Parameters:
179 //    pA    source BigNum
180 //    pB    source BigNum
181 //    pQ    quotient BigNum
182 //    pnsQ  pointer to max size of Q
183 //    nsA   size of A
184 //    nsB   size of B
185 //
186 *F*/
187 
cpDiv_BNU(BNU_CHUNK_T * pQ,cpSize * pnsQ,BNU_CHUNK_T * pA,cpSize nsA,BNU_CHUNK_T * pB,cpSize nsB)188 __INLINE cpSize cpDiv_BNU(BNU_CHUNK_T* pQ, cpSize* pnsQ, BNU_CHUNK_T* pA, cpSize nsA, BNU_CHUNK_T* pB, cpSize nsB)
189 {
190    int nsR = cpDiv_BNU32((Ipp32u*)pQ, pnsQ,
191                          (Ipp32u*)pA, nsA*(sizeof(BNU_CHUNK_T)/sizeof(Ipp32u)),
192                          (Ipp32u*)pB, nsB*(sizeof(BNU_CHUNK_T)/sizeof(Ipp32u)));
193    #if (BNU_CHUNK_BITS == BNU_CHUNK_64BIT)
194    if(nsR&1) ((Ipp32u*)pA)[nsR] = 0;
195    nsR = INTERNAL_BNU_LENGTH(nsR);
196    if(pQ) {
197       if(*pnsQ&1) ((Ipp32u*)pQ)[*pnsQ] = 0;
198       *pnsQ = INTERNAL_BNU_LENGTH(*pnsQ);
199    }
200    #endif
201    return nsR;
202 }
203 
204 /*F*
205 //    Name: cpMod_BNU
206 //
207 // Purpose: reduction BigNums.
208 //
209 // Returns:
210 //    cpDiv_BNU(NULL,NULL, pX,nsX, pModulus, nsM)
211 //
212 // Parameters:
213 //    pX        source BigNum
214 //    pModulus  source BigNum
215 //    nsX       size of X
216 //    nsM       size of Modulus
217 //
218 *F*/
219 
cpMod_BNU(BNU_CHUNK_T * pX,cpSize nsX,BNU_CHUNK_T * pModulus,cpSize nsM)220 __INLINE cpSize cpMod_BNU(BNU_CHUNK_T* pX, cpSize nsX, BNU_CHUNK_T* pModulus, cpSize nsM)
221 {
222    return cpDiv_BNU(NULL,NULL, pX,nsX, pModulus, nsM);
223 }
224 
225 #endif /* _CP_BNU_ARITH_H */
226