xref: /linux/arch/s390/crypto/chacha-s390.S (revision b087dfab)
1*b087dfabSPatrick Steuer/* SPDX-License-Identifier: GPL-2.0 */
2*b087dfabSPatrick Steuer/*
3*b087dfabSPatrick Steuer * Original implementation written by Andy Polyakov, @dot-asm.
4*b087dfabSPatrick Steuer * This is an adaptation of the original code for kernel use.
5*b087dfabSPatrick Steuer *
6*b087dfabSPatrick Steuer * Copyright (C) 2006-2019 CRYPTOGAMS by <appro@openssl.org>. All Rights Reserved.
7*b087dfabSPatrick Steuer */
8*b087dfabSPatrick Steuer
9*b087dfabSPatrick Steuer#include <linux/linkage.h>
10*b087dfabSPatrick Steuer#include <asm/nospec-insn.h>
11*b087dfabSPatrick Steuer#include <asm/vx-insn.h>
12*b087dfabSPatrick Steuer
13*b087dfabSPatrick Steuer#define SP	%r15
14*b087dfabSPatrick Steuer#define FRAME	(16 * 8 + 4 * 8)
15*b087dfabSPatrick Steuer
16*b087dfabSPatrick Steuer.data
17*b087dfabSPatrick Steuer.align	32
18*b087dfabSPatrick Steuer
19*b087dfabSPatrick Steuer.Lsigma:
20*b087dfabSPatrick Steuer.long	0x61707865,0x3320646e,0x79622d32,0x6b206574	# endian-neutral
21*b087dfabSPatrick Steuer.long	1,0,0,0
22*b087dfabSPatrick Steuer.long	2,0,0,0
23*b087dfabSPatrick Steuer.long	3,0,0,0
24*b087dfabSPatrick Steuer.long	0x03020100,0x07060504,0x0b0a0908,0x0f0e0d0c	# byte swap
25*b087dfabSPatrick Steuer
26*b087dfabSPatrick Steuer.long	0,1,2,3
27*b087dfabSPatrick Steuer.long	0x61707865,0x61707865,0x61707865,0x61707865	# smashed sigma
28*b087dfabSPatrick Steuer.long	0x3320646e,0x3320646e,0x3320646e,0x3320646e
29*b087dfabSPatrick Steuer.long	0x79622d32,0x79622d32,0x79622d32,0x79622d32
30*b087dfabSPatrick Steuer.long	0x6b206574,0x6b206574,0x6b206574,0x6b206574
31*b087dfabSPatrick Steuer
32*b087dfabSPatrick Steuer.previous
33*b087dfabSPatrick Steuer
34*b087dfabSPatrick Steuer	GEN_BR_THUNK %r14
35*b087dfabSPatrick Steuer
36*b087dfabSPatrick Steuer.text
37*b087dfabSPatrick Steuer
38*b087dfabSPatrick Steuer#############################################################################
39*b087dfabSPatrick Steuer# void chacha20_vx_4x(u8 *out, counst u8 *inp, size_t len,
40*b087dfabSPatrick Steuer#		      counst u32 *key, const u32 *counter)
41*b087dfabSPatrick Steuer
42*b087dfabSPatrick Steuer#define	OUT		%r2
43*b087dfabSPatrick Steuer#define	INP		%r3
44*b087dfabSPatrick Steuer#define	LEN		%r4
45*b087dfabSPatrick Steuer#define	KEY		%r5
46*b087dfabSPatrick Steuer#define	COUNTER		%r6
47*b087dfabSPatrick Steuer
48*b087dfabSPatrick Steuer#define BEPERM		%v31
49*b087dfabSPatrick Steuer#define CTR		%v26
50*b087dfabSPatrick Steuer
51*b087dfabSPatrick Steuer#define K0		%v16
52*b087dfabSPatrick Steuer#define K1		%v17
53*b087dfabSPatrick Steuer#define K2		%v18
54*b087dfabSPatrick Steuer#define K3		%v19
55*b087dfabSPatrick Steuer
56*b087dfabSPatrick Steuer#define XA0		%v0
57*b087dfabSPatrick Steuer#define XA1		%v1
58*b087dfabSPatrick Steuer#define XA2		%v2
59*b087dfabSPatrick Steuer#define XA3		%v3
60*b087dfabSPatrick Steuer
61*b087dfabSPatrick Steuer#define XB0		%v4
62*b087dfabSPatrick Steuer#define XB1		%v5
63*b087dfabSPatrick Steuer#define XB2		%v6
64*b087dfabSPatrick Steuer#define XB3		%v7
65*b087dfabSPatrick Steuer
66*b087dfabSPatrick Steuer#define XC0		%v8
67*b087dfabSPatrick Steuer#define XC1		%v9
68*b087dfabSPatrick Steuer#define XC2		%v10
69*b087dfabSPatrick Steuer#define XC3		%v11
70*b087dfabSPatrick Steuer
71*b087dfabSPatrick Steuer#define XD0		%v12
72*b087dfabSPatrick Steuer#define XD1		%v13
73*b087dfabSPatrick Steuer#define XD2		%v14
74*b087dfabSPatrick Steuer#define XD3		%v15
75*b087dfabSPatrick Steuer
76*b087dfabSPatrick Steuer#define XT0		%v27
77*b087dfabSPatrick Steuer#define XT1		%v28
78*b087dfabSPatrick Steuer#define XT2		%v29
79*b087dfabSPatrick Steuer#define XT3		%v30
80*b087dfabSPatrick Steuer
81*b087dfabSPatrick SteuerENTRY(chacha20_vx_4x)
82*b087dfabSPatrick Steuer	stmg	%r6,%r7,6*8(SP)
83*b087dfabSPatrick Steuer
84*b087dfabSPatrick Steuer	larl	%r7,.Lsigma
85*b087dfabSPatrick Steuer	lhi	%r0,10
86*b087dfabSPatrick Steuer	lhi	%r1,0
87*b087dfabSPatrick Steuer
88*b087dfabSPatrick Steuer	VL	K0,0,,%r7		# load sigma
89*b087dfabSPatrick Steuer	VL	K1,0,,KEY		# load key
90*b087dfabSPatrick Steuer	VL	K2,16,,KEY
91*b087dfabSPatrick Steuer	VL	K3,0,,COUNTER		# load counter
92*b087dfabSPatrick Steuer
93*b087dfabSPatrick Steuer	VL	BEPERM,0x40,,%r7
94*b087dfabSPatrick Steuer	VL	CTR,0x50,,%r7
95*b087dfabSPatrick Steuer
96*b087dfabSPatrick Steuer	VLM	XA0,XA3,0x60,%r7,4	# load [smashed] sigma
97*b087dfabSPatrick Steuer
98*b087dfabSPatrick Steuer	VREPF	XB0,K1,0		# smash the key
99*b087dfabSPatrick Steuer	VREPF	XB1,K1,1
100*b087dfabSPatrick Steuer	VREPF	XB2,K1,2
101*b087dfabSPatrick Steuer	VREPF	XB3,K1,3
102*b087dfabSPatrick Steuer
103*b087dfabSPatrick Steuer	VREPF	XD0,K3,0
104*b087dfabSPatrick Steuer	VREPF	XD1,K3,1
105*b087dfabSPatrick Steuer	VREPF	XD2,K3,2
106*b087dfabSPatrick Steuer	VREPF	XD3,K3,3
107*b087dfabSPatrick Steuer	VAF	XD0,XD0,CTR
108*b087dfabSPatrick Steuer
109*b087dfabSPatrick Steuer	VREPF	XC0,K2,0
110*b087dfabSPatrick Steuer	VREPF	XC1,K2,1
111*b087dfabSPatrick Steuer	VREPF	XC2,K2,2
112*b087dfabSPatrick Steuer	VREPF	XC3,K2,3
113*b087dfabSPatrick Steuer
114*b087dfabSPatrick Steuer.Loop_4x:
115*b087dfabSPatrick Steuer	VAF	XA0,XA0,XB0
116*b087dfabSPatrick Steuer	VX	XD0,XD0,XA0
117*b087dfabSPatrick Steuer	VERLLF	XD0,XD0,16
118*b087dfabSPatrick Steuer
119*b087dfabSPatrick Steuer	VAF	XA1,XA1,XB1
120*b087dfabSPatrick Steuer	VX	XD1,XD1,XA1
121*b087dfabSPatrick Steuer	VERLLF	XD1,XD1,16
122*b087dfabSPatrick Steuer
123*b087dfabSPatrick Steuer	VAF	XA2,XA2,XB2
124*b087dfabSPatrick Steuer	VX	XD2,XD2,XA2
125*b087dfabSPatrick Steuer	VERLLF	XD2,XD2,16
126*b087dfabSPatrick Steuer
127*b087dfabSPatrick Steuer	VAF	XA3,XA3,XB3
128*b087dfabSPatrick Steuer	VX	XD3,XD3,XA3
129*b087dfabSPatrick Steuer	VERLLF	XD3,XD3,16
130*b087dfabSPatrick Steuer
131*b087dfabSPatrick Steuer	VAF	XC0,XC0,XD0
132*b087dfabSPatrick Steuer	VX	XB0,XB0,XC0
133*b087dfabSPatrick Steuer	VERLLF	XB0,XB0,12
134*b087dfabSPatrick Steuer
135*b087dfabSPatrick Steuer	VAF	XC1,XC1,XD1
136*b087dfabSPatrick Steuer	VX	XB1,XB1,XC1
137*b087dfabSPatrick Steuer	VERLLF	XB1,XB1,12
138*b087dfabSPatrick Steuer
139*b087dfabSPatrick Steuer	VAF	XC2,XC2,XD2
140*b087dfabSPatrick Steuer	VX	XB2,XB2,XC2
141*b087dfabSPatrick Steuer	VERLLF	XB2,XB2,12
142*b087dfabSPatrick Steuer
143*b087dfabSPatrick Steuer	VAF	XC3,XC3,XD3
144*b087dfabSPatrick Steuer	VX	XB3,XB3,XC3
145*b087dfabSPatrick Steuer	VERLLF	XB3,XB3,12
146*b087dfabSPatrick Steuer
147*b087dfabSPatrick Steuer	VAF	XA0,XA0,XB0
148*b087dfabSPatrick Steuer	VX	XD0,XD0,XA0
149*b087dfabSPatrick Steuer	VERLLF	XD0,XD0,8
150*b087dfabSPatrick Steuer
151*b087dfabSPatrick Steuer	VAF	XA1,XA1,XB1
152*b087dfabSPatrick Steuer	VX	XD1,XD1,XA1
153*b087dfabSPatrick Steuer	VERLLF	XD1,XD1,8
154*b087dfabSPatrick Steuer
155*b087dfabSPatrick Steuer	VAF	XA2,XA2,XB2
156*b087dfabSPatrick Steuer	VX	XD2,XD2,XA2
157*b087dfabSPatrick Steuer	VERLLF	XD2,XD2,8
158*b087dfabSPatrick Steuer
159*b087dfabSPatrick Steuer	VAF	XA3,XA3,XB3
160*b087dfabSPatrick Steuer	VX	XD3,XD3,XA3
161*b087dfabSPatrick Steuer	VERLLF	XD3,XD3,8
162*b087dfabSPatrick Steuer
163*b087dfabSPatrick Steuer	VAF	XC0,XC0,XD0
164*b087dfabSPatrick Steuer	VX	XB0,XB0,XC0
165*b087dfabSPatrick Steuer	VERLLF	XB0,XB0,7
166*b087dfabSPatrick Steuer
167*b087dfabSPatrick Steuer	VAF	XC1,XC1,XD1
168*b087dfabSPatrick Steuer	VX	XB1,XB1,XC1
169*b087dfabSPatrick Steuer	VERLLF	XB1,XB1,7
170*b087dfabSPatrick Steuer
171*b087dfabSPatrick Steuer	VAF	XC2,XC2,XD2
172*b087dfabSPatrick Steuer	VX	XB2,XB2,XC2
173*b087dfabSPatrick Steuer	VERLLF	XB2,XB2,7
174*b087dfabSPatrick Steuer
175*b087dfabSPatrick Steuer	VAF	XC3,XC3,XD3
176*b087dfabSPatrick Steuer	VX	XB3,XB3,XC3
177*b087dfabSPatrick Steuer	VERLLF	XB3,XB3,7
178*b087dfabSPatrick Steuer
179*b087dfabSPatrick Steuer	VAF	XA0,XA0,XB1
180*b087dfabSPatrick Steuer	VX	XD3,XD3,XA0
181*b087dfabSPatrick Steuer	VERLLF	XD3,XD3,16
182*b087dfabSPatrick Steuer
183*b087dfabSPatrick Steuer	VAF	XA1,XA1,XB2
184*b087dfabSPatrick Steuer	VX	XD0,XD0,XA1
185*b087dfabSPatrick Steuer	VERLLF	XD0,XD0,16
186*b087dfabSPatrick Steuer
187*b087dfabSPatrick Steuer	VAF	XA2,XA2,XB3
188*b087dfabSPatrick Steuer	VX	XD1,XD1,XA2
189*b087dfabSPatrick Steuer	VERLLF	XD1,XD1,16
190*b087dfabSPatrick Steuer
191*b087dfabSPatrick Steuer	VAF	XA3,XA3,XB0
192*b087dfabSPatrick Steuer	VX	XD2,XD2,XA3
193*b087dfabSPatrick Steuer	VERLLF	XD2,XD2,16
194*b087dfabSPatrick Steuer
195*b087dfabSPatrick Steuer	VAF	XC2,XC2,XD3
196*b087dfabSPatrick Steuer	VX	XB1,XB1,XC2
197*b087dfabSPatrick Steuer	VERLLF	XB1,XB1,12
198*b087dfabSPatrick Steuer
199*b087dfabSPatrick Steuer	VAF	XC3,XC3,XD0
200*b087dfabSPatrick Steuer	VX	XB2,XB2,XC3
201*b087dfabSPatrick Steuer	VERLLF	XB2,XB2,12
202*b087dfabSPatrick Steuer
203*b087dfabSPatrick Steuer	VAF	XC0,XC0,XD1
204*b087dfabSPatrick Steuer	VX	XB3,XB3,XC0
205*b087dfabSPatrick Steuer	VERLLF	XB3,XB3,12
206*b087dfabSPatrick Steuer
207*b087dfabSPatrick Steuer	VAF	XC1,XC1,XD2
208*b087dfabSPatrick Steuer	VX	XB0,XB0,XC1
209*b087dfabSPatrick Steuer	VERLLF	XB0,XB0,12
210*b087dfabSPatrick Steuer
211*b087dfabSPatrick Steuer	VAF	XA0,XA0,XB1
212*b087dfabSPatrick Steuer	VX	XD3,XD3,XA0
213*b087dfabSPatrick Steuer	VERLLF	XD3,XD3,8
214*b087dfabSPatrick Steuer
215*b087dfabSPatrick Steuer	VAF	XA1,XA1,XB2
216*b087dfabSPatrick Steuer	VX	XD0,XD0,XA1
217*b087dfabSPatrick Steuer	VERLLF	XD0,XD0,8
218*b087dfabSPatrick Steuer
219*b087dfabSPatrick Steuer	VAF	XA2,XA2,XB3
220*b087dfabSPatrick Steuer	VX	XD1,XD1,XA2
221*b087dfabSPatrick Steuer	VERLLF	XD1,XD1,8
222*b087dfabSPatrick Steuer
223*b087dfabSPatrick Steuer	VAF	XA3,XA3,XB0
224*b087dfabSPatrick Steuer	VX	XD2,XD2,XA3
225*b087dfabSPatrick Steuer	VERLLF	XD2,XD2,8
226*b087dfabSPatrick Steuer
227*b087dfabSPatrick Steuer	VAF	XC2,XC2,XD3
228*b087dfabSPatrick Steuer	VX	XB1,XB1,XC2
229*b087dfabSPatrick Steuer	VERLLF	XB1,XB1,7
230*b087dfabSPatrick Steuer
231*b087dfabSPatrick Steuer	VAF	XC3,XC3,XD0
232*b087dfabSPatrick Steuer	VX	XB2,XB2,XC3
233*b087dfabSPatrick Steuer	VERLLF	XB2,XB2,7
234*b087dfabSPatrick Steuer
235*b087dfabSPatrick Steuer	VAF	XC0,XC0,XD1
236*b087dfabSPatrick Steuer	VX	XB3,XB3,XC0
237*b087dfabSPatrick Steuer	VERLLF	XB3,XB3,7
238*b087dfabSPatrick Steuer
239*b087dfabSPatrick Steuer	VAF	XC1,XC1,XD2
240*b087dfabSPatrick Steuer	VX	XB0,XB0,XC1
241*b087dfabSPatrick Steuer	VERLLF	XB0,XB0,7
242*b087dfabSPatrick Steuer	brct	%r0,.Loop_4x
243*b087dfabSPatrick Steuer
244*b087dfabSPatrick Steuer	VAF	XD0,XD0,CTR
245*b087dfabSPatrick Steuer
246*b087dfabSPatrick Steuer	VMRHF	XT0,XA0,XA1		# transpose data
247*b087dfabSPatrick Steuer	VMRHF	XT1,XA2,XA3
248*b087dfabSPatrick Steuer	VMRLF	XT2,XA0,XA1
249*b087dfabSPatrick Steuer	VMRLF	XT3,XA2,XA3
250*b087dfabSPatrick Steuer	VPDI	XA0,XT0,XT1,0b0000
251*b087dfabSPatrick Steuer	VPDI	XA1,XT0,XT1,0b0101
252*b087dfabSPatrick Steuer	VPDI	XA2,XT2,XT3,0b0000
253*b087dfabSPatrick Steuer	VPDI	XA3,XT2,XT3,0b0101
254*b087dfabSPatrick Steuer
255*b087dfabSPatrick Steuer	VMRHF	XT0,XB0,XB1
256*b087dfabSPatrick Steuer	VMRHF	XT1,XB2,XB3
257*b087dfabSPatrick Steuer	VMRLF	XT2,XB0,XB1
258*b087dfabSPatrick Steuer	VMRLF	XT3,XB2,XB3
259*b087dfabSPatrick Steuer	VPDI	XB0,XT0,XT1,0b0000
260*b087dfabSPatrick Steuer	VPDI	XB1,XT0,XT1,0b0101
261*b087dfabSPatrick Steuer	VPDI	XB2,XT2,XT3,0b0000
262*b087dfabSPatrick Steuer	VPDI	XB3,XT2,XT3,0b0101
263*b087dfabSPatrick Steuer
264*b087dfabSPatrick Steuer	VMRHF	XT0,XC0,XC1
265*b087dfabSPatrick Steuer	VMRHF	XT1,XC2,XC3
266*b087dfabSPatrick Steuer	VMRLF	XT2,XC0,XC1
267*b087dfabSPatrick Steuer	VMRLF	XT3,XC2,XC3
268*b087dfabSPatrick Steuer	VPDI	XC0,XT0,XT1,0b0000
269*b087dfabSPatrick Steuer	VPDI	XC1,XT0,XT1,0b0101
270*b087dfabSPatrick Steuer	VPDI	XC2,XT2,XT3,0b0000
271*b087dfabSPatrick Steuer	VPDI	XC3,XT2,XT3,0b0101
272*b087dfabSPatrick Steuer
273*b087dfabSPatrick Steuer	VMRHF	XT0,XD0,XD1
274*b087dfabSPatrick Steuer	VMRHF	XT1,XD2,XD3
275*b087dfabSPatrick Steuer	VMRLF	XT2,XD0,XD1
276*b087dfabSPatrick Steuer	VMRLF	XT3,XD2,XD3
277*b087dfabSPatrick Steuer	VPDI	XD0,XT0,XT1,0b0000
278*b087dfabSPatrick Steuer	VPDI	XD1,XT0,XT1,0b0101
279*b087dfabSPatrick Steuer	VPDI	XD2,XT2,XT3,0b0000
280*b087dfabSPatrick Steuer	VPDI	XD3,XT2,XT3,0b0101
281*b087dfabSPatrick Steuer
282*b087dfabSPatrick Steuer	VAF	XA0,XA0,K0
283*b087dfabSPatrick Steuer	VAF	XB0,XB0,K1
284*b087dfabSPatrick Steuer	VAF	XC0,XC0,K2
285*b087dfabSPatrick Steuer	VAF	XD0,XD0,K3
286*b087dfabSPatrick Steuer
287*b087dfabSPatrick Steuer	VPERM	XA0,XA0,XA0,BEPERM
288*b087dfabSPatrick Steuer	VPERM	XB0,XB0,XB0,BEPERM
289*b087dfabSPatrick Steuer	VPERM	XC0,XC0,XC0,BEPERM
290*b087dfabSPatrick Steuer	VPERM	XD0,XD0,XD0,BEPERM
291*b087dfabSPatrick Steuer
292*b087dfabSPatrick Steuer	VLM	XT0,XT3,0,INP,0
293*b087dfabSPatrick Steuer
294*b087dfabSPatrick Steuer	VX	XT0,XT0,XA0
295*b087dfabSPatrick Steuer	VX	XT1,XT1,XB0
296*b087dfabSPatrick Steuer	VX	XT2,XT2,XC0
297*b087dfabSPatrick Steuer	VX	XT3,XT3,XD0
298*b087dfabSPatrick Steuer
299*b087dfabSPatrick Steuer	VSTM	XT0,XT3,0,OUT,0
300*b087dfabSPatrick Steuer
301*b087dfabSPatrick Steuer	la	INP,0x40(INP)
302*b087dfabSPatrick Steuer	la	OUT,0x40(OUT)
303*b087dfabSPatrick Steuer	aghi	LEN,-0x40
304*b087dfabSPatrick Steuer
305*b087dfabSPatrick Steuer	VAF	XA0,XA1,K0
306*b087dfabSPatrick Steuer	VAF	XB0,XB1,K1
307*b087dfabSPatrick Steuer	VAF	XC0,XC1,K2
308*b087dfabSPatrick Steuer	VAF	XD0,XD1,K3
309*b087dfabSPatrick Steuer
310*b087dfabSPatrick Steuer	VPERM	XA0,XA0,XA0,BEPERM
311*b087dfabSPatrick Steuer	VPERM	XB0,XB0,XB0,BEPERM
312*b087dfabSPatrick Steuer	VPERM	XC0,XC0,XC0,BEPERM
313*b087dfabSPatrick Steuer	VPERM	XD0,XD0,XD0,BEPERM
314*b087dfabSPatrick Steuer
315*b087dfabSPatrick Steuer	clgfi	LEN,0x40
316*b087dfabSPatrick Steuer	jl	.Ltail_4x
317*b087dfabSPatrick Steuer
318*b087dfabSPatrick Steuer	VLM	XT0,XT3,0,INP,0
319*b087dfabSPatrick Steuer
320*b087dfabSPatrick Steuer	VX	XT0,XT0,XA0
321*b087dfabSPatrick Steuer	VX	XT1,XT1,XB0
322*b087dfabSPatrick Steuer	VX	XT2,XT2,XC0
323*b087dfabSPatrick Steuer	VX	XT3,XT3,XD0
324*b087dfabSPatrick Steuer
325*b087dfabSPatrick Steuer	VSTM	XT0,XT3,0,OUT,0
326*b087dfabSPatrick Steuer
327*b087dfabSPatrick Steuer	la	INP,0x40(INP)
328*b087dfabSPatrick Steuer	la	OUT,0x40(OUT)
329*b087dfabSPatrick Steuer	aghi	LEN,-0x40
330*b087dfabSPatrick Steuer	je	.Ldone_4x
331*b087dfabSPatrick Steuer
332*b087dfabSPatrick Steuer	VAF	XA0,XA2,K0
333*b087dfabSPatrick Steuer	VAF	XB0,XB2,K1
334*b087dfabSPatrick Steuer	VAF	XC0,XC2,K2
335*b087dfabSPatrick Steuer	VAF	XD0,XD2,K3
336*b087dfabSPatrick Steuer
337*b087dfabSPatrick Steuer	VPERM	XA0,XA0,XA0,BEPERM
338*b087dfabSPatrick Steuer	VPERM	XB0,XB0,XB0,BEPERM
339*b087dfabSPatrick Steuer	VPERM	XC0,XC0,XC0,BEPERM
340*b087dfabSPatrick Steuer	VPERM	XD0,XD0,XD0,BEPERM
341*b087dfabSPatrick Steuer
342*b087dfabSPatrick Steuer	clgfi	LEN,0x40
343*b087dfabSPatrick Steuer	jl	.Ltail_4x
344*b087dfabSPatrick Steuer
345*b087dfabSPatrick Steuer	VLM	XT0,XT3,0,INP,0
346*b087dfabSPatrick Steuer
347*b087dfabSPatrick Steuer	VX	XT0,XT0,XA0
348*b087dfabSPatrick Steuer	VX	XT1,XT1,XB0
349*b087dfabSPatrick Steuer	VX	XT2,XT2,XC0
350*b087dfabSPatrick Steuer	VX	XT3,XT3,XD0
351*b087dfabSPatrick Steuer
352*b087dfabSPatrick Steuer	VSTM	XT0,XT3,0,OUT,0
353*b087dfabSPatrick Steuer
354*b087dfabSPatrick Steuer	la	INP,0x40(INP)
355*b087dfabSPatrick Steuer	la	OUT,0x40(OUT)
356*b087dfabSPatrick Steuer	aghi	LEN,-0x40
357*b087dfabSPatrick Steuer	je	.Ldone_4x
358*b087dfabSPatrick Steuer
359*b087dfabSPatrick Steuer	VAF	XA0,XA3,K0
360*b087dfabSPatrick Steuer	VAF	XB0,XB3,K1
361*b087dfabSPatrick Steuer	VAF	XC0,XC3,K2
362*b087dfabSPatrick Steuer	VAF	XD0,XD3,K3
363*b087dfabSPatrick Steuer
364*b087dfabSPatrick Steuer	VPERM	XA0,XA0,XA0,BEPERM
365*b087dfabSPatrick Steuer	VPERM	XB0,XB0,XB0,BEPERM
366*b087dfabSPatrick Steuer	VPERM	XC0,XC0,XC0,BEPERM
367*b087dfabSPatrick Steuer	VPERM	XD0,XD0,XD0,BEPERM
368*b087dfabSPatrick Steuer
369*b087dfabSPatrick Steuer	clgfi	LEN,0x40
370*b087dfabSPatrick Steuer	jl	.Ltail_4x
371*b087dfabSPatrick Steuer
372*b087dfabSPatrick Steuer	VLM	XT0,XT3,0,INP,0
373*b087dfabSPatrick Steuer
374*b087dfabSPatrick Steuer	VX	XT0,XT0,XA0
375*b087dfabSPatrick Steuer	VX	XT1,XT1,XB0
376*b087dfabSPatrick Steuer	VX	XT2,XT2,XC0
377*b087dfabSPatrick Steuer	VX	XT3,XT3,XD0
378*b087dfabSPatrick Steuer
379*b087dfabSPatrick Steuer	VSTM	XT0,XT3,0,OUT,0
380*b087dfabSPatrick Steuer
381*b087dfabSPatrick Steuer.Ldone_4x:
382*b087dfabSPatrick Steuer	lmg	%r6,%r7,6*8(SP)
383*b087dfabSPatrick Steuer	BR_EX	%r14
384*b087dfabSPatrick Steuer
385*b087dfabSPatrick Steuer.Ltail_4x:
386*b087dfabSPatrick Steuer	VLR	XT0,XC0
387*b087dfabSPatrick Steuer	VLR	XT1,XD0
388*b087dfabSPatrick Steuer
389*b087dfabSPatrick Steuer	VST	XA0,8*8+0x00,,SP
390*b087dfabSPatrick Steuer	VST	XB0,8*8+0x10,,SP
391*b087dfabSPatrick Steuer	VST	XT0,8*8+0x20,,SP
392*b087dfabSPatrick Steuer	VST	XT1,8*8+0x30,,SP
393*b087dfabSPatrick Steuer
394*b087dfabSPatrick Steuer	lghi	%r1,0
395*b087dfabSPatrick Steuer
396*b087dfabSPatrick Steuer.Loop_tail_4x:
397*b087dfabSPatrick Steuer	llgc	%r5,0(%r1,INP)
398*b087dfabSPatrick Steuer	llgc	%r6,8*8(%r1,SP)
399*b087dfabSPatrick Steuer	xr	%r6,%r5
400*b087dfabSPatrick Steuer	stc	%r6,0(%r1,OUT)
401*b087dfabSPatrick Steuer	la	%r1,1(%r1)
402*b087dfabSPatrick Steuer	brct	LEN,.Loop_tail_4x
403*b087dfabSPatrick Steuer
404*b087dfabSPatrick Steuer	lmg	%r6,%r7,6*8(SP)
405*b087dfabSPatrick Steuer	BR_EX	%r14
406*b087dfabSPatrick SteuerENDPROC(chacha20_vx_4x)
407*b087dfabSPatrick Steuer
408*b087dfabSPatrick Steuer#undef	OUT
409*b087dfabSPatrick Steuer#undef	INP
410*b087dfabSPatrick Steuer#undef	LEN
411*b087dfabSPatrick Steuer#undef	KEY
412*b087dfabSPatrick Steuer#undef	COUNTER
413*b087dfabSPatrick Steuer
414*b087dfabSPatrick Steuer#undef BEPERM
415*b087dfabSPatrick Steuer
416*b087dfabSPatrick Steuer#undef K0
417*b087dfabSPatrick Steuer#undef K1
418*b087dfabSPatrick Steuer#undef K2
419*b087dfabSPatrick Steuer#undef K3
420*b087dfabSPatrick Steuer
421*b087dfabSPatrick Steuer
422*b087dfabSPatrick Steuer#############################################################################
423*b087dfabSPatrick Steuer# void chacha20_vx(u8 *out, counst u8 *inp, size_t len,
424*b087dfabSPatrick Steuer#		   counst u32 *key, const u32 *counter)
425*b087dfabSPatrick Steuer
426*b087dfabSPatrick Steuer#define	OUT		%r2
427*b087dfabSPatrick Steuer#define	INP		%r3
428*b087dfabSPatrick Steuer#define	LEN		%r4
429*b087dfabSPatrick Steuer#define	KEY		%r5
430*b087dfabSPatrick Steuer#define	COUNTER		%r6
431*b087dfabSPatrick Steuer
432*b087dfabSPatrick Steuer#define BEPERM		%v31
433*b087dfabSPatrick Steuer
434*b087dfabSPatrick Steuer#define K0		%v27
435*b087dfabSPatrick Steuer#define K1		%v24
436*b087dfabSPatrick Steuer#define K2		%v25
437*b087dfabSPatrick Steuer#define K3		%v26
438*b087dfabSPatrick Steuer
439*b087dfabSPatrick Steuer#define A0		%v0
440*b087dfabSPatrick Steuer#define B0		%v1
441*b087dfabSPatrick Steuer#define C0		%v2
442*b087dfabSPatrick Steuer#define D0		%v3
443*b087dfabSPatrick Steuer
444*b087dfabSPatrick Steuer#define A1		%v4
445*b087dfabSPatrick Steuer#define B1		%v5
446*b087dfabSPatrick Steuer#define C1		%v6
447*b087dfabSPatrick Steuer#define D1		%v7
448*b087dfabSPatrick Steuer
449*b087dfabSPatrick Steuer#define A2		%v8
450*b087dfabSPatrick Steuer#define B2		%v9
451*b087dfabSPatrick Steuer#define C2		%v10
452*b087dfabSPatrick Steuer#define D2		%v11
453*b087dfabSPatrick Steuer
454*b087dfabSPatrick Steuer#define A3		%v12
455*b087dfabSPatrick Steuer#define B3		%v13
456*b087dfabSPatrick Steuer#define C3		%v14
457*b087dfabSPatrick Steuer#define D3		%v15
458*b087dfabSPatrick Steuer
459*b087dfabSPatrick Steuer#define A4		%v16
460*b087dfabSPatrick Steuer#define B4		%v17
461*b087dfabSPatrick Steuer#define C4		%v18
462*b087dfabSPatrick Steuer#define D4		%v19
463*b087dfabSPatrick Steuer
464*b087dfabSPatrick Steuer#define A5		%v20
465*b087dfabSPatrick Steuer#define B5		%v21
466*b087dfabSPatrick Steuer#define C5		%v22
467*b087dfabSPatrick Steuer#define D5		%v23
468*b087dfabSPatrick Steuer
469*b087dfabSPatrick Steuer#define T0		%v27
470*b087dfabSPatrick Steuer#define T1		%v28
471*b087dfabSPatrick Steuer#define T2		%v29
472*b087dfabSPatrick Steuer#define T3		%v30
473*b087dfabSPatrick Steuer
474*b087dfabSPatrick SteuerENTRY(chacha20_vx)
475*b087dfabSPatrick Steuer	clgfi	LEN,256
476*b087dfabSPatrick Steuer	jle	chacha20_vx_4x
477*b087dfabSPatrick Steuer	stmg	%r6,%r7,6*8(SP)
478*b087dfabSPatrick Steuer
479*b087dfabSPatrick Steuer	lghi	%r1,-FRAME
480*b087dfabSPatrick Steuer	lgr	%r0,SP
481*b087dfabSPatrick Steuer	la	SP,0(%r1,SP)
482*b087dfabSPatrick Steuer	stg	%r0,0(SP)		# back-chain
483*b087dfabSPatrick Steuer
484*b087dfabSPatrick Steuer	larl	%r7,.Lsigma
485*b087dfabSPatrick Steuer	lhi	%r0,10
486*b087dfabSPatrick Steuer
487*b087dfabSPatrick Steuer	VLM	K1,K2,0,KEY,0		# load key
488*b087dfabSPatrick Steuer	VL	K3,0,,COUNTER		# load counter
489*b087dfabSPatrick Steuer
490*b087dfabSPatrick Steuer	VLM	K0,BEPERM,0,%r7,4	# load sigma, increments, ...
491*b087dfabSPatrick Steuer
492*b087dfabSPatrick Steuer.Loop_outer_vx:
493*b087dfabSPatrick Steuer	VLR	A0,K0
494*b087dfabSPatrick Steuer	VLR	B0,K1
495*b087dfabSPatrick Steuer	VLR	A1,K0
496*b087dfabSPatrick Steuer	VLR	B1,K1
497*b087dfabSPatrick Steuer	VLR	A2,K0
498*b087dfabSPatrick Steuer	VLR	B2,K1
499*b087dfabSPatrick Steuer	VLR	A3,K0
500*b087dfabSPatrick Steuer	VLR	B3,K1
501*b087dfabSPatrick Steuer	VLR	A4,K0
502*b087dfabSPatrick Steuer	VLR	B4,K1
503*b087dfabSPatrick Steuer	VLR	A5,K0
504*b087dfabSPatrick Steuer	VLR	B5,K1
505*b087dfabSPatrick Steuer
506*b087dfabSPatrick Steuer	VLR	D0,K3
507*b087dfabSPatrick Steuer	VAF	D1,K3,T1		# K[3]+1
508*b087dfabSPatrick Steuer	VAF	D2,K3,T2		# K[3]+2
509*b087dfabSPatrick Steuer	VAF	D3,K3,T3		# K[3]+3
510*b087dfabSPatrick Steuer	VAF	D4,D2,T2		# K[3]+4
511*b087dfabSPatrick Steuer	VAF	D5,D2,T3		# K[3]+5
512*b087dfabSPatrick Steuer
513*b087dfabSPatrick Steuer	VLR	C0,K2
514*b087dfabSPatrick Steuer	VLR	C1,K2
515*b087dfabSPatrick Steuer	VLR	C2,K2
516*b087dfabSPatrick Steuer	VLR	C3,K2
517*b087dfabSPatrick Steuer	VLR	C4,K2
518*b087dfabSPatrick Steuer	VLR	C5,K2
519*b087dfabSPatrick Steuer
520*b087dfabSPatrick Steuer	VLR	T1,D1
521*b087dfabSPatrick Steuer	VLR	T2,D2
522*b087dfabSPatrick Steuer	VLR	T3,D3
523*b087dfabSPatrick Steuer
524*b087dfabSPatrick Steuer.Loop_vx:
525*b087dfabSPatrick Steuer	VAF	A0,A0,B0
526*b087dfabSPatrick Steuer	VAF	A1,A1,B1
527*b087dfabSPatrick Steuer	VAF	A2,A2,B2
528*b087dfabSPatrick Steuer	VAF	A3,A3,B3
529*b087dfabSPatrick Steuer	VAF	A4,A4,B4
530*b087dfabSPatrick Steuer	VAF	A5,A5,B5
531*b087dfabSPatrick Steuer	VX	D0,D0,A0
532*b087dfabSPatrick Steuer	VX	D1,D1,A1
533*b087dfabSPatrick Steuer	VX	D2,D2,A2
534*b087dfabSPatrick Steuer	VX	D3,D3,A3
535*b087dfabSPatrick Steuer	VX	D4,D4,A4
536*b087dfabSPatrick Steuer	VX	D5,D5,A5
537*b087dfabSPatrick Steuer	VERLLF	D0,D0,16
538*b087dfabSPatrick Steuer	VERLLF	D1,D1,16
539*b087dfabSPatrick Steuer	VERLLF	D2,D2,16
540*b087dfabSPatrick Steuer	VERLLF	D3,D3,16
541*b087dfabSPatrick Steuer	VERLLF	D4,D4,16
542*b087dfabSPatrick Steuer	VERLLF	D5,D5,16
543*b087dfabSPatrick Steuer
544*b087dfabSPatrick Steuer	VAF	C0,C0,D0
545*b087dfabSPatrick Steuer	VAF	C1,C1,D1
546*b087dfabSPatrick Steuer	VAF	C2,C2,D2
547*b087dfabSPatrick Steuer	VAF	C3,C3,D3
548*b087dfabSPatrick Steuer	VAF	C4,C4,D4
549*b087dfabSPatrick Steuer	VAF	C5,C5,D5
550*b087dfabSPatrick Steuer	VX	B0,B0,C0
551*b087dfabSPatrick Steuer	VX	B1,B1,C1
552*b087dfabSPatrick Steuer	VX	B2,B2,C2
553*b087dfabSPatrick Steuer	VX	B3,B3,C3
554*b087dfabSPatrick Steuer	VX	B4,B4,C4
555*b087dfabSPatrick Steuer	VX	B5,B5,C5
556*b087dfabSPatrick Steuer	VERLLF	B0,B0,12
557*b087dfabSPatrick Steuer	VERLLF	B1,B1,12
558*b087dfabSPatrick Steuer	VERLLF	B2,B2,12
559*b087dfabSPatrick Steuer	VERLLF	B3,B3,12
560*b087dfabSPatrick Steuer	VERLLF	B4,B4,12
561*b087dfabSPatrick Steuer	VERLLF	B5,B5,12
562*b087dfabSPatrick Steuer
563*b087dfabSPatrick Steuer	VAF	A0,A0,B0
564*b087dfabSPatrick Steuer	VAF	A1,A1,B1
565*b087dfabSPatrick Steuer	VAF	A2,A2,B2
566*b087dfabSPatrick Steuer	VAF	A3,A3,B3
567*b087dfabSPatrick Steuer	VAF	A4,A4,B4
568*b087dfabSPatrick Steuer	VAF	A5,A5,B5
569*b087dfabSPatrick Steuer	VX	D0,D0,A0
570*b087dfabSPatrick Steuer	VX	D1,D1,A1
571*b087dfabSPatrick Steuer	VX	D2,D2,A2
572*b087dfabSPatrick Steuer	VX	D3,D3,A3
573*b087dfabSPatrick Steuer	VX	D4,D4,A4
574*b087dfabSPatrick Steuer	VX	D5,D5,A5
575*b087dfabSPatrick Steuer	VERLLF	D0,D0,8
576*b087dfabSPatrick Steuer	VERLLF	D1,D1,8
577*b087dfabSPatrick Steuer	VERLLF	D2,D2,8
578*b087dfabSPatrick Steuer	VERLLF	D3,D3,8
579*b087dfabSPatrick Steuer	VERLLF	D4,D4,8
580*b087dfabSPatrick Steuer	VERLLF	D5,D5,8
581*b087dfabSPatrick Steuer
582*b087dfabSPatrick Steuer	VAF	C0,C0,D0
583*b087dfabSPatrick Steuer	VAF	C1,C1,D1
584*b087dfabSPatrick Steuer	VAF	C2,C2,D2
585*b087dfabSPatrick Steuer	VAF	C3,C3,D3
586*b087dfabSPatrick Steuer	VAF	C4,C4,D4
587*b087dfabSPatrick Steuer	VAF	C5,C5,D5
588*b087dfabSPatrick Steuer	VX	B0,B0,C0
589*b087dfabSPatrick Steuer	VX	B1,B1,C1
590*b087dfabSPatrick Steuer	VX	B2,B2,C2
591*b087dfabSPatrick Steuer	VX	B3,B3,C3
592*b087dfabSPatrick Steuer	VX	B4,B4,C4
593*b087dfabSPatrick Steuer	VX	B5,B5,C5
594*b087dfabSPatrick Steuer	VERLLF	B0,B0,7
595*b087dfabSPatrick Steuer	VERLLF	B1,B1,7
596*b087dfabSPatrick Steuer	VERLLF	B2,B2,7
597*b087dfabSPatrick Steuer	VERLLF	B3,B3,7
598*b087dfabSPatrick Steuer	VERLLF	B4,B4,7
599*b087dfabSPatrick Steuer	VERLLF	B5,B5,7
600*b087dfabSPatrick Steuer
601*b087dfabSPatrick Steuer	VSLDB	C0,C0,C0,8
602*b087dfabSPatrick Steuer	VSLDB	C1,C1,C1,8
603*b087dfabSPatrick Steuer	VSLDB	C2,C2,C2,8
604*b087dfabSPatrick Steuer	VSLDB	C3,C3,C3,8
605*b087dfabSPatrick Steuer	VSLDB	C4,C4,C4,8
606*b087dfabSPatrick Steuer	VSLDB	C5,C5,C5,8
607*b087dfabSPatrick Steuer	VSLDB	B0,B0,B0,4
608*b087dfabSPatrick Steuer	VSLDB	B1,B1,B1,4
609*b087dfabSPatrick Steuer	VSLDB	B2,B2,B2,4
610*b087dfabSPatrick Steuer	VSLDB	B3,B3,B3,4
611*b087dfabSPatrick Steuer	VSLDB	B4,B4,B4,4
612*b087dfabSPatrick Steuer	VSLDB	B5,B5,B5,4
613*b087dfabSPatrick Steuer	VSLDB	D0,D0,D0,12
614*b087dfabSPatrick Steuer	VSLDB	D1,D1,D1,12
615*b087dfabSPatrick Steuer	VSLDB	D2,D2,D2,12
616*b087dfabSPatrick Steuer	VSLDB	D3,D3,D3,12
617*b087dfabSPatrick Steuer	VSLDB	D4,D4,D4,12
618*b087dfabSPatrick Steuer	VSLDB	D5,D5,D5,12
619*b087dfabSPatrick Steuer
620*b087dfabSPatrick Steuer	VAF	A0,A0,B0
621*b087dfabSPatrick Steuer	VAF	A1,A1,B1
622*b087dfabSPatrick Steuer	VAF	A2,A2,B2
623*b087dfabSPatrick Steuer	VAF	A3,A3,B3
624*b087dfabSPatrick Steuer	VAF	A4,A4,B4
625*b087dfabSPatrick Steuer	VAF	A5,A5,B5
626*b087dfabSPatrick Steuer	VX	D0,D0,A0
627*b087dfabSPatrick Steuer	VX	D1,D1,A1
628*b087dfabSPatrick Steuer	VX	D2,D2,A2
629*b087dfabSPatrick Steuer	VX	D3,D3,A3
630*b087dfabSPatrick Steuer	VX	D4,D4,A4
631*b087dfabSPatrick Steuer	VX	D5,D5,A5
632*b087dfabSPatrick Steuer	VERLLF	D0,D0,16
633*b087dfabSPatrick Steuer	VERLLF	D1,D1,16
634*b087dfabSPatrick Steuer	VERLLF	D2,D2,16
635*b087dfabSPatrick Steuer	VERLLF	D3,D3,16
636*b087dfabSPatrick Steuer	VERLLF	D4,D4,16
637*b087dfabSPatrick Steuer	VERLLF	D5,D5,16
638*b087dfabSPatrick Steuer
639*b087dfabSPatrick Steuer	VAF	C0,C0,D0
640*b087dfabSPatrick Steuer	VAF	C1,C1,D1
641*b087dfabSPatrick Steuer	VAF	C2,C2,D2
642*b087dfabSPatrick Steuer	VAF	C3,C3,D3
643*b087dfabSPatrick Steuer	VAF	C4,C4,D4
644*b087dfabSPatrick Steuer	VAF	C5,C5,D5
645*b087dfabSPatrick Steuer	VX	B0,B0,C0
646*b087dfabSPatrick Steuer	VX	B1,B1,C1
647*b087dfabSPatrick Steuer	VX	B2,B2,C2
648*b087dfabSPatrick Steuer	VX	B3,B3,C3
649*b087dfabSPatrick Steuer	VX	B4,B4,C4
650*b087dfabSPatrick Steuer	VX	B5,B5,C5
651*b087dfabSPatrick Steuer	VERLLF	B0,B0,12
652*b087dfabSPatrick Steuer	VERLLF	B1,B1,12
653*b087dfabSPatrick Steuer	VERLLF	B2,B2,12
654*b087dfabSPatrick Steuer	VERLLF	B3,B3,12
655*b087dfabSPatrick Steuer	VERLLF	B4,B4,12
656*b087dfabSPatrick Steuer	VERLLF	B5,B5,12
657*b087dfabSPatrick Steuer
658*b087dfabSPatrick Steuer	VAF	A0,A0,B0
659*b087dfabSPatrick Steuer	VAF	A1,A1,B1
660*b087dfabSPatrick Steuer	VAF	A2,A2,B2
661*b087dfabSPatrick Steuer	VAF	A3,A3,B3
662*b087dfabSPatrick Steuer	VAF	A4,A4,B4
663*b087dfabSPatrick Steuer	VAF	A5,A5,B5
664*b087dfabSPatrick Steuer	VX	D0,D0,A0
665*b087dfabSPatrick Steuer	VX	D1,D1,A1
666*b087dfabSPatrick Steuer	VX	D2,D2,A2
667*b087dfabSPatrick Steuer	VX	D3,D3,A3
668*b087dfabSPatrick Steuer	VX	D4,D4,A4
669*b087dfabSPatrick Steuer	VX	D5,D5,A5
670*b087dfabSPatrick Steuer	VERLLF	D0,D0,8
671*b087dfabSPatrick Steuer	VERLLF	D1,D1,8
672*b087dfabSPatrick Steuer	VERLLF	D2,D2,8
673*b087dfabSPatrick Steuer	VERLLF	D3,D3,8
674*b087dfabSPatrick Steuer	VERLLF	D4,D4,8
675*b087dfabSPatrick Steuer	VERLLF	D5,D5,8
676*b087dfabSPatrick Steuer
677*b087dfabSPatrick Steuer	VAF	C0,C0,D0
678*b087dfabSPatrick Steuer	VAF	C1,C1,D1
679*b087dfabSPatrick Steuer	VAF	C2,C2,D2
680*b087dfabSPatrick Steuer	VAF	C3,C3,D3
681*b087dfabSPatrick Steuer	VAF	C4,C4,D4
682*b087dfabSPatrick Steuer	VAF	C5,C5,D5
683*b087dfabSPatrick Steuer	VX	B0,B0,C0
684*b087dfabSPatrick Steuer	VX	B1,B1,C1
685*b087dfabSPatrick Steuer	VX	B2,B2,C2
686*b087dfabSPatrick Steuer	VX	B3,B3,C3
687*b087dfabSPatrick Steuer	VX	B4,B4,C4
688*b087dfabSPatrick Steuer	VX	B5,B5,C5
689*b087dfabSPatrick Steuer	VERLLF	B0,B0,7
690*b087dfabSPatrick Steuer	VERLLF	B1,B1,7
691*b087dfabSPatrick Steuer	VERLLF	B2,B2,7
692*b087dfabSPatrick Steuer	VERLLF	B3,B3,7
693*b087dfabSPatrick Steuer	VERLLF	B4,B4,7
694*b087dfabSPatrick Steuer	VERLLF	B5,B5,7
695*b087dfabSPatrick Steuer
696*b087dfabSPatrick Steuer	VSLDB	C0,C0,C0,8
697*b087dfabSPatrick Steuer	VSLDB	C1,C1,C1,8
698*b087dfabSPatrick Steuer	VSLDB	C2,C2,C2,8
699*b087dfabSPatrick Steuer	VSLDB	C3,C3,C3,8
700*b087dfabSPatrick Steuer	VSLDB	C4,C4,C4,8
701*b087dfabSPatrick Steuer	VSLDB	C5,C5,C5,8
702*b087dfabSPatrick Steuer	VSLDB	B0,B0,B0,12
703*b087dfabSPatrick Steuer	VSLDB	B1,B1,B1,12
704*b087dfabSPatrick Steuer	VSLDB	B2,B2,B2,12
705*b087dfabSPatrick Steuer	VSLDB	B3,B3,B3,12
706*b087dfabSPatrick Steuer	VSLDB	B4,B4,B4,12
707*b087dfabSPatrick Steuer	VSLDB	B5,B5,B5,12
708*b087dfabSPatrick Steuer	VSLDB	D0,D0,D0,4
709*b087dfabSPatrick Steuer	VSLDB	D1,D1,D1,4
710*b087dfabSPatrick Steuer	VSLDB	D2,D2,D2,4
711*b087dfabSPatrick Steuer	VSLDB	D3,D3,D3,4
712*b087dfabSPatrick Steuer	VSLDB	D4,D4,D4,4
713*b087dfabSPatrick Steuer	VSLDB	D5,D5,D5,4
714*b087dfabSPatrick Steuer	brct	%r0,.Loop_vx
715*b087dfabSPatrick Steuer
716*b087dfabSPatrick Steuer	VAF	A0,A0,K0
717*b087dfabSPatrick Steuer	VAF	B0,B0,K1
718*b087dfabSPatrick Steuer	VAF	C0,C0,K2
719*b087dfabSPatrick Steuer	VAF	D0,D0,K3
720*b087dfabSPatrick Steuer	VAF	A1,A1,K0
721*b087dfabSPatrick Steuer	VAF	D1,D1,T1		# +K[3]+1
722*b087dfabSPatrick Steuer
723*b087dfabSPatrick Steuer	VPERM	A0,A0,A0,BEPERM
724*b087dfabSPatrick Steuer	VPERM	B0,B0,B0,BEPERM
725*b087dfabSPatrick Steuer	VPERM	C0,C0,C0,BEPERM
726*b087dfabSPatrick Steuer	VPERM	D0,D0,D0,BEPERM
727*b087dfabSPatrick Steuer
728*b087dfabSPatrick Steuer	clgfi	LEN,0x40
729*b087dfabSPatrick Steuer	jl	.Ltail_vx
730*b087dfabSPatrick Steuer
731*b087dfabSPatrick Steuer	VAF	D2,D2,T2		# +K[3]+2
732*b087dfabSPatrick Steuer	VAF	D3,D3,T3		# +K[3]+3
733*b087dfabSPatrick Steuer	VLM	T0,T3,0,INP,0
734*b087dfabSPatrick Steuer
735*b087dfabSPatrick Steuer	VX	A0,A0,T0
736*b087dfabSPatrick Steuer	VX	B0,B0,T1
737*b087dfabSPatrick Steuer	VX	C0,C0,T2
738*b087dfabSPatrick Steuer	VX	D0,D0,T3
739*b087dfabSPatrick Steuer
740*b087dfabSPatrick Steuer	VLM	K0,T3,0,%r7,4		# re-load sigma and increments
741*b087dfabSPatrick Steuer
742*b087dfabSPatrick Steuer	VSTM	A0,D0,0,OUT,0
743*b087dfabSPatrick Steuer
744*b087dfabSPatrick Steuer	la	INP,0x40(INP)
745*b087dfabSPatrick Steuer	la	OUT,0x40(OUT)
746*b087dfabSPatrick Steuer	aghi	LEN,-0x40
747*b087dfabSPatrick Steuer	je	.Ldone_vx
748*b087dfabSPatrick Steuer
749*b087dfabSPatrick Steuer	VAF	B1,B1,K1
750*b087dfabSPatrick Steuer	VAF	C1,C1,K2
751*b087dfabSPatrick Steuer
752*b087dfabSPatrick Steuer	VPERM	A0,A1,A1,BEPERM
753*b087dfabSPatrick Steuer	VPERM	B0,B1,B1,BEPERM
754*b087dfabSPatrick Steuer	VPERM	C0,C1,C1,BEPERM
755*b087dfabSPatrick Steuer	VPERM	D0,D1,D1,BEPERM
756*b087dfabSPatrick Steuer
757*b087dfabSPatrick Steuer	clgfi	LEN,0x40
758*b087dfabSPatrick Steuer	jl	.Ltail_vx
759*b087dfabSPatrick Steuer
760*b087dfabSPatrick Steuer	VLM	A1,D1,0,INP,0
761*b087dfabSPatrick Steuer
762*b087dfabSPatrick Steuer	VX	A0,A0,A1
763*b087dfabSPatrick Steuer	VX	B0,B0,B1
764*b087dfabSPatrick Steuer	VX	C0,C0,C1
765*b087dfabSPatrick Steuer	VX	D0,D0,D1
766*b087dfabSPatrick Steuer
767*b087dfabSPatrick Steuer	VSTM	A0,D0,0,OUT,0
768*b087dfabSPatrick Steuer
769*b087dfabSPatrick Steuer	la	INP,0x40(INP)
770*b087dfabSPatrick Steuer	la	OUT,0x40(OUT)
771*b087dfabSPatrick Steuer	aghi	LEN,-0x40
772*b087dfabSPatrick Steuer	je	.Ldone_vx
773*b087dfabSPatrick Steuer
774*b087dfabSPatrick Steuer	VAF	A2,A2,K0
775*b087dfabSPatrick Steuer	VAF	B2,B2,K1
776*b087dfabSPatrick Steuer	VAF	C2,C2,K2
777*b087dfabSPatrick Steuer
778*b087dfabSPatrick Steuer	VPERM	A0,A2,A2,BEPERM
779*b087dfabSPatrick Steuer	VPERM	B0,B2,B2,BEPERM
780*b087dfabSPatrick Steuer	VPERM	C0,C2,C2,BEPERM
781*b087dfabSPatrick Steuer	VPERM	D0,D2,D2,BEPERM
782*b087dfabSPatrick Steuer
783*b087dfabSPatrick Steuer	clgfi	LEN,0x40
784*b087dfabSPatrick Steuer	jl	.Ltail_vx
785*b087dfabSPatrick Steuer
786*b087dfabSPatrick Steuer	VLM	A1,D1,0,INP,0
787*b087dfabSPatrick Steuer
788*b087dfabSPatrick Steuer	VX	A0,A0,A1
789*b087dfabSPatrick Steuer	VX	B0,B0,B1
790*b087dfabSPatrick Steuer	VX	C0,C0,C1
791*b087dfabSPatrick Steuer	VX	D0,D0,D1
792*b087dfabSPatrick Steuer
793*b087dfabSPatrick Steuer	VSTM	A0,D0,0,OUT,0
794*b087dfabSPatrick Steuer
795*b087dfabSPatrick Steuer	la	INP,0x40(INP)
796*b087dfabSPatrick Steuer	la	OUT,0x40(OUT)
797*b087dfabSPatrick Steuer	aghi	LEN,-0x40
798*b087dfabSPatrick Steuer	je	.Ldone_vx
799*b087dfabSPatrick Steuer
800*b087dfabSPatrick Steuer	VAF	A3,A3,K0
801*b087dfabSPatrick Steuer	VAF	B3,B3,K1
802*b087dfabSPatrick Steuer	VAF	C3,C3,K2
803*b087dfabSPatrick Steuer	VAF	D2,K3,T3		# K[3]+3
804*b087dfabSPatrick Steuer
805*b087dfabSPatrick Steuer	VPERM	A0,A3,A3,BEPERM
806*b087dfabSPatrick Steuer	VPERM	B0,B3,B3,BEPERM
807*b087dfabSPatrick Steuer	VPERM	C0,C3,C3,BEPERM
808*b087dfabSPatrick Steuer	VPERM	D0,D3,D3,BEPERM
809*b087dfabSPatrick Steuer
810*b087dfabSPatrick Steuer	clgfi	LEN,0x40
811*b087dfabSPatrick Steuer	jl	.Ltail_vx
812*b087dfabSPatrick Steuer
813*b087dfabSPatrick Steuer	VAF	D3,D2,T1		# K[3]+4
814*b087dfabSPatrick Steuer	VLM	A1,D1,0,INP,0
815*b087dfabSPatrick Steuer
816*b087dfabSPatrick Steuer	VX	A0,A0,A1
817*b087dfabSPatrick Steuer	VX	B0,B0,B1
818*b087dfabSPatrick Steuer	VX	C0,C0,C1
819*b087dfabSPatrick Steuer	VX	D0,D0,D1
820*b087dfabSPatrick Steuer
821*b087dfabSPatrick Steuer	VSTM	A0,D0,0,OUT,0
822*b087dfabSPatrick Steuer
823*b087dfabSPatrick Steuer	la	INP,0x40(INP)
824*b087dfabSPatrick Steuer	la	OUT,0x40(OUT)
825*b087dfabSPatrick Steuer	aghi	LEN,-0x40
826*b087dfabSPatrick Steuer	je	.Ldone_vx
827*b087dfabSPatrick Steuer
828*b087dfabSPatrick Steuer	VAF	A4,A4,K0
829*b087dfabSPatrick Steuer	VAF	B4,B4,K1
830*b087dfabSPatrick Steuer	VAF	C4,C4,K2
831*b087dfabSPatrick Steuer	VAF	D4,D4,D3		# +K[3]+4
832*b087dfabSPatrick Steuer	VAF	D3,D3,T1		# K[3]+5
833*b087dfabSPatrick Steuer	VAF	K3,D2,T3		# K[3]+=6
834*b087dfabSPatrick Steuer
835*b087dfabSPatrick Steuer	VPERM	A0,A4,A4,BEPERM
836*b087dfabSPatrick Steuer	VPERM	B0,B4,B4,BEPERM
837*b087dfabSPatrick Steuer	VPERM	C0,C4,C4,BEPERM
838*b087dfabSPatrick Steuer	VPERM	D0,D4,D4,BEPERM
839*b087dfabSPatrick Steuer
840*b087dfabSPatrick Steuer	clgfi	LEN,0x40
841*b087dfabSPatrick Steuer	jl	.Ltail_vx
842*b087dfabSPatrick Steuer
843*b087dfabSPatrick Steuer	VLM	A1,D1,0,INP,0
844*b087dfabSPatrick Steuer
845*b087dfabSPatrick Steuer	VX	A0,A0,A1
846*b087dfabSPatrick Steuer	VX	B0,B0,B1
847*b087dfabSPatrick Steuer	VX	C0,C0,C1
848*b087dfabSPatrick Steuer	VX	D0,D0,D1
849*b087dfabSPatrick Steuer
850*b087dfabSPatrick Steuer	VSTM	A0,D0,0,OUT,0
851*b087dfabSPatrick Steuer
852*b087dfabSPatrick Steuer	la	INP,0x40(INP)
853*b087dfabSPatrick Steuer	la	OUT,0x40(OUT)
854*b087dfabSPatrick Steuer	aghi	LEN,-0x40
855*b087dfabSPatrick Steuer	je	.Ldone_vx
856*b087dfabSPatrick Steuer
857*b087dfabSPatrick Steuer	VAF	A5,A5,K0
858*b087dfabSPatrick Steuer	VAF	B5,B5,K1
859*b087dfabSPatrick Steuer	VAF	C5,C5,K2
860*b087dfabSPatrick Steuer	VAF	D5,D5,D3		# +K[3]+5
861*b087dfabSPatrick Steuer
862*b087dfabSPatrick Steuer	VPERM	A0,A5,A5,BEPERM
863*b087dfabSPatrick Steuer	VPERM	B0,B5,B5,BEPERM
864*b087dfabSPatrick Steuer	VPERM	C0,C5,C5,BEPERM
865*b087dfabSPatrick Steuer	VPERM	D0,D5,D5,BEPERM
866*b087dfabSPatrick Steuer
867*b087dfabSPatrick Steuer	clgfi	LEN,0x40
868*b087dfabSPatrick Steuer	jl	.Ltail_vx
869*b087dfabSPatrick Steuer
870*b087dfabSPatrick Steuer	VLM	A1,D1,0,INP,0
871*b087dfabSPatrick Steuer
872*b087dfabSPatrick Steuer	VX	A0,A0,A1
873*b087dfabSPatrick Steuer	VX	B0,B0,B1
874*b087dfabSPatrick Steuer	VX	C0,C0,C1
875*b087dfabSPatrick Steuer	VX	D0,D0,D1
876*b087dfabSPatrick Steuer
877*b087dfabSPatrick Steuer	VSTM	A0,D0,0,OUT,0
878*b087dfabSPatrick Steuer
879*b087dfabSPatrick Steuer	la	INP,0x40(INP)
880*b087dfabSPatrick Steuer	la	OUT,0x40(OUT)
881*b087dfabSPatrick Steuer	lhi	%r0,10
882*b087dfabSPatrick Steuer	aghi	LEN,-0x40
883*b087dfabSPatrick Steuer	jne	.Loop_outer_vx
884*b087dfabSPatrick Steuer
885*b087dfabSPatrick Steuer.Ldone_vx:
886*b087dfabSPatrick Steuer	lmg	%r6,%r7,FRAME+6*8(SP)
887*b087dfabSPatrick Steuer	la	SP,FRAME(SP)
888*b087dfabSPatrick Steuer	BR_EX	%r14
889*b087dfabSPatrick Steuer
890*b087dfabSPatrick Steuer.Ltail_vx:
891*b087dfabSPatrick Steuer	VSTM	A0,D0,8*8,SP,3
892*b087dfabSPatrick Steuer	lghi	%r1,0
893*b087dfabSPatrick Steuer
894*b087dfabSPatrick Steuer.Loop_tail_vx:
895*b087dfabSPatrick Steuer	llgc	%r5,0(%r1,INP)
896*b087dfabSPatrick Steuer	llgc	%r6,8*8(%r1,SP)
897*b087dfabSPatrick Steuer	xr	%r6,%r5
898*b087dfabSPatrick Steuer	stc	%r6,0(%r1,OUT)
899*b087dfabSPatrick Steuer	la	%r1,1(%r1)
900*b087dfabSPatrick Steuer	brct	LEN,.Loop_tail_vx
901*b087dfabSPatrick Steuer
902*b087dfabSPatrick Steuer	lmg	%r6,%r7,FRAME+6*8(SP)
903*b087dfabSPatrick Steuer	la	SP,FRAME(SP)
904*b087dfabSPatrick Steuer	BR_EX	%r14
905*b087dfabSPatrick SteuerENDPROC(chacha20_vx)
906*b087dfabSPatrick Steuer
907*b087dfabSPatrick Steuer.previous
908