xref: /linux/lib/crypto/powerpc/curve25519-ppc64le_asm.S (revision d8768fb12a14c30436bd0466b4fc28edeef45078)
1*68546e56SEric Biggers/* SPDX-License-Identifier: GPL-2.0-or-later */
2*68546e56SEric Biggers#
3*68546e56SEric Biggers# This code is taken from CRYPTOGAMs[1] and is included here using the option
4*68546e56SEric Biggers# in the license to distribute the code under the GPL. Therefore this program
5*68546e56SEric Biggers# is free software; you can redistribute it and/or modify it under the terms of
6*68546e56SEric Biggers# the GNU General Public License version 2 as published by the Free Software
7*68546e56SEric Biggers# Foundation.
8*68546e56SEric Biggers#
9*68546e56SEric Biggers# [1] https://github.com/dot-asm/cryptogams/
10*68546e56SEric Biggers
11*68546e56SEric Biggers# Copyright (c) 2006-2017, CRYPTOGAMS by <appro@openssl.org>
12*68546e56SEric Biggers# All rights reserved.
13*68546e56SEric Biggers#
14*68546e56SEric Biggers# Redistribution and use in source and binary forms, with or without
15*68546e56SEric Biggers# modification, are permitted provided that the following conditions
16*68546e56SEric Biggers# are met:
17*68546e56SEric Biggers#
18*68546e56SEric Biggers#       * Redistributions of source code must retain copyright notices,
19*68546e56SEric Biggers#         this list of conditions and the following disclaimer.
20*68546e56SEric Biggers#
21*68546e56SEric Biggers#       * Redistributions in binary form must reproduce the above
22*68546e56SEric Biggers#         copyright notice, this list of conditions and the following
23*68546e56SEric Biggers#         disclaimer in the documentation and/or other materials
24*68546e56SEric Biggers#         provided with the distribution.
25*68546e56SEric Biggers#
26*68546e56SEric Biggers#       * Neither the name of the CRYPTOGAMS nor the names of its
27*68546e56SEric Biggers#         copyright holder and contributors may be used to endorse or
28*68546e56SEric Biggers#         promote products derived from this software without specific
29*68546e56SEric Biggers#         prior written permission.
30*68546e56SEric Biggers#
31*68546e56SEric Biggers# ALTERNATIVELY, provided that this notice is retained in full, this
32*68546e56SEric Biggers# product may be distributed under the terms of the GNU General Public
33*68546e56SEric Biggers# License (GPL), in which case the provisions of the GPL apply INSTEAD OF
34*68546e56SEric Biggers# those given above.
35*68546e56SEric Biggers#
36*68546e56SEric Biggers# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
37*68546e56SEric Biggers# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
38*68546e56SEric Biggers# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
39*68546e56SEric Biggers# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
40*68546e56SEric Biggers# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41*68546e56SEric Biggers# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42*68546e56SEric Biggers# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
43*68546e56SEric Biggers# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
44*68546e56SEric Biggers# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
45*68546e56SEric Biggers# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
46*68546e56SEric Biggers# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
47*68546e56SEric Biggers
48*68546e56SEric Biggers# ====================================================================
49*68546e56SEric Biggers# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
50*68546e56SEric Biggers# project. The module is, however, dual licensed under OpenSSL and
51*68546e56SEric Biggers# CRYPTOGAMS licenses depending on where you obtain it. For further
52*68546e56SEric Biggers# details see https://www.openssl.org/~appro/cryptogams/.
53*68546e56SEric Biggers# ====================================================================
54*68546e56SEric Biggers
55*68546e56SEric Biggers#
56*68546e56SEric Biggers# ====================================================================
57*68546e56SEric Biggers# Written and Modified by Danny Tsen <dtsen@us.ibm.com>
58*68546e56SEric Biggers# - Added x25519_fe51_sqr_times, x25519_fe51_frombytes, x25519_fe51_tobytes
59*68546e56SEric Biggers#   and x25519_cswap
60*68546e56SEric Biggers#
61*68546e56SEric Biggers# Copyright 2024- IBM Corp.
62*68546e56SEric Biggers#
63*68546e56SEric Biggers# X25519 lower-level primitives for PPC64.
64*68546e56SEric Biggers#
65*68546e56SEric Biggers
66*68546e56SEric Biggers#include <linux/linkage.h>
67*68546e56SEric Biggers
68*68546e56SEric Biggers.text
69*68546e56SEric Biggers
70*68546e56SEric Biggers.align	5
71*68546e56SEric BiggersSYM_FUNC_START(x25519_fe51_mul)
72*68546e56SEric Biggers
73*68546e56SEric Biggers	stdu	1,-144(1)
74*68546e56SEric Biggers	std	21,56(1)
75*68546e56SEric Biggers	std	22,64(1)
76*68546e56SEric Biggers	std	23,72(1)
77*68546e56SEric Biggers	std	24,80(1)
78*68546e56SEric Biggers	std	25,88(1)
79*68546e56SEric Biggers	std	26,96(1)
80*68546e56SEric Biggers	std	27,104(1)
81*68546e56SEric Biggers	std	28,112(1)
82*68546e56SEric Biggers	std	29,120(1)
83*68546e56SEric Biggers	std	30,128(1)
84*68546e56SEric Biggers	std	31,136(1)
85*68546e56SEric Biggers
86*68546e56SEric Biggers	ld	6,0(5)
87*68546e56SEric Biggers	ld	7,0(4)
88*68546e56SEric Biggers	ld	8,8(4)
89*68546e56SEric Biggers	ld	9,16(4)
90*68546e56SEric Biggers	ld	10,24(4)
91*68546e56SEric Biggers	ld	11,32(4)
92*68546e56SEric Biggers
93*68546e56SEric Biggers	mulld	22,7,6
94*68546e56SEric Biggers	mulhdu	23,7,6
95*68546e56SEric Biggers
96*68546e56SEric Biggers	mulld	24,8,6
97*68546e56SEric Biggers	mulhdu	25,8,6
98*68546e56SEric Biggers
99*68546e56SEric Biggers	mulld	30,11,6
100*68546e56SEric Biggers	mulhdu	31,11,6
101*68546e56SEric Biggers	ld	4,8(5)
102*68546e56SEric Biggers	mulli	11,11,19
103*68546e56SEric Biggers
104*68546e56SEric Biggers	mulld	26,9,6
105*68546e56SEric Biggers	mulhdu	27,9,6
106*68546e56SEric Biggers
107*68546e56SEric Biggers	mulld	28,10,6
108*68546e56SEric Biggers	mulhdu	29,10,6
109*68546e56SEric Biggers	mulld	12,11,4
110*68546e56SEric Biggers	mulhdu	21,11,4
111*68546e56SEric Biggers	addc	22,22,12
112*68546e56SEric Biggers	adde	23,23,21
113*68546e56SEric Biggers
114*68546e56SEric Biggers	mulld	12,7,4
115*68546e56SEric Biggers	mulhdu	21,7,4
116*68546e56SEric Biggers	addc	24,24,12
117*68546e56SEric Biggers	adde	25,25,21
118*68546e56SEric Biggers
119*68546e56SEric Biggers	mulld	12,10,4
120*68546e56SEric Biggers	mulhdu	21,10,4
121*68546e56SEric Biggers	ld	6,16(5)
122*68546e56SEric Biggers	mulli	10,10,19
123*68546e56SEric Biggers	addc	30,30,12
124*68546e56SEric Biggers	adde	31,31,21
125*68546e56SEric Biggers
126*68546e56SEric Biggers	mulld	12,8,4
127*68546e56SEric Biggers	mulhdu	21,8,4
128*68546e56SEric Biggers	addc	26,26,12
129*68546e56SEric Biggers	adde	27,27,21
130*68546e56SEric Biggers
131*68546e56SEric Biggers	mulld	12,9,4
132*68546e56SEric Biggers	mulhdu	21,9,4
133*68546e56SEric Biggers	addc	28,28,12
134*68546e56SEric Biggers	adde	29,29,21
135*68546e56SEric Biggers	mulld	12,10,6
136*68546e56SEric Biggers	mulhdu	21,10,6
137*68546e56SEric Biggers	addc	22,22,12
138*68546e56SEric Biggers	adde	23,23,21
139*68546e56SEric Biggers
140*68546e56SEric Biggers	mulld	12,11,6
141*68546e56SEric Biggers	mulhdu	21,11,6
142*68546e56SEric Biggers	addc	24,24,12
143*68546e56SEric Biggers	adde	25,25,21
144*68546e56SEric Biggers
145*68546e56SEric Biggers	mulld	12,9,6
146*68546e56SEric Biggers	mulhdu	21,9,6
147*68546e56SEric Biggers	ld	4,24(5)
148*68546e56SEric Biggers	mulli	9,9,19
149*68546e56SEric Biggers	addc	30,30,12
150*68546e56SEric Biggers	adde	31,31,21
151*68546e56SEric Biggers
152*68546e56SEric Biggers	mulld	12,7,6
153*68546e56SEric Biggers	mulhdu	21,7,6
154*68546e56SEric Biggers	addc	26,26,12
155*68546e56SEric Biggers	adde	27,27,21
156*68546e56SEric Biggers
157*68546e56SEric Biggers	mulld	12,8,6
158*68546e56SEric Biggers	mulhdu	21,8,6
159*68546e56SEric Biggers	addc	28,28,12
160*68546e56SEric Biggers	adde	29,29,21
161*68546e56SEric Biggers	mulld	12,9,4
162*68546e56SEric Biggers	mulhdu	21,9,4
163*68546e56SEric Biggers	addc	22,22,12
164*68546e56SEric Biggers	adde	23,23,21
165*68546e56SEric Biggers
166*68546e56SEric Biggers	mulld	12,10,4
167*68546e56SEric Biggers	mulhdu	21,10,4
168*68546e56SEric Biggers	addc	24,24,12
169*68546e56SEric Biggers	adde	25,25,21
170*68546e56SEric Biggers
171*68546e56SEric Biggers	mulld	12,8,4
172*68546e56SEric Biggers	mulhdu	21,8,4
173*68546e56SEric Biggers	ld	6,32(5)
174*68546e56SEric Biggers	mulli	8,8,19
175*68546e56SEric Biggers	addc	30,30,12
176*68546e56SEric Biggers	adde	31,31,21
177*68546e56SEric Biggers
178*68546e56SEric Biggers	mulld	12,11,4
179*68546e56SEric Biggers	mulhdu	21,11,4
180*68546e56SEric Biggers	addc	26,26,12
181*68546e56SEric Biggers	adde	27,27,21
182*68546e56SEric Biggers
183*68546e56SEric Biggers	mulld	12,7,4
184*68546e56SEric Biggers	mulhdu	21,7,4
185*68546e56SEric Biggers	addc	28,28,12
186*68546e56SEric Biggers	adde	29,29,21
187*68546e56SEric Biggers	mulld	12,8,6
188*68546e56SEric Biggers	mulhdu	21,8,6
189*68546e56SEric Biggers	addc	22,22,12
190*68546e56SEric Biggers	adde	23,23,21
191*68546e56SEric Biggers
192*68546e56SEric Biggers	mulld	12,9,6
193*68546e56SEric Biggers	mulhdu	21,9,6
194*68546e56SEric Biggers	addc	24,24,12
195*68546e56SEric Biggers	adde	25,25,21
196*68546e56SEric Biggers
197*68546e56SEric Biggers	mulld	12,10,6
198*68546e56SEric Biggers	mulhdu	21,10,6
199*68546e56SEric Biggers	addc	26,26,12
200*68546e56SEric Biggers	adde	27,27,21
201*68546e56SEric Biggers
202*68546e56SEric Biggers	mulld	12,11,6
203*68546e56SEric Biggers	mulhdu	21,11,6
204*68546e56SEric Biggers	addc	28,28,12
205*68546e56SEric Biggers	adde	29,29,21
206*68546e56SEric Biggers
207*68546e56SEric Biggers	mulld	12,7,6
208*68546e56SEric Biggers	mulhdu	21,7,6
209*68546e56SEric Biggers	addc	30,30,12
210*68546e56SEric Biggers	adde	31,31,21
211*68546e56SEric Biggers
212*68546e56SEric Biggers.Lfe51_reduce:
213*68546e56SEric Biggers	li	0,-1
214*68546e56SEric Biggers	srdi	0,0,13
215*68546e56SEric Biggers
216*68546e56SEric Biggers	srdi	12,26,51
217*68546e56SEric Biggers	and	9,26,0
218*68546e56SEric Biggers	insrdi	12,27,51,0
219*68546e56SEric Biggers	srdi	21,22,51
220*68546e56SEric Biggers	and	7,22,0
221*68546e56SEric Biggers	insrdi	21,23,51,0
222*68546e56SEric Biggers	addc	28,28,12
223*68546e56SEric Biggers	addze	29,29
224*68546e56SEric Biggers	addc	24,24,21
225*68546e56SEric Biggers	addze	25,25
226*68546e56SEric Biggers
227*68546e56SEric Biggers	srdi	12,28,51
228*68546e56SEric Biggers	and	10,28,0
229*68546e56SEric Biggers	insrdi	12,29,51,0
230*68546e56SEric Biggers	srdi	21,24,51
231*68546e56SEric Biggers	and	8,24,0
232*68546e56SEric Biggers	insrdi	21,25,51,0
233*68546e56SEric Biggers	addc	30,30,12
234*68546e56SEric Biggers	addze	31,31
235*68546e56SEric Biggers	add	9,9,21
236*68546e56SEric Biggers
237*68546e56SEric Biggers	srdi	12,30,51
238*68546e56SEric Biggers	and	11,30,0
239*68546e56SEric Biggers	insrdi	12,31,51,0
240*68546e56SEric Biggers	mulli	12,12,19
241*68546e56SEric Biggers
242*68546e56SEric Biggers	add	7,7,12
243*68546e56SEric Biggers
244*68546e56SEric Biggers	srdi	21,9,51
245*68546e56SEric Biggers	and	9,9,0
246*68546e56SEric Biggers	add	10,10,21
247*68546e56SEric Biggers
248*68546e56SEric Biggers	srdi	12,7,51
249*68546e56SEric Biggers	and	7,7,0
250*68546e56SEric Biggers	add	8,8,12
251*68546e56SEric Biggers
252*68546e56SEric Biggers	std	9,16(3)
253*68546e56SEric Biggers	std	10,24(3)
254*68546e56SEric Biggers	std	11,32(3)
255*68546e56SEric Biggers	std	7,0(3)
256*68546e56SEric Biggers	std	8,8(3)
257*68546e56SEric Biggers
258*68546e56SEric Biggers	ld	21,56(1)
259*68546e56SEric Biggers	ld	22,64(1)
260*68546e56SEric Biggers	ld	23,72(1)
261*68546e56SEric Biggers	ld	24,80(1)
262*68546e56SEric Biggers	ld	25,88(1)
263*68546e56SEric Biggers	ld	26,96(1)
264*68546e56SEric Biggers	ld	27,104(1)
265*68546e56SEric Biggers	ld	28,112(1)
266*68546e56SEric Biggers	ld	29,120(1)
267*68546e56SEric Biggers	ld	30,128(1)
268*68546e56SEric Biggers	ld	31,136(1)
269*68546e56SEric Biggers	addi	1,1,144
270*68546e56SEric Biggers	blr
271*68546e56SEric BiggersSYM_FUNC_END(x25519_fe51_mul)
272*68546e56SEric Biggers
273*68546e56SEric Biggers.align	5
274*68546e56SEric BiggersSYM_FUNC_START(x25519_fe51_sqr)
275*68546e56SEric Biggers
276*68546e56SEric Biggers	stdu	1,-144(1)
277*68546e56SEric Biggers	std	21,56(1)
278*68546e56SEric Biggers	std	22,64(1)
279*68546e56SEric Biggers	std	23,72(1)
280*68546e56SEric Biggers	std	24,80(1)
281*68546e56SEric Biggers	std	25,88(1)
282*68546e56SEric Biggers	std	26,96(1)
283*68546e56SEric Biggers	std	27,104(1)
284*68546e56SEric Biggers	std	28,112(1)
285*68546e56SEric Biggers	std	29,120(1)
286*68546e56SEric Biggers	std	30,128(1)
287*68546e56SEric Biggers	std	31,136(1)
288*68546e56SEric Biggers
289*68546e56SEric Biggers	ld	7,0(4)
290*68546e56SEric Biggers	ld	8,8(4)
291*68546e56SEric Biggers	ld	9,16(4)
292*68546e56SEric Biggers	ld	10,24(4)
293*68546e56SEric Biggers	ld	11,32(4)
294*68546e56SEric Biggers
295*68546e56SEric Biggers	add	6,7,7
296*68546e56SEric Biggers	mulli	21,11,19
297*68546e56SEric Biggers
298*68546e56SEric Biggers	mulld	22,7,7
299*68546e56SEric Biggers	mulhdu	23,7,7
300*68546e56SEric Biggers	mulld	24,8,6
301*68546e56SEric Biggers	mulhdu	25,8,6
302*68546e56SEric Biggers	mulld	26,9,6
303*68546e56SEric Biggers	mulhdu	27,9,6
304*68546e56SEric Biggers	mulld	28,10,6
305*68546e56SEric Biggers	mulhdu	29,10,6
306*68546e56SEric Biggers	mulld	30,11,6
307*68546e56SEric Biggers	mulhdu	31,11,6
308*68546e56SEric Biggers	add	6,8,8
309*68546e56SEric Biggers	mulld	12,11,21
310*68546e56SEric Biggers	mulhdu	11,11,21
311*68546e56SEric Biggers	addc	28,28,12
312*68546e56SEric Biggers	adde	29,29,11
313*68546e56SEric Biggers
314*68546e56SEric Biggers	mulli	5,10,19
315*68546e56SEric Biggers
316*68546e56SEric Biggers	mulld	12,8,8
317*68546e56SEric Biggers	mulhdu	11,8,8
318*68546e56SEric Biggers	addc	26,26,12
319*68546e56SEric Biggers	adde	27,27,11
320*68546e56SEric Biggers	mulld	12,9,6
321*68546e56SEric Biggers	mulhdu	11,9,6
322*68546e56SEric Biggers	addc	28,28,12
323*68546e56SEric Biggers	adde	29,29,11
324*68546e56SEric Biggers	mulld	12,10,6
325*68546e56SEric Biggers	mulhdu	11,10,6
326*68546e56SEric Biggers	addc	30,30,12
327*68546e56SEric Biggers	adde	31,31,11
328*68546e56SEric Biggers	mulld	12,21,6
329*68546e56SEric Biggers	mulhdu	11,21,6
330*68546e56SEric Biggers	add	6,10,10
331*68546e56SEric Biggers	addc	22,22,12
332*68546e56SEric Biggers	adde	23,23,11
333*68546e56SEric Biggers	mulld	12,10,5
334*68546e56SEric Biggers	mulhdu	10,10,5
335*68546e56SEric Biggers	addc	24,24,12
336*68546e56SEric Biggers	adde	25,25,10
337*68546e56SEric Biggers	mulld	12,6,21
338*68546e56SEric Biggers	mulhdu	10,6,21
339*68546e56SEric Biggers	add	6,9,9
340*68546e56SEric Biggers	addc	26,26,12
341*68546e56SEric Biggers	adde	27,27,10
342*68546e56SEric Biggers
343*68546e56SEric Biggers	mulld	12,9,9
344*68546e56SEric Biggers	mulhdu	10,9,9
345*68546e56SEric Biggers	addc	30,30,12
346*68546e56SEric Biggers	adde	31,31,10
347*68546e56SEric Biggers	mulld	12,5,6
348*68546e56SEric Biggers	mulhdu	10,5,6
349*68546e56SEric Biggers	addc	22,22,12
350*68546e56SEric Biggers	adde	23,23,10
351*68546e56SEric Biggers	mulld	12,21,6
352*68546e56SEric Biggers	mulhdu	10,21,6
353*68546e56SEric Biggers	addc	24,24,12
354*68546e56SEric Biggers	adde	25,25,10
355*68546e56SEric Biggers
356*68546e56SEric Biggers	b	.Lfe51_reduce
357*68546e56SEric BiggersSYM_FUNC_END(x25519_fe51_sqr)
358*68546e56SEric Biggers
359*68546e56SEric Biggers.align	5
360*68546e56SEric BiggersSYM_FUNC_START(x25519_fe51_mul121666)
361*68546e56SEric Biggers
362*68546e56SEric Biggers	stdu	1,-144(1)
363*68546e56SEric Biggers	std	21,56(1)
364*68546e56SEric Biggers	std	22,64(1)
365*68546e56SEric Biggers	std	23,72(1)
366*68546e56SEric Biggers	std	24,80(1)
367*68546e56SEric Biggers	std	25,88(1)
368*68546e56SEric Biggers	std	26,96(1)
369*68546e56SEric Biggers	std	27,104(1)
370*68546e56SEric Biggers	std	28,112(1)
371*68546e56SEric Biggers	std	29,120(1)
372*68546e56SEric Biggers	std	30,128(1)
373*68546e56SEric Biggers	std	31,136(1)
374*68546e56SEric Biggers
375*68546e56SEric Biggers	lis	6,1
376*68546e56SEric Biggers	ori	6,6,56130
377*68546e56SEric Biggers	ld	7,0(4)
378*68546e56SEric Biggers	ld	8,8(4)
379*68546e56SEric Biggers	ld	9,16(4)
380*68546e56SEric Biggers	ld	10,24(4)
381*68546e56SEric Biggers	ld	11,32(4)
382*68546e56SEric Biggers
383*68546e56SEric Biggers	mulld	22,7,6
384*68546e56SEric Biggers	mulhdu	23,7,6
385*68546e56SEric Biggers	mulld	24,8,6
386*68546e56SEric Biggers	mulhdu	25,8,6
387*68546e56SEric Biggers	mulld	26,9,6
388*68546e56SEric Biggers	mulhdu	27,9,6
389*68546e56SEric Biggers	mulld	28,10,6
390*68546e56SEric Biggers	mulhdu	29,10,6
391*68546e56SEric Biggers	mulld	30,11,6
392*68546e56SEric Biggers	mulhdu	31,11,6
393*68546e56SEric Biggers
394*68546e56SEric Biggers	b	.Lfe51_reduce
395*68546e56SEric BiggersSYM_FUNC_END(x25519_fe51_mul121666)
396*68546e56SEric Biggers
397*68546e56SEric Biggers.align	5
398*68546e56SEric BiggersSYM_FUNC_START(x25519_fe51_sqr_times)
399*68546e56SEric Biggers
400*68546e56SEric Biggers	stdu	1,-144(1)
401*68546e56SEric Biggers	std	21,56(1)
402*68546e56SEric Biggers	std	22,64(1)
403*68546e56SEric Biggers	std	23,72(1)
404*68546e56SEric Biggers	std	24,80(1)
405*68546e56SEric Biggers	std	25,88(1)
406*68546e56SEric Biggers	std	26,96(1)
407*68546e56SEric Biggers	std	27,104(1)
408*68546e56SEric Biggers	std	28,112(1)
409*68546e56SEric Biggers	std	29,120(1)
410*68546e56SEric Biggers	std	30,128(1)
411*68546e56SEric Biggers	std	31,136(1)
412*68546e56SEric Biggers
413*68546e56SEric Biggers	ld	7,0(4)
414*68546e56SEric Biggers	ld	8,8(4)
415*68546e56SEric Biggers	ld	9,16(4)
416*68546e56SEric Biggers	ld	10,24(4)
417*68546e56SEric Biggers	ld	11,32(4)
418*68546e56SEric Biggers
419*68546e56SEric Biggers	mtctr	5
420*68546e56SEric Biggers
421*68546e56SEric Biggers.Lsqr_times_loop:
422*68546e56SEric Biggers	add	6,7,7
423*68546e56SEric Biggers	mulli	21,11,19
424*68546e56SEric Biggers
425*68546e56SEric Biggers	mulld	22,7,7
426*68546e56SEric Biggers	mulhdu	23,7,7
427*68546e56SEric Biggers	mulld	24,8,6
428*68546e56SEric Biggers	mulhdu	25,8,6
429*68546e56SEric Biggers	mulld	26,9,6
430*68546e56SEric Biggers	mulhdu	27,9,6
431*68546e56SEric Biggers	mulld	28,10,6
432*68546e56SEric Biggers	mulhdu	29,10,6
433*68546e56SEric Biggers	mulld	30,11,6
434*68546e56SEric Biggers	mulhdu	31,11,6
435*68546e56SEric Biggers	add	6,8,8
436*68546e56SEric Biggers	mulld	12,11,21
437*68546e56SEric Biggers	mulhdu	11,11,21
438*68546e56SEric Biggers	addc	28,28,12
439*68546e56SEric Biggers	adde	29,29,11
440*68546e56SEric Biggers
441*68546e56SEric Biggers	mulli	5,10,19
442*68546e56SEric Biggers
443*68546e56SEric Biggers	mulld	12,8,8
444*68546e56SEric Biggers	mulhdu	11,8,8
445*68546e56SEric Biggers	addc	26,26,12
446*68546e56SEric Biggers	adde	27,27,11
447*68546e56SEric Biggers	mulld	12,9,6
448*68546e56SEric Biggers	mulhdu	11,9,6
449*68546e56SEric Biggers	addc	28,28,12
450*68546e56SEric Biggers	adde	29,29,11
451*68546e56SEric Biggers	mulld	12,10,6
452*68546e56SEric Biggers	mulhdu	11,10,6
453*68546e56SEric Biggers	addc	30,30,12
454*68546e56SEric Biggers	adde	31,31,11
455*68546e56SEric Biggers	mulld	12,21,6
456*68546e56SEric Biggers	mulhdu	11,21,6
457*68546e56SEric Biggers	add	6,10,10
458*68546e56SEric Biggers	addc	22,22,12
459*68546e56SEric Biggers	adde	23,23,11
460*68546e56SEric Biggers	mulld	12,10,5
461*68546e56SEric Biggers	mulhdu	10,10,5
462*68546e56SEric Biggers	addc	24,24,12
463*68546e56SEric Biggers	adde	25,25,10
464*68546e56SEric Biggers	mulld	12,6,21
465*68546e56SEric Biggers	mulhdu	10,6,21
466*68546e56SEric Biggers	add	6,9,9
467*68546e56SEric Biggers	addc	26,26,12
468*68546e56SEric Biggers	adde	27,27,10
469*68546e56SEric Biggers
470*68546e56SEric Biggers	mulld	12,9,9
471*68546e56SEric Biggers	mulhdu	10,9,9
472*68546e56SEric Biggers	addc	30,30,12
473*68546e56SEric Biggers	adde	31,31,10
474*68546e56SEric Biggers	mulld	12,5,6
475*68546e56SEric Biggers	mulhdu	10,5,6
476*68546e56SEric Biggers	addc	22,22,12
477*68546e56SEric Biggers	adde	23,23,10
478*68546e56SEric Biggers	mulld	12,21,6
479*68546e56SEric Biggers	mulhdu	10,21,6
480*68546e56SEric Biggers	addc	24,24,12
481*68546e56SEric Biggers	adde	25,25,10
482*68546e56SEric Biggers
483*68546e56SEric Biggers	# fe51_reduce
484*68546e56SEric Biggers	li	0,-1
485*68546e56SEric Biggers	srdi	0,0,13
486*68546e56SEric Biggers
487*68546e56SEric Biggers	srdi	12,26,51
488*68546e56SEric Biggers	and	9,26,0
489*68546e56SEric Biggers	insrdi	12,27,51,0
490*68546e56SEric Biggers	srdi	21,22,51
491*68546e56SEric Biggers	and	7,22,0
492*68546e56SEric Biggers	insrdi	21,23,51,0
493*68546e56SEric Biggers	addc	28,28,12
494*68546e56SEric Biggers	addze	29,29
495*68546e56SEric Biggers	addc	24,24,21
496*68546e56SEric Biggers	addze	25,25
497*68546e56SEric Biggers
498*68546e56SEric Biggers	srdi	12,28,51
499*68546e56SEric Biggers	and	10,28,0
500*68546e56SEric Biggers	insrdi	12,29,51,0
501*68546e56SEric Biggers	srdi	21,24,51
502*68546e56SEric Biggers	and	8,24,0
503*68546e56SEric Biggers	insrdi	21,25,51,0
504*68546e56SEric Biggers	addc	30,30,12
505*68546e56SEric Biggers	addze	31,31
506*68546e56SEric Biggers	add	9,9,21
507*68546e56SEric Biggers
508*68546e56SEric Biggers	srdi	12,30,51
509*68546e56SEric Biggers	and	11,30,0
510*68546e56SEric Biggers	insrdi	12,31,51,0
511*68546e56SEric Biggers	mulli	12,12,19
512*68546e56SEric Biggers
513*68546e56SEric Biggers	add	7,7,12
514*68546e56SEric Biggers
515*68546e56SEric Biggers	srdi	21,9,51
516*68546e56SEric Biggers	and	9,9,0
517*68546e56SEric Biggers	add	10,10,21
518*68546e56SEric Biggers
519*68546e56SEric Biggers	srdi	12,7,51
520*68546e56SEric Biggers	and	7,7,0
521*68546e56SEric Biggers	add	8,8,12
522*68546e56SEric Biggers
523*68546e56SEric Biggers	bdnz	.Lsqr_times_loop
524*68546e56SEric Biggers
525*68546e56SEric Biggers	std	9,16(3)
526*68546e56SEric Biggers	std	10,24(3)
527*68546e56SEric Biggers	std	11,32(3)
528*68546e56SEric Biggers	std	7,0(3)
529*68546e56SEric Biggers	std	8,8(3)
530*68546e56SEric Biggers
531*68546e56SEric Biggers	ld	21,56(1)
532*68546e56SEric Biggers	ld	22,64(1)
533*68546e56SEric Biggers	ld	23,72(1)
534*68546e56SEric Biggers	ld	24,80(1)
535*68546e56SEric Biggers	ld	25,88(1)
536*68546e56SEric Biggers	ld	26,96(1)
537*68546e56SEric Biggers	ld	27,104(1)
538*68546e56SEric Biggers	ld	28,112(1)
539*68546e56SEric Biggers	ld	29,120(1)
540*68546e56SEric Biggers	ld	30,128(1)
541*68546e56SEric Biggers	ld	31,136(1)
542*68546e56SEric Biggers	addi	1,1,144
543*68546e56SEric Biggers	blr
544*68546e56SEric BiggersSYM_FUNC_END(x25519_fe51_sqr_times)
545*68546e56SEric Biggers
546*68546e56SEric Biggers.align	5
547*68546e56SEric BiggersSYM_FUNC_START(x25519_fe51_frombytes)
548*68546e56SEric Biggers
549*68546e56SEric Biggers	li	12, -1
550*68546e56SEric Biggers	srdi	12, 12, 13	# 0x7ffffffffffff
551*68546e56SEric Biggers
552*68546e56SEric Biggers	ld	5, 0(4)
553*68546e56SEric Biggers	ld	6, 8(4)
554*68546e56SEric Biggers	ld	7, 16(4)
555*68546e56SEric Biggers	ld	8, 24(4)
556*68546e56SEric Biggers
557*68546e56SEric Biggers	srdi	10, 5, 51
558*68546e56SEric Biggers	and	5, 5, 12	# h0
559*68546e56SEric Biggers
560*68546e56SEric Biggers	sldi	11, 6, 13
561*68546e56SEric Biggers	or	11, 10, 11	# h1t
562*68546e56SEric Biggers	srdi	10, 6, 38
563*68546e56SEric Biggers	and	6, 11, 12	# h1
564*68546e56SEric Biggers
565*68546e56SEric Biggers	sldi	11, 7, 26
566*68546e56SEric Biggers	or	10, 10, 11	# h2t
567*68546e56SEric Biggers
568*68546e56SEric Biggers	srdi	11, 7, 25
569*68546e56SEric Biggers	and	7, 10, 12	# h2
570*68546e56SEric Biggers	sldi	10, 8, 39
571*68546e56SEric Biggers	or	11, 11, 10	# h3t
572*68546e56SEric Biggers
573*68546e56SEric Biggers	srdi	9, 8, 12
574*68546e56SEric Biggers	and	8, 11, 12	# h3
575*68546e56SEric Biggers	and	9, 9, 12	# h4
576*68546e56SEric Biggers
577*68546e56SEric Biggers	std	5, 0(3)
578*68546e56SEric Biggers	std	6, 8(3)
579*68546e56SEric Biggers	std	7, 16(3)
580*68546e56SEric Biggers	std	8, 24(3)
581*68546e56SEric Biggers	std	9, 32(3)
582*68546e56SEric Biggers
583*68546e56SEric Biggers	blr
584*68546e56SEric BiggersSYM_FUNC_END(x25519_fe51_frombytes)
585*68546e56SEric Biggers
586*68546e56SEric Biggers.align	5
587*68546e56SEric BiggersSYM_FUNC_START(x25519_fe51_tobytes)
588*68546e56SEric Biggers
589*68546e56SEric Biggers	ld	5, 0(4)
590*68546e56SEric Biggers	ld	6, 8(4)
591*68546e56SEric Biggers	ld	7, 16(4)
592*68546e56SEric Biggers	ld	8, 24(4)
593*68546e56SEric Biggers	ld	9, 32(4)
594*68546e56SEric Biggers
595*68546e56SEric Biggers	li	12, -1
596*68546e56SEric Biggers	srdi	12, 12, 13	# 0x7ffffffffffff
597*68546e56SEric Biggers
598*68546e56SEric Biggers	# Full reducuction
599*68546e56SEric Biggers	addi	10, 5, 19
600*68546e56SEric Biggers	srdi	10, 10, 51
601*68546e56SEric Biggers	add	10, 10, 6
602*68546e56SEric Biggers	srdi	10, 10, 51
603*68546e56SEric Biggers	add	10, 10, 7
604*68546e56SEric Biggers	srdi	10, 10, 51
605*68546e56SEric Biggers	add	10, 10, 8
606*68546e56SEric Biggers	srdi	10, 10, 51
607*68546e56SEric Biggers	add	10, 10, 9
608*68546e56SEric Biggers	srdi	10, 10, 51
609*68546e56SEric Biggers
610*68546e56SEric Biggers	mulli	10, 10, 19
611*68546e56SEric Biggers	add	5, 5, 10
612*68546e56SEric Biggers	srdi	11, 5, 51
613*68546e56SEric Biggers	add	6, 6, 11
614*68546e56SEric Biggers	srdi	11, 6, 51
615*68546e56SEric Biggers	add	7, 7, 11
616*68546e56SEric Biggers	srdi	11, 7, 51
617*68546e56SEric Biggers	add	8, 8, 11
618*68546e56SEric Biggers	srdi	11, 8, 51
619*68546e56SEric Biggers	add	9, 9, 11
620*68546e56SEric Biggers
621*68546e56SEric Biggers	and	5, 5, 12
622*68546e56SEric Biggers	and	6, 6, 12
623*68546e56SEric Biggers	and	7, 7, 12
624*68546e56SEric Biggers	and	8, 8, 12
625*68546e56SEric Biggers	and	9, 9, 12
626*68546e56SEric Biggers
627*68546e56SEric Biggers	sldi	10, 6, 51
628*68546e56SEric Biggers	or	5, 5, 10	# s0
629*68546e56SEric Biggers
630*68546e56SEric Biggers	srdi	11, 6, 13
631*68546e56SEric Biggers	sldi	10, 7, 38
632*68546e56SEric Biggers	or	6, 11, 10	# s1
633*68546e56SEric Biggers
634*68546e56SEric Biggers	srdi	11, 7, 26
635*68546e56SEric Biggers	sldi	10, 8, 25
636*68546e56SEric Biggers	or	7, 11, 10	# s2
637*68546e56SEric Biggers
638*68546e56SEric Biggers	srdi	11, 8, 39
639*68546e56SEric Biggers	sldi	10, 9, 12
640*68546e56SEric Biggers	or	8, 11, 10	# s4
641*68546e56SEric Biggers
642*68546e56SEric Biggers	std	5, 0(3)
643*68546e56SEric Biggers	std	6, 8(3)
644*68546e56SEric Biggers	std	7, 16(3)
645*68546e56SEric Biggers	std	8, 24(3)
646*68546e56SEric Biggers
647*68546e56SEric Biggers	blr
648*68546e56SEric BiggersSYM_FUNC_END(x25519_fe51_tobytes)
649*68546e56SEric Biggers
650*68546e56SEric Biggers.align	5
651*68546e56SEric BiggersSYM_FUNC_START(x25519_cswap)
652*68546e56SEric Biggers
653*68546e56SEric Biggers	li	7, 5
654*68546e56SEric Biggers	neg	6, 5
655*68546e56SEric Biggers	mtctr	7
656*68546e56SEric Biggers
657*68546e56SEric Biggers.Lswap_loop:
658*68546e56SEric Biggers	ld	8, 0(3)
659*68546e56SEric Biggers	ld	9, 0(4)
660*68546e56SEric Biggers	xor	10, 8, 9
661*68546e56SEric Biggers	and	10, 10, 6
662*68546e56SEric Biggers	xor	11, 8, 10
663*68546e56SEric Biggers	xor	12, 9, 10
664*68546e56SEric Biggers	std	11, 0(3)
665*68546e56SEric Biggers	addi	3, 3, 8
666*68546e56SEric Biggers	std	12, 0(4)
667*68546e56SEric Biggers	addi	4, 4, 8
668*68546e56SEric Biggers	bdnz	.Lswap_loop
669*68546e56SEric Biggers
670*68546e56SEric Biggers	blr
671*68546e56SEric BiggersSYM_FUNC_END(x25519_cswap)
672