1e1051a39Sopenharmony_ci! Copyright 2000-2018 The OpenSSL Project Authors. All Rights Reserved.
2e1051a39Sopenharmony_ci!
3e1051a39Sopenharmony_ci! Licensed under the Apache License 2.0 (the "License").  You may not use
4e1051a39Sopenharmony_ci! this file except in compliance with the License.  You can obtain a copy
5e1051a39Sopenharmony_ci! in the file LICENSE in the source distribution or at
6e1051a39Sopenharmony_ci! https://www.openssl.org/source/license.html
7e1051a39Sopenharmony_ci!
8e1051a39Sopenharmony_ci!  To expand the m4 macros: m4 -B 8192 des_enc.m4 > des_enc.S
9e1051a39Sopenharmony_ci!
10e1051a39Sopenharmony_ci!  Global registers 1 to 5 are used. This is the same as done by the
11e1051a39Sopenharmony_ci!  cc compiler. The UltraSPARC load/store little endian feature is used.
12e1051a39Sopenharmony_ci!
13e1051a39Sopenharmony_ci!  Instruction grouping often refers to one CPU cycle.
14e1051a39Sopenharmony_ci!
15e1051a39Sopenharmony_ci!  Assemble through gcc: gcc -c -mcpu=ultrasparc -o des_enc.o des_enc.S
16e1051a39Sopenharmony_ci!
17e1051a39Sopenharmony_ci!  Assemble through cc:  cc -c -xarch=v8plusa -o des_enc.o des_enc.S
18e1051a39Sopenharmony_ci!
19e1051a39Sopenharmony_ci!  Performance improvement according to './apps/openssl speed des'
20e1051a39Sopenharmony_ci!
21e1051a39Sopenharmony_ci!	32-bit build:
22e1051a39Sopenharmony_ci!		23%  faster than cc-5.2 -xarch=v8plus -xO5
23e1051a39Sopenharmony_ci!		115% faster than gcc-3.2.1 -m32 -mcpu=ultrasparc -O5
24e1051a39Sopenharmony_ci!	64-bit build:
25e1051a39Sopenharmony_ci!		50%  faster than cc-5.2 -xarch=v9 -xO5
26e1051a39Sopenharmony_ci!		100% faster than gcc-3.2.1 -m64 -mcpu=ultrasparc -O5
27e1051a39Sopenharmony_ci!
28e1051a39Sopenharmony_ci
29e1051a39Sopenharmony_ci.ident "des_enc.m4 2.1"
30e1051a39Sopenharmony_ci.file  "des_enc-sparc.S"
31e1051a39Sopenharmony_ci
32e1051a39Sopenharmony_ci#if defined(__SUNPRO_C) && defined(__sparcv9)
33e1051a39Sopenharmony_ci# define ABI64  /* They've said -xarch=v9 at command line */
34e1051a39Sopenharmony_ci#elif defined(__GNUC__) && defined(__arch64__)
35e1051a39Sopenharmony_ci# define ABI64  /* They've said -m64 at command line */
36e1051a39Sopenharmony_ci#endif
37e1051a39Sopenharmony_ci
38e1051a39Sopenharmony_ci#ifdef ABI64
39e1051a39Sopenharmony_ci  .register	%g2,#scratch
40e1051a39Sopenharmony_ci  .register	%g3,#scratch
41e1051a39Sopenharmony_ci# define	FRAME	-192
42e1051a39Sopenharmony_ci# define	BIAS	2047
43e1051a39Sopenharmony_ci# define	LDPTR	ldx
44e1051a39Sopenharmony_ci# define	STPTR	stx
45e1051a39Sopenharmony_ci# define	ARG0	128
46e1051a39Sopenharmony_ci# define	ARGSZ	8
47e1051a39Sopenharmony_ci#else
48e1051a39Sopenharmony_ci# define	FRAME	-96
49e1051a39Sopenharmony_ci# define	BIAS	0
50e1051a39Sopenharmony_ci# define	LDPTR	ld
51e1051a39Sopenharmony_ci# define	STPTR	st
52e1051a39Sopenharmony_ci# define	ARG0	68
53e1051a39Sopenharmony_ci# define	ARGSZ	4
54e1051a39Sopenharmony_ci#endif
55e1051a39Sopenharmony_ci
56e1051a39Sopenharmony_ci#define LOOPS 7
57e1051a39Sopenharmony_ci
58e1051a39Sopenharmony_ci#define global0 %g0
59e1051a39Sopenharmony_ci#define global1 %g1
60e1051a39Sopenharmony_ci#define global2 %g2
61e1051a39Sopenharmony_ci#define global3 %g3
62e1051a39Sopenharmony_ci#define global4 %g4
63e1051a39Sopenharmony_ci#define global5 %g5
64e1051a39Sopenharmony_ci
65e1051a39Sopenharmony_ci#define local0 %l0
66e1051a39Sopenharmony_ci#define local1 %l1
67e1051a39Sopenharmony_ci#define local2 %l2
68e1051a39Sopenharmony_ci#define local3 %l3
69e1051a39Sopenharmony_ci#define local4 %l4
70e1051a39Sopenharmony_ci#define local5 %l5
71e1051a39Sopenharmony_ci#define local7 %l6
72e1051a39Sopenharmony_ci#define local6 %l7
73e1051a39Sopenharmony_ci
74e1051a39Sopenharmony_ci#define in0 %i0
75e1051a39Sopenharmony_ci#define in1 %i1
76e1051a39Sopenharmony_ci#define in2 %i2
77e1051a39Sopenharmony_ci#define in3 %i3
78e1051a39Sopenharmony_ci#define in4 %i4
79e1051a39Sopenharmony_ci#define in5 %i5
80e1051a39Sopenharmony_ci#define in6 %i6
81e1051a39Sopenharmony_ci#define in7 %i7
82e1051a39Sopenharmony_ci
83e1051a39Sopenharmony_ci#define out0 %o0
84e1051a39Sopenharmony_ci#define out1 %o1
85e1051a39Sopenharmony_ci#define out2 %o2
86e1051a39Sopenharmony_ci#define out3 %o3
87e1051a39Sopenharmony_ci#define out4 %o4
88e1051a39Sopenharmony_ci#define out5 %o5
89e1051a39Sopenharmony_ci#define out6 %o6
90e1051a39Sopenharmony_ci#define out7 %o7
91e1051a39Sopenharmony_ci
92e1051a39Sopenharmony_ci#define stub stb
93e1051a39Sopenharmony_ci
94e1051a39Sopenharmony_cichangequote({,})
95e1051a39Sopenharmony_ci
96e1051a39Sopenharmony_ci
97e1051a39Sopenharmony_ci! Macro definitions:
98e1051a39Sopenharmony_ci
99e1051a39Sopenharmony_ci
100e1051a39Sopenharmony_ci! {ip_macro}
101e1051a39Sopenharmony_ci!
102e1051a39Sopenharmony_ci! The logic used in initial and final permutations is the same as in
103e1051a39Sopenharmony_ci! the C code. The permutations are done with a clever shift, xor, and
104e1051a39Sopenharmony_ci! technique.
105e1051a39Sopenharmony_ci!
106e1051a39Sopenharmony_ci! The macro also loads address sbox 1 to 5 to global 1 to 5, address
107e1051a39Sopenharmony_ci! sbox 6 to local6, and address sbox 8 to out3.
108e1051a39Sopenharmony_ci!
109e1051a39Sopenharmony_ci! Rotates the halves 3 left to bring the sbox bits in convenient positions.
110e1051a39Sopenharmony_ci!
111e1051a39Sopenharmony_ci! Loads key first round from address in parameter 5 to out0, out1.
112e1051a39Sopenharmony_ci!
113e1051a39Sopenharmony_ci! After the original LibDES initial permutation, the resulting left
114e1051a39Sopenharmony_ci! is in the variable initially used for right and vice versa. The macro
115e1051a39Sopenharmony_ci! implements the possibility to keep the halves in the original registers.
116e1051a39Sopenharmony_ci!
117e1051a39Sopenharmony_ci! parameter 1  left
118e1051a39Sopenharmony_ci! parameter 2  right
119e1051a39Sopenharmony_ci! parameter 3  result left (modify in first round)
120e1051a39Sopenharmony_ci! parameter 4  result right (use in first round)
121e1051a39Sopenharmony_ci! parameter 5  key address
122e1051a39Sopenharmony_ci! parameter 6  1/2 for include encryption/decryption
123e1051a39Sopenharmony_ci! parameter 7  1 for move in1 to in3
124e1051a39Sopenharmony_ci! parameter 8  1 for move in3 to in4, 2 for move in4 to in3
125e1051a39Sopenharmony_ci! parameter 9  1 for load ks3 and ks2 to in4 and in3
126e1051a39Sopenharmony_ci
127e1051a39Sopenharmony_cidefine(ip_macro, {
128e1051a39Sopenharmony_ci
129e1051a39Sopenharmony_ci! {ip_macro}
130e1051a39Sopenharmony_ci! $1 $2 $4 $3 $5 $6 $7 $8 $9
131e1051a39Sopenharmony_ci
132e1051a39Sopenharmony_ci	ld	[out2+256], local1
133e1051a39Sopenharmony_ci	srl	$2, 4, local4
134e1051a39Sopenharmony_ci
135e1051a39Sopenharmony_ci	xor	local4, $1, local4
136e1051a39Sopenharmony_ci	ifelse($7,1,{mov in1, in3},{nop})
137e1051a39Sopenharmony_ci
138e1051a39Sopenharmony_ci	ld	[out2+260], local2
139e1051a39Sopenharmony_ci	and	local4, local1, local4
140e1051a39Sopenharmony_ci	ifelse($8,1,{mov in3, in4},{})
141e1051a39Sopenharmony_ci	ifelse($8,2,{mov in4, in3},{})
142e1051a39Sopenharmony_ci
143e1051a39Sopenharmony_ci	ld	[out2+280], out4          ! loop counter
144e1051a39Sopenharmony_ci	sll	local4, 4, local1
145e1051a39Sopenharmony_ci	xor	$1, local4, $1
146e1051a39Sopenharmony_ci
147e1051a39Sopenharmony_ci	ld	[out2+264], local3
148e1051a39Sopenharmony_ci	srl	$1, 16, local4
149e1051a39Sopenharmony_ci	xor	$2, local1, $2
150e1051a39Sopenharmony_ci
151e1051a39Sopenharmony_ci	ifelse($9,1,{LDPTR	KS3, in4},{})
152e1051a39Sopenharmony_ci	xor	local4, $2, local4
153e1051a39Sopenharmony_ci	nop	!sethi	%hi(DES_SPtrans), global1 ! sbox addr
154e1051a39Sopenharmony_ci
155e1051a39Sopenharmony_ci	ifelse($9,1,{LDPTR	KS2, in3},{})
156e1051a39Sopenharmony_ci	and	local4, local2, local4
157e1051a39Sopenharmony_ci	nop	!or	global1, %lo(DES_SPtrans), global1   ! sbox addr
158e1051a39Sopenharmony_ci
159e1051a39Sopenharmony_ci	sll	local4, 16, local1
160e1051a39Sopenharmony_ci	xor	$2, local4, $2
161e1051a39Sopenharmony_ci
162e1051a39Sopenharmony_ci	srl	$2, 2, local4
163e1051a39Sopenharmony_ci	xor	$1, local1, $1
164e1051a39Sopenharmony_ci
165e1051a39Sopenharmony_ci	sethi	%hi(16711680), local5
166e1051a39Sopenharmony_ci	xor	local4, $1, local4
167e1051a39Sopenharmony_ci
168e1051a39Sopenharmony_ci	and	local4, local3, local4
169e1051a39Sopenharmony_ci	or	local5, 255, local5
170e1051a39Sopenharmony_ci
171e1051a39Sopenharmony_ci	sll	local4, 2, local2
172e1051a39Sopenharmony_ci	xor	$1, local4, $1
173e1051a39Sopenharmony_ci
174e1051a39Sopenharmony_ci	srl	$1, 8, local4
175e1051a39Sopenharmony_ci	xor	$2, local2, $2
176e1051a39Sopenharmony_ci
177e1051a39Sopenharmony_ci	xor	local4, $2, local4
178e1051a39Sopenharmony_ci	add	global1, 768, global4
179e1051a39Sopenharmony_ci
180e1051a39Sopenharmony_ci	and	local4, local5, local4
181e1051a39Sopenharmony_ci	add	global1, 1024, global5
182e1051a39Sopenharmony_ci
183e1051a39Sopenharmony_ci	ld	[out2+272], local7
184e1051a39Sopenharmony_ci	sll	local4, 8, local1
185e1051a39Sopenharmony_ci	xor	$2, local4, $2
186e1051a39Sopenharmony_ci
187e1051a39Sopenharmony_ci	srl	$2, 1, local4
188e1051a39Sopenharmony_ci	xor	$1, local1, $1
189e1051a39Sopenharmony_ci
190e1051a39Sopenharmony_ci	ld	[$5], out0                ! key 7531
191e1051a39Sopenharmony_ci	xor	local4, $1, local4
192e1051a39Sopenharmony_ci	add	global1, 256, global2
193e1051a39Sopenharmony_ci
194e1051a39Sopenharmony_ci	ld	[$5+4], out1              ! key 8642
195e1051a39Sopenharmony_ci	and	local4, local7, local4
196e1051a39Sopenharmony_ci	add	global1, 512, global3
197e1051a39Sopenharmony_ci
198e1051a39Sopenharmony_ci	sll	local4, 1, local1
199e1051a39Sopenharmony_ci	xor	$1, local4, $1
200e1051a39Sopenharmony_ci
201e1051a39Sopenharmony_ci	sll	$1, 3, local3
202e1051a39Sopenharmony_ci	xor	$2, local1, $2
203e1051a39Sopenharmony_ci
204e1051a39Sopenharmony_ci	sll	$2, 3, local2
205e1051a39Sopenharmony_ci	add	global1, 1280, local6     ! address sbox 8
206e1051a39Sopenharmony_ci
207e1051a39Sopenharmony_ci	srl	$1, 29, local4
208e1051a39Sopenharmony_ci	add	global1, 1792, out3       ! address sbox 8
209e1051a39Sopenharmony_ci
210e1051a39Sopenharmony_ci	srl	$2, 29, local1
211e1051a39Sopenharmony_ci	or	local4, local3, $4
212e1051a39Sopenharmony_ci
213e1051a39Sopenharmony_ci	or	local2, local1, $3
214e1051a39Sopenharmony_ci
215e1051a39Sopenharmony_ci	ifelse($6, 1, {
216e1051a39Sopenharmony_ci
217e1051a39Sopenharmony_ci		ld	[out2+284], local5     ! 0x0000FC00 used in the rounds
218e1051a39Sopenharmony_ci		or	local2, local1, $3
219e1051a39Sopenharmony_ci		xor	$4, out0, local1
220e1051a39Sopenharmony_ci
221e1051a39Sopenharmony_ci		call .des_enc.1
222e1051a39Sopenharmony_ci		and	local1, 252, local1
223e1051a39Sopenharmony_ci
224e1051a39Sopenharmony_ci	},{})
225e1051a39Sopenharmony_ci
226e1051a39Sopenharmony_ci	ifelse($6, 2, {
227e1051a39Sopenharmony_ci
228e1051a39Sopenharmony_ci		ld	[out2+284], local5     ! 0x0000FC00 used in the rounds
229e1051a39Sopenharmony_ci		or	local2, local1, $3
230e1051a39Sopenharmony_ci		xor	$4, out0, local1
231e1051a39Sopenharmony_ci
232e1051a39Sopenharmony_ci		call .des_dec.1
233e1051a39Sopenharmony_ci		and	local1, 252, local1
234e1051a39Sopenharmony_ci
235e1051a39Sopenharmony_ci	},{})
236e1051a39Sopenharmony_ci})
237e1051a39Sopenharmony_ci
238e1051a39Sopenharmony_ci
239e1051a39Sopenharmony_ci! {rounds_macro}
240e1051a39Sopenharmony_ci!
241e1051a39Sopenharmony_ci! The logic used in the DES rounds is the same as in the C code,
242e1051a39Sopenharmony_ci! except that calculations for sbox 1 and sbox 5 begin before
243e1051a39Sopenharmony_ci! the previous round is finished.
244e1051a39Sopenharmony_ci!
245e1051a39Sopenharmony_ci! In each round one half (work) is modified based on key and the
246e1051a39Sopenharmony_ci! other half (use).
247e1051a39Sopenharmony_ci!
248e1051a39Sopenharmony_ci! In this version we do two rounds in a loop repeated 7 times
249e1051a39Sopenharmony_ci! and two rounds separately.
250e1051a39Sopenharmony_ci!
251e1051a39Sopenharmony_ci! One half has the bits for the sboxes in the following positions:
252e1051a39Sopenharmony_ci!
253e1051a39Sopenharmony_ci!	777777xx555555xx333333xx111111xx
254e1051a39Sopenharmony_ci!
255e1051a39Sopenharmony_ci!	88xx666666xx444444xx222222xx8888
256e1051a39Sopenharmony_ci!
257e1051a39Sopenharmony_ci! The bits for each sbox are xor-ed with the key bits for that box.
258e1051a39Sopenharmony_ci! The above xx bits are cleared, and the result used for lookup in
259e1051a39Sopenharmony_ci! the sbox table. Each sbox entry contains the 4 output bits permuted
260e1051a39Sopenharmony_ci! into 32 bits according to the P permutation.
261e1051a39Sopenharmony_ci!
262e1051a39Sopenharmony_ci! In the description of DES, left and right are switched after
263e1051a39Sopenharmony_ci! each round, except after last round. In this code the original
264e1051a39Sopenharmony_ci! left and right are kept in the same register in all rounds, meaning
265e1051a39Sopenharmony_ci! that after the 16 rounds the result for right is in the register
266e1051a39Sopenharmony_ci! originally used for left.
267e1051a39Sopenharmony_ci!
268e1051a39Sopenharmony_ci! parameter 1  first work (left in first round)
269e1051a39Sopenharmony_ci! parameter 2  first use (right in first round)
270e1051a39Sopenharmony_ci! parameter 3  enc/dec  1/-1
271e1051a39Sopenharmony_ci! parameter 4  loop label
272e1051a39Sopenharmony_ci! parameter 5  key address register
273e1051a39Sopenharmony_ci! parameter 6  optional address for key next encryption/decryption
274e1051a39Sopenharmony_ci! parameter 7  not empty for include retl
275e1051a39Sopenharmony_ci!
276e1051a39Sopenharmony_ci! also compares in2 to 8
277e1051a39Sopenharmony_ci
278e1051a39Sopenharmony_cidefine(rounds_macro, {
279e1051a39Sopenharmony_ci
280e1051a39Sopenharmony_ci! {rounds_macro}
281e1051a39Sopenharmony_ci! $1 $2 $3 $4 $5 $6 $7 $8 $9
282e1051a39Sopenharmony_ci
283e1051a39Sopenharmony_ci	xor	$2, out0, local1
284e1051a39Sopenharmony_ci
285e1051a39Sopenharmony_ci	ld	[out2+284], local5        ! 0x0000FC00
286e1051a39Sopenharmony_ci	ba	$4
287e1051a39Sopenharmony_ci	and	local1, 252, local1
288e1051a39Sopenharmony_ci
289e1051a39Sopenharmony_ci	.align 32
290e1051a39Sopenharmony_ci
291e1051a39Sopenharmony_ci$4:
292e1051a39Sopenharmony_ci	! local6 is address sbox 6
293e1051a39Sopenharmony_ci	! out3   is address sbox 8
294e1051a39Sopenharmony_ci	! out4   is loop counter
295e1051a39Sopenharmony_ci
296e1051a39Sopenharmony_ci	ld	[global1+local1], local1
297e1051a39Sopenharmony_ci	xor	$2, out1, out1            ! 8642
298e1051a39Sopenharmony_ci	xor	$2, out0, out0            ! 7531
299e1051a39Sopenharmony_ci	! fmovs	%f0, %f0                  ! fxor used for alignment
300e1051a39Sopenharmony_ci
301e1051a39Sopenharmony_ci	srl	out1, 4, local0           ! rotate 4 right
302e1051a39Sopenharmony_ci	and	out0, local5, local3      ! 3
303e1051a39Sopenharmony_ci	! fmovs	%f0, %f0
304e1051a39Sopenharmony_ci
305e1051a39Sopenharmony_ci	ld	[$5+$3*8], local7         ! key 7531 next round
306e1051a39Sopenharmony_ci	srl	local3, 8, local3         ! 3
307e1051a39Sopenharmony_ci	and	local0, 252, local2       ! 2
308e1051a39Sopenharmony_ci	! fmovs	%f0, %f0
309e1051a39Sopenharmony_ci
310e1051a39Sopenharmony_ci	ld	[global3+local3],local3   ! 3
311e1051a39Sopenharmony_ci	sll	out1, 28, out1            ! rotate
312e1051a39Sopenharmony_ci	xor	$1, local1, $1            ! 1 finished, local1 now sbox 7
313e1051a39Sopenharmony_ci
314e1051a39Sopenharmony_ci	ld	[global2+local2], local2  ! 2
315e1051a39Sopenharmony_ci	srl	out0, 24, local1          ! 7
316e1051a39Sopenharmony_ci	or	out1, local0, out1        ! rotate
317e1051a39Sopenharmony_ci
318e1051a39Sopenharmony_ci	ldub	[out2+local1], local1     ! 7 (and 0xFC)
319e1051a39Sopenharmony_ci	srl	out1, 24, local0          ! 8
320e1051a39Sopenharmony_ci	and	out1, local5, local4      ! 4
321e1051a39Sopenharmony_ci
322e1051a39Sopenharmony_ci	ldub	[out2+local0], local0     ! 8 (and 0xFC)
323e1051a39Sopenharmony_ci	srl	local4, 8, local4         ! 4
324e1051a39Sopenharmony_ci	xor	$1, local2, $1            ! 2 finished local2 now sbox 6
325e1051a39Sopenharmony_ci
326e1051a39Sopenharmony_ci	ld	[global4+local4],local4   ! 4
327e1051a39Sopenharmony_ci	srl	out1, 16, local2          ! 6
328e1051a39Sopenharmony_ci	xor	$1, local3, $1            ! 3 finished local3 now sbox 5
329e1051a39Sopenharmony_ci
330e1051a39Sopenharmony_ci	ld	[out3+local0],local0      ! 8
331e1051a39Sopenharmony_ci	and	local2, 252, local2       ! 6
332e1051a39Sopenharmony_ci	add	global1, 1536, local5     ! address sbox 7
333e1051a39Sopenharmony_ci
334e1051a39Sopenharmony_ci	ld	[local6+local2], local2   ! 6
335e1051a39Sopenharmony_ci	srl	out0, 16, local3          ! 5
336e1051a39Sopenharmony_ci	xor	$1, local4, $1            ! 4 finished
337e1051a39Sopenharmony_ci
338e1051a39Sopenharmony_ci	ld	[local5+local1],local1    ! 7
339e1051a39Sopenharmony_ci	and	local3, 252, local3       ! 5
340e1051a39Sopenharmony_ci	xor	$1, local0, $1            ! 8 finished
341e1051a39Sopenharmony_ci
342e1051a39Sopenharmony_ci	ld	[global5+local3],local3   ! 5
343e1051a39Sopenharmony_ci	xor	$1, local2, $1            ! 6 finished
344e1051a39Sopenharmony_ci	subcc	out4, 1, out4
345e1051a39Sopenharmony_ci
346e1051a39Sopenharmony_ci	ld	[$5+$3*8+4], out0         ! key 8642 next round
347e1051a39Sopenharmony_ci	xor	$1, local7, local2        ! sbox 5 next round
348e1051a39Sopenharmony_ci	xor	$1, local1, $1            ! 7 finished
349e1051a39Sopenharmony_ci
350e1051a39Sopenharmony_ci	srl	local2, 16, local2        ! sbox 5 next round
351e1051a39Sopenharmony_ci	xor	$1, local3, $1            ! 5 finished
352e1051a39Sopenharmony_ci
353e1051a39Sopenharmony_ci	ld	[$5+$3*16+4], out1        ! key 8642 next round again
354e1051a39Sopenharmony_ci	and	local2, 252, local2       ! sbox5 next round
355e1051a39Sopenharmony_ci! next round
356e1051a39Sopenharmony_ci	xor	$1, local7, local7        ! 7531
357e1051a39Sopenharmony_ci
358e1051a39Sopenharmony_ci	ld	[global5+local2], local2  ! 5
359e1051a39Sopenharmony_ci	srl	local7, 24, local3        ! 7
360e1051a39Sopenharmony_ci	xor	$1, out0, out0            ! 8642
361e1051a39Sopenharmony_ci
362e1051a39Sopenharmony_ci	ldub	[out2+local3], local3     ! 7 (and 0xFC)
363e1051a39Sopenharmony_ci	srl	out0, 4, local0           ! rotate 4 right
364e1051a39Sopenharmony_ci	and	local7, 252, local1       ! 1
365e1051a39Sopenharmony_ci
366e1051a39Sopenharmony_ci	sll	out0, 28, out0            ! rotate
367e1051a39Sopenharmony_ci	xor	$2, local2, $2            ! 5 finished local2 used
368e1051a39Sopenharmony_ci
369e1051a39Sopenharmony_ci	srl	local0, 8, local4         ! 4
370e1051a39Sopenharmony_ci	and	local0, 252, local2       ! 2
371e1051a39Sopenharmony_ci	ld	[local5+local3], local3   ! 7
372e1051a39Sopenharmony_ci
373e1051a39Sopenharmony_ci	srl	local0, 16, local5        ! 6
374e1051a39Sopenharmony_ci	or	out0, local0, out0        ! rotate
375e1051a39Sopenharmony_ci	ld	[global2+local2], local2  ! 2
376e1051a39Sopenharmony_ci
377e1051a39Sopenharmony_ci	srl	out0, 24, local0
378e1051a39Sopenharmony_ci	ld	[$5+$3*16], out0          ! key 7531 next round
379e1051a39Sopenharmony_ci	and	local4, 252, local4	  ! 4
380e1051a39Sopenharmony_ci
381e1051a39Sopenharmony_ci	and	local5, 252, local5       ! 6
382e1051a39Sopenharmony_ci	ld	[global4+local4], local4  ! 4
383e1051a39Sopenharmony_ci	xor	$2, local3, $2            ! 7 finished local3 used
384e1051a39Sopenharmony_ci
385e1051a39Sopenharmony_ci	and	local0, 252, local0       ! 8
386e1051a39Sopenharmony_ci	ld	[local6+local5], local5   ! 6
387e1051a39Sopenharmony_ci	xor	$2, local2, $2            ! 2 finished local2 now sbox 3
388e1051a39Sopenharmony_ci
389e1051a39Sopenharmony_ci	srl	local7, 8, local2         ! 3 start
390e1051a39Sopenharmony_ci	ld	[out3+local0], local0     ! 8
391e1051a39Sopenharmony_ci	xor	$2, local4, $2            ! 4 finished
392e1051a39Sopenharmony_ci
393e1051a39Sopenharmony_ci	and	local2, 252, local2       ! 3
394e1051a39Sopenharmony_ci	ld	[global1+local1], local1  ! 1
395e1051a39Sopenharmony_ci	xor	$2, local5, $2            ! 6 finished local5 used
396e1051a39Sopenharmony_ci
397e1051a39Sopenharmony_ci	ld	[global3+local2], local2  ! 3
398e1051a39Sopenharmony_ci	xor	$2, local0, $2            ! 8 finished
399e1051a39Sopenharmony_ci	add	$5, $3*16, $5             ! enc add 8, dec add -8 to key pointer
400e1051a39Sopenharmony_ci
401e1051a39Sopenharmony_ci	ld	[out2+284], local5        ! 0x0000FC00
402e1051a39Sopenharmony_ci	xor	$2, out0, local4          ! sbox 1 next round
403e1051a39Sopenharmony_ci	xor	$2, local1, $2            ! 1 finished
404e1051a39Sopenharmony_ci
405e1051a39Sopenharmony_ci	xor	$2, local2, $2            ! 3 finished
406e1051a39Sopenharmony_ci	bne	$4
407e1051a39Sopenharmony_ci	and	local4, 252, local1       ! sbox 1 next round
408e1051a39Sopenharmony_ci
409e1051a39Sopenharmony_ci! two rounds more:
410e1051a39Sopenharmony_ci
411e1051a39Sopenharmony_ci	ld	[global1+local1], local1
412e1051a39Sopenharmony_ci	xor	$2, out1, out1
413e1051a39Sopenharmony_ci	xor	$2, out0, out0
414e1051a39Sopenharmony_ci
415e1051a39Sopenharmony_ci	srl	out1, 4, local0           ! rotate
416e1051a39Sopenharmony_ci	and	out0, local5, local3
417e1051a39Sopenharmony_ci
418e1051a39Sopenharmony_ci	ld	[$5+$3*8], local7         ! key 7531
419e1051a39Sopenharmony_ci	srl	local3, 8, local3
420e1051a39Sopenharmony_ci	and	local0, 252, local2
421e1051a39Sopenharmony_ci
422e1051a39Sopenharmony_ci	ld	[global3+local3],local3
423e1051a39Sopenharmony_ci	sll	out1, 28, out1            ! rotate
424e1051a39Sopenharmony_ci	xor	$1, local1, $1            ! 1 finished, local1 now sbox 7
425e1051a39Sopenharmony_ci
426e1051a39Sopenharmony_ci	ld	[global2+local2], local2
427e1051a39Sopenharmony_ci	srl	out0, 24, local1
428e1051a39Sopenharmony_ci	or	out1, local0, out1        ! rotate
429e1051a39Sopenharmony_ci
430e1051a39Sopenharmony_ci	ldub	[out2+local1], local1
431e1051a39Sopenharmony_ci	srl	out1, 24, local0
432e1051a39Sopenharmony_ci	and	out1, local5, local4
433e1051a39Sopenharmony_ci
434e1051a39Sopenharmony_ci	ldub	[out2+local0], local0
435e1051a39Sopenharmony_ci	srl	local4, 8, local4
436e1051a39Sopenharmony_ci	xor	$1, local2, $1            ! 2 finished local2 now sbox 6
437e1051a39Sopenharmony_ci
438e1051a39Sopenharmony_ci	ld	[global4+local4],local4
439e1051a39Sopenharmony_ci	srl	out1, 16, local2
440e1051a39Sopenharmony_ci	xor	$1, local3, $1            ! 3 finished local3 now sbox 5
441e1051a39Sopenharmony_ci
442e1051a39Sopenharmony_ci	ld	[out3+local0],local0
443e1051a39Sopenharmony_ci	and	local2, 252, local2
444e1051a39Sopenharmony_ci	add	global1, 1536, local5     ! address sbox 7
445e1051a39Sopenharmony_ci
446e1051a39Sopenharmony_ci	ld	[local6+local2], local2
447e1051a39Sopenharmony_ci	srl	out0, 16, local3
448e1051a39Sopenharmony_ci	xor	$1, local4, $1            ! 4 finished
449e1051a39Sopenharmony_ci
450e1051a39Sopenharmony_ci	ld	[local5+local1],local1
451e1051a39Sopenharmony_ci	and	local3, 252, local3
452e1051a39Sopenharmony_ci	xor	$1, local0, $1
453e1051a39Sopenharmony_ci
454e1051a39Sopenharmony_ci	ld	[global5+local3],local3
455e1051a39Sopenharmony_ci	xor	$1, local2, $1            ! 6 finished
456e1051a39Sopenharmony_ci	cmp	in2, 8
457e1051a39Sopenharmony_ci
458e1051a39Sopenharmony_ci	ifelse($6,{}, {}, {ld	[out2+280], out4})  ! loop counter
459e1051a39Sopenharmony_ci	xor	$1, local7, local2        ! sbox 5 next round
460e1051a39Sopenharmony_ci	xor	$1, local1, $1            ! 7 finished
461e1051a39Sopenharmony_ci
462e1051a39Sopenharmony_ci	ld	[$5+$3*8+4], out0
463e1051a39Sopenharmony_ci	srl	local2, 16, local2        ! sbox 5 next round
464e1051a39Sopenharmony_ci	xor	$1, local3, $1            ! 5 finished
465e1051a39Sopenharmony_ci
466e1051a39Sopenharmony_ci	and	local2, 252, local2
467e1051a39Sopenharmony_ci! next round (two rounds more)
468e1051a39Sopenharmony_ci	xor	$1, local7, local7        ! 7531
469e1051a39Sopenharmony_ci
470e1051a39Sopenharmony_ci	ld	[global5+local2], local2
471e1051a39Sopenharmony_ci	srl	local7, 24, local3
472e1051a39Sopenharmony_ci	xor	$1, out0, out0            ! 8642
473e1051a39Sopenharmony_ci
474e1051a39Sopenharmony_ci	ldub	[out2+local3], local3
475e1051a39Sopenharmony_ci	srl	out0, 4, local0           ! rotate
476e1051a39Sopenharmony_ci	and	local7, 252, local1
477e1051a39Sopenharmony_ci
478e1051a39Sopenharmony_ci	sll	out0, 28, out0            ! rotate
479e1051a39Sopenharmony_ci	xor	$2, local2, $2            ! 5 finished local2 used
480e1051a39Sopenharmony_ci
481e1051a39Sopenharmony_ci	srl	local0, 8, local4
482e1051a39Sopenharmony_ci	and	local0, 252, local2
483e1051a39Sopenharmony_ci	ld	[local5+local3], local3
484e1051a39Sopenharmony_ci
485e1051a39Sopenharmony_ci	srl	local0, 16, local5
486e1051a39Sopenharmony_ci	or	out0, local0, out0        ! rotate
487e1051a39Sopenharmony_ci	ld	[global2+local2], local2
488e1051a39Sopenharmony_ci
489e1051a39Sopenharmony_ci	srl	out0, 24, local0
490e1051a39Sopenharmony_ci	ifelse($6,{}, {}, {ld	[$6], out0})   ! key next encryption/decryption
491e1051a39Sopenharmony_ci	and	local4, 252, local4
492e1051a39Sopenharmony_ci
493e1051a39Sopenharmony_ci	and	local5, 252, local5
494e1051a39Sopenharmony_ci	ld	[global4+local4], local4
495e1051a39Sopenharmony_ci	xor	$2, local3, $2            ! 7 finished local3 used
496e1051a39Sopenharmony_ci
497e1051a39Sopenharmony_ci	and	local0, 252, local0
498e1051a39Sopenharmony_ci	ld	[local6+local5], local5
499e1051a39Sopenharmony_ci	xor	$2, local2, $2            ! 2 finished local2 now sbox 3
500e1051a39Sopenharmony_ci
501e1051a39Sopenharmony_ci	srl	local7, 8, local2         ! 3 start
502e1051a39Sopenharmony_ci	ld	[out3+local0], local0
503e1051a39Sopenharmony_ci	xor	$2, local4, $2
504e1051a39Sopenharmony_ci
505e1051a39Sopenharmony_ci	and	local2, 252, local2
506e1051a39Sopenharmony_ci	ld	[global1+local1], local1
507e1051a39Sopenharmony_ci	xor	$2, local5, $2            ! 6 finished local5 used
508e1051a39Sopenharmony_ci
509e1051a39Sopenharmony_ci	ld	[global3+local2], local2
510e1051a39Sopenharmony_ci	srl	$1, 3, local3
511e1051a39Sopenharmony_ci	xor	$2, local0, $2
512e1051a39Sopenharmony_ci
513e1051a39Sopenharmony_ci	ifelse($6,{}, {}, {ld	[$6+4], out1}) ! key next encryption/decryption
514e1051a39Sopenharmony_ci	sll	$1, 29, local4
515e1051a39Sopenharmony_ci	xor	$2, local1, $2
516e1051a39Sopenharmony_ci
517e1051a39Sopenharmony_ci	ifelse($7,{}, {}, {retl})
518e1051a39Sopenharmony_ci	xor	$2, local2, $2
519e1051a39Sopenharmony_ci})
520e1051a39Sopenharmony_ci
521e1051a39Sopenharmony_ci
522e1051a39Sopenharmony_ci! {fp_macro}
523e1051a39Sopenharmony_ci!
524e1051a39Sopenharmony_ci!  parameter 1   right (original left)
525e1051a39Sopenharmony_ci!  parameter 2   left (original right)
526e1051a39Sopenharmony_ci!  parameter 3   1 for optional store to [in0]
527e1051a39Sopenharmony_ci!  parameter 4   1 for load input/output address to local5/7
528e1051a39Sopenharmony_ci!
529e1051a39Sopenharmony_ci!  The final permutation logic switches the halves, meaning that
530e1051a39Sopenharmony_ci!  left and right ends up the registers originally used.
531e1051a39Sopenharmony_ci
532e1051a39Sopenharmony_cidefine(fp_macro, {
533e1051a39Sopenharmony_ci
534e1051a39Sopenharmony_ci! {fp_macro}
535e1051a39Sopenharmony_ci! $1 $2 $3 $4 $5 $6 $7 $8 $9
536e1051a39Sopenharmony_ci
537e1051a39Sopenharmony_ci	! initially undo the rotate 3 left done after initial permutation
538e1051a39Sopenharmony_ci	! original left is received shifted 3 right and 29 left in local3/4
539e1051a39Sopenharmony_ci
540e1051a39Sopenharmony_ci	sll	$2, 29, local1
541e1051a39Sopenharmony_ci	or	local3, local4, $1
542e1051a39Sopenharmony_ci
543e1051a39Sopenharmony_ci	srl	$2, 3, $2
544e1051a39Sopenharmony_ci	sethi	%hi(0x55555555), local2
545e1051a39Sopenharmony_ci
546e1051a39Sopenharmony_ci	or	$2, local1, $2
547e1051a39Sopenharmony_ci	or	local2, %lo(0x55555555), local2
548e1051a39Sopenharmony_ci
549e1051a39Sopenharmony_ci	srl	$2, 1, local3
550e1051a39Sopenharmony_ci	sethi	%hi(0x00ff00ff), local1
551e1051a39Sopenharmony_ci	xor	local3, $1, local3
552e1051a39Sopenharmony_ci	or	local1, %lo(0x00ff00ff), local1
553e1051a39Sopenharmony_ci	and	local3, local2, local3
554e1051a39Sopenharmony_ci	sethi	%hi(0x33333333), local4
555e1051a39Sopenharmony_ci	sll	local3, 1, local2
556e1051a39Sopenharmony_ci
557e1051a39Sopenharmony_ci	xor	$1, local3, $1
558e1051a39Sopenharmony_ci
559e1051a39Sopenharmony_ci	srl	$1, 8, local3
560e1051a39Sopenharmony_ci	xor	$2, local2, $2
561e1051a39Sopenharmony_ci	xor	local3, $2, local3
562e1051a39Sopenharmony_ci	or	local4, %lo(0x33333333), local4
563e1051a39Sopenharmony_ci	and	local3, local1, local3
564e1051a39Sopenharmony_ci	sethi	%hi(0x0000ffff), local1
565e1051a39Sopenharmony_ci	sll	local3, 8, local2
566e1051a39Sopenharmony_ci
567e1051a39Sopenharmony_ci	xor	$2, local3, $2
568e1051a39Sopenharmony_ci
569e1051a39Sopenharmony_ci	srl	$2, 2, local3
570e1051a39Sopenharmony_ci	xor	$1, local2, $1
571e1051a39Sopenharmony_ci	xor	local3, $1, local3
572e1051a39Sopenharmony_ci	or	local1, %lo(0x0000ffff), local1
573e1051a39Sopenharmony_ci	and	local3, local4, local3
574e1051a39Sopenharmony_ci	sethi	%hi(0x0f0f0f0f), local4
575e1051a39Sopenharmony_ci	sll	local3, 2, local2
576e1051a39Sopenharmony_ci
577e1051a39Sopenharmony_ci	ifelse($4,1, {LDPTR INPUT, local5})
578e1051a39Sopenharmony_ci	xor	$1, local3, $1
579e1051a39Sopenharmony_ci
580e1051a39Sopenharmony_ci	ifelse($4,1, {LDPTR OUTPUT, local7})
581e1051a39Sopenharmony_ci	srl	$1, 16, local3
582e1051a39Sopenharmony_ci	xor	$2, local2, $2
583e1051a39Sopenharmony_ci	xor	local3, $2, local3
584e1051a39Sopenharmony_ci	or	local4, %lo(0x0f0f0f0f), local4
585e1051a39Sopenharmony_ci	and	local3, local1, local3
586e1051a39Sopenharmony_ci	sll	local3, 16, local2
587e1051a39Sopenharmony_ci
588e1051a39Sopenharmony_ci	xor	$2, local3, local1
589e1051a39Sopenharmony_ci
590e1051a39Sopenharmony_ci	srl	local1, 4, local3
591e1051a39Sopenharmony_ci	xor	$1, local2, $1
592e1051a39Sopenharmony_ci	xor	local3, $1, local3
593e1051a39Sopenharmony_ci	and	local3, local4, local3
594e1051a39Sopenharmony_ci	sll	local3, 4, local2
595e1051a39Sopenharmony_ci
596e1051a39Sopenharmony_ci	xor	$1, local3, $1
597e1051a39Sopenharmony_ci
598e1051a39Sopenharmony_ci	! optional store:
599e1051a39Sopenharmony_ci
600e1051a39Sopenharmony_ci	ifelse($3,1, {st $1, [in0]})
601e1051a39Sopenharmony_ci
602e1051a39Sopenharmony_ci	xor	local1, local2, $2
603e1051a39Sopenharmony_ci
604e1051a39Sopenharmony_ci	ifelse($3,1, {st $2, [in0+4]})
605e1051a39Sopenharmony_ci
606e1051a39Sopenharmony_ci})
607e1051a39Sopenharmony_ci
608e1051a39Sopenharmony_ci
609e1051a39Sopenharmony_ci! {fp_ip_macro}
610e1051a39Sopenharmony_ci!
611e1051a39Sopenharmony_ci! Does initial permutation for next block mixed with
612e1051a39Sopenharmony_ci! final permutation for current block.
613e1051a39Sopenharmony_ci!
614e1051a39Sopenharmony_ci! parameter 1   original left
615e1051a39Sopenharmony_ci! parameter 2   original right
616e1051a39Sopenharmony_ci! parameter 3   left ip
617e1051a39Sopenharmony_ci! parameter 4   right ip
618e1051a39Sopenharmony_ci! parameter 5   1: load ks1/ks2 to in3/in4, add 120 to in4
619e1051a39Sopenharmony_ci!                2: mov in4 to in3
620e1051a39Sopenharmony_ci!
621e1051a39Sopenharmony_ci! also adds -8 to length in2 and loads loop counter to out4
622e1051a39Sopenharmony_ci
623e1051a39Sopenharmony_cidefine(fp_ip_macro, {
624e1051a39Sopenharmony_ci
625e1051a39Sopenharmony_ci! {fp_ip_macro}
626e1051a39Sopenharmony_ci! $1 $2 $3 $4 $5 $6 $7 $8 $9
627e1051a39Sopenharmony_ci
628e1051a39Sopenharmony_ci	define({temp1},{out4})
629e1051a39Sopenharmony_ci	define({temp2},{local3})
630e1051a39Sopenharmony_ci
631e1051a39Sopenharmony_ci	define({ip1},{local1})
632e1051a39Sopenharmony_ci	define({ip2},{local2})
633e1051a39Sopenharmony_ci	define({ip4},{local4})
634e1051a39Sopenharmony_ci	define({ip5},{local5})
635e1051a39Sopenharmony_ci
636e1051a39Sopenharmony_ci	! $1 in local3, local4
637e1051a39Sopenharmony_ci
638e1051a39Sopenharmony_ci	ld	[out2+256], ip1
639e1051a39Sopenharmony_ci	sll	out5, 29, temp1
640e1051a39Sopenharmony_ci	or	local3, local4, $1
641e1051a39Sopenharmony_ci
642e1051a39Sopenharmony_ci	srl	out5, 3, $2
643e1051a39Sopenharmony_ci	ifelse($5,2,{mov in4, in3})
644e1051a39Sopenharmony_ci
645e1051a39Sopenharmony_ci	ld	[out2+272], ip5
646e1051a39Sopenharmony_ci	srl	$4, 4, local0
647e1051a39Sopenharmony_ci	or	$2, temp1, $2
648e1051a39Sopenharmony_ci
649e1051a39Sopenharmony_ci	srl	$2, 1, temp1
650e1051a39Sopenharmony_ci	xor	temp1, $1, temp1
651e1051a39Sopenharmony_ci
652e1051a39Sopenharmony_ci	and	temp1, ip5, temp1
653e1051a39Sopenharmony_ci	xor	local0, $3, local0
654e1051a39Sopenharmony_ci
655e1051a39Sopenharmony_ci	sll	temp1, 1, temp2
656e1051a39Sopenharmony_ci	xor	$1, temp1, $1
657e1051a39Sopenharmony_ci
658e1051a39Sopenharmony_ci	and	local0, ip1, local0
659e1051a39Sopenharmony_ci	add	in2, -8, in2
660e1051a39Sopenharmony_ci
661e1051a39Sopenharmony_ci	sll	local0, 4, local7
662e1051a39Sopenharmony_ci	xor	$3, local0, $3
663e1051a39Sopenharmony_ci
664e1051a39Sopenharmony_ci	ld	[out2+268], ip4
665e1051a39Sopenharmony_ci	srl	$1, 8, temp1
666e1051a39Sopenharmony_ci	xor	$2, temp2, $2
667e1051a39Sopenharmony_ci	ld	[out2+260], ip2
668e1051a39Sopenharmony_ci	srl	$3, 16, local0
669e1051a39Sopenharmony_ci	xor	$4, local7, $4
670e1051a39Sopenharmony_ci	xor	temp1, $2, temp1
671e1051a39Sopenharmony_ci	xor	local0, $4, local0
672e1051a39Sopenharmony_ci	and	temp1, ip4, temp1
673e1051a39Sopenharmony_ci	and	local0, ip2, local0
674e1051a39Sopenharmony_ci	sll	temp1, 8, temp2
675e1051a39Sopenharmony_ci	xor	$2, temp1, $2
676e1051a39Sopenharmony_ci	sll	local0, 16, local7
677e1051a39Sopenharmony_ci	xor	$4, local0, $4
678e1051a39Sopenharmony_ci
679e1051a39Sopenharmony_ci	srl	$2, 2, temp1
680e1051a39Sopenharmony_ci	xor	$1, temp2, $1
681e1051a39Sopenharmony_ci
682e1051a39Sopenharmony_ci	ld	[out2+264], temp2         ! ip3
683e1051a39Sopenharmony_ci	srl	$4, 2, local0
684e1051a39Sopenharmony_ci	xor	$3, local7, $3
685e1051a39Sopenharmony_ci	xor	temp1, $1, temp1
686e1051a39Sopenharmony_ci	xor	local0, $3, local0
687e1051a39Sopenharmony_ci	and	temp1, temp2, temp1
688e1051a39Sopenharmony_ci	and	local0, temp2, local0
689e1051a39Sopenharmony_ci	sll	temp1, 2, temp2
690e1051a39Sopenharmony_ci	xor	$1, temp1, $1
691e1051a39Sopenharmony_ci	sll	local0, 2, local7
692e1051a39Sopenharmony_ci	xor	$3, local0, $3
693e1051a39Sopenharmony_ci
694e1051a39Sopenharmony_ci	srl	$1, 16, temp1
695e1051a39Sopenharmony_ci	xor	$2, temp2, $2
696e1051a39Sopenharmony_ci	srl	$3, 8, local0
697e1051a39Sopenharmony_ci	xor	$4, local7, $4
698e1051a39Sopenharmony_ci	xor	temp1, $2, temp1
699e1051a39Sopenharmony_ci	xor	local0, $4, local0
700e1051a39Sopenharmony_ci	and	temp1, ip2, temp1
701e1051a39Sopenharmony_ci	and	local0, ip4, local0
702e1051a39Sopenharmony_ci	sll	temp1, 16, temp2
703e1051a39Sopenharmony_ci	xor	$2, temp1, local4
704e1051a39Sopenharmony_ci	sll	local0, 8, local7
705e1051a39Sopenharmony_ci	xor	$4, local0, $4
706e1051a39Sopenharmony_ci
707e1051a39Sopenharmony_ci	srl	$4, 1, local0
708e1051a39Sopenharmony_ci	xor	$3, local7, $3
709e1051a39Sopenharmony_ci
710e1051a39Sopenharmony_ci	srl	local4, 4, temp1
711e1051a39Sopenharmony_ci	xor	local0, $3, local0
712e1051a39Sopenharmony_ci
713e1051a39Sopenharmony_ci	xor	$1, temp2, $1
714e1051a39Sopenharmony_ci	and	local0, ip5, local0
715e1051a39Sopenharmony_ci
716e1051a39Sopenharmony_ci	sll	local0, 1, local7
717e1051a39Sopenharmony_ci	xor	temp1, $1, temp1
718e1051a39Sopenharmony_ci
719e1051a39Sopenharmony_ci	xor	$3, local0, $3
720e1051a39Sopenharmony_ci	xor	$4, local7, $4
721e1051a39Sopenharmony_ci
722e1051a39Sopenharmony_ci	sll	$3, 3, local5
723e1051a39Sopenharmony_ci	and	temp1, ip1, temp1
724e1051a39Sopenharmony_ci
725e1051a39Sopenharmony_ci	sll	temp1, 4, temp2
726e1051a39Sopenharmony_ci	xor	$1, temp1, $1
727e1051a39Sopenharmony_ci
728e1051a39Sopenharmony_ci	ifelse($5,1,{LDPTR	KS2, in4})
729e1051a39Sopenharmony_ci	sll	$4, 3, local2
730e1051a39Sopenharmony_ci	xor	local4, temp2, $2
731e1051a39Sopenharmony_ci
732e1051a39Sopenharmony_ci	! reload since used as temporary:
733e1051a39Sopenharmony_ci
734e1051a39Sopenharmony_ci	ld	[out2+280], out4          ! loop counter
735e1051a39Sopenharmony_ci
736e1051a39Sopenharmony_ci	srl	$3, 29, local0
737e1051a39Sopenharmony_ci	ifelse($5,1,{add in4, 120, in4})
738e1051a39Sopenharmony_ci
739e1051a39Sopenharmony_ci	ifelse($5,1,{LDPTR	KS1, in3})
740e1051a39Sopenharmony_ci	srl	$4, 29, local7
741e1051a39Sopenharmony_ci
742e1051a39Sopenharmony_ci	or	local0, local5, $4
743e1051a39Sopenharmony_ci	or	local2, local7, $3
744e1051a39Sopenharmony_ci
745e1051a39Sopenharmony_ci})
746e1051a39Sopenharmony_ci
747e1051a39Sopenharmony_ci
748e1051a39Sopenharmony_ci
749e1051a39Sopenharmony_ci! {load_little_endian}
750e1051a39Sopenharmony_ci!
751e1051a39Sopenharmony_ci! parameter 1  address
752e1051a39Sopenharmony_ci! parameter 2  destination left
753e1051a39Sopenharmony_ci! parameter 3  destination right
754e1051a39Sopenharmony_ci! parameter 4  temporary
755e1051a39Sopenharmony_ci! parameter 5  label
756e1051a39Sopenharmony_ci
757e1051a39Sopenharmony_cidefine(load_little_endian, {
758e1051a39Sopenharmony_ci
759e1051a39Sopenharmony_ci! {load_little_endian}
760e1051a39Sopenharmony_ci! $1 $2 $3 $4 $5 $6 $7 $8 $9
761e1051a39Sopenharmony_ci
762e1051a39Sopenharmony_ci	! first in memory to rightmost in register
763e1051a39Sopenharmony_ci
764e1051a39Sopenharmony_ci$5:
765e1051a39Sopenharmony_ci	ldub	[$1+3], $2
766e1051a39Sopenharmony_ci
767e1051a39Sopenharmony_ci	ldub	[$1+2], $4
768e1051a39Sopenharmony_ci	sll	$2, 8, $2
769e1051a39Sopenharmony_ci	or	$2, $4, $2
770e1051a39Sopenharmony_ci
771e1051a39Sopenharmony_ci	ldub	[$1+1], $4
772e1051a39Sopenharmony_ci	sll	$2, 8, $2
773e1051a39Sopenharmony_ci	or	$2, $4, $2
774e1051a39Sopenharmony_ci
775e1051a39Sopenharmony_ci	ldub	[$1+0], $4
776e1051a39Sopenharmony_ci	sll	$2, 8, $2
777e1051a39Sopenharmony_ci	or	$2, $4, $2
778e1051a39Sopenharmony_ci
779e1051a39Sopenharmony_ci
780e1051a39Sopenharmony_ci	ldub	[$1+3+4], $3
781e1051a39Sopenharmony_ci
782e1051a39Sopenharmony_ci	ldub	[$1+2+4], $4
783e1051a39Sopenharmony_ci	sll	$3, 8, $3
784e1051a39Sopenharmony_ci	or	$3, $4, $3
785e1051a39Sopenharmony_ci
786e1051a39Sopenharmony_ci	ldub	[$1+1+4], $4
787e1051a39Sopenharmony_ci	sll	$3, 8, $3
788e1051a39Sopenharmony_ci	or	$3, $4, $3
789e1051a39Sopenharmony_ci
790e1051a39Sopenharmony_ci	ldub	[$1+0+4], $4
791e1051a39Sopenharmony_ci	sll	$3, 8, $3
792e1051a39Sopenharmony_ci	or	$3, $4, $3
793e1051a39Sopenharmony_ci$5a:
794e1051a39Sopenharmony_ci
795e1051a39Sopenharmony_ci})
796e1051a39Sopenharmony_ci
797e1051a39Sopenharmony_ci
798e1051a39Sopenharmony_ci! {load_little_endian_inc}
799e1051a39Sopenharmony_ci!
800e1051a39Sopenharmony_ci! parameter 1  address
801e1051a39Sopenharmony_ci! parameter 2  destination left
802e1051a39Sopenharmony_ci! parameter 3  destination right
803e1051a39Sopenharmony_ci! parameter 4  temporary
804e1051a39Sopenharmony_ci! parameter 4  label
805e1051a39Sopenharmony_ci!
806e1051a39Sopenharmony_ci! adds 8 to address
807e1051a39Sopenharmony_ci
808e1051a39Sopenharmony_cidefine(load_little_endian_inc, {
809e1051a39Sopenharmony_ci
810e1051a39Sopenharmony_ci! {load_little_endian_inc}
811e1051a39Sopenharmony_ci! $1 $2 $3 $4 $5 $6 $7 $8 $9
812e1051a39Sopenharmony_ci
813e1051a39Sopenharmony_ci	! first in memory to rightmost in register
814e1051a39Sopenharmony_ci
815e1051a39Sopenharmony_ci$5:
816e1051a39Sopenharmony_ci	ldub	[$1+3], $2
817e1051a39Sopenharmony_ci
818e1051a39Sopenharmony_ci	ldub	[$1+2], $4
819e1051a39Sopenharmony_ci	sll	$2, 8, $2
820e1051a39Sopenharmony_ci	or	$2, $4, $2
821e1051a39Sopenharmony_ci
822e1051a39Sopenharmony_ci	ldub	[$1+1], $4
823e1051a39Sopenharmony_ci	sll	$2, 8, $2
824e1051a39Sopenharmony_ci	or	$2, $4, $2
825e1051a39Sopenharmony_ci
826e1051a39Sopenharmony_ci	ldub	[$1+0], $4
827e1051a39Sopenharmony_ci	sll	$2, 8, $2
828e1051a39Sopenharmony_ci	or	$2, $4, $2
829e1051a39Sopenharmony_ci
830e1051a39Sopenharmony_ci	ldub	[$1+3+4], $3
831e1051a39Sopenharmony_ci	add	$1, 8, $1
832e1051a39Sopenharmony_ci
833e1051a39Sopenharmony_ci	ldub	[$1+2+4-8], $4
834e1051a39Sopenharmony_ci	sll	$3, 8, $3
835e1051a39Sopenharmony_ci	or	$3, $4, $3
836e1051a39Sopenharmony_ci
837e1051a39Sopenharmony_ci	ldub	[$1+1+4-8], $4
838e1051a39Sopenharmony_ci	sll	$3, 8, $3
839e1051a39Sopenharmony_ci	or	$3, $4, $3
840e1051a39Sopenharmony_ci
841e1051a39Sopenharmony_ci	ldub	[$1+0+4-8], $4
842e1051a39Sopenharmony_ci	sll	$3, 8, $3
843e1051a39Sopenharmony_ci	or	$3, $4, $3
844e1051a39Sopenharmony_ci$5a:
845e1051a39Sopenharmony_ci
846e1051a39Sopenharmony_ci})
847e1051a39Sopenharmony_ci
848e1051a39Sopenharmony_ci
849e1051a39Sopenharmony_ci! {load_n_bytes}
850e1051a39Sopenharmony_ci!
851e1051a39Sopenharmony_ci! Loads 1 to 7 bytes little endian
852e1051a39Sopenharmony_ci! Remaining bytes are zeroed.
853e1051a39Sopenharmony_ci!
854e1051a39Sopenharmony_ci! parameter 1  address
855e1051a39Sopenharmony_ci! parameter 2  length
856e1051a39Sopenharmony_ci! parameter 3  destination register left
857e1051a39Sopenharmony_ci! parameter 4  destination register right
858e1051a39Sopenharmony_ci! parameter 5  temp
859e1051a39Sopenharmony_ci! parameter 6  temp2
860e1051a39Sopenharmony_ci! parameter 7  label
861e1051a39Sopenharmony_ci! parameter 8  return label
862e1051a39Sopenharmony_ci
863e1051a39Sopenharmony_cidefine(load_n_bytes, {
864e1051a39Sopenharmony_ci
865e1051a39Sopenharmony_ci! {load_n_bytes}
866e1051a39Sopenharmony_ci! $1 $2 $5 $6 $7 $8 $7 $8 $9
867e1051a39Sopenharmony_ci
868e1051a39Sopenharmony_ci$7.0:	call	.+8
869e1051a39Sopenharmony_ci	sll	$2, 2, $6
870e1051a39Sopenharmony_ci
871e1051a39Sopenharmony_ci	add	%o7,$7.jmp.table-$7.0,$5
872e1051a39Sopenharmony_ci
873e1051a39Sopenharmony_ci	add	$5, $6, $5
874e1051a39Sopenharmony_ci	mov	0, $4
875e1051a39Sopenharmony_ci
876e1051a39Sopenharmony_ci	ld	[$5], $5
877e1051a39Sopenharmony_ci
878e1051a39Sopenharmony_ci	jmp	%o7+$5
879e1051a39Sopenharmony_ci	mov	0, $3
880e1051a39Sopenharmony_ci
881e1051a39Sopenharmony_ci$7.7:
882e1051a39Sopenharmony_ci	ldub	[$1+6], $5
883e1051a39Sopenharmony_ci	sll	$5, 16, $5
884e1051a39Sopenharmony_ci	or	$3, $5, $3
885e1051a39Sopenharmony_ci$7.6:
886e1051a39Sopenharmony_ci	ldub	[$1+5], $5
887e1051a39Sopenharmony_ci	sll	$5, 8, $5
888e1051a39Sopenharmony_ci	or	$3, $5, $3
889e1051a39Sopenharmony_ci$7.5:
890e1051a39Sopenharmony_ci	ldub	[$1+4], $5
891e1051a39Sopenharmony_ci	or	$3, $5, $3
892e1051a39Sopenharmony_ci$7.4:
893e1051a39Sopenharmony_ci	ldub	[$1+3], $5
894e1051a39Sopenharmony_ci	sll	$5, 24, $5
895e1051a39Sopenharmony_ci	or	$4, $5, $4
896e1051a39Sopenharmony_ci$7.3:
897e1051a39Sopenharmony_ci	ldub	[$1+2], $5
898e1051a39Sopenharmony_ci	sll	$5, 16, $5
899e1051a39Sopenharmony_ci	or	$4, $5, $4
900e1051a39Sopenharmony_ci$7.2:
901e1051a39Sopenharmony_ci	ldub	[$1+1], $5
902e1051a39Sopenharmony_ci	sll	$5, 8, $5
903e1051a39Sopenharmony_ci	or	$4, $5, $4
904e1051a39Sopenharmony_ci$7.1:
905e1051a39Sopenharmony_ci	ldub	[$1+0], $5
906e1051a39Sopenharmony_ci	ba	$8
907e1051a39Sopenharmony_ci	or	$4, $5, $4
908e1051a39Sopenharmony_ci
909e1051a39Sopenharmony_ci	.align 4
910e1051a39Sopenharmony_ci
911e1051a39Sopenharmony_ci$7.jmp.table:
912e1051a39Sopenharmony_ci	.word	0
913e1051a39Sopenharmony_ci	.word	$7.1-$7.0
914e1051a39Sopenharmony_ci	.word	$7.2-$7.0
915e1051a39Sopenharmony_ci	.word	$7.3-$7.0
916e1051a39Sopenharmony_ci	.word	$7.4-$7.0
917e1051a39Sopenharmony_ci	.word	$7.5-$7.0
918e1051a39Sopenharmony_ci	.word	$7.6-$7.0
919e1051a39Sopenharmony_ci	.word	$7.7-$7.0
920e1051a39Sopenharmony_ci})
921e1051a39Sopenharmony_ci
922e1051a39Sopenharmony_ci
923e1051a39Sopenharmony_ci! {store_little_endian}
924e1051a39Sopenharmony_ci!
925e1051a39Sopenharmony_ci! parameter 1  address
926e1051a39Sopenharmony_ci! parameter 2  source left
927e1051a39Sopenharmony_ci! parameter 3  source right
928e1051a39Sopenharmony_ci! parameter 4  temporary
929e1051a39Sopenharmony_ci
930e1051a39Sopenharmony_cidefine(store_little_endian, {
931e1051a39Sopenharmony_ci
932e1051a39Sopenharmony_ci! {store_little_endian}
933e1051a39Sopenharmony_ci! $1 $2 $3 $4 $5 $6 $7 $8 $9
934e1051a39Sopenharmony_ci
935e1051a39Sopenharmony_ci	! rightmost in register to first in memory
936e1051a39Sopenharmony_ci
937e1051a39Sopenharmony_ci$5:
938e1051a39Sopenharmony_ci	and	$2, 255, $4
939e1051a39Sopenharmony_ci	stub	$4, [$1+0]
940e1051a39Sopenharmony_ci
941e1051a39Sopenharmony_ci	srl	$2, 8, $4
942e1051a39Sopenharmony_ci	and	$4, 255, $4
943e1051a39Sopenharmony_ci	stub	$4, [$1+1]
944e1051a39Sopenharmony_ci
945e1051a39Sopenharmony_ci	srl	$2, 16, $4
946e1051a39Sopenharmony_ci	and	$4, 255, $4
947e1051a39Sopenharmony_ci	stub	$4, [$1+2]
948e1051a39Sopenharmony_ci
949e1051a39Sopenharmony_ci	srl	$2, 24, $4
950e1051a39Sopenharmony_ci	stub	$4, [$1+3]
951e1051a39Sopenharmony_ci
952e1051a39Sopenharmony_ci
953e1051a39Sopenharmony_ci	and	$3, 255, $4
954e1051a39Sopenharmony_ci	stub	$4, [$1+0+4]
955e1051a39Sopenharmony_ci
956e1051a39Sopenharmony_ci	srl	$3, 8, $4
957e1051a39Sopenharmony_ci	and	$4, 255, $4
958e1051a39Sopenharmony_ci	stub	$4, [$1+1+4]
959e1051a39Sopenharmony_ci
960e1051a39Sopenharmony_ci	srl	$3, 16, $4
961e1051a39Sopenharmony_ci	and	$4, 255, $4
962e1051a39Sopenharmony_ci	stub	$4, [$1+2+4]
963e1051a39Sopenharmony_ci
964e1051a39Sopenharmony_ci	srl	$3, 24, $4
965e1051a39Sopenharmony_ci	stub	$4, [$1+3+4]
966e1051a39Sopenharmony_ci
967e1051a39Sopenharmony_ci$5a:
968e1051a39Sopenharmony_ci
969e1051a39Sopenharmony_ci})
970e1051a39Sopenharmony_ci
971e1051a39Sopenharmony_ci
972e1051a39Sopenharmony_ci! {store_n_bytes}
973e1051a39Sopenharmony_ci!
974e1051a39Sopenharmony_ci! Stores 1 to 7 bytes little endian
975e1051a39Sopenharmony_ci!
976e1051a39Sopenharmony_ci! parameter 1  address
977e1051a39Sopenharmony_ci! parameter 2  length
978e1051a39Sopenharmony_ci! parameter 3  source register left
979e1051a39Sopenharmony_ci! parameter 4  source register right
980e1051a39Sopenharmony_ci! parameter 5  temp
981e1051a39Sopenharmony_ci! parameter 6  temp2
982e1051a39Sopenharmony_ci! parameter 7  label
983e1051a39Sopenharmony_ci! parameter 8  return label
984e1051a39Sopenharmony_ci
985e1051a39Sopenharmony_cidefine(store_n_bytes, {
986e1051a39Sopenharmony_ci
987e1051a39Sopenharmony_ci! {store_n_bytes}
988e1051a39Sopenharmony_ci! $1 $2 $5 $6 $7 $8 $7 $8 $9
989e1051a39Sopenharmony_ci
990e1051a39Sopenharmony_ci$7.0:	call	.+8
991e1051a39Sopenharmony_ci	sll	$2, 2, $6
992e1051a39Sopenharmony_ci
993e1051a39Sopenharmony_ci	add	%o7,$7.jmp.table-$7.0,$5
994e1051a39Sopenharmony_ci
995e1051a39Sopenharmony_ci	add	$5, $6, $5
996e1051a39Sopenharmony_ci
997e1051a39Sopenharmony_ci	ld	[$5], $5
998e1051a39Sopenharmony_ci
999e1051a39Sopenharmony_ci	jmp	%o7+$5
1000e1051a39Sopenharmony_ci	nop
1001e1051a39Sopenharmony_ci
1002e1051a39Sopenharmony_ci$7.7:
1003e1051a39Sopenharmony_ci	srl	$3, 16, $5
1004e1051a39Sopenharmony_ci	and	$5, 0xff, $5
1005e1051a39Sopenharmony_ci	stub	$5, [$1+6]
1006e1051a39Sopenharmony_ci$7.6:
1007e1051a39Sopenharmony_ci	srl	$3, 8, $5
1008e1051a39Sopenharmony_ci	and	$5, 0xff, $5
1009e1051a39Sopenharmony_ci	stub	$5, [$1+5]
1010e1051a39Sopenharmony_ci$7.5:
1011e1051a39Sopenharmony_ci	and	$3, 0xff, $5
1012e1051a39Sopenharmony_ci	stub	$5, [$1+4]
1013e1051a39Sopenharmony_ci$7.4:
1014e1051a39Sopenharmony_ci	srl	$4, 24, $5
1015e1051a39Sopenharmony_ci	stub	$5, [$1+3]
1016e1051a39Sopenharmony_ci$7.3:
1017e1051a39Sopenharmony_ci	srl	$4, 16, $5
1018e1051a39Sopenharmony_ci	and	$5, 0xff, $5
1019e1051a39Sopenharmony_ci	stub	$5, [$1+2]
1020e1051a39Sopenharmony_ci$7.2:
1021e1051a39Sopenharmony_ci	srl	$4, 8, $5
1022e1051a39Sopenharmony_ci	and	$5, 0xff, $5
1023e1051a39Sopenharmony_ci	stub	$5, [$1+1]
1024e1051a39Sopenharmony_ci$7.1:
1025e1051a39Sopenharmony_ci	and	$4, 0xff, $5
1026e1051a39Sopenharmony_ci
1027e1051a39Sopenharmony_ci
1028e1051a39Sopenharmony_ci	ba	$8
1029e1051a39Sopenharmony_ci	stub	$5, [$1]
1030e1051a39Sopenharmony_ci
1031e1051a39Sopenharmony_ci	.align 4
1032e1051a39Sopenharmony_ci
1033e1051a39Sopenharmony_ci$7.jmp.table:
1034e1051a39Sopenharmony_ci
1035e1051a39Sopenharmony_ci	.word	0
1036e1051a39Sopenharmony_ci	.word	$7.1-$7.0
1037e1051a39Sopenharmony_ci	.word	$7.2-$7.0
1038e1051a39Sopenharmony_ci	.word	$7.3-$7.0
1039e1051a39Sopenharmony_ci	.word	$7.4-$7.0
1040e1051a39Sopenharmony_ci	.word	$7.5-$7.0
1041e1051a39Sopenharmony_ci	.word	$7.6-$7.0
1042e1051a39Sopenharmony_ci	.word	$7.7-$7.0
1043e1051a39Sopenharmony_ci})
1044e1051a39Sopenharmony_ci
1045e1051a39Sopenharmony_ci
1046e1051a39Sopenharmony_cidefine(testvalue,{1})
1047e1051a39Sopenharmony_ci
1048e1051a39Sopenharmony_cidefine(register_init, {
1049e1051a39Sopenharmony_ci
1050e1051a39Sopenharmony_ci! For test purposes:
1051e1051a39Sopenharmony_ci
1052e1051a39Sopenharmony_ci	sethi	%hi(testvalue), local0
1053e1051a39Sopenharmony_ci	or	local0, %lo(testvalue), local0
1054e1051a39Sopenharmony_ci
1055e1051a39Sopenharmony_ci	ifelse($1,{},{}, {mov	local0, $1})
1056e1051a39Sopenharmony_ci	ifelse($2,{},{}, {mov	local0, $2})
1057e1051a39Sopenharmony_ci	ifelse($3,{},{}, {mov	local0, $3})
1058e1051a39Sopenharmony_ci	ifelse($4,{},{}, {mov	local0, $4})
1059e1051a39Sopenharmony_ci	ifelse($5,{},{}, {mov	local0, $5})
1060e1051a39Sopenharmony_ci	ifelse($6,{},{}, {mov	local0, $6})
1061e1051a39Sopenharmony_ci	ifelse($7,{},{}, {mov	local0, $7})
1062e1051a39Sopenharmony_ci	ifelse($8,{},{}, {mov	local0, $8})
1063e1051a39Sopenharmony_ci
1064e1051a39Sopenharmony_ci	mov	local0, local1
1065e1051a39Sopenharmony_ci	mov	local0, local2
1066e1051a39Sopenharmony_ci	mov	local0, local3
1067e1051a39Sopenharmony_ci	mov	local0, local4
1068e1051a39Sopenharmony_ci	mov	local0, local5
1069e1051a39Sopenharmony_ci	mov	local0, local7
1070e1051a39Sopenharmony_ci	mov	local0, local6
1071e1051a39Sopenharmony_ci	mov	local0, out0
1072e1051a39Sopenharmony_ci	mov	local0, out1
1073e1051a39Sopenharmony_ci	mov	local0, out2
1074e1051a39Sopenharmony_ci	mov	local0, out3
1075e1051a39Sopenharmony_ci	mov	local0, out4
1076e1051a39Sopenharmony_ci	mov	local0, out5
1077e1051a39Sopenharmony_ci	mov	local0, global1
1078e1051a39Sopenharmony_ci	mov	local0, global2
1079e1051a39Sopenharmony_ci	mov	local0, global3
1080e1051a39Sopenharmony_ci	mov	local0, global4
1081e1051a39Sopenharmony_ci	mov	local0, global5
1082e1051a39Sopenharmony_ci
1083e1051a39Sopenharmony_ci})
1084e1051a39Sopenharmony_ci
1085e1051a39Sopenharmony_ci.section	".text"
1086e1051a39Sopenharmony_ci
1087e1051a39Sopenharmony_ci	.align 32
1088e1051a39Sopenharmony_ci
1089e1051a39Sopenharmony_ci.des_enc:
1090e1051a39Sopenharmony_ci
1091e1051a39Sopenharmony_ci	! key address in3
1092e1051a39Sopenharmony_ci	! loads key next encryption/decryption first round from [in4]
1093e1051a39Sopenharmony_ci
1094e1051a39Sopenharmony_ci	rounds_macro(in5, out5, 1, .des_enc.1, in3, in4, retl)
1095e1051a39Sopenharmony_ci
1096e1051a39Sopenharmony_ci
1097e1051a39Sopenharmony_ci	.align 32
1098e1051a39Sopenharmony_ci
1099e1051a39Sopenharmony_ci.des_dec:
1100e1051a39Sopenharmony_ci
1101e1051a39Sopenharmony_ci	! implemented with out5 as first parameter to avoid
1102e1051a39Sopenharmony_ci	! register exchange in ede modes
1103e1051a39Sopenharmony_ci
1104e1051a39Sopenharmony_ci	! key address in4
1105e1051a39Sopenharmony_ci	! loads key next encryption/decryption first round from [in3]
1106e1051a39Sopenharmony_ci
1107e1051a39Sopenharmony_ci	rounds_macro(out5, in5, -1, .des_dec.1, in4, in3, retl)
1108e1051a39Sopenharmony_ci
1109e1051a39Sopenharmony_ci
1110e1051a39Sopenharmony_ci
1111e1051a39Sopenharmony_ci! void DES_encrypt1(data, ks, enc)
1112e1051a39Sopenharmony_ci! *******************************
1113e1051a39Sopenharmony_ci
1114e1051a39Sopenharmony_ci	.align 32
1115e1051a39Sopenharmony_ci	.global DES_encrypt1
1116e1051a39Sopenharmony_ci	.type	 DES_encrypt1,#function
1117e1051a39Sopenharmony_ci
1118e1051a39Sopenharmony_ciDES_encrypt1:
1119e1051a39Sopenharmony_ci
1120e1051a39Sopenharmony_ci	save	%sp, FRAME, %sp
1121e1051a39Sopenharmony_ci
1122e1051a39Sopenharmony_ci	sethi	%hi(.PIC.DES_SPtrans-1f),global1
1123e1051a39Sopenharmony_ci	or	global1,%lo(.PIC.DES_SPtrans-1f),global1
1124e1051a39Sopenharmony_ci1:	call	.+8
1125e1051a39Sopenharmony_ci	add	%o7,global1,global1
1126e1051a39Sopenharmony_ci	sub	global1,.PIC.DES_SPtrans-.des_and,out2
1127e1051a39Sopenharmony_ci
1128e1051a39Sopenharmony_ci	ld	[in0], in5                ! left
1129e1051a39Sopenharmony_ci	cmp	in2, 0                    ! enc
1130e1051a39Sopenharmony_ci
1131e1051a39Sopenharmony_ci	be	.encrypt.dec
1132e1051a39Sopenharmony_ci	ld	[in0+4], out5             ! right
1133e1051a39Sopenharmony_ci
1134e1051a39Sopenharmony_ci	! parameter 6  1/2 for include encryption/decryption
1135e1051a39Sopenharmony_ci	! parameter 7  1 for move in1 to in3
1136e1051a39Sopenharmony_ci	! parameter 8  1 for move in3 to in4, 2 for move in4 to in3
1137e1051a39Sopenharmony_ci
1138e1051a39Sopenharmony_ci	ip_macro(in5, out5, in5, out5, in3, 0, 1, 1)
1139e1051a39Sopenharmony_ci
1140e1051a39Sopenharmony_ci	rounds_macro(in5, out5, 1, .des_encrypt1.1, in3, in4) ! in4 not used
1141e1051a39Sopenharmony_ci
1142e1051a39Sopenharmony_ci	fp_macro(in5, out5, 1)            ! 1 for store to [in0]
1143e1051a39Sopenharmony_ci
1144e1051a39Sopenharmony_ci	ret
1145e1051a39Sopenharmony_ci	restore
1146e1051a39Sopenharmony_ci
1147e1051a39Sopenharmony_ci.encrypt.dec:
1148e1051a39Sopenharmony_ci
1149e1051a39Sopenharmony_ci	add	in1, 120, in3             ! use last subkey for first round
1150e1051a39Sopenharmony_ci
1151e1051a39Sopenharmony_ci	! parameter 6  1/2 for include encryption/decryption
1152e1051a39Sopenharmony_ci	! parameter 7  1 for move in1 to in3
1153e1051a39Sopenharmony_ci	! parameter 8  1 for move in3 to in4, 2 for move in4 to in3
1154e1051a39Sopenharmony_ci
1155e1051a39Sopenharmony_ci	ip_macro(in5, out5, out5, in5, in4, 2, 0, 1) ! include dec,  ks in4
1156e1051a39Sopenharmony_ci
1157e1051a39Sopenharmony_ci	fp_macro(out5, in5, 1)            ! 1 for store to [in0]
1158e1051a39Sopenharmony_ci
1159e1051a39Sopenharmony_ci	ret
1160e1051a39Sopenharmony_ci	restore
1161e1051a39Sopenharmony_ci
1162e1051a39Sopenharmony_ci.DES_encrypt1.end:
1163e1051a39Sopenharmony_ci	.size	 DES_encrypt1,.DES_encrypt1.end-DES_encrypt1
1164e1051a39Sopenharmony_ci
1165e1051a39Sopenharmony_ci
1166e1051a39Sopenharmony_ci! void DES_encrypt2(data, ks, enc)
1167e1051a39Sopenharmony_ci!*********************************
1168e1051a39Sopenharmony_ci
1169e1051a39Sopenharmony_ci	! encrypts/decrypts without initial/final permutation
1170e1051a39Sopenharmony_ci
1171e1051a39Sopenharmony_ci	.align 32
1172e1051a39Sopenharmony_ci	.global DES_encrypt2
1173e1051a39Sopenharmony_ci	.type	 DES_encrypt2,#function
1174e1051a39Sopenharmony_ci
1175e1051a39Sopenharmony_ciDES_encrypt2:
1176e1051a39Sopenharmony_ci
1177e1051a39Sopenharmony_ci	save	%sp, FRAME, %sp
1178e1051a39Sopenharmony_ci
1179e1051a39Sopenharmony_ci	sethi	%hi(.PIC.DES_SPtrans-1f),global1
1180e1051a39Sopenharmony_ci	or	global1,%lo(.PIC.DES_SPtrans-1f),global1
1181e1051a39Sopenharmony_ci1:	call	.+8
1182e1051a39Sopenharmony_ci	add	%o7,global1,global1
1183e1051a39Sopenharmony_ci	sub	global1,.PIC.DES_SPtrans-.des_and,out2
1184e1051a39Sopenharmony_ci
1185e1051a39Sopenharmony_ci	! Set sbox address 1 to 6 and rotate halves 3 left
1186e1051a39Sopenharmony_ci	! Errors caught by destest? Yes. Still? *NO*
1187e1051a39Sopenharmony_ci
1188e1051a39Sopenharmony_ci	!sethi	%hi(DES_SPtrans), global1 ! address sbox 1
1189e1051a39Sopenharmony_ci
1190e1051a39Sopenharmony_ci	!or	global1, %lo(DES_SPtrans), global1  ! sbox 1
1191e1051a39Sopenharmony_ci
1192e1051a39Sopenharmony_ci	add	global1, 256, global2     ! sbox 2
1193e1051a39Sopenharmony_ci	add	global1, 512, global3     ! sbox 3
1194e1051a39Sopenharmony_ci
1195e1051a39Sopenharmony_ci	ld	[in0], out5               ! right
1196e1051a39Sopenharmony_ci	add	global1, 768, global4     ! sbox 4
1197e1051a39Sopenharmony_ci	add	global1, 1024, global5    ! sbox 5
1198e1051a39Sopenharmony_ci
1199e1051a39Sopenharmony_ci	ld	[in0+4], in5              ! left
1200e1051a39Sopenharmony_ci	add	global1, 1280, local6     ! sbox 6
1201e1051a39Sopenharmony_ci	add	global1, 1792, out3       ! sbox 8
1202e1051a39Sopenharmony_ci
1203e1051a39Sopenharmony_ci	! rotate
1204e1051a39Sopenharmony_ci
1205e1051a39Sopenharmony_ci	sll	in5, 3, local5
1206e1051a39Sopenharmony_ci	mov	in1, in3                  ! key address to in3
1207e1051a39Sopenharmony_ci
1208e1051a39Sopenharmony_ci	sll	out5, 3, local7
1209e1051a39Sopenharmony_ci	srl	in5, 29, in5
1210e1051a39Sopenharmony_ci
1211e1051a39Sopenharmony_ci	srl	out5, 29, out5
1212e1051a39Sopenharmony_ci	add	in5, local5, in5
1213e1051a39Sopenharmony_ci
1214e1051a39Sopenharmony_ci	add	out5, local7, out5
1215e1051a39Sopenharmony_ci	cmp	in2, 0
1216e1051a39Sopenharmony_ci
1217e1051a39Sopenharmony_ci	! we use our own stackframe
1218e1051a39Sopenharmony_ci
1219e1051a39Sopenharmony_ci	be	.encrypt2.dec
1220e1051a39Sopenharmony_ci	STPTR	in0, [%sp+BIAS+ARG0+0*ARGSZ]
1221e1051a39Sopenharmony_ci
1222e1051a39Sopenharmony_ci	ld	[in3], out0               ! key 7531 first round
1223e1051a39Sopenharmony_ci	mov	LOOPS, out4               ! loop counter
1224e1051a39Sopenharmony_ci
1225e1051a39Sopenharmony_ci	ld	[in3+4], out1             ! key 8642 first round
1226e1051a39Sopenharmony_ci	sethi	%hi(0x0000FC00), local5
1227e1051a39Sopenharmony_ci
1228e1051a39Sopenharmony_ci	call .des_enc
1229e1051a39Sopenharmony_ci	mov	in3, in4
1230e1051a39Sopenharmony_ci
1231e1051a39Sopenharmony_ci	! rotate
1232e1051a39Sopenharmony_ci	sll	in5, 29, in0
1233e1051a39Sopenharmony_ci	srl	in5, 3, in5
1234e1051a39Sopenharmony_ci	sll	out5, 29, in1
1235e1051a39Sopenharmony_ci	add	in5, in0, in5
1236e1051a39Sopenharmony_ci	srl	out5, 3, out5
1237e1051a39Sopenharmony_ci	LDPTR	[%sp+BIAS+ARG0+0*ARGSZ], in0
1238e1051a39Sopenharmony_ci	add	out5, in1, out5
1239e1051a39Sopenharmony_ci	st	in5, [in0]
1240e1051a39Sopenharmony_ci	st	out5, [in0+4]
1241e1051a39Sopenharmony_ci
1242e1051a39Sopenharmony_ci	ret
1243e1051a39Sopenharmony_ci	restore
1244e1051a39Sopenharmony_ci
1245e1051a39Sopenharmony_ci
1246e1051a39Sopenharmony_ci.encrypt2.dec:
1247e1051a39Sopenharmony_ci
1248e1051a39Sopenharmony_ci	add in3, 120, in4
1249e1051a39Sopenharmony_ci
1250e1051a39Sopenharmony_ci	ld	[in4], out0               ! key 7531 first round
1251e1051a39Sopenharmony_ci	mov	LOOPS, out4               ! loop counter
1252e1051a39Sopenharmony_ci
1253e1051a39Sopenharmony_ci	ld	[in4+4], out1             ! key 8642 first round
1254e1051a39Sopenharmony_ci	sethi	%hi(0x0000FC00), local5
1255e1051a39Sopenharmony_ci
1256e1051a39Sopenharmony_ci	mov	in5, local1               ! left expected in out5
1257e1051a39Sopenharmony_ci	mov	out5, in5
1258e1051a39Sopenharmony_ci
1259e1051a39Sopenharmony_ci	call .des_dec
1260e1051a39Sopenharmony_ci	mov	local1, out5
1261e1051a39Sopenharmony_ci
1262e1051a39Sopenharmony_ci.encrypt2.finish:
1263e1051a39Sopenharmony_ci
1264e1051a39Sopenharmony_ci	! rotate
1265e1051a39Sopenharmony_ci	sll	in5, 29, in0
1266e1051a39Sopenharmony_ci	srl	in5, 3, in5
1267e1051a39Sopenharmony_ci	sll	out5, 29, in1
1268e1051a39Sopenharmony_ci	add	in5, in0, in5
1269e1051a39Sopenharmony_ci	srl	out5, 3, out5
1270e1051a39Sopenharmony_ci	LDPTR	[%sp+BIAS+ARG0+0*ARGSZ], in0
1271e1051a39Sopenharmony_ci	add	out5, in1, out5
1272e1051a39Sopenharmony_ci	st	out5, [in0]
1273e1051a39Sopenharmony_ci	st	in5, [in0+4]
1274e1051a39Sopenharmony_ci
1275e1051a39Sopenharmony_ci	ret
1276e1051a39Sopenharmony_ci	restore
1277e1051a39Sopenharmony_ci
1278e1051a39Sopenharmony_ci.DES_encrypt2.end:
1279e1051a39Sopenharmony_ci	.size	 DES_encrypt2, .DES_encrypt2.end-DES_encrypt2
1280e1051a39Sopenharmony_ci
1281e1051a39Sopenharmony_ci
1282e1051a39Sopenharmony_ci! void DES_encrypt3(data, ks1, ks2, ks3)
1283e1051a39Sopenharmony_ci! **************************************
1284e1051a39Sopenharmony_ci
1285e1051a39Sopenharmony_ci	.align 32
1286e1051a39Sopenharmony_ci	.global DES_encrypt3
1287e1051a39Sopenharmony_ci	.type	 DES_encrypt3,#function
1288e1051a39Sopenharmony_ci
1289e1051a39Sopenharmony_ciDES_encrypt3:
1290e1051a39Sopenharmony_ci
1291e1051a39Sopenharmony_ci	save	%sp, FRAME, %sp
1292e1051a39Sopenharmony_ci	
1293e1051a39Sopenharmony_ci	sethi	%hi(.PIC.DES_SPtrans-1f),global1
1294e1051a39Sopenharmony_ci	or	global1,%lo(.PIC.DES_SPtrans-1f),global1
1295e1051a39Sopenharmony_ci1:	call	.+8
1296e1051a39Sopenharmony_ci	add	%o7,global1,global1
1297e1051a39Sopenharmony_ci	sub	global1,.PIC.DES_SPtrans-.des_and,out2
1298e1051a39Sopenharmony_ci
1299e1051a39Sopenharmony_ci	ld	[in0], in5                ! left
1300e1051a39Sopenharmony_ci	add	in2, 120, in4             ! ks2
1301e1051a39Sopenharmony_ci
1302e1051a39Sopenharmony_ci	ld	[in0+4], out5             ! right
1303e1051a39Sopenharmony_ci	mov	in3, in2                  ! save ks3
1304e1051a39Sopenharmony_ci
1305e1051a39Sopenharmony_ci	! parameter 6  1/2 for include encryption/decryption
1306e1051a39Sopenharmony_ci	! parameter 7  1 for mov in1 to in3
1307e1051a39Sopenharmony_ci	! parameter 8  1 for mov in3 to in4
1308e1051a39Sopenharmony_ci	! parameter 9  1 for load ks3 and ks2 to in4 and in3
1309e1051a39Sopenharmony_ci
1310e1051a39Sopenharmony_ci	ip_macro(in5, out5, in5, out5, in3, 1, 1, 0, 0)
1311e1051a39Sopenharmony_ci
1312e1051a39Sopenharmony_ci	call	.des_dec
1313e1051a39Sopenharmony_ci	mov	in2, in3                  ! preload ks3
1314e1051a39Sopenharmony_ci
1315e1051a39Sopenharmony_ci	call	.des_enc
1316e1051a39Sopenharmony_ci	nop
1317e1051a39Sopenharmony_ci
1318e1051a39Sopenharmony_ci	fp_macro(in5, out5, 1)
1319e1051a39Sopenharmony_ci
1320e1051a39Sopenharmony_ci	ret
1321e1051a39Sopenharmony_ci	restore
1322e1051a39Sopenharmony_ci
1323e1051a39Sopenharmony_ci.DES_encrypt3.end:
1324e1051a39Sopenharmony_ci	.size	 DES_encrypt3,.DES_encrypt3.end-DES_encrypt3
1325e1051a39Sopenharmony_ci
1326e1051a39Sopenharmony_ci
1327e1051a39Sopenharmony_ci! void DES_decrypt3(data, ks1, ks2, ks3)
1328e1051a39Sopenharmony_ci! **************************************
1329e1051a39Sopenharmony_ci
1330e1051a39Sopenharmony_ci	.align 32
1331e1051a39Sopenharmony_ci	.global DES_decrypt3
1332e1051a39Sopenharmony_ci	.type	 DES_decrypt3,#function
1333e1051a39Sopenharmony_ci
1334e1051a39Sopenharmony_ciDES_decrypt3:
1335e1051a39Sopenharmony_ci
1336e1051a39Sopenharmony_ci	save	%sp, FRAME, %sp
1337e1051a39Sopenharmony_ci	
1338e1051a39Sopenharmony_ci	sethi	%hi(.PIC.DES_SPtrans-1f),global1
1339e1051a39Sopenharmony_ci	or	global1,%lo(.PIC.DES_SPtrans-1f),global1
1340e1051a39Sopenharmony_ci1:	call	.+8
1341e1051a39Sopenharmony_ci	add	%o7,global1,global1
1342e1051a39Sopenharmony_ci	sub	global1,.PIC.DES_SPtrans-.des_and,out2
1343e1051a39Sopenharmony_ci
1344e1051a39Sopenharmony_ci	ld	[in0], in5                ! left
1345e1051a39Sopenharmony_ci	add	in3, 120, in4             ! ks3
1346e1051a39Sopenharmony_ci
1347e1051a39Sopenharmony_ci	ld	[in0+4], out5             ! right
1348e1051a39Sopenharmony_ci	mov	in2, in3                  ! ks2
1349e1051a39Sopenharmony_ci
1350e1051a39Sopenharmony_ci	! parameter 6  1/2 for include encryption/decryption
1351e1051a39Sopenharmony_ci	! parameter 7  1 for mov in1 to in3
1352e1051a39Sopenharmony_ci	! parameter 8  1 for mov in3 to in4
1353e1051a39Sopenharmony_ci	! parameter 9  1 for load ks3 and ks2 to in4 and in3
1354e1051a39Sopenharmony_ci
1355e1051a39Sopenharmony_ci	ip_macro(in5, out5, out5, in5, in4, 2, 0, 0, 0)
1356e1051a39Sopenharmony_ci
1357e1051a39Sopenharmony_ci	call	.des_enc
1358e1051a39Sopenharmony_ci	add	in1, 120, in4             ! preload ks1
1359e1051a39Sopenharmony_ci
1360e1051a39Sopenharmony_ci	call	.des_dec
1361e1051a39Sopenharmony_ci	nop
1362e1051a39Sopenharmony_ci
1363e1051a39Sopenharmony_ci	fp_macro(out5, in5, 1)
1364e1051a39Sopenharmony_ci
1365e1051a39Sopenharmony_ci	ret
1366e1051a39Sopenharmony_ci	restore
1367e1051a39Sopenharmony_ci
1368e1051a39Sopenharmony_ci.DES_decrypt3.end:
1369e1051a39Sopenharmony_ci	.size	 DES_decrypt3,.DES_decrypt3.end-DES_decrypt3
1370e1051a39Sopenharmony_ci
1371e1051a39Sopenharmony_ci! void DES_ncbc_encrypt(input, output, length, schedule, ivec, enc)
1372e1051a39Sopenharmony_ci! *****************************************************************
1373e1051a39Sopenharmony_ci
1374e1051a39Sopenharmony_ci
1375e1051a39Sopenharmony_ci	.align 32
1376e1051a39Sopenharmony_ci	.global DES_ncbc_encrypt
1377e1051a39Sopenharmony_ci	.type	 DES_ncbc_encrypt,#function
1378e1051a39Sopenharmony_ci
1379e1051a39Sopenharmony_ciDES_ncbc_encrypt:
1380e1051a39Sopenharmony_ci
1381e1051a39Sopenharmony_ci	save	%sp, FRAME, %sp
1382e1051a39Sopenharmony_ci	
1383e1051a39Sopenharmony_ci	define({INPUT},  { [%sp+BIAS+ARG0+0*ARGSZ] })
1384e1051a39Sopenharmony_ci	define({OUTPUT}, { [%sp+BIAS+ARG0+1*ARGSZ] })
1385e1051a39Sopenharmony_ci	define({IVEC},   { [%sp+BIAS+ARG0+4*ARGSZ] })
1386e1051a39Sopenharmony_ci
1387e1051a39Sopenharmony_ci	sethi	%hi(.PIC.DES_SPtrans-1f),global1
1388e1051a39Sopenharmony_ci	or	global1,%lo(.PIC.DES_SPtrans-1f),global1
1389e1051a39Sopenharmony_ci1:	call	.+8
1390e1051a39Sopenharmony_ci	add	%o7,global1,global1
1391e1051a39Sopenharmony_ci	sub	global1,.PIC.DES_SPtrans-.des_and,out2
1392e1051a39Sopenharmony_ci
1393e1051a39Sopenharmony_ci	cmp	in5, 0                    ! enc
1394e1051a39Sopenharmony_ci
1395e1051a39Sopenharmony_ci	be	.ncbc.dec
1396e1051a39Sopenharmony_ci	STPTR	in4, IVEC
1397e1051a39Sopenharmony_ci
1398e1051a39Sopenharmony_ci	! addr  left  right  temp  label
1399e1051a39Sopenharmony_ci	load_little_endian(in4, in5, out5, local3, .LLE1)  ! iv
1400e1051a39Sopenharmony_ci
1401e1051a39Sopenharmony_ci	addcc	in2, -8, in2              ! bytes missing when first block done
1402e1051a39Sopenharmony_ci
1403e1051a39Sopenharmony_ci	bl	.ncbc.enc.seven.or.less
1404e1051a39Sopenharmony_ci	mov	in3, in4                  ! schedule
1405e1051a39Sopenharmony_ci
1406e1051a39Sopenharmony_ci.ncbc.enc.next.block:
1407e1051a39Sopenharmony_ci
1408e1051a39Sopenharmony_ci	load_little_endian(in0, out4, global4, local3, .LLE2)  ! block
1409e1051a39Sopenharmony_ci
1410e1051a39Sopenharmony_ci.ncbc.enc.next.block_1:
1411e1051a39Sopenharmony_ci
1412e1051a39Sopenharmony_ci	xor	in5, out4, in5            ! iv xor
1413e1051a39Sopenharmony_ci	xor	out5, global4, out5       ! iv xor
1414e1051a39Sopenharmony_ci
1415e1051a39Sopenharmony_ci	! parameter 8  1 for move in3 to in4, 2 for move in4 to in3
1416e1051a39Sopenharmony_ci	ip_macro(in5, out5, in5, out5, in3, 0, 0, 2)
1417e1051a39Sopenharmony_ci
1418e1051a39Sopenharmony_ci.ncbc.enc.next.block_2:
1419e1051a39Sopenharmony_ci
1420e1051a39Sopenharmony_ci!//	call .des_enc                     ! compares in2 to 8
1421e1051a39Sopenharmony_ci!	rounds inlined for alignment purposes
1422e1051a39Sopenharmony_ci
1423e1051a39Sopenharmony_ci	add	global1, 768, global4     ! address sbox 4 since register used below
1424e1051a39Sopenharmony_ci
1425e1051a39Sopenharmony_ci	rounds_macro(in5, out5, 1, .ncbc.enc.1, in3, in4) ! include encryption  ks in3
1426e1051a39Sopenharmony_ci
1427e1051a39Sopenharmony_ci	bl	.ncbc.enc.next.block_fp
1428e1051a39Sopenharmony_ci	add	in0, 8, in0               ! input address
1429e1051a39Sopenharmony_ci
1430e1051a39Sopenharmony_ci	! If 8 or more bytes are to be encrypted after this block,
1431e1051a39Sopenharmony_ci	! we combine final permutation for this block with initial
1432e1051a39Sopenharmony_ci	! permutation for next block. Load next block:
1433e1051a39Sopenharmony_ci
1434e1051a39Sopenharmony_ci	load_little_endian(in0, global3, global4, local5, .LLE12)
1435e1051a39Sopenharmony_ci
1436e1051a39Sopenharmony_ci	!  parameter 1   original left
1437e1051a39Sopenharmony_ci	!  parameter 2   original right
1438e1051a39Sopenharmony_ci	!  parameter 3   left ip
1439e1051a39Sopenharmony_ci	!  parameter 4   right ip
1440e1051a39Sopenharmony_ci	!  parameter 5   1: load ks1/ks2 to in3/in4, add 120 to in4
1441e1051a39Sopenharmony_ci	!                2: mov in4 to in3
1442e1051a39Sopenharmony_ci	!
1443e1051a39Sopenharmony_ci	! also adds -8 to length in2 and loads loop counter to out4
1444e1051a39Sopenharmony_ci
1445e1051a39Sopenharmony_ci	fp_ip_macro(out0, out1, global3, global4, 2)
1446e1051a39Sopenharmony_ci
1447e1051a39Sopenharmony_ci	store_little_endian(in1, out0, out1, local3, .SLE10)  ! block
1448e1051a39Sopenharmony_ci
1449e1051a39Sopenharmony_ci	ld	[in3], out0               ! key 7531 first round next block
1450e1051a39Sopenharmony_ci	mov 	in5, local1
1451e1051a39Sopenharmony_ci	xor	global3, out5, in5        ! iv xor next block
1452e1051a39Sopenharmony_ci
1453e1051a39Sopenharmony_ci	ld	[in3+4], out1             ! key 8642
1454e1051a39Sopenharmony_ci	add	global1, 512, global3     ! address sbox 3 since register used
1455e1051a39Sopenharmony_ci	xor	global4, local1, out5     ! iv xor next block
1456e1051a39Sopenharmony_ci
1457e1051a39Sopenharmony_ci	ba	.ncbc.enc.next.block_2
1458e1051a39Sopenharmony_ci	add	in1, 8, in1               ! output address
1459e1051a39Sopenharmony_ci
1460e1051a39Sopenharmony_ci.ncbc.enc.next.block_fp:
1461e1051a39Sopenharmony_ci
1462e1051a39Sopenharmony_ci	fp_macro(in5, out5)
1463e1051a39Sopenharmony_ci
1464e1051a39Sopenharmony_ci	store_little_endian(in1, in5, out5, local3, .SLE1)  ! block
1465e1051a39Sopenharmony_ci
1466e1051a39Sopenharmony_ci	addcc   in2, -8, in2              ! bytes missing when next block done
1467e1051a39Sopenharmony_ci
1468e1051a39Sopenharmony_ci	bpos	.ncbc.enc.next.block
1469e1051a39Sopenharmony_ci	add	in1, 8, in1
1470e1051a39Sopenharmony_ci
1471e1051a39Sopenharmony_ci.ncbc.enc.seven.or.less:
1472e1051a39Sopenharmony_ci
1473e1051a39Sopenharmony_ci	cmp	in2, -8
1474e1051a39Sopenharmony_ci
1475e1051a39Sopenharmony_ci	ble	.ncbc.enc.finish
1476e1051a39Sopenharmony_ci	nop
1477e1051a39Sopenharmony_ci
1478e1051a39Sopenharmony_ci	add	in2, 8, local1            ! bytes to load
1479e1051a39Sopenharmony_ci
1480e1051a39Sopenharmony_ci	! addr, length, dest left, dest right, temp, temp2, label, ret label
1481e1051a39Sopenharmony_ci	load_n_bytes(in0, local1, global4, out4, local2, local3, .LNB1, .ncbc.enc.next.block_1)
1482e1051a39Sopenharmony_ci
1483e1051a39Sopenharmony_ci	! Loads 1 to 7 bytes little endian to global4, out4
1484e1051a39Sopenharmony_ci
1485e1051a39Sopenharmony_ci
1486e1051a39Sopenharmony_ci.ncbc.enc.finish:
1487e1051a39Sopenharmony_ci
1488e1051a39Sopenharmony_ci	LDPTR	IVEC, local4
1489e1051a39Sopenharmony_ci	store_little_endian(local4, in5, out5, local5, .SLE2)  ! ivec
1490e1051a39Sopenharmony_ci
1491e1051a39Sopenharmony_ci	ret
1492e1051a39Sopenharmony_ci	restore
1493e1051a39Sopenharmony_ci
1494e1051a39Sopenharmony_ci
1495e1051a39Sopenharmony_ci.ncbc.dec:
1496e1051a39Sopenharmony_ci
1497e1051a39Sopenharmony_ci	STPTR	in0, INPUT
1498e1051a39Sopenharmony_ci	cmp	in2, 0                    ! length
1499e1051a39Sopenharmony_ci	add	in3, 120, in3
1500e1051a39Sopenharmony_ci
1501e1051a39Sopenharmony_ci	LDPTR	IVEC, local7              ! ivec
1502e1051a39Sopenharmony_ci	ble	.ncbc.dec.finish
1503e1051a39Sopenharmony_ci	mov	in3, in4                  ! schedule
1504e1051a39Sopenharmony_ci
1505e1051a39Sopenharmony_ci	STPTR	in1, OUTPUT
1506e1051a39Sopenharmony_ci	mov	in0, local5               ! input
1507e1051a39Sopenharmony_ci
1508e1051a39Sopenharmony_ci	load_little_endian(local7, in0, in1, local3, .LLE3)   ! ivec
1509e1051a39Sopenharmony_ci
1510e1051a39Sopenharmony_ci.ncbc.dec.next.block:
1511e1051a39Sopenharmony_ci
1512e1051a39Sopenharmony_ci	load_little_endian(local5, in5, out5, local3, .LLE4)  ! block
1513e1051a39Sopenharmony_ci
1514e1051a39Sopenharmony_ci	! parameter 6  1/2 for include encryption/decryption
1515e1051a39Sopenharmony_ci	! parameter 7  1 for mov in1 to in3
1516e1051a39Sopenharmony_ci	! parameter 8  1 for mov in3 to in4
1517e1051a39Sopenharmony_ci
1518e1051a39Sopenharmony_ci	ip_macro(in5, out5, out5, in5, in4, 2, 0, 1) ! include decryption  ks in4
1519e1051a39Sopenharmony_ci
1520e1051a39Sopenharmony_ci	fp_macro(out5, in5, 0, 1) ! 1 for input and output address to local5/7
1521e1051a39Sopenharmony_ci
1522e1051a39Sopenharmony_ci	! in2 is bytes left to be stored
1523e1051a39Sopenharmony_ci	! in2 is compared to 8 in the rounds
1524e1051a39Sopenharmony_ci
1525e1051a39Sopenharmony_ci	xor	out5, in0, out4           ! iv xor
1526e1051a39Sopenharmony_ci	bl	.ncbc.dec.seven.or.less
1527e1051a39Sopenharmony_ci	xor	in5, in1, global4         ! iv xor
1528e1051a39Sopenharmony_ci
1529e1051a39Sopenharmony_ci	! Load ivec next block now, since input and output address might be the same.
1530e1051a39Sopenharmony_ci
1531e1051a39Sopenharmony_ci	load_little_endian_inc(local5, in0, in1, local3, .LLE5)  ! iv
1532e1051a39Sopenharmony_ci
1533e1051a39Sopenharmony_ci	store_little_endian(local7, out4, global4, local3, .SLE3)
1534e1051a39Sopenharmony_ci
1535e1051a39Sopenharmony_ci	STPTR	local5, INPUT
1536e1051a39Sopenharmony_ci	add	local7, 8, local7
1537e1051a39Sopenharmony_ci	addcc   in2, -8, in2
1538e1051a39Sopenharmony_ci
1539e1051a39Sopenharmony_ci	bg	.ncbc.dec.next.block
1540e1051a39Sopenharmony_ci	STPTR	local7, OUTPUT
1541e1051a39Sopenharmony_ci
1542e1051a39Sopenharmony_ci
1543e1051a39Sopenharmony_ci.ncbc.dec.store.iv:
1544e1051a39Sopenharmony_ci
1545e1051a39Sopenharmony_ci	LDPTR	IVEC, local4              ! ivec
1546e1051a39Sopenharmony_ci	store_little_endian(local4, in0, in1, local5, .SLE4)
1547e1051a39Sopenharmony_ci
1548e1051a39Sopenharmony_ci.ncbc.dec.finish:
1549e1051a39Sopenharmony_ci
1550e1051a39Sopenharmony_ci	ret
1551e1051a39Sopenharmony_ci	restore
1552e1051a39Sopenharmony_ci
1553e1051a39Sopenharmony_ci.ncbc.dec.seven.or.less:
1554e1051a39Sopenharmony_ci
1555e1051a39Sopenharmony_ci	load_little_endian_inc(local5, in0, in1, local3, .LLE13)     ! ivec
1556e1051a39Sopenharmony_ci
1557e1051a39Sopenharmony_ci	store_n_bytes(local7, in2, global4, out4, local3, local4, .SNB1, .ncbc.dec.store.iv)
1558e1051a39Sopenharmony_ci
1559e1051a39Sopenharmony_ci
1560e1051a39Sopenharmony_ci.DES_ncbc_encrypt.end:
1561e1051a39Sopenharmony_ci	.size	 DES_ncbc_encrypt, .DES_ncbc_encrypt.end-DES_ncbc_encrypt
1562e1051a39Sopenharmony_ci
1563e1051a39Sopenharmony_ci
1564e1051a39Sopenharmony_ci! void DES_ede3_cbc_encrypt(input, output, length, ks1, ks2, ks3, ivec, enc)
1565e1051a39Sopenharmony_ci! **************************************************************************
1566e1051a39Sopenharmony_ci
1567e1051a39Sopenharmony_ci
1568e1051a39Sopenharmony_ci	.align 32
1569e1051a39Sopenharmony_ci	.global DES_ede3_cbc_encrypt
1570e1051a39Sopenharmony_ci	.type	 DES_ede3_cbc_encrypt,#function
1571e1051a39Sopenharmony_ci
1572e1051a39Sopenharmony_ciDES_ede3_cbc_encrypt:
1573e1051a39Sopenharmony_ci
1574e1051a39Sopenharmony_ci	save	%sp, FRAME, %sp
1575e1051a39Sopenharmony_ci
1576e1051a39Sopenharmony_ci	define({KS1}, { [%sp+BIAS+ARG0+3*ARGSZ] })
1577e1051a39Sopenharmony_ci	define({KS2}, { [%sp+BIAS+ARG0+4*ARGSZ] })
1578e1051a39Sopenharmony_ci	define({KS3}, { [%sp+BIAS+ARG0+5*ARGSZ] })
1579e1051a39Sopenharmony_ci
1580e1051a39Sopenharmony_ci	sethi	%hi(.PIC.DES_SPtrans-1f),global1
1581e1051a39Sopenharmony_ci	or	global1,%lo(.PIC.DES_SPtrans-1f),global1
1582e1051a39Sopenharmony_ci1:	call	.+8
1583e1051a39Sopenharmony_ci	add	%o7,global1,global1
1584e1051a39Sopenharmony_ci	sub	global1,.PIC.DES_SPtrans-.des_and,out2
1585e1051a39Sopenharmony_ci
1586e1051a39Sopenharmony_ci	LDPTR	[%fp+BIAS+ARG0+7*ARGSZ], local3          ! enc
1587e1051a39Sopenharmony_ci	LDPTR	[%fp+BIAS+ARG0+6*ARGSZ], local4          ! ivec
1588e1051a39Sopenharmony_ci	cmp	local3, 0                 ! enc
1589e1051a39Sopenharmony_ci
1590e1051a39Sopenharmony_ci	be	.ede3.dec
1591e1051a39Sopenharmony_ci	STPTR	in4, KS2
1592e1051a39Sopenharmony_ci
1593e1051a39Sopenharmony_ci	STPTR	in5, KS3
1594e1051a39Sopenharmony_ci
1595e1051a39Sopenharmony_ci	load_little_endian(local4, in5, out5, local3, .LLE6)  ! ivec
1596e1051a39Sopenharmony_ci
1597e1051a39Sopenharmony_ci	addcc	in2, -8, in2              ! bytes missing after next block
1598e1051a39Sopenharmony_ci
1599e1051a39Sopenharmony_ci	bl	.ede3.enc.seven.or.less
1600e1051a39Sopenharmony_ci	STPTR	in3, KS1
1601e1051a39Sopenharmony_ci
1602e1051a39Sopenharmony_ci.ede3.enc.next.block:
1603e1051a39Sopenharmony_ci
1604e1051a39Sopenharmony_ci	load_little_endian(in0, out4, global4, local3, .LLE7)
1605e1051a39Sopenharmony_ci
1606e1051a39Sopenharmony_ci.ede3.enc.next.block_1:
1607e1051a39Sopenharmony_ci
1608e1051a39Sopenharmony_ci	LDPTR	KS2, in4
1609e1051a39Sopenharmony_ci	xor	in5, out4, in5            ! iv xor
1610e1051a39Sopenharmony_ci	xor	out5, global4, out5       ! iv xor
1611e1051a39Sopenharmony_ci
1612e1051a39Sopenharmony_ci	LDPTR	KS1, in3
1613e1051a39Sopenharmony_ci	add	in4, 120, in4             ! for decryption we use last subkey first
1614e1051a39Sopenharmony_ci	nop
1615e1051a39Sopenharmony_ci
1616e1051a39Sopenharmony_ci	ip_macro(in5, out5, in5, out5, in3)
1617e1051a39Sopenharmony_ci
1618e1051a39Sopenharmony_ci.ede3.enc.next.block_2:
1619e1051a39Sopenharmony_ci
1620e1051a39Sopenharmony_ci	call .des_enc                     ! ks1 in3
1621e1051a39Sopenharmony_ci	nop
1622e1051a39Sopenharmony_ci
1623e1051a39Sopenharmony_ci	call .des_dec                     ! ks2 in4
1624e1051a39Sopenharmony_ci	LDPTR	KS3, in3
1625e1051a39Sopenharmony_ci
1626e1051a39Sopenharmony_ci	call .des_enc                     ! ks3 in3  compares in2 to 8
1627e1051a39Sopenharmony_ci	nop
1628e1051a39Sopenharmony_ci
1629e1051a39Sopenharmony_ci	bl	.ede3.enc.next.block_fp
1630e1051a39Sopenharmony_ci	add	in0, 8, in0
1631e1051a39Sopenharmony_ci
1632e1051a39Sopenharmony_ci	! If 8 or more bytes are to be encrypted after this block,
1633e1051a39Sopenharmony_ci	! we combine final permutation for this block with initial
1634e1051a39Sopenharmony_ci	! permutation for next block. Load next block:
1635e1051a39Sopenharmony_ci
1636e1051a39Sopenharmony_ci	load_little_endian(in0, global3, global4, local5, .LLE11)
1637e1051a39Sopenharmony_ci
1638e1051a39Sopenharmony_ci	!  parameter 1   original left
1639e1051a39Sopenharmony_ci	!  parameter 2   original right
1640e1051a39Sopenharmony_ci	!  parameter 3   left ip
1641e1051a39Sopenharmony_ci	!  parameter 4   right ip
1642e1051a39Sopenharmony_ci	!  parameter 5   1: load ks1/ks2 to in3/in4, add 120 to in4
1643e1051a39Sopenharmony_ci	!                2: mov in4 to in3
1644e1051a39Sopenharmony_ci	!
1645e1051a39Sopenharmony_ci	! also adds -8 to length in2 and loads loop counter to out4
1646e1051a39Sopenharmony_ci
1647e1051a39Sopenharmony_ci	fp_ip_macro(out0, out1, global3, global4, 1)
1648e1051a39Sopenharmony_ci
1649e1051a39Sopenharmony_ci	store_little_endian(in1, out0, out1, local3, .SLE9)  ! block
1650e1051a39Sopenharmony_ci
1651e1051a39Sopenharmony_ci	mov 	in5, local1
1652e1051a39Sopenharmony_ci	xor	global3, out5, in5        ! iv xor next block
1653e1051a39Sopenharmony_ci
1654e1051a39Sopenharmony_ci	ld	[in3], out0               ! key 7531
1655e1051a39Sopenharmony_ci	add	global1, 512, global3     ! address sbox 3
1656e1051a39Sopenharmony_ci	xor	global4, local1, out5     ! iv xor next block
1657e1051a39Sopenharmony_ci
1658e1051a39Sopenharmony_ci	ld	[in3+4], out1             ! key 8642
1659e1051a39Sopenharmony_ci	add	global1, 768, global4     ! address sbox 4
1660e1051a39Sopenharmony_ci	ba	.ede3.enc.next.block_2
1661e1051a39Sopenharmony_ci	add	in1, 8, in1
1662e1051a39Sopenharmony_ci
1663e1051a39Sopenharmony_ci.ede3.enc.next.block_fp:
1664e1051a39Sopenharmony_ci
1665e1051a39Sopenharmony_ci	fp_macro(in5, out5)
1666e1051a39Sopenharmony_ci
1667e1051a39Sopenharmony_ci	store_little_endian(in1, in5, out5, local3, .SLE5)  ! block
1668e1051a39Sopenharmony_ci
1669e1051a39Sopenharmony_ci	addcc   in2, -8, in2              ! bytes missing when next block done
1670e1051a39Sopenharmony_ci
1671e1051a39Sopenharmony_ci	bpos	.ede3.enc.next.block
1672e1051a39Sopenharmony_ci	add	in1, 8, in1
1673e1051a39Sopenharmony_ci
1674e1051a39Sopenharmony_ci.ede3.enc.seven.or.less:
1675e1051a39Sopenharmony_ci
1676e1051a39Sopenharmony_ci	cmp	in2, -8
1677e1051a39Sopenharmony_ci
1678e1051a39Sopenharmony_ci	ble	.ede3.enc.finish
1679e1051a39Sopenharmony_ci	nop
1680e1051a39Sopenharmony_ci
1681e1051a39Sopenharmony_ci	add	in2, 8, local1            ! bytes to load
1682e1051a39Sopenharmony_ci
1683e1051a39Sopenharmony_ci	! addr, length, dest left, dest right, temp, temp2, label, ret label
1684e1051a39Sopenharmony_ci	load_n_bytes(in0, local1, global4, out4, local2, local3, .LNB2, .ede3.enc.next.block_1)
1685e1051a39Sopenharmony_ci
1686e1051a39Sopenharmony_ci.ede3.enc.finish:
1687e1051a39Sopenharmony_ci
1688e1051a39Sopenharmony_ci	LDPTR	[%fp+BIAS+ARG0+6*ARGSZ], local4          ! ivec
1689e1051a39Sopenharmony_ci	store_little_endian(local4, in5, out5, local5, .SLE6)  ! ivec
1690e1051a39Sopenharmony_ci
1691e1051a39Sopenharmony_ci	ret
1692e1051a39Sopenharmony_ci	restore
1693e1051a39Sopenharmony_ci
1694e1051a39Sopenharmony_ci.ede3.dec:
1695e1051a39Sopenharmony_ci
1696e1051a39Sopenharmony_ci	STPTR	in0, INPUT
1697e1051a39Sopenharmony_ci	add	in5, 120, in5
1698e1051a39Sopenharmony_ci
1699e1051a39Sopenharmony_ci	STPTR	in1, OUTPUT
1700e1051a39Sopenharmony_ci	mov	in0, local5
1701e1051a39Sopenharmony_ci	add	in3, 120, in3
1702e1051a39Sopenharmony_ci
1703e1051a39Sopenharmony_ci	STPTR	in3, KS1
1704e1051a39Sopenharmony_ci	cmp	in2, 0
1705e1051a39Sopenharmony_ci
1706e1051a39Sopenharmony_ci	ble	.ede3.dec.finish
1707e1051a39Sopenharmony_ci	STPTR	in5, KS3
1708e1051a39Sopenharmony_ci
1709e1051a39Sopenharmony_ci	LDPTR	[%fp+BIAS+ARG0+6*ARGSZ], local7          ! iv
1710e1051a39Sopenharmony_ci	load_little_endian(local7, in0, in1, local3, .LLE8)
1711e1051a39Sopenharmony_ci
1712e1051a39Sopenharmony_ci.ede3.dec.next.block:
1713e1051a39Sopenharmony_ci
1714e1051a39Sopenharmony_ci	load_little_endian(local5, in5, out5, local3, .LLE9)
1715e1051a39Sopenharmony_ci
1716e1051a39Sopenharmony_ci	! parameter 6  1/2 for include encryption/decryption
1717e1051a39Sopenharmony_ci	! parameter 7  1 for mov in1 to in3
1718e1051a39Sopenharmony_ci	! parameter 8  1 for mov in3 to in4
1719e1051a39Sopenharmony_ci	! parameter 9  1 for load ks3 and ks2 to in4 and in3
1720e1051a39Sopenharmony_ci
1721e1051a39Sopenharmony_ci	ip_macro(in5, out5, out5, in5, in4, 2, 0, 0, 1) ! inc .des_dec ks3 in4
1722e1051a39Sopenharmony_ci
1723e1051a39Sopenharmony_ci	call .des_enc                     ! ks2 in3
1724e1051a39Sopenharmony_ci	LDPTR	KS1, in4
1725e1051a39Sopenharmony_ci
1726e1051a39Sopenharmony_ci	call .des_dec                     ! ks1 in4
1727e1051a39Sopenharmony_ci	nop
1728e1051a39Sopenharmony_ci
1729e1051a39Sopenharmony_ci	fp_macro(out5, in5, 0, 1)   ! 1 for input and output address local5/7
1730e1051a39Sopenharmony_ci
1731e1051a39Sopenharmony_ci	! in2 is bytes left to be stored
1732e1051a39Sopenharmony_ci	! in2 is compared to 8 in the rounds
1733e1051a39Sopenharmony_ci
1734e1051a39Sopenharmony_ci	xor	out5, in0, out4
1735e1051a39Sopenharmony_ci	bl	.ede3.dec.seven.or.less
1736e1051a39Sopenharmony_ci	xor	in5, in1, global4
1737e1051a39Sopenharmony_ci
1738e1051a39Sopenharmony_ci	load_little_endian_inc(local5, in0, in1, local3, .LLE10)   ! iv next block
1739e1051a39Sopenharmony_ci
1740e1051a39Sopenharmony_ci	store_little_endian(local7, out4, global4, local3, .SLE7)  ! block
1741e1051a39Sopenharmony_ci
1742e1051a39Sopenharmony_ci	STPTR	local5, INPUT
1743e1051a39Sopenharmony_ci	addcc   in2, -8, in2
1744e1051a39Sopenharmony_ci	add	local7, 8, local7
1745e1051a39Sopenharmony_ci
1746e1051a39Sopenharmony_ci	bg	.ede3.dec.next.block
1747e1051a39Sopenharmony_ci	STPTR	local7, OUTPUT
1748e1051a39Sopenharmony_ci
1749e1051a39Sopenharmony_ci.ede3.dec.store.iv:
1750e1051a39Sopenharmony_ci
1751e1051a39Sopenharmony_ci	LDPTR	[%fp+BIAS+ARG0+6*ARGSZ], local4          ! ivec
1752e1051a39Sopenharmony_ci	store_little_endian(local4, in0, in1, local5, .SLE8)  ! ivec
1753e1051a39Sopenharmony_ci
1754e1051a39Sopenharmony_ci.ede3.dec.finish:
1755e1051a39Sopenharmony_ci
1756e1051a39Sopenharmony_ci	ret
1757e1051a39Sopenharmony_ci	restore
1758e1051a39Sopenharmony_ci
1759e1051a39Sopenharmony_ci.ede3.dec.seven.or.less:
1760e1051a39Sopenharmony_ci
1761e1051a39Sopenharmony_ci	load_little_endian_inc(local5, in0, in1, local3, .LLE14)     ! iv
1762e1051a39Sopenharmony_ci
1763e1051a39Sopenharmony_ci	store_n_bytes(local7, in2, global4, out4, local3, local4, .SNB2, .ede3.dec.store.iv)
1764e1051a39Sopenharmony_ci
1765e1051a39Sopenharmony_ci
1766e1051a39Sopenharmony_ci.DES_ede3_cbc_encrypt.end:
1767e1051a39Sopenharmony_ci	.size	 DES_ede3_cbc_encrypt,.DES_ede3_cbc_encrypt.end-DES_ede3_cbc_encrypt
1768e1051a39Sopenharmony_ci
1769e1051a39Sopenharmony_ci	.align	256
1770e1051a39Sopenharmony_ci	.type	 .des_and,#object
1771e1051a39Sopenharmony_ci	.size	 .des_and,284
1772e1051a39Sopenharmony_ci
1773e1051a39Sopenharmony_ci.des_and:
1774e1051a39Sopenharmony_ci
1775e1051a39Sopenharmony_ci! This table is used for AND 0xFC when it is known that register
1776e1051a39Sopenharmony_ci! bits 8-31 are zero. Makes it possible to do three arithmetic
1777e1051a39Sopenharmony_ci! operations in one cycle.
1778e1051a39Sopenharmony_ci
1779e1051a39Sopenharmony_ci	.byte  0, 0, 0, 0, 4, 4, 4, 4
1780e1051a39Sopenharmony_ci	.byte  8, 8, 8, 8, 12, 12, 12, 12
1781e1051a39Sopenharmony_ci	.byte  16, 16, 16, 16, 20, 20, 20, 20
1782e1051a39Sopenharmony_ci	.byte  24, 24, 24, 24, 28, 28, 28, 28
1783e1051a39Sopenharmony_ci	.byte  32, 32, 32, 32, 36, 36, 36, 36
1784e1051a39Sopenharmony_ci	.byte  40, 40, 40, 40, 44, 44, 44, 44
1785e1051a39Sopenharmony_ci	.byte  48, 48, 48, 48, 52, 52, 52, 52
1786e1051a39Sopenharmony_ci	.byte  56, 56, 56, 56, 60, 60, 60, 60
1787e1051a39Sopenharmony_ci	.byte  64, 64, 64, 64, 68, 68, 68, 68
1788e1051a39Sopenharmony_ci	.byte  72, 72, 72, 72, 76, 76, 76, 76
1789e1051a39Sopenharmony_ci	.byte  80, 80, 80, 80, 84, 84, 84, 84
1790e1051a39Sopenharmony_ci	.byte  88, 88, 88, 88, 92, 92, 92, 92
1791e1051a39Sopenharmony_ci	.byte  96, 96, 96, 96, 100, 100, 100, 100
1792e1051a39Sopenharmony_ci	.byte  104, 104, 104, 104, 108, 108, 108, 108
1793e1051a39Sopenharmony_ci	.byte  112, 112, 112, 112, 116, 116, 116, 116
1794e1051a39Sopenharmony_ci	.byte  120, 120, 120, 120, 124, 124, 124, 124
1795e1051a39Sopenharmony_ci	.byte  128, 128, 128, 128, 132, 132, 132, 132
1796e1051a39Sopenharmony_ci	.byte  136, 136, 136, 136, 140, 140, 140, 140
1797e1051a39Sopenharmony_ci	.byte  144, 144, 144, 144, 148, 148, 148, 148
1798e1051a39Sopenharmony_ci	.byte  152, 152, 152, 152, 156, 156, 156, 156
1799e1051a39Sopenharmony_ci	.byte  160, 160, 160, 160, 164, 164, 164, 164
1800e1051a39Sopenharmony_ci	.byte  168, 168, 168, 168, 172, 172, 172, 172
1801e1051a39Sopenharmony_ci	.byte  176, 176, 176, 176, 180, 180, 180, 180
1802e1051a39Sopenharmony_ci	.byte  184, 184, 184, 184, 188, 188, 188, 188
1803e1051a39Sopenharmony_ci	.byte  192, 192, 192, 192, 196, 196, 196, 196
1804e1051a39Sopenharmony_ci	.byte  200, 200, 200, 200, 204, 204, 204, 204
1805e1051a39Sopenharmony_ci	.byte  208, 208, 208, 208, 212, 212, 212, 212
1806e1051a39Sopenharmony_ci	.byte  216, 216, 216, 216, 220, 220, 220, 220
1807e1051a39Sopenharmony_ci	.byte  224, 224, 224, 224, 228, 228, 228, 228
1808e1051a39Sopenharmony_ci	.byte  232, 232, 232, 232, 236, 236, 236, 236
1809e1051a39Sopenharmony_ci	.byte  240, 240, 240, 240, 244, 244, 244, 244
1810e1051a39Sopenharmony_ci	.byte  248, 248, 248, 248, 252, 252, 252, 252
1811e1051a39Sopenharmony_ci
1812e1051a39Sopenharmony_ci	! 5 numbers for initial/final permutation
1813e1051a39Sopenharmony_ci
1814e1051a39Sopenharmony_ci	.word   0x0f0f0f0f                ! offset 256
1815e1051a39Sopenharmony_ci	.word	0x0000ffff                ! 260
1816e1051a39Sopenharmony_ci	.word	0x33333333                ! 264
1817e1051a39Sopenharmony_ci	.word	0x00ff00ff                ! 268
1818e1051a39Sopenharmony_ci	.word	0x55555555                ! 272
1819e1051a39Sopenharmony_ci
1820e1051a39Sopenharmony_ci	.word	0                         ! 276
1821e1051a39Sopenharmony_ci	.word	LOOPS                     ! 280
1822e1051a39Sopenharmony_ci	.word	0x0000FC00                ! 284
1823e1051a39Sopenharmony_ci
1824e1051a39Sopenharmony_ci	.global	DES_SPtrans
1825e1051a39Sopenharmony_ci	.type	DES_SPtrans,#object
1826e1051a39Sopenharmony_ci	.size	DES_SPtrans,2048
1827e1051a39Sopenharmony_ci.align	64
1828e1051a39Sopenharmony_ciDES_SPtrans:
1829e1051a39Sopenharmony_ci.PIC.DES_SPtrans:
1830e1051a39Sopenharmony_ci	! nibble 0
1831e1051a39Sopenharmony_ci	.word	0x02080800, 0x00080000, 0x02000002, 0x02080802
1832e1051a39Sopenharmony_ci	.word	0x02000000, 0x00080802, 0x00080002, 0x02000002
1833e1051a39Sopenharmony_ci	.word	0x00080802, 0x02080800, 0x02080000, 0x00000802
1834e1051a39Sopenharmony_ci	.word	0x02000802, 0x02000000, 0x00000000, 0x00080002
1835e1051a39Sopenharmony_ci	.word	0x00080000, 0x00000002, 0x02000800, 0x00080800
1836e1051a39Sopenharmony_ci	.word	0x02080802, 0x02080000, 0x00000802, 0x02000800
1837e1051a39Sopenharmony_ci	.word	0x00000002, 0x00000800, 0x00080800, 0x02080002
1838e1051a39Sopenharmony_ci	.word	0x00000800, 0x02000802, 0x02080002, 0x00000000
1839e1051a39Sopenharmony_ci	.word	0x00000000, 0x02080802, 0x02000800, 0x00080002
1840e1051a39Sopenharmony_ci	.word	0x02080800, 0x00080000, 0x00000802, 0x02000800
1841e1051a39Sopenharmony_ci	.word	0x02080002, 0x00000800, 0x00080800, 0x02000002
1842e1051a39Sopenharmony_ci	.word	0x00080802, 0x00000002, 0x02000002, 0x02080000
1843e1051a39Sopenharmony_ci	.word	0x02080802, 0x00080800, 0x02080000, 0x02000802
1844e1051a39Sopenharmony_ci	.word	0x02000000, 0x00000802, 0x00080002, 0x00000000
1845e1051a39Sopenharmony_ci	.word	0x00080000, 0x02000000, 0x02000802, 0x02080800
1846e1051a39Sopenharmony_ci	.word	0x00000002, 0x02080002, 0x00000800, 0x00080802
1847e1051a39Sopenharmony_ci	! nibble 1
1848e1051a39Sopenharmony_ci	.word	0x40108010, 0x00000000, 0x00108000, 0x40100000
1849e1051a39Sopenharmony_ci	.word	0x40000010, 0x00008010, 0x40008000, 0x00108000
1850e1051a39Sopenharmony_ci	.word	0x00008000, 0x40100010, 0x00000010, 0x40008000
1851e1051a39Sopenharmony_ci	.word	0x00100010, 0x40108000, 0x40100000, 0x00000010
1852e1051a39Sopenharmony_ci	.word	0x00100000, 0x40008010, 0x40100010, 0x00008000
1853e1051a39Sopenharmony_ci	.word	0x00108010, 0x40000000, 0x00000000, 0x00100010
1854e1051a39Sopenharmony_ci	.word	0x40008010, 0x00108010, 0x40108000, 0x40000010
1855e1051a39Sopenharmony_ci	.word	0x40000000, 0x00100000, 0x00008010, 0x40108010
1856e1051a39Sopenharmony_ci	.word	0x00100010, 0x40108000, 0x40008000, 0x00108010
1857e1051a39Sopenharmony_ci	.word	0x40108010, 0x00100010, 0x40000010, 0x00000000
1858e1051a39Sopenharmony_ci	.word	0x40000000, 0x00008010, 0x00100000, 0x40100010
1859e1051a39Sopenharmony_ci	.word	0x00008000, 0x40000000, 0x00108010, 0x40008010
1860e1051a39Sopenharmony_ci	.word	0x40108000, 0x00008000, 0x00000000, 0x40000010
1861e1051a39Sopenharmony_ci	.word	0x00000010, 0x40108010, 0x00108000, 0x40100000
1862e1051a39Sopenharmony_ci	.word	0x40100010, 0x00100000, 0x00008010, 0x40008000
1863e1051a39Sopenharmony_ci	.word	0x40008010, 0x00000010, 0x40100000, 0x00108000
1864e1051a39Sopenharmony_ci	! nibble 2
1865e1051a39Sopenharmony_ci	.word	0x04000001, 0x04040100, 0x00000100, 0x04000101
1866e1051a39Sopenharmony_ci	.word	0x00040001, 0x04000000, 0x04000101, 0x00040100
1867e1051a39Sopenharmony_ci	.word	0x04000100, 0x00040000, 0x04040000, 0x00000001
1868e1051a39Sopenharmony_ci	.word	0x04040101, 0x00000101, 0x00000001, 0x04040001
1869e1051a39Sopenharmony_ci	.word	0x00000000, 0x00040001, 0x04040100, 0x00000100
1870e1051a39Sopenharmony_ci	.word	0x00000101, 0x04040101, 0x00040000, 0x04000001
1871e1051a39Sopenharmony_ci	.word	0x04040001, 0x04000100, 0x00040101, 0x04040000
1872e1051a39Sopenharmony_ci	.word	0x00040100, 0x00000000, 0x04000000, 0x00040101
1873e1051a39Sopenharmony_ci	.word	0x04040100, 0x00000100, 0x00000001, 0x00040000
1874e1051a39Sopenharmony_ci	.word	0x00000101, 0x00040001, 0x04040000, 0x04000101
1875e1051a39Sopenharmony_ci	.word	0x00000000, 0x04040100, 0x00040100, 0x04040001
1876e1051a39Sopenharmony_ci	.word	0x00040001, 0x04000000, 0x04040101, 0x00000001
1877e1051a39Sopenharmony_ci	.word	0x00040101, 0x04000001, 0x04000000, 0x04040101
1878e1051a39Sopenharmony_ci	.word	0x00040000, 0x04000100, 0x04000101, 0x00040100
1879e1051a39Sopenharmony_ci	.word	0x04000100, 0x00000000, 0x04040001, 0x00000101
1880e1051a39Sopenharmony_ci	.word	0x04000001, 0x00040101, 0x00000100, 0x04040000
1881e1051a39Sopenharmony_ci	! nibble 3
1882e1051a39Sopenharmony_ci	.word	0x00401008, 0x10001000, 0x00000008, 0x10401008
1883e1051a39Sopenharmony_ci	.word	0x00000000, 0x10400000, 0x10001008, 0x00400008
1884e1051a39Sopenharmony_ci	.word	0x10401000, 0x10000008, 0x10000000, 0x00001008
1885e1051a39Sopenharmony_ci	.word	0x10000008, 0x00401008, 0x00400000, 0x10000000
1886e1051a39Sopenharmony_ci	.word	0x10400008, 0x00401000, 0x00001000, 0x00000008
1887e1051a39Sopenharmony_ci	.word	0x00401000, 0x10001008, 0x10400000, 0x00001000
1888e1051a39Sopenharmony_ci	.word	0x00001008, 0x00000000, 0x00400008, 0x10401000
1889e1051a39Sopenharmony_ci	.word	0x10001000, 0x10400008, 0x10401008, 0x00400000
1890e1051a39Sopenharmony_ci	.word	0x10400008, 0x00001008, 0x00400000, 0x10000008
1891e1051a39Sopenharmony_ci	.word	0x00401000, 0x10001000, 0x00000008, 0x10400000
1892e1051a39Sopenharmony_ci	.word	0x10001008, 0x00000000, 0x00001000, 0x00400008
1893e1051a39Sopenharmony_ci	.word	0x00000000, 0x10400008, 0x10401000, 0x00001000
1894e1051a39Sopenharmony_ci	.word	0x10000000, 0x10401008, 0x00401008, 0x00400000
1895e1051a39Sopenharmony_ci	.word	0x10401008, 0x00000008, 0x10001000, 0x00401008
1896e1051a39Sopenharmony_ci	.word	0x00400008, 0x00401000, 0x10400000, 0x10001008
1897e1051a39Sopenharmony_ci	.word	0x00001008, 0x10000000, 0x10000008, 0x10401000
1898e1051a39Sopenharmony_ci	! nibble 4
1899e1051a39Sopenharmony_ci	.word	0x08000000, 0x00010000, 0x00000400, 0x08010420
1900e1051a39Sopenharmony_ci	.word	0x08010020, 0x08000400, 0x00010420, 0x08010000
1901e1051a39Sopenharmony_ci	.word	0x00010000, 0x00000020, 0x08000020, 0x00010400
1902e1051a39Sopenharmony_ci	.word	0x08000420, 0x08010020, 0x08010400, 0x00000000
1903e1051a39Sopenharmony_ci	.word	0x00010400, 0x08000000, 0x00010020, 0x00000420
1904e1051a39Sopenharmony_ci	.word	0x08000400, 0x00010420, 0x00000000, 0x08000020
1905e1051a39Sopenharmony_ci	.word	0x00000020, 0x08000420, 0x08010420, 0x00010020
1906e1051a39Sopenharmony_ci	.word	0x08010000, 0x00000400, 0x00000420, 0x08010400
1907e1051a39Sopenharmony_ci	.word	0x08010400, 0x08000420, 0x00010020, 0x08010000
1908e1051a39Sopenharmony_ci	.word	0x00010000, 0x00000020, 0x08000020, 0x08000400
1909e1051a39Sopenharmony_ci	.word	0x08000000, 0x00010400, 0x08010420, 0x00000000
1910e1051a39Sopenharmony_ci	.word	0x00010420, 0x08000000, 0x00000400, 0x00010020
1911e1051a39Sopenharmony_ci	.word	0x08000420, 0x00000400, 0x00000000, 0x08010420
1912e1051a39Sopenharmony_ci	.word	0x08010020, 0x08010400, 0x00000420, 0x00010000
1913e1051a39Sopenharmony_ci	.word	0x00010400, 0x08010020, 0x08000400, 0x00000420
1914e1051a39Sopenharmony_ci	.word	0x00000020, 0x00010420, 0x08010000, 0x08000020
1915e1051a39Sopenharmony_ci	! nibble 5
1916e1051a39Sopenharmony_ci	.word	0x80000040, 0x00200040, 0x00000000, 0x80202000
1917e1051a39Sopenharmony_ci	.word	0x00200040, 0x00002000, 0x80002040, 0x00200000
1918e1051a39Sopenharmony_ci	.word	0x00002040, 0x80202040, 0x00202000, 0x80000000
1919e1051a39Sopenharmony_ci	.word	0x80002000, 0x80000040, 0x80200000, 0x00202040
1920e1051a39Sopenharmony_ci	.word	0x00200000, 0x80002040, 0x80200040, 0x00000000
1921e1051a39Sopenharmony_ci	.word	0x00002000, 0x00000040, 0x80202000, 0x80200040
1922e1051a39Sopenharmony_ci	.word	0x80202040, 0x80200000, 0x80000000, 0x00002040
1923e1051a39Sopenharmony_ci	.word	0x00000040, 0x00202000, 0x00202040, 0x80002000
1924e1051a39Sopenharmony_ci	.word	0x00002040, 0x80000000, 0x80002000, 0x00202040
1925e1051a39Sopenharmony_ci	.word	0x80202000, 0x00200040, 0x00000000, 0x80002000
1926e1051a39Sopenharmony_ci	.word	0x80000000, 0x00002000, 0x80200040, 0x00200000
1927e1051a39Sopenharmony_ci	.word	0x00200040, 0x80202040, 0x00202000, 0x00000040
1928e1051a39Sopenharmony_ci	.word	0x80202040, 0x00202000, 0x00200000, 0x80002040
1929e1051a39Sopenharmony_ci	.word	0x80000040, 0x80200000, 0x00202040, 0x00000000
1930e1051a39Sopenharmony_ci	.word	0x00002000, 0x80000040, 0x80002040, 0x80202000
1931e1051a39Sopenharmony_ci	.word	0x80200000, 0x00002040, 0x00000040, 0x80200040
1932e1051a39Sopenharmony_ci	! nibble 6
1933e1051a39Sopenharmony_ci	.word	0x00004000, 0x00000200, 0x01000200, 0x01000004
1934e1051a39Sopenharmony_ci	.word	0x01004204, 0x00004004, 0x00004200, 0x00000000
1935e1051a39Sopenharmony_ci	.word	0x01000000, 0x01000204, 0x00000204, 0x01004000
1936e1051a39Sopenharmony_ci	.word	0x00000004, 0x01004200, 0x01004000, 0x00000204
1937e1051a39Sopenharmony_ci	.word	0x01000204, 0x00004000, 0x00004004, 0x01004204
1938e1051a39Sopenharmony_ci	.word	0x00000000, 0x01000200, 0x01000004, 0x00004200
1939e1051a39Sopenharmony_ci	.word	0x01004004, 0x00004204, 0x01004200, 0x00000004
1940e1051a39Sopenharmony_ci	.word	0x00004204, 0x01004004, 0x00000200, 0x01000000
1941e1051a39Sopenharmony_ci	.word	0x00004204, 0x01004000, 0x01004004, 0x00000204
1942e1051a39Sopenharmony_ci	.word	0x00004000, 0x00000200, 0x01000000, 0x01004004
1943e1051a39Sopenharmony_ci	.word	0x01000204, 0x00004204, 0x00004200, 0x00000000
1944e1051a39Sopenharmony_ci	.word	0x00000200, 0x01000004, 0x00000004, 0x01000200
1945e1051a39Sopenharmony_ci	.word	0x00000000, 0x01000204, 0x01000200, 0x00004200
1946e1051a39Sopenharmony_ci	.word	0x00000204, 0x00004000, 0x01004204, 0x01000000
1947e1051a39Sopenharmony_ci	.word	0x01004200, 0x00000004, 0x00004004, 0x01004204
1948e1051a39Sopenharmony_ci	.word	0x01000004, 0x01004200, 0x01004000, 0x00004004
1949e1051a39Sopenharmony_ci	! nibble 7
1950e1051a39Sopenharmony_ci	.word	0x20800080, 0x20820000, 0x00020080, 0x00000000
1951e1051a39Sopenharmony_ci	.word	0x20020000, 0x00800080, 0x20800000, 0x20820080
1952e1051a39Sopenharmony_ci	.word	0x00000080, 0x20000000, 0x00820000, 0x00020080
1953e1051a39Sopenharmony_ci	.word	0x00820080, 0x20020080, 0x20000080, 0x20800000
1954e1051a39Sopenharmony_ci	.word	0x00020000, 0x00820080, 0x00800080, 0x20020000
1955e1051a39Sopenharmony_ci	.word	0x20820080, 0x20000080, 0x00000000, 0x00820000
1956e1051a39Sopenharmony_ci	.word	0x20000000, 0x00800000, 0x20020080, 0x20800080
1957e1051a39Sopenharmony_ci	.word	0x00800000, 0x00020000, 0x20820000, 0x00000080
1958e1051a39Sopenharmony_ci	.word	0x00800000, 0x00020000, 0x20000080, 0x20820080
1959e1051a39Sopenharmony_ci	.word	0x00020080, 0x20000000, 0x00000000, 0x00820000
1960e1051a39Sopenharmony_ci	.word	0x20800080, 0x20020080, 0x20020000, 0x00800080
1961e1051a39Sopenharmony_ci	.word	0x20820000, 0x00000080, 0x00800080, 0x20020000
1962e1051a39Sopenharmony_ci	.word	0x20820080, 0x00800000, 0x20800000, 0x20000080
1963e1051a39Sopenharmony_ci	.word	0x00820000, 0x00020080, 0x20020080, 0x20800000
1964e1051a39Sopenharmony_ci	.word	0x00000080, 0x20820000, 0x00820080, 0x00000000
1965e1051a39Sopenharmony_ci	.word	0x20000000, 0x20800080, 0x00020000, 0x00820080
1966e1051a39Sopenharmony_ci
1967