1 #if defined(ED25519_GCC_64BIT_X86_CHOOSE) 3 #define HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS 12 __asm__ __volatile__ (
15 "movd %%rax, %%xmm14 ;\n" 16 "pshufd $0x00, %%xmm14, %%xmm14 ;\n" 17 "pxor %%xmm0, %%xmm0 ;\n" 18 "pxor %%xmm1, %%xmm1 ;\n" 19 "pxor %%xmm2, %%xmm2 ;\n" 20 "pxor %%xmm3, %%xmm3 ;\n" 21 "pxor %%xmm4, %%xmm4 ;\n" 22 "pxor %%xmm5, %%xmm5 ;\n" 26 "movd %%rax, %%xmm15 ;\n" 27 "pshufd $0x00, %%xmm15, %%xmm15 ;\n" 28 "pcmpeqd %%xmm14, %%xmm15 ;\n" 30 "movd %%rax, %%xmm6 ;\n" 31 "pxor %%xmm7, %%xmm7 ;\n" 32 "pand %%xmm15, %%xmm6 ;\n" 33 "pand %%xmm15, %%xmm7 ;\n" 34 "por %%xmm6, %%xmm0 ;\n" 35 "por %%xmm7, %%xmm1 ;\n" 36 "por %%xmm6, %%xmm2 ;\n" 37 "por %%xmm7, %%xmm3 ;\n" 41 "movd %%rax, %%xmm15 ;\n" 42 "pshufd $0x00, %%xmm15, %%xmm15 ;\n" 43 "pcmpeqd %%xmm14, %%xmm15 ;\n" 44 "movdqa 0(%1), %%xmm6 ;\n" 45 "movdqa 16(%1), %%xmm7 ;\n" 46 "movdqa 32(%1), %%xmm8 ;\n" 47 "movdqa 48(%1), %%xmm9 ;\n" 48 "movdqa 64(%1), %%xmm10 ;\n" 49 "movdqa 80(%1), %%xmm11 ;\n" 50 "pand %%xmm15, %%xmm6 ;\n" 51 "pand %%xmm15, %%xmm7 ;\n" 52 "pand %%xmm15, %%xmm8 ;\n" 53 "pand %%xmm15, %%xmm9 ;\n" 54 "pand %%xmm15, %%xmm10 ;\n" 55 "pand %%xmm15, %%xmm11 ;\n" 56 "por %%xmm6, %%xmm0 ;\n" 57 "por %%xmm7, %%xmm1 ;\n" 58 "por %%xmm8, %%xmm2 ;\n" 59 "por %%xmm9, %%xmm3 ;\n" 60 "por %%xmm10, %%xmm4 ;\n" 61 "por %%xmm11, %%xmm5 ;\n" 65 "movd %%rax, %%xmm15 ;\n" 66 "pshufd $0x00, %%xmm15, %%xmm15 ;\n" 67 "pcmpeqd %%xmm14, %%xmm15 ;\n" 68 "movdqa 96(%1), %%xmm6 ;\n" 69 "movdqa 112(%1), %%xmm7 ;\n" 70 "movdqa 128(%1), %%xmm8 ;\n" 71 "movdqa 144(%1), %%xmm9 ;\n" 72 "movdqa 160(%1), %%xmm10 ;\n" 73 "movdqa 176(%1), %%xmm11 ;\n" 74 "pand %%xmm15, %%xmm6 ;\n" 75 "pand %%xmm15, %%xmm7 ;\n" 76 "pand %%xmm15, %%xmm8 ;\n" 77 "pand %%xmm15, %%xmm9 ;\n" 78 "pand %%xmm15, %%xmm10 ;\n" 79 "pand %%xmm15, %%xmm11 ;\n" 80 "por %%xmm6, %%xmm0 ;\n" 81 "por %%xmm7, %%xmm1 ;\n" 82 "por %%xmm8, %%xmm2 ;\n" 83 "por %%xmm9, %%xmm3 ;\n" 84 "por %%xmm10, %%xmm4 ;\n" 85 "por %%xmm11, %%xmm5 ;\n" 89 "movd %%rax, %%xmm15 ;\n" 90 "pshufd $0x00, %%xmm15, %%xmm15 ;\n" 91 "pcmpeqd %%xmm14, %%xmm15 ;\n" 92 "movdqa 192(%1), %%xmm6 ;\n" 93 "movdqa 208(%1), %%xmm7 ;\n" 94 "movdqa 224(%1), %%xmm8 ;\n" 95 "movdqa 240(%1), %%xmm9 ;\n" 96 "movdqa 256(%1), %%xmm10 ;\n" 97 "movdqa 272(%1), %%xmm11 ;\n" 98 "pand %%xmm15, %%xmm6 ;\n" 99 "pand %%xmm15, %%xmm7 ;\n" 100 "pand %%xmm15, %%xmm8 ;\n" 101 "pand %%xmm15, %%xmm9 ;\n" 102 "pand %%xmm15, %%xmm10 ;\n" 103 "pand %%xmm15, %%xmm11 ;\n" 104 "por %%xmm6, %%xmm0 ;\n" 105 "por %%xmm7, %%xmm1 ;\n" 106 "por %%xmm8, %%xmm2 ;\n" 107 "por %%xmm9, %%xmm3 ;\n" 108 "por %%xmm10, %%xmm4 ;\n" 109 "por %%xmm11, %%xmm5 ;\n" 113 "movd %%rax, %%xmm15 ;\n" 114 "pshufd $0x00, %%xmm15, %%xmm15 ;\n" 115 "pcmpeqd %%xmm14, %%xmm15 ;\n" 116 "movdqa 288(%1), %%xmm6 ;\n" 117 "movdqa 304(%1), %%xmm7 ;\n" 118 "movdqa 320(%1), %%xmm8 ;\n" 119 "movdqa 336(%1), %%xmm9 ;\n" 120 "movdqa 352(%1), %%xmm10 ;\n" 121 "movdqa 368(%1), %%xmm11 ;\n" 122 "pand %%xmm15, %%xmm6 ;\n" 123 "pand %%xmm15, %%xmm7 ;\n" 124 "pand %%xmm15, %%xmm8 ;\n" 125 "pand %%xmm15, %%xmm9 ;\n" 126 "pand %%xmm15, %%xmm10 ;\n" 127 "pand %%xmm15, %%xmm11 ;\n" 128 "por %%xmm6, %%xmm0 ;\n" 129 "por %%xmm7, %%xmm1 ;\n" 130 "por %%xmm8, %%xmm2 ;\n" 131 "por %%xmm9, %%xmm3 ;\n" 132 "por %%xmm10, %%xmm4 ;\n" 133 "por %%xmm11, %%xmm5 ;\n" 137 "movd %%rax, %%xmm15 ;\n" 138 "pshufd $0x00, %%xmm15, %%xmm15 ;\n" 139 "pcmpeqd %%xmm14, %%xmm15 ;\n" 140 "movdqa 384(%1), %%xmm6 ;\n" 141 "movdqa 400(%1), %%xmm7 ;\n" 142 "movdqa 416(%1), %%xmm8 ;\n" 143 "movdqa 432(%1), %%xmm9 ;\n" 144 "movdqa 448(%1), %%xmm10 ;\n" 145 "movdqa 464(%1), %%xmm11 ;\n" 146 "pand %%xmm15, %%xmm6 ;\n" 147 "pand %%xmm15, %%xmm7 ;\n" 148 "pand %%xmm15, %%xmm8 ;\n" 149 "pand %%xmm15, %%xmm9 ;\n" 150 "pand %%xmm15, %%xmm10 ;\n" 151 "pand %%xmm15, %%xmm11 ;\n" 152 "por %%xmm6, %%xmm0 ;\n" 153 "por %%xmm7, %%xmm1 ;\n" 154 "por %%xmm8, %%xmm2 ;\n" 155 "por %%xmm9, %%xmm3 ;\n" 156 "por %%xmm10, %%xmm4 ;\n" 157 "por %%xmm11, %%xmm5 ;\n" 161 "movd %%rax, %%xmm15 ;\n" 162 "pshufd $0x00, %%xmm15, %%xmm15 ;\n" 163 "pcmpeqd %%xmm14, %%xmm15 ;\n" 164 "movdqa 480(%1), %%xmm6 ;\n" 165 "movdqa 496(%1), %%xmm7 ;\n" 166 "movdqa 512(%1), %%xmm8 ;\n" 167 "movdqa 528(%1), %%xmm9 ;\n" 168 "movdqa 544(%1), %%xmm10 ;\n" 169 "movdqa 560(%1), %%xmm11 ;\n" 170 "pand %%xmm15, %%xmm6 ;\n" 171 "pand %%xmm15, %%xmm7 ;\n" 172 "pand %%xmm15, %%xmm8 ;\n" 173 "pand %%xmm15, %%xmm9 ;\n" 174 "pand %%xmm15, %%xmm10 ;\n" 175 "pand %%xmm15, %%xmm11 ;\n" 176 "por %%xmm6, %%xmm0 ;\n" 177 "por %%xmm7, %%xmm1 ;\n" 178 "por %%xmm8, %%xmm2 ;\n" 179 "por %%xmm9, %%xmm3 ;\n" 180 "por %%xmm10, %%xmm4 ;\n" 181 "por %%xmm11, %%xmm5 ;\n" 185 "movd %%rax, %%xmm15 ;\n" 186 "pshufd $0x00, %%xmm15, %%xmm15 ;\n" 187 "pcmpeqd %%xmm14, %%xmm15 ;\n" 188 "movdqa 576(%1), %%xmm6 ;\n" 189 "movdqa 592(%1), %%xmm7 ;\n" 190 "movdqa 608(%1), %%xmm8 ;\n" 191 "movdqa 624(%1), %%xmm9 ;\n" 192 "movdqa 640(%1), %%xmm10 ;\n" 193 "movdqa 656(%1), %%xmm11 ;\n" 194 "pand %%xmm15, %%xmm6 ;\n" 195 "pand %%xmm15, %%xmm7 ;\n" 196 "pand %%xmm15, %%xmm8 ;\n" 197 "pand %%xmm15, %%xmm9 ;\n" 198 "pand %%xmm15, %%xmm10 ;\n" 199 "pand %%xmm15, %%xmm11 ;\n" 200 "por %%xmm6, %%xmm0 ;\n" 201 "por %%xmm7, %%xmm1 ;\n" 202 "por %%xmm8, %%xmm2 ;\n" 203 "por %%xmm9, %%xmm3 ;\n" 204 "por %%xmm10, %%xmm4 ;\n" 205 "por %%xmm11, %%xmm5 ;\n" 209 "movd %%rax, %%xmm15 ;\n" 210 "pshufd $0x00, %%xmm15, %%xmm15 ;\n" 211 "pcmpeqd %%xmm14, %%xmm15 ;\n" 212 "movdqa 672(%1), %%xmm6 ;\n" 213 "movdqa 688(%1), %%xmm7 ;\n" 214 "movdqa 704(%1), %%xmm8 ;\n" 215 "movdqa 720(%1), %%xmm9 ;\n" 216 "movdqa 736(%1), %%xmm10 ;\n" 217 "movdqa 752(%1), %%xmm11 ;\n" 218 "pand %%xmm15, %%xmm6 ;\n" 219 "pand %%xmm15, %%xmm7 ;\n" 220 "pand %%xmm15, %%xmm8 ;\n" 221 "pand %%xmm15, %%xmm9 ;\n" 222 "pand %%xmm15, %%xmm10 ;\n" 223 "pand %%xmm15, %%xmm11 ;\n" 224 "por %%xmm6, %%xmm0 ;\n" 225 "por %%xmm7, %%xmm1 ;\n" 226 "por %%xmm8, %%xmm2 ;\n" 227 "por %%xmm9, %%xmm3 ;\n" 228 "por %%xmm10, %%xmm4 ;\n" 229 "por %%xmm11, %%xmm5 ;\n" 234 "movd %%rax, %%xmm14 ;\n" 235 "pxor %%xmm15, %%xmm15 ;\n" 236 "pshufd $0x00, %%xmm14, %%xmm14 ;\n" 237 "pxor %%xmm0, %%xmm2 ;\n" 238 "pxor %%xmm1, %%xmm3 ;\n" 239 "pcmpeqd %%xmm14, %%xmm15 ;\n" 240 "movdqa %%xmm2, %%xmm6 ;\n" 241 "movdqa %%xmm3, %%xmm7 ;\n" 242 "pand %%xmm15, %%xmm6 ;\n" 243 "pand %%xmm15, %%xmm7 ;\n" 244 "pxor %%xmm6, %%xmm0 ;\n" 245 "pxor %%xmm7, %%xmm1 ;\n" 246 "pxor %%xmm0, %%xmm2 ;\n" 247 "pxor %%xmm1, %%xmm3 ;\n" 250 "movq $0x7ffffffffffff, %%rax ;\n" 251 "movd %%xmm0, %%rcx ;\n" 252 "movd %%xmm0, %%r8 ;\n" 253 "movd %%xmm1, %%rsi ;\n" 254 "pshufd $0xee, %%xmm0, %%xmm0 ;\n" 255 "pshufd $0xee, %%xmm1, %%xmm1 ;\n" 256 "movd %%xmm0, %%rdx ;\n" 257 "movd %%xmm1, %%rdi ;\n" 258 "shrdq $51, %%rdx, %%r8 ;\n" 259 "shrdq $38, %%rsi, %%rdx ;\n" 260 "shrdq $25, %%rdi, %%rsi ;\n" 261 "shrq $12, %%rdi ;\n" 262 "andq %%rax, %%rcx ;\n" 263 "andq %%rax, %%r8 ;\n" 264 "andq %%rax, %%rdx ;\n" 265 "andq %%rax, %%rsi ;\n" 266 "andq %%rax, %%rdi ;\n" 267 "movq %%rcx, 0(%2) ;\n" 268 "movq %%r8, 8(%2) ;\n" 269 "movq %%rdx, 16(%2) ;\n" 270 "movq %%rsi, 24(%2) ;\n" 271 "movq %%rdi, 32(%2) ;\n" 274 "movq $0x7ffffffffffff, %%rax ;\n" 275 "movd %%xmm2, %%rcx ;\n" 276 "movd %%xmm2, %%r8 ;\n" 277 "movd %%xmm3, %%rsi ;\n" 278 "pshufd $0xee, %%xmm2, %%xmm2 ;\n" 279 "pshufd $0xee, %%xmm3, %%xmm3 ;\n" 280 "movd %%xmm2, %%rdx ;\n" 281 "movd %%xmm3, %%rdi ;\n" 282 "shrdq $51, %%rdx, %%r8 ;\n" 283 "shrdq $38, %%rsi, %%rdx ;\n" 284 "shrdq $25, %%rdi, %%rsi ;\n" 285 "shrq $12, %%rdi ;\n" 286 "andq %%rax, %%rcx ;\n" 287 "andq %%rax, %%r8 ;\n" 288 "andq %%rax, %%rdx ;\n" 289 "andq %%rax, %%rsi ;\n" 290 "andq %%rax, %%rdi ;\n" 291 "movq %%rcx, 40(%2) ;\n" 292 "movq %%r8, 48(%2) ;\n" 293 "movq %%rdx, 56(%2) ;\n" 294 "movq %%rsi, 64(%2) ;\n" 295 "movq %%rdi, 72(%2) ;\n" 298 "movq $0x7ffffffffffff, %%rax ;\n" 299 "movd %%xmm4, %%rcx ;\n" 300 "movd %%xmm4, %%r8 ;\n" 301 "movd %%xmm5, %%rsi ;\n" 302 "pshufd $0xee, %%xmm4, %%xmm4 ;\n" 303 "pshufd $0xee, %%xmm5, %%xmm5 ;\n" 304 "movd %%xmm4, %%rdx ;\n" 305 "movd %%xmm5, %%rdi ;\n" 306 "shrdq $51, %%rdx, %%r8 ;\n" 307 "shrdq $38, %%rsi, %%rdx ;\n" 308 "shrdq $25, %%rdi, %%rsi ;\n" 309 "shrq $12, %%rdi ;\n" 310 "andq %%rax, %%rcx ;\n" 311 "andq %%rax, %%r8 ;\n" 312 "andq %%rax, %%rdx ;\n" 313 "andq %%rax, %%rsi ;\n" 314 "andq %%rax, %%rdi ;\n" 318 "movq $0xfffffffffffda, %%r9 ;\n" 319 "movq $0xffffffffffffe, %%r10 ;\n" 320 "movq %%r10, %%r11 ;\n" 321 "movq %%r10, %%r12 ;\n" 322 "movq %%r10, %%r13 ;\n" 323 "subq %%rcx, %%r9 ;\n" 324 "subq %%r8, %%r10 ;\n" 325 "subq %%rdx, %%r11 ;\n" 326 "subq %%rsi, %%r12 ;\n" 327 "subq %%rdi, %%r13 ;\n" 329 "cmove %%r9, %%rcx ;\n" 330 "cmove %%r10, %%r8 ;\n" 331 "cmove %%r11, %%rdx ;\n" 332 "cmove %%r12, %%rsi ;\n" 333 "cmove %%r13, %%rdi ;\n" 336 "movq %%rcx, 80(%2) ;\n" 337 "movq %%r8, 88(%2) ;\n" 338 "movq %%rdx, 96(%2) ;\n" 339 "movq %%rsi, 104(%2) ;\n" 340 "movq %%rdi, 112(%2) ;\n" 342 :
"m"(u),
"r"(&
table[pos * 8]),
"r"(t),
"m"(sign)
344 "%rax",
"%rcx",
"%rdx",
"%rdi",
"%rsi",
"%r8",
"%r9",
"%r10",
"%r11",
"%r12",
"%r13",
345 "%xmm0",
"%xmm1",
"%xmm2",
"%xmm3",
"%xmm4",
"%xmm5",
"%xmm6",
"%xmm7",
"%xmm8",
"%xmm9",
"%xmm10",
"%xmm11",
"%xmm14",
"%xmm14",
std::vector< std::vector< _variant_t > > table
unsigned __int64 uint64_t