SSL/TLS Library

Dependents:  

CyaSSL is SSL/TLS library for embedded systems.

wolfssl.com

Committer:
wolfSSL
Date:
Sun Apr 20 12:40:57 2014 +0000
Revision:
0:9d17e4342598
CyaSSL SSL/TLS Library 2.9.4;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfSSL 0:9d17e4342598 1 /* asm.c
wolfSSL 0:9d17e4342598 2 *
wolfSSL 0:9d17e4342598 3 * Copyright (C) 2006-2013 wolfSSL Inc.
wolfSSL 0:9d17e4342598 4 *
wolfSSL 0:9d17e4342598 5 * This file is part of CyaSSL.
wolfSSL 0:9d17e4342598 6 *
wolfSSL 0:9d17e4342598 7 * CyaSSL is free software; you can redistribute it and/or modify
wolfSSL 0:9d17e4342598 8 * it under the terms of the GNU General Public License as published by
wolfSSL 0:9d17e4342598 9 * the Free Software Foundation; either version 2 of the License, or
wolfSSL 0:9d17e4342598 10 * (at your option) any later version.
wolfSSL 0:9d17e4342598 11 *
wolfSSL 0:9d17e4342598 12 * CyaSSL is distributed in the hope that it will be useful,
wolfSSL 0:9d17e4342598 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
wolfSSL 0:9d17e4342598 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
wolfSSL 0:9d17e4342598 15 * GNU General Public License for more details.
wolfSSL 0:9d17e4342598 16 *
wolfSSL 0:9d17e4342598 17 * You should have received a copy of the GNU General Public License
wolfSSL 0:9d17e4342598 18 * along with this program; if not, write to the Free Software
wolfSSL 0:9d17e4342598 19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
wolfSSL 0:9d17e4342598 20 */
wolfSSL 0:9d17e4342598 21
wolfSSL 0:9d17e4342598 22 #ifdef HAVE_CONFIG_H
wolfSSL 0:9d17e4342598 23 #include <config.h>
wolfSSL 0:9d17e4342598 24 #endif
wolfSSL 0:9d17e4342598 25
wolfSSL 0:9d17e4342598 26 #include <cyassl/ctaocrypt/settings.h>
wolfSSL 0:9d17e4342598 27
wolfSSL 0:9d17e4342598 28 /*
wolfSSL 0:9d17e4342598 29 * Based on public domain TomsFastMath 0.10 by Tom St Denis, tomstdenis@iahu.ca,
wolfSSL 0:9d17e4342598 30 * http://math.libtomcrypt.com
wolfSSL 0:9d17e4342598 31 */
wolfSSL 0:9d17e4342598 32
wolfSSL 0:9d17e4342598 33
wolfSSL 0:9d17e4342598 34 /******************************************************************/
wolfSSL 0:9d17e4342598 35 /* fp_montgomery_reduce.c asm or generic */
wolfSSL 0:9d17e4342598 36 #if defined(TFM_X86) && !defined(TFM_SSE2)
wolfSSL 0:9d17e4342598 37 /* x86-32 code */
wolfSSL 0:9d17e4342598 38
wolfSSL 0:9d17e4342598 39 #define MONT_START
wolfSSL 0:9d17e4342598 40 #define MONT_FINI
wolfSSL 0:9d17e4342598 41 #define LOOP_END
wolfSSL 0:9d17e4342598 42 #define LOOP_START \
wolfSSL 0:9d17e4342598 43 mu = c[x] * mp
wolfSSL 0:9d17e4342598 44
wolfSSL 0:9d17e4342598 45 #define INNERMUL \
wolfSSL 0:9d17e4342598 46 __asm__( \
wolfSSL 0:9d17e4342598 47 "movl %5,%%eax \n\t" \
wolfSSL 0:9d17e4342598 48 "mull %4 \n\t" \
wolfSSL 0:9d17e4342598 49 "addl %1,%%eax \n\t" \
wolfSSL 0:9d17e4342598 50 "adcl $0,%%edx \n\t" \
wolfSSL 0:9d17e4342598 51 "addl %%eax,%0 \n\t" \
wolfSSL 0:9d17e4342598 52 "adcl $0,%%edx \n\t" \
wolfSSL 0:9d17e4342598 53 "movl %%edx,%1 \n\t" \
wolfSSL 0:9d17e4342598 54 :"=g"(_c[LO]), "=r"(cy) \
wolfSSL 0:9d17e4342598 55 :"0"(_c[LO]), "1"(cy), "g"(mu), "g"(*tmpm++) \
wolfSSL 0:9d17e4342598 56 : "%eax", "%edx", "cc")
wolfSSL 0:9d17e4342598 57
wolfSSL 0:9d17e4342598 58 #define PROPCARRY \
wolfSSL 0:9d17e4342598 59 __asm__( \
wolfSSL 0:9d17e4342598 60 "addl %1,%0 \n\t" \
wolfSSL 0:9d17e4342598 61 "setb %%al \n\t" \
wolfSSL 0:9d17e4342598 62 "movzbl %%al,%1 \n\t" \
wolfSSL 0:9d17e4342598 63 :"=g"(_c[LO]), "=r"(cy) \
wolfSSL 0:9d17e4342598 64 :"0"(_c[LO]), "1"(cy) \
wolfSSL 0:9d17e4342598 65 : "%eax", "cc")
wolfSSL 0:9d17e4342598 66
wolfSSL 0:9d17e4342598 67 /******************************************************************/
wolfSSL 0:9d17e4342598 68 #elif defined(TFM_X86_64)
wolfSSL 0:9d17e4342598 69 /* x86-64 code */
wolfSSL 0:9d17e4342598 70
wolfSSL 0:9d17e4342598 71 #define MONT_START
wolfSSL 0:9d17e4342598 72 #define MONT_FINI
wolfSSL 0:9d17e4342598 73 #define LOOP_END
wolfSSL 0:9d17e4342598 74 #define LOOP_START \
wolfSSL 0:9d17e4342598 75 mu = c[x] * mp
wolfSSL 0:9d17e4342598 76
wolfSSL 0:9d17e4342598 77 #define INNERMUL \
wolfSSL 0:9d17e4342598 78 __asm__( \
wolfSSL 0:9d17e4342598 79 "movq %5,%%rax \n\t" \
wolfSSL 0:9d17e4342598 80 "mulq %4 \n\t" \
wolfSSL 0:9d17e4342598 81 "addq %1,%%rax \n\t" \
wolfSSL 0:9d17e4342598 82 "adcq $0,%%rdx \n\t" \
wolfSSL 0:9d17e4342598 83 "addq %%rax,%0 \n\t" \
wolfSSL 0:9d17e4342598 84 "adcq $0,%%rdx \n\t" \
wolfSSL 0:9d17e4342598 85 "movq %%rdx,%1 \n\t" \
wolfSSL 0:9d17e4342598 86 :"=g"(_c[LO]), "=r"(cy) \
wolfSSL 0:9d17e4342598 87 :"0"(_c[LO]), "1"(cy), "r"(mu), "r"(*tmpm++) \
wolfSSL 0:9d17e4342598 88 : "%rax", "%rdx", "cc")
wolfSSL 0:9d17e4342598 89
wolfSSL 0:9d17e4342598 90 #define INNERMUL8 \
wolfSSL 0:9d17e4342598 91 __asm__( \
wolfSSL 0:9d17e4342598 92 "movq 0(%5),%%rax \n\t" \
wolfSSL 0:9d17e4342598 93 "movq 0(%2),%%r10 \n\t" \
wolfSSL 0:9d17e4342598 94 "movq 0x8(%5),%%r11 \n\t" \
wolfSSL 0:9d17e4342598 95 "mulq %4 \n\t" \
wolfSSL 0:9d17e4342598 96 "addq %%r10,%%rax \n\t" \
wolfSSL 0:9d17e4342598 97 "adcq $0,%%rdx \n\t" \
wolfSSL 0:9d17e4342598 98 "movq 0x8(%2),%%r10 \n\t" \
wolfSSL 0:9d17e4342598 99 "addq %3,%%rax \n\t" \
wolfSSL 0:9d17e4342598 100 "adcq $0,%%rdx \n\t" \
wolfSSL 0:9d17e4342598 101 "movq %%rax,0(%0) \n\t" \
wolfSSL 0:9d17e4342598 102 "movq %%rdx,%1 \n\t" \
wolfSSL 0:9d17e4342598 103 \
wolfSSL 0:9d17e4342598 104 "movq %%r11,%%rax \n\t" \
wolfSSL 0:9d17e4342598 105 "movq 0x10(%5),%%r11 \n\t" \
wolfSSL 0:9d17e4342598 106 "mulq %4 \n\t" \
wolfSSL 0:9d17e4342598 107 "addq %%r10,%%rax \n\t" \
wolfSSL 0:9d17e4342598 108 "adcq $0,%%rdx \n\t" \
wolfSSL 0:9d17e4342598 109 "movq 0x10(%2),%%r10 \n\t" \
wolfSSL 0:9d17e4342598 110 "addq %3,%%rax \n\t" \
wolfSSL 0:9d17e4342598 111 "adcq $0,%%rdx \n\t" \
wolfSSL 0:9d17e4342598 112 "movq %%rax,0x8(%0) \n\t" \
wolfSSL 0:9d17e4342598 113 "movq %%rdx,%1 \n\t" \
wolfSSL 0:9d17e4342598 114 \
wolfSSL 0:9d17e4342598 115 "movq %%r11,%%rax \n\t" \
wolfSSL 0:9d17e4342598 116 "movq 0x18(%5),%%r11 \n\t" \
wolfSSL 0:9d17e4342598 117 "mulq %4 \n\t" \
wolfSSL 0:9d17e4342598 118 "addq %%r10,%%rax \n\t" \
wolfSSL 0:9d17e4342598 119 "adcq $0,%%rdx \n\t" \
wolfSSL 0:9d17e4342598 120 "movq 0x18(%2),%%r10 \n\t" \
wolfSSL 0:9d17e4342598 121 "addq %3,%%rax \n\t" \
wolfSSL 0:9d17e4342598 122 "adcq $0,%%rdx \n\t" \
wolfSSL 0:9d17e4342598 123 "movq %%rax,0x10(%0) \n\t" \
wolfSSL 0:9d17e4342598 124 "movq %%rdx,%1 \n\t" \
wolfSSL 0:9d17e4342598 125 \
wolfSSL 0:9d17e4342598 126 "movq %%r11,%%rax \n\t" \
wolfSSL 0:9d17e4342598 127 "movq 0x20(%5),%%r11 \n\t" \
wolfSSL 0:9d17e4342598 128 "mulq %4 \n\t" \
wolfSSL 0:9d17e4342598 129 "addq %%r10,%%rax \n\t" \
wolfSSL 0:9d17e4342598 130 "adcq $0,%%rdx \n\t" \
wolfSSL 0:9d17e4342598 131 "movq 0x20(%2),%%r10 \n\t" \
wolfSSL 0:9d17e4342598 132 "addq %3,%%rax \n\t" \
wolfSSL 0:9d17e4342598 133 "adcq $0,%%rdx \n\t" \
wolfSSL 0:9d17e4342598 134 "movq %%rax,0x18(%0) \n\t" \
wolfSSL 0:9d17e4342598 135 "movq %%rdx,%1 \n\t" \
wolfSSL 0:9d17e4342598 136 \
wolfSSL 0:9d17e4342598 137 "movq %%r11,%%rax \n\t" \
wolfSSL 0:9d17e4342598 138 "movq 0x28(%5),%%r11 \n\t" \
wolfSSL 0:9d17e4342598 139 "mulq %4 \n\t" \
wolfSSL 0:9d17e4342598 140 "addq %%r10,%%rax \n\t" \
wolfSSL 0:9d17e4342598 141 "adcq $0,%%rdx \n\t" \
wolfSSL 0:9d17e4342598 142 "movq 0x28(%2),%%r10 \n\t" \
wolfSSL 0:9d17e4342598 143 "addq %3,%%rax \n\t" \
wolfSSL 0:9d17e4342598 144 "adcq $0,%%rdx \n\t" \
wolfSSL 0:9d17e4342598 145 "movq %%rax,0x20(%0) \n\t" \
wolfSSL 0:9d17e4342598 146 "movq %%rdx,%1 \n\t" \
wolfSSL 0:9d17e4342598 147 \
wolfSSL 0:9d17e4342598 148 "movq %%r11,%%rax \n\t" \
wolfSSL 0:9d17e4342598 149 "movq 0x30(%5),%%r11 \n\t" \
wolfSSL 0:9d17e4342598 150 "mulq %4 \n\t" \
wolfSSL 0:9d17e4342598 151 "addq %%r10,%%rax \n\t" \
wolfSSL 0:9d17e4342598 152 "adcq $0,%%rdx \n\t" \
wolfSSL 0:9d17e4342598 153 "movq 0x30(%2),%%r10 \n\t" \
wolfSSL 0:9d17e4342598 154 "addq %3,%%rax \n\t" \
wolfSSL 0:9d17e4342598 155 "adcq $0,%%rdx \n\t" \
wolfSSL 0:9d17e4342598 156 "movq %%rax,0x28(%0) \n\t" \
wolfSSL 0:9d17e4342598 157 "movq %%rdx,%1 \n\t" \
wolfSSL 0:9d17e4342598 158 \
wolfSSL 0:9d17e4342598 159 "movq %%r11,%%rax \n\t" \
wolfSSL 0:9d17e4342598 160 "movq 0x38(%5),%%r11 \n\t" \
wolfSSL 0:9d17e4342598 161 "mulq %4 \n\t" \
wolfSSL 0:9d17e4342598 162 "addq %%r10,%%rax \n\t" \
wolfSSL 0:9d17e4342598 163 "adcq $0,%%rdx \n\t" \
wolfSSL 0:9d17e4342598 164 "movq 0x38(%2),%%r10 \n\t" \
wolfSSL 0:9d17e4342598 165 "addq %3,%%rax \n\t" \
wolfSSL 0:9d17e4342598 166 "adcq $0,%%rdx \n\t" \
wolfSSL 0:9d17e4342598 167 "movq %%rax,0x30(%0) \n\t" \
wolfSSL 0:9d17e4342598 168 "movq %%rdx,%1 \n\t" \
wolfSSL 0:9d17e4342598 169 \
wolfSSL 0:9d17e4342598 170 "movq %%r11,%%rax \n\t" \
wolfSSL 0:9d17e4342598 171 "mulq %4 \n\t" \
wolfSSL 0:9d17e4342598 172 "addq %%r10,%%rax \n\t" \
wolfSSL 0:9d17e4342598 173 "adcq $0,%%rdx \n\t" \
wolfSSL 0:9d17e4342598 174 "addq %3,%%rax \n\t" \
wolfSSL 0:9d17e4342598 175 "adcq $0,%%rdx \n\t" \
wolfSSL 0:9d17e4342598 176 "movq %%rax,0x38(%0) \n\t" \
wolfSSL 0:9d17e4342598 177 "movq %%rdx,%1 \n\t" \
wolfSSL 0:9d17e4342598 178 \
wolfSSL 0:9d17e4342598 179 :"=r"(_c), "=r"(cy) \
wolfSSL 0:9d17e4342598 180 : "0"(_c), "1"(cy), "g"(mu), "r"(tmpm)\
wolfSSL 0:9d17e4342598 181 : "%rax", "%rdx", "%r10", "%r11", "cc")
wolfSSL 0:9d17e4342598 182
wolfSSL 0:9d17e4342598 183
wolfSSL 0:9d17e4342598 184 #define PROPCARRY \
wolfSSL 0:9d17e4342598 185 __asm__( \
wolfSSL 0:9d17e4342598 186 "addq %1,%0 \n\t" \
wolfSSL 0:9d17e4342598 187 "setb %%al \n\t" \
wolfSSL 0:9d17e4342598 188 "movzbq %%al,%1 \n\t" \
wolfSSL 0:9d17e4342598 189 :"=g"(_c[LO]), "=r"(cy) \
wolfSSL 0:9d17e4342598 190 :"0"(_c[LO]), "1"(cy) \
wolfSSL 0:9d17e4342598 191 : "%rax", "cc")
wolfSSL 0:9d17e4342598 192
wolfSSL 0:9d17e4342598 193 /******************************************************************/
wolfSSL 0:9d17e4342598 194 #elif defined(TFM_SSE2)
wolfSSL 0:9d17e4342598 195 /* SSE2 code (assumes 32-bit fp_digits) */
wolfSSL 0:9d17e4342598 196 /* XMM register assignments:
wolfSSL 0:9d17e4342598 197 * xmm0 *tmpm++, then Mu * (*tmpm++)
wolfSSL 0:9d17e4342598 198 * xmm1 c[x], then Mu
wolfSSL 0:9d17e4342598 199 * xmm2 mp
wolfSSL 0:9d17e4342598 200 * xmm3 cy
wolfSSL 0:9d17e4342598 201 * xmm4 _c[LO]
wolfSSL 0:9d17e4342598 202 */
wolfSSL 0:9d17e4342598 203
wolfSSL 0:9d17e4342598 204 #define MONT_START \
wolfSSL 0:9d17e4342598 205 __asm__("movd %0,%%mm2"::"g"(mp))
wolfSSL 0:9d17e4342598 206
wolfSSL 0:9d17e4342598 207 #define MONT_FINI \
wolfSSL 0:9d17e4342598 208 __asm__("emms")
wolfSSL 0:9d17e4342598 209
wolfSSL 0:9d17e4342598 210 #define LOOP_START \
wolfSSL 0:9d17e4342598 211 __asm__( \
wolfSSL 0:9d17e4342598 212 "movd %0,%%mm1 \n\t" \
wolfSSL 0:9d17e4342598 213 "pxor %%mm3,%%mm3 \n\t" \
wolfSSL 0:9d17e4342598 214 "pmuludq %%mm2,%%mm1 \n\t" \
wolfSSL 0:9d17e4342598 215 :: "g"(c[x]))
wolfSSL 0:9d17e4342598 216
wolfSSL 0:9d17e4342598 217 /* pmuludq on mmx registers does a 32x32->64 multiply. */
wolfSSL 0:9d17e4342598 218 #define INNERMUL \
wolfSSL 0:9d17e4342598 219 __asm__( \
wolfSSL 0:9d17e4342598 220 "movd %1,%%mm4 \n\t" \
wolfSSL 0:9d17e4342598 221 "movd %2,%%mm0 \n\t" \
wolfSSL 0:9d17e4342598 222 "paddq %%mm4,%%mm3 \n\t" \
wolfSSL 0:9d17e4342598 223 "pmuludq %%mm1,%%mm0 \n\t" \
wolfSSL 0:9d17e4342598 224 "paddq %%mm0,%%mm3 \n\t" \
wolfSSL 0:9d17e4342598 225 "movd %%mm3,%0 \n\t" \
wolfSSL 0:9d17e4342598 226 "psrlq $32, %%mm3 \n\t" \
wolfSSL 0:9d17e4342598 227 :"=g"(_c[LO]) : "0"(_c[LO]), "g"(*tmpm++) );
wolfSSL 0:9d17e4342598 228
wolfSSL 0:9d17e4342598 229 #define INNERMUL8 \
wolfSSL 0:9d17e4342598 230 __asm__( \
wolfSSL 0:9d17e4342598 231 "movd 0(%1),%%mm4 \n\t" \
wolfSSL 0:9d17e4342598 232 "movd 0(%2),%%mm0 \n\t" \
wolfSSL 0:9d17e4342598 233 "paddq %%mm4,%%mm3 \n\t" \
wolfSSL 0:9d17e4342598 234 "pmuludq %%mm1,%%mm0 \n\t" \
wolfSSL 0:9d17e4342598 235 "movd 4(%2),%%mm5 \n\t" \
wolfSSL 0:9d17e4342598 236 "paddq %%mm0,%%mm3 \n\t" \
wolfSSL 0:9d17e4342598 237 "movd 4(%1),%%mm6 \n\t" \
wolfSSL 0:9d17e4342598 238 "movd %%mm3,0(%0) \n\t" \
wolfSSL 0:9d17e4342598 239 "psrlq $32, %%mm3 \n\t" \
wolfSSL 0:9d17e4342598 240 \
wolfSSL 0:9d17e4342598 241 "paddq %%mm6,%%mm3 \n\t" \
wolfSSL 0:9d17e4342598 242 "pmuludq %%mm1,%%mm5 \n\t" \
wolfSSL 0:9d17e4342598 243 "movd 8(%2),%%mm6 \n\t" \
wolfSSL 0:9d17e4342598 244 "paddq %%mm5,%%mm3 \n\t" \
wolfSSL 0:9d17e4342598 245 "movd 8(%1),%%mm7 \n\t" \
wolfSSL 0:9d17e4342598 246 "movd %%mm3,4(%0) \n\t" \
wolfSSL 0:9d17e4342598 247 "psrlq $32, %%mm3 \n\t" \
wolfSSL 0:9d17e4342598 248 \
wolfSSL 0:9d17e4342598 249 "paddq %%mm7,%%mm3 \n\t" \
wolfSSL 0:9d17e4342598 250 "pmuludq %%mm1,%%mm6 \n\t" \
wolfSSL 0:9d17e4342598 251 "movd 12(%2),%%mm7 \n\t" \
wolfSSL 0:9d17e4342598 252 "paddq %%mm6,%%mm3 \n\t" \
wolfSSL 0:9d17e4342598 253 "movd 12(%1),%%mm5 \n\t" \
wolfSSL 0:9d17e4342598 254 "movd %%mm3,8(%0) \n\t" \
wolfSSL 0:9d17e4342598 255 "psrlq $32, %%mm3 \n\t" \
wolfSSL 0:9d17e4342598 256 \
wolfSSL 0:9d17e4342598 257 "paddq %%mm5,%%mm3 \n\t" \
wolfSSL 0:9d17e4342598 258 "pmuludq %%mm1,%%mm7 \n\t" \
wolfSSL 0:9d17e4342598 259 "movd 16(%2),%%mm5 \n\t" \
wolfSSL 0:9d17e4342598 260 "paddq %%mm7,%%mm3 \n\t" \
wolfSSL 0:9d17e4342598 261 "movd 16(%1),%%mm6 \n\t" \
wolfSSL 0:9d17e4342598 262 "movd %%mm3,12(%0) \n\t" \
wolfSSL 0:9d17e4342598 263 "psrlq $32, %%mm3 \n\t" \
wolfSSL 0:9d17e4342598 264 \
wolfSSL 0:9d17e4342598 265 "paddq %%mm6,%%mm3 \n\t" \
wolfSSL 0:9d17e4342598 266 "pmuludq %%mm1,%%mm5 \n\t" \
wolfSSL 0:9d17e4342598 267 "movd 20(%2),%%mm6 \n\t" \
wolfSSL 0:9d17e4342598 268 "paddq %%mm5,%%mm3 \n\t" \
wolfSSL 0:9d17e4342598 269 "movd 20(%1),%%mm7 \n\t" \
wolfSSL 0:9d17e4342598 270 "movd %%mm3,16(%0) \n\t" \
wolfSSL 0:9d17e4342598 271 "psrlq $32, %%mm3 \n\t" \
wolfSSL 0:9d17e4342598 272 \
wolfSSL 0:9d17e4342598 273 "paddq %%mm7,%%mm3 \n\t" \
wolfSSL 0:9d17e4342598 274 "pmuludq %%mm1,%%mm6 \n\t" \
wolfSSL 0:9d17e4342598 275 "movd 24(%2),%%mm7 \n\t" \
wolfSSL 0:9d17e4342598 276 "paddq %%mm6,%%mm3 \n\t" \
wolfSSL 0:9d17e4342598 277 "movd 24(%1),%%mm5 \n\t" \
wolfSSL 0:9d17e4342598 278 "movd %%mm3,20(%0) \n\t" \
wolfSSL 0:9d17e4342598 279 "psrlq $32, %%mm3 \n\t" \
wolfSSL 0:9d17e4342598 280 \
wolfSSL 0:9d17e4342598 281 "paddq %%mm5,%%mm3 \n\t" \
wolfSSL 0:9d17e4342598 282 "pmuludq %%mm1,%%mm7 \n\t" \
wolfSSL 0:9d17e4342598 283 "movd 28(%2),%%mm5 \n\t" \
wolfSSL 0:9d17e4342598 284 "paddq %%mm7,%%mm3 \n\t" \
wolfSSL 0:9d17e4342598 285 "movd 28(%1),%%mm6 \n\t" \
wolfSSL 0:9d17e4342598 286 "movd %%mm3,24(%0) \n\t" \
wolfSSL 0:9d17e4342598 287 "psrlq $32, %%mm3 \n\t" \
wolfSSL 0:9d17e4342598 288 \
wolfSSL 0:9d17e4342598 289 "paddq %%mm6,%%mm3 \n\t" \
wolfSSL 0:9d17e4342598 290 "pmuludq %%mm1,%%mm5 \n\t" \
wolfSSL 0:9d17e4342598 291 "paddq %%mm5,%%mm3 \n\t" \
wolfSSL 0:9d17e4342598 292 "movd %%mm3,28(%0) \n\t" \
wolfSSL 0:9d17e4342598 293 "psrlq $32, %%mm3 \n\t" \
wolfSSL 0:9d17e4342598 294 :"=r"(_c) : "0"(_c), "r"(tmpm) );
wolfSSL 0:9d17e4342598 295
wolfSSL 0:9d17e4342598 296 /* TAO switched tmpm from "g" to "r" after gcc tried to index the indexed stack
wolfSSL 0:9d17e4342598 297 pointer */
wolfSSL 0:9d17e4342598 298
wolfSSL 0:9d17e4342598 299 #define LOOP_END \
wolfSSL 0:9d17e4342598 300 __asm__( "movd %%mm3,%0 \n" :"=r"(cy))
wolfSSL 0:9d17e4342598 301
wolfSSL 0:9d17e4342598 302 #define PROPCARRY \
wolfSSL 0:9d17e4342598 303 __asm__( \
wolfSSL 0:9d17e4342598 304 "addl %1,%0 \n\t" \
wolfSSL 0:9d17e4342598 305 "setb %%al \n\t" \
wolfSSL 0:9d17e4342598 306 "movzbl %%al,%1 \n\t" \
wolfSSL 0:9d17e4342598 307 :"=g"(_c[LO]), "=r"(cy) \
wolfSSL 0:9d17e4342598 308 :"0"(_c[LO]), "1"(cy) \
wolfSSL 0:9d17e4342598 309 : "%eax", "cc")
wolfSSL 0:9d17e4342598 310
wolfSSL 0:9d17e4342598 311 /******************************************************************/
wolfSSL 0:9d17e4342598 312 #elif defined(TFM_ARM)
wolfSSL 0:9d17e4342598 313 /* ARMv4 code */
wolfSSL 0:9d17e4342598 314
wolfSSL 0:9d17e4342598 315 #define MONT_START
wolfSSL 0:9d17e4342598 316 #define MONT_FINI
wolfSSL 0:9d17e4342598 317 #define LOOP_END
wolfSSL 0:9d17e4342598 318 #define LOOP_START \
wolfSSL 0:9d17e4342598 319 mu = c[x] * mp
wolfSSL 0:9d17e4342598 320
wolfSSL 0:9d17e4342598 321
wolfSSL 0:9d17e4342598 322 #ifdef __thumb__
wolfSSL 0:9d17e4342598 323
wolfSSL 0:9d17e4342598 324 #define INNERMUL \
wolfSSL 0:9d17e4342598 325 __asm__( \
wolfSSL 0:9d17e4342598 326 " LDR r0,%1 \n\t" \
wolfSSL 0:9d17e4342598 327 " ADDS r0,r0,%0 \n\t" \
wolfSSL 0:9d17e4342598 328 " ITE CS \n\t" \
wolfSSL 0:9d17e4342598 329 " MOVCS %0,#1 \n\t" \
wolfSSL 0:9d17e4342598 330 " MOVCC %0,#0 \n\t" \
wolfSSL 0:9d17e4342598 331 " UMLAL r0,%0,%3,%4 \n\t" \
wolfSSL 0:9d17e4342598 332 " STR r0,%1 \n\t" \
wolfSSL 0:9d17e4342598 333 :"=r"(cy),"=m"(_c[0]):"0"(cy),"r"(mu),"r"(*tmpm++),"m"(_c[0]):"r0","cc");
wolfSSL 0:9d17e4342598 334
wolfSSL 0:9d17e4342598 335 #define PROPCARRY \
wolfSSL 0:9d17e4342598 336 __asm__( \
wolfSSL 0:9d17e4342598 337 " LDR r0,%1 \n\t" \
wolfSSL 0:9d17e4342598 338 " ADDS r0,r0,%0 \n\t" \
wolfSSL 0:9d17e4342598 339 " STR r0,%1 \n\t" \
wolfSSL 0:9d17e4342598 340 " ITE CS \n\t" \
wolfSSL 0:9d17e4342598 341 " MOVCS %0,#1 \n\t" \
wolfSSL 0:9d17e4342598 342 " MOVCC %0,#0 \n\t" \
wolfSSL 0:9d17e4342598 343 :"=r"(cy),"=m"(_c[0]):"0"(cy),"m"(_c[0]):"r0","cc");
wolfSSL 0:9d17e4342598 344
wolfSSL 0:9d17e4342598 345
wolfSSL 0:9d17e4342598 346 /* TAO thumb mode uses ite (if then else) to detect carry directly
wolfSSL 0:9d17e4342598 347 * fixed unmatched constraint warning by changing 1 to m */
wolfSSL 0:9d17e4342598 348
wolfSSL 0:9d17e4342598 349 #else /* __thumb__ */
wolfSSL 0:9d17e4342598 350
wolfSSL 0:9d17e4342598 351 #define INNERMUL \
wolfSSL 0:9d17e4342598 352 __asm__( \
wolfSSL 0:9d17e4342598 353 " LDR r0,%1 \n\t" \
wolfSSL 0:9d17e4342598 354 " ADDS r0,r0,%0 \n\t" \
wolfSSL 0:9d17e4342598 355 " MOVCS %0,#1 \n\t" \
wolfSSL 0:9d17e4342598 356 " MOVCC %0,#0 \n\t" \
wolfSSL 0:9d17e4342598 357 " UMLAL r0,%0,%3,%4 \n\t" \
wolfSSL 0:9d17e4342598 358 " STR r0,%1 \n\t" \
wolfSSL 0:9d17e4342598 359 :"=r"(cy),"=m"(_c[0]):"0"(cy),"r"(mu),"r"(*tmpm++),"1"(_c[0]):"r0","cc");
wolfSSL 0:9d17e4342598 360
wolfSSL 0:9d17e4342598 361 #define PROPCARRY \
wolfSSL 0:9d17e4342598 362 __asm__( \
wolfSSL 0:9d17e4342598 363 " LDR r0,%1 \n\t" \
wolfSSL 0:9d17e4342598 364 " ADDS r0,r0,%0 \n\t" \
wolfSSL 0:9d17e4342598 365 " STR r0,%1 \n\t" \
wolfSSL 0:9d17e4342598 366 " MOVCS %0,#1 \n\t" \
wolfSSL 0:9d17e4342598 367 " MOVCC %0,#0 \n\t" \
wolfSSL 0:9d17e4342598 368 :"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"r0","cc");
wolfSSL 0:9d17e4342598 369
wolfSSL 0:9d17e4342598 370 #endif /* __thumb__ */
wolfSSL 0:9d17e4342598 371
wolfSSL 0:9d17e4342598 372 #elif defined(TFM_PPC32)
wolfSSL 0:9d17e4342598 373
wolfSSL 0:9d17e4342598 374 /* PPC32 */
wolfSSL 0:9d17e4342598 375 #define MONT_START
wolfSSL 0:9d17e4342598 376 #define MONT_FINI
wolfSSL 0:9d17e4342598 377 #define LOOP_END
wolfSSL 0:9d17e4342598 378 #define LOOP_START \
wolfSSL 0:9d17e4342598 379 mu = c[x] * mp
wolfSSL 0:9d17e4342598 380
wolfSSL 0:9d17e4342598 381 #define INNERMUL \
wolfSSL 0:9d17e4342598 382 __asm__( \
wolfSSL 0:9d17e4342598 383 " mullw 16,%3,%4 \n\t" \
wolfSSL 0:9d17e4342598 384 " mulhwu 17,%3,%4 \n\t" \
wolfSSL 0:9d17e4342598 385 " addc 16,16,%0 \n\t" \
wolfSSL 0:9d17e4342598 386 " addze 17,17 \n\t" \
wolfSSL 0:9d17e4342598 387 " lwz 18,%1 \n\t" \
wolfSSL 0:9d17e4342598 388 " addc 16,16,18 \n\t" \
wolfSSL 0:9d17e4342598 389 " addze %0,17 \n\t" \
wolfSSL 0:9d17e4342598 390 " stw 16,%1 \n\t" \
wolfSSL 0:9d17e4342598 391 :"=r"(cy),"=m"(_c[0]):"0"(cy),"r"(mu),"r"(tmpm[0]),"1"(_c[0]):"16", "17", "18","cc"); ++tmpm;
wolfSSL 0:9d17e4342598 392
wolfSSL 0:9d17e4342598 393 #define PROPCARRY \
wolfSSL 0:9d17e4342598 394 __asm__( \
wolfSSL 0:9d17e4342598 395 " lwz 16,%1 \n\t" \
wolfSSL 0:9d17e4342598 396 " addc 16,16,%0 \n\t" \
wolfSSL 0:9d17e4342598 397 " stw 16,%1 \n\t" \
wolfSSL 0:9d17e4342598 398 " xor %0,%0,%0 \n\t" \
wolfSSL 0:9d17e4342598 399 " addze %0,%0 \n\t" \
wolfSSL 0:9d17e4342598 400 :"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"16","cc");
wolfSSL 0:9d17e4342598 401
wolfSSL 0:9d17e4342598 402 #elif defined(TFM_PPC64)
wolfSSL 0:9d17e4342598 403
wolfSSL 0:9d17e4342598 404 /* PPC64 */
wolfSSL 0:9d17e4342598 405 #define MONT_START
wolfSSL 0:9d17e4342598 406 #define MONT_FINI
wolfSSL 0:9d17e4342598 407 #define LOOP_END
wolfSSL 0:9d17e4342598 408 #define LOOP_START \
wolfSSL 0:9d17e4342598 409 mu = c[x] * mp
wolfSSL 0:9d17e4342598 410
wolfSSL 0:9d17e4342598 411 #define INNERMUL \
wolfSSL 0:9d17e4342598 412 __asm__( \
wolfSSL 0:9d17e4342598 413 " mulld 16,%3,%4 \n\t" \
wolfSSL 0:9d17e4342598 414 " mulhdu 17,%3,%4 \n\t" \
wolfSSL 0:9d17e4342598 415 " addc 16,16,%0 \n\t" \
wolfSSL 0:9d17e4342598 416 " addze 17,17 \n\t" \
wolfSSL 0:9d17e4342598 417 " ldx 18,0,%1 \n\t" \
wolfSSL 0:9d17e4342598 418 " addc 16,16,18 \n\t" \
wolfSSL 0:9d17e4342598 419 " addze %0,17 \n\t" \
wolfSSL 0:9d17e4342598 420 " sdx 16,0,%1 \n\t" \
wolfSSL 0:9d17e4342598 421 :"=r"(cy),"=m"(_c[0]):"0"(cy),"r"(mu),"r"(tmpm[0]),"1"(_c[0]):"16", "17", "18","cc"); ++tmpm;
wolfSSL 0:9d17e4342598 422
wolfSSL 0:9d17e4342598 423 #define PROPCARRY \
wolfSSL 0:9d17e4342598 424 __asm__( \
wolfSSL 0:9d17e4342598 425 " ldx 16,0,%1 \n\t" \
wolfSSL 0:9d17e4342598 426 " addc 16,16,%0 \n\t" \
wolfSSL 0:9d17e4342598 427 " sdx 16,0,%1 \n\t" \
wolfSSL 0:9d17e4342598 428 " xor %0,%0,%0 \n\t" \
wolfSSL 0:9d17e4342598 429 " addze %0,%0 \n\t" \
wolfSSL 0:9d17e4342598 430 :"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"16","cc");
wolfSSL 0:9d17e4342598 431
wolfSSL 0:9d17e4342598 432 /******************************************************************/
wolfSSL 0:9d17e4342598 433
wolfSSL 0:9d17e4342598 434 #elif defined(TFM_AVR32)
wolfSSL 0:9d17e4342598 435
wolfSSL 0:9d17e4342598 436 /* AVR32 */
wolfSSL 0:9d17e4342598 437 #define MONT_START
wolfSSL 0:9d17e4342598 438 #define MONT_FINI
wolfSSL 0:9d17e4342598 439 #define LOOP_END
wolfSSL 0:9d17e4342598 440 #define LOOP_START \
wolfSSL 0:9d17e4342598 441 mu = c[x] * mp
wolfSSL 0:9d17e4342598 442
wolfSSL 0:9d17e4342598 443 #define INNERMUL \
wolfSSL 0:9d17e4342598 444 __asm__( \
wolfSSL 0:9d17e4342598 445 " ld.w r2,%1 \n\t" \
wolfSSL 0:9d17e4342598 446 " add r2,%0 \n\t" \
wolfSSL 0:9d17e4342598 447 " eor r3,r3 \n\t" \
wolfSSL 0:9d17e4342598 448 " acr r3 \n\t" \
wolfSSL 0:9d17e4342598 449 " macu.d r2,%3,%4 \n\t" \
wolfSSL 0:9d17e4342598 450 " st.w %1,r2 \n\t" \
wolfSSL 0:9d17e4342598 451 " mov %0,r3 \n\t" \
wolfSSL 0:9d17e4342598 452 :"=r"(cy),"=r"(_c):"0"(cy),"r"(mu),"r"(*tmpm++),"1"(_c):"r2","r3");
wolfSSL 0:9d17e4342598 453
wolfSSL 0:9d17e4342598 454 #define PROPCARRY \
wolfSSL 0:9d17e4342598 455 __asm__( \
wolfSSL 0:9d17e4342598 456 " ld.w r2,%1 \n\t" \
wolfSSL 0:9d17e4342598 457 " add r2,%0 \n\t" \
wolfSSL 0:9d17e4342598 458 " st.w %1,r2 \n\t" \
wolfSSL 0:9d17e4342598 459 " eor %0,%0 \n\t" \
wolfSSL 0:9d17e4342598 460 " acr %0 \n\t" \
wolfSSL 0:9d17e4342598 461 :"=r"(cy),"=r"(&_c[0]):"0"(cy),"1"(&_c[0]):"r2","cc");
wolfSSL 0:9d17e4342598 462
wolfSSL 0:9d17e4342598 463 #else
wolfSSL 0:9d17e4342598 464
wolfSSL 0:9d17e4342598 465 /* ISO C code */
wolfSSL 0:9d17e4342598 466 #define MONT_START
wolfSSL 0:9d17e4342598 467 #define MONT_FINI
wolfSSL 0:9d17e4342598 468 #define LOOP_END
wolfSSL 0:9d17e4342598 469 #define LOOP_START \
wolfSSL 0:9d17e4342598 470 mu = c[x] * mp
wolfSSL 0:9d17e4342598 471
wolfSSL 0:9d17e4342598 472 #define INNERMUL \
wolfSSL 0:9d17e4342598 473 do { fp_word t; \
wolfSSL 0:9d17e4342598 474 t = ((fp_word)_c[0] + (fp_word)cy) + \
wolfSSL 0:9d17e4342598 475 (((fp_word)mu) * ((fp_word)*tmpm++)); \
wolfSSL 0:9d17e4342598 476 _c[0] = (fp_digit)t; \
wolfSSL 0:9d17e4342598 477 cy = (fp_digit)(t >> DIGIT_BIT); \
wolfSSL 0:9d17e4342598 478 } while (0)
wolfSSL 0:9d17e4342598 479
wolfSSL 0:9d17e4342598 480 #define PROPCARRY \
wolfSSL 0:9d17e4342598 481 do { fp_digit t = _c[0] += cy; cy = (t < cy); } while (0)
wolfSSL 0:9d17e4342598 482
wolfSSL 0:9d17e4342598 483 #endif
wolfSSL 0:9d17e4342598 484 /******************************************************************/
wolfSSL 0:9d17e4342598 485
wolfSSL 0:9d17e4342598 486
wolfSSL 0:9d17e4342598 487 #define LO 0
wolfSSL 0:9d17e4342598 488 /* end fp_montogomery_reduce.c asm */
wolfSSL 0:9d17e4342598 489
wolfSSL 0:9d17e4342598 490
wolfSSL 0:9d17e4342598 491 /* start fp_sqr_comba.c asm */
wolfSSL 0:9d17e4342598 492 #if defined(TFM_X86)
wolfSSL 0:9d17e4342598 493
wolfSSL 0:9d17e4342598 494 /* x86-32 optimized */
wolfSSL 0:9d17e4342598 495
wolfSSL 0:9d17e4342598 496 #define COMBA_START
wolfSSL 0:9d17e4342598 497
wolfSSL 0:9d17e4342598 498 #define CLEAR_CARRY \
wolfSSL 0:9d17e4342598 499 c0 = c1 = c2 = 0;
wolfSSL 0:9d17e4342598 500
wolfSSL 0:9d17e4342598 501 #define COMBA_STORE(x) \
wolfSSL 0:9d17e4342598 502 x = c0;
wolfSSL 0:9d17e4342598 503
wolfSSL 0:9d17e4342598 504 #define COMBA_STORE2(x) \
wolfSSL 0:9d17e4342598 505 x = c1;
wolfSSL 0:9d17e4342598 506
wolfSSL 0:9d17e4342598 507 #define CARRY_FORWARD \
wolfSSL 0:9d17e4342598 508 do { c0 = c1; c1 = c2; c2 = 0; } while (0);
wolfSSL 0:9d17e4342598 509
wolfSSL 0:9d17e4342598 510 #define COMBA_FINI
wolfSSL 0:9d17e4342598 511
wolfSSL 0:9d17e4342598 512 #define SQRADD(i, j) \
wolfSSL 0:9d17e4342598 513 __asm__( \
wolfSSL 0:9d17e4342598 514 "movl %6,%%eax \n\t" \
wolfSSL 0:9d17e4342598 515 "mull %%eax \n\t" \
wolfSSL 0:9d17e4342598 516 "addl %%eax,%0 \n\t" \
wolfSSL 0:9d17e4342598 517 "adcl %%edx,%1 \n\t" \
wolfSSL 0:9d17e4342598 518 "adcl $0,%2 \n\t" \
wolfSSL 0:9d17e4342598 519 :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i) :"%eax","%edx","cc");
wolfSSL 0:9d17e4342598 520
wolfSSL 0:9d17e4342598 521 #define SQRADD2(i, j) \
wolfSSL 0:9d17e4342598 522 __asm__( \
wolfSSL 0:9d17e4342598 523 "movl %6,%%eax \n\t" \
wolfSSL 0:9d17e4342598 524 "mull %7 \n\t" \
wolfSSL 0:9d17e4342598 525 "addl %%eax,%0 \n\t" \
wolfSSL 0:9d17e4342598 526 "adcl %%edx,%1 \n\t" \
wolfSSL 0:9d17e4342598 527 "adcl $0,%2 \n\t" \
wolfSSL 0:9d17e4342598 528 "addl %%eax,%0 \n\t" \
wolfSSL 0:9d17e4342598 529 "adcl %%edx,%1 \n\t" \
wolfSSL 0:9d17e4342598 530 "adcl $0,%2 \n\t" \
wolfSSL 0:9d17e4342598 531 :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j) :"%eax","%edx", "cc");
wolfSSL 0:9d17e4342598 532
wolfSSL 0:9d17e4342598 533 #define SQRADDSC(i, j) \
wolfSSL 0:9d17e4342598 534 __asm__( \
wolfSSL 0:9d17e4342598 535 "movl %3,%%eax \n\t" \
wolfSSL 0:9d17e4342598 536 "mull %4 \n\t" \
wolfSSL 0:9d17e4342598 537 "movl %%eax,%0 \n\t" \
wolfSSL 0:9d17e4342598 538 "movl %%edx,%1 \n\t" \
wolfSSL 0:9d17e4342598 539 "xorl %2,%2 \n\t" \
wolfSSL 0:9d17e4342598 540 :"=r"(sc0), "=r"(sc1), "=r"(sc2): "g"(i), "g"(j) :"%eax","%edx","cc");
wolfSSL 0:9d17e4342598 541
wolfSSL 0:9d17e4342598 542 /* TAO removed sc0,1,2 as input to remove warning so %6,%7 become %3,%4 */
wolfSSL 0:9d17e4342598 543
wolfSSL 0:9d17e4342598 544 #define SQRADDAC(i, j) \
wolfSSL 0:9d17e4342598 545 __asm__( \
wolfSSL 0:9d17e4342598 546 "movl %6,%%eax \n\t" \
wolfSSL 0:9d17e4342598 547 "mull %7 \n\t" \
wolfSSL 0:9d17e4342598 548 "addl %%eax,%0 \n\t" \
wolfSSL 0:9d17e4342598 549 "adcl %%edx,%1 \n\t" \
wolfSSL 0:9d17e4342598 550 "adcl $0,%2 \n\t" \
wolfSSL 0:9d17e4342598 551 :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%eax","%edx","cc");
wolfSSL 0:9d17e4342598 552
wolfSSL 0:9d17e4342598 553 #define SQRADDDB \
wolfSSL 0:9d17e4342598 554 __asm__( \
wolfSSL 0:9d17e4342598 555 "addl %6,%0 \n\t" \
wolfSSL 0:9d17e4342598 556 "adcl %7,%1 \n\t" \
wolfSSL 0:9d17e4342598 557 "adcl %8,%2 \n\t" \
wolfSSL 0:9d17e4342598 558 "addl %6,%0 \n\t" \
wolfSSL 0:9d17e4342598 559 "adcl %7,%1 \n\t" \
wolfSSL 0:9d17e4342598 560 "adcl %8,%2 \n\t" \
wolfSSL 0:9d17e4342598 561 :"=r"(c0), "=r"(c1), "=r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(sc0), "r"(sc1), "r"(sc2) : "cc");
wolfSSL 0:9d17e4342598 562
wolfSSL 0:9d17e4342598 563 #elif defined(TFM_X86_64)
wolfSSL 0:9d17e4342598 564 /* x86-64 optimized */
wolfSSL 0:9d17e4342598 565
wolfSSL 0:9d17e4342598 566 #define COMBA_START
wolfSSL 0:9d17e4342598 567
wolfSSL 0:9d17e4342598 568 #define CLEAR_CARRY \
wolfSSL 0:9d17e4342598 569 c0 = c1 = c2 = 0;
wolfSSL 0:9d17e4342598 570
wolfSSL 0:9d17e4342598 571 #define COMBA_STORE(x) \
wolfSSL 0:9d17e4342598 572 x = c0;
wolfSSL 0:9d17e4342598 573
wolfSSL 0:9d17e4342598 574 #define COMBA_STORE2(x) \
wolfSSL 0:9d17e4342598 575 x = c1;
wolfSSL 0:9d17e4342598 576
wolfSSL 0:9d17e4342598 577 #define CARRY_FORWARD \
wolfSSL 0:9d17e4342598 578 do { c0 = c1; c1 = c2; c2 = 0; } while (0);
wolfSSL 0:9d17e4342598 579
wolfSSL 0:9d17e4342598 580 #define COMBA_FINI
wolfSSL 0:9d17e4342598 581
wolfSSL 0:9d17e4342598 582 #define SQRADD(i, j) \
wolfSSL 0:9d17e4342598 583 __asm__( \
wolfSSL 0:9d17e4342598 584 "movq %6,%%rax \n\t" \
wolfSSL 0:9d17e4342598 585 "mulq %%rax \n\t" \
wolfSSL 0:9d17e4342598 586 "addq %%rax,%0 \n\t" \
wolfSSL 0:9d17e4342598 587 "adcq %%rdx,%1 \n\t" \
wolfSSL 0:9d17e4342598 588 "adcq $0,%2 \n\t" \
wolfSSL 0:9d17e4342598 589 :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i) :"%rax","%rdx","cc");
wolfSSL 0:9d17e4342598 590
wolfSSL 0:9d17e4342598 591 #define SQRADD2(i, j) \
wolfSSL 0:9d17e4342598 592 __asm__( \
wolfSSL 0:9d17e4342598 593 "movq %6,%%rax \n\t" \
wolfSSL 0:9d17e4342598 594 "mulq %7 \n\t" \
wolfSSL 0:9d17e4342598 595 "addq %%rax,%0 \n\t" \
wolfSSL 0:9d17e4342598 596 "adcq %%rdx,%1 \n\t" \
wolfSSL 0:9d17e4342598 597 "adcq $0,%2 \n\t" \
wolfSSL 0:9d17e4342598 598 "addq %%rax,%0 \n\t" \
wolfSSL 0:9d17e4342598 599 "adcq %%rdx,%1 \n\t" \
wolfSSL 0:9d17e4342598 600 "adcq $0,%2 \n\t" \
wolfSSL 0:9d17e4342598 601 :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j) :"%rax","%rdx","cc");
wolfSSL 0:9d17e4342598 602
wolfSSL 0:9d17e4342598 603 #define SQRADDSC(i, j) \
wolfSSL 0:9d17e4342598 604 __asm__( \
wolfSSL 0:9d17e4342598 605 "movq %3,%%rax \n\t" \
wolfSSL 0:9d17e4342598 606 "mulq %4 \n\t" \
wolfSSL 0:9d17e4342598 607 "movq %%rax,%0 \n\t" \
wolfSSL 0:9d17e4342598 608 "movq %%rdx,%1 \n\t" \
wolfSSL 0:9d17e4342598 609 "xorq %2,%2 \n\t" \
wolfSSL 0:9d17e4342598 610 :"=r"(sc0), "=r"(sc1), "=r"(sc2): "g"(i), "g"(j) :"%rax","%rdx","cc");
wolfSSL 0:9d17e4342598 611
wolfSSL 0:9d17e4342598 612 /* TAO removed sc0,1,2 as input to remove warning so %6,%7 become %3,%4 */
wolfSSL 0:9d17e4342598 613
wolfSSL 0:9d17e4342598 614 #define SQRADDAC(i, j) \
wolfSSL 0:9d17e4342598 615 __asm__( \
wolfSSL 0:9d17e4342598 616 "movq %6,%%rax \n\t" \
wolfSSL 0:9d17e4342598 617 "mulq %7 \n\t" \
wolfSSL 0:9d17e4342598 618 "addq %%rax,%0 \n\t" \
wolfSSL 0:9d17e4342598 619 "adcq %%rdx,%1 \n\t" \
wolfSSL 0:9d17e4342598 620 "adcq $0,%2 \n\t" \
wolfSSL 0:9d17e4342598 621 :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%rax","%rdx","cc");
wolfSSL 0:9d17e4342598 622
wolfSSL 0:9d17e4342598 623 #define SQRADDDB \
wolfSSL 0:9d17e4342598 624 __asm__( \
wolfSSL 0:9d17e4342598 625 "addq %6,%0 \n\t" \
wolfSSL 0:9d17e4342598 626 "adcq %7,%1 \n\t" \
wolfSSL 0:9d17e4342598 627 "adcq %8,%2 \n\t" \
wolfSSL 0:9d17e4342598 628 "addq %6,%0 \n\t" \
wolfSSL 0:9d17e4342598 629 "adcq %7,%1 \n\t" \
wolfSSL 0:9d17e4342598 630 "adcq %8,%2 \n\t" \
wolfSSL 0:9d17e4342598 631 :"=r"(c0), "=r"(c1), "=r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(sc0), "r"(sc1), "r"(sc2) : "cc");
wolfSSL 0:9d17e4342598 632
wolfSSL 0:9d17e4342598 633 #elif defined(TFM_SSE2)
wolfSSL 0:9d17e4342598 634
wolfSSL 0:9d17e4342598 635 /* SSE2 Optimized */
wolfSSL 0:9d17e4342598 636 #define COMBA_START
wolfSSL 0:9d17e4342598 637
wolfSSL 0:9d17e4342598 638 #define CLEAR_CARRY \
wolfSSL 0:9d17e4342598 639 c0 = c1 = c2 = 0;
wolfSSL 0:9d17e4342598 640
wolfSSL 0:9d17e4342598 641 #define COMBA_STORE(x) \
wolfSSL 0:9d17e4342598 642 x = c0;
wolfSSL 0:9d17e4342598 643
wolfSSL 0:9d17e4342598 644 #define COMBA_STORE2(x) \
wolfSSL 0:9d17e4342598 645 x = c1;
wolfSSL 0:9d17e4342598 646
wolfSSL 0:9d17e4342598 647 #define CARRY_FORWARD \
wolfSSL 0:9d17e4342598 648 do { c0 = c1; c1 = c2; c2 = 0; } while (0);
wolfSSL 0:9d17e4342598 649
wolfSSL 0:9d17e4342598 650 #define COMBA_FINI \
wolfSSL 0:9d17e4342598 651 __asm__("emms");
wolfSSL 0:9d17e4342598 652
wolfSSL 0:9d17e4342598 653 #define SQRADD(i, j) \
wolfSSL 0:9d17e4342598 654 __asm__( \
wolfSSL 0:9d17e4342598 655 "movd %6,%%mm0 \n\t" \
wolfSSL 0:9d17e4342598 656 "pmuludq %%mm0,%%mm0\n\t" \
wolfSSL 0:9d17e4342598 657 "movd %%mm0,%%eax \n\t" \
wolfSSL 0:9d17e4342598 658 "psrlq $32,%%mm0 \n\t" \
wolfSSL 0:9d17e4342598 659 "addl %%eax,%0 \n\t" \
wolfSSL 0:9d17e4342598 660 "movd %%mm0,%%eax \n\t" \
wolfSSL 0:9d17e4342598 661 "adcl %%eax,%1 \n\t" \
wolfSSL 0:9d17e4342598 662 "adcl $0,%2 \n\t" \
wolfSSL 0:9d17e4342598 663 :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i) :"%eax","cc");
wolfSSL 0:9d17e4342598 664
wolfSSL 0:9d17e4342598 665 #define SQRADD2(i, j) \
wolfSSL 0:9d17e4342598 666 __asm__( \
wolfSSL 0:9d17e4342598 667 "movd %6,%%mm0 \n\t" \
wolfSSL 0:9d17e4342598 668 "movd %7,%%mm1 \n\t" \
wolfSSL 0:9d17e4342598 669 "pmuludq %%mm1,%%mm0\n\t" \
wolfSSL 0:9d17e4342598 670 "movd %%mm0,%%eax \n\t" \
wolfSSL 0:9d17e4342598 671 "psrlq $32,%%mm0 \n\t" \
wolfSSL 0:9d17e4342598 672 "movd %%mm0,%%edx \n\t" \
wolfSSL 0:9d17e4342598 673 "addl %%eax,%0 \n\t" \
wolfSSL 0:9d17e4342598 674 "adcl %%edx,%1 \n\t" \
wolfSSL 0:9d17e4342598 675 "adcl $0,%2 \n\t" \
wolfSSL 0:9d17e4342598 676 "addl %%eax,%0 \n\t" \
wolfSSL 0:9d17e4342598 677 "adcl %%edx,%1 \n\t" \
wolfSSL 0:9d17e4342598 678 "adcl $0,%2 \n\t" \
wolfSSL 0:9d17e4342598 679 :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j) :"%eax","%edx","cc");
wolfSSL 0:9d17e4342598 680
wolfSSL 0:9d17e4342598 681 #define SQRADDSC(i, j) \
wolfSSL 0:9d17e4342598 682 __asm__( \
wolfSSL 0:9d17e4342598 683 "movd %3,%%mm0 \n\t" \
wolfSSL 0:9d17e4342598 684 "movd %4,%%mm1 \n\t" \
wolfSSL 0:9d17e4342598 685 "pmuludq %%mm1,%%mm0\n\t" \
wolfSSL 0:9d17e4342598 686 "movd %%mm0,%0 \n\t" \
wolfSSL 0:9d17e4342598 687 "psrlq $32,%%mm0 \n\t" \
wolfSSL 0:9d17e4342598 688 "movd %%mm0,%1 \n\t" \
wolfSSL 0:9d17e4342598 689 "xorl %2,%2 \n\t" \
wolfSSL 0:9d17e4342598 690 :"=r"(sc0), "=r"(sc1), "=r"(sc2): "m"(i), "m"(j));
wolfSSL 0:9d17e4342598 691
wolfSSL 0:9d17e4342598 692 /* TAO removed sc0,1,2 as input to remove warning so %6,%7 become %3,%4 */
wolfSSL 0:9d17e4342598 693
wolfSSL 0:9d17e4342598 694 #define SQRADDAC(i, j) \
wolfSSL 0:9d17e4342598 695 __asm__( \
wolfSSL 0:9d17e4342598 696 "movd %6,%%mm0 \n\t" \
wolfSSL 0:9d17e4342598 697 "movd %7,%%mm1 \n\t" \
wolfSSL 0:9d17e4342598 698 "pmuludq %%mm1,%%mm0\n\t" \
wolfSSL 0:9d17e4342598 699 "movd %%mm0,%%eax \n\t" \
wolfSSL 0:9d17e4342598 700 "psrlq $32,%%mm0 \n\t" \
wolfSSL 0:9d17e4342598 701 "movd %%mm0,%%edx \n\t" \
wolfSSL 0:9d17e4342598 702 "addl %%eax,%0 \n\t" \
wolfSSL 0:9d17e4342598 703 "adcl %%edx,%1 \n\t" \
wolfSSL 0:9d17e4342598 704 "adcl $0,%2 \n\t" \
wolfSSL 0:9d17e4342598 705 :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "m"(i), "m"(j) :"%eax","%edx","cc");
wolfSSL 0:9d17e4342598 706
wolfSSL 0:9d17e4342598 707 #define SQRADDDB \
wolfSSL 0:9d17e4342598 708 __asm__( \
wolfSSL 0:9d17e4342598 709 "addl %6,%0 \n\t" \
wolfSSL 0:9d17e4342598 710 "adcl %7,%1 \n\t" \
wolfSSL 0:9d17e4342598 711 "adcl %8,%2 \n\t" \
wolfSSL 0:9d17e4342598 712 "addl %6,%0 \n\t" \
wolfSSL 0:9d17e4342598 713 "adcl %7,%1 \n\t" \
wolfSSL 0:9d17e4342598 714 "adcl %8,%2 \n\t" \
wolfSSL 0:9d17e4342598 715 :"=r"(c0), "=r"(c1), "=r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(sc0), "r"(sc1), "r"(sc2) : "cc");
wolfSSL 0:9d17e4342598 716
wolfSSL 0:9d17e4342598 717 #elif defined(TFM_ARM)
wolfSSL 0:9d17e4342598 718
wolfSSL 0:9d17e4342598 719 /* ARM code */
wolfSSL 0:9d17e4342598 720
wolfSSL 0:9d17e4342598 721 #define COMBA_START
wolfSSL 0:9d17e4342598 722
wolfSSL 0:9d17e4342598 723 #define CLEAR_CARRY \
wolfSSL 0:9d17e4342598 724 c0 = c1 = c2 = 0;
wolfSSL 0:9d17e4342598 725
wolfSSL 0:9d17e4342598 726 #define COMBA_STORE(x) \
wolfSSL 0:9d17e4342598 727 x = c0;
wolfSSL 0:9d17e4342598 728
wolfSSL 0:9d17e4342598 729 #define COMBA_STORE2(x) \
wolfSSL 0:9d17e4342598 730 x = c1;
wolfSSL 0:9d17e4342598 731
wolfSSL 0:9d17e4342598 732 #define CARRY_FORWARD \
wolfSSL 0:9d17e4342598 733 do { c0 = c1; c1 = c2; c2 = 0; } while (0);
wolfSSL 0:9d17e4342598 734
wolfSSL 0:9d17e4342598 735 #define COMBA_FINI
wolfSSL 0:9d17e4342598 736
wolfSSL 0:9d17e4342598 737 /* multiplies point i and j, updates carry "c1" and digit c2 */
wolfSSL 0:9d17e4342598 738 #define SQRADD(i, j) \
wolfSSL 0:9d17e4342598 739 __asm__( \
wolfSSL 0:9d17e4342598 740 " UMULL r0,r1,%6,%6 \n\t" \
wolfSSL 0:9d17e4342598 741 " ADDS %0,%0,r0 \n\t" \
wolfSSL 0:9d17e4342598 742 " ADCS %1,%1,r1 \n\t" \
wolfSSL 0:9d17e4342598 743 " ADC %2,%2,#0 \n\t" \
wolfSSL 0:9d17e4342598 744 :"=r"(c0), "=r"(c1), "=r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(i) : "r0", "r1", "cc");
wolfSSL 0:9d17e4342598 745
wolfSSL 0:9d17e4342598 746 /* for squaring some of the terms are doubled... */
wolfSSL 0:9d17e4342598 747 #define SQRADD2(i, j) \
wolfSSL 0:9d17e4342598 748 __asm__( \
wolfSSL 0:9d17e4342598 749 " UMULL r0,r1,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 750 " ADDS %0,%0,r0 \n\t" \
wolfSSL 0:9d17e4342598 751 " ADCS %1,%1,r1 \n\t" \
wolfSSL 0:9d17e4342598 752 " ADC %2,%2,#0 \n\t" \
wolfSSL 0:9d17e4342598 753 " ADDS %0,%0,r0 \n\t" \
wolfSSL 0:9d17e4342598 754 " ADCS %1,%1,r1 \n\t" \
wolfSSL 0:9d17e4342598 755 " ADC %2,%2,#0 \n\t" \
wolfSSL 0:9d17e4342598 756 :"=r"(c0), "=r"(c1), "=r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j) : "r0", "r1", "cc");
wolfSSL 0:9d17e4342598 757
wolfSSL 0:9d17e4342598 758 #define SQRADDSC(i, j) \
wolfSSL 0:9d17e4342598 759 __asm__( \
wolfSSL 0:9d17e4342598 760 " UMULL %0,%1,%3,%4 \n\t" \
wolfSSL 0:9d17e4342598 761 " SUB %2,%2,%2 \n\t" \
wolfSSL 0:9d17e4342598 762 :"=r"(sc0), "=r"(sc1), "=r"(sc2) : "r"(i), "r"(j) : "cc");
wolfSSL 0:9d17e4342598 763
wolfSSL 0:9d17e4342598 764 /* TAO removed sc0,1,2 as input to remove warning so %6,%7 become %3,%4 */
wolfSSL 0:9d17e4342598 765
wolfSSL 0:9d17e4342598 766 #define SQRADDAC(i, j) \
wolfSSL 0:9d17e4342598 767 __asm__( \
wolfSSL 0:9d17e4342598 768 " UMULL r0,r1,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 769 " ADDS %0,%0,r0 \n\t" \
wolfSSL 0:9d17e4342598 770 " ADCS %1,%1,r1 \n\t" \
wolfSSL 0:9d17e4342598 771 " ADC %2,%2,#0 \n\t" \
wolfSSL 0:9d17e4342598 772 :"=r"(sc0), "=r"(sc1), "=r"(sc2) : "0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j) : "r0", "r1", "cc");
wolfSSL 0:9d17e4342598 773
wolfSSL 0:9d17e4342598 774 #define SQRADDDB \
wolfSSL 0:9d17e4342598 775 __asm__( \
wolfSSL 0:9d17e4342598 776 " ADDS %0,%0,%3 \n\t" \
wolfSSL 0:9d17e4342598 777 " ADCS %1,%1,%4 \n\t" \
wolfSSL 0:9d17e4342598 778 " ADC %2,%2,%5 \n\t" \
wolfSSL 0:9d17e4342598 779 " ADDS %0,%0,%3 \n\t" \
wolfSSL 0:9d17e4342598 780 " ADCS %1,%1,%4 \n\t" \
wolfSSL 0:9d17e4342598 781 " ADC %2,%2,%5 \n\t" \
wolfSSL 0:9d17e4342598 782 :"=r"(c0), "=r"(c1), "=r"(c2) : "r"(sc0), "r"(sc1), "r"(sc2), "0"(c0), "1"(c1), "2"(c2) : "cc");
wolfSSL 0:9d17e4342598 783
wolfSSL 0:9d17e4342598 784 #elif defined(TFM_PPC32)
wolfSSL 0:9d17e4342598 785
wolfSSL 0:9d17e4342598 786 /* PPC32 */
wolfSSL 0:9d17e4342598 787
wolfSSL 0:9d17e4342598 788 #define COMBA_START
wolfSSL 0:9d17e4342598 789
wolfSSL 0:9d17e4342598 790 #define CLEAR_CARRY \
wolfSSL 0:9d17e4342598 791 c0 = c1 = c2 = 0;
wolfSSL 0:9d17e4342598 792
wolfSSL 0:9d17e4342598 793 #define COMBA_STORE(x) \
wolfSSL 0:9d17e4342598 794 x = c0;
wolfSSL 0:9d17e4342598 795
wolfSSL 0:9d17e4342598 796 #define COMBA_STORE2(x) \
wolfSSL 0:9d17e4342598 797 x = c1;
wolfSSL 0:9d17e4342598 798
wolfSSL 0:9d17e4342598 799 #define CARRY_FORWARD \
wolfSSL 0:9d17e4342598 800 do { c0 = c1; c1 = c2; c2 = 0; } while (0);
wolfSSL 0:9d17e4342598 801
wolfSSL 0:9d17e4342598 802 #define COMBA_FINI
wolfSSL 0:9d17e4342598 803
wolfSSL 0:9d17e4342598 804 /* multiplies point i and j, updates carry "c1" and digit c2 */
wolfSSL 0:9d17e4342598 805 #define SQRADD(i, j) \
wolfSSL 0:9d17e4342598 806 __asm__( \
wolfSSL 0:9d17e4342598 807 " mullw 16,%6,%6 \n\t" \
wolfSSL 0:9d17e4342598 808 " addc %0,%0,16 \n\t" \
wolfSSL 0:9d17e4342598 809 " mulhwu 16,%6,%6 \n\t" \
wolfSSL 0:9d17e4342598 810 " adde %1,%1,16 \n\t" \
wolfSSL 0:9d17e4342598 811 " addze %2,%2 \n\t" \
wolfSSL 0:9d17e4342598 812 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i):"16","cc");
wolfSSL 0:9d17e4342598 813
wolfSSL 0:9d17e4342598 814 /* for squaring some of the terms are doubled... */
wolfSSL 0:9d17e4342598 815 #define SQRADD2(i, j) \
wolfSSL 0:9d17e4342598 816 __asm__( \
wolfSSL 0:9d17e4342598 817 " mullw 16,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 818 " mulhwu 17,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 819 " addc %0,%0,16 \n\t" \
wolfSSL 0:9d17e4342598 820 " adde %1,%1,17 \n\t" \
wolfSSL 0:9d17e4342598 821 " addze %2,%2 \n\t" \
wolfSSL 0:9d17e4342598 822 " addc %0,%0,16 \n\t" \
wolfSSL 0:9d17e4342598 823 " adde %1,%1,17 \n\t" \
wolfSSL 0:9d17e4342598 824 " addze %2,%2 \n\t" \
wolfSSL 0:9d17e4342598 825 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"16", "17","cc");
wolfSSL 0:9d17e4342598 826
wolfSSL 0:9d17e4342598 827 #define SQRADDSC(i, j) \
wolfSSL 0:9d17e4342598 828 __asm__( \
wolfSSL 0:9d17e4342598 829 " mullw %0,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 830 " mulhwu %1,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 831 " xor %2,%2,%2 \n\t" \
wolfSSL 0:9d17e4342598 832 :"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i),"r"(j) : "cc");
wolfSSL 0:9d17e4342598 833
wolfSSL 0:9d17e4342598 834 #define SQRADDAC(i, j) \
wolfSSL 0:9d17e4342598 835 __asm__( \
wolfSSL 0:9d17e4342598 836 " mullw 16,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 837 " addc %0,%0,16 \n\t" \
wolfSSL 0:9d17e4342598 838 " mulhwu 16,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 839 " adde %1,%1,16 \n\t" \
wolfSSL 0:9d17e4342598 840 " addze %2,%2 \n\t" \
wolfSSL 0:9d17e4342598 841 :"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j):"16", "cc");
wolfSSL 0:9d17e4342598 842
wolfSSL 0:9d17e4342598 843 #define SQRADDDB \
wolfSSL 0:9d17e4342598 844 __asm__( \
wolfSSL 0:9d17e4342598 845 " addc %0,%0,%3 \n\t" \
wolfSSL 0:9d17e4342598 846 " adde %1,%1,%4 \n\t" \
wolfSSL 0:9d17e4342598 847 " adde %2,%2,%5 \n\t" \
wolfSSL 0:9d17e4342598 848 " addc %0,%0,%3 \n\t" \
wolfSSL 0:9d17e4342598 849 " adde %1,%1,%4 \n\t" \
wolfSSL 0:9d17e4342598 850 " adde %2,%2,%5 \n\t" \
wolfSSL 0:9d17e4342598 851 :"=r"(c0), "=r"(c1), "=r"(c2) : "r"(sc0), "r"(sc1), "r"(sc2), "0"(c0), "1"(c1), "2"(c2) : "cc");
wolfSSL 0:9d17e4342598 852
wolfSSL 0:9d17e4342598 853 #elif defined(TFM_PPC64)
wolfSSL 0:9d17e4342598 854 /* PPC64 */
wolfSSL 0:9d17e4342598 855
wolfSSL 0:9d17e4342598 856 #define COMBA_START
wolfSSL 0:9d17e4342598 857
wolfSSL 0:9d17e4342598 858 #define CLEAR_CARRY \
wolfSSL 0:9d17e4342598 859 c0 = c1 = c2 = 0;
wolfSSL 0:9d17e4342598 860
wolfSSL 0:9d17e4342598 861 #define COMBA_STORE(x) \
wolfSSL 0:9d17e4342598 862 x = c0;
wolfSSL 0:9d17e4342598 863
wolfSSL 0:9d17e4342598 864 #define COMBA_STORE2(x) \
wolfSSL 0:9d17e4342598 865 x = c1;
wolfSSL 0:9d17e4342598 866
wolfSSL 0:9d17e4342598 867 #define CARRY_FORWARD \
wolfSSL 0:9d17e4342598 868 do { c0 = c1; c1 = c2; c2 = 0; } while (0);
wolfSSL 0:9d17e4342598 869
wolfSSL 0:9d17e4342598 870 #define COMBA_FINI
wolfSSL 0:9d17e4342598 871
wolfSSL 0:9d17e4342598 872 /* multiplies point i and j, updates carry "c1" and digit c2 */
wolfSSL 0:9d17e4342598 873 #define SQRADD(i, j) \
wolfSSL 0:9d17e4342598 874 __asm__( \
wolfSSL 0:9d17e4342598 875 " mulld 16,%6,%6 \n\t" \
wolfSSL 0:9d17e4342598 876 " addc %0,%0,16 \n\t" \
wolfSSL 0:9d17e4342598 877 " mulhdu 16,%6,%6 \n\t" \
wolfSSL 0:9d17e4342598 878 " adde %1,%1,16 \n\t" \
wolfSSL 0:9d17e4342598 879 " addze %2,%2 \n\t" \
wolfSSL 0:9d17e4342598 880 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i):"16","cc");
wolfSSL 0:9d17e4342598 881
wolfSSL 0:9d17e4342598 882 /* for squaring some of the terms are doubled... */
wolfSSL 0:9d17e4342598 883 #define SQRADD2(i, j) \
wolfSSL 0:9d17e4342598 884 __asm__( \
wolfSSL 0:9d17e4342598 885 " mulld 16,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 886 " mulhdu 17,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 887 " addc %0,%0,16 \n\t" \
wolfSSL 0:9d17e4342598 888 " adde %1,%1,17 \n\t" \
wolfSSL 0:9d17e4342598 889 " addze %2,%2 \n\t" \
wolfSSL 0:9d17e4342598 890 " addc %0,%0,16 \n\t" \
wolfSSL 0:9d17e4342598 891 " adde %1,%1,17 \n\t" \
wolfSSL 0:9d17e4342598 892 " addze %2,%2 \n\t" \
wolfSSL 0:9d17e4342598 893 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"16", "17","cc");
wolfSSL 0:9d17e4342598 894
wolfSSL 0:9d17e4342598 895 #define SQRADDSC(i, j) \
wolfSSL 0:9d17e4342598 896 __asm__( \
wolfSSL 0:9d17e4342598 897 " mulld %0,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 898 " mulhdu %1,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 899 " xor %2,%2,%2 \n\t" \
wolfSSL 0:9d17e4342598 900 :"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i),"r"(j) : "cc");
wolfSSL 0:9d17e4342598 901
wolfSSL 0:9d17e4342598 902 #define SQRADDAC(i, j) \
wolfSSL 0:9d17e4342598 903 __asm__( \
wolfSSL 0:9d17e4342598 904 " mulld 16,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 905 " addc %0,%0,16 \n\t" \
wolfSSL 0:9d17e4342598 906 " mulhdu 16,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 907 " adde %1,%1,16 \n\t" \
wolfSSL 0:9d17e4342598 908 " addze %2,%2 \n\t" \
wolfSSL 0:9d17e4342598 909 :"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j):"16", "cc");
wolfSSL 0:9d17e4342598 910
wolfSSL 0:9d17e4342598 911 #define SQRADDDB \
wolfSSL 0:9d17e4342598 912 __asm__( \
wolfSSL 0:9d17e4342598 913 " addc %0,%0,%3 \n\t" \
wolfSSL 0:9d17e4342598 914 " adde %1,%1,%4 \n\t" \
wolfSSL 0:9d17e4342598 915 " adde %2,%2,%5 \n\t" \
wolfSSL 0:9d17e4342598 916 " addc %0,%0,%3 \n\t" \
wolfSSL 0:9d17e4342598 917 " adde %1,%1,%4 \n\t" \
wolfSSL 0:9d17e4342598 918 " adde %2,%2,%5 \n\t" \
wolfSSL 0:9d17e4342598 919 :"=r"(c0), "=r"(c1), "=r"(c2) : "r"(sc0), "r"(sc1), "r"(sc2), "0"(c0), "1"(c1), "2"(c2) : "cc");
wolfSSL 0:9d17e4342598 920
wolfSSL 0:9d17e4342598 921
wolfSSL 0:9d17e4342598 922 #elif defined(TFM_AVR32)
wolfSSL 0:9d17e4342598 923
wolfSSL 0:9d17e4342598 924 /* AVR32 */
wolfSSL 0:9d17e4342598 925
wolfSSL 0:9d17e4342598 926 #define COMBA_START
wolfSSL 0:9d17e4342598 927
wolfSSL 0:9d17e4342598 928 #define CLEAR_CARRY \
wolfSSL 0:9d17e4342598 929 c0 = c1 = c2 = 0;
wolfSSL 0:9d17e4342598 930
wolfSSL 0:9d17e4342598 931 #define COMBA_STORE(x) \
wolfSSL 0:9d17e4342598 932 x = c0;
wolfSSL 0:9d17e4342598 933
wolfSSL 0:9d17e4342598 934 #define COMBA_STORE2(x) \
wolfSSL 0:9d17e4342598 935 x = c1;
wolfSSL 0:9d17e4342598 936
wolfSSL 0:9d17e4342598 937 #define CARRY_FORWARD \
wolfSSL 0:9d17e4342598 938 do { c0 = c1; c1 = c2; c2 = 0; } while (0);
wolfSSL 0:9d17e4342598 939
wolfSSL 0:9d17e4342598 940 #define COMBA_FINI
wolfSSL 0:9d17e4342598 941
wolfSSL 0:9d17e4342598 942 /* multiplies point i and j, updates carry "c1" and digit c2 */
wolfSSL 0:9d17e4342598 943 #define SQRADD(i, j) \
wolfSSL 0:9d17e4342598 944 __asm__( \
wolfSSL 0:9d17e4342598 945 " mulu.d r2,%6,%6 \n\t" \
wolfSSL 0:9d17e4342598 946 " add %0,%0,r2 \n\t" \
wolfSSL 0:9d17e4342598 947 " adc %1,%1,r3 \n\t" \
wolfSSL 0:9d17e4342598 948 " acr %2 \n\t" \
wolfSSL 0:9d17e4342598 949 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i):"r2","r3");
wolfSSL 0:9d17e4342598 950
wolfSSL 0:9d17e4342598 951 /* for squaring some of the terms are doubled... */
wolfSSL 0:9d17e4342598 952 #define SQRADD2(i, j) \
wolfSSL 0:9d17e4342598 953 __asm__( \
wolfSSL 0:9d17e4342598 954 " mulu.d r2,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 955 " add %0,%0,r2 \n\t" \
wolfSSL 0:9d17e4342598 956 " adc %1,%1,r3 \n\t" \
wolfSSL 0:9d17e4342598 957 " acr %2, \n\t" \
wolfSSL 0:9d17e4342598 958 " add %0,%0,r2 \n\t" \
wolfSSL 0:9d17e4342598 959 " adc %1,%1,r3 \n\t" \
wolfSSL 0:9d17e4342598 960 " acr %2, \n\t" \
wolfSSL 0:9d17e4342598 961 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"r2", "r3");
wolfSSL 0:9d17e4342598 962
wolfSSL 0:9d17e4342598 963 #define SQRADDSC(i, j) \
wolfSSL 0:9d17e4342598 964 __asm__( \
wolfSSL 0:9d17e4342598 965 " mulu.d r2,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 966 " mov %0,r2 \n\t" \
wolfSSL 0:9d17e4342598 967 " mov %1,r3 \n\t" \
wolfSSL 0:9d17e4342598 968 " eor %2,%2 \n\t" \
wolfSSL 0:9d17e4342598 969 :"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i),"r"(j) : "r2", "r3");
wolfSSL 0:9d17e4342598 970
wolfSSL 0:9d17e4342598 971 #define SQRADDAC(i, j) \
wolfSSL 0:9d17e4342598 972 __asm__( \
wolfSSL 0:9d17e4342598 973 " mulu.d r2,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 974 " add %0,%0,r2 \n\t" \
wolfSSL 0:9d17e4342598 975 " adc %1,%1,r3 \n\t" \
wolfSSL 0:9d17e4342598 976 " acr %2 \n\t" \
wolfSSL 0:9d17e4342598 977 :"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j):"r2", "r3");
wolfSSL 0:9d17e4342598 978
wolfSSL 0:9d17e4342598 979 #define SQRADDDB \
wolfSSL 0:9d17e4342598 980 __asm__( \
wolfSSL 0:9d17e4342598 981 " add %0,%0,%3 \n\t" \
wolfSSL 0:9d17e4342598 982 " adc %1,%1,%4 \n\t" \
wolfSSL 0:9d17e4342598 983 " adc %2,%2,%5 \n\t" \
wolfSSL 0:9d17e4342598 984 " add %0,%0,%3 \n\t" \
wolfSSL 0:9d17e4342598 985 " adc %1,%1,%4 \n\t" \
wolfSSL 0:9d17e4342598 986 " adc %2,%2,%5 \n\t" \
wolfSSL 0:9d17e4342598 987 :"=r"(c0), "=r"(c1), "=r"(c2) : "r"(sc0), "r"(sc1), "r"(sc2), "0"(c0), "1"(c1), "2"(c2) : "cc");
wolfSSL 0:9d17e4342598 988
wolfSSL 0:9d17e4342598 989
wolfSSL 0:9d17e4342598 990 #else
wolfSSL 0:9d17e4342598 991
wolfSSL 0:9d17e4342598 992 #define TFM_ISO
wolfSSL 0:9d17e4342598 993
wolfSSL 0:9d17e4342598 994 /* ISO C portable code */
wolfSSL 0:9d17e4342598 995
wolfSSL 0:9d17e4342598 996 #define COMBA_START
wolfSSL 0:9d17e4342598 997
wolfSSL 0:9d17e4342598 998 #define CLEAR_CARRY \
wolfSSL 0:9d17e4342598 999 c0 = c1 = c2 = 0;
wolfSSL 0:9d17e4342598 1000
wolfSSL 0:9d17e4342598 1001 #define COMBA_STORE(x) \
wolfSSL 0:9d17e4342598 1002 x = c0;
wolfSSL 0:9d17e4342598 1003
wolfSSL 0:9d17e4342598 1004 #define COMBA_STORE2(x) \
wolfSSL 0:9d17e4342598 1005 x = c1;
wolfSSL 0:9d17e4342598 1006
wolfSSL 0:9d17e4342598 1007 #define CARRY_FORWARD \
wolfSSL 0:9d17e4342598 1008 do { c0 = c1; c1 = c2; c2 = 0; } while (0);
wolfSSL 0:9d17e4342598 1009
wolfSSL 0:9d17e4342598 1010 #define COMBA_FINI
wolfSSL 0:9d17e4342598 1011
wolfSSL 0:9d17e4342598 1012 /* multiplies point i and j, updates carry "c1" and digit c2 */
wolfSSL 0:9d17e4342598 1013 #define SQRADD(i, j) \
wolfSSL 0:9d17e4342598 1014 do { fp_word t; \
wolfSSL 0:9d17e4342598 1015 t = c0 + ((fp_word)i) * ((fp_word)j); c0 = (fp_digit)t; \
wolfSSL 0:9d17e4342598 1016 t = c1 + (t >> DIGIT_BIT); c1 = (fp_digit)t; \
wolfSSL 0:9d17e4342598 1017 c2 +=(fp_digit) (t >> DIGIT_BIT); \
wolfSSL 0:9d17e4342598 1018 } while (0);
wolfSSL 0:9d17e4342598 1019
wolfSSL 0:9d17e4342598 1020
wolfSSL 0:9d17e4342598 1021 /* for squaring some of the terms are doubled... */
wolfSSL 0:9d17e4342598 1022 #define SQRADD2(i, j) \
wolfSSL 0:9d17e4342598 1023 do { fp_word t; \
wolfSSL 0:9d17e4342598 1024 t = ((fp_word)i) * ((fp_word)j); \
wolfSSL 0:9d17e4342598 1025 tt = (fp_word)c0 + t; c0 = (fp_digit)tt; \
wolfSSL 0:9d17e4342598 1026 tt = (fp_word)c1 + (tt >> DIGIT_BIT); c1 = (fp_digit)tt; \
wolfSSL 0:9d17e4342598 1027 c2 +=(fp_digit)( tt >> DIGIT_BIT); \
wolfSSL 0:9d17e4342598 1028 tt = (fp_word)c0 + t; c0 = (fp_digit)tt; \
wolfSSL 0:9d17e4342598 1029 tt = (fp_word)c1 + (tt >> DIGIT_BIT); c1 = (fp_digit)tt; \
wolfSSL 0:9d17e4342598 1030 c2 +=(fp_digit) (tt >> DIGIT_BIT); \
wolfSSL 0:9d17e4342598 1031 } while (0);
wolfSSL 0:9d17e4342598 1032
wolfSSL 0:9d17e4342598 1033 #define SQRADDSC(i, j) \
wolfSSL 0:9d17e4342598 1034 do { fp_word t; \
wolfSSL 0:9d17e4342598 1035 t = ((fp_word)i) * ((fp_word)j); \
wolfSSL 0:9d17e4342598 1036 sc0 = (fp_digit)t; sc1 = (t >> DIGIT_BIT); sc2 = 0; \
wolfSSL 0:9d17e4342598 1037 } while (0);
wolfSSL 0:9d17e4342598 1038
wolfSSL 0:9d17e4342598 1039 #define SQRADDAC(i, j) \
wolfSSL 0:9d17e4342598 1040 do { fp_word t; \
wolfSSL 0:9d17e4342598 1041 t = sc0 + ((fp_word)i) * ((fp_word)j); sc0 = (fp_digit)t; \
wolfSSL 0:9d17e4342598 1042 t = sc1 + (t >> DIGIT_BIT); sc1 = (fp_digit)t; \
wolfSSL 0:9d17e4342598 1043 sc2 += (fp_digit)(t >> DIGIT_BIT); \
wolfSSL 0:9d17e4342598 1044 } while (0);
wolfSSL 0:9d17e4342598 1045
wolfSSL 0:9d17e4342598 1046 #define SQRADDDB \
wolfSSL 0:9d17e4342598 1047 do { fp_word t; \
wolfSSL 0:9d17e4342598 1048 t = ((fp_word)sc0) + ((fp_word)sc0) + c0; c0 = (fp_digit)t; \
wolfSSL 0:9d17e4342598 1049 t = ((fp_word)sc1) + ((fp_word)sc1) + c1 + (t >> DIGIT_BIT); \
wolfSSL 0:9d17e4342598 1050 c1 = (fp_digit)t; \
wolfSSL 0:9d17e4342598 1051 c2 = c2 + (fp_digit)(((fp_word)sc2) + ((fp_word)sc2) + (t >> DIGIT_BIT)); \
wolfSSL 0:9d17e4342598 1052 } while (0);
wolfSSL 0:9d17e4342598 1053
wolfSSL 0:9d17e4342598 1054 #endif
wolfSSL 0:9d17e4342598 1055
wolfSSL 0:9d17e4342598 1056 #ifdef TFM_SMALL_SET
wolfSSL 0:9d17e4342598 1057 #include "fp_sqr_comba_small_set.i"
wolfSSL 0:9d17e4342598 1058 #endif
wolfSSL 0:9d17e4342598 1059
wolfSSL 0:9d17e4342598 1060 #if defined(TFM_SQR3)
wolfSSL 0:9d17e4342598 1061 #include "fp_sqr_comba_3.i"
wolfSSL 0:9d17e4342598 1062 #endif
wolfSSL 0:9d17e4342598 1063 #if defined(TFM_SQR4)
wolfSSL 0:9d17e4342598 1064 #include "fp_sqr_comba_4.i"
wolfSSL 0:9d17e4342598 1065 #endif
wolfSSL 0:9d17e4342598 1066 #if defined(TFM_SQR6)
wolfSSL 0:9d17e4342598 1067 #include "fp_sqr_comba_6.i"
wolfSSL 0:9d17e4342598 1068 #endif
wolfSSL 0:9d17e4342598 1069 #if defined(TFM_SQR7)
wolfSSL 0:9d17e4342598 1070 #include "fp_sqr_comba_7.i"
wolfSSL 0:9d17e4342598 1071 #endif
wolfSSL 0:9d17e4342598 1072 #if defined(TFM_SQR8)
wolfSSL 0:9d17e4342598 1073 #include "fp_sqr_comba_8.i"
wolfSSL 0:9d17e4342598 1074 #endif
wolfSSL 0:9d17e4342598 1075 #if defined(TFM_SQR9)
wolfSSL 0:9d17e4342598 1076 #include "fp_sqr_comba_9.i"
wolfSSL 0:9d17e4342598 1077 #endif
wolfSSL 0:9d17e4342598 1078 #if defined(TFM_SQR12)
wolfSSL 0:9d17e4342598 1079 #include "fp_sqr_comba_12.i"
wolfSSL 0:9d17e4342598 1080 #endif
wolfSSL 0:9d17e4342598 1081 #if defined(TFM_SQR17)
wolfSSL 0:9d17e4342598 1082 #include "fp_sqr_comba_17.i"
wolfSSL 0:9d17e4342598 1083 #endif
wolfSSL 0:9d17e4342598 1084 #if defined(TFM_SQR20)
wolfSSL 0:9d17e4342598 1085 #include "fp_sqr_comba_20.i"
wolfSSL 0:9d17e4342598 1086 #endif
wolfSSL 0:9d17e4342598 1087 #if defined(TFM_SQR24)
wolfSSL 0:9d17e4342598 1088 #include "fp_sqr_comba_24.i"
wolfSSL 0:9d17e4342598 1089 #endif
wolfSSL 0:9d17e4342598 1090 #if defined(TFM_SQR28)
wolfSSL 0:9d17e4342598 1091 #include "fp_sqr_comba_28.i"
wolfSSL 0:9d17e4342598 1092 #endif
wolfSSL 0:9d17e4342598 1093 #if defined(TFM_SQR32)
wolfSSL 0:9d17e4342598 1094 #include "fp_sqr_comba_32.i"
wolfSSL 0:9d17e4342598 1095 #endif
wolfSSL 0:9d17e4342598 1096 #if defined(TFM_SQR48)
wolfSSL 0:9d17e4342598 1097 #include "fp_sqr_comba_48.i"
wolfSSL 0:9d17e4342598 1098 #endif
wolfSSL 0:9d17e4342598 1099 #if defined(TFM_SQR64)
wolfSSL 0:9d17e4342598 1100 #include "fp_sqr_comba_64.i"
wolfSSL 0:9d17e4342598 1101 #endif
wolfSSL 0:9d17e4342598 1102 /* end fp_sqr_comba.c asm */
wolfSSL 0:9d17e4342598 1103
wolfSSL 0:9d17e4342598 1104 /* start fp_mul_comba.c asm */
wolfSSL 0:9d17e4342598 1105 /* these are the combas. Worship them. */
wolfSSL 0:9d17e4342598 1106 #if defined(TFM_X86)
wolfSSL 0:9d17e4342598 1107 /* Generic x86 optimized code */
wolfSSL 0:9d17e4342598 1108
wolfSSL 0:9d17e4342598 1109 /* anything you need at the start */
wolfSSL 0:9d17e4342598 1110 #define COMBA_START
wolfSSL 0:9d17e4342598 1111
wolfSSL 0:9d17e4342598 1112 /* clear the chaining variables */
wolfSSL 0:9d17e4342598 1113 #define COMBA_CLEAR \
wolfSSL 0:9d17e4342598 1114 c0 = c1 = c2 = 0;
wolfSSL 0:9d17e4342598 1115
wolfSSL 0:9d17e4342598 1116 /* forward the carry to the next digit */
wolfSSL 0:9d17e4342598 1117 #define COMBA_FORWARD \
wolfSSL 0:9d17e4342598 1118 do { c0 = c1; c1 = c2; c2 = 0; } while (0);
wolfSSL 0:9d17e4342598 1119
wolfSSL 0:9d17e4342598 1120 /* store the first sum */
wolfSSL 0:9d17e4342598 1121 #define COMBA_STORE(x) \
wolfSSL 0:9d17e4342598 1122 x = c0;
wolfSSL 0:9d17e4342598 1123
wolfSSL 0:9d17e4342598 1124 /* store the second sum [carry] */
wolfSSL 0:9d17e4342598 1125 #define COMBA_STORE2(x) \
wolfSSL 0:9d17e4342598 1126 x = c1;
wolfSSL 0:9d17e4342598 1127
wolfSSL 0:9d17e4342598 1128 /* anything you need at the end */
wolfSSL 0:9d17e4342598 1129 #define COMBA_FINI
wolfSSL 0:9d17e4342598 1130
wolfSSL 0:9d17e4342598 1131 /* this should multiply i and j */
wolfSSL 0:9d17e4342598 1132 #define MULADD(i, j) \
wolfSSL 0:9d17e4342598 1133 __asm__( \
wolfSSL 0:9d17e4342598 1134 "movl %6,%%eax \n\t" \
wolfSSL 0:9d17e4342598 1135 "mull %7 \n\t" \
wolfSSL 0:9d17e4342598 1136 "addl %%eax,%0 \n\t" \
wolfSSL 0:9d17e4342598 1137 "adcl %%edx,%1 \n\t" \
wolfSSL 0:9d17e4342598 1138 "adcl $0,%2 \n\t" \
wolfSSL 0:9d17e4342598 1139 :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j) :"%eax","%edx","cc");
wolfSSL 0:9d17e4342598 1140
wolfSSL 0:9d17e4342598 1141 #elif defined(TFM_X86_64)
wolfSSL 0:9d17e4342598 1142 /* x86-64 optimized */
wolfSSL 0:9d17e4342598 1143
wolfSSL 0:9d17e4342598 1144 /* anything you need at the start */
wolfSSL 0:9d17e4342598 1145 #define COMBA_START
wolfSSL 0:9d17e4342598 1146
wolfSSL 0:9d17e4342598 1147 /* clear the chaining variables */
wolfSSL 0:9d17e4342598 1148 #define COMBA_CLEAR \
wolfSSL 0:9d17e4342598 1149 c0 = c1 = c2 = 0;
wolfSSL 0:9d17e4342598 1150
wolfSSL 0:9d17e4342598 1151 /* forward the carry to the next digit */
wolfSSL 0:9d17e4342598 1152 #define COMBA_FORWARD \
wolfSSL 0:9d17e4342598 1153 do { c0 = c1; c1 = c2; c2 = 0; } while (0);
wolfSSL 0:9d17e4342598 1154
wolfSSL 0:9d17e4342598 1155 /* store the first sum */
wolfSSL 0:9d17e4342598 1156 #define COMBA_STORE(x) \
wolfSSL 0:9d17e4342598 1157 x = c0;
wolfSSL 0:9d17e4342598 1158
wolfSSL 0:9d17e4342598 1159 /* store the second sum [carry] */
wolfSSL 0:9d17e4342598 1160 #define COMBA_STORE2(x) \
wolfSSL 0:9d17e4342598 1161 x = c1;
wolfSSL 0:9d17e4342598 1162
wolfSSL 0:9d17e4342598 1163 /* anything you need at the end */
wolfSSL 0:9d17e4342598 1164 #define COMBA_FINI
wolfSSL 0:9d17e4342598 1165
wolfSSL 0:9d17e4342598 1166 /* this should multiply i and j */
wolfSSL 0:9d17e4342598 1167 #define MULADD(i, j) \
wolfSSL 0:9d17e4342598 1168 __asm__ ( \
wolfSSL 0:9d17e4342598 1169 "movq %6,%%rax \n\t" \
wolfSSL 0:9d17e4342598 1170 "mulq %7 \n\t" \
wolfSSL 0:9d17e4342598 1171 "addq %%rax,%0 \n\t" \
wolfSSL 0:9d17e4342598 1172 "adcq %%rdx,%1 \n\t" \
wolfSSL 0:9d17e4342598 1173 "adcq $0,%2 \n\t" \
wolfSSL 0:9d17e4342598 1174 :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j) :"%rax","%rdx","cc");
wolfSSL 0:9d17e4342598 1175
wolfSSL 0:9d17e4342598 1176 #elif defined(TFM_SSE2)
wolfSSL 0:9d17e4342598 1177 /* use SSE2 optimizations */
wolfSSL 0:9d17e4342598 1178
wolfSSL 0:9d17e4342598 1179 /* anything you need at the start */
wolfSSL 0:9d17e4342598 1180 #define COMBA_START
wolfSSL 0:9d17e4342598 1181
wolfSSL 0:9d17e4342598 1182 /* clear the chaining variables */
wolfSSL 0:9d17e4342598 1183 #define COMBA_CLEAR \
wolfSSL 0:9d17e4342598 1184 c0 = c1 = c2 = 0;
wolfSSL 0:9d17e4342598 1185
wolfSSL 0:9d17e4342598 1186 /* forward the carry to the next digit */
wolfSSL 0:9d17e4342598 1187 #define COMBA_FORWARD \
wolfSSL 0:9d17e4342598 1188 do { c0 = c1; c1 = c2; c2 = 0; } while (0);
wolfSSL 0:9d17e4342598 1189
wolfSSL 0:9d17e4342598 1190 /* store the first sum */
wolfSSL 0:9d17e4342598 1191 #define COMBA_STORE(x) \
wolfSSL 0:9d17e4342598 1192 x = c0;
wolfSSL 0:9d17e4342598 1193
wolfSSL 0:9d17e4342598 1194 /* store the second sum [carry] */
wolfSSL 0:9d17e4342598 1195 #define COMBA_STORE2(x) \
wolfSSL 0:9d17e4342598 1196 x = c1;
wolfSSL 0:9d17e4342598 1197
wolfSSL 0:9d17e4342598 1198 /* anything you need at the end */
wolfSSL 0:9d17e4342598 1199 #define COMBA_FINI \
wolfSSL 0:9d17e4342598 1200 __asm__("emms");
wolfSSL 0:9d17e4342598 1201
wolfSSL 0:9d17e4342598 1202 /* this should multiply i and j */
wolfSSL 0:9d17e4342598 1203 #define MULADD(i, j) \
wolfSSL 0:9d17e4342598 1204 __asm__( \
wolfSSL 0:9d17e4342598 1205 "movd %6,%%mm0 \n\t" \
wolfSSL 0:9d17e4342598 1206 "movd %7,%%mm1 \n\t" \
wolfSSL 0:9d17e4342598 1207 "pmuludq %%mm1,%%mm0\n\t" \
wolfSSL 0:9d17e4342598 1208 "movd %%mm0,%%eax \n\t" \
wolfSSL 0:9d17e4342598 1209 "psrlq $32,%%mm0 \n\t" \
wolfSSL 0:9d17e4342598 1210 "addl %%eax,%0 \n\t" \
wolfSSL 0:9d17e4342598 1211 "movd %%mm0,%%eax \n\t" \
wolfSSL 0:9d17e4342598 1212 "adcl %%eax,%1 \n\t" \
wolfSSL 0:9d17e4342598 1213 "adcl $0,%2 \n\t" \
wolfSSL 0:9d17e4342598 1214 :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j) :"%eax","cc");
wolfSSL 0:9d17e4342598 1215
wolfSSL 0:9d17e4342598 1216 #elif defined(TFM_ARM)
wolfSSL 0:9d17e4342598 1217 /* ARM code */
wolfSSL 0:9d17e4342598 1218
wolfSSL 0:9d17e4342598 1219 #define COMBA_START
wolfSSL 0:9d17e4342598 1220
wolfSSL 0:9d17e4342598 1221 #define COMBA_CLEAR \
wolfSSL 0:9d17e4342598 1222 c0 = c1 = c2 = 0;
wolfSSL 0:9d17e4342598 1223
wolfSSL 0:9d17e4342598 1224 #define COMBA_FORWARD \
wolfSSL 0:9d17e4342598 1225 do { c0 = c1; c1 = c2; c2 = 0; } while (0);
wolfSSL 0:9d17e4342598 1226
wolfSSL 0:9d17e4342598 1227 #define COMBA_STORE(x) \
wolfSSL 0:9d17e4342598 1228 x = c0;
wolfSSL 0:9d17e4342598 1229
wolfSSL 0:9d17e4342598 1230 #define COMBA_STORE2(x) \
wolfSSL 0:9d17e4342598 1231 x = c1;
wolfSSL 0:9d17e4342598 1232
wolfSSL 0:9d17e4342598 1233 #define COMBA_FINI
wolfSSL 0:9d17e4342598 1234
wolfSSL 0:9d17e4342598 1235 #define MULADD(i, j) \
wolfSSL 0:9d17e4342598 1236 __asm__( \
wolfSSL 0:9d17e4342598 1237 " UMULL r0,r1,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 1238 " ADDS %0,%0,r0 \n\t" \
wolfSSL 0:9d17e4342598 1239 " ADCS %1,%1,r1 \n\t" \
wolfSSL 0:9d17e4342598 1240 " ADC %2,%2,#0 \n\t" \
wolfSSL 0:9d17e4342598 1241 :"=r"(c0), "=r"(c1), "=r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j) : "r0", "r1", "cc");
wolfSSL 0:9d17e4342598 1242
wolfSSL 0:9d17e4342598 1243 #elif defined(TFM_PPC32)
wolfSSL 0:9d17e4342598 1244 /* For 32-bit PPC */
wolfSSL 0:9d17e4342598 1245
wolfSSL 0:9d17e4342598 1246 #define COMBA_START
wolfSSL 0:9d17e4342598 1247
wolfSSL 0:9d17e4342598 1248 #define COMBA_CLEAR \
wolfSSL 0:9d17e4342598 1249 c0 = c1 = c2 = 0;
wolfSSL 0:9d17e4342598 1250
wolfSSL 0:9d17e4342598 1251 #define COMBA_FORWARD \
wolfSSL 0:9d17e4342598 1252 do { c0 = c1; c1 = c2; c2 = 0; } while (0);
wolfSSL 0:9d17e4342598 1253
wolfSSL 0:9d17e4342598 1254 #define COMBA_STORE(x) \
wolfSSL 0:9d17e4342598 1255 x = c0;
wolfSSL 0:9d17e4342598 1256
wolfSSL 0:9d17e4342598 1257 #define COMBA_STORE2(x) \
wolfSSL 0:9d17e4342598 1258 x = c1;
wolfSSL 0:9d17e4342598 1259
wolfSSL 0:9d17e4342598 1260 #define COMBA_FINI
wolfSSL 0:9d17e4342598 1261
wolfSSL 0:9d17e4342598 1262 /* untested: will mulhwu change the flags? Docs say no */
wolfSSL 0:9d17e4342598 1263 #define MULADD(i, j) \
wolfSSL 0:9d17e4342598 1264 __asm__( \
wolfSSL 0:9d17e4342598 1265 " mullw 16,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 1266 " addc %0,%0,16 \n\t" \
wolfSSL 0:9d17e4342598 1267 " mulhwu 16,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 1268 " adde %1,%1,16 \n\t" \
wolfSSL 0:9d17e4342598 1269 " addze %2,%2 \n\t" \
wolfSSL 0:9d17e4342598 1270 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"16");
wolfSSL 0:9d17e4342598 1271
wolfSSL 0:9d17e4342598 1272 #elif defined(TFM_PPC64)
wolfSSL 0:9d17e4342598 1273 /* For 64-bit PPC */
wolfSSL 0:9d17e4342598 1274
wolfSSL 0:9d17e4342598 1275 #define COMBA_START
wolfSSL 0:9d17e4342598 1276
wolfSSL 0:9d17e4342598 1277 #define COMBA_CLEAR \
wolfSSL 0:9d17e4342598 1278 c0 = c1 = c2 = 0;
wolfSSL 0:9d17e4342598 1279
wolfSSL 0:9d17e4342598 1280 #define COMBA_FORWARD \
wolfSSL 0:9d17e4342598 1281 do { c0 = c1; c1 = c2; c2 = 0; } while (0);
wolfSSL 0:9d17e4342598 1282
wolfSSL 0:9d17e4342598 1283 #define COMBA_STORE(x) \
wolfSSL 0:9d17e4342598 1284 x = c0;
wolfSSL 0:9d17e4342598 1285
wolfSSL 0:9d17e4342598 1286 #define COMBA_STORE2(x) \
wolfSSL 0:9d17e4342598 1287 x = c1;
wolfSSL 0:9d17e4342598 1288
wolfSSL 0:9d17e4342598 1289 #define COMBA_FINI
wolfSSL 0:9d17e4342598 1290
wolfSSL 0:9d17e4342598 1291 /* untested: will mulhwu change the flags? Docs say no */
wolfSSL 0:9d17e4342598 1292 #define MULADD(i, j) \
wolfSSL 0:9d17e4342598 1293 ____asm__( \
wolfSSL 0:9d17e4342598 1294 " mulld 16,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 1295 " addc %0,%0,16 \n\t" \
wolfSSL 0:9d17e4342598 1296 " mulhdu 16,%6,%7 \n\t" \
wolfSSL 0:9d17e4342598 1297 " adde %1,%1,16 \n\t" \
wolfSSL 0:9d17e4342598 1298 " addze %2,%2 \n\t" \
wolfSSL 0:9d17e4342598 1299 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"16");
wolfSSL 0:9d17e4342598 1300
wolfSSL 0:9d17e4342598 1301 #elif defined(TFM_AVR32)
wolfSSL 0:9d17e4342598 1302
wolfSSL 0:9d17e4342598 1303 /* ISO C code */
wolfSSL 0:9d17e4342598 1304
wolfSSL 0:9d17e4342598 1305 #define COMBA_START
wolfSSL 0:9d17e4342598 1306
wolfSSL 0:9d17e4342598 1307 #define COMBA_CLEAR \
wolfSSL 0:9d17e4342598 1308 c0 = c1 = c2 = 0;
wolfSSL 0:9d17e4342598 1309
wolfSSL 0:9d17e4342598 1310 #define COMBA_FORWARD \
wolfSSL 0:9d17e4342598 1311 do { c0 = c1; c1 = c2; c2 = 0; } while (0);
wolfSSL 0:9d17e4342598 1312
wolfSSL 0:9d17e4342598 1313 #define COMBA_STORE(x) \
wolfSSL 0:9d17e4342598 1314 x = c0;
wolfSSL 0:9d17e4342598 1315
wolfSSL 0:9d17e4342598 1316 #define COMBA_STORE2(x) \
wolfSSL 0:9d17e4342598 1317 x = c1;
wolfSSL 0:9d17e4342598 1318
wolfSSL 0:9d17e4342598 1319 #define COMBA_FINI
wolfSSL 0:9d17e4342598 1320
wolfSSL 0:9d17e4342598 1321 #define MULADD(i, j) \
wolfSSL 0:9d17e4342598 1322 ____asm__( \
wolfSSL 0:9d17e4342598 1323 " mulu.d r2,%6,%7 \n\t"\
wolfSSL 0:9d17e4342598 1324 " add %0,r2 \n\t"\
wolfSSL 0:9d17e4342598 1325 " adc %1,%1,r3 \n\t"\
wolfSSL 0:9d17e4342598 1326 " acr %2 \n\t"\
wolfSSL 0:9d17e4342598 1327 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"r2","r3");
wolfSSL 0:9d17e4342598 1328
wolfSSL 0:9d17e4342598 1329 #else
wolfSSL 0:9d17e4342598 1330 /* ISO C code */
wolfSSL 0:9d17e4342598 1331
wolfSSL 0:9d17e4342598 1332 #define COMBA_START
wolfSSL 0:9d17e4342598 1333
wolfSSL 0:9d17e4342598 1334 #define COMBA_CLEAR \
wolfSSL 0:9d17e4342598 1335 c0 = c1 = c2 = 0;
wolfSSL 0:9d17e4342598 1336
wolfSSL 0:9d17e4342598 1337 #define COMBA_FORWARD \
wolfSSL 0:9d17e4342598 1338 do { c0 = c1; c1 = c2; c2 = 0; } while (0);
wolfSSL 0:9d17e4342598 1339
wolfSSL 0:9d17e4342598 1340 #define COMBA_STORE(x) \
wolfSSL 0:9d17e4342598 1341 x = c0;
wolfSSL 0:9d17e4342598 1342
wolfSSL 0:9d17e4342598 1343 #define COMBA_STORE2(x) \
wolfSSL 0:9d17e4342598 1344 x = c1;
wolfSSL 0:9d17e4342598 1345
wolfSSL 0:9d17e4342598 1346 #define COMBA_FINI
wolfSSL 0:9d17e4342598 1347
wolfSSL 0:9d17e4342598 1348 #define MULADD(i, j) \
wolfSSL 0:9d17e4342598 1349 do { fp_word t; \
wolfSSL 0:9d17e4342598 1350 t = (fp_word)c0 + ((fp_word)i) * ((fp_word)j); c0 = (fp_digit)t; \
wolfSSL 0:9d17e4342598 1351 t = (fp_word)c1 + (t >> DIGIT_BIT); \
wolfSSL 0:9d17e4342598 1352 c1 = (fp_digit)t; c2 += (fp_digit)(t >> DIGIT_BIT); \
wolfSSL 0:9d17e4342598 1353 } while (0);
wolfSSL 0:9d17e4342598 1354
wolfSSL 0:9d17e4342598 1355 #endif
wolfSSL 0:9d17e4342598 1356
wolfSSL 0:9d17e4342598 1357
wolfSSL 0:9d17e4342598 1358 #ifdef TFM_SMALL_SET
wolfSSL 0:9d17e4342598 1359 #include "fp_mul_comba_small_set.i"
wolfSSL 0:9d17e4342598 1360 #endif
wolfSSL 0:9d17e4342598 1361
wolfSSL 0:9d17e4342598 1362 #if defined(TFM_MUL3)
wolfSSL 0:9d17e4342598 1363 #include "fp_mul_comba_3.i"
wolfSSL 0:9d17e4342598 1364 #endif
wolfSSL 0:9d17e4342598 1365 #if defined(TFM_MUL4)
wolfSSL 0:9d17e4342598 1366 #include "fp_mul_comba_4.i"
wolfSSL 0:9d17e4342598 1367 #endif
wolfSSL 0:9d17e4342598 1368 #if defined(TFM_MUL6)
wolfSSL 0:9d17e4342598 1369 #include "fp_mul_comba_6.i"
wolfSSL 0:9d17e4342598 1370 #endif
wolfSSL 0:9d17e4342598 1371 #if defined(TFM_MUL7)
wolfSSL 0:9d17e4342598 1372 #include "fp_mul_comba_7.i"
wolfSSL 0:9d17e4342598 1373 #endif
wolfSSL 0:9d17e4342598 1374 #if defined(TFM_MUL8)
wolfSSL 0:9d17e4342598 1375 #include "fp_mul_comba_8.i"
wolfSSL 0:9d17e4342598 1376 #endif
wolfSSL 0:9d17e4342598 1377 #if defined(TFM_MUL9)
wolfSSL 0:9d17e4342598 1378 #include "fp_mul_comba_9.i"
wolfSSL 0:9d17e4342598 1379 #endif
wolfSSL 0:9d17e4342598 1380 #if defined(TFM_MUL12)
wolfSSL 0:9d17e4342598 1381 #include "fp_mul_comba_12.i"
wolfSSL 0:9d17e4342598 1382 #endif
wolfSSL 0:9d17e4342598 1383 #if defined(TFM_MUL17)
wolfSSL 0:9d17e4342598 1384 #include "fp_mul_comba_17.i"
wolfSSL 0:9d17e4342598 1385 #endif
wolfSSL 0:9d17e4342598 1386 #if defined(TFM_MUL20)
wolfSSL 0:9d17e4342598 1387 #include "fp_mul_comba_20.i"
wolfSSL 0:9d17e4342598 1388 #endif
wolfSSL 0:9d17e4342598 1389 #if defined(TFM_MUL24)
wolfSSL 0:9d17e4342598 1390 #include "fp_mul_comba_24.i"
wolfSSL 0:9d17e4342598 1391 #endif
wolfSSL 0:9d17e4342598 1392 #if defined(TFM_MUL28)
wolfSSL 0:9d17e4342598 1393 #include "fp_mul_comba_28.i"
wolfSSL 0:9d17e4342598 1394 #endif
wolfSSL 0:9d17e4342598 1395 #if defined(TFM_MUL32)
wolfSSL 0:9d17e4342598 1396 #include "fp_mul_comba_32.i"
wolfSSL 0:9d17e4342598 1397 #endif
wolfSSL 0:9d17e4342598 1398 #if defined(TFM_MUL48)
wolfSSL 0:9d17e4342598 1399 #include "fp_mul_comba_48.i"
wolfSSL 0:9d17e4342598 1400 #endif
wolfSSL 0:9d17e4342598 1401 #if defined(TFM_MUL64)
wolfSSL 0:9d17e4342598 1402 #include "fp_mul_comba_64.i"
wolfSSL 0:9d17e4342598 1403 #endif
wolfSSL 0:9d17e4342598 1404
wolfSSL 0:9d17e4342598 1405 /* end fp_mul_comba.c asm */
wolfSSL 0:9d17e4342598 1406