xref: /illumos-gate/usr/src/common/crypto/arcfour/sun4u/arcfour_crypt_asm.S (revision 20a7641f9918de8574b8b3b47dbe35c4bfc78df1)
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#if defined(lint) || defined(__lint)
27
28#include "arcfour.h"
29
30/* ARGSUSED */
31void
32arcfour_crypt_aligned(ARCFour_key *key, size_t len, uchar_t *in, uchar_t *out)
33{}
34
35#else	/* lint || __lint */
36
37	.register	%g2,#scratch
38	.register	%g3,#scratch
39
40	.section	".text",#alloc,#execinstr
41	.file	"arcfour_crypt_asm.s"
42
43	.section	".text",#alloc
44	.align	32
45
46	.section	".text",#alloc,#execinstr
47	.align	32
48	.skip	32
49
50/*
51 * SUBROUTINE arcfour_crypt_aligned
52 *
53 * void arcfour_crypt_aligned(ARCFour_key *key, size_t len,
54 *			uchar_t *in, uchar_t *out);
55 *
56 * in and out should be aligned on an 8-byte boundary, but len can be anything
57 */
58	.global arcfour_crypt_aligned
59
60
61arcfour_crypt_aligned:
62	save	%sp,-144,%sp
63
64	srl	%i1, 3, %l7
65	ldub	[%i0+256], %g1
66
67	orcc	%l7, %g0, %g0
68	ldub	[%i0+257], %g2
69
70	add	%g1, 1, %o1
71	bz	%icc, .Loop2
72	add	%i0, 0, %i5
73
74	add	%o1, 1, %g1
75	and	%o1, 255, %o1
76
77	and	%g1, 255, %g1
78	ldub	[%i5 + %o1], %o3
79
80	ldub	[%i5 + %g1], %g3
81
82	add	%g2, %o3, %o2
83
84	add	%o2, %g3, %g2
85	and	%o2, 255, %o2
86
87	and	%g2, 255, %g2
88	ldub	[%i5 + %o2], %o4
89
90	stb	%o3, [%i5+%o2]
91	subcc	%o2, %g1, %g0
92
93	stb	%o4, [%i5 + %o1]
94	bz	%icc, .L1A
95	add	%o3,%o4,%o5
96.L1B:
97	and	%o5, 255, %o5
98	ldub	[%i5 + %g2], %g4
99
100	ldub	[%i5 + %o5], %o5
101	add	%g1, 1, %o1
102
103	and	%o1, 255, %o1
104	stb	%g3, [%i5 + %g2]
105	add	%g3, %g4, %g5
106
107	and	%g5, 255, %g5
108	stb	%g4, [%i5 + %g1]
109	add	%o1, 1, %g1
110
111
112	sllx	%o5, 56, %o0
113	ldub	[%i5 + %o1], %o3
114	and	%g1, 255, %g1
115
116	ldub	[%i5 + %g1], %g3
117
118	add	%g2, %o3, %o2
119	ldub	[%i5 + %g5], %g5
120
121	add	%o2, %g3, %g2
122	and	%o2, 255, %o2
123
124	sllx	%g5, 48, %g5
125	ldub	[%i5 + %o2], %o4
126	and	%g2, 255, %g2
127
128	or	%o0, %g5, %o0
129	stb	%o3, [%i5+%o2]
130	subcc	%o2, %g1, %g0
131
132	stb	%o4, [%i5 + %o1]
133	bz	%icc, .L2A
134	add	%o3,%o4,%o5
135.L2B:
136	and	%o5, 255, %o5
137	ldub	[%i5 + %g2], %g4
138
139	ldub	[%i5 + %o5], %o5
140	add	%g1, 1, %o1
141
142	and	%o1, 255, %o1
143	stb	%g3, [%i5 + %g2]
144	add	%g3, %g4, %g5
145
146	and	%g5, 255, %g5
147	stb	%g4, [%i5 + %g1]
148	add	%o1, 1, %g1
149
150
151	sllx	%o5, 40, %o5
152	ldub	[%i5 + %o1], %o3
153	and	%g1, 255, %g1
154
155	ldub	[%i5 + %g1], %g3
156	or	%o0, %o5, %o0
157
158	add	%g2, %o3, %o2
159	ldub	[%i5 + %g5], %g5
160
161	add	%o2, %g3, %g2
162	and	%o2, 255, %o2
163
164	sllx	%g5, 32, %g5
165	ldub	[%i5 + %o2], %o4
166	and	%g2, 255, %g2
167
168	or	%o0, %g5, %o0
169	stb	%o3, [%i5+%o2]
170	subcc	%o2, %g1, %g0
171
172	stb	%o4, [%i5 + %o1]
173	bz	%icc, .L3A
174	add	%o3,%o4,%o5
175.L3B:
176	and	%o5, 255, %o5
177	ldub	[%i5 + %g2], %g4
178
179	ldub	[%i5 + %o5], %o5
180	add	%g1, 1, %o1
181
182	and	%o1, 255, %o1
183	stb	%g3, [%i5 + %g2]
184	add	%g3, %g4, %g5
185
186	and	%g5, 255, %g5
187	stb	%g4, [%i5 + %g1]
188	add	%o1, 1, %g1
189
190
191	sll	%o5, 24, %o5
192	ldub	[%i5 + %o1], %o3
193	and	%g1, 255, %g1
194
195	sub	%i1, 8, %i1
196	ldub	[%i5 + %g1], %g3
197	or	%o0, %o5, %o0
198
199	srl	%i1, 3, %l7
200	ldub	[%i5 + %g5], %g5
201	add	%g2, %o3, %o2
202
203	add	%o2, %g3, %g2
204	and	%o2, 255, %o2
205
206	sll	%g5, 16, %g5
207	ldub	[%i5 + %o2], %o4
208	and	%g2, 255, %g2
209
210	or	%o0, %g5, %o0
211	stb	%o3, [%i5+%o2]
212	subcc	%o2, %g1, %g0
213
214	stb	%o4, [%i5 + %o1]
215	bz	%icc, .L4A
216	add	%o3,%o4,%o5
217.L4B:
218	and	%o5, 255, %o5
219	ldub	[%i5 + %g2], %g4
220	add	%g1, 1, %o1
221
222	orcc	%l7, %g0, %g0
223	ldub	[%i5 + %o5], %o5
224	and	%o1, 255, %o1
225
226	add	%g3, %g4, %g5
227	stb	%g4, [%i5 + %g1]
228	add	%o1, 1, %g1
229
230	stb	%g3, [%i5 + %g2]
231	bz	%icc, .EndLoop1
232	and	%g5, 255, %g5
233
234
235.Loop1:
236	sll	%o5, 8, %o5
237	ldub	[%i5 + %o1], %o3
238	and	%g1, 255, %g1
239
240	ldub	[%i5 + %g1], %g3
241	or	%o0, %o5, %o0
242
243	ldub	[%i5 + %g5], %g5
244	add	%g2, %o3, %o2
245
246	add	%o2, %g3, %g2
247	ldx	[%i2], %o7
248	and	%o2, 255, %o2
249
250	and	%g2, 255, %g2
251	ldub	[%i5 + %o2], %o4
252
253	or	%o0, %g5, %o0
254	stb	%o3, [%i5+%o2]
255	subcc	%o2, %g1, %g0
256
257	stb	%o4, [%i5 + %o1]
258	bz	%icc, .L5A
259	add	%o3,%o4,%o5
260.L5B:
261	and	%o5, 255, %o5
262	ldub	[%i5 + %g2], %g4
263
264	ldub	[%i5 + %o5], %o5
265	add	%g1, 1, %o1
266
267	and	%o1, 255, %o1
268	stb	%g3, [%i5 + %g2]
269	add	%g3, %g4, %g5
270
271	and	%g5, 255, %g5
272	stb	%g4, [%i5 + %g1]
273	add	%o1, 1, %g1
274
275
276	xor	%o0, %o7, %o7
277	ldub	[%i5 + %o1], %o3
278	and	%g1, 255, %g1
279
280	sllx	%o5, 56, %o0
281	ldub	[%i5 + %g1], %g3
282
283	add	%g2, %o3, %o2
284	ldub	[%i5 + %g5], %g5
285
286	add	%o2, %g3, %g2
287	stx	%o7, [%i3]
288	and	%o2, 255, %o2
289
290	sllx	%g5, 48, %g5
291	ldub	[%i5 + %o2], %o4
292	and	%g2, 255, %g2
293
294	or	%o0, %g5, %o0
295	stb	%o3, [%i5+%o2]
296	subcc	%o2, %g1, %g0
297
298	stb	%o4, [%i5 + %o1]
299	bz	%icc, .L6A
300	add	%o3,%o4,%o5
301.L6B:
302	and	%o5, 255, %o5
303	ldub	[%i5 + %g2], %g4
304	add	%i3, 8, %i3
305
306	add	%i2, 8, %i2
307	ldub	[%i5 + %o5], %o5
308	add	%g1, 1, %o1
309
310	and	%o1, 255, %o1
311	stb	%g3, [%i5 + %g2]
312	add	%g3, %g4, %g5
313
314	and	%g5, 255, %g5
315	stb	%g4, [%i5 + %g1]
316	add	%o1, 1, %g1
317
318
319	sllx	%o5, 40, %o5
320	ldub	[%i5 + %o1], %o3
321	and	%g1, 255, %g1
322
323	ldub	[%i5 + %g1], %g3
324	or	%o0, %o5, %o0
325
326	add	%g2, %o3, %o2
327	ldub	[%i5 + %g5], %g5
328
329	add	%o2, %g3, %g2
330	and	%o2, 255, %o2
331
332	sllx	%g5, 32, %g5
333	ldub	[%i5 + %o2], %o4
334	and	%g2, 255, %g2
335
336	or	%o0, %g5, %o0
337	stb	%o3, [%i5 + %o2]
338	subcc	%o2, %g1, %g0
339
340	stb	%o4, [%i5 + %o1]
341	bz	%icc, .L7A
342	add	%o3,%o4,%o5
343.L7B:
344	and	%o5, 255, %o5
345	ldub	[%i5 + %g2], %g4
346
347	ldub	[%i5 + %o5], %o5
348	add	%g1, 1, %o1
349
350	and	%o1, 255, %o1
351	stb	%g3, [%i5 + %g2]
352	add	%g3, %g4, %g5
353
354	and	%g5, 255, %g5
355	stb	%g4, [%i5 + %g1]
356	add	%o1, 1, %g1
357
358
359	sll	%o5, 24, %o5
360	ldub	[%i5 + %o1], %o3
361	and	%g1, 255, %g1
362
363	sub	%i1, 8, %i1
364	ldub	[%i5 + %g1], %g3
365	or	%o0, %o5, %o0
366
367	srl	%i1, 3, %l7
368	ldub	[%i5 + %g5], %g5
369	add	%g2, %o3, %o2
370
371	add	%o2, %g3, %g2
372	and	%o2, 255, %o2
373
374	sll	%g5, 16, %g5
375	ldub	[%i5 + %o2], %o4
376	and	%g2, 255, %g2
377
378	or	%o0, %g5, %o0
379	stb	%o3, [%i5 + %o2]
380	subcc	%o2, %g1, %g0
381
382	stb	%o4, [%i5 + %o1]
383	bz	%icc, .L8A
384	add	%o3,%o4,%o5
385.L8B:
386	and	%o5, 255, %o5
387	ldub	[%i5 + %g2], %g4
388	add	%g1, 1, %o1
389
390	orcc	%l7, %g0, %g0
391	ldub	[%i5 + %o5], %o5
392	and	%o1, 255, %o1
393
394	add	%g3, %g4, %g5
395	stb	%g4, [%i5 + %g1]
396	add	%o1, 1, %g1
397
398	stb	%g3, [%i5 + %g2]
399	bnz	%icc, .Loop1
400	and	%g5, 255, %g5
401
402
403.EndLoop1:
404	sll	%o5, 8, %o5
405	ldub	[%i5 + %g5], %g5
406	orcc	%i1, %g0, %g0
407
408	or	%o0, %o5, %o0
409	ldx	[%i2], %o7
410	sub	%g1, 2, %g1
411
412	and	%g1, 255, %g1
413	stb	%g1, [%i0 + 256]
414	or	%o0, %g5, %o0
415
416	xor	%o0, %o7, %o7
417	stx	%o7, [%i3]
418	add	%i2, 8, %i2
419
420	add	%i3, 8, %i3
421	bnz	%icc, .Loop2_1
422	stb	%g2, [%i0 + 257]
423
424	ret
425	restore	%g0,%g0,%g0
426
427
428.Loop2:
429	orcc	%i1, %g0, %g0
430	bnz	.Loop2_1
431	nop
432	ret
433	restore	%g0,%g0,%g0
434
435.Loop2_1:
436	and	%o1, 255, %g1
437	ldub	[%i5 + %g1], %g3
438
439	add	%g2, %g3, %g2
440
441	and	%g2, 255, %g2
442
443	ldub	[%i5 + %g2], %g4
444
445	stb	%g3, [%i5 + %g2]
446
447	add	%g3, %g4, %g5
448	stb	%g4, [%i5 + %g1]
449
450	and	%g5, 255, %g5
451	ldub	[%i2], %o0
452
453	add	%g1, 1, %o1
454	ldub	[%i5 + %g5], %g5
455	subcc	%i1, 1, %i1
456
457	add	%i2, 1, %i2
458	add	%i3, 1, %i3
459
460	xor	%o0, %g5, %o0
461	bnz	%icc, .Loop2_1
462	stb	%o0, [%i3 - 1]
463
464	stb	%g1, [%i0 + 256]
465
466	stb	%g2, [%i0 + 257]
467
468	ret
469	restore	%g0,%g0,%g0
470
471.L1A:
472	add	%o2, %o3, %g2
473	or	%o3, %g0, %g3
474	ba	.L1B
475	and	%g2, 255, %g2
476
477.L2A:
478	add	%o2, %o3, %g2
479	or	%o3, %g0, %g3
480	ba	.L2B
481	and	%g2, 255, %g2
482
483.L3A:
484	add	%o2, %o3, %g2
485	or	%o3, %g0, %g3
486	ba	.L3B
487	and	%g2, 255, %g2
488
489.L4A:
490	add	%o2, %o3, %g2
491	or	%o3, %g0, %g3
492	ba	.L4B
493	and	%g2, 255, %g2
494
495.L5A:
496	add	%o2, %o3, %g2
497	or	%o3, %g0, %g3
498	ba	.L5B
499	and	%g2, 255, %g2
500
501.L6A:
502	add	%o2, %o3, %g2
503	or	%o3, %g0, %g3
504	ba	.L6B
505	and	%g2, 255, %g2
506
507.L7A:
508	add	%o2, %o3, %g2
509	or	%o3, %g0, %g3
510	ba	.L7B
511	and	%g2, 255, %g2
512
513.L8A:
514	add	%o2, %o3, %g2
515	or	%o3, %g0, %g3
516	ba	.L8B
517	and	%g2, 255, %g2
518
519	.type	arcfour_crypt_aligned,2
520	.size	arcfour_crypt_aligned,(. - arcfour_crypt_aligned)
521
522#endif	/* lint || __lint */
523