1221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#!/usr/bin/env perl
2221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#
3221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# ====================================================================
4221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
5221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# project. The module is, however, dual licensed under OpenSSL and
6221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# CRYPTOGAMS licenses depending on where you obtain it. For further
7221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# details see http://www.openssl.org/~appro/cryptogams/.
8221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# ====================================================================
9221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#
10221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# February 2009
11221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#
12221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# Performance is 2x of gcc 3.4.6 on z10. Coding "secret" is to
13221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# "cluster" Address Generation Interlocks, so that one pipeline stall
14221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# resolves several dependencies.
15221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
16392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# November 2010.
17392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#
18392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# Adapt for -m31 build. If kernel supports what's called "highgprs"
19392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# feature on Linux [see /proc/cpuinfo], it's possible to use 64-bit
20392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# instructions and achieve "64-bit" performance even in 31-bit legacy
21392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# application context. The feature is not specific to any particular
22392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# processor, as long as it's "z-CPU". Latter implies that the code
23392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# remains z/Architecture specific. On z990 it was measured to perform
24392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# 50% better than code generated by gcc 4.3.
25392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
26392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$flavour = shift;
27392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
28392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromif ($flavour =~ /3[12]/) {
29392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	$SIZE_T=4;
30392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	$g="";
31392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} else {
32392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	$SIZE_T=8;
33392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	$g="g";
34392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
35392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
36392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromwhile (($output=shift) && ($output!~/^\w[\w\-]*\.\w+$/)) {}
37392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromopen STDOUT,">$output";
38392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
39221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$rp="%r14";
40221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$sp="%r15";
41221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code=<<___;
42221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.text
43221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
44221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
45221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
46221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# void RC4(RC4_KEY *key,size_t len,const void *inp,void *out)
47221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{
48221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$acc="%r0";
49221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$cnt="%r1";
50221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$key="%r2";
51221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$len="%r3";
52221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$inp="%r4";
53221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$out="%r5";
54221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
55221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom@XX=("%r6","%r7");
56221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom@TX=("%r8","%r9");
57221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$YY="%r10";
58221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$TY="%r11";
59221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
60221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
61221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.globl	RC4
62221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	RC4,\@function
63221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	64
64221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromRC4:
65392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	stm${g}	%r6,%r11,6*$SIZE_T($sp)
66392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom___
67392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$code.=<<___ if ($flavour =~ /3[12]/);
68392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	llgfr	$len,$len
69392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom___
70392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$code.=<<___;
71221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	llgc	$XX[0],0($key)
72221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	llgc	$YY,1($key)
73221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$XX[0],1($XX[0])
74221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nill	$XX[0],0xff
75221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	srlg	$cnt,$len,3
76221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ltgr	$cnt,$cnt
77221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	llgc	$TX[0],2($XX[0],$key)
78221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jz	.Lshort
79221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	j	.Loop8
80221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
81221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	64
82221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Loop8:
83221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
84221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromfor ($i=0;$i<8;$i++) {
85221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
86221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$YY,0($YY,$TX[0])	# $i
87221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nill	$YY,255
88221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$XX[1],1($XX[0])
89221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nill	$XX[1],255
90221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
91221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___ if ($i==1);
92221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	llgc	$acc,2($TY,$key)
93221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
94221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___ if ($i>1);
95221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sllg	$acc,$acc,8
96221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ic	$acc,2($TY,$key)
97221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
98221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
99221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	llgc	$TY,2($YY,$key)
100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stc	$TX[0],2($YY,$key)
101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	llgc	$TX[1],2($XX[1],$key)
102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stc	$TY,2($XX[0],$key)
103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cr	$XX[1],$YY
104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jne	.Lcmov$i
105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$TX[1],0($TX[0])
106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcmov$i:
107221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$TY,0($TY,$TX[0])
108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nill	$TY,255
109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrompush(@TX,shift(@TX)); push(@XX,shift(@XX));     # "rotate" registers
111221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
112221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
113221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
114221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	$TX[1],0($inp)
115221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sllg	$acc,$acc,8
116221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$inp,8($inp)
117221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ic	$acc,2($TY,$key)
118221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xgr	$acc,$TX[1]
119221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	$acc,0($out)
120221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$out,8($out)
121392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	brctg	$cnt,.Loop8
122221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
123221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lshort:
124221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	$acc,7
125221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ngr	$len,$acc
126221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jz	.Lexit
127221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	j	.Loop1
128221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
129221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	16
130221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Loop1:
131221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$YY,0($YY,$TX[0])
132221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nill	$YY,255
133221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	llgc	$TY,2($YY,$key)
134221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stc	$TX[0],2($YY,$key)
135221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stc	$TY,2($XX[0],$key)
136221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ar	$TY,$TX[0]
137221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ahi	$XX[0],1
138221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nill	$TY,255
139221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nill	$XX[0],255
140221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	llgc	$acc,0($inp)
141221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$inp,1($inp)
142221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	llgc	$TY,2($TY,$key)
143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	llgc	$TX[0],2($XX[0],$key)
144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xr	$acc,$TY
145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stc	$acc,0($out)
146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$out,1($out)
147221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	brct	$len,.Loop1
148221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lexit:
150221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ahi	$XX[0],-1
151221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stc	$XX[0],0($key)
152221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stc	$YY,1($key)
153392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	lm${g}	%r6,%r11,6*$SIZE_T($sp)
154221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	br	$rp
155221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	RC4,.-RC4
156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.string	"RC4 for s390x, CRYPTOGAMS by <appro\@openssl.org>"
157221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
158221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
161221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# void RC4_set_key(RC4_KEY *key,unsigned int len,const void *inp)
162221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{
163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$cnt="%r0";
164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$idx="%r1";
165221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$key="%r2";
166221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$len="%r3";
167221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$inp="%r4";
168221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$acc="%r5";
169221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$dat="%r6";
170221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$ikey="%r7";
171221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$iinp="%r8";
172221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
173221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
174a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom.globl	private_RC4_set_key
175a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom.type	private_RC4_set_key,\@function
176221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	64
177a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstromprivate_RC4_set_key:
178392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	stm${g}	%r6,%r8,6*$SIZE_T($sp)
179221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lhi	$cnt,256
180221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$idx,0(%r0)
181221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sth	$idx,0($key)
182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	4
183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.L1stloop:
184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stc	$idx,2($idx,$key)
185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$idx,1($idx)
186221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	brct	$cnt,.L1stloop
187221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
188221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	$ikey,-256
189221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lr	$cnt,$len
190221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$iinp,0(%r0)
191221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$idx,0(%r0)
192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	16
193221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.L2ndloop:
194221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	llgc	$acc,2+256($ikey,$key)
195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	llgc	$dat,0($iinp,$inp)
196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$idx,0($idx,$acc)
197221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$ikey,1($ikey)
198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$idx,0($idx,$dat)
199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nill	$idx,255
200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$iinp,1($iinp)
201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	tml	$ikey,255
202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	llgc	$dat,2($idx,$key)
203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stc	$dat,2+256-1($ikey,$key)
204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stc	$acc,2($idx,$key)
205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jz	.Ldone
206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	brct	$cnt,.L2ndloop
207221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lr	$cnt,$len
208221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$iinp,0(%r0)
209221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	j	.L2ndloop
210221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Ldone:
211392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	lm${g}	%r6,%r8,6*$SIZE_T($sp)
212221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	br	$rp
213a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom.size	private_RC4_set_key,.-private_RC4_set_key
214221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
215221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
216221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# const char *RC4_options()
219221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
220221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.globl	RC4_options
221221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	RC4_options,\@function
222221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	16
223221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromRC4_options:
224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	larl	%r2,.Loptions
225221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	br	%r14
226221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	RC4_options,.-RC4_options
227221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.section	.rodata
228221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Loptions:
229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	8
230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.string	"rc4(8x,char)"
231221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
232221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
233221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromprint $code;
234392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromclose STDOUT;	# force flush
235