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