1/*1/*
2// references:2// references:
3// https://blog.cloudflare.com/go-crypto-bridging-the-performance-gap/3// https://blog.cloudflare.com/go-crypto-bridging-the-performance-gap/
4// https://github.com/vkrasnov/openssl/blob/vlad/inv_ord/crypto/ec/asm/ecp_nistz256-x86_64.pl4// https://github.com/vkrasnov/openssl/blob/vlad/inv_ord/crypto/ec/asm/ecp_nistz256-x86_64.pl
5// https://go-review.googlesource.com/#/c/8968/5// https://go-review.googlesource.com/#/c/8968/
6// https://groups.google.com/forum/#!msg/golang-codereviews/m5QTnSUZU6c/Q5RUAdefWUwJ6// https://groups.google.com/forum/#!msg/golang-codereviews/m5QTnSUZU6c/Q5RUAdefWUwJ
7// https://github.com/openssl/openssl/pull/263/files7// https://github.com/openssl/openssl/pull/263/files
8//8//
9//9//
10Portions Copyright 2015 The Go Authors. All rights reserved.10Portions Copyright 2015 The Go Authors. All rights reserved.
11Use of this source code is governed by the following11Use of this source code is governed by the following
12BSD-style license (from the go distributions LICENSE file):12BSD-style license (from the go distributions LICENSE file):
1313
14Redistribution and use in source and binary forms, with or without14Redistribution and use in source and binary forms, with or without
15modification, are permitted provided that the following conditions are15modification, are permitted provided that the following conditions are
16met:16met:
1717
18* Redistributions of source code must retain the above copyright18 * Redistributions of source code must retain the above copyright
19notice, this list of conditions and the following disclaimer.19notice, this list of conditions and the following disclaimer.
20* Redistributions in binary form must reproduce the above20 * Redistributions in binary form must reproduce the above
21copyright notice, this list of conditions and the following disclaimer21copyright notice, this list of conditions and the following disclaimer
22in the documentation and/or other materials provided with the22in the documentation and/or other materials provided with the
23distribution.23distribution.
24* Neither the name of Google Inc. nor the names of its24 * Neither the name of Google Inc. nor the names of its
25contributors may be used to endorse or promote products derived from25contributors may be used to endorse or promote products derived from
26this software without specific prior written permission.26this software without specific prior written permission.
2727
28THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS28THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT29"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR30LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT31A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,32OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT33SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,34LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY35DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT36THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE37(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.38OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3939
40##############################################################################40##############################################################################
41#                                                                            #41#                                                                            #
42# Portions Copyright (c) 2015 Intel Corporation                              #42# Portions Copyright (c) 2015 Intel Corporation                              #
43# Portions Copyright (c) 2015 CloudFlare, Inc.                               #43# Portions Copyright (c) 2015 CloudFlare, Inc.                               #
44# All rights reserved.                                                       #44# All rights reserved.                                                       #
45#                                                                            #45#                                                                            #
46# This software is made available to you under your choice of the            #46# This software is made available to you under your choice of the            #
47# Apache V.2.0 and/or BSD license below:                                     #47# Apache V.2.0 and/or BSD license below:                                     #
48#                                                                            #48#                                                                            #
49##############################################################################49##############################################################################
50#                                                                            #50#                                                                            #
51# Licensed under the Apache License, Version 2.0 (the "License");            #51# Licensed under the Apache License, Version 2.0 (the "License");            #
52# you may not use this file except in compliance with the License.           #52# you may not use this file except in compliance with the License.           #
53# You may obtain a copy of the License at                                    #53# You may obtain a copy of the License at                                    #
54#                                                                            #54#                                                                            #
55#    http://www.apache.org/licenses/LICENSE-2.0                              #55#    http://www.apache.org/licenses/LICENSE-2.0                              #
56#                                                                            #56#                                                                            #
57# Unless required by applicable law or agreed to in writing, software        #57# Unless required by applicable law or agreed to in writing, software        #
58# distributed under the License is distributed on an "AS IS" BASIS,          #58# distributed under the License is distributed on an "AS IS" BASIS,          #
59# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #59# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #
60# See the License for the specific language governing permissions and        #60# See the License for the specific language governing permissions and        #
61# limitations under the License.                                             #61# limitations under the License.                                             #
62#                                                                            #62#                                                                            #
63##############################################################################63##############################################################################
64#                                                                            #64#                                                                            #
65# Copyright (c) 2015 Intel Corporation                                       #65# Copyright (c) 2015 Intel Corporation                                       #
66# Copyright (c) 2015 CloudFlare, Inc.                                        #66# Copyright (c) 2015 CloudFlare, Inc.                                        #
67# All rights reserved.                                                       #67# All rights reserved.                                                       #
68#                                                                            #68#                                                                            #
69# This software is made available to you under your choice of the            #69# This software is made available to you under your choice of the            #
70# Apache V.2.0 and/or BSD license below:                                     #70# Apache V.2.0 and/or BSD license below:                                     #
71#                                                                            #71#                                                                            #
72##############################################################################72##############################################################################
73#                                                                            #73#                                                                            #
74# Licensed under the Apache License, Version 2.0 (the "License");            #74# Licensed under the Apache License, Version 2.0 (the "License");            #
75# you may not use this file except in compliance with the License.           #75# you may not use this file except in compliance with the License.           #
76# You may obtain a copy of the License at                                    #76# You may obtain a copy of the License at                                    #
77#                                                                            #77#                                                                            #
78#    http://www.apache.org/licenses/LICENSE-2.0                              #78#    http://www.apache.org/licenses/LICENSE-2.0                              #
79#                                                                            #79#                                                                            #
80# Unless required by applicable law or agreed to in writing, software        #80# Unless required by applicable law or agreed to in writing, software        #
81# distributed under the License is distributed on an "AS IS" BASIS,          #81# distributed under the License is distributed on an "AS IS" BASIS,          #
82# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #82# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #
83# See the License for the specific language governing permissions and        #83# See the License for the specific language governing permissions and        #
84# limitations under the License.                                             #84# limitations under the License.                                             #
85#                                                                            #85#                                                                            #
86##############################################################################86##############################################################################
87#                                                                            #87#                                                                            #
88#  Redistribution and use in source and binary forms, with or without        #88#  Redistribution and use in source and binary forms, with or without        #
89#  modification, are permitted provided that the following conditions are    #89#  modification, are permitted provided that the following conditions are    #
90#  met:                                                                      #90#  met:                                                                      #
91#                                                                            #91#                                                                            #
92#  #  Redistributions of source code must retain the above copyright         #92#  #  Redistributions of source code must retain the above copyright         #
93#     notice, this list of conditions and the following disclaimer.          #93#     notice, this list of conditions and the following disclaimer.          #
94#                                                                            #94#                                                                            #
95#  #  Redistributions in binary form must reproduce the above copyright      #95#  #  Redistributions in binary form must reproduce the above copyright      #
96#     notice, this list of conditions and the following disclaimer in the    #96#     notice, this list of conditions and the following disclaimer in the    #
97#     documentation and/or other materials provided with the                 #97#     documentation and/or other materials provided with the                 #
98#     distribution.                                                          #98#     distribution.                                                          #
99#                                                                            #99#                                                                            #
100#  #  Neither the name of the copyright holders nor the names of its         #100#  #  Neither the name of the copyright holders nor the names of its         #
101#     contributors may be used to endorse or promote products derived from   #101#     contributors may be used to endorse or promote products derived from   #
102#     this software without specific prior written permission.               #102#     this software without specific prior written permission.               #
103#                                                                            #103#                                                                            #
104#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS       #104#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS       #
105#  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED #105#  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED #
106#  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR#106#  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR#
107#  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR         #107#  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR         #
108#  CONTRIBUTORS  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,    #108#  CONTRIBUTORS  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,    #
109#  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,       #109#  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,       #
110#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR        #110#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR        #
111#  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF    #111#  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF    #
112#  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING      #112#  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING      #
113#  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS        #113#  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS        #
114#  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.              #114#  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.              #
115#                                                                            #115#                                                                            #
116##############################################################################116##############################################################################
117#                                                                            #117#                                                                            #
118#  Developers and authors:                                                   #118#  Developers and authors:                                                   #
119#  Shay Gueron (1, 2), and Vlad Krasnov (1, 3)                               #119#  Shay Gueron (1, 2), and Vlad Krasnov (1, 3)                               #
120#  (1) Intel Corporation, Israel Development Center                          #120#  (1) Intel Corporation, Israel Development Center                          #
121#  (2) University of Haifa                                                   #121#  (2) University of Haifa                                                   #
122#  (3) CloudFlare, Inc.                                                      #122#  (3) CloudFlare, Inc.                                                      #
123#  Reference:                                                                #123#  Reference:                                                                #
124#  S.Gueron and V.Krasnov, "Fast Prime Field Elliptic Curve Cryptography with#124#  S.Gueron and V.Krasnov, "Fast Prime Field Elliptic Curve Cryptography with#
125#                           256 Bit Primes"                                  #125#                           256 Bit Primes"                                  #
126#   https://eprint.iacr.org/2013/816.pdf                                     #126#   https://eprint.iacr.org/2013/816.pdf                                     #
127##############################################################################127##############################################################################
128128
129# Further optimization by <appro@openssl.org>:129# Further optimization by <appro@openssl.org>:
130#130#
131#                       this/original   with/without -DECP_NISTZ256_ASM(*)131#                       this/original   with/without -DECP_NISTZ256_ASM(*)
132# Opteron               +12-49%         +110-150%132# Opteron               +12-49%         +110-150%
133# Bulldozer             +14-45%         +175-210%133# Bulldozer             +14-45%         +175-210%
134# P4                    +18-46%         n/a :-(134# P4                    +18-46%         n/a :-(
135# Westmere              +12-34%         +80-87%135# Westmere              +12-34%         +80-87%
136# Sandy Bridge          +9-35%          +110-120%136# Sandy Bridge          +9-35%          +110-120%
137# Ivy Bridge            +9-35%          +110-125%137# Ivy Bridge            +9-35%          +110-125%
138# Haswell               +8-37%          +140-160%138# Haswell               +8-37%          +140-160%
139# Broadwell             +18-58%         +145-210%139# Broadwell             +18-58%         +145-210%
140# Atom                  +15-50%         +130-180%140# Atom                  +15-50%         +130-180%
141# VIA Nano              +43-160%        +300-480%141# VIA Nano              +43-160%        +300-480%
142#142#
143# (*)   "without -DECP_NISTZ256_ASM" refers to build with143# (*)   "without -DECP_NISTZ256_ASM" refers to build with
144#       "enable-ec_nistp_64_gcc_128";144#       "enable-ec_nistp_64_gcc_128";
145#145#
146# Ranges denote minimum and maximum improvement coefficients depending146# Ranges denote minimum and maximum improvement coefficients depending
147# on benchmark. Lower coefficients are for ECDSA sign, relatively fastest147# on benchmark. Lower coefficients are for ECDSA sign, relatively fastest
148# server-side operation. Keep in mind that +100% means 2x improvement.148# server-side operation. Keep in mind that +100% means 2x improvement.
149*/149*/
150
151
152// This file contains constant-time, 64-bit assembly implementation of150// This file contains constant-time, 64-bit assembly implementation of
153// P256. The optimizations performed here are described in detail in:151// P256. The optimizations performed here are described in detail in:
154//   S.Gueron and V.Krasnov, "Fast prime field elliptic-curve cryptography with152//   S.Gueron and V.Krasnov, "Fast prime field elliptic-curve cryptography with
155//                            256-bit primes"153//                            256-bit primes"
156154
157#include "textflag.h"155#include "textflag.h"
158156
159#define res_ptr DI157#define res_ptr DI
160#define x_ptr SI158#define x_ptr SI
161#define y_ptr CX159#define y_ptr CX
162160
163#define acc0 R8161#define acc0 R8
164#define acc1 R9162#define acc1 R9
165#define acc2 R10163#define acc2 R10
166#define acc3 R11164#define acc3 R11
167#define acc4 R12165#define acc4 R12
168#define acc5 R13166#define acc5 R13
169#define t0 R14167#define t0 R14
170#define t1 R15168#define t1 R15
171169
172DATA p256const0<>+0x00(SB)/8, $0x00000000ffffffff170DATA p256const0<>+0x00(SB)/8, $0x00000000ffffffff
173DATA p256const1<>+0x00(SB)/8, $0xffffffff00000001171DATA p256const1<>+0x00(SB)/8, $0xffffffff00000001
174DATA p256ordK0<>+0x00(SB)/8, $0xccd1c8aaee00bc4f172DATA p256ordK0<>+0x00(SB)/8, $0xccd1c8aaee00bc4f
175DATA p256ord<>+0x00(SB)/8, $0xf3b9cac2fc632551173DATA p256ord<>+0x00(SB)/8, $0xf3b9cac2fc632551
176DATA p256ord<>+0x08(SB)/8, $0xbce6faada7179e84174DATA p256ord<>+0x08(SB)/8, $0xbce6faada7179e84
177DATA p256ord<>+0x10(SB)/8, $0xffffffffffffffff175DATA p256ord<>+0x10(SB)/8, $0xffffffffffffffff
178DATA p256ord<>+0x18(SB)/8, $0xffffffff00000000176DATA p256ord<>+0x18(SB)/8, $0xffffffff00000000
179DATA p256one<>+0x00(SB)/8, $0x0000000000000001177DATA p256one<>+0x00(SB)/8, $0x0000000000000001
180DATA p256one<>+0x08(SB)/8, $0xffffffff00000000178DATA p256one<>+0x08(SB)/8, $0xffffffff00000000
181DATA p256one<>+0x10(SB)/8, $0xffffffffffffffff179DATA p256one<>+0x10(SB)/8, $0xffffffffffffffff
182DATA p256one<>+0x18(SB)/8, $0x00000000fffffffe180DATA p256one<>+0x18(SB)/8, $0x00000000fffffffe
183GLOBL p256const0<>(SB), 8, $8181GLOBL p256const0<>(SB), 8, $8
184GLOBL p256const1<>(SB), 8, $8182GLOBL p256const1<>(SB), 8, $8
185GLOBL p256ordK0<>(SB), 8, $8183GLOBL p256ordK0<>(SB), 8, $8
186GLOBL p256ord<>(SB), 8, $32184GLOBL p256ord<>(SB), 8, $32
187GLOBL p256one<>(SB), 8, $32185GLOBL p256one<>(SB), 8, $32
188186
189/* ---------------------------------------*/187// ---------------------------------------
190// func p256LittleToBig(res []byte, in []uint64)188// func p256LittleToBig(res []byte, in []uint64)
191TEXT ·p256LittleToBig(SB),NOSPLIT,$0189TEXT ·p256LittleToBig(SB), NOSPLIT, $0
192        JMP ·p256BigToLittle(SB)190        JMP ·p256BigToLittle(SB)
191
193/* ---------------------------------------*/192// ---------------------------------------
194// func p256BigToLittle(res []uint64, in []byte)193// func p256BigToLittle(res []uint64, in []byte)
195TEXT ·p256BigToLittle(SB),NOSPLIT,$0194TEXT ·p256BigToLittle(SB), NOSPLIT, $0
196        MOVQ z+0(FP), res_ptr195        MOVQ z+0(FP), res_ptr
197        MOVQ x+24(FP), x_ptr196        MOVQ x+24(FP), x_ptr
198197
199        MOVQ (8*0)(x_ptr), acc0198        MOVQ (8*0)(x_ptr), acc0
200        MOVQ (8*1)(x_ptr), acc1199        MOVQ (8*1)(x_ptr), acc1
201        MOVQ (8*2)(x_ptr), acc2200        MOVQ (8*2)(x_ptr), acc2
202        MOVQ (8*3)(x_ptr), acc3201        MOVQ (8*3)(x_ptr), acc3
203202
204        BSWAPQ acc0203        BSWAPQ acc0
205        BSWAPQ acc1204        BSWAPQ acc1
206        BSWAPQ acc2205        BSWAPQ acc2
207        BSWAPQ acc3206        BSWAPQ acc3
208207
209        MOVQ acc3, (8*0)(res_ptr)208        MOVQ acc3, (8*0)(res_ptr)
210        MOVQ acc2, (8*1)(res_ptr)209        MOVQ acc2, (8*1)(res_ptr)
211        MOVQ acc1, (8*2)(res_ptr)210        MOVQ acc1, (8*2)(res_ptr)
212        MOVQ acc0, (8*3)(res_ptr)211        MOVQ acc0, (8*3)(res_ptr)
213212
214        RET213        RET
214
215/* ---------------------------------------*/215// ---------------------------------------
216// func p256MovCond(res, a, b []uint64, cond int)216// func p256MovCond(res, a, b []uint64, cond int)
217// If cond == 0 res=b, else res=a217// If cond == 0 res=b, else res=a
218TEXT ·p256MovCond(SB),NOSPLIT,$0218TEXT ·p256MovCond(SB), NOSPLIT, $0
219        MOVQ res+0(FP), res_ptr219        MOVQ res+0(FP), res_ptr
220        MOVQ a+24(FP), x_ptr220        MOVQ a+24(FP), x_ptr
221        MOVQ b+48(FP), y_ptr221        MOVQ b+48(FP), y_ptr
222        MOVL cond+72(FP), t0222        MOVL cond+72(FP), t0
223223
224        MOVL t0, X12224        MOVL    t0, X12
225        PXOR X13, X13225        PXOR    X13, X13
226        PSHUFB X13, X12226        PSHUFB  X13, X12
227        PCMPEQB X13, X12227        PCMPEQB X13, X12
228228
229        MOVOU X12, X0229        MOVOU X12, X0
230        PANDN (16*0)(x_ptr), X0230        PANDN (16*0)(x_ptr), X0
231        MOVOU X12, X1231        MOVOU X12, X1
232        PANDN (16*1)(x_ptr), X1232        PANDN (16*1)(x_ptr), X1
233        MOVOU X12, X2233        MOVOU X12, X2
234        PANDN (16*2)(x_ptr), X2234        PANDN (16*2)(x_ptr), X2
235        MOVOU X12, X3235        MOVOU X12, X3
236        PANDN (16*3)(x_ptr), X3236        PANDN (16*3)(x_ptr), X3
237        MOVOU X12, X4237        MOVOU X12, X4
238        PANDN (16*4)(x_ptr), X4238        PANDN (16*4)(x_ptr), X4
239        MOVOU X12, X5239        MOVOU X12, X5
240        PANDN (16*5)(x_ptr), X5240        PANDN (16*5)(x_ptr), X5
241241
242        MOVOU (16*0)(y_ptr), X6242        MOVOU (16*0)(y_ptr), X6
243        MOVOU (16*1)(y_ptr), X7243        MOVOU (16*1)(y_ptr), X7
244        MOVOU (16*2)(y_ptr), X8244        MOVOU (16*2)(y_ptr), X8
245        MOVOU (16*3)(y_ptr), X9245        MOVOU (16*3)(y_ptr), X9
246        MOVOU (16*4)(y_ptr), X10246        MOVOU (16*4)(y_ptr), X10
247        MOVOU (16*5)(y_ptr), X11247        MOVOU (16*5)(y_ptr), X11
248248
249        PAND X12, X6249        PAND X12, X6
250        PAND X12, X7250        PAND X12, X7
251        PAND X12, X8251        PAND X12, X8
252        PAND X12, X9252        PAND X12, X9
253        PAND X12, X10253        PAND X12, X10
254        PAND X12, X11254        PAND X12, X11
255255
256        PXOR X6, X0256        PXOR X6, X0
257        PXOR X7, X1257        PXOR X7, X1
258        PXOR X8, X2258        PXOR X8, X2
259        PXOR X9, X3259        PXOR X9, X3
260        PXOR X10, X4260        PXOR X10, X4
261        PXOR X11, X5261        PXOR X11, X5
262262
263        MOVOU X0, (16*0)(res_ptr)263        MOVOU X0, (16*0)(res_ptr)
264        MOVOU X1, (16*1)(res_ptr)264        MOVOU X1, (16*1)(res_ptr)
265        MOVOU X2, (16*2)(res_ptr)265        MOVOU X2, (16*2)(res_ptr)
266        MOVOU X3, (16*3)(res_ptr)266        MOVOU X3, (16*3)(res_ptr)
267        MOVOU X4, (16*4)(res_ptr)267        MOVOU X4, (16*4)(res_ptr)
268        MOVOU X5, (16*5)(res_ptr)268        MOVOU X5, (16*5)(res_ptr)
269269
270        RET270        RET
271
271/* ---------------------------------------*/272// ---------------------------------------
272// func p256NegCond(val []uint64, cond int)273// func p256NegCond(val []uint64, cond int)
273TEXT ·p256NegCond(SB),NOSPLIT,$0274TEXT ·p256NegCond(SB), NOSPLIT, $0
274        MOVQ val+0(FP), res_ptr275        MOVQ val+0(FP), res_ptr
275        MOVL cond+24(FP), t0276        MOVL cond+24(FP), t0
277
276        // acc = poly278        // acc = poly
277        MOVQ $-1, acc0279        MOVQ $-1, acc0
278        MOVQ p256const0<>(SB), acc1280        MOVQ p256const0<>(SB), acc1
279        MOVQ $0, acc2281        MOVQ $0, acc2
280        MOVQ p256const1<>(SB), acc3282        MOVQ p256const1<>(SB), acc3
283
281        // Load the original value284        // Load the original value
282        MOVQ (8*0)(res_ptr), acc5285        MOVQ (8*0)(res_ptr), acc5
283        MOVQ (8*1)(res_ptr), x_ptr286        MOVQ (8*1)(res_ptr), x_ptr
284        MOVQ (8*2)(res_ptr), y_ptr287        MOVQ (8*2)(res_ptr), y_ptr
285        MOVQ (8*3)(res_ptr), t1288        MOVQ (8*3)(res_ptr), t1
289
286        // Speculatively subtract290        // Speculatively subtract
287        SUBQ acc5, acc0291        SUBQ acc5, acc0
288        SBBQ x_ptr, acc1292        SBBQ x_ptr, acc1
289        SBBQ y_ptr, acc2293        SBBQ y_ptr, acc2
290        SBBQ t1, acc3294        SBBQ t1, acc3
295
291        // If condition is 0, keep original value296        // If condition is 0, keep original value
292        TESTQ t0, t0297        TESTQ   t0, t0
293        CMOVQEQ acc5, acc0298        CMOVQEQ acc5, acc0
294        CMOVQEQ x_ptr, acc1299        CMOVQEQ x_ptr, acc1
295        CMOVQEQ y_ptr, acc2300        CMOVQEQ y_ptr, acc2
296        CMOVQEQ t1, acc3301        CMOVQEQ t1, acc3
302
297        // Store result303        // Store result
298        MOVQ acc0, (8*0)(res_ptr)304        MOVQ acc0, (8*0)(res_ptr)
299        MOVQ acc1, (8*1)(res_ptr)305        MOVQ acc1, (8*1)(res_ptr)
300        MOVQ acc2, (8*2)(res_ptr)306        MOVQ acc2, (8*2)(res_ptr)
301        MOVQ acc3, (8*3)(res_ptr)307        MOVQ acc3, (8*3)(res_ptr)
302308
303        RET309        RET
310
304/* ---------------------------------------*/311// ---------------------------------------
305// func p256Sqr(res, in []uint64)312// func p256Sqr(res, in []uint64)
306TEXT ·p256Sqr(SB),NOSPLIT,$0313TEXT ·p256Sqr(SB), NOSPLIT, $0
307        MOVQ res+0(FP), res_ptr314        MOVQ res+0(FP), res_ptr
308        MOVQ in+24(FP), x_ptr315        MOVQ in+24(FP), x_ptr
316
309        // y[1:] * y[0]317        // y[1:] * y[0]
310        MOVQ (8*0)(x_ptr), t0318        MOVQ (8*0)(x_ptr), t0
311319
312        MOVQ (8*1)(x_ptr), AX320        MOVQ (8*1)(x_ptr), AX
313        MULQ t0321        MULQ t0
314        MOVQ AX, acc1322        MOVQ AX, acc1
315        MOVQ DX, acc2323        MOVQ DX, acc2
316324
317        MOVQ (8*2)(x_ptr), AX325        MOVQ (8*2)(x_ptr), AX
318        MULQ t0326        MULQ t0
319        ADDQ AX, acc2327        ADDQ AX, acc2
320        ADCQ $0, DX328        ADCQ $0, DX
321        MOVQ DX, acc3329        MOVQ DX, acc3
322330
323        MOVQ (8*3)(x_ptr), AX331        MOVQ (8*3)(x_ptr), AX
324        MULQ t0332        MULQ t0
325        ADDQ AX, acc3333        ADDQ AX, acc3
326        ADCQ $0, DX334        ADCQ $0, DX
327        MOVQ DX, acc4335        MOVQ DX, acc4
336
328        // y[2:] * y[1]337        // y[2:] * y[1]
329        MOVQ (8*1)(x_ptr), t0338        MOVQ (8*1)(x_ptr), t0
330339
331        MOVQ (8*2)(x_ptr), AX340        MOVQ (8*2)(x_ptr), AX
332        MULQ t0341        MULQ t0
333        ADDQ AX, acc3342        ADDQ AX, acc3
334        ADCQ $0, DX343        ADCQ $0, DX
335        MOVQ DX, t1344        MOVQ DX, t1
336345
337        MOVQ (8*3)(x_ptr), AX346        MOVQ (8*3)(x_ptr), AX
338        MULQ t0347        MULQ t0
339        ADDQ t1, acc4348        ADDQ t1, acc4
340        ADCQ $0, DX349        ADCQ $0, DX
341        ADDQ AX, acc4350        ADDQ AX, acc4
342        ADCQ $0, DX351        ADCQ $0, DX
343        MOVQ DX, acc5352        MOVQ DX, acc5
353
344        // y[3] * y[2]354        // y[3] * y[2]
345        MOVQ (8*2)(x_ptr), t0355        MOVQ (8*2)(x_ptr), t0
346356
347        MOVQ (8*3)(x_ptr), AX357        MOVQ (8*3)(x_ptr), AX
348        MULQ t0358        MULQ t0
349        ADDQ AX, acc5359        ADDQ AX, acc5
350        ADCQ $0, DX360        ADCQ $0, DX
351        MOVQ DX, y_ptr361        MOVQ DX, y_ptr
352        XORQ t1, t1362        XORQ t1, t1
363
353        // *2364        // *2
354        ADDQ acc1, acc1365        ADDQ acc1, acc1
355        ADCQ acc2, acc2366        ADCQ acc2, acc2
356        ADCQ acc3, acc3367        ADCQ acc3, acc3
357        ADCQ acc4, acc4368        ADCQ acc4, acc4
358        ADCQ acc5, acc5369        ADCQ acc5, acc5
359        ADCQ y_ptr, y_ptr370        ADCQ y_ptr, y_ptr
360        ADCQ $0, t1371        ADCQ $0, t1
372
361        // Missing products373        // Missing products
362        MOVQ (8*0)(x_ptr), AX374        MOVQ (8*0)(x_ptr), AX
363        MULQ AX375        MULQ AX
364        MOVQ AX, acc0376        MOVQ AX, acc0
365        MOVQ DX, t0377        MOVQ DX, t0
366378
367        MOVQ (8*1)(x_ptr), AX379        MOVQ (8*1)(x_ptr), AX
368        MULQ AX380        MULQ AX
369        ADDQ t0, acc1381        ADDQ t0, acc1
370        ADCQ AX, acc2382        ADCQ AX, acc2
371        ADCQ $0, DX383        ADCQ $0, DX
372        MOVQ DX, t0384        MOVQ DX, t0
373385
374        MOVQ (8*2)(x_ptr), AX386        MOVQ (8*2)(x_ptr), AX
375        MULQ AX387        MULQ AX
376        ADDQ t0, acc3388        ADDQ t0, acc3
377        ADCQ AX, acc4389        ADCQ AX, acc4
378        ADCQ $0, DX390        ADCQ $0, DX
379        MOVQ DX, t0391        MOVQ DX, t0
380392
381        MOVQ (8*3)(x_ptr), AX393        MOVQ (8*3)(x_ptr), AX
382        MULQ AX394        MULQ AX
383        ADDQ t0, acc5395        ADDQ t0, acc5
384        ADCQ AX, y_ptr396        ADCQ AX, y_ptr
385        ADCQ DX, t1397        ADCQ DX, t1
386        MOVQ t1, x_ptr398        MOVQ t1, x_ptr
399
387        // First reduction step400        // First reduction step
388        MOVQ acc0, AX401        MOVQ acc0, AX
389        MOVQ acc0, t1402        MOVQ acc0, t1
390        SHLQ $32, acc0403        SHLQ $32, acc0
391        MULQ p256const1<>(SB)404        MULQ p256const1<>(SB)
392        SHRQ $32, t1405        SHRQ $32, t1
393        ADDQ acc0, acc1406        ADDQ acc0, acc1
394        ADCQ t1, acc2407        ADCQ t1, acc2
395        ADCQ AX, acc3408        ADCQ AX, acc3
396        ADCQ $0, DX409        ADCQ $0, DX
397        MOVQ DX, acc0410        MOVQ DX, acc0
411
398        // Second reduction step412        // Second reduction step
399        MOVQ acc1, AX413        MOVQ acc1, AX
400        MOVQ acc1, t1414        MOVQ acc1, t1
401        SHLQ $32, acc1415        SHLQ $32, acc1
402        MULQ p256const1<>(SB)416        MULQ p256const1<>(SB)
403        SHRQ $32, t1417        SHRQ $32, t1
404        ADDQ acc1, acc2418        ADDQ acc1, acc2
405        ADCQ t1, acc3419        ADCQ t1, acc3
406        ADCQ AX, acc0420        ADCQ AX, acc0
407        ADCQ $0, DX421        ADCQ $0, DX
408        MOVQ DX, acc1422        MOVQ DX, acc1
423
409        // Third reduction step424        // Third reduction step
410        MOVQ acc2, AX425        MOVQ acc2, AX
411        MOVQ acc2, t1426        MOVQ acc2, t1
412        SHLQ $32, acc2427        SHLQ $32, acc2
413        MULQ p256const1<>(SB)428        MULQ p256const1<>(SB)
414        SHRQ $32, t1429        SHRQ $32, t1
415        ADDQ acc2, acc3430        ADDQ acc2, acc3
416        ADCQ t1, acc0431        ADCQ t1, acc0
417        ADCQ AX, acc1432        ADCQ AX, acc1
418        ADCQ $0, DX433        ADCQ $0, DX
419        MOVQ DX, acc2434        MOVQ DX, acc2
435
420        // Last reduction step436        // Last reduction step
421        XORQ t0, t0437        XORQ t0, t0
422        MOVQ acc3, AX438        MOVQ acc3, AX
423        MOVQ acc3, t1439        MOVQ acc3, t1
424        SHLQ $32, acc3440        SHLQ $32, acc3
425        MULQ p256const1<>(SB)441        MULQ p256const1<>(SB)
426        SHRQ $32, t1442        SHRQ $32, t1
427        ADDQ acc3, acc0443        ADDQ acc3, acc0
428        ADCQ t1, acc1444        ADCQ t1, acc1
429        ADCQ AX, acc2445        ADCQ AX, acc2
430        ADCQ $0, DX446        ADCQ $0, DX
431        MOVQ DX, acc3447        MOVQ DX, acc3
448
432        // Add bits [511:256] of the sqr result449        // Add bits [511:256] of the sqr result
433        ADCQ acc4, acc0450        ADCQ acc4, acc0
434        ADCQ acc5, acc1451        ADCQ acc5, acc1
435        ADCQ y_ptr, acc2452        ADCQ y_ptr, acc2
436        ADCQ x_ptr, acc3453        ADCQ x_ptr, acc3
437        ADCQ $0, t0454        ADCQ $0, t0
438455
439        MOVQ acc0, acc4456        MOVQ acc0, acc4
440        MOVQ acc1, acc5457        MOVQ acc1, acc5
441        MOVQ acc2, y_ptr458        MOVQ acc2, y_ptr
442        MOVQ acc3, t1459        MOVQ acc3, t1
460
443        // Subtract p256461        // Subtract p256
444        SUBQ $-1, acc0462        SUBQ $-1, acc0
445        SBBQ p256const0<>(SB) ,acc1463        SBBQ p256const0<>(SB), acc1
446        SBBQ $0, acc2464        SBBQ $0, acc2
447        SBBQ p256const1<>(SB), acc3465        SBBQ p256const1<>(SB), acc3
448        SBBQ $0, t0466        SBBQ $0, t0
449467
450        CMOVQCS acc4, acc0468        CMOVQCS acc4, acc0
451        CMOVQCS acc5, acc1469        CMOVQCS acc5, acc1
452        CMOVQCS y_ptr, acc2470        CMOVQCS y_ptr, acc2
453        CMOVQCS t1, acc3471        CMOVQCS t1, acc3
454472
455        MOVQ acc0, (8*0)(res_ptr)473        MOVQ acc0, (8*0)(res_ptr)
456        MOVQ acc1, (8*1)(res_ptr)474        MOVQ acc1, (8*1)(res_ptr)
457        MOVQ acc2, (8*2)(res_ptr)475        MOVQ acc2, (8*2)(res_ptr)
458        MOVQ acc3, (8*3)(res_ptr)476        MOVQ acc3, (8*3)(res_ptr)
459477
460        RET478        RET
479
461/* ---------------------------------------*/480// ---------------------------------------
462// func p256Mul(res, in1, in2 []uint64)481// func p256Mul(res, in1, in2 []uint64)
463TEXT ·p256Mul(SB),NOSPLIT,$0482TEXT ·p256Mul(SB), NOSPLIT, $0
464        MOVQ res+0(FP), res_ptr483        MOVQ res+0(FP), res_ptr
465        MOVQ in1+24(FP), x_ptr484        MOVQ in1+24(FP), x_ptr
466        MOVQ in2+48(FP), y_ptr485        MOVQ in2+48(FP), y_ptr
486
467        // x * y[0]487        // x * y[0]
468        MOVQ (8*0)(y_ptr), t0488        MOVQ (8*0)(y_ptr), t0
469489
470        MOVQ (8*0)(x_ptr), AX490        MOVQ (8*0)(x_ptr), AX
471        MULQ t0491        MULQ t0
472        MOVQ AX, acc0492        MOVQ AX, acc0
473        MOVQ DX, acc1493        MOVQ DX, acc1
474494
475        MOVQ (8*1)(x_ptr), AX495        MOVQ (8*1)(x_ptr), AX
476        MULQ t0496        MULQ t0
477        ADDQ AX, acc1497        ADDQ AX, acc1
478        ADCQ $0, DX498        ADCQ $0, DX
479        MOVQ DX, acc2499        MOVQ DX, acc2
480500
481        MOVQ (8*2)(x_ptr), AX501        MOVQ (8*2)(x_ptr), AX
482        MULQ t0502        MULQ t0
483        ADDQ AX, acc2503        ADDQ AX, acc2
484        ADCQ $0, DX504        ADCQ $0, DX
485        MOVQ DX, acc3505        MOVQ DX, acc3
486506
487        MOVQ (8*3)(x_ptr), AX507        MOVQ (8*3)(x_ptr), AX
488        MULQ t0508        MULQ t0
489        ADDQ AX, acc3509        ADDQ AX, acc3
490        ADCQ $0, DX510        ADCQ $0, DX
491        MOVQ DX, acc4511        MOVQ DX, acc4
492        XORQ acc5, acc5512        XORQ acc5, acc5
513
493        // First reduction step514        // First reduction step
494        MOVQ acc0, AX515        MOVQ acc0, AX
495        MOVQ acc0, t1516        MOVQ acc0, t1
496        SHLQ $32, acc0517        SHLQ $32, acc0
497        MULQ p256const1<>(SB)518        MULQ p256const1<>(SB)
498        SHRQ $32, t1519        SHRQ $32, t1
499        ADDQ acc0, acc1520        ADDQ acc0, acc1
500        ADCQ t1, acc2521        ADCQ t1, acc2
501        ADCQ AX, acc3522        ADCQ AX, acc3
502        ADCQ DX, acc4523        ADCQ DX, acc4
503        ADCQ $0, acc5524        ADCQ $0, acc5
504        XORQ acc0, acc0525        XORQ acc0, acc0
526
505        // x * y[1]527        // x * y[1]
506        MOVQ (8*1)(y_ptr), t0528        MOVQ (8*1)(y_ptr), t0
507529
508        MOVQ (8*0)(x_ptr), AX530        MOVQ (8*0)(x_ptr), AX
509        MULQ t0531        MULQ t0
510        ADDQ AX, acc1532        ADDQ AX, acc1
511        ADCQ $0, DX533        ADCQ $0, DX
512        MOVQ DX, t1534        MOVQ DX, t1
513535
514        MOVQ (8*1)(x_ptr), AX536        MOVQ (8*1)(x_ptr), AX
515        MULQ t0537        MULQ t0
516        ADDQ t1, acc2538        ADDQ t1, acc2
517        ADCQ $0, DX539        ADCQ $0, DX
518        ADDQ AX, acc2540        ADDQ AX, acc2
519        ADCQ $0, DX541        ADCQ $0, DX
520        MOVQ DX, t1542        MOVQ DX, t1
521543
522        MOVQ (8*2)(x_ptr), AX544        MOVQ (8*2)(x_ptr), AX
523        MULQ t0545        MULQ t0
524        ADDQ t1, acc3546        ADDQ t1, acc3
525        ADCQ $0, DX547        ADCQ $0, DX
526        ADDQ AX, acc3548        ADDQ AX, acc3
527        ADCQ $0, DX549        ADCQ $0, DX
528        MOVQ DX, t1550        MOVQ DX, t1
529551
530        MOVQ (8*3)(x_ptr), AX552        MOVQ (8*3)(x_ptr), AX
531        MULQ t0553        MULQ t0
532        ADDQ t1, acc4554        ADDQ t1, acc4
533        ADCQ $0, DX555        ADCQ $0, DX
534        ADDQ AX, acc4556        ADDQ AX, acc4
535        ADCQ DX, acc5557        ADCQ DX, acc5
536        ADCQ $0, acc0558        ADCQ $0, acc0
559
537        // Second reduction step560        // Second reduction step
538        MOVQ acc1, AX561        MOVQ acc1, AX
539        MOVQ acc1, t1562        MOVQ acc1, t1
540        SHLQ $32, acc1563        SHLQ $32, acc1
541        MULQ p256const1<>(SB)564        MULQ p256const1<>(SB)
542        SHRQ $32, t1565        SHRQ $32, t1
543        ADDQ acc1, acc2566        ADDQ acc1, acc2
544        ADCQ t1, acc3567        ADCQ t1, acc3
545        ADCQ AX, acc4568        ADCQ AX, acc4
546        ADCQ DX, acc5569        ADCQ DX, acc5
547        ADCQ $0, acc0570        ADCQ $0, acc0
548        XORQ acc1, acc1571        XORQ acc1, acc1
572
549        // x * y[2]573        // x * y[2]
550        MOVQ (8*2)(y_ptr), t0574        MOVQ (8*2)(y_ptr), t0
551575
552        MOVQ (8*0)(x_ptr), AX576        MOVQ (8*0)(x_ptr), AX
553        MULQ t0577        MULQ t0
554        ADDQ AX, acc2578        ADDQ AX, acc2
555        ADCQ $0, DX579        ADCQ $0, DX
556        MOVQ DX, t1580        MOVQ DX, t1
557581
558        MOVQ (8*1)(x_ptr), AX582        MOVQ (8*1)(x_ptr), AX
559        MULQ t0583        MULQ t0
560        ADDQ t1, acc3584        ADDQ t1, acc3
561        ADCQ $0, DX585        ADCQ $0, DX
562        ADDQ AX, acc3586        ADDQ AX, acc3
563        ADCQ $0, DX587        ADCQ $0, DX
564        MOVQ DX, t1588        MOVQ DX, t1
565589
566        MOVQ (8*2)(x_ptr), AX590        MOVQ (8*2)(x_ptr), AX
567        MULQ t0591        MULQ t0
568        ADDQ t1, acc4592        ADDQ t1, acc4
569        ADCQ $0, DX593        ADCQ $0, DX
570        ADDQ AX, acc4594        ADDQ AX, acc4
571        ADCQ $0, DX595        ADCQ $0, DX
572        MOVQ DX, t1596        MOVQ DX, t1
573597
574        MOVQ (8*3)(x_ptr), AX598        MOVQ (8*3)(x_ptr), AX
575        MULQ t0599        MULQ t0
576        ADDQ t1, acc5600        ADDQ t1, acc5
577        ADCQ $0, DX601        ADCQ $0, DX
578        ADDQ AX, acc5602        ADDQ AX, acc5
579        ADCQ DX, acc0603        ADCQ DX, acc0
580        ADCQ $0, acc1604        ADCQ $0, acc1
605
581        // Third reduction step606        // Third reduction step
582        MOVQ acc2, AX607        MOVQ acc2, AX
583        MOVQ acc2, t1608        MOVQ acc2, t1
584        SHLQ $32, acc2609        SHLQ $32, acc2
585        MULQ p256const1<>(SB)610        MULQ p256const1<>(SB)
586        SHRQ $32, t1611        SHRQ $32, t1
587        ADDQ acc2, acc3612        ADDQ acc2, acc3
588        ADCQ t1, acc4613        ADCQ t1, acc4
589        ADCQ AX, acc5614        ADCQ AX, acc5
590        ADCQ DX, acc0615        ADCQ DX, acc0
591        ADCQ $0, acc1616        ADCQ $0, acc1
592        XORQ acc2, acc2617        XORQ acc2, acc2
618
593        // x * y[3]619        // x * y[3]
594        MOVQ (8*3)(y_ptr), t0620        MOVQ (8*3)(y_ptr), t0
595621
596        MOVQ (8*0)(x_ptr), AX622        MOVQ (8*0)(x_ptr), AX
597        MULQ t0623        MULQ t0
598        ADDQ AX, acc3624        ADDQ AX, acc3
599        ADCQ $0, DX625        ADCQ $0, DX
600        MOVQ DX, t1626        MOVQ DX, t1
601627
602        MOVQ (8*1)(x_ptr), AX628        MOVQ (8*1)(x_ptr), AX
603        MULQ t0629        MULQ t0
604        ADDQ t1, acc4630        ADDQ t1, acc4
605        ADCQ $0, DX631        ADCQ $0, DX
606        ADDQ AX, acc4632        ADDQ AX, acc4
607        ADCQ $0, DX633        ADCQ $0, DX
608        MOVQ DX, t1634        MOVQ DX, t1
609635
610        MOVQ (8*2)(x_ptr), AX636        MOVQ (8*2)(x_ptr), AX
611        MULQ t0637        MULQ t0
612        ADDQ t1, acc5638        ADDQ t1, acc5
613        ADCQ $0, DX639        ADCQ $0, DX
614        ADDQ AX, acc5640        ADDQ AX, acc5
615        ADCQ $0, DX641        ADCQ $0, DX
616        MOVQ DX, t1642        MOVQ DX, t1
617643
618        MOVQ (8*3)(x_ptr), AX644        MOVQ (8*3)(x_ptr), AX
619        MULQ t0645        MULQ t0
620        ADDQ t1, acc0646        ADDQ t1, acc0
621        ADCQ $0, DX647        ADCQ $0, DX
622        ADDQ AX, acc0648        ADDQ AX, acc0
623        ADCQ DX, acc1649        ADCQ DX, acc1
624        ADCQ $0, acc2650        ADCQ $0, acc2
651
625        // Last reduction step652        // Last reduction step
626        MOVQ acc3, AX653        MOVQ acc3, AX
627        MOVQ acc3, t1654        MOVQ acc3, t1
628        SHLQ $32, acc3655        SHLQ $32, acc3
629        MULQ p256const1<>(SB)656        MULQ p256const1<>(SB)
630        SHRQ $32, t1657        SHRQ $32, t1
631        ADDQ acc3, acc4658        ADDQ acc3, acc4
632        ADCQ t1, acc5659        ADCQ t1, acc5
633        ADCQ AX, acc0660        ADCQ AX, acc0
634        ADCQ DX, acc1661        ADCQ DX, acc1
635        ADCQ $0, acc2662        ADCQ $0, acc2
663
636        // Copy result [255:0]664        // Copy result [255:0]
637        MOVQ acc4, x_ptr665        MOVQ acc4, x_ptr
638        MOVQ acc5, acc3666        MOVQ acc5, acc3
639        MOVQ acc0, t0667        MOVQ acc0, t0
640        MOVQ acc1, t1668        MOVQ acc1, t1
669
641        // Subtract p256670        // Subtract p256
642        SUBQ $-1, acc4671        SUBQ $-1, acc4
643        SBBQ p256const0<>(SB) ,acc5672        SBBQ p256const0<>(SB), acc5
644        SBBQ $0, acc0673        SBBQ $0, acc0
645        SBBQ p256const1<>(SB), acc1674        SBBQ p256const1<>(SB), acc1
646        SBBQ $0, acc2675        SBBQ $0, acc2
647676
648        CMOVQCS x_ptr, acc4677        CMOVQCS x_ptr, acc4
649        CMOVQCS acc3, acc5678        CMOVQCS acc3, acc5
650        CMOVQCS t0, acc0679        CMOVQCS t0, acc0
651        CMOVQCS t1, acc1680        CMOVQCS t1, acc1
652681
653        MOVQ acc4, (8*0)(res_ptr)682        MOVQ acc4, (8*0)(res_ptr)
654        MOVQ acc5, (8*1)(res_ptr)683        MOVQ acc5, (8*1)(res_ptr)
655        MOVQ acc0, (8*2)(res_ptr)684        MOVQ acc0, (8*2)(res_ptr)
656        MOVQ acc1, (8*3)(res_ptr)685        MOVQ acc1, (8*3)(res_ptr)
657686
658        RET687        RET
688
659/* ---------------------------------------*/689// ---------------------------------------
660// func p256FromMont(res, in []uint64)690// func p256FromMont(res, in []uint64)
661TEXT ·p256FromMont(SB),NOSPLIT,$0691TEXT ·p256FromMont(SB), NOSPLIT, $0
662        MOVQ res+0(FP), res_ptr692        MOVQ res+0(FP), res_ptr
663        MOVQ in+24(FP), x_ptr693        MOVQ in+24(FP), x_ptr
664694
665        MOVQ (8*0)(x_ptr), acc0695        MOVQ (8*0)(x_ptr), acc0
666        MOVQ (8*1)(x_ptr), acc1696        MOVQ (8*1)(x_ptr), acc1
667        MOVQ (8*2)(x_ptr), acc2697        MOVQ (8*2)(x_ptr), acc2
668        MOVQ (8*3)(x_ptr), acc3698        MOVQ (8*3)(x_ptr), acc3
669        XORQ acc4, acc4699        XORQ acc4, acc4
670700
671        // Only reduce, no multiplications are needed701        // Only reduce, no multiplications are needed
672        // First stage702        // First stage
673        MOVQ acc0, AX703        MOVQ acc0, AX
674        MOVQ acc0, t1704        MOVQ acc0, t1
675        SHLQ $32, acc0705        SHLQ $32, acc0
676        MULQ p256const1<>(SB)706        MULQ p256const1<>(SB)
677        SHRQ $32, t1707        SHRQ $32, t1
678        ADDQ acc0, acc1708        ADDQ acc0, acc1
679        ADCQ t1, acc2709        ADCQ t1, acc2
680        ADCQ AX, acc3710        ADCQ AX, acc3
681        ADCQ DX, acc4711        ADCQ DX, acc4
682        XORQ acc5, acc5712        XORQ acc5, acc5
713
683        // Second stage714        // Second stage
684        MOVQ acc1, AX715        MOVQ acc1, AX
685        MOVQ acc1, t1716        MOVQ acc1, t1
686        SHLQ $32, acc1717        SHLQ $32, acc1
687        MULQ p256const1<>(SB)718        MULQ p256const1<>(SB)
688        SHRQ $32, t1719        SHRQ $32, t1
689        ADDQ acc1, acc2720        ADDQ acc1, acc2
690        ADCQ t1, acc3721        ADCQ t1, acc3
691        ADCQ AX, acc4722        ADCQ AX, acc4
692        ADCQ DX, acc5723        ADCQ DX, acc5
693        XORQ acc0, acc0724        XORQ acc0, acc0
725
694        // Third stage726        // Third stage
695        MOVQ acc2, AX727        MOVQ acc2, AX
696        MOVQ acc2, t1728        MOVQ acc2, t1
697        SHLQ $32, acc2729        SHLQ $32, acc2
698        MULQ p256const1<>(SB)730        MULQ p256const1<>(SB)
699        SHRQ $32, t1731        SHRQ $32, t1
700        ADDQ acc2, acc3732        ADDQ acc2, acc3
701        ADCQ t1, acc4733        ADCQ t1, acc4
702        ADCQ AX, acc5734        ADCQ AX, acc5
703        ADCQ DX, acc0735        ADCQ DX, acc0
704        XORQ acc1, acc1736        XORQ acc1, acc1
737
705        // Last stage738        // Last stage
706        MOVQ acc3, AX739        MOVQ acc3, AX
707        MOVQ acc3, t1740        MOVQ acc3, t1
708        SHLQ $32, acc3741        SHLQ $32, acc3
709        MULQ p256const1<>(SB)742        MULQ p256const1<>(SB)
710        SHRQ $32, t1743        SHRQ $32, t1
711        ADDQ acc3, acc4744        ADDQ acc3, acc4
712        ADCQ t1, acc5745        ADCQ t1, acc5
713        ADCQ AX, acc0746        ADCQ AX, acc0
714        ADCQ DX, acc1747        ADCQ DX, acc1
715748
716        MOVQ acc4, x_ptr749        MOVQ acc4, x_ptr
717        MOVQ acc5, acc3750        MOVQ acc5, acc3
718        MOVQ acc0, t0751        MOVQ acc0, t0
719        MOVQ acc1, t1752        MOVQ acc1, t1
720753
721        SUBQ $-1, acc4754        SUBQ $-1, acc4
722        SBBQ p256const0<>(SB), acc5755        SBBQ p256const0<>(SB), acc5
723        SBBQ $0, acc0756        SBBQ $0, acc0
724        SBBQ p256const1<>(SB), acc1757        SBBQ p256const1<>(SB), acc1
725758
726        CMOVQCS x_ptr, acc4759        CMOVQCS x_ptr, acc4
727        CMOVQCS acc3, acc5760        CMOVQCS acc3, acc5
728        CMOVQCS t0, acc0761        CMOVQCS t0, acc0
729        CMOVQCS t1, acc1762        CMOVQCS t1, acc1
730763
731        MOVQ acc4, (8*0)(res_ptr)764        MOVQ acc4, (8*0)(res_ptr)
732        MOVQ acc5, (8*1)(res_ptr)765        MOVQ acc5, (8*1)(res_ptr)
733        MOVQ acc0, (8*2)(res_ptr)766        MOVQ acc0, (8*2)(res_ptr)
734        MOVQ acc1, (8*3)(res_ptr)767        MOVQ acc1, (8*3)(res_ptr)
735768
736        RET769        RET
770
737/* ---------------------------------------*/771// ---------------------------------------
738// Constant time point access to arbitrary point table.772// Constant time point access to arbitrary point table.
739// Indexed from 1 to 15, with -1 offset773// Indexed from 1 to 15, with -1 offset
740// (index 0 is implicitly point at infinity)774// (index 0 is implicitly point at infinity)
741// func p256Select(p, r []uint64, idx int)775// func p256Select(p, r []uint64, idx int)
742TEXT ·p256Select(SB),NOSPLIT,$0776TEXT ·p256Select(SB), NOSPLIT, $0
743        MOVL idx+48(FP),AX777        MOVL idx+48(FP), AX
744        MOVQ r+24(FP),DI778        MOVQ r+24(FP), DI
745        MOVQ p+0(FP),DX779        MOVQ p+0(FP), DX
746780
747        PXOR X15, X15        // X15 = 0781        PXOR    X15, X15     // X15 = 0
748        PCMPEQL X14, X14 // X14 = -1782        PCMPEQL X14, X14     // X14 = -1
749        PSUBL X14, X15   // X15 = 1783        PSUBL   X14, X15     // X15 = 1
750        MOVL AX, X14784        MOVL    AX, X14
751        PSHUFD $0, X14, X14785        PSHUFD  $0, X14, X14
752786
753        PXOR X0, X0787        PXOR X0, X0
754        PXOR X1, X1788        PXOR X1, X1
755        PXOR X2, X2789        PXOR X2, X2
756        PXOR X3, X3790        PXOR X3, X3
757        PXOR X4, X4791        PXOR X4, X4
758        PXOR X5, X5792        PXOR X5, X5
759        MOVQ $16, AX793        MOVQ $16, AX
760794
761        MOVOU X15, X13795        MOVOU X15, X13
762796
763loop_select:797loop_select:
764798
765                MOVOU X13, X12799        MOVOU   X13, X12
766                PADDL X15, X13800        PADDL   X15, X13
767                PCMPEQL X14, X12801        PCMPEQL X14, X12
768802
769                MOVOU (16*0)(DI), X6803        MOVOU (16*0)(DI), X6
770                MOVOU (16*1)(DI), X7804        MOVOU (16*1)(DI), X7
771                MOVOU (16*2)(DI), X8805        MOVOU (16*2)(DI), X8
772                MOVOU (16*3)(DI), X9806        MOVOU (16*3)(DI), X9
773                MOVOU (16*4)(DI), X10807        MOVOU (16*4)(DI), X10
774                MOVOU (16*5)(DI), X11808        MOVOU (16*5)(DI), X11
775                ADDQ $(16*6), DI809        ADDQ  $(16*6), DI
776810
777                PAND X12, X6811        PAND X12, X6
778                PAND X12, X7812        PAND X12, X7
779                PAND X12, X8813        PAND X12, X8
780                PAND X12, X9814        PAND X12, X9
781                PAND X12, X10815        PAND X12, X10
782                PAND X12, X11816        PAND X12, X11
783817
784                PXOR X6, X0818        PXOR X6, X0
785                PXOR X7, X1819        PXOR X7, X1
786                PXOR X8, X2820        PXOR X8, X2
787                PXOR X9, X3821        PXOR X9, X3
788                PXOR X10, X4822        PXOR X10, X4
789                PXOR X11, X5823        PXOR X11, X5
790824
791                DECQ AX825        DECQ AX
792                JNE loop_select826        JNE  loop_select
793827
794        MOVOU X0, (16*0)(DX)828        MOVOU X0, (16*0)(DX)
795        MOVOU X1, (16*1)(DX)829        MOVOU X1, (16*1)(DX)
796        MOVOU X2, (16*2)(DX)830        MOVOU X2, (16*2)(DX)
797        MOVOU X3, (16*3)(DX)831        MOVOU X3, (16*3)(DX)
798        MOVOU X4, (16*4)(DX)832        MOVOU X4, (16*4)(DX)
799        MOVOU X5, (16*5)(DX)833        MOVOU X5, (16*5)(DX)
800834
801        RET835        RET
836
802/* ---------------------------------------*/837// ---------------------------------------
803// Constant time point access to base point table.838// Constant time point access to base point table.
804// func p256SelectBase(p, r []uint64, idx int)839// func p256SelectBase(p, r []uint64, idx int)
805TEXT ·p256SelectBase(SB),NOSPLIT,$0840TEXT ·p256SelectBase(SB), NOSPLIT, $0
806        MOVL idx+48(FP),AX841        MOVL idx+48(FP), AX
807        MOVQ r+24(FP),DI842        MOVQ r+24(FP), DI
808        MOVQ p+0(FP),DX843        MOVQ p+0(FP), DX
809844
810        PXOR X15, X15        // X15 = 0845        PXOR    X15, X15     // X15 = 0
811        PCMPEQL X14, X14 // X14 = -1846        PCMPEQL X14, X14     // X14 = -1
812        PSUBL X14, X15   // X15 = 1847        PSUBL   X14, X15     // X15 = 1
813        MOVL AX, X14848        MOVL    AX, X14
814        PSHUFD $0, X14, X14849        PSHUFD  $0, X14, X14
815850
816        PXOR X0, X0851        PXOR X0, X0
817        PXOR X1, X1852        PXOR X1, X1
818        PXOR X2, X2853        PXOR X2, X2
819        PXOR X3, X3854        PXOR X3, X3
820        MOVQ $32, AX855        MOVQ $32, AX
821856
822        MOVOU X15, X13857        MOVOU X15, X13
823858
824loop_select_base:859loop_select_base:
825860
826                MOVOU X13, X12861        MOVOU   X13, X12
827                PADDL X15, X13862        PADDL   X15, X13
828                PCMPEQL X14, X12863        PCMPEQL X14, X12
829864
830                MOVOU (16*0)(DI), X4865        MOVOU (16*0)(DI), X4
831                MOVOU (16*1)(DI), X5866        MOVOU (16*1)(DI), X5
832                MOVOU (16*2)(DI), X6867        MOVOU (16*2)(DI), X6
833                MOVOU (16*3)(DI), X7868        MOVOU (16*3)(DI), X7
834869
835                MOVOU (16*4)(DI), X8870        MOVOU (16*4)(DI), X8
836                MOVOU (16*5)(DI), X9871        MOVOU (16*5)(DI), X9
837                MOVOU (16*6)(DI), X10872        MOVOU (16*6)(DI), X10
838                MOVOU (16*7)(DI), X11873        MOVOU (16*7)(DI), X11
839874
840                ADDQ $(16*8), DI875        ADDQ $(16*8), DI
841876
842                PAND X12, X4877        PAND X12, X4
843                PAND X12, X5878        PAND X12, X5
844                PAND X12, X6879        PAND X12, X6
845                PAND X12, X7880        PAND X12, X7
846881
847                MOVOU X13, X12882        MOVOU   X13, X12
848                PADDL X15, X13883        PADDL   X15, X13
849                PCMPEQL X14, X12884        PCMPEQL X14, X12
850885
851                PAND X12, X8886        PAND X12, X8
852                PAND X12, X9887        PAND X12, X9
853                PAND X12, X10888        PAND X12, X10
854                PAND X12, X11889        PAND X12, X11
855890
856                PXOR X4, X0891        PXOR X4, X0
857                PXOR X5, X1892        PXOR X5, X1
858                PXOR X6, X2893        PXOR X6, X2
859                PXOR X7, X3894        PXOR X7, X3
860895
861                PXOR X8, X0896        PXOR X8, X0
862                PXOR X9, X1897        PXOR X9, X1
863                PXOR X10, X2898        PXOR X10, X2
864                PXOR X11, X3899        PXOR X11, X3
865900
866                DECQ AX901        DECQ AX
867                JNE loop_select_base902        JNE  loop_select_base
868903
869        MOVOU X0, (16*0)(DX)904        MOVOU X0, (16*0)(DX)
870        MOVOU X1, (16*1)(DX)905        MOVOU X1, (16*1)(DX)
871        MOVOU X2, (16*2)(DX)906        MOVOU X2, (16*2)(DX)
872        MOVOU X3, (16*3)(DX)907        MOVOU X3, (16*3)(DX)
873908
874        RET909        RET
910
875/* ---------------------------------------*/911// ---------------------------------------
876// func p256OrdMul(res, in1, in2 []uint64)912// func p256OrdMul(res, in1, in2 []uint64)
877TEXT ·p256OrdMul(SB),NOSPLIT,$0913TEXT ·p256OrdMul(SB), NOSPLIT, $0
878        MOVQ res+0(FP), res_ptr914        MOVQ res+0(FP), res_ptr
879        MOVQ in1+24(FP), x_ptr915        MOVQ in1+24(FP), x_ptr
880        MOVQ in2+48(FP), y_ptr916        MOVQ in2+48(FP), y_ptr
917
881        // x * y[0]918        // x * y[0]
882        MOVQ (8*0)(y_ptr), t0919        MOVQ (8*0)(y_ptr), t0
883920
884        MOVQ (8*0)(x_ptr), AX921        MOVQ (8*0)(x_ptr), AX
885        MULQ t0922        MULQ t0
886        MOVQ AX, acc0923        MOVQ AX, acc0
887        MOVQ DX, acc1924        MOVQ DX, acc1
888925
889        MOVQ (8*1)(x_ptr), AX926        MOVQ (8*1)(x_ptr), AX
890        MULQ t0927        MULQ t0
891        ADDQ AX, acc1928        ADDQ AX, acc1
892        ADCQ $0, DX929        ADCQ $0, DX
893        MOVQ DX, acc2930        MOVQ DX, acc2
894931
895        MOVQ (8*2)(x_ptr), AX932        MOVQ (8*2)(x_ptr), AX
896        MULQ t0933        MULQ t0
897        ADDQ AX, acc2934        ADDQ AX, acc2
898        ADCQ $0, DX935        ADCQ $0, DX
899        MOVQ DX, acc3936        MOVQ DX, acc3
900937
901        MOVQ (8*3)(x_ptr), AX938        MOVQ (8*3)(x_ptr), AX
902        MULQ t0939        MULQ t0
903        ADDQ AX, acc3940        ADDQ AX, acc3
904        ADCQ $0, DX941        ADCQ $0, DX
905        MOVQ DX, acc4942        MOVQ DX, acc4
906        XORQ acc5, acc5943        XORQ acc5, acc5
944
907        // First reduction step945        // First reduction step
908        MOVQ acc0, AX946        MOVQ acc0, AX
909        MULQ p256ordK0<>(SB)947        MULQ p256ordK0<>(SB)
910        MOVQ AX, t0948        MOVQ AX, t0
911949
912        MOVQ p256ord<>+0x00(SB), AX950        MOVQ p256ord<>+0x00(SB), AX
913        MULQ t0951        MULQ t0
914        ADDQ AX, acc0952        ADDQ AX, acc0
915        ADCQ $0, DX953        ADCQ $0, DX
916        MOVQ DX, t1954        MOVQ DX, t1
917955
918        MOVQ p256ord<>+0x08(SB), AX956        MOVQ p256ord<>+0x08(SB), AX
919        MULQ t0957        MULQ t0
920        ADDQ t1, acc1958        ADDQ t1, acc1
921        ADCQ $0, DX959        ADCQ $0, DX
922        ADDQ AX, acc1960        ADDQ AX, acc1
923        ADCQ $0, DX961        ADCQ $0, DX
924        MOVQ DX, t1962        MOVQ DX, t1
925963
926        MOVQ p256ord<>+0x10(SB), AX964        MOVQ p256ord<>+0x10(SB), AX
927        MULQ t0965        MULQ t0
928        ADDQ t1, acc2966        ADDQ t1, acc2
929        ADCQ $0, DX967        ADCQ $0, DX
930        ADDQ AX, acc2968        ADDQ AX, acc2
931        ADCQ $0, DX969        ADCQ $0, DX
932        MOVQ DX, t1970        MOVQ DX, t1
933971
934        MOVQ p256ord<>+0x18(SB), AX972        MOVQ p256ord<>+0x18(SB), AX
935        MULQ t0973        MULQ t0
936        ADDQ t1, acc3974        ADDQ t1, acc3
937        ADCQ $0, DX975        ADCQ $0, DX
938        ADDQ AX, acc3976        ADDQ AX, acc3
939        ADCQ DX, acc4977        ADCQ DX, acc4
940        ADCQ $0, acc5978        ADCQ $0, acc5
979
941        // x * y[1]980        // x * y[1]
942        MOVQ (8*1)(y_ptr), t0981        MOVQ (8*1)(y_ptr), t0
943982
944        MOVQ (8*0)(x_ptr), AX983        MOVQ (8*0)(x_ptr), AX
945        MULQ t0984        MULQ t0
946        ADDQ AX, acc1985        ADDQ AX, acc1
947        ADCQ $0, DX986        ADCQ $0, DX
948        MOVQ DX, t1987        MOVQ DX, t1
949988
950        MOVQ (8*1)(x_ptr), AX989        MOVQ (8*1)(x_ptr), AX
951        MULQ t0990        MULQ t0
952        ADDQ t1, acc2991        ADDQ t1, acc2
953        ADCQ $0, DX992        ADCQ $0, DX
954        ADDQ AX, acc2993        ADDQ AX, acc2
955        ADCQ $0, DX994        ADCQ $0, DX
956        MOVQ DX, t1995        MOVQ DX, t1
957996
958        MOVQ (8*2)(x_ptr), AX997        MOVQ (8*2)(x_ptr), AX
959        MULQ t0998        MULQ t0
960        ADDQ t1, acc3999        ADDQ t1, acc3
961        ADCQ $0, DX1000        ADCQ $0, DX
962        ADDQ AX, acc31001        ADDQ AX, acc3
963        ADCQ $0, DX1002        ADCQ $0, DX
964        MOVQ DX, t11003        MOVQ DX, t1
9651004
966        MOVQ (8*3)(x_ptr), AX1005        MOVQ (8*3)(x_ptr), AX
967        MULQ t01006        MULQ t0
968        ADDQ t1, acc41007        ADDQ t1, acc4
969        ADCQ $0, DX1008        ADCQ $0, DX
970        ADDQ AX, acc41009        ADDQ AX, acc4
971        ADCQ DX, acc51010        ADCQ DX, acc5
972        ADCQ $0, acc01011        ADCQ $0, acc0
1012
973        // Second reduction step1013        // Second reduction step
974        MOVQ acc1, AX1014        MOVQ acc1, AX
975        MULQ p256ordK0<>(SB)1015        MULQ p256ordK0<>(SB)
976        MOVQ AX, t01016        MOVQ AX, t0
9771017
978        MOVQ p256ord<>+0x00(SB), AX1018        MOVQ p256ord<>+0x00(SB), AX
979        MULQ t01019        MULQ t0
980        ADDQ AX, acc11020        ADDQ AX, acc1
981        ADCQ $0, DX1021        ADCQ $0, DX
982        MOVQ DX, t11022        MOVQ DX, t1
9831023
984        MOVQ p256ord<>+0x08(SB), AX1024        MOVQ p256ord<>+0x08(SB), AX
985        MULQ t01025        MULQ t0
986        ADDQ t1, acc21026        ADDQ t1, acc2
987        ADCQ $0, DX1027        ADCQ $0, DX
988        ADDQ AX, acc21028        ADDQ AX, acc2
989        ADCQ $0, DX1029        ADCQ $0, DX
990        MOVQ DX, t11030        MOVQ DX, t1
9911031
992        MOVQ p256ord<>+0x10(SB), AX1032        MOVQ p256ord<>+0x10(SB), AX
993        MULQ t01033        MULQ t0
994        ADDQ t1, acc31034        ADDQ t1, acc3
995        ADCQ $0, DX1035        ADCQ $0, DX
996        ADDQ AX, acc31036        ADDQ AX, acc3
997        ADCQ $0, DX1037        ADCQ $0, DX
998        MOVQ DX, t11038        MOVQ DX, t1
9991039
1000        MOVQ p256ord<>+0x18(SB), AX1040        MOVQ p256ord<>+0x18(SB), AX
1001        MULQ t01041        MULQ t0
1002        ADDQ t1, acc41042        ADDQ t1, acc4
1003        ADCQ $0, DX1043        ADCQ $0, DX
1004        ADDQ AX, acc41044        ADDQ AX, acc4
1005        ADCQ DX, acc51045        ADCQ DX, acc5
1006        ADCQ $0, acc01046        ADCQ $0, acc0
1047
1007        // x * y[2]1048        // x * y[2]
1008        MOVQ (8*2)(y_ptr), t01049        MOVQ (8*2)(y_ptr), t0
10091050
1010        MOVQ (8*0)(x_ptr), AX1051        MOVQ (8*0)(x_ptr), AX
1011        MULQ t01052        MULQ t0
1012        ADDQ AX, acc21053        ADDQ AX, acc2
1013        ADCQ $0, DX1054        ADCQ $0, DX
1014        MOVQ DX, t11055        MOVQ DX, t1
10151056
1016        MOVQ (8*1)(x_ptr), AX1057        MOVQ (8*1)(x_ptr), AX
1017        MULQ t01058        MULQ t0
1018        ADDQ t1, acc31059        ADDQ t1, acc3
1019        ADCQ $0, DX1060        ADCQ $0, DX
1020        ADDQ AX, acc31061        ADDQ AX, acc3
1021        ADCQ $0, DX1062        ADCQ $0, DX
1022        MOVQ DX, t11063        MOVQ DX, t1
10231064
1024        MOVQ (8*2)(x_ptr), AX1065        MOVQ (8*2)(x_ptr), AX
1025        MULQ t01066        MULQ t0
1026        ADDQ t1, acc41067        ADDQ t1, acc4
1027        ADCQ $0, DX1068        ADCQ $0, DX
1028        ADDQ AX, acc41069        ADDQ AX, acc4
1029        ADCQ $0, DX1070        ADCQ $0, DX
1030        MOVQ DX, t11071        MOVQ DX, t1
10311072
1032        MOVQ (8*3)(x_ptr), AX1073        MOVQ (8*3)(x_ptr), AX
1033        MULQ t01074        MULQ t0
1034        ADDQ t1, acc51075        ADDQ t1, acc5
1035        ADCQ $0, DX1076        ADCQ $0, DX
1036        ADDQ AX, acc51077        ADDQ AX, acc5
1037        ADCQ DX, acc01078        ADCQ DX, acc0
1038        ADCQ $0, acc11079        ADCQ $0, acc1
1080
1039        // Third reduction step1081        // Third reduction step
1040        MOVQ acc2, AX1082        MOVQ acc2, AX
1041        MULQ p256ordK0<>(SB)1083        MULQ p256ordK0<>(SB)
1042        MOVQ AX, t01084        MOVQ AX, t0
10431085
1044        MOVQ p256ord<>+0x00(SB), AX1086        MOVQ p256ord<>+0x00(SB), AX
1045        MULQ t01087        MULQ t0
1046        ADDQ AX, acc21088        ADDQ AX, acc2
1047        ADCQ $0, DX1089        ADCQ $0, DX
1048        MOVQ DX, t11090        MOVQ DX, t1
10491091
1050        MOVQ p256ord<>+0x08(SB), AX1092        MOVQ p256ord<>+0x08(SB), AX
1051        MULQ t01093        MULQ t0
1052        ADDQ t1, acc31094        ADDQ t1, acc3
1053        ADCQ $0, DX1095        ADCQ $0, DX
1054        ADDQ AX, acc31096        ADDQ AX, acc3
1055        ADCQ $0, DX1097        ADCQ $0, DX
1056        MOVQ DX, t11098        MOVQ DX, t1
10571099
1058        MOVQ p256ord<>+0x10(SB), AX1100        MOVQ p256ord<>+0x10(SB), AX
1059        MULQ t01101        MULQ t0
1060        ADDQ t1, acc41102        ADDQ t1, acc4
1061        ADCQ $0, DX1103        ADCQ $0, DX
1062        ADDQ AX, acc41104        ADDQ AX, acc4
1063        ADCQ $0, DX1105        ADCQ $0, DX
1064        MOVQ DX, t11106        MOVQ DX, t1
10651107
1066        MOVQ p256ord<>+0x18(SB), AX1108        MOVQ p256ord<>+0x18(SB), AX
1067        MULQ t01109        MULQ t0
1068        ADDQ t1, acc51110        ADDQ t1, acc5
1069        ADCQ $0, DX1111        ADCQ $0, DX
1070        ADDQ AX, acc51112        ADDQ AX, acc5
1071        ADCQ DX, acc01113        ADCQ DX, acc0
1072        ADCQ $0, acc11114        ADCQ $0, acc1
1115
1073        // x * y[3]1116        // x * y[3]
1074        MOVQ (8*3)(y_ptr), t01117        MOVQ (8*3)(y_ptr), t0
10751118
1076        MOVQ (8*0)(x_ptr), AX1119        MOVQ (8*0)(x_ptr), AX
1077        MULQ t01120        MULQ t0
1078        ADDQ AX, acc31121        ADDQ AX, acc3
1079        ADCQ $0, DX1122        ADCQ $0, DX
1080        MOVQ DX, t11123        MOVQ DX, t1
10811124
1082        MOVQ (8*1)(x_ptr), AX1125        MOVQ (8*1)(x_ptr), AX
1083        MULQ t01126        MULQ t0
1084        ADDQ t1, acc41127        ADDQ t1, acc4
1085        ADCQ $0, DX1128        ADCQ $0, DX
1086        ADDQ AX, acc41129        ADDQ AX, acc4
1087        ADCQ $0, DX1130        ADCQ $0, DX
1088        MOVQ DX, t11131        MOVQ DX, t1
10891132
1090        MOVQ (8*2)(x_ptr), AX1133        MOVQ (8*2)(x_ptr), AX
1091        MULQ t01134        MULQ t0
1092        ADDQ t1, acc51135        ADDQ t1, acc5
1093        ADCQ $0, DX1136        ADCQ $0, DX
1094        ADDQ AX, acc51137        ADDQ AX, acc5
1095        ADCQ $0, DX1138        ADCQ $0, DX
1096        MOVQ DX, t11139        MOVQ DX, t1
10971140
1098        MOVQ (8*3)(x_ptr), AX1141        MOVQ (8*3)(x_ptr), AX
1099        MULQ t01142        MULQ t0
1100        ADDQ t1, acc01143        ADDQ t1, acc0
1101        ADCQ $0, DX1144        ADCQ $0, DX
1102        ADDQ AX, acc01145        ADDQ AX, acc0
1103        ADCQ DX, acc11146        ADCQ DX, acc1
1104        ADCQ $0, acc21147        ADCQ $0, acc2
1148
1105        // Last reduction step1149        // Last reduction step
1106        MOVQ acc3, AX1150        MOVQ acc3, AX
1107        MULQ p256ordK0<>(SB)1151        MULQ p256ordK0<>(SB)
1108        MOVQ AX, t01152        MOVQ AX, t0
11091153
1110        MOVQ p256ord<>+0x00(SB), AX1154        MOVQ p256ord<>+0x00(SB), AX
1111        MULQ t01155        MULQ t0
1112        ADDQ AX, acc31156        ADDQ AX, acc3
1113        ADCQ $0, DX1157        ADCQ $0, DX
1114        MOVQ DX, t11158        MOVQ DX, t1
11151159
1116        MOVQ p256ord<>+0x08(SB), AX1160        MOVQ p256ord<>+0x08(SB), AX
1117        MULQ t01161        MULQ t0
1118        ADDQ t1, acc41162        ADDQ t1, acc4
1119        ADCQ $0, DX1163        ADCQ $0, DX
1120        ADDQ AX, acc41164        ADDQ AX, acc4
1121        ADCQ $0, DX1165        ADCQ $0, DX
1122        MOVQ DX, t11166        MOVQ DX, t1
11231167
1124        MOVQ p256ord<>+0x10(SB), AX1168        MOVQ p256ord<>+0x10(SB), AX
1125        MULQ t01169        MULQ t0
1126        ADDQ t1, acc51170        ADDQ t1, acc5
1127        ADCQ $0, DX1171        ADCQ $0, DX
1128        ADDQ AX, acc51172        ADDQ AX, acc5
1129        ADCQ $0, DX1173        ADCQ $0, DX
1130        MOVQ DX, t11174        MOVQ DX, t1
11311175
1132        MOVQ p256ord<>+0x18(SB), AX1176        MOVQ p256ord<>+0x18(SB), AX
1133        MULQ t01177        MULQ t0
1134        ADDQ t1, acc01178        ADDQ t1, acc0
1135        ADCQ $0, DX1179        ADCQ $0, DX
1136        ADDQ AX, acc01180        ADDQ AX, acc0
1137        ADCQ DX, acc11181        ADCQ DX, acc1
1138        ADCQ $0, acc21182        ADCQ $0, acc2
1183
1139        // Copy result [255:0]1184        // Copy result [255:0]
1140        MOVQ acc4, x_ptr1185        MOVQ acc4, x_ptr
1141        MOVQ acc5, acc31186        MOVQ acc5, acc3
1142        MOVQ acc0, t01187        MOVQ acc0, t0
1143        MOVQ acc1, t11188        MOVQ acc1, t1
1189
1144        // Subtract p2561190        // Subtract p256
1145        SUBQ p256ord<>+0x00(SB), acc41191        SUBQ p256ord<>+0x00(SB), acc4
1146        SBBQ p256ord<>+0x08(SB) ,acc51192        SBBQ p256ord<>+0x08(SB), acc5
1147        SBBQ p256ord<>+0x10(SB), acc01193        SBBQ p256ord<>+0x10(SB), acc0
1148        SBBQ p256ord<>+0x18(SB), acc11194        SBBQ p256ord<>+0x18(SB), acc1
1149        SBBQ $0, acc21195        SBBQ $0, acc2
11501196
1151        CMOVQCS x_ptr, acc41197        CMOVQCS x_ptr, acc4
1152        CMOVQCS acc3, acc51198        CMOVQCS acc3, acc5
1153        CMOVQCS t0, acc01199        CMOVQCS t0, acc0
1154        CMOVQCS t1, acc11200        CMOVQCS t1, acc1
11551201
1156        MOVQ acc4, (8*0)(res_ptr)1202        MOVQ acc4, (8*0)(res_ptr)
1157        MOVQ acc5, (8*1)(res_ptr)1203        MOVQ acc5, (8*1)(res_ptr)
1158        MOVQ acc0, (8*2)(res_ptr)1204        MOVQ acc0, (8*2)(res_ptr)
1159        MOVQ acc1, (8*3)(res_ptr)1205        MOVQ acc1, (8*3)(res_ptr)
11601206
1161        RET1207        RET
1208
1162/* ---------------------------------------*/1209// ---------------------------------------
1163// func p256OrdSqr(res, in []uint64, n int)1210// func p256OrdSqr(res, in []uint64, n int)
1164TEXT ·p256OrdSqr(SB),NOSPLIT,$01211TEXT ·p256OrdSqr(SB), NOSPLIT, $0
1165        MOVQ z+0(FP), res_ptr1212        MOVQ z+0(FP), res_ptr
1166        MOVQ x+24(FP), x_ptr1213        MOVQ x+24(FP), x_ptr
1167        MOVL n+48(FP), BX1214        MOVL n+48(FP), BX
11681215
1169ordSqrLoop:1216ordSqrLoop:
11701217
1171        // y[1:] * y[0]1218        // y[1:] * y[0]
1172        MOVQ (8*0)(x_ptr), t01219        MOVQ (8*0)(x_ptr), t0
11731220
1174        MOVQ (8*1)(x_ptr), AX1221        MOVQ (8*1)(x_ptr), AX
1175        MULQ t01222        MULQ t0
1176        MOVQ AX, acc11223        MOVQ AX, acc1
1177        MOVQ DX, acc21224        MOVQ DX, acc2
11781225
1179        MOVQ (8*2)(x_ptr), AX1226        MOVQ (8*2)(x_ptr), AX
1180        MULQ t01227        MULQ t0
1181        ADDQ AX, acc21228        ADDQ AX, acc2
1182        ADCQ $0, DX1229        ADCQ $0, DX
1183        MOVQ DX, acc31230        MOVQ DX, acc3
11841231
1185        MOVQ (8*3)(x_ptr), AX1232        MOVQ (8*3)(x_ptr), AX
1186        MULQ t01233        MULQ t0
1187        ADDQ AX, acc31234        ADDQ AX, acc3
1188        ADCQ $0, DX1235        ADCQ $0, DX
1189        MOVQ DX, acc41236        MOVQ DX, acc4
1237
1190        // y[2:] * y[1]1238        // y[2:] * y[1]
1191        MOVQ (8*1)(x_ptr), t01239        MOVQ (8*1)(x_ptr), t0
11921240
1193        MOVQ (8*2)(x_ptr), AX1241        MOVQ (8*2)(x_ptr), AX
1194        MULQ t01242        MULQ t0
1195        ADDQ AX, acc31243        ADDQ AX, acc3
1196        ADCQ $0, DX1244        ADCQ $0, DX
1197        MOVQ DX, t11245        MOVQ DX, t1
11981246
1199        MOVQ (8*3)(x_ptr), AX1247        MOVQ (8*3)(x_ptr), AX
1200        MULQ t01248        MULQ t0
1201        ADDQ t1, acc41249        ADDQ t1, acc4
1202        ADCQ $0, DX1250        ADCQ $0, DX
1203        ADDQ AX, acc41251        ADDQ AX, acc4
1204        ADCQ $0, DX1252        ADCQ $0, DX
1205        MOVQ DX, acc51253        MOVQ DX, acc5
1254
1206        // y[3] * y[2]1255        // y[3] * y[2]
1207        MOVQ (8*2)(x_ptr), t01256        MOVQ (8*2)(x_ptr), t0
12081257
1209        MOVQ (8*3)(x_ptr), AX1258        MOVQ (8*3)(x_ptr), AX
1210        MULQ t01259        MULQ t0
1211        ADDQ AX, acc51260        ADDQ AX, acc5
1212        ADCQ $0, DX1261        ADCQ $0, DX
1213        MOVQ DX, y_ptr1262        MOVQ DX, y_ptr
1214        XORQ t1, t11263        XORQ t1, t1
1264
1215        // *21265        // *2
1216        ADDQ acc1, acc11266        ADDQ acc1, acc1
1217        ADCQ acc2, acc21267        ADCQ acc2, acc2
1218        ADCQ acc3, acc31268        ADCQ acc3, acc3
1219        ADCQ acc4, acc41269        ADCQ acc4, acc4
1220        ADCQ acc5, acc51270        ADCQ acc5, acc5
1221        ADCQ y_ptr, y_ptr1271        ADCQ y_ptr, y_ptr
1222        ADCQ $0, t11272        ADCQ $0, t1
1273
1223        // Missing products1274        // Missing products
1224        MOVQ (8*0)(x_ptr), AX1275        MOVQ (8*0)(x_ptr), AX
1225        MULQ AX1276        MULQ AX
1226        MOVQ AX, acc01277        MOVQ AX, acc0
1227        MOVQ DX, t01278        MOVQ DX, t0
12281279
1229        MOVQ (8*1)(x_ptr), AX1280        MOVQ (8*1)(x_ptr), AX
1230        MULQ AX1281        MULQ AX
1231        ADDQ t0, acc11282        ADDQ t0, acc1
1232        ADCQ AX, acc21283        ADCQ AX, acc2
1233        ADCQ $0, DX1284        ADCQ $0, DX
1234        MOVQ DX, t01285        MOVQ DX, t0
12351286
1236        MOVQ (8*2)(x_ptr), AX1287        MOVQ (8*2)(x_ptr), AX
1237        MULQ AX1288        MULQ AX
1238        ADDQ t0, acc31289        ADDQ t0, acc3
1239        ADCQ AX, acc41290        ADCQ AX, acc4
1240        ADCQ $0, DX1291        ADCQ $0, DX
1241        MOVQ DX, t01292        MOVQ DX, t0
12421293
1243        MOVQ (8*3)(x_ptr), AX1294        MOVQ (8*3)(x_ptr), AX
1244        MULQ AX1295        MULQ AX
1245        ADDQ t0, acc51296        ADDQ t0, acc5
1246        ADCQ AX, y_ptr1297        ADCQ AX, y_ptr
1247        ADCQ DX, t11298        ADCQ DX, t1
1248        MOVQ t1, x_ptr1299        MOVQ t1, x_ptr
1300
1249        // First reduction step1301        // First reduction step
1250        MOVQ acc0, AX1302        MOVQ acc0, AX
1251        MULQ p256ordK0<>(SB)1303        MULQ p256ordK0<>(SB)
1252        MOVQ AX, t01304        MOVQ AX, t0
12531305
1254        MOVQ p256ord<>+0x00(SB), AX1306        MOVQ p256ord<>+0x00(SB), AX
1255        MULQ t01307        MULQ t0
1256        ADDQ AX, acc01308        ADDQ AX, acc0
1257        ADCQ $0, DX1309        ADCQ $0, DX
1258        MOVQ DX, t11310        MOVQ DX, t1
12591311
1260        MOVQ p256ord<>+0x08(SB), AX1312        MOVQ p256ord<>+0x08(SB), AX
1261        MULQ t01313        MULQ t0
1262        ADDQ t1, acc11314        ADDQ t1, acc1
1263        ADCQ $0, DX1315        ADCQ $0, DX
1264        ADDQ AX, acc11316        ADDQ AX, acc1
12651317
1266        MOVQ t0, t11318        MOVQ t0, t1
1267        ADCQ DX, acc21319        ADCQ DX, acc2
1268        ADCQ $0, t11320        ADCQ $0, t1
1269        SUBQ t0, acc21321        SUBQ t0, acc2
1270        SBBQ $0, t11322        SBBQ $0, t1
12711323
1272        MOVQ t0, AX1324        MOVQ t0, AX
1273        MOVQ t0, DX1325        MOVQ t0, DX
1274        MOVQ t0, acc01326        MOVQ t0, acc0
1275        SHLQ $32, AX1327        SHLQ $32, AX
1276        SHRQ $32, DX1328        SHRQ $32, DX
12771329
1278        ADDQ t1, acc31330        ADDQ t1, acc3
1279        ADCQ $0, acc01331        ADCQ $0, acc0
1280        SUBQ AX, acc31332        SUBQ AX, acc3
1281        SBBQ DX, acc01333        SBBQ DX, acc0
1334
1282        // Second reduction step1335        // Second reduction step
1283        MOVQ acc1, AX1336        MOVQ acc1, AX
1284        MULQ p256ordK0<>(SB)1337        MULQ p256ordK0<>(SB)
1285        MOVQ AX, t01338        MOVQ AX, t0
12861339
1287        MOVQ p256ord<>+0x00(SB), AX1340        MOVQ p256ord<>+0x00(SB), AX
1288        MULQ t01341        MULQ t0
1289        ADDQ AX, acc11342        ADDQ AX, acc1
1290        ADCQ $0, DX1343        ADCQ $0, DX
1291        MOVQ DX, t11344        MOVQ DX, t1
12921345
1293        MOVQ p256ord<>+0x08(SB), AX1346        MOVQ p256ord<>+0x08(SB), AX
1294        MULQ t01347        MULQ t0
1295        ADDQ t1, acc21348        ADDQ t1, acc2
1296        ADCQ $0, DX1349        ADCQ $0, DX
1297        ADDQ AX, acc21350        ADDQ AX, acc2
12981351
1299        MOVQ t0, t11352        MOVQ t0, t1
1300        ADCQ DX, acc31353        ADCQ DX, acc3
1301        ADCQ $0, t11354        ADCQ $0, t1
1302        SUBQ t0, acc31355        SUBQ t0, acc3
1303        SBBQ $0, t11356        SBBQ $0, t1
13041357
1305        MOVQ t0, AX1358        MOVQ t0, AX
1306        MOVQ t0, DX1359        MOVQ t0, DX
1307        MOVQ t0, acc11360        MOVQ t0, acc1
1308        SHLQ $32, AX1361        SHLQ $32, AX
1309        SHRQ $32, DX1362        SHRQ $32, DX
13101363
1311        ADDQ t1, acc01364        ADDQ t1, acc0
1312        ADCQ $0, acc11365        ADCQ $0, acc1
1313        SUBQ AX, acc01366        SUBQ AX, acc0
1314        SBBQ DX, acc11367        SBBQ DX, acc1
1368
1315        // Third reduction step1369        // Third reduction step
1316        MOVQ acc2, AX1370        MOVQ acc2, AX
1317        MULQ p256ordK0<>(SB)1371        MULQ p256ordK0<>(SB)
1318        MOVQ AX, t01372        MOVQ AX, t0
13191373
1320        MOVQ p256ord<>+0x00(SB), AX1374        MOVQ p256ord<>+0x00(SB), AX
1321        MULQ t01375        MULQ t0
1322        ADDQ AX, acc21376        ADDQ AX, acc2
1323        ADCQ $0, DX1377        ADCQ $0, DX
1324        MOVQ DX, t11378        MOVQ DX, t1
13251379
1326        MOVQ p256ord<>+0x08(SB), AX1380        MOVQ p256ord<>+0x08(SB), AX
1327        MULQ t01381        MULQ t0
1328        ADDQ t1, acc31382        ADDQ t1, acc3
1329        ADCQ $0, DX1383        ADCQ $0, DX
1330        ADDQ AX, acc31384        ADDQ AX, acc3
13311385
1332        MOVQ t0, t11386        MOVQ t0, t1
1333        ADCQ DX, acc01387        ADCQ DX, acc0
1334        ADCQ $0, t11388        ADCQ $0, t1
1335        SUBQ t0, acc01389        SUBQ t0, acc0
1336        SBBQ $0, t11390        SBBQ $0, t1
13371391
1338        MOVQ t0, AX1392        MOVQ t0, AX
1339        MOVQ t0, DX1393        MOVQ t0, DX
1340        MOVQ t0, acc21394        MOVQ t0, acc2
1341        SHLQ $32, AX1395        SHLQ $32, AX
1342        SHRQ $32, DX1396        SHRQ $32, DX
13431397
1344        ADDQ t1, acc11398        ADDQ t1, acc1
1345        ADCQ $0, acc21399        ADCQ $0, acc2
1346        SUBQ AX, acc11400        SUBQ AX, acc1
1347        SBBQ DX, acc21401        SBBQ DX, acc2
1402
1348        // Last reduction step1403        // Last reduction step
1349        MOVQ acc3, AX1404        MOVQ acc3, AX
1350        MULQ p256ordK0<>(SB)1405        MULQ p256ordK0<>(SB)
1351        MOVQ AX, t01406        MOVQ AX, t0
13521407
1353        MOVQ p256ord<>+0x00(SB), AX1408        MOVQ p256ord<>+0x00(SB), AX
1354        MULQ t01409        MULQ t0
1355        ADDQ AX, acc31410        ADDQ AX, acc3
1356        ADCQ $0, DX1411        ADCQ $0, DX
1357        MOVQ DX, t11412        MOVQ DX, t1
13581413
1359        MOVQ p256ord<>+0x08(SB), AX1414        MOVQ p256ord<>+0x08(SB), AX
1360        MULQ t01415        MULQ t0
1361        ADDQ t1, acc01416        ADDQ t1, acc0
1362        ADCQ $0, DX1417        ADCQ $0, DX
1363        ADDQ AX, acc01418        ADDQ AX, acc0
1364        ADCQ $0, DX1419        ADCQ $0, DX
1365        MOVQ DX, t11420        MOVQ DX, t1
13661421
1367        MOVQ t0, t11422        MOVQ t0, t1
1368        ADCQ DX, acc11423        ADCQ DX, acc1
1369        ADCQ $0, t11424        ADCQ $0, t1
1370        SUBQ t0, acc11425        SUBQ t0, acc1
1371        SBBQ $0, t11426        SBBQ $0, t1
13721427
1373        MOVQ t0, AX1428        MOVQ t0, AX
1374        MOVQ t0, DX1429        MOVQ t0, DX
1375        MOVQ t0, acc31430        MOVQ t0, acc3
1376        SHLQ $32, AX1431        SHLQ $32, AX
1377        SHRQ $32, DX1432        SHRQ $32, DX
13781433
1379        ADDQ t1, acc21434        ADDQ t1, acc2
1380        ADCQ $0, acc31435        ADCQ $0, acc3
1381        SUBQ AX, acc21436        SUBQ AX, acc2
1382        SBBQ DX, acc31437        SBBQ DX, acc3
1383        XORQ t0, t01438        XORQ t0, t0
1439
1384        // Add bits [511:256] of the sqr result1440        // Add bits [511:256] of the sqr result
1385        ADCQ acc4, acc01441        ADCQ acc4, acc0
1386        ADCQ acc5, acc11442        ADCQ acc5, acc1
1387        ADCQ y_ptr, acc21443        ADCQ y_ptr, acc2
1388        ADCQ x_ptr, acc31444        ADCQ x_ptr, acc3
1389        ADCQ $0, t01445        ADCQ $0, t0
13901446
1391        MOVQ acc0, acc41447        MOVQ acc0, acc4
1392        MOVQ acc1, acc51448        MOVQ acc1, acc5
1393        MOVQ acc2, y_ptr1449        MOVQ acc2, y_ptr
1394        MOVQ acc3, t11450        MOVQ acc3, t1
1451
1395        // Subtract p2561452        // Subtract p256
1396        SUBQ p256ord<>+0x00(SB), acc01453        SUBQ p256ord<>+0x00(SB), acc0
1397        SBBQ p256ord<>+0x08(SB) ,acc11454        SBBQ p256ord<>+0x08(SB), acc1
1398        SBBQ p256ord<>+0x10(SB), acc21455        SBBQ p256ord<>+0x10(SB), acc2
1399        SBBQ p256ord<>+0x18(SB), acc31456        SBBQ p256ord<>+0x18(SB), acc3
1400        SBBQ $0, t01457        SBBQ $0, t0
14011458
1402        CMOVQCS acc4, acc01459        CMOVQCS acc4, acc0
1403        CMOVQCS acc5, acc11460        CMOVQCS acc5, acc1
1404        CMOVQCS y_ptr, acc21461        CMOVQCS y_ptr, acc2
1405        CMOVQCS t1, acc31462        CMOVQCS t1, acc3
14061463
1407        MOVQ acc0, (8*0)(res_ptr)1464        MOVQ acc0, (8*0)(res_ptr)
1408        MOVQ acc1, (8*1)(res_ptr)1465        MOVQ acc1, (8*1)(res_ptr)
1409        MOVQ acc2, (8*2)(res_ptr)1466        MOVQ acc2, (8*2)(res_ptr)
1410        MOVQ acc3, (8*3)(res_ptr)1467        MOVQ acc3, (8*3)(res_ptr)
1411        MOVQ res_ptr, x_ptr1468        MOVQ res_ptr, x_ptr
1412        DECQ BX1469        DECQ BX
1413        JNE ordSqrLoop1470        JNE  ordSqrLoop
14141471
1415        RET1472        RET
1473
1416/* ---------------------------------------*/1474// ---------------------------------------
1417#undef res_ptr1475#undef res_ptr
1418#undef x_ptr1476#undef x_ptr
1419#undef y_ptr1477#undef y_ptr
14201478
1421#undef acc01479#undef acc0
1422#undef acc11480#undef acc1
1423#undef acc21481#undef acc2
1424#undef acc31482#undef acc3
1425#undef acc41483#undef acc4
1426#undef acc51484#undef acc5
1427#undef t01485#undef t0
1428#undef t11486#undef t1
1429/* ---------------------------------------*/1487// ---------------------------------------
1430#define mul0 AX1488#define mul0 AX
1431#define mul1 DX1489#define mul1 DX
1432#define acc0 BX1490#define acc0 BX
1433#define acc1 CX1491#define acc1 CX
1434#define acc2 R81492#define acc2 R8
1435#define acc3 R91493#define acc3 R9
1436#define acc4 R101494#define acc4 R10
1437#define acc5 R111495#define acc5 R11
1438#define acc6 R121496#define acc6 R12
1439#define acc7 R131497#define acc7 R13
1440#define t0 R141498#define t0 R14
1441#define t1 R151499#define t1 R15
1442#define t2 DI1500#define t2 DI
1443#define t3 SI1501#define t3 SI
1444#define hlp BP1502#define hlp BP
1445/* ---------------------------------------*/1503// ---------------------------------------
1446TEXT p256SubInternal(SB),NOSPLIT,$01504TEXT p256SubInternal(SB), NOSPLIT, $0
1447        XORQ mul0, mul01505        XORQ mul0, mul0
1448        SUBQ t0, acc41506        SUBQ t0, acc4
1449        SBBQ t1, acc51507        SBBQ t1, acc5
1450        SBBQ t2, acc61508        SBBQ t2, acc6
1451        SBBQ t3, acc71509        SBBQ t3, acc7
1452        SBBQ $0, mul01510        SBBQ $0, mul0
14531511
1454        MOVQ acc4, acc01512        MOVQ acc4, acc0
1455        MOVQ acc5, acc11513        MOVQ acc5, acc1
1456        MOVQ acc6, acc21514        MOVQ acc6, acc2
1457        MOVQ acc7, acc31515        MOVQ acc7, acc3
14581516
1459        ADDQ $-1, acc41517        ADDQ $-1, acc4
1460        ADCQ p256const0<>(SB), acc51518        ADCQ p256const0<>(SB), acc5
1461        ADCQ $0, acc61519        ADCQ $0, acc6
1462        ADCQ p256const1<>(SB), acc71520        ADCQ p256const1<>(SB), acc7
1463        ADCQ $0, mul01521        ADCQ $0, mul0
14641522
1465        CMOVQNE acc0, acc41523        CMOVQNE acc0, acc4
1466        CMOVQNE acc1, acc51524        CMOVQNE acc1, acc5
1467        CMOVQNE acc2, acc61525        CMOVQNE acc2, acc6
1468        CMOVQNE acc3, acc71526        CMOVQNE acc3, acc7
14691527
1470        RET1528        RET
1529
1471/* ---------------------------------------*/1530// ---------------------------------------
1472TEXT p256MulInternal(SB),NOSPLIT,$01531TEXT p256MulInternal(SB), NOSPLIT, $0
1473        MOVQ acc4, mul01532        MOVQ acc4, mul0
1474        MULQ t01533        MULQ t0
1475        MOVQ mul0, acc01534        MOVQ mul0, acc0
1476        MOVQ mul1, acc11535        MOVQ mul1, acc1
14771536
1478        MOVQ acc4, mul01537        MOVQ acc4, mul0
1479        MULQ t11538        MULQ t1
1480        ADDQ mul0, acc11539        ADDQ mul0, acc1
1481        ADCQ $0, mul11540        ADCQ $0, mul1
1482        MOVQ mul1, acc21541        MOVQ mul1, acc2
14831542
1484        MOVQ acc4, mul01543        MOVQ acc4, mul0
1485        MULQ t21544        MULQ t2
1486        ADDQ mul0, acc21545        ADDQ mul0, acc2
1487        ADCQ $0, mul11546        ADCQ $0, mul1
1488        MOVQ mul1, acc31547        MOVQ mul1, acc3
14891548
1490        MOVQ acc4, mul01549        MOVQ acc4, mul0
1491        MULQ t31550        MULQ t3
1492        ADDQ mul0, acc31551        ADDQ mul0, acc3
1493        ADCQ $0, mul11552        ADCQ $0, mul1
1494        MOVQ mul1, acc41553        MOVQ mul1, acc4
14951554
1496        MOVQ acc5, mul01555        MOVQ acc5, mul0
1497        MULQ t01556        MULQ t0
1498        ADDQ mul0, acc11557        ADDQ mul0, acc1
1499        ADCQ $0, mul11558        ADCQ $0, mul1
1500        MOVQ mul1, hlp1559        MOVQ mul1, hlp
15011560
1502        MOVQ acc5, mul01561        MOVQ acc5, mul0
1503        MULQ t11562        MULQ t1
1504        ADDQ hlp, acc21563        ADDQ hlp, acc2
1505        ADCQ $0, mul11564        ADCQ $0, mul1
1506        ADDQ mul0, acc21565        ADDQ mul0, acc2
1507        ADCQ $0, mul11566        ADCQ $0, mul1
1508        MOVQ mul1, hlp1567        MOVQ mul1, hlp
15091568
1510        MOVQ acc5, mul01569        MOVQ acc5, mul0
1511        MULQ t21570        MULQ t2
1512        ADDQ hlp, acc31571        ADDQ hlp, acc3
1513        ADCQ $0, mul11572        ADCQ $0, mul1
1514        ADDQ mul0, acc31573        ADDQ mul0, acc3
1515        ADCQ $0, mul11574        ADCQ $0, mul1
1516        MOVQ mul1, hlp1575        MOVQ mul1, hlp
15171576
1518        MOVQ acc5, mul01577        MOVQ acc5, mul0
1519        MULQ t31578        MULQ t3
1520        ADDQ hlp, acc41579        ADDQ hlp, acc4
1521        ADCQ $0, mul11580        ADCQ $0, mul1
1522        ADDQ mul0, acc41581        ADDQ mul0, acc4
1523        ADCQ $0, mul11582        ADCQ $0, mul1
1524        MOVQ mul1, acc51583        MOVQ mul1, acc5
15251584
1526        MOVQ acc6, mul01585        MOVQ acc6, mul0
1527        MULQ t01586        MULQ t0
1528        ADDQ mul0, acc21587        ADDQ mul0, acc2
1529        ADCQ $0, mul11588        ADCQ $0, mul1
1530        MOVQ mul1, hlp1589        MOVQ mul1, hlp
15311590
1532        MOVQ acc6, mul01591        MOVQ acc6, mul0
1533        MULQ t11592        MULQ t1
1534        ADDQ hlp, acc31593        ADDQ hlp, acc3
1535        ADCQ $0, mul11594        ADCQ $0, mul1
1536        ADDQ mul0, acc31595        ADDQ mul0, acc3
1537        ADCQ $0, mul11596        ADCQ $0, mul1
1538        MOVQ mul1, hlp1597        MOVQ mul1, hlp
15391598
1540        MOVQ acc6, mul01599        MOVQ acc6, mul0
1541        MULQ t21600        MULQ t2
1542        ADDQ hlp, acc41601        ADDQ hlp, acc4
1543        ADCQ $0, mul11602        ADCQ $0, mul1
1544        ADDQ mul0, acc41603        ADDQ mul0, acc4
1545        ADCQ $0, mul11604        ADCQ $0, mul1
1546        MOVQ mul1, hlp1605        MOVQ mul1, hlp
15471606
1548        MOVQ acc6, mul01607        MOVQ acc6, mul0
1549        MULQ t31608        MULQ t3
1550        ADDQ hlp, acc51609        ADDQ hlp, acc5
1551        ADCQ $0, mul11610        ADCQ $0, mul1
1552        ADDQ mul0, acc51611        ADDQ mul0, acc5
1553        ADCQ $0, mul11612        ADCQ $0, mul1
1554        MOVQ mul1, acc61613        MOVQ mul1, acc6
15551614
1556        MOVQ acc7, mul01615        MOVQ acc7, mul0
1557        MULQ t01616        MULQ t0
1558        ADDQ mul0, acc31617        ADDQ mul0, acc3
1559        ADCQ $0, mul11618        ADCQ $0, mul1
1560        MOVQ mul1, hlp1619        MOVQ mul1, hlp
15611620
1562        MOVQ acc7, mul01621        MOVQ acc7, mul0
1563        MULQ t11622        MULQ t1
1564        ADDQ hlp, acc41623        ADDQ hlp, acc4
1565        ADCQ $0, mul11624        ADCQ $0, mul1
1566        ADDQ mul0, acc41625        ADDQ mul0, acc4
1567        ADCQ $0, mul11626        ADCQ $0, mul1
1568        MOVQ mul1, hlp1627        MOVQ mul1, hlp
15691628
1570        MOVQ acc7, mul01629        MOVQ acc7, mul0
1571        MULQ t21630        MULQ t2
1572        ADDQ hlp, acc51631        ADDQ hlp, acc5
1573        ADCQ $0, mul11632        ADCQ $0, mul1
1574        ADDQ mul0, acc51633        ADDQ mul0, acc5
1575        ADCQ $0, mul11634        ADCQ $0, mul1
1576        MOVQ mul1, hlp1635        MOVQ mul1, hlp
15771636
1578        MOVQ acc7, mul01637        MOVQ acc7, mul0
1579        MULQ t31638        MULQ t3
1580        ADDQ hlp, acc61639        ADDQ hlp, acc6
1581        ADCQ $0, mul11640        ADCQ $0, mul1
1582        ADDQ mul0, acc61641        ADDQ mul0, acc6
1583        ADCQ $0, mul11642        ADCQ $0, mul1
1584        MOVQ mul1, acc71643        MOVQ mul1, acc7
1644
1585        // First reduction step1645        // First reduction step
1586        MOVQ acc0, mul01646        MOVQ acc0, mul0
1587        MOVQ acc0, hlp1647        MOVQ acc0, hlp
1588        SHLQ $32, acc01648        SHLQ $32, acc0
1589        MULQ p256const1<>(SB)1649        MULQ p256const1<>(SB)
1590        SHRQ $32, hlp1650        SHRQ $32, hlp
1591        ADDQ acc0, acc11651        ADDQ acc0, acc1
1592        ADCQ hlp, acc21652        ADCQ hlp, acc2
1593        ADCQ mul0, acc31653        ADCQ mul0, acc3
1594        ADCQ $0, mul11654        ADCQ $0, mul1
1595        MOVQ mul1, acc01655        MOVQ mul1, acc0
1656
1596        // Second reduction step1657        // Second reduction step
1597        MOVQ acc1, mul01658        MOVQ acc1, mul0
1598        MOVQ acc1, hlp1659        MOVQ acc1, hlp
1599        SHLQ $32, acc11660        SHLQ $32, acc1
1600        MULQ p256const1<>(SB)1661        MULQ p256const1<>(SB)
1601        SHRQ $32, hlp1662        SHRQ $32, hlp
1602        ADDQ acc1, acc21663        ADDQ acc1, acc2
1603        ADCQ hlp, acc31664        ADCQ hlp, acc3
1604        ADCQ mul0, acc01665        ADCQ mul0, acc0
1605        ADCQ $0, mul11666        ADCQ $0, mul1
1606        MOVQ mul1, acc11667        MOVQ mul1, acc1
1668
1607        // Third reduction step1669        // Third reduction step
1608        MOVQ acc2, mul01670        MOVQ acc2, mul0
1609        MOVQ acc2, hlp1671        MOVQ acc2, hlp
1610        SHLQ $32, acc21672        SHLQ $32, acc2
1611        MULQ p256const1<>(SB)1673        MULQ p256const1<>(SB)
1612        SHRQ $32, hlp1674        SHRQ $32, hlp
1613        ADDQ acc2, acc31675        ADDQ acc2, acc3
1614        ADCQ hlp, acc01676        ADCQ hlp, acc0
1615        ADCQ mul0, acc11677        ADCQ mul0, acc1
1616        ADCQ $0, mul11678        ADCQ $0, mul1
1617        MOVQ mul1, acc21679        MOVQ mul1, acc2
1680
1618        // Last reduction step1681        // Last reduction step
1619        MOVQ acc3, mul01682        MOVQ acc3, mul0
1620        MOVQ acc3, hlp1683        MOVQ acc3, hlp
1621        SHLQ $32, acc31684        SHLQ $32, acc3
1622        MULQ p256const1<>(SB)1685        MULQ p256const1<>(SB)
1623        SHRQ $32, hlp1686        SHRQ $32, hlp
1624        ADDQ acc3, acc01687        ADDQ acc3, acc0
1625        ADCQ hlp, acc11688        ADCQ hlp, acc1
1626        ADCQ mul0, acc21689        ADCQ mul0, acc2
1627        ADCQ $0, mul11690        ADCQ $0, mul1
1628        MOVQ mul1, acc31691        MOVQ mul1, acc3
1629        BYTE $0x48; BYTE $0xc7; BYTE $0xc5; BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00   // MOVQ $0, BP1692        BYTE $0x48; BYTE $0xc7; BYTE $0xc5; BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00 // MOVQ $0, BP
1693
1630        // Add bits [511:256] of the result1694        // Add bits [511:256] of the result
1631        ADCQ acc0, acc41695        ADCQ acc0, acc4
1632        ADCQ acc1, acc51696        ADCQ acc1, acc5
1633        ADCQ acc2, acc61697        ADCQ acc2, acc6
1634        ADCQ acc3, acc71698        ADCQ acc3, acc7
1635        ADCQ $0, hlp1699        ADCQ $0, hlp
1700
1636        // Copy result1701        // Copy result
1637        MOVQ acc4, acc01702        MOVQ acc4, acc0
1638        MOVQ acc5, acc11703        MOVQ acc5, acc1
1639        MOVQ acc6, acc21704        MOVQ acc6, acc2
1640        MOVQ acc7, acc31705        MOVQ acc7, acc3
1706
1641        // Subtract p2561707        // Subtract p256
1642        SUBQ $-1, acc41708        SUBQ $-1, acc4
1643        SBBQ p256const0<>(SB) ,acc51709        SBBQ p256const0<>(SB), acc5
1644        SBBQ $0, acc61710        SBBQ $0, acc6
1645        SBBQ p256const1<>(SB), acc71711        SBBQ p256const1<>(SB), acc7
1646        SBBQ $0, hlp1712        SBBQ $0, hlp
1713
1647        // If the result of the subtraction is negative, restore the previous result1714        // If the result of the subtraction is negative, restore the previous result
1648        CMOVQCS acc0, acc41715        CMOVQCS acc0, acc4
1649        CMOVQCS acc1, acc51716        CMOVQCS acc1, acc5
1650        CMOVQCS acc2, acc61717        CMOVQCS acc2, acc6
1651        CMOVQCS acc3, acc71718        CMOVQCS acc3, acc7
16521719
1653        RET1720        RET
1721
1654/* ---------------------------------------*/1722// ---------------------------------------
1655TEXT p256SqrInternal(SB),NOSPLIT,$01723TEXT p256SqrInternal(SB), NOSPLIT, $0
16561724
1657        MOVQ acc4, mul01725        MOVQ acc4, mul0
1658        MULQ acc51726        MULQ acc5
1659        MOVQ mul0, acc11727        MOVQ mul0, acc1
1660        MOVQ mul1, acc21728        MOVQ mul1, acc2
16611729
1662        MOVQ acc4, mul01730        MOVQ acc4, mul0
1663        MULQ acc61731        MULQ acc6
1664        ADDQ mul0, acc21732        ADDQ mul0, acc2
1665        ADCQ $0, mul11733        ADCQ $0, mul1
1666        MOVQ mul1, acc31734        MOVQ mul1, acc3
16671735
1668        MOVQ acc4, mul01736        MOVQ acc4, mul0
1669        MULQ acc71737        MULQ acc7
1670        ADDQ mul0, acc31738        ADDQ mul0, acc3
1671        ADCQ $0, mul11739        ADCQ $0, mul1
1672        MOVQ mul1, t01740        MOVQ mul1, t0
16731741
1674        MOVQ acc5, mul01742        MOVQ acc5, mul0
1675        MULQ acc61743        MULQ acc6
1676        ADDQ mul0, acc31744        ADDQ mul0, acc3
1677        ADCQ $0, mul11745        ADCQ $0, mul1
1678        MOVQ mul1, hlp1746        MOVQ mul1, hlp
16791747
1680        MOVQ acc5, mul01748        MOVQ acc5, mul0
1681        MULQ acc71749        MULQ acc7
1682        ADDQ hlp, t01750        ADDQ hlp, t0
1683        ADCQ $0, mul11751        ADCQ $0, mul1
1684        ADDQ mul0, t01752        ADDQ mul0, t0
1685        ADCQ $0, mul11753        ADCQ $0, mul1
1686        MOVQ mul1, t11754        MOVQ mul1, t1
16871755
1688        MOVQ acc6, mul01756        MOVQ acc6, mul0
1689        MULQ acc71757        MULQ acc7
1690        ADDQ mul0, t11758        ADDQ mul0, t1
1691        ADCQ $0, mul11759        ADCQ $0, mul1
1692        MOVQ mul1, t21760        MOVQ mul1, t2
1693        XORQ t3, t31761        XORQ t3, t3
1762
1694        // *21763        // *2
1695        ADDQ acc1, acc11764        ADDQ acc1, acc1
1696        ADCQ acc2, acc21765        ADCQ acc2, acc2
1697        ADCQ acc3, acc31766        ADCQ acc3, acc3
1698        ADCQ t0, t01767        ADCQ t0, t0
1699        ADCQ t1, t11768        ADCQ t1, t1
1700        ADCQ t2, t21769        ADCQ t2, t2
1701        ADCQ $0, t31770        ADCQ $0, t3
1771
1702        // Missing products1772        // Missing products
1703        MOVQ acc4, mul01773        MOVQ acc4, mul0
1704        MULQ mul01774        MULQ mul0
1705        MOVQ mul0, acc01775        MOVQ mul0, acc0
1706        MOVQ DX, acc41776        MOVQ DX, acc4
17071777
1708        MOVQ acc5, mul01778        MOVQ acc5, mul0
1709        MULQ mul01779        MULQ mul0
1710        ADDQ acc4, acc11780        ADDQ acc4, acc1
1711        ADCQ mul0, acc21781        ADCQ mul0, acc2
1712        ADCQ $0, DX1782        ADCQ $0, DX
1713        MOVQ DX, acc41783        MOVQ DX, acc4
17141784
1715        MOVQ acc6, mul01785        MOVQ acc6, mul0
1716        MULQ mul01786        MULQ mul0
1717        ADDQ acc4, acc31787        ADDQ acc4, acc3
1718        ADCQ mul0, t01788        ADCQ mul0, t0
1719        ADCQ $0, DX1789        ADCQ $0, DX
1720        MOVQ DX, acc41790        MOVQ DX, acc4
17211791
1722        MOVQ acc7, mul01792        MOVQ acc7, mul0
1723        MULQ mul01793        MULQ mul0
1724        ADDQ acc4, t11794        ADDQ acc4, t1
1725        ADCQ mul0, t21795        ADCQ mul0, t2
1726        ADCQ DX, t31796        ADCQ DX, t3
1797
1727        // First reduction step1798        // First reduction step
1728        MOVQ acc0, mul01799        MOVQ acc0, mul0
1729        MOVQ acc0, hlp1800        MOVQ acc0, hlp
1730        SHLQ $32, acc01801        SHLQ $32, acc0
1731        MULQ p256const1<>(SB)1802        MULQ p256const1<>(SB)
1732        SHRQ $32, hlp1803        SHRQ $32, hlp
1733        ADDQ acc0, acc11804        ADDQ acc0, acc1
1734        ADCQ hlp, acc21805        ADCQ hlp, acc2
1735        ADCQ mul0, acc31806        ADCQ mul0, acc3
1736        ADCQ $0, mul11807        ADCQ $0, mul1
1737        MOVQ mul1, acc01808        MOVQ mul1, acc0
1809
1738        // Second reduction step1810        // Second reduction step
1739        MOVQ acc1, mul01811        MOVQ acc1, mul0
1740        MOVQ acc1, hlp1812        MOVQ acc1, hlp
1741        SHLQ $32, acc11813        SHLQ $32, acc1
1742        MULQ p256const1<>(SB)1814        MULQ p256const1<>(SB)
1743        SHRQ $32, hlp1815        SHRQ $32, hlp
1744        ADDQ acc1, acc21816        ADDQ acc1, acc2
1745        ADCQ hlp, acc31817        ADCQ hlp, acc3
1746        ADCQ mul0, acc01818        ADCQ mul0, acc0
1747        ADCQ $0, mul11819        ADCQ $0, mul1
1748        MOVQ mul1, acc11820        MOVQ mul1, acc1
1821
1749        // Third reduction step1822        // Third reduction step
1750        MOVQ acc2, mul01823        MOVQ acc2, mul0
1751        MOVQ acc2, hlp1824        MOVQ acc2, hlp
1752        SHLQ $32, acc21825        SHLQ $32, acc2
1753        MULQ p256const1<>(SB)1826        MULQ p256const1<>(SB)
1754        SHRQ $32, hlp1827        SHRQ $32, hlp
1755        ADDQ acc2, acc31828        ADDQ acc2, acc3
1756        ADCQ hlp, acc01829        ADCQ hlp, acc0
1757        ADCQ mul0, acc11830        ADCQ mul0, acc1
1758        ADCQ $0, mul11831        ADCQ $0, mul1
1759        MOVQ mul1, acc21832        MOVQ mul1, acc2
1833
1760        // Last reduction step1834        // Last reduction step
1761        MOVQ acc3, mul01835        MOVQ acc3, mul0
1762        MOVQ acc3, hlp1836        MOVQ acc3, hlp
1763        SHLQ $32, acc31837        SHLQ $32, acc3
1764        MULQ p256const1<>(SB)1838        MULQ p256const1<>(SB)
1765        SHRQ $32, hlp1839        SHRQ $32, hlp
1766        ADDQ acc3, acc01840        ADDQ acc3, acc0
1767        ADCQ hlp, acc11841        ADCQ hlp, acc1
1768        ADCQ mul0, acc21842        ADCQ mul0, acc2
1769        ADCQ $0, mul11843        ADCQ $0, mul1
1770        MOVQ mul1, acc31844        MOVQ mul1, acc3
1771        BYTE $0x48; BYTE $0xc7; BYTE $0xc5; BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00   // MOVQ $0, BP1845        BYTE $0x48; BYTE $0xc7; BYTE $0xc5; BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00 // MOVQ $0, BP
1846
1772        // Add bits [511:256] of the result1847        // Add bits [511:256] of the result
1773        ADCQ acc0, t01848        ADCQ acc0, t0
1774        ADCQ acc1, t11849        ADCQ acc1, t1
1775        ADCQ acc2, t21850        ADCQ acc2, t2
1776        ADCQ acc3, t31851        ADCQ acc3, t3
1777        ADCQ $0, hlp1852        ADCQ $0, hlp
1853
1778        // Copy result1854        // Copy result
1779        MOVQ t0, acc41855        MOVQ t0, acc4
1780        MOVQ t1, acc51856        MOVQ t1, acc5
1781        MOVQ t2, acc61857        MOVQ t2, acc6
1782        MOVQ t3, acc71858        MOVQ t3, acc7
1859
1783        // Subtract p2561860        // Subtract p256
1784        SUBQ $-1, acc41861        SUBQ $-1, acc4
1785        SBBQ p256const0<>(SB) ,acc51862        SBBQ p256const0<>(SB), acc5
1786        SBBQ $0, acc61863        SBBQ $0, acc6
1787        SBBQ p256const1<>(SB), acc71864        SBBQ p256const1<>(SB), acc7
1788        SBBQ $0, hlp1865        SBBQ $0, hlp
1866
1789        // If the result of the subtraction is negative, restore the previous result1867        // If the result of the subtraction is negative, restore the previous result
1790        CMOVQCS t0, acc41868        CMOVQCS t0, acc4
1791        CMOVQCS t1, acc51869        CMOVQCS t1, acc5
1792        CMOVQCS t2, acc61870        CMOVQCS t2, acc6
1793        CMOVQCS t3, acc71871        CMOVQCS t3, acc7
17941872
1795        RET1873        RET
1874
1796/* ---------------------------------------*/1875// ---------------------------------------
1797#define p256MulBy2Inline\1876#define p256MulBy2Inline \
1798        XORQ mul0, mul0;\1877        XORQ    mul0, mul0;           \
1799        ADDQ acc4, acc4;\1878        ADDQ    acc4, acc4;           \
1800        ADCQ acc5, acc5;\1879        ADCQ    acc5, acc5;           \
1801        ADCQ acc6, acc6;\1880        ADCQ    acc6, acc6;           \
1802        ADCQ acc7, acc7;\1881        ADCQ    acc7, acc7;           \
1803        ADCQ $0, mul0;\1882        ADCQ    $0, mul0;             \
1804        MOVQ acc4, t0;\1883        MOVQ    acc4, t0;             \
1805        MOVQ acc5, t1;\1884        MOVQ    acc5, t1;             \
1806        MOVQ acc6, t2;\1885        MOVQ    acc6, t2;             \
1807        MOVQ acc7, t3;\1886        MOVQ    acc7, t3;             \
1808        SUBQ $-1, t0;\1887        SUBQ    $-1, t0;              \
1809        SBBQ p256const0<>(SB), t1;\1888        SBBQ    p256const0<>(SB), t1; \
1810        SBBQ $0, t2;\1889        SBBQ    $0, t2;               \
1811        SBBQ p256const1<>(SB), t3;\1890        SBBQ    p256const1<>(SB), t3; \
1812        SBBQ $0, mul0;\1891        SBBQ    $0, mul0;             \
1813        CMOVQCS acc4, t0;\1892        CMOVQCS acc4, t0;             \
1814        CMOVQCS acc5, t1;\1893        CMOVQCS acc5, t1;             \
1815        CMOVQCS acc6, t2;\1894        CMOVQCS acc6, t2;             \
1816        CMOVQCS acc7, t3;1895        CMOVQCS acc7, t3
1896
1817/* ---------------------------------------*/1897// ---------------------------------------
1818#define p256AddInline \1898#define p256AddInline \
1819        XORQ mul0, mul0;\1899        XORQ    mul0, mul0;           \
1820        ADDQ t0, acc4;\1900        ADDQ    t0, acc4;             \
1821        ADCQ t1, acc5;\1901        ADCQ    t1, acc5;             \
1822        ADCQ t2, acc6;\1902        ADCQ    t2, acc6;             \
1823        ADCQ t3, acc7;\1903        ADCQ    t3, acc7;             \
1824        ADCQ $0, mul0;\1904        ADCQ    $0, mul0;             \
1825        MOVQ acc4, t0;\1905        MOVQ    acc4, t0;             \
1826        MOVQ acc5, t1;\1906        MOVQ    acc5, t1;             \
1827        MOVQ acc6, t2;\1907        MOVQ    acc6, t2;             \
1828        MOVQ acc7, t3;\1908        MOVQ    acc7, t3;             \
1829        SUBQ $-1, t0;\1909        SUBQ    $-1, t0;              \
1830        SBBQ p256const0<>(SB), t1;\1910        SBBQ    p256const0<>(SB), t1; \
1831        SBBQ $0, t2;\1911        SBBQ    $0, t2;               \
1832        SBBQ p256const1<>(SB), t3;\1912        SBBQ    p256const1<>(SB), t3; \
1833        SBBQ $0, mul0;\1913        SBBQ    $0, mul0;             \
1834        CMOVQCS acc4, t0;\1914        CMOVQCS acc4, t0;             \
1835        CMOVQCS acc5, t1;\1915        CMOVQCS acc5, t1;             \
1836        CMOVQCS acc6, t2;\1916        CMOVQCS acc6, t2;             \
1837        CMOVQCS acc7, t3;1917        CMOVQCS acc7, t3
1918
1838/* ---------------------------------------*/1919// ---------------------------------------
1839#define LDacc(src) MOVQ src(8*0), acc4; MOVQ src(8*1), acc5; MOVQ src(8*2), acc6; MOVQ src(8*3), acc71920#define LDacc(src) MOVQ src(8*0), acc4; MOVQ src(8*1), acc5; MOVQ src(8*2), acc6; MOVQ src(8*3), acc7
1840#define LDt(src)   MOVQ src(8*0), t0; MOVQ src(8*1), t1; MOVQ src(8*2), t2; MOVQ src(8*3), t31921#define LDt(src)   MOVQ src(8*0), t0; MOVQ src(8*1), t1; MOVQ src(8*2), t2; MOVQ src(8*3), t3
1841#define ST(dst)        MOVQ acc4, dst(8*0); MOVQ acc5, dst(8*1); MOVQ acc6, dst(8*2); MOVQ acc7, dst(8*3)1922#define ST(dst)        MOVQ acc4, dst(8*0); MOVQ acc5, dst(8*1); MOVQ acc6, dst(8*2); MOVQ acc7, dst(8*3)
1842#define STt(dst)   MOVQ t0, dst(8*0); MOVQ t1, dst(8*1); MOVQ t2, dst(8*2); MOVQ t3, dst(8*3)1923#define STt(dst)   MOVQ t0, dst(8*0); MOVQ t1, dst(8*1); MOVQ t2, dst(8*2); MOVQ t3, dst(8*3)
1843#define acc2t          MOVQ acc4, t0; MOVQ acc5, t1; MOVQ acc6, t2; MOVQ acc7, t31924#define acc2t          MOVQ acc4, t0; MOVQ acc5, t1; MOVQ acc6, t2; MOVQ acc7, t3
1844#define t2acc          MOVQ t0, acc4; MOVQ t1, acc5; MOVQ t2, acc6; MOVQ t3, acc71925#define t2acc          MOVQ t0, acc4; MOVQ t1, acc5; MOVQ t2, acc6; MOVQ t3, acc7
1845/* ---------------------------------------*/1926// ---------------------------------------
1846#define x1in(off) (32*0 + off)(SP)1927#define x1in(off) (32*0 + off)(SP)
1847#define y1in(off) (32*1 + off)(SP)1928#define y1in(off) (32*1 + off)(SP)
1848#define z1in(off) (32*2 + off)(SP)1929#define z1in(off) (32*2 + off)(SP)
1849#define x2in(off) (32*3 + off)(SP)1930#define x2in(off) (32*3 + off)(SP)
1850#define y2in(off) (32*4 + off)(SP)1931#define y2in(off) (32*4 + off)(SP)
1851#define xout(off) (32*5 + off)(SP)1932#define xout(off) (32*5 + off)(SP)
1852#define yout(off) (32*6 + off)(SP)1933#define yout(off) (32*6 + off)(SP)
1853#define zout(off) (32*7 + off)(SP)1934#define zout(off) (32*7 + off)(SP)
1854#define s2(off)   (32*8 + off)(SP)1935#define s2(off)   (32*8 + off)(SP)
1855#define z1sqr(off) (32*9 + off)(SP)1936#define z1sqr(off) (32*9 + off)(SP)
1856#define h(off)        (32*10 + off)(SP)1937#define h(off)        (32*10 + off)(SP)
1857#define r(off)        (32*11 + off)(SP)1938#define r(off)        (32*11 + off)(SP)
1858#define hsqr(off) (32*12 + off)(SP)1939#define hsqr(off) (32*12 + off)(SP)
1859#define rsqr(off) (32*13 + off)(SP)1940#define rsqr(off) (32*13 + off)(SP)
1860#define hcub(off) (32*14 + off)(SP)1941#define hcub(off) (32*14 + off)(SP)
1861#define rptr          (32*15)(SP)1942#define rptr          (32*15)(SP)
1862#define sel_save  (32*15 + 8)(SP)1943#define sel_save  (32*15 + 8)(SP)
1863#define zero_save (32*15 + 8 + 4)(SP)1944#define zero_save (32*15 + 8 + 4)(SP)
18641945
1865// func p256PointAddAffineAsm(res, in1, in2 []uint64, sign, sel, zero int)1946// func p256PointAddAffineAsm(res, in1, in2 []uint64, sign, sel, zero int)
1866TEXT ·p256PointAddAffineAsm(SB),0,$512-961947TEXT ·p256PointAddAffineAsm(SB), 0, $512-96
1867        // Move input to stack in order to free registers1948        // Move input to stack in order to free registers
1868        MOVQ res+0(FP), AX1949        MOVQ res+0(FP), AX
1869        MOVQ in1+24(FP), BX1950        MOVQ in1+24(FP), BX
1870        MOVQ in2+48(FP), CX1951        MOVQ in2+48(FP), CX
1871        MOVQ sign+72(FP), DX1952        MOVQ sign+72(FP), DX
1872        MOVQ sel+80(FP), t11953        MOVQ sel+80(FP), t1
1873        MOVQ zero+88(FP), t21954        MOVQ zero+88(FP), t2
18741955
1875        MOVOU (16*0)(BX), X01956        MOVOU (16*0)(BX), X0
1876        MOVOU (16*1)(BX), X11957        MOVOU (16*1)(BX), X1
1877        MOVOU (16*2)(BX), X21958        MOVOU (16*2)(BX), X2
1878        MOVOU (16*3)(BX), X31959        MOVOU (16*3)(BX), X3
1879        MOVOU (16*4)(BX), X41960        MOVOU (16*4)(BX), X4
1880        MOVOU (16*5)(BX), X51961        MOVOU (16*5)(BX), X5
18811962
1882        MOVOU X0, x1in(16*0)1963        MOVOU X0, x1in(16*0)
1883        MOVOU X1, x1in(16*1)1964        MOVOU X1, x1in(16*1)
1884        MOVOU X2, y1in(16*0)1965        MOVOU X2, y1in(16*0)
1885        MOVOU X3, y1in(16*1)1966        MOVOU X3, y1in(16*1)
1886        MOVOU X4, z1in(16*0)1967        MOVOU X4, z1in(16*0)
1887        MOVOU X5, z1in(16*1)1968        MOVOU X5, z1in(16*1)
18881969
1889        MOVOU (16*0)(CX), X01970        MOVOU (16*0)(CX), X0
1890        MOVOU (16*1)(CX), X11971        MOVOU (16*1)(CX), X1
18911972
1892        MOVOU X0, x2in(16*0)1973        MOVOU X0, x2in(16*0)
1893        MOVOU X1, x2in(16*1)1974        MOVOU X1, x2in(16*1)
1975
1894        // Store pointer to result1976        // Store pointer to result
1895        MOVQ mul0, rptr1977        MOVQ mul0, rptr
1896        MOVL t1, sel_save1978        MOVL t1, sel_save
1897        MOVL t2, zero_save1979        MOVL t2, zero_save
1980
1898        // Negate y2in based on sign1981        // Negate y2in based on sign
1899        MOVQ (16*2 + 8*0)(CX), acc41982        MOVQ (16*2 + 8*0)(CX), acc4
1900        MOVQ (16*2 + 8*1)(CX), acc51983        MOVQ (16*2 + 8*1)(CX), acc5
1901        MOVQ (16*2 + 8*2)(CX), acc61984        MOVQ (16*2 + 8*2)(CX), acc6
1902        MOVQ (16*2 + 8*3)(CX), acc71985        MOVQ (16*2 + 8*3)(CX), acc7
1903        MOVQ $-1, acc01986        MOVQ $-1, acc0
1904        MOVQ p256const0<>(SB), acc11987        MOVQ p256const0<>(SB), acc1
1905        MOVQ $0, acc21988        MOVQ $0, acc2
1906        MOVQ p256const1<>(SB), acc31989        MOVQ p256const1<>(SB), acc3
1907        XORQ mul0, mul01990        XORQ mul0, mul0
1991
1908        // Speculatively subtract1992        // Speculatively subtract
1909        SUBQ acc4, acc01993        SUBQ acc4, acc0
1910        SBBQ acc5, acc11994        SBBQ acc5, acc1
1911        SBBQ acc6, acc21995        SBBQ acc6, acc2
1912        SBBQ acc7, acc31996        SBBQ acc7, acc3
1913        SBBQ $0, mul01997        SBBQ $0, mul0
1914        MOVQ acc0, t01998        MOVQ acc0, t0
1915        MOVQ acc1, t11999        MOVQ acc1, t1
1916        MOVQ acc2, t22000        MOVQ acc2, t2
1917        MOVQ acc3, t32001        MOVQ acc3, t3
2002
1918        // Add in case the operand was > p2562003        // Add in case the operand was > p256
1919        ADDQ $-1, acc02004        ADDQ    $-1, acc0
1920        ADCQ p256const0<>(SB), acc12005        ADCQ    p256const0<>(SB), acc1
1921        ADCQ $0, acc22006        ADCQ    $0, acc2
1922        ADCQ p256const1<>(SB), acc32007        ADCQ    p256const1<>(SB), acc3
1923        ADCQ $0, mul02008        ADCQ    $0, mul0
1924        CMOVQNE t0, acc02009        CMOVQNE t0, acc0
1925        CMOVQNE t1, acc12010        CMOVQNE t1, acc1
1926        CMOVQNE t2, acc22011        CMOVQNE t2, acc2
1927        CMOVQNE t3, acc32012        CMOVQNE t3, acc3
2013
1928        // If condition is 0, keep original value2014        // If condition is 0, keep original value
1929        TESTQ DX, DX2015        TESTQ   DX, DX
1930        CMOVQEQ acc4, acc02016        CMOVQEQ acc4, acc0
1931        CMOVQEQ acc5, acc12017        CMOVQEQ acc5, acc1
1932        CMOVQEQ acc6, acc22018        CMOVQEQ acc6, acc2
1933        CMOVQEQ acc7, acc32019        CMOVQEQ acc7, acc3
2020
1934        // Store result2021        // Store result
1935        MOVQ acc0, y2in(8*0)2022        MOVQ acc0, y2in(8*0)
1936        MOVQ acc1, y2in(8*1)2023        MOVQ acc1, y2in(8*1)
1937        MOVQ acc2, y2in(8*2)2024        MOVQ acc2, y2in(8*2)
1938        MOVQ acc3, y2in(8*3)2025        MOVQ acc3, y2in(8*3)
2026
1939        // Begin point add2027        // Begin point add
1940        LDacc (z1in)2028        LDacc (z1in)
1941        CALL p256SqrInternal(SB)        // z1ˆ22029        CALL p256SqrInternal(SB) // z1ˆ2
1942        ST (z1sqr)2030        ST (z1sqr)
19432031
1944        LDt (x2in)2032        LDt (x2in)
1945        CALL p256MulInternal(SB)        // x2 * z1ˆ22033        CALL p256MulInternal(SB) // x2 * z1ˆ2
19462034
1947        LDt (x1in)2035        LDt (x1in)
1948        CALL p256SubInternal(SB)        // h = u2 - u12036        CALL p256SubInternal(SB) // h = u2 - u1
1949        ST (h)2037        ST (h)
19502038
1951        LDt (z1in)2039        LDt (z1in)
1952        CALL p256MulInternal(SB)        // z3 = h * z12040        CALL p256MulInternal(SB) // z3 = h * z1
1953        ST (zout)2041        ST (zout)
19542042
1955        LDacc (z1sqr)2043        LDacc (z1sqr)
1956        CALL p256MulInternal(SB)        // z1ˆ32044        CALL p256MulInternal(SB) // z1ˆ3
19572045
1958        LDt (y2in)2046        LDt (y2in)
1959        CALL p256MulInternal(SB)        // s2 = y2 * z1ˆ32047        CALL p256MulInternal(SB) // s2 = y2 * z1ˆ3
1960        ST (s2)2048        ST (s2)
19612049
1962        LDt (y1in)2050        LDt (y1in)
1963        CALL p256SubInternal(SB)        // r = s2 - s12051        CALL p256SubInternal(SB) // r = s2 - s1
1964        ST (r)2052        ST (r)
19652053
1966        CALL p256SqrInternal(SB)        // rsqr = rˆ22054        CALL p256SqrInternal(SB) // rsqr = rˆ2
1967        ST (rsqr)2055        ST (rsqr)
19682056
1969        LDacc (h)2057        LDacc (h)
1970        CALL p256SqrInternal(SB)        // hsqr = hˆ22058        CALL p256SqrInternal(SB) // hsqr = hˆ2
1971        ST (hsqr)2059        ST (hsqr)
19722060
1973        LDt (h)2061        LDt (h)
1974        CALL p256MulInternal(SB)        // hcub = hˆ32062        CALL p256MulInternal(SB) // hcub = hˆ3
1975        ST (hcub)2063        ST (hcub)
19762064
1977        LDt (y1in)2065        LDt (y1in)
1978        CALL p256MulInternal(SB)        // y1 * hˆ32066        CALL p256MulInternal(SB) // y1 * hˆ3
1979        ST (s2)2067        ST (s2)
19802068
1981        LDacc (x1in)2069        LDacc (x1in)
1982        LDt (hsqr)2070        LDt (hsqr)
1983        CALL p256MulInternal(SB)        // u1 * hˆ22071        CALL p256MulInternal(SB) // u1 * hˆ2
1984        ST (h)2072        ST (h)
19852073
1986        p256MulBy2Inline                        // u1 * hˆ2 * 2, inline2074        p256MulBy2Inline         // u1 * hˆ2 * 2, inline
1987        LDacc (rsqr)2075        LDacc (rsqr)
1988        CALL p256SubInternal(SB)        // rˆ2 - u1 * hˆ2 * 22076        CALL p256SubInternal(SB) // rˆ2 - u1 * hˆ2 * 2
19892077
1990        LDt (hcub)2078        LDt (hcub)
1991        CALL p256SubInternal(SB)2079        CALL p256SubInternal(SB)
1992        ST (xout)2080        ST (xout)
19932081
1994        MOVQ acc4, t02082        MOVQ acc4, t0
1995        MOVQ acc5, t12083        MOVQ acc5, t1
1996        MOVQ acc6, t22084        MOVQ acc6, t2
1997        MOVQ acc7, t32085        MOVQ acc7, t3
1998        LDacc (h)2086        LDacc (h)
1999        CALL p256SubInternal(SB)2087        CALL p256SubInternal(SB)
20002088
2001        LDt (r)2089        LDt (r)
2002        CALL p256MulInternal(SB)2090        CALL p256MulInternal(SB)
20032091
2004        LDt (s2)2092        LDt (s2)
2005        CALL p256SubInternal(SB)2093        CALL p256SubInternal(SB)
2006        ST (yout)2094        ST (yout)
2095
2007        // Load stored values from stack2096        // Load stored values from stack
2008        MOVQ rptr, AX2097        MOVQ rptr, AX
2009        MOVL sel_save, BX2098        MOVL sel_save, BX
2010        MOVL zero_save, CX2099        MOVL zero_save, CX
2100
2011        // The result is not valid if (sel == 0), conditional choose2101        // The result is not valid if (sel == 0), conditional choose
2012        MOVOU xout(16*0), X02102        MOVOU xout(16*0), X0
2013        MOVOU xout(16*1), X12103        MOVOU xout(16*1), X1
2014        MOVOU yout(16*0), X22104        MOVOU yout(16*0), X2
2015        MOVOU yout(16*1), X32105        MOVOU yout(16*1), X3
2016        MOVOU zout(16*0), X42106        MOVOU zout(16*0), X4
2017        MOVOU zout(16*1), X52107        MOVOU zout(16*1), X5
20182108
2019        MOVL BX, X62109        MOVL BX, X6
2020        MOVL CX, X72110        MOVL CX, X7
20212111
2022        PXOR X8, X82112        PXOR    X8, X8
2023        PCMPEQL X9, X92113        PCMPEQL X9, X9
20242114
2025        PSHUFD $0, X6, X62115        PSHUFD $0, X6, X6
2026        PSHUFD $0, X7, X72116        PSHUFD $0, X7, X7
20272117
2028        PCMPEQL X8, X62118        PCMPEQL X8, X6
2029        PCMPEQL X8, X72119        PCMPEQL X8, X7
20302120
2031        MOVOU X6, X152121        MOVOU X6, X15
2032        PANDN X9, X152122        PANDN X9, X15
20332123
2034        MOVOU x1in(16*0), X92124        MOVOU x1in(16*0), X9
2035        MOVOU x1in(16*1), X102125        MOVOU x1in(16*1), X10
2036        MOVOU y1in(16*0), X112126        MOVOU y1in(16*0), X11
2037        MOVOU y1in(16*1), X122127        MOVOU y1in(16*1), X12
2038        MOVOU z1in(16*0), X132128        MOVOU z1in(16*0), X13
2039        MOVOU z1in(16*1), X142129        MOVOU z1in(16*1), X14
20402130
2041        PAND X15, X02131        PAND X15, X0
2042        PAND X15, X12132        PAND X15, X1
2043        PAND X15, X22133        PAND X15, X2
2044        PAND X15, X32134        PAND X15, X3
2045        PAND X15, X42135        PAND X15, X4
2046        PAND X15, X52136        PAND X15, X5
20472137
2048        PAND X6, X92138        PAND X6, X9
2049        PAND X6, X102139        PAND X6, X10
2050        PAND X6, X112140        PAND X6, X11
2051        PAND X6, X122141        PAND X6, X12
2052        PAND X6, X132142        PAND X6, X13
2053        PAND X6, X142143        PAND X6, X14
20542144
2055        PXOR X9, X02145        PXOR X9, X0
2056        PXOR X10, X12146        PXOR X10, X1
2057        PXOR X11, X22147        PXOR X11, X2
2058        PXOR X12, X32148        PXOR X12, X3
2059        PXOR X13, X42149        PXOR X13, X4
2060        PXOR X14, X52150        PXOR X14, X5
2151
2061        // Similarly if zero == 02152        // Similarly if zero == 0
2062        PCMPEQL X9, X92153        PCMPEQL X9, X9
2063        MOVOU X7, X152154        MOVOU   X7, X15
2064        PANDN X9, X152155        PANDN   X9, X15
20652156
2066        MOVOU x2in(16*0), X92157        MOVOU x2in(16*0), X9
2067        MOVOU x2in(16*1), X102158        MOVOU x2in(16*1), X10
2068        MOVOU y2in(16*0), X112159        MOVOU y2in(16*0), X11
2069        MOVOU y2in(16*1), X122160        MOVOU y2in(16*1), X12
2070        MOVOU p256one<>+0x00(SB), X132161        MOVOU p256one<>+0x00(SB), X13
2071        MOVOU p256one<>+0x10(SB), X142162        MOVOU p256one<>+0x10(SB), X14
20722163
2073        PAND X15, X02164        PAND X15, X0
2074        PAND X15, X12165        PAND X15, X1
2075        PAND X15, X22166        PAND X15, X2
2076        PAND X15, X32167        PAND X15, X3
2077        PAND X15, X42168        PAND X15, X4
2078        PAND X15, X52169        PAND X15, X5
20792170
2080        PAND X7, X92171        PAND X7, X9
2081        PAND X7, X102172        PAND X7, X10
2082        PAND X7, X112173        PAND X7, X11
2083        PAND X7, X122174        PAND X7, X12
2084        PAND X7, X132175        PAND X7, X13
2085        PAND X7, X142176        PAND X7, X14
20862177
2087        PXOR X9, X02178        PXOR X9, X0
2088        PXOR X10, X12179        PXOR X10, X1
2089        PXOR X11, X22180        PXOR X11, X2
2090        PXOR X12, X32181        PXOR X12, X3
2091        PXOR X13, X42182        PXOR X13, X4
2092        PXOR X14, X52183        PXOR X14, X5
2184
2093        // Finally output the result2185        // Finally output the result
2094        MOVOU X0, (16*0)(AX)2186        MOVOU X0, (16*0)(AX)
2095        MOVOU X1, (16*1)(AX)2187        MOVOU X1, (16*1)(AX)
2096        MOVOU X2, (16*2)(AX)2188        MOVOU X2, (16*2)(AX)
2097        MOVOU X3, (16*3)(AX)2189        MOVOU X3, (16*3)(AX)
2098        MOVOU X4, (16*4)(AX)2190        MOVOU X4, (16*4)(AX)
2099        MOVOU X5, (16*5)(AX)2191        MOVOU X5, (16*5)(AX)
2100        MOVQ $0, rptr2192        MOVQ  $0, rptr
21012193
2102        RET2194        RET
2195
2103#undef x1in2196#undef x1in
2104#undef y1in2197#undef y1in
2105#undef z1in2198#undef z1in
2106#undef x2in2199#undef x2in
2107#undef y2in2200#undef y2in
2108#undef xout2201#undef xout
2109#undef yout2202#undef yout
2110#undef zout2203#undef zout
2111#undef s22204#undef s2
2112#undef z1sqr2205#undef z1sqr
2113#undef h2206#undef h
2114#undef r2207#undef r
2115#undef hsqr2208#undef hsqr
2116#undef rsqr2209#undef rsqr
2117#undef hcub2210#undef hcub
2118#undef rptr2211#undef rptr
2119#undef sel_save2212#undef sel_save
2120#undef zero_save2213#undef zero_save
2121/* ---------------------------------------*/2214// ---------------------------------------
2122#define x1in(off) (32*0 + off)(SP)2215#define x1in(off) (32*0 + off)(SP)
2123#define y1in(off) (32*1 + off)(SP)2216#define y1in(off) (32*1 + off)(SP)
2124#define z1in(off) (32*2 + off)(SP)2217#define z1in(off) (32*2 + off)(SP)
2125#define x2in(off) (32*3 + off)(SP)2218#define x2in(off) (32*3 + off)(SP)
2126#define y2in(off) (32*4 + off)(SP)2219#define y2in(off) (32*4 + off)(SP)
2127#define z2in(off) (32*5 + off)(SP)2220#define z2in(off) (32*5 + off)(SP)
21282221
2129#define xout(off) (32*6 + off)(SP)2222#define xout(off) (32*6 + off)(SP)
2130#define yout(off) (32*7 + off)(SP)2223#define yout(off) (32*7 + off)(SP)
2131#define zout(off) (32*8 + off)(SP)2224#define zout(off) (32*8 + off)(SP)
21322225
2133#define u1(off)   (32*9 + off)(SP)2226#define u1(off)   (32*9 + off)(SP)
2134#define u2(off)   (32*10 + off)(SP)2227#define u2(off)   (32*10 + off)(SP)
2135#define s1(off)   (32*11 + off)(SP)2228#define s1(off)   (32*11 + off)(SP)
2136#define s2(off)   (32*12 + off)(SP)2229#define s2(off)   (32*12 + off)(SP)
2137#define z1sqr(off) (32*13 + off)(SP)2230#define z1sqr(off) (32*13 + off)(SP)
2138#define z2sqr(off) (32*14 + off)(SP)2231#define z2sqr(off) (32*14 + off)(SP)
2139#define h(off)        (32*15 + off)(SP)2232#define h(off)        (32*15 + off)(SP)
2140#define r(off)        (32*16 + off)(SP)2233#define r(off)        (32*16 + off)(SP)
2141#define hsqr(off) (32*17 + off)(SP)2234#define hsqr(off) (32*17 + off)(SP)
2142#define rsqr(off) (32*18 + off)(SP)2235#define rsqr(off) (32*18 + off)(SP)
2143#define hcub(off) (32*19 + off)(SP)2236#define hcub(off) (32*19 + off)(SP)
2144#define rptr          (32*20)(SP)2237#define rptr          (32*20)(SP)
21452238
2146//func p256PointAddAsm(res, in1, in2 []uint64)2239// func p256PointAddAsm(res, in1, in2 []uint64)
2147TEXT ·p256PointAddAsm(SB),0,$672-762240TEXT ·p256PointAddAsm(SB), 0, $672-76
2148        // Move input to stack in order to free registers2241        // Move input to stack in order to free registers
2149        MOVQ res+0(FP), AX2242        MOVQ res+0(FP), AX
2150        MOVQ in1+24(FP), BX2243        MOVQ in1+24(FP), BX
2151        MOVQ in2+48(FP), CX2244        MOVQ in2+48(FP), CX
21522245
2153        MOVOU (16*0)(BX), X02246        MOVOU (16*0)(BX), X0
2154        MOVOU (16*1)(BX), X12247        MOVOU (16*1)(BX), X1
2155        MOVOU (16*2)(BX), X22248        MOVOU (16*2)(BX), X2
2156        MOVOU (16*3)(BX), X32249        MOVOU (16*3)(BX), X3
2157        MOVOU (16*4)(BX), X42250        MOVOU (16*4)(BX), X4
2158        MOVOU (16*5)(BX), X52251        MOVOU (16*5)(BX), X5
21592252
2160        MOVOU X0, x1in(16*0)2253        MOVOU X0, x1in(16*0)
2161        MOVOU X1, x1in(16*1)2254        MOVOU X1, x1in(16*1)
2162        MOVOU X2, y1in(16*0)2255        MOVOU X2, y1in(16*0)
2163        MOVOU X3, y1in(16*1)2256        MOVOU X3, y1in(16*1)
2164        MOVOU X4, z1in(16*0)2257        MOVOU X4, z1in(16*0)
2165        MOVOU X5, z1in(16*1)2258        MOVOU X5, z1in(16*1)
21662259
2167        MOVOU (16*0)(CX), X02260        MOVOU (16*0)(CX), X0
2168        MOVOU (16*1)(CX), X12261        MOVOU (16*1)(CX), X1
2169        MOVOU (16*2)(CX), X22262        MOVOU (16*2)(CX), X2
2170        MOVOU (16*3)(CX), X32263        MOVOU (16*3)(CX), X3
2171        MOVOU (16*4)(CX), X42264        MOVOU (16*4)(CX), X4
2172        MOVOU (16*5)(CX), X52265        MOVOU (16*5)(CX), X5
21732266
2174        MOVOU X0, x2in(16*0)2267        MOVOU X0, x2in(16*0)
2175        MOVOU X1, x2in(16*1)2268        MOVOU X1, x2in(16*1)
2176        MOVOU X2, y2in(16*0)2269        MOVOU X2, y2in(16*0)
2177        MOVOU X3, y2in(16*1)2270        MOVOU X3, y2in(16*1)
2178        MOVOU X4, z2in(16*0)2271        MOVOU X4, z2in(16*0)
2179        MOVOU X5, z2in(16*1)2272        MOVOU X5, z2in(16*1)
2273
2180        // Store pointer to result2274        // Store pointer to result
2181        MOVQ AX, rptr2275        MOVQ AX, rptr
2276
2182        // Begin point add2277        // Begin point add
2183        LDacc (z2in)2278        LDacc (z2in)
2184        CALL p256SqrInternal(SB)        // z2ˆ22279        CALL p256SqrInternal(SB) // z2ˆ2
2185        ST (z2sqr)2280        ST (z2sqr)
2186        LDt (z2in)2281        LDt (z2in)
2187        CALL p256MulInternal(SB)        // z2ˆ32282        CALL p256MulInternal(SB) // z2ˆ3
2188        LDt (y1in)2283        LDt (y1in)
2189        CALL p256MulInternal(SB)        // s1 = z2ˆ3*y12284        CALL p256MulInternal(SB) // s1 = z2ˆ3*y1
2190        ST (s1)2285        ST (s1)
21912286
2192        LDacc (z1in)2287        LDacc (z1in)
2193        CALL p256SqrInternal(SB)        // z1ˆ22288        CALL p256SqrInternal(SB) // z1ˆ2
2194        ST (z1sqr)2289        ST (z1sqr)
2195        LDt (z1in)2290        LDt (z1in)
2196        CALL p256MulInternal(SB)        // z1ˆ32291        CALL p256MulInternal(SB) // z1ˆ3
2197        LDt (y2in)2292        LDt (y2in)
2198        CALL p256MulInternal(SB)        // s2 = z1ˆ3*y22293        CALL p256MulInternal(SB) // s2 = z1ˆ3*y2
2199        ST (s2)2294        ST (s2)
22002295
2201        LDt (s1)2296        LDt (s1)
2202        CALL p256SubInternal(SB)        // r = s2 - s12297        CALL p256SubInternal(SB) // r = s2 - s1
2203        ST (r)2298        ST (r)
22042299
2205        LDacc (z2sqr)2300        LDacc (z2sqr)
2206        LDt (x1in)2301        LDt (x1in)
2207        CALL p256MulInternal(SB)        // u1 = x1 * z2ˆ22302        CALL p256MulInternal(SB) // u1 = x1 * z2ˆ2
2208        ST (u1)2303        ST (u1)
2209        LDacc (z1sqr)2304        LDacc (z1sqr)
2210        LDt (x2in)2305        LDt (x2in)
2211        CALL p256MulInternal(SB)        // u2 = x2 * z1ˆ22306        CALL p256MulInternal(SB) // u2 = x2 * z1ˆ2
2212        ST (u2)2307        ST (u2)
22132308
2214        LDt (u1)2309        LDt (u1)
2215        CALL p256SubInternal(SB)        // h = u2 - u12310        CALL p256SubInternal(SB) // h = u2 - u1
2216        ST (h)2311        ST (h)
22172312
2218        LDacc (r)2313        LDacc (r)
2219        CALL p256SqrInternal(SB)        // rsqr = rˆ22314        CALL p256SqrInternal(SB) // rsqr = rˆ2
2220        ST (rsqr)2315        ST (rsqr)
22212316
2222        LDacc (h)2317        LDacc (h)
2223        CALL p256SqrInternal(SB)        // hsqr = hˆ22318        CALL p256SqrInternal(SB) // hsqr = hˆ2
2224        ST (hsqr)2319        ST (hsqr)
22252320
2226        LDt (h)2321        LDt (h)
2227        CALL p256MulInternal(SB)        // hcub = hˆ32322        CALL p256MulInternal(SB) // hcub = hˆ3
2228        ST (hcub)2323        ST (hcub)
22292324
2230        LDt (s1)2325        LDt (s1)
2231        CALL p256MulInternal(SB)2326        CALL p256MulInternal(SB)
2232        ST (s2)2327        ST (s2)
22332328
2234        LDacc (z1in)2329        LDacc (z1in)
2235        LDt (z2in)2330        LDt (z2in)
2236        CALL p256MulInternal(SB)        // z1 * z22331        CALL p256MulInternal(SB) // z1 * z2
2237        LDt (h)2332        LDt (h)
2238        CALL p256MulInternal(SB)        // z1 * z2 * h2333        CALL p256MulInternal(SB) // z1 * z2 * h
2239        ST (zout)2334        ST (zout)
22402335
2241        LDacc (hsqr)2336        LDacc (hsqr)
2242        LDt (u1)2337        LDt (u1)
2243        CALL p256MulInternal(SB)        // hˆ2 * u12338        CALL p256MulInternal(SB) // hˆ2 * u1
2244        ST (u2)2339        ST (u2)
22452340
2246        p256MulBy2Inline        // u1 * hˆ2 * 2, inline2341        p256MulBy2Inline         // u1 * hˆ2 * 2, inline
2247        LDacc (rsqr)2342        LDacc (rsqr)
2248        CALL p256SubInternal(SB)        // rˆ2 - u1 * hˆ2 * 22343        CALL p256SubInternal(SB) // rˆ2 - u1 * hˆ2 * 2
22492344
2250        LDt (hcub)2345        LDt (hcub)
2251        CALL p256SubInternal(SB)2346        CALL p256SubInternal(SB)
2252        ST (xout)2347        ST (xout)
22532348
2254        MOVQ acc4, t02349        MOVQ acc4, t0
2255        MOVQ acc5, t12350        MOVQ acc5, t1
2256        MOVQ acc6, t22351        MOVQ acc6, t2
2257        MOVQ acc7, t32352        MOVQ acc7, t3
2258        LDacc (u2)2353        LDacc (u2)
2259        CALL p256SubInternal(SB)2354        CALL p256SubInternal(SB)
22602355
2261        LDt (r)2356        LDt (r)
2262        CALL p256MulInternal(SB)2357        CALL p256MulInternal(SB)
22632358
2264        LDt (s2)2359        LDt (s2)
2265        CALL p256SubInternal(SB)2360        CALL p256SubInternal(SB)
2266        ST (yout)2361        ST (yout)
22672362
2268        MOVOU xout(16*0), X02363        MOVOU xout(16*0), X0
2269        MOVOU xout(16*1), X12364        MOVOU xout(16*1), X1
2270        MOVOU yout(16*0), X22365        MOVOU yout(16*0), X2
2271        MOVOU yout(16*1), X32366        MOVOU yout(16*1), X3
2272        MOVOU zout(16*0), X42367        MOVOU zout(16*0), X4
2273        MOVOU zout(16*1), X52368        MOVOU zout(16*1), X5
2369
2274        // Finally output the result2370        // Finally output the result
2275        MOVQ rptr, AX2371        MOVQ  rptr, AX
2276        MOVQ $0, rptr2372        MOVQ  $0, rptr
2277        MOVOU X0, (16*0)(AX)2373        MOVOU X0, (16*0)(AX)
2278        MOVOU X1, (16*1)(AX)2374        MOVOU X1, (16*1)(AX)
2279        MOVOU X2, (16*2)(AX)2375        MOVOU X2, (16*2)(AX)
2280        MOVOU X3, (16*3)(AX)2376        MOVOU X3, (16*3)(AX)
2281        MOVOU X4, (16*4)(AX)2377        MOVOU X4, (16*4)(AX)
2282        MOVOU X5, (16*5)(AX)2378        MOVOU X5, (16*5)(AX)
22832379
2284        RET2380        RET
2381
2285#undef x1in2382#undef x1in
2286#undef y1in2383#undef y1in
2287#undef z1in2384#undef z1in
2288#undef x2in2385#undef x2in
2289#undef y2in2386#undef y2in
2290#undef z2in2387#undef z2in
2291#undef xout2388#undef xout
2292#undef yout2389#undef yout
2293#undef zout2390#undef zout
2294#undef s12391#undef s1
2295#undef s22392#undef s2
2296#undef u12393#undef u1
2297#undef u22394#undef u2
2298#undef z1sqr2395#undef z1sqr
2299#undef z2sqr2396#undef z2sqr
2300#undef h2397#undef h
2301#undef r2398#undef r
2302#undef hsqr2399#undef hsqr
2303#undef rsqr2400#undef rsqr
2304#undef hcub2401#undef hcub
2305#undef rptr2402#undef rptr
2306/* ---------------------------------------*/2403// ---------------------------------------
2307#define x(off) (32*0 + off)(SP)2404#define x(off) (32*0 + off)(SP)
2308#define y(off) (32*1 + off)(SP)2405#define y(off) (32*1 + off)(SP)
2309#define z(off) (32*2 + off)(SP)2406#define z(off) (32*2 + off)(SP)
23102407
2311#define s(off)        (32*3 + off)(SP)2408#define s(off)        (32*3 + off)(SP)
2312#define m(off)        (32*4 + off)(SP)2409#define m(off)        (32*4 + off)(SP)
2313#define zsqr(off) (32*5 + off)(SP)2410#define zsqr(off) (32*5 + off)(SP)
2314#define tmp(off)  (32*6 + off)(SP)2411#define tmp(off)  (32*6 + off)(SP)
2315#define rptr          (32*7)(SP)2412#define rptr          (32*7)(SP)
23162413
2317//func p256PointDoubleAsm(res, in []uint64)2414// func p256PointDoubleAsm(res, in []uint64)
2318TEXT ·p256PointDoubleAsm(SB),NOSPLIT,$256-482415TEXT ·p256PointDoubleAsm(SB), NOSPLIT, $256-48
2319        // Move input to stack in order to free registers2416        // Move input to stack in order to free registers
2320        MOVQ res+0(FP), AX2417        MOVQ res+0(FP), AX
2321        MOVQ in+24(FP), BX2418        MOVQ in+24(FP), BX
23222419
2323        MOVOU (16*0)(BX), X02420        MOVOU (16*0)(BX), X0
2324        MOVOU (16*1)(BX), X12421        MOVOU (16*1)(BX), X1
2325        MOVOU (16*2)(BX), X22422        MOVOU (16*2)(BX), X2
2326        MOVOU (16*3)(BX), X32423        MOVOU (16*3)(BX), X3
2327        MOVOU (16*4)(BX), X42424        MOVOU (16*4)(BX), X4
2328        MOVOU (16*5)(BX), X52425        MOVOU (16*5)(BX), X5
23292426
2330        MOVOU X0, x(16*0)2427        MOVOU X0, x(16*0)
2331        MOVOU X1, x(16*1)2428        MOVOU X1, x(16*1)
2332        MOVOU X2, y(16*0)2429        MOVOU X2, y(16*0)
2333        MOVOU X3, y(16*1)2430        MOVOU X3, y(16*1)
2334        MOVOU X4, z(16*0)2431        MOVOU X4, z(16*0)
2335        MOVOU X5, z(16*1)2432        MOVOU X5, z(16*1)
2433
2336        // Store pointer to result2434        // Store pointer to result
2337        MOVQ AX, rptr2435        MOVQ AX, rptr
2436
2338        // Begin point double2437        // Begin point double
2339        LDacc (z)2438        LDacc (z)
2340        CALL p256SqrInternal(SB)2439        CALL p256SqrInternal(SB)
2341        ST (zsqr)2440        ST (zsqr)
23422441
2343        LDt (x)2442        LDt (x)
2344        p256AddInline2443        p256AddInline
2345        STt (m)2444        STt (m)
23462445
2347        LDacc (z)2446        LDacc (z)
2348        LDt (y)2447        LDt (y)
2349        CALL p256MulInternal(SB)2448        CALL p256MulInternal(SB)
2350        p256MulBy2Inline2449        p256MulBy2Inline
2351        MOVQ rptr, AX2450        MOVQ rptr, AX
2451
2352        // Store z2452        // Store z
2353        MOVQ t0, (16*4 + 8*0)(AX)2453        MOVQ t0, (16*4 + 8*0)(AX)
2354        MOVQ t1, (16*4 + 8*1)(AX)2454        MOVQ t1, (16*4 + 8*1)(AX)
2355        MOVQ t2, (16*4 + 8*2)(AX)2455        MOVQ t2, (16*4 + 8*2)(AX)
2356        MOVQ t3, (16*4 + 8*3)(AX)2456        MOVQ t3, (16*4 + 8*3)(AX)
23572457
2358        LDacc (x)2458        LDacc (x)
2359        LDt (zsqr)2459        LDt (zsqr)
2360        CALL p256SubInternal(SB)2460        CALL p256SubInternal(SB)
2361        LDt (m)2461        LDt (m)
2362        CALL p256MulInternal(SB)2462        CALL p256MulInternal(SB)
2363        ST (m)2463        ST (m)
2464
2364        // Multiply by 32465        // Multiply by 3
2365        p256MulBy2Inline2466        p256MulBy2Inline
2366        LDacc (m)2467        LDacc (m)
2367        p256AddInline2468        p256AddInline
2368        STt (m)2469        STt (m)
2470
2369        ////////////////////////2471        ////////////////////////
2370        LDacc (y)2472        LDacc (y)
2371        p256MulBy2Inline2473        p256MulBy2Inline
2372        t2acc2474        t2acc
2373        CALL p256SqrInternal(SB)2475        CALL  p256SqrInternal(SB)
2374        ST (s)2476        ST (s)
2375        CALL p256SqrInternal(SB)2477        CALL  p256SqrInternal(SB)
2478
2376        // Divide by 22479        // Divide by 2
2377        XORQ mul0, mul02480        XORQ mul0, mul0
2378        MOVQ acc4, t02481        MOVQ acc4, t0
2379        MOVQ acc5, t12482        MOVQ acc5, t1
2380        MOVQ acc6, t22483        MOVQ acc6, t2
2381        MOVQ acc7, t32484        MOVQ acc7, t3
23822485
2383        ADDQ $-1, acc42486        ADDQ  $-1, acc4
2384        ADCQ p256const0<>(SB), acc52487        ADCQ  p256const0<>(SB), acc5
2385        ADCQ $0, acc62488        ADCQ  $0, acc6
2386        ADCQ p256const1<>(SB), acc72489        ADCQ  p256const1<>(SB), acc7
2387        ADCQ $0, mul02490        ADCQ  $0, mul0
2388        TESTQ $1, t02491        TESTQ $1, t0
23892492
2390        CMOVQEQ t0, acc42493        CMOVQEQ t0, acc4
2391        CMOVQEQ t1, acc52494        CMOVQEQ t1, acc5
2392        CMOVQEQ t2, acc62495        CMOVQEQ t2, acc6
2393        CMOVQEQ t3, acc72496        CMOVQEQ t3, acc7
2394        ANDQ t0, mul02497        ANDQ    t0, mul0
23952498
2396        SHRQ $1, acc4:acc52499        SHRQ $1, acc4:acc5
2397        SHRQ $1, acc5:acc62500        SHRQ $1, acc5:acc6
2398        SHRQ $1, acc6:acc72501        SHRQ $1, acc6:acc7
2399        SHRQ $1, acc7:mul02502        SHRQ $1, acc7:mul0
2400        ST (y)2503        ST (y)
2504
2401        /////////////////////////2505        /////////////////////////
2402        LDacc (x)2506        LDacc (x)
2403        LDt (s)2507        LDt (s)
2404        CALL p256MulInternal(SB)2508        CALL p256MulInternal(SB)
2405        ST (s)2509        ST (s)
2406        p256MulBy2Inline2510        p256MulBy2Inline
2407        STt (tmp)2511        STt (tmp)
24082512
2409        LDacc (m)2513        LDacc (m)
2410        CALL p256SqrInternal(SB)2514        CALL p256SqrInternal(SB)
2411        LDt (tmp)2515        LDt (tmp)
2412        CALL p256SubInternal(SB)2516        CALL p256SubInternal(SB)
24132517
2414        MOVQ rptr, AX2518        MOVQ rptr, AX
2519
2415        // Store x2520        // Store x
2416        MOVQ acc4, (16*0 + 8*0)(AX)2521        MOVQ acc4, (16*0 + 8*0)(AX)
2417        MOVQ acc5, (16*0 + 8*1)(AX)2522        MOVQ acc5, (16*0 + 8*1)(AX)
2418        MOVQ acc6, (16*0 + 8*2)(AX)2523        MOVQ acc6, (16*0 + 8*2)(AX)
2419        MOVQ acc7, (16*0 + 8*3)(AX)2524        MOVQ acc7, (16*0 + 8*3)(AX)
24202525
2421        acc2t2526        acc2t
2422        LDacc (s)2527        LDacc (s)
2423        CALL p256SubInternal(SB)2528        CALL  p256SubInternal(SB)
24242529
2425        LDt (m)2530        LDt (m)
2426        CALL p256MulInternal(SB)2531        CALL p256MulInternal(SB)
24272532
2428        LDt (y)2533        LDt (y)
2429        CALL p256SubInternal(SB)2534        CALL p256SubInternal(SB)
2430        MOVQ rptr, AX2535        MOVQ rptr, AX
2536
2431        // Store y2537        // Store y
2432        MOVQ acc4, (16*2 + 8*0)(AX)2538        MOVQ acc4, (16*2 + 8*0)(AX)
2433        MOVQ acc5, (16*2 + 8*1)(AX)2539        MOVQ acc5, (16*2 + 8*1)(AX)
2434        MOVQ acc6, (16*2 + 8*2)(AX)2540        MOVQ acc6, (16*2 + 8*2)(AX)
2435        MOVQ acc7, (16*2 + 8*3)(AX)2541        MOVQ acc7, (16*2 + 8*3)(AX)
2542
2436        ///////////////////////2543        ///////////////////////
2437        MOVQ $0, rptr2544        MOVQ $0, rptr
24382545
2439        RET2546        RET
2547
2440/* ---------------------------------------*/2548// ---------------------------------------
24412549