xref: /minix3/crypto/external/bsd/openssl/lib/libcrypto/arch/sparc/des_enc-sparc.S (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc!  des_enc.m4
2*0a6a1f1dSLionel Sambuc!  des_enc.S  (generated from des_enc.m4)
3*0a6a1f1dSLionel Sambuc!
4*0a6a1f1dSLionel Sambuc!  UltraSPARC assembler version of the LibDES/SSLeay/OpenSSL des_enc.c file.
5*0a6a1f1dSLionel Sambuc!
6*0a6a1f1dSLionel Sambuc!  Version 1.0. 32-bit version.
7*0a6a1f1dSLionel Sambuc!
8*0a6a1f1dSLionel Sambuc!  June 8, 2000.
9*0a6a1f1dSLionel Sambuc!
10*0a6a1f1dSLionel Sambuc!  Version 2.0. 32/64-bit, PIC-ification, blended CPU adaptation
11*0a6a1f1dSLionel Sambuc!		by Andy Polyakov.
12*0a6a1f1dSLionel Sambuc!
13*0a6a1f1dSLionel Sambuc!  January 1, 2003.
14*0a6a1f1dSLionel Sambuc!
15*0a6a1f1dSLionel Sambuc!  Assembler version: Copyright Svend Olaf Mikkelsen.
16*0a6a1f1dSLionel Sambuc!
17*0a6a1f1dSLionel Sambuc!  Original C code: Copyright Eric A. Young.
18*0a6a1f1dSLionel Sambuc!
19*0a6a1f1dSLionel Sambuc!  This code can be freely used by LibDES/SSLeay/OpenSSL users.
20*0a6a1f1dSLionel Sambuc!
21*0a6a1f1dSLionel Sambuc!  The LibDES/SSLeay/OpenSSL copyright notices must be respected.
22*0a6a1f1dSLionel Sambuc!
23*0a6a1f1dSLionel Sambuc!  This version can be redistributed.
24*0a6a1f1dSLionel Sambuc!
25*0a6a1f1dSLionel Sambuc!  To expand the m4 macros: m4 -B 8192 des_enc.m4 > des_enc.S
26*0a6a1f1dSLionel Sambuc!
27*0a6a1f1dSLionel Sambuc!  Global registers 1 to 5 are used. This is the same as done by the
28*0a6a1f1dSLionel Sambuc!  cc compiler. The UltraSPARC load/store little endian feature is used.
29*0a6a1f1dSLionel Sambuc!
30*0a6a1f1dSLionel Sambuc!  Instruction grouping often refers to one CPU cycle.
31*0a6a1f1dSLionel Sambuc!
32*0a6a1f1dSLionel Sambuc!  Assemble through gcc: gcc -c -mcpu=ultrasparc -o des_enc.o des_enc.S
33*0a6a1f1dSLionel Sambuc!
34*0a6a1f1dSLionel Sambuc!  Assemble through cc:  cc -c -xarch=v8plusa -o des_enc.o des_enc.S
35*0a6a1f1dSLionel Sambuc!
36*0a6a1f1dSLionel Sambuc!  Performance improvement according to './apps/openssl speed des'
37*0a6a1f1dSLionel Sambuc!
38*0a6a1f1dSLionel Sambuc!	32-bit build:
39*0a6a1f1dSLionel Sambuc!		23%  faster than cc-5.2 -xarch=v8plus -xO5
40*0a6a1f1dSLionel Sambuc!		115% faster than gcc-3.2.1 -m32 -mcpu=ultrasparc -O5
41*0a6a1f1dSLionel Sambuc!	64-bit build:
42*0a6a1f1dSLionel Sambuc!		50%  faster than cc-5.2 -xarch=v9 -xO5
43*0a6a1f1dSLionel Sambuc!		100% faster than gcc-3.2.1 -m64 -mcpu=ultrasparc -O5
44*0a6a1f1dSLionel Sambuc!
45*0a6a1f1dSLionel Sambuc
46*0a6a1f1dSLionel Sambuc.ident "des_enc.m4 2.1"
47*0a6a1f1dSLionel Sambuc.file  "des_enc-sparc.S"
48*0a6a1f1dSLionel Sambuc
49*0a6a1f1dSLionel Sambuc#if defined(__SUNPRO_C) && defined(__sparcv9)
50*0a6a1f1dSLionel Sambuc# define ABI64  /* They've said -xarch=v9 at command line */
51*0a6a1f1dSLionel Sambuc#elif defined(__GNUC__) && defined(__arch64__)
52*0a6a1f1dSLionel Sambuc# define ABI64  /* They've said -m64 at command line */
53*0a6a1f1dSLionel Sambuc#endif
54*0a6a1f1dSLionel Sambuc
55*0a6a1f1dSLionel Sambuc#ifdef ABI64
56*0a6a1f1dSLionel Sambuc  .register	%g2,#scratch
57*0a6a1f1dSLionel Sambuc  .register	%g3,#scratch
58*0a6a1f1dSLionel Sambuc# define	FRAME	-192
59*0a6a1f1dSLionel Sambuc# define	BIAS	2047
60*0a6a1f1dSLionel Sambuc# define	LDPTR	ldx
61*0a6a1f1dSLionel Sambuc# define	STPTR	stx
62*0a6a1f1dSLionel Sambuc# define	ARG0	128
63*0a6a1f1dSLionel Sambuc# define	ARGSZ	8
64*0a6a1f1dSLionel Sambuc# ifndef __sparc_v9__
65*0a6a1f1dSLionel Sambuc# define __sparc_v9__
66*0a6a1f1dSLionel Sambuc# endif
67*0a6a1f1dSLionel Sambuc#else
68*0a6a1f1dSLionel Sambuc# define	FRAME	-96
69*0a6a1f1dSLionel Sambuc# define	BIAS	0
70*0a6a1f1dSLionel Sambuc# define	LDPTR	ld
71*0a6a1f1dSLionel Sambuc# define	STPTR	st
72*0a6a1f1dSLionel Sambuc# define	ARG0	68
73*0a6a1f1dSLionel Sambuc# define	ARGSZ	4
74*0a6a1f1dSLionel Sambuc#endif
75*0a6a1f1dSLionel Sambuc
76*0a6a1f1dSLionel Sambuc#define LOOPS 7
77*0a6a1f1dSLionel Sambuc
78*0a6a1f1dSLionel Sambuc#define global0 %g0
79*0a6a1f1dSLionel Sambuc#define global1 %g1
80*0a6a1f1dSLionel Sambuc#define global2 %g2
81*0a6a1f1dSLionel Sambuc#define global3 %g3
82*0a6a1f1dSLionel Sambuc#define global4 %g4
83*0a6a1f1dSLionel Sambuc#define global5 %g5
84*0a6a1f1dSLionel Sambuc
85*0a6a1f1dSLionel Sambuc#define local0 %l0
86*0a6a1f1dSLionel Sambuc#define local1 %l1
87*0a6a1f1dSLionel Sambuc#define local2 %l2
88*0a6a1f1dSLionel Sambuc#define local3 %l3
89*0a6a1f1dSLionel Sambuc#define local4 %l4
90*0a6a1f1dSLionel Sambuc#define local5 %l5
91*0a6a1f1dSLionel Sambuc#define local7 %l6
92*0a6a1f1dSLionel Sambuc#define local6 %l7
93*0a6a1f1dSLionel Sambuc
94*0a6a1f1dSLionel Sambuc#define in0 %i0
95*0a6a1f1dSLionel Sambuc#define in1 %i1
96*0a6a1f1dSLionel Sambuc#define in2 %i2
97*0a6a1f1dSLionel Sambuc#define in3 %i3
98*0a6a1f1dSLionel Sambuc#define in4 %i4
99*0a6a1f1dSLionel Sambuc#define in5 %i5
100*0a6a1f1dSLionel Sambuc#define in6 %i6
101*0a6a1f1dSLionel Sambuc#define in7 %i7
102*0a6a1f1dSLionel Sambuc
103*0a6a1f1dSLionel Sambuc#define out0 %o0
104*0a6a1f1dSLionel Sambuc#define out1 %o1
105*0a6a1f1dSLionel Sambuc#define out2 %o2
106*0a6a1f1dSLionel Sambuc#define out3 %o3
107*0a6a1f1dSLionel Sambuc#define out4 %o4
108*0a6a1f1dSLionel Sambuc#define out5 %o5
109*0a6a1f1dSLionel Sambuc#define out6 %o6
110*0a6a1f1dSLionel Sambuc#define out7 %o7
111*0a6a1f1dSLionel Sambuc
112*0a6a1f1dSLionel Sambuc#define stub stb
113*0a6a1f1dSLionel Sambuc
114*0a6a1f1dSLionel Sambuc
115*0a6a1f1dSLionel Sambuc
116*0a6a1f1dSLionel Sambuc
117*0a6a1f1dSLionel Sambuc! Macro definitions:
118*0a6a1f1dSLionel Sambuc
119*0a6a1f1dSLionel Sambuc
120*0a6a1f1dSLionel Sambuc! ip_macro
121*0a6a1f1dSLionel Sambuc!
122*0a6a1f1dSLionel Sambuc! The logic used in initial and final permutations is the same as in
123*0a6a1f1dSLionel Sambuc! the C code. The permutations are done with a clever , xor, and
124*0a6a1f1dSLionel Sambuc! technique.
125*0a6a1f1dSLionel Sambuc!
126*0a6a1f1dSLionel Sambuc! The macro also loads address sbox 1 to 5 to global 1 to 5, address
127*0a6a1f1dSLionel Sambuc! sbox 6 to local6, and addres sbox 8 to out3.
128*0a6a1f1dSLionel Sambuc!
129*0a6a1f1dSLionel Sambuc! Rotates the halfs 3 left to bring the sbox bits in convenient positions.
130*0a6a1f1dSLionel Sambuc!
131*0a6a1f1dSLionel Sambuc! Loads key first round from address in parameter 5 to out0, out1.
132*0a6a1f1dSLionel Sambuc!
133*0a6a1f1dSLionel Sambuc! After the the original LibDES initial permutation, the resulting left
134*0a6a1f1dSLionel Sambuc! is in the variable initially used for right and vice versa. The macro
135*0a6a1f1dSLionel Sambuc! implements the possibility to keep the halfs in the original registers.
136*0a6a1f1dSLionel Sambuc!
137*0a6a1f1dSLionel Sambuc! parameter 1  left
138*0a6a1f1dSLionel Sambuc! parameter 2  right
139*0a6a1f1dSLionel Sambuc! parameter 3  result left (modify in first round)
140*0a6a1f1dSLionel Sambuc! parameter 4  result right (use in first round)
141*0a6a1f1dSLionel Sambuc! parameter 5  key address
142*0a6a1f1dSLionel Sambuc! parameter 6  1/2 for include encryption/decryption
143*0a6a1f1dSLionel Sambuc! parameter 7  1 for move in1 to in3
144*0a6a1f1dSLionel Sambuc! parameter 8  1 for move in3 to in4, 2 for move in4 to in3
145*0a6a1f1dSLionel Sambuc! parameter 9  1 for load ks3 and ks2 to in4 and in3
146*0a6a1f1dSLionel Sambuc
147*0a6a1f1dSLionel Sambuc
148*0a6a1f1dSLionel Sambuc
149*0a6a1f1dSLionel Sambuc
150*0a6a1f1dSLionel Sambuc! rounds_macro
151*0a6a1f1dSLionel Sambuc!
152*0a6a1f1dSLionel Sambuc! The logic used in the DES rounds is the same as in the C code,
153*0a6a1f1dSLionel Sambuc! except that calculations for sbox 1 and sbox 5 begin before
154*0a6a1f1dSLionel Sambuc! the previous round is finished.
155*0a6a1f1dSLionel Sambuc!
156*0a6a1f1dSLionel Sambuc! In each round one half (work) is modified based on key and the
157*0a6a1f1dSLionel Sambuc! other half (use).
158*0a6a1f1dSLionel Sambuc!
159*0a6a1f1dSLionel Sambuc! In this version we do two rounds in a loop repeated 7 times
160*0a6a1f1dSLionel Sambuc! and two rounds seperately.
161*0a6a1f1dSLionel Sambuc!
162*0a6a1f1dSLionel Sambuc! One half has the bits for the sboxes in the following positions:
163*0a6a1f1dSLionel Sambuc!
164*0a6a1f1dSLionel Sambuc!	777777xx555555xx333333xx111111xx
165*0a6a1f1dSLionel Sambuc!
166*0a6a1f1dSLionel Sambuc!	88xx666666xx444444xx222222xx8888
167*0a6a1f1dSLionel Sambuc!
168*0a6a1f1dSLionel Sambuc! The bits for each sbox are xor-ed with the key bits for that box.
169*0a6a1f1dSLionel Sambuc! The above xx bits are cleared, and the result used for lookup in
170*0a6a1f1dSLionel Sambuc! the sbox table. Each sbox entry contains the 4 output bits permuted
171*0a6a1f1dSLionel Sambuc! into 32 bits according to the P permutation.
172*0a6a1f1dSLionel Sambuc!
173*0a6a1f1dSLionel Sambuc! In the description of DES, left and right are switched after
174*0a6a1f1dSLionel Sambuc! each round, except after last round. In this code the original
175*0a6a1f1dSLionel Sambuc! left and right are kept in the same register in all rounds, meaning
176*0a6a1f1dSLionel Sambuc! that after the 16 rounds the result for right is in the register
177*0a6a1f1dSLionel Sambuc! originally used for left.
178*0a6a1f1dSLionel Sambuc!
179*0a6a1f1dSLionel Sambuc! parameter 1  first work (left in first round)
180*0a6a1f1dSLionel Sambuc! parameter 2  first use (right in first round)
181*0a6a1f1dSLionel Sambuc! parameter 3  enc/dec  1/-1
182*0a6a1f1dSLionel Sambuc! parameter 4  loop label
183*0a6a1f1dSLionel Sambuc! parameter 5  key address register
184*0a6a1f1dSLionel Sambuc! parameter 6  optional address for key next encryption/decryption
185*0a6a1f1dSLionel Sambuc! parameter 7  not empty for include retl
186*0a6a1f1dSLionel Sambuc!
187*0a6a1f1dSLionel Sambuc! also compares in2 to 8
188*0a6a1f1dSLionel Sambuc
189*0a6a1f1dSLionel Sambuc
190*0a6a1f1dSLionel Sambuc
191*0a6a1f1dSLionel Sambuc
192*0a6a1f1dSLionel Sambuc! fp_macro
193*0a6a1f1dSLionel Sambuc!
194*0a6a1f1dSLionel Sambuc!  parameter 1   right (original left)
195*0a6a1f1dSLionel Sambuc!  parameter 2   left (original right)
196*0a6a1f1dSLionel Sambuc!  parameter 3   1 for optional store to [in0]
197*0a6a1f1dSLionel Sambuc!  parameter 4   1 for load input/output address to local5/7
198*0a6a1f1dSLionel Sambuc!
199*0a6a1f1dSLionel Sambuc!  The final permutation logic switches the halfes, meaning that
200*0a6a1f1dSLionel Sambuc!  left and right ends up the the registers originally used.
201*0a6a1f1dSLionel Sambuc
202*0a6a1f1dSLionel Sambuc
203*0a6a1f1dSLionel Sambuc
204*0a6a1f1dSLionel Sambuc
205*0a6a1f1dSLionel Sambuc! fp_ip_macro
206*0a6a1f1dSLionel Sambuc!
207*0a6a1f1dSLionel Sambuc! Does initial permutation for next block mixed with
208*0a6a1f1dSLionel Sambuc! final permutation for current block.
209*0a6a1f1dSLionel Sambuc!
210*0a6a1f1dSLionel Sambuc! parameter 1   original left
211*0a6a1f1dSLionel Sambuc! parameter 2   original right
212*0a6a1f1dSLionel Sambuc! parameter 3   left ip
213*0a6a1f1dSLionel Sambuc! parameter 4   right ip
214*0a6a1f1dSLionel Sambuc! parameter 5   1: load ks1/ks2 to in3/in4, add 120 to in4
215*0a6a1f1dSLionel Sambuc!                2: mov in4 to in3
216*0a6a1f1dSLionel Sambuc!
217*0a6a1f1dSLionel Sambuc! also adds -8 to length in2 and loads loop counter to out4
218*0a6a1f1dSLionel Sambuc
219*0a6a1f1dSLionel Sambuc
220*0a6a1f1dSLionel Sambuc
221*0a6a1f1dSLionel Sambuc
222*0a6a1f1dSLionel Sambuc
223*0a6a1f1dSLionel Sambuc! load_little_endian
224*0a6a1f1dSLionel Sambuc!
225*0a6a1f1dSLionel Sambuc! parameter 1  address
226*0a6a1f1dSLionel Sambuc! parameter 2  destination left
227*0a6a1f1dSLionel Sambuc! parameter 3  destination right
228*0a6a1f1dSLionel Sambuc! parameter 4  temporar
229*0a6a1f1dSLionel Sambuc! parameter 5  label
230*0a6a1f1dSLionel Sambuc
231*0a6a1f1dSLionel Sambuc
232*0a6a1f1dSLionel Sambuc
233*0a6a1f1dSLionel Sambuc
234*0a6a1f1dSLionel Sambuc! load_little_endian_inc
235*0a6a1f1dSLionel Sambuc!
236*0a6a1f1dSLionel Sambuc! parameter 1  address
237*0a6a1f1dSLionel Sambuc! parameter 2  destination left
238*0a6a1f1dSLionel Sambuc! parameter 3  destination right
239*0a6a1f1dSLionel Sambuc! parameter 4  temporar
240*0a6a1f1dSLionel Sambuc! parameter 4  label
241*0a6a1f1dSLionel Sambuc!
242*0a6a1f1dSLionel Sambuc! adds 8 to address
243*0a6a1f1dSLionel Sambuc
244*0a6a1f1dSLionel Sambuc
245*0a6a1f1dSLionel Sambuc
246*0a6a1f1dSLionel Sambuc
247*0a6a1f1dSLionel Sambuc! load_n_bytes
248*0a6a1f1dSLionel Sambuc!
249*0a6a1f1dSLionel Sambuc! Loads 1 to 7 bytes little endian
250*0a6a1f1dSLionel Sambuc! Remaining bytes are zeroed.
251*0a6a1f1dSLionel Sambuc!
252*0a6a1f1dSLionel Sambuc! parameter 1  address
253*0a6a1f1dSLionel Sambuc! parameter 2  length
254*0a6a1f1dSLionel Sambuc! parameter 3  destination register left
255*0a6a1f1dSLionel Sambuc! parameter 4  destination register right
256*0a6a1f1dSLionel Sambuc! parameter 5  temp
257*0a6a1f1dSLionel Sambuc! parameter 6  temp2
258*0a6a1f1dSLionel Sambuc! parameter 7  label
259*0a6a1f1dSLionel Sambuc! parameter 8  return label
260*0a6a1f1dSLionel Sambuc
261*0a6a1f1dSLionel Sambuc
262*0a6a1f1dSLionel Sambuc
263*0a6a1f1dSLionel Sambuc
264*0a6a1f1dSLionel Sambuc! store_little_endian
265*0a6a1f1dSLionel Sambuc!
266*0a6a1f1dSLionel Sambuc! parameter 1  address
267*0a6a1f1dSLionel Sambuc! parameter 2  source left
268*0a6a1f1dSLionel Sambuc! parameter 3  source right
269*0a6a1f1dSLionel Sambuc! parameter 4  temporar
270*0a6a1f1dSLionel Sambuc
271*0a6a1f1dSLionel Sambuc
272*0a6a1f1dSLionel Sambuc
273*0a6a1f1dSLionel Sambuc
274*0a6a1f1dSLionel Sambuc! store_n_bytes
275*0a6a1f1dSLionel Sambuc!
276*0a6a1f1dSLionel Sambuc! Stores 1 to 7 bytes little endian
277*0a6a1f1dSLionel Sambuc!
278*0a6a1f1dSLionel Sambuc! parameter 1  address
279*0a6a1f1dSLionel Sambuc! parameter 2  length
280*0a6a1f1dSLionel Sambuc! parameter 3  source register left
281*0a6a1f1dSLionel Sambuc! parameter 4  source register right
282*0a6a1f1dSLionel Sambuc! parameter 5  temp
283*0a6a1f1dSLionel Sambuc! parameter 6  temp2
284*0a6a1f1dSLionel Sambuc! parameter 7  label
285*0a6a1f1dSLionel Sambuc! parameter 8  return label
286*0a6a1f1dSLionel Sambuc
287*0a6a1f1dSLionel Sambuc
288*0a6a1f1dSLionel Sambuc
289*0a6a1f1dSLionel Sambuc
290*0a6a1f1dSLionel Sambuc
291*0a6a1f1dSLionel Sambuc
292*0a6a1f1dSLionel Sambuc
293*0a6a1f1dSLionel Sambuc
294*0a6a1f1dSLionel Sambuc.section	".text"
295*0a6a1f1dSLionel Sambuc
296*0a6a1f1dSLionel Sambuc	.align 32
297*0a6a1f1dSLionel Sambuc
298*0a6a1f1dSLionel Sambuc.des_enc:
299*0a6a1f1dSLionel Sambuc
300*0a6a1f1dSLionel Sambuc	! key address in3
301*0a6a1f1dSLionel Sambuc	! loads key next encryption/decryption first round from [in4]
302*0a6a1f1dSLionel Sambuc
303*0a6a1f1dSLionel Sambuc
304*0a6a1f1dSLionel Sambuc
305*0a6a1f1dSLionel Sambuc! rounds_macro
306*0a6a1f1dSLionel Sambuc! in5 out5 1 .des_enc.1 in3 in4 retl
307*0a6a1f1dSLionel Sambuc
308*0a6a1f1dSLionel Sambuc	xor	out5, out0, local1
309*0a6a1f1dSLionel Sambuc
310*0a6a1f1dSLionel Sambuc	ld	[out2+284], local5        ! 0x0000FC00
311*0a6a1f1dSLionel Sambuc	ba	.des_enc.1
312*0a6a1f1dSLionel Sambuc	and	local1, 252, local1
313*0a6a1f1dSLionel Sambuc
314*0a6a1f1dSLionel Sambuc	.align 32
315*0a6a1f1dSLionel Sambuc
316*0a6a1f1dSLionel Sambuc.des_enc.1:
317*0a6a1f1dSLionel Sambuc	! local6 is address sbox 6
318*0a6a1f1dSLionel Sambuc	! out3   is address sbox 8
319*0a6a1f1dSLionel Sambuc	! out4   is loop counter
320*0a6a1f1dSLionel Sambuc
321*0a6a1f1dSLionel Sambuc	ld	[global1+local1], local1
322*0a6a1f1dSLionel Sambuc	xor	out5, out1, out1            ! 8642
323*0a6a1f1dSLionel Sambuc	xor	out5, out0, out0            ! 7531
324*0a6a1f1dSLionel Sambuc	! fmovs	%f0, %f0                  ! fxor used for alignment
325*0a6a1f1dSLionel Sambuc
326*0a6a1f1dSLionel Sambuc	srl	out1, 4, local0           ! rotate 4 right
327*0a6a1f1dSLionel Sambuc	and	out0, local5, local3      ! 3
328*0a6a1f1dSLionel Sambuc	! fmovs	%f0, %f0
329*0a6a1f1dSLionel Sambuc
330*0a6a1f1dSLionel Sambuc	ld	[in3+1*8], local7         ! key 7531 next round
331*0a6a1f1dSLionel Sambuc	srl	local3, 8, local3         ! 3
332*0a6a1f1dSLionel Sambuc	and	local0, 252, local2       ! 2
333*0a6a1f1dSLionel Sambuc	! fmovs	%f0, %f0
334*0a6a1f1dSLionel Sambuc
335*0a6a1f1dSLionel Sambuc	ld	[global3+local3],local3   ! 3
336*0a6a1f1dSLionel Sambuc	sll	out1, 28, out1            ! rotate
337*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5            ! 1 finished, local1 now sbox 7
338*0a6a1f1dSLionel Sambuc
339*0a6a1f1dSLionel Sambuc	ld	[global2+local2], local2  ! 2
340*0a6a1f1dSLionel Sambuc	srl	out0, 24, local1          ! 7
341*0a6a1f1dSLionel Sambuc	or	out1, local0, out1        ! rotate
342*0a6a1f1dSLionel Sambuc
343*0a6a1f1dSLionel Sambuc	ldub	[out2+local1], local1     ! 7 (and 0xFC)
344*0a6a1f1dSLionel Sambuc	srl	out1, 24, local0          ! 8
345*0a6a1f1dSLionel Sambuc	and	out1, local5, local4      ! 4
346*0a6a1f1dSLionel Sambuc
347*0a6a1f1dSLionel Sambuc	ldub	[out2+local0], local0     ! 8 (and 0xFC)
348*0a6a1f1dSLionel Sambuc	srl	local4, 8, local4         ! 4
349*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5            ! 2 finished local2 now sbox 6
350*0a6a1f1dSLionel Sambuc
351*0a6a1f1dSLionel Sambuc	ld	[global4+local4],local4   ! 4
352*0a6a1f1dSLionel Sambuc	srl	out1, 16, local2          ! 6
353*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5            ! 3 finished local3 now sbox 5
354*0a6a1f1dSLionel Sambuc
355*0a6a1f1dSLionel Sambuc	ld	[out3+local0],local0      ! 8
356*0a6a1f1dSLionel Sambuc	and	local2, 252, local2       ! 6
357*0a6a1f1dSLionel Sambuc	add	global1, 1536, local5     ! address sbox 7
358*0a6a1f1dSLionel Sambuc
359*0a6a1f1dSLionel Sambuc	ld	[local6+local2], local2   ! 6
360*0a6a1f1dSLionel Sambuc	srl	out0, 16, local3          ! 5
361*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5            ! 4 finished
362*0a6a1f1dSLionel Sambuc
363*0a6a1f1dSLionel Sambuc	ld	[local5+local1],local1    ! 7
364*0a6a1f1dSLionel Sambuc	and	local3, 252, local3       ! 5
365*0a6a1f1dSLionel Sambuc	xor	in5, local0, in5            ! 8 finished
366*0a6a1f1dSLionel Sambuc
367*0a6a1f1dSLionel Sambuc	ld	[global5+local3],local3   ! 5
368*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5            ! 6 finished
369*0a6a1f1dSLionel Sambuc	subcc	out4, 1, out4
370*0a6a1f1dSLionel Sambuc
371*0a6a1f1dSLionel Sambuc	ld	[in3+1*8+4], out0         ! key 8642 next round
372*0a6a1f1dSLionel Sambuc	xor	in5, local7, local2        ! sbox 5 next round
373*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5            ! 7 finished
374*0a6a1f1dSLionel Sambuc
375*0a6a1f1dSLionel Sambuc	srl	local2, 16, local2        ! sbox 5 next round
376*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5            ! 5 finished
377*0a6a1f1dSLionel Sambuc
378*0a6a1f1dSLionel Sambuc	ld	[in3+1*16+4], out1        ! key 8642 next round again
379*0a6a1f1dSLionel Sambuc	and	local2, 252, local2       ! sbox5 next round
380*0a6a1f1dSLionel Sambuc! next round
381*0a6a1f1dSLionel Sambuc	xor	in5, local7, local7        ! 7531
382*0a6a1f1dSLionel Sambuc
383*0a6a1f1dSLionel Sambuc	ld	[global5+local2], local2  ! 5
384*0a6a1f1dSLionel Sambuc	srl	local7, 24, local3        ! 7
385*0a6a1f1dSLionel Sambuc	xor	in5, out0, out0            ! 8642
386*0a6a1f1dSLionel Sambuc
387*0a6a1f1dSLionel Sambuc	ldub	[out2+local3], local3     ! 7 (and 0xFC)
388*0a6a1f1dSLionel Sambuc	srl	out0, 4, local0           ! rotate 4 right
389*0a6a1f1dSLionel Sambuc	and	local7, 252, local1       ! 1
390*0a6a1f1dSLionel Sambuc
391*0a6a1f1dSLionel Sambuc	sll	out0, 28, out0            ! rotate
392*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5            ! 5 finished local2 used
393*0a6a1f1dSLionel Sambuc
394*0a6a1f1dSLionel Sambuc	srl	local0, 8, local4         ! 4
395*0a6a1f1dSLionel Sambuc	and	local0, 252, local2       ! 2
396*0a6a1f1dSLionel Sambuc	ld	[local5+local3], local3   ! 7
397*0a6a1f1dSLionel Sambuc
398*0a6a1f1dSLionel Sambuc	srl	local0, 16, local5        ! 6
399*0a6a1f1dSLionel Sambuc	or	out0, local0, out0        ! rotate
400*0a6a1f1dSLionel Sambuc	ld	[global2+local2], local2  ! 2
401*0a6a1f1dSLionel Sambuc
402*0a6a1f1dSLionel Sambuc	srl	out0, 24, local0
403*0a6a1f1dSLionel Sambuc	ld	[in3+1*16], out0          ! key 7531 next round
404*0a6a1f1dSLionel Sambuc	and	local4, 252, local4	  ! 4
405*0a6a1f1dSLionel Sambuc
406*0a6a1f1dSLionel Sambuc	and	local5, 252, local5       ! 6
407*0a6a1f1dSLionel Sambuc	ld	[global4+local4], local4  ! 4
408*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5            ! 7 finished local3 used
409*0a6a1f1dSLionel Sambuc
410*0a6a1f1dSLionel Sambuc	and	local0, 252, local0       ! 8
411*0a6a1f1dSLionel Sambuc	ld	[local6+local5], local5   ! 6
412*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5            ! 2 finished local2 now sbox 3
413*0a6a1f1dSLionel Sambuc
414*0a6a1f1dSLionel Sambuc	srl	local7, 8, local2         ! 3 start
415*0a6a1f1dSLionel Sambuc	ld	[out3+local0], local0     ! 8
416*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5            ! 4 finished
417*0a6a1f1dSLionel Sambuc
418*0a6a1f1dSLionel Sambuc	and	local2, 252, local2       ! 3
419*0a6a1f1dSLionel Sambuc	ld	[global1+local1], local1  ! 1
420*0a6a1f1dSLionel Sambuc	xor	out5, local5, out5            ! 6 finished local5 used
421*0a6a1f1dSLionel Sambuc
422*0a6a1f1dSLionel Sambuc	ld	[global3+local2], local2  ! 3
423*0a6a1f1dSLionel Sambuc	xor	out5, local0, out5            ! 8 finished
424*0a6a1f1dSLionel Sambuc	add	in3, 1*16, in3             ! enc add 8, dec add -8 to key pointer
425*0a6a1f1dSLionel Sambuc
426*0a6a1f1dSLionel Sambuc	ld	[out2+284], local5        ! 0x0000FC00
427*0a6a1f1dSLionel Sambuc	xor	out5, out0, local4          ! sbox 1 next round
428*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5            ! 1 finished
429*0a6a1f1dSLionel Sambuc
430*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5            ! 3 finished
431*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
432*0a6a1f1dSLionel Sambuc	bne,pt	%icc, .des_enc.1
433*0a6a1f1dSLionel Sambuc#else
434*0a6a1f1dSLionel Sambuc	bne	.des_enc.1
435*0a6a1f1dSLionel Sambuc#endif
436*0a6a1f1dSLionel Sambuc	and	local4, 252, local1       ! sbox 1 next round
437*0a6a1f1dSLionel Sambuc
438*0a6a1f1dSLionel Sambuc! two rounds more:
439*0a6a1f1dSLionel Sambuc
440*0a6a1f1dSLionel Sambuc	ld	[global1+local1], local1
441*0a6a1f1dSLionel Sambuc	xor	out5, out1, out1
442*0a6a1f1dSLionel Sambuc	xor	out5, out0, out0
443*0a6a1f1dSLionel Sambuc
444*0a6a1f1dSLionel Sambuc	srl	out1, 4, local0           ! rotate
445*0a6a1f1dSLionel Sambuc	and	out0, local5, local3
446*0a6a1f1dSLionel Sambuc
447*0a6a1f1dSLionel Sambuc	ld	[in3+1*8], local7         ! key 7531
448*0a6a1f1dSLionel Sambuc	srl	local3, 8, local3
449*0a6a1f1dSLionel Sambuc	and	local0, 252, local2
450*0a6a1f1dSLionel Sambuc
451*0a6a1f1dSLionel Sambuc	ld	[global3+local3],local3
452*0a6a1f1dSLionel Sambuc	sll	out1, 28, out1            ! rotate
453*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5            ! 1 finished, local1 now sbox 7
454*0a6a1f1dSLionel Sambuc
455*0a6a1f1dSLionel Sambuc	ld	[global2+local2], local2
456*0a6a1f1dSLionel Sambuc	srl	out0, 24, local1
457*0a6a1f1dSLionel Sambuc	or	out1, local0, out1        ! rotate
458*0a6a1f1dSLionel Sambuc
459*0a6a1f1dSLionel Sambuc	ldub	[out2+local1], local1
460*0a6a1f1dSLionel Sambuc	srl	out1, 24, local0
461*0a6a1f1dSLionel Sambuc	and	out1, local5, local4
462*0a6a1f1dSLionel Sambuc
463*0a6a1f1dSLionel Sambuc	ldub	[out2+local0], local0
464*0a6a1f1dSLionel Sambuc	srl	local4, 8, local4
465*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5            ! 2 finished local2 now sbox 6
466*0a6a1f1dSLionel Sambuc
467*0a6a1f1dSLionel Sambuc	ld	[global4+local4],local4
468*0a6a1f1dSLionel Sambuc	srl	out1, 16, local2
469*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5            ! 3 finished local3 now sbox 5
470*0a6a1f1dSLionel Sambuc
471*0a6a1f1dSLionel Sambuc	ld	[out3+local0],local0
472*0a6a1f1dSLionel Sambuc	and	local2, 252, local2
473*0a6a1f1dSLionel Sambuc	add	global1, 1536, local5     ! address sbox 7
474*0a6a1f1dSLionel Sambuc
475*0a6a1f1dSLionel Sambuc	ld	[local6+local2], local2
476*0a6a1f1dSLionel Sambuc	srl	out0, 16, local3
477*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5            ! 4 finished
478*0a6a1f1dSLionel Sambuc
479*0a6a1f1dSLionel Sambuc	ld	[local5+local1],local1
480*0a6a1f1dSLionel Sambuc	and	local3, 252, local3
481*0a6a1f1dSLionel Sambuc	xor	in5, local0, in5
482*0a6a1f1dSLionel Sambuc
483*0a6a1f1dSLionel Sambuc	ld	[global5+local3],local3
484*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5            ! 6 finished
485*0a6a1f1dSLionel Sambuc	cmp	in2, 8
486*0a6a1f1dSLionel Sambuc
487*0a6a1f1dSLionel Sambuc	ld	[out2+280], out4  ! loop counter
488*0a6a1f1dSLionel Sambuc	xor	in5, local7, local2        ! sbox 5 next round
489*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5            ! 7 finished
490*0a6a1f1dSLionel Sambuc
491*0a6a1f1dSLionel Sambuc	ld	[in3+1*8+4], out0
492*0a6a1f1dSLionel Sambuc	srl	local2, 16, local2        ! sbox 5 next round
493*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5            ! 5 finished
494*0a6a1f1dSLionel Sambuc
495*0a6a1f1dSLionel Sambuc	and	local2, 252, local2
496*0a6a1f1dSLionel Sambuc! next round (two rounds more)
497*0a6a1f1dSLionel Sambuc	xor	in5, local7, local7        ! 7531
498*0a6a1f1dSLionel Sambuc
499*0a6a1f1dSLionel Sambuc	ld	[global5+local2], local2
500*0a6a1f1dSLionel Sambuc	srl	local7, 24, local3
501*0a6a1f1dSLionel Sambuc	xor	in5, out0, out0            ! 8642
502*0a6a1f1dSLionel Sambuc
503*0a6a1f1dSLionel Sambuc	ldub	[out2+local3], local3
504*0a6a1f1dSLionel Sambuc	srl	out0, 4, local0           ! rotate
505*0a6a1f1dSLionel Sambuc	and	local7, 252, local1
506*0a6a1f1dSLionel Sambuc
507*0a6a1f1dSLionel Sambuc	sll	out0, 28, out0            ! rotate
508*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5            ! 5 finished local2 used
509*0a6a1f1dSLionel Sambuc
510*0a6a1f1dSLionel Sambuc	srl	local0, 8, local4
511*0a6a1f1dSLionel Sambuc	and	local0, 252, local2
512*0a6a1f1dSLionel Sambuc	ld	[local5+local3], local3
513*0a6a1f1dSLionel Sambuc
514*0a6a1f1dSLionel Sambuc	srl	local0, 16, local5
515*0a6a1f1dSLionel Sambuc	or	out0, local0, out0        ! rotate
516*0a6a1f1dSLionel Sambuc	ld	[global2+local2], local2
517*0a6a1f1dSLionel Sambuc
518*0a6a1f1dSLionel Sambuc	srl	out0, 24, local0
519*0a6a1f1dSLionel Sambuc	ld	[in4], out0   ! key next encryption/decryption
520*0a6a1f1dSLionel Sambuc	and	local4, 252, local4
521*0a6a1f1dSLionel Sambuc
522*0a6a1f1dSLionel Sambuc	and	local5, 252, local5
523*0a6a1f1dSLionel Sambuc	ld	[global4+local4], local4
524*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5            ! 7 finished local3 used
525*0a6a1f1dSLionel Sambuc
526*0a6a1f1dSLionel Sambuc	and	local0, 252, local0
527*0a6a1f1dSLionel Sambuc	ld	[local6+local5], local5
528*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5            ! 2 finished local2 now sbox 3
529*0a6a1f1dSLionel Sambuc
530*0a6a1f1dSLionel Sambuc	srl	local7, 8, local2         ! 3 start
531*0a6a1f1dSLionel Sambuc	ld	[out3+local0], local0
532*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5
533*0a6a1f1dSLionel Sambuc
534*0a6a1f1dSLionel Sambuc	and	local2, 252, local2
535*0a6a1f1dSLionel Sambuc	ld	[global1+local1], local1
536*0a6a1f1dSLionel Sambuc	xor	out5, local5, out5            ! 6 finished local5 used
537*0a6a1f1dSLionel Sambuc
538*0a6a1f1dSLionel Sambuc	ld	[global3+local2], local2
539*0a6a1f1dSLionel Sambuc	srl	in5, 3, local3
540*0a6a1f1dSLionel Sambuc	xor	out5, local0, out5
541*0a6a1f1dSLionel Sambuc
542*0a6a1f1dSLionel Sambuc	ld	[in4+4], out1 ! key next encryption/decryption
543*0a6a1f1dSLionel Sambuc	sll	in5, 29, local4
544*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5
545*0a6a1f1dSLionel Sambuc
546*0a6a1f1dSLionel Sambuc	retl
547*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
548*0a6a1f1dSLionel Sambuc
549*0a6a1f1dSLionel Sambuc
550*0a6a1f1dSLionel Sambuc
551*0a6a1f1dSLionel Sambuc	.align 32
552*0a6a1f1dSLionel Sambuc
553*0a6a1f1dSLionel Sambuc.des_dec:
554*0a6a1f1dSLionel Sambuc
555*0a6a1f1dSLionel Sambuc	! implemented with out5 as first parameter to avoid
556*0a6a1f1dSLionel Sambuc	! register exchange in ede modes
557*0a6a1f1dSLionel Sambuc
558*0a6a1f1dSLionel Sambuc	! key address in4
559*0a6a1f1dSLionel Sambuc	! loads key next encryption/decryption first round from [in3]
560*0a6a1f1dSLionel Sambuc
561*0a6a1f1dSLionel Sambuc
562*0a6a1f1dSLionel Sambuc
563*0a6a1f1dSLionel Sambuc! rounds_macro
564*0a6a1f1dSLionel Sambuc! out5 in5 -1 .des_dec.1 in4 in3 retl
565*0a6a1f1dSLionel Sambuc
566*0a6a1f1dSLionel Sambuc	xor	in5, out0, local1
567*0a6a1f1dSLionel Sambuc
568*0a6a1f1dSLionel Sambuc	ld	[out2+284], local5        ! 0x0000FC00
569*0a6a1f1dSLionel Sambuc	ba	.des_dec.1
570*0a6a1f1dSLionel Sambuc	and	local1, 252, local1
571*0a6a1f1dSLionel Sambuc
572*0a6a1f1dSLionel Sambuc	.align 32
573*0a6a1f1dSLionel Sambuc
574*0a6a1f1dSLionel Sambuc.des_dec.1:
575*0a6a1f1dSLionel Sambuc	! local6 is address sbox 6
576*0a6a1f1dSLionel Sambuc	! out3   is address sbox 8
577*0a6a1f1dSLionel Sambuc	! out4   is loop counter
578*0a6a1f1dSLionel Sambuc
579*0a6a1f1dSLionel Sambuc	ld	[global1+local1], local1
580*0a6a1f1dSLionel Sambuc	xor	in5, out1, out1            ! 8642
581*0a6a1f1dSLionel Sambuc	xor	in5, out0, out0            ! 7531
582*0a6a1f1dSLionel Sambuc	! fmovs	%f0, %f0                  ! fxor used for alignment
583*0a6a1f1dSLionel Sambuc
584*0a6a1f1dSLionel Sambuc	srl	out1, 4, local0           ! rotate 4 right
585*0a6a1f1dSLionel Sambuc	and	out0, local5, local3      ! 3
586*0a6a1f1dSLionel Sambuc	! fmovs	%f0, %f0
587*0a6a1f1dSLionel Sambuc
588*0a6a1f1dSLionel Sambuc	ld	[in4+-1*8], local7         ! key 7531 next round
589*0a6a1f1dSLionel Sambuc	srl	local3, 8, local3         ! 3
590*0a6a1f1dSLionel Sambuc	and	local0, 252, local2       ! 2
591*0a6a1f1dSLionel Sambuc	! fmovs	%f0, %f0
592*0a6a1f1dSLionel Sambuc
593*0a6a1f1dSLionel Sambuc	ld	[global3+local3],local3   ! 3
594*0a6a1f1dSLionel Sambuc	sll	out1, 28, out1            ! rotate
595*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5            ! 1 finished, local1 now sbox 7
596*0a6a1f1dSLionel Sambuc
597*0a6a1f1dSLionel Sambuc	ld	[global2+local2], local2  ! 2
598*0a6a1f1dSLionel Sambuc	srl	out0, 24, local1          ! 7
599*0a6a1f1dSLionel Sambuc	or	out1, local0, out1        ! rotate
600*0a6a1f1dSLionel Sambuc
601*0a6a1f1dSLionel Sambuc	ldub	[out2+local1], local1     ! 7 (and 0xFC)
602*0a6a1f1dSLionel Sambuc	srl	out1, 24, local0          ! 8
603*0a6a1f1dSLionel Sambuc	and	out1, local5, local4      ! 4
604*0a6a1f1dSLionel Sambuc
605*0a6a1f1dSLionel Sambuc	ldub	[out2+local0], local0     ! 8 (and 0xFC)
606*0a6a1f1dSLionel Sambuc	srl	local4, 8, local4         ! 4
607*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5            ! 2 finished local2 now sbox 6
608*0a6a1f1dSLionel Sambuc
609*0a6a1f1dSLionel Sambuc	ld	[global4+local4],local4   ! 4
610*0a6a1f1dSLionel Sambuc	srl	out1, 16, local2          ! 6
611*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5            ! 3 finished local3 now sbox 5
612*0a6a1f1dSLionel Sambuc
613*0a6a1f1dSLionel Sambuc	ld	[out3+local0],local0      ! 8
614*0a6a1f1dSLionel Sambuc	and	local2, 252, local2       ! 6
615*0a6a1f1dSLionel Sambuc	add	global1, 1536, local5     ! address sbox 7
616*0a6a1f1dSLionel Sambuc
617*0a6a1f1dSLionel Sambuc	ld	[local6+local2], local2   ! 6
618*0a6a1f1dSLionel Sambuc	srl	out0, 16, local3          ! 5
619*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5            ! 4 finished
620*0a6a1f1dSLionel Sambuc
621*0a6a1f1dSLionel Sambuc	ld	[local5+local1],local1    ! 7
622*0a6a1f1dSLionel Sambuc	and	local3, 252, local3       ! 5
623*0a6a1f1dSLionel Sambuc	xor	out5, local0, out5            ! 8 finished
624*0a6a1f1dSLionel Sambuc
625*0a6a1f1dSLionel Sambuc	ld	[global5+local3],local3   ! 5
626*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5            ! 6 finished
627*0a6a1f1dSLionel Sambuc	subcc	out4, 1, out4
628*0a6a1f1dSLionel Sambuc
629*0a6a1f1dSLionel Sambuc	ld	[in4+-1*8+4], out0         ! key 8642 next round
630*0a6a1f1dSLionel Sambuc	xor	out5, local7, local2        ! sbox 5 next round
631*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5            ! 7 finished
632*0a6a1f1dSLionel Sambuc
633*0a6a1f1dSLionel Sambuc	srl	local2, 16, local2        ! sbox 5 next round
634*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5            ! 5 finished
635*0a6a1f1dSLionel Sambuc
636*0a6a1f1dSLionel Sambuc	ld	[in4+-1*16+4], out1        ! key 8642 next round again
637*0a6a1f1dSLionel Sambuc	and	local2, 252, local2       ! sbox5 next round
638*0a6a1f1dSLionel Sambuc! next round
639*0a6a1f1dSLionel Sambuc	xor	out5, local7, local7        ! 7531
640*0a6a1f1dSLionel Sambuc
641*0a6a1f1dSLionel Sambuc	ld	[global5+local2], local2  ! 5
642*0a6a1f1dSLionel Sambuc	srl	local7, 24, local3        ! 7
643*0a6a1f1dSLionel Sambuc	xor	out5, out0, out0            ! 8642
644*0a6a1f1dSLionel Sambuc
645*0a6a1f1dSLionel Sambuc	ldub	[out2+local3], local3     ! 7 (and 0xFC)
646*0a6a1f1dSLionel Sambuc	srl	out0, 4, local0           ! rotate 4 right
647*0a6a1f1dSLionel Sambuc	and	local7, 252, local1       ! 1
648*0a6a1f1dSLionel Sambuc
649*0a6a1f1dSLionel Sambuc	sll	out0, 28, out0            ! rotate
650*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5            ! 5 finished local2 used
651*0a6a1f1dSLionel Sambuc
652*0a6a1f1dSLionel Sambuc	srl	local0, 8, local4         ! 4
653*0a6a1f1dSLionel Sambuc	and	local0, 252, local2       ! 2
654*0a6a1f1dSLionel Sambuc	ld	[local5+local3], local3   ! 7
655*0a6a1f1dSLionel Sambuc
656*0a6a1f1dSLionel Sambuc	srl	local0, 16, local5        ! 6
657*0a6a1f1dSLionel Sambuc	or	out0, local0, out0        ! rotate
658*0a6a1f1dSLionel Sambuc	ld	[global2+local2], local2  ! 2
659*0a6a1f1dSLionel Sambuc
660*0a6a1f1dSLionel Sambuc	srl	out0, 24, local0
661*0a6a1f1dSLionel Sambuc	ld	[in4+-1*16], out0          ! key 7531 next round
662*0a6a1f1dSLionel Sambuc	and	local4, 252, local4	  ! 4
663*0a6a1f1dSLionel Sambuc
664*0a6a1f1dSLionel Sambuc	and	local5, 252, local5       ! 6
665*0a6a1f1dSLionel Sambuc	ld	[global4+local4], local4  ! 4
666*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5            ! 7 finished local3 used
667*0a6a1f1dSLionel Sambuc
668*0a6a1f1dSLionel Sambuc	and	local0, 252, local0       ! 8
669*0a6a1f1dSLionel Sambuc	ld	[local6+local5], local5   ! 6
670*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5            ! 2 finished local2 now sbox 3
671*0a6a1f1dSLionel Sambuc
672*0a6a1f1dSLionel Sambuc	srl	local7, 8, local2         ! 3 start
673*0a6a1f1dSLionel Sambuc	ld	[out3+local0], local0     ! 8
674*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5            ! 4 finished
675*0a6a1f1dSLionel Sambuc
676*0a6a1f1dSLionel Sambuc	and	local2, 252, local2       ! 3
677*0a6a1f1dSLionel Sambuc	ld	[global1+local1], local1  ! 1
678*0a6a1f1dSLionel Sambuc	xor	in5, local5, in5            ! 6 finished local5 used
679*0a6a1f1dSLionel Sambuc
680*0a6a1f1dSLionel Sambuc	ld	[global3+local2], local2  ! 3
681*0a6a1f1dSLionel Sambuc	xor	in5, local0, in5            ! 8 finished
682*0a6a1f1dSLionel Sambuc	add	in4, -1*16, in4             ! enc add 8, dec add -8 to key pointer
683*0a6a1f1dSLionel Sambuc
684*0a6a1f1dSLionel Sambuc	ld	[out2+284], local5        ! 0x0000FC00
685*0a6a1f1dSLionel Sambuc	xor	in5, out0, local4          ! sbox 1 next round
686*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5            ! 1 finished
687*0a6a1f1dSLionel Sambuc
688*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5            ! 3 finished
689*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
690*0a6a1f1dSLionel Sambuc	bne,pt	%icc, .des_dec.1
691*0a6a1f1dSLionel Sambuc#else
692*0a6a1f1dSLionel Sambuc	bne	.des_dec.1
693*0a6a1f1dSLionel Sambuc#endif
694*0a6a1f1dSLionel Sambuc	and	local4, 252, local1       ! sbox 1 next round
695*0a6a1f1dSLionel Sambuc
696*0a6a1f1dSLionel Sambuc! two rounds more:
697*0a6a1f1dSLionel Sambuc
698*0a6a1f1dSLionel Sambuc	ld	[global1+local1], local1
699*0a6a1f1dSLionel Sambuc	xor	in5, out1, out1
700*0a6a1f1dSLionel Sambuc	xor	in5, out0, out0
701*0a6a1f1dSLionel Sambuc
702*0a6a1f1dSLionel Sambuc	srl	out1, 4, local0           ! rotate
703*0a6a1f1dSLionel Sambuc	and	out0, local5, local3
704*0a6a1f1dSLionel Sambuc
705*0a6a1f1dSLionel Sambuc	ld	[in4+-1*8], local7         ! key 7531
706*0a6a1f1dSLionel Sambuc	srl	local3, 8, local3
707*0a6a1f1dSLionel Sambuc	and	local0, 252, local2
708*0a6a1f1dSLionel Sambuc
709*0a6a1f1dSLionel Sambuc	ld	[global3+local3],local3
710*0a6a1f1dSLionel Sambuc	sll	out1, 28, out1            ! rotate
711*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5            ! 1 finished, local1 now sbox 7
712*0a6a1f1dSLionel Sambuc
713*0a6a1f1dSLionel Sambuc	ld	[global2+local2], local2
714*0a6a1f1dSLionel Sambuc	srl	out0, 24, local1
715*0a6a1f1dSLionel Sambuc	or	out1, local0, out1        ! rotate
716*0a6a1f1dSLionel Sambuc
717*0a6a1f1dSLionel Sambuc	ldub	[out2+local1], local1
718*0a6a1f1dSLionel Sambuc	srl	out1, 24, local0
719*0a6a1f1dSLionel Sambuc	and	out1, local5, local4
720*0a6a1f1dSLionel Sambuc
721*0a6a1f1dSLionel Sambuc	ldub	[out2+local0], local0
722*0a6a1f1dSLionel Sambuc	srl	local4, 8, local4
723*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5            ! 2 finished local2 now sbox 6
724*0a6a1f1dSLionel Sambuc
725*0a6a1f1dSLionel Sambuc	ld	[global4+local4],local4
726*0a6a1f1dSLionel Sambuc	srl	out1, 16, local2
727*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5            ! 3 finished local3 now sbox 5
728*0a6a1f1dSLionel Sambuc
729*0a6a1f1dSLionel Sambuc	ld	[out3+local0],local0
730*0a6a1f1dSLionel Sambuc	and	local2, 252, local2
731*0a6a1f1dSLionel Sambuc	add	global1, 1536, local5     ! address sbox 7
732*0a6a1f1dSLionel Sambuc
733*0a6a1f1dSLionel Sambuc	ld	[local6+local2], local2
734*0a6a1f1dSLionel Sambuc	srl	out0, 16, local3
735*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5            ! 4 finished
736*0a6a1f1dSLionel Sambuc
737*0a6a1f1dSLionel Sambuc	ld	[local5+local1],local1
738*0a6a1f1dSLionel Sambuc	and	local3, 252, local3
739*0a6a1f1dSLionel Sambuc	xor	out5, local0, out5
740*0a6a1f1dSLionel Sambuc
741*0a6a1f1dSLionel Sambuc	ld	[global5+local3],local3
742*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5            ! 6 finished
743*0a6a1f1dSLionel Sambuc	cmp	in2, 8
744*0a6a1f1dSLionel Sambuc
745*0a6a1f1dSLionel Sambuc	ld	[out2+280], out4  ! loop counter
746*0a6a1f1dSLionel Sambuc	xor	out5, local7, local2        ! sbox 5 next round
747*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5            ! 7 finished
748*0a6a1f1dSLionel Sambuc
749*0a6a1f1dSLionel Sambuc	ld	[in4+-1*8+4], out0
750*0a6a1f1dSLionel Sambuc	srl	local2, 16, local2        ! sbox 5 next round
751*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5            ! 5 finished
752*0a6a1f1dSLionel Sambuc
753*0a6a1f1dSLionel Sambuc	and	local2, 252, local2
754*0a6a1f1dSLionel Sambuc! next round (two rounds more)
755*0a6a1f1dSLionel Sambuc	xor	out5, local7, local7        ! 7531
756*0a6a1f1dSLionel Sambuc
757*0a6a1f1dSLionel Sambuc	ld	[global5+local2], local2
758*0a6a1f1dSLionel Sambuc	srl	local7, 24, local3
759*0a6a1f1dSLionel Sambuc	xor	out5, out0, out0            ! 8642
760*0a6a1f1dSLionel Sambuc
761*0a6a1f1dSLionel Sambuc	ldub	[out2+local3], local3
762*0a6a1f1dSLionel Sambuc	srl	out0, 4, local0           ! rotate
763*0a6a1f1dSLionel Sambuc	and	local7, 252, local1
764*0a6a1f1dSLionel Sambuc
765*0a6a1f1dSLionel Sambuc	sll	out0, 28, out0            ! rotate
766*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5            ! 5 finished local2 used
767*0a6a1f1dSLionel Sambuc
768*0a6a1f1dSLionel Sambuc	srl	local0, 8, local4
769*0a6a1f1dSLionel Sambuc	and	local0, 252, local2
770*0a6a1f1dSLionel Sambuc	ld	[local5+local3], local3
771*0a6a1f1dSLionel Sambuc
772*0a6a1f1dSLionel Sambuc	srl	local0, 16, local5
773*0a6a1f1dSLionel Sambuc	or	out0, local0, out0        ! rotate
774*0a6a1f1dSLionel Sambuc	ld	[global2+local2], local2
775*0a6a1f1dSLionel Sambuc
776*0a6a1f1dSLionel Sambuc	srl	out0, 24, local0
777*0a6a1f1dSLionel Sambuc	ld	[in3], out0   ! key next encryption/decryption
778*0a6a1f1dSLionel Sambuc	and	local4, 252, local4
779*0a6a1f1dSLionel Sambuc
780*0a6a1f1dSLionel Sambuc	and	local5, 252, local5
781*0a6a1f1dSLionel Sambuc	ld	[global4+local4], local4
782*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5            ! 7 finished local3 used
783*0a6a1f1dSLionel Sambuc
784*0a6a1f1dSLionel Sambuc	and	local0, 252, local0
785*0a6a1f1dSLionel Sambuc	ld	[local6+local5], local5
786*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5            ! 2 finished local2 now sbox 3
787*0a6a1f1dSLionel Sambuc
788*0a6a1f1dSLionel Sambuc	srl	local7, 8, local2         ! 3 start
789*0a6a1f1dSLionel Sambuc	ld	[out3+local0], local0
790*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
791*0a6a1f1dSLionel Sambuc
792*0a6a1f1dSLionel Sambuc	and	local2, 252, local2
793*0a6a1f1dSLionel Sambuc	ld	[global1+local1], local1
794*0a6a1f1dSLionel Sambuc	xor	in5, local5, in5            ! 6 finished local5 used
795*0a6a1f1dSLionel Sambuc
796*0a6a1f1dSLionel Sambuc	ld	[global3+local2], local2
797*0a6a1f1dSLionel Sambuc	srl	out5, 3, local3
798*0a6a1f1dSLionel Sambuc	xor	in5, local0, in5
799*0a6a1f1dSLionel Sambuc
800*0a6a1f1dSLionel Sambuc	ld	[in3+4], out1 ! key next encryption/decryption
801*0a6a1f1dSLionel Sambuc	sll	out5, 29, local4
802*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5
803*0a6a1f1dSLionel Sambuc
804*0a6a1f1dSLionel Sambuc	retl
805*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5
806*0a6a1f1dSLionel Sambuc
807*0a6a1f1dSLionel Sambuc
808*0a6a1f1dSLionel Sambuc
809*0a6a1f1dSLionel Sambuc
810*0a6a1f1dSLionel Sambuc! void DES_encrypt1(data, ks, enc)
811*0a6a1f1dSLionel Sambuc! *******************************
812*0a6a1f1dSLionel Sambuc
813*0a6a1f1dSLionel Sambuc	.align 32
814*0a6a1f1dSLionel Sambuc	.global DES_encrypt1
815*0a6a1f1dSLionel Sambuc	.type	 DES_encrypt1,#function
816*0a6a1f1dSLionel Sambuc
817*0a6a1f1dSLionel SambucDES_encrypt1:
818*0a6a1f1dSLionel Sambuc
819*0a6a1f1dSLionel Sambuc	save	%sp, FRAME, %sp
820*0a6a1f1dSLionel Sambuc
821*0a6a1f1dSLionel Sambuc	sethi	%hi(_PIC_DES_SPtrans-1f),global1
822*0a6a1f1dSLionel Sambuc	or	global1,%lo(_PIC_DES_SPtrans-1f),global1
823*0a6a1f1dSLionel Sambuc1:	call	.+8
824*0a6a1f1dSLionel Sambuc	add	%o7,global1,global1
825*0a6a1f1dSLionel Sambuc	sub	global1,_PIC_DES_SPtrans-.des_and,out2
826*0a6a1f1dSLionel Sambuc
827*0a6a1f1dSLionel Sambuc	ld	[in0], in5                ! left
828*0a6a1f1dSLionel Sambuc	cmp	in2, 0                    ! enc
829*0a6a1f1dSLionel Sambuc
830*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
831*0a6a1f1dSLionel Sambuc	be,pn	%icc, .encrypt.dec        ! enc/dec
832*0a6a1f1dSLionel Sambuc#else
833*0a6a1f1dSLionel Sambuc	be	.encrypt.dec
834*0a6a1f1dSLionel Sambuc#endif
835*0a6a1f1dSLionel Sambuc	ld	[in0+4], out5             ! right
836*0a6a1f1dSLionel Sambuc
837*0a6a1f1dSLionel Sambuc	! parameter 6  1/2 for include encryption/decryption
838*0a6a1f1dSLionel Sambuc	! parameter 7  1 for move in1 to in3
839*0a6a1f1dSLionel Sambuc	! parameter 8  1 for move in3 to in4, 2 for move in4 to in3
840*0a6a1f1dSLionel Sambuc
841*0a6a1f1dSLionel Sambuc
842*0a6a1f1dSLionel Sambuc
843*0a6a1f1dSLionel Sambuc! ip_macro
844*0a6a1f1dSLionel Sambuc! in5 out5 out5 in5 in3 0 1 1
845*0a6a1f1dSLionel Sambuc
846*0a6a1f1dSLionel Sambuc	ld	[out2+256], local1
847*0a6a1f1dSLionel Sambuc	srl	out5, 4, local4
848*0a6a1f1dSLionel Sambuc
849*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
850*0a6a1f1dSLionel Sambuc	mov in1, in3
851*0a6a1f1dSLionel Sambuc
852*0a6a1f1dSLionel Sambuc	ld	[out2+260], local2
853*0a6a1f1dSLionel Sambuc	and	local4, local1, local4
854*0a6a1f1dSLionel Sambuc	mov in3, in4
855*0a6a1f1dSLionel Sambuc
856*0a6a1f1dSLionel Sambuc
857*0a6a1f1dSLionel Sambuc	ld	[out2+280], out4          ! loop counter
858*0a6a1f1dSLionel Sambuc	sll	local4, 4, local1
859*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
860*0a6a1f1dSLionel Sambuc
861*0a6a1f1dSLionel Sambuc	ld	[out2+264], local3
862*0a6a1f1dSLionel Sambuc	srl	in5, 16, local4
863*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5
864*0a6a1f1dSLionel Sambuc
865*0a6a1f1dSLionel Sambuc
866*0a6a1f1dSLionel Sambuc	xor	local4, out5, local4
867*0a6a1f1dSLionel Sambuc	nop	!sethi	%hi(DES_SPtrans), global1 ! sbox addr
868*0a6a1f1dSLionel Sambuc
869*0a6a1f1dSLionel Sambuc
870*0a6a1f1dSLionel Sambuc	and	local4, local2, local4
871*0a6a1f1dSLionel Sambuc	nop	!or	global1, %lo(DES_SPtrans), global1   ! sbox addr
872*0a6a1f1dSLionel Sambuc
873*0a6a1f1dSLionel Sambuc	sll	local4, 16, local1
874*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5
875*0a6a1f1dSLionel Sambuc
876*0a6a1f1dSLionel Sambuc	srl	out5, 2, local4
877*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5
878*0a6a1f1dSLionel Sambuc
879*0a6a1f1dSLionel Sambuc	sethi	%hi(16711680), local5
880*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
881*0a6a1f1dSLionel Sambuc
882*0a6a1f1dSLionel Sambuc	and	local4, local3, local4
883*0a6a1f1dSLionel Sambuc	or	local5, 255, local5
884*0a6a1f1dSLionel Sambuc
885*0a6a1f1dSLionel Sambuc	sll	local4, 2, local2
886*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
887*0a6a1f1dSLionel Sambuc
888*0a6a1f1dSLionel Sambuc	srl	in5, 8, local4
889*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
890*0a6a1f1dSLionel Sambuc
891*0a6a1f1dSLionel Sambuc	xor	local4, out5, local4
892*0a6a1f1dSLionel Sambuc	add	global1, 768, global4
893*0a6a1f1dSLionel Sambuc
894*0a6a1f1dSLionel Sambuc	and	local4, local5, local4
895*0a6a1f1dSLionel Sambuc	add	global1, 1024, global5
896*0a6a1f1dSLionel Sambuc
897*0a6a1f1dSLionel Sambuc	ld	[out2+272], local7
898*0a6a1f1dSLionel Sambuc	sll	local4, 8, local1
899*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5
900*0a6a1f1dSLionel Sambuc
901*0a6a1f1dSLionel Sambuc	srl	out5, 1, local4
902*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5
903*0a6a1f1dSLionel Sambuc
904*0a6a1f1dSLionel Sambuc	ld	[in3], out0                ! key 7531
905*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
906*0a6a1f1dSLionel Sambuc	add	global1, 256, global2
907*0a6a1f1dSLionel Sambuc
908*0a6a1f1dSLionel Sambuc	ld	[in3+4], out1              ! key 8642
909*0a6a1f1dSLionel Sambuc	and	local4, local7, local4
910*0a6a1f1dSLionel Sambuc	add	global1, 512, global3
911*0a6a1f1dSLionel Sambuc
912*0a6a1f1dSLionel Sambuc	sll	local4, 1, local1
913*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
914*0a6a1f1dSLionel Sambuc
915*0a6a1f1dSLionel Sambuc	sll	in5, 3, local3
916*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5
917*0a6a1f1dSLionel Sambuc
918*0a6a1f1dSLionel Sambuc	sll	out5, 3, local2
919*0a6a1f1dSLionel Sambuc	add	global1, 1280, local6     ! address sbox 8
920*0a6a1f1dSLionel Sambuc
921*0a6a1f1dSLionel Sambuc	srl	in5, 29, local4
922*0a6a1f1dSLionel Sambuc	add	global1, 1792, out3       ! address sbox 8
923*0a6a1f1dSLionel Sambuc
924*0a6a1f1dSLionel Sambuc	srl	out5, 29, local1
925*0a6a1f1dSLionel Sambuc	or	local4, local3, out5
926*0a6a1f1dSLionel Sambuc
927*0a6a1f1dSLionel Sambuc	or	local2, local1, in5
928*0a6a1f1dSLionel Sambuc
929*0a6a1f1dSLionel Sambuc
930*0a6a1f1dSLionel Sambuc
931*0a6a1f1dSLionel Sambuc
932*0a6a1f1dSLionel Sambuc
933*0a6a1f1dSLionel Sambuc
934*0a6a1f1dSLionel Sambuc
935*0a6a1f1dSLionel Sambuc
936*0a6a1f1dSLionel Sambuc! rounds_macro
937*0a6a1f1dSLionel Sambuc! in5 out5 1 .des_encrypt1.1 in3 in4
938*0a6a1f1dSLionel Sambuc
939*0a6a1f1dSLionel Sambuc	xor	out5, out0, local1
940*0a6a1f1dSLionel Sambuc
941*0a6a1f1dSLionel Sambuc	ld	[out2+284], local5        ! 0x0000FC00
942*0a6a1f1dSLionel Sambuc	ba	.des_encrypt1.1
943*0a6a1f1dSLionel Sambuc	and	local1, 252, local1
944*0a6a1f1dSLionel Sambuc
945*0a6a1f1dSLionel Sambuc	.align 32
946*0a6a1f1dSLionel Sambuc
947*0a6a1f1dSLionel Sambuc.des_encrypt1.1:
948*0a6a1f1dSLionel Sambuc	! local6 is address sbox 6
949*0a6a1f1dSLionel Sambuc	! out3   is address sbox 8
950*0a6a1f1dSLionel Sambuc	! out4   is loop counter
951*0a6a1f1dSLionel Sambuc
952*0a6a1f1dSLionel Sambuc	ld	[global1+local1], local1
953*0a6a1f1dSLionel Sambuc	xor	out5, out1, out1            ! 8642
954*0a6a1f1dSLionel Sambuc	xor	out5, out0, out0            ! 7531
955*0a6a1f1dSLionel Sambuc	! fmovs	%f0, %f0                  ! fxor used for alignment
956*0a6a1f1dSLionel Sambuc
957*0a6a1f1dSLionel Sambuc	srl	out1, 4, local0           ! rotate 4 right
958*0a6a1f1dSLionel Sambuc	and	out0, local5, local3      ! 3
959*0a6a1f1dSLionel Sambuc	! fmovs	%f0, %f0
960*0a6a1f1dSLionel Sambuc
961*0a6a1f1dSLionel Sambuc	ld	[in3+1*8], local7         ! key 7531 next round
962*0a6a1f1dSLionel Sambuc	srl	local3, 8, local3         ! 3
963*0a6a1f1dSLionel Sambuc	and	local0, 252, local2       ! 2
964*0a6a1f1dSLionel Sambuc	! fmovs	%f0, %f0
965*0a6a1f1dSLionel Sambuc
966*0a6a1f1dSLionel Sambuc	ld	[global3+local3],local3   ! 3
967*0a6a1f1dSLionel Sambuc	sll	out1, 28, out1            ! rotate
968*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5            ! 1 finished, local1 now sbox 7
969*0a6a1f1dSLionel Sambuc
970*0a6a1f1dSLionel Sambuc	ld	[global2+local2], local2  ! 2
971*0a6a1f1dSLionel Sambuc	srl	out0, 24, local1          ! 7
972*0a6a1f1dSLionel Sambuc	or	out1, local0, out1        ! rotate
973*0a6a1f1dSLionel Sambuc
974*0a6a1f1dSLionel Sambuc	ldub	[out2+local1], local1     ! 7 (and 0xFC)
975*0a6a1f1dSLionel Sambuc	srl	out1, 24, local0          ! 8
976*0a6a1f1dSLionel Sambuc	and	out1, local5, local4      ! 4
977*0a6a1f1dSLionel Sambuc
978*0a6a1f1dSLionel Sambuc	ldub	[out2+local0], local0     ! 8 (and 0xFC)
979*0a6a1f1dSLionel Sambuc	srl	local4, 8, local4         ! 4
980*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5            ! 2 finished local2 now sbox 6
981*0a6a1f1dSLionel Sambuc
982*0a6a1f1dSLionel Sambuc	ld	[global4+local4],local4   ! 4
983*0a6a1f1dSLionel Sambuc	srl	out1, 16, local2          ! 6
984*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5            ! 3 finished local3 now sbox 5
985*0a6a1f1dSLionel Sambuc
986*0a6a1f1dSLionel Sambuc	ld	[out3+local0],local0      ! 8
987*0a6a1f1dSLionel Sambuc	and	local2, 252, local2       ! 6
988*0a6a1f1dSLionel Sambuc	add	global1, 1536, local5     ! address sbox 7
989*0a6a1f1dSLionel Sambuc
990*0a6a1f1dSLionel Sambuc	ld	[local6+local2], local2   ! 6
991*0a6a1f1dSLionel Sambuc	srl	out0, 16, local3          ! 5
992*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5            ! 4 finished
993*0a6a1f1dSLionel Sambuc
994*0a6a1f1dSLionel Sambuc	ld	[local5+local1],local1    ! 7
995*0a6a1f1dSLionel Sambuc	and	local3, 252, local3       ! 5
996*0a6a1f1dSLionel Sambuc	xor	in5, local0, in5            ! 8 finished
997*0a6a1f1dSLionel Sambuc
998*0a6a1f1dSLionel Sambuc	ld	[global5+local3],local3   ! 5
999*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5            ! 6 finished
1000*0a6a1f1dSLionel Sambuc	subcc	out4, 1, out4
1001*0a6a1f1dSLionel Sambuc
1002*0a6a1f1dSLionel Sambuc	ld	[in3+1*8+4], out0         ! key 8642 next round
1003*0a6a1f1dSLionel Sambuc	xor	in5, local7, local2        ! sbox 5 next round
1004*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5            ! 7 finished
1005*0a6a1f1dSLionel Sambuc
1006*0a6a1f1dSLionel Sambuc	srl	local2, 16, local2        ! sbox 5 next round
1007*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5            ! 5 finished
1008*0a6a1f1dSLionel Sambuc
1009*0a6a1f1dSLionel Sambuc	ld	[in3+1*16+4], out1        ! key 8642 next round again
1010*0a6a1f1dSLionel Sambuc	and	local2, 252, local2       ! sbox5 next round
1011*0a6a1f1dSLionel Sambuc! next round
1012*0a6a1f1dSLionel Sambuc	xor	in5, local7, local7        ! 7531
1013*0a6a1f1dSLionel Sambuc
1014*0a6a1f1dSLionel Sambuc	ld	[global5+local2], local2  ! 5
1015*0a6a1f1dSLionel Sambuc	srl	local7, 24, local3        ! 7
1016*0a6a1f1dSLionel Sambuc	xor	in5, out0, out0            ! 8642
1017*0a6a1f1dSLionel Sambuc
1018*0a6a1f1dSLionel Sambuc	ldub	[out2+local3], local3     ! 7 (and 0xFC)
1019*0a6a1f1dSLionel Sambuc	srl	out0, 4, local0           ! rotate 4 right
1020*0a6a1f1dSLionel Sambuc	and	local7, 252, local1       ! 1
1021*0a6a1f1dSLionel Sambuc
1022*0a6a1f1dSLionel Sambuc	sll	out0, 28, out0            ! rotate
1023*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5            ! 5 finished local2 used
1024*0a6a1f1dSLionel Sambuc
1025*0a6a1f1dSLionel Sambuc	srl	local0, 8, local4         ! 4
1026*0a6a1f1dSLionel Sambuc	and	local0, 252, local2       ! 2
1027*0a6a1f1dSLionel Sambuc	ld	[local5+local3], local3   ! 7
1028*0a6a1f1dSLionel Sambuc
1029*0a6a1f1dSLionel Sambuc	srl	local0, 16, local5        ! 6
1030*0a6a1f1dSLionel Sambuc	or	out0, local0, out0        ! rotate
1031*0a6a1f1dSLionel Sambuc	ld	[global2+local2], local2  ! 2
1032*0a6a1f1dSLionel Sambuc
1033*0a6a1f1dSLionel Sambuc	srl	out0, 24, local0
1034*0a6a1f1dSLionel Sambuc	ld	[in3+1*16], out0          ! key 7531 next round
1035*0a6a1f1dSLionel Sambuc	and	local4, 252, local4	  ! 4
1036*0a6a1f1dSLionel Sambuc
1037*0a6a1f1dSLionel Sambuc	and	local5, 252, local5       ! 6
1038*0a6a1f1dSLionel Sambuc	ld	[global4+local4], local4  ! 4
1039*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5            ! 7 finished local3 used
1040*0a6a1f1dSLionel Sambuc
1041*0a6a1f1dSLionel Sambuc	and	local0, 252, local0       ! 8
1042*0a6a1f1dSLionel Sambuc	ld	[local6+local5], local5   ! 6
1043*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5            ! 2 finished local2 now sbox 3
1044*0a6a1f1dSLionel Sambuc
1045*0a6a1f1dSLionel Sambuc	srl	local7, 8, local2         ! 3 start
1046*0a6a1f1dSLionel Sambuc	ld	[out3+local0], local0     ! 8
1047*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5            ! 4 finished
1048*0a6a1f1dSLionel Sambuc
1049*0a6a1f1dSLionel Sambuc	and	local2, 252, local2       ! 3
1050*0a6a1f1dSLionel Sambuc	ld	[global1+local1], local1  ! 1
1051*0a6a1f1dSLionel Sambuc	xor	out5, local5, out5            ! 6 finished local5 used
1052*0a6a1f1dSLionel Sambuc
1053*0a6a1f1dSLionel Sambuc	ld	[global3+local2], local2  ! 3
1054*0a6a1f1dSLionel Sambuc	xor	out5, local0, out5            ! 8 finished
1055*0a6a1f1dSLionel Sambuc	add	in3, 1*16, in3             ! enc add 8, dec add -8 to key pointer
1056*0a6a1f1dSLionel Sambuc
1057*0a6a1f1dSLionel Sambuc	ld	[out2+284], local5        ! 0x0000FC00
1058*0a6a1f1dSLionel Sambuc	xor	out5, out0, local4          ! sbox 1 next round
1059*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5            ! 1 finished
1060*0a6a1f1dSLionel Sambuc
1061*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5            ! 3 finished
1062*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
1063*0a6a1f1dSLionel Sambuc	bne,pt	%icc, .des_encrypt1.1
1064*0a6a1f1dSLionel Sambuc#else
1065*0a6a1f1dSLionel Sambuc	bne	.des_encrypt1.1
1066*0a6a1f1dSLionel Sambuc#endif
1067*0a6a1f1dSLionel Sambuc	and	local4, 252, local1       ! sbox 1 next round
1068*0a6a1f1dSLionel Sambuc
1069*0a6a1f1dSLionel Sambuc! two rounds more:
1070*0a6a1f1dSLionel Sambuc
1071*0a6a1f1dSLionel Sambuc	ld	[global1+local1], local1
1072*0a6a1f1dSLionel Sambuc	xor	out5, out1, out1
1073*0a6a1f1dSLionel Sambuc	xor	out5, out0, out0
1074*0a6a1f1dSLionel Sambuc
1075*0a6a1f1dSLionel Sambuc	srl	out1, 4, local0           ! rotate
1076*0a6a1f1dSLionel Sambuc	and	out0, local5, local3
1077*0a6a1f1dSLionel Sambuc
1078*0a6a1f1dSLionel Sambuc	ld	[in3+1*8], local7         ! key 7531
1079*0a6a1f1dSLionel Sambuc	srl	local3, 8, local3
1080*0a6a1f1dSLionel Sambuc	and	local0, 252, local2
1081*0a6a1f1dSLionel Sambuc
1082*0a6a1f1dSLionel Sambuc	ld	[global3+local3],local3
1083*0a6a1f1dSLionel Sambuc	sll	out1, 28, out1            ! rotate
1084*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5            ! 1 finished, local1 now sbox 7
1085*0a6a1f1dSLionel Sambuc
1086*0a6a1f1dSLionel Sambuc	ld	[global2+local2], local2
1087*0a6a1f1dSLionel Sambuc	srl	out0, 24, local1
1088*0a6a1f1dSLionel Sambuc	or	out1, local0, out1        ! rotate
1089*0a6a1f1dSLionel Sambuc
1090*0a6a1f1dSLionel Sambuc	ldub	[out2+local1], local1
1091*0a6a1f1dSLionel Sambuc	srl	out1, 24, local0
1092*0a6a1f1dSLionel Sambuc	and	out1, local5, local4
1093*0a6a1f1dSLionel Sambuc
1094*0a6a1f1dSLionel Sambuc	ldub	[out2+local0], local0
1095*0a6a1f1dSLionel Sambuc	srl	local4, 8, local4
1096*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5            ! 2 finished local2 now sbox 6
1097*0a6a1f1dSLionel Sambuc
1098*0a6a1f1dSLionel Sambuc	ld	[global4+local4],local4
1099*0a6a1f1dSLionel Sambuc	srl	out1, 16, local2
1100*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5            ! 3 finished local3 now sbox 5
1101*0a6a1f1dSLionel Sambuc
1102*0a6a1f1dSLionel Sambuc	ld	[out3+local0],local0
1103*0a6a1f1dSLionel Sambuc	and	local2, 252, local2
1104*0a6a1f1dSLionel Sambuc	add	global1, 1536, local5     ! address sbox 7
1105*0a6a1f1dSLionel Sambuc
1106*0a6a1f1dSLionel Sambuc	ld	[local6+local2], local2
1107*0a6a1f1dSLionel Sambuc	srl	out0, 16, local3
1108*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5            ! 4 finished
1109*0a6a1f1dSLionel Sambuc
1110*0a6a1f1dSLionel Sambuc	ld	[local5+local1],local1
1111*0a6a1f1dSLionel Sambuc	and	local3, 252, local3
1112*0a6a1f1dSLionel Sambuc	xor	in5, local0, in5
1113*0a6a1f1dSLionel Sambuc
1114*0a6a1f1dSLionel Sambuc	ld	[global5+local3],local3
1115*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5            ! 6 finished
1116*0a6a1f1dSLionel Sambuc	cmp	in2, 8
1117*0a6a1f1dSLionel Sambuc
1118*0a6a1f1dSLionel Sambuc	ld	[out2+280], out4  ! loop counter
1119*0a6a1f1dSLionel Sambuc	xor	in5, local7, local2        ! sbox 5 next round
1120*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5            ! 7 finished
1121*0a6a1f1dSLionel Sambuc
1122*0a6a1f1dSLionel Sambuc	ld	[in3+1*8+4], out0
1123*0a6a1f1dSLionel Sambuc	srl	local2, 16, local2        ! sbox 5 next round
1124*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5            ! 5 finished
1125*0a6a1f1dSLionel Sambuc
1126*0a6a1f1dSLionel Sambuc	and	local2, 252, local2
1127*0a6a1f1dSLionel Sambuc! next round (two rounds more)
1128*0a6a1f1dSLionel Sambuc	xor	in5, local7, local7        ! 7531
1129*0a6a1f1dSLionel Sambuc
1130*0a6a1f1dSLionel Sambuc	ld	[global5+local2], local2
1131*0a6a1f1dSLionel Sambuc	srl	local7, 24, local3
1132*0a6a1f1dSLionel Sambuc	xor	in5, out0, out0            ! 8642
1133*0a6a1f1dSLionel Sambuc
1134*0a6a1f1dSLionel Sambuc	ldub	[out2+local3], local3
1135*0a6a1f1dSLionel Sambuc	srl	out0, 4, local0           ! rotate
1136*0a6a1f1dSLionel Sambuc	and	local7, 252, local1
1137*0a6a1f1dSLionel Sambuc
1138*0a6a1f1dSLionel Sambuc	sll	out0, 28, out0            ! rotate
1139*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5            ! 5 finished local2 used
1140*0a6a1f1dSLionel Sambuc
1141*0a6a1f1dSLionel Sambuc	srl	local0, 8, local4
1142*0a6a1f1dSLionel Sambuc	and	local0, 252, local2
1143*0a6a1f1dSLionel Sambuc	ld	[local5+local3], local3
1144*0a6a1f1dSLionel Sambuc
1145*0a6a1f1dSLionel Sambuc	srl	local0, 16, local5
1146*0a6a1f1dSLionel Sambuc	or	out0, local0, out0        ! rotate
1147*0a6a1f1dSLionel Sambuc	ld	[global2+local2], local2
1148*0a6a1f1dSLionel Sambuc
1149*0a6a1f1dSLionel Sambuc	srl	out0, 24, local0
1150*0a6a1f1dSLionel Sambuc	ld	[in4], out0   ! key next encryption/decryption
1151*0a6a1f1dSLionel Sambuc	and	local4, 252, local4
1152*0a6a1f1dSLionel Sambuc
1153*0a6a1f1dSLionel Sambuc	and	local5, 252, local5
1154*0a6a1f1dSLionel Sambuc	ld	[global4+local4], local4
1155*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5            ! 7 finished local3 used
1156*0a6a1f1dSLionel Sambuc
1157*0a6a1f1dSLionel Sambuc	and	local0, 252, local0
1158*0a6a1f1dSLionel Sambuc	ld	[local6+local5], local5
1159*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5            ! 2 finished local2 now sbox 3
1160*0a6a1f1dSLionel Sambuc
1161*0a6a1f1dSLionel Sambuc	srl	local7, 8, local2         ! 3 start
1162*0a6a1f1dSLionel Sambuc	ld	[out3+local0], local0
1163*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5
1164*0a6a1f1dSLionel Sambuc
1165*0a6a1f1dSLionel Sambuc	and	local2, 252, local2
1166*0a6a1f1dSLionel Sambuc	ld	[global1+local1], local1
1167*0a6a1f1dSLionel Sambuc	xor	out5, local5, out5            ! 6 finished local5 used
1168*0a6a1f1dSLionel Sambuc
1169*0a6a1f1dSLionel Sambuc	ld	[global3+local2], local2
1170*0a6a1f1dSLionel Sambuc	srl	in5, 3, local3
1171*0a6a1f1dSLionel Sambuc	xor	out5, local0, out5
1172*0a6a1f1dSLionel Sambuc
1173*0a6a1f1dSLionel Sambuc	ld	[in4+4], out1 ! key next encryption/decryption
1174*0a6a1f1dSLionel Sambuc	sll	in5, 29, local4
1175*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5
1176*0a6a1f1dSLionel Sambuc
1177*0a6a1f1dSLionel Sambuc
1178*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
1179*0a6a1f1dSLionel Sambuc ! in4 not used
1180*0a6a1f1dSLionel Sambuc
1181*0a6a1f1dSLionel Sambuc
1182*0a6a1f1dSLionel Sambuc
1183*0a6a1f1dSLionel Sambuc! fp_macro
1184*0a6a1f1dSLionel Sambuc! in5 out5 1
1185*0a6a1f1dSLionel Sambuc
1186*0a6a1f1dSLionel Sambuc	! initially undo the rotate 3 left done after initial permutation
1187*0a6a1f1dSLionel Sambuc	! original left is received shifted 3 right and 29 left in local3/4
1188*0a6a1f1dSLionel Sambuc
1189*0a6a1f1dSLionel Sambuc	sll	out5, 29, local1
1190*0a6a1f1dSLionel Sambuc	or	local3, local4, in5
1191*0a6a1f1dSLionel Sambuc
1192*0a6a1f1dSLionel Sambuc	srl	out5, 3, out5
1193*0a6a1f1dSLionel Sambuc	sethi	%hi(0x55555555), local2
1194*0a6a1f1dSLionel Sambuc
1195*0a6a1f1dSLionel Sambuc	or	out5, local1, out5
1196*0a6a1f1dSLionel Sambuc	or	local2, %lo(0x55555555), local2
1197*0a6a1f1dSLionel Sambuc
1198*0a6a1f1dSLionel Sambuc	srl	out5, 1, local3
1199*0a6a1f1dSLionel Sambuc	sethi	%hi(0x00ff00ff), local1
1200*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
1201*0a6a1f1dSLionel Sambuc	or	local1, %lo(0x00ff00ff), local1
1202*0a6a1f1dSLionel Sambuc	and	local3, local2, local3
1203*0a6a1f1dSLionel Sambuc	sethi	%hi(0x33333333), local4
1204*0a6a1f1dSLionel Sambuc	sll	local3, 1, local2
1205*0a6a1f1dSLionel Sambuc
1206*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5
1207*0a6a1f1dSLionel Sambuc
1208*0a6a1f1dSLionel Sambuc	srl	in5, 8, local3
1209*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
1210*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
1211*0a6a1f1dSLionel Sambuc	or	local4, %lo(0x33333333), local4
1212*0a6a1f1dSLionel Sambuc	and	local3, local1, local3
1213*0a6a1f1dSLionel Sambuc	sethi	%hi(0x0000ffff), local1
1214*0a6a1f1dSLionel Sambuc	sll	local3, 8, local2
1215*0a6a1f1dSLionel Sambuc
1216*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5
1217*0a6a1f1dSLionel Sambuc
1218*0a6a1f1dSLionel Sambuc	srl	out5, 2, local3
1219*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5
1220*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
1221*0a6a1f1dSLionel Sambuc	or	local1, %lo(0x0000ffff), local1
1222*0a6a1f1dSLionel Sambuc	and	local3, local4, local3
1223*0a6a1f1dSLionel Sambuc	sethi	%hi(0x0f0f0f0f), local4
1224*0a6a1f1dSLionel Sambuc	sll	local3, 2, local2
1225*0a6a1f1dSLionel Sambuc
1226*0a6a1f1dSLionel Sambuc
1227*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5
1228*0a6a1f1dSLionel Sambuc
1229*0a6a1f1dSLionel Sambuc
1230*0a6a1f1dSLionel Sambuc	srl	in5, 16, local3
1231*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
1232*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
1233*0a6a1f1dSLionel Sambuc	or	local4, %lo(0x0f0f0f0f), local4
1234*0a6a1f1dSLionel Sambuc	and	local3, local1, local3
1235*0a6a1f1dSLionel Sambuc	sll	local3, 16, local2
1236*0a6a1f1dSLionel Sambuc
1237*0a6a1f1dSLionel Sambuc	xor	out5, local3, local1
1238*0a6a1f1dSLionel Sambuc
1239*0a6a1f1dSLionel Sambuc	srl	local1, 4, local3
1240*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5
1241*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
1242*0a6a1f1dSLionel Sambuc	and	local3, local4, local3
1243*0a6a1f1dSLionel Sambuc	sll	local3, 4, local2
1244*0a6a1f1dSLionel Sambuc
1245*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5
1246*0a6a1f1dSLionel Sambuc
1247*0a6a1f1dSLionel Sambuc	! optional store:
1248*0a6a1f1dSLionel Sambuc
1249*0a6a1f1dSLionel Sambuc	st in5, [in0]
1250*0a6a1f1dSLionel Sambuc
1251*0a6a1f1dSLionel Sambuc	xor	local1, local2, out5
1252*0a6a1f1dSLionel Sambuc
1253*0a6a1f1dSLionel Sambuc	st out5, [in0+4]
1254*0a6a1f1dSLionel Sambuc
1255*0a6a1f1dSLionel Sambuc            ! 1 for store to [in0]
1256*0a6a1f1dSLionel Sambuc
1257*0a6a1f1dSLionel Sambuc	ret
1258*0a6a1f1dSLionel Sambuc	restore
1259*0a6a1f1dSLionel Sambuc
1260*0a6a1f1dSLionel Sambuc.encrypt.dec:
1261*0a6a1f1dSLionel Sambuc
1262*0a6a1f1dSLionel Sambuc	add	in1, 120, in3             ! use last subkey for first round
1263*0a6a1f1dSLionel Sambuc
1264*0a6a1f1dSLionel Sambuc	! parameter 6  1/2 for include encryption/decryption
1265*0a6a1f1dSLionel Sambuc	! parameter 7  1 for move in1 to in3
1266*0a6a1f1dSLionel Sambuc	! parameter 8  1 for move in3 to in4, 2 for move in4 to in3
1267*0a6a1f1dSLionel Sambuc
1268*0a6a1f1dSLionel Sambuc
1269*0a6a1f1dSLionel Sambuc
1270*0a6a1f1dSLionel Sambuc! ip_macro
1271*0a6a1f1dSLionel Sambuc! in5 out5 in5 out5 in4 2 0 1
1272*0a6a1f1dSLionel Sambuc
1273*0a6a1f1dSLionel Sambuc	ld	[out2+256], local1
1274*0a6a1f1dSLionel Sambuc	srl	out5, 4, local4
1275*0a6a1f1dSLionel Sambuc
1276*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
1277*0a6a1f1dSLionel Sambuc	nop
1278*0a6a1f1dSLionel Sambuc
1279*0a6a1f1dSLionel Sambuc	ld	[out2+260], local2
1280*0a6a1f1dSLionel Sambuc	and	local4, local1, local4
1281*0a6a1f1dSLionel Sambuc	mov in3, in4
1282*0a6a1f1dSLionel Sambuc
1283*0a6a1f1dSLionel Sambuc
1284*0a6a1f1dSLionel Sambuc	ld	[out2+280], out4          ! loop counter
1285*0a6a1f1dSLionel Sambuc	sll	local4, 4, local1
1286*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
1287*0a6a1f1dSLionel Sambuc
1288*0a6a1f1dSLionel Sambuc	ld	[out2+264], local3
1289*0a6a1f1dSLionel Sambuc	srl	in5, 16, local4
1290*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5
1291*0a6a1f1dSLionel Sambuc
1292*0a6a1f1dSLionel Sambuc
1293*0a6a1f1dSLionel Sambuc	xor	local4, out5, local4
1294*0a6a1f1dSLionel Sambuc	nop	!sethi	%hi(DES_SPtrans), global1 ! sbox addr
1295*0a6a1f1dSLionel Sambuc
1296*0a6a1f1dSLionel Sambuc
1297*0a6a1f1dSLionel Sambuc	and	local4, local2, local4
1298*0a6a1f1dSLionel Sambuc	nop	!or	global1, %lo(DES_SPtrans), global1   ! sbox addr
1299*0a6a1f1dSLionel Sambuc
1300*0a6a1f1dSLionel Sambuc	sll	local4, 16, local1
1301*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5
1302*0a6a1f1dSLionel Sambuc
1303*0a6a1f1dSLionel Sambuc	srl	out5, 2, local4
1304*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5
1305*0a6a1f1dSLionel Sambuc
1306*0a6a1f1dSLionel Sambuc	sethi	%hi(16711680), local5
1307*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
1308*0a6a1f1dSLionel Sambuc
1309*0a6a1f1dSLionel Sambuc	and	local4, local3, local4
1310*0a6a1f1dSLionel Sambuc	or	local5, 255, local5
1311*0a6a1f1dSLionel Sambuc
1312*0a6a1f1dSLionel Sambuc	sll	local4, 2, local2
1313*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
1314*0a6a1f1dSLionel Sambuc
1315*0a6a1f1dSLionel Sambuc	srl	in5, 8, local4
1316*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
1317*0a6a1f1dSLionel Sambuc
1318*0a6a1f1dSLionel Sambuc	xor	local4, out5, local4
1319*0a6a1f1dSLionel Sambuc	add	global1, 768, global4
1320*0a6a1f1dSLionel Sambuc
1321*0a6a1f1dSLionel Sambuc	and	local4, local5, local4
1322*0a6a1f1dSLionel Sambuc	add	global1, 1024, global5
1323*0a6a1f1dSLionel Sambuc
1324*0a6a1f1dSLionel Sambuc	ld	[out2+272], local7
1325*0a6a1f1dSLionel Sambuc	sll	local4, 8, local1
1326*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5
1327*0a6a1f1dSLionel Sambuc
1328*0a6a1f1dSLionel Sambuc	srl	out5, 1, local4
1329*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5
1330*0a6a1f1dSLionel Sambuc
1331*0a6a1f1dSLionel Sambuc	ld	[in4], out0                ! key 7531
1332*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
1333*0a6a1f1dSLionel Sambuc	add	global1, 256, global2
1334*0a6a1f1dSLionel Sambuc
1335*0a6a1f1dSLionel Sambuc	ld	[in4+4], out1              ! key 8642
1336*0a6a1f1dSLionel Sambuc	and	local4, local7, local4
1337*0a6a1f1dSLionel Sambuc	add	global1, 512, global3
1338*0a6a1f1dSLionel Sambuc
1339*0a6a1f1dSLionel Sambuc	sll	local4, 1, local1
1340*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
1341*0a6a1f1dSLionel Sambuc
1342*0a6a1f1dSLionel Sambuc	sll	in5, 3, local3
1343*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5
1344*0a6a1f1dSLionel Sambuc
1345*0a6a1f1dSLionel Sambuc	sll	out5, 3, local2
1346*0a6a1f1dSLionel Sambuc	add	global1, 1280, local6     ! address sbox 8
1347*0a6a1f1dSLionel Sambuc
1348*0a6a1f1dSLionel Sambuc	srl	in5, 29, local4
1349*0a6a1f1dSLionel Sambuc	add	global1, 1792, out3       ! address sbox 8
1350*0a6a1f1dSLionel Sambuc
1351*0a6a1f1dSLionel Sambuc	srl	out5, 29, local1
1352*0a6a1f1dSLionel Sambuc	or	local4, local3, in5
1353*0a6a1f1dSLionel Sambuc
1354*0a6a1f1dSLionel Sambuc	or	local2, local1, out5
1355*0a6a1f1dSLionel Sambuc
1356*0a6a1f1dSLionel Sambuc
1357*0a6a1f1dSLionel Sambuc
1358*0a6a1f1dSLionel Sambuc
1359*0a6a1f1dSLionel Sambuc
1360*0a6a1f1dSLionel Sambuc		ld	[out2+284], local5     ! 0x0000FC00 used in the rounds
1361*0a6a1f1dSLionel Sambuc		or	local2, local1, out5
1362*0a6a1f1dSLionel Sambuc		xor	in5, out0, local1
1363*0a6a1f1dSLionel Sambuc
1364*0a6a1f1dSLionel Sambuc		call .des_dec.1
1365*0a6a1f1dSLionel Sambuc		and	local1, 252, local1
1366*0a6a1f1dSLionel Sambuc
1367*0a6a1f1dSLionel Sambuc
1368*0a6a1f1dSLionel Sambuc ! include dec,  ks in4
1369*0a6a1f1dSLionel Sambuc
1370*0a6a1f1dSLionel Sambuc
1371*0a6a1f1dSLionel Sambuc
1372*0a6a1f1dSLionel Sambuc! fp_macro
1373*0a6a1f1dSLionel Sambuc! out5 in5 1
1374*0a6a1f1dSLionel Sambuc
1375*0a6a1f1dSLionel Sambuc	! initially undo the rotate 3 left done after initial permutation
1376*0a6a1f1dSLionel Sambuc	! original left is received shifted 3 right and 29 left in local3/4
1377*0a6a1f1dSLionel Sambuc
1378*0a6a1f1dSLionel Sambuc	sll	in5, 29, local1
1379*0a6a1f1dSLionel Sambuc	or	local3, local4, out5
1380*0a6a1f1dSLionel Sambuc
1381*0a6a1f1dSLionel Sambuc	srl	in5, 3, in5
1382*0a6a1f1dSLionel Sambuc	sethi	%hi(0x55555555), local2
1383*0a6a1f1dSLionel Sambuc
1384*0a6a1f1dSLionel Sambuc	or	in5, local1, in5
1385*0a6a1f1dSLionel Sambuc	or	local2, %lo(0x55555555), local2
1386*0a6a1f1dSLionel Sambuc
1387*0a6a1f1dSLionel Sambuc	srl	in5, 1, local3
1388*0a6a1f1dSLionel Sambuc	sethi	%hi(0x00ff00ff), local1
1389*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
1390*0a6a1f1dSLionel Sambuc	or	local1, %lo(0x00ff00ff), local1
1391*0a6a1f1dSLionel Sambuc	and	local3, local2, local3
1392*0a6a1f1dSLionel Sambuc	sethi	%hi(0x33333333), local4
1393*0a6a1f1dSLionel Sambuc	sll	local3, 1, local2
1394*0a6a1f1dSLionel Sambuc
1395*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5
1396*0a6a1f1dSLionel Sambuc
1397*0a6a1f1dSLionel Sambuc	srl	out5, 8, local3
1398*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5
1399*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
1400*0a6a1f1dSLionel Sambuc	or	local4, %lo(0x33333333), local4
1401*0a6a1f1dSLionel Sambuc	and	local3, local1, local3
1402*0a6a1f1dSLionel Sambuc	sethi	%hi(0x0000ffff), local1
1403*0a6a1f1dSLionel Sambuc	sll	local3, 8, local2
1404*0a6a1f1dSLionel Sambuc
1405*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5
1406*0a6a1f1dSLionel Sambuc
1407*0a6a1f1dSLionel Sambuc	srl	in5, 2, local3
1408*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
1409*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
1410*0a6a1f1dSLionel Sambuc	or	local1, %lo(0x0000ffff), local1
1411*0a6a1f1dSLionel Sambuc	and	local3, local4, local3
1412*0a6a1f1dSLionel Sambuc	sethi	%hi(0x0f0f0f0f), local4
1413*0a6a1f1dSLionel Sambuc	sll	local3, 2, local2
1414*0a6a1f1dSLionel Sambuc
1415*0a6a1f1dSLionel Sambuc
1416*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5
1417*0a6a1f1dSLionel Sambuc
1418*0a6a1f1dSLionel Sambuc
1419*0a6a1f1dSLionel Sambuc	srl	out5, 16, local3
1420*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5
1421*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
1422*0a6a1f1dSLionel Sambuc	or	local4, %lo(0x0f0f0f0f), local4
1423*0a6a1f1dSLionel Sambuc	and	local3, local1, local3
1424*0a6a1f1dSLionel Sambuc	sll	local3, 16, local2
1425*0a6a1f1dSLionel Sambuc
1426*0a6a1f1dSLionel Sambuc	xor	in5, local3, local1
1427*0a6a1f1dSLionel Sambuc
1428*0a6a1f1dSLionel Sambuc	srl	local1, 4, local3
1429*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
1430*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
1431*0a6a1f1dSLionel Sambuc	and	local3, local4, local3
1432*0a6a1f1dSLionel Sambuc	sll	local3, 4, local2
1433*0a6a1f1dSLionel Sambuc
1434*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5
1435*0a6a1f1dSLionel Sambuc
1436*0a6a1f1dSLionel Sambuc	! optional store:
1437*0a6a1f1dSLionel Sambuc
1438*0a6a1f1dSLionel Sambuc	st out5, [in0]
1439*0a6a1f1dSLionel Sambuc
1440*0a6a1f1dSLionel Sambuc	xor	local1, local2, in5
1441*0a6a1f1dSLionel Sambuc
1442*0a6a1f1dSLionel Sambuc	st in5, [in0+4]
1443*0a6a1f1dSLionel Sambuc
1444*0a6a1f1dSLionel Sambuc            ! 1 for store to [in0]
1445*0a6a1f1dSLionel Sambuc
1446*0a6a1f1dSLionel Sambuc	ret
1447*0a6a1f1dSLionel Sambuc	restore
1448*0a6a1f1dSLionel Sambuc
1449*0a6a1f1dSLionel Sambuc.DES_encrypt1.end:
1450*0a6a1f1dSLionel Sambuc	.size	 DES_encrypt1,.DES_encrypt1.end-DES_encrypt1
1451*0a6a1f1dSLionel Sambuc
1452*0a6a1f1dSLionel Sambuc
1453*0a6a1f1dSLionel Sambuc! void DES_encrypt2(data, ks, enc)
1454*0a6a1f1dSLionel Sambuc!*********************************
1455*0a6a1f1dSLionel Sambuc
1456*0a6a1f1dSLionel Sambuc	! encrypts/decrypts without initial/final permutation
1457*0a6a1f1dSLionel Sambuc
1458*0a6a1f1dSLionel Sambuc	.align 32
1459*0a6a1f1dSLionel Sambuc	.global DES_encrypt2
1460*0a6a1f1dSLionel Sambuc	.type	 DES_encrypt2,#function
1461*0a6a1f1dSLionel Sambuc
1462*0a6a1f1dSLionel SambucDES_encrypt2:
1463*0a6a1f1dSLionel Sambuc
1464*0a6a1f1dSLionel Sambuc	save	%sp, FRAME, %sp
1465*0a6a1f1dSLionel Sambuc
1466*0a6a1f1dSLionel Sambuc	sethi	%hi(_PIC_DES_SPtrans-1f),global1
1467*0a6a1f1dSLionel Sambuc	or	global1,%lo(_PIC_DES_SPtrans-1f),global1
1468*0a6a1f1dSLionel Sambuc1:	call	.+8
1469*0a6a1f1dSLionel Sambuc	add	%o7,global1,global1
1470*0a6a1f1dSLionel Sambuc	sub	global1,_PIC_DES_SPtrans-.des_and,out2
1471*0a6a1f1dSLionel Sambuc
1472*0a6a1f1dSLionel Sambuc	! Set sbox address 1 to 6 and rotate halfs 3 left
1473*0a6a1f1dSLionel Sambuc	! Errors caught by destest? Yes. Still? *NO*
1474*0a6a1f1dSLionel Sambuc
1475*0a6a1f1dSLionel Sambuc	!sethi	%hi(DES_SPtrans), global1 ! address sbox 1
1476*0a6a1f1dSLionel Sambuc
1477*0a6a1f1dSLionel Sambuc	!or	global1, %lo(DES_SPtrans), global1  ! sbox 1
1478*0a6a1f1dSLionel Sambuc
1479*0a6a1f1dSLionel Sambuc	add	global1, 256, global2     ! sbox 2
1480*0a6a1f1dSLionel Sambuc	add	global1, 512, global3     ! sbox 3
1481*0a6a1f1dSLionel Sambuc
1482*0a6a1f1dSLionel Sambuc	ld	[in0], out5               ! right
1483*0a6a1f1dSLionel Sambuc	add	global1, 768, global4     ! sbox 4
1484*0a6a1f1dSLionel Sambuc	add	global1, 1024, global5    ! sbox 5
1485*0a6a1f1dSLionel Sambuc
1486*0a6a1f1dSLionel Sambuc	ld	[in0+4], in5              ! left
1487*0a6a1f1dSLionel Sambuc	add	global1, 1280, local6     ! sbox 6
1488*0a6a1f1dSLionel Sambuc	add	global1, 1792, out3       ! sbox 8
1489*0a6a1f1dSLionel Sambuc
1490*0a6a1f1dSLionel Sambuc	! rotate
1491*0a6a1f1dSLionel Sambuc
1492*0a6a1f1dSLionel Sambuc	sll	in5, 3, local5
1493*0a6a1f1dSLionel Sambuc	mov	in1, in3                  ! key address to in3
1494*0a6a1f1dSLionel Sambuc
1495*0a6a1f1dSLionel Sambuc	sll	out5, 3, local7
1496*0a6a1f1dSLionel Sambuc	srl	in5, 29, in5
1497*0a6a1f1dSLionel Sambuc
1498*0a6a1f1dSLionel Sambuc	srl	out5, 29, out5
1499*0a6a1f1dSLionel Sambuc	add	in5, local5, in5
1500*0a6a1f1dSLionel Sambuc
1501*0a6a1f1dSLionel Sambuc	add	out5, local7, out5
1502*0a6a1f1dSLionel Sambuc	cmp	in2, 0
1503*0a6a1f1dSLionel Sambuc
1504*0a6a1f1dSLionel Sambuc	! we use our own stackframe
1505*0a6a1f1dSLionel Sambuc
1506*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
1507*0a6a1f1dSLionel Sambuc	be,pn	%icc, .encrypt2.dec       ! decryption
1508*0a6a1f1dSLionel Sambuc#else
1509*0a6a1f1dSLionel Sambuc	be	.encrypt2.dec
1510*0a6a1f1dSLionel Sambuc#endif
1511*0a6a1f1dSLionel Sambuc	STPTR	in0, [%sp+BIAS+ARG0+0*ARGSZ]
1512*0a6a1f1dSLionel Sambuc
1513*0a6a1f1dSLionel Sambuc	ld	[in3], out0               ! key 7531 first round
1514*0a6a1f1dSLionel Sambuc	mov	LOOPS, out4               ! loop counter
1515*0a6a1f1dSLionel Sambuc
1516*0a6a1f1dSLionel Sambuc	ld	[in3+4], out1             ! key 8642 first round
1517*0a6a1f1dSLionel Sambuc	sethi	%hi(0x0000FC00), local5
1518*0a6a1f1dSLionel Sambuc
1519*0a6a1f1dSLionel Sambuc	call .des_enc
1520*0a6a1f1dSLionel Sambuc	mov	in3, in4
1521*0a6a1f1dSLionel Sambuc
1522*0a6a1f1dSLionel Sambuc	! rotate
1523*0a6a1f1dSLionel Sambuc	sll	in5, 29, in0
1524*0a6a1f1dSLionel Sambuc	srl	in5, 3, in5
1525*0a6a1f1dSLionel Sambuc	sll	out5, 29, in1
1526*0a6a1f1dSLionel Sambuc	add	in5, in0, in5
1527*0a6a1f1dSLionel Sambuc	srl	out5, 3, out5
1528*0a6a1f1dSLionel Sambuc	LDPTR	[%sp+BIAS+ARG0+0*ARGSZ], in0
1529*0a6a1f1dSLionel Sambuc	add	out5, in1, out5
1530*0a6a1f1dSLionel Sambuc	st	in5, [in0]
1531*0a6a1f1dSLionel Sambuc	st	out5, [in0+4]
1532*0a6a1f1dSLionel Sambuc
1533*0a6a1f1dSLionel Sambuc	ret
1534*0a6a1f1dSLionel Sambuc	restore
1535*0a6a1f1dSLionel Sambuc
1536*0a6a1f1dSLionel Sambuc
1537*0a6a1f1dSLionel Sambuc.encrypt2.dec:
1538*0a6a1f1dSLionel Sambuc
1539*0a6a1f1dSLionel Sambuc	add in3, 120, in4
1540*0a6a1f1dSLionel Sambuc
1541*0a6a1f1dSLionel Sambuc	ld	[in4], out0               ! key 7531 first round
1542*0a6a1f1dSLionel Sambuc	mov	LOOPS, out4               ! loop counter
1543*0a6a1f1dSLionel Sambuc
1544*0a6a1f1dSLionel Sambuc	ld	[in4+4], out1             ! key 8642 first round
1545*0a6a1f1dSLionel Sambuc	sethi	%hi(0x0000FC00), local5
1546*0a6a1f1dSLionel Sambuc
1547*0a6a1f1dSLionel Sambuc	mov	in5, local1               ! left expected in out5
1548*0a6a1f1dSLionel Sambuc	mov	out5, in5
1549*0a6a1f1dSLionel Sambuc
1550*0a6a1f1dSLionel Sambuc	call .des_dec
1551*0a6a1f1dSLionel Sambuc	mov	local1, out5
1552*0a6a1f1dSLionel Sambuc
1553*0a6a1f1dSLionel Sambuc.encrypt2.finish:
1554*0a6a1f1dSLionel Sambuc
1555*0a6a1f1dSLionel Sambuc	! rotate
1556*0a6a1f1dSLionel Sambuc	sll	in5, 29, in0
1557*0a6a1f1dSLionel Sambuc	srl	in5, 3, in5
1558*0a6a1f1dSLionel Sambuc	sll	out5, 29, in1
1559*0a6a1f1dSLionel Sambuc	add	in5, in0, in5
1560*0a6a1f1dSLionel Sambuc	srl	out5, 3, out5
1561*0a6a1f1dSLionel Sambuc	LDPTR	[%sp+BIAS+ARG0+0*ARGSZ], in0
1562*0a6a1f1dSLionel Sambuc	add	out5, in1, out5
1563*0a6a1f1dSLionel Sambuc	st	out5, [in0]
1564*0a6a1f1dSLionel Sambuc	st	in5, [in0+4]
1565*0a6a1f1dSLionel Sambuc
1566*0a6a1f1dSLionel Sambuc	ret
1567*0a6a1f1dSLionel Sambuc	restore
1568*0a6a1f1dSLionel Sambuc
1569*0a6a1f1dSLionel Sambuc.DES_encrypt2.end:
1570*0a6a1f1dSLionel Sambuc	.size	 DES_encrypt2, .DES_encrypt2.end-DES_encrypt2
1571*0a6a1f1dSLionel Sambuc
1572*0a6a1f1dSLionel Sambuc
1573*0a6a1f1dSLionel Sambuc! void DES_encrypt3(data, ks1, ks2, ks3)
1574*0a6a1f1dSLionel Sambuc! **************************************
1575*0a6a1f1dSLionel Sambuc
1576*0a6a1f1dSLionel Sambuc	.align 32
1577*0a6a1f1dSLionel Sambuc	.global DES_encrypt3
1578*0a6a1f1dSLionel Sambuc	.type	 DES_encrypt3,#function
1579*0a6a1f1dSLionel Sambuc
1580*0a6a1f1dSLionel SambucDES_encrypt3:
1581*0a6a1f1dSLionel Sambuc
1582*0a6a1f1dSLionel Sambuc	save	%sp, FRAME, %sp
1583*0a6a1f1dSLionel Sambuc
1584*0a6a1f1dSLionel Sambuc	sethi	%hi(_PIC_DES_SPtrans-1f),global1
1585*0a6a1f1dSLionel Sambuc	or	global1,%lo(_PIC_DES_SPtrans-1f),global1
1586*0a6a1f1dSLionel Sambuc1:	call	.+8
1587*0a6a1f1dSLionel Sambuc	add	%o7,global1,global1
1588*0a6a1f1dSLionel Sambuc	sub	global1,_PIC_DES_SPtrans-.des_and,out2
1589*0a6a1f1dSLionel Sambuc
1590*0a6a1f1dSLionel Sambuc	ld	[in0], in5                ! left
1591*0a6a1f1dSLionel Sambuc	add	in2, 120, in4             ! ks2
1592*0a6a1f1dSLionel Sambuc
1593*0a6a1f1dSLionel Sambuc	ld	[in0+4], out5             ! right
1594*0a6a1f1dSLionel Sambuc	mov	in3, in2                  ! save ks3
1595*0a6a1f1dSLionel Sambuc
1596*0a6a1f1dSLionel Sambuc	! parameter 6  1/2 for include encryption/decryption
1597*0a6a1f1dSLionel Sambuc	! parameter 7  1 for mov in1 to in3
1598*0a6a1f1dSLionel Sambuc	! parameter 8  1 for mov in3 to in4
1599*0a6a1f1dSLionel Sambuc	! parameter 9  1 for load ks3 and ks2 to in4 and in3
1600*0a6a1f1dSLionel Sambuc
1601*0a6a1f1dSLionel Sambuc
1602*0a6a1f1dSLionel Sambuc
1603*0a6a1f1dSLionel Sambuc! ip_macro
1604*0a6a1f1dSLionel Sambuc! in5 out5 out5 in5 in3 1 1 0 0
1605*0a6a1f1dSLionel Sambuc
1606*0a6a1f1dSLionel Sambuc	ld	[out2+256], local1
1607*0a6a1f1dSLionel Sambuc	srl	out5, 4, local4
1608*0a6a1f1dSLionel Sambuc
1609*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
1610*0a6a1f1dSLionel Sambuc	mov in1, in3
1611*0a6a1f1dSLionel Sambuc
1612*0a6a1f1dSLionel Sambuc	ld	[out2+260], local2
1613*0a6a1f1dSLionel Sambuc	and	local4, local1, local4
1614*0a6a1f1dSLionel Sambuc
1615*0a6a1f1dSLionel Sambuc
1616*0a6a1f1dSLionel Sambuc
1617*0a6a1f1dSLionel Sambuc	ld	[out2+280], out4          ! loop counter
1618*0a6a1f1dSLionel Sambuc	sll	local4, 4, local1
1619*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
1620*0a6a1f1dSLionel Sambuc
1621*0a6a1f1dSLionel Sambuc	ld	[out2+264], local3
1622*0a6a1f1dSLionel Sambuc	srl	in5, 16, local4
1623*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5
1624*0a6a1f1dSLionel Sambuc
1625*0a6a1f1dSLionel Sambuc
1626*0a6a1f1dSLionel Sambuc	xor	local4, out5, local4
1627*0a6a1f1dSLionel Sambuc	nop	!sethi	%hi(DES_SPtrans), global1 ! sbox addr
1628*0a6a1f1dSLionel Sambuc
1629*0a6a1f1dSLionel Sambuc
1630*0a6a1f1dSLionel Sambuc	and	local4, local2, local4
1631*0a6a1f1dSLionel Sambuc	nop	!or	global1, %lo(DES_SPtrans), global1   ! sbox addr
1632*0a6a1f1dSLionel Sambuc
1633*0a6a1f1dSLionel Sambuc	sll	local4, 16, local1
1634*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5
1635*0a6a1f1dSLionel Sambuc
1636*0a6a1f1dSLionel Sambuc	srl	out5, 2, local4
1637*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5
1638*0a6a1f1dSLionel Sambuc
1639*0a6a1f1dSLionel Sambuc	sethi	%hi(16711680), local5
1640*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
1641*0a6a1f1dSLionel Sambuc
1642*0a6a1f1dSLionel Sambuc	and	local4, local3, local4
1643*0a6a1f1dSLionel Sambuc	or	local5, 255, local5
1644*0a6a1f1dSLionel Sambuc
1645*0a6a1f1dSLionel Sambuc	sll	local4, 2, local2
1646*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
1647*0a6a1f1dSLionel Sambuc
1648*0a6a1f1dSLionel Sambuc	srl	in5, 8, local4
1649*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
1650*0a6a1f1dSLionel Sambuc
1651*0a6a1f1dSLionel Sambuc	xor	local4, out5, local4
1652*0a6a1f1dSLionel Sambuc	add	global1, 768, global4
1653*0a6a1f1dSLionel Sambuc
1654*0a6a1f1dSLionel Sambuc	and	local4, local5, local4
1655*0a6a1f1dSLionel Sambuc	add	global1, 1024, global5
1656*0a6a1f1dSLionel Sambuc
1657*0a6a1f1dSLionel Sambuc	ld	[out2+272], local7
1658*0a6a1f1dSLionel Sambuc	sll	local4, 8, local1
1659*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5
1660*0a6a1f1dSLionel Sambuc
1661*0a6a1f1dSLionel Sambuc	srl	out5, 1, local4
1662*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5
1663*0a6a1f1dSLionel Sambuc
1664*0a6a1f1dSLionel Sambuc	ld	[in3], out0                ! key 7531
1665*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
1666*0a6a1f1dSLionel Sambuc	add	global1, 256, global2
1667*0a6a1f1dSLionel Sambuc
1668*0a6a1f1dSLionel Sambuc	ld	[in3+4], out1              ! key 8642
1669*0a6a1f1dSLionel Sambuc	and	local4, local7, local4
1670*0a6a1f1dSLionel Sambuc	add	global1, 512, global3
1671*0a6a1f1dSLionel Sambuc
1672*0a6a1f1dSLionel Sambuc	sll	local4, 1, local1
1673*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
1674*0a6a1f1dSLionel Sambuc
1675*0a6a1f1dSLionel Sambuc	sll	in5, 3, local3
1676*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5
1677*0a6a1f1dSLionel Sambuc
1678*0a6a1f1dSLionel Sambuc	sll	out5, 3, local2
1679*0a6a1f1dSLionel Sambuc	add	global1, 1280, local6     ! address sbox 8
1680*0a6a1f1dSLionel Sambuc
1681*0a6a1f1dSLionel Sambuc	srl	in5, 29, local4
1682*0a6a1f1dSLionel Sambuc	add	global1, 1792, out3       ! address sbox 8
1683*0a6a1f1dSLionel Sambuc
1684*0a6a1f1dSLionel Sambuc	srl	out5, 29, local1
1685*0a6a1f1dSLionel Sambuc	or	local4, local3, out5
1686*0a6a1f1dSLionel Sambuc
1687*0a6a1f1dSLionel Sambuc	or	local2, local1, in5
1688*0a6a1f1dSLionel Sambuc
1689*0a6a1f1dSLionel Sambuc
1690*0a6a1f1dSLionel Sambuc
1691*0a6a1f1dSLionel Sambuc		ld	[out2+284], local5     ! 0x0000FC00 used in the rounds
1692*0a6a1f1dSLionel Sambuc		or	local2, local1, in5
1693*0a6a1f1dSLionel Sambuc		xor	out5, out0, local1
1694*0a6a1f1dSLionel Sambuc
1695*0a6a1f1dSLionel Sambuc		call .des_enc.1
1696*0a6a1f1dSLionel Sambuc		and	local1, 252, local1
1697*0a6a1f1dSLionel Sambuc
1698*0a6a1f1dSLionel Sambuc
1699*0a6a1f1dSLionel Sambuc
1700*0a6a1f1dSLionel Sambuc
1701*0a6a1f1dSLionel Sambuc
1702*0a6a1f1dSLionel Sambuc
1703*0a6a1f1dSLionel Sambuc	call	.des_dec
1704*0a6a1f1dSLionel Sambuc	mov	in2, in3                  ! preload ks3
1705*0a6a1f1dSLionel Sambuc
1706*0a6a1f1dSLionel Sambuc	call	.des_enc
1707*0a6a1f1dSLionel Sambuc	nop
1708*0a6a1f1dSLionel Sambuc
1709*0a6a1f1dSLionel Sambuc
1710*0a6a1f1dSLionel Sambuc
1711*0a6a1f1dSLionel Sambuc! fp_macro
1712*0a6a1f1dSLionel Sambuc! in5 out5 1
1713*0a6a1f1dSLionel Sambuc
1714*0a6a1f1dSLionel Sambuc	! initially undo the rotate 3 left done after initial permutation
1715*0a6a1f1dSLionel Sambuc	! original left is received shifted 3 right and 29 left in local3/4
1716*0a6a1f1dSLionel Sambuc
1717*0a6a1f1dSLionel Sambuc	sll	out5, 29, local1
1718*0a6a1f1dSLionel Sambuc	or	local3, local4, in5
1719*0a6a1f1dSLionel Sambuc
1720*0a6a1f1dSLionel Sambuc	srl	out5, 3, out5
1721*0a6a1f1dSLionel Sambuc	sethi	%hi(0x55555555), local2
1722*0a6a1f1dSLionel Sambuc
1723*0a6a1f1dSLionel Sambuc	or	out5, local1, out5
1724*0a6a1f1dSLionel Sambuc	or	local2, %lo(0x55555555), local2
1725*0a6a1f1dSLionel Sambuc
1726*0a6a1f1dSLionel Sambuc	srl	out5, 1, local3
1727*0a6a1f1dSLionel Sambuc	sethi	%hi(0x00ff00ff), local1
1728*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
1729*0a6a1f1dSLionel Sambuc	or	local1, %lo(0x00ff00ff), local1
1730*0a6a1f1dSLionel Sambuc	and	local3, local2, local3
1731*0a6a1f1dSLionel Sambuc	sethi	%hi(0x33333333), local4
1732*0a6a1f1dSLionel Sambuc	sll	local3, 1, local2
1733*0a6a1f1dSLionel Sambuc
1734*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5
1735*0a6a1f1dSLionel Sambuc
1736*0a6a1f1dSLionel Sambuc	srl	in5, 8, local3
1737*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
1738*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
1739*0a6a1f1dSLionel Sambuc	or	local4, %lo(0x33333333), local4
1740*0a6a1f1dSLionel Sambuc	and	local3, local1, local3
1741*0a6a1f1dSLionel Sambuc	sethi	%hi(0x0000ffff), local1
1742*0a6a1f1dSLionel Sambuc	sll	local3, 8, local2
1743*0a6a1f1dSLionel Sambuc
1744*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5
1745*0a6a1f1dSLionel Sambuc
1746*0a6a1f1dSLionel Sambuc	srl	out5, 2, local3
1747*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5
1748*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
1749*0a6a1f1dSLionel Sambuc	or	local1, %lo(0x0000ffff), local1
1750*0a6a1f1dSLionel Sambuc	and	local3, local4, local3
1751*0a6a1f1dSLionel Sambuc	sethi	%hi(0x0f0f0f0f), local4
1752*0a6a1f1dSLionel Sambuc	sll	local3, 2, local2
1753*0a6a1f1dSLionel Sambuc
1754*0a6a1f1dSLionel Sambuc
1755*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5
1756*0a6a1f1dSLionel Sambuc
1757*0a6a1f1dSLionel Sambuc
1758*0a6a1f1dSLionel Sambuc	srl	in5, 16, local3
1759*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
1760*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
1761*0a6a1f1dSLionel Sambuc	or	local4, %lo(0x0f0f0f0f), local4
1762*0a6a1f1dSLionel Sambuc	and	local3, local1, local3
1763*0a6a1f1dSLionel Sambuc	sll	local3, 16, local2
1764*0a6a1f1dSLionel Sambuc
1765*0a6a1f1dSLionel Sambuc	xor	out5, local3, local1
1766*0a6a1f1dSLionel Sambuc
1767*0a6a1f1dSLionel Sambuc	srl	local1, 4, local3
1768*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5
1769*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
1770*0a6a1f1dSLionel Sambuc	and	local3, local4, local3
1771*0a6a1f1dSLionel Sambuc	sll	local3, 4, local2
1772*0a6a1f1dSLionel Sambuc
1773*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5
1774*0a6a1f1dSLionel Sambuc
1775*0a6a1f1dSLionel Sambuc	! optional store:
1776*0a6a1f1dSLionel Sambuc
1777*0a6a1f1dSLionel Sambuc	st in5, [in0]
1778*0a6a1f1dSLionel Sambuc
1779*0a6a1f1dSLionel Sambuc	xor	local1, local2, out5
1780*0a6a1f1dSLionel Sambuc
1781*0a6a1f1dSLionel Sambuc	st out5, [in0+4]
1782*0a6a1f1dSLionel Sambuc
1783*0a6a1f1dSLionel Sambuc
1784*0a6a1f1dSLionel Sambuc
1785*0a6a1f1dSLionel Sambuc	ret
1786*0a6a1f1dSLionel Sambuc	restore
1787*0a6a1f1dSLionel Sambuc
1788*0a6a1f1dSLionel Sambuc.DES_encrypt3.end:
1789*0a6a1f1dSLionel Sambuc	.size	 DES_encrypt3,.DES_encrypt3.end-DES_encrypt3
1790*0a6a1f1dSLionel Sambuc
1791*0a6a1f1dSLionel Sambuc
1792*0a6a1f1dSLionel Sambuc! void DES_decrypt3(data, ks1, ks2, ks3)
1793*0a6a1f1dSLionel Sambuc! **************************************
1794*0a6a1f1dSLionel Sambuc
1795*0a6a1f1dSLionel Sambuc	.align 32
1796*0a6a1f1dSLionel Sambuc	.global DES_decrypt3
1797*0a6a1f1dSLionel Sambuc	.type	 DES_decrypt3,#function
1798*0a6a1f1dSLionel Sambuc
1799*0a6a1f1dSLionel SambucDES_decrypt3:
1800*0a6a1f1dSLionel Sambuc
1801*0a6a1f1dSLionel Sambuc	save	%sp, FRAME, %sp
1802*0a6a1f1dSLionel Sambuc
1803*0a6a1f1dSLionel Sambuc	sethi	%hi(_PIC_DES_SPtrans-1f),global1
1804*0a6a1f1dSLionel Sambuc	or	global1,%lo(_PIC_DES_SPtrans-1f),global1
1805*0a6a1f1dSLionel Sambuc1:	call	.+8
1806*0a6a1f1dSLionel Sambuc	add	%o7,global1,global1
1807*0a6a1f1dSLionel Sambuc	sub	global1,_PIC_DES_SPtrans-.des_and,out2
1808*0a6a1f1dSLionel Sambuc
1809*0a6a1f1dSLionel Sambuc	ld	[in0], in5                ! left
1810*0a6a1f1dSLionel Sambuc	add	in3, 120, in4             ! ks3
1811*0a6a1f1dSLionel Sambuc
1812*0a6a1f1dSLionel Sambuc	ld	[in0+4], out5             ! right
1813*0a6a1f1dSLionel Sambuc	mov	in2, in3                  ! ks2
1814*0a6a1f1dSLionel Sambuc
1815*0a6a1f1dSLionel Sambuc	! parameter 6  1/2 for include encryption/decryption
1816*0a6a1f1dSLionel Sambuc	! parameter 7  1 for mov in1 to in3
1817*0a6a1f1dSLionel Sambuc	! parameter 8  1 for mov in3 to in4
1818*0a6a1f1dSLionel Sambuc	! parameter 9  1 for load ks3 and ks2 to in4 and in3
1819*0a6a1f1dSLionel Sambuc
1820*0a6a1f1dSLionel Sambuc
1821*0a6a1f1dSLionel Sambuc
1822*0a6a1f1dSLionel Sambuc! ip_macro
1823*0a6a1f1dSLionel Sambuc! in5 out5 in5 out5 in4 2 0 0 0
1824*0a6a1f1dSLionel Sambuc
1825*0a6a1f1dSLionel Sambuc	ld	[out2+256], local1
1826*0a6a1f1dSLionel Sambuc	srl	out5, 4, local4
1827*0a6a1f1dSLionel Sambuc
1828*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
1829*0a6a1f1dSLionel Sambuc	nop
1830*0a6a1f1dSLionel Sambuc
1831*0a6a1f1dSLionel Sambuc	ld	[out2+260], local2
1832*0a6a1f1dSLionel Sambuc	and	local4, local1, local4
1833*0a6a1f1dSLionel Sambuc
1834*0a6a1f1dSLionel Sambuc
1835*0a6a1f1dSLionel Sambuc
1836*0a6a1f1dSLionel Sambuc	ld	[out2+280], out4          ! loop counter
1837*0a6a1f1dSLionel Sambuc	sll	local4, 4, local1
1838*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
1839*0a6a1f1dSLionel Sambuc
1840*0a6a1f1dSLionel Sambuc	ld	[out2+264], local3
1841*0a6a1f1dSLionel Sambuc	srl	in5, 16, local4
1842*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5
1843*0a6a1f1dSLionel Sambuc
1844*0a6a1f1dSLionel Sambuc
1845*0a6a1f1dSLionel Sambuc	xor	local4, out5, local4
1846*0a6a1f1dSLionel Sambuc	nop	!sethi	%hi(DES_SPtrans), global1 ! sbox addr
1847*0a6a1f1dSLionel Sambuc
1848*0a6a1f1dSLionel Sambuc
1849*0a6a1f1dSLionel Sambuc	and	local4, local2, local4
1850*0a6a1f1dSLionel Sambuc	nop	!or	global1, %lo(DES_SPtrans), global1   ! sbox addr
1851*0a6a1f1dSLionel Sambuc
1852*0a6a1f1dSLionel Sambuc	sll	local4, 16, local1
1853*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5
1854*0a6a1f1dSLionel Sambuc
1855*0a6a1f1dSLionel Sambuc	srl	out5, 2, local4
1856*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5
1857*0a6a1f1dSLionel Sambuc
1858*0a6a1f1dSLionel Sambuc	sethi	%hi(16711680), local5
1859*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
1860*0a6a1f1dSLionel Sambuc
1861*0a6a1f1dSLionel Sambuc	and	local4, local3, local4
1862*0a6a1f1dSLionel Sambuc	or	local5, 255, local5
1863*0a6a1f1dSLionel Sambuc
1864*0a6a1f1dSLionel Sambuc	sll	local4, 2, local2
1865*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
1866*0a6a1f1dSLionel Sambuc
1867*0a6a1f1dSLionel Sambuc	srl	in5, 8, local4
1868*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
1869*0a6a1f1dSLionel Sambuc
1870*0a6a1f1dSLionel Sambuc	xor	local4, out5, local4
1871*0a6a1f1dSLionel Sambuc	add	global1, 768, global4
1872*0a6a1f1dSLionel Sambuc
1873*0a6a1f1dSLionel Sambuc	and	local4, local5, local4
1874*0a6a1f1dSLionel Sambuc	add	global1, 1024, global5
1875*0a6a1f1dSLionel Sambuc
1876*0a6a1f1dSLionel Sambuc	ld	[out2+272], local7
1877*0a6a1f1dSLionel Sambuc	sll	local4, 8, local1
1878*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5
1879*0a6a1f1dSLionel Sambuc
1880*0a6a1f1dSLionel Sambuc	srl	out5, 1, local4
1881*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5
1882*0a6a1f1dSLionel Sambuc
1883*0a6a1f1dSLionel Sambuc	ld	[in4], out0                ! key 7531
1884*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
1885*0a6a1f1dSLionel Sambuc	add	global1, 256, global2
1886*0a6a1f1dSLionel Sambuc
1887*0a6a1f1dSLionel Sambuc	ld	[in4+4], out1              ! key 8642
1888*0a6a1f1dSLionel Sambuc	and	local4, local7, local4
1889*0a6a1f1dSLionel Sambuc	add	global1, 512, global3
1890*0a6a1f1dSLionel Sambuc
1891*0a6a1f1dSLionel Sambuc	sll	local4, 1, local1
1892*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
1893*0a6a1f1dSLionel Sambuc
1894*0a6a1f1dSLionel Sambuc	sll	in5, 3, local3
1895*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5
1896*0a6a1f1dSLionel Sambuc
1897*0a6a1f1dSLionel Sambuc	sll	out5, 3, local2
1898*0a6a1f1dSLionel Sambuc	add	global1, 1280, local6     ! address sbox 8
1899*0a6a1f1dSLionel Sambuc
1900*0a6a1f1dSLionel Sambuc	srl	in5, 29, local4
1901*0a6a1f1dSLionel Sambuc	add	global1, 1792, out3       ! address sbox 8
1902*0a6a1f1dSLionel Sambuc
1903*0a6a1f1dSLionel Sambuc	srl	out5, 29, local1
1904*0a6a1f1dSLionel Sambuc	or	local4, local3, in5
1905*0a6a1f1dSLionel Sambuc
1906*0a6a1f1dSLionel Sambuc	or	local2, local1, out5
1907*0a6a1f1dSLionel Sambuc
1908*0a6a1f1dSLionel Sambuc
1909*0a6a1f1dSLionel Sambuc
1910*0a6a1f1dSLionel Sambuc
1911*0a6a1f1dSLionel Sambuc
1912*0a6a1f1dSLionel Sambuc		ld	[out2+284], local5     ! 0x0000FC00 used in the rounds
1913*0a6a1f1dSLionel Sambuc		or	local2, local1, out5
1914*0a6a1f1dSLionel Sambuc		xor	in5, out0, local1
1915*0a6a1f1dSLionel Sambuc
1916*0a6a1f1dSLionel Sambuc		call .des_dec.1
1917*0a6a1f1dSLionel Sambuc		and	local1, 252, local1
1918*0a6a1f1dSLionel Sambuc
1919*0a6a1f1dSLionel Sambuc
1920*0a6a1f1dSLionel Sambuc
1921*0a6a1f1dSLionel Sambuc
1922*0a6a1f1dSLionel Sambuc	call	.des_enc
1923*0a6a1f1dSLionel Sambuc	add	in1, 120, in4             ! preload ks1
1924*0a6a1f1dSLionel Sambuc
1925*0a6a1f1dSLionel Sambuc	call	.des_dec
1926*0a6a1f1dSLionel Sambuc	nop
1927*0a6a1f1dSLionel Sambuc
1928*0a6a1f1dSLionel Sambuc
1929*0a6a1f1dSLionel Sambuc
1930*0a6a1f1dSLionel Sambuc! fp_macro
1931*0a6a1f1dSLionel Sambuc! out5 in5 1
1932*0a6a1f1dSLionel Sambuc
1933*0a6a1f1dSLionel Sambuc	! initially undo the rotate 3 left done after initial permutation
1934*0a6a1f1dSLionel Sambuc	! original left is received shifted 3 right and 29 left in local3/4
1935*0a6a1f1dSLionel Sambuc
1936*0a6a1f1dSLionel Sambuc	sll	in5, 29, local1
1937*0a6a1f1dSLionel Sambuc	or	local3, local4, out5
1938*0a6a1f1dSLionel Sambuc
1939*0a6a1f1dSLionel Sambuc	srl	in5, 3, in5
1940*0a6a1f1dSLionel Sambuc	sethi	%hi(0x55555555), local2
1941*0a6a1f1dSLionel Sambuc
1942*0a6a1f1dSLionel Sambuc	or	in5, local1, in5
1943*0a6a1f1dSLionel Sambuc	or	local2, %lo(0x55555555), local2
1944*0a6a1f1dSLionel Sambuc
1945*0a6a1f1dSLionel Sambuc	srl	in5, 1, local3
1946*0a6a1f1dSLionel Sambuc	sethi	%hi(0x00ff00ff), local1
1947*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
1948*0a6a1f1dSLionel Sambuc	or	local1, %lo(0x00ff00ff), local1
1949*0a6a1f1dSLionel Sambuc	and	local3, local2, local3
1950*0a6a1f1dSLionel Sambuc	sethi	%hi(0x33333333), local4
1951*0a6a1f1dSLionel Sambuc	sll	local3, 1, local2
1952*0a6a1f1dSLionel Sambuc
1953*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5
1954*0a6a1f1dSLionel Sambuc
1955*0a6a1f1dSLionel Sambuc	srl	out5, 8, local3
1956*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5
1957*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
1958*0a6a1f1dSLionel Sambuc	or	local4, %lo(0x33333333), local4
1959*0a6a1f1dSLionel Sambuc	and	local3, local1, local3
1960*0a6a1f1dSLionel Sambuc	sethi	%hi(0x0000ffff), local1
1961*0a6a1f1dSLionel Sambuc	sll	local3, 8, local2
1962*0a6a1f1dSLionel Sambuc
1963*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5
1964*0a6a1f1dSLionel Sambuc
1965*0a6a1f1dSLionel Sambuc	srl	in5, 2, local3
1966*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
1967*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
1968*0a6a1f1dSLionel Sambuc	or	local1, %lo(0x0000ffff), local1
1969*0a6a1f1dSLionel Sambuc	and	local3, local4, local3
1970*0a6a1f1dSLionel Sambuc	sethi	%hi(0x0f0f0f0f), local4
1971*0a6a1f1dSLionel Sambuc	sll	local3, 2, local2
1972*0a6a1f1dSLionel Sambuc
1973*0a6a1f1dSLionel Sambuc
1974*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5
1975*0a6a1f1dSLionel Sambuc
1976*0a6a1f1dSLionel Sambuc
1977*0a6a1f1dSLionel Sambuc	srl	out5, 16, local3
1978*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5
1979*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
1980*0a6a1f1dSLionel Sambuc	or	local4, %lo(0x0f0f0f0f), local4
1981*0a6a1f1dSLionel Sambuc	and	local3, local1, local3
1982*0a6a1f1dSLionel Sambuc	sll	local3, 16, local2
1983*0a6a1f1dSLionel Sambuc
1984*0a6a1f1dSLionel Sambuc	xor	in5, local3, local1
1985*0a6a1f1dSLionel Sambuc
1986*0a6a1f1dSLionel Sambuc	srl	local1, 4, local3
1987*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
1988*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
1989*0a6a1f1dSLionel Sambuc	and	local3, local4, local3
1990*0a6a1f1dSLionel Sambuc	sll	local3, 4, local2
1991*0a6a1f1dSLionel Sambuc
1992*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5
1993*0a6a1f1dSLionel Sambuc
1994*0a6a1f1dSLionel Sambuc	! optional store:
1995*0a6a1f1dSLionel Sambuc
1996*0a6a1f1dSLionel Sambuc	st out5, [in0]
1997*0a6a1f1dSLionel Sambuc
1998*0a6a1f1dSLionel Sambuc	xor	local1, local2, in5
1999*0a6a1f1dSLionel Sambuc
2000*0a6a1f1dSLionel Sambuc	st in5, [in0+4]
2001*0a6a1f1dSLionel Sambuc
2002*0a6a1f1dSLionel Sambuc
2003*0a6a1f1dSLionel Sambuc
2004*0a6a1f1dSLionel Sambuc	ret
2005*0a6a1f1dSLionel Sambuc	restore
2006*0a6a1f1dSLionel Sambuc
2007*0a6a1f1dSLionel Sambuc.DES_decrypt3.end:
2008*0a6a1f1dSLionel Sambuc	.size	 DES_decrypt3,.DES_decrypt3.end-DES_decrypt3
2009*0a6a1f1dSLionel Sambuc
2010*0a6a1f1dSLionel Sambuc! void DES_ncbc_encrypt(input, output, length, schedule, ivec, enc)
2011*0a6a1f1dSLionel Sambuc! *****************************************************************
2012*0a6a1f1dSLionel Sambuc
2013*0a6a1f1dSLionel Sambuc
2014*0a6a1f1dSLionel Sambuc	.align 32
2015*0a6a1f1dSLionel Sambuc	.global DES_ncbc_encrypt
2016*0a6a1f1dSLionel Sambuc	.type	 DES_ncbc_encrypt,#function
2017*0a6a1f1dSLionel Sambuc
2018*0a6a1f1dSLionel SambucDES_ncbc_encrypt:
2019*0a6a1f1dSLionel Sambuc
2020*0a6a1f1dSLionel Sambuc	save	%sp, FRAME, %sp
2021*0a6a1f1dSLionel Sambuc
2022*0a6a1f1dSLionel Sambuc
2023*0a6a1f1dSLionel Sambuc
2024*0a6a1f1dSLionel Sambuc
2025*0a6a1f1dSLionel Sambuc
2026*0a6a1f1dSLionel Sambuc	sethi	%hi(_PIC_DES_SPtrans-1f),global1
2027*0a6a1f1dSLionel Sambuc	or	global1,%lo(_PIC_DES_SPtrans-1f),global1
2028*0a6a1f1dSLionel Sambuc1:	call	.+8
2029*0a6a1f1dSLionel Sambuc	add	%o7,global1,global1
2030*0a6a1f1dSLionel Sambuc	sub	global1,_PIC_DES_SPtrans-.des_and,out2
2031*0a6a1f1dSLionel Sambuc
2032*0a6a1f1dSLionel Sambuc	cmp	in5, 0                    ! enc
2033*0a6a1f1dSLionel Sambuc
2034*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
2035*0a6a1f1dSLionel Sambuc	be,pn	%icc, .ncbc.dec
2036*0a6a1f1dSLionel Sambuc#else
2037*0a6a1f1dSLionel Sambuc	be	.ncbc.dec
2038*0a6a1f1dSLionel Sambuc#endif
2039*0a6a1f1dSLionel Sambuc	STPTR	in4,  [%sp+BIAS+ARG0+4*ARGSZ]
2040*0a6a1f1dSLionel Sambuc
2041*0a6a1f1dSLionel Sambuc	! addr  left  right  temp  label
2042*0a6a1f1dSLionel Sambuc
2043*0a6a1f1dSLionel Sambuc
2044*0a6a1f1dSLionel Sambuc! load_little_endian
2045*0a6a1f1dSLionel Sambuc! in4 in5 out5 local3 .LLE1
2046*0a6a1f1dSLionel Sambuc
2047*0a6a1f1dSLionel Sambuc	! first in memory to rightmost in register
2048*0a6a1f1dSLionel Sambuc
2049*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
2050*0a6a1f1dSLionel Sambuc	andcc	in4, 3, global0
2051*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .LLE1
2052*0a6a1f1dSLionel Sambuc	nop
2053*0a6a1f1dSLionel Sambuc
2054*0a6a1f1dSLionel Sambuc	lda	[in4] 0x88, in5
2055*0a6a1f1dSLionel Sambuc	add	in4, 4, local3
2056*0a6a1f1dSLionel Sambuc
2057*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .LLE1a
2058*0a6a1f1dSLionel Sambuc	lda	[local3] 0x88, out5
2059*0a6a1f1dSLionel Sambuc#endif
2060*0a6a1f1dSLionel Sambuc
2061*0a6a1f1dSLionel Sambuc.LLE1:
2062*0a6a1f1dSLionel Sambuc	ldub	[in4+3], in5
2063*0a6a1f1dSLionel Sambuc
2064*0a6a1f1dSLionel Sambuc	ldub	[in4+2], local3
2065*0a6a1f1dSLionel Sambuc	sll	in5, 8, in5
2066*0a6a1f1dSLionel Sambuc	or	in5, local3, in5
2067*0a6a1f1dSLionel Sambuc
2068*0a6a1f1dSLionel Sambuc	ldub	[in4+1], local3
2069*0a6a1f1dSLionel Sambuc	sll	in5, 8, in5
2070*0a6a1f1dSLionel Sambuc	or	in5, local3, in5
2071*0a6a1f1dSLionel Sambuc
2072*0a6a1f1dSLionel Sambuc	ldub	[in4+0], local3
2073*0a6a1f1dSLionel Sambuc	sll	in5, 8, in5
2074*0a6a1f1dSLionel Sambuc	or	in5, local3, in5
2075*0a6a1f1dSLionel Sambuc
2076*0a6a1f1dSLionel Sambuc
2077*0a6a1f1dSLionel Sambuc	ldub	[in4+3+4], out5
2078*0a6a1f1dSLionel Sambuc
2079*0a6a1f1dSLionel Sambuc	ldub	[in4+2+4], local3
2080*0a6a1f1dSLionel Sambuc	sll	out5, 8, out5
2081*0a6a1f1dSLionel Sambuc	or	out5, local3, out5
2082*0a6a1f1dSLionel Sambuc
2083*0a6a1f1dSLionel Sambuc	ldub	[in4+1+4], local3
2084*0a6a1f1dSLionel Sambuc	sll	out5, 8, out5
2085*0a6a1f1dSLionel Sambuc	or	out5, local3, out5
2086*0a6a1f1dSLionel Sambuc
2087*0a6a1f1dSLionel Sambuc	ldub	[in4+0+4], local3
2088*0a6a1f1dSLionel Sambuc	sll	out5, 8, out5
2089*0a6a1f1dSLionel Sambuc	or	out5, local3, out5
2090*0a6a1f1dSLionel Sambuc.LLE1a:
2091*0a6a1f1dSLionel Sambuc
2092*0a6a1f1dSLionel Sambuc  ! iv
2093*0a6a1f1dSLionel Sambuc
2094*0a6a1f1dSLionel Sambuc	addcc	in2, -8, in2              ! bytes missing when first block done
2095*0a6a1f1dSLionel Sambuc
2096*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
2097*0a6a1f1dSLionel Sambuc	bl,pn	%icc, .ncbc.enc.seven.or.less
2098*0a6a1f1dSLionel Sambuc#else
2099*0a6a1f1dSLionel Sambuc	bl	.ncbc.enc.seven.or.less
2100*0a6a1f1dSLionel Sambuc#endif
2101*0a6a1f1dSLionel Sambuc	mov	in3, in4                  ! schedule
2102*0a6a1f1dSLionel Sambuc
2103*0a6a1f1dSLionel Sambuc.ncbc.enc.next.block:
2104*0a6a1f1dSLionel Sambuc
2105*0a6a1f1dSLionel Sambuc
2106*0a6a1f1dSLionel Sambuc
2107*0a6a1f1dSLionel Sambuc! load_little_endian
2108*0a6a1f1dSLionel Sambuc! in0 out4 global4 local3 .LLE2
2109*0a6a1f1dSLionel Sambuc
2110*0a6a1f1dSLionel Sambuc	! first in memory to rightmost in register
2111*0a6a1f1dSLionel Sambuc
2112*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
2113*0a6a1f1dSLionel Sambuc	andcc	in0, 3, global0
2114*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .LLE2
2115*0a6a1f1dSLionel Sambuc	nop
2116*0a6a1f1dSLionel Sambuc
2117*0a6a1f1dSLionel Sambuc	lda	[in0] 0x88, out4
2118*0a6a1f1dSLionel Sambuc	add	in0, 4, local3
2119*0a6a1f1dSLionel Sambuc
2120*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .LLE2a
2121*0a6a1f1dSLionel Sambuc	lda	[local3] 0x88, global4
2122*0a6a1f1dSLionel Sambuc#endif
2123*0a6a1f1dSLionel Sambuc
2124*0a6a1f1dSLionel Sambuc.LLE2:
2125*0a6a1f1dSLionel Sambuc	ldub	[in0+3], out4
2126*0a6a1f1dSLionel Sambuc
2127*0a6a1f1dSLionel Sambuc	ldub	[in0+2], local3
2128*0a6a1f1dSLionel Sambuc	sll	out4, 8, out4
2129*0a6a1f1dSLionel Sambuc	or	out4, local3, out4
2130*0a6a1f1dSLionel Sambuc
2131*0a6a1f1dSLionel Sambuc	ldub	[in0+1], local3
2132*0a6a1f1dSLionel Sambuc	sll	out4, 8, out4
2133*0a6a1f1dSLionel Sambuc	or	out4, local3, out4
2134*0a6a1f1dSLionel Sambuc
2135*0a6a1f1dSLionel Sambuc	ldub	[in0+0], local3
2136*0a6a1f1dSLionel Sambuc	sll	out4, 8, out4
2137*0a6a1f1dSLionel Sambuc	or	out4, local3, out4
2138*0a6a1f1dSLionel Sambuc
2139*0a6a1f1dSLionel Sambuc
2140*0a6a1f1dSLionel Sambuc	ldub	[in0+3+4], global4
2141*0a6a1f1dSLionel Sambuc
2142*0a6a1f1dSLionel Sambuc	ldub	[in0+2+4], local3
2143*0a6a1f1dSLionel Sambuc	sll	global4, 8, global4
2144*0a6a1f1dSLionel Sambuc	or	global4, local3, global4
2145*0a6a1f1dSLionel Sambuc
2146*0a6a1f1dSLionel Sambuc	ldub	[in0+1+4], local3
2147*0a6a1f1dSLionel Sambuc	sll	global4, 8, global4
2148*0a6a1f1dSLionel Sambuc	or	global4, local3, global4
2149*0a6a1f1dSLionel Sambuc
2150*0a6a1f1dSLionel Sambuc	ldub	[in0+0+4], local3
2151*0a6a1f1dSLionel Sambuc	sll	global4, 8, global4
2152*0a6a1f1dSLionel Sambuc	or	global4, local3, global4
2153*0a6a1f1dSLionel Sambuc.LLE2a:
2154*0a6a1f1dSLionel Sambuc
2155*0a6a1f1dSLionel Sambuc  ! block
2156*0a6a1f1dSLionel Sambuc
2157*0a6a1f1dSLionel Sambuc.ncbc.enc.next.block_1:
2158*0a6a1f1dSLionel Sambuc
2159*0a6a1f1dSLionel Sambuc	xor	in5, out4, in5            ! iv xor
2160*0a6a1f1dSLionel Sambuc	xor	out5, global4, out5       ! iv xor
2161*0a6a1f1dSLionel Sambuc
2162*0a6a1f1dSLionel Sambuc	! parameter 8  1 for move in3 to in4, 2 for move in4 to in3
2163*0a6a1f1dSLionel Sambuc
2164*0a6a1f1dSLionel Sambuc
2165*0a6a1f1dSLionel Sambuc! ip_macro
2166*0a6a1f1dSLionel Sambuc! in5 out5 out5 in5 in3 0 0 2
2167*0a6a1f1dSLionel Sambuc
2168*0a6a1f1dSLionel Sambuc	ld	[out2+256], local1
2169*0a6a1f1dSLionel Sambuc	srl	out5, 4, local4
2170*0a6a1f1dSLionel Sambuc
2171*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
2172*0a6a1f1dSLionel Sambuc	nop
2173*0a6a1f1dSLionel Sambuc
2174*0a6a1f1dSLionel Sambuc	ld	[out2+260], local2
2175*0a6a1f1dSLionel Sambuc	and	local4, local1, local4
2176*0a6a1f1dSLionel Sambuc
2177*0a6a1f1dSLionel Sambuc	mov in4, in3
2178*0a6a1f1dSLionel Sambuc
2179*0a6a1f1dSLionel Sambuc	ld	[out2+280], out4          ! loop counter
2180*0a6a1f1dSLionel Sambuc	sll	local4, 4, local1
2181*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
2182*0a6a1f1dSLionel Sambuc
2183*0a6a1f1dSLionel Sambuc	ld	[out2+264], local3
2184*0a6a1f1dSLionel Sambuc	srl	in5, 16, local4
2185*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5
2186*0a6a1f1dSLionel Sambuc
2187*0a6a1f1dSLionel Sambuc
2188*0a6a1f1dSLionel Sambuc	xor	local4, out5, local4
2189*0a6a1f1dSLionel Sambuc	nop	!sethi	%hi(DES_SPtrans), global1 ! sbox addr
2190*0a6a1f1dSLionel Sambuc
2191*0a6a1f1dSLionel Sambuc
2192*0a6a1f1dSLionel Sambuc	and	local4, local2, local4
2193*0a6a1f1dSLionel Sambuc	nop	!or	global1, %lo(DES_SPtrans), global1   ! sbox addr
2194*0a6a1f1dSLionel Sambuc
2195*0a6a1f1dSLionel Sambuc	sll	local4, 16, local1
2196*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5
2197*0a6a1f1dSLionel Sambuc
2198*0a6a1f1dSLionel Sambuc	srl	out5, 2, local4
2199*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5
2200*0a6a1f1dSLionel Sambuc
2201*0a6a1f1dSLionel Sambuc	sethi	%hi(16711680), local5
2202*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
2203*0a6a1f1dSLionel Sambuc
2204*0a6a1f1dSLionel Sambuc	and	local4, local3, local4
2205*0a6a1f1dSLionel Sambuc	or	local5, 255, local5
2206*0a6a1f1dSLionel Sambuc
2207*0a6a1f1dSLionel Sambuc	sll	local4, 2, local2
2208*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
2209*0a6a1f1dSLionel Sambuc
2210*0a6a1f1dSLionel Sambuc	srl	in5, 8, local4
2211*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
2212*0a6a1f1dSLionel Sambuc
2213*0a6a1f1dSLionel Sambuc	xor	local4, out5, local4
2214*0a6a1f1dSLionel Sambuc	add	global1, 768, global4
2215*0a6a1f1dSLionel Sambuc
2216*0a6a1f1dSLionel Sambuc	and	local4, local5, local4
2217*0a6a1f1dSLionel Sambuc	add	global1, 1024, global5
2218*0a6a1f1dSLionel Sambuc
2219*0a6a1f1dSLionel Sambuc	ld	[out2+272], local7
2220*0a6a1f1dSLionel Sambuc	sll	local4, 8, local1
2221*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5
2222*0a6a1f1dSLionel Sambuc
2223*0a6a1f1dSLionel Sambuc	srl	out5, 1, local4
2224*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5
2225*0a6a1f1dSLionel Sambuc
2226*0a6a1f1dSLionel Sambuc	ld	[in3], out0                ! key 7531
2227*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
2228*0a6a1f1dSLionel Sambuc	add	global1, 256, global2
2229*0a6a1f1dSLionel Sambuc
2230*0a6a1f1dSLionel Sambuc	ld	[in3+4], out1              ! key 8642
2231*0a6a1f1dSLionel Sambuc	and	local4, local7, local4
2232*0a6a1f1dSLionel Sambuc	add	global1, 512, global3
2233*0a6a1f1dSLionel Sambuc
2234*0a6a1f1dSLionel Sambuc	sll	local4, 1, local1
2235*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
2236*0a6a1f1dSLionel Sambuc
2237*0a6a1f1dSLionel Sambuc	sll	in5, 3, local3
2238*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5
2239*0a6a1f1dSLionel Sambuc
2240*0a6a1f1dSLionel Sambuc	sll	out5, 3, local2
2241*0a6a1f1dSLionel Sambuc	add	global1, 1280, local6     ! address sbox 8
2242*0a6a1f1dSLionel Sambuc
2243*0a6a1f1dSLionel Sambuc	srl	in5, 29, local4
2244*0a6a1f1dSLionel Sambuc	add	global1, 1792, out3       ! address sbox 8
2245*0a6a1f1dSLionel Sambuc
2246*0a6a1f1dSLionel Sambuc	srl	out5, 29, local1
2247*0a6a1f1dSLionel Sambuc	or	local4, local3, out5
2248*0a6a1f1dSLionel Sambuc
2249*0a6a1f1dSLionel Sambuc	or	local2, local1, in5
2250*0a6a1f1dSLionel Sambuc
2251*0a6a1f1dSLionel Sambuc
2252*0a6a1f1dSLionel Sambuc
2253*0a6a1f1dSLionel Sambuc
2254*0a6a1f1dSLionel Sambuc
2255*0a6a1f1dSLionel Sambuc
2256*0a6a1f1dSLionel Sambuc.ncbc.enc.next.block_2:
2257*0a6a1f1dSLionel Sambuc
2258*0a6a1f1dSLionel Sambuc!//	call .des_enc                     ! compares in2 to 8
2259*0a6a1f1dSLionel Sambuc!	rounds inlined for alignment purposes
2260*0a6a1f1dSLionel Sambuc
2261*0a6a1f1dSLionel Sambuc	add	global1, 768, global4     ! address sbox 4 since register used below
2262*0a6a1f1dSLionel Sambuc
2263*0a6a1f1dSLionel Sambuc
2264*0a6a1f1dSLionel Sambuc
2265*0a6a1f1dSLionel Sambuc! rounds_macro
2266*0a6a1f1dSLionel Sambuc! in5 out5 1 .ncbc.enc.1 in3 in4
2267*0a6a1f1dSLionel Sambuc
2268*0a6a1f1dSLionel Sambuc	xor	out5, out0, local1
2269*0a6a1f1dSLionel Sambuc
2270*0a6a1f1dSLionel Sambuc	ld	[out2+284], local5        ! 0x0000FC00
2271*0a6a1f1dSLionel Sambuc	ba	.ncbc.enc.1
2272*0a6a1f1dSLionel Sambuc	and	local1, 252, local1
2273*0a6a1f1dSLionel Sambuc
2274*0a6a1f1dSLionel Sambuc	.align 32
2275*0a6a1f1dSLionel Sambuc
2276*0a6a1f1dSLionel Sambuc.ncbc.enc.1:
2277*0a6a1f1dSLionel Sambuc	! local6 is address sbox 6
2278*0a6a1f1dSLionel Sambuc	! out3   is address sbox 8
2279*0a6a1f1dSLionel Sambuc	! out4   is loop counter
2280*0a6a1f1dSLionel Sambuc
2281*0a6a1f1dSLionel Sambuc	ld	[global1+local1], local1
2282*0a6a1f1dSLionel Sambuc	xor	out5, out1, out1            ! 8642
2283*0a6a1f1dSLionel Sambuc	xor	out5, out0, out0            ! 7531
2284*0a6a1f1dSLionel Sambuc	! fmovs	%f0, %f0                  ! fxor used for alignment
2285*0a6a1f1dSLionel Sambuc
2286*0a6a1f1dSLionel Sambuc	srl	out1, 4, local0           ! rotate 4 right
2287*0a6a1f1dSLionel Sambuc	and	out0, local5, local3      ! 3
2288*0a6a1f1dSLionel Sambuc	! fmovs	%f0, %f0
2289*0a6a1f1dSLionel Sambuc
2290*0a6a1f1dSLionel Sambuc	ld	[in3+1*8], local7         ! key 7531 next round
2291*0a6a1f1dSLionel Sambuc	srl	local3, 8, local3         ! 3
2292*0a6a1f1dSLionel Sambuc	and	local0, 252, local2       ! 2
2293*0a6a1f1dSLionel Sambuc	! fmovs	%f0, %f0
2294*0a6a1f1dSLionel Sambuc
2295*0a6a1f1dSLionel Sambuc	ld	[global3+local3],local3   ! 3
2296*0a6a1f1dSLionel Sambuc	sll	out1, 28, out1            ! rotate
2297*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5            ! 1 finished, local1 now sbox 7
2298*0a6a1f1dSLionel Sambuc
2299*0a6a1f1dSLionel Sambuc	ld	[global2+local2], local2  ! 2
2300*0a6a1f1dSLionel Sambuc	srl	out0, 24, local1          ! 7
2301*0a6a1f1dSLionel Sambuc	or	out1, local0, out1        ! rotate
2302*0a6a1f1dSLionel Sambuc
2303*0a6a1f1dSLionel Sambuc	ldub	[out2+local1], local1     ! 7 (and 0xFC)
2304*0a6a1f1dSLionel Sambuc	srl	out1, 24, local0          ! 8
2305*0a6a1f1dSLionel Sambuc	and	out1, local5, local4      ! 4
2306*0a6a1f1dSLionel Sambuc
2307*0a6a1f1dSLionel Sambuc	ldub	[out2+local0], local0     ! 8 (and 0xFC)
2308*0a6a1f1dSLionel Sambuc	srl	local4, 8, local4         ! 4
2309*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5            ! 2 finished local2 now sbox 6
2310*0a6a1f1dSLionel Sambuc
2311*0a6a1f1dSLionel Sambuc	ld	[global4+local4],local4   ! 4
2312*0a6a1f1dSLionel Sambuc	srl	out1, 16, local2          ! 6
2313*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5            ! 3 finished local3 now sbox 5
2314*0a6a1f1dSLionel Sambuc
2315*0a6a1f1dSLionel Sambuc	ld	[out3+local0],local0      ! 8
2316*0a6a1f1dSLionel Sambuc	and	local2, 252, local2       ! 6
2317*0a6a1f1dSLionel Sambuc	add	global1, 1536, local5     ! address sbox 7
2318*0a6a1f1dSLionel Sambuc
2319*0a6a1f1dSLionel Sambuc	ld	[local6+local2], local2   ! 6
2320*0a6a1f1dSLionel Sambuc	srl	out0, 16, local3          ! 5
2321*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5            ! 4 finished
2322*0a6a1f1dSLionel Sambuc
2323*0a6a1f1dSLionel Sambuc	ld	[local5+local1],local1    ! 7
2324*0a6a1f1dSLionel Sambuc	and	local3, 252, local3       ! 5
2325*0a6a1f1dSLionel Sambuc	xor	in5, local0, in5            ! 8 finished
2326*0a6a1f1dSLionel Sambuc
2327*0a6a1f1dSLionel Sambuc	ld	[global5+local3],local3   ! 5
2328*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5            ! 6 finished
2329*0a6a1f1dSLionel Sambuc	subcc	out4, 1, out4
2330*0a6a1f1dSLionel Sambuc
2331*0a6a1f1dSLionel Sambuc	ld	[in3+1*8+4], out0         ! key 8642 next round
2332*0a6a1f1dSLionel Sambuc	xor	in5, local7, local2        ! sbox 5 next round
2333*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5            ! 7 finished
2334*0a6a1f1dSLionel Sambuc
2335*0a6a1f1dSLionel Sambuc	srl	local2, 16, local2        ! sbox 5 next round
2336*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5            ! 5 finished
2337*0a6a1f1dSLionel Sambuc
2338*0a6a1f1dSLionel Sambuc	ld	[in3+1*16+4], out1        ! key 8642 next round again
2339*0a6a1f1dSLionel Sambuc	and	local2, 252, local2       ! sbox5 next round
2340*0a6a1f1dSLionel Sambuc! next round
2341*0a6a1f1dSLionel Sambuc	xor	in5, local7, local7        ! 7531
2342*0a6a1f1dSLionel Sambuc
2343*0a6a1f1dSLionel Sambuc	ld	[global5+local2], local2  ! 5
2344*0a6a1f1dSLionel Sambuc	srl	local7, 24, local3        ! 7
2345*0a6a1f1dSLionel Sambuc	xor	in5, out0, out0            ! 8642
2346*0a6a1f1dSLionel Sambuc
2347*0a6a1f1dSLionel Sambuc	ldub	[out2+local3], local3     ! 7 (and 0xFC)
2348*0a6a1f1dSLionel Sambuc	srl	out0, 4, local0           ! rotate 4 right
2349*0a6a1f1dSLionel Sambuc	and	local7, 252, local1       ! 1
2350*0a6a1f1dSLionel Sambuc
2351*0a6a1f1dSLionel Sambuc	sll	out0, 28, out0            ! rotate
2352*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5            ! 5 finished local2 used
2353*0a6a1f1dSLionel Sambuc
2354*0a6a1f1dSLionel Sambuc	srl	local0, 8, local4         ! 4
2355*0a6a1f1dSLionel Sambuc	and	local0, 252, local2       ! 2
2356*0a6a1f1dSLionel Sambuc	ld	[local5+local3], local3   ! 7
2357*0a6a1f1dSLionel Sambuc
2358*0a6a1f1dSLionel Sambuc	srl	local0, 16, local5        ! 6
2359*0a6a1f1dSLionel Sambuc	or	out0, local0, out0        ! rotate
2360*0a6a1f1dSLionel Sambuc	ld	[global2+local2], local2  ! 2
2361*0a6a1f1dSLionel Sambuc
2362*0a6a1f1dSLionel Sambuc	srl	out0, 24, local0
2363*0a6a1f1dSLionel Sambuc	ld	[in3+1*16], out0          ! key 7531 next round
2364*0a6a1f1dSLionel Sambuc	and	local4, 252, local4	  ! 4
2365*0a6a1f1dSLionel Sambuc
2366*0a6a1f1dSLionel Sambuc	and	local5, 252, local5       ! 6
2367*0a6a1f1dSLionel Sambuc	ld	[global4+local4], local4  ! 4
2368*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5            ! 7 finished local3 used
2369*0a6a1f1dSLionel Sambuc
2370*0a6a1f1dSLionel Sambuc	and	local0, 252, local0       ! 8
2371*0a6a1f1dSLionel Sambuc	ld	[local6+local5], local5   ! 6
2372*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5            ! 2 finished local2 now sbox 3
2373*0a6a1f1dSLionel Sambuc
2374*0a6a1f1dSLionel Sambuc	srl	local7, 8, local2         ! 3 start
2375*0a6a1f1dSLionel Sambuc	ld	[out3+local0], local0     ! 8
2376*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5            ! 4 finished
2377*0a6a1f1dSLionel Sambuc
2378*0a6a1f1dSLionel Sambuc	and	local2, 252, local2       ! 3
2379*0a6a1f1dSLionel Sambuc	ld	[global1+local1], local1  ! 1
2380*0a6a1f1dSLionel Sambuc	xor	out5, local5, out5            ! 6 finished local5 used
2381*0a6a1f1dSLionel Sambuc
2382*0a6a1f1dSLionel Sambuc	ld	[global3+local2], local2  ! 3
2383*0a6a1f1dSLionel Sambuc	xor	out5, local0, out5            ! 8 finished
2384*0a6a1f1dSLionel Sambuc	add	in3, 1*16, in3             ! enc add 8, dec add -8 to key pointer
2385*0a6a1f1dSLionel Sambuc
2386*0a6a1f1dSLionel Sambuc	ld	[out2+284], local5        ! 0x0000FC00
2387*0a6a1f1dSLionel Sambuc	xor	out5, out0, local4          ! sbox 1 next round
2388*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5            ! 1 finished
2389*0a6a1f1dSLionel Sambuc
2390*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5            ! 3 finished
2391*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
2392*0a6a1f1dSLionel Sambuc	bne,pt	%icc, .ncbc.enc.1
2393*0a6a1f1dSLionel Sambuc#else
2394*0a6a1f1dSLionel Sambuc	bne	.ncbc.enc.1
2395*0a6a1f1dSLionel Sambuc#endif
2396*0a6a1f1dSLionel Sambuc	and	local4, 252, local1       ! sbox 1 next round
2397*0a6a1f1dSLionel Sambuc
2398*0a6a1f1dSLionel Sambuc! two rounds more:
2399*0a6a1f1dSLionel Sambuc
2400*0a6a1f1dSLionel Sambuc	ld	[global1+local1], local1
2401*0a6a1f1dSLionel Sambuc	xor	out5, out1, out1
2402*0a6a1f1dSLionel Sambuc	xor	out5, out0, out0
2403*0a6a1f1dSLionel Sambuc
2404*0a6a1f1dSLionel Sambuc	srl	out1, 4, local0           ! rotate
2405*0a6a1f1dSLionel Sambuc	and	out0, local5, local3
2406*0a6a1f1dSLionel Sambuc
2407*0a6a1f1dSLionel Sambuc	ld	[in3+1*8], local7         ! key 7531
2408*0a6a1f1dSLionel Sambuc	srl	local3, 8, local3
2409*0a6a1f1dSLionel Sambuc	and	local0, 252, local2
2410*0a6a1f1dSLionel Sambuc
2411*0a6a1f1dSLionel Sambuc	ld	[global3+local3],local3
2412*0a6a1f1dSLionel Sambuc	sll	out1, 28, out1            ! rotate
2413*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5            ! 1 finished, local1 now sbox 7
2414*0a6a1f1dSLionel Sambuc
2415*0a6a1f1dSLionel Sambuc	ld	[global2+local2], local2
2416*0a6a1f1dSLionel Sambuc	srl	out0, 24, local1
2417*0a6a1f1dSLionel Sambuc	or	out1, local0, out1        ! rotate
2418*0a6a1f1dSLionel Sambuc
2419*0a6a1f1dSLionel Sambuc	ldub	[out2+local1], local1
2420*0a6a1f1dSLionel Sambuc	srl	out1, 24, local0
2421*0a6a1f1dSLionel Sambuc	and	out1, local5, local4
2422*0a6a1f1dSLionel Sambuc
2423*0a6a1f1dSLionel Sambuc	ldub	[out2+local0], local0
2424*0a6a1f1dSLionel Sambuc	srl	local4, 8, local4
2425*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5            ! 2 finished local2 now sbox 6
2426*0a6a1f1dSLionel Sambuc
2427*0a6a1f1dSLionel Sambuc	ld	[global4+local4],local4
2428*0a6a1f1dSLionel Sambuc	srl	out1, 16, local2
2429*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5            ! 3 finished local3 now sbox 5
2430*0a6a1f1dSLionel Sambuc
2431*0a6a1f1dSLionel Sambuc	ld	[out3+local0],local0
2432*0a6a1f1dSLionel Sambuc	and	local2, 252, local2
2433*0a6a1f1dSLionel Sambuc	add	global1, 1536, local5     ! address sbox 7
2434*0a6a1f1dSLionel Sambuc
2435*0a6a1f1dSLionel Sambuc	ld	[local6+local2], local2
2436*0a6a1f1dSLionel Sambuc	srl	out0, 16, local3
2437*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5            ! 4 finished
2438*0a6a1f1dSLionel Sambuc
2439*0a6a1f1dSLionel Sambuc	ld	[local5+local1],local1
2440*0a6a1f1dSLionel Sambuc	and	local3, 252, local3
2441*0a6a1f1dSLionel Sambuc	xor	in5, local0, in5
2442*0a6a1f1dSLionel Sambuc
2443*0a6a1f1dSLionel Sambuc	ld	[global5+local3],local3
2444*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5            ! 6 finished
2445*0a6a1f1dSLionel Sambuc	cmp	in2, 8
2446*0a6a1f1dSLionel Sambuc
2447*0a6a1f1dSLionel Sambuc	ld	[out2+280], out4  ! loop counter
2448*0a6a1f1dSLionel Sambuc	xor	in5, local7, local2        ! sbox 5 next round
2449*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5            ! 7 finished
2450*0a6a1f1dSLionel Sambuc
2451*0a6a1f1dSLionel Sambuc	ld	[in3+1*8+4], out0
2452*0a6a1f1dSLionel Sambuc	srl	local2, 16, local2        ! sbox 5 next round
2453*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5            ! 5 finished
2454*0a6a1f1dSLionel Sambuc
2455*0a6a1f1dSLionel Sambuc	and	local2, 252, local2
2456*0a6a1f1dSLionel Sambuc! next round (two rounds more)
2457*0a6a1f1dSLionel Sambuc	xor	in5, local7, local7        ! 7531
2458*0a6a1f1dSLionel Sambuc
2459*0a6a1f1dSLionel Sambuc	ld	[global5+local2], local2
2460*0a6a1f1dSLionel Sambuc	srl	local7, 24, local3
2461*0a6a1f1dSLionel Sambuc	xor	in5, out0, out0            ! 8642
2462*0a6a1f1dSLionel Sambuc
2463*0a6a1f1dSLionel Sambuc	ldub	[out2+local3], local3
2464*0a6a1f1dSLionel Sambuc	srl	out0, 4, local0           ! rotate
2465*0a6a1f1dSLionel Sambuc	and	local7, 252, local1
2466*0a6a1f1dSLionel Sambuc
2467*0a6a1f1dSLionel Sambuc	sll	out0, 28, out0            ! rotate
2468*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5            ! 5 finished local2 used
2469*0a6a1f1dSLionel Sambuc
2470*0a6a1f1dSLionel Sambuc	srl	local0, 8, local4
2471*0a6a1f1dSLionel Sambuc	and	local0, 252, local2
2472*0a6a1f1dSLionel Sambuc	ld	[local5+local3], local3
2473*0a6a1f1dSLionel Sambuc
2474*0a6a1f1dSLionel Sambuc	srl	local0, 16, local5
2475*0a6a1f1dSLionel Sambuc	or	out0, local0, out0        ! rotate
2476*0a6a1f1dSLionel Sambuc	ld	[global2+local2], local2
2477*0a6a1f1dSLionel Sambuc
2478*0a6a1f1dSLionel Sambuc	srl	out0, 24, local0
2479*0a6a1f1dSLionel Sambuc	ld	[in4], out0   ! key next encryption/decryption
2480*0a6a1f1dSLionel Sambuc	and	local4, 252, local4
2481*0a6a1f1dSLionel Sambuc
2482*0a6a1f1dSLionel Sambuc	and	local5, 252, local5
2483*0a6a1f1dSLionel Sambuc	ld	[global4+local4], local4
2484*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5            ! 7 finished local3 used
2485*0a6a1f1dSLionel Sambuc
2486*0a6a1f1dSLionel Sambuc	and	local0, 252, local0
2487*0a6a1f1dSLionel Sambuc	ld	[local6+local5], local5
2488*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5            ! 2 finished local2 now sbox 3
2489*0a6a1f1dSLionel Sambuc
2490*0a6a1f1dSLionel Sambuc	srl	local7, 8, local2         ! 3 start
2491*0a6a1f1dSLionel Sambuc	ld	[out3+local0], local0
2492*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5
2493*0a6a1f1dSLionel Sambuc
2494*0a6a1f1dSLionel Sambuc	and	local2, 252, local2
2495*0a6a1f1dSLionel Sambuc	ld	[global1+local1], local1
2496*0a6a1f1dSLionel Sambuc	xor	out5, local5, out5            ! 6 finished local5 used
2497*0a6a1f1dSLionel Sambuc
2498*0a6a1f1dSLionel Sambuc	ld	[global3+local2], local2
2499*0a6a1f1dSLionel Sambuc	srl	in5, 3, local3
2500*0a6a1f1dSLionel Sambuc	xor	out5, local0, out5
2501*0a6a1f1dSLionel Sambuc
2502*0a6a1f1dSLionel Sambuc	ld	[in4+4], out1 ! key next encryption/decryption
2503*0a6a1f1dSLionel Sambuc	sll	in5, 29, local4
2504*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5
2505*0a6a1f1dSLionel Sambuc
2506*0a6a1f1dSLionel Sambuc
2507*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
2508*0a6a1f1dSLionel Sambuc ! include encryption  ks in3
2509*0a6a1f1dSLionel Sambuc
2510*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
2511*0a6a1f1dSLionel Sambuc	bl,pn	%icc, .ncbc.enc.next.block_fp
2512*0a6a1f1dSLionel Sambuc#else
2513*0a6a1f1dSLionel Sambuc	bl	.ncbc.enc.next.block_fp
2514*0a6a1f1dSLionel Sambuc#endif
2515*0a6a1f1dSLionel Sambuc	add	in0, 8, in0               ! input address
2516*0a6a1f1dSLionel Sambuc
2517*0a6a1f1dSLionel Sambuc	! If 8 or more bytes are to be encrypted after this block,
2518*0a6a1f1dSLionel Sambuc	! we combine final permutation for this block with initial
2519*0a6a1f1dSLionel Sambuc	! permutation for next block. Load next block:
2520*0a6a1f1dSLionel Sambuc
2521*0a6a1f1dSLionel Sambuc
2522*0a6a1f1dSLionel Sambuc
2523*0a6a1f1dSLionel Sambuc! load_little_endian
2524*0a6a1f1dSLionel Sambuc! in0 global3 global4 local5 .LLE12
2525*0a6a1f1dSLionel Sambuc
2526*0a6a1f1dSLionel Sambuc	! first in memory to rightmost in register
2527*0a6a1f1dSLionel Sambuc
2528*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
2529*0a6a1f1dSLionel Sambuc	andcc	in0, 3, global0
2530*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .LLE12
2531*0a6a1f1dSLionel Sambuc	nop
2532*0a6a1f1dSLionel Sambuc
2533*0a6a1f1dSLionel Sambuc	lda	[in0] 0x88, global3
2534*0a6a1f1dSLionel Sambuc	add	in0, 4, local5
2535*0a6a1f1dSLionel Sambuc
2536*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .LLE12a
2537*0a6a1f1dSLionel Sambuc	lda	[local5] 0x88, global4
2538*0a6a1f1dSLionel Sambuc#endif
2539*0a6a1f1dSLionel Sambuc
2540*0a6a1f1dSLionel Sambuc.LLE12:
2541*0a6a1f1dSLionel Sambuc	ldub	[in0+3], global3
2542*0a6a1f1dSLionel Sambuc
2543*0a6a1f1dSLionel Sambuc	ldub	[in0+2], local5
2544*0a6a1f1dSLionel Sambuc	sll	global3, 8, global3
2545*0a6a1f1dSLionel Sambuc	or	global3, local5, global3
2546*0a6a1f1dSLionel Sambuc
2547*0a6a1f1dSLionel Sambuc	ldub	[in0+1], local5
2548*0a6a1f1dSLionel Sambuc	sll	global3, 8, global3
2549*0a6a1f1dSLionel Sambuc	or	global3, local5, global3
2550*0a6a1f1dSLionel Sambuc
2551*0a6a1f1dSLionel Sambuc	ldub	[in0+0], local5
2552*0a6a1f1dSLionel Sambuc	sll	global3, 8, global3
2553*0a6a1f1dSLionel Sambuc	or	global3, local5, global3
2554*0a6a1f1dSLionel Sambuc
2555*0a6a1f1dSLionel Sambuc
2556*0a6a1f1dSLionel Sambuc	ldub	[in0+3+4], global4
2557*0a6a1f1dSLionel Sambuc
2558*0a6a1f1dSLionel Sambuc	ldub	[in0+2+4], local5
2559*0a6a1f1dSLionel Sambuc	sll	global4, 8, global4
2560*0a6a1f1dSLionel Sambuc	or	global4, local5, global4
2561*0a6a1f1dSLionel Sambuc
2562*0a6a1f1dSLionel Sambuc	ldub	[in0+1+4], local5
2563*0a6a1f1dSLionel Sambuc	sll	global4, 8, global4
2564*0a6a1f1dSLionel Sambuc	or	global4, local5, global4
2565*0a6a1f1dSLionel Sambuc
2566*0a6a1f1dSLionel Sambuc	ldub	[in0+0+4], local5
2567*0a6a1f1dSLionel Sambuc	sll	global4, 8, global4
2568*0a6a1f1dSLionel Sambuc	or	global4, local5, global4
2569*0a6a1f1dSLionel Sambuc.LLE12a:
2570*0a6a1f1dSLionel Sambuc
2571*0a6a1f1dSLionel Sambuc
2572*0a6a1f1dSLionel Sambuc
2573*0a6a1f1dSLionel Sambuc	!  parameter 1   original left
2574*0a6a1f1dSLionel Sambuc	!  parameter 2   original right
2575*0a6a1f1dSLionel Sambuc	!  parameter 3   left ip
2576*0a6a1f1dSLionel Sambuc	!  parameter 4   right ip
2577*0a6a1f1dSLionel Sambuc	!  parameter 5   1: load ks1/ks2 to in3/in4, add 120 to in4
2578*0a6a1f1dSLionel Sambuc	!                2: mov in4 to in3
2579*0a6a1f1dSLionel Sambuc	!
2580*0a6a1f1dSLionel Sambuc	! also adds -8 to length in2 and loads loop counter to out4
2581*0a6a1f1dSLionel Sambuc
2582*0a6a1f1dSLionel Sambuc
2583*0a6a1f1dSLionel Sambuc
2584*0a6a1f1dSLionel Sambuc! fp_ip_macro
2585*0a6a1f1dSLionel Sambuc! out0 out1 global3 global4 2
2586*0a6a1f1dSLionel Sambuc
2587*0a6a1f1dSLionel Sambuc
2588*0a6a1f1dSLionel Sambuc
2589*0a6a1f1dSLionel Sambuc
2590*0a6a1f1dSLionel Sambuc
2591*0a6a1f1dSLionel Sambuc
2592*0a6a1f1dSLionel Sambuc
2593*0a6a1f1dSLionel Sambuc
2594*0a6a1f1dSLionel Sambuc
2595*0a6a1f1dSLionel Sambuc	! out0 in local3, local4
2596*0a6a1f1dSLionel Sambuc
2597*0a6a1f1dSLionel Sambuc	ld	[out2+256], local1
2598*0a6a1f1dSLionel Sambuc	sll	out5, 29, out4
2599*0a6a1f1dSLionel Sambuc	or	local3, local4, out0
2600*0a6a1f1dSLionel Sambuc
2601*0a6a1f1dSLionel Sambuc	srl	out5, 3, out1
2602*0a6a1f1dSLionel Sambuc	mov in4, in3
2603*0a6a1f1dSLionel Sambuc
2604*0a6a1f1dSLionel Sambuc	ld	[out2+272], local5
2605*0a6a1f1dSLionel Sambuc	srl	global4, 4, local0
2606*0a6a1f1dSLionel Sambuc	or	out1, out4, out1
2607*0a6a1f1dSLionel Sambuc
2608*0a6a1f1dSLionel Sambuc	srl	out1, 1, out4
2609*0a6a1f1dSLionel Sambuc	xor	out4, out0, out4
2610*0a6a1f1dSLionel Sambuc
2611*0a6a1f1dSLionel Sambuc	and	out4, local5, out4
2612*0a6a1f1dSLionel Sambuc	xor	local0, global3, local0
2613*0a6a1f1dSLionel Sambuc
2614*0a6a1f1dSLionel Sambuc	sll	out4, 1, local3
2615*0a6a1f1dSLionel Sambuc	xor	out0, out4, out0
2616*0a6a1f1dSLionel Sambuc
2617*0a6a1f1dSLionel Sambuc	and	local0, local1, local0
2618*0a6a1f1dSLionel Sambuc	add	in2, -8, in2
2619*0a6a1f1dSLionel Sambuc
2620*0a6a1f1dSLionel Sambuc	sll	local0, 4, local7
2621*0a6a1f1dSLionel Sambuc	xor	global3, local0, global3
2622*0a6a1f1dSLionel Sambuc
2623*0a6a1f1dSLionel Sambuc	ld	[out2+268], local4
2624*0a6a1f1dSLionel Sambuc	srl	out0, 8, out4
2625*0a6a1f1dSLionel Sambuc	xor	out1, local3, out1
2626*0a6a1f1dSLionel Sambuc	ld	[out2+260], local2
2627*0a6a1f1dSLionel Sambuc	srl	global3, 16, local0
2628*0a6a1f1dSLionel Sambuc	xor	global4, local7, global4
2629*0a6a1f1dSLionel Sambuc	xor	out4, out1, out4
2630*0a6a1f1dSLionel Sambuc	xor	local0, global4, local0
2631*0a6a1f1dSLionel Sambuc	and	out4, local4, out4
2632*0a6a1f1dSLionel Sambuc	and	local0, local2, local0
2633*0a6a1f1dSLionel Sambuc	sll	out4, 8, local3
2634*0a6a1f1dSLionel Sambuc	xor	out1, out4, out1
2635*0a6a1f1dSLionel Sambuc	sll	local0, 16, local7
2636*0a6a1f1dSLionel Sambuc	xor	global4, local0, global4
2637*0a6a1f1dSLionel Sambuc
2638*0a6a1f1dSLionel Sambuc	srl	out1, 2, out4
2639*0a6a1f1dSLionel Sambuc	xor	out0, local3, out0
2640*0a6a1f1dSLionel Sambuc
2641*0a6a1f1dSLionel Sambuc	ld	[out2+264], local3         ! ip3
2642*0a6a1f1dSLionel Sambuc	srl	global4, 2, local0
2643*0a6a1f1dSLionel Sambuc	xor	global3, local7, global3
2644*0a6a1f1dSLionel Sambuc	xor	out4, out0, out4
2645*0a6a1f1dSLionel Sambuc	xor	local0, global3, local0
2646*0a6a1f1dSLionel Sambuc	and	out4, local3, out4
2647*0a6a1f1dSLionel Sambuc	and	local0, local3, local0
2648*0a6a1f1dSLionel Sambuc	sll	out4, 2, local3
2649*0a6a1f1dSLionel Sambuc	xor	out0, out4, out0
2650*0a6a1f1dSLionel Sambuc	sll	local0, 2, local7
2651*0a6a1f1dSLionel Sambuc	xor	global3, local0, global3
2652*0a6a1f1dSLionel Sambuc
2653*0a6a1f1dSLionel Sambuc	srl	out0, 16, out4
2654*0a6a1f1dSLionel Sambuc	xor	out1, local3, out1
2655*0a6a1f1dSLionel Sambuc	srl	global3, 8, local0
2656*0a6a1f1dSLionel Sambuc	xor	global4, local7, global4
2657*0a6a1f1dSLionel Sambuc	xor	out4, out1, out4
2658*0a6a1f1dSLionel Sambuc	xor	local0, global4, local0
2659*0a6a1f1dSLionel Sambuc	and	out4, local2, out4
2660*0a6a1f1dSLionel Sambuc	and	local0, local4, local0
2661*0a6a1f1dSLionel Sambuc	sll	out4, 16, local3
2662*0a6a1f1dSLionel Sambuc	xor	out1, out4, local4
2663*0a6a1f1dSLionel Sambuc	sll	local0, 8, local7
2664*0a6a1f1dSLionel Sambuc	xor	global4, local0, global4
2665*0a6a1f1dSLionel Sambuc
2666*0a6a1f1dSLionel Sambuc	srl	global4, 1, local0
2667*0a6a1f1dSLionel Sambuc	xor	global3, local7, global3
2668*0a6a1f1dSLionel Sambuc
2669*0a6a1f1dSLionel Sambuc	srl	local4, 4, out4
2670*0a6a1f1dSLionel Sambuc	xor	local0, global3, local0
2671*0a6a1f1dSLionel Sambuc
2672*0a6a1f1dSLionel Sambuc	xor	out0, local3, out0
2673*0a6a1f1dSLionel Sambuc	and	local0, local5, local0
2674*0a6a1f1dSLionel Sambuc
2675*0a6a1f1dSLionel Sambuc	sll	local0, 1, local7
2676*0a6a1f1dSLionel Sambuc	xor	out4, out0, out4
2677*0a6a1f1dSLionel Sambuc
2678*0a6a1f1dSLionel Sambuc	xor	global3, local0, global3
2679*0a6a1f1dSLionel Sambuc	xor	global4, local7, global4
2680*0a6a1f1dSLionel Sambuc
2681*0a6a1f1dSLionel Sambuc	sll	global3, 3, local5
2682*0a6a1f1dSLionel Sambuc	and	out4, local1, out4
2683*0a6a1f1dSLionel Sambuc
2684*0a6a1f1dSLionel Sambuc	sll	out4, 4, local3
2685*0a6a1f1dSLionel Sambuc	xor	out0, out4, out0
2686*0a6a1f1dSLionel Sambuc
2687*0a6a1f1dSLionel Sambuc
2688*0a6a1f1dSLionel Sambuc	sll	global4, 3, local2
2689*0a6a1f1dSLionel Sambuc	xor	local4, local3, out1
2690*0a6a1f1dSLionel Sambuc
2691*0a6a1f1dSLionel Sambuc	! reload since used as temporar:
2692*0a6a1f1dSLionel Sambuc
2693*0a6a1f1dSLionel Sambuc	ld	[out2+280], out4          ! loop counter
2694*0a6a1f1dSLionel Sambuc
2695*0a6a1f1dSLionel Sambuc	srl	global3, 29, local0
2696*0a6a1f1dSLionel Sambuc
2697*0a6a1f1dSLionel Sambuc
2698*0a6a1f1dSLionel Sambuc
2699*0a6a1f1dSLionel Sambuc	srl	global4, 29, local7
2700*0a6a1f1dSLionel Sambuc
2701*0a6a1f1dSLionel Sambuc	or	local0, local5, global4
2702*0a6a1f1dSLionel Sambuc	or	local2, local7, global3
2703*0a6a1f1dSLionel Sambuc
2704*0a6a1f1dSLionel Sambuc
2705*0a6a1f1dSLionel Sambuc
2706*0a6a1f1dSLionel Sambuc
2707*0a6a1f1dSLionel Sambuc
2708*0a6a1f1dSLionel Sambuc! store_little_endian
2709*0a6a1f1dSLionel Sambuc! in1 out0 out1 local3 .SLE10
2710*0a6a1f1dSLionel Sambuc
2711*0a6a1f1dSLionel Sambuc	! rightmost in register to first in memory
2712*0a6a1f1dSLionel Sambuc
2713*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
2714*0a6a1f1dSLionel Sambuc	andcc	in1, 3, global0
2715*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .SLE10
2716*0a6a1f1dSLionel Sambuc	nop
2717*0a6a1f1dSLionel Sambuc
2718*0a6a1f1dSLionel Sambuc	sta	out0, [in1] 0x88
2719*0a6a1f1dSLionel Sambuc	add	in1, 4, local3
2720*0a6a1f1dSLionel Sambuc
2721*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .SLE10a
2722*0a6a1f1dSLionel Sambuc	sta	out1, [local3] 0x88
2723*0a6a1f1dSLionel Sambuc#endif
2724*0a6a1f1dSLionel Sambuc
2725*0a6a1f1dSLionel Sambuc.SLE10:
2726*0a6a1f1dSLionel Sambuc	and	out0, 255, local3
2727*0a6a1f1dSLionel Sambuc	stub	local3, [in1+0]
2728*0a6a1f1dSLionel Sambuc
2729*0a6a1f1dSLionel Sambuc	srl	out0, 8, local3
2730*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
2731*0a6a1f1dSLionel Sambuc	stub	local3, [in1+1]
2732*0a6a1f1dSLionel Sambuc
2733*0a6a1f1dSLionel Sambuc	srl	out0, 16, local3
2734*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
2735*0a6a1f1dSLionel Sambuc	stub	local3, [in1+2]
2736*0a6a1f1dSLionel Sambuc
2737*0a6a1f1dSLionel Sambuc	srl	out0, 24, local3
2738*0a6a1f1dSLionel Sambuc	stub	local3, [in1+3]
2739*0a6a1f1dSLionel Sambuc
2740*0a6a1f1dSLionel Sambuc
2741*0a6a1f1dSLionel Sambuc	and	out1, 255, local3
2742*0a6a1f1dSLionel Sambuc	stub	local3, [in1+0+4]
2743*0a6a1f1dSLionel Sambuc
2744*0a6a1f1dSLionel Sambuc	srl	out1, 8, local3
2745*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
2746*0a6a1f1dSLionel Sambuc	stub	local3, [in1+1+4]
2747*0a6a1f1dSLionel Sambuc
2748*0a6a1f1dSLionel Sambuc	srl	out1, 16, local3
2749*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
2750*0a6a1f1dSLionel Sambuc	stub	local3, [in1+2+4]
2751*0a6a1f1dSLionel Sambuc
2752*0a6a1f1dSLionel Sambuc	srl	out1, 24, local3
2753*0a6a1f1dSLionel Sambuc	stub	local3, [in1+3+4]
2754*0a6a1f1dSLionel Sambuc
2755*0a6a1f1dSLionel Sambuc.SLE10a:
2756*0a6a1f1dSLionel Sambuc
2757*0a6a1f1dSLionel Sambuc  ! block
2758*0a6a1f1dSLionel Sambuc
2759*0a6a1f1dSLionel Sambuc	ld	[in3], out0               ! key 7531 first round next block
2760*0a6a1f1dSLionel Sambuc	mov 	in5, local1
2761*0a6a1f1dSLionel Sambuc	xor	global3, out5, in5        ! iv xor next block
2762*0a6a1f1dSLionel Sambuc
2763*0a6a1f1dSLionel Sambuc	ld	[in3+4], out1             ! key 8642
2764*0a6a1f1dSLionel Sambuc	add	global1, 512, global3     ! address sbox 3 since register used
2765*0a6a1f1dSLionel Sambuc	xor	global4, local1, out5     ! iv xor next block
2766*0a6a1f1dSLionel Sambuc
2767*0a6a1f1dSLionel Sambuc	ba	.ncbc.enc.next.block_2
2768*0a6a1f1dSLionel Sambuc	add	in1, 8, in1               ! output adress
2769*0a6a1f1dSLionel Sambuc
2770*0a6a1f1dSLionel Sambuc.ncbc.enc.next.block_fp:
2771*0a6a1f1dSLionel Sambuc
2772*0a6a1f1dSLionel Sambuc
2773*0a6a1f1dSLionel Sambuc
2774*0a6a1f1dSLionel Sambuc! fp_macro
2775*0a6a1f1dSLionel Sambuc! in5 out5
2776*0a6a1f1dSLionel Sambuc
2777*0a6a1f1dSLionel Sambuc	! initially undo the rotate 3 left done after initial permutation
2778*0a6a1f1dSLionel Sambuc	! original left is received shifted 3 right and 29 left in local3/4
2779*0a6a1f1dSLionel Sambuc
2780*0a6a1f1dSLionel Sambuc	sll	out5, 29, local1
2781*0a6a1f1dSLionel Sambuc	or	local3, local4, in5
2782*0a6a1f1dSLionel Sambuc
2783*0a6a1f1dSLionel Sambuc	srl	out5, 3, out5
2784*0a6a1f1dSLionel Sambuc	sethi	%hi(0x55555555), local2
2785*0a6a1f1dSLionel Sambuc
2786*0a6a1f1dSLionel Sambuc	or	out5, local1, out5
2787*0a6a1f1dSLionel Sambuc	or	local2, %lo(0x55555555), local2
2788*0a6a1f1dSLionel Sambuc
2789*0a6a1f1dSLionel Sambuc	srl	out5, 1, local3
2790*0a6a1f1dSLionel Sambuc	sethi	%hi(0x00ff00ff), local1
2791*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
2792*0a6a1f1dSLionel Sambuc	or	local1, %lo(0x00ff00ff), local1
2793*0a6a1f1dSLionel Sambuc	and	local3, local2, local3
2794*0a6a1f1dSLionel Sambuc	sethi	%hi(0x33333333), local4
2795*0a6a1f1dSLionel Sambuc	sll	local3, 1, local2
2796*0a6a1f1dSLionel Sambuc
2797*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5
2798*0a6a1f1dSLionel Sambuc
2799*0a6a1f1dSLionel Sambuc	srl	in5, 8, local3
2800*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
2801*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
2802*0a6a1f1dSLionel Sambuc	or	local4, %lo(0x33333333), local4
2803*0a6a1f1dSLionel Sambuc	and	local3, local1, local3
2804*0a6a1f1dSLionel Sambuc	sethi	%hi(0x0000ffff), local1
2805*0a6a1f1dSLionel Sambuc	sll	local3, 8, local2
2806*0a6a1f1dSLionel Sambuc
2807*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5
2808*0a6a1f1dSLionel Sambuc
2809*0a6a1f1dSLionel Sambuc	srl	out5, 2, local3
2810*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5
2811*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
2812*0a6a1f1dSLionel Sambuc	or	local1, %lo(0x0000ffff), local1
2813*0a6a1f1dSLionel Sambuc	and	local3, local4, local3
2814*0a6a1f1dSLionel Sambuc	sethi	%hi(0x0f0f0f0f), local4
2815*0a6a1f1dSLionel Sambuc	sll	local3, 2, local2
2816*0a6a1f1dSLionel Sambuc
2817*0a6a1f1dSLionel Sambuc
2818*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5
2819*0a6a1f1dSLionel Sambuc
2820*0a6a1f1dSLionel Sambuc
2821*0a6a1f1dSLionel Sambuc	srl	in5, 16, local3
2822*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
2823*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
2824*0a6a1f1dSLionel Sambuc	or	local4, %lo(0x0f0f0f0f), local4
2825*0a6a1f1dSLionel Sambuc	and	local3, local1, local3
2826*0a6a1f1dSLionel Sambuc	sll	local3, 16, local2
2827*0a6a1f1dSLionel Sambuc
2828*0a6a1f1dSLionel Sambuc	xor	out5, local3, local1
2829*0a6a1f1dSLionel Sambuc
2830*0a6a1f1dSLionel Sambuc	srl	local1, 4, local3
2831*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5
2832*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
2833*0a6a1f1dSLionel Sambuc	and	local3, local4, local3
2834*0a6a1f1dSLionel Sambuc	sll	local3, 4, local2
2835*0a6a1f1dSLionel Sambuc
2836*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5
2837*0a6a1f1dSLionel Sambuc
2838*0a6a1f1dSLionel Sambuc	! optional store:
2839*0a6a1f1dSLionel Sambuc
2840*0a6a1f1dSLionel Sambuc
2841*0a6a1f1dSLionel Sambuc
2842*0a6a1f1dSLionel Sambuc	xor	local1, local2, out5
2843*0a6a1f1dSLionel Sambuc
2844*0a6a1f1dSLionel Sambuc
2845*0a6a1f1dSLionel Sambuc
2846*0a6a1f1dSLionel Sambuc
2847*0a6a1f1dSLionel Sambuc
2848*0a6a1f1dSLionel Sambuc
2849*0a6a1f1dSLionel Sambuc
2850*0a6a1f1dSLionel Sambuc! store_little_endian
2851*0a6a1f1dSLionel Sambuc! in1 in5 out5 local3 .SLE1
2852*0a6a1f1dSLionel Sambuc
2853*0a6a1f1dSLionel Sambuc	! rightmost in register to first in memory
2854*0a6a1f1dSLionel Sambuc
2855*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
2856*0a6a1f1dSLionel Sambuc	andcc	in1, 3, global0
2857*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .SLE1
2858*0a6a1f1dSLionel Sambuc	nop
2859*0a6a1f1dSLionel Sambuc
2860*0a6a1f1dSLionel Sambuc	sta	in5, [in1] 0x88
2861*0a6a1f1dSLionel Sambuc	add	in1, 4, local3
2862*0a6a1f1dSLionel Sambuc
2863*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .SLE1a
2864*0a6a1f1dSLionel Sambuc	sta	out5, [local3] 0x88
2865*0a6a1f1dSLionel Sambuc#endif
2866*0a6a1f1dSLionel Sambuc
2867*0a6a1f1dSLionel Sambuc.SLE1:
2868*0a6a1f1dSLionel Sambuc	and	in5, 255, local3
2869*0a6a1f1dSLionel Sambuc	stub	local3, [in1+0]
2870*0a6a1f1dSLionel Sambuc
2871*0a6a1f1dSLionel Sambuc	srl	in5, 8, local3
2872*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
2873*0a6a1f1dSLionel Sambuc	stub	local3, [in1+1]
2874*0a6a1f1dSLionel Sambuc
2875*0a6a1f1dSLionel Sambuc	srl	in5, 16, local3
2876*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
2877*0a6a1f1dSLionel Sambuc	stub	local3, [in1+2]
2878*0a6a1f1dSLionel Sambuc
2879*0a6a1f1dSLionel Sambuc	srl	in5, 24, local3
2880*0a6a1f1dSLionel Sambuc	stub	local3, [in1+3]
2881*0a6a1f1dSLionel Sambuc
2882*0a6a1f1dSLionel Sambuc
2883*0a6a1f1dSLionel Sambuc	and	out5, 255, local3
2884*0a6a1f1dSLionel Sambuc	stub	local3, [in1+0+4]
2885*0a6a1f1dSLionel Sambuc
2886*0a6a1f1dSLionel Sambuc	srl	out5, 8, local3
2887*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
2888*0a6a1f1dSLionel Sambuc	stub	local3, [in1+1+4]
2889*0a6a1f1dSLionel Sambuc
2890*0a6a1f1dSLionel Sambuc	srl	out5, 16, local3
2891*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
2892*0a6a1f1dSLionel Sambuc	stub	local3, [in1+2+4]
2893*0a6a1f1dSLionel Sambuc
2894*0a6a1f1dSLionel Sambuc	srl	out5, 24, local3
2895*0a6a1f1dSLionel Sambuc	stub	local3, [in1+3+4]
2896*0a6a1f1dSLionel Sambuc
2897*0a6a1f1dSLionel Sambuc.SLE1a:
2898*0a6a1f1dSLionel Sambuc
2899*0a6a1f1dSLionel Sambuc  ! block
2900*0a6a1f1dSLionel Sambuc
2901*0a6a1f1dSLionel Sambuc	addcc   in2, -8, in2              ! bytes missing when next block done
2902*0a6a1f1dSLionel Sambuc
2903*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
2904*0a6a1f1dSLionel Sambuc	bpos,pt	%icc, .ncbc.enc.next.block  ! also jumps if 0
2905*0a6a1f1dSLionel Sambuc#else
2906*0a6a1f1dSLionel Sambuc	bpos	.ncbc.enc.next.block
2907*0a6a1f1dSLionel Sambuc#endif
2908*0a6a1f1dSLionel Sambuc	add	in1, 8, in1
2909*0a6a1f1dSLionel Sambuc
2910*0a6a1f1dSLionel Sambuc.ncbc.enc.seven.or.less:
2911*0a6a1f1dSLionel Sambuc
2912*0a6a1f1dSLionel Sambuc	cmp	in2, -8
2913*0a6a1f1dSLionel Sambuc
2914*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
2915*0a6a1f1dSLionel Sambuc	ble,pt	%icc, .ncbc.enc.finish
2916*0a6a1f1dSLionel Sambuc#else
2917*0a6a1f1dSLionel Sambuc	ble	.ncbc.enc.finish
2918*0a6a1f1dSLionel Sambuc#endif
2919*0a6a1f1dSLionel Sambuc	nop
2920*0a6a1f1dSLionel Sambuc
2921*0a6a1f1dSLionel Sambuc	add	in2, 8, local1            ! bytes to load
2922*0a6a1f1dSLionel Sambuc
2923*0a6a1f1dSLionel Sambuc	! addr, length, dest left, dest right, temp, local3, label, ret label
2924*0a6a1f1dSLionel Sambuc
2925*0a6a1f1dSLionel Sambuc
2926*0a6a1f1dSLionel Sambuc! load_n_bytes
2927*0a6a1f1dSLionel Sambuc! in0 local1 local2 local3 .LNB1 .ncbc.enc.next.block_1 .LNB1 .ncbc.enc.next.block_1
2928*0a6a1f1dSLionel Sambuc
2929*0a6a1f1dSLionel Sambuc.LNB1.0:	call	.+8
2930*0a6a1f1dSLionel Sambuc	sll	local1, 2, local3
2931*0a6a1f1dSLionel Sambuc
2932*0a6a1f1dSLionel Sambuc	add	%o7,.LNB1.jmp.table-.LNB1.0,local2
2933*0a6a1f1dSLionel Sambuc
2934*0a6a1f1dSLionel Sambuc	add	local2, local3, local2
2935*0a6a1f1dSLionel Sambuc	mov	0, out4
2936*0a6a1f1dSLionel Sambuc
2937*0a6a1f1dSLionel Sambuc	ld	[local2], local2
2938*0a6a1f1dSLionel Sambuc
2939*0a6a1f1dSLionel Sambuc	jmp	%o7+local2
2940*0a6a1f1dSLionel Sambuc	mov	0, global4
2941*0a6a1f1dSLionel Sambuc
2942*0a6a1f1dSLionel Sambuc.LNB1.7:
2943*0a6a1f1dSLionel Sambuc	ldub	[in0+6], local2
2944*0a6a1f1dSLionel Sambuc	sll	local2, 16, local2
2945*0a6a1f1dSLionel Sambuc	or	global4, local2, global4
2946*0a6a1f1dSLionel Sambuc.LNB1.6:
2947*0a6a1f1dSLionel Sambuc	ldub	[in0+5], local2
2948*0a6a1f1dSLionel Sambuc	sll	local2, 8, local2
2949*0a6a1f1dSLionel Sambuc	or	global4, local2, global4
2950*0a6a1f1dSLionel Sambuc.LNB1.5:
2951*0a6a1f1dSLionel Sambuc	ldub	[in0+4], local2
2952*0a6a1f1dSLionel Sambuc	or	global4, local2, global4
2953*0a6a1f1dSLionel Sambuc.LNB1.4:
2954*0a6a1f1dSLionel Sambuc	ldub	[in0+3], local2
2955*0a6a1f1dSLionel Sambuc	sll	local2, 24, local2
2956*0a6a1f1dSLionel Sambuc	or	out4, local2, out4
2957*0a6a1f1dSLionel Sambuc.LNB1.3:
2958*0a6a1f1dSLionel Sambuc	ldub	[in0+2], local2
2959*0a6a1f1dSLionel Sambuc	sll	local2, 16, local2
2960*0a6a1f1dSLionel Sambuc	or	out4, local2, out4
2961*0a6a1f1dSLionel Sambuc.LNB1.2:
2962*0a6a1f1dSLionel Sambuc	ldub	[in0+1], local2
2963*0a6a1f1dSLionel Sambuc	sll	local2, 8, local2
2964*0a6a1f1dSLionel Sambuc	or	out4, local2, out4
2965*0a6a1f1dSLionel Sambuc.LNB1.1:
2966*0a6a1f1dSLionel Sambuc	ldub	[in0+0], local2
2967*0a6a1f1dSLionel Sambuc	ba	.ncbc.enc.next.block_1
2968*0a6a1f1dSLionel Sambuc	or	out4, local2, out4
2969*0a6a1f1dSLionel Sambuc
2970*0a6a1f1dSLionel Sambuc	.align 4
2971*0a6a1f1dSLionel Sambuc
2972*0a6a1f1dSLionel Sambuc.LNB1.jmp.table:
2973*0a6a1f1dSLionel Sambuc	.word	0
2974*0a6a1f1dSLionel Sambuc	.word	.LNB1.1-.LNB1.0
2975*0a6a1f1dSLionel Sambuc	.word	.LNB1.2-.LNB1.0
2976*0a6a1f1dSLionel Sambuc	.word	.LNB1.3-.LNB1.0
2977*0a6a1f1dSLionel Sambuc	.word	.LNB1.4-.LNB1.0
2978*0a6a1f1dSLionel Sambuc	.word	.LNB1.5-.LNB1.0
2979*0a6a1f1dSLionel Sambuc	.word	.LNB1.6-.LNB1.0
2980*0a6a1f1dSLionel Sambuc	.word	.LNB1.7-.LNB1.0
2981*0a6a1f1dSLionel Sambuc
2982*0a6a1f1dSLionel Sambuc
2983*0a6a1f1dSLionel Sambuc	! Loads 1 to 7 bytes little endian to global4, out4
2984*0a6a1f1dSLionel Sambuc
2985*0a6a1f1dSLionel Sambuc
2986*0a6a1f1dSLionel Sambuc.ncbc.enc.finish:
2987*0a6a1f1dSLionel Sambuc
2988*0a6a1f1dSLionel Sambuc	LDPTR	 [%sp+BIAS+ARG0+4*ARGSZ] , local4
2989*0a6a1f1dSLionel Sambuc
2990*0a6a1f1dSLionel Sambuc
2991*0a6a1f1dSLionel Sambuc! store_little_endian
2992*0a6a1f1dSLionel Sambuc! local4 in5 out5 local5 .SLE2
2993*0a6a1f1dSLionel Sambuc
2994*0a6a1f1dSLionel Sambuc	! rightmost in register to first in memory
2995*0a6a1f1dSLionel Sambuc
2996*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
2997*0a6a1f1dSLionel Sambuc	andcc	local4, 3, global0
2998*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .SLE2
2999*0a6a1f1dSLionel Sambuc	nop
3000*0a6a1f1dSLionel Sambuc
3001*0a6a1f1dSLionel Sambuc	sta	in5, [local4] 0x88
3002*0a6a1f1dSLionel Sambuc	add	local4, 4, local5
3003*0a6a1f1dSLionel Sambuc
3004*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .SLE2a
3005*0a6a1f1dSLionel Sambuc	sta	out5, [local5] 0x88
3006*0a6a1f1dSLionel Sambuc#endif
3007*0a6a1f1dSLionel Sambuc
3008*0a6a1f1dSLionel Sambuc.SLE2:
3009*0a6a1f1dSLionel Sambuc	and	in5, 255, local5
3010*0a6a1f1dSLionel Sambuc	stub	local5, [local4+0]
3011*0a6a1f1dSLionel Sambuc
3012*0a6a1f1dSLionel Sambuc	srl	in5, 8, local5
3013*0a6a1f1dSLionel Sambuc	and	local5, 255, local5
3014*0a6a1f1dSLionel Sambuc	stub	local5, [local4+1]
3015*0a6a1f1dSLionel Sambuc
3016*0a6a1f1dSLionel Sambuc	srl	in5, 16, local5
3017*0a6a1f1dSLionel Sambuc	and	local5, 255, local5
3018*0a6a1f1dSLionel Sambuc	stub	local5, [local4+2]
3019*0a6a1f1dSLionel Sambuc
3020*0a6a1f1dSLionel Sambuc	srl	in5, 24, local5
3021*0a6a1f1dSLionel Sambuc	stub	local5, [local4+3]
3022*0a6a1f1dSLionel Sambuc
3023*0a6a1f1dSLionel Sambuc
3024*0a6a1f1dSLionel Sambuc	and	out5, 255, local5
3025*0a6a1f1dSLionel Sambuc	stub	local5, [local4+0+4]
3026*0a6a1f1dSLionel Sambuc
3027*0a6a1f1dSLionel Sambuc	srl	out5, 8, local5
3028*0a6a1f1dSLionel Sambuc	and	local5, 255, local5
3029*0a6a1f1dSLionel Sambuc	stub	local5, [local4+1+4]
3030*0a6a1f1dSLionel Sambuc
3031*0a6a1f1dSLionel Sambuc	srl	out5, 16, local5
3032*0a6a1f1dSLionel Sambuc	and	local5, 255, local5
3033*0a6a1f1dSLionel Sambuc	stub	local5, [local4+2+4]
3034*0a6a1f1dSLionel Sambuc
3035*0a6a1f1dSLionel Sambuc	srl	out5, 24, local5
3036*0a6a1f1dSLionel Sambuc	stub	local5, [local4+3+4]
3037*0a6a1f1dSLionel Sambuc
3038*0a6a1f1dSLionel Sambuc.SLE2a:
3039*0a6a1f1dSLionel Sambuc
3040*0a6a1f1dSLionel Sambuc  ! ivec
3041*0a6a1f1dSLionel Sambuc
3042*0a6a1f1dSLionel Sambuc	ret
3043*0a6a1f1dSLionel Sambuc	restore
3044*0a6a1f1dSLionel Sambuc
3045*0a6a1f1dSLionel Sambuc
3046*0a6a1f1dSLionel Sambuc.ncbc.dec:
3047*0a6a1f1dSLionel Sambuc
3048*0a6a1f1dSLionel Sambuc	STPTR	in0,  [%sp+BIAS+ARG0+0*ARGSZ]
3049*0a6a1f1dSLionel Sambuc	cmp	in2, 0                    ! length
3050*0a6a1f1dSLionel Sambuc	add	in3, 120, in3
3051*0a6a1f1dSLionel Sambuc
3052*0a6a1f1dSLionel Sambuc	LDPTR	 [%sp+BIAS+ARG0+4*ARGSZ] , local7              ! ivec
3053*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
3054*0a6a1f1dSLionel Sambuc	ble,pn	%icc, .ncbc.dec.finish
3055*0a6a1f1dSLionel Sambuc#else
3056*0a6a1f1dSLionel Sambuc	ble	.ncbc.dec.finish
3057*0a6a1f1dSLionel Sambuc#endif
3058*0a6a1f1dSLionel Sambuc	mov	in3, in4                  ! schedule
3059*0a6a1f1dSLionel Sambuc
3060*0a6a1f1dSLionel Sambuc	STPTR	in1,  [%sp+BIAS+ARG0+1*ARGSZ]
3061*0a6a1f1dSLionel Sambuc	mov	in0, local5               ! input
3062*0a6a1f1dSLionel Sambuc
3063*0a6a1f1dSLionel Sambuc
3064*0a6a1f1dSLionel Sambuc
3065*0a6a1f1dSLionel Sambuc! load_little_endian
3066*0a6a1f1dSLionel Sambuc! local7 in0 in1 local3 .LLE3
3067*0a6a1f1dSLionel Sambuc
3068*0a6a1f1dSLionel Sambuc	! first in memory to rightmost in register
3069*0a6a1f1dSLionel Sambuc
3070*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
3071*0a6a1f1dSLionel Sambuc	andcc	local7, 3, global0
3072*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .LLE3
3073*0a6a1f1dSLionel Sambuc	nop
3074*0a6a1f1dSLionel Sambuc
3075*0a6a1f1dSLionel Sambuc	lda	[local7] 0x88, in0
3076*0a6a1f1dSLionel Sambuc	add	local7, 4, local3
3077*0a6a1f1dSLionel Sambuc
3078*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .LLE3a
3079*0a6a1f1dSLionel Sambuc	lda	[local3] 0x88, in1
3080*0a6a1f1dSLionel Sambuc#endif
3081*0a6a1f1dSLionel Sambuc
3082*0a6a1f1dSLionel Sambuc.LLE3:
3083*0a6a1f1dSLionel Sambuc	ldub	[local7+3], in0
3084*0a6a1f1dSLionel Sambuc
3085*0a6a1f1dSLionel Sambuc	ldub	[local7+2], local3
3086*0a6a1f1dSLionel Sambuc	sll	in0, 8, in0
3087*0a6a1f1dSLionel Sambuc	or	in0, local3, in0
3088*0a6a1f1dSLionel Sambuc
3089*0a6a1f1dSLionel Sambuc	ldub	[local7+1], local3
3090*0a6a1f1dSLionel Sambuc	sll	in0, 8, in0
3091*0a6a1f1dSLionel Sambuc	or	in0, local3, in0
3092*0a6a1f1dSLionel Sambuc
3093*0a6a1f1dSLionel Sambuc	ldub	[local7+0], local3
3094*0a6a1f1dSLionel Sambuc	sll	in0, 8, in0
3095*0a6a1f1dSLionel Sambuc	or	in0, local3, in0
3096*0a6a1f1dSLionel Sambuc
3097*0a6a1f1dSLionel Sambuc
3098*0a6a1f1dSLionel Sambuc	ldub	[local7+3+4], in1
3099*0a6a1f1dSLionel Sambuc
3100*0a6a1f1dSLionel Sambuc	ldub	[local7+2+4], local3
3101*0a6a1f1dSLionel Sambuc	sll	in1, 8, in1
3102*0a6a1f1dSLionel Sambuc	or	in1, local3, in1
3103*0a6a1f1dSLionel Sambuc
3104*0a6a1f1dSLionel Sambuc	ldub	[local7+1+4], local3
3105*0a6a1f1dSLionel Sambuc	sll	in1, 8, in1
3106*0a6a1f1dSLionel Sambuc	or	in1, local3, in1
3107*0a6a1f1dSLionel Sambuc
3108*0a6a1f1dSLionel Sambuc	ldub	[local7+0+4], local3
3109*0a6a1f1dSLionel Sambuc	sll	in1, 8, in1
3110*0a6a1f1dSLionel Sambuc	or	in1, local3, in1
3111*0a6a1f1dSLionel Sambuc.LLE3a:
3112*0a6a1f1dSLionel Sambuc
3113*0a6a1f1dSLionel Sambuc   ! ivec
3114*0a6a1f1dSLionel Sambuc
3115*0a6a1f1dSLionel Sambuc.ncbc.dec.next.block:
3116*0a6a1f1dSLionel Sambuc
3117*0a6a1f1dSLionel Sambuc
3118*0a6a1f1dSLionel Sambuc
3119*0a6a1f1dSLionel Sambuc! load_little_endian
3120*0a6a1f1dSLionel Sambuc! local5 in5 out5 local3 .LLE4
3121*0a6a1f1dSLionel Sambuc
3122*0a6a1f1dSLionel Sambuc	! first in memory to rightmost in register
3123*0a6a1f1dSLionel Sambuc
3124*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
3125*0a6a1f1dSLionel Sambuc	andcc	local5, 3, global0
3126*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .LLE4
3127*0a6a1f1dSLionel Sambuc	nop
3128*0a6a1f1dSLionel Sambuc
3129*0a6a1f1dSLionel Sambuc	lda	[local5] 0x88, in5
3130*0a6a1f1dSLionel Sambuc	add	local5, 4, local3
3131*0a6a1f1dSLionel Sambuc
3132*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .LLE4a
3133*0a6a1f1dSLionel Sambuc	lda	[local3] 0x88, out5
3134*0a6a1f1dSLionel Sambuc#endif
3135*0a6a1f1dSLionel Sambuc
3136*0a6a1f1dSLionel Sambuc.LLE4:
3137*0a6a1f1dSLionel Sambuc	ldub	[local5+3], in5
3138*0a6a1f1dSLionel Sambuc
3139*0a6a1f1dSLionel Sambuc	ldub	[local5+2], local3
3140*0a6a1f1dSLionel Sambuc	sll	in5, 8, in5
3141*0a6a1f1dSLionel Sambuc	or	in5, local3, in5
3142*0a6a1f1dSLionel Sambuc
3143*0a6a1f1dSLionel Sambuc	ldub	[local5+1], local3
3144*0a6a1f1dSLionel Sambuc	sll	in5, 8, in5
3145*0a6a1f1dSLionel Sambuc	or	in5, local3, in5
3146*0a6a1f1dSLionel Sambuc
3147*0a6a1f1dSLionel Sambuc	ldub	[local5+0], local3
3148*0a6a1f1dSLionel Sambuc	sll	in5, 8, in5
3149*0a6a1f1dSLionel Sambuc	or	in5, local3, in5
3150*0a6a1f1dSLionel Sambuc
3151*0a6a1f1dSLionel Sambuc
3152*0a6a1f1dSLionel Sambuc	ldub	[local5+3+4], out5
3153*0a6a1f1dSLionel Sambuc
3154*0a6a1f1dSLionel Sambuc	ldub	[local5+2+4], local3
3155*0a6a1f1dSLionel Sambuc	sll	out5, 8, out5
3156*0a6a1f1dSLionel Sambuc	or	out5, local3, out5
3157*0a6a1f1dSLionel Sambuc
3158*0a6a1f1dSLionel Sambuc	ldub	[local5+1+4], local3
3159*0a6a1f1dSLionel Sambuc	sll	out5, 8, out5
3160*0a6a1f1dSLionel Sambuc	or	out5, local3, out5
3161*0a6a1f1dSLionel Sambuc
3162*0a6a1f1dSLionel Sambuc	ldub	[local5+0+4], local3
3163*0a6a1f1dSLionel Sambuc	sll	out5, 8, out5
3164*0a6a1f1dSLionel Sambuc	or	out5, local3, out5
3165*0a6a1f1dSLionel Sambuc.LLE4a:
3166*0a6a1f1dSLionel Sambuc
3167*0a6a1f1dSLionel Sambuc  ! block
3168*0a6a1f1dSLionel Sambuc
3169*0a6a1f1dSLionel Sambuc	! parameter 6  1/2 for include encryption/decryption
3170*0a6a1f1dSLionel Sambuc	! parameter 7  1 for mov in1 to in3
3171*0a6a1f1dSLionel Sambuc	! parameter 8  1 for mov in3 to in4
3172*0a6a1f1dSLionel Sambuc
3173*0a6a1f1dSLionel Sambuc
3174*0a6a1f1dSLionel Sambuc
3175*0a6a1f1dSLionel Sambuc! ip_macro
3176*0a6a1f1dSLionel Sambuc! in5 out5 in5 out5 in4 2 0 1
3177*0a6a1f1dSLionel Sambuc
3178*0a6a1f1dSLionel Sambuc	ld	[out2+256], local1
3179*0a6a1f1dSLionel Sambuc	srl	out5, 4, local4
3180*0a6a1f1dSLionel Sambuc
3181*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
3182*0a6a1f1dSLionel Sambuc	nop
3183*0a6a1f1dSLionel Sambuc
3184*0a6a1f1dSLionel Sambuc	ld	[out2+260], local2
3185*0a6a1f1dSLionel Sambuc	and	local4, local1, local4
3186*0a6a1f1dSLionel Sambuc	mov in3, in4
3187*0a6a1f1dSLionel Sambuc
3188*0a6a1f1dSLionel Sambuc
3189*0a6a1f1dSLionel Sambuc	ld	[out2+280], out4          ! loop counter
3190*0a6a1f1dSLionel Sambuc	sll	local4, 4, local1
3191*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
3192*0a6a1f1dSLionel Sambuc
3193*0a6a1f1dSLionel Sambuc	ld	[out2+264], local3
3194*0a6a1f1dSLionel Sambuc	srl	in5, 16, local4
3195*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5
3196*0a6a1f1dSLionel Sambuc
3197*0a6a1f1dSLionel Sambuc
3198*0a6a1f1dSLionel Sambuc	xor	local4, out5, local4
3199*0a6a1f1dSLionel Sambuc	nop	!sethi	%hi(DES_SPtrans), global1 ! sbox addr
3200*0a6a1f1dSLionel Sambuc
3201*0a6a1f1dSLionel Sambuc
3202*0a6a1f1dSLionel Sambuc	and	local4, local2, local4
3203*0a6a1f1dSLionel Sambuc	nop	!or	global1, %lo(DES_SPtrans), global1   ! sbox addr
3204*0a6a1f1dSLionel Sambuc
3205*0a6a1f1dSLionel Sambuc	sll	local4, 16, local1
3206*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5
3207*0a6a1f1dSLionel Sambuc
3208*0a6a1f1dSLionel Sambuc	srl	out5, 2, local4
3209*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5
3210*0a6a1f1dSLionel Sambuc
3211*0a6a1f1dSLionel Sambuc	sethi	%hi(16711680), local5
3212*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
3213*0a6a1f1dSLionel Sambuc
3214*0a6a1f1dSLionel Sambuc	and	local4, local3, local4
3215*0a6a1f1dSLionel Sambuc	or	local5, 255, local5
3216*0a6a1f1dSLionel Sambuc
3217*0a6a1f1dSLionel Sambuc	sll	local4, 2, local2
3218*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
3219*0a6a1f1dSLionel Sambuc
3220*0a6a1f1dSLionel Sambuc	srl	in5, 8, local4
3221*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
3222*0a6a1f1dSLionel Sambuc
3223*0a6a1f1dSLionel Sambuc	xor	local4, out5, local4
3224*0a6a1f1dSLionel Sambuc	add	global1, 768, global4
3225*0a6a1f1dSLionel Sambuc
3226*0a6a1f1dSLionel Sambuc	and	local4, local5, local4
3227*0a6a1f1dSLionel Sambuc	add	global1, 1024, global5
3228*0a6a1f1dSLionel Sambuc
3229*0a6a1f1dSLionel Sambuc	ld	[out2+272], local7
3230*0a6a1f1dSLionel Sambuc	sll	local4, 8, local1
3231*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5
3232*0a6a1f1dSLionel Sambuc
3233*0a6a1f1dSLionel Sambuc	srl	out5, 1, local4
3234*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5
3235*0a6a1f1dSLionel Sambuc
3236*0a6a1f1dSLionel Sambuc	ld	[in4], out0                ! key 7531
3237*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
3238*0a6a1f1dSLionel Sambuc	add	global1, 256, global2
3239*0a6a1f1dSLionel Sambuc
3240*0a6a1f1dSLionel Sambuc	ld	[in4+4], out1              ! key 8642
3241*0a6a1f1dSLionel Sambuc	and	local4, local7, local4
3242*0a6a1f1dSLionel Sambuc	add	global1, 512, global3
3243*0a6a1f1dSLionel Sambuc
3244*0a6a1f1dSLionel Sambuc	sll	local4, 1, local1
3245*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
3246*0a6a1f1dSLionel Sambuc
3247*0a6a1f1dSLionel Sambuc	sll	in5, 3, local3
3248*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5
3249*0a6a1f1dSLionel Sambuc
3250*0a6a1f1dSLionel Sambuc	sll	out5, 3, local2
3251*0a6a1f1dSLionel Sambuc	add	global1, 1280, local6     ! address sbox 8
3252*0a6a1f1dSLionel Sambuc
3253*0a6a1f1dSLionel Sambuc	srl	in5, 29, local4
3254*0a6a1f1dSLionel Sambuc	add	global1, 1792, out3       ! address sbox 8
3255*0a6a1f1dSLionel Sambuc
3256*0a6a1f1dSLionel Sambuc	srl	out5, 29, local1
3257*0a6a1f1dSLionel Sambuc	or	local4, local3, in5
3258*0a6a1f1dSLionel Sambuc
3259*0a6a1f1dSLionel Sambuc	or	local2, local1, out5
3260*0a6a1f1dSLionel Sambuc
3261*0a6a1f1dSLionel Sambuc
3262*0a6a1f1dSLionel Sambuc
3263*0a6a1f1dSLionel Sambuc
3264*0a6a1f1dSLionel Sambuc
3265*0a6a1f1dSLionel Sambuc		ld	[out2+284], local5     ! 0x0000FC00 used in the rounds
3266*0a6a1f1dSLionel Sambuc		or	local2, local1, out5
3267*0a6a1f1dSLionel Sambuc		xor	in5, out0, local1
3268*0a6a1f1dSLionel Sambuc
3269*0a6a1f1dSLionel Sambuc		call .des_dec.1
3270*0a6a1f1dSLionel Sambuc		and	local1, 252, local1
3271*0a6a1f1dSLionel Sambuc
3272*0a6a1f1dSLionel Sambuc
3273*0a6a1f1dSLionel Sambuc ! include decryprion  ks in4
3274*0a6a1f1dSLionel Sambuc
3275*0a6a1f1dSLionel Sambuc
3276*0a6a1f1dSLionel Sambuc
3277*0a6a1f1dSLionel Sambuc! fp_macro
3278*0a6a1f1dSLionel Sambuc! out5 in5 0 1
3279*0a6a1f1dSLionel Sambuc
3280*0a6a1f1dSLionel Sambuc	! initially undo the rotate 3 left done after initial permutation
3281*0a6a1f1dSLionel Sambuc	! original left is received shifted 3 right and 29 left in local3/4
3282*0a6a1f1dSLionel Sambuc
3283*0a6a1f1dSLionel Sambuc	sll	in5, 29, local1
3284*0a6a1f1dSLionel Sambuc	or	local3, local4, out5
3285*0a6a1f1dSLionel Sambuc
3286*0a6a1f1dSLionel Sambuc	srl	in5, 3, in5
3287*0a6a1f1dSLionel Sambuc	sethi	%hi(0x55555555), local2
3288*0a6a1f1dSLionel Sambuc
3289*0a6a1f1dSLionel Sambuc	or	in5, local1, in5
3290*0a6a1f1dSLionel Sambuc	or	local2, %lo(0x55555555), local2
3291*0a6a1f1dSLionel Sambuc
3292*0a6a1f1dSLionel Sambuc	srl	in5, 1, local3
3293*0a6a1f1dSLionel Sambuc	sethi	%hi(0x00ff00ff), local1
3294*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
3295*0a6a1f1dSLionel Sambuc	or	local1, %lo(0x00ff00ff), local1
3296*0a6a1f1dSLionel Sambuc	and	local3, local2, local3
3297*0a6a1f1dSLionel Sambuc	sethi	%hi(0x33333333), local4
3298*0a6a1f1dSLionel Sambuc	sll	local3, 1, local2
3299*0a6a1f1dSLionel Sambuc
3300*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5
3301*0a6a1f1dSLionel Sambuc
3302*0a6a1f1dSLionel Sambuc	srl	out5, 8, local3
3303*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5
3304*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
3305*0a6a1f1dSLionel Sambuc	or	local4, %lo(0x33333333), local4
3306*0a6a1f1dSLionel Sambuc	and	local3, local1, local3
3307*0a6a1f1dSLionel Sambuc	sethi	%hi(0x0000ffff), local1
3308*0a6a1f1dSLionel Sambuc	sll	local3, 8, local2
3309*0a6a1f1dSLionel Sambuc
3310*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5
3311*0a6a1f1dSLionel Sambuc
3312*0a6a1f1dSLionel Sambuc	srl	in5, 2, local3
3313*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
3314*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
3315*0a6a1f1dSLionel Sambuc	or	local1, %lo(0x0000ffff), local1
3316*0a6a1f1dSLionel Sambuc	and	local3, local4, local3
3317*0a6a1f1dSLionel Sambuc	sethi	%hi(0x0f0f0f0f), local4
3318*0a6a1f1dSLionel Sambuc	sll	local3, 2, local2
3319*0a6a1f1dSLionel Sambuc
3320*0a6a1f1dSLionel Sambuc	LDPTR  [%sp+BIAS+ARG0+0*ARGSZ] , local5
3321*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5
3322*0a6a1f1dSLionel Sambuc
3323*0a6a1f1dSLionel Sambuc	LDPTR  [%sp+BIAS+ARG0+1*ARGSZ] , local7
3324*0a6a1f1dSLionel Sambuc	srl	out5, 16, local3
3325*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5
3326*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
3327*0a6a1f1dSLionel Sambuc	or	local4, %lo(0x0f0f0f0f), local4
3328*0a6a1f1dSLionel Sambuc	and	local3, local1, local3
3329*0a6a1f1dSLionel Sambuc	sll	local3, 16, local2
3330*0a6a1f1dSLionel Sambuc
3331*0a6a1f1dSLionel Sambuc	xor	in5, local3, local1
3332*0a6a1f1dSLionel Sambuc
3333*0a6a1f1dSLionel Sambuc	srl	local1, 4, local3
3334*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
3335*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
3336*0a6a1f1dSLionel Sambuc	and	local3, local4, local3
3337*0a6a1f1dSLionel Sambuc	sll	local3, 4, local2
3338*0a6a1f1dSLionel Sambuc
3339*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5
3340*0a6a1f1dSLionel Sambuc
3341*0a6a1f1dSLionel Sambuc	! optional store:
3342*0a6a1f1dSLionel Sambuc
3343*0a6a1f1dSLionel Sambuc
3344*0a6a1f1dSLionel Sambuc
3345*0a6a1f1dSLionel Sambuc	xor	local1, local2, in5
3346*0a6a1f1dSLionel Sambuc
3347*0a6a1f1dSLionel Sambuc
3348*0a6a1f1dSLionel Sambuc
3349*0a6a1f1dSLionel Sambuc ! 1 for input and output address to local5/7
3350*0a6a1f1dSLionel Sambuc
3351*0a6a1f1dSLionel Sambuc	! in2 is bytes left to be stored
3352*0a6a1f1dSLionel Sambuc	! in2 is compared to 8 in the rounds
3353*0a6a1f1dSLionel Sambuc
3354*0a6a1f1dSLionel Sambuc	xor	out5, in0, out4           ! iv xor
3355*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
3356*0a6a1f1dSLionel Sambuc	bl,pn	%icc, .ncbc.dec.seven.or.less
3357*0a6a1f1dSLionel Sambuc#else
3358*0a6a1f1dSLionel Sambuc	bl	.ncbc.dec.seven.or.less
3359*0a6a1f1dSLionel Sambuc#endif
3360*0a6a1f1dSLionel Sambuc	xor	in5, in1, global4         ! iv xor
3361*0a6a1f1dSLionel Sambuc
3362*0a6a1f1dSLionel Sambuc	! Load ivec next block now, since input and output address might be the same.
3363*0a6a1f1dSLionel Sambuc
3364*0a6a1f1dSLionel Sambuc
3365*0a6a1f1dSLionel Sambuc
3366*0a6a1f1dSLionel Sambuc! load_little_endian_inc
3367*0a6a1f1dSLionel Sambuc! local5 in0 in1 local3 .LLE5
3368*0a6a1f1dSLionel Sambuc
3369*0a6a1f1dSLionel Sambuc	! first in memory to rightmost in register
3370*0a6a1f1dSLionel Sambuc
3371*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
3372*0a6a1f1dSLionel Sambuc	andcc	local5, 3, global0
3373*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .LLE5
3374*0a6a1f1dSLionel Sambuc	nop
3375*0a6a1f1dSLionel Sambuc
3376*0a6a1f1dSLionel Sambuc	lda	[local5] 0x88, in0
3377*0a6a1f1dSLionel Sambuc	add	local5, 4, local5
3378*0a6a1f1dSLionel Sambuc
3379*0a6a1f1dSLionel Sambuc	lda	[local5] 0x88, in1
3380*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .LLE5a
3381*0a6a1f1dSLionel Sambuc	add	local5, 4, local5
3382*0a6a1f1dSLionel Sambuc#endif
3383*0a6a1f1dSLionel Sambuc
3384*0a6a1f1dSLionel Sambuc.LLE5:
3385*0a6a1f1dSLionel Sambuc	ldub	[local5+3], in0
3386*0a6a1f1dSLionel Sambuc
3387*0a6a1f1dSLionel Sambuc	ldub	[local5+2], local3
3388*0a6a1f1dSLionel Sambuc	sll	in0, 8, in0
3389*0a6a1f1dSLionel Sambuc	or	in0, local3, in0
3390*0a6a1f1dSLionel Sambuc
3391*0a6a1f1dSLionel Sambuc	ldub	[local5+1], local3
3392*0a6a1f1dSLionel Sambuc	sll	in0, 8, in0
3393*0a6a1f1dSLionel Sambuc	or	in0, local3, in0
3394*0a6a1f1dSLionel Sambuc
3395*0a6a1f1dSLionel Sambuc	ldub	[local5+0], local3
3396*0a6a1f1dSLionel Sambuc	sll	in0, 8, in0
3397*0a6a1f1dSLionel Sambuc	or	in0, local3, in0
3398*0a6a1f1dSLionel Sambuc
3399*0a6a1f1dSLionel Sambuc	ldub	[local5+3+4], in1
3400*0a6a1f1dSLionel Sambuc	add	local5, 8, local5
3401*0a6a1f1dSLionel Sambuc
3402*0a6a1f1dSLionel Sambuc	ldub	[local5+2+4-8], local3
3403*0a6a1f1dSLionel Sambuc	sll	in1, 8, in1
3404*0a6a1f1dSLionel Sambuc	or	in1, local3, in1
3405*0a6a1f1dSLionel Sambuc
3406*0a6a1f1dSLionel Sambuc	ldub	[local5+1+4-8], local3
3407*0a6a1f1dSLionel Sambuc	sll	in1, 8, in1
3408*0a6a1f1dSLionel Sambuc	or	in1, local3, in1
3409*0a6a1f1dSLionel Sambuc
3410*0a6a1f1dSLionel Sambuc	ldub	[local5+0+4-8], local3
3411*0a6a1f1dSLionel Sambuc	sll	in1, 8, in1
3412*0a6a1f1dSLionel Sambuc	or	in1, local3, in1
3413*0a6a1f1dSLionel Sambuc.LLE5a:
3414*0a6a1f1dSLionel Sambuc
3415*0a6a1f1dSLionel Sambuc  ! iv
3416*0a6a1f1dSLionel Sambuc
3417*0a6a1f1dSLionel Sambuc
3418*0a6a1f1dSLionel Sambuc
3419*0a6a1f1dSLionel Sambuc! store_little_endian
3420*0a6a1f1dSLionel Sambuc! local7 out4 global4 local3 .SLE3
3421*0a6a1f1dSLionel Sambuc
3422*0a6a1f1dSLionel Sambuc	! rightmost in register to first in memory
3423*0a6a1f1dSLionel Sambuc
3424*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
3425*0a6a1f1dSLionel Sambuc	andcc	local7, 3, global0
3426*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .SLE3
3427*0a6a1f1dSLionel Sambuc	nop
3428*0a6a1f1dSLionel Sambuc
3429*0a6a1f1dSLionel Sambuc	sta	out4, [local7] 0x88
3430*0a6a1f1dSLionel Sambuc	add	local7, 4, local3
3431*0a6a1f1dSLionel Sambuc
3432*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .SLE3a
3433*0a6a1f1dSLionel Sambuc	sta	global4, [local3] 0x88
3434*0a6a1f1dSLionel Sambuc#endif
3435*0a6a1f1dSLionel Sambuc
3436*0a6a1f1dSLionel Sambuc.SLE3:
3437*0a6a1f1dSLionel Sambuc	and	out4, 255, local3
3438*0a6a1f1dSLionel Sambuc	stub	local3, [local7+0]
3439*0a6a1f1dSLionel Sambuc
3440*0a6a1f1dSLionel Sambuc	srl	out4, 8, local3
3441*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
3442*0a6a1f1dSLionel Sambuc	stub	local3, [local7+1]
3443*0a6a1f1dSLionel Sambuc
3444*0a6a1f1dSLionel Sambuc	srl	out4, 16, local3
3445*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
3446*0a6a1f1dSLionel Sambuc	stub	local3, [local7+2]
3447*0a6a1f1dSLionel Sambuc
3448*0a6a1f1dSLionel Sambuc	srl	out4, 24, local3
3449*0a6a1f1dSLionel Sambuc	stub	local3, [local7+3]
3450*0a6a1f1dSLionel Sambuc
3451*0a6a1f1dSLionel Sambuc
3452*0a6a1f1dSLionel Sambuc	and	global4, 255, local3
3453*0a6a1f1dSLionel Sambuc	stub	local3, [local7+0+4]
3454*0a6a1f1dSLionel Sambuc
3455*0a6a1f1dSLionel Sambuc	srl	global4, 8, local3
3456*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
3457*0a6a1f1dSLionel Sambuc	stub	local3, [local7+1+4]
3458*0a6a1f1dSLionel Sambuc
3459*0a6a1f1dSLionel Sambuc	srl	global4, 16, local3
3460*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
3461*0a6a1f1dSLionel Sambuc	stub	local3, [local7+2+4]
3462*0a6a1f1dSLionel Sambuc
3463*0a6a1f1dSLionel Sambuc	srl	global4, 24, local3
3464*0a6a1f1dSLionel Sambuc	stub	local3, [local7+3+4]
3465*0a6a1f1dSLionel Sambuc
3466*0a6a1f1dSLionel Sambuc.SLE3a:
3467*0a6a1f1dSLionel Sambuc
3468*0a6a1f1dSLionel Sambuc
3469*0a6a1f1dSLionel Sambuc
3470*0a6a1f1dSLionel Sambuc	STPTR	local5,  [%sp+BIAS+ARG0+0*ARGSZ]
3471*0a6a1f1dSLionel Sambuc	add	local7, 8, local7
3472*0a6a1f1dSLionel Sambuc	addcc   in2, -8, in2
3473*0a6a1f1dSLionel Sambuc
3474*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
3475*0a6a1f1dSLionel Sambuc	bg,pt	%icc, .ncbc.dec.next.block
3476*0a6a1f1dSLionel Sambuc#else
3477*0a6a1f1dSLionel Sambuc	bg	.ncbc.dec.next.block
3478*0a6a1f1dSLionel Sambuc#endif
3479*0a6a1f1dSLionel Sambuc	STPTR	local7,  [%sp+BIAS+ARG0+1*ARGSZ]
3480*0a6a1f1dSLionel Sambuc
3481*0a6a1f1dSLionel Sambuc
3482*0a6a1f1dSLionel Sambuc.ncbc.dec.store.iv:
3483*0a6a1f1dSLionel Sambuc
3484*0a6a1f1dSLionel Sambuc	LDPTR	 [%sp+BIAS+ARG0+4*ARGSZ] , local4              ! ivec
3485*0a6a1f1dSLionel Sambuc
3486*0a6a1f1dSLionel Sambuc
3487*0a6a1f1dSLionel Sambuc! store_little_endian
3488*0a6a1f1dSLionel Sambuc! local4 in0 in1 local5 .SLE4
3489*0a6a1f1dSLionel Sambuc
3490*0a6a1f1dSLionel Sambuc	! rightmost in register to first in memory
3491*0a6a1f1dSLionel Sambuc
3492*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
3493*0a6a1f1dSLionel Sambuc	andcc	local4, 3, global0
3494*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .SLE4
3495*0a6a1f1dSLionel Sambuc	nop
3496*0a6a1f1dSLionel Sambuc
3497*0a6a1f1dSLionel Sambuc	sta	in0, [local4] 0x88
3498*0a6a1f1dSLionel Sambuc	add	local4, 4, local5
3499*0a6a1f1dSLionel Sambuc
3500*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .SLE4a
3501*0a6a1f1dSLionel Sambuc	sta	in1, [local5] 0x88
3502*0a6a1f1dSLionel Sambuc#endif
3503*0a6a1f1dSLionel Sambuc
3504*0a6a1f1dSLionel Sambuc.SLE4:
3505*0a6a1f1dSLionel Sambuc	and	in0, 255, local5
3506*0a6a1f1dSLionel Sambuc	stub	local5, [local4+0]
3507*0a6a1f1dSLionel Sambuc
3508*0a6a1f1dSLionel Sambuc	srl	in0, 8, local5
3509*0a6a1f1dSLionel Sambuc	and	local5, 255, local5
3510*0a6a1f1dSLionel Sambuc	stub	local5, [local4+1]
3511*0a6a1f1dSLionel Sambuc
3512*0a6a1f1dSLionel Sambuc	srl	in0, 16, local5
3513*0a6a1f1dSLionel Sambuc	and	local5, 255, local5
3514*0a6a1f1dSLionel Sambuc	stub	local5, [local4+2]
3515*0a6a1f1dSLionel Sambuc
3516*0a6a1f1dSLionel Sambuc	srl	in0, 24, local5
3517*0a6a1f1dSLionel Sambuc	stub	local5, [local4+3]
3518*0a6a1f1dSLionel Sambuc
3519*0a6a1f1dSLionel Sambuc
3520*0a6a1f1dSLionel Sambuc	and	in1, 255, local5
3521*0a6a1f1dSLionel Sambuc	stub	local5, [local4+0+4]
3522*0a6a1f1dSLionel Sambuc
3523*0a6a1f1dSLionel Sambuc	srl	in1, 8, local5
3524*0a6a1f1dSLionel Sambuc	and	local5, 255, local5
3525*0a6a1f1dSLionel Sambuc	stub	local5, [local4+1+4]
3526*0a6a1f1dSLionel Sambuc
3527*0a6a1f1dSLionel Sambuc	srl	in1, 16, local5
3528*0a6a1f1dSLionel Sambuc	and	local5, 255, local5
3529*0a6a1f1dSLionel Sambuc	stub	local5, [local4+2+4]
3530*0a6a1f1dSLionel Sambuc
3531*0a6a1f1dSLionel Sambuc	srl	in1, 24, local5
3532*0a6a1f1dSLionel Sambuc	stub	local5, [local4+3+4]
3533*0a6a1f1dSLionel Sambuc
3534*0a6a1f1dSLionel Sambuc.SLE4a:
3535*0a6a1f1dSLionel Sambuc
3536*0a6a1f1dSLionel Sambuc
3537*0a6a1f1dSLionel Sambuc
3538*0a6a1f1dSLionel Sambuc.ncbc.dec.finish:
3539*0a6a1f1dSLionel Sambuc
3540*0a6a1f1dSLionel Sambuc	ret
3541*0a6a1f1dSLionel Sambuc	restore
3542*0a6a1f1dSLionel Sambuc
3543*0a6a1f1dSLionel Sambuc.ncbc.dec.seven.or.less:
3544*0a6a1f1dSLionel Sambuc
3545*0a6a1f1dSLionel Sambuc
3546*0a6a1f1dSLionel Sambuc
3547*0a6a1f1dSLionel Sambuc! load_little_endian_inc
3548*0a6a1f1dSLionel Sambuc! local5 in0 in1 local3 .LLE13
3549*0a6a1f1dSLionel Sambuc
3550*0a6a1f1dSLionel Sambuc	! first in memory to rightmost in register
3551*0a6a1f1dSLionel Sambuc
3552*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
3553*0a6a1f1dSLionel Sambuc	andcc	local5, 3, global0
3554*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .LLE13
3555*0a6a1f1dSLionel Sambuc	nop
3556*0a6a1f1dSLionel Sambuc
3557*0a6a1f1dSLionel Sambuc	lda	[local5] 0x88, in0
3558*0a6a1f1dSLionel Sambuc	add	local5, 4, local5
3559*0a6a1f1dSLionel Sambuc
3560*0a6a1f1dSLionel Sambuc	lda	[local5] 0x88, in1
3561*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .LLE13a
3562*0a6a1f1dSLionel Sambuc	add	local5, 4, local5
3563*0a6a1f1dSLionel Sambuc#endif
3564*0a6a1f1dSLionel Sambuc
3565*0a6a1f1dSLionel Sambuc.LLE13:
3566*0a6a1f1dSLionel Sambuc	ldub	[local5+3], in0
3567*0a6a1f1dSLionel Sambuc
3568*0a6a1f1dSLionel Sambuc	ldub	[local5+2], local3
3569*0a6a1f1dSLionel Sambuc	sll	in0, 8, in0
3570*0a6a1f1dSLionel Sambuc	or	in0, local3, in0
3571*0a6a1f1dSLionel Sambuc
3572*0a6a1f1dSLionel Sambuc	ldub	[local5+1], local3
3573*0a6a1f1dSLionel Sambuc	sll	in0, 8, in0
3574*0a6a1f1dSLionel Sambuc	or	in0, local3, in0
3575*0a6a1f1dSLionel Sambuc
3576*0a6a1f1dSLionel Sambuc	ldub	[local5+0], local3
3577*0a6a1f1dSLionel Sambuc	sll	in0, 8, in0
3578*0a6a1f1dSLionel Sambuc	or	in0, local3, in0
3579*0a6a1f1dSLionel Sambuc
3580*0a6a1f1dSLionel Sambuc	ldub	[local5+3+4], in1
3581*0a6a1f1dSLionel Sambuc	add	local5, 8, local5
3582*0a6a1f1dSLionel Sambuc
3583*0a6a1f1dSLionel Sambuc	ldub	[local5+2+4-8], local3
3584*0a6a1f1dSLionel Sambuc	sll	in1, 8, in1
3585*0a6a1f1dSLionel Sambuc	or	in1, local3, in1
3586*0a6a1f1dSLionel Sambuc
3587*0a6a1f1dSLionel Sambuc	ldub	[local5+1+4-8], local3
3588*0a6a1f1dSLionel Sambuc	sll	in1, 8, in1
3589*0a6a1f1dSLionel Sambuc	or	in1, local3, in1
3590*0a6a1f1dSLionel Sambuc
3591*0a6a1f1dSLionel Sambuc	ldub	[local5+0+4-8], local3
3592*0a6a1f1dSLionel Sambuc	sll	in1, 8, in1
3593*0a6a1f1dSLionel Sambuc	or	in1, local3, in1
3594*0a6a1f1dSLionel Sambuc.LLE13a:
3595*0a6a1f1dSLionel Sambuc
3596*0a6a1f1dSLionel Sambuc     ! ivec
3597*0a6a1f1dSLionel Sambuc
3598*0a6a1f1dSLionel Sambuc
3599*0a6a1f1dSLionel Sambuc
3600*0a6a1f1dSLionel Sambuc! store_n_bytes
3601*0a6a1f1dSLionel Sambuc! local7 in2 local3 local4 .SNB1 .ncbc.dec.store.iv .SNB1 .ncbc.dec.store.iv
3602*0a6a1f1dSLionel Sambuc
3603*0a6a1f1dSLionel Sambuc.SNB1.0:	call	.+8
3604*0a6a1f1dSLionel Sambuc	sll	in2, 2, local4
3605*0a6a1f1dSLionel Sambuc
3606*0a6a1f1dSLionel Sambuc	add	%o7,.SNB1.jmp.table-.SNB1.0,local3
3607*0a6a1f1dSLionel Sambuc
3608*0a6a1f1dSLionel Sambuc	add	local3, local4, local3
3609*0a6a1f1dSLionel Sambuc
3610*0a6a1f1dSLionel Sambuc	ld	[local3], local3
3611*0a6a1f1dSLionel Sambuc
3612*0a6a1f1dSLionel Sambuc	jmp	%o7+local3
3613*0a6a1f1dSLionel Sambuc	nop
3614*0a6a1f1dSLionel Sambuc
3615*0a6a1f1dSLionel Sambuc.SNB1.7:
3616*0a6a1f1dSLionel Sambuc	srl	global4, 16, local3
3617*0a6a1f1dSLionel Sambuc	and	local3, 0xff, local3
3618*0a6a1f1dSLionel Sambuc	stub	local3, [local7+6]
3619*0a6a1f1dSLionel Sambuc.SNB1.6:
3620*0a6a1f1dSLionel Sambuc	srl	global4, 8, local3
3621*0a6a1f1dSLionel Sambuc	and	local3, 0xff, local3
3622*0a6a1f1dSLionel Sambuc	stub	local3, [local7+5]
3623*0a6a1f1dSLionel Sambuc.SNB1.5:
3624*0a6a1f1dSLionel Sambuc	and	global4, 0xff, local3
3625*0a6a1f1dSLionel Sambuc	stub	local3, [local7+4]
3626*0a6a1f1dSLionel Sambuc.SNB1.4:
3627*0a6a1f1dSLionel Sambuc	srl	out4, 24, local3
3628*0a6a1f1dSLionel Sambuc	stub	local3, [local7+3]
3629*0a6a1f1dSLionel Sambuc.SNB1.3:
3630*0a6a1f1dSLionel Sambuc	srl	out4, 16, local3
3631*0a6a1f1dSLionel Sambuc	and	local3, 0xff, local3
3632*0a6a1f1dSLionel Sambuc	stub	local3, [local7+2]
3633*0a6a1f1dSLionel Sambuc.SNB1.2:
3634*0a6a1f1dSLionel Sambuc	srl	out4, 8, local3
3635*0a6a1f1dSLionel Sambuc	and	local3, 0xff, local3
3636*0a6a1f1dSLionel Sambuc	stub	local3, [local7+1]
3637*0a6a1f1dSLionel Sambuc.SNB1.1:
3638*0a6a1f1dSLionel Sambuc	and	out4, 0xff, local3
3639*0a6a1f1dSLionel Sambuc
3640*0a6a1f1dSLionel Sambuc
3641*0a6a1f1dSLionel Sambuc	ba	.ncbc.dec.store.iv
3642*0a6a1f1dSLionel Sambuc	stub	local3, [local7]
3643*0a6a1f1dSLionel Sambuc
3644*0a6a1f1dSLionel Sambuc	.align 4
3645*0a6a1f1dSLionel Sambuc
3646*0a6a1f1dSLionel Sambuc.SNB1.jmp.table:
3647*0a6a1f1dSLionel Sambuc
3648*0a6a1f1dSLionel Sambuc	.word	0
3649*0a6a1f1dSLionel Sambuc	.word	.SNB1.1-.SNB1.0
3650*0a6a1f1dSLionel Sambuc	.word	.SNB1.2-.SNB1.0
3651*0a6a1f1dSLionel Sambuc	.word	.SNB1.3-.SNB1.0
3652*0a6a1f1dSLionel Sambuc	.word	.SNB1.4-.SNB1.0
3653*0a6a1f1dSLionel Sambuc	.word	.SNB1.5-.SNB1.0
3654*0a6a1f1dSLionel Sambuc	.word	.SNB1.6-.SNB1.0
3655*0a6a1f1dSLionel Sambuc	.word	.SNB1.7-.SNB1.0
3656*0a6a1f1dSLionel Sambuc
3657*0a6a1f1dSLionel Sambuc
3658*0a6a1f1dSLionel Sambuc
3659*0a6a1f1dSLionel Sambuc.DES_ncbc_encrypt.end:
3660*0a6a1f1dSLionel Sambuc	.size	 DES_ncbc_encrypt, .DES_ncbc_encrypt.end-DES_ncbc_encrypt
3661*0a6a1f1dSLionel Sambuc
3662*0a6a1f1dSLionel Sambuc
3663*0a6a1f1dSLionel Sambuc! void DES_ede3_cbc_encrypt(input, output, lenght, ks1, ks2, ks3, ivec, enc)
3664*0a6a1f1dSLionel Sambuc! **************************************************************************
3665*0a6a1f1dSLionel Sambuc
3666*0a6a1f1dSLionel Sambuc
3667*0a6a1f1dSLionel Sambuc	.align 32
3668*0a6a1f1dSLionel Sambuc	.global DES_ede3_cbc_encrypt
3669*0a6a1f1dSLionel Sambuc	.type	 DES_ede3_cbc_encrypt,#function
3670*0a6a1f1dSLionel Sambuc
3671*0a6a1f1dSLionel SambucDES_ede3_cbc_encrypt:
3672*0a6a1f1dSLionel Sambuc
3673*0a6a1f1dSLionel Sambuc	save	%sp, FRAME, %sp
3674*0a6a1f1dSLionel Sambuc
3675*0a6a1f1dSLionel Sambuc
3676*0a6a1f1dSLionel Sambuc
3677*0a6a1f1dSLionel Sambuc
3678*0a6a1f1dSLionel Sambuc
3679*0a6a1f1dSLionel Sambuc	sethi	%hi(_PIC_DES_SPtrans-1f),global1
3680*0a6a1f1dSLionel Sambuc	or	global1,%lo(_PIC_DES_SPtrans-1f),global1
3681*0a6a1f1dSLionel Sambuc1:	call	.+8
3682*0a6a1f1dSLionel Sambuc	add	%o7,global1,global1
3683*0a6a1f1dSLionel Sambuc	sub	global1,_PIC_DES_SPtrans-.des_and,out2
3684*0a6a1f1dSLionel Sambuc
3685*0a6a1f1dSLionel Sambuc	LDPTR	[%fp+BIAS+ARG0+7*ARGSZ], local3          ! enc
3686*0a6a1f1dSLionel Sambuc	LDPTR	[%fp+BIAS+ARG0+6*ARGSZ], local4          ! ivec
3687*0a6a1f1dSLionel Sambuc	cmp	local3, 0                 ! enc
3688*0a6a1f1dSLionel Sambuc
3689*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
3690*0a6a1f1dSLionel Sambuc	be,pn	%icc, .ede3.dec
3691*0a6a1f1dSLionel Sambuc#else
3692*0a6a1f1dSLionel Sambuc	be	.ede3.dec
3693*0a6a1f1dSLionel Sambuc#endif
3694*0a6a1f1dSLionel Sambuc	STPTR	in4,  [%sp+BIAS+ARG0+4*ARGSZ]
3695*0a6a1f1dSLionel Sambuc
3696*0a6a1f1dSLionel Sambuc	STPTR	in5,  [%sp+BIAS+ARG0+5*ARGSZ]
3697*0a6a1f1dSLionel Sambuc
3698*0a6a1f1dSLionel Sambuc
3699*0a6a1f1dSLionel Sambuc
3700*0a6a1f1dSLionel Sambuc! load_little_endian
3701*0a6a1f1dSLionel Sambuc! local4 in5 out5 local3 .LLE6
3702*0a6a1f1dSLionel Sambuc
3703*0a6a1f1dSLionel Sambuc	! first in memory to rightmost in register
3704*0a6a1f1dSLionel Sambuc
3705*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
3706*0a6a1f1dSLionel Sambuc	andcc	local4, 3, global0
3707*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .LLE6
3708*0a6a1f1dSLionel Sambuc	nop
3709*0a6a1f1dSLionel Sambuc
3710*0a6a1f1dSLionel Sambuc	lda	[local4] 0x88, in5
3711*0a6a1f1dSLionel Sambuc	add	local4, 4, local3
3712*0a6a1f1dSLionel Sambuc
3713*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .LLE6a
3714*0a6a1f1dSLionel Sambuc	lda	[local3] 0x88, out5
3715*0a6a1f1dSLionel Sambuc#endif
3716*0a6a1f1dSLionel Sambuc
3717*0a6a1f1dSLionel Sambuc.LLE6:
3718*0a6a1f1dSLionel Sambuc	ldub	[local4+3], in5
3719*0a6a1f1dSLionel Sambuc
3720*0a6a1f1dSLionel Sambuc	ldub	[local4+2], local3
3721*0a6a1f1dSLionel Sambuc	sll	in5, 8, in5
3722*0a6a1f1dSLionel Sambuc	or	in5, local3, in5
3723*0a6a1f1dSLionel Sambuc
3724*0a6a1f1dSLionel Sambuc	ldub	[local4+1], local3
3725*0a6a1f1dSLionel Sambuc	sll	in5, 8, in5
3726*0a6a1f1dSLionel Sambuc	or	in5, local3, in5
3727*0a6a1f1dSLionel Sambuc
3728*0a6a1f1dSLionel Sambuc	ldub	[local4+0], local3
3729*0a6a1f1dSLionel Sambuc	sll	in5, 8, in5
3730*0a6a1f1dSLionel Sambuc	or	in5, local3, in5
3731*0a6a1f1dSLionel Sambuc
3732*0a6a1f1dSLionel Sambuc
3733*0a6a1f1dSLionel Sambuc	ldub	[local4+3+4], out5
3734*0a6a1f1dSLionel Sambuc
3735*0a6a1f1dSLionel Sambuc	ldub	[local4+2+4], local3
3736*0a6a1f1dSLionel Sambuc	sll	out5, 8, out5
3737*0a6a1f1dSLionel Sambuc	or	out5, local3, out5
3738*0a6a1f1dSLionel Sambuc
3739*0a6a1f1dSLionel Sambuc	ldub	[local4+1+4], local3
3740*0a6a1f1dSLionel Sambuc	sll	out5, 8, out5
3741*0a6a1f1dSLionel Sambuc	or	out5, local3, out5
3742*0a6a1f1dSLionel Sambuc
3743*0a6a1f1dSLionel Sambuc	ldub	[local4+0+4], local3
3744*0a6a1f1dSLionel Sambuc	sll	out5, 8, out5
3745*0a6a1f1dSLionel Sambuc	or	out5, local3, out5
3746*0a6a1f1dSLionel Sambuc.LLE6a:
3747*0a6a1f1dSLionel Sambuc
3748*0a6a1f1dSLionel Sambuc  ! ivec
3749*0a6a1f1dSLionel Sambuc
3750*0a6a1f1dSLionel Sambuc	addcc	in2, -8, in2              ! bytes missing after next block
3751*0a6a1f1dSLionel Sambuc
3752*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
3753*0a6a1f1dSLionel Sambuc	bl,pn	%icc,  .ede3.enc.seven.or.less
3754*0a6a1f1dSLionel Sambuc#else
3755*0a6a1f1dSLionel Sambuc	bl	.ede3.enc.seven.or.less
3756*0a6a1f1dSLionel Sambuc#endif
3757*0a6a1f1dSLionel Sambuc	STPTR	in3,  [%sp+BIAS+ARG0+3*ARGSZ]
3758*0a6a1f1dSLionel Sambuc
3759*0a6a1f1dSLionel Sambuc.ede3.enc.next.block:
3760*0a6a1f1dSLionel Sambuc
3761*0a6a1f1dSLionel Sambuc
3762*0a6a1f1dSLionel Sambuc
3763*0a6a1f1dSLionel Sambuc! load_little_endian
3764*0a6a1f1dSLionel Sambuc! in0 out4 global4 local3 .LLE7
3765*0a6a1f1dSLionel Sambuc
3766*0a6a1f1dSLionel Sambuc	! first in memory to rightmost in register
3767*0a6a1f1dSLionel Sambuc
3768*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
3769*0a6a1f1dSLionel Sambuc	andcc	in0, 3, global0
3770*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .LLE7
3771*0a6a1f1dSLionel Sambuc	nop
3772*0a6a1f1dSLionel Sambuc
3773*0a6a1f1dSLionel Sambuc	lda	[in0] 0x88, out4
3774*0a6a1f1dSLionel Sambuc	add	in0, 4, local3
3775*0a6a1f1dSLionel Sambuc
3776*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .LLE7a
3777*0a6a1f1dSLionel Sambuc	lda	[local3] 0x88, global4
3778*0a6a1f1dSLionel Sambuc#endif
3779*0a6a1f1dSLionel Sambuc
3780*0a6a1f1dSLionel Sambuc.LLE7:
3781*0a6a1f1dSLionel Sambuc	ldub	[in0+3], out4
3782*0a6a1f1dSLionel Sambuc
3783*0a6a1f1dSLionel Sambuc	ldub	[in0+2], local3
3784*0a6a1f1dSLionel Sambuc	sll	out4, 8, out4
3785*0a6a1f1dSLionel Sambuc	or	out4, local3, out4
3786*0a6a1f1dSLionel Sambuc
3787*0a6a1f1dSLionel Sambuc	ldub	[in0+1], local3
3788*0a6a1f1dSLionel Sambuc	sll	out4, 8, out4
3789*0a6a1f1dSLionel Sambuc	or	out4, local3, out4
3790*0a6a1f1dSLionel Sambuc
3791*0a6a1f1dSLionel Sambuc	ldub	[in0+0], local3
3792*0a6a1f1dSLionel Sambuc	sll	out4, 8, out4
3793*0a6a1f1dSLionel Sambuc	or	out4, local3, out4
3794*0a6a1f1dSLionel Sambuc
3795*0a6a1f1dSLionel Sambuc
3796*0a6a1f1dSLionel Sambuc	ldub	[in0+3+4], global4
3797*0a6a1f1dSLionel Sambuc
3798*0a6a1f1dSLionel Sambuc	ldub	[in0+2+4], local3
3799*0a6a1f1dSLionel Sambuc	sll	global4, 8, global4
3800*0a6a1f1dSLionel Sambuc	or	global4, local3, global4
3801*0a6a1f1dSLionel Sambuc
3802*0a6a1f1dSLionel Sambuc	ldub	[in0+1+4], local3
3803*0a6a1f1dSLionel Sambuc	sll	global4, 8, global4
3804*0a6a1f1dSLionel Sambuc	or	global4, local3, global4
3805*0a6a1f1dSLionel Sambuc
3806*0a6a1f1dSLionel Sambuc	ldub	[in0+0+4], local3
3807*0a6a1f1dSLionel Sambuc	sll	global4, 8, global4
3808*0a6a1f1dSLionel Sambuc	or	global4, local3, global4
3809*0a6a1f1dSLionel Sambuc.LLE7a:
3810*0a6a1f1dSLionel Sambuc
3811*0a6a1f1dSLionel Sambuc
3812*0a6a1f1dSLionel Sambuc
3813*0a6a1f1dSLionel Sambuc.ede3.enc.next.block_1:
3814*0a6a1f1dSLionel Sambuc
3815*0a6a1f1dSLionel Sambuc	LDPTR	 [%sp+BIAS+ARG0+4*ARGSZ] , in4
3816*0a6a1f1dSLionel Sambuc	xor	in5, out4, in5            ! iv xor
3817*0a6a1f1dSLionel Sambuc	xor	out5, global4, out5       ! iv xor
3818*0a6a1f1dSLionel Sambuc
3819*0a6a1f1dSLionel Sambuc	LDPTR	 [%sp+BIAS+ARG0+3*ARGSZ] , in3
3820*0a6a1f1dSLionel Sambuc	add	in4, 120, in4             ! for decryption we use last subkey first
3821*0a6a1f1dSLionel Sambuc	nop
3822*0a6a1f1dSLionel Sambuc
3823*0a6a1f1dSLionel Sambuc
3824*0a6a1f1dSLionel Sambuc
3825*0a6a1f1dSLionel Sambuc! ip_macro
3826*0a6a1f1dSLionel Sambuc! in5 out5 out5 in5 in3
3827*0a6a1f1dSLionel Sambuc
3828*0a6a1f1dSLionel Sambuc	ld	[out2+256], local1
3829*0a6a1f1dSLionel Sambuc	srl	out5, 4, local4
3830*0a6a1f1dSLionel Sambuc
3831*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
3832*0a6a1f1dSLionel Sambuc	nop
3833*0a6a1f1dSLionel Sambuc
3834*0a6a1f1dSLionel Sambuc	ld	[out2+260], local2
3835*0a6a1f1dSLionel Sambuc	and	local4, local1, local4
3836*0a6a1f1dSLionel Sambuc
3837*0a6a1f1dSLionel Sambuc
3838*0a6a1f1dSLionel Sambuc
3839*0a6a1f1dSLionel Sambuc	ld	[out2+280], out4          ! loop counter
3840*0a6a1f1dSLionel Sambuc	sll	local4, 4, local1
3841*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
3842*0a6a1f1dSLionel Sambuc
3843*0a6a1f1dSLionel Sambuc	ld	[out2+264], local3
3844*0a6a1f1dSLionel Sambuc	srl	in5, 16, local4
3845*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5
3846*0a6a1f1dSLionel Sambuc
3847*0a6a1f1dSLionel Sambuc
3848*0a6a1f1dSLionel Sambuc	xor	local4, out5, local4
3849*0a6a1f1dSLionel Sambuc	nop	!sethi	%hi(DES_SPtrans), global1 ! sbox addr
3850*0a6a1f1dSLionel Sambuc
3851*0a6a1f1dSLionel Sambuc
3852*0a6a1f1dSLionel Sambuc	and	local4, local2, local4
3853*0a6a1f1dSLionel Sambuc	nop	!or	global1, %lo(DES_SPtrans), global1   ! sbox addr
3854*0a6a1f1dSLionel Sambuc
3855*0a6a1f1dSLionel Sambuc	sll	local4, 16, local1
3856*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5
3857*0a6a1f1dSLionel Sambuc
3858*0a6a1f1dSLionel Sambuc	srl	out5, 2, local4
3859*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5
3860*0a6a1f1dSLionel Sambuc
3861*0a6a1f1dSLionel Sambuc	sethi	%hi(16711680), local5
3862*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
3863*0a6a1f1dSLionel Sambuc
3864*0a6a1f1dSLionel Sambuc	and	local4, local3, local4
3865*0a6a1f1dSLionel Sambuc	or	local5, 255, local5
3866*0a6a1f1dSLionel Sambuc
3867*0a6a1f1dSLionel Sambuc	sll	local4, 2, local2
3868*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
3869*0a6a1f1dSLionel Sambuc
3870*0a6a1f1dSLionel Sambuc	srl	in5, 8, local4
3871*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
3872*0a6a1f1dSLionel Sambuc
3873*0a6a1f1dSLionel Sambuc	xor	local4, out5, local4
3874*0a6a1f1dSLionel Sambuc	add	global1, 768, global4
3875*0a6a1f1dSLionel Sambuc
3876*0a6a1f1dSLionel Sambuc	and	local4, local5, local4
3877*0a6a1f1dSLionel Sambuc	add	global1, 1024, global5
3878*0a6a1f1dSLionel Sambuc
3879*0a6a1f1dSLionel Sambuc	ld	[out2+272], local7
3880*0a6a1f1dSLionel Sambuc	sll	local4, 8, local1
3881*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5
3882*0a6a1f1dSLionel Sambuc
3883*0a6a1f1dSLionel Sambuc	srl	out5, 1, local4
3884*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5
3885*0a6a1f1dSLionel Sambuc
3886*0a6a1f1dSLionel Sambuc	ld	[in3], out0                ! key 7531
3887*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
3888*0a6a1f1dSLionel Sambuc	add	global1, 256, global2
3889*0a6a1f1dSLionel Sambuc
3890*0a6a1f1dSLionel Sambuc	ld	[in3+4], out1              ! key 8642
3891*0a6a1f1dSLionel Sambuc	and	local4, local7, local4
3892*0a6a1f1dSLionel Sambuc	add	global1, 512, global3
3893*0a6a1f1dSLionel Sambuc
3894*0a6a1f1dSLionel Sambuc	sll	local4, 1, local1
3895*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
3896*0a6a1f1dSLionel Sambuc
3897*0a6a1f1dSLionel Sambuc	sll	in5, 3, local3
3898*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5
3899*0a6a1f1dSLionel Sambuc
3900*0a6a1f1dSLionel Sambuc	sll	out5, 3, local2
3901*0a6a1f1dSLionel Sambuc	add	global1, 1280, local6     ! address sbox 8
3902*0a6a1f1dSLionel Sambuc
3903*0a6a1f1dSLionel Sambuc	srl	in5, 29, local4
3904*0a6a1f1dSLionel Sambuc	add	global1, 1792, out3       ! address sbox 8
3905*0a6a1f1dSLionel Sambuc
3906*0a6a1f1dSLionel Sambuc	srl	out5, 29, local1
3907*0a6a1f1dSLionel Sambuc	or	local4, local3, out5
3908*0a6a1f1dSLionel Sambuc
3909*0a6a1f1dSLionel Sambuc	or	local2, local1, in5
3910*0a6a1f1dSLionel Sambuc
3911*0a6a1f1dSLionel Sambuc
3912*0a6a1f1dSLionel Sambuc
3913*0a6a1f1dSLionel Sambuc
3914*0a6a1f1dSLionel Sambuc
3915*0a6a1f1dSLionel Sambuc
3916*0a6a1f1dSLionel Sambuc.ede3.enc.next.block_2:
3917*0a6a1f1dSLionel Sambuc
3918*0a6a1f1dSLionel Sambuc	call .des_enc                     ! ks1 in3
3919*0a6a1f1dSLionel Sambuc	nop
3920*0a6a1f1dSLionel Sambuc
3921*0a6a1f1dSLionel Sambuc	call .des_dec                     ! ks2 in4
3922*0a6a1f1dSLionel Sambuc	LDPTR	 [%sp+BIAS+ARG0+5*ARGSZ] , in3
3923*0a6a1f1dSLionel Sambuc
3924*0a6a1f1dSLionel Sambuc	call .des_enc                     ! ks3 in3  compares in2 to 8
3925*0a6a1f1dSLionel Sambuc	nop
3926*0a6a1f1dSLionel Sambuc
3927*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
3928*0a6a1f1dSLionel Sambuc	bl,pn	%icc, .ede3.enc.next.block_fp
3929*0a6a1f1dSLionel Sambuc#else
3930*0a6a1f1dSLionel Sambuc	bl	.ede3.enc.next.block_fp
3931*0a6a1f1dSLionel Sambuc#endif
3932*0a6a1f1dSLionel Sambuc	add	in0, 8, in0
3933*0a6a1f1dSLionel Sambuc
3934*0a6a1f1dSLionel Sambuc	! If 8 or more bytes are to be encrypted after this block,
3935*0a6a1f1dSLionel Sambuc	! we combine final permutation for this block with initial
3936*0a6a1f1dSLionel Sambuc	! permutation for next block. Load next block:
3937*0a6a1f1dSLionel Sambuc
3938*0a6a1f1dSLionel Sambuc
3939*0a6a1f1dSLionel Sambuc
3940*0a6a1f1dSLionel Sambuc! load_little_endian
3941*0a6a1f1dSLionel Sambuc! in0 global3 global4 local5 .LLE11
3942*0a6a1f1dSLionel Sambuc
3943*0a6a1f1dSLionel Sambuc	! first in memory to rightmost in register
3944*0a6a1f1dSLionel Sambuc
3945*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
3946*0a6a1f1dSLionel Sambuc	andcc	in0, 3, global0
3947*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .LLE11
3948*0a6a1f1dSLionel Sambuc	nop
3949*0a6a1f1dSLionel Sambuc
3950*0a6a1f1dSLionel Sambuc	lda	[in0] 0x88, global3
3951*0a6a1f1dSLionel Sambuc	add	in0, 4, local5
3952*0a6a1f1dSLionel Sambuc
3953*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .LLE11a
3954*0a6a1f1dSLionel Sambuc	lda	[local5] 0x88, global4
3955*0a6a1f1dSLionel Sambuc#endif
3956*0a6a1f1dSLionel Sambuc
3957*0a6a1f1dSLionel Sambuc.LLE11:
3958*0a6a1f1dSLionel Sambuc	ldub	[in0+3], global3
3959*0a6a1f1dSLionel Sambuc
3960*0a6a1f1dSLionel Sambuc	ldub	[in0+2], local5
3961*0a6a1f1dSLionel Sambuc	sll	global3, 8, global3
3962*0a6a1f1dSLionel Sambuc	or	global3, local5, global3
3963*0a6a1f1dSLionel Sambuc
3964*0a6a1f1dSLionel Sambuc	ldub	[in0+1], local5
3965*0a6a1f1dSLionel Sambuc	sll	global3, 8, global3
3966*0a6a1f1dSLionel Sambuc	or	global3, local5, global3
3967*0a6a1f1dSLionel Sambuc
3968*0a6a1f1dSLionel Sambuc	ldub	[in0+0], local5
3969*0a6a1f1dSLionel Sambuc	sll	global3, 8, global3
3970*0a6a1f1dSLionel Sambuc	or	global3, local5, global3
3971*0a6a1f1dSLionel Sambuc
3972*0a6a1f1dSLionel Sambuc
3973*0a6a1f1dSLionel Sambuc	ldub	[in0+3+4], global4
3974*0a6a1f1dSLionel Sambuc
3975*0a6a1f1dSLionel Sambuc	ldub	[in0+2+4], local5
3976*0a6a1f1dSLionel Sambuc	sll	global4, 8, global4
3977*0a6a1f1dSLionel Sambuc	or	global4, local5, global4
3978*0a6a1f1dSLionel Sambuc
3979*0a6a1f1dSLionel Sambuc	ldub	[in0+1+4], local5
3980*0a6a1f1dSLionel Sambuc	sll	global4, 8, global4
3981*0a6a1f1dSLionel Sambuc	or	global4, local5, global4
3982*0a6a1f1dSLionel Sambuc
3983*0a6a1f1dSLionel Sambuc	ldub	[in0+0+4], local5
3984*0a6a1f1dSLionel Sambuc	sll	global4, 8, global4
3985*0a6a1f1dSLionel Sambuc	or	global4, local5, global4
3986*0a6a1f1dSLionel Sambuc.LLE11a:
3987*0a6a1f1dSLionel Sambuc
3988*0a6a1f1dSLionel Sambuc
3989*0a6a1f1dSLionel Sambuc
3990*0a6a1f1dSLionel Sambuc	!  parameter 1   original left
3991*0a6a1f1dSLionel Sambuc	!  parameter 2   original right
3992*0a6a1f1dSLionel Sambuc	!  parameter 3   left ip
3993*0a6a1f1dSLionel Sambuc	!  parameter 4   right ip
3994*0a6a1f1dSLionel Sambuc	!  parameter 5   1: load ks1/ks2 to in3/in4, add 120 to in4
3995*0a6a1f1dSLionel Sambuc	!                2: mov in4 to in3
3996*0a6a1f1dSLionel Sambuc	!
3997*0a6a1f1dSLionel Sambuc	! also adds -8 to length in2 and loads loop counter to out4
3998*0a6a1f1dSLionel Sambuc
3999*0a6a1f1dSLionel Sambuc
4000*0a6a1f1dSLionel Sambuc
4001*0a6a1f1dSLionel Sambuc! fp_ip_macro
4002*0a6a1f1dSLionel Sambuc! out0 out1 global3 global4 1
4003*0a6a1f1dSLionel Sambuc
4004*0a6a1f1dSLionel Sambuc
4005*0a6a1f1dSLionel Sambuc
4006*0a6a1f1dSLionel Sambuc
4007*0a6a1f1dSLionel Sambuc
4008*0a6a1f1dSLionel Sambuc
4009*0a6a1f1dSLionel Sambuc
4010*0a6a1f1dSLionel Sambuc
4011*0a6a1f1dSLionel Sambuc
4012*0a6a1f1dSLionel Sambuc	! out0 in local3, local4
4013*0a6a1f1dSLionel Sambuc
4014*0a6a1f1dSLionel Sambuc	ld	[out2+256], local1
4015*0a6a1f1dSLionel Sambuc	sll	out5, 29, out4
4016*0a6a1f1dSLionel Sambuc	or	local3, local4, out0
4017*0a6a1f1dSLionel Sambuc
4018*0a6a1f1dSLionel Sambuc	srl	out5, 3, out1
4019*0a6a1f1dSLionel Sambuc
4020*0a6a1f1dSLionel Sambuc
4021*0a6a1f1dSLionel Sambuc	ld	[out2+272], local5
4022*0a6a1f1dSLionel Sambuc	srl	global4, 4, local0
4023*0a6a1f1dSLionel Sambuc	or	out1, out4, out1
4024*0a6a1f1dSLionel Sambuc
4025*0a6a1f1dSLionel Sambuc	srl	out1, 1, out4
4026*0a6a1f1dSLionel Sambuc	xor	out4, out0, out4
4027*0a6a1f1dSLionel Sambuc
4028*0a6a1f1dSLionel Sambuc	and	out4, local5, out4
4029*0a6a1f1dSLionel Sambuc	xor	local0, global3, local0
4030*0a6a1f1dSLionel Sambuc
4031*0a6a1f1dSLionel Sambuc	sll	out4, 1, local3
4032*0a6a1f1dSLionel Sambuc	xor	out0, out4, out0
4033*0a6a1f1dSLionel Sambuc
4034*0a6a1f1dSLionel Sambuc	and	local0, local1, local0
4035*0a6a1f1dSLionel Sambuc	add	in2, -8, in2
4036*0a6a1f1dSLionel Sambuc
4037*0a6a1f1dSLionel Sambuc	sll	local0, 4, local7
4038*0a6a1f1dSLionel Sambuc	xor	global3, local0, global3
4039*0a6a1f1dSLionel Sambuc
4040*0a6a1f1dSLionel Sambuc	ld	[out2+268], local4
4041*0a6a1f1dSLionel Sambuc	srl	out0, 8, out4
4042*0a6a1f1dSLionel Sambuc	xor	out1, local3, out1
4043*0a6a1f1dSLionel Sambuc	ld	[out2+260], local2
4044*0a6a1f1dSLionel Sambuc	srl	global3, 16, local0
4045*0a6a1f1dSLionel Sambuc	xor	global4, local7, global4
4046*0a6a1f1dSLionel Sambuc	xor	out4, out1, out4
4047*0a6a1f1dSLionel Sambuc	xor	local0, global4, local0
4048*0a6a1f1dSLionel Sambuc	and	out4, local4, out4
4049*0a6a1f1dSLionel Sambuc	and	local0, local2, local0
4050*0a6a1f1dSLionel Sambuc	sll	out4, 8, local3
4051*0a6a1f1dSLionel Sambuc	xor	out1, out4, out1
4052*0a6a1f1dSLionel Sambuc	sll	local0, 16, local7
4053*0a6a1f1dSLionel Sambuc	xor	global4, local0, global4
4054*0a6a1f1dSLionel Sambuc
4055*0a6a1f1dSLionel Sambuc	srl	out1, 2, out4
4056*0a6a1f1dSLionel Sambuc	xor	out0, local3, out0
4057*0a6a1f1dSLionel Sambuc
4058*0a6a1f1dSLionel Sambuc	ld	[out2+264], local3         ! ip3
4059*0a6a1f1dSLionel Sambuc	srl	global4, 2, local0
4060*0a6a1f1dSLionel Sambuc	xor	global3, local7, global3
4061*0a6a1f1dSLionel Sambuc	xor	out4, out0, out4
4062*0a6a1f1dSLionel Sambuc	xor	local0, global3, local0
4063*0a6a1f1dSLionel Sambuc	and	out4, local3, out4
4064*0a6a1f1dSLionel Sambuc	and	local0, local3, local0
4065*0a6a1f1dSLionel Sambuc	sll	out4, 2, local3
4066*0a6a1f1dSLionel Sambuc	xor	out0, out4, out0
4067*0a6a1f1dSLionel Sambuc	sll	local0, 2, local7
4068*0a6a1f1dSLionel Sambuc	xor	global3, local0, global3
4069*0a6a1f1dSLionel Sambuc
4070*0a6a1f1dSLionel Sambuc	srl	out0, 16, out4
4071*0a6a1f1dSLionel Sambuc	xor	out1, local3, out1
4072*0a6a1f1dSLionel Sambuc	srl	global3, 8, local0
4073*0a6a1f1dSLionel Sambuc	xor	global4, local7, global4
4074*0a6a1f1dSLionel Sambuc	xor	out4, out1, out4
4075*0a6a1f1dSLionel Sambuc	xor	local0, global4, local0
4076*0a6a1f1dSLionel Sambuc	and	out4, local2, out4
4077*0a6a1f1dSLionel Sambuc	and	local0, local4, local0
4078*0a6a1f1dSLionel Sambuc	sll	out4, 16, local3
4079*0a6a1f1dSLionel Sambuc	xor	out1, out4, local4
4080*0a6a1f1dSLionel Sambuc	sll	local0, 8, local7
4081*0a6a1f1dSLionel Sambuc	xor	global4, local0, global4
4082*0a6a1f1dSLionel Sambuc
4083*0a6a1f1dSLionel Sambuc	srl	global4, 1, local0
4084*0a6a1f1dSLionel Sambuc	xor	global3, local7, global3
4085*0a6a1f1dSLionel Sambuc
4086*0a6a1f1dSLionel Sambuc	srl	local4, 4, out4
4087*0a6a1f1dSLionel Sambuc	xor	local0, global3, local0
4088*0a6a1f1dSLionel Sambuc
4089*0a6a1f1dSLionel Sambuc	xor	out0, local3, out0
4090*0a6a1f1dSLionel Sambuc	and	local0, local5, local0
4091*0a6a1f1dSLionel Sambuc
4092*0a6a1f1dSLionel Sambuc	sll	local0, 1, local7
4093*0a6a1f1dSLionel Sambuc	xor	out4, out0, out4
4094*0a6a1f1dSLionel Sambuc
4095*0a6a1f1dSLionel Sambuc	xor	global3, local0, global3
4096*0a6a1f1dSLionel Sambuc	xor	global4, local7, global4
4097*0a6a1f1dSLionel Sambuc
4098*0a6a1f1dSLionel Sambuc	sll	global3, 3, local5
4099*0a6a1f1dSLionel Sambuc	and	out4, local1, out4
4100*0a6a1f1dSLionel Sambuc
4101*0a6a1f1dSLionel Sambuc	sll	out4, 4, local3
4102*0a6a1f1dSLionel Sambuc	xor	out0, out4, out0
4103*0a6a1f1dSLionel Sambuc
4104*0a6a1f1dSLionel Sambuc	LDPTR	 [%sp+BIAS+ARG0+4*ARGSZ] , in4
4105*0a6a1f1dSLionel Sambuc	sll	global4, 3, local2
4106*0a6a1f1dSLionel Sambuc	xor	local4, local3, out1
4107*0a6a1f1dSLionel Sambuc
4108*0a6a1f1dSLionel Sambuc	! reload since used as temporar:
4109*0a6a1f1dSLionel Sambuc
4110*0a6a1f1dSLionel Sambuc	ld	[out2+280], out4          ! loop counter
4111*0a6a1f1dSLionel Sambuc
4112*0a6a1f1dSLionel Sambuc	srl	global3, 29, local0
4113*0a6a1f1dSLionel Sambuc	add in4, 120, in4
4114*0a6a1f1dSLionel Sambuc
4115*0a6a1f1dSLionel Sambuc	LDPTR	 [%sp+BIAS+ARG0+3*ARGSZ] , in3
4116*0a6a1f1dSLionel Sambuc	srl	global4, 29, local7
4117*0a6a1f1dSLionel Sambuc
4118*0a6a1f1dSLionel Sambuc	or	local0, local5, global4
4119*0a6a1f1dSLionel Sambuc	or	local2, local7, global3
4120*0a6a1f1dSLionel Sambuc
4121*0a6a1f1dSLionel Sambuc
4122*0a6a1f1dSLionel Sambuc
4123*0a6a1f1dSLionel Sambuc
4124*0a6a1f1dSLionel Sambuc
4125*0a6a1f1dSLionel Sambuc! store_little_endian
4126*0a6a1f1dSLionel Sambuc! in1 out0 out1 local3 .SLE9
4127*0a6a1f1dSLionel Sambuc
4128*0a6a1f1dSLionel Sambuc	! rightmost in register to first in memory
4129*0a6a1f1dSLionel Sambuc
4130*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
4131*0a6a1f1dSLionel Sambuc	andcc	in1, 3, global0
4132*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .SLE9
4133*0a6a1f1dSLionel Sambuc	nop
4134*0a6a1f1dSLionel Sambuc
4135*0a6a1f1dSLionel Sambuc	sta	out0, [in1] 0x88
4136*0a6a1f1dSLionel Sambuc	add	in1, 4, local3
4137*0a6a1f1dSLionel Sambuc
4138*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .SLE9a
4139*0a6a1f1dSLionel Sambuc	sta	out1, [local3] 0x88
4140*0a6a1f1dSLionel Sambuc#endif
4141*0a6a1f1dSLionel Sambuc
4142*0a6a1f1dSLionel Sambuc.SLE9:
4143*0a6a1f1dSLionel Sambuc	and	out0, 255, local3
4144*0a6a1f1dSLionel Sambuc	stub	local3, [in1+0]
4145*0a6a1f1dSLionel Sambuc
4146*0a6a1f1dSLionel Sambuc	srl	out0, 8, local3
4147*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
4148*0a6a1f1dSLionel Sambuc	stub	local3, [in1+1]
4149*0a6a1f1dSLionel Sambuc
4150*0a6a1f1dSLionel Sambuc	srl	out0, 16, local3
4151*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
4152*0a6a1f1dSLionel Sambuc	stub	local3, [in1+2]
4153*0a6a1f1dSLionel Sambuc
4154*0a6a1f1dSLionel Sambuc	srl	out0, 24, local3
4155*0a6a1f1dSLionel Sambuc	stub	local3, [in1+3]
4156*0a6a1f1dSLionel Sambuc
4157*0a6a1f1dSLionel Sambuc
4158*0a6a1f1dSLionel Sambuc	and	out1, 255, local3
4159*0a6a1f1dSLionel Sambuc	stub	local3, [in1+0+4]
4160*0a6a1f1dSLionel Sambuc
4161*0a6a1f1dSLionel Sambuc	srl	out1, 8, local3
4162*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
4163*0a6a1f1dSLionel Sambuc	stub	local3, [in1+1+4]
4164*0a6a1f1dSLionel Sambuc
4165*0a6a1f1dSLionel Sambuc	srl	out1, 16, local3
4166*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
4167*0a6a1f1dSLionel Sambuc	stub	local3, [in1+2+4]
4168*0a6a1f1dSLionel Sambuc
4169*0a6a1f1dSLionel Sambuc	srl	out1, 24, local3
4170*0a6a1f1dSLionel Sambuc	stub	local3, [in1+3+4]
4171*0a6a1f1dSLionel Sambuc
4172*0a6a1f1dSLionel Sambuc.SLE9a:
4173*0a6a1f1dSLionel Sambuc
4174*0a6a1f1dSLionel Sambuc  ! block
4175*0a6a1f1dSLionel Sambuc
4176*0a6a1f1dSLionel Sambuc	mov 	in5, local1
4177*0a6a1f1dSLionel Sambuc	xor	global3, out5, in5        ! iv xor next block
4178*0a6a1f1dSLionel Sambuc
4179*0a6a1f1dSLionel Sambuc	ld	[in3], out0               ! key 7531
4180*0a6a1f1dSLionel Sambuc	add	global1, 512, global3     ! address sbox 3
4181*0a6a1f1dSLionel Sambuc	xor	global4, local1, out5     ! iv xor next block
4182*0a6a1f1dSLionel Sambuc
4183*0a6a1f1dSLionel Sambuc	ld	[in3+4], out1             ! key 8642
4184*0a6a1f1dSLionel Sambuc	add	global1, 768, global4     ! address sbox 4
4185*0a6a1f1dSLionel Sambuc	ba	.ede3.enc.next.block_2
4186*0a6a1f1dSLionel Sambuc	add	in1, 8, in1
4187*0a6a1f1dSLionel Sambuc
4188*0a6a1f1dSLionel Sambuc.ede3.enc.next.block_fp:
4189*0a6a1f1dSLionel Sambuc
4190*0a6a1f1dSLionel Sambuc
4191*0a6a1f1dSLionel Sambuc
4192*0a6a1f1dSLionel Sambuc! fp_macro
4193*0a6a1f1dSLionel Sambuc! in5 out5
4194*0a6a1f1dSLionel Sambuc
4195*0a6a1f1dSLionel Sambuc	! initially undo the rotate 3 left done after initial permutation
4196*0a6a1f1dSLionel Sambuc	! original left is received shifted 3 right and 29 left in local3/4
4197*0a6a1f1dSLionel Sambuc
4198*0a6a1f1dSLionel Sambuc	sll	out5, 29, local1
4199*0a6a1f1dSLionel Sambuc	or	local3, local4, in5
4200*0a6a1f1dSLionel Sambuc
4201*0a6a1f1dSLionel Sambuc	srl	out5, 3, out5
4202*0a6a1f1dSLionel Sambuc	sethi	%hi(0x55555555), local2
4203*0a6a1f1dSLionel Sambuc
4204*0a6a1f1dSLionel Sambuc	or	out5, local1, out5
4205*0a6a1f1dSLionel Sambuc	or	local2, %lo(0x55555555), local2
4206*0a6a1f1dSLionel Sambuc
4207*0a6a1f1dSLionel Sambuc	srl	out5, 1, local3
4208*0a6a1f1dSLionel Sambuc	sethi	%hi(0x00ff00ff), local1
4209*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
4210*0a6a1f1dSLionel Sambuc	or	local1, %lo(0x00ff00ff), local1
4211*0a6a1f1dSLionel Sambuc	and	local3, local2, local3
4212*0a6a1f1dSLionel Sambuc	sethi	%hi(0x33333333), local4
4213*0a6a1f1dSLionel Sambuc	sll	local3, 1, local2
4214*0a6a1f1dSLionel Sambuc
4215*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5
4216*0a6a1f1dSLionel Sambuc
4217*0a6a1f1dSLionel Sambuc	srl	in5, 8, local3
4218*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
4219*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
4220*0a6a1f1dSLionel Sambuc	or	local4, %lo(0x33333333), local4
4221*0a6a1f1dSLionel Sambuc	and	local3, local1, local3
4222*0a6a1f1dSLionel Sambuc	sethi	%hi(0x0000ffff), local1
4223*0a6a1f1dSLionel Sambuc	sll	local3, 8, local2
4224*0a6a1f1dSLionel Sambuc
4225*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5
4226*0a6a1f1dSLionel Sambuc
4227*0a6a1f1dSLionel Sambuc	srl	out5, 2, local3
4228*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5
4229*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
4230*0a6a1f1dSLionel Sambuc	or	local1, %lo(0x0000ffff), local1
4231*0a6a1f1dSLionel Sambuc	and	local3, local4, local3
4232*0a6a1f1dSLionel Sambuc	sethi	%hi(0x0f0f0f0f), local4
4233*0a6a1f1dSLionel Sambuc	sll	local3, 2, local2
4234*0a6a1f1dSLionel Sambuc
4235*0a6a1f1dSLionel Sambuc
4236*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5
4237*0a6a1f1dSLionel Sambuc
4238*0a6a1f1dSLionel Sambuc
4239*0a6a1f1dSLionel Sambuc	srl	in5, 16, local3
4240*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
4241*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
4242*0a6a1f1dSLionel Sambuc	or	local4, %lo(0x0f0f0f0f), local4
4243*0a6a1f1dSLionel Sambuc	and	local3, local1, local3
4244*0a6a1f1dSLionel Sambuc	sll	local3, 16, local2
4245*0a6a1f1dSLionel Sambuc
4246*0a6a1f1dSLionel Sambuc	xor	out5, local3, local1
4247*0a6a1f1dSLionel Sambuc
4248*0a6a1f1dSLionel Sambuc	srl	local1, 4, local3
4249*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5
4250*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
4251*0a6a1f1dSLionel Sambuc	and	local3, local4, local3
4252*0a6a1f1dSLionel Sambuc	sll	local3, 4, local2
4253*0a6a1f1dSLionel Sambuc
4254*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5
4255*0a6a1f1dSLionel Sambuc
4256*0a6a1f1dSLionel Sambuc	! optional store:
4257*0a6a1f1dSLionel Sambuc
4258*0a6a1f1dSLionel Sambuc
4259*0a6a1f1dSLionel Sambuc
4260*0a6a1f1dSLionel Sambuc	xor	local1, local2, out5
4261*0a6a1f1dSLionel Sambuc
4262*0a6a1f1dSLionel Sambuc
4263*0a6a1f1dSLionel Sambuc
4264*0a6a1f1dSLionel Sambuc
4265*0a6a1f1dSLionel Sambuc
4266*0a6a1f1dSLionel Sambuc
4267*0a6a1f1dSLionel Sambuc
4268*0a6a1f1dSLionel Sambuc! store_little_endian
4269*0a6a1f1dSLionel Sambuc! in1 in5 out5 local3 .SLE5
4270*0a6a1f1dSLionel Sambuc
4271*0a6a1f1dSLionel Sambuc	! rightmost in register to first in memory
4272*0a6a1f1dSLionel Sambuc
4273*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
4274*0a6a1f1dSLionel Sambuc	andcc	in1, 3, global0
4275*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .SLE5
4276*0a6a1f1dSLionel Sambuc	nop
4277*0a6a1f1dSLionel Sambuc
4278*0a6a1f1dSLionel Sambuc	sta	in5, [in1] 0x88
4279*0a6a1f1dSLionel Sambuc	add	in1, 4, local3
4280*0a6a1f1dSLionel Sambuc
4281*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .SLE5a
4282*0a6a1f1dSLionel Sambuc	sta	out5, [local3] 0x88
4283*0a6a1f1dSLionel Sambuc#endif
4284*0a6a1f1dSLionel Sambuc
4285*0a6a1f1dSLionel Sambuc.SLE5:
4286*0a6a1f1dSLionel Sambuc	and	in5, 255, local3
4287*0a6a1f1dSLionel Sambuc	stub	local3, [in1+0]
4288*0a6a1f1dSLionel Sambuc
4289*0a6a1f1dSLionel Sambuc	srl	in5, 8, local3
4290*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
4291*0a6a1f1dSLionel Sambuc	stub	local3, [in1+1]
4292*0a6a1f1dSLionel Sambuc
4293*0a6a1f1dSLionel Sambuc	srl	in5, 16, local3
4294*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
4295*0a6a1f1dSLionel Sambuc	stub	local3, [in1+2]
4296*0a6a1f1dSLionel Sambuc
4297*0a6a1f1dSLionel Sambuc	srl	in5, 24, local3
4298*0a6a1f1dSLionel Sambuc	stub	local3, [in1+3]
4299*0a6a1f1dSLionel Sambuc
4300*0a6a1f1dSLionel Sambuc
4301*0a6a1f1dSLionel Sambuc	and	out5, 255, local3
4302*0a6a1f1dSLionel Sambuc	stub	local3, [in1+0+4]
4303*0a6a1f1dSLionel Sambuc
4304*0a6a1f1dSLionel Sambuc	srl	out5, 8, local3
4305*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
4306*0a6a1f1dSLionel Sambuc	stub	local3, [in1+1+4]
4307*0a6a1f1dSLionel Sambuc
4308*0a6a1f1dSLionel Sambuc	srl	out5, 16, local3
4309*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
4310*0a6a1f1dSLionel Sambuc	stub	local3, [in1+2+4]
4311*0a6a1f1dSLionel Sambuc
4312*0a6a1f1dSLionel Sambuc	srl	out5, 24, local3
4313*0a6a1f1dSLionel Sambuc	stub	local3, [in1+3+4]
4314*0a6a1f1dSLionel Sambuc
4315*0a6a1f1dSLionel Sambuc.SLE5a:
4316*0a6a1f1dSLionel Sambuc
4317*0a6a1f1dSLionel Sambuc  ! block
4318*0a6a1f1dSLionel Sambuc
4319*0a6a1f1dSLionel Sambuc	addcc   in2, -8, in2              ! bytes missing when next block done
4320*0a6a1f1dSLionel Sambuc
4321*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
4322*0a6a1f1dSLionel Sambuc	bpos,pt	%icc, .ede3.enc.next.block
4323*0a6a1f1dSLionel Sambuc#else
4324*0a6a1f1dSLionel Sambuc	bpos	.ede3.enc.next.block
4325*0a6a1f1dSLionel Sambuc#endif
4326*0a6a1f1dSLionel Sambuc	add	in1, 8, in1
4327*0a6a1f1dSLionel Sambuc
4328*0a6a1f1dSLionel Sambuc.ede3.enc.seven.or.less:
4329*0a6a1f1dSLionel Sambuc
4330*0a6a1f1dSLionel Sambuc	cmp	in2, -8
4331*0a6a1f1dSLionel Sambuc
4332*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
4333*0a6a1f1dSLionel Sambuc	ble,pt	%icc, .ede3.enc.finish
4334*0a6a1f1dSLionel Sambuc#else
4335*0a6a1f1dSLionel Sambuc	ble	.ede3.enc.finish
4336*0a6a1f1dSLionel Sambuc#endif
4337*0a6a1f1dSLionel Sambuc	nop
4338*0a6a1f1dSLionel Sambuc
4339*0a6a1f1dSLionel Sambuc	add	in2, 8, local1            ! bytes to load
4340*0a6a1f1dSLionel Sambuc
4341*0a6a1f1dSLionel Sambuc	! addr, length, dest left, dest right, temp, local3, label, ret label
4342*0a6a1f1dSLionel Sambuc
4343*0a6a1f1dSLionel Sambuc
4344*0a6a1f1dSLionel Sambuc! load_n_bytes
4345*0a6a1f1dSLionel Sambuc! in0 local1 local2 local3 .LNB2 .ede3.enc.next.block_1 .LNB2 .ede3.enc.next.block_1
4346*0a6a1f1dSLionel Sambuc
4347*0a6a1f1dSLionel Sambuc.LNB2.0:	call	.+8
4348*0a6a1f1dSLionel Sambuc	sll	local1, 2, local3
4349*0a6a1f1dSLionel Sambuc
4350*0a6a1f1dSLionel Sambuc	add	%o7,.LNB2.jmp.table-.LNB2.0,local2
4351*0a6a1f1dSLionel Sambuc
4352*0a6a1f1dSLionel Sambuc	add	local2, local3, local2
4353*0a6a1f1dSLionel Sambuc	mov	0, out4
4354*0a6a1f1dSLionel Sambuc
4355*0a6a1f1dSLionel Sambuc	ld	[local2], local2
4356*0a6a1f1dSLionel Sambuc
4357*0a6a1f1dSLionel Sambuc	jmp	%o7+local2
4358*0a6a1f1dSLionel Sambuc	mov	0, global4
4359*0a6a1f1dSLionel Sambuc
4360*0a6a1f1dSLionel Sambuc.LNB2.7:
4361*0a6a1f1dSLionel Sambuc	ldub	[in0+6], local2
4362*0a6a1f1dSLionel Sambuc	sll	local2, 16, local2
4363*0a6a1f1dSLionel Sambuc	or	global4, local2, global4
4364*0a6a1f1dSLionel Sambuc.LNB2.6:
4365*0a6a1f1dSLionel Sambuc	ldub	[in0+5], local2
4366*0a6a1f1dSLionel Sambuc	sll	local2, 8, local2
4367*0a6a1f1dSLionel Sambuc	or	global4, local2, global4
4368*0a6a1f1dSLionel Sambuc.LNB2.5:
4369*0a6a1f1dSLionel Sambuc	ldub	[in0+4], local2
4370*0a6a1f1dSLionel Sambuc	or	global4, local2, global4
4371*0a6a1f1dSLionel Sambuc.LNB2.4:
4372*0a6a1f1dSLionel Sambuc	ldub	[in0+3], local2
4373*0a6a1f1dSLionel Sambuc	sll	local2, 24, local2
4374*0a6a1f1dSLionel Sambuc	or	out4, local2, out4
4375*0a6a1f1dSLionel Sambuc.LNB2.3:
4376*0a6a1f1dSLionel Sambuc	ldub	[in0+2], local2
4377*0a6a1f1dSLionel Sambuc	sll	local2, 16, local2
4378*0a6a1f1dSLionel Sambuc	or	out4, local2, out4
4379*0a6a1f1dSLionel Sambuc.LNB2.2:
4380*0a6a1f1dSLionel Sambuc	ldub	[in0+1], local2
4381*0a6a1f1dSLionel Sambuc	sll	local2, 8, local2
4382*0a6a1f1dSLionel Sambuc	or	out4, local2, out4
4383*0a6a1f1dSLionel Sambuc.LNB2.1:
4384*0a6a1f1dSLionel Sambuc	ldub	[in0+0], local2
4385*0a6a1f1dSLionel Sambuc	ba	.ede3.enc.next.block_1
4386*0a6a1f1dSLionel Sambuc	or	out4, local2, out4
4387*0a6a1f1dSLionel Sambuc
4388*0a6a1f1dSLionel Sambuc	.align 4
4389*0a6a1f1dSLionel Sambuc
4390*0a6a1f1dSLionel Sambuc.LNB2.jmp.table:
4391*0a6a1f1dSLionel Sambuc	.word	0
4392*0a6a1f1dSLionel Sambuc	.word	.LNB2.1-.LNB2.0
4393*0a6a1f1dSLionel Sambuc	.word	.LNB2.2-.LNB2.0
4394*0a6a1f1dSLionel Sambuc	.word	.LNB2.3-.LNB2.0
4395*0a6a1f1dSLionel Sambuc	.word	.LNB2.4-.LNB2.0
4396*0a6a1f1dSLionel Sambuc	.word	.LNB2.5-.LNB2.0
4397*0a6a1f1dSLionel Sambuc	.word	.LNB2.6-.LNB2.0
4398*0a6a1f1dSLionel Sambuc	.word	.LNB2.7-.LNB2.0
4399*0a6a1f1dSLionel Sambuc
4400*0a6a1f1dSLionel Sambuc
4401*0a6a1f1dSLionel Sambuc.ede3.enc.finish:
4402*0a6a1f1dSLionel Sambuc
4403*0a6a1f1dSLionel Sambuc	LDPTR	[%fp+BIAS+ARG0+6*ARGSZ], local4          ! ivec
4404*0a6a1f1dSLionel Sambuc
4405*0a6a1f1dSLionel Sambuc
4406*0a6a1f1dSLionel Sambuc! store_little_endian
4407*0a6a1f1dSLionel Sambuc! local4 in5 out5 local5 .SLE6
4408*0a6a1f1dSLionel Sambuc
4409*0a6a1f1dSLionel Sambuc	! rightmost in register to first in memory
4410*0a6a1f1dSLionel Sambuc
4411*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
4412*0a6a1f1dSLionel Sambuc	andcc	local4, 3, global0
4413*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .SLE6
4414*0a6a1f1dSLionel Sambuc	nop
4415*0a6a1f1dSLionel Sambuc
4416*0a6a1f1dSLionel Sambuc	sta	in5, [local4] 0x88
4417*0a6a1f1dSLionel Sambuc	add	local4, 4, local5
4418*0a6a1f1dSLionel Sambuc
4419*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .SLE6a
4420*0a6a1f1dSLionel Sambuc	sta	out5, [local5] 0x88
4421*0a6a1f1dSLionel Sambuc#endif
4422*0a6a1f1dSLionel Sambuc
4423*0a6a1f1dSLionel Sambuc.SLE6:
4424*0a6a1f1dSLionel Sambuc	and	in5, 255, local5
4425*0a6a1f1dSLionel Sambuc	stub	local5, [local4+0]
4426*0a6a1f1dSLionel Sambuc
4427*0a6a1f1dSLionel Sambuc	srl	in5, 8, local5
4428*0a6a1f1dSLionel Sambuc	and	local5, 255, local5
4429*0a6a1f1dSLionel Sambuc	stub	local5, [local4+1]
4430*0a6a1f1dSLionel Sambuc
4431*0a6a1f1dSLionel Sambuc	srl	in5, 16, local5
4432*0a6a1f1dSLionel Sambuc	and	local5, 255, local5
4433*0a6a1f1dSLionel Sambuc	stub	local5, [local4+2]
4434*0a6a1f1dSLionel Sambuc
4435*0a6a1f1dSLionel Sambuc	srl	in5, 24, local5
4436*0a6a1f1dSLionel Sambuc	stub	local5, [local4+3]
4437*0a6a1f1dSLionel Sambuc
4438*0a6a1f1dSLionel Sambuc
4439*0a6a1f1dSLionel Sambuc	and	out5, 255, local5
4440*0a6a1f1dSLionel Sambuc	stub	local5, [local4+0+4]
4441*0a6a1f1dSLionel Sambuc
4442*0a6a1f1dSLionel Sambuc	srl	out5, 8, local5
4443*0a6a1f1dSLionel Sambuc	and	local5, 255, local5
4444*0a6a1f1dSLionel Sambuc	stub	local5, [local4+1+4]
4445*0a6a1f1dSLionel Sambuc
4446*0a6a1f1dSLionel Sambuc	srl	out5, 16, local5
4447*0a6a1f1dSLionel Sambuc	and	local5, 255, local5
4448*0a6a1f1dSLionel Sambuc	stub	local5, [local4+2+4]
4449*0a6a1f1dSLionel Sambuc
4450*0a6a1f1dSLionel Sambuc	srl	out5, 24, local5
4451*0a6a1f1dSLionel Sambuc	stub	local5, [local4+3+4]
4452*0a6a1f1dSLionel Sambuc
4453*0a6a1f1dSLionel Sambuc.SLE6a:
4454*0a6a1f1dSLionel Sambuc
4455*0a6a1f1dSLionel Sambuc  ! ivec
4456*0a6a1f1dSLionel Sambuc
4457*0a6a1f1dSLionel Sambuc	ret
4458*0a6a1f1dSLionel Sambuc	restore
4459*0a6a1f1dSLionel Sambuc
4460*0a6a1f1dSLionel Sambuc.ede3.dec:
4461*0a6a1f1dSLionel Sambuc
4462*0a6a1f1dSLionel Sambuc	STPTR	in0,  [%sp+BIAS+ARG0+0*ARGSZ]
4463*0a6a1f1dSLionel Sambuc	add	in5, 120, in5
4464*0a6a1f1dSLionel Sambuc
4465*0a6a1f1dSLionel Sambuc	STPTR	in1,  [%sp+BIAS+ARG0+1*ARGSZ]
4466*0a6a1f1dSLionel Sambuc	mov	in0, local5
4467*0a6a1f1dSLionel Sambuc	add	in3, 120, in3
4468*0a6a1f1dSLionel Sambuc
4469*0a6a1f1dSLionel Sambuc	STPTR	in3,  [%sp+BIAS+ARG0+3*ARGSZ]
4470*0a6a1f1dSLionel Sambuc	cmp	in2, 0
4471*0a6a1f1dSLionel Sambuc
4472*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
4473*0a6a1f1dSLionel Sambuc	ble	%icc, .ede3.dec.finish
4474*0a6a1f1dSLionel Sambuc#else
4475*0a6a1f1dSLionel Sambuc	ble	.ede3.dec.finish
4476*0a6a1f1dSLionel Sambuc#endif
4477*0a6a1f1dSLionel Sambuc	STPTR	in5,  [%sp+BIAS+ARG0+5*ARGSZ]
4478*0a6a1f1dSLionel Sambuc
4479*0a6a1f1dSLionel Sambuc	LDPTR	[%fp+BIAS+ARG0+6*ARGSZ], local7          ! iv
4480*0a6a1f1dSLionel Sambuc
4481*0a6a1f1dSLionel Sambuc
4482*0a6a1f1dSLionel Sambuc! load_little_endian
4483*0a6a1f1dSLionel Sambuc! local7 in0 in1 local3 .LLE8
4484*0a6a1f1dSLionel Sambuc
4485*0a6a1f1dSLionel Sambuc	! first in memory to rightmost in register
4486*0a6a1f1dSLionel Sambuc
4487*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
4488*0a6a1f1dSLionel Sambuc	andcc	local7, 3, global0
4489*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .LLE8
4490*0a6a1f1dSLionel Sambuc	nop
4491*0a6a1f1dSLionel Sambuc
4492*0a6a1f1dSLionel Sambuc	lda	[local7] 0x88, in0
4493*0a6a1f1dSLionel Sambuc	add	local7, 4, local3
4494*0a6a1f1dSLionel Sambuc
4495*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .LLE8a
4496*0a6a1f1dSLionel Sambuc	lda	[local3] 0x88, in1
4497*0a6a1f1dSLionel Sambuc#endif
4498*0a6a1f1dSLionel Sambuc
4499*0a6a1f1dSLionel Sambuc.LLE8:
4500*0a6a1f1dSLionel Sambuc	ldub	[local7+3], in0
4501*0a6a1f1dSLionel Sambuc
4502*0a6a1f1dSLionel Sambuc	ldub	[local7+2], local3
4503*0a6a1f1dSLionel Sambuc	sll	in0, 8, in0
4504*0a6a1f1dSLionel Sambuc	or	in0, local3, in0
4505*0a6a1f1dSLionel Sambuc
4506*0a6a1f1dSLionel Sambuc	ldub	[local7+1], local3
4507*0a6a1f1dSLionel Sambuc	sll	in0, 8, in0
4508*0a6a1f1dSLionel Sambuc	or	in0, local3, in0
4509*0a6a1f1dSLionel Sambuc
4510*0a6a1f1dSLionel Sambuc	ldub	[local7+0], local3
4511*0a6a1f1dSLionel Sambuc	sll	in0, 8, in0
4512*0a6a1f1dSLionel Sambuc	or	in0, local3, in0
4513*0a6a1f1dSLionel Sambuc
4514*0a6a1f1dSLionel Sambuc
4515*0a6a1f1dSLionel Sambuc	ldub	[local7+3+4], in1
4516*0a6a1f1dSLionel Sambuc
4517*0a6a1f1dSLionel Sambuc	ldub	[local7+2+4], local3
4518*0a6a1f1dSLionel Sambuc	sll	in1, 8, in1
4519*0a6a1f1dSLionel Sambuc	or	in1, local3, in1
4520*0a6a1f1dSLionel Sambuc
4521*0a6a1f1dSLionel Sambuc	ldub	[local7+1+4], local3
4522*0a6a1f1dSLionel Sambuc	sll	in1, 8, in1
4523*0a6a1f1dSLionel Sambuc	or	in1, local3, in1
4524*0a6a1f1dSLionel Sambuc
4525*0a6a1f1dSLionel Sambuc	ldub	[local7+0+4], local3
4526*0a6a1f1dSLionel Sambuc	sll	in1, 8, in1
4527*0a6a1f1dSLionel Sambuc	or	in1, local3, in1
4528*0a6a1f1dSLionel Sambuc.LLE8a:
4529*0a6a1f1dSLionel Sambuc
4530*0a6a1f1dSLionel Sambuc
4531*0a6a1f1dSLionel Sambuc
4532*0a6a1f1dSLionel Sambuc.ede3.dec.next.block:
4533*0a6a1f1dSLionel Sambuc
4534*0a6a1f1dSLionel Sambuc
4535*0a6a1f1dSLionel Sambuc
4536*0a6a1f1dSLionel Sambuc! load_little_endian
4537*0a6a1f1dSLionel Sambuc! local5 in5 out5 local3 .LLE9
4538*0a6a1f1dSLionel Sambuc
4539*0a6a1f1dSLionel Sambuc	! first in memory to rightmost in register
4540*0a6a1f1dSLionel Sambuc
4541*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
4542*0a6a1f1dSLionel Sambuc	andcc	local5, 3, global0
4543*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .LLE9
4544*0a6a1f1dSLionel Sambuc	nop
4545*0a6a1f1dSLionel Sambuc
4546*0a6a1f1dSLionel Sambuc	lda	[local5] 0x88, in5
4547*0a6a1f1dSLionel Sambuc	add	local5, 4, local3
4548*0a6a1f1dSLionel Sambuc
4549*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .LLE9a
4550*0a6a1f1dSLionel Sambuc	lda	[local3] 0x88, out5
4551*0a6a1f1dSLionel Sambuc#endif
4552*0a6a1f1dSLionel Sambuc
4553*0a6a1f1dSLionel Sambuc.LLE9:
4554*0a6a1f1dSLionel Sambuc	ldub	[local5+3], in5
4555*0a6a1f1dSLionel Sambuc
4556*0a6a1f1dSLionel Sambuc	ldub	[local5+2], local3
4557*0a6a1f1dSLionel Sambuc	sll	in5, 8, in5
4558*0a6a1f1dSLionel Sambuc	or	in5, local3, in5
4559*0a6a1f1dSLionel Sambuc
4560*0a6a1f1dSLionel Sambuc	ldub	[local5+1], local3
4561*0a6a1f1dSLionel Sambuc	sll	in5, 8, in5
4562*0a6a1f1dSLionel Sambuc	or	in5, local3, in5
4563*0a6a1f1dSLionel Sambuc
4564*0a6a1f1dSLionel Sambuc	ldub	[local5+0], local3
4565*0a6a1f1dSLionel Sambuc	sll	in5, 8, in5
4566*0a6a1f1dSLionel Sambuc	or	in5, local3, in5
4567*0a6a1f1dSLionel Sambuc
4568*0a6a1f1dSLionel Sambuc
4569*0a6a1f1dSLionel Sambuc	ldub	[local5+3+4], out5
4570*0a6a1f1dSLionel Sambuc
4571*0a6a1f1dSLionel Sambuc	ldub	[local5+2+4], local3
4572*0a6a1f1dSLionel Sambuc	sll	out5, 8, out5
4573*0a6a1f1dSLionel Sambuc	or	out5, local3, out5
4574*0a6a1f1dSLionel Sambuc
4575*0a6a1f1dSLionel Sambuc	ldub	[local5+1+4], local3
4576*0a6a1f1dSLionel Sambuc	sll	out5, 8, out5
4577*0a6a1f1dSLionel Sambuc	or	out5, local3, out5
4578*0a6a1f1dSLionel Sambuc
4579*0a6a1f1dSLionel Sambuc	ldub	[local5+0+4], local3
4580*0a6a1f1dSLionel Sambuc	sll	out5, 8, out5
4581*0a6a1f1dSLionel Sambuc	or	out5, local3, out5
4582*0a6a1f1dSLionel Sambuc.LLE9a:
4583*0a6a1f1dSLionel Sambuc
4584*0a6a1f1dSLionel Sambuc
4585*0a6a1f1dSLionel Sambuc
4586*0a6a1f1dSLionel Sambuc	! parameter 6  1/2 for include encryption/decryption
4587*0a6a1f1dSLionel Sambuc	! parameter 7  1 for mov in1 to in3
4588*0a6a1f1dSLionel Sambuc	! parameter 8  1 for mov in3 to in4
4589*0a6a1f1dSLionel Sambuc	! parameter 9  1 for load ks3 and ks2 to in4 and in3
4590*0a6a1f1dSLionel Sambuc
4591*0a6a1f1dSLionel Sambuc
4592*0a6a1f1dSLionel Sambuc
4593*0a6a1f1dSLionel Sambuc! ip_macro
4594*0a6a1f1dSLionel Sambuc! in5 out5 in5 out5 in4 2 0 0 1
4595*0a6a1f1dSLionel Sambuc
4596*0a6a1f1dSLionel Sambuc	ld	[out2+256], local1
4597*0a6a1f1dSLionel Sambuc	srl	out5, 4, local4
4598*0a6a1f1dSLionel Sambuc
4599*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
4600*0a6a1f1dSLionel Sambuc	nop
4601*0a6a1f1dSLionel Sambuc
4602*0a6a1f1dSLionel Sambuc	ld	[out2+260], local2
4603*0a6a1f1dSLionel Sambuc	and	local4, local1, local4
4604*0a6a1f1dSLionel Sambuc
4605*0a6a1f1dSLionel Sambuc
4606*0a6a1f1dSLionel Sambuc
4607*0a6a1f1dSLionel Sambuc	ld	[out2+280], out4          ! loop counter
4608*0a6a1f1dSLionel Sambuc	sll	local4, 4, local1
4609*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
4610*0a6a1f1dSLionel Sambuc
4611*0a6a1f1dSLionel Sambuc	ld	[out2+264], local3
4612*0a6a1f1dSLionel Sambuc	srl	in5, 16, local4
4613*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5
4614*0a6a1f1dSLionel Sambuc
4615*0a6a1f1dSLionel Sambuc	LDPTR	 [%sp+BIAS+ARG0+5*ARGSZ] , in4
4616*0a6a1f1dSLionel Sambuc	xor	local4, out5, local4
4617*0a6a1f1dSLionel Sambuc	nop	!sethi	%hi(DES_SPtrans), global1 ! sbox addr
4618*0a6a1f1dSLionel Sambuc
4619*0a6a1f1dSLionel Sambuc	LDPTR	 [%sp+BIAS+ARG0+4*ARGSZ] , in3
4620*0a6a1f1dSLionel Sambuc	and	local4, local2, local4
4621*0a6a1f1dSLionel Sambuc	nop	!or	global1, %lo(DES_SPtrans), global1   ! sbox addr
4622*0a6a1f1dSLionel Sambuc
4623*0a6a1f1dSLionel Sambuc	sll	local4, 16, local1
4624*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5
4625*0a6a1f1dSLionel Sambuc
4626*0a6a1f1dSLionel Sambuc	srl	out5, 2, local4
4627*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5
4628*0a6a1f1dSLionel Sambuc
4629*0a6a1f1dSLionel Sambuc	sethi	%hi(16711680), local5
4630*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
4631*0a6a1f1dSLionel Sambuc
4632*0a6a1f1dSLionel Sambuc	and	local4, local3, local4
4633*0a6a1f1dSLionel Sambuc	or	local5, 255, local5
4634*0a6a1f1dSLionel Sambuc
4635*0a6a1f1dSLionel Sambuc	sll	local4, 2, local2
4636*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
4637*0a6a1f1dSLionel Sambuc
4638*0a6a1f1dSLionel Sambuc	srl	in5, 8, local4
4639*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
4640*0a6a1f1dSLionel Sambuc
4641*0a6a1f1dSLionel Sambuc	xor	local4, out5, local4
4642*0a6a1f1dSLionel Sambuc	add	global1, 768, global4
4643*0a6a1f1dSLionel Sambuc
4644*0a6a1f1dSLionel Sambuc	and	local4, local5, local4
4645*0a6a1f1dSLionel Sambuc	add	global1, 1024, global5
4646*0a6a1f1dSLionel Sambuc
4647*0a6a1f1dSLionel Sambuc	ld	[out2+272], local7
4648*0a6a1f1dSLionel Sambuc	sll	local4, 8, local1
4649*0a6a1f1dSLionel Sambuc	xor	out5, local4, out5
4650*0a6a1f1dSLionel Sambuc
4651*0a6a1f1dSLionel Sambuc	srl	out5, 1, local4
4652*0a6a1f1dSLionel Sambuc	xor	in5, local1, in5
4653*0a6a1f1dSLionel Sambuc
4654*0a6a1f1dSLionel Sambuc	ld	[in4], out0                ! key 7531
4655*0a6a1f1dSLionel Sambuc	xor	local4, in5, local4
4656*0a6a1f1dSLionel Sambuc	add	global1, 256, global2
4657*0a6a1f1dSLionel Sambuc
4658*0a6a1f1dSLionel Sambuc	ld	[in4+4], out1              ! key 8642
4659*0a6a1f1dSLionel Sambuc	and	local4, local7, local4
4660*0a6a1f1dSLionel Sambuc	add	global1, 512, global3
4661*0a6a1f1dSLionel Sambuc
4662*0a6a1f1dSLionel Sambuc	sll	local4, 1, local1
4663*0a6a1f1dSLionel Sambuc	xor	in5, local4, in5
4664*0a6a1f1dSLionel Sambuc
4665*0a6a1f1dSLionel Sambuc	sll	in5, 3, local3
4666*0a6a1f1dSLionel Sambuc	xor	out5, local1, out5
4667*0a6a1f1dSLionel Sambuc
4668*0a6a1f1dSLionel Sambuc	sll	out5, 3, local2
4669*0a6a1f1dSLionel Sambuc	add	global1, 1280, local6     ! address sbox 8
4670*0a6a1f1dSLionel Sambuc
4671*0a6a1f1dSLionel Sambuc	srl	in5, 29, local4
4672*0a6a1f1dSLionel Sambuc	add	global1, 1792, out3       ! address sbox 8
4673*0a6a1f1dSLionel Sambuc
4674*0a6a1f1dSLionel Sambuc	srl	out5, 29, local1
4675*0a6a1f1dSLionel Sambuc	or	local4, local3, in5
4676*0a6a1f1dSLionel Sambuc
4677*0a6a1f1dSLionel Sambuc	or	local2, local1, out5
4678*0a6a1f1dSLionel Sambuc
4679*0a6a1f1dSLionel Sambuc
4680*0a6a1f1dSLionel Sambuc
4681*0a6a1f1dSLionel Sambuc
4682*0a6a1f1dSLionel Sambuc
4683*0a6a1f1dSLionel Sambuc		ld	[out2+284], local5     ! 0x0000FC00 used in the rounds
4684*0a6a1f1dSLionel Sambuc		or	local2, local1, out5
4685*0a6a1f1dSLionel Sambuc		xor	in5, out0, local1
4686*0a6a1f1dSLionel Sambuc
4687*0a6a1f1dSLionel Sambuc		call .des_dec.1
4688*0a6a1f1dSLionel Sambuc		and	local1, 252, local1
4689*0a6a1f1dSLionel Sambuc
4690*0a6a1f1dSLionel Sambuc
4691*0a6a1f1dSLionel Sambuc ! inc .des_dec ks3 in4
4692*0a6a1f1dSLionel Sambuc
4693*0a6a1f1dSLionel Sambuc	call .des_enc                     ! ks2 in3
4694*0a6a1f1dSLionel Sambuc	LDPTR	 [%sp+BIAS+ARG0+3*ARGSZ] , in4
4695*0a6a1f1dSLionel Sambuc
4696*0a6a1f1dSLionel Sambuc	call .des_dec                     ! ks1 in4
4697*0a6a1f1dSLionel Sambuc	nop
4698*0a6a1f1dSLionel Sambuc
4699*0a6a1f1dSLionel Sambuc
4700*0a6a1f1dSLionel Sambuc
4701*0a6a1f1dSLionel Sambuc! fp_macro
4702*0a6a1f1dSLionel Sambuc! out5 in5 0 1
4703*0a6a1f1dSLionel Sambuc
4704*0a6a1f1dSLionel Sambuc	! initially undo the rotate 3 left done after initial permutation
4705*0a6a1f1dSLionel Sambuc	! original left is received shifted 3 right and 29 left in local3/4
4706*0a6a1f1dSLionel Sambuc
4707*0a6a1f1dSLionel Sambuc	sll	in5, 29, local1
4708*0a6a1f1dSLionel Sambuc	or	local3, local4, out5
4709*0a6a1f1dSLionel Sambuc
4710*0a6a1f1dSLionel Sambuc	srl	in5, 3, in5
4711*0a6a1f1dSLionel Sambuc	sethi	%hi(0x55555555), local2
4712*0a6a1f1dSLionel Sambuc
4713*0a6a1f1dSLionel Sambuc	or	in5, local1, in5
4714*0a6a1f1dSLionel Sambuc	or	local2, %lo(0x55555555), local2
4715*0a6a1f1dSLionel Sambuc
4716*0a6a1f1dSLionel Sambuc	srl	in5, 1, local3
4717*0a6a1f1dSLionel Sambuc	sethi	%hi(0x00ff00ff), local1
4718*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
4719*0a6a1f1dSLionel Sambuc	or	local1, %lo(0x00ff00ff), local1
4720*0a6a1f1dSLionel Sambuc	and	local3, local2, local3
4721*0a6a1f1dSLionel Sambuc	sethi	%hi(0x33333333), local4
4722*0a6a1f1dSLionel Sambuc	sll	local3, 1, local2
4723*0a6a1f1dSLionel Sambuc
4724*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5
4725*0a6a1f1dSLionel Sambuc
4726*0a6a1f1dSLionel Sambuc	srl	out5, 8, local3
4727*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5
4728*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
4729*0a6a1f1dSLionel Sambuc	or	local4, %lo(0x33333333), local4
4730*0a6a1f1dSLionel Sambuc	and	local3, local1, local3
4731*0a6a1f1dSLionel Sambuc	sethi	%hi(0x0000ffff), local1
4732*0a6a1f1dSLionel Sambuc	sll	local3, 8, local2
4733*0a6a1f1dSLionel Sambuc
4734*0a6a1f1dSLionel Sambuc	xor	in5, local3, in5
4735*0a6a1f1dSLionel Sambuc
4736*0a6a1f1dSLionel Sambuc	srl	in5, 2, local3
4737*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
4738*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
4739*0a6a1f1dSLionel Sambuc	or	local1, %lo(0x0000ffff), local1
4740*0a6a1f1dSLionel Sambuc	and	local3, local4, local3
4741*0a6a1f1dSLionel Sambuc	sethi	%hi(0x0f0f0f0f), local4
4742*0a6a1f1dSLionel Sambuc	sll	local3, 2, local2
4743*0a6a1f1dSLionel Sambuc
4744*0a6a1f1dSLionel Sambuc	LDPTR  [%sp+BIAS+ARG0+0*ARGSZ] , local5
4745*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5
4746*0a6a1f1dSLionel Sambuc
4747*0a6a1f1dSLionel Sambuc	LDPTR  [%sp+BIAS+ARG0+1*ARGSZ] , local7
4748*0a6a1f1dSLionel Sambuc	srl	out5, 16, local3
4749*0a6a1f1dSLionel Sambuc	xor	in5, local2, in5
4750*0a6a1f1dSLionel Sambuc	xor	local3, in5, local3
4751*0a6a1f1dSLionel Sambuc	or	local4, %lo(0x0f0f0f0f), local4
4752*0a6a1f1dSLionel Sambuc	and	local3, local1, local3
4753*0a6a1f1dSLionel Sambuc	sll	local3, 16, local2
4754*0a6a1f1dSLionel Sambuc
4755*0a6a1f1dSLionel Sambuc	xor	in5, local3, local1
4756*0a6a1f1dSLionel Sambuc
4757*0a6a1f1dSLionel Sambuc	srl	local1, 4, local3
4758*0a6a1f1dSLionel Sambuc	xor	out5, local2, out5
4759*0a6a1f1dSLionel Sambuc	xor	local3, out5, local3
4760*0a6a1f1dSLionel Sambuc	and	local3, local4, local3
4761*0a6a1f1dSLionel Sambuc	sll	local3, 4, local2
4762*0a6a1f1dSLionel Sambuc
4763*0a6a1f1dSLionel Sambuc	xor	out5, local3, out5
4764*0a6a1f1dSLionel Sambuc
4765*0a6a1f1dSLionel Sambuc	! optional store:
4766*0a6a1f1dSLionel Sambuc
4767*0a6a1f1dSLionel Sambuc
4768*0a6a1f1dSLionel Sambuc
4769*0a6a1f1dSLionel Sambuc	xor	local1, local2, in5
4770*0a6a1f1dSLionel Sambuc
4771*0a6a1f1dSLionel Sambuc
4772*0a6a1f1dSLionel Sambuc
4773*0a6a1f1dSLionel Sambuc   ! 1 for input and output address local5/7
4774*0a6a1f1dSLionel Sambuc
4775*0a6a1f1dSLionel Sambuc	! in2 is bytes left to be stored
4776*0a6a1f1dSLionel Sambuc	! in2 is compared to 8 in the rounds
4777*0a6a1f1dSLionel Sambuc
4778*0a6a1f1dSLionel Sambuc	xor	out5, in0, out4
4779*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
4780*0a6a1f1dSLionel Sambuc	bl,pn	%icc, .ede3.dec.seven.or.less
4781*0a6a1f1dSLionel Sambuc#else
4782*0a6a1f1dSLionel Sambuc	bl	.ede3.dec.seven.or.less
4783*0a6a1f1dSLionel Sambuc#endif
4784*0a6a1f1dSLionel Sambuc	xor	in5, in1, global4
4785*0a6a1f1dSLionel Sambuc
4786*0a6a1f1dSLionel Sambuc
4787*0a6a1f1dSLionel Sambuc
4788*0a6a1f1dSLionel Sambuc! load_little_endian_inc
4789*0a6a1f1dSLionel Sambuc! local5 in0 in1 local3 .LLE10
4790*0a6a1f1dSLionel Sambuc
4791*0a6a1f1dSLionel Sambuc	! first in memory to rightmost in register
4792*0a6a1f1dSLionel Sambuc
4793*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
4794*0a6a1f1dSLionel Sambuc	andcc	local5, 3, global0
4795*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .LLE10
4796*0a6a1f1dSLionel Sambuc	nop
4797*0a6a1f1dSLionel Sambuc
4798*0a6a1f1dSLionel Sambuc	lda	[local5] 0x88, in0
4799*0a6a1f1dSLionel Sambuc	add	local5, 4, local5
4800*0a6a1f1dSLionel Sambuc
4801*0a6a1f1dSLionel Sambuc	lda	[local5] 0x88, in1
4802*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .LLE10a
4803*0a6a1f1dSLionel Sambuc	add	local5, 4, local5
4804*0a6a1f1dSLionel Sambuc#endif
4805*0a6a1f1dSLionel Sambuc
4806*0a6a1f1dSLionel Sambuc.LLE10:
4807*0a6a1f1dSLionel Sambuc	ldub	[local5+3], in0
4808*0a6a1f1dSLionel Sambuc
4809*0a6a1f1dSLionel Sambuc	ldub	[local5+2], local3
4810*0a6a1f1dSLionel Sambuc	sll	in0, 8, in0
4811*0a6a1f1dSLionel Sambuc	or	in0, local3, in0
4812*0a6a1f1dSLionel Sambuc
4813*0a6a1f1dSLionel Sambuc	ldub	[local5+1], local3
4814*0a6a1f1dSLionel Sambuc	sll	in0, 8, in0
4815*0a6a1f1dSLionel Sambuc	or	in0, local3, in0
4816*0a6a1f1dSLionel Sambuc
4817*0a6a1f1dSLionel Sambuc	ldub	[local5+0], local3
4818*0a6a1f1dSLionel Sambuc	sll	in0, 8, in0
4819*0a6a1f1dSLionel Sambuc	or	in0, local3, in0
4820*0a6a1f1dSLionel Sambuc
4821*0a6a1f1dSLionel Sambuc	ldub	[local5+3+4], in1
4822*0a6a1f1dSLionel Sambuc	add	local5, 8, local5
4823*0a6a1f1dSLionel Sambuc
4824*0a6a1f1dSLionel Sambuc	ldub	[local5+2+4-8], local3
4825*0a6a1f1dSLionel Sambuc	sll	in1, 8, in1
4826*0a6a1f1dSLionel Sambuc	or	in1, local3, in1
4827*0a6a1f1dSLionel Sambuc
4828*0a6a1f1dSLionel Sambuc	ldub	[local5+1+4-8], local3
4829*0a6a1f1dSLionel Sambuc	sll	in1, 8, in1
4830*0a6a1f1dSLionel Sambuc	or	in1, local3, in1
4831*0a6a1f1dSLionel Sambuc
4832*0a6a1f1dSLionel Sambuc	ldub	[local5+0+4-8], local3
4833*0a6a1f1dSLionel Sambuc	sll	in1, 8, in1
4834*0a6a1f1dSLionel Sambuc	or	in1, local3, in1
4835*0a6a1f1dSLionel Sambuc.LLE10a:
4836*0a6a1f1dSLionel Sambuc
4837*0a6a1f1dSLionel Sambuc   ! iv next block
4838*0a6a1f1dSLionel Sambuc
4839*0a6a1f1dSLionel Sambuc
4840*0a6a1f1dSLionel Sambuc
4841*0a6a1f1dSLionel Sambuc! store_little_endian
4842*0a6a1f1dSLionel Sambuc! local7 out4 global4 local3 .SLE7
4843*0a6a1f1dSLionel Sambuc
4844*0a6a1f1dSLionel Sambuc	! rightmost in register to first in memory
4845*0a6a1f1dSLionel Sambuc
4846*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
4847*0a6a1f1dSLionel Sambuc	andcc	local7, 3, global0
4848*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .SLE7
4849*0a6a1f1dSLionel Sambuc	nop
4850*0a6a1f1dSLionel Sambuc
4851*0a6a1f1dSLionel Sambuc	sta	out4, [local7] 0x88
4852*0a6a1f1dSLionel Sambuc	add	local7, 4, local3
4853*0a6a1f1dSLionel Sambuc
4854*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .SLE7a
4855*0a6a1f1dSLionel Sambuc	sta	global4, [local3] 0x88
4856*0a6a1f1dSLionel Sambuc#endif
4857*0a6a1f1dSLionel Sambuc
4858*0a6a1f1dSLionel Sambuc.SLE7:
4859*0a6a1f1dSLionel Sambuc	and	out4, 255, local3
4860*0a6a1f1dSLionel Sambuc	stub	local3, [local7+0]
4861*0a6a1f1dSLionel Sambuc
4862*0a6a1f1dSLionel Sambuc	srl	out4, 8, local3
4863*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
4864*0a6a1f1dSLionel Sambuc	stub	local3, [local7+1]
4865*0a6a1f1dSLionel Sambuc
4866*0a6a1f1dSLionel Sambuc	srl	out4, 16, local3
4867*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
4868*0a6a1f1dSLionel Sambuc	stub	local3, [local7+2]
4869*0a6a1f1dSLionel Sambuc
4870*0a6a1f1dSLionel Sambuc	srl	out4, 24, local3
4871*0a6a1f1dSLionel Sambuc	stub	local3, [local7+3]
4872*0a6a1f1dSLionel Sambuc
4873*0a6a1f1dSLionel Sambuc
4874*0a6a1f1dSLionel Sambuc	and	global4, 255, local3
4875*0a6a1f1dSLionel Sambuc	stub	local3, [local7+0+4]
4876*0a6a1f1dSLionel Sambuc
4877*0a6a1f1dSLionel Sambuc	srl	global4, 8, local3
4878*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
4879*0a6a1f1dSLionel Sambuc	stub	local3, [local7+1+4]
4880*0a6a1f1dSLionel Sambuc
4881*0a6a1f1dSLionel Sambuc	srl	global4, 16, local3
4882*0a6a1f1dSLionel Sambuc	and	local3, 255, local3
4883*0a6a1f1dSLionel Sambuc	stub	local3, [local7+2+4]
4884*0a6a1f1dSLionel Sambuc
4885*0a6a1f1dSLionel Sambuc	srl	global4, 24, local3
4886*0a6a1f1dSLionel Sambuc	stub	local3, [local7+3+4]
4887*0a6a1f1dSLionel Sambuc
4888*0a6a1f1dSLionel Sambuc.SLE7a:
4889*0a6a1f1dSLionel Sambuc
4890*0a6a1f1dSLionel Sambuc  ! block
4891*0a6a1f1dSLionel Sambuc
4892*0a6a1f1dSLionel Sambuc	STPTR	local5,  [%sp+BIAS+ARG0+0*ARGSZ]
4893*0a6a1f1dSLionel Sambuc	addcc   in2, -8, in2
4894*0a6a1f1dSLionel Sambuc	add	local7, 8, local7
4895*0a6a1f1dSLionel Sambuc
4896*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
4897*0a6a1f1dSLionel Sambuc	bg,pt	%icc, .ede3.dec.next.block
4898*0a6a1f1dSLionel Sambuc#else
4899*0a6a1f1dSLionel Sambuc	bg	.ede3.dec.next.block
4900*0a6a1f1dSLionel Sambuc#endif
4901*0a6a1f1dSLionel Sambuc	STPTR	local7,  [%sp+BIAS+ARG0+1*ARGSZ]
4902*0a6a1f1dSLionel Sambuc
4903*0a6a1f1dSLionel Sambuc.ede3.dec.store.iv:
4904*0a6a1f1dSLionel Sambuc
4905*0a6a1f1dSLionel Sambuc	LDPTR	[%fp+BIAS+ARG0+6*ARGSZ], local4          ! ivec
4906*0a6a1f1dSLionel Sambuc
4907*0a6a1f1dSLionel Sambuc
4908*0a6a1f1dSLionel Sambuc! store_little_endian
4909*0a6a1f1dSLionel Sambuc! local4 in0 in1 local5 .SLE8
4910*0a6a1f1dSLionel Sambuc
4911*0a6a1f1dSLionel Sambuc	! rightmost in register to first in memory
4912*0a6a1f1dSLionel Sambuc
4913*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
4914*0a6a1f1dSLionel Sambuc	andcc	local4, 3, global0
4915*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .SLE8
4916*0a6a1f1dSLionel Sambuc	nop
4917*0a6a1f1dSLionel Sambuc
4918*0a6a1f1dSLionel Sambuc	sta	in0, [local4] 0x88
4919*0a6a1f1dSLionel Sambuc	add	local4, 4, local5
4920*0a6a1f1dSLionel Sambuc
4921*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .SLE8a
4922*0a6a1f1dSLionel Sambuc	sta	in1, [local5] 0x88
4923*0a6a1f1dSLionel Sambuc#endif
4924*0a6a1f1dSLionel Sambuc
4925*0a6a1f1dSLionel Sambuc.SLE8:
4926*0a6a1f1dSLionel Sambuc	and	in0, 255, local5
4927*0a6a1f1dSLionel Sambuc	stub	local5, [local4+0]
4928*0a6a1f1dSLionel Sambuc
4929*0a6a1f1dSLionel Sambuc	srl	in0, 8, local5
4930*0a6a1f1dSLionel Sambuc	and	local5, 255, local5
4931*0a6a1f1dSLionel Sambuc	stub	local5, [local4+1]
4932*0a6a1f1dSLionel Sambuc
4933*0a6a1f1dSLionel Sambuc	srl	in0, 16, local5
4934*0a6a1f1dSLionel Sambuc	and	local5, 255, local5
4935*0a6a1f1dSLionel Sambuc	stub	local5, [local4+2]
4936*0a6a1f1dSLionel Sambuc
4937*0a6a1f1dSLionel Sambuc	srl	in0, 24, local5
4938*0a6a1f1dSLionel Sambuc	stub	local5, [local4+3]
4939*0a6a1f1dSLionel Sambuc
4940*0a6a1f1dSLionel Sambuc
4941*0a6a1f1dSLionel Sambuc	and	in1, 255, local5
4942*0a6a1f1dSLionel Sambuc	stub	local5, [local4+0+4]
4943*0a6a1f1dSLionel Sambuc
4944*0a6a1f1dSLionel Sambuc	srl	in1, 8, local5
4945*0a6a1f1dSLionel Sambuc	and	local5, 255, local5
4946*0a6a1f1dSLionel Sambuc	stub	local5, [local4+1+4]
4947*0a6a1f1dSLionel Sambuc
4948*0a6a1f1dSLionel Sambuc	srl	in1, 16, local5
4949*0a6a1f1dSLionel Sambuc	and	local5, 255, local5
4950*0a6a1f1dSLionel Sambuc	stub	local5, [local4+2+4]
4951*0a6a1f1dSLionel Sambuc
4952*0a6a1f1dSLionel Sambuc	srl	in1, 24, local5
4953*0a6a1f1dSLionel Sambuc	stub	local5, [local4+3+4]
4954*0a6a1f1dSLionel Sambuc
4955*0a6a1f1dSLionel Sambuc.SLE8a:
4956*0a6a1f1dSLionel Sambuc
4957*0a6a1f1dSLionel Sambuc  ! ivec
4958*0a6a1f1dSLionel Sambuc
4959*0a6a1f1dSLionel Sambuc.ede3.dec.finish:
4960*0a6a1f1dSLionel Sambuc
4961*0a6a1f1dSLionel Sambuc	ret
4962*0a6a1f1dSLionel Sambuc	restore
4963*0a6a1f1dSLionel Sambuc
4964*0a6a1f1dSLionel Sambuc.ede3.dec.seven.or.less:
4965*0a6a1f1dSLionel Sambuc
4966*0a6a1f1dSLionel Sambuc
4967*0a6a1f1dSLionel Sambuc
4968*0a6a1f1dSLionel Sambuc! load_little_endian_inc
4969*0a6a1f1dSLionel Sambuc! local5 in0 in1 local3 .LLE14
4970*0a6a1f1dSLionel Sambuc
4971*0a6a1f1dSLionel Sambuc	! first in memory to rightmost in register
4972*0a6a1f1dSLionel Sambuc
4973*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__
4974*0a6a1f1dSLionel Sambuc	andcc	local5, 3, global0
4975*0a6a1f1dSLionel Sambuc	bne,pn	%icc, .LLE14
4976*0a6a1f1dSLionel Sambuc	nop
4977*0a6a1f1dSLionel Sambuc
4978*0a6a1f1dSLionel Sambuc	lda	[local5] 0x88, in0
4979*0a6a1f1dSLionel Sambuc	add	local5, 4, local5
4980*0a6a1f1dSLionel Sambuc
4981*0a6a1f1dSLionel Sambuc	lda	[local5] 0x88, in1
4982*0a6a1f1dSLionel Sambuc	ba,pt	%icc, .LLE14a
4983*0a6a1f1dSLionel Sambuc	add	local5, 4, local5
4984*0a6a1f1dSLionel Sambuc#endif
4985*0a6a1f1dSLionel Sambuc
4986*0a6a1f1dSLionel Sambuc.LLE14:
4987*0a6a1f1dSLionel Sambuc	ldub	[local5+3], in0
4988*0a6a1f1dSLionel Sambuc
4989*0a6a1f1dSLionel Sambuc	ldub	[local5+2], local3
4990*0a6a1f1dSLionel Sambuc	sll	in0, 8, in0
4991*0a6a1f1dSLionel Sambuc	or	in0, local3, in0
4992*0a6a1f1dSLionel Sambuc
4993*0a6a1f1dSLionel Sambuc	ldub	[local5+1], local3
4994*0a6a1f1dSLionel Sambuc	sll	in0, 8, in0
4995*0a6a1f1dSLionel Sambuc	or	in0, local3, in0
4996*0a6a1f1dSLionel Sambuc
4997*0a6a1f1dSLionel Sambuc	ldub	[local5+0], local3
4998*0a6a1f1dSLionel Sambuc	sll	in0, 8, in0
4999*0a6a1f1dSLionel Sambuc	or	in0, local3, in0
5000*0a6a1f1dSLionel Sambuc
5001*0a6a1f1dSLionel Sambuc	ldub	[local5+3+4], in1
5002*0a6a1f1dSLionel Sambuc	add	local5, 8, local5
5003*0a6a1f1dSLionel Sambuc
5004*0a6a1f1dSLionel Sambuc	ldub	[local5+2+4-8], local3
5005*0a6a1f1dSLionel Sambuc	sll	in1, 8, in1
5006*0a6a1f1dSLionel Sambuc	or	in1, local3, in1
5007*0a6a1f1dSLionel Sambuc
5008*0a6a1f1dSLionel Sambuc	ldub	[local5+1+4-8], local3
5009*0a6a1f1dSLionel Sambuc	sll	in1, 8, in1
5010*0a6a1f1dSLionel Sambuc	or	in1, local3, in1
5011*0a6a1f1dSLionel Sambuc
5012*0a6a1f1dSLionel Sambuc	ldub	[local5+0+4-8], local3
5013*0a6a1f1dSLionel Sambuc	sll	in1, 8, in1
5014*0a6a1f1dSLionel Sambuc	or	in1, local3, in1
5015*0a6a1f1dSLionel Sambuc.LLE14a:
5016*0a6a1f1dSLionel Sambuc
5017*0a6a1f1dSLionel Sambuc     ! iv
5018*0a6a1f1dSLionel Sambuc
5019*0a6a1f1dSLionel Sambuc
5020*0a6a1f1dSLionel Sambuc
5021*0a6a1f1dSLionel Sambuc! store_n_bytes
5022*0a6a1f1dSLionel Sambuc! local7 in2 local3 local4 .SNB2 .ede3.dec.store.iv .SNB2 .ede3.dec.store.iv
5023*0a6a1f1dSLionel Sambuc
5024*0a6a1f1dSLionel Sambuc.SNB2.0:	call	.+8
5025*0a6a1f1dSLionel Sambuc	sll	in2, 2, local4
5026*0a6a1f1dSLionel Sambuc
5027*0a6a1f1dSLionel Sambuc	add	%o7,.SNB2.jmp.table-.SNB2.0,local3
5028*0a6a1f1dSLionel Sambuc
5029*0a6a1f1dSLionel Sambuc	add	local3, local4, local3
5030*0a6a1f1dSLionel Sambuc
5031*0a6a1f1dSLionel Sambuc	ld	[local3], local3
5032*0a6a1f1dSLionel Sambuc
5033*0a6a1f1dSLionel Sambuc	jmp	%o7+local3
5034*0a6a1f1dSLionel Sambuc	nop
5035*0a6a1f1dSLionel Sambuc
5036*0a6a1f1dSLionel Sambuc.SNB2.7:
5037*0a6a1f1dSLionel Sambuc	srl	global4, 16, local3
5038*0a6a1f1dSLionel Sambuc	and	local3, 0xff, local3
5039*0a6a1f1dSLionel Sambuc	stub	local3, [local7+6]
5040*0a6a1f1dSLionel Sambuc.SNB2.6:
5041*0a6a1f1dSLionel Sambuc	srl	global4, 8, local3
5042*0a6a1f1dSLionel Sambuc	and	local3, 0xff, local3
5043*0a6a1f1dSLionel Sambuc	stub	local3, [local7+5]
5044*0a6a1f1dSLionel Sambuc.SNB2.5:
5045*0a6a1f1dSLionel Sambuc	and	global4, 0xff, local3
5046*0a6a1f1dSLionel Sambuc	stub	local3, [local7+4]
5047*0a6a1f1dSLionel Sambuc.SNB2.4:
5048*0a6a1f1dSLionel Sambuc	srl	out4, 24, local3
5049*0a6a1f1dSLionel Sambuc	stub	local3, [local7+3]
5050*0a6a1f1dSLionel Sambuc.SNB2.3:
5051*0a6a1f1dSLionel Sambuc	srl	out4, 16, local3
5052*0a6a1f1dSLionel Sambuc	and	local3, 0xff, local3
5053*0a6a1f1dSLionel Sambuc	stub	local3, [local7+2]
5054*0a6a1f1dSLionel Sambuc.SNB2.2:
5055*0a6a1f1dSLionel Sambuc	srl	out4, 8, local3
5056*0a6a1f1dSLionel Sambuc	and	local3, 0xff, local3
5057*0a6a1f1dSLionel Sambuc	stub	local3, [local7+1]
5058*0a6a1f1dSLionel Sambuc.SNB2.1:
5059*0a6a1f1dSLionel Sambuc	and	out4, 0xff, local3
5060*0a6a1f1dSLionel Sambuc
5061*0a6a1f1dSLionel Sambuc
5062*0a6a1f1dSLionel Sambuc	ba	.ede3.dec.store.iv
5063*0a6a1f1dSLionel Sambuc	stub	local3, [local7]
5064*0a6a1f1dSLionel Sambuc
5065*0a6a1f1dSLionel Sambuc	.align 4
5066*0a6a1f1dSLionel Sambuc
5067*0a6a1f1dSLionel Sambuc.SNB2.jmp.table:
5068*0a6a1f1dSLionel Sambuc
5069*0a6a1f1dSLionel Sambuc	.word	0
5070*0a6a1f1dSLionel Sambuc	.word	.SNB2.1-.SNB2.0
5071*0a6a1f1dSLionel Sambuc	.word	.SNB2.2-.SNB2.0
5072*0a6a1f1dSLionel Sambuc	.word	.SNB2.3-.SNB2.0
5073*0a6a1f1dSLionel Sambuc	.word	.SNB2.4-.SNB2.0
5074*0a6a1f1dSLionel Sambuc	.word	.SNB2.5-.SNB2.0
5075*0a6a1f1dSLionel Sambuc	.word	.SNB2.6-.SNB2.0
5076*0a6a1f1dSLionel Sambuc	.word	.SNB2.7-.SNB2.0
5077*0a6a1f1dSLionel Sambuc
5078*0a6a1f1dSLionel Sambuc
5079*0a6a1f1dSLionel Sambuc
5080*0a6a1f1dSLionel Sambuc.DES_ede3_cbc_encrypt.end:
5081*0a6a1f1dSLionel Sambuc	.size	 DES_ede3_cbc_encrypt,.DES_ede3_cbc_encrypt.end-DES_ede3_cbc_encrypt
5082*0a6a1f1dSLionel Sambuc
5083*0a6a1f1dSLionel Sambuc	.align	256
5084*0a6a1f1dSLionel Sambuc	.type	 .des_and,#object
5085*0a6a1f1dSLionel Sambuc	.size	 .des_and,284
5086*0a6a1f1dSLionel Sambuc
5087*0a6a1f1dSLionel Sambuc.des_and:
5088*0a6a1f1dSLionel Sambuc
5089*0a6a1f1dSLionel Sambuc! This table is used for AND 0xFC when it is known that register
5090*0a6a1f1dSLionel Sambuc! bits 8-31 are zero. Makes it possible to do three arithmetic
5091*0a6a1f1dSLionel Sambuc! operations in one cycle.
5092*0a6a1f1dSLionel Sambuc
5093*0a6a1f1dSLionel Sambuc	.byte  0, 0, 0, 0, 4, 4, 4, 4
5094*0a6a1f1dSLionel Sambuc	.byte  8, 8, 8, 8, 12, 12, 12, 12
5095*0a6a1f1dSLionel Sambuc	.byte  16, 16, 16, 16, 20, 20, 20, 20
5096*0a6a1f1dSLionel Sambuc	.byte  24, 24, 24, 24, 28, 28, 28, 28
5097*0a6a1f1dSLionel Sambuc	.byte  32, 32, 32, 32, 36, 36, 36, 36
5098*0a6a1f1dSLionel Sambuc	.byte  40, 40, 40, 40, 44, 44, 44, 44
5099*0a6a1f1dSLionel Sambuc	.byte  48, 48, 48, 48, 52, 52, 52, 52
5100*0a6a1f1dSLionel Sambuc	.byte  56, 56, 56, 56, 60, 60, 60, 60
5101*0a6a1f1dSLionel Sambuc	.byte  64, 64, 64, 64, 68, 68, 68, 68
5102*0a6a1f1dSLionel Sambuc	.byte  72, 72, 72, 72, 76, 76, 76, 76
5103*0a6a1f1dSLionel Sambuc	.byte  80, 80, 80, 80, 84, 84, 84, 84
5104*0a6a1f1dSLionel Sambuc	.byte  88, 88, 88, 88, 92, 92, 92, 92
5105*0a6a1f1dSLionel Sambuc	.byte  96, 96, 96, 96, 100, 100, 100, 100
5106*0a6a1f1dSLionel Sambuc	.byte  104, 104, 104, 104, 108, 108, 108, 108
5107*0a6a1f1dSLionel Sambuc	.byte  112, 112, 112, 112, 116, 116, 116, 116
5108*0a6a1f1dSLionel Sambuc	.byte  120, 120, 120, 120, 124, 124, 124, 124
5109*0a6a1f1dSLionel Sambuc	.byte  128, 128, 128, 128, 132, 132, 132, 132
5110*0a6a1f1dSLionel Sambuc	.byte  136, 136, 136, 136, 140, 140, 140, 140
5111*0a6a1f1dSLionel Sambuc	.byte  144, 144, 144, 144, 148, 148, 148, 148
5112*0a6a1f1dSLionel Sambuc	.byte  152, 152, 152, 152, 156, 156, 156, 156
5113*0a6a1f1dSLionel Sambuc	.byte  160, 160, 160, 160, 164, 164, 164, 164
5114*0a6a1f1dSLionel Sambuc	.byte  168, 168, 168, 168, 172, 172, 172, 172
5115*0a6a1f1dSLionel Sambuc	.byte  176, 176, 176, 176, 180, 180, 180, 180
5116*0a6a1f1dSLionel Sambuc	.byte  184, 184, 184, 184, 188, 188, 188, 188
5117*0a6a1f1dSLionel Sambuc	.byte  192, 192, 192, 192, 196, 196, 196, 196
5118*0a6a1f1dSLionel Sambuc	.byte  200, 200, 200, 200, 204, 204, 204, 204
5119*0a6a1f1dSLionel Sambuc	.byte  208, 208, 208, 208, 212, 212, 212, 212
5120*0a6a1f1dSLionel Sambuc	.byte  216, 216, 216, 216, 220, 220, 220, 220
5121*0a6a1f1dSLionel Sambuc	.byte  224, 224, 224, 224, 228, 228, 228, 228
5122*0a6a1f1dSLionel Sambuc	.byte  232, 232, 232, 232, 236, 236, 236, 236
5123*0a6a1f1dSLionel Sambuc	.byte  240, 240, 240, 240, 244, 244, 244, 244
5124*0a6a1f1dSLionel Sambuc	.byte  248, 248, 248, 248, 252, 252, 252, 252
5125*0a6a1f1dSLionel Sambuc
5126*0a6a1f1dSLionel Sambuc	! 5 numbers for initil/final permutation
5127*0a6a1f1dSLionel Sambuc
5128*0a6a1f1dSLionel Sambuc	.word   0x0f0f0f0f                ! offset 256
5129*0a6a1f1dSLionel Sambuc	.word	0x0000ffff                ! 260
5130*0a6a1f1dSLionel Sambuc	.word	0x33333333                ! 264
5131*0a6a1f1dSLionel Sambuc	.word	0x00ff00ff                ! 268
5132*0a6a1f1dSLionel Sambuc	.word	0x55555555                ! 272
5133*0a6a1f1dSLionel Sambuc
5134*0a6a1f1dSLionel Sambuc	.word	0                         ! 276
5135*0a6a1f1dSLionel Sambuc	.word	LOOPS                     ! 280
5136*0a6a1f1dSLionel Sambuc	.word	0x0000FC00                ! 284
5137*0a6a1f1dSLionel Sambuc
5138*0a6a1f1dSLionel Sambuc	.global	DES_SPtrans
5139*0a6a1f1dSLionel Sambuc	.type	DES_SPtrans,#object
5140*0a6a1f1dSLionel Sambuc	.size	DES_SPtrans,2048
5141*0a6a1f1dSLionel Sambuc.align	64
5142*0a6a1f1dSLionel SambucDES_SPtrans:
5143*0a6a1f1dSLionel Sambuc_PIC_DES_SPtrans:
5144*0a6a1f1dSLionel Sambuc	! nibble 0
5145*0a6a1f1dSLionel Sambuc	.word	0x02080800, 0x00080000, 0x02000002, 0x02080802
5146*0a6a1f1dSLionel Sambuc	.word	0x02000000, 0x00080802, 0x00080002, 0x02000002
5147*0a6a1f1dSLionel Sambuc	.word	0x00080802, 0x02080800, 0x02080000, 0x00000802
5148*0a6a1f1dSLionel Sambuc	.word	0x02000802, 0x02000000, 0x00000000, 0x00080002
5149*0a6a1f1dSLionel Sambuc	.word	0x00080000, 0x00000002, 0x02000800, 0x00080800
5150*0a6a1f1dSLionel Sambuc	.word	0x02080802, 0x02080000, 0x00000802, 0x02000800
5151*0a6a1f1dSLionel Sambuc	.word	0x00000002, 0x00000800, 0x00080800, 0x02080002
5152*0a6a1f1dSLionel Sambuc	.word	0x00000800, 0x02000802, 0x02080002, 0x00000000
5153*0a6a1f1dSLionel Sambuc	.word	0x00000000, 0x02080802, 0x02000800, 0x00080002
5154*0a6a1f1dSLionel Sambuc	.word	0x02080800, 0x00080000, 0x00000802, 0x02000800
5155*0a6a1f1dSLionel Sambuc	.word	0x02080002, 0x00000800, 0x00080800, 0x02000002
5156*0a6a1f1dSLionel Sambuc	.word	0x00080802, 0x00000002, 0x02000002, 0x02080000
5157*0a6a1f1dSLionel Sambuc	.word	0x02080802, 0x00080800, 0x02080000, 0x02000802
5158*0a6a1f1dSLionel Sambuc	.word	0x02000000, 0x00000802, 0x00080002, 0x00000000
5159*0a6a1f1dSLionel Sambuc	.word	0x00080000, 0x02000000, 0x02000802, 0x02080800
5160*0a6a1f1dSLionel Sambuc	.word	0x00000002, 0x02080002, 0x00000800, 0x00080802
5161*0a6a1f1dSLionel Sambuc	! nibble 1
5162*0a6a1f1dSLionel Sambuc	.word	0x40108010, 0x00000000, 0x00108000, 0x40100000
5163*0a6a1f1dSLionel Sambuc	.word	0x40000010, 0x00008010, 0x40008000, 0x00108000
5164*0a6a1f1dSLionel Sambuc	.word	0x00008000, 0x40100010, 0x00000010, 0x40008000
5165*0a6a1f1dSLionel Sambuc	.word	0x00100010, 0x40108000, 0x40100000, 0x00000010
5166*0a6a1f1dSLionel Sambuc	.word	0x00100000, 0x40008010, 0x40100010, 0x00008000
5167*0a6a1f1dSLionel Sambuc	.word	0x00108010, 0x40000000, 0x00000000, 0x00100010
5168*0a6a1f1dSLionel Sambuc	.word	0x40008010, 0x00108010, 0x40108000, 0x40000010
5169*0a6a1f1dSLionel Sambuc	.word	0x40000000, 0x00100000, 0x00008010, 0x40108010
5170*0a6a1f1dSLionel Sambuc	.word	0x00100010, 0x40108000, 0x40008000, 0x00108010
5171*0a6a1f1dSLionel Sambuc	.word	0x40108010, 0x00100010, 0x40000010, 0x00000000
5172*0a6a1f1dSLionel Sambuc	.word	0x40000000, 0x00008010, 0x00100000, 0x40100010
5173*0a6a1f1dSLionel Sambuc	.word	0x00008000, 0x40000000, 0x00108010, 0x40008010
5174*0a6a1f1dSLionel Sambuc	.word	0x40108000, 0x00008000, 0x00000000, 0x40000010
5175*0a6a1f1dSLionel Sambuc	.word	0x00000010, 0x40108010, 0x00108000, 0x40100000
5176*0a6a1f1dSLionel Sambuc	.word	0x40100010, 0x00100000, 0x00008010, 0x40008000
5177*0a6a1f1dSLionel Sambuc	.word	0x40008010, 0x00000010, 0x40100000, 0x00108000
5178*0a6a1f1dSLionel Sambuc	! nibble 2
5179*0a6a1f1dSLionel Sambuc	.word	0x04000001, 0x04040100, 0x00000100, 0x04000101
5180*0a6a1f1dSLionel Sambuc	.word	0x00040001, 0x04000000, 0x04000101, 0x00040100
5181*0a6a1f1dSLionel Sambuc	.word	0x04000100, 0x00040000, 0x04040000, 0x00000001
5182*0a6a1f1dSLionel Sambuc	.word	0x04040101, 0x00000101, 0x00000001, 0x04040001
5183*0a6a1f1dSLionel Sambuc	.word	0x00000000, 0x00040001, 0x04040100, 0x00000100
5184*0a6a1f1dSLionel Sambuc	.word	0x00000101, 0x04040101, 0x00040000, 0x04000001
5185*0a6a1f1dSLionel Sambuc	.word	0x04040001, 0x04000100, 0x00040101, 0x04040000
5186*0a6a1f1dSLionel Sambuc	.word	0x00040100, 0x00000000, 0x04000000, 0x00040101
5187*0a6a1f1dSLionel Sambuc	.word	0x04040100, 0x00000100, 0x00000001, 0x00040000
5188*0a6a1f1dSLionel Sambuc	.word	0x00000101, 0x00040001, 0x04040000, 0x04000101
5189*0a6a1f1dSLionel Sambuc	.word	0x00000000, 0x04040100, 0x00040100, 0x04040001
5190*0a6a1f1dSLionel Sambuc	.word	0x00040001, 0x04000000, 0x04040101, 0x00000001
5191*0a6a1f1dSLionel Sambuc	.word	0x00040101, 0x04000001, 0x04000000, 0x04040101
5192*0a6a1f1dSLionel Sambuc	.word	0x00040000, 0x04000100, 0x04000101, 0x00040100
5193*0a6a1f1dSLionel Sambuc	.word	0x04000100, 0x00000000, 0x04040001, 0x00000101
5194*0a6a1f1dSLionel Sambuc	.word	0x04000001, 0x00040101, 0x00000100, 0x04040000
5195*0a6a1f1dSLionel Sambuc	! nibble 3
5196*0a6a1f1dSLionel Sambuc	.word	0x00401008, 0x10001000, 0x00000008, 0x10401008
5197*0a6a1f1dSLionel Sambuc	.word	0x00000000, 0x10400000, 0x10001008, 0x00400008
5198*0a6a1f1dSLionel Sambuc	.word	0x10401000, 0x10000008, 0x10000000, 0x00001008
5199*0a6a1f1dSLionel Sambuc	.word	0x10000008, 0x00401008, 0x00400000, 0x10000000
5200*0a6a1f1dSLionel Sambuc	.word	0x10400008, 0x00401000, 0x00001000, 0x00000008
5201*0a6a1f1dSLionel Sambuc	.word	0x00401000, 0x10001008, 0x10400000, 0x00001000
5202*0a6a1f1dSLionel Sambuc	.word	0x00001008, 0x00000000, 0x00400008, 0x10401000
5203*0a6a1f1dSLionel Sambuc	.word	0x10001000, 0x10400008, 0x10401008, 0x00400000
5204*0a6a1f1dSLionel Sambuc	.word	0x10400008, 0x00001008, 0x00400000, 0x10000008
5205*0a6a1f1dSLionel Sambuc	.word	0x00401000, 0x10001000, 0x00000008, 0x10400000
5206*0a6a1f1dSLionel Sambuc	.word	0x10001008, 0x00000000, 0x00001000, 0x00400008
5207*0a6a1f1dSLionel Sambuc	.word	0x00000000, 0x10400008, 0x10401000, 0x00001000
5208*0a6a1f1dSLionel Sambuc	.word	0x10000000, 0x10401008, 0x00401008, 0x00400000
5209*0a6a1f1dSLionel Sambuc	.word	0x10401008, 0x00000008, 0x10001000, 0x00401008
5210*0a6a1f1dSLionel Sambuc	.word	0x00400008, 0x00401000, 0x10400000, 0x10001008
5211*0a6a1f1dSLionel Sambuc	.word	0x00001008, 0x10000000, 0x10000008, 0x10401000
5212*0a6a1f1dSLionel Sambuc	! nibble 4
5213*0a6a1f1dSLionel Sambuc	.word	0x08000000, 0x00010000, 0x00000400, 0x08010420
5214*0a6a1f1dSLionel Sambuc	.word	0x08010020, 0x08000400, 0x00010420, 0x08010000
5215*0a6a1f1dSLionel Sambuc	.word	0x00010000, 0x00000020, 0x08000020, 0x00010400
5216*0a6a1f1dSLionel Sambuc	.word	0x08000420, 0x08010020, 0x08010400, 0x00000000
5217*0a6a1f1dSLionel Sambuc	.word	0x00010400, 0x08000000, 0x00010020, 0x00000420
5218*0a6a1f1dSLionel Sambuc	.word	0x08000400, 0x00010420, 0x00000000, 0x08000020
5219*0a6a1f1dSLionel Sambuc	.word	0x00000020, 0x08000420, 0x08010420, 0x00010020
5220*0a6a1f1dSLionel Sambuc	.word	0x08010000, 0x00000400, 0x00000420, 0x08010400
5221*0a6a1f1dSLionel Sambuc	.word	0x08010400, 0x08000420, 0x00010020, 0x08010000
5222*0a6a1f1dSLionel Sambuc	.word	0x00010000, 0x00000020, 0x08000020, 0x08000400
5223*0a6a1f1dSLionel Sambuc	.word	0x08000000, 0x00010400, 0x08010420, 0x00000000
5224*0a6a1f1dSLionel Sambuc	.word	0x00010420, 0x08000000, 0x00000400, 0x00010020
5225*0a6a1f1dSLionel Sambuc	.word	0x08000420, 0x00000400, 0x00000000, 0x08010420
5226*0a6a1f1dSLionel Sambuc	.word	0x08010020, 0x08010400, 0x00000420, 0x00010000
5227*0a6a1f1dSLionel Sambuc	.word	0x00010400, 0x08010020, 0x08000400, 0x00000420
5228*0a6a1f1dSLionel Sambuc	.word	0x00000020, 0x00010420, 0x08010000, 0x08000020
5229*0a6a1f1dSLionel Sambuc	! nibble 5
5230*0a6a1f1dSLionel Sambuc	.word	0x80000040, 0x00200040, 0x00000000, 0x80202000
5231*0a6a1f1dSLionel Sambuc	.word	0x00200040, 0x00002000, 0x80002040, 0x00200000
5232*0a6a1f1dSLionel Sambuc	.word	0x00002040, 0x80202040, 0x00202000, 0x80000000
5233*0a6a1f1dSLionel Sambuc	.word	0x80002000, 0x80000040, 0x80200000, 0x00202040
5234*0a6a1f1dSLionel Sambuc	.word	0x00200000, 0x80002040, 0x80200040, 0x00000000
5235*0a6a1f1dSLionel Sambuc	.word	0x00002000, 0x00000040, 0x80202000, 0x80200040
5236*0a6a1f1dSLionel Sambuc	.word	0x80202040, 0x80200000, 0x80000000, 0x00002040
5237*0a6a1f1dSLionel Sambuc	.word	0x00000040, 0x00202000, 0x00202040, 0x80002000
5238*0a6a1f1dSLionel Sambuc	.word	0x00002040, 0x80000000, 0x80002000, 0x00202040
5239*0a6a1f1dSLionel Sambuc	.word	0x80202000, 0x00200040, 0x00000000, 0x80002000
5240*0a6a1f1dSLionel Sambuc	.word	0x80000000, 0x00002000, 0x80200040, 0x00200000
5241*0a6a1f1dSLionel Sambuc	.word	0x00200040, 0x80202040, 0x00202000, 0x00000040
5242*0a6a1f1dSLionel Sambuc	.word	0x80202040, 0x00202000, 0x00200000, 0x80002040
5243*0a6a1f1dSLionel Sambuc	.word	0x80000040, 0x80200000, 0x00202040, 0x00000000
5244*0a6a1f1dSLionel Sambuc	.word	0x00002000, 0x80000040, 0x80002040, 0x80202000
5245*0a6a1f1dSLionel Sambuc	.word	0x80200000, 0x00002040, 0x00000040, 0x80200040
5246*0a6a1f1dSLionel Sambuc	! nibble 6
5247*0a6a1f1dSLionel Sambuc	.word	0x00004000, 0x00000200, 0x01000200, 0x01000004
5248*0a6a1f1dSLionel Sambuc	.word	0x01004204, 0x00004004, 0x00004200, 0x00000000
5249*0a6a1f1dSLionel Sambuc	.word	0x01000000, 0x01000204, 0x00000204, 0x01004000
5250*0a6a1f1dSLionel Sambuc	.word	0x00000004, 0x01004200, 0x01004000, 0x00000204
5251*0a6a1f1dSLionel Sambuc	.word	0x01000204, 0x00004000, 0x00004004, 0x01004204
5252*0a6a1f1dSLionel Sambuc	.word	0x00000000, 0x01000200, 0x01000004, 0x00004200
5253*0a6a1f1dSLionel Sambuc	.word	0x01004004, 0x00004204, 0x01004200, 0x00000004
5254*0a6a1f1dSLionel Sambuc	.word	0x00004204, 0x01004004, 0x00000200, 0x01000000
5255*0a6a1f1dSLionel Sambuc	.word	0x00004204, 0x01004000, 0x01004004, 0x00000204
5256*0a6a1f1dSLionel Sambuc	.word	0x00004000, 0x00000200, 0x01000000, 0x01004004
5257*0a6a1f1dSLionel Sambuc	.word	0x01000204, 0x00004204, 0x00004200, 0x00000000
5258*0a6a1f1dSLionel Sambuc	.word	0x00000200, 0x01000004, 0x00000004, 0x01000200
5259*0a6a1f1dSLionel Sambuc	.word	0x00000000, 0x01000204, 0x01000200, 0x00004200
5260*0a6a1f1dSLionel Sambuc	.word	0x00000204, 0x00004000, 0x01004204, 0x01000000
5261*0a6a1f1dSLionel Sambuc	.word	0x01004200, 0x00000004, 0x00004004, 0x01004204
5262*0a6a1f1dSLionel Sambuc	.word	0x01000004, 0x01004200, 0x01004000, 0x00004004
5263*0a6a1f1dSLionel Sambuc	! nibble 7
5264*0a6a1f1dSLionel Sambuc	.word	0x20800080, 0x20820000, 0x00020080, 0x00000000
5265*0a6a1f1dSLionel Sambuc	.word	0x20020000, 0x00800080, 0x20800000, 0x20820080
5266*0a6a1f1dSLionel Sambuc	.word	0x00000080, 0x20000000, 0x00820000, 0x00020080
5267*0a6a1f1dSLionel Sambuc	.word	0x00820080, 0x20020080, 0x20000080, 0x20800000
5268*0a6a1f1dSLionel Sambuc	.word	0x00020000, 0x00820080, 0x00800080, 0x20020000
5269*0a6a1f1dSLionel Sambuc	.word	0x20820080, 0x20000080, 0x00000000, 0x00820000
5270*0a6a1f1dSLionel Sambuc	.word	0x20000000, 0x00800000, 0x20020080, 0x20800080
5271*0a6a1f1dSLionel Sambuc	.word	0x00800000, 0x00020000, 0x20820000, 0x00000080
5272*0a6a1f1dSLionel Sambuc	.word	0x00800000, 0x00020000, 0x20000080, 0x20820080
5273*0a6a1f1dSLionel Sambuc	.word	0x00020080, 0x20000000, 0x00000000, 0x00820000
5274*0a6a1f1dSLionel Sambuc	.word	0x20800080, 0x20020080, 0x20020000, 0x00800080
5275*0a6a1f1dSLionel Sambuc	.word	0x20820000, 0x00000080, 0x00800080, 0x20020000
5276*0a6a1f1dSLionel Sambuc	.word	0x20820080, 0x00800000, 0x20800000, 0x20000080
5277*0a6a1f1dSLionel Sambuc	.word	0x00820000, 0x00020080, 0x20020080, 0x20800000
5278*0a6a1f1dSLionel Sambuc	.word	0x00000080, 0x20820000, 0x00820080, 0x00000000
5279*0a6a1f1dSLionel Sambuc	.word	0x20000000, 0x20800080, 0x00020000, 0x00820080
5280*0a6a1f1dSLionel Sambuc
5281